<?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>47681</bug_id>
          
          <creation_ts>2010-10-14 13:07:18 -0700</creation_ts>
          <short_desc>[Chromium] implementation of async FileWriter for workers</short_desc>
          <delta_ts>2010-11-17 05:30:48 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>DOM</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>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>48098</dependson>
          <blocked>44358</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Eric U.">ericu</reporter>
          <assigned_to name="Eric U.">ericu</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>kinuko</cc>
    
    <cc>levin</cc>
    
    <cc>michaeln</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>294303</commentid>
    <comment_count>0</comment_count>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-10-14 13:07:18 -0700</bug_when>
    <thetext>This bug is just for the async interface, not FileWriterSync.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>294410</commentid>
    <comment_count>1</comment_count>
      <attachid>70788</attachid>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-10-14 15:31:09 -0700</bug_when>
    <thetext>Created attachment 70788
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>294412</commentid>
    <comment_count>2</comment_count>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-10-14 15:33:13 -0700</bug_when>
    <thetext>I&apos;m sorry this is so large; I hadn&apos;t realized it was going to be.

If you&apos;d like I can pull out the addition of FileInfo and post that first.  However, that bit&apos;s pretty clear and separate already, so I&apos;m not sure if that really makes the reviewing job much easier.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>294546</commentid>
    <comment_count>3</comment_count>
      <attachid>70788</attachid>
    <who name="Kinuko Yasuda">kinuko</who>
    <bug_when>2010-10-14 19:47:10 -0700</bug_when>
    <thetext>Comment on attachment 70788
Patch

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

Made some early comments.  To me it&apos;s a bit unclear how bridge&apos;s reference is held in shutdown sequence.  Usually it seems to be held by WorkerAsyncFileWriter, but who holds it after the writer is destroyed?

&gt; WebCore/fileapi/FileInfo.h:38
&gt; +struct FileInfo {

Hmm what will the plan be about Metadata?  Are we going to keep both FileInfo and Metadata around?

&gt; WebKit/chromium/src/WorkerAsyncFileSystemChromium.cpp:139
&gt; +class WorkerFileWriterHelperCallbacks : public AsyncFileSystemCallbacks {

It looks like FileWriterHelperCallbacks in AsyncFileSystemChromium can be also derived from AsyncFileSystemCallbacks and we could merge the two classes into one in a separate file?

Also if it derives from AsyncFileSystemCallbacks (but not from WebFileSystemCallbacks) it&apos;s going to be owned; it&apos;d be better to have create() method that returns PassOwnPtr.

&gt; WebKit/chromium/src/WorkerAsyncFileSystemChromium.cpp:153
&gt; +    }

nit: please insert empty line here

&gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp:63
&gt; +    mode.append(String::number(workerContext-&gt;thread()-&gt;runLoop().createUniqueId()));

Later when we implement sync mode it&apos;d be better to have different unique mode per operation (i.e. per granularity with which we want to wait for in sync case).

&gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.h:57
&gt; +    WorkerAsyncFileWriterChromium(WebKit::WebFileSystem*, const String&amp; path, WorkerContext*, AsyncFileWriterClient*, bool synchronous);

ditto; would be better to have create() method that returns PassOwnPtr.

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:66
&gt; +        Type newRef(bridge.get());

Isn&apos;t it enough to just pass bridge.get() to createCallbackTask?

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:102
&gt; +    dispatchTaskToMainThread(createCallbackTask(&amp;shutdownOnMainThread, bridge));

need to release the bridge here? (will it be the last reference to bridge?)

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:128
&gt; +void WorkerFileWriterCallbacksBridge::didWrite(long long bytes, bool complete)

Who holds the bridge&apos;s reference after shutdown is called until all the didXxx fire?

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:69
&gt; +class WorkerFileWriterCallbacksBridge : public ThreadSafeShared&lt;WorkerFileWriterCallbacksBridge&gt;, public WebCore::WorkerContext::Observer, public WebFileWriterClient {

nit: You may not need to call this &apos;Callbacks&apos; bridge :)

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:115
&gt; +    bool derefIfWorkerIsStopped();

Not needed?

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:136
&gt; +    String m_mode;

m_path and m_mode are not thread safe, they&apos;re created on the worker thread and may later be released on the main thread?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>294859</commentid>
    <comment_count>4</comment_count>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-10-15 12:34:27 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 70788 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=70788&amp;action=review
&gt; 
&gt; Made some early comments.  To me it&apos;s a bit unclear how bridge&apos;s reference is held in shutdown sequence.  Usually it seems to be held by WorkerAsyncFileWriter, but who holds it after the writer is destroyed?

The write passes off its last reference to shutdownOnMainThread, since the bridge needs to be destroyed on the main thread.  Any number of calls may have in-flight Tasks being posted between threads.  These also hold references.  I see that I have a bug here: a Task in flight to the worker context thread might actually hold the last reference; I&apos;ll have to work on that.

&gt; &gt; WebCore/fileapi/FileInfo.h:38
&gt; &gt; +struct FileInfo {
&gt; 
&gt; Hmm what will the plan be about Metadata?  Are we going to keep both FileInfo and Metadata around?

I see FileInfo as the internal data structure used to move info around, that is somewhat orthogonal to the DOM object that Metadata represents.  I think they should stay separate.  I&apos;d be open to a different name if you think that would help.

&gt; &gt; WebKit/chromium/src/WorkerAsyncFileSystemChromium.cpp:139
&gt; &gt; +class WorkerFileWriterHelperCallbacks : public AsyncFileSystemCallbacks {
&gt; 
&gt; It looks like FileWriterHelperCallbacks in AsyncFileSystemChromium can be also derived from AsyncFileSystemCallbacks and we could merge the two classes into one in a separate file?

That seems likely.  It would also make this changelist even larger, so I&apos;d like to do that in a followup CL if that&apos;s OK.

&gt; Also if it derives from AsyncFileSystemCallbacks (but not from WebFileSystemCallbacks) it&apos;s going to be owned; it&apos;d be better to have create() method that returns PassOwnPtr.
&gt; 
&gt; &gt; WebKit/chromium/src/WorkerAsyncFileSystemChromium.cpp:153
&gt; &gt; +    }
&gt; 
&gt; nit: please insert empty line here

Done.

&gt; &gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp:63
&gt; &gt; +    mode.append(String::number(workerContext-&gt;thread()-&gt;runLoop().createUniqueId()));
&gt; 
&gt; Later when we implement sync mode it&apos;d be better to have different unique mode per operation (i.e. per granularity with which we want to wait for in sync case).

In sync mode, there can be only one operation going on at a time.  Unlike the FileSystem, which is shared, a FileWriter is tied to a single DOM object.

&gt; &gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.h:57
&gt; &gt; +    WorkerAsyncFileWriterChromium(WebKit::WebFileSystem*, const String&amp; path, WorkerContext*, AsyncFileWriterClient*, bool synchronous);
&gt; 
&gt; ditto; would be better to have create() method that returns PassOwnPtr.

Done.

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:66
&gt; &gt; +        Type newRef(bridge.get());
&gt; 
&gt; Isn&apos;t it enough to just pass bridge.get() to createCallbackTask?

Yes--cleaned up.  Thanks!

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:102
&gt; &gt; +    dispatchTaskToMainThread(createCallbackTask(&amp;shutdownOnMainThread, bridge));
&gt; 
&gt; need to release the bridge here? (will it be the last reference to bridge?)

It&apos;s a PassRefPtr, so it should be zeroed out by getting passed to the parameter.  The caller released its reference when calling postShutdownToMainThread.

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:128
&gt; &gt; +void WorkerFileWriterCallbacksBridge::didWrite(long long bytes, bool complete)
&gt; 
&gt; Who holds the bridge&apos;s reference after shutdown is called until all the didXxx fire?

Each task holds a reference.  As above, I need to make sure that the last one&apos;s on the main thread.

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:69
&gt; &gt; +class WorkerFileWriterCallbacksBridge : public ThreadSafeShared&lt;WorkerFileWriterCallbacksBridge&gt;, public WebCore::WorkerContext::Observer, public WebFileWriterClient {
&gt; 
&gt; nit: You may not need to call this &apos;Callbacks&apos; bridge :)

Well, it does bridge the callbacks across threads, and it&apos;s parallel to the WorkerFileSystemCallbacksBridge.  I can change it if you think it&apos;s wrong, but I have a mild preference for it as it is.

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:115
&gt; &gt; +    bool derefIfWorkerIsStopped();
&gt; 
&gt; Not needed?

Yup; obsolete.  Deleted.

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:136
&gt; &gt; +    String m_mode;
&gt; 
&gt; m_path and m_mode are not thread safe, they&apos;re created on the worker thread and may later be released on the main thread?

Switched to threadsafeCopy() of inputs.

I&apos;ll post a new patch when I&apos;ve fixed the shutdown issue.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>294928</commentid>
    <comment_count>5</comment_count>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-10-15 14:40:09 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 70788 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=70788&amp;action=review
&gt; 
&gt; Made some early comments.  To me it&apos;s a bit unclear how bridge&apos;s reference is held in shutdown sequence.  Usually it seems to be held by WorkerAsyncFileWriter, but who holds it after the writer is destroyed?
&gt; 
&gt; &gt; WebCore/fileapi/FileInfo.h:38
&gt; &gt; +struct FileInfo {
&gt; 
&gt; Hmm what will the plan be about Metadata?  Are we going to keep both FileInfo and Metadata around?
&gt; 
&gt; &gt; WebKit/chromium/src/WorkerAsyncFileSystemChromium.cpp:139
&gt; &gt; +class WorkerFileWriterHelperCallbacks : public AsyncFileSystemCallbacks {
&gt; 
&gt; It looks like FileWriterHelperCallbacks in AsyncFileSystemChromium can be also derived from AsyncFileSystemCallbacks and we could merge the two classes into one in a separate file?
&gt; 
&gt; Also if it derives from AsyncFileSystemCallbacks (but not from WebFileSystemCallbacks) it&apos;s going to be owned; it&apos;d be better to have create() method that returns PassOwnPtr.
&gt; 
&gt; &gt; WebKit/chromium/src/WorkerAsyncFileSystemChromium.cpp:153
&gt; &gt; +    }
&gt; 
&gt; nit: please insert empty line here
&gt; 
&gt; &gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp:63
&gt; &gt; +    mode.append(String::number(workerContext-&gt;thread()-&gt;runLoop().createUniqueId()));
&gt; 
&gt; Later when we implement sync mode it&apos;d be better to have different unique mode per operation (i.e. per granularity with which we want to wait for in sync case).
&gt; 
&gt; &gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.h:57
&gt; &gt; +    WorkerAsyncFileWriterChromium(WebKit::WebFileSystem*, const String&amp; path, WorkerContext*, AsyncFileWriterClient*, bool synchronous);
&gt; 
&gt; ditto; would be better to have create() method that returns PassOwnPtr.
&gt; 
&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:66
&gt; &gt; +        Type newRef(bridge.get());
&gt; 
&gt; Isn&apos;t it enough to just pass bridge.get() to createCallbackTask?

Actually, that turns out not to work.  If you do that, the CrossThreadCopier just copies a bare pointer across, so when the PassRefPtr bridge gets deleted, it may give bridge its last deref, and it can be deleted before the PassRefPtr parameter to shutdownOnMainThread gets to ref it.

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:102
&gt; &gt; +    dispatchTaskToMainThread(createCallbackTask(&amp;shutdownOnMainThread, bridge));
&gt; 
&gt; need to release the bridge here? (will it be the last reference to bridge?)
&gt; 
&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:128
&gt; &gt; +void WorkerFileWriterCallbacksBridge::didWrite(long long bytes, bool complete)
&gt; 
&gt; Who holds the bridge&apos;s reference after shutdown is called until all the didXxx fire?
&gt; 
&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:69
&gt; &gt; +class WorkerFileWriterCallbacksBridge : public ThreadSafeShared&lt;WorkerFileWriterCallbacksBridge&gt;, public WebCore::WorkerContext::Observer, public WebFileWriterClient {
&gt; 
&gt; nit: You may not need to call this &apos;Callbacks&apos; bridge :)
&gt; 
&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:115
&gt; &gt; +    bool derefIfWorkerIsStopped();
&gt; 
&gt; Not needed?
&gt; 
&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:136
&gt; &gt; +    String m_mode;
&gt; 
&gt; m_path and m_mode are not thread safe, they&apos;re created on the worker thread and may later be released on the main thread?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>294936</commentid>
    <comment_count>6</comment_count>
      <attachid>70899</attachid>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-10-15 14:53:51 -0700</bug_when>
    <thetext>Created attachment 70899
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>294937</commentid>
    <comment_count>7</comment_count>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-10-15 14:55:04 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; (In reply to comment #3)
&gt; &gt; (From update of attachment 70788 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=70788&amp;action=review
&gt; &gt; 
&gt; &gt; Made some early comments.  To me it&apos;s a bit unclear how bridge&apos;s reference is held in shutdown sequence.  Usually it seems to be held by WorkerAsyncFileWriter, but who holds it after the writer is destroyed?
&gt; 
&gt; The write passes off its last reference to shutdownOnMainThread, since the bridge needs to be destroyed on the main thread.  Any number of calls may have in-flight Tasks being posted between threads.  These also hold references.  I see that I have a bug here: a Task in flight to the worker context thread might actually hold the last reference; I&apos;ll have to work on that.

I take that back; it&apos;s not a problem.  As long as m_writer is cleared on the Main thread, it doesn&apos;t matter which thread does the final deletion of the bridge object.  I&apos;ve added comments to that effect.

&gt; &gt; &gt; WebCore/fileapi/FileInfo.h:38
&gt; &gt; &gt; +struct FileInfo {
&gt; &gt; 
&gt; &gt; Hmm what will the plan be about Metadata?  Are we going to keep both FileInfo and Metadata around?
&gt; 
&gt; I see FileInfo as the internal data structure used to move info around, that is somewhat orthogonal to the DOM object that Metadata represents.  I think they should stay separate.  I&apos;d be open to a different name if you think that would help.
&gt; 
&gt; &gt; &gt; WebKit/chromium/src/WorkerAsyncFileSystemChromium.cpp:139
&gt; &gt; &gt; +class WorkerFileWriterHelperCallbacks : public AsyncFileSystemCallbacks {
&gt; &gt; 
&gt; &gt; It looks like FileWriterHelperCallbacks in AsyncFileSystemChromium can be also derived from AsyncFileSystemCallbacks and we could merge the two classes into one in a separate file?
&gt; 
&gt; That seems likely.  It would also make this changelist even larger, so I&apos;d like to do that in a followup CL if that&apos;s OK.
&gt; 
&gt; &gt; Also if it derives from AsyncFileSystemCallbacks (but not from WebFileSystemCallbacks) it&apos;s going to be owned; it&apos;d be better to have create() method that returns PassOwnPtr.
&gt; &gt; 
&gt; &gt; &gt; WebKit/chromium/src/WorkerAsyncFileSystemChromium.cpp:153
&gt; &gt; &gt; +    }
&gt; &gt; 
&gt; &gt; nit: please insert empty line here
&gt; 
&gt; Done.
&gt; 
&gt; &gt; &gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp:63
&gt; &gt; &gt; +    mode.append(String::number(workerContext-&gt;thread()-&gt;runLoop().createUniqueId()));
&gt; &gt; 
&gt; &gt; Later when we implement sync mode it&apos;d be better to have different unique mode per operation (i.e. per granularity with which we want to wait for in sync case).
&gt; 
&gt; In sync mode, there can be only one operation going on at a time.  Unlike the FileSystem, which is shared, a FileWriter is tied to a single DOM object.
&gt; 
&gt; &gt; &gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.h:57
&gt; &gt; &gt; +    WorkerAsyncFileWriterChromium(WebKit::WebFileSystem*, const String&amp; path, WorkerContext*, AsyncFileWriterClient*, bool synchronous);
&gt; &gt; 
&gt; &gt; ditto; would be better to have create() method that returns PassOwnPtr.
&gt; 
&gt; Done.
&gt; 
&gt; &gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:66
&gt; &gt; &gt; +        Type newRef(bridge.get());
&gt; &gt; 
&gt; &gt; Isn&apos;t it enough to just pass bridge.get() to createCallbackTask?
&gt; 
&gt; Yes--cleaned up.  Thanks!
&gt; 
&gt; &gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:102
&gt; &gt; &gt; +    dispatchTaskToMainThread(createCallbackTask(&amp;shutdownOnMainThread, bridge));
&gt; &gt; 
&gt; &gt; need to release the bridge here? (will it be the last reference to bridge?)
&gt; 
&gt; It&apos;s a PassRefPtr, so it should be zeroed out by getting passed to the parameter.  The caller released its reference when calling postShutdownToMainThread.
&gt; 
&gt; &gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:128
&gt; &gt; &gt; +void WorkerFileWriterCallbacksBridge::didWrite(long long bytes, bool complete)
&gt; &gt; 
&gt; &gt; Who holds the bridge&apos;s reference after shutdown is called until all the didXxx fire?
&gt; 
&gt; Each task holds a reference.  As above, I need to make sure that the last one&apos;s on the main thread.
&gt; 
&gt; &gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:69
&gt; &gt; &gt; +class WorkerFileWriterCallbacksBridge : public ThreadSafeShared&lt;WorkerFileWriterCallbacksBridge&gt;, public WebCore::WorkerContext::Observer, public WebFileWriterClient {
&gt; &gt; 
&gt; &gt; nit: You may not need to call this &apos;Callbacks&apos; bridge :)
&gt; 
&gt; Well, it does bridge the callbacks across threads, and it&apos;s parallel to the WorkerFileSystemCallbacksBridge.  I can change it if you think it&apos;s wrong, but I have a mild preference for it as it is.
&gt; 
&gt; &gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:115
&gt; &gt; &gt; +    bool derefIfWorkerIsStopped();
&gt; &gt; 
&gt; &gt; Not needed?
&gt; 
&gt; Yup; obsolete.  Deleted.
&gt; 
&gt; &gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:136
&gt; &gt; &gt; +    String m_mode;
&gt; &gt; 
&gt; &gt; m_path and m_mode are not thread safe, they&apos;re created on the worker thread and may later be released on the main thread?
&gt; 
&gt; Switched to threadsafeCopy() of inputs.
&gt; 
&gt; I&apos;ll post a new patch when I&apos;ve fixed the shutdown issue.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>294945</commentid>
    <comment_count>8</comment_count>
      <attachid>70899</attachid>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2010-10-15 15:02:15 -0700</bug_when>
    <thetext>Comment on attachment 70899
Patch

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

&gt; WebKit/chromium/src/AsyncFileWriterChromium.h:53
&gt; +    AsyncFileWriterChromium(AsyncFileWriterClient*, WebKit::WebFileSystem*, const String&amp; path);

Given the raw ptr, i was wondering about lifetimes. Instead of passing the raw ptr around, have you considered accessing as needed via...
webkitClient()-&gt;fileSystem()</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>294949</commentid>
    <comment_count>9</comment_count>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-10-15 15:11:58 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; (From update of attachment 70899 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=70899&amp;action=review
&gt; 
&gt; &gt; WebKit/chromium/src/AsyncFileWriterChromium.h:53
&gt; &gt; +    AsyncFileWriterChromium(AsyncFileWriterClient*, WebKit::WebFileSystem*, const String&amp; path);
&gt; 
&gt; Given the raw ptr, i was wondering about lifetimes. Instead of passing the raw ptr around, have you considered accessing as needed via...
&gt; webkitClient()-&gt;fileSystem()

I could certainly do that, both in the worker and non-worker AsyncFileWriterClient.  So could {Worker}AsyncFileWriterChromium.  My reflex is not to use the globals, but it would save space and a little bit of code, and I&apos;d guess it&apos;d be about the same speed.  Is there a preferred webkit way of doing this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>295728</commentid>
    <comment_count>10</comment_count>
      <attachid>70899</attachid>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2010-10-18 14:00:28 -0700</bug_when>
    <thetext>Comment on attachment 70899
Patch

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

&gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp:60
&gt; +    WebWorkerBase* worker = static_cast&lt;WebWorkerBase*&gt;(workerLoaderProxy);

Do you actually need the WebWorkerBase* or will the WorkerLoaderProxy interface satisfy the bridges needs, specifically a way to post tasks back to the worker thread.

&gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp:64
&gt; +    m_bridge = WorkerFileWriterCallbacksBridge::create(webFileSystem, path, worker, workerContext, mode, client);

I think it may be worth trying to simplify this patch. The shutdown sequence in particular feels delicate. I&apos;m familiar with another &apos;bridge&apos; to the main thread with similar characterics (starts an async operation than may be canceled) that seems simpler, see WorkerThreadableLoader. It may be that this case is more complicated, if so why?

Ok, that&apos;s kind of vague feedback, but here&apos;s a concrete way to simplify things a little bit. Post a task to the main thread to &apos;init&apos; the WebFileWriter in this ctor so you don&apos;t need to test for it prior to handling other tasks (the init task will have already run).

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:207
&gt; +    m_worker-&gt;dispatchTaskToMainThread(createCallbackTask(&amp;runTaskOnMainThread, this, task));

I think this is a static method call, maybe use WebWorkerBase::dispatchTaskToMainThread to clarify.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>295879</commentid>
    <comment_count>11</comment_count>
      <attachid>70899</attachid>
    <who name="Kinuko Yasuda">kinuko</who>
    <bug_when>2010-10-18 18:04:59 -0700</bug_when>
    <thetext>Comment on attachment 70899
Patch

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

&gt;&gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp:64
&gt;&gt; +    m_bridge = WorkerFileWriterCallbacksBridge::create(webFileSystem, path, worker, workerContext, mode, client);
&gt; 
&gt; I think it may be worth trying to simplify this patch. The shutdown sequence in particular feels delicate. I&apos;m familiar with another &apos;bridge&apos; to the main thread with similar characterics (starts an async operation than may be canceled) that seems simpler, see WorkerThreadableLoader. It may be that this case is more complicated, if so why?
&gt; 
&gt; Ok, that&apos;s kind of vague feedback, but here&apos;s a concrete way to simplify things a little bit. Post a task to the main thread to &apos;init&apos; the WebFileWriter in this ctor so you don&apos;t need to test for it prior to handling other tasks (the init task will have already run).

(A bit tangent...)
I&apos;d generally prefer having a separate class (maybe a subclass of WebFileWriterClient) for the things that are to be created and held solely on the main thread.  Then we could initialize it in bridge&apos;s ctor (or in its initialization method) and let it own WebFileWriter and a reference to the bridge.   Then we&apos;d have two distinct WebFileWriterClient, one in the worker thread, the other one in the main thread. Both hold a ref to the bridge.  When one goes away it just tells the peer to go away.  No refptr passing except for the initialization phase.

&gt;&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:207
&gt;&gt; +    m_worker-&gt;dispatchTaskToMainThread(createCallbackTask(&amp;runTaskOnMainThread, this, task));
&gt; 
&gt; I think this is a static method call, maybe use WebWorkerBase::dispatchTaskToMainThread to clarify.

If you change this would you mind changing the similar line in WorkerFileSystemCallbacksBridge (and possibly AllowDatabaseMainThreadBridge in WebWorkerBase.cpp)?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>295912</commentid>
    <comment_count>12</comment_count>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-10-18 19:09:06 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; (From update of attachment 70899 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=70899&amp;action=review
&gt; 
&gt; &gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp:60
&gt; &gt; +    WebWorkerBase* worker = static_cast&lt;WebWorkerBase*&gt;(workerLoaderProxy);
&gt; 
&gt; Do you actually need the WebWorkerBase* or will the WorkerLoaderProxy interface satisfy the bridges needs, specifically a way to post tasks back to the worker thread.

Actually, it looks like I don&apos;t; I&apos;ll take that out.

&gt; &gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp:64
&gt; &gt; +    m_bridge = WorkerFileWriterCallbacksBridge::create(webFileSystem, path, worker, workerContext, mode, client);
&gt; 
&gt; I think it may be worth trying to simplify this patch. The shutdown sequence in particular feels delicate. I&apos;m familiar with another &apos;bridge&apos; to the main thread with similar characterics (starts an async operation than may be canceled) that seems simpler, see WorkerThreadableLoader. It may be that this case is more complicated, if so why?

The reason that WorkerThreadableLoader looks simpler is that it adds in another helper class [ThreadableLoaderClientWrapper] which acts as a refcounted weak pointer back to the main class.  So it makes the main class look a bit simpler by itself, but adds an extra class, and I feel like that makes it overall more complicated.  You have to read multiple files to understand it.

&gt; Ok, that&apos;s kind of vague feedback, but here&apos;s a concrete way to simplify things a little bit. Post a task to the main thread to &apos;init&apos; the WebFileWriter in this ctor so you don&apos;t need to test for it prior to handling other tasks (the init task will have already run).

This makes a lot of sense.  Let me do that and see how much clearer it gets.

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:207
&gt; &gt; +    m_worker-&gt;dispatchTaskToMainThread(createCallbackTask(&amp;runTaskOnMainThread, this, task));
&gt; 
&gt; I think this is a static method call, maybe use WebWorkerBase::dispatchTaskToMainThread to clarify.

Done, thanks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>296583</commentid>
    <comment_count>13</comment_count>
      <attachid>70899</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-10-19 18:13:12 -0700</bug_when>
    <thetext>Comment on attachment 70899
Patch

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

Meta comment:
Pulling things into smaller patches is better.

You get things in faster because the reviewer can often approve simple things quickly and the complicated things get the attention they need without the added distraction of other stuff.

Also when you go through multiple rounds of reviews, it means that the reviewer needs to look over a bunch of cruft everytime that while simple -- still needs to be looked at everytime. (We don&apos;t have nice intra-patch diffing in WebKit land).

So please consider making patches as small as possible and breaking up independent pieces.

Initial brief comments on the patch.

&gt; WebCore/fileapi/FileInfo.h:38
&gt; +struct FileInfo {

WebKit tries to avoid abbreviations &quot;Info&quot;.

FileMetadata ?

&gt; WebCore/fileapi/FileInfo.h:62
&gt; +#endif // DOMFileSystem_h

This comment is incorrect.

&gt; WebCore/fileapi/FileSystemCallbacks.h:37
&gt; +#include &quot;FileInfo.h&quot;

Don&apos;t include. Use a fwd decl.

&gt; WebCore/platform/AsyncFileSystemCallbacks.h:36
&gt; +#include &quot;FileInfo.h&quot;

Avoid include. Use fwd decl.

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:69
&gt; +class WorkerFileWriterCallbacksBridge : public ThreadSafeShared&lt;WorkerFileWriterCallbacksBridge&gt;, public WebCore::WorkerContext::Observer, public WebFileWriterClient {

Any ThreadSafeShared class that owns strings bothers me.

ThreadSafeShared basically means that it can be destructed on multiple threads.

String is not designed to be used on multiple threads. It takes very very careful coding to get this right.

Then even if you get it right, any maintainance patches need to get it right (and they won&apos;t because it is too subtle).

In short, I think this is fundamentally flawed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>296585</commentid>
    <comment_count>14</comment_count>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-10-19 18:18:15 -0700</bug_when>
    <thetext>(In reply to comment #11)
&gt; (From update of attachment 70899 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=70899&amp;action=review
&gt; 
&gt; &gt;&gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp:64
&gt; &gt;&gt; +    m_bridge = WorkerFileWriterCallbacksBridge::create(webFileSystem, path, worker, workerContext, mode, client);
&gt; &gt; 
&gt; &gt; I think it may be worth trying to simplify this patch. The shutdown sequence in particular feels delicate. I&apos;m familiar with another &apos;bridge&apos; to the main thread with similar characterics (starts an async operation than may be canceled) that seems simpler, see WorkerThreadableLoader. It may be that this case is more complicated, if so why?
&gt; &gt; 
&gt; &gt; Ok, that&apos;s kind of vague feedback, but here&apos;s a concrete way to simplify things a little bit. Post a task to the main thread to &apos;init&apos; the WebFileWriter in this ctor so you don&apos;t need to test for it prior to handling other tasks (the init task will have already run).
&gt; 
&gt; (A bit tangent...)
&gt; I&apos;d generally prefer having a separate class (maybe a subclass of WebFileWriterClient) for the things that are to be created and held solely on the main thread.  Then we could initialize it in bridge&apos;s ctor (or in its initialization method) and let it own WebFileWriter and a reference to the bridge.   Then we&apos;d have two distinct WebFileWriterClient, one in the worker thread, the other one in the main thread. Both hold a ref to the bridge.  When one goes away it just tells the peer to go away.  No refptr passing except for the initialization phase.

I looked into this a bit, but I&apos;m not sure that anything along these lines will actually make things significantly simpler.  The bridge would look pretty much the same except for shutdown.

The Tasks passed in each direction through the bridge still need to have RefPtrs to it, so that it won&apos;t vanish out from under them.  The main thread still needs to use the WorkerLoaderProxy to post tasks to the context thread, but that should be created on the context thread [I&apos;m not sure if it needs to be destroyed there--I&apos;ll look into that].

I think I&apos;ve managed a good bit of simplification without the split you&apos;re describing.  I&apos;ll post it in a bit, and please let me know if you still think I should try adding another wrapper class.

&gt; &gt;&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:207
&gt; &gt;&gt; +    m_worker-&gt;dispatchTaskToMainThread(createCallbackTask(&amp;runTaskOnMainThread, this, task));
&gt; &gt; 
&gt; &gt; I think this is a static method call, maybe use WebWorkerBase::dispatchTaskToMainThread to clarify.
&gt; 
&gt; If you change this would you mind changing the similar line in WorkerFileSystemCallbacksBridge (and possibly AllowDatabaseMainThreadBridge in WebWorkerBase.cpp)?

Can do; I&apos;ll put that in a separate cleanup patch, though, along with the AsyncFileWriterChromium stuff I&apos;m going to drop out of this one for size.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>296586</commentid>
    <comment_count>15</comment_count>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-10-19 18:20:04 -0700</bug_when>
    <thetext>(In reply to comment #13)
&gt; (From update of attachment 70899 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=70899&amp;action=review
&gt; 
&gt; Meta comment:
&gt; Pulling things into smaller patches is better.
&gt; 
&gt; You get things in faster because the reviewer can often approve simple things quickly and the complicated things get the attention they need without the added distraction of other stuff.
&gt; 
&gt; Also when you go through multiple rounds of reviews, it means that the reviewer needs to look over a bunch of cruft everytime that while simple -- still needs to be looked at everytime. (We don&apos;t have nice intra-patch diffing in WebKit land).
&gt; 
&gt; So please consider making patches as small as possible and breaking up independent pieces.

I&apos;ve split off the AsyncFileWriterChromium cleanup stuff into a separate patch; I&apos;ll log another bug for it.

&gt; Initial brief comments on the patch.
&gt; 
&gt; &gt; WebCore/fileapi/FileInfo.h:38
&gt; &gt; +struct FileInfo {
&gt; 
&gt; WebKit tries to avoid abbreviations &quot;Info&quot;.
&gt; 
&gt; FileMetadata ?
&gt; 
&gt; &gt; WebCore/fileapi/FileInfo.h:62
&gt; &gt; +#endif // DOMFileSystem_h
&gt; 
&gt; This comment is incorrect.
&gt; 
&gt; &gt; WebCore/fileapi/FileSystemCallbacks.h:37
&gt; &gt; +#include &quot;FileInfo.h&quot;
&gt; 
&gt; Don&apos;t include. Use a fwd decl.
&gt; 
&gt; &gt; WebCore/platform/AsyncFileSystemCallbacks.h:36
&gt; &gt; +#include &quot;FileInfo.h&quot;
&gt; 
&gt; Avoid include. Use fwd decl.
&gt; 
&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:69
&gt; &gt; +class WorkerFileWriterCallbacksBridge : public ThreadSafeShared&lt;WorkerFileWriterCallbacksBridge&gt;, public WebCore::WorkerContext::Observer, public WebFileWriterClient {
&gt; 
&gt; Any ThreadSafeShared class that owns strings bothers me.
&gt; 
&gt; ThreadSafeShared basically means that it can be destructed on multiple threads.
&gt; 
&gt; String is not designed to be used on multiple threads. It takes very very careful coding to get this right.
&gt; 
&gt; Then even if you get it right, any maintainance patches need to get it right (and they won&apos;t because it is too subtle).
&gt; 
&gt; In short, I think this is fundamentally flawed.

As a matter of fact, I&apos;m about to post a cleanup that does away with all stored strings.  I&apos;ll roll your other comments in first, though.  Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>297038</commentid>
    <comment_count>16</comment_count>
      <attachid>71339</attachid>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-10-20 14:44:55 -0700</bug_when>
    <thetext>Created attachment 71339
Rolled in feedback, removed AsyncFileWriter changes.

I&apos;m afraid this is still quite large, even after I dropped out the AsyncFileWriter cleanup changes.  But a fair bit of it is mechanical: the switchover to FileMetadata and associated build files.  And the bridge code should be much simpler now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>297043</commentid>
    <comment_count>17</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-10-20 14:50:27 -0700</bug_when>
    <thetext>Attachment 71339 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;]&quot; exit_code: 1
WebKit/chromium/src/WorkerAsyncFileSystemChromium.cpp:38:  Alphabetical sorting problem.  [build/include_order] [4]
Total errors found: 1 in 18 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>297131</commentid>
    <comment_count>18</comment_count>
      <attachid>71362</attachid>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-10-20 16:43:07 -0700</bug_when>
    <thetext>Created attachment 71362
Fixed include order.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>297152</commentid>
    <comment_count>19</comment_count>
    <who name="Michael Nordman">michaeln</who>
    <bug_when>2010-10-20 17:10:51 -0700</bug_when>
    <thetext>View in context: https://bugs.webkit.org/attachment.cgi?id=71339&amp;action=review

&gt; WebKit/chromium/src/WebFileSystemCallbacksImpl.cpp:74
&gt; +        fileMetadata.type = FileMetadata::TypeDirectory;

In many cases we arrange to have the webcore enum values equate to the webkit enum values so all we need are static_casts&lt;&gt; in this layer. There are COMPILE_TIME_ASSERTS to ensure the values are actually equal, see AssertMatchingEnums.cpp. Can we do that here too?

&gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp:67
&gt; +    bridge-&gt;postShutdownToMainThread(m_bridge.release());

Is the handoff of the &apos;last reference&apos; needed, would a typical method call (like the others) followed by the RefPtr going out of scope suffice?

&gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.h:60
&gt; +    WebKit::WebFileWriterClient* getMainThreadClient();

where is this method used?

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:52
&gt; +template&lt;&gt; struct CrossThreadCopierBase&lt;false, false, WebKit::WebURL&gt; {

Would it make sense to pass a KURL instead of a WebURL in the postWriteToMainThread? I&apos;m guessing there is a KURL cross thread copier defined already.

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:104
&gt; +    ASSERT(!m_clientOnWorkerThread);

I don&apos;t understand this assertion. The data member is reset only when notifyStop() is called, which according to the comment is a WorkerContext::Observer override. Do file writers only go away during worker context shutdown?

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:158
&gt; +    postInitToMainThread(path);

I&apos;m not sure this is safe to call from within the ctor? What is the value of the refcount at this point? It the task wrappers involve ref&apos;ing and deref&apos;ing the bridge. Depending on when threads run when, is it possible that the object will be deleted prior to returning from the ctor and being placed into the callers RefPtr?

This pattern was a source of some bugs in chrome. Consider having the factory method schedule the init on the main thread after having safely taken a reference.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>297183</commentid>
    <comment_count>20</comment_count>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-10-20 17:58:47 -0700</bug_when>
    <thetext>(In reply to comment #19)
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=71339&amp;action=review
&gt; 
&gt; &gt; WebKit/chromium/src/WebFileSystemCallbacksImpl.cpp:74
&gt; &gt; +        fileMetadata.type = FileMetadata::TypeDirectory;
&gt; 
&gt; In many cases we arrange to have the webcore enum values equate to the webkit enum values so all we need are static_casts&lt;&gt; in this layer. There are COMPILE_TIME_ASSERTS to ensure the values are actually equal, see AssertMatchingEnums.cpp. Can we do that here too?

Very neat.  Done.

&gt; &gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp:67
&gt; &gt; +    bridge-&gt;postShutdownToMainThread(m_bridge.release());
&gt; 
&gt; Is the handoff of the &apos;last reference&apos; needed, would a typical method call (like the others) followed by the RefPtr going out of scope suffice?

You&apos;re right.  With the current organization, it&apos;s safe for the actual deletion to happen on any thread, as long as this gets called first.  I&apos;ve fixed up the comments and made the caller&apos;s code simpler.

&gt; &gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.h:60
&gt; &gt; +    WebKit::WebFileWriterClient* getMainThreadClient();
&gt; 
&gt; where is this method used?

Nowhere.  Removed.

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:52
&gt; &gt; +template&lt;&gt; struct CrossThreadCopierBase&lt;false, false, WebKit::WebURL&gt; {
&gt; 
&gt; Would it make sense to pass a KURL instead of a WebURL in the postWriteToMainThread? I&apos;m guessing there is a KURL cross thread copier defined already.

I&apos;ll talk to you offline about this.

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:104
&gt; &gt; +    ASSERT(!m_clientOnWorkerThread);
&gt; 
&gt; I don&apos;t understand this assertion. The data member is reset only when notifyStop() is called, which according to the comment is a WorkerContext::Observer override. Do file writers only go away during worker context shutdown?

No, that&apos;s a bug.  Fixed.

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:158
&gt; &gt; +    postInitToMainThread(path);
&gt; 
&gt; I&apos;m not sure this is safe to call from within the ctor? What is the value of the refcount at this point? It the task wrappers involve ref&apos;ing and deref&apos;ing the bridge. Depending on when threads run when, is it possible that the object will be deleted prior to returning from the ctor and being placed into the callers RefPtr?

The parent class ThreadSafeShared starts with a refcount of 1, so this should be perfectly safe.  The adoptRef called in the factory method is adopting that initial reference.

&gt; This pattern was a source of some bugs in chrome. Consider having the factory method schedule the init on the main thread after having safely taken a reference.

Since this is both safe and part of constructing a viable instance, I think it&apos;s better in the constructor.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>297192</commentid>
    <comment_count>21</comment_count>
      <attachid>71378</attachid>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-10-20 18:24:37 -0700</bug_when>
    <thetext>Created attachment 71378
Rolled in Michael&apos;s comments, including the KURL change.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>297209</commentid>
    <comment_count>22</comment_count>
      <attachid>71378</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-10-20 19:59:10 -0700</bug_when>
    <thetext>Comment on attachment 71378
Rolled in Michael&apos;s comments, including the KURL change.

I&apos;m not sure why this is up for review. The strings are still in the ThreadSafeShared class.

I could point out nits but that code may change.

I could try to understand the structure and point out issues there but it is hard for me to know what is going to change (due to those strings).

btw, I&apos;d recommend make the fileInfo change as a separate patch. It looks independent and something that could get r+&apos;ed quickly.

r- due to the strings in the ThreadSafeShared class (and not wanting to spend time diving into code that may change a fair bit due to this).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>297240</commentid>
    <comment_count>23</comment_count>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-10-20 23:07:35 -0700</bug_when>
    <thetext>(In reply to comment #22)
&gt; (From update of attachment 71378 [details])
&gt; I&apos;m not sure why this is up for review. The strings are still in the ThreadSafeShared class.
&gt; 
&gt; I could point out nits but that code may change.
&gt; 
&gt; I could try to understand the structure and point out issues there but it is hard for me to know what is going to change (due to those strings).
&gt; 
&gt; btw, I&apos;d recommend make the fileInfo change as a separate patch. It looks independent and something that could get r+&apos;ed quickly.
&gt; 
&gt; r- due to the strings in the ThreadSafeShared class (and not wanting to spend time diving into code that may change a fair bit due to this).

David:  Many apologies for your wasted time.  I apparently managed to grab an old patch by accident when uploading this time [from back before your first set of comments].  I&apos;ll try again tomorrow.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>301500</commentid>
    <comment_count>24</comment_count>
      <attachid>72273</attachid>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-10-28 17:44:50 -0700</bug_when>
    <thetext>Created attachment 72273
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>302838</commentid>
    <comment_count>25</comment_count>
      <attachid>72273</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-11-01 12:17:42 -0700</bug_when>
    <thetext>Comment on attachment 72273
Patch

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

Some quick 1st pass comments. (I would save these as a draft until done but that feature doesn&apos;t exist.)

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:52
&gt; +template&lt;&gt; struct CrossThreadCopierBase&lt;false, false, PassRefPtr&lt;WebKit::WorkerFileWriterCallbacksBridge&gt; &gt; {

I think the real problem is that the CrossThreadCopier doesn&apos;t recognize ThreadSafeShared class which are passed in a PassRefPtr.

Please add the following to CrossThreadCopier.h and remove this specialization.

    template&lt;typename T&gt; struct CrossThreadCopier : public CrossThreadCopierBase&lt;WTF::IsConvertibleToInteger&lt;T&gt;::value,
                                                                                 WTF::IsSubclassOfTemplate&lt;typename WTF::RemoveTemplate&lt;T, PassRefPtr&gt;::Type, ThreadSafeShared&gt;::value,
                                                                                 T&gt; {
    };

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:63
&gt; +using namespace WebCore;

Since you have this, s/WebCore::// throughout the rest of this file.

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:89
&gt; +        PassRefPtr&lt;WorkerFileWriterCallbacksBridge&gt; bridge)

Why is this wrapped? (And if you must then perhaps only 4 spaces for this indent).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>306409</commentid>
    <comment_count>26</comment_count>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-11-08 15:33:39 -0800</bug_when>
    <thetext>(In reply to comment #25)
&gt; (From update of attachment 72273 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=72273&amp;action=review
&gt; 
&gt; Some quick 1st pass comments. (I would save these as a draft until done but that feature doesn&apos;t exist.)
&gt; 
&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:52
&gt; &gt; +template&lt;&gt; struct CrossThreadCopierBase&lt;false, false, PassRefPtr&lt;WebKit::WorkerFileWriterCallbacksBridge&gt; &gt; {
&gt; 
&gt; I think the real problem is that the CrossThreadCopier doesn&apos;t recognize ThreadSafeShared class which are passed in a PassRefPtr.
&gt; 
&gt; Please add the following to CrossThreadCopier.h and remove this specialization.
&gt; 
&gt;     template&lt;typename T&gt; struct CrossThreadCopier : public CrossThreadCopierBase&lt;WTF::IsConvertibleToInteger&lt;T&gt;::value,
&gt;                                                                                  WTF::IsSubclassOfTemplate&lt;typename WTF::RemoveTemplate&lt;T, PassRefPtr&gt;::Type, ThreadSafeShared&gt;::value,
&gt;                                                                                  T&gt; {
&gt;     };

That gives me: &quot;error: redefinition of &apos;struct WebCore::CrossThreadCopier&lt;T&gt;&apos;&quot;.
These templates are a bit beyond me...I&apos;m not sure what to do here.
You&apos;re talking about adding this next text, not replacing the version that uses RefPtr instead of your PassRefPtr?

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:63
&gt; &gt; +using namespace WebCore;
&gt; 
&gt; Since you have this, s/WebCore::// throughout the rest of this file.

Done.

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:89
&gt; &gt; +        PassRefPtr&lt;WorkerFileWriterCallbacksBridge&gt; bridge)
&gt; 
&gt; Why is this wrapped? (And if you must then perhaps only 4 spaces for this indent).

Typo; I&apos;ve unwrapped it.  I&apos;ll hold off on re-uploading until we resolve the template issue.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>306413</commentid>
    <comment_count>27</comment_count>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-11-08 15:35:11 -0800</bug_when>
    <thetext>(In reply to comment #26)
&gt; (In reply to comment #25)
&gt; &gt; (From update of attachment 72273 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=72273&amp;action=review
&gt; &gt; 
&gt; &gt; Some quick 1st pass comments. (I would save these as a draft until done but that feature doesn&apos;t exist.)
&gt; &gt; 
&gt; &gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:52
&gt; &gt; &gt; +template&lt;&gt; struct CrossThreadCopierBase&lt;false, false, PassRefPtr&lt;WebKit::WorkerFileWriterCallbacksBridge&gt; &gt; {
&gt; &gt; 
&gt; &gt; I think the real problem is that the CrossThreadCopier doesn&apos;t recognize ThreadSafeShared class which are passed in a PassRefPtr.
&gt; &gt; 
&gt; &gt; Please add the following to CrossThreadCopier.h and remove this specialization.
&gt; &gt; 
&gt; &gt;     template&lt;typename T&gt; struct CrossThreadCopier : public CrossThreadCopierBase&lt;WTF::IsConvertibleToInteger&lt;T&gt;::value,
&gt; &gt;                                                                                  WTF::IsSubclassOfTemplate&lt;typename WTF::RemoveTemplate&lt;T, PassRefPtr&gt;::Type, ThreadSafeShared&gt;::value,
&gt; &gt;                                                                                  T&gt; {
&gt; &gt;     };
&gt; 
&gt; That gives me: &quot;error: redefinition of &apos;struct WebCore::CrossThreadCopier&lt;T&gt;&apos;&quot;.
&gt; These templates are a bit beyond me...I&apos;m not sure what to do here.
&gt; You&apos;re talking about adding this next text, not replacing the version that uses RefPtr instead of your PassRefPtr?

s/next/new/

&gt; 
&gt; &gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:63
&gt; &gt; &gt; +using namespace WebCore;
&gt; &gt; 
&gt; &gt; Since you have this, s/WebCore::// throughout the rest of this file.
&gt; 
&gt; Done.
&gt; 
&gt; &gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:89
&gt; &gt; &gt; +        PassRefPtr&lt;WorkerFileWriterCallbacksBridge&gt; bridge)
&gt; &gt; 
&gt; &gt; Why is this wrapped? (And if you must then perhaps only 4 spaces for this indent).
&gt; 
&gt; Typo; I&apos;ve unwrapped it.  I&apos;ll hold off on re-uploading until we resolve the template issue.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>307057</commentid>
    <comment_count>28</comment_count>
      <attachid>73436</attachid>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-11-09 16:53:19 -0800</bug_when>
    <thetext>Created attachment 73436
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>307058</commentid>
    <comment_count>29</comment_count>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-11-09 16:54:07 -0800</bug_when>
    <thetext>(In reply to comment #28)
&gt; Created an attachment (id=73436) [details]
&gt; Patch

Uploaded anyway, just to keep line numbers current for your next pass.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>307656</commentid>
    <comment_count>30</comment_count>
      <attachid>73436</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-11-10 17:35:16 -0800</bug_when>
    <thetext>Comment on attachment 73436
Patch

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

This looks close. It may need a few changes or at least a few more comments.

And it would b good to include the generic version of the template instead of this specific instance. I&apos;ll tell you what to change in another note and explain it as well.

&gt; WebKit/chromium/src/WorkerAsyncFileSystemChromium.cpp:158
&gt; +            OwnPtr&lt;WorkerAsyncFileWriterChromium&gt; asyncFileWriterChromium = adoptPtr(new WorkerAsyncFileWriterChromium(m_webFileSystem, m_path, m_workerContext, m_client, false));

Typically you&apos;d hide the constructor for WorkerAsyncFileWriterChromium and only expose a create method which returned a PassOwnPtr. (The adoptPtr would only be used in the create method.) Everytime I see it outside of a &quot;create&quot; method it looks wrong (and mildly is).

&gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp:53
&gt; +static const char fileWriterOperationsMode[] = &quot;fileWriterOperationsMode&quot;;

This is unused. Please remove it for now (so when you add it, I&apos;ll be more likely to notice the sync handling code as well).

&gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp:58
&gt; +    ASSERT(!synchronous); // Not implemented yet.

#include &lt;wtf/Assertions.h&gt; (above).

&gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp:84
&gt; +} // namespace

If you include // namespace, add the namespace name, but I think the preference is just to not do this at all.

&gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.h:43
&gt; +class WebFileSystem;

Please indent (4 spaces).

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:159
&gt; +void WorkerFileWriterCallbacksBridge::didWriteOnWorkerThread(ScriptExecutionContext*, WorkerFileWriterCallbacksBridge* bridge, long long length, bool complete)

How do you know that bridge is still alive/ok to use at this point?

(Add a comment somewhere. Likely at the class level to explain how the lifetime works.)

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:161
&gt; +    bridge-&gt;m_clientOnWorkerThread-&gt;didWrite(length, complete);

How do you know that m_clientOnWorkerThread is still alive/ok to use?

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:69
&gt; +//      This calls the original client (m_clientOnWorkerThread).

A very important part about this description would be something to indicate lifetimes of objects/when things die or are known to be alive and how the lifetimes relate.

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:110
&gt; +    // They release a selfRef of the WorkerFileWriterCallbacksBridge.

I don&apos;t see the release of the selfRef.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>307662</commentid>
    <comment_count>31</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2010-11-10 17:54:50 -0800</bug_when>
    <thetext>Here&apos;s the code change needed:

diff --git a/WebCore/platform/CrossThreadCopier.h b/WebCore/platform/CrossThreadCopier.h
index 6f7bb25..5091b3e 100644
--- a/WebCore/platform/CrossThreadCopier.h
+++ b/WebCore/platform/CrossThreadCopier.h
@@ -71,7 +71,7 @@ namespace WebCore {
 
     // Custom copy methods.
     template&lt;typename T&gt; struct CrossThreadCopierBase&lt;false, true, T&gt; {
-        typedef typename WTF::RemoveTemplate&lt;T, RefPtr&gt;::Type RefCountedType;
+        typedef typename WTF::RemoveTemplate&lt;typename WTF::RemoveTemplate&lt;T, RefPtr&gt;::Type, PassRefPtr&gt;::Type RefCountedType;
         typedef PassRefPtr&lt;RefCountedType&gt; Type;
         static Type copy(const T&amp; refPtr)
         {
@@ -113,7 +113,8 @@ namespace WebCore {
     };
 
     template&lt;typename T&gt; struct CrossThreadCopier : public CrossThreadCopierBase&lt;WTF::IsConvertibleToInteger&lt;T&gt;::value,
-                                                                                 WTF::IsSubclassOfTemplate&lt;typename WTF::RemoveTemplate&lt;T, RefPtr&gt;::Type, ThreadSafeShared&gt;::value,
+                                                                                 WTF::IsSubclassOfTemplate&lt;typename WTF::RemoveTemplate&lt;T, RefPtr&gt;::Type, ThreadSafeShared&gt;::value
+                                                                                 || WTF::IsSubclassOfTemplate&lt;typename WTF::RemoveTemplate&lt;T, PassRefPtr&gt;::Type, ThreadSafeShared&gt;::value,
                                                                                  T&gt; {
     };




Explanation:

The change in CrossThreadCopier simply adds this line
   WTF::IsSubclassOfTemplate&lt;typename WTF::RemoveTemplate&lt;T, PassRefPtr&gt;::Type, ThreadSafeShared&gt;::value

This is similar to the previous line with PassRefPtr substituted for RefPtr. Here&apos;s the clause broken down:

   &quot;typename WTF::RemoveTemplate&lt;T, PassRefPtr&gt;::Type&quot; says take the given type and remove &quot;PassRefPtr&quot; from around it (if it is there). Then give me that type.

 so if T is PassRefPtr&lt;Foo&gt;, we get

   WTF::IsSubclassOfTemplate&lt;Foo, ThreadSafeShared&gt;::value

Now it says does Foo derive from the template ThreadSafeShared? (Think &quot;class Foo : public ThreadSafeShared&lt;Foo&gt;&quot;, but this would also be true for &quot;class Foo : public ThreadSafeShared&lt;Bar&gt;&quot;.)

This gets or&apos;ed with the previous expression so the second parameter to CrossThreadCopierBase is the OR of these two clauses.

Alternately, I could have consolidated them like this:
    WTF::IsSubclassOfTemplate&lt;typename WTF::RemoveTemplate&lt;typename WTF::RemoveTemplate&lt;T, RefPtr&gt;::Type, PassRefPtr&gt;::Type, ThreadSafeShared&gt;::value
but that is completely unreadable (imo) as opposed pretty hard to read.



For this change:
-        typedef typename WTF::RemoveTemplate&lt;T, RefPtr&gt;::Type RefCountedType;
+        typedef typename WTF::RemoveTemplate&lt;typename WTF::RemoveTemplate&lt;T, RefPtr&gt;::Type, PassRefPtr&gt;::Type RefCountedType;
Thinking about this more, it is approaching being unreadable. I would break it up into two lines like this (which I just tried and it worked):

  typedef typename WTF::RemoveTemplate&lt;T, RefPtr&gt;::Type TypeWithoutRefPtr;
  typedef typename WTF::RemoveTemplate&lt;TypeWithoutRefPtr, PassRefPtr&gt;::Type RefCountedType;

The first line is like it was before and it converts RefPtr&lt;Foo&gt; to Foo (and Foo to Foo).
The second line does the same for PassRefPtr.

The definitions for all of these things are in JavaScriptCore/wtf/TypeTraits.h They will bend your brain a little bit but hopefully in a fun way and if work to understand them, you&apos;ll have a very good understanding of templates (imo).

btw, although I made this sound easy, it did take me a little bit to modify this code appropriately. (I missed the change to CrossThreadCopierBase and I got one of those famous template errors that is very hard to read.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>308253</commentid>
    <comment_count>32</comment_count>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-11-11 16:27:54 -0800</bug_when>
    <thetext>(In reply to comment #30)
&gt; (From update of attachment 73436 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=73436&amp;action=review
&gt; 
&gt; This looks close. It may need a few changes or at least a few more comments.
&gt; 
&gt; And it would b good to include the generic version of the template instead of this specific instance. I&apos;ll tell you what to change in another note and explain it as well.

Done.  Thanks for the explanation.  I need to go read it about 3 more times.

&gt; &gt; WebKit/chromium/src/WorkerAsyncFileSystemChromium.cpp:158
&gt; &gt; +            OwnPtr&lt;WorkerAsyncFileWriterChromium&gt; asyncFileWriterChromium = adoptPtr(new WorkerAsyncFileWriterChromium(m_webFileSystem, m_path, m_workerContext, m_client, false));
&gt; 
&gt; Typically you&apos;d hide the constructor for WorkerAsyncFileWriterChromium and only expose a create method which returned a PassOwnPtr. (The adoptPtr would only be used in the create method.) Everytime I see it outside of a &quot;create&quot; method it looks wrong (and mildly is).

Done.

&gt; &gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp:53
&gt; &gt; +static const char fileWriterOperationsMode[] = &quot;fileWriterOperationsMode&quot;;
&gt; 
&gt; This is unused. Please remove it for now (so when you add it, I&apos;ll be more likely to notice the sync handling code as well).

Removed.

&gt; &gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp:58
&gt; &gt; +    ASSERT(!synchronous); // Not implemented yet.
&gt; 
&gt; #include &lt;wtf/Assertions.h&gt; (above).

Added.

&gt; &gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.cpp:84
&gt; &gt; +} // namespace
&gt; 
&gt; If you include // namespace, add the namespace name, but I think the preference is just to not do this at all.

Removed.

&gt; &gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.h:43
&gt; &gt; +class WebFileSystem;
&gt; 
&gt; Please indent (4 spaces).

Done.

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:159
&gt; &gt; +void WorkerFileWriterCallbacksBridge::didWriteOnWorkerThread(ScriptExecutionContext*, WorkerFileWriterCallbacksBridge* bridge, long long length, bool complete)
&gt; 
&gt; How do you know that bridge is still alive/ok to use at this point?
&gt; 
&gt; (Add a comment somewhere. Likely at the class level to explain how the lifetime works.)

Switched to a PassRefPtr instead.

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:161
&gt; &gt; +    bridge-&gt;m_clientOnWorkerThread-&gt;didWrite(length, complete);
&gt; 
&gt; How do you know that m_clientOnWorkerThread is still alive/ok to use?

Commented.

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:69
&gt; &gt; +//      This calls the original client (m_clientOnWorkerThread).
&gt; 
&gt; A very important part about this description would be something to indicate lifetimes of objects/when things die or are known to be alive and how the lifetimes relate.

Added a paragraph.

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:110
&gt; &gt; +    // They release a selfRef of the WorkerFileWriterCallbacksBridge.
&gt; 
&gt; I don&apos;t see the release of the selfRef.

Deleted the obsolete comment.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>308257</commentid>
    <comment_count>33</comment_count>
      <attachid>73680</attachid>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-11-11 16:33:36 -0800</bug_when>
    <thetext>Created attachment 73680
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>308264</commentid>
    <comment_count>34</comment_count>
      <attachid>73680</attachid>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-11-11 16:47:02 -0800</bug_when>
    <thetext>Comment on attachment 73680
Patch

Kinuko just pointed out an improvement; I&apos;ll upload a patch in a few minutes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>308268</commentid>
    <comment_count>35</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2010-11-11 16:51:42 -0800</bug_when>
    <thetext>(I tend to do my code reviews in multiple passes.)

These are comments from my &quot;nit&quot; pass. I won&apos;t r- for any of these, but I hope you will fix them before landing the patch.

Now, I&apos;m beginning my &quot;overview&quot; pass where I will work to understand the patch, the flow of the data and object lifetimes.

&gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.h:37
&gt; +#include &quot;WebFileError.h&quot;

Do you need this include? (Please use fwd declarations whenever possible.)

&gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.h:38
&gt; +#include &quot;WebFileWriterClient.h&quot;

Do you need this include?

&gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.h:39
&gt; +#include &lt;wtf/OwnPtr.h&gt;

Do you need this include?

&gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.h:57
&gt; +    static PassOwnPtr&lt;WorkerAsyncFileWriterChromium&gt; create(WebKit::WebFileSystem* webFileSystem, const String&amp; path, WorkerContext* workerContext, AsyncFileWriterClient* client, bool synchronous)

Since the callers pass in a true/false value for synchronous (as opposed to a variable name), it is pretty opaque at the calling site what the parameter is about.

In these cases, WebKit style is to use an enum instead of a bool (which you may convert to an bool inside the constructor).

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:36
&gt; +#include &quot;PlatformString.h&quot;

Not needed. Used fwd decl.

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:37
&gt; +#include &quot;WebFileError.h&quot;

Do you need this include?

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:42
&gt; +#include &lt;wtf/Threading.h&gt;

Use &lt;wtf/ThreadSafeShared.h&gt; instead.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>308294</commentid>
    <comment_count>36</comment_count>
      <attachid>73680</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-11-11 17:30:52 -0800</bug_when>
    <thetext>Comment on attachment 73680
Patch

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

OK this looks good. The lifetimes look good and the functionality seems fine.

Look forward to seeing the final patch you put up.

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:100
&gt; +    bridge-&gt;m_writer = adoptPtr(webKitClient()-&gt;fileSystem()-&gt;createFileWriter(path, bridge.get()));

Why are we doing adoptPtr here? (Always a bad sign outside of a ::create method and outside of the class itself).

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:146
&gt; +// We know m_clientOnWorkerThread is still valid because it is only cleared on the context thread, and because we check in runTaskOnMainThread before calling any of these methods.

s/runTaskOnMainThread/runTaskOnWorkerThread/

Ah I suggested this type of thing in the last bridge that I reviewed, so I should have seen it but I&apos;m glad you added this comment because it helped me to look in the correct place much faster and now I get it.

Basically runTaskOnMainThread and runTaskOnWorkerThread guard against running after shutdown has been started by checking the variables set in shutdownOnMainThread and postShutdownToMainThread respectively (which are run on the same thread).

These bridges are starting to follow a pattern. If you think of a way of pulling out this common pattern, that would be cool (but doesn&apos;t block this change at all). Just something that we can think about.

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:59
&gt; +// the context thread.  The responses through the WebFileWriterClient interface

Single spaces after . in comments is typical WebKit style (though not documented currently).

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:71
&gt; +// The bridge object is refcounted, so that it doesn&apos;t get deleted while there

Now it does :) and that makes it a lot easier to check that it is correct.

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:123
&gt; +    void initWebFileWriter();

This doesn&apos;t seem to exist.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>308303</commentid>
    <comment_count>37</comment_count>
      <attachid>73680</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-11-11 17:37:42 -0800</bug_when>
    <thetext>Comment on attachment 73680
Patch

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

&gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:188
&gt; +    m_proxy-&gt;postTaskForModeToWorkerContext(createCallbackTask(&amp;runTaskOnWorkerThread, this, task), &quot;&quot;);

s/&quot;&quot;/WorkerRunLoop::defaultMode()/</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>310014</commentid>
    <comment_count>38</comment_count>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-11-16 16:28:49 -0800</bug_when>
    <thetext>(In reply to comment #35)
&gt; (I tend to do my code reviews in multiple passes.)
&gt; 
&gt; These are comments from my &quot;nit&quot; pass. I won&apos;t r- for any of these, but I hope you will fix them before landing the patch.
&gt; 
&gt; Now, I&apos;m beginning my &quot;overview&quot; pass where I will work to understand the patch, the flow of the data and object lifetimes.
&gt; 
&gt; &gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.h:37
&gt; &gt; +#include &quot;WebFileError.h&quot;
&gt; 
&gt; Do you need this include? (Please use fwd declarations whenever possible.)
&gt; 
&gt; &gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.h:38
&gt; &gt; +#include &quot;WebFileWriterClient.h&quot;
&gt; 
&gt; Do you need this include?
&gt; 
&gt; &gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.h:39
&gt; &gt; +#include &lt;wtf/OwnPtr.h&gt;
&gt; 
&gt; Do you need this include?

Removed a bunch of includes.

&gt; &gt; WebKit/chromium/src/WorkerAsyncFileWriterChromium.h:57
&gt; &gt; +    static PassOwnPtr&lt;WorkerAsyncFileWriterChromium&gt; create(WebKit::WebFileSystem* webFileSystem, const String&amp; path, WorkerContext* workerContext, AsyncFileWriterClient* client, bool synchronous)
&gt; 
&gt; Since the callers pass in a true/false value for synchronous (as opposed to a variable name), it is pretty opaque at the calling site what the parameter is about.
&gt; 
&gt; In these cases, WebKit style is to use an enum instead of a bool (which you may convert to an bool inside the constructor).

Changed to enum.

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:36
&gt; &gt; +#include &quot;PlatformString.h&quot;
&gt; 
&gt; Not needed. Used fwd decl.

Done.

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:37
&gt; &gt; +#include &quot;WebFileError.h&quot;
&gt; 
&gt; Do you need this include?

Yes; it&apos;s an enum, not a class.

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:42
&gt; &gt; +#include &lt;wtf/Threading.h&gt;
&gt; 
&gt; Use &lt;wtf/ThreadSafeShared.h&gt; instead.

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>310016</commentid>
    <comment_count>39</comment_count>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-11-16 16:30:51 -0800</bug_when>
    <thetext>(In reply to comment #36)
&gt; (From update of attachment 73680 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=73680&amp;action=review
&gt; 
&gt; OK this looks good. The lifetimes look good and the functionality seems fine.
&gt; 
&gt; Look forward to seeing the final patch you put up.
&gt; 
&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:100
&gt; &gt; +    bridge-&gt;m_writer = adoptPtr(webKitClient()-&gt;fileSystem()-&gt;createFileWriter(path, bridge.get()));
&gt; 
&gt; Why are we doing adoptPtr here? (Always a bad sign outside of a ::create method and outside of the class itself).

It was a bug; removed.

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.cpp:146
&gt; &gt; +// We know m_clientOnWorkerThread is still valid because it is only cleared on the context thread, and because we check in runTaskOnMainThread before calling any of these methods.
&gt; 
&gt; s/runTaskOnMainThread/runTaskOnWorkerThread/

Fixed.

&gt; Ah I suggested this type of thing in the last bridge that I reviewed, so I should have seen it but I&apos;m glad you added this comment because it helped me to look in the correct place much faster and now I get it.
&gt; 
&gt; Basically runTaskOnMainThread and runTaskOnWorkerThread guard against running after shutdown has been started by checking the variables set in shutdownOnMainThread and postShutdownToMainThread respectively (which are run on the same thread).

Yup.

&gt; These bridges are starting to follow a pattern. If you think of a way of pulling out this common pattern, that would be cool (but doesn&apos;t block this change at all). Just something that we can think about.

Hmm...I&apos;ll ponder it, but nothing immediately comes to mind.

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:59
&gt; &gt; +// the context thread.  The responses through the WebFileWriterClient interface
&gt; 
&gt; Single spaces after . in comments is typical WebKit style (though not documented currently).

Done.

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:71
&gt; &gt; +// The bridge object is refcounted, so that it doesn&apos;t get deleted while there
&gt; 
&gt; Now it does :) and that makes it a lot easier to check that it is correct.

Uh, you mean &quot;now it doesn&apos;t&quot;, right?

&gt; &gt; WebKit/chromium/src/WorkerFileWriterCallbacksBridge.h:123
&gt; &gt; +    void initWebFileWriter();
&gt; 
&gt; This doesn&apos;t seem to exist.

Removed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>310029</commentid>
    <comment_count>40</comment_count>
      <attachid>74061</attachid>
    <who name="Eric U.">ericu</who>
    <bug_when>2010-11-16 16:44:56 -0800</bug_when>
    <thetext>Created attachment 74061
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>310217</commentid>
    <comment_count>41</comment_count>
      <attachid>74061</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-11-17 05:30:39 -0800</bug_when>
    <thetext>Comment on attachment 74061
Patch

Clearing flags on attachment: 74061

Committed r72200: &lt;http://trac.webkit.org/changeset/72200&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>310218</commentid>
    <comment_count>42</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-11-17 05:30:48 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>70788</attachid>
            <date>2010-10-14 15:31:09 -0700</date>
            <delta_ts>2010-10-15 14:53:48 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-47681-20101014153107.patch</filename>
            <type>text/plain</type>
            <size>46272</size>
            <attacher name="Eric U.">ericu</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2OTgwNSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjggQEAKKzIwMTAtMTAtMTQgIEVyaWMgVWhyaGFuZSAgPGVyaWN1QGNocm9taXVt
Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBb
Q2hyb21pdW1dIGltcGxlbWVudGF0aW9uIG9mIGFzeW5jIEZpbGVXcml0ZXIgZm9yIHdvcmtlcnMK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ3NjgxCisK
KyAgICAgICAgSW5pdGlhbCB0ZXN0cyBhcmUgaW4gYSBzZXBhcmF0ZSBjaGFuZ2VsaXN0LgorCisg
ICAgICAgICogZmlsZWFwaS9GaWxlSW5mby5oOiBBZGRlZDsgdXNlZCB0byByZXR1cm4gZnVsbCBt
ZXRhZGF0YSBmcm9tIGdldE1ldGFkYXRhIGNhbGxzLgorCisgICAgICAgIEJ1aWxkIGZpbGVzIG1v
ZGlmaWVkIHRvIGFkZCBGaWxlSW5mby5oLgorICAgICAgICAqIFdlYkNvcmUucHJvCisgICAgICAg
ICogR05VbWFrZWZpbGUuYW0KKyAgICAgICAgKiBXZWJDb3JlLmd5cGkKKyAgICAgICAgKiBXZWJD
b3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJvai9X
ZWJDb3JlLnZjcHJvagorCisgICAgICAgIFRoZSByZXN0IG9mIHRoZSBjaGFuZ2VzIGhlcmUganVz
dCBwYXNzIHRoZSBuZXcgRmlsZUluZm8gb2JqZWN0IHRocm91Z2ggdGhlIGNhbGxzIHRoYXQgdXNl
ZCB0byB0YWtlIGEgbW9kaWZpY2F0aW9uIHRpbWUuCisgICAgICAgICogZmlsZWFwaS9GaWxlU3lz
dGVtQ2FsbGJhY2tzLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkZpbGVTeXN0ZW1DYWxsYmFja3NC
YXNlOjpkaWRSZWFkTWV0YWRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6TWV0YWRhdGFDYWxsYmFj
a3M6OmRpZFJlYWRNZXRhZGF0YSk6CisgICAgICAgICogZmlsZWFwaS9GaWxlU3lzdGVtQ2FsbGJh
Y2tzLmg6CisgICAgICAgICogcGxhdGZvcm0vQXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzLmg6CisK
IDIwMTAtMTAtMTQgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBLZW5uZXRoIFJ1c3NlbGwuCkluZGV4OiBXZWJDb3JlL0dOVW1ha2VmaWxlLmFtCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvR05VbWFrZWZpbGUuYW0JKHJldmlzaW9uIDY5NzI0KQorKysg
V2ViQ29yZS9HTlVtYWtlZmlsZS5hbQkod29ya2luZyBjb3B5KQpAQCAtMTQwNSw2ICsxNDA1LDcg
QEAgd2ViY29yZV9zb3VyY2VzICs9IFwKIAlXZWJDb3JlL2ZpbGVhcGkvRmlsZUVycm9yLmggXAog
CVdlYkNvcmUvZmlsZWFwaS9GaWxlRXhjZXB0aW9uLmggXAogCVdlYkNvcmUvZmlsZWFwaS9GaWxl
LmggXAorCVdlYkNvcmUvZmlsZWFwaS9GaWxlSW5mby5oIFwKIAlXZWJDb3JlL2ZpbGVhcGkvRmls
ZUxpc3QuY3BwIFwKIAlXZWJDb3JlL2ZpbGVhcGkvRmlsZUxpc3QuaCBcCiAJV2ViQ29yZS9maWxl
YXBpL0ZpbGVSZWFkZXIuY3BwIFwKSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS5neXBpCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS5neXBpCShyZXZpc2lvbiA2OTcyNCkKKysrIFdlYkNvcmUv
V2ViQ29yZS5neXBpCSh3b3JraW5nIGNvcHkpCkBAIC0xNDk1LDYgKzE0OTUsNyBAQAogICAgICAg
ICAgICAgJ2ZpbGVhcGkvRmlsZUVudHJ5U3luYy5oJywKICAgICAgICAgICAgICdmaWxlYXBpL0Zp
bGVFcnJvci5oJywKICAgICAgICAgICAgICdmaWxlYXBpL0ZpbGVFeGNlcHRpb24uaCcsCisgICAg
ICAgICAgICAnZmlsZWFwaS9GaWxlSW5mby5oJywKICAgICAgICAgICAgICdmaWxlYXBpL0ZpbGVM
aXN0LmNwcCcsCiAgICAgICAgICAgICAnZmlsZWFwaS9GaWxlTGlzdC5oJywKICAgICAgICAgICAg
ICdmaWxlYXBpL0ZpbGVSZWFkZXIuY3BwJywKSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS5wcm8KPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLnBybwkocmV2aXNpb24gNjk3MjQpCisrKyBXZWJD
b3JlL1dlYkNvcmUucHJvCSh3b3JraW5nIGNvcHkpCkBAIC0yOTk0LDYgKzI5OTQsNyBAQCBjb250
YWlucyhERUZJTkVTLCBFTkFCTEVfRklMRV9TWVNURU09MSkgCiAgICAgICAgIGZpbGVhcGkvRmls
ZUNhbGxiYWNrLmggXAogICAgICAgICBmaWxlYXBpL0ZpbGVFbnRyeS5oIFwKICAgICAgICAgZmls
ZWFwaS9GaWxlRW50cnlTeW5jLmggXAorICAgICAgICBmaWxlYXBpL0ZpbGVJbmZvLmggXAogICAg
ICAgICBmaWxlYXBpL0ZpbGVTeXN0ZW1DYWxsYmFjay5oIFwKICAgICAgICAgZmlsZWFwaS9GaWxl
U3lzdGVtQ2FsbGJhY2tzLmggXAogICAgICAgICBmaWxlYXBpL0ZpbGVXcml0ZXIuaCBcCkluZGV4
OiBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHJldmlzaW9uIDY5NzI0KQorKysg
V2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagkod29ya2luZyBjb3B5KQpAQCAt
NDgzMzEsNiArNDgzMzEsMTAgQEAKIAkJCQk+DQogCQkJPC9GaWxlPg0KIAkJCTxGaWxlDQorCQkJ
CVJlbGF0aXZlUGF0aD0iLi5cZmlsZWFwaVxGaWxlSW5mby5oIg0KKwkJCQk+DQorCQkJPC9GaWxl
Pg0KKwkJCTxGaWxlDQogCQkJCVJlbGF0aXZlUGF0aD0iLi5caHRtbFxGaWxlSW5wdXRUeXBlLmNw
cCINCiAJCQkJPg0KIAkJCTwvRmlsZT4NCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gNjk3MjQpCisrKyBXZWJDb3JlL1dlYkNvcmUueGNv
ZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtOTMwLDYgKzkzMCw3IEBA
CiAJCTQ2MTRBMUZFMEIyM0E4RDYwMDQ0NkUxQyAvKiBjb3B5Q3Vyc29yLnBuZyBpbiBSZXNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDYxNEExRkQwQjIzQThENjAw
NDQ2RTFDIC8qIGNvcHlDdXJzb3IucG5nICovOyB9OwogCQk0NjRFQTI3MzBCOEEzNTBCMDBBOEU2
RTMgLyogY3Jvc3NIYWlyQ3Vyc29yLnBuZyBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gNDY0RUEyNzEwQjhBMzUwQjAwQThFNkUzIC8qIGNyb3NzSGFpckN1
cnNvci5wbmcgKi87IH07CiAJCTQ2NEVBMjc0MEI4QTM1MEIwMEE4RTZFMyAvKiBub3RBbGxvd2Vk
Q3Vyc29yLnBuZyBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gNDY0RUEyNzIwQjhBMzUwQjAwQThFNkUzIC8qIG5vdEFsbG93ZWRDdXJzb3IucG5nICovOyB9
OworCQk0Njg5RjFBRjEyNjdCQUUxMDBFOEQzODAgLyogRmlsZUluZm8uaCBpbiBIZWFkZXJzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ2ODlGMUFFMTI2N0JBRTEwMEU4RDM4
MCAvKiBGaWxlSW5mby5oICovOyB9OwogCQk0NkJEMTZFMzBCMjc5NDczMDAxRjA4MzkgLyogbm9u
ZUN1cnNvci5wbmcgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IDQ2QkQxNkUyMEIyNzk0NzMwMDFGMDgzOSAvKiBub25lQ3Vyc29yLnBuZyAqLzsgfTsKIAkJ
NDZENEYyNDkwQUY5N0U4MTAwMzUzODVBIC8qIGNlbGxDdXJzb3IucG5nIGluIFJlc291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0NkQ0RjI0NjBBRjk3RTgxMDAzNTM4
NUEgLyogY2VsbEN1cnNvci5wbmcgKi87IH07CiAJCTQ2RDRGMjRBMEFGOTdFODEwMDM1Mzg1QSAv
KiBjb250ZXh0TWVudUN1cnNvci5wbmcgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDQ2RDRGMjQ3MEFGOTdFODEwMDM1Mzg1QSAvKiBjb250ZXh0TWVudUN1
cnNvci5wbmcgKi87IH07CkBAIC02OTU3LDYgKzY5NTgsNyBAQAogCQk0NjE0QTFGRDBCMjNBOEQ2
MDA0NDZFMUMgLyogY29weUN1cnNvci5wbmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
bGFzdEtub3duRmlsZVR5cGUgPSBpbWFnZS5wbmc7IHBhdGggPSBjb3B5Q3Vyc29yLnBuZzsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNDY0RUEyNzEwQjhBMzUwQjAwQThFNkUzIC8qIGNy
b3NzSGFpckN1cnNvci5wbmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3du
RmlsZVR5cGUgPSBpbWFnZS5wbmc7IHBhdGggPSBjcm9zc0hhaXJDdXJzb3IucG5nOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwogCQk0NjRFQTI3MjBCOEEzNTBCMDBBOEU2RTMgLyogbm90QWxs
b3dlZEN1cnNvci5wbmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmls
ZVR5cGUgPSBpbWFnZS5wbmc7IHBhdGggPSBub3RBbGxvd2VkQ3Vyc29yLnBuZzsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDY4OUYxQUUxMjY3QkFFMTAwRThEMzgwIC8qIEZpbGVJbmZv
LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEZpbGVJbmZvLmg7IHBhdGggPSBm
aWxlYXBpL0ZpbGVJbmZvLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTQ2QkQxNkUy
MEIyNzk0NzMwMDFGMDgzOSAvKiBub25lQ3Vyc29yLnBuZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGltYWdlLnBuZzsgcGF0aCA9IG5vbmVDdXJzb3Iu
cG5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk0NkQ0RjI0NjBBRjk3RTgxMDAzNTM4
NUEgLyogY2VsbEN1cnNvci5wbmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtu
b3duRmlsZVR5cGUgPSBpbWFnZS5wbmc7IHBhdGggPSBjZWxsQ3Vyc29yLnBuZzsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNDZENEYyNDcwQUY5N0U4MTAwMzUzODVBIC8qIGNvbnRleHRN
ZW51Q3Vyc29yLnBuZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxl
VHlwZSA9IGltYWdlLnBuZzsgcGF0aCA9IGNvbnRleHRNZW51Q3Vyc29yLnBuZzsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTE0OTA3LDYgKzE0OTA5LDcgQEAKIAkJCQk4OTNDNDdGRjEy
NDhCRDM5MDAyQjNEODYgLyogRmlsZUVudHJ5U3luYy5oICovLAogCQkJCTk3NkQ2QzY0MTIyQjhB
M0QwMDFGRDFGNyAvKiBGaWxlRXJyb3IuaCAqLywKIAkJCQkyRURGMzY5RTEyMkM5NEM4MDAyRjdE
NEUgLyogRmlsZUV4Y2VwdGlvbi5oICovLAorCQkJCTQ2ODlGMUFFMTI2N0JBRTEwMEU4RDM4MCAv
KiBGaWxlSW5mby5oICovLAogCQkJCTk3NkQ2QzY2MTIyQjhBM0QwMDFGRDFGNyAvKiBGaWxlTGlz
dC5jcHAgKi8sCiAJCQkJOTc2RDZDNjcxMjJCOEEzRDAwMUZEMUY3IC8qIEZpbGVMaXN0LmggKi8s
CiAJCQkJOTc2RDZDNjkxMjJCOEEzRDAwMUZEMUY3IC8qIEZpbGVSZWFkZXIuY3BwICovLApAQCAt
MjEwNjksNiArMjEwNzIsNyBAQAogCQkJCTkzRjE5OUVEMDgyNDVFNTkwMDFFOUFCQyAvKiBYU0xU
UHJvY2Vzc29yLmggaW4gSGVhZGVycyAqLywKIAkJCQlFMUJFNTEyRTBDRjZDNTEyMDAyRUE5NTkg
LyogWFNMVFVuaWNvZGVTb3J0LmggaW4gSGVhZGVycyAqLywKIAkJCQk5N0RENEQ4NzBGREY0RDZF
MDBFQ0Y5QTQgLyogWFNTQXVkaXRvci5oIGluIEhlYWRlcnMgKi8sCisJCQkJNDY4OUYxQUYxMjY3
QkFFMTAwRThEMzgwIC8qIEZpbGVJbmZvLmggaW4gSGVhZGVycyAqLywKIAkJCSk7CiAJCQlydW5P
bmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKSW5kZXg6IFdlYkNvcmUv
ZmlsZWFwaS9GaWxlSW5mby5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZmlsZWFwaS9GaWxlSW5m
by5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9maWxlYXBpL0ZpbGVJbmZvLmgJKHJldmlzaW9u
IDApCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBh
cmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29w
eXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0
aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0
b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZy
b20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1p
c3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hU
IEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgor
ICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEZpbGVJbmZvX2gKKyNkZWZpbmUgRmlsZUluZm9f
aAorCisjaWYgRU5BQkxFKEZJTEVfU1lTVEVNKQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0
cnVjdCBGaWxlSW5mbyB7CisgICAgLy8gVGhlIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhl
IGZpbGUsIGluIHNlY29uZHMuCisgICAgLy8gVGhlIHZhbHVlIDAuMCBtZWFucyB0aGF0IHRoZSB0
aW1lIGlzIG5vdCBzZXQuCisgICAgZG91YmxlIG1vZGlmaWNhdGlvblRpbWU7CisKKyAgICAvLyBU
aGUgbGVuZ3RoIG9mIHRoZSBmaWxlIGluIGJ5dGVzLgorICAgIC8vIFRoZSB2YWx1ZSAtMSBtZWFu
cyB0aGF0IHRoZSBsZW5ndGggaXMgbm90IHNldC4KKyAgICBsb25nIGxvbmcgbGVuZ3RoOworCisg
ICAgZW51bSBUeXBlIHsKKyAgICAgICAgVHlwZVVua25vd24gPSAwLAorICAgICAgICBUeXBlRmls
ZSwKKyAgICAgICAgVHlwZURpcmVjdG9yeQorICAgIH07CisKKyAgICBUeXBlIHR5cGU7CisKKyAg
ICBGaWxlSW5mbygpIDogbW9kaWZpY2F0aW9uVGltZSgwLjApLCBsZW5ndGgoLTEpLCB0eXBlKFR5
cGVVbmtub3duKSB7IH0KK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8v
IEVOQUJMRShGSUxFX1NZU1RFTSkKKworI2VuZGlmIC8vIERPTUZpbGVTeXN0ZW1faApJbmRleDog
V2ViQ29yZS9maWxlYXBpL0ZpbGVTeXN0ZW1DYWxsYmFja3MuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvZmlsZWFwaS9GaWxlU3lzdGVtQ2FsbGJhY2tzLmNwcAkocmV2aXNpb24gNjk3MjQpCisr
KyBXZWJDb3JlL2ZpbGVhcGkvRmlsZVN5c3RlbUNhbGxiYWNrcy5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTc3LDcgKzc3LDcgQEAgdm9pZCBGaWxlU3lzdGVtQ2FsbGJhY2tzQmFzZTo6ZGlkT3BlbkZp
bAogICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwogfQogCi12b2lkIEZpbGVTeXN0ZW1DYWxsYmFj
a3NCYXNlOjpkaWRSZWFkTWV0YWRhdGEoZG91YmxlKQordm9pZCBGaWxlU3lzdGVtQ2FsbGJhY2tz
QmFzZTo6ZGlkUmVhZE1ldGFkYXRhKGNvbnN0IEZpbGVJbmZvJikKIHsKICAgICAvLyBFYWNoIHN1
YmNsYXNzIG11c3QgaW1wbGVtZW50IGFuIGFwcHJvcHJpYXRlIG9uZS4KICAgICBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsKQEAgLTIwNSwxMCArMjA1LDEwIEBAIE1ldGFkYXRhQ2FsbGJhY2tzOjpNZXRh
ZGF0YUNhbGxiYWNrcyhQYXMKIHsKIH0KIAotdm9pZCBNZXRhZGF0YUNhbGxiYWNrczo6ZGlkUmVh
ZE1ldGFkYXRhKGRvdWJsZSBtb2RpZmljYXRpb25UaW1lKQordm9pZCBNZXRhZGF0YUNhbGxiYWNr
czo6ZGlkUmVhZE1ldGFkYXRhKGNvbnN0IEZpbGVJbmZvJiBpbmZvKQogewogICAgIGlmIChtX3N1
Y2Nlc3NDYWxsYmFjaykKLSAgICAgICAgbV9zdWNjZXNzQ2FsbGJhY2stPmhhbmRsZUV2ZW50KE1l
dGFkYXRhOjpjcmVhdGUobW9kaWZpY2F0aW9uVGltZSkuZ2V0KCkpOworICAgICAgICBtX3N1Y2Nl
c3NDYWxsYmFjay0+aGFuZGxlRXZlbnQoTWV0YWRhdGE6OmNyZWF0ZShpbmZvLm1vZGlmaWNhdGlv
blRpbWUpLmdldCgpKTsKICAgICBtX3N1Y2Nlc3NDYWxsYmFjay5jbGVhcigpOwogfQogCkluZGV4
OiBXZWJDb3JlL2ZpbGVhcGkvRmlsZVN5c3RlbUNhbGxiYWNrcy5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvZmlsZWFwaS9GaWxlU3lzdGVtQ2FsbGJhY2tzLmgJKHJldmlzaW9uIDY5NzI0KQorKysg
V2ViQ29yZS9maWxlYXBpL0ZpbGVTeXN0ZW1DYWxsYmFja3MuaAkod29ya2luZyBjb3B5KQpAQCAt
MzQsNiArMzQsNyBAQAogI2lmIEVOQUJMRShGSUxFX1NZU1RFTSkKIAogI2luY2x1ZGUgIkFzeW5j
RmlsZVN5c3RlbUNhbGxiYWNrcy5oIgorI2luY2x1ZGUgIkZpbGVJbmZvLmgiCiAjaW5jbHVkZSAi
UGxhdGZvcm1TdHJpbmcuaCIKICNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgogI2luY2x1ZGUg
PHd0Zi9WZWN0b3IuaD4KQEAgLTY1LDcgKzY2LDcgQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9p
ZCBkaWRPcGVuRmlsZVN5c3RlbShjb25zdCBTdHJpbmcmIG5hbWUsIFBhc3NPd25QdHI8QXN5bmNG
aWxlU3lzdGVtPik7CiAKICAgICAvLyBGb3IgTWV0YWRhdGFDYWxsYmFja3MuCi0gICAgdmlydHVh
bCB2b2lkIGRpZFJlYWRNZXRhZGF0YShkb3VibGUgbW9kaWZpY2F0aW9uVGltZSk7CisgICAgdmly
dHVhbCB2b2lkIGRpZFJlYWRNZXRhZGF0YShjb25zdCBGaWxlSW5mbyYpOwogCiAgICAgLy8gRm9y
IEVudHJpZXNDYWxsYmFja3MuIGRpZFJlYWREaXJlY3RvcnlFbnRyeSBpcyBjYWxsZWQgZWFjaCB0
aW1lIHRoZSBBUEkgcmVhZHMgYW4gZW50cnksIGFuZCBkaWRSZWFkRGlyZWN0b3J5RG9uZSBpcyBj
YWxsZWQgd2hlbiBhIGNodW5rIG9mIGVudHJpZXMgaGF2ZSBiZWVuIHJlYWQgKGkuZS4gZ29vZCB0
aW1lIHRvIGNhbGwgYmFjayB0byB0aGUgYXBwbGljYXRpb24pLiAgSWYgaGFzTW9yZSBpcyB0cnVl
IHRoZXJlIGNhbiBiZSBtb3JlIGNodW5rcy4KICAgICB2aXJ0dWFsIHZvaWQgZGlkUmVhZERpcmVj
dG9yeUVudHJ5KGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCBpc0RpcmVjdG9yeSk7CkBAIC0xMjUs
NyArMTI2LDcgQEAgcHJpdmF0ZToKIGNsYXNzIE1ldGFkYXRhQ2FsbGJhY2tzIDogcHVibGljIEZp
bGVTeXN0ZW1DYWxsYmFja3NCYXNlIHsKIHB1YmxpYzoKICAgICBzdGF0aWMgUGFzc093blB0cjxN
ZXRhZGF0YUNhbGxiYWNrcz4gY3JlYXRlKFBhc3NSZWZQdHI8TWV0YWRhdGFDYWxsYmFjaz4sIFBh
c3NSZWZQdHI8RXJyb3JDYWxsYmFjaz4pOwotICAgIHZpcnR1YWwgdm9pZCBkaWRSZWFkTWV0YWRh
dGEoZG91YmxlIG1vZGlmaWNhdGlvblRpbWUpOworICAgIHZpcnR1YWwgdm9pZCBkaWRSZWFkTWV0
YWRhdGEoY29uc3QgRmlsZUluZm8mKTsKIAogcHJpdmF0ZToKICAgICBNZXRhZGF0YUNhbGxiYWNr
cyhQYXNzUmVmUHRyPE1ldGFkYXRhQ2FsbGJhY2s+LCBQYXNzUmVmUHRyPEVycm9yQ2FsbGJhY2s+
KTsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vQXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9Bc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3MuaAko
cmV2aXNpb24gNjk3MjQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL0FzeW5jRmlsZVN5c3RlbUNhbGxi
YWNrcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMyw2ICszMyw3IEBACiAKICNpZiBFTkFCTEUoRklM
RV9TWVNURU0pCiAKKyNpbmNsdWRlICJGaWxlSW5mby5oIgogI2luY2x1ZGUgIlBsYXRmb3JtU3Ry
aW5nLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKQEAgLTQ5LDcgKzUwLDcgQEAgcHVibGljOgog
ICAgIHZpcnR1YWwgdm9pZCBkaWRPcGVuRmlsZVN5c3RlbShjb25zdCBTdHJpbmcmIG5hbWUsIFBh
c3NPd25QdHI8QXN5bmNGaWxlU3lzdGVtPikgPSAwOwogCiAgICAgLy8gQ2FsbGVkIHdoZW4gYSBm
aWxlIG1ldGFkYXRhIGlzIHJlYWQgc3VjY2Vzc2Z1bGx5LgotICAgIHZpcnR1YWwgdm9pZCBkaWRS
ZWFkTWV0YWRhdGEoZG91YmxlIG1vZGlmaWNhdGlvblRpbWUpID0gMDsKKyAgICB2aXJ0dWFsIHZv
aWQgZGlkUmVhZE1ldGFkYXRhKGNvbnN0IEZpbGVJbmZvJikgPSAwOwogCiAgICAgLy8gQ2FsbGVk
IHdoZW4gYSBkaXJlY3RvcnkgZW50cnkgaXMgcmVhZC4KICAgICB2aXJ0dWFsIHZvaWQgZGlkUmVh
ZERpcmVjdG9yeUVudHJ5KGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCBpc0RpcmVjdG9yeSkgPSAw
OwpJbmRleDogV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQv
Y2hyb21pdW0vQ2hhbmdlTG9nCShyZXZpc2lvbiA2OTgwNSkKKysrIFdlYktpdC9jaHJvbWl1bS9D
aGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwzMCBAQAorMjAxMC0xMC0xNCAgRXJp
YyBVaHJoYW5lICA8ZXJpY3VAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFtDaHJvbWl1bV0gaW1wbGVtZW50YXRpb24gb2YgYXN5
bmMgRmlsZVdyaXRlciBmb3Igd29ya2VycworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9NDc2ODEKKworICAgICAgICAqIFdlYktpdC5neXA6CisKKyAgICAg
ICAgV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0gbmVlZGVkIGxhenkgaW5pdGlhbGl6YXRp
b24gW2xhenkgY3JlYXRpb24gb2YgdGhlIFdlYkZpbGVXcml0ZXJdLiAgSXQgdHVybmVkIG91dCB0
aGF0IEkgY291bGQgaGF2ZSBkb25lIHRoYXQgZm9yIEFzeW5jRmlsZVdyaXRlckNocm9taXVtLCBh
bmQgaXQncyBjbGVhbmVyLCBzbyBJIG1hZGUgdGhlbSBtYXRjaC4KKworICAgICAgICBHZXRNZXRh
ZGF0YSBjYWxscyBub3cgcmV0dXJuIGZ1bGwgbWV0YWRhdGEgcmF0aGVyIHRoYW4ganVzdCBhIG1v
ZGlmaWNhdGlvbiB0aW1lLgorCisgICAgICAgICogc3JjL0FzeW5jRmlsZVN5c3RlbUNocm9taXVt
LmNwcDoKKyAgICAgICAgKiBzcmMvQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uY3BwOgorICAgICAg
ICAqIHNyYy9Bc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5oOgorICAgICAgICAqIHNyYy9XZWJGaWxl
U3lzdGVtQ2FsbGJhY2tzSW1wbC5jcHA6CisgICAgICAgICogc3JjL1dvcmtlckFzeW5jRmlsZVN5
c3RlbUNocm9taXVtLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldvcmtlckZpbGVXcml0ZXJIZWxw
ZXJDYWxsYmFja3MpOiBOZXcgaGVscGVyIGNsYXNzLgorCisgICAgICAgICogc3JjL1dvcmtlckFz
eW5jRmlsZVdyaXRlckNocm9taXVtLmNwcDogQWRkZWQuCisgICAgICAgICogc3JjL1dvcmtlckFz
eW5jRmlsZVdyaXRlckNocm9taXVtLmg6IEFkZGVkLgorCisgICAgICAgIFRoaXMgY2xhc3MgYnJp
ZGdlcyBmaWxld3JpdGVyIGFuZCBmaWxld3JpdGVyY2xpZW50IGNhbGxzIGJldHdlZW4gdGhlIGNv
bnRleHQgYW5kIG1haW4gdGhyZWFkcy4KKyAgICAgICAgKiBzcmMvV29ya2VyRmlsZVdyaXRlckNh
bGxiYWNrc0JyaWRnZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHNyYy9Xb3JrZXJGaWxlV3JpdGVy
Q2FsbGJhY2tzQnJpZGdlLmg6IEFkZGVkLgorCiAyMDEwLTEwLTEzICBLaW51a28gWWFzdWRhICA8
a2ludWtvQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBKaWFuIExpLgpJbmRl
eDogV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9t
aXVtL1dlYktpdC5neXAJKHJldmlzaW9uIDY5NzI0KQorKysgV2ViS2l0L2Nocm9taXVtL1dlYktp
dC5neXAJKHdvcmtpbmcgY29weSkKQEAgLTU0MCw4ICs1NDAsMTIgQEAKICAgICAgICAgICAgICAg
ICAnc3JjL1dlYldvcmtlckltcGwuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9Xb3JrZXJBc3lu
Y0ZpbGVTeXN0ZW1DaHJvbWl1bS5jcHAnLAogICAgICAgICAgICAgICAgICdzcmMvV29ya2VyQXN5
bmNGaWxlU3lzdGVtQ2hyb21pdW0uaCcsCisgICAgICAgICAgICAgICAgJ3NyYy9Xb3JrZXJBc3lu
Y0ZpbGVXcml0ZXJDaHJvbWl1bS5jcHAnLAorICAgICAgICAgICAgICAgICdzcmMvV29ya2VyQXN5
bmNGaWxlV3JpdGVyQ2hyb21pdW0uaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9Xb3JrZXJGaWxl
U3lzdGVtQ2FsbGJhY2tzQnJpZGdlLmNwcCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9Xb3JrZXJG
aWxlU3lzdGVtQ2FsbGJhY2tzQnJpZGdlLmgnLAorICAgICAgICAgICAgICAgICdzcmMvV29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5jcHAnLAorICAgICAgICAgICAgICAgICdzcmMvV29y
a2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5oJywKICAgICAgICAgICAgICAgICAnc3JjL1dy
YXBwZWRSZXNvdXJjZVJlcXVlc3QuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9XcmFwcGVkUmVz
b3VyY2VSZXNwb25zZS5oJywKICAgICAgICAgICAgICAgICAnc3JjL3dpbi9XZWJJbnB1dEV2ZW50
RmFjdG9yeS5jcHAnLApJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9Bc3luY0ZpbGVTeXN0ZW1D
aHJvbWl1bS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9Bc3luY0ZpbGVT
eXN0ZW1DaHJvbWl1bS5jcHAJKHJldmlzaW9uIDY5NzI0KQorKysgV2ViS2l0L2Nocm9taXVtL3Ny
Yy9Bc3luY0ZpbGVTeXN0ZW1DaHJvbWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEzMiw5ICsx
MzIsNyBAQCBwdWJsaWM6CiAgICAgICAgIGlmIChpbmZvLnR5cGUgIT0gV2ViS2l0OjpXZWJGaWxl
SW5mbzo6VHlwZUZpbGUgfHwgaW5mby5sZW5ndGggPCAwKQogICAgICAgICAgICAgbV9jYWxsYmFj
a3MtPmRpZEZhaWwoV2ViS2l0OjpXZWJGaWxlRXJyb3JJbnZhbGlkU3RhdGUpOwogICAgICAgICBl
bHNlIHsKLSAgICAgICAgICAgIE93blB0cjxBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bT4gYXN5bmNG
aWxlV3JpdGVyQ2hyb21pdW0gPSBhZG9wdFB0cihuZXcgQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0o
bV9jbGllbnQpKTsKLSAgICAgICAgICAgIE93blB0cjxXZWJLaXQ6OldlYkZpbGVXcml0ZXI+IHdl
YkZpbGVXcml0ZXIgPSBhZG9wdFB0cihtX3dlYkZpbGVTeXN0ZW0tPmNyZWF0ZUZpbGVXcml0ZXIo
bV9wYXRoLCBhc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5nZXQoKSkpOwotICAgICAgICAgICAgYXN5
bmNGaWxlV3JpdGVyQ2hyb21pdW0tPnNldFdlYkZpbGVXcml0ZXIod2ViRmlsZVdyaXRlci5yZWxl
YXNlKCkpOworICAgICAgICAgICAgT3duUHRyPEFzeW5jRmlsZVdyaXRlckNocm9taXVtPiBhc3lu
Y0ZpbGVXcml0ZXJDaHJvbWl1bSA9IGFkb3B0UHRyKG5ldyBBc3luY0ZpbGVXcml0ZXJDaHJvbWl1
bShtX2NsaWVudCwgbV93ZWJGaWxlU3lzdGVtLCBtX3BhdGgpKTsKICAgICAgICAgICAgIG1fY2Fs
bGJhY2tzLT5kaWRDcmVhdGVGaWxlV3JpdGVyKGFzeW5jRmlsZVdyaXRlckNocm9taXVtLnJlbGVh
c2UoKSwgaW5mby5sZW5ndGgpOwogICAgICAgICB9CiAgICAgICAgIGRlbGV0ZSB0aGlzOwpJbmRl
eDogV2ViS2l0L2Nocm9taXVtL3NyYy9Bc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9Bc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5jcHAJ
KHJldmlzaW9uIDY5NzI0KQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9Bc3luY0ZpbGVXcml0ZXJD
aHJvbWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM1LDEzICszNSwxNiBAQAogCiAjaW5jbHVk
ZSAiQXN5bmNGaWxlV3JpdGVyQ2xpZW50LmgiCiAjaW5jbHVkZSAiQmxvYi5oIgorI2luY2x1ZGUg
IldlYkZpbGVTeXN0ZW0uaCIKICNpbmNsdWRlICJXZWJGaWxlV3JpdGVyLmgiCiAjaW5jbHVkZSAi
V2ViVVJMLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotQXN5bmNGaWxlV3JpdGVyQ2hyb21p
dW06OkFzeW5jRmlsZVdyaXRlckNocm9taXVtKEFzeW5jRmlsZVdyaXRlckNsaWVudCogY2xpZW50
KQorQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW06OkFzeW5jRmlsZVdyaXRlckNocm9taXVtKEFzeW5j
RmlsZVdyaXRlckNsaWVudCogY2xpZW50LCBXZWJLaXQ6OldlYkZpbGVTeXN0ZW0qIHdlYkZpbGVT
eXN0ZW0sIGNvbnN0IFN0cmluZyYgcGF0aCkKICAgICA6IG1fY2xpZW50KGNsaWVudCkKKyAgICAs
IG1fd2ViRmlsZVN5c3RlbSh3ZWJGaWxlU3lzdGVtKQorICAgICwgbV9wYXRoKHBhdGgpCiB7CiB9
CiAKQEAgLTQ5LDMyICs1MiwzMiBAQCBBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bTo6fkFzeW5jRmls
ZVdyaXRlCiB7CiB9CiAKLXZvaWQgQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW06OnNldFdlYkZpbGVX
cml0ZXIoUGFzc093blB0cjxXZWJLaXQ6OldlYkZpbGVXcml0ZXI+IHdyaXRlcikKLXsKLSAgICBt
X3dyaXRlciA9IHdyaXRlcjsKLX0KLQogdm9pZCBBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bTo6d3Jp
dGUobG9uZyBsb25nIHBvc2l0aW9uLCBCbG9iKiBkYXRhKQogeworICAgIGlmICghbV93cml0ZXIp
CisgICAgICBpbml0V2ViRmlsZVdyaXRlcigpOwogICAgIEFTU0VSVChtX3dyaXRlcik7CiAgICAg
bV93cml0ZXItPndyaXRlKHBvc2l0aW9uLCBXZWJLaXQ6OldlYlVSTChkYXRhLT51cmwoKSkpOwog
fQogCiB2b2lkIEFzeW5jRmlsZVdyaXRlckNocm9taXVtOjp0cnVuY2F0ZShsb25nIGxvbmcgbGVu
Z3RoKQogeworICAgIGlmICghbV93cml0ZXIpCisgICAgICBpbml0V2ViRmlsZVdyaXRlcigpOwog
ICAgIEFTU0VSVChtX3dyaXRlcik7CiAgICAgbV93cml0ZXItPnRydW5jYXRlKGxlbmd0aCk7CiB9
CiAKIHZvaWQgQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW06OmFib3J0KCkKIHsKKyAgICBpZiAoIW1f
d3JpdGVyKQorICAgICAgaW5pdFdlYkZpbGVXcml0ZXIoKTsKICAgICBBU1NFUlQobV93cml0ZXIp
OwogICAgIG1fd3JpdGVyLT5jYW5jZWwoKTsKIH0KIAogdm9pZCBBc3luY0ZpbGVXcml0ZXJDaHJv
bWl1bTo6ZGlkV3JpdGUobG9uZyBsb25nIGJ5dGVzLCBib29sIGNvbXBsZXRlKQogewotICAgIEFT
U0VSVChtX3dyaXRlcik7CiAgICAgbV9jbGllbnQtPmRpZFdyaXRlKGJ5dGVzLCBjb21wbGV0ZSk7
CiB9CiAKQEAgLTg4LDYgKzkxLDExIEBAIHZvaWQgQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW06OmRp
ZEZhaWwoV2UKICAgICBtX2NsaWVudC0+ZGlkRmFpbChlcnJvcik7CiB9CiAKK3ZvaWQgQXN5bmNG
aWxlV3JpdGVyQ2hyb21pdW06OmluaXRXZWJGaWxlV3JpdGVyKCkKK3sKKyAgICBtX3dyaXRlciA9
IGFkb3B0UHRyKG1fd2ViRmlsZVN5c3RlbS0+Y3JlYXRlRmlsZVdyaXRlcihtX3BhdGgsIHRoaXMp
KTsKK30KKwogfSAvLyBuYW1lc3BhY2UKIAogI2VuZGlmIC8vIEVOQUJMRShGSUxFX1NZU1RFTSkK
SW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL0FzeW5jRmlsZVdyaXRlckNocm9taXVtLmgJ
KHJldmlzaW9uIDY5NzI0KQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9Bc3luY0ZpbGVXcml0ZXJD
aHJvbWl1bS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8d3Rm
L1Bhc3NPd25QdHIuaD4KIAogbmFtZXNwYWNlIFdlYktpdCB7CitjbGFzcyBXZWJGaWxlU3lzdGVt
OwogY2xhc3MgV2ViRmlsZVdyaXRlcjsKIH0KIApAQCAtNDksMTEgKzUwLDkgQEAgY2xhc3MgQXN5
bmNGaWxlV3JpdGVyQ2xpZW50OwogCiBjbGFzcyBBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bSA6IHB1
YmxpYyBBc3luY0ZpbGVXcml0ZXIsIHB1YmxpYyBXZWJLaXQ6OldlYkZpbGVXcml0ZXJDbGllbnQg
ewogcHVibGljOgotICAgIEFzeW5jRmlsZVdyaXRlckNocm9taXVtKEFzeW5jRmlsZVdyaXRlckNs
aWVudCogY2xpZW50KTsKKyAgICBBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bShBc3luY0ZpbGVXcml0
ZXJDbGllbnQqLCBXZWJLaXQ6OldlYkZpbGVTeXN0ZW0qLCBjb25zdCBTdHJpbmcmIHBhdGgpOwog
ICAgIH5Bc3luY0ZpbGVXcml0ZXJDaHJvbWl1bSgpOwogICAgIAotICAgIHZvaWQgc2V0V2ViRmls
ZVdyaXRlcihQYXNzT3duUHRyPFdlYktpdDo6V2ViRmlsZVdyaXRlcj4gd3JpdGVyKTsKLQogICAg
IC8vIEZpbGVXcml0ZXIKICAgICB2aXJ0dWFsIHZvaWQgd3JpdGUobG9uZyBsb25nIHBvc2l0aW9u
LCBCbG9iKiBkYXRhKTsKICAgICB2aXJ0dWFsIHZvaWQgdHJ1bmNhdGUobG9uZyBsb25nIGxlbmd0
aCk7CkBAIC02NSw4ICs2NCwxMiBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIGRpZEZhaWwo
V2ViS2l0OjpXZWJGaWxlRXJyb3IpOwogCiBwcml2YXRlOgorICAgIHZvaWQgaW5pdFdlYkZpbGVX
cml0ZXIoKTsKKwogICAgIE93blB0cjxXZWJLaXQ6OldlYkZpbGVXcml0ZXI+IG1fd3JpdGVyOwog
ICAgIEFzeW5jRmlsZVdyaXRlckNsaWVudCogbV9jbGllbnQ7CisgICAgV2ViS2l0OjpXZWJGaWxl
U3lzdGVtKiBtX3dlYkZpbGVTeXN0ZW07CisgICAgU3RyaW5nIG1fcGF0aDsKIH07CiAKIH0gLy8g
bmFtZXNwYWNlCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYkZpbGVTeXN0ZW1DYWxsYmFj
a3NJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYkZpbGVTeXN0
ZW1DYWxsYmFja3NJbXBsLmNwcAkocmV2aXNpb24gNjk3MjQpCisrKyBXZWJLaXQvY2hyb21pdW0v
c3JjL1dlYkZpbGVTeXN0ZW1DYWxsYmFja3NJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjMs
OSArNjMsMjMgQEAgdm9pZCBXZWJGaWxlU3lzdGVtQ2FsbGJhY2tzSW1wbDo6ZGlkU3VjYwogICAg
IGRlbGV0ZSB0aGlzOwogfQogCi12b2lkIFdlYkZpbGVTeXN0ZW1DYWxsYmFja3NJbXBsOjpkaWRS
ZWFkTWV0YWRhdGEoY29uc3QgV2ViRmlsZUluZm8mIGluZm8pCit2b2lkIFdlYkZpbGVTeXN0ZW1D
YWxsYmFja3NJbXBsOjpkaWRSZWFkTWV0YWRhdGEoY29uc3QgV2ViRmlsZUluZm8mIHdlYkZpbGVJ
bmZvKQogewotICAgIG1fY2FsbGJhY2tzLT5kaWRSZWFkTWV0YWRhdGEoaW5mby5tb2RpZmljYXRp
b25UaW1lKTsKKyAgICBGaWxlSW5mbyBmaWxlSW5mbzsKKyAgICBmaWxlSW5mby5tb2RpZmljYXRp
b25UaW1lID0gd2ViRmlsZUluZm8ubW9kaWZpY2F0aW9uVGltZTsKKyAgICBmaWxlSW5mby5sZW5n
dGggPSB3ZWJGaWxlSW5mby5sZW5ndGg7CisgICAgc3dpdGNoICh3ZWJGaWxlSW5mby50eXBlKSB7
CisgICAgY2FzZSBXZWJGaWxlSW5mbzo6VHlwZURpcmVjdG9yeToKKyAgICAgICAgZmlsZUluZm8u
dHlwZSA9IEZpbGVJbmZvOjpUeXBlRGlyZWN0b3J5OworICAgICAgICBicmVhazsKKyAgICBjYXNl
IFdlYkZpbGVJbmZvOjpUeXBlRmlsZToKKyAgICAgICAgZmlsZUluZm8udHlwZSA9IEZpbGVJbmZv
OjpUeXBlRmlsZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZmlsZUlu
Zm8udHlwZSA9IEZpbGVJbmZvOjpUeXBlVW5rbm93bjsKKyAgICAgICAgYnJlYWs7CisgICAgfQor
ICAgIG1fY2FsbGJhY2tzLT5kaWRSZWFkTWV0YWRhdGEoZmlsZUluZm8pOwogICAgIGRlbGV0ZSB0
aGlzOwogfQogCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckFzeW5jRmlsZVN5c3Rl
bUNocm9taXVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckFz
eW5jRmlsZVN5c3RlbUNocm9taXVtLmNwcAkocmV2aXNpb24gNjk3MjQpCisrKyBXZWJLaXQvY2hy
b21pdW0vc3JjL1dvcmtlckFzeW5jRmlsZVN5c3RlbUNocm9taXVtLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMzgsOSArMzgsMTEgQEAKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1
ZGUgIldlYkZpbGVTeXN0ZW0uaCIKICNpbmNsdWRlICJXZWJGaWxlU3lzdGVtQ2FsbGJhY2tzSW1w
bC5oIgorI2luY2x1ZGUgIldlYkZpbGVXcml0ZXIuaCIKICNpbmNsdWRlICJXZWJLaXQuaCIKICNp
bmNsdWRlICJXZWJLaXRDbGllbnQuaCIKICNpbmNsdWRlICJXZWJXb3JrZXJCYXNlLmgiCisjaW5j
bHVkZSAiV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uaCIKICNpbmNsdWRlICJXb3JrZXJD
b250ZXh0LmgiCiAjaW5jbHVkZSAiV29ya2VyRmlsZVN5c3RlbUNhbGxiYWNrc0JyaWRnZS5oIgog
I2luY2x1ZGUgIldvcmtlclNjcmlwdENvbnRyb2xsZXIuaCIKQEAgLTEzNCw5ICsxMzYsNzAgQEAg
dm9pZCBXb3JrZXJBc3luY0ZpbGVTeXN0ZW1DaHJvbWl1bTo6cmVhZAogICAgIGNyZWF0ZVdvcmtl
ckZpbGVTeXN0ZW1DYWxsYmFja3NCcmlkZ2UoY2FsbGJhY2tzKS0+cG9zdFJlYWREaXJlY3RvcnlU
b01haW5UaHJlYWQobV93ZWJGaWxlU3lzdGVtLCBwYXRoLCBtX21vZGVGb3JDdXJyZW50T3BlcmF0
aW9uKTsKIH0KIAotdm9pZCBXb3JrZXJBc3luY0ZpbGVTeXN0ZW1DaHJvbWl1bTo6Y3JlYXRlV3Jp
dGVyKEFzeW5jRmlsZVdyaXRlckNsaWVudCosIGNvbnN0IFN0cmluZyYsIFBhc3NPd25QdHI8QXN5
bmNGaWxlU3lzdGVtQ2FsbGJhY2tzPikKK2NsYXNzIFdvcmtlckZpbGVXcml0ZXJIZWxwZXJDYWxs
YmFja3MgOiBwdWJsaWMgQXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzIHsKK3B1YmxpYzoKKyAgICBX
b3JrZXJGaWxlV3JpdGVySGVscGVyQ2FsbGJhY2tzKEFzeW5jRmlsZVdyaXRlckNsaWVudCogY2xp
ZW50LCBjb25zdCBTdHJpbmcmIHBhdGgsIFdlYktpdDo6V2ViRmlsZVN5c3RlbSogd2ViRmlsZVN5
c3RlbSwgUGFzc093blB0cjxXZWJDb3JlOjpBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3M+IGNhbGxi
YWNrcywgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCkKKyAgICAgICAgOiBtX2NsaWVudChj
bGllbnQpCisgICAgICAgICwgbV9wYXRoKHBhdGgpCisgICAgICAgICwgbV93ZWJGaWxlU3lzdGVt
KHdlYkZpbGVTeXN0ZW0pCisgICAgICAgICwgbV9jYWxsYmFja3MoY2FsbGJhY2tzKQorICAgICAg
ICAsIG1fd29ya2VyQ29udGV4dCh3b3JrZXJDb250ZXh0KQorICAgIHsKKyAgICB9CisKKyAgICB2
aXJ0dWFsIHZvaWQgZGlkU3VjY2VlZCgpCisgICAgeworICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIGRpZFJlYWRNZXRhZGF0YShjb25zdCBGaWxl
SW5mbyYgaW5mbykKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2NhbGxiYWNrcyk7CisgICAgICAg
IGlmIChpbmZvLnR5cGUgIT0gRmlsZUluZm86OlR5cGVGaWxlIHx8IGluZm8ubGVuZ3RoIDwgMCkK
KyAgICAgICAgICAgIG1fY2FsbGJhY2tzLT5kaWRGYWlsKFdlYktpdDo6V2ViRmlsZUVycm9ySW52
YWxpZFN0YXRlKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBPd25QdHI8V29ya2VyQXN5
bmNGaWxlV3JpdGVyQ2hyb21pdW0+IGFzeW5jRmlsZVdyaXRlckNocm9taXVtID0gYWRvcHRQdHIo
bmV3IFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtKG1fd2ViRmlsZVN5c3RlbSwgbV9wYXRo
LCBtX3dvcmtlckNvbnRleHQsIG1fY2xpZW50LCBmYWxzZSkpOworICAgICAgICAgICAgbV9jYWxs
YmFja3MtPmRpZENyZWF0ZUZpbGVXcml0ZXIoYXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0ucmVsZWFz
ZSgpLCBpbmZvLmxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQg
ZGlkUmVhZERpcmVjdG9yeUVudHJ5KGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCBpc0RpcmVjdG9y
eSkKKyAgICB7CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KKworICAgIHZp
cnR1YWwgdm9pZCBkaWRSZWFkRGlyZWN0b3J5RW50cmllcyhib29sIGhhc01vcmUpCisgICAgewor
ICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQg
ZGlkT3BlbkZpbGVTeXN0ZW0oY29uc3QgU3RyaW5nJiwgUGFzc093blB0cjxBc3luY0ZpbGVTeXN0
ZW0+KQorICAgIHsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorCisgICAg
Ly8gQ2FsbGVkIHdoZW4gYW4gQXN5bmNGaWxlV3J0ZXIgaGFzIGJlZW4gY3JlYXRlZCBzdWNjZXNz
ZnVsbHkuCisgICAgdmlydHVhbCB2b2lkIGRpZENyZWF0ZUZpbGVXcml0ZXIoUGFzc093blB0cjxB
c3luY0ZpbGVXcml0ZXI+LCBsb25nIGxvbmcpCisgICAgeworICAgICAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlkRmFpbChpbnQgY29kZSkKKyAg
ICB7CisgICAgICAgIEFTU0VSVChtX2NhbGxiYWNrcyk7CisgICAgICAgIG1fY2FsbGJhY2tzLT5k
aWRGYWlsKGNvZGUpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBBc3luY0ZpbGVXcml0ZXJDbGll
bnQqIG1fY2xpZW50OworICAgIFN0cmluZyBtX3BhdGg7CisgICAgV2ViS2l0OjpXZWJGaWxlU3lz
dGVtKiBtX3dlYkZpbGVTeXN0ZW07CisgICAgT3duUHRyPFdlYkNvcmU6OkFzeW5jRmlsZVN5c3Rl
bUNhbGxiYWNrcz4gbV9jYWxsYmFja3M7CisgICAgV29ya2VyQ29udGV4dCogbV93b3JrZXJDb250
ZXh0OworfTsKKwordm9pZCBXb3JrZXJBc3luY0ZpbGVTeXN0ZW1DaHJvbWl1bTo6Y3JlYXRlV3Jp
dGVyKEFzeW5jRmlsZVdyaXRlckNsaWVudCogY2xpZW50LCBjb25zdCBTdHJpbmcmIHBhdGgsIFBh
c3NPd25QdHI8QXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzPiBjYWxsYmFja3MpCiB7Ci0gICAgbm90
SW1wbGVtZW50ZWQoKTsKKyAgICBjcmVhdGVXb3JrZXJGaWxlU3lzdGVtQ2FsbGJhY2tzQnJpZGdl
KG5ldyBXb3JrZXJGaWxlV3JpdGVySGVscGVyQ2FsbGJhY2tzKGNsaWVudCwgcGF0aCwgbV93ZWJG
aWxlU3lzdGVtLCBjYWxsYmFja3MsIG1fd29ya2VyQ29udGV4dCkpLT5wb3N0UmVhZE1ldGFkYXRh
VG9NYWluVGhyZWFkKG1fd2ViRmlsZVN5c3RlbSwgcGF0aCwgbV9tb2RlRm9yQ3VycmVudE9wZXJh
dGlvbik7CiB9CiAKIFBhc3NSZWZQdHI8V29ya2VyRmlsZVN5c3RlbUNhbGxiYWNrc0JyaWRnZT4g
V29ya2VyQXN5bmNGaWxlU3lzdGVtQ2hyb21pdW06OmNyZWF0ZVdvcmtlckZpbGVTeXN0ZW1DYWxs
YmFja3NCcmlkZ2UoUGFzc093blB0cjxBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3M+IGNhbGxiYWNr
cykKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21p
dW0uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2VyQXN5bmNGaWxl
V3JpdGVyQ2hyb21pdW0uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9X
b3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
OTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAq
CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICog
aW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29n
bGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk
IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29m
dHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENP
TlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQK
KyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiV29ya2VyQXN5bmNGaWxlV3JpdGVy
Q2hyb21pdW0uaCIKKworI2lmIEVOQUJMRShGSUxFX1NZU1RFTSkKKworI2luY2x1ZGUgIkFzeW5j
RmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgIkFzeW5jRmlsZVdyaXRlckNsaWVudC5oIgorI2luY2x1
ZGUgIkJsb2IuaCIKKyNpbmNsdWRlICJTY3JpcHRFeGVjdXRpb25Db250ZXh0LmgiCisjaW5jbHVk
ZSAiV2ViRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgIldlYkZpbGVXcml0ZXIuaCIKKyNpbmNsdWRl
ICJXZWJVUkwuaCIKKyNpbmNsdWRlICJXZWJXb3JrZXJCYXNlLmgiCisjaW5jbHVkZSAiV29ya2Vy
Q29udGV4dC5oIgorI2luY2x1ZGUgIldvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuaCIK
KyNpbmNsdWRlICJXb3JrZXJMb2FkZXJQcm94eS5oIgorI2luY2x1ZGUgIldvcmtlclRocmVhZC5o
IgorCit1c2luZyBuYW1lc3BhY2UgV2ViS2l0OworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0
YXRpYyBjb25zdCBjaGFyIGZpbGVXcml0ZXJPcGVyYXRpb25zTW9kZVtdID0gImZpbGVXcml0ZXJP
cGVyYXRpb25zTW9kZSI7CisKK1dvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtOjpXb3JrZXJB
c3luY0ZpbGVXcml0ZXJDaHJvbWl1bShXZWJGaWxlU3lzdGVtKiB3ZWJGaWxlU3lzdGVtLCBjb25z
dCBTdHJpbmcmIHBhdGgsIFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRleHQsIEFzeW5jRmlsZVdy
aXRlckNsaWVudCogY2xpZW50LCBib29sIHN5bmNocm9ub3VzKQorICAgIDogbV9zeW5jaHJvbm91
cyhzeW5jaHJvbm91cykKK3sKKyAgICBBU1NFUlQoIXN5bmNocm9ub3VzKTsgLy8gTm90IGltcGxl
bWVudGVkIHlldC4KKyAgICBXb3JrZXJMb2FkZXJQcm94eSogd29ya2VyTG9hZGVyUHJveHkgPSAm
d29ya2VyQ29udGV4dC0+dGhyZWFkKCktPndvcmtlckxvYWRlclByb3h5KCk7CisgICAgV2ViV29y
a2VyQmFzZSogd29ya2VyID0gc3RhdGljX2Nhc3Q8V2ViV29ya2VyQmFzZSo+KHdvcmtlckxvYWRl
clByb3h5KTsKKworICAgIFN0cmluZyBtb2RlID0gZmlsZVdyaXRlck9wZXJhdGlvbnNNb2RlOwor
ICAgIG1vZGUuYXBwZW5kKFN0cmluZzo6bnVtYmVyKHdvcmtlckNvbnRleHQtPnRocmVhZCgpLT5y
dW5Mb29wKCkuY3JlYXRlVW5pcXVlSWQoKSkpOworICAgIG1fYnJpZGdlID0gV29ya2VyRmlsZVdy
aXRlckNhbGxiYWNrc0JyaWRnZTo6Y3JlYXRlKHdlYkZpbGVTeXN0ZW0sIHBhdGgsIHdvcmtlciwg
d29ya2VyQ29udGV4dCwgbW9kZSwgY2xpZW50KTsKK30KKworV29ya2VyQXN5bmNGaWxlV3JpdGVy
Q2hyb21pdW06On5Xb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bSgpCit7CisgICAgV29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZSogYnJpZGdlID0gbV9icmlkZ2UuZ2V0KCk7CisgICAg
YnJpZGdlLT5wb3N0U2h1dGRvd25Ub01haW5UaHJlYWQobV9icmlkZ2UucmVsZWFzZSgpKTsKK30K
KworV2ViRmlsZVdyaXRlckNsaWVudCogV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW06Omdl
dE1haW5UaHJlYWRDbGllbnQoKQoreworICAgIHJldHVybiBtX2JyaWRnZS5nZXQoKTsKK30KKwor
dm9pZCBXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bTo6d3JpdGUobG9uZyBsb25nIHBvc2l0
aW9uLCBCbG9iKiBkYXRhKQoreworICAgIG1fYnJpZGdlLT5wb3N0V3JpdGVUb01haW5UaHJlYWQo
cG9zaXRpb24sIFdlYktpdDo6V2ViVVJMKGRhdGEtPnVybCgpKSk7Cit9CisKK3ZvaWQgV29ya2Vy
QXN5bmNGaWxlV3JpdGVyQ2hyb21pdW06OnRydW5jYXRlKGxvbmcgbG9uZyBsZW5ndGgpCit7Cisg
ICAgbV9icmlkZ2UtPnBvc3RUcnVuY2F0ZVRvTWFpblRocmVhZChsZW5ndGgpOworfQorCit2b2lk
IFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtOjphYm9ydCgpCit7CisgICAgbV9icmlkZ2Ut
PnBvc3RBYm9ydFRvTWFpblRocmVhZCgpOworfQorCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYg
Ly8gRU5BQkxFKEZJTEVfU1lTVEVNKQpJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJB
c3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9z
cmMvV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uaAkocmV2aXNpb24gMCkKKysrIFdlYktp
dC9jaHJvbWl1bS9zcmMvV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uaAkocmV2aXNpb24g
MCkKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFy
ZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5
cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRo
ZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRv
cnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJv
bQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQg
SE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisg
KiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
VEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW1f
aAorI2RlZmluZSBXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bV9oCisKKyNpZiBFTkFCTEUo
RklMRV9TWVNURU0pCisKKyNpbmNsdWRlICJBc3luY0ZpbGVXcml0ZXIuaCIKKyNpbmNsdWRlICJX
ZWJGaWxlRXJyb3IuaCIKKyNpbmNsdWRlICJXZWJGaWxlV3JpdGVyQ2xpZW50LmgiCisjaW5jbHVk
ZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisKK25hbWVzcGFj
ZSBXZWJLaXQgeworY2xhc3MgV2ViRmlsZVN5c3RlbTsKK2NsYXNzIFdlYkZpbGVXcml0ZXI7Citj
bGFzcyBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOworfQorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK2NsYXNzIEFzeW5jRmlsZVN5c3RlbTsKK2NsYXNzIEFzeW5jRmlsZVdyaXRlckNs
aWVudDsKK2NsYXNzIEJsb2I7CitjbGFzcyBXb3JrZXJDb250ZXh0OworCitjbGFzcyBXb3JrZXJB
c3luY0ZpbGVXcml0ZXJDaHJvbWl1bSA6IHB1YmxpYyBBc3luY0ZpbGVXcml0ZXIgeworcHVibGlj
OgorICAgIFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtKFdlYktpdDo6V2ViRmlsZVN5c3Rl
bSosIGNvbnN0IFN0cmluZyYgcGF0aCwgV29ya2VyQ29udGV4dCosIEFzeW5jRmlsZVdyaXRlckNs
aWVudCosIGJvb2wgc3luY2hyb25vdXMpOworICAgIH5Xb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJv
bWl1bSgpOworICAgIAorICAgIFdlYktpdDo6V2ViRmlsZVdyaXRlckNsaWVudCogZ2V0TWFpblRo
cmVhZENsaWVudCgpOworCisgICAgLy8gRmlsZVdyaXRlcgorICAgIHZpcnR1YWwgdm9pZCB3cml0
ZShsb25nIGxvbmcgcG9zaXRpb24sIEJsb2IqIGRhdGEpOworICAgIHZpcnR1YWwgdm9pZCB0cnVu
Y2F0ZShsb25nIGxvbmcgbGVuZ3RoKTsKKyAgICB2aXJ0dWFsIHZvaWQgYWJvcnQoKTsKKworcHJp
dmF0ZToKKyAgICBSZWZQdHI8V2ViS2l0OjpXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdl
PiBtX2JyaWRnZTsKKyAgICBib29sIG1fc3luY2hyb25vdXM7Cit9OworCit9IC8vIG5hbWVzcGFj
ZQorCisjZW5kaWYgLy8gRU5BQkxFKEZJTEVfU1lTVEVNKQorCisjZW5kaWYgLy8gQXN5bmNGaWxl
V3JpdGVyQ2hyb21pdW1faApJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJGaWxlV3Jp
dGVyQ2FsbGJhY2tzQnJpZGdlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3Jj
L1dvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuY3BwCShyZXZpc2lvbiAwKQorKysgV2Vi
S2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmNwcAkocmV2
aXNpb24gMCkKQEAgLTAsMCArMSwyMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29v
Z2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICog
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQor
ICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVp
dGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29u
dHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJp
dmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVu
IHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09Q
WVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5oIgorCisjaWYgRU5BQkxFKEZJTEVfU1lT
VEVNKQorCisjaW5jbHVkZSAiQXN5bmNGaWxlV3JpdGVyQ2xpZW50LmgiCisjaW5jbHVkZSAiQ3Jv
c3NUaHJlYWRUYXNrLmgiCisjaW5jbHVkZSAiV2ViQ1N0cmluZy5oIgorI2luY2x1ZGUgIldlYkZp
bGVTeXN0ZW0uaCIKKyNpbmNsdWRlICJXZWJGaWxlV3JpdGVyLmgiCisjaW5jbHVkZSAiV2ViV29y
a2VyQmFzZS5oIgorI2luY2x1ZGUgIldvcmtlckNvbnRleHQuaCIKKyNpbmNsdWRlICJXb3JrZXJU
aHJlYWQuaCIKKyNpbmNsdWRlIDx3dGYvTWFpblRocmVhZC5oPgorI2luY2x1ZGUgPHd0Zi9UaHJl
YWRpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit0ZW1wbGF0ZTw+IHN0cnVjdCBDcm9z
c1RocmVhZENvcGllckJhc2U8ZmFsc2UsIGZhbHNlLCBXZWJLaXQ6OldlYlVSTD4geworICAgIHR5
cGVkZWYgV2ViS2l0OjpXZWJVUkwgVHlwZTsKKyAgICBzdGF0aWMgVHlwZSBjb3B5KGNvbnN0IFdl
YktpdDo6V2ViVVJMJiB1cmwpCisgICAgeworICAgICAgICBXZWJLaXQ6OldlYkNTdHJpbmcgc3Bl
YzsKKyAgICAgICAgc3BlYy5hc3NpZ24odXJsLnNwZWMoKS5kYXRhKCksIHVybC5zcGVjKCkubGVu
Z3RoKCkpOworICAgICAgICBjb25zdCB1cmxfcGFyc2U6OlBhcnNlZCYgcGFyc2VkID0gdXJsLnBh
cnNlZCgpOworICAgICAgICBib29sIGlzVmFsaWQgPSB1cmwuaXNWYWxpZCgpOworCisgICAgICAg
IHJldHVybiBXZWJLaXQ6OldlYlVSTChzcGVjLCBwYXJzZWQsIGlzVmFsaWQpOworICAgIH0KK307
CisKK3RlbXBsYXRlPD4gc3RydWN0IENyb3NzVGhyZWFkQ29waWVyQmFzZTxmYWxzZSwgZmFsc2Us
IFBhc3NSZWZQdHI8V2ViS2l0OjpXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlPiA+IHsK
KyAgICB0eXBlZGVmIFBhc3NSZWZQdHI8V2ViS2l0OjpXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tz
QnJpZGdlPiBUeXBlOworICAgIHN0YXRpYyBUeXBlIGNvcHkoY29uc3QgUGFzc1JlZlB0cjxXZWJL
aXQ6OldvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+JiBicmlkZ2UpCisgICAgeworICAg
ICAgICBUeXBlIG5ld1JlZihicmlkZ2UuZ2V0KCkpOworICAgICAgICByZXR1cm4gbmV3UmVmOwor
ICAgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKwordXNpbmcgbmFtZXNwYWNlIFdl
YkNvcmU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxs
YmFja3NCcmlkZ2U6Om5vdGlmeVN0b3AoKQoreworICAgIEFTU0VSVChtX3dvcmtlckNvbnRleHQt
PmlzQ29udGV4dFRocmVhZCgpKTsKKyAgICBtX2NsaWVudE9uV29ya2VyVGhyZWFkID0gMDsKK30K
Kwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpwb3N0V3JpdGVUb01haW5U
aHJlYWQobG9uZyBsb25nIHBvc2l0aW9uLCBjb25zdCBXZWJVUkwmIGRhdGEpCit7CisgICAgZGlz
cGF0Y2hUYXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmd3JpdGVPbk1haW5UaHJl
YWQsIHRoaXMsIHBvc2l0aW9uLCBkYXRhKSk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNh
bGxiYWNrc0JyaWRnZTo6cG9zdFRydW5jYXRlVG9NYWluVGhyZWFkKGxvbmcgbG9uZyBsZW5ndGgp
Cit7CisgICAgZGlzcGF0Y2hUYXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmdHJ1
bmNhdGVPbk1haW5UaHJlYWQsIHRoaXMsIGxlbmd0aCkpOworfQorCit2b2lkIFdvcmtlckZpbGVX
cml0ZXJDYWxsYmFja3NCcmlkZ2U6OnBvc3RBYm9ydFRvTWFpblRocmVhZCgpCit7CisgICAgZGlz
cGF0Y2hUYXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmYWJvcnRPbk1haW5UaHJl
YWQsIHRoaXMpKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpw
b3N0U2h1dGRvd25Ub01haW5UaHJlYWQoCisgICAgICAgIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdy
aXRlckNhbGxiYWNrc0JyaWRnZT4gYnJpZGdlKQoreworICAgIEFTU0VSVCghbV9jbGllbnRPbldv
cmtlclRocmVhZCk7CisgICAgZGlzcGF0Y2hUYXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNr
VGFzaygmc2h1dGRvd25Pbk1haW5UaHJlYWQsIGJyaWRnZSkpOworICAgIE11dGV4TG9ja2VyIGxv
Y2tlcihtX211dGV4KTsKKyAgICBtX3dvcmtlciA9IDA7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdy
aXRlckNhbGxiYWNrc0JyaWRnZTo6d3JpdGVPbk1haW5UaHJlYWQoU2NyaXB0RXhlY3V0aW9uQ29u
dGV4dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gYnJpZGdl
LCBsb25nIGxvbmcgcG9zaXRpb24sIGNvbnN0IFdlYlVSTCYgZGF0YSkKK3sKKyAgICBicmlkZ2Ut
Pm1fd3JpdGVyLT53cml0ZShwb3NpdGlvbiwgZGF0YSk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdy
aXRlckNhbGxiYWNrc0JyaWRnZTo6dHJ1bmNhdGVPbk1haW5UaHJlYWQoU2NyaXB0RXhlY3V0aW9u
Q29udGV4dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gYnJp
ZGdlLCBsb25nIGxvbmcgbGVuZ3RoKQoreworICAgIGJyaWRnZS0+bV93cml0ZXItPnRydW5jYXRl
KGxlbmd0aCk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6YWJv
cnRPbk1haW5UaHJlYWQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gYnJpZGdlKQoreworICAgIGJyaWRnZS0+bV93cml0
ZXItPmNhbmNlbCgpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6
OnNodXRkb3duT25NYWluVGhyZWFkKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRy
PFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+IGJyaWRnZSkKK3sKKyAgICBicmlkZ2Ut
Pm1fc2h1dHRpbmdEb3duT25NYWluVGhyZWFkID0gdHJ1ZTsKKyAgICBicmlkZ2UtPm1fd3JpdGVy
LmNsZWFyKCk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6ZGlk
V3JpdGUobG9uZyBsb25nIGJ5dGVzLCBib29sIGNvbXBsZXRlKQoreworICAgIG1heVBvc3RUYXNr
VG9Xb3JrZXIoY3JlYXRlQ2FsbGJhY2tUYXNrKCZkaWRXcml0ZU9uV29ya2VyVGhyZWFkLCB0aGlz
LCBieXRlcywgY29tcGxldGUpKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tz
QnJpZGdlOjpkaWRGYWlsKFdlYkZpbGVFcnJvciBlcnJvcikKK3sKKyAgICBtYXlQb3N0VGFza1Rv
V29ya2VyKGNyZWF0ZUNhbGxiYWNrVGFzaygmZGlkRmFpbE9uV29ya2VyVGhyZWFkLCB0aGlzLCBl
cnJvcikpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OmRpZFRy
dW5jYXRlKCkKK3sKKyAgICBtYXlQb3N0VGFza1RvV29ya2VyKGNyZWF0ZUNhbGxiYWNrVGFzaygm
ZGlkVHJ1bmNhdGVPbldvcmtlclRocmVhZCwgdGhpcykpOworfQorCitXb3JrZXJGaWxlV3JpdGVy
Q2FsbGJhY2tzQnJpZGdlOjpXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlKFdlYkZpbGVT
eXN0ZW0qIHdlYkZpbGVTeXN0ZW0sIGNvbnN0IFN0cmluZyYgcGF0aCwgV2ViV29ya2VyQmFzZSog
d29ya2VyLCBTY3JpcHRFeGVjdXRpb25Db250ZXh0KiBzY3JpcHRFeGVjdXRpb25Db250ZXh0LCBj
b25zdCBTdHJpbmcmIG1vZGUsIEFzeW5jRmlsZVdyaXRlckNsaWVudCogY2xpZW50KQorICAgIDog
V29ya2VyQ29udGV4dDo6T2JzZXJ2ZXIoc3RhdGljX2Nhc3Q8V29ya2VyQ29udGV4dCo+KHNjcmlw
dEV4ZWN1dGlvbkNvbnRleHQpKQorICAgICwgbV9zaHV0dGluZ0Rvd25Pbk1haW5UaHJlYWQoZmFs
c2UpCisgICAgLCBtX3dlYkZpbGVTeXN0ZW0od2ViRmlsZVN5c3RlbSkKKyAgICAsIG1fcGF0aChw
YXRoKQorICAgICwgbV93b3JrZXIod29ya2VyKQorICAgICwgbV93b3JrZXJDb250ZXh0KHNjcmlw
dEV4ZWN1dGlvbkNvbnRleHQpCisgICAgLCBtX21vZGUobW9kZSkKKyAgICAsIG1fY2xpZW50T25X
b3JrZXJUaHJlYWQoY2xpZW50KQoreworICAgIEFTU0VSVChtX3dvcmtlckNvbnRleHQtPmlzQ29u
dGV4dFRocmVhZCgpKTsKK30KKworV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6fldv
cmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UoKQoreworICAgIEFTU0VSVCghbV9jbGllbnRP
bldvcmtlclRocmVhZCk7CisgICAgQVNTRVJUKCFtX3dyaXRlcik7Cit9CisKK3ZvaWQgV29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6ZGlkV3JpdGVPbldvcmtlclRocmVhZChTY3JpcHRF
eGVjdXRpb25Db250ZXh0KiwgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZSogYnJpZGdl
LCBsb25nIGxvbmcgbGVuZ3RoLCBib29sIGNvbXBsZXRlKQoreworICAgIGJyaWRnZS0+bV9jbGll
bnRPbldvcmtlclRocmVhZC0+ZGlkV3JpdGUobGVuZ3RoLCBjb21wbGV0ZSk7Cit9CisKK3ZvaWQg
V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6ZGlkRmFpbE9uV29ya2VyVGhyZWFkKFNj
cmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlKiBi
cmlkZ2UsIFdlYkZpbGVFcnJvciBlcnJvcikKK3sKKyAgICBicmlkZ2UtPm1fY2xpZW50T25Xb3Jr
ZXJUaHJlYWQtPmRpZEZhaWwoZXJyb3IpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxs
YmFja3NCcmlkZ2U6OmRpZFRydW5jYXRlT25Xb3JrZXJUaHJlYWQoU2NyaXB0RXhlY3V0aW9uQ29u
dGV4dCosIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UqIGJyaWRnZSkKK3sKKyAgICBi
cmlkZ2UtPm1fY2xpZW50T25Xb3JrZXJUaHJlYWQtPmRpZFRydW5jYXRlKCk7Cit9CisKK3ZvaWQg
V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6aW5pdFdlYkZpbGVXcml0ZXIoKQorewor
ICAgIEFTU0VSVCghbV9zaHV0dGluZ0Rvd25Pbk1haW5UaHJlYWQpOworICAgIEFTU0VSVCghbV93
cml0ZXIpOworICAgIG1fd3JpdGVyID0gYWRvcHRQdHIobV93ZWJGaWxlU3lzdGVtLT5jcmVhdGVG
aWxlV3JpdGVyKG1fcGF0aCwgdGhpcykpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxs
YmFja3NCcmlkZ2U6OnJ1blRhc2tPbk1haW5UaHJlYWQoV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9u
Q29udGV4dCogc2NyaXB0RXhlY3V0aW9uQ29udGV4dCwgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3Jp
dGVyQ2FsbGJhY2tzQnJpZGdlPiBicmlkZ2UsIFBhc3NPd25QdHI8V2ViQ29yZTo6U2NyaXB0RXhl
Y3V0aW9uQ29udGV4dDo6VGFzaz4gdGFza1RvUnVuKQoreworICAgIEFTU0VSVChpc01haW5UaHJl
YWQoKSk7CisgICAgaWYgKCFicmlkZ2UtPm1fd3JpdGVyICYmICFicmlkZ2UtPm1fc2h1dHRpbmdE
b3duT25NYWluVGhyZWFkKQorICAgICAgICBicmlkZ2UtPmluaXRXZWJGaWxlV3JpdGVyKCk7CisK
KyAgICBpZiAoYnJpZGdlLT5tX3dyaXRlcikKKyAgICAgICAgdGFza1RvUnVuLT5wZXJmb3JtVGFz
ayhzY3JpcHRFeGVjdXRpb25Db250ZXh0KTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2Fs
bGJhY2tzQnJpZGdlOjpydW5UYXNrT25Xb3JrZXJUaHJlYWQoV2ViQ29yZTo6U2NyaXB0RXhlY3V0
aW9uQ29udGV4dCogc2NyaXB0RXhlY3V0aW9uQ29udGV4dCwgUGFzc1JlZlB0cjxXb3JrZXJGaWxl
V3JpdGVyQ2FsbGJhY2tzQnJpZGdlPiBicmlkZ2UsIFBhc3NPd25QdHI8V2ViQ29yZTo6U2NyaXB0
RXhlY3V0aW9uQ29udGV4dDo6VGFzaz4gdGFza1RvUnVuKQoreworICAgIEFTU0VSVChicmlkZ2Ut
Pm1fd29ya2VyQ29udGV4dC0+aXNDb250ZXh0VGhyZWFkKCkpOworICAgIGlmICghYnJpZGdlLT5t
X2NsaWVudE9uV29ya2VyVGhyZWFkKQorICAgICAgICByZXR1cm47CisgICAgQVNTRVJUKGJyaWRn
ZS0+bV93b3JrZXIpOworICAgIHRhc2tUb1J1bi0+cGVyZm9ybVRhc2soc2NyaXB0RXhlY3V0aW9u
Q29udGV4dCk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6ZGlz
cGF0Y2hUYXNrVG9NYWluVGhyZWFkKFBhc3NPd25QdHI8V2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9u
Q29udGV4dDo6VGFzaz4gdGFzaykKK3sKKyAgICBBU1NFUlQobV93b3JrZXIpOyAvLyBUaGVyZSBz
aG91bGQgYmUgbm8gcmVxdWVzdHMgYWZ0ZXIgc2h1dGRvd24uCisgICAgQVNTRVJUKG1fd29ya2Vy
Q29udGV4dC0+aXNDb250ZXh0VGhyZWFkKCkpOworICAgIG1fd29ya2VyLT5kaXNwYXRjaFRhc2tU
b01haW5UaHJlYWQoY3JlYXRlQ2FsbGJhY2tUYXNrKCZydW5UYXNrT25NYWluVGhyZWFkLCB0aGlz
LCB0YXNrKSk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6bWF5
UG9zdFRhc2tUb1dvcmtlcihQYXNzT3duUHRyPFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2s+
IHRhc2spCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICBNdXRleExvY2tlciBs
b2NrZXIobV9tdXRleCk7IC8vIG1fd29ya2VyIGdldHMgY2xlYXJlZCBvbiB0aGUgY29udGV4dCB0
aHJlYWQuCisgICAgaWYgKG1fd29ya2VyKQorICAgICAgICBtX3dvcmtlci0+cG9zdFRhc2tGb3JN
b2RlVG9Xb3JrZXJDb250ZXh0KGNyZWF0ZUNhbGxiYWNrVGFzaygmcnVuVGFza09uV29ya2VyVGhy
ZWFkLCB0aGlzLCB0YXNrKSwgbV9tb2RlKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQor
CisjZW5kaWYgLy8gRU5BQkxFKEZJTEVfU1lTVEVNKQpJbmRleDogV2ViS2l0L2Nocm9taXVtL3Ny
Yy9Xb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmgKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0
L2Nocm9taXVtL3NyYy9Xb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmgJKHJldmlzaW9u
IDApCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlk
Z2UuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
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
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFdvcmtlckZpbGVXcml0
ZXJDYWxsYmFja3NCcmlkZ2VfaAorI2RlZmluZSBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJp
ZGdlX2gKKworI2lmIEVOQUJMRShGSUxFX1NZU1RFTSkKKworI2luY2x1ZGUgIlBsYXRmb3JtU3Ry
aW5nLmgiCisjaW5jbHVkZSAiV2ViRmlsZUVycm9yLmgiCisjaW5jbHVkZSAiV2ViRmlsZVdyaXRl
ckNsaWVudC5oIgorI2luY2x1ZGUgIldvcmtlckNvbnRleHQuaCIKKyNpbmNsdWRlIDx3dGYvUGFz
c093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1Ro
cmVhZGluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBBc3luY0ZpbGVXcml0ZXJD
bGllbnQ7Cit9CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBXZWJGaWxlU3lzdGVtOwor
Y2xhc3MgV2ViRmlsZVdyaXRlcjsKK2NsYXNzIFdlYkZpbGVXcml0ZXJDbGllbnQ7CitjbGFzcyBX
ZWJVUkw7CitjbGFzcyBXZWJXb3JrZXJCYXNlOworCisvLyBUaGlzIGNsYXNzIGlzIHVzZWQgYXMg
YSBtZWNoYW5pc20gdG8gYnJpZGdlIGNhbGxzIGJldHdlZW4gdGhyZWFkcy4KKy8vIENhbGxzIHRv
IGEgV2ViRmlsZVdyaXRlciBtdXN0IGhhcHBlbiBvbiB0aGUgbWFpbiB0aHJlYWQsIGJ1dCB0aGV5
IGNvbWUgZnJvbQorLy8gdGhlIGNvbnRleHQgdGhyZWFkLiAgVGhlIHJlc3BvbnNlcyB0aHJvdWdo
IHRoZSBXZWJGaWxlV3JpdGVyQ2xpZW50IGludGVyZmFjZQorLy8gc3RhcnQgb24gdGhlIG1haW4g
dGhyZWFkLCBidXQgbXVzdCBiZSBzZW50IHZpYSB0aGUgd29ya2VyIGNvbnRleHQgdGhyZWFkLgor
Ly8KKy8vIEEgdHlwaWNhbCBmbG93IGZvciB3cml0ZSB3b3VsZCBsb29rIGxpa2UgdGhpczoKKy8v
IEJyaWRnZTo6cG9zdFdyaXRlVG9NYWluVGhyZWFkKCkgb24gV29ya2VyVGhyZWFkCisvLyAgLS0+
IEJyaWRnZTo6d3JpdGVPbk1haW5UaHJlYWQoKSBpcyBjYWxsZWQgb24gTWFpblRocmVhZAorLy8g
IC0tPiBXZWJGaWxlV3JpdGVyOjp3cml0ZSgpCisvLyAgICAgIFRoaXMgbWFrZXMgYW4gSVBDOyB0
aGUgYWN0dWFsIG9wZXJhdGlvbiBpcyBkb3duIGluIHRoZSBicm93c2VyLgorLy8gIC0tPiBCcmlk
Z2U6OmRpZFdyaXRlIGlzIGNhbGxlZCBvbiBNYWluVGhyZWFkCisvLyAgLS0+IEJyaWRnZTo6ZGlk
V3JpdGVPbldvcmtlclRocmVhZCBpcyBjYWxsZWQgb24gV29ya2VyVGhyZWFkCisvLyAgICAgIFRo
aXMgY2FsbHMgdGhlIG9yaWdpbmFsIGNsaWVudCAobV9jbGllbnRPbldvcmtlclRocmVhZCkuCitj
bGFzcyBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlIDogcHVibGljIFRocmVhZFNhZmVT
aGFyZWQ8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4sIHB1YmxpYyBXZWJDb3JlOjpX
b3JrZXJDb250ZXh0OjpPYnNlcnZlciwgcHVibGljIFdlYkZpbGVXcml0ZXJDbGllbnQgeworcHVi
bGljOgorICAgIH5Xb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlKCk7CisKKyAgICAvLyBX
b3JrZXJDb250ZXh0OjpPYnNlcnZlciBtZXRob2QuCisgICAgdmlydHVhbCB2b2lkIG5vdGlmeVN0
b3AoKTsKKworICAgIHN0YXRpYyBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NC
cmlkZ2U+IGNyZWF0ZShXZWJGaWxlU3lzdGVtKiB3ZWJGaWxlU3lzdGVtLCBjb25zdCBTdHJpbmcm
IHBhdGgsIFdlYldvcmtlckJhc2UqIHdvcmtlciwgV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29u
dGV4dCogd29ya2VyQ29udGV4dCwgY29uc3QgU3RyaW5nJiBtb2RlLCBXZWJDb3JlOjpBc3luY0Zp
bGVXcml0ZXJDbGllbnQqIGNsaWVudCkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihu
ZXcgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZSh3ZWJGaWxlU3lzdGVtLCBwYXRoLCB3
b3JrZXIsIHdvcmtlckNvbnRleHQsIG1vZGUsIGNsaWVudCkpOworICAgIH0KKworICAgIC8vIE1l
dGhvZHMgdGhhdCBjcmVhdGUgYW4gaW5zdGFuY2UgYW5kIHBvc3QgYW4gaW5pdGlhbCByZXF1ZXN0
IHRhc2sgdG8gdGhlIG1haW4gdGhyZWFkLiBUaGV5IG11c3QgYmUgY2FsbGVkIG9uIHRoZSB3b3Jr
ZXIgdGhyZWFkLgorICAgIHZvaWQgcG9zdFdyaXRlVG9NYWluVGhyZWFkKGxvbmcgbG9uZyBwb3Np
dGlvbiwgY29uc3QgV2ViVVJMJiBkYXRhKTsKKyAgICB2b2lkIHBvc3RUcnVuY2F0ZVRvTWFpblRo
cmVhZChsb25nIGxvbmcgbGVuZ3RoKTsKKyAgICB2b2lkIHBvc3RBYm9ydFRvTWFpblRocmVhZCgp
OworCisgICAgLy8gVGhlIG93bmluZyBXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bSBzaG91
bGQgdXNlIHRoaXMgbWV0aG9kIHRvIGdpdmUKKyAgICAvLyBhd2F5IGl0cyBsYXN0IHJlZmVyZW5j
ZSB0byB0aGUgYnJpZGdlIGF0IGRlbGV0aW9uIHRpbWUsIG9uIHRoZSBjb250ZXh0CisgICAgLy8g
dGhyZWFkLiAgWW91IG11c3QgaGF2ZSBjYWxsZWQgc3RvcCgpIGJlZm9yZSBjYWxsaW5nIHRoaXMu
CisgICAgdm9pZCBwb3N0U2h1dGRvd25Ub01haW5UaHJlYWQoUGFzc1JlZlB0cjxXb3JrZXJGaWxl
V3JpdGVyQ2FsbGJhY2tzQnJpZGdlPik7CisKKyAgICAvLyBDYWxsYmFjayBtZXRob2RzIHRoYXQg
YXJlIGNhbGxlZCBvbiB0aGUgbWFpbiB0aHJlYWQuCisgICAgLy8gVGhlc2UgYXJlIHRoZSBpbXBs
ZW1lbnRhdGlvbiBvZiBXZWJLaXQ6OldlYkZpbGVXcml0ZXJDbGllbnQuCisgICAgdm9pZCBkaWRX
cml0ZShsb25nIGxvbmcgYnl0ZXMsIGJvb2wgY29tcGxldGUpOworICAgIHZvaWQgZGlkRmFpbChX
ZWJGaWxlRXJyb3IpOworICAgIHZvaWQgZGlkVHJ1bmNhdGUoKTsKKworcHJpdmF0ZToKKyAgICBX
b3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlKFdlYkZpbGVTeXN0ZW0qLCBjb25zdCBTdHJp
bmcmIHBhdGgsIFdlYldvcmtlckJhc2UqLCBXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0
KiwgY29uc3QgU3RyaW5nJiBtb2RlLCBXZWJDb3JlOjpBc3luY0ZpbGVXcml0ZXJDbGllbnQqKTsK
KworICAgIC8vIE1ldGhvZHMgdGhhdCBhcmUgdG8gYmUgY2FsbGVkIG9uIHRoZSBtYWluIHRocmVh
ZC4KKyAgICBzdGF0aWMgdm9pZCB3cml0ZU9uTWFpblRocmVhZChXZWJDb3JlOjpTY3JpcHRFeGVj
dXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdl
PiwgbG9uZyBsb25nIHBvc2l0aW9uLCBjb25zdCBXZWJVUkwmIGRhdGEpOworICAgIHN0YXRpYyB2
b2lkIHRydW5jYXRlT25NYWluVGhyZWFkKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQq
LCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+LCBsb25nIGxvbmcg
bGVuZ3RoKTsKKyAgICBzdGF0aWMgdm9pZCBhYm9ydE9uTWFpblRocmVhZChXZWJDb3JlOjpTY3Jp
cHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tz
QnJpZGdlPik7CisgICAgc3RhdGljIHZvaWQgc2h1dGRvd25Pbk1haW5UaHJlYWQoV2ViQ29yZTo6
U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxi
YWNrc0JyaWRnZT4pOworCisgICAgZnJpZW5kIGNsYXNzIE1haW5UaHJlYWRGaWxlV3JpdGVyQ2xp
ZW50OworCisgICAgLy8gTWV0aG9kcyB0aGF0IGRpc3BhdGNoIHRvIEFzeW5jRmlsZVdyaXRlckNs
aWVudCBvbiB0aGUgd29ya2VyIHRocmVhZHMuCisgICAgLy8gVGhleSByZWxlYXNlIGEgc2VsZlJl
ZiBvZiB0aGUgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS4KKyAgICBzdGF0aWMgdm9p
ZCBkaWRXcml0ZU9uV29ya2VyVGhyZWFkKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQq
LCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlKiwgbG9uZyBsb25nIGxlbmd0aCwgYm9v
bCBjb21wbGV0ZSk7CisgICAgc3RhdGljIHZvaWQgZGlkRmFpbE9uV29ya2VyVGhyZWFkKFdlYkNv
cmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJp
ZGdlKiwgV2ViRmlsZUVycm9yKTsKKyAgICBzdGF0aWMgdm9pZCBkaWRUcnVuY2F0ZU9uV29ya2Vy
VGhyZWFkKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBXb3JrZXJGaWxlV3JpdGVy
Q2FsbGJhY2tzQnJpZGdlKik7CisKKyAgICAvLyBGb3IgZWFybHktZXhpc3Q7IHRoaXMgZGVyZWYn
cyBzZWxmUmVmIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHdvcmtlciBpcyBhbHJlYWR5IG51bGwu
CisgICAgYm9vbCBkZXJlZklmV29ya2VySXNTdG9wcGVkKCk7CisKKyAgICAvLyBMYXp5IGluaXRp
YWxpemF0aW9uIG9mIHRoZSBXZWJGaWxlV3JpdGVyLgorICAgIHZvaWQgaW5pdFdlYkZpbGVXcml0
ZXIoKTsKKyAgICBzdGF0aWMgdm9pZCBydW5UYXNrT25NYWluVGhyZWFkKFdlYkNvcmU6OlNjcmlw
dEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NC
cmlkZ2U+LCBQYXNzT3duUHRyPFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2s+
KTsKKyAgICBzdGF0aWMgdm9pZCBydW5UYXNrT25Xb3JrZXJUaHJlYWQoV2ViQ29yZTo6U2NyaXB0
RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0Jy
aWRnZT4sIFBhc3NPd25QdHI8V2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6VGFzaz4p
OworCisgICAgdm9pZCBkaXNwYXRjaFRhc2tUb01haW5UaHJlYWQoUGFzc093blB0cjxXZWJDb3Jl
OjpTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPik7CisgICAgdm9pZCBtYXlQb3N0VGFza1Rv
V29ya2VyKFBhc3NPd25QdHI8V2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6VGFzaz4p
OworCisgICAgLy8gVXNlZCB0byBwcm90ZWN0IGFjY2VzcyB0byBtX3dvcmtlci4KKyAgICBNdXRl
eCBtX211dGV4OworICAgIC8vIEluZGljYXRlcyB0aGF0IG1fd3JpdGVyIGlzIGdvbmUgZHVlIHRv
IHNodXRkb3duLiAgV2l0aG91dCB0aGlzIGZsYWcgc2V0LCBpZiBpdCdzIG5vdCB0aGVyZSwgdGhl
IG1haW4gdGhyZWFkIHdpbGwgbGF6aWx5IGNyZWF0ZSBvbmUuCisgICAgYm9vbCBtX3NodXR0aW5n
RG93bk9uTWFpblRocmVhZDsKKyAgICBXZWJGaWxlU3lzdGVtKiBtX3dlYkZpbGVTeXN0ZW07Cisg
ICAgU3RyaW5nIG1fcGF0aDsKKyAgICAvLyBDcmVhdGVkIGFuZCBjbGVhcmVkIG9uIHRoZSBjb250
ZXh0IHRocmVhZCwgYnV0IGFsc28gdXNlZCBmcm9tIHRoZSBtYWluIHRocmVhZC4KKyAgICBXZWJX
b3JrZXJCYXNlKiBtX3dvcmtlcjsKKyAgICBXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0
KiBtX3dvcmtlckNvbnRleHQ7CisgICAgLy8gQ3JlYXRlZCBhbmQgZGVzdHJveWVkIGZyb20gdGhl
IG1haW4gdGhyZWFkLiAgVG8gZHJvcCB5b3VyIGxhc3QgcmVmZXJlbmNlIHRvIGEgV29ya2VyRmls
ZVdyaXRlckNhbGxiYWNrc0JyaWRnZSwgcmVsZWFzZSBpdCB0byBwb3N0U2h1dGRvd25Ub01haW5U
aHJlYWQgdG8gZ2l2ZSB0aGUgYnJpZGdlIHRoZSBjaGFuY2UgdG8gY2xlYW4gdXAgbV93cml0ZXIu
CisgICAgT3duUHRyPFdlYktpdDo6V2ViRmlsZVdyaXRlcj4gbV93cml0ZXI7CisgICAgU3RyaW5n
IG1fbW9kZTsKKworICAgIFdlYkNvcmU6OkFzeW5jRmlsZVdyaXRlckNsaWVudCogbV9jbGllbnRP
bldvcmtlclRocmVhZDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmCisK
KyNlbmRpZiAvLyBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlX2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>70899</attachid>
            <date>2010-10-15 14:53:51 -0700</date>
            <delta_ts>2010-10-20 16:43:07 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-47681-20101015145349.patch</filename>
            <type>text/plain</type>
            <size>46732</size>
            <attacher name="Eric U.">ericu</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2OTgwNSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjggQEAKKzIwMTAtMTAtMTQgIEVyaWMgVWhyaGFuZSAgPGVyaWN1QGNocm9taXVt
Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBb
Q2hyb21pdW1dIGltcGxlbWVudGF0aW9uIG9mIGFzeW5jIEZpbGVXcml0ZXIgZm9yIHdvcmtlcnMK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ3NjgxCisK
KyAgICAgICAgSW5pdGlhbCB0ZXN0cyBhcmUgaW4gYSBzZXBhcmF0ZSBjaGFuZ2VsaXN0LgorCisg
ICAgICAgICogZmlsZWFwaS9GaWxlSW5mby5oOiBBZGRlZDsgdXNlZCB0byByZXR1cm4gZnVsbCBt
ZXRhZGF0YSBmcm9tIGdldE1ldGFkYXRhIGNhbGxzLgorCisgICAgICAgIEJ1aWxkIGZpbGVzIG1v
ZGlmaWVkIHRvIGFkZCBGaWxlSW5mby5oLgorICAgICAgICAqIFdlYkNvcmUucHJvCisgICAgICAg
ICogR05VbWFrZWZpbGUuYW0KKyAgICAgICAgKiBXZWJDb3JlLmd5cGkKKyAgICAgICAgKiBXZWJD
b3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJvai9X
ZWJDb3JlLnZjcHJvagorCisgICAgICAgIFRoZSByZXN0IG9mIHRoZSBjaGFuZ2VzIGhlcmUganVz
dCBwYXNzIHRoZSBuZXcgRmlsZUluZm8gb2JqZWN0IHRocm91Z2ggdGhlIGNhbGxzIHRoYXQgdXNl
ZCB0byB0YWtlIGEgbW9kaWZpY2F0aW9uIHRpbWUuCisgICAgICAgICogZmlsZWFwaS9GaWxlU3lz
dGVtQ2FsbGJhY2tzLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkZpbGVTeXN0ZW1DYWxsYmFja3NC
YXNlOjpkaWRSZWFkTWV0YWRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6TWV0YWRhdGFDYWxsYmFj
a3M6OmRpZFJlYWRNZXRhZGF0YSk6CisgICAgICAgICogZmlsZWFwaS9GaWxlU3lzdGVtQ2FsbGJh
Y2tzLmg6CisgICAgICAgICogcGxhdGZvcm0vQXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzLmg6CisK
IDIwMTAtMTAtMTQgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBLZW5uZXRoIFJ1c3NlbGwuCkluZGV4OiBXZWJDb3JlL0dOVW1ha2VmaWxlLmFtCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvR05VbWFrZWZpbGUuYW0JKHJldmlzaW9uIDY5NzI0KQorKysg
V2ViQ29yZS9HTlVtYWtlZmlsZS5hbQkod29ya2luZyBjb3B5KQpAQCAtMTQwNSw2ICsxNDA1LDcg
QEAgd2ViY29yZV9zb3VyY2VzICs9IFwKIAlXZWJDb3JlL2ZpbGVhcGkvRmlsZUVycm9yLmggXAog
CVdlYkNvcmUvZmlsZWFwaS9GaWxlRXhjZXB0aW9uLmggXAogCVdlYkNvcmUvZmlsZWFwaS9GaWxl
LmggXAorCVdlYkNvcmUvZmlsZWFwaS9GaWxlSW5mby5oIFwKIAlXZWJDb3JlL2ZpbGVhcGkvRmls
ZUxpc3QuY3BwIFwKIAlXZWJDb3JlL2ZpbGVhcGkvRmlsZUxpc3QuaCBcCiAJV2ViQ29yZS9maWxl
YXBpL0ZpbGVSZWFkZXIuY3BwIFwKSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS5neXBpCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS5neXBpCShyZXZpc2lvbiA2OTcyNCkKKysrIFdlYkNvcmUv
V2ViQ29yZS5neXBpCSh3b3JraW5nIGNvcHkpCkBAIC0xNDk1LDYgKzE0OTUsNyBAQAogICAgICAg
ICAgICAgJ2ZpbGVhcGkvRmlsZUVudHJ5U3luYy5oJywKICAgICAgICAgICAgICdmaWxlYXBpL0Zp
bGVFcnJvci5oJywKICAgICAgICAgICAgICdmaWxlYXBpL0ZpbGVFeGNlcHRpb24uaCcsCisgICAg
ICAgICAgICAnZmlsZWFwaS9GaWxlSW5mby5oJywKICAgICAgICAgICAgICdmaWxlYXBpL0ZpbGVM
aXN0LmNwcCcsCiAgICAgICAgICAgICAnZmlsZWFwaS9GaWxlTGlzdC5oJywKICAgICAgICAgICAg
ICdmaWxlYXBpL0ZpbGVSZWFkZXIuY3BwJywKSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS5wcm8KPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLnBybwkocmV2aXNpb24gNjk3MjQpCisrKyBXZWJD
b3JlL1dlYkNvcmUucHJvCSh3b3JraW5nIGNvcHkpCkBAIC0yOTk0LDYgKzI5OTQsNyBAQCBjb250
YWlucyhERUZJTkVTLCBFTkFCTEVfRklMRV9TWVNURU09MSkgCiAgICAgICAgIGZpbGVhcGkvRmls
ZUNhbGxiYWNrLmggXAogICAgICAgICBmaWxlYXBpL0ZpbGVFbnRyeS5oIFwKICAgICAgICAgZmls
ZWFwaS9GaWxlRW50cnlTeW5jLmggXAorICAgICAgICBmaWxlYXBpL0ZpbGVJbmZvLmggXAogICAg
ICAgICBmaWxlYXBpL0ZpbGVTeXN0ZW1DYWxsYmFjay5oIFwKICAgICAgICAgZmlsZWFwaS9GaWxl
U3lzdGVtQ2FsbGJhY2tzLmggXAogICAgICAgICBmaWxlYXBpL0ZpbGVXcml0ZXIuaCBcCkluZGV4
OiBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHJldmlzaW9uIDY5NzI0KQorKysg
V2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagkod29ya2luZyBjb3B5KQpAQCAt
NDgzMzEsNiArNDgzMzEsMTAgQEAKIAkJCQk+DQogCQkJPC9GaWxlPg0KIAkJCTxGaWxlDQorCQkJ
CVJlbGF0aXZlUGF0aD0iLi5cZmlsZWFwaVxGaWxlSW5mby5oIg0KKwkJCQk+DQorCQkJPC9GaWxl
Pg0KKwkJCTxGaWxlDQogCQkJCVJlbGF0aXZlUGF0aD0iLi5caHRtbFxGaWxlSW5wdXRUeXBlLmNw
cCINCiAJCQkJPg0KIAkJCTwvRmlsZT4NCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gNjk3MjQpCisrKyBXZWJDb3JlL1dlYkNvcmUueGNv
ZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtOTMwLDYgKzkzMCw3IEBA
CiAJCTQ2MTRBMUZFMEIyM0E4RDYwMDQ0NkUxQyAvKiBjb3B5Q3Vyc29yLnBuZyBpbiBSZXNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDYxNEExRkQwQjIzQThENjAw
NDQ2RTFDIC8qIGNvcHlDdXJzb3IucG5nICovOyB9OwogCQk0NjRFQTI3MzBCOEEzNTBCMDBBOEU2
RTMgLyogY3Jvc3NIYWlyQ3Vyc29yLnBuZyBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gNDY0RUEyNzEwQjhBMzUwQjAwQThFNkUzIC8qIGNyb3NzSGFpckN1
cnNvci5wbmcgKi87IH07CiAJCTQ2NEVBMjc0MEI4QTM1MEIwMEE4RTZFMyAvKiBub3RBbGxvd2Vk
Q3Vyc29yLnBuZyBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gNDY0RUEyNzIwQjhBMzUwQjAwQThFNkUzIC8qIG5vdEFsbG93ZWRDdXJzb3IucG5nICovOyB9
OworCQk0Njg5RjFBRjEyNjdCQUUxMDBFOEQzODAgLyogRmlsZUluZm8uaCBpbiBIZWFkZXJzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ2ODlGMUFFMTI2N0JBRTEwMEU4RDM4
MCAvKiBGaWxlSW5mby5oICovOyB9OwogCQk0NkJEMTZFMzBCMjc5NDczMDAxRjA4MzkgLyogbm9u
ZUN1cnNvci5wbmcgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IDQ2QkQxNkUyMEIyNzk0NzMwMDFGMDgzOSAvKiBub25lQ3Vyc29yLnBuZyAqLzsgfTsKIAkJ
NDZENEYyNDkwQUY5N0U4MTAwMzUzODVBIC8qIGNlbGxDdXJzb3IucG5nIGluIFJlc291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0NkQ0RjI0NjBBRjk3RTgxMDAzNTM4
NUEgLyogY2VsbEN1cnNvci5wbmcgKi87IH07CiAJCTQ2RDRGMjRBMEFGOTdFODEwMDM1Mzg1QSAv
KiBjb250ZXh0TWVudUN1cnNvci5wbmcgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDQ2RDRGMjQ3MEFGOTdFODEwMDM1Mzg1QSAvKiBjb250ZXh0TWVudUN1
cnNvci5wbmcgKi87IH07CkBAIC02OTU3LDYgKzY5NTgsNyBAQAogCQk0NjE0QTFGRDBCMjNBOEQ2
MDA0NDZFMUMgLyogY29weUN1cnNvci5wbmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
bGFzdEtub3duRmlsZVR5cGUgPSBpbWFnZS5wbmc7IHBhdGggPSBjb3B5Q3Vyc29yLnBuZzsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNDY0RUEyNzEwQjhBMzUwQjAwQThFNkUzIC8qIGNy
b3NzSGFpckN1cnNvci5wbmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3du
RmlsZVR5cGUgPSBpbWFnZS5wbmc7IHBhdGggPSBjcm9zc0hhaXJDdXJzb3IucG5nOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwogCQk0NjRFQTI3MjBCOEEzNTBCMDBBOEU2RTMgLyogbm90QWxs
b3dlZEN1cnNvci5wbmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmls
ZVR5cGUgPSBpbWFnZS5wbmc7IHBhdGggPSBub3RBbGxvd2VkQ3Vyc29yLnBuZzsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDY4OUYxQUUxMjY3QkFFMTAwRThEMzgwIC8qIEZpbGVJbmZv
LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEZpbGVJbmZvLmg7IHBhdGggPSBm
aWxlYXBpL0ZpbGVJbmZvLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTQ2QkQxNkUy
MEIyNzk0NzMwMDFGMDgzOSAvKiBub25lQ3Vyc29yLnBuZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGltYWdlLnBuZzsgcGF0aCA9IG5vbmVDdXJzb3Iu
cG5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk0NkQ0RjI0NjBBRjk3RTgxMDAzNTM4
NUEgLyogY2VsbEN1cnNvci5wbmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtu
b3duRmlsZVR5cGUgPSBpbWFnZS5wbmc7IHBhdGggPSBjZWxsQ3Vyc29yLnBuZzsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNDZENEYyNDcwQUY5N0U4MTAwMzUzODVBIC8qIGNvbnRleHRN
ZW51Q3Vyc29yLnBuZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxl
VHlwZSA9IGltYWdlLnBuZzsgcGF0aCA9IGNvbnRleHRNZW51Q3Vyc29yLnBuZzsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTE0OTA3LDYgKzE0OTA5LDcgQEAKIAkJCQk4OTNDNDdGRjEy
NDhCRDM5MDAyQjNEODYgLyogRmlsZUVudHJ5U3luYy5oICovLAogCQkJCTk3NkQ2QzY0MTIyQjhB
M0QwMDFGRDFGNyAvKiBGaWxlRXJyb3IuaCAqLywKIAkJCQkyRURGMzY5RTEyMkM5NEM4MDAyRjdE
NEUgLyogRmlsZUV4Y2VwdGlvbi5oICovLAorCQkJCTQ2ODlGMUFFMTI2N0JBRTEwMEU4RDM4MCAv
KiBGaWxlSW5mby5oICovLAogCQkJCTk3NkQ2QzY2MTIyQjhBM0QwMDFGRDFGNyAvKiBGaWxlTGlz
dC5jcHAgKi8sCiAJCQkJOTc2RDZDNjcxMjJCOEEzRDAwMUZEMUY3IC8qIEZpbGVMaXN0LmggKi8s
CiAJCQkJOTc2RDZDNjkxMjJCOEEzRDAwMUZEMUY3IC8qIEZpbGVSZWFkZXIuY3BwICovLApAQCAt
MjEwNjksNiArMjEwNzIsNyBAQAogCQkJCTkzRjE5OUVEMDgyNDVFNTkwMDFFOUFCQyAvKiBYU0xU
UHJvY2Vzc29yLmggaW4gSGVhZGVycyAqLywKIAkJCQlFMUJFNTEyRTBDRjZDNTEyMDAyRUE5NTkg
LyogWFNMVFVuaWNvZGVTb3J0LmggaW4gSGVhZGVycyAqLywKIAkJCQk5N0RENEQ4NzBGREY0RDZF
MDBFQ0Y5QTQgLyogWFNTQXVkaXRvci5oIGluIEhlYWRlcnMgKi8sCisJCQkJNDY4OUYxQUYxMjY3
QkFFMTAwRThEMzgwIC8qIEZpbGVJbmZvLmggaW4gSGVhZGVycyAqLywKIAkJCSk7CiAJCQlydW5P
bmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKSW5kZXg6IFdlYkNvcmUv
ZmlsZWFwaS9GaWxlSW5mby5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZmlsZWFwaS9GaWxlSW5m
by5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9maWxlYXBpL0ZpbGVJbmZvLmgJKHJldmlzaW9u
IDApCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBh
cmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29w
eXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0
aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0
b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZy
b20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1p
c3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hU
IEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgor
ICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEZpbGVJbmZvX2gKKyNkZWZpbmUgRmlsZUluZm9f
aAorCisjaWYgRU5BQkxFKEZJTEVfU1lTVEVNKQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0
cnVjdCBGaWxlSW5mbyB7CisgICAgLy8gVGhlIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhl
IGZpbGUsIGluIHNlY29uZHMuCisgICAgLy8gVGhlIHZhbHVlIDAuMCBtZWFucyB0aGF0IHRoZSB0
aW1lIGlzIG5vdCBzZXQuCisgICAgZG91YmxlIG1vZGlmaWNhdGlvblRpbWU7CisKKyAgICAvLyBU
aGUgbGVuZ3RoIG9mIHRoZSBmaWxlIGluIGJ5dGVzLgorICAgIC8vIFRoZSB2YWx1ZSAtMSBtZWFu
cyB0aGF0IHRoZSBsZW5ndGggaXMgbm90IHNldC4KKyAgICBsb25nIGxvbmcgbGVuZ3RoOworCisg
ICAgZW51bSBUeXBlIHsKKyAgICAgICAgVHlwZVVua25vd24gPSAwLAorICAgICAgICBUeXBlRmls
ZSwKKyAgICAgICAgVHlwZURpcmVjdG9yeQorICAgIH07CisKKyAgICBUeXBlIHR5cGU7CisKKyAg
ICBGaWxlSW5mbygpIDogbW9kaWZpY2F0aW9uVGltZSgwLjApLCBsZW5ndGgoLTEpLCB0eXBlKFR5
cGVVbmtub3duKSB7IH0KK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8v
IEVOQUJMRShGSUxFX1NZU1RFTSkKKworI2VuZGlmIC8vIERPTUZpbGVTeXN0ZW1faApJbmRleDog
V2ViQ29yZS9maWxlYXBpL0ZpbGVTeXN0ZW1DYWxsYmFja3MuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvZmlsZWFwaS9GaWxlU3lzdGVtQ2FsbGJhY2tzLmNwcAkocmV2aXNpb24gNjk3MjQpCisr
KyBXZWJDb3JlL2ZpbGVhcGkvRmlsZVN5c3RlbUNhbGxiYWNrcy5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTc3LDcgKzc3LDcgQEAgdm9pZCBGaWxlU3lzdGVtQ2FsbGJhY2tzQmFzZTo6ZGlkT3BlbkZp
bAogICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwogfQogCi12b2lkIEZpbGVTeXN0ZW1DYWxsYmFj
a3NCYXNlOjpkaWRSZWFkTWV0YWRhdGEoZG91YmxlKQordm9pZCBGaWxlU3lzdGVtQ2FsbGJhY2tz
QmFzZTo6ZGlkUmVhZE1ldGFkYXRhKGNvbnN0IEZpbGVJbmZvJikKIHsKICAgICAvLyBFYWNoIHN1
YmNsYXNzIG11c3QgaW1wbGVtZW50IGFuIGFwcHJvcHJpYXRlIG9uZS4KICAgICBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsKQEAgLTIwNSwxMCArMjA1LDEwIEBAIE1ldGFkYXRhQ2FsbGJhY2tzOjpNZXRh
ZGF0YUNhbGxiYWNrcyhQYXMKIHsKIH0KIAotdm9pZCBNZXRhZGF0YUNhbGxiYWNrczo6ZGlkUmVh
ZE1ldGFkYXRhKGRvdWJsZSBtb2RpZmljYXRpb25UaW1lKQordm9pZCBNZXRhZGF0YUNhbGxiYWNr
czo6ZGlkUmVhZE1ldGFkYXRhKGNvbnN0IEZpbGVJbmZvJiBpbmZvKQogewogICAgIGlmIChtX3N1
Y2Nlc3NDYWxsYmFjaykKLSAgICAgICAgbV9zdWNjZXNzQ2FsbGJhY2stPmhhbmRsZUV2ZW50KE1l
dGFkYXRhOjpjcmVhdGUobW9kaWZpY2F0aW9uVGltZSkuZ2V0KCkpOworICAgICAgICBtX3N1Y2Nl
c3NDYWxsYmFjay0+aGFuZGxlRXZlbnQoTWV0YWRhdGE6OmNyZWF0ZShpbmZvLm1vZGlmaWNhdGlv
blRpbWUpLmdldCgpKTsKICAgICBtX3N1Y2Nlc3NDYWxsYmFjay5jbGVhcigpOwogfQogCkluZGV4
OiBXZWJDb3JlL2ZpbGVhcGkvRmlsZVN5c3RlbUNhbGxiYWNrcy5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvZmlsZWFwaS9GaWxlU3lzdGVtQ2FsbGJhY2tzLmgJKHJldmlzaW9uIDY5NzI0KQorKysg
V2ViQ29yZS9maWxlYXBpL0ZpbGVTeXN0ZW1DYWxsYmFja3MuaAkod29ya2luZyBjb3B5KQpAQCAt
MzQsNiArMzQsNyBAQAogI2lmIEVOQUJMRShGSUxFX1NZU1RFTSkKIAogI2luY2x1ZGUgIkFzeW5j
RmlsZVN5c3RlbUNhbGxiYWNrcy5oIgorI2luY2x1ZGUgIkZpbGVJbmZvLmgiCiAjaW5jbHVkZSAi
UGxhdGZvcm1TdHJpbmcuaCIKICNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgogI2luY2x1ZGUg
PHd0Zi9WZWN0b3IuaD4KQEAgLTY1LDcgKzY2LDcgQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9p
ZCBkaWRPcGVuRmlsZVN5c3RlbShjb25zdCBTdHJpbmcmIG5hbWUsIFBhc3NPd25QdHI8QXN5bmNG
aWxlU3lzdGVtPik7CiAKICAgICAvLyBGb3IgTWV0YWRhdGFDYWxsYmFja3MuCi0gICAgdmlydHVh
bCB2b2lkIGRpZFJlYWRNZXRhZGF0YShkb3VibGUgbW9kaWZpY2F0aW9uVGltZSk7CisgICAgdmly
dHVhbCB2b2lkIGRpZFJlYWRNZXRhZGF0YShjb25zdCBGaWxlSW5mbyYpOwogCiAgICAgLy8gRm9y
IEVudHJpZXNDYWxsYmFja3MuIGRpZFJlYWREaXJlY3RvcnlFbnRyeSBpcyBjYWxsZWQgZWFjaCB0
aW1lIHRoZSBBUEkgcmVhZHMgYW4gZW50cnksIGFuZCBkaWRSZWFkRGlyZWN0b3J5RG9uZSBpcyBj
YWxsZWQgd2hlbiBhIGNodW5rIG9mIGVudHJpZXMgaGF2ZSBiZWVuIHJlYWQgKGkuZS4gZ29vZCB0
aW1lIHRvIGNhbGwgYmFjayB0byB0aGUgYXBwbGljYXRpb24pLiAgSWYgaGFzTW9yZSBpcyB0cnVl
IHRoZXJlIGNhbiBiZSBtb3JlIGNodW5rcy4KICAgICB2aXJ0dWFsIHZvaWQgZGlkUmVhZERpcmVj
dG9yeUVudHJ5KGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCBpc0RpcmVjdG9yeSk7CkBAIC0xMjUs
NyArMTI2LDcgQEAgcHJpdmF0ZToKIGNsYXNzIE1ldGFkYXRhQ2FsbGJhY2tzIDogcHVibGljIEZp
bGVTeXN0ZW1DYWxsYmFja3NCYXNlIHsKIHB1YmxpYzoKICAgICBzdGF0aWMgUGFzc093blB0cjxN
ZXRhZGF0YUNhbGxiYWNrcz4gY3JlYXRlKFBhc3NSZWZQdHI8TWV0YWRhdGFDYWxsYmFjaz4sIFBh
c3NSZWZQdHI8RXJyb3JDYWxsYmFjaz4pOwotICAgIHZpcnR1YWwgdm9pZCBkaWRSZWFkTWV0YWRh
dGEoZG91YmxlIG1vZGlmaWNhdGlvblRpbWUpOworICAgIHZpcnR1YWwgdm9pZCBkaWRSZWFkTWV0
YWRhdGEoY29uc3QgRmlsZUluZm8mKTsKIAogcHJpdmF0ZToKICAgICBNZXRhZGF0YUNhbGxiYWNr
cyhQYXNzUmVmUHRyPE1ldGFkYXRhQ2FsbGJhY2s+LCBQYXNzUmVmUHRyPEVycm9yQ2FsbGJhY2s+
KTsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vQXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9Bc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3MuaAko
cmV2aXNpb24gNjk3MjQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL0FzeW5jRmlsZVN5c3RlbUNhbGxi
YWNrcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMyw2ICszMyw3IEBACiAKICNpZiBFTkFCTEUoRklM
RV9TWVNURU0pCiAKKyNpbmNsdWRlICJGaWxlSW5mby5oIgogI2luY2x1ZGUgIlBsYXRmb3JtU3Ry
aW5nLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKQEAgLTQ5LDcgKzUwLDcgQEAgcHVibGljOgog
ICAgIHZpcnR1YWwgdm9pZCBkaWRPcGVuRmlsZVN5c3RlbShjb25zdCBTdHJpbmcmIG5hbWUsIFBh
c3NPd25QdHI8QXN5bmNGaWxlU3lzdGVtPikgPSAwOwogCiAgICAgLy8gQ2FsbGVkIHdoZW4gYSBm
aWxlIG1ldGFkYXRhIGlzIHJlYWQgc3VjY2Vzc2Z1bGx5LgotICAgIHZpcnR1YWwgdm9pZCBkaWRS
ZWFkTWV0YWRhdGEoZG91YmxlIG1vZGlmaWNhdGlvblRpbWUpID0gMDsKKyAgICB2aXJ0dWFsIHZv
aWQgZGlkUmVhZE1ldGFkYXRhKGNvbnN0IEZpbGVJbmZvJikgPSAwOwogCiAgICAgLy8gQ2FsbGVk
IHdoZW4gYSBkaXJlY3RvcnkgZW50cnkgaXMgcmVhZC4KICAgICB2aXJ0dWFsIHZvaWQgZGlkUmVh
ZERpcmVjdG9yeUVudHJ5KGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCBpc0RpcmVjdG9yeSkgPSAw
OwpJbmRleDogV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQv
Y2hyb21pdW0vQ2hhbmdlTG9nCShyZXZpc2lvbiA2OTgwNSkKKysrIFdlYktpdC9jaHJvbWl1bS9D
aGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwzMCBAQAorMjAxMC0xMC0xNCAgRXJp
YyBVaHJoYW5lICA8ZXJpY3VAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFtDaHJvbWl1bV0gaW1wbGVtZW50YXRpb24gb2YgYXN5
bmMgRmlsZVdyaXRlciBmb3Igd29ya2VycworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9NDc2ODEKKworICAgICAgICAqIFdlYktpdC5neXA6CisKKyAgICAg
ICAgV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0gbmVlZGVkIGxhenkgaW5pdGlhbGl6YXRp
b24gW2xhenkgY3JlYXRpb24gb2YgdGhlIFdlYkZpbGVXcml0ZXJdLiAgSXQgdHVybmVkIG91dCB0
aGF0IEkgY291bGQgaGF2ZSBkb25lIHRoYXQgZm9yIEFzeW5jRmlsZVdyaXRlckNocm9taXVtLCBh
bmQgaXQncyBjbGVhbmVyLCBzbyBJIG1hZGUgdGhlbSBtYXRjaC4KKworICAgICAgICBHZXRNZXRh
ZGF0YSBjYWxscyBub3cgcmV0dXJuIGZ1bGwgbWV0YWRhdGEgcmF0aGVyIHRoYW4ganVzdCBhIG1v
ZGlmaWNhdGlvbiB0aW1lLgorCisgICAgICAgICogc3JjL0FzeW5jRmlsZVN5c3RlbUNocm9taXVt
LmNwcDoKKyAgICAgICAgKiBzcmMvQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uY3BwOgorICAgICAg
ICAqIHNyYy9Bc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5oOgorICAgICAgICAqIHNyYy9XZWJGaWxl
U3lzdGVtQ2FsbGJhY2tzSW1wbC5jcHA6CisgICAgICAgICogc3JjL1dvcmtlckFzeW5jRmlsZVN5
c3RlbUNocm9taXVtLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldvcmtlckZpbGVXcml0ZXJIZWxw
ZXJDYWxsYmFja3MpOiBOZXcgaGVscGVyIGNsYXNzLgorCisgICAgICAgICogc3JjL1dvcmtlckFz
eW5jRmlsZVdyaXRlckNocm9taXVtLmNwcDogQWRkZWQuCisgICAgICAgICogc3JjL1dvcmtlckFz
eW5jRmlsZVdyaXRlckNocm9taXVtLmg6IEFkZGVkLgorCisgICAgICAgIFRoaXMgY2xhc3MgYnJp
ZGdlcyBmaWxld3JpdGVyIGFuZCBmaWxld3JpdGVyY2xpZW50IGNhbGxzIGJldHdlZW4gdGhlIGNv
bnRleHQgYW5kIG1haW4gdGhyZWFkcy4KKyAgICAgICAgKiBzcmMvV29ya2VyRmlsZVdyaXRlckNh
bGxiYWNrc0JyaWRnZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHNyYy9Xb3JrZXJGaWxlV3JpdGVy
Q2FsbGJhY2tzQnJpZGdlLmg6IEFkZGVkLgorCiAyMDEwLTEwLTEzICBLaW51a28gWWFzdWRhICA8
a2ludWtvQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBKaWFuIExpLgpJbmRl
eDogV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9t
aXVtL1dlYktpdC5neXAJKHJldmlzaW9uIDY5NzI0KQorKysgV2ViS2l0L2Nocm9taXVtL1dlYktp
dC5neXAJKHdvcmtpbmcgY29weSkKQEAgLTU0MCw4ICs1NDAsMTIgQEAKICAgICAgICAgICAgICAg
ICAnc3JjL1dlYldvcmtlckltcGwuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9Xb3JrZXJBc3lu
Y0ZpbGVTeXN0ZW1DaHJvbWl1bS5jcHAnLAogICAgICAgICAgICAgICAgICdzcmMvV29ya2VyQXN5
bmNGaWxlU3lzdGVtQ2hyb21pdW0uaCcsCisgICAgICAgICAgICAgICAgJ3NyYy9Xb3JrZXJBc3lu
Y0ZpbGVXcml0ZXJDaHJvbWl1bS5jcHAnLAorICAgICAgICAgICAgICAgICdzcmMvV29ya2VyQXN5
bmNGaWxlV3JpdGVyQ2hyb21pdW0uaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9Xb3JrZXJGaWxl
U3lzdGVtQ2FsbGJhY2tzQnJpZGdlLmNwcCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9Xb3JrZXJG
aWxlU3lzdGVtQ2FsbGJhY2tzQnJpZGdlLmgnLAorICAgICAgICAgICAgICAgICdzcmMvV29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5jcHAnLAorICAgICAgICAgICAgICAgICdzcmMvV29y
a2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5oJywKICAgICAgICAgICAgICAgICAnc3JjL1dy
YXBwZWRSZXNvdXJjZVJlcXVlc3QuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9XcmFwcGVkUmVz
b3VyY2VSZXNwb25zZS5oJywKICAgICAgICAgICAgICAgICAnc3JjL3dpbi9XZWJJbnB1dEV2ZW50
RmFjdG9yeS5jcHAnLApJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9Bc3luY0ZpbGVTeXN0ZW1D
aHJvbWl1bS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9Bc3luY0ZpbGVT
eXN0ZW1DaHJvbWl1bS5jcHAJKHJldmlzaW9uIDY5NzI0KQorKysgV2ViS2l0L2Nocm9taXVtL3Ny
Yy9Bc3luY0ZpbGVTeXN0ZW1DaHJvbWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEzMiw5ICsx
MzIsNyBAQCBwdWJsaWM6CiAgICAgICAgIGlmIChpbmZvLnR5cGUgIT0gV2ViS2l0OjpXZWJGaWxl
SW5mbzo6VHlwZUZpbGUgfHwgaW5mby5sZW5ndGggPCAwKQogICAgICAgICAgICAgbV9jYWxsYmFj
a3MtPmRpZEZhaWwoV2ViS2l0OjpXZWJGaWxlRXJyb3JJbnZhbGlkU3RhdGUpOwogICAgICAgICBl
bHNlIHsKLSAgICAgICAgICAgIE93blB0cjxBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bT4gYXN5bmNG
aWxlV3JpdGVyQ2hyb21pdW0gPSBhZG9wdFB0cihuZXcgQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0o
bV9jbGllbnQpKTsKLSAgICAgICAgICAgIE93blB0cjxXZWJLaXQ6OldlYkZpbGVXcml0ZXI+IHdl
YkZpbGVXcml0ZXIgPSBhZG9wdFB0cihtX3dlYkZpbGVTeXN0ZW0tPmNyZWF0ZUZpbGVXcml0ZXIo
bV9wYXRoLCBhc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5nZXQoKSkpOwotICAgICAgICAgICAgYXN5
bmNGaWxlV3JpdGVyQ2hyb21pdW0tPnNldFdlYkZpbGVXcml0ZXIod2ViRmlsZVdyaXRlci5yZWxl
YXNlKCkpOworICAgICAgICAgICAgT3duUHRyPEFzeW5jRmlsZVdyaXRlckNocm9taXVtPiBhc3lu
Y0ZpbGVXcml0ZXJDaHJvbWl1bSA9IGFkb3B0UHRyKG5ldyBBc3luY0ZpbGVXcml0ZXJDaHJvbWl1
bShtX2NsaWVudCwgbV93ZWJGaWxlU3lzdGVtLCBtX3BhdGgpKTsKICAgICAgICAgICAgIG1fY2Fs
bGJhY2tzLT5kaWRDcmVhdGVGaWxlV3JpdGVyKGFzeW5jRmlsZVdyaXRlckNocm9taXVtLnJlbGVh
c2UoKSwgaW5mby5sZW5ndGgpOwogICAgICAgICB9CiAgICAgICAgIGRlbGV0ZSB0aGlzOwpJbmRl
eDogV2ViS2l0L2Nocm9taXVtL3NyYy9Bc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9Bc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5jcHAJ
KHJldmlzaW9uIDY5NzI0KQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9Bc3luY0ZpbGVXcml0ZXJD
aHJvbWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM1LDEzICszNSwxNiBAQAogCiAjaW5jbHVk
ZSAiQXN5bmNGaWxlV3JpdGVyQ2xpZW50LmgiCiAjaW5jbHVkZSAiQmxvYi5oIgorI2luY2x1ZGUg
IldlYkZpbGVTeXN0ZW0uaCIKICNpbmNsdWRlICJXZWJGaWxlV3JpdGVyLmgiCiAjaW5jbHVkZSAi
V2ViVVJMLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotQXN5bmNGaWxlV3JpdGVyQ2hyb21p
dW06OkFzeW5jRmlsZVdyaXRlckNocm9taXVtKEFzeW5jRmlsZVdyaXRlckNsaWVudCogY2xpZW50
KQorQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW06OkFzeW5jRmlsZVdyaXRlckNocm9taXVtKEFzeW5j
RmlsZVdyaXRlckNsaWVudCogY2xpZW50LCBXZWJLaXQ6OldlYkZpbGVTeXN0ZW0qIHdlYkZpbGVT
eXN0ZW0sIGNvbnN0IFN0cmluZyYgcGF0aCkKICAgICA6IG1fY2xpZW50KGNsaWVudCkKKyAgICAs
IG1fd2ViRmlsZVN5c3RlbSh3ZWJGaWxlU3lzdGVtKQorICAgICwgbV9wYXRoKHBhdGgpCiB7CiB9
CiAKQEAgLTQ5LDMyICs1MiwzMiBAQCBBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bTo6fkFzeW5jRmls
ZVdyaXRlCiB7CiB9CiAKLXZvaWQgQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW06OnNldFdlYkZpbGVX
cml0ZXIoUGFzc093blB0cjxXZWJLaXQ6OldlYkZpbGVXcml0ZXI+IHdyaXRlcikKLXsKLSAgICBt
X3dyaXRlciA9IHdyaXRlcjsKLX0KLQogdm9pZCBBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bTo6d3Jp
dGUobG9uZyBsb25nIHBvc2l0aW9uLCBCbG9iKiBkYXRhKQogeworICAgIGlmICghbV93cml0ZXIp
CisgICAgICBpbml0V2ViRmlsZVdyaXRlcigpOwogICAgIEFTU0VSVChtX3dyaXRlcik7CiAgICAg
bV93cml0ZXItPndyaXRlKHBvc2l0aW9uLCBXZWJLaXQ6OldlYlVSTChkYXRhLT51cmwoKSkpOwog
fQogCiB2b2lkIEFzeW5jRmlsZVdyaXRlckNocm9taXVtOjp0cnVuY2F0ZShsb25nIGxvbmcgbGVu
Z3RoKQogeworICAgIGlmICghbV93cml0ZXIpCisgICAgICBpbml0V2ViRmlsZVdyaXRlcigpOwog
ICAgIEFTU0VSVChtX3dyaXRlcik7CiAgICAgbV93cml0ZXItPnRydW5jYXRlKGxlbmd0aCk7CiB9
CiAKIHZvaWQgQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW06OmFib3J0KCkKIHsKKyAgICBpZiAoIW1f
d3JpdGVyKQorICAgICAgaW5pdFdlYkZpbGVXcml0ZXIoKTsKICAgICBBU1NFUlQobV93cml0ZXIp
OwogICAgIG1fd3JpdGVyLT5jYW5jZWwoKTsKIH0KIAogdm9pZCBBc3luY0ZpbGVXcml0ZXJDaHJv
bWl1bTo6ZGlkV3JpdGUobG9uZyBsb25nIGJ5dGVzLCBib29sIGNvbXBsZXRlKQogewotICAgIEFT
U0VSVChtX3dyaXRlcik7CiAgICAgbV9jbGllbnQtPmRpZFdyaXRlKGJ5dGVzLCBjb21wbGV0ZSk7
CiB9CiAKQEAgLTg4LDYgKzkxLDExIEBAIHZvaWQgQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW06OmRp
ZEZhaWwoV2UKICAgICBtX2NsaWVudC0+ZGlkRmFpbChlcnJvcik7CiB9CiAKK3ZvaWQgQXN5bmNG
aWxlV3JpdGVyQ2hyb21pdW06OmluaXRXZWJGaWxlV3JpdGVyKCkKK3sKKyAgICBtX3dyaXRlciA9
IGFkb3B0UHRyKG1fd2ViRmlsZVN5c3RlbS0+Y3JlYXRlRmlsZVdyaXRlcihtX3BhdGgsIHRoaXMp
KTsKK30KKwogfSAvLyBuYW1lc3BhY2UKIAogI2VuZGlmIC8vIEVOQUJMRShGSUxFX1NZU1RFTSkK
SW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL0FzeW5jRmlsZVdyaXRlckNocm9taXVtLmgJ
KHJldmlzaW9uIDY5NzI0KQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9Bc3luY0ZpbGVXcml0ZXJD
aHJvbWl1bS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8d3Rm
L1Bhc3NPd25QdHIuaD4KIAogbmFtZXNwYWNlIFdlYktpdCB7CitjbGFzcyBXZWJGaWxlU3lzdGVt
OwogY2xhc3MgV2ViRmlsZVdyaXRlcjsKIH0KIApAQCAtNDksMTEgKzUwLDkgQEAgY2xhc3MgQXN5
bmNGaWxlV3JpdGVyQ2xpZW50OwogCiBjbGFzcyBBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bSA6IHB1
YmxpYyBBc3luY0ZpbGVXcml0ZXIsIHB1YmxpYyBXZWJLaXQ6OldlYkZpbGVXcml0ZXJDbGllbnQg
ewogcHVibGljOgotICAgIEFzeW5jRmlsZVdyaXRlckNocm9taXVtKEFzeW5jRmlsZVdyaXRlckNs
aWVudCogY2xpZW50KTsKKyAgICBBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bShBc3luY0ZpbGVXcml0
ZXJDbGllbnQqLCBXZWJLaXQ6OldlYkZpbGVTeXN0ZW0qLCBjb25zdCBTdHJpbmcmIHBhdGgpOwog
ICAgIH5Bc3luY0ZpbGVXcml0ZXJDaHJvbWl1bSgpOwogICAgIAotICAgIHZvaWQgc2V0V2ViRmls
ZVdyaXRlcihQYXNzT3duUHRyPFdlYktpdDo6V2ViRmlsZVdyaXRlcj4gd3JpdGVyKTsKLQogICAg
IC8vIEZpbGVXcml0ZXIKICAgICB2aXJ0dWFsIHZvaWQgd3JpdGUobG9uZyBsb25nIHBvc2l0aW9u
LCBCbG9iKiBkYXRhKTsKICAgICB2aXJ0dWFsIHZvaWQgdHJ1bmNhdGUobG9uZyBsb25nIGxlbmd0
aCk7CkBAIC02NSw4ICs2NCwxMiBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIGRpZEZhaWwo
V2ViS2l0OjpXZWJGaWxlRXJyb3IpOwogCiBwcml2YXRlOgorICAgIHZvaWQgaW5pdFdlYkZpbGVX
cml0ZXIoKTsKKwogICAgIE93blB0cjxXZWJLaXQ6OldlYkZpbGVXcml0ZXI+IG1fd3JpdGVyOwog
ICAgIEFzeW5jRmlsZVdyaXRlckNsaWVudCogbV9jbGllbnQ7CisgICAgV2ViS2l0OjpXZWJGaWxl
U3lzdGVtKiBtX3dlYkZpbGVTeXN0ZW07CisgICAgU3RyaW5nIG1fcGF0aDsKIH07CiAKIH0gLy8g
bmFtZXNwYWNlCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYkZpbGVTeXN0ZW1DYWxsYmFj
a3NJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYkZpbGVTeXN0
ZW1DYWxsYmFja3NJbXBsLmNwcAkocmV2aXNpb24gNjk3MjQpCisrKyBXZWJLaXQvY2hyb21pdW0v
c3JjL1dlYkZpbGVTeXN0ZW1DYWxsYmFja3NJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjMs
OSArNjMsMjMgQEAgdm9pZCBXZWJGaWxlU3lzdGVtQ2FsbGJhY2tzSW1wbDo6ZGlkU3VjYwogICAg
IGRlbGV0ZSB0aGlzOwogfQogCi12b2lkIFdlYkZpbGVTeXN0ZW1DYWxsYmFja3NJbXBsOjpkaWRS
ZWFkTWV0YWRhdGEoY29uc3QgV2ViRmlsZUluZm8mIGluZm8pCit2b2lkIFdlYkZpbGVTeXN0ZW1D
YWxsYmFja3NJbXBsOjpkaWRSZWFkTWV0YWRhdGEoY29uc3QgV2ViRmlsZUluZm8mIHdlYkZpbGVJ
bmZvKQogewotICAgIG1fY2FsbGJhY2tzLT5kaWRSZWFkTWV0YWRhdGEoaW5mby5tb2RpZmljYXRp
b25UaW1lKTsKKyAgICBGaWxlSW5mbyBmaWxlSW5mbzsKKyAgICBmaWxlSW5mby5tb2RpZmljYXRp
b25UaW1lID0gd2ViRmlsZUluZm8ubW9kaWZpY2F0aW9uVGltZTsKKyAgICBmaWxlSW5mby5sZW5n
dGggPSB3ZWJGaWxlSW5mby5sZW5ndGg7CisgICAgc3dpdGNoICh3ZWJGaWxlSW5mby50eXBlKSB7
CisgICAgY2FzZSBXZWJGaWxlSW5mbzo6VHlwZURpcmVjdG9yeToKKyAgICAgICAgZmlsZUluZm8u
dHlwZSA9IEZpbGVJbmZvOjpUeXBlRGlyZWN0b3J5OworICAgICAgICBicmVhazsKKyAgICBjYXNl
IFdlYkZpbGVJbmZvOjpUeXBlRmlsZToKKyAgICAgICAgZmlsZUluZm8udHlwZSA9IEZpbGVJbmZv
OjpUeXBlRmlsZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZmlsZUlu
Zm8udHlwZSA9IEZpbGVJbmZvOjpUeXBlVW5rbm93bjsKKyAgICAgICAgYnJlYWs7CisgICAgfQor
ICAgIG1fY2FsbGJhY2tzLT5kaWRSZWFkTWV0YWRhdGEoZmlsZUluZm8pOwogICAgIGRlbGV0ZSB0
aGlzOwogfQogCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckFzeW5jRmlsZVN5c3Rl
bUNocm9taXVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckFz
eW5jRmlsZVN5c3RlbUNocm9taXVtLmNwcAkocmV2aXNpb24gNjk3MjQpCisrKyBXZWJLaXQvY2hy
b21pdW0vc3JjL1dvcmtlckFzeW5jRmlsZVN5c3RlbUNocm9taXVtLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMzgsOSArMzgsMTEgQEAKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1
ZGUgIldlYkZpbGVTeXN0ZW0uaCIKICNpbmNsdWRlICJXZWJGaWxlU3lzdGVtQ2FsbGJhY2tzSW1w
bC5oIgorI2luY2x1ZGUgIldlYkZpbGVXcml0ZXIuaCIKICNpbmNsdWRlICJXZWJLaXQuaCIKICNp
bmNsdWRlICJXZWJLaXRDbGllbnQuaCIKICNpbmNsdWRlICJXZWJXb3JrZXJCYXNlLmgiCisjaW5j
bHVkZSAiV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uaCIKICNpbmNsdWRlICJXb3JrZXJD
b250ZXh0LmgiCiAjaW5jbHVkZSAiV29ya2VyRmlsZVN5c3RlbUNhbGxiYWNrc0JyaWRnZS5oIgog
I2luY2x1ZGUgIldvcmtlclNjcmlwdENvbnRyb2xsZXIuaCIKQEAgLTEzNCw5ICsxMzYsNzYgQEAg
dm9pZCBXb3JrZXJBc3luY0ZpbGVTeXN0ZW1DaHJvbWl1bTo6cmVhZAogICAgIGNyZWF0ZVdvcmtl
ckZpbGVTeXN0ZW1DYWxsYmFja3NCcmlkZ2UoY2FsbGJhY2tzKS0+cG9zdFJlYWREaXJlY3RvcnlU
b01haW5UaHJlYWQobV93ZWJGaWxlU3lzdGVtLCBwYXRoLCBtX21vZGVGb3JDdXJyZW50T3BlcmF0
aW9uKTsKIH0KIAotdm9pZCBXb3JrZXJBc3luY0ZpbGVTeXN0ZW1DaHJvbWl1bTo6Y3JlYXRlV3Jp
dGVyKEFzeW5jRmlsZVdyaXRlckNsaWVudCosIGNvbnN0IFN0cmluZyYsIFBhc3NPd25QdHI8QXN5
bmNGaWxlU3lzdGVtQ2FsbGJhY2tzPikKK2NsYXNzIFdvcmtlckZpbGVXcml0ZXJIZWxwZXJDYWxs
YmFja3MgOiBwdWJsaWMgQXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzIHsKK3B1YmxpYzoKKyAgICBz
dGF0aWMgUGFzc093blB0cjxXb3JrZXJGaWxlV3JpdGVySGVscGVyQ2FsbGJhY2tzPiBjcmVhdGUo
QXN5bmNGaWxlV3JpdGVyQ2xpZW50KiBjbGllbnQsIGNvbnN0IFN0cmluZyYgcGF0aCwgV2ViS2l0
OjpXZWJGaWxlU3lzdGVtKiB3ZWJGaWxlU3lzdGVtLCBQYXNzT3duUHRyPFdlYkNvcmU6OkFzeW5j
RmlsZVN5c3RlbUNhbGxiYWNrcz4gY2FsbGJhY2tzLCBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250
ZXh0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBXb3JrZXJGaWxlV3JpdGVy
SGVscGVyQ2FsbGJhY2tzKGNsaWVudCwgcGF0aCwgd2ViRmlsZVN5c3RlbSwgY2FsbGJhY2tzLCB3
b3JrZXJDb250ZXh0KSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGRpZFN1Y2NlZWQoKQor
ICAgIHsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorCisgICAgdmlydHVh
bCB2b2lkIGRpZFJlYWRNZXRhZGF0YShjb25zdCBGaWxlSW5mbyYgaW5mbykKKyAgICB7CisgICAg
ICAgIEFTU0VSVChtX2NhbGxiYWNrcyk7CisgICAgICAgIGlmIChpbmZvLnR5cGUgIT0gRmlsZUlu
Zm86OlR5cGVGaWxlIHx8IGluZm8ubGVuZ3RoIDwgMCkKKyAgICAgICAgICAgIG1fY2FsbGJhY2tz
LT5kaWRGYWlsKFdlYktpdDo6V2ViRmlsZUVycm9ySW52YWxpZFN0YXRlKTsKKyAgICAgICAgZWxz
ZSB7CisgICAgICAgICAgICBPd25QdHI8V29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0+IGFz
eW5jRmlsZVdyaXRlckNocm9taXVtID0gYWRvcHRQdHIobmV3IFdvcmtlckFzeW5jRmlsZVdyaXRl
ckNocm9taXVtKG1fd2ViRmlsZVN5c3RlbSwgbV9wYXRoLCBtX3dvcmtlckNvbnRleHQsIG1fY2xp
ZW50LCBmYWxzZSkpOworICAgICAgICAgICAgbV9jYWxsYmFja3MtPmRpZENyZWF0ZUZpbGVXcml0
ZXIoYXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0ucmVsZWFzZSgpLCBpbmZvLmxlbmd0aCk7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlkUmVhZERpcmVjdG9yeUVudHJ5KGNv
bnN0IFN0cmluZyYgbmFtZSwgYm9vbCBpc0RpcmVjdG9yeSkKKyAgICB7CisgICAgICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBkaWRSZWFkRGlyZWN0
b3J5RW50cmllcyhib29sIGhhc01vcmUpCisgICAgeworICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlkT3BlbkZpbGVTeXN0ZW0oY29uc3Qg
U3RyaW5nJiwgUGFzc093blB0cjxBc3luY0ZpbGVTeXN0ZW0+KQorICAgIHsKKyAgICAgICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorCisgICAgLy8gQ2FsbGVkIHdoZW4gYW4gQXN5bmNG
aWxlV3J0ZXIgaGFzIGJlZW4gY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgdmlydHVhbCB2b2lk
IGRpZENyZWF0ZUZpbGVXcml0ZXIoUGFzc093blB0cjxBc3luY0ZpbGVXcml0ZXI+LCBsb25nIGxv
bmcpCisgICAgeworICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisKKyAgICB2
aXJ0dWFsIHZvaWQgZGlkRmFpbChpbnQgY29kZSkKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2Nh
bGxiYWNrcyk7CisgICAgICAgIG1fY2FsbGJhY2tzLT5kaWRGYWlsKGNvZGUpOworICAgIH0KKwor
cHJpdmF0ZToKKyAgICBXb3JrZXJGaWxlV3JpdGVySGVscGVyQ2FsbGJhY2tzKEFzeW5jRmlsZVdy
aXRlckNsaWVudCogY2xpZW50LCBjb25zdCBTdHJpbmcmIHBhdGgsIFdlYktpdDo6V2ViRmlsZVN5
c3RlbSogd2ViRmlsZVN5c3RlbSwgUGFzc093blB0cjxXZWJDb3JlOjpBc3luY0ZpbGVTeXN0ZW1D
YWxsYmFja3M+IGNhbGxiYWNrcywgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCkKKyAgICAg
ICAgOiBtX2NsaWVudChjbGllbnQpCisgICAgICAgICwgbV9wYXRoKHBhdGgpCisgICAgICAgICwg
bV93ZWJGaWxlU3lzdGVtKHdlYkZpbGVTeXN0ZW0pCisgICAgICAgICwgbV9jYWxsYmFja3MoY2Fs
bGJhY2tzKQorICAgICAgICAsIG1fd29ya2VyQ29udGV4dCh3b3JrZXJDb250ZXh0KQorICAgIHsK
KyAgICB9CisKKyAgICBBc3luY0ZpbGVXcml0ZXJDbGllbnQqIG1fY2xpZW50OworICAgIFN0cmlu
ZyBtX3BhdGg7CisgICAgV2ViS2l0OjpXZWJGaWxlU3lzdGVtKiBtX3dlYkZpbGVTeXN0ZW07Cisg
ICAgT3duUHRyPFdlYkNvcmU6OkFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrcz4gbV9jYWxsYmFja3M7
CisgICAgV29ya2VyQ29udGV4dCogbV93b3JrZXJDb250ZXh0OworfTsKKwordm9pZCBXb3JrZXJB
c3luY0ZpbGVTeXN0ZW1DaHJvbWl1bTo6Y3JlYXRlV3JpdGVyKEFzeW5jRmlsZVdyaXRlckNsaWVu
dCogY2xpZW50LCBjb25zdCBTdHJpbmcmIHBhdGgsIFBhc3NPd25QdHI8QXN5bmNGaWxlU3lzdGVt
Q2FsbGJhY2tzPiBjYWxsYmFja3MpCiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICBjcmVh
dGVXb3JrZXJGaWxlU3lzdGVtQ2FsbGJhY2tzQnJpZGdlKFdvcmtlckZpbGVXcml0ZXJIZWxwZXJD
YWxsYmFja3M6OmNyZWF0ZShjbGllbnQsIHBhdGgsIG1fd2ViRmlsZVN5c3RlbSwgY2FsbGJhY2tz
LCBtX3dvcmtlckNvbnRleHQpKS0+cG9zdFJlYWRNZXRhZGF0YVRvTWFpblRocmVhZChtX3dlYkZp
bGVTeXN0ZW0sIHBhdGgsIG1fbW9kZUZvckN1cnJlbnRPcGVyYXRpb24pOwogfQogCiBQYXNzUmVm
UHRyPFdvcmtlckZpbGVTeXN0ZW1DYWxsYmFja3NCcmlkZ2U+IFdvcmtlckFzeW5jRmlsZVN5c3Rl
bUNocm9taXVtOjpjcmVhdGVXb3JrZXJGaWxlU3lzdGVtQ2FsbGJhY2tzQnJpZGdlKFBhc3NPd25Q
dHI8QXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzPiBjYWxsYmFja3MpCkluZGV4OiBXZWJLaXQvY2hy
b21pdW0vc3JjL1dvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtLmNwcAko
cmV2aXNpb24gMCkKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2VyQXN5bmNGaWxlV3JpdGVy
Q2hyb21pdW0uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
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
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIldvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtLmgiCisKKyNpZiBF
TkFCTEUoRklMRV9TWVNURU0pCisKKyNpbmNsdWRlICJBc3luY0ZpbGVTeXN0ZW0uaCIKKyNpbmNs
dWRlICJBc3luY0ZpbGVXcml0ZXJDbGllbnQuaCIKKyNpbmNsdWRlICJCbG9iLmgiCisjaW5jbHVk
ZSAiU2NyaXB0RXhlY3V0aW9uQ29udGV4dC5oIgorI2luY2x1ZGUgIldlYkZpbGVTeXN0ZW0uaCIK
KyNpbmNsdWRlICJXZWJGaWxlV3JpdGVyLmgiCisjaW5jbHVkZSAiV2ViVVJMLmgiCisjaW5jbHVk
ZSAiV2ViV29ya2VyQmFzZS5oIgorI2luY2x1ZGUgIldvcmtlckNvbnRleHQuaCIKKyNpbmNsdWRl
ICJXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmgiCisjaW5jbHVkZSAiV29ya2VyTG9h
ZGVyUHJveHkuaCIKKyNpbmNsdWRlICJXb3JrZXJUaHJlYWQuaCIKKwordXNpbmcgbmFtZXNwYWNl
IFdlYktpdDsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgY29uc3QgY2hhciBmaWxl
V3JpdGVyT3BlcmF0aW9uc01vZGVbXSA9ICJmaWxlV3JpdGVyT3BlcmF0aW9uc01vZGUiOworCitX
b3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bTo6V29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21p
dW0oV2ViRmlsZVN5c3RlbSogd2ViRmlsZVN5c3RlbSwgY29uc3QgU3RyaW5nJiBwYXRoLCBXb3Jr
ZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0LCBBc3luY0ZpbGVXcml0ZXJDbGllbnQqIGNsaWVudCwg
Ym9vbCBzeW5jaHJvbm91cykKKyAgICA6IG1fc3luY2hyb25vdXMoc3luY2hyb25vdXMpCit7Cisg
ICAgQVNTRVJUKCFzeW5jaHJvbm91cyk7IC8vIE5vdCBpbXBsZW1lbnRlZCB5ZXQuCisgICAgV29y
a2VyTG9hZGVyUHJveHkqIHdvcmtlckxvYWRlclByb3h5ID0gJndvcmtlckNvbnRleHQtPnRocmVh
ZCgpLT53b3JrZXJMb2FkZXJQcm94eSgpOworICAgIFdlYldvcmtlckJhc2UqIHdvcmtlciA9IHN0
YXRpY19jYXN0PFdlYldvcmtlckJhc2UqPih3b3JrZXJMb2FkZXJQcm94eSk7CisKKyAgICBTdHJp
bmcgbW9kZSA9IGZpbGVXcml0ZXJPcGVyYXRpb25zTW9kZTsKKyAgICBtb2RlLmFwcGVuZChTdHJp
bmc6Om51bWJlcih3b3JrZXJDb250ZXh0LT50aHJlYWQoKS0+cnVuTG9vcCgpLmNyZWF0ZVVuaXF1
ZUlkKCkpKTsKKyAgICBtX2JyaWRnZSA9IFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6
OmNyZWF0ZSh3ZWJGaWxlU3lzdGVtLCBwYXRoLCB3b3JrZXIsIHdvcmtlckNvbnRleHQsIG1vZGUs
IGNsaWVudCk7Cit9CisKK1dvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtOjp+V29ya2VyQXN5
bmNGaWxlV3JpdGVyQ2hyb21pdW0oKQoreworICAgIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NC
cmlkZ2UqIGJyaWRnZSA9IG1fYnJpZGdlLmdldCgpOworICAgIGJyaWRnZS0+cG9zdFNodXRkb3du
VG9NYWluVGhyZWFkKG1fYnJpZGdlLnJlbGVhc2UoKSk7Cit9CisKK1dlYkZpbGVXcml0ZXJDbGll
bnQqIFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtOjpnZXRNYWluVGhyZWFkQ2xpZW50KCkK
K3sKKyAgICByZXR1cm4gbV9icmlkZ2UuZ2V0KCk7Cit9CisKK3ZvaWQgV29ya2VyQXN5bmNGaWxl
V3JpdGVyQ2hyb21pdW06OndyaXRlKGxvbmcgbG9uZyBwb3NpdGlvbiwgQmxvYiogZGF0YSkKK3sK
KyAgICBtX2JyaWRnZS0+cG9zdFdyaXRlVG9NYWluVGhyZWFkKHBvc2l0aW9uLCBXZWJLaXQ6Oldl
YlVSTChkYXRhLT51cmwoKSkpOworfQorCit2b2lkIFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9t
aXVtOjp0cnVuY2F0ZShsb25nIGxvbmcgbGVuZ3RoKQoreworICAgIG1fYnJpZGdlLT5wb3N0VHJ1
bmNhdGVUb01haW5UaHJlYWQobGVuZ3RoKTsKK30KKwordm9pZCBXb3JrZXJBc3luY0ZpbGVXcml0
ZXJDaHJvbWl1bTo6YWJvcnQoKQoreworICAgIG1fYnJpZGdlLT5wb3N0QWJvcnRUb01haW5UaHJl
YWQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIEVOQUJMRShGSUxFX1NZU1RF
TSkKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21p
dW0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckFzeW5jRmlsZVdy
aXRlckNocm9taXVtLmgJKHJldmlzaW9uIDApCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtl
ckFzeW5jRmlsZVdyaXRlckNocm9taXVtLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNzYgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
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
aWZuZGVmIFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtX2gKKyNkZWZpbmUgV29ya2VyQXN5
bmNGaWxlV3JpdGVyQ2hyb21pdW1faAorCisjaWYgRU5BQkxFKEZJTEVfU1lTVEVNKQorCisjaW5j
bHVkZSAiQXN5bmNGaWxlV3JpdGVyLmgiCisjaW5jbHVkZSAiV2ViRmlsZUVycm9yLmgiCisjaW5j
bHVkZSAiV2ViRmlsZVdyaXRlckNsaWVudC5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKyNp
bmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgorCituYW1lc3BhY2UgV2ViS2l0IHsKK2NsYXNzIFdl
YkZpbGVTeXN0ZW07CitjbGFzcyBXZWJGaWxlV3JpdGVyOworY2xhc3MgV29ya2VyRmlsZVdyaXRl
ckNhbGxiYWNrc0JyaWRnZTsKK30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBBc3lu
Y0ZpbGVTeXN0ZW07CitjbGFzcyBBc3luY0ZpbGVXcml0ZXJDbGllbnQ7CitjbGFzcyBCbG9iOwor
Y2xhc3MgV29ya2VyQ29udGV4dDsKKworY2xhc3MgV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21p
dW0gOiBwdWJsaWMgQXN5bmNGaWxlV3JpdGVyIHsKK3B1YmxpYzoKKyAgICBXb3JrZXJBc3luY0Zp
bGVXcml0ZXJDaHJvbWl1bShXZWJLaXQ6OldlYkZpbGVTeXN0ZW0qLCBjb25zdCBTdHJpbmcmIHBh
dGgsIFdvcmtlckNvbnRleHQqLCBBc3luY0ZpbGVXcml0ZXJDbGllbnQqLCBib29sIHN5bmNocm9u
b3VzKTsKKyAgICB+V29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0oKTsKKyAgICAKKyAgICBX
ZWJLaXQ6OldlYkZpbGVXcml0ZXJDbGllbnQqIGdldE1haW5UaHJlYWRDbGllbnQoKTsKKworICAg
IC8vIEZpbGVXcml0ZXIKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGUobG9uZyBsb25nIHBvc2l0aW9u
LCBCbG9iKiBkYXRhKTsKKyAgICB2aXJ0dWFsIHZvaWQgdHJ1bmNhdGUobG9uZyBsb25nIGxlbmd0
aCk7CisgICAgdmlydHVhbCB2b2lkIGFib3J0KCk7CisKK3ByaXZhdGU6CisgICAgUmVmUHRyPFdl
YktpdDo6V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gbV9icmlkZ2U7CisgICAgYm9v
bCBtX3N5bmNocm9ub3VzOworfTsKKworfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIEVOQUJM
RShGSUxFX1NZU1RFTSkKKworI2VuZGlmIC8vIEFzeW5jRmlsZVdyaXRlckNocm9taXVtX2gKSW5k
ZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJGaWxlV3JpdGVyQ2Fs
bGJhY2tzQnJpZGdlLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMvV29y
a2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
MjIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
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
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIldvcmtlckZpbGVXcml0ZXJDYWxs
YmFja3NCcmlkZ2UuaCIKKworI2lmIEVOQUJMRShGSUxFX1NZU1RFTSkKKworI2luY2x1ZGUgIkFz
eW5jRmlsZVdyaXRlckNsaWVudC5oIgorI2luY2x1ZGUgIkNyb3NzVGhyZWFkVGFzay5oIgorI2lu
Y2x1ZGUgIldlYkNTdHJpbmcuaCIKKyNpbmNsdWRlICJXZWJGaWxlU3lzdGVtLmgiCisjaW5jbHVk
ZSAiV2ViRmlsZVdyaXRlci5oIgorI2luY2x1ZGUgIldlYldvcmtlckJhc2UuaCIKKyNpbmNsdWRl
ICJXb3JrZXJDb250ZXh0LmgiCisjaW5jbHVkZSAiV29ya2VyVGhyZWFkLmgiCisjaW5jbHVkZSA8
d3RmL01haW5UaHJlYWQuaD4KKyNpbmNsdWRlIDx3dGYvVGhyZWFkaW5nLmg+CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQ3Jvc3NUaHJlYWRDb3BpZXJCYXNlPGZh
bHNlLCBmYWxzZSwgV2ViS2l0OjpXZWJVUkw+IHsKKyAgICB0eXBlZGVmIFdlYktpdDo6V2ViVVJM
IFR5cGU7CisgICAgc3RhdGljIFR5cGUgY29weShjb25zdCBXZWJLaXQ6OldlYlVSTCYgdXJsKQor
ICAgIHsKKyAgICAgICAgV2ViS2l0OjpXZWJDU3RyaW5nIHNwZWM7CisgICAgICAgIHNwZWMuYXNz
aWduKHVybC5zcGVjKCkuZGF0YSgpLCB1cmwuc3BlYygpLmxlbmd0aCgpKTsKKyAgICAgICAgY29u
c3QgdXJsX3BhcnNlOjpQYXJzZWQmIHBhcnNlZCA9IHVybC5wYXJzZWQoKTsKKyAgICAgICAgYm9v
bCBpc1ZhbGlkID0gdXJsLmlzVmFsaWQoKTsKKworICAgICAgICByZXR1cm4gV2ViS2l0OjpXZWJV
Ukwoc3BlYywgcGFyc2VkLCBpc1ZhbGlkKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVj
dCBDcm9zc1RocmVhZENvcGllckJhc2U8ZmFsc2UsIGZhbHNlLCBQYXNzUmVmUHRyPFdlYktpdDo6
V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gPiB7CisgICAgdHlwZWRlZiBQYXNzUmVm
UHRyPFdlYktpdDo6V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gVHlwZTsKKyAgICBz
dGF0aWMgVHlwZSBjb3B5KGNvbnN0IFBhc3NSZWZQdHI8V2ViS2l0OjpXb3JrZXJGaWxlV3JpdGVy
Q2FsbGJhY2tzQnJpZGdlPiYgYnJpZGdlKQorICAgIHsKKyAgICAgICAgVHlwZSBuZXdSZWYoYnJp
ZGdlLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIG5ld1JlZjsKKyAgICB9Cit9OworCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOworCituYW1lc3BhY2Ug
V2ViS2l0IHsKKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpub3RpZnlT
dG9wKCkKK3sKKyAgICBBU1NFUlQobV93b3JrZXJDb250ZXh0LT5pc0NvbnRleHRUaHJlYWQoKSk7
CisgICAgbV9jbGllbnRPbldvcmtlclRocmVhZCA9IDA7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdy
aXRlckNhbGxiYWNrc0JyaWRnZTo6cG9zdFdyaXRlVG9NYWluVGhyZWFkKGxvbmcgbG9uZyBwb3Np
dGlvbiwgY29uc3QgV2ViVVJMJiBkYXRhKQoreworICAgIGRpc3BhdGNoVGFza1RvTWFpblRocmVh
ZChjcmVhdGVDYWxsYmFja1Rhc2soJndyaXRlT25NYWluVGhyZWFkLCB0aGlzLCBwb3NpdGlvbiwg
ZGF0YSkpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OnBvc3RU
cnVuY2F0ZVRvTWFpblRocmVhZChsb25nIGxvbmcgbGVuZ3RoKQoreworICAgIGRpc3BhdGNoVGFz
a1RvTWFpblRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJnRydW5jYXRlT25NYWluVGhyZWFkLCB0
aGlzLCBsZW5ndGgpKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdl
Ojpwb3N0QWJvcnRUb01haW5UaHJlYWQoKQoreworICAgIGRpc3BhdGNoVGFza1RvTWFpblRocmVh
ZChjcmVhdGVDYWxsYmFja1Rhc2soJmFib3J0T25NYWluVGhyZWFkLCB0aGlzKSk7Cit9CisKK3Zv
aWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6cG9zdFNodXRkb3duVG9NYWluVGhy
ZWFkKAorICAgICAgICBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+
IGJyaWRnZSkKK3sKKyAgICBBU1NFUlQoIW1fY2xpZW50T25Xb3JrZXJUaHJlYWQpOworICAgIGRp
c3BhdGNoVGFza1RvTWFpblRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJnNodXRkb3duT25NYWlu
VGhyZWFkLCBicmlkZ2UpKTsKKyAgICBNdXRleExvY2tlciBsb2NrZXIobV9tdXRleCk7CisgICAg
bV93b3JrZXIgPSAwOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6
OndyaXRlT25NYWluVGhyZWFkKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPFdv
cmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+IGJyaWRnZSwgbG9uZyBsb25nIHBvc2l0aW9u
LCBjb25zdCBXZWJVUkwmIGRhdGEpCit7CisgICAgYnJpZGdlLT5tX3dyaXRlci0+d3JpdGUocG9z
aXRpb24sIGRhdGEpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6
OnRydW5jYXRlT25NYWluVGhyZWFkKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRy
PFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+IGJyaWRnZSwgbG9uZyBsb25nIGxlbmd0
aCkKK3sKKyAgICBicmlkZ2UtPm1fd3JpdGVyLT50cnVuY2F0ZShsZW5ndGgpOworfQorCit2b2lk
IFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OmFib3J0T25NYWluVGhyZWFkKFNjcmlw
dEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NC
cmlkZ2U+IGJyaWRnZSkKK3sKKyAgICBicmlkZ2UtPm1fd3JpdGVyLT5jYW5jZWwoKTsKK30KKwor
dm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpzaHV0ZG93bk9uTWFpblRocmVh
ZChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2Fs
bGJhY2tzQnJpZGdlPiBicmlkZ2UpCit7CisgICAgYnJpZGdlLT5tX3NodXR0aW5nRG93bk9uTWFp
blRocmVhZCA9IHRydWU7CisgICAgYnJpZGdlLT5tX3dyaXRlci5jbGVhcigpOworfQorCit2b2lk
IFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OmRpZFdyaXRlKGxvbmcgbG9uZyBieXRl
cywgYm9vbCBjb21wbGV0ZSkKK3sKKyAgICBtYXlQb3N0VGFza1RvV29ya2VyKGNyZWF0ZUNhbGxi
YWNrVGFzaygmZGlkV3JpdGVPbldvcmtlclRocmVhZCwgdGhpcywgYnl0ZXMsIGNvbXBsZXRlKSk7
Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6ZGlkRmFpbChXZWJG
aWxlRXJyb3IgZXJyb3IpCit7CisgICAgbWF5UG9zdFRhc2tUb1dvcmtlcihjcmVhdGVDYWxsYmFj
a1Rhc2soJmRpZEZhaWxPbldvcmtlclRocmVhZCwgdGhpcywgZXJyb3IpKTsKK30KKwordm9pZCBX
b3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpkaWRUcnVuY2F0ZSgpCit7CisgICAgbWF5
UG9zdFRhc2tUb1dvcmtlcihjcmVhdGVDYWxsYmFja1Rhc2soJmRpZFRydW5jYXRlT25Xb3JrZXJU
aHJlYWQsIHRoaXMpKTsKK30KKworV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6V29y
a2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZShXZWJGaWxlU3lzdGVtKiB3ZWJGaWxlU3lzdGVt
LCBjb25zdCBTdHJpbmcmIHBhdGgsIFdlYldvcmtlckJhc2UqIHdvcmtlciwgU2NyaXB0RXhlY3V0
aW9uQ29udGV4dCogc2NyaXB0RXhlY3V0aW9uQ29udGV4dCwgY29uc3QgU3RyaW5nJiBtb2RlLCBB
c3luY0ZpbGVXcml0ZXJDbGllbnQqIGNsaWVudCkKKyAgICA6IFdvcmtlckNvbnRleHQ6Ok9ic2Vy
dmVyKHN0YXRpY19jYXN0PFdvcmtlckNvbnRleHQqPihzY3JpcHRFeGVjdXRpb25Db250ZXh0KSkK
KyAgICAsIG1fc2h1dHRpbmdEb3duT25NYWluVGhyZWFkKGZhbHNlKQorICAgICwgbV93ZWJGaWxl
U3lzdGVtKHdlYkZpbGVTeXN0ZW0pCisgICAgLCBtX3BhdGgocGF0aC50aHJlYWRzYWZlQ29weSgp
KQorICAgICwgbV93b3JrZXIod29ya2VyKQorICAgICwgbV93b3JrZXJDb250ZXh0KHNjcmlwdEV4
ZWN1dGlvbkNvbnRleHQpCisgICAgLCBtX21vZGUobW9kZS50aHJlYWRzYWZlQ29weSgpKQorICAg
ICwgbV9jbGllbnRPbldvcmtlclRocmVhZChjbGllbnQpCit7CisgICAgQVNTRVJUKG1fd29ya2Vy
Q29udGV4dC0+aXNDb250ZXh0VGhyZWFkKCkpOworfQorCitXb3JrZXJGaWxlV3JpdGVyQ2FsbGJh
Y2tzQnJpZGdlOjp+V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZSgpCit7CisgICAgQVNT
RVJUKCFtX2NsaWVudE9uV29ya2VyVGhyZWFkKTsKKyAgICBBU1NFUlQoIW1fd3JpdGVyKTsKK30K
Kwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpkaWRXcml0ZU9uV29ya2Vy
VGhyZWFkKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tz
QnJpZGdlKiBicmlkZ2UsIGxvbmcgbG9uZyBsZW5ndGgsIGJvb2wgY29tcGxldGUpCit7CisgICAg
YnJpZGdlLT5tX2NsaWVudE9uV29ya2VyVGhyZWFkLT5kaWRXcml0ZShsZW5ndGgsIGNvbXBsZXRl
KTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpkaWRGYWlsT25X
b3JrZXJUaHJlYWQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFdvcmtlckZpbGVXcml0ZXJDYWxs
YmFja3NCcmlkZ2UqIGJyaWRnZSwgV2ViRmlsZUVycm9yIGVycm9yKQoreworICAgIGJyaWRnZS0+
bV9jbGllbnRPbldvcmtlclRocmVhZC0+ZGlkRmFpbChlcnJvcik7Cit9CisKK3ZvaWQgV29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6ZGlkVHJ1bmNhdGVPbldvcmtlclRocmVhZChTY3Jp
cHRFeGVjdXRpb25Db250ZXh0KiwgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZSogYnJp
ZGdlKQoreworICAgIGJyaWRnZS0+bV9jbGllbnRPbldvcmtlclRocmVhZC0+ZGlkVHJ1bmNhdGUo
KTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjppbml0V2ViRmls
ZVdyaXRlcigpCit7CisgICAgQVNTRVJUKCFtX3NodXR0aW5nRG93bk9uTWFpblRocmVhZCk7Cisg
ICAgQVNTRVJUKCFtX3dyaXRlcik7CisgICAgbV93cml0ZXIgPSBhZG9wdFB0cihtX3dlYkZpbGVT
eXN0ZW0tPmNyZWF0ZUZpbGVXcml0ZXIobV9wYXRoLCB0aGlzKSk7Cit9CisKK3ZvaWQgV29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6cnVuVGFza09uTWFpblRocmVhZChXZWJDb3JlOjpT
Y3JpcHRFeGVjdXRpb25Db250ZXh0KiBzY3JpcHRFeGVjdXRpb25Db250ZXh0LCBQYXNzUmVmUHRy
PFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+IGJyaWRnZSwgUGFzc093blB0cjxXZWJD
b3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPiB0YXNrVG9SdW4pCit7CisgICAgQVNT
RVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICBpZiAoIWJyaWRnZS0+bV93cml0ZXIgJiYgIWJyaWRn
ZS0+bV9zaHV0dGluZ0Rvd25Pbk1haW5UaHJlYWQpCisgICAgICAgIGJyaWRnZS0+aW5pdFdlYkZp
bGVXcml0ZXIoKTsKKworICAgIGlmIChicmlkZ2UtPm1fd3JpdGVyKQorICAgICAgICB0YXNrVG9S
dW4tPnBlcmZvcm1UYXNrKHNjcmlwdEV4ZWN1dGlvbkNvbnRleHQpOworfQorCit2b2lkIFdvcmtl
ckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OnJ1blRhc2tPbldvcmtlclRocmVhZChXZWJDb3Jl
OjpTY3JpcHRFeGVjdXRpb25Db250ZXh0KiBzY3JpcHRFeGVjdXRpb25Db250ZXh0LCBQYXNzUmVm
UHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+IGJyaWRnZSwgUGFzc093blB0cjxX
ZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPiB0YXNrVG9SdW4pCit7CisgICAg
QVNTRVJUKGJyaWRnZS0+bV93b3JrZXJDb250ZXh0LT5pc0NvbnRleHRUaHJlYWQoKSk7CisgICAg
aWYgKCFicmlkZ2UtPm1fY2xpZW50T25Xb3JrZXJUaHJlYWQpCisgICAgICAgIHJldHVybjsKKyAg
ICBBU1NFUlQoYnJpZGdlLT5tX3dvcmtlcik7CisgICAgdGFza1RvUnVuLT5wZXJmb3JtVGFzayhz
Y3JpcHRFeGVjdXRpb25Db250ZXh0KTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJh
Y2tzQnJpZGdlOjpkaXNwYXRjaFRhc2tUb01haW5UaHJlYWQoUGFzc093blB0cjxXZWJDb3JlOjpT
Y3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPiB0YXNrKQoreworICAgIEFTU0VSVChtX3dvcmtl
cik7IC8vIFRoZXJlIHNob3VsZCBiZSBubyByZXF1ZXN0cyBhZnRlciBzaHV0ZG93bi4KKyAgICBB
U1NFUlQobV93b3JrZXJDb250ZXh0LT5pc0NvbnRleHRUaHJlYWQoKSk7CisgICAgbV93b3JrZXIt
PmRpc3BhdGNoVGFza1RvTWFpblRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJnJ1blRhc2tPbk1h
aW5UaHJlYWQsIHRoaXMsIHRhc2spKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJh
Y2tzQnJpZGdlOjptYXlQb3N0VGFza1RvV29ya2VyKFBhc3NPd25QdHI8U2NyaXB0RXhlY3V0aW9u
Q29udGV4dDo6VGFzaz4gdGFzaykKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworICAg
IE11dGV4TG9ja2VyIGxvY2tlcihtX211dGV4KTsgLy8gbV93b3JrZXIgZ2V0cyBjbGVhcmVkIG9u
IHRoZSBjb250ZXh0IHRocmVhZC4KKyAgICBpZiAobV93b3JrZXIpCisgICAgICAgIG1fd29ya2Vy
LT5wb3N0VGFza0Zvck1vZGVUb1dvcmtlckNvbnRleHQoY3JlYXRlQ2FsbGJhY2tUYXNrKCZydW5U
YXNrT25Xb3JrZXJUaHJlYWQsIHRoaXMsIHRhc2spLCBtX21vZGUpOworfQorCit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoRklMRV9TWVNURU0pCkluZGV4OiBXZWJL
aXQvY2hyb21pdW0vc3JjL1dvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlk
Z2UuaAkocmV2aXNpb24gMCkKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2VyRmlsZVdyaXRl
ckNhbGxiYWNrc0JyaWRnZS5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0
cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0
aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBv
ciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisg
KiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1Ig
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYg
V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZV9oCisjZGVmaW5lIFdvcmtlckZpbGVXcml0
ZXJDYWxsYmFja3NCcmlkZ2VfaAorCisjaWYgRU5BQkxFKEZJTEVfU1lTVEVNKQorCisjaW5jbHVk
ZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJXZWJGaWxlRXJyb3IuaCIKKyNpbmNsdWRl
ICJXZWJGaWxlV3JpdGVyQ2xpZW50LmgiCisjaW5jbHVkZSAiV29ya2VyQ29udGV4dC5oIgorI2lu
Y2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNp
bmNsdWRlIDx3dGYvVGhyZWFkaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIEFz
eW5jRmlsZVdyaXRlckNsaWVudDsKK30KKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIFdl
YkZpbGVTeXN0ZW07CitjbGFzcyBXZWJGaWxlV3JpdGVyOworY2xhc3MgV2ViRmlsZVdyaXRlckNs
aWVudDsKK2NsYXNzIFdlYlVSTDsKK2NsYXNzIFdlYldvcmtlckJhc2U7CisKKy8vIFRoaXMgY2xh
c3MgaXMgdXNlZCBhcyBhIG1lY2hhbmlzbSB0byBicmlkZ2UgY2FsbHMgYmV0d2VlbiB0aHJlYWRz
LgorLy8gQ2FsbHMgdG8gYSBXZWJGaWxlV3JpdGVyIG11c3QgaGFwcGVuIG9uIHRoZSBtYWluIHRo
cmVhZCwgYnV0IHRoZXkgY29tZSBmcm9tCisvLyB0aGUgY29udGV4dCB0aHJlYWQuICBUaGUgcmVz
cG9uc2VzIHRocm91Z2ggdGhlIFdlYkZpbGVXcml0ZXJDbGllbnQgaW50ZXJmYWNlCisvLyBzdGFy
dCBvbiB0aGUgbWFpbiB0aHJlYWQsIGJ1dCBtdXN0IGJlIHNlbnQgdmlhIHRoZSB3b3JrZXIgY29u
dGV4dCB0aHJlYWQuCisvLworLy8gQSB0eXBpY2FsIGZsb3cgZm9yIHdyaXRlIHdvdWxkIGxvb2sg
bGlrZSB0aGlzOgorLy8gQnJpZGdlOjpwb3N0V3JpdGVUb01haW5UaHJlYWQoKSBvbiBXb3JrZXJU
aHJlYWQKKy8vICAtLT4gQnJpZGdlOjp3cml0ZU9uTWFpblRocmVhZCgpIGlzIGNhbGxlZCBvbiBN
YWluVGhyZWFkCisvLyAgLS0+IFdlYkZpbGVXcml0ZXI6OndyaXRlKCkKKy8vICAgICAgVGhpcyBt
YWtlcyBhbiBJUEM7IHRoZSBhY3R1YWwgb3BlcmF0aW9uIGlzIGRvd24gaW4gdGhlIGJyb3dzZXIu
CisvLyAgLS0+IEJyaWRnZTo6ZGlkV3JpdGUgaXMgY2FsbGVkIG9uIE1haW5UaHJlYWQKKy8vICAt
LT4gQnJpZGdlOjpkaWRXcml0ZU9uV29ya2VyVGhyZWFkIGlzIGNhbGxlZCBvbiBXb3JrZXJUaHJl
YWQKKy8vICAgICAgVGhpcyBjYWxscyB0aGUgb3JpZ2luYWwgY2xpZW50IChtX2NsaWVudE9uV29y
a2VyVGhyZWFkKS4KK2NsYXNzIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UgOiBwdWJs
aWMgVGhyZWFkU2FmZVNoYXJlZDxXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlPiwgcHVi
bGljIFdlYkNvcmU6OldvcmtlckNvbnRleHQ6Ok9ic2VydmVyLCBwdWJsaWMgV2ViRmlsZVdyaXRl
ckNsaWVudCB7CitwdWJsaWM6CisgICAgfldvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2Uo
KTsKKworICAgIC8vIFdvcmtlckNvbnRleHQ6Ok9ic2VydmVyIG1ldGhvZC4KKyAgICB2aXJ0dWFs
IHZvaWQgbm90aWZ5U3RvcCgpOworCisgICAgc3RhdGljIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdy
aXRlckNhbGxiYWNrc0JyaWRnZT4gY3JlYXRlKFdlYkZpbGVTeXN0ZW0qIHdlYkZpbGVTeXN0ZW0s
IGNvbnN0IFN0cmluZyYgcGF0aCwgV2ViV29ya2VyQmFzZSogd29ya2VyLCBXZWJDb3JlOjpTY3Jp
cHRFeGVjdXRpb25Db250ZXh0KiB3b3JrZXJDb250ZXh0LCBjb25zdCBTdHJpbmcmIG1vZGUsIFdl
YkNvcmU6OkFzeW5jRmlsZVdyaXRlckNsaWVudCogY2xpZW50KQorICAgIHsKKyAgICAgICAgcmV0
dXJuIGFkb3B0UmVmKG5ldyBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlKHdlYkZpbGVT
eXN0ZW0sIHBhdGgsIHdvcmtlciwgd29ya2VyQ29udGV4dCwgbW9kZSwgY2xpZW50KSk7CisgICAg
fQorCisgICAgLy8gTWV0aG9kcyB0aGF0IGNyZWF0ZSBhbiBpbnN0YW5jZSBhbmQgcG9zdCBhbiBp
bml0aWFsIHJlcXVlc3QgdGFzayB0byB0aGUgbWFpbiB0aHJlYWQuIFRoZXkgbXVzdCBiZSBjYWxs
ZWQgb24gdGhlIHdvcmtlciB0aHJlYWQuCisgICAgdm9pZCBwb3N0V3JpdGVUb01haW5UaHJlYWQo
bG9uZyBsb25nIHBvc2l0aW9uLCBjb25zdCBXZWJVUkwmIGRhdGEpOworICAgIHZvaWQgcG9zdFRy
dW5jYXRlVG9NYWluVGhyZWFkKGxvbmcgbG9uZyBsZW5ndGgpOworICAgIHZvaWQgcG9zdEFib3J0
VG9NYWluVGhyZWFkKCk7CisKKyAgICAvLyBUaGUgb3duaW5nIFdvcmtlckFzeW5jRmlsZVdyaXRl
ckNocm9taXVtIHNob3VsZCB1c2UgdGhpcyBtZXRob2QgdG8gZ2l2ZQorICAgIC8vIGF3YXkgaXRz
IGxhc3QgcmVmZXJlbmNlIHRvIHRoZSBicmlkZ2UgYXQgZGVsZXRpb24gdGltZSwgb24gdGhlIGNv
bnRleHQKKyAgICAvLyB0aHJlYWQuICBZb3UgbXVzdCBoYXZlIGNhbGxlZCBzdG9wKCkgYmVmb3Jl
IGNhbGxpbmcgdGhpcy4gIFRoZSBhY3R1YWwKKyAgICAvLyBkZWxldGlvbiBvZiB0aGUgV29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZSBtYXkgaGFwcGVuIG9uIGVpdGhlciB0aGUKKyAgICAv
LyBtYWluIG9yIGNvbnRleHQgdGhyZWFkLCBkZXBlbmRpbmcgb24gd2hlcmUgdGhlIGxhc3QgcmVm
ZXJlbmNlIGdvZXMgYXdheTsKKyAgICAvLyB0aGF0J3Mgc2FmZSBhcyBsb25nIGFzIHRoaXMgaXMg
Y2FsbGVkIGZpcnN0LgorICAgIHZvaWQgcG9zdFNodXRkb3duVG9NYWluVGhyZWFkKFBhc3NSZWZQ
dHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4pOworCisgICAgLy8gQ2FsbGJhY2sg
bWV0aG9kcyB0aGF0IGFyZSBjYWxsZWQgb24gdGhlIG1haW4gdGhyZWFkLgorICAgIC8vIFRoZXNl
IGFyZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgV2ViS2l0OjpXZWJGaWxlV3JpdGVyQ2xpZW50Lgor
ICAgIHZvaWQgZGlkV3JpdGUobG9uZyBsb25nIGJ5dGVzLCBib29sIGNvbXBsZXRlKTsKKyAgICB2
b2lkIGRpZEZhaWwoV2ViRmlsZUVycm9yKTsKKyAgICB2b2lkIGRpZFRydW5jYXRlKCk7CisKK3By
aXZhdGU6CisgICAgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZShXZWJGaWxlU3lzdGVt
KiwgY29uc3QgU3RyaW5nJiBwYXRoLCBXZWJXb3JrZXJCYXNlKiwgV2ViQ29yZTo6U2NyaXB0RXhl
Y3V0aW9uQ29udGV4dCosIGNvbnN0IFN0cmluZyYgbW9kZSwgV2ViQ29yZTo6QXN5bmNGaWxlV3Jp
dGVyQ2xpZW50Kik7CisKKyAgICAvLyBNZXRob2RzIHRoYXQgYXJlIHRvIGJlIGNhbGxlZCBvbiB0
aGUgbWFpbiB0aHJlYWQuCisgICAgc3RhdGljIHZvaWQgd3JpdGVPbk1haW5UaHJlYWQoV2ViQ29y
ZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNh
bGxiYWNrc0JyaWRnZT4sIGxvbmcgbG9uZyBwb3NpdGlvbiwgY29uc3QgV2ViVVJMJiBkYXRhKTsK
KyAgICBzdGF0aWMgdm9pZCB0cnVuY2F0ZU9uTWFpblRocmVhZChXZWJDb3JlOjpTY3JpcHRFeGVj
dXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdl
PiwgbG9uZyBsb25nIGxlbmd0aCk7CisgICAgc3RhdGljIHZvaWQgYWJvcnRPbk1haW5UaHJlYWQo
V2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdy
aXRlckNhbGxiYWNrc0JyaWRnZT4pOworICAgIHN0YXRpYyB2b2lkIHNodXRkb3duT25NYWluVGhy
ZWFkKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPFdvcmtlckZp
bGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+KTsKKworICAgIC8vIE1ldGhvZHMgdGhhdCBkaXNwYXRj
aCB0byBBc3luY0ZpbGVXcml0ZXJDbGllbnQgb24gdGhlIHdvcmtlciB0aHJlYWRzLgorICAgIC8v
IFRoZXkgcmVsZWFzZSBhIHNlbGZSZWYgb2YgdGhlIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NC
cmlkZ2UuCisgICAgc3RhdGljIHZvaWQgZGlkV3JpdGVPbldvcmtlclRocmVhZChXZWJDb3JlOjpT
Y3JpcHRFeGVjdXRpb25Db250ZXh0KiwgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZSos
IGxvbmcgbG9uZyBsZW5ndGgsIGJvb2wgY29tcGxldGUpOworICAgIHN0YXRpYyB2b2lkIGRpZEZh
aWxPbldvcmtlclRocmVhZChXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgV29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZSosIFdlYkZpbGVFcnJvcik7CisgICAgc3RhdGljIHZv
aWQgZGlkVHJ1bmNhdGVPbldvcmtlclRocmVhZChXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250
ZXh0KiwgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZSopOworCisgICAgLy8gTGF6eSBp
bml0aWFsaXphdGlvbiBvZiB0aGUgV2ViRmlsZVdyaXRlci4KKyAgICB2b2lkIGluaXRXZWJGaWxl
V3JpdGVyKCk7CisgICAgc3RhdGljIHZvaWQgcnVuVGFza09uTWFpblRocmVhZChXZWJDb3JlOjpT
Y3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2FsbGJh
Y2tzQnJpZGdlPiwgUGFzc093blB0cjxXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpU
YXNrPik7CisgICAgc3RhdGljIHZvaWQgcnVuVGFza09uV29ya2VyVGhyZWFkKFdlYkNvcmU6OlNj
cmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFj
a3NCcmlkZ2U+LCBQYXNzT3duUHRyPFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRh
c2s+KTsKKworICAgIHZvaWQgZGlzcGF0Y2hUYXNrVG9NYWluVGhyZWFkKFBhc3NPd25QdHI8V2Vi
Q29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6VGFzaz4pOworICAgIHZvaWQgbWF5UG9zdFRh
c2tUb1dvcmtlcihQYXNzT3duUHRyPFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRh
c2s+KTsKKworICAgIC8vIFVzZWQgdG8gcHJvdGVjdCBhY2Nlc3MgdG8gbV93b3JrZXIuCisgICAg
TXV0ZXggbV9tdXRleDsKKyAgICAvLyBJbmRpY2F0ZXMgdGhhdCBtX3dyaXRlciBpcyBnb25lIGR1
ZSB0byBzaHV0ZG93bi4gIFdpdGhvdXQgdGhpcyBmbGFnIHNldCwgaWYgaXQncyBub3QgdGhlcmUs
IHRoZSBtYWluIHRocmVhZCB3aWxsIGxhemlseSBjcmVhdGUgb25lLgorICAgIGJvb2wgbV9zaHV0
dGluZ0Rvd25Pbk1haW5UaHJlYWQ7CisgICAgV2ViRmlsZVN5c3RlbSogbV93ZWJGaWxlU3lzdGVt
OworICAgIFN0cmluZyBtX3BhdGg7CisgICAgLy8gQ3JlYXRlZCBhbmQgY2xlYXJlZCBvbiB0aGUg
Y29udGV4dCB0aHJlYWQsIGJ1dCBhbHNvIHVzZWQgZnJvbSB0aGUgbWFpbiB0aHJlYWQuCisgICAg
V2ViV29ya2VyQmFzZSogbV93b3JrZXI7CisgICAgV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29u
dGV4dCogbV93b3JrZXJDb250ZXh0OworICAgIC8vIENyZWF0ZWQgYW5kIGRlc3Ryb3llZCBmcm9t
IHRoZSBtYWluIHRocmVhZC4gIFRvIGRyb3AgeW91ciBsYXN0IHJlZmVyZW5jZSB0byBhIFdvcmtl
ckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UsIHJlbGVhc2UgaXQgdG8gcG9zdFNodXRkb3duVG9N
YWluVGhyZWFkIHRvIGdpdmUgdGhlIGJyaWRnZSB0aGUgY2hhbmNlIHRvIGNsZWFuIHVwIG1fd3Jp
dGVyLgorICAgIE93blB0cjxXZWJLaXQ6OldlYkZpbGVXcml0ZXI+IG1fd3JpdGVyOworICAgIFN0
cmluZyBtX21vZGU7CisKKyAgICBXZWJDb3JlOjpBc3luY0ZpbGVXcml0ZXJDbGllbnQqIG1fY2xp
ZW50T25Xb3JrZXJUaHJlYWQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRp
ZgorCisjZW5kaWYgLy8gV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZV9oCg==
</data>
<flag name="review"
          id="60830"
          type_id="1"
          status="-"
          setter="levin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>71339</attachid>
            <date>2010-10-20 14:44:55 -0700</date>
            <delta_ts>2010-10-20 16:43:07 -0700</delta_ts>
            <desc>Rolled in feedback, removed AsyncFileWriter changes.</desc>
            <filename>file_writer_worker.txt</filename>
            <type>text/plain</type>
            <size>43355</size>
            <attacher name="Eric U.">ericu</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3MDEyMikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjggQEAKKzIwMTAtMTAtMTkgIEVyaWMgVWhyaGFuZSAgPGVyaWN1QGNocm9taXVt
Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBb
Q2hyb21pdW1dIGltcGxlbWVudGF0aW9uIG9mIGFzeW5jIEZpbGVXcml0ZXIgZm9yIHdvcmtlcnMK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ3NjgxCisK
KyAgICAgICAgSW5pdGlhbCB0ZXN0cyBhcmUgaW4gYSBzZXBhcmF0ZSBjaGFuZ2VsaXN0LgorCisg
ICAgICAgIEJ1aWxkIGZpbGUgY2hhbmdlcyB0byBhZGQgRmlsZU1ldGFkYXRhLgorICAgICAgICAq
IEdOVW1ha2VmaWxlLmFtOgorICAgICAgICAqIFdlYkNvcmUuZ3lwaToKKyAgICAgICAgKiBXZWJD
b3JlLnBybzoKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvajoKKyAgICAg
ICAgKiBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisKKyAgICAgICAgVGhlIHJl
c3Qgb2YgdGhlIGNoYW5nZXMgaGVyZSBqdXN0IHBhc3MgdGhlIG5ldyBGaWxlTWV0YWRhdGEgb2Jq
ZWN0IHRocm91Z2ggY2FsbHMgdGhhdCB1c2VkIHRvIHRha2UgYSBtb2RpZmljYXRpb24gdGltZS4K
KyAgICAgICAgKiBmaWxlYXBpL0ZpbGVNZXRhZGF0YS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNv
cmU6OkZpbGVNZXRhZGF0YTo6RmlsZU1ldGFkYXRhKToKKyAgICAgICAgKiBmaWxlYXBpL0ZpbGVT
eXN0ZW1DYWxsYmFja3MuY3BwOgorICAgICAgICAoV2ViQ29yZTo6RmlsZVN5c3RlbUNhbGxiYWNr
c0Jhc2U6OmRpZFJlYWRNZXRhZGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpNZXRhZGF0YUNhbGxi
YWNrczo6ZGlkUmVhZE1ldGFkYXRhKToKKyAgICAgICAgKiBmaWxlYXBpL0ZpbGVTeXN0ZW1DYWxs
YmFja3MuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9Bc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3MuaDoK
KwogMjAxMC0xMC0xOSAgWW9uZ2p1biBaaGFuZyAgPHlvbmdqdW5femhhbmdAYXBwbGUuY29tPgog
CiAgICAgICAgIFJldmlld2VkIGJ5IERhbiBCZXJuc3RlaW4uCkluZGV4OiBXZWJDb3JlL0dOVW1h
a2VmaWxlLmFtCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvR05VbWFrZWZpbGUuYW0JKHJldmlzaW9u
IDcwMDEzKQorKysgV2ViQ29yZS9HTlVtYWtlZmlsZS5hbQkod29ya2luZyBjb3B5KQpAQCAtMTQx
MSw2ICsxNDExLDcgQEAgd2ViY29yZV9zb3VyY2VzICs9IFwKIAlXZWJDb3JlL2ZpbGVhcGkvRmls
ZS5oIFwKIAlXZWJDb3JlL2ZpbGVhcGkvRmlsZUxpc3QuY3BwIFwKIAlXZWJDb3JlL2ZpbGVhcGkv
RmlsZUxpc3QuaCBcCisJV2ViQ29yZS9maWxlYXBpL0ZpbGVNZXRhZGF0YS5oIFwKIAlXZWJDb3Jl
L2ZpbGVhcGkvRmlsZVJlYWRlci5jcHAgXAogCVdlYkNvcmUvZmlsZWFwaS9GaWxlUmVhZGVyLmgg
XAogCVdlYkNvcmUvZmlsZWFwaS9GaWxlUmVhZGVyU3luYy5jcHAgXApJbmRleDogV2ViQ29yZS9X
ZWJDb3JlLmd5cGkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHJldmlzaW9u
IDcwMDEzKQorKysgV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHdvcmtpbmcgY29weSkKQEAgLTE0OTks
NiArMTQ5OSw3IEBACiAgICAgICAgICAgICAnZmlsZWFwaS9GaWxlRXhjZXB0aW9uLmgnLAogICAg
ICAgICAgICAgJ2ZpbGVhcGkvRmlsZUxpc3QuY3BwJywKICAgICAgICAgICAgICdmaWxlYXBpL0Zp
bGVMaXN0LmgnLAorICAgICAgICAgICAgJ2ZpbGVhcGkvRmlsZU1ldGFkYXRhLmgnLAogICAgICAg
ICAgICAgJ2ZpbGVhcGkvRmlsZVJlYWRlci5jcHAnLAogICAgICAgICAgICAgJ2ZpbGVhcGkvRmls
ZVJlYWRlci5oJywKICAgICAgICAgICAgICdmaWxlYXBpL0ZpbGVSZWFkZXJTeW5jLmNwcCcsCklu
ZGV4OiBXZWJDb3JlL1dlYkNvcmUucHJvCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS5w
cm8JKHJldmlzaW9uIDcwMDEzKQorKysgV2ViQ29yZS9XZWJDb3JlLnBybwkod29ya2luZyBjb3B5
KQpAQCAtMzAwMiw2ICszMDAyLDcgQEAgY29udGFpbnMoREVGSU5FUywgRU5BQkxFX0ZJTEVfU1lT
VEVNPTEpIAogICAgICAgICBmaWxlYXBpL0ZpbGVDYWxsYmFjay5oIFwKICAgICAgICAgZmlsZWFw
aS9GaWxlRW50cnkuaCBcCiAgICAgICAgIGZpbGVhcGkvRmlsZUVudHJ5U3luYy5oIFwKKyAgICAg
ICAgZmlsZWFwaS9GaWxlTWV0YWRhdGEuaCBcCiAgICAgICAgIGZpbGVhcGkvRmlsZVN5c3RlbUNh
bGxiYWNrLmggXAogICAgICAgICBmaWxlYXBpL0ZpbGVTeXN0ZW1DYWxsYmFja3MuaCBcCiAgICAg
ICAgIGZpbGVhcGkvRmlsZVdyaXRlci5oIFwKSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ov
V2ViQ29yZS52Y3Byb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJD
b3JlLnZjcHJvagkocmV2aXNpb24gNzAwMTMpCisrKyBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dl
YkNvcmUudmNwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC00ODQwMyw2ICs0ODQwMywxMCBAQAogCQkJ
CT4NCiAJCQk8L0ZpbGU+DQogCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxmaWxlYXBp
XEZpbGVNZXRhZGF0YS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQogCQkJCVJl
bGF0aXZlUGF0aD0iLi5cZmlsZWFwaVxGaWxlUmVhZGVyLmNwcCINCiAJCQkJPg0KIAkJCTwvRmls
ZT4NCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvago9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2
aXNpb24gNzAwMTMpCisrKyBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
agkod29ya2luZyBjb3B5KQpAQCAtOTMwLDYgKzkzMCw3IEBACiAJCTQ2MTRBMUZFMEIyM0E4RDYw
MDQ0NkUxQyAvKiBjb3B5Q3Vyc29yLnBuZyBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gNDYxNEExRkQwQjIzQThENjAwNDQ2RTFDIC8qIGNvcHlDdXJzb3Iu
cG5nICovOyB9OwogCQk0NjRFQTI3MzBCOEEzNTBCMDBBOEU2RTMgLyogY3Jvc3NIYWlyQ3Vyc29y
LnBuZyBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDY0
RUEyNzEwQjhBMzUwQjAwQThFNkUzIC8qIGNyb3NzSGFpckN1cnNvci5wbmcgKi87IH07CiAJCTQ2
NEVBMjc0MEI4QTM1MEIwMEE4RTZFMyAvKiBub3RBbGxvd2VkQ3Vyc29yLnBuZyBpbiBSZXNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDY0RUEyNzIwQjhBMzUwQjAw
QThFNkUzIC8qIG5vdEFsbG93ZWRDdXJzb3IucG5nICovOyB9OworCQk0Njg5RjFBRjEyNjdCQUUx
MDBFOEQzODAgLyogRmlsZU1ldGFkYXRhLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSA0Njg5RjFBRTEyNjdCQUUxMDBFOEQzODAgLyogRmlsZU1ldGFkYXRh
LmggKi87IH07CiAJCTQ2QkQxNkUzMEIyNzk0NzMwMDFGMDgzOSAvKiBub25lQ3Vyc29yLnBuZyBp
biBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDZCRDE2RTIw
QjI3OTQ3MzAwMUYwODM5IC8qIG5vbmVDdXJzb3IucG5nICovOyB9OwogCQk0NkQ0RjI0OTBBRjk3
RTgxMDAzNTM4NUEgLyogY2VsbEN1cnNvci5wbmcgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ2RDRGMjQ2MEFGOTdFODEwMDM1Mzg1QSAvKiBjZWxsQ3Vy
c29yLnBuZyAqLzsgfTsKIAkJNDZENEYyNEEwQUY5N0U4MTAwMzUzODVBIC8qIGNvbnRleHRNZW51
Q3Vyc29yLnBuZyBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gNDZENEYyNDcwQUY5N0U4MTAwMzUzODVBIC8qIGNvbnRleHRNZW51Q3Vyc29yLnBuZyAqLzsg
fTsKQEAgLTY5NjEsNiArNjk2Miw3IEBACiAJCTQ2MTRBMUZEMEIyM0E4RDYwMDQ0NkUxQyAvKiBj
b3B5Q3Vyc29yLnBuZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxl
VHlwZSA9IGltYWdlLnBuZzsgcGF0aCA9IGNvcHlDdXJzb3IucG5nOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQk0NjRFQTI3MTBCOEEzNTBCMDBBOEU2RTMgLyogY3Jvc3NIYWlyQ3Vyc29y
LnBuZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGlt
YWdlLnBuZzsgcGF0aCA9IGNyb3NzSGFpckN1cnNvci5wbmc7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CiAJCTQ2NEVBMjcyMEI4QTM1MEIwMEE4RTZFMyAvKiBub3RBbGxvd2VkQ3Vyc29yLnBu
ZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGltYWdl
LnBuZzsgcGF0aCA9IG5vdEFsbG93ZWRDdXJzb3IucG5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OworCQk0Njg5RjFBRTEyNjdCQUUxMDBFOEQzODAgLyogRmlsZU1ldGFkYXRhLmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEZpbGVNZXRhZGF0YS5oOyBwYXRoID0gZmlsZWFw
aS9GaWxlTWV0YWRhdGEuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNDZCRDE2RTIw
QjI3OTQ3MzAwMUYwODM5IC8qIG5vbmVDdXJzb3IucG5nICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gaW1hZ2UucG5nOyBwYXRoID0gbm9uZUN1cnNvci5w
bmc7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTQ2RDRGMjQ2MEFGOTdFODEwMDM1Mzg1
QSAvKiBjZWxsQ3Vyc29yLnBuZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25v
d25GaWxlVHlwZSA9IGltYWdlLnBuZzsgcGF0aCA9IGNlbGxDdXJzb3IucG5nOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQk0NkQ0RjI0NzBBRjk3RTgxMDAzNTM4NUEgLyogY29udGV4dE1l
bnVDdXJzb3IucG5nICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVU
eXBlID0gaW1hZ2UucG5nOyBwYXRoID0gY29udGV4dE1lbnVDdXJzb3IucG5nOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwpAQCAtMTQ5MjEsNiArMTQ5MjMsNyBAQAogCQkJCTJFREYzNjlFMTIy
Qzk0QzgwMDJGN0Q0RSAvKiBGaWxlRXhjZXB0aW9uLmggKi8sCiAJCQkJOTc2RDZDNjYxMjJCOEEz
RDAwMUZEMUY3IC8qIEZpbGVMaXN0LmNwcCAqLywKIAkJCQk5NzZENkM2NzEyMkI4QTNEMDAxRkQx
RjcgLyogRmlsZUxpc3QuaCAqLywKKwkJCQk0Njg5RjFBRTEyNjdCQUUxMDBFOEQzODAgLyogRmls
ZU1ldGFkYXRhLmggKi8sCiAJCQkJOTc2RDZDNjkxMjJCOEEzRDAwMUZEMUY3IC8qIEZpbGVSZWFk
ZXIuY3BwICovLAogCQkJCTk3NkQ2QzZBMTIyQjhBM0QwMDFGRDFGNyAvKiBGaWxlUmVhZGVyLmgg
Ki8sCiAJCQkJMkVERjM2OUExMjJDOTRCNDAwMkY3RDRFIC8qIEZpbGVSZWFkZXJTeW5jLmNwcCAq
LywKQEAgLTIxMDgwLDYgKzIxMDgzLDcgQEAKIAkJCQk5M0YxOTlFRDA4MjQ1RTU5MDAxRTlBQkMg
LyogWFNMVFByb2Nlc3Nvci5oIGluIEhlYWRlcnMgKi8sCiAJCQkJRTFCRTUxMkUwQ0Y2QzUxMjAw
MkVBOTU5IC8qIFhTTFRVbmljb2RlU29ydC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTdERDREODcw
RkRGNEQ2RTAwRUNGOUE0IC8qIFhTU0F1ZGl0b3IuaCBpbiBIZWFkZXJzICovLAorCQkJCTQ2ODlG
MUFGMTI2N0JBRTEwMEU4RDM4MCAvKiBGaWxlTWV0YWRhdGEuaCBpbiBIZWFkZXJzICovLAogCQkJ
CTRGQTNCOTBCMTI1Q0QxMjIwMDMwMEJBRCAvKiBJbnNwZWN0b3JTdGF0ZS5oIGluIEhlYWRlcnMg
Ki8sCiAJCQkJOTcyOEMzMTQxMjY4RTQzOTAwNDFFODlCIC8qIE1hcmt1cEFjY3VtdWxhdG9yLmgg
aW4gSGVhZGVycyAqLywKIAkJCSk7CkluZGV4OiBXZWJDb3JlL2ZpbGVhcGkvRmlsZU1ldGFkYXRh
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9maWxlYXBpL0ZpbGVNZXRhZGF0YS5oCShyZXZpc2lv
biAwKQorKysgV2ViQ29yZS9maWxlYXBpL0ZpbGVNZXRhZGF0YS5oCShyZXZpc2lvbiAwKQpAQCAt
MCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBt
ZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUg
b2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkg
YmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0
aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJT
IEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09Q
WVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICog
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2lmbmRlZiBGaWxlTWV0YWRhdGFfaAorI2RlZmluZSBGaWxlTWV0YWRhdGFf
aAorCisjaWYgRU5BQkxFKEZJTEVfU1lTVEVNKQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0
cnVjdCBGaWxlTWV0YWRhdGEgeworICAgIC8vIFRoZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lIG9m
IHRoZSBmaWxlLCBpbiBzZWNvbmRzLgorICAgIC8vIFRoZSB2YWx1ZSAwLjAgbWVhbnMgdGhhdCB0
aGUgdGltZSBpcyBub3Qgc2V0LgorICAgIGRvdWJsZSBtb2RpZmljYXRpb25UaW1lOworCisgICAg
Ly8gVGhlIGxlbmd0aCBvZiB0aGUgZmlsZSBpbiBieXRlcy4KKyAgICAvLyBUaGUgdmFsdWUgLTEg
bWVhbnMgdGhhdCB0aGUgbGVuZ3RoIGlzIG5vdCBzZXQuCisgICAgbG9uZyBsb25nIGxlbmd0aDsK
KworICAgIGVudW0gVHlwZSB7CisgICAgICAgIFR5cGVVbmtub3duID0gMCwKKyAgICAgICAgVHlw
ZUZpbGUsCisgICAgICAgIFR5cGVEaXJlY3RvcnkKKyAgICB9OworCisgICAgVHlwZSB0eXBlOwor
CisgICAgRmlsZU1ldGFkYXRhKCkgOiBtb2RpZmljYXRpb25UaW1lKDAuMCksIGxlbmd0aCgtMSks
IHR5cGUoVHlwZVVua25vd24pIHsgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisj
ZW5kaWYgLy8gRU5BQkxFKEZJTEVfU1lTVEVNKQorCisjZW5kaWYgLy8gRmlsZU1ldGFkYXRhX2gK
SW5kZXg6IFdlYkNvcmUvZmlsZWFwaS9GaWxlU3lzdGVtQ2FsbGJhY2tzLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL2ZpbGVhcGkvRmlsZVN5c3RlbUNhbGxiYWNrcy5jcHAJKHJldmlzaW9uIDcw
MDEzKQorKysgV2ViQ29yZS9maWxlYXBpL0ZpbGVTeXN0ZW1DYWxsYmFja3MuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC00Niw2ICs0Niw3IEBACiAjaW5jbHVkZSAiRXhjZXB0aW9uQ29kZS5oIgogI2lu
Y2x1ZGUgIkZpbGVFbnRyeS5oIgogI2luY2x1ZGUgIkZpbGVFcnJvci5oIgorI2luY2x1ZGUgIkZp
bGVNZXRhZGF0YS5oIgogI2luY2x1ZGUgIkZpbGVTeXN0ZW1DYWxsYmFjay5oIgogI2luY2x1ZGUg
IkZpbGVXcml0ZXIuaCIKICNpbmNsdWRlICJGaWxlV3JpdGVyQ2FsbGJhY2suaCIKQEAgLTc3LDcg
Kzc4LDcgQEAgdm9pZCBGaWxlU3lzdGVtQ2FsbGJhY2tzQmFzZTo6ZGlkT3BlbkZpbAogICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOwogfQogCi12b2lkIEZpbGVTeXN0ZW1DYWxsYmFja3NCYXNlOjpk
aWRSZWFkTWV0YWRhdGEoZG91YmxlKQordm9pZCBGaWxlU3lzdGVtQ2FsbGJhY2tzQmFzZTo6ZGlk
UmVhZE1ldGFkYXRhKGNvbnN0IEZpbGVNZXRhZGF0YSYpCiB7CiAgICAgLy8gRWFjaCBzdWJjbGFz
cyBtdXN0IGltcGxlbWVudCBhbiBhcHByb3ByaWF0ZSBvbmUuCiAgICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7CkBAIC0yMDUsMTAgKzIwNiwxMCBAQCBNZXRhZGF0YUNhbGxiYWNrczo6TWV0YWRhdGFD
YWxsYmFja3MoUGFzCiB7CiB9CiAKLXZvaWQgTWV0YWRhdGFDYWxsYmFja3M6OmRpZFJlYWRNZXRh
ZGF0YShkb3VibGUgbW9kaWZpY2F0aW9uVGltZSkKK3ZvaWQgTWV0YWRhdGFDYWxsYmFja3M6OmRp
ZFJlYWRNZXRhZGF0YShjb25zdCBGaWxlTWV0YWRhdGEmIG1ldGFkYXRhKQogewogICAgIGlmICht
X3N1Y2Nlc3NDYWxsYmFjaykKLSAgICAgICAgbV9zdWNjZXNzQ2FsbGJhY2stPmhhbmRsZUV2ZW50
KE1ldGFkYXRhOjpjcmVhdGUobW9kaWZpY2F0aW9uVGltZSkuZ2V0KCkpOworICAgICAgICBtX3N1
Y2Nlc3NDYWxsYmFjay0+aGFuZGxlRXZlbnQoTWV0YWRhdGE6OmNyZWF0ZShtZXRhZGF0YS5tb2Rp
ZmljYXRpb25UaW1lKS5nZXQoKSk7CiAgICAgbV9zdWNjZXNzQ2FsbGJhY2suY2xlYXIoKTsKIH0K
IApJbmRleDogV2ViQ29yZS9maWxlYXBpL0ZpbGVTeXN0ZW1DYWxsYmFja3MuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL2ZpbGVhcGkvRmlsZVN5c3RlbUNhbGxiYWNrcy5oCShyZXZpc2lvbiA3MDAx
MykKKysrIFdlYkNvcmUvZmlsZWFwaS9GaWxlU3lzdGVtQ2FsbGJhY2tzLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTQ3LDYgKzQ3LDcgQEAgY2xhc3MgRXJyb3JDYWxsYmFjazsKIGNsYXNzIEVudHJpZXND
YWxsYmFjazsKIGNsYXNzIEVudHJ5QXJyYXk7CiBjbGFzcyBFbnRyeUNhbGxiYWNrOworY2xhc3Mg
RmlsZU1ldGFkYXRhOwogY2xhc3MgRmlsZVN5c3RlbUNhbGxiYWNrOwogY2xhc3MgRmlsZVdyaXRl
cjsKIGNsYXNzIEZpbGVXcml0ZXJDYWxsYmFjazsKQEAgLTY1LDcgKzY2LDcgQEAgcHVibGljOgog
ICAgIHZpcnR1YWwgdm9pZCBkaWRPcGVuRmlsZVN5c3RlbShjb25zdCBTdHJpbmcmIG5hbWUsIFBh
c3NPd25QdHI8QXN5bmNGaWxlU3lzdGVtPik7CiAKICAgICAvLyBGb3IgTWV0YWRhdGFDYWxsYmFj
a3MuCi0gICAgdmlydHVhbCB2b2lkIGRpZFJlYWRNZXRhZGF0YShkb3VibGUgbW9kaWZpY2F0aW9u
VGltZSk7CisgICAgdmlydHVhbCB2b2lkIGRpZFJlYWRNZXRhZGF0YShjb25zdCBGaWxlTWV0YWRh
dGEmKTsKIAogICAgIC8vIEZvciBFbnRyaWVzQ2FsbGJhY2tzLiBkaWRSZWFkRGlyZWN0b3J5RW50
cnkgaXMgY2FsbGVkIGVhY2ggdGltZSB0aGUgQVBJIHJlYWRzIGFuIGVudHJ5LCBhbmQgZGlkUmVh
ZERpcmVjdG9yeURvbmUgaXMgY2FsbGVkIHdoZW4gYSBjaHVuayBvZiBlbnRyaWVzIGhhdmUgYmVl
biByZWFkIChpLmUuIGdvb2QgdGltZSB0byBjYWxsIGJhY2sgdG8gdGhlIGFwcGxpY2F0aW9uKS4g
IElmIGhhc01vcmUgaXMgdHJ1ZSB0aGVyZSBjYW4gYmUgbW9yZSBjaHVua3MuCiAgICAgdmlydHVh
bCB2b2lkIGRpZFJlYWREaXJlY3RvcnlFbnRyeShjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wgaXNE
aXJlY3RvcnkpOwpAQCAtMTI1LDcgKzEyNiw3IEBAIHByaXZhdGU6CiBjbGFzcyBNZXRhZGF0YUNh
bGxiYWNrcyA6IHB1YmxpYyBGaWxlU3lzdGVtQ2FsbGJhY2tzQmFzZSB7CiBwdWJsaWM6CiAgICAg
c3RhdGljIFBhc3NPd25QdHI8TWV0YWRhdGFDYWxsYmFja3M+IGNyZWF0ZShQYXNzUmVmUHRyPE1l
dGFkYXRhQ2FsbGJhY2s+LCBQYXNzUmVmUHRyPEVycm9yQ2FsbGJhY2s+KTsKLSAgICB2aXJ0dWFs
IHZvaWQgZGlkUmVhZE1ldGFkYXRhKGRvdWJsZSBtb2RpZmljYXRpb25UaW1lKTsKKyAgICB2aXJ0
dWFsIHZvaWQgZGlkUmVhZE1ldGFkYXRhKGNvbnN0IEZpbGVNZXRhZGF0YSYpOwogCiBwcml2YXRl
OgogICAgIE1ldGFkYXRhQ2FsbGJhY2tzKFBhc3NSZWZQdHI8TWV0YWRhdGFDYWxsYmFjaz4sIFBh
c3NSZWZQdHI8RXJyb3JDYWxsYmFjaz4pOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9Bc3luY0Zp
bGVTeXN0ZW1DYWxsYmFja3MuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL0FzeW5j
RmlsZVN5c3RlbUNhbGxiYWNrcy5oCShyZXZpc2lvbiA3MDAxMykKKysrIFdlYkNvcmUvcGxhdGZv
cm0vQXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzLmgJKHdvcmtpbmcgY29weSkKQEAgLTM5LDYgKzM5
LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBBc3luY0ZpbGVTeXN0ZW07CiBjbGFz
cyBBc3luY0ZpbGVXcml0ZXI7CitjbGFzcyBGaWxlTWV0YWRhdGE7CiAKIGNsYXNzIEFzeW5jRmls
ZVN5c3RlbUNhbGxiYWNrcyA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CiBwdWJsaWM6CkBAIC00OSw3
ICs1MCw3IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgZGlkT3BlbkZpbGVTeXN0ZW0oY29u
c3QgU3RyaW5nJiBuYW1lLCBQYXNzT3duUHRyPEFzeW5jRmlsZVN5c3RlbT4pID0gMDsKIAogICAg
IC8vIENhbGxlZCB3aGVuIGEgZmlsZSBtZXRhZGF0YSBpcyByZWFkIHN1Y2Nlc3NmdWxseS4KLSAg
ICB2aXJ0dWFsIHZvaWQgZGlkUmVhZE1ldGFkYXRhKGRvdWJsZSBtb2RpZmljYXRpb25UaW1lKSA9
IDA7CisgICAgdmlydHVhbCB2b2lkIGRpZFJlYWRNZXRhZGF0YShjb25zdCBGaWxlTWV0YWRhdGEm
KSA9IDA7CiAKICAgICAvLyBDYWxsZWQgd2hlbiBhIGRpcmVjdG9yeSBlbnRyeSBpcyByZWFkLgog
ICAgIHZpcnR1YWwgdm9pZCBkaWRSZWFkRGlyZWN0b3J5RW50cnkoY29uc3QgU3RyaW5nJiBuYW1l
LCBib29sIGlzRGlyZWN0b3J5KSA9IDA7CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9n
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cJKHJldmlzaW9uIDcwMTIy
KQorKysgV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsx
LDI3IEBACisyMDEwLTEwLTE5ICBFcmljIFVocmhhbmUgIDxlcmljdUBjaHJvbWl1bS5vcmc+CisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0Nocm9taXVt
XSBpbXBsZW1lbnRhdGlvbiBvZiBhc3luYyBGaWxlV3JpdGVyIGZvciB3b3JrZXJzCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NzY4MQorCisgICAgICAg
IFRlc3RzIGFyZSBpbiBhIHNlcGFyYXRlIGNoYW5nZWxpc3QuCisKKyAgICAgICAgQWRkZWQgbmV3
IGZpbGVzLgorICAgICAgICAqIFdlYktpdC5neXA6CisKKyAgICAgICAgR2V0dGluZyB0aGUgbWV0
YWRhdGEgbm93IHJldHVybnMgYSBGaWxlTWV0YWRhdGEgb2JqZWN0IGluc3RlYWQgb2YganVzdCBh
IG1vZGlmaWNhdGlvbiB0aW1lLgorICAgICAgICAqIHNyYy9XZWJGaWxlU3lzdGVtQ2FsbGJhY2tz
SW1wbC5jcHA6CisgICAgICAgIChXZWJLaXQ6OldlYkZpbGVTeXN0ZW1DYWxsYmFja3NJbXBsOjpk
aWRSZWFkTWV0YWRhdGEpOgorCisgICAgICAgICogc3JjL1dvcmtlckFzeW5jRmlsZVN5c3RlbUNo
cm9taXVtLmNwcDogQWRkZWQgV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0gY29uc3RydWN0
aW9uLgorICAgICAgICAqIHNyYy9Xb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5jcHA6IEFk
ZGVkLgorICAgICAgICAqIHNyYy9Xb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5oOiBBZGRl
ZC4KKworICAgICAgICBUaGlzIGNsYXNzIGJyaWRnZXMgYmV0d2VlbiB0aGUgY29udGV4dCBhbmQg
bWFpbiB0aHJlYWRzIGZvciB0aGUgV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uCisgICAg
ICAgICogc3JjL1dvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuY3BwOiBBZGRlZC4KKyAg
ICAgICAgKiBzcmMvV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5oOiBBZGRlZC4KKwog
MjAxMC0xMC0xOSAgVG9ueSBDaGFuZyAgPHRvbnlAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJl
dmlld2VkIGJ5IEtlbnQgVGFtdXJhLgpJbmRleDogV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAJKHJldmlzaW9uIDcwMDEz
KQorKysgV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAJKHdvcmtpbmcgY29weSkKQEAgLTE1Myw3
ICsxNTMsNyBAQAogICAgICAgICAgICAgICAgICdwdWJsaWMvV2ViRmlsZUNob29zZXJDb21wbGV0
aW9uLmgnLAogICAgICAgICAgICAgICAgICdwdWJsaWMvV2ViRmlsZUNob29zZXJQYXJhbXMuaCcs
CiAgICAgICAgICAgICAgICAgJ3B1YmxpYy9XZWJGaWxlRXJyb3IuaCcsCi0gICAgICAgICAgICAg
ICAgJ3B1YmxpYy9XZWJGaWxlSW5mby5oJywKKyAgICAgICAgICAgICAgICAncHVibGljL1dlYkZp
bGVNZXRhZGF0YS5oJywKICAgICAgICAgICAgICAgICAncHVibGljL1dlYkZpbGVTeXN0ZW0uaCcs
CiAgICAgICAgICAgICAgICAgJ3B1YmxpYy9XZWJGaWxlU3lzdGVtQ2FsbGJhY2tzLmgnLAogICAg
ICAgICAgICAgICAgICdwdWJsaWMvV2ViRmlsZVN5c3RlbUVudHJ5LmgnLApAQCAtNTQwLDggKzU0
MCwxMiBAQAogICAgICAgICAgICAgICAgICdzcmMvV2ViV29ya2VySW1wbC5oJywKICAgICAgICAg
ICAgICAgICAnc3JjL1dvcmtlckFzeW5jRmlsZVN5c3RlbUNocm9taXVtLmNwcCcsCiAgICAgICAg
ICAgICAgICAgJ3NyYy9Xb3JrZXJBc3luY0ZpbGVTeXN0ZW1DaHJvbWl1bS5oJywKKyAgICAgICAg
ICAgICAgICAnc3JjL1dvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtLmNwcCcsCisgICAgICAg
ICAgICAgICAgJ3NyYy9Xb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5oJywKICAgICAgICAg
ICAgICAgICAnc3JjL1dvcmtlckZpbGVTeXN0ZW1DYWxsYmFja3NCcmlkZ2UuY3BwJywKICAgICAg
ICAgICAgICAgICAnc3JjL1dvcmtlckZpbGVTeXN0ZW1DYWxsYmFja3NCcmlkZ2UuaCcsCisgICAg
ICAgICAgICAgICAgJ3NyYy9Xb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmNwcCcsCisg
ICAgICAgICAgICAgICAgJ3NyYy9Xb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmgnLAog
ICAgICAgICAgICAgICAgICdzcmMvV3JhcHBlZFJlc291cmNlUmVxdWVzdC5oJywKICAgICAgICAg
ICAgICAgICAnc3JjL1dyYXBwZWRSZXNvdXJjZVJlc3BvbnNlLmgnLAogICAgICAgICAgICAgICAg
ICdzcmMvd2luL1dlYklucHV0RXZlbnRGYWN0b3J5LmNwcCcsCkluZGV4OiBXZWJLaXQvY2hyb21p
dW0vc3JjL1dlYkZpbGVTeXN0ZW1DYWxsYmFja3NJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJL
aXQvY2hyb21pdW0vc3JjL1dlYkZpbGVTeXN0ZW1DYWxsYmFja3NJbXBsLmNwcAkocmV2aXNpb24g
NzAwMTMpCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYkZpbGVTeXN0ZW1DYWxsYmFja3NJbXBs
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzQsNiArMzQsNyBAQAogCiAjaW5jbHVkZSAiQXN5bmNG
aWxlU3lzdGVtQ2FsbGJhY2tzLmgiCiAjaW5jbHVkZSAiQXN5bmNGaWxlU3lzdGVtQ2hyb21pdW0u
aCIKKyNpbmNsdWRlICJGaWxlTWV0YWRhdGEuaCIKICNpbmNsdWRlICJTY3JpcHRFeGVjdXRpb25D
b250ZXh0LmgiCiAjaW5jbHVkZSAiV2ViRmlsZVN5c3RlbUVudHJ5LmgiCiAjaW5jbHVkZSAiV2Vi
RmlsZUluZm8uaCIKQEAgLTYzLDkgKzY0LDIzIEBAIHZvaWQgV2ViRmlsZVN5c3RlbUNhbGxiYWNr
c0ltcGw6OmRpZFN1Y2MKICAgICBkZWxldGUgdGhpczsKIH0KIAotdm9pZCBXZWJGaWxlU3lzdGVt
Q2FsbGJhY2tzSW1wbDo6ZGlkUmVhZE1ldGFkYXRhKGNvbnN0IFdlYkZpbGVJbmZvJiBpbmZvKQor
dm9pZCBXZWJGaWxlU3lzdGVtQ2FsbGJhY2tzSW1wbDo6ZGlkUmVhZE1ldGFkYXRhKGNvbnN0IFdl
YkZpbGVJbmZvJiB3ZWJGaWxlSW5mbykKIHsKLSAgICBtX2NhbGxiYWNrcy0+ZGlkUmVhZE1ldGFk
YXRhKGluZm8ubW9kaWZpY2F0aW9uVGltZSk7CisgICAgRmlsZU1ldGFkYXRhIGZpbGVNZXRhZGF0
YTsKKyAgICBmaWxlTWV0YWRhdGEubW9kaWZpY2F0aW9uVGltZSA9IHdlYkZpbGVJbmZvLm1vZGlm
aWNhdGlvblRpbWU7CisgICAgZmlsZU1ldGFkYXRhLmxlbmd0aCA9IHdlYkZpbGVJbmZvLmxlbmd0
aDsKKyAgICBzd2l0Y2ggKHdlYkZpbGVJbmZvLnR5cGUpIHsKKyAgICBjYXNlIFdlYkZpbGVJbmZv
OjpUeXBlRGlyZWN0b3J5OgorICAgICAgICBmaWxlTWV0YWRhdGEudHlwZSA9IEZpbGVNZXRhZGF0
YTo6VHlwZURpcmVjdG9yeTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXZWJGaWxlSW5mbzo6
VHlwZUZpbGU6CisgICAgICAgIGZpbGVNZXRhZGF0YS50eXBlID0gRmlsZU1ldGFkYXRhOjpUeXBl
RmlsZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZmlsZU1ldGFkYXRh
LnR5cGUgPSBGaWxlTWV0YWRhdGE6OlR5cGVVbmtub3duOworICAgICAgICBicmVhazsKKyAgICB9
CisgICAgbV9jYWxsYmFja3MtPmRpZFJlYWRNZXRhZGF0YShmaWxlTWV0YWRhdGEpOwogICAgIGRl
bGV0ZSB0aGlzOwogfQogCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckFzeW5jRmls
ZVN5c3RlbUNocm9taXVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dv
cmtlckFzeW5jRmlsZVN5c3RlbUNocm9taXVtLmNwcAkocmV2aXNpb24gNzAwMTMpCisrKyBXZWJL
aXQvY2hyb21pdW0vc3JjL1dvcmtlckFzeW5jRmlsZVN5c3RlbUNocm9taXVtLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMzUsMTIgKzM1LDE1IEBACiAKICNpbmNsdWRlICJBc3luY0ZpbGVTeXN0ZW1D
YWxsYmFja3MuaCIKICNpbmNsdWRlICJGaWxlU3lzdGVtLmgiCisjaW5jbHVkZSAiRmlsZU1ldGFk
YXRhLmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlICJXZWJGaWxlU3lz
dGVtLmgiCiAjaW5jbHVkZSAiV2ViRmlsZVN5c3RlbUNhbGxiYWNrc0ltcGwuaCIKKyNpbmNsdWRl
ICJXZWJGaWxlV3JpdGVyLmgiCiAjaW5jbHVkZSAiV2ViS2l0LmgiCiAjaW5jbHVkZSAiV2ViS2l0
Q2xpZW50LmgiCiAjaW5jbHVkZSAiV2ViV29ya2VyQmFzZS5oIgorI2luY2x1ZGUgIldvcmtlckFz
eW5jRmlsZVdyaXRlckNocm9taXVtLmgiCiAjaW5jbHVkZSAiV29ya2VyQ29udGV4dC5oIgogI2lu
Y2x1ZGUgIldvcmtlckZpbGVTeXN0ZW1DYWxsYmFja3NCcmlkZ2UuaCIKICNpbmNsdWRlICJXb3Jr
ZXJTY3JpcHRDb250cm9sbGVyLmgiCkBAIC0xMzQsOSArMTM3LDc2IEBAIHZvaWQgV29ya2VyQXN5
bmNGaWxlU3lzdGVtQ2hyb21pdW06OnJlYWQKICAgICBjcmVhdGVXb3JrZXJGaWxlU3lzdGVtQ2Fs
bGJhY2tzQnJpZGdlKGNhbGxiYWNrcyktPnBvc3RSZWFkRGlyZWN0b3J5VG9NYWluVGhyZWFkKG1f
d2ViRmlsZVN5c3RlbSwgcGF0aCwgbV9tb2RlRm9yQ3VycmVudE9wZXJhdGlvbik7CiB9CiAKLXZv
aWQgV29ya2VyQXN5bmNGaWxlU3lzdGVtQ2hyb21pdW06OmNyZWF0ZVdyaXRlcihBc3luY0ZpbGVX
cml0ZXJDbGllbnQqLCBjb25zdCBTdHJpbmcmLCBQYXNzT3duUHRyPEFzeW5jRmlsZVN5c3RlbUNh
bGxiYWNrcz4pCitjbGFzcyBXb3JrZXJGaWxlV3JpdGVySGVscGVyQ2FsbGJhY2tzIDogcHVibGlj
IEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrcyB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NPd25Q
dHI8V29ya2VyRmlsZVdyaXRlckhlbHBlckNhbGxiYWNrcz4gY3JlYXRlKEFzeW5jRmlsZVdyaXRl
ckNsaWVudCogY2xpZW50LCBjb25zdCBTdHJpbmcmIHBhdGgsIFdlYktpdDo6V2ViRmlsZVN5c3Rl
bSogd2ViRmlsZVN5c3RlbSwgUGFzc093blB0cjxXZWJDb3JlOjpBc3luY0ZpbGVTeXN0ZW1DYWxs
YmFja3M+IGNhbGxiYWNrcywgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiBhZG9wdFB0cihuZXcgV29ya2VyRmlsZVdyaXRlckhlbHBlckNhbGxiYWNr
cyhjbGllbnQsIHBhdGgsIHdlYkZpbGVTeXN0ZW0sIGNhbGxiYWNrcywgd29ya2VyQ29udGV4dCkp
OworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBkaWRTdWNjZWVkKCkKKyAgICB7CisgICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBkaWRSZWFk
TWV0YWRhdGEoY29uc3QgRmlsZU1ldGFkYXRhJiBtZXRhZGF0YSkKKyAgICB7CisgICAgICAgIEFT
U0VSVChtX2NhbGxiYWNrcyk7CisgICAgICAgIGlmIChtZXRhZGF0YS50eXBlICE9IEZpbGVNZXRh
ZGF0YTo6VHlwZUZpbGUgfHwgbWV0YWRhdGEubGVuZ3RoIDwgMCkKKyAgICAgICAgICAgIG1fY2Fs
bGJhY2tzLT5kaWRGYWlsKFdlYktpdDo6V2ViRmlsZUVycm9ySW52YWxpZFN0YXRlKTsKKyAgICAg
ICAgZWxzZSB7CisgICAgICAgICAgICBPd25QdHI8V29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21p
dW0+IGFzeW5jRmlsZVdyaXRlckNocm9taXVtID0gYWRvcHRQdHIobmV3IFdvcmtlckFzeW5jRmls
ZVdyaXRlckNocm9taXVtKG1fd2ViRmlsZVN5c3RlbSwgbV9wYXRoLCBtX3dvcmtlckNvbnRleHQs
IG1fY2xpZW50LCBmYWxzZSkpOworICAgICAgICAgICAgbV9jYWxsYmFja3MtPmRpZENyZWF0ZUZp
bGVXcml0ZXIoYXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0ucmVsZWFzZSgpLCBtZXRhZGF0YS5sZW5n
dGgpOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGRpZFJlYWREaXJlY3Rv
cnlFbnRyeShjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wgaXNEaXJlY3RvcnkpCisgICAgeworICAg
ICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlk
UmVhZERpcmVjdG9yeUVudHJpZXMoYm9vbCBoYXNNb3JlKQorICAgIHsKKyAgICAgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGRpZE9wZW5GaWxlU3lz
dGVtKGNvbnN0IFN0cmluZyYsIFBhc3NPd25QdHI8QXN5bmNGaWxlU3lzdGVtPikKKyAgICB7Cisg
ICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KKworICAgIC8vIENhbGxlZCB3aGVu
IGFuIEFzeW5jRmlsZVdydGVyIGhhcyBiZWVuIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgIHZp
cnR1YWwgdm9pZCBkaWRDcmVhdGVGaWxlV3JpdGVyKFBhc3NPd25QdHI8QXN5bmNGaWxlV3JpdGVy
PiwgbG9uZyBsb25nKQorICAgIHsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAg
fQorCisgICAgdmlydHVhbCB2b2lkIGRpZEZhaWwoaW50IGNvZGUpCisgICAgeworICAgICAgICBB
U1NFUlQobV9jYWxsYmFja3MpOworICAgICAgICBtX2NhbGxiYWNrcy0+ZGlkRmFpbChjb2RlKTsK
KyAgICB9CisKK3ByaXZhdGU6CisgICAgV29ya2VyRmlsZVdyaXRlckhlbHBlckNhbGxiYWNrcyhB
c3luY0ZpbGVXcml0ZXJDbGllbnQqIGNsaWVudCwgY29uc3QgU3RyaW5nJiBwYXRoLCBXZWJLaXQ6
OldlYkZpbGVTeXN0ZW0qIHdlYkZpbGVTeXN0ZW0sIFBhc3NPd25QdHI8V2ViQ29yZTo6QXN5bmNG
aWxlU3lzdGVtQ2FsbGJhY2tzPiBjYWxsYmFja3MsIFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRl
eHQpCisgICAgICAgIDogbV9jbGllbnQoY2xpZW50KQorICAgICAgICAsIG1fcGF0aChwYXRoKQor
ICAgICAgICAsIG1fd2ViRmlsZVN5c3RlbSh3ZWJGaWxlU3lzdGVtKQorICAgICAgICAsIG1fY2Fs
bGJhY2tzKGNhbGxiYWNrcykKKyAgICAgICAgLCBtX3dvcmtlckNvbnRleHQod29ya2VyQ29udGV4
dCkKKyAgICB7CisgICAgfQorCisgICAgQXN5bmNGaWxlV3JpdGVyQ2xpZW50KiBtX2NsaWVudDsK
KyAgICBTdHJpbmcgbV9wYXRoOworICAgIFdlYktpdDo6V2ViRmlsZVN5c3RlbSogbV93ZWJGaWxl
U3lzdGVtOworICAgIE93blB0cjxXZWJDb3JlOjpBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3M+IG1f
Y2FsbGJhY2tzOworICAgIFdvcmtlckNvbnRleHQqIG1fd29ya2VyQ29udGV4dDsKK307CisKK3Zv
aWQgV29ya2VyQXN5bmNGaWxlU3lzdGVtQ2hyb21pdW06OmNyZWF0ZVdyaXRlcihBc3luY0ZpbGVX
cml0ZXJDbGllbnQqIGNsaWVudCwgY29uc3QgU3RyaW5nJiBwYXRoLCBQYXNzT3duUHRyPEFzeW5j
RmlsZVN5c3RlbUNhbGxiYWNrcz4gY2FsbGJhY2tzKQogewotICAgIG5vdEltcGxlbWVudGVkKCk7
CisgICAgY3JlYXRlV29ya2VyRmlsZVN5c3RlbUNhbGxiYWNrc0JyaWRnZShXb3JrZXJGaWxlV3Jp
dGVySGVscGVyQ2FsbGJhY2tzOjpjcmVhdGUoY2xpZW50LCBwYXRoLCBtX3dlYkZpbGVTeXN0ZW0s
IGNhbGxiYWNrcywgbV93b3JrZXJDb250ZXh0KSktPnBvc3RSZWFkTWV0YWRhdGFUb01haW5UaHJl
YWQobV93ZWJGaWxlU3lzdGVtLCBwYXRoLCBtX21vZGVGb3JDdXJyZW50T3BlcmF0aW9uKTsKIH0K
IAogUGFzc1JlZlB0cjxXb3JrZXJGaWxlU3lzdGVtQ2FsbGJhY2tzQnJpZGdlPiBXb3JrZXJBc3lu
Y0ZpbGVTeXN0ZW1DaHJvbWl1bTo6Y3JlYXRlV29ya2VyRmlsZVN5c3RlbUNhbGxiYWNrc0JyaWRn
ZShQYXNzT3duUHRyPEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrcz4gY2FsbGJhY2tzKQpJbmRleDog
V2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJv
bWl1bS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckFzeW5j
RmlsZVdyaXRlckNocm9taXVtLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw5MiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBk
aXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5v
ciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRo
b3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JT
CisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIg
T1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICog
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5o
IgorCisjaWYgRU5BQkxFKEZJTEVfU1lTVEVNKQorCisjaW5jbHVkZSAiQXN5bmNGaWxlU3lzdGVt
LmgiCisjaW5jbHVkZSAiQXN5bmNGaWxlV3JpdGVyQ2xpZW50LmgiCisjaW5jbHVkZSAiQmxvYi5o
IgorI2luY2x1ZGUgIlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQuaCIKKyNpbmNsdWRlICJXZWJGaWxl
U3lzdGVtLmgiCisjaW5jbHVkZSAiV2ViRmlsZVdyaXRlci5oIgorI2luY2x1ZGUgIldlYlVSTC5o
IgorI2luY2x1ZGUgIldlYldvcmtlckJhc2UuaCIKKyNpbmNsdWRlICJXb3JrZXJDb250ZXh0Lmgi
CisjaW5jbHVkZSAiV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5oIgorI2luY2x1ZGUg
IldvcmtlckxvYWRlclByb3h5LmgiCisjaW5jbHVkZSAiV29ya2VyVGhyZWFkLmgiCisKK3VzaW5n
IG5hbWVzcGFjZSBXZWJLaXQ7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIGNvbnN0
IGNoYXIgZmlsZVdyaXRlck9wZXJhdGlvbnNNb2RlW10gPSAiZmlsZVdyaXRlck9wZXJhdGlvbnNN
b2RlIjsKKworV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW06OldvcmtlckFzeW5jRmlsZVdy
aXRlckNocm9taXVtKFdlYkZpbGVTeXN0ZW0qIHdlYkZpbGVTeXN0ZW0sIGNvbnN0IFN0cmluZyYg
cGF0aCwgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCwgQXN5bmNGaWxlV3JpdGVyQ2xpZW50
KiBjbGllbnQsIGJvb2wgc3luY2hyb25vdXMpCisgICAgOiBtX3N5bmNocm9ub3VzKHN5bmNocm9u
b3VzKQoreworICAgIEFTU0VSVCghc3luY2hyb25vdXMpOyAvLyBOb3QgaW1wbGVtZW50ZWQgeWV0
LgorCisgICAgV29ya2VyTG9hZGVyUHJveHkqIHByb3h5ID0gJndvcmtlckNvbnRleHQtPnRocmVh
ZCgpLT53b3JrZXJMb2FkZXJQcm94eSgpOworICAgIG1fYnJpZGdlID0gV29ya2VyRmlsZVdyaXRl
ckNhbGxiYWNrc0JyaWRnZTo6Y3JlYXRlKHBhdGgsIHByb3h5LCB3b3JrZXJDb250ZXh0LCBjbGll
bnQpOworfQorCitXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bTo6fldvcmtlckFzeW5jRmls
ZVdyaXRlckNocm9taXVtKCkKK3sKKyAgICBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdl
KiBicmlkZ2UgPSBtX2JyaWRnZS5nZXQoKTsKKyAgICBicmlkZ2UtPnBvc3RTaHV0ZG93blRvTWFp
blRocmVhZChtX2JyaWRnZS5yZWxlYXNlKCkpOworfQorCitXZWJGaWxlV3JpdGVyQ2xpZW50KiBX
b3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bTo6Z2V0TWFpblRocmVhZENsaWVudCgpCit7Cisg
ICAgcmV0dXJuIG1fYnJpZGdlLmdldCgpOworfQorCit2b2lkIFdvcmtlckFzeW5jRmlsZVdyaXRl
ckNocm9taXVtOjp3cml0ZShsb25nIGxvbmcgcG9zaXRpb24sIEJsb2IqIGRhdGEpCit7CisgICAg
bV9icmlkZ2UtPnBvc3RXcml0ZVRvTWFpblRocmVhZChwb3NpdGlvbiwgV2ViS2l0OjpXZWJVUkwo
ZGF0YS0+dXJsKCkpKTsKK30KKwordm9pZCBXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bTo6
dHJ1bmNhdGUobG9uZyBsb25nIGxlbmd0aCkKK3sKKyAgICBtX2JyaWRnZS0+cG9zdFRydW5jYXRl
VG9NYWluVGhyZWFkKGxlbmd0aCk7Cit9CisKK3ZvaWQgV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hy
b21pdW06OmFib3J0KCkKK3sKKyAgICBtX2JyaWRnZS0+cG9zdEFib3J0VG9NYWluVGhyZWFkKCk7
Cit9CisKK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBFTkFCTEUoRklMRV9TWVNURU0pCklu
ZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJBc3luY0ZpbGVXcml0ZXJD
aHJvbWl1bS5oCShyZXZpc2lvbiAwKQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJBc3lu
Y0ZpbGVXcml0ZXJDaHJvbWl1bS5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDc2IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICog
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRp
c3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9y
IHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNl
IG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhv
dXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMK
KyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBP
UiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRl
ZiBXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bV9oCisjZGVmaW5lIFdvcmtlckFzeW5jRmls
ZVdyaXRlckNocm9taXVtX2gKKworI2lmIEVOQUJMRShGSUxFX1NZU1RFTSkKKworI2luY2x1ZGUg
IkFzeW5jRmlsZVdyaXRlci5oIgorI2luY2x1ZGUgIldlYkZpbGVFcnJvci5oIgorI2luY2x1ZGUg
IldlYkZpbGVXcml0ZXJDbGllbnQuaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVk
ZSA8d3RmL1Bhc3NPd25QdHIuaD4KKworbmFtZXNwYWNlIFdlYktpdCB7CitjbGFzcyBXZWJGaWxl
U3lzdGVtOworY2xhc3MgV2ViRmlsZVdyaXRlcjsKK2NsYXNzIFdvcmtlckZpbGVXcml0ZXJDYWxs
YmFja3NCcmlkZ2U7Cit9CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQXN5bmNGaWxl
U3lzdGVtOworY2xhc3MgQXN5bmNGaWxlV3JpdGVyQ2xpZW50OworY2xhc3MgQmxvYjsKK2NsYXNz
IFdvcmtlckNvbnRleHQ7CisKK2NsYXNzIFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtIDog
cHVibGljIEFzeW5jRmlsZVdyaXRlciB7CitwdWJsaWM6CisgICAgV29ya2VyQXN5bmNGaWxlV3Jp
dGVyQ2hyb21pdW0oV2ViS2l0OjpXZWJGaWxlU3lzdGVtKiwgY29uc3QgU3RyaW5nJiBwYXRoLCBX
b3JrZXJDb250ZXh0KiwgQXN5bmNGaWxlV3JpdGVyQ2xpZW50KiwgYm9vbCBzeW5jaHJvbm91cyk7
CisgICAgfldvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtKCk7CisgICAgCisgICAgV2ViS2l0
OjpXZWJGaWxlV3JpdGVyQ2xpZW50KiBnZXRNYWluVGhyZWFkQ2xpZW50KCk7CisKKyAgICAvLyBG
aWxlV3JpdGVyCisgICAgdmlydHVhbCB2b2lkIHdyaXRlKGxvbmcgbG9uZyBwb3NpdGlvbiwgQmxv
YiogZGF0YSk7CisgICAgdmlydHVhbCB2b2lkIHRydW5jYXRlKGxvbmcgbG9uZyBsZW5ndGgpOwor
ICAgIHZpcnR1YWwgdm9pZCBhYm9ydCgpOworCitwcml2YXRlOgorICAgIFJlZlB0cjxXZWJLaXQ6
OldvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+IG1fYnJpZGdlOworICAgIGJvb2wgbV9z
eW5jaHJvbm91czsKK307CisKK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBFTkFCTEUoRklM
RV9TWVNURU0pCisKKyNlbmRpZiAvLyBBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bV9oCkluZGV4OiBX
ZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2VyRmlsZVdyaXRlckNhbGxiYWNr
c0JyaWRnZS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckZp
bGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDIxNSBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAq
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0
aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
CisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJ
bmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8g
ZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2Fy
ZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJ
QlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICog
T1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tz
QnJpZGdlLmgiCisKKyNpZiBFTkFCTEUoRklMRV9TWVNURU0pCisKKyNpbmNsdWRlICJBc3luY0Zp
bGVXcml0ZXJDbGllbnQuaCIKKyNpbmNsdWRlICJDcm9zc1RocmVhZFRhc2suaCIKKyNpbmNsdWRl
ICJXZWJDU3RyaW5nLmgiCisjaW5jbHVkZSAiV2ViRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgIldl
YkZpbGVXcml0ZXIuaCIKKyNpbmNsdWRlICJXZWJLaXQuaCIKKyNpbmNsdWRlICJXZWJLaXRDbGll
bnQuaCIKKyNpbmNsdWRlICJXZWJXb3JrZXJCYXNlLmgiCisjaW5jbHVkZSAiV29ya2VyQ29udGV4
dC5oIgorI2luY2x1ZGUgIldvcmtlckxvYWRlclByb3h5LmgiCisjaW5jbHVkZSAiV29ya2VyVGhy
ZWFkLmgiCisjaW5jbHVkZSA8d3RmL01haW5UaHJlYWQuaD4KKyNpbmNsdWRlIDx3dGYvVGhyZWFk
aW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQ3Jvc3NU
aHJlYWRDb3BpZXJCYXNlPGZhbHNlLCBmYWxzZSwgV2ViS2l0OjpXZWJVUkw+IHsKKyAgICB0eXBl
ZGVmIFdlYktpdDo6V2ViVVJMIFR5cGU7CisgICAgc3RhdGljIFR5cGUgY29weShjb25zdCBXZWJL
aXQ6OldlYlVSTCYgdXJsKQorICAgIHsKKyAgICAgICAgV2ViS2l0OjpXZWJDU3RyaW5nIHNwZWM7
CisgICAgICAgIHNwZWMuYXNzaWduKHVybC5zcGVjKCkuZGF0YSgpLCB1cmwuc3BlYygpLmxlbmd0
aCgpKTsKKyAgICAgICAgY29uc3QgdXJsX3BhcnNlOjpQYXJzZWQmIHBhcnNlZCA9IHVybC5wYXJz
ZWQoKTsKKyAgICAgICAgYm9vbCBpc1ZhbGlkID0gdXJsLmlzVmFsaWQoKTsKKworICAgICAgICBy
ZXR1cm4gV2ViS2l0OjpXZWJVUkwoc3BlYywgcGFyc2VkLCBpc1ZhbGlkKTsKKyAgICB9Cit9Owor
Cit0ZW1wbGF0ZTw+IHN0cnVjdCBDcm9zc1RocmVhZENvcGllckJhc2U8ZmFsc2UsIGZhbHNlLCBQ
YXNzUmVmUHRyPFdlYktpdDo6V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gPiB7Cisg
ICAgdHlwZWRlZiBQYXNzUmVmUHRyPFdlYktpdDo6V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0Jy
aWRnZT4gVHlwZTsKKyAgICBzdGF0aWMgVHlwZSBjb3B5KGNvbnN0IFBhc3NSZWZQdHI8V2ViS2l0
OjpXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlPiYgYnJpZGdlKQorICAgIHsKKyAgICAg
ICAgVHlwZSBuZXdSZWYoYnJpZGdlLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIG5ld1JlZjsKKyAg
ICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJD
b3JlOworCituYW1lc3BhY2UgV2ViS2l0IHsKKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJh
Y2tzQnJpZGdlOjpub3RpZnlTdG9wKCkKK3sKKyAgICBBU1NFUlQobV93b3JrZXJDb250ZXh0LT5p
c0NvbnRleHRUaHJlYWQoKSk7CisgICAgbV9jbGllbnRPbldvcmtlclRocmVhZCA9IDA7Cit9CisK
K3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6cG9zdFdyaXRlVG9NYWluVGhy
ZWFkKGxvbmcgbG9uZyBwb3NpdGlvbiwgY29uc3QgV2ViVVJMJiBkYXRhKQoreworICAgIGRpc3Bh
dGNoVGFza1RvTWFpblRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJndyaXRlT25NYWluVGhyZWFk
LCB0aGlzLCBwb3NpdGlvbiwgZGF0YSkpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxs
YmFja3NCcmlkZ2U6OnBvc3RUcnVuY2F0ZVRvTWFpblRocmVhZChsb25nIGxvbmcgbGVuZ3RoKQor
eworICAgIGRpc3BhdGNoVGFza1RvTWFpblRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJnRydW5j
YXRlT25NYWluVGhyZWFkLCB0aGlzLCBsZW5ndGgpKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3Jp
dGVyQ2FsbGJhY2tzQnJpZGdlOjpwb3N0QWJvcnRUb01haW5UaHJlYWQoKQoreworICAgIGRpc3Bh
dGNoVGFza1RvTWFpblRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJmFib3J0T25NYWluVGhyZWFk
LCB0aGlzKSk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6cG9z
dFNodXRkb3duVG9NYWluVGhyZWFkKAorICAgICAgICBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0
ZXJDYWxsYmFja3NCcmlkZ2U+IGJyaWRnZSkKK3sKKyAgICBBU1NFUlQoIW1fY2xpZW50T25Xb3Jr
ZXJUaHJlYWQpOworICAgIGRpc3BhdGNoVGFza1RvTWFpblRocmVhZChjcmVhdGVDYWxsYmFja1Rh
c2soJnNodXRkb3duT25NYWluVGhyZWFkLCBicmlkZ2UpKTsKK30KKwordm9pZCBXb3JrZXJGaWxl
V3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjp3cml0ZU9uTWFpblRocmVhZChTY3JpcHRFeGVjdXRpb25D
b250ZXh0KiwgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlPiBicmlk
Z2UsIGxvbmcgbG9uZyBwb3NpdGlvbiwgY29uc3QgV2ViVVJMJiBkYXRhKQoreworICAgIGJyaWRn
ZS0+bV93cml0ZXItPndyaXRlKHBvc2l0aW9uLCBkYXRhKTsKK30KKwordm9pZCBXb3JrZXJGaWxl
V3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjp0cnVuY2F0ZU9uTWFpblRocmVhZChTY3JpcHRFeGVjdXRp
b25Db250ZXh0KiwgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlPiBi
cmlkZ2UsIGxvbmcgbG9uZyBsZW5ndGgpCit7CisgICAgYnJpZGdlLT5tX3dyaXRlci0+dHJ1bmNh
dGUobGVuZ3RoKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjph
Ym9ydE9uTWFpblRocmVhZChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxXb3Jr
ZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlPiBicmlkZ2UpCit7CisgICAgYnJpZGdlLT5tX3dy
aXRlci0+Y2FuY2VsKCk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRn
ZTo6aW5pdE9uTWFpblRocmVhZChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxX
b3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlPiBicmlkZ2UsIGNvbnN0IFN0cmluZyYgcGF0
aCkKK3sKKyAgICBBU1NFUlQoIWJyaWRnZS0+bV93cml0ZXIpOworICAgIGJyaWRnZS0+bV93cml0
ZXIgPSBhZG9wdFB0cih3ZWJLaXRDbGllbnQoKS0+ZmlsZVN5c3RlbSgpLT5jcmVhdGVGaWxlV3Jp
dGVyKHBhdGgsIGJyaWRnZS5nZXQoKSkpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxs
YmFja3NCcmlkZ2U6OnNodXRkb3duT25NYWluVGhyZWFkKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQq
LCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+IGJyaWRnZSkKK3sK
KyAgICBicmlkZ2UtPm1fd3JpdGVyRGVsZXRlZCA9IHRydWU7CisgICAgYnJpZGdlLT5tX3dyaXRl
ci5jbGVhcigpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OmRp
ZFdyaXRlKGxvbmcgbG9uZyBieXRlcywgYm9vbCBjb21wbGV0ZSkKK3sKKyAgICBkaXNwYXRjaFRh
c2tUb1dvcmtlclRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJmRpZFdyaXRlT25Xb3JrZXJUaHJl
YWQsIHRoaXMsIGJ5dGVzLCBjb21wbGV0ZSkpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJD
YWxsYmFja3NCcmlkZ2U6OmRpZEZhaWwoV2ViRmlsZUVycm9yIGVycm9yKQoreworICAgIGRpc3Bh
dGNoVGFza1RvV29ya2VyVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmZGlkRmFpbE9uV29ya2Vy
VGhyZWFkLCB0aGlzLCBlcnJvcikpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFj
a3NCcmlkZ2U6OmRpZFRydW5jYXRlKCkKK3sKKyAgICBkaXNwYXRjaFRhc2tUb1dvcmtlclRocmVh
ZChjcmVhdGVDYWxsYmFja1Rhc2soJmRpZFRydW5jYXRlT25Xb3JrZXJUaHJlYWQsIHRoaXMpKTsK
K30KKworV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6V29ya2VyRmlsZVdyaXRlckNh
bGxiYWNrc0JyaWRnZShjb25zdCBTdHJpbmcmIHBhdGgsIFdvcmtlckxvYWRlclByb3h5KiBwcm94
eSwgU2NyaXB0RXhlY3V0aW9uQ29udGV4dCogc2NyaXB0RXhlY3V0aW9uQ29udGV4dCwgQXN5bmNG
aWxlV3JpdGVyQ2xpZW50KiBjbGllbnQpCisgICAgOiBXb3JrZXJDb250ZXh0OjpPYnNlcnZlcihz
dGF0aWNfY2FzdDxXb3JrZXJDb250ZXh0Kj4oc2NyaXB0RXhlY3V0aW9uQ29udGV4dCkpCisgICAg
LCBtX3Byb3h5KHByb3h5KQorICAgICwgbV93cml0ZXJEZWxldGVkKGZhbHNlKQorICAgICwgbV93
b3JrZXJDb250ZXh0KHNjcmlwdEV4ZWN1dGlvbkNvbnRleHQpCisgICAgLCBtX2NsaWVudE9uV29y
a2VyVGhyZWFkKGNsaWVudCkKK3sKKyAgICBBU1NFUlQobV93b3JrZXJDb250ZXh0LT5pc0NvbnRl
eHRUaHJlYWQoKSk7CisgICAgcG9zdEluaXRUb01haW5UaHJlYWQocGF0aCk7Cit9CisKK3ZvaWQg
V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6cG9zdEluaXRUb01haW5UaHJlYWQoY29u
c3QgU3RyaW5nJiBwYXRoKQoreworICAgIGRpc3BhdGNoVGFza1RvTWFpblRocmVhZChjcmVhdGVD
YWxsYmFja1Rhc2soJmluaXRPbk1haW5UaHJlYWQsIHRoaXMsIHBhdGgpKTsKK30KKworV29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6fldvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlk
Z2UoKQoreworICAgIEFTU0VSVCghbV9jbGllbnRPbldvcmtlclRocmVhZCk7CisgICAgQVNTRVJU
KCFtX3dyaXRlcik7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6
ZGlkV3JpdGVPbldvcmtlclRocmVhZChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgV29ya2VyRmls
ZVdyaXRlckNhbGxiYWNrc0JyaWRnZSogYnJpZGdlLCBsb25nIGxvbmcgbGVuZ3RoLCBib29sIGNv
bXBsZXRlKQoreworICAgIGJyaWRnZS0+bV9jbGllbnRPbldvcmtlclRocmVhZC0+ZGlkV3JpdGUo
bGVuZ3RoLCBjb21wbGV0ZSk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0Jy
aWRnZTo6ZGlkRmFpbE9uV29ya2VyVGhyZWFkKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBXb3Jr
ZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlKiBicmlkZ2UsIFdlYkZpbGVFcnJvciBlcnJvcikK
K3sKKyAgICBicmlkZ2UtPm1fY2xpZW50T25Xb3JrZXJUaHJlYWQtPmRpZEZhaWwoZXJyb3IpOwor
fQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OmRpZFRydW5jYXRlT25X
b3JrZXJUaHJlYWQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFdvcmtlckZpbGVXcml0ZXJDYWxs
YmFja3NCcmlkZ2UqIGJyaWRnZSkKK3sKKyAgICBicmlkZ2UtPm1fY2xpZW50T25Xb3JrZXJUaHJl
YWQtPmRpZFRydW5jYXRlKCk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0Jy
aWRnZTo6cnVuVGFza09uTWFpblRocmVhZChXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0
KiBzY3JpcHRFeGVjdXRpb25Db250ZXh0LCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxs
YmFja3NCcmlkZ2U+IGJyaWRnZSwgUGFzc093blB0cjxXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25D
b250ZXh0OjpUYXNrPiB0YXNrVG9SdW4pCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsK
KyAgICBpZiAoIWJyaWRnZS0+bV93cml0ZXJEZWxldGVkKQorICAgICAgICB0YXNrVG9SdW4tPnBl
cmZvcm1UYXNrKHNjcmlwdEV4ZWN1dGlvbkNvbnRleHQpOworfQorCit2b2lkIFdvcmtlckZpbGVX
cml0ZXJDYWxsYmFja3NCcmlkZ2U6OnJ1blRhc2tPbldvcmtlclRocmVhZChXZWJDb3JlOjpTY3Jp
cHRFeGVjdXRpb25Db250ZXh0KiBzY3JpcHRFeGVjdXRpb25Db250ZXh0LCBQYXNzUmVmUHRyPFdv
cmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+IGJyaWRnZSwgUGFzc093blB0cjxXZWJDb3Jl
OjpTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPiB0YXNrVG9SdW4pCit7CisgICAgQVNTRVJU
KGJyaWRnZS0+bV93b3JrZXJDb250ZXh0LT5pc0NvbnRleHRUaHJlYWQoKSk7CisgICAgaWYgKGJy
aWRnZS0+bV9jbGllbnRPbldvcmtlclRocmVhZCkKKyAgICAgICAgdGFza1RvUnVuLT5wZXJmb3Jt
VGFzayhzY3JpcHRFeGVjdXRpb25Db250ZXh0KTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVy
Q2FsbGJhY2tzQnJpZGdlOjpkaXNwYXRjaFRhc2tUb01haW5UaHJlYWQoUGFzc093blB0cjxXZWJD
b3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPiB0YXNrKQoreworICAgIEFTU0VSVCht
X3dvcmtlckNvbnRleHQtPmlzQ29udGV4dFRocmVhZCgpKTsKKyAgICBXZWJXb3JrZXJCYXNlOjpk
aXNwYXRjaFRhc2tUb01haW5UaHJlYWQoY3JlYXRlQ2FsbGJhY2tUYXNrKCZydW5UYXNrT25NYWlu
VGhyZWFkLCB0aGlzLCB0YXNrKSk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNr
c0JyaWRnZTo6ZGlzcGF0Y2hUYXNrVG9Xb3JrZXJUaHJlYWQoUGFzc093blB0cjxTY3JpcHRFeGVj
dXRpb25Db250ZXh0OjpUYXNrPiB0YXNrKQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7
CisgICAgbV9wcm94eS0+cG9zdFRhc2tGb3JNb2RlVG9Xb3JrZXJDb250ZXh0KGNyZWF0ZUNhbGxi
YWNrVGFzaygmcnVuVGFza09uV29ya2VyVGhyZWFkLCB0aGlzLCB0YXNrKSwgIiIpOworfQorCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoRklMRV9TWVNURU0pCklu
ZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2Uu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckZpbGVXcml0ZXJDYWxs
YmFja3NCcmlkZ2UuaAkocmV2aXNpb24gMCkKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE0NiBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAq
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0
aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
CisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJ
bmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8g
ZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2Fy
ZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJ
QlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICog
T1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpZm5kZWYgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZV9oCisjZGVmaW5lIFdvcmtl
ckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2VfaAorCisjaWYgRU5BQkxFKEZJTEVfU1lTVEVNKQor
CisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJXZWJGaWxlRXJyb3IuaCIK
KyNpbmNsdWRlICJXZWJGaWxlV3JpdGVyQ2xpZW50LmgiCisjaW5jbHVkZSAiV29ya2VyQ29udGV4
dC5oIgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQ
dHIuaD4KKyNpbmNsdWRlIDx3dGYvVGhyZWFkaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
K2NsYXNzIEFzeW5jRmlsZVdyaXRlckNsaWVudDsKK2NsYXNzIFdvcmtlckxvYWRlclByb3h5Owor
fQorCituYW1lc3BhY2UgV2ViS2l0IHsKKworY2xhc3MgV2ViRmlsZVN5c3RlbTsKK2NsYXNzIFdl
YkZpbGVXcml0ZXI7CitjbGFzcyBXZWJGaWxlV3JpdGVyQ2xpZW50OworY2xhc3MgV2ViVVJMOwor
Y2xhc3MgV2ViV29ya2VyQmFzZTsKKworLy8gVGhpcyBjbGFzcyBpcyB1c2VkIGFzIGEgbWVjaGFu
aXNtIHRvIGJyaWRnZSBjYWxscyBiZXR3ZWVuIHRocmVhZHMuCisvLyBDYWxscyB0byBhIFdlYkZp
bGVXcml0ZXIgbXVzdCBoYXBwZW4gb24gdGhlIG1haW4gdGhyZWFkLCBidXQgdGhleSBjb21lIGZy
b20KKy8vIHRoZSBjb250ZXh0IHRocmVhZC4gIFRoZSByZXNwb25zZXMgdGhyb3VnaCB0aGUgV2Vi
RmlsZVdyaXRlckNsaWVudCBpbnRlcmZhY2UKKy8vIHN0YXJ0IG9uIHRoZSBtYWluIHRocmVhZCwg
YnV0IG11c3QgYmUgc2VudCB2aWEgdGhlIHdvcmtlciBjb250ZXh0IHRocmVhZC4KKy8vCisvLyBB
IHR5cGljYWwgZmxvdyBmb3Igd3JpdGUgd291bGQgbG9vayBsaWtlIHRoaXM6CisvLyBCcmlkZ2U6
OnBvc3RXcml0ZVRvTWFpblRocmVhZCgpIG9uIFdvcmtlclRocmVhZAorLy8gIC0tPiBCcmlkZ2U6
OndyaXRlT25NYWluVGhyZWFkKCkgaXMgY2FsbGVkIG9uIE1haW5UaHJlYWQKKy8vICAtLT4gV2Vi
RmlsZVdyaXRlcjo6d3JpdGUoKQorLy8gICAgICBUaGlzIG1ha2VzIGFuIElQQzsgdGhlIGFjdHVh
bCBvcGVyYXRpb24gaXMgZG93biBpbiB0aGUgYnJvd3Nlci4KKy8vICAtLT4gQnJpZGdlOjpkaWRX
cml0ZSBpcyBjYWxsZWQgb24gTWFpblRocmVhZAorLy8gIC0tPiBCcmlkZ2U6OmRpZFdyaXRlT25X
b3JrZXJUaHJlYWQgaXMgY2FsbGVkIG9uIFdvcmtlclRocmVhZAorLy8gICAgICBUaGlzIGNhbGxz
IHRoZSBvcmlnaW5hbCBjbGllbnQgKG1fY2xpZW50T25Xb3JrZXJUaHJlYWQpLgorY2xhc3MgV29y
a2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZSA6IHB1YmxpYyBUaHJlYWRTYWZlU2hhcmVkPFdv
cmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+LCBwdWJsaWMgV2ViQ29yZTo6V29ya2VyQ29u
dGV4dDo6T2JzZXJ2ZXIsIHB1YmxpYyBXZWJGaWxlV3JpdGVyQ2xpZW50IHsKK3B1YmxpYzoKKyAg
ICB+V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZSgpOworCisgICAgLy8gV29ya2VyQ29u
dGV4dDo6T2JzZXJ2ZXIgbWV0aG9kLgorICAgIHZpcnR1YWwgdm9pZCBub3RpZnlTdG9wKCk7CisK
KyAgICBzdGF0aWMgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlPiBj
cmVhdGUoY29uc3QgU3RyaW5nJiBwYXRoLCBXZWJDb3JlOjpXb3JrZXJMb2FkZXJQcm94eSogcHJv
eHksIFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIHdvcmtlckNvbnRleHQsIFdlYkNv
cmU6OkFzeW5jRmlsZVdyaXRlckNsaWVudCogY2xpZW50KQorICAgIHsKKyAgICAgICAgcmV0dXJu
IGFkb3B0UmVmKG5ldyBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlKHBhdGgsIHByb3h5
LCB3b3JrZXJDb250ZXh0LCBjbGllbnQpKTsKKyAgICB9CisKKyAgICAvLyBNZXRob2RzIHRoYXQg
Y3JlYXRlIGFuIGluc3RhbmNlIGFuZCBwb3N0IGFuIGluaXRpYWwgcmVxdWVzdCB0YXNrIHRvIHRo
ZSBtYWluIHRocmVhZC4gVGhleSBtdXN0IGJlIGNhbGxlZCBvbiB0aGUgd29ya2VyIHRocmVhZC4K
KyAgICB2b2lkIHBvc3RXcml0ZVRvTWFpblRocmVhZChsb25nIGxvbmcgcG9zaXRpb24sIGNvbnN0
IFdlYlVSTCYgZGF0YSk7CisgICAgdm9pZCBwb3N0VHJ1bmNhdGVUb01haW5UaHJlYWQobG9uZyBs
b25nIGxlbmd0aCk7CisgICAgdm9pZCBwb3N0QWJvcnRUb01haW5UaHJlYWQoKTsKKworICAgIC8v
IFRoZSBvd25pbmcgV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0gc2hvdWxkIHVzZSB0aGlz
IG1ldGhvZCB0byBnaXZlCisgICAgLy8gYXdheSBpdHMgbGFzdCByZWZlcmVuY2UgdG8gdGhlIGJy
aWRnZSBhdCBkZWxldGlvbiB0aW1lLCBvbiB0aGUgY29udGV4dAorICAgIC8vIHRocmVhZC4gIFlv
dSBtdXN0IGhhdmUgY2FsbGVkIHN0b3AoKSBiZWZvcmUgY2FsbGluZyB0aGlzLiAgVGhlIGFjdHVh
bAorICAgIC8vIGRlbGV0aW9uIG9mIHRoZSBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdl
IG1heSBoYXBwZW4gb24gZWl0aGVyIHRoZQorICAgIC8vIG1haW4gb3IgY29udGV4dCB0aHJlYWQs
IGRlcGVuZGluZyBvbiB3aGVyZSB0aGUgbGFzdCByZWZlcmVuY2UgZ29lcyBhd2F5OworICAgIC8v
IHRoYXQncyBzYWZlIGFzIGxvbmcgYXMgdGhpcyBpcyBjYWxsZWQgZmlyc3QuCisgICAgdm9pZCBw
b3N0U2h1dGRvd25Ub01haW5UaHJlYWQoUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2FsbGJh
Y2tzQnJpZGdlPik7CisKKyAgICAvLyBDYWxsYmFjayBtZXRob2RzIHRoYXQgYXJlIGNhbGxlZCBv
biB0aGUgbWFpbiB0aHJlYWQuCisgICAgLy8gVGhlc2UgYXJlIHRoZSBpbXBsZW1lbnRhdGlvbiBv
ZiBXZWJLaXQ6OldlYkZpbGVXcml0ZXJDbGllbnQuCisgICAgdm9pZCBkaWRXcml0ZShsb25nIGxv
bmcgYnl0ZXMsIGJvb2wgY29tcGxldGUpOworICAgIHZvaWQgZGlkRmFpbChXZWJGaWxlRXJyb3Ip
OworICAgIHZvaWQgZGlkVHJ1bmNhdGUoKTsKKworcHJpdmF0ZToKKyAgICBXb3JrZXJGaWxlV3Jp
dGVyQ2FsbGJhY2tzQnJpZGdlKGNvbnN0IFN0cmluZyYgcGF0aCwgV2ViQ29yZTo6V29ya2VyTG9h
ZGVyUHJveHkqLCBXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgV2ViQ29yZTo6QXN5
bmNGaWxlV3JpdGVyQ2xpZW50Kik7CisKKyAgICB2b2lkIHBvc3RJbml0VG9NYWluVGhyZWFkKGNv
bnN0IFN0cmluZyYgcGF0aCk7CisKKyAgICAvLyBNZXRob2RzIHRoYXQgYXJlIHRvIGJlIGNhbGxl
ZCBvbiB0aGUgbWFpbiB0aHJlYWQuCisgICAgc3RhdGljIHZvaWQgd3JpdGVPbk1haW5UaHJlYWQo
V2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdy
aXRlckNhbGxiYWNrc0JyaWRnZT4sIGxvbmcgbG9uZyBwb3NpdGlvbiwgY29uc3QgV2ViVVJMJiBk
YXRhKTsKKyAgICBzdGF0aWMgdm9pZCB0cnVuY2F0ZU9uTWFpblRocmVhZChXZWJDb3JlOjpTY3Jp
cHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tz
QnJpZGdlPiwgbG9uZyBsb25nIGxlbmd0aCk7CisgICAgc3RhdGljIHZvaWQgYWJvcnRPbk1haW5U
aHJlYWQoV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4pOworICAgIHN0YXRpYyB2b2lkIGluaXRPbk1haW5U
aHJlYWQoV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4sIGNvbnN0IFN0cmluZyYgcGF0aCk7CisgICAgc3Rh
dGljIHZvaWQgc2h1dGRvd25Pbk1haW5UaHJlYWQoV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29u
dGV4dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4pOworCisg
ICAgLy8gTWV0aG9kcyB0aGF0IGRpc3BhdGNoIHRvIEFzeW5jRmlsZVdyaXRlckNsaWVudCBvbiB0
aGUgd29ya2VyIHRocmVhZHMuCisgICAgLy8gVGhleSByZWxlYXNlIGEgc2VsZlJlZiBvZiB0aGUg
V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS4KKyAgICBzdGF0aWMgdm9pZCBkaWRXcml0
ZU9uV29ya2VyVGhyZWFkKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBXb3JrZXJG
aWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlKiwgbG9uZyBsb25nIGxlbmd0aCwgYm9vbCBjb21wbGV0
ZSk7CisgICAgc3RhdGljIHZvaWQgZGlkRmFpbE9uV29ya2VyVGhyZWFkKFdlYkNvcmU6OlNjcmlw
dEV4ZWN1dGlvbkNvbnRleHQqLCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlKiwgV2Vi
RmlsZUVycm9yKTsKKyAgICBzdGF0aWMgdm9pZCBkaWRUcnVuY2F0ZU9uV29ya2VyVGhyZWFkKFdl
YkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tz
QnJpZGdlKik7CisKKyAgICAvLyBMYXp5IGluaXRpYWxpemF0aW9uIG9mIHRoZSBXZWJGaWxlV3Jp
dGVyLgorICAgIHZvaWQgaW5pdFdlYkZpbGVXcml0ZXIoKTsKKyAgICBzdGF0aWMgdm9pZCBydW5U
YXNrT25NYWluVGhyZWFkKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVm
UHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+LCBQYXNzT3duUHRyPFdlYkNvcmU6
OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2s+KTsKKyAgICBzdGF0aWMgdm9pZCBydW5UYXNr
T25Xb3JrZXJUaHJlYWQoV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQ
dHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4sIFBhc3NPd25QdHI8V2ViQ29yZTo6
U2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6VGFzaz4pOworCisgICAgdm9pZCBkaXNwYXRjaFRhc2tU
b01haW5UaHJlYWQoUGFzc093blB0cjxXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpU
YXNrPik7CisgICAgdm9pZCBkaXNwYXRjaFRhc2tUb1dvcmtlclRocmVhZChQYXNzT3duUHRyPFdl
YkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2s+KTsKKworICAgIC8vIFVzZWQgZnJv
bSB0aGUgbWFpbiB0aHJlYWQgdG8gcG9zdCB0YXNrcyB0byB0aGUgY29udGV4dCB0aHJlYWQuCisg
ICAgV2ViQ29yZTo6V29ya2VyTG9hZGVyUHJveHkqIG1fcHJveHk7CisgICAgLy8gVXNlZCB0byBp
bmRpY2F0ZSB0aGF0IHNodXRkb3duIGhhcyBzdGFydGVkIG9uIHRoZSBtYWluIHRocmVhZCwgYW5k
IGhlbmNlIHRoZSB3cml0ZXIgaGFzIGJlZW4gZGVsZXRlZC4KKyAgICBib29sIG1fd3JpdGVyRGVs
ZXRlZDsKKworICAgIC8vIFVzZWQgb24gdGhlIGNvbnRleHQgdGhyZWFkLCBvbmx5IHRvIGNoZWNr
IHRoYXQgd2UncmUgcnVubmluZyBvbiB0aGUgY29udGV4dCB0aHJlYWQuCisgICAgV2ViQ29yZTo6
U2NyaXB0RXhlY3V0aW9uQ29udGV4dCogbV93b3JrZXJDb250ZXh0OworCisgICAgLy8gQ3JlYXRl
ZCBhbmQgZGVzdHJveWVkIGZyb20gdGhlIG1haW4gdGhyZWFkLiAgVGhlIFdvcmtlckFzeW5jRmls
ZVdyaXRlckNocm9taXVtIGRyb3BzIGl0cyBsYXN0IHJlZmVyZW5jZSB0byBhIFdvcmtlckZpbGVX
cml0ZXJDYWxsYmFja3NCcmlkZ2UgYnkgcmVsZWFzaW5nIGl0IHRvIHBvc3RTaHV0ZG93blRvTWFp
blRocmVhZCB0byBnaXZlIHRoZSBicmlkZ2UgdGhlIGNoYW5jZSB0byBjbGVhbiB1cCBtX3dyaXRl
ci4KKyAgICBPd25QdHI8V2ViS2l0OjpXZWJGaWxlV3JpdGVyPiBtX3dyaXRlcjsKKworICAgIC8v
IFVzZWQgb24gdGhlIGNvbnRleHQgdGhyZWFkIHRvIGNhbGwgYmFjayBpbnRvIHRoZSBjbGllbnQu
CisgICAgV2ViQ29yZTo6QXN5bmNGaWxlV3JpdGVyQ2xpZW50KiBtX2NsaWVudE9uV29ya2VyVGhy
ZWFkOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYKKworI2VuZGlmIC8v
IFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2VfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>71362</attachid>
            <date>2010-10-20 16:43:07 -0700</date>
            <delta_ts>2010-10-20 18:24:37 -0700</delta_ts>
            <desc>Fixed include order.</desc>
            <filename>file_writer_worker.txt</filename>
            <type>text/plain</type>
            <size>43355</size>
            <attacher name="Eric U.">ericu</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3MDEyMikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjggQEAKKzIwMTAtMTAtMTkgIEVyaWMgVWhyaGFuZSAgPGVyaWN1QGNocm9taXVt
Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBb
Q2hyb21pdW1dIGltcGxlbWVudGF0aW9uIG9mIGFzeW5jIEZpbGVXcml0ZXIgZm9yIHdvcmtlcnMK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ3NjgxCisK
KyAgICAgICAgSW5pdGlhbCB0ZXN0cyBhcmUgaW4gYSBzZXBhcmF0ZSBjaGFuZ2VsaXN0LgorCisg
ICAgICAgIEJ1aWxkIGZpbGUgY2hhbmdlcyB0byBhZGQgRmlsZU1ldGFkYXRhLgorICAgICAgICAq
IEdOVW1ha2VmaWxlLmFtOgorICAgICAgICAqIFdlYkNvcmUuZ3lwaToKKyAgICAgICAgKiBXZWJD
b3JlLnBybzoKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvajoKKyAgICAg
ICAgKiBXZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisKKyAgICAgICAgVGhlIHJl
c3Qgb2YgdGhlIGNoYW5nZXMgaGVyZSBqdXN0IHBhc3MgdGhlIG5ldyBGaWxlTWV0YWRhdGEgb2Jq
ZWN0IHRocm91Z2ggY2FsbHMgdGhhdCB1c2VkIHRvIHRha2UgYSBtb2RpZmljYXRpb24gdGltZS4K
KyAgICAgICAgKiBmaWxlYXBpL0ZpbGVNZXRhZGF0YS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYkNv
cmU6OkZpbGVNZXRhZGF0YTo6RmlsZU1ldGFkYXRhKToKKyAgICAgICAgKiBmaWxlYXBpL0ZpbGVT
eXN0ZW1DYWxsYmFja3MuY3BwOgorICAgICAgICAoV2ViQ29yZTo6RmlsZVN5c3RlbUNhbGxiYWNr
c0Jhc2U6OmRpZFJlYWRNZXRhZGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpNZXRhZGF0YUNhbGxi
YWNrczo6ZGlkUmVhZE1ldGFkYXRhKToKKyAgICAgICAgKiBmaWxlYXBpL0ZpbGVTeXN0ZW1DYWxs
YmFja3MuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9Bc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3MuaDoK
KwogMjAxMC0xMC0xOSAgWW9uZ2p1biBaaGFuZyAgPHlvbmdqdW5femhhbmdAYXBwbGUuY29tPgog
CiAgICAgICAgIFJldmlld2VkIGJ5IERhbiBCZXJuc3RlaW4uCkluZGV4OiBXZWJDb3JlL0dOVW1h
a2VmaWxlLmFtCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvR05VbWFrZWZpbGUuYW0JKHJldmlzaW9u
IDcwMDEzKQorKysgV2ViQ29yZS9HTlVtYWtlZmlsZS5hbQkod29ya2luZyBjb3B5KQpAQCAtMTQx
MSw2ICsxNDExLDcgQEAgd2ViY29yZV9zb3VyY2VzICs9IFwKIAlXZWJDb3JlL2ZpbGVhcGkvRmls
ZS5oIFwKIAlXZWJDb3JlL2ZpbGVhcGkvRmlsZUxpc3QuY3BwIFwKIAlXZWJDb3JlL2ZpbGVhcGkv
RmlsZUxpc3QuaCBcCisJV2ViQ29yZS9maWxlYXBpL0ZpbGVNZXRhZGF0YS5oIFwKIAlXZWJDb3Jl
L2ZpbGVhcGkvRmlsZVJlYWRlci5jcHAgXAogCVdlYkNvcmUvZmlsZWFwaS9GaWxlUmVhZGVyLmgg
XAogCVdlYkNvcmUvZmlsZWFwaS9GaWxlUmVhZGVyU3luYy5jcHAgXApJbmRleDogV2ViQ29yZS9X
ZWJDb3JlLmd5cGkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHJldmlzaW9u
IDcwMDEzKQorKysgV2ViQ29yZS9XZWJDb3JlLmd5cGkJKHdvcmtpbmcgY29weSkKQEAgLTE0OTks
NiArMTQ5OSw3IEBACiAgICAgICAgICAgICAnZmlsZWFwaS9GaWxlRXhjZXB0aW9uLmgnLAogICAg
ICAgICAgICAgJ2ZpbGVhcGkvRmlsZUxpc3QuY3BwJywKICAgICAgICAgICAgICdmaWxlYXBpL0Zp
bGVMaXN0LmgnLAorICAgICAgICAgICAgJ2ZpbGVhcGkvRmlsZU1ldGFkYXRhLmgnLAogICAgICAg
ICAgICAgJ2ZpbGVhcGkvRmlsZVJlYWRlci5jcHAnLAogICAgICAgICAgICAgJ2ZpbGVhcGkvRmls
ZVJlYWRlci5oJywKICAgICAgICAgICAgICdmaWxlYXBpL0ZpbGVSZWFkZXJTeW5jLmNwcCcsCklu
ZGV4OiBXZWJDb3JlL1dlYkNvcmUucHJvCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS5w
cm8JKHJldmlzaW9uIDcwMDEzKQorKysgV2ViQ29yZS9XZWJDb3JlLnBybwkod29ya2luZyBjb3B5
KQpAQCAtMzAwMiw2ICszMDAyLDcgQEAgY29udGFpbnMoREVGSU5FUywgRU5BQkxFX0ZJTEVfU1lT
VEVNPTEpIAogICAgICAgICBmaWxlYXBpL0ZpbGVDYWxsYmFjay5oIFwKICAgICAgICAgZmlsZWFw
aS9GaWxlRW50cnkuaCBcCiAgICAgICAgIGZpbGVhcGkvRmlsZUVudHJ5U3luYy5oIFwKKyAgICAg
ICAgZmlsZWFwaS9GaWxlTWV0YWRhdGEuaCBcCiAgICAgICAgIGZpbGVhcGkvRmlsZVN5c3RlbUNh
bGxiYWNrLmggXAogICAgICAgICBmaWxlYXBpL0ZpbGVTeXN0ZW1DYWxsYmFja3MuaCBcCiAgICAg
ICAgIGZpbGVhcGkvRmlsZVdyaXRlci5oIFwKSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS52Y3Byb2ov
V2ViQ29yZS52Y3Byb2oKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJD
b3JlLnZjcHJvagkocmV2aXNpb24gNzAwMTMpCisrKyBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dl
YkNvcmUudmNwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC00ODQwMyw2ICs0ODQwMywxMCBAQAogCQkJ
CT4NCiAJCQk8L0ZpbGU+DQogCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxmaWxlYXBp
XEZpbGVNZXRhZGF0YS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQogCQkJCVJl
bGF0aXZlUGF0aD0iLi5cZmlsZWFwaVxGaWxlUmVhZGVyLmNwcCINCiAJCQkJPg0KIAkJCTwvRmls
ZT4NCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvago9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2
aXNpb24gNzAwMTMpCisrKyBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
agkod29ya2luZyBjb3B5KQpAQCAtOTMwLDYgKzkzMCw3IEBACiAJCTQ2MTRBMUZFMEIyM0E4RDYw
MDQ0NkUxQyAvKiBjb3B5Q3Vyc29yLnBuZyBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gNDYxNEExRkQwQjIzQThENjAwNDQ2RTFDIC8qIGNvcHlDdXJzb3Iu
cG5nICovOyB9OwogCQk0NjRFQTI3MzBCOEEzNTBCMDBBOEU2RTMgLyogY3Jvc3NIYWlyQ3Vyc29y
LnBuZyBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDY0
RUEyNzEwQjhBMzUwQjAwQThFNkUzIC8qIGNyb3NzSGFpckN1cnNvci5wbmcgKi87IH07CiAJCTQ2
NEVBMjc0MEI4QTM1MEIwMEE4RTZFMyAvKiBub3RBbGxvd2VkQ3Vyc29yLnBuZyBpbiBSZXNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDY0RUEyNzIwQjhBMzUwQjAw
QThFNkUzIC8qIG5vdEFsbG93ZWRDdXJzb3IucG5nICovOyB9OworCQk0Njg5RjFBRjEyNjdCQUUx
MDBFOEQzODAgLyogRmlsZU1ldGFkYXRhLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSA0Njg5RjFBRTEyNjdCQUUxMDBFOEQzODAgLyogRmlsZU1ldGFkYXRh
LmggKi87IH07CiAJCTQ2QkQxNkUzMEIyNzk0NzMwMDFGMDgzOSAvKiBub25lQ3Vyc29yLnBuZyBp
biBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDZCRDE2RTIw
QjI3OTQ3MzAwMUYwODM5IC8qIG5vbmVDdXJzb3IucG5nICovOyB9OwogCQk0NkQ0RjI0OTBBRjk3
RTgxMDAzNTM4NUEgLyogY2VsbEN1cnNvci5wbmcgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ2RDRGMjQ2MEFGOTdFODEwMDM1Mzg1QSAvKiBjZWxsQ3Vy
c29yLnBuZyAqLzsgfTsKIAkJNDZENEYyNEEwQUY5N0U4MTAwMzUzODVBIC8qIGNvbnRleHRNZW51
Q3Vyc29yLnBuZyBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gNDZENEYyNDcwQUY5N0U4MTAwMzUzODVBIC8qIGNvbnRleHRNZW51Q3Vyc29yLnBuZyAqLzsg
fTsKQEAgLTY5NjEsNiArNjk2Miw3IEBACiAJCTQ2MTRBMUZEMEIyM0E4RDYwMDQ0NkUxQyAvKiBj
b3B5Q3Vyc29yLnBuZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxl
VHlwZSA9IGltYWdlLnBuZzsgcGF0aCA9IGNvcHlDdXJzb3IucG5nOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OwogCQk0NjRFQTI3MTBCOEEzNTBCMDBBOEU2RTMgLyogY3Jvc3NIYWlyQ3Vyc29y
LnBuZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGlt
YWdlLnBuZzsgcGF0aCA9IGNyb3NzSGFpckN1cnNvci5wbmc7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CiAJCTQ2NEVBMjcyMEI4QTM1MEIwMEE4RTZFMyAvKiBub3RBbGxvd2VkQ3Vyc29yLnBu
ZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGltYWdl
LnBuZzsgcGF0aCA9IG5vdEFsbG93ZWRDdXJzb3IucG5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OworCQk0Njg5RjFBRTEyNjdCQUUxMDBFOEQzODAgLyogRmlsZU1ldGFkYXRhLmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEZpbGVNZXRhZGF0YS5oOyBwYXRoID0gZmlsZWFw
aS9GaWxlTWV0YWRhdGEuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNDZCRDE2RTIw
QjI3OTQ3MzAwMUYwODM5IC8qIG5vbmVDdXJzb3IucG5nICovID0ge2lzYSA9IFBCWEZpbGVSZWZl
cmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gaW1hZ2UucG5nOyBwYXRoID0gbm9uZUN1cnNvci5w
bmc7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTQ2RDRGMjQ2MEFGOTdFODEwMDM1Mzg1
QSAvKiBjZWxsQ3Vyc29yLnBuZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25v
d25GaWxlVHlwZSA9IGltYWdlLnBuZzsgcGF0aCA9IGNlbGxDdXJzb3IucG5nOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQk0NkQ0RjI0NzBBRjk3RTgxMDAzNTM4NUEgLyogY29udGV4dE1l
bnVDdXJzb3IucG5nICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVU
eXBlID0gaW1hZ2UucG5nOyBwYXRoID0gY29udGV4dE1lbnVDdXJzb3IucG5nOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwpAQCAtMTQ5MjEsNiArMTQ5MjMsNyBAQAogCQkJCTJFREYzNjlFMTIy
Qzk0QzgwMDJGN0Q0RSAvKiBGaWxlRXhjZXB0aW9uLmggKi8sCiAJCQkJOTc2RDZDNjYxMjJCOEEz
RDAwMUZEMUY3IC8qIEZpbGVMaXN0LmNwcCAqLywKIAkJCQk5NzZENkM2NzEyMkI4QTNEMDAxRkQx
RjcgLyogRmlsZUxpc3QuaCAqLywKKwkJCQk0Njg5RjFBRTEyNjdCQUUxMDBFOEQzODAgLyogRmls
ZU1ldGFkYXRhLmggKi8sCiAJCQkJOTc2RDZDNjkxMjJCOEEzRDAwMUZEMUY3IC8qIEZpbGVSZWFk
ZXIuY3BwICovLAogCQkJCTk3NkQ2QzZBMTIyQjhBM0QwMDFGRDFGNyAvKiBGaWxlUmVhZGVyLmgg
Ki8sCiAJCQkJMkVERjM2OUExMjJDOTRCNDAwMkY3RDRFIC8qIEZpbGVSZWFkZXJTeW5jLmNwcCAq
LywKQEAgLTIxMDgwLDYgKzIxMDgzLDcgQEAKIAkJCQk5M0YxOTlFRDA4MjQ1RTU5MDAxRTlBQkMg
LyogWFNMVFByb2Nlc3Nvci5oIGluIEhlYWRlcnMgKi8sCiAJCQkJRTFCRTUxMkUwQ0Y2QzUxMjAw
MkVBOTU5IC8qIFhTTFRVbmljb2RlU29ydC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTdERDREODcw
RkRGNEQ2RTAwRUNGOUE0IC8qIFhTU0F1ZGl0b3IuaCBpbiBIZWFkZXJzICovLAorCQkJCTQ2ODlG
MUFGMTI2N0JBRTEwMEU4RDM4MCAvKiBGaWxlTWV0YWRhdGEuaCBpbiBIZWFkZXJzICovLAogCQkJ
CTRGQTNCOTBCMTI1Q0QxMjIwMDMwMEJBRCAvKiBJbnNwZWN0b3JTdGF0ZS5oIGluIEhlYWRlcnMg
Ki8sCiAJCQkJOTcyOEMzMTQxMjY4RTQzOTAwNDFFODlCIC8qIE1hcmt1cEFjY3VtdWxhdG9yLmgg
aW4gSGVhZGVycyAqLywKIAkJCSk7CkluZGV4OiBXZWJDb3JlL2ZpbGVhcGkvRmlsZU1ldGFkYXRh
LmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9maWxlYXBpL0ZpbGVNZXRhZGF0YS5oCShyZXZpc2lv
biAwKQorKysgV2ViQ29yZS9maWxlYXBpL0ZpbGVNZXRhZGF0YS5oCShyZXZpc2lvbiAwKQpAQCAt
MCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBt
ZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUg
b2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkg
YmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0
aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJT
IEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09Q
WVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICog
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2lmbmRlZiBGaWxlTWV0YWRhdGFfaAorI2RlZmluZSBGaWxlTWV0YWRhdGFf
aAorCisjaWYgRU5BQkxFKEZJTEVfU1lTVEVNKQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0
cnVjdCBGaWxlTWV0YWRhdGEgeworICAgIC8vIFRoZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lIG9m
IHRoZSBmaWxlLCBpbiBzZWNvbmRzLgorICAgIC8vIFRoZSB2YWx1ZSAwLjAgbWVhbnMgdGhhdCB0
aGUgdGltZSBpcyBub3Qgc2V0LgorICAgIGRvdWJsZSBtb2RpZmljYXRpb25UaW1lOworCisgICAg
Ly8gVGhlIGxlbmd0aCBvZiB0aGUgZmlsZSBpbiBieXRlcy4KKyAgICAvLyBUaGUgdmFsdWUgLTEg
bWVhbnMgdGhhdCB0aGUgbGVuZ3RoIGlzIG5vdCBzZXQuCisgICAgbG9uZyBsb25nIGxlbmd0aDsK
KworICAgIGVudW0gVHlwZSB7CisgICAgICAgIFR5cGVVbmtub3duID0gMCwKKyAgICAgICAgVHlw
ZUZpbGUsCisgICAgICAgIFR5cGVEaXJlY3RvcnkKKyAgICB9OworCisgICAgVHlwZSB0eXBlOwor
CisgICAgRmlsZU1ldGFkYXRhKCkgOiBtb2RpZmljYXRpb25UaW1lKDAuMCksIGxlbmd0aCgtMSks
IHR5cGUoVHlwZVVua25vd24pIHsgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisj
ZW5kaWYgLy8gRU5BQkxFKEZJTEVfU1lTVEVNKQorCisjZW5kaWYgLy8gRmlsZU1ldGFkYXRhX2gK
SW5kZXg6IFdlYkNvcmUvZmlsZWFwaS9GaWxlU3lzdGVtQ2FsbGJhY2tzLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL2ZpbGVhcGkvRmlsZVN5c3RlbUNhbGxiYWNrcy5jcHAJKHJldmlzaW9uIDcw
MDEzKQorKysgV2ViQ29yZS9maWxlYXBpL0ZpbGVTeXN0ZW1DYWxsYmFja3MuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC00Niw2ICs0Niw3IEBACiAjaW5jbHVkZSAiRXhjZXB0aW9uQ29kZS5oIgogI2lu
Y2x1ZGUgIkZpbGVFbnRyeS5oIgogI2luY2x1ZGUgIkZpbGVFcnJvci5oIgorI2luY2x1ZGUgIkZp
bGVNZXRhZGF0YS5oIgogI2luY2x1ZGUgIkZpbGVTeXN0ZW1DYWxsYmFjay5oIgogI2luY2x1ZGUg
IkZpbGVXcml0ZXIuaCIKICNpbmNsdWRlICJGaWxlV3JpdGVyQ2FsbGJhY2suaCIKQEAgLTc3LDcg
Kzc4LDcgQEAgdm9pZCBGaWxlU3lzdGVtQ2FsbGJhY2tzQmFzZTo6ZGlkT3BlbkZpbAogICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOwogfQogCi12b2lkIEZpbGVTeXN0ZW1DYWxsYmFja3NCYXNlOjpk
aWRSZWFkTWV0YWRhdGEoZG91YmxlKQordm9pZCBGaWxlU3lzdGVtQ2FsbGJhY2tzQmFzZTo6ZGlk
UmVhZE1ldGFkYXRhKGNvbnN0IEZpbGVNZXRhZGF0YSYpCiB7CiAgICAgLy8gRWFjaCBzdWJjbGFz
cyBtdXN0IGltcGxlbWVudCBhbiBhcHByb3ByaWF0ZSBvbmUuCiAgICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7CkBAIC0yMDUsMTAgKzIwNiwxMCBAQCBNZXRhZGF0YUNhbGxiYWNrczo6TWV0YWRhdGFD
YWxsYmFja3MoUGFzCiB7CiB9CiAKLXZvaWQgTWV0YWRhdGFDYWxsYmFja3M6OmRpZFJlYWRNZXRh
ZGF0YShkb3VibGUgbW9kaWZpY2F0aW9uVGltZSkKK3ZvaWQgTWV0YWRhdGFDYWxsYmFja3M6OmRp
ZFJlYWRNZXRhZGF0YShjb25zdCBGaWxlTWV0YWRhdGEmIG1ldGFkYXRhKQogewogICAgIGlmICht
X3N1Y2Nlc3NDYWxsYmFjaykKLSAgICAgICAgbV9zdWNjZXNzQ2FsbGJhY2stPmhhbmRsZUV2ZW50
KE1ldGFkYXRhOjpjcmVhdGUobW9kaWZpY2F0aW9uVGltZSkuZ2V0KCkpOworICAgICAgICBtX3N1
Y2Nlc3NDYWxsYmFjay0+aGFuZGxlRXZlbnQoTWV0YWRhdGE6OmNyZWF0ZShtZXRhZGF0YS5tb2Rp
ZmljYXRpb25UaW1lKS5nZXQoKSk7CiAgICAgbV9zdWNjZXNzQ2FsbGJhY2suY2xlYXIoKTsKIH0K
IApJbmRleDogV2ViQ29yZS9maWxlYXBpL0ZpbGVTeXN0ZW1DYWxsYmFja3MuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL2ZpbGVhcGkvRmlsZVN5c3RlbUNhbGxiYWNrcy5oCShyZXZpc2lvbiA3MDAx
MykKKysrIFdlYkNvcmUvZmlsZWFwaS9GaWxlU3lzdGVtQ2FsbGJhY2tzLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTQ3LDYgKzQ3LDcgQEAgY2xhc3MgRXJyb3JDYWxsYmFjazsKIGNsYXNzIEVudHJpZXND
YWxsYmFjazsKIGNsYXNzIEVudHJ5QXJyYXk7CiBjbGFzcyBFbnRyeUNhbGxiYWNrOworY2xhc3Mg
RmlsZU1ldGFkYXRhOwogY2xhc3MgRmlsZVN5c3RlbUNhbGxiYWNrOwogY2xhc3MgRmlsZVdyaXRl
cjsKIGNsYXNzIEZpbGVXcml0ZXJDYWxsYmFjazsKQEAgLTY1LDcgKzY2LDcgQEAgcHVibGljOgog
ICAgIHZpcnR1YWwgdm9pZCBkaWRPcGVuRmlsZVN5c3RlbShjb25zdCBTdHJpbmcmIG5hbWUsIFBh
c3NPd25QdHI8QXN5bmNGaWxlU3lzdGVtPik7CiAKICAgICAvLyBGb3IgTWV0YWRhdGFDYWxsYmFj
a3MuCi0gICAgdmlydHVhbCB2b2lkIGRpZFJlYWRNZXRhZGF0YShkb3VibGUgbW9kaWZpY2F0aW9u
VGltZSk7CisgICAgdmlydHVhbCB2b2lkIGRpZFJlYWRNZXRhZGF0YShjb25zdCBGaWxlTWV0YWRh
dGEmKTsKIAogICAgIC8vIEZvciBFbnRyaWVzQ2FsbGJhY2tzLiBkaWRSZWFkRGlyZWN0b3J5RW50
cnkgaXMgY2FsbGVkIGVhY2ggdGltZSB0aGUgQVBJIHJlYWRzIGFuIGVudHJ5LCBhbmQgZGlkUmVh
ZERpcmVjdG9yeURvbmUgaXMgY2FsbGVkIHdoZW4gYSBjaHVuayBvZiBlbnRyaWVzIGhhdmUgYmVl
biByZWFkIChpLmUuIGdvb2QgdGltZSB0byBjYWxsIGJhY2sgdG8gdGhlIGFwcGxpY2F0aW9uKS4g
IElmIGhhc01vcmUgaXMgdHJ1ZSB0aGVyZSBjYW4gYmUgbW9yZSBjaHVua3MuCiAgICAgdmlydHVh
bCB2b2lkIGRpZFJlYWREaXJlY3RvcnlFbnRyeShjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wgaXNE
aXJlY3RvcnkpOwpAQCAtMTI1LDcgKzEyNiw3IEBAIHByaXZhdGU6CiBjbGFzcyBNZXRhZGF0YUNh
bGxiYWNrcyA6IHB1YmxpYyBGaWxlU3lzdGVtQ2FsbGJhY2tzQmFzZSB7CiBwdWJsaWM6CiAgICAg
c3RhdGljIFBhc3NPd25QdHI8TWV0YWRhdGFDYWxsYmFja3M+IGNyZWF0ZShQYXNzUmVmUHRyPE1l
dGFkYXRhQ2FsbGJhY2s+LCBQYXNzUmVmUHRyPEVycm9yQ2FsbGJhY2s+KTsKLSAgICB2aXJ0dWFs
IHZvaWQgZGlkUmVhZE1ldGFkYXRhKGRvdWJsZSBtb2RpZmljYXRpb25UaW1lKTsKKyAgICB2aXJ0
dWFsIHZvaWQgZGlkUmVhZE1ldGFkYXRhKGNvbnN0IEZpbGVNZXRhZGF0YSYpOwogCiBwcml2YXRl
OgogICAgIE1ldGFkYXRhQ2FsbGJhY2tzKFBhc3NSZWZQdHI8TWV0YWRhdGFDYWxsYmFjaz4sIFBh
c3NSZWZQdHI8RXJyb3JDYWxsYmFjaz4pOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9Bc3luY0Zp
bGVTeXN0ZW1DYWxsYmFja3MuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL0FzeW5j
RmlsZVN5c3RlbUNhbGxiYWNrcy5oCShyZXZpc2lvbiA3MDAxMykKKysrIFdlYkNvcmUvcGxhdGZv
cm0vQXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzLmgJKHdvcmtpbmcgY29weSkKQEAgLTM5LDYgKzM5
LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBBc3luY0ZpbGVTeXN0ZW07CiBjbGFz
cyBBc3luY0ZpbGVXcml0ZXI7CitjbGFzcyBGaWxlTWV0YWRhdGE7CiAKIGNsYXNzIEFzeW5jRmls
ZVN5c3RlbUNhbGxiYWNrcyA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CiBwdWJsaWM6CkBAIC00OSw3
ICs1MCw3IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgZGlkT3BlbkZpbGVTeXN0ZW0oY29u
c3QgU3RyaW5nJiBuYW1lLCBQYXNzT3duUHRyPEFzeW5jRmlsZVN5c3RlbT4pID0gMDsKIAogICAg
IC8vIENhbGxlZCB3aGVuIGEgZmlsZSBtZXRhZGF0YSBpcyByZWFkIHN1Y2Nlc3NmdWxseS4KLSAg
ICB2aXJ0dWFsIHZvaWQgZGlkUmVhZE1ldGFkYXRhKGRvdWJsZSBtb2RpZmljYXRpb25UaW1lKSA9
IDA7CisgICAgdmlydHVhbCB2b2lkIGRpZFJlYWRNZXRhZGF0YShjb25zdCBGaWxlTWV0YWRhdGEm
KSA9IDA7CiAKICAgICAvLyBDYWxsZWQgd2hlbiBhIGRpcmVjdG9yeSBlbnRyeSBpcyByZWFkLgog
ICAgIHZpcnR1YWwgdm9pZCBkaWRSZWFkRGlyZWN0b3J5RW50cnkoY29uc3QgU3RyaW5nJiBuYW1l
LCBib29sIGlzRGlyZWN0b3J5KSA9IDA7CkluZGV4OiBXZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9n
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cJKHJldmlzaW9uIDcwMTIy
KQorKysgV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsx
LDI3IEBACisyMDEwLTEwLTE5ICBFcmljIFVocmhhbmUgIDxlcmljdUBjaHJvbWl1bS5vcmc+CisK
KyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0Nocm9taXVt
XSBpbXBsZW1lbnRhdGlvbiBvZiBhc3luYyBGaWxlV3JpdGVyIGZvciB3b3JrZXJzCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NzY4MQorCisgICAgICAg
IFRlc3RzIGFyZSBpbiBhIHNlcGFyYXRlIGNoYW5nZWxpc3QuCisKKyAgICAgICAgQWRkZWQgbmV3
IGZpbGVzLgorICAgICAgICAqIFdlYktpdC5neXA6CisKKyAgICAgICAgR2V0dGluZyB0aGUgbWV0
YWRhdGEgbm93IHJldHVybnMgYSBGaWxlTWV0YWRhdGEgb2JqZWN0IGluc3RlYWQgb2YganVzdCBh
IG1vZGlmaWNhdGlvbiB0aW1lLgorICAgICAgICAqIHNyYy9XZWJGaWxlU3lzdGVtQ2FsbGJhY2tz
SW1wbC5jcHA6CisgICAgICAgIChXZWJLaXQ6OldlYkZpbGVTeXN0ZW1DYWxsYmFja3NJbXBsOjpk
aWRSZWFkTWV0YWRhdGEpOgorCisgICAgICAgICogc3JjL1dvcmtlckFzeW5jRmlsZVN5c3RlbUNo
cm9taXVtLmNwcDogQWRkZWQgV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0gY29uc3RydWN0
aW9uLgorICAgICAgICAqIHNyYy9Xb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5jcHA6IEFk
ZGVkLgorICAgICAgICAqIHNyYy9Xb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5oOiBBZGRl
ZC4KKworICAgICAgICBUaGlzIGNsYXNzIGJyaWRnZXMgYmV0d2VlbiB0aGUgY29udGV4dCBhbmQg
bWFpbiB0aHJlYWRzIGZvciB0aGUgV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uCisgICAg
ICAgICogc3JjL1dvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuY3BwOiBBZGRlZC4KKyAg
ICAgICAgKiBzcmMvV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5oOiBBZGRlZC4KKwog
MjAxMC0xMC0xOSAgVG9ueSBDaGFuZyAgPHRvbnlAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJl
dmlld2VkIGJ5IEtlbnQgVGFtdXJhLgpJbmRleDogV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAJKHJldmlzaW9uIDcwMDEz
KQorKysgV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAJKHdvcmtpbmcgY29weSkKQEAgLTE1Myw3
ICsxNTMsNyBAQAogICAgICAgICAgICAgICAgICdwdWJsaWMvV2ViRmlsZUNob29zZXJDb21wbGV0
aW9uLmgnLAogICAgICAgICAgICAgICAgICdwdWJsaWMvV2ViRmlsZUNob29zZXJQYXJhbXMuaCcs
CiAgICAgICAgICAgICAgICAgJ3B1YmxpYy9XZWJGaWxlRXJyb3IuaCcsCi0gICAgICAgICAgICAg
ICAgJ3B1YmxpYy9XZWJGaWxlSW5mby5oJywKKyAgICAgICAgICAgICAgICAncHVibGljL1dlYkZp
bGVNZXRhZGF0YS5oJywKICAgICAgICAgICAgICAgICAncHVibGljL1dlYkZpbGVTeXN0ZW0uaCcs
CiAgICAgICAgICAgICAgICAgJ3B1YmxpYy9XZWJGaWxlU3lzdGVtQ2FsbGJhY2tzLmgnLAogICAg
ICAgICAgICAgICAgICdwdWJsaWMvV2ViRmlsZVN5c3RlbUVudHJ5LmgnLApAQCAtNTQwLDggKzU0
MCwxMiBAQAogICAgICAgICAgICAgICAgICdzcmMvV2ViV29ya2VySW1wbC5oJywKICAgICAgICAg
ICAgICAgICAnc3JjL1dvcmtlckFzeW5jRmlsZVN5c3RlbUNocm9taXVtLmNwcCcsCiAgICAgICAg
ICAgICAgICAgJ3NyYy9Xb3JrZXJBc3luY0ZpbGVTeXN0ZW1DaHJvbWl1bS5oJywKKyAgICAgICAg
ICAgICAgICAnc3JjL1dvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtLmNwcCcsCisgICAgICAg
ICAgICAgICAgJ3NyYy9Xb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5oJywKICAgICAgICAg
ICAgICAgICAnc3JjL1dvcmtlckZpbGVTeXN0ZW1DYWxsYmFja3NCcmlkZ2UuY3BwJywKICAgICAg
ICAgICAgICAgICAnc3JjL1dvcmtlckZpbGVTeXN0ZW1DYWxsYmFja3NCcmlkZ2UuaCcsCisgICAg
ICAgICAgICAgICAgJ3NyYy9Xb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmNwcCcsCisg
ICAgICAgICAgICAgICAgJ3NyYy9Xb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmgnLAog
ICAgICAgICAgICAgICAgICdzcmMvV3JhcHBlZFJlc291cmNlUmVxdWVzdC5oJywKICAgICAgICAg
ICAgICAgICAnc3JjL1dyYXBwZWRSZXNvdXJjZVJlc3BvbnNlLmgnLAogICAgICAgICAgICAgICAg
ICdzcmMvd2luL1dlYklucHV0RXZlbnRGYWN0b3J5LmNwcCcsCkluZGV4OiBXZWJLaXQvY2hyb21p
dW0vc3JjL1dlYkZpbGVTeXN0ZW1DYWxsYmFja3NJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJL
aXQvY2hyb21pdW0vc3JjL1dlYkZpbGVTeXN0ZW1DYWxsYmFja3NJbXBsLmNwcAkocmV2aXNpb24g
NzAwMTMpCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYkZpbGVTeXN0ZW1DYWxsYmFja3NJbXBs
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzQsNiArMzQsNyBAQAogCiAjaW5jbHVkZSAiQXN5bmNG
aWxlU3lzdGVtQ2FsbGJhY2tzLmgiCiAjaW5jbHVkZSAiQXN5bmNGaWxlU3lzdGVtQ2hyb21pdW0u
aCIKKyNpbmNsdWRlICJGaWxlTWV0YWRhdGEuaCIKICNpbmNsdWRlICJTY3JpcHRFeGVjdXRpb25D
b250ZXh0LmgiCiAjaW5jbHVkZSAiV2ViRmlsZVN5c3RlbUVudHJ5LmgiCiAjaW5jbHVkZSAiV2Vi
RmlsZUluZm8uaCIKQEAgLTYzLDkgKzY0LDIzIEBAIHZvaWQgV2ViRmlsZVN5c3RlbUNhbGxiYWNr
c0ltcGw6OmRpZFN1Y2MKICAgICBkZWxldGUgdGhpczsKIH0KIAotdm9pZCBXZWJGaWxlU3lzdGVt
Q2FsbGJhY2tzSW1wbDo6ZGlkUmVhZE1ldGFkYXRhKGNvbnN0IFdlYkZpbGVJbmZvJiBpbmZvKQor
dm9pZCBXZWJGaWxlU3lzdGVtQ2FsbGJhY2tzSW1wbDo6ZGlkUmVhZE1ldGFkYXRhKGNvbnN0IFdl
YkZpbGVJbmZvJiB3ZWJGaWxlSW5mbykKIHsKLSAgICBtX2NhbGxiYWNrcy0+ZGlkUmVhZE1ldGFk
YXRhKGluZm8ubW9kaWZpY2F0aW9uVGltZSk7CisgICAgRmlsZU1ldGFkYXRhIGZpbGVNZXRhZGF0
YTsKKyAgICBmaWxlTWV0YWRhdGEubW9kaWZpY2F0aW9uVGltZSA9IHdlYkZpbGVJbmZvLm1vZGlm
aWNhdGlvblRpbWU7CisgICAgZmlsZU1ldGFkYXRhLmxlbmd0aCA9IHdlYkZpbGVJbmZvLmxlbmd0
aDsKKyAgICBzd2l0Y2ggKHdlYkZpbGVJbmZvLnR5cGUpIHsKKyAgICBjYXNlIFdlYkZpbGVJbmZv
OjpUeXBlRGlyZWN0b3J5OgorICAgICAgICBmaWxlTWV0YWRhdGEudHlwZSA9IEZpbGVNZXRhZGF0
YTo6VHlwZURpcmVjdG9yeTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXZWJGaWxlSW5mbzo6
VHlwZUZpbGU6CisgICAgICAgIGZpbGVNZXRhZGF0YS50eXBlID0gRmlsZU1ldGFkYXRhOjpUeXBl
RmlsZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZmlsZU1ldGFkYXRh
LnR5cGUgPSBGaWxlTWV0YWRhdGE6OlR5cGVVbmtub3duOworICAgICAgICBicmVhazsKKyAgICB9
CisgICAgbV9jYWxsYmFja3MtPmRpZFJlYWRNZXRhZGF0YShmaWxlTWV0YWRhdGEpOwogICAgIGRl
bGV0ZSB0aGlzOwogfQogCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckFzeW5jRmls
ZVN5c3RlbUNocm9taXVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dv
cmtlckFzeW5jRmlsZVN5c3RlbUNocm9taXVtLmNwcAkocmV2aXNpb24gNzAwMTMpCisrKyBXZWJL
aXQvY2hyb21pdW0vc3JjL1dvcmtlckFzeW5jRmlsZVN5c3RlbUNocm9taXVtLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMzUsMTIgKzM1LDE1IEBACiAKICNpbmNsdWRlICJBc3luY0ZpbGVTeXN0ZW1D
YWxsYmFja3MuaCIKKyNpbmNsdWRlICJGaWxlTWV0YWRhdGEuaCIKICNpbmNsdWRlICJGaWxlU3lz
dGVtLmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlICJXZWJGaWxlU3lz
dGVtLmgiCiAjaW5jbHVkZSAiV2ViRmlsZVN5c3RlbUNhbGxiYWNrc0ltcGwuaCIKKyNpbmNsdWRl
ICJXZWJGaWxlV3JpdGVyLmgiCiAjaW5jbHVkZSAiV2ViS2l0LmgiCiAjaW5jbHVkZSAiV2ViS2l0
Q2xpZW50LmgiCiAjaW5jbHVkZSAiV2ViV29ya2VyQmFzZS5oIgorI2luY2x1ZGUgIldvcmtlckFz
eW5jRmlsZVdyaXRlckNocm9taXVtLmgiCiAjaW5jbHVkZSAiV29ya2VyQ29udGV4dC5oIgogI2lu
Y2x1ZGUgIldvcmtlckZpbGVTeXN0ZW1DYWxsYmFja3NCcmlkZ2UuaCIKICNpbmNsdWRlICJXb3Jr
ZXJTY3JpcHRDb250cm9sbGVyLmgiCkBAIC0xMzQsOSArMTM3LDc2IEBAIHZvaWQgV29ya2VyQXN5
bmNGaWxlU3lzdGVtQ2hyb21pdW06OnJlYWQKICAgICBjcmVhdGVXb3JrZXJGaWxlU3lzdGVtQ2Fs
bGJhY2tzQnJpZGdlKGNhbGxiYWNrcyktPnBvc3RSZWFkRGlyZWN0b3J5VG9NYWluVGhyZWFkKG1f
d2ViRmlsZVN5c3RlbSwgcGF0aCwgbV9tb2RlRm9yQ3VycmVudE9wZXJhdGlvbik7CiB9CiAKLXZv
aWQgV29ya2VyQXN5bmNGaWxlU3lzdGVtQ2hyb21pdW06OmNyZWF0ZVdyaXRlcihBc3luY0ZpbGVX
cml0ZXJDbGllbnQqLCBjb25zdCBTdHJpbmcmLCBQYXNzT3duUHRyPEFzeW5jRmlsZVN5c3RlbUNh
bGxiYWNrcz4pCitjbGFzcyBXb3JrZXJGaWxlV3JpdGVySGVscGVyQ2FsbGJhY2tzIDogcHVibGlj
IEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrcyB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NPd25Q
dHI8V29ya2VyRmlsZVdyaXRlckhlbHBlckNhbGxiYWNrcz4gY3JlYXRlKEFzeW5jRmlsZVdyaXRl
ckNsaWVudCogY2xpZW50LCBjb25zdCBTdHJpbmcmIHBhdGgsIFdlYktpdDo6V2ViRmlsZVN5c3Rl
bSogd2ViRmlsZVN5c3RlbSwgUGFzc093blB0cjxXZWJDb3JlOjpBc3luY0ZpbGVTeXN0ZW1DYWxs
YmFja3M+IGNhbGxiYWNrcywgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiBhZG9wdFB0cihuZXcgV29ya2VyRmlsZVdyaXRlckhlbHBlckNhbGxiYWNr
cyhjbGllbnQsIHBhdGgsIHdlYkZpbGVTeXN0ZW0sIGNhbGxiYWNrcywgd29ya2VyQ29udGV4dCkp
OworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBkaWRTdWNjZWVkKCkKKyAgICB7CisgICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBkaWRSZWFk
TWV0YWRhdGEoY29uc3QgRmlsZU1ldGFkYXRhJiBtZXRhZGF0YSkKKyAgICB7CisgICAgICAgIEFT
U0VSVChtX2NhbGxiYWNrcyk7CisgICAgICAgIGlmIChtZXRhZGF0YS50eXBlICE9IEZpbGVNZXRh
ZGF0YTo6VHlwZUZpbGUgfHwgbWV0YWRhdGEubGVuZ3RoIDwgMCkKKyAgICAgICAgICAgIG1fY2Fs
bGJhY2tzLT5kaWRGYWlsKFdlYktpdDo6V2ViRmlsZUVycm9ySW52YWxpZFN0YXRlKTsKKyAgICAg
ICAgZWxzZSB7CisgICAgICAgICAgICBPd25QdHI8V29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21p
dW0+IGFzeW5jRmlsZVdyaXRlckNocm9taXVtID0gYWRvcHRQdHIobmV3IFdvcmtlckFzeW5jRmls
ZVdyaXRlckNocm9taXVtKG1fd2ViRmlsZVN5c3RlbSwgbV9wYXRoLCBtX3dvcmtlckNvbnRleHQs
IG1fY2xpZW50LCBmYWxzZSkpOworICAgICAgICAgICAgbV9jYWxsYmFja3MtPmRpZENyZWF0ZUZp
bGVXcml0ZXIoYXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0ucmVsZWFzZSgpLCBtZXRhZGF0YS5sZW5n
dGgpOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGRpZFJlYWREaXJlY3Rv
cnlFbnRyeShjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wgaXNEaXJlY3RvcnkpCisgICAgeworICAg
ICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlk
UmVhZERpcmVjdG9yeUVudHJpZXMoYm9vbCBoYXNNb3JlKQorICAgIHsKKyAgICAgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGRpZE9wZW5GaWxlU3lz
dGVtKGNvbnN0IFN0cmluZyYsIFBhc3NPd25QdHI8QXN5bmNGaWxlU3lzdGVtPikKKyAgICB7Cisg
ICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KKworICAgIC8vIENhbGxlZCB3aGVu
IGFuIEFzeW5jRmlsZVdydGVyIGhhcyBiZWVuIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgIHZp
cnR1YWwgdm9pZCBkaWRDcmVhdGVGaWxlV3JpdGVyKFBhc3NPd25QdHI8QXN5bmNGaWxlV3JpdGVy
PiwgbG9uZyBsb25nKQorICAgIHsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAg
fQorCisgICAgdmlydHVhbCB2b2lkIGRpZEZhaWwoaW50IGNvZGUpCisgICAgeworICAgICAgICBB
U1NFUlQobV9jYWxsYmFja3MpOworICAgICAgICBtX2NhbGxiYWNrcy0+ZGlkRmFpbChjb2RlKTsK
KyAgICB9CisKK3ByaXZhdGU6CisgICAgV29ya2VyRmlsZVdyaXRlckhlbHBlckNhbGxiYWNrcyhB
c3luY0ZpbGVXcml0ZXJDbGllbnQqIGNsaWVudCwgY29uc3QgU3RyaW5nJiBwYXRoLCBXZWJLaXQ6
OldlYkZpbGVTeXN0ZW0qIHdlYkZpbGVTeXN0ZW0sIFBhc3NPd25QdHI8V2ViQ29yZTo6QXN5bmNG
aWxlU3lzdGVtQ2FsbGJhY2tzPiBjYWxsYmFja3MsIFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRl
eHQpCisgICAgICAgIDogbV9jbGllbnQoY2xpZW50KQorICAgICAgICAsIG1fcGF0aChwYXRoKQor
ICAgICAgICAsIG1fd2ViRmlsZVN5c3RlbSh3ZWJGaWxlU3lzdGVtKQorICAgICAgICAsIG1fY2Fs
bGJhY2tzKGNhbGxiYWNrcykKKyAgICAgICAgLCBtX3dvcmtlckNvbnRleHQod29ya2VyQ29udGV4
dCkKKyAgICB7CisgICAgfQorCisgICAgQXN5bmNGaWxlV3JpdGVyQ2xpZW50KiBtX2NsaWVudDsK
KyAgICBTdHJpbmcgbV9wYXRoOworICAgIFdlYktpdDo6V2ViRmlsZVN5c3RlbSogbV93ZWJGaWxl
U3lzdGVtOworICAgIE93blB0cjxXZWJDb3JlOjpBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3M+IG1f
Y2FsbGJhY2tzOworICAgIFdvcmtlckNvbnRleHQqIG1fd29ya2VyQ29udGV4dDsKK307CisKK3Zv
aWQgV29ya2VyQXN5bmNGaWxlU3lzdGVtQ2hyb21pdW06OmNyZWF0ZVdyaXRlcihBc3luY0ZpbGVX
cml0ZXJDbGllbnQqIGNsaWVudCwgY29uc3QgU3RyaW5nJiBwYXRoLCBQYXNzT3duUHRyPEFzeW5j
RmlsZVN5c3RlbUNhbGxiYWNrcz4gY2FsbGJhY2tzKQogewotICAgIG5vdEltcGxlbWVudGVkKCk7
CisgICAgY3JlYXRlV29ya2VyRmlsZVN5c3RlbUNhbGxiYWNrc0JyaWRnZShXb3JrZXJGaWxlV3Jp
dGVySGVscGVyQ2FsbGJhY2tzOjpjcmVhdGUoY2xpZW50LCBwYXRoLCBtX3dlYkZpbGVTeXN0ZW0s
IGNhbGxiYWNrcywgbV93b3JrZXJDb250ZXh0KSktPnBvc3RSZWFkTWV0YWRhdGFUb01haW5UaHJl
YWQobV93ZWJGaWxlU3lzdGVtLCBwYXRoLCBtX21vZGVGb3JDdXJyZW50T3BlcmF0aW9uKTsKIH0K
IAogUGFzc1JlZlB0cjxXb3JrZXJGaWxlU3lzdGVtQ2FsbGJhY2tzQnJpZGdlPiBXb3JrZXJBc3lu
Y0ZpbGVTeXN0ZW1DaHJvbWl1bTo6Y3JlYXRlV29ya2VyRmlsZVN5c3RlbUNhbGxiYWNrc0JyaWRn
ZShQYXNzT3duUHRyPEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrcz4gY2FsbGJhY2tzKQpJbmRleDog
V2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJv
bWl1bS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckFzeW5j
RmlsZVdyaXRlckNocm9taXVtLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw5MiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBk
aXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5v
ciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRo
b3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JT
CisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIg
T1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICog
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5o
IgorCisjaWYgRU5BQkxFKEZJTEVfU1lTVEVNKQorCisjaW5jbHVkZSAiQXN5bmNGaWxlU3lzdGVt
LmgiCisjaW5jbHVkZSAiQXN5bmNGaWxlV3JpdGVyQ2xpZW50LmgiCisjaW5jbHVkZSAiQmxvYi5o
IgorI2luY2x1ZGUgIlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQuaCIKKyNpbmNsdWRlICJXZWJGaWxl
U3lzdGVtLmgiCisjaW5jbHVkZSAiV2ViRmlsZVdyaXRlci5oIgorI2luY2x1ZGUgIldlYlVSTC5o
IgorI2luY2x1ZGUgIldlYldvcmtlckJhc2UuaCIKKyNpbmNsdWRlICJXb3JrZXJDb250ZXh0Lmgi
CisjaW5jbHVkZSAiV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5oIgorI2luY2x1ZGUg
IldvcmtlckxvYWRlclByb3h5LmgiCisjaW5jbHVkZSAiV29ya2VyVGhyZWFkLmgiCisKK3VzaW5n
IG5hbWVzcGFjZSBXZWJLaXQ7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIGNvbnN0
IGNoYXIgZmlsZVdyaXRlck9wZXJhdGlvbnNNb2RlW10gPSAiZmlsZVdyaXRlck9wZXJhdGlvbnNN
b2RlIjsKKworV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW06OldvcmtlckFzeW5jRmlsZVdy
aXRlckNocm9taXVtKFdlYkZpbGVTeXN0ZW0qIHdlYkZpbGVTeXN0ZW0sIGNvbnN0IFN0cmluZyYg
cGF0aCwgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCwgQXN5bmNGaWxlV3JpdGVyQ2xpZW50
KiBjbGllbnQsIGJvb2wgc3luY2hyb25vdXMpCisgICAgOiBtX3N5bmNocm9ub3VzKHN5bmNocm9u
b3VzKQoreworICAgIEFTU0VSVCghc3luY2hyb25vdXMpOyAvLyBOb3QgaW1wbGVtZW50ZWQgeWV0
LgorCisgICAgV29ya2VyTG9hZGVyUHJveHkqIHByb3h5ID0gJndvcmtlckNvbnRleHQtPnRocmVh
ZCgpLT53b3JrZXJMb2FkZXJQcm94eSgpOworICAgIG1fYnJpZGdlID0gV29ya2VyRmlsZVdyaXRl
ckNhbGxiYWNrc0JyaWRnZTo6Y3JlYXRlKHBhdGgsIHByb3h5LCB3b3JrZXJDb250ZXh0LCBjbGll
bnQpOworfQorCitXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bTo6fldvcmtlckFzeW5jRmls
ZVdyaXRlckNocm9taXVtKCkKK3sKKyAgICBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdl
KiBicmlkZ2UgPSBtX2JyaWRnZS5nZXQoKTsKKyAgICBicmlkZ2UtPnBvc3RTaHV0ZG93blRvTWFp
blRocmVhZChtX2JyaWRnZS5yZWxlYXNlKCkpOworfQorCitXZWJGaWxlV3JpdGVyQ2xpZW50KiBX
b3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bTo6Z2V0TWFpblRocmVhZENsaWVudCgpCit7Cisg
ICAgcmV0dXJuIG1fYnJpZGdlLmdldCgpOworfQorCit2b2lkIFdvcmtlckFzeW5jRmlsZVdyaXRl
ckNocm9taXVtOjp3cml0ZShsb25nIGxvbmcgcG9zaXRpb24sIEJsb2IqIGRhdGEpCit7CisgICAg
bV9icmlkZ2UtPnBvc3RXcml0ZVRvTWFpblRocmVhZChwb3NpdGlvbiwgV2ViS2l0OjpXZWJVUkwo
ZGF0YS0+dXJsKCkpKTsKK30KKwordm9pZCBXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bTo6
dHJ1bmNhdGUobG9uZyBsb25nIGxlbmd0aCkKK3sKKyAgICBtX2JyaWRnZS0+cG9zdFRydW5jYXRl
VG9NYWluVGhyZWFkKGxlbmd0aCk7Cit9CisKK3ZvaWQgV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hy
b21pdW06OmFib3J0KCkKK3sKKyAgICBtX2JyaWRnZS0+cG9zdEFib3J0VG9NYWluVGhyZWFkKCk7
Cit9CisKK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBFTkFCTEUoRklMRV9TWVNURU0pCklu
ZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtLmgK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJBc3luY0ZpbGVXcml0ZXJD
aHJvbWl1bS5oCShyZXZpc2lvbiAwKQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJBc3lu
Y0ZpbGVXcml0ZXJDaHJvbWl1bS5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDc2IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICog
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRp
c3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9y
IHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNl
IG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhv
dXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMK
KyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBP
UiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRl
ZiBXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bV9oCisjZGVmaW5lIFdvcmtlckFzeW5jRmls
ZVdyaXRlckNocm9taXVtX2gKKworI2lmIEVOQUJMRShGSUxFX1NZU1RFTSkKKworI2luY2x1ZGUg
IkFzeW5jRmlsZVdyaXRlci5oIgorI2luY2x1ZGUgIldlYkZpbGVFcnJvci5oIgorI2luY2x1ZGUg
IldlYkZpbGVXcml0ZXJDbGllbnQuaCIKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVk
ZSA8d3RmL1Bhc3NPd25QdHIuaD4KKworbmFtZXNwYWNlIFdlYktpdCB7CitjbGFzcyBXZWJGaWxl
U3lzdGVtOworY2xhc3MgV2ViRmlsZVdyaXRlcjsKK2NsYXNzIFdvcmtlckZpbGVXcml0ZXJDYWxs
YmFja3NCcmlkZ2U7Cit9CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQXN5bmNGaWxl
U3lzdGVtOworY2xhc3MgQXN5bmNGaWxlV3JpdGVyQ2xpZW50OworY2xhc3MgQmxvYjsKK2NsYXNz
IFdvcmtlckNvbnRleHQ7CisKK2NsYXNzIFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtIDog
cHVibGljIEFzeW5jRmlsZVdyaXRlciB7CitwdWJsaWM6CisgICAgV29ya2VyQXN5bmNGaWxlV3Jp
dGVyQ2hyb21pdW0oV2ViS2l0OjpXZWJGaWxlU3lzdGVtKiwgY29uc3QgU3RyaW5nJiBwYXRoLCBX
b3JrZXJDb250ZXh0KiwgQXN5bmNGaWxlV3JpdGVyQ2xpZW50KiwgYm9vbCBzeW5jaHJvbm91cyk7
CisgICAgfldvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtKCk7CisgICAgCisgICAgV2ViS2l0
OjpXZWJGaWxlV3JpdGVyQ2xpZW50KiBnZXRNYWluVGhyZWFkQ2xpZW50KCk7CisKKyAgICAvLyBG
aWxlV3JpdGVyCisgICAgdmlydHVhbCB2b2lkIHdyaXRlKGxvbmcgbG9uZyBwb3NpdGlvbiwgQmxv
YiogZGF0YSk7CisgICAgdmlydHVhbCB2b2lkIHRydW5jYXRlKGxvbmcgbG9uZyBsZW5ndGgpOwor
ICAgIHZpcnR1YWwgdm9pZCBhYm9ydCgpOworCitwcml2YXRlOgorICAgIFJlZlB0cjxXZWJLaXQ6
OldvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+IG1fYnJpZGdlOworICAgIGJvb2wgbV9z
eW5jaHJvbm91czsKK307CisKK30gLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBFTkFCTEUoRklM
RV9TWVNURU0pCisKKyNlbmRpZiAvLyBBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bV9oCkluZGV4OiBX
ZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2VyRmlsZVdyaXRlckNhbGxiYWNr
c0JyaWRnZS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckZp
bGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDIxNSBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAq
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0
aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
CisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJ
bmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8g
ZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2Fy
ZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJ
QlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICog
T1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tz
QnJpZGdlLmgiCisKKyNpZiBFTkFCTEUoRklMRV9TWVNURU0pCisKKyNpbmNsdWRlICJBc3luY0Zp
bGVXcml0ZXJDbGllbnQuaCIKKyNpbmNsdWRlICJDcm9zc1RocmVhZFRhc2suaCIKKyNpbmNsdWRl
ICJXZWJDU3RyaW5nLmgiCisjaW5jbHVkZSAiV2ViRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgIldl
YkZpbGVXcml0ZXIuaCIKKyNpbmNsdWRlICJXZWJLaXQuaCIKKyNpbmNsdWRlICJXZWJLaXRDbGll
bnQuaCIKKyNpbmNsdWRlICJXZWJXb3JrZXJCYXNlLmgiCisjaW5jbHVkZSAiV29ya2VyQ29udGV4
dC5oIgorI2luY2x1ZGUgIldvcmtlckxvYWRlclByb3h5LmgiCisjaW5jbHVkZSAiV29ya2VyVGhy
ZWFkLmgiCisjaW5jbHVkZSA8d3RmL01haW5UaHJlYWQuaD4KKyNpbmNsdWRlIDx3dGYvVGhyZWFk
aW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQ3Jvc3NU
aHJlYWRDb3BpZXJCYXNlPGZhbHNlLCBmYWxzZSwgV2ViS2l0OjpXZWJVUkw+IHsKKyAgICB0eXBl
ZGVmIFdlYktpdDo6V2ViVVJMIFR5cGU7CisgICAgc3RhdGljIFR5cGUgY29weShjb25zdCBXZWJL
aXQ6OldlYlVSTCYgdXJsKQorICAgIHsKKyAgICAgICAgV2ViS2l0OjpXZWJDU3RyaW5nIHNwZWM7
CisgICAgICAgIHNwZWMuYXNzaWduKHVybC5zcGVjKCkuZGF0YSgpLCB1cmwuc3BlYygpLmxlbmd0
aCgpKTsKKyAgICAgICAgY29uc3QgdXJsX3BhcnNlOjpQYXJzZWQmIHBhcnNlZCA9IHVybC5wYXJz
ZWQoKTsKKyAgICAgICAgYm9vbCBpc1ZhbGlkID0gdXJsLmlzVmFsaWQoKTsKKworICAgICAgICBy
ZXR1cm4gV2ViS2l0OjpXZWJVUkwoc3BlYywgcGFyc2VkLCBpc1ZhbGlkKTsKKyAgICB9Cit9Owor
Cit0ZW1wbGF0ZTw+IHN0cnVjdCBDcm9zc1RocmVhZENvcGllckJhc2U8ZmFsc2UsIGZhbHNlLCBQ
YXNzUmVmUHRyPFdlYktpdDo6V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gPiB7Cisg
ICAgdHlwZWRlZiBQYXNzUmVmUHRyPFdlYktpdDo6V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0Jy
aWRnZT4gVHlwZTsKKyAgICBzdGF0aWMgVHlwZSBjb3B5KGNvbnN0IFBhc3NSZWZQdHI8V2ViS2l0
OjpXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlPiYgYnJpZGdlKQorICAgIHsKKyAgICAg
ICAgVHlwZSBuZXdSZWYoYnJpZGdlLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIG5ld1JlZjsKKyAg
ICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJD
b3JlOworCituYW1lc3BhY2UgV2ViS2l0IHsKKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJh
Y2tzQnJpZGdlOjpub3RpZnlTdG9wKCkKK3sKKyAgICBBU1NFUlQobV93b3JrZXJDb250ZXh0LT5p
c0NvbnRleHRUaHJlYWQoKSk7CisgICAgbV9jbGllbnRPbldvcmtlclRocmVhZCA9IDA7Cit9CisK
K3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6cG9zdFdyaXRlVG9NYWluVGhy
ZWFkKGxvbmcgbG9uZyBwb3NpdGlvbiwgY29uc3QgV2ViVVJMJiBkYXRhKQoreworICAgIGRpc3Bh
dGNoVGFza1RvTWFpblRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJndyaXRlT25NYWluVGhyZWFk
LCB0aGlzLCBwb3NpdGlvbiwgZGF0YSkpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxs
YmFja3NCcmlkZ2U6OnBvc3RUcnVuY2F0ZVRvTWFpblRocmVhZChsb25nIGxvbmcgbGVuZ3RoKQor
eworICAgIGRpc3BhdGNoVGFza1RvTWFpblRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJnRydW5j
YXRlT25NYWluVGhyZWFkLCB0aGlzLCBsZW5ndGgpKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3Jp
dGVyQ2FsbGJhY2tzQnJpZGdlOjpwb3N0QWJvcnRUb01haW5UaHJlYWQoKQoreworICAgIGRpc3Bh
dGNoVGFza1RvTWFpblRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJmFib3J0T25NYWluVGhyZWFk
LCB0aGlzKSk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6cG9z
dFNodXRkb3duVG9NYWluVGhyZWFkKAorICAgICAgICBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0
ZXJDYWxsYmFja3NCcmlkZ2U+IGJyaWRnZSkKK3sKKyAgICBBU1NFUlQoIW1fY2xpZW50T25Xb3Jr
ZXJUaHJlYWQpOworICAgIGRpc3BhdGNoVGFza1RvTWFpblRocmVhZChjcmVhdGVDYWxsYmFja1Rh
c2soJnNodXRkb3duT25NYWluVGhyZWFkLCBicmlkZ2UpKTsKK30KKwordm9pZCBXb3JrZXJGaWxl
V3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjp3cml0ZU9uTWFpblRocmVhZChTY3JpcHRFeGVjdXRpb25D
b250ZXh0KiwgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlPiBicmlk
Z2UsIGxvbmcgbG9uZyBwb3NpdGlvbiwgY29uc3QgV2ViVVJMJiBkYXRhKQoreworICAgIGJyaWRn
ZS0+bV93cml0ZXItPndyaXRlKHBvc2l0aW9uLCBkYXRhKTsKK30KKwordm9pZCBXb3JrZXJGaWxl
V3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjp0cnVuY2F0ZU9uTWFpblRocmVhZChTY3JpcHRFeGVjdXRp
b25Db250ZXh0KiwgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlPiBi
cmlkZ2UsIGxvbmcgbG9uZyBsZW5ndGgpCit7CisgICAgYnJpZGdlLT5tX3dyaXRlci0+dHJ1bmNh
dGUobGVuZ3RoKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjph
Ym9ydE9uTWFpblRocmVhZChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxXb3Jr
ZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlPiBicmlkZ2UpCit7CisgICAgYnJpZGdlLT5tX3dy
aXRlci0+Y2FuY2VsKCk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRn
ZTo6aW5pdE9uTWFpblRocmVhZChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxX
b3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlPiBicmlkZ2UsIGNvbnN0IFN0cmluZyYgcGF0
aCkKK3sKKyAgICBBU1NFUlQoIWJyaWRnZS0+bV93cml0ZXIpOworICAgIGJyaWRnZS0+bV93cml0
ZXIgPSBhZG9wdFB0cih3ZWJLaXRDbGllbnQoKS0+ZmlsZVN5c3RlbSgpLT5jcmVhdGVGaWxlV3Jp
dGVyKHBhdGgsIGJyaWRnZS5nZXQoKSkpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxs
YmFja3NCcmlkZ2U6OnNodXRkb3duT25NYWluVGhyZWFkKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQq
LCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+IGJyaWRnZSkKK3sK
KyAgICBicmlkZ2UtPm1fd3JpdGVyRGVsZXRlZCA9IHRydWU7CisgICAgYnJpZGdlLT5tX3dyaXRl
ci5jbGVhcigpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OmRp
ZFdyaXRlKGxvbmcgbG9uZyBieXRlcywgYm9vbCBjb21wbGV0ZSkKK3sKKyAgICBkaXNwYXRjaFRh
c2tUb1dvcmtlclRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJmRpZFdyaXRlT25Xb3JrZXJUaHJl
YWQsIHRoaXMsIGJ5dGVzLCBjb21wbGV0ZSkpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJD
YWxsYmFja3NCcmlkZ2U6OmRpZEZhaWwoV2ViRmlsZUVycm9yIGVycm9yKQoreworICAgIGRpc3Bh
dGNoVGFza1RvV29ya2VyVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmZGlkRmFpbE9uV29ya2Vy
VGhyZWFkLCB0aGlzLCBlcnJvcikpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFj
a3NCcmlkZ2U6OmRpZFRydW5jYXRlKCkKK3sKKyAgICBkaXNwYXRjaFRhc2tUb1dvcmtlclRocmVh
ZChjcmVhdGVDYWxsYmFja1Rhc2soJmRpZFRydW5jYXRlT25Xb3JrZXJUaHJlYWQsIHRoaXMpKTsK
K30KKworV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6V29ya2VyRmlsZVdyaXRlckNh
bGxiYWNrc0JyaWRnZShjb25zdCBTdHJpbmcmIHBhdGgsIFdvcmtlckxvYWRlclByb3h5KiBwcm94
eSwgU2NyaXB0RXhlY3V0aW9uQ29udGV4dCogc2NyaXB0RXhlY3V0aW9uQ29udGV4dCwgQXN5bmNG
aWxlV3JpdGVyQ2xpZW50KiBjbGllbnQpCisgICAgOiBXb3JrZXJDb250ZXh0OjpPYnNlcnZlcihz
dGF0aWNfY2FzdDxXb3JrZXJDb250ZXh0Kj4oc2NyaXB0RXhlY3V0aW9uQ29udGV4dCkpCisgICAg
LCBtX3Byb3h5KHByb3h5KQorICAgICwgbV93cml0ZXJEZWxldGVkKGZhbHNlKQorICAgICwgbV93
b3JrZXJDb250ZXh0KHNjcmlwdEV4ZWN1dGlvbkNvbnRleHQpCisgICAgLCBtX2NsaWVudE9uV29y
a2VyVGhyZWFkKGNsaWVudCkKK3sKKyAgICBBU1NFUlQobV93b3JrZXJDb250ZXh0LT5pc0NvbnRl
eHRUaHJlYWQoKSk7CisgICAgcG9zdEluaXRUb01haW5UaHJlYWQocGF0aCk7Cit9CisKK3ZvaWQg
V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6cG9zdEluaXRUb01haW5UaHJlYWQoY29u
c3QgU3RyaW5nJiBwYXRoKQoreworICAgIGRpc3BhdGNoVGFza1RvTWFpblRocmVhZChjcmVhdGVD
YWxsYmFja1Rhc2soJmluaXRPbk1haW5UaHJlYWQsIHRoaXMsIHBhdGgpKTsKK30KKworV29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6fldvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlk
Z2UoKQoreworICAgIEFTU0VSVCghbV9jbGllbnRPbldvcmtlclRocmVhZCk7CisgICAgQVNTRVJU
KCFtX3dyaXRlcik7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6
ZGlkV3JpdGVPbldvcmtlclRocmVhZChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgV29ya2VyRmls
ZVdyaXRlckNhbGxiYWNrc0JyaWRnZSogYnJpZGdlLCBsb25nIGxvbmcgbGVuZ3RoLCBib29sIGNv
bXBsZXRlKQoreworICAgIGJyaWRnZS0+bV9jbGllbnRPbldvcmtlclRocmVhZC0+ZGlkV3JpdGUo
bGVuZ3RoLCBjb21wbGV0ZSk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0Jy
aWRnZTo6ZGlkRmFpbE9uV29ya2VyVGhyZWFkKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBXb3Jr
ZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlKiBicmlkZ2UsIFdlYkZpbGVFcnJvciBlcnJvcikK
K3sKKyAgICBicmlkZ2UtPm1fY2xpZW50T25Xb3JrZXJUaHJlYWQtPmRpZEZhaWwoZXJyb3IpOwor
fQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OmRpZFRydW5jYXRlT25X
b3JrZXJUaHJlYWQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFdvcmtlckZpbGVXcml0ZXJDYWxs
YmFja3NCcmlkZ2UqIGJyaWRnZSkKK3sKKyAgICBicmlkZ2UtPm1fY2xpZW50T25Xb3JrZXJUaHJl
YWQtPmRpZFRydW5jYXRlKCk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0Jy
aWRnZTo6cnVuVGFza09uTWFpblRocmVhZChXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0
KiBzY3JpcHRFeGVjdXRpb25Db250ZXh0LCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxs
YmFja3NCcmlkZ2U+IGJyaWRnZSwgUGFzc093blB0cjxXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25D
b250ZXh0OjpUYXNrPiB0YXNrVG9SdW4pCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsK
KyAgICBpZiAoIWJyaWRnZS0+bV93cml0ZXJEZWxldGVkKQorICAgICAgICB0YXNrVG9SdW4tPnBl
cmZvcm1UYXNrKHNjcmlwdEV4ZWN1dGlvbkNvbnRleHQpOworfQorCit2b2lkIFdvcmtlckZpbGVX
cml0ZXJDYWxsYmFja3NCcmlkZ2U6OnJ1blRhc2tPbldvcmtlclRocmVhZChXZWJDb3JlOjpTY3Jp
cHRFeGVjdXRpb25Db250ZXh0KiBzY3JpcHRFeGVjdXRpb25Db250ZXh0LCBQYXNzUmVmUHRyPFdv
cmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+IGJyaWRnZSwgUGFzc093blB0cjxXZWJDb3Jl
OjpTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPiB0YXNrVG9SdW4pCit7CisgICAgQVNTRVJU
KGJyaWRnZS0+bV93b3JrZXJDb250ZXh0LT5pc0NvbnRleHRUaHJlYWQoKSk7CisgICAgaWYgKGJy
aWRnZS0+bV9jbGllbnRPbldvcmtlclRocmVhZCkKKyAgICAgICAgdGFza1RvUnVuLT5wZXJmb3Jt
VGFzayhzY3JpcHRFeGVjdXRpb25Db250ZXh0KTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVy
Q2FsbGJhY2tzQnJpZGdlOjpkaXNwYXRjaFRhc2tUb01haW5UaHJlYWQoUGFzc093blB0cjxXZWJD
b3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPiB0YXNrKQoreworICAgIEFTU0VSVCht
X3dvcmtlckNvbnRleHQtPmlzQ29udGV4dFRocmVhZCgpKTsKKyAgICBXZWJXb3JrZXJCYXNlOjpk
aXNwYXRjaFRhc2tUb01haW5UaHJlYWQoY3JlYXRlQ2FsbGJhY2tUYXNrKCZydW5UYXNrT25NYWlu
VGhyZWFkLCB0aGlzLCB0YXNrKSk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNr
c0JyaWRnZTo6ZGlzcGF0Y2hUYXNrVG9Xb3JrZXJUaHJlYWQoUGFzc093blB0cjxTY3JpcHRFeGVj
dXRpb25Db250ZXh0OjpUYXNrPiB0YXNrKQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7
CisgICAgbV9wcm94eS0+cG9zdFRhc2tGb3JNb2RlVG9Xb3JrZXJDb250ZXh0KGNyZWF0ZUNhbGxi
YWNrVGFzaygmcnVuVGFza09uV29ya2VyVGhyZWFkLCB0aGlzLCB0YXNrKSwgIiIpOworfQorCit9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBFTkFCTEUoRklMRV9TWVNURU0pCklu
ZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2Uu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckZpbGVXcml0ZXJDYWxs
YmFja3NCcmlkZ2UuaAkocmV2aXNpb24gMCkKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE0NiBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAq
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0
aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
CisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJ
bmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8g
ZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2Fy
ZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJ
QlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICog
T1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisK
KyNpZm5kZWYgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZV9oCisjZGVmaW5lIFdvcmtl
ckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2VfaAorCisjaWYgRU5BQkxFKEZJTEVfU1lTVEVNKQor
CisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJXZWJGaWxlRXJyb3IuaCIK
KyNpbmNsdWRlICJXZWJGaWxlV3JpdGVyQ2xpZW50LmgiCisjaW5jbHVkZSAiV29ya2VyQ29udGV4
dC5oIgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQ
dHIuaD4KKyNpbmNsdWRlIDx3dGYvVGhyZWFkaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
K2NsYXNzIEFzeW5jRmlsZVdyaXRlckNsaWVudDsKK2NsYXNzIFdvcmtlckxvYWRlclByb3h5Owor
fQorCituYW1lc3BhY2UgV2ViS2l0IHsKKworY2xhc3MgV2ViRmlsZVN5c3RlbTsKK2NsYXNzIFdl
YkZpbGVXcml0ZXI7CitjbGFzcyBXZWJGaWxlV3JpdGVyQ2xpZW50OworY2xhc3MgV2ViVVJMOwor
Y2xhc3MgV2ViV29ya2VyQmFzZTsKKworLy8gVGhpcyBjbGFzcyBpcyB1c2VkIGFzIGEgbWVjaGFu
aXNtIHRvIGJyaWRnZSBjYWxscyBiZXR3ZWVuIHRocmVhZHMuCisvLyBDYWxscyB0byBhIFdlYkZp
bGVXcml0ZXIgbXVzdCBoYXBwZW4gb24gdGhlIG1haW4gdGhyZWFkLCBidXQgdGhleSBjb21lIGZy
b20KKy8vIHRoZSBjb250ZXh0IHRocmVhZC4gIFRoZSByZXNwb25zZXMgdGhyb3VnaCB0aGUgV2Vi
RmlsZVdyaXRlckNsaWVudCBpbnRlcmZhY2UKKy8vIHN0YXJ0IG9uIHRoZSBtYWluIHRocmVhZCwg
YnV0IG11c3QgYmUgc2VudCB2aWEgdGhlIHdvcmtlciBjb250ZXh0IHRocmVhZC4KKy8vCisvLyBB
IHR5cGljYWwgZmxvdyBmb3Igd3JpdGUgd291bGQgbG9vayBsaWtlIHRoaXM6CisvLyBCcmlkZ2U6
OnBvc3RXcml0ZVRvTWFpblRocmVhZCgpIG9uIFdvcmtlclRocmVhZAorLy8gIC0tPiBCcmlkZ2U6
OndyaXRlT25NYWluVGhyZWFkKCkgaXMgY2FsbGVkIG9uIE1haW5UaHJlYWQKKy8vICAtLT4gV2Vi
RmlsZVdyaXRlcjo6d3JpdGUoKQorLy8gICAgICBUaGlzIG1ha2VzIGFuIElQQzsgdGhlIGFjdHVh
bCBvcGVyYXRpb24gaXMgZG93biBpbiB0aGUgYnJvd3Nlci4KKy8vICAtLT4gQnJpZGdlOjpkaWRX
cml0ZSBpcyBjYWxsZWQgb24gTWFpblRocmVhZAorLy8gIC0tPiBCcmlkZ2U6OmRpZFdyaXRlT25X
b3JrZXJUaHJlYWQgaXMgY2FsbGVkIG9uIFdvcmtlclRocmVhZAorLy8gICAgICBUaGlzIGNhbGxz
IHRoZSBvcmlnaW5hbCBjbGllbnQgKG1fY2xpZW50T25Xb3JrZXJUaHJlYWQpLgorY2xhc3MgV29y
a2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZSA6IHB1YmxpYyBUaHJlYWRTYWZlU2hhcmVkPFdv
cmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+LCBwdWJsaWMgV2ViQ29yZTo6V29ya2VyQ29u
dGV4dDo6T2JzZXJ2ZXIsIHB1YmxpYyBXZWJGaWxlV3JpdGVyQ2xpZW50IHsKK3B1YmxpYzoKKyAg
ICB+V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZSgpOworCisgICAgLy8gV29ya2VyQ29u
dGV4dDo6T2JzZXJ2ZXIgbWV0aG9kLgorICAgIHZpcnR1YWwgdm9pZCBub3RpZnlTdG9wKCk7CisK
KyAgICBzdGF0aWMgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlPiBj
cmVhdGUoY29uc3QgU3RyaW5nJiBwYXRoLCBXZWJDb3JlOjpXb3JrZXJMb2FkZXJQcm94eSogcHJv
eHksIFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIHdvcmtlckNvbnRleHQsIFdlYkNv
cmU6OkFzeW5jRmlsZVdyaXRlckNsaWVudCogY2xpZW50KQorICAgIHsKKyAgICAgICAgcmV0dXJu
IGFkb3B0UmVmKG5ldyBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlKHBhdGgsIHByb3h5
LCB3b3JrZXJDb250ZXh0LCBjbGllbnQpKTsKKyAgICB9CisKKyAgICAvLyBNZXRob2RzIHRoYXQg
Y3JlYXRlIGFuIGluc3RhbmNlIGFuZCBwb3N0IGFuIGluaXRpYWwgcmVxdWVzdCB0YXNrIHRvIHRo
ZSBtYWluIHRocmVhZC4gVGhleSBtdXN0IGJlIGNhbGxlZCBvbiB0aGUgd29ya2VyIHRocmVhZC4K
KyAgICB2b2lkIHBvc3RXcml0ZVRvTWFpblRocmVhZChsb25nIGxvbmcgcG9zaXRpb24sIGNvbnN0
IFdlYlVSTCYgZGF0YSk7CisgICAgdm9pZCBwb3N0VHJ1bmNhdGVUb01haW5UaHJlYWQobG9uZyBs
b25nIGxlbmd0aCk7CisgICAgdm9pZCBwb3N0QWJvcnRUb01haW5UaHJlYWQoKTsKKworICAgIC8v
IFRoZSBvd25pbmcgV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0gc2hvdWxkIHVzZSB0aGlz
IG1ldGhvZCB0byBnaXZlCisgICAgLy8gYXdheSBpdHMgbGFzdCByZWZlcmVuY2UgdG8gdGhlIGJy
aWRnZSBhdCBkZWxldGlvbiB0aW1lLCBvbiB0aGUgY29udGV4dAorICAgIC8vIHRocmVhZC4gIFlv
dSBtdXN0IGhhdmUgY2FsbGVkIHN0b3AoKSBiZWZvcmUgY2FsbGluZyB0aGlzLiAgVGhlIGFjdHVh
bAorICAgIC8vIGRlbGV0aW9uIG9mIHRoZSBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdl
IG1heSBoYXBwZW4gb24gZWl0aGVyIHRoZQorICAgIC8vIG1haW4gb3IgY29udGV4dCB0aHJlYWQs
IGRlcGVuZGluZyBvbiB3aGVyZSB0aGUgbGFzdCByZWZlcmVuY2UgZ29lcyBhd2F5OworICAgIC8v
IHRoYXQncyBzYWZlIGFzIGxvbmcgYXMgdGhpcyBpcyBjYWxsZWQgZmlyc3QuCisgICAgdm9pZCBw
b3N0U2h1dGRvd25Ub01haW5UaHJlYWQoUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2FsbGJh
Y2tzQnJpZGdlPik7CisKKyAgICAvLyBDYWxsYmFjayBtZXRob2RzIHRoYXQgYXJlIGNhbGxlZCBv
biB0aGUgbWFpbiB0aHJlYWQuCisgICAgLy8gVGhlc2UgYXJlIHRoZSBpbXBsZW1lbnRhdGlvbiBv
ZiBXZWJLaXQ6OldlYkZpbGVXcml0ZXJDbGllbnQuCisgICAgdm9pZCBkaWRXcml0ZShsb25nIGxv
bmcgYnl0ZXMsIGJvb2wgY29tcGxldGUpOworICAgIHZvaWQgZGlkRmFpbChXZWJGaWxlRXJyb3Ip
OworICAgIHZvaWQgZGlkVHJ1bmNhdGUoKTsKKworcHJpdmF0ZToKKyAgICBXb3JrZXJGaWxlV3Jp
dGVyQ2FsbGJhY2tzQnJpZGdlKGNvbnN0IFN0cmluZyYgcGF0aCwgV2ViQ29yZTo6V29ya2VyTG9h
ZGVyUHJveHkqLCBXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgV2ViQ29yZTo6QXN5
bmNGaWxlV3JpdGVyQ2xpZW50Kik7CisKKyAgICB2b2lkIHBvc3RJbml0VG9NYWluVGhyZWFkKGNv
bnN0IFN0cmluZyYgcGF0aCk7CisKKyAgICAvLyBNZXRob2RzIHRoYXQgYXJlIHRvIGJlIGNhbGxl
ZCBvbiB0aGUgbWFpbiB0aHJlYWQuCisgICAgc3RhdGljIHZvaWQgd3JpdGVPbk1haW5UaHJlYWQo
V2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdy
aXRlckNhbGxiYWNrc0JyaWRnZT4sIGxvbmcgbG9uZyBwb3NpdGlvbiwgY29uc3QgV2ViVVJMJiBk
YXRhKTsKKyAgICBzdGF0aWMgdm9pZCB0cnVuY2F0ZU9uTWFpblRocmVhZChXZWJDb3JlOjpTY3Jp
cHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tz
QnJpZGdlPiwgbG9uZyBsb25nIGxlbmd0aCk7CisgICAgc3RhdGljIHZvaWQgYWJvcnRPbk1haW5U
aHJlYWQoV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4pOworICAgIHN0YXRpYyB2b2lkIGluaXRPbk1haW5U
aHJlYWQoV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4sIGNvbnN0IFN0cmluZyYgcGF0aCk7CisgICAgc3Rh
dGljIHZvaWQgc2h1dGRvd25Pbk1haW5UaHJlYWQoV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29u
dGV4dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4pOworCisg
ICAgLy8gTWV0aG9kcyB0aGF0IGRpc3BhdGNoIHRvIEFzeW5jRmlsZVdyaXRlckNsaWVudCBvbiB0
aGUgd29ya2VyIHRocmVhZHMuCisgICAgLy8gVGhleSByZWxlYXNlIGEgc2VsZlJlZiBvZiB0aGUg
V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS4KKyAgICBzdGF0aWMgdm9pZCBkaWRXcml0
ZU9uV29ya2VyVGhyZWFkKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBXb3JrZXJG
aWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlKiwgbG9uZyBsb25nIGxlbmd0aCwgYm9vbCBjb21wbGV0
ZSk7CisgICAgc3RhdGljIHZvaWQgZGlkRmFpbE9uV29ya2VyVGhyZWFkKFdlYkNvcmU6OlNjcmlw
dEV4ZWN1dGlvbkNvbnRleHQqLCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlKiwgV2Vi
RmlsZUVycm9yKTsKKyAgICBzdGF0aWMgdm9pZCBkaWRUcnVuY2F0ZU9uV29ya2VyVGhyZWFkKFdl
YkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tz
QnJpZGdlKik7CisKKyAgICAvLyBMYXp5IGluaXRpYWxpemF0aW9uIG9mIHRoZSBXZWJGaWxlV3Jp
dGVyLgorICAgIHZvaWQgaW5pdFdlYkZpbGVXcml0ZXIoKTsKKyAgICBzdGF0aWMgdm9pZCBydW5U
YXNrT25NYWluVGhyZWFkKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVm
UHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+LCBQYXNzT3duUHRyPFdlYkNvcmU6
OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2s+KTsKKyAgICBzdGF0aWMgdm9pZCBydW5UYXNr
T25Xb3JrZXJUaHJlYWQoV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQ
dHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4sIFBhc3NPd25QdHI8V2ViQ29yZTo6
U2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6VGFzaz4pOworCisgICAgdm9pZCBkaXNwYXRjaFRhc2tU
b01haW5UaHJlYWQoUGFzc093blB0cjxXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpU
YXNrPik7CisgICAgdm9pZCBkaXNwYXRjaFRhc2tUb1dvcmtlclRocmVhZChQYXNzT3duUHRyPFdl
YkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2s+KTsKKworICAgIC8vIFVzZWQgZnJv
bSB0aGUgbWFpbiB0aHJlYWQgdG8gcG9zdCB0YXNrcyB0byB0aGUgY29udGV4dCB0aHJlYWQuCisg
ICAgV2ViQ29yZTo6V29ya2VyTG9hZGVyUHJveHkqIG1fcHJveHk7CisgICAgLy8gVXNlZCB0byBp
bmRpY2F0ZSB0aGF0IHNodXRkb3duIGhhcyBzdGFydGVkIG9uIHRoZSBtYWluIHRocmVhZCwgYW5k
IGhlbmNlIHRoZSB3cml0ZXIgaGFzIGJlZW4gZGVsZXRlZC4KKyAgICBib29sIG1fd3JpdGVyRGVs
ZXRlZDsKKworICAgIC8vIFVzZWQgb24gdGhlIGNvbnRleHQgdGhyZWFkLCBvbmx5IHRvIGNoZWNr
IHRoYXQgd2UncmUgcnVubmluZyBvbiB0aGUgY29udGV4dCB0aHJlYWQuCisgICAgV2ViQ29yZTo6
U2NyaXB0RXhlY3V0aW9uQ29udGV4dCogbV93b3JrZXJDb250ZXh0OworCisgICAgLy8gQ3JlYXRl
ZCBhbmQgZGVzdHJveWVkIGZyb20gdGhlIG1haW4gdGhyZWFkLiAgVGhlIFdvcmtlckFzeW5jRmls
ZVdyaXRlckNocm9taXVtIGRyb3BzIGl0cyBsYXN0IHJlZmVyZW5jZSB0byBhIFdvcmtlckZpbGVX
cml0ZXJDYWxsYmFja3NCcmlkZ2UgYnkgcmVsZWFzaW5nIGl0IHRvIHBvc3RTaHV0ZG93blRvTWFp
blRocmVhZCB0byBnaXZlIHRoZSBicmlkZ2UgdGhlIGNoYW5jZSB0byBjbGVhbiB1cCBtX3dyaXRl
ci4KKyAgICBPd25QdHI8V2ViS2l0OjpXZWJGaWxlV3JpdGVyPiBtX3dyaXRlcjsKKworICAgIC8v
IFVzZWQgb24gdGhlIGNvbnRleHQgdGhyZWFkIHRvIGNhbGwgYmFjayBpbnRvIHRoZSBjbGllbnQu
CisgICAgV2ViQ29yZTo6QXN5bmNGaWxlV3JpdGVyQ2xpZW50KiBtX2NsaWVudE9uV29ya2VyVGhy
ZWFkOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYKKworI2VuZGlmIC8v
IFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2VfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>71378</attachid>
            <date>2010-10-20 18:24:37 -0700</date>
            <delta_ts>2010-10-28 17:44:46 -0700</delta_ts>
            <desc>Rolled in Michael&apos;s comments, including the KURL change.</desc>
            <filename>filewriter_worker1.txt</filename>
            <type>text/plain</type>
            <size>46567</size>
            <attacher name="Eric U.">ericu</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA2OTgwNSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjggQEAKKzIwMTAtMTAtMTQgIEVyaWMgVWhyaGFuZSAgPGVyaWN1QGNocm9taXVt
Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBb
Q2hyb21pdW1dIGltcGxlbWVudGF0aW9uIG9mIGFzeW5jIEZpbGVXcml0ZXIgZm9yIHdvcmtlcnMK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ3NjgxCisK
KyAgICAgICAgSW5pdGlhbCB0ZXN0cyBhcmUgaW4gYSBzZXBhcmF0ZSBjaGFuZ2VsaXN0LgorCisg
ICAgICAgICogZmlsZWFwaS9GaWxlSW5mby5oOiBBZGRlZDsgdXNlZCB0byByZXR1cm4gZnVsbCBt
ZXRhZGF0YSBmcm9tIGdldE1ldGFkYXRhIGNhbGxzLgorCisgICAgICAgIEJ1aWxkIGZpbGVzIG1v
ZGlmaWVkIHRvIGFkZCBGaWxlSW5mby5oLgorICAgICAgICAqIFdlYkNvcmUucHJvCisgICAgICAg
ICogR05VbWFrZWZpbGUuYW0KKyAgICAgICAgKiBXZWJDb3JlLmd5cGkKKyAgICAgICAgKiBXZWJD
b3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJvai9X
ZWJDb3JlLnZjcHJvagorCisgICAgICAgIFRoZSByZXN0IG9mIHRoZSBjaGFuZ2VzIGhlcmUganVz
dCBwYXNzIHRoZSBuZXcgRmlsZUluZm8gb2JqZWN0IHRocm91Z2ggdGhlIGNhbGxzIHRoYXQgdXNl
ZCB0byB0YWtlIGEgbW9kaWZpY2F0aW9uIHRpbWUuCisgICAgICAgICogZmlsZWFwaS9GaWxlU3lz
dGVtQ2FsbGJhY2tzLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkZpbGVTeXN0ZW1DYWxsYmFja3NC
YXNlOjpkaWRSZWFkTWV0YWRhdGEpOgorICAgICAgICAoV2ViQ29yZTo6TWV0YWRhdGFDYWxsYmFj
a3M6OmRpZFJlYWRNZXRhZGF0YSk6CisgICAgICAgICogZmlsZWFwaS9GaWxlU3lzdGVtQ2FsbGJh
Y2tzLmg6CisgICAgICAgICogcGxhdGZvcm0vQXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzLmg6CisK
IDIwMTAtMTAtMTQgIFpoZW55YW8gTW8gIDx6bW9AZ29vZ2xlLmNvbT4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBLZW5uZXRoIFJ1c3NlbGwuCkluZGV4OiBXZWJDb3JlL0dOVW1ha2VmaWxlLmFtCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvR05VbWFrZWZpbGUuYW0JKHJldmlzaW9uIDY5NzI0KQorKysg
V2ViQ29yZS9HTlVtYWtlZmlsZS5hbQkod29ya2luZyBjb3B5KQpAQCAtMTQwNSw2ICsxNDA1LDcg
QEAgd2ViY29yZV9zb3VyY2VzICs9IFwKIAlXZWJDb3JlL2ZpbGVhcGkvRmlsZUVycm9yLmggXAog
CVdlYkNvcmUvZmlsZWFwaS9GaWxlRXhjZXB0aW9uLmggXAogCVdlYkNvcmUvZmlsZWFwaS9GaWxl
LmggXAorCVdlYkNvcmUvZmlsZWFwaS9GaWxlSW5mby5oIFwKIAlXZWJDb3JlL2ZpbGVhcGkvRmls
ZUxpc3QuY3BwIFwKIAlXZWJDb3JlL2ZpbGVhcGkvRmlsZUxpc3QuaCBcCiAJV2ViQ29yZS9maWxl
YXBpL0ZpbGVSZWFkZXIuY3BwIFwKSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS5neXBpCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS5neXBpCShyZXZpc2lvbiA2OTcyNCkKKysrIFdlYkNvcmUv
V2ViQ29yZS5neXBpCSh3b3JraW5nIGNvcHkpCkBAIC0xNDk1LDYgKzE0OTUsNyBAQAogICAgICAg
ICAgICAgJ2ZpbGVhcGkvRmlsZUVudHJ5U3luYy5oJywKICAgICAgICAgICAgICdmaWxlYXBpL0Zp
bGVFcnJvci5oJywKICAgICAgICAgICAgICdmaWxlYXBpL0ZpbGVFeGNlcHRpb24uaCcsCisgICAg
ICAgICAgICAnZmlsZWFwaS9GaWxlSW5mby5oJywKICAgICAgICAgICAgICdmaWxlYXBpL0ZpbGVM
aXN0LmNwcCcsCiAgICAgICAgICAgICAnZmlsZWFwaS9GaWxlTGlzdC5oJywKICAgICAgICAgICAg
ICdmaWxlYXBpL0ZpbGVSZWFkZXIuY3BwJywKSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS5wcm8KPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9XZWJDb3JlLnBybwkocmV2aXNpb24gNjk3MjQpCisrKyBXZWJD
b3JlL1dlYkNvcmUucHJvCSh3b3JraW5nIGNvcHkpCkBAIC0yOTk0LDYgKzI5OTQsNyBAQCBjb250
YWlucyhERUZJTkVTLCBFTkFCTEVfRklMRV9TWVNURU09MSkgCiAgICAgICAgIGZpbGVhcGkvRmls
ZUNhbGxiYWNrLmggXAogICAgICAgICBmaWxlYXBpL0ZpbGVFbnRyeS5oIFwKICAgICAgICAgZmls
ZWFwaS9GaWxlRW50cnlTeW5jLmggXAorICAgICAgICBmaWxlYXBpL0ZpbGVJbmZvLmggXAogICAg
ICAgICBmaWxlYXBpL0ZpbGVTeXN0ZW1DYWxsYmFjay5oIFwKICAgICAgICAgZmlsZWFwaS9GaWxl
U3lzdGVtQ2FsbGJhY2tzLmggXAogICAgICAgICBmaWxlYXBpL0ZpbGVXcml0ZXIuaCBcCkluZGV4
OiBXZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvV2ViQ29yZS52Y3Byb2ovV2ViQ29yZS52Y3Byb2oJKHJldmlzaW9uIDY5NzI0KQorKysg
V2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZjcHJvagkod29ya2luZyBjb3B5KQpAQCAt
NDgzMzEsNiArNDgzMzEsMTAgQEAKIAkJCQk+DQogCQkJPC9GaWxlPg0KIAkJCTxGaWxlDQorCQkJ
CVJlbGF0aXZlUGF0aD0iLi5cZmlsZWFwaVxGaWxlSW5mby5oIg0KKwkJCQk+DQorCQkJPC9GaWxl
Pg0KKwkJCTxGaWxlDQogCQkJCVJlbGF0aXZlUGF0aD0iLi5caHRtbFxGaWxlSW5wdXRUeXBlLmNw
cCINCiAJCQkJPg0KIAkJCTwvRmlsZT4NCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gNjk3MjQpCisrKyBXZWJDb3JlL1dlYkNvcmUueGNv
ZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtOTMwLDYgKzkzMCw3IEBA
CiAJCTQ2MTRBMUZFMEIyM0E4RDYwMDQ0NkUxQyAvKiBjb3B5Q3Vyc29yLnBuZyBpbiBSZXNvdXJj
ZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDYxNEExRkQwQjIzQThENjAw
NDQ2RTFDIC8qIGNvcHlDdXJzb3IucG5nICovOyB9OwogCQk0NjRFQTI3MzBCOEEzNTBCMDBBOEU2
RTMgLyogY3Jvc3NIYWlyQ3Vyc29yLnBuZyBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gNDY0RUEyNzEwQjhBMzUwQjAwQThFNkUzIC8qIGNyb3NzSGFpckN1
cnNvci5wbmcgKi87IH07CiAJCTQ2NEVBMjc0MEI4QTM1MEIwMEE4RTZFMyAvKiBub3RBbGxvd2Vk
Q3Vyc29yLnBuZyBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gNDY0RUEyNzIwQjhBMzUwQjAwQThFNkUzIC8qIG5vdEFsbG93ZWRDdXJzb3IucG5nICovOyB9
OworCQk0Njg5RjFBRjEyNjdCQUUxMDBFOEQzODAgLyogRmlsZUluZm8uaCBpbiBIZWFkZXJzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ2ODlGMUFFMTI2N0JBRTEwMEU4RDM4
MCAvKiBGaWxlSW5mby5oICovOyB9OwogCQk0NkJEMTZFMzBCMjc5NDczMDAxRjA4MzkgLyogbm9u
ZUN1cnNvci5wbmcgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IDQ2QkQxNkUyMEIyNzk0NzMwMDFGMDgzOSAvKiBub25lQ3Vyc29yLnBuZyAqLzsgfTsKIAkJ
NDZENEYyNDkwQUY5N0U4MTAwMzUzODVBIC8qIGNlbGxDdXJzb3IucG5nIGluIFJlc291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0NkQ0RjI0NjBBRjk3RTgxMDAzNTM4
NUEgLyogY2VsbEN1cnNvci5wbmcgKi87IH07CiAJCTQ2RDRGMjRBMEFGOTdFODEwMDM1Mzg1QSAv
KiBjb250ZXh0TWVudUN1cnNvci5wbmcgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDQ2RDRGMjQ3MEFGOTdFODEwMDM1Mzg1QSAvKiBjb250ZXh0TWVudUN1
cnNvci5wbmcgKi87IH07CkBAIC02OTU3LDYgKzY5NTgsNyBAQAogCQk0NjE0QTFGRDBCMjNBOEQ2
MDA0NDZFMUMgLyogY29weUN1cnNvci5wbmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
bGFzdEtub3duRmlsZVR5cGUgPSBpbWFnZS5wbmc7IHBhdGggPSBjb3B5Q3Vyc29yLnBuZzsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNDY0RUEyNzEwQjhBMzUwQjAwQThFNkUzIC8qIGNy
b3NzSGFpckN1cnNvci5wbmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3du
RmlsZVR5cGUgPSBpbWFnZS5wbmc7IHBhdGggPSBjcm9zc0hhaXJDdXJzb3IucG5nOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwogCQk0NjRFQTI3MjBCOEEzNTBCMDBBOEU2RTMgLyogbm90QWxs
b3dlZEN1cnNvci5wbmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmls
ZVR5cGUgPSBpbWFnZS5wbmc7IHBhdGggPSBub3RBbGxvd2VkQ3Vyc29yLnBuZzsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDY4OUYxQUUxMjY3QkFFMTAwRThEMzgwIC8qIEZpbGVJbmZv
LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IEZpbGVJbmZvLmg7IHBhdGggPSBm
aWxlYXBpL0ZpbGVJbmZvLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTQ2QkQxNkUy
MEIyNzk0NzMwMDFGMDgzOSAvKiBub25lQ3Vyc29yLnBuZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGltYWdlLnBuZzsgcGF0aCA9IG5vbmVDdXJzb3Iu
cG5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk0NkQ0RjI0NjBBRjk3RTgxMDAzNTM4
NUEgLyogY2VsbEN1cnNvci5wbmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtu
b3duRmlsZVR5cGUgPSBpbWFnZS5wbmc7IHBhdGggPSBjZWxsQ3Vyc29yLnBuZzsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNDZENEYyNDcwQUY5N0U4MTAwMzUzODVBIC8qIGNvbnRleHRN
ZW51Q3Vyc29yLnBuZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxl
VHlwZSA9IGltYWdlLnBuZzsgcGF0aCA9IGNvbnRleHRNZW51Q3Vyc29yLnBuZzsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTE0OTA3LDYgKzE0OTA5LDcgQEAKIAkJCQk4OTNDNDdGRjEy
NDhCRDM5MDAyQjNEODYgLyogRmlsZUVudHJ5U3luYy5oICovLAogCQkJCTk3NkQ2QzY0MTIyQjhB
M0QwMDFGRDFGNyAvKiBGaWxlRXJyb3IuaCAqLywKIAkJCQkyRURGMzY5RTEyMkM5NEM4MDAyRjdE
NEUgLyogRmlsZUV4Y2VwdGlvbi5oICovLAorCQkJCTQ2ODlGMUFFMTI2N0JBRTEwMEU4RDM4MCAv
KiBGaWxlSW5mby5oICovLAogCQkJCTk3NkQ2QzY2MTIyQjhBM0QwMDFGRDFGNyAvKiBGaWxlTGlz
dC5jcHAgKi8sCiAJCQkJOTc2RDZDNjcxMjJCOEEzRDAwMUZEMUY3IC8qIEZpbGVMaXN0LmggKi8s
CiAJCQkJOTc2RDZDNjkxMjJCOEEzRDAwMUZEMUY3IC8qIEZpbGVSZWFkZXIuY3BwICovLApAQCAt
MjEwNjksNiArMjEwNzIsNyBAQAogCQkJCTkzRjE5OUVEMDgyNDVFNTkwMDFFOUFCQyAvKiBYU0xU
UHJvY2Vzc29yLmggaW4gSGVhZGVycyAqLywKIAkJCQlFMUJFNTEyRTBDRjZDNTEyMDAyRUE5NTkg
LyogWFNMVFVuaWNvZGVTb3J0LmggaW4gSGVhZGVycyAqLywKIAkJCQk5N0RENEQ4NzBGREY0RDZF
MDBFQ0Y5QTQgLyogWFNTQXVkaXRvci5oIGluIEhlYWRlcnMgKi8sCisJCQkJNDY4OUYxQUYxMjY3
QkFFMTAwRThEMzgwIC8qIEZpbGVJbmZvLmggaW4gSGVhZGVycyAqLywKIAkJCSk7CiAJCQlydW5P
bmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKSW5kZXg6IFdlYkNvcmUv
ZmlsZWFwaS9GaWxlSW5mby5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvZmlsZWFwaS9GaWxlSW5m
by5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9maWxlYXBpL0ZpbGVJbmZvLmgJKHJldmlzaW9u
IDApCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBh
cmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29w
eXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0
aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0
b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZy
b20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1p
c3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hU
IEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgor
ICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEZpbGVJbmZvX2gKKyNkZWZpbmUgRmlsZUluZm9f
aAorCisjaWYgRU5BQkxFKEZJTEVfU1lTVEVNKQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0
cnVjdCBGaWxlSW5mbyB7CisgICAgLy8gVGhlIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUgb2YgdGhl
IGZpbGUsIGluIHNlY29uZHMuCisgICAgLy8gVGhlIHZhbHVlIDAuMCBtZWFucyB0aGF0IHRoZSB0
aW1lIGlzIG5vdCBzZXQuCisgICAgZG91YmxlIG1vZGlmaWNhdGlvblRpbWU7CisKKyAgICAvLyBU
aGUgbGVuZ3RoIG9mIHRoZSBmaWxlIGluIGJ5dGVzLgorICAgIC8vIFRoZSB2YWx1ZSAtMSBtZWFu
cyB0aGF0IHRoZSBsZW5ndGggaXMgbm90IHNldC4KKyAgICBsb25nIGxvbmcgbGVuZ3RoOworCisg
ICAgZW51bSBUeXBlIHsKKyAgICAgICAgVHlwZVVua25vd24gPSAwLAorICAgICAgICBUeXBlRmls
ZSwKKyAgICAgICAgVHlwZURpcmVjdG9yeQorICAgIH07CisKKyAgICBUeXBlIHR5cGU7CisKKyAg
ICBGaWxlSW5mbygpIDogbW9kaWZpY2F0aW9uVGltZSgwLjApLCBsZW5ndGgoLTEpLCB0eXBlKFR5
cGVVbmtub3duKSB7IH0KK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8v
IEVOQUJMRShGSUxFX1NZU1RFTSkKKworI2VuZGlmIC8vIERPTUZpbGVTeXN0ZW1faApJbmRleDog
V2ViQ29yZS9maWxlYXBpL0ZpbGVTeXN0ZW1DYWxsYmFja3MuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvZmlsZWFwaS9GaWxlU3lzdGVtQ2FsbGJhY2tzLmNwcAkocmV2aXNpb24gNjk3MjQpCisr
KyBXZWJDb3JlL2ZpbGVhcGkvRmlsZVN5c3RlbUNhbGxiYWNrcy5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTc3LDcgKzc3LDcgQEAgdm9pZCBGaWxlU3lzdGVtQ2FsbGJhY2tzQmFzZTo6ZGlkT3BlbkZp
bAogICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwogfQogCi12b2lkIEZpbGVTeXN0ZW1DYWxsYmFj
a3NCYXNlOjpkaWRSZWFkTWV0YWRhdGEoZG91YmxlKQordm9pZCBGaWxlU3lzdGVtQ2FsbGJhY2tz
QmFzZTo6ZGlkUmVhZE1ldGFkYXRhKGNvbnN0IEZpbGVJbmZvJikKIHsKICAgICAvLyBFYWNoIHN1
YmNsYXNzIG11c3QgaW1wbGVtZW50IGFuIGFwcHJvcHJpYXRlIG9uZS4KICAgICBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsKQEAgLTIwNSwxMCArMjA1LDEwIEBAIE1ldGFkYXRhQ2FsbGJhY2tzOjpNZXRh
ZGF0YUNhbGxiYWNrcyhQYXMKIHsKIH0KIAotdm9pZCBNZXRhZGF0YUNhbGxiYWNrczo6ZGlkUmVh
ZE1ldGFkYXRhKGRvdWJsZSBtb2RpZmljYXRpb25UaW1lKQordm9pZCBNZXRhZGF0YUNhbGxiYWNr
czo6ZGlkUmVhZE1ldGFkYXRhKGNvbnN0IEZpbGVJbmZvJiBpbmZvKQogewogICAgIGlmIChtX3N1
Y2Nlc3NDYWxsYmFjaykKLSAgICAgICAgbV9zdWNjZXNzQ2FsbGJhY2stPmhhbmRsZUV2ZW50KE1l
dGFkYXRhOjpjcmVhdGUobW9kaWZpY2F0aW9uVGltZSkuZ2V0KCkpOworICAgICAgICBtX3N1Y2Nl
c3NDYWxsYmFjay0+aGFuZGxlRXZlbnQoTWV0YWRhdGE6OmNyZWF0ZShpbmZvLm1vZGlmaWNhdGlv
blRpbWUpLmdldCgpKTsKICAgICBtX3N1Y2Nlc3NDYWxsYmFjay5jbGVhcigpOwogfQogCkluZGV4
OiBXZWJDb3JlL2ZpbGVhcGkvRmlsZVN5c3RlbUNhbGxiYWNrcy5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvZmlsZWFwaS9GaWxlU3lzdGVtQ2FsbGJhY2tzLmgJKHJldmlzaW9uIDY5NzI0KQorKysg
V2ViQ29yZS9maWxlYXBpL0ZpbGVTeXN0ZW1DYWxsYmFja3MuaAkod29ya2luZyBjb3B5KQpAQCAt
MzQsNiArMzQsNyBAQAogI2lmIEVOQUJMRShGSUxFX1NZU1RFTSkKIAogI2luY2x1ZGUgIkFzeW5j
RmlsZVN5c3RlbUNhbGxiYWNrcy5oIgorI2luY2x1ZGUgIkZpbGVJbmZvLmgiCiAjaW5jbHVkZSAi
UGxhdGZvcm1TdHJpbmcuaCIKICNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgogI2luY2x1ZGUg
PHd0Zi9WZWN0b3IuaD4KQEAgLTY1LDcgKzY2LDcgQEAgcHVibGljOgogICAgIHZpcnR1YWwgdm9p
ZCBkaWRPcGVuRmlsZVN5c3RlbShjb25zdCBTdHJpbmcmIG5hbWUsIFBhc3NPd25QdHI8QXN5bmNG
aWxlU3lzdGVtPik7CiAKICAgICAvLyBGb3IgTWV0YWRhdGFDYWxsYmFja3MuCi0gICAgdmlydHVh
bCB2b2lkIGRpZFJlYWRNZXRhZGF0YShkb3VibGUgbW9kaWZpY2F0aW9uVGltZSk7CisgICAgdmly
dHVhbCB2b2lkIGRpZFJlYWRNZXRhZGF0YShjb25zdCBGaWxlSW5mbyYpOwogCiAgICAgLy8gRm9y
IEVudHJpZXNDYWxsYmFja3MuIGRpZFJlYWREaXJlY3RvcnlFbnRyeSBpcyBjYWxsZWQgZWFjaCB0
aW1lIHRoZSBBUEkgcmVhZHMgYW4gZW50cnksIGFuZCBkaWRSZWFkRGlyZWN0b3J5RG9uZSBpcyBj
YWxsZWQgd2hlbiBhIGNodW5rIG9mIGVudHJpZXMgaGF2ZSBiZWVuIHJlYWQgKGkuZS4gZ29vZCB0
aW1lIHRvIGNhbGwgYmFjayB0byB0aGUgYXBwbGljYXRpb24pLiAgSWYgaGFzTW9yZSBpcyB0cnVl
IHRoZXJlIGNhbiBiZSBtb3JlIGNodW5rcy4KICAgICB2aXJ0dWFsIHZvaWQgZGlkUmVhZERpcmVj
dG9yeUVudHJ5KGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCBpc0RpcmVjdG9yeSk7CkBAIC0xMjUs
NyArMTI2LDcgQEAgcHJpdmF0ZToKIGNsYXNzIE1ldGFkYXRhQ2FsbGJhY2tzIDogcHVibGljIEZp
bGVTeXN0ZW1DYWxsYmFja3NCYXNlIHsKIHB1YmxpYzoKICAgICBzdGF0aWMgUGFzc093blB0cjxN
ZXRhZGF0YUNhbGxiYWNrcz4gY3JlYXRlKFBhc3NSZWZQdHI8TWV0YWRhdGFDYWxsYmFjaz4sIFBh
c3NSZWZQdHI8RXJyb3JDYWxsYmFjaz4pOwotICAgIHZpcnR1YWwgdm9pZCBkaWRSZWFkTWV0YWRh
dGEoZG91YmxlIG1vZGlmaWNhdGlvblRpbWUpOworICAgIHZpcnR1YWwgdm9pZCBkaWRSZWFkTWV0
YWRhdGEoY29uc3QgRmlsZUluZm8mKTsKIAogcHJpdmF0ZToKICAgICBNZXRhZGF0YUNhbGxiYWNr
cyhQYXNzUmVmUHRyPE1ldGFkYXRhQ2FsbGJhY2s+LCBQYXNzUmVmUHRyPEVycm9yQ2FsbGJhY2s+
KTsKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vQXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9Bc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3MuaAko
cmV2aXNpb24gNjk3MjQpCisrKyBXZWJDb3JlL3BsYXRmb3JtL0FzeW5jRmlsZVN5c3RlbUNhbGxi
YWNrcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0zMyw2ICszMyw3IEBACiAKICNpZiBFTkFCTEUoRklM
RV9TWVNURU0pCiAKKyNpbmNsdWRlICJGaWxlSW5mby5oIgogI2luY2x1ZGUgIlBsYXRmb3JtU3Ry
aW5nLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKQEAgLTQ5LDcgKzUwLDcgQEAgcHVibGljOgog
ICAgIHZpcnR1YWwgdm9pZCBkaWRPcGVuRmlsZVN5c3RlbShjb25zdCBTdHJpbmcmIG5hbWUsIFBh
c3NPd25QdHI8QXN5bmNGaWxlU3lzdGVtPikgPSAwOwogCiAgICAgLy8gQ2FsbGVkIHdoZW4gYSBm
aWxlIG1ldGFkYXRhIGlzIHJlYWQgc3VjY2Vzc2Z1bGx5LgotICAgIHZpcnR1YWwgdm9pZCBkaWRS
ZWFkTWV0YWRhdGEoZG91YmxlIG1vZGlmaWNhdGlvblRpbWUpID0gMDsKKyAgICB2aXJ0dWFsIHZv
aWQgZGlkUmVhZE1ldGFkYXRhKGNvbnN0IEZpbGVJbmZvJikgPSAwOwogCiAgICAgLy8gQ2FsbGVk
IHdoZW4gYSBkaXJlY3RvcnkgZW50cnkgaXMgcmVhZC4KICAgICB2aXJ0dWFsIHZvaWQgZGlkUmVh
ZERpcmVjdG9yeUVudHJ5KGNvbnN0IFN0cmluZyYgbmFtZSwgYm9vbCBpc0RpcmVjdG9yeSkgPSAw
OwpJbmRleDogV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQv
Y2hyb21pdW0vQ2hhbmdlTG9nCShyZXZpc2lvbiA2OTgwNSkKKysrIFdlYktpdC9jaHJvbWl1bS9D
aGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEsMyArMSwzMCBAQAorMjAxMC0xMC0xNCAgRXJp
YyBVaHJoYW5lICA8ZXJpY3VAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIFtDaHJvbWl1bV0gaW1wbGVtZW50YXRpb24gb2YgYXN5
bmMgRmlsZVdyaXRlciBmb3Igd29ya2VycworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9NDc2ODEKKworICAgICAgICAqIFdlYktpdC5neXA6CisKKyAgICAg
ICAgV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0gbmVlZGVkIGxhenkgaW5pdGlhbGl6YXRp
b24gW2xhenkgY3JlYXRpb24gb2YgdGhlIFdlYkZpbGVXcml0ZXJdLiAgSXQgdHVybmVkIG91dCB0
aGF0IEkgY291bGQgaGF2ZSBkb25lIHRoYXQgZm9yIEFzeW5jRmlsZVdyaXRlckNocm9taXVtLCBh
bmQgaXQncyBjbGVhbmVyLCBzbyBJIG1hZGUgdGhlbSBtYXRjaC4KKworICAgICAgICBHZXRNZXRh
ZGF0YSBjYWxscyBub3cgcmV0dXJuIGZ1bGwgbWV0YWRhdGEgcmF0aGVyIHRoYW4ganVzdCBhIG1v
ZGlmaWNhdGlvbiB0aW1lLgorCisgICAgICAgICogc3JjL0FzeW5jRmlsZVN5c3RlbUNocm9taXVt
LmNwcDoKKyAgICAgICAgKiBzcmMvQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uY3BwOgorICAgICAg
ICAqIHNyYy9Bc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5oOgorICAgICAgICAqIHNyYy9XZWJGaWxl
U3lzdGVtQ2FsbGJhY2tzSW1wbC5jcHA6CisgICAgICAgICogc3JjL1dvcmtlckFzeW5jRmlsZVN5
c3RlbUNocm9taXVtLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldvcmtlckZpbGVXcml0ZXJIZWxw
ZXJDYWxsYmFja3MpOiBOZXcgaGVscGVyIGNsYXNzLgorCisgICAgICAgICogc3JjL1dvcmtlckFz
eW5jRmlsZVdyaXRlckNocm9taXVtLmNwcDogQWRkZWQuCisgICAgICAgICogc3JjL1dvcmtlckFz
eW5jRmlsZVdyaXRlckNocm9taXVtLmg6IEFkZGVkLgorCisgICAgICAgIFRoaXMgY2xhc3MgYnJp
ZGdlcyBmaWxld3JpdGVyIGFuZCBmaWxld3JpdGVyY2xpZW50IGNhbGxzIGJldHdlZW4gdGhlIGNv
bnRleHQgYW5kIG1haW4gdGhyZWFkcy4KKyAgICAgICAgKiBzcmMvV29ya2VyRmlsZVdyaXRlckNh
bGxiYWNrc0JyaWRnZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHNyYy9Xb3JrZXJGaWxlV3JpdGVy
Q2FsbGJhY2tzQnJpZGdlLmg6IEFkZGVkLgorCiAyMDEwLTEwLTEzICBLaW51a28gWWFzdWRhICA8
a2ludWtvQGNocm9taXVtLm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBKaWFuIExpLgpJbmRl
eDogV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9t
aXVtL1dlYktpdC5neXAJKHJldmlzaW9uIDY5NzI0KQorKysgV2ViS2l0L2Nocm9taXVtL1dlYktp
dC5neXAJKHdvcmtpbmcgY29weSkKQEAgLTU0MCw4ICs1NDAsMTIgQEAKICAgICAgICAgICAgICAg
ICAnc3JjL1dlYldvcmtlckltcGwuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9Xb3JrZXJBc3lu
Y0ZpbGVTeXN0ZW1DaHJvbWl1bS5jcHAnLAogICAgICAgICAgICAgICAgICdzcmMvV29ya2VyQXN5
bmNGaWxlU3lzdGVtQ2hyb21pdW0uaCcsCisgICAgICAgICAgICAgICAgJ3NyYy9Xb3JrZXJBc3lu
Y0ZpbGVXcml0ZXJDaHJvbWl1bS5jcHAnLAorICAgICAgICAgICAgICAgICdzcmMvV29ya2VyQXN5
bmNGaWxlV3JpdGVyQ2hyb21pdW0uaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9Xb3JrZXJGaWxl
U3lzdGVtQ2FsbGJhY2tzQnJpZGdlLmNwcCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9Xb3JrZXJG
aWxlU3lzdGVtQ2FsbGJhY2tzQnJpZGdlLmgnLAorICAgICAgICAgICAgICAgICdzcmMvV29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5jcHAnLAorICAgICAgICAgICAgICAgICdzcmMvV29y
a2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5oJywKICAgICAgICAgICAgICAgICAnc3JjL1dy
YXBwZWRSZXNvdXJjZVJlcXVlc3QuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9XcmFwcGVkUmVz
b3VyY2VSZXNwb25zZS5oJywKICAgICAgICAgICAgICAgICAnc3JjL3dpbi9XZWJJbnB1dEV2ZW50
RmFjdG9yeS5jcHAnLApJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9Bc3luY0ZpbGVTeXN0ZW1D
aHJvbWl1bS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9Bc3luY0ZpbGVT
eXN0ZW1DaHJvbWl1bS5jcHAJKHJldmlzaW9uIDY5NzI0KQorKysgV2ViS2l0L2Nocm9taXVtL3Ny
Yy9Bc3luY0ZpbGVTeXN0ZW1DaHJvbWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEzMiw5ICsx
MzIsNyBAQCBwdWJsaWM6CiAgICAgICAgIGlmIChpbmZvLnR5cGUgIT0gV2ViS2l0OjpXZWJGaWxl
SW5mbzo6VHlwZUZpbGUgfHwgaW5mby5sZW5ndGggPCAwKQogICAgICAgICAgICAgbV9jYWxsYmFj
a3MtPmRpZEZhaWwoV2ViS2l0OjpXZWJGaWxlRXJyb3JJbnZhbGlkU3RhdGUpOwogICAgICAgICBl
bHNlIHsKLSAgICAgICAgICAgIE93blB0cjxBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bT4gYXN5bmNG
aWxlV3JpdGVyQ2hyb21pdW0gPSBhZG9wdFB0cihuZXcgQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0o
bV9jbGllbnQpKTsKLSAgICAgICAgICAgIE93blB0cjxXZWJLaXQ6OldlYkZpbGVXcml0ZXI+IHdl
YkZpbGVXcml0ZXIgPSBhZG9wdFB0cihtX3dlYkZpbGVTeXN0ZW0tPmNyZWF0ZUZpbGVXcml0ZXIo
bV9wYXRoLCBhc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5nZXQoKSkpOwotICAgICAgICAgICAgYXN5
bmNGaWxlV3JpdGVyQ2hyb21pdW0tPnNldFdlYkZpbGVXcml0ZXIod2ViRmlsZVdyaXRlci5yZWxl
YXNlKCkpOworICAgICAgICAgICAgT3duUHRyPEFzeW5jRmlsZVdyaXRlckNocm9taXVtPiBhc3lu
Y0ZpbGVXcml0ZXJDaHJvbWl1bSA9IGFkb3B0UHRyKG5ldyBBc3luY0ZpbGVXcml0ZXJDaHJvbWl1
bShtX2NsaWVudCwgbV93ZWJGaWxlU3lzdGVtLCBtX3BhdGgpKTsKICAgICAgICAgICAgIG1fY2Fs
bGJhY2tzLT5kaWRDcmVhdGVGaWxlV3JpdGVyKGFzeW5jRmlsZVdyaXRlckNocm9taXVtLnJlbGVh
c2UoKSwgaW5mby5sZW5ndGgpOwogICAgICAgICB9CiAgICAgICAgIGRlbGV0ZSB0aGlzOwpJbmRl
eDogV2ViS2l0L2Nocm9taXVtL3NyYy9Bc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9Bc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5jcHAJ
KHJldmlzaW9uIDY5NzI0KQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9Bc3luY0ZpbGVXcml0ZXJD
aHJvbWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM1LDEzICszNSwxNiBAQAogCiAjaW5jbHVk
ZSAiQXN5bmNGaWxlV3JpdGVyQ2xpZW50LmgiCiAjaW5jbHVkZSAiQmxvYi5oIgorI2luY2x1ZGUg
IldlYkZpbGVTeXN0ZW0uaCIKICNpbmNsdWRlICJXZWJGaWxlV3JpdGVyLmgiCiAjaW5jbHVkZSAi
V2ViVVJMLmgiCiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotQXN5bmNGaWxlV3JpdGVyQ2hyb21p
dW06OkFzeW5jRmlsZVdyaXRlckNocm9taXVtKEFzeW5jRmlsZVdyaXRlckNsaWVudCogY2xpZW50
KQorQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW06OkFzeW5jRmlsZVdyaXRlckNocm9taXVtKEFzeW5j
RmlsZVdyaXRlckNsaWVudCogY2xpZW50LCBXZWJLaXQ6OldlYkZpbGVTeXN0ZW0qIHdlYkZpbGVT
eXN0ZW0sIGNvbnN0IFN0cmluZyYgcGF0aCkKICAgICA6IG1fY2xpZW50KGNsaWVudCkKKyAgICAs
IG1fd2ViRmlsZVN5c3RlbSh3ZWJGaWxlU3lzdGVtKQorICAgICwgbV9wYXRoKHBhdGgpCiB7CiB9
CiAKQEAgLTQ5LDMyICs1MiwzMiBAQCBBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bTo6fkFzeW5jRmls
ZVdyaXRlCiB7CiB9CiAKLXZvaWQgQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW06OnNldFdlYkZpbGVX
cml0ZXIoUGFzc093blB0cjxXZWJLaXQ6OldlYkZpbGVXcml0ZXI+IHdyaXRlcikKLXsKLSAgICBt
X3dyaXRlciA9IHdyaXRlcjsKLX0KLQogdm9pZCBBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bTo6d3Jp
dGUobG9uZyBsb25nIHBvc2l0aW9uLCBCbG9iKiBkYXRhKQogeworICAgIGlmICghbV93cml0ZXIp
CisgICAgICBpbml0V2ViRmlsZVdyaXRlcigpOwogICAgIEFTU0VSVChtX3dyaXRlcik7CiAgICAg
bV93cml0ZXItPndyaXRlKHBvc2l0aW9uLCBXZWJLaXQ6OldlYlVSTChkYXRhLT51cmwoKSkpOwog
fQogCiB2b2lkIEFzeW5jRmlsZVdyaXRlckNocm9taXVtOjp0cnVuY2F0ZShsb25nIGxvbmcgbGVu
Z3RoKQogeworICAgIGlmICghbV93cml0ZXIpCisgICAgICBpbml0V2ViRmlsZVdyaXRlcigpOwog
ICAgIEFTU0VSVChtX3dyaXRlcik7CiAgICAgbV93cml0ZXItPnRydW5jYXRlKGxlbmd0aCk7CiB9
CiAKIHZvaWQgQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW06OmFib3J0KCkKIHsKKyAgICBpZiAoIW1f
d3JpdGVyKQorICAgICAgaW5pdFdlYkZpbGVXcml0ZXIoKTsKICAgICBBU1NFUlQobV93cml0ZXIp
OwogICAgIG1fd3JpdGVyLT5jYW5jZWwoKTsKIH0KIAogdm9pZCBBc3luY0ZpbGVXcml0ZXJDaHJv
bWl1bTo6ZGlkV3JpdGUobG9uZyBsb25nIGJ5dGVzLCBib29sIGNvbXBsZXRlKQogewotICAgIEFT
U0VSVChtX3dyaXRlcik7CiAgICAgbV9jbGllbnQtPmRpZFdyaXRlKGJ5dGVzLCBjb21wbGV0ZSk7
CiB9CiAKQEAgLTg4LDYgKzkxLDExIEBAIHZvaWQgQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW06OmRp
ZEZhaWwoV2UKICAgICBtX2NsaWVudC0+ZGlkRmFpbChlcnJvcik7CiB9CiAKK3ZvaWQgQXN5bmNG
aWxlV3JpdGVyQ2hyb21pdW06OmluaXRXZWJGaWxlV3JpdGVyKCkKK3sKKyAgICBtX3dyaXRlciA9
IGFkb3B0UHRyKG1fd2ViRmlsZVN5c3RlbS0+Y3JlYXRlRmlsZVdyaXRlcihtX3BhdGgsIHRoaXMp
KTsKK30KKwogfSAvLyBuYW1lc3BhY2UKIAogI2VuZGlmIC8vIEVOQUJMRShGSUxFX1NZU1RFTSkK
SW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL0FzeW5jRmlsZVdyaXRlckNocm9taXVtLmgJ
KHJldmlzaW9uIDY5NzI0KQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9Bc3luY0ZpbGVXcml0ZXJD
aHJvbWl1bS5oCSh3b3JraW5nIGNvcHkpCkBAIC0zOSw2ICszOSw3IEBACiAjaW5jbHVkZSA8d3Rm
L1Bhc3NPd25QdHIuaD4KIAogbmFtZXNwYWNlIFdlYktpdCB7CitjbGFzcyBXZWJGaWxlU3lzdGVt
OwogY2xhc3MgV2ViRmlsZVdyaXRlcjsKIH0KIApAQCAtNDksMTEgKzUwLDkgQEAgY2xhc3MgQXN5
bmNGaWxlV3JpdGVyQ2xpZW50OwogCiBjbGFzcyBBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bSA6IHB1
YmxpYyBBc3luY0ZpbGVXcml0ZXIsIHB1YmxpYyBXZWJLaXQ6OldlYkZpbGVXcml0ZXJDbGllbnQg
ewogcHVibGljOgotICAgIEFzeW5jRmlsZVdyaXRlckNocm9taXVtKEFzeW5jRmlsZVdyaXRlckNs
aWVudCogY2xpZW50KTsKKyAgICBBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bShBc3luY0ZpbGVXcml0
ZXJDbGllbnQqLCBXZWJLaXQ6OldlYkZpbGVTeXN0ZW0qLCBjb25zdCBTdHJpbmcmIHBhdGgpOwog
ICAgIH5Bc3luY0ZpbGVXcml0ZXJDaHJvbWl1bSgpOwogICAgIAotICAgIHZvaWQgc2V0V2ViRmls
ZVdyaXRlcihQYXNzT3duUHRyPFdlYktpdDo6V2ViRmlsZVdyaXRlcj4gd3JpdGVyKTsKLQogICAg
IC8vIEZpbGVXcml0ZXIKICAgICB2aXJ0dWFsIHZvaWQgd3JpdGUobG9uZyBsb25nIHBvc2l0aW9u
LCBCbG9iKiBkYXRhKTsKICAgICB2aXJ0dWFsIHZvaWQgdHJ1bmNhdGUobG9uZyBsb25nIGxlbmd0
aCk7CkBAIC02NSw4ICs2NCwxMiBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB2b2lkIGRpZEZhaWwo
V2ViS2l0OjpXZWJGaWxlRXJyb3IpOwogCiBwcml2YXRlOgorICAgIHZvaWQgaW5pdFdlYkZpbGVX
cml0ZXIoKTsKKwogICAgIE93blB0cjxXZWJLaXQ6OldlYkZpbGVXcml0ZXI+IG1fd3JpdGVyOwog
ICAgIEFzeW5jRmlsZVdyaXRlckNsaWVudCogbV9jbGllbnQ7CisgICAgV2ViS2l0OjpXZWJGaWxl
U3lzdGVtKiBtX3dlYkZpbGVTeXN0ZW07CisgICAgU3RyaW5nIG1fcGF0aDsKIH07CiAKIH0gLy8g
bmFtZXNwYWNlCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYkZpbGVTeXN0ZW1DYWxsYmFj
a3NJbXBsLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dlYkZpbGVTeXN0
ZW1DYWxsYmFja3NJbXBsLmNwcAkocmV2aXNpb24gNjk3MjQpCisrKyBXZWJLaXQvY2hyb21pdW0v
c3JjL1dlYkZpbGVTeXN0ZW1DYWxsYmFja3NJbXBsLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjMs
OSArNjMsMjMgQEAgdm9pZCBXZWJGaWxlU3lzdGVtQ2FsbGJhY2tzSW1wbDo6ZGlkU3VjYwogICAg
IGRlbGV0ZSB0aGlzOwogfQogCi12b2lkIFdlYkZpbGVTeXN0ZW1DYWxsYmFja3NJbXBsOjpkaWRS
ZWFkTWV0YWRhdGEoY29uc3QgV2ViRmlsZUluZm8mIGluZm8pCit2b2lkIFdlYkZpbGVTeXN0ZW1D
YWxsYmFja3NJbXBsOjpkaWRSZWFkTWV0YWRhdGEoY29uc3QgV2ViRmlsZUluZm8mIHdlYkZpbGVJ
bmZvKQogewotICAgIG1fY2FsbGJhY2tzLT5kaWRSZWFkTWV0YWRhdGEoaW5mby5tb2RpZmljYXRp
b25UaW1lKTsKKyAgICBGaWxlSW5mbyBmaWxlSW5mbzsKKyAgICBmaWxlSW5mby5tb2RpZmljYXRp
b25UaW1lID0gd2ViRmlsZUluZm8ubW9kaWZpY2F0aW9uVGltZTsKKyAgICBmaWxlSW5mby5sZW5n
dGggPSB3ZWJGaWxlSW5mby5sZW5ndGg7CisgICAgc3dpdGNoICh3ZWJGaWxlSW5mby50eXBlKSB7
CisgICAgY2FzZSBXZWJGaWxlSW5mbzo6VHlwZURpcmVjdG9yeToKKyAgICAgICAgZmlsZUluZm8u
dHlwZSA9IEZpbGVJbmZvOjpUeXBlRGlyZWN0b3J5OworICAgICAgICBicmVhazsKKyAgICBjYXNl
IFdlYkZpbGVJbmZvOjpUeXBlRmlsZToKKyAgICAgICAgZmlsZUluZm8udHlwZSA9IEZpbGVJbmZv
OjpUeXBlRmlsZTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgZmlsZUlu
Zm8udHlwZSA9IEZpbGVJbmZvOjpUeXBlVW5rbm93bjsKKyAgICAgICAgYnJlYWs7CisgICAgfQor
ICAgIG1fY2FsbGJhY2tzLT5kaWRSZWFkTWV0YWRhdGEoZmlsZUluZm8pOwogICAgIGRlbGV0ZSB0
aGlzOwogfQogCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckFzeW5jRmlsZVN5c3Rl
bUNocm9taXVtLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckFz
eW5jRmlsZVN5c3RlbUNocm9taXVtLmNwcAkocmV2aXNpb24gNjk3MjQpCisrKyBXZWJLaXQvY2hy
b21pdW0vc3JjL1dvcmtlckFzeW5jRmlsZVN5c3RlbUNocm9taXVtLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMzgsOSArMzgsMTEgQEAKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1
ZGUgIldlYkZpbGVTeXN0ZW0uaCIKICNpbmNsdWRlICJXZWJGaWxlU3lzdGVtQ2FsbGJhY2tzSW1w
bC5oIgorI2luY2x1ZGUgIldlYkZpbGVXcml0ZXIuaCIKICNpbmNsdWRlICJXZWJLaXQuaCIKICNp
bmNsdWRlICJXZWJLaXRDbGllbnQuaCIKICNpbmNsdWRlICJXZWJXb3JrZXJCYXNlLmgiCisjaW5j
bHVkZSAiV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uaCIKICNpbmNsdWRlICJXb3JrZXJD
b250ZXh0LmgiCiAjaW5jbHVkZSAiV29ya2VyRmlsZVN5c3RlbUNhbGxiYWNrc0JyaWRnZS5oIgog
I2luY2x1ZGUgIldvcmtlclNjcmlwdENvbnRyb2xsZXIuaCIKQEAgLTEzNCw5ICsxMzYsNzYgQEAg
dm9pZCBXb3JrZXJBc3luY0ZpbGVTeXN0ZW1DaHJvbWl1bTo6cmVhZAogICAgIGNyZWF0ZVdvcmtl
ckZpbGVTeXN0ZW1DYWxsYmFja3NCcmlkZ2UoY2FsbGJhY2tzKS0+cG9zdFJlYWREaXJlY3RvcnlU
b01haW5UaHJlYWQobV93ZWJGaWxlU3lzdGVtLCBwYXRoLCBtX21vZGVGb3JDdXJyZW50T3BlcmF0
aW9uKTsKIH0KIAotdm9pZCBXb3JrZXJBc3luY0ZpbGVTeXN0ZW1DaHJvbWl1bTo6Y3JlYXRlV3Jp
dGVyKEFzeW5jRmlsZVdyaXRlckNsaWVudCosIGNvbnN0IFN0cmluZyYsIFBhc3NPd25QdHI8QXN5
bmNGaWxlU3lzdGVtQ2FsbGJhY2tzPikKK2NsYXNzIFdvcmtlckZpbGVXcml0ZXJIZWxwZXJDYWxs
YmFja3MgOiBwdWJsaWMgQXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzIHsKK3B1YmxpYzoKKyAgICBz
dGF0aWMgUGFzc093blB0cjxXb3JrZXJGaWxlV3JpdGVySGVscGVyQ2FsbGJhY2tzPiBjcmVhdGUo
QXN5bmNGaWxlV3JpdGVyQ2xpZW50KiBjbGllbnQsIGNvbnN0IFN0cmluZyYgcGF0aCwgV2ViS2l0
OjpXZWJGaWxlU3lzdGVtKiB3ZWJGaWxlU3lzdGVtLCBQYXNzT3duUHRyPFdlYkNvcmU6OkFzeW5j
RmlsZVN5c3RlbUNhbGxiYWNrcz4gY2FsbGJhY2tzLCBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250
ZXh0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBXb3JrZXJGaWxlV3JpdGVy
SGVscGVyQ2FsbGJhY2tzKGNsaWVudCwgcGF0aCwgd2ViRmlsZVN5c3RlbSwgY2FsbGJhY2tzLCB3
b3JrZXJDb250ZXh0KSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGRpZFN1Y2NlZWQoKQor
ICAgIHsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorCisgICAgdmlydHVh
bCB2b2lkIGRpZFJlYWRNZXRhZGF0YShjb25zdCBGaWxlSW5mbyYgaW5mbykKKyAgICB7CisgICAg
ICAgIEFTU0VSVChtX2NhbGxiYWNrcyk7CisgICAgICAgIGlmIChpbmZvLnR5cGUgIT0gRmlsZUlu
Zm86OlR5cGVGaWxlIHx8IGluZm8ubGVuZ3RoIDwgMCkKKyAgICAgICAgICAgIG1fY2FsbGJhY2tz
LT5kaWRGYWlsKFdlYktpdDo6V2ViRmlsZUVycm9ySW52YWxpZFN0YXRlKTsKKyAgICAgICAgZWxz
ZSB7CisgICAgICAgICAgICBPd25QdHI8V29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0+IGFz
eW5jRmlsZVdyaXRlckNocm9taXVtID0gYWRvcHRQdHIobmV3IFdvcmtlckFzeW5jRmlsZVdyaXRl
ckNocm9taXVtKG1fd2ViRmlsZVN5c3RlbSwgbV9wYXRoLCBtX3dvcmtlckNvbnRleHQsIG1fY2xp
ZW50LCBmYWxzZSkpOworICAgICAgICAgICAgbV9jYWxsYmFja3MtPmRpZENyZWF0ZUZpbGVXcml0
ZXIoYXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0ucmVsZWFzZSgpLCBpbmZvLmxlbmd0aCk7CisgICAg
ICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlkUmVhZERpcmVjdG9yeUVudHJ5KGNv
bnN0IFN0cmluZyYgbmFtZSwgYm9vbCBpc0RpcmVjdG9yeSkKKyAgICB7CisgICAgICAgIEFTU0VS
VF9OT1RfUkVBQ0hFRCgpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBkaWRSZWFkRGlyZWN0
b3J5RW50cmllcyhib29sIGhhc01vcmUpCisgICAgeworICAgICAgICBBU1NFUlRfTk9UX1JFQUNI
RUQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlkT3BlbkZpbGVTeXN0ZW0oY29uc3Qg
U3RyaW5nJiwgUGFzc093blB0cjxBc3luY0ZpbGVTeXN0ZW0+KQorICAgIHsKKyAgICAgICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorCisgICAgLy8gQ2FsbGVkIHdoZW4gYW4gQXN5bmNG
aWxlV3J0ZXIgaGFzIGJlZW4gY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgdmlydHVhbCB2b2lk
IGRpZENyZWF0ZUZpbGVXcml0ZXIoUGFzc093blB0cjxBc3luY0ZpbGVXcml0ZXI+LCBsb25nIGxv
bmcpCisgICAgeworICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisKKyAgICB2
aXJ0dWFsIHZvaWQgZGlkRmFpbChpbnQgY29kZSkKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2Nh
bGxiYWNrcyk7CisgICAgICAgIG1fY2FsbGJhY2tzLT5kaWRGYWlsKGNvZGUpOworICAgIH0KKwor
cHJpdmF0ZToKKyAgICBXb3JrZXJGaWxlV3JpdGVySGVscGVyQ2FsbGJhY2tzKEFzeW5jRmlsZVdy
aXRlckNsaWVudCogY2xpZW50LCBjb25zdCBTdHJpbmcmIHBhdGgsIFdlYktpdDo6V2ViRmlsZVN5
c3RlbSogd2ViRmlsZVN5c3RlbSwgUGFzc093blB0cjxXZWJDb3JlOjpBc3luY0ZpbGVTeXN0ZW1D
YWxsYmFja3M+IGNhbGxiYWNrcywgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCkKKyAgICAg
ICAgOiBtX2NsaWVudChjbGllbnQpCisgICAgICAgICwgbV9wYXRoKHBhdGgpCisgICAgICAgICwg
bV93ZWJGaWxlU3lzdGVtKHdlYkZpbGVTeXN0ZW0pCisgICAgICAgICwgbV9jYWxsYmFja3MoY2Fs
bGJhY2tzKQorICAgICAgICAsIG1fd29ya2VyQ29udGV4dCh3b3JrZXJDb250ZXh0KQorICAgIHsK
KyAgICB9CisKKyAgICBBc3luY0ZpbGVXcml0ZXJDbGllbnQqIG1fY2xpZW50OworICAgIFN0cmlu
ZyBtX3BhdGg7CisgICAgV2ViS2l0OjpXZWJGaWxlU3lzdGVtKiBtX3dlYkZpbGVTeXN0ZW07Cisg
ICAgT3duUHRyPFdlYkNvcmU6OkFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrcz4gbV9jYWxsYmFja3M7
CisgICAgV29ya2VyQ29udGV4dCogbV93b3JrZXJDb250ZXh0OworfTsKKwordm9pZCBXb3JrZXJB
c3luY0ZpbGVTeXN0ZW1DaHJvbWl1bTo6Y3JlYXRlV3JpdGVyKEFzeW5jRmlsZVdyaXRlckNsaWVu
dCogY2xpZW50LCBjb25zdCBTdHJpbmcmIHBhdGgsIFBhc3NPd25QdHI8QXN5bmNGaWxlU3lzdGVt
Q2FsbGJhY2tzPiBjYWxsYmFja3MpCiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICBjcmVh
dGVXb3JrZXJGaWxlU3lzdGVtQ2FsbGJhY2tzQnJpZGdlKFdvcmtlckZpbGVXcml0ZXJIZWxwZXJD
YWxsYmFja3M6OmNyZWF0ZShjbGllbnQsIHBhdGgsIG1fd2ViRmlsZVN5c3RlbSwgY2FsbGJhY2tz
LCBtX3dvcmtlckNvbnRleHQpKS0+cG9zdFJlYWRNZXRhZGF0YVRvTWFpblRocmVhZChtX3dlYkZp
bGVTeXN0ZW0sIHBhdGgsIG1fbW9kZUZvckN1cnJlbnRPcGVyYXRpb24pOwogfQogCiBQYXNzUmVm
UHRyPFdvcmtlckZpbGVTeXN0ZW1DYWxsYmFja3NCcmlkZ2U+IFdvcmtlckFzeW5jRmlsZVN5c3Rl
bUNocm9taXVtOjpjcmVhdGVXb3JrZXJGaWxlU3lzdGVtQ2FsbGJhY2tzQnJpZGdlKFBhc3NPd25Q
dHI8QXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzPiBjYWxsYmFja3MpCkluZGV4OiBXZWJLaXQvY2hy
b21pdW0vc3JjL1dvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtLmNwcAko
cmV2aXNpb24gMCkKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2VyQXN5bmNGaWxlV3JpdGVy
Q2hyb21pdW0uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
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
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIldvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtLmgiCisKKyNpZiBF
TkFCTEUoRklMRV9TWVNURU0pCisKKyNpbmNsdWRlICJBc3luY0ZpbGVTeXN0ZW0uaCIKKyNpbmNs
dWRlICJBc3luY0ZpbGVXcml0ZXJDbGllbnQuaCIKKyNpbmNsdWRlICJCbG9iLmgiCisjaW5jbHVk
ZSAiU2NyaXB0RXhlY3V0aW9uQ29udGV4dC5oIgorI2luY2x1ZGUgIldlYkZpbGVTeXN0ZW0uaCIK
KyNpbmNsdWRlICJXZWJGaWxlV3JpdGVyLmgiCisjaW5jbHVkZSAiV2ViVVJMLmgiCisjaW5jbHVk
ZSAiV2ViV29ya2VyQmFzZS5oIgorI2luY2x1ZGUgIldvcmtlckNvbnRleHQuaCIKKyNpbmNsdWRl
ICJXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmgiCisjaW5jbHVkZSAiV29ya2VyTG9h
ZGVyUHJveHkuaCIKKyNpbmNsdWRlICJXb3JrZXJUaHJlYWQuaCIKKwordXNpbmcgbmFtZXNwYWNl
IFdlYktpdDsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgY29uc3QgY2hhciBmaWxl
V3JpdGVyT3BlcmF0aW9uc01vZGVbXSA9ICJmaWxlV3JpdGVyT3BlcmF0aW9uc01vZGUiOworCitX
b3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bTo6V29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21p
dW0oV2ViRmlsZVN5c3RlbSogd2ViRmlsZVN5c3RlbSwgY29uc3QgU3RyaW5nJiBwYXRoLCBXb3Jr
ZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0LCBBc3luY0ZpbGVXcml0ZXJDbGllbnQqIGNsaWVudCwg
Ym9vbCBzeW5jaHJvbm91cykKKyAgICA6IG1fc3luY2hyb25vdXMoc3luY2hyb25vdXMpCit7Cisg
ICAgQVNTRVJUKCFzeW5jaHJvbm91cyk7IC8vIE5vdCBpbXBsZW1lbnRlZCB5ZXQuCisgICAgV29y
a2VyTG9hZGVyUHJveHkqIHdvcmtlckxvYWRlclByb3h5ID0gJndvcmtlckNvbnRleHQtPnRocmVh
ZCgpLT53b3JrZXJMb2FkZXJQcm94eSgpOworICAgIFdlYldvcmtlckJhc2UqIHdvcmtlciA9IHN0
YXRpY19jYXN0PFdlYldvcmtlckJhc2UqPih3b3JrZXJMb2FkZXJQcm94eSk7CisKKyAgICBTdHJp
bmcgbW9kZSA9IGZpbGVXcml0ZXJPcGVyYXRpb25zTW9kZTsKKyAgICBtb2RlLmFwcGVuZChTdHJp
bmc6Om51bWJlcih3b3JrZXJDb250ZXh0LT50aHJlYWQoKS0+cnVuTG9vcCgpLmNyZWF0ZVVuaXF1
ZUlkKCkpKTsKKyAgICBtX2JyaWRnZSA9IFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6
OmNyZWF0ZSh3ZWJGaWxlU3lzdGVtLCBwYXRoLCB3b3JrZXIsIHdvcmtlckNvbnRleHQsIG1vZGUs
IGNsaWVudCk7Cit9CisKK1dvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtOjp+V29ya2VyQXN5
bmNGaWxlV3JpdGVyQ2hyb21pdW0oKQoreworICAgIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NC
cmlkZ2UqIGJyaWRnZSA9IG1fYnJpZGdlLmdldCgpOworICAgIGJyaWRnZS0+cG9zdFNodXRkb3du
VG9NYWluVGhyZWFkKG1fYnJpZGdlLnJlbGVhc2UoKSk7Cit9CisKK1dlYkZpbGVXcml0ZXJDbGll
bnQqIFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtOjpnZXRNYWluVGhyZWFkQ2xpZW50KCkK
K3sKKyAgICByZXR1cm4gbV9icmlkZ2UuZ2V0KCk7Cit9CisKK3ZvaWQgV29ya2VyQXN5bmNGaWxl
V3JpdGVyQ2hyb21pdW06OndyaXRlKGxvbmcgbG9uZyBwb3NpdGlvbiwgQmxvYiogZGF0YSkKK3sK
KyAgICBtX2JyaWRnZS0+cG9zdFdyaXRlVG9NYWluVGhyZWFkKHBvc2l0aW9uLCBXZWJLaXQ6Oldl
YlVSTChkYXRhLT51cmwoKSkpOworfQorCit2b2lkIFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9t
aXVtOjp0cnVuY2F0ZShsb25nIGxvbmcgbGVuZ3RoKQoreworICAgIG1fYnJpZGdlLT5wb3N0VHJ1
bmNhdGVUb01haW5UaHJlYWQobGVuZ3RoKTsKK30KKwordm9pZCBXb3JrZXJBc3luY0ZpbGVXcml0
ZXJDaHJvbWl1bTo6YWJvcnQoKQoreworICAgIG1fYnJpZGdlLT5wb3N0QWJvcnRUb01haW5UaHJl
YWQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIEVOQUJMRShGSUxFX1NZU1RF
TSkKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21p
dW0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckFzeW5jRmlsZVdy
aXRlckNocm9taXVtLmgJKHJldmlzaW9uIDApCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtl
ckFzeW5jRmlsZVdyaXRlckNocm9taXVtLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsNzYgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
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
aWZuZGVmIFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtX2gKKyNkZWZpbmUgV29ya2VyQXN5
bmNGaWxlV3JpdGVyQ2hyb21pdW1faAorCisjaWYgRU5BQkxFKEZJTEVfU1lTVEVNKQorCisjaW5j
bHVkZSAiQXN5bmNGaWxlV3JpdGVyLmgiCisjaW5jbHVkZSAiV2ViRmlsZUVycm9yLmgiCisjaW5j
bHVkZSAiV2ViRmlsZVdyaXRlckNsaWVudC5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKyNp
bmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgorCituYW1lc3BhY2UgV2ViS2l0IHsKK2NsYXNzIFdl
YkZpbGVTeXN0ZW07CitjbGFzcyBXZWJGaWxlV3JpdGVyOworY2xhc3MgV29ya2VyRmlsZVdyaXRl
ckNhbGxiYWNrc0JyaWRnZTsKK30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBBc3lu
Y0ZpbGVTeXN0ZW07CitjbGFzcyBBc3luY0ZpbGVXcml0ZXJDbGllbnQ7CitjbGFzcyBCbG9iOwor
Y2xhc3MgV29ya2VyQ29udGV4dDsKKworY2xhc3MgV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21p
dW0gOiBwdWJsaWMgQXN5bmNGaWxlV3JpdGVyIHsKK3B1YmxpYzoKKyAgICBXb3JrZXJBc3luY0Zp
bGVXcml0ZXJDaHJvbWl1bShXZWJLaXQ6OldlYkZpbGVTeXN0ZW0qLCBjb25zdCBTdHJpbmcmIHBh
dGgsIFdvcmtlckNvbnRleHQqLCBBc3luY0ZpbGVXcml0ZXJDbGllbnQqLCBib29sIHN5bmNocm9u
b3VzKTsKKyAgICB+V29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0oKTsKKyAgICAKKyAgICBX
ZWJLaXQ6OldlYkZpbGVXcml0ZXJDbGllbnQqIGdldE1haW5UaHJlYWRDbGllbnQoKTsKKworICAg
IC8vIEZpbGVXcml0ZXIKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGUobG9uZyBsb25nIHBvc2l0aW9u
LCBCbG9iKiBkYXRhKTsKKyAgICB2aXJ0dWFsIHZvaWQgdHJ1bmNhdGUobG9uZyBsb25nIGxlbmd0
aCk7CisgICAgdmlydHVhbCB2b2lkIGFib3J0KCk7CisKK3ByaXZhdGU6CisgICAgUmVmUHRyPFdl
YktpdDo6V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gbV9icmlkZ2U7CisgICAgYm9v
bCBtX3N5bmNocm9ub3VzOworfTsKKworfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIEVOQUJM
RShGSUxFX1NZU1RFTSkKKworI2VuZGlmIC8vIEFzeW5jRmlsZVdyaXRlckNocm9taXVtX2gKSW5k
ZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJGaWxlV3JpdGVyQ2Fs
bGJhY2tzQnJpZGdlLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMvV29y
a2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
MjIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
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
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIldvcmtlckZpbGVXcml0ZXJDYWxs
YmFja3NCcmlkZ2UuaCIKKworI2lmIEVOQUJMRShGSUxFX1NZU1RFTSkKKworI2luY2x1ZGUgIkFz
eW5jRmlsZVdyaXRlckNsaWVudC5oIgorI2luY2x1ZGUgIkNyb3NzVGhyZWFkVGFzay5oIgorI2lu
Y2x1ZGUgIldlYkNTdHJpbmcuaCIKKyNpbmNsdWRlICJXZWJGaWxlU3lzdGVtLmgiCisjaW5jbHVk
ZSAiV2ViRmlsZVdyaXRlci5oIgorI2luY2x1ZGUgIldlYldvcmtlckJhc2UuaCIKKyNpbmNsdWRl
ICJXb3JrZXJDb250ZXh0LmgiCisjaW5jbHVkZSAiV29ya2VyVGhyZWFkLmgiCisjaW5jbHVkZSA8
d3RmL01haW5UaHJlYWQuaD4KKyNpbmNsdWRlIDx3dGYvVGhyZWFkaW5nLmg+CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQ3Jvc3NUaHJlYWRDb3BpZXJCYXNlPGZh
bHNlLCBmYWxzZSwgV2ViS2l0OjpXZWJVUkw+IHsKKyAgICB0eXBlZGVmIFdlYktpdDo6V2ViVVJM
IFR5cGU7CisgICAgc3RhdGljIFR5cGUgY29weShjb25zdCBXZWJLaXQ6OldlYlVSTCYgdXJsKQor
ICAgIHsKKyAgICAgICAgV2ViS2l0OjpXZWJDU3RyaW5nIHNwZWM7CisgICAgICAgIHNwZWMuYXNz
aWduKHVybC5zcGVjKCkuZGF0YSgpLCB1cmwuc3BlYygpLmxlbmd0aCgpKTsKKyAgICAgICAgY29u
c3QgdXJsX3BhcnNlOjpQYXJzZWQmIHBhcnNlZCA9IHVybC5wYXJzZWQoKTsKKyAgICAgICAgYm9v
bCBpc1ZhbGlkID0gdXJsLmlzVmFsaWQoKTsKKworICAgICAgICByZXR1cm4gV2ViS2l0OjpXZWJV
Ukwoc3BlYywgcGFyc2VkLCBpc1ZhbGlkKTsKKyAgICB9Cit9OworCisvKgordGVtcGxhdGU8PiBz
dHJ1Y3QgQ3Jvc3NUaHJlYWRDb3BpZXJCYXNlPGZhbHNlLCBmYWxzZSwgUGFzc1JlZlB0cjxXZWJL
aXQ6OldvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+ID4geworICAgIHR5cGVkZWYgUGFz
c1JlZlB0cjxXZWJLaXQ6OldvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+IFR5cGU7Cisg
ICAgc3RhdGljIFR5cGUgY29weShjb25zdCBQYXNzUmVmUHRyPFdlYktpdDo6V29ya2VyRmlsZVdy
aXRlckNhbGxiYWNrc0JyaWRnZT4mIGJyaWRnZSkKKyAgICB7CisgICAgICAgIFR5cGUgbmV3UmVm
KGJyaWRnZS5nZXQoKSk7CisgICAgICAgIHJldHVybiBuZXdSZWY7CisgICAgfQorfTsKKyovCisK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK25h
bWVzcGFjZSBXZWJLaXQgeworCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6
Om5vdGlmeVN0b3AoKQoreworICAgIEFTU0VSVChtX3dvcmtlckNvbnRleHQtPmlzQ29udGV4dFRo
cmVhZCgpKTsKKyAgICBtX2NsaWVudE9uV29ya2VyVGhyZWFkID0gMDsKK30KKwordm9pZCBXb3Jr
ZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpwb3N0V3JpdGVUb01haW5UaHJlYWQobG9uZyBs
b25nIHBvc2l0aW9uLCBjb25zdCBXZWJVUkwmIGRhdGEpCit7CisgICAgZGlzcGF0Y2hUYXNrVG9N
YWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmd3JpdGVPbk1haW5UaHJlYWQsIHRoaXMsIHBv
c2l0aW9uLCBkYXRhKSk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRn
ZTo6cG9zdFRydW5jYXRlVG9NYWluVGhyZWFkKGxvbmcgbG9uZyBsZW5ndGgpCit7CisgICAgZGlz
cGF0Y2hUYXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmdHJ1bmNhdGVPbk1haW5U
aHJlYWQsIHRoaXMsIGxlbmd0aCkpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFj
a3NCcmlkZ2U6OnBvc3RBYm9ydFRvTWFpblRocmVhZCgpCit7CisgICAgZGlzcGF0Y2hUYXNrVG9N
YWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmYWJvcnRPbk1haW5UaHJlYWQsIHRoaXMpKTsK
K30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpwb3N0U2h1dGRvd25U
b01haW5UaHJlYWQoCisgICAgICAgIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNr
c0JyaWRnZT4gYnJpZGdlKQoreworICAgIEFTU0VSVCghbV9jbGllbnRPbldvcmtlclRocmVhZCk7
CisgICAgZGlzcGF0Y2hUYXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmc2h1dGRv
d25Pbk1haW5UaHJlYWQsIGJyaWRnZS5nZXQoKSkpOworICAgIE11dGV4TG9ja2VyIGxvY2tlciht
X211dGV4KTsKKyAgICBtX3dvcmtlciA9IDA7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNh
bGxiYWNrc0JyaWRnZTo6d3JpdGVPbk1haW5UaHJlYWQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCos
IFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gYnJpZGdlLCBsb25n
IGxvbmcgcG9zaXRpb24sIGNvbnN0IFdlYlVSTCYgZGF0YSkKK3sKKyAgICBicmlkZ2UtPm1fd3Jp
dGVyLT53cml0ZShwb3NpdGlvbiwgZGF0YSk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNh
bGxiYWNrc0JyaWRnZTo6dHJ1bmNhdGVPbk1haW5UaHJlYWQoU2NyaXB0RXhlY3V0aW9uQ29udGV4
dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gYnJpZGdlLCBs
b25nIGxvbmcgbGVuZ3RoKQoreworICAgIGJyaWRnZS0+bV93cml0ZXItPnRydW5jYXRlKGxlbmd0
aCk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6YWJvcnRPbk1h
aW5UaHJlYWQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdy
aXRlckNhbGxiYWNrc0JyaWRnZT4gYnJpZGdlKQoreworICAgIGJyaWRnZS0+bV93cml0ZXItPmNh
bmNlbCgpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OnNodXRk
b3duT25NYWluVGhyZWFkKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPFdvcmtl
ckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+IGJyaWRnZSkKK3sKKyAgICBicmlkZ2UtPm1fc2h1
dHRpbmdEb3duT25NYWluVGhyZWFkID0gdHJ1ZTsKKyAgICBicmlkZ2UtPm1fd3JpdGVyLmNsZWFy
KCk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6ZGlkV3JpdGUo
bG9uZyBsb25nIGJ5dGVzLCBib29sIGNvbXBsZXRlKQoreworICAgIG1heVBvc3RUYXNrVG9Xb3Jr
ZXIoY3JlYXRlQ2FsbGJhY2tUYXNrKCZkaWRXcml0ZU9uV29ya2VyVGhyZWFkLCB0aGlzLCBieXRl
cywgY29tcGxldGUpKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdl
OjpkaWRGYWlsKFdlYkZpbGVFcnJvciBlcnJvcikKK3sKKyAgICBtYXlQb3N0VGFza1RvV29ya2Vy
KGNyZWF0ZUNhbGxiYWNrVGFzaygmZGlkRmFpbE9uV29ya2VyVGhyZWFkLCB0aGlzLCBlcnJvcikp
OworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OmRpZFRydW5jYXRl
KCkKK3sKKyAgICBtYXlQb3N0VGFza1RvV29ya2VyKGNyZWF0ZUNhbGxiYWNrVGFzaygmZGlkVHJ1
bmNhdGVPbldvcmtlclRocmVhZCwgdGhpcykpOworfQorCitXb3JrZXJGaWxlV3JpdGVyQ2FsbGJh
Y2tzQnJpZGdlOjpXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlKFdlYkZpbGVTeXN0ZW0q
IHdlYkZpbGVTeXN0ZW0sIGNvbnN0IFN0cmluZyYgcGF0aCwgV2ViV29ya2VyQmFzZSogd29ya2Vy
LCBTY3JpcHRFeGVjdXRpb25Db250ZXh0KiBzY3JpcHRFeGVjdXRpb25Db250ZXh0LCBjb25zdCBT
dHJpbmcmIG1vZGUsIEFzeW5jRmlsZVdyaXRlckNsaWVudCogY2xpZW50KQorICAgIDogV29ya2Vy
Q29udGV4dDo6T2JzZXJ2ZXIoc3RhdGljX2Nhc3Q8V29ya2VyQ29udGV4dCo+KHNjcmlwdEV4ZWN1
dGlvbkNvbnRleHQpKQorICAgICwgbV9zaHV0dGluZ0Rvd25Pbk1haW5UaHJlYWQoZmFsc2UpCisg
ICAgLCBtX3dlYkZpbGVTeXN0ZW0od2ViRmlsZVN5c3RlbSkKKyAgICAsIG1fcGF0aChwYXRoLnRo
cmVhZHNhZmVDb3B5KCkpCisgICAgLCBtX3dvcmtlcih3b3JrZXIpCisgICAgLCBtX3dvcmtlckNv
bnRleHQoc2NyaXB0RXhlY3V0aW9uQ29udGV4dCkKKyAgICAsIG1fbW9kZShtb2RlLnRocmVhZHNh
ZmVDb3B5KCkpCisgICAgLCBtX2NsaWVudE9uV29ya2VyVGhyZWFkKGNsaWVudCkKK3sKKyAgICBB
U1NFUlQobV93b3JrZXJDb250ZXh0LT5pc0NvbnRleHRUaHJlYWQoKSk7Cit9CisKK1dvcmtlckZp
bGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6On5Xb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdl
KCkKK3sKKyAgICBBU1NFUlQoIW1fY2xpZW50T25Xb3JrZXJUaHJlYWQpOworICAgIEFTU0VSVCgh
bV93cml0ZXIpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OmRp
ZFdyaXRlT25Xb3JrZXJUaHJlYWQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFdvcmtlckZpbGVX
cml0ZXJDYWxsYmFja3NCcmlkZ2UqIGJyaWRnZSwgbG9uZyBsb25nIGxlbmd0aCwgYm9vbCBjb21w
bGV0ZSkKK3sKKyAgICBicmlkZ2UtPm1fY2xpZW50T25Xb3JrZXJUaHJlYWQtPmRpZFdyaXRlKGxl
bmd0aCwgY29tcGxldGUpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlk
Z2U6OmRpZEZhaWxPbldvcmtlclRocmVhZChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgV29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZSogYnJpZGdlLCBXZWJGaWxlRXJyb3IgZXJyb3IpCit7
CisgICAgYnJpZGdlLT5tX2NsaWVudE9uV29ya2VyVGhyZWFkLT5kaWRGYWlsKGVycm9yKTsKK30K
Kwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpkaWRUcnVuY2F0ZU9uV29y
a2VyVGhyZWFkKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJh
Y2tzQnJpZGdlKiBicmlkZ2UpCit7CisgICAgYnJpZGdlLT5tX2NsaWVudE9uV29ya2VyVGhyZWFk
LT5kaWRUcnVuY2F0ZSgpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlk
Z2U6OmluaXRXZWJGaWxlV3JpdGVyKCkKK3sKKyAgICBBU1NFUlQoIW1fc2h1dHRpbmdEb3duT25N
YWluVGhyZWFkKTsKKyAgICBBU1NFUlQoIW1fd3JpdGVyKTsKKyAgICBtX3dyaXRlciA9IGFkb3B0
UHRyKG1fd2ViRmlsZVN5c3RlbS0+Y3JlYXRlRmlsZVdyaXRlcihtX3BhdGgsIHRoaXMpKTsKK30K
Kwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpydW5UYXNrT25NYWluVGhy
ZWFkKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIHNjcmlwdEV4ZWN1dGlvbkNvbnRl
eHQsIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gYnJpZGdlLCBQ
YXNzT3duUHRyPFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2s+IHRhc2tUb1J1
bikKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworICAgIGlmICghYnJpZGdlLT5tX3dy
aXRlciAmJiAhYnJpZGdlLT5tX3NodXR0aW5nRG93bk9uTWFpblRocmVhZCkKKyAgICAgICAgYnJp
ZGdlLT5pbml0V2ViRmlsZVdyaXRlcigpOworCisgICAgaWYgKGJyaWRnZS0+bV93cml0ZXIpCisg
ICAgICAgIHRhc2tUb1J1bi0+cGVyZm9ybVRhc2soc2NyaXB0RXhlY3V0aW9uQ29udGV4dCk7Cit9
CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6cnVuVGFza09uV29ya2Vy
VGhyZWFkKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIHNjcmlwdEV4ZWN1dGlvbkNv
bnRleHQsIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gYnJpZGdl
LCBQYXNzT3duUHRyPFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2s+IHRhc2tU
b1J1bikKK3sKKyAgICBBU1NFUlQoYnJpZGdlLT5tX3dvcmtlckNvbnRleHQtPmlzQ29udGV4dFRo
cmVhZCgpKTsKKyAgICBpZiAoIWJyaWRnZS0+bV9jbGllbnRPbldvcmtlclRocmVhZCkKKyAgICAg
ICAgcmV0dXJuOworICAgIEFTU0VSVChicmlkZ2UtPm1fd29ya2VyKTsKKyAgICB0YXNrVG9SdW4t
PnBlcmZvcm1UYXNrKHNjcmlwdEV4ZWN1dGlvbkNvbnRleHQpOworfQorCit2b2lkIFdvcmtlckZp
bGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OmRpc3BhdGNoVGFza1RvTWFpblRocmVhZChQYXNzT3du
UHRyPFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2s+IHRhc2spCit7CisgICAg
QVNTRVJUKG1fd29ya2VyKTsgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIHJlcXVlc3RzIGFmdGVyIHNo
dXRkb3duLgorICAgIEFTU0VSVChtX3dvcmtlckNvbnRleHQtPmlzQ29udGV4dFRocmVhZCgpKTsK
KyAgICBtX3dvcmtlci0+ZGlzcGF0Y2hUYXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFz
aygmcnVuVGFza09uTWFpblRocmVhZCwgdGhpcywgdGFzaykpOworfQorCit2b2lkIFdvcmtlckZp
bGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6Om1heVBvc3RUYXNrVG9Xb3JrZXIoUGFzc093blB0cjxT
Y3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPiB0YXNrKQoreworICAgIEFTU0VSVChpc01haW5U
aHJlYWQoKSk7CisgICAgTXV0ZXhMb2NrZXIgbG9ja2VyKG1fbXV0ZXgpOyAvLyBtX3dvcmtlciBn
ZXRzIGNsZWFyZWQgb24gdGhlIGNvbnRleHQgdGhyZWFkLgorICAgIGlmIChtX3dvcmtlcikKKyAg
ICAgICAgbV93b3JrZXItPnBvc3RUYXNrRm9yTW9kZVRvV29ya2VyQ29udGV4dChjcmVhdGVDYWxs
YmFja1Rhc2soJnJ1blRhc2tPbldvcmtlclRocmVhZCwgdGhpcywgdGFzayksIG1fbW9kZSk7Cit9
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIEVOQUJMRShGSUxFX1NZU1RF
TSkKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0Jy
aWRnZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2VyRmlsZVdyaXRl
ckNhbGxiYWNrc0JyaWRnZS5oCShyZXZpc2lvbiAwKQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9X
b3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEs
MTQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMg
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
Ki8KKworI2lmbmRlZiBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlX2gKKyNkZWZpbmUg
V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZV9oCisKKyNpZiBFTkFCTEUoRklMRV9TWVNU
RU0pCisKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIldlYkZpbGVFcnJv
ci5oIgorI2luY2x1ZGUgIldlYkZpbGVXcml0ZXJDbGllbnQuaCIKKyNpbmNsdWRlICJXb3JrZXJD
b250ZXh0LmgiCisjaW5jbHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvUGFz
c1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9UaHJlYWRpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNv
cmUgeworY2xhc3MgQXN5bmNGaWxlV3JpdGVyQ2xpZW50OworfQorCituYW1lc3BhY2UgV2ViS2l0
IHsKKworY2xhc3MgV2ViRmlsZVN5c3RlbTsKK2NsYXNzIFdlYkZpbGVXcml0ZXI7CitjbGFzcyBX
ZWJGaWxlV3JpdGVyQ2xpZW50OworY2xhc3MgV2ViVVJMOworY2xhc3MgV2ViV29ya2VyQmFzZTsK
KworLy8gVGhpcyBjbGFzcyBpcyB1c2VkIGFzIGEgbWVjaGFuaXNtIHRvIGJyaWRnZSBjYWxscyBi
ZXR3ZWVuIHRocmVhZHMuCisvLyBDYWxscyB0byBhIFdlYkZpbGVXcml0ZXIgbXVzdCBoYXBwZW4g
b24gdGhlIG1haW4gdGhyZWFkLCBidXQgdGhleSBjb21lIGZyb20KKy8vIHRoZSBjb250ZXh0IHRo
cmVhZC4gIFRoZSByZXNwb25zZXMgdGhyb3VnaCB0aGUgV2ViRmlsZVdyaXRlckNsaWVudCBpbnRl
cmZhY2UKKy8vIHN0YXJ0IG9uIHRoZSBtYWluIHRocmVhZCwgYnV0IG11c3QgYmUgc2VudCB2aWEg
dGhlIHdvcmtlciBjb250ZXh0IHRocmVhZC4KKy8vCisvLyBBIHR5cGljYWwgZmxvdyBmb3Igd3Jp
dGUgd291bGQgbG9vayBsaWtlIHRoaXM6CisvLyBCcmlkZ2U6OnBvc3RXcml0ZVRvTWFpblRocmVh
ZCgpIG9uIFdvcmtlclRocmVhZAorLy8gIC0tPiBCcmlkZ2U6OndyaXRlT25NYWluVGhyZWFkKCkg
aXMgY2FsbGVkIG9uIE1haW5UaHJlYWQKKy8vICAtLT4gV2ViRmlsZVdyaXRlcjo6d3JpdGUoKQor
Ly8gICAgICBUaGlzIG1ha2VzIGFuIElQQzsgdGhlIGFjdHVhbCBvcGVyYXRpb24gaXMgZG93biBp
biB0aGUgYnJvd3Nlci4KKy8vICAtLT4gQnJpZGdlOjpkaWRXcml0ZSBpcyBjYWxsZWQgb24gTWFp
blRocmVhZAorLy8gIC0tPiBCcmlkZ2U6OmRpZFdyaXRlT25Xb3JrZXJUaHJlYWQgaXMgY2FsbGVk
IG9uIFdvcmtlclRocmVhZAorLy8gICAgICBUaGlzIGNhbGxzIHRoZSBvcmlnaW5hbCBjbGllbnQg
KG1fY2xpZW50T25Xb3JrZXJUaHJlYWQpLgorY2xhc3MgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNr
c0JyaWRnZSA6IHB1YmxpYyBUaHJlYWRTYWZlU2hhcmVkPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFj
a3NCcmlkZ2U+LCBwdWJsaWMgV2ViQ29yZTo6V29ya2VyQ29udGV4dDo6T2JzZXJ2ZXIsIHB1Ymxp
YyBXZWJGaWxlV3JpdGVyQ2xpZW50IHsKK3B1YmxpYzoKKyAgICB+V29ya2VyRmlsZVdyaXRlckNh
bGxiYWNrc0JyaWRnZSgpOworCisgICAgLy8gV29ya2VyQ29udGV4dDo6T2JzZXJ2ZXIgbWV0aG9k
LgorICAgIHZpcnR1YWwgdm9pZCBub3RpZnlTdG9wKCk7CisKKyAgICBzdGF0aWMgUGFzc1JlZlB0
cjxXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlPiBjcmVhdGUoV2ViRmlsZVN5c3RlbSog
d2ViRmlsZVN5c3RlbSwgY29uc3QgU3RyaW5nJiBwYXRoLCBXZWJXb3JrZXJCYXNlKiB3b3JrZXIs
IFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIHdvcmtlckNvbnRleHQsIGNvbnN0IFN0
cmluZyYgbW9kZSwgV2ViQ29yZTo6QXN5bmNGaWxlV3JpdGVyQ2xpZW50KiBjbGllbnQpCisgICAg
eworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NC
cmlkZ2Uod2ViRmlsZVN5c3RlbSwgcGF0aCwgd29ya2VyLCB3b3JrZXJDb250ZXh0LCBtb2RlLCBj
bGllbnQpKTsKKyAgICB9CisKKyAgICAvLyBNZXRob2RzIHRoYXQgY3JlYXRlIGFuIGluc3RhbmNl
IGFuZCBwb3N0IGFuIGluaXRpYWwgcmVxdWVzdCB0YXNrIHRvIHRoZSBtYWluIHRocmVhZC4gVGhl
eSBtdXN0IGJlIGNhbGxlZCBvbiB0aGUgd29ya2VyIHRocmVhZC4KKyAgICB2b2lkIHBvc3RXcml0
ZVRvTWFpblRocmVhZChsb25nIGxvbmcgcG9zaXRpb24sIGNvbnN0IFdlYlVSTCYgZGF0YSk7Cisg
ICAgdm9pZCBwb3N0VHJ1bmNhdGVUb01haW5UaHJlYWQobG9uZyBsb25nIGxlbmd0aCk7CisgICAg
dm9pZCBwb3N0QWJvcnRUb01haW5UaHJlYWQoKTsKKworICAgIC8vIFRoZSBvd25pbmcgV29ya2Vy
QXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0gc2hvdWxkIHVzZSB0aGlzIG1ldGhvZCB0byBnaXZlCisg
ICAgLy8gYXdheSBpdHMgbGFzdCByZWZlcmVuY2UgdG8gdGhlIGJyaWRnZSBhdCBkZWxldGlvbiB0
aW1lLCBvbiB0aGUgY29udGV4dAorICAgIC8vIHRocmVhZC4gIFlvdSBtdXN0IGhhdmUgY2FsbGVk
IHN0b3AoKSBiZWZvcmUgY2FsbGluZyB0aGlzLgorICAgIHZvaWQgcG9zdFNodXRkb3duVG9NYWlu
VGhyZWFkKFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4pOworCisg
ICAgLy8gQ2FsbGJhY2sgbWV0aG9kcyB0aGF0IGFyZSBjYWxsZWQgb24gdGhlIG1haW4gdGhyZWFk
LgorICAgIC8vIFRoZXNlIGFyZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgV2ViS2l0OjpXZWJGaWxl
V3JpdGVyQ2xpZW50LgorICAgIHZvaWQgZGlkV3JpdGUobG9uZyBsb25nIGJ5dGVzLCBib29sIGNv
bXBsZXRlKTsKKyAgICB2b2lkIGRpZEZhaWwoV2ViRmlsZUVycm9yKTsKKyAgICB2b2lkIGRpZFRy
dW5jYXRlKCk7CisKK3ByaXZhdGU6CisgICAgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRn
ZShXZWJGaWxlU3lzdGVtKiwgY29uc3QgU3RyaW5nJiBwYXRoLCBXZWJXb3JrZXJCYXNlKiwgV2Vi
Q29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIGNvbnN0IFN0cmluZyYgbW9kZSwgV2ViQ29y
ZTo6QXN5bmNGaWxlV3JpdGVyQ2xpZW50Kik7CisKKyAgICAvLyBNZXRob2RzIHRoYXQgYXJlIHRv
IGJlIGNhbGxlZCBvbiB0aGUgbWFpbiB0aHJlYWQuCisgICAgc3RhdGljIHZvaWQgd3JpdGVPbk1h
aW5UaHJlYWQoV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29y
a2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4sIGxvbmcgbG9uZyBwb3NpdGlvbiwgY29uc3Qg
V2ViVVJMJiBkYXRhKTsKKyAgICBzdGF0aWMgdm9pZCB0cnVuY2F0ZU9uTWFpblRocmVhZChXZWJD
b3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVy
Q2FsbGJhY2tzQnJpZGdlPiwgbG9uZyBsb25nIGxlbmd0aCk7CisgICAgc3RhdGljIHZvaWQgYWJv
cnRPbk1haW5UaHJlYWQoV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQ
dHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4pOworICAgIHN0YXRpYyB2b2lkIHNo
dXRkb3duT25NYWluVGhyZWFkKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNz
UmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+KTsKKworICAgIGZyaWVuZCBj
bGFzcyBNYWluVGhyZWFkRmlsZVdyaXRlckNsaWVudDsKKworICAgIC8vIE1ldGhvZHMgdGhhdCBk
aXNwYXRjaCB0byBBc3luY0ZpbGVXcml0ZXJDbGllbnQgb24gdGhlIHdvcmtlciB0aHJlYWRzLgor
ICAgIC8vIFRoZXkgcmVsZWFzZSBhIHNlbGZSZWYgb2YgdGhlIFdvcmtlckZpbGVXcml0ZXJDYWxs
YmFja3NCcmlkZ2UuCisgICAgc3RhdGljIHZvaWQgZGlkV3JpdGVPbldvcmtlclRocmVhZChXZWJD
b3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0Jy
aWRnZSosIGxvbmcgbG9uZyBsZW5ndGgsIGJvb2wgY29tcGxldGUpOworICAgIHN0YXRpYyB2b2lk
IGRpZEZhaWxPbldvcmtlclRocmVhZChXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0Kiwg
V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZSosIFdlYkZpbGVFcnJvcik7CisgICAgc3Rh
dGljIHZvaWQgZGlkVHJ1bmNhdGVPbldvcmtlclRocmVhZChXZWJDb3JlOjpTY3JpcHRFeGVjdXRp
b25Db250ZXh0KiwgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZSopOworCisgICAgLy8g
TGF6eSBpbml0aWFsaXphdGlvbiBvZiB0aGUgV2ViRmlsZVdyaXRlci4KKyAgICB2b2lkIGluaXRX
ZWJGaWxlV3JpdGVyKCk7CisgICAgc3RhdGljIHZvaWQgcnVuVGFza09uTWFpblRocmVhZChXZWJD
b3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVy
Q2FsbGJhY2tzQnJpZGdlPiwgUGFzc093blB0cjxXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250
ZXh0OjpUYXNrPik7CisgICAgc3RhdGljIHZvaWQgcnVuVGFza09uV29ya2VyVGhyZWFkKFdlYkNv
cmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJD
YWxsYmFja3NCcmlkZ2U+LCBQYXNzT3duUHRyPFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRl
eHQ6OlRhc2s+KTsKKworICAgIHZvaWQgZGlzcGF0Y2hUYXNrVG9NYWluVGhyZWFkKFBhc3NPd25Q
dHI8V2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6VGFzaz4pOworICAgIHZvaWQgbWF5
UG9zdFRhc2tUb1dvcmtlcihQYXNzT3duUHRyPFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRl
eHQ6OlRhc2s+KTsKKworICAgIC8vIFVzZWQgdG8gcHJvdGVjdCBhY2Nlc3MgdG8gbV93b3JrZXIu
CisgICAgTXV0ZXggbV9tdXRleDsKKyAgICAvLyBJbmRpY2F0ZXMgdGhhdCBtX3dyaXRlciBpcyBn
b25lIGR1ZSB0byBzaHV0ZG93bi4gIFdpdGhvdXQgdGhpcyBmbGFnIHNldCwgaWYgaXQncyBub3Qg
dGhlcmUsIHRoZSBtYWluIHRocmVhZCB3aWxsIGxhemlseSBjcmVhdGUgb25lLgorICAgIGJvb2wg
bV9zaHV0dGluZ0Rvd25Pbk1haW5UaHJlYWQ7CisgICAgV2ViRmlsZVN5c3RlbSogbV93ZWJGaWxl
U3lzdGVtOworICAgIFN0cmluZyBtX3BhdGg7CisgICAgLy8gQ3JlYXRlZCBhbmQgY2xlYXJlZCBv
biB0aGUgY29udGV4dCB0aHJlYWQsIGJ1dCBhbHNvIHVzZWQgZnJvbSB0aGUgbWFpbiB0aHJlYWQu
CisgICAgV2ViV29ya2VyQmFzZSogbV93b3JrZXI7CisgICAgV2ViQ29yZTo6U2NyaXB0RXhlY3V0
aW9uQ29udGV4dCogbV93b3JrZXJDb250ZXh0OworICAgIC8vIENyZWF0ZWQgYW5kIGRlc3Ryb3ll
ZCBmcm9tIHRoZSBtYWluIHRocmVhZC4gIFRvIGRyb3AgeW91ciBsYXN0IHJlZmVyZW5jZSB0byBh
IFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UsIHJlbGVhc2UgaXQgdG8gcG9zdFNodXRk
b3duVG9NYWluVGhyZWFkIHRvIGdpdmUgdGhlIGJyaWRnZSB0aGUgY2hhbmNlIHRvIGNsZWFuIHVw
IG1fd3JpdGVyLgorICAgIE93blB0cjxXZWJLaXQ6OldlYkZpbGVXcml0ZXI+IG1fd3JpdGVyOwor
ICAgIFN0cmluZyBtX21vZGU7CisKKyAgICBXZWJDb3JlOjpBc3luY0ZpbGVXcml0ZXJDbGllbnQq
IG1fY2xpZW50T25Xb3JrZXJUaHJlYWQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisK
KyNlbmRpZgorCisjZW5kaWYgLy8gV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZV9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>72273</attachid>
            <date>2010-10-28 17:44:50 -0700</date>
            <delta_ts>2010-11-09 16:53:16 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-47681-20101028174449.patch</filename>
            <type>text/plain</type>
            <size>28177</size>
            <attacher name="Eric U.">ericu</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2No
cm9taXVtL0NoYW5nZUxvZwkocmV2aXNpb24gNzA4MTkpCisrKyBXZWJLaXQvY2hyb21pdW0vQ2hh
bmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjMgQEAKKzIwMTAtMTAtMjggIEVyaWMg
VWhyaGFuZSAgPGVyaWN1QGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBbQ2hyb21pdW1dIGltcGxlbWVudGF0aW9uIG9mIGFzeW5j
IEZpbGVXcml0ZXIgZm9yIHdvcmtlcnMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTQ3NjgxCisKKyAgICAgICAgVGVzdHMgYXJlIGluIGEgc2VwYXJhdGUg
Y2hhbmdlbGlzdC4KKworICAgICAgICBBZGRlZCBuZXcgZmlsZXMuCisgICAgICAgICogV2ViS2l0
Lmd5cDoKKworICAgICAgICAqIHNyYy9Xb3JrZXJBc3luY0ZpbGVTeXN0ZW1DaHJvbWl1bS5jcHA6
IEFkZGVkIFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtIGNvbnN0cnVjdGlvbi4KKyAgICAg
ICAgKiBzcmMvV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uY3BwOiBBZGRlZC4KKyAgICAg
ICAgKiBzcmMvV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uaDogQWRkZWQuCisKKyAgICAg
ICAgVGhpcyBjbGFzcyBicmlkZ2VzIGJldHdlZW4gdGhlIGNvbnRleHQgYW5kIG1haW4gdGhyZWFk
cyBmb3IgdGhlIFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtLgorICAgICAgICAqIHNyYy9X
b3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmNwcDogQWRkZWQuCisgICAgICAgICogc3Jj
L1dvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuaDogQWRkZWQuCisKIDIwMTAtMTAtMjgg
IEtpbnVrbyBZYXN1ZGEgIDxraW51a29AY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2Vk
IGJ5IERhdmlkIExldmluLgpJbmRleDogV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAJKHJldmlzaW9uIDcwODE5KQorKysg
V2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAJKHdvcmtpbmcgY29weSkKQEAgLTU0Niw4ICs1NDYs
MTIgQEAKICAgICAgICAgICAgICAgICAnc3JjL1dlYldvcmtlckltcGwuaCcsCiAgICAgICAgICAg
ICAgICAgJ3NyYy9Xb3JrZXJBc3luY0ZpbGVTeXN0ZW1DaHJvbWl1bS5jcHAnLAogICAgICAgICAg
ICAgICAgICdzcmMvV29ya2VyQXN5bmNGaWxlU3lzdGVtQ2hyb21pdW0uaCcsCisgICAgICAgICAg
ICAgICAgJ3NyYy9Xb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5jcHAnLAorICAgICAgICAg
ICAgICAgICdzcmMvV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uaCcsCiAgICAgICAgICAg
ICAgICAgJ3NyYy9Xb3JrZXJGaWxlU3lzdGVtQ2FsbGJhY2tzQnJpZGdlLmNwcCcsCiAgICAgICAg
ICAgICAgICAgJ3NyYy9Xb3JrZXJGaWxlU3lzdGVtQ2FsbGJhY2tzQnJpZGdlLmgnLAorICAgICAg
ICAgICAgICAgICdzcmMvV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5jcHAnLAorICAg
ICAgICAgICAgICAgICdzcmMvV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5oJywKICAg
ICAgICAgICAgICAgICAnc3JjL1dyYXBwZWRSZXNvdXJjZVJlcXVlc3QuaCcsCiAgICAgICAgICAg
ICAgICAgJ3NyYy9XcmFwcGVkUmVzb3VyY2VSZXNwb25zZS5oJywKICAgICAgICAgICAgICAgICAn
c3JjL3dpbi9XZWJJbnB1dEV2ZW50RmFjdG9yeS5jcHAnLApJbmRleDogV2ViS2l0L2Nocm9taXVt
L3NyYy9Xb3JrZXJBc3luY0ZpbGVTeXN0ZW1DaHJvbWl1bS5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
S2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJBc3luY0ZpbGVTeXN0ZW1DaHJvbWl1bS5jcHAJKHJldmlz
aW9uIDcwODE5KQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJBc3luY0ZpbGVTeXN0ZW1D
aHJvbWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM0LDEzICszNCwxNiBAQAogI2lmIEVOQUJM
RShGSUxFX1NZU1RFTSkKIAogI2luY2x1ZGUgIkFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrcy5oIgor
I2luY2x1ZGUgIkZpbGVNZXRhZGF0YS5oIgogI2luY2x1ZGUgIkZpbGVTeXN0ZW0uaCIKICNpbmNs
dWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1ZGUgIldlYkZpbGVTeXN0ZW0uaCIKICNpbmNs
dWRlICJXZWJGaWxlU3lzdGVtQ2FsbGJhY2tzSW1wbC5oIgorI2luY2x1ZGUgIldlYkZpbGVXcml0
ZXIuaCIKICNpbmNsdWRlICJXZWJLaXQuaCIKICNpbmNsdWRlICJXZWJLaXRDbGllbnQuaCIKICNp
bmNsdWRlICJXZWJXb3JrZXJCYXNlLmgiCisjaW5jbHVkZSAiV29ya2VyQXN5bmNGaWxlV3JpdGVy
Q2hyb21pdW0uaCIKICNpbmNsdWRlICJXb3JrZXJDb250ZXh0LmgiCiAjaW5jbHVkZSAiV29ya2Vy
RmlsZVN5c3RlbUNhbGxiYWNrc0JyaWRnZS5oIgogI2luY2x1ZGUgIldvcmtlclNjcmlwdENvbnRy
b2xsZXIuaCIKQEAgLTEzNCw5ICsxMzcsNzYgQEAgdm9pZCBXb3JrZXJBc3luY0ZpbGVTeXN0ZW1D
aHJvbWl1bTo6cmVhZAogICAgIGNyZWF0ZVdvcmtlckZpbGVTeXN0ZW1DYWxsYmFja3NCcmlkZ2Uo
Y2FsbGJhY2tzKS0+cG9zdFJlYWREaXJlY3RvcnlUb01haW5UaHJlYWQobV93ZWJGaWxlU3lzdGVt
LCBwYXRoLCBtX21vZGVGb3JDdXJyZW50T3BlcmF0aW9uKTsKIH0KIAotdm9pZCBXb3JrZXJBc3lu
Y0ZpbGVTeXN0ZW1DaHJvbWl1bTo6Y3JlYXRlV3JpdGVyKEFzeW5jRmlsZVdyaXRlckNsaWVudCos
IGNvbnN0IFN0cmluZyYsIFBhc3NPd25QdHI8QXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzPikKK2Ns
YXNzIFdvcmtlckZpbGVXcml0ZXJIZWxwZXJDYWxsYmFja3MgOiBwdWJsaWMgQXN5bmNGaWxlU3lz
dGVtQ2FsbGJhY2tzIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc093blB0cjxXb3JrZXJGaWxl
V3JpdGVySGVscGVyQ2FsbGJhY2tzPiBjcmVhdGUoQXN5bmNGaWxlV3JpdGVyQ2xpZW50KiBjbGll
bnQsIGNvbnN0IFN0cmluZyYgcGF0aCwgV2ViS2l0OjpXZWJGaWxlU3lzdGVtKiB3ZWJGaWxlU3lz
dGVtLCBQYXNzT3duUHRyPFdlYkNvcmU6OkFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrcz4gY2FsbGJh
Y2tzLCBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0KQorICAgIHsKKyAgICAgICAgcmV0dXJu
IGFkb3B0UHRyKG5ldyBXb3JrZXJGaWxlV3JpdGVySGVscGVyQ2FsbGJhY2tzKGNsaWVudCwgcGF0
aCwgd2ViRmlsZVN5c3RlbSwgY2FsbGJhY2tzLCB3b3JrZXJDb250ZXh0KSk7CisgICAgfQorCisg
ICAgdmlydHVhbCB2b2lkIGRpZFN1Y2NlZWQoKQorICAgIHsKKyAgICAgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGRpZFJlYWRNZXRhZGF0YShjb25z
dCBGaWxlTWV0YWRhdGEmIG1ldGFkYXRhKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fY2FsbGJh
Y2tzKTsKKyAgICAgICAgaWYgKG1ldGFkYXRhLnR5cGUgIT0gRmlsZU1ldGFkYXRhOjpUeXBlRmls
ZSB8fCBtZXRhZGF0YS5sZW5ndGggPCAwKQorICAgICAgICAgICAgbV9jYWxsYmFja3MtPmRpZEZh
aWwoV2ViS2l0OjpXZWJGaWxlRXJyb3JJbnZhbGlkU3RhdGUpOworICAgICAgICBlbHNlIHsKKyAg
ICAgICAgICAgIE93blB0cjxXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bT4gYXN5bmNGaWxl
V3JpdGVyQ2hyb21pdW0gPSBhZG9wdFB0cihuZXcgV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21p
dW0obV93ZWJGaWxlU3lzdGVtLCBtX3BhdGgsIG1fd29ya2VyQ29udGV4dCwgbV9jbGllbnQsIGZh
bHNlKSk7CisgICAgICAgICAgICBtX2NhbGxiYWNrcy0+ZGlkQ3JlYXRlRmlsZVdyaXRlcihhc3lu
Y0ZpbGVXcml0ZXJDaHJvbWl1bS5yZWxlYXNlKCksIG1ldGFkYXRhLmxlbmd0aCk7CisgICAgICAg
IH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlkUmVhZERpcmVjdG9yeUVudHJ5KGNvbnN0
IFN0cmluZyYgbmFtZSwgYm9vbCBpc0RpcmVjdG9yeSkKKyAgICB7CisgICAgICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBkaWRSZWFkRGlyZWN0b3J5
RW50cmllcyhib29sIGhhc01vcmUpCisgICAgeworICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQo
KTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlkT3BlbkZpbGVTeXN0ZW0oY29uc3QgU3Ry
aW5nJiwgUGFzc093blB0cjxBc3luY0ZpbGVTeXN0ZW0+KQorICAgIHsKKyAgICAgICAgQVNTRVJU
X05PVF9SRUFDSEVEKCk7CisgICAgfQorCisgICAgLy8gQ2FsbGVkIHdoZW4gYW4gQXN5bmNGaWxl
V3J0ZXIgaGFzIGJlZW4gY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgdmlydHVhbCB2b2lkIGRp
ZENyZWF0ZUZpbGVXcml0ZXIoUGFzc093blB0cjxBc3luY0ZpbGVXcml0ZXI+LCBsb25nIGxvbmcp
CisgICAgeworICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisKKyAgICB2aXJ0
dWFsIHZvaWQgZGlkRmFpbChpbnQgY29kZSkKKyAgICB7CisgICAgICAgIEFTU0VSVChtX2NhbGxi
YWNrcyk7CisgICAgICAgIG1fY2FsbGJhY2tzLT5kaWRGYWlsKGNvZGUpOworICAgIH0KKworcHJp
dmF0ZToKKyAgICBXb3JrZXJGaWxlV3JpdGVySGVscGVyQ2FsbGJhY2tzKEFzeW5jRmlsZVdyaXRl
ckNsaWVudCogY2xpZW50LCBjb25zdCBTdHJpbmcmIHBhdGgsIFdlYktpdDo6V2ViRmlsZVN5c3Rl
bSogd2ViRmlsZVN5c3RlbSwgUGFzc093blB0cjxXZWJDb3JlOjpBc3luY0ZpbGVTeXN0ZW1DYWxs
YmFja3M+IGNhbGxiYWNrcywgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCkKKyAgICAgICAg
OiBtX2NsaWVudChjbGllbnQpCisgICAgICAgICwgbV9wYXRoKHBhdGgpCisgICAgICAgICwgbV93
ZWJGaWxlU3lzdGVtKHdlYkZpbGVTeXN0ZW0pCisgICAgICAgICwgbV9jYWxsYmFja3MoY2FsbGJh
Y2tzKQorICAgICAgICAsIG1fd29ya2VyQ29udGV4dCh3b3JrZXJDb250ZXh0KQorICAgIHsKKyAg
ICB9CisKKyAgICBBc3luY0ZpbGVXcml0ZXJDbGllbnQqIG1fY2xpZW50OworICAgIFN0cmluZyBt
X3BhdGg7CisgICAgV2ViS2l0OjpXZWJGaWxlU3lzdGVtKiBtX3dlYkZpbGVTeXN0ZW07CisgICAg
T3duUHRyPFdlYkNvcmU6OkFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrcz4gbV9jYWxsYmFja3M7Cisg
ICAgV29ya2VyQ29udGV4dCogbV93b3JrZXJDb250ZXh0OworfTsKKwordm9pZCBXb3JrZXJBc3lu
Y0ZpbGVTeXN0ZW1DaHJvbWl1bTo6Y3JlYXRlV3JpdGVyKEFzeW5jRmlsZVdyaXRlckNsaWVudCog
Y2xpZW50LCBjb25zdCBTdHJpbmcmIHBhdGgsIFBhc3NPd25QdHI8QXN5bmNGaWxlU3lzdGVtQ2Fs
bGJhY2tzPiBjYWxsYmFja3MpCiB7Ci0gICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICBjcmVhdGVX
b3JrZXJGaWxlU3lzdGVtQ2FsbGJhY2tzQnJpZGdlKFdvcmtlckZpbGVXcml0ZXJIZWxwZXJDYWxs
YmFja3M6OmNyZWF0ZShjbGllbnQsIHBhdGgsIG1fd2ViRmlsZVN5c3RlbSwgY2FsbGJhY2tzLCBt
X3dvcmtlckNvbnRleHQpKS0+cG9zdFJlYWRNZXRhZGF0YVRvTWFpblRocmVhZChtX3dlYkZpbGVT
eXN0ZW0sIHBhdGgsIG1fbW9kZUZvckN1cnJlbnRPcGVyYXRpb24pOwogfQogCiBQYXNzUmVmUHRy
PFdvcmtlckZpbGVTeXN0ZW1DYWxsYmFja3NCcmlkZ2U+IFdvcmtlckFzeW5jRmlsZVN5c3RlbUNo
cm9taXVtOjpjcmVhdGVXb3JrZXJGaWxlU3lzdGVtQ2FsbGJhY2tzQnJpZGdlKFBhc3NPd25QdHI8
QXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzPiBjYWxsYmFja3MpCkluZGV4OiBXZWJLaXQvY2hyb21p
dW0vc3JjL1dvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtLmNwcAkocmV2
aXNpb24gMCkKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hy
b21pdW0uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4K
KyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBv
ZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUg
cHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIg
QU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
CisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIldvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtLmgiCisKKyNpZiBFTkFC
TEUoRklMRV9TWVNURU0pCisKKyNpbmNsdWRlICJBc3luY0ZpbGVTeXN0ZW0uaCIKKyNpbmNsdWRl
ICJBc3luY0ZpbGVXcml0ZXJDbGllbnQuaCIKKyNpbmNsdWRlICJCbG9iLmgiCisjaW5jbHVkZSAi
U2NyaXB0RXhlY3V0aW9uQ29udGV4dC5oIgorI2luY2x1ZGUgIldlYkZpbGVTeXN0ZW0uaCIKKyNp
bmNsdWRlICJXZWJGaWxlV3JpdGVyLmgiCisjaW5jbHVkZSAiV2ViVVJMLmgiCisjaW5jbHVkZSAi
V2ViV29ya2VyQmFzZS5oIgorI2luY2x1ZGUgIldvcmtlckNvbnRleHQuaCIKKyNpbmNsdWRlICJX
b3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmgiCisjaW5jbHVkZSAiV29ya2VyTG9hZGVy
UHJveHkuaCIKKyNpbmNsdWRlICJXb3JrZXJUaHJlYWQuaCIKKwordXNpbmcgbmFtZXNwYWNlIFdl
YktpdDsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgY29uc3QgY2hhciBmaWxlV3Jp
dGVyT3BlcmF0aW9uc01vZGVbXSA9ICJmaWxlV3JpdGVyT3BlcmF0aW9uc01vZGUiOworCitXb3Jr
ZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bTo6V29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0o
V2ViRmlsZVN5c3RlbSogd2ViRmlsZVN5c3RlbSwgY29uc3QgU3RyaW5nJiBwYXRoLCBXb3JrZXJD
b250ZXh0KiB3b3JrZXJDb250ZXh0LCBBc3luY0ZpbGVXcml0ZXJDbGllbnQqIGNsaWVudCwgYm9v
bCBzeW5jaHJvbm91cykKKyAgICA6IG1fc3luY2hyb25vdXMoc3luY2hyb25vdXMpCit7CisgICAg
QVNTRVJUKCFzeW5jaHJvbm91cyk7IC8vIE5vdCBpbXBsZW1lbnRlZCB5ZXQuCisKKyAgICBXb3Jr
ZXJMb2FkZXJQcm94eSogcHJveHkgPSAmd29ya2VyQ29udGV4dC0+dGhyZWFkKCktPndvcmtlckxv
YWRlclByb3h5KCk7CisgICAgbV9icmlkZ2UgPSBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJp
ZGdlOjpjcmVhdGUocGF0aCwgcHJveHksIHdvcmtlckNvbnRleHQsIGNsaWVudCk7Cit9CisKK1dv
cmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtOjp+V29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21p
dW0oKQoreworICAgIG1fYnJpZGdlLT5wb3N0U2h1dGRvd25Ub01haW5UaHJlYWQobV9icmlkZ2Up
OworfQorCit2b2lkIFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtOjp3cml0ZShsb25nIGxv
bmcgcG9zaXRpb24sIEJsb2IqIGRhdGEpCit7CisgICAgbV9icmlkZ2UtPnBvc3RXcml0ZVRvTWFp
blRocmVhZChwb3NpdGlvbiwgZGF0YS0+dXJsKCkpOworfQorCit2b2lkIFdvcmtlckFzeW5jRmls
ZVdyaXRlckNocm9taXVtOjp0cnVuY2F0ZShsb25nIGxvbmcgbGVuZ3RoKQoreworICAgIG1fYnJp
ZGdlLT5wb3N0VHJ1bmNhdGVUb01haW5UaHJlYWQobGVuZ3RoKTsKK30KKwordm9pZCBXb3JrZXJB
c3luY0ZpbGVXcml0ZXJDaHJvbWl1bTo6YWJvcnQoKQoreworICAgIG1fYnJpZGdlLT5wb3N0QWJv
cnRUb01haW5UaHJlYWQoKTsKK30KKworfSAvLyBuYW1lc3BhY2UKKworI2VuZGlmIC8vIEVOQUJM
RShGSUxFX1NZU1RFTSkKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2VyQXN5bmNGaWxl
V3JpdGVyQ2hyb21pdW0uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtl
ckFzeW5jRmlsZVdyaXRlckNocm9taXVtLmgJKHJldmlzaW9uIDApCisrKyBXZWJLaXQvY2hyb21p
dW0vc3JjL1dvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtLmgJKHJldmlzaW9uIDApCkBAIC0w
LDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1l
dDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
cgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBv
ZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBi
ZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRo
aXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMg
QU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJU
SUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZ
UklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjaWZuZGVmIFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtX2gKKyNkZWZp
bmUgV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW1faAorCisjaWYgRU5BQkxFKEZJTEVfU1lT
VEVNKQorCisjaW5jbHVkZSAiQXN5bmNGaWxlV3JpdGVyLmgiCisjaW5jbHVkZSAiV2ViRmlsZUVy
cm9yLmgiCisjaW5jbHVkZSAiV2ViRmlsZVdyaXRlckNsaWVudC5oIgorI2luY2x1ZGUgPHd0Zi9P
d25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgorCituYW1lc3BhY2UgV2ViS2l0
IHsKK2NsYXNzIFdlYkZpbGVTeXN0ZW07CitjbGFzcyBXZWJGaWxlV3JpdGVyOworY2xhc3MgV29y
a2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTsKK30KKworbmFtZXNwYWNlIFdlYkNvcmUgewor
CitjbGFzcyBBc3luY0ZpbGVTeXN0ZW07CitjbGFzcyBBc3luY0ZpbGVXcml0ZXJDbGllbnQ7Citj
bGFzcyBCbG9iOworY2xhc3MgV29ya2VyQ29udGV4dDsKKworY2xhc3MgV29ya2VyQXN5bmNGaWxl
V3JpdGVyQ2hyb21pdW0gOiBwdWJsaWMgQXN5bmNGaWxlV3JpdGVyIHsKK3B1YmxpYzoKKyAgICBX
b3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bShXZWJLaXQ6OldlYkZpbGVTeXN0ZW0qLCBjb25z
dCBTdHJpbmcmIHBhdGgsIFdvcmtlckNvbnRleHQqLCBBc3luY0ZpbGVXcml0ZXJDbGllbnQqLCBi
b29sIHN5bmNocm9ub3VzKTsKKyAgICB+V29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0oKTsK
KyAgICAKKyAgICAvLyBGaWxlV3JpdGVyCisgICAgdmlydHVhbCB2b2lkIHdyaXRlKGxvbmcgbG9u
ZyBwb3NpdGlvbiwgQmxvYiogZGF0YSk7CisgICAgdmlydHVhbCB2b2lkIHRydW5jYXRlKGxvbmcg
bG9uZyBsZW5ndGgpOworICAgIHZpcnR1YWwgdm9pZCBhYm9ydCgpOworCitwcml2YXRlOgorICAg
IFJlZlB0cjxXZWJLaXQ6OldvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+IG1fYnJpZGdl
OworICAgIGJvb2wgbV9zeW5jaHJvbm91czsKK307CisKK30gLy8gbmFtZXNwYWNlCisKKyNlbmRp
ZiAvLyBFTkFCTEUoRklMRV9TWVNURU0pCisKKyNlbmRpZiAvLyBBc3luY0ZpbGVXcml0ZXJDaHJv
bWl1bV9oCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckZpbGVXcml0ZXJDYWxsYmFj
a3NCcmlkZ2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2VyRmls
ZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJLaXQvY2hyb21p
dW0vc3JjL1dvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuY3BwCShyZXZpc2lvbiAwKQpA
QCAtMCwwICsxLDIwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBB
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
REFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJXb3JrZXJGaWxl
V3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmgiCisKKyNpZiBFTkFCTEUoRklMRV9TWVNURU0pCisKKyNp
bmNsdWRlICJBc3luY0ZpbGVXcml0ZXJDbGllbnQuaCIKKyNpbmNsdWRlICJDcm9zc1RocmVhZFRh
c2suaCIKKyNpbmNsdWRlICJXZWJDU3RyaW5nLmgiCisjaW5jbHVkZSAiV2ViRmlsZVN5c3RlbS5o
IgorI2luY2x1ZGUgIldlYkZpbGVXcml0ZXIuaCIKKyNpbmNsdWRlICJXZWJLaXQuaCIKKyNpbmNs
dWRlICJXZWJLaXRDbGllbnQuaCIKKyNpbmNsdWRlICJXZWJXb3JrZXJCYXNlLmgiCisjaW5jbHVk
ZSAiV29ya2VyQ29udGV4dC5oIgorI2luY2x1ZGUgIldvcmtlckxvYWRlclByb3h5LmgiCisjaW5j
bHVkZSAiV29ya2VyVGhyZWFkLmgiCisjaW5jbHVkZSA8d3RmL01haW5UaHJlYWQuaD4KKyNpbmNs
dWRlIDx3dGYvVGhyZWFkaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordGVtcGxhdGU8
PiBzdHJ1Y3QgQ3Jvc3NUaHJlYWRDb3BpZXJCYXNlPGZhbHNlLCBmYWxzZSwgUGFzc1JlZlB0cjxX
ZWJLaXQ6OldvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+ID4geworICAgIHR5cGVkZWYg
UGFzc1JlZlB0cjxXZWJLaXQ6OldvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+IFR5cGU7
CisgICAgc3RhdGljIFR5cGUgY29weShjb25zdCBQYXNzUmVmUHRyPFdlYktpdDo6V29ya2VyRmls
ZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4mIGJyaWRnZSkKKyAgICB7CisgICAgICAgIFR5cGUgbmV3
UmVmKGJyaWRnZS5nZXQoKSk7CisgICAgICAgIHJldHVybiBuZXdSZWY7CisgICAgfQorfTsKKwor
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCit1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKKworbmFt
ZXNwYWNlIFdlYktpdCB7CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6
bm90aWZ5U3RvcCgpCit7CisgICAgQVNTRVJUKG1fd29ya2VyQ29udGV4dC0+aXNDb250ZXh0VGhy
ZWFkKCkpOworICAgIG1fY2xpZW50T25Xb3JrZXJUaHJlYWQgPSAwOworfQorCit2b2lkIFdvcmtl
ckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OnBvc3RXcml0ZVRvTWFpblRocmVhZChsb25nIGxv
bmcgcG9zaXRpb24sIGNvbnN0IFdlYkNvcmU6OktVUkwmIGRhdGEpCit7CisgICAgZGlzcGF0Y2hU
YXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmd3JpdGVPbk1haW5UaHJlYWQsIHRo
aXMsIHBvc2l0aW9uLCBkYXRhKSk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNr
c0JyaWRnZTo6cG9zdFRydW5jYXRlVG9NYWluVGhyZWFkKGxvbmcgbG9uZyBsZW5ndGgpCit7Cisg
ICAgZGlzcGF0Y2hUYXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmdHJ1bmNhdGVP
bk1haW5UaHJlYWQsIHRoaXMsIGxlbmd0aCkpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJD
YWxsYmFja3NCcmlkZ2U6OnBvc3RBYm9ydFRvTWFpblRocmVhZCgpCit7CisgICAgZGlzcGF0Y2hU
YXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmYWJvcnRPbk1haW5UaHJlYWQsIHRo
aXMpKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpwb3N0U2h1
dGRvd25Ub01haW5UaHJlYWQoCisgICAgICAgIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNh
bGxiYWNrc0JyaWRnZT4gYnJpZGdlKQoreworICAgIEFTU0VSVChtX3dvcmtlckNvbnRleHQtPmlz
Q29udGV4dFRocmVhZCgpKTsKKyAgICBtX2NsaWVudE9uV29ya2VyVGhyZWFkID0gMDsKKyAgICBk
aXNwYXRjaFRhc2tUb01haW5UaHJlYWQoY3JlYXRlQ2FsbGJhY2tUYXNrKCZzaHV0ZG93bk9uTWFp
blRocmVhZCwgYnJpZGdlKSk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0Jy
aWRnZTo6d3JpdGVPbk1haW5UaHJlYWQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQ
dHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gYnJpZGdlLCBsb25nIGxvbmcgcG9z
aXRpb24sIGNvbnN0IFdlYkNvcmU6OktVUkwmIGRhdGEpCit7CisgICAgYnJpZGdlLT5tX3dyaXRl
ci0+d3JpdGUocG9zaXRpb24sIFdlYlVSTChkYXRhKSk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdy
aXRlckNhbGxiYWNrc0JyaWRnZTo6dHJ1bmNhdGVPbk1haW5UaHJlYWQoU2NyaXB0RXhlY3V0aW9u
Q29udGV4dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gYnJp
ZGdlLCBsb25nIGxvbmcgbGVuZ3RoKQoreworICAgIGJyaWRnZS0+bV93cml0ZXItPnRydW5jYXRl
KGxlbmd0aCk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6YWJv
cnRPbk1haW5UaHJlYWQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gYnJpZGdlKQoreworICAgIGJyaWRnZS0+bV93cml0
ZXItPmNhbmNlbCgpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6
OmluaXRPbk1haW5UaHJlYWQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29y
a2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gYnJpZGdlLCBjb25zdCBTdHJpbmcmIHBhdGgp
Cit7CisgICAgQVNTRVJUKCFicmlkZ2UtPm1fd3JpdGVyKTsKKyAgICBicmlkZ2UtPm1fd3JpdGVy
ID0gYWRvcHRQdHIod2ViS2l0Q2xpZW50KCktPmZpbGVTeXN0ZW0oKS0+Y3JlYXRlRmlsZVdyaXRl
cihwYXRoLCBicmlkZ2UuZ2V0KCkpKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJh
Y2tzQnJpZGdlOjpzaHV0ZG93bk9uTWFpblRocmVhZChTY3JpcHRFeGVjdXRpb25Db250ZXh0Kiwg
UGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlPiBicmlkZ2UpCit7Cisg
ICAgYnJpZGdlLT5tX3dyaXRlckRlbGV0ZWQgPSB0cnVlOworICAgIGJyaWRnZS0+bV93cml0ZXIu
Y2xlYXIoKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpkaWRX
cml0ZShsb25nIGxvbmcgYnl0ZXMsIGJvb2wgY29tcGxldGUpCit7CisgICAgZGlzcGF0Y2hUYXNr
VG9Xb3JrZXJUaHJlYWQoY3JlYXRlQ2FsbGJhY2tUYXNrKCZkaWRXcml0ZU9uV29ya2VyVGhyZWFk
LCB0aGlzLCBieXRlcywgY29tcGxldGUpKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2Fs
bGJhY2tzQnJpZGdlOjpkaWRGYWlsKFdlYkZpbGVFcnJvciBlcnJvcikKK3sKKyAgICBkaXNwYXRj
aFRhc2tUb1dvcmtlclRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJmRpZEZhaWxPbldvcmtlclRo
cmVhZCwgdGhpcywgZXJyb3IpKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tz
QnJpZGdlOjpkaWRUcnVuY2F0ZSgpCit7CisgICAgZGlzcGF0Y2hUYXNrVG9Xb3JrZXJUaHJlYWQo
Y3JlYXRlQ2FsbGJhY2tUYXNrKCZkaWRUcnVuY2F0ZU9uV29ya2VyVGhyZWFkLCB0aGlzKSk7Cit9
CisKK1dvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OldvcmtlckZpbGVXcml0ZXJDYWxs
YmFja3NCcmlkZ2UoY29uc3QgU3RyaW5nJiBwYXRoLCBXb3JrZXJMb2FkZXJQcm94eSogcHJveHks
IFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIHNjcmlwdEV4ZWN1dGlvbkNvbnRleHQsIEFzeW5jRmls
ZVdyaXRlckNsaWVudCogY2xpZW50KQorICAgIDogV29ya2VyQ29udGV4dDo6T2JzZXJ2ZXIoc3Rh
dGljX2Nhc3Q8V29ya2VyQ29udGV4dCo+KHNjcmlwdEV4ZWN1dGlvbkNvbnRleHQpKQorICAgICwg
bV9wcm94eShwcm94eSkKKyAgICAsIG1fd3JpdGVyRGVsZXRlZChmYWxzZSkKKyAgICAsIG1fd29y
a2VyQ29udGV4dChzY3JpcHRFeGVjdXRpb25Db250ZXh0KQorICAgICwgbV9jbGllbnRPbldvcmtl
clRocmVhZChjbGllbnQpCit7CisgICAgQVNTRVJUKG1fd29ya2VyQ29udGV4dC0+aXNDb250ZXh0
VGhyZWFkKCkpOworICAgIHBvc3RJbml0VG9NYWluVGhyZWFkKHBhdGgpOworfQorCit2b2lkIFdv
cmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OnBvc3RJbml0VG9NYWluVGhyZWFkKGNvbnN0
IFN0cmluZyYgcGF0aCkKK3sKKyAgICBkaXNwYXRjaFRhc2tUb01haW5UaHJlYWQoY3JlYXRlQ2Fs
bGJhY2tUYXNrKCZpbml0T25NYWluVGhyZWFkLCB0aGlzLCBwYXRoKSk7Cit9CisKK1dvcmtlckZp
bGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6On5Xb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdl
KCkKK3sKKyAgICBBU1NFUlQoIW1fY2xpZW50T25Xb3JrZXJUaHJlYWQpOworICAgIEFTU0VSVCgh
bV93cml0ZXIpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OmRp
ZFdyaXRlT25Xb3JrZXJUaHJlYWQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFdvcmtlckZpbGVX
cml0ZXJDYWxsYmFja3NCcmlkZ2UqIGJyaWRnZSwgbG9uZyBsb25nIGxlbmd0aCwgYm9vbCBjb21w
bGV0ZSkKK3sKKyAgICBicmlkZ2UtPm1fY2xpZW50T25Xb3JrZXJUaHJlYWQtPmRpZFdyaXRlKGxl
bmd0aCwgY29tcGxldGUpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlk
Z2U6OmRpZEZhaWxPbldvcmtlclRocmVhZChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgV29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZSogYnJpZGdlLCBXZWJGaWxlRXJyb3IgZXJyb3IpCit7
CisgICAgYnJpZGdlLT5tX2NsaWVudE9uV29ya2VyVGhyZWFkLT5kaWRGYWlsKHN0YXRpY19jYXN0
PEZpbGVFcnJvcjo6RXJyb3JDb2RlPihlcnJvcikpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0
ZXJDYWxsYmFja3NCcmlkZ2U6OmRpZFRydW5jYXRlT25Xb3JrZXJUaHJlYWQoU2NyaXB0RXhlY3V0
aW9uQ29udGV4dCosIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UqIGJyaWRnZSkKK3sK
KyAgICBicmlkZ2UtPm1fY2xpZW50T25Xb3JrZXJUaHJlYWQtPmRpZFRydW5jYXRlKCk7Cit9CisK
K3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6cnVuVGFza09uTWFpblRocmVh
ZChXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0KiBzY3JpcHRFeGVjdXRpb25Db250ZXh0
LCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+IGJyaWRnZSwgUGFz
c093blB0cjxXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPiB0YXNrVG9SdW4p
Cit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICBpZiAoIWJyaWRnZS0+bV93cml0
ZXJEZWxldGVkKQorICAgICAgICB0YXNrVG9SdW4tPnBlcmZvcm1UYXNrKHNjcmlwdEV4ZWN1dGlv
bkNvbnRleHQpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OnJ1
blRhc2tPbldvcmtlclRocmVhZChXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0KiBzY3Jp
cHRFeGVjdXRpb25Db250ZXh0LCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NC
cmlkZ2U+IGJyaWRnZSwgUGFzc093blB0cjxXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0
OjpUYXNrPiB0YXNrVG9SdW4pCit7CisgICAgQVNTRVJUKGJyaWRnZS0+bV93b3JrZXJDb250ZXh0
LT5pc0NvbnRleHRUaHJlYWQoKSk7CisgICAgaWYgKGJyaWRnZS0+bV9jbGllbnRPbldvcmtlclRo
cmVhZCkKKyAgICAgICAgdGFza1RvUnVuLT5wZXJmb3JtVGFzayhzY3JpcHRFeGVjdXRpb25Db250
ZXh0KTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpkaXNwYXRj
aFRhc2tUb01haW5UaHJlYWQoUGFzc093blB0cjxXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250
ZXh0OjpUYXNrPiB0YXNrKQoreworICAgIEFTU0VSVChtX3dvcmtlckNvbnRleHQtPmlzQ29udGV4
dFRocmVhZCgpKTsKKyAgICBXZWJXb3JrZXJCYXNlOjpkaXNwYXRjaFRhc2tUb01haW5UaHJlYWQo
Y3JlYXRlQ2FsbGJhY2tUYXNrKCZydW5UYXNrT25NYWluVGhyZWFkLCB0aGlzLCB0YXNrKSk7Cit9
CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6ZGlzcGF0Y2hUYXNrVG9X
b3JrZXJUaHJlYWQoUGFzc093blB0cjxTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPiB0YXNr
KQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgbV9wcm94eS0+cG9zdFRhc2tG
b3JNb2RlVG9Xb3JrZXJDb250ZXh0KGNyZWF0ZUNhbGxiYWNrVGFzaygmcnVuVGFza09uV29ya2Vy
VGhyZWFkLCB0aGlzLCB0YXNrKSwgIiIpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisK
KyNlbmRpZiAvLyBFTkFCTEUoRklMRV9TWVNURU0pCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vc3Jj
L1dvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQv
Y2hyb21pdW0vc3JjL1dvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuaAkocmV2aXNpb24g
MCkKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRn
ZS5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAg
ICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRz
CisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1
Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9y
IHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBB
TlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICog
TElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4g
Tk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
CisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgV29ya2VyRmlsZVdyaXRl
ckNhbGxiYWNrc0JyaWRnZV9oCisjZGVmaW5lIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlk
Z2VfaAorCisjaWYgRU5BQkxFKEZJTEVfU1lTVEVNKQorCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJp
bmcuaCIKKyNpbmNsdWRlICJXZWJGaWxlRXJyb3IuaCIKKyNpbmNsdWRlICJXZWJGaWxlV3JpdGVy
Q2xpZW50LmgiCisjaW5jbHVkZSAiV29ya2VyQ29udGV4dC5oIgorI2luY2x1ZGUgPHd0Zi9QYXNz
T3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvVGhy
ZWFkaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIEFzeW5jRmlsZVdyaXRlckNs
aWVudDsKK2NsYXNzIEtVUkw7CitjbGFzcyBXb3JrZXJMb2FkZXJQcm94eTsKK30KKworbmFtZXNw
YWNlIFdlYktpdCB7CisKK2NsYXNzIFdlYkZpbGVTeXN0ZW07CitjbGFzcyBXZWJGaWxlV3JpdGVy
OworY2xhc3MgV2ViRmlsZVdyaXRlckNsaWVudDsKK2NsYXNzIFdlYldvcmtlckJhc2U7CisKKy8v
IFRoaXMgY2xhc3MgaXMgdXNlZCBhcyBhIG1lY2hhbmlzbSB0byBicmlkZ2UgY2FsbHMgYmV0d2Vl
biB0aHJlYWRzLgorLy8gQ2FsbHMgdG8gYSBXZWJGaWxlV3JpdGVyIG11c3QgaGFwcGVuIG9uIHRo
ZSBtYWluIHRocmVhZCwgYnV0IHRoZXkgY29tZSBmcm9tCisvLyB0aGUgY29udGV4dCB0aHJlYWQu
ICBUaGUgcmVzcG9uc2VzIHRocm91Z2ggdGhlIFdlYkZpbGVXcml0ZXJDbGllbnQgaW50ZXJmYWNl
CisvLyBzdGFydCBvbiB0aGUgbWFpbiB0aHJlYWQsIGJ1dCBtdXN0IGJlIHNlbnQgdmlhIHRoZSB3
b3JrZXIgY29udGV4dCB0aHJlYWQuCisvLworLy8gQSB0eXBpY2FsIGZsb3cgZm9yIHdyaXRlIHdv
dWxkIGxvb2sgbGlrZSB0aGlzOgorLy8gQnJpZGdlOjpwb3N0V3JpdGVUb01haW5UaHJlYWQoKSBv
biBXb3JrZXJUaHJlYWQKKy8vICAtLT4gQnJpZGdlOjp3cml0ZU9uTWFpblRocmVhZCgpIGlzIGNh
bGxlZCBvbiBNYWluVGhyZWFkCisvLyAgLS0+IFdlYkZpbGVXcml0ZXI6OndyaXRlKCkKKy8vICAg
ICAgVGhpcyBtYWtlcyBhbiBJUEM7IHRoZSBhY3R1YWwgb3BlcmF0aW9uIGlzIGRvd24gaW4gdGhl
IGJyb3dzZXIuCisvLyAgLS0+IEJyaWRnZTo6ZGlkV3JpdGUgaXMgY2FsbGVkIG9uIE1haW5UaHJl
YWQKKy8vICAtLT4gQnJpZGdlOjpkaWRXcml0ZU9uV29ya2VyVGhyZWFkIGlzIGNhbGxlZCBvbiBX
b3JrZXJUaHJlYWQKKy8vICAgICAgVGhpcyBjYWxscyB0aGUgb3JpZ2luYWwgY2xpZW50IChtX2Ns
aWVudE9uV29ya2VyVGhyZWFkKS4KK2NsYXNzIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlk
Z2UgOiBwdWJsaWMgVGhyZWFkU2FmZVNoYXJlZDxXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJp
ZGdlPiwgcHVibGljIFdlYkNvcmU6OldvcmtlckNvbnRleHQ6Ok9ic2VydmVyLCBwdWJsaWMgV2Vi
RmlsZVdyaXRlckNsaWVudCB7CitwdWJsaWM6CisgICAgfldvcmtlckZpbGVXcml0ZXJDYWxsYmFj
a3NCcmlkZ2UoKTsKKworICAgIC8vIFdvcmtlckNvbnRleHQ6Ok9ic2VydmVyIG1ldGhvZC4KKyAg
ICB2aXJ0dWFsIHZvaWQgbm90aWZ5U3RvcCgpOworCisgICAgc3RhdGljIFBhc3NSZWZQdHI8V29y
a2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gY3JlYXRlKGNvbnN0IFN0cmluZyYgcGF0aCwg
V2ViQ29yZTo6V29ya2VyTG9hZGVyUHJveHkqIHByb3h5LCBXZWJDb3JlOjpTY3JpcHRFeGVjdXRp
b25Db250ZXh0KiB3b3JrZXJDb250ZXh0LCBXZWJDb3JlOjpBc3luY0ZpbGVXcml0ZXJDbGllbnQq
IGNsaWVudCkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgV29ya2VyRmlsZVdy
aXRlckNhbGxiYWNrc0JyaWRnZShwYXRoLCBwcm94eSwgd29ya2VyQ29udGV4dCwgY2xpZW50KSk7
CisgICAgfQorCisgICAgLy8gTWV0aG9kcyB0aGF0IGNyZWF0ZSBhbiBpbnN0YW5jZSBhbmQgcG9z
dCBhbiBpbml0aWFsIHJlcXVlc3QgdGFzayB0byB0aGUgbWFpbiB0aHJlYWQuIFRoZXkgbXVzdCBi
ZSBjYWxsZWQgb24gdGhlIHdvcmtlciB0aHJlYWQuCisgICAgdm9pZCBwb3N0V3JpdGVUb01haW5U
aHJlYWQobG9uZyBsb25nIHBvc2l0aW9uLCBjb25zdCBXZWJDb3JlOjpLVVJMJiBkYXRhKTsKKyAg
ICB2b2lkIHBvc3RUcnVuY2F0ZVRvTWFpblRocmVhZChsb25nIGxvbmcgbGVuZ3RoKTsKKyAgICB2
b2lkIHBvc3RBYm9ydFRvTWFpblRocmVhZCgpOworCisgICAgLy8gVGhlIG93bmluZyBXb3JrZXJB
c3luY0ZpbGVXcml0ZXJDaHJvbWl1bSBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCBiZWZvcmUgZHJv
cHBpbmcgaXRzIGxhc3QgcmVmZXJlbmNlIHRvIHRoZSBicmlkZ2UsIG9uIHRoZSBjb250ZXh0IHRo
cmVhZC4KKyAgICAvLyBUaGUgYWN0dWFsIGRlbGV0aW9uIG9mIHRoZSBXb3JrZXJGaWxlV3JpdGVy
Q2FsbGJhY2tzQnJpZGdlIG1heSBoYXBwZW4gb24gZWl0aGVyIHRoZSBtYWluIG9yIGNvbnRleHQg
dGhyZWFkLCBkZXBlbmRpbmcgb24gd2hlcmUgdGhlIGxhc3QgcmVmZXJlbmNlIGdvZXMgYXdheTsg
dGhhdCdzIHNhZmUgYXMgbG9uZyBhcyB0aGlzIGlzIGNhbGxlZCBmaXJzdC4KKyAgICB2b2lkIHBv
c3RTaHV0ZG93blRvTWFpblRocmVhZChQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFj
a3NCcmlkZ2U+KTsKKworICAgIC8vIENhbGxiYWNrIG1ldGhvZHMgdGhhdCBhcmUgY2FsbGVkIG9u
IHRoZSBtYWluIHRocmVhZC4KKyAgICAvLyBUaGVzZSBhcmUgdGhlIGltcGxlbWVudGF0aW9uIG9m
IFdlYktpdDo6V2ViRmlsZVdyaXRlckNsaWVudC4KKyAgICB2b2lkIGRpZFdyaXRlKGxvbmcgbG9u
ZyBieXRlcywgYm9vbCBjb21wbGV0ZSk7CisgICAgdm9pZCBkaWRGYWlsKFdlYkZpbGVFcnJvcik7
CisgICAgdm9pZCBkaWRUcnVuY2F0ZSgpOworCitwcml2YXRlOgorICAgIFdvcmtlckZpbGVXcml0
ZXJDYWxsYmFja3NCcmlkZ2UoY29uc3QgU3RyaW5nJiBwYXRoLCBXZWJDb3JlOjpXb3JrZXJMb2Fk
ZXJQcm94eSosIFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBXZWJDb3JlOjpBc3lu
Y0ZpbGVXcml0ZXJDbGllbnQqKTsKKworICAgIHZvaWQgcG9zdEluaXRUb01haW5UaHJlYWQoY29u
c3QgU3RyaW5nJiBwYXRoKTsKKworICAgIC8vIE1ldGhvZHMgdGhhdCBhcmUgdG8gYmUgY2FsbGVk
IG9uIHRoZSBtYWluIHRocmVhZC4KKyAgICBzdGF0aWMgdm9pZCB3cml0ZU9uTWFpblRocmVhZChX
ZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3Jp
dGVyQ2FsbGJhY2tzQnJpZGdlPiwgbG9uZyBsb25nIHBvc2l0aW9uLCBjb25zdCBXZWJDb3JlOjpL
VVJMJiBkYXRhKTsKKyAgICBzdGF0aWMgdm9pZCB0cnVuY2F0ZU9uTWFpblRocmVhZChXZWJDb3Jl
OjpTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2Fs
bGJhY2tzQnJpZGdlPiwgbG9uZyBsb25nIGxlbmd0aCk7CisgICAgc3RhdGljIHZvaWQgYWJvcnRP
bk1haW5UaHJlYWQoV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8
V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4pOworICAgIHN0YXRpYyB2b2lkIGluaXRP
bk1haW5UaHJlYWQoV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8
V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4sIGNvbnN0IFN0cmluZyYgcGF0aCk7Cisg
ICAgc3RhdGljIHZvaWQgc2h1dGRvd25Pbk1haW5UaHJlYWQoV2ViQ29yZTo6U2NyaXB0RXhlY3V0
aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4p
OworCisgICAgLy8gTWV0aG9kcyB0aGF0IGRpc3BhdGNoIHRvIEFzeW5jRmlsZVdyaXRlckNsaWVu
dCBvbiB0aGUgd29ya2VyIHRocmVhZHMuCisgICAgLy8gVGhleSByZWxlYXNlIGEgc2VsZlJlZiBv
ZiB0aGUgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS4KKyAgICBzdGF0aWMgdm9pZCBk
aWRXcml0ZU9uV29ya2VyVGhyZWFkKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBX
b3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlKiwgbG9uZyBsb25nIGxlbmd0aCwgYm9vbCBj
b21wbGV0ZSk7CisgICAgc3RhdGljIHZvaWQgZGlkRmFpbE9uV29ya2VyVGhyZWFkKFdlYkNvcmU6
OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdl
KiwgV2ViRmlsZUVycm9yKTsKKyAgICBzdGF0aWMgdm9pZCBkaWRUcnVuY2F0ZU9uV29ya2VyVGhy
ZWFkKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBXb3JrZXJGaWxlV3JpdGVyQ2Fs
bGJhY2tzQnJpZGdlKik7CisKKyAgICAvLyBMYXp5IGluaXRpYWxpemF0aW9uIG9mIHRoZSBXZWJG
aWxlV3JpdGVyLgorICAgIHZvaWQgaW5pdFdlYkZpbGVXcml0ZXIoKTsKKyAgICBzdGF0aWMgdm9p
ZCBydW5UYXNrT25NYWluVGhyZWFkKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQ
YXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+LCBQYXNzT3duUHRyPFdl
YkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2s+KTsKKyAgICBzdGF0aWMgdm9pZCBy
dW5UYXNrT25Xb3JrZXJUaHJlYWQoV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBh
c3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4sIFBhc3NPd25QdHI8V2Vi
Q29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6VGFzaz4pOworCisgICAgdm9pZCBkaXNwYXRj
aFRhc2tUb01haW5UaHJlYWQoUGFzc093blB0cjxXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250
ZXh0OjpUYXNrPik7CisgICAgdm9pZCBkaXNwYXRjaFRhc2tUb1dvcmtlclRocmVhZChQYXNzT3du
UHRyPFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2s+KTsKKworICAgIC8vIFVz
ZWQgZnJvbSB0aGUgbWFpbiB0aHJlYWQgdG8gcG9zdCB0YXNrcyB0byB0aGUgY29udGV4dCB0aHJl
YWQuCisgICAgV2ViQ29yZTo6V29ya2VyTG9hZGVyUHJveHkqIG1fcHJveHk7CisgICAgLy8gVXNl
ZCB0byBpbmRpY2F0ZSB0aGF0IHNodXRkb3duIGhhcyBzdGFydGVkIG9uIHRoZSBtYWluIHRocmVh
ZCwgYW5kIGhlbmNlIHRoZSB3cml0ZXIgaGFzIGJlZW4gZGVsZXRlZC4KKyAgICBib29sIG1fd3Jp
dGVyRGVsZXRlZDsKKworICAgIC8vIFVzZWQgb24gdGhlIGNvbnRleHQgdGhyZWFkLCBvbmx5IHRv
IGNoZWNrIHRoYXQgd2UncmUgcnVubmluZyBvbiB0aGUgY29udGV4dCB0aHJlYWQuCisgICAgV2Vi
Q29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCogbV93b3JrZXJDb250ZXh0OworCisgICAgLy8g
Q3JlYXRlZCBhbmQgZGVzdHJveWVkIGZyb20gdGhlIG1haW4gdGhyZWFkLgorICAgIE93blB0cjxX
ZWJLaXQ6OldlYkZpbGVXcml0ZXI+IG1fd3JpdGVyOworCisgICAgLy8gVXNlZCBvbiB0aGUgY29u
dGV4dCB0aHJlYWQgdG8gY2FsbCBiYWNrIGludG8gdGhlIGNsaWVudC4KKyAgICBXZWJDb3JlOjpB
c3luY0ZpbGVXcml0ZXJDbGllbnQqIG1fY2xpZW50T25Xb3JrZXJUaHJlYWQ7Cit9OworCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZgorCisjZW5kaWYgLy8gV29ya2VyRmlsZVdyaXRl
ckNhbGxiYWNrc0JyaWRnZV9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>73436</attachid>
            <date>2010-11-09 16:53:19 -0800</date>
            <delta_ts>2010-11-11 16:33:32 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-47681-20101109165318.patch</filename>
            <type>text/plain</type>
            <size>28109</size>
            <attacher name="Eric U.">ericu</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2No
cm9taXVtL0NoYW5nZUxvZwkocmV2aXNpb24gNzE2NjUpCisrKyBXZWJLaXQvY2hyb21pdW0vQ2hh
bmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjMgQEAKKzIwMTAtMTAtMjggIEVyaWMg
VWhyaGFuZSAgPGVyaWN1QGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBbQ2hyb21pdW1dIGltcGxlbWVudGF0aW9uIG9mIGFzeW5j
IEZpbGVXcml0ZXIgZm9yIHdvcmtlcnMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcv
c2hvd19idWcuY2dpP2lkPTQ3NjgxCisKKyAgICAgICAgVGVzdHMgYXJlIGluIGEgc2VwYXJhdGUg
Y2hhbmdlbGlzdC4KKworICAgICAgICBBZGRlZCBuZXcgZmlsZXMuCisgICAgICAgICogV2ViS2l0
Lmd5cDoKKworICAgICAgICAqIHNyYy9Xb3JrZXJBc3luY0ZpbGVTeXN0ZW1DaHJvbWl1bS5jcHA6
IEFkZGVkIFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtIGNvbnN0cnVjdGlvbi4KKyAgICAg
ICAgKiBzcmMvV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uY3BwOiBBZGRlZC4KKyAgICAg
ICAgKiBzcmMvV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uaDogQWRkZWQuCisKKyAgICAg
ICAgVGhpcyBjbGFzcyBicmlkZ2VzIGJldHdlZW4gdGhlIGNvbnRleHQgYW5kIG1haW4gdGhyZWFk
cyBmb3IgdGhlIFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtLgorICAgICAgICAqIHNyYy9X
b3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmNwcDogQWRkZWQuCisgICAgICAgICogc3Jj
L1dvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuaDogQWRkZWQuCisKIDIwMTAtMTEtMDkg
IFRvbnkgQ2hhbmcgIDx0b255QGNocm9taXVtLm9yZz4KIAogICAgICAgICBVbnJldmlld2VkLCBy
b2xsaW5nIGNocm9taXVtIERFUFMuCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAkocmV2aXNpb24gNzE2NjUp
CisrKyBXZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cAkod29ya2luZyBjb3B5KQpAQCAtNTQ3LDgg
KzU0NywxMiBAQAogICAgICAgICAgICAgICAgICdzcmMvV2ViV29ya2VySW1wbC5oJywKICAgICAg
ICAgICAgICAgICAnc3JjL1dvcmtlckFzeW5jRmlsZVN5c3RlbUNocm9taXVtLmNwcCcsCiAgICAg
ICAgICAgICAgICAgJ3NyYy9Xb3JrZXJBc3luY0ZpbGVTeXN0ZW1DaHJvbWl1bS5oJywKKyAgICAg
ICAgICAgICAgICAnc3JjL1dvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtLmNwcCcsCisgICAg
ICAgICAgICAgICAgJ3NyYy9Xb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5oJywKICAgICAg
ICAgICAgICAgICAnc3JjL1dvcmtlckZpbGVTeXN0ZW1DYWxsYmFja3NCcmlkZ2UuY3BwJywKICAg
ICAgICAgICAgICAgICAnc3JjL1dvcmtlckZpbGVTeXN0ZW1DYWxsYmFja3NCcmlkZ2UuaCcsCisg
ICAgICAgICAgICAgICAgJ3NyYy9Xb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmNwcCcs
CisgICAgICAgICAgICAgICAgJ3NyYy9Xb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmgn
LAogICAgICAgICAgICAgICAgICdzcmMvV3JhcHBlZFJlc291cmNlUmVxdWVzdC5oJywKICAgICAg
ICAgICAgICAgICAnc3JjL1dyYXBwZWRSZXNvdXJjZVJlc3BvbnNlLmgnLAogICAgICAgICAgICAg
ICAgICdzcmMvd2luL1dlYklucHV0RXZlbnRGYWN0b3J5LmNwcCcsCkluZGV4OiBXZWJLaXQvY2hy
b21pdW0vc3JjL1dvcmtlckFzeW5jRmlsZVN5c3RlbUNocm9taXVtLmNwcAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckFzeW5jRmlsZVN5c3RlbUNocm9taXVtLmNwcAko
cmV2aXNpb24gNzE2NjUpCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckFzeW5jRmlsZVN5
c3RlbUNocm9taXVtLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzQsMTMgKzM0LDE2IEBACiAjaWYg
RU5BQkxFKEZJTEVfU1lTVEVNKQogCiAjaW5jbHVkZSAiQXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tz
LmgiCisjaW5jbHVkZSAiRmlsZU1ldGFkYXRhLmgiCiAjaW5jbHVkZSAiRmlsZVN5c3RlbS5oIgog
I2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCiAjaW5jbHVkZSAiV2ViRmlsZVN5c3RlbS5oIgog
I2luY2x1ZGUgIldlYkZpbGVTeXN0ZW1DYWxsYmFja3NJbXBsLmgiCisjaW5jbHVkZSAiV2ViRmls
ZVdyaXRlci5oIgogI2luY2x1ZGUgIldlYktpdC5oIgogI2luY2x1ZGUgIldlYktpdENsaWVudC5o
IgogI2luY2x1ZGUgIldlYldvcmtlckJhc2UuaCIKKyNpbmNsdWRlICJXb3JrZXJBc3luY0ZpbGVX
cml0ZXJDaHJvbWl1bS5oIgogI2luY2x1ZGUgIldvcmtlckNvbnRleHQuaCIKICNpbmNsdWRlICJX
b3JrZXJGaWxlU3lzdGVtQ2FsbGJhY2tzQnJpZGdlLmgiCiAjaW5jbHVkZSAiV29ya2VyU2NyaXB0
Q29udHJvbGxlci5oIgpAQCAtMTM0LDkgKzEzNyw3NiBAQCB2b2lkIFdvcmtlckFzeW5jRmlsZVN5
c3RlbUNocm9taXVtOjpyZWFkCiAgICAgY3JlYXRlV29ya2VyRmlsZVN5c3RlbUNhbGxiYWNrc0Jy
aWRnZShjYWxsYmFja3MpLT5wb3N0UmVhZERpcmVjdG9yeVRvTWFpblRocmVhZChtX3dlYkZpbGVT
eXN0ZW0sIHBhdGgsIG1fbW9kZUZvckN1cnJlbnRPcGVyYXRpb24pOwogfQogCi12b2lkIFdvcmtl
ckFzeW5jRmlsZVN5c3RlbUNocm9taXVtOjpjcmVhdGVXcml0ZXIoQXN5bmNGaWxlV3JpdGVyQ2xp
ZW50KiwgY29uc3QgU3RyaW5nJiwgUGFzc093blB0cjxBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3M+
KQorY2xhc3MgV29ya2VyRmlsZVdyaXRlckhlbHBlckNhbGxiYWNrcyA6IHB1YmxpYyBBc3luY0Zp
bGVTeXN0ZW1DYWxsYmFja3MgeworcHVibGljOgorICAgIHN0YXRpYyBQYXNzT3duUHRyPFdvcmtl
ckZpbGVXcml0ZXJIZWxwZXJDYWxsYmFja3M+IGNyZWF0ZShBc3luY0ZpbGVXcml0ZXJDbGllbnQq
IGNsaWVudCwgY29uc3QgU3RyaW5nJiBwYXRoLCBXZWJLaXQ6OldlYkZpbGVTeXN0ZW0qIHdlYkZp
bGVTeXN0ZW0sIFBhc3NPd25QdHI8V2ViQ29yZTo6QXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzPiBj
YWxsYmFja3MsIFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRleHQpCisgICAgeworICAgICAgICBy
ZXR1cm4gYWRvcHRQdHIobmV3IFdvcmtlckZpbGVXcml0ZXJIZWxwZXJDYWxsYmFja3MoY2xpZW50
LCBwYXRoLCB3ZWJGaWxlU3lzdGVtLCBjYWxsYmFja3MsIHdvcmtlckNvbnRleHQpKTsKKyAgICB9
CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlkU3VjY2VlZCgpCisgICAgeworICAgICAgICBBU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlkUmVhZE1ldGFkYXRh
KGNvbnN0IEZpbGVNZXRhZGF0YSYgbWV0YWRhdGEpCisgICAgeworICAgICAgICBBU1NFUlQobV9j
YWxsYmFja3MpOworICAgICAgICBpZiAobWV0YWRhdGEudHlwZSAhPSBGaWxlTWV0YWRhdGE6OlR5
cGVGaWxlIHx8IG1ldGFkYXRhLmxlbmd0aCA8IDApCisgICAgICAgICAgICBtX2NhbGxiYWNrcy0+
ZGlkRmFpbChXZWJLaXQ6OldlYkZpbGVFcnJvckludmFsaWRTdGF0ZSk7CisgICAgICAgIGVsc2Ug
eworICAgICAgICAgICAgT3duUHRyPFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtPiBhc3lu
Y0ZpbGVXcml0ZXJDaHJvbWl1bSA9IGFkb3B0UHRyKG5ldyBXb3JrZXJBc3luY0ZpbGVXcml0ZXJD
aHJvbWl1bShtX3dlYkZpbGVTeXN0ZW0sIG1fcGF0aCwgbV93b3JrZXJDb250ZXh0LCBtX2NsaWVu
dCwgZmFsc2UpKTsKKyAgICAgICAgICAgIG1fY2FsbGJhY2tzLT5kaWRDcmVhdGVGaWxlV3JpdGVy
KGFzeW5jRmlsZVdyaXRlckNocm9taXVtLnJlbGVhc2UoKSwgbWV0YWRhdGEubGVuZ3RoKTsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBkaWRSZWFkRGlyZWN0b3J5RW50cnko
Y29uc3QgU3RyaW5nJiBuYW1lLCBib29sIGlzRGlyZWN0b3J5KQorICAgIHsKKyAgICAgICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGRpZFJlYWREaXJl
Y3RvcnlFbnRyaWVzKGJvb2wgaGFzTW9yZSkKKyAgICB7CisgICAgICAgIEFTU0VSVF9OT1RfUkVB
Q0hFRCgpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBkaWRPcGVuRmlsZVN5c3RlbShjb25z
dCBTdHJpbmcmLCBQYXNzT3duUHRyPEFzeW5jRmlsZVN5c3RlbT4pCisgICAgeworICAgICAgICBB
U1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisKKyAgICAvLyBDYWxsZWQgd2hlbiBhbiBBc3lu
Y0ZpbGVXcnRlciBoYXMgYmVlbiBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICB2aXJ0dWFsIHZv
aWQgZGlkQ3JlYXRlRmlsZVdyaXRlcihQYXNzT3duUHRyPEFzeW5jRmlsZVdyaXRlcj4sIGxvbmcg
bG9uZykKKyAgICB7CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KKworICAg
IHZpcnR1YWwgdm9pZCBkaWRGYWlsKGludCBjb2RlKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1f
Y2FsbGJhY2tzKTsKKyAgICAgICAgbV9jYWxsYmFja3MtPmRpZEZhaWwoY29kZSk7CisgICAgfQor
Citwcml2YXRlOgorICAgIFdvcmtlckZpbGVXcml0ZXJIZWxwZXJDYWxsYmFja3MoQXN5bmNGaWxl
V3JpdGVyQ2xpZW50KiBjbGllbnQsIGNvbnN0IFN0cmluZyYgcGF0aCwgV2ViS2l0OjpXZWJGaWxl
U3lzdGVtKiB3ZWJGaWxlU3lzdGVtLCBQYXNzT3duUHRyPFdlYkNvcmU6OkFzeW5jRmlsZVN5c3Rl
bUNhbGxiYWNrcz4gY2FsbGJhY2tzLCBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0KQorICAg
ICAgICA6IG1fY2xpZW50KGNsaWVudCkKKyAgICAgICAgLCBtX3BhdGgocGF0aCkKKyAgICAgICAg
LCBtX3dlYkZpbGVTeXN0ZW0od2ViRmlsZVN5c3RlbSkKKyAgICAgICAgLCBtX2NhbGxiYWNrcyhj
YWxsYmFja3MpCisgICAgICAgICwgbV93b3JrZXJDb250ZXh0KHdvcmtlckNvbnRleHQpCisgICAg
eworICAgIH0KKworICAgIEFzeW5jRmlsZVdyaXRlckNsaWVudCogbV9jbGllbnQ7CisgICAgU3Ry
aW5nIG1fcGF0aDsKKyAgICBXZWJLaXQ6OldlYkZpbGVTeXN0ZW0qIG1fd2ViRmlsZVN5c3RlbTsK
KyAgICBPd25QdHI8V2ViQ29yZTo6QXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzPiBtX2NhbGxiYWNr
czsKKyAgICBXb3JrZXJDb250ZXh0KiBtX3dvcmtlckNvbnRleHQ7Cit9OworCit2b2lkIFdvcmtl
ckFzeW5jRmlsZVN5c3RlbUNocm9taXVtOjpjcmVhdGVXcml0ZXIoQXN5bmNGaWxlV3JpdGVyQ2xp
ZW50KiBjbGllbnQsIGNvbnN0IFN0cmluZyYgcGF0aCwgUGFzc093blB0cjxBc3luY0ZpbGVTeXN0
ZW1DYWxsYmFja3M+IGNhbGxiYWNrcykKIHsKLSAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIGNy
ZWF0ZVdvcmtlckZpbGVTeXN0ZW1DYWxsYmFja3NCcmlkZ2UoV29ya2VyRmlsZVdyaXRlckhlbHBl
ckNhbGxiYWNrczo6Y3JlYXRlKGNsaWVudCwgcGF0aCwgbV93ZWJGaWxlU3lzdGVtLCBjYWxsYmFj
a3MsIG1fd29ya2VyQ29udGV4dCkpLT5wb3N0UmVhZE1ldGFkYXRhVG9NYWluVGhyZWFkKG1fd2Vi
RmlsZVN5c3RlbSwgcGF0aCwgbV9tb2RlRm9yQ3VycmVudE9wZXJhdGlvbik7CiB9CiAKIFBhc3NS
ZWZQdHI8V29ya2VyRmlsZVN5c3RlbUNhbGxiYWNrc0JyaWRnZT4gV29ya2VyQXN5bmNGaWxlU3lz
dGVtQ2hyb21pdW06OmNyZWF0ZVdvcmtlckZpbGVTeXN0ZW1DYWxsYmFja3NCcmlkZ2UoUGFzc093
blB0cjxBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3M+IGNhbGxiYWNrcykKSW5kZXg6IFdlYktpdC9j
aHJvbWl1bS9zcmMvV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uY3Bw
CShyZXZpc2lvbiAwKQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJBc3luY0ZpbGVXcml0
ZXJDaHJvbWl1bS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
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
ZmlnLmgiCisjaW5jbHVkZSAiV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uaCIKKworI2lm
IEVOQUJMRShGSUxFX1NZU1RFTSkKKworI2luY2x1ZGUgIkFzeW5jRmlsZVN5c3RlbS5oIgorI2lu
Y2x1ZGUgIkFzeW5jRmlsZVdyaXRlckNsaWVudC5oIgorI2luY2x1ZGUgIkJsb2IuaCIKKyNpbmNs
dWRlICJTY3JpcHRFeGVjdXRpb25Db250ZXh0LmgiCisjaW5jbHVkZSAiV2ViRmlsZVN5c3RlbS5o
IgorI2luY2x1ZGUgIldlYkZpbGVXcml0ZXIuaCIKKyNpbmNsdWRlICJXZWJVUkwuaCIKKyNpbmNs
dWRlICJXZWJXb3JrZXJCYXNlLmgiCisjaW5jbHVkZSAiV29ya2VyQ29udGV4dC5oIgorI2luY2x1
ZGUgIldvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuaCIKKyNpbmNsdWRlICJXb3JrZXJM
b2FkZXJQcm94eS5oIgorI2luY2x1ZGUgIldvcmtlclRocmVhZC5oIgorCit1c2luZyBuYW1lc3Bh
Y2UgV2ViS2l0OworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBjb25zdCBjaGFyIGZp
bGVXcml0ZXJPcGVyYXRpb25zTW9kZVtdID0gImZpbGVXcml0ZXJPcGVyYXRpb25zTW9kZSI7CisK
K1dvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtOjpXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJv
bWl1bShXZWJGaWxlU3lzdGVtKiB3ZWJGaWxlU3lzdGVtLCBjb25zdCBTdHJpbmcmIHBhdGgsIFdv
cmtlckNvbnRleHQqIHdvcmtlckNvbnRleHQsIEFzeW5jRmlsZVdyaXRlckNsaWVudCogY2xpZW50
LCBib29sIHN5bmNocm9ub3VzKQorICAgIDogbV9zeW5jaHJvbm91cyhzeW5jaHJvbm91cykKK3sK
KyAgICBBU1NFUlQoIXN5bmNocm9ub3VzKTsgLy8gTm90IGltcGxlbWVudGVkIHlldC4KKworICAg
IFdvcmtlckxvYWRlclByb3h5KiBwcm94eSA9ICZ3b3JrZXJDb250ZXh0LT50aHJlYWQoKS0+d29y
a2VyTG9hZGVyUHJveHkoKTsKKyAgICBtX2JyaWRnZSA9IFdvcmtlckZpbGVXcml0ZXJDYWxsYmFj
a3NCcmlkZ2U6OmNyZWF0ZShwYXRoLCBwcm94eSwgd29ya2VyQ29udGV4dCwgY2xpZW50KTsKK30K
KworV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW06On5Xb3JrZXJBc3luY0ZpbGVXcml0ZXJD
aHJvbWl1bSgpCit7CisgICAgbV9icmlkZ2UtPnBvc3RTaHV0ZG93blRvTWFpblRocmVhZChtX2Jy
aWRnZSk7Cit9CisKK3ZvaWQgV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW06OndyaXRlKGxv
bmcgbG9uZyBwb3NpdGlvbiwgQmxvYiogZGF0YSkKK3sKKyAgICBtX2JyaWRnZS0+cG9zdFdyaXRl
VG9NYWluVGhyZWFkKHBvc2l0aW9uLCBkYXRhLT51cmwoKSk7Cit9CisKK3ZvaWQgV29ya2VyQXN5
bmNGaWxlV3JpdGVyQ2hyb21pdW06OnRydW5jYXRlKGxvbmcgbG9uZyBsZW5ndGgpCit7CisgICAg
bV9icmlkZ2UtPnBvc3RUcnVuY2F0ZVRvTWFpblRocmVhZChsZW5ndGgpOworfQorCit2b2lkIFdv
cmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtOjphYm9ydCgpCit7CisgICAgbV9icmlkZ2UtPnBv
c3RBYm9ydFRvTWFpblRocmVhZCgpOworfQorCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8g
RU5BQkxFKEZJTEVfU1lTVEVNKQpJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJBc3lu
Y0ZpbGVXcml0ZXJDaHJvbWl1bS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMv
V29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uaAkocmV2aXNpb24gMCkKKysrIFdlYktpdC9j
aHJvbWl1bS9zcmMvV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uaAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBB
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
REFNQUdFLgorICovCisKKyNpZm5kZWYgV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW1faAor
I2RlZmluZSBXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bV9oCisKKyNpZiBFTkFCTEUoRklM
RV9TWVNURU0pCisKKyNpbmNsdWRlICJBc3luY0ZpbGVXcml0ZXIuaCIKKyNpbmNsdWRlICJXZWJG
aWxlRXJyb3IuaCIKKyNpbmNsdWRlICJXZWJGaWxlV3JpdGVyQ2xpZW50LmgiCisjaW5jbHVkZSA8
d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisKK25hbWVzcGFjZSBX
ZWJLaXQgeworY2xhc3MgV2ViRmlsZVN5c3RlbTsKK2NsYXNzIFdlYkZpbGVXcml0ZXI7CitjbGFz
cyBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOworfQorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK2NsYXNzIEFzeW5jRmlsZVN5c3RlbTsKK2NsYXNzIEFzeW5jRmlsZVdyaXRlckNsaWVu
dDsKK2NsYXNzIEJsb2I7CitjbGFzcyBXb3JrZXJDb250ZXh0OworCitjbGFzcyBXb3JrZXJBc3lu
Y0ZpbGVXcml0ZXJDaHJvbWl1bSA6IHB1YmxpYyBBc3luY0ZpbGVXcml0ZXIgeworcHVibGljOgor
ICAgIFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtKFdlYktpdDo6V2ViRmlsZVN5c3RlbSos
IGNvbnN0IFN0cmluZyYgcGF0aCwgV29ya2VyQ29udGV4dCosIEFzeW5jRmlsZVdyaXRlckNsaWVu
dCosIGJvb2wgc3luY2hyb25vdXMpOworICAgIH5Xb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1
bSgpOworICAgIAorICAgIC8vIEZpbGVXcml0ZXIKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGUobG9u
ZyBsb25nIHBvc2l0aW9uLCBCbG9iKiBkYXRhKTsKKyAgICB2aXJ0dWFsIHZvaWQgdHJ1bmNhdGUo
bG9uZyBsb25nIGxlbmd0aCk7CisgICAgdmlydHVhbCB2b2lkIGFib3J0KCk7CisKK3ByaXZhdGU6
CisgICAgUmVmUHRyPFdlYktpdDo6V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gbV9i
cmlkZ2U7CisgICAgYm9vbCBtX3N5bmNocm9ub3VzOworfTsKKworfSAvLyBuYW1lc3BhY2UKKwor
I2VuZGlmIC8vIEVOQUJMRShGSUxFX1NZU1RFTSkKKworI2VuZGlmIC8vIEFzeW5jRmlsZVdyaXRl
ckNocm9taXVtX2gKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2VyRmlsZVdyaXRlckNh
bGxiYWNrc0JyaWRnZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3Jr
ZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYktpdC9j
aHJvbWl1bS9zcmMvV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5jcHAJKHJldmlzaW9u
IDApCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMg
YXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNv
cHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIg
dGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1
dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBm
cm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJt
aXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdI
VCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IK
KyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIldvcmtl
ckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuaCIKKworI2lmIEVOQUJMRShGSUxFX1NZU1RFTSkK
KworI2luY2x1ZGUgIkFzeW5jRmlsZVdyaXRlckNsaWVudC5oIgorI2luY2x1ZGUgIkNyb3NzVGhy
ZWFkVGFzay5oIgorI2luY2x1ZGUgIldlYkNTdHJpbmcuaCIKKyNpbmNsdWRlICJXZWJGaWxlU3lz
dGVtLmgiCisjaW5jbHVkZSAiV2ViRmlsZVdyaXRlci5oIgorI2luY2x1ZGUgIldlYktpdC5oIgor
I2luY2x1ZGUgIldlYktpdENsaWVudC5oIgorI2luY2x1ZGUgIldlYldvcmtlckJhc2UuaCIKKyNp
bmNsdWRlICJXb3JrZXJDb250ZXh0LmgiCisjaW5jbHVkZSAiV29ya2VyTG9hZGVyUHJveHkuaCIK
KyNpbmNsdWRlICJXb3JrZXJUaHJlYWQuaCIKKyNpbmNsdWRlIDx3dGYvTWFpblRocmVhZC5oPgor
I2luY2x1ZGUgPHd0Zi9UaHJlYWRpbmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit0ZW1w
bGF0ZTw+IHN0cnVjdCBDcm9zc1RocmVhZENvcGllckJhc2U8ZmFsc2UsIGZhbHNlLCBQYXNzUmVm
UHRyPFdlYktpdDo6V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gPiB7CisgICAgdHlw
ZWRlZiBQYXNzUmVmUHRyPFdlYktpdDo6V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4g
VHlwZTsKKyAgICBzdGF0aWMgVHlwZSBjb3B5KGNvbnN0IFBhc3NSZWZQdHI8V2ViS2l0OjpXb3Jr
ZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlPiYgYnJpZGdlKQorICAgIHsKKyAgICAgICAgVHlw
ZSBuZXdSZWYoYnJpZGdlLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIG5ld1JlZjsKKyAgICB9Cit9
OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwor
CituYW1lc3BhY2UgV2ViS2l0IHsKKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJp
ZGdlOjpub3RpZnlTdG9wKCkKK3sKKyAgICBBU1NFUlQobV93b3JrZXJDb250ZXh0LT5pc0NvbnRl
eHRUaHJlYWQoKSk7CisgICAgbV9jbGllbnRPbldvcmtlclRocmVhZCA9IDA7Cit9CisKK3ZvaWQg
V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6cG9zdFdyaXRlVG9NYWluVGhyZWFkKGxv
bmcgbG9uZyBwb3NpdGlvbiwgY29uc3QgS1VSTCYgZGF0YSkKK3sKKyAgICBkaXNwYXRjaFRhc2tU
b01haW5UaHJlYWQoY3JlYXRlQ2FsbGJhY2tUYXNrKCZ3cml0ZU9uTWFpblRocmVhZCwgdGhpcywg
cG9zaXRpb24sIGRhdGEpKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJp
ZGdlOjpwb3N0VHJ1bmNhdGVUb01haW5UaHJlYWQobG9uZyBsb25nIGxlbmd0aCkKK3sKKyAgICBk
aXNwYXRjaFRhc2tUb01haW5UaHJlYWQoY3JlYXRlQ2FsbGJhY2tUYXNrKCZ0cnVuY2F0ZU9uTWFp
blRocmVhZCwgdGhpcywgbGVuZ3RoKSk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxi
YWNrc0JyaWRnZTo6cG9zdEFib3J0VG9NYWluVGhyZWFkKCkKK3sKKyAgICBkaXNwYXRjaFRhc2tU
b01haW5UaHJlYWQoY3JlYXRlQ2FsbGJhY2tUYXNrKCZhYm9ydE9uTWFpblRocmVhZCwgdGhpcykp
OworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OnBvc3RTaHV0ZG93
blRvTWFpblRocmVhZChQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+
IGJyaWRnZSkKK3sKKyAgICBBU1NFUlQobV93b3JrZXJDb250ZXh0LT5pc0NvbnRleHRUaHJlYWQo
KSk7CisgICAgbV9jbGllbnRPbldvcmtlclRocmVhZCA9IDA7CisgICAgZGlzcGF0Y2hUYXNrVG9N
YWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmc2h1dGRvd25Pbk1haW5UaHJlYWQsIGJyaWRn
ZSkpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OndyaXRlT25N
YWluVGhyZWFkKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPFdvcmtlckZpbGVX
cml0ZXJDYWxsYmFja3NCcmlkZ2U+IGJyaWRnZSwgbG9uZyBsb25nIHBvc2l0aW9uLCBjb25zdCBL
VVJMJiBkYXRhKQoreworICAgIGJyaWRnZS0+bV93cml0ZXItPndyaXRlKHBvc2l0aW9uLCBXZWJV
UkwoZGF0YSkpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OnRy
dW5jYXRlT25NYWluVGhyZWFkKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPFdv
cmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+IGJyaWRnZSwgbG9uZyBsb25nIGxlbmd0aCkK
K3sKKyAgICBicmlkZ2UtPm1fd3JpdGVyLT50cnVuY2F0ZShsZW5ndGgpOworfQorCit2b2lkIFdv
cmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OmFib3J0T25NYWluVGhyZWFkKFNjcmlwdEV4
ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlk
Z2U+IGJyaWRnZSkKK3sKKyAgICBicmlkZ2UtPm1fd3JpdGVyLT5jYW5jZWwoKTsKK30KKwordm9p
ZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjppbml0T25NYWluVGhyZWFkKFNjcmlw
dEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NC
cmlkZ2U+IGJyaWRnZSwgY29uc3QgU3RyaW5nJiBwYXRoKQoreworICAgIEFTU0VSVCghYnJpZGdl
LT5tX3dyaXRlcik7CisgICAgYnJpZGdlLT5tX3dyaXRlciA9IGFkb3B0UHRyKHdlYktpdENsaWVu
dCgpLT5maWxlU3lzdGVtKCktPmNyZWF0ZUZpbGVXcml0ZXIocGF0aCwgYnJpZGdlLmdldCgpKSk7
Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6c2h1dGRvd25Pbk1h
aW5UaHJlYWQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdy
aXRlckNhbGxiYWNrc0JyaWRnZT4gYnJpZGdlKQoreworICAgIGJyaWRnZS0+bV93cml0ZXJEZWxl
dGVkID0gdHJ1ZTsKKyAgICBicmlkZ2UtPm1fd3JpdGVyLmNsZWFyKCk7Cit9CisKK3ZvaWQgV29y
a2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6ZGlkV3JpdGUobG9uZyBsb25nIGJ5dGVzLCBi
b29sIGNvbXBsZXRlKQoreworICAgIGRpc3BhdGNoVGFza1RvV29ya2VyVGhyZWFkKGNyZWF0ZUNh
bGxiYWNrVGFzaygmZGlkV3JpdGVPbldvcmtlclRocmVhZCwgdGhpcywgYnl0ZXMsIGNvbXBsZXRl
KSk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6ZGlkRmFpbChX
ZWJGaWxlRXJyb3IgZXJyb3IpCit7CisgICAgZGlzcGF0Y2hUYXNrVG9Xb3JrZXJUaHJlYWQoY3Jl
YXRlQ2FsbGJhY2tUYXNrKCZkaWRGYWlsT25Xb3JrZXJUaHJlYWQsIHRoaXMsIGVycm9yKSk7Cit9
CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6ZGlkVHJ1bmNhdGUoKQor
eworICAgIGRpc3BhdGNoVGFza1RvV29ya2VyVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmZGlk
VHJ1bmNhdGVPbldvcmtlclRocmVhZCwgdGhpcykpOworfQorCitXb3JrZXJGaWxlV3JpdGVyQ2Fs
bGJhY2tzQnJpZGdlOjpXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlKGNvbnN0IFN0cmlu
ZyYgcGF0aCwgV29ya2VyTG9hZGVyUHJveHkqIHByb3h5LCBTY3JpcHRFeGVjdXRpb25Db250ZXh0
KiBzY3JpcHRFeGVjdXRpb25Db250ZXh0LCBBc3luY0ZpbGVXcml0ZXJDbGllbnQqIGNsaWVudCkK
KyAgICA6IFdvcmtlckNvbnRleHQ6Ok9ic2VydmVyKHN0YXRpY19jYXN0PFdvcmtlckNvbnRleHQq
PihzY3JpcHRFeGVjdXRpb25Db250ZXh0KSkKKyAgICAsIG1fcHJveHkocHJveHkpCisgICAgLCBt
X3dyaXRlckRlbGV0ZWQoZmFsc2UpCisgICAgLCBtX3dvcmtlckNvbnRleHQoc2NyaXB0RXhlY3V0
aW9uQ29udGV4dCkKKyAgICAsIG1fY2xpZW50T25Xb3JrZXJUaHJlYWQoY2xpZW50KQoreworICAg
IEFTU0VSVChtX3dvcmtlckNvbnRleHQtPmlzQ29udGV4dFRocmVhZCgpKTsKKyAgICBwb3N0SW5p
dFRvTWFpblRocmVhZChwYXRoKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tz
QnJpZGdlOjpwb3N0SW5pdFRvTWFpblRocmVhZChjb25zdCBTdHJpbmcmIHBhdGgpCit7CisgICAg
ZGlzcGF0Y2hUYXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmaW5pdE9uTWFpblRo
cmVhZCwgdGhpcywgcGF0aCkpOworfQorCitXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdl
Ojp+V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZSgpCit7CisgICAgQVNTRVJUKCFtX2Ns
aWVudE9uV29ya2VyVGhyZWFkKTsKKyAgICBBU1NFUlQoIW1fd3JpdGVyKTsKK30KKwordm9pZCBX
b3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpkaWRXcml0ZU9uV29ya2VyVGhyZWFkKFNj
cmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlKiBi
cmlkZ2UsIGxvbmcgbG9uZyBsZW5ndGgsIGJvb2wgY29tcGxldGUpCit7CisgICAgYnJpZGdlLT5t
X2NsaWVudE9uV29ya2VyVGhyZWFkLT5kaWRXcml0ZShsZW5ndGgsIGNvbXBsZXRlKTsKK30KKwor
dm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpkaWRGYWlsT25Xb3JrZXJUaHJl
YWQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlk
Z2UqIGJyaWRnZSwgV2ViRmlsZUVycm9yIGVycm9yKQoreworICAgIGJyaWRnZS0+bV9jbGllbnRP
bldvcmtlclRocmVhZC0+ZGlkRmFpbChzdGF0aWNfY2FzdDxGaWxlRXJyb3I6OkVycm9yQ29kZT4o
ZXJyb3IpKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpkaWRU
cnVuY2F0ZU9uV29ya2VyVGhyZWFkKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBXb3JrZXJGaWxl
V3JpdGVyQ2FsbGJhY2tzQnJpZGdlKiBicmlkZ2UpCit7CisgICAgYnJpZGdlLT5tX2NsaWVudE9u
V29ya2VyVGhyZWFkLT5kaWRUcnVuY2F0ZSgpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJD
YWxsYmFja3NCcmlkZ2U6OnJ1blRhc2tPbk1haW5UaHJlYWQoU2NyaXB0RXhlY3V0aW9uQ29udGV4
dCogc2NyaXB0RXhlY3V0aW9uQ29udGV4dCwgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2Fs
bGJhY2tzQnJpZGdlPiBicmlkZ2UsIFBhc3NPd25QdHI8U2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6
VGFzaz4gdGFza1RvUnVuKQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgaWYg
KCFicmlkZ2UtPm1fd3JpdGVyRGVsZXRlZCkKKyAgICAgICAgdGFza1RvUnVuLT5wZXJmb3JtVGFz
ayhzY3JpcHRFeGVjdXRpb25Db250ZXh0KTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2Fs
bGJhY2tzQnJpZGdlOjpydW5UYXNrT25Xb3JrZXJUaHJlYWQoU2NyaXB0RXhlY3V0aW9uQ29udGV4
dCogc2NyaXB0RXhlY3V0aW9uQ29udGV4dCwgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2Fs
bGJhY2tzQnJpZGdlPiBicmlkZ2UsIFBhc3NPd25QdHI8U2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6
VGFzaz4gdGFza1RvUnVuKQoreworICAgIEFTU0VSVChicmlkZ2UtPm1fd29ya2VyQ29udGV4dC0+
aXNDb250ZXh0VGhyZWFkKCkpOworICAgIGlmIChicmlkZ2UtPm1fY2xpZW50T25Xb3JrZXJUaHJl
YWQpCisgICAgICAgIHRhc2tUb1J1bi0+cGVyZm9ybVRhc2soc2NyaXB0RXhlY3V0aW9uQ29udGV4
dCk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6ZGlzcGF0Y2hU
YXNrVG9NYWluVGhyZWFkKFBhc3NPd25QdHI8U2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6VGFzaz4g
dGFzaykKK3sKKyAgICBBU1NFUlQobV93b3JrZXJDb250ZXh0LT5pc0NvbnRleHRUaHJlYWQoKSk7
CisgICAgV2ViV29ya2VyQmFzZTo6ZGlzcGF0Y2hUYXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxi
YWNrVGFzaygmcnVuVGFza09uTWFpblRocmVhZCwgdGhpcywgdGFzaykpOworfQorCit2b2lkIFdv
cmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OmRpc3BhdGNoVGFza1RvV29ya2VyVGhyZWFk
KFBhc3NPd25QdHI8U2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6VGFzaz4gdGFzaykKK3sKKyAgICBB
U1NFUlQoaXNNYWluVGhyZWFkKCkpOworICAgIG1fcHJveHktPnBvc3RUYXNrRm9yTW9kZVRvV29y
a2VyQ29udGV4dChjcmVhdGVDYWxsYmFja1Rhc2soJnJ1blRhc2tPbldvcmtlclRocmVhZCwgdGhp
cywgdGFzayksICIiKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8g
RU5BQkxFKEZJTEVfU1lTVEVNKQpJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJGaWxl
V3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3Ny
Yy9Xb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmgJKHJldmlzaW9uIDApCisrKyBXZWJL
aXQvY2hyb21pdW0vc3JjL1dvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuaAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICog
Y29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhl
ciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJp
YnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVk
IGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBl
cm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJ
R0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NC
cmlkZ2VfaAorI2RlZmluZSBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlX2gKKworI2lm
IEVOQUJMRShGSUxFX1NZU1RFTSkKKworI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5j
bHVkZSAiV2ViRmlsZUVycm9yLmgiCisjaW5jbHVkZSAiV2ViRmlsZVdyaXRlckNsaWVudC5oIgor
I2luY2x1ZGUgIldvcmtlckNvbnRleHQuaCIKKyNpbmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgor
I2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CisjaW5jbHVkZSA8d3RmL1RocmVhZGluZy5oPgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBBc3luY0ZpbGVXcml0ZXJDbGllbnQ7CitjbGFz
cyBLVVJMOworY2xhc3MgV29ya2VyTG9hZGVyUHJveHk7Cit9CisKK25hbWVzcGFjZSBXZWJLaXQg
eworCitjbGFzcyBXZWJGaWxlU3lzdGVtOworY2xhc3MgV2ViRmlsZVdyaXRlcjsKK2NsYXNzIFdl
YkZpbGVXcml0ZXJDbGllbnQ7CitjbGFzcyBXZWJXb3JrZXJCYXNlOworCisvLyBUaGlzIGNsYXNz
IGlzIHVzZWQgYXMgYSBtZWNoYW5pc20gdG8gYnJpZGdlIGNhbGxzIGJldHdlZW4gdGhyZWFkcy4K
Ky8vIENhbGxzIHRvIGEgV2ViRmlsZVdyaXRlciBtdXN0IGhhcHBlbiBvbiB0aGUgbWFpbiB0aHJl
YWQsIGJ1dCB0aGV5IGNvbWUgZnJvbQorLy8gdGhlIGNvbnRleHQgdGhyZWFkLiAgVGhlIHJlc3Bv
bnNlcyB0aHJvdWdoIHRoZSBXZWJGaWxlV3JpdGVyQ2xpZW50IGludGVyZmFjZQorLy8gc3RhcnQg
b24gdGhlIG1haW4gdGhyZWFkLCBidXQgbXVzdCBiZSBzZW50IHZpYSB0aGUgd29ya2VyIGNvbnRl
eHQgdGhyZWFkLgorLy8KKy8vIEEgdHlwaWNhbCBmbG93IGZvciB3cml0ZSB3b3VsZCBsb29rIGxp
a2UgdGhpczoKKy8vIEJyaWRnZTo6cG9zdFdyaXRlVG9NYWluVGhyZWFkKCkgb24gV29ya2VyVGhy
ZWFkCisvLyAgLS0+IEJyaWRnZTo6d3JpdGVPbk1haW5UaHJlYWQoKSBpcyBjYWxsZWQgb24gTWFp
blRocmVhZAorLy8gIC0tPiBXZWJGaWxlV3JpdGVyOjp3cml0ZSgpCisvLyAgICAgIFRoaXMgbWFr
ZXMgYW4gSVBDOyB0aGUgYWN0dWFsIG9wZXJhdGlvbiBpcyBkb3duIGluIHRoZSBicm93c2VyLgor
Ly8gIC0tPiBCcmlkZ2U6OmRpZFdyaXRlIGlzIGNhbGxlZCBvbiBNYWluVGhyZWFkCisvLyAgLS0+
IEJyaWRnZTo6ZGlkV3JpdGVPbldvcmtlclRocmVhZCBpcyBjYWxsZWQgb24gV29ya2VyVGhyZWFk
CisvLyAgICAgIFRoaXMgY2FsbHMgdGhlIG9yaWdpbmFsIGNsaWVudCAobV9jbGllbnRPbldvcmtl
clRocmVhZCkuCitjbGFzcyBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlIDogcHVibGlj
IFRocmVhZFNhZmVTaGFyZWQ8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4sIHB1Ymxp
YyBXZWJDb3JlOjpXb3JrZXJDb250ZXh0OjpPYnNlcnZlciwgcHVibGljIFdlYkZpbGVXcml0ZXJD
bGllbnQgeworcHVibGljOgorICAgIH5Xb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlKCk7
CisKKyAgICAvLyBXb3JrZXJDb250ZXh0OjpPYnNlcnZlciBtZXRob2QuCisgICAgdmlydHVhbCB2
b2lkIG5vdGlmeVN0b3AoKTsKKworICAgIHN0YXRpYyBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0
ZXJDYWxsYmFja3NCcmlkZ2U+IGNyZWF0ZShjb25zdCBTdHJpbmcmIHBhdGgsIFdlYkNvcmU6Oldv
cmtlckxvYWRlclByb3h5KiBwcm94eSwgV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCog
d29ya2VyQ29udGV4dCwgV2ViQ29yZTo6QXN5bmNGaWxlV3JpdGVyQ2xpZW50KiBjbGllbnQpCisg
ICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFdvcmtlckZpbGVXcml0ZXJDYWxsYmFj
a3NCcmlkZ2UocGF0aCwgcHJveHksIHdvcmtlckNvbnRleHQsIGNsaWVudCkpOworICAgIH0KKwor
ICAgIC8vIE1ldGhvZHMgdGhhdCBjcmVhdGUgYW4gaW5zdGFuY2UgYW5kIHBvc3QgYW4gaW5pdGlh
bCByZXF1ZXN0IHRhc2sgdG8gdGhlIG1haW4gdGhyZWFkLiBUaGV5IG11c3QgYmUgY2FsbGVkIG9u
IHRoZSB3b3JrZXIgdGhyZWFkLgorICAgIHZvaWQgcG9zdFdyaXRlVG9NYWluVGhyZWFkKGxvbmcg
bG9uZyBwb3NpdGlvbiwgY29uc3QgV2ViQ29yZTo6S1VSTCYgZGF0YSk7CisgICAgdm9pZCBwb3N0
VHJ1bmNhdGVUb01haW5UaHJlYWQobG9uZyBsb25nIGxlbmd0aCk7CisgICAgdm9pZCBwb3N0QWJv
cnRUb01haW5UaHJlYWQoKTsKKworICAgIC8vIFRoZSBvd25pbmcgV29ya2VyQXN5bmNGaWxlV3Jp
dGVyQ2hyb21pdW0gc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgYmVmb3JlIGRyb3BwaW5nIGl0cyBs
YXN0IHJlZmVyZW5jZSB0byB0aGUgYnJpZGdlLCBvbiB0aGUgY29udGV4dCB0aHJlYWQuCisgICAg
Ly8gVGhlIGFjdHVhbCBkZWxldGlvbiBvZiB0aGUgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0Jy
aWRnZSBtYXkgaGFwcGVuIG9uIGVpdGhlciB0aGUgbWFpbiBvciBjb250ZXh0IHRocmVhZCwgZGVw
ZW5kaW5nIG9uIHdoZXJlIHRoZSBsYXN0IHJlZmVyZW5jZSBnb2VzIGF3YXk7IHRoYXQncyBzYWZl
IGFzIGxvbmcgYXMgdGhpcyBpcyBjYWxsZWQgZmlyc3QuCisgICAgdm9pZCBwb3N0U2h1dGRvd25U
b01haW5UaHJlYWQoUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlPik7
CisKKyAgICAvLyBDYWxsYmFjayBtZXRob2RzIHRoYXQgYXJlIGNhbGxlZCBvbiB0aGUgbWFpbiB0
aHJlYWQuCisgICAgLy8gVGhlc2UgYXJlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBXZWJLaXQ6Oldl
YkZpbGVXcml0ZXJDbGllbnQuCisgICAgdm9pZCBkaWRXcml0ZShsb25nIGxvbmcgYnl0ZXMsIGJv
b2wgY29tcGxldGUpOworICAgIHZvaWQgZGlkRmFpbChXZWJGaWxlRXJyb3IpOworICAgIHZvaWQg
ZGlkVHJ1bmNhdGUoKTsKKworcHJpdmF0ZToKKyAgICBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tz
QnJpZGdlKGNvbnN0IFN0cmluZyYgcGF0aCwgV2ViQ29yZTo6V29ya2VyTG9hZGVyUHJveHkqLCBX
ZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgV2ViQ29yZTo6QXN5bmNGaWxlV3JpdGVy
Q2xpZW50Kik7CisKKyAgICB2b2lkIHBvc3RJbml0VG9NYWluVGhyZWFkKGNvbnN0IFN0cmluZyYg
cGF0aCk7CisKKyAgICAvLyBNZXRob2RzIHRoYXQgYXJlIHRvIGJlIGNhbGxlZCBvbiB0aGUgbWFp
biB0aHJlYWQuCisgICAgc3RhdGljIHZvaWQgd3JpdGVPbk1haW5UaHJlYWQoV2ViQ29yZTo6U2Ny
aXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNr
c0JyaWRnZT4sIGxvbmcgbG9uZyBwb3NpdGlvbiwgY29uc3QgV2ViQ29yZTo6S1VSTCYgZGF0YSk7
CisgICAgc3RhdGljIHZvaWQgdHJ1bmNhdGVPbk1haW5UaHJlYWQoV2ViQ29yZTo6U2NyaXB0RXhl
Y3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRn
ZT4sIGxvbmcgbG9uZyBsZW5ndGgpOworICAgIHN0YXRpYyB2b2lkIGFib3J0T25NYWluVGhyZWFk
KFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPFdvcmtlckZpbGVX
cml0ZXJDYWxsYmFja3NCcmlkZ2U+KTsKKyAgICBzdGF0aWMgdm9pZCBpbml0T25NYWluVGhyZWFk
KFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPFdvcmtlckZpbGVX
cml0ZXJDYWxsYmFja3NCcmlkZ2U+LCBjb25zdCBTdHJpbmcmIHBhdGgpOworICAgIHN0YXRpYyB2
b2lkIHNodXRkb3duT25NYWluVGhyZWFkKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQq
LCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+KTsKKworICAgIC8v
IE1ldGhvZHMgdGhhdCBkaXNwYXRjaCB0byBBc3luY0ZpbGVXcml0ZXJDbGllbnQgb24gdGhlIHdv
cmtlciB0aHJlYWRzLgorICAgIC8vIFRoZXkgcmVsZWFzZSBhIHNlbGZSZWYgb2YgdGhlIFdvcmtl
ckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuCisgICAgc3RhdGljIHZvaWQgZGlkV3JpdGVPbldv
cmtlclRocmVhZChXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgV29ya2VyRmlsZVdy
aXRlckNhbGxiYWNrc0JyaWRnZSosIGxvbmcgbG9uZyBsZW5ndGgsIGJvb2wgY29tcGxldGUpOwor
ICAgIHN0YXRpYyB2b2lkIGRpZEZhaWxPbldvcmtlclRocmVhZChXZWJDb3JlOjpTY3JpcHRFeGVj
dXRpb25Db250ZXh0KiwgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZSosIFdlYkZpbGVF
cnJvcik7CisgICAgc3RhdGljIHZvaWQgZGlkVHJ1bmNhdGVPbldvcmtlclRocmVhZChXZWJDb3Jl
OjpTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRn
ZSopOworCisgICAgLy8gTGF6eSBpbml0aWFsaXphdGlvbiBvZiB0aGUgV2ViRmlsZVdyaXRlci4K
KyAgICB2b2lkIGluaXRXZWJGaWxlV3JpdGVyKCk7CisgICAgc3RhdGljIHZvaWQgcnVuVGFza09u
TWFpblRocmVhZChXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxX
b3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlPiwgUGFzc093blB0cjxXZWJDb3JlOjpTY3Jp
cHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPik7CisgICAgc3RhdGljIHZvaWQgcnVuVGFza09uV29y
a2VyVGhyZWFkKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPFdv
cmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+LCBQYXNzT3duUHRyPFdlYkNvcmU6OlNjcmlw
dEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2s+KTsKKworICAgIHZvaWQgZGlzcGF0Y2hUYXNrVG9NYWlu
VGhyZWFkKFBhc3NPd25QdHI8V2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6VGFzaz4p
OworICAgIHZvaWQgZGlzcGF0Y2hUYXNrVG9Xb3JrZXJUaHJlYWQoUGFzc093blB0cjxXZWJDb3Jl
OjpTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPik7CisKKyAgICAvLyBVc2VkIGZyb20gdGhl
IG1haW4gdGhyZWFkIHRvIHBvc3QgdGFza3MgdG8gdGhlIGNvbnRleHQgdGhyZWFkLgorICAgIFdl
YkNvcmU6OldvcmtlckxvYWRlclByb3h5KiBtX3Byb3h5OworICAgIC8vIFVzZWQgdG8gaW5kaWNh
dGUgdGhhdCBzaHV0ZG93biBoYXMgc3RhcnRlZCBvbiB0aGUgbWFpbiB0aHJlYWQsIGFuZCBoZW5j
ZSB0aGUgd3JpdGVyIGhhcyBiZWVuIGRlbGV0ZWQuCisgICAgYm9vbCBtX3dyaXRlckRlbGV0ZWQ7
CisKKyAgICAvLyBVc2VkIG9uIHRoZSBjb250ZXh0IHRocmVhZCwgb25seSB0byBjaGVjayB0aGF0
IHdlJ3JlIHJ1bm5pbmcgb24gdGhlIGNvbnRleHQgdGhyZWFkLgorICAgIFdlYkNvcmU6OlNjcmlw
dEV4ZWN1dGlvbkNvbnRleHQqIG1fd29ya2VyQ29udGV4dDsKKworICAgIC8vIENyZWF0ZWQgYW5k
IGRlc3Ryb3llZCBmcm9tIHRoZSBtYWluIHRocmVhZC4KKyAgICBPd25QdHI8V2ViS2l0OjpXZWJG
aWxlV3JpdGVyPiBtX3dyaXRlcjsKKworICAgIC8vIFVzZWQgb24gdGhlIGNvbnRleHQgdGhyZWFk
IHRvIGNhbGwgYmFjayBpbnRvIHRoZSBjbGllbnQuCisgICAgV2ViQ29yZTo6QXN5bmNGaWxlV3Jp
dGVyQ2xpZW50KiBtX2NsaWVudE9uV29ya2VyVGhyZWFkOworfTsKKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQorCisjZW5kaWYKKworI2VuZGlmIC8vIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NC
cmlkZ2VfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>73680</attachid>
            <date>2010-11-11 16:33:36 -0800</date>
            <delta_ts>2010-11-16 16:44:53 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-47681-20101111163334.patch</filename>
            <type>text/plain</type>
            <size>31065</size>
            <attacher name="Eric U.">ericu</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3MTY5OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTQgQEAKKzIwMTAtMTEtMDcgIEVyaWMgVWhyaGFuZSAgPGVyaWN1QGNocm9taXVt
Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBb
Q2hyb21pdW1dIGltcGxlbWVudGF0aW9uIG9mIGFzeW5jIEZpbGVXcml0ZXIgZm9yIHdvcmtlcnMK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ3NjgxCisK
KyAgICAgICAgVGVzdHMgYXJlIGluIGEgc2VwYXJhdGUgY2hhbmdlbGlzdC4KKworICAgICAgICAq
IHBsYXRmb3JtL0Nyb3NzVGhyZWFkQ29waWVyLmg6IENoYW5nZWQgQ3Jvc3NUaHJlYWRDb3BpZXJb
QmFzZV0gdG8gc3VwcG9ydCBQYXNzUmVmUHRycworCiAyMDEwLTExLTA5ICBBYmhpc2hlayBBcnlh
ICA8aW5mZXJub0BjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQW50dGkgS29p
dmlzdG8uCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL0Nyb3NzVGhyZWFkQ29waWVyLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9Dcm9zc1RocmVhZENvcGllci5oCShyZXZpc2lvbiA3
MTY5OSkKKysrIFdlYkNvcmUvcGxhdGZvcm0vQ3Jvc3NUaHJlYWRDb3BpZXIuaAkod29ya2luZyBj
b3B5KQpAQCAtNzEsNyArNzEsOCBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKICAgICAvLyBDdXN0
b20gY29weSBtZXRob2RzLgogICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBDcm9zc1Ro
cmVhZENvcGllckJhc2U8ZmFsc2UsIHRydWUsIFQ+IHsKLSAgICAgICAgdHlwZWRlZiB0eXBlbmFt
ZSBXVEY6OlJlbW92ZVRlbXBsYXRlPFQsIFJlZlB0cj46OlR5cGUgUmVmQ291bnRlZFR5cGU7Cisg
ICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgV1RGOjpSZW1vdmVUZW1wbGF0ZTxULCBSZWZQdHI+OjpU
eXBlIFR5cGVXaXRob3V0UmVmUHRyOworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIFdURjo6UmVt
b3ZlVGVtcGxhdGU8VHlwZVdpdGhvdXRSZWZQdHIsIFBhc3NSZWZQdHI+OjpUeXBlIFJlZkNvdW50
ZWRUeXBlOwogICAgICAgICB0eXBlZGVmIFBhc3NSZWZQdHI8UmVmQ291bnRlZFR5cGU+IFR5cGU7
CiAgICAgICAgIHN0YXRpYyBUeXBlIGNvcHkoY29uc3QgVCYgcmVmUHRyKQogICAgICAgICB7CkBA
IC0xMTMsNyArMTE0LDggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgIH07CiAKICAgICB0ZW1w
bGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgQ3Jvc3NUaHJlYWRDb3BpZXIgOiBwdWJsaWMgQ3Jvc3NU
aHJlYWRDb3BpZXJCYXNlPFdURjo6SXNDb252ZXJ0aWJsZVRvSW50ZWdlcjxUPjo6dmFsdWUsCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBXVEY6OklzU3ViY2xhc3NPZlRlbXBsYXRlPHR5cGVuYW1l
IFdURjo6UmVtb3ZlVGVtcGxhdGU8VCwgUmVmUHRyPjo6VHlwZSwgVGhyZWFkU2FmZVNoYXJlZD46
OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1RGOjpJc1N1YmNsYXNzT2ZUZW1wbGF0
ZTx0eXBlbmFtZSBXVEY6OlJlbW92ZVRlbXBsYXRlPFQsIFJlZlB0cj46OlR5cGUsIFRocmVhZFNh
ZmVTaGFyZWQ+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFdURjo6SXNT
dWJjbGFzc09mVGVtcGxhdGU8dHlwZW5hbWUgV1RGOjpSZW1vdmVUZW1wbGF0ZTxULCBQYXNzUmVm
UHRyPjo6VHlwZSwgVGhyZWFkU2FmZVNoYXJlZD46OnZhbHVlLAogICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgVD4gewogICAgIH07CiAKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwkocmV2aXNpb24gNzE2OTkpCisr
KyBXZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjMg
QEAKKzIwMTAtMTEtMDcgIEVyaWMgVWhyaGFuZSAgPGVyaWN1QGNocm9taXVtLm9yZz4KKworICAg
ICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBbQ2hyb21pdW1dIGlt
cGxlbWVudGF0aW9uIG9mIGFzeW5jIEZpbGVXcml0ZXIgZm9yIHdvcmtlcnMKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ3NjgxCisKKyAgICAgICAgVGVz
dHMgYXJlIGluIGEgc2VwYXJhdGUgY2hhbmdlbGlzdC4KKworICAgICAgICBBZGRlZCBuZXcgZmls
ZXMuCisgICAgICAgICogV2ViS2l0Lmd5cDoKKworICAgICAgICAqIHNyYy9Xb3JrZXJBc3luY0Zp
bGVTeXN0ZW1DaHJvbWl1bS5jcHA6IEFkZGVkIFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVt
IGNvbnN0cnVjdGlvbi4KKyAgICAgICAgKiBzcmMvV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21p
dW0uY3BwOiBBZGRlZC4KKyAgICAgICAgKiBzcmMvV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21p
dW0uaDogQWRkZWQuCisKKyAgICAgICAgVGhpcyBjbGFzcyBicmlkZ2VzIGJldHdlZW4gdGhlIGNv
bnRleHQgYW5kIG1haW4gdGhyZWFkcyBmb3IgdGhlIFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9t
aXVtLgorICAgICAgICAqIHNyYy9Xb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmNwcDog
QWRkZWQuCisgICAgICAgICogc3JjL1dvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuaDog
QWRkZWQuCisKIDIwMTAtMTEtMDkgIEtlbnQgVGFtdXJhICA8dGtlbnRAY2hyb21pdW0ub3JnPgog
CiAgICAgICAgIFJldmlld2VkIGJ5IERpbWl0cmkgR2xhemtvdi4KSW5kZXg6IFdlYktpdC9jaHJv
bWl1bS9XZWJLaXQuZ3lwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9XZWJLaXQuZ3lw
CShyZXZpc2lvbiA3MTY5OSkKKysrIFdlYktpdC9jaHJvbWl1bS9XZWJLaXQuZ3lwCSh3b3JraW5n
IGNvcHkpCkBAIC01NDcsOCArNTQ3LDEyIEBACiAgICAgICAgICAgICAgICAgJ3NyYy9XZWJXb3Jr
ZXJJbXBsLmgnLAogICAgICAgICAgICAgICAgICdzcmMvV29ya2VyQXN5bmNGaWxlU3lzdGVtQ2hy
b21pdW0uY3BwJywKICAgICAgICAgICAgICAgICAnc3JjL1dvcmtlckFzeW5jRmlsZVN5c3RlbUNo
cm9taXVtLmgnLAorICAgICAgICAgICAgICAgICdzcmMvV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hy
b21pdW0uY3BwJywKKyAgICAgICAgICAgICAgICAnc3JjL1dvcmtlckFzeW5jRmlsZVdyaXRlckNo
cm9taXVtLmgnLAogICAgICAgICAgICAgICAgICdzcmMvV29ya2VyRmlsZVN5c3RlbUNhbGxiYWNr
c0JyaWRnZS5jcHAnLAogICAgICAgICAgICAgICAgICdzcmMvV29ya2VyRmlsZVN5c3RlbUNhbGxi
YWNrc0JyaWRnZS5oJywKKyAgICAgICAgICAgICAgICAnc3JjL1dvcmtlckZpbGVXcml0ZXJDYWxs
YmFja3NCcmlkZ2UuY3BwJywKKyAgICAgICAgICAgICAgICAnc3JjL1dvcmtlckZpbGVXcml0ZXJD
YWxsYmFja3NCcmlkZ2UuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9XcmFwcGVkUmVzb3VyY2VS
ZXF1ZXN0LmgnLAogICAgICAgICAgICAgICAgICdzcmMvV3JhcHBlZFJlc291cmNlUmVzcG9uc2Uu
aCcsCiAgICAgICAgICAgICAgICAgJ3NyYy93aW4vV2ViSW5wdXRFdmVudEZhY3RvcnkuY3BwJywK
SW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2VyQXN5bmNGaWxlU3lzdGVtQ2hyb21pdW0u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2VyQXN5bmNGaWxlU3lz
dGVtQ2hyb21pdW0uY3BwCShyZXZpc2lvbiA3MTY5OSkKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMv
V29ya2VyQXN5bmNGaWxlU3lzdGVtQ2hyb21pdW0uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zNCwx
MyArMzQsMTYgQEAKICNpZiBFTkFCTEUoRklMRV9TWVNURU0pCiAKICNpbmNsdWRlICJBc3luY0Zp
bGVTeXN0ZW1DYWxsYmFja3MuaCIKKyNpbmNsdWRlICJGaWxlTWV0YWRhdGEuaCIKICNpbmNsdWRl
ICJGaWxlU3lzdGVtLmgiCiAjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlICJX
ZWJGaWxlU3lzdGVtLmgiCiAjaW5jbHVkZSAiV2ViRmlsZVN5c3RlbUNhbGxiYWNrc0ltcGwuaCIK
KyNpbmNsdWRlICJXZWJGaWxlV3JpdGVyLmgiCiAjaW5jbHVkZSAiV2ViS2l0LmgiCiAjaW5jbHVk
ZSAiV2ViS2l0Q2xpZW50LmgiCiAjaW5jbHVkZSAiV2ViV29ya2VyQmFzZS5oIgorI2luY2x1ZGUg
IldvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtLmgiCiAjaW5jbHVkZSAiV29ya2VyQ29udGV4
dC5oIgogI2luY2x1ZGUgIldvcmtlckZpbGVTeXN0ZW1DYWxsYmFja3NCcmlkZ2UuaCIKICNpbmNs
dWRlICJXb3JrZXJTY3JpcHRDb250cm9sbGVyLmgiCkBAIC0xMzQsOSArMTM3LDc2IEBAIHZvaWQg
V29ya2VyQXN5bmNGaWxlU3lzdGVtQ2hyb21pdW06OnJlYWQKICAgICBjcmVhdGVXb3JrZXJGaWxl
U3lzdGVtQ2FsbGJhY2tzQnJpZGdlKGNhbGxiYWNrcyktPnBvc3RSZWFkRGlyZWN0b3J5VG9NYWlu
VGhyZWFkKG1fd2ViRmlsZVN5c3RlbSwgcGF0aCwgbV9tb2RlRm9yQ3VycmVudE9wZXJhdGlvbik7
CiB9CiAKLXZvaWQgV29ya2VyQXN5bmNGaWxlU3lzdGVtQ2hyb21pdW06OmNyZWF0ZVdyaXRlcihB
c3luY0ZpbGVXcml0ZXJDbGllbnQqLCBjb25zdCBTdHJpbmcmLCBQYXNzT3duUHRyPEFzeW5jRmls
ZVN5c3RlbUNhbGxiYWNrcz4pCitjbGFzcyBXb3JrZXJGaWxlV3JpdGVySGVscGVyQ2FsbGJhY2tz
IDogcHVibGljIEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrcyB7CitwdWJsaWM6CisgICAgc3RhdGlj
IFBhc3NPd25QdHI8V29ya2VyRmlsZVdyaXRlckhlbHBlckNhbGxiYWNrcz4gY3JlYXRlKEFzeW5j
RmlsZVdyaXRlckNsaWVudCogY2xpZW50LCBjb25zdCBTdHJpbmcmIHBhdGgsIFdlYktpdDo6V2Vi
RmlsZVN5c3RlbSogd2ViRmlsZVN5c3RlbSwgUGFzc093blB0cjxXZWJDb3JlOjpBc3luY0ZpbGVT
eXN0ZW1DYWxsYmFja3M+IGNhbGxiYWNrcywgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCkK
KyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFB0cihuZXcgV29ya2VyRmlsZVdyaXRlckhlbHBl
ckNhbGxiYWNrcyhjbGllbnQsIHBhdGgsIHdlYkZpbGVTeXN0ZW0sIGNhbGxiYWNrcywgd29ya2Vy
Q29udGV4dCkpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBkaWRTdWNjZWVkKCkKKyAgICB7
CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9p
ZCBkaWRSZWFkTWV0YWRhdGEoY29uc3QgRmlsZU1ldGFkYXRhJiBtZXRhZGF0YSkKKyAgICB7Cisg
ICAgICAgIEFTU0VSVChtX2NhbGxiYWNrcyk7CisgICAgICAgIGlmIChtZXRhZGF0YS50eXBlICE9
IEZpbGVNZXRhZGF0YTo6VHlwZUZpbGUgfHwgbWV0YWRhdGEubGVuZ3RoIDwgMCkKKyAgICAgICAg
ICAgIG1fY2FsbGJhY2tzLT5kaWRGYWlsKFdlYktpdDo6V2ViRmlsZUVycm9ySW52YWxpZFN0YXRl
KTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBPd25QdHI8V29ya2VyQXN5bmNGaWxlV3Jp
dGVyQ2hyb21pdW0+IGFzeW5jRmlsZVdyaXRlckNocm9taXVtID0gV29ya2VyQXN5bmNGaWxlV3Jp
dGVyQ2hyb21pdW06OmNyZWF0ZShtX3dlYkZpbGVTeXN0ZW0sIG1fcGF0aCwgbV93b3JrZXJDb250
ZXh0LCBtX2NsaWVudCwgZmFsc2UpOworICAgICAgICAgICAgbV9jYWxsYmFja3MtPmRpZENyZWF0
ZUZpbGVXcml0ZXIoYXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0ucmVsZWFzZSgpLCBtZXRhZGF0YS5s
ZW5ndGgpOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGRpZFJlYWREaXJl
Y3RvcnlFbnRyeShjb25zdCBTdHJpbmcmIG5hbWUsIGJvb2wgaXNEaXJlY3RvcnkpCisgICAgewor
ICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQg
ZGlkUmVhZERpcmVjdG9yeUVudHJpZXMoYm9vbCBoYXNNb3JlKQorICAgIHsKKyAgICAgICAgQVNT
RVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGRpZE9wZW5GaWxl
U3lzdGVtKGNvbnN0IFN0cmluZyYsIFBhc3NPd25QdHI8QXN5bmNGaWxlU3lzdGVtPikKKyAgICB7
CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KKworICAgIC8vIENhbGxlZCB3
aGVuIGFuIEFzeW5jRmlsZVdydGVyIGhhcyBiZWVuIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAg
IHZpcnR1YWwgdm9pZCBkaWRDcmVhdGVGaWxlV3JpdGVyKFBhc3NPd25QdHI8QXN5bmNGaWxlV3Jp
dGVyPiwgbG9uZyBsb25nKQorICAgIHsKKyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cisg
ICAgfQorCisgICAgdmlydHVhbCB2b2lkIGRpZEZhaWwoaW50IGNvZGUpCisgICAgeworICAgICAg
ICBBU1NFUlQobV9jYWxsYmFja3MpOworICAgICAgICBtX2NhbGxiYWNrcy0+ZGlkRmFpbChjb2Rl
KTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgV29ya2VyRmlsZVdyaXRlckhlbHBlckNhbGxiYWNr
cyhBc3luY0ZpbGVXcml0ZXJDbGllbnQqIGNsaWVudCwgY29uc3QgU3RyaW5nJiBwYXRoLCBXZWJL
aXQ6OldlYkZpbGVTeXN0ZW0qIHdlYkZpbGVTeXN0ZW0sIFBhc3NPd25QdHI8V2ViQ29yZTo6QXN5
bmNGaWxlU3lzdGVtQ2FsbGJhY2tzPiBjYWxsYmFja3MsIFdvcmtlckNvbnRleHQqIHdvcmtlckNv
bnRleHQpCisgICAgICAgIDogbV9jbGllbnQoY2xpZW50KQorICAgICAgICAsIG1fcGF0aChwYXRo
KQorICAgICAgICAsIG1fd2ViRmlsZVN5c3RlbSh3ZWJGaWxlU3lzdGVtKQorICAgICAgICAsIG1f
Y2FsbGJhY2tzKGNhbGxiYWNrcykKKyAgICAgICAgLCBtX3dvcmtlckNvbnRleHQod29ya2VyQ29u
dGV4dCkKKyAgICB7CisgICAgfQorCisgICAgQXN5bmNGaWxlV3JpdGVyQ2xpZW50KiBtX2NsaWVu
dDsKKyAgICBTdHJpbmcgbV9wYXRoOworICAgIFdlYktpdDo6V2ViRmlsZVN5c3RlbSogbV93ZWJG
aWxlU3lzdGVtOworICAgIE93blB0cjxXZWJDb3JlOjpBc3luY0ZpbGVTeXN0ZW1DYWxsYmFja3M+
IG1fY2FsbGJhY2tzOworICAgIFdvcmtlckNvbnRleHQqIG1fd29ya2VyQ29udGV4dDsKK307CisK
K3ZvaWQgV29ya2VyQXN5bmNGaWxlU3lzdGVtQ2hyb21pdW06OmNyZWF0ZVdyaXRlcihBc3luY0Zp
bGVXcml0ZXJDbGllbnQqIGNsaWVudCwgY29uc3QgU3RyaW5nJiBwYXRoLCBQYXNzT3duUHRyPEFz
eW5jRmlsZVN5c3RlbUNhbGxiYWNrcz4gY2FsbGJhY2tzKQogewotICAgIG5vdEltcGxlbWVudGVk
KCk7CisgICAgY3JlYXRlV29ya2VyRmlsZVN5c3RlbUNhbGxiYWNrc0JyaWRnZShXb3JrZXJGaWxl
V3JpdGVySGVscGVyQ2FsbGJhY2tzOjpjcmVhdGUoY2xpZW50LCBwYXRoLCBtX3dlYkZpbGVTeXN0
ZW0sIGNhbGxiYWNrcywgbV93b3JrZXJDb250ZXh0KSktPnBvc3RSZWFkTWV0YWRhdGFUb01haW5U
aHJlYWQobV93ZWJGaWxlU3lzdGVtLCBwYXRoLCBtX21vZGVGb3JDdXJyZW50T3BlcmF0aW9uKTsK
IH0KIAogUGFzc1JlZlB0cjxXb3JrZXJGaWxlU3lzdGVtQ2FsbGJhY2tzQnJpZGdlPiBXb3JrZXJB
c3luY0ZpbGVTeXN0ZW1DaHJvbWl1bTo6Y3JlYXRlV29ya2VyRmlsZVN5c3RlbUNhbGxiYWNrc0Jy
aWRnZShQYXNzT3duUHRyPEFzeW5jRmlsZVN5c3RlbUNhbGxiYWNrcz4gY2FsbGJhY2tzKQpJbmRl
eDogV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJBc3luY0ZpbGVXcml0ZXJD
aHJvbWl1bS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckFz
eW5jRmlsZVdyaXRlckNocm9taXVtLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw4NSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisg
KiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMu
IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5k
b3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3
aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVU
T1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dO
RVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQor
ICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1
bS5oIgorCisjaWYgRU5BQkxFKEZJTEVfU1lTVEVNKQorCisjaW5jbHVkZSAiQXN5bmNGaWxlU3lz
dGVtLmgiCisjaW5jbHVkZSAiQXN5bmNGaWxlV3JpdGVyQ2xpZW50LmgiCisjaW5jbHVkZSAiQmxv
Yi5oIgorI2luY2x1ZGUgIlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQuaCIKKyNpbmNsdWRlICJXZWJG
aWxlU3lzdGVtLmgiCisjaW5jbHVkZSAiV2ViRmlsZVdyaXRlci5oIgorI2luY2x1ZGUgIldlYlVS
TC5oIgorI2luY2x1ZGUgIldlYldvcmtlckJhc2UuaCIKKyNpbmNsdWRlICJXb3JrZXJDb250ZXh0
LmgiCisjaW5jbHVkZSAiV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5oIgorI2luY2x1
ZGUgIldvcmtlckxvYWRlclByb3h5LmgiCisjaW5jbHVkZSAiV29ya2VyVGhyZWFkLmgiCisjaW5j
bHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYktpdDsKKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCitXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bTo6V29ya2Vy
QXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0oV2ViRmlsZVN5c3RlbSogd2ViRmlsZVN5c3RlbSwgY29u
c3QgU3RyaW5nJiBwYXRoLCBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0LCBBc3luY0ZpbGVX
cml0ZXJDbGllbnQqIGNsaWVudCwgYm9vbCBzeW5jaHJvbm91cykKKyAgICA6IG1fc3luY2hyb25v
dXMoc3luY2hyb25vdXMpCit7CisgICAgQVNTRVJUKCFzeW5jaHJvbm91cyk7IC8vIE5vdCBpbXBs
ZW1lbnRlZCB5ZXQuCisKKyAgICBXb3JrZXJMb2FkZXJQcm94eSogcHJveHkgPSAmd29ya2VyQ29u
dGV4dC0+dGhyZWFkKCktPndvcmtlckxvYWRlclByb3h5KCk7CisgICAgbV9icmlkZ2UgPSBXb3Jr
ZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpjcmVhdGUocGF0aCwgcHJveHksIHdvcmtlckNv
bnRleHQsIGNsaWVudCk7Cit9CisKK1dvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtOjp+V29y
a2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0oKQoreworICAgIG1fYnJpZGdlLT5wb3N0U2h1dGRv
d25Ub01haW5UaHJlYWQobV9icmlkZ2UpOworfQorCit2b2lkIFdvcmtlckFzeW5jRmlsZVdyaXRl
ckNocm9taXVtOjp3cml0ZShsb25nIGxvbmcgcG9zaXRpb24sIEJsb2IqIGRhdGEpCit7CisgICAg
bV9icmlkZ2UtPnBvc3RXcml0ZVRvTWFpblRocmVhZChwb3NpdGlvbiwgZGF0YS0+dXJsKCkpOwor
fQorCit2b2lkIFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtOjp0cnVuY2F0ZShsb25nIGxv
bmcgbGVuZ3RoKQoreworICAgIG1fYnJpZGdlLT5wb3N0VHJ1bmNhdGVUb01haW5UaHJlYWQobGVu
Z3RoKTsKK30KKwordm9pZCBXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bTo6YWJvcnQoKQor
eworICAgIG1fYnJpZGdlLT5wb3N0QWJvcnRUb01haW5UaHJlYWQoKTsKK30KKworfQorCisjZW5k
aWYgLy8gRU5BQkxFKEZJTEVfU1lTVEVNKQpJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3Jr
ZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdC9jaHJvbWl1
bS9zcmMvV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uaAkocmV2aXNpb24gMCkKKysrIFdl
YktpdC9jaHJvbWl1bS9zcmMvV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uaAkocmV2aXNp
b24gMCkKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
IGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBj
b3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVy
IHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmli
dXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQg
ZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVy
bWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklH
SFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywg
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
CisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21p
dW1faAorI2RlZmluZSBXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bV9oCisKKyNpZiBFTkFC
TEUoRklMRV9TWVNURU0pCisKKyNpbmNsdWRlICJBc3luY0ZpbGVXcml0ZXIuaCIKKyNpbmNsdWRl
ICJXZWJGaWxlRXJyb3IuaCIKKyNpbmNsdWRlICJXZWJGaWxlV3JpdGVyQ2xpZW50LmgiCisjaW5j
bHVkZSA8d3RmL093blB0ci5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisKK25hbWVz
cGFjZSBXZWJLaXQgeworICAgIGNsYXNzIFdlYkZpbGVTeXN0ZW07CisgICAgY2xhc3MgV2ViRmls
ZVdyaXRlcjsKKyAgICBjbGFzcyBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOworfQor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEFzeW5jRmlsZVN5c3RlbTsKK2NsYXNzIEFz
eW5jRmlsZVdyaXRlckNsaWVudDsKK2NsYXNzIEJsb2I7CitjbGFzcyBXb3JrZXJDb250ZXh0Owor
CitjbGFzcyBXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bSA6IHB1YmxpYyBBc3luY0ZpbGVX
cml0ZXIgeworcHVibGljOgorICAgIHN0YXRpYyBQYXNzT3duUHRyPFdvcmtlckFzeW5jRmlsZVdy
aXRlckNocm9taXVtPiBjcmVhdGUoV2ViS2l0OjpXZWJGaWxlU3lzdGVtKiB3ZWJGaWxlU3lzdGVt
LCBjb25zdCBTdHJpbmcmIHBhdGgsIFdvcmtlckNvbnRleHQqIHdvcmtlckNvbnRleHQsIEFzeW5j
RmlsZVdyaXRlckNsaWVudCogY2xpZW50LCBib29sIHN5bmNocm9ub3VzKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bSh3ZWJG
aWxlU3lzdGVtLCBwYXRoLCB3b3JrZXJDb250ZXh0LCBjbGllbnQsIHN5bmNocm9ub3VzKSk7Cisg
ICAgfQorICAgIH5Xb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bSgpOworICAgIAorICAgIC8v
IEZpbGVXcml0ZXIKKyAgICB2aXJ0dWFsIHZvaWQgd3JpdGUobG9uZyBsb25nIHBvc2l0aW9uLCBC
bG9iKiBkYXRhKTsKKyAgICB2aXJ0dWFsIHZvaWQgdHJ1bmNhdGUobG9uZyBsb25nIGxlbmd0aCk7
CisgICAgdmlydHVhbCB2b2lkIGFib3J0KCk7CisKK3ByaXZhdGU6CisKKyAgICBXb3JrZXJBc3lu
Y0ZpbGVXcml0ZXJDaHJvbWl1bShXZWJLaXQ6OldlYkZpbGVTeXN0ZW0qLCBjb25zdCBTdHJpbmcm
IHBhdGgsIFdvcmtlckNvbnRleHQqLCBBc3luY0ZpbGVXcml0ZXJDbGllbnQqLCBib29sIHN5bmNo
cm9ub3VzKTsKKyAgICBSZWZQdHI8V2ViS2l0OjpXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJp
ZGdlPiBtX2JyaWRnZTsKKyAgICBib29sIG1fc3luY2hyb25vdXM7Cit9OworCit9IC8vIG5hbWVz
cGFjZQorCisjZW5kaWYgLy8gRU5BQkxFKEZJTEVfU1lTVEVNKQorCisjZW5kaWYgLy8gQXN5bmNG
aWxlV3JpdGVyQ2hyb21pdW1faApJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJGaWxl
V3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0v
c3JjL1dvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuY3BwCShyZXZpc2lvbiAwKQorKysg
V2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmNwcAko
cmV2aXNpb24gMCkKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAg
R29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAg
ICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICog
TmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICog
Y29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBk
ZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0
dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUg
Q09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICog
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5oIgorCisjaWYgRU5BQkxFKEZJTEVf
U1lTVEVNKQorCisjaW5jbHVkZSAiQXN5bmNGaWxlV3JpdGVyQ2xpZW50LmgiCisjaW5jbHVkZSAi
Q3Jvc3NUaHJlYWRUYXNrLmgiCisjaW5jbHVkZSAiV2ViQ1N0cmluZy5oIgorI2luY2x1ZGUgIldl
YkZpbGVTeXN0ZW0uaCIKKyNpbmNsdWRlICJXZWJGaWxlV3JpdGVyLmgiCisjaW5jbHVkZSAiV2Vi
S2l0LmgiCisjaW5jbHVkZSAiV2ViS2l0Q2xpZW50LmgiCisjaW5jbHVkZSAiV2ViV29ya2VyQmFz
ZS5oIgorI2luY2x1ZGUgIldvcmtlckNvbnRleHQuaCIKKyNpbmNsdWRlICJXb3JrZXJMb2FkZXJQ
cm94eS5oIgorI2luY2x1ZGUgIldvcmtlclRocmVhZC5oIgorI2luY2x1ZGUgPHd0Zi9NYWluVGhy
ZWFkLmg+CisjaW5jbHVkZSA8d3RmL1RocmVhZGluZy5oPgorCit1c2luZyBuYW1lc3BhY2UgV2Vi
Q29yZTsKKworbmFtZXNwYWNlIFdlYktpdCB7CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxi
YWNrc0JyaWRnZTo6bm90aWZ5U3RvcCgpCit7CisgICAgQVNTRVJUKG1fd29ya2VyQ29udGV4dC0+
aXNDb250ZXh0VGhyZWFkKCkpOworICAgIG1fY2xpZW50T25Xb3JrZXJUaHJlYWQgPSAwOworfQor
Cit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OnBvc3RXcml0ZVRvTWFpblRo
cmVhZChsb25nIGxvbmcgcG9zaXRpb24sIGNvbnN0IEtVUkwmIGRhdGEpCit7CisgICAgZGlzcGF0
Y2hUYXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmd3JpdGVPbk1haW5UaHJlYWQs
IHRoaXMsIHBvc2l0aW9uLCBkYXRhKSk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxi
YWNrc0JyaWRnZTo6cG9zdFRydW5jYXRlVG9NYWluVGhyZWFkKGxvbmcgbG9uZyBsZW5ndGgpCit7
CisgICAgZGlzcGF0Y2hUYXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmdHJ1bmNh
dGVPbk1haW5UaHJlYWQsIHRoaXMsIGxlbmd0aCkpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0
ZXJDYWxsYmFja3NCcmlkZ2U6OnBvc3RBYm9ydFRvTWFpblRocmVhZCgpCit7CisgICAgZGlzcGF0
Y2hUYXNrVG9NYWluVGhyZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmYWJvcnRPbk1haW5UaHJlYWQs
IHRoaXMpKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpwb3N0
U2h1dGRvd25Ub01haW5UaHJlYWQoUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tz
QnJpZGdlPiBicmlkZ2UpCit7CisgICAgQVNTRVJUKG1fd29ya2VyQ29udGV4dC0+aXNDb250ZXh0
VGhyZWFkKCkpOworICAgIG1fY2xpZW50T25Xb3JrZXJUaHJlYWQgPSAwOworICAgIGRpc3BhdGNo
VGFza1RvTWFpblRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJnNodXRkb3duT25NYWluVGhyZWFk
LCBicmlkZ2UpKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjp3
cml0ZU9uTWFpblRocmVhZChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxXb3Jr
ZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlPiBicmlkZ2UsIGxvbmcgbG9uZyBwb3NpdGlvbiwg
Y29uc3QgS1VSTCYgZGF0YSkKK3sKKyAgICBicmlkZ2UtPm1fd3JpdGVyLT53cml0ZShwb3NpdGlv
biwgV2ViVVJMKGRhdGEpKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJp
ZGdlOjp0cnVuY2F0ZU9uTWFpblRocmVhZChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1Jl
ZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlPiBicmlkZ2UsIGxvbmcgbG9uZyBs
ZW5ndGgpCit7CisgICAgYnJpZGdlLT5tX3dyaXRlci0+dHJ1bmNhdGUobGVuZ3RoKTsKK30KKwor
dm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjphYm9ydE9uTWFpblRocmVhZChT
Y3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2FsbGJh
Y2tzQnJpZGdlPiBicmlkZ2UpCit7CisgICAgYnJpZGdlLT5tX3dyaXRlci0+Y2FuY2VsKCk7Cit9
CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6aW5pdE9uTWFpblRocmVh
ZChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2Fs
bGJhY2tzQnJpZGdlPiBicmlkZ2UsIGNvbnN0IFN0cmluZyYgcGF0aCkKK3sKKyAgICBBU1NFUlQo
IWJyaWRnZS0+bV93cml0ZXIpOworICAgIGJyaWRnZS0+bV93cml0ZXIgPSBhZG9wdFB0cih3ZWJL
aXRDbGllbnQoKS0+ZmlsZVN5c3RlbSgpLT5jcmVhdGVGaWxlV3JpdGVyKHBhdGgsIGJyaWRnZS5n
ZXQoKSkpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OnNodXRk
b3duT25NYWluVGhyZWFkKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPFdvcmtl
ckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+IGJyaWRnZSkKK3sKKyAgICBicmlkZ2UtPm1fd3Jp
dGVyRGVsZXRlZCA9IHRydWU7CisgICAgYnJpZGdlLT5tX3dyaXRlci5jbGVhcigpOworfQorCit2
b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OmRpZFdyaXRlKGxvbmcgbG9uZyBi
eXRlcywgYm9vbCBjb21wbGV0ZSkKK3sKKyAgICBkaXNwYXRjaFRhc2tUb1dvcmtlclRocmVhZChj
cmVhdGVDYWxsYmFja1Rhc2soJmRpZFdyaXRlT25Xb3JrZXJUaHJlYWQsIHRoaXMsIGJ5dGVzLCBj
b21wbGV0ZSkpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OmRp
ZEZhaWwoV2ViRmlsZUVycm9yIGVycm9yKQoreworICAgIGRpc3BhdGNoVGFza1RvV29ya2VyVGhy
ZWFkKGNyZWF0ZUNhbGxiYWNrVGFzaygmZGlkRmFpbE9uV29ya2VyVGhyZWFkLCB0aGlzLCBlcnJv
cikpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OmRpZFRydW5j
YXRlKCkKK3sKKyAgICBkaXNwYXRjaFRhc2tUb1dvcmtlclRocmVhZChjcmVhdGVDYWxsYmFja1Rh
c2soJmRpZFRydW5jYXRlT25Xb3JrZXJUaHJlYWQsIHRoaXMpKTsKK30KKworV29ya2VyRmlsZVdy
aXRlckNhbGxiYWNrc0JyaWRnZTo6V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZShjb25z
dCBTdHJpbmcmIHBhdGgsIFdvcmtlckxvYWRlclByb3h5KiBwcm94eSwgU2NyaXB0RXhlY3V0aW9u
Q29udGV4dCogc2NyaXB0RXhlY3V0aW9uQ29udGV4dCwgQXN5bmNGaWxlV3JpdGVyQ2xpZW50KiBj
bGllbnQpCisgICAgOiBXb3JrZXJDb250ZXh0OjpPYnNlcnZlcihzdGF0aWNfY2FzdDxXb3JrZXJD
b250ZXh0Kj4oc2NyaXB0RXhlY3V0aW9uQ29udGV4dCkpCisgICAgLCBtX3Byb3h5KHByb3h5KQor
ICAgICwgbV93cml0ZXJEZWxldGVkKGZhbHNlKQorICAgICwgbV93b3JrZXJDb250ZXh0KHNjcmlw
dEV4ZWN1dGlvbkNvbnRleHQpCisgICAgLCBtX2NsaWVudE9uV29ya2VyVGhyZWFkKGNsaWVudCkK
K3sKKyAgICBBU1NFUlQobV93b3JrZXJDb250ZXh0LT5pc0NvbnRleHRUaHJlYWQoKSk7CisgICAg
cG9zdEluaXRUb01haW5UaHJlYWQocGF0aCk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNh
bGxiYWNrc0JyaWRnZTo6cG9zdEluaXRUb01haW5UaHJlYWQoY29uc3QgU3RyaW5nJiBwYXRoKQor
eworICAgIGRpc3BhdGNoVGFza1RvTWFpblRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJmluaXRP
bk1haW5UaHJlYWQsIHRoaXMsIHBhdGgpKTsKK30KKworV29ya2VyRmlsZVdyaXRlckNhbGxiYWNr
c0JyaWRnZTo6fldvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UoKQoreworICAgIEFTU0VS
VCghbV9jbGllbnRPbldvcmtlclRocmVhZCk7CisgICAgQVNTRVJUKCFtX3dyaXRlcik7Cit9CisK
Ky8vIFdlIGtub3cgbV9jbGllbnRPbldvcmtlclRocmVhZCBpcyBzdGlsbCB2YWxpZCBiZWNhdXNl
IGl0IGlzIG9ubHkgY2xlYXJlZCBvbiB0aGUgY29udGV4dCB0aHJlYWQsIGFuZCBiZWNhdXNlIHdl
IGNoZWNrIGluIHJ1blRhc2tPbk1haW5UaHJlYWQgYmVmb3JlIGNhbGxpbmcgYW55IG9mIHRoZXNl
IG1ldGhvZHMuCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OmRpZFdyaXRl
T25Xb3JrZXJUaHJlYWQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gYnJpZGdlLCBsb25nIGxvbmcgbGVuZ3RoLCBib29s
IGNvbXBsZXRlKQoreworICAgIEFTU0VSVChicmlkZ2UtPm1fd29ya2VyQ29udGV4dC0+aXNDb250
ZXh0VGhyZWFkKCkpOworICAgIGJyaWRnZS0+bV9jbGllbnRPbldvcmtlclRocmVhZC0+ZGlkV3Jp
dGUobGVuZ3RoLCBjb21wbGV0ZSk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNr
c0JyaWRnZTo6ZGlkRmFpbE9uV29ya2VyVGhyZWFkKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQ
YXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+IGJyaWRnZSwgV2ViRmls
ZUVycm9yIGVycm9yKQoreworICAgIEFTU0VSVChicmlkZ2UtPm1fd29ya2VyQ29udGV4dC0+aXND
b250ZXh0VGhyZWFkKCkpOworICAgIGJyaWRnZS0+bV9jbGllbnRPbldvcmtlclRocmVhZC0+ZGlk
RmFpbChzdGF0aWNfY2FzdDxGaWxlRXJyb3I6OkVycm9yQ29kZT4oZXJyb3IpKTsKK30KKwordm9p
ZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpkaWRUcnVuY2F0ZU9uV29ya2VyVGhy
ZWFkKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJD
YWxsYmFja3NCcmlkZ2U+IGJyaWRnZSkKK3sKKyAgICBBU1NFUlQoYnJpZGdlLT5tX3dvcmtlckNv
bnRleHQtPmlzQ29udGV4dFRocmVhZCgpKTsKKyAgICBicmlkZ2UtPm1fY2xpZW50T25Xb3JrZXJU
aHJlYWQtPmRpZFRydW5jYXRlKCk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNr
c0JyaWRnZTo6cnVuVGFza09uTWFpblRocmVhZChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiBzY3Jp
cHRFeGVjdXRpb25Db250ZXh0LCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NC
cmlkZ2U+IGJyaWRnZSwgUGFzc093blB0cjxTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPiB0
YXNrVG9SdW4pCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICBpZiAoIWJyaWRn
ZS0+bV93cml0ZXJEZWxldGVkKQorICAgICAgICB0YXNrVG9SdW4tPnBlcmZvcm1UYXNrKHNjcmlw
dEV4ZWN1dGlvbkNvbnRleHQpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NC
cmlkZ2U6OnJ1blRhc2tPbldvcmtlclRocmVhZChTY3JpcHRFeGVjdXRpb25Db250ZXh0KiBzY3Jp
cHRFeGVjdXRpb25Db250ZXh0LCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NC
cmlkZ2U+IGJyaWRnZSwgUGFzc093blB0cjxTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPiB0
YXNrVG9SdW4pCit7CisgICAgQVNTRVJUKGJyaWRnZS0+bV93b3JrZXJDb250ZXh0LT5pc0NvbnRl
eHRUaHJlYWQoKSk7CisgICAgaWYgKGJyaWRnZS0+bV9jbGllbnRPbldvcmtlclRocmVhZCkKKyAg
ICAgICAgdGFza1RvUnVuLT5wZXJmb3JtVGFzayhzY3JpcHRFeGVjdXRpb25Db250ZXh0KTsKK30K
Kwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpkaXNwYXRjaFRhc2tUb01h
aW5UaHJlYWQoUGFzc093blB0cjxTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPiB0YXNrKQor
eworICAgIEFTU0VSVChtX3dvcmtlckNvbnRleHQtPmlzQ29udGV4dFRocmVhZCgpKTsKKyAgICBX
ZWJXb3JrZXJCYXNlOjpkaXNwYXRjaFRhc2tUb01haW5UaHJlYWQoY3JlYXRlQ2FsbGJhY2tUYXNr
KCZydW5UYXNrT25NYWluVGhyZWFkLCB0aGlzLCB0YXNrKSk7Cit9CisKK3ZvaWQgV29ya2VyRmls
ZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6ZGlzcGF0Y2hUYXNrVG9Xb3JrZXJUaHJlYWQoUGFzc093
blB0cjxTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPiB0YXNrKQoreworICAgIEFTU0VSVChp
c01haW5UaHJlYWQoKSk7CisgICAgbV9wcm94eS0+cG9zdFRhc2tGb3JNb2RlVG9Xb3JrZXJDb250
ZXh0KGNyZWF0ZUNhbGxiYWNrVGFzaygmcnVuVGFza09uV29ya2VyVGhyZWFkLCB0aGlzLCB0YXNr
KSwgIiIpOworfQorCit9CisKKyNlbmRpZiAvLyBFTkFCTEUoRklMRV9TWVNURU0pCkluZGV4OiBX
ZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJLaXQvY2hyb21pdW0vc3JjL1dvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NC
cmlkZ2UuaAkocmV2aXNpb24gMCkKKysrIFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2VyRmlsZVdy
aXRlckNhbGxiYWNrc0JyaWRnZS5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE0OSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBk
aXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5v
ciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRo
b3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JT
CisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIg
T1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICog
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5k
ZWYgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZV9oCisjZGVmaW5lIFdvcmtlckZpbGVX
cml0ZXJDYWxsYmFja3NCcmlkZ2VfaAorCisjaWYgRU5BQkxFKEZJTEVfU1lTVEVNKQorCisjaW5j
bHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJXZWJGaWxlRXJyb3IuaCIKKyNpbmNs
dWRlICJXZWJGaWxlV3JpdGVyQ2xpZW50LmgiCisjaW5jbHVkZSAiV29ya2VyQ29udGV4dC5oIgor
I2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4K
KyNpbmNsdWRlIDx3dGYvVGhyZWFkaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKyAgICBj
bGFzcyBBc3luY0ZpbGVXcml0ZXJDbGllbnQ7CisgICAgY2xhc3MgS1VSTDsKKyAgICBjbGFzcyBX
b3JrZXJMb2FkZXJQcm94eTsKK30KKworbmFtZXNwYWNlIFdlYktpdCB7CisKK2NsYXNzIFdlYkZp
bGVTeXN0ZW07CitjbGFzcyBXZWJGaWxlV3JpdGVyOworY2xhc3MgV2ViRmlsZVdyaXRlckNsaWVu
dDsKK2NsYXNzIFdlYldvcmtlckJhc2U7CisKKy8vIFRoaXMgY2xhc3MgaXMgdXNlZCBhcyBhIG1l
Y2hhbmlzbSB0byBicmlkZ2UgY2FsbHMgYmV0d2VlbiB0aHJlYWRzLgorLy8gQ2FsbHMgdG8gYSBX
ZWJGaWxlV3JpdGVyIG11c3QgaGFwcGVuIG9uIHRoZSBtYWluIHRocmVhZCwgYnV0IHRoZXkgY29t
ZSBmcm9tCisvLyB0aGUgY29udGV4dCB0aHJlYWQuICBUaGUgcmVzcG9uc2VzIHRocm91Z2ggdGhl
IFdlYkZpbGVXcml0ZXJDbGllbnQgaW50ZXJmYWNlCisvLyBzdGFydCBvbiB0aGUgbWFpbiB0aHJl
YWQsIGJ1dCBtdXN0IGJlIHNlbnQgdmlhIHRoZSB3b3JrZXIgY29udGV4dCB0aHJlYWQuCisvLwor
Ly8gQSB0eXBpY2FsIGZsb3cgZm9yIHdyaXRlIHdvdWxkIGxvb2sgbGlrZSB0aGlzOgorLy8gQnJp
ZGdlOjpwb3N0V3JpdGVUb01haW5UaHJlYWQoKSBvbiBXb3JrZXJUaHJlYWQKKy8vICAtLT4gQnJp
ZGdlOjp3cml0ZU9uTWFpblRocmVhZCgpIGlzIGNhbGxlZCBvbiBNYWluVGhyZWFkCisvLyAgLS0+
IFdlYkZpbGVXcml0ZXI6OndyaXRlKCkKKy8vICAgICAgVGhpcyBtYWtlcyBhbiBJUEM7IHRoZSBh
Y3R1YWwgb3BlcmF0aW9uIGlzIGRvd24gaW4gdGhlIGJyb3dzZXIuCisvLyAgLS0+IEJyaWRnZTo6
ZGlkV3JpdGUgaXMgY2FsbGVkIG9uIE1haW5UaHJlYWQKKy8vICAtLT4gQnJpZGdlOjpkaWRXcml0
ZU9uV29ya2VyVGhyZWFkIGlzIGNhbGxlZCBvbiBXb3JrZXJUaHJlYWQKKy8vICAgICAgVGhpcyBj
YWxscyB0aGUgb3JpZ2luYWwgY2xpZW50IChtX2NsaWVudE9uV29ya2VyVGhyZWFkKS4KKy8vCisv
LyBUaGUgYnJpZGdlIG9iamVjdCBpcyByZWZjb3VudGVkLCBzbyB0aGF0IGl0IGRvZXNuJ3QgZ2V0
IGRlbGV0ZWQgd2hpbGUgdGhlcmUKKy8vIGFyZSBjcm9zcy10aHJlYWQgY2FsbHMgaW4gZmxpZ2h0
LiAgRWFjaCBDcm9zc1RocmVhZFRhc2sgY2FycmllcyBhIHJlZmVyZW5jZQorLy8gdG8gdGhlIGJy
aWRnZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGF0IHRoZSBicmlkZ2Ugd2lsbCBzdGlsbCBiZSB2YWxp
ZCB3aGVuIHRoZQorLy8gdGFzayBpcyBleGVjdXRlZC4gIEluIG9yZGVyIHRvIHNodXQgZG93biB0
aGUgYnJpZGdlLCB0aGUgV2ViRmlsZVdyaXRlckNsaWVudAorLy8gc2hvdWxkIGNhbGwgcG9zdFNo
dXRkb3duVG9NYWluVGhyZWFkIGJlZm9yZSBkcm9wcGluZyBpdHMgcmVmZXJlbmNlIHRvIHRoZQor
Ly8gYnJpZGdlLiAgVGhpcyBlbnN1cmVzIHRoYXQgdGhlIFdlYkZpbGVXcml0ZXIgd2lsbCBiZSBj
bGVhcmVkIG9uIHRoZSBtYWluCisvLyB0aHJlYWQgYW5kIHRoYXQgbm8gZnVydGhlciBjYWxscyB0
byB0aGUgV2ViRmlsZVdyaXRlckNsaWVudCB3aWxsIGJlIG1hZGUuCitjbGFzcyBXb3JrZXJGaWxl
V3JpdGVyQ2FsbGJhY2tzQnJpZGdlIDogcHVibGljIFRocmVhZFNhZmVTaGFyZWQ8V29ya2VyRmls
ZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4sIHB1YmxpYyBXZWJDb3JlOjpXb3JrZXJDb250ZXh0OjpP
YnNlcnZlciwgcHVibGljIFdlYkZpbGVXcml0ZXJDbGllbnQgeworcHVibGljOgorICAgIH5Xb3Jr
ZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlKCk7CisKKyAgICAvLyBXb3JrZXJDb250ZXh0OjpP
YnNlcnZlciBtZXRob2QuCisgICAgdmlydHVhbCB2b2lkIG5vdGlmeVN0b3AoKTsKKworICAgIHN0
YXRpYyBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+IGNyZWF0ZShj
b25zdCBTdHJpbmcmIHBhdGgsIFdlYkNvcmU6OldvcmtlckxvYWRlclByb3h5KiBwcm94eSwgV2Vi
Q29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCogd29ya2VyQ29udGV4dCwgV2ViQ29yZTo6QXN5
bmNGaWxlV3JpdGVyQ2xpZW50KiBjbGllbnQpCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRS
ZWYobmV3IFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UocGF0aCwgcHJveHksIHdvcmtl
ckNvbnRleHQsIGNsaWVudCkpOworICAgIH0KKworICAgIC8vIE1ldGhvZHMgdGhhdCBjcmVhdGUg
YW4gaW5zdGFuY2UgYW5kIHBvc3QgYW4gaW5pdGlhbCByZXF1ZXN0IHRhc2sgdG8gdGhlIG1haW4g
dGhyZWFkLiBUaGV5IG11c3QgYmUgY2FsbGVkIG9uIHRoZSB3b3JrZXIgdGhyZWFkLgorICAgIHZv
aWQgcG9zdFdyaXRlVG9NYWluVGhyZWFkKGxvbmcgbG9uZyBwb3NpdGlvbiwgY29uc3QgV2ViQ29y
ZTo6S1VSTCYgZGF0YSk7CisgICAgdm9pZCBwb3N0VHJ1bmNhdGVUb01haW5UaHJlYWQobG9uZyBs
b25nIGxlbmd0aCk7CisgICAgdm9pZCBwb3N0QWJvcnRUb01haW5UaHJlYWQoKTsKKworICAgIC8v
IFRoZSBvd25pbmcgV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0gc2hvdWxkIGNhbGwgdGhp
cyBtZXRob2QgYmVmb3JlIGRyb3BwaW5nIGl0cyBsYXN0IHJlZmVyZW5jZSB0byB0aGUgYnJpZGdl
LCBvbiB0aGUgY29udGV4dCB0aHJlYWQuCisgICAgLy8gVGhlIGFjdHVhbCBkZWxldGlvbiBvZiB0
aGUgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZSBtYXkgaGFwcGVuIG9uIGVpdGhlciB0
aGUgbWFpbiBvciBjb250ZXh0IHRocmVhZCwgZGVwZW5kaW5nIG9uIHdoZXJlIHRoZSBsYXN0IHJl
ZmVyZW5jZSBnb2VzIGF3YXk7IHRoYXQncyBzYWZlIGFzIGxvbmcgYXMgdGhpcyBpcyBjYWxsZWQg
Zmlyc3QuCisgICAgdm9pZCBwb3N0U2h1dGRvd25Ub01haW5UaHJlYWQoUGFzc1JlZlB0cjxXb3Jr
ZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlPik7CisKKyAgICAvLyBDYWxsYmFjayBtZXRob2Rz
IHRoYXQgYXJlIGNhbGxlZCBvbiB0aGUgbWFpbiB0aHJlYWQuCisgICAgLy8gVGhlc2UgYXJlIHRo
ZSBpbXBsZW1lbnRhdGlvbiBvZiBXZWJLaXQ6OldlYkZpbGVXcml0ZXJDbGllbnQuCisgICAgdm9p
ZCBkaWRXcml0ZShsb25nIGxvbmcgYnl0ZXMsIGJvb2wgY29tcGxldGUpOworICAgIHZvaWQgZGlk
RmFpbChXZWJGaWxlRXJyb3IpOworICAgIHZvaWQgZGlkVHJ1bmNhdGUoKTsKKworcHJpdmF0ZToK
KyAgICBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlKGNvbnN0IFN0cmluZyYgcGF0aCwg
V2ViQ29yZTo6V29ya2VyTG9hZGVyUHJveHkqLCBXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250
ZXh0KiwgV2ViQ29yZTo6QXN5bmNGaWxlV3JpdGVyQ2xpZW50Kik7CisKKyAgICB2b2lkIHBvc3RJ
bml0VG9NYWluVGhyZWFkKGNvbnN0IFN0cmluZyYgcGF0aCk7CisKKyAgICAvLyBNZXRob2RzIHRo
YXQgYXJlIHRvIGJlIGNhbGxlZCBvbiB0aGUgbWFpbiB0aHJlYWQuCisgICAgc3RhdGljIHZvaWQg
d3JpdGVPbk1haW5UaHJlYWQoV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NS
ZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4sIGxvbmcgbG9uZyBwb3NpdGlv
biwgY29uc3QgV2ViQ29yZTo6S1VSTCYgZGF0YSk7CisgICAgc3RhdGljIHZvaWQgdHJ1bmNhdGVP
bk1haW5UaHJlYWQoV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8
V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4sIGxvbmcgbG9uZyBsZW5ndGgpOworICAg
IHN0YXRpYyB2b2lkIGFib3J0T25NYWluVGhyZWFkKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNv
bnRleHQqLCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+KTsKKyAg
ICBzdGF0aWMgdm9pZCBpbml0T25NYWluVGhyZWFkKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNv
bnRleHQqLCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+LCBjb25z
dCBTdHJpbmcmIHBhdGgpOworICAgIHN0YXRpYyB2b2lkIHNodXRkb3duT25NYWluVGhyZWFkKFdl
YkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0
ZXJDYWxsYmFja3NCcmlkZ2U+KTsKKworICAgIC8vIE1ldGhvZHMgdGhhdCBkaXNwYXRjaCB0byBB
c3luY0ZpbGVXcml0ZXJDbGllbnQgb24gdGhlIHdvcmtlciB0aHJlYWRzLgorICAgIHN0YXRpYyB2
b2lkIGRpZFdyaXRlT25Xb3JrZXJUaHJlYWQoV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4
dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4sIGxvbmcgbG9u
ZyBsZW5ndGgsIGJvb2wgY29tcGxldGUpOworICAgIHN0YXRpYyB2b2lkIGRpZEZhaWxPbldvcmtl
clRocmVhZChXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxXb3Jr
ZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlPiwgV2ViRmlsZUVycm9yKTsKKyAgICBzdGF0aWMg
dm9pZCBkaWRUcnVuY2F0ZU9uV29ya2VyVGhyZWFkKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNv
bnRleHQqLCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+KTsKKwor
ICAgIC8vIExhenkgaW5pdGlhbGl6YXRpb24gb2YgdGhlIFdlYkZpbGVXcml0ZXIuCisgICAgdm9p
ZCBpbml0V2ViRmlsZVdyaXRlcigpOworICAgIHN0YXRpYyB2b2lkIHJ1blRhc2tPbk1haW5UaHJl
YWQoV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2VyRmls
ZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4sIFBhc3NPd25QdHI8V2ViQ29yZTo6U2NyaXB0RXhlY3V0
aW9uQ29udGV4dDo6VGFzaz4pOworICAgIHN0YXRpYyB2b2lkIHJ1blRhc2tPbldvcmtlclRocmVh
ZChXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxXb3JrZXJGaWxl
V3JpdGVyQ2FsbGJhY2tzQnJpZGdlPiwgUGFzc093blB0cjxXZWJDb3JlOjpTY3JpcHRFeGVjdXRp
b25Db250ZXh0OjpUYXNrPik7CisKKyAgICB2b2lkIGRpc3BhdGNoVGFza1RvTWFpblRocmVhZChQ
YXNzT3duUHRyPFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2s+KTsKKyAgICB2
b2lkIGRpc3BhdGNoVGFza1RvV29ya2VyVGhyZWFkKFBhc3NPd25QdHI8V2ViQ29yZTo6U2NyaXB0
RXhlY3V0aW9uQ29udGV4dDo6VGFzaz4pOworCisgICAgLy8gVXNlZCBmcm9tIHRoZSBtYWluIHRo
cmVhZCB0byBwb3N0IHRhc2tzIHRvIHRoZSBjb250ZXh0IHRocmVhZC4KKyAgICBXZWJDb3JlOjpX
b3JrZXJMb2FkZXJQcm94eSogbV9wcm94eTsKKyAgICAvLyBVc2VkIHRvIGluZGljYXRlIHRoYXQg
c2h1dGRvd24gaGFzIHN0YXJ0ZWQgb24gdGhlIG1haW4gdGhyZWFkLCBhbmQgaGVuY2UgdGhlIHdy
aXRlciBoYXMgYmVlbiBkZWxldGVkLgorICAgIGJvb2wgbV93cml0ZXJEZWxldGVkOworCisgICAg
Ly8gVXNlZCBvbiB0aGUgY29udGV4dCB0aHJlYWQsIG9ubHkgdG8gY2hlY2sgdGhhdCB3ZSdyZSBy
dW5uaW5nIG9uIHRoZSBjb250ZXh0IHRocmVhZC4KKyAgICBXZWJDb3JlOjpTY3JpcHRFeGVjdXRp
b25Db250ZXh0KiBtX3dvcmtlckNvbnRleHQ7CisKKyAgICAvLyBDcmVhdGVkIGFuZCBkZXN0cm95
ZWQgZnJvbSB0aGUgbWFpbiB0aHJlYWQuCisgICAgT3duUHRyPFdlYktpdDo6V2ViRmlsZVdyaXRl
cj4gbV93cml0ZXI7CisKKyAgICAvLyBVc2VkIG9uIHRoZSBjb250ZXh0IHRocmVhZCB0byBjYWxs
IGJhY2sgaW50byB0aGUgY2xpZW50LgorICAgIFdlYkNvcmU6OkFzeW5jRmlsZVdyaXRlckNsaWVu
dCogbV9jbGllbnRPbldvcmtlclRocmVhZDsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUK
KworI2VuZGlmCisKKyNlbmRpZiAvLyBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlX2gK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>74061</attachid>
            <date>2010-11-16 16:44:56 -0800</date>
            <delta_ts>2010-11-17 05:30:39 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-47681-20101116164455.patch</filename>
            <type>text/plain</type>
            <size>31346</size>
            <attacher name="Eric U.">ericu</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3MjEyMikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTQgQEAKKzIwMTAtMTEtMTYgIEVyaWMgVWhyaGFuZSAgPGVyaWN1QGNocm9taXVt
Lm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBb
Q2hyb21pdW1dIGltcGxlbWVudGF0aW9uIG9mIGFzeW5jIEZpbGVXcml0ZXIgZm9yIHdvcmtlcnMK
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ3NjgxCisK
KyAgICAgICAgVGVzdHMgYXJlIGluIGEgc2VwYXJhdGUgY2hhbmdlbGlzdC4KKworICAgICAgICAq
IHBsYXRmb3JtL0Nyb3NzVGhyZWFkQ29waWVyLmg6IENoYW5nZWQgQ3Jvc3NUaHJlYWRDb3BpZXJb
QmFzZV0gdG8gc3VwcG9ydCBQYXNzUmVmUHRycworCiAyMDEwLTExLTE2ICBBbGV4ZXkgUHJvc2t1
cnlha292ICA8YXBAYXBwbGUuY29tPgogCiAgICAgICAgIFdpbmRvd3MgYnVpbGQgZml4LgpJbmRl
eDogV2ViQ29yZS9wbGF0Zm9ybS9Dcm9zc1RocmVhZENvcGllci5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcGxhdGZvcm0vQ3Jvc3NUaHJlYWRDb3BpZXIuaAkocmV2aXNpb24gNzIxMjIpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL0Nyb3NzVGhyZWFkQ29waWVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTcx
LDcgKzcxLDggQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogCiAgICAgLy8gQ3VzdG9tIGNvcHkgbWV0
aG9kcy4KICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgQ3Jvc3NUaHJlYWRDb3BpZXJC
YXNlPGZhbHNlLCB0cnVlLCBUPiB7Ci0gICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgV1RGOjpSZW1v
dmVUZW1wbGF0ZTxULCBSZWZQdHI+OjpUeXBlIFJlZkNvdW50ZWRUeXBlOworICAgICAgICB0eXBl
ZGVmIHR5cGVuYW1lIFdURjo6UmVtb3ZlVGVtcGxhdGU8VCwgUmVmUHRyPjo6VHlwZSBUeXBlV2l0
aG91dFJlZlB0cjsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSBXVEY6OlJlbW92ZVRlbXBsYXRl
PFR5cGVXaXRob3V0UmVmUHRyLCBQYXNzUmVmUHRyPjo6VHlwZSBSZWZDb3VudGVkVHlwZTsKICAg
ICAgICAgdHlwZWRlZiBQYXNzUmVmUHRyPFJlZkNvdW50ZWRUeXBlPiBUeXBlOwogICAgICAgICBz
dGF0aWMgVHlwZSBjb3B5KGNvbnN0IFQmIHJlZlB0cikKICAgICAgICAgewpAQCAtMTEzLDcgKzEx
NCw4IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICB9OwogCiAgICAgdGVtcGxhdGU8dHlwZW5h
bWUgVD4gc3RydWN0IENyb3NzVGhyZWFkQ29waWVyIDogcHVibGljIENyb3NzVGhyZWFkQ29waWVy
QmFzZTxXVEY6OklzQ29udmVydGlibGVUb0ludGVnZXI8VD46OnZhbHVlLAotICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgV1RGOjpJc1N1YmNsYXNzT2ZUZW1wbGF0ZTx0eXBlbmFtZSBXVEY6OlJlbW92
ZVRlbXBsYXRlPFQsIFJlZlB0cj46OlR5cGUsIFRocmVhZFNhZmVTaGFyZWQ+Ojp2YWx1ZSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFdURjo6SXNTdWJjbGFzc09mVGVtcGxhdGU8dHlwZW5hbWUg
V1RGOjpSZW1vdmVUZW1wbGF0ZTxULCBSZWZQdHI+OjpUeXBlLCBUaHJlYWRTYWZlU2hhcmVkPjo6
dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBXVEY6OklzU3ViY2xhc3NPZlRl
bXBsYXRlPHR5cGVuYW1lIFdURjo6UmVtb3ZlVGVtcGxhdGU8VCwgUGFzc1JlZlB0cj46OlR5cGUs
IFRocmVhZFNhZmVTaGFyZWQ+Ojp2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQ+IHsK
ICAgICB9OwogCkluZGV4OiBXZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYktpdC9jaHJvbWl1bS9DaGFuZ2VMb2cJKHJldmlzaW9uIDcyMTIyKQorKysgV2ViS2l0L2No
cm9taXVtL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIzIEBACisyMDEwLTEx
LTE2ICBFcmljIFVocmhhbmUgIDxlcmljdUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3
ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0Nocm9taXVtXSBpbXBsZW1lbnRhdGlv
biBvZiBhc3luYyBGaWxlV3JpdGVyIGZvciB3b3JrZXJzCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD00NzY4MQorCisgICAgICAgIFRlc3RzIGFyZSBpbiBh
IHNlcGFyYXRlIGNoYW5nZWxpc3QuCisKKyAgICAgICAgQWRkZWQgbmV3IGZpbGVzLgorICAgICAg
ICAqIFdlYktpdC5neXA6CisKKyAgICAgICAgKiBzcmMvV29ya2VyQXN5bmNGaWxlU3lzdGVtQ2hy
b21pdW0uY3BwOiBBZGRlZCBXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bSBjb25zdHJ1Y3Rp
b24uCisgICAgICAgICogc3JjL1dvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtLmNwcDogQWRk
ZWQuCisgICAgICAgICogc3JjL1dvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtLmg6IEFkZGVk
LgorCisgICAgICAgIFRoaXMgY2xhc3MgYnJpZGdlcyBiZXR3ZWVuIHRoZSBjb250ZXh0IGFuZCBt
YWluIHRocmVhZHMgZm9yIHRoZSBXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS4KKyAgICAg
ICAgKiBzcmMvV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5jcHA6IEFkZGVkLgorICAg
ICAgICAqIHNyYy9Xb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmg6IEFkZGVkLgorCiAy
MDEwLTExLTE2ICBQYXZlbCBGZWxkbWFuICA8cGZlbGRtYW5AY2hyb21pdW0ub3JnPgogCiAgICAg
ICAgIE5vdCByZXZpZXdlZC4gQ2hyb21pdW0gYnVpbGQgZml4LgpJbmRleDogV2ViS2l0L2Nocm9t
aXVtL1dlYktpdC5neXAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAJ
KHJldmlzaW9uIDcyMTIyKQorKysgV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXAJKHdvcmtpbmcg
Y29weSkKQEAgLTU0Nyw4ICs1NDcsMTIgQEAKICAgICAgICAgICAgICAgICAnc3JjL1dlYldvcmtl
ckltcGwuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9Xb3JrZXJBc3luY0ZpbGVTeXN0ZW1DaHJv
bWl1bS5jcHAnLAogICAgICAgICAgICAgICAgICdzcmMvV29ya2VyQXN5bmNGaWxlU3lzdGVtQ2hy
b21pdW0uaCcsCisgICAgICAgICAgICAgICAgJ3NyYy9Xb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJv
bWl1bS5jcHAnLAorICAgICAgICAgICAgICAgICdzcmMvV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hy
b21pdW0uaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9Xb3JrZXJGaWxlU3lzdGVtQ2FsbGJhY2tz
QnJpZGdlLmNwcCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9Xb3JrZXJGaWxlU3lzdGVtQ2FsbGJh
Y2tzQnJpZGdlLmgnLAorICAgICAgICAgICAgICAgICdzcmMvV29ya2VyRmlsZVdyaXRlckNhbGxi
YWNrc0JyaWRnZS5jcHAnLAorICAgICAgICAgICAgICAgICdzcmMvV29ya2VyRmlsZVdyaXRlckNh
bGxiYWNrc0JyaWRnZS5oJywKICAgICAgICAgICAgICAgICAnc3JjL1dyYXBwZWRSZXNvdXJjZVJl
cXVlc3QuaCcsCiAgICAgICAgICAgICAgICAgJ3NyYy9XcmFwcGVkUmVzb3VyY2VSZXNwb25zZS5o
JywKICAgICAgICAgICAgICAgICAnc3JjL3dpbi9XZWJJbnB1dEV2ZW50RmFjdG9yeS5jcHAnLApJ
bmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJBc3luY0ZpbGVTeXN0ZW1DaHJvbWl1bS5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJBc3luY0ZpbGVTeXN0
ZW1DaHJvbWl1bS5jcHAJKHJldmlzaW9uIDcyMTIyKQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9X
b3JrZXJBc3luY0ZpbGVTeXN0ZW1DaHJvbWl1bS5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM0LDEz
ICszNCwxNiBAQAogI2lmIEVOQUJMRShGSUxFX1NZU1RFTSkKIAogI2luY2x1ZGUgIkFzeW5jRmls
ZVN5c3RlbUNhbGxiYWNrcy5oIgorI2luY2x1ZGUgIkZpbGVNZXRhZGF0YS5oIgogI2luY2x1ZGUg
IkZpbGVTeXN0ZW0uaCIKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1ZGUgIldl
YkZpbGVTeXN0ZW0uaCIKICNpbmNsdWRlICJXZWJGaWxlU3lzdGVtQ2FsbGJhY2tzSW1wbC5oIgor
I2luY2x1ZGUgIldlYkZpbGVXcml0ZXIuaCIKICNpbmNsdWRlICJXZWJLaXQuaCIKICNpbmNsdWRl
ICJXZWJLaXRDbGllbnQuaCIKICNpbmNsdWRlICJXZWJXb3JrZXJCYXNlLmgiCisjaW5jbHVkZSAi
V29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uaCIKICNpbmNsdWRlICJXb3JrZXJDb250ZXh0
LmgiCiAjaW5jbHVkZSAiV29ya2VyRmlsZVN5c3RlbUNhbGxiYWNrc0JyaWRnZS5oIgogI2luY2x1
ZGUgIldvcmtlclNjcmlwdENvbnRyb2xsZXIuaCIKQEAgLTEzNCw5ICsxMzcsNzYgQEAgdm9pZCBX
b3JrZXJBc3luY0ZpbGVTeXN0ZW1DaHJvbWl1bTo6cmVhZAogICAgIGNyZWF0ZVdvcmtlckZpbGVT
eXN0ZW1DYWxsYmFja3NCcmlkZ2UoY2FsbGJhY2tzKS0+cG9zdFJlYWREaXJlY3RvcnlUb01haW5U
aHJlYWQobV93ZWJGaWxlU3lzdGVtLCBwYXRoLCBtX21vZGVGb3JDdXJyZW50T3BlcmF0aW9uKTsK
IH0KIAotdm9pZCBXb3JrZXJBc3luY0ZpbGVTeXN0ZW1DaHJvbWl1bTo6Y3JlYXRlV3JpdGVyKEFz
eW5jRmlsZVdyaXRlckNsaWVudCosIGNvbnN0IFN0cmluZyYsIFBhc3NPd25QdHI8QXN5bmNGaWxl
U3lzdGVtQ2FsbGJhY2tzPikKK2NsYXNzIFdvcmtlckZpbGVXcml0ZXJIZWxwZXJDYWxsYmFja3Mg
OiBwdWJsaWMgQXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMg
UGFzc093blB0cjxXb3JrZXJGaWxlV3JpdGVySGVscGVyQ2FsbGJhY2tzPiBjcmVhdGUoQXN5bmNG
aWxlV3JpdGVyQ2xpZW50KiBjbGllbnQsIGNvbnN0IFN0cmluZyYgcGF0aCwgV2ViS2l0OjpXZWJG
aWxlU3lzdGVtKiB3ZWJGaWxlU3lzdGVtLCBQYXNzT3duUHRyPFdlYkNvcmU6OkFzeW5jRmlsZVN5
c3RlbUNhbGxiYWNrcz4gY2FsbGJhY2tzLCBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0KQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBXb3JrZXJGaWxlV3JpdGVySGVscGVy
Q2FsbGJhY2tzKGNsaWVudCwgcGF0aCwgd2ViRmlsZVN5c3RlbSwgY2FsbGJhY2tzLCB3b3JrZXJD
b250ZXh0KSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGRpZFN1Y2NlZWQoKQorICAgIHsK
KyAgICAgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lk
IGRpZFJlYWRNZXRhZGF0YShjb25zdCBGaWxlTWV0YWRhdGEmIG1ldGFkYXRhKQorICAgIHsKKyAg
ICAgICAgQVNTRVJUKG1fY2FsbGJhY2tzKTsKKyAgICAgICAgaWYgKG1ldGFkYXRhLnR5cGUgIT0g
RmlsZU1ldGFkYXRhOjpUeXBlRmlsZSB8fCBtZXRhZGF0YS5sZW5ndGggPCAwKQorICAgICAgICAg
ICAgbV9jYWxsYmFja3MtPmRpZEZhaWwoV2ViS2l0OjpXZWJGaWxlRXJyb3JJbnZhbGlkU3RhdGUp
OworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIE93blB0cjxXb3JrZXJBc3luY0ZpbGVXcml0
ZXJDaHJvbWl1bT4gYXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0gPSBXb3JrZXJBc3luY0ZpbGVXcml0
ZXJDaHJvbWl1bTo6Y3JlYXRlKG1fd2ViRmlsZVN5c3RlbSwgbV9wYXRoLCBtX3dvcmtlckNvbnRl
eHQsIG1fY2xpZW50LCBXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bTo6QXN5bmNocm9ub3Vz
KTsKKyAgICAgICAgICAgIG1fY2FsbGJhY2tzLT5kaWRDcmVhdGVGaWxlV3JpdGVyKGFzeW5jRmls
ZVdyaXRlckNocm9taXVtLnJlbGVhc2UoKSwgbWV0YWRhdGEubGVuZ3RoKTsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBkaWRSZWFkRGlyZWN0b3J5RW50cnkoY29uc3QgU3Ry
aW5nJiBuYW1lLCBib29sIGlzRGlyZWN0b3J5KQorICAgIHsKKyAgICAgICAgQVNTRVJUX05PVF9S
RUFDSEVEKCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGRpZFJlYWREaXJlY3RvcnlFbnRy
aWVzKGJvb2wgaGFzTW9yZSkKKyAgICB7CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOwor
ICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBkaWRPcGVuRmlsZVN5c3RlbShjb25zdCBTdHJpbmcm
LCBQYXNzT3duUHRyPEFzeW5jRmlsZVN5c3RlbT4pCisgICAgeworICAgICAgICBBU1NFUlRfTk9U
X1JFQUNIRUQoKTsKKyAgICB9CisKKyAgICAvLyBDYWxsZWQgd2hlbiBhbiBBc3luY0ZpbGVXcnRl
ciBoYXMgYmVlbiBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICB2aXJ0dWFsIHZvaWQgZGlkQ3Jl
YXRlRmlsZVdyaXRlcihQYXNzT3duUHRyPEFzeW5jRmlsZVdyaXRlcj4sIGxvbmcgbG9uZykKKyAg
ICB7CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KKworICAgIHZpcnR1YWwg
dm9pZCBkaWRGYWlsKGludCBjb2RlKQorICAgIHsKKyAgICAgICAgQVNTRVJUKG1fY2FsbGJhY2tz
KTsKKyAgICAgICAgbV9jYWxsYmFja3MtPmRpZEZhaWwoY29kZSk7CisgICAgfQorCitwcml2YXRl
OgorICAgIFdvcmtlckZpbGVXcml0ZXJIZWxwZXJDYWxsYmFja3MoQXN5bmNGaWxlV3JpdGVyQ2xp
ZW50KiBjbGllbnQsIGNvbnN0IFN0cmluZyYgcGF0aCwgV2ViS2l0OjpXZWJGaWxlU3lzdGVtKiB3
ZWJGaWxlU3lzdGVtLCBQYXNzT3duUHRyPFdlYkNvcmU6OkFzeW5jRmlsZVN5c3RlbUNhbGxiYWNr
cz4gY2FsbGJhY2tzLCBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0KQorICAgICAgICA6IG1f
Y2xpZW50KGNsaWVudCkKKyAgICAgICAgLCBtX3BhdGgocGF0aCkKKyAgICAgICAgLCBtX3dlYkZp
bGVTeXN0ZW0od2ViRmlsZVN5c3RlbSkKKyAgICAgICAgLCBtX2NhbGxiYWNrcyhjYWxsYmFja3Mp
CisgICAgICAgICwgbV93b3JrZXJDb250ZXh0KHdvcmtlckNvbnRleHQpCisgICAgeworICAgIH0K
KworICAgIEFzeW5jRmlsZVdyaXRlckNsaWVudCogbV9jbGllbnQ7CisgICAgU3RyaW5nIG1fcGF0
aDsKKyAgICBXZWJLaXQ6OldlYkZpbGVTeXN0ZW0qIG1fd2ViRmlsZVN5c3RlbTsKKyAgICBPd25Q
dHI8V2ViQ29yZTo6QXN5bmNGaWxlU3lzdGVtQ2FsbGJhY2tzPiBtX2NhbGxiYWNrczsKKyAgICBX
b3JrZXJDb250ZXh0KiBtX3dvcmtlckNvbnRleHQ7Cit9OworCit2b2lkIFdvcmtlckFzeW5jRmls
ZVN5c3RlbUNocm9taXVtOjpjcmVhdGVXcml0ZXIoQXN5bmNGaWxlV3JpdGVyQ2xpZW50KiBjbGll
bnQsIGNvbnN0IFN0cmluZyYgcGF0aCwgUGFzc093blB0cjxBc3luY0ZpbGVTeXN0ZW1DYWxsYmFj
a3M+IGNhbGxiYWNrcykKIHsKLSAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIGNyZWF0ZVdvcmtl
ckZpbGVTeXN0ZW1DYWxsYmFja3NCcmlkZ2UoV29ya2VyRmlsZVdyaXRlckhlbHBlckNhbGxiYWNr
czo6Y3JlYXRlKGNsaWVudCwgcGF0aCwgbV93ZWJGaWxlU3lzdGVtLCBjYWxsYmFja3MsIG1fd29y
a2VyQ29udGV4dCkpLT5wb3N0UmVhZE1ldGFkYXRhVG9NYWluVGhyZWFkKG1fd2ViRmlsZVN5c3Rl
bSwgcGF0aCwgbV9tb2RlRm9yQ3VycmVudE9wZXJhdGlvbik7CiB9CiAKIFBhc3NSZWZQdHI8V29y
a2VyRmlsZVN5c3RlbUNhbGxiYWNrc0JyaWRnZT4gV29ya2VyQXN5bmNGaWxlU3lzdGVtQ2hyb21p
dW06OmNyZWF0ZVdvcmtlckZpbGVTeXN0ZW1DYWxsYmFja3NCcmlkZ2UoUGFzc093blB0cjxBc3lu
Y0ZpbGVTeXN0ZW1DYWxsYmFja3M+IGNhbGxiYWNrcykKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9z
cmMvV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktp
dC9jaHJvbWl1bS9zcmMvV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uY3BwCShyZXZpc2lv
biAwKQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1
bS5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
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
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0uaCIKKworI2lmIEVOQUJMRShG
SUxFX1NZU1RFTSkKKworI2luY2x1ZGUgIkFzeW5jRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgIkJs
b2IuaCIKKyNpbmNsdWRlICJTY3JpcHRFeGVjdXRpb25Db250ZXh0LmgiCisjaW5jbHVkZSAiV2Vi
RmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgIldlYkZpbGVXcml0ZXIuaCIKKyNpbmNsdWRlICJXZWJV
UkwuaCIKKyNpbmNsdWRlICJXZWJXb3JrZXJCYXNlLmgiCisjaW5jbHVkZSAiV29ya2VyQ29udGV4
dC5oIgorI2luY2x1ZGUgIldvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuaCIKKyNpbmNs
dWRlICJXb3JrZXJMb2FkZXJQcm94eS5oIgorI2luY2x1ZGUgIldvcmtlclRocmVhZC5oIgorI2lu
Y2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJLaXQ7CisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW06Oldvcmtl
ckFzeW5jRmlsZVdyaXRlckNocm9taXVtKFdlYkZpbGVTeXN0ZW0qIHdlYkZpbGVTeXN0ZW0sIGNv
bnN0IFN0cmluZyYgcGF0aCwgV29ya2VyQ29udGV4dCogd29ya2VyQ29udGV4dCwgQXN5bmNGaWxl
V3JpdGVyQ2xpZW50KiBjbGllbnQsIFdyaXRlclR5cGUgdHlwZSkKKyAgICA6IG1fdHlwZSh0eXBl
KQoreworICAgIEFTU0VSVChtX3R5cGUgPT0gQXN5bmNocm9ub3VzKTsgLy8gU3luY2hyb25vdXMg
aXMgbm90IGltcGxlbWVudGVkIHlldC4KKworICAgIFdvcmtlckxvYWRlclByb3h5KiBwcm94eSA9
ICZ3b3JrZXJDb250ZXh0LT50aHJlYWQoKS0+d29ya2VyTG9hZGVyUHJveHkoKTsKKyAgICBtX2Jy
aWRnZSA9IFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OmNyZWF0ZShwYXRoLCBwcm94
eSwgd29ya2VyQ29udGV4dCwgY2xpZW50KTsKK30KKworV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hy
b21pdW06On5Xb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bSgpCit7CisgICAgbV9icmlkZ2Ut
PnBvc3RTaHV0ZG93blRvTWFpblRocmVhZChtX2JyaWRnZSk7Cit9CisKK3ZvaWQgV29ya2VyQXN5
bmNGaWxlV3JpdGVyQ2hyb21pdW06OndyaXRlKGxvbmcgbG9uZyBwb3NpdGlvbiwgQmxvYiogZGF0
YSkKK3sKKyAgICBtX2JyaWRnZS0+cG9zdFdyaXRlVG9NYWluVGhyZWFkKHBvc2l0aW9uLCBkYXRh
LT51cmwoKSk7Cit9CisKK3ZvaWQgV29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW06OnRydW5j
YXRlKGxvbmcgbG9uZyBsZW5ndGgpCit7CisgICAgbV9icmlkZ2UtPnBvc3RUcnVuY2F0ZVRvTWFp
blRocmVhZChsZW5ndGgpOworfQorCit2b2lkIFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVt
OjphYm9ydCgpCit7CisgICAgbV9icmlkZ2UtPnBvc3RBYm9ydFRvTWFpblRocmVhZCgpOworfQor
Cit9CisKKyNlbmRpZiAvLyBFTkFCTEUoRklMRV9TWVNURU0pCkluZGV4OiBXZWJLaXQvY2hyb21p
dW0vc3JjL1dvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtLmgKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
S2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1bS5oCShyZXZpc2lv
biAwKQorKysgV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1
bS5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAg
ICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMK
KyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVj
dHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Ig
d3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
VEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBXb3JrZXJBc3luY0ZpbGVX
cml0ZXJDaHJvbWl1bV9oCisjZGVmaW5lIFdvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtX2gK
KworI2lmIEVOQUJMRShGSUxFX1NZU1RFTSkKKworI2luY2x1ZGUgIkFzeW5jRmlsZVdyaXRlci5o
IgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisKK25hbWVzcGFjZSBXZWJLaXQgeworICAg
IGNsYXNzIFdlYkZpbGVTeXN0ZW07CisgICAgY2xhc3MgV2ViRmlsZVdyaXRlcjsKKyAgICBjbGFz
cyBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOworfQorCituYW1lc3BhY2UgV1RGIHsK
KyAgICBjbGFzcyBTdHJpbmc7Cit9Cit1c2luZyBXVEY6OlN0cmluZzsKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitjbGFzcyBBc3luY0ZpbGVTeXN0ZW07CitjbGFzcyBBc3luY0ZpbGVXcml0ZXJD
bGllbnQ7CitjbGFzcyBCbG9iOworY2xhc3MgV29ya2VyQ29udGV4dDsKKworY2xhc3MgV29ya2Vy
QXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0gOiBwdWJsaWMgQXN5bmNGaWxlV3JpdGVyIHsKK3B1Ymxp
YzoKKyAgICBlbnVtIFdyaXRlclR5cGUgeworICAgICAgICBBc3luY2hyb25vdXMsCisgICAgICAg
IFN5bmNocm9ub3VzLAorICAgIH07CisKKyAgICBzdGF0aWMgUGFzc093blB0cjxXb3JrZXJBc3lu
Y0ZpbGVXcml0ZXJDaHJvbWl1bT4gY3JlYXRlKFdlYktpdDo6V2ViRmlsZVN5c3RlbSogd2ViRmls
ZVN5c3RlbSwgY29uc3QgU3RyaW5nJiBwYXRoLCBXb3JrZXJDb250ZXh0KiB3b3JrZXJDb250ZXh0
LCBBc3luY0ZpbGVXcml0ZXJDbGllbnQqIGNsaWVudCwgV3JpdGVyVHlwZSB0eXBlKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIGFkb3B0UHRyKG5ldyBXb3JrZXJBc3luY0ZpbGVXcml0ZXJDaHJvbWl1
bSh3ZWJGaWxlU3lzdGVtLCBwYXRoLCB3b3JrZXJDb250ZXh0LCBjbGllbnQsIHR5cGUpKTsKKyAg
ICB9CisgICAgfldvcmtlckFzeW5jRmlsZVdyaXRlckNocm9taXVtKCk7CisgICAgCisgICAgLy8g
RmlsZVdyaXRlcgorICAgIHZpcnR1YWwgdm9pZCB3cml0ZShsb25nIGxvbmcgcG9zaXRpb24sIEJs
b2IqIGRhdGEpOworICAgIHZpcnR1YWwgdm9pZCB0cnVuY2F0ZShsb25nIGxvbmcgbGVuZ3RoKTsK
KyAgICB2aXJ0dWFsIHZvaWQgYWJvcnQoKTsKKworcHJpdmF0ZToKKworICAgIFdvcmtlckFzeW5j
RmlsZVdyaXRlckNocm9taXVtKFdlYktpdDo6V2ViRmlsZVN5c3RlbSosIGNvbnN0IFN0cmluZyYg
cGF0aCwgV29ya2VyQ29udGV4dCosIEFzeW5jRmlsZVdyaXRlckNsaWVudCosIFdyaXRlclR5cGUp
OworICAgIFJlZlB0cjxXZWJLaXQ6OldvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+IG1f
YnJpZGdlOworICAgIFdyaXRlclR5cGUgbV90eXBlOworfTsKKworfSAvLyBuYW1lc3BhY2UKKwor
I2VuZGlmIC8vIEVOQUJMRShGSUxFX1NZU1RFTSkKKworI2VuZGlmIC8vIEFzeW5jRmlsZVdyaXRl
ckNocm9taXVtX2gKSW5kZXg6IFdlYktpdC9jaHJvbWl1bS9zcmMvV29ya2VyRmlsZVdyaXRlckNh
bGxiYWNrc0JyaWRnZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3Jr
ZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYktpdC9j
aHJvbWl1bS9zcmMvV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZS5jcHAJKHJldmlzaW9u
IDApCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMg
YXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNv
cHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIg
dGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1
dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBm
cm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJt
aXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdI
VCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBU
SEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IK
KyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFM
TCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIldvcmtl
ckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuaCIKKworI2lmIEVOQUJMRShGSUxFX1NZU1RFTSkK
KworI2luY2x1ZGUgIkFzeW5jRmlsZVdyaXRlckNsaWVudC5oIgorI2luY2x1ZGUgIkNyb3NzVGhy
ZWFkVGFzay5oIgorI2luY2x1ZGUgIldlYkNTdHJpbmcuaCIKKyNpbmNsdWRlICJXZWJGaWxlU3lz
dGVtLmgiCisjaW5jbHVkZSAiV2ViRmlsZVdyaXRlci5oIgorI2luY2x1ZGUgIldlYktpdC5oIgor
I2luY2x1ZGUgIldlYktpdENsaWVudC5oIgorI2luY2x1ZGUgIldlYldvcmtlckJhc2UuaCIKKyNp
bmNsdWRlICJXb3JrZXJDb250ZXh0LmgiCisjaW5jbHVkZSAiV29ya2VyTG9hZGVyUHJveHkuaCIK
KyNpbmNsdWRlICJXb3JrZXJUaHJlYWQuaCIKKyNpbmNsdWRlIDx3dGYvTWFpblRocmVhZC5oPgor
I2luY2x1ZGUgPHd0Zi9UaHJlYWRpbmcuaD4KKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisK
K25hbWVzcGFjZSBXZWJLaXQgeworCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlk
Z2U6Om5vdGlmeVN0b3AoKQoreworICAgIEFTU0VSVChtX3dvcmtlckNvbnRleHQtPmlzQ29udGV4
dFRocmVhZCgpKTsKKyAgICBtX2NsaWVudE9uV29ya2VyVGhyZWFkID0gMDsKK30KKwordm9pZCBX
b3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpwb3N0V3JpdGVUb01haW5UaHJlYWQobG9u
ZyBsb25nIHBvc2l0aW9uLCBjb25zdCBLVVJMJiBkYXRhKQoreworICAgIGRpc3BhdGNoVGFza1Rv
TWFpblRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJndyaXRlT25NYWluVGhyZWFkLCB0aGlzLCBw
b3NpdGlvbiwgZGF0YSkpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlk
Z2U6OnBvc3RUcnVuY2F0ZVRvTWFpblRocmVhZChsb25nIGxvbmcgbGVuZ3RoKQoreworICAgIGRp
c3BhdGNoVGFza1RvTWFpblRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJnRydW5jYXRlT25NYWlu
VGhyZWFkLCB0aGlzLCBsZW5ndGgpKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJh
Y2tzQnJpZGdlOjpwb3N0QWJvcnRUb01haW5UaHJlYWQoKQoreworICAgIGRpc3BhdGNoVGFza1Rv
TWFpblRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJmFib3J0T25NYWluVGhyZWFkLCB0aGlzKSk7
Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6cG9zdFNodXRkb3du
VG9NYWluVGhyZWFkKFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4g
YnJpZGdlKQoreworICAgIEFTU0VSVChtX3dvcmtlckNvbnRleHQtPmlzQ29udGV4dFRocmVhZCgp
KTsKKyAgICBtX2NsaWVudE9uV29ya2VyVGhyZWFkID0gMDsKKyAgICBkaXNwYXRjaFRhc2tUb01h
aW5UaHJlYWQoY3JlYXRlQ2FsbGJhY2tUYXNrKCZzaHV0ZG93bk9uTWFpblRocmVhZCwgYnJpZGdl
KSk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6d3JpdGVPbk1h
aW5UaHJlYWQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdy
aXRlckNhbGxiYWNrc0JyaWRnZT4gYnJpZGdlLCBsb25nIGxvbmcgcG9zaXRpb24sIGNvbnN0IEtV
UkwmIGRhdGEpCit7CisgICAgYnJpZGdlLT5tX3dyaXRlci0+d3JpdGUocG9zaXRpb24sIFdlYlVS
TChkYXRhKSk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6dHJ1
bmNhdGVPbk1haW5UaHJlYWQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29y
a2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gYnJpZGdlLCBsb25nIGxvbmcgbGVuZ3RoKQor
eworICAgIGJyaWRnZS0+bV93cml0ZXItPnRydW5jYXRlKGxlbmd0aCk7Cit9CisKK3ZvaWQgV29y
a2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6YWJvcnRPbk1haW5UaHJlYWQoU2NyaXB0RXhl
Y3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRn
ZT4gYnJpZGdlKQoreworICAgIGJyaWRnZS0+bV93cml0ZXItPmNhbmNlbCgpOworfQorCit2b2lk
IFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OmluaXRPbk1haW5UaHJlYWQoU2NyaXB0
RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0Jy
aWRnZT4gYnJpZGdlLCBjb25zdCBTdHJpbmcmIHBhdGgpCit7CisgICAgQVNTRVJUKCFicmlkZ2Ut
Pm1fd3JpdGVyKTsKKyAgICBicmlkZ2UtPm1fd3JpdGVyID0gd2ViS2l0Q2xpZW50KCktPmZpbGVT
eXN0ZW0oKS0+Y3JlYXRlRmlsZVdyaXRlcihwYXRoLCBicmlkZ2UuZ2V0KCkpOworfQorCit2b2lk
IFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OnNodXRkb3duT25NYWluVGhyZWFkKFNj
cmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFj
a3NCcmlkZ2U+IGJyaWRnZSkKK3sKKyAgICBicmlkZ2UtPm1fd3JpdGVyRGVsZXRlZCA9IHRydWU7
CisgICAgYnJpZGdlLT5tX3dyaXRlci5jbGVhcigpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0
ZXJDYWxsYmFja3NCcmlkZ2U6OmRpZFdyaXRlKGxvbmcgbG9uZyBieXRlcywgYm9vbCBjb21wbGV0
ZSkKK3sKKyAgICBkaXNwYXRjaFRhc2tUb1dvcmtlclRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2so
JmRpZFdyaXRlT25Xb3JrZXJUaHJlYWQsIHRoaXMsIGJ5dGVzLCBjb21wbGV0ZSkpOworfQorCit2
b2lkIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OmRpZEZhaWwoV2ViRmlsZUVycm9y
IGVycm9yKQoreworICAgIGRpc3BhdGNoVGFza1RvV29ya2VyVGhyZWFkKGNyZWF0ZUNhbGxiYWNr
VGFzaygmZGlkRmFpbE9uV29ya2VyVGhyZWFkLCB0aGlzLCBlcnJvcikpOworfQorCit2b2lkIFdv
cmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OmRpZFRydW5jYXRlKCkKK3sKKyAgICBkaXNw
YXRjaFRhc2tUb1dvcmtlclRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJmRpZFRydW5jYXRlT25X
b3JrZXJUaHJlYWQsIHRoaXMpKTsKK30KKworV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRn
ZTo6V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZShjb25zdCBTdHJpbmcmIHBhdGgsIFdv
cmtlckxvYWRlclByb3h5KiBwcm94eSwgU2NyaXB0RXhlY3V0aW9uQ29udGV4dCogc2NyaXB0RXhl
Y3V0aW9uQ29udGV4dCwgQXN5bmNGaWxlV3JpdGVyQ2xpZW50KiBjbGllbnQpCisgICAgOiBXb3Jr
ZXJDb250ZXh0OjpPYnNlcnZlcihzdGF0aWNfY2FzdDxXb3JrZXJDb250ZXh0Kj4oc2NyaXB0RXhl
Y3V0aW9uQ29udGV4dCkpCisgICAgLCBtX3Byb3h5KHByb3h5KQorICAgICwgbV93b3JrZXJDb250
ZXh0KHNjcmlwdEV4ZWN1dGlvbkNvbnRleHQpCisgICAgLCBtX2NsaWVudE9uV29ya2VyVGhyZWFk
KGNsaWVudCkKKyAgICAsIG1fd3JpdGVyRGVsZXRlZChmYWxzZSkKK3sKKyAgICBBU1NFUlQobV93
b3JrZXJDb250ZXh0LT5pc0NvbnRleHRUaHJlYWQoKSk7CisgICAgcG9zdEluaXRUb01haW5UaHJl
YWQocGF0aCk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6cG9z
dEluaXRUb01haW5UaHJlYWQoY29uc3QgU3RyaW5nJiBwYXRoKQoreworICAgIGRpc3BhdGNoVGFz
a1RvTWFpblRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJmluaXRPbk1haW5UaHJlYWQsIHRoaXMs
IHBhdGgpKTsKK30KKworV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6fldvcmtlckZp
bGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UoKQoreworICAgIEFTU0VSVCghbV9jbGllbnRPbldvcmtl
clRocmVhZCk7CisgICAgQVNTRVJUKCFtX3dyaXRlcik7Cit9CisKKy8vIFdlIGtub3cgbV9jbGll
bnRPbldvcmtlclRocmVhZCBpcyBzdGlsbCB2YWxpZCBiZWNhdXNlIGl0IGlzIG9ubHkgY2xlYXJl
ZCBvbiB0aGUgY29udGV4dCB0aHJlYWQsIGFuZCBiZWNhdXNlIHdlIGNoZWNrIGluIHJ1blRhc2tP
bldvcmtlclRocmVhZCBiZWZvcmUgY2FsbGluZyBhbnkgb2YgdGhlc2UgbWV0aG9kcy4KK3ZvaWQg
V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6ZGlkV3JpdGVPbldvcmtlclRocmVhZChT
Y3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVyQ2FsbGJh
Y2tzQnJpZGdlPiBicmlkZ2UsIGxvbmcgbG9uZyBsZW5ndGgsIGJvb2wgY29tcGxldGUpCit7Cisg
ICAgQVNTRVJUKGJyaWRnZS0+bV93b3JrZXJDb250ZXh0LT5pc0NvbnRleHRUaHJlYWQoKSk7Cisg
ICAgYnJpZGdlLT5tX2NsaWVudE9uV29ya2VyVGhyZWFkLT5kaWRXcml0ZShsZW5ndGgsIGNvbXBs
ZXRlKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpkaWRGYWls
T25Xb3JrZXJUaHJlYWQoU2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gYnJpZGdlLCBXZWJGaWxlRXJyb3IgZXJyb3IpCit7
CisgICAgQVNTRVJUKGJyaWRnZS0+bV93b3JrZXJDb250ZXh0LT5pc0NvbnRleHRUaHJlYWQoKSk7
CisgICAgYnJpZGdlLT5tX2NsaWVudE9uV29ya2VyVGhyZWFkLT5kaWRGYWlsKHN0YXRpY19jYXN0
PEZpbGVFcnJvcjo6RXJyb3JDb2RlPihlcnJvcikpOworfQorCit2b2lkIFdvcmtlckZpbGVXcml0
ZXJDYWxsYmFja3NCcmlkZ2U6OmRpZFRydW5jYXRlT25Xb3JrZXJUaHJlYWQoU2NyaXB0RXhlY3V0
aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4g
YnJpZGdlKQoreworICAgIEFTU0VSVChicmlkZ2UtPm1fd29ya2VyQ29udGV4dC0+aXNDb250ZXh0
VGhyZWFkKCkpOworICAgIGJyaWRnZS0+bV9jbGllbnRPbldvcmtlclRocmVhZC0+ZGlkVHJ1bmNh
dGUoKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlOjpydW5UYXNr
T25NYWluVGhyZWFkKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIHNjcmlwdEV4ZWN1dGlvbkNvbnRl
eHQsIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gYnJpZGdlLCBQ
YXNzT3duUHRyPFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2s+IHRhc2tUb1J1bikKK3sKKyAg
ICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworICAgIGlmICghYnJpZGdlLT5tX3dyaXRlckRlbGV0
ZWQpCisgICAgICAgIHRhc2tUb1J1bi0+cGVyZm9ybVRhc2soc2NyaXB0RXhlY3V0aW9uQ29udGV4
dCk7Cit9CisKK3ZvaWQgV29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZTo6cnVuVGFza09u
V29ya2VyVGhyZWFkKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIHNjcmlwdEV4ZWN1dGlvbkNvbnRl
eHQsIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4gYnJpZGdlLCBQ
YXNzT3duUHRyPFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2s+IHRhc2tUb1J1bikKK3sKKyAg
ICBBU1NFUlQoYnJpZGdlLT5tX3dvcmtlckNvbnRleHQtPmlzQ29udGV4dFRocmVhZCgpKTsKKyAg
ICBpZiAoYnJpZGdlLT5tX2NsaWVudE9uV29ya2VyVGhyZWFkKQorICAgICAgICB0YXNrVG9SdW4t
PnBlcmZvcm1UYXNrKHNjcmlwdEV4ZWN1dGlvbkNvbnRleHQpOworfQorCit2b2lkIFdvcmtlckZp
bGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U6OmRpc3BhdGNoVGFza1RvTWFpblRocmVhZChQYXNzT3du
UHRyPFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2s+IHRhc2spCit7CisgICAgQVNTRVJUKG1f
d29ya2VyQ29udGV4dC0+aXNDb250ZXh0VGhyZWFkKCkpOworICAgIFdlYldvcmtlckJhc2U6OmRp
c3BhdGNoVGFza1RvTWFpblRocmVhZChjcmVhdGVDYWxsYmFja1Rhc2soJnJ1blRhc2tPbk1haW5U
aHJlYWQsIHRoaXMsIHRhc2spKTsKK30KKwordm9pZCBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tz
QnJpZGdlOjpkaXNwYXRjaFRhc2tUb1dvcmtlclRocmVhZChQYXNzT3duUHRyPFNjcmlwdEV4ZWN1
dGlvbkNvbnRleHQ6OlRhc2s+IHRhc2spCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsK
KyAgICBtX3Byb3h5LT5wb3N0VGFza0Zvck1vZGVUb1dvcmtlckNvbnRleHQoY3JlYXRlQ2FsbGJh
Y2tUYXNrKCZydW5UYXNrT25Xb3JrZXJUaHJlYWQsIHRoaXMsIHRhc2spLCBXb3JrZXJSdW5Mb29w
OjpkZWZhdWx0TW9kZSgpKTsKK30KKworfQorCisjZW5kaWYgLy8gRU5BQkxFKEZJTEVfU1lTVEVN
KQpJbmRleDogV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJp
ZGdlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0L2Nocm9taXVtL3NyYy9Xb3JrZXJGaWxlV3JpdGVy
Q2FsbGJhY2tzQnJpZGdlLmgJKHJldmlzaW9uIDApCisrKyBXZWJLaXQvY2hyb21pdW0vc3JjL1dv
cmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwx
NTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAq
CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICog
aW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29n
bGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk
IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29m
dHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENP
TlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQK
KyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaWZuZGVmIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2VfaAorI2RlZmluZSBX
b3JrZXJGaWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlX2gKKworI2lmIEVOQUJMRShGSUxFX1NZU1RF
TSkKKworI2luY2x1ZGUgIldlYkZpbGVFcnJvci5oIgorI2luY2x1ZGUgIldlYkZpbGVXcml0ZXJD
bGllbnQuaCIKKyNpbmNsdWRlICJXb3JrZXJDb250ZXh0LmgiCisjaW5jbHVkZSA8d3RmL1Bhc3NP
d25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi9UaHJl
YWRTYWZlU2hhcmVkLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKyAgICBjbGFzcyBBc3luY0Zp
bGVXcml0ZXJDbGllbnQ7CisgICAgY2xhc3MgS1VSTDsKKyAgICBjbGFzcyBXb3JrZXJMb2FkZXJQ
cm94eTsKK30KKworbmFtZXNwYWNlIFdURiB7CisgICAgY2xhc3MgU3RyaW5nOworfQordXNpbmcg
V1RGOjpTdHJpbmc7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitjbGFzcyBXZWJGaWxlU3lzdGVt
OworY2xhc3MgV2ViRmlsZVdyaXRlcjsKK2NsYXNzIFdlYkZpbGVXcml0ZXJDbGllbnQ7CitjbGFz
cyBXZWJXb3JrZXJCYXNlOworCisvLyBUaGlzIGNsYXNzIGlzIHVzZWQgYXMgYSBtZWNoYW5pc20g
dG8gYnJpZGdlIGNhbGxzIGJldHdlZW4gdGhyZWFkcy4KKy8vIENhbGxzIHRvIGEgV2ViRmlsZVdy
aXRlciBtdXN0IGhhcHBlbiBvbiB0aGUgbWFpbiB0aHJlYWQsIGJ1dCB0aGV5IGNvbWUgZnJvbQor
Ly8gdGhlIGNvbnRleHQgdGhyZWFkLiBUaGUgcmVzcG9uc2VzIHRocm91Z2ggdGhlIFdlYkZpbGVX
cml0ZXJDbGllbnQgaW50ZXJmYWNlCisvLyBzdGFydCBvbiB0aGUgbWFpbiB0aHJlYWQsIGJ1dCBt
dXN0IGJlIHNlbnQgdmlhIHRoZSB3b3JrZXIgY29udGV4dCB0aHJlYWQuCisvLworLy8gQSB0eXBp
Y2FsIGZsb3cgZm9yIHdyaXRlIHdvdWxkIGxvb2sgbGlrZSB0aGlzOgorLy8gQnJpZGdlOjpwb3N0
V3JpdGVUb01haW5UaHJlYWQoKSBvbiBXb3JrZXJUaHJlYWQKKy8vICAtLT4gQnJpZGdlOjp3cml0
ZU9uTWFpblRocmVhZCgpIGlzIGNhbGxlZCBvbiBNYWluVGhyZWFkCisvLyAgLS0+IFdlYkZpbGVX
cml0ZXI6OndyaXRlKCkKKy8vICAgICAgVGhpcyBtYWtlcyBhbiBJUEM7IHRoZSBhY3R1YWwgb3Bl
cmF0aW9uIGlzIGRvd24gaW4gdGhlIGJyb3dzZXIuCisvLyAgLS0+IEJyaWRnZTo6ZGlkV3JpdGUg
aXMgY2FsbGVkIG9uIE1haW5UaHJlYWQKKy8vICAtLT4gQnJpZGdlOjpkaWRXcml0ZU9uV29ya2Vy
VGhyZWFkIGlzIGNhbGxlZCBvbiBXb3JrZXJUaHJlYWQKKy8vICAgICAgVGhpcyBjYWxscyB0aGUg
b3JpZ2luYWwgY2xpZW50IChtX2NsaWVudE9uV29ya2VyVGhyZWFkKS4KKy8vCisvLyBUaGUgYnJp
ZGdlIG9iamVjdCBpcyByZWZjb3VudGVkLCBzbyB0aGF0IGl0IGRvZXNuJ3QgZ2V0IGRlbGV0ZWQg
d2hpbGUgdGhlcmUKKy8vIGFyZSBjcm9zcy10aHJlYWQgY2FsbHMgaW4gZmxpZ2h0LiBFYWNoIENy
b3NzVGhyZWFkVGFzayBjYXJyaWVzIGEgcmVmZXJlbmNlCisvLyB0byB0aGUgYnJpZGdlLCB3aGlj
aCBndWFyYW50ZWVzIHRoYXQgdGhlIGJyaWRnZSB3aWxsIHN0aWxsIGJlIHZhbGlkIHdoZW4gdGhl
CisvLyB0YXNrIGlzIGV4ZWN1dGVkLiBJbiBvcmRlciB0byBzaHV0IGRvd24gdGhlIGJyaWRnZSwg
dGhlIFdlYkZpbGVXcml0ZXJDbGllbnQKKy8vIHNob3VsZCBjYWxsIHBvc3RTaHV0ZG93blRvTWFp
blRocmVhZCBiZWZvcmUgZHJvcHBpbmcgaXRzIHJlZmVyZW5jZSB0byB0aGUKKy8vIGJyaWRnZS4g
VGhpcyBlbnN1cmVzIHRoYXQgdGhlIFdlYkZpbGVXcml0ZXIgd2lsbCBiZSBjbGVhcmVkIG9uIHRo
ZSBtYWluCisvLyB0aHJlYWQgYW5kIHRoYXQgbm8gZnVydGhlciBjYWxscyB0byB0aGUgV2ViRmls
ZVdyaXRlckNsaWVudCB3aWxsIGJlIG1hZGUuCitjbGFzcyBXb3JrZXJGaWxlV3JpdGVyQ2FsbGJh
Y2tzQnJpZGdlIDogcHVibGljIFRocmVhZFNhZmVTaGFyZWQ8V29ya2VyRmlsZVdyaXRlckNhbGxi
YWNrc0JyaWRnZT4sIHB1YmxpYyBXZWJDb3JlOjpXb3JrZXJDb250ZXh0OjpPYnNlcnZlciwgcHVi
bGljIFdlYkZpbGVXcml0ZXJDbGllbnQgeworcHVibGljOgorICAgIH5Xb3JrZXJGaWxlV3JpdGVy
Q2FsbGJhY2tzQnJpZGdlKCk7CisKKyAgICAvLyBXb3JrZXJDb250ZXh0OjpPYnNlcnZlciBtZXRo
b2QuCisgICAgdmlydHVhbCB2b2lkIG5vdGlmeVN0b3AoKTsKKworICAgIHN0YXRpYyBQYXNzUmVm
UHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+IGNyZWF0ZShjb25zdCBTdHJpbmcm
IHBhdGgsIFdlYkNvcmU6OldvcmtlckxvYWRlclByb3h5KiBwcm94eSwgV2ViQ29yZTo6U2NyaXB0
RXhlY3V0aW9uQ29udGV4dCogd29ya2VyQ29udGV4dCwgV2ViQ29yZTo6QXN5bmNGaWxlV3JpdGVy
Q2xpZW50KiBjbGllbnQpCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFdvcmtl
ckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2UocGF0aCwgcHJveHksIHdvcmtlckNvbnRleHQsIGNs
aWVudCkpOworICAgIH0KKworICAgIC8vIE1ldGhvZHMgdGhhdCBjcmVhdGUgYW4gaW5zdGFuY2Ug
YW5kIHBvc3QgYW4gaW5pdGlhbCByZXF1ZXN0IHRhc2sgdG8gdGhlIG1haW4gdGhyZWFkLiBUaGV5
IG11c3QgYmUgY2FsbGVkIG9uIHRoZSB3b3JrZXIgdGhyZWFkLgorICAgIHZvaWQgcG9zdFdyaXRl
VG9NYWluVGhyZWFkKGxvbmcgbG9uZyBwb3NpdGlvbiwgY29uc3QgV2ViQ29yZTo6S1VSTCYgZGF0
YSk7CisgICAgdm9pZCBwb3N0VHJ1bmNhdGVUb01haW5UaHJlYWQobG9uZyBsb25nIGxlbmd0aCk7
CisgICAgdm9pZCBwb3N0QWJvcnRUb01haW5UaHJlYWQoKTsKKworICAgIC8vIFRoZSBvd25pbmcg
V29ya2VyQXN5bmNGaWxlV3JpdGVyQ2hyb21pdW0gc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgYmVm
b3JlIGRyb3BwaW5nIGl0cyBsYXN0IHJlZmVyZW5jZSB0byB0aGUgYnJpZGdlLCBvbiB0aGUgY29u
dGV4dCB0aHJlYWQuCisgICAgLy8gVGhlIGFjdHVhbCBkZWxldGlvbiBvZiB0aGUgV29ya2VyRmls
ZVdyaXRlckNhbGxiYWNrc0JyaWRnZSBtYXkgaGFwcGVuIG9uIGVpdGhlciB0aGUgbWFpbiBvciBj
b250ZXh0IHRocmVhZCwgZGVwZW5kaW5nIG9uIHdoZXJlIHRoZSBsYXN0IHJlZmVyZW5jZSBnb2Vz
IGF3YXk7IHRoYXQncyBzYWZlIGFzIGxvbmcgYXMgdGhpcyBpcyBjYWxsZWQgZmlyc3QuCisgICAg
dm9pZCBwb3N0U2h1dGRvd25Ub01haW5UaHJlYWQoUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVy
Q2FsbGJhY2tzQnJpZGdlPik7CisKKyAgICAvLyBDYWxsYmFjayBtZXRob2RzIHRoYXQgYXJlIGNh
bGxlZCBvbiB0aGUgbWFpbiB0aHJlYWQuCisgICAgLy8gVGhlc2UgYXJlIHRoZSBpbXBsZW1lbnRh
dGlvbiBvZiBXZWJLaXQ6OldlYkZpbGVXcml0ZXJDbGllbnQuCisgICAgdm9pZCBkaWRXcml0ZShs
b25nIGxvbmcgYnl0ZXMsIGJvb2wgY29tcGxldGUpOworICAgIHZvaWQgZGlkRmFpbChXZWJGaWxl
RXJyb3IpOworICAgIHZvaWQgZGlkVHJ1bmNhdGUoKTsKKworcHJpdmF0ZToKKyAgICBXb3JrZXJG
aWxlV3JpdGVyQ2FsbGJhY2tzQnJpZGdlKGNvbnN0IFN0cmluZyYgcGF0aCwgV2ViQ29yZTo6V29y
a2VyTG9hZGVyUHJveHkqLCBXZWJDb3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgV2ViQ29y
ZTo6QXN5bmNGaWxlV3JpdGVyQ2xpZW50Kik7CisKKyAgICB2b2lkIHBvc3RJbml0VG9NYWluVGhy
ZWFkKGNvbnN0IFN0cmluZyYgcGF0aCk7CisKKyAgICAvLyBNZXRob2RzIHRoYXQgYXJlIHRvIGJl
IGNhbGxlZCBvbiB0aGUgbWFpbiB0aHJlYWQuCisgICAgc3RhdGljIHZvaWQgd3JpdGVPbk1haW5U
aHJlYWQoV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2Vy
RmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4sIGxvbmcgbG9uZyBwb3NpdGlvbiwgY29uc3QgV2Vi
Q29yZTo6S1VSTCYgZGF0YSk7CisgICAgc3RhdGljIHZvaWQgdHJ1bmNhdGVPbk1haW5UaHJlYWQo
V2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdy
aXRlckNhbGxiYWNrc0JyaWRnZT4sIGxvbmcgbG9uZyBsZW5ndGgpOworICAgIHN0YXRpYyB2b2lk
IGFib3J0T25NYWluVGhyZWFkKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNz
UmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+KTsKKyAgICBzdGF0aWMgdm9p
ZCBpbml0T25NYWluVGhyZWFkKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNz
UmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+LCBjb25zdCBTdHJpbmcmIHBh
dGgpOworICAgIHN0YXRpYyB2b2lkIHNodXRkb3duT25NYWluVGhyZWFkKFdlYkNvcmU6OlNjcmlw
dEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NC
cmlkZ2U+KTsKKworICAgIC8vIE1ldGhvZHMgdGhhdCBkaXNwYXRjaCB0byBBc3luY0ZpbGVXcml0
ZXJDbGllbnQgb24gdGhlIHdvcmtlciB0aHJlYWRzLgorICAgIHN0YXRpYyB2b2lkIGRpZFdyaXRl
T25Xb3JrZXJUaHJlYWQoV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCosIFBhc3NSZWZQ
dHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4sIGxvbmcgbG9uZyBsZW5ndGgsIGJv
b2wgY29tcGxldGUpOworICAgIHN0YXRpYyB2b2lkIGRpZEZhaWxPbldvcmtlclRocmVhZChXZWJD
b3JlOjpTY3JpcHRFeGVjdXRpb25Db250ZXh0KiwgUGFzc1JlZlB0cjxXb3JrZXJGaWxlV3JpdGVy
Q2FsbGJhY2tzQnJpZGdlPiwgV2ViRmlsZUVycm9yKTsKKyAgICBzdGF0aWMgdm9pZCBkaWRUcnVu
Y2F0ZU9uV29ya2VyVGhyZWFkKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqLCBQYXNz
UmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+KTsKKworICAgIC8vIENhbGxl
ZCBvbiB0aGUgbWFpbiB0aHJlYWQgdG8gcnVuIHRoZSBzdXBwbGllZCB0YXNrLgorICAgIHN0YXRp
YyB2b2lkIHJ1blRhc2tPbk1haW5UaHJlYWQoV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4
dCosIFBhc3NSZWZQdHI8V29ya2VyRmlsZVdyaXRlckNhbGxiYWNrc0JyaWRnZT4sIFBhc3NPd25Q
dHI8V2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dDo6VGFzaz4pOworICAgIC8vIENhbGxl
ZCBvbiB0aGUgd29ya2VyIHRocmVhZCB0byBydW4gdGhlIHN1cHBsaWVkIHRhc2suCisgICAgc3Rh
dGljIHZvaWQgcnVuVGFza09uV29ya2VyVGhyZWFkKFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNv
bnRleHQqLCBQYXNzUmVmUHRyPFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2U+LCBQYXNz
T3duUHRyPFdlYkNvcmU6OlNjcmlwdEV4ZWN1dGlvbkNvbnRleHQ6OlRhc2s+KTsKKworICAgIC8v
IENhbGxlZCBvbiB0aGUgd29ya2VyIHRocmVhZCB0byBkaXNwYXRjaCB0byB0aGUgbWFpbiB0aHJl
YWQuCisgICAgdm9pZCBkaXNwYXRjaFRhc2tUb01haW5UaHJlYWQoUGFzc093blB0cjxXZWJDb3Jl
OjpTY3JpcHRFeGVjdXRpb25Db250ZXh0OjpUYXNrPik7CisgICAgLy8gQ2FsbGVkIG9uIHRoZSBt
YWluIHRocmVhZCB0byBkaXNwYXRjaCB0byB0aGUgd29ya2VyIHRocmVhZC4KKyAgICB2b2lkIGRp
c3BhdGNoVGFza1RvV29ya2VyVGhyZWFkKFBhc3NPd25QdHI8V2ViQ29yZTo6U2NyaXB0RXhlY3V0
aW9uQ29udGV4dDo6VGFzaz4pOworCisgICAgLy8gVXNlZCBmcm9tIHRoZSBtYWluIHRocmVhZCB0
byBwb3N0IHRhc2tzIHRvIHRoZSBjb250ZXh0IHRocmVhZC4KKyAgICBXZWJDb3JlOjpXb3JrZXJM
b2FkZXJQcm94eSogbV9wcm94eTsKKworICAgIC8vIFVzZWQgb24gdGhlIGNvbnRleHQgdGhyZWFk
LCBvbmx5IHRvIGNoZWNrIHRoYXQgd2UncmUgcnVubmluZyBvbiB0aGUgY29udGV4dCB0aHJlYWQu
CisgICAgV2ViQ29yZTo6U2NyaXB0RXhlY3V0aW9uQ29udGV4dCogbV93b3JrZXJDb250ZXh0Owor
CisgICAgLy8gQ3JlYXRlZCBhbmQgZGVzdHJveWVkIGZyb20gdGhlIG1haW4gdGhyZWFkLgorICAg
IE93blB0cjxXZWJLaXQ6OldlYkZpbGVXcml0ZXI+IG1fd3JpdGVyOworCisgICAgLy8gVXNlZCBv
biB0aGUgY29udGV4dCB0aHJlYWQgdG8gY2FsbCBiYWNrIGludG8gdGhlIGNsaWVudC4KKyAgICBX
ZWJDb3JlOjpBc3luY0ZpbGVXcml0ZXJDbGllbnQqIG1fY2xpZW50T25Xb3JrZXJUaHJlYWQ7CisK
KyAgICAvLyBVc2VkIHRvIGluZGljYXRlIHRoYXQgc2h1dGRvd24gaGFzIHN0YXJ0ZWQgb24gdGhl
IG1haW4gdGhyZWFkLCBhbmQgaGVuY2UgdGhlIHdyaXRlciBoYXMgYmVlbiBkZWxldGVkLgorICAg
IGJvb2wgbV93cml0ZXJEZWxldGVkOworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisj
ZW5kaWYKKworI2VuZGlmIC8vIFdvcmtlckZpbGVXcml0ZXJDYWxsYmFja3NCcmlkZ2VfaAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>