<?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>147162</bug_id>
          
          <creation_ts>2015-07-21 13:28:29 -0700</creation_ts>
          <short_desc>Simplify the WTF thread creation mechanism</short_desc>
          <delta_ts>2015-07-22 14:47:08 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>ASSIGNED</bug_status>
          <resolution></resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Mark Lam">mark.lam</reporter>
          <assigned_to name="Mark Lam">mark.lam</assigned_to>
          <cc>andersca</cc>
    
    <cc>benjamin</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>commit-queue</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1111036</commentid>
    <comment_count>0</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-07-21 13:28:29 -0700</bug_when>
    <thetext>The current thread creation mechanism does the following:
   1. There are 2 wrapper thread entry points:
      a. threadEntryPoint() in Threading.cpp
      b. wtfThreadEntryPoint() in ThreadingPthreads.cpp / ThreadingWin.cpp

   2. There are 2 wrapper data structures for thread data:
      a. One version of createThread() wraps entryPoint and data in a std::function&lt;void()&gt;.
      b. A second version of createThread() further wraps the std::function&lt;void()&gt; in a NewThreadContext.
      c. Next, createThreadInternal() wraps the NewThreadContext in a ThreadFunctionInvocation.

      As a result:
      d. wtfThreadEntryPoint() needs to unwrap the ThreadFunctionInvocation, and invokes its function, taking us to ...
      e. threadEntryPoint() which unwraps the NewThreadContext, and invokes its entryPoint, taking us to ...
      f. the std::function&lt;void()&gt; which invokes its captured entryPoint.

   3. There are complicated life cycle management for these data structures:
      a. ownership of the std::function&lt;void()&gt; closure is forwarded (using WTF::move()) to
         a local in threadEntryPoint() where it gets destructed on return.
      b. the NewThreadContext is new&apos;d in createThread() on the creating thread, and
         delete&apos;d on the created thread before invoking the entryPoint.
      c. the ThreadFunctionInvocation is allocated using std::make_unique on the creating thread, and
         ownership is transferred to the created thread, where
         it destructs it on return from wtfThreadEntryPoint.

   4. Threading.cpp&apos;s threadEntryPoint calls initializeCurrentThreadInternal() to initialize the
      created thread&apos;s name.  The underlying mechanism for setting the thread name is platform
      specific anyway.  There&apos;s no reason why we can&apos;t just pass the name down to createThreadInternal()
      and have the specific platform implementation take care of it. 

This is a lot of malloc/frees and wrapping and un-wrappings.  And there are 3 representations of the thread entry point.  Also, ...

   5. The ThreadIdentifier of the created thread is computed as follows:
      a. The creating thread locks a mutex.
      b. The creating thread starts the new thread.
      c. The new thread blocks on the mutex.
      d. The creating thread establishes the ThreadIdentifier of the new thread.
      e. The creating thread unlocks the mutex.
      f. The new thread unblocks and caches the ThreadIdentifier in its thread local storage.
      g. The new thread releases the mutex and moves on with life.

This does not work when we want to use std::thread::id as the implementation of ThreadIdentifier later.  That requires the ThreadIdentifier to be established on the created thread instead because there is no way std::thread::get_id() that can be invoked on a thread that is not the current one.

With all that in mind, we can simplify the thread creation mechanism as follows:

1. Only have 1 wrapper thread entry point in ThreadingPthreads.cpp / ThreadingWin.cpp.
   We&apos;ll name it threadEntryPoint().

2. Only have 2 wrapper data structures for thread data:
   a. createThread() can wrap entryPoint and data in a std::function&lt;void()&gt; if needed.
   b. createThreadInternal() will use a platform specific ThreadData struct that allows the created thread to pass initialization data to the created thread.

3. Remove unnecessary mallocs:
   a. ownership of the std::function&lt;void()&gt; closure continues to be forwarded (using WTF::move()) to
      a local in the platform specific threadEntryPoint() where it gets destructed on return.
   b. ThreadData will be allocated on the stack in createThreadInternal().  It is only needed while
      creating the new thread and its life-cycle is localized there.

4. We will always compute the ThreadIdentifier in the created thread and pass it back to the creating thread.

5. The ThreadIdentifier of the create thread will be computed on the created thread as follows:
   a. The creating thread locks a mutex.
   b. The creating thread starts the new thread.
   c. The new thread blocks on the mutex.
   d. The creating thread waits on a condition variable and releases the mutex.
   e. The new thread unblocks, and establishes its ThreadIdentifier, and sets it in the ThreadData shared from the creating thread.
   f. The new thread notifies all waiting on the condition variable, and releases the mutex.
   g. The creating thread wakes up, and retrieves the ThreadIdentifier from the ThreadData.
   h. The creating thread releases the mutex and moves on with life.

Note that the life-cycle of the ThreadData struct is limited to the scope of createThreadInternal().  The new thread&apos;s notification to the creating thread is the signal that it is done with thread initialization.  Hence, the ThreadIdentifier is available at that time, and the ThreadData struct may be released by the creating thread.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1111045</commentid>
    <comment_count>1</comment_count>
      <attachid>257201</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-07-21 13:41:22 -0700</bug_when>
    <thetext>Created attachment 257201
the fix.

Uploading to test on the EWS bots, while I&apos;m running perf and regression tests locally.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1111071</commentid>
    <comment_count>2</comment_count>
      <attachid>257207</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-07-21 14:54:37 -0700</bug_when>
    <thetext>Created attachment 257207
patch 2: added missing #include, and #if out unused function in NDEBUG build.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1111417</commentid>
    <comment_count>3</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2015-07-22 14:17:53 -0700</bug_when>
    <thetext>All tests (jsc, api, and layout tests) show no regressions.
Benchmarks (jsc, jetstream, speedstream) shows that this patch is perf neutral.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1111431</commentid>
    <comment_count>4</comment_count>
      <attachid>257207</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-07-22 14:39:53 -0700</bug_when>
    <thetext>Comment on attachment 257207
patch 2: added missing #include, and #if out unused function in NDEBUG build.

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

&gt; Source/WTF/ChangeLog:51
&gt; +        This does not work when we want to use std::thread::id as the implementation of ThreadIdentifier later.
&gt; +        That requires the ThreadIdentifier to be established on the created thread instead because there is no
&gt; +        way std::thread::get_id() that can be invoked on a thread that is not the current one.

I&apos;m not certain what you mean by this, but I think you&apos;ve missed something. See http://en.cppreference.com/w/cpp/thread/thread/get_id.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1111434</commentid>
    <comment_count>5</comment_count>
      <attachid>257207</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2015-07-22 14:47:08 -0700</bug_when>
    <thetext>Comment on attachment 257207
patch 2: added missing #include, and #if out unused function in NDEBUG build.

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

I don&apos;t think this patch is a simplification. Perhaps a new patch, inspired by some of the ideas in this patch, would be a simplification.

&gt; Source/WTF/wtf/ThreadingPthreads.cpp:180
&gt; +    volatile ThreadIdentifier id { 0 };

&quot;volatile&quot; is wrong here.

&gt; Source/WTF/wtf/ThreadingPthreads.cpp:188
&gt; +    // The contents of the ThreadData is only guaranteed to be valid before we signal the creating
&gt; +    // thread below. The signaling tells the creating thread that we&apos;re done initializing and implies
&gt; +    // that it may dispose of the ThreadData. Hence, we should grab the info we need out of it
&gt; +    // before then.

This is a strange dance. Why not have the creating thread transfer owner of ThreadData to the created thread? That&apos;s a much easier model to work with.

&gt; Source/WTF/wtf/ThreadingPthreads.cpp:225
&gt; +    while (!data.id)
&gt; +        data.conditionVariable.wait(lock);

Why do we want the creating thread to wait for the created thread to come into existence? That seems potentially slow, and a regression relative to what the old code did.

&gt; Source/WTF/wtf/ThreadingPthreads.cpp:226
&gt; +    ASSERT(data.id);

I don&apos;t like this ASSERT, since it duplicates the while loop just above it.

&gt; Source/WTF/wtf/ThreadingWin.cpp:212
&gt; +    volatile ThreadIdentifier id { 0 };

&quot;volatile&quot; is wrong here.

&gt; Source/WTF/wtf/ThreadingWin.cpp:231
&gt; +#if !defined(NDEBUG)
&gt; +        data-&gt;id = currentThread();
&gt; +#endif
&gt; +        data-&gt;done = true;

Why not use id to indicate done-ness, as we do in pthreads?

&gt; Source/WTF/wtf/ThreadingWin.cpp:264
&gt; +    while (!data.done)
&gt; +        data.conditionVariable.wait(lock);

Why do we want the creating thread to wait for the created thread to come into existence? That seems potentially slow, and a regression relative to what the old code did.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>257201</attachid>
            <date>2015-07-21 13:41:22 -0700</date>
            <delta_ts>2015-07-21 14:54:37 -0700</delta_ts>
            <desc>the fix.</desc>
            <filename>bug-147162.patch</filename>
            <type>text/plain</type>
            <size>19311</size>
            <attacher name="Mark Lam">mark.lam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XVEYvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvQ2hh
bmdlTG9nCShyZXZpc2lvbiAxODcxMTkpCisrKyBTb3VyY2UvV1RGL0NoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzICsxLDExMCBAQAorMjAxNS0wNy0yMSAgTWFyayBMYW0gIDxtYXJrLmxh
bUBhcHBsZS5jb20+CisKKyAgICAgICAgU2ltcGxpZnkgdGhlIFdURiB0aHJlYWQgY3JlYXRpb24g
bWVjaGFuaXNtLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MTQ3MTYyCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgVGhlIGN1cnJlbnQgdGhyZWFkIGNyZWF0aW9uIG1lY2hhbmlzbSBkb2VzIHRoZSBmb2xsb3dp
bmc6CisgICAgICAgICAgIDEuIFRoZXJlIGFyZSAyIHdyYXBwZXIgdGhyZWFkIGVudHJ5IHBvaW50
czoKKyAgICAgICAgICAgICAgYS4gdGhyZWFkRW50cnlQb2ludCgpIGluIFRocmVhZGluZy5jcHAK
KyAgICAgICAgICAgICAgYi4gd3RmVGhyZWFkRW50cnlQb2ludCgpIGluIFRocmVhZGluZ1B0aHJl
YWRzLmNwcCAvIFRocmVhZGluZ1dpbi5jcHAKKworICAgICAgICAgICAyLiBUaGVyZSBhcmUgMiB3
cmFwcGVyIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhyZWFkIGRhdGE6CisgICAgICAgICAgICAgIGEu
IE9uZSB2ZXJzaW9uIG9mIGNyZWF0ZVRocmVhZCgpIHdyYXBzIGVudHJ5UG9pbnQgYW5kIGRhdGEg
aW4gYSBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4uCisgICAgICAgICAgICAgIGIuIEEgc2Vjb25kIHZl
cnNpb24gb2YgY3JlYXRlVGhyZWFkKCkgZnVydGhlciB3cmFwcyB0aGUgc3RkOjpmdW5jdGlvbjx2
b2lkKCk+IGluIGEgTmV3VGhyZWFkQ29udGV4dC4KKyAgICAgICAgICAgICAgYy4gTmV4dCwgY3Jl
YXRlVGhyZWFkSW50ZXJuYWwoKSB3cmFwcyB0aGUgTmV3VGhyZWFkQ29udGV4dCBpbiBhIFRocmVh
ZEZ1bmN0aW9uSW52b2NhdGlvbi4KKworICAgICAgICAgICAgICBBcyBhIHJlc3VsdDoKKyAgICAg
ICAgICAgICAgZC4gd3RmVGhyZWFkRW50cnlQb2ludCgpIG5lZWRzIHRvIHVud3JhcCB0aGUgVGhy
ZWFkRnVuY3Rpb25JbnZvY2F0aW9uLCBhbmQgaW52b2tlcyBpdHMgZnVuY3Rpb24sIHRha2luZyB1
cyB0byAuLi4KKyAgICAgICAgICAgICAgZS4gdGhyZWFkRW50cnlQb2ludCgpIHdoaWNoIHVud3Jh
cHMgdGhlIE5ld1RocmVhZENvbnRleHQsIGFuZCBpbnZva2VzIGl0cyBlbnRyeVBvaW50LCB0YWtp
bmcgdXMgdG8gLi4uCisgICAgICAgICAgICAgIGYuIHRoZSBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4g
d2hpY2ggaW52b2tlcyBpdHMgY2FwdHVyZWQgZW50cnlQb2ludC4KKworICAgICAgICAgICAzLiBU
aGVyZSBhcmUgY29tcGxpY2F0ZWQgbGlmZSBjeWNsZSBtYW5hZ2VtZW50IGZvciB0aGVzZSBkYXRh
IHN0cnVjdHVyZXM6CisgICAgICAgICAgICAgIGEuIG93bmVyc2hpcCBvZiB0aGUgc3RkOjpmdW5j
dGlvbjx2b2lkKCk+IGNsb3N1cmUgaXMgZm9yd2FyZGVkICh1c2luZyBXVEY6Om1vdmUoKSkgdG8K
KyAgICAgICAgICAgICAgICAgYSBsb2NhbCBpbiB0aHJlYWRFbnRyeVBvaW50KCkgd2hlcmUgaXQg
Z2V0cyBkZXN0cnVjdGVkIG9uIHJldHVybi4KKyAgICAgICAgICAgICAgYi4gdGhlIE5ld1RocmVh
ZENvbnRleHQgaXMgbmV3J2QgaW4gY3JlYXRlVGhyZWFkKCkgb24gdGhlIGNyZWF0aW5nIHRocmVh
ZCwgYW5kCisgICAgICAgICAgICAgICAgIGRlbGV0ZSdkIG9uIHRoZSBjcmVhdGVkIHRocmVhZCBi
ZWZvcmUgaW52b2tpbmcgdGhlIGVudHJ5UG9pbnQuCisgICAgICAgICAgICAgIGMuIHRoZSBUaHJl
YWRGdW5jdGlvbkludm9jYXRpb24gaXMgYWxsb2NhdGVkIHVzaW5nIHN0ZDo6bWFrZV91bmlxdWUg
b24gdGhlIGNyZWF0aW5nIHRocmVhZCwgYW5kCisgICAgICAgICAgICAgICAgIG93bmVyc2hpcCBp
cyB0cmFuc2ZlcnJlZCB0byB0aGUgY3JlYXRlZCB0aHJlYWQsIHdoZXJlCisgICAgICAgICAgICAg
ICAgIGl0IGRlc3RydWN0cyBpdCBvbiByZXR1cm4gZnJvbSB3dGZUaHJlYWRFbnRyeVBvaW50Lgor
CisgICAgICAgICAgIDQuIFRocmVhZGluZy5jcHAncyB0aHJlYWRFbnRyeVBvaW50IGNhbGxzIGlu
aXRpYWxpemVDdXJyZW50VGhyZWFkSW50ZXJuYWwoKSB0byBpbml0aWFsaXplIHRoZQorICAgICAg
ICAgICAgICBjcmVhdGVkIHRocmVhZCdzIG5hbWUuICBUaGUgdW5kZXJseWluZyBtZWNoYW5pc20g
Zm9yIHNldHRpbmcgdGhlIHRocmVhZCBuYW1lIGlzIHBsYXRmb3JtCisgICAgICAgICAgICAgIHNw
ZWNpZmljIGFueXdheS4gIFRoZXJlJ3Mgbm8gcmVhc29uIHdoeSB3ZSBjYW4ndCBqdXN0IHBhc3Mg
dGhlIG5hbWUgZG93biB0byBjcmVhdGVUaHJlYWRJbnRlcm5hbCgpCisgICAgICAgICAgICAgIGFu
ZCBoYXZlIHRoZSBzcGVjaWZpYyBwbGF0Zm9ybSBpbXBsZW1lbnRhdGlvbiB0YWtlIGNhcmUgb2Yg
aXQuIAorCisgICAgICAgIFRoaXMgaXMgYSBsb3Qgb2YgbWFsbG9jL2ZyZWVzIGFuZCB3cmFwcGlu
ZyBhbmQgdW4td3JhcHBpbmdzLiAgQW5kIHRoZXJlIGFyZSAzIHJlcHJlc2VudGF0aW9ucyBvZiB0
aGUKKyAgICAgICAgdGhyZWFkIGVudHJ5IHBvaW50LiAgQWxzbywgLi4uCisKKyAgICAgICAgICAg
NS4gVGhlIFRocmVhZElkZW50aWZpZXIgb2YgdGhlIGNyZWF0ZWQgdGhyZWFkIGlzIGNvbXB1dGVk
IGFzIGZvbGxvd3M6CisgICAgICAgICAgICAgIGEuIFRoZSBjcmVhdGluZyB0aHJlYWQgbG9ja3Mg
YSBtdXRleC4KKyAgICAgICAgICAgICAgYi4gVGhlIGNyZWF0aW5nIHRocmVhZCBzdGFydHMgdGhl
IG5ldyB0aHJlYWQuCisgICAgICAgICAgICAgIGMuIFRoZSBuZXcgdGhyZWFkIGJsb2NrcyBvbiB0
aGUgbXV0ZXguCisgICAgICAgICAgICAgIGQuIFRoZSBjcmVhdGluZyB0aHJlYWQgZXN0YWJsaXNo
ZXMgdGhlIFRocmVhZElkZW50aWZpZXIgb2YgdGhlIG5ldyB0aHJlYWQuCisgICAgICAgICAgICAg
IGUuIFRoZSBjcmVhdGluZyB0aHJlYWQgdW5sb2NrcyB0aGUgbXV0ZXguCisgICAgICAgICAgICAg
IGYuIFRoZSBuZXcgdGhyZWFkIHVuYmxvY2tzIGFuZCBjYWNoZXMgdGhlIFRocmVhZElkZW50aWZp
ZXIgaW4gaXRzIHRocmVhZCBsb2NhbCBzdG9yYWdlLgorICAgICAgICAgICAgICBnLiBUaGUgbmV3
IHRocmVhZCByZWxlYXNlcyB0aGUgbXV0ZXggYW5kIG1vdmVzIG9uIHdpdGggbGlmZS4KKworICAg
ICAgICBUaGlzIGRvZXMgbm90IHdvcmsgd2hlbiB3ZSB3YW50IHRvIHVzZSBzdGQ6OnRocmVhZDo6
aWQgYXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIFRocmVhZElkZW50aWZpZXIgbGF0ZXIuCisgICAg
ICAgIFRoYXQgcmVxdWlyZXMgdGhlIFRocmVhZElkZW50aWZpZXIgdG8gYmUgZXN0YWJsaXNoZWQg
b24gdGhlIGNyZWF0ZWQgdGhyZWFkIGluc3RlYWQgYmVjYXVzZSB0aGVyZSBpcyBubworICAgICAg
ICB3YXkgc3RkOjp0aHJlYWQ6OmdldF9pZCgpIHRoYXQgY2FuIGJlIGludm9rZWQgb24gYSB0aHJl
YWQgdGhhdCBpcyBub3QgdGhlIGN1cnJlbnQgb25lLgorCisgICAgICAgIFdpdGggYWxsIHRoYXQg
aW4gbWluZCwgd2UgY2FuIHNpbXBsaWZ5IHRoZSB0aHJlYWQgY3JlYXRpb24gbWVjaGFuaXNtIGFz
IGZvbGxvd3M6CisKKyAgICAgICAgICAgMS4gT25seSBoYXZlIDEgd3JhcHBlciB0aHJlYWQgZW50
cnkgcG9pbnQgaW4gVGhyZWFkaW5nUHRocmVhZHMuY3BwIC8gVGhyZWFkaW5nV2luLmNwcC4KKyAg
ICAgICAgICAgICAgV2UnbGwgbmFtZSBpdCB0aHJlYWRFbnRyeVBvaW50KCkuCisKKyAgICAgICAg
ICAgMi4gT25seSBoYXZlIDIgd3JhcHBlciBkYXRhIHN0cnVjdHVyZXMgZm9yIHRocmVhZCBkYXRh
OgorICAgICAgICAgICAgICBhLiBjcmVhdGVUaHJlYWQoKSBjYW4gd3JhcCBlbnRyeVBvaW50IGFu
ZCBkYXRhIGluIGEgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGlmIG5lZWRlZC4KKyAgICAgICAgICAg
ICAgYi4gY3JlYXRlVGhyZWFkSW50ZXJuYWwoKSB3aWxsIHVzZSBhIHBsYXRmb3JtIHNwZWNpZmlj
IFRocmVhZERhdGEgc3RydWN0IHRoYXQgYWxsb3dzIHRoZSBjcmVhdGVkCisgICAgICAgICAgICAg
ICAgIHRocmVhZCB0byBwYXNzIGluaXRpYWxpemF0aW9uIGRhdGEgdG8gdGhlIGNyZWF0ZWQgdGhy
ZWFkLgorCisgICAgICAgICAgIDMuIFJlbW92ZSB1bm5lY2Vzc2FyeSBtYWxsb2NzOgorICAgICAg
ICAgICAgICBhLiBvd25lcnNoaXAgb2YgdGhlIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjbG9zdXJl
IGNvbnRpbnVlcyB0byBiZSBmb3J3YXJkZWQgKHVzaW5nIFdURjo6bW92ZSgpKSB0bworICAgICAg
ICAgICAgICAgICBhIGxvY2FsIGluIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyB0aHJlYWRFbnRyeVBv
aW50KCkgd2hlcmUgaXQgZ2V0cyBkZXN0cnVjdGVkIG9uIHJldHVybi4KKyAgICAgICAgICAgICAg
Yi4gVGhyZWFkRGF0YSB3aWxsIGJlIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2sgaW4gY3JlYXRlVGhy
ZWFkSW50ZXJuYWwoKS4gIEl0IGlzIG9ubHkgbmVlZGVkIHdoaWxlCisgICAgICAgICAgICAgICAg
IGNyZWF0aW5nIHRoZSBuZXcgdGhyZWFkIGFuZCBpdHMgbGlmZS1jeWNsZSBpcyBsb2NhbGl6ZWQg
dGhlcmUuCisKKyAgICAgICAgICAgNC4gV2Ugd2lsbCBhbHdheXMgY29tcHV0ZSB0aGUgVGhyZWFk
SWRlbnRpZmllciBpbiB0aGUgY3JlYXRlZCB0aHJlYWQgYW5kIHBhc3MgaXQgYmFjayB0byB0aGUg
Y3JlYXRpbmcKKyAgICAgICAgICAgICAgdGhyZWFkLgorCisgICAgICAgICAgIDUuIFRoZSBUaHJl
YWRJZGVudGlmaWVyIG9mIHRoZSBjcmVhdGUgdGhyZWFkIHdpbGwgYmUgY29tcHV0ZWQgb24gdGhl
IGNyZWF0ZWQgdGhyZWFkIGFzIGZvbGxvd3M6CisgICAgICAgICAgICAgIGEuIFRoZSBjcmVhdGlu
ZyB0aHJlYWQgbG9ja3MgYSBtdXRleC4KKyAgICAgICAgICAgICAgYi4gVGhlIGNyZWF0aW5nIHRo
cmVhZCBzdGFydHMgdGhlIG5ldyB0aHJlYWQuCisgICAgICAgICAgICAgIGMuIFRoZSBuZXcgdGhy
ZWFkIGJsb2NrcyBvbiB0aGUgbXV0ZXguCisgICAgICAgICAgICAgIGQuIFRoZSBjcmVhdGluZyB0
aHJlYWQgd2FpdHMgb24gYSBjb25kaXRpb24gdmFyaWFibGUgYW5kIHJlbGVhc2VzIHRoZSBtdXRl
eC4KKyAgICAgICAgICAgICAgZS4gVGhlIG5ldyB0aHJlYWQgdW5ibG9ja3MsIGFuZCBlc3RhYmxp
c2hlcyBpdHMgVGhyZWFkSWRlbnRpZmllciwgYW5kIHNldHMgaXQgaW4gdGhlIFRocmVhZERhdGEK
KyAgICAgICAgICAgICAgICAgc2hhcmVkIGZyb20gdGhlIGNyZWF0aW5nIHRocmVhZC4KKyAgICAg
ICAgICAgICAgZi4gVGhlIG5ldyB0aHJlYWQgbm90aWZpZXMgYWxsIHdhaXRpbmcgb24gdGhlIGNv
bmRpdGlvbiB2YXJpYWJsZSwgYW5kIHJlbGVhc2VzIHRoZSBtdXRleC4KKyAgICAgICAgICAgICAg
Zy4gVGhlIGNyZWF0aW5nIHRocmVhZCB3YWtlcyB1cCwgYW5kIHJldHJpZXZlcyB0aGUgVGhyZWFk
SWRlbnRpZmllciBmcm9tIHRoZSBUaHJlYWREYXRhLgorICAgICAgICAgICAgICBoLiBUaGUgY3Jl
YXRpbmcgdGhyZWFkIHJlbGVhc2VzIHRoZSBtdXRleCBhbmQgbW92ZXMgb24gd2l0aCBsaWZlLgor
CisgICAgICAgIE5vdGUgdGhhdCB0aGUgbGlmZS1jeWNsZSBvZiB0aGUgVGhyZWFkRGF0YSBzdHJ1
Y3QgaXMgbm93IGxpbWl0ZWQgdG8gdGhlIHNjb3BlIG9mIGNyZWF0ZVRocmVhZEludGVybmFsKCku
CisgICAgICAgIFRoZSBuZXcgdGhyZWFkJ3Mgbm90aWZpY2F0aW9uIHRvIHRoZSBjcmVhdGluZyB0
aHJlYWQgaXMgdGhlIHNpZ25hbCB0aGF0IGl0IGlzIGRvbmUgd2l0aCB0aHJlYWQgaW5pdGlhbGl6
YXRpb24uCisgICAgICAgIEhlbmNlLCB0aGUgVGhyZWFkSWRlbnRpZmllciBpcyBhdmFpbGFibGUg
YXQgdGhhdCB0aW1lLCBhbmQgdGhlIFRocmVhZERhdGEgc3RydWN0IG1heSBiZSByZWxlYXNlZCBi
eSB0aGUgY3JlYXRpbmcKKyAgICAgICAgdGhyZWFkLgorCisgICAgICAgICogd3RmL1RocmVhZEZ1
bmN0aW9uSW52b2NhdGlvbi5oOiBSZW1vdmVkLgorICAgICAgICAqIHd0Zi9UaHJlYWRpbmcuY3Bw
OgorICAgICAgICAoV1RGOjpjcmVhdGVUaHJlYWQpOgorICAgICAgICAoV1RGOjp0aHJlYWRFbnRy
eVBvaW50KTogRGVsZXRlZC4KKyAgICAgICAgKiB3dGYvVGhyZWFkaW5nLmg6CisgICAgICAgICog
d3RmL1RocmVhZGluZ1B0aHJlYWRzLmNwcDoKKyAgICAgICAgKFdURjo6cHRocmVhZEhhbmRsZUZv
cklkZW50aWZpZXJXaXRoTG9ja0FscmVhZHlIZWxkKToKKyAgICAgICAgKFdURjo6VGhyZWFkRGF0
YTo6VGhyZWFkRGF0YSk6CisgICAgICAgIChXVEY6OnRocmVhZEVudHJ5UG9pbnQpOgorICAgICAg
ICAoV1RGOjpjcmVhdGVUaHJlYWRJbnRlcm5hbCk6CisgICAgICAgIChXVEY6OmluaXRpYWxpemVD
dXJyZW50VGhyZWFkSW50ZXJuYWwpOgorICAgICAgICAoV1RGOjpjaGFuZ2VUaHJlYWRQcmlvcml0
eSk6CisgICAgICAgIChXVEY6Ond0ZlRocmVhZEVudHJ5UG9pbnQpOiBEZWxldGVkLgorICAgICAg
ICAqIHd0Zi9UaHJlYWRpbmdXaW4uY3BwOgorICAgICAgICAoV1RGOjpjbGVhclRocmVhZEhhbmRs
ZUZvcklkZW50aWZpZXIpOgorICAgICAgICAoV1RGOjpUaHJlYWREYXRhOjpUaHJlYWREYXRhKToK
KyAgICAgICAgKFdURjo6dGhyZWFkRW50cnlQb2ludCk6CisgICAgICAgIChXVEY6OmNyZWF0ZVRo
cmVhZEludGVybmFsKToKKyAgICAgICAgKFdURjo6d3RmVGhyZWFkRW50cnlQb2ludCk6IERlbGV0
ZWQuCisKIDIwMTUtMDctMjAgIE1hcmsgTGFtICA8bWFyay5sYW1AYXBwbGUuY29tPgogCiAgICAg
ICAgIFJvbGxvdXQgcjE4NzAyMCBhbmQgcjE4NzAyMTogYnJlYWtzIEpTQyBBUEkgdGVzdHMgb24g
ZGVidWcgYnVpbGRzLgpJbmRleDogU291cmNlL1dURi93dGYvVGhyZWFkRnVuY3Rpb25JbnZvY2F0
aW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dURi93dGYvVGhyZWFkRnVuY3Rpb25JbnZvY2F0
aW9uLmgJKHJldmlzaW9uIDE4NzExMCkKKysrIFNvdXJjZS9XVEYvd3RmL1RocmVhZEZ1bmN0aW9u
SW52b2NhdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5
cmlnaHQgKEMpIDIwMDcsIDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoK
LSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuICBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAotICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4gCi0gKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAg
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4gCi0gKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBJbmMuICgi
QXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCi0gKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUg
dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgIGZyb20g
dGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4g
Ci0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRS
SUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBUaHJl
YWRGdW5jdGlvbkludm9jYXRpb25faAotI2RlZmluZSBUaHJlYWRGdW5jdGlvbkludm9jYXRpb25f
aAotCi1uYW1lc3BhY2UgV1RGIHsKLQotdHlwZWRlZiB2b2lkICgqVGhyZWFkRnVuY3Rpb24pKHZv
aWQqIGFyZ3VtZW50KTsKLQotc3RydWN0IFRocmVhZEZ1bmN0aW9uSW52b2NhdGlvbiB7Ci0gICAg
V1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7Ci1wdWJsaWM6Ci0gICAgVGhyZWFkRnVuY3Rpb25JbnZv
Y2F0aW9uKFRocmVhZEZ1bmN0aW9uIGZ1bmN0aW9uLCB2b2lkKiBkYXRhKQotICAgICAgICA6IGZ1
bmN0aW9uKGZ1bmN0aW9uKQotICAgICAgICAsIGRhdGEoZGF0YSkKLSAgICB7Ci0gICAgfQotCi0g
ICAgVGhyZWFkRnVuY3Rpb24gZnVuY3Rpb247Ci0gICAgdm9pZCogZGF0YTsKLX07Ci0KLX0gLy8g
bmFtZXNwYWNlIFdURgotCi0jZW5kaWYgLy8gVGhyZWFkRnVuY3Rpb25JbnZvY2F0aW9uX2gKSW5k
ZXg6IFNvdXJjZS9XVEYvd3RmL1RocmVhZGluZy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dU
Ri93dGYvVGhyZWFkaW5nLmNwcAkocmV2aXNpb24gMTg3MTEwKQorKysgU291cmNlL1dURi93dGYv
VGhyZWFkaW5nLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzAsMzQgKzMwLDYgQEAKIAogbmFtZXNw
YWNlIFdURiB7CiAKLXN0cnVjdCBOZXdUaHJlYWRDb250ZXh0IHsKLSAgICBXVEZfTUFLRV9GQVNU
X0FMTE9DQVRFRDsKLXB1YmxpYzoKLSAgICBjb25zdCBjaGFyKiBuYW1lOwotICAgIHN0ZDo6ZnVu
Y3Rpb248dm9pZCgpPiBlbnRyeVBvaW50OwotICAgIE11dGV4IGNyZWF0aW9uTXV0ZXg7Ci19Owot
Ci1zdGF0aWMgdm9pZCB0aHJlYWRFbnRyeVBvaW50KHZvaWQqIGNvbnRleHREYXRhKQotewotICAg
IE5ld1RocmVhZENvbnRleHQqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxOZXdUaHJlYWRDb250ZXh0
Kj4oY29udGV4dERhdGEpOwotCi0gICAgLy8gQmxvY2sgdW50aWwgb3VyIGNyZWF0aW5nIHRocmVh
ZCBoYXMgY29tcGxldGVkIGFueSBleHRyYSBzZXR1cCB3b3JrLCBpbmNsdWRpbmcKLSAgICAvLyBl
c3RhYmxpc2hpbmcgVGhyZWFkSWRlbnRpZmllci4KLSAgICB7Ci0gICAgICAgIE11dGV4TG9ja2Vy
IGxvY2tlcihjb250ZXh0LT5jcmVhdGlvbk11dGV4KTsKLSAgICB9Ci0KLSAgICBpbml0aWFsaXpl
Q3VycmVudFRocmVhZEludGVybmFsKGNvbnRleHQtPm5hbWUpOwotCi0gICAgYXV0byBlbnRyeVBv
aW50ID0gV1RGOjptb3ZlKGNvbnRleHQtPmVudHJ5UG9pbnQpOwotCi0gICAgLy8gRGVsZXRlIHRo
ZSBjb250ZXh0IGJlZm9yZSBzdGFydGluZyB0aGUgdGhyZWFkLgotICAgIGRlbGV0ZSBjb250ZXh0
OwotCi0gICAgZW50cnlQb2ludCgpOwotfQotCiBUaHJlYWRJZGVudGlmaWVyIGNyZWF0ZVRocmVh
ZChjb25zdCBjaGFyKiBuYW1lLCBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gZW50cnlQb2ludCkKIHsK
ICAgICAvLyBWaXN1YWwgU3R1ZGlvIGhhcyBhIDMxLWNoYXJhY3RlciBsaW1pdCBvbiB0aHJlYWQg
bmFtZXMuIExvbmdlciBuYW1lcyB3aWxsCkBAIC02NiwxMyArMzgsNyBAQCBUaHJlYWRJZGVudGlm
aWVyIGNyZWF0ZVRocmVhZChjb25zdCBjaGFyCiAgICAgaWYgKG5hbWUgJiYgc3RybGVuKG5hbWUp
ID4gMzEpCiAgICAgICAgIExPR19FUlJPUigiVGhyZWFkIG5hbWUgXCIlc1wiIGlzIGxvbmdlciB0
aGFuIDMxIGNoYXJhY3RlcnMgYW5kIHdpbGwgYmUgdHJ1bmNhdGVkIGJ5IFZpc3VhbCBTdHVkaW8i
LCBuYW1lKTsKICNlbmRpZgotCi0gICAgTmV3VGhyZWFkQ29udGV4dCogY29udGV4dCA9IG5ldyBO
ZXdUaHJlYWRDb250ZXh0IHsgbmFtZSwgV1RGOjptb3ZlKGVudHJ5UG9pbnQpLCB7IH0gfTsKLQot
ICAgIC8vIFByZXZlbnQgdGhlIHRocmVhZCBib2R5IGZyb20gZXhlY3V0aW5nIHVudGlsIHdlJ3Zl
IGVzdGFibGlzaGVkIHRoZSB0aHJlYWQgaWRlbnRpZmllci4KLSAgICBNdXRleExvY2tlciBsb2Nr
ZXIoY29udGV4dC0+Y3JlYXRpb25NdXRleCk7Ci0KLSAgICByZXR1cm4gY3JlYXRlVGhyZWFkSW50
ZXJuYWwodGhyZWFkRW50cnlQb2ludCwgY29udGV4dCwgbmFtZSk7CisgICAgcmV0dXJuIGNyZWF0
ZVRocmVhZEludGVybmFsKFdURjo6bW92ZShlbnRyeVBvaW50KSwgbmFtZSk7CiB9CiAKIFRocmVh
ZElkZW50aWZpZXIgY3JlYXRlVGhyZWFkKFRocmVhZEZ1bmN0aW9uIGVudHJ5UG9pbnQsIHZvaWQq
IGRhdGEsIGNvbnN0IGNoYXIqIG5hbWUpCkluZGV4OiBTb3VyY2UvV1RGL3d0Zi9UaHJlYWRpbmcu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL3d0Zi9UaHJlYWRpbmcuaAkocmV2aXNpb24gMTg3
MTEwKQorKysgU291cmNlL1dURi93dGYvVGhyZWFkaW5nLmgJKHdvcmtpbmcgY29weSkKQEAgLTcw
LDcgKzcwLDcgQEAgV1RGX0VYUE9SVF9QUklWQVRFIHZvaWQgZGV0YWNoVGhyZWFkKFRocgogV1RG
X0VYUE9SVF9QUklWQVRFIFRocmVhZElkZW50aWZpZXIgY3JlYXRlVGhyZWFkKFRocmVhZEZ1bmN0
aW9uLCB2b2lkKiwgY29uc3QgY2hhciogdGhyZWFkTmFtZSk7CiAKIC8vIEludGVybmFsIHBsYXRm
b3JtLXNwZWNpZmljIGNyZWF0ZVRocmVhZCBpbXBsZW1lbnRhdGlvbi4KLVRocmVhZElkZW50aWZp
ZXIgY3JlYXRlVGhyZWFkSW50ZXJuYWwoVGhyZWFkRnVuY3Rpb24sIHZvaWQqLCBjb25zdCBjaGFy
KiB0aHJlYWROYW1lKTsKK1RocmVhZElkZW50aWZpZXIgY3JlYXRlVGhyZWFkSW50ZXJuYWwoc3Rk
OjpmdW5jdGlvbjx2b2lkKCk+LCBjb25zdCBjaGFyKiB0aHJlYWROYW1lKTsKIAogLy8gQ2FsbGVk
IGluIHRoZSB0aHJlYWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLgogLy8gSGVscGZ1bCBmb3IgcGxh
dGZvcm1zIHdoZXJlIHRoZSB0aHJlYWQgbmFtZSBtdXN0IGJlIHNldCBmcm9tIHdpdGhpbiB0aGUg
dGhyZWFkLgpJbmRleDogU291cmNlL1dURi93dGYvVGhyZWFkaW5nUHRocmVhZHMuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XVEYvd3RmL1RocmVhZGluZ1B0aHJlYWRzLmNwcAkocmV2aXNpb24g
MTg3MTEwKQorKysgU291cmNlL1dURi93dGYvVGhyZWFkaW5nUHRocmVhZHMuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC00MSw3ICs0MSw2IEBACiAjaW5jbHVkZSAiUmFuZG9tTnVtYmVyU2VlZC5oIgog
I2luY2x1ZGUgIlN0YWNrU3RhdHMuaCIKICNpbmNsdWRlICJTdGRMaWJFeHRyYXMuaCIKLSNpbmNs
dWRlICJUaHJlYWRGdW5jdGlvbkludm9jYXRpb24uaCIKICNpbmNsdWRlICJUaHJlYWRJZGVudGlm
aWVyRGF0YVB0aHJlYWRzLmgiCiAjaW5jbHVkZSAiVGhyZWFkU3BlY2lmaWMuaCIKICNpbmNsdWRl
IDx3dGYvRGF0YUxvZy5oPgpAQCAtMTYzLDM1ICsxNjIsNjYgQEAgc3RhdGljIHB0aHJlYWRfdCBw
dGhyZWFkSGFuZGxlRm9ySWRlbnRpZgogICAgIHJldHVybiB0aHJlYWRNYXAoKS5nZXQoaWQpLT5w
dGhyZWFkSGFuZGxlKCk7CiB9CiAKLXN0YXRpYyB2b2lkKiB3dGZUaHJlYWRFbnRyeVBvaW50KHZv
aWQqIHBhcmFtKQorc3RydWN0IFRocmVhZERhdGEgeworICAgIFRocmVhZERhdGEoc3RkOjpmdW5j
dGlvbjx2b2lkKCk+IGVudHJ5UG9pbnQsIGNvbnN0IGNoYXIqIG5hbWUpCisgICAgICAgIDogZW50
cnlQb2ludChXVEY6Om1vdmUoZW50cnlQb2ludCkpCisgICAgICAgICwgbmFtZShuYW1lKQorICAg
IHsKKyAgICB9CisKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gZW50cnlQb2ludDsKKyAgICBj
b25zdCBjaGFyKiBuYW1lOworCisgICAgc3RkOjptdXRleCBtdXRleDsKKyAgICBzdGQ6OmNvbmRp
dGlvbl92YXJpYWJsZSBjb25kaXRpb25WYXJpYWJsZTsKKyAgICB2b2xhdGlsZSBUaHJlYWRJZGVu
dGlmaWVyIGlkIHsgMCB9OworfTsKKworc3RhdGljIHZvaWQqIHRocmVhZEVudHJ5UG9pbnQodm9p
ZCogcGFyYW0pCiB7Ci0gICAgLy8gQmFsYW5jZWQgYnkgLmxlYWtQdHIoKSBpbiBjcmVhdGVUaHJl
YWRJbnRlcm5hbC4KLSAgICBhdXRvIGludm9jYXRpb24gPSBzdGQ6OnVuaXF1ZV9wdHI8VGhyZWFk
RnVuY3Rpb25JbnZvY2F0aW9uPihzdGF0aWNfY2FzdDxUaHJlYWRGdW5jdGlvbkludm9jYXRpb24q
PihwYXJhbSkpOwotICAgIGludm9jYXRpb24tPmZ1bmN0aW9uKGludm9jYXRpb24tPmRhdGEpOwor
ICAgIC8vIFRoZSBjb250ZW50cyBvZiB0aGUgVGhyZWFkRGF0YSBpcyBvbmx5IGd1YXJhbnRlZWQg
dG8gYmUgdmFsaWQgYmVmb3JlIHdlIHNpZ25hbCB0aGUgY3JlYXRpbmcKKyAgICAvLyB0aHJlYWQg
YmVsb3cuIFRoZSBzaWduYWxpbmcgdGVsbHMgdGhlIGNyZWF0aW5nIHRocmVhZCB0aGF0IHdlJ3Jl
IGRvbmUgaW5pdGlhbGl6aW5nIGFuZCBpbXBsaWVzCisgICAgLy8gdGhhdCBpdCBtYXkgZGlzcG9z
ZSBvZiB0aGUgVGhyZWFkRGF0YS4gSGVuY2UsIHdlIHNob3VsZCBncmFiIHRoZSBpbmZvIHdlIG5l
ZWQgb3V0IG9mIGl0CisgICAgLy8gYmVmb3JlIHRoZW4uCisgICAgYXV0byBkYXRhID0gc3RhdGlj
X2Nhc3Q8VGhyZWFkRGF0YSo+KHBhcmFtKTsKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gZW50
cnlQb2ludCA9IFdURjo6bW92ZShkYXRhLT5lbnRyeVBvaW50KTsKKyAgICBjb25zdCBjaGFyKiBu
YW1lID0gZGF0YS0+bmFtZTsKKworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6
bXV0ZXg+IGxvY2tlcihkYXRhLT5tdXRleCk7CisgICAgICAgIGRhdGEtPmlkID0gY3VycmVudFRo
cmVhZCgpOworICAgICAgICBkYXRhLT5jb25kaXRpb25WYXJpYWJsZS5ub3RpZnlfYWxsKCk7Cisg
ICAgfQorCisgICAgaW5pdGlhbGl6ZUN1cnJlbnRUaHJlYWRJbnRlcm5hbChuYW1lKTsKKyAgICBl
bnRyeVBvaW50KCk7CisgICAgCiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLVRocmVhZElkZW50
aWZpZXIgY3JlYXRlVGhyZWFkSW50ZXJuYWwoVGhyZWFkRnVuY3Rpb24gZW50cnlQb2ludCwgdm9p
ZCogZGF0YSwgY29uc3QgY2hhciopCitUaHJlYWRJZGVudGlmaWVyIGNyZWF0ZVRocmVhZEludGVy
bmFsKHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBlbnRyeVBvaW50LCBjb25zdCBjaGFyKiBuYW1lKQog
ewotICAgIGF1dG8gaW52b2NhdGlvbiA9IHN0ZDo6bWFrZV91bmlxdWU8VGhyZWFkRnVuY3Rpb25J
bnZvY2F0aW9uPihlbnRyeVBvaW50LCBkYXRhKTsKKyAgICBUaHJlYWREYXRhIGRhdGEoV1RGOjpt
b3ZlKGVudHJ5UG9pbnQpLCBuYW1lKTsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+
IGxvY2soZGF0YS5tdXRleCk7CisKICAgICBwdGhyZWFkX3QgdGhyZWFkSGFuZGxlOwogICAgIHB0
aHJlYWRfYXR0cl90IGF0dHI7CiAgICAgcHRocmVhZF9hdHRyX2luaXQoJmF0dHIpOwogI2lmIEhB
VkUoUU9TX0NMQVNTRVMpCiAgICAgcHRocmVhZF9hdHRyX3NldF9xb3NfY2xhc3NfbnAoJmF0dHIs
IFFPU19DTEFTU19VU0VSX0lOSVRJQVRFRCwgMCk7CiAjZW5kaWYKLSAgICBpbnQgZXJyb3IgPSBw
dGhyZWFkX2NyZWF0ZSgmdGhyZWFkSGFuZGxlLCAmYXR0ciwgd3RmVGhyZWFkRW50cnlQb2ludCwg
aW52b2NhdGlvbi5nZXQoKSk7CisKKyAgICBpbnQgZXJyb3IgPSBwdGhyZWFkX2NyZWF0ZSgmdGhy
ZWFkSGFuZGxlLCAmYXR0ciwgdGhyZWFkRW50cnlQb2ludCwgJmRhdGEpOwogICAgIHB0aHJlYWRf
YXR0cl9kZXN0cm95KCZhdHRyKTsKICAgICBpZiAoZXJyb3IpIHsKLSAgICAgICAgTE9HX0VSUk9S
KCJGYWlsZWQgdG8gY3JlYXRlIHB0aHJlYWQgYXQgZW50cnkgcG9pbnQgJXAgd2l0aCBkYXRhICVw
Iiwgd3RmVGhyZWFkRW50cnlQb2ludCwgaW52b2NhdGlvbi5nZXQoKSk7CisgICAgICAgIExPR19F
UlJPUigiRmFpbGVkIHRvIGNyZWF0ZSBwdGhyZWFkIGF0IGVudHJ5IHBvaW50ICVwIHdpdGggZGF0
YSAlcCIsIHRocmVhZEVudHJ5UG9pbnQsICZkYXRhKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAg
fQogCi0gICAgLy8gQmFsYW5jZWQgYnkgc3RkOjp1bmlxdWVfcHRyIGNvbnN0cnVjdG9yIGluIHd0
ZlRocmVhZEVudHJ5UG9pbnQuCi0gICAgVGhyZWFkRnVuY3Rpb25JbnZvY2F0aW9uKiBsZWFrZWRJ
bnZvY2F0aW9uID0gaW52b2NhdGlvbi5yZWxlYXNlKCk7Ci0gICAgVU5VU0VEX1BBUkFNKGxlYWtl
ZEludm9jYXRpb24pOwotCi0gICAgcmV0dXJuIGVzdGFibGlzaElkZW50aWZpZXJGb3JQdGhyZWFk
SGFuZGxlKHRocmVhZEhhbmRsZSk7CisgICAgd2hpbGUgKCFkYXRhLmlkKQorICAgICAgICBkYXRh
LmNvbmRpdGlvblZhcmlhYmxlLndhaXQobG9jayk7CisgICAgQVNTRVJUKGRhdGEuaWQpOworICAg
IHJldHVybiBkYXRhLmlkOwogfQogCiB2b2lkIGluaXRpYWxpemVDdXJyZW50VGhyZWFkSW50ZXJu
YWwoY29uc3QgY2hhciogdGhyZWFkTmFtZSkKQEAgLTIwNywxMCArMjM3LDYgQEAgdm9pZCBpbml0
aWFsaXplQ3VycmVudFRocmVhZEludGVybmFsKGNvbgogICAgIC8vIGdhcmJhZ2UgY29sbGVjdG9y
IGluIGNhc2UgQVBJIGltcGxlbWVudGF0aW9ucyB1c2UgZ2FyYmFnZS1jb2xsZWN0ZWQgbWVtb3J5
LgogICAgIG9iamNfcmVnaXN0ZXJUaHJlYWRXaXRoQ29sbGVjdG9yKCk7CiAjZW5kaWYKLQotICAg
IFRocmVhZElkZW50aWZpZXIgaWQgPSBpZGVudGlmaWVyQnlQdGhyZWFkSGFuZGxlKHB0aHJlYWRf
c2VsZigpKTsKLSAgICBBU1NFUlQoaWQpOwotICAgIFRocmVhZElkZW50aWZpZXJEYXRhOjppbml0
aWFsaXplKGlkKTsKIH0KICAgICAKIHZvaWQgY2hhbmdlVGhyZWFkUHJpb3JpdHkoVGhyZWFkSWRl
bnRpZmllciB0aHJlYWRJRCwgaW50IGRlbHRhKQpJbmRleDogU291cmNlL1dURi93dGYvVGhyZWFk
aW5nV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL3d0Zi9UaHJlYWRpbmdXaW4uY3Bw
CShyZXZpc2lvbiAxODcxMTApCisrKyBTb3VyY2UvV1RGL3d0Zi9UaHJlYWRpbmdXaW4uY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC05Myw3ICs5Myw2IEBACiAjaW5jbHVkZSAiZHRvYS9jYWNoZWQtcG93
ZXJzLmgiCiAKICNpbmNsdWRlICJNYWluVGhyZWFkLmgiCi0jaW5jbHVkZSAiVGhyZWFkRnVuY3Rp
b25JbnZvY2F0aW9uLmgiCiAjaW5jbHVkZSA8cHJvY2Vzcy5oPgogI2luY2x1ZGUgPHdpbmRvd3Mu
aD4KICNpbmNsdWRlIDx3dGYvQ3VycmVudFRpbWUuaD4KQEAgLTE5NSwxMCArMTk0LDQ1IEBAIHN0
YXRpYyB2b2lkIGNsZWFyVGhyZWFkSGFuZGxlRm9ySWRlbnRpZmkKICAgICB0aHJlYWRNYXAoKS5y
ZW1vdmUoaWQpOwogfQogCi1zdGF0aWMgdW5zaWduZWQgX19zdGRjYWxsIHd0ZlRocmVhZEVudHJ5
UG9pbnQodm9pZCogcGFyYW0pCitzdHJ1Y3QgVGhyZWFkRGF0YSB7CisgICAgVGhyZWFkRGF0YShz
dGQ6OmZ1bmN0aW9uPHZvaWQoKT4gZW50cnlQb2ludCwgY29uc3QgY2hhciogbmFtZSkKKyAgICAg
ICAgOiBlbnRyeVBvaW50KFdURjo6bW92ZShlbnRyeVBvaW50KSkKKyAgICAgICAgLCBuYW1lKG5h
bWUpCisgICAgeworICAgIH0KKyAgICAKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gZW50cnlQ
b2ludDsKKyAgICBjb25zdCBjaGFyKiBuYW1lOworICAgIAorICAgIHN0ZDo6bXV0ZXggbXV0ZXg7
CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgY29uZGl0aW9uVmFyaWFibGU7CisgICAgYm9v
bCBkb25lIHsgZmFsc2UgfTsKKyNpZiAhZGVmaW5lZChOREVCVUcpCisgICAgdm9sYXRpbGUgVGhy
ZWFkSWRlbnRpZmllciBpZCB7IDAgfTsKKyNlbmRpZgorfTsKKworc3RhdGljIHVuc2lnbmVkIF9f
c3RkY2FsbCB0aHJlYWRFbnRyeVBvaW50KHZvaWQqIHBhcmFtKQogewotICAgIHN0ZDo6dW5pcXVl
X3B0cjxUaHJlYWRGdW5jdGlvbkludm9jYXRpb24+IGludm9jYXRpb24oc3RhdGljX2Nhc3Q8VGhy
ZWFkRnVuY3Rpb25JbnZvY2F0aW9uKj4ocGFyYW0pKTsKLSAgICBpbnZvY2F0aW9uLT5mdW5jdGlv
bihpbnZvY2F0aW9uLT5kYXRhKTsKKyAgICAvLyBUaGUgY29udGVudHMgb2YgdGhlIFRocmVhZERh
dGEgaXMgb25seSBndWFyYW50ZWVkIHRvIGJlIHZhbGlkIGJlZm9yZSB3ZSBzaWduYWwgdGhlIGNy
ZWF0aW5nCisgICAgLy8gdGhyZWFkIGJlbG93LiBUaGUgc2lnbmFsaW5nIHRlbGxzIHRoZSBjcmVh
dGluZyB0aHJlYWQgdGhhdCB3ZSdyZSBkb25lIGluaXRpYWxpemluZyBhbmQgaW1wbGllcworICAg
IC8vIHRoYXQgaXQgbWF5IGRpc3Bvc2Ugb2YgdGhlIFRocmVhZERhdGEuIEhlbmNlLCB3ZSBzaG91
bGQgZ3JhYiB0aGUgaW5mbyB3ZSBuZWVkIG91dCBvZiBpdAorICAgIC8vIGJlZm9yZSB0aGVuLgor
ICAgIGF1dG8gZGF0YSA9IHN0YXRpY19jYXN0PFRocmVhZERhdGEqPihwYXJhbSk7CisgICAgc3Rk
OjpmdW5jdGlvbjx2b2lkKCk+IGVudHJ5UG9pbnQgPSBXVEY6Om1vdmUoZGF0YS0+ZW50cnlQb2lu
dCk7CisgICAgY29uc3QgY2hhciogbmFtZSA9IGRhdGEtPm5hbWU7CisKKyAgICB7CisgICAgICAg
IHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrZXIoZGF0YS0+bXV0ZXgpOworI2lmICFk
ZWZpbmVkKE5ERUJVRykKKyAgICAgICAgZGF0YS0+aWQgPSBjdXJyZW50VGhyZWFkKCk7CisjZW5k
aWYKKyAgICAgICAgZGF0YS0+ZG9uZSA9IHRydWU7CisgICAgICAgIGRhdGEtPmNvbmRpdGlvblZh
cmlhYmxlLm5vdGlmeV9hbGwoKTsKKyAgICB9CisKKyAgICBpbml0aWFsaXplQ3VycmVudFRocmVh
ZEludGVybmFsKG5hbWUpOworICAgIGVudHJ5UG9pbnQoKTsKIAogI2lmICFVU0UoUFRIUkVBRFMp
ICYmIE9TKFdJTkRPV1MpCiAgICAgLy8gRG8gdGhlIFRMUyBjbGVhbnVwLgpAQCAtMjA4LDI3ICsy
NDIsMzEgQEAgc3RhdGljIHVuc2lnbmVkIF9fc3RkY2FsbCB3dGZUaHJlYWRFbnRyeQogICAgIHJl
dHVybiAwOwogfQogCi1UaHJlYWRJZGVudGlmaWVyIGNyZWF0ZVRocmVhZEludGVybmFsKFRocmVh
ZEZ1bmN0aW9uIGVudHJ5UG9pbnQsIHZvaWQqIGRhdGEsIGNvbnN0IGNoYXIqIHRocmVhZE5hbWUp
CitUaHJlYWRJZGVudGlmaWVyIGNyZWF0ZVRocmVhZEludGVybmFsKHN0ZDo6ZnVuY3Rpb248dm9p
ZCgpPiBlbnRyeVBvaW50LCBjb25zdCBjaGFyKiBuYW1lKQogeworICAgIFRocmVhZERhdGEgZGF0
YShXVEY6Om1vdmUoZW50cnlQb2ludCksIG5hbWUpOworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3Rk
OjptdXRleD4gbG9jayhkYXRhLm11dGV4KTsKKwogICAgIHVuc2lnbmVkIHRocmVhZElkZW50aWZp
ZXIgPSAwOwogICAgIFRocmVhZElkZW50aWZpZXIgdGhyZWFkSUQgPSAwOwotICAgIGF1dG8gaW52
b2NhdGlvbiA9IHN0ZDo6bWFrZV91bmlxdWU8VGhyZWFkRnVuY3Rpb25JbnZvY2F0aW9uPihlbnRy
eVBvaW50LCBkYXRhKTsKLSAgICBIQU5ETEUgdGhyZWFkSGFuZGxlID0gcmVpbnRlcnByZXRfY2Fz
dDxIQU5ETEU+KF9iZWdpbnRocmVhZGV4KDAsIDAsIHd0ZlRocmVhZEVudHJ5UG9pbnQsIGludm9j
YXRpb24uZ2V0KCksIDAsICZ0aHJlYWRJZGVudGlmaWVyKSk7CisgICAgSEFORExFIHRocmVhZEhh
bmRsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8SEFORExFPihfYmVnaW50aHJlYWRleCgwLCAwLCB0aHJl
YWRFbnRyeVBvaW50LCBpbnZvY2F0aW9uLmdldCgpLCAwLCAmdGhyZWFkSWRlbnRpZmllcikpOwog
ICAgIGlmICghdGhyZWFkSGFuZGxlKSB7CiAjaWYgIUhBVkUoRVJSTk9fSCkKLSAgICAgICAgTE9H
X0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIHRocmVhZCBhdCBlbnRyeSBwb2ludCAlcCB3aXRoIGRh
dGEgJXAuIiwgZW50cnlQb2ludCwgZGF0YSk7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRv
IGNyZWF0ZSB0aHJlYWQgYXQgZW50cnkgcG9pbnQgJXAgd2l0aCBkYXRhICVwLiIsIGVudHJ5UG9p
bnQsICZkYXRhKTsKICNlbHNlCi0gICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSB0
aHJlYWQgYXQgZW50cnkgcG9pbnQgJXAgd2l0aCBkYXRhICVwOiAlbGQiLCBlbnRyeVBvaW50LCBk
YXRhLCBlcnJubyk7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSB0aHJlYWQg
YXQgZW50cnkgcG9pbnQgJXAgd2l0aCBkYXRhICVwOiAlbGQiLCBlbnRyeVBvaW50LCAmZGF0YSwg
ZXJybm8pOwogI2VuZGlmCiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIC8vIFRoZSB0
aHJlYWQgd2lsbCB0YWtlIG93bmVyc2hpcCBvZiBpbnZvY2F0aW9uLgotICAgIFRocmVhZEZ1bmN0
aW9uSW52b2NhdGlvbiogbGVha2VkSW52b2NhdGlvbiA9IGludm9jYXRpb24ucmVsZWFzZSgpOwot
ICAgIFVOVVNFRF9QQVJBTShsZWFrZWRJbnZvY2F0aW9uKTsKKyAgICB3aGlsZSAoIWRhdGEuZG9u
ZSkKKyAgICAgICAgZGF0YS5jb25kaXRpb25WYXJpYWJsZS53YWl0KGxvY2spOwogCiAgICAgdGhy
ZWFkSUQgPSBzdGF0aWNfY2FzdDxUaHJlYWRJZGVudGlmaWVyPih0aHJlYWRJZGVudGlmaWVyKTsK
ICAgICBzdG9yZVRocmVhZEhhbmRsZUJ5SWRlbnRpZmllcih0aHJlYWRJZGVudGlmaWVyLCB0aHJl
YWRIYW5kbGUpOworI2lmICFkZWZpbmVkKE5ERUJVRykKKyAgICBBU1NFUlQodGhyZWFkSUQgPT0g
ZGF0YS5pZCk7CisjZW5kaWYKIAogICAgIHJldHVybiB0aHJlYWRJRDsKIH0K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>257207</attachid>
            <date>2015-07-21 14:54:37 -0700</date>
            <delta_ts>2015-07-22 14:47:08 -0700</delta_ts>
            <desc>patch 2: added missing #include, and #if out unused function in NDEBUG build.</desc>
            <filename>bug-147162.patch</filename>
            <type>text/plain</type>
            <size>19930</size>
            <attacher name="Mark Lam">mark.lam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XVEYvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvQ2hh
bmdlTG9nCShyZXZpc2lvbiAxODcxMTkpCisrKyBTb3VyY2UvV1RGL0NoYW5nZUxvZwkod29ya2lu
ZyBjb3B5KQpAQCAtMSwzICsxLDExMCBAQAorMjAxNS0wNy0yMSAgTWFyayBMYW0gIDxtYXJrLmxh
bUBhcHBsZS5jb20+CisKKyAgICAgICAgU2ltcGxpZnkgdGhlIFdURiB0aHJlYWQgY3JlYXRpb24g
bWVjaGFuaXNtLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MTQ3MTYyCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgVGhlIGN1cnJlbnQgdGhyZWFkIGNyZWF0aW9uIG1lY2hhbmlzbSBkb2VzIHRoZSBmb2xsb3dp
bmc6CisgICAgICAgICAgIDEuIFRoZXJlIGFyZSAyIHdyYXBwZXIgdGhyZWFkIGVudHJ5IHBvaW50
czoKKyAgICAgICAgICAgICAgYS4gdGhyZWFkRW50cnlQb2ludCgpIGluIFRocmVhZGluZy5jcHAK
KyAgICAgICAgICAgICAgYi4gd3RmVGhyZWFkRW50cnlQb2ludCgpIGluIFRocmVhZGluZ1B0aHJl
YWRzLmNwcCAvIFRocmVhZGluZ1dpbi5jcHAKKworICAgICAgICAgICAyLiBUaGVyZSBhcmUgMiB3
cmFwcGVyIGRhdGEgc3RydWN0dXJlcyBmb3IgdGhyZWFkIGRhdGE6CisgICAgICAgICAgICAgIGEu
IE9uZSB2ZXJzaW9uIG9mIGNyZWF0ZVRocmVhZCgpIHdyYXBzIGVudHJ5UG9pbnQgYW5kIGRhdGEg
aW4gYSBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4uCisgICAgICAgICAgICAgIGIuIEEgc2Vjb25kIHZl
cnNpb24gb2YgY3JlYXRlVGhyZWFkKCkgZnVydGhlciB3cmFwcyB0aGUgc3RkOjpmdW5jdGlvbjx2
b2lkKCk+IGluIGEgTmV3VGhyZWFkQ29udGV4dC4KKyAgICAgICAgICAgICAgYy4gTmV4dCwgY3Jl
YXRlVGhyZWFkSW50ZXJuYWwoKSB3cmFwcyB0aGUgTmV3VGhyZWFkQ29udGV4dCBpbiBhIFRocmVh
ZEZ1bmN0aW9uSW52b2NhdGlvbi4KKworICAgICAgICAgICAgICBBcyBhIHJlc3VsdDoKKyAgICAg
ICAgICAgICAgZC4gd3RmVGhyZWFkRW50cnlQb2ludCgpIG5lZWRzIHRvIHVud3JhcCB0aGUgVGhy
ZWFkRnVuY3Rpb25JbnZvY2F0aW9uLCBhbmQgaW52b2tlcyBpdHMgZnVuY3Rpb24sIHRha2luZyB1
cyB0byAuLi4KKyAgICAgICAgICAgICAgZS4gdGhyZWFkRW50cnlQb2ludCgpIHdoaWNoIHVud3Jh
cHMgdGhlIE5ld1RocmVhZENvbnRleHQsIGFuZCBpbnZva2VzIGl0cyBlbnRyeVBvaW50LCB0YWtp
bmcgdXMgdG8gLi4uCisgICAgICAgICAgICAgIGYuIHRoZSBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4g
d2hpY2ggaW52b2tlcyBpdHMgY2FwdHVyZWQgZW50cnlQb2ludC4KKworICAgICAgICAgICAzLiBU
aGVyZSBhcmUgY29tcGxpY2F0ZWQgbGlmZSBjeWNsZSBtYW5hZ2VtZW50IGZvciB0aGVzZSBkYXRh
IHN0cnVjdHVyZXM6CisgICAgICAgICAgICAgIGEuIG93bmVyc2hpcCBvZiB0aGUgc3RkOjpmdW5j
dGlvbjx2b2lkKCk+IGNsb3N1cmUgaXMgZm9yd2FyZGVkICh1c2luZyBXVEY6Om1vdmUoKSkgdG8K
KyAgICAgICAgICAgICAgICAgYSBsb2NhbCBpbiB0aHJlYWRFbnRyeVBvaW50KCkgd2hlcmUgaXQg
Z2V0cyBkZXN0cnVjdGVkIG9uIHJldHVybi4KKyAgICAgICAgICAgICAgYi4gdGhlIE5ld1RocmVh
ZENvbnRleHQgaXMgbmV3J2QgaW4gY3JlYXRlVGhyZWFkKCkgb24gdGhlIGNyZWF0aW5nIHRocmVh
ZCwgYW5kCisgICAgICAgICAgICAgICAgIGRlbGV0ZSdkIG9uIHRoZSBjcmVhdGVkIHRocmVhZCBi
ZWZvcmUgaW52b2tpbmcgdGhlIGVudHJ5UG9pbnQuCisgICAgICAgICAgICAgIGMuIHRoZSBUaHJl
YWRGdW5jdGlvbkludm9jYXRpb24gaXMgYWxsb2NhdGVkIHVzaW5nIHN0ZDo6bWFrZV91bmlxdWUg
b24gdGhlIGNyZWF0aW5nIHRocmVhZCwgYW5kCisgICAgICAgICAgICAgICAgIG93bmVyc2hpcCBp
cyB0cmFuc2ZlcnJlZCB0byB0aGUgY3JlYXRlZCB0aHJlYWQsIHdoZXJlCisgICAgICAgICAgICAg
ICAgIGl0IGRlc3RydWN0cyBpdCBvbiByZXR1cm4gZnJvbSB3dGZUaHJlYWRFbnRyeVBvaW50Lgor
CisgICAgICAgICAgIDQuIFRocmVhZGluZy5jcHAncyB0aHJlYWRFbnRyeVBvaW50IGNhbGxzIGlu
aXRpYWxpemVDdXJyZW50VGhyZWFkSW50ZXJuYWwoKSB0byBpbml0aWFsaXplIHRoZQorICAgICAg
ICAgICAgICBjcmVhdGVkIHRocmVhZCdzIG5hbWUuICBUaGUgdW5kZXJseWluZyBtZWNoYW5pc20g
Zm9yIHNldHRpbmcgdGhlIHRocmVhZCBuYW1lIGlzIHBsYXRmb3JtCisgICAgICAgICAgICAgIHNw
ZWNpZmljIGFueXdheS4gIFRoZXJlJ3Mgbm8gcmVhc29uIHdoeSB3ZSBjYW4ndCBqdXN0IHBhc3Mg
dGhlIG5hbWUgZG93biB0byBjcmVhdGVUaHJlYWRJbnRlcm5hbCgpCisgICAgICAgICAgICAgIGFu
ZCBoYXZlIHRoZSBzcGVjaWZpYyBwbGF0Zm9ybSBpbXBsZW1lbnRhdGlvbiB0YWtlIGNhcmUgb2Yg
aXQuIAorCisgICAgICAgIFRoaXMgaXMgYSBsb3Qgb2YgbWFsbG9jL2ZyZWVzIGFuZCB3cmFwcGlu
ZyBhbmQgdW4td3JhcHBpbmdzLiAgQW5kIHRoZXJlIGFyZSAzIHJlcHJlc2VudGF0aW9ucyBvZiB0
aGUKKyAgICAgICAgdGhyZWFkIGVudHJ5IHBvaW50LiAgQWxzbywgLi4uCisKKyAgICAgICAgICAg
NS4gVGhlIFRocmVhZElkZW50aWZpZXIgb2YgdGhlIGNyZWF0ZWQgdGhyZWFkIGlzIGNvbXB1dGVk
IGFzIGZvbGxvd3M6CisgICAgICAgICAgICAgIGEuIFRoZSBjcmVhdGluZyB0aHJlYWQgbG9ja3Mg
YSBtdXRleC4KKyAgICAgICAgICAgICAgYi4gVGhlIGNyZWF0aW5nIHRocmVhZCBzdGFydHMgdGhl
IG5ldyB0aHJlYWQuCisgICAgICAgICAgICAgIGMuIFRoZSBuZXcgdGhyZWFkIGJsb2NrcyBvbiB0
aGUgbXV0ZXguCisgICAgICAgICAgICAgIGQuIFRoZSBjcmVhdGluZyB0aHJlYWQgZXN0YWJsaXNo
ZXMgdGhlIFRocmVhZElkZW50aWZpZXIgb2YgdGhlIG5ldyB0aHJlYWQuCisgICAgICAgICAgICAg
IGUuIFRoZSBjcmVhdGluZyB0aHJlYWQgdW5sb2NrcyB0aGUgbXV0ZXguCisgICAgICAgICAgICAg
IGYuIFRoZSBuZXcgdGhyZWFkIHVuYmxvY2tzIGFuZCBjYWNoZXMgdGhlIFRocmVhZElkZW50aWZp
ZXIgaW4gaXRzIHRocmVhZCBsb2NhbCBzdG9yYWdlLgorICAgICAgICAgICAgICBnLiBUaGUgbmV3
IHRocmVhZCByZWxlYXNlcyB0aGUgbXV0ZXggYW5kIG1vdmVzIG9uIHdpdGggbGlmZS4KKworICAg
ICAgICBUaGlzIGRvZXMgbm90IHdvcmsgd2hlbiB3ZSB3YW50IHRvIHVzZSBzdGQ6OnRocmVhZDo6
aWQgYXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIFRocmVhZElkZW50aWZpZXIgbGF0ZXIuCisgICAg
ICAgIFRoYXQgcmVxdWlyZXMgdGhlIFRocmVhZElkZW50aWZpZXIgdG8gYmUgZXN0YWJsaXNoZWQg
b24gdGhlIGNyZWF0ZWQgdGhyZWFkIGluc3RlYWQgYmVjYXVzZSB0aGVyZSBpcyBubworICAgICAg
ICB3YXkgc3RkOjp0aHJlYWQ6OmdldF9pZCgpIHRoYXQgY2FuIGJlIGludm9rZWQgb24gYSB0aHJl
YWQgdGhhdCBpcyBub3QgdGhlIGN1cnJlbnQgb25lLgorCisgICAgICAgIFdpdGggYWxsIHRoYXQg
aW4gbWluZCwgd2UgY2FuIHNpbXBsaWZ5IHRoZSB0aHJlYWQgY3JlYXRpb24gbWVjaGFuaXNtIGFz
IGZvbGxvd3M6CisKKyAgICAgICAgICAgMS4gT25seSBoYXZlIDEgd3JhcHBlciB0aHJlYWQgZW50
cnkgcG9pbnQgaW4gVGhyZWFkaW5nUHRocmVhZHMuY3BwIC8gVGhyZWFkaW5nV2luLmNwcC4KKyAg
ICAgICAgICAgICAgV2UnbGwgbmFtZSBpdCB0aHJlYWRFbnRyeVBvaW50KCkuCisKKyAgICAgICAg
ICAgMi4gT25seSBoYXZlIDIgd3JhcHBlciBkYXRhIHN0cnVjdHVyZXMgZm9yIHRocmVhZCBkYXRh
OgorICAgICAgICAgICAgICBhLiBjcmVhdGVUaHJlYWQoKSBjYW4gd3JhcCBlbnRyeVBvaW50IGFu
ZCBkYXRhIGluIGEgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGlmIG5lZWRlZC4KKyAgICAgICAgICAg
ICAgYi4gY3JlYXRlVGhyZWFkSW50ZXJuYWwoKSB3aWxsIHVzZSBhIHBsYXRmb3JtIHNwZWNpZmlj
IFRocmVhZERhdGEgc3RydWN0IHRoYXQgYWxsb3dzIHRoZSBjcmVhdGVkCisgICAgICAgICAgICAg
ICAgIHRocmVhZCB0byBwYXNzIGluaXRpYWxpemF0aW9uIGRhdGEgdG8gdGhlIGNyZWF0ZWQgdGhy
ZWFkLgorCisgICAgICAgICAgIDMuIFJlbW92ZSB1bm5lY2Vzc2FyeSBtYWxsb2NzOgorICAgICAg
ICAgICAgICBhLiBvd25lcnNoaXAgb2YgdGhlIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjbG9zdXJl
IGNvbnRpbnVlcyB0byBiZSBmb3J3YXJkZWQgKHVzaW5nIFdURjo6bW92ZSgpKSB0bworICAgICAg
ICAgICAgICAgICBhIGxvY2FsIGluIHRoZSBwbGF0Zm9ybSBzcGVjaWZpYyB0aHJlYWRFbnRyeVBv
aW50KCkgd2hlcmUgaXQgZ2V0cyBkZXN0cnVjdGVkIG9uIHJldHVybi4KKyAgICAgICAgICAgICAg
Yi4gVGhyZWFkRGF0YSB3aWxsIGJlIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2sgaW4gY3JlYXRlVGhy
ZWFkSW50ZXJuYWwoKS4gIEl0IGlzIG9ubHkgbmVlZGVkIHdoaWxlCisgICAgICAgICAgICAgICAg
IGNyZWF0aW5nIHRoZSBuZXcgdGhyZWFkIGFuZCBpdHMgbGlmZS1jeWNsZSBpcyBsb2NhbGl6ZWQg
dGhlcmUuCisKKyAgICAgICAgICAgNC4gV2Ugd2lsbCBhbHdheXMgY29tcHV0ZSB0aGUgVGhyZWFk
SWRlbnRpZmllciBpbiB0aGUgY3JlYXRlZCB0aHJlYWQgYW5kIHBhc3MgaXQgYmFjayB0byB0aGUg
Y3JlYXRpbmcKKyAgICAgICAgICAgICAgdGhyZWFkLgorCisgICAgICAgICAgIDUuIFRoZSBUaHJl
YWRJZGVudGlmaWVyIG9mIHRoZSBjcmVhdGUgdGhyZWFkIHdpbGwgYmUgY29tcHV0ZWQgb24gdGhl
IGNyZWF0ZWQgdGhyZWFkIGFzIGZvbGxvd3M6CisgICAgICAgICAgICAgIGEuIFRoZSBjcmVhdGlu
ZyB0aHJlYWQgbG9ja3MgYSBtdXRleC4KKyAgICAgICAgICAgICAgYi4gVGhlIGNyZWF0aW5nIHRo
cmVhZCBzdGFydHMgdGhlIG5ldyB0aHJlYWQuCisgICAgICAgICAgICAgIGMuIFRoZSBuZXcgdGhy
ZWFkIGJsb2NrcyBvbiB0aGUgbXV0ZXguCisgICAgICAgICAgICAgIGQuIFRoZSBjcmVhdGluZyB0
aHJlYWQgd2FpdHMgb24gYSBjb25kaXRpb24gdmFyaWFibGUgYW5kIHJlbGVhc2VzIHRoZSBtdXRl
eC4KKyAgICAgICAgICAgICAgZS4gVGhlIG5ldyB0aHJlYWQgdW5ibG9ja3MsIGFuZCBlc3RhYmxp
c2hlcyBpdHMgVGhyZWFkSWRlbnRpZmllciwgYW5kIHNldHMgaXQgaW4gdGhlIFRocmVhZERhdGEK
KyAgICAgICAgICAgICAgICAgc2hhcmVkIGZyb20gdGhlIGNyZWF0aW5nIHRocmVhZC4KKyAgICAg
ICAgICAgICAgZi4gVGhlIG5ldyB0aHJlYWQgbm90aWZpZXMgYWxsIHdhaXRpbmcgb24gdGhlIGNv
bmRpdGlvbiB2YXJpYWJsZSwgYW5kIHJlbGVhc2VzIHRoZSBtdXRleC4KKyAgICAgICAgICAgICAg
Zy4gVGhlIGNyZWF0aW5nIHRocmVhZCB3YWtlcyB1cCwgYW5kIHJldHJpZXZlcyB0aGUgVGhyZWFk
SWRlbnRpZmllciBmcm9tIHRoZSBUaHJlYWREYXRhLgorICAgICAgICAgICAgICBoLiBUaGUgY3Jl
YXRpbmcgdGhyZWFkIHJlbGVhc2VzIHRoZSBtdXRleCBhbmQgbW92ZXMgb24gd2l0aCBsaWZlLgor
CisgICAgICAgIE5vdGUgdGhhdCB0aGUgbGlmZS1jeWNsZSBvZiB0aGUgVGhyZWFkRGF0YSBzdHJ1
Y3QgaXMgbm93IGxpbWl0ZWQgdG8gdGhlIHNjb3BlIG9mIGNyZWF0ZVRocmVhZEludGVybmFsKCku
CisgICAgICAgIFRoZSBuZXcgdGhyZWFkJ3Mgbm90aWZpY2F0aW9uIHRvIHRoZSBjcmVhdGluZyB0
aHJlYWQgaXMgdGhlIHNpZ25hbCB0aGF0IGl0IGlzIGRvbmUgd2l0aCB0aHJlYWQgaW5pdGlhbGl6
YXRpb24uCisgICAgICAgIEhlbmNlLCB0aGUgVGhyZWFkSWRlbnRpZmllciBpcyBhdmFpbGFibGUg
YXQgdGhhdCB0aW1lLCBhbmQgdGhlIFRocmVhZERhdGEgc3RydWN0IG1heSBiZSByZWxlYXNlZCBi
eSB0aGUgY3JlYXRpbmcKKyAgICAgICAgdGhyZWFkLgorCisgICAgICAgICogd3RmL1RocmVhZEZ1
bmN0aW9uSW52b2NhdGlvbi5oOiBSZW1vdmVkLgorICAgICAgICAqIHd0Zi9UaHJlYWRpbmcuY3Bw
OgorICAgICAgICAoV1RGOjpjcmVhdGVUaHJlYWQpOgorICAgICAgICAoV1RGOjp0aHJlYWRFbnRy
eVBvaW50KTogRGVsZXRlZC4KKyAgICAgICAgKiB3dGYvVGhyZWFkaW5nLmg6CisgICAgICAgICog
d3RmL1RocmVhZGluZ1B0aHJlYWRzLmNwcDoKKyAgICAgICAgKFdURjo6cHRocmVhZEhhbmRsZUZv
cklkZW50aWZpZXJXaXRoTG9ja0FscmVhZHlIZWxkKToKKyAgICAgICAgKFdURjo6VGhyZWFkRGF0
YTo6VGhyZWFkRGF0YSk6CisgICAgICAgIChXVEY6OnRocmVhZEVudHJ5UG9pbnQpOgorICAgICAg
ICAoV1RGOjpjcmVhdGVUaHJlYWRJbnRlcm5hbCk6CisgICAgICAgIChXVEY6OmluaXRpYWxpemVD
dXJyZW50VGhyZWFkSW50ZXJuYWwpOgorICAgICAgICAoV1RGOjpjaGFuZ2VUaHJlYWRQcmlvcml0
eSk6CisgICAgICAgIChXVEY6Ond0ZlRocmVhZEVudHJ5UG9pbnQpOiBEZWxldGVkLgorICAgICAg
ICAqIHd0Zi9UaHJlYWRpbmdXaW4uY3BwOgorICAgICAgICAoV1RGOjpjbGVhclRocmVhZEhhbmRs
ZUZvcklkZW50aWZpZXIpOgorICAgICAgICAoV1RGOjpUaHJlYWREYXRhOjpUaHJlYWREYXRhKToK
KyAgICAgICAgKFdURjo6dGhyZWFkRW50cnlQb2ludCk6CisgICAgICAgIChXVEY6OmNyZWF0ZVRo
cmVhZEludGVybmFsKToKKyAgICAgICAgKFdURjo6d3RmVGhyZWFkRW50cnlQb2ludCk6IERlbGV0
ZWQuCisKIDIwMTUtMDctMjAgIE1hcmsgTGFtICA8bWFyay5sYW1AYXBwbGUuY29tPgogCiAgICAg
ICAgIFJvbGxvdXQgcjE4NzAyMCBhbmQgcjE4NzAyMTogYnJlYWtzIEpTQyBBUEkgdGVzdHMgb24g
ZGVidWcgYnVpbGRzLgpJbmRleDogU291cmNlL1dURi93dGYvVGhyZWFkRnVuY3Rpb25JbnZvY2F0
aW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dURi93dGYvVGhyZWFkRnVuY3Rpb25JbnZvY2F0
aW9uLmgJKHJldmlzaW9uIDE4NzExMCkKKysrIFNvdXJjZS9XVEYvd3RmL1RocmVhZEZ1bmN0aW9u
SW52b2NhdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBDb3B5
cmlnaHQgKEMpIDIwMDcsIDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoK
LSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuICBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAotICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4gCi0gKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAg
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4gCi0gKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBJbmMuICgi
QXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCi0gKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUg
dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAgIGZyb20g
dGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4g
Ci0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRS
SUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBUaHJl
YWRGdW5jdGlvbkludm9jYXRpb25faAotI2RlZmluZSBUaHJlYWRGdW5jdGlvbkludm9jYXRpb25f
aAotCi1uYW1lc3BhY2UgV1RGIHsKLQotdHlwZWRlZiB2b2lkICgqVGhyZWFkRnVuY3Rpb24pKHZv
aWQqIGFyZ3VtZW50KTsKLQotc3RydWN0IFRocmVhZEZ1bmN0aW9uSW52b2NhdGlvbiB7Ci0gICAg
V1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7Ci1wdWJsaWM6Ci0gICAgVGhyZWFkRnVuY3Rpb25JbnZv
Y2F0aW9uKFRocmVhZEZ1bmN0aW9uIGZ1bmN0aW9uLCB2b2lkKiBkYXRhKQotICAgICAgICA6IGZ1
bmN0aW9uKGZ1bmN0aW9uKQotICAgICAgICAsIGRhdGEoZGF0YSkKLSAgICB7Ci0gICAgfQotCi0g
ICAgVGhyZWFkRnVuY3Rpb24gZnVuY3Rpb247Ci0gICAgdm9pZCogZGF0YTsKLX07Ci0KLX0gLy8g
bmFtZXNwYWNlIFdURgotCi0jZW5kaWYgLy8gVGhyZWFkRnVuY3Rpb25JbnZvY2F0aW9uX2gKSW5k
ZXg6IFNvdXJjZS9XVEYvd3RmL1RocmVhZGluZy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dU
Ri93dGYvVGhyZWFkaW5nLmNwcAkocmV2aXNpb24gMTg3MTEwKQorKysgU291cmNlL1dURi93dGYv
VGhyZWFkaW5nLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzAsMzQgKzMwLDYgQEAKIAogbmFtZXNw
YWNlIFdURiB7CiAKLXN0cnVjdCBOZXdUaHJlYWRDb250ZXh0IHsKLSAgICBXVEZfTUFLRV9GQVNU
X0FMTE9DQVRFRDsKLXB1YmxpYzoKLSAgICBjb25zdCBjaGFyKiBuYW1lOwotICAgIHN0ZDo6ZnVu
Y3Rpb248dm9pZCgpPiBlbnRyeVBvaW50OwotICAgIE11dGV4IGNyZWF0aW9uTXV0ZXg7Ci19Owot
Ci1zdGF0aWMgdm9pZCB0aHJlYWRFbnRyeVBvaW50KHZvaWQqIGNvbnRleHREYXRhKQotewotICAg
IE5ld1RocmVhZENvbnRleHQqIGNvbnRleHQgPSBzdGF0aWNfY2FzdDxOZXdUaHJlYWRDb250ZXh0
Kj4oY29udGV4dERhdGEpOwotCi0gICAgLy8gQmxvY2sgdW50aWwgb3VyIGNyZWF0aW5nIHRocmVh
ZCBoYXMgY29tcGxldGVkIGFueSBleHRyYSBzZXR1cCB3b3JrLCBpbmNsdWRpbmcKLSAgICAvLyBl
c3RhYmxpc2hpbmcgVGhyZWFkSWRlbnRpZmllci4KLSAgICB7Ci0gICAgICAgIE11dGV4TG9ja2Vy
IGxvY2tlcihjb250ZXh0LT5jcmVhdGlvbk11dGV4KTsKLSAgICB9Ci0KLSAgICBpbml0aWFsaXpl
Q3VycmVudFRocmVhZEludGVybmFsKGNvbnRleHQtPm5hbWUpOwotCi0gICAgYXV0byBlbnRyeVBv
aW50ID0gV1RGOjptb3ZlKGNvbnRleHQtPmVudHJ5UG9pbnQpOwotCi0gICAgLy8gRGVsZXRlIHRo
ZSBjb250ZXh0IGJlZm9yZSBzdGFydGluZyB0aGUgdGhyZWFkLgotICAgIGRlbGV0ZSBjb250ZXh0
OwotCi0gICAgZW50cnlQb2ludCgpOwotfQotCiBUaHJlYWRJZGVudGlmaWVyIGNyZWF0ZVRocmVh
ZChjb25zdCBjaGFyKiBuYW1lLCBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gZW50cnlQb2ludCkKIHsK
ICAgICAvLyBWaXN1YWwgU3R1ZGlvIGhhcyBhIDMxLWNoYXJhY3RlciBsaW1pdCBvbiB0aHJlYWQg
bmFtZXMuIExvbmdlciBuYW1lcyB3aWxsCkBAIC02NiwxMyArMzgsNyBAQCBUaHJlYWRJZGVudGlm
aWVyIGNyZWF0ZVRocmVhZChjb25zdCBjaGFyCiAgICAgaWYgKG5hbWUgJiYgc3RybGVuKG5hbWUp
ID4gMzEpCiAgICAgICAgIExPR19FUlJPUigiVGhyZWFkIG5hbWUgXCIlc1wiIGlzIGxvbmdlciB0
aGFuIDMxIGNoYXJhY3RlcnMgYW5kIHdpbGwgYmUgdHJ1bmNhdGVkIGJ5IFZpc3VhbCBTdHVkaW8i
LCBuYW1lKTsKICNlbmRpZgotCi0gICAgTmV3VGhyZWFkQ29udGV4dCogY29udGV4dCA9IG5ldyBO
ZXdUaHJlYWRDb250ZXh0IHsgbmFtZSwgV1RGOjptb3ZlKGVudHJ5UG9pbnQpLCB7IH0gfTsKLQot
ICAgIC8vIFByZXZlbnQgdGhlIHRocmVhZCBib2R5IGZyb20gZXhlY3V0aW5nIHVudGlsIHdlJ3Zl
IGVzdGFibGlzaGVkIHRoZSB0aHJlYWQgaWRlbnRpZmllci4KLSAgICBNdXRleExvY2tlciBsb2Nr
ZXIoY29udGV4dC0+Y3JlYXRpb25NdXRleCk7Ci0KLSAgICByZXR1cm4gY3JlYXRlVGhyZWFkSW50
ZXJuYWwodGhyZWFkRW50cnlQb2ludCwgY29udGV4dCwgbmFtZSk7CisgICAgcmV0dXJuIGNyZWF0
ZVRocmVhZEludGVybmFsKFdURjo6bW92ZShlbnRyeVBvaW50KSwgbmFtZSk7CiB9CiAKIFRocmVh
ZElkZW50aWZpZXIgY3JlYXRlVGhyZWFkKFRocmVhZEZ1bmN0aW9uIGVudHJ5UG9pbnQsIHZvaWQq
IGRhdGEsIGNvbnN0IGNoYXIqIG5hbWUpCkluZGV4OiBTb3VyY2UvV1RGL3d0Zi9UaHJlYWRpbmcu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL3d0Zi9UaHJlYWRpbmcuaAkocmV2aXNpb24gMTg3
MTEwKQorKysgU291cmNlL1dURi93dGYvVGhyZWFkaW5nLmgJKHdvcmtpbmcgY29weSkKQEAgLTcw
LDcgKzcwLDcgQEAgV1RGX0VYUE9SVF9QUklWQVRFIHZvaWQgZGV0YWNoVGhyZWFkKFRocgogV1RG
X0VYUE9SVF9QUklWQVRFIFRocmVhZElkZW50aWZpZXIgY3JlYXRlVGhyZWFkKFRocmVhZEZ1bmN0
aW9uLCB2b2lkKiwgY29uc3QgY2hhciogdGhyZWFkTmFtZSk7CiAKIC8vIEludGVybmFsIHBsYXRm
b3JtLXNwZWNpZmljIGNyZWF0ZVRocmVhZCBpbXBsZW1lbnRhdGlvbi4KLVRocmVhZElkZW50aWZp
ZXIgY3JlYXRlVGhyZWFkSW50ZXJuYWwoVGhyZWFkRnVuY3Rpb24sIHZvaWQqLCBjb25zdCBjaGFy
KiB0aHJlYWROYW1lKTsKK1RocmVhZElkZW50aWZpZXIgY3JlYXRlVGhyZWFkSW50ZXJuYWwoc3Rk
OjpmdW5jdGlvbjx2b2lkKCk+LCBjb25zdCBjaGFyKiB0aHJlYWROYW1lKTsKIAogLy8gQ2FsbGVk
IGluIHRoZSB0aHJlYWQgZHVyaW5nIGluaXRpYWxpemF0aW9uLgogLy8gSGVscGZ1bCBmb3IgcGxh
dGZvcm1zIHdoZXJlIHRoZSB0aHJlYWQgbmFtZSBtdXN0IGJlIHNldCBmcm9tIHdpdGhpbiB0aGUg
dGhyZWFkLgpJbmRleDogU291cmNlL1dURi93dGYvVGhyZWFkaW5nUHRocmVhZHMuY3BwCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9XVEYvd3RmL1RocmVhZGluZ1B0aHJlYWRzLmNwcAkocmV2aXNpb24g
MTg3MTEwKQorKysgU291cmNlL1dURi93dGYvVGhyZWFkaW5nUHRocmVhZHMuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC00MSwxMyArNDEsMTMgQEAKICNpbmNsdWRlICJSYW5kb21OdW1iZXJTZWVkLmgi
CiAjaW5jbHVkZSAiU3RhY2tTdGF0cy5oIgogI2luY2x1ZGUgIlN0ZExpYkV4dHJhcy5oIgotI2lu
Y2x1ZGUgIlRocmVhZEZ1bmN0aW9uSW52b2NhdGlvbi5oIgogI2luY2x1ZGUgIlRocmVhZElkZW50
aWZpZXJEYXRhUHRocmVhZHMuaCIKICNpbmNsdWRlICJUaHJlYWRTcGVjaWZpYy5oIgorI2luY2x1
ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHd0
Zi9EYXRhTG9nLmg+CiAjaW5jbHVkZSA8d3RmL1Jhd1BvaW50ZXIuaD4KICNpbmNsdWRlIDx3dGYv
V1RGVGhyZWFkRGF0YS5oPgotI2luY2x1ZGUgPGVycm5vLmg+CiAKICNpZiAhQ09NUElMRVIoTVNW
QykKICNpbmNsdWRlIDxsaW1pdHMuaD4KQEAgLTEzNiw2ICsxMzYsNyBAQCBzdGF0aWMgVGhyZWFk
TWFwJiB0aHJlYWRNYXAoKQogICAgIHJldHVybiBtYXA7CiB9CiAKKyNpZiAhZGVmaW5lZChOREVC
VUcpCiBzdGF0aWMgVGhyZWFkSWRlbnRpZmllciBpZGVudGlmaWVyQnlQdGhyZWFkSGFuZGxlKGNv
bnN0IHB0aHJlYWRfdCYgcHRocmVhZEhhbmRsZSkKIHsKICAgICBNdXRleExvY2tlciBsb2NrZXIo
dGhyZWFkTWFwTXV0ZXgoKSk7CkBAIC0xNDgsNiArMTQ5LDcgQEAgc3RhdGljIFRocmVhZElkZW50
aWZpZXIgaWRlbnRpZmllckJ5UHRocgogCiAgICAgcmV0dXJuIDA7CiB9CisjZW5kaWYKIAogc3Rh
dGljIFRocmVhZElkZW50aWZpZXIgZXN0YWJsaXNoSWRlbnRpZmllckZvclB0aHJlYWRIYW5kbGUo
Y29uc3QgcHRocmVhZF90JiBwdGhyZWFkSGFuZGxlKQogewpAQCAtMTYzLDM1ICsxNjUsNjYgQEAg
c3RhdGljIHB0aHJlYWRfdCBwdGhyZWFkSGFuZGxlRm9ySWRlbnRpZgogICAgIHJldHVybiB0aHJl
YWRNYXAoKS5nZXQoaWQpLT5wdGhyZWFkSGFuZGxlKCk7CiB9CiAKLXN0YXRpYyB2b2lkKiB3dGZU
aHJlYWRFbnRyeVBvaW50KHZvaWQqIHBhcmFtKQorc3RydWN0IFRocmVhZERhdGEgeworICAgIFRo
cmVhZERhdGEoc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGVudHJ5UG9pbnQsIGNvbnN0IGNoYXIqIG5h
bWUpCisgICAgICAgIDogZW50cnlQb2ludChXVEY6Om1vdmUoZW50cnlQb2ludCkpCisgICAgICAg
ICwgbmFtZShuYW1lKQorICAgIHsKKyAgICB9CisKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4g
ZW50cnlQb2ludDsKKyAgICBjb25zdCBjaGFyKiBuYW1lOworCisgICAgc3RkOjptdXRleCBtdXRl
eDsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBjb25kaXRpb25WYXJpYWJsZTsKKyAgICB2
b2xhdGlsZSBUaHJlYWRJZGVudGlmaWVyIGlkIHsgMCB9OworfTsKKworc3RhdGljIHZvaWQqIHRo
cmVhZEVudHJ5UG9pbnQodm9pZCogcGFyYW0pCiB7Ci0gICAgLy8gQmFsYW5jZWQgYnkgLmxlYWtQ
dHIoKSBpbiBjcmVhdGVUaHJlYWRJbnRlcm5hbC4KLSAgICBhdXRvIGludm9jYXRpb24gPSBzdGQ6
OnVuaXF1ZV9wdHI8VGhyZWFkRnVuY3Rpb25JbnZvY2F0aW9uPihzdGF0aWNfY2FzdDxUaHJlYWRG
dW5jdGlvbkludm9jYXRpb24qPihwYXJhbSkpOwotICAgIGludm9jYXRpb24tPmZ1bmN0aW9uKGlu
dm9jYXRpb24tPmRhdGEpOworICAgIC8vIFRoZSBjb250ZW50cyBvZiB0aGUgVGhyZWFkRGF0YSBp
cyBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgdmFsaWQgYmVmb3JlIHdlIHNpZ25hbCB0aGUgY3JlYXRp
bmcKKyAgICAvLyB0aHJlYWQgYmVsb3cuIFRoZSBzaWduYWxpbmcgdGVsbHMgdGhlIGNyZWF0aW5n
IHRocmVhZCB0aGF0IHdlJ3JlIGRvbmUgaW5pdGlhbGl6aW5nIGFuZCBpbXBsaWVzCisgICAgLy8g
dGhhdCBpdCBtYXkgZGlzcG9zZSBvZiB0aGUgVGhyZWFkRGF0YS4gSGVuY2UsIHdlIHNob3VsZCBn
cmFiIHRoZSBpbmZvIHdlIG5lZWQgb3V0IG9mIGl0CisgICAgLy8gYmVmb3JlIHRoZW4uCisgICAg
YXV0byBkYXRhID0gc3RhdGljX2Nhc3Q8VGhyZWFkRGF0YSo+KHBhcmFtKTsKKyAgICBzdGQ6OmZ1
bmN0aW9uPHZvaWQoKT4gZW50cnlQb2ludCA9IFdURjo6bW92ZShkYXRhLT5lbnRyeVBvaW50KTsK
KyAgICBjb25zdCBjaGFyKiBuYW1lID0gZGF0YS0+bmFtZTsKKworICAgIHsKKyAgICAgICAgc3Rk
Ojpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2tlcihkYXRhLT5tdXRleCk7CisgICAgICAgIGRh
dGEtPmlkID0gY3VycmVudFRocmVhZCgpOworICAgICAgICBkYXRhLT5jb25kaXRpb25WYXJpYWJs
ZS5ub3RpZnlfYWxsKCk7CisgICAgfQorCisgICAgaW5pdGlhbGl6ZUN1cnJlbnRUaHJlYWRJbnRl
cm5hbChuYW1lKTsKKyAgICBlbnRyeVBvaW50KCk7CisgICAgCiAgICAgcmV0dXJuIG51bGxwdHI7
CiB9CiAKLVRocmVhZElkZW50aWZpZXIgY3JlYXRlVGhyZWFkSW50ZXJuYWwoVGhyZWFkRnVuY3Rp
b24gZW50cnlQb2ludCwgdm9pZCogZGF0YSwgY29uc3QgY2hhciopCitUaHJlYWRJZGVudGlmaWVy
IGNyZWF0ZVRocmVhZEludGVybmFsKHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBlbnRyeVBvaW50LCBj
b25zdCBjaGFyKiBuYW1lKQogewotICAgIGF1dG8gaW52b2NhdGlvbiA9IHN0ZDo6bWFrZV91bmlx
dWU8VGhyZWFkRnVuY3Rpb25JbnZvY2F0aW9uPihlbnRyeVBvaW50LCBkYXRhKTsKKyAgICBUaHJl
YWREYXRhIGRhdGEoV1RGOjptb3ZlKGVudHJ5UG9pbnQpLCBuYW1lKTsKKyAgICBzdGQ6OnVuaXF1
ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soZGF0YS5tdXRleCk7CisKICAgICBwdGhyZWFkX3QgdGhy
ZWFkSGFuZGxlOwogICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CiAgICAgcHRocmVhZF9hdHRyX2lu
aXQoJmF0dHIpOwogI2lmIEhBVkUoUU9TX0NMQVNTRVMpCiAgICAgcHRocmVhZF9hdHRyX3NldF9x
b3NfY2xhc3NfbnAoJmF0dHIsIFFPU19DTEFTU19VU0VSX0lOSVRJQVRFRCwgMCk7CiAjZW5kaWYK
LSAgICBpbnQgZXJyb3IgPSBwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkSGFuZGxlLCAmYXR0ciwgd3Rm
VGhyZWFkRW50cnlQb2ludCwgaW52b2NhdGlvbi5nZXQoKSk7CisKKyAgICBpbnQgZXJyb3IgPSBw
dGhyZWFkX2NyZWF0ZSgmdGhyZWFkSGFuZGxlLCAmYXR0ciwgdGhyZWFkRW50cnlQb2ludCwgJmRh
dGEpOwogICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRyKTsKICAgICBpZiAoZXJyb3IpIHsK
LSAgICAgICAgTE9HX0VSUk9SKCJGYWlsZWQgdG8gY3JlYXRlIHB0aHJlYWQgYXQgZW50cnkgcG9p
bnQgJXAgd2l0aCBkYXRhICVwIiwgd3RmVGhyZWFkRW50cnlQb2ludCwgaW52b2NhdGlvbi5nZXQo
KSk7CisgICAgICAgIExPR19FUlJPUigiRmFpbGVkIHRvIGNyZWF0ZSBwdGhyZWFkIGF0IGVudHJ5
IHBvaW50ICVwIHdpdGggZGF0YSAlcCIsIHRocmVhZEVudHJ5UG9pbnQsICZkYXRhKTsKICAgICAg
ICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgLy8gQmFsYW5jZWQgYnkgc3RkOjp1bmlxdWVfcHRy
IGNvbnN0cnVjdG9yIGluIHd0ZlRocmVhZEVudHJ5UG9pbnQuCi0gICAgVGhyZWFkRnVuY3Rpb25J
bnZvY2F0aW9uKiBsZWFrZWRJbnZvY2F0aW9uID0gaW52b2NhdGlvbi5yZWxlYXNlKCk7Ci0gICAg
VU5VU0VEX1BBUkFNKGxlYWtlZEludm9jYXRpb24pOwotCi0gICAgcmV0dXJuIGVzdGFibGlzaElk
ZW50aWZpZXJGb3JQdGhyZWFkSGFuZGxlKHRocmVhZEhhbmRsZSk7CisgICAgd2hpbGUgKCFkYXRh
LmlkKQorICAgICAgICBkYXRhLmNvbmRpdGlvblZhcmlhYmxlLndhaXQobG9jayk7CisgICAgQVNT
RVJUKGRhdGEuaWQpOworICAgIHJldHVybiBkYXRhLmlkOwogfQogCiB2b2lkIGluaXRpYWxpemVD
dXJyZW50VGhyZWFkSW50ZXJuYWwoY29uc3QgY2hhciogdGhyZWFkTmFtZSkKQEAgLTIwNywxMCAr
MjQwLDYgQEAgdm9pZCBpbml0aWFsaXplQ3VycmVudFRocmVhZEludGVybmFsKGNvbgogICAgIC8v
IGdhcmJhZ2UgY29sbGVjdG9yIGluIGNhc2UgQVBJIGltcGxlbWVudGF0aW9ucyB1c2UgZ2FyYmFn
ZS1jb2xsZWN0ZWQgbWVtb3J5LgogICAgIG9iamNfcmVnaXN0ZXJUaHJlYWRXaXRoQ29sbGVjdG9y
KCk7CiAjZW5kaWYKLQotICAgIFRocmVhZElkZW50aWZpZXIgaWQgPSBpZGVudGlmaWVyQnlQdGhy
ZWFkSGFuZGxlKHB0aHJlYWRfc2VsZigpKTsKLSAgICBBU1NFUlQoaWQpOwotICAgIFRocmVhZElk
ZW50aWZpZXJEYXRhOjppbml0aWFsaXplKGlkKTsKIH0KICAgICAKIHZvaWQgY2hhbmdlVGhyZWFk
UHJpb3JpdHkoVGhyZWFkSWRlbnRpZmllciB0aHJlYWRJRCwgaW50IGRlbHRhKQpJbmRleDogU291
cmNlL1dURi93dGYvVGhyZWFkaW5nV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL3d0
Zi9UaHJlYWRpbmdXaW4uY3BwCShyZXZpc2lvbiAxODcxMTApCisrKyBTb3VyY2UvV1RGL3d0Zi9U
aHJlYWRpbmdXaW4uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC05Myw3ICs5Myw3IEBACiAjaW5jbHVk
ZSAiZHRvYS9jYWNoZWQtcG93ZXJzLmgiCiAKICNpbmNsdWRlICJNYWluVGhyZWFkLmgiCi0jaW5j
bHVkZSAiVGhyZWFkRnVuY3Rpb25JbnZvY2F0aW9uLmgiCisjaW5jbHVkZSA8Y29uZGl0aW9uX3Zh
cmlhYmxlPgogI2luY2x1ZGUgPHByb2Nlc3MuaD4KICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAjaW5j
bHVkZSA8d3RmL0N1cnJlbnRUaW1lLmg+CkBAIC0xOTUsMTAgKzE5NSw0NSBAQCBzdGF0aWMgdm9p
ZCBjbGVhclRocmVhZEhhbmRsZUZvcklkZW50aWZpCiAgICAgdGhyZWFkTWFwKCkucmVtb3ZlKGlk
KTsKIH0KIAotc3RhdGljIHVuc2lnbmVkIF9fc3RkY2FsbCB3dGZUaHJlYWRFbnRyeVBvaW50KHZv
aWQqIHBhcmFtKQorc3RydWN0IFRocmVhZERhdGEgeworICAgIFRocmVhZERhdGEoc3RkOjpmdW5j
dGlvbjx2b2lkKCk+IGVudHJ5UG9pbnQsIGNvbnN0IGNoYXIqIG5hbWUpCisgICAgICAgIDogZW50
cnlQb2ludChXVEY6Om1vdmUoZW50cnlQb2ludCkpCisgICAgICAgICwgbmFtZShuYW1lKQorICAg
IHsKKyAgICB9CisgICAgCisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGVudHJ5UG9pbnQ7Cisg
ICAgY29uc3QgY2hhciogbmFtZTsKKyAgICAKKyAgICBzdGQ6Om11dGV4IG11dGV4OworICAgIHN0
ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIGNvbmRpdGlvblZhcmlhYmxlOworICAgIGJvb2wgZG9uZSB7
IGZhbHNlIH07CisjaWYgIWRlZmluZWQoTkRFQlVHKQorICAgIHZvbGF0aWxlIFRocmVhZElkZW50
aWZpZXIgaWQgeyAwIH07CisjZW5kaWYKK307CisKK3N0YXRpYyB1bnNpZ25lZCBfX3N0ZGNhbGwg
dGhyZWFkRW50cnlQb2ludCh2b2lkKiBwYXJhbSkKIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8VGhy
ZWFkRnVuY3Rpb25JbnZvY2F0aW9uPiBpbnZvY2F0aW9uKHN0YXRpY19jYXN0PFRocmVhZEZ1bmN0
aW9uSW52b2NhdGlvbio+KHBhcmFtKSk7Ci0gICAgaW52b2NhdGlvbi0+ZnVuY3Rpb24oaW52b2Nh
dGlvbi0+ZGF0YSk7CisgICAgLy8gVGhlIGNvbnRlbnRzIG9mIHRoZSBUaHJlYWREYXRhIGlzIG9u
bHkgZ3VhcmFudGVlZCB0byBiZSB2YWxpZCBiZWZvcmUgd2Ugc2lnbmFsIHRoZSBjcmVhdGluZwor
ICAgIC8vIHRocmVhZCBiZWxvdy4gVGhlIHNpZ25hbGluZyB0ZWxscyB0aGUgY3JlYXRpbmcgdGhy
ZWFkIHRoYXQgd2UncmUgZG9uZSBpbml0aWFsaXppbmcgYW5kIGltcGxpZXMKKyAgICAvLyB0aGF0
IGl0IG1heSBkaXNwb3NlIG9mIHRoZSBUaHJlYWREYXRhLiBIZW5jZSwgd2Ugc2hvdWxkIGdyYWIg
dGhlIGluZm8gd2UgbmVlZCBvdXQgb2YgaXQKKyAgICAvLyBiZWZvcmUgdGhlbi4KKyAgICBhdXRv
IGRhdGEgPSBzdGF0aWNfY2FzdDxUaHJlYWREYXRhKj4ocGFyYW0pOworICAgIHN0ZDo6ZnVuY3Rp
b248dm9pZCgpPiBlbnRyeVBvaW50ID0gV1RGOjptb3ZlKGRhdGEtPmVudHJ5UG9pbnQpOworICAg
IGNvbnN0IGNoYXIqIG5hbWUgPSBkYXRhLT5uYW1lOworCisgICAgeworICAgICAgICBzdGQ6Omxv
Y2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9ja2VyKGRhdGEtPm11dGV4KTsKKyNpZiAhZGVmaW5lZChO
REVCVUcpCisgICAgICAgIGRhdGEtPmlkID0gY3VycmVudFRocmVhZCgpOworI2VuZGlmCisgICAg
ICAgIGRhdGEtPmRvbmUgPSB0cnVlOworICAgICAgICBkYXRhLT5jb25kaXRpb25WYXJpYWJsZS5u
b3RpZnlfYWxsKCk7CisgICAgfQorCisgICAgaW5pdGlhbGl6ZUN1cnJlbnRUaHJlYWRJbnRlcm5h
bChuYW1lKTsKKyAgICBlbnRyeVBvaW50KCk7CiAKICNpZiAhVVNFKFBUSFJFQURTKSAmJiBPUyhX
SU5ET1dTKQogICAgIC8vIERvIHRoZSBUTFMgY2xlYW51cC4KQEAgLTIwOCwyNyArMjQzLDMxIEBA
IHN0YXRpYyB1bnNpZ25lZCBfX3N0ZGNhbGwgd3RmVGhyZWFkRW50cnkKICAgICByZXR1cm4gMDsK
IH0KIAotVGhyZWFkSWRlbnRpZmllciBjcmVhdGVUaHJlYWRJbnRlcm5hbChUaHJlYWRGdW5jdGlv
biBlbnRyeVBvaW50LCB2b2lkKiBkYXRhLCBjb25zdCBjaGFyKiB0aHJlYWROYW1lKQorVGhyZWFk
SWRlbnRpZmllciBjcmVhdGVUaHJlYWRJbnRlcm5hbChzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gZW50
cnlQb2ludCwgY29uc3QgY2hhciogbmFtZSkKIHsKKyAgICBUaHJlYWREYXRhIGRhdGEoV1RGOjpt
b3ZlKGVudHJ5UG9pbnQpLCBuYW1lKTsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+
IGxvY2soZGF0YS5tdXRleCk7CisKICAgICB1bnNpZ25lZCB0aHJlYWRJZGVudGlmaWVyID0gMDsK
ICAgICBUaHJlYWRJZGVudGlmaWVyIHRocmVhZElEID0gMDsKLSAgICBhdXRvIGludm9jYXRpb24g
PSBzdGQ6Om1ha2VfdW5pcXVlPFRocmVhZEZ1bmN0aW9uSW52b2NhdGlvbj4oZW50cnlQb2ludCwg
ZGF0YSk7Ci0gICAgSEFORExFIHRocmVhZEhhbmRsZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8SEFORExF
PihfYmVnaW50aHJlYWRleCgwLCAwLCB3dGZUaHJlYWRFbnRyeVBvaW50LCBpbnZvY2F0aW9uLmdl
dCgpLCAwLCAmdGhyZWFkSWRlbnRpZmllcikpOworICAgIEhBTkRMRSB0aHJlYWRIYW5kbGUgPSBy
ZWludGVycHJldF9jYXN0PEhBTkRMRT4oX2JlZ2ludGhyZWFkZXgoMCwgMCwgdGhyZWFkRW50cnlQ
b2ludCwgaW52b2NhdGlvbi5nZXQoKSwgMCwgJnRocmVhZElkZW50aWZpZXIpKTsKICAgICBpZiAo
IXRocmVhZEhhbmRsZSkgewogI2lmICFIQVZFKEVSUk5PX0gpCi0gICAgICAgIExPR19FUlJPUigi
RmFpbGVkIHRvIGNyZWF0ZSB0aHJlYWQgYXQgZW50cnkgcG9pbnQgJXAgd2l0aCBkYXRhICVwLiIs
IGVudHJ5UG9pbnQsIGRhdGEpOworICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBjcmVhdGUg
dGhyZWFkIGF0IGVudHJ5IHBvaW50ICVwIHdpdGggZGF0YSAlcC4iLCBlbnRyeVBvaW50LCAmZGF0
YSk7CiAjZWxzZQotICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBjcmVhdGUgdGhyZWFkIGF0
IGVudHJ5IHBvaW50ICVwIHdpdGggZGF0YSAlcDogJWxkIiwgZW50cnlQb2ludCwgZGF0YSwgZXJy
bm8pOworICAgICAgICBMT0dfRVJST1IoIkZhaWxlZCB0byBjcmVhdGUgdGhyZWFkIGF0IGVudHJ5
IHBvaW50ICVwIHdpdGggZGF0YSAlcDogJWxkIiwgZW50cnlQb2ludCwgJmRhdGEsIGVycm5vKTsK
ICNlbmRpZgogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICAvLyBUaGUgdGhyZWFkIHdp
bGwgdGFrZSBvd25lcnNoaXAgb2YgaW52b2NhdGlvbi4KLSAgICBUaHJlYWRGdW5jdGlvbkludm9j
YXRpb24qIGxlYWtlZEludm9jYXRpb24gPSBpbnZvY2F0aW9uLnJlbGVhc2UoKTsKLSAgICBVTlVT
RURfUEFSQU0obGVha2VkSW52b2NhdGlvbik7CisgICAgd2hpbGUgKCFkYXRhLmRvbmUpCisgICAg
ICAgIGRhdGEuY29uZGl0aW9uVmFyaWFibGUud2FpdChsb2NrKTsKIAogICAgIHRocmVhZElEID0g
c3RhdGljX2Nhc3Q8VGhyZWFkSWRlbnRpZmllcj4odGhyZWFkSWRlbnRpZmllcik7CiAgICAgc3Rv
cmVUaHJlYWRIYW5kbGVCeUlkZW50aWZpZXIodGhyZWFkSWRlbnRpZmllciwgdGhyZWFkSGFuZGxl
KTsKKyNpZiAhZGVmaW5lZChOREVCVUcpCisgICAgQVNTRVJUKHRocmVhZElEID09IGRhdGEuaWQp
OworI2VuZGlmCiAKICAgICByZXR1cm4gdGhyZWFkSUQ7CiB9Cg==
</data>
<flag name="review"
          id="282444"
          type_id="1"
          status="-"
          setter="ggaren"
    />
          </attachment>
      

    </bug>

</bugzilla>