<?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>24689</bug_id>
          
          <creation_ts>2009-03-18 18:11:06 -0700</creation_ts>
          <short_desc>Upstream V8 bindings for Workers proxies.</short_desc>
          <delta_ts>2009-03-30 16:33:51 -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="Dmitry Titov">dimich</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>dglazkov</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>114260</commentid>
    <comment_count>0</comment_count>
    <who name="Dmitry Titov">dimich</who>
    <bug_when>2009-03-18 18:11:06 -0700</bug_when>
    <thetext>Adding V8 bindings for Workers proxies, converting the coding style to WebKit as much as possible.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114263</commentid>
    <comment_count>1</comment_count>
      <attachid>28741</attachid>
    <who name="Dmitry Titov">dimich</who>
    <bug_when>2009-03-18 18:13:43 -0700</bug_when>
    <thetext>Created attachment 28741
Proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114269</commentid>
    <comment_count>2</comment_count>
      <attachid>28742</attachid>
    <who name="Dmitry Titov">dimich</who>
    <bug_when>2009-03-18 18:40:56 -0700</bug_when>
    <thetext>Created attachment 28742
Updated patch.

Fixed ChangeLog, Copyright and couple of style issues noted by David Levin.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114331</commentid>
    <comment_count>3</comment_count>
      <attachid>28742</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-03-19 10:25:31 -0700</bug_when>
    <thetext>Comment on attachment 28742
Updated patch.



&gt; +#include &quot;v8Binding.h&quot;
V8Binding

&gt; +#include &quot;v8Proxy.h&quot;
V8Proxy

&gt; +#include &quot;v8_index.h&quot;
Ideally, we should create V8Index.h that forwards to v8_index, just like I did for V8Proxy and friends. But this include isn&apos;t needed, right? V8Proxy includes v8_index.

&gt; +    v8::Handle&lt;v8::String&gt; implicit_proto_string = v8::String::New(&quot;__proto__&quot;);

implicitProtoString?
this method needs to be scrubbed for local var naming.

&gt; +    v8::TryCatch try_catch;
tryCatch.

&gt; +v8::Handle&lt;v8::Value&gt; WorkerContextExecutionProxy::ToV8Object(V8ClassIndex::V8WrapperType type, void* impl)

toV8Object

&gt; +    if (!impl)
&gt; +        return v8::Null();
&gt; +
&gt; +    if (type == V8ClassIndex::WORKERCONTEXT)
&gt; +        return WorkerContextToV8Object(static_cast&lt;WorkerContext*&gt;(impl));
&gt; +
&gt; +    // Non DOM node
&gt; +    v8::Persistent&lt;v8::Object&gt; result = GetDOMObjectMap().get(impl);
Perhaps it would be good to add a domObjectMap() helper to V8Proxy, which for now wraps around GetDOMObjectMap?

&gt; +    if (result.IsEmpty()) {
&gt; +        v8::Local&lt;v8::Object&gt; v8obj = instantiateV8Object(type, type, impl);
probably just object in this context.

&gt; +    v8::Handle&lt;v8::Object&gt; result = instantiateV8Object(type, V8ClassIndex::EVENT, event);
can I recommend renaming instantiateV8Object to toV8? It&apos;s a convention I&apos;ve seen in JSC (toJS), and it&apos;s less verbose.

&gt; +    m_listeners.push_back(listener.get());

push_back?! This smells like std::list -- and it is!! We should use Vector here.
&gt; +#include &quot;v8.h&quot;
&lt;v8.h&gt;

&gt; +#include &quot;v8_index.h&quot;
Really need V8Index.h, then.

&gt; +        // Returns a local handle of the context.
&gt; +        v8::Local&lt;v8::Context&gt; GetContext() { return v8::Local&lt;v8::Context&gt;::New(m_context); }

context();

&gt; +
&gt; +        // Returns the dom constructor function for the given node type.
&gt; +        v8::Local&lt;v8::Function&gt; GetConstructor(V8ClassIndex::V8WrapperType);

constructor();

&gt; +
&gt; +        // Finds or creates an event listener;
&gt; +        PassRefPtr&lt;V8EventListener&gt; FindOrCreateEventListener(v8::Local&lt;v8::Value&gt; listener, bool isInline, bool findOnly);

findOrCreateEventListener

&gt; +
&gt; +        // Removes an event listener;
&gt; +        void RemoveEventListener(V8EventListener*);

removeEventListener

&gt; +
&gt; +        // Track the event so that we can detach it from the JS wrapper when a worker
&gt; +        // terminates. This is needed because we need to be able to dispose these
&gt; +        // events and releases references to their event targets: WorkerContext.
&gt; +        void TrackEvent(Event*);

trackEvent

&gt; +        // Returns the JS wrapper of object.
&gt; +        static v8::Handle&lt;v8::Value&gt; ToV8Object(V8ClassIndex::V8WrapperType type, void* impl);
&gt; +        static v8::Handle&lt;v8::Value&gt; EventToV8Object(Event* event);
&gt; +        static v8::Handle&lt;v8::Value&gt; EventTargetToV8Object(EventTarget* target);
&gt; +        static v8::Handle&lt;v8::Value&gt; WorkerContextToV8Object(WorkerContext* wc);

camelCase for all these.

&gt; +        typedef std::list&lt;V8EventListener*&gt; EventListenerList;

Vector&lt;V8EventListener*&gt;, and typedefs typically go on top of all decls.

&gt; diff --git a/WebCore/bindings/v8/WorkerScriptController.cpp b/WebCore/bindings/v8/WorkerScriptController.cpp
&gt; +#include &quot;v8.h&quot;
&lt;v8.h&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114351</commentid>
    <comment_count>4</comment_count>
    <who name="Dmitry Titov">dimich</who>
    <bug_when>2009-03-19 12:42:31 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 28742 [review])
&gt; &gt; +#include &quot;v8Binding.h&quot;
&gt; V8Binding
&gt; &gt; +#include &quot;v8Proxy.h&quot;
&gt; V8Proxy

Done.

&gt; &gt; +#include &quot;v8_index.h&quot;
&gt; Ideally, we should create V8Index.h that forwards to v8_index, just like I did
&gt; for V8Proxy and friends. But this include isn&apos;t needed, right? V8Proxy includes
&gt; v8_index.

Removed the include. Not needed indeed.

&gt; &gt; +    v8::Handle&lt;v8::String&gt; implicit_proto_string = v8::String::New(&quot;__proto__&quot;);
&gt; 
&gt; implicitProtoString?
&gt; this method needs to be scrubbed for local var naming.

Scrubbed. Scrubbed other methods in this file too.

&gt; &gt; +    v8::TryCatch try_catch;
&gt; tryCatch.

Done.

&gt; &gt; +v8::Handle&lt;v8::Value&gt; WorkerContextExecutionProxy::ToV8Object(V8ClassIndex::V8WrapperType type, void* impl)
&gt; 
&gt; toV8Object

Can not do now, see comment at the bottom.

&gt; &gt; +    v8::Persistent&lt;v8::Object&gt; result = GetDOMObjectMap().get(impl);
&gt; Perhaps it would be good to add a domObjectMap() helper to V8Proxy, which for
&gt; now wraps around GetDOMObjectMap?

Done. 

&gt; &gt; +        v8::Local&lt;v8::Object&gt; v8obj = instantiateV8Object(type, type, impl);
&gt; probably just object in this context.

Changed to object.

&gt; &gt; +    v8::Handle&lt;v8::Object&gt; result = instantiateV8Object(type, V8ClassIndex::EVENT, event);
&gt; can I recommend renaming instantiateV8Object to toV8? It&apos;s a convention I&apos;ve
&gt; seen in JSC (toJS), and it&apos;s less verbose.

Done.

&gt; &gt; +    m_listeners.push_back(listener.get());
&gt; push_back?! This smells like std::list -- and it is!! We should use Vector
&gt; here.

Replaced with Vector.

&gt; &gt; +#include &quot;v8.h&quot;
&gt; &lt;v8.h&gt;

Done.

&gt; &gt; +#include &quot;v8_index.h&quot;
&gt; Really need V8Index.h, then.

Created V8Index.h, added to the patch.

&gt; &gt; +        v8::Local&lt;v8::Context&gt; GetContext() { return v8::Local&lt;v8::Context&gt;::New(m_context); }
&gt; 
&gt; context();

Can not do, see below.

&gt; &gt; +        v8::Local&lt;v8::Function&gt; GetConstructor(V8ClassIndex::V8WrapperType);
&gt; 
&gt; constructor();

Can not do, see below.

&gt; 
&gt; &gt; +        PassRefPtr&lt;V8EventListener&gt; FindOrCreateEventListener(v8::Local&lt;v8::Value&gt; listener, bool isInline, bool findOnly);
&gt; 
&gt; findOrCreateEventListener

Can not do, see below.

&gt; &gt; +        void RemoveEventListener(V8EventListener*);
&gt; 
&gt; removeEventListener

Can not do, see below.

&gt; &gt; +        void TrackEvent(Event*);
&gt; 
&gt; trackEvent

Done.

&gt; &gt; +        // Returns the JS wrapper of object.
&gt; &gt; +        static v8::Handle&lt;v8::Value&gt; ToV8Object(V8ClassIndex::V8WrapperType type, void* impl);
&gt; &gt; +        static v8::Handle&lt;v8::Value&gt; EventToV8Object(Event* event);
&gt; &gt; +        static v8::Handle&lt;v8::Value&gt; EventTargetToV8Object(EventTarget* target);
&gt; &gt; +        static v8::Handle&lt;v8::Value&gt; WorkerContextToV8Object(WorkerContext* wc);
&gt; 
&gt; camelCase for all these.

Can not do, see below.

&gt; &gt; +        typedef std::list&lt;V8EventListener*&gt; EventListenerList;
&gt; Vector&lt;V8EventListener*&gt;, and typedefs typically go on top of all decls.

Converted to Vector and don&apos;t need a typedef anymore (because Vector is iterated by index and not by iterator, for which the typedef was used before)

&gt; &gt; +#include &quot;v8.h&quot;
&gt; &lt;v8.h&gt;

Done.
--------------------------

There are several methods that this class implements that can not be camelCased right now - because the V8 code-generating script still generates them capitalized. The easiest way to change that would be to change the naming when the code-generating script will be upstreamed - at this point, all the files to be changed will be in one place (WebKit.org)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114353</commentid>
    <comment_count>5</comment_count>
      <attachid>28758</attachid>
    <who name="Dmitry Titov">dimich</who>
    <bug_when>2009-03-19 12:43:36 -0700</bug_when>
    <thetext>Created attachment 28758
Updated patch.

Updated per Dimitry&apos;s comments ^^^.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114369</commentid>
    <comment_count>6</comment_count>
      <attachid>28758</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-03-19 13:49:08 -0700</bug_when>
    <thetext>Comment on attachment 28758
Updated patch.

We&apos;re very, very close! One more round of bathing, as eseidel used to say, and we&apos;re home.

&gt; +    v8::HandleScope scope;
&gt; +    v8::Persistent&lt;v8::Object&gt; wrapper = GetDOMObjectMap().get(m_workerContext);
&gt; +    if (!wrapper.IsEmpty())
&gt; +        V8Proxy::SetDOMWrapper(wrapper, V8ClassIndex::INVALID_CLASS_INDEX, NULL);
&gt; +    GetDOMObjectMap().forget(m_workerContext);

domObjectMap
&gt; +
&gt; +    // Insert the object instance as the prototype of the shadow object.
&gt; +    v8::Handle&lt;v8::Object&gt; v8_global = m_context-&gt;Global();
&gt; +    v8_global-&gt;Set(implicitProtoString, jsWorkerContext);
&gt; +}

global or globalObject

&gt; +    // Non DOM node
&gt; +    v8::Persistent&lt;v8::Object&gt; result = GetDOMObjectMap().get(impl);

domObjectMap

&gt; +    v8::Handle&lt;v8::Object&gt; wrapper = GetDOMObjectMap().get(event);

domObjectMap

&gt; +    if (GetDOMObjectMap().contains(event)) {
&gt; +        GetDOMObjectMap().forget(event);

getDOMObjectMap</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114397</commentid>
    <comment_count>7</comment_count>
      <attachid>28768</attachid>
    <who name="Dmitry Titov">dimich</who>
    <bug_when>2009-03-19 16:04:42 -0700</bug_when>
    <thetext>Created attachment 28768
Asymptotically approaching the cleanness.

Ny bad, somehow I missed the domObjectMap() change, I thought I did it but it&apos;s not in the patch :-)
This one should be closer.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114434</commentid>
    <comment_count>8</comment_count>
      <attachid>28768</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-03-19 19:37:34 -0700</bug_when>
    <thetext>Comment on attachment 28768
Asymptotically approaching the cleanness.

ship it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114514</commentid>
    <comment_count>9</comment_count>
    <who name="Dmitry Titov">dimich</who>
    <bug_when>2009-03-20 10:37:21 -0700</bug_when>
    <thetext>Landed: http://trac.webkit.org/changeset/41862</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114949</commentid>
    <comment_count>10</comment_count>
    <who name="Dmitry Titov">dimich</who>
    <bug_when>2009-03-24 09:49:59 -0700</bug_when>
    <thetext>While files were finally scrubbed for WebKit style, couple of errors was introduced. Now that they are merged into Chromium and compiled, need to update the upstream copy. Patch forthcoming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114954</commentid>
    <comment_count>11</comment_count>
      <attachid>28892</attachid>
    <who name="Dmitry Titov">dimich</who>
    <bug_when>2009-03-24 09:53:35 -0700</bug_when>
    <thetext>Created attachment 28892
Fixes after merge into Chromium.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>114955</commentid>
    <comment_count>12</comment_count>
      <attachid>28892</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-03-24 10:04:45 -0700</bug_when>
    <thetext>Comment on attachment 28892
Fixes after merge into Chromium.

Boy, do I feel stoopid for not catching &quot;= ;&quot;. :-\</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>115932</commentid>
    <comment_count>13</comment_count>
    <who name="Dmitry Titov">dimich</who>
    <bug_when>2009-03-30 16:33:51 -0700</bug_when>
    <thetext>Landed: http://trac.webkit.org/changeset/41941</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>28741</attachid>
            <date>2009-03-18 18:13:43 -0700</date>
            <delta_ts>2009-03-18 18:40:56 -0700</delta_ts>
            <desc>Proposed patch</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>26463</size>
            <attacher name="Dmitry Titov">dimich</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YzcwMWY3ZC4uMGQyYzdhOSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0MiBAQAorMjAwOS0wMy0xOCAgRG1pdHJ5IFRpdG92
ICA8ZGltaWNoQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MjQ2ODkKKyAgICAgICAgQWRkICh1cHN0cmVhbSkgVjggYmluZGluZ3MgZm9yIFdvcmtlcnMuCisK
KyAgICAgICAgKiBiaW5kaW5ncy92OC9Xb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkuY3BwOiBB
ZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OldvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6aXNX
ZWJXb3JrZXJzRW5hYmxlZCk6CisgICAgICAgIChXZWJDb3JlOjpXb3JrZXJDb250ZXh0RXhlY3V0
aW9uUHJveHk6OnNldElzV2ViV29ya2Vyc0VuYWJsZWQpOgorICAgICAgICAoV2ViQ29yZTo6V29y
a2VyQ29udGV4dEV4ZWN1dGlvblByb3h5OjpXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkpOgor
ICAgICAgICAoV2ViQ29yZTo6V29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5Ojp+V29ya2VyQ29u
dGV4dEV4ZWN1dGlvblByb3h5KToKKyAgICAgICAgKFdlYkNvcmU6OldvcmtlckNvbnRleHRFeGVj
dXRpb25Qcm94eTo6ZGlzcG9zZSk6CisgICAgICAgIChXZWJDb3JlOjpXb3JrZXJDb250ZXh0RXhl
Y3V0aW9uUHJveHk6OnJldHJpZXZlKToKKyAgICAgICAgKFdlYkNvcmU6OldvcmtlckNvbnRleHRF
eGVjdXRpb25Qcm94eTo6aW5pdENvbnRleHRJZk5lZWRlZCk6CisgICAgICAgIChXZWJDb3JlOjpX
b3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6OkdldENvbnN0cnVjdG9yKToKKyAgICAgICAgKFdl
YkNvcmU6OldvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6VG9WOE9iamVjdCk6CisgICAgICAg
IChXZWJDb3JlOjpXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6OkV2ZW50VG9WOE9iamVjdCk6
CisgICAgICAgIChXZWJDb3JlOjpXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6OkV2ZW50VGFy
Z2V0VG9WOE9iamVjdCk6CisgICAgICAgIChXZWJDb3JlOjpXb3JrZXJDb250ZXh0RXhlY3V0aW9u
UHJveHk6OldvcmtlckNvbnRleHRUb1Y4T2JqZWN0KToKKyAgICAgICAgKFdlYkNvcmU6Oldvcmtl
ckNvbnRleHRFeGVjdXRpb25Qcm94eTo6aW5zdGFudGlhdGVWOE9iamVjdCk6CisgICAgICAgIChX
ZWJDb3JlOjpXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6OmZvcmdldFY4RXZlbnRPYmplY3Qp
OgorICAgICAgICAoV2ViQ29yZTo6V29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5OjpldmFsdWF0
ZSk6CisgICAgICAgIChXZWJDb3JlOjpXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6OnJ1blNj
cmlwdCk6CisgICAgICAgIChXZWJDb3JlOjpXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6OkZp
bmRPckNyZWF0ZUV2ZW50TGlzdGVuZXIpOgorICAgICAgICAoV2ViQ29yZTo6V29ya2VyQ29udGV4
dEV4ZWN1dGlvblByb3h5OjpSZW1vdmVFdmVudExpc3RlbmVyKToKKyAgICAgICAgKFdlYkNvcmU6
OldvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6VHJhY2tFdmVudCk6CisgICAgICAgICogYmlu
ZGluZ3MvdjgvV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5Lmg6IEFkZGVkLgorICAgICAgICAo
V2ViQ29yZTo6V29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5OjpHZXRDb250ZXh0KToKKyAgICAg
ICAgKFdlYkNvcmU6OldvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6d29ya2VyQ29udGV4dCk6
CisgICAgICAgICogYmluZGluZ3MvdjgvV29ya2VyU2NyaXB0Q29udHJvbGxlci5jcHA6IEFkZGVk
LgorICAgICAgICAoV2ViQ29yZTo6V29ya2VyU2NyaXB0Q29udHJvbGxlcjo6V29ya2VyU2NyaXB0
Q29udHJvbGxlcik6CisgICAgICAgIChXZWJDb3JlOjpXb3JrZXJTY3JpcHRDb250cm9sbGVyOjp+
V29ya2VyU2NyaXB0Q29udHJvbGxlcik6CisgICAgICAgIChXZWJDb3JlOjpXb3JrZXJTY3JpcHRD
b250cm9sbGVyOjpldmFsdWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpXb3JrZXJTY3JpcHRDb250
cm9sbGVyOjpmb3JiaWRFeGVjdXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6V29ya2VyU2NyaXB0
Q29udHJvbGxlcjo6c2V0RXhjZXB0aW9uKToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9Xb3JrZXJT
Y3JpcHRDb250cm9sbGVyLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6V29ya2VyU2NyaXB0
Q29udHJvbGxlcjo6cHJveHkpOgorCiAyMDA5LTAzLTE3ICBPamFuIFZhZmFpICA8b2phbkBjaHJv
bWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQWRlbGUgUGV0ZXJzb24uCmRpZmYgLS1n
aXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L1dvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eS5jcHAg
Yi9XZWJDb3JlL2JpbmRpbmdzL3Y4L1dvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eS5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQyOGI5NAotLS0gL2Rldi9udWxsCisr
KyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5LmNwcApA
QCAtMCwwICsxLDM2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMDA5IEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisg
KiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdo
dCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5h
bWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBt
YXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisg
KiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xE
RVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg
Q09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAor
ICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoV09SS0VS
UykKKworI2luY2x1ZGUgIldvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eS5oIgorCisjaW5jbHVk
ZSAidjhCaW5kaW5nLmgiCisjaW5jbHVkZSAidjhQcm94eS5oIgorI2luY2x1ZGUgInY4X2luZGV4
LmgiCisjaW5jbHVkZSAiRXZlbnQuaCIKKyNpbmNsdWRlICJWOFdvcmtlckNvbnRleHRFdmVudExp
c3RlbmVyLmgiCisjaW5jbHVkZSAiV29ya2VyQ29udGV4dC5oIgorI2luY2x1ZGUgIldvcmtlckxv
Y2F0aW9uLmgiCisjaW5jbHVkZSAiV29ya2VyTmF2aWdhdG9yLmgiCisjaW5jbHVkZSAiV29ya2Vy
U2NyaXB0Q29udHJvbGxlci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBib29s
IGlzV29ya2Vyc0VuYWJsZWQgPSBmYWxzZTsKKworYm9vbCBXb3JrZXJDb250ZXh0RXhlY3V0aW9u
UHJveHk6OmlzV2ViV29ya2Vyc0VuYWJsZWQoKQoreworICAgIHJldHVybiBpc1dvcmtlcnNFbmFi
bGVkOworfQorCit2b2lkIFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6c2V0SXNXZWJXb3Jr
ZXJzRW5hYmxlZChib29sIHZhbHVlKQoreworICAgIGlzV29ya2Vyc0VuYWJsZWQgPSB2YWx1ZTsK
K30KKworV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5OjpXb3JrZXJDb250ZXh0RXhlY3V0aW9u
UHJveHkoV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCkKKyAgICA6IG1fd29ya2VyQ29udGV4
dCh3b3JrZXJDb250ZXh0KQorICAgICwgbV9yZWN1cnNpb24oMCkKK3sKK30KKworV29ya2VyQ29u
dGV4dEV4ZWN1dGlvblByb3h5Ojp+V29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5KCkKK3sKKyAg
ICBkaXNwb3NlKCk7Cit9CisKK3ZvaWQgV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5OjpkaXNw
b3NlKCkKK3sKKyAgICAvLyBEaXNjb25uZWN0IGFsbCBldmVudCBsaXN0ZW5lcnMuCisgICAgZm9y
IChFdmVudExpc3RlbmVyTGlzdDo6aXRlcmF0b3IgaXRlciA9IG1fbGlzdGVuZXJzLmJlZ2luKCk7
IGl0ZXIgIT0gbV9saXN0ZW5lcnMuZW5kKCk7ICArK2l0ZXIpCisgICAgICAgIHN0YXRpY19jYXN0
PFY4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXIqPigqaXRlciktPmRpc2Nvbm5lY3QoKTsKKwor
ICAgIG1fbGlzdGVuZXJzLmNsZWFyKCk7CisKKyAgICAvLyBEZXRhY2ggYWxsIGV2ZW50cyBmcm9t
IHRoZWlyIEpTIHdyYXBwZXJzLgorICAgIGZvciAoRXZlbnRTZXQ6Oml0ZXJhdG9yIGl0ZXIgPSBt
X2V2ZW50cy5iZWdpbigpOyBpdGVyICE9IG1fZXZlbnRzLmVuZCgpOyAgKytpdGVyKSB7CisgICAg
ICAgIEV2ZW50KiBldmVudCA9ICppdGVyOworICAgICAgICBpZiAoZm9yZ2V0VjhFdmVudE9iamVj
dChldmVudCkpCisgICAgICAgICAgZXZlbnQtPmRlcmVmKCk7CisgICAgfQorICAgIG1fZXZlbnRz
LmNsZWFyKCk7CisKKyAgICAvLyBEaXNwb3NlIHRoZSBjb250ZXh0LgorICAgIGlmICghbV9jb250
ZXh0LklzRW1wdHkoKSkgeworICAgICAgICBtX2NvbnRleHQuRGlzcG9zZSgpOworICAgICAgICBt
X2NvbnRleHQuQ2xlYXIoKTsKKyAgICB9CisKKyAgICAvLyBSZW1vdmUgdGhlIHdyYXBwaW5nIGJl
dHdlZW4gSlMgb2JqZWN0IGFuZCBET00gb2JqZWN0LiBUaGlzIGlzIGJlY2F1c2UKKyAgICAvLyB0
aGUgd29ya2VyIGNvbnRleHQgb2JqZWN0IGlzIGdvaW5nIHRvIGJlIGRpc3Bvc2VkIGltbWVkaWF0
ZWx5IHdoZW4gYQorICAgIC8vIHdvcmtlciB0aHJlYWQgaXMgdGVhcmluZyBkb3duLiBXZSBkbyBu
b3Qgd2FudCB0byByZS1kZWxldGUgdGhlIHJlYWwgb2JqZWN0CisgICAgLy8gd2hlbiBKUyBvYmpl
Y3QgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgICAgdjg6OkxvY2tlciBsb2NrZXI7CisgICAgdjg6
OkhhbmRsZVNjb3BlIHNjb3BlOworICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHdyYXBw
ZXIgPSBHZXRET01PYmplY3RNYXAoKS5nZXQobV93b3JrZXJDb250ZXh0KTsKKyAgICBpZiAoIXdy
YXBwZXIuSXNFbXB0eSgpKQorICAgICAgICBWOFByb3h5OjpTZXRET01XcmFwcGVyKHdyYXBwZXIs
IFY4Q2xhc3NJbmRleDo6SU5WQUxJRF9DTEFTU19JTkRFWCwgTlVMTCk7CisgICAgR2V0RE9NT2Jq
ZWN0TWFwKCkuZm9yZ2V0KG1fd29ya2VyQ29udGV4dCk7Cit9CisKK1dvcmtlckNvbnRleHRFeGVj
dXRpb25Qcm94eSogV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5OjpyZXRyaWV2ZSgpCit7Cisg
ICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IHY4OjpDb250ZXh0OjpHZXRDdXJy
ZW50KCk7CisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBnbG9iYWwgPSBjb250ZXh0LT5HbG9i
YWwoKTsKKyAgICBnbG9iYWwgPSBWOFByb3h5OjpMb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRl
eDo6V09SS0VSQ09OVEVYVCwgZ2xvYmFsKTsKKyAgICBBU1NFUlQoIWdsb2JhbC5Jc0VtcHR5KCkp
OworICAgIFdvcmtlckNvbnRleHQqIHdvcmtlcl9jb250ZXh0ID0gVjhQcm94eTo6VG9OYXRpdmVP
YmplY3Q8V29ya2VyQ29udGV4dD4oVjhDbGFzc0luZGV4OjpXT1JLRVJDT05URVhULCBnbG9iYWwp
OworICAgIHJldHVybiB3b3JrZXJfY29udGV4dC0+c2NyaXB0KCktPnByb3h5KCk7Cit9CisKK3Zv
aWQgV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5Ojppbml0Q29udGV4dElmTmVlZGVkKCkKK3sK
KyAgICAvLyBCYWlsIG91dCBpZiB0aGUgY29udGV4dCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxp
emVkLgorICAgIGlmICghbV9jb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgLy8gQ3JlYXRlIGEgbmV3IGVudmlyb25tZW50CisgICAgdjg6OlBlcnNpc3RlbnQ8djg6Ok9i
amVjdFRlbXBsYXRlPiBnbG9iYWxfdGVtcGxhdGU7CisgICAgbV9jb250ZXh0ID0gdjg6OkNvbnRl
eHQ6Ok5ldyhOVUxMLCBnbG9iYWxfdGVtcGxhdGUpOworCisgICAgLy8gU3RhcnRpbmcgZnJvbSBu
b3csIHVzZSBsb2NhbCBjb250ZXh0IG9ubHkuCisgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBj
b250ZXh0ID0gdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KG1fY29udGV4dCk7CisgICAgdjg6
OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOworCisgICAgLy8gQWxsb2NhdGUgc3RyaW5n
cyB1c2VkIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAgICB2ODo6SGFuZGxlPHY4OjpTdHJpbmc+
IGltcGxpY2l0X3Byb3RvX3N0cmluZyA9IHY4OjpTdHJpbmc6Ok5ldygiX19wcm90b19fIik7CisK
KyAgICAvLyBDcmVhdGUgYSBuZXcgSlMgb2JqZWN0IGFuZCB1c2UgaXQgYXMgdGhlIHByb3RvdHlw
ZSBmb3IgdGhlIHNoYWRvdyBnbG9iYWwgb2JqZWN0LgorICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0
aW9uPiB3b3JrZXJfY29udGV4dF9jb25zdHJ1Y3RvciA9IEdldENvbnN0cnVjdG9yKFY4Q2xhc3NJ
bmRleDo6V09SS0VSQ09OVEVYVCk7CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGpzX3dvcmtl
cl9jb250ZXh0ID0gU2FmZUFsbG9jYXRpb246Ok5ld0luc3RhbmNlKHdvcmtlcl9jb250ZXh0X2Nv
bnN0cnVjdG9yKTsKKyAgICAvLyBCYWlsIG91dCBpZiBhbGxvY2F0aW9uIGZhaWxlZC4KKyAgICBp
ZiAoanNfd29ya2VyX2NvbnRleHQuSXNFbXB0eSgpKSB7CisgICAgICAgIGRpc3Bvc2UoKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFdyYXAgdGhlIG9iamVjdC4KKyAgICBWOFBy
b3h5OjpTZXRET01XcmFwcGVyKGpzX3dvcmtlcl9jb250ZXh0LCBWOENsYXNzSW5kZXg6OlRvSW50
KFY4Q2xhc3NJbmRleDo6V09SS0VSQ09OVEVYVCksIG1fd29ya2VyQ29udGV4dCk7CisKKyAgICBW
OFByb3h5OjpTZXRKU1dyYXBwZXJGb3JET01PYmplY3QobV93b3JrZXJDb250ZXh0LCB2ODo6UGVy
c2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KGpzX3dvcmtlcl9jb250ZXh0KSk7CisKKyAgICAvLyBJ
bnNlcnQgdGhlIG9iamVjdCBpbnN0YW5jZSBhcyB0aGUgcHJvdG90eXBlIG9mIHRoZSBzaGFkb3cg
b2JqZWN0LgorICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gdjhfZ2xvYmFsID0gbV9jb250ZXh0
LT5HbG9iYWwoKTsKKyAgICB2OF9nbG9iYWwtPlNldChpbXBsaWNpdF9wcm90b19zdHJpbmcsIGpz
X3dvcmtlcl9jb250ZXh0KTsKK30KKwordjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4gV29ya2VyQ29u
dGV4dEV4ZWN1dGlvblByb3h5OjpHZXRDb25zdHJ1Y3RvcihWOENsYXNzSW5kZXg6OlY4V3JhcHBl
clR5cGUgdHlwZSkKK3sKKyAgICAvLyBFbnRlciB0aGUgY29udGV4dCBvZiB0aGUgcHJveHkgdG8g
bWFrZSBzdXJlIHRoYXQgdGhlIGZ1bmN0aW9uIGlzCisgICAgLy8gY29uc3RydWN0ZWQgaW4gdGhl
IGNvbnRleHQgY29ycmVzcG9uZGluZyB0byB0aGlzIHByb3h5LgorICAgIHY4OjpDb250ZXh0OjpT
Y29wZSBzY29wZShtX2NvbnRleHQpOworICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uVGVtcGxh
dGU+IGZ1bmN0aW9uVGVtcGxhdGUgPSBWOFByb3h5OjpHZXRUZW1wbGF0ZSh0eXBlKTsKKworICAg
IC8vIEdldHRpbmcgdGhlIGZ1bmN0aW9uIG1pZ2h0IGZhaWwgaWYgd2UncmUgcnVubmluZyBvdXQg
b2YKKyAgICAvLyBzdGFjayBvciBtZW1vcnkuCisgICAgdjg6OlRyeUNhdGNoIHRyeV9jYXRjaDsK
KyAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiB2YWx1ZSA9IGZ1bmN0aW9uVGVtcGxhdGUtPkdl
dEZ1bmN0aW9uKCk7CisgICAgaWYgKHZhbHVlLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHY4
OjpMb2NhbDx2ODo6RnVuY3Rpb24+KCk7CisKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK3Y4OjpI
YW5kbGU8djg6OlZhbHVlPiBXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6OlRvVjhPYmplY3Qo
VjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUsIHZvaWQqIGltcGwpCit7CisgICAgaWYg
KCFpbXBsKQorICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKKworICAgIGlmICh0eXBlID09IFY4
Q2xhc3NJbmRleDo6V09SS0VSQ09OVEVYVCkKKyAgICAgICAgcmV0dXJuIFdvcmtlckNvbnRleHRU
b1Y4T2JqZWN0KHN0YXRpY19jYXN0PFdvcmtlckNvbnRleHQqPihpbXBsKSk7CisKKyAgICAvLyBO
b24gRE9NIG5vZGUKKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiByZXN1bHQgPSBHZXRE
T01PYmplY3RNYXAoKS5nZXQoaW1wbCk7CisgICAgaWYgKHJlc3VsdC5Jc0VtcHR5KCkpIHsKKyAg
ICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IHY4b2JqID0gaW5zdGFudGlhdGVWOE9iamVjdCh0
eXBlLCB0eXBlLCBpbXBsKTsKKyAgICAgICAgaWYgKCF2OG9iai5Jc0VtcHR5KCkpIHsKKyAgICAg
ICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBWOENsYXNzSW5kZXg6OldP
UktFUkxPQ0FUSU9OOgorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFdvcmtlckxvY2F0aW9u
Kj4oaW1wbCktPnJlZigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2Fz
ZSBWOENsYXNzSW5kZXg6OldPUktFUk5BVklHQVRPUjoKKyAgICAgICAgICAgICAgICBzdGF0aWNf
Y2FzdDxXb3JrZXJOYXZpZ2F0b3IqPihpbXBsKS0+cmVmKCk7CisgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFTU0VSVChmYWxzZSk7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSB2ODo6UGVyc2lzdGVudDx2ODo6
T2JqZWN0Pjo6TmV3KHY4b2JqKTsKKyAgICAgICAgICAgIFY4UHJveHk6OlNldEpTV3JhcHBlckZv
ckRPTU9iamVjdChpbXBsLCByZXN1bHQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBy
ZXN1bHQ7Cit9CisKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBXb3JrZXJDb250ZXh0RXhlY3V0aW9u
UHJveHk6OkV2ZW50VG9WOE9iamVjdChFdmVudCogZXZlbnQpCit7CisgICAgaWYgKCFldmVudCkK
KyAgICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+
IHdyYXBwZXIgPSBHZXRET01PYmplY3RNYXAoKS5nZXQoZXZlbnQpOworICAgIGlmICghd3JhcHBl
ci5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB3cmFwcGVyOworCisgICAgVjhDbGFzc0luZGV4
OjpWOFdyYXBwZXJUeXBlIHR5cGUgPSBWOENsYXNzSW5kZXg6OkVWRU5UOworCisgICAgaWYgKGV2
ZW50LT5pc01lc3NhZ2VFdmVudCgpKQorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpNRVNT
QUdFRVZFTlQ7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHJlc3VsdCA9IGluc3RhbnRp
YXRlVjhPYmplY3QodHlwZSwgVjhDbGFzc0luZGV4OjpFVkVOVCwgZXZlbnQpOworICAgIGlmIChy
ZXN1bHQuSXNFbXB0eSgpKSB7CisgICAgICAgIC8vIEluc3RhbnRpYXRpb24gZmFpbGVkLiBBdm9p
ZCB1cGRhdGluZyB0aGUgRE9NIG9iamVjdCBtYXAgYW5kIHJldHVybiBudWxsIHdoaWNoCisgICAg
ICAgIC8vIGlzIGFscmVhZHkgaGFuZGxlZCBieSBjYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24gaW4g
Y2FzZSB0aGUgZXZlbnQgaXMgTlVMTC4KKyAgICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7CisgICAg
fQorCisgICAgZXZlbnQtPnJlZigpOyAgLy8gZmFzdCByZWYKKyAgICBWOFByb3h5OjpTZXRKU1dy
YXBwZXJGb3JET01PYmplY3QoZXZlbnQsIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXco
cmVzdWx0KSk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBBIEpTIG9iamVjdCBvZiB0
eXBlIEV2ZW50VGFyZ2V0IGluIHRoZSB3b3JrZXIgY29udGV4dCBjYW4gb25seSBiZSBXb3JrZXJD
b250ZXh0Lgordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94
eTo6RXZlbnRUYXJnZXRUb1Y4T2JqZWN0KEV2ZW50VGFyZ2V0KiB0YXJnZXQpCit7CisgICAgaWYg
KCF0YXJnZXQpCisgICAgICAgIHJldHVybiB2ODo6TnVsbCgpOworCisgICAgV29ya2VyQ29udGV4
dCogd29ya2VyX2NvbnRleHQgPSB0YXJnZXQtPnRvV29ya2VyQ29udGV4dCgpOworICAgIGlmICh3
b3JrZXJfY29udGV4dCkKKyAgICAgICAgcmV0dXJuIFdvcmtlckNvbnRleHRUb1Y4T2JqZWN0KHdv
cmtlcl9jb250ZXh0KTsKKworICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiB2
ODo6SGFuZGxlPHY4OjpWYWx1ZT4oKTsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFdvcmtl
ckNvbnRleHRFeGVjdXRpb25Qcm94eTo6V29ya2VyQ29udGV4dFRvVjhPYmplY3QoV29ya2VyQ29u
dGV4dCogd29ya2VyQ29udGV4dCkKK3sKKyAgICBpZiAoIXdvcmtlckNvbnRleHQpCisgICAgICAg
IHJldHVybiB2ODo6TnVsbCgpOworCisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4
dCA9IHdvcmtlckNvbnRleHQtPnNjcmlwdCgpLT5wcm94eSgpLT5HZXRDb250ZXh0KCk7CisKKyAg
ICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGdsb2JhbCA9IGNvbnRleHQtPkdsb2JhbCgpOworICAg
IEFTU0VSVCghZ2xvYmFsLklzRW1wdHkoKSk7CisgICAgcmV0dXJuIGdsb2JhbDsKK30KKwordjg6
OkxvY2FsPHY4OjpPYmplY3Q+IFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6aW5zdGFudGlh
dGVWOE9iamVjdChWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgZGVzY1R5cGUsIFY4Q2xhc3NJ
bmRleDo6VjhXcmFwcGVyVHlwZSBjcHRyVHlwZSwgdm9pZCogaW1wbCkKK3sKKyAgICB2ODo6TG9j
YWw8djg6OkZ1bmN0aW9uPiBmdW5jdGlvbjsKKyAgICBXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJv
eHkqIHByb3h5ID0gcmV0cmlldmUoKTsKKyAgICBpZiAocHJveHkpCisgICAgICAgIGZ1bmN0aW9u
ID0gcHJveHktPkdldENvbnN0cnVjdG9yKGRlc2NUeXBlKTsKKyAgICBlbHNlCisgICAgICAgIGZ1
bmN0aW9uID0gVjhQcm94eTo6R2V0VGVtcGxhdGUoZGVzY1R5cGUpLT5HZXRGdW5jdGlvbigpOwor
CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGluc3RhbmNlID0gU2FmZUFsbG9jYXRpb246Ok5l
d0luc3RhbmNlKGZ1bmN0aW9uKTsKKyAgICBpZiAoIWluc3RhbmNlLklzRW1wdHkoKSkgeworICAg
ICAgICAvLyBBdm9pZCBzZXR0aW5nIHRoZSBET00gd3JhcHBlciBmb3IgZmFpbGVkIGFsbG9jYXRp
b25zLgorICAgICAgICBWOFByb3h5OjpTZXRET01XcmFwcGVyKGluc3RhbmNlLCBWOENsYXNzSW5k
ZXg6OlRvSW50KGNwdHJUeXBlKSwgaW1wbCk7CisgICAgfQorICAgIHJldHVybiBpbnN0YW5jZTsK
K30KKworYm9vbCBXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6OmZvcmdldFY4RXZlbnRPYmpl
Y3QoRXZlbnQqIGV2ZW50KQoreworICAgIGlmIChHZXRET01PYmplY3RNYXAoKS5jb250YWlucyhl
dmVudCkpIHsKKyAgICAgICAgR2V0RE9NT2JqZWN0TWFwKCkuZm9yZ2V0KGV2ZW50KTsKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsKK30KKwor
djg6OkxvY2FsPHY4OjpWYWx1ZT4gV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5OjpldmFsdWF0
ZShjb25zdCBTdHJpbmcmIHN0ciwgY29uc3QgU3RyaW5nJiBmaWxlTmFtZSwgaW50IGJhc2VMaW5l
KQoreworICAgIHY4OjpMb2NrZXIgbG9ja2VyOworICAgIHY4OjpIYW5kbGVTY29wZSBoczsKKwor
ICAgIGluaXRDb250ZXh0SWZOZWVkZWQoKTsKKyAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUo
bV9jb250ZXh0KTsKKworICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBjb2RlID0gdjhFeHRlcm5h
bFN0cmluZyhzdHIpOworICAgIHY4OjpIYW5kbGU8djg6OlNjcmlwdD4gc2NyaXB0ID0gVjhQcm94
eTo6Q29tcGlsZVNjcmlwdChjb2RlLCBmaWxlTmFtZSwgYmFzZUxpbmUpOworICAgIHJldHVybiBy
dW5TY3JpcHQoc2NyaXB0KTsKK30KKwordjg6OkxvY2FsPHY4OjpWYWx1ZT4gV29ya2VyQ29udGV4
dEV4ZWN1dGlvblByb3h5OjpydW5TY3JpcHQodjg6OkhhbmRsZTx2ODo6U2NyaXB0PiBzY3JpcHQp
Cit7CisgICAgaWYgKHNjcmlwdC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB2ODo6TG9jYWw8
djg6OlZhbHVlPigpOworCisgICAgLy8gQ29tcHV0ZSB0aGUgc291cmNlIHN0cmluZyBhbmQgcHJl
dmVudCBhZ2FpbnN0IGluZmluaXRlIHJlY3Vyc2lvbi4KKyAgICBpZiAobV9yZWN1cnNpb24gPj0g
a01heFJlY3Vyc2lvbkRlcHRoKSB7CisgICAgICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBjb2Rl
ID0gdjhFeHRlcm5hbFN0cmluZygidGhyb3cgUmFuZ2VFcnJvcignUmVjdXJzaW9uIHRvbyBkZWVw
JykiKTsKKyAgICAgICAgc2NyaXB0ID0gVjhQcm94eTo6Q29tcGlsZVNjcmlwdChjb2RlLCAiIiwg
MCk7CisgICAgfQorCisgICAgaWYgKFY4UHJveHk6OkhhbmRsZU91dE9mTWVtb3J5KCkpCisgICAg
ICAgIEFTU0VSVChzY3JpcHQuSXNFbXB0eSgpKTsKKworICAgIGlmIChzY3JpcHQuSXNFbXB0eSgp
KQorICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKKworICAgIC8vIFJ1biB0
aGUgc2NyaXB0IGFuZCBrZWVwIHRyYWNrIG9mIHRoZSBjdXJyZW50IHJlY3Vyc2lvbiBkZXB0aC4K
KyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXN1bHQ7CisgICAgeworICAgICAgICBtX3JlY3Vy
c2lvbisrOworICAgICAgICByZXN1bHQgPSBzY3JpcHQtPlJ1bigpOworICAgICAgICBtX3JlY3Vy
c2lvbi0tOworICAgIH0KKworICAgIC8vIEhhbmRsZSBWOCBpbnRlcm5hbCBlcnJvciBzaXR1YXRp
b24gKE91dC1vZi1tZW1vcnkpLgorICAgIGlmIChyZXN1bHQuSXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisK
K1Bhc3NSZWZQdHI8VjhFdmVudExpc3RlbmVyPiBXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6
OkZpbmRPckNyZWF0ZUV2ZW50TGlzdGVuZXIodjg6OkxvY2FsPHY4OjpWYWx1ZT4gb2JqLCBib29s
IGlzSW5saW5lLCBib29sIGZpbmRPbmx5KQoreworICAgIGlmICghb2JqLT5Jc09iamVjdCgpKQor
ICAgICAgICByZXR1cm4gMDsKKworICAgIGZvciAoRXZlbnRMaXN0ZW5lckxpc3Q6Oml0ZXJhdG9y
IGl0ZXIgPSBtX2xpc3RlbmVycy5iZWdpbigpOyBpdGVyICE9IG1fbGlzdGVuZXJzLmVuZCgpOyAr
K2l0ZXIpIHsKKyAgICAgICAgVjhFdmVudExpc3RlbmVyKiBlbCA9ICppdGVyOworICAgICAgICBp
ZiAoZWwtPmlzSW5saW5lKCkgPT0gaXNJbmxpbmUgJiYgZWwtPmdldExpc3RlbmVyT2JqZWN0KCkg
PT0gb2JqKQorICAgICAgICAgICAgcmV0dXJuIGVsOworICAgIH0KKyAgICBpZiAoZmluZE9ubHkp
CisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgLy8gQ3JlYXRlIGEgbmV3IG9uZSwgYW5kIGFk
ZCB0byBjYWNoZS4KKyAgICBSZWZQdHI8VjhFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IFY4V29y
a2VyQ29udGV4dEV2ZW50TGlzdGVuZXI6OmNyZWF0ZSh0aGlzLCB2ODo6TG9jYWw8djg6Ok9iamVj
dD46OkNhc3Qob2JqKSwgaXNJbmxpbmUpOworICAgIG1fbGlzdGVuZXJzLnB1c2hfYmFjayhsaXN0
ZW5lci5nZXQoKSk7CisKKyAgICByZXR1cm4gbGlzdGVuZXIucmVsZWFzZSgpOworfQorCit2b2lk
IFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6UmVtb3ZlRXZlbnRMaXN0ZW5lcihWOEV2ZW50
TGlzdGVuZXIqIGxpc3RlbmVyKQoreworICAgIGZvciAoRXZlbnRMaXN0ZW5lckxpc3Q6Oml0ZXJh
dG9yIGl0ZXIgPSBtX2xpc3RlbmVycy5iZWdpbigpOyBpdGVyICE9IG1fbGlzdGVuZXJzLmVuZCgp
OyAgKytpdGVyKSB7CisgICAgICAgIGlmICgqaXRlciA9PSBsaXN0ZW5lcikgeworICAgICAgICAg
ICAgbV9saXN0ZW5lcnMuZXJhc2UoaXRlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IH0KKyAgICB9Cit9CisKK3ZvaWQgV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5OjpUcmFja0V2
ZW50KEV2ZW50KiBldmVudCkKK3sKKyAgICBtX2V2ZW50cy5hZGQoZXZlbnQpOworfQorCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoV09SS0VSUykKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5LmggYi9X
ZWJDb3JlL2JpbmRpbmdzL3Y4L1dvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eS5oCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyOTcwNjcKLS0tIC9kZXYvbnVsbAorKysgYi9X
ZWJDb3JlL2JpbmRpbmdzL3Y4L1dvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eS5oCkBAIC0wLDAg
KzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
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
KyAqLworCisKKyNpZm5kZWYgV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5X2gKKyNkZWZpbmUg
V29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5X2gKKworI2lmIEVOQUJMRShXT1JLRVJTKQorCisj
aW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlICJ2OC5oIgorI2luY2x1ZGUgInY4X2luZGV4LmgiCisj
aW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAgY2xh
c3MgRXZlbnQ7CisgICAgY2xhc3MgRXZlbnRUYXJnZXQ7CisgICAgY2xhc3MgVjhFdmVudExpc3Rl
bmVyOworICAgIGNsYXNzIFdvcmtlckNvbnRleHQ7CisKKyAgICBjbGFzcyBXb3JrZXJDb250ZXh0
RXhlY3V0aW9uUHJveHkgeworICAgIHB1YmxpYzoKKyAgICAgICAgV29ya2VyQ29udGV4dEV4ZWN1
dGlvblByb3h5KFdvcmtlckNvbnRleHQqKTsKKyAgICAgICAgfldvcmtlckNvbnRleHRFeGVjdXRp
b25Qcm94eSgpOworCisgICAgICAgIC8vIFJldHVybnMgYSBsb2NhbCBoYW5kbGUgb2YgdGhlIGNv
bnRleHQuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6Q29udGV4dD4gR2V0Q29udGV4dCgpIHsgcmV0
dXJuIHY4OjpMb2NhbDx2ODo6Q29udGV4dD46Ok5ldyhtX2NvbnRleHQpOyB9CisKKyAgICAgICAg
Ly8gUmV0dXJucyB0aGUgZG9tIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gbm9k
ZSB0eXBlLgorICAgICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBHZXRDb25zdHJ1Y3RvcihW
OENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUpOworCisgICAgICAgIC8vIEZpbmRzIG9yIGNyZWF0
ZXMgYW4gZXZlbnQgbGlzdGVuZXI7CisgICAgICAgIFBhc3NSZWZQdHI8VjhFdmVudExpc3RlbmVy
PiBGaW5kT3JDcmVhdGVFdmVudExpc3RlbmVyKHY4OjpMb2NhbDx2ODo6VmFsdWU+IGxpc3RlbmVy
LCBib29sIGlzSW5saW5lLCBib29sIGZpbmRPbmx5KTsKKworICAgICAgICAvLyBSZW1vdmVzIGFu
IGV2ZW50IGxpc3RlbmVyOworICAgICAgICB2b2lkIFJlbW92ZUV2ZW50TGlzdGVuZXIoVjhFdmVu
dExpc3RlbmVyKik7CisKKyAgICAgICAgLy8gVHJhY2sgdGhlIGV2ZW50IHNvIHRoYXQgd2UgY2Fu
IGRldGFjaCBpdCBmcm9tIHRoZSBKUyB3cmFwcGVyIHdoZW4gYSB3b3JrZXIKKyAgICAgICAgLy8g
dGVybWluYXRlcy4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB3ZSBuZWVkIHRvIGJlIGFibGUgdG8g
ZGlzcG9zZSB0aGVzZQorICAgICAgICAvLyBldmVudHMgYW5kIHJlbGVhc2VzIHJlZmVyZW5jZXMg
dG8gdGhlaXIgZXZlbnQgdGFyZ2V0czogV29ya2VyQ29udGV4dC4KKyAgICAgICAgdm9pZCBUcmFj
a0V2ZW50KEV2ZW50Kik7CisKKyAgICAgICAgLy8gRXZhbHVhdGUgYSBzY3JpcHQgZmlsZSBpbiB0
aGUgY3VycmVudCBleGVjdXRpb24gZW52aXJvbm1lbnQuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6
VmFsdWU+IGV2YWx1YXRlKGNvbnN0IFN0cmluZyYgc3RyLCBjb25zdCBTdHJpbmcmIGZpbGVOYW1l
LCBpbnQgYmFzZUxpbmUpOworCisgICAgICAgIC8vIFJldHVybnMgV29ya2VyQ29udGV4dCBvYmpl
Y3QuCisgICAgICAgIFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRleHQoKSB7IHJldHVybiBtX3dv
cmtlckNvbnRleHQ7IH0KKworICAgICAgICAvLyBSZXR1cm5zIFdvcmtlckNvbnRleHRFeGVjdXRp
b25Qcm94eSBvYmplY3Qgb2YgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgY29udGV4dC4KKyAgICAg
ICAgc3RhdGljIFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eSogcmV0cmlldmUoKTsKKworICAg
ICAgICAvLyBSZXR1cm5zIHRoZSBKUyB3cmFwcGVyIG9mIG9iamVjdC4KKyAgICAgICAgc3RhdGlj
IHY4OjpIYW5kbGU8djg6OlZhbHVlPiBUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVy
VHlwZSB0eXBlLCB2b2lkKiBpbXBsKTsKKyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZh
bHVlPiBFdmVudFRvVjhPYmplY3QoRXZlbnQqIGV2ZW50KTsKKyAgICAgICAgc3RhdGljIHY4OjpI
YW5kbGU8djg6OlZhbHVlPiBFdmVudFRhcmdldFRvVjhPYmplY3QoRXZlbnRUYXJnZXQqIHRhcmdl
dCk7CisgICAgICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gV29ya2VyQ29udGV4dFRv
VjhPYmplY3QoV29ya2VyQ29udGV4dCogd2MpOworCisgICAgICAgIC8vIEVuYWJsZXMgSFRNTDUg
d29ya2VyIHN1cHBvcnQuCisgICAgICAgIHN0YXRpYyBib29sIGlzV2ViV29ya2Vyc0VuYWJsZWQo
KTsKKyAgICAgICAgc3RhdGljIHZvaWQgc2V0SXNXZWJXb3JrZXJzRW5hYmxlZChib29sKTsKKwor
ICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgaW5pdENvbnRleHRJZk5lZWRlZCgpOworICAgICAg
ICB2b2lkIGRpc3Bvc2UoKTsKKworICAgICAgICAvLyBSdW4gYW4gYWxyZWFkeSBjb21waWxlZCBz
Y3JpcHQuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHJ1blNjcmlwdCh2ODo6SGFuZGxl
PHY4OjpTY3JpcHQ+KTsKKworICAgICAgICBzdGF0aWMgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGlu
c3RhbnRpYXRlVjhPYmplY3QoVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIGRlc2NUeXBlLCBW
OENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgY3B0clR5cGUsIHZvaWQqIGltcGwpOworCisgICAg
ICAgIHN0YXRpYyBib29sIGZvcmdldFY4RXZlbnRPYmplY3QoRXZlbnQqKTsKKworICAgICAgICBX
b3JrZXJDb250ZXh0KiBtX3dvcmtlckNvbnRleHQ7CisgICAgICAgIHY4OjpQZXJzaXN0ZW50PHY4
OjpDb250ZXh0PiBtX2NvbnRleHQ7CisgICAgICAgIGludCBtX3JlY3Vyc2lvbjsKKworICAgICAg
ICB0eXBlZGVmIHN0ZDo6bGlzdDxWOEV2ZW50TGlzdGVuZXIqPiBFdmVudExpc3RlbmVyTGlzdDsK
KyAgICAgICAgRXZlbnRMaXN0ZW5lckxpc3QgbV9saXN0ZW5lcnM7CisKKyAgICAgICAgdHlwZWRl
ZiBIYXNoU2V0PEV2ZW50Kj4gRXZlbnRTZXQ7CisgICAgICAgIEV2ZW50U2V0IG1fZXZlbnRzOwor
ICAgIH07CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShXT1JL
RVJTKQorCisjZW5kaWYgLy8gV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5X2gKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvV29ya2VyU2NyaXB0Q29udHJvbGxlci5jcHAgYi9XZWJD
b3JlL2JpbmRpbmdzL3Y4L1dvcmtlclNjcmlwdENvbnRyb2xsZXIuY3BwCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MWQ5MmEKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3Jl
L2JpbmRpbmdzL3Y4L1dvcmtlclNjcmlwdENvbnRyb2xsZXIuY3BwCkBAIC0wLDAgKzEsOTMgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAg
ICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhl
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQor
ICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5j
LiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVu
ZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUg
d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJV
VE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9X
TkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkK
KyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoV09SS0VSUykKKworI2luY2x1ZGUgIldv
cmtlclNjcmlwdENvbnRyb2xsZXIuaCIKKworI2luY2x1ZGUgInY4LmgiCisKKyNpbmNsdWRlICJT
Y3JpcHRTb3VyY2VDb2RlLmgiCisjaW5jbHVkZSAiU2NyaXB0VmFsdWUuaCIKKyNpbmNsdWRlICJE
T01UaW1lci5oIgorI2luY2x1ZGUgIldvcmtlckNvbnRleHQuaCIKKyNpbmNsdWRlICJXb3JrZXJD
b250ZXh0RXhlY3V0aW9uUHJveHkuaCIKKyNpbmNsdWRlICJXb3JrZXJPYmplY3RQcm94eS5oIgor
I2luY2x1ZGUgIldvcmtlclRocmVhZC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1dvcmtl
clNjcmlwdENvbnRyb2xsZXI6OldvcmtlclNjcmlwdENvbnRyb2xsZXIoV29ya2VyQ29udGV4dCog
d29ya2VyQ29udGV4dCkKKyAgICA6IG1fd29ya2VyQ29udGV4dCh3b3JrZXJDb250ZXh0KQorICAg
ICwgbV9wcm94eShuZXcgV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5KHdvcmtlckNvbnRleHQp
KQorICAgICwgbV9leGVjdXRpb25Gb3JiaWRkZW4oZmFsc2UpCit7Cit9CisKK1dvcmtlclNjcmlw
dENvbnRyb2xsZXI6On5Xb3JrZXJTY3JpcHRDb250cm9sbGVyKCkKK3sKK30KKworU2NyaXB0VmFs
dWUgV29ya2VyU2NyaXB0Q29udHJvbGxlcjo6ZXZhbHVhdGUoY29uc3QgU2NyaXB0U291cmNlQ29k
ZSYgc291cmNlQ29kZSkKK3sKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2sobV9zaGFy
ZWREYXRhTXV0ZXgpOworICAgICAgICBpZiAobV9leGVjdXRpb25Gb3JiaWRkZW4pCisgICAgICAg
ICAgICByZXR1cm4gU2NyaXB0VmFsdWUoKTsKKyAgICB9CisKKyAgICB2ODo6TG9jYWw8djg6OlZh
bHVlPiByZXN1bHQgPSBtX3Byb3h5LT5ldmFsdWF0ZShzb3VyY2VDb2RlLnNvdXJjZSgpLCBzb3Vy
Y2VDb2RlLnVybCgpLnN0cmluZygpLCBzb3VyY2VDb2RlLnN0YXJ0TGluZSgpIC0gMSk7CisgICAg
bV93b3JrZXJDb250ZXh0LT50aHJlYWQoKS0+d29ya2VyT2JqZWN0UHJveHkoKS0+cmVwb3J0UGVu
ZGluZ0FjdGl2aXR5KG1fd29ya2VyQ29udGV4dC0+aGFzUGVuZGluZ0FjdGl2aXR5KCkpOworICAg
IHJldHVybiBTY3JpcHRWYWx1ZSgpOworfQorCitTY3JpcHRWYWx1ZSBXb3JrZXJTY3JpcHRDb250
cm9sbGVyOjpldmFsdWF0ZShjb25zdCBTY3JpcHRTb3VyY2VDb2RlJiBzb3VyY2VDb2RlLCBTY3Jp
cHRWYWx1ZSogZXhjZXB0aW9uKQoreworICAgIC8vIEZJWE1FKGppYW5saSk6IHRvIGJlIGltcGxl
bWVudGVkLgorICAgIHJldHVybiBldmFsdWF0ZShzb3VyY2VDb2RlKTsKK30KKwordm9pZCBXb3Jr
ZXJTY3JpcHRDb250cm9sbGVyOjpmb3JiaWRFeGVjdXRpb24oKQoreworICAgIC8vIFRoaXMgZnVu
Y3Rpb24gaXMgY2FsbGVkIGZyb20gYW5vdGhlciB0aHJlYWQuCisgICAgTXV0ZXhMb2NrZXIgbG9j
ayhtX3NoYXJlZERhdGFNdXRleCk7CisgICAgbV9leGVjdXRpb25Gb3JiaWRkZW4gPSB0cnVlOwor
fQorCit2b2lkIFdvcmtlclNjcmlwdENvbnRyb2xsZXI6OnNldEV4Y2VwdGlvbihTY3JpcHRWYWx1
ZSBleGNlcHRpb24pCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5BQkxFKFdPUktFUlMpCmRpZmYgLS1naXQgYS9XZWJD
b3JlL2JpbmRpbmdzL3Y4L1dvcmtlclNjcmlwdENvbnRyb2xsZXIuaCBiL1dlYkNvcmUvYmluZGlu
Z3MvdjgvV29ya2VyU2NyaXB0Q29udHJvbGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLjA3ZTIyNGMKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4
L1dvcmtlclNjcmlwdENvbnRyb2xsZXIuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlv
bi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1l
cyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21v
dGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lm
aWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJ
UyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAq
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBXb3JrZXJT
Y3JpcHRDb250cm9sbGVyX2gKKyNkZWZpbmUgV29ya2VyU2NyaXB0Q29udHJvbGxlcl9oCisKKyNp
ZiBFTkFCTEUoV09SS0VSUykKKworI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKyNpbmNsdWRlIDx3
dGYvVGhyZWFkaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworICAgIGNsYXNzIFNjcmlw
dFNvdXJjZUNvZGU7CisgICAgY2xhc3MgU2NyaXB0VmFsdWU7CisgICAgY2xhc3MgV29ya2VyQ29u
dGV4dDsKKyAgICBjbGFzcyBXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk7CisKKyAgICBjbGFz
cyBXb3JrZXJTY3JpcHRDb250cm9sbGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFdvcmtlclNj
cmlwdENvbnRyb2xsZXIoV29ya2VyQ29udGV4dCopOworICAgICAgICB+V29ya2VyU2NyaXB0Q29u
dHJvbGxlcigpOworCisgICAgICAgIFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eSogcHJveHko
KSB7IHJldHVybiBtX3Byb3h5LmdldCgpOyB9CisKKyAgICAgICAgU2NyaXB0VmFsdWUgZXZhbHVh
dGUoY29uc3QgU2NyaXB0U291cmNlQ29kZSYpOworICAgICAgICBTY3JpcHRWYWx1ZSBldmFsdWF0
ZShjb25zdCBTY3JpcHRTb3VyY2VDb2RlJiwgU2NyaXB0VmFsdWUqIGV4Y2VwdGlvbik7CisKKyAg
ICAgICAgdm9pZCBzZXRFeGNlcHRpb24oU2NyaXB0VmFsdWUpOworCisgICAgICAgIHZvaWQgZm9y
YmlkRXhlY3V0aW9uKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBXb3JrZXJDb250ZXh0KiBt
X3dvcmtlckNvbnRleHQ7CisgICAgICAgIE93blB0cjxXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJv
eHk+IG1fcHJveHk7CisKKyAgICAgICAgTXV0ZXggbV9zaGFyZWREYXRhTXV0ZXg7CisgICAgICAg
IGJvb2wgbV9leGVjdXRpb25Gb3JiaWRkZW47CisgICAgfTsKKworfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQorCisjZW5kaWYgLy8gRU5BQkxFKFdPUktFUlMpCisKKyNlbmRpZiAvLyBXb3JrZXJTY3Jp
cHRDb250cm9sbGVyX2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>28742</attachid>
            <date>2009-03-18 18:40:56 -0700</date>
            <delta_ts>2009-03-19 12:43:36 -0700</delta_ts>
            <desc>Updated patch.</desc>
            <filename>patch_v2.txt</filename>
            <type>text/plain</type>
            <size>24743</size>
            <attacher name="Dmitry Titov">dimich</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
YzcwMWY3ZC4uZDNmZDVlMyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNSBAQAorMjAwOS0wMy0xOCAgRG1pdHJ5IFRpdG92
ICA8ZGltaWNoQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MjQ2ODkKKyAgICAgICAgQWRkICh1cHN0cmVhbSkgVjggYmluZGluZ3MgZm9yIFdvcmtlcnMuCisK
KyAgICAgICAgKiBiaW5kaW5ncy92OC9Xb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkuY3BwOiBB
ZGRlZC4KKyAgICAgICAgKiBiaW5kaW5ncy92OC9Xb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHku
aDogQWRkZWQuCisgICAgICAgICogYmluZGluZ3MvdjgvV29ya2VyU2NyaXB0Q29udHJvbGxlci5j
cHA6IEFkZGVkLgorICAgICAgICAqIGJpbmRpbmdzL3Y4L1dvcmtlclNjcmlwdENvbnRyb2xsZXIu
aDogQWRkZWQuCisKIDIwMDktMDMtMTcgIE9qYW4gVmFmYWkgIDxvamFuQGNocm9taXVtLm9yZz4K
IAogICAgICAgICBSZXZpZXdlZCBieSBBZGVsZSBQZXRlcnNvbi4KZGlmZiAtLWdpdCBhL1dlYkNv
cmUvYmluZGluZ3MvdjgvV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5LmNwcCBiL1dlYkNvcmUv
YmluZGluZ3MvdjgvV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5LmNwcApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmQ3ODg2Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29y
ZS9iaW5kaW5ncy92OC9Xb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkuY3BwCkBAIC0wLDAgKzEs
MzYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6Cisg
KgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAq
IGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29v
Z2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNv
ZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBD
T05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hU
CisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg
Ki8KKworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoV09SS0VSUykKKworI2lu
Y2x1ZGUgIldvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eS5oIgorCisjaW5jbHVkZSAidjhCaW5k
aW5nLmgiCisjaW5jbHVkZSAidjhQcm94eS5oIgorI2luY2x1ZGUgInY4X2luZGV4LmgiCisjaW5j
bHVkZSAiRXZlbnQuaCIKKyNpbmNsdWRlICJWOFdvcmtlckNvbnRleHRFdmVudExpc3RlbmVyLmgi
CisjaW5jbHVkZSAiV29ya2VyQ29udGV4dC5oIgorI2luY2x1ZGUgIldvcmtlckxvY2F0aW9uLmgi
CisjaW5jbHVkZSAiV29ya2VyTmF2aWdhdG9yLmgiCisjaW5jbHVkZSAiV29ya2VyU2NyaXB0Q29u
dHJvbGxlci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBib29sIGlzV29ya2Vy
c0VuYWJsZWQgPSBmYWxzZTsKKworYm9vbCBXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6Omlz
V2ViV29ya2Vyc0VuYWJsZWQoKQoreworICAgIHJldHVybiBpc1dvcmtlcnNFbmFibGVkOworfQor
Cit2b2lkIFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6c2V0SXNXZWJXb3JrZXJzRW5hYmxl
ZChib29sIHZhbHVlKQoreworICAgIGlzV29ya2Vyc0VuYWJsZWQgPSB2YWx1ZTsKK30KKworV29y
a2VyQ29udGV4dEV4ZWN1dGlvblByb3h5OjpXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkoV29y
a2VyQ29udGV4dCogd29ya2VyQ29udGV4dCkKKyAgICA6IG1fd29ya2VyQ29udGV4dCh3b3JrZXJD
b250ZXh0KQorICAgICwgbV9yZWN1cnNpb24oMCkKK3sKK30KKworV29ya2VyQ29udGV4dEV4ZWN1
dGlvblByb3h5Ojp+V29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5KCkKK3sKKyAgICBkaXNwb3Nl
KCk7Cit9CisKK3ZvaWQgV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5OjpkaXNwb3NlKCkKK3sK
KyAgICAvLyBEaXNjb25uZWN0IGFsbCBldmVudCBsaXN0ZW5lcnMuCisgICAgZm9yIChFdmVudExp
c3RlbmVyTGlzdDo6aXRlcmF0b3IgaXRlciA9IG1fbGlzdGVuZXJzLmJlZ2luKCk7IGl0ZXIgIT0g
bV9saXN0ZW5lcnMuZW5kKCk7ICArK2l0ZXIpCisgICAgICAgIHN0YXRpY19jYXN0PFY4V29ya2Vy
Q29udGV4dEV2ZW50TGlzdGVuZXIqPigqaXRlciktPmRpc2Nvbm5lY3QoKTsKKworICAgIG1fbGlz
dGVuZXJzLmNsZWFyKCk7CisKKyAgICAvLyBEZXRhY2ggYWxsIGV2ZW50cyBmcm9tIHRoZWlyIEpT
IHdyYXBwZXJzLgorICAgIGZvciAoRXZlbnRTZXQ6Oml0ZXJhdG9yIGl0ZXIgPSBtX2V2ZW50cy5i
ZWdpbigpOyBpdGVyICE9IG1fZXZlbnRzLmVuZCgpOyAgKytpdGVyKSB7CisgICAgICAgIEV2ZW50
KiBldmVudCA9ICppdGVyOworICAgICAgICBpZiAoZm9yZ2V0VjhFdmVudE9iamVjdChldmVudCkp
CisgICAgICAgICAgZXZlbnQtPmRlcmVmKCk7CisgICAgfQorICAgIG1fZXZlbnRzLmNsZWFyKCk7
CisKKyAgICAvLyBEaXNwb3NlIHRoZSBjb250ZXh0LgorICAgIGlmICghbV9jb250ZXh0LklzRW1w
dHkoKSkgeworICAgICAgICBtX2NvbnRleHQuRGlzcG9zZSgpOworICAgICAgICBtX2NvbnRleHQu
Q2xlYXIoKTsKKyAgICB9CisKKyAgICAvLyBSZW1vdmUgdGhlIHdyYXBwaW5nIGJldHdlZW4gSlMg
b2JqZWN0IGFuZCBET00gb2JqZWN0LiBUaGlzIGlzIGJlY2F1c2UKKyAgICAvLyB0aGUgd29ya2Vy
IGNvbnRleHQgb2JqZWN0IGlzIGdvaW5nIHRvIGJlIGRpc3Bvc2VkIGltbWVkaWF0ZWx5IHdoZW4g
YQorICAgIC8vIHdvcmtlciB0aHJlYWQgaXMgdGVhcmluZyBkb3duLiBXZSBkbyBub3Qgd2FudCB0
byByZS1kZWxldGUgdGhlIHJlYWwgb2JqZWN0CisgICAgLy8gd2hlbiBKUyBvYmplY3QgaXMgZ2Fy
YmFnZSBjb2xsZWN0ZWQuCisgICAgdjg6OkxvY2tlciBsb2NrZXI7CisgICAgdjg6OkhhbmRsZVNj
b3BlIHNjb3BlOworICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHdyYXBwZXIgPSBHZXRE
T01PYmplY3RNYXAoKS5nZXQobV93b3JrZXJDb250ZXh0KTsKKyAgICBpZiAoIXdyYXBwZXIuSXNF
bXB0eSgpKQorICAgICAgICBWOFByb3h5OjpTZXRET01XcmFwcGVyKHdyYXBwZXIsIFY4Q2xhc3NJ
bmRleDo6SU5WQUxJRF9DTEFTU19JTkRFWCwgTlVMTCk7CisgICAgR2V0RE9NT2JqZWN0TWFwKCku
Zm9yZ2V0KG1fd29ya2VyQ29udGV4dCk7Cit9CisKK1dvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94
eSogV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5OjpyZXRyaWV2ZSgpCit7CisgICAgdjg6Okhh
bmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IHY4OjpDb250ZXh0OjpHZXRDdXJyZW50KCk7Cisg
ICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBnbG9iYWwgPSBjb250ZXh0LT5HbG9iYWwoKTsKKyAg
ICBnbG9iYWwgPSBWOFByb3h5OjpMb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6V09SS0VS
Q09OVEVYVCwgZ2xvYmFsKTsKKyAgICBBU1NFUlQoIWdsb2JhbC5Jc0VtcHR5KCkpOworICAgIFdv
cmtlckNvbnRleHQqIHdvcmtlcl9jb250ZXh0ID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8V29y
a2VyQ29udGV4dD4oVjhDbGFzc0luZGV4OjpXT1JLRVJDT05URVhULCBnbG9iYWwpOworICAgIHJl
dHVybiB3b3JrZXJfY29udGV4dC0+c2NyaXB0KCktPnByb3h5KCk7Cit9CisKK3ZvaWQgV29ya2Vy
Q29udGV4dEV4ZWN1dGlvblByb3h5Ojppbml0Q29udGV4dElmTmVlZGVkKCkKK3sKKyAgICAvLyBC
YWlsIG91dCBpZiB0aGUgY29udGV4dCBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgorICAg
IGlmICghbV9jb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gQ3Jl
YXRlIGEgbmV3IGVudmlyb25tZW50CisgICAgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdFRlbXBs
YXRlPiBnbG9iYWxfdGVtcGxhdGU7CisgICAgbV9jb250ZXh0ID0gdjg6OkNvbnRleHQ6Ok5ldyhO
VUxMLCBnbG9iYWxfdGVtcGxhdGUpOworCisgICAgLy8gU3RhcnRpbmcgZnJvbSBub3csIHVzZSBs
b2NhbCBjb250ZXh0IG9ubHkuCisgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBjb250ZXh0ID0g
djg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KG1fY29udGV4dCk7CisgICAgdjg6OkNvbnRleHQ6
OlNjb3BlIHNjb3BlKGNvbnRleHQpOworCisgICAgLy8gQWxsb2NhdGUgc3RyaW5ncyB1c2VkIGR1
cmluZyBpbml0aWFsaXphdGlvbi4KKyAgICB2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IGltcGxpY2l0
X3Byb3RvX3N0cmluZyA9IHY4OjpTdHJpbmc6Ok5ldygiX19wcm90b19fIik7CisKKyAgICAvLyBD
cmVhdGUgYSBuZXcgSlMgb2JqZWN0IGFuZCB1c2UgaXQgYXMgdGhlIHByb3RvdHlwZSBmb3IgdGhl
IHNoYWRvdyBnbG9iYWwgb2JqZWN0LgorICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiB3b3Jr
ZXJfY29udGV4dF9jb25zdHJ1Y3RvciA9IEdldENvbnN0cnVjdG9yKFY4Q2xhc3NJbmRleDo6V09S
S0VSQ09OVEVYVCk7CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGpzX3dvcmtlcl9jb250ZXh0
ID0gU2FmZUFsbG9jYXRpb246Ok5ld0luc3RhbmNlKHdvcmtlcl9jb250ZXh0X2NvbnN0cnVjdG9y
KTsKKyAgICAvLyBCYWlsIG91dCBpZiBhbGxvY2F0aW9uIGZhaWxlZC4KKyAgICBpZiAoanNfd29y
a2VyX2NvbnRleHQuSXNFbXB0eSgpKSB7CisgICAgICAgIGRpc3Bvc2UoKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKworICAgIC8vIFdyYXAgdGhlIG9iamVjdC4KKyAgICBWOFByb3h5OjpTZXRE
T01XcmFwcGVyKGpzX3dvcmtlcl9jb250ZXh0LCBWOENsYXNzSW5kZXg6OlRvSW50KFY4Q2xhc3NJ
bmRleDo6V09SS0VSQ09OVEVYVCksIG1fd29ya2VyQ29udGV4dCk7CisKKyAgICBWOFByb3h5OjpT
ZXRKU1dyYXBwZXJGb3JET01PYmplY3QobV93b3JrZXJDb250ZXh0LCB2ODo6UGVyc2lzdGVudDx2
ODo6T2JqZWN0Pjo6TmV3KGpzX3dvcmtlcl9jb250ZXh0KSk7CisKKyAgICAvLyBJbnNlcnQgdGhl
IG9iamVjdCBpbnN0YW5jZSBhcyB0aGUgcHJvdG90eXBlIG9mIHRoZSBzaGFkb3cgb2JqZWN0Lgor
ICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gdjhfZ2xvYmFsID0gbV9jb250ZXh0LT5HbG9iYWwo
KTsKKyAgICB2OF9nbG9iYWwtPlNldChpbXBsaWNpdF9wcm90b19zdHJpbmcsIGpzX3dvcmtlcl9j
b250ZXh0KTsKK30KKwordjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4gV29ya2VyQ29udGV4dEV4ZWN1
dGlvblByb3h5OjpHZXRDb25zdHJ1Y3RvcihWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlw
ZSkKK3sKKyAgICAvLyBFbnRlciB0aGUgY29udGV4dCBvZiB0aGUgcHJveHkgdG8gbWFrZSBzdXJl
IHRoYXQgdGhlIGZ1bmN0aW9uIGlzCisgICAgLy8gY29uc3RydWN0ZWQgaW4gdGhlIGNvbnRleHQg
Y29ycmVzcG9uZGluZyB0byB0aGlzIHByb3h5LgorICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29w
ZShtX2NvbnRleHQpOworICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGZ1bmN0
aW9uVGVtcGxhdGUgPSBWOFByb3h5OjpHZXRUZW1wbGF0ZSh0eXBlKTsKKworICAgIC8vIEdldHRp
bmcgdGhlIGZ1bmN0aW9uIG1pZ2h0IGZhaWwgaWYgd2UncmUgcnVubmluZyBvdXQgb2YKKyAgICAv
LyBzdGFjayBvciBtZW1vcnkuCisgICAgdjg6OlRyeUNhdGNoIHRyeV9jYXRjaDsKKyAgICB2ODo6
TG9jYWw8djg6OkZ1bmN0aW9uPiB2YWx1ZSA9IGZ1bmN0aW9uVGVtcGxhdGUtPkdldEZ1bmN0aW9u
KCk7CisgICAgaWYgKHZhbHVlLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2
ODo6RnVuY3Rpb24+KCk7CisKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK3Y4OjpIYW5kbGU8djg6
OlZhbHVlPiBXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6OlRvVjhPYmplY3QoVjhDbGFzc0lu
ZGV4OjpWOFdyYXBwZXJUeXBlIHR5cGUsIHZvaWQqIGltcGwpCit7CisgICAgaWYgKCFpbXBsKQor
ICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKKworICAgIGlmICh0eXBlID09IFY4Q2xhc3NJbmRl
eDo6V09SS0VSQ09OVEVYVCkKKyAgICAgICAgcmV0dXJuIFdvcmtlckNvbnRleHRUb1Y4T2JqZWN0
KHN0YXRpY19jYXN0PFdvcmtlckNvbnRleHQqPihpbXBsKSk7CisKKyAgICAvLyBOb24gRE9NIG5v
ZGUKKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiByZXN1bHQgPSBHZXRET01PYmplY3RN
YXAoKS5nZXQoaW1wbCk7CisgICAgaWYgKHJlc3VsdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgdjg6
OkxvY2FsPHY4OjpPYmplY3Q+IHY4b2JqID0gaW5zdGFudGlhdGVWOE9iamVjdCh0eXBlLCB0eXBl
LCBpbXBsKTsKKyAgICAgICAgaWYgKCF2OG9iai5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHN3
aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBWOENsYXNzSW5kZXg6OldPUktFUkxPQ0FU
SU9OOgorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFdvcmtlckxvY2F0aW9uKj4oaW1wbCkt
PnJlZigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBWOENsYXNz
SW5kZXg6OldPUktFUk5BVklHQVRPUjoKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxXb3Jr
ZXJOYXZpZ2F0b3IqPihpbXBsKS0+cmVmKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFTU0VSVChmYWxzZSk7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6
TmV3KHY4b2JqKTsKKyAgICAgICAgICAgIFY4UHJveHk6OlNldEpTV3JhcHBlckZvckRPTU9iamVj
dChpbXBsLCByZXN1bHQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9
CisKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6OkV2
ZW50VG9WOE9iamVjdChFdmVudCogZXZlbnQpCit7CisgICAgaWYgKCFldmVudCkKKyAgICAgICAg
cmV0dXJuIHY4OjpOdWxsKCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXBwZXIg
PSBHZXRET01PYmplY3RNYXAoKS5nZXQoZXZlbnQpOworICAgIGlmICghd3JhcHBlci5Jc0VtcHR5
KCkpCisgICAgICAgIHJldHVybiB3cmFwcGVyOworCisgICAgVjhDbGFzc0luZGV4OjpWOFdyYXBw
ZXJUeXBlIHR5cGUgPSBWOENsYXNzSW5kZXg6OkVWRU5UOworCisgICAgaWYgKGV2ZW50LT5pc01l
c3NhZ2VFdmVudCgpKQorICAgICAgICB0eXBlID0gVjhDbGFzc0luZGV4OjpNRVNTQUdFRVZFTlQ7
CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHJlc3VsdCA9IGluc3RhbnRpYXRlVjhPYmpl
Y3QodHlwZSwgVjhDbGFzc0luZGV4OjpFVkVOVCwgZXZlbnQpOworICAgIGlmIChyZXN1bHQuSXNF
bXB0eSgpKSB7CisgICAgICAgIC8vIEluc3RhbnRpYXRpb24gZmFpbGVkLiBBdm9pZCB1cGRhdGlu
ZyB0aGUgRE9NIG9iamVjdCBtYXAgYW5kIHJldHVybiBudWxsIHdoaWNoCisgICAgICAgIC8vIGlz
IGFscmVhZHkgaGFuZGxlZCBieSBjYWxsZXJzIG9mIHRoaXMgZnVuY3Rpb24gaW4gY2FzZSB0aGUg
ZXZlbnQgaXMgTlVMTC4KKyAgICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7CisgICAgfQorCisgICAg
ZXZlbnQtPnJlZigpOyAgLy8gZmFzdCByZWYKKyAgICBWOFByb3h5OjpTZXRKU1dyYXBwZXJGb3JE
T01PYmplY3QoZXZlbnQsIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcocmVzdWx0KSk7
CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBBIEpTIG9iamVjdCBvZiB0eXBlIEV2ZW50
VGFyZ2V0IGluIHRoZSB3b3JrZXIgY29udGV4dCBjYW4gb25seSBiZSBXb3JrZXJDb250ZXh0Lgor
djg6OkhhbmRsZTx2ODo6VmFsdWU+IFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6RXZlbnRU
YXJnZXRUb1Y4T2JqZWN0KEV2ZW50VGFyZ2V0KiB0YXJnZXQpCit7CisgICAgaWYgKCF0YXJnZXQp
CisgICAgICAgIHJldHVybiB2ODo6TnVsbCgpOworCisgICAgV29ya2VyQ29udGV4dCogd29ya2Vy
X2NvbnRleHQgPSB0YXJnZXQtPnRvV29ya2VyQ29udGV4dCgpOworICAgIGlmICh3b3JrZXJfY29u
dGV4dCkKKyAgICAgICAgcmV0dXJuIFdvcmtlckNvbnRleHRUb1Y4T2JqZWN0KHdvcmtlcl9jb250
ZXh0KTsKKworICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiB2ODo6SGFuZGxl
PHY4OjpWYWx1ZT4oKTsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFdvcmtlckNvbnRleHRF
eGVjdXRpb25Qcm94eTo6V29ya2VyQ29udGV4dFRvVjhPYmplY3QoV29ya2VyQ29udGV4dCogd29y
a2VyQ29udGV4dCkKK3sKKyAgICBpZiAoIXdvcmtlckNvbnRleHQpCisgICAgICAgIHJldHVybiB2
ODo6TnVsbCgpOworCisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IHdvcmtl
ckNvbnRleHQtPnNjcmlwdCgpLT5wcm94eSgpLT5HZXRDb250ZXh0KCk7CisKKyAgICB2ODo6SGFu
ZGxlPHY4OjpPYmplY3Q+IGdsb2JhbCA9IGNvbnRleHQtPkdsb2JhbCgpOworICAgIEFTU0VSVCgh
Z2xvYmFsLklzRW1wdHkoKSk7CisgICAgcmV0dXJuIGdsb2JhbDsKK30KKwordjg6OkxvY2FsPHY4
OjpPYmplY3Q+IFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6aW5zdGFudGlhdGVWOE9iamVj
dChWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgZGVzY1R5cGUsIFY4Q2xhc3NJbmRleDo6VjhX
cmFwcGVyVHlwZSBjcHRyVHlwZSwgdm9pZCogaW1wbCkKK3sKKyAgICB2ODo6TG9jYWw8djg6OkZ1
bmN0aW9uPiBmdW5jdGlvbjsKKyAgICBXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkqIHByb3h5
ID0gcmV0cmlldmUoKTsKKyAgICBpZiAocHJveHkpCisgICAgICAgIGZ1bmN0aW9uID0gcHJveHkt
PkdldENvbnN0cnVjdG9yKGRlc2NUeXBlKTsKKyAgICBlbHNlCisgICAgICAgIGZ1bmN0aW9uID0g
VjhQcm94eTo6R2V0VGVtcGxhdGUoZGVzY1R5cGUpLT5HZXRGdW5jdGlvbigpOworCisgICAgdjg6
OkxvY2FsPHY4OjpPYmplY3Q+IGluc3RhbmNlID0gU2FmZUFsbG9jYXRpb246Ok5ld0luc3RhbmNl
KGZ1bmN0aW9uKTsKKyAgICBpZiAoIWluc3RhbmNlLklzRW1wdHkoKSkgeworICAgICAgICAvLyBB
dm9pZCBzZXR0aW5nIHRoZSBET00gd3JhcHBlciBmb3IgZmFpbGVkIGFsbG9jYXRpb25zLgorICAg
ICAgICBWOFByb3h5OjpTZXRET01XcmFwcGVyKGluc3RhbmNlLCBWOENsYXNzSW5kZXg6OlRvSW50
KGNwdHJUeXBlKSwgaW1wbCk7CisgICAgfQorICAgIHJldHVybiBpbnN0YW5jZTsKK30KKworYm9v
bCBXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6OmZvcmdldFY4RXZlbnRPYmplY3QoRXZlbnQq
IGV2ZW50KQoreworICAgIGlmIChHZXRET01PYmplY3RNYXAoKS5jb250YWlucyhldmVudCkpIHsK
KyAgICAgICAgR2V0RE9NT2JqZWN0TWFwKCkuZm9yZ2V0KGV2ZW50KTsKKyAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBmYWxzZTsKK30KKwordjg6OkxvY2Fs
PHY4OjpWYWx1ZT4gV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5OjpldmFsdWF0ZShjb25zdCBT
dHJpbmcmIHNjcmlwdCwgY29uc3QgU3RyaW5nJiBmaWxlTmFtZSwgaW50IGJhc2VMaW5lKQorewor
ICAgIHY4OjpMb2NrZXIgbG9ja2VyOworICAgIHY4OjpIYW5kbGVTY29wZSBoczsKKworICAgIGlu
aXRDb250ZXh0SWZOZWVkZWQoKTsKKyAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUobV9jb250
ZXh0KTsKKworICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBzY3JpcHRTdHJpbmcgPSB2OEV4dGVy
bmFsU3RyaW5nKHNjcmlwdCk7CisgICAgdjg6OkhhbmRsZTx2ODo6U2NyaXB0PiBjb21waWxlZFNj
cmlwdCA9IFY4UHJveHk6OkNvbXBpbGVTY3JpcHQoc2NyaXB0U3RyaW5nLCBmaWxlTmFtZSwgYmFz
ZUxpbmUpOworICAgIHJldHVybiBydW5TY3JpcHQoY29tcGlsZWRTY3JpcHQpOworfQorCit2ODo6
TG9jYWw8djg6OlZhbHVlPiBXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6OnJ1blNjcmlwdCh2
ODo6SGFuZGxlPHY4OjpTY3JpcHQ+IHNjcmlwdCkKK3sKKyAgICBpZiAoc2NyaXB0LklzRW1wdHko
KSkKKyAgICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7CisKKyAgICAvLyBDb21w
dXRlIHRoZSBzb3VyY2Ugc3RyaW5nIGFuZCBwcmV2ZW50IGFnYWluc3QgaW5maW5pdGUgcmVjdXJz
aW9uLgorICAgIGlmIChtX3JlY3Vyc2lvbiA+PSBrTWF4UmVjdXJzaW9uRGVwdGgpIHsKKyAgICAg
ICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IGNvZGUgPSB2OEV4dGVybmFsU3RyaW5nKCJ0aHJvdyBS
YW5nZUVycm9yKCdSZWN1cnNpb24gdG9vIGRlZXAnKSIpOworICAgICAgICBzY3JpcHQgPSBWOFBy
b3h5OjpDb21waWxlU2NyaXB0KGNvZGUsICIiLCAwKTsKKyAgICB9CisKKyAgICBpZiAoVjhQcm94
eTo6SGFuZGxlT3V0T2ZNZW1vcnkoKSkKKyAgICAgICAgQVNTRVJUKHNjcmlwdC5Jc0VtcHR5KCkp
OworCisgICAgaWYgKHNjcmlwdC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB2ODo6TG9jYWw8
djg6OlZhbHVlPigpOworCisgICAgLy8gUnVuIHRoZSBzY3JpcHQgYW5kIGtlZXAgdHJhY2sgb2Yg
dGhlIGN1cnJlbnQgcmVjdXJzaW9uIGRlcHRoLgorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHJl
c3VsdDsKKyAgICB7CisgICAgICAgIG1fcmVjdXJzaW9uKys7CisgICAgICAgIHJlc3VsdCA9IHNj
cmlwdC0+UnVuKCk7CisgICAgICAgIG1fcmVjdXJzaW9uLS07CisgICAgfQorCisgICAgLy8gSGFu
ZGxlIFY4IGludGVybmFsIGVycm9yIHNpdHVhdGlvbiAoT3V0LW9mLW1lbW9yeSkuCisgICAgaWYg
KHJlc3VsdC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVlPigp
OworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworUGFzc1JlZlB0cjxWOEV2ZW50TGlzdGVuZXI+
IFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6RmluZE9yQ3JlYXRlRXZlbnRMaXN0ZW5lcih2
ODo6TG9jYWw8djg6OlZhbHVlPiBvYmosIGJvb2wgaXNJbmxpbmUsIGJvb2wgZmluZE9ubHkpCit7
CisgICAgaWYgKCFvYmotPklzT2JqZWN0KCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgZm9y
IChFdmVudExpc3RlbmVyTGlzdDo6aXRlcmF0b3IgaXRlciA9IG1fbGlzdGVuZXJzLmJlZ2luKCk7
IGl0ZXIgIT0gbV9saXN0ZW5lcnMuZW5kKCk7ICsraXRlcikgeworICAgICAgICBWOEV2ZW50TGlz
dGVuZXIqIGVsID0gKml0ZXI7CisgICAgICAgIGlmIChlbC0+aXNJbmxpbmUoKSA9PSBpc0lubGlu
ZSAmJiBlbC0+Z2V0TGlzdGVuZXJPYmplY3QoKSA9PSBvYmopCisgICAgICAgICAgICByZXR1cm4g
ZWw7CisgICAgfQorICAgIGlmIChmaW5kT25seSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAg
ICAvLyBDcmVhdGUgYSBuZXcgb25lLCBhbmQgYWRkIHRvIGNhY2hlLgorICAgIFJlZlB0cjxWOEV2
ZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gVjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5lcjo6Y3Jl
YXRlKHRoaXMsIHY4OjpMb2NhbDx2ODo6T2JqZWN0Pjo6Q2FzdChvYmopLCBpc0lubGluZSk7Cisg
ICAgbV9saXN0ZW5lcnMucHVzaF9iYWNrKGxpc3RlbmVyLmdldCgpKTsKKworICAgIHJldHVybiBs
aXN0ZW5lci5yZWxlYXNlKCk7Cit9CisKK3ZvaWQgV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5
OjpSZW1vdmVFdmVudExpc3RlbmVyKFY4RXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpCit7CisgICAg
Zm9yIChFdmVudExpc3RlbmVyTGlzdDo6aXRlcmF0b3IgaXRlciA9IG1fbGlzdGVuZXJzLmJlZ2lu
KCk7IGl0ZXIgIT0gbV9saXN0ZW5lcnMuZW5kKCk7ICArK2l0ZXIpIHsKKyAgICAgICAgaWYgKCpp
dGVyID09IGxpc3RlbmVyKSB7CisgICAgICAgICAgICBtX2xpc3RlbmVycy5lcmFzZShpdGVyKTsK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBXb3JrZXJD
b250ZXh0RXhlY3V0aW9uUHJveHk6OlRyYWNrRXZlbnQoRXZlbnQqIGV2ZW50KQoreworICAgIG1f
ZXZlbnRzLmFkZChldmVudCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlm
IC8vIEVOQUJMRShXT1JLRVJTKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9Xb3Jr
ZXJDb250ZXh0RXhlY3V0aW9uUHJveHkuaCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvV29ya2VyQ29u
dGV4dEV4ZWN1dGlvblByb3h5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u
ZTYzN2ZiNAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvV29ya2VyQ29u
dGV4dEV4ZWN1dGlvblByb3h5LmgKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQg
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
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisKKyNpZm5kZWYgV29ya2VyQ29u
dGV4dEV4ZWN1dGlvblByb3h5X2gKKyNkZWZpbmUgV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5
X2gKKworI2lmIEVOQUJMRShXT1JLRVJTKQorCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlICJ2
OC5oIgorI2luY2x1ZGUgInY4X2luZGV4LmgiCisjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAgY2xhc3MgRXZlbnQ7CisgICAgY2xhc3MgRXZlbnRU
YXJnZXQ7CisgICAgY2xhc3MgVjhFdmVudExpc3RlbmVyOworICAgIGNsYXNzIFdvcmtlckNvbnRl
eHQ7CisKKyAgICBjbGFzcyBXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkgeworICAgIHB1Ymxp
YzoKKyAgICAgICAgV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5KFdvcmtlckNvbnRleHQqKTsK
KyAgICAgICAgfldvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eSgpOworCisgICAgICAgIC8vIFJl
dHVybnMgYSBsb2NhbCBoYW5kbGUgb2YgdGhlIGNvbnRleHQuCisgICAgICAgIHY4OjpMb2NhbDx2
ODo6Q29udGV4dD4gR2V0Q29udGV4dCgpIHsgcmV0dXJuIHY4OjpMb2NhbDx2ODo6Q29udGV4dD46
Ok5ldyhtX2NvbnRleHQpOyB9CisKKyAgICAgICAgLy8gUmV0dXJucyB0aGUgZG9tIGNvbnN0cnVj
dG9yIGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gbm9kZSB0eXBlLgorICAgICAgICB2ODo6TG9jYWw8
djg6OkZ1bmN0aW9uPiBHZXRDb25zdHJ1Y3RvcihWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUp
OworCisgICAgICAgIC8vIEZpbmRzIG9yIGNyZWF0ZXMgYW4gZXZlbnQgbGlzdGVuZXI7CisgICAg
ICAgIFBhc3NSZWZQdHI8VjhFdmVudExpc3RlbmVyPiBGaW5kT3JDcmVhdGVFdmVudExpc3RlbmVy
KHY4OjpMb2NhbDx2ODo6VmFsdWU+IGxpc3RlbmVyLCBib29sIGlzSW5saW5lLCBib29sIGZpbmRP
bmx5KTsKKworICAgICAgICAvLyBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyOworICAgICAgICB2
b2lkIFJlbW92ZUV2ZW50TGlzdGVuZXIoVjhFdmVudExpc3RlbmVyKik7CisKKyAgICAgICAgLy8g
VHJhY2sgdGhlIGV2ZW50IHNvIHRoYXQgd2UgY2FuIGRldGFjaCBpdCBmcm9tIHRoZSBKUyB3cmFw
cGVyIHdoZW4gYSB3b3JrZXIKKyAgICAgICAgLy8gdGVybWluYXRlcy4gVGhpcyBpcyBuZWVkZWQg
YmVjYXVzZSB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gZGlzcG9zZSB0aGVzZQorICAgICAgICAvLyBl
dmVudHMgYW5kIHJlbGVhc2VzIHJlZmVyZW5jZXMgdG8gdGhlaXIgZXZlbnQgdGFyZ2V0czogV29y
a2VyQ29udGV4dC4KKyAgICAgICAgdm9pZCBUcmFja0V2ZW50KEV2ZW50Kik7CisKKyAgICAgICAg
Ly8gRXZhbHVhdGUgYSBzY3JpcHQgZmlsZSBpbiB0aGUgY3VycmVudCBleGVjdXRpb24gZW52aXJv
bm1lbnQuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGV2YWx1YXRlKGNvbnN0IFN0cmlu
ZyYgc2NyaXB0LCBjb25zdCBTdHJpbmcmIGZpbGVOYW1lLCBpbnQgYmFzZUxpbmUpOworCisgICAg
ICAgIC8vIFJldHVybnMgV29ya2VyQ29udGV4dCBvYmplY3QuCisgICAgICAgIFdvcmtlckNvbnRl
eHQqIHdvcmtlckNvbnRleHQoKSB7IHJldHVybiBtX3dvcmtlckNvbnRleHQ7IH0KKworICAgICAg
ICAvLyBSZXR1cm5zIFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eSBvYmplY3Qgb2YgdGhlIGN1
cnJlbnRseSBleGVjdXRpbmcgY29udGV4dC4KKyAgICAgICAgc3RhdGljIFdvcmtlckNvbnRleHRF
eGVjdXRpb25Qcm94eSogcmV0cmlldmUoKTsKKworICAgICAgICAvLyBSZXR1cm5zIHRoZSBKUyB3
cmFwcGVyIG9mIG9iamVjdC4KKyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBU
b1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2b2lkKiBpbXBsKTsK
KyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBFdmVudFRvVjhPYmplY3QoRXZl
bnQqIGV2ZW50KTsKKyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBFdmVudFRh
cmdldFRvVjhPYmplY3QoRXZlbnRUYXJnZXQqIHRhcmdldCk7CisgICAgICAgIHN0YXRpYyB2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4gV29ya2VyQ29udGV4dFRvVjhPYmplY3QoV29ya2VyQ29udGV4dCog
d2MpOworCisgICAgICAgIC8vIEVuYWJsZXMgSFRNTDUgd29ya2VyIHN1cHBvcnQuCisgICAgICAg
IHN0YXRpYyBib29sIGlzV2ViV29ya2Vyc0VuYWJsZWQoKTsKKyAgICAgICAgc3RhdGljIHZvaWQg
c2V0SXNXZWJXb3JrZXJzRW5hYmxlZChib29sKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHZv
aWQgaW5pdENvbnRleHRJZk5lZWRlZCgpOworICAgICAgICB2b2lkIGRpc3Bvc2UoKTsKKworICAg
ICAgICAvLyBSdW4gYW4gYWxyZWFkeSBjb21waWxlZCBzY3JpcHQuCisgICAgICAgIHY4OjpMb2Nh
bDx2ODo6VmFsdWU+IHJ1blNjcmlwdCh2ODo6SGFuZGxlPHY4OjpTY3JpcHQ+KTsKKworICAgICAg
ICBzdGF0aWMgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGluc3RhbnRpYXRlVjhPYmplY3QoVjhDbGFz
c0luZGV4OjpWOFdyYXBwZXJUeXBlIGRlc2NUeXBlLCBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5
cGUgY3B0clR5cGUsIHZvaWQqIGltcGwpOworCisgICAgICAgIHN0YXRpYyBib29sIGZvcmdldFY4
RXZlbnRPYmplY3QoRXZlbnQqKTsKKworICAgICAgICBXb3JrZXJDb250ZXh0KiBtX3dvcmtlckNv
bnRleHQ7CisgICAgICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpDb250ZXh0PiBtX2NvbnRleHQ7Cisg
ICAgICAgIGludCBtX3JlY3Vyc2lvbjsKKworICAgICAgICB0eXBlZGVmIHN0ZDo6bGlzdDxWOEV2
ZW50TGlzdGVuZXIqPiBFdmVudExpc3RlbmVyTGlzdDsKKyAgICAgICAgRXZlbnRMaXN0ZW5lckxp
c3QgbV9saXN0ZW5lcnM7CisKKyAgICAgICAgdHlwZWRlZiBIYXNoU2V0PEV2ZW50Kj4gRXZlbnRT
ZXQ7CisgICAgICAgIEV2ZW50U2V0IG1fZXZlbnRzOworICAgIH07CisKK30gLy8gbmFtZXNwYWNl
IFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShXT1JLRVJTKQorCisjZW5kaWYgLy8gV29ya2Vy
Q29udGV4dEV4ZWN1dGlvblByb3h5X2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3Mvdjgv
V29ya2VyU2NyaXB0Q29udHJvbGxlci5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L1dvcmtlclNj
cmlwdENvbnRyb2xsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZm
ZmZhZjQKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L1dvcmtlclNjcmlw
dENvbnRyb2xsZXIuY3BwCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
ICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAg
ICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwor
ICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0
cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3
cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBU
SEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5Z
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJ
TUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAor
ICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNp
ZiBFTkFCTEUoV09SS0VSUykKKworI2luY2x1ZGUgIldvcmtlclNjcmlwdENvbnRyb2xsZXIuaCIK
KworI2luY2x1ZGUgInY4LmgiCisKKyNpbmNsdWRlICJTY3JpcHRTb3VyY2VDb2RlLmgiCisjaW5j
bHVkZSAiU2NyaXB0VmFsdWUuaCIKKyNpbmNsdWRlICJET01UaW1lci5oIgorI2luY2x1ZGUgIldv
cmtlckNvbnRleHQuaCIKKyNpbmNsdWRlICJXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkuaCIK
KyNpbmNsdWRlICJXb3JrZXJPYmplY3RQcm94eS5oIgorI2luY2x1ZGUgIldvcmtlclRocmVhZC5o
IgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1dvcmtlclNjcmlwdENvbnRyb2xsZXI6Oldvcmtl
clNjcmlwdENvbnRyb2xsZXIoV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCkKKyAgICA6IG1f
d29ya2VyQ29udGV4dCh3b3JrZXJDb250ZXh0KQorICAgICwgbV9wcm94eShuZXcgV29ya2VyQ29u
dGV4dEV4ZWN1dGlvblByb3h5KHdvcmtlckNvbnRleHQpKQorICAgICwgbV9leGVjdXRpb25Gb3Ji
aWRkZW4oZmFsc2UpCit7Cit9CisKK1dvcmtlclNjcmlwdENvbnRyb2xsZXI6On5Xb3JrZXJTY3Jp
cHRDb250cm9sbGVyKCkKK3sKK30KKworU2NyaXB0VmFsdWUgV29ya2VyU2NyaXB0Q29udHJvbGxl
cjo6ZXZhbHVhdGUoY29uc3QgU2NyaXB0U291cmNlQ29kZSYgc291cmNlQ29kZSkKK3sKKyAgICB7
CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2sobV9zaGFyZWREYXRhTXV0ZXgpOworICAgICAgICBp
ZiAobV9leGVjdXRpb25Gb3JiaWRkZW4pCisgICAgICAgICAgICByZXR1cm4gU2NyaXB0VmFsdWUo
KTsKKyAgICB9CisKKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXN1bHQgPSBtX3Byb3h5LT5l
dmFsdWF0ZShzb3VyY2VDb2RlLnNvdXJjZSgpLCBzb3VyY2VDb2RlLnVybCgpLnN0cmluZygpLCBz
b3VyY2VDb2RlLnN0YXJ0TGluZSgpIC0gMSk7CisgICAgbV93b3JrZXJDb250ZXh0LT50aHJlYWQo
KS0+d29ya2VyT2JqZWN0UHJveHkoKS0+cmVwb3J0UGVuZGluZ0FjdGl2aXR5KG1fd29ya2VyQ29u
dGV4dC0+aGFzUGVuZGluZ0FjdGl2aXR5KCkpOworICAgIHJldHVybiBTY3JpcHRWYWx1ZSgpOwor
fQorCitTY3JpcHRWYWx1ZSBXb3JrZXJTY3JpcHRDb250cm9sbGVyOjpldmFsdWF0ZShjb25zdCBT
Y3JpcHRTb3VyY2VDb2RlJiBzb3VyY2VDb2RlLCBTY3JpcHRWYWx1ZSogLyogZXhjZXB0aW9uICov
KQoreworICAgIC8vIEZJWE1FOiBOZWVkIHRvIHJldHVybiBhbiBleGNlcHRpb24uCisgICAgcmV0
dXJuIGV2YWx1YXRlKHNvdXJjZUNvZGUpOworfQorCit2b2lkIFdvcmtlclNjcmlwdENvbnRyb2xs
ZXI6OmZvcmJpZEV4ZWN1dGlvbigpCit7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQg
ZnJvbSBhbm90aGVyIHRocmVhZC4KKyAgICBNdXRleExvY2tlciBsb2NrKG1fc2hhcmVkRGF0YU11
dGV4KTsKKyAgICBtX2V4ZWN1dGlvbkZvcmJpZGRlbiA9IHRydWU7Cit9CisKK3ZvaWQgV29ya2Vy
U2NyaXB0Q29udHJvbGxlcjo6c2V0RXhjZXB0aW9uKFNjcmlwdFZhbHVlIC8qIGV4Y2VwdGlvbiAq
LykKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CisKKyNlbmRpZiAvLyBFTkFCTEUoV09SS0VSUykKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGlu
Z3MvdjgvV29ya2VyU2NyaXB0Q29udHJvbGxlci5oIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9Xb3Jr
ZXJTY3JpcHRDb250cm9sbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u
MDdlMjI0YwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvV29ya2VyU2Ny
aXB0Q29udHJvbGxlci5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
ICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAg
ICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwor
ICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0
cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3
cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBU
SEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5Z
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJ
TUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAor
ICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFdvcmtlclNjcmlwdENvbnRy
b2xsZXJfaAorI2RlZmluZSBXb3JrZXJTY3JpcHRDb250cm9sbGVyX2gKKworI2lmIEVOQUJMRShX
T1JLRVJTKQorCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9UaHJlYWRp
bmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAgY2xhc3MgU2NyaXB0U291cmNlQ29k
ZTsKKyAgICBjbGFzcyBTY3JpcHRWYWx1ZTsKKyAgICBjbGFzcyBXb3JrZXJDb250ZXh0OworICAg
IGNsYXNzIFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTsKKworICAgIGNsYXNzIFdvcmtlclNj
cmlwdENvbnRyb2xsZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgV29ya2VyU2NyaXB0Q29udHJv
bGxlcihXb3JrZXJDb250ZXh0Kik7CisgICAgICAgIH5Xb3JrZXJTY3JpcHRDb250cm9sbGVyKCk7
CisKKyAgICAgICAgV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5KiBwcm94eSgpIHsgcmV0dXJu
IG1fcHJveHkuZ2V0KCk7IH0KKworICAgICAgICBTY3JpcHRWYWx1ZSBldmFsdWF0ZShjb25zdCBT
Y3JpcHRTb3VyY2VDb2RlJik7CisgICAgICAgIFNjcmlwdFZhbHVlIGV2YWx1YXRlKGNvbnN0IFNj
cmlwdFNvdXJjZUNvZGUmLCBTY3JpcHRWYWx1ZSogZXhjZXB0aW9uKTsKKworICAgICAgICB2b2lk
IHNldEV4Y2VwdGlvbihTY3JpcHRWYWx1ZSk7CisKKyAgICAgICAgdm9pZCBmb3JiaWRFeGVjdXRp
b24oKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIFdvcmtlckNvbnRleHQqIG1fd29ya2VyQ29u
dGV4dDsKKyAgICAgICAgT3duUHRyPFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eT4gbV9wcm94
eTsKKworICAgICAgICBNdXRleCBtX3NoYXJlZERhdGFNdXRleDsKKyAgICAgICAgYm9vbCBtX2V4
ZWN1dGlvbkZvcmJpZGRlbjsKKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNl
bmRpZiAvLyBFTkFCTEUoV09SS0VSUykKKworI2VuZGlmIC8vIFdvcmtlclNjcmlwdENvbnRyb2xs
ZXJfaAo=
</data>
<flag name="review"
          id="14172"
          type_id="1"
          status="-"
          setter="dglazkov"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>28758</attachid>
            <date>2009-03-19 12:43:36 -0700</date>
            <delta_ts>2009-03-19 16:04:42 -0700</delta_ts>
            <desc>Updated patch.</desc>
            <filename>patch_v3.txt</filename>
            <type>text/plain</type>
            <size>27206</size>
            <attacher name="Dmitry Titov">dimich</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
NjdjM2U4MS4uYjJjZWJiNSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNiBAQAorMjAwOS0wMy0xOSAgRG1pdHJ5IFRpdG92
ICA8ZGltaWNoQGNocm9taXVtLm9yZz4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MjQ2ODkKKyAgICAgICAgQWRkICh1cHN0cmVhbSkgVjggYmluZGlu
Z3MgZm9yIFdvcmtlcnMuIE1vc3RseSBzdHlsZSBjbGVhbmluZworICAgICAgICAKKyAgICAgICAg
KiBiaW5kaW5ncy92OC9Xb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkuY3BwOiBBZGRlZC4KKyAg
ICAgICAgKiBiaW5kaW5ncy92OC9Xb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkuaDogQWRkZWQu
CisgICAgICAgICogYmluZGluZ3MvdjgvV29ya2VyU2NyaXB0Q29udHJvbGxlci5jcHA6IEFkZGVk
LgorICAgICAgICAqIGJpbmRpbmdzL3Y4L1dvcmtlclNjcmlwdENvbnRyb2xsZXIuaDogQWRkZWQu
CisgICAgICAgICogYmluZGluZ3MvdjgvVjhJbmRleC5oOiBBZGRlZC4gVGhpcyBpcyBqdXN0IGEg
d3JhcHBlciBmb3IgdjhfaW5kZXguaCwgbGlrZSBWOFByb3h5LmgKKyAgICAgICAgKiBiaW5kaW5n
cy92OC9WOFdvcmtlckNvbnRleHRFdmVudExpc3RlbmVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OlY4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXI6OmNhbGxMaXN0ZW5lckZ1bmN0aW9uKTogVHJh
Y2tFdmVudCgpIHJlbmFtZWQgdHJhY2tFdmVudCgpCisKIDIwMDktMDMtMTkgIEplcmVteSBNb3Nr
b3ZpY2ggIDxqZXJlbXlAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERpbWl0
cmkgR2xhemtvdi4KZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvVjhJbmRleC5oIGIv
V2ViQ29yZS9iaW5kaW5ncy92OC9WOEluZGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMC4uZDNhZTc4ZgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvYmluZGluZ3Mvdjgv
VjhJbmRleC5oCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29v
Z2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIAorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMgYXJlCisgKiBtZXQ6CisgKiAKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
CisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBO
ZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBj
b250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl
cml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4KKyAqIAorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUg
Q09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICog
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFY4SW5kZXhfaAorI2RlZmluZSBW
OEluZGV4X2gKKworLy8gRklYTUU6IFRoaXMgaXMgYSB0ZW1wb3JhcnkgZm9yd2FyZGluZyBoZWFk
ZXIgdW50aWwgYWxsIGJpbmRpbmdzIGhhdmUgbWlncmF0ZWQKKy8vIG92ZXIgYW5kIHY4X2luZGV4
IGFjdHVhbGx5IGJlY29tZXMgVjhJbmRleC4KKyNpbmNsdWRlICJ2OF9pbmRleC5oIgorCisjZW5k
aWYgLy8gVjhJbmRleF9oCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4V29ya2Vy
Q29udGV4dEV2ZW50TGlzdGVuZXIuY3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9WOFdvcmtlckNv
bnRleHRFdmVudExpc3RlbmVyLmNwcAppbmRleCA3ZDhkOTI0Li5iYTdhMmMwIDEwMDY0NAotLS0g
YS9XZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXIuY3BwCisr
KyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvVjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5lci5jcHAK
QEAgLTg4LDcgKzg4LDcgQEAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gVjhXb3JrZXJDb250ZXh0RXZl
bnRMaXN0ZW5lcjo6Y2FsbExpc3RlbmVyRnVuY3Rpb24odjg6OkhhbmQKICAgICB2ODo6SGFuZGxl
PHY4OjpWYWx1ZT4gcGFyYW1ldGVyc1sxXSA9IHsganNFdmVudCB9OwogICAgIHY4OjpMb2NhbDx2
ODo6VmFsdWU+IHJlc3VsdCA9IGhhbmRsZXJGdW5jdGlvbi0+Q2FsbChyZWNlaXZlciwgMSwgcGFy
YW1ldGVycyk7CiAKLSAgICBtX3Byb3h5LT5UcmFja0V2ZW50KGV2ZW50KTsKKyAgICBtX3Byb3h5
LT50cmFja0V2ZW50KGV2ZW50KTsKIAogICAgIHJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1naXQg
YS9XZWJDb3JlL2JpbmRpbmdzL3Y4L1dvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eS5jcHAgYi9X
ZWJDb3JlL2JpbmRpbmdzL3Y4L1dvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eS5jcHAKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk1YTdkNQotLS0gL2Rldi9udWxsCisrKyBi
L1dlYkNvcmUvYmluZGluZ3MvdjgvV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5LmNwcApAQCAt
MCwwICsxLDM1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICog
bWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1l
IG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5
IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICog
dGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVS
UyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENP
UFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAq
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgorICovCisKKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgRU5BQkxFKFdPUktFUlMp
CisKKyNpbmNsdWRlICJXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkuaCIKKworI2luY2x1ZGUg
IlY4QmluZGluZy5oIgorI2luY2x1ZGUgIlY4UHJveHkuaCIKKyNpbmNsdWRlICJFdmVudC5oIgor
I2luY2x1ZGUgIlY4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXIuaCIKKyNpbmNsdWRlICJXb3Jr
ZXJDb250ZXh0LmgiCisjaW5jbHVkZSAiV29ya2VyTG9jYXRpb24uaCIKKyNpbmNsdWRlICJXb3Jr
ZXJOYXZpZ2F0b3IuaCIKKyNpbmNsdWRlICJXb3JrZXJTY3JpcHRDb250cm9sbGVyLmgiCisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIGJvb2wgaXNXb3JrZXJzRW5hYmxlZCA9IGZhbHNl
OworCitib29sIFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6aXNXZWJXb3JrZXJzRW5hYmxl
ZCgpCit7CisgICAgcmV0dXJuIGlzV29ya2Vyc0VuYWJsZWQ7Cit9CisKK3ZvaWQgV29ya2VyQ29u
dGV4dEV4ZWN1dGlvblByb3h5OjpzZXRJc1dlYldvcmtlcnNFbmFibGVkKGJvb2wgdmFsdWUpCit7
CisgICAgaXNXb3JrZXJzRW5hYmxlZCA9IHZhbHVlOworfQorCitXb3JrZXJDb250ZXh0RXhlY3V0
aW9uUHJveHk6OldvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eShXb3JrZXJDb250ZXh0KiB3b3Jr
ZXJDb250ZXh0KQorICAgIDogbV93b3JrZXJDb250ZXh0KHdvcmtlckNvbnRleHQpCisgICAgLCBt
X3JlY3Vyc2lvbigwKQoreworfQorCitXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6On5Xb3Jr
ZXJDb250ZXh0RXhlY3V0aW9uUHJveHkoKQoreworICAgIGRpc3Bvc2UoKTsKK30KKwordm9pZCBX
b3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6OmRpc3Bvc2UoKQoreworICAgIC8vIERpc2Nvbm5l
Y3QgYWxsIGV2ZW50IGxpc3RlbmVycy4KKyAgICBmb3IgKHNpemVfdCBsaXN0ZW5lckluZGV4ID0g
MDsgbGlzdGVuZXJJbmRleCA8IG1fbGlzdGVuZXJzLnNpemUoKTsgKytsaXN0ZW5lckluZGV4KQor
ICAgICAgIG1fbGlzdGVuZXJzW2xpc3RlbmVySW5kZXhdLT5kaXNjb25uZWN0KCk7CisKKyAgICBt
X2xpc3RlbmVycy5jbGVhcigpOworCisgICAgLy8gRGV0YWNoIGFsbCBldmVudHMgZnJvbSB0aGVp
ciBKUyB3cmFwcGVycy4KKyAgICBmb3IgKHNpemVfdCBldmVudEluZGV4ID0gMDsgZXZlbnRJbmRl
eCA8IG1fZXZlbnRzLnNpemUoKTsgKytldmVudEluZGV4KSB7CisgICAgICAgIEV2ZW50KiBldmVu
dCA9IG1fZXZlbnRzW2V2ZW50SW5kZXhdOworICAgICAgICBpZiAoZm9yZ2V0VjhFdmVudE9iamVj
dChldmVudCkpCisgICAgICAgICAgZXZlbnQtPmRlcmVmKCk7CisgICAgfQorICAgIG1fZXZlbnRz
LmNsZWFyKCk7CisKKyAgICAvLyBEaXNwb3NlIHRoZSBjb250ZXh0LgorICAgIGlmICghbV9jb250
ZXh0LklzRW1wdHkoKSkgeworICAgICAgICBtX2NvbnRleHQuRGlzcG9zZSgpOworICAgICAgICBt
X2NvbnRleHQuQ2xlYXIoKTsKKyAgICB9CisKKyAgICAvLyBSZW1vdmUgdGhlIHdyYXBwaW5nIGJl
dHdlZW4gSlMgb2JqZWN0IGFuZCBET00gb2JqZWN0LiBUaGlzIGlzIGJlY2F1c2UKKyAgICAvLyB0
aGUgd29ya2VyIGNvbnRleHQgb2JqZWN0IGlzIGdvaW5nIHRvIGJlIGRpc3Bvc2VkIGltbWVkaWF0
ZWx5IHdoZW4gYQorICAgIC8vIHdvcmtlciB0aHJlYWQgaXMgdGVhcmluZyBkb3duLiBXZSBkbyBu
b3Qgd2FudCB0byByZS1kZWxldGUgdGhlIHJlYWwgb2JqZWN0CisgICAgLy8gd2hlbiBKUyBvYmpl
Y3QgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgICAgdjg6OkxvY2tlciBsb2NrZXI7CisgICAgdjg6
OkhhbmRsZVNjb3BlIHNjb3BlOworICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHdyYXBw
ZXIgPSBHZXRET01PYmplY3RNYXAoKS5nZXQobV93b3JrZXJDb250ZXh0KTsKKyAgICBpZiAoIXdy
YXBwZXIuSXNFbXB0eSgpKQorICAgICAgICBWOFByb3h5OjpTZXRET01XcmFwcGVyKHdyYXBwZXIs
IFY4Q2xhc3NJbmRleDo6SU5WQUxJRF9DTEFTU19JTkRFWCwgTlVMTCk7CisgICAgR2V0RE9NT2Jq
ZWN0TWFwKCkuZm9yZ2V0KG1fd29ya2VyQ29udGV4dCk7Cit9CisKK1dvcmtlckNvbnRleHRFeGVj
dXRpb25Qcm94eSogV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5OjpyZXRyaWV2ZSgpCit7Cisg
ICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IHY4OjpDb250ZXh0OjpHZXRDdXJy
ZW50KCk7CisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBnbG9iYWwgPSBjb250ZXh0LT5HbG9i
YWwoKTsKKyAgICBnbG9iYWwgPSBWOFByb3h5OjpMb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRl
eDo6V09SS0VSQ09OVEVYVCwgZ2xvYmFsKTsKKyAgICBBU1NFUlQoIWdsb2JhbC5Jc0VtcHR5KCkp
OworICAgIFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRleHQgPSBWOFByb3h5OjpUb05hdGl2ZU9i
amVjdDxXb3JrZXJDb250ZXh0PihWOENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQsIGdsb2JhbCk7
CisgICAgcmV0dXJuIHdvcmtlckNvbnRleHQtPnNjcmlwdCgpLT5wcm94eSgpOworfQorCit2b2lk
IFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6aW5pdENvbnRleHRJZk5lZWRlZCgpCit7Cisg
ICAgLy8gQmFpbCBvdXQgaWYgdGhlIGNvbnRleHQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXpl
ZC4KKyAgICBpZiAoIW1fY29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAg
IC8vIENyZWF0ZSBhIG5ldyBlbnZpcm9ubWVudAorICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmpl
Y3RUZW1wbGF0ZT4gZ2xvYmFsVGVtcGxhdGU7CisgICAgbV9jb250ZXh0ID0gdjg6OkNvbnRleHQ6
Ok5ldyhOVUxMLCBnbG9iYWxUZW1wbGF0ZSk7CisKKyAgICAvLyBTdGFydGluZyBmcm9tIG5vdywg
dXNlIGxvY2FsIGNvbnRleHQgb25seS4KKyAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRl
eHQgPSB2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcobV9jb250ZXh0KTsKKyAgICB2ODo6Q29u
dGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisKKyAgICAvLyBBbGxvY2F0ZSBzdHJpbmdzIHVz
ZWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICAgIHY4OjpIYW5kbGU8djg6OlN0cmluZz4gaW1w
bGljaXRQcm90b1N0cmluZyA9IHY4OjpTdHJpbmc6Ok5ldygiX19wcm90b19fIik7CisKKyAgICAv
LyBDcmVhdGUgYSBuZXcgSlMgb2JqZWN0IGFuZCB1c2UgaXQgYXMgdGhlIHByb3RvdHlwZSBmb3Ig
dGhlIHNoYWRvdyBnbG9iYWwgb2JqZWN0LgorICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiB3
b3JrZXJDb250ZXh0Q29uc3RydWN0b3IgPSBHZXRDb25zdHJ1Y3RvcihWOENsYXNzSW5kZXg6OldP
UktFUkNPTlRFWFQpOworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBqc1dvcmtlckNvbnRleHQg
PSBTYWZlQWxsb2NhdGlvbjo6TmV3SW5zdGFuY2Uod29ya2VyQ29udGV4dENvbnN0cnVjdG9yKTsK
KyAgICAvLyBCYWlsIG91dCBpZiBhbGxvY2F0aW9uIGZhaWxlZC4KKyAgICBpZiAoanNXb3JrZXJD
b250ZXh0LklzRW1wdHkoKSkgeworICAgICAgICBkaXNwb3NlKCk7CisgICAgICAgIHJldHVybjsK
KyAgICB9CisKKyAgICAvLyBXcmFwIHRoZSBvYmplY3QuCisgICAgVjhQcm94eTo6U2V0RE9NV3Jh
cHBlcihqc1dvcmtlckNvbnRleHQsIFY4Q2xhc3NJbmRleDo6VG9JbnQoVjhDbGFzc0luZGV4OjpX
T1JLRVJDT05URVhUKSwgbV93b3JrZXJDb250ZXh0KTsKKworICAgIFY4UHJveHk6OlNldEpTV3Jh
cHBlckZvckRPTU9iamVjdChtX3dvcmtlckNvbnRleHQsIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmpl
Y3Q+OjpOZXcoanNXb3JrZXJDb250ZXh0KSk7CisKKyAgICAvLyBJbnNlcnQgdGhlIG9iamVjdCBp
bnN0YW5jZSBhcyB0aGUgcHJvdG90eXBlIG9mIHRoZSBzaGFkb3cgb2JqZWN0LgorICAgIHY4OjpI
YW5kbGU8djg6Ok9iamVjdD4gdjhfZ2xvYmFsID0gbV9jb250ZXh0LT5HbG9iYWwoKTsKKyAgICB2
OF9nbG9iYWwtPlNldChpbXBsaWNpdFByb3RvU3RyaW5nLCBqc1dvcmtlckNvbnRleHQpOworfQor
Cit2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6Okdl
dENvbnN0cnVjdG9yKFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlKQoreworICAgIC8v
IEVudGVyIHRoZSBjb250ZXh0IG9mIHRoZSBwcm94eSB0byBtYWtlIHN1cmUgdGhhdCB0aGUgZnVu
Y3Rpb24gaXMKKyAgICAvLyBjb25zdHJ1Y3RlZCBpbiB0aGUgY29udGV4dCBjb3JyZXNwb25kaW5n
IHRvIHRoaXMgcHJveHkuCisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKG1fY29udGV4dCk7
CisgICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gZnVuY3Rpb25UZW1wbGF0ZSA9
IFY4UHJveHk6OkdldFRlbXBsYXRlKHR5cGUpOworCisgICAgLy8gR2V0dGluZyB0aGUgZnVuY3Rp
b24gbWlnaHQgZmFpbCBpZiB3ZSdyZSBydW5uaW5nIG91dCBvZiBzdGFjayBvciBtZW1vcnkuCisg
ICAgdjg6OlRyeUNhdGNoIHRyeUNhdGNoOworICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+IHZh
bHVlID0gZnVuY3Rpb25UZW1wbGF0ZS0+R2V0RnVuY3Rpb24oKTsKKyAgICBpZiAodmFsdWUuSXNF
bXB0eSgpKQorICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4oKTsKKworICAg
IHJldHVybiB2YWx1ZTsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFdvcmtlckNvbnRleHRF
eGVjdXRpb25Qcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlw
ZSwgdm9pZCogaW1wbCkKK3sKKyAgICBpZiAoIWltcGwpCisgICAgICAgIHJldHVybiB2ODo6TnVs
bCgpOworCisgICAgaWYgKHR5cGUgPT0gVjhDbGFzc0luZGV4OjpXT1JLRVJDT05URVhUKQorICAg
ICAgICByZXR1cm4gV29ya2VyQ29udGV4dFRvVjhPYmplY3Qoc3RhdGljX2Nhc3Q8V29ya2VyQ29u
dGV4dCo+KGltcGwpKTsKKworICAgIC8vIE5vbiBET00gbm9kZQorICAgIHY4OjpQZXJzaXN0ZW50
PHY4OjpPYmplY3Q+IHJlc3VsdCA9IEdldERPTU9iamVjdE1hcCgpLmdldChpbXBsKTsKKyAgICBp
ZiAocmVzdWx0LklzRW1wdHkoKSkgeworICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2Jq
ZWN0ID0gdG9WOCh0eXBlLCB0eXBlLCBpbXBsKTsKKyAgICAgICAgaWYgKCFvYmplY3QuSXNFbXB0
eSgpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVjhD
bGFzc0luZGV4OjpXT1JLRVJMT0NBVElPTjoKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxX
b3JrZXJMb2NhdGlvbio+KGltcGwpLT5yZWYoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgIGNhc2UgVjhDbGFzc0luZGV4OjpXT1JLRVJOQVZJR0FUT1I6CisgICAgICAgICAg
ICAgICAgc3RhdGljX2Nhc3Q8V29ya2VyTmF2aWdhdG9yKj4oaW1wbCktPnJlZigpOworICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBB
U1NFUlQoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0ID0gdjg6OlBl
cnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhvYmplY3QpOworICAgICAgICAgICAgVjhQcm94eTo6
U2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KGltcGwsIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9
CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFdvcmtlckNv
bnRleHRFeGVjdXRpb25Qcm94eTo6RXZlbnRUb1Y4T2JqZWN0KEV2ZW50KiBldmVudCkKK3sKKyAg
ICBpZiAoIWV2ZW50KQorICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKKworICAgIHY4OjpIYW5k
bGU8djg6Ok9iamVjdD4gd3JhcHBlciA9IEdldERPTU9iamVjdE1hcCgpLmdldChldmVudCk7Cisg
ICAgaWYgKCF3cmFwcGVyLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisKKyAg
ICBWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSA9IFY4Q2xhc3NJbmRleDo6RVZFTlQ7
CisKKyAgICBpZiAoZXZlbnQtPmlzTWVzc2FnZUV2ZW50KCkpCisgICAgICAgIHR5cGUgPSBWOENs
YXNzSW5kZXg6Ok1FU1NBR0VFVkVOVDsKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gcmVz
dWx0ID0gdG9WOCh0eXBlLCBWOENsYXNzSW5kZXg6OkVWRU5ULCBldmVudCk7CisgICAgaWYgKHJl
c3VsdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gSW5zdGFudGlhdGlvbiBmYWlsZWQuIEF2b2lk
IHVwZGF0aW5nIHRoZSBET00gb2JqZWN0IG1hcCBhbmQgcmV0dXJuIG51bGwgd2hpY2gKKyAgICAg
ICAgLy8gaXMgYWxyZWFkeSBoYW5kbGVkIGJ5IGNhbGxlcnMgb2YgdGhpcyBmdW5jdGlvbiBpbiBj
YXNlIHRoZSBldmVudCBpcyBOVUxMLgorICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKKyAgICB9
CisKKyAgICBldmVudC0+cmVmKCk7ICAvLyBmYXN0IHJlZgorICAgIFY4UHJveHk6OlNldEpTV3Jh
cHBlckZvckRPTU9iamVjdChldmVudCwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhy
ZXN1bHQpKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEEgSlMgb2JqZWN0IG9mIHR5
cGUgRXZlbnRUYXJnZXQgaW4gdGhlIHdvcmtlciBjb250ZXh0IGNhbiBvbmx5IGJlIFdvcmtlckNv
bnRleHQuCit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5
OjpFdmVudFRhcmdldFRvVjhPYmplY3QoRXZlbnRUYXJnZXQqIHRhcmdldCkKK3sKKyAgICBpZiAo
IXRhcmdldCkKKyAgICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7CisKKyAgICBXb3JrZXJDb250ZXh0
KiB3b3JrZXJDb250ZXh0ID0gdGFyZ2V0LT50b1dvcmtlckNvbnRleHQoKTsKKyAgICBpZiAod29y
a2VyQ29udGV4dCkKKyAgICAgICAgcmV0dXJuIFdvcmtlckNvbnRleHRUb1Y4T2JqZWN0KHdvcmtl
ckNvbnRleHQpOworCisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIHY4OjpI
YW5kbGU8djg6OlZhbHVlPigpOworfQorCit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gV29ya2VyQ29u
dGV4dEV4ZWN1dGlvblByb3h5OjpXb3JrZXJDb250ZXh0VG9WOE9iamVjdChXb3JrZXJDb250ZXh0
KiB3b3JrZXJDb250ZXh0KQoreworICAgIGlmICghd29ya2VyQ29udGV4dCkKKyAgICAgICAgcmV0
dXJuIHY4OjpOdWxsKCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0g
d29ya2VyQ29udGV4dC0+c2NyaXB0KCktPnByb3h5KCktPkdldENvbnRleHQoKTsKKworICAgIHY4
OjpIYW5kbGU8djg6Ok9iamVjdD4gZ2xvYmFsID0gY29udGV4dC0+R2xvYmFsKCk7CisgICAgQVNT
RVJUKCFnbG9iYWwuSXNFbXB0eSgpKTsKKyAgICByZXR1cm4gZ2xvYmFsOworfQorCit2ODo6TG9j
YWw8djg6Ok9iamVjdD4gV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5Ojp0b1Y4KFY4Q2xhc3NJ
bmRleDo6VjhXcmFwcGVyVHlwZSBkZXNjVHlwZSwgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBl
IGNwdHJUeXBlLCB2b2lkKiBpbXBsKQoreworICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+IGZ1
bmN0aW9uOworICAgIFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eSogcHJveHkgPSByZXRyaWV2
ZSgpOworICAgIGlmIChwcm94eSkKKyAgICAgICAgZnVuY3Rpb24gPSBwcm94eS0+R2V0Q29uc3Ry
dWN0b3IoZGVzY1R5cGUpOworICAgIGVsc2UKKyAgICAgICAgZnVuY3Rpb24gPSBWOFByb3h5OjpH
ZXRUZW1wbGF0ZShkZXNjVHlwZSktPkdldEZ1bmN0aW9uKCk7CisKKyAgICB2ODo6TG9jYWw8djg6
Ok9iamVjdD4gaW5zdGFuY2UgPSBTYWZlQWxsb2NhdGlvbjo6TmV3SW5zdGFuY2UoZnVuY3Rpb24p
OworICAgIGlmICghaW5zdGFuY2UuSXNFbXB0eSgpKSB7CisgICAgICAgIC8vIEF2b2lkIHNldHRp
bmcgdGhlIERPTSB3cmFwcGVyIGZvciBmYWlsZWQgYWxsb2NhdGlvbnMuCisgICAgICAgIFY4UHJv
eHk6OlNldERPTVdyYXBwZXIoaW5zdGFuY2UsIFY4Q2xhc3NJbmRleDo6VG9JbnQoY3B0clR5cGUp
LCBpbXBsKTsKKyAgICB9CisgICAgcmV0dXJuIGluc3RhbmNlOworfQorCitib29sIFdvcmtlckNv
bnRleHRFeGVjdXRpb25Qcm94eTo6Zm9yZ2V0VjhFdmVudE9iamVjdChFdmVudCogZXZlbnQpCit7
CisgICAgaWYgKEdldERPTU9iamVjdE1hcCgpLmNvbnRhaW5zKGV2ZW50KSkgeworICAgICAgICBH
ZXRET01PYmplY3RNYXAoKS5mb3JnZXQoZXZlbnQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworfQorCit2ODo6TG9jYWw8djg6OlZhbHVl
PiBXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6OmV2YWx1YXRlKGNvbnN0IFN0cmluZyYgc2Ny
aXB0LCBjb25zdCBTdHJpbmcmIGZpbGVOYW1lLCBpbnQgYmFzZUxpbmUpCit7CisgICAgdjg6Okxv
Y2tlciBsb2NrZXI7CisgICAgdjg6OkhhbmRsZVNjb3BlIGhzOworCisgICAgaW5pdENvbnRleHRJ
Zk5lZWRlZCgpOworICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShtX2NvbnRleHQpOworCisg
ICAgdjg6OkxvY2FsPHY4OjpTdHJpbmc+IHNjcmlwdFN0cmluZyA9IHY4RXh0ZXJuYWxTdHJpbmco
c2NyaXB0KTsKKyAgICB2ODo6SGFuZGxlPHY4OjpTY3JpcHQ+IGNvbXBpbGVkU2NyaXB0ID0gVjhQ
cm94eTo6Q29tcGlsZVNjcmlwdChzY3JpcHRTdHJpbmcsIGZpbGVOYW1lLCBiYXNlTGluZSk7Cisg
ICAgcmV0dXJuIHJ1blNjcmlwdChjb21waWxlZFNjcmlwdCk7Cit9CisKK3Y4OjpMb2NhbDx2ODo6
VmFsdWU+IFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6cnVuU2NyaXB0KHY4OjpIYW5kbGU8
djg6OlNjcmlwdD4gc2NyaXB0KQoreworICAgIGlmIChzY3JpcHQuSXNFbXB0eSgpKQorICAgICAg
ICByZXR1cm4gdjg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKKworICAgIC8vIENvbXB1dGUgdGhlIHNv
dXJjZSBzdHJpbmcgYW5kIHByZXZlbnQgYWdhaW5zdCBpbmZpbml0ZSByZWN1cnNpb24uCisgICAg
aWYgKG1fcmVjdXJzaW9uID49IGtNYXhSZWN1cnNpb25EZXB0aCkgeworICAgICAgICB2ODo6TG9j
YWw8djg6OlN0cmluZz4gY29kZSA9IHY4RXh0ZXJuYWxTdHJpbmcoInRocm93IFJhbmdlRXJyb3Io
J1JlY3Vyc2lvbiB0b28gZGVlcCcpIik7CisgICAgICAgIHNjcmlwdCA9IFY4UHJveHk6OkNvbXBp
bGVTY3JpcHQoY29kZSwgIiIsIDApOworICAgIH0KKworICAgIGlmIChWOFByb3h5OjpIYW5kbGVP
dXRPZk1lbW9yeSgpKQorICAgICAgICBBU1NFUlQoc2NyaXB0LklzRW1wdHkoKSk7CisKKyAgICBp
ZiAoc2NyaXB0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6VmFsdWU+
KCk7CisKKyAgICAvLyBSdW4gdGhlIHNjcmlwdCBhbmQga2VlcCB0cmFjayBvZiB0aGUgY3VycmVu
dCByZWN1cnNpb24gZGVwdGguCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcmVzdWx0OworICAg
IHsKKyAgICAgICAgbV9yZWN1cnNpb24rKzsKKyAgICAgICAgcmVzdWx0ID0gc2NyaXB0LT5SdW4o
KTsKKyAgICAgICAgbV9yZWN1cnNpb24tLTsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgVjggaW50
ZXJuYWwgZXJyb3Igc2l0dWF0aW9uIChPdXQtb2YtbWVtb3J5KS4KKyAgICBpZiAocmVzdWx0Lklz
RW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7CisKKyAgICBy
ZXR1cm4gcmVzdWx0OworfQorCitQYXNzUmVmUHRyPFY4RXZlbnRMaXN0ZW5lcj4gV29ya2VyQ29u
dGV4dEV4ZWN1dGlvblByb3h5OjpGaW5kT3JDcmVhdGVFdmVudExpc3RlbmVyKHY4OjpMb2NhbDx2
ODo6VmFsdWU+IG9iamVjdCwgYm9vbCBpc0lubGluZSwgYm9vbCBmaW5kT25seSkKK3sKKyAgICBp
ZiAoIW9iamVjdC0+SXNPYmplY3QoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKHNp
emVfdCBpbmRleCA9IDsgaW5kZXggPCBtX2xpc3RlbmVycy5zaXplKCk7ICsraW5kZXgpIHsKKyAg
ICAgICAgVjhFdmVudExpc3RlbmVyKiBlbCA9IG1fbGlzdGVuZXJzW2luZGV4XTsKKyAgICAgICAg
aWYgKGVsLT5pc0lubGluZSgpID09IGlzSW5saW5lICYmIGVsLT5nZXRMaXN0ZW5lck9iamVjdCgp
ID09IG9iamVjdCkKKyAgICAgICAgICAgIHJldHVybiBlbDsKKyAgICB9CisgICAgaWYgKGZpbmRP
bmx5KQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8vIENyZWF0ZSBhIG5ldyBvbmUsIGFu
ZCBhZGQgdG8gY2FjaGUuCisgICAgUmVmUHRyPFY4RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBW
OFdvcmtlckNvbnRleHRFdmVudExpc3RlbmVyOjpjcmVhdGUodGhpcywgdjg6OkxvY2FsPHY4OjpP
YmplY3Q+OjpDYXN0KG9iamVjdCksIGlzSW5saW5lKTsKKyAgICBtX2xpc3RlbmVycy5hcHBlbmQo
bGlzdGVuZXIuZ2V0KCkpOworCisgICAgcmV0dXJuIGxpc3RlbmVyLnJlbGVhc2UoKTsKK30KKwor
dm9pZCBXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6OlJlbW92ZUV2ZW50TGlzdGVuZXIoVjhF
dmVudExpc3RlbmVyKiBsaXN0ZW5lcikKK3sKKyAgICBmb3IgKHNpemVfdCBpbmRleCA9IDsgaW5k
ZXggPCBtX2xpc3RlbmVycy5zaXplKCk7ICsraW5kZXgpIHsKKyAgICAgICAgaWYgKG1fbGlzdGVu
ZXJzW2luZGV4XSA9PSBsaXN0ZW5lcikgeworICAgICAgICAgICAgbV9saXN0ZW5lcnMucmVtb3Zl
KGluZGV4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9p
ZCBXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6OnRyYWNrRXZlbnQoRXZlbnQqIGV2ZW50KQor
eworICAgIG1fZXZlbnRzLmFwcGVuZChldmVudCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKKworI2VuZGlmIC8vIEVOQUJMRShXT1JLRVJTKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5k
aW5ncy92OC9Xb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkuaCBiL1dlYkNvcmUvYmluZGluZ3Mv
djgvV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMC4uMzAyMzY2NgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvYmluZGluZ3Mv
djgvV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5LmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlz
dHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3Ig
dGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ug
b3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91
dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwor
ICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9S
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRI
RU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisKKyNpZm5k
ZWYgV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5X2gKKyNkZWZpbmUgV29ya2VyQ29udGV4dEV4
ZWN1dGlvblByb3h5X2gKKworI2lmIEVOQUJMRShXT1JLRVJTKQorCisjaW5jbHVkZSA8djguaD4K
KyNpbmNsdWRlICJWOEluZGV4LmgiCisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKKyAgICBjbGFzcyBFdmVudDsKKyAgICBjbGFzcyBFdmVudFRhcmdldDsK
KyAgICBjbGFzcyBWOEV2ZW50TGlzdGVuZXI7CisgICAgY2xhc3MgVjhXb3JrZXJDb250ZXh0RXZl
bnRMaXN0ZW5lcjsKKyAgICBjbGFzcyBXb3JrZXJDb250ZXh0OworCisgICAgY2xhc3MgV29ya2Vy
Q29udGV4dEV4ZWN1dGlvblByb3h5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIFdvcmtlckNvbnRl
eHRFeGVjdXRpb25Qcm94eShXb3JrZXJDb250ZXh0Kik7CisgICAgICAgIH5Xb3JrZXJDb250ZXh0
RXhlY3V0aW9uUHJveHkoKTsKKworICAgICAgICAvLyBGSVhNRTogZm9sbG93aW5nIGZ1bmN0aW9u
IHNzaG91bGQgaGF2ZSBjYW1lbENhc2VkIG5hbWVzIG9uY2UgVjggY29kZS1nZW5lcmF0aW5nIHNj
cmlwdCBpcyBtaWdyYXRlZC4KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBHZXRDb250
ZXh0KCkgeyByZXR1cm4gdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KG1fY29udGV4dCk7IH0K
KyAgICAgICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4gR2V0Q29uc3RydWN0b3IoVjhDbGFzc0lu
ZGV4OjpWOFdyYXBwZXJUeXBlKTsKKyAgICAgICAgUGFzc1JlZlB0cjxWOEV2ZW50TGlzdGVuZXI+
IEZpbmRPckNyZWF0ZUV2ZW50TGlzdGVuZXIodjg6OkxvY2FsPHY4OjpWYWx1ZT4gbGlzdGVuZXIs
IGJvb2wgaXNJbmxpbmUsIGJvb2wgZmluZE9ubHkpOworICAgICAgICB2b2lkIFJlbW92ZUV2ZW50
TGlzdGVuZXIoVjhFdmVudExpc3RlbmVyKik7CisKKyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8
djg6OlZhbHVlPiBUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2
b2lkKiBpbXBsKTsKKyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBFdmVudFRv
VjhPYmplY3QoRXZlbnQqIGV2ZW50KTsKKyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZh
bHVlPiBFdmVudFRhcmdldFRvVjhPYmplY3QoRXZlbnRUYXJnZXQqIHRhcmdldCk7CisgICAgICAg
IHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gV29ya2VyQ29udGV4dFRvVjhPYmplY3QoV29y
a2VyQ29udGV4dCogd2MpOworCisgICAgICAgIC8vIFRyYWNrIHRoZSBldmVudCBzbyB0aGF0IHdl
IGNhbiBkZXRhY2ggaXQgZnJvbSB0aGUgSlMgd3JhcHBlciB3aGVuIGEgd29ya2VyCisgICAgICAg
IC8vIHRlcm1pbmF0ZXMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd2UgbmVlZCB0byBiZSBhYmxl
IHRvIGRpc3Bvc2UgdGhlc2UKKyAgICAgICAgLy8gZXZlbnRzIGFuZCByZWxlYXNlcyByZWZlcmVu
Y2VzIHRvIHRoZWlyIGV2ZW50IHRhcmdldHM6IFdvcmtlckNvbnRleHQuCisgICAgICAgIHZvaWQg
dHJhY2tFdmVudChFdmVudCopOworCisgICAgICAgIC8vIEV2YWx1YXRlIGEgc2NyaXB0IGZpbGUg
aW4gdGhlIGN1cnJlbnQgZXhlY3V0aW9uIGVudmlyb25tZW50LgorICAgICAgICB2ODo6TG9jYWw8
djg6OlZhbHVlPiBldmFsdWF0ZShjb25zdCBTdHJpbmcmIHNjcmlwdCwgY29uc3QgU3RyaW5nJiBm
aWxlTmFtZSwgaW50IGJhc2VMaW5lKTsKKworICAgICAgICAvLyBSZXR1cm5zIFdvcmtlckNvbnRl
eHQgb2JqZWN0LgorICAgICAgICBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0KCkgeyByZXR1
cm4gbV93b3JrZXJDb250ZXh0OyB9CisKKyAgICAgICAgLy8gUmV0dXJucyBXb3JrZXJDb250ZXh0
RXhlY3V0aW9uUHJveHkgb2JqZWN0IG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGNvbnRleHQu
CisgICAgICAgIHN0YXRpYyBXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkqIHJldHJpZXZlKCk7
CisKKyAgICAgICAgLy8gRW5hYmxlcyBIVE1MNSB3b3JrZXIgc3VwcG9ydC4KKyAgICAgICAgc3Rh
dGljIGJvb2wgaXNXZWJXb3JrZXJzRW5hYmxlZCgpOworICAgICAgICBzdGF0aWMgdm9pZCBzZXRJ
c1dlYldvcmtlcnNFbmFibGVkKGJvb2wpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBp
bml0Q29udGV4dElmTmVlZGVkKCk7CisgICAgICAgIHZvaWQgZGlzcG9zZSgpOworCisgICAgICAg
IC8vIFJ1biBhbiBhbHJlYWR5IGNvbXBpbGVkIHNjcmlwdC4KKyAgICAgICAgdjg6OkxvY2FsPHY4
OjpWYWx1ZT4gcnVuU2NyaXB0KHY4OjpIYW5kbGU8djg6OlNjcmlwdD4pOworCisgICAgICAgIHN0
YXRpYyB2ODo6TG9jYWw8djg6Ok9iamVjdD4gdG9WOChWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5
cGUgZGVzY1R5cGUsIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSBjcHRyVHlwZSwgdm9pZCog
aW1wbCk7CisKKyAgICAgICAgc3RhdGljIGJvb2wgZm9yZ2V0VjhFdmVudE9iamVjdChFdmVudCop
OworCisgICAgICAgIFdvcmtlckNvbnRleHQqIG1fd29ya2VyQ29udGV4dDsKKyAgICAgICAgdjg6
OlBlcnNpc3RlbnQ8djg6OkNvbnRleHQ+IG1fY29udGV4dDsKKyAgICAgICAgaW50IG1fcmVjdXJz
aW9uOworCisgICAgICAgIFZlY3RvcjxWOFdvcmtlckNvbnRleHRFdmVudExpc3RlbmVyKj4gbV9s
aXN0ZW5lcnM7CisgICAgICAgIFZlY3RvcjxFdmVudCo+IG1fZXZlbnRzOworICAgIH07CisKK30g
Ly8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShXT1JLRVJTKQorCisjZW5k
aWYgLy8gV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5X2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUv
YmluZGluZ3MvdjgvV29ya2VyU2NyaXB0Q29udHJvbGxlci5jcHAgYi9XZWJDb3JlL2JpbmRpbmdz
L3Y4L1dvcmtlclNjcmlwdENvbnRyb2xsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLjg1YmVlMGEKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4
L1dvcmtlclNjcmlwdENvbnRyb2xsZXIuY3BwCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0
aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5h
bWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVj
aWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFT
IElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAor
ICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisKKyNpZiBFTkFCTEUoV09SS0VSUykKKworI2luY2x1ZGUgIldvcmtlclNjcmlwdENv
bnRyb2xsZXIuaCIKKworI2luY2x1ZGUgPHY4Lmg+CisKKyNpbmNsdWRlICJTY3JpcHRTb3VyY2VD
b2RlLmgiCisjaW5jbHVkZSAiU2NyaXB0VmFsdWUuaCIKKyNpbmNsdWRlICJET01UaW1lci5oIgor
I2luY2x1ZGUgIldvcmtlckNvbnRleHQuaCIKKyNpbmNsdWRlICJXb3JrZXJDb250ZXh0RXhlY3V0
aW9uUHJveHkuaCIKKyNpbmNsdWRlICJXb3JrZXJPYmplY3RQcm94eS5oIgorI2luY2x1ZGUgIldv
cmtlclRocmVhZC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1dvcmtlclNjcmlwdENvbnRy
b2xsZXI6OldvcmtlclNjcmlwdENvbnRyb2xsZXIoV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4
dCkKKyAgICA6IG1fd29ya2VyQ29udGV4dCh3b3JrZXJDb250ZXh0KQorICAgICwgbV9wcm94eShu
ZXcgV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5KHdvcmtlckNvbnRleHQpKQorICAgICwgbV9l
eGVjdXRpb25Gb3JiaWRkZW4oZmFsc2UpCit7Cit9CisKK1dvcmtlclNjcmlwdENvbnRyb2xsZXI6
On5Xb3JrZXJTY3JpcHRDb250cm9sbGVyKCkKK3sKK30KKworU2NyaXB0VmFsdWUgV29ya2VyU2Ny
aXB0Q29udHJvbGxlcjo6ZXZhbHVhdGUoY29uc3QgU2NyaXB0U291cmNlQ29kZSYgc291cmNlQ29k
ZSkKK3sKKyAgICB7CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2sobV9zaGFyZWREYXRhTXV0ZXgp
OworICAgICAgICBpZiAobV9leGVjdXRpb25Gb3JiaWRkZW4pCisgICAgICAgICAgICByZXR1cm4g
U2NyaXB0VmFsdWUoKTsKKyAgICB9CisKKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXN1bHQg
PSBtX3Byb3h5LT5ldmFsdWF0ZShzb3VyY2VDb2RlLnNvdXJjZSgpLCBzb3VyY2VDb2RlLnVybCgp
LnN0cmluZygpLCBzb3VyY2VDb2RlLnN0YXJ0TGluZSgpIC0gMSk7CisgICAgbV93b3JrZXJDb250
ZXh0LT50aHJlYWQoKS0+d29ya2VyT2JqZWN0UHJveHkoKS0+cmVwb3J0UGVuZGluZ0FjdGl2aXR5
KG1fd29ya2VyQ29udGV4dC0+aGFzUGVuZGluZ0FjdGl2aXR5KCkpOworICAgIHJldHVybiBTY3Jp
cHRWYWx1ZSgpOworfQorCitTY3JpcHRWYWx1ZSBXb3JrZXJTY3JpcHRDb250cm9sbGVyOjpldmFs
dWF0ZShjb25zdCBTY3JpcHRTb3VyY2VDb2RlJiBzb3VyY2VDb2RlLCBTY3JpcHRWYWx1ZSogLyog
ZXhjZXB0aW9uICovKQoreworICAgIC8vIEZJWE1FOiBOZWVkIHRvIHJldHVybiBhbiBleGNlcHRp
b24uCisgICAgcmV0dXJuIGV2YWx1YXRlKHNvdXJjZUNvZGUpOworfQorCit2b2lkIFdvcmtlclNj
cmlwdENvbnRyb2xsZXI6OmZvcmJpZEV4ZWN1dGlvbigpCit7CisgICAgLy8gVGhpcyBmdW5jdGlv
biBpcyBjYWxsZWQgZnJvbSBhbm90aGVyIHRocmVhZC4KKyAgICBNdXRleExvY2tlciBsb2NrKG1f
c2hhcmVkRGF0YU11dGV4KTsKKyAgICBtX2V4ZWN1dGlvbkZvcmJpZGRlbiA9IHRydWU7Cit9CisK
K3ZvaWQgV29ya2VyU2NyaXB0Q29udHJvbGxlcjo6c2V0RXhjZXB0aW9uKFNjcmlwdFZhbHVlIC8q
IGV4Y2VwdGlvbiAqLykKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoV09SS0VSUykKZGlmZiAtLWdpdCBhL1dl
YkNvcmUvYmluZGluZ3MvdjgvV29ya2VyU2NyaXB0Q29udHJvbGxlci5oIGIvV2ViQ29yZS9iaW5k
aW5ncy92OC9Xb3JrZXJTY3JpcHRDb250cm9sbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMC4uMDdlMjI0YwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvYmluZGluZ3Mv
djgvV29ya2VyU2NyaXB0Q29udHJvbGxlci5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0
aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5h
bWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVj
aWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFT
IElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAor
ICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFdvcmtl
clNjcmlwdENvbnRyb2xsZXJfaAorI2RlZmluZSBXb3JrZXJTY3JpcHRDb250cm9sbGVyX2gKKwor
I2lmIEVOQUJMRShXT1JLRVJTKQorCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUg
PHd0Zi9UaHJlYWRpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAgY2xhc3MgU2Ny
aXB0U291cmNlQ29kZTsKKyAgICBjbGFzcyBTY3JpcHRWYWx1ZTsKKyAgICBjbGFzcyBXb3JrZXJD
b250ZXh0OworICAgIGNsYXNzIFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTsKKworICAgIGNs
YXNzIFdvcmtlclNjcmlwdENvbnRyb2xsZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgV29ya2Vy
U2NyaXB0Q29udHJvbGxlcihXb3JrZXJDb250ZXh0Kik7CisgICAgICAgIH5Xb3JrZXJTY3JpcHRD
b250cm9sbGVyKCk7CisKKyAgICAgICAgV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5KiBwcm94
eSgpIHsgcmV0dXJuIG1fcHJveHkuZ2V0KCk7IH0KKworICAgICAgICBTY3JpcHRWYWx1ZSBldmFs
dWF0ZShjb25zdCBTY3JpcHRTb3VyY2VDb2RlJik7CisgICAgICAgIFNjcmlwdFZhbHVlIGV2YWx1
YXRlKGNvbnN0IFNjcmlwdFNvdXJjZUNvZGUmLCBTY3JpcHRWYWx1ZSogZXhjZXB0aW9uKTsKKwor
ICAgICAgICB2b2lkIHNldEV4Y2VwdGlvbihTY3JpcHRWYWx1ZSk7CisKKyAgICAgICAgdm9pZCBm
b3JiaWRFeGVjdXRpb24oKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIFdvcmtlckNvbnRleHQq
IG1fd29ya2VyQ29udGV4dDsKKyAgICAgICAgT3duUHRyPFdvcmtlckNvbnRleHRFeGVjdXRpb25Q
cm94eT4gbV9wcm94eTsKKworICAgICAgICBNdXRleCBtX3NoYXJlZERhdGFNdXRleDsKKyAgICAg
ICAgYm9vbCBtX2V4ZWN1dGlvbkZvcmJpZGRlbjsKKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBX
ZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoV09SS0VSUykKKworI2VuZGlmIC8vIFdvcmtlclNj
cmlwdENvbnRyb2xsZXJfaAo=
</data>
<flag name="review"
          id="14184"
          type_id="1"
          status="-"
          setter="dglazkov"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>28768</attachid>
            <date>2009-03-19 16:04:42 -0700</date>
            <delta_ts>2009-03-19 19:37:34 -0700</delta_ts>
            <desc>Asymptotically approaching the cleanness.</desc>
            <filename>patch_v4.txt</filename>
            <type>text/plain</type>
            <size>27881</size>
            <attacher name="Dmitry Titov">dimich</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
NjdjM2U4MS4uMGE1MGQ2MSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNyBAQAorMjAwOS0wMy0xOSAgRG1pdHJ5IFRpdG92
ICA8ZGltaWNoQGNocm9taXVtLm9yZz4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MjQ2ODkKKyAgICAgICAgQWRkICh1cHN0cmVhbSkgVjggYmluZGlu
Z3MgZm9yIFdvcmtlcnMuIE1vc3RseSBzdHlsZSBjbGVhbmluZy4KKyAgICAgICAgCisgICAgICAg
ICogYmluZGluZ3MvdjgvV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5LmNwcDogQWRkZWQuCisg
ICAgICAgICogYmluZGluZ3MvdjgvV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5Lmg6IEFkZGVk
LgorICAgICAgICAqIGJpbmRpbmdzL3Y4L1dvcmtlclNjcmlwdENvbnRyb2xsZXIuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKiBiaW5kaW5ncy92OC9Xb3JrZXJTY3JpcHRDb250cm9sbGVyLmg6IEFkZGVk
LgorICAgICAgICAqIGJpbmRpbmdzL3Y4L1Y4SW5kZXguaDogQWRkZWQuIFRoaXMgaXMganVzdCBh
IHdyYXBwZXIgZm9yIHY4X2luZGV4LmgsIGxpa2UgVjhQcm94eS5oCisgICAgICAgICogYmluZGlu
Z3MvdjgvVjhQcm94eS5oOiBBZGRlZCBkb21PYmplY3RNYXAoKSBmdW5jdGlvbiB0aGF0IHdyYXBz
IEdldERPTU9iamVjdE1hcCgpLgorICAgICAgICAqIGJpbmRpbmdzL3Y4L1Y4V29ya2VyQ29udGV4
dEV2ZW50TGlzdGVuZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6VjhXb3JrZXJDb250ZXh0RXZl
bnRMaXN0ZW5lcjo6Y2FsbExpc3RlbmVyRnVuY3Rpb24pOiBUcmFja0V2ZW50KCkgcmVuYW1lZCB0
cmFja0V2ZW50KCkKKwogMjAwOS0wMy0xOSAgSmVyZW15IE1vc2tvdmljaCAgPGplcmVteUBjaHJv
bWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGltaXRyaSBHbGF6a292LgpkaWZmIC0t
Z2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9WOEluZGV4LmggYi9XZWJDb3JlL2JpbmRpbmdzL3Y4
L1Y4SW5kZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2FlNzhmCi0t
LSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9WOEluZGV4LmgKQEAgLTAsMCAr
MSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoK
KyAqIAorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIK
KyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2Yg
R29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUg
dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICog
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBB
TkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlS
SUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisKKyNpZm5kZWYgVjhJbmRleF9oCisjZGVmaW5lIFY4SW5kZXhfaAorCisvLyBGSVhN
RTogVGhpcyBpcyBhIHRlbXBvcmFyeSBmb3J3YXJkaW5nIGhlYWRlciB1bnRpbCBhbGwgYmluZGlu
Z3MgaGF2ZSBtaWdyYXRlZAorLy8gb3ZlciBhbmQgdjhfaW5kZXggYWN0dWFsbHkgYmVjb21lcyBW
OEluZGV4LgorI2luY2x1ZGUgInY4X2luZGV4LmgiCisKKyNlbmRpZiAvLyBWOEluZGV4X2gKZGlm
ZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvVjhQcm94eS5oIGIvV2ViQ29yZS9iaW5kaW5n
cy92OC9WOFByb3h5LmgKaW5kZXggZWEyYjU4Mi4uYzIxZTBkZCAxMDA2NDQKLS0tIGEvV2ViQ29y
ZS9iaW5kaW5ncy92OC9WOFByb3h5LmgKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9WOFByb3h5
LmgKQEAgLTQ5LDYgKzQ5LDEyIEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICAgICAgcmV0dXJu
IHY4OjpMb2NhbDx2ODo6Qm9vbGVhbj4oKTsKICAgICB9CiAKKyAgICAvLyBGSVhNRTogUmVtb3Zl
IG9uY2UgbWlncmF0aW9uIGlzIGNvbXBsZXRlLgorICAgIGlubGluZSBzdGF0aWMgRE9NV3JhcHBl
ck1hcDx2b2lkPiYgZG9tT2JqZWN0TWFwKCkKKyAgICB7CisgICAgICAgIHJldHVybiBHZXRET01P
YmplY3RNYXAoKTsKKyAgICB9CisKICAgICBpbmxpbmUgdjg6OkhhbmRsZTx2ODo6UHJpbWl0aXZl
PiB0aHJvd0Vycm9yKGNvbnN0IGNoYXIqIG1lc3NhZ2UsIFY4UHJveHk6OkVycm9yVHlwZSB0eXBl
ID0gVjhQcm94eTo6VFlQRV9FUlJPUikKICAgICB7CiAgICAgICAgIFY4UHJveHk6OlRocm93RXJy
b3IodHlwZSwgbWVzc2FnZSk7CmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4V29y
a2VyQ29udGV4dEV2ZW50TGlzdGVuZXIuY3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9WOFdvcmtl
ckNvbnRleHRFdmVudExpc3RlbmVyLmNwcAppbmRleCA3ZDhkOTI0Li5iYTdhMmMwIDEwMDY0NAot
LS0gYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXIuY3Bw
CisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvVjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5lci5j
cHAKQEAgLTg4LDcgKzg4LDcgQEAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gVjhXb3JrZXJDb250ZXh0
RXZlbnRMaXN0ZW5lcjo6Y2FsbExpc3RlbmVyRnVuY3Rpb24odjg6OkhhbmQKICAgICB2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gcGFyYW1ldGVyc1sxXSA9IHsganNFdmVudCB9OwogICAgIHY4OjpMb2Nh
bDx2ODo6VmFsdWU+IHJlc3VsdCA9IGhhbmRsZXJGdW5jdGlvbi0+Q2FsbChyZWNlaXZlciwgMSwg
cGFyYW1ldGVycyk7CiAKLSAgICBtX3Byb3h5LT5UcmFja0V2ZW50KGV2ZW50KTsKKyAgICBtX3By
b3h5LT50cmFja0V2ZW50KGV2ZW50KTsKIAogICAgIHJldHVybiByZXN1bHQ7CiB9CmRpZmYgLS1n
aXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L1dvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eS5jcHAg
Yi9XZWJDb3JlL2JpbmRpbmdzL3Y4L1dvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eS5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ4MDJiOAotLS0gL2Rldi9udWxsCisr
KyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5LmNwcApA
QCAtMCwwICsxLDM1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBHb29nbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQor
ICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmln
aHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBu
YW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMg
bWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQor
ICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9M
REVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhF
IENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwK
KyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaWYgRU5BQkxFKFdPUktF
UlMpCisKKyNpbmNsdWRlICJXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkuaCIKKworI2luY2x1
ZGUgIlY4QmluZGluZy5oIgorI2luY2x1ZGUgIlY4UHJveHkuaCIKKyNpbmNsdWRlICJFdmVudC5o
IgorI2luY2x1ZGUgIlY4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXIuaCIKKyNpbmNsdWRlICJX
b3JrZXJDb250ZXh0LmgiCisjaW5jbHVkZSAiV29ya2VyTG9jYXRpb24uaCIKKyNpbmNsdWRlICJX
b3JrZXJOYXZpZ2F0b3IuaCIKKyNpbmNsdWRlICJXb3JrZXJTY3JpcHRDb250cm9sbGVyLmgiCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIGJvb2wgaXNXb3JrZXJzRW5hYmxlZCA9IGZh
bHNlOworCitib29sIFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6aXNXZWJXb3JrZXJzRW5h
YmxlZCgpCit7CisgICAgcmV0dXJuIGlzV29ya2Vyc0VuYWJsZWQ7Cit9CisKK3ZvaWQgV29ya2Vy
Q29udGV4dEV4ZWN1dGlvblByb3h5OjpzZXRJc1dlYldvcmtlcnNFbmFibGVkKGJvb2wgdmFsdWUp
Cit7CisgICAgaXNXb3JrZXJzRW5hYmxlZCA9IHZhbHVlOworfQorCitXb3JrZXJDb250ZXh0RXhl
Y3V0aW9uUHJveHk6OldvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eShXb3JrZXJDb250ZXh0KiB3
b3JrZXJDb250ZXh0KQorICAgIDogbV93b3JrZXJDb250ZXh0KHdvcmtlckNvbnRleHQpCisgICAg
LCBtX3JlY3Vyc2lvbigwKQoreworfQorCitXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6On5X
b3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkoKQoreworICAgIGRpc3Bvc2UoKTsKK30KKwordm9p
ZCBXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6OmRpc3Bvc2UoKQoreworICAgIC8vIERpc2Nv
bm5lY3QgYWxsIGV2ZW50IGxpc3RlbmVycy4KKyAgICBmb3IgKHNpemVfdCBsaXN0ZW5lckluZGV4
ID0gMDsgbGlzdGVuZXJJbmRleCA8IG1fbGlzdGVuZXJzLnNpemUoKTsgKytsaXN0ZW5lckluZGV4
KQorICAgICAgIG1fbGlzdGVuZXJzW2xpc3RlbmVySW5kZXhdLT5kaXNjb25uZWN0KCk7CisKKyAg
ICBtX2xpc3RlbmVycy5jbGVhcigpOworCisgICAgLy8gRGV0YWNoIGFsbCBldmVudHMgZnJvbSB0
aGVpciBKUyB3cmFwcGVycy4KKyAgICBmb3IgKHNpemVfdCBldmVudEluZGV4ID0gMDsgZXZlbnRJ
bmRleCA8IG1fZXZlbnRzLnNpemUoKTsgKytldmVudEluZGV4KSB7CisgICAgICAgIEV2ZW50KiBl
dmVudCA9IG1fZXZlbnRzW2V2ZW50SW5kZXhdOworICAgICAgICBpZiAoZm9yZ2V0VjhFdmVudE9i
amVjdChldmVudCkpCisgICAgICAgICAgZXZlbnQtPmRlcmVmKCk7CisgICAgfQorICAgIG1fZXZl
bnRzLmNsZWFyKCk7CisKKyAgICAvLyBEaXNwb3NlIHRoZSBjb250ZXh0LgorICAgIGlmICghbV9j
b250ZXh0LklzRW1wdHkoKSkgeworICAgICAgICBtX2NvbnRleHQuRGlzcG9zZSgpOworICAgICAg
ICBtX2NvbnRleHQuQ2xlYXIoKTsKKyAgICB9CisKKyAgICAvLyBSZW1vdmUgdGhlIHdyYXBwaW5n
IGJldHdlZW4gSlMgb2JqZWN0IGFuZCBET00gb2JqZWN0LiBUaGlzIGlzIGJlY2F1c2UKKyAgICAv
LyB0aGUgd29ya2VyIGNvbnRleHQgb2JqZWN0IGlzIGdvaW5nIHRvIGJlIGRpc3Bvc2VkIGltbWVk
aWF0ZWx5IHdoZW4gYQorICAgIC8vIHdvcmtlciB0aHJlYWQgaXMgdGVhcmluZyBkb3duLiBXZSBk
byBub3Qgd2FudCB0byByZS1kZWxldGUgdGhlIHJlYWwgb2JqZWN0CisgICAgLy8gd2hlbiBKUyBv
YmplY3QgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgICAgdjg6OkxvY2tlciBsb2NrZXI7CisgICAg
djg6OkhhbmRsZVNjb3BlIHNjb3BlOworICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IHdy
YXBwZXIgPSBkb21PYmplY3RNYXAoKS5nZXQobV93b3JrZXJDb250ZXh0KTsKKyAgICBpZiAoIXdy
YXBwZXIuSXNFbXB0eSgpKQorICAgICAgICBWOFByb3h5OjpTZXRET01XcmFwcGVyKHdyYXBwZXIs
IFY4Q2xhc3NJbmRleDo6SU5WQUxJRF9DTEFTU19JTkRFWCwgTlVMTCk7CisgICAgZG9tT2JqZWN0
TWFwKCkuZm9yZ2V0KG1fd29ya2VyQ29udGV4dCk7Cit9CisKK1dvcmtlckNvbnRleHRFeGVjdXRp
b25Qcm94eSogV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5OjpyZXRyaWV2ZSgpCit7CisgICAg
djg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IHY4OjpDb250ZXh0OjpHZXRDdXJyZW50
KCk7CisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBnbG9iYWwgPSBjb250ZXh0LT5HbG9iYWwo
KTsKKyAgICBnbG9iYWwgPSBWOFByb3h5OjpMb29rdXBET01XcmFwcGVyKFY4Q2xhc3NJbmRleDo6
V09SS0VSQ09OVEVYVCwgZ2xvYmFsKTsKKyAgICBBU1NFUlQoIWdsb2JhbC5Jc0VtcHR5KCkpOwor
ICAgIFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRleHQgPSBWOFByb3h5OjpUb05hdGl2ZU9iamVj
dDxXb3JrZXJDb250ZXh0PihWOENsYXNzSW5kZXg6OldPUktFUkNPTlRFWFQsIGdsb2JhbCk7Cisg
ICAgcmV0dXJuIHdvcmtlckNvbnRleHQtPnNjcmlwdCgpLT5wcm94eSgpOworfQorCit2b2lkIFdv
cmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6aW5pdENvbnRleHRJZk5lZWRlZCgpCit7CisgICAg
Ly8gQmFpbCBvdXQgaWYgdGhlIGNvbnRleHQgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZC4K
KyAgICBpZiAoIW1fY29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8v
IENyZWF0ZSBhIG5ldyBlbnZpcm9ubWVudAorICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3RU
ZW1wbGF0ZT4gZ2xvYmFsVGVtcGxhdGU7CisgICAgbV9jb250ZXh0ID0gdjg6OkNvbnRleHQ6Ok5l
dyhOVUxMLCBnbG9iYWxUZW1wbGF0ZSk7CisKKyAgICAvLyBTdGFydGluZyBmcm9tIG5vdywgdXNl
IGxvY2FsIGNvbnRleHQgb25seS4KKyAgICB2ODo6TG9jYWw8djg6OkNvbnRleHQ+IGNvbnRleHQg
PSB2ODo6TG9jYWw8djg6OkNvbnRleHQ+OjpOZXcobV9jb250ZXh0KTsKKyAgICB2ODo6Q29udGV4
dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisKKyAgICAvLyBBbGxvY2F0ZSBzdHJpbmdzIHVzZWQg
ZHVyaW5nIGluaXRpYWxpemF0aW9uLgorICAgIHY4OjpIYW5kbGU8djg6OlN0cmluZz4gaW1wbGlj
aXRQcm90b1N0cmluZyA9IHY4OjpTdHJpbmc6Ok5ldygiX19wcm90b19fIik7CisKKyAgICAvLyBD
cmVhdGUgYSBuZXcgSlMgb2JqZWN0IGFuZCB1c2UgaXQgYXMgdGhlIHByb3RvdHlwZSBmb3IgdGhl
IHNoYWRvdyBnbG9iYWwgb2JqZWN0LgorICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiB3b3Jr
ZXJDb250ZXh0Q29uc3RydWN0b3IgPSBHZXRDb25zdHJ1Y3RvcihWOENsYXNzSW5kZXg6OldPUktF
UkNPTlRFWFQpOworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBqc1dvcmtlckNvbnRleHQgPSBT
YWZlQWxsb2NhdGlvbjo6TmV3SW5zdGFuY2Uod29ya2VyQ29udGV4dENvbnN0cnVjdG9yKTsKKyAg
ICAvLyBCYWlsIG91dCBpZiBhbGxvY2F0aW9uIGZhaWxlZC4KKyAgICBpZiAoanNXb3JrZXJDb250
ZXh0LklzRW1wdHkoKSkgeworICAgICAgICBkaXNwb3NlKCk7CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisKKyAgICAvLyBXcmFwIHRoZSBvYmplY3QuCisgICAgVjhQcm94eTo6U2V0RE9NV3JhcHBl
cihqc1dvcmtlckNvbnRleHQsIFY4Q2xhc3NJbmRleDo6VG9JbnQoVjhDbGFzc0luZGV4OjpXT1JL
RVJDT05URVhUKSwgbV93b3JrZXJDb250ZXh0KTsKKworICAgIFY4UHJveHk6OlNldEpTV3JhcHBl
ckZvckRPTU9iamVjdChtX3dvcmtlckNvbnRleHQsIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+
OjpOZXcoanNXb3JrZXJDb250ZXh0KSk7CisKKyAgICAvLyBJbnNlcnQgdGhlIG9iamVjdCBpbnN0
YW5jZSBhcyB0aGUgcHJvdG90eXBlIG9mIHRoZSBzaGFkb3cgb2JqZWN0LgorICAgIHY4OjpIYW5k
bGU8djg6Ok9iamVjdD4gZ2xvYmFsT2JqZWN0ID0gbV9jb250ZXh0LT5HbG9iYWwoKTsKKyAgICBn
bG9iYWxPYmplY3QtPlNldChpbXBsaWNpdFByb3RvU3RyaW5nLCBqc1dvcmtlckNvbnRleHQpOwor
fQorCit2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6
OkdldENvbnN0cnVjdG9yKFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlKQoreworICAg
IC8vIEVudGVyIHRoZSBjb250ZXh0IG9mIHRoZSBwcm94eSB0byBtYWtlIHN1cmUgdGhhdCB0aGUg
ZnVuY3Rpb24gaXMKKyAgICAvLyBjb25zdHJ1Y3RlZCBpbiB0aGUgY29udGV4dCBjb3JyZXNwb25k
aW5nIHRvIHRoaXMgcHJveHkuCisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKG1fY29udGV4
dCk7CisgICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gZnVuY3Rpb25UZW1wbGF0
ZSA9IFY4UHJveHk6OkdldFRlbXBsYXRlKHR5cGUpOworCisgICAgLy8gR2V0dGluZyB0aGUgZnVu
Y3Rpb24gbWlnaHQgZmFpbCBpZiB3ZSdyZSBydW5uaW5nIG91dCBvZiBzdGFjayBvciBtZW1vcnku
CisgICAgdjg6OlRyeUNhdGNoIHRyeUNhdGNoOworICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+
IHZhbHVlID0gZnVuY3Rpb25UZW1wbGF0ZS0+R2V0RnVuY3Rpb24oKTsKKyAgICBpZiAodmFsdWUu
SXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4oKTsKKwor
ICAgIHJldHVybiB2YWx1ZTsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFdvcmtlckNvbnRl
eHRFeGVjdXRpb25Qcm94eTo6VG9WOE9iamVjdChWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUg
dHlwZSwgdm9pZCogaW1wbCkKK3sKKyAgICBpZiAoIWltcGwpCisgICAgICAgIHJldHVybiB2ODo6
TnVsbCgpOworCisgICAgaWYgKHR5cGUgPT0gVjhDbGFzc0luZGV4OjpXT1JLRVJDT05URVhUKQor
ICAgICAgICByZXR1cm4gV29ya2VyQ29udGV4dFRvVjhPYmplY3Qoc3RhdGljX2Nhc3Q8V29ya2Vy
Q29udGV4dCo+KGltcGwpKTsKKworICAgIC8vIE5vbiBET00gbm9kZQorICAgIHY4OjpQZXJzaXN0
ZW50PHY4OjpPYmplY3Q+IHJlc3VsdCA9IGRvbU9iamVjdE1hcCgpLmdldChpbXBsKTsKKyAgICBp
ZiAocmVzdWx0LklzRW1wdHkoKSkgeworICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gb2Jq
ZWN0ID0gdG9WOCh0eXBlLCB0eXBlLCBpbXBsKTsKKyAgICAgICAgaWYgKCFvYmplY3QuSXNFbXB0
eSgpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgVjhD
bGFzc0luZGV4OjpXT1JLRVJMT0NBVElPTjoKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxX
b3JrZXJMb2NhdGlvbio+KGltcGwpLT5yZWYoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgIGNhc2UgVjhDbGFzc0luZGV4OjpXT1JLRVJOQVZJR0FUT1I6CisgICAgICAgICAg
ICAgICAgc3RhdGljX2Nhc3Q8V29ya2VyTmF2aWdhdG9yKj4oaW1wbCktPnJlZigpOworICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBB
U1NFUlQoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0ID0gdjg6OlBl
cnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhvYmplY3QpOworICAgICAgICAgICAgVjhQcm94eTo6
U2V0SlNXcmFwcGVyRm9yRE9NT2JqZWN0KGltcGwsIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9
CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFdvcmtlckNv
bnRleHRFeGVjdXRpb25Qcm94eTo6RXZlbnRUb1Y4T2JqZWN0KEV2ZW50KiBldmVudCkKK3sKKyAg
ICBpZiAoIWV2ZW50KQorICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKKworICAgIHY4OjpIYW5k
bGU8djg6Ok9iamVjdD4gd3JhcHBlciA9IGRvbU9iamVjdE1hcCgpLmdldChldmVudCk7CisgICAg
aWYgKCF3cmFwcGVyLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisKKyAgICBW
OENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgdHlwZSA9IFY4Q2xhc3NJbmRleDo6RVZFTlQ7CisK
KyAgICBpZiAoZXZlbnQtPmlzTWVzc2FnZUV2ZW50KCkpCisgICAgICAgIHR5cGUgPSBWOENsYXNz
SW5kZXg6Ok1FU1NBR0VFVkVOVDsKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gcmVzdWx0
ID0gdG9WOCh0eXBlLCBWOENsYXNzSW5kZXg6OkVWRU5ULCBldmVudCk7CisgICAgaWYgKHJlc3Vs
dC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgLy8gSW5zdGFudGlhdGlvbiBmYWlsZWQuIEF2b2lkIHVw
ZGF0aW5nIHRoZSBET00gb2JqZWN0IG1hcCBhbmQgcmV0dXJuIG51bGwgd2hpY2gKKyAgICAgICAg
Ly8gaXMgYWxyZWFkeSBoYW5kbGVkIGJ5IGNhbGxlcnMgb2YgdGhpcyBmdW5jdGlvbiBpbiBjYXNl
IHRoZSBldmVudCBpcyBOVUxMLgorICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKKyAgICB9CisK
KyAgICBldmVudC0+cmVmKCk7ICAvLyBmYXN0IHJlZgorICAgIFY4UHJveHk6OlNldEpTV3JhcHBl
ckZvckRPTU9iamVjdChldmVudCwgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5ldyhyZXN1
bHQpKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEEgSlMgb2JqZWN0IG9mIHR5cGUg
RXZlbnRUYXJnZXQgaW4gdGhlIHdvcmtlciBjb250ZXh0IGNhbiBvbmx5IGJlIFdvcmtlckNvbnRl
eHQuCit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5OjpF
dmVudFRhcmdldFRvVjhPYmplY3QoRXZlbnRUYXJnZXQqIHRhcmdldCkKK3sKKyAgICBpZiAoIXRh
cmdldCkKKyAgICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7CisKKyAgICBXb3JrZXJDb250ZXh0KiB3
b3JrZXJDb250ZXh0ID0gdGFyZ2V0LT50b1dvcmtlckNvbnRleHQoKTsKKyAgICBpZiAod29ya2Vy
Q29udGV4dCkKKyAgICAgICAgcmV0dXJuIFdvcmtlckNvbnRleHRUb1Y4T2JqZWN0KHdvcmtlckNv
bnRleHQpOworCisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIHY4OjpIYW5k
bGU8djg6OlZhbHVlPigpOworfQorCit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gV29ya2VyQ29udGV4
dEV4ZWN1dGlvblByb3h5OjpXb3JrZXJDb250ZXh0VG9WOE9iamVjdChXb3JrZXJDb250ZXh0KiB3
b3JrZXJDb250ZXh0KQoreworICAgIGlmICghd29ya2VyQ29udGV4dCkKKyAgICAgICAgcmV0dXJu
IHY4OjpOdWxsKCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gd29y
a2VyQ29udGV4dC0+c2NyaXB0KCktPnByb3h5KCktPkdldENvbnRleHQoKTsKKworICAgIHY4OjpI
YW5kbGU8djg6Ok9iamVjdD4gZ2xvYmFsID0gY29udGV4dC0+R2xvYmFsKCk7CisgICAgQVNTRVJU
KCFnbG9iYWwuSXNFbXB0eSgpKTsKKyAgICByZXR1cm4gZ2xvYmFsOworfQorCit2ODo6TG9jYWw8
djg6Ok9iamVjdD4gV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5Ojp0b1Y4KFY4Q2xhc3NJbmRl
eDo6VjhXcmFwcGVyVHlwZSBkZXNjVHlwZSwgVjhDbGFzc0luZGV4OjpWOFdyYXBwZXJUeXBlIGNw
dHJUeXBlLCB2b2lkKiBpbXBsKQoreworICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+IGZ1bmN0
aW9uOworICAgIFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eSogcHJveHkgPSByZXRyaWV2ZSgp
OworICAgIGlmIChwcm94eSkKKyAgICAgICAgZnVuY3Rpb24gPSBwcm94eS0+R2V0Q29uc3RydWN0
b3IoZGVzY1R5cGUpOworICAgIGVsc2UKKyAgICAgICAgZnVuY3Rpb24gPSBWOFByb3h5OjpHZXRU
ZW1wbGF0ZShkZXNjVHlwZSktPkdldEZ1bmN0aW9uKCk7CisKKyAgICB2ODo6TG9jYWw8djg6Ok9i
amVjdD4gaW5zdGFuY2UgPSBTYWZlQWxsb2NhdGlvbjo6TmV3SW5zdGFuY2UoZnVuY3Rpb24pOwor
ICAgIGlmICghaW5zdGFuY2UuSXNFbXB0eSgpKSB7CisgICAgICAgIC8vIEF2b2lkIHNldHRpbmcg
dGhlIERPTSB3cmFwcGVyIGZvciBmYWlsZWQgYWxsb2NhdGlvbnMuCisgICAgICAgIFY4UHJveHk6
OlNldERPTVdyYXBwZXIoaW5zdGFuY2UsIFY4Q2xhc3NJbmRleDo6VG9JbnQoY3B0clR5cGUpLCBp
bXBsKTsKKyAgICB9CisgICAgcmV0dXJuIGluc3RhbmNlOworfQorCitib29sIFdvcmtlckNvbnRl
eHRFeGVjdXRpb25Qcm94eTo6Zm9yZ2V0VjhFdmVudE9iamVjdChFdmVudCogZXZlbnQpCit7Cisg
ICAgaWYgKGRvbU9iamVjdE1hcCgpLmNvbnRhaW5zKGV2ZW50KSkgeworICAgICAgICBkb21PYmpl
Y3RNYXAoKS5mb3JnZXQoZXZlbnQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworfQorCit2ODo6TG9jYWw8djg6OlZhbHVlPiBXb3JrZXJD
b250ZXh0RXhlY3V0aW9uUHJveHk6OmV2YWx1YXRlKGNvbnN0IFN0cmluZyYgc2NyaXB0LCBjb25z
dCBTdHJpbmcmIGZpbGVOYW1lLCBpbnQgYmFzZUxpbmUpCit7CisgICAgdjg6OkxvY2tlciBsb2Nr
ZXI7CisgICAgdjg6OkhhbmRsZVNjb3BlIGhzOworCisgICAgaW5pdENvbnRleHRJZk5lZWRlZCgp
OworICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShtX2NvbnRleHQpOworCisgICAgdjg6Okxv
Y2FsPHY4OjpTdHJpbmc+IHNjcmlwdFN0cmluZyA9IHY4RXh0ZXJuYWxTdHJpbmcoc2NyaXB0KTsK
KyAgICB2ODo6SGFuZGxlPHY4OjpTY3JpcHQ+IGNvbXBpbGVkU2NyaXB0ID0gVjhQcm94eTo6Q29t
cGlsZVNjcmlwdChzY3JpcHRTdHJpbmcsIGZpbGVOYW1lLCBiYXNlTGluZSk7CisgICAgcmV0dXJu
IHJ1blNjcmlwdChjb21waWxlZFNjcmlwdCk7Cit9CisKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IFdv
cmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6cnVuU2NyaXB0KHY4OjpIYW5kbGU8djg6OlNjcmlw
dD4gc2NyaXB0KQoreworICAgIGlmIChzY3JpcHQuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4g
djg6OkxvY2FsPHY4OjpWYWx1ZT4oKTsKKworICAgIC8vIENvbXB1dGUgdGhlIHNvdXJjZSBzdHJp
bmcgYW5kIHByZXZlbnQgYWdhaW5zdCBpbmZpbml0ZSByZWN1cnNpb24uCisgICAgaWYgKG1fcmVj
dXJzaW9uID49IGtNYXhSZWN1cnNpb25EZXB0aCkgeworICAgICAgICB2ODo6TG9jYWw8djg6OlN0
cmluZz4gY29kZSA9IHY4RXh0ZXJuYWxTdHJpbmcoInRocm93IFJhbmdlRXJyb3IoJ1JlY3Vyc2lv
biB0b28gZGVlcCcpIik7CisgICAgICAgIHNjcmlwdCA9IFY4UHJveHk6OkNvbXBpbGVTY3JpcHQo
Y29kZSwgIiIsIDApOworICAgIH0KKworICAgIGlmIChWOFByb3h5OjpIYW5kbGVPdXRPZk1lbW9y
eSgpKQorICAgICAgICBBU1NFUlQoc2NyaXB0LklzRW1wdHkoKSk7CisKKyAgICBpZiAoc2NyaXB0
LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7CisKKyAg
ICAvLyBSdW4gdGhlIHNjcmlwdCBhbmQga2VlcCB0cmFjayBvZiB0aGUgY3VycmVudCByZWN1cnNp
b24gZGVwdGguCisgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcmVzdWx0OworICAgIHsKKyAgICAg
ICAgbV9yZWN1cnNpb24rKzsKKyAgICAgICAgcmVzdWx0ID0gc2NyaXB0LT5SdW4oKTsKKyAgICAg
ICAgbV9yZWN1cnNpb24tLTsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgVjggaW50ZXJuYWwgZXJy
b3Igc2l0dWF0aW9uIChPdXQtb2YtbWVtb3J5KS4KKyAgICBpZiAocmVzdWx0LklzRW1wdHkoKSkK
KyAgICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7CisKKyAgICByZXR1cm4gcmVz
dWx0OworfQorCitQYXNzUmVmUHRyPFY4RXZlbnRMaXN0ZW5lcj4gV29ya2VyQ29udGV4dEV4ZWN1
dGlvblByb3h5OjpGaW5kT3JDcmVhdGVFdmVudExpc3RlbmVyKHY4OjpMb2NhbDx2ODo6VmFsdWU+
IG9iamVjdCwgYm9vbCBpc0lubGluZSwgYm9vbCBmaW5kT25seSkKK3sKKyAgICBpZiAoIW9iamVj
dC0+SXNPYmplY3QoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKHNpemVfdCBpbmRl
eCA9IDsgaW5kZXggPCBtX2xpc3RlbmVycy5zaXplKCk7ICsraW5kZXgpIHsKKyAgICAgICAgVjhF
dmVudExpc3RlbmVyKiBlbCA9IG1fbGlzdGVuZXJzW2luZGV4XTsKKyAgICAgICAgaWYgKGVsLT5p
c0lubGluZSgpID09IGlzSW5saW5lICYmIGVsLT5nZXRMaXN0ZW5lck9iamVjdCgpID09IG9iamVj
dCkKKyAgICAgICAgICAgIHJldHVybiBlbDsKKyAgICB9CisgICAgaWYgKGZpbmRPbmx5KQorICAg
ICAgICByZXR1cm4gTlVMTDsKKworICAgIC8vIENyZWF0ZSBhIG5ldyBvbmUsIGFuZCBhZGQgdG8g
Y2FjaGUuCisgICAgUmVmUHRyPFY4RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBWOFdvcmtlckNv
bnRleHRFdmVudExpc3RlbmVyOjpjcmVhdGUodGhpcywgdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpD
YXN0KG9iamVjdCksIGlzSW5saW5lKTsKKyAgICBtX2xpc3RlbmVycy5hcHBlbmQobGlzdGVuZXIu
Z2V0KCkpOworCisgICAgcmV0dXJuIGxpc3RlbmVyLnJlbGVhc2UoKTsKK30KKwordm9pZCBXb3Jr
ZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6OlJlbW92ZUV2ZW50TGlzdGVuZXIoVjhFdmVudExpc3Rl
bmVyKiBsaXN0ZW5lcikKK3sKKyAgICBmb3IgKHNpemVfdCBpbmRleCA9IDsgaW5kZXggPCBtX2xp
c3RlbmVycy5zaXplKCk7ICsraW5kZXgpIHsKKyAgICAgICAgaWYgKG1fbGlzdGVuZXJzW2luZGV4
XSA9PSBsaXN0ZW5lcikgeworICAgICAgICAgICAgbV9saXN0ZW5lcnMucmVtb3ZlKGluZGV4KTsK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBXb3JrZXJD
b250ZXh0RXhlY3V0aW9uUHJveHk6OnRyYWNrRXZlbnQoRXZlbnQqIGV2ZW50KQoreworICAgIG1f
ZXZlbnRzLmFwcGVuZChldmVudCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2Vu
ZGlmIC8vIEVOQUJMRShXT1JLRVJTKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9X
b3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkuaCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvV29ya2Vy
Q29udGV4dEV4ZWN1dGlvblByb3h5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MC4uMzAyMzY2NgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvV29ya2Vy
Q29udGV4dEV4ZWN1dGlvblByb3h5LmgKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9u
LgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVz
IG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90
ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZp
YyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElT
IiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICog
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisKKyNpZm5kZWYgV29ya2Vy
Q29udGV4dEV4ZWN1dGlvblByb3h5X2gKKyNkZWZpbmUgV29ya2VyQ29udGV4dEV4ZWN1dGlvblBy
b3h5X2gKKworI2lmIEVOQUJMRShXT1JLRVJTKQorCisjaW5jbHVkZSA8djguaD4KKyNpbmNsdWRl
ICJWOEluZGV4LmgiCisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKKyAgICBjbGFzcyBFdmVudDsKKyAgICBjbGFzcyBFdmVudFRhcmdldDsKKyAgICBjbGFz
cyBWOEV2ZW50TGlzdGVuZXI7CisgICAgY2xhc3MgVjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5l
cjsKKyAgICBjbGFzcyBXb3JrZXJDb250ZXh0OworCisgICAgY2xhc3MgV29ya2VyQ29udGV4dEV4
ZWN1dGlvblByb3h5IHsKKyAgICBwdWJsaWM6CisgICAgICAgIFdvcmtlckNvbnRleHRFeGVjdXRp
b25Qcm94eShXb3JrZXJDb250ZXh0Kik7CisgICAgICAgIH5Xb3JrZXJDb250ZXh0RXhlY3V0aW9u
UHJveHkoKTsKKworICAgICAgICAvLyBGSVhNRTogZm9sbG93aW5nIGZ1bmN0aW9uIHNzaG91bGQg
aGF2ZSBjYW1lbENhc2VkIG5hbWVzIG9uY2UgVjggY29kZS1nZW5lcmF0aW5nIHNjcmlwdCBpcyBt
aWdyYXRlZC4KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpDb250ZXh0PiBHZXRDb250ZXh0KCkgeyBy
ZXR1cm4gdjg6OkxvY2FsPHY4OjpDb250ZXh0Pjo6TmV3KG1fY29udGV4dCk7IH0KKyAgICAgICAg
djg6OkxvY2FsPHY4OjpGdW5jdGlvbj4gR2V0Q29uc3RydWN0b3IoVjhDbGFzc0luZGV4OjpWOFdy
YXBwZXJUeXBlKTsKKyAgICAgICAgUGFzc1JlZlB0cjxWOEV2ZW50TGlzdGVuZXI+IEZpbmRPckNy
ZWF0ZUV2ZW50TGlzdGVuZXIodjg6OkxvY2FsPHY4OjpWYWx1ZT4gbGlzdGVuZXIsIGJvb2wgaXNJ
bmxpbmUsIGJvb2wgZmluZE9ubHkpOworICAgICAgICB2b2lkIFJlbW92ZUV2ZW50TGlzdGVuZXIo
VjhFdmVudExpc3RlbmVyKik7CisKKyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVl
PiBUb1Y4T2JqZWN0KFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSB0eXBlLCB2b2lkKiBpbXBs
KTsKKyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBFdmVudFRvVjhPYmplY3Qo
RXZlbnQqIGV2ZW50KTsKKyAgICAgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBFdmVu
dFRhcmdldFRvVjhPYmplY3QoRXZlbnRUYXJnZXQqIHRhcmdldCk7CisgICAgICAgIHN0YXRpYyB2
ODo6SGFuZGxlPHY4OjpWYWx1ZT4gV29ya2VyQ29udGV4dFRvVjhPYmplY3QoV29ya2VyQ29udGV4
dCogd2MpOworCisgICAgICAgIC8vIFRyYWNrIHRoZSBldmVudCBzbyB0aGF0IHdlIGNhbiBkZXRh
Y2ggaXQgZnJvbSB0aGUgSlMgd3JhcHBlciB3aGVuIGEgd29ya2VyCisgICAgICAgIC8vIHRlcm1p
bmF0ZXMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd2UgbmVlZCB0byBiZSBhYmxlIHRvIGRpc3Bv
c2UgdGhlc2UKKyAgICAgICAgLy8gZXZlbnRzIGFuZCByZWxlYXNlcyByZWZlcmVuY2VzIHRvIHRo
ZWlyIGV2ZW50IHRhcmdldHM6IFdvcmtlckNvbnRleHQuCisgICAgICAgIHZvaWQgdHJhY2tFdmVu
dChFdmVudCopOworCisgICAgICAgIC8vIEV2YWx1YXRlIGEgc2NyaXB0IGZpbGUgaW4gdGhlIGN1
cnJlbnQgZXhlY3V0aW9uIGVudmlyb25tZW50LgorICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVl
PiBldmFsdWF0ZShjb25zdCBTdHJpbmcmIHNjcmlwdCwgY29uc3QgU3RyaW5nJiBmaWxlTmFtZSwg
aW50IGJhc2VMaW5lKTsKKworICAgICAgICAvLyBSZXR1cm5zIFdvcmtlckNvbnRleHQgb2JqZWN0
LgorICAgICAgICBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0KCkgeyByZXR1cm4gbV93b3Jr
ZXJDb250ZXh0OyB9CisKKyAgICAgICAgLy8gUmV0dXJucyBXb3JrZXJDb250ZXh0RXhlY3V0aW9u
UHJveHkgb2JqZWN0IG9mIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGNvbnRleHQuCisgICAgICAg
IHN0YXRpYyBXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkqIHJldHJpZXZlKCk7CisKKyAgICAg
ICAgLy8gRW5hYmxlcyBIVE1MNSB3b3JrZXIgc3VwcG9ydC4KKyAgICAgICAgc3RhdGljIGJvb2wg
aXNXZWJXb3JrZXJzRW5hYmxlZCgpOworICAgICAgICBzdGF0aWMgdm9pZCBzZXRJc1dlYldvcmtl
cnNFbmFibGVkKGJvb2wpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBpbml0Q29udGV4
dElmTmVlZGVkKCk7CisgICAgICAgIHZvaWQgZGlzcG9zZSgpOworCisgICAgICAgIC8vIFJ1biBh
biBhbHJlYWR5IGNvbXBpbGVkIHNjcmlwdC4KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4g
cnVuU2NyaXB0KHY4OjpIYW5kbGU8djg6OlNjcmlwdD4pOworCisgICAgICAgIHN0YXRpYyB2ODo6
TG9jYWw8djg6Ok9iamVjdD4gdG9WOChWOENsYXNzSW5kZXg6OlY4V3JhcHBlclR5cGUgZGVzY1R5
cGUsIFY4Q2xhc3NJbmRleDo6VjhXcmFwcGVyVHlwZSBjcHRyVHlwZSwgdm9pZCogaW1wbCk7CisK
KyAgICAgICAgc3RhdGljIGJvb2wgZm9yZ2V0VjhFdmVudE9iamVjdChFdmVudCopOworCisgICAg
ICAgIFdvcmtlckNvbnRleHQqIG1fd29ya2VyQ29udGV4dDsKKyAgICAgICAgdjg6OlBlcnNpc3Rl
bnQ8djg6OkNvbnRleHQ+IG1fY29udGV4dDsKKyAgICAgICAgaW50IG1fcmVjdXJzaW9uOworCisg
ICAgICAgIFZlY3RvcjxWOFdvcmtlckNvbnRleHRFdmVudExpc3RlbmVyKj4gbV9saXN0ZW5lcnM7
CisgICAgICAgIFZlY3RvcjxFdmVudCo+IG1fZXZlbnRzOworICAgIH07CisKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShXT1JLRVJTKQorCisjZW5kaWYgLy8gV29y
a2VyQ29udGV4dEV4ZWN1dGlvblByb3h5X2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3Mv
djgvV29ya2VyU2NyaXB0Q29udHJvbGxlci5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L1dvcmtl
clNjcmlwdENvbnRyb2xsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu
Ljg1YmVlMGEKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L1dvcmtlclNj
cmlwdENvbnRyb2xsZXIuY3BwCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
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
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisK
KyNpZiBFTkFCTEUoV09SS0VSUykKKworI2luY2x1ZGUgIldvcmtlclNjcmlwdENvbnRyb2xsZXIu
aCIKKworI2luY2x1ZGUgPHY4Lmg+CisKKyNpbmNsdWRlICJTY3JpcHRTb3VyY2VDb2RlLmgiCisj
aW5jbHVkZSAiU2NyaXB0VmFsdWUuaCIKKyNpbmNsdWRlICJET01UaW1lci5oIgorI2luY2x1ZGUg
IldvcmtlckNvbnRleHQuaCIKKyNpbmNsdWRlICJXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHku
aCIKKyNpbmNsdWRlICJXb3JrZXJPYmplY3RQcm94eS5oIgorI2luY2x1ZGUgIldvcmtlclRocmVh
ZC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1dvcmtlclNjcmlwdENvbnRyb2xsZXI6Oldv
cmtlclNjcmlwdENvbnRyb2xsZXIoV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCkKKyAgICA6
IG1fd29ya2VyQ29udGV4dCh3b3JrZXJDb250ZXh0KQorICAgICwgbV9wcm94eShuZXcgV29ya2Vy
Q29udGV4dEV4ZWN1dGlvblByb3h5KHdvcmtlckNvbnRleHQpKQorICAgICwgbV9leGVjdXRpb25G
b3JiaWRkZW4oZmFsc2UpCit7Cit9CisKK1dvcmtlclNjcmlwdENvbnRyb2xsZXI6On5Xb3JrZXJT
Y3JpcHRDb250cm9sbGVyKCkKK3sKK30KKworU2NyaXB0VmFsdWUgV29ya2VyU2NyaXB0Q29udHJv
bGxlcjo6ZXZhbHVhdGUoY29uc3QgU2NyaXB0U291cmNlQ29kZSYgc291cmNlQ29kZSkKK3sKKyAg
ICB7CisgICAgICAgIE11dGV4TG9ja2VyIGxvY2sobV9zaGFyZWREYXRhTXV0ZXgpOworICAgICAg
ICBpZiAobV9leGVjdXRpb25Gb3JiaWRkZW4pCisgICAgICAgICAgICByZXR1cm4gU2NyaXB0VmFs
dWUoKTsKKyAgICB9CisKKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXN1bHQgPSBtX3Byb3h5
LT5ldmFsdWF0ZShzb3VyY2VDb2RlLnNvdXJjZSgpLCBzb3VyY2VDb2RlLnVybCgpLnN0cmluZygp
LCBzb3VyY2VDb2RlLnN0YXJ0TGluZSgpIC0gMSk7CisgICAgbV93b3JrZXJDb250ZXh0LT50aHJl
YWQoKS0+d29ya2VyT2JqZWN0UHJveHkoKS0+cmVwb3J0UGVuZGluZ0FjdGl2aXR5KG1fd29ya2Vy
Q29udGV4dC0+aGFzUGVuZGluZ0FjdGl2aXR5KCkpOworICAgIHJldHVybiBTY3JpcHRWYWx1ZSgp
OworfQorCitTY3JpcHRWYWx1ZSBXb3JrZXJTY3JpcHRDb250cm9sbGVyOjpldmFsdWF0ZShjb25z
dCBTY3JpcHRTb3VyY2VDb2RlJiBzb3VyY2VDb2RlLCBTY3JpcHRWYWx1ZSogLyogZXhjZXB0aW9u
ICovKQoreworICAgIC8vIEZJWE1FOiBOZWVkIHRvIHJldHVybiBhbiBleGNlcHRpb24uCisgICAg
cmV0dXJuIGV2YWx1YXRlKHNvdXJjZUNvZGUpOworfQorCit2b2lkIFdvcmtlclNjcmlwdENvbnRy
b2xsZXI6OmZvcmJpZEV4ZWN1dGlvbigpCit7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxs
ZWQgZnJvbSBhbm90aGVyIHRocmVhZC4KKyAgICBNdXRleExvY2tlciBsb2NrKG1fc2hhcmVkRGF0
YU11dGV4KTsKKyAgICBtX2V4ZWN1dGlvbkZvcmJpZGRlbiA9IHRydWU7Cit9CisKK3ZvaWQgV29y
a2VyU2NyaXB0Q29udHJvbGxlcjo6c2V0RXhjZXB0aW9uKFNjcmlwdFZhbHVlIC8qIGV4Y2VwdGlv
biAqLykKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoV09SS0VSUykKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmlu
ZGluZ3MvdjgvV29ya2VyU2NyaXB0Q29udHJvbGxlci5oIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9X
b3JrZXJTY3JpcHRDb250cm9sbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MC4uMDdlMjI0YwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvV29ya2Vy
U2NyaXB0Q29udHJvbGxlci5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
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
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFdvcmtlclNjcmlwdENv
bnRyb2xsZXJfaAorI2RlZmluZSBXb3JrZXJTY3JpcHRDb250cm9sbGVyX2gKKworI2lmIEVOQUJM
RShXT1JLRVJTKQorCisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9UaHJl
YWRpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAgY2xhc3MgU2NyaXB0U291cmNl
Q29kZTsKKyAgICBjbGFzcyBTY3JpcHRWYWx1ZTsKKyAgICBjbGFzcyBXb3JrZXJDb250ZXh0Owor
ICAgIGNsYXNzIFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTsKKworICAgIGNsYXNzIFdvcmtl
clNjcmlwdENvbnRyb2xsZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgV29ya2VyU2NyaXB0Q29u
dHJvbGxlcihXb3JrZXJDb250ZXh0Kik7CisgICAgICAgIH5Xb3JrZXJTY3JpcHRDb250cm9sbGVy
KCk7CisKKyAgICAgICAgV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5KiBwcm94eSgpIHsgcmV0
dXJuIG1fcHJveHkuZ2V0KCk7IH0KKworICAgICAgICBTY3JpcHRWYWx1ZSBldmFsdWF0ZShjb25z
dCBTY3JpcHRTb3VyY2VDb2RlJik7CisgICAgICAgIFNjcmlwdFZhbHVlIGV2YWx1YXRlKGNvbnN0
IFNjcmlwdFNvdXJjZUNvZGUmLCBTY3JpcHRWYWx1ZSogZXhjZXB0aW9uKTsKKworICAgICAgICB2
b2lkIHNldEV4Y2VwdGlvbihTY3JpcHRWYWx1ZSk7CisKKyAgICAgICAgdm9pZCBmb3JiaWRFeGVj
dXRpb24oKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIFdvcmtlckNvbnRleHQqIG1fd29ya2Vy
Q29udGV4dDsKKyAgICAgICAgT3duUHRyPFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eT4gbV9w
cm94eTsKKworICAgICAgICBNdXRleCBtX3NoYXJlZERhdGFNdXRleDsKKyAgICAgICAgYm9vbCBt
X2V4ZWN1dGlvbkZvcmJpZGRlbjsKKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisK
KyNlbmRpZiAvLyBFTkFCTEUoV09SS0VSUykKKworI2VuZGlmIC8vIFdvcmtlclNjcmlwdENvbnRy
b2xsZXJfaAo=
</data>
<flag name="review"
          id="14192"
          type_id="1"
          status="+"
          setter="dglazkov"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>28892</attachid>
            <date>2009-03-24 09:53:35 -0700</date>
            <delta_ts>2009-03-24 10:04:45 -0700</delta_ts>
            <desc>Fixes after merge into Chromium.</desc>
            <filename>patch.txt</filename>
            <type>text/plain</type>
            <size>2283</size>
            <attacher name="Dmitry Titov">dimich</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MzRhNTE3Ny4uNGNjZTYwZCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNCBAQAorMjAwOS0wMy0yNCAgRG1pdHJ5IFRpdG92
ICA8ZGltaWNoQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9
MjQ2ODkKKyAgICAgICAgRml4IENocm9taXVtIGNvbXBpbGF0aW9uIGVycm9ycy4KKworICAgICAg
ICAqIGJpbmRpbmdzL3Y4L1dvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eS5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHk6OkZpbmRPckNyZWF0ZUV2ZW50
TGlzdGVuZXIpOgorICAgICAgICAoV2ViQ29yZTo6V29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5
OjpSZW1vdmVFdmVudExpc3RlbmVyKToKKwogMjAwOS0wMy0yMCAgRG1pdHJ5IFRpdG92ICA8ZGlt
aWNoQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBBbGV4ZXkgUHJvc2t1cnlh
a292LgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9Xb3JrZXJDb250ZXh0RXhlY3V0
aW9uUHJveHkuY3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9Xb3JrZXJDb250ZXh0RXhlY3V0aW9u
UHJveHkuY3BwCmluZGV4IDI0ODAyYjguLmE0NmFhMjQgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvYmlu
ZGluZ3MvdjgvV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5LmNwcAorKysgYi9XZWJDb3JlL2Jp
bmRpbmdzL3Y4L1dvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eS5jcHAKQEAgLTMyNCw3ICszMjQs
NyBAQCBQYXNzUmVmUHRyPFY4RXZlbnRMaXN0ZW5lcj4gV29ya2VyQ29udGV4dEV4ZWN1dGlvblBy
b3h5OjpGaW5kT3JDcmVhdGVFdmVudExpc3RlbgogICAgIGlmICghb2JqZWN0LT5Jc09iamVjdCgp
KQogICAgICAgICByZXR1cm4gMDsKIAotICAgIGZvciAoc2l6ZV90IGluZGV4ID0gOyBpbmRleCA8
IG1fbGlzdGVuZXJzLnNpemUoKTsgKytpbmRleCkgeworICAgIGZvciAoc2l6ZV90IGluZGV4ID0g
MDsgaW5kZXggPCBtX2xpc3RlbmVycy5zaXplKCk7ICsraW5kZXgpIHsKICAgICAgICAgVjhFdmVu
dExpc3RlbmVyKiBlbCA9IG1fbGlzdGVuZXJzW2luZGV4XTsKICAgICAgICAgaWYgKGVsLT5pc0lu
bGluZSgpID09IGlzSW5saW5lICYmIGVsLT5nZXRMaXN0ZW5lck9iamVjdCgpID09IG9iamVjdCkK
ICAgICAgICAgICAgIHJldHVybiBlbDsKQEAgLTMzMyw3ICszMzMsNyBAQCBQYXNzUmVmUHRyPFY4
RXZlbnRMaXN0ZW5lcj4gV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5OjpGaW5kT3JDcmVhdGVF
dmVudExpc3RlbgogICAgICAgICByZXR1cm4gTlVMTDsKIAogICAgIC8vIENyZWF0ZSBhIG5ldyBv
bmUsIGFuZCBhZGQgdG8gY2FjaGUuCi0gICAgUmVmUHRyPFY4RXZlbnRMaXN0ZW5lcj4gbGlzdGVu
ZXIgPSBWOFdvcmtlckNvbnRleHRFdmVudExpc3RlbmVyOjpjcmVhdGUodGhpcywgdjg6OkxvY2Fs
PHY4OjpPYmplY3Q+OjpDYXN0KG9iamVjdCksIGlzSW5saW5lKTsKKyAgICBSZWZQdHI8VjhXb3Jr
ZXJDb250ZXh0RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBWOFdvcmtlckNvbnRleHRFdmVudExp
c3RlbmVyOjpjcmVhdGUodGhpcywgdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpDYXN0KG9iamVjdCks
IGlzSW5saW5lKTsKICAgICBtX2xpc3RlbmVycy5hcHBlbmQobGlzdGVuZXIuZ2V0KCkpOwogCiAg
ICAgcmV0dXJuIGxpc3RlbmVyLnJlbGVhc2UoKTsKQEAgLTM0MSw3ICszNDEsNyBAQCBQYXNzUmVm
UHRyPFY4RXZlbnRMaXN0ZW5lcj4gV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5OjpGaW5kT3JD
cmVhdGVFdmVudExpc3RlbgogCiB2b2lkIFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94eTo6UmVt
b3ZlRXZlbnRMaXN0ZW5lcihWOEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyKQogewotICAgIGZvciAo
c2l6ZV90IGluZGV4ID0gOyBpbmRleCA8IG1fbGlzdGVuZXJzLnNpemUoKTsgKytpbmRleCkgewor
ICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBtX2xpc3RlbmVycy5zaXplKCk7ICsr
aW5kZXgpIHsKICAgICAgICAgaWYgKG1fbGlzdGVuZXJzW2luZGV4XSA9PSBsaXN0ZW5lcikgewog
ICAgICAgICAgICAgbV9saXN0ZW5lcnMucmVtb3ZlKGluZGV4KTsKICAgICAgICAgICAgIHJldHVy
bjsK
</data>
<flag name="review"
          id="14274"
          type_id="1"
          status="+"
          setter="dglazkov"
    />
          </attachment>
      

    </bug>

</bugzilla>