<?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>12207</bug_id>
          
          <creation_ts>2007-01-11 00:56:15 -0800</creation_ts>
          <short_desc>RenderSVGContainer should be split into multiple classes</short_desc>
          <delta_ts>2007-06-13 16:26:17 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>SVG</component>
          <version>420+</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.4</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>5940</blocked>
    
    <blocked>9752</blocked>
    
    <blocked>10526</blocked>
    
    <blocked>11976</blocked>
    
    <blocked>12221</blocked>
    
    <blocked>13981</blocked>
    
    <blocked>14051</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Eric Seidel (no email)">eric</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>mjs</cc>
    
    <cc>rwlbuis</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>35759</commentid>
    <comment_count>0</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2007-01-11 00:56:15 -0800</bug_when>
    <thetext>RenderSVGContainer should be split into two classes, one for SVG and one for G

The current implementation is confusing at times and has lead to bugs like
http://bugs.webkit.org/show_bug.cgi?id=12201</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>35372</commentid>
    <comment_count>1</comment_count>
      <attachid>12397</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2007-01-12 12:45:39 -0800</bug_when>
    <thetext>Created attachment 12397
First  attempt

Thi is not the final patch, and lots of test results will change (I guess all SVG results). I hope I get some feedback on the code and names I picked.
Cheers,

Rob.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>34900</commentid>
    <comment_count>2</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2007-01-14 22:00:42 -0800</bug_when>
    <thetext>We may need more than 2.

Here are all the SVG containers I can think of, grouped by behavior:

Have a viewBox and establish a viewPort:
&lt;svg&gt; - new SVGRenderRoot
&lt;image&gt; - RenderSVGImage
&lt;foreignObject&gt; - RenderSVGForeignObject

No viewbox, sometimes establishes a viewport:
&lt;symbol&gt; - only when referenced by &lt;use&gt;, the logic should probably be in the &lt;use&gt; renderer(s)

Has viewbox, but does not establish a viewport:
&lt;pattern&gt;
&lt;marker&gt;
Neither of these draw their content directly.

Has no viewport:
&lt;defs&gt; - does not draw its content directly, but probably should have a renderer to allow proper style resolution of its kids (right now it has no renderer)
&lt;g&gt; - should probably be RenderSVGContainer

&lt;view&gt; also has a viewBox, but it&apos;s never drawn, so we don&apos;t need a renderer for it.

I propose adding 3 new container types in this bug:

RenderSVGRoot - for &lt;svg&gt;, is a RenderBlock, only trickiness occurs when inside another &lt;svg&gt;
RenderSVGGroup - for &lt;g&gt;, only supports localTransform
RenderSVGUseable - for &lt;symbol&gt;, &lt;pattern&gt;, &lt;marker&gt;, viewbox is simply ignored for &lt;symbol&gt;, does not draw content via normal paint() method.

Optionally, you could also make &lt;defs&gt; a RenderSVGUsable, although then maybe it should be called RenderSVGHidden, not sure.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>34892</commentid>
    <comment_count>3</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2007-01-14 22:15:48 -0800</bug_when>
    <thetext>I forgot &lt;mask&gt; as well, that should also be part of the &lt;symbol&gt;, &lt;pattern&gt;, &lt;marker&gt; group, IMO.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>34877</commentid>
    <comment_count>4</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2007-01-14 23:10:28 -0800</bug_when>
    <thetext>Now that bug 12210, I should note that only the new RenderSVGRoot class will need to have the changes introduced in 12210.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>34846</commentid>
    <comment_count>5</comment_count>
      <attachid>12397</attachid>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2007-01-15 01:52:09 -0800</bug_when>
    <thetext>Comment on attachment 12397
First  attempt

r- for now based on Eric&apos;s comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>8230</commentid>
    <comment_count>6</comment_count>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2007-06-05 00:43:36 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; Now that bug 12210, I should note that only the new RenderSVGRoot class will
&gt; need to have the changes introduced in 12210.

I&apos;ll give this another go, on the feature_branch. If anybody was working on it already, let me know, we should coordinate it.
Cheers,

Rob.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>8336</commentid>
    <comment_count>7</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2007-06-06 03:10:40 -0700</bug_when>
    <thetext>Anyone working on this bug (i.e. rob) should be aware of the patch attached to:
http://bugs.webkit.org/show_bug.cgi?id=14012

That patch includes some small changes which try to make it obvious what sections of RenderSVGContainer already have special-case code for the &lt;svg&gt; root element.  The goal of splitting out a RenderSVGRoot class would be to remove those special cases from RenderSVGGroup (or RenderSVGContainer) so that RenderSVGContainer can only worry about being inside other SVG content, and RenderSVGRoot can worry about all the issues of mixing with other non-SVG content.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>7752</commentid>
    <comment_count>8</comment_count>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2007-06-12 15:56:00 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; Anyone working on this bug (i.e. rob) should be aware of the patch attached to:
&gt; http://bugs.webkit.org/show_bug.cgi?id=14012

I am assuming your remark is about trunk. The work will go to feature_branch and there the patch seems to be applied, so no problem.
Cheers,

Rob.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>7749</commentid>
    <comment_count>9</comment_count>
      <attachid>14987</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2007-06-12 15:57:48 -0700</bug_when>
    <thetext>Created attachment 14987
Work in progress

This is just work in progress, a first split to RenderSVGRoot, no regressions.
Cheers,

Rob.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>7745</commentid>
    <comment_count>10</comment_count>
      <attachid>14988</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2007-06-12 17:08:16 -0700</bug_when>
    <thetext>Created attachment 14988
Split out RenderSVGRoot

A good first start.
Cheers,

Rob.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>7643</commentid>
    <comment_count>11</comment_count>
      <attachid>14988</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2007-06-13 16:09:08 -0700</bug_when>
    <thetext>Comment on attachment 14988
Split out RenderSVGRoot

Eventually we&apos;ll need a better solution to this:

+        // FIXME: All this setup should be done after attributesChanged, not here.
+        rootContainer-&gt;setViewBox(viewBox());
+        rootContainer-&gt;setAlign(SVGPreserveAspectRatio::SVGPreserveAspectRatioType(preserveAspectRatio()-&gt;align()));
+        rootContainer-&gt;setSlice(preserveAspectRatio()-&gt;meetOrSlice() == SVGPreserveAspectRatio::SVG_MEETORSLICE_SLICE);

We&apos;ll need to find a way to abstract a bunch of this code so it&apos;s not so copy/paste.

It looks fine for a start.  We&apos;ll need follow up patches to clean up these newly split classes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>7629</commentid>
    <comment_count>12</comment_count>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2007-06-13 16:26:17 -0700</bug_when>
    <thetext>Landed in r23509.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>12397</attachid>
            <date>2007-01-12 12:45:39 -0800</date>
            <delta_ts>2007-06-12 17:08:16 -0700</delta_ts>
            <desc>First  attempt</desc>
            <filename>12207.diff</filename>
            <type>text/plain</type>
            <size>16967</size>
            <attacher name="Rob Buis">rwlbuis</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUva3N2ZzIvc3ZnL1NWR01hcmtlckVsZW1lbnQuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUva3N2ZzIvc3ZnL1NWR01hcmtlckVsZW1lbnQuY3BwCShyZXZpc2lvbiAxODgw
MSkKKysrIFdlYkNvcmUva3N2ZzIvc3ZnL1NWR01hcmtlckVsZW1lbnQuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xMTMsNyArMTEzLDcgQEAgU1ZHUmVzb3VyY2UqIFNWR01hcmtlckVsZW1lbnQ6OmNh
bnZhc1JlcwogICAgIGlmICghbV9tYXJrZXIpCiAgICAgICAgIG1fbWFya2VyID0gbmV3IFNWR1Jl
c291cmNlTWFya2VyKCk7CiAgICAgCi0gICAgbV9tYXJrZXItPnNldE1hcmtlcihzdGF0aWNfY2Fz
dDxSZW5kZXJTVkdDb250YWluZXIqPihyZW5kZXJlcigpKSk7CisgICAgbV9tYXJrZXItPnNldE1h
cmtlcihzdGF0aWNfY2FzdDxSZW5kZXJTVkdWaWV3Qm94Q29udGFpbmVyKj4ocmVuZGVyZXIoKSkp
OwogCiAgICAgLy8gU3BlYzogSWYgdGhlIGF0dHJpYnV0ZSBpcyBub3Qgc3BlY2lmaWVkLCB0aGUg
ZWZmZWN0IGlzIGFzIGlmIGEKICAgICAvLyB2YWx1ZSBvZiAiMCIgd2VyZSBzcGVjaWZpZWQuCkBA
IC0xMzMsNyArMTMzLDcgQEAgU1ZHUmVzb3VyY2UqIFNWR01hcmtlckVsZW1lbnQ6OmNhbnZhc1Jl
cwogCiBSZW5kZXJPYmplY3QqIFNWR01hcmtlckVsZW1lbnQ6OmNyZWF0ZVJlbmRlcmVyKFJlbmRl
ckFyZW5hKiBhcmVuYSwgUmVuZGVyU3R5bGUqIHN0eWxlKQogewotICAgIFJlbmRlclNWR0NvbnRh
aW5lciogbWFya2VyQ29udGFpbmVyID0gbmV3IChhcmVuYSkgUmVuZGVyU1ZHQ29udGFpbmVyKHRo
aXMpOworICAgIFJlbmRlclNWR1ZpZXdCb3hDb250YWluZXIqIG1hcmtlckNvbnRhaW5lciA9IG5l
dyAoYXJlbmEpIFJlbmRlclNWR1ZpZXdCb3hDb250YWluZXIodGhpcyk7CiAgICAgbWFya2VyQ29u
dGFpbmVyLT5zZXRWaWV3Qm94KHZpZXdCb3goKSk7CiAgICAgbWFya2VyQ29udGFpbmVyLT5zZXRB
bGlnbihLQ0FsaWduKHByZXNlcnZlQXNwZWN0UmF0aW8oKS0+YWxpZ24oKSAtIDEpKTsKICAgICBt
YXJrZXJDb250YWluZXItPnNldFNsaWNlKHByZXNlcnZlQXNwZWN0UmF0aW8oKS0+bWVldE9yU2xp
Y2UoKSA9PSBTVkdQcmVzZXJ2ZUFzcGVjdFJhdGlvOjpTVkdfTUVFVE9SU0xJQ0VfU0xJQ0UpOwpJ
bmRleDogV2ViQ29yZS9rc3ZnMi9zdmcvU1ZHU1ZHRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9rc3ZnMi9zdmcvU1ZHU1ZHRWxlbWVudC5jcHAJKHJldmlzaW9uIDE4ODAxKQorKysg
V2ViQ29yZS9rc3ZnMi9zdmcvU1ZHU1ZHRWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTIx
MSw3ICsyMTEsNyBAQCB2b2lkIFNWR1NWR0VsZW1lbnQ6OnBhcnNlTWFwcGVkQXR0cmlidXRlCiAg
ICAgICAgIGlmIChTVkdFeHRlcm5hbFJlc291cmNlc1JlcXVpcmVkOjpwYXJzZU1hcHBlZEF0dHJp
YnV0ZShhdHRyKSkKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgaWYgKFNWR0ZpdFRvVmll
d0JveDo6cGFyc2VNYXBwZWRBdHRyaWJ1dGUoYXR0cikgJiYgcmVuZGVyZXIoKSkgewotICAgICAg
ICAgICAgc3RhdGljX2Nhc3Q8UmVuZGVyU1ZHQ29udGFpbmVyKj4ocmVuZGVyZXIoKSktPnNldFZp
ZXdCb3godmlld0JveCgpKTsKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PFJlbmRlclNWR1ZpZXdC
b3hDb250YWluZXIqPihyZW5kZXJlcigpKS0+c2V0Vmlld0JveCh2aWV3Qm94KCkpOwogICAgICAg
ICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIGlmIChTVkdab29tQW5kUGFuOjpwYXJz
ZU1hcHBlZEF0dHJpYnV0ZShhdHRyKSkKQEAgLTM0NiwxMyArMzQ2LDEzIEBAIEFmZmluZVRyYW5z
Zm9ybSBTVkdTVkdFbGVtZW50OjpnZXRTY3JlZW4KIAogUmVuZGVyT2JqZWN0KiBTVkdTVkdFbGVt
ZW50OjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSogYXJlbmEsIFJlbmRlclN0eWxlKikKIHsK
LSAgICBSZW5kZXJTVkdDb250YWluZXIqIHJvb3RDb250YWluZXIgPSBuZXcgKGFyZW5hKSBSZW5k
ZXJTVkdDb250YWluZXIodGhpcyk7CisgICAgUmVuZGVyU1ZHVmlld0JveENvbnRhaW5lciogcm9v
dENvbnRhaW5lciA9IG5ldyAoYXJlbmEpIFJlbmRlclNWR1ZpZXdCb3hDb250YWluZXIodGhpcyk7
CiAKICAgICAvLyBGSVhNRTogQWxsIHRoaXMgc2V0dXAgc2hvdWxkIGJlIGRvbmUgYWZ0ZXIgYXR0
cmlidXRlc0NoYW5nZWQsIG5vdCBoZXJlLgogICAgIHJvb3RDb250YWluZXItPnNldFZpZXdCb3go
dmlld0JveCgpKTsKICAgICByb290Q29udGFpbmVyLT5zZXRBbGlnbihLQ0FsaWduKHByZXNlcnZl
QXNwZWN0UmF0aW8oKS0+YWxpZ24oKSAtIDEpKTsKICAgICByb290Q29udGFpbmVyLT5zZXRTbGlj
ZShwcmVzZXJ2ZUFzcGVjdFJhdGlvKCktPm1lZXRPclNsaWNlKCkgPT0gU1ZHUHJlc2VydmVBc3Bl
Y3RSYXRpbzo6U1ZHX01FRVRPUlNMSUNFX1NMSUNFKTsKLSAgICAKKwogICAgIHJldHVybiByb290
Q29udGFpbmVyOwogfQogCkluZGV4OiBXZWJDb3JlL2tzdmcyL3N2Zy9TVkdTVkdFbGVtZW50LmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9rc3ZnMi9zdmcvU1ZHU1ZHRWxlbWVudC5oCShyZXZpc2lv
biAxODgwMSkKKysrIFdlYkNvcmUva3N2ZzIvc3ZnL1NWR1NWR0VsZW1lbnQuaAkod29ya2luZyBj
b3B5KQpAQCAtMTI3LDcgKzEyNyw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlCiAgICAgcHJvdGVjdGVk
OgogICAgICAgICB2aXJ0dWFsIGNvbnN0IFNWR0VsZW1lbnQqIGNvbnRleHRFbGVtZW50KCkgY29u
c3QgeyByZXR1cm4gdGhpczsgfQogCi0gICAgICAgIGZyaWVuZCBjbGFzcyBSZW5kZXJTVkdDb250
YWluZXI7CisgICAgICAgIGZyaWVuZCBjbGFzcyBSZW5kZXJTVkdWaWV3Qm94Q29udGFpbmVyOwog
ICAgICAgICB2aXJ0dWFsIGJvb2wgaGFzUmVsYXRpdmVWYWx1ZXMoKSBjb25zdDsKIAogICAgIHBy
aXZhdGU6CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3N2Zy9TVkdSZXNvdXJjZU1h
cmtlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9zdmcvU1ZH
UmVzb3VyY2VNYXJrZXIuY3BwCShyZXZpc2lvbiAxODgwMSkKKysrIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3Mvc3ZnL1NWR1Jlc291cmNlTWFya2VyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDks
NyArNDksNyBAQCBTVkdSZXNvdXJjZU1hcmtlcjo6flNWR1Jlc291cmNlTWFya2VyKCkKIHsKIH0K
IAotdm9pZCBTVkdSZXNvdXJjZU1hcmtlcjo6c2V0TWFya2VyKFJlbmRlclNWR0NvbnRhaW5lciog
bWFya2VyKQordm9pZCBTVkdSZXNvdXJjZU1hcmtlcjo6c2V0TWFya2VyKFJlbmRlclNWR1ZpZXdC
b3hDb250YWluZXIqIG1hcmtlcikKIHsKICAgICBtX21hcmtlciA9IG1hcmtlcjsKIH0KQEAgLTc1
LDcgKzc1LDcgQEAgdm9pZCBTVkdSZXNvdXJjZU1hcmtlcjo6ZHJhdyhHcmFwaGljc0NvbgogICAg
IGlmIChtX3VzZVN0cm9rZVdpZHRoKQogICAgICAgICB2aWV3cG9ydFRyYW5zZm9ybS5zY2FsZShz
dHJva2VXaWR0aCwgc3Ryb2tlV2lkdGgpOwogICAgIGlmICghbV9tYXJrZXItPnZpZXdCb3goKS5p
c0VtcHR5KCkpCi0gICAgICAgIHZpZXdwb3J0VHJhbnNmb3JtICo9IG1fbWFya2VyLT52aWV3cG9y
dFRyYW5zZm9ybSgpOworICAgICAgICB2aWV3cG9ydFRyYW5zZm9ybSAqPSBtX21hcmtlci0+bG9j
YWxUcmFuc2Zvcm0oKTsKICAgICBkb3VibGUgcmVmWCwgcmVmWTsKICAgICB2aWV3cG9ydFRyYW5z
Zm9ybS5tYXAobV9yZWZYLCBtX3JlZlksICZyZWZYLCAmcmVmWSk7CiAgICAgdHJhbnNmb3JtLnRy
YW5zbGF0ZSgtcmVmWCwgLXJlZlkpOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9z
dmcvU1ZHUmVzb3VyY2VNYXJrZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3N2Zy9TVkdSZXNvdXJjZU1hcmtlci5oCShyZXZpc2lvbiAxODgwMSkKKysrIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc3ZnL1NWR1Jlc291cmNlTWFya2VyLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTM0LDE0ICszNCwxNCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKICAgICBjbGFzcyBG
bG9hdFJlY3Q7CiAgICAgY2xhc3MgR3JhcGhpY3NDb250ZXh0OwotICAgIGNsYXNzIFJlbmRlclNW
R0NvbnRhaW5lcjsKKyAgICBjbGFzcyBSZW5kZXJTVkdWaWV3Qm94Q29udGFpbmVyOwogCiAgICAg
Y2xhc3MgU1ZHUmVzb3VyY2VNYXJrZXIgOiBwdWJsaWMgU1ZHUmVzb3VyY2UgewogICAgIHB1Ymxp
YzoKICAgICAgICAgU1ZHUmVzb3VyY2VNYXJrZXIoKTsKICAgICAgICAgdmlydHVhbCB+U1ZHUmVz
b3VyY2VNYXJrZXIoKTsKIAotICAgICAgICB2b2lkIHNldE1hcmtlcihSZW5kZXJTVkdDb250YWlu
ZXIqKTsKKyAgICAgICAgdm9pZCBzZXRNYXJrZXIoUmVuZGVyU1ZHVmlld0JveENvbnRhaW5lciop
OwogCiAgICAgICAgIHZvaWQgc2V0UmVmKGRvdWJsZSByZWZYLCBkb3VibGUgcmVmWSk7CiAgICAg
ICAgIGRvdWJsZSByZWZYKCkgY29uc3QgeyByZXR1cm4gbV9yZWZYOyB9CkBAIC02Miw3ICs2Miw3
IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICBwcml2YXRlOgogICAgICAgICBkb3VibGUgbV9y
ZWZYLCBtX3JlZlk7CiAgICAgICAgIGZsb2F0IG1fYW5nbGU7Ci0gICAgICAgIFJlbmRlclNWR0Nv
bnRhaW5lciogbV9tYXJrZXI7CisgICAgICAgIFJlbmRlclNWR1ZpZXdCb3hDb250YWluZXIqIG1f
bWFya2VyOwogICAgICAgICBib29sIG1fdXNlU3Ryb2tlV2lkdGg7CiAgICAgfTsKIApJbmRleDog
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyU1ZHQ29udGFpbmVyLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJTVkdDb250YWluZXIuY3BwCShyZXZpc2lvbiAxODgwMSkK
KysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclNWR0NvbnRhaW5lci5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTI1LDIxICsyNSwyMSBAQAogI2lmZGVmIFNWR19TVVBQT1JUCiAjaW5jbHVkZSAiUmVu
ZGVyU1ZHQ29udGFpbmVyLmgiCiAKLSNpbmNsdWRlICJTVkdSZXNvdXJjZUNsaXBwZXIuaCIKLSNp
bmNsdWRlICJTVkdSZXNvdXJjZUZpbHRlci5oIgotI2luY2x1ZGUgIlNWR1Jlc291cmNlTWFza2Vy
LmgiCi0jaW5jbHVkZSAiU1ZHU3R5bGVkRWxlbWVudC5oIgogI2luY2x1ZGUgIkdyYXBoaWNzQ29u
dGV4dC5oIgogI2luY2x1ZGUgIlNWR0xlbmd0aC5oIgogI2luY2x1ZGUgIlNWR01hcmtlckVsZW1l
bnQuaCIKKyNpbmNsdWRlICJTVkdQYXR0ZXJuRWxlbWVudC5oIgorI2luY2x1ZGUgIlNWR1Jlc291
cmNlQ2xpcHBlci5oIgorI2luY2x1ZGUgIlNWR1Jlc291cmNlRmlsdGVyLmgiCisjaW5jbHVkZSAi
U1ZHUmVzb3VyY2VNYXNrZXIuaCIKICNpbmNsdWRlICJTVkdTVkdFbGVtZW50LmgiCisjaW5jbHVk
ZSAiU1ZHU3R5bGVkRWxlbWVudC5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIFJlbmRlclNW
R0NvbnRhaW5lcjo6UmVuZGVyU1ZHQ29udGFpbmVyKFNWR1N0eWxlZEVsZW1lbnQgKm5vZGUpCiAg
ICAgOiBSZW5kZXJDb250YWluZXIobm9kZSkKICAgICAsIG1fZHJhd3NDb250ZW50cyh0cnVlKQot
ICAgICwgbV9zbGljZShmYWxzZSkKIHsKICAgICBzZXRSZXBsYWNlZCh0cnVlKTsKIH0KQEAgLTY4
LDExICs2OCw2IEBAIHZvaWQgUmVuZGVyU1ZHQ29udGFpbmVyOjpzZXRMb2NhbFRyYW5zZm8KICAg
ICBtX21hdHJpeCA9IG1hdHJpeDsKIH0KIAotYm9vbCBSZW5kZXJTVkdDb250YWluZXI6OmNhbkhh
dmVDaGlsZHJlbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0gICAgCiBib29sIFJl
bmRlclNWR0NvbnRhaW5lcjo6cmVxdWlyZXNMYXllcigpCiB7CiAgICAgLy8gT25seSBhbGxvdyBh
biA8c3ZnPiBlbGVtZW50IHRvIGdlbmVyYXRlIGEgbGF5ZXIgd2hlbiBpdCdzIHBvc2l0aW9uZWQg
aW4gYSBub24tU1ZHIGNvbnRleHQKQEAgLTEzOCwxMCArMTMzLDEwIEBAIHZvaWQgUmVuZGVyU1ZH
Q29udGFpbmVyOjpwYWludChQYWludEluZm8KIAogICAgIGlmICgocGFpbnRJbmZvLnBoYXNlID09
IFBhaW50UGhhc2VPdXRsaW5lIHx8IHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlU2VsZk91
dGxpbmUpICYmIHN0eWxlKCktPm91dGxpbmVXaWR0aCgpICYmIHN0eWxlKCktPnZpc2liaWxpdHko
KSA9PSBWSVNJQkxFKQogICAgICAgICBwYWludE91dGxpbmUocGFpbnRJbmZvLmNvbnRleHQsIHBh
cmVudFgsIHBhcmVudFksIHdpZHRoKCksIGhlaWdodCgpLCBzdHlsZSgpKTsKLSAgICAKKwogICAg
IGlmIChwYWludEluZm8ucGhhc2UgIT0gUGFpbnRQaGFzZUZvcmVncm91bmQgfHwgIWRyYXdzQ29u
dGVudHMoKSkKICAgICAgICAgcmV0dXJuOwotICAgIAorCiAgICAgU1ZHUmVzb3VyY2VGaWx0ZXIq
IGZpbHRlciA9IGdldEZpbHRlckJ5SWQoZG9jdW1lbnQoKSwgc3R5bGUoKS0+c3ZnU3R5bGUoKS0+
ZmlsdGVyKCkuc3Vic3RyaW5nKDEpKTsKICAgICBpZiAoIWZpcnN0Q2hpbGQoKSAmJiAhZmlsdGVy
KQogICAgICAgICByZXR1cm47IC8vIFNwZWM6IGdyb3VwcyB3L28gY2hpbGRyZW4gc3RpbGwgbWF5
IHJlbmRlciBmaWx0ZXIgY29udGVudC4KQEAgLTE1OCw3ICsxNTMsNyBAQCB2b2lkIFJlbmRlclNW
R0NvbnRhaW5lcjo6cGFpbnQoUGFpbnRJbmZvCiAgICAgICAgIGlmIChzdHlsZSgpLT5vdmVyZmxv
d1goKSAhPSBPVklTSUJMRSkKICAgICAgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5jbGlwKGVu
Y2xvc2luZ0ludFJlY3Qodmlld3BvcnQoKSkpOyAvLyBGSVhNRTogRXZlbnR1YWxseSB3ZSdsbCB3
YW50IGZsb2F0LXByZWNpc2lvbiBjbGlwcGluZwogCi0gICAgICAgIHBhaW50SW5mby5jb250ZXh0
LT5jb25jYXRDVE0oQWZmaW5lVHJhbnNmb3JtKCkudHJhbnNsYXRlKHZpZXdwb3J0KCkueCgpLCB2
aWV3cG9ydCgpLnkoKSkpOworICAgICAgICAvL3BhaW50SW5mby5jb250ZXh0LT5jb25jYXRDVE0o
QWZmaW5lVHJhbnNmb3JtKCkudHJhbnNsYXRlKHZpZXdwb3J0KCkueCgpLCB2aWV3cG9ydCgpLnko
KSkpOwogICAgIH0KIAogICAgIGlmICghbG9jYWxUcmFuc2Zvcm0oKS5pc0lkZW50aXR5KCkpCkBA
IC0xODEsOSArMTc2LDYgQEAgdm9pZCBSZW5kZXJTVkdDb250YWluZXI6OnBhaW50KFBhaW50SW5m
bwogICAgIGlmIChmaWx0ZXIpCiAgICAgICAgIGZpbHRlci0+cHJlcGFyZUZpbHRlcihwYWludElu
Zm8uY29udGV4dCwgc3Ryb2tlQkJveCk7CiAKLSAgICBpZiAoIXZpZXdCb3goKS5pc0VtcHR5KCkp
Ci0gICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5jb25jYXRDVE0odmlld3BvcnRUcmFuc2Zvcm0o
KSk7Ci0KICAgICBSZW5kZXJDb250YWluZXI6OnBhaW50KHBhaW50SW5mbywgMCwgMCk7CiAKICAg
ICBpZiAoZmlsdGVyKQpAQCAtMTk1LDc3ICsxODcsNiBAQCB2b2lkIFJlbmRlclNWR0NvbnRhaW5l
cjo6cGFpbnQoUGFpbnRJbmZvCiAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnJlc3RvcmUoKTsKIH0K
IAotRmxvYXRSZWN0IFJlbmRlclNWR0NvbnRhaW5lcjo6dmlld3BvcnQoKSBjb25zdAotewotICAg
IHJldHVybiBtX3ZpZXdwb3J0OwotfQotCi12b2lkIFJlbmRlclNWR0NvbnRhaW5lcjo6Y2FsY1Zp
ZXdwb3J0KCkKLXsKLSAgICBTVkdFbGVtZW50KiBzdmdlbGVtID0gc3RhdGljX2Nhc3Q8U1ZHRWxl
bWVudCo+KGVsZW1lbnQoKSk7Ci0gICAgaWYgKHN2Z2VsZW0tPmhhc1RhZ05hbWUoU1ZHTmFtZXM6
OnN2Z1RhZykpIHsKLSAgICAgICAgU1ZHU1ZHRWxlbWVudCogc3ZnID0gc3RhdGljX2Nhc3Q8U1ZH
U1ZHRWxlbWVudCo+KGVsZW1lbnQoKSk7Ci0KLSAgICAgICAgaWYgKCFzZWxmTmVlZHNMYXlvdXQo
KSAmJiAhc3ZnLT5oYXNSZWxhdGl2ZVZhbHVlcygpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0g
ICAgICAgIGRvdWJsZSB4ID0gc3ZnLT54KCkudmFsdWUoKTsKLSAgICAgICAgZG91YmxlIHkgPSBz
dmctPnkoKS52YWx1ZSgpOwotICAgICAgICBkb3VibGUgdyA9IHN2Zy0+d2lkdGgoKS52YWx1ZSgp
OwotICAgICAgICBkb3VibGUgaCA9IHN2Zy0+aGVpZ2h0KCkudmFsdWUoKTsKLSAgICAgICAgbV92
aWV3cG9ydCA9IEZsb2F0UmVjdCh4LCB5LCB3LCBoKTsKLSAgICB9IGVsc2UgaWYgKHN2Z2VsZW0t
Pmhhc1RhZ05hbWUoU1ZHTmFtZXM6Om1hcmtlclRhZykpIHsKLSAgICAgICAgaWYgKCFzZWxmTmVl
ZHNMYXlvdXQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICBTVkdNYXJrZXJFbGVt
ZW50KiBzdmcgPSBzdGF0aWNfY2FzdDxTVkdNYXJrZXJFbGVtZW50Kj4oZWxlbWVudCgpKTsKLSAg
ICAgICAgZG91YmxlIHcgPSBzdmctPm1hcmtlcldpZHRoKCkudmFsdWUoKTsKLSAgICAgICAgZG91
YmxlIGggPSBzdmctPm1hcmtlckhlaWdodCgpLnZhbHVlKCk7Ci0gICAgICAgIG1fdmlld3BvcnQg
PSBGbG9hdFJlY3QoMCwgMCwgdywgaCk7Ci0gICAgfQotfQotCi12b2lkIFJlbmRlclNWR0NvbnRh
aW5lcjo6c2V0Vmlld0JveChjb25zdCBGbG9hdFJlY3QmIHZpZXdCb3gpCi17Ci0gICAgbV92aWV3
Qm94ID0gdmlld0JveDsKLQotICAgIGlmIChzdHlsZSgpKQotICAgICAgICBzZXROZWVkc0xheW91
dCh0cnVlKTsKLX0KLQotRmxvYXRSZWN0IFJlbmRlclNWR0NvbnRhaW5lcjo6dmlld0JveCgpIGNv
bnN0Ci17Ci0gICAgcmV0dXJuIG1fdmlld0JveDsKLX0KLQotdm9pZCBSZW5kZXJTVkdDb250YWlu
ZXI6OnNldEFsaWduKEtDQWxpZ24gYWxpZ24pCi17Ci0gICAgbV9hbGlnbiA9IGFsaWduOwotICAg
IGlmIChzdHlsZSgpKQotICAgICAgICBzZXROZWVkc0xheW91dCh0cnVlKTsKLX0KLQotS0NBbGln
biBSZW5kZXJTVkdDb250YWluZXI6OmFsaWduKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9hbGln
bjsKLX0KLQotQWZmaW5lVHJhbnNmb3JtIFJlbmRlclNWR0NvbnRhaW5lcjo6dmlld3BvcnRUcmFu
c2Zvcm0oKSBjb25zdAotewotICAgIC8vIEZJWE1FOiBUaGUgbWV0aG9kIG5hbWUgaXMgY29uZnVz
aW5nLCBzaW5jZSBpdCBkb2VzIG5vdAotICAgIC8vIGRvIHZpZXdwb3J0IHRyYW5zbGF0aW5nIGFu
eW1vcmUuIExvb2sgaW50byB0aGlzIHdoaWxlCi0gICAgLy8gIGZpeGluZyBidWcgMTIyMDcuCi0g
ICAgaWYgKCF2aWV3Qm94KCkuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEZsb2F0UmVjdCB2aWV3cG9y
dFJlY3QgPSB2aWV3cG9ydCgpOwotICAgICAgICBpZiAoIXBhcmVudCgpLT5pc1NWR0NvbnRhaW5l
cigpKQotICAgICAgICAgICAgdmlld3BvcnRSZWN0ID0gRmxvYXRSZWN0KHZpZXdwb3J0KCkueCgp
LCB2aWV3cG9ydCgpLnkoKSwgd2lkdGgoKSwgaGVpZ2h0KCkpOwotCi0gICAgICAgIHJldHVybiBn
ZXRBc3BlY3RSYXRpbyh2aWV3Qm94KCksIHZpZXdwb3J0UmVjdCk7Ci0gICAgfQotCi0gICAgcmV0
dXJuIEFmZmluZVRyYW5zZm9ybSgpOwotfQotCiBJbnRSZWN0IFJlbmRlclNWR0NvbnRhaW5lcjo6
Z2V0QWJzb2x1dGVSZXBhaW50UmVjdCgpCiB7CiAgICAgSW50UmVjdCByZXBhaW50UmVjdDsKQEAg
LTI4NiwxMyArMjA3LDYgQEAgdm9pZCBSZW5kZXJTVkdDb250YWluZXI6OmFic29sdXRlUmVjdHMo
VgogICAgIHJlY3RzLmFwcGVuZChnZXRBYnNvbHV0ZVJlcGFpbnRSZWN0KCkpOwogfQogCi1BZmZp
bmVUcmFuc2Zvcm0gUmVuZGVyU1ZHQ29udGFpbmVyOjphYnNvbHV0ZVRyYW5zZm9ybSgpIGNvbnN0
Ci17Ci0gICAgQWZmaW5lVHJhbnNmb3JtIGN0bSA9IFJlbmRlckNvbnRhaW5lcjo6YWJzb2x1dGVU
cmFuc2Zvcm0oKTsKLSAgICBjdG0udHJhbnNsYXRlKHZpZXdwb3J0KCkueCgpLCB2aWV3cG9ydCgp
LnkoKSk7Ci0gICAgcmV0dXJuIHZpZXdwb3J0VHJhbnNmb3JtKCkgKiBjdG07Ci19Ci0KIGJvb2wg
UmVuZGVyU1ZHQ29udGFpbmVyOjpmaWxsQ29udGFpbnMoY29uc3QgRmxvYXRQb2ludCYgcCkgY29u
c3QKIHsKICAgICBSZW5kZXJPYmplY3QqIGN1cnJlbnQgPSBmaXJzdENoaWxkKCk7CkBAIC0zMzMs
NyArMjQ3LDgyIEBAIEZsb2F0UmVjdCBSZW5kZXJTVkdDb250YWluZXI6OnJlbGF0aXZlQkIKICAg
ICByZXR1cm4gcmVjdDsKIH0KIAotdm9pZCBSZW5kZXJTVkdDb250YWluZXI6OnNldFNsaWNlKGJv
b2wgc2xpY2UpCitSZW5kZXJTVkdWaWV3Qm94Q29udGFpbmVyOjpSZW5kZXJTVkdWaWV3Qm94Q29u
dGFpbmVyKFNWR1N0eWxlZEVsZW1lbnQgKm5vZGUpCisgICAgOiBSZW5kZXJTVkdDb250YWluZXIo
bm9kZSkKKyAgICAsIG1fc2xpY2UoZmFsc2UpCit7Cit9CisKK1JlbmRlclNWR1ZpZXdCb3hDb250
YWluZXI6On5SZW5kZXJTVkdDb250YWluZXIoKQoreworfQorCitGbG9hdFJlY3QgUmVuZGVyU1ZH
Vmlld0JveENvbnRhaW5lcjo6dmlld3BvcnQoKSBjb25zdAoreworICAgIHJldHVybiBtX3ZpZXdw
b3J0OworfQorCit2b2lkIFJlbmRlclNWR1ZpZXdCb3hDb250YWluZXI6OmNhbGNWaWV3cG9ydCgp
Cit7CisgICAgU1ZHRWxlbWVudCogc3ZnZWxlbSA9IHN0YXRpY19jYXN0PFNWR0VsZW1lbnQqPihl
bGVtZW50KCkpOworICAgIGlmIChzdmdlbGVtLT5oYXNUYWdOYW1lKFNWR05hbWVzOjpzdmdUYWcp
KSB7CisgICAgICAgIFNWR1NWR0VsZW1lbnQqIHN2ZyA9IHN0YXRpY19jYXN0PFNWR1NWR0VsZW1l
bnQqPihlbGVtZW50KCkpOworCisgICAgICAgIGlmICghc2VsZk5lZWRzTGF5b3V0KCkgJiYgIXN2
Zy0+aGFzUmVsYXRpdmVWYWx1ZXMoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBk
b3VibGUgeCA9IHN2Zy0+eCgpLnZhbHVlKCk7CisgICAgICAgIGRvdWJsZSB5ID0gc3ZnLT55KCku
dmFsdWUoKTsKKyAgICAgICAgZG91YmxlIHcgPSBzdmctPndpZHRoKCkudmFsdWUoKTsKKyAgICAg
ICAgZG91YmxlIGggPSBzdmctPmhlaWdodCgpLnZhbHVlKCk7CisgICAgICAgIG1fdmlld3BvcnQg
PSBGbG9hdFJlY3QoeCwgeSwgdywgaCk7CisgICAgfSBlbHNlIGlmIChzdmdlbGVtLT5oYXNUYWdO
YW1lKFNWR05hbWVzOjpwYXR0ZXJuVGFnKSkgeworICAgICAgICBpZiAoIXNlbGZOZWVkc0xheW91
dCgpKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBTVkdQYXR0ZXJuRWxlbWVudCogc3Zn
ID0gc3RhdGljX2Nhc3Q8U1ZHUGF0dGVybkVsZW1lbnQqPihlbGVtZW50KCkpOworCisgICAgICAg
IGRvdWJsZSB4ID0gc3ZnLT54KCkudmFsdWUoKTsKKyAgICAgICAgZG91YmxlIHkgPSBzdmctPnko
KS52YWx1ZSgpOworICAgICAgICBkb3VibGUgdyA9IHN2Zy0+d2lkdGgoKS52YWx1ZSgpOworICAg
ICAgICBkb3VibGUgaCA9IHN2Zy0+aGVpZ2h0KCkudmFsdWUoKTsKKyAgICAgICAgbV92aWV3cG9y
dCA9IEZsb2F0UmVjdCh4LCB5LCB3LCBoKTsKKyAgICB9IGVsc2UgaWYgKHN2Z2VsZW0tPmhhc1Rh
Z05hbWUoU1ZHTmFtZXM6Om1hcmtlclRhZykpIHsKKyAgICAgICAgaWYgKCFzZWxmTmVlZHNMYXlv
dXQoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBTVkdNYXJrZXJFbGVtZW50KiBz
dmcgPSBzdGF0aWNfY2FzdDxTVkdNYXJrZXJFbGVtZW50Kj4oZWxlbWVudCgpKTsKKyAgICAgICAg
ZG91YmxlIHcgPSBzdmctPm1hcmtlcldpZHRoKCkudmFsdWUoKTsKKyAgICAgICAgZG91YmxlIGgg
PSBzdmctPm1hcmtlckhlaWdodCgpLnZhbHVlKCk7CisgICAgICAgIG1fdmlld3BvcnQgPSBGbG9h
dFJlY3QoMCwgMCwgdywgaCk7CisgICAgfQorfQorCit2b2lkIFJlbmRlclNWR1ZpZXdCb3hDb250
YWluZXI6OnNldFZpZXdCb3goY29uc3QgRmxvYXRSZWN0JiB2aWV3Qm94KQoreworICAgIG1fdmll
d0JveCA9IHZpZXdCb3g7CisKKyAgICBpZiAoc3R5bGUoKSkKKyAgICAgICAgc2V0TmVlZHNMYXlv
dXQodHJ1ZSk7Cit9CisKK0Zsb2F0UmVjdCBSZW5kZXJTVkdWaWV3Qm94Q29udGFpbmVyOjp2aWV3
Qm94KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV92aWV3Qm94OworfQorCit2b2lkIFJlbmRlclNW
R1ZpZXdCb3hDb250YWluZXI6OnNldEFsaWduKEtDQWxpZ24gYWxpZ24pCit7CisgICAgbV9hbGln
biA9IGFsaWduOworICAgIGlmIChzdHlsZSgpKQorICAgICAgICBzZXROZWVkc0xheW91dCh0cnVl
KTsKK30KKworS0NBbGlnbiBSZW5kZXJTVkdWaWV3Qm94Q29udGFpbmVyOjphbGlnbigpIGNvbnN0
Cit7CisgICAgcmV0dXJuIG1fYWxpZ247Cit9CisKK3ZvaWQgUmVuZGVyU1ZHVmlld0JveENvbnRh
aW5lcjo6c2V0U2xpY2UoYm9vbCBzbGljZSkKIHsKICAgICBtX3NsaWNlID0gc2xpY2U7CiAKQEAg
LTM0MSwxMiArMzMwLDI3IEBAIHZvaWQgUmVuZGVyU1ZHQ29udGFpbmVyOjpzZXRTbGljZShib29s
IHMKICAgICAgICAgc2V0TmVlZHNMYXlvdXQodHJ1ZSk7CiB9CiAKLWJvb2wgUmVuZGVyU1ZHQ29u
dGFpbmVyOjpzbGljZSgpIGNvbnN0Citib29sIFJlbmRlclNWR1ZpZXdCb3hDb250YWluZXI6OnNs
aWNlKCkgY29uc3QKIHsKICAgICByZXR1cm4gbV9zbGljZTsKIH0KIAotQWZmaW5lVHJhbnNmb3Jt
IFJlbmRlclNWR0NvbnRhaW5lcjo6Z2V0QXNwZWN0UmF0aW8oY29uc3QgRmxvYXRSZWN0JiBsb2dp
Y2FsLCBjb25zdCBGbG9hdFJlY3QmIHBoeXNpY2FsKSBjb25zdAorQWZmaW5lVHJhbnNmb3JtIFJl
bmRlclNWR1ZpZXdCb3hDb250YWluZXI6OmxvY2FsVHJhbnNmb3JtKCkgY29uc3QKK3sKKyAgICBB
ZmZpbmVUcmFuc2Zvcm0gY3RtOworICAgIGN0bS50cmFuc2xhdGUodmlld3BvcnQoKS54KCksIHZp
ZXdwb3J0KCkueSgpKTsKKyAgICBpZiAoIXZpZXdCb3goKS5pc0VtcHR5KCkpIHsKKyAgICAgICAg
RmxvYXRSZWN0IHZpZXdwb3J0UmVjdCA9IHZpZXdwb3J0KCk7CisgICAgICAgIGlmICghcGFyZW50
KCktPmlzU1ZHQ29udGFpbmVyKCkpCisgICAgICAgICAgICB2aWV3cG9ydFJlY3QgPSBGbG9hdFJl
Y3Qodmlld3BvcnQoKS54KCksIHZpZXdwb3J0KCkueSgpLCB3aWR0aCgpLCBoZWlnaHQoKSk7CisK
KyAgICAgICAgY3RtID0gZ2V0QXNwZWN0UmF0aW8odmlld0JveCgpLCB2aWV3cG9ydFJlY3QpICog
Y3RtOworICAgIH0KKworICAgIHJldHVybiBjdG07Cit9CisKK0FmZmluZVRyYW5zZm9ybSBSZW5k
ZXJTVkdWaWV3Qm94Q29udGFpbmVyOjpnZXRBc3BlY3RSYXRpbyhjb25zdCBGbG9hdFJlY3QmIGxv
Z2ljYWwsIGNvbnN0IEZsb2F0UmVjdCYgcGh5c2ljYWwpIGNvbnN0CiB7CiAgICAgQWZmaW5lVHJh
bnNmb3JtIHRlbXA7CiAKQEAgLTM4Niw3ICszOTAsNyBAQCBBZmZpbmVUcmFuc2Zvcm0gUmVuZGVy
U1ZHQ29udGFpbmVyOjpnZXRBCiAgICAgcmV0dXJuIHRlbXA7CiB9CiAKLWJvb2wgUmVuZGVyU1ZH
Q29udGFpbmVyOjpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0
VGVzdFJlc3VsdCYgcmVzdWx0LCBpbnQgX3gsIGludCBfeSwgaW50IF90eCwgaW50IF90eSwgSGl0
VGVzdEFjdGlvbiBoaXRUZXN0QWN0aW9uKQorYm9vbCBSZW5kZXJTVkdWaWV3Qm94Q29udGFpbmVy
Ojpub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYgcmVxdWVzdCwgSGl0VGVzdFJlc3Vs
dCYgcmVzdWx0LCBpbnQgX3gsIGludCBfeSwgaW50IF90eCwgaW50IF90eSwgSGl0VGVzdEFjdGlv
biBoaXRUZXN0QWN0aW9uKQogewogICAgIFNWR0VsZW1lbnQqIHN2Z2VsZW0gPSBzdGF0aWNfY2Fz
dDxTVkdFbGVtZW50Kj4oZWxlbWVudCgpKTsKICAgICBpZiAoc3ZnZWxlbS0+aGFzVGFnTmFtZShT
VkdOYW1lczo6c3ZnVGFnKSkgewpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyU1ZHQ29u
dGFpbmVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyU1ZHQ29udGFp
bmVyLmgJKHJldmlzaW9uIDE4ODAxKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyU1ZHQ29u
dGFpbmVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTUwLDM4ICs1MCw1NCBAQCBwdWJsaWM6CiAgICAg
UmVuZGVyU1ZHQ29udGFpbmVyKFNWR1N0eWxlZEVsZW1lbnQqKTsKICAgICB+UmVuZGVyU1ZHQ29u
dGFpbmVyKCk7CiAKKyAgICB2aXJ0dWFsIGJvb2wgaXNTVkdDb250YWluZXIoKSBjb25zdCB7IHJl
dHVybiB0cnVlOyB9CisgICAgdmlydHVhbCBjb25zdCBjaGFyKiByZW5kZXJOYW1lKCkgY29uc3Qg
eyByZXR1cm4gIlJlbmRlclNWR0NvbnRhaW5lciI7IH0KKyAgICB2aXJ0dWFsIGJvb2wgY2FuSGF2
ZUNoaWxkcmVuKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgdmlydHVhbCBib29sIHJl
cXVpcmVzTGF5ZXIoKTsKKwogICAgIC8vIFNvbWUgY29udGFpbmVycyBkbyBub3Qgd2FudCBpdCdz
IGNoaWxkcmVuCiAgICAgLy8gdG8gYmUgZHJhd24sIGJlY2F1c2UgdGhleSBtYXkgYmUgJ3JlZmVy
ZW5jZWQnCiAgICAgLy8gRXhhbXBsZTogPG1hcmtlcj4gY2hpbGRyZW4gaW4gU1ZHCiAgICAgdm9p
ZCBzZXREcmF3c0NvbnRlbnRzKGJvb2wpOwogICAgIGJvb2wgZHJhd3NDb250ZW50cygpIGNvbnN0
OwogCi0gICAgdmlydHVhbCBib29sIGlzU1ZHQ29udGFpbmVyKCkgY29uc3QgeyByZXR1cm4gdHJ1
ZTsgfQotICAgIHZpcnR1YWwgY29uc3QgY2hhciogcmVuZGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJu
ICJSZW5kZXJTVkdDb250YWluZXIiOyB9Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGNhbkhhdmVD
aGlsZHJlbigpIGNvbnN0OwotICAgIAotICAgIHZpcnR1YWwgYm9vbCByZXF1aXJlc0xheWVyKCk7
CiAgICAgdmlydHVhbCBzaG9ydCBsaW5lSGVpZ2h0KGJvb2wgYiwgYm9vbCBpc1Jvb3RMaW5lQm94
ID0gZmFsc2UpIGNvbnN0OwogICAgIHZpcnR1YWwgc2hvcnQgYmFzZWxpbmVQb3NpdGlvbihib29s
IGIsIGJvb2wgaXNSb290TGluZUJveCA9IGZhbHNlKSBjb25zdDsKLSAgICAKKwogICAgIHZpcnR1
YWwgdm9pZCBjYWxjTWluTWF4V2lkdGgoKTsKICAgICB2aXJ0dWFsIHZvaWQgbGF5b3V0KCk7CiAg
ICAgdmlydHVhbCB2b2lkIHBhaW50KFBhaW50SW5mbyYsIGludCBwYXJlbnRYLCBpbnQgcGFyZW50
WSk7Ci0gICAgCisKICAgICB2aXJ0dWFsIEludFJlY3QgZ2V0QWJzb2x1dGVSZXBhaW50UmVjdCgp
OwogICAgIHZpcnR1YWwgdm9pZCBhYnNvbHV0ZVJlY3RzKFZlY3RvcjxJbnRSZWN0PiYgcmVjdHMs
IGludCB0eCwgaW50IHR5KTsKIAotICAgIHZpcnR1YWwgQWZmaW5lVHJhbnNmb3JtIGFic29sdXRl
VHJhbnNmb3JtKCkgY29uc3Q7CisgICAgdmlydHVhbCBGbG9hdFJlY3Qgdmlld3BvcnQoKSBjb25z
dCB7IHJldHVybiBGbG9hdFJlY3QoKTsgfQogCiAgICAgYm9vbCBmaWxsQ29udGFpbnMoY29uc3Qg
RmxvYXRQb2ludCYpIGNvbnN0OwogICAgIGJvb2wgc3Ryb2tlQ29udGFpbnMoY29uc3QgRmxvYXRQ
b2ludCYpIGNvbnN0OwogICAgIEZsb2F0UmVjdCByZWxhdGl2ZUJCb3goYm9vbCBpbmNsdWRlU3Ry
b2tlID0gdHJ1ZSkgY29uc3Q7Ci0gICAgCisKICAgICB2aXJ0dWFsIEFmZmluZVRyYW5zZm9ybSBs
b2NhbFRyYW5zZm9ybSgpIGNvbnN0OwogICAgIHZvaWQgc2V0TG9jYWxUcmFuc2Zvcm0oY29uc3Qg
QWZmaW5lVHJhbnNmb3JtJik7Ci0gICAKLSAgICBGbG9hdFJlY3Qgdmlld3BvcnQoKSBjb25zdDsK
KworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBjYWxjVmlld3BvcnQoKSB7fQorCitwcml2
YXRlOgorICAgIGJvb2wgbV9kcmF3c0NvbnRlbnRzIDogMTsKKyAgICBJbnRSZWN0IG1fYWJzb2x1
dGVCb3VuZHM7CisgICAgQWZmaW5lVHJhbnNmb3JtIG1fbWF0cml4OworfTsKKworY2xhc3MgUmVu
ZGVyU1ZHVmlld0JveENvbnRhaW5lciA6IHB1YmxpYyBSZW5kZXJTVkdDb250YWluZXIgeworcHVi
bGljOgorICAgIFJlbmRlclNWR1ZpZXdCb3hDb250YWluZXIoU1ZHU3R5bGVkRWxlbWVudCopOwor
ICAgIH5SZW5kZXJTVkdWaWV3Qm94Q29udGFpbmVyKCk7CisKKyAgICB2aXJ0dWFsIGNvbnN0IGNo
YXIqIHJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyU1ZHVmlld0JveENvbnRhaW5l
ciI7IH0KKworICAgIHZpcnR1YWwgRmxvYXRSZWN0IHZpZXdwb3J0KCkgY29uc3Q7CiAKICAgICB2
b2lkIHNldFZpZXdCb3goY29uc3QgRmxvYXRSZWN0Jik7CiAgICAgRmxvYXRSZWN0IHZpZXdCb3go
KSBjb25zdDsKQEAgLTkxLDIzICsxMDcsMTkgQEAgcHVibGljOgogCiAgICAgdm9pZCBzZXRTbGlj
ZShib29sKTsKICAgICBib29sIHNsaWNlKCkgY29uc3Q7Ci0gICAgCi0gICAgQWZmaW5lVHJhbnNm
b3JtIHZpZXdwb3J0VHJhbnNmb3JtKCkgY29uc3Q7Ci0gICAgCisKICAgICB2aXJ0dWFsIGJvb2wg
bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3QmLCBIaXRUZXN0UmVzdWx0JiwgaW50IHgs
IGludCB5LCBpbnQgdHgsIGludCB0eSwgSGl0VGVzdEFjdGlvbik7CiAKKyAgICB2aXJ0dWFsIEFm
ZmluZVRyYW5zZm9ybSBsb2NhbFRyYW5zZm9ybSgpIGNvbnN0OworCiBwcml2YXRlOgotICAgIHZv
aWQgY2FsY1ZpZXdwb3J0KCk7IAorICAgIHZpcnR1YWwgdm9pZCBjYWxjVmlld3BvcnQoKTsgCiAg
ICAgQWZmaW5lVHJhbnNmb3JtIGdldEFzcGVjdFJhdGlvKGNvbnN0IEZsb2F0UmVjdCYgbG9naWNh
bCwgY29uc3QgRmxvYXRSZWN0JiBwaHlzaWNhbCkgY29uc3Q7CiAKLSAgICBib29sIG1fZHJhd3ND
b250ZW50cyA6IDE7CiAgICAgYm9vbCBtX3NsaWNlIDogMTsKLSAgICBBZmZpbmVUcmFuc2Zvcm0g
bV9tYXRyaXg7Ci0gICAgCiAgICAgRmxvYXRSZWN0IG1fdmlld3BvcnQ7CiAgICAgRmxvYXRSZWN0
IG1fdmlld0JveDsKICAgICBLQ0FsaWduIG1fYWxpZ247Ci0gICAgSW50UmVjdCBtX2Fic29sdXRl
Qm91bmRzOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQo=
</data>
<flag name="review"
          id="4659"
          type_id="1"
          status="-"
          setter="mjs"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>14987</attachid>
            <date>2007-06-12 15:57:48 -0700</date>
            <delta_ts>2007-06-12 17:08:16 -0700</delta_ts>
            <desc>Work in progress</desc>
            <filename>12207-3.diff</filename>
            <type>text/plain</type>
            <size>32393</size>
            <attacher name="Rob Buis">rwlbuis</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lv
biAyMjA5OCkKKysrIFdlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3
b3JraW5nIGNvcHkpCkBAIC0yMjU4LDYgKzIyNTgsOCBAQAogCQlBQTA5NzJDRDBCNjk0N0E4MDBB
NzA1RTkgLyogU1ZHSW5saW5lVGV4dEJveC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gQUEwOTcyQ0IwQjY5NDdBODAwQTcwNUU5IC8qIFNWR0lubGluZVRl
eHRCb3guaCAqLzsgfTsKIAkJQUEyMUVDQ0EwQUJGMEZCQTAwMkI4MzRDIC8qIENTU0N1cnNvcklt
YWdlVmFsdWUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gQUEwOTc4RUQwQUJBQTZFMTAwODc0NDgwIC8qIENTU0N1cnNvckltYWdlVmFsdWUuY3BwICov
OyB9OwogCQlBQTIxRUNDRDBBQkYwRkM2MDAyQjgzNEMgLyogQ1NTQ3Vyc29ySW1hZ2VWYWx1ZS5o
IGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQUEwOTc4RUUw
QUJBQTZFMTAwODc0NDgwIC8qIENTU0N1cnNvckltYWdlVmFsdWUuaCAqLzsgc2V0dGluZ3MgPSB7
QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OworCQlBQTMxQjVCNDBDMURGRDEwMDBBRTcw
ODMgLyogUmVuZGVyU1ZHUm9vdC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSBBQTMxQjVCMjBDMURGRDEwMDBBRTcwODMgLyogUmVuZGVyU1ZHUm9vdC5j
cHAgKi87IH07CisJCUFBMzFCNUI1MEMxREZEMTAwMEFFNzA4MyAvKiBSZW5kZXJTVkdSb290Lmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBQTMxQjVCMzBD
MURGRDEwMDBBRTcwODMgLyogUmVuZGVyU1ZHUm9vdC5oICovOyB9OwogCQlBQTRDM0E3NjBCMkIx
Njc5MDAyMzM0QTIgLyogU3R5bGVFbGVtZW50LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEFBNEMzQTc0MEIyQjE2NzkwMDIzMzRBMiAvKiBTdHlsZUVs
ZW1lbnQuY3BwICovOyB9OwogCQlBQTRDM0E3NzBCMkIxNjc5MDAyMzM0QTIgLyogU3R5bGVFbGVt
ZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBQTRD
M0E3NTBCMkIxNjc5MDAyMzM0QTIgLyogU3R5bGVFbGVtZW50LmggKi87IH07CiAJCUFBODgyQjJG
MEI0RUY1RUIwMDZEMjZEMSAvKiBQb2ludGVyRXZlbnRzSGl0UnVsZXMuY3BwIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQUE4ODJCMkQwQjRFRjVFQjAwNkQy
NkQxIC8qIFBvaW50ZXJFdmVudHNIaXRSdWxlcy5jcHAgKi87IH07CkBAIC01MzUyLDYgKzUzNTQs
OCBAQAogCQlBQTA5NzJDQjBCNjk0N0E4MDBBNzA1RTkgLyogU1ZHSW5saW5lVGV4dEJveC5oICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU1ZHSW5saW5lVGV4dEJveC5oOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlBQTA5NzhFRDBBQkFBNkUxMDA4NzQ0ODAgLyogQ1NT
Q3Vyc29ySW1hZ2VWYWx1ZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRo
ID0gQ1NTQ3Vyc29ySW1hZ2VWYWx1ZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJ
CUFBMDk3OEVFMEFCQUE2RTEwMDg3NDQ4MCAvKiBDU1NDdXJzb3JJbWFnZVZhbHVlLmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBDU1NDdXJzb3JJbWFnZVZhbHVlLmg7IHNvdXJj
ZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCUFBMzFCNUIyMEMxREZEMTAwMEFFNzA4MyAvKiBSZW5k
ZXJTVkdSb290LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBSZW5k
ZXJTVkdSb290LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQUEzMUI1QjMwQzFE
RkQxMDAwQUU3MDgzIC8qIFJlbmRlclNWR1Jvb3QuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IFJlbmRlclNWR1Jvb3QuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
QUE0QzNBNzQwQjJCMTY3OTAwMjMzNEEyIC8qIFN0eWxlRWxlbWVudC5jcHAgKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gU3R5bGVFbGVtZW50LmNwcDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKIAkJQUE0QzNBNzUwQjJCMTY3OTAwMjMzNEEyIC8qIFN0eWxlRWxlbWVu
dC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gU3R5bGVFbGVtZW50Lmg7IHNv
dXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUFBODgyQjJEMEI0RUY1RUIwMDZEMjZEMSAvKiBQ
b2ludGVyRXZlbnRzSGl0UnVsZXMuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsg
cGF0aCA9IFBvaW50ZXJFdmVudHNIaXRSdWxlcy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CkBAIC05NDg1LDYgKzk0ODksOCBAQAogCQlGNTIzRDJGMzAyREU0NDNCMDE4NjM1Q0EgLyog
cmVuZGVyaW5nICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQljaGlsZHJlbiA9ICgKKwkJ
CQlBQTMxQjVCMjBDMURGRDEwMDBBRTcwODMgLyogUmVuZGVyU1ZHUm9vdC5jcHAgKi8sCisJCQkJ
QUEzMUI1QjMwQzFERkQxMDAwQUU3MDgzIC8qIFJlbmRlclNWR1Jvb3QuaCAqLywKIAkJCQlBOENG
RjA0QjBBMTU0RjA5MDAwQTQyMzQgLyogQXV0b1RhYmxlTGF5b3V0LmNwcCAqLywKIAkJCQlBOENG
RjA0OTBBMTU0RjA5MDAwQTQyMzQgLyogQXV0b1RhYmxlTGF5b3V0LmggKi8sCiAJCQkJQkNFQTQ4
MTMwOTdEOTMwMjAwOTRDOUU0IC8qIGJpZGkuY3BwICovLApAQCAtMTEzMDAsNiArMTEzMDYsNyBA
QAogCQkJCTJEOTA2NjA3MEJFMTQxRDQwMDk1Njk5OCAvKiBMYXlvdXRTdGF0ZS5oIGluIEhlYWRl
cnMgKi8sCiAJCQkJMTRDOUEyOUEwQkYwNERCNjAwRDczNEE4IC8qIFdlYlNjcmlwdE9iamVjdFBl
bmRpbmdQdWJsaWMuaCBpbiBIZWFkZXJzICovLAogCQkJCUE4RjRGQjk0MEMxNjlFN0IwMDJBRkVE
NSAvKiBTVkdSZW5kZXJTdXBwb3J0LmggaW4gSGVhZGVycyAqLywKKwkJCQlBQTMxQjVCNTBDMURG
RDEwMDBBRTcwODMgLyogUmVuZGVyU1ZHUm9vdC5oIGluIEhlYWRlcnMgKi8sCiAJCQkpOwogCQkJ
cnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkBAIC0xMjY3Nyw2
ICsxMjY4NCw3IEBACiAJCQkJNEE4Qzk2RUIwQkU2OTAzMjAwNEVFRkYwIC8qIFNlbGVjdGlvbkNv
bnRyb2xsZXJNYWMubW0gaW4gU291cmNlcyAqLywKIAkJCQlBQUNGMTQ0RDBCRUMxRUYwMDA4Mjc5
ODIgLyogVGV4dEJyZWFrSXRlcmF0b3JJbnRlcm5hbElDVU1hYy5tbSBpbiBTb3VyY2VzICovLAog
CQkJCUE4RjRGQjk2MEMxNjlFODUwMDJBRkVENSAvKiBTVkdSZW5kZXJTdXBwb3J0LmNwcCBpbiBT
b3VyY2VzICovLAorCQkJCUFBMzFCNUI0MEMxREZEMTAwMEFFNzA4MyAvKiBSZW5kZXJTVkdSb290
LmNwcCBpbiBTb3VyY2VzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHBy
b2Nlc3NpbmcgPSAwOwogCQl9OwpJbmRleDogV2ViQ29yZS9rc3ZnMi9zdmcvU1ZHU1ZHRWxlbWVu
dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9rc3ZnMi9zdmcvU1ZHU1ZHRWxlbWVudC5jcHAJ
KHJldmlzaW9uIDIyMDk4KQorKysgV2ViQ29yZS9rc3ZnMi9zdmcvU1ZHU1ZHRWxlbWVudC5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlICJGcmFtZS5oIgogI2lu
Y2x1ZGUgIkhUTUxOYW1lcy5oIgogI2luY2x1ZGUgIlJlbmRlclNWR0NvbnRhaW5lci5oIgorI2lu
Y2x1ZGUgIlJlbmRlclNWR1Jvb3QuaCIKICNpbmNsdWRlICJTVkdBbmdsZS5oIgogI2luY2x1ZGUg
IlNWR0xlbmd0aC5oIgogI2luY2x1ZGUgIlNWR05hbWVzLmgiCkBAIC0zNTYsMTQgKzM1NywyMiBA
QCBBZmZpbmVUcmFuc2Zvcm0gU1ZHU1ZHRWxlbWVudDo6Z2V0U2NyZWVuCiAKIFJlbmRlck9iamVj
dCogU1ZHU1ZHRWxlbWVudDo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEqIGFyZW5hLCBSZW5k
ZXJTdHlsZSopCiB7Ci0gICAgUmVuZGVyU1ZHQ29udGFpbmVyKiByb290Q29udGFpbmVyID0gbmV3
IChhcmVuYSkgUmVuZGVyU1ZHQ29udGFpbmVyKHRoaXMpOwotCi0gICAgLy8gRklYTUU6IEFsbCB0
aGlzIHNldHVwIHNob3VsZCBiZSBkb25lIGFmdGVyIGF0dHJpYnV0ZXNDaGFuZ2VkLCBub3QgaGVy
ZS4KLSAgICByb290Q29udGFpbmVyLT5zZXRWaWV3Qm94KHZpZXdCb3goKSk7Ci0gICAgcm9vdENv
bnRhaW5lci0+c2V0QWxpZ24oS0NBbGlnbihwcmVzZXJ2ZUFzcGVjdFJhdGlvKCktPmFsaWduKCkg
LSAxKSk7Ci0gICAgcm9vdENvbnRhaW5lci0+c2V0U2xpY2UocHJlc2VydmVBc3BlY3RSYXRpbygp
LT5tZWV0T3JTbGljZSgpID09IFNWR1ByZXNlcnZlQXNwZWN0UmF0aW86OlNWR19NRUVUT1JTTElD
RV9TTElDRSk7Ci0gICAgCi0gICAgcmV0dXJuIHJvb3RDb250YWluZXI7CisgICAgaWYgKCFwYXJl
bnROb2RlKCktPmlzU1ZHRWxlbWVudCgpKSB7CisgICAgICAgIFJlbmRlclNWR1Jvb3QqIHJvb3RD
b250YWluZXIgPSBuZXcgKGFyZW5hKSBSZW5kZXJTVkdSb290KHRoaXMpOworICAgICAgICAvLyBG
SVhNRTogQWxsIHRoaXMgc2V0dXAgc2hvdWxkIGJlIGRvbmUgYWZ0ZXIgYXR0cmlidXRlc0NoYW5n
ZWQsIG5vdCBoZXJlLgorICAgICAgICByb290Q29udGFpbmVyLT5zZXRWaWV3Qm94KHZpZXdCb3go
KSk7CisgICAgICAgIHJvb3RDb250YWluZXItPnNldEFsaWduKFNWR1ByZXNlcnZlQXNwZWN0UmF0
aW86OlNWR1ByZXNlcnZlQXNwZWN0UmF0aW9UeXBlKHByZXNlcnZlQXNwZWN0UmF0aW8oKS0+YWxp
Z24oKSkpOworICAgICAgICByb290Q29udGFpbmVyLT5zZXRTbGljZShwcmVzZXJ2ZUFzcGVjdFJh
dGlvKCktPm1lZXRPclNsaWNlKCkgPT0gU1ZHUHJlc2VydmVBc3BlY3RSYXRpbzo6U1ZHX01FRVRP
UlNMSUNFX1NMSUNFKTsKKyAgICAgICAgcmV0dXJuIHJvb3RDb250YWluZXI7CisgICAgfSBlbHNl
ICB7CisgICAgICAgIFJlbmRlclNWR0NvbnRhaW5lciogcm9vdENvbnRhaW5lciA9IG5ldyAoYXJl
bmEpIFJlbmRlclNWR0NvbnRhaW5lcih0aGlzKTsKKworICAgICAgICAvLyBGSVhNRTogQWxsIHRo
aXMgc2V0dXAgc2hvdWxkIGJlIGRvbmUgYWZ0ZXIgYXR0cmlidXRlc0NoYW5nZWQsIG5vdCBoZXJl
LgorICAgICAgICByb290Q29udGFpbmVyLT5zZXRWaWV3Qm94KHZpZXdCb3goKSk7CisgICAgICAg
IHJvb3RDb250YWluZXItPnNldEFsaWduKEtDQWxpZ24ocHJlc2VydmVBc3BlY3RSYXRpbygpLT5h
bGlnbigpIC0gMSkpOworICAgICAgICByb290Q29udGFpbmVyLT5zZXRTbGljZShwcmVzZXJ2ZUFz
cGVjdFJhdGlvKCktPm1lZXRPclNsaWNlKCkgPT0gU1ZHUHJlc2VydmVBc3BlY3RSYXRpbzo6U1ZH
X01FRVRPUlNMSUNFX1NMSUNFKTsKKyAgICAgICAgcmV0dXJuIHJvb3RDb250YWluZXI7CisgICAg
fQogfQogCiB2b2lkIFNWR1NWR0VsZW1lbnQ6Omluc2VydGVkSW50b0RvY3VtZW50KCkKSW5kZXg6
IFdlYkNvcmUva3N2ZzIvc3ZnL1NWR1NWR0VsZW1lbnQuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L2tzdmcyL3N2Zy9TVkdTVkdFbGVtZW50LmgJKHJldmlzaW9uIDIyMDk4KQorKysgV2ViQ29yZS9r
c3ZnMi9zdmcvU1ZHU1ZHRWxlbWVudC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMjYsNiArMTI2LDcg
QEAgbmFtZXNwYWNlIFdlYkNvcmUKICAgICAgICAgdmlydHVhbCBjb25zdCBTVkdFbGVtZW50KiBj
b250ZXh0RWxlbWVudCgpIGNvbnN0IHsgcmV0dXJuIHRoaXM7IH0KIAogICAgICAgICBmcmllbmQg
Y2xhc3MgUmVuZGVyU1ZHQ29udGFpbmVyOworICAgICAgICBmcmllbmQgY2xhc3MgUmVuZGVyU1ZH
Um9vdDsKICAgICAgICAgdmlydHVhbCBib29sIGhhc1JlbGF0aXZlVmFsdWVzKCkgY29uc3Q7CiAK
ICAgICBwcml2YXRlOgpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyU1ZHQ29udGFpbmVy
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJTVkdDb250YWluZXIu
Y3BwCShyZXZpc2lvbiAyMjA5OCkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclNWR0NvbnRh
aW5lci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTc1LDcgKzc1LDcgQEAgdm9pZCBSZW5kZXJTVkdD
b250YWluZXI6OnNldExvY2FsVHJhbnNmbwogYm9vbCBSZW5kZXJTVkdDb250YWluZXI6OnJlcXVp
cmVzTGF5ZXIoKQogewogICAgIC8vIE9ubHkgYWxsb3cgYW4gPHN2Zz4gZWxlbWVudCB0byBnZW5l
cmF0ZSBhIGxheWVyIHdoZW4gaXQncyBwb3NpdGlvbmVkIGluIGEgbm9uLVNWRyBjb250ZXh0Ci0g
ICAgcmV0dXJuIChpc1Bvc2l0aW9uZWQoKSB8fCBpc1JlbFBvc2l0aW9uZWQoKSkgJiYgaXNPdXRl
cm1vc3RTVkcoKTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHNob3J0IFJlbmRlclNWR0NvbnRh
aW5lcjo6bGluZUhlaWdodChib29sIGIsIGJvb2wgaXNSb290TGluZUJveCkgY29uc3QKQEAgLTg4
LDEzICs4OCw2IEBAIHNob3J0IFJlbmRlclNWR0NvbnRhaW5lcjo6YmFzZWxpbmVQb3NpdGkKICAg
ICByZXR1cm4gaGVpZ2h0KCkgKyBtYXJnaW5Ub3AoKSArIG1hcmdpbkJvdHRvbSgpOwogfQogCi0v
LyBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdGVtcG9yYXJ5IHVudGlsIGEgUmVuZGVyU1ZHUm9vdCBj
bGFzcyBjYW4gYmUgbWFkZQotLy8gaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MTIyMDcKLWJvb2wgUmVuZGVyU1ZHQ29udGFpbmVyOjppc091dGVybW9zdFNWRygpIGNvbnN0
Ci17Ci0gICAgcmV0dXJuIHBhcmVudCgpICYmICFwYXJlbnQoKS0+aXNTVkdDb250YWluZXIoKTsK
LX0KLQogdm9pZCBSZW5kZXJTVkdDb250YWluZXI6OmxheW91dCgpCiB7CiAgICAgQVNTRVJUKG5l
ZWRzTGF5b3V0KCkpOwpAQCAtMTI3LDExICsxMjAsNiBAQCB2b2lkIFJlbmRlclNWR0NvbnRhaW5l
cjo6bGF5b3V0KCkKICAgICBjYWxjSGVpZ2h0KCk7CiAKICAgICBtX2Fic29sdXRlQm91bmRzID0g
YWJzb2x1dGVDbGlwcGVkT3ZlcmZsb3dSZWN0KCk7Ci0gICAgaWYgKGlzT3V0ZXJtb3N0U1ZHKCkp
IHsKLSAgICAgICAgU1ZHU1ZHRWxlbWVudCogc3ZnID0gc3RhdGljX2Nhc3Q8U1ZHU1ZHRWxlbWVu
dCo+KGVsZW1lbnQoKSk7Ci0gICAgICAgIG1fd2lkdGggPSBtX3dpZHRoICogc3ZnLT5jdXJyZW50
U2NhbGUoKTsKLSAgICAgICAgbV9oZWlnaHQgPSBtX2hlaWdodCAqIHN2Zy0+Y3VycmVudFNjYWxl
KCk7Ci0gICAgfQogCiAgICAgaWYgKHNlbGZOZWVkc0xheW91dCgpICYmIGNoZWNrRm9yUmVwYWlu
dCkKICAgICAgICAgcmVwYWludEFmdGVyTGF5b3V0SWZOZWVkZWQob2xkQm91bmRzLCBvbGRPdXRs
aW5lQm94KTsKQEAgLTE0MiwyOCArMTMwLDEyIEBAIHZvaWQgUmVuZGVyU1ZHQ29udGFpbmVyOjps
YXlvdXQoKQogCiB2b2lkIFJlbmRlclNWR0NvbnRhaW5lcjo6YXBwbHlDb250ZW50VHJhbnNmb3Jt
cyhQYWludEluZm8mIHBhaW50SW5mbywgaW50JiBwYXJlbnRYLCBpbnQmIHBhcmVudFkpCiB7Ci0g
ICAgaWYgKGlzT3V0ZXJtb3N0U1ZHKCkpIHsKLSAgICAgICAgLy8gVHJhbnNsYXRlIGZyb20gcGFy
ZW50IG9mZnNldHMgKGh0bWwgcmVuZGVyZXJzKSB0byBhIHJlbGF0aXZlIHRyYW5zZm9ybSAoc3Zn
IHJlbmRlcmVycykKLSAgICAgICAgSW50UG9pbnQgb3JpZ2luOwotICAgICAgICBvcmlnaW4ubW92
ZShwYXJlbnRYLCBwYXJlbnRZKTsKLSAgICAgICAgb3JpZ2luLm1vdmUobV94LCBtX3kpOwotICAg
ICAgICBvcmlnaW4ubW92ZShib3JkZXJMZWZ0KCksIGJvcmRlclRvcCgpKTsKLSAgICAgICAgb3Jp
Z2luLm1vdmUocGFkZGluZ0xlZnQoKSwgcGFkZGluZ1RvcCgpKTsKLSAgICAgICAgaWYgKG9yaWdp
bi54KCkgfHwgb3JpZ2luLnkoKSkgewotICAgICAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPmNv
bmNhdENUTShBZmZpbmVUcmFuc2Zvcm0oKS50cmFuc2xhdGUob3JpZ2luLngoKSwgb3JpZ2luLnko
KSkpOwotICAgICAgICAgICAgcGFpbnRJbmZvLnJlY3QubW92ZSgtb3JpZ2luLngoKSwgLW9yaWdp
bi55KCkpOwotICAgICAgICB9Ci0gICAgICAgIHBhcmVudFggPSBwYXJlbnRZID0gMDsKLSAgICAg
ICAgU1ZHU1ZHRWxlbWVudCogc3ZnID0gc3RhdGljX2Nhc3Q8U1ZHU1ZHRWxlbWVudCo+KGVsZW1l
bnQoKSk7Ci0gICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5jb25jYXRDVE0oQWZmaW5lVHJhbnNm
b3JtKCkuc2NhbGUoc3ZnLT5jdXJyZW50U2NhbGUoKSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAg
IC8vIE9ubHkgdGhlIHJvb3QgPHN2Zz4gZWxlbWVudCBzaG91bGQgbmVlZCBhbnkgdHJhbnNsYXRp
b25zIHVzaW5nIHRoZSBIVE1ML0NTUyBzeXN0ZW0KLSAgICAgICAgLy8gcGFyZW50WCwgcGFyZW50
WSBhcmUgYWxzbyBub24temVybyBmb3IgZmlyc3QtbGV2ZWwga2lkcyBvZiB0aGVzZQotICAgICAg
ICAvLyBDU1MtdHJhbnNmb3JtZWQgPHN2Zz4gcm9vdC1lbGVtZW50cyAoZHVlIHRvIFJlbmRlckJv
eDo6cGFpbnQpIGZvciBhbnkgb3RoZXIgZWxlbWVudAotICAgICAgICAvLyB0aGV5IHNob3VsZCBi
ZSAwLiAgIG1feCwgbV95IHNob3VsZCBhbHdheXMgYmUgMCBmb3Igbm9uLXJvb3Qgc3ZnIGNvbnRh
aW5lcnMKLSAgICAgICAgQVNTRVJUKG1feCA9PSAwKTsKLSAgICAgICAgQVNTRVJUKG1feSA9PSAw
KTsKLSAgICB9CisgICAgLy8gT25seSB0aGUgcm9vdCA8c3ZnPiBlbGVtZW50IHNob3VsZCBuZWVk
IGFueSB0cmFuc2xhdGlvbnMgdXNpbmcgdGhlIEhUTUwvQ1NTIHN5c3RlbQorICAgIC8vIHBhcmVu
dFgsIHBhcmVudFkgYXJlIGFsc28gbm9uLXplcm8gZm9yIGZpcnN0LWxldmVsIGtpZHMgb2YgdGhl
c2UKKyAgICAvLyBDU1MtdHJhbnNmb3JtZWQgPHN2Zz4gcm9vdC1lbGVtZW50cyAoZHVlIHRvIFJl
bmRlckJveDo6cGFpbnQpIGZvciBhbnkgb3RoZXIgZWxlbWVudAorICAgIC8vIHRoZXkgc2hvdWxk
IGJlIDAuICAgbV94LCBtX3kgc2hvdWxkIGFsd2F5cyBiZSAwIGZvciBub24tcm9vdCBzdmcgY29u
dGFpbmVycworICAgIEFTU0VSVChtX3ggPT0gMCk7CisgICAgQVNTRVJUKG1feSA9PSAwKTsKICAg
ICAKICAgICBpZiAoIXZpZXdwb3J0KCkuaXNFbXB0eSgpKSB7CiAgICAgICAgIGlmIChzdHlsZSgp
LT5vdmVyZmxvd1goKSAhPSBPVklTSUJMRSkKQEAgLTE3MywxMCArMTQ1LDYgQEAgdm9pZCBSZW5k
ZXJTVkdDb250YWluZXI6OmFwcGx5Q29udGVudFRyYQogICAgIH0KICAgICBpZiAoIWxvY2FsVHJh
bnNmb3JtKCkuaXNJZGVudGl0eSgpKQogICAgICAgICBwYWludEluZm8uY29udGV4dC0+Y29uY2F0
Q1RNKGxvY2FsVHJhbnNmb3JtKCkpOwotICAgIGlmIChpc091dGVybW9zdFNWRygpKSB7Ci0gICAg
ICAgIFNWR1NWR0VsZW1lbnQqIHN2ZyA9IHN0YXRpY19jYXN0PFNWR1NWR0VsZW1lbnQqPihlbGVt
ZW50KCkpOwotICAgICAgICBwYWludEluZm8uY29udGV4dC0+Y29uY2F0Q1RNKEFmZmluZVRyYW5z
Zm9ybSgpLnRyYW5zbGF0ZShzdmctPmN1cnJlbnRUcmFuc2xhdGUoKS54KCksIHN2Zy0+Y3VycmVu
dFRyYW5zbGF0ZSgpLnkoKSkpOwotICAgIH0KIH0KIAogdm9pZCBSZW5kZXJTVkdDb250YWluZXI6
OnBhaW50KFBhaW50SW5mbyYgcGFpbnRJbmZvLCBpbnQgcGFyZW50WCwgaW50IHBhcmVudFkpCkBA
IC0xODQsMTAgKzE1Miw2IEBAIHZvaWQgUmVuZGVyU1ZHQ29udGFpbmVyOjpwYWludChQYWludElu
Zm8KICAgICBpZiAocGFpbnRJbmZvLmNvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQoKSB8fCAhZHJh
d3NDb250ZW50cygpKQogICAgICAgICByZXR1cm47CiAKLSAgICAvLyBUaGlzIHNob3VsZCBvbmx5
IGV4aXN0IGZvciA8c3ZnPiByZW5kZXJlcnMKLSAgICBpZiAoaXNPdXRlcm1vc3RTVkcoKSAmJiBo
YXNCb3hEZWNvcmF0aW9ucygpICYmIChwYWludEluZm8ucGhhc2UgPT0gUGFpbnRQaGFzZUZvcmVn
cm91bmQgfHwgcGFpbnRJbmZvLnBoYXNlID09IFBhaW50UGhhc2VTZWxlY3Rpb24pKSAKLSAgICAg
ICAgcGFpbnRCb3hEZWNvcmF0aW9ucyhwYWludEluZm8sIG1feCArIHBhcmVudFgsIG1feSArIHBh
cmVudFkpOwotCiAgICAgaWYgKCFmaXJzdENoaWxkKCkpIHsKICNpZiBFTkFCTEUoU1ZHX0VYUEVS
SU1FTlRBTF9GRUFUVVJFUykKICAgICAgICAgLy8gU3BlYzogZ3JvdXBzIHcvbyBjaGlsZHJlbiBz
dGlsbCBtYXkgcmVuZGVyIGZpbHRlciBjb250ZW50LgpAQCAtMzAwLDEzICsyNjQsOCBAQCBBZmZp
bmVUcmFuc2Zvcm0gUmVuZGVyU1ZHQ29udGFpbmVyOjp2aWV3CiAgICAgLy8gRklYTUU6IFRoZSBt
ZXRob2QgbmFtZSBpcyBjb25mdXNpbmcsIHNpbmNlIGl0IGRvZXMgbm90CiAgICAgLy8gZG8gdmll
d3BvcnQgdHJhbnNsYXRpbmcgYW55bW9yZS4gTG9vayBpbnRvIHRoaXMgd2hpbGUKICAgICAvLyAg
Zml4aW5nIGJ1ZyAxMjIwNy4KLSAgICBpZiAoIXZpZXdCb3goKS5pc0VtcHR5KCkpIHsKLSAgICAg
ICAgRmxvYXRSZWN0IHZpZXdwb3J0UmVjdCA9IHZpZXdwb3J0KCk7Ci0gICAgICAgIGlmIChpc091
dGVybW9zdFNWRygpKQotICAgICAgICAgICAgdmlld3BvcnRSZWN0ID0gRmxvYXRSZWN0KHZpZXdw
b3J0KCkueCgpLCB2aWV3cG9ydCgpLnkoKSwgd2lkdGgoKSwgaGVpZ2h0KCkpOwotCi0gICAgICAg
IHJldHVybiBnZXRBc3BlY3RSYXRpbyh2aWV3Qm94KCksIHZpZXdwb3J0UmVjdCk7Ci0gICAgfQor
ICAgIGlmICghdmlld0JveCgpLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGdldEFzcGVjdFJh
dGlvKHZpZXdCb3goKSwgdmlld3BvcnQoKSk7CiAKICAgICByZXR1cm4gQWZmaW5lVHJhbnNmb3Jt
KCk7CiB9CkBAIC0zNDEsMTEgKzMwMCw2IEBAIHZvaWQgUmVuZGVyU1ZHQ29udGFpbmVyOjphYnNv
bHV0ZVJlY3RzKFYKIEFmZmluZVRyYW5zZm9ybSBSZW5kZXJTVkdDb250YWluZXI6OmFic29sdXRl
VHJhbnNmb3JtKCkgY29uc3QKIHsKICAgICBBZmZpbmVUcmFuc2Zvcm0gY3RtID0gUmVuZGVyQ29u
dGFpbmVyOjphYnNvbHV0ZVRyYW5zZm9ybSgpOwotICAgIGlmIChpc091dGVybW9zdFNWRygpKSB7
Ci0gICAgICAgIFNWR1NWR0VsZW1lbnQqIHN2ZyA9IHN0YXRpY19jYXN0PFNWR1NWR0VsZW1lbnQq
PihlbGVtZW50KCkpOwotICAgICAgICBjdG0uc2NhbGUoc3ZnLT5jdXJyZW50U2NhbGUoKSk7Ci0g
ICAgICAgIGN0bS50cmFuc2xhdGUoc3ZnLT5jdXJyZW50VHJhbnNsYXRlKCkueCgpLCBzdmctPmN1
cnJlbnRUcmFuc2xhdGUoKS55KCkpOwotICAgIH0KICAgICBjdG0udHJhbnNsYXRlKHZpZXdwb3J0
KCkueCgpLCB2aWV3cG9ydCgpLnkoKSk7CiAgICAgcmV0dXJuIHZpZXdwb3J0VHJhbnNmb3JtKCkg
KiBjdG07CiB9CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJTVkdDb250YWluZXIuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJTVkdDb250YWluZXIuaAkocmV2
aXNpb24gMjIwOTgpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJTVkdDb250YWluZXIuaAko
d29ya2luZyBjb3B5KQpAQCAtOTQsOCArOTQsNiBAQCBwdWJsaWM6CiAgICAgCiAgICAgdmlydHVh
bCBib29sIG5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYs
IGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24pOwogICAgIAotICAg
IGJvb2wgaXNPdXRlcm1vc3RTVkcoKSBjb25zdDsKLQogcHJpdmF0ZToKICAgICB2b2lkIGNhbGNW
aWV3cG9ydCgpOyAKICAgICBBZmZpbmVUcmFuc2Zvcm0gZ2V0QXNwZWN0UmF0aW8oY29uc3QgRmxv
YXRSZWN0JiBsb2dpY2FsLCBjb25zdCBGbG9hdFJlY3QmIHBoeXNpY2FsKSBjb25zdDsKSW5kZXg6
IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclNWR1Jvb3QuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlclNWR1Jvb3QuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyU1ZHUm9vdC5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNDQ2IEBA
CisvKgorICAgIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNyBOaWtvbGFzIFppbW1lcm1h
bm4gPHppbW1lcm1hbm5Aa2RlLm9yZz4KKyAgICAgICAgICAgICAgICAgIDIwMDQsIDIwMDUsIDIw
MDcgUm9iIEJ1aXMgPGJ1aXNAa2RlLm9yZz4KKyAgICAgICAgICAgICAgICAgIDIwMDcgRXJpYyBT
ZWlkZWwgPGVyaWNAd2Via2l0Lm9yZz4KKworICAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBL
REUgcHJvamVjdAorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQg
YnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisg
ICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi
ZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQor
ICAgIGFpbnQgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElm
IG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1
OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBV
U0EuCisqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoU1ZHKQorI2luY2x1
ZGUgIlJlbmRlclNWR1Jvb3QuaCIKKworI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2lu
Y2x1ZGUgIlJlbmRlclZpZXcuaCIKKyNpbmNsdWRlICJTVkdMZW5ndGguaCIKKyNpbmNsdWRlICJT
VkdNYXJrZXJFbGVtZW50LmgiCisjaW5jbHVkZSAiU1ZHUmVuZGVyU3VwcG9ydC5oIgorI2luY2x1
ZGUgIlNWR1Jlc291cmNlQ2xpcHBlci5oIgorI2luY2x1ZGUgIlNWR1Jlc291cmNlRmlsdGVyLmgi
CisjaW5jbHVkZSAiU1ZHUmVzb3VyY2VNYXNrZXIuaCIKKyNpbmNsdWRlICJTVkdTVkdFbGVtZW50
LmgiCisjaW5jbHVkZSAiU1ZHU3R5bGVkRWxlbWVudC5oIgorI2luY2x1ZGUgIlNWR1VSSVJlZmVy
ZW5jZS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1JlbmRlclNWR1Jvb3Q6OlJlbmRlclNW
R1Jvb3QoU1ZHU3R5bGVkRWxlbWVudCogbm9kZSkKKyAgICA6IFJlbmRlckNvbnRhaW5lcihub2Rl
KQorICAgICwgbV9zbGljZShmYWxzZSkKK3sKKyAgICBzZXRSZXBsYWNlZCh0cnVlKTsKK30KKwor
UmVuZGVyU1ZHUm9vdDo6flJlbmRlclNWR1Jvb3QoKQoreworfQorCitBZmZpbmVUcmFuc2Zvcm0g
UmVuZGVyU1ZHUm9vdDo6bG9jYWxUcmFuc2Zvcm0oKSBjb25zdAoreworICAgIHJldHVybiBtX21h
dHJpeDsKK30KKwordm9pZCBSZW5kZXJTVkdSb290OjpzZXRMb2NhbFRyYW5zZm9ybShjb25zdCBB
ZmZpbmVUcmFuc2Zvcm0mIG1hdHJpeCkKK3sKKyAgICBtX21hdHJpeCA9IG1hdHJpeDsKK30KKwor
Ym9vbCBSZW5kZXJTVkdSb290OjpyZXF1aXJlc0xheWVyKCkKK3sKKyAgICAvLyBPbmx5IGFsbG93
IGFuIDxzdmc+IGVsZW1lbnQgdG8gZ2VuZXJhdGUgYSBsYXllciB3aGVuIGl0J3MgcG9zaXRpb25l
ZCBpbiBhIG5vbi1TVkcgY29udGV4dAorICAgIHJldHVybiBmYWxzZTsKK30KKworc2hvcnQgUmVu
ZGVyU1ZHUm9vdDo6bGluZUhlaWdodChib29sIGIsIGJvb2wgaXNSb290TGluZUJveCkgY29uc3QK
K3sKKyAgICByZXR1cm4gaGVpZ2h0KCkgKyBtYXJnaW5Ub3AoKSArIG1hcmdpbkJvdHRvbSgpOwor
fQorCitzaG9ydCBSZW5kZXJTVkdSb290OjpiYXNlbGluZVBvc2l0aW9uKGJvb2wgYiwgYm9vbCBp
c1Jvb3RMaW5lQm94KSBjb25zdAoreworICAgIHJldHVybiBoZWlnaHQoKSArIG1hcmdpblRvcCgp
ICsgbWFyZ2luQm90dG9tKCk7Cit9CisKK3ZvaWQgUmVuZGVyU1ZHUm9vdDo6bGF5b3V0KCkKK3sK
KyAgICBBU1NFUlQobmVlZHNMYXlvdXQoKSk7CisKKyAgICBjYWxjVmlld3BvcnQoKTsKKworICAg
IC8vIEFyYml0cmFyeSBhZmZpbmUgdHJhbnNmb3JtcyBhcmUgaW5jb21wYXRpYmxlIHdpdGggTGF5
b3V0U3RhdGUuCisgICAgdmlldygpLT5kaXNhYmxlTGF5b3V0U3RhdGUoKTsKKworICAgIEludFJl
Y3Qgb2xkQm91bmRzOworICAgIEludFJlY3Qgb2xkT3V0bGluZUJveDsKKyAgICBib29sIGNoZWNr
Rm9yUmVwYWludCA9IGNoZWNrRm9yUmVwYWludER1cmluZ0xheW91dCgpOworICAgIGlmIChzZWxm
TmVlZHNMYXlvdXQoKSAmJiBjaGVja0ZvclJlcGFpbnQpIHsKKyAgICAgICAgb2xkQm91bmRzID0g
bV9hYnNvbHV0ZUJvdW5kczsKKyAgICAgICAgb2xkT3V0bGluZUJveCA9IGFic29sdXRlT3V0bGlu
ZUJveCgpOworICAgIH0KKworICAgIFJlbmRlck9iamVjdCogY2hpbGQgPSBmaXJzdENoaWxkKCk7
CisgICAgd2hpbGUgKGNoaWxkKSB7CisgICAgICAgIC8vIEZJWE1FOiBUaGlzIGNoZWNrIGlzIGJv
Z3VzLCBzZWUgaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQwMDMKKyAg
ICAgICAgaWYgKCFjaGlsZC0+aXNSZW5kZXJQYXRoKCkgfHwgc3RhdGljX2Nhc3Q8UmVuZGVyUGF0
aCo+KGNoaWxkKS0+aGFzUmVsYXRpdmVWYWx1ZXMoKSkKKyAgICAgICAgICAgIGNoaWxkLT5zZXRO
ZWVkc0xheW91dCh0cnVlKTsKKworICAgICAgICBjaGlsZC0+bGF5b3V0SWZOZWVkZWQoKTsKKyAg
ICAgICAgQVNTRVJUKCFjaGlsZC0+bmVlZHNMYXlvdXQoKSk7CisgICAgICAgIGNoaWxkID0gY2hp
bGQtPm5leHRTaWJsaW5nKCk7CisgICAgfQorCisgICAgY2FsY1dpZHRoKCk7CisgICAgY2FsY0hl
aWdodCgpOworCisgICAgbV9hYnNvbHV0ZUJvdW5kcyA9IGFic29sdXRlQ2xpcHBlZE92ZXJmbG93
UmVjdCgpOworICAgIFNWR1NWR0VsZW1lbnQqIHN2ZyA9IHN0YXRpY19jYXN0PFNWR1NWR0VsZW1l
bnQqPihlbGVtZW50KCkpOworICAgIG1fd2lkdGggPSBtX3dpZHRoICogc3ZnLT5jdXJyZW50U2Nh
bGUoKTsKKyAgICBtX2hlaWdodCA9IG1faGVpZ2h0ICogc3ZnLT5jdXJyZW50U2NhbGUoKTsKKwor
ICAgIGlmIChzZWxmTmVlZHNMYXlvdXQoKSAmJiBjaGVja0ZvclJlcGFpbnQpCisgICAgICAgIHJl
cGFpbnRBZnRlckxheW91dElmTmVlZGVkKG9sZEJvdW5kcywgb2xkT3V0bGluZUJveCk7CisKKyAg
ICB2aWV3KCktPmVuYWJsZUxheW91dFN0YXRlKCk7CisgICAgc2V0TmVlZHNMYXlvdXQoZmFsc2Up
OworfQorCit2b2lkIFJlbmRlclNWR1Jvb3Q6OmFwcGx5Q29udGVudFRyYW5zZm9ybXMoUGFpbnRJ
bmZvJiBwYWludEluZm8sIGludCYgcGFyZW50WCwgaW50JiBwYXJlbnRZKQoreworICAgIC8vIFRy
YW5zbGF0ZSBmcm9tIHBhcmVudCBvZmZzZXRzIChodG1sIHJlbmRlcmVycykgdG8gYSByZWxhdGl2
ZSB0cmFuc2Zvcm0gKHN2ZyByZW5kZXJlcnMpCisgICAgSW50UG9pbnQgb3JpZ2luOworICAgIG9y
aWdpbi5tb3ZlKHBhcmVudFgsIHBhcmVudFkpOworICAgIG9yaWdpbi5tb3ZlKG1feCwgbV95KTsK
KyAgICBvcmlnaW4ubW92ZShib3JkZXJMZWZ0KCksIGJvcmRlclRvcCgpKTsKKyAgICBvcmlnaW4u
bW92ZShwYWRkaW5nTGVmdCgpLCBwYWRkaW5nVG9wKCkpOworICAgIGlmIChvcmlnaW4ueCgpIHx8
IG9yaWdpbi55KCkpIHsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPmNvbmNhdENUTShBZmZp
bmVUcmFuc2Zvcm0oKS50cmFuc2xhdGUob3JpZ2luLngoKSwgb3JpZ2luLnkoKSkpOworICAgICAg
ICBwYWludEluZm8ucmVjdC5tb3ZlKC1vcmlnaW4ueCgpLCAtb3JpZ2luLnkoKSk7CisgICAgfQor
ICAgIHBhcmVudFggPSBwYXJlbnRZID0gMDsKKyAgICBTVkdTVkdFbGVtZW50KiBzdmcgPSBzdGF0
aWNfY2FzdDxTVkdTVkdFbGVtZW50Kj4oZWxlbWVudCgpKTsKKyAgICBwYWludEluZm8uY29udGV4
dC0+Y29uY2F0Q1RNKEFmZmluZVRyYW5zZm9ybSgpLnNjYWxlKHN2Zy0+Y3VycmVudFNjYWxlKCkp
KTsKKyAgICAKKyAgICBpZiAoIXZpZXdwb3J0KCkuaXNFbXB0eSgpKSB7CisgICAgICAgIGlmIChz
dHlsZSgpLT5vdmVyZmxvd1goKSAhPSBPVklTSUJMRSkKKyAgICAgICAgICAgIHBhaW50SW5mby5j
b250ZXh0LT5jbGlwKGVuY2xvc2luZ0ludFJlY3Qodmlld3BvcnQoKSkpOyAvLyBGSVhNRTogRXZl
bnR1YWxseSB3ZSdsbCB3YW50IGZsb2F0LXByZWNpc2lvbiBjbGlwcGluZworICAgICAgICAKKyAg
ICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPmNvbmNhdENUTShBZmZpbmVUcmFuc2Zvcm0oKS50cmFu
c2xhdGUodmlld3BvcnQoKS54KCksIHZpZXdwb3J0KCkueSgpKSk7CisgICAgfQorICAgIGlmICgh
bG9jYWxUcmFuc2Zvcm0oKS5pc0lkZW50aXR5KCkpCisgICAgICAgIHBhaW50SW5mby5jb250ZXh0
LT5jb25jYXRDVE0obG9jYWxUcmFuc2Zvcm0oKSk7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPmNv
bmNhdENUTShBZmZpbmVUcmFuc2Zvcm0oKS50cmFuc2xhdGUoc3ZnLT5jdXJyZW50VHJhbnNsYXRl
KCkueCgpLCBzdmctPmN1cnJlbnRUcmFuc2xhdGUoKS55KCkpKTsKK30KKwordm9pZCBSZW5kZXJT
VkdSb290OjpwYWludChQYWludEluZm8mIHBhaW50SW5mbywgaW50IHBhcmVudFgsIGludCBwYXJl
bnRZKQoreworICAgIGlmIChwYWludEluZm8uY29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICAvLyBUaGlzIHNob3VsZCBvbmx5IGV4aXN0IGZvciA8c3Zn
PiByZW5kZXJlcnMKKyAgICBpZiAoaGFzQm94RGVjb3JhdGlvbnMoKSAmJiAocGFpbnRJbmZvLnBo
YXNlID09IFBhaW50UGhhc2VGb3JlZ3JvdW5kIHx8IHBhaW50SW5mby5waGFzZSA9PSBQYWludFBo
YXNlU2VsZWN0aW9uKSkgCisgICAgICAgIHBhaW50Qm94RGVjb3JhdGlvbnMocGFpbnRJbmZvLCBt
X3ggKyBwYXJlbnRYLCBtX3kgKyBwYXJlbnRZKTsKKworICAgIGlmICghZmlyc3RDaGlsZCgpKSB7
CisjaWYgRU5BQkxFKFNWR19FWFBFUklNRU5UQUxfRkVBVFVSRVMpCisgICAgICAgIC8vIFNwZWM6
IGdyb3VwcyB3L28gY2hpbGRyZW4gc3RpbGwgbWF5IHJlbmRlciBmaWx0ZXIgY29udGVudC4KKyAg
ICAgICAgY29uc3QgU1ZHUmVuZGVyU3R5bGUqIHN2Z1N0eWxlID0gc3R5bGUoKS0+c3ZnU3R5bGUo
KTsKKyAgICAgICAgQXRvbWljU3RyaW5nIGZpbHRlcklkKFNWR1VSSVJlZmVyZW5jZTo6Z2V0VGFy
Z2V0KHN2Z1N0eWxlLT5maWx0ZXIoKSkpOworICAgICAgICBTVkdSZXNvdXJjZUZpbHRlciogZmls
dGVyID0gZ2V0RmlsdGVyQnlJZChkb2N1bWVudCgpLCBmaWx0ZXJJZCk7CisgICAgICAgIGlmICgh
ZmlsdGVyKQorI2VuZGlmCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIHBh
aW50SW5mby5jb250ZXh0LT5zYXZlKCk7CisgICAgCisgICAgYXBwbHlDb250ZW50VHJhbnNmb3Jt
cyhwYWludEluZm8sIHBhcmVudFgsIHBhcmVudFkpOworCisjaWYgRU5BQkxFKFNWR19FWFBFUklN
RU5UQUxfRkVBVFVSRVMpCisgICAgU1ZHUmVzb3VyY2VGaWx0ZXIqIGZpbHRlciA9IDA7CisjZWxz
ZQorICAgIHZvaWQqIGZpbHRlciA9IDA7CisjZW5kaWYKKyAgICBGbG9hdFJlY3QgYm91bmRpbmdC
b3ggPSByZWxhdGl2ZUJCb3godHJ1ZSk7CisgICAgZmxvYXQgb3BhY2l0eSA9IHN0eWxlKCktPm9w
YWNpdHkoKTsKKyAgICBpZiAocGFpbnRJbmZvLnBoYXNlID09IFBhaW50UGhhc2VGb3JlZ3JvdW5k
KSB7CisgICAgICAgIHByZXBhcmVUb1JlbmRlclNWR0NvbnRlbnQodGhpcywgcGFpbnRJbmZvLCBi
b3VuZGluZ0JveCwgZmlsdGVyKTsKKyAgICAgICAgCisgICAgICAgIGlmIChvcGFjaXR5IDwgMS4w
ZikgeworICAgICAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPmNsaXAoZW5jbG9zaW5nSW50UmVj
dChib3VuZGluZ0JveCkpOworICAgICAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPmJlZ2luVHJh
bnNwYXJlbmN5TGF5ZXIob3BhY2l0eSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXZp
ZXdCb3goKS5pc0VtcHR5KCkpCisgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5jb25jYXRDVE0o
dmlld3BvcnRUcmFuc2Zvcm0oKSk7CisKKyAgICBSZW5kZXJDb250YWluZXI6OnBhaW50KHBhaW50
SW5mbywgMCwgMCk7CisKKyAgICBpZiAocGFpbnRJbmZvLnBoYXNlID09IFBhaW50UGhhc2VGb3Jl
Z3JvdW5kKSB7CisjaWYgRU5BQkxFKFNWR19FWFBFUklNRU5UQUxfRkVBVFVSRVMpCisgICAgICAg
IGlmIChmaWx0ZXIpCisgICAgICAgICAgICBmaWx0ZXItPmFwcGx5RmlsdGVyKHBhaW50SW5mby5j
b250ZXh0LCBib3VuZGluZ0JveCk7CisjZW5kaWYKKworICAgICAgICBpZiAob3BhY2l0eSA8IDEu
MGYpCisgICAgICAgICAgICBwYWludEluZm8uY29udGV4dC0+ZW5kVHJhbnNwYXJlbmN5TGF5ZXIo
KTsKKyAgICB9CisKKyAgICBwYWludEluZm8uY29udGV4dC0+cmVzdG9yZSgpOworICAgIAorICAg
IGlmICgocGFpbnRJbmZvLnBoYXNlID09IFBhaW50UGhhc2VPdXRsaW5lIHx8IHBhaW50SW5mby5w
aGFzZSA9PSBQYWludFBoYXNlU2VsZk91dGxpbmUpICYmIHN0eWxlKCktPm91dGxpbmVXaWR0aCgp
ICYmIHN0eWxlKCktPnZpc2liaWxpdHkoKSA9PSBWSVNJQkxFKQorICAgICAgICBwYWludE91dGxp
bmUocGFpbnRJbmZvLmNvbnRleHQsIG1fYWJzb2x1dGVCb3VuZHMueCgpLCBtX2Fic29sdXRlQm91
bmRzLnkoKSwgbV9hYnNvbHV0ZUJvdW5kcy53aWR0aCgpLCBtX2Fic29sdXRlQm91bmRzLmhlaWdo
dCgpLCBzdHlsZSgpKTsKK30KKworRmxvYXRSZWN0IFJlbmRlclNWR1Jvb3Q6OnZpZXdwb3J0KCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gbV92aWV3cG9ydDsKK30KKwordm9pZCBSZW5kZXJTVkdSb290
OjpjYWxjVmlld3BvcnQoKQoreworICAgIFNWR0VsZW1lbnQqIHN2Z2VsZW0gPSBzdGF0aWNfY2Fz
dDxTVkdFbGVtZW50Kj4oZWxlbWVudCgpKTsKKyAgICBpZiAoc3ZnZWxlbS0+aGFzVGFnTmFtZShT
VkdOYW1lczo6c3ZnVGFnKSkgeworICAgICAgICBTVkdTVkdFbGVtZW50KiBzdmcgPSBzdGF0aWNf
Y2FzdDxTVkdTVkdFbGVtZW50Kj4oZWxlbWVudCgpKTsKKworICAgICAgICBpZiAoIXNlbGZOZWVk
c0xheW91dCgpICYmICFzdmctPmhhc1JlbGF0aXZlVmFsdWVzKCkpCisgICAgICAgICAgICByZXR1
cm47CisKKyAgICAgICAgZG91YmxlIHggPSBzdmctPngoKS52YWx1ZSgpOworICAgICAgICBkb3Vi
bGUgeSA9IHN2Zy0+eSgpLnZhbHVlKCk7CisgICAgICAgIGRvdWJsZSB3ID0gc3ZnLT53aWR0aCgp
LnZhbHVlKCk7CisgICAgICAgIGRvdWJsZSBoID0gc3ZnLT5oZWlnaHQoKS52YWx1ZSgpOworICAg
ICAgICBtX3ZpZXdwb3J0ID0gRmxvYXRSZWN0KHgsIHksIHcsIGgpOworICAgIH0gZWxzZSBpZiAo
c3ZnZWxlbS0+aGFzVGFnTmFtZShTVkdOYW1lczo6bWFya2VyVGFnKSkgeworICAgICAgICBpZiAo
IXNlbGZOZWVkc0xheW91dCgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIFNWR01h
cmtlckVsZW1lbnQqIHN2ZyA9IHN0YXRpY19jYXN0PFNWR01hcmtlckVsZW1lbnQqPihlbGVtZW50
KCkpOworICAgICAgICBkb3VibGUgdyA9IHN2Zy0+bWFya2VyV2lkdGgoKS52YWx1ZSgpOworICAg
ICAgICBkb3VibGUgaCA9IHN2Zy0+bWFya2VySGVpZ2h0KCkudmFsdWUoKTsKKyAgICAgICAgbV92
aWV3cG9ydCA9IEZsb2F0UmVjdCgwLCAwLCB3LCBoKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVuZGVy
U1ZHUm9vdDo6c2V0Vmlld0JveChjb25zdCBGbG9hdFJlY3QmIHZpZXdCb3gpCit7CisgICAgbV92
aWV3Qm94ID0gdmlld0JveDsKKworICAgIGlmIChzdHlsZSgpKQorICAgICAgICBzZXROZWVkc0xh
eW91dCh0cnVlKTsKK30KKworRmxvYXRSZWN0IFJlbmRlclNWR1Jvb3Q6OnZpZXdCb3goKSBjb25z
dAoreworICAgIHJldHVybiBtX3ZpZXdCb3g7Cit9CisKK3ZvaWQgUmVuZGVyU1ZHUm9vdDo6c2V0
QWxpZ24oU1ZHUHJlc2VydmVBc3BlY3RSYXRpbzo6U1ZHUHJlc2VydmVBc3BlY3RSYXRpb1R5cGUg
YWxpZ24pCit7CisgICAgbV9hbGlnbiA9IGFsaWduOworICAgIGlmIChzdHlsZSgpKQorICAgICAg
ICBzZXROZWVkc0xheW91dCh0cnVlKTsKK30KKworU1ZHUHJlc2VydmVBc3BlY3RSYXRpbzo6U1ZH
UHJlc2VydmVBc3BlY3RSYXRpb1R5cGUgUmVuZGVyU1ZHUm9vdDo6YWxpZ24oKSBjb25zdAorewor
ICAgIHJldHVybiBtX2FsaWduOworfQorCitBZmZpbmVUcmFuc2Zvcm0gUmVuZGVyU1ZHUm9vdDo6
dmlld3BvcnRUcmFuc2Zvcm0oKSBjb25zdAoreworICAgIC8vIEZJWE1FOiBUaGUgbWV0aG9kIG5h
bWUgaXMgY29uZnVzaW5nLCBzaW5jZSBpdCBkb2VzIG5vdAorICAgIC8vIGRvIHZpZXdwb3J0IHRy
YW5zbGF0aW5nIGFueW1vcmUuIExvb2sgaW50byB0aGlzIHdoaWxlCisgICAgLy8gIGZpeGluZyBi
dWcgMTIyMDcuCisgICAgaWYgKCF2aWV3Qm94KCkuaXNFbXB0eSgpKSB7CisgICAgICAgIEZsb2F0
UmVjdCB2aWV3cG9ydFJlY3QgPSB2aWV3cG9ydCgpOworICAgICAgICB2aWV3cG9ydFJlY3QgPSBG
bG9hdFJlY3Qodmlld3BvcnQoKS54KCksIHZpZXdwb3J0KCkueSgpLCB3aWR0aCgpLCBoZWlnaHQo
KSk7CisKKyAgICAgICAgcmV0dXJuIGdldEFzcGVjdFJhdGlvKHZpZXdCb3goKSwgdmlld3BvcnRS
ZWN0KTsKKyAgICB9CisKKyAgICByZXR1cm4gQWZmaW5lVHJhbnNmb3JtKCk7Cit9CisKK0ludFJl
Y3QgUmVuZGVyU1ZHUm9vdDo6YWJzb2x1dGVDbGlwcGVkT3ZlcmZsb3dSZWN0KCkKK3sKKyAgICBJ
bnRSZWN0IHJlcGFpbnRSZWN0OworCisgICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnJlbnQgPSBm
aXJzdENoaWxkKCk7IGN1cnJlbnQgIT0gMDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHRTaWJsaW5n
KCkpCisgICAgICAgIHJlcGFpbnRSZWN0LnVuaXRlKGN1cnJlbnQtPmFic29sdXRlQ2xpcHBlZE92
ZXJmbG93UmVjdCgpKTsKKworI2lmIEVOQUJMRShTVkdfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTKQor
ICAgIC8vIEZpbHRlcnMgY2FuIGV4cGFuZCB0aGUgYm91bmRpbmcgYm94CisgICAgU1ZHUmVzb3Vy
Y2VGaWx0ZXIqIGZpbHRlciA9IGdldEZpbHRlckJ5SWQoZG9jdW1lbnQoKSwgU1ZHVVJJUmVmZXJl
bmNlOjpnZXRUYXJnZXQoc3R5bGUoKS0+c3ZnU3R5bGUoKS0+ZmlsdGVyKCkpKTsKKyAgICBpZiAo
ZmlsdGVyKQorICAgICAgICByZXBhaW50UmVjdC51bml0ZShlbmNsb3NpbmdJbnRSZWN0KGZpbHRl
ci0+ZmlsdGVyQkJveEZvckl0ZW1CQm94KHJlcGFpbnRSZWN0KSkpOworI2VuZGlmCisKKyAgICBy
ZXR1cm4gcmVwYWludFJlY3Q7Cit9CisKK3ZvaWQgUmVuZGVyU1ZHUm9vdDo6YWRkRm9jdXNSaW5n
UmVjdHMoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGludCB0eCwgaW50IHR5KQor
eworICAgIGdyYXBoaWNzQ29udGV4dC0+YWRkRm9jdXNSaW5nUmVjdChtX2Fic29sdXRlQm91bmRz
KTsKK30KKwordm9pZCBSZW5kZXJTVkdSb290OjphYnNvbHV0ZVJlY3RzKFZlY3RvcjxJbnRSZWN0
PiYgcmVjdHMsIGludCwgaW50KQoreworICAgIHJlY3RzLmFwcGVuZChhYnNvbHV0ZUNsaXBwZWRP
dmVyZmxvd1JlY3QoKSk7Cit9CisKK0FmZmluZVRyYW5zZm9ybSBSZW5kZXJTVkdSb290OjphYnNv
bHV0ZVRyYW5zZm9ybSgpIGNvbnN0Cit7CisgICAgQWZmaW5lVHJhbnNmb3JtIGN0bSA9IFJlbmRl
ckNvbnRhaW5lcjo6YWJzb2x1dGVUcmFuc2Zvcm0oKTsKKyAgICBTVkdTVkdFbGVtZW50KiBzdmcg
PSBzdGF0aWNfY2FzdDxTVkdTVkdFbGVtZW50Kj4oZWxlbWVudCgpKTsKKyAgICBjdG0uc2NhbGUo
c3ZnLT5jdXJyZW50U2NhbGUoKSk7CisgICAgY3RtLnRyYW5zbGF0ZShzdmctPmN1cnJlbnRUcmFu
c2xhdGUoKS54KCksIHN2Zy0+Y3VycmVudFRyYW5zbGF0ZSgpLnkoKSk7CisgICAgY3RtLnRyYW5z
bGF0ZSh2aWV3cG9ydCgpLngoKSwgdmlld3BvcnQoKS55KCkpOworICAgIHJldHVybiB2aWV3cG9y
dFRyYW5zZm9ybSgpICogY3RtOworfQorCitib29sIFJlbmRlclNWR1Jvb3Q6OmZpbGxDb250YWlu
cyhjb25zdCBGbG9hdFBvaW50JiBwKSBjb25zdAoreworICAgIFJlbmRlck9iamVjdCogY3VycmVu
dCA9IGZpcnN0Q2hpbGQoKTsKKyAgICB3aGlsZSAoY3VycmVudCAhPSAwKSB7CisgICAgICAgIGlm
IChjdXJyZW50LT5pc1JlbmRlclBhdGgoKSAmJiBzdGF0aWNfY2FzdDxSZW5kZXJQYXRoKj4oY3Vy
cmVudCktPmZpbGxDb250YWlucyhwKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAg
ICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0U2libGluZygpOworICAgIH0KKworICAgIHJldHVy
biBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJTVkdSb290OjpzdHJva2VDb250YWlucyhjb25zdCBG
bG9hdFBvaW50JiBwKSBjb25zdAoreworICAgIFJlbmRlck9iamVjdCogY3VycmVudCA9IGZpcnN0
Q2hpbGQoKTsKKyAgICB3aGlsZSAoY3VycmVudCAhPSAwKSB7CisgICAgICAgIGlmIChjdXJyZW50
LT5pc1JlbmRlclBhdGgoKSAmJiBzdGF0aWNfY2FzdDxSZW5kZXJQYXRoKj4oY3VycmVudCktPnN0
cm9rZUNvbnRhaW5zKHApKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgY3Vy
cmVudCA9IGN1cnJlbnQtPm5leHRTaWJsaW5nKCk7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNl
OworfQorCitGbG9hdFJlY3QgUmVuZGVyU1ZHUm9vdDo6cmVsYXRpdmVCQm94KGJvb2wgaW5jbHVk
ZVN0cm9rZSkgY29uc3QKK3sKKyAgICBGbG9hdFJlY3QgcmVjdDsKKyAgICAKKyAgICBSZW5kZXJP
YmplY3QqIGN1cnJlbnQgPSBmaXJzdENoaWxkKCk7CisgICAgZm9yICg7IGN1cnJlbnQgIT0gMDsg
Y3VycmVudCA9IGN1cnJlbnQtPm5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgRmxvYXRSZWN0IGNo
aWxkQkJveCA9IGN1cnJlbnQtPnJlbGF0aXZlQkJveChpbmNsdWRlU3Ryb2tlKTsKKyAgICAgICAg
RmxvYXRSZWN0IG1hcHBlZEJCb3ggPSBjdXJyZW50LT5sb2NhbFRyYW5zZm9ybSgpLm1hcFJlY3Qo
Y2hpbGRCQm94KTsKKyAgICAgICAgcmVjdC51bml0ZShtYXBwZWRCQm94KTsKKyAgICB9CisKKyAg
ICByZXR1cm4gcmVjdDsKK30KKwordm9pZCBSZW5kZXJTVkdSb290OjpzZXRTbGljZShib29sIHNs
aWNlKQoreworICAgIG1fc2xpY2UgPSBzbGljZTsKKworICAgIGlmIChzdHlsZSgpKQorICAgICAg
ICBzZXROZWVkc0xheW91dCh0cnVlKTsKK30KKworYm9vbCBSZW5kZXJTVkdSb290OjpzbGljZSgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIG1fc2xpY2U7Cit9CisKK0FmZmluZVRyYW5zZm9ybSBSZW5k
ZXJTVkdSb290OjpnZXRBc3BlY3RSYXRpbyhjb25zdCBGbG9hdFJlY3QmIGxvZ2ljYWwsIGNvbnN0
IEZsb2F0UmVjdCYgcGh5c2ljYWwpIGNvbnN0Cit7CisgICAgQWZmaW5lVHJhbnNmb3JtIHRlbXA7
CisKKyAgICBmbG9hdCBsb2dpY1ggPSBsb2dpY2FsLngoKTsKKyAgICBmbG9hdCBsb2dpY1kgPSBs
b2dpY2FsLnkoKTsKKyAgICBmbG9hdCBsb2dpY1dpZHRoID0gbG9naWNhbC53aWR0aCgpOworICAg
IGZsb2F0IGxvZ2ljSGVpZ2h0ID0gbG9naWNhbC5oZWlnaHQoKTsKKyAgICBmbG9hdCBwaHlzV2lk
dGggPSBwaHlzaWNhbC53aWR0aCgpOworICAgIGZsb2F0IHBoeXNIZWlnaHQgPSBwaHlzaWNhbC5o
ZWlnaHQoKTsKKworICAgIGZsb2F0IHZwYXIgPSBsb2dpY1dpZHRoIC8gbG9naWNIZWlnaHQ7Cisg
ICAgZmxvYXQgc3ZnYXIgPSBwaHlzV2lkdGggLyBwaHlzSGVpZ2h0OworCisgICAgaWYgKGFsaWdu
KCkgPT0gU1ZHUHJlc2VydmVBc3BlY3RSYXRpbzo6U1ZHX1BSRVNFUlZFQVNQRUNUUkFUSU9fTk9O
RSkgeworICAgICAgICB0ZW1wLnNjYWxlKHBoeXNXaWR0aCAvIGxvZ2ljV2lkdGgsIHBoeXNIZWln
aHQgLyBsb2dpY0hlaWdodCk7CisgICAgICAgIHRlbXAudHJhbnNsYXRlKC1sb2dpY1gsIC1sb2dp
Y1kpOworICAgIH0gZWxzZSBpZiAoKHZwYXIgPCBzdmdhciAmJiAhc2xpY2UoKSkgfHwgKHZwYXIg
Pj0gc3ZnYXIgJiYgc2xpY2UoKSkpIHsKKyAgICAgICAgdGVtcC5zY2FsZShwaHlzSGVpZ2h0IC8g
bG9naWNIZWlnaHQsIHBoeXNIZWlnaHQgLyBsb2dpY0hlaWdodCk7CisKKyAgICAgICAgaWYgKGFs
aWduKCkgPT0gU1ZHUHJlc2VydmVBc3BlY3RSYXRpbzo6U1ZHX1BSRVNFUlZFQVNQRUNUUkFUSU9f
WE1JTllNSU4gfHwgYWxpZ24oKSA9PSBTVkdQcmVzZXJ2ZUFzcGVjdFJhdGlvOjpTVkdfUFJFU0VS
VkVBU1BFQ1RSQVRJT19YTUlOWU1JRCB8fCBhbGlnbigpID09IFNWR1ByZXNlcnZlQXNwZWN0UmF0
aW86OlNWR19QUkVTRVJWRUFTUEVDVFJBVElPX1hNSU5ZTUFYKQorICAgICAgICAgICAgdGVtcC50
cmFuc2xhdGUoLWxvZ2ljWCwgLWxvZ2ljWSk7CisgICAgICAgIGVsc2UgaWYgKGFsaWduKCkgPT0g
U1ZHUHJlc2VydmVBc3BlY3RSYXRpbzo6U1ZHX1BSRVNFUlZFQVNQRUNUUkFUSU9fWE1JRFlNSU4g
fHwgYWxpZ24oKSA9PSBTVkdQcmVzZXJ2ZUFzcGVjdFJhdGlvOjpTVkdfUFJFU0VSVkVBU1BFQ1RS
QVRJT19YTUlEWU1JRCB8fCBhbGlnbigpID09IFNWR1ByZXNlcnZlQXNwZWN0UmF0aW86OlNWR19Q
UkVTRVJWRUFTUEVDVFJBVElPX1hNSURZTUFYKQorICAgICAgICAgICAgdGVtcC50cmFuc2xhdGUo
LWxvZ2ljWCAtIChsb2dpY1dpZHRoIC0gcGh5c1dpZHRoICogbG9naWNIZWlnaHQgLyBwaHlzSGVp
Z2h0KSAvIDIsIC1sb2dpY1kpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0ZW1wLnRyYW5z
bGF0ZSgtbG9naWNYIC0gKGxvZ2ljV2lkdGggLSBwaHlzV2lkdGggKiBsb2dpY0hlaWdodCAvIHBo
eXNIZWlnaHQpLCAtbG9naWNZKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZW1wLnNjYWxlKHBo
eXNXaWR0aCAvIGxvZ2ljV2lkdGgsIHBoeXNXaWR0aCAvIGxvZ2ljV2lkdGgpOworCisgICAgICAg
IGlmIChhbGlnbigpID09IFNWR1ByZXNlcnZlQXNwZWN0UmF0aW86OlNWR19QUkVTRVJWRUFTUEVD
VFJBVElPX1hNSU5ZTUlOIHx8IGFsaWduKCkgPT0gU1ZHUHJlc2VydmVBc3BlY3RSYXRpbzo6U1ZH
X1BSRVNFUlZFQVNQRUNUUkFUSU9fWE1JRFlNSU4gfHwgYWxpZ24oKSA9PSBTVkdQcmVzZXJ2ZUFz
cGVjdFJhdGlvOjpTVkdfUFJFU0VSVkVBU1BFQ1RSQVRJT19YTUFYWU1JTikKKyAgICAgICAgICAg
IHRlbXAudHJhbnNsYXRlKC1sb2dpY1gsIC1sb2dpY1kpOworICAgICAgICBlbHNlIGlmIChhbGln
bigpID09IFNWR1ByZXNlcnZlQXNwZWN0UmF0aW86OlNWR19QUkVTRVJWRUFTUEVDVFJBVElPX1hN
SU5ZTUlEIHx8IGFsaWduKCkgPT0gU1ZHUHJlc2VydmVBc3BlY3RSYXRpbzo6U1ZHX1BSRVNFUlZF
QVNQRUNUUkFUSU9fWE1JRFlNSUQgfHwgYWxpZ24oKSA9PSBTVkdQcmVzZXJ2ZUFzcGVjdFJhdGlv
OjpTVkdfUFJFU0VSVkVBU1BFQ1RSQVRJT19YTUFYWU1JRCkKKyAgICAgICAgICAgIHRlbXAudHJh
bnNsYXRlKC1sb2dpY1gsIC1sb2dpY1kgLSAobG9naWNIZWlnaHQgLSBwaHlzSGVpZ2h0ICogbG9n
aWNXaWR0aCAvIHBoeXNXaWR0aCkgLyAyKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGVt
cC50cmFuc2xhdGUoLWxvZ2ljWCwgLWxvZ2ljWSAtIChsb2dpY0hlaWdodCAtIHBoeXNIZWlnaHQg
KiBsb2dpY1dpZHRoIC8gcGh5c1dpZHRoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHRlbXA7Cit9
CisKK2Jvb2wgUmVuZGVyU1ZHUm9vdDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJlcXVlc3Qm
IHJlcXVlc3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgaW50IF94LCBpbnQgX3ksIGludCBfdHgs
IGludCBfdHksIEhpdFRlc3RBY3Rpb24gaGl0VGVzdEFjdGlvbikKK3sKKyAgICBpZiAoIXZpZXdw
b3J0KCkuaXNFbXB0eSgpCisgICAgICAgICYmIHN0eWxlKCktPm92ZXJmbG93WCgpID09IE9ISURE
RU4KKyAgICAgICAgJiYgc3R5bGUoKS0+b3ZlcmZsb3dZKCkgPT0gT0hJRERFTikgeworICAgICAg
ICBpbnQgdHggPSBtX3ggLSBfdHg7CisgICAgICAgIGludCB0eSA9IG1feSAtIF90eTsKKworICAg
ICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIGRvIGFueXRoaW5nIGF0IGFsbC4KKyAgICAgICAg
SW50UmVjdCBvdmVyZmxvd0JveCA9IG92ZXJmbG93UmVjdChmYWxzZSk7CisgICAgICAgIG92ZXJm
bG93Qm94Lm1vdmUodHgsIHR5KTsKKyAgICAgICAgQWZmaW5lVHJhbnNmb3JtIGN0bSA9IFJlbmRl
ckNvbnRhaW5lcjo6YWJzb2x1dGVUcmFuc2Zvcm0oKTsKKyAgICAgICAgY3RtLnRyYW5zbGF0ZSh2
aWV3cG9ydCgpLngoKSwgdmlld3BvcnQoKS55KCkpOworICAgICAgICBkb3VibGUgbG9jYWxYLCBs
b2NhbFk7CisgICAgICAgIGN0bS5pbnZlcnNlKCkubWFwKF94IC0gX3R4LCBfeSAtIF90eSwgJmxv
Y2FsWCwgJmxvY2FsWSk7CisgICAgICAgIGlmICghb3ZlcmZsb3dCb3guY29udGFpbnMoKGludCls
b2NhbFgsIChpbnQpbG9jYWxZKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisK
KyAgICBmb3IgKFJlbmRlck9iamVjdCogY2hpbGQgPSBsYXN0Q2hpbGQoKTsgY2hpbGQ7IGNoaWxk
ID0gY2hpbGQtPnByZXZpb3VzU2libGluZygpKSB7CisgICAgICAgIGlmIChjaGlsZC0+bm9kZUF0
UG9pbnQocmVxdWVzdCwgcmVzdWx0LCBfeCwgX3ksIF90eCwgX3R5LCBoaXRUZXN0QWN0aW9uKSkg
eworICAgICAgICAgICAgdXBkYXRlSGl0VGVzdFJlc3VsdChyZXN1bHQsIEludFBvaW50KF94IC0g
X3R4LCBfeSAtIF90eSkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAg
ICB9CisgICAgCisgICAgLy8gU3BlYzogT25seSBncmFwaGljYWwgZWxlbWVudHMgY2FuIGJlIHRh
cmdldGVkIGJ5IHRoZSBtb3VzZSwgcGVyaW9kLgorICAgIC8vIDE2LjQ6ICJJZiB0aGVyZSBhcmUg
bm8gZ3JhcGhpY3MgZWxlbWVudHMgd2hvc2UgcmVsZXZhbnQgZ3JhcGhpY3MgY29udGVudCBpcyB1
bmRlciB0aGUgcG9pbnRlciAoaS5lLiwgdGhlcmUgaXMgbm8gdGFyZ2V0IGVsZW1lbnQpLCB0aGUg
ZXZlbnQgaXMgbm90IGRpc3BhdGNoZWQuIgorICAgIHJldHVybiBmYWxzZTsKK30KKworfQorCisj
ZW5kaWYgLy8gRU5BQkxFKFNWRykKKworLy8gdmltOnRzPTQ6bm9ldApJbmRleDogV2ViQ29yZS9y
ZW5kZXJpbmcvUmVuZGVyU1ZHUm9vdC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlclNWR1Jvb3QuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
clNWR1Jvb3QuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAgICBDb3B5cmln
aHQgKEMpIDIwMDQsIDIwMDUsIDIwMDcgTmlrb2xhcyBaaW1tZXJtYW5uIDx6aW1tZXJtYW5uQGtk
ZS5vcmc+CisgICAgICAgICAgICAgICAgICAyMDA0LCAyMDA1LCAyMDA3IFJvYiBCdWlzIDxidWlz
QGtkZS5vcmc+CisKKyAgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgS0RFIHByb2plY3QKKwor
ICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp
dCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAg
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ
VVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
Zm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhaW50IHdpdGgg
dGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRv
CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNl
IC0gU3VpdGUgMzMwLAorICAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKi8KKworI2lm
bmRlZiBSZW5kZXJTVkdSb290X2gKKyNkZWZpbmUgUmVuZGVyU1ZHUm9vdF9oCisKKyNpZiBFTkFC
TEUoU1ZHKQorCisjaW5jbHVkZSAiUmVuZGVyQ29udGFpbmVyLmgiCisjaW5jbHVkZSAiUmVuZGVy
UGF0aC5oIgorI2luY2x1ZGUgIlNWR1ByZXNlcnZlQXNwZWN0UmF0aW8uaCIKKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCitjbGFzcyBTVkdFbGVtZW50OworCitjbGFzcyBSZW5kZXJTVkdSb290IDog
cHVibGljIFJlbmRlckNvbnRhaW5lciB7CitwdWJsaWM6CisgICAgUmVuZGVyU1ZHUm9vdChTVkdT
dHlsZWRFbGVtZW50Kik7CisgICAgflJlbmRlclNWR1Jvb3QoKTsKKworICAgIHZpcnR1YWwgYm9v
bCBpc1NWR0NvbnRhaW5lcigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0dWFsIGNv
bnN0IGNoYXIqIHJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyU1ZHQ29udGFpbmVy
IjsgfQorICAgICAgICAKKyAgICB2aXJ0dWFsIGJvb2wgcmVxdWlyZXNMYXllcigpOworICAgIHZp
cnR1YWwgc2hvcnQgbGluZUhlaWdodChib29sIGIsIGJvb2wgaXNSb290TGluZUJveCA9IGZhbHNl
KSBjb25zdDsKKyAgICB2aXJ0dWFsIHNob3J0IGJhc2VsaW5lUG9zaXRpb24oYm9vbCBiLCBib29s
IGlzUm9vdExpbmVCb3ggPSBmYWxzZSkgY29uc3Q7CisgICAgCisgICAgdmlydHVhbCB2b2lkIGxh
eW91dCgpOworICAgIHZpcnR1YWwgdm9pZCBwYWludChQYWludEluZm8mLCBpbnQgcGFyZW50WCwg
aW50IHBhcmVudFkpOworICAgIAorICAgIHZpcnR1YWwgSW50UmVjdCBhYnNvbHV0ZUNsaXBwZWRP
dmVyZmxvd1JlY3QoKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWJzb2x1dGVSZWN0cyhWZWN0b3I8SW50
UmVjdD4mIHJlY3RzLCBpbnQgdHgsIGludCB0eSk7CisgICAgdmlydHVhbCB2b2lkIGFkZEZvY3Vz
UmluZ1JlY3RzKEdyYXBoaWNzQ29udGV4dCosIGludCB0eCwgaW50IHR5KTsKKworICAgIHZpcnR1
YWwgQWZmaW5lVHJhbnNmb3JtIGFic29sdXRlVHJhbnNmb3JtKCkgY29uc3Q7CisKKyAgICBib29s
IGZpbGxDb250YWlucyhjb25zdCBGbG9hdFBvaW50JikgY29uc3Q7CisgICAgYm9vbCBzdHJva2VD
b250YWlucyhjb25zdCBGbG9hdFBvaW50JikgY29uc3Q7CisgICAgRmxvYXRSZWN0IHJlbGF0aXZl
QkJveChib29sIGluY2x1ZGVTdHJva2UgPSB0cnVlKSBjb25zdDsKKyAgICAKKyAgICB2aXJ0dWFs
IEFmZmluZVRyYW5zZm9ybSBsb2NhbFRyYW5zZm9ybSgpIGNvbnN0OworICAgIHZvaWQgc2V0TG9j
YWxUcmFuc2Zvcm0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJik7CisgICAKKyAgICBGbG9hdFJlY3Qg
dmlld3BvcnQoKSBjb25zdDsKKworICAgIHZvaWQgc2V0Vmlld0JveChjb25zdCBGbG9hdFJlY3Qm
KTsKKyAgICBGbG9hdFJlY3Qgdmlld0JveCgpIGNvbnN0OworCisgICAgdm9pZCBzZXRBbGlnbihT
VkdQcmVzZXJ2ZUFzcGVjdFJhdGlvOjpTVkdQcmVzZXJ2ZUFzcGVjdFJhdGlvVHlwZSk7CisgICAg
U1ZHUHJlc2VydmVBc3BlY3RSYXRpbzo6U1ZHUHJlc2VydmVBc3BlY3RSYXRpb1R5cGUgYWxpZ24o
KSBjb25zdDsKKworICAgIHZvaWQgc2V0U2xpY2UoYm9vbCk7CisgICAgYm9vbCBzbGljZSgpIGNv
bnN0OworICAgIAorICAgIEFmZmluZVRyYW5zZm9ybSB2aWV3cG9ydFRyYW5zZm9ybSgpIGNvbnN0
OworICAgIAorICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVz
dCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0
QWN0aW9uKTsKKyAgICAKK3ByaXZhdGU6CisgICAgdm9pZCBjYWxjVmlld3BvcnQoKTsgCisgICAg
QWZmaW5lVHJhbnNmb3JtIGdldEFzcGVjdFJhdGlvKGNvbnN0IEZsb2F0UmVjdCYgbG9naWNhbCwg
Y29uc3QgRmxvYXRSZWN0JiBwaHlzaWNhbCkgY29uc3Q7CisgICAgdm9pZCBhcHBseUNvbnRlbnRU
cmFuc2Zvcm1zKFBhaW50SW5mbyYsIGludCYgcGFyZW50WCwgaW50JiBwYXJlbnRZKTsKKworICAg
IGJvb2wgbV9zbGljZSA6IDE7CisgICAgQWZmaW5lVHJhbnNmb3JtIG1fbWF0cml4OworICAgIAor
ICAgIEZsb2F0UmVjdCBtX3ZpZXdwb3J0OworICAgIEZsb2F0UmVjdCBtX3ZpZXdCb3g7CisgICAg
U1ZHUHJlc2VydmVBc3BlY3RSYXRpbzo6U1ZHUHJlc2VydmVBc3BlY3RSYXRpb1R5cGUgbV9hbGln
bjsKKyAgICBJbnRSZWN0IG1fYWJzb2x1dGVCb3VuZHM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoU1ZHKQorI2VuZGlmIC8vIFJlbmRlclNWR1Jvb3Rf
aAorCisvLyB2aW06dHM9NDpub2V0CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9TVkdSb290SW5s
aW5lQm94LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3JlbmRlcmluZy9TVkdSb290SW5saW5l
Qm94LmNwcAkocmV2aXNpb24gMjIwOTgpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9TVkdSb290SW5s
aW5lQm94LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzExLDggKzMxMSw4IEBAIHN0YXRpYyB2b2lk
IGFwcGx5VGV4dEFuY2hvclRvVGV4dENodW5rKFMKICAgICAgICAgSW5saW5lQm94KiBjdXJCb3gg
PSByYW5nZS5ib3g7CiAgICAgICAgIEFTU0VSVChjdXJCb3gtPmlzSW5saW5lVGV4dEJveCgpKTsK
IAotICAgICAgICBJbmxpbmVCb3gqIHBhcmVudEJveCA9IGN1ckJveC0+cGFyZW50KCk7Ci0gICAg
ICAgIEFTU0VSVChwYXJlbnRCb3ggJiYgKHBhcmVudEJveC0+aXNSb290SW5saW5lQm94KCkgfHwg
cGFyZW50Qm94LT5pc0lubGluZUZsb3dCb3goKSkpOworICAgICAgICAvL0lubGluZUJveCogcGFy
ZW50Qm94ID0gY3VyQm94LT5wYXJlbnQoKTsKKyAgICAgICAgLy9BU1NFUlQocGFyZW50Qm94ICYm
IChwYXJlbnRCb3gtPmlzUm9vdElubGluZUJveCgpIHx8IHBhcmVudEJveC0+aXNJbmxpbmVGbG93
Qm94KCkpKTsKIAogICAgICAgICAvLyBNb3ZlIHRhcmdldCBib3gKICAgICAgICAgaWYgKGNodW5r
LmlzVmVydGljYWxUZXh0KQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>14988</attachid>
            <date>2007-06-12 17:08:16 -0700</date>
            <delta_ts>2007-06-13 16:09:08 -0700</delta_ts>
            <desc>Split out RenderSVGRoot</desc>
            <filename>12207-4.diff</filename>
            <type>text/plain</type>
            <size>39814</size>
            <attacher name="Rob Buis">rwlbuis</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAyMzQ2NSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsNjUgQEAKKzIwMDctMDYtMTMgIFJvYiBCdWlzICA8YnVpc0BrZGUub3JnPgorCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIGh0dHA6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyMjA3CisgICAgICAgIFJlbmRlclNWR0NvbnRh
aW5lciBzaG91bGQgYmUgc3BsaXQgaW50byBtdWx0aXBsZSBjbGFzc2VzCisKKyAgICAgICAgV0FS
TklORzogTk8gVEVTVCBDQVNFUyBBRERFRCBPUiBDSEFOR0VECisKKyAgICAgICAgIEludHJvZHVj
ZSB0aGUgUmVuZGVyU1ZHUm9vdCBjbGFzcyBhbmQga2lsbCBLQ0FsaWduIGVudW0uCisKKyAgICAg
ICAgKiBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICoga3N2ZzIv
c3ZnL1NWR01hcmtlckVsZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6U1ZHTWFya2VyRWxl
bWVudDo6Y3JlYXRlUmVuZGVyZXIpOgorICAgICAgICAoV2ViQ29yZTo6U1ZHTWFya2VyRWxlbWVu
dDo6bm90aWZ5QXR0cmlidXRlQ2hhbmdlKToKKyAgICAgICAgKiBrc3ZnMi9zdmcvU1ZHU1ZHRWxl
bWVudC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTVkdTVkdFbGVtZW50OjpjcmVhdGVSZW5kZXJl
cik6CisgICAgICAgICoga3N2ZzIvc3ZnL1NWR1NWR0VsZW1lbnQuaDoKKyAgICAgICAgKiByZW5k
ZXJpbmcvUmVuZGVyU1ZHQ29udGFpbmVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclNW
R0NvbnRhaW5lcjo6cmVxdWlyZXNMYXllcik6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJTVkdD
b250YWluZXI6OmxheW91dCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJTVkdDb250YWluZXI6
OmFwcGx5Q29udGVudFRyYW5zZm9ybXMpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyU1ZHQ29u
dGFpbmVyOjpwYWludCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJTVkdDb250YWluZXI6OnNl
dEFsaWduKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclNWR0NvbnRhaW5lcjo6YWxpZ24pOgor
ICAgICAgICAoV2ViQ29yZTo6UmVuZGVyU1ZHQ29udGFpbmVyOjp2aWV3cG9ydFRyYW5zZm9ybSk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJTVkdDb250YWluZXI6OmFic29sdXRlVHJhbnNmb3Jt
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclNWR0NvbnRhaW5lcjo6Z2V0QXNwZWN0UmF0aW8p
OgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJTVkdDb250YWluZXIuaDoKKyAgICAgICAgKiBy
ZW5kZXJpbmcvUmVuZGVyU1ZHUm9vdC5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyU1ZHUm9vdDo6UmVuZGVyU1ZHUm9vdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJTVkdS
b290Ojp+UmVuZGVyU1ZHUm9vdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJTVkdSb290Ojps
b2NhbFRyYW5zZm9ybSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJTVkdSb290OjpzZXRMb2Nh
bFRyYW5zZm9ybSk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJTVkdSb290OjpyZXF1aXJlc0xh
eWVyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclNWR1Jvb3Q6OmxpbmVIZWlnaHQpOgorICAg
ICAgICAoV2ViQ29yZTo6UmVuZGVyU1ZHUm9vdDo6YmFzZWxpbmVQb3NpdGlvbik6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJTVkdSb290OjpsYXlvdXQpOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyU1ZHUm9vdDo6YXBwbHlDb250ZW50VHJhbnNmb3Jtcyk6CisgICAgICAgIChXZWJDb3JlOjpS
ZW5kZXJTVkdSb290OjpwYWludCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJTVkdSb290Ojp2
aWV3cG9ydCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJTVkdSb290OjpjYWxjVmlld3BvcnQp
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyU1ZHUm9vdDo6c2V0Vmlld0JveCk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJTVkdSb290Ojp2aWV3Qm94KToKKyAgICAgICAgKFdlYkNvcmU6OlJl
bmRlclNWR1Jvb3Q6OnNldEFsaWduKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclNWR1Jvb3Q6
OmFsaWduKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclNWR1Jvb3Q6OnZpZXdwb3J0VHJhbnNm
b3JtKToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclNWR1Jvb3Q6OmFic29sdXRlQ2xpcHBlZE92
ZXJmbG93UmVjdCk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJTVkdSb290OjphZGRGb2N1c1Jp
bmdSZWN0cyk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJTVkdSb290OjphYnNvbHV0ZVJlY3Rz
KToKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclNWR1Jvb3Q6OmFic29sdXRlVHJhbnNmb3JtKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlbmRlclNWR1Jvb3Q6OmZpbGxDb250YWlucyk6CisgICAgICAg
IChXZWJDb3JlOjpSZW5kZXJTVkdSb290OjpzdHJva2VDb250YWlucyk6CisgICAgICAgIChXZWJD
b3JlOjpSZW5kZXJTVkdSb290OjpyZWxhdGl2ZUJCb3gpOgorICAgICAgICAoV2ViQ29yZTo6UmVu
ZGVyU1ZHUm9vdDo6c2V0U2xpY2UpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyU1ZHUm9vdDo6
c2xpY2UpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyU1ZHUm9vdDo6Z2V0QXNwZWN0UmF0aW8p
OgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyU1ZHUm9vdDo6bm9kZUF0UG9pbnQpOgorICAgICAg
ICAqIHJlbmRlcmluZy9SZW5kZXJTVkdSb290Lmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6
UmVuZGVyU1ZHUm9vdDo6aXNTVkdDb250YWluZXIpOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVy
U1ZHUm9vdDo6cmVuZGVyTmFtZSk6CisKIDIwMDctMDYtMTIgIE5pa29sYXMgWmltbWVybWFubiAg
PHppbW1lcm1hbm5Aa2RlLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBFcmljLgpJbmRleDog
V2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHJldmlzaW9uIDIyMDk4
KQorKysgV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcg
Y29weSkKQEAgLTIyNTgsNiArMjI1OCw4IEBACiAJCUFBMDk3MkNEMEI2OTQ3QTgwMEE3MDVFOSAv
KiBTVkdJbmxpbmVUZXh0Qm94LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSBBQTA5NzJDQjBCNjk0N0E4MDBBNzA1RTkgLyogU1ZHSW5saW5lVGV4dEJveC5o
ICovOyB9OwogCQlBQTIxRUNDQTBBQkYwRkJBMDAyQjgzNEMgLyogQ1NTQ3Vyc29ySW1hZ2VWYWx1
ZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBQTA5
NzhFRDBBQkFBNkUxMDA4NzQ0ODAgLyogQ1NTQ3Vyc29ySW1hZ2VWYWx1ZS5jcHAgKi87IH07CiAJ
CUFBMjFFQ0NEMEFCRjBGQzYwMDJCODM0QyAvKiBDU1NDdXJzb3JJbWFnZVZhbHVlLmggaW4gSGVh
ZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBQTA5NzhFRTBBQkFBNkUx
MDA4NzQ0ODAgLyogQ1NTQ3Vyc29ySW1hZ2VWYWx1ZS5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJV
VEVTID0gKFByaXZhdGUsICk7IH07IH07CisJCUFBMzFCNUI0MEMxREZEMTAwMEFFNzA4MyAvKiBS
ZW5kZXJTVkdSb290LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IEFBMzFCNUIyMEMxREZEMTAwMEFFNzA4MyAvKiBSZW5kZXJTVkdSb290LmNwcCAqLzsg
fTsKKwkJQUEzMUI1QjUwQzFERkQxMDAwQUU3MDgzIC8qIFJlbmRlclNWR1Jvb3QuaCBpbiBIZWFk
ZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEFBMzFCNUIzMEMxREZEMTAw
MEFFNzA4MyAvKiBSZW5kZXJTVkdSb290LmggKi87IH07CiAJCUFBNEMzQTc2MEIyQjE2NzkwMDIz
MzRBMiAvKiBTdHlsZUVsZW1lbnQuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gQUE0QzNBNzQwQjJCMTY3OTAwMjMzNEEyIC8qIFN0eWxlRWxlbWVudC5j
cHAgKi87IH07CiAJCUFBNEMzQTc3MEIyQjE2NzkwMDIzMzRBMiAvKiBTdHlsZUVsZW1lbnQuaCBp
biBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEFBNEMzQTc1MEIy
QjE2NzkwMDIzMzRBMiAvKiBTdHlsZUVsZW1lbnQuaCAqLzsgfTsKIAkJQUE4ODJCMkYwQjRFRjVF
QjAwNkQyNkQxIC8qIFBvaW50ZXJFdmVudHNIaXRSdWxlcy5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBBQTg4MkIyRDBCNEVGNUVCMDA2RDI2RDEgLyog
UG9pbnRlckV2ZW50c0hpdFJ1bGVzLmNwcCAqLzsgfTsKQEAgLTUzNTIsNiArNTM1NCw4IEBACiAJ
CUFBMDk3MkNCMEI2OTQ3QTgwMEE3MDVFOSAvKiBTVkdJbmxpbmVUZXh0Qm94LmggKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTVkdJbmxpbmVUZXh0Qm94Lmg7IHNvdXJjZVRyZWUg
PSAiPGdyb3VwPiI7IH07CiAJCUFBMDk3OEVEMEFCQUE2RTEwMDg3NDQ4MCAvKiBDU1NDdXJzb3JJ
bWFnZVZhbHVlLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBDU1ND
dXJzb3JJbWFnZVZhbHVlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQUEwOTc4
RUUwQUJBQTZFMTAwODc0NDgwIC8qIENTU0N1cnNvckltYWdlVmFsdWUuaCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmMuaDsgcGF0aCA9IENTU0N1cnNvckltYWdlVmFsdWUuaDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKKwkJQUEzMUI1QjIwQzFERkQxMDAwQUU3MDgzIC8qIFJlbmRlclNWR1Jv
b3QuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFJlbmRlclNWR1Jv
b3QuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlBQTMxQjVCMzBDMURGRDEwMDBB
RTcwODMgLyogUmVuZGVyU1ZHUm9vdC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRo
ID0gUmVuZGVyU1ZHUm9vdC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlBQTRDM0E3
NDBCMkIxNjc5MDAyMzM0QTIgLyogU3R5bGVFbGVtZW50LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmNwcC5jcHA7IHBhdGggPSBTdHlsZUVsZW1lbnQuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQlBQTRDM0E3NTBCMkIxNjc5MDAyMzM0QTIgLyogU3R5bGVFbGVtZW50LmggKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZp
bGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBTdHlsZUVsZW1lbnQuaDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQUE4ODJCMkQwQjRFRjVFQjAwNkQyNkQxIC8qIFBvaW50ZXJF
dmVudHNIaXRSdWxlcy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0g
UG9pbnRlckV2ZW50c0hpdFJ1bGVzLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAg
LTk0ODUsNiArOTQ4OSw4IEBACiAJCUY1MjNEMkYzMDJERTQ0M0IwMTg2MzVDQSAvKiByZW5kZXJp
bmcgKi8gPSB7CiAJCQlpc2EgPSBQQlhHcm91cDsKIAkJCWNoaWxkcmVuID0gKAorCQkJCUFBMzFC
NUIyMEMxREZEMTAwMEFFNzA4MyAvKiBSZW5kZXJTVkdSb290LmNwcCAqLywKKwkJCQlBQTMxQjVC
MzBDMURGRDEwMDBBRTcwODMgLyogUmVuZGVyU1ZHUm9vdC5oICovLAogCQkJCUE4Q0ZGMDRCMEEx
NTRGMDkwMDBBNDIzNCAvKiBBdXRvVGFibGVMYXlvdXQuY3BwICovLAogCQkJCUE4Q0ZGMDQ5MEEx
NTRGMDkwMDBBNDIzNCAvKiBBdXRvVGFibGVMYXlvdXQuaCAqLywKIAkJCQlCQ0VBNDgxMzA5N0Q5
MzAyMDA5NEM5RTQgLyogYmlkaS5jcHAgKi8sCkBAIC0xMTMwMCw2ICsxMTMwNiw3IEBACiAJCQkJ
MkQ5MDY2MDcwQkUxNDFENDAwOTU2OTk4IC8qIExheW91dFN0YXRlLmggaW4gSGVhZGVycyAqLywK
IAkJCQkxNEM5QTI5QTBCRjA0REI2MDBENzM0QTggLyogV2ViU2NyaXB0T2JqZWN0UGVuZGluZ1B1
YmxpYy5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQThGNEZCOTQwQzE2OUU3QjAwMkFGRUQ1IC8qIFNW
R1JlbmRlclN1cHBvcnQuaCBpbiBIZWFkZXJzICovLAorCQkJCUFBMzFCNUI1MEMxREZEMTAwMEFF
NzA4MyAvKiBSZW5kZXJTVkdSb290LmggaW4gSGVhZGVycyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5
Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKQEAgLTEyNjc3LDYgKzEyNjg0
LDcgQEAKIAkJCQk0QThDOTZFQjBCRTY5MDMyMDA0RUVGRjAgLyogU2VsZWN0aW9uQ29udHJvbGxl
ck1hYy5tbSBpbiBTb3VyY2VzICovLAogCQkJCUFBQ0YxNDREMEJFQzFFRjAwMDgyNzk4MiAvKiBU
ZXh0QnJlYWtJdGVyYXRvckludGVybmFsSUNVTWFjLm1tIGluIFNvdXJjZXMgKi8sCiAJCQkJQThG
NEZCOTYwQzE2OUU4NTAwMkFGRUQ1IC8qIFNWR1JlbmRlclN1cHBvcnQuY3BwIGluIFNvdXJjZXMg
Ki8sCisJCQkJQUEzMUI1QjQwQzFERkQxMDAwQUU3MDgzIC8qIFJlbmRlclNWR1Jvb3QuY3BwIGlu
IFNvdXJjZXMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2lu
ZyA9IDA7CiAJCX07CkluZGV4OiBXZWJDb3JlL2tzdmcyL3N2Zy9TVkdNYXJrZXJFbGVtZW50LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL2tzdmcyL3N2Zy9TVkdNYXJrZXJFbGVtZW50LmNwcAko
cmV2aXNpb24gMjM0NjUpCisrKyBXZWJDb3JlL2tzdmcyL3N2Zy9TVkdNYXJrZXJFbGVtZW50LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMTM3LDcgKzEzNyw3IEBAIFJlbmRlck9iamVjdCogU1ZHTWFy
a2VyRWxlbWVudDo6Y3JlYXRlUmUKIHsKICAgICBSZW5kZXJTVkdDb250YWluZXIqIG1hcmtlckNv
bnRhaW5lciA9IG5ldyAoYXJlbmEpIFJlbmRlclNWR0NvbnRhaW5lcih0aGlzKTsKICAgICBtYXJr
ZXJDb250YWluZXItPnNldFZpZXdCb3godmlld0JveCgpKTsKLSAgICBtYXJrZXJDb250YWluZXIt
PnNldEFsaWduKEtDQWxpZ24ocHJlc2VydmVBc3BlY3RSYXRpbygpLT5hbGlnbigpIC0gMSkpOwor
ICAgIG1hcmtlckNvbnRhaW5lci0+c2V0QWxpZ24oU1ZHUHJlc2VydmVBc3BlY3RSYXRpbzo6U1ZH
UHJlc2VydmVBc3BlY3RSYXRpb1R5cGUocHJlc2VydmVBc3BlY3RSYXRpbygpLT5hbGlnbigpKSk7
CiAgICAgbWFya2VyQ29udGFpbmVyLT5zZXRTbGljZShwcmVzZXJ2ZUFzcGVjdFJhdGlvKCktPm1l
ZXRPclNsaWNlKCkgPT0gU1ZHUHJlc2VydmVBc3BlY3RSYXRpbzo6U1ZHX01FRVRPUlNMSUNFX1NM
SUNFKTsKICAgICBtYXJrZXJDb250YWluZXItPnNldERyYXdzQ29udGVudHMoZmFsc2UpOyAvLyBN
YXJrZXIgY29udGVudHMgd2lsbCBiZSBleHBsaWNpdGx5IGRyYXduLgogICAgIHJldHVybiBtYXJr
ZXJDb250YWluZXI7CkBAIC0xNTMsNyArMTUzLDcgQEAgdm9pZCBTVkdNYXJrZXJFbGVtZW50Ojpu
b3RpZnlBdHRyaWJ1dGVDaAogICAgIC8vIE5PVEU6IFRoaXMgaXMgYSB0eXBpY2FsIGNhc2UsIHdo
ZXJlIHByb3BlciAiYXR0cmlidXRlQ2hhbmdlZCIgdXNhZ2Ugd291bGQgcmVkdWNlIHRoZSBudW1i
ZXIgb2YgdXBkYXRlcyBuZWVkZWQuCiAgICAgaWYgKG1hcmtlckNvbnRhaW5lcikgewogICAgICAg
ICBtYXJrZXJDb250YWluZXItPnNldFZpZXdCb3godmlld0JveCgpKTsKLSAgICAgICAgbWFya2Vy
Q29udGFpbmVyLT5zZXRBbGlnbihLQ0FsaWduKHByZXNlcnZlQXNwZWN0UmF0aW8oKS0+YWxpZ24o
KSAtIDEpKTsKKyAgICAgICAgbWFya2VyQ29udGFpbmVyLT5zZXRBbGlnbihTVkdQcmVzZXJ2ZUFz
cGVjdFJhdGlvOjpTVkdQcmVzZXJ2ZUFzcGVjdFJhdGlvVHlwZShwcmVzZXJ2ZUFzcGVjdFJhdGlv
KCktPmFsaWduKCkpKTsKICAgICAgICAgbWFya2VyQ29udGFpbmVyLT5zZXRTbGljZShwcmVzZXJ2
ZUFzcGVjdFJhdGlvKCktPm1lZXRPclNsaWNlKCkgPT0gU1ZHUHJlc2VydmVBc3BlY3RSYXRpbzo6
U1ZHX01FRVRPUlNMSUNFX1NMSUNFKTsKICAgICB9CiAKSW5kZXg6IFdlYkNvcmUva3N2ZzIvc3Zn
L1NWR1NWR0VsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUva3N2ZzIvc3ZnL1NWR1NW
R0VsZW1lbnQuY3BwCShyZXZpc2lvbiAyMjA5OCkKKysrIFdlYkNvcmUva3N2ZzIvc3ZnL1NWR1NW
R0VsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSAi
RnJhbWUuaCIKICNpbmNsdWRlICJIVE1MTmFtZXMuaCIKICNpbmNsdWRlICJSZW5kZXJTVkdDb250
YWluZXIuaCIKKyNpbmNsdWRlICJSZW5kZXJTVkdSb290LmgiCiAjaW5jbHVkZSAiU1ZHQW5nbGUu
aCIKICNpbmNsdWRlICJTVkdMZW5ndGguaCIKICNpbmNsdWRlICJTVkdOYW1lcy5oIgpAQCAtMzU2
LDE0ICszNTcsMjIgQEAgQWZmaW5lVHJhbnNmb3JtIFNWR1NWR0VsZW1lbnQ6OmdldFNjcmVlbgog
CiBSZW5kZXJPYmplY3QqIFNWR1NWR0VsZW1lbnQ6OmNyZWF0ZVJlbmRlcmVyKFJlbmRlckFyZW5h
KiBhcmVuYSwgUmVuZGVyU3R5bGUqKQogewotICAgIFJlbmRlclNWR0NvbnRhaW5lciogcm9vdENv
bnRhaW5lciA9IG5ldyAoYXJlbmEpIFJlbmRlclNWR0NvbnRhaW5lcih0aGlzKTsKLQotICAgIC8v
IEZJWE1FOiBBbGwgdGhpcyBzZXR1cCBzaG91bGQgYmUgZG9uZSBhZnRlciBhdHRyaWJ1dGVzQ2hh
bmdlZCwgbm90IGhlcmUuCi0gICAgcm9vdENvbnRhaW5lci0+c2V0Vmlld0JveCh2aWV3Qm94KCkp
OwotICAgIHJvb3RDb250YWluZXItPnNldEFsaWduKEtDQWxpZ24ocHJlc2VydmVBc3BlY3RSYXRp
bygpLT5hbGlnbigpIC0gMSkpOwotICAgIHJvb3RDb250YWluZXItPnNldFNsaWNlKHByZXNlcnZl
QXNwZWN0UmF0aW8oKS0+bWVldE9yU2xpY2UoKSA9PSBTVkdQcmVzZXJ2ZUFzcGVjdFJhdGlvOjpT
VkdfTUVFVE9SU0xJQ0VfU0xJQ0UpOwotICAgIAotICAgIHJldHVybiByb290Q29udGFpbmVyOwor
ICAgIGlmICghcGFyZW50Tm9kZSgpLT5pc1NWR0VsZW1lbnQoKSkgeworICAgICAgICBSZW5kZXJT
VkdSb290KiByb290Q29udGFpbmVyID0gbmV3IChhcmVuYSkgUmVuZGVyU1ZHUm9vdCh0aGlzKTsK
KyAgICAgICAgLy8gRklYTUU6IEFsbCB0aGlzIHNldHVwIHNob3VsZCBiZSBkb25lIGFmdGVyIGF0
dHJpYnV0ZXNDaGFuZ2VkLCBub3QgaGVyZS4KKyAgICAgICAgcm9vdENvbnRhaW5lci0+c2V0Vmll
d0JveCh2aWV3Qm94KCkpOworICAgICAgICByb290Q29udGFpbmVyLT5zZXRBbGlnbihTVkdQcmVz
ZXJ2ZUFzcGVjdFJhdGlvOjpTVkdQcmVzZXJ2ZUFzcGVjdFJhdGlvVHlwZShwcmVzZXJ2ZUFzcGVj
dFJhdGlvKCktPmFsaWduKCkpKTsKKyAgICAgICAgcm9vdENvbnRhaW5lci0+c2V0U2xpY2UocHJl
c2VydmVBc3BlY3RSYXRpbygpLT5tZWV0T3JTbGljZSgpID09IFNWR1ByZXNlcnZlQXNwZWN0UmF0
aW86OlNWR19NRUVUT1JTTElDRV9TTElDRSk7CisgICAgICAgIHJldHVybiByb290Q29udGFpbmVy
OworICAgIH0gZWxzZSAgeworICAgICAgICBSZW5kZXJTVkdDb250YWluZXIqIHJvb3RDb250YWlu
ZXIgPSBuZXcgKGFyZW5hKSBSZW5kZXJTVkdDb250YWluZXIodGhpcyk7CisKKyAgICAgICAgLy8g
RklYTUU6IEFsbCB0aGlzIHNldHVwIHNob3VsZCBiZSBkb25lIGFmdGVyIGF0dHJpYnV0ZXNDaGFu
Z2VkLCBub3QgaGVyZS4KKyAgICAgICAgcm9vdENvbnRhaW5lci0+c2V0Vmlld0JveCh2aWV3Qm94
KCkpOworICAgICAgICByb290Q29udGFpbmVyLT5zZXRBbGlnbihTVkdQcmVzZXJ2ZUFzcGVjdFJh
dGlvOjpTVkdQcmVzZXJ2ZUFzcGVjdFJhdGlvVHlwZShwcmVzZXJ2ZUFzcGVjdFJhdGlvKCktPmFs
aWduKCkpKTsKKyAgICAgICAgcm9vdENvbnRhaW5lci0+c2V0U2xpY2UocHJlc2VydmVBc3BlY3RS
YXRpbygpLT5tZWV0T3JTbGljZSgpID09IFNWR1ByZXNlcnZlQXNwZWN0UmF0aW86OlNWR19NRUVU
T1JTTElDRV9TTElDRSk7CisgICAgICAgIHJldHVybiByb290Q29udGFpbmVyOworICAgIH0KIH0K
IAogdm9pZCBTVkdTVkdFbGVtZW50OjppbnNlcnRlZEludG9Eb2N1bWVudCgpCkluZGV4OiBXZWJD
b3JlL2tzdmcyL3N2Zy9TVkdTVkdFbGVtZW50LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9rc3Zn
Mi9zdmcvU1ZHU1ZHRWxlbWVudC5oCShyZXZpc2lvbiAyMjA5OCkKKysrIFdlYkNvcmUva3N2ZzIv
c3ZnL1NWR1NWR0VsZW1lbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMTI2LDYgKzEyNiw3IEBAIG5h
bWVzcGFjZSBXZWJDb3JlCiAgICAgICAgIHZpcnR1YWwgY29uc3QgU1ZHRWxlbWVudCogY29udGV4
dEVsZW1lbnQoKSBjb25zdCB7IHJldHVybiB0aGlzOyB9CiAKICAgICAgICAgZnJpZW5kIGNsYXNz
IFJlbmRlclNWR0NvbnRhaW5lcjsKKyAgICAgICAgZnJpZW5kIGNsYXNzIFJlbmRlclNWR1Jvb3Q7
CiAgICAgICAgIHZpcnR1YWwgYm9vbCBoYXNSZWxhdGl2ZVZhbHVlcygpIGNvbnN0OwogCiAgICAg
cHJpdmF0ZToKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclNWR0NvbnRhaW5lci5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyU1ZHQ29udGFpbmVyLmNwcAko
cmV2aXNpb24gMjIwOTgpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJTVkdDb250YWluZXIu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC03NSw3ICs3NSw3IEBAIHZvaWQgUmVuZGVyU1ZHQ29udGFp
bmVyOjpzZXRMb2NhbFRyYW5zZm8KIGJvb2wgUmVuZGVyU1ZHQ29udGFpbmVyOjpyZXF1aXJlc0xh
eWVyKCkKIHsKICAgICAvLyBPbmx5IGFsbG93IGFuIDxzdmc+IGVsZW1lbnQgdG8gZ2VuZXJhdGUg
YSBsYXllciB3aGVuIGl0J3MgcG9zaXRpb25lZCBpbiBhIG5vbi1TVkcgY29udGV4dAotICAgIHJl
dHVybiAoaXNQb3NpdGlvbmVkKCkgfHwgaXNSZWxQb3NpdGlvbmVkKCkpICYmIGlzT3V0ZXJtb3N0
U1ZHKCk7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBzaG9ydCBSZW5kZXJTVkdDb250YWluZXI6
OmxpbmVIZWlnaHQoYm9vbCBiLCBib29sIGlzUm9vdExpbmVCb3gpIGNvbnN0CkBAIC04OCwxMyAr
ODgsNiBAQCBzaG9ydCBSZW5kZXJTVkdDb250YWluZXI6OmJhc2VsaW5lUG9zaXRpCiAgICAgcmV0
dXJuIGhlaWdodCgpICsgbWFyZ2luVG9wKCkgKyBtYXJnaW5Cb3R0b20oKTsKIH0KIAotLy8gVGhp
cyBtZXRob2Qgc2hvdWxkIGJlIHRlbXBvcmFyeSB1bnRpbCBhIFJlbmRlclNWR1Jvb3QgY2xhc3Mg
Y2FuIGJlIG1hZGUKLS8vIGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEy
MjA3Ci1ib29sIFJlbmRlclNWR0NvbnRhaW5lcjo6aXNPdXRlcm1vc3RTVkcoKSBjb25zdAotewot
ICAgIHJldHVybiBwYXJlbnQoKSAmJiAhcGFyZW50KCktPmlzU1ZHQ29udGFpbmVyKCk7Ci19Ci0K
IHZvaWQgUmVuZGVyU1ZHQ29udGFpbmVyOjpsYXlvdXQoKQogewogICAgIEFTU0VSVChuZWVkc0xh
eW91dCgpKTsKQEAgLTEyNywxMSArMTIwLDYgQEAgdm9pZCBSZW5kZXJTVkdDb250YWluZXI6Omxh
eW91dCgpCiAgICAgY2FsY0hlaWdodCgpOwogCiAgICAgbV9hYnNvbHV0ZUJvdW5kcyA9IGFic29s
dXRlQ2xpcHBlZE92ZXJmbG93UmVjdCgpOwotICAgIGlmIChpc091dGVybW9zdFNWRygpKSB7Ci0g
ICAgICAgIFNWR1NWR0VsZW1lbnQqIHN2ZyA9IHN0YXRpY19jYXN0PFNWR1NWR0VsZW1lbnQqPihl
bGVtZW50KCkpOwotICAgICAgICBtX3dpZHRoID0gbV93aWR0aCAqIHN2Zy0+Y3VycmVudFNjYWxl
KCk7Ci0gICAgICAgIG1faGVpZ2h0ID0gbV9oZWlnaHQgKiBzdmctPmN1cnJlbnRTY2FsZSgpOwot
ICAgIH0KIAogICAgIGlmIChzZWxmTmVlZHNMYXlvdXQoKSAmJiBjaGVja0ZvclJlcGFpbnQpCiAg
ICAgICAgIHJlcGFpbnRBZnRlckxheW91dElmTmVlZGVkKG9sZEJvdW5kcywgb2xkT3V0bGluZUJv
eCk7CkBAIC0xNDIsMjggKzEzMCwxMiBAQCB2b2lkIFJlbmRlclNWR0NvbnRhaW5lcjo6bGF5b3V0
KCkKIAogdm9pZCBSZW5kZXJTVkdDb250YWluZXI6OmFwcGx5Q29udGVudFRyYW5zZm9ybXMoUGFp
bnRJbmZvJiBwYWludEluZm8sIGludCYgcGFyZW50WCwgaW50JiBwYXJlbnRZKQogewotICAgIGlm
IChpc091dGVybW9zdFNWRygpKSB7Ci0gICAgICAgIC8vIFRyYW5zbGF0ZSBmcm9tIHBhcmVudCBv
ZmZzZXRzIChodG1sIHJlbmRlcmVycykgdG8gYSByZWxhdGl2ZSB0cmFuc2Zvcm0gKHN2ZyByZW5k
ZXJlcnMpCi0gICAgICAgIEludFBvaW50IG9yaWdpbjsKLSAgICAgICAgb3JpZ2luLm1vdmUocGFy
ZW50WCwgcGFyZW50WSk7Ci0gICAgICAgIG9yaWdpbi5tb3ZlKG1feCwgbV95KTsKLSAgICAgICAg
b3JpZ2luLm1vdmUoYm9yZGVyTGVmdCgpLCBib3JkZXJUb3AoKSk7Ci0gICAgICAgIG9yaWdpbi5t
b3ZlKHBhZGRpbmdMZWZ0KCksIHBhZGRpbmdUb3AoKSk7Ci0gICAgICAgIGlmIChvcmlnaW4ueCgp
IHx8IG9yaWdpbi55KCkpIHsKLSAgICAgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5jb25jYXRD
VE0oQWZmaW5lVHJhbnNmb3JtKCkudHJhbnNsYXRlKG9yaWdpbi54KCksIG9yaWdpbi55KCkpKTsK
LSAgICAgICAgICAgIHBhaW50SW5mby5yZWN0Lm1vdmUoLW9yaWdpbi54KCksIC1vcmlnaW4ueSgp
KTsKLSAgICAgICAgfQotICAgICAgICBwYXJlbnRYID0gcGFyZW50WSA9IDA7Ci0gICAgICAgIFNW
R1NWR0VsZW1lbnQqIHN2ZyA9IHN0YXRpY19jYXN0PFNWR1NWR0VsZW1lbnQqPihlbGVtZW50KCkp
OwotICAgICAgICBwYWludEluZm8uY29udGV4dC0+Y29uY2F0Q1RNKEFmZmluZVRyYW5zZm9ybSgp
LnNjYWxlKHN2Zy0+Y3VycmVudFNjYWxlKCkpKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBP
bmx5IHRoZSByb290IDxzdmc+IGVsZW1lbnQgc2hvdWxkIG5lZWQgYW55IHRyYW5zbGF0aW9ucyB1
c2luZyB0aGUgSFRNTC9DU1Mgc3lzdGVtCi0gICAgICAgIC8vIHBhcmVudFgsIHBhcmVudFkgYXJl
IGFsc28gbm9uLXplcm8gZm9yIGZpcnN0LWxldmVsIGtpZHMgb2YgdGhlc2UKLSAgICAgICAgLy8g
Q1NTLXRyYW5zZm9ybWVkIDxzdmc+IHJvb3QtZWxlbWVudHMgKGR1ZSB0byBSZW5kZXJCb3g6OnBh
aW50KSBmb3IgYW55IG90aGVyIGVsZW1lbnQKLSAgICAgICAgLy8gdGhleSBzaG91bGQgYmUgMC4g
ICBtX3gsIG1feSBzaG91bGQgYWx3YXlzIGJlIDAgZm9yIG5vbi1yb290IHN2ZyBjb250YWluZXJz
Ci0gICAgICAgIEFTU0VSVChtX3ggPT0gMCk7Ci0gICAgICAgIEFTU0VSVChtX3kgPT0gMCk7Ci0g
ICAgfQorICAgIC8vIE9ubHkgdGhlIHJvb3QgPHN2Zz4gZWxlbWVudCBzaG91bGQgbmVlZCBhbnkg
dHJhbnNsYXRpb25zIHVzaW5nIHRoZSBIVE1ML0NTUyBzeXN0ZW0KKyAgICAvLyBwYXJlbnRYLCBw
YXJlbnRZIGFyZSBhbHNvIG5vbi16ZXJvIGZvciBmaXJzdC1sZXZlbCBraWRzIG9mIHRoZXNlCisg
ICAgLy8gQ1NTLXRyYW5zZm9ybWVkIDxzdmc+IHJvb3QtZWxlbWVudHMgKGR1ZSB0byBSZW5kZXJC
b3g6OnBhaW50KSBmb3IgYW55IG90aGVyIGVsZW1lbnQKKyAgICAvLyB0aGV5IHNob3VsZCBiZSAw
LiAgIG1feCwgbV95IHNob3VsZCBhbHdheXMgYmUgMCBmb3Igbm9uLXJvb3Qgc3ZnIGNvbnRhaW5l
cnMKKyAgICBBU1NFUlQobV94ID09IDApOworICAgIEFTU0VSVChtX3kgPT0gMCk7CiAgICAgCiAg
ICAgaWYgKCF2aWV3cG9ydCgpLmlzRW1wdHkoKSkgewogICAgICAgICBpZiAoc3R5bGUoKS0+b3Zl
cmZsb3dYKCkgIT0gT1ZJU0lCTEUpCkBAIC0xNzMsMTAgKzE0NSw2IEBAIHZvaWQgUmVuZGVyU1ZH
Q29udGFpbmVyOjphcHBseUNvbnRlbnRUcmEKICAgICB9CiAgICAgaWYgKCFsb2NhbFRyYW5zZm9y
bSgpLmlzSWRlbnRpdHkoKSkKICAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPmNvbmNhdENUTShs
b2NhbFRyYW5zZm9ybSgpKTsKLSAgICBpZiAoaXNPdXRlcm1vc3RTVkcoKSkgewotICAgICAgICBT
VkdTVkdFbGVtZW50KiBzdmcgPSBzdGF0aWNfY2FzdDxTVkdTVkdFbGVtZW50Kj4oZWxlbWVudCgp
KTsKLSAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPmNvbmNhdENUTShBZmZpbmVUcmFuc2Zvcm0o
KS50cmFuc2xhdGUoc3ZnLT5jdXJyZW50VHJhbnNsYXRlKCkueCgpLCBzdmctPmN1cnJlbnRUcmFu
c2xhdGUoKS55KCkpKTsKLSAgICB9CiB9CiAKIHZvaWQgUmVuZGVyU1ZHQ29udGFpbmVyOjpwYWlu
dChQYWludEluZm8mIHBhaW50SW5mbywgaW50IHBhcmVudFgsIGludCBwYXJlbnRZKQpAQCAtMTg0
LDEwICsxNTIsNiBAQCB2b2lkIFJlbmRlclNWR0NvbnRhaW5lcjo6cGFpbnQoUGFpbnRJbmZvCiAg
ICAgaWYgKHBhaW50SW5mby5jb250ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkgfHwgIWRyYXdzQ29u
dGVudHMoKSkKICAgICAgICAgcmV0dXJuOwogCi0gICAgLy8gVGhpcyBzaG91bGQgb25seSBleGlz
dCBmb3IgPHN2Zz4gcmVuZGVyZXJzCi0gICAgaWYgKGlzT3V0ZXJtb3N0U1ZHKCkgJiYgaGFzQm94
RGVjb3JhdGlvbnMoKSAmJiAocGFpbnRJbmZvLnBoYXNlID09IFBhaW50UGhhc2VGb3JlZ3JvdW5k
IHx8IHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlU2VsZWN0aW9uKSkgCi0gICAgICAgIHBh
aW50Qm94RGVjb3JhdGlvbnMocGFpbnRJbmZvLCBtX3ggKyBwYXJlbnRYLCBtX3kgKyBwYXJlbnRZ
KTsKLQogICAgIGlmICghZmlyc3RDaGlsZCgpKSB7CiAjaWYgRU5BQkxFKFNWR19FWFBFUklNRU5U
QUxfRkVBVFVSRVMpCiAgICAgICAgIC8vIFNwZWM6IGdyb3VwcyB3L28gY2hpbGRyZW4gc3RpbGwg
bWF5IHJlbmRlciBmaWx0ZXIgY29udGVudC4KQEAgLTI4MywxNCArMjQ3LDE0IEBAIEZsb2F0UmVj
dCBSZW5kZXJTVkdDb250YWluZXI6OnZpZXdCb3goKSAKICAgICByZXR1cm4gbV92aWV3Qm94Owog
fQogCi12b2lkIFJlbmRlclNWR0NvbnRhaW5lcjo6c2V0QWxpZ24oS0NBbGlnbiBhbGlnbikKK3Zv
aWQgUmVuZGVyU1ZHQ29udGFpbmVyOjpzZXRBbGlnbihTVkdQcmVzZXJ2ZUFzcGVjdFJhdGlvOjpT
VkdQcmVzZXJ2ZUFzcGVjdFJhdGlvVHlwZSBhbGlnbikKIHsKICAgICBtX2FsaWduID0gYWxpZ247
CiAgICAgaWYgKHN0eWxlKCkpCiAgICAgICAgIHNldE5lZWRzTGF5b3V0KHRydWUpOwogfQogCi1L
Q0FsaWduIFJlbmRlclNWR0NvbnRhaW5lcjo6YWxpZ24oKSBjb25zdAorU1ZHUHJlc2VydmVBc3Bl
Y3RSYXRpbzo6U1ZHUHJlc2VydmVBc3BlY3RSYXRpb1R5cGUgUmVuZGVyU1ZHQ29udGFpbmVyOjph
bGlnbigpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1fYWxpZ247CiB9CkBAIC0zMDAsMTMgKzI2NCw4
IEBAIEFmZmluZVRyYW5zZm9ybSBSZW5kZXJTVkdDb250YWluZXI6OnZpZXcKICAgICAvLyBGSVhN
RTogVGhlIG1ldGhvZCBuYW1lIGlzIGNvbmZ1c2luZywgc2luY2UgaXQgZG9lcyBub3QKICAgICAv
LyBkbyB2aWV3cG9ydCB0cmFuc2xhdGluZyBhbnltb3JlLiBMb29rIGludG8gdGhpcyB3aGlsZQog
ICAgIC8vICBmaXhpbmcgYnVnIDEyMjA3LgotICAgIGlmICghdmlld0JveCgpLmlzRW1wdHkoKSkg
ewotICAgICAgICBGbG9hdFJlY3Qgdmlld3BvcnRSZWN0ID0gdmlld3BvcnQoKTsKLSAgICAgICAg
aWYgKGlzT3V0ZXJtb3N0U1ZHKCkpCi0gICAgICAgICAgICB2aWV3cG9ydFJlY3QgPSBGbG9hdFJl
Y3Qodmlld3BvcnQoKS54KCksIHZpZXdwb3J0KCkueSgpLCB3aWR0aCgpLCBoZWlnaHQoKSk7Ci0K
LSAgICAgICAgcmV0dXJuIGdldEFzcGVjdFJhdGlvKHZpZXdCb3goKSwgdmlld3BvcnRSZWN0KTsK
LSAgICB9CisgICAgaWYgKCF2aWV3Qm94KCkuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZ2V0
QXNwZWN0UmF0aW8odmlld0JveCgpLCB2aWV3cG9ydCgpKTsKIAogICAgIHJldHVybiBBZmZpbmVU
cmFuc2Zvcm0oKTsKIH0KQEAgLTM0MSwxMSArMzAwLDYgQEAgdm9pZCBSZW5kZXJTVkdDb250YWlu
ZXI6OmFic29sdXRlUmVjdHMoVgogQWZmaW5lVHJhbnNmb3JtIFJlbmRlclNWR0NvbnRhaW5lcjo6
YWJzb2x1dGVUcmFuc2Zvcm0oKSBjb25zdAogewogICAgIEFmZmluZVRyYW5zZm9ybSBjdG0gPSBS
ZW5kZXJDb250YWluZXI6OmFic29sdXRlVHJhbnNmb3JtKCk7Ci0gICAgaWYgKGlzT3V0ZXJtb3N0
U1ZHKCkpIHsKLSAgICAgICAgU1ZHU1ZHRWxlbWVudCogc3ZnID0gc3RhdGljX2Nhc3Q8U1ZHU1ZH
RWxlbWVudCo+KGVsZW1lbnQoKSk7Ci0gICAgICAgIGN0bS5zY2FsZShzdmctPmN1cnJlbnRTY2Fs
ZSgpKTsKLSAgICAgICAgY3RtLnRyYW5zbGF0ZShzdmctPmN1cnJlbnRUcmFuc2xhdGUoKS54KCks
IHN2Zy0+Y3VycmVudFRyYW5zbGF0ZSgpLnkoKSk7Ci0gICAgfQogICAgIGN0bS50cmFuc2xhdGUo
dmlld3BvcnQoKS54KCksIHZpZXdwb3J0KCkueSgpKTsKICAgICByZXR1cm4gdmlld3BvcnRUcmFu
c2Zvcm0oKSAqIGN0bTsKIH0KQEAgLTQxNywyNCArMzcxLDI0IEBAIEFmZmluZVRyYW5zZm9ybSBS
ZW5kZXJTVkdDb250YWluZXI6OmdldEEKICAgICBmbG9hdCB2cGFyID0gbG9naWNXaWR0aCAvIGxv
Z2ljSGVpZ2h0OwogICAgIGZsb2F0IHN2Z2FyID0gcGh5c1dpZHRoIC8gcGh5c0hlaWdodDsKIAot
ICAgIGlmIChhbGlnbigpID09IEFMSUdOX05PTkUpIHsKKyAgICBpZiAoYWxpZ24oKSA9PSBTVkdQ
cmVzZXJ2ZUFzcGVjdFJhdGlvOjpTVkdfUFJFU0VSVkVBU1BFQ1RSQVRJT19OT05FKSB7CiAgICAg
ICAgIHRlbXAuc2NhbGUocGh5c1dpZHRoIC8gbG9naWNXaWR0aCwgcGh5c0hlaWdodCAvIGxvZ2lj
SGVpZ2h0KTsKICAgICAgICAgdGVtcC50cmFuc2xhdGUoLWxvZ2ljWCwgLWxvZ2ljWSk7CiAgICAg
fSBlbHNlIGlmICgodnBhciA8IHN2Z2FyICYmICFzbGljZSgpKSB8fCAodnBhciA+PSBzdmdhciAm
JiBzbGljZSgpKSkgewogICAgICAgICB0ZW1wLnNjYWxlKHBoeXNIZWlnaHQgLyBsb2dpY0hlaWdo
dCwgcGh5c0hlaWdodCAvIGxvZ2ljSGVpZ2h0KTsKIAotICAgICAgICBpZiAoYWxpZ24oKSA9PSBB
TElHTl9YTUlOWU1JTiB8fCBhbGlnbigpID09IEFMSUdOX1hNSU5ZTUlEIHx8IGFsaWduKCkgPT0g
QUxJR05fWE1JTllNQVgpCisgICAgICAgIGlmIChhbGlnbigpID09IFNWR1ByZXNlcnZlQXNwZWN0
UmF0aW86OlNWR19QUkVTRVJWRUFTUEVDVFJBVElPX1hNSU5ZTUlOIHx8IGFsaWduKCkgPT0gU1ZH
UHJlc2VydmVBc3BlY3RSYXRpbzo6U1ZHX1BSRVNFUlZFQVNQRUNUUkFUSU9fWE1JTllNSUQgfHwg
YWxpZ24oKSA9PSBTVkdQcmVzZXJ2ZUFzcGVjdFJhdGlvOjpTVkdfUFJFU0VSVkVBU1BFQ1RSQVRJ
T19YTUlOWU1BWCkKICAgICAgICAgICAgIHRlbXAudHJhbnNsYXRlKC1sb2dpY1gsIC1sb2dpY1kp
OwotICAgICAgICBlbHNlIGlmIChhbGlnbigpID09IEFMSUdOX1hNSURZTUlOIHx8IGFsaWduKCkg
PT0gQUxJR05fWE1JRFlNSUQgfHwgYWxpZ24oKSA9PSBBTElHTl9YTUlEWU1BWCkKKyAgICAgICAg
ZWxzZSBpZiAoYWxpZ24oKSA9PSBTVkdQcmVzZXJ2ZUFzcGVjdFJhdGlvOjpTVkdfUFJFU0VSVkVB
U1BFQ1RSQVRJT19YTUlEWU1JTiB8fCBhbGlnbigpID09IFNWR1ByZXNlcnZlQXNwZWN0UmF0aW86
OlNWR19QUkVTRVJWRUFTUEVDVFJBVElPX1hNSURZTUlEIHx8IGFsaWduKCkgPT0gU1ZHUHJlc2Vy
dmVBc3BlY3RSYXRpbzo6U1ZHX1BSRVNFUlZFQVNQRUNUUkFUSU9fWE1JRFlNQVgpCiAgICAgICAg
ICAgICB0ZW1wLnRyYW5zbGF0ZSgtbG9naWNYIC0gKGxvZ2ljV2lkdGggLSBwaHlzV2lkdGggKiBs
b2dpY0hlaWdodCAvIHBoeXNIZWlnaHQpIC8gMiwgLWxvZ2ljWSk7CiAgICAgICAgIGVsc2UKICAg
ICAgICAgICAgIHRlbXAudHJhbnNsYXRlKC1sb2dpY1ggLSAobG9naWNXaWR0aCAtIHBoeXNXaWR0
aCAqIGxvZ2ljSGVpZ2h0IC8gcGh5c0hlaWdodCksIC1sb2dpY1kpOwogICAgIH0gZWxzZSB7CiAg
ICAgICAgIHRlbXAuc2NhbGUocGh5c1dpZHRoIC8gbG9naWNXaWR0aCwgcGh5c1dpZHRoIC8gbG9n
aWNXaWR0aCk7CiAKLSAgICAgICAgaWYgKGFsaWduKCkgPT0gQUxJR05fWE1JTllNSU4gfHwgYWxp
Z24oKSA9PSBBTElHTl9YTUlEWU1JTiB8fCBhbGlnbigpID09IEFMSUdOX1hNQVhZTUlOKQorICAg
ICAgICBpZiAoYWxpZ24oKSA9PSBTVkdQcmVzZXJ2ZUFzcGVjdFJhdGlvOjpTVkdfUFJFU0VSVkVB
U1BFQ1RSQVRJT19YTUlOWU1JTiB8fCBhbGlnbigpID09IFNWR1ByZXNlcnZlQXNwZWN0UmF0aW86
OlNWR19QUkVTRVJWRUFTUEVDVFJBVElPX1hNSURZTUlOIHx8IGFsaWduKCkgPT0gU1ZHUHJlc2Vy
dmVBc3BlY3RSYXRpbzo6U1ZHX1BSRVNFUlZFQVNQRUNUUkFUSU9fWE1BWFlNSU4pCiAgICAgICAg
ICAgICB0ZW1wLnRyYW5zbGF0ZSgtbG9naWNYLCAtbG9naWNZKTsKLSAgICAgICAgZWxzZSBpZiAo
YWxpZ24oKSA9PSBBTElHTl9YTUlOWU1JRCB8fCBhbGlnbigpID09IEFMSUdOX1hNSURZTUlEIHx8
IGFsaWduKCkgPT0gQUxJR05fWE1BWFlNSUQpCisgICAgICAgIGVsc2UgaWYgKGFsaWduKCkgPT0g
U1ZHUHJlc2VydmVBc3BlY3RSYXRpbzo6U1ZHX1BSRVNFUlZFQVNQRUNUUkFUSU9fWE1JTllNSUQg
fHwgYWxpZ24oKSA9PSBTVkdQcmVzZXJ2ZUFzcGVjdFJhdGlvOjpTVkdfUFJFU0VSVkVBU1BFQ1RS
QVRJT19YTUlEWU1JRCB8fCBhbGlnbigpID09IFNWR1ByZXNlcnZlQXNwZWN0UmF0aW86OlNWR19Q
UkVTRVJWRUFTUEVDVFJBVElPX1hNQVhZTUlEKQogICAgICAgICAgICAgdGVtcC50cmFuc2xhdGUo
LWxvZ2ljWCwgLWxvZ2ljWSAtIChsb2dpY0hlaWdodCAtIHBoeXNIZWlnaHQgKiBsb2dpY1dpZHRo
IC8gcGh5c1dpZHRoKSAvIDIpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICB0ZW1wLnRyYW5z
bGF0ZSgtbG9naWNYLCAtbG9naWNZIC0gKGxvZ2ljSGVpZ2h0IC0gcGh5c0hlaWdodCAqIGxvZ2lj
V2lkdGggLyBwaHlzV2lkdGgpKTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclNWR0Nv
bnRhaW5lci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclNWR0NvbnRh
aW5lci5oCShyZXZpc2lvbiAyMjA5OCkKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclNWR0Nv
bnRhaW5lci5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNywyMiArMjcsMTAgQEAKIAogI2luY2x1ZGUg
IlJlbmRlckNvbnRhaW5lci5oIgogI2luY2x1ZGUgIlJlbmRlclBhdGguaCIKKyNpbmNsdWRlICJT
VkdQcmVzZXJ2ZUFzcGVjdFJhdGlvLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotZW51bSBL
Q0FsaWduIHsKLSAgICBBTElHTl9OT05FID0gMCwKLSAgICBBTElHTl9YTUlOWU1JTiA9IDEsCi0g
ICAgQUxJR05fWE1JRFlNSU4gPSAyLAotICAgIEFMSUdOX1hNQVhZTUlOID0gMywKLSAgICBBTElH
Tl9YTUlOWU1JRCA9IDQsCi0gICAgQUxJR05fWE1JRFlNSUQgPSA1LAotICAgIEFMSUdOX1hNQVhZ
TUlEID0gNiwKLSAgICBBTElHTl9YTUlOWU1BWCA9IDcsCi0gICAgQUxJR05fWE1JRFlNQVggPSA4
LAotICAgIEFMSUdOX1hNQVhZTUFYID0gOQotfTsKLQogY2xhc3MgU1ZHRWxlbWVudDsKIAogY2xh
c3MgUmVuZGVyU1ZHQ29udGFpbmVyIDogcHVibGljIFJlbmRlckNvbnRhaW5lciB7CkBAIC04NCw4
ICs3Miw4IEBAIHB1YmxpYzoKICAgICB2b2lkIHNldFZpZXdCb3goY29uc3QgRmxvYXRSZWN0Jik7
CiAgICAgRmxvYXRSZWN0IHZpZXdCb3goKSBjb25zdDsKIAotICAgIHZvaWQgc2V0QWxpZ24oS0NB
bGlnbik7Ci0gICAgS0NBbGlnbiBhbGlnbigpIGNvbnN0OworICAgIHZvaWQgc2V0QWxpZ24oU1ZH
UHJlc2VydmVBc3BlY3RSYXRpbzo6U1ZHUHJlc2VydmVBc3BlY3RSYXRpb1R5cGUpOworICAgIFNW
R1ByZXNlcnZlQXNwZWN0UmF0aW86OlNWR1ByZXNlcnZlQXNwZWN0UmF0aW9UeXBlIGFsaWduKCkg
Y29uc3Q7CiAKICAgICB2b2lkIHNldFNsaWNlKGJvb2wpOwogICAgIGJvb2wgc2xpY2UoKSBjb25z
dDsKQEAgLTk0LDggKzgyLDYgQEAgcHVibGljOgogICAgIAogICAgIHZpcnR1YWwgYm9vbCBub2Rl
QXRQb2ludChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50
IHksIGludCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uKTsKICAgICAKLSAgICBib29sIGlzT3V0
ZXJtb3N0U1ZHKCkgY29uc3Q7Ci0KIHByaXZhdGU6CiAgICAgdm9pZCBjYWxjVmlld3BvcnQoKTsg
CiAgICAgQWZmaW5lVHJhbnNmb3JtIGdldEFzcGVjdFJhdGlvKGNvbnN0IEZsb2F0UmVjdCYgbG9n
aWNhbCwgY29uc3QgRmxvYXRSZWN0JiBwaHlzaWNhbCkgY29uc3Q7CkBAIC0xMDcsNyArOTMsNyBA
QCBwcml2YXRlOgogICAgIAogICAgIEZsb2F0UmVjdCBtX3ZpZXdwb3J0OwogICAgIEZsb2F0UmVj
dCBtX3ZpZXdCb3g7Ci0gICAgS0NBbGlnbiBtX2FsaWduOworICAgIFNWR1ByZXNlcnZlQXNwZWN0
UmF0aW86OlNWR1ByZXNlcnZlQXNwZWN0UmF0aW9UeXBlIG1fYWxpZ247CiAgICAgSW50UmVjdCBt
X2Fic29sdXRlQm91bmRzOwogfTsKIApJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyU1ZH
Um9vdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyU1ZHUm9vdC5j
cHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJTVkdSb290LmNwcAko
cmV2aXNpb24gMCkKQEAgLTAsMCArMSw0MzcgQEAKKy8qCisgICAgQ29weXJpZ2h0IChDKSAyMDA0
LCAyMDA1LCAyMDA3IE5pa29sYXMgWmltbWVybWFubiA8emltbWVybWFubkBrZGUub3JnPgorICAg
ICAgICAgICAgICAgICAgMjAwNCwgMjAwNSwgMjAwNyBSb2IgQnVpcyA8YnVpc0BrZGUub3JnPgor
ICAgICAgICAgICAgICAgICAgMjAwNyBFcmljIFNlaWRlbCA8ZXJpY0B3ZWJraXQub3JnPgorCisg
ICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEtERSBwcm9qZWN0CisKKyAgICBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAg
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0
ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBB
TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1F
UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0
aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFp
bHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWludCB3aXRoIHRoaXMgbGlicmFyeTsg
c2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICAgIHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwK
KyAgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKworI2lmIEVOQUJMRShTVkcpCisjaW5jbHVkZSAiUmVuZGVyU1ZHUm9vdC5oIgorCisjaW5j
bHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiUmVuZGVyVmlldy5oIgorI2luY2x1
ZGUgIlNWR0xlbmd0aC5oIgorI2luY2x1ZGUgIlNWR1JlbmRlclN1cHBvcnQuaCIKKyNpbmNsdWRl
ICJTVkdSZXNvdXJjZUNsaXBwZXIuaCIKKyNpbmNsdWRlICJTVkdSZXNvdXJjZUZpbHRlci5oIgor
I2luY2x1ZGUgIlNWR1Jlc291cmNlTWFza2VyLmgiCisjaW5jbHVkZSAiU1ZHU1ZHRWxlbWVudC5o
IgorI2luY2x1ZGUgIlNWR1N0eWxlZEVsZW1lbnQuaCIKKyNpbmNsdWRlICJTVkdVUklSZWZlcmVu
Y2UuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitSZW5kZXJTVkdSb290OjpSZW5kZXJTVkdS
b290KFNWR1N0eWxlZEVsZW1lbnQqIG5vZGUpCisgICAgOiBSZW5kZXJDb250YWluZXIobm9kZSkK
KyAgICAsIG1fc2xpY2UoZmFsc2UpCit7CisgICAgc2V0UmVwbGFjZWQodHJ1ZSk7Cit9CisKK1Jl
bmRlclNWR1Jvb3Q6On5SZW5kZXJTVkdSb290KCkKK3sKK30KKworQWZmaW5lVHJhbnNmb3JtIFJl
bmRlclNWR1Jvb3Q6OmxvY2FsVHJhbnNmb3JtKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9tYXRy
aXg7Cit9CisKK3ZvaWQgUmVuZGVyU1ZHUm9vdDo6c2V0TG9jYWxUcmFuc2Zvcm0oY29uc3QgQWZm
aW5lVHJhbnNmb3JtJiBtYXRyaXgpCit7CisgICAgbV9tYXRyaXggPSBtYXRyaXg7Cit9CisKK2Jv
b2wgUmVuZGVyU1ZHUm9vdDo6cmVxdWlyZXNMYXllcigpCit7CisgICAgLy8gT25seSBhbGxvdyBh
biA8c3ZnPiBlbGVtZW50IHRvIGdlbmVyYXRlIGEgbGF5ZXIgd2hlbiBpdCdzIHBvc2l0aW9uZWQg
aW4gYSBub24tU1ZHIGNvbnRleHQKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3Nob3J0IFJlbmRl
clNWR1Jvb3Q6OmxpbmVIZWlnaHQoYm9vbCBiLCBib29sIGlzUm9vdExpbmVCb3gpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGhlaWdodCgpICsgbWFyZ2luVG9wKCkgKyBtYXJnaW5Cb3R0b20oKTsKK30K
Kworc2hvcnQgUmVuZGVyU1ZHUm9vdDo6YmFzZWxpbmVQb3NpdGlvbihib29sIGIsIGJvb2wgaXNS
b290TGluZUJveCkgY29uc3QKK3sKKyAgICByZXR1cm4gaGVpZ2h0KCkgKyBtYXJnaW5Ub3AoKSAr
IG1hcmdpbkJvdHRvbSgpOworfQorCit2b2lkIFJlbmRlclNWR1Jvb3Q6OmxheW91dCgpCit7Cisg
ICAgQVNTRVJUKG5lZWRzTGF5b3V0KCkpOworCisgICAgY2FsY1ZpZXdwb3J0KCk7CisKKyAgICAv
LyBBcmJpdHJhcnkgYWZmaW5lIHRyYW5zZm9ybXMgYXJlIGluY29tcGF0aWJsZSB3aXRoIExheW91
dFN0YXRlLgorICAgIHZpZXcoKS0+ZGlzYWJsZUxheW91dFN0YXRlKCk7CisKKyAgICBJbnRSZWN0
IG9sZEJvdW5kczsKKyAgICBJbnRSZWN0IG9sZE91dGxpbmVCb3g7CisgICAgYm9vbCBjaGVja0Zv
clJlcGFpbnQgPSBjaGVja0ZvclJlcGFpbnREdXJpbmdMYXlvdXQoKTsKKyAgICBpZiAoc2VsZk5l
ZWRzTGF5b3V0KCkgJiYgY2hlY2tGb3JSZXBhaW50KSB7CisgICAgICAgIG9sZEJvdW5kcyA9IG1f
YWJzb2x1dGVCb3VuZHM7CisgICAgICAgIG9sZE91dGxpbmVCb3ggPSBhYnNvbHV0ZU91dGxpbmVC
b3goKTsKKyAgICB9CisKKyAgICBSZW5kZXJPYmplY3QqIGNoaWxkID0gZmlyc3RDaGlsZCgpOwor
ICAgIHdoaWxlIChjaGlsZCkgeworICAgICAgICAvLyBGSVhNRTogVGhpcyBjaGVjayBpcyBib2d1
cywgc2VlIGh0dHA6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0MDAzCisgICAg
ICAgIGlmICghY2hpbGQtPmlzUmVuZGVyUGF0aCgpIHx8IHN0YXRpY19jYXN0PFJlbmRlclBhdGgq
PihjaGlsZCktPmhhc1JlbGF0aXZlVmFsdWVzKCkpCisgICAgICAgICAgICBjaGlsZC0+c2V0TmVl
ZHNMYXlvdXQodHJ1ZSk7CisKKyAgICAgICAgY2hpbGQtPmxheW91dElmTmVlZGVkKCk7CisgICAg
ICAgIEFTU0VSVCghY2hpbGQtPm5lZWRzTGF5b3V0KCkpOworICAgICAgICBjaGlsZCA9IGNoaWxk
LT5uZXh0U2libGluZygpOworICAgIH0KKworICAgIGNhbGNXaWR0aCgpOworICAgIGNhbGNIZWln
aHQoKTsKKworICAgIG1fYWJzb2x1dGVCb3VuZHMgPSBhYnNvbHV0ZUNsaXBwZWRPdmVyZmxvd1Jl
Y3QoKTsKKyAgICBTVkdTVkdFbGVtZW50KiBzdmcgPSBzdGF0aWNfY2FzdDxTVkdTVkdFbGVtZW50
Kj4oZWxlbWVudCgpKTsKKyAgICBtX3dpZHRoID0gbV93aWR0aCAqIHN2Zy0+Y3VycmVudFNjYWxl
KCk7CisgICAgbV9oZWlnaHQgPSBtX2hlaWdodCAqIHN2Zy0+Y3VycmVudFNjYWxlKCk7CisKKyAg
ICBpZiAoc2VsZk5lZWRzTGF5b3V0KCkgJiYgY2hlY2tGb3JSZXBhaW50KQorICAgICAgICByZXBh
aW50QWZ0ZXJMYXlvdXRJZk5lZWRlZChvbGRCb3VuZHMsIG9sZE91dGxpbmVCb3gpOworCisgICAg
dmlldygpLT5lbmFibGVMYXlvdXRTdGF0ZSgpOworICAgIHNldE5lZWRzTGF5b3V0KGZhbHNlKTsK
K30KKwordm9pZCBSZW5kZXJTVkdSb290OjphcHBseUNvbnRlbnRUcmFuc2Zvcm1zKFBhaW50SW5m
byYgcGFpbnRJbmZvLCBpbnQmIHBhcmVudFgsIGludCYgcGFyZW50WSkKK3sKKyAgICAvLyBUcmFu
c2xhdGUgZnJvbSBwYXJlbnQgb2Zmc2V0cyAoaHRtbCByZW5kZXJlcnMpIHRvIGEgcmVsYXRpdmUg
dHJhbnNmb3JtIChzdmcgcmVuZGVyZXJzKQorICAgIEludFBvaW50IG9yaWdpbjsKKyAgICBvcmln
aW4ubW92ZShwYXJlbnRYLCBwYXJlbnRZKTsKKyAgICBvcmlnaW4ubW92ZShtX3gsIG1feSk7Cisg
ICAgb3JpZ2luLm1vdmUoYm9yZGVyTGVmdCgpLCBib3JkZXJUb3AoKSk7CisgICAgb3JpZ2luLm1v
dmUocGFkZGluZ0xlZnQoKSwgcGFkZGluZ1RvcCgpKTsKKyAgICBpZiAob3JpZ2luLngoKSB8fCBv
cmlnaW4ueSgpKSB7CisgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5jb25jYXRDVE0oQWZmaW5l
VHJhbnNmb3JtKCkudHJhbnNsYXRlKG9yaWdpbi54KCksIG9yaWdpbi55KCkpKTsKKyAgICAgICAg
cGFpbnRJbmZvLnJlY3QubW92ZSgtb3JpZ2luLngoKSwgLW9yaWdpbi55KCkpOworICAgIH0KKyAg
ICBwYXJlbnRYID0gcGFyZW50WSA9IDA7CisgICAgU1ZHU1ZHRWxlbWVudCogc3ZnID0gc3RhdGlj
X2Nhc3Q8U1ZHU1ZHRWxlbWVudCo+KGVsZW1lbnQoKSk7CisgICAgcGFpbnRJbmZvLmNvbnRleHQt
PmNvbmNhdENUTShBZmZpbmVUcmFuc2Zvcm0oKS5zY2FsZShzdmctPmN1cnJlbnRTY2FsZSgpKSk7
CisgICAgCisgICAgaWYgKCF2aWV3cG9ydCgpLmlzRW1wdHkoKSkgeworICAgICAgICBpZiAoc3R5
bGUoKS0+b3ZlcmZsb3dYKCkgIT0gT1ZJU0lCTEUpCisgICAgICAgICAgICBwYWludEluZm8uY29u
dGV4dC0+Y2xpcChlbmNsb3NpbmdJbnRSZWN0KHZpZXdwb3J0KCkpKTsgLy8gRklYTUU6IEV2ZW50
dWFsbHkgd2UnbGwgd2FudCBmbG9hdC1wcmVjaXNpb24gY2xpcHBpbmcKKyAgICAgICAgCisgICAg
ICAgIHBhaW50SW5mby5jb250ZXh0LT5jb25jYXRDVE0oQWZmaW5lVHJhbnNmb3JtKCkudHJhbnNs
YXRlKHZpZXdwb3J0KCkueCgpLCB2aWV3cG9ydCgpLnkoKSkpOworICAgIH0KKyAgICBpZiAoIWxv
Y2FsVHJhbnNmb3JtKCkuaXNJZGVudGl0eSgpKQorICAgICAgICBwYWludEluZm8uY29udGV4dC0+
Y29uY2F0Q1RNKGxvY2FsVHJhbnNmb3JtKCkpOworICAgIHBhaW50SW5mby5jb250ZXh0LT5jb25j
YXRDVE0oQWZmaW5lVHJhbnNmb3JtKCkudHJhbnNsYXRlKHN2Zy0+Y3VycmVudFRyYW5zbGF0ZSgp
LngoKSwgc3ZnLT5jdXJyZW50VHJhbnNsYXRlKCkueSgpKSk7Cit9CisKK3ZvaWQgUmVuZGVyU1ZH
Um9vdDo6cGFpbnQoUGFpbnRJbmZvJiBwYWludEluZm8sIGludCBwYXJlbnRYLCBpbnQgcGFyZW50
WSkKK3sKKyAgICBpZiAocGFpbnRJbmZvLmNvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgLy8gVGhpcyBzaG91bGQgb25seSBleGlzdCBmb3IgPHN2Zz4g
cmVuZGVyZXJzCisgICAgaWYgKGhhc0JveERlY29yYXRpb25zKCkgJiYgKHBhaW50SW5mby5waGFz
ZSA9PSBQYWludFBoYXNlRm9yZWdyb3VuZCB8fCBwYWludEluZm8ucGhhc2UgPT0gUGFpbnRQaGFz
ZVNlbGVjdGlvbikpIAorICAgICAgICBwYWludEJveERlY29yYXRpb25zKHBhaW50SW5mbywgbV94
ICsgcGFyZW50WCwgbV95ICsgcGFyZW50WSk7CisKKyAgICBpZiAoIWZpcnN0Q2hpbGQoKSkgewor
I2lmIEVOQUJMRShTVkdfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTKQorICAgICAgICAvLyBTcGVjOiBn
cm91cHMgdy9vIGNoaWxkcmVuIHN0aWxsIG1heSByZW5kZXIgZmlsdGVyIGNvbnRlbnQuCisgICAg
ICAgIGNvbnN0IFNWR1JlbmRlclN0eWxlKiBzdmdTdHlsZSA9IHN0eWxlKCktPnN2Z1N0eWxlKCk7
CisgICAgICAgIEF0b21pY1N0cmluZyBmaWx0ZXJJZChTVkdVUklSZWZlcmVuY2U6OmdldFRhcmdl
dChzdmdTdHlsZS0+ZmlsdGVyKCkpKTsKKyAgICAgICAgU1ZHUmVzb3VyY2VGaWx0ZXIqIGZpbHRl
ciA9IGdldEZpbHRlckJ5SWQoZG9jdW1lbnQoKSwgZmlsdGVySWQpOworICAgICAgICBpZiAoIWZp
bHRlcikKKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBwYWlu
dEluZm8uY29udGV4dC0+c2F2ZSgpOworICAgIAorICAgIGFwcGx5Q29udGVudFRyYW5zZm9ybXMo
cGFpbnRJbmZvLCBwYXJlbnRYLCBwYXJlbnRZKTsKKworI2lmIEVOQUJMRShTVkdfRVhQRVJJTUVO
VEFMX0ZFQVRVUkVTKQorICAgIFNWR1Jlc291cmNlRmlsdGVyKiBmaWx0ZXIgPSAwOworI2Vsc2UK
KyAgICB2b2lkKiBmaWx0ZXIgPSAwOworI2VuZGlmCisgICAgRmxvYXRSZWN0IGJvdW5kaW5nQm94
ID0gcmVsYXRpdmVCQm94KHRydWUpOworICAgIGZsb2F0IG9wYWNpdHkgPSBzdHlsZSgpLT5vcGFj
aXR5KCk7CisgICAgaWYgKHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlRm9yZWdyb3VuZCkg
eworICAgICAgICBwcmVwYXJlVG9SZW5kZXJTVkdDb250ZW50KHRoaXMsIHBhaW50SW5mbywgYm91
bmRpbmdCb3gsIGZpbHRlcik7CisgICAgICAgIAorICAgICAgICBpZiAob3BhY2l0eSA8IDEuMGYp
IHsKKyAgICAgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5jbGlwKGVuY2xvc2luZ0ludFJlY3Qo
Ym91bmRpbmdCb3gpKTsKKyAgICAgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5iZWdpblRyYW5z
cGFyZW5jeUxheWVyKG9wYWNpdHkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCF2aWV3
Qm94KCkuaXNFbXB0eSgpKQorICAgICAgICBwYWludEluZm8uY29udGV4dC0+Y29uY2F0Q1RNKHZp
ZXdwb3J0VHJhbnNmb3JtKCkpOworCisgICAgUmVuZGVyQ29udGFpbmVyOjpwYWludChwYWludElu
Zm8sIDAsIDApOworCisgICAgaWYgKHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlRm9yZWdy
b3VuZCkgeworI2lmIEVOQUJMRShTVkdfRVhQRVJJTUVOVEFMX0ZFQVRVUkVTKQorICAgICAgICBp
ZiAoZmlsdGVyKQorICAgICAgICAgICAgZmlsdGVyLT5hcHBseUZpbHRlcihwYWludEluZm8uY29u
dGV4dCwgYm91bmRpbmdCb3gpOworI2VuZGlmCisKKyAgICAgICAgaWYgKG9wYWNpdHkgPCAxLjBm
KQorICAgICAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPmVuZFRyYW5zcGFyZW5jeUxheWVyKCk7
CisgICAgfQorCisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnJlc3RvcmUoKTsKKyAgICAKKyAgICBp
ZiAoKHBhaW50SW5mby5waGFzZSA9PSBQYWludFBoYXNlT3V0bGluZSB8fCBwYWludEluZm8ucGhh
c2UgPT0gUGFpbnRQaGFzZVNlbGZPdXRsaW5lKSAmJiBzdHlsZSgpLT5vdXRsaW5lV2lkdGgoKSAm
JiBzdHlsZSgpLT52aXNpYmlsaXR5KCkgPT0gVklTSUJMRSkKKyAgICAgICAgcGFpbnRPdXRsaW5l
KHBhaW50SW5mby5jb250ZXh0LCBtX2Fic29sdXRlQm91bmRzLngoKSwgbV9hYnNvbHV0ZUJvdW5k
cy55KCksIG1fYWJzb2x1dGVCb3VuZHMud2lkdGgoKSwgbV9hYnNvbHV0ZUJvdW5kcy5oZWlnaHQo
KSwgc3R5bGUoKSk7Cit9CisKK0Zsb2F0UmVjdCBSZW5kZXJTVkdSb290Ojp2aWV3cG9ydCgpIGNv
bnN0Cit7CisgICAgcmV0dXJuIG1fdmlld3BvcnQ7Cit9CisKK3ZvaWQgUmVuZGVyU1ZHUm9vdDo6
Y2FsY1ZpZXdwb3J0KCkKK3sKKyAgICBTVkdFbGVtZW50KiBzdmdlbGVtID0gc3RhdGljX2Nhc3Q8
U1ZHRWxlbWVudCo+KGVsZW1lbnQoKSk7CisgICAgaWYgKHN2Z2VsZW0tPmhhc1RhZ05hbWUoU1ZH
TmFtZXM6OnN2Z1RhZykpIHsKKyAgICAgICAgU1ZHU1ZHRWxlbWVudCogc3ZnID0gc3RhdGljX2Nh
c3Q8U1ZHU1ZHRWxlbWVudCo+KGVsZW1lbnQoKSk7CisKKyAgICAgICAgaWYgKCFzZWxmTmVlZHNM
YXlvdXQoKSAmJiAhc3ZnLT5oYXNSZWxhdGl2ZVZhbHVlcygpKQorICAgICAgICAgICAgcmV0dXJu
OworCisgICAgICAgIGRvdWJsZSB4ID0gc3ZnLT54KCkudmFsdWUoKTsKKyAgICAgICAgZG91Ymxl
IHkgPSBzdmctPnkoKS52YWx1ZSgpOworICAgICAgICBkb3VibGUgdyA9IHN2Zy0+d2lkdGgoKS52
YWx1ZSgpOworICAgICAgICBkb3VibGUgaCA9IHN2Zy0+aGVpZ2h0KCkudmFsdWUoKTsKKyAgICAg
ICAgbV92aWV3cG9ydCA9IEZsb2F0UmVjdCh4LCB5LCB3LCBoKTsKKyAgICB9Cit9CisKK3ZvaWQg
UmVuZGVyU1ZHUm9vdDo6c2V0Vmlld0JveChjb25zdCBGbG9hdFJlY3QmIHZpZXdCb3gpCit7Cisg
ICAgbV92aWV3Qm94ID0gdmlld0JveDsKKworICAgIGlmIChzdHlsZSgpKQorICAgICAgICBzZXRO
ZWVkc0xheW91dCh0cnVlKTsKK30KKworRmxvYXRSZWN0IFJlbmRlclNWR1Jvb3Q6OnZpZXdCb3go
KSBjb25zdAoreworICAgIHJldHVybiBtX3ZpZXdCb3g7Cit9CisKK3ZvaWQgUmVuZGVyU1ZHUm9v
dDo6c2V0QWxpZ24oU1ZHUHJlc2VydmVBc3BlY3RSYXRpbzo6U1ZHUHJlc2VydmVBc3BlY3RSYXRp
b1R5cGUgYWxpZ24pCit7CisgICAgbV9hbGlnbiA9IGFsaWduOworICAgIGlmIChzdHlsZSgpKQor
ICAgICAgICBzZXROZWVkc0xheW91dCh0cnVlKTsKK30KKworU1ZHUHJlc2VydmVBc3BlY3RSYXRp
bzo6U1ZHUHJlc2VydmVBc3BlY3RSYXRpb1R5cGUgUmVuZGVyU1ZHUm9vdDo6YWxpZ24oKSBjb25z
dAoreworICAgIHJldHVybiBtX2FsaWduOworfQorCitBZmZpbmVUcmFuc2Zvcm0gUmVuZGVyU1ZH
Um9vdDo6dmlld3BvcnRUcmFuc2Zvcm0oKSBjb25zdAoreworICAgIC8vIEZJWE1FOiBUaGUgbWV0
aG9kIG5hbWUgaXMgY29uZnVzaW5nLCBzaW5jZSBpdCBkb2VzIG5vdAorICAgIC8vIGRvIHZpZXdw
b3J0IHRyYW5zbGF0aW5nIGFueW1vcmUuIExvb2sgaW50byB0aGlzIHdoaWxlCisgICAgLy8gIGZp
eGluZyBidWcgMTIyMDcuCisgICAgaWYgKCF2aWV3Qm94KCkuaXNFbXB0eSgpKSB7CisgICAgICAg
IEZsb2F0UmVjdCB2aWV3cG9ydFJlY3QgPSB2aWV3cG9ydCgpOworICAgICAgICB2aWV3cG9ydFJl
Y3QgPSBGbG9hdFJlY3Qodmlld3BvcnQoKS54KCksIHZpZXdwb3J0KCkueSgpLCB3aWR0aCgpLCBo
ZWlnaHQoKSk7CisKKyAgICAgICAgcmV0dXJuIGdldEFzcGVjdFJhdGlvKHZpZXdCb3goKSwgdmll
d3BvcnRSZWN0KTsKKyAgICB9CisKKyAgICByZXR1cm4gQWZmaW5lVHJhbnNmb3JtKCk7Cit9CisK
K0ludFJlY3QgUmVuZGVyU1ZHUm9vdDo6YWJzb2x1dGVDbGlwcGVkT3ZlcmZsb3dSZWN0KCkKK3sK
KyAgICBJbnRSZWN0IHJlcGFpbnRSZWN0OworCisgICAgZm9yIChSZW5kZXJPYmplY3QqIGN1cnJl
bnQgPSBmaXJzdENoaWxkKCk7IGN1cnJlbnQgIT0gMDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHRT
aWJsaW5nKCkpCisgICAgICAgIHJlcGFpbnRSZWN0LnVuaXRlKGN1cnJlbnQtPmFic29sdXRlQ2xp
cHBlZE92ZXJmbG93UmVjdCgpKTsKKworI2lmIEVOQUJMRShTVkdfRVhQRVJJTUVOVEFMX0ZFQVRV
UkVTKQorICAgIC8vIEZpbHRlcnMgY2FuIGV4cGFuZCB0aGUgYm91bmRpbmcgYm94CisgICAgU1ZH
UmVzb3VyY2VGaWx0ZXIqIGZpbHRlciA9IGdldEZpbHRlckJ5SWQoZG9jdW1lbnQoKSwgU1ZHVVJJ
UmVmZXJlbmNlOjpnZXRUYXJnZXQoc3R5bGUoKS0+c3ZnU3R5bGUoKS0+ZmlsdGVyKCkpKTsKKyAg
ICBpZiAoZmlsdGVyKQorICAgICAgICByZXBhaW50UmVjdC51bml0ZShlbmNsb3NpbmdJbnRSZWN0
KGZpbHRlci0+ZmlsdGVyQkJveEZvckl0ZW1CQm94KHJlcGFpbnRSZWN0KSkpOworI2VuZGlmCisK
KyAgICByZXR1cm4gcmVwYWludFJlY3Q7Cit9CisKK3ZvaWQgUmVuZGVyU1ZHUm9vdDo6YWRkRm9j
dXNSaW5nUmVjdHMoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGludCB0eCwgaW50
IHR5KQoreworICAgIGdyYXBoaWNzQ29udGV4dC0+YWRkRm9jdXNSaW5nUmVjdChtX2Fic29sdXRl
Qm91bmRzKTsKK30KKwordm9pZCBSZW5kZXJTVkdSb290OjphYnNvbHV0ZVJlY3RzKFZlY3RvcjxJ
bnRSZWN0PiYgcmVjdHMsIGludCwgaW50KQoreworICAgIHJlY3RzLmFwcGVuZChhYnNvbHV0ZUNs
aXBwZWRPdmVyZmxvd1JlY3QoKSk7Cit9CisKK0FmZmluZVRyYW5zZm9ybSBSZW5kZXJTVkdSb290
OjphYnNvbHV0ZVRyYW5zZm9ybSgpIGNvbnN0Cit7CisgICAgQWZmaW5lVHJhbnNmb3JtIGN0bSA9
IFJlbmRlckNvbnRhaW5lcjo6YWJzb2x1dGVUcmFuc2Zvcm0oKTsKKyAgICBTVkdTVkdFbGVtZW50
KiBzdmcgPSBzdGF0aWNfY2FzdDxTVkdTVkdFbGVtZW50Kj4oZWxlbWVudCgpKTsKKyAgICBjdG0u
c2NhbGUoc3ZnLT5jdXJyZW50U2NhbGUoKSk7CisgICAgY3RtLnRyYW5zbGF0ZShzdmctPmN1cnJl
bnRUcmFuc2xhdGUoKS54KCksIHN2Zy0+Y3VycmVudFRyYW5zbGF0ZSgpLnkoKSk7CisgICAgY3Rt
LnRyYW5zbGF0ZSh2aWV3cG9ydCgpLngoKSwgdmlld3BvcnQoKS55KCkpOworICAgIHJldHVybiB2
aWV3cG9ydFRyYW5zZm9ybSgpICogY3RtOworfQorCitib29sIFJlbmRlclNWR1Jvb3Q6OmZpbGxD
b250YWlucyhjb25zdCBGbG9hdFBvaW50JiBwKSBjb25zdAoreworICAgIFJlbmRlck9iamVjdCog
Y3VycmVudCA9IGZpcnN0Q2hpbGQoKTsKKyAgICB3aGlsZSAoY3VycmVudCAhPSAwKSB7CisgICAg
ICAgIGlmIChjdXJyZW50LT5pc1JlbmRlclBhdGgoKSAmJiBzdGF0aWNfY2FzdDxSZW5kZXJQYXRo
Kj4oY3VycmVudCktPmZpbGxDb250YWlucyhwKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwor
CisgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5uZXh0U2libGluZygpOworICAgIH0KKworICAg
IHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJTVkdSb290OjpzdHJva2VDb250YWlucyhj
b25zdCBGbG9hdFBvaW50JiBwKSBjb25zdAoreworICAgIFJlbmRlck9iamVjdCogY3VycmVudCA9
IGZpcnN0Q2hpbGQoKTsKKyAgICB3aGlsZSAoY3VycmVudCAhPSAwKSB7CisgICAgICAgIGlmIChj
dXJyZW50LT5pc1JlbmRlclBhdGgoKSAmJiBzdGF0aWNfY2FzdDxSZW5kZXJQYXRoKj4oY3VycmVu
dCktPnN0cm9rZUNvbnRhaW5zKHApKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAg
ICAgY3VycmVudCA9IGN1cnJlbnQtPm5leHRTaWJsaW5nKCk7CisgICAgfQorCisgICAgcmV0dXJu
IGZhbHNlOworfQorCitGbG9hdFJlY3QgUmVuZGVyU1ZHUm9vdDo6cmVsYXRpdmVCQm94KGJvb2wg
aW5jbHVkZVN0cm9rZSkgY29uc3QKK3sKKyAgICBGbG9hdFJlY3QgcmVjdDsKKyAgICAKKyAgICBS
ZW5kZXJPYmplY3QqIGN1cnJlbnQgPSBmaXJzdENoaWxkKCk7CisgICAgZm9yICg7IGN1cnJlbnQg
IT0gMDsgY3VycmVudCA9IGN1cnJlbnQtPm5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgRmxvYXRS
ZWN0IGNoaWxkQkJveCA9IGN1cnJlbnQtPnJlbGF0aXZlQkJveChpbmNsdWRlU3Ryb2tlKTsKKyAg
ICAgICAgRmxvYXRSZWN0IG1hcHBlZEJCb3ggPSBjdXJyZW50LT5sb2NhbFRyYW5zZm9ybSgpLm1h
cFJlY3QoY2hpbGRCQm94KTsKKyAgICAgICAgcmVjdC51bml0ZShtYXBwZWRCQm94KTsKKyAgICB9
CisKKyAgICByZXR1cm4gcmVjdDsKK30KKwordm9pZCBSZW5kZXJTVkdSb290OjpzZXRTbGljZShi
b29sIHNsaWNlKQoreworICAgIG1fc2xpY2UgPSBzbGljZTsKKworICAgIGlmIChzdHlsZSgpKQor
ICAgICAgICBzZXROZWVkc0xheW91dCh0cnVlKTsKK30KKworYm9vbCBSZW5kZXJTVkdSb290Ojpz
bGljZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fc2xpY2U7Cit9CisKK0FmZmluZVRyYW5zZm9y
bSBSZW5kZXJTVkdSb290OjpnZXRBc3BlY3RSYXRpbyhjb25zdCBGbG9hdFJlY3QmIGxvZ2ljYWws
IGNvbnN0IEZsb2F0UmVjdCYgcGh5c2ljYWwpIGNvbnN0Cit7CisgICAgQWZmaW5lVHJhbnNmb3Jt
IHRlbXA7CisKKyAgICBmbG9hdCBsb2dpY1ggPSBsb2dpY2FsLngoKTsKKyAgICBmbG9hdCBsb2dp
Y1kgPSBsb2dpY2FsLnkoKTsKKyAgICBmbG9hdCBsb2dpY1dpZHRoID0gbG9naWNhbC53aWR0aCgp
OworICAgIGZsb2F0IGxvZ2ljSGVpZ2h0ID0gbG9naWNhbC5oZWlnaHQoKTsKKyAgICBmbG9hdCBw
aHlzV2lkdGggPSBwaHlzaWNhbC53aWR0aCgpOworICAgIGZsb2F0IHBoeXNIZWlnaHQgPSBwaHlz
aWNhbC5oZWlnaHQoKTsKKworICAgIGZsb2F0IHZwYXIgPSBsb2dpY1dpZHRoIC8gbG9naWNIZWln
aHQ7CisgICAgZmxvYXQgc3ZnYXIgPSBwaHlzV2lkdGggLyBwaHlzSGVpZ2h0OworCisgICAgaWYg
KGFsaWduKCkgPT0gU1ZHUHJlc2VydmVBc3BlY3RSYXRpbzo6U1ZHX1BSRVNFUlZFQVNQRUNUUkFU
SU9fTk9ORSkgeworICAgICAgICB0ZW1wLnNjYWxlKHBoeXNXaWR0aCAvIGxvZ2ljV2lkdGgsIHBo
eXNIZWlnaHQgLyBsb2dpY0hlaWdodCk7CisgICAgICAgIHRlbXAudHJhbnNsYXRlKC1sb2dpY1gs
IC1sb2dpY1kpOworICAgIH0gZWxzZSBpZiAoKHZwYXIgPCBzdmdhciAmJiAhc2xpY2UoKSkgfHwg
KHZwYXIgPj0gc3ZnYXIgJiYgc2xpY2UoKSkpIHsKKyAgICAgICAgdGVtcC5zY2FsZShwaHlzSGVp
Z2h0IC8gbG9naWNIZWlnaHQsIHBoeXNIZWlnaHQgLyBsb2dpY0hlaWdodCk7CisKKyAgICAgICAg
aWYgKGFsaWduKCkgPT0gU1ZHUHJlc2VydmVBc3BlY3RSYXRpbzo6U1ZHX1BSRVNFUlZFQVNQRUNU
UkFUSU9fWE1JTllNSU4gfHwgYWxpZ24oKSA9PSBTVkdQcmVzZXJ2ZUFzcGVjdFJhdGlvOjpTVkdf
UFJFU0VSVkVBU1BFQ1RSQVRJT19YTUlOWU1JRCB8fCBhbGlnbigpID09IFNWR1ByZXNlcnZlQXNw
ZWN0UmF0aW86OlNWR19QUkVTRVJWRUFTUEVDVFJBVElPX1hNSU5ZTUFYKQorICAgICAgICAgICAg
dGVtcC50cmFuc2xhdGUoLWxvZ2ljWCwgLWxvZ2ljWSk7CisgICAgICAgIGVsc2UgaWYgKGFsaWdu
KCkgPT0gU1ZHUHJlc2VydmVBc3BlY3RSYXRpbzo6U1ZHX1BSRVNFUlZFQVNQRUNUUkFUSU9fWE1J
RFlNSU4gfHwgYWxpZ24oKSA9PSBTVkdQcmVzZXJ2ZUFzcGVjdFJhdGlvOjpTVkdfUFJFU0VSVkVB
U1BFQ1RSQVRJT19YTUlEWU1JRCB8fCBhbGlnbigpID09IFNWR1ByZXNlcnZlQXNwZWN0UmF0aW86
OlNWR19QUkVTRVJWRUFTUEVDVFJBVElPX1hNSURZTUFYKQorICAgICAgICAgICAgdGVtcC50cmFu
c2xhdGUoLWxvZ2ljWCAtIChsb2dpY1dpZHRoIC0gcGh5c1dpZHRoICogbG9naWNIZWlnaHQgLyBw
aHlzSGVpZ2h0KSAvIDIsIC1sb2dpY1kpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0ZW1w
LnRyYW5zbGF0ZSgtbG9naWNYIC0gKGxvZ2ljV2lkdGggLSBwaHlzV2lkdGggKiBsb2dpY0hlaWdo
dCAvIHBoeXNIZWlnaHQpLCAtbG9naWNZKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0ZW1wLnNj
YWxlKHBoeXNXaWR0aCAvIGxvZ2ljV2lkdGgsIHBoeXNXaWR0aCAvIGxvZ2ljV2lkdGgpOworCisg
ICAgICAgIGlmIChhbGlnbigpID09IFNWR1ByZXNlcnZlQXNwZWN0UmF0aW86OlNWR19QUkVTRVJW
RUFTUEVDVFJBVElPX1hNSU5ZTUlOIHx8IGFsaWduKCkgPT0gU1ZHUHJlc2VydmVBc3BlY3RSYXRp
bzo6U1ZHX1BSRVNFUlZFQVNQRUNUUkFUSU9fWE1JRFlNSU4gfHwgYWxpZ24oKSA9PSBTVkdQcmVz
ZXJ2ZUFzcGVjdFJhdGlvOjpTVkdfUFJFU0VSVkVBU1BFQ1RSQVRJT19YTUFYWU1JTikKKyAgICAg
ICAgICAgIHRlbXAudHJhbnNsYXRlKC1sb2dpY1gsIC1sb2dpY1kpOworICAgICAgICBlbHNlIGlm
IChhbGlnbigpID09IFNWR1ByZXNlcnZlQXNwZWN0UmF0aW86OlNWR19QUkVTRVJWRUFTUEVDVFJB
VElPX1hNSU5ZTUlEIHx8IGFsaWduKCkgPT0gU1ZHUHJlc2VydmVBc3BlY3RSYXRpbzo6U1ZHX1BS
RVNFUlZFQVNQRUNUUkFUSU9fWE1JRFlNSUQgfHwgYWxpZ24oKSA9PSBTVkdQcmVzZXJ2ZUFzcGVj
dFJhdGlvOjpTVkdfUFJFU0VSVkVBU1BFQ1RSQVRJT19YTUFYWU1JRCkKKyAgICAgICAgICAgIHRl
bXAudHJhbnNsYXRlKC1sb2dpY1gsIC1sb2dpY1kgLSAobG9naWNIZWlnaHQgLSBwaHlzSGVpZ2h0
ICogbG9naWNXaWR0aCAvIHBoeXNXaWR0aCkgLyAyKTsKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgdGVtcC50cmFuc2xhdGUoLWxvZ2ljWCwgLWxvZ2ljWSAtIChsb2dpY0hlaWdodCAtIHBoeXNI
ZWlnaHQgKiBsb2dpY1dpZHRoIC8gcGh5c1dpZHRoKSk7CisgICAgfQorCisgICAgcmV0dXJuIHRl
bXA7Cit9CisKK2Jvb2wgUmVuZGVyU1ZHUm9vdDo6bm9kZUF0UG9pbnQoY29uc3QgSGl0VGVzdFJl
cXVlc3QmIHJlcXVlc3QsIEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgaW50IF94LCBpbnQgX3ksIGlu
dCBfdHgsIGludCBfdHksIEhpdFRlc3RBY3Rpb24gaGl0VGVzdEFjdGlvbikKK3sKKyAgICBpZiAo
IXZpZXdwb3J0KCkuaXNFbXB0eSgpCisgICAgICAgICYmIHN0eWxlKCktPm92ZXJmbG93WCgpID09
IE9ISURERU4KKyAgICAgICAgJiYgc3R5bGUoKS0+b3ZlcmZsb3dZKCkgPT0gT0hJRERFTikgewor
ICAgICAgICBpbnQgdHggPSBtX3ggLSBfdHg7CisgICAgICAgIGludCB0eSA9IG1feSAtIF90eTsK
KworICAgICAgICAvLyBDaGVjayBpZiB3ZSBuZWVkIHRvIGRvIGFueXRoaW5nIGF0IGFsbC4KKyAg
ICAgICAgSW50UmVjdCBvdmVyZmxvd0JveCA9IG92ZXJmbG93UmVjdChmYWxzZSk7CisgICAgICAg
IG92ZXJmbG93Qm94Lm1vdmUodHgsIHR5KTsKKyAgICAgICAgQWZmaW5lVHJhbnNmb3JtIGN0bSA9
IFJlbmRlckNvbnRhaW5lcjo6YWJzb2x1dGVUcmFuc2Zvcm0oKTsKKyAgICAgICAgY3RtLnRyYW5z
bGF0ZSh2aWV3cG9ydCgpLngoKSwgdmlld3BvcnQoKS55KCkpOworICAgICAgICBkb3VibGUgbG9j
YWxYLCBsb2NhbFk7CisgICAgICAgIGN0bS5pbnZlcnNlKCkubWFwKF94IC0gX3R4LCBfeSAtIF90
eSwgJmxvY2FsWCwgJmxvY2FsWSk7CisgICAgICAgIGlmICghb3ZlcmZsb3dCb3guY29udGFpbnMo
KGludClsb2NhbFgsIChpbnQpbG9jYWxZKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICB9CisKKyAgICBmb3IgKFJlbmRlck9iamVjdCogY2hpbGQgPSBsYXN0Q2hpbGQoKTsgY2hpbGQ7
IGNoaWxkID0gY2hpbGQtPnByZXZpb3VzU2libGluZygpKSB7CisgICAgICAgIGlmIChjaGlsZC0+
bm9kZUF0UG9pbnQocmVxdWVzdCwgcmVzdWx0LCBfeCwgX3ksIF90eCwgX3R5LCBoaXRUZXN0QWN0
aW9uKSkgeworICAgICAgICAgICAgdXBkYXRlSGl0VGVzdFJlc3VsdChyZXN1bHQsIEludFBvaW50
KF94IC0gX3R4LCBfeSAtIF90eSkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAg
IH0KKyAgICB9CisgICAgCisgICAgLy8gU3BlYzogT25seSBncmFwaGljYWwgZWxlbWVudHMgY2Fu
IGJlIHRhcmdldGVkIGJ5IHRoZSBtb3VzZSwgcGVyaW9kLgorICAgIC8vIDE2LjQ6ICJJZiB0aGVy
ZSBhcmUgbm8gZ3JhcGhpY3MgZWxlbWVudHMgd2hvc2UgcmVsZXZhbnQgZ3JhcGhpY3MgY29udGVu
dCBpcyB1bmRlciB0aGUgcG9pbnRlciAoaS5lLiwgdGhlcmUgaXMgbm8gdGFyZ2V0IGVsZW1lbnQp
LCB0aGUgZXZlbnQgaXMgbm90IGRpc3BhdGNoZWQuIgorICAgIHJldHVybiBmYWxzZTsKK30KKwor
fQorCisjZW5kaWYgLy8gRU5BQkxFKFNWRykKKworLy8gdmltOnRzPTQ6bm9ldApJbmRleDogV2Vi
Q29yZS9yZW5kZXJpbmcvUmVuZGVyU1ZHUm9vdC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlclNWR1Jvb3QuaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlclNWR1Jvb3QuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAgICBD
b3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDcgTmlrb2xhcyBaaW1tZXJtYW5uIDx6aW1tZXJt
YW5uQGtkZS5vcmc+CisgICAgICAgICAgICAgICAgICAyMDA0LCAyMDA1LCAyMDA3IFJvYiBCdWlz
IDxidWlzQGtkZS5vcmc+CisKKyAgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgS0RFIHByb2pl
Y3QKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp
YnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhaW50
IHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdy
aXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxl
IFBsYWNlIC0gU3VpdGUgMzMwLAorICAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKi8K
KworI2lmbmRlZiBSZW5kZXJTVkdSb290X2gKKyNkZWZpbmUgUmVuZGVyU1ZHUm9vdF9oCisKKyNp
ZiBFTkFCTEUoU1ZHKQorCisjaW5jbHVkZSAiUmVuZGVyQ29udGFpbmVyLmgiCisjaW5jbHVkZSAi
UmVuZGVyUGF0aC5oIgorI2luY2x1ZGUgIlNWR1ByZXNlcnZlQXNwZWN0UmF0aW8uaCIKKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBTVkdFbGVtZW50OworCitjbGFzcyBSZW5kZXJTVkdS
b290IDogcHVibGljIFJlbmRlckNvbnRhaW5lciB7CitwdWJsaWM6CisgICAgUmVuZGVyU1ZHUm9v
dChTVkdTdHlsZWRFbGVtZW50Kik7CisgICAgflJlbmRlclNWR1Jvb3QoKTsKKworICAgIHZpcnR1
YWwgYm9vbCBpc1NWR0NvbnRhaW5lcigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgICB2aXJ0
dWFsIGNvbnN0IGNoYXIqIHJlbmRlck5hbWUoKSBjb25zdCB7IHJldHVybiAiUmVuZGVyU1ZHQ29u
dGFpbmVyIjsgfQorICAgICAgICAKKyAgICB2aXJ0dWFsIGJvb2wgcmVxdWlyZXNMYXllcigpOwor
ICAgIHZpcnR1YWwgc2hvcnQgbGluZUhlaWdodChib29sIGIsIGJvb2wgaXNSb290TGluZUJveCA9
IGZhbHNlKSBjb25zdDsKKyAgICB2aXJ0dWFsIHNob3J0IGJhc2VsaW5lUG9zaXRpb24oYm9vbCBi
LCBib29sIGlzUm9vdExpbmVCb3ggPSBmYWxzZSkgY29uc3Q7CisgICAgCisgICAgdmlydHVhbCB2
b2lkIGxheW91dCgpOworICAgIHZpcnR1YWwgdm9pZCBwYWludChQYWludEluZm8mLCBpbnQgcGFy
ZW50WCwgaW50IHBhcmVudFkpOworICAgIAorICAgIHZpcnR1YWwgSW50UmVjdCBhYnNvbHV0ZUNs
aXBwZWRPdmVyZmxvd1JlY3QoKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWJzb2x1dGVSZWN0cyhWZWN0
b3I8SW50UmVjdD4mIHJlY3RzLCBpbnQgdHgsIGludCB0eSk7CisgICAgdmlydHVhbCB2b2lkIGFk
ZEZvY3VzUmluZ1JlY3RzKEdyYXBoaWNzQ29udGV4dCosIGludCB0eCwgaW50IHR5KTsKKworICAg
IHZpcnR1YWwgQWZmaW5lVHJhbnNmb3JtIGFic29sdXRlVHJhbnNmb3JtKCkgY29uc3Q7CisKKyAg
ICBib29sIGZpbGxDb250YWlucyhjb25zdCBGbG9hdFBvaW50JikgY29uc3Q7CisgICAgYm9vbCBz
dHJva2VDb250YWlucyhjb25zdCBGbG9hdFBvaW50JikgY29uc3Q7CisgICAgRmxvYXRSZWN0IHJl
bGF0aXZlQkJveChib29sIGluY2x1ZGVTdHJva2UgPSB0cnVlKSBjb25zdDsKKyAgICAKKyAgICB2
aXJ0dWFsIEFmZmluZVRyYW5zZm9ybSBsb2NhbFRyYW5zZm9ybSgpIGNvbnN0OworICAgIHZvaWQg
c2V0TG9jYWxUcmFuc2Zvcm0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJik7CisgICAKKyAgICBGbG9h
dFJlY3Qgdmlld3BvcnQoKSBjb25zdDsKKworICAgIHZvaWQgc2V0Vmlld0JveChjb25zdCBGbG9h
dFJlY3QmKTsKKyAgICBGbG9hdFJlY3Qgdmlld0JveCgpIGNvbnN0OworCisgICAgdm9pZCBzZXRB
bGlnbihTVkdQcmVzZXJ2ZUFzcGVjdFJhdGlvOjpTVkdQcmVzZXJ2ZUFzcGVjdFJhdGlvVHlwZSk7
CisgICAgU1ZHUHJlc2VydmVBc3BlY3RSYXRpbzo6U1ZHUHJlc2VydmVBc3BlY3RSYXRpb1R5cGUg
YWxpZ24oKSBjb25zdDsKKworICAgIHZvaWQgc2V0U2xpY2UoYm9vbCk7CisgICAgYm9vbCBzbGlj
ZSgpIGNvbnN0OworICAgIAorICAgIEFmZmluZVRyYW5zZm9ybSB2aWV3cG9ydFRyYW5zZm9ybSgp
IGNvbnN0OworICAgIAorICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBIaXRUZXN0
UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5LCBI
aXRUZXN0QWN0aW9uKTsKKyAgICAKK3ByaXZhdGU6CisgICAgdm9pZCBjYWxjVmlld3BvcnQoKTsg
CisgICAgQWZmaW5lVHJhbnNmb3JtIGdldEFzcGVjdFJhdGlvKGNvbnN0IEZsb2F0UmVjdCYgbG9n
aWNhbCwgY29uc3QgRmxvYXRSZWN0JiBwaHlzaWNhbCkgY29uc3Q7CisgICAgdm9pZCBhcHBseUNv
bnRlbnRUcmFuc2Zvcm1zKFBhaW50SW5mbyYsIGludCYgcGFyZW50WCwgaW50JiBwYXJlbnRZKTsK
KworICAgIGJvb2wgbV9zbGljZSA6IDE7CisgICAgQWZmaW5lVHJhbnNmb3JtIG1fbWF0cml4Owor
ICAgIAorICAgIEZsb2F0UmVjdCBtX3ZpZXdwb3J0OworICAgIEZsb2F0UmVjdCBtX3ZpZXdCb3g7
CisgICAgU1ZHUHJlc2VydmVBc3BlY3RSYXRpbzo6U1ZHUHJlc2VydmVBc3BlY3RSYXRpb1R5cGUg
bV9hbGlnbjsKKyAgICBJbnRSZWN0IG1fYWJzb2x1dGVCb3VuZHM7Cit9OworCit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoU1ZHKQorI2VuZGlmIC8vIFJlbmRlclNW
R1Jvb3RfaAorCisvLyB2aW06dHM9NDpub2V0Cg==
</data>
<flag name="review"
          id="6176"
          type_id="1"
          status="+"
          setter="eric"
    />
          </attachment>
      

    </bug>

</bugzilla>