<?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>120563</bug_id>
          
          <creation_ts>2013-08-31 12:00:42 -0700</creation_ts>
          <short_desc>Add element ancestor iterator</short_desc>
          <delta_ts>2013-09-05 16:20:08 -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>DOM</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Antti Koivisto">koivisto</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>darin</cc>
    
    <cc>kling</cc>
    
    <cc>rniwa</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>923324</commentid>
    <comment_count>0</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2013-08-31 12:00:42 -0700</bug_when>
    <thetext>rniwa wanted one</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>923325</commentid>
    <comment_count>1</comment_count>
      <attachid>210201</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2013-08-31 12:12:02 -0700</bug_when>
    <thetext>Created attachment 210201
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>923336</commentid>
    <comment_count>2</comment_count>
      <attachid>210201</attachid>
    <who name="Andreas Kling">kling</who>
    <bug_when>2013-08-31 13:09:39 -0700</bug_when>
    <thetext>Comment on attachment 210201
patch

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

&gt; Source/WebCore/ChangeLog:22
&gt; +        auto lineage = elementLineage(this);
&gt; +        for (auto it = lineage.begin(), end = lineage.end(); it != end; ++it) {
&gt; +            Element&amp; element = *it;
&gt; +            ...

Poetic.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>923363</commentid>
    <comment_count>3</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2013-08-31 15:53:03 -0700</bug_when>
    <thetext>Can we add a version that optionally stops when it hits a node with a certain condition? (Let it take a function pointer or node&apos;s member function? e.g. A lot of editing code needs to stop ancestor search once it hits an editing boundary.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>923421</commentid>
    <comment_count>4</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2013-09-01 00:53:53 -0700</bug_when>
    <thetext>I don&apos;t think anything else than actual iteration belong to iterators. They are stl compatible and you can add your own helpers.

With stl you can do things like:

auto lineage = elementLineage(this);
auto nearestEditable = std::find_if(lineage.begin(), lineage.end(), [](Element&amp; e) { return e.rendererIsEditable(); } );</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>923445</commentid>
    <comment_count>5</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2013-09-01 03:45:38 -0700</bug_when>
    <thetext>You could have *Adapter class that give ancestor ranges the editing code wants, something like:

auto editableAncestors = ancestorsWithinEditableBounds(this);</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>923446</commentid>
    <comment_count>6</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2013-09-01 03:47:56 -0700</bug_when>
    <thetext>https://trac.webkit.org/r154940

Dropped Node* version of the interface functions in favour of Element only. Call sites should be tightened as needed.

Added lineageOfType&lt;&gt;.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>210201</attachid>
            <date>2013-08-31 12:12:02 -0700</date>
            <delta_ts>2013-08-31 13:09:39 -0700</delta_ts>
            <desc>patch</desc>
            <filename>ancestor-iterator-2.patch</filename>
            <type>text/plain</type>
            <size>29605</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE1NDkzMSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDY5IEBACisyMDEzLTA4LTMxICBBbnR0aSBL
b2l2aXN0byAgPGFudHRpQGFwcGxlLmNvbT4KKworICAgICAgICBBZGQgZWxlbWVudCBhbmNlc3Rv
ciBpdGVyYXRvcgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MTIwNTYzCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgVGhpcyBwYXRjaCBhZGRzIGFuY2VzdG9yIGl0ZXJhdG9ycy4gVGhleSBpdGVyYXRlIG92ZXIg
ZWxlbWVudHMgcGFyZW50IGNoYWluIHVwIHRvIHRoZSByb290LgorICAgICAgICAKKyAgICAgICAg
VG8gaXRlcmF0ZSBvdmVyIEVsZW1lbnQgYW5jZXN0b3JzOgorICAgICAgICAKKyAgICAgICAgYXV0
byBhbmNlc3RvcnMgPSBlbGVtZW50QW5jZXN0b3JzKHRoaXMpOworICAgICAgICBmb3IgKGF1dG8g
aXQgPSBhbmNlc3RvcnMuYmVnaW4oKSwgZW5kID0gYW5jZXN0b3JzLmVuZCgpOyBpdCAhPSBlbmQ7
ICsraXQpIHsKKyAgICAgICAgICAgIEVsZW1lbnQmIGVsZW1lbnQgPSAqaXQ7CisgICAgICAgICAg
ICAuLi4KKworICAgICAgICBUbyBpdGVyYXRlIG92ZXIgRWxlbWVudCBhbmNlc3RvcnMgaW5jbHVk
aW5nIHRoZSBjdXJyZW50IGVsZW1lbnQ6CisgICAgICAgIAorICAgICAgICBhdXRvIGxpbmVhZ2Ug
PSBlbGVtZW50TGluZWFnZSh0aGlzKTsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbGluZWFnZS5i
ZWdpbigpLCBlbmQgPSBsaW5lYWdlLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAg
ICAgIEVsZW1lbnQmIGVsZW1lbnQgPSAqaXQ7CisgICAgICAgICAgICAuLi4KKyAgICAgICAgICAg
IAorICAgICAgICBUbyBpdGVyYXRlIG92ZXIgYW5jZXN0b3JzIG9mIHNwZWNpZmljIEVsZW1lbnQg
c3ViY2xhc3M6CisKKyAgICAgICAgYXV0byBkaXZBbmNlc3RvcnMgPSBhbmNlc3RvcnNPZlR5cGU8
SFRNTERpdkVsZW1lbnQ+KHRoaXMpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBkaXZBbmNlc3Rv
cnMuYmVnaW4oKSwgZW5kID0gZGl2QW5jZXN0b3JzLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsK
KyAgICAgICAgICAgIEhUTUxEaXZFbGVtZW50JiBkaXYgPSAqaXQ7CisgICAgICAgICAgICAuLi4K
KyAgICAgICAgICAgIAorICAgICAgICBUaGUgcGF0Y2ggYWxzbyB1c2VzIHRoZSBuZXcgdHlwZXMg
aW4gYSBmZXcgcGxhY2VzLgorCisgICAgICAgICogV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5w
Ynhwcm9qOgorICAgICAgICAqIGFjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eU5vZGVPYmplY3Qu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU5vZGVPYmplY3Q6Om1vdXNlQnV0
dG9uTGlzdGVuZXIpOgorICAgICAgICAoV2ViQ29yZTo6QWNjZXNzaWJpbGl0eU5vZGVPYmplY3Q6
OmxhYmVsRm9yRWxlbWVudCk6CisgICAgICAgICogZG9tL0VsZW1lbnRBbmNlc3Rvckl0ZXJhdG9y
Lmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6OjpFbGVtZW50QW5jZXN0b3JJdGVyYXRvcik6
CisgICAgICAgIChXZWJDb3JlOjo6Om9wZXJhdG9yKToKKyAgICAgICAgKFdlYkNvcmU6Ojo6RWxl
bWVudEFuY2VzdG9yQ29uc3RJdGVyYXRvcik6CisgICAgICAgIChXZWJDb3JlOjo6OkVsZW1lbnRB
bmNlc3Rvckl0ZXJhdG9yQWRhcHRlcik6CisgICAgICAgIChXZWJDb3JlOjo6OmJlZ2luKToKKyAg
ICAgICAgKFdlYkNvcmU6Ojo6ZW5kKToKKyAgICAgICAgKFdlYkNvcmU6Ojo6RWxlbWVudEFuY2Vz
dG9yQ29uc3RJdGVyYXRvckFkYXB0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6ZWxlbWVudExpbmVh
Z2UpOgorICAgICAgICAoV2ViQ29yZTo6ZWxlbWVudEFuY2VzdG9ycyk6CisgICAgICAgIChXZWJD
b3JlOjphbmNlc3RvcnNPZlR5cGUpOgorICAgICAgICAqIGRvbS9FbGVtZW50SXRlcmF0b3IuaDoK
KyAgICAgICAgKFdlYkNvcmU6OmZpbmRFbGVtZW50QW5jZXN0b3JPZlR5cGUpOgorICAgICAgICAo
V2ViQ29yZTo6Ojp0cmF2ZXJzZUFuY2VzdG9yKToKKyAgICAgICAgKFdlYkNvcmU6Oj0pOgorICAg
ICAgICAqIGh0bWwvSFRNTEVsZW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6SFRNTEVsZW1l
bnQ6OmFkanVzdERpcmVjdGlvbmFsaXR5SWZOZWVkZWRBZnRlckNoaWxkQXR0cmlidXRlQ2hhbmdl
ZCk6CisgICAgICAgICogaHRtbC9IVE1MRmllbGRTZXRFbGVtZW50Lmg6CisgICAgICAgIChXZWJD
b3JlOjppc0hUTUxGaWVsZFNldEVsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6SFRNTEZpZWxk
U2V0RWxlbWVudCk6CisgICAgICAgICogaHRtbC9IVE1MRnJhbWVTZXRFbGVtZW50LmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OkhUTUxGcmFtZVNldEVsZW1lbnQ6OmZpbmRDb250YWluaW5nKToKKyAg
ICAgICAgKiBodG1sL0hUTUxGcmFtZVNldEVsZW1lbnQuaDoKKyAgICAgICAgKFdlYkNvcmU6OkhU
TUxGcmFtZVNldEVsZW1lbnQpOgorICAgICAgICAqIGh0bWwvSFRNTElucHV0RWxlbWVudC5oOgor
ICAgICAgICAoV2ViQ29yZTo6aXNIVE1MSW5wdXRFbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6
OnRvSFRNTElucHV0RWxlbWVudCk6CisgICAgICAgICogaHRtbC9IVE1MTGVnZW5kRWxlbWVudC5j
cHA6CisgICAgICAgIChXZWJDb3JlOjpIVE1MTGVnZW5kRWxlbWVudDo6YXNzb2NpYXRlZENvbnRy
b2wpOgorCiAyMDEzLTA4LTMxICBBbmRyZWFzIEtsaW5nICA8YWtsaW5nQGFwcGxlLmNvbT4KIAog
ICAgICAgICBJbmxpbmVCb3g6OnJlbmRlcmVyKCkgYW5kIHBhbHMgc2hvdWxkIHJldHVybiByZWZl
cmVuY2VzLgpJbmRleDogU291cmNlL1dlYkNvcmUvR05VbWFrZWZpbGUubGlzdC5hbQo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCShyZXZpc2lvbiAxNTQ5
MjgpCisrKyBTb3VyY2UvV2ViQ29yZS9HTlVtYWtlZmlsZS5saXN0LmFtCSh3b3JraW5nIGNvcHkp
CkBAIC0yODY5LDYgKzI4NjksNyBAQCB3ZWJjb3JlX3NvdXJjZXMgKz0gXAogCVNvdXJjZS9XZWJD
b3JlL2RvbS9ET01UaW1lU3RhbXAuaCBcCiAJU291cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnQuY3Bw
IFwKIAlTb3VyY2UvV2ViQ29yZS9kb20vRWxlbWVudC5oIFwKKwlTb3VyY2UvV2ViQ29yZS9kb20v
RWxlbWVudEFuY2VzdG9ySXRlcmF0b3IuaCBcCiAJU291cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnRD
aGlsZEl0ZXJhdG9yLmggXAogCVNvdXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50RGF0YS5jcHAgXAog
CVNvdXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50RGF0YS5oIFwKSW5kZXg6IFNvdXJjZS9XZWJDb3Jl
L1RhcmdldC5wcmkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvVGFyZ2V0LnByaQkocmV2
aXNpb24gMTU0OTI4KQorKysgU291cmNlL1dlYkNvcmUvVGFyZ2V0LnByaQkod29ya2luZyBjb3B5
KQpAQCAtMTYxMCw2ICsxNjEwLDcgQEAgSEVBREVSUyArPSBcCiAgICAgZG9tL0RPTVRpbWVTdGFt
cC5oIFwKICAgICBkb20vRGF0YXNldERPTVN0cmluZ01hcC5oIFwKICAgICBkb20vRWxlbWVudC5o
IFwKKyAgICBkb20vRWxlbWVudEFuY2VzdG9ySXRlcmF0b3IuaCBcCiAgICAgZG9tL0VsZW1lbnRD
aGlsZEl0ZXJhdG9yLmggXAogICAgIGRvbS9FbGVtZW50RGF0YS5oIFwKICAgICBkb20vRWxlbWVu
dERlc2NlbmRhbnRJdGVyYXRvci5oIFwKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmN4
cHJvai9XZWJDb3JlLnZjeHByb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvV2ViQ29y
ZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJvagkocmV2aXNpb24gMTU0OTI4KQorKysgU291cmNlL1dl
YkNvcmUvV2ViQ29yZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJvagkod29ya2luZyBjb3B5KQpAQCAt
MSw0ICsxLDQgQEAKLe+7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8
P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgogPFByb2plY3QgRGVmYXVsdFRh
cmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1p
Y3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+CiAgIDxJdGVtR3JvdXAgTGFiZWw9
IlByb2plY3RDb25maWd1cmF0aW9ucyI+CiAgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1
ZGU9IkRlYnVnU3VmZml4fFdpbjMyIj4KQEAgLTIwMjYyLDYgKzIwMjYyLDcgQEAKICAgICA8Q2xJ
bmNsdWRlIEluY2x1ZGU9Ii4uXGRvbVxET01TdHJpbmdNYXAuaCIgLz4KICAgICA8Q2xJbmNsdWRl
IEluY2x1ZGU9Ii4uXGRvbVxET01UaW1lU3RhbXAuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1
ZGU9Ii4uXGRvbVxFbGVtZW50LmgiIC8+CisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxkb21c
RWxlbWVudEFuY2VzdG9ySXRlcmF0b3IuaCIgLz4KICAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9Ii4u
XGRvbVxFbGVtZW50Q2hpbGRJdGVyYXRvci5oIiAvPgogICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0i
Li5cZG9tXEVsZW1lbnREYXRhLmgiIC8+CiAgICAgPENsSW5jbHVkZSBJbmNsdWRlPSIuLlxkb21c
RWxlbWVudERlc2NlbmRhbnRJdGVyYXRvci5oIiAvPgpJbmRleDogU291cmNlL1dlYkNvcmUvV2Vi
Q29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJD
b3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gMTU0OTI4KQor
KysgU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3Jr
aW5nIGNvcHkpCkBAIC01NTA2LDYgKzU1MDYsNyBAQAogCQlFNDlCRDlGQTEzMUZEMkVEMDAzQzU2
RjAgLyogQ1NTVmFsdWVQb29sLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSBFNDlCRDlGOTEzMUZEMkVEMDAzQzU2RjAgLyogQ1NTVmFsdWVQb29sLmggKi87
IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJRTQ5QkRBMEIx
MzFGRDNFNTAwM0M1NkYwIC8qIENTU1ZhbHVlUG9vbC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFNDlCREEwQTEzMUZEM0U1MDAzQzU2RjAgLyogQ1NT
VmFsdWVQb29sLmNwcCAqLzsgfTsKIAkJRTRBRTdDMTYxN0QxQkI5NTAwMDlGQjMxIC8qIEVsZW1l
bnRJdGVyYXRvci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gRTRBRTdDMTUxN0QxQkI5NTAwMDlGQjMxIC8qIEVsZW1lbnRJdGVyYXRvci5oICovOyB9Owor
CQlFNEFFN0MxQTE3RDIzMjM1MDAwOUZCMzEgLyogRWxlbWVudEFuY2VzdG9ySXRlcmF0b3IuaCBp
biBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEU0QUU3QzE5MTdE
MjMyMzUwMDA5RkIzMSAvKiBFbGVtZW50QW5jZXN0b3JJdGVyYXRvci5oICovOyB9OwogCQlFNEFG
Q0ZBNTBEQUYyOUEzMDBGNUY1NUMgLyogVW5pdEJlemllci5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTRBRkNGQTQwREFGMjlBMzAwRjVGNTVDIC8qIFVu
aXRCZXppZXIuaCAqLzsgfTsKIAkJRTRBRkQwMEIwREFGMzM1NDAwRjVGNTVDIC8qIFNNSUxUaW1l
LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEU0QUZE
MDA1MERBRjMzNTQwMEY1RjU1QyAvKiBTTUlMVGltZS5jcHAgKi87IH07CiAJCUU0QUZEMDBDMERB
RjMzNTQwMEY1RjU1QyAvKiBTTUlMVGltZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gRTRBRkQwMDYwREFGMzM1NDAwRjVGNTVDIC8qIFNNSUxUaW1lLmgg
Ki87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKQEAgLTEyMjgw
LDYgKzEyMjgxLDcgQEAKIAkJRTQ5QkQ5RjkxMzFGRDJFRDAwM0M1NkYwIC8qIENTU1ZhbHVlUG9v
bC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBDU1NWYWx1ZVBvb2wuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTQ5QkRBMEExMzFGRDNFNTAwM0M1NkYwIC8qIENT
U1ZhbHVlUG9vbC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBDU1NW
YWx1ZVBvb2wuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFNEFFN0MxNTE3RDFC
Qjk1MDAwOUZCMzEgLyogRWxlbWVudEl0ZXJhdG9yLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMu
aDsgcGF0aCA9IEVsZW1lbnRJdGVyYXRvci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owor
CQlFNEFFN0MxOTE3RDIzMjM1MDAwOUZCMzEgLyogRWxlbWVudEFuY2VzdG9ySXRlcmF0b3IuaCAq
LyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRWxlbWVudEFuY2VzdG9ySXRlcmF0b3Iu
aDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJRTRBRkNGQTQwREFGMjlBMzAwRjVGNTVD
IC8qIFVuaXRCZXppZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gVW5pdEJl
emllci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFNEFGRDAwNTBEQUYzMzU0MDBG
NUY1NUMgLyogU01JTFRpbWUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRo
ID0gU01JTFRpbWUuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFNEFGRDAwNjBE
QUYzMzU0MDBGNUY1NUMgLyogU01JTFRpbWUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBw
YXRoID0gU01JTFRpbWUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTIwMjIzLDYg
KzIwMjI1LDcgQEAKIAkJCQlBOEM0QTdGNjA5RDU2MzI3MDAwM0FDOEQgLyogRWxlbWVudC5jcHAg
Ki8sCiAJCQkJQThDNEE3RjUwOUQ1NjMyNzAwMDNBQzhEIC8qIEVsZW1lbnQuaCAqLywKIAkJCQk5
M0VFQzFFQTA5QzI4Nzc3MDBDNTE1RDEgLyogRWxlbWVudC5pZGwgKi8sCisJCQkJRTRBRTdDMTkx
N0QyMzIzNTAwMDlGQjMxIC8qIEVsZW1lbnRBbmNlc3Rvckl0ZXJhdG9yLmggKi8sCiAJCQkJRTQ2
QTJCMUQxN0NBNzZCMTAwMERCQ0Q4IC8qIEVsZW1lbnRDaGlsZEl0ZXJhdG9yLmggKi8sCiAJCQkJ
QjVCN0ExNkYxN0MxMDgwNjAwRTRBQTBBIC8qIEVsZW1lbnREYXRhLmNwcCAqLywKIAkJCQlCNUI3
QTE2RTE3QzEwNDgwMDBFNEFBMEEgLyogRWxlbWVudERhdGEuaCAqLywKQEAgLTIyMjI1LDYgKzIy
MjI4LDcgQEAKIAkJCQkzMUZCMUE2NjEyMEE1RDNGMDBEQzAyQTAgLyogSlNEZXZpY2VNb3Rpb25F
dmVudC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJNTlBODYwMDgxMTlEQUZBMTAwREVGMUVGIC8qIEpT
RGV2aWNlT3JpZW50YXRpb25FdmVudC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkNFNDM4OUMxNDBC
MUJBODAwNUU0MzdFIC8qIEpTRGljdGlvbmFyeS5oIGluIEhlYWRlcnMgKi8sCisJCQkJRTRBRTdD
MUExN0QyMzIzNTAwMDlGQjMxIC8qIEVsZW1lbnRBbmNlc3Rvckl0ZXJhdG9yLmggaW4gSGVhZGVy
cyAqLywKIAkJCQk4OTg3ODU4QjEyMkNBMjZBMDAzQUFCREEgLyogSlNEaXJlY3RvcnlFbnRyeS5o
IGluIEhlYWRlcnMgKi8sCiAJCQkJODkzQzQ4MzMxMjQ5NTQ3MjAwMkIzRDg2IC8qIEpTRGlyZWN0
b3J5RW50cnlTeW5jLmggaW4gSGVhZGVycyAqLywKIAkJCQk4OTg3ODU4RDEyMkNBMjZBMDAzQUFC
REEgLyogSlNEaXJlY3RvcnlSZWFkZXIuaCBpbiBIZWFkZXJzICovLApJbmRleDogU291cmNlL1dl
YkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5Tm9kZU9iamVj
dC5jcHAJKHJldmlzaW9uIDE1NDkyOCkKKysrIFNvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkv
QWNjZXNzaWJpbGl0eU5vZGVPYmplY3QuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05NzcsMjEgKzk3
NywxNiBAQCBFbGVtZW50KiBBY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdDo6bW91c2VCCiAgICAgICAg
IHJldHVybiAwOwogCiAgICAgLy8gY2hlY2sgaWYgb3VyIHBhcmVudCBpcyBhIG1vdXNlIGJ1dHRv
biBsaXN0ZW5lcgotICAgIHdoaWxlIChub2RlICYmICFub2RlLT5pc0VsZW1lbnROb2RlKCkpCi0g
ICAgICAgIG5vZGUgPSBub2RlLT5wYXJlbnROb2RlKCk7Ci0KLSAgICBpZiAoIW5vZGUpCi0gICAg
ICAgIHJldHVybiAwOwotCiAgICAgLy8gRklYTUU6IERvIHRoZSBjb250aW51YXRpb24gc2VhcmNo
IGxpa2UgYW5jaG9yRWxlbWVudCBkb2VzCi0gICAgZm9yIChFbGVtZW50KiBlbGVtZW50ID0gdG9F
bGVtZW50KG5vZGUpOyBlbGVtZW50OyBlbGVtZW50ID0gZWxlbWVudC0+cGFyZW50RWxlbWVudCgp
KSB7CisgICAgYXV0byBsaW5lYWdlID0gZWxlbWVudExpbmVhZ2Uobm9kZSk7CisgICAgZm9yIChh
dXRvIGVsZW1lbnQgPSBsaW5lYWdlLmJlZ2luKCksIGVuZCA9IGxpbmVhZ2UuZW5kKCk7IGVsZW1l
bnQgIT0gZW5kOyArK2VsZW1lbnQpIHsKICAgICAgICAgLy8gSWYgd2UndmUgcmVhY2hlZCB0aGUg
Ym9keSBhbmQgdGhpcyBpcyBub3QgYSBjb250cm9sIGVsZW1lbnQsIGRvIG5vdCBleHBvc2UgcHJl
c3MgYWN0aW9uIGZvciB0aGlzIGVsZW1lbnQuCiAgICAgICAgIC8vIEl0IGNhbiBjYXVzZSBmYWxz
ZSBwb3NpdGl2ZXMsIHdoZXJlIGV2ZXJ5IHBpZWNlIG9mIHRleHQgaXMgbGFiZWxlZCBhcyBhY2Nl
cHRpbmcgcHJlc3MgYWN0aW9ucy4gCiAgICAgICAgIGlmIChlbGVtZW50LT5oYXNUYWdOYW1lKGJv
ZHlUYWcpICYmIGlzU3RhdGljVGV4dCgpKQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIAog
ICAgICAgICBpZiAoZWxlbWVudC0+aGFzRXZlbnRMaXN0ZW5lcnMoZXZlbnROYW1lcygpLmNsaWNr
RXZlbnQpIHx8IGVsZW1lbnQtPmhhc0V2ZW50TGlzdGVuZXJzKGV2ZW50TmFtZXMoKS5tb3VzZWRv
d25FdmVudCkgfHwgZWxlbWVudC0+aGFzRXZlbnRMaXN0ZW5lcnMoZXZlbnROYW1lcygpLm1vdXNl
dXBFdmVudCkpCi0gICAgICAgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICAgICAgICAgIHJldHVy
biAmKmVsZW1lbnQ7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CkBAIC0xMDk5LDEyICsxMDk0LDEx
IEBAIEhUTUxMYWJlbEVsZW1lbnQqIEFjY2Vzc2liaWxpdHlOb2RlT2JqZWMKICAgICAgICAgICAg
IHJldHVybiBsYWJlbDsKICAgICB9CiAKLSAgICBmb3IgKEVsZW1lbnQqIHBhcmVudCA9IGVsZW1l
bnQtPnBhcmVudEVsZW1lbnQoKTsgcGFyZW50OyBwYXJlbnQgPSBwYXJlbnQtPnBhcmVudEVsZW1l
bnQoKSkgewotICAgICAgICBpZiAoaXNIVE1MTGFiZWxFbGVtZW50KHBhcmVudCkpCi0gICAgICAg
ICAgICByZXR1cm4gdG9IVE1MTGFiZWxFbGVtZW50KHBhcmVudCk7Ci0gICAgfQotCi0gICAgcmV0
dXJuIDA7CisgICAgYXV0byBsYWJlbEFuY2VzdG9ycyA9IGFuY2VzdG9yc09mVHlwZTxIVE1MTGFi
ZWxFbGVtZW50PihlbGVtZW50KTsKKyAgICBhdXRvIGVuY2xvc2luZ0xhYmVsID0gbGFiZWxBbmNl
c3RvcnMuYmVnaW4oKTsKKyAgICBpZiAoZW5jbG9zaW5nTGFiZWwgPT0gbGFiZWxBbmNlc3RvcnMu
ZW5kKCkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAmKmVuY2xvc2luZ0xhYmVsOwog
fQogCiBTdHJpbmcgQWNjZXNzaWJpbGl0eU5vZGVPYmplY3Q6OmFyaWFBY2Nlc3NpYmlsaXR5RGVz
Y3JpcHRpb24oKSBjb25zdApJbmRleDogU291cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnRBbmNlc3Rv
ckl0ZXJhdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnRBbmNl
c3Rvckl0ZXJhdG9yLmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvV2ViQ29yZS9kb20vRWxlbWVu
dEFuY2VzdG9ySXRlcmF0b3IuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDIxMiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgRWxlbWVu
dEFuY2VzdG9ySXRlcmF0b3JfaAorI2RlZmluZSBFbGVtZW50QW5jZXN0b3JJdGVyYXRvcl9oCisK
KyNpbmNsdWRlICJFbGVtZW50SXRlcmF0b3IuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit0
ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudFR5cGU+CitjbGFzcyBFbGVtZW50QW5jZXN0b3JJdGVy
YXRvciA6IHB1YmxpYyBFbGVtZW50SXRlcmF0b3I8RWxlbWVudFR5cGU+IHsKK3B1YmxpYzoKKyAg
ICBFbGVtZW50QW5jZXN0b3JJdGVyYXRvcigpOworICAgIEVsZW1lbnRBbmNlc3Rvckl0ZXJhdG9y
KEVsZW1lbnRUeXBlKiBjdXJyZW50KTsKKyAgICBFbGVtZW50QW5jZXN0b3JJdGVyYXRvciYgb3Bl
cmF0b3IrKygpOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnRUeXBlPgorY2xhc3Mg
RWxlbWVudEFuY2VzdG9yQ29uc3RJdGVyYXRvciA6IHB1YmxpYyBFbGVtZW50Q29uc3RJdGVyYXRv
cjxFbGVtZW50VHlwZT4geworcHVibGljOgorICAgIEVsZW1lbnRBbmNlc3RvckNvbnN0SXRlcmF0
b3IoKTsKKyAgICBFbGVtZW50QW5jZXN0b3JDb25zdEl0ZXJhdG9yKGNvbnN0IEVsZW1lbnRUeXBl
KiBjdXJyZW50KTsKKyAgICBFbGVtZW50QW5jZXN0b3JDb25zdEl0ZXJhdG9yJiBvcGVyYXRvcisr
KCk7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudFR5cGU+CitjbGFzcyBFbGVtZW50
QW5jZXN0b3JJdGVyYXRvckFkYXB0ZXIgeworcHVibGljOgorICAgIEVsZW1lbnRBbmNlc3Rvckl0
ZXJhdG9yQWRhcHRlcihFbGVtZW50VHlwZSogZGVzY2VuZGFudCk7CisgICAgRWxlbWVudEFuY2Vz
dG9ySXRlcmF0b3I8RWxlbWVudFR5cGU+IGJlZ2luKCk7CisgICAgRWxlbWVudEFuY2VzdG9ySXRl
cmF0b3I8RWxlbWVudFR5cGU+IGVuZCgpOworCitwcml2YXRlOgorICAgIEVsZW1lbnRUeXBlKiBt
X2ZpcnN0OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnRUeXBlPgorY2xhc3MgRWxl
bWVudEFuY2VzdG9yQ29uc3RJdGVyYXRvckFkYXB0ZXIgeworcHVibGljOgorICAgIEVsZW1lbnRB
bmNlc3RvckNvbnN0SXRlcmF0b3JBZGFwdGVyKGNvbnN0IEVsZW1lbnRUeXBlKiBkZXNjZW5kYW50
KTsKKyAgICBFbGVtZW50QW5jZXN0b3JDb25zdEl0ZXJhdG9yPEVsZW1lbnRUeXBlPiBiZWdpbigp
IGNvbnN0OworICAgIEVsZW1lbnRBbmNlc3RvckNvbnN0SXRlcmF0b3I8RWxlbWVudFR5cGU+IGVu
ZCgpIGNvbnN0OworCitwcml2YXRlOgorICAgIGNvbnN0IEVsZW1lbnRUeXBlKiBtX2ZpcnN0Owor
fTsKKworRWxlbWVudEFuY2VzdG9ySXRlcmF0b3JBZGFwdGVyPEVsZW1lbnQ+IGVsZW1lbnRMaW5l
YWdlKEVsZW1lbnQqIGN1cnJlbnQpOworRWxlbWVudEFuY2VzdG9ySXRlcmF0b3JBZGFwdGVyPEVs
ZW1lbnQ+IGVsZW1lbnRMaW5lYWdlKE5vZGUqIGN1cnJlbnQpOworRWxlbWVudEFuY2VzdG9yQ29u
c3RJdGVyYXRvckFkYXB0ZXI8RWxlbWVudD4gZWxlbWVudExpbmVhZ2UoY29uc3QgRWxlbWVudCog
Y3VycmVudCk7CitFbGVtZW50QW5jZXN0b3JDb25zdEl0ZXJhdG9yQWRhcHRlcjxFbGVtZW50PiBl
bGVtZW50TGluZWFnZShjb25zdCBOb2RlKiBjdXJyZW50KTsKK0VsZW1lbnRBbmNlc3Rvckl0ZXJh
dG9yQWRhcHRlcjxFbGVtZW50PiBlbGVtZW50QW5jZXN0b3JzKE5vZGUqIGRlc2NlbmRhbnQpOwor
RWxlbWVudEFuY2VzdG9yQ29uc3RJdGVyYXRvckFkYXB0ZXI8RWxlbWVudD4gZWxlbWVudEFuY2Vz
dG9ycyhjb25zdCBOb2RlKiBkZXNjZW5kYW50KTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50
VHlwZT4gRWxlbWVudEFuY2VzdG9ySXRlcmF0b3JBZGFwdGVyPEVsZW1lbnRUeXBlPiBhbmNlc3Rv
cnNPZlR5cGUoTm9kZSogZGVzY2VuZGFudCk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudFR5
cGU+IEVsZW1lbnRBbmNlc3RvckNvbnN0SXRlcmF0b3JBZGFwdGVyPEVsZW1lbnRUeXBlPiBhbmNl
c3RvcnNPZlR5cGUoY29uc3QgTm9kZSogZGVzY2VuZGFudCk7CisKKy8vIEVsZW1lbnRBbmNlc3Rv
ckl0ZXJhdG9yCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50VHlwZT4KK2lubGluZSBFbGVt
ZW50QW5jZXN0b3JJdGVyYXRvcjxFbGVtZW50VHlwZT46OkVsZW1lbnRBbmNlc3Rvckl0ZXJhdG9y
KCkKKyAgICA6IEVsZW1lbnRJdGVyYXRvcjxFbGVtZW50VHlwZT4obnVsbHB0cikKK3sKK30KKwor
dGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnRUeXBlPgoraW5saW5lIEVsZW1lbnRBbmNlc3Rvckl0
ZXJhdG9yPEVsZW1lbnRUeXBlPjo6RWxlbWVudEFuY2VzdG9ySXRlcmF0b3IoRWxlbWVudFR5cGUq
IGN1cnJlbnQpCisgICAgOiBFbGVtZW50SXRlcmF0b3I8RWxlbWVudFR5cGU+KG51bGxwdHIsIGN1
cnJlbnQpCit7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50VHlwZT4KK2lubGluZSBF
bGVtZW50QW5jZXN0b3JJdGVyYXRvcjxFbGVtZW50VHlwZT4mIEVsZW1lbnRBbmNlc3Rvckl0ZXJh
dG9yPEVsZW1lbnRUeXBlPjo6b3BlcmF0b3IrKygpCit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0
PEVsZW1lbnRBbmNlc3Rvckl0ZXJhdG9yPEVsZW1lbnRUeXBlPiY+KEVsZW1lbnRJdGVyYXRvcjxF
bGVtZW50VHlwZT46OnRyYXZlcnNlQW5jZXN0b3IoKSk7Cit9CisKKy8vIEVsZW1lbnRBbmNlc3Rv
ckNvbnN0SXRlcmF0b3IKKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnRUeXBlPgoraW5saW5l
IEVsZW1lbnRBbmNlc3RvckNvbnN0SXRlcmF0b3I8RWxlbWVudFR5cGU+OjpFbGVtZW50QW5jZXN0
b3JDb25zdEl0ZXJhdG9yKCkKKyAgICA6IEVsZW1lbnRDb25zdEl0ZXJhdG9yPEVsZW1lbnRUeXBl
PihudWxscHRyKQoreworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudFR5cGU+Citpbmxp
bmUgRWxlbWVudEFuY2VzdG9yQ29uc3RJdGVyYXRvcjxFbGVtZW50VHlwZT46OkVsZW1lbnRBbmNl
c3RvckNvbnN0SXRlcmF0b3IoY29uc3QgRWxlbWVudFR5cGUqIGN1cnJlbnQpCisgICAgOiBFbGVt
ZW50Q29uc3RJdGVyYXRvcjxFbGVtZW50VHlwZT4obnVsbHB0ciwgY3VycmVudCkKK3sKK30KKwor
dGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnRUeXBlPgoraW5saW5lIEVsZW1lbnRBbmNlc3RvckNv
bnN0SXRlcmF0b3I8RWxlbWVudFR5cGU+JiBFbGVtZW50QW5jZXN0b3JDb25zdEl0ZXJhdG9yPEVs
ZW1lbnRUeXBlPjo6b3BlcmF0b3IrKygpCit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEVsZW1l
bnRBbmNlc3RvckNvbnN0SXRlcmF0b3I8RWxlbWVudFR5cGU+Jj4oRWxlbWVudENvbnN0SXRlcmF0
b3I8RWxlbWVudFR5cGU+Ojp0cmF2ZXJzZUFuY2VzdG9yKCkpOworfQorCisvLyBFbGVtZW50QW5j
ZXN0b3JJdGVyYXRvckFkYXB0ZXIKKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnRUeXBlPgor
aW5saW5lIEVsZW1lbnRBbmNlc3Rvckl0ZXJhdG9yQWRhcHRlcjxFbGVtZW50VHlwZT46OkVsZW1l
bnRBbmNlc3Rvckl0ZXJhdG9yQWRhcHRlcihFbGVtZW50VHlwZSogZmlyc3QpCisgICAgOiBtX2Zp
cnN0KGZpcnN0KQoreworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudFR5cGU+Citpbmxp
bmUgRWxlbWVudEFuY2VzdG9ySXRlcmF0b3I8RWxlbWVudFR5cGU+IEVsZW1lbnRBbmNlc3Rvckl0
ZXJhdG9yQWRhcHRlcjxFbGVtZW50VHlwZT46OmJlZ2luKCkKK3sKKyAgICByZXR1cm4gRWxlbWVu
dEFuY2VzdG9ySXRlcmF0b3I8RWxlbWVudFR5cGU+KG1fZmlyc3QpOworfQorCit0ZW1wbGF0ZSA8
dHlwZW5hbWUgRWxlbWVudFR5cGU+CitpbmxpbmUgRWxlbWVudEFuY2VzdG9ySXRlcmF0b3I8RWxl
bWVudFR5cGU+IEVsZW1lbnRBbmNlc3Rvckl0ZXJhdG9yQWRhcHRlcjxFbGVtZW50VHlwZT46OmVu
ZCgpCit7CisgICAgcmV0dXJuIEVsZW1lbnRBbmNlc3Rvckl0ZXJhdG9yPEVsZW1lbnRUeXBlPigp
OworfQorCisvLyBFbGVtZW50QW5jZXN0b3JDb25zdEl0ZXJhdG9yQWRhcHRlcgorCit0ZW1wbGF0
ZSA8dHlwZW5hbWUgRWxlbWVudFR5cGU+CitpbmxpbmUgRWxlbWVudEFuY2VzdG9yQ29uc3RJdGVy
YXRvckFkYXB0ZXI8RWxlbWVudFR5cGU+OjpFbGVtZW50QW5jZXN0b3JDb25zdEl0ZXJhdG9yQWRh
cHRlcihjb25zdCBFbGVtZW50VHlwZSogZmlyc3QpCisgICAgOiBtX2ZpcnN0KGZpcnN0KQorewor
fQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudFR5cGU+CitpbmxpbmUgRWxlbWVudEFuY2Vz
dG9yQ29uc3RJdGVyYXRvcjxFbGVtZW50VHlwZT4gRWxlbWVudEFuY2VzdG9yQ29uc3RJdGVyYXRv
ckFkYXB0ZXI8RWxlbWVudFR5cGU+OjpiZWdpbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIEVsZW1l
bnRBbmNlc3RvckNvbnN0SXRlcmF0b3I8RWxlbWVudFR5cGU+KG1fZmlyc3QpOworfQorCit0ZW1w
bGF0ZSA8dHlwZW5hbWUgRWxlbWVudFR5cGU+CitpbmxpbmUgRWxlbWVudEFuY2VzdG9yQ29uc3RJ
dGVyYXRvcjxFbGVtZW50VHlwZT4gRWxlbWVudEFuY2VzdG9yQ29uc3RJdGVyYXRvckFkYXB0ZXI8
RWxlbWVudFR5cGU+OjplbmQoKSBjb25zdAoreworICAgIHJldHVybiBFbGVtZW50QW5jZXN0b3JD
b25zdEl0ZXJhdG9yPEVsZW1lbnRUeXBlPigpOworfQorCisvLyBTdGFuZGFsb25lIGZ1bmN0aW9u
cworCitpbmxpbmUgRWxlbWVudEFuY2VzdG9ySXRlcmF0b3JBZGFwdGVyPEVsZW1lbnQ+IGVsZW1l
bnRMaW5lYWdlKEVsZW1lbnQqIGN1cnJlbnQpCit7CisgICAgcmV0dXJuIEVsZW1lbnRBbmNlc3Rv
ckl0ZXJhdG9yQWRhcHRlcjxFbGVtZW50PihjdXJyZW50KTsKK30KKworaW5saW5lIEVsZW1lbnRB
bmNlc3Rvckl0ZXJhdG9yQWRhcHRlcjxFbGVtZW50PiBlbGVtZW50TGluZWFnZShOb2RlKiBjdXJy
ZW50KQoreworICAgIEVsZW1lbnQqIGZpcnN0ID0gY3VycmVudC0+aXNFbGVtZW50Tm9kZSgpID8g
dG9FbGVtZW50KGN1cnJlbnQpIDogZmluZEVsZW1lbnRBbmNlc3Rvck9mVHlwZTxFbGVtZW50Pigq
Y3VycmVudCk7CisgICAgcmV0dXJuIEVsZW1lbnRBbmNlc3Rvckl0ZXJhdG9yQWRhcHRlcjxFbGVt
ZW50PihmaXJzdCk7Cit9CisKK2lubGluZSBFbGVtZW50QW5jZXN0b3JJdGVyYXRvckFkYXB0ZXI8
RWxlbWVudD4gZWxlbWVudEFuY2VzdG9ycyhOb2RlKiBkZXNjZW5kYW50KQoreworICAgIEVsZW1l
bnQqIGZpcnN0ID0gZmluZEVsZW1lbnRBbmNlc3Rvck9mVHlwZTxFbGVtZW50PigqZGVzY2VuZGFu
dCk7CisgICAgcmV0dXJuIEVsZW1lbnRBbmNlc3Rvckl0ZXJhdG9yQWRhcHRlcjxFbGVtZW50Pihm
aXJzdCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50VHlwZT4KK2lubGluZSBFbGVt
ZW50QW5jZXN0b3JJdGVyYXRvckFkYXB0ZXI8RWxlbWVudFR5cGU+IGFuY2VzdG9yc09mVHlwZShO
b2RlKiBkZXNjZW5kYW50KQoreworICAgIEVsZW1lbnRUeXBlKiBmaXJzdCA9IGZpbmRFbGVtZW50
QW5jZXN0b3JPZlR5cGU8RWxlbWVudFR5cGU+KCpkZXNjZW5kYW50KTsKKyAgICByZXR1cm4gRWxl
bWVudEFuY2VzdG9ySXRlcmF0b3JBZGFwdGVyPEVsZW1lbnRUeXBlPihmaXJzdCk7Cit9CisKK2lu
bGluZSBFbGVtZW50QW5jZXN0b3JDb25zdEl0ZXJhdG9yQWRhcHRlcjxFbGVtZW50PiBlbGVtZW50
TGluZWFnZShjb25zdCBFbGVtZW50KiBjdXJyZW50KQoreworICAgIHJldHVybiBFbGVtZW50QW5j
ZXN0b3JDb25zdEl0ZXJhdG9yQWRhcHRlcjxFbGVtZW50PihjdXJyZW50KTsKK30KKworaW5saW5l
IEVsZW1lbnRBbmNlc3RvckNvbnN0SXRlcmF0b3JBZGFwdGVyPEVsZW1lbnQ+IGVsZW1lbnRMaW5l
YWdlKGNvbnN0IE5vZGUqIGN1cnJlbnQpCit7CisgICAgY29uc3QgRWxlbWVudCogZmlyc3QgPSBj
dXJyZW50LT5pc0VsZW1lbnROb2RlKCkgPyB0b0VsZW1lbnQoY3VycmVudCkgOiBmaW5kRWxlbWVu
dEFuY2VzdG9yT2ZUeXBlPEVsZW1lbnQ+KCpjdXJyZW50KTsKKyAgICByZXR1cm4gRWxlbWVudEFu
Y2VzdG9yQ29uc3RJdGVyYXRvckFkYXB0ZXI8RWxlbWVudD4oZmlyc3QpOworfQorCitpbmxpbmUg
RWxlbWVudEFuY2VzdG9yQ29uc3RJdGVyYXRvckFkYXB0ZXI8RWxlbWVudD4gZWxlbWVudEFuY2Vz
dG9ycyhjb25zdCBOb2RlKiBkZXNjZW5kYW50KQoreworICAgIGNvbnN0IEVsZW1lbnQqIGZpcnN0
ID0gZmluZEVsZW1lbnRBbmNlc3Rvck9mVHlwZTxjb25zdCBFbGVtZW50PigqZGVzY2VuZGFudCk7
CisgICAgcmV0dXJuIEVsZW1lbnRBbmNlc3RvckNvbnN0SXRlcmF0b3JBZGFwdGVyPEVsZW1lbnQ+
KGZpcnN0KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnRUeXBlPgoraW5saW5lIEVs
ZW1lbnRBbmNlc3RvckNvbnN0SXRlcmF0b3JBZGFwdGVyPEVsZW1lbnRUeXBlPiBhbmNlc3RvcnNP
ZlR5cGUoY29uc3QgTm9kZSogZGVzY2VuZGFudCkKK3sKKyAgICBjb25zdCBFbGVtZW50VHlwZSog
Zmlyc3QgPSBmaW5kRWxlbWVudEFuY2VzdG9yT2ZUeXBlPGNvbnN0IEVsZW1lbnRUeXBlPigqZGVz
Y2VuZGFudCk7CisgICAgcmV0dXJuIEVsZW1lbnRBbmNlc3RvckNvbnN0SXRlcmF0b3JBZGFwdGVy
PEVsZW1lbnRUeXBlPihmaXJzdCk7Cit9CisKK30KKworI2VuZGlmCkluZGV4OiBTb3VyY2UvV2Vi
Q29yZS9kb20vRWxlbWVudEl0ZXJhdG9yLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUv
ZG9tL0VsZW1lbnRJdGVyYXRvci5oCShyZXZpc2lvbiAxNTQ5MjgpCisrKyBTb3VyY2UvV2ViQ29y
ZS9kb20vRWxlbWVudEl0ZXJhdG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTQzLDEyICs0MywxNCBA
QCBwdWJsaWM6CiAgICAgRWxlbWVudFR5cGUmIG9wZXJhdG9yKigpOwogICAgIEVsZW1lbnRUeXBl
KiBvcGVyYXRvci0+KCk7CiAKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgRWxlbWVudEl0ZXJh
dG9yJiBvdGhlcikgY29uc3Q7CiAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEVsZW1lbnRJdGVy
YXRvciYgb3RoZXIpIGNvbnN0OwogCiAgICAgRWxlbWVudEl0ZXJhdG9yJiB0cmF2ZXJzZU5leHQo
KTsKICAgICBFbGVtZW50SXRlcmF0b3ImIHRyYXZlcnNlUHJldmlvdXMoKTsKICAgICBFbGVtZW50
SXRlcmF0b3ImIHRyYXZlcnNlTmV4dFNpYmxpbmcoKTsKICAgICBFbGVtZW50SXRlcmF0b3ImIHRy
YXZlcnNlUHJldmlvdXNTaWJsaW5nKCk7CisgICAgRWxlbWVudEl0ZXJhdG9yJiB0cmF2ZXJzZUFu
Y2VzdG9yKCk7CiAKIHByaXZhdGU6CiAgICAgY29uc3QgQ29udGFpbmVyTm9kZSogbV9yb290OwpA
QCAtNjgsMTIgKzcwLDE0IEBAIHB1YmxpYzoKICAgICBjb25zdCBFbGVtZW50VHlwZSYgb3BlcmF0
b3IqKCkgY29uc3Q7CiAgICAgY29uc3QgRWxlbWVudFR5cGUqIG9wZXJhdG9yLT4oKSBjb25zdDsK
IAorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBFbGVtZW50Q29uc3RJdGVyYXRvciYgb3RoZXIp
IGNvbnN0OwogICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBFbGVtZW50Q29uc3RJdGVyYXRvciYg
b3RoZXIpIGNvbnN0OwogCiAgICAgRWxlbWVudENvbnN0SXRlcmF0b3ImIHRyYXZlcnNlTmV4dCgp
OwogICAgIEVsZW1lbnRDb25zdEl0ZXJhdG9yJiB0cmF2ZXJzZVByZXZpb3VzKCk7CiAgICAgRWxl
bWVudENvbnN0SXRlcmF0b3ImIHRyYXZlcnNlTmV4dFNpYmxpbmcoKTsKICAgICBFbGVtZW50Q29u
c3RJdGVyYXRvciYgdHJhdmVyc2VQcmV2aW91c1NpYmxpbmcoKTsKKyAgICBFbGVtZW50Q29uc3RJ
dGVyYXRvciYgdHJhdmVyc2VBbmNlc3RvcigpOwogCiBwcml2YXRlOgogICAgIGNvbnN0IENvbnRh
aW5lck5vZGUqIG1fcm9vdDsKQEAgLTE1OSw2ICsxNjMsMzcgQEAgaW5saW5lIEVsZW1lbnRJdGVy
YXRvcjxFbGVtZW50VHlwZT4mIEVsZQogICAgIHJldHVybiAqdGhpczsKIH0KIAordGVtcGxhdGUg
PHR5cGVuYW1lIEVsZW1lbnRUeXBlV2l0aENvbnN0PgoraW5saW5lIEVsZW1lbnRUeXBlV2l0aENv
bnN0KiBmaW5kRWxlbWVudEFuY2VzdG9yT2ZUeXBlKGNvbnN0IE5vZGUmIGN1cnJlbnQpCit7Cisg
ICAgQ29udGFpbmVyTm9kZSogYW5jZXN0b3IgPSBjdXJyZW50LnBhcmVudE5vZGUoKTsKKyAgICB3
aGlsZSAoYW5jZXN0b3IgJiYgYW5jZXN0b3ItPmlzRWxlbWVudE5vZGUoKSkgeworICAgICAgICAv
LyBOb24tcm9vdCBjb250YWluZXJzIGFyZSBhbHdheXMgRWxlbWVudHMuCisgICAgICAgIEVsZW1l
bnQqIGVsZW1lbnQgPSB0b0VsZW1lbnQoYW5jZXN0b3IpOworICAgICAgICBpZiAoaXNFbGVtZW50
T2ZUeXBlPEVsZW1lbnRUeXBlV2l0aENvbnN0PihlbGVtZW50KSkKKyAgICAgICAgICAgIHJldHVy
biBzdGF0aWNfY2FzdDxFbGVtZW50VHlwZVdpdGhDb25zdCo+KGVsZW1lbnQpOworICAgICAgICBh
bmNlc3RvciA9IGFuY2VzdG9yLT5wYXJlbnROb2RlKCk7CisgICAgfQorICAgIHJldHVybiBudWxs
cHRyOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudFR5cGU+CitpbmxpbmUgRWxlbWVu
dEl0ZXJhdG9yPEVsZW1lbnRUeXBlPiYgRWxlbWVudEl0ZXJhdG9yPEVsZW1lbnRUeXBlPjo6dHJh
dmVyc2VBbmNlc3RvcigpCit7CisgICAgQVNTRVJUKG1fY3VycmVudCk7CisgICAgQVNTRVJUKG1f
Y3VycmVudCAhPSBtX3Jvb3QpOworICAgIEFTU0VSVCghbV9hc3NlcnRpb25zLmRvbVRyZWVIYXNN
dXRhdGVkKCkpOworCisgICAgbV9jdXJyZW50ID0gZmluZEVsZW1lbnRBbmNlc3Rvck9mVHlwZTxF
bGVtZW50VHlwZT4oKm1fY3VycmVudCk7CisKKyNpZiAhQVNTRVJUX0RJU0FCTEVECisgICAgLy8g
RHJvcCB0aGUgYXNzZXJ0aW9uIHdoZW4gdGhlIGl0ZXJhdG9yIHJlYWNoZXMgdGhlIGVuZC4KKyAg
ICBpZiAoIW1fY3VycmVudCkKKyAgICAgICAgbV9hc3NlcnRpb25zLmRyb3BFdmVudERpc3BhdGNo
QXNzZXJ0aW9uKCk7CisjZW5kaWYKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKIHRlbXBsYXRlIDx0
eXBlbmFtZSBFbGVtZW50VHlwZT4KIGlubGluZSBFbGVtZW50VHlwZSYgRWxlbWVudEl0ZXJhdG9y
PEVsZW1lbnRUeXBlPjo6b3BlcmF0b3IqKCkKIHsKQEAgLTE3NiwxMSArMjExLDE3IEBAIGlubGlu
ZSBFbGVtZW50VHlwZSogRWxlbWVudEl0ZXJhdG9yPEVsZW0KIH0KIAogdGVtcGxhdGUgPHR5cGVu
YW1lIEVsZW1lbnRUeXBlPgotaW5saW5lIGJvb2wgRWxlbWVudEl0ZXJhdG9yPEVsZW1lbnRUeXBl
Pjo6b3BlcmF0b3IhPShjb25zdCBFbGVtZW50SXRlcmF0b3ImIG90aGVyKSBjb25zdAoraW5saW5l
IGJvb2wgRWxlbWVudEl0ZXJhdG9yPEVsZW1lbnRUeXBlPjo6b3BlcmF0b3I9PShjb25zdCBFbGVt
ZW50SXRlcmF0b3ImIG90aGVyKSBjb25zdAogewogICAgIEFTU0VSVChtX3Jvb3QgPT0gb3RoZXIu
bV9yb290KTsKICAgICBBU1NFUlQoIW1fYXNzZXJ0aW9ucy5kb21UcmVlSGFzTXV0YXRlZCgpKTsK
LSAgICByZXR1cm4gbV9jdXJyZW50ICE9IG90aGVyLm1fY3VycmVudDsKKyAgICByZXR1cm4gbV9j
dXJyZW50ID09IG90aGVyLm1fY3VycmVudDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1l
bnRUeXBlPgoraW5saW5lIGJvb2wgRWxlbWVudEl0ZXJhdG9yPEVsZW1lbnRUeXBlPjo6b3BlcmF0
b3IhPShjb25zdCBFbGVtZW50SXRlcmF0b3ImIG90aGVyKSBjb25zdAoreworICAgIHJldHVybiAh
KCp0aGlzID09IG90aGVyKTsKIH0KIAogLy8gRWxlbWVudENvbnN0SXRlcmF0b3IKQEAgLTI1OSw2
ICszMDAsMjMgQEAgaW5saW5lIEVsZW1lbnRDb25zdEl0ZXJhdG9yPEVsZW1lbnRUeXBlPgogfQog
CiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudFR5cGU+CitpbmxpbmUgRWxlbWVudENvbnN0SXRl
cmF0b3I8RWxlbWVudFR5cGU+JiBFbGVtZW50Q29uc3RJdGVyYXRvcjxFbGVtZW50VHlwZT46OnRy
YXZlcnNlQW5jZXN0b3IoKQoreworICAgIEFTU0VSVChtX2N1cnJlbnQpOworICAgIEFTU0VSVCht
X2N1cnJlbnQgIT0gbV9yb290KTsKKyAgICBBU1NFUlQoIW1fYXNzZXJ0aW9ucy5kb21UcmVlSGFz
TXV0YXRlZCgpKTsKKworICAgIG1fY3VycmVudCA9IGZpbmRFbGVtZW50QW5jZXN0b3JPZlR5cGU8
Y29uc3QgRWxlbWVudFR5cGU+KCptX2N1cnJlbnQpOworCisjaWYgIUFTU0VSVF9ESVNBQkxFRAor
ICAgIC8vIERyb3AgdGhlIGFzc2VydGlvbiB3aGVuIHRoZSBpdGVyYXRvciByZWFjaGVzIHRoZSBl
bmQuCisgICAgaWYgKCFtX2N1cnJlbnQpCisgICAgICAgIG1fYXNzZXJ0aW9ucy5kcm9wRXZlbnRE
aXNwYXRjaEFzc2VydGlvbigpOworI2VuZGlmCisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1w
bGF0ZSA8dHlwZW5hbWUgRWxlbWVudFR5cGU+CiBpbmxpbmUgY29uc3QgRWxlbWVudFR5cGUmIEVs
ZW1lbnRDb25zdEl0ZXJhdG9yPEVsZW1lbnRUeXBlPjo6b3BlcmF0b3IqKCkgY29uc3QKIHsKICAg
ICBBU1NFUlQobV9jdXJyZW50KTsKQEAgLTI3NSwxNSArMzMzLDIyIEBAIGlubGluZSBjb25zdCBF
bGVtZW50VHlwZSogRWxlbWVudENvbnN0SXQKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1l
bnRUeXBlPgotaW5saW5lIGJvb2wgRWxlbWVudENvbnN0SXRlcmF0b3I8RWxlbWVudFR5cGU+Ojpv
cGVyYXRvciE9KGNvbnN0IEVsZW1lbnRDb25zdEl0ZXJhdG9yJiBvdGhlcikgY29uc3QKK2lubGlu
ZSBib29sIEVsZW1lbnRDb25zdEl0ZXJhdG9yPEVsZW1lbnRUeXBlPjo6b3BlcmF0b3I9PShjb25z
dCBFbGVtZW50Q29uc3RJdGVyYXRvciYgb3RoZXIpIGNvbnN0CiB7CiAgICAgQVNTRVJUKG1fcm9v
dCA9PSBvdGhlci5tX3Jvb3QpOwogICAgIEFTU0VSVCghbV9hc3NlcnRpb25zLmRvbVRyZWVIYXNN
dXRhdGVkKCkpOwotICAgIHJldHVybiBtX2N1cnJlbnQgIT0gb3RoZXIubV9jdXJyZW50OworICAg
IHJldHVybiBtX2N1cnJlbnQgPT0gb3RoZXIubV9jdXJyZW50OworfQorCit0ZW1wbGF0ZSA8dHlw
ZW5hbWUgRWxlbWVudFR5cGU+CitpbmxpbmUgYm9vbCBFbGVtZW50Q29uc3RJdGVyYXRvcjxFbGVt
ZW50VHlwZT46Om9wZXJhdG9yIT0oY29uc3QgRWxlbWVudENvbnN0SXRlcmF0b3ImIG90aGVyKSBj
b25zdAoreworICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKIH0KIAogfQogCisjaW5jbHVk
ZSAiRWxlbWVudEFuY2VzdG9ySXRlcmF0b3IuaCIKICNpbmNsdWRlICJFbGVtZW50Q2hpbGRJdGVy
YXRvci5oIgogI2luY2x1ZGUgIkVsZW1lbnREZXNjZW5kYW50SXRlcmF0b3IuaCIKIApJbmRleDog
U291cmNlL1dlYkNvcmUvaHRtbC9IVE1MRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvaHRtbC9IVE1MRWxlbWVudC5jcHAJKHJldmlzaW9uIDE1NDkyNykKKysrIFNvdXJj
ZS9XZWJDb3JlL2h0bWwvSFRNTEVsZW1lbnQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2ICsz
Miw3IEBACiAjaW5jbHVkZSAiQ1NTVmFsdWVQb29sLmgiCiAjaW5jbHVkZSAiRE9NU2V0dGFibGVU
b2tlbkxpc3QuaCIKICNpbmNsdWRlICJEb2N1bWVudEZyYWdtZW50LmgiCisjaW5jbHVkZSAiRWxl
bWVudEl0ZXJhdG9yLmgiCiAjaW5jbHVkZSAiRXZlbnQuaCIKICNpbmNsdWRlICJFdmVudExpc3Rl
bmVyLmgiCiAjaW5jbHVkZSAiRXZlbnROYW1lcy5oIgpAQCAtODkwLDkgKzg5MSwxMCBAQCB2b2lk
IEhUTUxFbGVtZW50OjphZGp1c3REaXJlY3Rpb25hbGl0eUlmCiAgICAgVGV4dERpcmVjdGlvbiB0
ZXh0RGlyZWN0aW9uID0gZGlyZWN0aW9uYWxpdHkoJnN0cm9uZ0RpcmVjdGlvbmFsaXR5VGV4dE5v
ZGUpOwogICAgIHNldEhhc0RpckF1dG9GbGFnUmVjdXJzaXZlbHkoY2hpbGQsIGZhbHNlKTsKICAg
ICBpZiAocmVuZGVyZXIoKSAmJiByZW5kZXJlcigpLT5zdHlsZSgpICYmIHJlbmRlcmVyKCktPnN0
eWxlKCktPmRpcmVjdGlvbigpICE9IHRleHREaXJlY3Rpb24pIHsKLSAgICAgICAgRWxlbWVudCog
ZWxlbWVudFRvQWRqdXN0ID0gdGhpczsKLSAgICAgICAgZm9yICg7IGVsZW1lbnRUb0FkanVzdDsg
ZWxlbWVudFRvQWRqdXN0ID0gZWxlbWVudFRvQWRqdXN0LT5wYXJlbnRFbGVtZW50KCkpIHsKLSAg
ICAgICAgICAgIGlmIChlbGVtZW50QWZmZWN0c0RpcmVjdGlvbmFsaXR5KGVsZW1lbnRUb0FkanVz
dCkpIHsKKworICAgICAgICBhdXRvIGxpbmVhZ2UgPSBlbGVtZW50TGluZWFnZSh0aGlzKTsKKyAg
ICAgICAgZm9yIChhdXRvIGVsZW1lbnRUb0FkanVzdCA9IGxpbmVhZ2UuYmVnaW4oKSwgZW5kID0g
bGluZWFnZS5lbmQoKTsgZWxlbWVudFRvQWRqdXN0ICE9IGVuZDsgKytlbGVtZW50VG9BZGp1c3Qp
IHsKKyAgICAgICAgICAgIGlmIChlbGVtZW50QWZmZWN0c0RpcmVjdGlvbmFsaXR5KCYqZWxlbWVu
dFRvQWRqdXN0KSkgewogICAgICAgICAgICAgICAgIGVsZW1lbnRUb0FkanVzdC0+c2V0TmVlZHNT
dHlsZVJlY2FsYygpOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTEZpZWxkU2V0RWxlbWVudC5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTEZpZWxkU2V0RWxlbWVudC5oCShyZXZpc2lvbiAx
NTQ5MjcpCisrKyBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxGaWVsZFNldEVsZW1lbnQuaAkod29y
a2luZyBjb3B5KQpAQCAtNjMsNiArNjMsMTkgQEAgcHJpdmF0ZToKICAgICBtdXRhYmxlIHVpbnQ2
NF90IG1fZG9jdW1lbnRWZXJzaW9uOwogfTsKIAoraW5saW5lIGJvb2wgaXNIVE1MRmllbGRTZXRF
bGVtZW50KGNvbnN0IE5vZGUqIG5vZGUpCit7CisgICAgcmV0dXJuIG5vZGUtPmlzRWxlbWVudE5v
ZGUoKSAmJiB0b0VsZW1lbnQobm9kZSktPmhhc1RhZ05hbWUoSFRNTE5hbWVzOjpmaWVsZHNldFRh
Zyk7Cit9CisKK2lubGluZSBib29sIGlzSFRNTEZpZWxkU2V0RWxlbWVudChjb25zdCBFbGVtZW50
KiBlbGVtZW50KQoreworICAgIHJldHVybiBlbGVtZW50LT5oYXNUYWdOYW1lKEhUTUxOYW1lczo6
ZmllbGRzZXRUYWcpOworfQorCit0ZW1wbGF0ZSA8PiBpbmxpbmUgYm9vbCBpc0VsZW1lbnRPZlR5
cGU8SFRNTEZpZWxkU2V0RWxlbWVudD4oY29uc3QgRWxlbWVudCogZWxlbWVudCkgeyByZXR1cm4g
aXNIVE1MRmllbGRTZXRFbGVtZW50KGVsZW1lbnQpOyB9CisKKwogfSAvLyBuYW1lc3BhY2UKIAog
I2VuZGlmCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9odG1sL0hUTUxGcmFtZVNldEVsZW1lbnQuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTEZyYW1lU2V0RWxlbWVudC5j
cHAJKHJldmlzaW9uIDE1NDkyNykKKysrIFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTEZyYW1lU2V0
RWxlbWVudC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlICJB
dHRyaWJ1dGUuaCIKICNpbmNsdWRlICJDU1NQcm9wZXJ0eU5hbWVzLmgiCiAjaW5jbHVkZSAiRG9j
dW1lbnQuaCIKKyNpbmNsdWRlICJFbGVtZW50SXRlcmF0b3IuaCIKICNpbmNsdWRlICJFdmVudC5o
IgogI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIKICNpbmNsdWRlICJGcmFtZS5oIgpAQCAtMTY1LDEx
ICsxNjYsMTEgQEAgUmVuZGVyT2JqZWN0ICpIVE1MRnJhbWVTZXRFbGVtZW50OjpjcmVhdAogCiBI
VE1MRnJhbWVTZXRFbGVtZW50KiBIVE1MRnJhbWVTZXRFbGVtZW50OjpmaW5kQ29udGFpbmluZyhO
b2RlKiBub2RlKQogewotICAgIGZvciAoRWxlbWVudCogcGFyZW50ID0gbm9kZS0+cGFyZW50RWxl
bWVudCgpOyBwYXJlbnQ7IHBhcmVudCA9IHBhcmVudC0+cGFyZW50RWxlbWVudCgpKSB7Ci0gICAg
ICAgIGlmIChpc0hUTUxGcmFtZVNldEVsZW1lbnQocGFyZW50KSkKLSAgICAgICAgICAgIHJldHVy
biB0b0hUTUxGcmFtZVNldEVsZW1lbnQocGFyZW50KTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Cisg
ICAgYXV0byBhbmNlc3RvckZyYW1lU2V0cyA9IGFuY2VzdG9yc09mVHlwZTxIVE1MRnJhbWVTZXRF
bGVtZW50Pihub2RlKTsKKyAgICBhdXRvIGVuY2xvc2luZ0ZyYW1lU2V0ID0gYW5jZXN0b3JGcmFt
ZVNldHMuYmVnaW4oKTsKKyAgICBpZiAoZW5jbG9zaW5nRnJhbWVTZXQgPT0gYW5jZXN0b3JGcmFt
ZVNldHMuZW5kKCkpCisgICAgICAgIHJldHVybiAwOworICAgIHJldHVybiAmKmVuY2xvc2luZ0Zy
YW1lU2V0OwogfQogCiB2b2lkIEhUTUxGcmFtZVNldEVsZW1lbnQ6OndpbGxBdHRhY2hSZW5kZXJl
cnMoKQpJbmRleDogU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MRnJhbWVTZXRFbGVtZW50LmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9IVE1MRnJhbWVTZXRFbGVtZW50LmgJKHJl
dmlzaW9uIDE1NDkyNykKKysrIFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTEZyYW1lU2V0RWxlbWVu
dC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xMjIsNiArMTIyLDggQEAgaW5saW5lIGNvbnN0IEhUTUxG
cmFtZVNldEVsZW1lbnQqIHRvSFRNTAogICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBIVE1M
RnJhbWVTZXRFbGVtZW50Kj4obm9kZSk7CiB9CiAKK3RlbXBsYXRlIDw+IGlubGluZSBib29sIGlz
RWxlbWVudE9mVHlwZTxIVE1MRnJhbWVTZXRFbGVtZW50Pihjb25zdCBFbGVtZW50KiBlbGVtZW50
KSB7IHJldHVybiBpc0hUTUxGcmFtZVNldEVsZW1lbnQoZWxlbWVudCk7IH0KKwogfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQogCiAjZW5kaWYgLy8gSFRNTEZyYW1lU2V0RWxlbWVudF9oCkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9odG1sL0hUTUxJbnB1dEVsZW1lbnQuaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvV2ViQ29yZS9odG1sL0hUTUxJbnB1dEVsZW1lbnQuaAkocmV2aXNpb24gMTU0OTI3KQorKysg
U291cmNlL1dlYkNvcmUvaHRtbC9IVE1MSW5wdXRFbGVtZW50LmgJKHdvcmtpbmcgY29weSkKQEAg
LTQ0MywxMiArNDQzLDEyIEBAIHByaXZhdGU6CiAjZW5kaWYKIH07CiAKLWlubGluZSBib29sIGlz
SFRNTElucHV0RWxlbWVudChOb2RlKiBub2RlKQoraW5saW5lIGJvb2wgaXNIVE1MSW5wdXRFbGVt
ZW50KGNvbnN0IE5vZGUqIG5vZGUpCiB7CiAgICAgcmV0dXJuIG5vZGUtPmhhc1RhZ05hbWUoSFRN
TE5hbWVzOjppbnB1dFRhZyk7CiB9CiAKLWlubGluZSBib29sIGlzSFRNTElucHV0RWxlbWVudChF
bGVtZW50KiBlbGVtZW50KQoraW5saW5lIGJvb2wgaXNIVE1MSW5wdXRFbGVtZW50KGNvbnN0IEVs
ZW1lbnQqIGVsZW1lbnQpCiB7CiAgICAgcmV0dXJuIGVsZW1lbnQtPmhhc1RhZ05hbWUoSFRNTE5h
bWVzOjppbnB1dFRhZyk7CiB9CkBAIC00NTksNSArNDU5LDExIEBAIGlubGluZSBIVE1MSW5wdXRF
bGVtZW50KiB0b0hUTUxJbnB1dEVsZW0KICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SFRNTElucHV0
RWxlbWVudCo+KG5vZGUpOwogfQogCitpbmxpbmUgY29uc3QgSFRNTElucHV0RWxlbWVudCogdG9I
VE1MSW5wdXRFbGVtZW50KGNvbnN0IE5vZGUqIG5vZGUpCit7CisgICAgQVNTRVJUX1dJVEhfU0VD
VVJJVFlfSU1QTElDQVRJT04oIW5vZGUgfHwgaXNIVE1MSW5wdXRFbGVtZW50KG5vZGUpKTsKKyAg
ICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgSFRNTElucHV0RWxlbWVudCo+KG5vZGUpOworfQor
CiB9IC8vbmFtZXNwYWNlCiAjZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTExl
Z2VuZEVsZW1lbnQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2h0bWwvSFRNTExl
Z2VuZEVsZW1lbnQuY3BwCShyZXZpc2lvbiAxNTQ5MjcpCisrKyBTb3VyY2UvV2ViQ29yZS9odG1s
L0hUTUxMZWdlbmRFbGVtZW50LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjUsNyArMjUsNyBAQAog
I2luY2x1ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIkhUTUxMZWdlbmRFbGVtZW50LmgiCiAKLSNp
bmNsdWRlICJFbGVtZW50VHJhdmVyc2FsLmgiCisjaW5jbHVkZSAiRWxlbWVudEl0ZXJhdG9yLmgi
CiAjaW5jbHVkZSAiSFRNTEZpZWxkU2V0RWxlbWVudC5oIgogI2luY2x1ZGUgIkhUTUxGb3JtQ29u
dHJvbEVsZW1lbnQuaCIKICNpbmNsdWRlICJIVE1MTmFtZXMuaCIKQEAgLTQ5LDIxICs0OSwxOSBA
QCBQYXNzUmVmUHRyPEhUTUxMZWdlbmRFbGVtZW50PiBIVE1MTGVnZW5kCiBIVE1MRm9ybUNvbnRy
b2xFbGVtZW50KiBIVE1MTGVnZW5kRWxlbWVudDo6YXNzb2NpYXRlZENvbnRyb2woKQogewogICAg
IC8vIENoZWNrIGlmIHRoZXJlJ3MgYSBmaWVsZHNldCBiZWxvbmdpbmcgdG8gdGhpcyBsZWdlbmQu
Ci0gICAgRWxlbWVudCogZmllbGRzZXQgPSBwYXJlbnRFbGVtZW50KCk7Ci0gICAgd2hpbGUgKGZp
ZWxkc2V0ICYmICFmaWVsZHNldC0+aGFzVGFnTmFtZShmaWVsZHNldFRhZykpCi0gICAgICAgIGZp
ZWxkc2V0ID0gZmllbGRzZXQtPnBhcmVudEVsZW1lbnQoKTsKLSAgICBpZiAoIWZpZWxkc2V0KQor
ICAgIGF1dG8gZmllbGRzZXRBbmNlc3RvcnMgPSBhbmNlc3RvcnNPZlR5cGU8SFRNTEZpZWxkU2V0
RWxlbWVudD4odGhpcyk7CisgICAgYXV0byBlbmNsb3NpbmdGaWVsZHNldCA9IGZpZWxkc2V0QW5j
ZXN0b3JzLmJlZ2luKCk7CisgICAgaWYgKGVuY2xvc2luZ0ZpZWxkc2V0ID09IGZpZWxkc2V0QW5j
ZXN0b3JzLmVuZCgpKQogICAgICAgICByZXR1cm4gMDsKIAogICAgIC8vIEZpbmQgZmlyc3QgZm9y
bSBlbGVtZW50IGluc2lkZSB0aGUgZmllbGRzZXQgdGhhdCBpcyBub3QgYSBsZWdlbmQgZWxlbWVu
dC4KICAgICAvLyBGSVhNRTogU2hvdWxkIHdlIGNvbnNpZGVyIHRhYmluZGV4PwotICAgIEVsZW1l
bnQqIGVsZW1lbnQgPSBmaWVsZHNldDsKLSAgICB3aGlsZSAoKGVsZW1lbnQgPSBFbGVtZW50VHJh
dmVyc2FsOjpuZXh0KGVsZW1lbnQsIGZpZWxkc2V0KSkpIHsKLSAgICAgICAgaWYgKGVsZW1lbnQt
PmlzRm9ybUNvbnRyb2xFbGVtZW50KCkpCi0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
SFRNTEZvcm1Db250cm9sRWxlbWVudCo+KGVsZW1lbnQpOwotICAgIH0KKyAgICBhdXRvIGZpZWxk
c2V0Rm9ybUNvbnRyb2xEZXNjZW5kYW50cyA9IGRlc2NlbmRhbnRzT2ZUeXBlPEhUTUxGb3JtQ29u
dHJvbEVsZW1lbnQ+KCYqZW5jbG9zaW5nRmllbGRzZXQpOworICAgIGF1dG8gZmlyc3RGb3JtQ29u
dHJvbCA9IGZpZWxkc2V0Rm9ybUNvbnRyb2xEZXNjZW5kYW50cy5iZWdpbigpOworICAgIGlmIChm
aXJzdEZvcm1Db250cm9sID09IGZpZWxkc2V0Rm9ybUNvbnRyb2xEZXNjZW5kYW50cy5lbmQoKSkK
KyAgICAgICAgcmV0dXJuIDA7CiAKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gJipmaXJzdEZv
cm1Db250cm9sOwogfQogCiB2b2lkIEhUTUxMZWdlbmRFbGVtZW50Ojpmb2N1cyhib29sLCBGb2N1
c0RpcmVjdGlvbiBkaXJlY3Rpb24pCg==
</data>
<flag name="review"
          id="232302"
          type_id="1"
          status="+"
          setter="kling"
    />
          </attachment>
      

    </bug>

</bugzilla>