<?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>213777</bug_id>
          
          <creation_ts>2020-06-30 02:05:56 -0700</creation_ts>
          <short_desc>[GStreamer] Rewrite mediastreamsrc element</short_desc>
          <delta_ts>2020-07-02 01:22:24 -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>Platform</component>
          <version>WebKit 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>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Philippe Normand">pnormand</reporter>
          <assigned_to name="Philippe Normand">pnormand</assigned_to>
          <cc>calvaris</cc>
    
    <cc>cgarcia</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>glenn</cc>
    
    <cc>gustavo</cc>
    
    <cc>hta</cc>
    
    <cc>jer.noble</cc>
    
    <cc>menard</cc>
    
    <cc>philipj</cc>
    
    <cc>sergio</cc>
    
    <cc>tommyw</cc>
    
    <cc>vjaquez</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1667506</commentid>
    <comment_count>0</comment_count>
    <who name="Philippe Normand">pnormand</who>
    <bug_when>2020-06-30 02:05:56 -0700</bug_when>
    <thetext>There are mem leaks, raw pointers all around... I have a refactoring.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1667508</commentid>
    <comment_count>1</comment_count>
      <attachid>403182</attachid>
    <who name="Philippe Normand">pnormand</who>
    <bug_when>2020-06-30 02:15:05 -0700</bug_when>
    <thetext>Created attachment 403182
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1667879</commentid>
    <comment_count>2</comment_count>
      <attachid>403182</attachid>
    <who name="Xabier Rodríguez Calvar">calvaris</who>
    <bug_when>2020-07-01 02:36:40 -0700</bug_when>
    <thetext>Comment on attachment 403182
Patch

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

&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:5
&gt; + * Copyright (C) 2020 Igalia S.L.
&gt;   * Author: Thibault Saunier &lt;tsaunier@igalia.com&gt;
&gt;   * Author: Alejandro G. Castro &lt;alex@igalia.com&gt;

Though I think authors are not needed here, your rewrite is substantial and I think you can add yourself here.

&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:53
&gt;  static GstTagList* mediaStreamTrackPrivateGetTags(MediaStreamTrackPrivate* track)

Now that you&apos;re reworking smart pointers, it might be a good and wild idea to make this function return a GRefPtr and when you need to return it, you can just call .release() on the returned value of this function. I think that way we are making explicit that the tags are allocated and transfer the ownership to the smart pointer. Then you have to make the release explicit but in case you don&apos;t do it and they are accidentally kept till the end of the function, they are released automatically. I am not completely sure of this but let me know what you think about it. Obviously, when you adopt this below, you would need to remove the adopt.

&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:183
&gt; +    InternalSource(bool isCaptureTrack)
&gt; +    {
&gt; +        ASSERT(!m_src);
&gt; +        m_src = gst_element_factory_make(&quot;appsrc&quot;, nullptr);

Considering this is a constructor, I think this assertion does not make sense.

&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:184
&gt; +        if (!GST_IS_APP_SRC(m_src.get()))

I think this is a huge GStreamer configuration problem that would make InternalSource completely useless and faulty. I think the proper think to do here is a RELEASE_ASSERT_WITH_MESSAGE and let it crash by giving the hint of why we can&apos;t continue running. I say this because below we have the src-&gt;get method that is not checking if we&apos;re returning a valid source (which could lead to nullptr deferencing) and we&apos;re also ASSERTing in other methods. I think doing this here is the right thing to do and we can also forget about the validity of the source in all the other methods.

&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:187
&gt; +        g_object_set(m_src.get(), &quot;is-live&quot;, true, &quot;format&quot;, GST_FORMAT_TIME, &quot;emit-signals&quot;, true, &quot;min-percent&quot;, 100,

I think you should use TRUE and TRUE here.

&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:200
&gt; +        if (!m_src)
&gt; +            return;

Remove as per comment above.

&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:212
&gt; +        m_src = nullptr;

Not needed.

&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:215
&gt; +    GstElement* src() const { return m_src.get(); }

I think, for coherence with the rest of the code, we should call this method get().

&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:219
&gt; +        ASSERT(m_src);

Remove as per comment above.

&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:268
&gt; +    GUniquePtr&lt;GstFlowCombiner&gt; flowCombiner;

I think it is safe to move this to GRefPtr (and maybe moving all appearances of this as well).

&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:289
&gt; +static char* webkitMediaStreamSrcUriGetUri(GstURIHandler* handler)

I don&apos;t really know why the design of GstURIHandlerInterface returns here a new string instead of a const char*. You could let people copy it in case they need it.

Nothing we can do anyway, sigh.

&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:369
&gt; +        priv-&gt;track-&gt;removeObserver(*priv-&gt;mediaStreamTrackObserver.get());

I think you don&apos;t need the .get() here as std::unique_ptr implements the operator*

&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:441
&gt; +    static Atomic&lt;uint32_t&gt; padId;

nextPadId

&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:503
&gt; +        auto data = makeUnique&lt;ProbeData&gt;(GST_ELEMENT_CAST(self), padTemplate, track);
&gt; +        gst_pad_add_probe(pad.get(), GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, reinterpret_cast&lt;GstPadProbeCallback&gt;(webkitMediaStreamSrcPadProbeCb), data.release(), nullptr);

I think this is wrong. You&apos;re creating a pointer, releasing the pointer info the gst_pad_add_probe, which makes it a leaked pointer (even if it was created as a unique_ptr, it is released and ownership does not belong to the unique_ptr anymore) because you are not proviving a GDestroyNotify function which should delete the probe data. Summing up, creating a unique_ptr to release it here does not give you magical automatic deletion, you need to do it manually and for that I would avoind the unique_ptr, just new the struct and provide GDestroyNotify function (you could even make a static method of the struct called destroyNotifyCb, for example, and pass it instead of the nullptr).

&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:514
&gt; +        source.addAudioSampleObserver(*priv-&gt;mediaStreamTrackObserver.get());

can remove the .get()

&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:517
&gt; +        source.addVideoSampleObserver(*priv-&gt;mediaStreamTrackObserver.get());

ditto.

&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:562
&gt; +        self-&gt;priv-&gt;audioSrc = WTF::nullopt;

You can use .clear()

&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:564
&gt; +        self-&gt;priv-&gt;videoSrc = WTF::nullopt;

You can use .clear()</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1667880</commentid>
    <comment_count>3</comment_count>
      <attachid>403182</attachid>
    <who name="Philippe Normand">pnormand</who>
    <bug_when>2020-07-01 03:10:06 -0700</bug_when>
    <thetext>Comment on attachment 403182
Patch

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

&gt;&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:53
&gt;&gt;  static GstTagList* mediaStreamTrackPrivateGetTags(MediaStreamTrackPrivate* track)
&gt; 
&gt; Now that you&apos;re reworking smart pointers, it might be a good and wild idea to make this function return a GRefPtr and when you need to return it, you can just call .release() on the returned value of this function. I think that way we are making explicit that the tags are allocated and transfer the ownership to the smart pointer. Then you have to make the release explicit but in case you don&apos;t do it and they are accidentally kept till the end of the function, they are released automatically. I am not completely sure of this but let me know what you think about it. Obviously, when you adopt this below, you would need to remove the adopt.

There is no release() in GRefPtr. However there is a leakRef(). Is this what you mean? Anyway I&apos;m not sure this is worth the ref-churn here, to be honest.

&gt;&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:268
&gt;&gt; +    GUniquePtr&lt;GstFlowCombiner&gt; flowCombiner;
&gt; 
&gt; I think it is safe to move this to GRefPtr (and maybe moving all appearances of this as well).

Why? I think we can avoid useless ref-churn here. And elsewhere we use this type as a GUniquePtr as well.

&gt;&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:562
&gt;&gt; +        self-&gt;priv-&gt;audioSrc = WTF::nullopt;
&gt; 
&gt; You can use .clear()

this is a private method in Optional, there&apos;s a reset() though :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1667897</commentid>
    <comment_count>4</comment_count>
    <who name="Xabier Rodríguez Calvar">calvaris</who>
    <bug_when>2020-07-01 05:48:24 -0700</bug_when>
    <thetext>(In reply to Philippe Normand from comment #3)
&gt; Comment on attachment 403182 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=403182&amp;action=review
&gt; 
&gt; &gt;&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:53
&gt; &gt;&gt;  static GstTagList* mediaStreamTrackPrivateGetTags(MediaStreamTrackPrivate* track)
&gt; &gt; 
&gt; &gt; Now that you&apos;re reworking smart pointers, it might be a good and wild idea to make this function return a GRefPtr and when you need to return it, you can just call .release() on the returned value of this function. I think that way we are making explicit that the tags are allocated and transfer the ownership to the smart pointer. Then you have to make the release explicit but in case you don&apos;t do it and they are accidentally kept till the end of the function, they are released automatically. I am not completely sure of this but let me know what you think about it. Obviously, when you adopt this below, you would need to remove the adopt.
&gt; 
&gt; There is no release() in GRefPtr. However there is a leakRef(). Is this what
&gt; you mean?

Yes.

&gt; Anyway I&apos;m not sure this is worth the ref-churn here, to be honest.

I have no strong opinion about it. It&apos;s only that that it gives me the creeps leaking return variables in big chunks of code as this one. Anyway, even we don&apos;t add it, we should definitely add WARN_UNUSED_RETURN to this kind of methods.

&gt; &gt;&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:268
&gt; &gt;&gt; +    GUniquePtr&lt;GstFlowCombiner&gt; flowCombiner;
&gt; &gt; 
&gt; &gt; I think it is safe to move this to GRefPtr (and maybe moving all appearances of this as well).
&gt; 
&gt; Why? I think we can avoid useless ref-churn here. And elsewhere we use this
&gt; type as a GUniquePtr as well.

By using _new and _free you&apos;re not avoiding ref and unref, actually the implementation is as follows:

void
gst_flow_combiner_free (GstFlowCombiner * combiner)
{
  gst_flow_combiner_unref (combiner);
}

I am not strongly against using GUniquePtr instead of GRefPtr (if we go for the latter we should not forget to add GstFlowCombiner to GRefPtrGStreamer.h). So far the code is not using them but it gives the me creeps that we can do something weird. _free is clearly legacy and this should be used with ref and unref. I think we should to GRefPtr here and move the other GUniquePtr instances to GRefPtr but this could be for another bug.

&gt; &gt;&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:562
&gt; &gt;&gt; +        self-&gt;priv-&gt;audioSrc = WTF::nullopt;
&gt; &gt; 
&gt; &gt; You can use .clear()
&gt; 
&gt; this is a private method in Optional, there&apos;s a reset() though :)

Yes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1667918</commentid>
    <comment_count>5</comment_count>
      <attachid>403182</attachid>
    <who name="Philippe Normand">pnormand</who>
    <bug_when>2020-07-01 07:11:41 -0700</bug_when>
    <thetext>Comment on attachment 403182
Patch

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

&gt;&gt;&gt;&gt; Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp:268
&gt;&gt;&gt;&gt; +    GUniquePtr&lt;GstFlowCombiner&gt; flowCombiner;
&gt;&gt;&gt; 
&gt;&gt;&gt; I think it is safe to move this to GRefPtr (and maybe moving all appearances of this as well).
&gt;&gt; 
&gt;&gt; Why? I think we can avoid useless ref-churn here. And elsewhere we use this type as a GUniquePtr as well.
&gt; 
&gt; By using _new and _free you&apos;re not avoiding ref and unref, actually the implementation is as follows:
&gt; 
&gt; void
&gt; gst_flow_combiner_free (GstFlowCombiner * combiner)
&gt; {
&gt;   gst_flow_combiner_unref (combiner);
&gt; }
&gt; 
&gt; I am not strongly against using GUniquePtr instead of GRefPtr (if we go for the latter we should not forget to add GstFlowCombiner to GRefPtrGStreamer.h). So far the code is not using them but it gives the me creeps that we can do something weird. _free is clearly legacy and this should be used with ref and unref. I think we should to GRefPtr here and move the other GUniquePtr instances to GRefPtr but this could be for another bug.

I think I did a bad job at explaining myself again... My apologies. Let&apos;s try again.
Here this flowCombiner has a clear, unique, owner. Switching it to GRefPtr would add one extra ref and one extra unref call, IIUC the magics of GRefPtr. I don&apos;t think this is needed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1668183</commentid>
    <comment_count>6</comment_count>
    <who name="Philippe Normand">pnormand</who>
    <bug_when>2020-07-02 01:21:25 -0700</bug_when>
    <thetext>Committed r263836: &lt;https://trac.webkit.org/changeset/263836&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1668184</commentid>
    <comment_count>7</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2020-07-02 01:22:24 -0700</bug_when>
    <thetext>&lt;rdar://problem/65024038&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>403182</attachid>
            <date>2020-06-30 02:15:05 -0700</date>
            <delta_ts>2020-07-01 02:36:40 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-213777-20200630021504.patch</filename>
            <type>text/plain</type>
            <size>48973</size>
            <attacher name="Philippe Normand">pnormand</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjYzNzM0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggM2FlNDkxMjY5YTdmZmMw
MDE2YmNlMDY2NGVlOWQ5MTc1NDk5MTRmOS4uYzUxOTkxZmQ1YWM2NTBkNWViYTBjMDliNDk2YmE0
Mzk3OWY3NTU3YyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDU5IEBACisyMDIwLTA2LTMwICBQaGls
aXBwZSBOb3JtYW5kICA8cG5vcm1hbmRAaWdhbGlhLmNvbT4KKworICAgICAgICBbR1N0cmVhbWVy
XSBSZXdyaXRlIG1lZGlhc3RyZWFtc3JjIGVsZW1lbnQKKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIxMzc3NworCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uYWxpdHkgcmVt
YWlucyB0aGUgc2FtZSwgZGVzaWduLXdpc2UuIFRoaXMgaXMgbW9zdGx5IGEgcmVmYWN0b3JpbmcK
KyAgICAgICAgc3dpdGNoaW5nIHRvIHNtYXJ0IHBvaW50ZXJzIGFzIG11Y2ggYXMgcG9zc2libGUg
YW5kIHRyeWluZyB0byBjb21wbHkgd2l0aCBXZWJLaXQgY29kZSBzdHlsZQorICAgICAgICBndWlk
ZWxpbmVzLgorCisgICAgICAgIFRoZSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoaXMgZWxlbWVudCB3
YXMgbGVha2luZyBwYWQgdGVtcGxhdGVzIGFuZCBzdGlja3kgc3RyZWFtLXN0YXJ0CisgICAgICAg
IGV2ZW50cyAoaW4gd2Via2l0TWVkaWFTdHJlYW1TcmNUcmFja0VuZGVkKS4KKworICAgICAgICBU
aGUgTElCV0VCUlRDIGlmZGVmIGd1YXJkcyB3ZXJlIHJlbW92ZWQgYXMgd2VsbCwgYmVjYXVzZSB0
aGVyZSdzIG5vIGFjdHVhbCBsaWJ3ZWJydGMKKyAgICAgICAgZGVwZW5kZW5jeSBpbnZvbHZlZCBp
biB0aGlzIGNvZGUuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzLCBleGlzdGluZyB3ZWJydGMgYW5k
IGZhc3QvbWVkaWFzdHJlYW0gdGVzdHMgY292ZXIgdGhpcyBwYXRjaC4KKworICAgICAgICAqIHBs
YXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9NZWRpYVBsYXllclByaXZhdGVHU3RyZWFtZXIuY3Bw
OgorICAgICAgICAqIHBsYXRmb3JtL21lZGlhc3RyZWFtL2dzdHJlYW1lci9HU3RyZWFtZXJNZWRp
YVN0cmVhbVNvdXJjZS5jcHA6CisgICAgICAgIChtZWRpYVN0cmVhbVRyYWNrUHJpdmF0ZUdldFRh
Z3MpOgorICAgICAgICAod2Via2l0TWVkaWFTdHJlYW1OZXcpOgorICAgICAgICAoV2ViS2l0TWVk
aWFTdHJlYW1UcmFja09ic2VydmVyOjpXZWJLaXRNZWRpYVN0cmVhbVRyYWNrT2JzZXJ2ZXIpOgor
ICAgICAgICAoV2ViS2l0TWVkaWFTdHJlYW1PYnNlcnZlcjo6V2ViS2l0TWVkaWFTdHJlYW1PYnNl
cnZlcik6CisgICAgICAgIChJbnRlcm5hbFNvdXJjZTo6SW50ZXJuYWxTb3VyY2UpOgorICAgICAg
ICAoSW50ZXJuYWxTb3VyY2U6On5JbnRlcm5hbFNvdXJjZSk6CisgICAgICAgIChJbnRlcm5hbFNv
dXJjZTo6c3JjIGNvbnN0KToKKyAgICAgICAgKEludGVybmFsU291cmNlOjpwdXNoU2FtcGxlKToK
KyAgICAgICAgKHdlYmtpdE1lZGlhU3RyZWFtU3JjVXJpR2V0VHlwZSk6CisgICAgICAgICh3ZWJr
aXRNZWRpYVN0cmVhbVNyY1VyaUdldFByb3RvY29scyk6CisgICAgICAgICh3ZWJraXRNZWRpYVN0
cmVhbVNyY1VyaUdldFVyaSk6CisgICAgICAgICh3ZWJraXRNZWRpYVN0cmVhbVNyY1VyaVNldFVy
aSk6CisgICAgICAgICh3ZWJraXRNZWRpYVN0cmVhbVNyY1VyaUhhbmRsZXJJbml0KToKKyAgICAg
ICAgKHdlYmtpdE1lZGlhU3RyZWFtU3JjU2V0UHJvcGVydHkpOgorICAgICAgICAod2Via2l0TWVk
aWFTdHJlYW1TcmNHZXRQcm9wZXJ0eSk6CisgICAgICAgICh3ZWJraXRNZWRpYVN0cmVhbVNyY0Nv
bnN0cnVjdGVkKToKKyAgICAgICAgKHN0b3BPYnNlcnZpbmdUcmFja3MpOgorICAgICAgICAod2Vi
a2l0TWVkaWFTdHJlYW1TcmNGaW5hbGl6ZSk6CisgICAgICAgICh3ZWJraXRNZWRpYVN0cmVhbVNy
Y0NoYW5nZVN0YXRlKToKKyAgICAgICAgKHdlYmtpdF9tZWRpYV9zdHJlYW1fc3JjX2NsYXNzX2lu
aXQpOgorICAgICAgICAod2Via2l0TWVkaWFTdHJlYW1TcmNDaGFpbik6CisgICAgICAgICh3ZWJr
aXRNZWRpYVN0cmVhbVNyY0FkZFBhZCk6CisgICAgICAgIChQcm9iZURhdGE6OlByb2JlRGF0YSk6
CisgICAgICAgICh3ZWJraXRNZWRpYVN0cmVhbVNyY1BhZFByb2JlQ2IpOgorICAgICAgICAod2Vi
a2l0TWVkaWFTdHJlYW1TcmNTZXR1cFNyYyk6CisgICAgICAgICh3ZWJraXRNZWRpYVN0cmVhbVNy
Y1Bvc3RTdHJlYW1Db2xsZWN0aW9uKToKKyAgICAgICAgKHdlYmtpdE1lZGlhU3RyZWFtU3JjQWRk
VHJhY2spOgorICAgICAgICAod2Via2l0TWVkaWFTdHJlYW1TcmNSZW1vdmVUcmFja0J5VHlwZSk6
CisgICAgICAgICh3ZWJraXRNZWRpYVN0cmVhbVNyY1NldFN0cmVhbSk6CisgICAgICAgICh3ZWJr
aXRNZWRpYVN0cmVhbVNyY1B1c2hWaWRlb1NhbXBsZSk6CisgICAgICAgICh3ZWJraXRNZWRpYVN0
cmVhbVNyY1B1c2hBdWRpb1NhbXBsZSk6CisgICAgICAgICh3ZWJraXRNZWRpYVN0cmVhbVNyY1Ry
YWNrRW5kZWQpOgorICAgICAgICAod2Via2l0TWVkaWFTdHJlYW1TcmNOZXcpOgorICAgICAgICAq
IHBsYXRmb3JtL21lZGlhc3RyZWFtL2dzdHJlYW1lci9HU3RyZWFtZXJNZWRpYVN0cmVhbVNvdXJj
ZS5oOgorCiAyMDIwLTA2LTMwICBZb3Vlbm4gRmFibGV0ICA8eW91ZW5uQGFwcGxlLmNvbT4KIAog
ICAgICAgICBBZGQgVlA5IFdlYlJUQyBjb2RlYyBydW50aW1lIGZsYWcKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9NZWRpYVBsYXllclByaXZh
dGVHU3RyZWFtZXIuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVh
bWVyL01lZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1lci5jcHAKaW5kZXggYzIwYWZmY2QzNDc0Yzgz
YmQ1YTM1MzdhM2YyN2NlNWI3Y2M2ZjYyNC4uYTM0YzU1MjJhY2UxNDVmMDNiZjc3YzIxZTMzNjI1
M2Q5MDU5NjM2ZSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Z3N0cmVhbWVyL01lZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1lci5jcHAKKysrIGIvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL01lZGlhUGxheWVyUHJpdmF0ZUdTdHJl
YW1lci5jcHAKQEAgLTUzLDYgKzUzLDcgQEAKIAogI2lmIEVOQUJMRShNRURJQV9TVFJFQU0pCiAj
aW5jbHVkZSAiR1N0cmVhbWVyTWVkaWFTdHJlYW1Tb3VyY2UuaCIKKyNpbmNsdWRlICJNZWRpYVN0
cmVhbVByaXZhdGUuaCIKICNlbmRpZgogCiAjaWYgRU5BQkxFKE1FRElBX1NPVVJDRSkKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21lZGlhc3RyZWFtL2dzdHJlYW1lci9HU3Ry
ZWFtZXJNZWRpYVN0cmVhbVNvdXJjZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tZWRp
YXN0cmVhbS9nc3RyZWFtZXIvR1N0cmVhbWVyTWVkaWFTdHJlYW1Tb3VyY2UuY3BwCmluZGV4IDg5
ZDlmZmUxZDY2ZDIyODkwZmMyYzVlMWQ4OTFiYjIwOTBiMGY0YjIuLmE2MDBjODcyODBiYTRlYWQ1
NzFjZDA3ZDZiNTEwYTBiNTYyMzUyMDIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL21lZGlhc3RyZWFtL2dzdHJlYW1lci9HU3RyZWFtZXJNZWRpYVN0cmVhbVNvdXJjZS5jcHAK
KysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWVkaWFzdHJlYW0vZ3N0cmVhbWVyL0dTdHJl
YW1lck1lZGlhU3RyZWFtU291cmNlLmNwcApAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmln
aHQgKEMpIDIwMTggTWV0cm9sb2dpY2FsIEdyb3VwIEIuVi4KKyAqIENvcHlyaWdodCAoQykgMjAy
MCBJZ2FsaWEgUy5MLgogICogQXV0aG9yOiBUaGliYXVsdCBTYXVuaWVyIDx0c2F1bmllckBpZ2Fs
aWEuY29tPgogICogQXV0aG9yOiBBbGVqYW5kcm8gRy4gQ2FzdHJvIDxhbGV4QGlnYWxpYS5jb20+
CiAgKgpAQCAtMjAsNjQgKzIxLDU2IEBACiAgKi8KIAogI2luY2x1ZGUgImNvbmZpZy5oIgotCi0j
aWYgRU5BQkxFKFZJREVPKSAmJiBFTkFCTEUoTUVESUFfU1RSRUFNKSAmJiBVU0UoTElCV0VCUlRD
KSAmJiBVU0UoR1NUUkVBTUVSKQogI2luY2x1ZGUgIkdTdHJlYW1lck1lZGlhU3RyZWFtU291cmNl
LmgiCiAKKyNpZiBFTkFCTEUoVklERU8pICYmIEVOQUJMRShNRURJQV9TVFJFQU0pICYmIFVTRShH
U1RSRUFNRVIpCisKICNpbmNsdWRlICJBdWRpb1RyYWNrUHJpdmF0ZS5oIgogI2luY2x1ZGUgIkdT
dHJlYW1lckF1ZGlvRGF0YS5oIgogI2luY2x1ZGUgIkdTdHJlYW1lckNvbW1vbi5oIgogI2luY2x1
ZGUgIkdTdHJlYW1lclZpZGVvQ2FwdHVyZVNvdXJjZS5oIgogI2luY2x1ZGUgIk1lZGlhU2FtcGxl
R1N0cmVhbWVyLmgiCisjaW5jbHVkZSAiTWVkaWFTdHJlYW1Qcml2YXRlLmgiCisjaW5jbHVkZSAi
TWVkaWFTdHJlYW1UcmFja1ByaXZhdGUuaCIKICNpbmNsdWRlICJWaWRlb1RyYWNrUHJpdmF0ZS5o
IgogCiAjaW5jbHVkZSA8Z3N0L2FwcC9nc3RhcHBzcmMuaD4KLSNpbmNsdWRlIDxnc3QvYmFzZS9n
c3RmbG93Y29tYmluZXIuaD4KKyNpbmNsdWRlIDx3dGYvZ2xpYi9XVEZHVHlwZS5oPgogCi1uYW1l
c3BhY2UgV2ViQ29yZSB7Cit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKIAotc3RhdGljIHZvaWQg
d2Via2l0TWVkaWFTdHJlYW1TcmNQdXNoVmlkZW9TYW1wbGUoV2ViS2l0TWVkaWFTdHJlYW1TcmMq
IHNlbGYsIEdzdFNhbXBsZSogZ3N0c2FtcGxlKTsKLXN0YXRpYyB2b2lkIHdlYmtpdE1lZGlhU3Ry
ZWFtU3JjUHVzaEF1ZGlvU2FtcGxlKFdlYktpdE1lZGlhU3RyZWFtU3JjKiBzZWxmLCBHc3RTYW1w
bGUqIGdzdHNhbXBsZSk7Ci1zdGF0aWMgdm9pZCB3ZWJraXRNZWRpYVN0cmVhbVNyY1RyYWNrRW5k
ZWQoV2ViS2l0TWVkaWFTdHJlYW1TcmMqIHNlbGYsIE1lZGlhU3RyZWFtVHJhY2tQcml2YXRlJik7
Ci1zdGF0aWMgdm9pZCB3ZWJraXRNZWRpYVN0cmVhbVNyY1JlbW92ZVRyYWNrQnlUeXBlKFdlYktp
dE1lZGlhU3RyZWFtU3JjKiBzZWxmLCBSZWFsdGltZU1lZGlhU291cmNlOjpUeXBlIHRyYWNrVHlw
ZSk7CitzdGF0aWMgdm9pZCB3ZWJraXRNZWRpYVN0cmVhbVNyY1B1c2hWaWRlb1NhbXBsZShXZWJL
aXRNZWRpYVN0cmVhbVNyYyosIEdzdFNhbXBsZSopOworc3RhdGljIHZvaWQgd2Via2l0TWVkaWFT
dHJlYW1TcmNQdXNoQXVkaW9TYW1wbGUoV2ViS2l0TWVkaWFTdHJlYW1TcmMqLCBHc3RTYW1wbGUq
KTsKK3N0YXRpYyB2b2lkIHdlYmtpdE1lZGlhU3RyZWFtU3JjVHJhY2tFbmRlZChXZWJLaXRNZWRp
YVN0cmVhbVNyYyosIE1lZGlhU3RyZWFtVHJhY2tQcml2YXRlJik7CitzdGF0aWMgdm9pZCB3ZWJr
aXRNZWRpYVN0cmVhbVNyY1JlbW92ZVRyYWNrQnlUeXBlKFdlYktpdE1lZGlhU3RyZWFtU3JjKiwg
UmVhbHRpbWVNZWRpYVNvdXJjZTo6VHlwZSk7CiAKLXN0YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0
ZSB2aWRlb1NyY1RlbXBsYXRlID0gR1NUX1NUQVRJQ19QQURfVEVNUExBVEUoInZpZGVvX3NyYyIs
Ci0gICAgR1NUX1BBRF9TUkMsCi0gICAgR1NUX1BBRF9TT01FVElNRVMsCitzdGF0aWMgR3N0U3Rh
dGljUGFkVGVtcGxhdGUgdmlkZW9TcmNUZW1wbGF0ZSA9IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRF
KCJ2aWRlb19zcmMiLCBHU1RfUEFEX1NSQywgR1NUX1BBRF9TT01FVElNRVMsCiAgICAgR1NUX1NU
QVRJQ19DQVBTKCJ2aWRlby94LXJhdzt2aWRlby94LWgyNjQ7dmlkZW8veC12cDgiKSk7CiAKLXN0
YXRpYyBHc3RTdGF0aWNQYWRUZW1wbGF0ZSBhdWRpb1NyY1RlbXBsYXRlID0gR1NUX1NUQVRJQ19Q
QURfVEVNUExBVEUoImF1ZGlvX3NyYyIsCi0gICAgR1NUX1BBRF9TUkMsCi0gICAgR1NUX1BBRF9T
T01FVElNRVMsCitzdGF0aWMgR3N0U3RhdGljUGFkVGVtcGxhdGUgYXVkaW9TcmNUZW1wbGF0ZSA9
IEdTVF9TVEFUSUNfUEFEX1RFTVBMQVRFKCJhdWRpb19zcmMiLCBHU1RfUEFEX1NSQywgR1NUX1BB
RF9TT01FVElNRVMsCiAgICAgR1NUX1NUQVRJQ19DQVBTKCJhdWRpby94LXJhdyhBTlkpOyIpKTsK
IAogc3RhdGljIEdzdFRhZ0xpc3QqIG1lZGlhU3RyZWFtVHJhY2tQcml2YXRlR2V0VGFncyhNZWRp
YVN0cmVhbVRyYWNrUHJpdmF0ZSogdHJhY2spCiB7Ci0gICAgYXV0byB0YWdsaXN0ID0gZ3N0X3Rh
Z19saXN0X25ld19lbXB0eSgpOworICAgIGF1dG8qIHRhZ0xpc3QgPSBnc3RfdGFnX2xpc3RfbmV3
X2VtcHR5KCk7CiAKLSAgICBpZiAoIXRyYWNrLT5sYWJlbCgpLmlzRW1wdHkoKSkgewotICAgICAg
ICBnc3RfdGFnX2xpc3RfYWRkKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELAotICAgICAg
ICAgICAgR1NUX1RBR19USVRMRSwgdHJhY2stPmxhYmVsKCkudXRmOCgpLmRhdGEoKSwgbnVsbHB0
cik7Ci0gICAgfQorICAgIGlmICghdHJhY2stPmxhYmVsKCkuaXNFbXB0eSgpKQorICAgICAgICBn
c3RfdGFnX2xpc3RfYWRkKHRhZ0xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELCBHU1RfVEFHX1RJ
VExFLCB0cmFjay0+bGFiZWwoKS51dGY4KCkuZGF0YSgpLCBudWxscHRyKTsKIAotICAgIGlmICh0
cmFjay0+dHlwZSgpID09IFJlYWx0aW1lTWVkaWFTb3VyY2U6OlR5cGU6OkF1ZGlvKSB7Ci0gICAg
ICAgIGdzdF90YWdfbGlzdF9hZGQodGFnbGlzdCwgR1NUX1RBR19NRVJHRV9BUFBFTkQsIFdFQktJ
VF9NRURJQV9UUkFDS19UQUdfS0lORCwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oQXVk
aW9UcmFja1ByaXZhdGU6OktpbmQ6Ok1haW4pLCBudWxscHRyKTsKLSAgICB9IGVsc2UgaWYgKHRy
YWNrLT50eXBlKCkgPT0gUmVhbHRpbWVNZWRpYVNvdXJjZTo6VHlwZTo6VmlkZW8pIHsKLSAgICAg
ICAgZ3N0X3RhZ19saXN0X2FkZCh0YWdsaXN0LCBHU1RfVEFHX01FUkdFX0FQUEVORCwgV0VCS0lU
X01FRElBX1RSQUNLX1RBR19LSU5ELAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihWaWRl
b1RyYWNrUHJpdmF0ZTo6S2luZDo6TWFpbiksIG51bGxwdHIpOworICAgIGlmICh0cmFjay0+dHlw
ZSgpID09IFJlYWx0aW1lTWVkaWFTb3VyY2U6OlR5cGU6OkF1ZGlvKQorICAgICAgICBnc3RfdGFn
X2xpc3RfYWRkKHRhZ0xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQRU5ELCBXRUJLSVRfTUVESUFfVFJB
Q0tfVEFHX0tJTkQsIHN0YXRpY19jYXN0PGludD4oQXVkaW9UcmFja1ByaXZhdGU6OktpbmQ6Ok1h
aW4pLCBudWxscHRyKTsKKyAgICBlbHNlIGlmICh0cmFjay0+dHlwZSgpID09IFJlYWx0aW1lTWVk
aWFTb3VyY2U6OlR5cGU6OlZpZGVvKSB7CisgICAgICAgIGdzdF90YWdfbGlzdF9hZGQodGFnTGlz
dCwgR1NUX1RBR19NRVJHRV9BUFBFTkQsIFdFQktJVF9NRURJQV9UUkFDS19UQUdfS0lORCwgc3Rh
dGljX2Nhc3Q8aW50PihWaWRlb1RyYWNrUHJpdmF0ZTo6S2luZDo6TWFpbiksIG51bGxwdHIpOwog
CiAgICAgICAgIGlmICh0cmFjay0+aXNDYXB0dXJlVHJhY2soKSkgewotICAgICAgICAgICAgR1N0
cmVhbWVyVmlkZW9DYXB0dXJlU291cmNlJiBzb3VyY2UgPSBzdGF0aWNfY2FzdDxHU3RyZWFtZXJW
aWRlb0NhcHR1cmVTb3VyY2UmPigKLSAgICAgICAgICAgICAgICB0cmFjay0+c291cmNlKCkpOwot
Ci0gICAgICAgICAgICBnc3RfdGFnX2xpc3RfYWRkKHRhZ2xpc3QsIEdTVF9UQUdfTUVSR0VfQVBQ
RU5ELAotICAgICAgICAgICAgICAgIFdFQktJVF9NRURJQV9UUkFDS19UQUdfV0lEVEgsIHNvdXJj
ZS5zaXplKCkud2lkdGgoKSwKKyAgICAgICAgICAgIEdTdHJlYW1lclZpZGVvQ2FwdHVyZVNvdXJj
ZSYgc291cmNlID0gc3RhdGljX2Nhc3Q8R1N0cmVhbWVyVmlkZW9DYXB0dXJlU291cmNlJj4odHJh
Y2stPnNvdXJjZSgpKTsKKyAgICAgICAgICAgIGdzdF90YWdfbGlzdF9hZGQodGFnTGlzdCwgR1NU
X1RBR19NRVJHRV9BUFBFTkQsIFdFQktJVF9NRURJQV9UUkFDS19UQUdfV0lEVEgsIHNvdXJjZS5z
aXplKCkud2lkdGgoKSwKICAgICAgICAgICAgICAgICBXRUJLSVRfTUVESUFfVFJBQ0tfVEFHX0hF
SUdIVCwgc291cmNlLnNpemUoKS5oZWlnaHQoKSwgbnVsbHB0cik7CiAgICAgICAgIH0KICAgICB9
CiAKLSAgICByZXR1cm4gdGFnbGlzdDsKKyAgICBHU1RfREVCVUcoIlRyYWNrIHRhZ3M6ICUiIEdT
VF9QVFJfRk9STUFULCB0YWdMaXN0KTsKKyAgICByZXR1cm4gdGFnTGlzdDsKIH0KIAogR3N0U3Ry
ZWFtKiB3ZWJraXRNZWRpYVN0cmVhbU5ldyhNZWRpYVN0cmVhbVRyYWNrUHJpdmF0ZSogdHJhY2sp
CkBAIC05MywxNiArODYsMTMgQEAgR3N0U3RyZWFtKiB3ZWJraXRNZWRpYVN0cmVhbU5ldyhNZWRp
YVN0cmVhbVRyYWNrUHJpdmF0ZSogdHJhY2spCiAgICAgICAgIHR5cGUgPSBHU1RfU1RSRUFNX1RZ
UEVfVklERU87CiAgICAgfSBlbHNlIHsKICAgICAgICAgR1NUX0ZJWE1FKCJIYW5kbGUgJWQgdHlw
ZSIsIHN0YXRpY19jYXN0PGludD4odHJhY2stPnR5cGUoKSkpOwotCiAgICAgICAgIHJldHVybiBu
dWxscHRyOwogICAgIH0KIAotICAgIGF1dG8gZ3N0c3RyZWFtID0gKEdzdFN0cmVhbSopZ3N0X3N0
cmVhbV9uZXcodHJhY2stPmlkKCkudXRmOCgpLmRhdGEoKSwKLSAgICAgICAgY2Fwcy5nZXQoKSwg
dHlwZSwgR1NUX1NUUkVBTV9GTEFHX1NFTEVDVCk7CisgICAgYXV0byogc3RyZWFtID0gZ3N0X3N0
cmVhbV9uZXcodHJhY2stPmlkKCkudXRmOCgpLmRhdGEoKSwgY2Fwcy5nZXQoKSwgdHlwZSwgR1NU
X1NUUkVBTV9GTEFHX1NFTEVDVCk7CiAgICAgYXV0byB0YWdzID0gYWRvcHRHUmVmKG1lZGlhU3Ry
ZWFtVHJhY2tQcml2YXRlR2V0VGFncyh0cmFjaykpOwotICAgIGdzdF9zdHJlYW1fc2V0X3RhZ3Mo
Z3N0c3RyZWFtLCB0YWdzLmdldCgpKTsKLQotICAgIHJldHVybiBnc3RzdHJlYW07CisgICAgZ3N0
X3N0cmVhbV9zZXRfdGFncyhzdHJlYW0sIHRhZ3MuZ2V0KCkpOworICAgIHJldHVybiBzdHJlYW07
CiB9CiAKIGNsYXNzIFdlYktpdE1lZGlhU3RyZWFtVHJhY2tPYnNlcnZlcgpAQCAtMTEyLDE0ICsx
MDIsMTQgQEAgY2xhc3MgV2ViS2l0TWVkaWFTdHJlYW1UcmFja09ic2VydmVyCiAgICAgV1RGX01B
S0VfRkFTVF9BTExPQ0FURUQ7CiBwdWJsaWM6CiAgICAgdmlydHVhbCB+V2ViS2l0TWVkaWFTdHJl
YW1UcmFja09ic2VydmVyKCkgeyB9OwotICAgIFdlYktpdE1lZGlhU3RyZWFtVHJhY2tPYnNlcnZl
cihXZWJLaXRNZWRpYVN0cmVhbVNyYyogc3JjKQotICAgICAgICA6IG1fbWVkaWFTdHJlYW1TcmMo
c3JjKQotICAgICAgICAsIG1fZW5hYmxlZCh0cnVlKSB7IH0KKyAgICBXZWJLaXRNZWRpYVN0cmVh
bVRyYWNrT2JzZXJ2ZXIoR1JlZlB0cjxHc3RFbGVtZW50PiYmIHNyYykKKyAgICAgICAgOiBtX3Ny
YyhXVEZNb3ZlKHNyYykpIHsgfQogICAgIHZvaWQgdHJhY2tTdGFydGVkKE1lZGlhU3RyZWFtVHJh
Y2tQcml2YXRlJikgZmluYWwgeyB9OwogCiAgICAgdm9pZCB0cmFja0VuZGVkKE1lZGlhU3RyZWFt
VHJhY2tQcml2YXRlJiB0cmFjaykgZmluYWwKICAgICB7Ci0gICAgICAgIHdlYmtpdE1lZGlhU3Ry
ZWFtU3JjVHJhY2tFbmRlZChtX21lZGlhU3RyZWFtU3JjLCB0cmFjayk7CisgICAgICAgIGlmICht
X3NyYykKKyAgICAgICAgICAgIHdlYmtpdE1lZGlhU3RyZWFtU3JjVHJhY2tFbmRlZChXRUJLSVRf
TUVESUFfU1RSRUFNX1NSQyhtX3NyYy5nZXQoKSksIHRyYWNrKTsKICAgICB9CiAKICAgICB2b2lk
IHRyYWNrRW5hYmxlZENoYW5nZWQoTWVkaWFTdHJlYW1UcmFja1ByaXZhdGUmIHRyYWNrKSBmaW5h
bApAQCAtMTMzLDMwMSArMTIzLDI3OSBAQCBwdWJsaWM6CiAKICAgICB2b2lkIHZpZGVvU2FtcGxl
QXZhaWxhYmxlKE1lZGlhU2FtcGxlJiBzYW1wbGUpIGZpbmFsCiAgICAgewotICAgICAgICBpZiAo
IW1fZW5hYmxlZCkKKyAgICAgICAgaWYgKCFtX2VuYWJsZWQgfHwgIW1fc3JjKQogICAgICAgICAg
ICAgcmV0dXJuOwogCi0gICAgICAgIGF1dG8gZ3N0U2FtcGxlID0gc3RhdGljX2Nhc3Q8TWVkaWFT
YW1wbGVHU3RyZWFtZXIqPigmc2FtcGxlKS0+cGxhdGZvcm1TYW1wbGUoKS5zYW1wbGUuZ3N0U2Ft
cGxlOwotICAgICAgICB3ZWJraXRNZWRpYVN0cmVhbVNyY1B1c2hWaWRlb1NhbXBsZShtX21lZGlh
U3RyZWFtU3JjLCBnc3RTYW1wbGUpOworICAgICAgICBhdXRvKiBnc3RTYW1wbGUgPSBzdGF0aWNf
Y2FzdDxNZWRpYVNhbXBsZUdTdHJlYW1lcio+KCZzYW1wbGUpLT5wbGF0Zm9ybVNhbXBsZSgpLnNh
bXBsZS5nc3RTYW1wbGU7CisgICAgICAgIHdlYmtpdE1lZGlhU3RyZWFtU3JjUHVzaFZpZGVvU2Ft
cGxlKFdFQktJVF9NRURJQV9TVFJFQU1fU1JDKG1fc3JjLmdldCgpKSwgZ3N0U2FtcGxlKTsKICAg
ICB9CiAKICAgICB2b2lkIGF1ZGlvU2FtcGxlc0F2YWlsYWJsZShjb25zdCBNZWRpYVRpbWUmLCBj
b25zdCBQbGF0Zm9ybUF1ZGlvRGF0YSYgYXVkaW9EYXRhLCBjb25zdCBBdWRpb1N0cmVhbURlc2Ny
aXB0aW9uJiwgc2l6ZV90KSBmaW5hbAogICAgIHsKLSAgICAgICAgaWYgKCFtX2VuYWJsZWQpCisg
ICAgICAgIGlmICghbV9lbmFibGVkIHx8ICFtX3NyYykKICAgICAgICAgICAgIHJldHVybjsKIAog
ICAgICAgICBhdXRvIGRhdGEgPSBzdGF0aWNfY2FzdDxjb25zdCBHU3RyZWFtZXJBdWRpb0RhdGEm
PihhdWRpb0RhdGEpOwotICAgICAgICB3ZWJraXRNZWRpYVN0cmVhbVNyY1B1c2hBdWRpb1NhbXBs
ZShtX21lZGlhU3RyZWFtU3JjLCBkYXRhLmdldFNhbXBsZSgpKTsKKyAgICAgICAgd2Via2l0TWVk
aWFTdHJlYW1TcmNQdXNoQXVkaW9TYW1wbGUoV0VCS0lUX01FRElBX1NUUkVBTV9TUkMobV9zcmMu
Z2V0KCkpLCBkYXRhLmdldFNhbXBsZSgpKTsKICAgICB9CiAKIHByaXZhdGU6Ci0gICAgV2ViS2l0
TWVkaWFTdHJlYW1TcmMqIG1fbWVkaWFTdHJlYW1TcmM7Ci0gICAgYm9vbCBtX2VuYWJsZWQ7Cisg
ICAgR1JlZlB0cjxHc3RFbGVtZW50PiBtX3NyYzsKKyAgICBib29sIG1fZW5hYmxlZCB7IHRydWUg
fTsKIH07CiAKLWNsYXNzIFdlYktpdE1lZGlhU3RyZWFtT2JzZXJ2ZXIKLSAgICA6IHB1YmxpYyBN
ZWRpYVN0cmVhbVByaXZhdGU6Ok9ic2VydmVyIHsKK2NsYXNzIFdlYktpdE1lZGlhU3RyZWFtT2Jz
ZXJ2ZXIgOiBwdWJsaWMgTWVkaWFTdHJlYW1Qcml2YXRlOjpPYnNlcnZlciB7CiAgICAgV1RGX01B
S0VfRkFTVF9BTExPQ0FURUQ7CiBwdWJsaWM6CiAgICAgdmlydHVhbCB+V2ViS2l0TWVkaWFTdHJl
YW1PYnNlcnZlcigpIHsgfTsKLSAgICBXZWJLaXRNZWRpYVN0cmVhbU9ic2VydmVyKFdlYktpdE1l
ZGlhU3RyZWFtU3JjKiBzcmMpCi0gICAgICAgIDogbV9tZWRpYVN0cmVhbVNyYyhzcmMpIHsgfQor
ICAgIFdlYktpdE1lZGlhU3RyZWFtT2JzZXJ2ZXIoR1JlZlB0cjxHc3RFbGVtZW50PiYmIHNyYykK
KyAgICAgICAgOiBtX3NyYyhXVEZNb3ZlKHNyYykpIHsgfQogCi0gICAgdm9pZCBjaGFyYWN0ZXJp
c3RpY3NDaGFuZ2VkKCkgZmluYWwgeyBHU1RfREVCVUdfT0JKRUNUKG1fbWVkaWFTdHJlYW1TcmMs
ICJyZW5lZ290aWF0aW9uIHNob3VsZCBoYXBwZW4iKTsgfQorICAgIHZvaWQgY2hhcmFjdGVyaXN0
aWNzQ2hhbmdlZCgpIGZpbmFsCisgICAgeworICAgICAgICBpZiAobV9zcmMpCisgICAgICAgICAg
ICBHU1RfREVCVUdfT0JKRUNUKG1fc3JjLmdldCgpLCAicmVuZWdvdGlhdGlvbiBzaG91bGQgaGFw
cGVuIik7CisgICAgfQogICAgIHZvaWQgYWN0aXZlU3RhdHVzQ2hhbmdlZCgpIGZpbmFsIHsgfQog
CiAgICAgdm9pZCBkaWRBZGRUcmFjayhNZWRpYVN0cmVhbVRyYWNrUHJpdmF0ZSYgdHJhY2spIGZp
bmFsCiAgICAgewotICAgICAgICB3ZWJraXRNZWRpYVN0cmVhbVNyY0FkZFRyYWNrKG1fbWVkaWFT
dHJlYW1TcmMsICZ0cmFjaywgZmFsc2UpOworICAgICAgICBpZiAobV9zcmMpCisgICAgICAgICAg
ICB3ZWJraXRNZWRpYVN0cmVhbVNyY0FkZFRyYWNrKFdFQktJVF9NRURJQV9TVFJFQU1fU1JDKG1f
c3JjLmdldCgpKSwgJnRyYWNrLCBmYWxzZSk7CiAgICAgfQogCiAgICAgdm9pZCBkaWRSZW1vdmVU
cmFjayhNZWRpYVN0cmVhbVRyYWNrUHJpdmF0ZSYgdHJhY2spIGZpbmFsCiAgICAgewotICAgICAg
ICB3ZWJraXRNZWRpYVN0cmVhbVNyY1JlbW92ZVRyYWNrQnlUeXBlKG1fbWVkaWFTdHJlYW1TcmMs
IHRyYWNrLnR5cGUoKSk7CisgICAgICAgIGlmIChtX3NyYykKKyAgICAgICAgICAgIHdlYmtpdE1l
ZGlhU3RyZWFtU3JjUmVtb3ZlVHJhY2tCeVR5cGUoV0VCS0lUX01FRElBX1NUUkVBTV9TUkMobV9z
cmMuZ2V0KCkpLCB0cmFjay50eXBlKCkpOwogICAgIH0KIAogcHJpdmF0ZToKLSAgICBXZWJLaXRN
ZWRpYVN0cmVhbVNyYyogbV9tZWRpYVN0cmVhbVNyYzsKKyAgICBHUmVmUHRyPEdzdEVsZW1lbnQ+
IG1fc3JjOwogfTsKIAotdHlwZWRlZiBzdHJ1Y3QgX1dlYktpdE1lZGlhU3RyZWFtU3JjQ2xhc3Mg
V2ViS2l0TWVkaWFTdHJlYW1TcmNDbGFzczsKLXN0cnVjdCBfV2ViS2l0TWVkaWFTdHJlYW1TcmMg
ewotICAgIEdzdEJpbiBwYXJlbnRfaW5zdGFuY2U7CitjbGFzcyBJbnRlcm5hbFNvdXJjZSB7Cisg
ICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAgSW50ZXJuYWxTb3VyY2Uo
Ym9vbCBpc0NhcHR1cmVUcmFjaykKKyAgICB7CisgICAgICAgIEFTU0VSVCghbV9zcmMpOworICAg
ICAgICBtX3NyYyA9IGdzdF9lbGVtZW50X2ZhY3RvcnlfbWFrZSgiYXBwc3JjIiwgbnVsbHB0cik7
CisgICAgICAgIGlmICghR1NUX0lTX0FQUF9TUkMobV9zcmMuZ2V0KCkpKQorICAgICAgICAgICAg
cmV0dXJuOwogCi0gICAgZ2NoYXIqIHVyaTsKKyAgICAgICAgZ19vYmplY3Rfc2V0KG1fc3JjLmdl
dCgpLCAiaXMtbGl2ZSIsIHRydWUsICJmb3JtYXQiLCBHU1RfRk9STUFUX1RJTUUsICJlbWl0LXNp
Z25hbHMiLCB0cnVlLCAibWluLXBlcmNlbnQiLCAxMDAsCisgICAgICAgICAgICAiZG8tdGltZXN0
YW1wIiwgaXNDYXB0dXJlVHJhY2ssIG51bGxwdHIpOworICAgICAgICBnX3NpZ25hbF9jb25uZWN0
KG1fc3JjLmdldCgpLCAiZW5vdWdoLWRhdGEiLCBHX0NBTExCQUNLKCtbXShHc3RFbGVtZW50Kiwg
SW50ZXJuYWxTb3VyY2UqIGRhdGEpIHsKKyAgICAgICAgICAgIGRhdGEtPm1fZW5vdWdoRGF0YSA9
IHRydWU7CisgICAgICAgIH0pLCB0aGlzKTsKKyAgICAgICAgZ19zaWduYWxfY29ubmVjdChtX3Ny
Yy5nZXQoKSwgIm5lZWQtZGF0YSIsIEdfQ0FMTEJBQ0soK1tdKEdzdEVsZW1lbnQqLCB1bnNpZ25l
ZCwgSW50ZXJuYWxTb3VyY2UqIGRhdGEpIHsKKyAgICAgICAgICAgIGRhdGEtPm1fZW5vdWdoRGF0
YSA9IGZhbHNlOworICAgICAgICB9KSwgdGhpcyk7CisgICAgfQogCi0gICAgc3RydWN0IFNvdXJj
ZURhdGEgewotICAgICAgICBHUmVmUHRyPEdzdEVsZW1lbnQ+IG1fc3JjOwotICAgICAgICB2b2lk
IHJlc2V0KGJvb2wgaXNWaWRlbykKLSAgICAgICAgewotICAgICAgICAgICAgbV9maXJzdEJ1ZmZl
clB0cyA9IEdTVF9DTE9DS19USU1FX05PTkU7Ci0gICAgICAgICAgICBtX2lzVmlkZW8gPSBpc1Zp
ZGVvOworICAgIH5JbnRlcm5hbFNvdXJjZSgpCisgICAgeworICAgICAgICBpZiAoIW1fc3JjKQor
ICAgICAgICAgICAgcmV0dXJuOwogCi0gICAgICAgICAgICBpZiAoIW1fc3JjKQotICAgICAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgZ19zaWduYWxfaGFuZGxlcnNfZGlzY29ubmVjdF9tYXRj
aGVkKG1fc3JjLmdldCgpLCBHX1NJR05BTF9NQVRDSF9EQVRBLCAwLCAwLCBudWxscHRyLCBudWxs
cHRyLCB0aGlzKTsKIAorICAgICAgICBpZiAoYXV0byBwYXJlbnQgPSBhZG9wdEdSZWYoZ3N0X29i
amVjdF9nZXRfcGFyZW50KEdTVF9PQkpFQ1RfQ0FTVChtX3NyYy5nZXQoKSkpKSkgeworICAgICAg
ICAgICAgR1NUX1NUQVRFX0xPQ0soR1NUX0VMRU1FTlRfQ0FTVChwYXJlbnQuZ2V0KCkpKTsKICAg
ICAgICAgICAgIGdzdF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUobV9zcmMuZ2V0KCksIHRydWUp
OwogICAgICAgICAgICAgZ3N0X2VsZW1lbnRfc2V0X3N0YXRlKG1fc3JjLmdldCgpLCBHU1RfU1RB
VEVfTlVMTCk7Ci0gICAgICAgICAgICBhdXRvIHBhcmVudCA9IGFkb3B0R1JlZihnc3Rfb2JqZWN0
X2dldF9wYXJlbnQoR1NUX09CSkVDVF9DQVNUKG1fc3JjLmdldCgpKSkpOwotICAgICAgICAgICAg
aWYgKHBhcmVudCkKLSAgICAgICAgICAgICAgICBnc3RfYmluX3JlbW92ZShHU1RfQklOX0NBU1Qo
cGFyZW50LmdldCgpKSwgbV9zcmMuZ2V0KCkpOworICAgICAgICAgICAgZ3N0X2Jpbl9yZW1vdmUo
R1NUX0JJTl9DQVNUKHBhcmVudC5nZXQoKSksIG1fc3JjLmdldCgpKTsKICAgICAgICAgICAgIGdz
dF9lbGVtZW50X3NldF9sb2NrZWRfc3RhdGUobV9zcmMuZ2V0KCksIGZhbHNlKTsKLSAgICAgICAg
ICAgIG1fc3JjID0gbnVsbHB0cjsKKyAgICAgICAgICAgIEdTVF9TVEFURV9VTkxPQ0soR1NUX0VM
RU1FTlRfQ0FTVChwYXJlbnQuZ2V0KCkpKTsKICAgICAgICAgfQorICAgICAgICBtX3NyYyA9IG51
bGxwdHI7CisgICAgfQogCi0gICAgICAgIEdzdEVsZW1lbnQqIHNyYygpCi0gICAgICAgIHsKLSAg
ICAgICAgICAgIHJldHVybiBtX3NyYy5nZXQoKTsKLSAgICAgICAgfQorICAgIEdzdEVsZW1lbnQq
IHNyYygpIGNvbnN0IHsgcmV0dXJuIG1fc3JjLmdldCgpOyB9CiAKLSAgICAgICAgc3RhdGljIHZv
aWQgbmVlZERhdGFDYWxsYmFjayhXZWJLaXRNZWRpYVN0cmVhbVNyYzo6U291cmNlRGF0YSogc2Vs
ZiwgdW5zaWduZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNlbGYtPnNldEVub3VnaERhdGEo
ZmFsc2UpOwotICAgICAgICB9CisgICAgdm9pZCBwdXNoU2FtcGxlKEdzdFNhbXBsZSogc2FtcGxl
KQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fc3JjKTsKKyAgICAgICAgaWYgKCFtX3NyYykKKyAg
ICAgICAgICAgIHJldHVybjsKIAotICAgICAgICBzdGF0aWMgdm9pZCBlbm91Z2hEYXRhQ2FsbGJh
Y2soV2ViS2l0TWVkaWFTdHJlYW1TcmM6OlNvdXJjZURhdGEqIHNlbGYpCi0gICAgICAgIHsKLSAg
ICAgICAgICAgIHNlbGYtPnNldEVub3VnaERhdGEodHJ1ZSk7CisgICAgICAgIGJvb2wgZHJvcCA9
IG1fZW5vdWdoRGF0YTsKKyAgICAgICAgYXV0byogYnVmZmVyID0gZ3N0X3NhbXBsZV9nZXRfYnVm
ZmVyKHNhbXBsZSk7CisgICAgICAgIGF1dG8qIGNhcHMgPSBnc3Rfc2FtcGxlX2dldF9jYXBzKHNh
bXBsZSk7CisgICAgICAgIGlmICghR1NUX0NMT0NLX1RJTUVfSVNfVkFMSUQobV9maXJzdEJ1ZmZl
clB0cykpIHsKKyAgICAgICAgICAgIG1fZmlyc3RCdWZmZXJQdHMgPSBHU1RfQlVGRkVSX1BUUyhi
dWZmZXIpOworICAgICAgICAgICAgYXV0byBwYWQgPSBhZG9wdEdSZWYoZ3N0X2VsZW1lbnRfZ2V0
X3N0YXRpY19wYWQobV9zcmMuZ2V0KCksICJzcmMiKSk7CisgICAgICAgICAgICBnc3RfcGFkX3Nl
dF9vZmZzZXQocGFkLmdldCgpLCAtbV9maXJzdEJ1ZmZlclB0cyk7CiAgICAgICAgIH0KIAotICAg
ICAgICB2b2lkIGVuc3VyZUFwcFNyYygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFTU0VSVCgh
bV9zcmMpOwotICAgICAgICAgICAgbV9zcmMgPSBnc3RfZWxlbWVudF9mYWN0b3J5X21ha2UoImFw
cHNyYyIsIG51bGxwdHIpOwotICAgICAgICAgICAgaWYgKCFHU1RfSVNfQVBQX1NSQyhtX3NyYy5n
ZXQoKSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAoIW1faXNWaWRlbykK
KyAgICAgICAgICAgIG1faXNWaWRlbyA9IGRvQ2Fwc0hhdmVUeXBlKGNhcHMsICJ2aWRlbyIpOwog
Ci0gICAgICAgICAgICBnX29iamVjdF9zZXQobV9zcmMuZ2V0KCksICJpcy1saXZlIiwgdHJ1ZSwg
ImZvcm1hdCIsIEdTVF9GT1JNQVRfVElNRSwgImVtaXQtc2lnbmFscyIsIHRydWUsICJtaW4tcGVy
Y2VudCIsIDEwMCwgbnVsbHB0cik7Ci0gICAgICAgICAgICBnX3NpZ25hbF9jb25uZWN0X3N3YXBw
ZWQobV9zcmMuZ2V0KCksICJlbm91Z2gtZGF0YSIsIEdfQ0FMTEJBQ0soZW5vdWdoRGF0YUNhbGxi
YWNrKSwgdGhpcyk7Ci0gICAgICAgICAgICBnX3NpZ25hbF9jb25uZWN0X3N3YXBwZWQobV9zcmMu
Z2V0KCksICJuZWVkLWRhdGEiLCBHX0NBTExCQUNLKG5lZWREYXRhQ2FsbGJhY2spLCB0aGlzKTsK
LSAgICAgICAgfQorICAgICAgICBpZiAoKm1faXNWaWRlbyAmJiBkcm9wKQorICAgICAgICAgICAg
ZHJvcCA9IGRvQ2Fwc0hhdmVUeXBlKGNhcHMsICJ2aWRlby94LXJhdyIpIHx8IEdTVF9CVUZGRVJf
RkxBR19JU19TRVQoYnVmZmVyLCBHU1RfQlVGRkVSX0ZMQUdfREVMVEFfVU5JVCk7CiAKLSAgICAg
ICAgYm9vbCBpc1VzZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gISFtX3NyYzsK
KyAgICAgICAgaWYgKGRyb3ApIHsKKyAgICAgICAgICAgIG1fbmVlZHNEaXNjb250ID0gdHJ1ZTsK
KyAgICAgICAgICAgIEdTVF9JTkZPX09CSkVDVChtX3NyYy5nZXQoKSwgIiVzIHF1ZXVlIGZ1bGwg
YWxyZWFkeS4uLiBub3QgcHVzaGluZyIsICptX2lzVmlkZW8gPyAiVmlkZW8iIDogIkF1ZGlvIik7
CisgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KIAotICAgICAgICB2b2lkIHNldEVub3Vn
aERhdGEoYm9vbCBlbm91Z2gpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1fZW5vdWdoRGF0YSA9
IGVub3VnaDsKKyAgICAgICAgaWYgKG1fbmVlZHNEaXNjb250KSB7CisgICAgICAgICAgICBHU1Rf
QlVGRkVSX0ZMQUdfU0VUKGJ1ZmZlciwgR1NUX0JVRkZFUl9GTEFHX0RJU0NPTlQpOworICAgICAg
ICAgICAgbV9uZWVkc0Rpc2NvbnQgPSBmYWxzZTsKICAgICAgICAgfQogCi0gICAgICAgIHZvaWQg
cHVzaFNhbXBsZShHc3RTYW1wbGUgKnNhbXBsZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYg
KCFtX3NyYykKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0KLSAgICAgICAgICAgIGJvb2wgZHJv
cCA9IG1fZW5vdWdoRGF0YTsKLSAgICAgICAgICAgIGF1dG8gYnVmZmVyID0gZ3N0X3NhbXBsZV9n
ZXRfYnVmZmVyKHNhbXBsZSk7Ci0gICAgICAgICAgICBhdXRvIGNhcHMgPSBnc3Rfc2FtcGxlX2dl
dF9jYXBzKHNhbXBsZSk7Ci0gICAgICAgICAgICBpZiAoIUdTVF9DTE9DS19USU1FX0lTX1ZBTElE
KG1fZmlyc3RCdWZmZXJQdHMpKSB7Ci0gICAgICAgICAgICAgICAgbV9maXJzdEJ1ZmZlclB0cyA9
IEdTVF9CVUZGRVJfUFRTKGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgYXV0byBwYWQgPSBhZG9w
dEdSZWYoZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQobV9zcmMuZ2V0KCksICJzcmMiKSk7Ci0g
ICAgICAgICAgICAgICAgZ3N0X3BhZF9zZXRfb2Zmc2V0KHBhZC5nZXQoKSwgLW1fZmlyc3RCdWZm
ZXJQdHMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobV9pc1ZpZGVvICYmIGRy
b3ApIHsKLSAgICAgICAgICAgICAgICBkcm9wID0gKGdzdF9zdHJ1Y3R1cmVfaGFzX25hbWUoZ3N0
X2NhcHNfZ2V0X3N0cnVjdHVyZShjYXBzLCAwKSwgInZpZGVvL3gtcmF3IikKLSAgICAgICAgICAg
ICAgICAgICAgfHwgR1NUX0JVRkZFUl9GTEFHX0lTX1NFVChidWZmZXIsIEdTVF9CVUZGRVJfRkxB
R19ERUxUQV9VTklUKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChkcm9wKSB7
Ci0gICAgICAgICAgICAgICAgbV9uZWVkc0Rpc2NvbnQgPSB0cnVlOwotICAgICAgICAgICAgICAg
IEdTVF9JTkZPX09CSkVDVChtX3NyYy5nZXQoKSwgIiVzIHF1ZXVlIGZ1bGwgYWxyZWFkeS4uLiBu
b3QgcHVzaGluZyIsIG1faXNWaWRlbyA/ICJWaWRlbyIgOiAiQXVkaW8iKTsKLSAgICAgICAgICAg
ICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtX25lZWRzRGlz
Y29udCkgewotICAgICAgICAgICAgICAgIEdTVF9CVUZGRVJfRkxBR19TRVQoYnVmZmVyLCBHU1Rf
QlVGRkVSX0ZMQUdfRElTQ09OVCk7Ci0gICAgICAgICAgICAgICAgbV9uZWVkc0Rpc2NvbnQgPSBm
YWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZ3N0X2FwcF9zcmNfcHVzaF9zYW1w
bGUoR1NUX0FQUF9TUkMobV9zcmMuZ2V0KCkpLCBzYW1wbGUpOwotICAgICAgICB9Ci0gICAgcHJp
dmF0ZToKLSAgICAgICAgR3N0Q2xvY2tUaW1lIG1fZmlyc3RCdWZmZXJQdHM7Ci0gICAgICAgIGJv
b2wgbV9lbm91Z2hEYXRhOwotICAgICAgICBib29sIG1fbmVlZHNEaXNjb250OwotICAgICAgICBi
b29sIG1faXNWaWRlbzsKLSAgICB9OworICAgICAgICBnc3RfYXBwX3NyY19wdXNoX3NhbXBsZShH
U1RfQVBQX1NSQyhtX3NyYy5nZXQoKSksIHNhbXBsZSk7CisgICAgfQogCi0gICAgU291cmNlRGF0
YSBhdWRpb1NyYzsKLSAgICBTb3VyY2VEYXRhIHZpZGVvU3JjOworcHJpdmF0ZToKKyAgICBHUmVm
UHRyPEdzdEVsZW1lbnQ+IG1fc3JjOworICAgIEdzdENsb2NrVGltZSBtX2ZpcnN0QnVmZmVyUHRz
IHsgR1NUX0NMT0NLX1RJTUVfTk9ORSB9OworICAgIGJvb2wgbV9lbm91Z2hEYXRhIHsgZmFsc2Ug
fTsKKyAgICBib29sIG1fbmVlZHNEaXNjb250IHsgZmFsc2UgfTsKKyAgICBPcHRpb25hbDxib29s
PiBtX2lzVmlkZW87Cit9OwogCitzdHJ1Y3QgX1dlYktpdE1lZGlhU3RyZWFtU3JjUHJpdmF0ZSB7
CisgICAgQ1N0cmluZyB1cmk7CisgICAgT3B0aW9uYWw8SW50ZXJuYWxTb3VyY2U+IGF1ZGlvU3Jj
OworICAgIE9wdGlvbmFsPEludGVybmFsU291cmNlPiB2aWRlb1NyYzsKICAgICBzdGQ6OnVuaXF1
ZV9wdHI8V2ViS2l0TWVkaWFTdHJlYW1UcmFja09ic2VydmVyPiBtZWRpYVN0cmVhbVRyYWNrT2Jz
ZXJ2ZXI7CiAgICAgc3RkOjp1bmlxdWVfcHRyPFdlYktpdE1lZGlhU3RyZWFtT2JzZXJ2ZXI+IG1l
ZGlhU3RyZWFtT2JzZXJ2ZXI7Ci0gICAgdm9sYXRpbGUgZ2ludCBucGFkczsKICAgICBSZWZQdHI8
TWVkaWFTdHJlYW1Qcml2YXRlPiBzdHJlYW07CiAgICAgUmVmUHRyPE1lZGlhU3RyZWFtVHJhY2tQ
cml2YXRlPiB0cmFjazsKLQotICAgIEdzdEZsb3dDb21iaW5lciogZmxvd0NvbWJpbmVyOworICAg
IEdVbmlxdWVQdHI8R3N0Rmxvd0NvbWJpbmVyPiBmbG93Q29tYmluZXI7CiAgICAgR1JlZlB0cjxH
c3RTdHJlYW1Db2xsZWN0aW9uPiBzdHJlYW1Db2xsZWN0aW9uOwogfTsKIAotc3RydWN0IF9XZWJL
aXRNZWRpYVN0cmVhbVNyY0NsYXNzIHsKLSAgICBHc3RCaW5DbGFzcyBwYXJlbnRfY2xhc3M7Ci19
OwotCiBlbnVtIHsKICAgICBQUk9QXzAsCiAgICAgUFJPUF9JU19MSVZFLAogICAgIFBST1BfTEFT
VAogfTsKIAotc3RhdGljIEdzdFVSSVR5cGUgd2Via2l0X21lZGlhX3N0cmVhbV9zcmNfdXJpX2dl
dF90eXBlKEdUeXBlKQorc3RhdGljIEdzdFVSSVR5cGUgd2Via2l0TWVkaWFTdHJlYW1TcmNVcmlH
ZXRUeXBlKEdUeXBlKQogewogICAgIHJldHVybiBHU1RfVVJJX1NSQzsKIH0KIAotc3RhdGljIGNv
bnN0IGdjaGFyKiBjb25zdCogd2Via2l0X21lZGlhX3N0cmVhbV9zcmNfdXJpX2dldF9wcm90b2Nv
bHMoR1R5cGUpCitzdGF0aWMgY29uc3QgY2hhciogY29uc3QqIHdlYmtpdE1lZGlhU3RyZWFtU3Jj
VXJpR2V0UHJvdG9jb2xzKEdUeXBlKQogewotICAgIHN0YXRpYyBjb25zdCBnY2hhciogcHJvdG9j
b2xzW10gPSB7ICJtZWRpYXN0cmVhbSIsIG51bGxwdHIgfTsKLQorICAgIHN0YXRpYyBjb25zdCBj
aGFyKiBwcm90b2NvbHNbXSA9IHsgIm1lZGlhc3RyZWFtIiwgbnVsbHB0ciB9OwogICAgIHJldHVy
biBwcm90b2NvbHM7CiB9CiAKLXN0YXRpYyBnY2hhciogd2Via2l0X21lZGlhX3N0cmVhbV9zcmNf
dXJpX2dldF91cmkoR3N0VVJJSGFuZGxlciogaGFuZGxlcikKK3N0YXRpYyBjaGFyKiB3ZWJraXRN
ZWRpYVN0cmVhbVNyY1VyaUdldFVyaShHc3RVUklIYW5kbGVyKiBoYW5kbGVyKQogewogICAgIFdl
YktpdE1lZGlhU3RyZWFtU3JjKiBzZWxmID0gV0VCS0lUX01FRElBX1NUUkVBTV9TUkMoaGFuZGxl
cik7Ci0KLSAgICAvKiBGSVhNRTogbWFrZSB0aHJlYWQtc2FmZSAqLwotICAgIHJldHVybiBnX3N0
cmR1cChzZWxmLT51cmkpOworICAgIHJldHVybiBnX3N0cmR1cChzZWxmLT5wcml2LT51cmkuZGF0
YSgpKTsKIH0KIAotc3RhdGljIGdib29sZWFuIHdlYmtpdE1lZGlhU3RyZWFtU3JjVXJpU2V0VXJp
KEdzdFVSSUhhbmRsZXIqIGhhbmRsZXIsIGNvbnN0IGdjaGFyKiB1cmksCi0gICAgR0Vycm9yKiop
CitzdGF0aWMgZ2Jvb2xlYW4gd2Via2l0TWVkaWFTdHJlYW1TcmNVcmlTZXRVcmkoR3N0VVJJSGFu
ZGxlciogaGFuZGxlciwgY29uc3QgY2hhciogdXJpLCBHRXJyb3IqKikKIHsKICAgICBXZWJLaXRN
ZWRpYVN0cmVhbVNyYyogc2VsZiA9IFdFQktJVF9NRURJQV9TVFJFQU1fU1JDKGhhbmRsZXIpOwot
ICAgIHNlbGYtPnVyaSA9IGdfc3RyZHVwKHVyaSk7Ci0KKyAgICBzZWxmLT5wcml2LT51cmkgPSBD
U3RyaW5nKHVyaSk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKLXN0YXRpYyB2b2lkIHdlYmtpdE1l
ZGlhU3RyZWFtU3JjVXJpSGFuZGxlckluaXQoZ3BvaW50ZXIgZ19pZmFjZSwgZ3BvaW50ZXIpCitz
dGF0aWMgdm9pZCB3ZWJraXRNZWRpYVN0cmVhbVNyY1VyaUhhbmRsZXJJbml0KGdwb2ludGVyIGdJ
ZmFjZSwgZ3BvaW50ZXIpCiB7Ci0gICAgR3N0VVJJSGFuZGxlckludGVyZmFjZSogaWZhY2UgPSAo
R3N0VVJJSGFuZGxlckludGVyZmFjZSopZ19pZmFjZTsKLQotICAgIGlmYWNlLT5nZXRfdHlwZSA9
IHdlYmtpdF9tZWRpYV9zdHJlYW1fc3JjX3VyaV9nZXRfdHlwZTsKLSAgICBpZmFjZS0+Z2V0X3By
b3RvY29scyA9IHdlYmtpdF9tZWRpYV9zdHJlYW1fc3JjX3VyaV9nZXRfcHJvdG9jb2xzOwotICAg
IGlmYWNlLT5nZXRfdXJpID0gd2Via2l0X21lZGlhX3N0cmVhbV9zcmNfdXJpX2dldF91cmk7Cisg
ICAgYXV0byogaWZhY2UgPSBzdGF0aWNfY2FzdDxHc3RVUklIYW5kbGVySW50ZXJmYWNlKj4oZ0lm
YWNlKTsKKyAgICBpZmFjZS0+Z2V0X3R5cGUgPSB3ZWJraXRNZWRpYVN0cmVhbVNyY1VyaUdldFR5
cGU7CisgICAgaWZhY2UtPmdldF9wcm90b2NvbHMgPSB3ZWJraXRNZWRpYVN0cmVhbVNyY1VyaUdl
dFByb3RvY29sczsKKyAgICBpZmFjZS0+Z2V0X3VyaSA9IHdlYmtpdE1lZGlhU3RyZWFtU3JjVXJp
R2V0VXJpOwogICAgIGlmYWNlLT5zZXRfdXJpID0gd2Via2l0TWVkaWFTdHJlYW1TcmNVcmlTZXRV
cmk7CiB9CiAKIEdTVF9ERUJVR19DQVRFR09SWV9TVEFUSUMod2Via2l0TWVkaWFTdHJlYW1TcmNE
ZWJ1Zyk7CiAjZGVmaW5lIEdTVF9DQVRfREVGQVVMVCB3ZWJraXRNZWRpYVN0cmVhbVNyY0RlYnVn
CiAKLSNkZWZpbmUgZG9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBcCi0gICAgR19JTVBMRU1FTlRfSU5URVJGQUNFKEdTVF9UWVBFX1VSSV9IQU5ETEVSLCB3
ZWJraXRNZWRpYVN0cmVhbVNyY1VyaUhhbmRsZXJJbml0KTsgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBcCi0gICAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQod2Via2l0TWVkaWFTdHJlYW1TcmNE
ZWJ1ZywgIndlYmtpdHdlYm1lZGlhc3RyZWFtc3JjIiwgMCwgIm1lZGlhc3RyZWFtc3JjIGVsZW1l
bnQiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFwKLSAgICBnc3RfdGFnX3JlZ2lzdGVyX3N0YXRpYyhXRUJLSVRfTUVESUFfVFJBQ0tf
VEFHX1dJRFRILCBHU1RfVEFHX0ZMQUdfTUVUQSwgR19UWVBFX0lOVCwgIldlYmtpdCBNZWRpYVN0
cmVhbSB3aWR0aCIsICJXZWJraXQgTWVkaWFTdHJlYW0gd2lkdGgiLCBnc3RfdGFnX21lcmdlX3Vz
ZV9maXJzdCk7ICAgIFwKKyNkZWZpbmUgZG9Jbml0IFwKKyAgICBHX0lNUExFTUVOVF9JTlRFUkZB
Q0UoR1NUX1RZUEVfVVJJX0hBTkRMRVIsIHdlYmtpdE1lZGlhU3RyZWFtU3JjVXJpSGFuZGxlcklu
aXQpOyBcCisgICAgR1NUX0RFQlVHX0NBVEVHT1JZX0lOSVQod2Via2l0TWVkaWFTdHJlYW1TcmNE
ZWJ1ZywgIndlYmtpdG1lZGlhc3RyZWFtc3JjIiwgMCwgIm1lZGlhc3RyZWFtc3JjIGVsZW1lbnQi
KTsgXAorICAgIGdzdF90YWdfcmVnaXN0ZXJfc3RhdGljKFdFQktJVF9NRURJQV9UUkFDS19UQUdf
V0lEVEgsIEdTVF9UQUdfRkxBR19NRVRBLCBHX1RZUEVfSU5ULCAiV2Via2l0IE1lZGlhU3RyZWFt
IHdpZHRoIiwgIldlYmtpdCBNZWRpYVN0cmVhbSB3aWR0aCIsIGdzdF90YWdfbWVyZ2VfdXNlX2Zp
cnN0KTsgXAogICAgIGdzdF90YWdfcmVnaXN0ZXJfc3RhdGljKFdFQktJVF9NRURJQV9UUkFDS19U
QUdfSEVJR0hULCBHU1RfVEFHX0ZMQUdfTUVUQSwgR19UWVBFX0lOVCwgIldlYmtpdCBNZWRpYVN0
cmVhbSBoZWlnaHQiLCAiV2Via2l0IE1lZGlhU3RyZWFtIGhlaWdodCIsIGdzdF90YWdfbWVyZ2Vf
dXNlX2ZpcnN0KTsgXAogICAgIGdzdF90YWdfcmVnaXN0ZXJfc3RhdGljKFdFQktJVF9NRURJQV9U
UkFDS19UQUdfS0lORCwgR1NUX1RBR19GTEFHX01FVEEsIEdfVFlQRV9JTlQsICJXZWJraXQgTWVk
aWFTdHJlYW0gS2luZCIsICJXZWJraXQgTWVkaWFTdHJlYW0gS2luZCIsIGdzdF90YWdfbWVyZ2Vf
dXNlX2ZpcnN0KTsKIAotR19ERUZJTkVfVFlQRV9XSVRIX0NPREUoV2ViS2l0TWVkaWFTdHJlYW1T
cmMsIHdlYmtpdF9tZWRpYV9zdHJlYW1fc3JjLCBHU1RfVFlQRV9CSU4sIGRvSW5pdCk7CisjZGVm
aW5lIHdlYmtpdF9tZWRpYV9zdHJlYW1fc3JjX3BhcmVudF9jbGFzcyBwYXJlbnRfY2xhc3MKK1dF
QktJVF9ERUZJTkVfVFlQRV9XSVRIX0NPREUoV2ViS2l0TWVkaWFTdHJlYW1TcmMsIHdlYmtpdF9t
ZWRpYV9zdHJlYW1fc3JjLCBHU1RfVFlQRV9CSU4sIGRvSW5pdCkKIAotc3RhdGljIHZvaWQgd2Vi
a2l0TWVkaWFTdHJlYW1TcmNTZXRQcm9wZXJ0eShHT2JqZWN0KiBvYmplY3QsIGd1aW50IHByb3Bf
aWQsCi0gICAgY29uc3QgR1ZhbHVlKiwgR1BhcmFtU3BlYyogcHNwZWMpCitzdGF0aWMgdm9pZCB3
ZWJraXRNZWRpYVN0cmVhbVNyY1NldFByb3BlcnR5KEdPYmplY3QqIG9iamVjdCwgZ3VpbnQgcHJv
cGVydHlJZCwgY29uc3QgR1ZhbHVlKiwgR1BhcmFtU3BlYyogcHNwZWMpCiB7Ci0gICAgc3dpdGNo
IChwcm9wX2lkKSB7CisgICAgc3dpdGNoIChwcm9wZXJ0eUlkKSB7CiAgICAgZGVmYXVsdDoKLSAg
ICAgICAgR19PQkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEKG9iamVjdCwgcHJvcF9pZCwg
cHNwZWMpOworICAgICAgICBHX09CSkVDVF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQob2JqZWN0
LCBwcm9wZXJ0eUlkLCBwc3BlYyk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KIH0KIAotc3RhdGlj
IHZvaWQgd2Via2l0TWVkaWFTdHJlYW1TcmNHZXRQcm9wZXJ0eShHT2JqZWN0KiBvYmplY3QsIGd1
aW50IHByb3BfaWQsIEdWYWx1ZSogdmFsdWUsCi0gICAgR1BhcmFtU3BlYyogcHNwZWMpCitzdGF0
aWMgdm9pZCB3ZWJraXRNZWRpYVN0cmVhbVNyY0dldFByb3BlcnR5KEdPYmplY3QqIG9iamVjdCwg
Z3VpbnQgcHJvcGVydHlJZCwgR1ZhbHVlKiB2YWx1ZSwgR1BhcmFtU3BlYyogcHNwZWMpCiB7Ci0g
ICAgc3dpdGNoIChwcm9wX2lkKSB7CisgICAgc3dpdGNoIChwcm9wZXJ0eUlkKSB7CiAgICAgY2Fz
ZSBQUk9QX0lTX0xJVkU6CiAgICAgICAgIGdfdmFsdWVfc2V0X2Jvb2xlYW4odmFsdWUsIFRSVUUp
OwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBHX09CSkVDVF9XQVJOX0lO
VkFMSURfUFJPUEVSVFlfSUQob2JqZWN0LCBwcm9wX2lkLCBwc3BlYyk7CisgICAgICAgIEdfT0JK
RUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRChvYmplY3QsIHByb3BlcnR5SWQsIHBzcGVjKTsK
ICAgICAgICAgYnJlYWs7CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCB3ZWJraXRNZWRpYVN0cmVh
bVNyY0Rpc3Bvc2UoR09iamVjdCogb2JqZWN0KQorc3RhdGljIHZvaWQgd2Via2l0TWVkaWFTdHJl
YW1TcmNDb25zdHJ1Y3RlZChHT2JqZWN0KiBvYmplY3QpCiB7CisgICAgR1NUX0NBTExfUEFSRU5U
KEdfT0JKRUNUX0NMQVNTLCBjb25zdHJ1Y3RlZCwgKG9iamVjdCkpOwogICAgIFdlYktpdE1lZGlh
U3RyZWFtU3JjKiBzZWxmID0gV0VCS0lUX01FRElBX1NUUkVBTV9TUkMob2JqZWN0KTsKKyAgICBh
dXRvKiBwcml2ID0gc2VsZi0+cHJpdjsKIAotICAgIHNlbGYtPmF1ZGlvU3JjLnJlc2V0KGZhbHNl
KTsKLSAgICBzZWxmLT52aWRlb1NyYy5yZXNldCh0cnVlKTsKKyAgICBwcml2LT5tZWRpYVN0cmVh
bVRyYWNrT2JzZXJ2ZXIgPSBtYWtlVW5pcXVlPFdlYktpdE1lZGlhU3RyZWFtVHJhY2tPYnNlcnZl
cj4oR1NUX0VMRU1FTlRfQ0FTVChnc3Rfb2JqZWN0X3JlZihzZWxmKSkpOworICAgIHByaXYtPm1l
ZGlhU3RyZWFtT2JzZXJ2ZXIgPSBtYWtlVW5pcXVlPFdlYktpdE1lZGlhU3RyZWFtT2JzZXJ2ZXI+
KEdTVF9FTEVNRU5UX0NBU1QoZ3N0X29iamVjdF9yZWYoc2VsZikpKTsKKyAgICBwcml2LT5mbG93
Q29tYmluZXIgPSBHVW5pcXVlUHRyPEdzdEZsb3dDb21iaW5lcj4oZ3N0X2Zsb3dfY29tYmluZXJf
bmV3KCkpOworfQorCitzdGF0aWMgdm9pZCBzdG9wT2JzZXJ2aW5nVHJhY2tzKFdlYktpdE1lZGlh
U3RyZWFtU3JjKiBzZWxmKQoreworICAgIEdTVF9PQkpFQ1RfTE9DSyhzZWxmKTsKKyAgICBhdXRv
KiBwcml2ID0gc2VsZi0+cHJpdjsKKyAgICBpZiAocHJpdi0+c3RyZWFtKSB7CisgICAgICAgIGZv
ciAoYXV0byYgdHJhY2sgOiBwcml2LT5zdHJlYW0tPnRyYWNrcygpKSB7CisgICAgICAgICAgICB0
cmFjay0+c291cmNlKCkucmVtb3ZlQXVkaW9TYW1wbGVPYnNlcnZlcigqcHJpdi0+bWVkaWFTdHJl
YW1UcmFja09ic2VydmVyLmdldCgpKTsKKyAgICAgICAgICAgIHRyYWNrLT5zb3VyY2UoKS5yZW1v
dmVWaWRlb1NhbXBsZU9ic2VydmVyKCpwcml2LT5tZWRpYVN0cmVhbVRyYWNrT2JzZXJ2ZXIuZ2V0
KCkpOworICAgICAgICAgICAgdHJhY2stPnJlbW92ZU9ic2VydmVyKCpwcml2LT5tZWRpYVN0cmVh
bVRyYWNrT2JzZXJ2ZXIuZ2V0KCkpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChwcml2LT50
cmFjaykgeworICAgICAgICBwcml2LT50cmFjay0+c291cmNlKCkucmVtb3ZlQXVkaW9TYW1wbGVP
YnNlcnZlcigqcHJpdi0+bWVkaWFTdHJlYW1UcmFja09ic2VydmVyLmdldCgpKTsKKyAgICAgICAg
cHJpdi0+dHJhY2stPnNvdXJjZSgpLnJlbW92ZVZpZGVvU2FtcGxlT2JzZXJ2ZXIoKnByaXYtPm1l
ZGlhU3RyZWFtVHJhY2tPYnNlcnZlci5nZXQoKSk7CisgICAgICAgIHByaXYtPnRyYWNrLT5yZW1v
dmVPYnNlcnZlcigqcHJpdi0+bWVkaWFTdHJlYW1UcmFja09ic2VydmVyLmdldCgpKTsKKyAgICB9
CisgICAgR1NUX09CSkVDVF9VTkxPQ0soc2VsZik7CiB9CiAKIHN0YXRpYyB2b2lkIHdlYmtpdE1l
ZGlhU3RyZWFtU3JjRmluYWxpemUoR09iamVjdCogb2JqZWN0KQogewogICAgIFdlYktpdE1lZGlh
U3RyZWFtU3JjKiBzZWxmID0gV0VCS0lUX01FRElBX1NUUkVBTV9TUkMob2JqZWN0KTsKIAorICAg
IHN0b3BPYnNlcnZpbmdUcmFja3Moc2VsZik7CisKICAgICBHU1RfT0JKRUNUX0xPQ0soc2VsZik7
Ci0gICAgaWYgKHNlbGYtPnN0cmVhbSkgewotICAgICAgICBmb3IgKGF1dG8mIHRyYWNrIDogc2Vs
Zi0+c3RyZWFtLT50cmFja3MoKSkgewotICAgICAgICAgICAgdHJhY2stPnNvdXJjZSgpLnJlbW92
ZUF1ZGlvU2FtcGxlT2JzZXJ2ZXIoKnNlbGYtPm1lZGlhU3RyZWFtVHJhY2tPYnNlcnZlci5nZXQo
KSk7Ci0gICAgICAgICAgICB0cmFjay0+c291cmNlKCkucmVtb3ZlVmlkZW9TYW1wbGVPYnNlcnZl
cigqc2VsZi0+bWVkaWFTdHJlYW1UcmFja09ic2VydmVyLmdldCgpKTsKLSAgICAgICAgICAgIHRy
YWNrLT5yZW1vdmVPYnNlcnZlcigqc2VsZi0+bWVkaWFTdHJlYW1UcmFja09ic2VydmVyLmdldCgp
KTsKLSAgICAgICAgfQotICAgICAgICBzZWxmLT5zdHJlYW0tPnJlbW92ZU9ic2VydmVyKCpzZWxm
LT5tZWRpYVN0cmVhbU9ic2VydmVyKTsKLSAgICAgICAgc2VsZi0+c3RyZWFtID0gbnVsbHB0cjsK
KyAgICBhdXRvKiBwcml2ID0gc2VsZi0+cHJpdjsKKyAgICBpZiAocHJpdi0+c3RyZWFtKSB7Cisg
ICAgICAgIHByaXYtPnN0cmVhbS0+cmVtb3ZlT2JzZXJ2ZXIoKnByaXYtPm1lZGlhU3RyZWFtT2Jz
ZXJ2ZXIpOworICAgICAgICBwcml2LT5zdHJlYW0gPSBudWxscHRyOwogICAgIH0KICAgICBHU1Rf
T0JKRUNUX1VOTE9DSyhzZWxmKTsKLQotICAgIGdfY2xlYXJfcG9pbnRlcigmc2VsZi0+dXJpLCBn
X2ZyZWUpOwotICAgIGdzdF9mbG93X2NvbWJpbmVyX2ZyZWUoc2VsZi0+Zmxvd0NvbWJpbmVyKTsK
IH0KIAogc3RhdGljIEdzdFN0YXRlQ2hhbmdlUmV0dXJuIHdlYmtpdE1lZGlhU3RyZWFtU3JjQ2hh
bmdlU3RhdGUoR3N0RWxlbWVudCogZWxlbWVudCwgR3N0U3RhdGVDaGFuZ2UgdHJhbnNpdGlvbikK
IHsKLSAgICBHc3RTdGF0ZUNoYW5nZVJldHVybiByZXN1bHQ7Ci0gICAgYXV0byogc2VsZiA9IFdF
QktJVF9NRURJQV9TVFJFQU1fU1JDKGVsZW1lbnQpOwotCi0gICAgaWYgKHRyYW5zaXRpb24gPT0g
R1NUX1NUQVRFX0NIQU5HRV9QQVVTRURfVE9fUkVBRFkpIHsKLQotICAgICAgICBHU1RfT0JKRUNU
X0xPQ0soc2VsZik7Ci0gICAgICAgIGlmIChzZWxmLT5zdHJlYW0pIHsKLSAgICAgICAgICAgIGZv
ciAoYXV0byYgdHJhY2sgOiBzZWxmLT5zdHJlYW0tPnRyYWNrcygpKSB7Ci0gICAgICAgICAgICAg
ICAgdHJhY2stPnNvdXJjZSgpLnJlbW92ZUF1ZGlvU2FtcGxlT2JzZXJ2ZXIoKnNlbGYtPm1lZGlh
U3RyZWFtVHJhY2tPYnNlcnZlci5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgdHJhY2stPnNvdXJj
ZSgpLnJlbW92ZVZpZGVvU2FtcGxlT2JzZXJ2ZXIoKnNlbGYtPm1lZGlhU3RyZWFtVHJhY2tPYnNl
cnZlci5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgdHJhY2stPnJlbW92ZU9ic2VydmVyKCpzZWxm
LT5tZWRpYVN0cmVhbVRyYWNrT2JzZXJ2ZXIuZ2V0KCkpOwotICAgICAgICAgICAgfQotICAgICAg
ICB9IGVsc2UgaWYgKHNlbGYtPnRyYWNrKSB7Ci0gICAgICAgICAgICBzZWxmLT50cmFjay0+c291
cmNlKCkucmVtb3ZlQXVkaW9TYW1wbGVPYnNlcnZlcigqc2VsZi0+bWVkaWFTdHJlYW1UcmFja09i
c2VydmVyLmdldCgpKTsKLSAgICAgICAgICAgIHNlbGYtPnRyYWNrLT5zb3VyY2UoKS5yZW1vdmVW
aWRlb1NhbXBsZU9ic2VydmVyKCpzZWxmLT5tZWRpYVN0cmVhbVRyYWNrT2JzZXJ2ZXIuZ2V0KCkp
OwotICAgICAgICAgICAgc2VsZi0+dHJhY2stPnJlbW92ZU9ic2VydmVyKCpzZWxmLT5tZWRpYVN0
cmVhbVRyYWNrT2JzZXJ2ZXIuZ2V0KCkpOwotICAgICAgICB9Ci0gICAgICAgIEdTVF9PQkpFQ1Rf
VU5MT0NLKHNlbGYpOwotICAgIH0KKyNpZiBHU1RfQ0hFQ0tfVkVSU0lPTigxLCAxNCwgMCkKKyAg
ICBHU1RfREVCVUdfT0JKRUNUKGVsZW1lbnQsICIlcyIsIGdzdF9zdGF0ZV9jaGFuZ2VfZ2V0X25h
bWUodHJhbnNpdGlvbikpOworI2VuZGlmCisKKyAgICBpZiAodHJhbnNpdGlvbiA9PSBHU1RfU1RB
VEVfQ0hBTkdFX1BBVVNFRF9UT19SRUFEWSkKKyAgICAgICAgc3RvcE9ic2VydmluZ1RyYWNrcyhX
RUJLSVRfTUVESUFfU1RSRUFNX1NSQyhlbGVtZW50KSk7CiAKLSAgICByZXN1bHQgPSBHU1RfRUxF
TUVOVF9DTEFTUyh3ZWJraXRfbWVkaWFfc3RyZWFtX3NyY19wYXJlbnRfY2xhc3MpLT5jaGFuZ2Vf
c3RhdGUoZWxlbWVudCwgdHJhbnNpdGlvbik7CisgICAgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gcmVz
dWx0ID0gR1NUX0VMRU1FTlRfQ0xBU1Mod2Via2l0X21lZGlhX3N0cmVhbV9zcmNfcGFyZW50X2Ns
YXNzKS0+Y2hhbmdlX3N0YXRlKGVsZW1lbnQsIHRyYW5zaXRpb24pOwogCiAgICAgaWYgKHRyYW5z
aXRpb24gPT0gR1NUX1NUQVRFX0NIQU5HRV9SRUFEWV9UT19QQVVTRUQpCiAgICAgICAgIHJlc3Vs
dCA9IEdTVF9TVEFURV9DSEFOR0VfTk9fUFJFUk9MTDsKQEAgLTQzNywxMDUgKzQwNSw4NSBAQCBz
dGF0aWMgR3N0U3RhdGVDaGFuZ2VSZXR1cm4gd2Via2l0TWVkaWFTdHJlYW1TcmNDaGFuZ2VTdGF0
ZShHc3RFbGVtZW50KiBlbGVtZW50LAogCiBzdGF0aWMgdm9pZCB3ZWJraXRfbWVkaWFfc3RyZWFt
X3NyY19jbGFzc19pbml0KFdlYktpdE1lZGlhU3RyZWFtU3JjQ2xhc3MqIGtsYXNzKQogewotICAg
IEdPYmplY3RDbGFzcyogZ29iamVjdF9jbGFzcyA9IEdfT0JKRUNUX0NMQVNTKGtsYXNzKTsKLSAg
ICBHc3RFbGVtZW50Q2xhc3MqIGdzdGVsZW1lbnRfa2xhc3MgPSBHU1RfRUxFTUVOVF9DTEFTUyhr
bGFzcyk7Ci0KLSAgICBnb2JqZWN0X2NsYXNzLT5maW5hbGl6ZSA9IHdlYmtpdE1lZGlhU3RyZWFt
U3JjRmluYWxpemU7Ci0gICAgZ29iamVjdF9jbGFzcy0+ZGlzcG9zZSA9IHdlYmtpdE1lZGlhU3Ry
ZWFtU3JjRGlzcG9zZTsKLSAgICBnb2JqZWN0X2NsYXNzLT5nZXRfcHJvcGVydHkgPSB3ZWJraXRN
ZWRpYVN0cmVhbVNyY0dldFByb3BlcnR5OwotICAgIGdvYmplY3RfY2xhc3MtPnNldF9wcm9wZXJ0
eSA9IHdlYmtpdE1lZGlhU3RyZWFtU3JjU2V0UHJvcGVydHk7Ci0KLSAgICBnX29iamVjdF9jbGFz
c19pbnN0YWxsX3Byb3BlcnR5KGdvYmplY3RfY2xhc3MsIFBST1BfSVNfTElWRSwKLSAgICAgICAg
Z19wYXJhbV9zcGVjX2Jvb2xlYW4oImlzLWxpdmUiLCAiSXMgTGl2ZSIsCi0gICAgICAgICAgICAi
TGV0IHBsYXliaW4zIGtub3cgd2UgYXJlIGEgbGl2ZSBzb3VyY2UuIiwKLSAgICAgICAgICAgIFRS
VUUsIChHUGFyYW1GbGFncykoR19QQVJBTV9SRUFEQUJMRSB8IEdfUEFSQU1fU1RBVElDX1NUUklO
R1MpKSk7Ci0KLSAgICBnc3RlbGVtZW50X2tsYXNzLT5jaGFuZ2Vfc3RhdGUgPSB3ZWJraXRNZWRp
YVN0cmVhbVNyY0NoYW5nZVN0YXRlOwotICAgIGdzdF9lbGVtZW50X2NsYXNzX2FkZF9wYWRfdGVt
cGxhdGUoZ3N0ZWxlbWVudF9rbGFzcywKLSAgICAgICAgZ3N0X3N0YXRpY19wYWRfdGVtcGxhdGVf
Z2V0KCZ2aWRlb1NyY1RlbXBsYXRlKSk7Ci0gICAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90
ZW1wbGF0ZShnc3RlbGVtZW50X2tsYXNzLAotICAgICAgICBnc3Rfc3RhdGljX3BhZF90ZW1wbGF0
ZV9nZXQoJmF1ZGlvU3JjVGVtcGxhdGUpKTsKLX0KKyAgICBHT2JqZWN0Q2xhc3MqIGdvYmplY3RD
bGFzcyA9IEdfT0JKRUNUX0NMQVNTKGtsYXNzKTsKKyAgICBHc3RFbGVtZW50Q2xhc3MqIGdzdEVs
ZW1lbnRDbGFzcyA9IEdTVF9FTEVNRU5UX0NMQVNTKGtsYXNzKTsKIAotc3RhdGljIHZvaWQgd2Vi
a2l0X21lZGlhX3N0cmVhbV9zcmNfaW5pdChXZWJLaXRNZWRpYVN0cmVhbVNyYyogc2VsZikKLXsK
LSAgICBzZWxmLT5tZWRpYVN0cmVhbVRyYWNrT2JzZXJ2ZXIgPSBtYWtlVW5pcXVlPFdlYktpdE1l
ZGlhU3RyZWFtVHJhY2tPYnNlcnZlcj4oc2VsZik7Ci0gICAgc2VsZi0+bWVkaWFTdHJlYW1PYnNl
cnZlciA9IG1ha2VVbmlxdWU8V2ViS2l0TWVkaWFTdHJlYW1PYnNlcnZlcj4oc2VsZik7Ci0gICAg
c2VsZi0+Zmxvd0NvbWJpbmVyID0gZ3N0X2Zsb3dfY29tYmluZXJfbmV3KCk7Ci0gICAgc2VsZi0+
dmlkZW9TcmMucmVzZXQodHJ1ZSk7Ci0gICAgc2VsZi0+YXVkaW9TcmMucmVzZXQoZmFsc2UpOwot
fQorICAgIGdvYmplY3RDbGFzcy0+Y29uc3RydWN0ZWQgPSB3ZWJraXRNZWRpYVN0cmVhbVNyY0Nv
bnN0cnVjdGVkOworICAgIGdvYmplY3RDbGFzcy0+ZmluYWxpemUgPSB3ZWJraXRNZWRpYVN0cmVh
bVNyY0ZpbmFsaXplOworICAgIGdvYmplY3RDbGFzcy0+Z2V0X3Byb3BlcnR5ID0gd2Via2l0TWVk
aWFTdHJlYW1TcmNHZXRQcm9wZXJ0eTsKKyAgICBnb2JqZWN0Q2xhc3MtPnNldF9wcm9wZXJ0eSA9
IHdlYmtpdE1lZGlhU3RyZWFtU3JjU2V0UHJvcGVydHk7CiAKLXR5cGVkZWYgc3RydWN0IHsKLSAg
ICBXZWJLaXRNZWRpYVN0cmVhbVNyYyogc2VsZjsKLSAgICBSZWZQdHI8TWVkaWFTdHJlYW1UcmFj
a1ByaXZhdGU+IHRyYWNrOwotICAgIEdzdFN0YXRpY1BhZFRlbXBsYXRlKiBwYWRfdGVtcGxhdGU7
Ci19IFByb2JlRGF0YTsKKyAgICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5KGdvYmpl
Y3RDbGFzcywgUFJPUF9JU19MSVZFLCBnX3BhcmFtX3NwZWNfYm9vbGVhbigiaXMtbGl2ZSIsICJJ
cyBMaXZlIiwgIkxldCBwbGF5YmluMyBrbm93IHdlIGFyZSBhIGxpdmUgc291cmNlLiIsCisgICAg
ICAgIFRSVUUsIHN0YXRpY19jYXN0PEdQYXJhbUZsYWdzPihHX1BBUkFNX1JFQURBQkxFIHwgR19Q
QVJBTV9TVEFUSUNfU1RSSU5HUykpKTsKKworICAgIGdzdEVsZW1lbnRDbGFzcy0+Y2hhbmdlX3N0
YXRlID0gR1NUX0RFQlVHX0ZVTkNQVFIod2Via2l0TWVkaWFTdHJlYW1TcmNDaGFuZ2VTdGF0ZSk7
CisgICAgZ3N0X2VsZW1lbnRfY2xhc3NfYWRkX3BhZF90ZW1wbGF0ZShnc3RFbGVtZW50Q2xhc3Ms
IGdzdF9zdGF0aWNfcGFkX3RlbXBsYXRlX2dldCgmdmlkZW9TcmNUZW1wbGF0ZSkpOworICAgIGdz
dF9lbGVtZW50X2NsYXNzX2FkZF9wYWRfdGVtcGxhdGUoZ3N0RWxlbWVudENsYXNzLCBnc3Rfc3Rh
dGljX3BhZF90ZW1wbGF0ZV9nZXQoJmF1ZGlvU3JjVGVtcGxhdGUpKTsKK30KIAogc3RhdGljIEdz
dEZsb3dSZXR1cm4gd2Via2l0TWVkaWFTdHJlYW1TcmNDaGFpbihHc3RQYWQqIHBhZCwgR3N0T2Jq
ZWN0KiBwYXJlbnQsIEdzdEJ1ZmZlciogYnVmZmVyKQogewotICAgIEdzdEZsb3dSZXR1cm4gcmVz
dWx0LCBjaGFpbl9yZXN1bHQ7Ci0gICAgR1JlZlB0cjxXZWJLaXRNZWRpYVN0cmVhbVNyYz4gc2Vs
ZiA9IGFkb3B0R1JlZihXRUJLSVRfTUVESUFfU1RSRUFNX1NSQyhnc3Rfb2JqZWN0X2dldF9wYXJl
bnQocGFyZW50KSkpOwotCi0gICAgY2hhaW5fcmVzdWx0ID0gZ3N0X3Byb3h5X3BhZF9jaGFpbl9k
ZWZhdWx0KHBhZCwgR1NUX09CSkVDVChzZWxmLmdldCgpKSwgYnVmZmVyKTsKLSAgICByZXN1bHQg
PSBnc3RfZmxvd19jb21iaW5lcl91cGRhdGVfcGFkX2Zsb3coc2VsZi5nZXQoKS0+Zmxvd0NvbWJp
bmVyLCBwYWQsIGNoYWluX3Jlc3VsdCk7CisgICAgR1JlZlB0cjxHc3RFbGVtZW50PiBlbGVtZW50
ID0gYWRvcHRHUmVmKEdTVF9FTEVNRU5UX0NBU1QoZ3N0X29iamVjdF9nZXRfcGFyZW50KHBhcmVu
dCkpKTsKKyAgICBHc3RGbG93UmV0dXJuIGNoYWluUmVzdWx0ID0gZ3N0X3Byb3h5X3BhZF9jaGFp
bl9kZWZhdWx0KHBhZCwgR1NUX09CSkVDVF9DQVNUKGVsZW1lbnQuZ2V0KCkpLCBidWZmZXIpOwor
ICAgIGF1dG8qIHNlbGYgPSBXRUJLSVRfTUVESUFfU1RSRUFNX1NSQyhlbGVtZW50LmdldCgpKTsK
KyAgICBHc3RGbG93UmV0dXJuIHJlc3VsdCA9IGdzdF9mbG93X2NvbWJpbmVyX3VwZGF0ZV9wYWRf
ZmxvdyhzZWxmLT5wcml2LT5mbG93Q29tYmluZXIuZ2V0KCksIHBhZCwgY2hhaW5SZXN1bHQpOwog
CiAgICAgaWYgKHJlc3VsdCA9PSBHU1RfRkxPV19GTFVTSElORykKLSAgICAgICAgcmV0dXJuIGNo
YWluX3Jlc3VsdDsKKyAgICAgICAgcmV0dXJuIGNoYWluUmVzdWx0OwogCiAgICAgcmV0dXJuIHJl
c3VsdDsKIH0KIAotc3RhdGljIHZvaWQgd2Via2l0TWVkaWFTdHJlYW1TcmNBZGRQYWQoV2ViS2l0
TWVkaWFTdHJlYW1TcmMqIHNlbGYsIEdzdFBhZCogdGFyZ2V0LCBHc3RTdGF0aWNQYWRUZW1wbGF0
ZSogcGFkX3RlbXBsYXRlKQorc3RhdGljIHZvaWQgd2Via2l0TWVkaWFTdHJlYW1TcmNBZGRQYWQo
V2ViS2l0TWVkaWFTdHJlYW1TcmMqIHNlbGYsIEdzdFBhZCogdGFyZ2V0LCBHc3RTdGF0aWNQYWRU
ZW1wbGF0ZSogcGFkVGVtcGxhdGUsIE1lZGlhU3RyZWFtVHJhY2tQcml2YXRlKiB0cmFjaykKIHsK
LSAgICBhdXRvIHBhZG5hbWUgPSBtYWtlU3RyaW5nKCJzcmNfIiwgZ19hdG9taWNfaW50X2FkZCgm
KHNlbGYtPm5wYWRzKSwgMSkpOwotICAgIGF1dG8gZ2hvc3RwYWQgPSBnc3RfZ2hvc3RfcGFkX25l
d19mcm9tX3RlbXBsYXRlKHBhZG5hbWUudXRmOCgpLmRhdGEoKSwgdGFyZ2V0LAotICAgICAgICBn
c3Rfc3RhdGljX3BhZF90ZW1wbGF0ZV9nZXQocGFkX3RlbXBsYXRlKSk7Ci0KLSAgICBHU1RfREVC
VUdfT0JKRUNUKHNlbGYsICIlcyBHaG9zdGluZyAlIiBHU1RfUFRSX0ZPUk1BVCwKLSAgICAgICAg
Z3N0X29iamVjdF9nZXRfcGF0aF9zdHJpbmcoR1NUX09CSkVDVF9DQVNUKHNlbGYpKSwKLSAgICAg
ICAgdGFyZ2V0KTsKLQotICAgIGF1dG8gcHJveHlwYWQgPSBhZG9wdEdSZWYoR1NUX1BBRChnc3Rf
cHJveHlfcGFkX2dldF9pbnRlcm5hbChHU1RfUFJPWFlfUEFEKGdob3N0cGFkKSkpKTsKLSAgICBn
c3RfcGFkX3NldF9hY3RpdmUoZ2hvc3RwYWQsIFRSVUUpOwotICAgIGlmICghZ3N0X2VsZW1lbnRf
YWRkX3BhZChHU1RfRUxFTUVOVChzZWxmKSwgR1NUX1BBRChnaG9zdHBhZCkpKSB7Ci0gICAgICAg
IEdTVF9FUlJPUl9PQkpFQ1Qoc2VsZiwgIkNvdWxkIG5vdCBhZGQgcGFkICVzOiVzIiwgR1NUX0RF
QlVHX1BBRF9OQU1FKGdob3N0cGFkKSk7Ci0gICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwor
ICAgIEdTVF9ERUJVR19PQkpFQ1Qoc2VsZiwgIiVzIEdob3N0aW5nICUiIEdTVF9QVFJfRk9STUFU
LCBnc3Rfb2JqZWN0X2dldF9wYXRoX3N0cmluZyhHU1RfT0JKRUNUX0NBU1Qoc2VsZikpLCB0YXJn
ZXQpOwogCi0gICAgICAgIHJldHVybjsKLSAgICB9CisgICAgc3RhdGljIEF0b21pYzx1aW50MzJf
dD4gcGFkSWQ7CisgICAgYXV0byBwYWROYW1lID0gbWFrZVN0cmluZygic3JjXyIsIHBhZElkLmV4
Y2hhbmdlQWRkKDEpKTsKKyAgICBhdXRvKiBnaG9zdFBhZCA9IHdlYmtpdEdzdEdob3N0UGFkRnJv
bVN0YXRpY1RlbXBsYXRlKHBhZFRlbXBsYXRlLCBwYWROYW1lLnV0ZjgoKS5kYXRhKCksIHRhcmdl
dCk7CisgICAgZ3N0X3BhZF9zZXRfYWN0aXZlKGdob3N0UGFkLCBUUlVFKTsKKyAgICBnc3RfZWxl
bWVudF9hZGRfcGFkKEdTVF9FTEVNRU5UX0NBU1Qoc2VsZiksIGdob3N0UGFkKTsKKworICAgIGF1
dG8gcHJveHlQYWQgPSBhZG9wdEdSZWYoR1NUX1BBRChnc3RfcHJveHlfcGFkX2dldF9pbnRlcm5h
bChHU1RfUFJPWFlfUEFEKGdob3N0UGFkKSkpKTsKKyAgICBnc3RfZmxvd19jb21iaW5lcl9hZGRf
cGFkKHNlbGYtPnByaXYtPmZsb3dDb21iaW5lci5nZXQoKSwgcHJveHlQYWQuZ2V0KCkpOworICAg
IGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uKHByb3h5UGFkLmdldCgpLCBzdGF0aWNfY2FzdDxH
c3RQYWRDaGFpbkZ1bmN0aW9uPih3ZWJraXRNZWRpYVN0cmVhbVNyY0NoYWluKSk7CiAKLSAgICBn
c3RfZmxvd19jb21iaW5lcl9hZGRfcGFkKHNlbGYtPmZsb3dDb21iaW5lciwgcHJveHlwYWQuZ2V0
KCkpOwotICAgIGdzdF9wYWRfc2V0X2NoYWluX2Z1bmN0aW9uKHByb3h5cGFkLmdldCgpLAotICAg
ICAgICBzdGF0aWNfY2FzdDxHc3RQYWRDaGFpbkZ1bmN0aW9uPih3ZWJraXRNZWRpYVN0cmVhbVNy
Y0NoYWluKSk7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50KHRhcmdldCwgZ3N0X2V2ZW50X25ld190
YWcobWVkaWFTdHJlYW1UcmFja1ByaXZhdGVHZXRUYWdzKHRyYWNrKSkpOwogfQogCitzdHJ1Y3Qg
UHJvYmVEYXRhIHsKKyAgICBXVEZfTUFLRV9TVFJVQ1RfRkFTVF9BTExPQ0FURUQ7CisgICAgUHJv
YmVEYXRhKEdzdEVsZW1lbnQqIGVsZW1lbnQsIEdzdFN0YXRpY1BhZFRlbXBsYXRlKiBwYWRUZW1w
bGF0ZSwgUmVmUHRyPE1lZGlhU3RyZWFtVHJhY2tQcml2YXRlPiB0cmFjaykKKyAgICAgICAgOiBl
bGVtZW50KGVsZW1lbnQpCisgICAgICAgICwgcGFkVGVtcGxhdGUocGFkVGVtcGxhdGUpCisgICAg
ICAgICwgdHJhY2sodHJhY2spIHsgfQorCisgICAgR1JlZlB0cjxHc3RFbGVtZW50PiBlbGVtZW50
OworICAgIEdzdFN0YXRpY1BhZFRlbXBsYXRlKiBwYWRUZW1wbGF0ZTsKKyAgICBSZWZQdHI8TWVk
aWFTdHJlYW1UcmFja1ByaXZhdGU+IHRyYWNrOworfTsKKwogc3RhdGljIEdzdFBhZFByb2JlUmV0
dXJuIHdlYmtpdE1lZGlhU3RyZWFtU3JjUGFkUHJvYmVDYihHc3RQYWQqIHBhZCwgR3N0UGFkUHJv
YmVJbmZvKiBpbmZvLCBQcm9iZURhdGEqIGRhdGEpCiB7CiAgICAgR3N0RXZlbnQqIGV2ZW50ID0g
R1NUX1BBRF9QUk9CRV9JTkZPX0VWRU5UKGluZm8pOwotICAgIFdlYktpdE1lZGlhU3RyZWFtU3Jj
KiBzZWxmID0gZGF0YS0+c2VsZjsKKyAgICBXZWJLaXRNZWRpYVN0cmVhbVNyYyogc2VsZiA9IFdF
QktJVF9NRURJQV9TVFJFQU1fU1JDKGRhdGEtPmVsZW1lbnQuZ2V0KCkpOwogCisgICAgR1NUX0RF
QlVHX09CSkVDVChzZWxmLCAiRXZlbnQgJSIgR1NUX1BUUl9GT1JNQVQsIGV2ZW50KTsKICAgICBz
d2l0Y2ggKEdTVF9FVkVOVF9UWVBFKGV2ZW50KSkgewogICAgIGNhc2UgR1NUX0VWRU5UX1NUUkVB
TV9TVEFSVDogewotICAgICAgICBjb25zdCBnY2hhciogc3RyZWFtX2lkOwotICAgICAgICBHUmVm
UHRyPEdzdFN0cmVhbT4gc3RyZWFtID0gbnVsbHB0cjsKLQotICAgICAgICBnc3RfZXZlbnRfcGFy
c2Vfc3RyZWFtX3N0YXJ0KGV2ZW50LCAmc3RyZWFtX2lkKTsKLSAgICAgICAgaWYgKCFnX3N0cmNt
cDAoc3RyZWFtX2lkLCBkYXRhLT50cmFjay0+aWQoKS51dGY4KCkuZGF0YSgpKSkgeworICAgICAg
ICBjb25zdCBjaGFyKiBzdHJlYW1JZDsKKyAgICAgICAgZ3N0X2V2ZW50X3BhcnNlX3N0cmVhbV9z
dGFydChldmVudCwgJnN0cmVhbUlkKTsKKyAgICAgICAgaWYgKCFnX3N0cmNtcDAoc3RyZWFtSWQs
IGRhdGEtPnRyYWNrLT5pZCgpLnV0ZjgoKS5kYXRhKCkpKSB7CiAgICAgICAgICAgICBHU1RfSU5G
T19PQkpFQ1QocGFkLCAiRXZlbnQgaGFzIGJlZW4gc3RpY2tlZCBhbHJlYWR5Iik7Ci0gICAgICAg
ICAgICByZXR1cm4gR1NUX1BBRF9QUk9CRV9PSzsKKyAgICAgICAgICAgIHJldHVybiBHU1RfUEFE
X1BST0JFX1JFTU9WRTsKICAgICAgICAgfQogCi0gICAgICAgIGF1dG8gc3RyZWFtX3N0YXJ0ID0g
Z3N0X2V2ZW50X25ld19zdHJlYW1fc3RhcnQoZGF0YS0+dHJhY2stPmlkKCkudXRmOCgpLmRhdGEo
KSk7Ci0gICAgICAgIGdzdF9ldmVudF9zZXRfZ3JvdXBfaWQoc3RyZWFtX3N0YXJ0LCAxKTsKLSAg
ICAgICAgZ3N0X2V2ZW50X3VucmVmKGV2ZW50KTsKLQotICAgICAgICBnc3RfcGFkX3B1c2hfZXZl
bnQocGFkLCBzdHJlYW1fc3RhcnQpOwotICAgICAgICBnc3RfcGFkX3B1c2hfZXZlbnQocGFkLCBn
c3RfZXZlbnRfbmV3X3RhZyhtZWRpYVN0cmVhbVRyYWNrUHJpdmF0ZUdldFRhZ3MoZGF0YS0+dHJh
Y2suZ2V0KCkpKSk7CisgICAgICAgIGF1dG8qIHN0cmVhbVN0YXJ0ID0gZ3N0X2V2ZW50X25ld19z
dHJlYW1fc3RhcnQoZGF0YS0+dHJhY2stPmlkKCkudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIGdz
dF9ldmVudF9zZXRfZ3JvdXBfaWQoc3RyZWFtU3RhcnQsIDEpOworICAgICAgICBnc3RfcGFkX3B1
c2hfZXZlbnQocGFkLCBzdHJlYW1TdGFydCk7CiAKLSAgICAgICAgd2Via2l0TWVkaWFTdHJlYW1T
cmNBZGRQYWQoc2VsZiwgcGFkLCBkYXRhLT5wYWRfdGVtcGxhdGUpOwotCi0gICAgICAgIHJldHVy
biBHU1RfUEFEX1BST0JFX0hBTkRMRUQ7CisgICAgICAgIHdlYmtpdE1lZGlhU3RyZWFtU3JjQWRk
UGFkKHNlbGYsIHBhZCwgZGF0YS0+cGFkVGVtcGxhdGUsIGRhdGEtPnRyYWNrLmdldCgpKTsKKyAg
ICAgICAgcmV0dXJuIEdTVF9QQURfUFJPQkVfUkVNT1ZFOwogICAgIH0KICAgICBkZWZhdWx0Ogog
ICAgICAgICBicmVhazsKQEAgLTU0NCwxNDMgKzQ5MiwxMjIgQEAgc3RhdGljIEdzdFBhZFByb2Jl
UmV0dXJuIHdlYmtpdE1lZGlhU3RyZWFtU3JjUGFkUHJvYmVDYihHc3RQYWQqIHBhZCwgR3N0UGFk
UHJvYmUKICAgICByZXR1cm4gR1NUX1BBRF9QUk9CRV9PSzsKIH0KIAotc3RhdGljIGdib29sZWFu
IHdlYmtpdE1lZGlhU3RyZWFtU3JjU2V0dXBTcmMoV2ViS2l0TWVkaWFTdHJlYW1TcmMqIHNlbGYs
Ci0gICAgTWVkaWFTdHJlYW1UcmFja1ByaXZhdGUqIHRyYWNrLCBHc3RFbGVtZW50KiBlbGVtZW50
LAotICAgIEdzdFN0YXRpY1BhZFRlbXBsYXRlKiBwYWRfdGVtcGxhdGUsIGdib29sZWFuIG9ic2Vy
dmVfdHJhY2ssCi0gICAgYm9vbCBvbmx5VHJhY2spCitzdGF0aWMgdm9pZCB3ZWJraXRNZWRpYVN0
cmVhbVNyY1NldHVwU3JjKFdlYktpdE1lZGlhU3RyZWFtU3JjKiBzZWxmLCBNZWRpYVN0cmVhbVRy
YWNrUHJpdmF0ZSogdHJhY2ssIEdzdEVsZW1lbnQqIGVsZW1lbnQsIEdzdFN0YXRpY1BhZFRlbXBs
YXRlKiBwYWRUZW1wbGF0ZSwgYm9vbCBvbmx5VHJhY2spCiB7Ci0gICAgYXV0byBwYWQgPSBhZG9w
dEdSZWYoZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQoZWxlbWVudCwgInNyYyIpKTsKLQotICAg
IGdzdF9iaW5fYWRkKEdTVF9CSU4oc2VsZiksIGVsZW1lbnQpOworICAgIEdTVF9ERUJVR19PQkpF
Q1Qoc2VsZiwgIlNldHVwIHNvdXJjZSAlIiBHU1RfUFRSX0ZPUk1BVCAiLCBvbmx5IHRyYWNrOiAl
cyIsIGVsZW1lbnQsIGJvb2xGb3JQcmludGluZyhvbmx5VHJhY2spKTsKKyAgICBnc3RfYmluX2Fk
ZChHU1RfQklOX0NBU1Qoc2VsZiksIGVsZW1lbnQpOwogCisgICAgYXV0byBwYWQgPSBhZG9wdEdS
ZWYoZ3N0X2VsZW1lbnRfZ2V0X3N0YXRpY19wYWQoZWxlbWVudCwgInNyYyIpKTsKICAgICBpZiAo
IW9ubHlUcmFjaykgewotICAgICAgICBQcm9iZURhdGEqIGRhdGEgPSBuZXcgUHJvYmVEYXRhOwot
ICAgICAgICBkYXRhLT5zZWxmID0gV0VCS0lUX01FRElBX1NUUkVBTV9TUkMoc2VsZik7Ci0gICAg
ICAgIGRhdGEtPnBhZF90ZW1wbGF0ZSA9IHBhZF90ZW1wbGF0ZTsKLSAgICAgICAgZGF0YS0+dHJh
Y2sgPSB0cmFjazsKLQotICAgICAgICBnc3RfcGFkX2FkZF9wcm9iZShwYWQuZ2V0KCksIChHc3RQ
YWRQcm9iZVR5cGUpR1NUX1BBRF9QUk9CRV9UWVBFX0VWRU5UX0RPV05TVFJFQU0sCi0gICAgICAg
ICAgICAoR3N0UGFkUHJvYmVDYWxsYmFjayl3ZWJraXRNZWRpYVN0cmVhbVNyY1BhZFByb2JlQ2Is
IGRhdGEsCi0gICAgICAgICAgICBbXShncG9pbnRlciBkYXRhKSB7Ci0gICAgICAgICAgICAgICAg
ZGVsZXRlIChQcm9iZURhdGEqKWRhdGE7Ci0gICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UKLSAg
ICAgICAgd2Via2l0TWVkaWFTdHJlYW1TcmNBZGRQYWQoc2VsZiwgcGFkLmdldCgpLCBwYWRfdGVt
cGxhdGUpOwotCi0gICAgaWYgKG9ic2VydmVfdHJhY2spIHsKLSAgICAgICAgdHJhY2stPmFkZE9i
c2VydmVyKCpzZWxmLT5tZWRpYVN0cmVhbVRyYWNrT2JzZXJ2ZXIuZ2V0KCkpOwotICAgICAgICBh
dXRvJiBzb3VyY2UgPSB0cmFjay0+c291cmNlKCk7Ci0gICAgICAgIHN3aXRjaCAoc291cmNlLnR5
cGUoKSkgewotICAgICAgICBjYXNlIFJlYWx0aW1lTWVkaWFTb3VyY2U6OlR5cGU6OkF1ZGlvOgot
ICAgICAgICAgICAgc291cmNlLmFkZEF1ZGlvU2FtcGxlT2JzZXJ2ZXIoKnNlbGYtPm1lZGlhU3Ry
ZWFtVHJhY2tPYnNlcnZlci5nZXQoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2Fz
ZSBSZWFsdGltZU1lZGlhU291cmNlOjpUeXBlOjpWaWRlbzoKLSAgICAgICAgICAgIHNvdXJjZS5h
ZGRWaWRlb1NhbXBsZU9ic2VydmVyKCpzZWxmLT5tZWRpYVN0cmVhbVRyYWNrT2JzZXJ2ZXIuZ2V0
KCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUmVhbHRpbWVNZWRpYVNvdXJj
ZTo6VHlwZTo6Tm9uZToKLSAgICAgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgICAg
ICB9CisgICAgICAgIGF1dG8gZGF0YSA9IG1ha2VVbmlxdWU8UHJvYmVEYXRhPihHU1RfRUxFTUVO
VF9DQVNUKHNlbGYpLCBwYWRUZW1wbGF0ZSwgdHJhY2spOworICAgICAgICBnc3RfcGFkX2FkZF9w
cm9iZShwYWQuZ2V0KCksIEdTVF9QQURfUFJPQkVfVFlQRV9FVkVOVF9ET1dOU1RSRUFNLCByZWlu
dGVycHJldF9jYXN0PEdzdFBhZFByb2JlQ2FsbGJhY2s+KHdlYmtpdE1lZGlhU3RyZWFtU3JjUGFk
UHJvYmVDYiksIGRhdGEucmVsZWFzZSgpLCBudWxscHRyKTsKKyAgICB9IGVsc2UgeworICAgICAg
ICBnc3RfcGFkX3NldF9hY3RpdmUocGFkLmdldCgpLCBUUlVFKTsKKyAgICAgICAgd2Via2l0TWVk
aWFTdHJlYW1TcmNBZGRQYWQoc2VsZiwgcGFkLmdldCgpLCBwYWRUZW1wbGF0ZSwgdHJhY2spOwog
ICAgIH0KLSAgICBnc3RfZWxlbWVudF9zeW5jX3N0YXRlX3dpdGhfcGFyZW50KGVsZW1lbnQpOwot
ICAgIHJldHVybiBUUlVFOwotfQogCi1zdGF0aWMgZ2Jvb2xlYW4gd2Via2l0TWVkaWFTdHJlYW1T
cmNTZXR1cEFwcFNyYyhXZWJLaXRNZWRpYVN0cmVhbVNyYyogc2VsZiwKLSAgICBNZWRpYVN0cmVh
bVRyYWNrUHJpdmF0ZSogdHJhY2ssIFdlYktpdE1lZGlhU3RyZWFtU3JjOjpTb3VyY2VEYXRhKiBk
YXRhLAotICAgIEdzdFN0YXRpY1BhZFRlbXBsYXRlKiBwYWRfdGVtcGxhdGUsIGJvb2wgb25seVRy
YWNrKQotewotICAgIGRhdGEtPmVuc3VyZUFwcFNyYygpOwotICAgIGlmICh0cmFjay0+aXNDYXB0
dXJlVHJhY2soKSkKLSAgICAgICAgZ19vYmplY3Rfc2V0KGRhdGEtPnNyYygpLCAiZG8tdGltZXN0
YW1wIiwgdHJ1ZSwgbnVsbHB0cik7CisgICAgYXV0byogcHJpdiA9IHNlbGYtPnByaXY7CisgICAg
dHJhY2stPmFkZE9ic2VydmVyKCpwcml2LT5tZWRpYVN0cmVhbVRyYWNrT2JzZXJ2ZXIuZ2V0KCkp
OworICAgIGF1dG8mIHNvdXJjZSA9IHRyYWNrLT5zb3VyY2UoKTsKKyAgICBzd2l0Y2ggKHNvdXJj
ZS50eXBlKCkpIHsKKyAgICBjYXNlIFJlYWx0aW1lTWVkaWFTb3VyY2U6OlR5cGU6OkF1ZGlvOgor
ICAgICAgICBzb3VyY2UuYWRkQXVkaW9TYW1wbGVPYnNlcnZlcigqcHJpdi0+bWVkaWFTdHJlYW1U
cmFja09ic2VydmVyLmdldCgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSZWFsdGltZU1l
ZGlhU291cmNlOjpUeXBlOjpWaWRlbzoKKyAgICAgICAgc291cmNlLmFkZFZpZGVvU2FtcGxlT2Jz
ZXJ2ZXIoKnByaXYtPm1lZGlhU3RyZWFtVHJhY2tPYnNlcnZlci5nZXQoKSk7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgUmVhbHRpbWVNZWRpYVNvdXJjZTo6VHlwZTo6Tm9uZToKKyAgICAgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQogCi0gICAgcmV0dXJuIHdlYmtpdE1lZGlhU3Ry
ZWFtU3JjU2V0dXBTcmMoc2VsZiwgdHJhY2ssIGRhdGEtPnNyYygpLCBwYWRfdGVtcGxhdGUsIFRS
VUUsIG9ubHlUcmFjayk7CisgICAgZ3N0X2VsZW1lbnRfc3luY19zdGF0ZV93aXRoX3BhcmVudChl
bGVtZW50KTsKIH0KIAotc3RhdGljIHZvaWQgd2Via2l0TWVkaWFTdHJlYW1TcmNQb3N0U3RyZWFt
Q29sbGVjdGlvbihXZWJLaXRNZWRpYVN0cmVhbVNyYyogc2VsZiwgTWVkaWFTdHJlYW1Qcml2YXRl
KiBzdHJlYW0pCitzdGF0aWMgdm9pZCB3ZWJraXRNZWRpYVN0cmVhbVNyY1Bvc3RTdHJlYW1Db2xs
ZWN0aW9uKFdlYktpdE1lZGlhU3RyZWFtU3JjKiBzZWxmKQogeworICAgIGF1dG8qIHByaXYgPSBz
ZWxmLT5wcml2OworICAgIEFTU0VSVChwcml2LT5zdHJlYW0pOwogICAgIEdTVF9PQkpFQ1RfTE9D
SyhzZWxmKTsKLSAgICBzZWxmLT5zdHJlYW1Db2xsZWN0aW9uID0gYWRvcHRHUmVmKGdzdF9zdHJl
YW1fY29sbGVjdGlvbl9uZXcoc3RyZWFtLT5pZCgpLnV0ZjgoKS5kYXRhKCkpKTsKLSAgICBmb3Ig
KGF1dG8mIHRyYWNrIDogc3RyZWFtLT50cmFja3MoKSkgewotICAgICAgICBhdXRvIGdzdHN0cmVh
bSA9IHdlYmtpdE1lZGlhU3RyZWFtTmV3KHRyYWNrLmdldCgpKTsKKyAgICBwcml2LT5zdHJlYW1D
b2xsZWN0aW9uID0gYWRvcHRHUmVmKGdzdF9zdHJlYW1fY29sbGVjdGlvbl9uZXcocHJpdi0+c3Ry
ZWFtLT5pZCgpLnV0ZjgoKS5kYXRhKCkpKTsKKyAgICBmb3IgKGF1dG8mIHRyYWNrIDogcHJpdi0+
c3RyZWFtLT50cmFja3MoKSkKKyAgICAgICAgZ3N0X3N0cmVhbV9jb2xsZWN0aW9uX2FkZF9zdHJl
YW0ocHJpdi0+c3RyZWFtQ29sbGVjdGlvbi5nZXQoKSwgd2Via2l0TWVkaWFTdHJlYW1OZXcodHJh
Y2suZ2V0KCkpKTsKIAotICAgICAgICBnc3Rfc3RyZWFtX2NvbGxlY3Rpb25fYWRkX3N0cmVhbShz
ZWxmLT5zdHJlYW1Db2xsZWN0aW9uLmdldCgpLCBnc3RzdHJlYW0pOwotICAgIH0KKyAgICBpZiAo
cHJpdi0+dHJhY2spCisgICAgICAgIGdzdF9zdHJlYW1fY29sbGVjdGlvbl9hZGRfc3RyZWFtKHBy
aXYtPnN0cmVhbUNvbGxlY3Rpb24uZ2V0KCksIHdlYmtpdE1lZGlhU3RyZWFtTmV3KHByaXYtPnRy
YWNrLmdldCgpKSk7CiAgICAgR1NUX09CSkVDVF9VTkxPQ0soc2VsZik7CiAKLSAgICBnc3RfZWxl
bWVudF9wb3N0X21lc3NhZ2UoR1NUX0VMRU1FTlQoc2VsZiksCi0gICAgICAgIGdzdF9tZXNzYWdl
X25ld19zdHJlYW1fY29sbGVjdGlvbihHU1RfT0JKRUNUKHNlbGYpLCBzZWxmLT5zdHJlYW1Db2xs
ZWN0aW9uLmdldCgpKSk7CisgICAgR1NUX0RFQlVHX09CSkVDVChzZWxmLCAiUG9zdGluZyBzdHJl
YW0gY29sbGVjdGlvbiIpOworICAgIGdzdF9lbGVtZW50X3Bvc3RfbWVzc2FnZShHU1RfRUxFTUVO
VF9DQVNUKHNlbGYpLCBnc3RfbWVzc2FnZV9uZXdfc3RyZWFtX2NvbGxlY3Rpb24oR1NUX09CSkVD
VF9DQVNUKHNlbGYpLCBwcml2LT5zdHJlYW1Db2xsZWN0aW9uLmdldCgpKSk7CiB9CiAKLWJvb2wg
d2Via2l0TWVkaWFTdHJlYW1TcmNBZGRUcmFjayhXZWJLaXRNZWRpYVN0cmVhbVNyYyogc2VsZiwg
TWVkaWFTdHJlYW1UcmFja1ByaXZhdGUqIHRyYWNrLCBib29sIG9ubHlUcmFjaykKK3ZvaWQgd2Vi
a2l0TWVkaWFTdHJlYW1TcmNBZGRUcmFjayhXZWJLaXRNZWRpYVN0cmVhbVNyYyogc2VsZiwgTWVk
aWFTdHJlYW1UcmFja1ByaXZhdGUqIHRyYWNrLCBib29sIG9ubHlUcmFjaykKIHsKLSAgICBib29s
IHJlcyA9IGZhbHNlOwotICAgIGlmICh0cmFjay0+dHlwZSgpID09IFJlYWx0aW1lTWVkaWFTb3Vy
Y2U6OlR5cGU6OkF1ZGlvKQotICAgICAgICByZXMgPSB3ZWJraXRNZWRpYVN0cmVhbVNyY1NldHVw
QXBwU3JjKHNlbGYsIHRyYWNrLCAmc2VsZi0+YXVkaW9TcmMsICZhdWRpb1NyY1RlbXBsYXRlLCBv
bmx5VHJhY2spOwotICAgIGVsc2UgaWYgKHRyYWNrLT50eXBlKCkgPT0gUmVhbHRpbWVNZWRpYVNv
dXJjZTo6VHlwZTo6VmlkZW8pCi0gICAgICAgIHJlcyA9IHdlYmtpdE1lZGlhU3RyZWFtU3JjU2V0
dXBBcHBTcmMoc2VsZiwgdHJhY2ssICZzZWxmLT52aWRlb1NyYywgJnZpZGVvU3JjVGVtcGxhdGUs
IG9ubHlUcmFjayk7Ci0gICAgZWxzZQotICAgICAgICBHU1RfSU5GTygiVW5zdXBwb3J0ZWQgdHJh
Y2sgdHlwZTogJWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHRyYWNrLT50eXBlKCkpKTsKLQotICAgIGlm
IChvbmx5VHJhY2sgJiYgcmVzKQotICAgICAgICBzZWxmLT50cmFjayA9IHRyYWNrOworICAgIGF1
dG8qIHByaXYgPSBzZWxmLT5wcml2OworICAgIGlmICh0cmFjay0+dHlwZSgpID09IFJlYWx0aW1l
TWVkaWFTb3VyY2U6OlR5cGU6OkF1ZGlvKSB7CisgICAgICAgIHByaXYtPmF1ZGlvU3JjLmVtcGxh
Y2UodHJhY2stPmlzQ2FwdHVyZVRyYWNrKCkpOworICAgICAgICB3ZWJraXRNZWRpYVN0cmVhbVNy
Y1NldHVwU3JjKHNlbGYsIHRyYWNrLCBwcml2LT5hdWRpb1NyYy0+c3JjKCksICZhdWRpb1NyY1Rl
bXBsYXRlLCBvbmx5VHJhY2spOworICAgIH0gZWxzZSBpZiAodHJhY2stPnR5cGUoKSA9PSBSZWFs
dGltZU1lZGlhU291cmNlOjpUeXBlOjpWaWRlbykgeworICAgICAgICBwcml2LT52aWRlb1NyYy5l
bXBsYWNlKHRyYWNrLT5pc0NhcHR1cmVUcmFjaygpKTsKKyAgICAgICAgd2Via2l0TWVkaWFTdHJl
YW1TcmNTZXR1cFNyYyhzZWxmLCB0cmFjaywgcHJpdi0+dmlkZW9TcmMtPnNyYygpLCAmdmlkZW9T
cmNUZW1wbGF0ZSwgb25seVRyYWNrKTsKKyAgICB9IGVsc2UKKyAgICAgICAgR1NUX0lORk9fT0JK
RUNUKHNlbGYsICJVbnN1cHBvcnRlZCB0cmFjayB0eXBlOiAlZCIsIHN0YXRpY19jYXN0PGludD4o
dHJhY2stPnR5cGUoKSkpOwogCi0gICAgcmV0dXJuIGZhbHNlOworICAgIGlmICgocHJpdi0+dmlk
ZW9TcmMgfHwgcHJpdi0+YXVkaW9TcmMpICYmIG9ubHlUcmFjaykKKyAgICAgICAgc2VsZi0+cHJp
di0+dHJhY2sgPSB0cmFjazsKIH0KIAogc3RhdGljIHZvaWQgd2Via2l0TWVkaWFTdHJlYW1TcmNS
ZW1vdmVUcmFja0J5VHlwZShXZWJLaXRNZWRpYVN0cmVhbVNyYyogc2VsZiwgUmVhbHRpbWVNZWRp
YVNvdXJjZTo6VHlwZSB0cmFja1R5cGUpCiB7CiAgICAgaWYgKHRyYWNrVHlwZSA9PSBSZWFsdGlt
ZU1lZGlhU291cmNlOjpUeXBlOjpBdWRpbykKLSAgICAgICAgc2VsZi0+YXVkaW9TcmMucmVzZXQo
ZmFsc2UpOworICAgICAgICBzZWxmLT5wcml2LT5hdWRpb1NyYyA9IFdURjo6bnVsbG9wdDsKICAg
ICBlbHNlIGlmICh0cmFja1R5cGUgPT0gUmVhbHRpbWVNZWRpYVNvdXJjZTo6VHlwZTo6VmlkZW8p
Ci0gICAgICAgIHNlbGYtPnZpZGVvU3JjLnJlc2V0KHRydWUpOworICAgICAgICBzZWxmLT5wcml2
LT52aWRlb1NyYyA9IFdURjo6bnVsbG9wdDsKICAgICBlbHNlCi0gICAgICAgIEdTVF9JTkZPKCJV
bnN1cHBvcnRlZCB0cmFjayB0eXBlOiAlZCIsIHN0YXRpY19jYXN0PGludD4odHJhY2tUeXBlKSk7
CisgICAgICAgIEdTVF9JTkZPX09CSkVDVChzZWxmLCAiVW5zdXBwb3J0ZWQgdHJhY2sgdHlwZTog
JWQiLCBzdGF0aWNfY2FzdDxpbnQ+KHRyYWNrVHlwZSkpOwogfQogCi1ib29sIHdlYmtpdE1lZGlh
U3RyZWFtU3JjU2V0U3RyZWFtKFdlYktpdE1lZGlhU3RyZWFtU3JjKiBzZWxmLCBNZWRpYVN0cmVh
bVByaXZhdGUqIHN0cmVhbSkKK3ZvaWQgd2Via2l0TWVkaWFTdHJlYW1TcmNTZXRTdHJlYW0oV2Vi
S2l0TWVkaWFTdHJlYW1TcmMqIHNlbGYsIE1lZGlhU3RyZWFtUHJpdmF0ZSogc3RyZWFtKQogewog
ICAgIEFTU0VSVChXRUJLSVRfSVNfTUVESUFfU1RSRUFNX1NSQyhzZWxmKSk7Ci0KLSAgICB3ZWJr
aXRNZWRpYVN0cmVhbVNyY1JlbW92ZVRyYWNrQnlUeXBlKHNlbGYsIFJlYWx0aW1lTWVkaWFTb3Vy
Y2U6OlR5cGU6OkF1ZGlvKTsKLSAgICB3ZWJraXRNZWRpYVN0cmVhbVNyY1JlbW92ZVRyYWNrQnlU
eXBlKHNlbGYsIFJlYWx0aW1lTWVkaWFTb3VyY2U6OlR5cGU6OlZpZGVvKTsKLQotICAgIHdlYmtp
dE1lZGlhU3RyZWFtU3JjUG9zdFN0cmVhbUNvbGxlY3Rpb24oc2VsZiwgc3RyZWFtKTsKLQotICAg
IHNlbGYtPnN0cmVhbSA9IHN0cmVhbTsKLSAgICBzZWxmLT5zdHJlYW0tPmFkZE9ic2VydmVyKCpz
ZWxmLT5tZWRpYVN0cmVhbU9ic2VydmVyLmdldCgpKTsKLSAgICBmb3IgKGF1dG8mIHRyYWNrIDog
c3RyZWFtLT50cmFja3MoKSkKLSAgICAgICAgd2Via2l0TWVkaWFTdHJlYW1TcmNBZGRUcmFjayhz
ZWxmLCB0cmFjay5nZXQoKSwgZmFsc2UpOwotCi0gICAgcmV0dXJuIFRSVUU7CisgICAgQVNTRVJU
KCFzZWxmLT5wcml2LT5zdHJlYW0pOworICAgIHNlbGYtPnByaXYtPnN0cmVhbSA9IHN0cmVhbTsK
KyAgICB3ZWJraXRNZWRpYVN0cmVhbVNyY1Bvc3RTdHJlYW1Db2xsZWN0aW9uKHNlbGYpOworCisg
ICAgc2VsZi0+cHJpdi0+c3RyZWFtLT5hZGRPYnNlcnZlcigqc2VsZi0+cHJpdi0+bWVkaWFTdHJl
YW1PYnNlcnZlci5nZXQoKSk7CisgICAgYXV0byB0cmFja3MgPSBzdHJlYW0tPnRyYWNrcygpOwor
ICAgIGJvb2wgb25seVRyYWNrID0gdHJhY2tzLnNpemUoKSA9PSAxOworICAgIGZvciAoYXV0byYg
dHJhY2sgOiB0cmFja3MpCisgICAgICAgIHdlYmtpdE1lZGlhU3RyZWFtU3JjQWRkVHJhY2soc2Vs
ZiwgdHJhY2suZ2V0KCksIG9ubHlUcmFjayk7CiB9CiAKLXN0YXRpYyB2b2lkIHdlYmtpdE1lZGlh
U3RyZWFtU3JjUHVzaFZpZGVvU2FtcGxlKFdlYktpdE1lZGlhU3RyZWFtU3JjKiBzZWxmLCBHc3RT
YW1wbGUqIGdzdHNhbXBsZSkKK3N0YXRpYyB2b2lkIHdlYmtpdE1lZGlhU3RyZWFtU3JjUHVzaFZp
ZGVvU2FtcGxlKFdlYktpdE1lZGlhU3RyZWFtU3JjKiBzZWxmLCBHc3RTYW1wbGUqIHNhbXBsZSkK
IHsKLSAgICBzZWxmLT52aWRlb1NyYy5wdXNoU2FtcGxlKGdzdHNhbXBsZSk7CisgICAgaWYgKHNl
bGYtPnByaXYtPnZpZGVvU3JjKQorICAgICAgICBzZWxmLT5wcml2LT52aWRlb1NyYy0+cHVzaFNh
bXBsZShzYW1wbGUpOwogfQogCi1zdGF0aWMgdm9pZCB3ZWJraXRNZWRpYVN0cmVhbVNyY1B1c2hB
dWRpb1NhbXBsZShXZWJLaXRNZWRpYVN0cmVhbVNyYyogc2VsZiwgR3N0U2FtcGxlKiBnc3RzYW1w
bGUpCitzdGF0aWMgdm9pZCB3ZWJraXRNZWRpYVN0cmVhbVNyY1B1c2hBdWRpb1NhbXBsZShXZWJL
aXRNZWRpYVN0cmVhbVNyYyogc2VsZiwgR3N0U2FtcGxlKiBzYW1wbGUpCiB7Ci0gICAgc2VsZi0+
YXVkaW9TcmMucHVzaFNhbXBsZShnc3RzYW1wbGUpOworICAgIGlmIChzZWxmLT5wcml2LT5hdWRp
b1NyYykKKyAgICAgICAgc2VsZi0+cHJpdi0+YXVkaW9TcmMtPnB1c2hTYW1wbGUoc2FtcGxlKTsK
IH0KIAotc3RhdGljIHZvaWQgd2Via2l0TWVkaWFTdHJlYW1TcmNUcmFja0VuZGVkKFdlYktpdE1l
ZGlhU3RyZWFtU3JjKiBzZWxmLAotICAgIE1lZGlhU3RyZWFtVHJhY2tQcml2YXRlJiB0cmFjaykK
K3N0YXRpYyB2b2lkIHdlYmtpdE1lZGlhU3RyZWFtU3JjVHJhY2tFbmRlZChXZWJLaXRNZWRpYVN0
cmVhbVNyYyogc2VsZiwgTWVkaWFTdHJlYW1UcmFja1ByaXZhdGUmIHRyYWNrKQogewotICAgIEdS
ZWZQdHI8R3N0UGFkPiBwYWQgPSBudWxscHRyOworICAgIEdSZWZQdHI8R3N0UGFkPiBwYWQ7CiAK
KyAgICBHU1RfREVCVUdfT0JKRUNUKHNlbGYsICJUcmFjayAlcyBlbmRlZCIsIHRyYWNrLmxhYmVs
KCkudXRmOCgpLmRhdGEoKSk7CiAgICAgR1NUX09CSkVDVF9MT0NLKHNlbGYpOwotICAgIGZvciAo
YXV0byB0bXAgPSBHU1RfRUxFTUVOVChzZWxmKS0+c3JjcGFkczsgdG1wOyB0bXAgPSB0bXAtPm5l
eHQpIHsKLSAgICAgICAgR3N0UGFkKiB0bXBwYWQgPSBHU1RfUEFEKHRtcC0+ZGF0YSk7Ci0gICAg
ICAgIGNvbnN0IGdjaGFyKiBzdHJlYW1faWQ7Ci0KLSAgICAgICAgR3N0RXZlbnQqIHN0cmVhbV9z
dGFydCA9IGdzdF9wYWRfZ2V0X3N0aWNreV9ldmVudCh0bXBwYWQsIEdTVF9FVkVOVF9TVFJFQU1f
U1RBUlQsIDApOwotICAgICAgICBpZiAoIXN0cmVhbV9zdGFydCkKKyAgICBmb3IgKGF1dG8qIGl0
ZW0gPSBHU1RfRUxFTUVOVF9DQVNUKHNlbGYpLT5zcmNwYWRzOyBpdGVtOyBpdGVtID0gaXRlbS0+
bmV4dCkgeworICAgICAgICBhdXRvKiBjdXJyZW50UGFkID0gR1NUX1BBRF9DQVNUKGl0ZW0tPmRh
dGEpOworICAgICAgICBhdXRvIHN0cmVhbVN0YXJ0ID0gYWRvcHRHUmVmKGdzdF9wYWRfZ2V0X3N0
aWNreV9ldmVudChjdXJyZW50UGFkLCBHU1RfRVZFTlRfU1RSRUFNX1NUQVJULCAwKSk7CisgICAg
ICAgIGlmICghc3RyZWFtU3RhcnQpCiAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICBn
c3RfZXZlbnRfcGFyc2Vfc3RyZWFtX3N0YXJ0KHN0cmVhbV9zdGFydCwgJnN0cmVhbV9pZCk7Ci0g
ICAgICAgIGlmIChTdHJpbmcoc3RyZWFtX2lkKSA9PSB0cmFjay5pZCgpKSB7Ci0gICAgICAgICAg
ICBwYWQgPSB0bXBwYWQ7CisgICAgICAgIGNvbnN0IGNoYXIqIHN0cmVhbUlkOworICAgICAgICBn
c3RfZXZlbnRfcGFyc2Vfc3RyZWFtX3N0YXJ0KHN0cmVhbVN0YXJ0LmdldCgpLCAmc3RyZWFtSWQp
OworICAgICAgICBpZiAoIWdfc3RyY21wMChzdHJlYW1JZCwgdHJhY2suaWQoKS51dGY4KCkuZGF0
YSgpKSkgeworICAgICAgICAgICAgcGFkID0gY3VycmVudFBhZDsKICAgICAgICAgICAgIGJyZWFr
OwogICAgICAgICB9CiAgICAgfQpAQCAtNjg4LDIyICs2MTUsMTggQEAgc3RhdGljIHZvaWQgd2Vi
a2l0TWVkaWFTdHJlYW1TcmNUcmFja0VuZGVkKFdlYktpdE1lZGlhU3RyZWFtU3JjKiBzZWxmLAog
CiAgICAgaWYgKCFwYWQpIHsKICAgICAgICAgR1NUX0VSUk9SX09CSkVDVChzZWxmLCAiTm8gcGFk
IGZvdW5kIGZvciAlcyIsIHRyYWNrLmlkKCkudXRmOCgpLmRhdGEoKSk7Ci0KICAgICAgICAgcmV0
dXJuOwogICAgIH0KIAogICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSB2aWRlby52aWRlb1dpZHRo
IGlzIHJlc2V0IHRvIDAKLSAgICB3ZWJraXRNZWRpYVN0cmVhbVNyY1Bvc3RTdHJlYW1Db2xsZWN0
aW9uKHNlbGYsIHNlbGYtPnN0cmVhbS5nZXQoKSk7Ci0gICAgYXV0byB0YWdzID0gbWVkaWFTdHJl
YW1UcmFja1ByaXZhdGVHZXRUYWdzKCZ0cmFjayk7Ci0gICAgZ3N0X3BhZF9wdXNoX2V2ZW50KHBh
ZC5nZXQoKSwgZ3N0X2V2ZW50X25ld190YWcodGFncykpOworICAgIHdlYmtpdE1lZGlhU3RyZWFt
U3JjUG9zdFN0cmVhbUNvbGxlY3Rpb24oc2VsZik7CisgICAgZ3N0X3BhZF9wdXNoX2V2ZW50KHBh
ZC5nZXQoKSwgZ3N0X2V2ZW50X25ld190YWcobWVkaWFTdHJlYW1UcmFja1ByaXZhdGVHZXRUYWdz
KCZ0cmFjaykpKTsKICAgICBnc3RfcGFkX3B1c2hfZXZlbnQocGFkLmdldCgpLCBnc3RfZXZlbnRf
bmV3X2VvcygpKTsKIH0KIAotR3N0RWxlbWVudCogd2Via2l0TWVkaWFTdHJlYW1TcmNOZXcodm9p
ZCkKK0dzdEVsZW1lbnQqIHdlYmtpdE1lZGlhU3RyZWFtU3JjTmV3KCkKIHsKLSAgICByZXR1cm4g
R1NUX0VMRU1FTlQoZ19vYmplY3RfbmV3KHdlYmtpdF9tZWRpYV9zdHJlYW1fc3JjX2dldF90eXBl
KCksIG51bGxwdHIpKTsKKyAgICByZXR1cm4gR1NUX0VMRU1FTlRfQ0FTVChnX29iamVjdF9uZXco
d2Via2l0X21lZGlhX3N0cmVhbV9zcmNfZ2V0X3R5cGUoKSwgbnVsbHB0cikpOwogfQogCi19IC8v
IFdlYkNvcmUKLQotI2VuZGlmIC8vIEVOQUJMRShWSURFTykgJiYgRU5BQkxFKE1FRElBX1NUUkVB
TSkgJiYgVVNFKExJQldFQlJUQykKKyNlbmRpZiAvLyBFTkFCTEUoVklERU8pICYmIEVOQUJMRShN
RURJQV9TVFJFQU0pICYmIFVTRShHU1RSRUFNRVIpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9tZWRpYXN0cmVhbS9nc3RyZWFtZXIvR1N0cmVhbWVyTWVkaWFTdHJlYW1Tb3Vy
Y2UuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21lZGlhc3RyZWFtL2dzdHJlYW1lci9HU3Ry
ZWFtZXJNZWRpYVN0cmVhbVNvdXJjZS5oCmluZGV4IGMzM2JkMDI4NWI2MTExOTQxNTQwZWVhMWY0
N2U1ZjljODllMTQwNDIuLjAwNjRmY2E4N2U3YWU5NzcyMmExMWIzNGNmYTViOTBlYzJmMmY0YWQg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21lZGlhc3RyZWFtL2dzdHJlYW1l
ci9HU3RyZWFtZXJNZWRpYVN0cmVhbVNvdXJjZS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL21lZGlhc3RyZWFtL2dzdHJlYW1lci9HU3RyZWFtZXJNZWRpYVN0cmVhbVNvdXJjZS5oCkBA
IC0yMSwyOCArMjEsNDMgQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpZiBFTkFCTEUoVklERU8pICYm
IEVOQUJMRShNRURJQV9TVFJFQU0pICYmIFVTRShMSUJXRUJSVEMpCi0KLSNpbmNsdWRlICJNZWRp
YVN0cmVhbVByaXZhdGUuaCIKLSNpbmNsdWRlICJNZWRpYVN0cmVhbVRyYWNrUHJpdmF0ZS5oIgor
I2lmIEVOQUJMRShWSURFTykgJiYgRU5BQkxFKE1FRElBX1NUUkVBTSkgJiYgVVNFKEdTVFJFQU1F
UikKIAogI2luY2x1ZGUgPGdzdC9nc3QuaD4KIAorbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3Mg
TWVkaWFTdHJlYW1Qcml2YXRlOworY2xhc3MgTWVkaWFTdHJlYW1UcmFja1ByaXZhdGU7Cit9CisK
K0dfQkVHSU5fREVDTFMKKwogI2RlZmluZSBXRUJLSVRfTUVESUFfVFJBQ0tfVEFHX1dJRFRIICJ3
ZWJraXQtbWVkaWEtc3RyZWFtLXdpZHRoIgogI2RlZmluZSBXRUJLSVRfTUVESUFfVFJBQ0tfVEFH
X0hFSUdIVCAid2Via2l0LW1lZGlhLXN0cmVhbS1oZWlnaHQiCiAjZGVmaW5lIFdFQktJVF9NRURJ
QV9UUkFDS19UQUdfS0lORCAid2Via2l0LW1lZGlhLXN0cmVhbS1raW5kIgogCi1uYW1lc3BhY2Ug
V2ViQ29yZSB7Ci0KLXR5cGVkZWYgc3RydWN0IF9XZWJLaXRNZWRpYVN0cmVhbVNyYyBXZWJLaXRN
ZWRpYVN0cmVhbVNyYzsKLQogI2RlZmluZSBXRUJLSVRfTUVESUFfU1RSRUFNX1NSQyhvKSAoR19U
WVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG8pLCBXRUJLSVRfVFlQRV9NRURJQV9TVFJFQU1fU1JD
LCBXZWJLaXRNZWRpYVN0cmVhbVNyYykpCiAjZGVmaW5lIFdFQktJVF9JU19NRURJQV9TVFJFQU1f
U1JDKG8pIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgobyksIFdFQktJVF9UWVBFX01FRElB
X1NUUkVBTV9TUkMpKQogI2RlZmluZSBXRUJLSVRfVFlQRV9NRURJQV9TVFJFQU1fU1JDICh3ZWJr
aXRfbWVkaWFfc3RyZWFtX3NyY19nZXRfdHlwZSgpKQotR1R5cGUgd2Via2l0X21lZGlhX3N0cmVh
bV9zcmNfZ2V0X3R5cGUodm9pZCkgR19HTlVDX0NPTlNUOwotYm9vbCB3ZWJraXRNZWRpYVN0cmVh
bVNyY1NldFN0cmVhbShXZWJLaXRNZWRpYVN0cmVhbVNyYyosIE1lZGlhU3RyZWFtUHJpdmF0ZSop
OwotYm9vbCB3ZWJraXRNZWRpYVN0cmVhbVNyY0FkZFRyYWNrKFdlYktpdE1lZGlhU3RyZWFtU3Jj
KiwgTWVkaWFTdHJlYW1UcmFja1ByaXZhdGUqLCBib29sIG9ubHlUcmFjayk7Ci1Hc3RFbGVtZW50
ICogd2Via2l0TWVkaWFTdHJlYW1TcmNOZXcodm9pZCk7Ci19IC8vIFdlYkNvcmUKK0dUeXBlIHdl
YmtpdF9tZWRpYV9zdHJlYW1fc3JjX2dldF90eXBlKHZvaWQpOworCit0eXBlZGVmIHN0cnVjdCBf
V2ViS2l0TWVkaWFTdHJlYW1TcmMgV2ViS2l0TWVkaWFTdHJlYW1TcmM7Cit0eXBlZGVmIHN0cnVj
dCBfV2ViS2l0TWVkaWFTdHJlYW1TcmNDbGFzcyBXZWJLaXRNZWRpYVN0cmVhbVNyY0NsYXNzOwor
dHlwZWRlZiBzdHJ1Y3QgX1dlYktpdE1lZGlhU3RyZWFtU3JjUHJpdmF0ZSBXZWJLaXRNZWRpYVN0
cmVhbVNyY1ByaXZhdGU7CisKK3N0cnVjdCBfV2ViS2l0TWVkaWFTdHJlYW1TcmMgeworICAgIEdz
dEJpbiBwYXJlbnQ7CisgICAgV2ViS2l0TWVkaWFTdHJlYW1TcmNQcml2YXRlKiBwcml2OworfTsK
Kworc3RydWN0IF9XZWJLaXRNZWRpYVN0cmVhbVNyY0NsYXNzIHsKKyAgICBHc3RCaW5DbGFzcyBw
YXJlbnRDbGFzczsKK307CisKK3ZvaWQgd2Via2l0TWVkaWFTdHJlYW1TcmNTZXRTdHJlYW0oV2Vi
S2l0TWVkaWFTdHJlYW1TcmMqLCBXZWJDb3JlOjpNZWRpYVN0cmVhbVByaXZhdGUqKTsKK3ZvaWQg
d2Via2l0TWVkaWFTdHJlYW1TcmNBZGRUcmFjayhXZWJLaXRNZWRpYVN0cmVhbVNyYyosIFdlYkNv
cmU6Ok1lZGlhU3RyZWFtVHJhY2tQcml2YXRlKiwgYm9vbCBvbmx5VHJhY2spOworR3N0RWxlbWVu
dCogd2Via2l0TWVkaWFTdHJlYW1TcmNOZXcoKTsKKworR19FTkRfREVDTFMKIAotI2VuZGlmIC8v
IEVOQUJMRShWSURFTykgJiYgRU5BQkxFKE1FRElBX1NUUkVBTSkgJiYgVVNFKExJQldFQlJUQykK
KyNlbmRpZiAvLyBFTkFCTEUoVklERU8pICYmIEVOQUJMRShNRURJQV9TVFJFQU0pICYmIFVTRShH
U1RSRUFNRVIpCg==
</data>
<flag name="review"
          id="418557"
          type_id="1"
          status="+"
          setter="calvaris"
    />
    <flag name="commit-queue"
          id="418648"
          type_id="3"
          status="-"
          setter="calvaris"
    />
          </attachment>
      

    </bug>

</bugzilla>