<?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>63635</bug_id>
          
          <creation_ts>2011-06-29 10:15:38 -0700</creation_ts>
          <short_desc>Improve WebGL object lifetime management in WebGLRenderingContext</short_desc>
          <delta_ts>2011-06-30 16:26:49 -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>WebGL</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="Zhenyao Mo">zmo</reporter>
          <assigned_to name="Zhenyao Mo">zmo</assigned_to>
          <cc>cmarrin</cc>
    
    <cc>gman</cc>
    
    <cc>kbr</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>429699</commentid>
    <comment_count>0</comment_count>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2011-06-29 10:15:38 -0700</bug_when>
    <thetext>At the moment, all objects are held by WebGLRenderingContext even after the underlying gl object is explicitly deleted.

It seems like we don&apos;t need to keep this object table (m_canvasObjects) in WebGLRenderingContext.  For all the objects that can be queried (for example, current program), we already hold them besides this object table (for example, m_currentProgram).

Currently the only usage of this object table is that when we query an object, we get an integer from underlying GL, and we go through this table to find the corresponding WebGL object.  If we remove this table, we can just return the held WebGL object instead of querying the underlying GL and then find the WebGLObject matching it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430498</commentid>
    <comment_count>1</comment_count>
      <attachid>99321</attachid>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2011-06-30 09:56:24 -0700</bug_when>
    <thetext>Created attachment 99321
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430499</commentid>
    <comment_count>2</comment_count>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2011-06-30 09:57:20 -0700</bug_when>
    <thetext>The tests are fixed on the khronos and synced here.

Also, I manually verified that now garbage collection does collect the WebGL objects that are no longer referenced.

Please review.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430696</commentid>
    <comment_count>3</comment_count>
      <attachid>99321</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-06-30 14:49:54 -0700</bug_when>
    <thetext>Comment on attachment 99321
Patch

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

Nice work; generally looks good except for one cleanup issue in detachAndRemoveAllObjects.

&gt; Source/WebCore/html/canvas/WebGLRenderingContext.cpp:2033
&gt; +        m_context-&gt;synthesizeGLError(GraphicsContext3D::INVALID_ENUM);

This is correct, but it might be worth a note here that OpenGL ES 2.0 specifies INVALID_ENUM in this case, while desktop GL specifies INVALID_OPERATION.

&gt; Source/WebCore/html/canvas/WebGLRenderingContext.cpp:2043
&gt; +            return WebGLGetInfo(PassRefPtr&lt;WebGLTexture&gt;(reinterpret_cast&lt;WebGLTexture*&gt;(object)));

I think you should be using adoptRef rather than calling the PassRefPtr constructor explicitly here.

&gt; Source/WebCore/html/canvas/WebGLRenderingContext.cpp:2061
&gt; +            return WebGLGetInfo(PassRefPtr&lt;WebGLRenderbuffer&gt;(reinterpret_cast&lt;WebGLRenderbuffer*&gt;(object)));

Same thing about using adoptRef here.

&gt; Source/WebCore/html/canvas/WebGLRenderingContext.cpp:4001
&gt;      }

This looks very complicated and flaky. If you&apos;re worried about WebGLObject::detachContext() removing the object from the table and changing the iteration order, copy the HashSet&lt;WebGLObject*&gt; into a Vector&lt;WebGLObject*&gt; and iterate down the vector.

Also, you might want to consider having WebGLObject::detachContext() remove the object from this table rather than the destructor of WebGLObject. Right now calling detachContext() on the WebGLObject prevents the WebGLObject from removing itself from this table.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430730</commentid>
    <comment_count>4</comment_count>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2011-06-30 15:31:33 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 99321 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=99321&amp;action=review
&gt; 
&gt; Nice work; generally looks good except for one cleanup issue in detachAndRemoveAllObjects.
&gt; 
&gt; &gt; Source/WebCore/html/canvas/WebGLRenderingContext.cpp:2033
&gt; &gt; +        m_context-&gt;synthesizeGLError(GraphicsContext3D::INVALID_ENUM);
&gt; 
&gt; This is correct, but it might be worth a note here that OpenGL ES 2.0 specifies INVALID_ENUM in this case, while desktop GL specifies INVALID_OPERATION.

Done.

&gt; 
&gt; &gt; Source/WebCore/html/canvas/WebGLRenderingContext.cpp:2043
&gt; &gt; +            return WebGLGetInfo(PassRefPtr&lt;WebGLTexture&gt;(reinterpret_cast&lt;WebGLTexture*&gt;(object)));
&gt; 
&gt; I think you should be using adoptRef rather than calling the PassRefPtr constructor explicitly here.

There is a difference between adoptRef and explicit constructor.  Explicit constructor will call ref() if the pointer is non-null.  If we use adoptRef here, several tests crash.

&gt; 
&gt; &gt; Source/WebCore/html/canvas/WebGLRenderingContext.cpp:2061
&gt; &gt; +            return WebGLGetInfo(PassRefPtr&lt;WebGLRenderbuffer&gt;(reinterpret_cast&lt;WebGLRenderbuffer*&gt;(object)));
&gt; 
&gt; Same thing about using adoptRef here.
&gt; 
&gt; &gt; Source/WebCore/html/canvas/WebGLRenderingContext.cpp:4001
&gt; &gt;      }
&gt; 
&gt; This looks very complicated and flaky. If you&apos;re worried about WebGLObject::detachContext() removing the object from the table and changing the iteration order, copy the HashSet&lt;WebGLObject*&gt; into a Vector&lt;WebGLObject*&gt; and iterate down the vector.
&gt; 
&gt; Also, you might want to consider having WebGLObject::detachContext() remove the object from this table rather than the destructor of WebGLObject. Right now calling detachContext() on the WebGLObject prevents the WebGLObject from removing itself from this table.

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430733</commentid>
    <comment_count>5</comment_count>
      <attachid>99378</attachid>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2011-06-30 15:35:22 -0700</bug_when>
    <thetext>Created attachment 99378
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430759</commentid>
    <comment_count>6</comment_count>
      <attachid>99378</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2011-06-30 15:58:11 -0700</bug_when>
    <thetext>Comment on attachment 99378
Patch

Looks better to me. Nice work.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>430807</commentid>
    <comment_count>7</comment_count>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2011-06-30 16:26:49 -0700</bug_when>
    <thetext>Committed r90180: &lt;http://trac.webkit.org/changeset/90180&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>99321</attachid>
            <date>2011-06-30 09:56:24 -0700</date>
            <delta_ts>2011-06-30 15:35:19 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-63635-20110630095623.patch</filename>
            <type>text/plain</type>
            <size>22565</size>
            <attacher name="Zhenyao Mo">zmo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDkwMTI3KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTYgQEAKKzIwMTEtMDYtMzAgIFpoZW55YW8g
TW8gIDx6bW9AZ29vZ2xlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBJbXByb3ZlIFdlYkdMIG9iamVjdCBsaWZldGltZSBtYW5hZ2VtZW50IGlu
IFdlYkdMUmVuZGVyaW5nQ29udGV4dAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NjM2MzUKKworICAgICAgICAqIGh0bWwvY2FudmFzL1dlYkdMUmVuZGVy
aW5nQ29udGV4dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpXZWJHTFJlbmRlcmluZ0NvbnRleHQ6
OmdldEF0dGFjaGVkU2hhZGVycyk6IFVzZSBjYWNoZWQgb2JqZWN0cyBpbnN0ZWFkIG9mIHF1ZXJ5
aW5nIHRoZSB1bmRlcmx5aW5nIEdMLgorICAgICAgICAoV2ViQ29yZTo6V2ViR0xSZW5kZXJpbmdD
b250ZXh0OjpnZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXIpOiBEaXR0by4KKyAgICAg
ICAgKFdlYkNvcmU6OldlYkdMUmVuZGVyaW5nQ29udGV4dDo6ZGV0YWNoQW5kUmVtb3ZlQWxsT2Jq
ZWN0cyk6IE11bHRpcGxlIGxvb3AgYmVjYXVzZSBvYmplY3RzIG1pZ2h0IGJlIHJlbW92ZWQgZnJv
bSB0aGUgdGFibGUgd2l0aGluIGFuIGl0ZXJhdGlvbi4KKyAgICAgICAgKiBodG1sL2NhbnZhcy9X
ZWJHTFJlbmRlcmluZ0NvbnRleHQuaDoKKwogMjAxMS0wNi0zMCAgUGF0cmljayBHYW5zdGVyZXIg
IDxwYXJvZ2FAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBBZGFtIFJvYmVuLgpJ
bmRleDogU291cmNlL1dlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xSZW5kZXJpbmdDb250ZXh0LmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTFJlbmRlcmlu
Z0NvbnRleHQuY3BwCShyZXZpc2lvbiA4OTkzNykKKysrIFNvdXJjZS9XZWJDb3JlL2h0bWwvY2Fu
dmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTE5MTgsMjMg
KzE5MTgsMTUgQEAgYm9vbCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OmdldEF0dGFjaGVkUwogICAg
IHNoYWRlck9iamVjdHMuY2xlYXIoKTsKICAgICBpZiAoaXNDb250ZXh0TG9zdCgpIHx8ICF2YWxp
ZGF0ZVdlYkdMT2JqZWN0KHByb2dyYW0pKQogICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgR0Mz
RGludCBudW1TaGFkZXJzID0gMDsKLSAgICBtX2NvbnRleHQtPmdldFByb2dyYW1pdihvYmplY3RP
clplcm8ocHJvZ3JhbSksIEdyYXBoaWNzQ29udGV4dDNEOjpBVFRBQ0hFRF9TSEFERVJTLCAmbnVt
U2hhZGVycyk7Ci0gICAgaWYgKG51bVNoYWRlcnMpIHsKLSAgICAgICAgT3duQXJyYXlQdHI8UGxh
dGZvcm0zRE9iamVjdD4gc2hhZGVycyA9IGFkb3B0QXJyYXlQdHIobmV3IFBsYXRmb3JtM0RPYmpl
Y3RbbnVtU2hhZGVyc10pOwotICAgICAgICBHQzNEc2l6ZWkgY291bnQgPSAwOwotICAgICAgICBt
X2NvbnRleHQtPmdldEF0dGFjaGVkU2hhZGVycyhvYmplY3RPclplcm8ocHJvZ3JhbSksIG51bVNo
YWRlcnMsICZjb3VudCwgc2hhZGVycy5nZXQoKSk7Ci0gICAgICAgIGlmIChjb3VudCAhPSBudW1T
aGFkZXJzKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBzaGFkZXJPYmplY3Rz
LnJlc2l6ZShudW1TaGFkZXJzKTsKLSAgICAgICAgZm9yIChHQzNEaW50IGlpID0gMDsgaWkgPCBu
dW1TaGFkZXJzOyArK2lpKSB7Ci0gICAgICAgICAgICBXZWJHTFNoYWRlciogc2hhZGVyID0gZmlu
ZFNoYWRlcihzaGFkZXJzW2lpXSk7Ci0gICAgICAgICAgICBpZiAoIXNoYWRlcikgewotICAgICAg
ICAgICAgICAgIHNoYWRlck9iamVjdHMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaGFkZXJPYmplY3RzW2lpXSA9IHNo
YWRlcjsKLSAgICAgICAgfQorCisgICAgY29uc3QgR0MzRGVudW0gc2hhZGVyVHlwZVtdID0gewor
ICAgICAgICBHcmFwaGljc0NvbnRleHQzRDo6VkVSVEVYX1NIQURFUiwKKyAgICAgICAgR3JhcGhp
Y3NDb250ZXh0M0Q6OkZSQUdNRU5UX1NIQURFUgorICAgIH07CisgICAgZm9yICh1bnNpZ25lZCBp
ID0gMDsgaSA8IHNpemVvZihzaGFkZXJUeXBlKSAvIHNpemVvZihHQzNEZW51bSk7ICsraSkgewor
ICAgICAgICBXZWJHTFNoYWRlciogc2hhZGVyID0gcHJvZ3JhbS0+Z2V0QXR0YWNoZWRTaGFkZXIo
c2hhZGVyVHlwZVtpXSk7CisgICAgICAgIGlmIChzaGFkZXIpCisgICAgICAgICAgICBzaGFkZXJP
YmplY3RzLmFwcGVuZChzaGFkZXIpOwogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KQEAgLTIw
MjgsNDYgKzIwMjAsNDkgQEAgV2ViR0xHZXRJbmZvIFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6Z2V0
RgogICAgIFVOVVNFRF9QQVJBTShlYyk7CiAgICAgaWYgKGlzQ29udGV4dExvc3QoKSB8fCAhdmFs
aWRhdGVGcmFtZWJ1ZmZlckZ1bmNQYXJhbWV0ZXJzKHRhcmdldCwgYXR0YWNobWVudCkpCiAgICAg
ICAgIHJldHVybiBXZWJHTEdldEluZm8oKTsKLSAgICBzd2l0Y2ggKHBuYW1lKSB7Ci0gICAgY2Fz
ZSBHcmFwaGljc0NvbnRleHQzRDo6RlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfVFlQRToK
LSAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVD
VF9OQU1FOgotICAgIGNhc2UgR3JhcGhpY3NDb250ZXh0M0Q6OkZSQU1FQlVGRkVSX0FUVEFDSE1F
TlRfVEVYVFVSRV9MRVZFTDoKLSAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpGUkFNRUJVRkZF
Ul9BVFRBQ0hNRU5UX1RFWFRVUkVfQ1VCRV9NQVBfRkFDRToKLSAgICAgICAgYnJlYWs7Ci0gICAg
ZGVmYXVsdDoKLSAgICAgICAgbV9jb250ZXh0LT5zeW50aGVzaXplR0xFcnJvcihHcmFwaGljc0Nv
bnRleHQzRDo6SU5WQUxJRF9FTlVNKTsKLSAgICAgICAgcmV0dXJuIFdlYkdMR2V0SW5mbygpOwot
ICAgIH0KIAogICAgIGlmICghbV9mcmFtZWJ1ZmZlckJpbmRpbmcgfHwgIW1fZnJhbWVidWZmZXJC
aW5kaW5nLT5vYmplY3QoKSB8fCBtX2ZyYW1lYnVmZmVyQmluZGluZy0+aXNJbmNvbXBsZXRlKGZh
bHNlKSkgewogICAgICAgICBtX2NvbnRleHQtPnN5bnRoZXNpemVHTEVycm9yKEdyYXBoaWNzQ29u
dGV4dDNEOjpJTlZBTElEX09QRVJBVElPTik7CiAgICAgICAgIHJldHVybiBXZWJHTEdldEluZm8o
KTsKICAgICB9CiAKLSAgICBpZiAocG5hbWUgIT0gR3JhcGhpY3NDb250ZXh0M0Q6OkZSQU1FQlVG
RkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUUpIHsKLSAgICAgICAgV2ViR0xTdGF0ZVJlc3RvcmVy
KHRoaXMsIGZhbHNlKTsKLSAgICAgICAgR0MzRGludCB2YWx1ZSA9IDA7Ci0gICAgICAgIG1fY29u
dGV4dC0+Z2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyaXYodGFyZ2V0LCBhdHRhY2ht
ZW50LCBwbmFtZSwgJnZhbHVlKTsKKyAgICBXZWJHTE9iamVjdCogb2JqZWN0ID0gbV9mcmFtZWJ1
ZmZlckJpbmRpbmctPmdldEF0dGFjaG1lbnQoYXR0YWNobWVudCk7CisgICAgaWYgKCFvYmplY3Qp
IHsKICAgICAgICAgaWYgKHBuYW1lID09IEdyYXBoaWNzQ29udGV4dDNEOjpGUkFNRUJVRkZFUl9B
VFRBQ0hNRU5UX09CSkVDVF9UWVBFKQotICAgICAgICAgICAgcmV0dXJuIFdlYkdMR2V0SW5mbyhz
dGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KHZhbHVlKSk7Ci0gICAgICAgIHJldHVybiBXZWJHTEdl
dEluZm8odmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIFdlYkdMR2V0SW5mbyhHcmFwaGljc0Nv
bnRleHQzRDo6Tk9ORSk7CisgICAgICAgIG1fY29udGV4dC0+c3ludGhlc2l6ZUdMRXJyb3IoR3Jh
cGhpY3NDb250ZXh0M0Q6OklOVkFMSURfRU5VTSk7CisgICAgICAgIHJldHVybiBXZWJHTEdldElu
Zm8oKTsKICAgICB9CiAKLSAgICBXZWJHTFN0YXRlUmVzdG9yZXIodGhpcywgZmFsc2UpOwotICAg
IEdDM0RpbnQgdHlwZSA9IDA7Ci0gICAgbV9jb250ZXh0LT5nZXRGcmFtZWJ1ZmZlckF0dGFjaG1l
bnRQYXJhbWV0ZXJpdih0YXJnZXQsIGF0dGFjaG1lbnQsIEdyYXBoaWNzQ29udGV4dDNEOjpGUkFN
RUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFLCAmdHlwZSk7Ci0gICAgaWYgKCF0eXBlKQot
ICAgICAgICByZXR1cm4gV2ViR0xHZXRJbmZvKCk7Ci0gICAgR0MzRGludCB2YWx1ZSA9IDA7Ci0g
ICAgbV9jb250ZXh0LT5nZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdih0YXJnZXQs
IGF0dGFjaG1lbnQsIEdyYXBoaWNzQ29udGV4dDNEOjpGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09C
SkVDVF9OQU1FLCAmdmFsdWUpOwotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgR3JhcGhp
Y3NDb250ZXh0M0Q6OlJFTkRFUkJVRkZFUjoKLSAgICAgICAgcmV0dXJuIFdlYkdMR2V0SW5mbyhQ
YXNzUmVmUHRyPFdlYkdMUmVuZGVyYnVmZmVyPihmaW5kUmVuZGVyYnVmZmVyKHN0YXRpY19jYXN0
PFBsYXRmb3JtM0RPYmplY3Q+KHZhbHVlKSkpKTsKLSAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNE
OjpURVhUVVJFOgotICAgICAgICByZXR1cm4gV2ViR0xHZXRJbmZvKFBhc3NSZWZQdHI8V2ViR0xU
ZXh0dXJlPihmaW5kVGV4dHVyZShzdGF0aWNfY2FzdDxQbGF0Zm9ybTNET2JqZWN0Pih2YWx1ZSkp
KSk7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgLy8gRklYTUU6IHJhaXNlIGV4Y2VwdGlvbj8KLSAg
ICAgICAgcmV0dXJuIFdlYkdMR2V0SW5mbygpOworICAgIEFTU0VSVChvYmplY3QtPmlzVGV4dHVy
ZSgpIHx8IG9iamVjdC0+aXNSZW5kZXJidWZmZXIoKSk7CisgICAgaWYgKG9iamVjdC0+aXNUZXh0
dXJlKCkpIHsKKyAgICAgICAgc3dpdGNoIChwbmFtZSkgeworICAgICAgICBjYXNlIEdyYXBoaWNz
Q29udGV4dDNEOjpGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFOgorICAgICAgICAg
ICAgcmV0dXJuIFdlYkdMR2V0SW5mbyhHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRSk7CisgICAg
ICAgIGNhc2UgR3JhcGhpY3NDb250ZXh0M0Q6OkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNU
X05BTUU6CisgICAgICAgICAgICByZXR1cm4gV2ViR0xHZXRJbmZvKFBhc3NSZWZQdHI8V2ViR0xU
ZXh0dXJlPihyZWludGVycHJldF9jYXN0PFdlYkdMVGV4dHVyZSo+KG9iamVjdCkpKTsKKyAgICAg
ICAgY2FzZSBHcmFwaGljc0NvbnRleHQzRDo6RlJBTUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJF
X0xFVkVMOgorICAgICAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpGUkFNRUJVRkZFUl9BVFRB
Q0hNRU5UX1RFWFRVUkVfQ1VCRV9NQVBfRkFDRToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAg
ICAgICBXZWJHTFN0YXRlUmVzdG9yZXIodGhpcywgZmFsc2UpOworICAgICAgICAgICAgICAgIEdD
M0RpbnQgdmFsdWUgPSAwOworICAgICAgICAgICAgICAgIG1fY29udGV4dC0+Z2V0RnJhbWVidWZm
ZXJBdHRhY2htZW50UGFyYW1ldGVyaXYodGFyZ2V0LCBhdHRhY2htZW50LCBwbmFtZSwgJnZhbHVl
KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gV2ViR0xHZXRJbmZvKHZhbHVlKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1fY29udGV4dC0+c3ludGhlc2l6
ZUdMRXJyb3IoR3JhcGhpY3NDb250ZXh0M0Q6OklOVkFMSURfRU5VTSk7CisgICAgICAgICAgICBy
ZXR1cm4gV2ViR0xHZXRJbmZvKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBz
d2l0Y2ggKHBuYW1lKSB7CisgICAgICAgIGNhc2UgR3JhcGhpY3NDb250ZXh0M0Q6OkZSQU1FQlVG
RkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEU6CisgICAgICAgICAgICByZXR1cm4gV2ViR0xHZXRJ
bmZvKEdyYXBoaWNzQ29udGV4dDNEOjpSRU5ERVJCVUZGRVIpOworICAgICAgICBjYXNlIEdyYXBo
aWNzQ29udGV4dDNEOjpGUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FOgorICAgICAg
ICAgICAgcmV0dXJuIFdlYkdMR2V0SW5mbyhQYXNzUmVmUHRyPFdlYkdMUmVuZGVyYnVmZmVyPihy
ZWludGVycHJldF9jYXN0PFdlYkdMUmVuZGVyYnVmZmVyKj4ob2JqZWN0KSkpOworICAgICAgICBk
ZWZhdWx0OgorICAgICAgICAgICAgbV9jb250ZXh0LT5zeW50aGVzaXplR0xFcnJvcihHcmFwaGlj
c0NvbnRleHQzRDo6SU5WQUxJRF9FTlVNKTsKKyAgICAgICAgICAgIHJldHVybiBXZWJHTEdldElu
Zm8oKTsKKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtMzk5MSw1OSArMzk4NiwyMCBAQCB2b2lk
IFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6YWRkT2JqZWN0KFdlCiAKIHZvaWQgV2ViR0xSZW5kZXJp
bmdDb250ZXh0OjpkZXRhY2hBbmRSZW1vdmVBbGxPYmplY3RzKCkKIHsKLSAgICBIYXNoU2V0PFJl
ZlB0cjxXZWJHTE9iamVjdD4gPjo6aXRlcmF0b3IgcGVuZCA9IG1fY2FudmFzT2JqZWN0cy5lbmQo
KTsKLSAgICBmb3IgKEhhc2hTZXQ8UmVmUHRyPFdlYkdMT2JqZWN0PiA+OjppdGVyYXRvciBpdCA9
IG1fY2FudmFzT2JqZWN0cy5iZWdpbigpOyBpdCAhPSBwZW5kOyArK2l0KQotICAgICAgICAoKml0
KS0+ZGV0YWNoQ29udGV4dCgpOwotCi0gICAgbV9jYW52YXNPYmplY3RzLmNsZWFyKCk7Ci19Ci0K
LVdlYkdMVGV4dHVyZSogV2ViR0xSZW5kZXJpbmdDb250ZXh0OjpmaW5kVGV4dHVyZShQbGF0Zm9y
bTNET2JqZWN0IG9iaikKLXsKLSAgICBpZiAoIW9iaikKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAg
SGFzaFNldDxSZWZQdHI8V2ViR0xPYmplY3Q+ID46Oml0ZXJhdG9yIHBlbmQgPSBtX2NhbnZhc09i
amVjdHMuZW5kKCk7Ci0gICAgZm9yIChIYXNoU2V0PFJlZlB0cjxXZWJHTE9iamVjdD4gPjo6aXRl
cmF0b3IgaXQgPSBtX2NhbnZhc09iamVjdHMuYmVnaW4oKTsgaXQgIT0gcGVuZDsgKytpdCkgewot
ICAgICAgICBpZiAoKCppdCktPmlzVGV4dHVyZSgpICYmICgqaXQpLT5vYmplY3QoKSA9PSBvYmop
Ci0gICAgICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxXZWJHTFRleHR1cmUqPigoKml0
KS5nZXQoKSk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1XZWJHTFJlbmRlcmJ1ZmZlciog
V2ViR0xSZW5kZXJpbmdDb250ZXh0OjpmaW5kUmVuZGVyYnVmZmVyKFBsYXRmb3JtM0RPYmplY3Qg
b2JqKQotewotICAgIGlmICghb2JqKQotICAgICAgICByZXR1cm4gMDsKLSAgICBIYXNoU2V0PFJl
ZlB0cjxXZWJHTE9iamVjdD4gPjo6aXRlcmF0b3IgcGVuZCA9IG1fY2FudmFzT2JqZWN0cy5lbmQo
KTsKLSAgICBmb3IgKEhhc2hTZXQ8UmVmUHRyPFdlYkdMT2JqZWN0PiA+OjppdGVyYXRvciBpdCA9
IG1fY2FudmFzT2JqZWN0cy5iZWdpbigpOyBpdCAhPSBwZW5kOyArK2l0KSB7Ci0gICAgICAgIGlm
ICgoKml0KS0+aXNSZW5kZXJidWZmZXIoKSAmJiAoKml0KS0+b2JqZWN0KCkgPT0gb2JqKQotICAg
ICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8V2ViR0xSZW5kZXJidWZmZXIqPigoKml0
KS5nZXQoKSk7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1XZWJHTEJ1ZmZlciogV2ViR0xS
ZW5kZXJpbmdDb250ZXh0OjpmaW5kQnVmZmVyKFBsYXRmb3JtM0RPYmplY3Qgb2JqKQotewotICAg
IGlmICghb2JqKQotICAgICAgICByZXR1cm4gMDsKLSAgICBIYXNoU2V0PFJlZlB0cjxXZWJHTE9i
amVjdD4gPjo6aXRlcmF0b3IgcGVuZCA9IG1fY2FudmFzT2JqZWN0cy5lbmQoKTsKLSAgICBmb3Ig
KEhhc2hTZXQ8UmVmUHRyPFdlYkdMT2JqZWN0PiA+OjppdGVyYXRvciBpdCA9IG1fY2FudmFzT2Jq
ZWN0cy5iZWdpbigpOyBpdCAhPSBwZW5kOyArK2l0KSB7Ci0gICAgICAgIGlmICgoKml0KS0+aXNC
dWZmZXIoKSAmJiAoKml0KS0+b2JqZWN0KCkgPT0gb2JqKQotICAgICAgICAgICAgcmV0dXJuIHJl
aW50ZXJwcmV0X2Nhc3Q8V2ViR0xCdWZmZXIqPigoKml0KS5nZXQoKSk7Ci0gICAgfQotICAgIHJl
dHVybiAwOwotfQotCi1XZWJHTFNoYWRlciogV2ViR0xSZW5kZXJpbmdDb250ZXh0OjpmaW5kU2hh
ZGVyKFBsYXRmb3JtM0RPYmplY3Qgb2JqKQotewotICAgIGlmICghb2JqKQotICAgICAgICByZXR1
cm4gMDsKLSAgICBIYXNoU2V0PFJlZlB0cjxXZWJHTE9iamVjdD4gPjo6aXRlcmF0b3IgcGVuZCA9
IG1fY2FudmFzT2JqZWN0cy5lbmQoKTsKLSAgICBmb3IgKEhhc2hTZXQ8UmVmUHRyPFdlYkdMT2Jq
ZWN0PiA+OjppdGVyYXRvciBpdCA9IG1fY2FudmFzT2JqZWN0cy5iZWdpbigpOyBpdCAhPSBwZW5k
OyArK2l0KSB7Ci0gICAgICAgIGlmICgoKml0KS0+aXNTaGFkZXIoKSAmJiAoKml0KS0+b2JqZWN0
KCkgPT0gb2JqKQotICAgICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8V2ViR0xTaGFk
ZXIqPigoKml0KS5nZXQoKSk7CisgICAgYm9vbCBkb25lID0gZmFsc2U7CisgICAgd2hpbGUgKCFk
b25lKSB7CisgICAgICAgIGRvbmUgPSB0cnVlOworICAgICAgICBIYXNoU2V0PFdlYkdMT2JqZWN0
Kj46Oml0ZXJhdG9yIHBlbmQgPSBtX2NhbnZhc09iamVjdHMuZW5kKCk7CisgICAgICAgIGludCBz
aXplID0gIG1fY2FudmFzT2JqZWN0cy5zaXplKCk7CisgICAgICAgIGZvciAoSGFzaFNldDxXZWJH
TE9iamVjdCo+OjppdGVyYXRvciBpdCA9IG1fY2FudmFzT2JqZWN0cy5iZWdpbigpOyBpdCAhPSBw
ZW5kOyArK2l0KSB7CisgICAgICAgICAgICAoKml0KS0+ZGV0YWNoQ29udGV4dCgpOworICAgICAg
ICAgICAgaWYgKHNpemUgIT0gbV9jYW52YXNPYmplY3RzLnNpemUoKSkgeworICAgICAgICAgICAg
ICAgIGRvbmUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gMDsKKyAgICBtX2NhbnZhc09iamVjdHMuY2xl
YXIoKTsKIH0KIAogV2ViR0xHZXRJbmZvIFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6Z2V0Qm9vbGVh
blBhcmFtZXRlcihHQzNEZW51bSBwbmFtZSkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0bWwvY2Fu
dmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L2h0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dC5oCShyZXZpc2lvbiA4OTkzNykKKysr
IFNvdXJjZS9XZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dC5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zMDYsMTAgKzMwNiw2IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgYWRkT2Jq
ZWN0KFdlYkdMT2JqZWN0Kik7CiAgICAgdm9pZCBkZXRhY2hBbmRSZW1vdmVBbGxPYmplY3RzKCk7
Ci0gICAgV2ViR0xUZXh0dXJlKiBmaW5kVGV4dHVyZShQbGF0Zm9ybTNET2JqZWN0KTsKLSAgICBX
ZWJHTFJlbmRlcmJ1ZmZlciogZmluZFJlbmRlcmJ1ZmZlcihQbGF0Zm9ybTNET2JqZWN0KTsKLSAg
ICBXZWJHTEJ1ZmZlciogZmluZEJ1ZmZlcihQbGF0Zm9ybTNET2JqZWN0KTsKLSAgICBXZWJHTFNo
YWRlciogZmluZFNoYWRlcihQbGF0Zm9ybTNET2JqZWN0KTsKIAogICAgIHZvaWQgbWFya0NvbnRl
eHRDaGFuZ2VkKCk7CiAgICAgdm9pZCBjbGVhbnVwQWZ0ZXJHcmFwaGljc0NhbGwoYm9vbCBjaGFu
Z2VkKQpAQCAtMzY0LDcgKzM2MCw3IEBAIHB1YmxpYzoKIAogICAgIGJvb2wgbV9uZWVkc1VwZGF0
ZTsKICAgICBib29sIG1fbWFya2VkQ2FudmFzRGlydHk7Ci0gICAgSGFzaFNldDxSZWZQdHI8V2Vi
R0xPYmplY3Q+ID4gbV9jYW52YXNPYmplY3RzOworICAgIEhhc2hTZXQ8V2ViR0xPYmplY3QqPiBt
X2NhbnZhc09iamVjdHM7CiAKICAgICAvLyBMaXN0IG9mIGJvdW5kIFZCTydzLiBVc2VkIHRvIG1h
aW50YWluIGluZm8gYWJvdXQgc2l6ZXMgZm9yIEFSUkFZX0JVRkZFUiBhbmQgc3RvcmVkIHZhbHVl
cyBmb3IgRUxFTUVOVF9BUlJBWV9CVUZGRVIKICAgICBSZWZQdHI8V2ViR0xCdWZmZXI+IG1fYm91
bmRBcnJheUJ1ZmZlcjsKSW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDkwMTI3KQorKysgTGF5b3V0VGVzdHMv
Q2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTYgQEAKKzIwMTEtMDYtMzAgIFpo
ZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBJbXByb3ZlIFdlYkdMIG9iamVjdCBsaWZldGltZSBtYW5hZ2Vt
ZW50IGluIFdlYkdMUmVuZGVyaW5nQ29udGV4dAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NjM2MzUKKworICAgICAgICAqIGZhc3QvY2FudmFzL3dlYmds
L2dsLW9iamVjdC1nZXQtY2FsbHMtZXhwZWN0ZWQudHh0OgorICAgICAgICAqIGZhc3QvY2FudmFz
L3dlYmdsL2dsLW9iamVjdC1nZXQtY2FsbHMuaHRtbDogRml4IGEgYnVnIHNvIGdldEZyYW1lYnVm
ZmVyQXRhdGNobWVudFBhcmFtZXRlciBnZW5lcmF0ZXMgYW4gZXJyb3IgaWYgbm90aGluZyBpcyBh
dHRhY2hlZCBhbmQgc29tZXRoaW5nIG90aGVyIHRoYW4gVFlQRSBpcyBxdWVyaWVkLgorICAgICAg
ICAqIGZhc3QvY2FudmFzL3dlYmdsL29iamVjdC1kZWxldGlvbi1iZWhhdmlvdXItZXhwZWN0ZWQu
dHh0OgorICAgICAgICAqIGZhc3QvY2FudmFzL3dlYmdsL29iamVjdC1kZWxldGlvbi1iZWhhdmlv
dXIuaHRtbDogRGl0dG8uCisgICAgICAgICogZmFzdC9jYW52YXMvd2ViZ2wvcHJvZ3JhbS10ZXN0
Lmh0bWw6IEZpeCB0aGUgdGVzdCBzbyB0aGUgb3JkZXIgb2Ygc2hhZGVycyByZXR1cm5lZCBieSBn
ZXRBdHRhY2hlZFNoYWRlcnMgZG9lc24ndCBtYXR0ZXIuCisKIDIwMTEtMDYtMzAgIFpzb2x0IEZl
aMOpciAgPGg0OTAyNjdAc3R1ZC51LXN6ZWdlZC5odT4KIAogICAgICAgICBSZXZpZXdlZCBieSBD
c2FiYSBPc3p0cm9nb27DoWMuCkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9n
bC1vYmplY3QtZ2V0LWNhbGxzLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0
cy9mYXN0L2NhbnZhcy93ZWJnbC9nbC1vYmplY3QtZ2V0LWNhbGxzLWV4cGVjdGVkLnR4dAkocmV2
aXNpb24gODk5NTYpCisrKyBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9nbC1vYmplY3Qt
Z2V0LWNhbGxzLWV4cGVjdGVkLnR4dAkod29ya2luZyBjb3B5KQpAQCAtODIsOCArODIsOCBAQCBQ
QVNTIGdsLmdldFZlcnRleEF0dHJpYk9mZnNldCgxLCBnbC5WRVJUCiBQQVNTIGdsLmdldFZlcnRl
eEF0dHJpYigxLCBnbC5WRVJURVhfQVRUUklCX0FSUkFZX0VOQUJMRUQpIGlzIGZhbHNlCiBQQVNT
IGdsLmdldFZlcnRleEF0dHJpYigxLCBnbC5DVVJSRU5UX1ZFUlRFWF9BVFRSSUIpIGlzIFs1LCA2
LCA3LCA4XQogUEFTUyBnZXRFcnJvciB3YXMgZXhwZWN0ZWQgdmFsdWU6IE5PX0VSUk9SIDogCi1Q
QVNTIGdsLmdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcihnbC5GUkFNRUJVRkZFUiwg
Z2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05B
TUUpIGlzIG51bGwKLVBBU1MgZ2wuZ2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyKGds
LkZSQU1FQlVGRkVSLCBnbC5ERVBUSF9BVFRBQ0hNRU5ULCBnbC5GUkFNRUJVRkZFUl9BVFRBQ0hN
RU5UX09CSkVDVF9OQU1FKSBpcyBudWxsCitQQVNTIGdsLmdldEZyYW1lYnVmZmVyQXR0YWNobWVu
dFBhcmFtZXRlcihnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLkZSQU1F
QlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEUpIGlzIGdsLk5PTkUKK1BBU1MgZ2wuZ2V0RnJh
bWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyKGdsLkZSQU1FQlVGRkVSLCBnbC5ERVBUSF9BVFRB
Q0hNRU5ULCBnbC5GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFKSBpcyBnbC5OT05F
CiBQQVNTIGdsLmdldFZlcnRleEF0dHJpYigxLCBnbC5WRVJURVhfQVRUUklCX0FSUkFZX0JVRkZF
Ul9CSU5ESU5HKSBpcyBudWxsCiBQQVNTIGdldEVycm9yIHdhcyBleHBlY3RlZCB2YWx1ZTogTk9f
RVJST1IgOiAKIFBBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKSW5kZXg6IExheW91dFRl
c3RzL2Zhc3QvY2FudmFzL3dlYmdsL2dsLW9iamVjdC1nZXQtY2FsbHMuaHRtbAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9nbC1vYmplY3QtZ2V0LWNhbGxzLmh0
bWwJKHJldmlzaW9uIDg5OTU2KQorKysgTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvZ2wt
b2JqZWN0LWdldC1jYWxscy5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNyBAQAorPCFE
T0NUWVBFIGh0bWw+CiA8aHRtbD4KIDxoZWFkPgorPG1ldGEgY2hhcnNldD0idXRmLTgiPgogPGxp
bmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9qcy9yZXNvdXJjZXMvanMtdGVzdC1zdHls
ZS5jc3MiLz4KIDxzY3JpcHQgc3JjPSIuLi8uLi9qcy9yZXNvdXJjZXMvanMtdGVzdC1wcmUuanMi
Pjwvc2NyaXB0PgogPHNjcmlwdCBzcmM9InJlc291cmNlcy93ZWJnbC10ZXN0LmpzIj48L3Njcmlw
dD4KQEAgLTIzNSw5ICsyMzcsOSBAQCBnbEVycm9yU2hvdWxkQmUoZ2wsIGdsLk5PX0VSUk9SKTsK
IAogLy8gVGVzdCBjYXNlcyB3aGVyZSBuYW1lID09IDAKIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVy
ZSk7Ci1zaG91bGRCZU51bGwoJ2dsLmdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcihn
bC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLkZSQU1FQlVGRkVSX0FUVEFD
SE1FTlRfT0JKRUNUX05BTUUpJyk7CitzaG91bGRCZSgnZ2wuZ2V0RnJhbWVidWZmZXJBdHRhY2ht
ZW50UGFyYW1ldGVyKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuRlJB
TUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfVFlQRSknLCAnZ2wuTk9ORScpOwogZ2wuZGVsZXRl
UmVuZGVyYnVmZmVyKHJlbmRlcmJ1ZmZlcik7Ci1zaG91bGRCZU51bGwoJ2dsLmdldEZyYW1lYnVm
ZmVyQXR0YWNobWVudFBhcmFtZXRlcihnbC5GUkFNRUJVRkZFUiwgZ2wuREVQVEhfQVRUQUNITUVO
VCwgZ2wuRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRSknKTsKK3Nob3VsZEJlKCdn
bC5nZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXIoZ2wuRlJBTUVCVUZGRVIsIGdsLkRF
UFRIX0FUVEFDSE1FTlQsIGdsLkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEUpJywg
J2dsLk5PTkUnKTsKIGdsLmRlbGV0ZUJ1ZmZlcihidWZmZXIpOwogc2hvdWxkQmVOdWxsKCdnbC5n
ZXRWZXJ0ZXhBdHRyaWIoMSwgZ2wuVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElORykn
KTsKIGdsRXJyb3JTaG91bGRCZShnbCwgZ2wuTk9fRVJST1IpOwpJbmRleDogTGF5b3V0VGVzdHMv
ZmFzdC9jYW52YXMvd2ViZ2wvb2JqZWN0LWRlbGV0aW9uLWJlaGF2aW91ci1leHBlY3RlZC50eHQK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvb2JqZWN0LWRlbGV0
aW9uLWJlaGF2aW91ci1leHBlY3RlZC50eHQJKHJldmlzaW9uIDg5OTU2KQorKysgTGF5b3V0VGVz
dHMvZmFzdC9jYW52YXMvd2ViZ2wvb2JqZWN0LWRlbGV0aW9uLWJlaGF2aW91ci1leHBlY3RlZC50
eHQJKHdvcmtpbmcgY29weSkKQEAgLTMzLDcgKzMzLDggQEAgUEFTUyBnbC5nZXRQYXJhbWV0ZXIo
Z2wuVEVYVFVSRV9CSU5ESU5HXwogUEFTUyBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChnbC5GUkFN
RUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIHRleCwgMCkgd2Fz
IGV4cGVjdGVkIHZhbHVlOiBOT19FUlJPUi4KIFBBU1MgZ2wuZ2V0RnJhbWVidWZmZXJBdHRhY2ht
ZW50UGFyYW1ldGVyKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuRlJB
TUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRSkgaXMgdGV4CiBQQVNTIGdsLmRlbGV0ZVRl
eHR1cmUodGV4KSB3YXMgZXhwZWN0ZWQgdmFsdWU6IE5PX0VSUk9SLgotUEFTUyBnbC5nZXRGcmFt
ZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXIoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFD
SE1FTlQwLCBnbC5GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FKSBpcyBudWxsCitQ
QVNTIGdsLmdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcihnbC5GUkFNRUJVRkZFUiwg
Z2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZ
UEUpIGlzIGdsLk5PTkUKK1BBU1MgZ2wuZ2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVy
KGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuRlJBTUVCVUZGRVJfQVRU
QUNITUVOVF9PQkpFQ1RfTkFNRSkgd2FzIGV4cGVjdGVkIHZhbHVlOiBJTlZBTElEX0VOVU0uCiBQ
QVNTIGdsLmlzVGV4dHVyZSh0ZXgpIGlzIGZhbHNlCiBQQVNTIGdsLmdldFBhcmFtZXRlcihnbC5U
RVhUVVJFX0JJTkRJTkdfMkQpIGlzIG51bGwKIFBBU1MgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVS
RV8yRCwgdGV4KSB3YXMgZXhwZWN0ZWQgdmFsdWU6IE5PX0VSUk9SLgpAQCAtNTIsNyArNTMsOCBA
QCBQQVNTIGdsLmdldFBhcmFtZXRlcihnbC5SRU5ERVJCVUZGRVJfQklOCiBQQVNTIGdsLmZyYW1l
YnVmZmVyUmVuZGVyYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwg
Z2wuUkVOREVSQlVGRkVSLCByYm8pIHdhcyBleHBlY3RlZCB2YWx1ZTogTk9fRVJST1IuCiBQQVNT
IGdsLmdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcihnbC5GUkFNRUJVRkZFUiwgZ2wu
Q09MT1JfQVRUQUNITUVOVDAsIGdsLkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUUp
IGlzIHJibwogUEFTUyBnbC5kZWxldGVSZW5kZXJidWZmZXIocmJvKSB3YXMgZXhwZWN0ZWQgdmFs
dWU6IE5PX0VSUk9SLgotUEFTUyBnbC5nZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXIo
Z2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5GUkFNRUJVRkZFUl9BVFRB
Q0hNRU5UX09CSkVDVF9OQU1FKSBpcyBudWxsCitQQVNTIGdsLmdldEZyYW1lYnVmZmVyQXR0YWNo
bWVudFBhcmFtZXRlcihnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLkZS
QU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEUpIGlzIGdsLk5PTkUKK1BBU1MgZ2wuZ2V0
RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9B
VFRBQ0hNRU5UMCwgZ2wuRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRSkgd2FzIGV4
cGVjdGVkIHZhbHVlOiBJTlZBTElEX0VOVU0uCiBQQVNTIGdsLmlzUmVuZGVyYnVmZmVyKHJibykg
aXMgZmFsc2UKIFBBU1MgZ2wuZ2V0UGFyYW1ldGVyKGdsLlJFTkRFUkJVRkZFUl9CSU5ESU5HKSBp
cyBudWxsCiBQQVNTIGdsLmJpbmRSZW5kZXJidWZmZXIoZ2wuUkVOREVSQlVGRkVSLCByYm8pIHdh
cyBleHBlY3RlZCB2YWx1ZTogTk9fRVJST1IuCkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L2NhbnZh
cy93ZWJnbC9vYmplY3QtZGVsZXRpb24tYmVoYXZpb3VyLmh0bWwKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5
b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvb2JqZWN0LWRlbGV0aW9uLWJlaGF2aW91ci5odG1s
CShyZXZpc2lvbiA4OTk1NikKKysrIExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL29iamVj
dC1kZWxldGlvbi1iZWhhdmlvdXIuaHRtbAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDcgQEAK
KzwhRE9DVFlQRSBodG1sPgogPGh0bWw+CiA8aGVhZD4KKzxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4K
IDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vanMvcmVzb3VyY2VzL2pzLXRlc3Qt
c3R5bGUuY3NzIi8+CiA8c2NyaXB0IHNyYz0iLi4vLi4vanMvcmVzb3VyY2VzL2pzLXRlc3QtcHJl
LmpzIj48L3NjcmlwdD4KIDxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvd2ViZ2wtdGVzdC5qcyI+PC9z
Y3JpcHQ+CkBAIC01OSw3ICs2MSw4IEBAIHNob3VsZEJlKCJnbC5nZXRGcmFtZWJ1ZmZlckF0dGFj
aG1lbnRQYXIKIHNob3VsZEdlbmVyYXRlR0xFcnJvcihnbCwgZ2wuTk9fRVJST1IsICJnbC5kZWxl
dGVUZXh0dXJlKHRleCkiKTsKIC8vIERlbGV0aW5nIGEgdGV4dHVyZSBib3VuZCB0byB0aGUgY3Vy
cmVudGx5LWJvdW5kIGZibyBpcyB0aGUgc2FtZSBhcwogLy8gZGV0YWNoaW5nIHRoZSB0ZXh0dWUg
ZnJvbSBmYm8gZmlyc3QsIHRoZW4gZGVsZXRlIHRoZSB0ZXh0dXJlLgotc2hvdWxkQmVOdWxsKCJn
bC5nZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXIoZ2wuRlJBTUVCVUZGRVIsIGdsLkNP
TE9SX0FUVEFDSE1FTlQwLCBnbC5GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FKSIp
Oworc2hvdWxkQmUoImdsLmdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcihnbC5GUkFN
RUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRf
T0JKRUNUX1RZUEUpIiwgImdsLk5PTkUiKTsKK3Nob3VsZEdlbmVyYXRlR0xFcnJvcihnbCwgZ2wu
SU5WQUxJRF9FTlVNLCAiZ2wuZ2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyKGdsLkZS
QU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuRlJBTUVCVUZGRVJfQVRUQUNITUVO
VF9PQkpFQ1RfTkFNRSkiKTsKIHNob3VsZEJlRmFsc2UoImdsLmlzVGV4dHVyZSh0ZXgpIik7CiBz
aG91bGRCZU51bGwoImdsLmdldFBhcmFtZXRlcihnbC5URVhUVVJFX0JJTkRJTkdfMkQpIik7CiBz
aG91bGRHZW5lcmF0ZUdMRXJyb3IoZ2wsIGdsLk5PX0VSUk9SLCAiZ2wuYmluZFRleHR1cmUoZ2wu
VEVYVFVSRV8yRCwgdGV4KSIpOwpAQCAtODUsNyArODgsOCBAQCBzaG91bGRCZSgiZ2wuZ2V0RnJh
bWVidWZmZXJBdHRhY2htZW50UGFyCiBzaG91bGRHZW5lcmF0ZUdMRXJyb3IoZ2wsIGdsLk5PX0VS
Uk9SLCAiZ2wuZGVsZXRlUmVuZGVyYnVmZmVyKHJibykiKTsKIC8vIERlbGV0aW5nIGEgcmVuZGVy
YnVmZmVyIGJvdW5kIHRvIHRoZSBjdXJyZW50bHktYm91bmQgZmJvIGlzIHRoZSBzYW1lIGFzCiAv
LyBkZXRhY2hpbmcgdGhlIHJlbmRlcmJ1ZmZlciBmcm9tIGZibyBmaXJzdCwgdGhlbiBkZWxldGUg
dGhlIHJlbmRlcmJ1ZmZlci4KLXNob3VsZEJlTnVsbCgiZ2wuZ2V0RnJhbWVidWZmZXJBdHRhY2ht
ZW50UGFyYW1ldGVyKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuRlJB
TUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRSkiKTsKK3Nob3VsZEJlKCJnbC5nZXRGcmFt
ZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXIoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFD
SE1FTlQwLCBnbC5GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFKSIsICJnbC5OT05F
Iik7CitzaG91bGRHZW5lcmF0ZUdMRXJyb3IoZ2wsIGdsLklOVkFMSURfRU5VTSwgImdsLmdldEZy
YW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcihnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRU
QUNITUVOVDAsIGdsLkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUUpIik7CiBzaG91
bGRCZUZhbHNlKCJnbC5pc1JlbmRlcmJ1ZmZlcihyYm8pIik7CiBzaG91bGRCZU51bGwoImdsLmdl
dFBhcmFtZXRlcihnbC5SRU5ERVJCVUZGRVJfQklORElORykiKTsKIHNob3VsZEdlbmVyYXRlR0xF
cnJvcihnbCwgZ2wuTk9fRVJST1IsICJnbC5iaW5kUmVuZGVyYnVmZmVyKGdsLlJFTkRFUkJVRkZF
UiwgcmJvKSIpOwpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvcHJvZ3JhbS10
ZXN0Lmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvcHJv
Z3JhbS10ZXN0Lmh0bWwJKHJldmlzaW9uIDg5OTU2KQorKysgTGF5b3V0VGVzdHMvZmFzdC9jYW52
YXMvd2ViZ2wvcHJvZ3JhbS10ZXN0Lmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTEsOCArMSw3IEBA
Ci08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9u
YWwvL0VOIgotICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzwhRE9D
VFlQRSBodG1sPgogPGh0bWw+CiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlw
ZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+Cis8bWV0YSBjaGFyc2V0PSJ1
dGYtOCI+CiA8dGl0bGU+V2ViR0wgUHJvZ3JhbSBDb21waWxpbmcvTGlua2luZyBDb25mb3JtYW5j
ZSBUZXN0PC90aXRsZT4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vanMvcmVz
b3VyY2VzL2pzLXRlc3Qtc3R5bGUuY3NzIi8+CiA8c2NyaXB0IHNyYz0iLi4vLi4vanMvcmVzb3Vy
Y2VzL2pzLXRlc3QtcHJlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgpAQCAt
MzAsNiArMjksMzIgQEAgZnVuY3Rpb24gZ28oKSB7CiAgICAgZ2wuY2xlYXJDb2xvcigwLjAsIDAu
MCwgMC4wLCAwLjApOwogICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQgfCBnbC5ERVBU
SF9CVUZGRVJfQklUKTsKIAorICAgIGZ1bmN0aW9uIGRvQXJyYXlzSGF2ZVNhbWVDb250ZW50cyhh
LCBiKSB7CisgICAgICAgIHZhciBmbGFncyA9IFtdOworICAgICAgICBmdW5jdGlvbiBoYXNVbnVz
ZWRWYWx1ZShhLCB2YWx1ZSkgeworICAgICAgICAgICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IGEu
bGVuZ3RoOyArK2lpKSB7CisgICAgICAgICAgICAgICAgaWYgKGFbaWldID09PSB2YWx1ZSAmJiAh
ZmxhZ3NbaWldKSB7CisgICAgICAgICAgICAgICAgICAgIGZsYWdzW2lpXSA9IHRydWU7CisgICAg
ICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHRy
eSB7CisgICAgICAgICAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7CisgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yICh2YXIg
aWkgPSAwOyBpaSA8IGEubGVuZ3RoOyBpaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFoYXNV
bnVzZWRWYWx1ZShiLCBhW2lpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoZXgp
IHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICB9CiAKIC8vLy8vLy8gQ2hlY2sgY29tcGlsZVNoYWRlcigpIC8vLy8vLy8vLy8v
Ly8vLy8vLy8vLy8vLy8vLy8vCiAKQEAgLTU1LDE0ICs4MCwxNCBAQCBmdW5jdGlvbiBnbygpIHsK
ICAgICAgICAgICAgICAgImJhZCB2ZXJ0ZXggc2hhZGVyIHNob3VsZCBmYWlsIHRvIGNvbXBpbGUi
KTsKIAogICAgIHZhciBmcyA9IGdsLmNyZWF0ZVNoYWRlcihnbC5GUkFHTUVOVF9TSEFERVIpOwot
ICAgIGdsLnNoYWRlclNvdXJjZShmcywgIiNpZmRlZiBHTF9FU1xucHJlY2lzaW9uIG1lZGl1bXAg
ZmxvYXQ7XG4jZW5kaWZcbiB2YXJ5aW5nIHZlYzQgdkNvbG9yOyB2b2lkIG1haW4oKSB7IGdsX0Zy
YWdDb2xvciA9IHZDb2xvcjsgfSIpOworICAgIGdsLnNoYWRlclNvdXJjZShmcywgInByZWNpc2lv
biBtZWRpdW1wIGZsb2F0OyB2YXJ5aW5nIHZlYzQgdkNvbG9yOyB2b2lkIG1haW4oKSB7IGdsX0Zy
YWdDb2xvciA9IHZDb2xvcjsgfSIpOwogICAgIGdsLmNvbXBpbGVTaGFkZXIoZnMpOwogCiAgICAg
YXNzZXJ0TXNnKGdsLmdldFNoYWRlclBhcmFtZXRlcihmcywgZ2wuQ09NUElMRV9TVEFUVVMpID09
IHRydWUsCiAgICAgICAgICAgICAgICJnb29kIGZyYWdtZW50IHNoYWRlciBzaG91bGQgY29tcGls
ZSIpOwogCiAgICAgdmFyIGZzMiA9IGdsLmNyZWF0ZVNoYWRlcihnbC5GUkFHTUVOVF9TSEFERVIp
OwotICAgIGdsLnNoYWRlclNvdXJjZShmczIsICIjaWZkZWYgR0xfRVNcbnByZWNpc2lvbiBtZWRp
dW1wIGZsb2F0O1xuI2VuZGlmXG4gdmFyeWluZyB2ZWM0IHZDb2xvcjsgdm9pZCBtYWluKCkgeyBn
bF9GcmFnQ29sb3IgPSB2Q29sb3IgKiAwLjU7IH0iKTsKKyAgICBnbC5zaGFkZXJTb3VyY2UoZnMy
LCAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7IHZhcnlpbmcgdmVjNCB2Q29sb3I7IHZvaWQgbWFp
bigpIHsgZ2xfRnJhZ0NvbG9yID0gdkNvbG9yICogMC41OyB9Iik7CiAgICAgZ2wuY29tcGlsZVNo
YWRlcihmczIpOwogCiAgICAgYXNzZXJ0TXNnKGdsLmdldFNoYWRlclBhcmFtZXRlcihmczIsIGds
LkNPTVBJTEVfU1RBVFVTKSA9PSB0cnVlLApAQCAtMTMxLDcgKzE1Niw3IEBAIGZ1bmN0aW9uIGdv
KCkgewogICAgICAgICAgICAgZ2wuZGV0YWNoU2hhZGVyKHByb2csIHNoYWRlcnNfdG9fZGV0YWNo
W2ldKTsKICAgICAgICAgaWYoZ2wuZ2V0RXJyb3IoKSAhPSBnbC5OT19FUlJPUikKICAgICAgICAg
ICAgIGFzc2VydE1zZyhmYWxzZSwgInVuZXhwZWN0ZWQgZXJyb3IgaW4gZGV0YWNoU2hhZGVyKCki
KTsKLSAgICAgICAgYXNzZXJ0TXNnKGFyZUFycmF5c0VxdWFsKGdsLmdldEF0dGFjaGVkU2hhZGVy
cyhwcm9nKSwgZXhwZWN0ZWRfc2hhZGVycyksIGVycm1zZyk7CisgICAgICAgIGFzc2VydE1zZyhk
b0FycmF5c0hhdmVTYW1lQ29udGVudHMoZ2wuZ2V0QXR0YWNoZWRTaGFkZXJzKHByb2cpLCBleHBl
Y3RlZF9zaGFkZXJzKSwgZXJybXNnKTsKICAgICB9CiAgICAgY2hlY2tHZXRBdHRhY2hlZFNoYWRl
cnMoW10sIFtdLCBbXSwgImdldEF0dGFjaGVkU2hhZGVycyBzaG91bGQgcmV0dXJuIGFuIGVtcHR5
IGxpc3QgYnkgZGVmYXVsdCIpOwogICAgIGNoZWNrR2V0QXR0YWNoZWRTaGFkZXJzKFtmc10sIFtd
LCBbZnNdLCAiYXR0YWNoaW5nIGEgc2luZ2xlIHNoYWRlciBzaG91bGQgZ2l2ZSB0aGUgZXhwZWN0
ZWQgbGlzdCIpOwpAQCAtMjQyLDcgKzI2Nyw3IEBAIGZ1bmN0aW9uIGdvKCkgewogICAgIGdsRXJy
b3JTaG91bGRCZShnbCwgZ2wuTk9fRVJST1IsICJUaGUgY3VycmVudCBwcm9ncmFtIHNob3VsZG4n
dCBiZSBkZWxldGVkIik7CiAKICAgICB2YXIgZnMzID0gZ2wuY3JlYXRlU2hhZGVyKGdsLkZSQUdN
RU5UX1NIQURFUik7Ci0gICAgZ2wuc2hhZGVyU291cmNlKGZzMywgIiNpZmRlZiBHTF9FU1xucHJl
Y2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4jZW5kaWZcbiB2YXJ5aW5nIHZlYzQgdkNvbG9yOyB2b2lk
IG1haW4oKSB7IGdsX0ZyYWdDb2xvciA9IHZDb2xvcjsgfSIpOworICAgIGdsLnNoYWRlclNvdXJj
ZShmczMsICJwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsgdmFyeWluZyB2ZWM0IHZDb2xvcjsgdm9p
ZCBtYWluKCkgeyBnbF9GcmFnQ29sb3IgPSB2Q29sb3I7IH0iKTsKICAgICBnbC5jb21waWxlU2hh
ZGVyKGZzMyk7CiAKICAgICBhc3NlcnRNc2coZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKGZzMywgZ2wu
Q09NUElMRV9TVEFUVVMpID09IHRydWUsCkBAIC0yNTMsNyArMjc4LDcgQEAgZnVuY3Rpb24gZ28o
KSB7CiAgICAgZ2xFcnJvclNob3VsZEJlKGdsLCBnbC5JTlZBTElEX1ZBTFVFLCAiYW4gdW5hdHRh
Y2hlZCBzaGFkZXIgc2hvdWxkIGJlIGRlbGV0ZWQgaW1tZWRpYXRlbHkiKTsKIAogICAgIGZzMyA9
IGdsLmNyZWF0ZVNoYWRlcihnbC5GUkFHTUVOVF9TSEFERVIpOwotICAgIGdsLnNoYWRlclNvdXJj
ZShmczMsICIjaWZkZWYgR0xfRVNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2VuZGlmXG4g
dmFyeWluZyB2ZWM0IHZDb2xvcjsgdm9pZCBtYWluKCkgeyBnbF9GcmFnQ29sb3IgPSB2Q29sb3I7
IH0iKTsKKyAgICBnbC5zaGFkZXJTb3VyY2UoZnMzLCAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7
IHZhcnlpbmcgdmVjNCB2Q29sb3I7IHZvaWQgbWFpbigpIHsgZ2xfRnJhZ0NvbG9yID0gdkNvbG9y
OyB9Iik7CiAgICAgZ2wuY29tcGlsZVNoYWRlcihmczMpOwogCiAgICAgYXNzZXJ0TXNnKGdsLmdl
dFNoYWRlclBhcmFtZXRlcihmczMsIGdsLkNPTVBJTEVfU1RBVFVTKSA9PSB0cnVlLAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>99378</attachid>
            <date>2011-06-30 15:35:22 -0700</date>
            <delta_ts>2011-06-30 15:58:11 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-63635-20110630153521.patch</filename>
            <type>text/plain</type>
            <size>23525</size>
            <attacher name="Zhenyao Mo">zmo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDkwMTI3KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTYgQEAKKzIwMTEtMDYtMzAgIFpoZW55YW8g
TW8gIDx6bW9AZ29vZ2xlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMh
KS4KKworICAgICAgICBJbXByb3ZlIFdlYkdMIG9iamVjdCBsaWZldGltZSBtYW5hZ2VtZW50IGlu
IFdlYkdMUmVuZGVyaW5nQ29udGV4dAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9NjM2MzUKKworICAgICAgICAqIGh0bWwvY2FudmFzL1dlYkdMUmVuZGVy
aW5nQ29udGV4dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpXZWJHTFJlbmRlcmluZ0NvbnRleHQ6
OmdldEF0dGFjaGVkU2hhZGVycyk6IFVzZSBjYWNoZWQgb2JqZWN0cyBpbnN0ZWFkIG9mIHF1ZXJ5
aW5nIHRoZSB1bmRlcmx5aW5nIEdMLgorICAgICAgICAoV2ViQ29yZTo6V2ViR0xSZW5kZXJpbmdD
b250ZXh0OjpnZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXIpOiBEaXR0by4KKyAgICAg
ICAgKFdlYkNvcmU6OldlYkdMUmVuZGVyaW5nQ29udGV4dDo6ZGV0YWNoQW5kUmVtb3ZlQWxsT2Jq
ZWN0cyk6IE11bHRpcGxlIGxvb3AgYmVjYXVzZSBvYmplY3RzIG1pZ2h0IGJlIHJlbW92ZWQgZnJv
bSB0aGUgdGFibGUgd2l0aGluIGFuIGl0ZXJhdGlvbi4KKyAgICAgICAgKiBodG1sL2NhbnZhcy9X
ZWJHTFJlbmRlcmluZ0NvbnRleHQuaDoKKwogMjAxMS0wNi0zMCAgUGF0cmljayBHYW5zdGVyZXIg
IDxwYXJvZ2FAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBBZGFtIFJvYmVuLgpJ
bmRleDogU291cmNlL1dlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xPYmplY3QuY3BwCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMT2JqZWN0LmNwcAkocmV2aXNp
b24gODk5MzcpCisrKyBTb3VyY2UvV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTE9iamVjdC5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTY2LDYgKzY2LDE2IEBAIHZvaWQgV2ViR0xPYmplY3Q6OmRlbGV0
ZU9iamVjdCgpCiAgICAgfQogfQogCit2b2lkIFdlYkdMT2JqZWN0OjpkZXRhY2hDb250ZXh0KCkK
K3sKKyAgICBtX2F0dGFjaG1lbnRDb3VudCA9IDA7IC8vIE1ha2Ugc3VyZSBPcGVuR0wgcmVzb3Vy
Y2UgaXMgZGVsZXRlZC4KKyAgICBpZiAobV9jb250ZXh0KSB7CisgICAgICAgIGRlbGV0ZU9iamVj
dCgpOworICAgICAgICBtX2NvbnRleHQtPnJlbW92ZU9iamVjdCh0aGlzKTsKKyAgICAgICAgbV9j
b250ZXh0ID0gMDsKKyAgICB9Cit9CisKIH0KIAogI2VuZGlmIC8vIEVOQUJMRShXRUJHTCkKSW5k
ZXg6IFNvdXJjZS9XZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMT2JqZWN0LmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xPYmplY3QuaAkocmV2aXNpb24gODk5
MzcpCisrKyBTb3VyY2UvV2ViQ29yZS9odG1sL2NhbnZhcy9XZWJHTE9iamVjdC5oCSh3b3JraW5n
IGNvcHkpCkBAIC00NiwxMiArNDYsNyBAQCBwdWJsaWM6CiAgICAgLy8gRklYTUU6IHJldmlzaXQg
dGhpcyB3aGVuIHJlc291cmNlIHNoYXJpbmcgYmV0d2VlbiBjb250ZXh0cyBhcmUgaW1wbGVtZW50
ZWQuCiAgICAgdm9pZCBkZWxldGVPYmplY3QoKTsKIAotICAgIHZvaWQgZGV0YWNoQ29udGV4dCgp
Ci0gICAgewotICAgICAgICBtX2F0dGFjaG1lbnRDb3VudCA9IDA7IC8vIE1ha2Ugc3VyZSBPcGVu
R0wgcmVzb3VyY2UgaXMgZGVsZXRlZC4KLSAgICAgICAgZGVsZXRlT2JqZWN0KCk7Ci0gICAgICAg
IG1fY29udGV4dCA9IDA7Ci0gICAgfQorICAgIHZvaWQgZGV0YWNoQ29udGV4dCgpOwogCiAgICAg
V2ViR0xSZW5kZXJpbmdDb250ZXh0KiBjb250ZXh0KCkgY29uc3QgeyByZXR1cm4gbV9jb250ZXh0
OyB9CiAKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29u
dGV4dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvaHRtbC9jYW52YXMvV2ViR0xS
ZW5kZXJpbmdDb250ZXh0LmNwcAkocmV2aXNpb24gODk5MzcpCisrKyBTb3VyY2UvV2ViQ29yZS9o
dG1sL2NhbnZhcy9XZWJHTFJlbmRlcmluZ0NvbnRleHQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0x
OTE4LDIzICsxOTE4LDE1IEBAIGJvb2wgV2ViR0xSZW5kZXJpbmdDb250ZXh0OjpnZXRBdHRhY2hl
ZFMKICAgICBzaGFkZXJPYmplY3RzLmNsZWFyKCk7CiAgICAgaWYgKGlzQ29udGV4dExvc3QoKSB8
fCAhdmFsaWRhdGVXZWJHTE9iamVjdChwcm9ncmFtKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwot
ICAgIEdDM0RpbnQgbnVtU2hhZGVycyA9IDA7Ci0gICAgbV9jb250ZXh0LT5nZXRQcm9ncmFtaXYo
b2JqZWN0T3JaZXJvKHByb2dyYW0pLCBHcmFwaGljc0NvbnRleHQzRDo6QVRUQUNIRURfU0hBREVS
UywgJm51bVNoYWRlcnMpOwotICAgIGlmIChudW1TaGFkZXJzKSB7Ci0gICAgICAgIE93bkFycmF5
UHRyPFBsYXRmb3JtM0RPYmplY3Q+IHNoYWRlcnMgPSBhZG9wdEFycmF5UHRyKG5ldyBQbGF0Zm9y
bTNET2JqZWN0W251bVNoYWRlcnNdKTsKLSAgICAgICAgR0MzRHNpemVpIGNvdW50ID0gMDsKLSAg
ICAgICAgbV9jb250ZXh0LT5nZXRBdHRhY2hlZFNoYWRlcnMob2JqZWN0T3JaZXJvKHByb2dyYW0p
LCBudW1TaGFkZXJzLCAmY291bnQsIHNoYWRlcnMuZ2V0KCkpOwotICAgICAgICBpZiAoY291bnQg
IT0gbnVtU2hhZGVycykKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgc2hhZGVy
T2JqZWN0cy5yZXNpemUobnVtU2hhZGVycyk7Ci0gICAgICAgIGZvciAoR0MzRGludCBpaSA9IDA7
IGlpIDwgbnVtU2hhZGVyczsgKytpaSkgewotICAgICAgICAgICAgV2ViR0xTaGFkZXIqIHNoYWRl
ciA9IGZpbmRTaGFkZXIoc2hhZGVyc1tpaV0pOwotICAgICAgICAgICAgaWYgKCFzaGFkZXIpIHsK
LSAgICAgICAgICAgICAgICBzaGFkZXJPYmplY3RzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hhZGVyT2JqZWN0c1tp
aV0gPSBzaGFkZXI7Ci0gICAgICAgIH0KKworICAgIGNvbnN0IEdDM0RlbnVtIHNoYWRlclR5cGVb
XSA9IHsKKyAgICAgICAgR3JhcGhpY3NDb250ZXh0M0Q6OlZFUlRFWF9TSEFERVIsCisgICAgICAg
IEdyYXBoaWNzQ29udGV4dDNEOjpGUkFHTUVOVF9TSEFERVIKKyAgICB9OworICAgIGZvciAodW5z
aWduZWQgaSA9IDA7IGkgPCBzaXplb2Yoc2hhZGVyVHlwZSkgLyBzaXplb2YoR0MzRGVudW0pOyAr
K2kpIHsKKyAgICAgICAgV2ViR0xTaGFkZXIqIHNoYWRlciA9IHByb2dyYW0tPmdldEF0dGFjaGVk
U2hhZGVyKHNoYWRlclR5cGVbaV0pOworICAgICAgICBpZiAoc2hhZGVyKQorICAgICAgICAgICAg
c2hhZGVyT2JqZWN0cy5hcHBlbmQoc2hhZGVyKTsKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CiB9
CkBAIC0yMDI4LDQ2ICsyMDIwLDUxIEBAIFdlYkdMR2V0SW5mbyBXZWJHTFJlbmRlcmluZ0NvbnRl
eHQ6OmdldEYKICAgICBVTlVTRURfUEFSQU0oZWMpOwogICAgIGlmIChpc0NvbnRleHRMb3N0KCkg
fHwgIXZhbGlkYXRlRnJhbWVidWZmZXJGdW5jUGFyYW1ldGVycyh0YXJnZXQsIGF0dGFjaG1lbnQp
KQogICAgICAgICByZXR1cm4gV2ViR0xHZXRJbmZvKCk7Ci0gICAgc3dpdGNoIChwbmFtZSkgewot
ICAgIGNhc2UgR3JhcGhpY3NDb250ZXh0M0Q6OkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNU
X1RZUEU6Ci0gICAgY2FzZSBHcmFwaGljc0NvbnRleHQzRDo6RlJBTUVCVUZGRVJfQVRUQUNITUVO
VF9PQkpFQ1RfTkFNRToKLSAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpGUkFNRUJVRkZFUl9B
VFRBQ0hNRU5UX1RFWFRVUkVfTEVWRUw6Ci0gICAgY2FzZSBHcmFwaGljc0NvbnRleHQzRDo6RlJB
TUVCVUZGRVJfQVRUQUNITUVOVF9URVhUVVJFX0NVQkVfTUFQX0ZBQ0U6Ci0gICAgICAgIGJyZWFr
OwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIG1fY29udGV4dC0+c3ludGhlc2l6ZUdMRXJyb3IoR3Jh
cGhpY3NDb250ZXh0M0Q6OklOVkFMSURfRU5VTSk7Ci0gICAgICAgIHJldHVybiBXZWJHTEdldElu
Zm8oKTsKLSAgICB9CiAKICAgICBpZiAoIW1fZnJhbWVidWZmZXJCaW5kaW5nIHx8ICFtX2ZyYW1l
YnVmZmVyQmluZGluZy0+b2JqZWN0KCkgfHwgbV9mcmFtZWJ1ZmZlckJpbmRpbmctPmlzSW5jb21w
bGV0ZShmYWxzZSkpIHsKICAgICAgICAgbV9jb250ZXh0LT5zeW50aGVzaXplR0xFcnJvcihHcmFw
aGljc0NvbnRleHQzRDo6SU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICByZXR1cm4gV2ViR0xH
ZXRJbmZvKCk7CiAgICAgfQogCi0gICAgaWYgKHBuYW1lICE9IEdyYXBoaWNzQ29udGV4dDNEOjpG
UkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FKSB7Ci0gICAgICAgIFdlYkdMU3RhdGVS
ZXN0b3Jlcih0aGlzLCBmYWxzZSk7Ci0gICAgICAgIEdDM0RpbnQgdmFsdWUgPSAwOwotICAgICAg
ICBtX2NvbnRleHQtPmdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2KHRhcmdldCwg
YXR0YWNobWVudCwgcG5hbWUsICZ2YWx1ZSk7CisgICAgV2ViR0xPYmplY3QqIG9iamVjdCA9IG1f
ZnJhbWVidWZmZXJCaW5kaW5nLT5nZXRBdHRhY2htZW50KGF0dGFjaG1lbnQpOworICAgIGlmICgh
b2JqZWN0KSB7CiAgICAgICAgIGlmIChwbmFtZSA9PSBHcmFwaGljc0NvbnRleHQzRDo6RlJBTUVC
VUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfVFlQRSkKLSAgICAgICAgICAgIHJldHVybiBXZWJHTEdl
dEluZm8oc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50Pih2YWx1ZSkpOwotICAgICAgICByZXR1cm4g
V2ViR0xHZXRJbmZvKHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBXZWJHTEdldEluZm8oR3Jh
cGhpY3NDb250ZXh0M0Q6Ok5PTkUpOworICAgICAgICAvLyBPcGVuR0wgRVMgMi4wIHNwZWNpZmll
cyBJTlZBTElEX0VOVU0gaW4gdGhpcyBjYXNlLCB3aGlsZSBkZXNrdG9wIEdMCisgICAgICAgIC8v
IHNwZWNpZmllcyBJTlZBTElEX09QRVJBVElPTi4KKyAgICAgICAgbV9jb250ZXh0LT5zeW50aGVz
aXplR0xFcnJvcihHcmFwaGljc0NvbnRleHQzRDo6SU5WQUxJRF9FTlVNKTsKKyAgICAgICAgcmV0
dXJuIFdlYkdMR2V0SW5mbygpOwogICAgIH0KIAotICAgIFdlYkdMU3RhdGVSZXN0b3Jlcih0aGlz
LCBmYWxzZSk7Ci0gICAgR0MzRGludCB0eXBlID0gMDsKLSAgICBtX2NvbnRleHQtPmdldEZyYW1l
YnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcml2KHRhcmdldCwgYXR0YWNobWVudCwgR3JhcGhpY3ND
b250ZXh0M0Q6OkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEUsICZ0eXBlKTsKLSAg
ICBpZiAoIXR5cGUpCi0gICAgICAgIHJldHVybiBXZWJHTEdldEluZm8oKTsKLSAgICBHQzNEaW50
IHZhbHVlID0gMDsKLSAgICBtX2NvbnRleHQtPmdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFt
ZXRlcml2KHRhcmdldCwgYXR0YWNobWVudCwgR3JhcGhpY3NDb250ZXh0M0Q6OkZSQU1FQlVGRkVS
X0FUVEFDSE1FTlRfT0JKRUNUX05BTUUsICZ2YWx1ZSk7Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0g
ICAgY2FzZSBHcmFwaGljc0NvbnRleHQzRDo6UkVOREVSQlVGRkVSOgotICAgICAgICByZXR1cm4g
V2ViR0xHZXRJbmZvKFBhc3NSZWZQdHI8V2ViR0xSZW5kZXJidWZmZXI+KGZpbmRSZW5kZXJidWZm
ZXIoc3RhdGljX2Nhc3Q8UGxhdGZvcm0zRE9iamVjdD4odmFsdWUpKSkpOwotICAgIGNhc2UgR3Jh
cGhpY3NDb250ZXh0M0Q6OlRFWFRVUkU6Ci0gICAgICAgIHJldHVybiBXZWJHTEdldEluZm8oUGFz
c1JlZlB0cjxXZWJHTFRleHR1cmU+KGZpbmRUZXh0dXJlKHN0YXRpY19jYXN0PFBsYXRmb3JtM0RP
YmplY3Q+KHZhbHVlKSkpKTsKLSAgICBkZWZhdWx0OgotICAgICAgICAvLyBGSVhNRTogcmFpc2Ug
ZXhjZXB0aW9uPwotICAgICAgICByZXR1cm4gV2ViR0xHZXRJbmZvKCk7CisgICAgQVNTRVJUKG9i
amVjdC0+aXNUZXh0dXJlKCkgfHwgb2JqZWN0LT5pc1JlbmRlcmJ1ZmZlcigpKTsKKyAgICBpZiAo
b2JqZWN0LT5pc1RleHR1cmUoKSkgeworICAgICAgICBzd2l0Y2ggKHBuYW1lKSB7CisgICAgICAg
IGNhc2UgR3JhcGhpY3NDb250ZXh0M0Q6OkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZ
UEU6CisgICAgICAgICAgICByZXR1cm4gV2ViR0xHZXRJbmZvKEdyYXBoaWNzQ29udGV4dDNEOjpU
RVhUVVJFKTsKKyAgICAgICAgY2FzZSBHcmFwaGljc0NvbnRleHQzRDo6RlJBTUVCVUZGRVJfQVRU
QUNITUVOVF9PQkpFQ1RfTkFNRToKKyAgICAgICAgICAgIHJldHVybiBXZWJHTEdldEluZm8oUGFz
c1JlZlB0cjxXZWJHTFRleHR1cmU+KHJlaW50ZXJwcmV0X2Nhc3Q8V2ViR0xUZXh0dXJlKj4ob2Jq
ZWN0KSkpOworICAgICAgICBjYXNlIEdyYXBoaWNzQ29udGV4dDNEOjpGUkFNRUJVRkZFUl9BVFRB
Q0hNRU5UX1RFWFRVUkVfTEVWRUw6CisgICAgICAgIGNhc2UgR3JhcGhpY3NDb250ZXh0M0Q6OkZS
QU1FQlVGRkVSX0FUVEFDSE1FTlRfVEVYVFVSRV9DVUJFX01BUF9GQUNFOgorICAgICAgICAgICAg
eworICAgICAgICAgICAgICAgIFdlYkdMU3RhdGVSZXN0b3Jlcih0aGlzLCBmYWxzZSk7CisgICAg
ICAgICAgICAgICAgR0MzRGludCB2YWx1ZSA9IDA7CisgICAgICAgICAgICAgICAgbV9jb250ZXh0
LT5nZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXJpdih0YXJnZXQsIGF0dGFjaG1lbnQs
IHBuYW1lLCAmdmFsdWUpOworICAgICAgICAgICAgICAgIHJldHVybiBXZWJHTEdldEluZm8odmFs
dWUpOworICAgICAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbV9jb250
ZXh0LT5zeW50aGVzaXplR0xFcnJvcihHcmFwaGljc0NvbnRleHQzRDo6SU5WQUxJRF9FTlVNKTsK
KyAgICAgICAgICAgIHJldHVybiBXZWJHTEdldEluZm8oKTsKKyAgICAgICAgfQorICAgIH0gZWxz
ZSB7CisgICAgICAgIHN3aXRjaCAocG5hbWUpIHsKKyAgICAgICAgY2FzZSBHcmFwaGljc0NvbnRl
eHQzRDo6RlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfVFlQRToKKyAgICAgICAgICAgIHJl
dHVybiBXZWJHTEdldEluZm8oR3JhcGhpY3NDb250ZXh0M0Q6OlJFTkRFUkJVRkZFUik7CisgICAg
ICAgIGNhc2UgR3JhcGhpY3NDb250ZXh0M0Q6OkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNU
X05BTUU6CisgICAgICAgICAgICByZXR1cm4gV2ViR0xHZXRJbmZvKFBhc3NSZWZQdHI8V2ViR0xS
ZW5kZXJidWZmZXI+KHJlaW50ZXJwcmV0X2Nhc3Q8V2ViR0xSZW5kZXJidWZmZXIqPihvYmplY3Qp
KSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtX2NvbnRleHQtPnN5bnRoZXNpemVH
TEVycm9yKEdyYXBoaWNzQ29udGV4dDNEOjpJTlZBTElEX0VOVU0pOworICAgICAgICAgICAgcmV0
dXJuIFdlYkdMR2V0SW5mbygpOworICAgICAgICB9CiAgICAgfQogfQogCkBAIC0zOTkxLDU5ICsz
OTg4LDEwIEBAIHZvaWQgV2ViR0xSZW5kZXJpbmdDb250ZXh0OjphZGRPYmplY3QoV2UKIAogdm9p
ZCBXZWJHTFJlbmRlcmluZ0NvbnRleHQ6OmRldGFjaEFuZFJlbW92ZUFsbE9iamVjdHMoKQogewot
ICAgIEhhc2hTZXQ8UmVmUHRyPFdlYkdMT2JqZWN0PiA+OjppdGVyYXRvciBwZW5kID0gbV9jYW52
YXNPYmplY3RzLmVuZCgpOwotICAgIGZvciAoSGFzaFNldDxSZWZQdHI8V2ViR0xPYmplY3Q+ID46
Oml0ZXJhdG9yIGl0ID0gbV9jYW52YXNPYmplY3RzLmJlZ2luKCk7IGl0ICE9IHBlbmQ7ICsraXQp
CisgICAgd2hpbGUgKG1fY2FudmFzT2JqZWN0cy5zaXplKCkgPiAwKSB7CisgICAgICAgIEhhc2hT
ZXQ8V2ViR0xPYmplY3QqPjo6aXRlcmF0b3IgaXQgPSBtX2NhbnZhc09iamVjdHMuYmVnaW4oKTsK
ICAgICAgICAgKCppdCktPmRldGFjaENvbnRleHQoKTsKLQotICAgIG1fY2FudmFzT2JqZWN0cy5j
bGVhcigpOwotfQotCi1XZWJHTFRleHR1cmUqIFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6ZmluZFRl
eHR1cmUoUGxhdGZvcm0zRE9iamVjdCBvYmopCi17Ci0gICAgaWYgKCFvYmopCi0gICAgICAgIHJl
dHVybiAwOwotICAgIEhhc2hTZXQ8UmVmUHRyPFdlYkdMT2JqZWN0PiA+OjppdGVyYXRvciBwZW5k
ID0gbV9jYW52YXNPYmplY3RzLmVuZCgpOwotICAgIGZvciAoSGFzaFNldDxSZWZQdHI8V2ViR0xP
YmplY3Q+ID46Oml0ZXJhdG9yIGl0ID0gbV9jYW52YXNPYmplY3RzLmJlZ2luKCk7IGl0ICE9IHBl
bmQ7ICsraXQpIHsKLSAgICAgICAgaWYgKCgqaXQpLT5pc1RleHR1cmUoKSAmJiAoKml0KS0+b2Jq
ZWN0KCkgPT0gb2JqKQotICAgICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8V2ViR0xU
ZXh0dXJlKj4oKCppdCkuZ2V0KCkpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotV2ViR0xS
ZW5kZXJidWZmZXIqIFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6ZmluZFJlbmRlcmJ1ZmZlcihQbGF0
Zm9ybTNET2JqZWN0IG9iaikKLXsKLSAgICBpZiAoIW9iaikKLSAgICAgICAgcmV0dXJuIDA7Ci0g
ICAgSGFzaFNldDxSZWZQdHI8V2ViR0xPYmplY3Q+ID46Oml0ZXJhdG9yIHBlbmQgPSBtX2NhbnZh
c09iamVjdHMuZW5kKCk7Ci0gICAgZm9yIChIYXNoU2V0PFJlZlB0cjxXZWJHTE9iamVjdD4gPjo6
aXRlcmF0b3IgaXQgPSBtX2NhbnZhc09iamVjdHMuYmVnaW4oKTsgaXQgIT0gcGVuZDsgKytpdCkg
ewotICAgICAgICBpZiAoKCppdCktPmlzUmVuZGVyYnVmZmVyKCkgJiYgKCppdCktPm9iamVjdCgp
ID09IG9iaikKLSAgICAgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFdlYkdMUmVuZGVy
YnVmZmVyKj4oKCppdCkuZ2V0KCkpOwogICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotV2ViR0xC
dWZmZXIqIFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6ZmluZEJ1ZmZlcihQbGF0Zm9ybTNET2JqZWN0
IG9iaikKLXsKLSAgICBpZiAoIW9iaikKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgSGFzaFNldDxS
ZWZQdHI8V2ViR0xPYmplY3Q+ID46Oml0ZXJhdG9yIHBlbmQgPSBtX2NhbnZhc09iamVjdHMuZW5k
KCk7Ci0gICAgZm9yIChIYXNoU2V0PFJlZlB0cjxXZWJHTE9iamVjdD4gPjo6aXRlcmF0b3IgaXQg
PSBtX2NhbnZhc09iamVjdHMuYmVnaW4oKTsgaXQgIT0gcGVuZDsgKytpdCkgewotICAgICAgICBp
ZiAoKCppdCktPmlzQnVmZmVyKCkgJiYgKCppdCktPm9iamVjdCgpID09IG9iaikKLSAgICAgICAg
ICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFdlYkdMQnVmZmVyKj4oKCppdCkuZ2V0KCkpOwot
ICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotV2ViR0xTaGFkZXIqIFdlYkdMUmVuZGVyaW5nQ29u
dGV4dDo6ZmluZFNoYWRlcihQbGF0Zm9ybTNET2JqZWN0IG9iaikKLXsKLSAgICBpZiAoIW9iaikK
LSAgICAgICAgcmV0dXJuIDA7Ci0gICAgSGFzaFNldDxSZWZQdHI8V2ViR0xPYmplY3Q+ID46Oml0
ZXJhdG9yIHBlbmQgPSBtX2NhbnZhc09iamVjdHMuZW5kKCk7Ci0gICAgZm9yIChIYXNoU2V0PFJl
ZlB0cjxXZWJHTE9iamVjdD4gPjo6aXRlcmF0b3IgaXQgPSBtX2NhbnZhc09iamVjdHMuYmVnaW4o
KTsgaXQgIT0gcGVuZDsgKytpdCkgewotICAgICAgICBpZiAoKCppdCktPmlzU2hhZGVyKCkgJiYg
KCppdCktPm9iamVjdCgpID09IG9iaikKLSAgICAgICAgICAgIHJldHVybiByZWludGVycHJldF9j
YXN0PFdlYkdMU2hhZGVyKj4oKCppdCkuZ2V0KCkpOwotICAgIH0KLSAgICByZXR1cm4gMDsKIH0K
IAogV2ViR0xHZXRJbmZvIFdlYkdMUmVuZGVyaW5nQ29udGV4dDo6Z2V0Qm9vbGVhblBhcmFtZXRl
cihHQzNEZW51bSBwbmFtZSkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdM
UmVuZGVyaW5nQ29udGV4dC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2h0bWwvY2Fu
dmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dC5oCShyZXZpc2lvbiA4OTkzNykKKysrIFNvdXJjZS9X
ZWJDb3JlL2h0bWwvY2FudmFzL1dlYkdMUmVuZGVyaW5nQ29udGV4dC5oCSh3b3JraW5nIGNvcHkp
CkBAIC0zMDYsMTAgKzMwNiw2IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgYWRkT2JqZWN0KFdlYkdM
T2JqZWN0Kik7CiAgICAgdm9pZCBkZXRhY2hBbmRSZW1vdmVBbGxPYmplY3RzKCk7Ci0gICAgV2Vi
R0xUZXh0dXJlKiBmaW5kVGV4dHVyZShQbGF0Zm9ybTNET2JqZWN0KTsKLSAgICBXZWJHTFJlbmRl
cmJ1ZmZlciogZmluZFJlbmRlcmJ1ZmZlcihQbGF0Zm9ybTNET2JqZWN0KTsKLSAgICBXZWJHTEJ1
ZmZlciogZmluZEJ1ZmZlcihQbGF0Zm9ybTNET2JqZWN0KTsKLSAgICBXZWJHTFNoYWRlciogZmlu
ZFNoYWRlcihQbGF0Zm9ybTNET2JqZWN0KTsKIAogICAgIHZvaWQgbWFya0NvbnRleHRDaGFuZ2Vk
KCk7CiAgICAgdm9pZCBjbGVhbnVwQWZ0ZXJHcmFwaGljc0NhbGwoYm9vbCBjaGFuZ2VkKQpAQCAt
MzY0LDcgKzM2MCw3IEBAIHB1YmxpYzoKIAogICAgIGJvb2wgbV9uZWVkc1VwZGF0ZTsKICAgICBi
b29sIG1fbWFya2VkQ2FudmFzRGlydHk7Ci0gICAgSGFzaFNldDxSZWZQdHI8V2ViR0xPYmplY3Q+
ID4gbV9jYW52YXNPYmplY3RzOworICAgIEhhc2hTZXQ8V2ViR0xPYmplY3QqPiBtX2NhbnZhc09i
amVjdHM7CiAKICAgICAvLyBMaXN0IG9mIGJvdW5kIFZCTydzLiBVc2VkIHRvIG1haW50YWluIGlu
Zm8gYWJvdXQgc2l6ZXMgZm9yIEFSUkFZX0JVRkZFUiBhbmQgc3RvcmVkIHZhbHVlcyBmb3IgRUxF
TUVOVF9BUlJBWV9CVUZGRVIKICAgICBSZWZQdHI8V2ViR0xCdWZmZXI+IG1fYm91bmRBcnJheUJ1
ZmZlcjsKSW5kZXg6IExheW91dFRlc3RzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRU
ZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9uIDkwMTI3KQorKysgTGF5b3V0VGVzdHMvQ2hhbmdlTG9n
CSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTYgQEAKKzIwMTEtMDYtMzAgIFpoZW55YW8gTW8g
IDx6bW9AZ29vZ2xlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4K
KworICAgICAgICBJbXByb3ZlIFdlYkdMIG9iamVjdCBsaWZldGltZSBtYW5hZ2VtZW50IGluIFdl
YkdMUmVuZGVyaW5nQ29udGV4dAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9NjM2MzUKKworICAgICAgICAqIGZhc3QvY2FudmFzL3dlYmdsL2dsLW9iamVj
dC1nZXQtY2FsbHMtZXhwZWN0ZWQudHh0OgorICAgICAgICAqIGZhc3QvY2FudmFzL3dlYmdsL2ds
LW9iamVjdC1nZXQtY2FsbHMuaHRtbDogRml4IGEgYnVnIHNvIGdldEZyYW1lYnVmZmVyQXRhdGNo
bWVudFBhcmFtZXRlciBnZW5lcmF0ZXMgYW4gZXJyb3IgaWYgbm90aGluZyBpcyBhdHRhY2hlZCBh
bmQgc29tZXRoaW5nIG90aGVyIHRoYW4gVFlQRSBpcyBxdWVyaWVkLgorICAgICAgICAqIGZhc3Qv
Y2FudmFzL3dlYmdsL29iamVjdC1kZWxldGlvbi1iZWhhdmlvdXItZXhwZWN0ZWQudHh0OgorICAg
ICAgICAqIGZhc3QvY2FudmFzL3dlYmdsL29iamVjdC1kZWxldGlvbi1iZWhhdmlvdXIuaHRtbDog
RGl0dG8uCisgICAgICAgICogZmFzdC9jYW52YXMvd2ViZ2wvcHJvZ3JhbS10ZXN0Lmh0bWw6IEZp
eCB0aGUgdGVzdCBzbyB0aGUgb3JkZXIgb2Ygc2hhZGVycyByZXR1cm5lZCBieSBnZXRBdHRhY2hl
ZFNoYWRlcnMgZG9lc24ndCBtYXR0ZXIuCisKIDIwMTEtMDYtMzAgIFpzb2x0IEZlaMOpciAgPGg0
OTAyNjdAc3R1ZC51LXN6ZWdlZC5odT4KIAogICAgICAgICBSZXZpZXdlZCBieSBDc2FiYSBPc3p0
cm9nb27DoWMuCkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9nbC1vYmplY3Qt
Z2V0LWNhbGxzLWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9mYXN0L2Nh
bnZhcy93ZWJnbC9nbC1vYmplY3QtZ2V0LWNhbGxzLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gODk5
NTYpCisrKyBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9nbC1vYmplY3QtZ2V0LWNhbGxz
LWV4cGVjdGVkLnR4dAkod29ya2luZyBjb3B5KQpAQCAtODIsOCArODIsOCBAQCBQQVNTIGdsLmdl
dFZlcnRleEF0dHJpYk9mZnNldCgxLCBnbC5WRVJUCiBQQVNTIGdsLmdldFZlcnRleEF0dHJpYigx
LCBnbC5WRVJURVhfQVRUUklCX0FSUkFZX0VOQUJMRUQpIGlzIGZhbHNlCiBQQVNTIGdsLmdldFZl
cnRleEF0dHJpYigxLCBnbC5DVVJSRU5UX1ZFUlRFWF9BVFRSSUIpIGlzIFs1LCA2LCA3LCA4XQog
UEFTUyBnZXRFcnJvciB3YXMgZXhwZWN0ZWQgdmFsdWU6IE5PX0VSUk9SIDogCi1QQVNTIGdsLmdl
dEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcihnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1Jf
QVRUQUNITUVOVDAsIGdsLkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUUpIGlzIG51
bGwKLVBBU1MgZ2wuZ2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyKGdsLkZSQU1FQlVG
RkVSLCBnbC5ERVBUSF9BVFRBQ0hNRU5ULCBnbC5GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVD
VF9OQU1FKSBpcyBudWxsCitQQVNTIGdsLmdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRl
cihnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLkZSQU1FQlVGRkVSX0FU
VEFDSE1FTlRfT0JKRUNUX1RZUEUpIGlzIGdsLk5PTkUKK1BBU1MgZ2wuZ2V0RnJhbWVidWZmZXJB
dHRhY2htZW50UGFyYW1ldGVyKGdsLkZSQU1FQlVGRkVSLCBnbC5ERVBUSF9BVFRBQ0hNRU5ULCBn
bC5GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFKSBpcyBnbC5OT05FCiBQQVNTIGds
LmdldFZlcnRleEF0dHJpYigxLCBnbC5WRVJURVhfQVRUUklCX0FSUkFZX0JVRkZFUl9CSU5ESU5H
KSBpcyBudWxsCiBQQVNTIGdldEVycm9yIHdhcyBleHBlY3RlZCB2YWx1ZTogTk9fRVJST1IgOiAK
IFBBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKSW5kZXg6IExheW91dFRlc3RzL2Zhc3Qv
Y2FudmFzL3dlYmdsL2dsLW9iamVjdC1nZXQtY2FsbHMuaHRtbAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlv
dXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9nbC1vYmplY3QtZ2V0LWNhbGxzLmh0bWwJKHJldmlz
aW9uIDg5OTU2KQorKysgTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvZ2wtb2JqZWN0LWdl
dC1jYWxscy5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNyBAQAorPCFET0NUWVBFIGh0
bWw+CiA8aHRtbD4KIDxoZWFkPgorPG1ldGEgY2hhcnNldD0idXRmLTgiPgogPGxpbmsgcmVsPSJz
dHlsZXNoZWV0IiBocmVmPSIuLi8uLi9qcy9yZXNvdXJjZXMvanMtdGVzdC1zdHlsZS5jc3MiLz4K
IDxzY3JpcHQgc3JjPSIuLi8uLi9qcy9yZXNvdXJjZXMvanMtdGVzdC1wcmUuanMiPjwvc2NyaXB0
PgogPHNjcmlwdCBzcmM9InJlc291cmNlcy93ZWJnbC10ZXN0LmpzIj48L3NjcmlwdD4KQEAgLTIz
NSw5ICsyMzcsOSBAQCBnbEVycm9yU2hvdWxkQmUoZ2wsIGdsLk5PX0VSUk9SKTsKIAogLy8gVGVz
dCBjYXNlcyB3aGVyZSBuYW1lID09IDAKIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZSk7Ci1zaG91
bGRCZU51bGwoJ2dsLmdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcihnbC5GUkFNRUJV
RkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JK
RUNUX05BTUUpJyk7CitzaG91bGRCZSgnZ2wuZ2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1l
dGVyKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuRlJBTUVCVUZGRVJf
QVRUQUNITUVOVF9PQkpFQ1RfVFlQRSknLCAnZ2wuTk9ORScpOwogZ2wuZGVsZXRlUmVuZGVyYnVm
ZmVyKHJlbmRlcmJ1ZmZlcik7Ci1zaG91bGRCZU51bGwoJ2dsLmdldEZyYW1lYnVmZmVyQXR0YWNo
bWVudFBhcmFtZXRlcihnbC5GUkFNRUJVRkZFUiwgZ2wuREVQVEhfQVRUQUNITUVOVCwgZ2wuRlJB
TUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRSknKTsKK3Nob3VsZEJlKCdnbC5nZXRGcmFt
ZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXIoZ2wuRlJBTUVCVUZGRVIsIGdsLkRFUFRIX0FUVEFD
SE1FTlQsIGdsLkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEUpJywgJ2dsLk5PTkUn
KTsKIGdsLmRlbGV0ZUJ1ZmZlcihidWZmZXIpOwogc2hvdWxkQmVOdWxsKCdnbC5nZXRWZXJ0ZXhB
dHRyaWIoMSwgZ2wuVkVSVEVYX0FUVFJJQl9BUlJBWV9CVUZGRVJfQklORElORyknKTsKIGdsRXJy
b3JTaG91bGRCZShnbCwgZ2wuTk9fRVJST1IpOwpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC9jYW52
YXMvd2ViZ2wvb2JqZWN0LWRlbGV0aW9uLWJlaGF2aW91ci1leHBlY3RlZC50eHQKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvb2JqZWN0LWRlbGV0aW9uLWJlaGF2
aW91ci1leHBlY3RlZC50eHQJKHJldmlzaW9uIDg5OTU2KQorKysgTGF5b3V0VGVzdHMvZmFzdC9j
YW52YXMvd2ViZ2wvb2JqZWN0LWRlbGV0aW9uLWJlaGF2aW91ci1leHBlY3RlZC50eHQJKHdvcmtp
bmcgY29weSkKQEAgLTMzLDcgKzMzLDggQEAgUEFTUyBnbC5nZXRQYXJhbWV0ZXIoZ2wuVEVYVFVS
RV9CSU5ESU5HXwogUEFTUyBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChnbC5GUkFNRUJVRkZFUiwg
Z2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIHRleCwgMCkgd2FzIGV4cGVjdGVk
IHZhbHVlOiBOT19FUlJPUi4KIFBBU1MgZ2wuZ2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1l
dGVyKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuRlJBTUVCVUZGRVJf
QVRUQUNITUVOVF9PQkpFQ1RfTkFNRSkgaXMgdGV4CiBQQVNTIGdsLmRlbGV0ZVRleHR1cmUodGV4
KSB3YXMgZXhwZWN0ZWQgdmFsdWU6IE5PX0VSUk9SLgotUEFTUyBnbC5nZXRGcmFtZWJ1ZmZlckF0
dGFjaG1lbnRQYXJhbWV0ZXIoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBn
bC5GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FKSBpcyBudWxsCitQQVNTIGdsLmdl
dEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcihnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1Jf
QVRUQUNITUVOVDAsIGdsLkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZUEUpIGlzIGds
Lk5PTkUKK1BBU1MgZ2wuZ2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyKGdsLkZSQU1F
QlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9P
QkpFQ1RfTkFNRSkgd2FzIGV4cGVjdGVkIHZhbHVlOiBJTlZBTElEX0VOVU0uCiBQQVNTIGdsLmlz
VGV4dHVyZSh0ZXgpIGlzIGZhbHNlCiBQQVNTIGdsLmdldFBhcmFtZXRlcihnbC5URVhUVVJFX0JJ
TkRJTkdfMkQpIGlzIG51bGwKIFBBU1MgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4
KSB3YXMgZXhwZWN0ZWQgdmFsdWU6IE5PX0VSUk9SLgpAQCAtNTIsNyArNTMsOCBAQCBQQVNTIGds
LmdldFBhcmFtZXRlcihnbC5SRU5ERVJCVUZGRVJfQklOCiBQQVNTIGdsLmZyYW1lYnVmZmVyUmVu
ZGVyYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuUkVOREVS
QlVGRkVSLCByYm8pIHdhcyBleHBlY3RlZCB2YWx1ZTogTk9fRVJST1IuCiBQQVNTIGdsLmdldEZy
YW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcihnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRU
QUNITUVOVDAsIGdsLkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUUpIGlzIHJibwog
UEFTUyBnbC5kZWxldGVSZW5kZXJidWZmZXIocmJvKSB3YXMgZXhwZWN0ZWQgdmFsdWU6IE5PX0VS
Uk9SLgotUEFTUyBnbC5nZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXIoZ2wuRlJBTUVC
VUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09C
SkVDVF9OQU1FKSBpcyBudWxsCitQQVNTIGdsLmdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFt
ZXRlcihnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLkZSQU1FQlVGRkVS
X0FUVEFDSE1FTlRfT0JKRUNUX1RZUEUpIGlzIGdsLk5PTkUKK1BBU1MgZ2wuZ2V0RnJhbWVidWZm
ZXJBdHRhY2htZW50UGFyYW1ldGVyKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5U
MCwgZ2wuRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1RfTkFNRSkgd2FzIGV4cGVjdGVkIHZh
bHVlOiBJTlZBTElEX0VOVU0uCiBQQVNTIGdsLmlzUmVuZGVyYnVmZmVyKHJibykgaXMgZmFsc2UK
IFBBU1MgZ2wuZ2V0UGFyYW1ldGVyKGdsLlJFTkRFUkJVRkZFUl9CSU5ESU5HKSBpcyBudWxsCiBQ
QVNTIGdsLmJpbmRSZW5kZXJidWZmZXIoZ2wuUkVOREVSQlVGRkVSLCByYm8pIHdhcyBleHBlY3Rl
ZCB2YWx1ZTogTk9fRVJST1IuCkluZGV4OiBMYXlvdXRUZXN0cy9mYXN0L2NhbnZhcy93ZWJnbC9v
YmplY3QtZGVsZXRpb24tYmVoYXZpb3VyLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMv
ZmFzdC9jYW52YXMvd2ViZ2wvb2JqZWN0LWRlbGV0aW9uLWJlaGF2aW91ci5odG1sCShyZXZpc2lv
biA4OTk1NikKKysrIExheW91dFRlc3RzL2Zhc3QvY2FudmFzL3dlYmdsL29iamVjdC1kZWxldGlv
bi1iZWhhdmlvdXIuaHRtbAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDcgQEAKKzwhRE9DVFlQ
RSBodG1sPgogPGh0bWw+CiA8aGVhZD4KKzxtZXRhIGNoYXJzZXQ9InV0Zi04Ij4KIDxsaW5rIHJl
bD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vanMvcmVzb3VyY2VzL2pzLXRlc3Qtc3R5bGUuY3Nz
Ii8+CiA8c2NyaXB0IHNyYz0iLi4vLi4vanMvcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3Nj
cmlwdD4KIDxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvd2ViZ2wtdGVzdC5qcyI+PC9zY3JpcHQ+CkBA
IC01OSw3ICs2MSw4IEBAIHNob3VsZEJlKCJnbC5nZXRGcmFtZWJ1ZmZlckF0dGFjaG1lbnRQYXIK
IHNob3VsZEdlbmVyYXRlR0xFcnJvcihnbCwgZ2wuTk9fRVJST1IsICJnbC5kZWxldGVUZXh0dXJl
KHRleCkiKTsKIC8vIERlbGV0aW5nIGEgdGV4dHVyZSBib3VuZCB0byB0aGUgY3VycmVudGx5LWJv
dW5kIGZibyBpcyB0aGUgc2FtZSBhcwogLy8gZGV0YWNoaW5nIHRoZSB0ZXh0dWUgZnJvbSBmYm8g
Zmlyc3QsIHRoZW4gZGVsZXRlIHRoZSB0ZXh0dXJlLgotc2hvdWxkQmVOdWxsKCJnbC5nZXRGcmFt
ZWJ1ZmZlckF0dGFjaG1lbnRQYXJhbWV0ZXIoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFD
SE1FTlQwLCBnbC5GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9OQU1FKSIpOworc2hvdWxk
QmUoImdsLmdldEZyYW1lYnVmZmVyQXR0YWNobWVudFBhcmFtZXRlcihnbC5GUkFNRUJVRkZFUiwg
Z2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX1RZ
UEUpIiwgImdsLk5PTkUiKTsKK3Nob3VsZEdlbmVyYXRlR0xFcnJvcihnbCwgZ2wuSU5WQUxJRF9F
TlVNLCAiZ2wuZ2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1ldGVyKGdsLkZSQU1FQlVGRkVS
LCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuRlJBTUVCVUZGRVJfQVRUQUNITUVOVF9PQkpFQ1Rf
TkFNRSkiKTsKIHNob3VsZEJlRmFsc2UoImdsLmlzVGV4dHVyZSh0ZXgpIik7CiBzaG91bGRCZU51
bGwoImdsLmdldFBhcmFtZXRlcihnbC5URVhUVVJFX0JJTkRJTkdfMkQpIik7CiBzaG91bGRHZW5l
cmF0ZUdMRXJyb3IoZ2wsIGdsLk5PX0VSUk9SLCAiZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8y
RCwgdGV4KSIpOwpAQCAtODUsNyArODgsOCBAQCBzaG91bGRCZSgiZ2wuZ2V0RnJhbWVidWZmZXJB
dHRhY2htZW50UGFyCiBzaG91bGRHZW5lcmF0ZUdMRXJyb3IoZ2wsIGdsLk5PX0VSUk9SLCAiZ2wu
ZGVsZXRlUmVuZGVyYnVmZmVyKHJibykiKTsKIC8vIERlbGV0aW5nIGEgcmVuZGVyYnVmZmVyIGJv
dW5kIHRvIHRoZSBjdXJyZW50bHktYm91bmQgZmJvIGlzIHRoZSBzYW1lIGFzCiAvLyBkZXRhY2hp
bmcgdGhlIHJlbmRlcmJ1ZmZlciBmcm9tIGZibyBmaXJzdCwgdGhlbiBkZWxldGUgdGhlIHJlbmRl
cmJ1ZmZlci4KLXNob3VsZEJlTnVsbCgiZ2wuZ2V0RnJhbWVidWZmZXJBdHRhY2htZW50UGFyYW1l
dGVyKGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuRlJBTUVCVUZGRVJf
QVRUQUNITUVOVF9PQkpFQ1RfTkFNRSkiKTsKK3Nob3VsZEJlKCJnbC5nZXRGcmFtZWJ1ZmZlckF0
dGFjaG1lbnRQYXJhbWV0ZXIoZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBn
bC5GUkFNRUJVRkZFUl9BVFRBQ0hNRU5UX09CSkVDVF9UWVBFKSIsICJnbC5OT05FIik7CitzaG91
bGRHZW5lcmF0ZUdMRXJyb3IoZ2wsIGdsLklOVkFMSURfRU5VTSwgImdsLmdldEZyYW1lYnVmZmVy
QXR0YWNobWVudFBhcmFtZXRlcihnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAs
IGdsLkZSQU1FQlVGRkVSX0FUVEFDSE1FTlRfT0JKRUNUX05BTUUpIik7CiBzaG91bGRCZUZhbHNl
KCJnbC5pc1JlbmRlcmJ1ZmZlcihyYm8pIik7CiBzaG91bGRCZU51bGwoImdsLmdldFBhcmFtZXRl
cihnbC5SRU5ERVJCVUZGRVJfQklORElORykiKTsKIHNob3VsZEdlbmVyYXRlR0xFcnJvcihnbCwg
Z2wuTk9fRVJST1IsICJnbC5iaW5kUmVuZGVyYnVmZmVyKGdsLlJFTkRFUkJVRkZFUiwgcmJvKSIp
OwpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvcHJvZ3JhbS10ZXN0Lmh0bWwK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wvcHJvZ3JhbS10ZXN0
Lmh0bWwJKHJldmlzaW9uIDg5OTU2KQorKysgTGF5b3V0VGVzdHMvZmFzdC9jYW52YXMvd2ViZ2wv
cHJvZ3JhbS10ZXN0Lmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTEsOCArMSw3IEBACi08IURPQ1RZ
UEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgot
ICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKzwhRE9DVFlQRSBodG1s
PgogPGh0bWw+CiA8aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVu
dD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ii8+Cis8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CiA8
dGl0bGU+V2ViR0wgUHJvZ3JhbSBDb21waWxpbmcvTGlua2luZyBDb25mb3JtYW5jZSBUZXN0PC90
aXRsZT4KIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vanMvcmVzb3VyY2VzL2pz
LXRlc3Qtc3R5bGUuY3NzIi8+CiA8c2NyaXB0IHNyYz0iLi4vLi4vanMvcmVzb3VyY2VzL2pzLXRl
c3QtcHJlLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgpAQCAtMzAsNiArMjks
MzIgQEAgZnVuY3Rpb24gZ28oKSB7CiAgICAgZ2wuY2xlYXJDb2xvcigwLjAsIDAuMCwgMC4wLCAw
LjApOwogICAgIGdsLmNsZWFyKGdsLkNPTE9SX0JVRkZFUl9CSVQgfCBnbC5ERVBUSF9CVUZGRVJf
QklUKTsKIAorICAgIGZ1bmN0aW9uIGRvQXJyYXlzSGF2ZVNhbWVDb250ZW50cyhhLCBiKSB7Cisg
ICAgICAgIHZhciBmbGFncyA9IFtdOworICAgICAgICBmdW5jdGlvbiBoYXNVbnVzZWRWYWx1ZShh
LCB2YWx1ZSkgeworICAgICAgICAgICAgZm9yICh2YXIgaWkgPSAwOyBpaSA8IGEubGVuZ3RoOyAr
K2lpKSB7CisgICAgICAgICAgICAgICAgaWYgKGFbaWldID09PSB2YWx1ZSAmJiAhZmxhZ3NbaWld
KSB7CisgICAgICAgICAgICAgICAgICAgIGZsYWdzW2lpXSA9IHRydWU7CisgICAgICAgICAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAg
ICAgICAgICBpZiAoYS5sZW5ndGggIT09IGIubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yICh2YXIgaWkgPSAwOyBp
aSA8IGEubGVuZ3RoOyBpaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKCFoYXNVbnVzZWRWYWx1
ZShiLCBhW2lpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9CiAKIC8vLy8vLy8gQ2hlY2sgY29tcGlsZVNoYWRlcigpIC8vLy8vLy8vLy8vLy8vLy8vLy8v
Ly8vLy8vLy8vCiAKQEAgLTU1LDE0ICs4MCwxNCBAQCBmdW5jdGlvbiBnbygpIHsKICAgICAgICAg
ICAgICAgImJhZCB2ZXJ0ZXggc2hhZGVyIHNob3VsZCBmYWlsIHRvIGNvbXBpbGUiKTsKIAogICAg
IHZhciBmcyA9IGdsLmNyZWF0ZVNoYWRlcihnbC5GUkFHTUVOVF9TSEFERVIpOwotICAgIGdsLnNo
YWRlclNvdXJjZShmcywgIiNpZmRlZiBHTF9FU1xucHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XG4j
ZW5kaWZcbiB2YXJ5aW5nIHZlYzQgdkNvbG9yOyB2b2lkIG1haW4oKSB7IGdsX0ZyYWdDb2xvciA9
IHZDb2xvcjsgfSIpOworICAgIGdsLnNoYWRlclNvdXJjZShmcywgInByZWNpc2lvbiBtZWRpdW1w
IGZsb2F0OyB2YXJ5aW5nIHZlYzQgdkNvbG9yOyB2b2lkIG1haW4oKSB7IGdsX0ZyYWdDb2xvciA9
IHZDb2xvcjsgfSIpOwogICAgIGdsLmNvbXBpbGVTaGFkZXIoZnMpOwogCiAgICAgYXNzZXJ0TXNn
KGdsLmdldFNoYWRlclBhcmFtZXRlcihmcywgZ2wuQ09NUElMRV9TVEFUVVMpID09IHRydWUsCiAg
ICAgICAgICAgICAgICJnb29kIGZyYWdtZW50IHNoYWRlciBzaG91bGQgY29tcGlsZSIpOwogCiAg
ICAgdmFyIGZzMiA9IGdsLmNyZWF0ZVNoYWRlcihnbC5GUkFHTUVOVF9TSEFERVIpOwotICAgIGds
LnNoYWRlclNvdXJjZShmczIsICIjaWZkZWYgR0xfRVNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0
O1xuI2VuZGlmXG4gdmFyeWluZyB2ZWM0IHZDb2xvcjsgdm9pZCBtYWluKCkgeyBnbF9GcmFnQ29s
b3IgPSB2Q29sb3IgKiAwLjU7IH0iKTsKKyAgICBnbC5zaGFkZXJTb3VyY2UoZnMyLCAicHJlY2lz
aW9uIG1lZGl1bXAgZmxvYXQ7IHZhcnlpbmcgdmVjNCB2Q29sb3I7IHZvaWQgbWFpbigpIHsgZ2xf
RnJhZ0NvbG9yID0gdkNvbG9yICogMC41OyB9Iik7CiAgICAgZ2wuY29tcGlsZVNoYWRlcihmczIp
OwogCiAgICAgYXNzZXJ0TXNnKGdsLmdldFNoYWRlclBhcmFtZXRlcihmczIsIGdsLkNPTVBJTEVf
U1RBVFVTKSA9PSB0cnVlLApAQCAtMTMxLDcgKzE1Niw3IEBAIGZ1bmN0aW9uIGdvKCkgewogICAg
ICAgICAgICAgZ2wuZGV0YWNoU2hhZGVyKHByb2csIHNoYWRlcnNfdG9fZGV0YWNoW2ldKTsKICAg
ICAgICAgaWYoZ2wuZ2V0RXJyb3IoKSAhPSBnbC5OT19FUlJPUikKICAgICAgICAgICAgIGFzc2Vy
dE1zZyhmYWxzZSwgInVuZXhwZWN0ZWQgZXJyb3IgaW4gZGV0YWNoU2hhZGVyKCkiKTsKLSAgICAg
ICAgYXNzZXJ0TXNnKGFyZUFycmF5c0VxdWFsKGdsLmdldEF0dGFjaGVkU2hhZGVycyhwcm9nKSwg
ZXhwZWN0ZWRfc2hhZGVycyksIGVycm1zZyk7CisgICAgICAgIGFzc2VydE1zZyhkb0FycmF5c0hh
dmVTYW1lQ29udGVudHMoZ2wuZ2V0QXR0YWNoZWRTaGFkZXJzKHByb2cpLCBleHBlY3RlZF9zaGFk
ZXJzKSwgZXJybXNnKTsKICAgICB9CiAgICAgY2hlY2tHZXRBdHRhY2hlZFNoYWRlcnMoW10sIFtd
LCBbXSwgImdldEF0dGFjaGVkU2hhZGVycyBzaG91bGQgcmV0dXJuIGFuIGVtcHR5IGxpc3QgYnkg
ZGVmYXVsdCIpOwogICAgIGNoZWNrR2V0QXR0YWNoZWRTaGFkZXJzKFtmc10sIFtdLCBbZnNdLCAi
YXR0YWNoaW5nIGEgc2luZ2xlIHNoYWRlciBzaG91bGQgZ2l2ZSB0aGUgZXhwZWN0ZWQgbGlzdCIp
OwpAQCAtMjQyLDcgKzI2Nyw3IEBAIGZ1bmN0aW9uIGdvKCkgewogICAgIGdsRXJyb3JTaG91bGRC
ZShnbCwgZ2wuTk9fRVJST1IsICJUaGUgY3VycmVudCBwcm9ncmFtIHNob3VsZG4ndCBiZSBkZWxl
dGVkIik7CiAKICAgICB2YXIgZnMzID0gZ2wuY3JlYXRlU2hhZGVyKGdsLkZSQUdNRU5UX1NIQURF
Uik7Ci0gICAgZ2wuc2hhZGVyU291cmNlKGZzMywgIiNpZmRlZiBHTF9FU1xucHJlY2lzaW9uIG1l
ZGl1bXAgZmxvYXQ7XG4jZW5kaWZcbiB2YXJ5aW5nIHZlYzQgdkNvbG9yOyB2b2lkIG1haW4oKSB7
IGdsX0ZyYWdDb2xvciA9IHZDb2xvcjsgfSIpOworICAgIGdsLnNoYWRlclNvdXJjZShmczMsICJw
cmVjaXNpb24gbWVkaXVtcCBmbG9hdDsgdmFyeWluZyB2ZWM0IHZDb2xvcjsgdm9pZCBtYWluKCkg
eyBnbF9GcmFnQ29sb3IgPSB2Q29sb3I7IH0iKTsKICAgICBnbC5jb21waWxlU2hhZGVyKGZzMyk7
CiAKICAgICBhc3NlcnRNc2coZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKGZzMywgZ2wuQ09NUElMRV9T
VEFUVVMpID09IHRydWUsCkBAIC0yNTMsNyArMjc4LDcgQEAgZnVuY3Rpb24gZ28oKSB7CiAgICAg
Z2xFcnJvclNob3VsZEJlKGdsLCBnbC5JTlZBTElEX1ZBTFVFLCAiYW4gdW5hdHRhY2hlZCBzaGFk
ZXIgc2hvdWxkIGJlIGRlbGV0ZWQgaW1tZWRpYXRlbHkiKTsKIAogICAgIGZzMyA9IGdsLmNyZWF0
ZVNoYWRlcihnbC5GUkFHTUVOVF9TSEFERVIpOwotICAgIGdsLnNoYWRlclNvdXJjZShmczMsICIj
aWZkZWYgR0xfRVNcbnByZWNpc2lvbiBtZWRpdW1wIGZsb2F0O1xuI2VuZGlmXG4gdmFyeWluZyB2
ZWM0IHZDb2xvcjsgdm9pZCBtYWluKCkgeyBnbF9GcmFnQ29sb3IgPSB2Q29sb3I7IH0iKTsKKyAg
ICBnbC5zaGFkZXJTb3VyY2UoZnMzLCAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7IHZhcnlpbmcg
dmVjNCB2Q29sb3I7IHZvaWQgbWFpbigpIHsgZ2xfRnJhZ0NvbG9yID0gdkNvbG9yOyB9Iik7CiAg
ICAgZ2wuY29tcGlsZVNoYWRlcihmczMpOwogCiAgICAgYXNzZXJ0TXNnKGdsLmdldFNoYWRlclBh
cmFtZXRlcihmczMsIGdsLkNPTVBJTEVfU1RBVFVTKSA9PSB0cnVlLAo=
</data>
<flag name="review"
          id="93841"
          type_id="1"
          status="+"
          setter="kbr"
    />
          </attachment>
      

    </bug>

</bugzilla>