<?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>121138</bug_id>
          
          <creation_ts>2013-09-10 20:38:10 -0700</creation_ts>
          <short_desc>[iOS] Upstream Source/WebCore/rendering/TextAutoSizing.{cpp, h}</short_desc>
          <delta_ts>2013-09-16 02:29:04 -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>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>NEW</bug_status>
          <resolution></resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>121111</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Daniel Bates">dbates</reporter>
          <assigned_to name="Daniel Bates">dbates</assigned_to>
          <cc>aestes</cc>
    
    <cc>commit-queue</cc>
    
    <cc>darin</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>glenn</cc>
    
    <cc>kondapallykalyan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>927629</commentid>
    <comment_count>0</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2013-09-10 20:38:10 -0700</bug_when>
    <thetext>Upstream file Source/WebCore/rendering/TextAutoSizing.{cpp, h}.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>927631</commentid>
    <comment_count>1</comment_count>
      <attachid>211276</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2013-09-10 20:48:41 -0700</bug_when>
    <thetext>Created attachment 211276
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>927662</commentid>
    <comment_count>2</comment_count>
      <attachid>211276</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2013-09-11 00:10:20 -0700</bug_when>
    <thetext>Comment on attachment 211276
Patch

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

&gt; Source/WebCore/ChangeLog:31
&gt; +        * WebCore.xcodeproj/project.pbxproj:
&gt; +        * rendering/TextAutoSizing.cpp: Added.
&gt; +        (WebCore::cloneRenderStyleWithState):
&gt; +        (WebCore::TextAutoSizingKey::TextAutoSizingKey):
&gt; +        (WebCore::TextAutoSizingKey::~TextAutoSizingKey):
&gt; +        (WebCore::TextAutoSizingKey::operator=):
&gt; +        (WebCore::TextAutoSizingKey::ref):
&gt; +        (WebCore::TextAutoSizingKey::deref):
&gt; +        (WebCore::TextAutoSizingValue::numNodes):
&gt; +        (WebCore::TextAutoSizingValue::addNode):
&gt; +        (WebCore::TextAutoSizingValue::adjustNodeSizes):
&gt; +        (WebCore::TextAutoSizingValue::reset):
&gt; +        * rendering/TextAutoSizing.h: Added.
&gt; +        (WebCore::TextAutoSizingKey::doc):
&gt; +        (WebCore::TextAutoSizingKey::style):
&gt; +        (WebCore::TextAutoSizingKey::isValidDoc):
&gt; +        (WebCore::TextAutoSizingKey::isValidStyle):
&gt; +        (WebCore::TextAutoSizingKey::deletedKeyDoc):
&gt; +        (WebCore::TextAutoSizingKey::deletedKeyStyle):
&gt; +        (WebCore::operator==):
&gt; +        (WebCore::TextAutoSizingHash::hash):
&gt; +        (WebCore::TextAutoSizingHash::equal):
&gt; +        (WebCore::TextAutoSizingValue::create):
&gt; +        (WebCore::TextAutoSizingValue::TextAutoSizingValue):

You don&apos;t need all the per-function lines.

&gt; Source/WebCore/rendering/TextAutoSizing.cpp:116
&gt; +    Vector&lt;RefPtr&lt;Node&gt; &gt; nodesForRemoval;

This should probably use Vector&lt;Ref&lt;Node&gt;&gt;.

&gt; Source/WebCore/rendering/TextAutoSizing.cpp:118
&gt; +    HashSet&lt;RefPtr&lt;Node&gt; &gt;::iterator end = m_autoSizedNodes.end();
&gt; +    for (HashSet&lt;RefPtr&lt;Node&gt; &gt;::iterator i = m_autoSizedNodes.begin(); i != end; ++i) {

This should use auto.

&gt; Source/WebCore/rendering/TextAutoSizing.cpp:120
&gt; +        RenderText* text = static_cast&lt;RenderText*&gt;(autoSizingNode-&gt;renderer());

toRenderText()?

&gt; Source/WebCore/rendering/TextAutoSizing.cpp:140
&gt; +    end = m_autoSizedNodes.end();
&gt; +    for (HashSet&lt;RefPtr&lt;Node&gt; &gt;::iterator i = m_autoSizedNodes.begin(); i != end; ++i) {

This should use auto.

&gt; Source/WebCore/rendering/TextAutoSizing.cpp:142
&gt; +        RenderText* renderText = static_cast&lt;RenderText*&gt;(autoSizingNode-&gt;renderer());

toRenderText()?

&gt; Source/WebCore/rendering/TextAutoSizing.cpp:151
&gt; +    end = m_autoSizedNodes.end();
&gt; +    for (HashSet&lt;RefPtr&lt;Node&gt; &gt;::iterator i = m_autoSizedNodes.begin(); i != end; ++i) {

This should use auto.

&gt; Source/WebCore/rendering/TextAutoSizing.cpp:153
&gt; +        RenderText* text = static_cast&lt;RenderText*&gt;(autoSizingNode-&gt;renderer());

toRenderText()?

&gt; Source/WebCore/rendering/TextAutoSizing.cpp:211
&gt; +    HashSet&lt;RefPtr&lt;Node&gt; &gt;::iterator end = m_autoSizedNodes.end();
&gt; +    for (HashSet&lt;RefPtr&lt;Node&gt; &gt;::iterator i = m_autoSizedNodes.begin(); i != end; ++i) {

This should use auto.

&gt; Source/WebCore/rendering/TextAutoSizing.cpp:213
&gt; +        RenderText* text = static_cast&lt;RenderText*&gt;(autoSizingNode-&gt;renderer());

This should use toRenderText().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>927689</commentid>
    <comment_count>3</comment_count>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2013-09-11 01:44:13 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 211276 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=211276&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/ChangeLog:31
&gt; &gt; +        * WebCore.xcodeproj/project.pbxproj:
&gt; &gt; +        * rendering/TextAutoSizing.cpp: Added.
&gt;&gt; [...]
&gt; &gt; +        (WebCore::TextAutoSizingHash::hash):
&gt; &gt; +        (WebCore::TextAutoSizingHash::equal):
&gt; &gt; +        (WebCore::TextAutoSizingValue::create):
&gt; &gt; +        (WebCore::TextAutoSizingValue::TextAutoSizingValue):
&gt; 
&gt; You don&apos;t need all the per-function lines.
&gt; 

Will remove per-function lines.

&gt; &gt; Source/WebCore/rendering/TextAutoSizing.cpp:116
&gt; &gt; +    Vector&lt;RefPtr&lt;Node&gt; &gt; nodesForRemoval;
&gt; 
&gt; This should probably use Vector&lt;Ref&lt;Node&gt;&gt;.
&gt; 

Will fix.

&gt; &gt; Source/WebCore/rendering/TextAutoSizing.cpp:118
&gt; &gt; +    HashSet&lt;RefPtr&lt;Node&gt; &gt;::iterator end = m_autoSizedNodes.end();
&gt; &gt; +    for (HashSet&lt;RefPtr&lt;Node&gt; &gt;::iterator i = m_autoSizedNodes.begin(); i != end; ++i) {
&gt; 
&gt; This should use auto.
&gt; 

Will fix.

&gt; &gt; Source/WebCore/rendering/TextAutoSizing.cpp:120
&gt; &gt; +        RenderText* text = static_cast&lt;RenderText*&gt;(autoSizingNode-&gt;renderer());
&gt; 
&gt; toRenderText()?
&gt; 

Will fix.

&gt; &gt; Source/WebCore/rendering/TextAutoSizing.cpp:140
&gt; &gt; +    end = m_autoSizedNodes.end();
&gt; &gt; +    for (HashSet&lt;RefPtr&lt;Node&gt; &gt;::iterator i = m_autoSizedNodes.begin(); i != end; ++i) {
&gt; 
&gt; This should use auto.
&gt; 

Will fix.

&gt; &gt; Source/WebCore/rendering/TextAutoSizing.cpp:142
&gt; &gt; +        RenderText* renderText = static_cast&lt;RenderText*&gt;(autoSizingNode-&gt;renderer());
&gt; 
&gt; toRenderText()?
&gt; 

Will fix.

&gt; &gt; Source/WebCore/rendering/TextAutoSizing.cpp:151
&gt; &gt; +    end = m_autoSizedNodes.end();
&gt; &gt; +    for (HashSet&lt;RefPtr&lt;Node&gt; &gt;::iterator i = m_autoSizedNodes.begin(); i != end; ++i) {
&gt; 
&gt; This should use auto.
&gt; 

Will fix.

&gt; &gt; Source/WebCore/rendering/TextAutoSizing.cpp:153
&gt; &gt; +        RenderText* text = static_cast&lt;RenderText*&gt;(autoSizingNode-&gt;renderer());
&gt; 
&gt; toRenderText()?
&gt; 

Will fix.

&gt; &gt; Source/WebCore/rendering/TextAutoSizing.cpp:211
&gt; &gt; +    HashSet&lt;RefPtr&lt;Node&gt; &gt;::iterator end = m_autoSizedNodes.end();
&gt; &gt; +    for (HashSet&lt;RefPtr&lt;Node&gt; &gt;::iterator i = m_autoSizedNodes.begin(); i != end; ++i) {
&gt; 
&gt; This should use auto.
&gt; 

Will fix.

&gt; &gt; Source/WebCore/rendering/TextAutoSizing.cpp:213
&gt; &gt; +        RenderText* text = static_cast&lt;RenderText*&gt;(autoSizingNode-&gt;renderer());
&gt; 
&gt; This should use toRenderText().

Will fix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>927849</commentid>
    <comment_count>4</comment_count>
      <attachid>211326</attachid>
    <who name="Daniel Bates">dbates</who>
    <bug_when>2013-09-11 10:30:42 -0700</bug_when>
    <thetext>Created attachment 211326
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>927960</commentid>
    <comment_count>5</comment_count>
      <attachid>211326</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2013-09-11 13:39:16 -0700</bug_when>
    <thetext>Comment on attachment 211326
Patch

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

&gt; Source/WebCore/rendering/TextAutoSizing.h:41
&gt; +class TextAutoSizingKey {

This is way overkill. Should just be a struct with two RefPtr members in it; no need for constructors, and all these functions.

&gt; Source/WebCore/rendering/TextAutoSizing.h:44
&gt; +    TextAutoSizingKey(RenderStyle*, Document*);

Should take PassRefPtr.

&gt; Source/WebCore/rendering/TextAutoSizing.h:48
&gt; +    Document* doc() const { return m_doc; }

Should name this document.

&gt; Source/WebCore/rendering/TextAutoSizing.h:51
&gt; +    inline bool isValidDoc() const { return m_doc &amp;&amp; m_doc != deletedKeyDoc(); }
&gt; +    inline bool isValidStyle() const { return m_style &amp;&amp; m_style != deletedKeyStyle(); }

These seem like a misunderstanding of some sort. A deleted object should never get any calls on it and so this should not need any handling for deleted objects.

&gt; Source/WebCore/rendering/TextAutoSizing.h:52
&gt; +    static Document* deletedKeyDoc() { return reinterpret_cast&lt;Document*&gt;(-1); }

Don’t need this.

&gt; Source/WebCore/rendering/TextAutoSizing.h:56
&gt; +    void ref() const;
&gt; +    void deref() const;

Should use RefPtr for data members and not have all these explicit ref/deref t all.

&gt; Source/WebCore/rendering/TextAutoSizing.h:58
&gt; +    Document* m_doc;

Should name this m_document.

&gt; Source/WebCore/rendering/TextAutoSizing.h:71
&gt; +    static const bool safeToCompareToEmptyOrDeleted = true;

Should set this to false and then we don’t need all the isValid stuff.

&gt; Source/WebCore/rendering/TextAutoSizing.h:81
&gt; +    void addNode(Node*, float size);

PassRefPtr. Maybe Element instead of Node?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>927961</commentid>
    <comment_count>6</comment_count>
      <attachid>211326</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2013-09-11 13:40:05 -0700</bug_when>
    <thetext>Comment on attachment 211326
Patch

Consider all of my suggestions as optional improvements, not a necessary part of getting this upstreamed for the first time.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>929583</commentid>
    <comment_count>7</comment_count>
      <attachid>211326</attachid>
    <who name="Andreas Kling">kling</who>
    <bug_when>2013-09-16 02:29:04 -0700</bug_when>
    <thetext>Comment on attachment 211326
Patch

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

&gt; Source/WebCore/rendering/TextAutoSizing.cpp:91
&gt; +    if (isValidStyle() &amp;&amp; isValidDoc() &amp;&amp; m_doc-&gt;renderArena())
&gt; +        m_style-&gt;deref();

RenderStyle objects are not allocated in the RenderArena (today.)
The m_doc-&gt;renderArena() check should be omitted, since otherwise we could leak a ref here.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>211276</attachid>
            <date>2013-09-10 20:48:41 -0700</date>
            <delta_ts>2013-09-11 10:30:40 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-121138-20130910204840.patch</filename>
            <type>text/plain</type>
            <size>21016</size>
            <attacher name="Daniel Bates">dbates</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTU1NDk2CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZTVmYTQ0Mzc2M2YwMWZi
M2M3ZGE0ZTMwZGYyZDUwNTc4MzhhMWJkYi4uZjhkNGUxYTlhZWQwNWIzZmU0OTljMTM5ZmI3NDUx
ODA4ZWZlYTEwNiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDM3IEBACiAyMDEzLTA5LTEwICBEYW5p
ZWwgQmF0ZXMgIDxkYWJhdGVzQGFwcGxlLmNvbT4KIAorICAgICAgICBbaU9TXSBVcHN0cmVhbSBT
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVGV4dEF1dG9TaXppbmcue2NwcCwgaH0KKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyMTEzOAorCisgICAgICAg
IFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogV2ViQ29yZS54Y29kZXBy
b2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIHJlbmRlcmluZy9UZXh0QXV0b1NpemluZy5j
cHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6Y2xvbmVSZW5kZXJTdHlsZVdpdGhTdGF0ZSk6
CisgICAgICAgIChXZWJDb3JlOjpUZXh0QXV0b1NpemluZ0tleTo6VGV4dEF1dG9TaXppbmdLZXkp
OgorICAgICAgICAoV2ViQ29yZTo6VGV4dEF1dG9TaXppbmdLZXk6On5UZXh0QXV0b1NpemluZ0tl
eSk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0QXV0b1NpemluZ0tleTo6b3BlcmF0b3I9KToKKyAg
ICAgICAgKFdlYkNvcmU6OlRleHRBdXRvU2l6aW5nS2V5OjpyZWYpOgorICAgICAgICAoV2ViQ29y
ZTo6VGV4dEF1dG9TaXppbmdLZXk6OmRlcmVmKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRBdXRv
U2l6aW5nVmFsdWU6Om51bU5vZGVzKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRBdXRvU2l6aW5n
VmFsdWU6OmFkZE5vZGUpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dEF1dG9TaXppbmdWYWx1ZTo6
YWRqdXN0Tm9kZVNpemVzKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRBdXRvU2l6aW5nVmFsdWU6
OnJlc2V0KToKKyAgICAgICAgKiByZW5kZXJpbmcvVGV4dEF1dG9TaXppbmcuaDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpUZXh0QXV0b1NpemluZ0tleTo6ZG9jKToKKyAgICAgICAgKFdlYkNv
cmU6OlRleHRBdXRvU2l6aW5nS2V5OjpzdHlsZSk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0QXV0
b1NpemluZ0tleTo6aXNWYWxpZERvYyk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0QXV0b1Npemlu
Z0tleTo6aXNWYWxpZFN0eWxlKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRBdXRvU2l6aW5nS2V5
OjpkZWxldGVkS2V5RG9jKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHRBdXRvU2l6aW5nS2V5Ojpk
ZWxldGVkS2V5U3R5bGUpOgorICAgICAgICAoV2ViQ29yZTo6b3BlcmF0b3I9PSk6CisgICAgICAg
IChXZWJDb3JlOjpUZXh0QXV0b1NpemluZ0hhc2g6Omhhc2gpOgorICAgICAgICAoV2ViQ29yZTo6
VGV4dEF1dG9TaXppbmdIYXNoOjplcXVhbCk6CisgICAgICAgIChXZWJDb3JlOjpUZXh0QXV0b1Np
emluZ1ZhbHVlOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dEF1dG9TaXppbmdWYWx1
ZTo6VGV4dEF1dG9TaXppbmdWYWx1ZSk6CisKKzIwMTMtMDktMTAgIERhbmllbCBCYXRlcyAgPGRh
YmF0ZXNAYXBwbGUuY29tPgorCiAgICAgICAgIFtpT1NdIFVwc3RyZWFtIHRleHQgYXV0b3Npemlu
ZwogICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTIxMTEx
CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3Qu
cGJ4cHJvaiBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
agppbmRleCA2Y2QyMDE0NTU3ZTEzMTFlYmM2ZWI2YjhiOGYwZTY3NjU0Y2Y0OGIwLi5mYmM0OTM0
ZDkxYmRmNzk1NTNhNGU3ZDgzMGY0N2NmNDgzMTk4YWI4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKKysrIGIvU291cmNlL1dlYkNv
cmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCkBAIC01MzQ5LDYgKzUzNDksOCBA
QAogCQlDRTA1N0ZBNjEyMjA3MzExMDBBNDc2RDUgLyogRG9jdW1lbnRNYXJrZXJDb250cm9sbGVy
LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBDRTA1N0ZB
NDEyMjA3MzExMDBBNDc2RDUgLyogRG9jdW1lbnRNYXJrZXJDb250cm9sbGVyLmggKi87IHNldHRp
bmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJQ0UwOEMzRDExNTJCNTk5
QTAwMjFCOEMyIC8qIEFsdGVybmF0aXZlVGV4dENvbnRyb2xsZXIuY3BwIGluIFNvdXJjZXMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQ0UwOEMzQ0YxNTJCNTk5QTAwMjFCOEMy
IC8qIEFsdGVybmF0aXZlVGV4dENvbnRyb2xsZXIuY3BwICovOyB9OwogCQlDRTA4QzNEMjE1MkI1
OTlBMDAyMUI4QzIgLyogQWx0ZXJuYXRpdmVUZXh0Q29udHJvbGxlci5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQ0UwOEMzRDAxNTJCNTk5QTAwMjFCOEMy
IC8qIEFsdGVybmF0aXZlVGV4dENvbnRyb2xsZXIuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRF
UyA9ICgpOyB9OyB9OworCQlDRTNDRkUzRDE3REU0RkYxMDAzRUJEMzQgLyogVGV4dEF1dG9TaXpp
bmcuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQ0Uz
Q0ZFM0IxN0RFNEZGMTAwM0VCRDM0IC8qIFRleHRBdXRvU2l6aW5nLmNwcCAqLzsgfTsKKwkJQ0Uz
Q0ZFM0UxN0RFNEZGMTAwM0VCRDM0IC8qIFRleHRBdXRvU2l6aW5nLmggaW4gSGVhZGVycyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBDRTNDRkUzQzE3REU0RkYxMDAzRUJEMzQg
LyogVGV4dEF1dG9TaXppbmcuaCAqLzsgfTsKIAkJQ0U3QjJEQjMxNTg2QUJBRDAwOThCM0ZBIC8q
IEFsdGVybmF0aXZlVGV4dFVJQ29udHJvbGxlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gQ0U3QjJEQUYxNTg2QUJBRDAwOThCM0ZBIC8qIEFsdGVybmF0
aXZlVGV4dFVJQ29udHJvbGxlci5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZh
dGUsICk7IH07IH07CiAJCUNFN0IyREI0MTU4NkFCQUQwMDk4QjNGQSAvKiBBbHRlcm5hdGl2ZVRl
eHRVSUNvbnRyb2xsZXIubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBDRTdCMkRCMDE1ODZBQkFEMDA5OEIzRkEgLyogQWx0ZXJuYXRpdmVUZXh0VUlDb250
cm9sbGVyLm1tICovOyB9OwogCQlDRTdCMkRCNTE1ODZBQkFEMDA5OEIzRkEgLyogVGV4dEFsdGVy
bmF0aXZlV2l0aFJhbmdlLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBDRTdCMkRCMTE1ODZBQkFEMDA5OEIzRkEgLyogVGV4dEFsdGVybmF0aXZlV2l0aFJh
bmdlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKQEAg
LTEyMjUyLDYgKzEyMjU0LDggQEAKIAkJQ0UwNTdGQTQxMjIwNzMxMTAwQTQ3NkQ1IC8qIERvY3Vt
ZW50TWFya2VyQ29udHJvbGxlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBE
b2N1bWVudE1hcmtlckNvbnRyb2xsZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
Q0UwOEMzQ0YxNTJCNTk5QTAwMjFCOEMyIC8qIEFsdGVybmF0aXZlVGV4dENvbnRyb2xsZXIuY3Bw
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gQWx0ZXJuYXRpdmVUZXh0Q29u
dHJvbGxlci5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUNFMDhDM0QwMTUyQjU5
OUEwMDIxQjhDMiAvKiBBbHRlcm5hdGl2ZVRleHRDb250cm9sbGVyLmggKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmMuaDsgcGF0aCA9IEFsdGVybmF0aXZlVGV4dENvbnRyb2xsZXIuaDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQ0UzQ0ZFM0IxN0RFNEZGMTAwM0VCRDM0IC8qIFRleHRBdXRv
U2l6aW5nLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IFRleHRBdXRv
U2l6aW5nLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJQ0UzQ0ZFM0MxN0RFNEZG
MTAwM0VCRDM0IC8qIFRleHRBdXRvU2l6aW5nLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5j
ZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsg
cGF0aCA9IFRleHRBdXRvU2l6aW5nLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUNF
NUNCMUIzMTRFREFCNkYwMEJCMjc5NSAvKiBFdmVudFNlbmRlci5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IHBhdGggPSBFdmVudFNlbmRlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OwogCQlDRTdCMkRBRjE1ODZBQkFEMDA5OEIzRkEgLyogQWx0ZXJuYXRpdmVUZXh0VUlDb250cm9s
bGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEFsdGVybmF0aXZlVGV4dFVJ
Q29udHJvbGxlci5oOyBwYXRoID0gbWFjL0FsdGVybmF0aXZlVGV4dFVJQ29udHJvbGxlci5oOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlDRTdCMkRCMDE1ODZBQkFEMDA5OEIzRkEgLyog
QWx0ZXJuYXRpdmVUZXh0VUlDb250cm9sbGVyLm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVu
Y2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAu
b2JqY3BwOyBuYW1lID0gQWx0ZXJuYXRpdmVUZXh0VUlDb250cm9sbGVyLm1tOyBwYXRoID0gbWFj
L0FsdGVybmF0aXZlVGV4dFVJQ29udHJvbGxlci5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+Ijsg
fTsKQEAgLTIwNTg3LDYgKzIwNTkxLDggQEAKIAkJCQk1RDkyNUI2NTBGNjRENEREMDBCODQ3RjAg
LyogU2Nyb2xsQmVoYXZpb3IuY3BwICovLAogCQkJCTVEOTI1QjY2MEY2NEQ0REQwMEI4NDdGMCAv
KiBTY3JvbGxCZWhhdmlvci5oICovLAogCQkJCUE4Q0ZGMDRDMEExNTRGMDkwMDBBNDIzNCAvKiBU
YWJsZUxheW91dC5oICovLAorCQkJCUNFM0NGRTNCMTdERTRGRjEwMDNFQkQzNCAvKiBUZXh0QXV0
b1NpemluZy5jcHAgKi8sCisJCQkJQ0UzQ0ZFM0MxN0RFNEZGMTAwM0VCRDM0IC8qIFRleHRBdXRv
U2l6aW5nLmggKi8sCiAJCQkJMzdGQzk2REExMTA0RUQ3MTAwM0UxRkFEIC8qIFRyYWlsaW5nRmxv
YXRzUm9vdElubGluZUJveC5oICovLAogCQkJCUJDQTI1NzE0MTI5M0MwMTAwMDdBMjYzRCAvKiBW
ZXJ0aWNhbFBvc2l0aW9uQ2FjaGUuaCAqLywKIAkJCSk7CkBAIC0yNDI0OSw2ICsyNDI1NSw3IEBA
CiAJCQkJNjU1MEI2QTYwOTlERjAyNzAwOTBENzgxIC8qIFRleHQuaCBpbiBIZWFkZXJzICovLAog
CQkJCTkzMzA5RTE3MDk5RTY0OTIwMDU2RTU4MSAvKiBUZXh0QWZmaW5pdHkuaCBpbiBIZWFkZXJz
ICovLAogCQkJCUNFN0IyREI1MTU4NkFCQUQwMDk4QjNGQSAvKiBUZXh0QWx0ZXJuYXRpdmVXaXRo
UmFuZ2UuaCBpbiBIZWFkZXJzICovLAorCQkJCUNFM0NGRTNFMTdERTRGRjEwMDNFQkQzNCAvKiBU
ZXh0QXV0b1NpemluZy5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQjJDM0RBMzQwRDAwNkMxRDAwRUY2
RjI2IC8qIFRleHRCb3VuZGFyaWVzLmggaW4gSGVhZGVycyAqLywKIAkJCQlCMkMzREEzNjBEMDA2
QzFEMDBFRjZGMjYgLyogVGV4dEJyZWFrSXRlcmF0b3IuaCBpbiBIZWFkZXJzICovLAogCQkJCUIy
QzNEQTM4MEQwMDZDMUQwMEVGNkYyNiAvKiBUZXh0QnJlYWtJdGVyYXRvckludGVybmFsSUNVLmgg
aW4gSGVhZGVycyAqLywKQEAgLTI3MzMzLDYgKzI3MzQwLDcgQEAKIAkJCQlGNTVCM0RENTEyNTFG
MTJEMDAzRUYyNjkgLyogVGVsZXBob25lSW5wdXRUeXBlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJ
CTY1NTBCNkE1MDk5REYwMjcwMDkwRDc4MSAvKiBUZXh0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJ
CUNFN0IyREI2MTU4NkFCQUQwMDk4QjNGQSAvKiBUZXh0QWx0ZXJuYXRpdmVXaXRoUmFuZ2UubW0g
aW4gU291cmNlcyAqLywKKwkJCQlDRTNDRkUzRDE3REU0RkYxMDAzRUJEMzQgLyogVGV4dEF1dG9T
aXppbmcuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMzcyQzAwQzQxMjk2MTFGMTAwNUM5NTc1IC8q
IFRleHRCb3VuZGFyaWVzLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUIyQUZGQzk3MEQwMEE1REYw
MDMwMDc0RCAvKiBUZXh0Qm91bmRhcmllcy5tbSBpbiBTb3VyY2VzICovLAogCQkJCUJDRDhBNUYw
MTVGNTZGMkMwMDk4RDA3MSAvKiBUZXh0QnJlYWtJdGVyYXRvci5jcHAgaW4gU291cmNlcyAqLywK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9UZXh0QXV0b1NpemluZy5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVGV4dEF1dG9TaXppbmcuY3BwCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAu
Ljk2NjBmNTgxMGIzYTVhNzM0MWJjMjYzY2I3ODg4MDUyNzE4MjM1NmEKLS0tIC9kZXYvbnVsbAor
KysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVGV4dEF1dG9TaXppbmcuY3BwCkBAIC0wLDAg
KzEsMjQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAy
MDExLCAyMDEyLCAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAq
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisg
KiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlRleHRBdXRvU2l6aW5nLmgiCisKKyNp
ZiBFTkFCTEUoSU9TX1RFWFRfQVVUT1NJWklORykKKworI2luY2x1ZGUgIkNTU0ZvbnRTZWxlY3Rv
ci5oIgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiUmVuZGVyVGV4dC5oIgorI2lu
Y2x1ZGUgIlN0eWxlUmVzb2x2ZXIuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMg
UGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gY2xvbmVSZW5kZXJTdHlsZVdpdGhTdGF0ZShjb25zdCBS
ZW5kZXJTdHlsZSogY3VycmVudFN0eWxlKQoreworICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gbmV3
U3R5bGUgPSBSZW5kZXJTdHlsZTo6Y2xvbmUoY3VycmVudFN0eWxlKTsKKyAgICBpZiAoY3VycmVu
dFN0eWxlLT5sYXN0Q2hpbGRTdGF0ZSgpKQorICAgICAgICBuZXdTdHlsZS0+c2V0TGFzdENoaWxk
U3RhdGUoKTsKKyAgICBpZiAoY3VycmVudFN0eWxlLT5maXJzdENoaWxkU3RhdGUoKSkKKyAgICAg
ICAgbmV3U3R5bGUtPnNldEZpcnN0Q2hpbGRTdGF0ZSgpOworICAgIHJldHVybiBuZXdTdHlsZS5y
ZWxlYXNlKCk7Cit9CisKK1RleHRBdXRvU2l6aW5nS2V5OjpUZXh0QXV0b1NpemluZ0tleSgpCisg
ICAgOiBtX3N0eWxlKDApCisgICAgLCBtX2RvYygwKQoreworfQorCitUZXh0QXV0b1NpemluZ0tl
eTo6VGV4dEF1dG9TaXppbmdLZXkoUmVuZGVyU3R5bGUqIHN0eWxlLCBEb2N1bWVudCogZG9jKQor
ICAgIDogbV9zdHlsZShzdHlsZSkKKyAgICAsIG1fZG9jKGRvYykKK3sKKyAgICByZWYoKTsKK30K
KworVGV4dEF1dG9TaXppbmdLZXk6OlRleHRBdXRvU2l6aW5nS2V5KGNvbnN0IFRleHRBdXRvU2l6
aW5nS2V5JiBvdGhlcikKKyAgICA6IG1fc3R5bGUob3RoZXIubV9zdHlsZSkKKyAgICAsIG1fZG9j
KG90aGVyLm1fZG9jKQoreworICAgIHJlZigpOworfQorCitUZXh0QXV0b1NpemluZ0tleTo6flRl
eHRBdXRvU2l6aW5nS2V5KCkKK3sKKyAgICBkZXJlZigpOworfQorCitUZXh0QXV0b1NpemluZ0tl
eSYgVGV4dEF1dG9TaXppbmdLZXk6Om9wZXJhdG9yPShjb25zdCBUZXh0QXV0b1NpemluZ0tleSYg
b3RoZXIpCit7CisgICAgb3RoZXIucmVmKCk7CisgICAgZGVyZWYoKTsKKyAgICBtX3N0eWxlID0g
b3RoZXIubV9zdHlsZTsKKyAgICBtX2RvYyA9IG90aGVyLm1fZG9jOworICAgIHJldHVybiAqdGhp
czsKK30KKwordm9pZCBUZXh0QXV0b1NpemluZ0tleTo6cmVmKCkgY29uc3QKK3sKKyAgICBpZiAo
aXNWYWxpZFN0eWxlKCkpCisgICAgICAgIG1fc3R5bGUtPnJlZigpOworfQorCit2b2lkIFRleHRB
dXRvU2l6aW5nS2V5OjpkZXJlZigpIGNvbnN0Cit7CisgICAgaWYgKGlzVmFsaWRTdHlsZSgpICYm
IGlzVmFsaWREb2MoKSAmJiBtX2RvYy0+cmVuZGVyQXJlbmEoKSkKKyAgICAgICAgbV9zdHlsZS0+
ZGVyZWYoKTsKK30KKworaW50IFRleHRBdXRvU2l6aW5nVmFsdWU6Om51bU5vZGVzKCkgY29uc3QK
K3sKKyAgICByZXR1cm4gbV9hdXRvU2l6ZWROb2Rlcy5zaXplKCk7Cit9CisKK3ZvaWQgVGV4dEF1
dG9TaXppbmdWYWx1ZTo6YWRkTm9kZShOb2RlKiBub2RlLCBmbG9hdCBzaXplKQoreworICAgIEFT
U0VSVChub2RlKTsKKyAgICBSZW5kZXJUZXh0KiByZW5kZXJUZXh0ID0gdG9SZW5kZXJUZXh0KG5v
ZGUtPnJlbmRlcmVyKCkpOworICAgIHJlbmRlclRleHQtPnNldENhbmRpZGF0ZUNvbXB1dGVkVGV4
dFNpemUoc2l6ZSk7CisgICAgbV9hdXRvU2l6ZWROb2Rlcy5hZGQobm9kZSk7Cit9CisKK3N0YXRp
YyBjb25zdCBmbG9hdCBtYXhTY2FsZUluY3JlYXNlID0gMS43OworCitib29sIFRleHRBdXRvU2l6
aW5nVmFsdWU6OmFkanVzdE5vZGVTaXplcygpCit7CisgICAgYm9vbCBvYmplY3RzUmVtb3ZlZCA9
IGZhbHNlOworICAgIAorICAgIC8vIFJlbW92ZSBzdGFsZSBub2Rlcy4gTm9kZXMgbWF5IGhhdmUg
aGFkIHRoZWlyIHJlbmRlcmVycyBkZXRhY2hlZC4gV2UnbGwKKyAgICAvLyBhbHNvIG5lZWQgdG8g
cmVtb3ZlIHRoZSBzdHlsZSBmcm9tIHRoZSBkb2N1bWVudHMgbV90ZXh0QXV0b1NpemVkTm9kZXMK
KyAgICAvLyBjb2xsZWN0aW9uLiBSZXR1cm4gdHJ1ZSBpbmRpY2F0ZXMgd2UgbmVlZCB0byBkbyB0
aGF0IHJlbW92YWwuCisgICAgVmVjdG9yPFJlZlB0cjxOb2RlPiA+IG5vZGVzRm9yUmVtb3ZhbDsK
KyAgICBIYXNoU2V0PFJlZlB0cjxOb2RlPiA+OjppdGVyYXRvciBlbmQgPSBtX2F1dG9TaXplZE5v
ZGVzLmVuZCgpOworICAgIGZvciAoSGFzaFNldDxSZWZQdHI8Tm9kZT4gPjo6aXRlcmF0b3IgaSA9
IG1fYXV0b1NpemVkTm9kZXMuYmVnaW4oKTsgaSAhPSBlbmQ7ICsraSkgeworICAgICAgICBSZWZQ
dHI8Tm9kZT4gYXV0b1NpemluZ05vZGUgPSAqaTsKKyAgICAgICAgUmVuZGVyVGV4dCogdGV4dCA9
IHN0YXRpY19jYXN0PFJlbmRlclRleHQqPihhdXRvU2l6aW5nTm9kZS0+cmVuZGVyZXIoKSk7Cisg
ICAgICAgIGlmICghdGV4dCB8fCAodGV4dC0+c3R5bGUoKSAmJiAhdGV4dC0+c3R5bGUoKS0+dGV4
dFNpemVBZGp1c3QoKS5pc0F1dG8oKSkgfHwgIXRleHQtPmNhbmRpZGF0ZUNvbXB1dGVkVGV4dFNp
emUoKSkgeworICAgICAgICAgICAgLy8gcmVtb3ZlIG5vZGUuCisgICAgICAgICAgICBub2Rlc0Zv
clJlbW92YWwuYXBwZW5kKGF1dG9TaXppbmdOb2RlKTsKKyAgICAgICAgICAgIG9iamVjdHNSZW1v
dmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB1bnNpZ25lZCBjb3VudCA9
IG5vZGVzRm9yUmVtb3ZhbC5zaXplKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGNv
dW50OyBpKyspCisgICAgICAgIG1fYXV0b1NpemVkTm9kZXMucmVtb3ZlKG5vZGVzRm9yUmVtb3Zh
bFtpXSk7CisgICAgCisgICAgLy8gSWYgd2Ugb25seSBoYXZlIG9uZSBwaWVjZSBvZiB0ZXh0IHdp
dGggdGhlIHN0eWxlIG9uIHRoZSBwYWdlIGRvbid0CisgICAgLy8gYWRqdXN0IGl0J3Mgc2l6ZS4K
KyAgICBpZiAobV9hdXRvU2l6ZWROb2Rlcy5zaXplKCkgPD0gMSkKKyAgICAgICAgcmV0dXJuIG9i
amVjdHNSZW1vdmVkOworICAgIAorICAgIC8vIENvbXB1dGUgYXZlcmFnZSBzaXplCisgICAgZmxv
YXQgY3VtdWxhdGl2ZVNpemUgPSAwOworICAgIGVuZCA9IG1fYXV0b1NpemVkTm9kZXMuZW5kKCk7
CisgICAgZm9yIChIYXNoU2V0PFJlZlB0cjxOb2RlPiA+OjppdGVyYXRvciBpID0gbV9hdXRvU2l6
ZWROb2Rlcy5iZWdpbigpOyBpICE9IGVuZDsgKytpKSB7CisgICAgICAgIFJlZlB0cjxOb2RlPiBh
dXRvU2l6aW5nTm9kZSA9ICppOworICAgICAgICBSZW5kZXJUZXh0KiByZW5kZXJUZXh0ID0gc3Rh
dGljX2Nhc3Q8UmVuZGVyVGV4dCo+KGF1dG9TaXppbmdOb2RlLT5yZW5kZXJlcigpKTsKKyAgICAg
ICAgY3VtdWxhdGl2ZVNpemUgKz0gcmVuZGVyVGV4dC0+Y2FuZGlkYXRlQ29tcHV0ZWRUZXh0U2l6
ZSgpOworICAgIH0KKyAgICAKKyAgICBmbG9hdCBhdmVyYWdlU2l6ZSA9IHJvdW5kZihjdW11bGF0
aXZlU2l6ZSAvIG1fYXV0b1NpemVkTm9kZXMuc2l6ZSgpKTsKKyAgICAKKyAgICAvLyBBZGp1c3Qg
c2l6ZXMKKyAgICBib29sIGZpcnN0UGFzcyA9IHRydWU7CisgICAgZW5kID0gbV9hdXRvU2l6ZWRO
b2Rlcy5lbmQoKTsKKyAgICBmb3IgKEhhc2hTZXQ8UmVmUHRyPE5vZGU+ID46Oml0ZXJhdG9yIGkg
PSBtX2F1dG9TaXplZE5vZGVzLmJlZ2luKCk7IGkgIT0gZW5kOyArK2kpIHsKKyAgICAgICAgY29u
c3QgUmVmUHRyPE5vZGU+JiBhdXRvU2l6aW5nTm9kZSA9ICppOworICAgICAgICBSZW5kZXJUZXh0
KiB0ZXh0ID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dCo+KGF1dG9TaXppbmdOb2RlLT5yZW5kZXJl
cigpKTsKKyAgICAgICAgaWYgKHRleHQgJiYgdGV4dC0+c3R5bGUoKS0+Zm9udERlc2NyaXB0aW9u
KCkuY29tcHV0ZWRTaXplKCkgIT0gYXZlcmFnZVNpemUpIHsKKyAgICAgICAgICAgIGZsb2F0IHNw
ZWNpZmllZFNpemUgPSB0ZXh0LT5zdHlsZSgpLT5mb250RGVzY3JpcHRpb24oKS5zcGVjaWZpZWRT
aXplKCk7CisgICAgICAgICAgICBmbG9hdCBzY2FsZUNoYW5nZSA9IGF2ZXJhZ2VTaXplIC8gc3Bl
Y2lmaWVkU2l6ZTsKKyAgICAgICAgICAgIGlmIChzY2FsZUNoYW5nZSA+IG1heFNjYWxlSW5jcmVh
c2UgJiYgZmlyc3RQYXNzKSB7CisgICAgICAgICAgICAgICAgZmlyc3RQYXNzID0gZmFsc2U7Cisg
ICAgICAgICAgICAgICAgYXZlcmFnZVNpemUgPSByb3VuZGYoc3BlY2lmaWVkU2l6ZSAqIG1heFNj
YWxlSW5jcmVhc2UpOworICAgICAgICAgICAgICAgIHNjYWxlQ2hhbmdlID0gYXZlcmFnZVNpemUg
LyBzcGVjaWZpZWRTaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAg
ICBSZWZQdHI8UmVuZGVyU3R5bGU+IHN0eWxlID0gY2xvbmVSZW5kZXJTdHlsZVdpdGhTdGF0ZSh0
ZXh0LT5zdHlsZSgpKTsKKyAgICAgICAgICAgIEZvbnREZXNjcmlwdGlvbiBmb250RGVzY3JpcHRp
b24gPSBzdHlsZS0+Zm9udERlc2NyaXB0aW9uKCk7CisgICAgICAgICAgICBmb250RGVzY3JpcHRp
b24uc2V0Q29tcHV0ZWRTaXplKGF2ZXJhZ2VTaXplKTsKKyAgICAgICAgICAgIHN0eWxlLT5zZXRG
b250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIHN0eWxlLT5mb250
KCkudXBkYXRlKGF1dG9TaXppbmdOb2RlLT5kb2N1bWVudCgpLT5lbnN1cmVTdHlsZVJlc29sdmVy
KCktPmZvbnRTZWxlY3RvcigpKTsKKyAgICAgICAgICAgIHRleHQtPnNldFN0eWxlKHN0eWxlLnJl
bGVhc2UoKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIFJlbmRlck9iamVjdCogcGFyZW50
UmVuZGVyZXIgPSB0ZXh0LT5wYXJlbnQoKTsKKyAgICAgICAgICAgIGlmIChwYXJlbnRSZW5kZXJl
ci0+aXNBbm9ueW1vdXNCbG9jaygpKQorICAgICAgICAgICAgICAgIHBhcmVudFJlbmRlcmVyID0g
cGFyZW50UmVuZGVyZXItPnBhcmVudCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBJ
ZiB3ZSBoYXZlIGEgbGlzdCB3ZSBzaG91bGQgcmVzaXplIExpc3RNYXJrZXJzIHNlcGFyYXRlbHku
CisgICAgICAgICAgICBSZW5kZXJPYmplY3QqIGxpc3RNYXJrZXJSZW5kZXJlciA9IHBhcmVudFJl
bmRlcmVyLT5maXJzdENoaWxkKCk7CisgICAgICAgICAgICBpZiAobGlzdE1hcmtlclJlbmRlcmVy
LT5pc0xpc3RNYXJrZXIoKSkgeworICAgICAgICAgICAgICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4g
c3R5bGUgPSBjbG9uZVJlbmRlclN0eWxlV2l0aFN0YXRlKGxpc3RNYXJrZXJSZW5kZXJlci0+c3R5
bGUoKSk7CisgICAgICAgICAgICAgICAgc3R5bGUtPnNldEZvbnREZXNjcmlwdGlvbihmb250RGVz
Y3JpcHRpb24pOworICAgICAgICAgICAgICAgIHN0eWxlLT5mb250KCkudXBkYXRlKGF1dG9TaXpp
bmdOb2RlLT5kb2N1bWVudCgpLT5lbnN1cmVTdHlsZVJlc29sdmVyKCktPmZvbnRTZWxlY3Rvcigp
KTsKKyAgICAgICAgICAgICAgICBsaXN0TWFya2VyUmVuZGVyZXItPnNldFN0eWxlKHN0eWxlLnJl
bGVhc2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFJl
c2l6ZSB0aGUgbGluZSBoZWlnaHQgb2YgdGhlIHBhcmVudC4KKyAgICAgICAgICAgIGNvbnN0IFJl
bmRlclN0eWxlKiBwYXJlbnRTdHlsZSA9IHBhcmVudFJlbmRlcmVyLT5zdHlsZSgpOworICAgICAg
ICAgICAgTGVuZ3RoIGxpbmVIZWlnaHRMZW5ndGggPSBwYXJlbnRTdHlsZS0+c3BlY2lmaWVkTGlu
ZUhlaWdodCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpbnQgc3BlY2lmaWVkTGluZUhl
aWdodCA9IDA7CisgICAgICAgICAgICBpZiAobGluZUhlaWdodExlbmd0aC5pc1BlcmNlbnQoKSkK
KyAgICAgICAgICAgICAgICBzcGVjaWZpZWRMaW5lSGVpZ2h0ID0gbWluaW11bVZhbHVlRm9yTGVu
Z3RoKGxpbmVIZWlnaHRMZW5ndGgsIGZvbnREZXNjcmlwdGlvbi5zcGVjaWZpZWRTaXplKCkpOwor
ICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNwZWNpZmllZExpbmVIZWlnaHQgPSBs
aW5lSGVpZ2h0TGVuZ3RoLnZhbHVlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGludCBs
aW5lSGVpZ2h0ID0gc3BlY2lmaWVkTGluZUhlaWdodCAqIHNjYWxlQ2hhbmdlOworICAgICAgICAg
ICAgaWYgKCFsaW5lSGVpZ2h0TGVuZ3RoLmlzRml4ZWQoKSB8fCBsaW5lSGVpZ2h0TGVuZ3RoLnZh
bHVlKCkgIT0gbGluZUhlaWdodCkgeworICAgICAgICAgICAgICAgIFJlZlB0cjxSZW5kZXJTdHls
ZT4gbmV3UGFyZW50U3R5bGUgPSBjbG9uZVJlbmRlclN0eWxlV2l0aFN0YXRlKHBhcmVudFN0eWxl
KTsKKyAgICAgICAgICAgICAgICBuZXdQYXJlbnRTdHlsZS0+c2V0TGluZUhlaWdodChMZW5ndGgo
bGluZUhlaWdodCwgRml4ZWQpKTsKKyAgICAgICAgICAgICAgICBuZXdQYXJlbnRTdHlsZS0+c2V0
U3BlY2lmaWVkTGluZUhlaWdodChsaW5lSGVpZ2h0TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBu
ZXdQYXJlbnRTdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7CisgICAg
ICAgICAgICAgICAgbmV3UGFyZW50U3R5bGUtPmZvbnQoKS51cGRhdGUoYXV0b1NpemluZ05vZGUt
PmRvY3VtZW50KCktPmVuc3VyZVN0eWxlUmVzb2x2ZXIoKS0+Zm9udFNlbGVjdG9yKCkpOworICAg
ICAgICAgICAgICAgIHBhcmVudFJlbmRlcmVyLT5zZXRTdHlsZShuZXdQYXJlbnRTdHlsZS5yZWxl
YXNlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVy
biBvYmplY3RzUmVtb3ZlZDsKK30KKwordm9pZCBUZXh0QXV0b1NpemluZ1ZhbHVlOjpyZXNldCgp
Cit7CisgICAgSGFzaFNldDxSZWZQdHI8Tm9kZT4gPjo6aXRlcmF0b3IgZW5kID0gbV9hdXRvU2l6
ZWROb2Rlcy5lbmQoKTsKKyAgICBmb3IgKEhhc2hTZXQ8UmVmUHRyPE5vZGU+ID46Oml0ZXJhdG9y
IGkgPSBtX2F1dG9TaXplZE5vZGVzLmJlZ2luKCk7IGkgIT0gZW5kOyArK2kpIHsKKyAgICAgICAg
Y29uc3QgUmVmUHRyPE5vZGU+JiBhdXRvU2l6aW5nTm9kZSA9ICppOworICAgICAgICBSZW5kZXJU
ZXh0KiB0ZXh0ID0gc3RhdGljX2Nhc3Q8UmVuZGVyVGV4dCo+KGF1dG9TaXppbmdOb2RlLT5yZW5k
ZXJlcigpKTsKKyAgICAgICAgaWYgKCF0ZXh0KQorICAgICAgICAgICAgY29udGludWU7CisgICAg
ICAgIC8vIFJlc2V0IHRoZSBmb250IHNpemUgYmFjayB0byB0aGUgb3JpZ2luYWwgc3BlY2lmaWVk
IHNpemUKKyAgICAgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbiA9IHRleHQtPnN0
eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOworICAgICAgICBmbG9hdCBvcmlnaW5hbFNpemUgPSBm
b250RGVzY3JpcHRpb24uc3BlY2lmaWVkU2l6ZSgpOworICAgICAgICBpZiAoZm9udERlc2NyaXB0
aW9uLmNvbXB1dGVkU2l6ZSgpICE9IG9yaWdpbmFsU2l6ZSkgeworICAgICAgICAgICAgZm9udERl
c2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZShvcmlnaW5hbFNpemUpOworICAgICAgICAgICAgUmVm
UHRyPFJlbmRlclN0eWxlPiBzdHlsZSA9IGNsb25lUmVuZGVyU3R5bGVXaXRoU3RhdGUodGV4dC0+
c3R5bGUoKSk7CisgICAgICAgICAgICBzdHlsZS0+c2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNj
cmlwdGlvbik7CisgICAgICAgICAgICBzdHlsZS0+Zm9udCgpLnVwZGF0ZShhdXRvU2l6aW5nTm9k
ZS0+ZG9jdW1lbnQoKS0+ZW5zdXJlU3R5bGVSZXNvbHZlcigpLT5mb250U2VsZWN0b3IoKSk7Cisg
ICAgICAgICAgICB0ZXh0LT5zZXRTdHlsZShzdHlsZS5yZWxlYXNlKCkpOworICAgICAgICB9Cisg
ICAgICAgIC8vIFJlc2V0IHRoZSBsaW5lIGhlaWdodCBvZiB0aGUgcGFyZW50LgorICAgICAgICBS
ZW5kZXJPYmplY3QqIHBhcmVudFJlbmRlcmVyID0gdGV4dC0+cGFyZW50KCk7CisgICAgICAgIGlm
ICghcGFyZW50UmVuZGVyZXIpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgCisgICAg
ICAgIGlmIChwYXJlbnRSZW5kZXJlci0+aXNBbm9ueW1vdXNCbG9jaygpKQorICAgICAgICAgICAg
cGFyZW50UmVuZGVyZXIgPSBwYXJlbnRSZW5kZXJlci0+cGFyZW50KCk7CisgICAgICAgIAorICAg
ICAgICBjb25zdCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUgPSBwYXJlbnRSZW5kZXJlci0+c3R5
bGUoKTsKKyAgICAgICAgTGVuZ3RoIG9yaWdpbmFsTGluZUhlaWdodCA9IHBhcmVudFN0eWxlLT5z
cGVjaWZpZWRMaW5lSGVpZ2h0KCk7CisgICAgICAgIGlmIChvcmlnaW5hbExpbmVIZWlnaHQgIT0g
cGFyZW50U3R5bGUtPmxpbmVIZWlnaHQoKSkgeworICAgICAgICAgICAgUmVmUHRyPFJlbmRlclN0
eWxlPiBuZXdQYXJlbnRTdHlsZSA9IGNsb25lUmVuZGVyU3R5bGVXaXRoU3RhdGUocGFyZW50U3R5
bGUpOworICAgICAgICAgICAgbmV3UGFyZW50U3R5bGUtPnNldExpbmVIZWlnaHQob3JpZ2luYWxM
aW5lSGVpZ2h0KTsKKyAgICAgICAgICAgIG5ld1BhcmVudFN0eWxlLT5zZXRGb250RGVzY3JpcHRp
b24oZm9udERlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIG5ld1BhcmVudFN0eWxlLT5mb250KCku
dXBkYXRlKGF1dG9TaXppbmdOb2RlLT5kb2N1bWVudCgpLT5lbnN1cmVTdHlsZVJlc29sdmVyKCkt
PmZvbnRTZWxlY3RvcigpKTsKKyAgICAgICAgICAgIHBhcmVudFJlbmRlcmVyLT5zZXRTdHlsZShu
ZXdQYXJlbnRTdHlsZS5yZWxlYXNlKCkpOyAgICAgICAgICAKKyAgICAgICAgfQorICAgIH0KK30K
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKElPU19URVhUX0FV
VE9TSVpJTkcpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVGV4dEF1dG9T
aXppbmcuaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9UZXh0QXV0b1NpemluZy5oCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLjMzZTMwZTczZTNiOGI2ZTI2Mzc5OTcyMWQyNTM1OGU4Yzk0NTA1MTAKLS0tIC9kZXYv
bnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVGV4dEF1dG9TaXppbmcuaApAQCAt
MCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5LCAyMDEw
LCAyMDExLCAyMDEyLCAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElU
UyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YK
KyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
CisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworI2lmbmRlZiBUZXh0QXV0b1NpemluZ19oCisjZGVmaW5lIFRleHRBdXRvU2l6aW5nX2gK
KworI2lmIEVOQUJMRShJT1NfVEVYVF9BVVRPU0laSU5HKQorCisjaW5jbHVkZSAiUmVuZGVyU3R5
bGUuaCIKKyNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgorI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVk
Lmg+CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2Ns
YXNzIERvY3VtZW50OworY2xhc3MgTm9kZTsKKworY2xhc3MgVGV4dEF1dG9TaXppbmdLZXkgewor
cHVibGljOgorICAgIFRleHRBdXRvU2l6aW5nS2V5KCk7CisgICAgVGV4dEF1dG9TaXppbmdLZXko
UmVuZGVyU3R5bGUqLCBEb2N1bWVudCopOworICAgIH5UZXh0QXV0b1NpemluZ0tleSgpOworICAg
IFRleHRBdXRvU2l6aW5nS2V5KGNvbnN0IFRleHRBdXRvU2l6aW5nS2V5Jik7CisgICAgVGV4dEF1
dG9TaXppbmdLZXkmIG9wZXJhdG9yPShjb25zdCBUZXh0QXV0b1NpemluZ0tleSYpOworICAgIERv
Y3VtZW50KiBkb2MoKSBjb25zdCB7IHJldHVybiBtX2RvYzsgfQorICAgIFJlbmRlclN0eWxlKiBz
dHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3R5bGU7IH0KKyAgICBpbmxpbmUgYm9vbCBpc1ZhbGlk
RG9jKCkgY29uc3QgeyByZXR1cm4gbV9kb2MgJiYgbV9kb2MgIT0gZGVsZXRlZEtleURvYygpOyB9
CisgICAgaW5saW5lIGJvb2wgaXNWYWxpZFN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZSAm
JiBtX3N0eWxlICE9IGRlbGV0ZWRLZXlTdHlsZSgpOyB9CisgICAgc3RhdGljIERvY3VtZW50KiBk
ZWxldGVkS2V5RG9jKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxEb2N1bWVudCo+KC0xKTsg
fQorICAgIHN0YXRpYyBSZW5kZXJTdHlsZSogZGVsZXRlZEtleVN0eWxlKCkgeyByZXR1cm4gcmVp
bnRlcnByZXRfY2FzdDxSZW5kZXJTdHlsZSo+KC0xKTsgfQorcHJpdmF0ZToKKyAgICB2b2lkIHJl
ZigpIGNvbnN0OworICAgIHZvaWQgZGVyZWYoKSBjb25zdDsKKyAgICBSZW5kZXJTdHlsZSogbV9z
dHlsZTsKKyAgICBEb2N1bWVudCogbV9kb2M7Cit9OworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09
KGNvbnN0IFRleHRBdXRvU2l6aW5nS2V5JiBhLCBjb25zdCBUZXh0QXV0b1NpemluZ0tleSYgYikK
K3sKKyAgICBpZiAoYS5pc1ZhbGlkU3R5bGUoKSAmJiBiLmlzVmFsaWRTdHlsZSgpKQorICAgICAg
ICByZXR1cm4gYS5zdHlsZSgpLT5lcXVhbEZvclRleHRBdXRvc2l6aW5nKGIuc3R5bGUoKSk7Cisg
ICAgcmV0dXJuIGEuc3R5bGUoKSA9PSBiLnN0eWxlKCk7Cit9CisKK3N0cnVjdCBUZXh0QXV0b1Np
emluZ0hhc2ggeworICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IFRleHRBdXRvU2l6aW5n
S2V5JiBrZXkpIHsgcmV0dXJuIGtleS5zdHlsZSgpLT5oYXNoRm9yVGV4dEF1dG9zaXppbmcoKTsg
fQorICAgIHN0YXRpYyBib29sIGVxdWFsKGNvbnN0IFRleHRBdXRvU2l6aW5nS2V5JiBhLCBjb25z
dCBUZXh0QXV0b1NpemluZ0tleSYgYikgeyByZXR1cm4gYSA9PSBiOyB9CisgICAgc3RhdGljIGNv
bnN0IGJvb2wgc2FmZVRvQ29tcGFyZVRvRW1wdHlPckRlbGV0ZWQgPSB0cnVlOworfTsKKworY2xh
c3MgVGV4dEF1dG9TaXppbmdWYWx1ZSA6IHB1YmxpYyBSZWZDb3VudGVkPFRleHRBdXRvU2l6aW5n
VmFsdWU+IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxUZXh0QXV0b1NpemluZ1Zh
bHVlPiBjcmVhdGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBUZXh0QXV0
b1NpemluZ1ZhbHVlKTsKKyAgICB9CisKKyAgICB2b2lkIGFkZE5vZGUoTm9kZSosIGZsb2F0IHNp
emUpOworICAgIGJvb2wgYWRqdXN0Tm9kZVNpemVzKCk7CisgICAgaW50IG51bU5vZGVzKCkgY29u
c3Q7CisgICAgdm9pZCByZXNldCgpOworcHJpdmF0ZToKKyAgICBUZXh0QXV0b1NpemluZ1ZhbHVl
KCkgeyB9CisgICAgSGFzaFNldDxSZWZQdHI8Tm9kZT4gPiBtX2F1dG9TaXplZE5vZGVzOworfTsK
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKElPU19URVhUX0FV
VE9TSVpJTkcpCisKKyNlbmRpZiAvLyBUZXh0QXV0b1NpemluZ19oCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>211326</attachid>
            <date>2013-09-11 10:30:42 -0700</date>
            <delta_ts>2013-09-16 02:29:04 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-121138-20130911103042.patch</filename>
            <type>text/plain</type>
            <size>19539</size>
            <attacher name="Daniel Bates">dbates</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTU1NTM4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZjhjYTk1YTM0NGViMjU2
YjFhODc0YjM5NmM5OTIzNmM3YWYzMmVlMy4uMTIyMjc3MDgyNWM4NmU2ZWQxMzNkM2E4ZTBiZWJm
ZDk3NzNjZGMwOCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE0IEBACisyMDEzLTA5LTExICBEYW5p
ZWwgQmF0ZXMgIDxkYWJhdGVzQGFwcGxlLmNvbT4KKworICAgICAgICBbaU9TXSBVcHN0cmVhbSBT
b3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVGV4dEF1dG9TaXppbmcue2NwcCwgaH0KKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyMTEzOAorCisgICAgICAg
IFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogV2ViQ29yZS54Y29kZXBy
b2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIHJlbmRlcmluZy9UZXh0QXV0b1NpemluZy5j
cHA6IEFkZGVkLgorICAgICAgICAqIHJlbmRlcmluZy9UZXh0QXV0b1NpemluZy5oOiBBZGRlZC4K
KwogMjAxMy0wOS0xMSAgcGVhdm9Ab3V0bG9vay5jb20gIDxwZWF2b0BvdXRsb29rLmNvbT4KIAog
ICAgICAgICBbV2luQ2Fpcm9dIENvbXBpbGUgZXJyb3JzLgpkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qIGIvU291cmNlL1dlYkNvcmUv
V2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCmluZGV4IDIzYzQ2ZmE1NGI5NjdjNmEz
MjJjNDJlODgxYmRlOGFmNWYzNTlhMDMuLjYyYTQ5NWQyOTZhMmQyNzExNjcyMjFkMGJkYWZjMDQ1
YTRlMjY0MzkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3By
b2plY3QucGJ4cHJvagorKysgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9q
ZWN0LnBieHByb2oKQEAgLTUzNDksNiArNTM0OSw4IEBACiAJCUNFMDU3RkE2MTIyMDczMTEwMEE0
NzZENSAvKiBEb2N1bWVudE1hcmtlckNvbnRyb2xsZXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IENFMDU3RkE0MTIyMDczMTEwMEE0NzZENSAvKiBEb2N1
bWVudE1hcmtlckNvbnRyb2xsZXIuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2
YXRlLCApOyB9OyB9OwogCQlDRTA4QzNEMTE1MkI1OTlBMDAyMUI4QzIgLyogQWx0ZXJuYXRpdmVU
ZXh0Q29udHJvbGxlci5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBDRTA4QzNDRjE1MkI1OTlBMDAyMUI4QzIgLyogQWx0ZXJuYXRpdmVUZXh0Q29udHJv
bGxlci5jcHAgKi87IH07CiAJCUNFMDhDM0QyMTUyQjU5OUEwMDIxQjhDMiAvKiBBbHRlcm5hdGl2
ZVRleHRDb250cm9sbGVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBDRTA4QzNEMDE1MkI1OTlBMDAyMUI4QzIgLyogQWx0ZXJuYXRpdmVUZXh0Q29udHJv
bGxlci5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKCk7IH07IH07CisJCUNFM0NGRTNE
MTdERTRGRjEwMDNFQkQzNCAvKiBUZXh0QXV0b1NpemluZy5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBDRTNDRkUzQjE3REU0RkYxMDAzRUJEMzQgLyog
VGV4dEF1dG9TaXppbmcuY3BwICovOyB9OworCQlDRTNDRkUzRTE3REU0RkYxMDAzRUJEMzQgLyog
VGV4dEF1dG9TaXppbmcuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IENFM0NGRTNDMTdERTRGRjEwMDNFQkQzNCAvKiBUZXh0QXV0b1NpemluZy5oICovOyB9
OwogCQlDRTdCMkRCMzE1ODZBQkFEMDA5OEIzRkEgLyogQWx0ZXJuYXRpdmVUZXh0VUlDb250cm9s
bGVyLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBDRTdC
MkRBRjE1ODZBQkFEMDA5OEIzRkEgLyogQWx0ZXJuYXRpdmVUZXh0VUlDb250cm9sbGVyLmggKi87
IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKIAkJQ0U3QjJEQjQx
NTg2QUJBRDAwOThCM0ZBIC8qIEFsdGVybmF0aXZlVGV4dFVJQ29udHJvbGxlci5tbSBpbiBTb3Vy
Y2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IENFN0IyREIwMTU4NkFCQUQw
MDk4QjNGQSAvKiBBbHRlcm5hdGl2ZVRleHRVSUNvbnRyb2xsZXIubW0gKi87IH07CiAJCUNFN0Iy
REI1MTU4NkFCQUQwMDk4QjNGQSAvKiBUZXh0QWx0ZXJuYXRpdmVXaXRoUmFuZ2UuaCBpbiBIZWFk
ZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IENFN0IyREIxMTU4NkFCQUQw
MDk4QjNGQSAvKiBUZXh0QWx0ZXJuYXRpdmVXaXRoUmFuZ2UuaCAqLzsgc2V0dGluZ3MgPSB7QVRU
UklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwpAQCAtMTIyNTIsNiArMTIyNTQsOCBAQAogCQlD
RTA1N0ZBNDEyMjA3MzExMDBBNDc2RDUgLyogRG9jdW1lbnRNYXJrZXJDb250cm9sbGVyLmggKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IERvY3VtZW50TWFya2VyQ29udHJvbGxlci5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlDRTA4QzNDRjE1MkI1OTlBMDAyMUI4QzIg
LyogQWx0ZXJuYXRpdmVUZXh0Q29udHJvbGxlci5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNw
cC5jcHA7IHBhdGggPSBBbHRlcm5hdGl2ZVRleHRDb250cm9sbGVyLmNwcDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKIAkJQ0UwOEMzRDAxNTJCNTk5QTAwMjFCOEMyIC8qIEFsdGVybmF0aXZl
VGV4dENvbnRyb2xsZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQWx0ZXJu
YXRpdmVUZXh0Q29udHJvbGxlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlDRTND
RkUzQjE3REU0RkYxMDAzRUJEMzQgLyogVGV4dEF1dG9TaXppbmcuY3BwICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gVGV4dEF1dG9TaXppbmcuY3BwOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OworCQlDRTNDRkUzQzE3REU0RkYxMDAzRUJEMzQgLyogVGV4dEF1dG9TaXpp
bmcuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gVGV4dEF1dG9TaXppbmcuaDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQ0U1Q0IxQjMxNEVEQUI2RjAwQkIyNzk1IC8q
IEV2ZW50U2VuZGVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5n
ID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEV2ZW50U2Vu
ZGVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUNFN0IyREFGMTU4NkFCQUQwMDk4
QjNGQSAvKiBBbHRlcm5hdGl2ZVRleHRVSUNvbnRyb2xsZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxl
UmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNv
ZGUuYy5oOyBuYW1lID0gQWx0ZXJuYXRpdmVUZXh0VUlDb250cm9sbGVyLmg7IHBhdGggPSBtYWMv
QWx0ZXJuYXRpdmVUZXh0VUlDb250cm9sbGVyLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07
CiAJCUNFN0IyREIwMTU4NkFCQUQwMDk4QjNGQSAvKiBBbHRlcm5hdGl2ZVRleHRVSUNvbnRyb2xs
ZXIubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7IG5hbWUgPSBBbHRlcm5hdGl2
ZVRleHRVSUNvbnRyb2xsZXIubW07IHBhdGggPSBtYWMvQWx0ZXJuYXRpdmVUZXh0VUlDb250cm9s
bGVyLm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMjA1ODcsNiArMjA1OTEsOCBA
QAogCQkJCTVEOTI1QjY1MEY2NEQ0REQwMEI4NDdGMCAvKiBTY3JvbGxCZWhhdmlvci5jcHAgKi8s
CiAJCQkJNUQ5MjVCNjYwRjY0RDRERDAwQjg0N0YwIC8qIFNjcm9sbEJlaGF2aW9yLmggKi8sCiAJ
CQkJQThDRkYwNEMwQTE1NEYwOTAwMEE0MjM0IC8qIFRhYmxlTGF5b3V0LmggKi8sCisJCQkJQ0Uz
Q0ZFM0IxN0RFNEZGMTAwM0VCRDM0IC8qIFRleHRBdXRvU2l6aW5nLmNwcCAqLywKKwkJCQlDRTND
RkUzQzE3REU0RkYxMDAzRUJEMzQgLyogVGV4dEF1dG9TaXppbmcuaCAqLywKIAkJCQkzN0ZDOTZE
QTExMDRFRDcxMDAzRTFGQUQgLyogVHJhaWxpbmdGbG9hdHNSb290SW5saW5lQm94LmggKi8sCiAJ
CQkJQkNBMjU3MTQxMjkzQzAxMDAwN0EyNjNEIC8qIFZlcnRpY2FsUG9zaXRpb25DYWNoZS5oICov
LAogCQkJKTsKQEAgLTI0MjQ5LDYgKzI0MjU1LDcgQEAKIAkJCQk2NTUwQjZBNjA5OURGMDI3MDA5
MEQ3ODEgLyogVGV4dC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTMzMDlFMTcwOTlFNjQ5MjAwNTZF
NTgxIC8qIFRleHRBZmZpbml0eS5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQ0U3QjJEQjUxNTg2QUJB
RDAwOThCM0ZBIC8qIFRleHRBbHRlcm5hdGl2ZVdpdGhSYW5nZS5oIGluIEhlYWRlcnMgKi8sCisJ
CQkJQ0UzQ0ZFM0UxN0RFNEZGMTAwM0VCRDM0IC8qIFRleHRBdXRvU2l6aW5nLmggaW4gSGVhZGVy
cyAqLywKIAkJCQlCMkMzREEzNDBEMDA2QzFEMDBFRjZGMjYgLyogVGV4dEJvdW5kYXJpZXMuaCBp
biBIZWFkZXJzICovLAogCQkJCUIyQzNEQTM2MEQwMDZDMUQwMEVGNkYyNiAvKiBUZXh0QnJlYWtJ
dGVyYXRvci5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQjJDM0RBMzgwRDAwNkMxRDAwRUY2RjI2IC8q
IFRleHRCcmVha0l0ZXJhdG9ySW50ZXJuYWxJQ1UuaCBpbiBIZWFkZXJzICovLApAQCAtMjczMzMs
NiArMjczNDAsNyBAQAogCQkJCUY1NUIzREQ1MTI1MUYxMkQwMDNFRjI2OSAvKiBUZWxlcGhvbmVJ
bnB1dFR5cGUuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJNjU1MEI2QTUwOTlERjAyNzAwOTBENzgx
IC8qIFRleHQuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQ0U3QjJEQjYxNTg2QUJBRDAwOThCM0ZB
IC8qIFRleHRBbHRlcm5hdGl2ZVdpdGhSYW5nZS5tbSBpbiBTb3VyY2VzICovLAorCQkJCUNFM0NG
RTNEMTdERTRGRjEwMDNFQkQzNCAvKiBUZXh0QXV0b1NpemluZy5jcHAgaW4gU291cmNlcyAqLywK
IAkJCQkzNzJDMDBDNDEyOTYxMUYxMDA1Qzk1NzUgLyogVGV4dEJvdW5kYXJpZXMuY3BwIGluIFNv
dXJjZXMgKi8sCiAJCQkJQjJBRkZDOTcwRDAwQTVERjAwMzAwNzREIC8qIFRleHRCb3VuZGFyaWVz
Lm1tIGluIFNvdXJjZXMgKi8sCiAJCQkJQkNEOEE1RjAxNUY1NkYyQzAwOThEMDcxIC8qIFRleHRC
cmVha0l0ZXJhdG9yLmNwcCBpbiBTb3VyY2VzICovLApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL1RleHRBdXRvU2l6aW5nLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9UZXh0QXV0b1NpemluZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMDAwZTIwYzI1MzQzZTU5ZGUyZTg5MTdj
YjJkZGFiN2UxMWI3NmM3ZQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRl
cmluZy9UZXh0QXV0b1NpemluZy5jcHAKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIsIDIwMTMgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9SUyBgYEFTIElTJycKKyAq
IEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJQlVUT1JTCisgKiBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiVGV4dEF1dG9TaXppbmcuaCIKKworI2lmIEVOQUJMRShJT1NfVEVYVF9BVVRPU0la
SU5HKQorCisjaW5jbHVkZSAiQ1NTRm9udFNlbGVjdG9yLmgiCisjaW5jbHVkZSAiRG9jdW1lbnQu
aCIKKyNpbmNsdWRlICJSZW5kZXJUZXh0LmgiCisjaW5jbHVkZSAiU3R5bGVSZXNvbHZlci5oIgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBj
bG9uZVJlbmRlclN0eWxlV2l0aFN0YXRlKGNvbnN0IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUp
Cit7CisgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBuZXdTdHlsZSA9IFJlbmRlclN0eWxlOjpjbG9u
ZShjdXJyZW50U3R5bGUpOworICAgIGlmIChjdXJyZW50U3R5bGUtPmxhc3RDaGlsZFN0YXRlKCkp
CisgICAgICAgIG5ld1N0eWxlLT5zZXRMYXN0Q2hpbGRTdGF0ZSgpOworICAgIGlmIChjdXJyZW50
U3R5bGUtPmZpcnN0Q2hpbGRTdGF0ZSgpKQorICAgICAgICBuZXdTdHlsZS0+c2V0Rmlyc3RDaGls
ZFN0YXRlKCk7CisgICAgcmV0dXJuIG5ld1N0eWxlLnJlbGVhc2UoKTsKK30KKworVGV4dEF1dG9T
aXppbmdLZXk6OlRleHRBdXRvU2l6aW5nS2V5KCkKKyAgICA6IG1fc3R5bGUobnVsbHB0cikKKyAg
ICAsIG1fZG9jKG51bGxwdHIpCit7Cit9CisKK1RleHRBdXRvU2l6aW5nS2V5OjpUZXh0QXV0b1Np
emluZ0tleShSZW5kZXJTdHlsZSogc3R5bGUsIERvY3VtZW50KiBkb2MpCisgICAgOiBtX3N0eWxl
KHN0eWxlKQorICAgICwgbV9kb2MoZG9jKQoreworICAgIHJlZigpOworfQorCitUZXh0QXV0b1Np
emluZ0tleTo6VGV4dEF1dG9TaXppbmdLZXkoY29uc3QgVGV4dEF1dG9TaXppbmdLZXkmIG90aGVy
KQorICAgIDogbV9zdHlsZShvdGhlci5tX3N0eWxlKQorICAgICwgbV9kb2Mob3RoZXIubV9kb2Mp
Cit7CisgICAgcmVmKCk7Cit9CisKK1RleHRBdXRvU2l6aW5nS2V5Ojp+VGV4dEF1dG9TaXppbmdL
ZXkoKQoreworICAgIGRlcmVmKCk7Cit9CisKK1RleHRBdXRvU2l6aW5nS2V5JiBUZXh0QXV0b1Np
emluZ0tleTo6b3BlcmF0b3I9KGNvbnN0IFRleHRBdXRvU2l6aW5nS2V5JiBvdGhlcikKK3sKKyAg
ICBvdGhlci5yZWYoKTsKKyAgICBkZXJlZigpOworICAgIG1fc3R5bGUgPSBvdGhlci5tX3N0eWxl
OworICAgIG1fZG9jID0gb3RoZXIubV9kb2M7CisgICAgcmV0dXJuICp0aGlzOworfQorCit2b2lk
IFRleHRBdXRvU2l6aW5nS2V5OjpyZWYoKSBjb25zdAoreworICAgIGlmIChpc1ZhbGlkU3R5bGUo
KSkKKyAgICAgICAgbV9zdHlsZS0+cmVmKCk7Cit9CisKK3ZvaWQgVGV4dEF1dG9TaXppbmdLZXk6
OmRlcmVmKCkgY29uc3QKK3sKKyAgICBpZiAoaXNWYWxpZFN0eWxlKCkgJiYgaXNWYWxpZERvYygp
ICYmIG1fZG9jLT5yZW5kZXJBcmVuYSgpKQorICAgICAgICBtX3N0eWxlLT5kZXJlZigpOworfQor
CitpbnQgVGV4dEF1dG9TaXppbmdWYWx1ZTo6bnVtTm9kZXMoKSBjb25zdAoreworICAgIHJldHVy
biBtX2F1dG9TaXplZE5vZGVzLnNpemUoKTsKK30KKwordm9pZCBUZXh0QXV0b1NpemluZ1ZhbHVl
OjphZGROb2RlKE5vZGUqIG5vZGUsIGZsb2F0IHNpemUpCit7CisgICAgQVNTRVJUKG5vZGUpOwor
ICAgIFJlbmRlclRleHQqIHJlbmRlclRleHQgPSB0b1JlbmRlclRleHQobm9kZS0+cmVuZGVyZXIo
KSk7CisgICAgcmVuZGVyVGV4dC0+c2V0Q2FuZGlkYXRlQ29tcHV0ZWRUZXh0U2l6ZShzaXplKTsK
KyAgICBtX2F1dG9TaXplZE5vZGVzLmFkZChub2RlKTsKK30KKworc3RhdGljIGNvbnN0IGZsb2F0
IG1heFNjYWxlSW5jcmVhc2UgPSAxLjc7CisKK2Jvb2wgVGV4dEF1dG9TaXppbmdWYWx1ZTo6YWRq
dXN0Tm9kZVNpemVzKCkKK3sKKyAgICBib29sIG9iamVjdHNSZW1vdmVkID0gZmFsc2U7CisKKyAg
ICAvLyBSZW1vdmUgc3RhbGUgbm9kZXMuIE5vZGVzIG1heSBoYXZlIGhhZCB0aGVpciByZW5kZXJl
cnMgZGV0YWNoZWQuIFdlJ2xsCisgICAgLy8gYWxzbyBuZWVkIHRvIHJlbW92ZSB0aGUgc3R5bGUg
ZnJvbSB0aGUgZG9jdW1lbnRzIG1fdGV4dEF1dG9TaXplZE5vZGVzCisgICAgLy8gY29sbGVjdGlv
bi4gUmV0dXJuIHRydWUgaW5kaWNhdGVzIHdlIG5lZWQgdG8gZG8gdGhhdCByZW1vdmFsLgorICAg
IFZlY3RvcjxSZWZQdHI8Tm9kZT4+IG5vZGVzRm9yUmVtb3ZhbDsKKyAgICBmb3IgKGF1dG8gaXQg
PSBtX2F1dG9TaXplZE5vZGVzLmJlZ2luKCksIGVuZCA9IG1fYXV0b1NpemVkTm9kZXMuZW5kKCk7
IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBSZWZQdHI8Tm9kZT4gYXV0b1NpemluZ05vZGUg
PSAqaXQ7CisgICAgICAgIFJlbmRlclRleHQqIHRleHQgPSB0b1JlbmRlclRleHQoYXV0b1Npemlu
Z05vZGUtPnJlbmRlcmVyKCkpOworICAgICAgICBpZiAoIXRleHQgfHwgKHRleHQtPnN0eWxlKCkg
JiYgIXRleHQtPnN0eWxlKCktPnRleHRTaXplQWRqdXN0KCkuaXNBdXRvKCkpIHx8ICF0ZXh0LT5j
YW5kaWRhdGVDb21wdXRlZFRleHRTaXplKCkpIHsKKyAgICAgICAgICAgIG5vZGVzRm9yUmVtb3Zh
bC5hcHBlbmQoYXV0b1NpemluZ05vZGUpOworICAgICAgICAgICAgb2JqZWN0c1JlbW92ZWQgPSB0
cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgdW5zaWduZWQgY291bnQgPSBub2Rlc0ZvclJl
bW92YWwuc2l6ZSgpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQor
ICAgICAgICBtX2F1dG9TaXplZE5vZGVzLnJlbW92ZShub2Rlc0ZvclJlbW92YWxbaV0pOworCisg
ICAgLy8gSWYgd2Ugb25seSBoYXZlIG9uZSBwaWVjZSBvZiB0ZXh0IHdpdGggdGhlIHN0eWxlIG9u
IHRoZSBwYWdlIGRvbid0CisgICAgLy8gYWRqdXN0IGl0J3Mgc2l6ZS4KKyAgICBpZiAobV9hdXRv
U2l6ZWROb2Rlcy5zaXplKCkgPD0gMSkKKyAgICAgICAgcmV0dXJuIG9iamVjdHNSZW1vdmVkOwor
CisgICAgLy8gQ29tcHV0ZSBhdmVyYWdlIHNpemUKKyAgICBmbG9hdCBjdW11bGF0aXZlU2l6ZSA9
IDA7CisgICAgZm9yIChhdXRvIGl0ID0gbV9hdXRvU2l6ZWROb2Rlcy5iZWdpbigpLCBlbmQgPSBt
X2F1dG9TaXplZE5vZGVzLmVuZCgpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgUmVmUHRy
PE5vZGU+IGF1dG9TaXppbmdOb2RlID0gKml0OworICAgICAgICBSZW5kZXJUZXh0KiByZW5kZXJU
ZXh0ID0gdG9SZW5kZXJUZXh0KGF1dG9TaXppbmdOb2RlLT5yZW5kZXJlcigpKTsKKyAgICAgICAg
Y3VtdWxhdGl2ZVNpemUgKz0gcmVuZGVyVGV4dC0+Y2FuZGlkYXRlQ29tcHV0ZWRUZXh0U2l6ZSgp
OworICAgIH0KKworICAgIGZsb2F0IGF2ZXJhZ2VTaXplID0gcm91bmRmKGN1bXVsYXRpdmVTaXpl
IC8gbV9hdXRvU2l6ZWROb2Rlcy5zaXplKCkpOworCisgICAgLy8gQWRqdXN0IHNpemVzCisgICAg
Ym9vbCBmaXJzdFBhc3MgPSB0cnVlOworICAgIGZvciAoYXV0byBpdCA9IG1fYXV0b1NpemVkTm9k
ZXMuYmVnaW4oKSwgZW5kID0gbV9hdXRvU2l6ZWROb2Rlcy5lbmQoKTsgaXQgIT0gZW5kOyArK2l0
KSB7CisgICAgICAgIGNvbnN0IFJlZlB0cjxOb2RlPiYgYXV0b1NpemluZ05vZGUgPSAqaXQ7Cisg
ICAgICAgIFJlbmRlclRleHQqIHRleHQgPSB0b1JlbmRlclRleHQoYXV0b1NpemluZ05vZGUtPnJl
bmRlcmVyKCkpOworICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LT5zdHlsZSgpLT5mb250RGVzY3Jp
cHRpb24oKS5jb21wdXRlZFNpemUoKSAhPSBhdmVyYWdlU2l6ZSkgeworICAgICAgICAgICAgZmxv
YXQgc3BlY2lmaWVkU2l6ZSA9IHRleHQtPnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpLnNwZWNp
ZmllZFNpemUoKTsKKyAgICAgICAgICAgIGZsb2F0IHNjYWxlQ2hhbmdlID0gYXZlcmFnZVNpemUg
LyBzcGVjaWZpZWRTaXplOworICAgICAgICAgICAgaWYgKHNjYWxlQ2hhbmdlID4gbWF4U2NhbGVJ
bmNyZWFzZSAmJiBmaXJzdFBhc3MpIHsKKyAgICAgICAgICAgICAgICBmaXJzdFBhc3MgPSBmYWxz
ZTsKKyAgICAgICAgICAgICAgICBhdmVyYWdlU2l6ZSA9IHJvdW5kZihzcGVjaWZpZWRTaXplICog
bWF4U2NhbGVJbmNyZWFzZSk7CisgICAgICAgICAgICAgICAgc2NhbGVDaGFuZ2UgPSBhdmVyYWdl
U2l6ZSAvIHNwZWNpZmllZFNpemU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFJlZlB0
cjxSZW5kZXJTdHlsZT4gc3R5bGUgPSBjbG9uZVJlbmRlclN0eWxlV2l0aFN0YXRlKHRleHQtPnN0
eWxlKCkpOworICAgICAgICAgICAgRm9udERlc2NyaXB0aW9uIGZvbnREZXNjcmlwdGlvbiA9IHN0
eWxlLT5mb250RGVzY3JpcHRpb24oKTsKKyAgICAgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRD
b21wdXRlZFNpemUoYXZlcmFnZVNpemUpOworICAgICAgICAgICAgc3R5bGUtPnNldEZvbnREZXNj
cmlwdGlvbihmb250RGVzY3JpcHRpb24pOworICAgICAgICAgICAgc3R5bGUtPmZvbnQoKS51cGRh
dGUoYXV0b1NpemluZ05vZGUtPmRvY3VtZW50KCktPmVuc3VyZVN0eWxlUmVzb2x2ZXIoKS5mb250
U2VsZWN0b3IoKSk7CisgICAgICAgICAgICB0ZXh0LT5zZXRTdHlsZShzdHlsZS5yZWxlYXNlKCkp
OworCisgICAgICAgICAgICBSZW5kZXJPYmplY3QqIHBhcmVudFJlbmRlcmVyID0gdGV4dC0+cGFy
ZW50KCk7CisgICAgICAgICAgICBpZiAocGFyZW50UmVuZGVyZXItPmlzQW5vbnltb3VzQmxvY2so
KSkKKyAgICAgICAgICAgICAgICBwYXJlbnRSZW5kZXJlciA9IHBhcmVudFJlbmRlcmVyLT5wYXJl
bnQoKTsKKworICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIGxpc3Qgd2Ugc2hvdWxkIHJlc2l6
ZSBsaXN0IG1hcmtlcnMgc2VwYXJhdGVseS4KKyAgICAgICAgICAgIFJlbmRlck9iamVjdCogbGlz
dE1hcmtlclJlbmRlcmVyID0gcGFyZW50UmVuZGVyZXItPmZpcnN0Q2hpbGQoKTsKKyAgICAgICAg
ICAgIGlmIChsaXN0TWFya2VyUmVuZGVyZXItPmlzTGlzdE1hcmtlcigpKSB7CisgICAgICAgICAg
ICAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZSA9IGNsb25lUmVuZGVyU3R5bGVXaXRoU3Rh
dGUobGlzdE1hcmtlclJlbmRlcmVyLT5zdHlsZSgpKTsKKyAgICAgICAgICAgICAgICBzdHlsZS0+
c2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7CisgICAgICAgICAgICAgICAgc3R5
bGUtPmZvbnQoKS51cGRhdGUoYXV0b1NpemluZ05vZGUtPmRvY3VtZW50KCktPmVuc3VyZVN0eWxl
UmVzb2x2ZXIoKS5mb250U2VsZWN0b3IoKSk7CisgICAgICAgICAgICAgICAgbGlzdE1hcmtlclJl
bmRlcmVyLT5zZXRTdHlsZShzdHlsZS5yZWxlYXNlKCkpOworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICAvLyBSZXNpemUgdGhlIGxpbmUgaGVpZ2h0IG9mIHRoZSBwYXJlbnQuCisgICAgICAg
ICAgICBjb25zdCBSZW5kZXJTdHlsZSogcGFyZW50U3R5bGUgPSBwYXJlbnRSZW5kZXJlci0+c3R5
bGUoKTsKKyAgICAgICAgICAgIExlbmd0aCBsaW5lSGVpZ2h0TGVuZ3RoID0gcGFyZW50U3R5bGUt
PnNwZWNpZmllZExpbmVIZWlnaHQoKTsKKworICAgICAgICAgICAgaW50IHNwZWNpZmllZExpbmVI
ZWlnaHQgPSAwOworICAgICAgICAgICAgaWYgKGxpbmVIZWlnaHRMZW5ndGguaXNQZXJjZW50KCkp
CisgICAgICAgICAgICAgICAgc3BlY2lmaWVkTGluZUhlaWdodCA9IG1pbmltdW1WYWx1ZUZvckxl
bmd0aChsaW5lSGVpZ2h0TGVuZ3RoLCBmb250RGVzY3JpcHRpb24uc3BlY2lmaWVkU2l6ZSgpKTsK
KyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBzcGVjaWZpZWRMaW5lSGVpZ2h0ID0g
bGluZUhlaWdodExlbmd0aC52YWx1ZSgpOworCisgICAgICAgICAgICBpbnQgbGluZUhlaWdodCA9
IHNwZWNpZmllZExpbmVIZWlnaHQgKiBzY2FsZUNoYW5nZTsKKyAgICAgICAgICAgIGlmICghbGlu
ZUhlaWdodExlbmd0aC5pc0ZpeGVkKCkgfHwgbGluZUhlaWdodExlbmd0aC52YWx1ZSgpICE9IGxp
bmVIZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBSZWZQdHI8UmVuZGVyU3R5bGU+IG5ld1BhcmVu
dFN0eWxlID0gY2xvbmVSZW5kZXJTdHlsZVdpdGhTdGF0ZShwYXJlbnRTdHlsZSk7CisgICAgICAg
ICAgICAgICAgbmV3UGFyZW50U3R5bGUtPnNldExpbmVIZWlnaHQoTGVuZ3RoKGxpbmVIZWlnaHQs
IEZpeGVkKSk7CisgICAgICAgICAgICAgICAgbmV3UGFyZW50U3R5bGUtPnNldFNwZWNpZmllZExp
bmVIZWlnaHQobGluZUhlaWdodExlbmd0aCk7CisgICAgICAgICAgICAgICAgbmV3UGFyZW50U3R5
bGUtPnNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOworICAgICAgICAgICAgICAg
IG5ld1BhcmVudFN0eWxlLT5mb250KCkudXBkYXRlKGF1dG9TaXppbmdOb2RlLT5kb2N1bWVudCgp
LT5lbnN1cmVTdHlsZVJlc29sdmVyKCkuZm9udFNlbGVjdG9yKCkpOworICAgICAgICAgICAgICAg
IHBhcmVudFJlbmRlcmVyLT5zZXRTdHlsZShuZXdQYXJlbnRTdHlsZS5yZWxlYXNlKCkpOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG9iamVjdHNSZW1vdmVk
OworfQorCit2b2lkIFRleHRBdXRvU2l6aW5nVmFsdWU6OnJlc2V0KCkKK3sKKyAgICBmb3IgKGF1
dG8gaXQgPSBtX2F1dG9TaXplZE5vZGVzLmJlZ2luKCksIGVuZCA9IG1fYXV0b1NpemVkTm9kZXMu
ZW5kKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBjb25zdCBSZWZQdHI8Tm9kZT4mIGF1
dG9TaXppbmdOb2RlID0gKml0OworICAgICAgICBSZW5kZXJUZXh0KiB0ZXh0ID0gdG9SZW5kZXJU
ZXh0KGF1dG9TaXppbmdOb2RlLT5yZW5kZXJlcigpKTsKKyAgICAgICAgaWYgKCF0ZXh0KQorICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgIC8vIFJlc2V0IHRoZSBmb250IHNpemUgYmFjayB0
byB0aGUgb3JpZ2luYWwgc3BlY2lmaWVkIHNpemUKKyAgICAgICAgRm9udERlc2NyaXB0aW9uIGZv
bnREZXNjcmlwdGlvbiA9IHRleHQtPnN0eWxlKCktPmZvbnREZXNjcmlwdGlvbigpOworICAgICAg
ICBmbG9hdCBvcmlnaW5hbFNpemUgPSBmb250RGVzY3JpcHRpb24uc3BlY2lmaWVkU2l6ZSgpOwor
ICAgICAgICBpZiAoZm9udERlc2NyaXB0aW9uLmNvbXB1dGVkU2l6ZSgpICE9IG9yaWdpbmFsU2l6
ZSkgeworICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZShvcmlnaW5h
bFNpemUpOworICAgICAgICAgICAgUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZSA9IGNsb25lUmVu
ZGVyU3R5bGVXaXRoU3RhdGUodGV4dC0+c3R5bGUoKSk7CisgICAgICAgICAgICBzdHlsZS0+c2V0
Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7CisgICAgICAgICAgICBzdHlsZS0+Zm9u
dCgpLnVwZGF0ZShhdXRvU2l6aW5nTm9kZS0+ZG9jdW1lbnQoKS0+ZW5zdXJlU3R5bGVSZXNvbHZl
cigpLmZvbnRTZWxlY3RvcigpKTsKKyAgICAgICAgICAgIHRleHQtPnNldFN0eWxlKHN0eWxlLnJl
bGVhc2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gUmVzZXQgdGhlIGxpbmUgaGVpZ2h0IG9m
IHRoZSBwYXJlbnQuCisgICAgICAgIFJlbmRlck9iamVjdCogcGFyZW50UmVuZGVyZXIgPSB0ZXh0
LT5wYXJlbnQoKTsKKyAgICAgICAgaWYgKCFwYXJlbnRSZW5kZXJlcikKKyAgICAgICAgICAgIGNv
bnRpbnVlOworCisgICAgICAgIGlmIChwYXJlbnRSZW5kZXJlci0+aXNBbm9ueW1vdXNCbG9jaygp
KQorICAgICAgICAgICAgcGFyZW50UmVuZGVyZXIgPSBwYXJlbnRSZW5kZXJlci0+cGFyZW50KCk7
CisKKyAgICAgICAgY29uc3QgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlID0gcGFyZW50UmVuZGVy
ZXItPnN0eWxlKCk7CisgICAgICAgIExlbmd0aCBvcmlnaW5hbExpbmVIZWlnaHQgPSBwYXJlbnRT
dHlsZS0+c3BlY2lmaWVkTGluZUhlaWdodCgpOworICAgICAgICBpZiAob3JpZ2luYWxMaW5lSGVp
Z2h0ICE9IHBhcmVudFN0eWxlLT5saW5lSGVpZ2h0KCkpIHsKKyAgICAgICAgICAgIFJlZlB0cjxS
ZW5kZXJTdHlsZT4gbmV3UGFyZW50U3R5bGUgPSBjbG9uZVJlbmRlclN0eWxlV2l0aFN0YXRlKHBh
cmVudFN0eWxlKTsKKyAgICAgICAgICAgIG5ld1BhcmVudFN0eWxlLT5zZXRMaW5lSGVpZ2h0KG9y
aWdpbmFsTGluZUhlaWdodCk7CisgICAgICAgICAgICBuZXdQYXJlbnRTdHlsZS0+c2V0Rm9udERl
c2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7CisgICAgICAgICAgICBuZXdQYXJlbnRTdHlsZS0+
Zm9udCgpLnVwZGF0ZShhdXRvU2l6aW5nTm9kZS0+ZG9jdW1lbnQoKS0+ZW5zdXJlU3R5bGVSZXNv
bHZlcigpLmZvbnRTZWxlY3RvcigpKTsKKyAgICAgICAgICAgIHBhcmVudFJlbmRlcmVyLT5zZXRT
dHlsZShuZXdQYXJlbnRTdHlsZS5yZWxlYXNlKCkpOyAgICAgICAgICAKKyAgICAgICAgfQorICAg
IH0KK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKElPU19U
RVhUX0FVVE9TSVpJTkcpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVGV4
dEF1dG9TaXppbmcuaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9UZXh0QXV0b1NpemluZy5o
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLjNlNjMwZjU5ZWY5OWNhYTkxMDM0ZmJlYmZlYzFjNjIzYzY1ZjM1MDEKLS0t
IC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVGV4dEF1dG9TaXppbmcu
aApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4LCAyMDA5
LCAyMDEwLCAyMDExLCAyMDEyLCAyMDEzIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
QU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFRIRSBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUworICogQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2lmbmRlZiBUZXh0QXV0b1NpemluZ19oCisjZGVmaW5lIFRleHRBdXRvU2l6
aW5nX2gKKworI2lmIEVOQUJMRShJT1NfVEVYVF9BVVRPU0laSU5HKQorCisjaW5jbHVkZSAiUmVu
ZGVyU3R5bGUuaCIKKyNpbmNsdWRlIDx3dGYvSGFzaFNldC5oPgorI2luY2x1ZGUgPHd0Zi9SZWZD
b3VudGVkLmg+CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK2NsYXNzIERvY3VtZW50OworY2xhc3MgTm9kZTsKKworY2xhc3MgVGV4dEF1dG9TaXppbmdL
ZXkgeworcHVibGljOgorICAgIFRleHRBdXRvU2l6aW5nS2V5KCk7CisgICAgVGV4dEF1dG9TaXpp
bmdLZXkoUmVuZGVyU3R5bGUqLCBEb2N1bWVudCopOworICAgIH5UZXh0QXV0b1NpemluZ0tleSgp
OworICAgIFRleHRBdXRvU2l6aW5nS2V5KGNvbnN0IFRleHRBdXRvU2l6aW5nS2V5Jik7CisgICAg
VGV4dEF1dG9TaXppbmdLZXkmIG9wZXJhdG9yPShjb25zdCBUZXh0QXV0b1NpemluZ0tleSYpOwor
ICAgIERvY3VtZW50KiBkb2MoKSBjb25zdCB7IHJldHVybiBtX2RvYzsgfQorICAgIFJlbmRlclN0
eWxlKiBzdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3R5bGU7IH0KKyAgICBpbmxpbmUgYm9vbCBp
c1ZhbGlkRG9jKCkgY29uc3QgeyByZXR1cm4gbV9kb2MgJiYgbV9kb2MgIT0gZGVsZXRlZEtleURv
YygpOyB9CisgICAgaW5saW5lIGJvb2wgaXNWYWxpZFN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9z
dHlsZSAmJiBtX3N0eWxlICE9IGRlbGV0ZWRLZXlTdHlsZSgpOyB9CisgICAgc3RhdGljIERvY3Vt
ZW50KiBkZWxldGVkS2V5RG9jKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxEb2N1bWVudCo+
KC0xKTsgfQorICAgIHN0YXRpYyBSZW5kZXJTdHlsZSogZGVsZXRlZEtleVN0eWxlKCkgeyByZXR1
cm4gcmVpbnRlcnByZXRfY2FzdDxSZW5kZXJTdHlsZSo+KC0xKTsgfQorcHJpdmF0ZToKKyAgICB2
b2lkIHJlZigpIGNvbnN0OworICAgIHZvaWQgZGVyZWYoKSBjb25zdDsKKyAgICBSZW5kZXJTdHls
ZSogbV9zdHlsZTsKKyAgICBEb2N1bWVudCogbV9kb2M7Cit9OworCitpbmxpbmUgYm9vbCBvcGVy
YXRvcj09KGNvbnN0IFRleHRBdXRvU2l6aW5nS2V5JiBhLCBjb25zdCBUZXh0QXV0b1NpemluZ0tl
eSYgYikKK3sKKyAgICBpZiAoYS5pc1ZhbGlkU3R5bGUoKSAmJiBiLmlzVmFsaWRTdHlsZSgpKQor
ICAgICAgICByZXR1cm4gYS5zdHlsZSgpLT5lcXVhbEZvclRleHRBdXRvc2l6aW5nKGIuc3R5bGUo
KSk7CisgICAgcmV0dXJuIGEuc3R5bGUoKSA9PSBiLnN0eWxlKCk7Cit9CisKK3N0cnVjdCBUZXh0
QXV0b1NpemluZ0hhc2ggeworICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IFRleHRBdXRv
U2l6aW5nS2V5JiBrZXkpIHsgcmV0dXJuIGtleS5zdHlsZSgpLT5oYXNoRm9yVGV4dEF1dG9zaXpp
bmcoKTsgfQorICAgIHN0YXRpYyBib29sIGVxdWFsKGNvbnN0IFRleHRBdXRvU2l6aW5nS2V5JiBh
LCBjb25zdCBUZXh0QXV0b1NpemluZ0tleSYgYikgeyByZXR1cm4gYSA9PSBiOyB9CisgICAgc3Rh
dGljIGNvbnN0IGJvb2wgc2FmZVRvQ29tcGFyZVRvRW1wdHlPckRlbGV0ZWQgPSB0cnVlOworfTsK
KworY2xhc3MgVGV4dEF1dG9TaXppbmdWYWx1ZSA6IHB1YmxpYyBSZWZDb3VudGVkPFRleHRBdXRv
U2l6aW5nVmFsdWU+IHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc1JlZlB0cjxUZXh0QXV0b1Np
emluZ1ZhbHVlPiBjcmVhdGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBU
ZXh0QXV0b1NpemluZ1ZhbHVlKTsKKyAgICB9CisKKyAgICB2b2lkIGFkZE5vZGUoTm9kZSosIGZs
b2F0IHNpemUpOworICAgIGJvb2wgYWRqdXN0Tm9kZVNpemVzKCk7CisgICAgaW50IG51bU5vZGVz
KCkgY29uc3Q7CisgICAgdm9pZCByZXNldCgpOworcHJpdmF0ZToKKyAgICBUZXh0QXV0b1Npemlu
Z1ZhbHVlKCkgeyB9CisgICAgSGFzaFNldDxSZWZQdHI8Tm9kZT4+IG1fYXV0b1NpemVkTm9kZXM7
Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoSU9TX1RF
WFRfQVVUT1NJWklORykKKworI2VuZGlmIC8vIFRleHRBdXRvU2l6aW5nX2gK
</data>
<flag name="review"
          id="233412"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>