<?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>24951</bug_id>
          
          <creation_ts>2009-03-30 16:27:20 -0700</creation_ts>
          <short_desc>Upstream V8DOMMap for v8 bindings.</short_desc>
          <delta_ts>2009-03-31 12:59:45 -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>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Jian Li">jianli</reporter>
          <assigned_to name="Dmitry Titov">dimich</assigned_to>
          <cc>dglazkov</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>115929</commentid>
    <comment_count>0</comment_count>
    <who name="Jian Li">jianli</who>
    <bug_when>2009-03-30 16:27:20 -0700</bug_when>
    <thetext>Upstream V8DOMMap for v8 bindings.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115931</commentid>
    <comment_count>1</comment_count>
      <attachid>29096</attachid>
    <who name="Jian Li">jianli</who>
    <bug_when>2009-03-30 16:31:31 -0700</bug_when>
    <thetext>Created attachment 29096
Proposed Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>116042</commentid>
    <comment_count>2</comment_count>
      <attachid>29096</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-03-31 10:57:49 -0700</bug_when>
    <thetext>Comment on attachment 29096
Proposed Patch

&gt; +++ b/WebCore/ChangeLog
...
&gt; +        * bindings/v8/V8DOMMap.cpp: Added.
&gt; +        (WebCore::domThreadMap):
&gt; +        (WebCore::domThreadMapMutex):
&gt; +        (WebCore::ThreadSpecificDOMData::):
&gt; +        (WebCore::ThreadSpecificDOMData::InternalDOMWrapperMap::InternalDOMWrapperMap):

nit: when adding a new file to the repository, please delete these lines
that prepare-ChangeLog adds for each added method.


&gt; +++ b/WebCore/bindings/v8/V8DOMMap.cpp

&gt; +// DOM binding algorithm:
&gt; +//
&gt; +// There are two kinds of DOM objects:
&gt; +// 1. DOM tree nodes, such as Document, HTMLElement, ...
&gt; +//    there classes implements TreeShared&lt;T&gt; interface;

nit: perhaps this would be better written as: &quot;these classes implement the TreeShared&lt;T&gt; interface&quot; ?


&gt; +//   Handles from DOM objects to JS wrappers are always weak,
&gt; +// so JS wrappers of non-node object cannot create a cycle.

nit: I think this comment is referring to Peerable, which no longer exists.  It might
be good to check with the V8 guys.


&gt; +// This encapsulates thread-specific DOM data for the main thread. All the maps in it are static.
&gt; +// This is because we are unable to rely on WTF::ThreadSpecificThreadExit to do the cleanup since the place that tears down the main thread can not call any WTF functions.

nit: it might be nice to add a line break to the second line of the comment so that each line of
the comment block is approx the same width.


otherwise LGTM</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>116055</commentid>
    <comment_count>3</comment_count>
      <attachid>29130</attachid>
    <who name="Jian Li">jianli</who>
    <bug_when>2009-03-31 12:43:26 -0700</bug_when>
    <thetext>Created attachment 29130
Proposed Patch

Here is the new patch that fixed all Darin&apos;s comment. Please use this to land.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>116059</commentid>
    <comment_count>4</comment_count>
    <who name="Dmitry Titov">dimich</who>
    <bug_when>2009-03-31 12:59:45 -0700</bug_when>
    <thetext>Landed: http://trac.webkit.org/changeset/42135</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>29096</attachid>
            <date>2009-03-30 16:31:31 -0700</date>
            <delta_ts>2009-03-31 12:43:26 -0700</delta_ts>
            <desc>Proposed Patch</desc>
            <filename>24951</filename>
            <type>text/plain</type>
            <size>29134</size>
            <attacher name="Jian Li">jianli</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MTI0M2VhZS4uNTE0MDFiOSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw1MiBAQAorMjAwOS0wMy0zMCAgSmlhbiBMaSAgPGpp
YW5saUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgVXBzdHJlYW0gVjhET01NYXAgZm9yIHY4IGJpbmRpbmdzLgorICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjQ5NTEKKworICAgICAgICAq
IGJpbmRpbmdzL3Y4L1Y4RE9NTWFwLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpkb21U
aHJlYWRNYXApOgorICAgICAgICAoV2ViQ29yZTo6ZG9tVGhyZWFkTWFwTXV0ZXgpOgorICAgICAg
ICAoV2ViQ29yZTo6VGhyZWFkU3BlY2lmaWNET01EYXRhOjopOgorICAgICAgICAoV2ViQ29yZTo6
VGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA6OkludGVybmFsRE9N
V3JhcHBlck1hcCk6CisgICAgICAgIChXZWJDb3JlOjpUaHJlYWRTcGVjaWZpY0RPTURhdGE6Oklu
dGVybmFsRE9NV3JhcHBlck1hcDo6Zm9yZ2V0T25seSk6CisgICAgICAgIChXZWJDb3JlOjpUaHJl
YWRTcGVjaWZpY0RPTURhdGE6OlRocmVhZFNwZWNpZmljRE9NRGF0YSk6CisgICAgICAgIChXZWJD
b3JlOjpUaHJlYWRTcGVjaWZpY0RPTURhdGE6On5UaHJlYWRTcGVjaWZpY0RPTURhdGEpOgorICAg
ICAgICAoV2ViQ29yZTo6VGhyZWFkU3BlY2lmaWNET01EYXRhOjpnZXRET01XcmFwcGVyTWFwKToK
KyAgICAgICAgKFdlYkNvcmU6OlRocmVhZFNwZWNpZmljRE9NRGF0YTo6ZG9tTm9kZU1hcCk6Cisg
ICAgICAgIChXZWJDb3JlOjpUaHJlYWRTcGVjaWZpY0RPTURhdGE6OmRvbU9iamVjdE1hcCk6Cisg
ICAgICAgIChXZWJDb3JlOjpUaHJlYWRTcGVjaWZpY0RPTURhdGE6OmFjdGl2ZURvbU9iamVjdE1h
cCk6CisgICAgICAgIChXZWJDb3JlOjpUaHJlYWRTcGVjaWZpY0RPTURhdGE6OmRvbVN2Z0VsZW1l
bnRJbnN0YW5jZU1hcCk6CisgICAgICAgIChXZWJDb3JlOjpUaHJlYWRTcGVjaWZpY0RPTURhdGE6
OmRvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwKToKKyAgICAgICAgKFdlYkNvcmU6OlRocmVhZFNw
ZWNpZmljRE9NRGF0YTo6ZGVsYXllZE9iamVjdE1hcCk6CisgICAgICAgIChXZWJDb3JlOjpUaHJl
YWRTcGVjaWZpY0RPTURhdGE6OmRlbGF5ZWRQcm9jZXNzaW5nU2NoZWR1bGVkKToKKyAgICAgICAg
KFdlYkNvcmU6OlRocmVhZFNwZWNpZmljRE9NRGF0YTo6c2V0RGVsYXllZFByb2Nlc3NpbmdTY2hl
ZHVsZWQpOgorICAgICAgICAoV2ViQ29yZTo6VGhyZWFkU3BlY2lmaWNET01EYXRhOjppc01haW5U
aHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6Tm9uTWFpblRocmVhZFNwZWNpZmljRE9NRGF0YTo6
Tm9uTWFpblRocmVhZFNwZWNpZmljRE9NRGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpOb25NYWlu
VGhyZWFkU3BlY2lmaWNET01EYXRhOjp+Tm9uTWFpblRocmVhZFNwZWNpZmljRE9NRGF0YSk6Cisg
ICAgICAgIChXZWJDb3JlOjpNYWluVGhyZWFkU3BlY2lmaWNET01EYXRhOjpNYWluVGhyZWFkU3Bl
Y2lmaWNET01EYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OmdldFRocmVhZFNwZWNpZmljRE9NRGF0
YSk6CisgICAgICAgIChXZWJDb3JlOjo6OmZvcmdldCk6CisgICAgICAgIChXZWJDb3JlOjpnZXRE
T01Ob2RlTWFwKToKKyAgICAgICAgKFdlYkNvcmU6OmdldERPTU9iamVjdE1hcCk6CisgICAgICAg
IChXZWJDb3JlOjpnZXRBY3RpdmVET01PYmplY3RNYXApOgorICAgICAgICAoV2ViQ29yZTo6Z2V0
RE9NU1ZHRWxlbWVudEluc3RhbmNlTWFwKToKKyAgICAgICAgKFdlYkNvcmU6OndlYWtTVkdFbGVt
ZW50SW5zdGFuY2VDYWxsYmFjayk6CisgICAgICAgIChXZWJDb3JlOjpnZXRET01TVkdPYmplY3RX
aXRoQ29udGV4dE1hcCk6CisgICAgICAgIChXZWJDb3JlOjp3ZWFrU1ZHT2JqZWN0V2l0aENvbnRl
eHRDYWxsYmFjayk6CisgICAgICAgIChXZWJDb3JlOjpoYW5kbGVXZWFrT2JqZWN0SW5Pd25pbmdU
aHJlYWQpOgorICAgICAgICAoV2ViQ29yZTo6d2Vha0RPTU9iamVjdENhbGxiYWNrKToKKyAgICAg
ICAgKFdlYkNvcmU6OndlYWtBY3RpdmVET01PYmplY3RDYWxsYmFjayk6CisgICAgICAgIChXZWJD
b3JlOjp3ZWFrTm9kZUNhbGxiYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OmRlcmVmT2JqZWN0KToK
KyAgICAgICAgKFdlYkNvcmU6OmRlcmVmRGVsYXllZE9iamVjdHMpOgorICAgICAgICAoV2ViQ29y
ZTo6ZGVyZWZEZWxheWVkT2JqZWN0c0luQ3VycmVudFRocmVhZCk6CisgICAgICAgIChXZWJDb3Jl
OjpyZW1vdmVPYmplY3RzRnJvbVdyYXBwZXJNYXApOgorICAgICAgICAoV2ViQ29yZTo6cmVtb3Zl
QWxsRE9NT2JqZWN0c0luQ3VycmVudFRocmVhZEhlbHBlcik6CisgICAgICAgIChXZWJDb3JlOjpy
ZW1vdmVBbGxET01PYmplY3RzSW5DdXJyZW50VGhyZWFkKToKKyAgICAgICAgKiBiaW5kaW5ncy92
OC9WOERPTU1hcC5oOiBDb3BpZWQgZnJvbSBXZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFNW
R0xlbmd0aEN1c3RvbS5jcHAuCisKIDIwMDktMDMtMjYgIEVyaWMgU2VpZGVsICA8ZXJpY0B3ZWJr
aXQub3JnPgogCiAgICAgICAgIE5vIGFkZGl0aW9uYWwgcmV2aWV3LCBjb21taXR0aW5nIHByZXZp
b3VzbHkgcmV2aWV3ZWQgZmlsZXMgZm9yIGJ1aWxkIGZpeCBvbmx5LgpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9iaW5kaW5ncy92OC9WOERPTU1hcC5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4RE9N
TWFwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MzAzMjBlCi0tLSAv
ZGV2L251bGwKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9WOERPTU1hcC5jcHAKQEAgLTAsMCAr
MSw1ODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoK
KyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgor
ICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBH
b29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1
c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMg
c29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5E
IENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklH
SFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVjhET01NYXAuaCIKKworI2lu
Y2x1ZGUgIkRPTU9iamVjdHNJbmNsdWRlLmgiCisKKyNpbmNsdWRlIDx2OC5oPgorI2luY2x1ZGUg
PHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL01haW5UaHJlYWQuaD4KKyNpbmNsdWRlIDx3
dGYvTm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CisjaW5jbHVk
ZSA8d3RmL1RocmVhZGluZy5oPgorI2luY2x1ZGUgPHd0Zi9UaHJlYWRTcGVjaWZpYy5oPgorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIERPTSBiaW5kaW5nIGFsZ29yaXRobToKKy8vCisvLyBU
aGVyZSBhcmUgdHdvIGtpbmRzIG9mIERPTSBvYmplY3RzOgorLy8gMS4gRE9NIHRyZWUgbm9kZXMs
IHN1Y2ggYXMgRG9jdW1lbnQsIEhUTUxFbGVtZW50LCAuLi4KKy8vICAgIHRoZXJlIGNsYXNzZXMg
aW1wbGVtZW50cyBUcmVlU2hhcmVkPFQ+IGludGVyZmFjZTsKKy8vIDIuIE5vbi1ub2RlIERPTSBv
YmplY3RzLCBzdWNoIGFzIENTU1J1bGUsIExvY2F0aW9uLCBldGMuCisvLyAgICB0aGVzZSBjbGFz
c2VzIGltcGxlbWVudCBhIHJlZi1jb3VudGVkIHNjaGVtZS4KKy8vCisvLyBBIERPTSBvYmplY3Qg
bWF5IGhhdmUgYSBKUyB3cmFwcGVyIG9iamVjdC4gSWYgYSB0cmVlIG5vZGUKKy8vIGlzIGFsaXZl
LCBpdHMgSlMgd3JhcHBlciBtdXN0IGJlIGtlcHQgYWxpdmUgZXZlbiBpdCBpcyBub3QKKy8vIHJl
YWNoYWJsZSBmcm9tIEpTIHJvb3RzLgorLy8gSG93ZXZlciwgSlMgd3JhcHBlcnMgb2Ygbm9uLW5v
ZGUgb2JqZWN0cyBjYW4gZ28gYXdheSBpZgorLy8gbm90IHJlYWNoYWJsZSBmcm9tIG90aGVyIEpT
IG9iamVjdHMuIEl0IHdvcmtzIGxpa2UgYSBjYWNoZS4KKy8vCisvLyBET00gb2JqZWN0cyBhcmUg
cmVmLWNvdW50ZWQsIGFuZCBKUyBvYmplY3RzIGFyZSB0cmFjZWQgZnJvbQorLy8gYSBzZXQgb2Yg
cm9vdCBvYmplY3RzLiBUaGV5IGNhbiBjcmVhdGUgYSBjeWNsZS4gVG8gYnJlYWsKKy8vIGN5Y2xl
cywgd2UgZG8gZm9sbG93aW5nOgorLy8gICBIYW5kbGVzIGZyb20gRE9NIG9iamVjdHMgdG8gSlMg
d3JhcHBlcnMgYXJlIGFsd2F5cyB3ZWFrLAorLy8gc28gSlMgd3JhcHBlcnMgb2Ygbm9uLW5vZGUg
b2JqZWN0IGNhbm5vdCBjcmVhdGUgYSBjeWNsZS4KKy8vICAgQmVmb3JlIHN0YXJ0aW5nIGEgZ2xv
YmFsIEdDLCB3ZSBjcmVhdGUgYSB2aXJ0dWFsIGNvbm5lY3Rpb24KKy8vIGJldHdlZW4gbm9kZXMg
aW4gdGhlIHNhbWUgdHJlZSBpbiB0aGUgSlMgaGVhcC4gSWYgdGhlIHdyYXBwZXIKKy8vIG9mIG9u
ZSBub2RlIGluIGEgdHJlZSBpcyBhbGl2ZSwgd3JhcHBlcnMgb2YgYWxsIG5vZGVzIGluCisvLyB0
aGUgc2FtZSB0cmVlIGFyZSBjb25zaWRlcmVkIGFsaXZlLiBUaGlzIGlzIGRvbmUgYnkgY3JlYXRp
bmcKKy8vIG9iamVjdCBncm91cHMgaW4gR0MgcHJvbG9ndWUgY2FsbGJhY2tzLiBUaGUgbWFyay1j
b21wYWN0CisvLyBjb2xsZWN0b3Igd2lsbCByZW1vdmUgdGhlc2UgZ3JvdXBzIGFmdGVyIGVhY2gg
R0MuCisvLworLy8gRE9NIG9iamVjdHMgc2hvdWxkIGJlIGRlcmVmLWVkIGZyb20gdGhlIG93bmlu
ZyB0aHJlYWQsIG5vdCB0aGUgR0MgdGhyZWFkCisvLyB0aGF0IGRvZXMgbm90IG93biB0aGVtLiBJ
biBWOCwgR0MgY2FuIGtpY2sgaW4gZnJvbSBhbnkgdGhyZWFkLiBUbyBlbnN1cmUKKy8vIHRoYXQg
RE9NIG9iamVjdHMgYXJlIGFsd2F5cyBkZXJlZi1lZCBmcm9tIHRoZSBvd25pbmcgdGhyZWFkIHdo
ZW4gcnVubmluZworLy8gVjggaW4gbXVsdGktdGhyZWFkaW5nIGVudmlyb25tZW50LCB3ZSBkbyBm
b2xsb3dpbmc6CisvLyAxLiBNYWludGFpbiBhIHRocmVhZCBzcGVjaWZpYyBET00gd3JhcHBlciBt
YXAgZm9yIGVhY2ggb2JqZWN0IG1hcC4KKy8vICAgIChXZSdyZSB1c2luZyBUTFMgc3VwcG9ydCBm
cm9tIFdURiBpbnN0ZWFkIG9mIGJhc2Ugc2luY2UgVjhCaW5kaW5ncworLy8gICAgIGRvZXMgbm90
IGRlcGVuZCBvbiBiYXNlLiBXZSBmdXJ0aGVyIGFzc3VtZSB0aGF0IGFsbCBjaGlsZCB0aHJlYWRz
CisvLyAgICAgcnVubmluZyBWOCBpbnN0YW5jZXMgYXJlIGNyZWF0ZWQgYnkgV1RGIGFuZCB0aHVz
IGEgZGVzdHJ1Y3RvciB3aWxsCisvLyAgICAgYmUgY2FsbGVkIHRvIGNsZWFuIHVwIGFsbCB0aHJl
YWQgc3BlY2lmaWMgZGF0YS4pCisvLyAyLiBXaGVuIEdDIGhhcHBlbnM6CisvLyAgICAyLjEuIElm
IHRoZSBkZWFkIG9iamVjdCBpcyBpbiBHQyB0aHJlYWQncyBtYXAsIHJlbW92ZSB0aGUgSlMgcmVm
ZXJlbmNlCisvLyAgICAgICAgIGFuZCBkZXJlZiB0aGUgRE9NIG9iamVjdC4KKy8vICAgIDIuMi4g
T3RoZXJ3aXNlLCBnbyB0aHJvdWdoIGFsbCB0aHJlYWQgbWFwcyB0byBmaW5kIHRoZSBvd25pbmcg
dGhyZWFkLgorLy8gICAgICAgICBSZW1vdmUgdGhlIEpTIHJlZmVyZW5jZSBmcm9tIHRoZSBvd25p
bmcgdGhyZWFkJ3MgbWFwIGFuZCBtb3ZlIHRoZQorLy8gICAgICAgICBET00gb2JqZWN0IHRvIGEg
ZGVsYXllZCBxdWV1ZS4gUG9zdCBhIHRhc2sgdG8gdGhlIG93bmluZyB0aHJlYWQKKy8vICAgICAg
ICAgdG8gaGF2ZSBpdCBkZXJlZi1lZCBmcm9tIHRoZSBvd25pbmcgdGhyZWFkIGF0IGxhdGVyIHRp
bWUuCisvLyAzLiBXaGVuIGEgdGhyZWFkIGlzIHRlYXJpbmcgZG93biwgaW52b2tlIGEgY2xlYW51
cCByb3V0aW5lIHRvIGdvIHRocm91Z2gKKy8vICAgIGFsbCBvYmplY3RzIGluIHRoZSBkZWxheWVk
IHF1ZXVlIGFuZCB0aGUgdGhyZWFkIG1hcCBhbmQgZGVyZWYgYWxsIG9mCisvLyAgICB0aGVtLgor
CitzdGF0aWMgdm9pZCB3ZWFrRE9NT2JqZWN0Q2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6OlZh
bHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0KTsKK3N0YXRpYyB2b2lkIHdlYWtOb2RlQ2Fs
bGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0
KTsKKworI2lmIEVOQUJMRShTVkcpCitzdGF0aWMgdm9pZCB3ZWFrU1ZHRWxlbWVudEluc3RhbmNl
Q2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2Jq
ZWN0KTsKKworLy8gU1ZHIG5vbi1ub2RlIGVsZW1lbnRzIG1heSBoYXZlIGEgcmVmZXJlbmNlIHRv
IGEgY29udGV4dCBub2RlIHdoaWNoIHNob3VsZCBiZSBub3RpZmllZCB3aGVuIHRoZSBlbGVtZW50
IGlzIGNoYW5nZS4KK3N0YXRpYyB2b2lkIHdlYWtTVkdPYmplY3RXaXRoQ29udGV4dENhbGxiYWNr
KHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCk7Cisj
ZW5kaWYKKworLy8gVGhpcyBpcyB0byBlbnN1cmUgdGhhdCB3ZSB3aWxsIGRlcmVmIERPTSBvYmpl
Y3RzIGZyb20gdGhlIG93bmluZyB0aHJlYWQsIG5vdCB0aGUgR0MgdGhyZWFkLgorLy8gVGhlIGhl
bHBlciBmdW5jdGlvbiB3aWxsIGJlIHNjaGVkdWxlZCBieSB0aGUgR0MgdGhyZWFkIHRvIGdldCBj
YWxsZWQgZnJvbSB0aGUgb3duaW5nIHRocmVhZC4KK3N0YXRpYyB2b2lkIGRlcmVmRGVsYXllZE9i
amVjdHNJbkN1cnJlbnRUaHJlYWQodm9pZCopOworCisvLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQg
dG8gcmVtb3ZlIGFsbCBET00gb2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgdGhy
ZWFkIHdoZW4gaXQgaXMgdGVhcmluZyBkb3duLgorc3RhdGljIHZvaWQgcmVtb3ZlQWxsRE9NT2Jq
ZWN0c0luQ3VycmVudFRocmVhZCgpOworCisvLyBBIG1hcCBmcm9tIGEgdGhyZWFkIElEIHRvIHRo
cmVhZCdzIHNwZWNpZmljIGRhdGEuCitjbGFzcyBUaHJlYWRTcGVjaWZpY0RPTURhdGE7Cit0eXBl
ZGVmIFdURjo6SGFzaE1hcDxXVEY6OlRocmVhZElkZW50aWZpZXIsIFRocmVhZFNwZWNpZmljRE9N
RGF0YSo+IERPTVRocmVhZE1hcDsKK3N0YXRpYyBET01UaHJlYWRNYXAmIGRvbVRocmVhZE1hcCgp
Cit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChET01UaHJlYWRNYXAsIHN0YXRpY0RPTVRocmVh
ZE1hcCwgKCkpOworICAgIHJldHVybiBzdGF0aWNET01UaHJlYWRNYXA7Cit9CisKKy8vIE11dGV4
IHRvIHByb3RlY3QgYWdhaW5zdCBjb25jdXJyZW50IGFjY2VzcyBvZiBkb21UaHJlYWRNYXAuCitz
dGF0aWMgV1RGOjpNdXRleCYgZG9tVGhyZWFkTWFwTXV0ZXgoKQoreworICAgIERFRklORV9TVEFU
SUNfTE9DQUwoV1RGOjpNdXRleCwgc3RhdGljRE9NVGhyZWFkTWFwTXV0ZXgsICgpKTsKKyAgICBy
ZXR1cm4gc3RhdGljRE9NVGhyZWFkTWFwTXV0ZXg7Cit9CisKK2NsYXNzIFRocmVhZFNwZWNpZmlj
RE9NRGF0YSA6IE5vbmNvcHlhYmxlIHsKK3B1YmxpYzoKKyAgICBlbnVtIERPTVdyYXBwZXJNYXBU
eXBlIHsKKyAgICAgICAgRE9NTm9kZU1hcCwKKyAgICAgICAgRE9NT2JqZWN0TWFwLAorICAgICAg
ICBBY3RpdmVET01PYmplY3RNYXAsCisjaWYgRU5BQkxFKFNWRykKKyAgICAgICAgRE9NU1ZHRWxl
bWVudEluc3RhbmNlTWFwLAorICAgICAgICBET01TVkdPYmplY3RXaXRoQ29udGV4dE1hcAorI2Vu
ZGlmCisgICAgfTsKKworICAgIHR5cGVkZWYgV1RGOjpIYXNoTWFwPHZvaWQqLCBWOENsYXNzSW5k
ZXg6OlY4V3JhcHBlclR5cGU+IERlbGF5ZWRPYmplY3RNYXA7CisKKyAgICB0ZW1wbGF0ZSA8Y2xh
c3MgS2V5VHlwZT4KKyAgICBjbGFzcyBJbnRlcm5hbERPTVdyYXBwZXJNYXAgOiBwdWJsaWMgRE9N
V3JhcHBlck1hcDxLZXlUeXBlPiB7CisgICAgcHVibGljOgorICAgICAgICBJbnRlcm5hbERPTVdy
YXBwZXJNYXAodjg6OldlYWtSZWZlcmVuY2VDYWxsYmFjayBjYWxsYmFjaykKKyAgICAgICAgICAg
IDogRE9NV3JhcHBlck1hcDxLZXlUeXBlPihjYWxsYmFjaykgeyB9CisKKyAgICAgICAgdmlydHVh
bCB2b2lkIGZvcmdldChLZXlUeXBlKik7CisKKyAgICAgICAgdm9pZCBmb3JnZXRPbmx5KEtleVR5
cGUqIG9iamVjdCkKKyAgICAgICAgeworICAgICAgICAgICAgRE9NV3JhcHBlck1hcDxLZXlUeXBl
Pjo6Zm9yZ2V0KG9iamVjdCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgVGhyZWFkU3BlY2lm
aWNET01EYXRhKCkKKyAgICAgICAgOiBtX2RvbU5vZGVNYXAoMCkKKyAgICAgICAgLCBtX2RvbU9i
amVjdE1hcCgwKQorICAgICAgICAsIG1fYWN0aXZlRG9tT2JqZWN0TWFwKDApCisjaWYgRU5BQkxF
KFNWRykKKyAgICAgICAgLCBtX2RvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcCgwKQorICAgICAgICAs
IG1fZG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXAoMCkKKyNlbmRpZgorICAgICAgICAsIG1fZGVs
YXllZFByb2Nlc3NpbmdTY2hlZHVsZWQoZmFsc2UpCisgICAgICAgICwgbV9pc01haW5UaHJlYWQo
V1RGOjppc01haW5UaHJlYWQoKSkKKyAgICB7CisgICAgICAgIFdURjo6TXV0ZXhMb2NrZXIgbG9j
a2VyKGRvbVRocmVhZE1hcE11dGV4KCkpOworICAgICAgICBkb21UaHJlYWRNYXAoKS5zZXQoV1RG
OjpjdXJyZW50VGhyZWFkKCksIHRoaXMpOworICAgIH0KKworICAgIHZpcnR1YWwgflRocmVhZFNw
ZWNpZmljRE9NRGF0YSgpCisgICAgeworICAgICAgICBXVEY6Ok11dGV4TG9ja2VyIGxvY2tlcihk
b21UaHJlYWRNYXBNdXRleCgpKTsKKyAgICAgICAgZG9tVGhyZWFkTWFwKCkucmVtb3ZlKFdURjo6
Y3VycmVudFRocmVhZCgpKTsKKyAgICB9CisKKyAgICB2b2lkKiBnZXRET01XcmFwcGVyTWFwKERP
TVdyYXBwZXJNYXBUeXBlIHR5cGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAg
ICAgICAgY2FzZSBET01Ob2RlTWFwOgorICAgICAgICAgICAgcmV0dXJuIG1fZG9tTm9kZU1hcDsK
KyAgICAgICAgY2FzZSBET01PYmplY3RNYXA6CisgICAgICAgICAgICByZXR1cm4gbV9kb21PYmpl
Y3RNYXA7CisgICAgICAgIGNhc2UgQWN0aXZlRE9NT2JqZWN0TWFwOgorICAgICAgICAgICAgcmV0
dXJuIG1fYWN0aXZlRG9tT2JqZWN0TWFwOworI2lmIEVOQUJMRShTVkcpCisgICAgICAgIGNhc2Ug
RE9NU1ZHRWxlbWVudEluc3RhbmNlTWFwOgorICAgICAgICAgICAgcmV0dXJuIG1fZG9tU3ZnRWxl
bWVudEluc3RhbmNlTWFwOworICAgICAgICBjYXNlIERPTVNWR09iamVjdFdpdGhDb250ZXh0TWFw
OgorICAgICAgICAgICAgcmV0dXJuIG1fZG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXA7CisjZW5k
aWYKKyAgICAgICAgfQorCisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICBy
ZXR1cm4gMDsKKyAgICB9CisKKyAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8Tm9kZT4mIGRvbU5v
ZGVNYXAoKSB7IHJldHVybiAqbV9kb21Ob2RlTWFwOyB9CisgICAgSW50ZXJuYWxET01XcmFwcGVy
TWFwPHZvaWQ+JiBkb21PYmplY3RNYXAoKSB7IHJldHVybiAqbV9kb21PYmplY3RNYXA7IH0KKyAg
ICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4mIGFjdGl2ZURvbU9iamVjdE1hcCgpIHsgcmV0
dXJuICptX2FjdGl2ZURvbU9iamVjdE1hcDsgfQorI2lmIEVOQUJMRShTVkcpCisgICAgSW50ZXJu
YWxET01XcmFwcGVyTWFwPFNWR0VsZW1lbnRJbnN0YW5jZT4mIGRvbVN2Z0VsZW1lbnRJbnN0YW5j
ZU1hcCgpIHsgcmV0dXJuICptX2RvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcDsgfQorICAgIEludGVy
bmFsRE9NV3JhcHBlck1hcDx2b2lkPiYgZG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXAoKSB7IHJl
dHVybiAqbV9kb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcDsgfQorI2VuZGlmCisKKyAgICBEZWxh
eWVkT2JqZWN0TWFwJiBkZWxheWVkT2JqZWN0TWFwKCkgeyByZXR1cm4gbV9kZWxheWVkT2JqZWN0
TWFwOyB9CisgICAgYm9vbCBkZWxheWVkUHJvY2Vzc2luZ1NjaGVkdWxlZCgpIGNvbnN0IHsgcmV0
dXJuIG1fZGVsYXllZFByb2Nlc3NpbmdTY2hlZHVsZWQ7IH0KKyAgICB2b2lkIHNldERlbGF5ZWRQ
cm9jZXNzaW5nU2NoZWR1bGVkKGJvb2wgdmFsdWUpIHsgbV9kZWxheWVkUHJvY2Vzc2luZ1NjaGVk
dWxlZCA9IHZhbHVlOyB9CisgICAgYm9vbCBpc01haW5UaHJlYWQoKSBjb25zdCB7IHJldHVybiBt
X2lzTWFpblRocmVhZDsgfQorCitwcm90ZWN0ZWQ6CisgICAgSW50ZXJuYWxET01XcmFwcGVyTWFw
PE5vZGU+KiBtX2RvbU5vZGVNYXA7CisgICAgSW50ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+KiBt
X2RvbU9iamVjdE1hcDsKKyAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4qIG1fYWN0aXZl
RG9tT2JqZWN0TWFwOworI2lmIEVOQUJMRShTVkcpCisgICAgSW50ZXJuYWxET01XcmFwcGVyTWFw
PFNWR0VsZW1lbnRJbnN0YW5jZT4qIG1fZG9tU3ZnRWxlbWVudEluc3RhbmNlTWFwOworICAgIElu
dGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiogbV9kb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcDsK
KyNlbmRpZgorCisgICAgLy8gU3RvcmVzIGFsbCB0aGUgRE9NIG9iamVjdHMgdGhhdCBhcmUgZGVs
YXllZCB0byBiZSBwcm9jZXNzZWQgd2hlbiB0aGUgb3duaW5nIHRocmVhZCBnYWlucyBjb250cm9s
LgorICAgIERlbGF5ZWRPYmplY3RNYXAgbV9kZWxheWVkT2JqZWN0TWFwOworCisgICAgLy8gVGhl
IGZsYWcgdG8gaW5kaWNhdGUgaWYgdGhlIHRhc2sgdG8gZG8gdGhlIGRlbGF5ZWQgcHJvY2VzcyBo
YXMgYWxyZWFkeSBiZWVuIHBvc3RlZC4KKyAgICBib29sIG1fZGVsYXllZFByb2Nlc3NpbmdTY2hl
ZHVsZWQ7CisKKyAgICBib29sIG1faXNNYWluVGhyZWFkOworfTsKKworLy8gVGhpcyBlbmNhcHN1
bGF0ZXMgdGhyZWFkLXNwZWNpZmljIERPTSBkYXRhIGZvciBub24tbWFpbiB0aHJlYWQuIEFsbCB0
aGUgbWFwcyBpbiBpdCBhcmUgY3JlYXRlZCBkeW5hbWljYWxseS4KK2NsYXNzIE5vbk1haW5UaHJl
YWRTcGVjaWZpY0RPTURhdGEgOiBwdWJsaWMgVGhyZWFkU3BlY2lmaWNET01EYXRhIHsKK3B1Ymxp
YzoKKyAgICBOb25NYWluVGhyZWFkU3BlY2lmaWNET01EYXRhKCkKKyAgICB7CisgICAgICAgIG1f
ZG9tTm9kZU1hcCA9IG5ldyBJbnRlcm5hbERPTVdyYXBwZXJNYXA8Tm9kZT4oJndlYWtOb2RlQ2Fs
bGJhY2spOworICAgICAgICBtX2RvbU9iamVjdE1hcCA9IG5ldyBJbnRlcm5hbERPTVdyYXBwZXJN
YXA8dm9pZD4od2Vha0RPTU9iamVjdENhbGxiYWNrKTsKKyAgICAgICAgbV9hY3RpdmVEb21PYmpl
Y3RNYXAgPSBuZXcgSW50ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+KHdlYWtBY3RpdmVET01PYmpl
Y3RDYWxsYmFjayk7CisjaWYgRU5BQkxFKFNWRykKKyAgICAgICAgbV9kb21TdmdFbGVtZW50SW5z
dGFuY2VNYXAgPSBuZXcgSW50ZXJuYWxET01XcmFwcGVyTWFwPFNWR0VsZW1lbnRJbnN0YW5jZT4o
d2Vha1NWR0VsZW1lbnRJbnN0YW5jZUNhbGxiYWNrKTsKKyAgICAgICAgbV9kb21TdmdPYmplY3RX
aXRoQ29udGV4dE1hcCA9IG5ldyBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4od2Vha1NWR09i
amVjdFdpdGhDb250ZXh0Q2FsbGJhY2spOworI2VuZGlmCisgICAgfQorCisgICAgLy8gVGhpcyBp
cyBjYWxsZWQgd2hlbiBXVEYgdGhyZWFkIGlzIHRlYXJpbmcgZG93bi4KKyAgICAvLyBXZSBhc3N1
bWUgdGhhdCBhbGwgY2hpbGQgdGhyZWFkcyBydW5uaW5nIFY4IGluc3RhbmNlcyBhcmUgY3JlYXRl
ZCBieSBXVEYuCisgICAgdmlydHVhbCB+Tm9uTWFpblRocmVhZFNwZWNpZmljRE9NRGF0YSgpCisg
ICAgeworICAgICAgICByZW1vdmVBbGxET01PYmplY3RzSW5DdXJyZW50VGhyZWFkKCk7CisKKyAg
ICAgICAgZGVsZXRlIG1fZG9tTm9kZU1hcDsKKyAgICAgICAgZGVsZXRlIG1fZG9tT2JqZWN0TWFw
OworICAgICAgICBkZWxldGUgbV9hY3RpdmVEb21PYmplY3RNYXA7CisjaWYgRU5BQkxFKFNWRykK
KyAgICAgICAgZGVsZXRlIG1fZG9tU3ZnRWxlbWVudEluc3RhbmNlTWFwOworICAgICAgICBkZWxl
dGUgbV9kb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcDsKKyNlbmRpZgorICAgIH0KK307CisKKy8v
IFRoaXMgZW5jYXBzdWxhdGVzIHRocmVhZC1zcGVjaWZpYyBET00gZGF0YSBmb3IgdGhlIG1haW4g
dGhyZWFkLiBBbGwgdGhlIG1hcHMgaW4gaXQgYXJlIHN0YXRpYy4KKy8vIFRoaXMgaXMgYmVjYXVz
ZSB3ZSBhcmUgdW5hYmxlIHRvIHJlbHkgb24gV1RGOjpUaHJlYWRTcGVjaWZpY1RocmVhZEV4aXQg
dG8gZG8gdGhlIGNsZWFudXAgc2luY2UgdGhlIHBsYWNlIHRoYXQgdGVhcnMgZG93biB0aGUgbWFp
biB0aHJlYWQgY2FuIG5vdCBjYWxsIGFueSBXVEYgZnVuY3Rpb25zLgorY2xhc3MgTWFpblRocmVh
ZFNwZWNpZmljRE9NRGF0YSA6IHB1YmxpYyBUaHJlYWRTcGVjaWZpY0RPTURhdGEgeworcHVibGlj
OgorICAgIE1haW5UaHJlYWRTcGVjaWZpY0RPTURhdGEoKQorICAgICAgICA6IG1fc3RhdGljRG9t
Tm9kZU1hcCh3ZWFrTm9kZUNhbGxiYWNrKQorICAgICAgICAsIG1fc3RhdGljRG9tT2JqZWN0TWFw
KHdlYWtET01PYmplY3RDYWxsYmFjaykKKyAgICAgICAgLCBtX3N0YXRpY0FjdGl2ZURvbU9iamVj
dE1hcCh3ZWFrQWN0aXZlRE9NT2JqZWN0Q2FsbGJhY2spCisjaWYgRU5BQkxFKFNWRykKKyAgICAg
ICAgLCBtX3N0YXRpY0RvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcCh3ZWFrU1ZHRWxlbWVudEluc3Rh
bmNlQ2FsbGJhY2spCisgICAgICAgICwgbV9zdGF0aWNEb21TdmdPYmplY3RXaXRoQ29udGV4dE1h
cCh3ZWFrU1ZHT2JqZWN0V2l0aENvbnRleHRDYWxsYmFjaykKKyNlbmRpZgorICAgIHsKKyAgICAg
ICAgbV9kb21Ob2RlTWFwID0gJm1fc3RhdGljRG9tTm9kZU1hcDsKKyAgICAgICAgbV9kb21PYmpl
Y3RNYXAgPSAmbV9zdGF0aWNEb21PYmplY3RNYXA7CisgICAgICAgIG1fYWN0aXZlRG9tT2JqZWN0
TWFwID0gJm1fc3RhdGljQWN0aXZlRG9tT2JqZWN0TWFwOworI2lmIEVOQUJMRShTVkcpCisgICAg
ICAgIG1fZG9tU3ZnRWxlbWVudEluc3RhbmNlTWFwID0gJm1fc3RhdGljRG9tU3ZnRWxlbWVudElu
c3RhbmNlTWFwOworICAgICAgICBtX2RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwID0gJm1fc3Rh
dGljRG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXA7CisjZW5kaWYKKyAgICB9CisKK3ByaXZhdGU6
CisgICAgSW50ZXJuYWxET01XcmFwcGVyTWFwPE5vZGU+IG1fc3RhdGljRG9tTm9kZU1hcDsKKyAg
ICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4gbV9zdGF0aWNEb21PYmplY3RNYXA7CisgICAg
SW50ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+IG1fc3RhdGljQWN0aXZlRG9tT2JqZWN0TWFwOwor
ICAgIEludGVybmFsRE9NV3JhcHBlck1hcDxTVkdFbGVtZW50SW5zdGFuY2U+IG1fc3RhdGljRG9t
U3ZnRWxlbWVudEluc3RhbmNlTWFwOworICAgIEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiBt
X3N0YXRpY0RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwOworfTsKKworREVGSU5FX1NUQVRJQ19M
T0NBTChXVEY6OlRocmVhZFNwZWNpZmljPE5vbk1haW5UaHJlYWRTcGVjaWZpY0RPTURhdGE+LCB0
aHJlYWRTcGVjaWZpY0RPTURhdGEsICgpKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXRp
YyB2b2lkIGhhbmRsZVdlYWtPYmplY3RJbk93bmluZ1RocmVhZChUaHJlYWRTcGVjaWZpY0RPTURh
dGE6OkRPTVdyYXBwZXJNYXBUeXBlIG1hcFR5cGUsIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlw
ZSBvYmplY3RUeXBlLCBUKik7CisKK1RocmVhZFNwZWNpZmljRE9NRGF0YSYgZ2V0VGhyZWFkU3Bl
Y2lmaWNET01EYXRhKCkKK3sKKyAgICBpZiAoV1RGOjppc01haW5UaHJlYWQoKSkgeworICAgICAg
ICBERUZJTkVfU1RBVElDX0xPQ0FMKE1haW5UaHJlYWRTcGVjaWZpY0RPTURhdGEsIG1haW5UaHJl
YWRTcGVjaWZpY0RPTURhdGEsICgpKTsKKyAgICAgICAgcmV0dXJuIG1haW5UaHJlYWRTcGVjaWZp
Y0RPTURhdGE7CisgICAgfQorICAgIHJldHVybiAqdGhyZWFkU3BlY2lmaWNET01EYXRhOworfQor
Cit0ZW1wbGF0ZSA8Y2xhc3MgS2V5VHlwZT4KK3ZvaWQgVGhyZWFkU3BlY2lmaWNET01EYXRhOjpJ
bnRlcm5hbERPTVdyYXBwZXJNYXA8S2V5VHlwZT46OmZvcmdldChLZXlUeXBlKiBvYmplY3QpCit7
CisgICAgRE9NV3JhcHBlck1hcDxLZXlUeXBlPjo6Zm9yZ2V0KG9iamVjdCk7CisKKyAgICBUaHJl
YWRTcGVjaWZpY0RPTURhdGE6OkRlbGF5ZWRPYmplY3RNYXAmIGRlbGF5ZWRPYmplY3RNYXAgPSBn
ZXRUaHJlYWRTcGVjaWZpY0RPTURhdGEoKS5kZWxheWVkT2JqZWN0TWFwKCk7CisgICAgZGVsYXll
ZE9iamVjdE1hcC50YWtlKG9iamVjdCk7Cit9CisKK0RPTVdyYXBwZXJNYXA8Tm9kZT4mIGdldERP
TU5vZGVNYXAoKQoreworICAgIHJldHVybiBnZXRUaHJlYWRTcGVjaWZpY0RPTURhdGEoKS5kb21O
b2RlTWFwKCk7Cit9CisKK0RPTVdyYXBwZXJNYXA8dm9pZD4mIGdldERPTU9iamVjdE1hcCgpCit7
CisgICAgcmV0dXJuIGdldFRocmVhZFNwZWNpZmljRE9NRGF0YSgpLmRvbU9iamVjdE1hcCgpOwor
fQorCitET01XcmFwcGVyTWFwPHZvaWQ+JiBnZXRBY3RpdmVET01PYmplY3RNYXAoKQoreworICAg
IHJldHVybiBnZXRUaHJlYWRTcGVjaWZpY0RPTURhdGEoKS5hY3RpdmVEb21PYmplY3RNYXAoKTsK
K30KKworI2lmIEVOQUJMRShTVkcpCitET01XcmFwcGVyTWFwPFNWR0VsZW1lbnRJbnN0YW5jZT4m
IGdldERPTVNWR0VsZW1lbnRJbnN0YW5jZU1hcCgpCit7CisgICAgcmV0dXJuIGdldFRocmVhZFNw
ZWNpZmljRE9NRGF0YSgpLmRvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcCgpOworfQorCitzdGF0aWMg
dm9pZCB3ZWFrU1ZHRWxlbWVudEluc3RhbmNlQ2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6OlZh
bHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0KQoreworICAgIFNWR0VsZW1lbnRJbnN0YW5j
ZSogaW5zdGFuY2UgPSBzdGF0aWNfY2FzdDxTVkdFbGVtZW50SW5zdGFuY2UqPihkb21PYmplY3Qp
OworCisgICAgVGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8U1ZH
RWxlbWVudEluc3RhbmNlPiYgbWFwID0gc3RhdGljX2Nhc3Q8VGhyZWFkU3BlY2lmaWNET01EYXRh
OjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8U1ZHRWxlbWVudEluc3RhbmNlPiY+KGdldERPTVNWR0Vs
ZW1lbnRJbnN0YW5jZU1hcCgpKTsKKyAgICBpZiAobWFwLmNvbnRhaW5zKGluc3RhbmNlKSkgewor
ICAgICAgICBpbnN0YW5jZS0+ZGVyZWYoKTsKKyAgICAgICAgbWFwLmZvcmdldE9ubHkoaW5zdGFu
Y2UpOworICAgIH0gZWxzZQorICAgICAgICBoYW5kbGVXZWFrT2JqZWN0SW5Pd25pbmdUaHJlYWQo
VGhyZWFkU3BlY2lmaWNET01EYXRhOjpET01TVkdFbGVtZW50SW5zdGFuY2VNYXAsIFY4Q2xhc3NJ
bmRleDo6U1ZHRUxFTUVOVElOU1RBTkNFLCBpbnN0YW5jZSk7Cit9CisKKy8vIE1hcCBvZiBTVkcg
b2JqZWN0cyB3aXRoIGNvbnRleHRzIHRvIFY4IG9iamVjdHMKK0RPTVdyYXBwZXJNYXA8dm9pZD4m
IGdldERPTVNWR09iamVjdFdpdGhDb250ZXh0TWFwKCkKK3sKKyAgICByZXR1cm4gZ2V0VGhyZWFk
U3BlY2lmaWNET01EYXRhKCkuZG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXAoKTsKK30KKworc3Rh
dGljIHZvaWQgd2Vha1NWR09iamVjdFdpdGhDb250ZXh0Q2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8
djg6OlZhbHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0KQoreworICAgIHY4OjpIYW5kbGVT
Y29wZSBzY29wZTsKKyAgICBBU1NFUlQodjhPYmplY3QtPklzT2JqZWN0KCkpOworCisgICAgVjhD
bGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOFByb3h5OjpHZXRET01XcmFwcGVyVHlw
ZSh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0KSk7CisKKyAgICBUaHJlYWRT
cGVjaWZpY0RPTURhdGE6OkludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiYgbWFwID0gc3RhdGlj
X2Nhc3Q8VGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4m
PihnZXRET01TVkdPYmplY3RXaXRoQ29udGV4dE1hcCgpKTsKKyAgICBpZiAobWFwLmNvbnRhaW5z
KGRvbU9iamVjdCkpIHsKKyAgICAgICAgLy8gVGhlIGZvcmdldCBmdW5jdGlvbiByZW1vdmVzIG9i
amVjdCBmcm9tIHRoZSBtYXAgYW5kIGRpc3Bvc2VzIHRoZSB3cmFwcGVyLgorICAgICAgICBtYXAu
Zm9yZ2V0T25seShkb21PYmplY3QpOworCisgICAgICAgIHN3aXRjaCAodHlwZSkgeworI2RlZmlu
ZSBNYWtlQ2FzZSh0eXBlLCBuYW1lKSAgICAgXAorICAgICAgICAgICAgY2FzZSBWOENsYXNzSW5k
ZXg6OnR5cGU6IHN0YXRpY19jYXN0PG5hbWUqPihkb21PYmplY3QpLT5kZXJlZigpOyBicmVhazsK
KyAgICAgICAgU1ZHX09CSkVDVF9UWVBFUyhNYWtlQ2FzZSkKKyN1bmRlZiBNYWtlQ2FzZQorI2Rl
ZmluZSBNYWtlQ2FzZSh0eXBlLCBuYW1lKSAgICAgXAorICAgICAgICAgICAgY2FzZSBWOENsYXNz
SW5kZXg6OnR5cGU6ICAgIFwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxWOFNWR1BPRFR5
cGVXcmFwcGVyPG5hbWU+Kj4oZG9tT2JqZWN0KS0+ZGVyZWYoKTsgYnJlYWs7CisgICAgICAgIFNW
R19QT0RfTkFUSVZFX1RZUEVTKE1ha2VDYXNlKQorI3VuZGVmIE1ha2VDYXNlCisgICAgICAgIGRl
ZmF1bHQ6CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIGhhbmRsZVdlYWtPYmplY3RJbk93
bmluZ1RocmVhZChUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkRPTVNWR09iamVjdFdpdGhDb250ZXh0
TWFwLCB0eXBlLCBkb21PYmplY3QpOworfQorI2VuZGlmIC8vIEVOQUJMRShTVkcpCisKKy8vIENh
bGxlZCB3aGVuIHRoZSBkZWFkIG9iamVjdCBpcyBub3QgaW4gR0MgdGhyZWFkJ3MgbWFwLiBHbyB0
aHJvdWdoIGFsbCB0aHJlYWQgbWFwcyB0byBmaW5kIHRoZSBvbmUgY29udGFpbmluZyBpdC4KKy8v
IFRoZW4gY2xlYXIgdGhlIEpTIHJlZmVyZW5jZSBhbmQgcHVzaCB0aGUgRE9NIG9iamVjdCBpbnRv
IHRoZSBkZWxheWVkIHF1ZXVlIGZvciBpdCB0byBiZSBkZXJlZi1lZCBhdCBsYXRlciB0aW1lIGZy
b20gdGhlIG93bmluZyB0aHJlYWQuCisvLyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIEdDIHRo
cmVhZCBpcyBub3QgdGhlIG93bmluZyB0aHJlYWQuCisvLyAqIFRoaXMgY2FuIGJlIGNhbGxlZCBv
biBhbnkgdGhyZWFkIHRoYXQgaGFzIEdDIHJ1bm5pbmcuCisvLyAqIE9ubHkgb25lIFY4IGluc3Rh
bmNlIGlzIHJ1bm5pbmcgYXQgYSB0aW1lIGR1ZSB0byBWODo6TG9ja2VyLiBTbyB3ZSBkb24ndCBu
ZWVkIHRvIHdvcnJ5IGFib3V0IGNvbmN1cnJlbmN5LgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0
YXRpYyB2b2lkIGhhbmRsZVdlYWtPYmplY3RJbk93bmluZ1RocmVhZChUaHJlYWRTcGVjaWZpY0RP
TURhdGE6OkRPTVdyYXBwZXJNYXBUeXBlIG1hcFR5cGUsIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVy
VHlwZSBvYmplY3RUeXBlLCBUKiBvYmplY3QpCit7CisgICAgV1RGOjpNdXRleExvY2tlciBsb2Nr
ZXIoZG9tVGhyZWFkTWFwTXV0ZXgoKSk7CisgICAgZm9yICh0eXBlbmFtZSBET01UaHJlYWRNYXA6
Oml0ZXJhdG9yIGl0ZXIoZG9tVGhyZWFkTWFwKCkuYmVnaW4oKSk7IGl0ZXIgIT0gZG9tVGhyZWFk
TWFwKCkuZW5kKCk7ICsraXRlcikgeworICAgICAgICBXVEY6OlRocmVhZElkZW50aWZpZXIgdGhy
ZWFkSUQgPSBpdGVyLT5maXJzdDsKKyAgICAgICAgVGhyZWFkU3BlY2lmaWNET01EYXRhKiB0aHJl
YWREYXRhID0gaXRlci0+c2Vjb25kOworCisgICAgICAgIC8vIFNraXAgdGhlIGN1cnJlbnQgdGhy
ZWFkIHRoYXQgaXMgR0MgdGhyZWFkLgorICAgICAgICBpZiAodGhyZWFkSUQgPT0gV1RGOjpjdXJy
ZW50VGhyZWFkKCkpIHsKKyAgICAgICAgICAgIEFTU0VSVCghc3RhdGljX2Nhc3Q8RE9NV3JhcHBl
ck1hcDxUPio+KHRocmVhZERhdGEtPmdldERPTVdyYXBwZXJNYXAobWFwVHlwZSkpLT5jb250YWlu
cyhvYmplY3QpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAg
VGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8VD4qIGRvbU1hcCA9
IHN0YXRpY19jYXN0PFRocmVhZFNwZWNpZmljRE9NRGF0YTo6SW50ZXJuYWxET01XcmFwcGVyTWFw
PFQ+Kj4odGhyZWFkRGF0YS0+Z2V0RE9NV3JhcHBlck1hcChtYXBUeXBlKSk7CisgICAgICAgIGlm
IChkb21NYXAtPmNvbnRhaW5zKG9iamVjdCkpIHsKKyAgICAgICAgICAgIC8vIENsZWFyIHRoZSBK
UyByZWZlcmVuY2UuCisgICAgICAgICAgICBkb21NYXAtPmZvcmdldE9ubHkob2JqZWN0KTsKKwor
ICAgICAgICAgICAgLy8gUHVzaCBpbnRvIHRoZSBkZWxheWVkIHF1ZXVlLgorICAgICAgICAgICAg
dGhyZWFkRGF0YS0+ZGVsYXllZE9iamVjdE1hcCgpLnNldChvYmplY3QsIG9iamVjdFR5cGUpOwor
CisgICAgICAgICAgICAvLyBQb3N0IGEgdGFzayB0byB0aGUgb3duaW5nIHRocmVhZCBpbiBvcmRl
ciB0byBwcm9jZXNzIHRoZSBkZWxheWVkIHF1ZXVlLgorICAgICAgICAgICAgLy8gRklYTUU6IEZv
ciBub3csIHdlIGNhbiBvbmx5IHBvc3QgdG8gbWFpbiB0aHJlYWQgZHVlIHRvIFdURiB0YXNrIHBv
c3RpbmcgbGltaXRhdGlvbi4gV2Ugd2lsbCBmaXggdGhpcyB3aGVuIHdlIHdvcmsgb24gbmVzdGVk
IHdvcmtlci4KKyAgICAgICAgICAgIGlmICghdGhyZWFkRGF0YS0+ZGVsYXllZFByb2Nlc3NpbmdT
Y2hlZHVsZWQoKSkgeworICAgICAgICAgICAgICAgIHRocmVhZERhdGEtPnNldERlbGF5ZWRQcm9j
ZXNzaW5nU2NoZWR1bGVkKHRydWUpOworICAgICAgICAgICAgICAgIGlmICh0aHJlYWREYXRhLT5p
c01haW5UaHJlYWQoKSkKKyAgICAgICAgICAgICAgICAgICAgV1RGOjpjYWxsT25NYWluVGhyZWFk
KCZkZXJlZkRlbGF5ZWRPYmplY3RzSW5DdXJyZW50VGhyZWFkLCAwKTsKKyAgICAgICAgICAgIH0K
KworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIENhbGxlZCB3
aGVuIHRoZSBvYmplY3QgaXMgbmVhciBkZWF0aCAobm90IHJlYWNoYWJsZSBmcm9tIEpTIHJvb3Rz
KS4KKy8vIEl0IGlzIHRpbWUgdG8gcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSB0YWJsZSBhbmQg
ZGlzcG9zZSB0aGUgaGFuZGxlLgorc3RhdGljIHZvaWQgd2Vha0RPTU9iamVjdENhbGxiYWNrKHY4
OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCkKK3sKKyAg
ICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgQVNTRVJUKHY4T2JqZWN0LT5Jc09iamVjdCgp
KTsKKworICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhQcm94eTo6R2V0
RE9NV3JhcHBlclR5cGUodjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCkpOwor
CisgICAgVGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4m
IG1hcCA9IHN0YXRpY19jYXN0PFRocmVhZFNwZWNpZmljRE9NRGF0YTo6SW50ZXJuYWxET01XcmFw
cGVyTWFwPHZvaWQ+Jj4oZ2V0RE9NT2JqZWN0TWFwKCkpOworICAgIGlmIChtYXAuY29udGFpbnMo
ZG9tT2JqZWN0KSkgeworICAgICAgICAvLyBUaGUgZm9yZ2V0IGZ1bmN0aW9uIHJlbW92ZXMgb2Jq
ZWN0IGZyb20gdGhlIG1hcCBhbmQgZGlzcG9zZXMgdGhlIHdyYXBwZXIuCisgICAgICAgIG1hcC5m
b3JnZXRPbmx5KGRvbU9iamVjdCk7CisKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisjZGVmaW5l
IE1ha2VDYXNlKHR5cGUsIG5hbWUpICAgXAorICAgICAgICAgICAgY2FzZSBWOENsYXNzSW5kZXg6
OnR5cGU6IHN0YXRpY19jYXN0PG5hbWUqPihkb21PYmplY3QpLT5kZXJlZigpOyBicmVhazsKKyAg
ICAgICAgRE9NX09CSkVDVF9UWVBFUyhNYWtlQ2FzZSkKKyN1bmRlZiBNYWtlQ2FzZQorICAgICAg
ICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICBoYW5kbGVXZWFrT2JqZWN0
SW5Pd25pbmdUaHJlYWQoVGhyZWFkU3BlY2lmaWNET01EYXRhOjpET01PYmplY3RNYXAsIHR5cGUs
IGRvbU9iamVjdCk7Cit9CisKK3ZvaWQgd2Vha0FjdGl2ZURPTU9iamVjdENhbGxiYWNrKHY4OjpQ
ZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCkKK3sKKyAgICB2
ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgQVNTRVJUKHY4T2JqZWN0LT5Jc09iamVjdCgpKTsK
KworICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhQcm94eTo6R2V0RE9N
V3JhcHBlclR5cGUodjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCkpOworCisg
ICAgVGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4mIG1h
cCA9IHN0YXRpY19jYXN0PFRocmVhZFNwZWNpZmljRE9NRGF0YTo6SW50ZXJuYWxET01XcmFwcGVy
TWFwPHZvaWQ+Jj4oZ2V0QWN0aXZlRE9NT2JqZWN0TWFwKCkpOworICAgIGlmIChtYXAuY29udGFp
bnMoZG9tT2JqZWN0KSkgeworICAgICAgICAvLyBUaGUgZm9yZ2V0IGZ1bmN0aW9uIHJlbW92ZXMg
b2JqZWN0IGZyb20gdGhlIG1hcCBhbmQgZGlzcG9zZXMgdGhlIHdyYXBwZXIuCisgICAgICAgIG1h
cC5mb3JnZXRPbmx5KGRvbU9iamVjdCk7CisKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisjZGVm
aW5lIE1ha2VDYXNlKHR5cGUsIG5hbWUpICAgXAorICAgICAgICAgICAgY2FzZSBWOENsYXNzSW5k
ZXg6OnR5cGU6IHN0YXRpY19jYXN0PG5hbWUqPihkb21PYmplY3QpLT5kZXJlZigpOyBicmVhazsK
KyAgICAgICAgQUNUSVZFX0RPTV9PQkpFQ1RfVFlQRVMoTWFrZUNhc2UpCisjdW5kZWYgTWFrZUNh
c2UKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgaGFuZGxl
V2Vha09iamVjdEluT3duaW5nVGhyZWFkKFRocmVhZFNwZWNpZmljRE9NRGF0YTo6QWN0aXZlRE9N
T2JqZWN0TWFwLCB0eXBlLCBkb21PYmplY3QpOworfQorCitzdGF0aWMgdm9pZCB3ZWFrTm9kZUNh
bGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVj
dCkKK3sKKyAgICBOb2RlKiBub2RlID0gc3RhdGljX2Nhc3Q8Tm9kZSo+KGRvbU9iamVjdCk7CisK
KyAgICBUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkludGVybmFsRE9NV3JhcHBlck1hcDxOb2RlPiYg
bWFwID0gc3RhdGljX2Nhc3Q8VGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBw
ZXJNYXA8Tm9kZT4mPihnZXRET01Ob2RlTWFwKCkpOworICAgIGlmIChtYXAuY29udGFpbnMobm9k
ZSkpIHsKKyAgICAgICAgbWFwLmZvcmdldE9ubHkobm9kZSk7CisgICAgICAgIG5vZGUtPmRlcmVm
KCk7CisgICAgfSBlbHNlCisgICAgICAgIGhhbmRsZVdlYWtPYmplY3RJbk93bmluZ1RocmVhZDxO
b2RlPihUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkRPTU5vZGVNYXAsIFY4Q2xhc3NJbmRleDo6Tk9E
RSwgbm9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIGRlcmVmT2JqZWN0KFY4Q2xhc3NJbmRleDo6VjhX
cmFwcGVyVHlwZSB0eXBlLCB2b2lkKiBkb21PYmplY3QpCit7CisgICAgc3dpdGNoICh0eXBlKSB7
CisgICAgY2FzZSBWOENsYXNzSW5kZXg6Ok5PREU6CisgICAgICAgIHN0YXRpY19jYXN0PE5vZGUq
Pihkb21PYmplY3QpLT5kZXJlZigpOworICAgICAgICBicmVhazsKKworI2RlZmluZSBNYWtlQ2Fz
ZSh0eXBlLCBuYW1lKSAgIFwKKyAgICAgICAgY2FzZSBWOENsYXNzSW5kZXg6OnR5cGU6IHN0YXRp
Y19jYXN0PG5hbWUqPihkb21PYmplY3QpLT5kZXJlZigpOyBicmVhazsKKyAgICBET01fT0JKRUNU
X1RZUEVTKE1ha2VDYXNlKSAgIC8vIFRoaXMgaW5jbHVkZXMgYm90aCBhY3RpdmUgYW5kIG5vbi1h
Y3RpdmUuCisjdW5kZWYgTWFrZUNhc2UKKworI2lmIEVOQUJMRShTVkcpCisjZGVmaW5lIE1ha2VD
YXNlKHR5cGUsIG5hbWUpICAgICBcCisgICAgICAgIGNhc2UgVjhDbGFzc0luZGV4Ojp0eXBlOiBz
dGF0aWNfY2FzdDxuYW1lKj4oZG9tT2JqZWN0KS0+ZGVyZWYoKTsgYnJlYWs7CisgICAgU1ZHX09C
SkVDVF9UWVBFUyhNYWtlQ2FzZSkgICAvLyBUaGlzIGFsc28gaW5jbHVkZXMgU1ZHRWxlbWVudElu
c3RhbmNlLgorI3VuZGVmIE1ha2VDYXNlCisKKyNkZWZpbmUgTWFrZUNhc2UodHlwZSwgbmFtZSkg
ICAgIFwKKyAgICAgICAgY2FzZSBWOENsYXNzSW5kZXg6OnR5cGU6ICAgIFwKKyAgICAgICAgICAg
IHN0YXRpY19jYXN0PFY4U1ZHUE9EVHlwZVdyYXBwZXI8bmFtZT4qPihkb21PYmplY3QpLT5kZXJl
ZigpOyBicmVhazsKKyAgICBTVkdfUE9EX05BVElWRV9UWVBFUyhNYWtlQ2FzZSkKKyN1bmRlZiBN
YWtlQ2FzZQorI2VuZGlmCisKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZXJlZkRlbGF5
ZWRPYmplY3RzKCkKK3sKKyAgICBXVEY6Ok11dGV4TG9ja2VyIGxvY2tlcihkb21UaHJlYWRNYXBN
dXRleCgpKTsKKworICAgIGdldFRocmVhZFNwZWNpZmljRE9NRGF0YSgpLnNldERlbGF5ZWRQcm9j
ZXNzaW5nU2NoZWR1bGVkKGZhbHNlKTsKKworICAgIFRocmVhZFNwZWNpZmljRE9NRGF0YTo6RGVs
YXllZE9iamVjdE1hcCYgZGVsYXllZE9iamVjdE1hcCA9IGdldFRocmVhZFNwZWNpZmljRE9NRGF0
YSgpLmRlbGF5ZWRPYmplY3RNYXAoKTsKKyAgICBmb3IgKFRocmVhZFNwZWNpZmljRE9NRGF0YTo6
RGVsYXllZE9iamVjdE1hcDo6aXRlcmF0b3IgaXRlcihkZWxheWVkT2JqZWN0TWFwLmJlZ2luKCkp
OyBpdGVyICE9IGRlbGF5ZWRPYmplY3RNYXAuZW5kKCk7ICsraXRlcikgeworICAgICAgICBkZXJl
Zk9iamVjdChpdGVyLT5zZWNvbmQsIGl0ZXItPmZpcnN0KTsKKyAgICB9CisgICAgZGVsYXllZE9i
amVjdE1hcC5jbGVhcigpOworfQorCitzdGF0aWMgdm9pZCBkZXJlZkRlbGF5ZWRPYmplY3RzSW5D
dXJyZW50VGhyZWFkKHZvaWQqKQoreworICAgIGRlcmVmRGVsYXllZE9iamVjdHMoKTsKK30KKwor
dGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXRpYyB2b2lkIHJlbW92ZU9iamVjdHNGcm9tV3JhcHBl
ck1hcChET01XcmFwcGVyTWFwPFQ+JiBkb21NYXApCit7CisgICAgZm9yICh0eXBlbmFtZSBXVEY6
Okhhc2hNYXA8VCosIHY4OjpPYmplY3QqPjo6aXRlcmF0b3IgaXRlcihkb21NYXAuaW1wbCgpLmJl
Z2luKCkpOyBpdGVyICE9IGRvbU1hcC5pbXBsKCkuZW5kKCk7ICsraXRlcikgeworICAgICAgICBU
KiBkb21PYmplY3QgPSBzdGF0aWNfY2FzdDxUKj4oaXRlci0+Zmlyc3QpOworICAgICAgICB2ODo6
UGVyc2lzdGVudDx2ODo6T2JqZWN0PiB2OE9iamVjdChpdGVyLT5zZWNvbmQpOworCisgICAgICAg
IFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhQcm94eTo6R2V0RE9NV3JhcHBl
clR5cGUodjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCkpOworCisgICAgICAg
IC8vIERlcmVmIHRoZSBET00gb2JqZWN0LgorICAgICAgICBkZXJlZk9iamVjdCh0eXBlLCBkb21P
YmplY3QpOworCisgICAgICAgIC8vIENsZWFyIHRoZSBKUyB3cmFwcGVyLgorICAgICAgICB2OE9i
amVjdC5EaXNwb3NlKCk7CisgICAgfQorICAgIGRvbU1hcC5pbXBsKCkuY2xlYXIoKTsKK30KKwor
c3RhdGljIHZvaWQgcmVtb3ZlQWxsRE9NT2JqZWN0c0luQ3VycmVudFRocmVhZEhlbHBlcigpCit7
CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworCisgICAgLy8gRGVyZWYgYWxsIG9iamVjdHMg
aW4gdGhlIGRlbGF5ZWQgcXVldWUuCisgICAgZGVyZWZEZWxheWVkT2JqZWN0cygpOworCisgICAg
Ly8gUmVtb3ZlIGFsbCBET00gbm9kZXMuCisgICAgcmVtb3ZlT2JqZWN0c0Zyb21XcmFwcGVyTWFw
PE5vZGU+KGdldERPTU5vZGVNYXAoKSk7CisKKyAgICAvLyBSZW1vdmUgYWxsIERPTSBvYmplY3Rz
IGluIHRoZSB3cmFwcGVyIG1hcC4KKyAgICByZW1vdmVPYmplY3RzRnJvbVdyYXBwZXJNYXA8dm9p
ZD4oZ2V0RE9NT2JqZWN0TWFwKCkpOworCisgICAgLy8gUmVtb3ZlIGFsbCBhY3RpdmUgRE9NIG9i
amVjdHMgaW4gdGhlIHdyYXBwZXIgbWFwLgorICAgIHJlbW92ZU9iamVjdHNGcm9tV3JhcHBlck1h
cDx2b2lkPihnZXRBY3RpdmVET01PYmplY3RNYXAoKSk7CisKKyNpZiBFTkFCTEUoU1ZHKQorICAg
IC8vIFJlbW92ZSBhbGwgU1ZHIGVsZW1lbnQgaW5zdGFuY2VzIGluIHRoZSB3cmFwcGVyIG1hcC4K
KyAgICByZW1vdmVPYmplY3RzRnJvbVdyYXBwZXJNYXA8U1ZHRWxlbWVudEluc3RhbmNlPihnZXRE
T01TVkdFbGVtZW50SW5zdGFuY2VNYXAoKSk7CisKKyAgICAvLyBSZW1vdmUgYWxsIFNWRyBvYmpl
Y3RzIHdpdGggY29udGV4dCBpbiB0aGUgd3JhcHBlciBtYXAuCisgICAgcmVtb3ZlT2JqZWN0c0Zy
b21XcmFwcGVyTWFwPHZvaWQ+KGdldERPTVNWR09iamVjdFdpdGhDb250ZXh0TWFwKCkpOworI2Vu
ZGlmCit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZUFsbERPTU9iamVjdHNJbkN1cnJlbnRUaHJlYWQo
KQoreworICAgIC8vIFVzZSB0aGUgbG9ja2VyIG9ubHkgaWYgaXQgaGFzIGFscmVhZHkgYmVlbiBp
bnZva2VkIGJlZm9yZSwgYXMgYnkgd29ya2VyIHRocmVhZC4KKyAgICBpZiAodjg6OkxvY2tlcjo6
SXNBY3RpdmUoKSkgeworICAgICAgICB2ODo6TG9ja2VyIGxvY2tlcjsKKyAgICAgICAgcmVtb3Zl
QWxsRE9NT2JqZWN0c0luQ3VycmVudFRocmVhZEhlbHBlcigpOworICAgIH0gZWxzZQorICAgICAg
ICByZW1vdmVBbGxET01PYmplY3RzSW5DdXJyZW50VGhyZWFkSGVscGVyKCk7Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvVjhET01N
YXAuaCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvVjhET01NYXAuaApuZXcgZmlsZSBtb2RlIDEwMDc1
NQppbmRleCAwMDAwMDAwLi45MDlmYmNkCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9iaW5k
aW5ncy92OC9WOERPTU1hcC5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICog
ICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0
cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlv
ciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQg
QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAq
IExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFY4RE9NTWFwX2gKKyNk
ZWZpbmUgVjhET01NYXBfaAorCisjaW5jbHVkZSAiZG9tX3dyYXBwZXJfbWFwLmgiCisKKyNpbmNs
dWRlIDx2OC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisgICAgY2xhc3MgTm9kZTsKKyNpZiBF
TkFCTEUoU1ZHKQorICAgIGNsYXNzIFNWR0VsZW1lbnRJbnN0YW5jZTsKKyNlbmRpZgorCisgICAg
Ly8gQ2FsbGJhY2sgd2hlbiBKUyB3cmFwcGVyIG9mIGFjdGl2ZSBET00gb2JqZWN0IGlzIGRlYWQu
CisgICAgdm9pZCB3ZWFrQWN0aXZlRE9NT2JqZWN0Q2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6
OlZhbHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0KTsKKworICAgIC8vIEEgbWFwIGZyb20g
RE9NIG5vZGUgdG8gaXRzIEpTIHdyYXBwZXIuCisgICAgRE9NV3JhcHBlck1hcDxOb2RlPiYgZ2V0
RE9NTm9kZU1hcCgpOworCisgICAgLy8gQSBtYXAgZnJvbSBhIERPTSBvYmplY3QgKG5vbi1ub2Rl
KSB0byBpdHMgSlMgd3JhcHBlci4gVGhpcyBtYXAgZG9lcyBub3QgY29udGFpbiB0aGUgRE9NIG9i
amVjdHMgd2hpY2ggY2FuIGhhdmUgcGVuZGluZyBhY3Rpdml0eSAoYWN0aXZlIGRvbSBvYmplY3Rz
KS4KKyAgICBET01XcmFwcGVyTWFwPHZvaWQ+JiBnZXRET01PYmplY3RNYXAoKTsKKworICAgIC8v
IEEgbWFwIGZyb20gYSBET00gb2JqZWN0IHRvIGl0cyBKUyB3cmFwcGVyIGZvciBET00gb2JqZWN0
cyB3aGljaCBjYW4gaGF2ZSBwZW5kaW5nIGFjdGl2aXR5LgorICAgIERPTVdyYXBwZXJNYXA8dm9p
ZD4mIGdldEFjdGl2ZURPTU9iamVjdE1hcCgpOworCisjaWYgRU5BQkxFKFNWRykKKyAgICAvLyBB
IG1hcCBmb3IgU1ZHRWxlbWVudEluc3RhbmNlcyB0byBpdHMgSlMgd3JhcHBlci4KKyAgICBET01X
cmFwcGVyTWFwPFNWR0VsZW1lbnRJbnN0YW5jZT4mIGdldERPTVNWR0VsZW1lbnRJbnN0YW5jZU1h
cCgpOworCisgICAgLy8gTWFwIG9mIFNWRyBvYmplY3RzIHdpdGggY29udGV4dHMgdG8gVjggb2Jq
ZWN0cy4KKyAgICBET01XcmFwcGVyTWFwPHZvaWQ+JiBnZXRET01TVkdPYmplY3RXaXRoQ29udGV4
dE1hcCgpOworI2VuZGlmCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBWOERP
TU1hcF9oCg==
</data>
<flag name="review"
          id="14411"
          type_id="1"
          status="+"
          setter="fishd"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>29130</attachid>
            <date>2009-03-31 12:43:26 -0700</date>
            <delta_ts>2009-03-31 12:43:26 -0700</delta_ts>
            <desc>Proposed Patch</desc>
            <filename>24951_2</filename>
            <type>text/plain</type>
            <size>26914</size>
            <attacher name="Jian Li">jianli</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MTI0M2VhZS4uYjFkMGUyYyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMyBAQAorMjAwOS0wMy0zMCAgSmlhbiBMaSAgPGpp
YW5saUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISku
CisKKyAgICAgICAgVXBzdHJlYW0gVjhET01NYXAgZm9yIHY4IGJpbmRpbmdzLgorICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjQ5NTEKKworICAgICAgICAq
IGJpbmRpbmdzL3Y4L1Y4RE9NTWFwLmNwcDogQWRkZWQuCisgICAgICAgICogYmluZGluZ3Mvdjgv
VjhET01NYXAuaDogQWRkZWQuCisKIDIwMDktMDMtMjYgIEVyaWMgU2VpZGVsICA8ZXJpY0B3ZWJr
aXQub3JnPgogCiAgICAgICAgIE5vIGFkZGl0aW9uYWwgcmV2aWV3LCBjb21taXR0aW5nIHByZXZp
b3VzbHkgcmV2aWV3ZWQgZmlsZXMgZm9yIGJ1aWxkIGZpeCBvbmx5LgpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9iaW5kaW5ncy92OC9WOERPTU1hcC5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4RE9N
TWFwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTk1MjRiCi0tLSAv
ZGV2L251bGwKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9WOERPTU1hcC5jcHAKQEAgLTAsMCAr
MSw1ODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoK
KyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgor
ICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBH
b29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1
c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMg
c29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5E
IENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklH
SFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVjhET01NYXAuaCIKKworI2lu
Y2x1ZGUgIkRPTU9iamVjdHNJbmNsdWRlLmgiCisKKyNpbmNsdWRlIDx2OC5oPgorI2luY2x1ZGUg
PHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL01haW5UaHJlYWQuaD4KKyNpbmNsdWRlIDx3
dGYvTm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvU3RkTGliRXh0cmFzLmg+CisjaW5jbHVk
ZSA8d3RmL1RocmVhZGluZy5oPgorI2luY2x1ZGUgPHd0Zi9UaHJlYWRTcGVjaWZpYy5oPgorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIERPTSBiaW5kaW5nIGFsZ29yaXRobToKKy8vCisvLyBU
aGVyZSBhcmUgdHdvIGtpbmRzIG9mIERPTSBvYmplY3RzOgorLy8gMS4gRE9NIHRyZWUgbm9kZXMs
IHN1Y2ggYXMgRG9jdW1lbnQsIEhUTUxFbGVtZW50LCAuLi4KKy8vICAgIHRoZXJlIGNsYXNzZXMg
aW1wbGVtZW50IFRyZWVTaGFyZWQ8VD4gaW50ZXJmYWNlOworLy8gMi4gTm9uLW5vZGUgRE9NIG9i
amVjdHMsIHN1Y2ggYXMgQ1NTUnVsZSwgTG9jYXRpb24sIGV0Yy4KKy8vICAgIHRoZXNlIGNsYXNz
ZXMgaW1wbGVtZW50IGEgcmVmLWNvdW50ZWQgc2NoZW1lLgorLy8KKy8vIEEgRE9NIG9iamVjdCBt
YXkgaGF2ZSBhIEpTIHdyYXBwZXIgb2JqZWN0LiBJZiBhIHRyZWUgbm9kZQorLy8gaXMgYWxpdmUs
IGl0cyBKUyB3cmFwcGVyIG11c3QgYmUga2VwdCBhbGl2ZSBldmVuIGl0IGlzIG5vdAorLy8gcmVh
Y2hhYmxlIGZyb20gSlMgcm9vdHMuCisvLyBIb3dldmVyLCBKUyB3cmFwcGVycyBvZiBub24tbm9k
ZSBvYmplY3RzIGNhbiBnbyBhd2F5IGlmCisvLyBub3QgcmVhY2hhYmxlIGZyb20gb3RoZXIgSlMg
b2JqZWN0cy4gSXQgd29ya3MgbGlrZSBhIGNhY2hlLgorLy8KKy8vIERPTSBvYmplY3RzIGFyZSBy
ZWYtY291bnRlZCwgYW5kIEpTIG9iamVjdHMgYXJlIHRyYWNlZCBmcm9tCisvLyBhIHNldCBvZiBy
b290IG9iamVjdHMuIFRoZXkgY2FuIGNyZWF0ZSBhIGN5Y2xlLiBUbyBicmVhaworLy8gY3ljbGVz
LCB3ZSBkbyBmb2xsb3dpbmc6CisvLyAgIEhhbmRsZXMgZnJvbSBET00gb2JqZWN0cyB0byBKUyB3
cmFwcGVycyBhcmUgYWx3YXlzIHdlYWssCisvLyBzbyBKUyB3cmFwcGVycyBvZiBub24tbm9kZSBv
YmplY3QgY2Fubm90IGNyZWF0ZSBhIGN5Y2xlLgorLy8gICBCZWZvcmUgc3RhcnRpbmcgYSBnbG9i
YWwgR0MsIHdlIGNyZWF0ZSBhIHZpcnR1YWwgY29ubmVjdGlvbgorLy8gYmV0d2VlbiBub2RlcyBp
biB0aGUgc2FtZSB0cmVlIGluIHRoZSBKUyBoZWFwLiBJZiB0aGUgd3JhcHBlcgorLy8gb2Ygb25l
IG5vZGUgaW4gYSB0cmVlIGlzIGFsaXZlLCB3cmFwcGVycyBvZiBhbGwgbm9kZXMgaW4KKy8vIHRo
ZSBzYW1lIHRyZWUgYXJlIGNvbnNpZGVyZWQgYWxpdmUuIFRoaXMgaXMgZG9uZSBieSBjcmVhdGlu
ZworLy8gb2JqZWN0IGdyb3VwcyBpbiBHQyBwcm9sb2d1ZSBjYWxsYmFja3MuIFRoZSBtYXJrLWNv
bXBhY3QKKy8vIGNvbGxlY3RvciB3aWxsIHJlbW92ZSB0aGVzZSBncm91cHMgYWZ0ZXIgZWFjaCBH
Qy4KKy8vCisvLyBET00gb2JqZWN0cyBzaG91bGQgYmUgZGVyZWYtZWQgZnJvbSB0aGUgb3duaW5n
IHRocmVhZCwgbm90IHRoZSBHQyB0aHJlYWQKKy8vIHRoYXQgZG9lcyBub3Qgb3duIHRoZW0uIElu
IFY4LCBHQyBjYW4ga2ljayBpbiBmcm9tIGFueSB0aHJlYWQuIFRvIGVuc3VyZQorLy8gdGhhdCBE
T00gb2JqZWN0cyBhcmUgYWx3YXlzIGRlcmVmLWVkIGZyb20gdGhlIG93bmluZyB0aHJlYWQgd2hl
biBydW5uaW5nCisvLyBWOCBpbiBtdWx0aS10aHJlYWRpbmcgZW52aXJvbm1lbnQsIHdlIGRvIGZv
bGxvd2luZzoKKy8vIDEuIE1haW50YWluIGEgdGhyZWFkIHNwZWNpZmljIERPTSB3cmFwcGVyIG1h
cCBmb3IgZWFjaCBvYmplY3QgbWFwLgorLy8gICAgKFdlJ3JlIHVzaW5nIFRMUyBzdXBwb3J0IGZy
b20gV1RGIGluc3RlYWQgb2YgYmFzZSBzaW5jZSBWOEJpbmRpbmdzCisvLyAgICAgZG9lcyBub3Qg
ZGVwZW5kIG9uIGJhc2UuIFdlIGZ1cnRoZXIgYXNzdW1lIHRoYXQgYWxsIGNoaWxkIHRocmVhZHMK
Ky8vICAgICBydW5uaW5nIFY4IGluc3RhbmNlcyBhcmUgY3JlYXRlZCBieSBXVEYgYW5kIHRodXMg
YSBkZXN0cnVjdG9yIHdpbGwKKy8vICAgICBiZSBjYWxsZWQgdG8gY2xlYW4gdXAgYWxsIHRocmVh
ZCBzcGVjaWZpYyBkYXRhLikKKy8vIDIuIFdoZW4gR0MgaGFwcGVuczoKKy8vICAgIDIuMS4gSWYg
dGhlIGRlYWQgb2JqZWN0IGlzIGluIEdDIHRocmVhZCdzIG1hcCwgcmVtb3ZlIHRoZSBKUyByZWZl
cmVuY2UKKy8vICAgICAgICAgYW5kIGRlcmVmIHRoZSBET00gb2JqZWN0LgorLy8gICAgMi4yLiBP
dGhlcndpc2UsIGdvIHRocm91Z2ggYWxsIHRocmVhZCBtYXBzIHRvIGZpbmQgdGhlIG93bmluZyB0
aHJlYWQuCisvLyAgICAgICAgIFJlbW92ZSB0aGUgSlMgcmVmZXJlbmNlIGZyb20gdGhlIG93bmlu
ZyB0aHJlYWQncyBtYXAgYW5kIG1vdmUgdGhlCisvLyAgICAgICAgIERPTSBvYmplY3QgdG8gYSBk
ZWxheWVkIHF1ZXVlLiBQb3N0IGEgdGFzayB0byB0aGUgb3duaW5nIHRocmVhZAorLy8gICAgICAg
ICB0byBoYXZlIGl0IGRlcmVmLWVkIGZyb20gdGhlIG93bmluZyB0aHJlYWQgYXQgbGF0ZXIgdGlt
ZS4KKy8vIDMuIFdoZW4gYSB0aHJlYWQgaXMgdGVhcmluZyBkb3duLCBpbnZva2UgYSBjbGVhbnVw
IHJvdXRpbmUgdG8gZ28gdGhyb3VnaAorLy8gICAgYWxsIG9iamVjdHMgaW4gdGhlIGRlbGF5ZWQg
cXVldWUgYW5kIHRoZSB0aHJlYWQgbWFwIGFuZCBkZXJlZiBhbGwgb2YKKy8vICAgIHRoZW0uCisK
K3N0YXRpYyB2b2lkIHdlYWtET01PYmplY3RDYWxsYmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFs
dWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmplY3QpOworc3RhdGljIHZvaWQgd2Vha05vZGVDYWxs
YmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmplY3Qp
OworCisjaWYgRU5BQkxFKFNWRykKK3N0YXRpYyB2b2lkIHdlYWtTVkdFbGVtZW50SW5zdGFuY2VD
YWxsYmFjayh2ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IHY4T2JqZWN0LCB2b2lkKiBkb21PYmpl
Y3QpOworCisvLyBTVkcgbm9uLW5vZGUgZWxlbWVudHMgbWF5IGhhdmUgYSByZWZlcmVuY2UgdG8g
YSBjb250ZXh0IG5vZGUgd2hpY2ggc2hvdWxkIGJlIG5vdGlmaWVkIHdoZW4gdGhlIGVsZW1lbnQg
aXMgY2hhbmdlLgorc3RhdGljIHZvaWQgd2Vha1NWR09iamVjdFdpdGhDb250ZXh0Q2FsbGJhY2so
djg6OlBlcnNpc3RlbnQ8djg6OlZhbHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0KTsKKyNl
bmRpZgorCisvLyBUaGlzIGlzIHRvIGVuc3VyZSB0aGF0IHdlIHdpbGwgZGVyZWYgRE9NIG9iamVj
dHMgZnJvbSB0aGUgb3duaW5nIHRocmVhZCwgbm90IHRoZSBHQyB0aHJlYWQuCisvLyBUaGUgaGVs
cGVyIGZ1bmN0aW9uIHdpbGwgYmUgc2NoZWR1bGVkIGJ5IHRoZSBHQyB0aHJlYWQgdG8gZ2V0IGNh
bGxlZCBmcm9tIHRoZSBvd25pbmcgdGhyZWFkLgorc3RhdGljIHZvaWQgZGVyZWZEZWxheWVkT2Jq
ZWN0c0luQ3VycmVudFRocmVhZCh2b2lkKik7CisKKy8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCB0
byByZW1vdmUgYWxsIERPTSBvYmplY3RzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCB0aHJl
YWQgd2hlbiBpdCBpcyB0ZWFyaW5nIGRvd24uCitzdGF0aWMgdm9pZCByZW1vdmVBbGxET01PYmpl
Y3RzSW5DdXJyZW50VGhyZWFkKCk7CisKKy8vIEEgbWFwIGZyb20gYSB0aHJlYWQgSUQgdG8gdGhy
ZWFkJ3Mgc3BlY2lmaWMgZGF0YS4KK2NsYXNzIFRocmVhZFNwZWNpZmljRE9NRGF0YTsKK3R5cGVk
ZWYgV1RGOjpIYXNoTWFwPFdURjo6VGhyZWFkSWRlbnRpZmllciwgVGhyZWFkU3BlY2lmaWNET01E
YXRhKj4gRE9NVGhyZWFkTWFwOworc3RhdGljIERPTVRocmVhZE1hcCYgZG9tVGhyZWFkTWFwKCkK
K3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKERPTVRocmVhZE1hcCwgc3RhdGljRE9NVGhyZWFk
TWFwLCAoKSk7CisgICAgcmV0dXJuIHN0YXRpY0RPTVRocmVhZE1hcDsKK30KKworLy8gTXV0ZXgg
dG8gcHJvdGVjdCBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzIG9mIGRvbVRocmVhZE1hcC4KK3N0
YXRpYyBXVEY6Ok11dGV4JiBkb21UaHJlYWRNYXBNdXRleCgpCit7CisgICAgREVGSU5FX1NUQVRJ
Q19MT0NBTChXVEY6Ok11dGV4LCBzdGF0aWNET01UaHJlYWRNYXBNdXRleCwgKCkpOworICAgIHJl
dHVybiBzdGF0aWNET01UaHJlYWRNYXBNdXRleDsKK30KKworY2xhc3MgVGhyZWFkU3BlY2lmaWNE
T01EYXRhIDogTm9uY29weWFibGUgeworcHVibGljOgorICAgIGVudW0gRE9NV3JhcHBlck1hcFR5
cGUgeworICAgICAgICBET01Ob2RlTWFwLAorICAgICAgICBET01PYmplY3RNYXAsCisgICAgICAg
IEFjdGl2ZURPTU9iamVjdE1hcCwKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICBET01TVkdFbGVt
ZW50SW5zdGFuY2VNYXAsCisgICAgICAgIERPTVNWR09iamVjdFdpdGhDb250ZXh0TWFwCisjZW5k
aWYKKyAgICB9OworCisgICAgdHlwZWRlZiBXVEY6Okhhc2hNYXA8dm9pZCosIFY4Q2xhc3NJbmRl
eDo6VjhXcmFwcGVyVHlwZT4gRGVsYXllZE9iamVjdE1hcDsKKworICAgIHRlbXBsYXRlIDxjbGFz
cyBLZXlUeXBlPgorICAgIGNsYXNzIEludGVybmFsRE9NV3JhcHBlck1hcCA6IHB1YmxpYyBET01X
cmFwcGVyTWFwPEtleVR5cGU+IHsKKyAgICBwdWJsaWM6CisgICAgICAgIEludGVybmFsRE9NV3Jh
cHBlck1hcCh2ODo6V2Vha1JlZmVyZW5jZUNhbGxiYWNrIGNhbGxiYWNrKQorICAgICAgICAgICAg
OiBET01XcmFwcGVyTWFwPEtleVR5cGU+KGNhbGxiYWNrKSB7IH0KKworICAgICAgICB2aXJ0dWFs
IHZvaWQgZm9yZ2V0KEtleVR5cGUqKTsKKworICAgICAgICB2b2lkIGZvcmdldE9ubHkoS2V5VHlw
ZSogb2JqZWN0KQorICAgICAgICB7CisgICAgICAgICAgICBET01XcmFwcGVyTWFwPEtleVR5cGU+
Ojpmb3JnZXQob2JqZWN0KTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBUaHJlYWRTcGVjaWZp
Y0RPTURhdGEoKQorICAgICAgICA6IG1fZG9tTm9kZU1hcCgwKQorICAgICAgICAsIG1fZG9tT2Jq
ZWN0TWFwKDApCisgICAgICAgICwgbV9hY3RpdmVEb21PYmplY3RNYXAoMCkKKyNpZiBFTkFCTEUo
U1ZHKQorICAgICAgICAsIG1fZG9tU3ZnRWxlbWVudEluc3RhbmNlTWFwKDApCisgICAgICAgICwg
bV9kb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcCgwKQorI2VuZGlmCisgICAgICAgICwgbV9kZWxh
eWVkUHJvY2Vzc2luZ1NjaGVkdWxlZChmYWxzZSkKKyAgICAgICAgLCBtX2lzTWFpblRocmVhZChX
VEY6OmlzTWFpblRocmVhZCgpKQorICAgIHsKKyAgICAgICAgV1RGOjpNdXRleExvY2tlciBsb2Nr
ZXIoZG9tVGhyZWFkTWFwTXV0ZXgoKSk7CisgICAgICAgIGRvbVRocmVhZE1hcCgpLnNldChXVEY6
OmN1cnJlbnRUaHJlYWQoKSwgdGhpcyk7CisgICAgfQorCisgICAgdmlydHVhbCB+VGhyZWFkU3Bl
Y2lmaWNET01EYXRhKCkKKyAgICB7CisgICAgICAgIFdURjo6TXV0ZXhMb2NrZXIgbG9ja2VyKGRv
bVRocmVhZE1hcE11dGV4KCkpOworICAgICAgICBkb21UaHJlYWRNYXAoKS5yZW1vdmUoV1RGOjpj
dXJyZW50VGhyZWFkKCkpOworICAgIH0KKworICAgIHZvaWQqIGdldERPTVdyYXBwZXJNYXAoRE9N
V3JhcHBlck1hcFR5cGUgdHlwZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAg
ICAgICBjYXNlIERPTU5vZGVNYXA6CisgICAgICAgICAgICByZXR1cm4gbV9kb21Ob2RlTWFwOwor
ICAgICAgICBjYXNlIERPTU9iamVjdE1hcDoKKyAgICAgICAgICAgIHJldHVybiBtX2RvbU9iamVj
dE1hcDsKKyAgICAgICAgY2FzZSBBY3RpdmVET01PYmplY3RNYXA6CisgICAgICAgICAgICByZXR1
cm4gbV9hY3RpdmVEb21PYmplY3RNYXA7CisjaWYgRU5BQkxFKFNWRykKKyAgICAgICAgY2FzZSBE
T01TVkdFbGVtZW50SW5zdGFuY2VNYXA6CisgICAgICAgICAgICByZXR1cm4gbV9kb21TdmdFbGVt
ZW50SW5zdGFuY2VNYXA7CisgICAgICAgIGNhc2UgRE9NU1ZHT2JqZWN0V2l0aENvbnRleHRNYXA6
CisgICAgICAgICAgICByZXR1cm4gbV9kb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcDsKKyNlbmRp
ZgorICAgICAgICB9CisKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgIHJl
dHVybiAwOworICAgIH0KKworICAgIEludGVybmFsRE9NV3JhcHBlck1hcDxOb2RlPiYgZG9tTm9k
ZU1hcCgpIHsgcmV0dXJuICptX2RvbU5vZGVNYXA7IH0KKyAgICBJbnRlcm5hbERPTVdyYXBwZXJN
YXA8dm9pZD4mIGRvbU9iamVjdE1hcCgpIHsgcmV0dXJuICptX2RvbU9iamVjdE1hcDsgfQorICAg
IEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiYgYWN0aXZlRG9tT2JqZWN0TWFwKCkgeyByZXR1
cm4gKm1fYWN0aXZlRG9tT2JqZWN0TWFwOyB9CisjaWYgRU5BQkxFKFNWRykKKyAgICBJbnRlcm5h
bERPTVdyYXBwZXJNYXA8U1ZHRWxlbWVudEluc3RhbmNlPiYgZG9tU3ZnRWxlbWVudEluc3RhbmNl
TWFwKCkgeyByZXR1cm4gKm1fZG9tU3ZnRWxlbWVudEluc3RhbmNlTWFwOyB9CisgICAgSW50ZXJu
YWxET01XcmFwcGVyTWFwPHZvaWQ+JiBkb21TdmdPYmplY3RXaXRoQ29udGV4dE1hcCgpIHsgcmV0
dXJuICptX2RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwOyB9CisjZW5kaWYKKworICAgIERlbGF5
ZWRPYmplY3RNYXAmIGRlbGF5ZWRPYmplY3RNYXAoKSB7IHJldHVybiBtX2RlbGF5ZWRPYmplY3RN
YXA7IH0KKyAgICBib29sIGRlbGF5ZWRQcm9jZXNzaW5nU2NoZWR1bGVkKCkgY29uc3QgeyByZXR1
cm4gbV9kZWxheWVkUHJvY2Vzc2luZ1NjaGVkdWxlZDsgfQorICAgIHZvaWQgc2V0RGVsYXllZFBy
b2Nlc3NpbmdTY2hlZHVsZWQoYm9vbCB2YWx1ZSkgeyBtX2RlbGF5ZWRQcm9jZXNzaW5nU2NoZWR1
bGVkID0gdmFsdWU7IH0KKyAgICBib29sIGlzTWFpblRocmVhZCgpIGNvbnN0IHsgcmV0dXJuIG1f
aXNNYWluVGhyZWFkOyB9CisKK3Byb3RlY3RlZDoKKyAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8
Tm9kZT4qIG1fZG9tTm9kZU1hcDsKKyAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4qIG1f
ZG9tT2JqZWN0TWFwOworICAgIEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiogbV9hY3RpdmVE
b21PYmplY3RNYXA7CisjaWYgRU5BQkxFKFNWRykKKyAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8
U1ZHRWxlbWVudEluc3RhbmNlPiogbV9kb21TdmdFbGVtZW50SW5zdGFuY2VNYXA7CisgICAgSW50
ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+KiBtX2RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwOwor
I2VuZGlmCisKKyAgICAvLyBTdG9yZXMgYWxsIHRoZSBET00gb2JqZWN0cyB0aGF0IGFyZSBkZWxh
eWVkIHRvIGJlIHByb2Nlc3NlZCB3aGVuIHRoZSBvd25pbmcgdGhyZWFkIGdhaW5zIGNvbnRyb2wu
CisgICAgRGVsYXllZE9iamVjdE1hcCBtX2RlbGF5ZWRPYmplY3RNYXA7CisKKyAgICAvLyBUaGUg
ZmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgdGFzayB0byBkbyB0aGUgZGVsYXllZCBwcm9jZXNzIGhh
cyBhbHJlYWR5IGJlZW4gcG9zdGVkLgorICAgIGJvb2wgbV9kZWxheWVkUHJvY2Vzc2luZ1NjaGVk
dWxlZDsKKworICAgIGJvb2wgbV9pc01haW5UaHJlYWQ7Cit9OworCisvLyBUaGlzIGVuY2Fwc3Vs
YXRlcyB0aHJlYWQtc3BlY2lmaWMgRE9NIGRhdGEgZm9yIG5vbi1tYWluIHRocmVhZC4gQWxsIHRo
ZSBtYXBzIGluIGl0IGFyZSBjcmVhdGVkIGR5bmFtaWNhbGx5LgorY2xhc3MgTm9uTWFpblRocmVh
ZFNwZWNpZmljRE9NRGF0YSA6IHB1YmxpYyBUaHJlYWRTcGVjaWZpY0RPTURhdGEgeworcHVibGlj
OgorICAgIE5vbk1haW5UaHJlYWRTcGVjaWZpY0RPTURhdGEoKQorICAgIHsKKyAgICAgICAgbV9k
b21Ob2RlTWFwID0gbmV3IEludGVybmFsRE9NV3JhcHBlck1hcDxOb2RlPigmd2Vha05vZGVDYWxs
YmFjayk7CisgICAgICAgIG1fZG9tT2JqZWN0TWFwID0gbmV3IEludGVybmFsRE9NV3JhcHBlck1h
cDx2b2lkPih3ZWFrRE9NT2JqZWN0Q2FsbGJhY2spOworICAgICAgICBtX2FjdGl2ZURvbU9iamVj
dE1hcCA9IG5ldyBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4od2Vha0FjdGl2ZURPTU9iamVj
dENhbGxiYWNrKTsKKyNpZiBFTkFCTEUoU1ZHKQorICAgICAgICBtX2RvbVN2Z0VsZW1lbnRJbnN0
YW5jZU1hcCA9IG5ldyBJbnRlcm5hbERPTVdyYXBwZXJNYXA8U1ZHRWxlbWVudEluc3RhbmNlPih3
ZWFrU1ZHRWxlbWVudEluc3RhbmNlQ2FsbGJhY2spOworICAgICAgICBtX2RvbVN2Z09iamVjdFdp
dGhDb250ZXh0TWFwID0gbmV3IEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPih3ZWFrU1ZHT2Jq
ZWN0V2l0aENvbnRleHRDYWxsYmFjayk7CisjZW5kaWYKKyAgICB9CisKKyAgICAvLyBUaGlzIGlz
IGNhbGxlZCB3aGVuIFdURiB0aHJlYWQgaXMgdGVhcmluZyBkb3duLgorICAgIC8vIFdlIGFzc3Vt
ZSB0aGF0IGFsbCBjaGlsZCB0aHJlYWRzIHJ1bm5pbmcgVjggaW5zdGFuY2VzIGFyZSBjcmVhdGVk
IGJ5IFdURi4KKyAgICB2aXJ0dWFsIH5Ob25NYWluVGhyZWFkU3BlY2lmaWNET01EYXRhKCkKKyAg
ICB7CisgICAgICAgIHJlbW92ZUFsbERPTU9iamVjdHNJbkN1cnJlbnRUaHJlYWQoKTsKKworICAg
ICAgICBkZWxldGUgbV9kb21Ob2RlTWFwOworICAgICAgICBkZWxldGUgbV9kb21PYmplY3RNYXA7
CisgICAgICAgIGRlbGV0ZSBtX2FjdGl2ZURvbU9iamVjdE1hcDsKKyNpZiBFTkFCTEUoU1ZHKQor
ICAgICAgICBkZWxldGUgbV9kb21TdmdFbGVtZW50SW5zdGFuY2VNYXA7CisgICAgICAgIGRlbGV0
ZSBtX2RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwOworI2VuZGlmCisgICAgfQorfTsKKworLy8g
VGhpcyBlbmNhcHN1bGF0ZXMgdGhyZWFkLXNwZWNpZmljIERPTSBkYXRhIGZvciB0aGUgbWFpbiB0
aHJlYWQuIEFsbCB0aGUgbWFwcyBpbiBpdCBhcmUgc3RhdGljLgorLy8gVGhpcyBpcyBiZWNhdXNl
IHdlIGFyZSB1bmFibGUgdG8gcmVseSBvbiBXVEY6OlRocmVhZFNwZWNpZmljVGhyZWFkRXhpdCB0
byBkbyB0aGUgY2xlYW51cCBzaW5jZQorLy8gdGhlIHBsYWNlIHRoYXQgdGVhcnMgZG93biB0aGUg
bWFpbiB0aHJlYWQgY2FuIG5vdCBjYWxsIGFueSBXVEYgZnVuY3Rpb25zLgorY2xhc3MgTWFpblRo
cmVhZFNwZWNpZmljRE9NRGF0YSA6IHB1YmxpYyBUaHJlYWRTcGVjaWZpY0RPTURhdGEgeworcHVi
bGljOgorICAgIE1haW5UaHJlYWRTcGVjaWZpY0RPTURhdGEoKQorICAgICAgICA6IG1fc3RhdGlj
RG9tTm9kZU1hcCh3ZWFrTm9kZUNhbGxiYWNrKQorICAgICAgICAsIG1fc3RhdGljRG9tT2JqZWN0
TWFwKHdlYWtET01PYmplY3RDYWxsYmFjaykKKyAgICAgICAgLCBtX3N0YXRpY0FjdGl2ZURvbU9i
amVjdE1hcCh3ZWFrQWN0aXZlRE9NT2JqZWN0Q2FsbGJhY2spCisjaWYgRU5BQkxFKFNWRykKKyAg
ICAgICAgLCBtX3N0YXRpY0RvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcCh3ZWFrU1ZHRWxlbWVudElu
c3RhbmNlQ2FsbGJhY2spCisgICAgICAgICwgbV9zdGF0aWNEb21TdmdPYmplY3RXaXRoQ29udGV4
dE1hcCh3ZWFrU1ZHT2JqZWN0V2l0aENvbnRleHRDYWxsYmFjaykKKyNlbmRpZgorICAgIHsKKyAg
ICAgICAgbV9kb21Ob2RlTWFwID0gJm1fc3RhdGljRG9tTm9kZU1hcDsKKyAgICAgICAgbV9kb21P
YmplY3RNYXAgPSAmbV9zdGF0aWNEb21PYmplY3RNYXA7CisgICAgICAgIG1fYWN0aXZlRG9tT2Jq
ZWN0TWFwID0gJm1fc3RhdGljQWN0aXZlRG9tT2JqZWN0TWFwOworI2lmIEVOQUJMRShTVkcpCisg
ICAgICAgIG1fZG9tU3ZnRWxlbWVudEluc3RhbmNlTWFwID0gJm1fc3RhdGljRG9tU3ZnRWxlbWVu
dEluc3RhbmNlTWFwOworICAgICAgICBtX2RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwID0gJm1f
c3RhdGljRG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXA7CisjZW5kaWYKKyAgICB9CisKK3ByaXZh
dGU6CisgICAgSW50ZXJuYWxET01XcmFwcGVyTWFwPE5vZGU+IG1fc3RhdGljRG9tTm9kZU1hcDsK
KyAgICBJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4gbV9zdGF0aWNEb21PYmplY3RNYXA7Cisg
ICAgSW50ZXJuYWxET01XcmFwcGVyTWFwPHZvaWQ+IG1fc3RhdGljQWN0aXZlRG9tT2JqZWN0TWFw
OworICAgIEludGVybmFsRE9NV3JhcHBlck1hcDxTVkdFbGVtZW50SW5zdGFuY2U+IG1fc3RhdGlj
RG9tU3ZnRWxlbWVudEluc3RhbmNlTWFwOworICAgIEludGVybmFsRE9NV3JhcHBlck1hcDx2b2lk
PiBtX3N0YXRpY0RvbVN2Z09iamVjdFdpdGhDb250ZXh0TWFwOworfTsKKworREVGSU5FX1NUQVRJ
Q19MT0NBTChXVEY6OlRocmVhZFNwZWNpZmljPE5vbk1haW5UaHJlYWRTcGVjaWZpY0RPTURhdGE+
LCB0aHJlYWRTcGVjaWZpY0RPTURhdGEsICgpKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0
YXRpYyB2b2lkIGhhbmRsZVdlYWtPYmplY3RJbk93bmluZ1RocmVhZChUaHJlYWRTcGVjaWZpY0RP
TURhdGE6OkRPTVdyYXBwZXJNYXBUeXBlIG1hcFR5cGUsIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVy
VHlwZSBvYmplY3RUeXBlLCBUKik7CisKK1RocmVhZFNwZWNpZmljRE9NRGF0YSYgZ2V0VGhyZWFk
U3BlY2lmaWNET01EYXRhKCkKK3sKKyAgICBpZiAoV1RGOjppc01haW5UaHJlYWQoKSkgeworICAg
ICAgICBERUZJTkVfU1RBVElDX0xPQ0FMKE1haW5UaHJlYWRTcGVjaWZpY0RPTURhdGEsIG1haW5U
aHJlYWRTcGVjaWZpY0RPTURhdGEsICgpKTsKKyAgICAgICAgcmV0dXJuIG1haW5UaHJlYWRTcGVj
aWZpY0RPTURhdGE7CisgICAgfQorICAgIHJldHVybiAqdGhyZWFkU3BlY2lmaWNET01EYXRhOwor
fQorCit0ZW1wbGF0ZSA8Y2xhc3MgS2V5VHlwZT4KK3ZvaWQgVGhyZWFkU3BlY2lmaWNET01EYXRh
OjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8S2V5VHlwZT46OmZvcmdldChLZXlUeXBlKiBvYmplY3Qp
Cit7CisgICAgRE9NV3JhcHBlck1hcDxLZXlUeXBlPjo6Zm9yZ2V0KG9iamVjdCk7CisKKyAgICBU
aHJlYWRTcGVjaWZpY0RPTURhdGE6OkRlbGF5ZWRPYmplY3RNYXAmIGRlbGF5ZWRPYmplY3RNYXAg
PSBnZXRUaHJlYWRTcGVjaWZpY0RPTURhdGEoKS5kZWxheWVkT2JqZWN0TWFwKCk7CisgICAgZGVs
YXllZE9iamVjdE1hcC50YWtlKG9iamVjdCk7Cit9CisKK0RPTVdyYXBwZXJNYXA8Tm9kZT4mIGdl
dERPTU5vZGVNYXAoKQoreworICAgIHJldHVybiBnZXRUaHJlYWRTcGVjaWZpY0RPTURhdGEoKS5k
b21Ob2RlTWFwKCk7Cit9CisKK0RPTVdyYXBwZXJNYXA8dm9pZD4mIGdldERPTU9iamVjdE1hcCgp
Cit7CisgICAgcmV0dXJuIGdldFRocmVhZFNwZWNpZmljRE9NRGF0YSgpLmRvbU9iamVjdE1hcCgp
OworfQorCitET01XcmFwcGVyTWFwPHZvaWQ+JiBnZXRBY3RpdmVET01PYmplY3RNYXAoKQorewor
ICAgIHJldHVybiBnZXRUaHJlYWRTcGVjaWZpY0RPTURhdGEoKS5hY3RpdmVEb21PYmplY3RNYXAo
KTsKK30KKworI2lmIEVOQUJMRShTVkcpCitET01XcmFwcGVyTWFwPFNWR0VsZW1lbnRJbnN0YW5j
ZT4mIGdldERPTVNWR0VsZW1lbnRJbnN0YW5jZU1hcCgpCit7CisgICAgcmV0dXJuIGdldFRocmVh
ZFNwZWNpZmljRE9NRGF0YSgpLmRvbVN2Z0VsZW1lbnRJbnN0YW5jZU1hcCgpOworfQorCitzdGF0
aWMgdm9pZCB3ZWFrU1ZHRWxlbWVudEluc3RhbmNlQ2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8djg6
OlZhbHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0KQoreworICAgIFNWR0VsZW1lbnRJbnN0
YW5jZSogaW5zdGFuY2UgPSBzdGF0aWNfY2FzdDxTVkdFbGVtZW50SW5zdGFuY2UqPihkb21PYmpl
Y3QpOworCisgICAgVGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8
U1ZHRWxlbWVudEluc3RhbmNlPiYgbWFwID0gc3RhdGljX2Nhc3Q8VGhyZWFkU3BlY2lmaWNET01E
YXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8U1ZHRWxlbWVudEluc3RhbmNlPiY+KGdldERPTVNW
R0VsZW1lbnRJbnN0YW5jZU1hcCgpKTsKKyAgICBpZiAobWFwLmNvbnRhaW5zKGluc3RhbmNlKSkg
eworICAgICAgICBpbnN0YW5jZS0+ZGVyZWYoKTsKKyAgICAgICAgbWFwLmZvcmdldE9ubHkoaW5z
dGFuY2UpOworICAgIH0gZWxzZQorICAgICAgICBoYW5kbGVXZWFrT2JqZWN0SW5Pd25pbmdUaHJl
YWQoVGhyZWFkU3BlY2lmaWNET01EYXRhOjpET01TVkdFbGVtZW50SW5zdGFuY2VNYXAsIFY4Q2xh
c3NJbmRleDo6U1ZHRUxFTUVOVElOU1RBTkNFLCBpbnN0YW5jZSk7Cit9CisKKy8vIE1hcCBvZiBT
Vkcgb2JqZWN0cyB3aXRoIGNvbnRleHRzIHRvIFY4IG9iamVjdHMKK0RPTVdyYXBwZXJNYXA8dm9p
ZD4mIGdldERPTVNWR09iamVjdFdpdGhDb250ZXh0TWFwKCkKK3sKKyAgICByZXR1cm4gZ2V0VGhy
ZWFkU3BlY2lmaWNET01EYXRhKCkuZG9tU3ZnT2JqZWN0V2l0aENvbnRleHRNYXAoKTsKK30KKwor
c3RhdGljIHZvaWQgd2Vha1NWR09iamVjdFdpdGhDb250ZXh0Q2FsbGJhY2sodjg6OlBlcnNpc3Rl
bnQ8djg6OlZhbHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0KQoreworICAgIHY4OjpIYW5k
bGVTY29wZSBzY29wZTsKKyAgICBBU1NFUlQodjhPYmplY3QtPklzT2JqZWN0KCkpOworCisgICAg
VjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOFByb3h5OjpHZXRET01XcmFwcGVy
VHlwZSh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KHY4T2JqZWN0KSk7CisKKyAgICBUaHJl
YWRTcGVjaWZpY0RPTURhdGE6OkludGVybmFsRE9NV3JhcHBlck1hcDx2b2lkPiYgbWFwID0gc3Rh
dGljX2Nhc3Q8VGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9p
ZD4mPihnZXRET01TVkdPYmplY3RXaXRoQ29udGV4dE1hcCgpKTsKKyAgICBpZiAobWFwLmNvbnRh
aW5zKGRvbU9iamVjdCkpIHsKKyAgICAgICAgLy8gVGhlIGZvcmdldCBmdW5jdGlvbiByZW1vdmVz
IG9iamVjdCBmcm9tIHRoZSBtYXAgYW5kIGRpc3Bvc2VzIHRoZSB3cmFwcGVyLgorICAgICAgICBt
YXAuZm9yZ2V0T25seShkb21PYmplY3QpOworCisgICAgICAgIHN3aXRjaCAodHlwZSkgeworI2Rl
ZmluZSBNYWtlQ2FzZSh0eXBlLCBuYW1lKSAgICAgXAorICAgICAgICAgICAgY2FzZSBWOENsYXNz
SW5kZXg6OnR5cGU6IHN0YXRpY19jYXN0PG5hbWUqPihkb21PYmplY3QpLT5kZXJlZigpOyBicmVh
azsKKyAgICAgICAgU1ZHX09CSkVDVF9UWVBFUyhNYWtlQ2FzZSkKKyN1bmRlZiBNYWtlQ2FzZQor
I2RlZmluZSBNYWtlQ2FzZSh0eXBlLCBuYW1lKSAgICAgXAorICAgICAgICAgICAgY2FzZSBWOENs
YXNzSW5kZXg6OnR5cGU6ICAgIFwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxWOFNWR1BP
RFR5cGVXcmFwcGVyPG5hbWU+Kj4oZG9tT2JqZWN0KS0+ZGVyZWYoKTsgYnJlYWs7CisgICAgICAg
IFNWR19QT0RfTkFUSVZFX1RZUEVTKE1ha2VDYXNlKQorI3VuZGVmIE1ha2VDYXNlCisgICAgICAg
IGRlZmF1bHQ6CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlCisgICAgICAgIGhhbmRsZVdlYWtPYmplY3RJ
bk93bmluZ1RocmVhZChUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkRPTVNWR09iamVjdFdpdGhDb250
ZXh0TWFwLCB0eXBlLCBkb21PYmplY3QpOworfQorI2VuZGlmIC8vIEVOQUJMRShTVkcpCisKKy8v
IENhbGxlZCB3aGVuIHRoZSBkZWFkIG9iamVjdCBpcyBub3QgaW4gR0MgdGhyZWFkJ3MgbWFwLiBH
byB0aHJvdWdoIGFsbCB0aHJlYWQgbWFwcyB0byBmaW5kIHRoZSBvbmUgY29udGFpbmluZyBpdC4K
Ky8vIFRoZW4gY2xlYXIgdGhlIEpTIHJlZmVyZW5jZSBhbmQgcHVzaCB0aGUgRE9NIG9iamVjdCBp
bnRvIHRoZSBkZWxheWVkIHF1ZXVlIGZvciBpdCB0byBiZSBkZXJlZi1lZCBhdCBsYXRlciB0aW1l
IGZyb20gdGhlIG93bmluZyB0aHJlYWQuCisvLyAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIEdD
IHRocmVhZCBpcyBub3QgdGhlIG93bmluZyB0aHJlYWQuCisvLyAqIFRoaXMgY2FuIGJlIGNhbGxl
ZCBvbiBhbnkgdGhyZWFkIHRoYXQgaGFzIEdDIHJ1bm5pbmcuCisvLyAqIE9ubHkgb25lIFY4IGlu
c3RhbmNlIGlzIHJ1bm5pbmcgYXQgYSB0aW1lIGR1ZSB0byBWODo6TG9ja2VyLiBTbyB3ZSBkb24n
dCBuZWVkIHRvIHdvcnJ5IGFib3V0IGNvbmN1cnJlbmN5LgordGVtcGxhdGU8dHlwZW5hbWUgVD4K
K3N0YXRpYyB2b2lkIGhhbmRsZVdlYWtPYmplY3RJbk93bmluZ1RocmVhZChUaHJlYWRTcGVjaWZp
Y0RPTURhdGE6OkRPTVdyYXBwZXJNYXBUeXBlIG1hcFR5cGUsIFY4Q2xhc3NJbmRleDo6VjhXcmFw
cGVyVHlwZSBvYmplY3RUeXBlLCBUKiBvYmplY3QpCit7CisgICAgV1RGOjpNdXRleExvY2tlciBs
b2NrZXIoZG9tVGhyZWFkTWFwTXV0ZXgoKSk7CisgICAgZm9yICh0eXBlbmFtZSBET01UaHJlYWRN
YXA6Oml0ZXJhdG9yIGl0ZXIoZG9tVGhyZWFkTWFwKCkuYmVnaW4oKSk7IGl0ZXIgIT0gZG9tVGhy
ZWFkTWFwKCkuZW5kKCk7ICsraXRlcikgeworICAgICAgICBXVEY6OlRocmVhZElkZW50aWZpZXIg
dGhyZWFkSUQgPSBpdGVyLT5maXJzdDsKKyAgICAgICAgVGhyZWFkU3BlY2lmaWNET01EYXRhKiB0
aHJlYWREYXRhID0gaXRlci0+c2Vjb25kOworCisgICAgICAgIC8vIFNraXAgdGhlIGN1cnJlbnQg
dGhyZWFkIHRoYXQgaXMgR0MgdGhyZWFkLgorICAgICAgICBpZiAodGhyZWFkSUQgPT0gV1RGOjpj
dXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgICAgIEFTU0VSVCghc3RhdGljX2Nhc3Q8RE9NV3Jh
cHBlck1hcDxUPio+KHRocmVhZERhdGEtPmdldERPTVdyYXBwZXJNYXAobWFwVHlwZSkpLT5jb250
YWlucyhvYmplY3QpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAg
ICAgVGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8VD4qIGRvbU1h
cCA9IHN0YXRpY19jYXN0PFRocmVhZFNwZWNpZmljRE9NRGF0YTo6SW50ZXJuYWxET01XcmFwcGVy
TWFwPFQ+Kj4odGhyZWFkRGF0YS0+Z2V0RE9NV3JhcHBlck1hcChtYXBUeXBlKSk7CisgICAgICAg
IGlmIChkb21NYXAtPmNvbnRhaW5zKG9iamVjdCkpIHsKKyAgICAgICAgICAgIC8vIENsZWFyIHRo
ZSBKUyByZWZlcmVuY2UuCisgICAgICAgICAgICBkb21NYXAtPmZvcmdldE9ubHkob2JqZWN0KTsK
KworICAgICAgICAgICAgLy8gUHVzaCBpbnRvIHRoZSBkZWxheWVkIHF1ZXVlLgorICAgICAgICAg
ICAgdGhyZWFkRGF0YS0+ZGVsYXllZE9iamVjdE1hcCgpLnNldChvYmplY3QsIG9iamVjdFR5cGUp
OworCisgICAgICAgICAgICAvLyBQb3N0IGEgdGFzayB0byB0aGUgb3duaW5nIHRocmVhZCBpbiBv
cmRlciB0byBwcm9jZXNzIHRoZSBkZWxheWVkIHF1ZXVlLgorICAgICAgICAgICAgLy8gRklYTUU6
IEZvciBub3csIHdlIGNhbiBvbmx5IHBvc3QgdG8gbWFpbiB0aHJlYWQgZHVlIHRvIFdURiB0YXNr
IHBvc3RpbmcgbGltaXRhdGlvbi4gV2Ugd2lsbCBmaXggdGhpcyB3aGVuIHdlIHdvcmsgb24gbmVz
dGVkIHdvcmtlci4KKyAgICAgICAgICAgIGlmICghdGhyZWFkRGF0YS0+ZGVsYXllZFByb2Nlc3Np
bmdTY2hlZHVsZWQoKSkgeworICAgICAgICAgICAgICAgIHRocmVhZERhdGEtPnNldERlbGF5ZWRQ
cm9jZXNzaW5nU2NoZWR1bGVkKHRydWUpOworICAgICAgICAgICAgICAgIGlmICh0aHJlYWREYXRh
LT5pc01haW5UaHJlYWQoKSkKKyAgICAgICAgICAgICAgICAgICAgV1RGOjpjYWxsT25NYWluVGhy
ZWFkKCZkZXJlZkRlbGF5ZWRPYmplY3RzSW5DdXJyZW50VGhyZWFkLCAwKTsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIENhbGxl
ZCB3aGVuIHRoZSBvYmplY3QgaXMgbmVhciBkZWF0aCAobm90IHJlYWNoYWJsZSBmcm9tIEpTIHJv
b3RzKS4KKy8vIEl0IGlzIHRpbWUgdG8gcmVtb3ZlIHRoZSBlbnRyeSBmcm9tIHRoZSB0YWJsZSBh
bmQgZGlzcG9zZSB0aGUgaGFuZGxlLgorc3RhdGljIHZvaWQgd2Vha0RPTU9iamVjdENhbGxiYWNr
KHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCkKK3sK
KyAgICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgQVNTRVJUKHY4T2JqZWN0LT5Jc09iamVj
dCgpKTsKKworICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhQcm94eTo6
R2V0RE9NV3JhcHBlclR5cGUodjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCkp
OworCisgICAgVGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9p
ZD4mIG1hcCA9IHN0YXRpY19jYXN0PFRocmVhZFNwZWNpZmljRE9NRGF0YTo6SW50ZXJuYWxET01X
cmFwcGVyTWFwPHZvaWQ+Jj4oZ2V0RE9NT2JqZWN0TWFwKCkpOworICAgIGlmIChtYXAuY29udGFp
bnMoZG9tT2JqZWN0KSkgeworICAgICAgICAvLyBUaGUgZm9yZ2V0IGZ1bmN0aW9uIHJlbW92ZXMg
b2JqZWN0IGZyb20gdGhlIG1hcCBhbmQgZGlzcG9zZXMgdGhlIHdyYXBwZXIuCisgICAgICAgIG1h
cC5mb3JnZXRPbmx5KGRvbU9iamVjdCk7CisKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisjZGVm
aW5lIE1ha2VDYXNlKHR5cGUsIG5hbWUpICAgXAorICAgICAgICAgICAgY2FzZSBWOENsYXNzSW5k
ZXg6OnR5cGU6IHN0YXRpY19jYXN0PG5hbWUqPihkb21PYmplY3QpLT5kZXJlZigpOyBicmVhazsK
KyAgICAgICAgRE9NX09CSkVDVF9UWVBFUyhNYWtlQ2FzZSkKKyN1bmRlZiBNYWtlQ2FzZQorICAg
ICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZQorICAgICAgICBoYW5kbGVXZWFrT2Jq
ZWN0SW5Pd25pbmdUaHJlYWQoVGhyZWFkU3BlY2lmaWNET01EYXRhOjpET01PYmplY3RNYXAsIHR5
cGUsIGRvbU9iamVjdCk7Cit9CisKK3ZvaWQgd2Vha0FjdGl2ZURPTU9iamVjdENhbGxiYWNrKHY4
OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9iamVjdCkKK3sKKyAg
ICB2ODo6SGFuZGxlU2NvcGUgc2NvcGU7CisgICAgQVNTRVJUKHY4T2JqZWN0LT5Jc09iamVjdCgp
KTsKKworICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhQcm94eTo6R2V0
RE9NV3JhcHBlclR5cGUodjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCkpOwor
CisgICAgVGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdyYXBwZXJNYXA8dm9pZD4m
IG1hcCA9IHN0YXRpY19jYXN0PFRocmVhZFNwZWNpZmljRE9NRGF0YTo6SW50ZXJuYWxET01XcmFw
cGVyTWFwPHZvaWQ+Jj4oZ2V0QWN0aXZlRE9NT2JqZWN0TWFwKCkpOworICAgIGlmIChtYXAuY29u
dGFpbnMoZG9tT2JqZWN0KSkgeworICAgICAgICAvLyBUaGUgZm9yZ2V0IGZ1bmN0aW9uIHJlbW92
ZXMgb2JqZWN0IGZyb20gdGhlIG1hcCBhbmQgZGlzcG9zZXMgdGhlIHdyYXBwZXIuCisgICAgICAg
IG1hcC5mb3JnZXRPbmx5KGRvbU9iamVjdCk7CisKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7Cisj
ZGVmaW5lIE1ha2VDYXNlKHR5cGUsIG5hbWUpICAgXAorICAgICAgICAgICAgY2FzZSBWOENsYXNz
SW5kZXg6OnR5cGU6IHN0YXRpY19jYXN0PG5hbWUqPihkb21PYmplY3QpLT5kZXJlZigpOyBicmVh
azsKKyAgICAgICAgQUNUSVZFX0RPTV9PQkpFQ1RfVFlQRVMoTWFrZUNhc2UpCisjdW5kZWYgTWFr
ZUNhc2UKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgp
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UKKyAgICAgICAgaGFu
ZGxlV2Vha09iamVjdEluT3duaW5nVGhyZWFkKFRocmVhZFNwZWNpZmljRE9NRGF0YTo6QWN0aXZl
RE9NT2JqZWN0TWFwLCB0eXBlLCBkb21PYmplY3QpOworfQorCitzdGF0aWMgdm9pZCB3ZWFrTm9k
ZUNhbGxiYWNrKHY4OjpQZXJzaXN0ZW50PHY4OjpWYWx1ZT4gdjhPYmplY3QsIHZvaWQqIGRvbU9i
amVjdCkKK3sKKyAgICBOb2RlKiBub2RlID0gc3RhdGljX2Nhc3Q8Tm9kZSo+KGRvbU9iamVjdCk7
CisKKyAgICBUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkludGVybmFsRE9NV3JhcHBlck1hcDxOb2Rl
PiYgbWFwID0gc3RhdGljX2Nhc3Q8VGhyZWFkU3BlY2lmaWNET01EYXRhOjpJbnRlcm5hbERPTVdy
YXBwZXJNYXA8Tm9kZT4mPihnZXRET01Ob2RlTWFwKCkpOworICAgIGlmIChtYXAuY29udGFpbnMo
bm9kZSkpIHsKKyAgICAgICAgbWFwLmZvcmdldE9ubHkobm9kZSk7CisgICAgICAgIG5vZGUtPmRl
cmVmKCk7CisgICAgfSBlbHNlCisgICAgICAgIGhhbmRsZVdlYWtPYmplY3RJbk93bmluZ1RocmVh
ZDxOb2RlPihUaHJlYWRTcGVjaWZpY0RPTURhdGE6OkRPTU5vZGVNYXAsIFY4Q2xhc3NJbmRleDo6
Tk9ERSwgbm9kZSk7Cit9CisKK3N0YXRpYyB2b2lkIGRlcmVmT2JqZWN0KFY4Q2xhc3NJbmRleDo6
VjhXcmFwcGVyVHlwZSB0eXBlLCB2b2lkKiBkb21PYmplY3QpCit7CisgICAgc3dpdGNoICh0eXBl
KSB7CisgICAgY2FzZSBWOENsYXNzSW5kZXg6Ok5PREU6CisgICAgICAgIHN0YXRpY19jYXN0PE5v
ZGUqPihkb21PYmplY3QpLT5kZXJlZigpOworICAgICAgICBicmVhazsKKworI2RlZmluZSBNYWtl
Q2FzZSh0eXBlLCBuYW1lKSAgIFwKKyAgICAgICAgY2FzZSBWOENsYXNzSW5kZXg6OnR5cGU6IHN0
YXRpY19jYXN0PG5hbWUqPihkb21PYmplY3QpLT5kZXJlZigpOyBicmVhazsKKyAgICBET01fT0JK
RUNUX1RZUEVTKE1ha2VDYXNlKSAgIC8vIFRoaXMgaW5jbHVkZXMgYm90aCBhY3RpdmUgYW5kIG5v
bi1hY3RpdmUuCisjdW5kZWYgTWFrZUNhc2UKKworI2lmIEVOQUJMRShTVkcpCisjZGVmaW5lIE1h
a2VDYXNlKHR5cGUsIG5hbWUpICAgICBcCisgICAgICAgIGNhc2UgVjhDbGFzc0luZGV4Ojp0eXBl
OiBzdGF0aWNfY2FzdDxuYW1lKj4oZG9tT2JqZWN0KS0+ZGVyZWYoKTsgYnJlYWs7CisgICAgU1ZH
X09CSkVDVF9UWVBFUyhNYWtlQ2FzZSkgICAvLyBUaGlzIGFsc28gaW5jbHVkZXMgU1ZHRWxlbWVu
dEluc3RhbmNlLgorI3VuZGVmIE1ha2VDYXNlCisKKyNkZWZpbmUgTWFrZUNhc2UodHlwZSwgbmFt
ZSkgICAgIFwKKyAgICAgICAgY2FzZSBWOENsYXNzSW5kZXg6OnR5cGU6ICAgIFwKKyAgICAgICAg
ICAgIHN0YXRpY19jYXN0PFY4U1ZHUE9EVHlwZVdyYXBwZXI8bmFtZT4qPihkb21PYmplY3QpLT5k
ZXJlZigpOyBicmVhazsKKyAgICBTVkdfUE9EX05BVElWRV9UWVBFUyhNYWtlQ2FzZSkKKyN1bmRl
ZiBNYWtlQ2FzZQorI2VuZGlmCisKKyAgICBkZWZhdWx0OgorICAgICAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBkZXJlZkRl
bGF5ZWRPYmplY3RzKCkKK3sKKyAgICBXVEY6Ok11dGV4TG9ja2VyIGxvY2tlcihkb21UaHJlYWRN
YXBNdXRleCgpKTsKKworICAgIGdldFRocmVhZFNwZWNpZmljRE9NRGF0YSgpLnNldERlbGF5ZWRQ
cm9jZXNzaW5nU2NoZWR1bGVkKGZhbHNlKTsKKworICAgIFRocmVhZFNwZWNpZmljRE9NRGF0YTo6
RGVsYXllZE9iamVjdE1hcCYgZGVsYXllZE9iamVjdE1hcCA9IGdldFRocmVhZFNwZWNpZmljRE9N
RGF0YSgpLmRlbGF5ZWRPYmplY3RNYXAoKTsKKyAgICBmb3IgKFRocmVhZFNwZWNpZmljRE9NRGF0
YTo6RGVsYXllZE9iamVjdE1hcDo6aXRlcmF0b3IgaXRlcihkZWxheWVkT2JqZWN0TWFwLmJlZ2lu
KCkpOyBpdGVyICE9IGRlbGF5ZWRPYmplY3RNYXAuZW5kKCk7ICsraXRlcikgeworICAgICAgICBk
ZXJlZk9iamVjdChpdGVyLT5zZWNvbmQsIGl0ZXItPmZpcnN0KTsKKyAgICB9CisgICAgZGVsYXll
ZE9iamVjdE1hcC5jbGVhcigpOworfQorCitzdGF0aWMgdm9pZCBkZXJlZkRlbGF5ZWRPYmplY3Rz
SW5DdXJyZW50VGhyZWFkKHZvaWQqKQoreworICAgIGRlcmVmRGVsYXllZE9iamVjdHMoKTsKK30K
KwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0YXRpYyB2b2lkIHJlbW92ZU9iamVjdHNGcm9tV3Jh
cHBlck1hcChET01XcmFwcGVyTWFwPFQ+JiBkb21NYXApCit7CisgICAgZm9yICh0eXBlbmFtZSBX
VEY6Okhhc2hNYXA8VCosIHY4OjpPYmplY3QqPjo6aXRlcmF0b3IgaXRlcihkb21NYXAuaW1wbCgp
LmJlZ2luKCkpOyBpdGVyICE9IGRvbU1hcC5pbXBsKCkuZW5kKCk7ICsraXRlcikgeworICAgICAg
ICBUKiBkb21PYmplY3QgPSBzdGF0aWNfY2FzdDxUKj4oaXRlci0+Zmlyc3QpOworICAgICAgICB2
ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiB2OE9iamVjdChpdGVyLT5zZWNvbmQpOworCisgICAg
ICAgIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlID0gVjhQcm94eTo6R2V0RE9NV3Jh
cHBlclR5cGUodjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdCh2OE9iamVjdCkpOworCisgICAg
ICAgIC8vIERlcmVmIHRoZSBET00gb2JqZWN0LgorICAgICAgICBkZXJlZk9iamVjdCh0eXBlLCBk
b21PYmplY3QpOworCisgICAgICAgIC8vIENsZWFyIHRoZSBKUyB3cmFwcGVyLgorICAgICAgICB2
OE9iamVjdC5EaXNwb3NlKCk7CisgICAgfQorICAgIGRvbU1hcC5pbXBsKCkuY2xlYXIoKTsKK30K
Kworc3RhdGljIHZvaWQgcmVtb3ZlQWxsRE9NT2JqZWN0c0luQ3VycmVudFRocmVhZEhlbHBlcigp
Cit7CisgICAgdjg6OkhhbmRsZVNjb3BlIHNjb3BlOworCisgICAgLy8gRGVyZWYgYWxsIG9iamVj
dHMgaW4gdGhlIGRlbGF5ZWQgcXVldWUuCisgICAgZGVyZWZEZWxheWVkT2JqZWN0cygpOworCisg
ICAgLy8gUmVtb3ZlIGFsbCBET00gbm9kZXMuCisgICAgcmVtb3ZlT2JqZWN0c0Zyb21XcmFwcGVy
TWFwPE5vZGU+KGdldERPTU5vZGVNYXAoKSk7CisKKyAgICAvLyBSZW1vdmUgYWxsIERPTSBvYmpl
Y3RzIGluIHRoZSB3cmFwcGVyIG1hcC4KKyAgICByZW1vdmVPYmplY3RzRnJvbVdyYXBwZXJNYXA8
dm9pZD4oZ2V0RE9NT2JqZWN0TWFwKCkpOworCisgICAgLy8gUmVtb3ZlIGFsbCBhY3RpdmUgRE9N
IG9iamVjdHMgaW4gdGhlIHdyYXBwZXIgbWFwLgorICAgIHJlbW92ZU9iamVjdHNGcm9tV3JhcHBl
ck1hcDx2b2lkPihnZXRBY3RpdmVET01PYmplY3RNYXAoKSk7CisKKyNpZiBFTkFCTEUoU1ZHKQor
ICAgIC8vIFJlbW92ZSBhbGwgU1ZHIGVsZW1lbnQgaW5zdGFuY2VzIGluIHRoZSB3cmFwcGVyIG1h
cC4KKyAgICByZW1vdmVPYmplY3RzRnJvbVdyYXBwZXJNYXA8U1ZHRWxlbWVudEluc3RhbmNlPihn
ZXRET01TVkdFbGVtZW50SW5zdGFuY2VNYXAoKSk7CisKKyAgICAvLyBSZW1vdmUgYWxsIFNWRyBv
YmplY3RzIHdpdGggY29udGV4dCBpbiB0aGUgd3JhcHBlciBtYXAuCisgICAgcmVtb3ZlT2JqZWN0
c0Zyb21XcmFwcGVyTWFwPHZvaWQ+KGdldERPTVNWR09iamVjdFdpdGhDb250ZXh0TWFwKCkpOwor
I2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZUFsbERPTU9iamVjdHNJbkN1cnJlbnRUaHJl
YWQoKQoreworICAgIC8vIFVzZSB0aGUgbG9ja2VyIG9ubHkgaWYgaXQgaGFzIGFscmVhZHkgYmVl
biBpbnZva2VkIGJlZm9yZSwgYXMgYnkgd29ya2VyIHRocmVhZC4KKyAgICBpZiAodjg6OkxvY2tl
cjo6SXNBY3RpdmUoKSkgeworICAgICAgICB2ODo6TG9ja2VyIGxvY2tlcjsKKyAgICAgICAgcmVt
b3ZlQWxsRE9NT2JqZWN0c0luQ3VycmVudFRocmVhZEhlbHBlcigpOworICAgIH0gZWxzZQorICAg
ICAgICByZW1vdmVBbGxET01PYmplY3RzSW5DdXJyZW50VGhyZWFkSGVscGVyKCk7Cit9CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvVjhE
T01NYXAuaCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvVjhET01NYXAuaApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwLi45MDlmYmNkCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9i
aW5kaW5ncy92OC9WOERPTU1hcC5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgor
ICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9m
IGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBw
cm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBw
cmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFY4RE9NTWFwX2gK
KyNkZWZpbmUgVjhET01NYXBfaAorCisjaW5jbHVkZSAiZG9tX3dyYXBwZXJfbWFwLmgiCisKKyNp
bmNsdWRlIDx2OC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisgICAgY2xhc3MgTm9kZTsKKyNp
ZiBFTkFCTEUoU1ZHKQorICAgIGNsYXNzIFNWR0VsZW1lbnRJbnN0YW5jZTsKKyNlbmRpZgorCisg
ICAgLy8gQ2FsbGJhY2sgd2hlbiBKUyB3cmFwcGVyIG9mIGFjdGl2ZSBET00gb2JqZWN0IGlzIGRl
YWQuCisgICAgdm9pZCB3ZWFrQWN0aXZlRE9NT2JqZWN0Q2FsbGJhY2sodjg6OlBlcnNpc3RlbnQ8
djg6OlZhbHVlPiB2OE9iamVjdCwgdm9pZCogZG9tT2JqZWN0KTsKKworICAgIC8vIEEgbWFwIGZy
b20gRE9NIG5vZGUgdG8gaXRzIEpTIHdyYXBwZXIuCisgICAgRE9NV3JhcHBlck1hcDxOb2RlPiYg
Z2V0RE9NTm9kZU1hcCgpOworCisgICAgLy8gQSBtYXAgZnJvbSBhIERPTSBvYmplY3QgKG5vbi1u
b2RlKSB0byBpdHMgSlMgd3JhcHBlci4gVGhpcyBtYXAgZG9lcyBub3QgY29udGFpbiB0aGUgRE9N
IG9iamVjdHMgd2hpY2ggY2FuIGhhdmUgcGVuZGluZyBhY3Rpdml0eSAoYWN0aXZlIGRvbSBvYmpl
Y3RzKS4KKyAgICBET01XcmFwcGVyTWFwPHZvaWQ+JiBnZXRET01PYmplY3RNYXAoKTsKKworICAg
IC8vIEEgbWFwIGZyb20gYSBET00gb2JqZWN0IHRvIGl0cyBKUyB3cmFwcGVyIGZvciBET00gb2Jq
ZWN0cyB3aGljaCBjYW4gaGF2ZSBwZW5kaW5nIGFjdGl2aXR5LgorICAgIERPTVdyYXBwZXJNYXA8
dm9pZD4mIGdldEFjdGl2ZURPTU9iamVjdE1hcCgpOworCisjaWYgRU5BQkxFKFNWRykKKyAgICAv
LyBBIG1hcCBmb3IgU1ZHRWxlbWVudEluc3RhbmNlcyB0byBpdHMgSlMgd3JhcHBlci4KKyAgICBE
T01XcmFwcGVyTWFwPFNWR0VsZW1lbnRJbnN0YW5jZT4mIGdldERPTVNWR0VsZW1lbnRJbnN0YW5j
ZU1hcCgpOworCisgICAgLy8gTWFwIG9mIFNWRyBvYmplY3RzIHdpdGggY29udGV4dHMgdG8gVjgg
b2JqZWN0cy4KKyAgICBET01XcmFwcGVyTWFwPHZvaWQ+JiBnZXRET01TVkdPYmplY3RXaXRoQ29u
dGV4dE1hcCgpOworI2VuZGlmCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBW
OERPTU1hcF9oCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>