<?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>227778</bug_id>
          
          <creation_ts>2021-07-07 16:20:07 -0700</creation_ts>
          <short_desc>Do not abort ongoing IDB transaction synchronously on non-imminent PrepareToSuspend message</short_desc>
          <delta_ts>2021-07-15 15:45:33 -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>WebKit Misc.</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Sihui Liu">sihui_liu</reporter>
          <assigned_to name="Sihui Liu">sihui_liu</assigned_to>
          <cc>alecflett</cc>
    
    <cc>beidson</cc>
    
    <cc>cdumez</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>ggaren</cc>
    
    <cc>jsbell</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1775516</commentid>
    <comment_count>0</comment_count>
    <who name="Sihui Liu">sihui_liu</who>
    <bug_when>2021-07-07 16:20:07 -0700</bug_when>
    <thetext>...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1775522</commentid>
    <comment_count>1</comment_count>
      <attachid>433092</attachid>
    <who name="Sihui Liu">sihui_liu</who>
    <bug_when>2021-07-07 16:43:10 -0700</bug_when>
    <thetext>Created attachment 433092
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1775603</commentid>
    <comment_count>2</comment_count>
      <attachid>433116</attachid>
    <who name="Sihui Liu">sihui_liu</who>
    <bug_when>2021-07-07 21:40:47 -0700</bug_when>
    <thetext>Created attachment 433116
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1775668</commentid>
    <comment_count>3</comment_count>
      <attachid>433116</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-07-08 08:14:58 -0700</bug_when>
    <thetext>Comment on attachment 433116
Patch

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

&gt; Source/WebKit/NetworkProcess/NetworkProcess.cpp:-2219
&gt; -    for (auto&amp; server : m_webIDBServers.values())

Not suspending the IDB thread in PrepareToSuspend seems like a big no-no.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1775669</commentid>
    <comment_count>4</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-07-08 08:16:32 -0700</bug_when>
    <thetext>(In reply to Chris Dumez from comment #3)
&gt; Comment on attachment 433116 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=433116&amp;action=review
&gt; 
&gt; &gt; Source/WebKit/NetworkProcess/NetworkProcess.cpp:-2219
&gt; &gt; -    for (auto&amp; server : m_webIDBServers.values())
&gt; 
&gt; Not suspending the IDB thread in PrepareToSuspend seems like a big no-no.

To repeat what I said last week, I think we should schedule a task to suspend / hang the thread in PrepareToSuspend and abort any pending transaction when the assertion gets invalidated.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1775671</commentid>
    <comment_count>5</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-07-08 08:21:59 -0700</bug_when>
    <thetext>(In reply to Chris Dumez from comment #4)
&gt; (In reply to Chris Dumez from comment #3)
&gt; &gt; Comment on attachment 433116 [details]
&gt; &gt; Patch
&gt; &gt; 
&gt; &gt; View in context:
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=433116&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/WebKit/NetworkProcess/NetworkProcess.cpp:-2219
&gt; &gt; &gt; -    for (auto&amp; server : m_webIDBServers.values())
&gt; &gt; 
&gt; &gt; Not suspending the IDB thread in PrepareToSuspend seems like a big no-no.
&gt; 
&gt; To repeat what I said last week, I think we should schedule a task to
&gt; suspend / hang the thread in PrepareToSuspend and abort any pending
&gt; transaction when the assertion gets invalidated.

We want to suspend as soon as possible after the app has been backgrounded. When the app is backgrounded, it sends us the PrepareToSuspend IPC and we should stop doing any additional work (e.g. new IDB transactions) at this point that may delay suspension (due to the network process taking a process assertion).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1775691</commentid>
    <comment_count>6</comment_count>
    <who name="Sihui Liu">sihui_liu</who>
    <bug_when>2021-07-08 09:44:27 -0700</bug_when>
    <thetext>(In reply to Chris Dumez from comment #5)
&gt; (In reply to Chris Dumez from comment #4)
&gt; &gt; (In reply to Chris Dumez from comment #3)
&gt; &gt; &gt; Comment on attachment 433116 [details]
&gt; &gt; &gt; Patch
&gt; &gt; &gt; 
&gt; &gt; &gt; View in context:
&gt; &gt; &gt; https://bugs.webkit.org/attachment.cgi?id=433116&amp;action=review
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/WebKit/NetworkProcess/NetworkProcess.cpp:-2219
&gt; &gt; &gt; &gt; -    for (auto&amp; server : m_webIDBServers.values())
&gt; &gt; &gt; 
&gt; &gt; &gt; Not suspending the IDB thread in PrepareToSuspend seems like a big no-no.
&gt; &gt; 
&gt; &gt; To repeat what I said last week, I think we should schedule a task to
&gt; &gt; suspend / hang the thread in PrepareToSuspend and abort any pending
&gt; &gt; transaction when the assertion gets invalidated.
&gt; 
&gt; We want to suspend as soon as possible after the app has been backgrounded.
&gt; When the app is backgrounded, it sends us the PrepareToSuspend IPC and we
&gt; should stop doing any additional work (e.g. new IDB transactions) at this
&gt; point that may delay suspension (due to the network process taking a process
&gt; assertion).

With you proposed approach that network process receives PrepareToSuspend message and schedules a suspend task to IDB thread, there are 2 possible cases:

1. task runs before network process assertion is invalidated: thread is suspended in task and transactions are aborted in invalidation handler =&gt; why don&apos;t we just abort transactions in the task since nothing scheduled on the thread after the task can run after suspension? In this case, aborting earlier in the task also means network process can release the assertion sooner.

2. network process assertion is invalidated before task runs (maybe due to too many tasks scheduled on the thread), old transactions are aborted but thread is not suspended and new transaction can start =&gt; not fixing the crash

Both cases indicate that suspend the thread and abort transactions should happen in the same place. Either we do the preparation work in receiving prepareToSuspend message, or we do it in invalidation handler.

And this is how we suspend IDB: grab a lock to abort things on the main thread, and keep the lock until resume, which is synchronous, unlike the ITP or localstorage task.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1775693</commentid>
    <comment_count>7</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-07-08 09:50:48 -0700</bug_when>
    <thetext>(In reply to Sihui Liu from comment #6)
&gt; (In reply to Chris Dumez from comment #5)
&gt; &gt; (In reply to Chris Dumez from comment #4)
&gt; &gt; &gt; (In reply to Chris Dumez from comment #3)
&gt; &gt; &gt; &gt; Comment on attachment 433116 [details]
&gt; &gt; &gt; &gt; Patch
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; View in context:
&gt; &gt; &gt; &gt; https://bugs.webkit.org/attachment.cgi?id=433116&amp;action=review
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; Source/WebKit/NetworkProcess/NetworkProcess.cpp:-2219
&gt; &gt; &gt; &gt; &gt; -    for (auto&amp; server : m_webIDBServers.values())
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Not suspending the IDB thread in PrepareToSuspend seems like a big no-no.
&gt; &gt; &gt; 
&gt; &gt; &gt; To repeat what I said last week, I think we should schedule a task to
&gt; &gt; &gt; suspend / hang the thread in PrepareToSuspend and abort any pending
&gt; &gt; &gt; transaction when the assertion gets invalidated.
&gt; &gt; 
&gt; &gt; We want to suspend as soon as possible after the app has been backgrounded.
&gt; &gt; When the app is backgrounded, it sends us the PrepareToSuspend IPC and we
&gt; &gt; should stop doing any additional work (e.g. new IDB transactions) at this
&gt; &gt; point that may delay suspension (due to the network process taking a process
&gt; &gt; assertion).
&gt; 
&gt; With you proposed approach that network process receives PrepareToSuspend
&gt; message and schedules a suspend task to IDB thread, there are 2 possible
&gt; cases:
&gt; 
&gt; 1. task runs before network process assertion is invalidated: thread is
&gt; suspended in task and transactions are aborted in invalidation handler =&gt;
&gt; why don&apos;t we just abort transactions in the task since nothing scheduled on
&gt; the thread after the task can run after suspension? In this case, aborting
&gt; earlier in the task also means network process can release the assertion
&gt; sooner.

We want to avoid data loss as much as possible. We should only abort transactions when we&apos;re really about the get suspended. PrepareToSuspend indicates we should get ready to get suspended and thus stop scheduling new work. However, the network process is holding an assertion for whatever current SQLiteTransaction to finish.
It is best to let this already running transaction finish rather than abort it and potentially lose data. The whole point of taking an assertion is to let an operation finish before suspension.

&gt; 
&gt; 2. network process assertion is invalidated before task runs (maybe due to
&gt; too many tasks scheduled on the thread), old transactions are aborted but
&gt; thread is not suspended and new transaction can start =&gt; not fixing the crash

Right, when the assertion is invalidated, we should abort all existing tasks and make sure the thread is suspended (synchronously).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1775721</commentid>
    <comment_count>8</comment_count>
    <who name="Sihui Liu">sihui_liu</who>
    <bug_when>2021-07-08 10:49:01 -0700</bug_when>
    <thetext>(In reply to Chris Dumez from comment #7)
&gt; (In reply to Sihui Liu from comment #6)
&gt; &gt; (In reply to Chris Dumez from comment #5)
&gt; &gt; &gt; (In reply to Chris Dumez from comment #4)
&gt; &gt; &gt; &gt; (In reply to Chris Dumez from comment #3)
&gt; &gt; &gt; &gt; &gt; Comment on attachment 433116 [details]
&gt; &gt; &gt; &gt; &gt; Patch
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; View in context:
&gt; &gt; &gt; &gt; &gt; https://bugs.webkit.org/attachment.cgi?id=433116&amp;action=review
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; Source/WebKit/NetworkProcess/NetworkProcess.cpp:-2219
&gt; &gt; &gt; &gt; &gt; &gt; -    for (auto&amp; server : m_webIDBServers.values())
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; Not suspending the IDB thread in PrepareToSuspend seems like a big no-no.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; To repeat what I said last week, I think we should schedule a task to
&gt; &gt; &gt; &gt; suspend / hang the thread in PrepareToSuspend and abort any pending
&gt; &gt; &gt; &gt; transaction when the assertion gets invalidated.
&gt; &gt; &gt; 
&gt; &gt; &gt; We want to suspend as soon as possible after the app has been backgrounded.
&gt; &gt; &gt; When the app is backgrounded, it sends us the PrepareToSuspend IPC and we
&gt; &gt; &gt; should stop doing any additional work (e.g. new IDB transactions) at this
&gt; &gt; &gt; point that may delay suspension (due to the network process taking a process
&gt; &gt; &gt; assertion).
&gt; &gt; 
&gt; &gt; With you proposed approach that network process receives PrepareToSuspend
&gt; &gt; message and schedules a suspend task to IDB thread, there are 2 possible
&gt; &gt; cases:
&gt; &gt; 
&gt; &gt; 1. task runs before network process assertion is invalidated: thread is
&gt; &gt; suspended in task and transactions are aborted in invalidation handler =&gt;
&gt; &gt; why don&apos;t we just abort transactions in the task since nothing scheduled on
&gt; &gt; the thread after the task can run after suspension? In this case, aborting
&gt; &gt; earlier in the task also means network process can release the assertion
&gt; &gt; sooner.
&gt; 
&gt; We want to avoid data loss as much as possible. We should only abort
&gt; transactions when we&apos;re really about the get suspended. PrepareToSuspend
&gt; indicates we should get ready to get suspended and thus stop scheduling new
&gt; work. However, the network process is holding an assertion for whatever
&gt; current SQLiteTransaction to finish.
&gt; It is best to let this already running transaction finish rather than abort
&gt; it and potentially lose data. The whole point of taking an assertion is to
&gt; let an operation finish before suspension.

IDB&apos;s transactions are interleaving, so the task queue can be:
1. start transaction-1 
2. execute transaction-1 statement
3. start transaction-2
4. commit transaction-1
5. execute transaction-2 statement 
6. commit transaction-2
And the tasks are dispatched from IPC thread.

The async suspend task by PrepareToSuspend can be at any position of the queue, and aborting transaction in the invalidation handler will happen during the suspend task (if invalidation handler is called before ProcessDidResume). So I am not sure how scheduling async suspend task help avoid data loss. Can you give an example?

&gt; 
&gt; &gt; 
&gt; &gt; 2. network process assertion is invalidated before task runs (maybe due to
&gt; &gt; too many tasks scheduled on the thread), old transactions are aborted but
&gt; &gt; thread is not suspended and new transaction can start =&gt; not fixing the crash
&gt; 
&gt; Right, when the assertion is invalidated, we should abort all existing tasks
&gt; and make sure the thread is suspended (synchronously).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1775723</commentid>
    <comment_count>9</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-07-08 10:57:13 -0700</bug_when>
    <thetext>(In reply to Sihui Liu from comment #8)
&gt; (In reply to Chris Dumez from comment #7)
&gt; &gt; (In reply to Sihui Liu from comment #6)
&gt; &gt; &gt; (In reply to Chris Dumez from comment #5)
&gt; &gt; &gt; &gt; (In reply to Chris Dumez from comment #4)
&gt; &gt; &gt; &gt; &gt; (In reply to Chris Dumez from comment #3)
&gt; &gt; &gt; &gt; &gt; &gt; Comment on attachment 433116 [details]
&gt; &gt; &gt; &gt; &gt; &gt; Patch
&gt; &gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; View in context:
&gt; &gt; &gt; &gt; &gt; &gt; https://bugs.webkit.org/attachment.cgi?id=433116&amp;action=review
&gt; &gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; &gt; Source/WebKit/NetworkProcess/NetworkProcess.cpp:-2219
&gt; &gt; &gt; &gt; &gt; &gt; &gt; -    for (auto&amp; server : m_webIDBServers.values())
&gt; &gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; Not suspending the IDB thread in PrepareToSuspend seems like a big no-no.
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; To repeat what I said last week, I think we should schedule a task to
&gt; &gt; &gt; &gt; &gt; suspend / hang the thread in PrepareToSuspend and abort any pending
&gt; &gt; &gt; &gt; &gt; transaction when the assertion gets invalidated.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; We want to suspend as soon as possible after the app has been backgrounded.
&gt; &gt; &gt; &gt; When the app is backgrounded, it sends us the PrepareToSuspend IPC and we
&gt; &gt; &gt; &gt; should stop doing any additional work (e.g. new IDB transactions) at this
&gt; &gt; &gt; &gt; point that may delay suspension (due to the network process taking a process
&gt; &gt; &gt; &gt; assertion).
&gt; &gt; &gt; 
&gt; &gt; &gt; With you proposed approach that network process receives PrepareToSuspend
&gt; &gt; &gt; message and schedules a suspend task to IDB thread, there are 2 possible
&gt; &gt; &gt; cases:
&gt; &gt; &gt; 
&gt; &gt; &gt; 1. task runs before network process assertion is invalidated: thread is
&gt; &gt; &gt; suspended in task and transactions are aborted in invalidation handler =&gt;
&gt; &gt; &gt; why don&apos;t we just abort transactions in the task since nothing scheduled on
&gt; &gt; &gt; the thread after the task can run after suspension? In this case, aborting
&gt; &gt; &gt; earlier in the task also means network process can release the assertion
&gt; &gt; &gt; sooner.
&gt; &gt; 
&gt; &gt; We want to avoid data loss as much as possible. We should only abort
&gt; &gt; transactions when we&apos;re really about the get suspended. PrepareToSuspend
&gt; &gt; indicates we should get ready to get suspended and thus stop scheduling new
&gt; &gt; work. However, the network process is holding an assertion for whatever
&gt; &gt; current SQLiteTransaction to finish.
&gt; &gt; It is best to let this already running transaction finish rather than abort
&gt; &gt; it and potentially lose data. The whole point of taking an assertion is to
&gt; &gt; let an operation finish before suspension.
&gt; 
&gt; IDB&apos;s transactions are interleaving, so the task queue can be:
&gt; 1. start transaction-1 
&gt; 2. execute transaction-1 statement
&gt; 3. start transaction-2
&gt; 4. commit transaction-1
&gt; 5. execute transaction-2 statement 
&gt; 6. commit transaction-2
&gt; And the tasks are dispatched from IPC thread.
&gt; 
&gt; The async suspend task by PrepareToSuspend can be at any position of the
&gt; queue, and aborting transaction in the invalidation handler will happen
&gt; during the suspend task (if invalidation handler is called before
&gt; ProcessDidResume). So I am not sure how scheduling async suspend task help
&gt; avoid data loss. Can you give an example?
&gt; 
&gt; &gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt; 2. network process assertion is invalidated before task runs (maybe due to
&gt; &gt; &gt; too many tasks scheduled on the thread), old transactions are aborted but
&gt; &gt; &gt; thread is not suspended and new transaction can start =&gt; not fixing the crash
&gt; &gt; 
&gt; &gt; Right, when the assertion is invalidated, we should abort all existing tasks
&gt; &gt; and make sure the thread is suspended (synchronously).

If PrepareToSuspend schedules a task to suspend/hang the thread, then no new transactions can be started from this point, they&apos;ll just get queued. Upon doing process suspension and then later resuming, those queued transactions can now get processes and won&apos;t get lost/aborted.

If we hadn&apos;t suspended/hung the threads then those transactions would have been started and could thus have been aborted when the process assertion gets invalidated.

I don&apos;t know much about IDB but I do know that it would be very unfortunate if we started *new* IDB transactions after receiving the PrepareToSuspend IPC. My understanding is that this was the reason why we suspended the IDB thread in PrepareToSuspend.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1775738</commentid>
    <comment_count>10</comment_count>
    <who name="Sihui Liu">sihui_liu</who>
    <bug_when>2021-07-08 11:37:09 -0700</bug_when>
    <thetext>(In reply to Chris Dumez from comment #9)
&gt; (In reply to Sihui Liu from comment #8)
&gt; &gt; (In reply to Chris Dumez from comment #7)
&gt; &gt; &gt; (In reply to Sihui Liu from comment #6)
&gt; &gt; &gt; &gt; (In reply to Chris Dumez from comment #5)
&gt; &gt; &gt; &gt; &gt; (In reply to Chris Dumez from comment #4)
&gt; &gt; &gt; &gt; &gt; &gt; (In reply to Chris Dumez from comment #3)
&gt; &gt; &gt; &gt; &gt; &gt; &gt; Comment on attachment 433116 [details]
&gt; &gt; &gt; &gt; &gt; &gt; &gt; Patch
&gt; &gt; &gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; &gt; View in context:
&gt; &gt; &gt; &gt; &gt; &gt; &gt; https://bugs.webkit.org/attachment.cgi?id=433116&amp;action=review
&gt; &gt; &gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; Source/WebKit/NetworkProcess/NetworkProcess.cpp:-2219
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; -    for (auto&amp; server : m_webIDBServers.values())
&gt; &gt; &gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; &gt; Not suspending the IDB thread in PrepareToSuspend seems like a big no-no.
&gt; &gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; To repeat what I said last week, I think we should schedule a task to
&gt; &gt; &gt; &gt; &gt; &gt; suspend / hang the thread in PrepareToSuspend and abort any pending
&gt; &gt; &gt; &gt; &gt; &gt; transaction when the assertion gets invalidated.
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; We want to suspend as soon as possible after the app has been backgrounded.
&gt; &gt; &gt; &gt; &gt; When the app is backgrounded, it sends us the PrepareToSuspend IPC and we
&gt; &gt; &gt; &gt; &gt; should stop doing any additional work (e.g. new IDB transactions) at this
&gt; &gt; &gt; &gt; &gt; point that may delay suspension (due to the network process taking a process
&gt; &gt; &gt; &gt; &gt; assertion).
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; With you proposed approach that network process receives PrepareToSuspend
&gt; &gt; &gt; &gt; message and schedules a suspend task to IDB thread, there are 2 possible
&gt; &gt; &gt; &gt; cases:
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; 1. task runs before network process assertion is invalidated: thread is
&gt; &gt; &gt; &gt; suspended in task and transactions are aborted in invalidation handler =&gt;
&gt; &gt; &gt; &gt; why don&apos;t we just abort transactions in the task since nothing scheduled on
&gt; &gt; &gt; &gt; the thread after the task can run after suspension? In this case, aborting
&gt; &gt; &gt; &gt; earlier in the task also means network process can release the assertion
&gt; &gt; &gt; &gt; sooner.
&gt; &gt; &gt; 
&gt; &gt; &gt; We want to avoid data loss as much as possible. We should only abort
&gt; &gt; &gt; transactions when we&apos;re really about the get suspended. PrepareToSuspend
&gt; &gt; &gt; indicates we should get ready to get suspended and thus stop scheduling new
&gt; &gt; &gt; work. However, the network process is holding an assertion for whatever
&gt; &gt; &gt; current SQLiteTransaction to finish.
&gt; &gt; &gt; It is best to let this already running transaction finish rather than abort
&gt; &gt; &gt; it and potentially lose data. The whole point of taking an assertion is to
&gt; &gt; &gt; let an operation finish before suspension.
&gt; &gt; 
&gt; &gt; IDB&apos;s transactions are interleaving, so the task queue can be:
&gt; &gt; 1. start transaction-1 
&gt; &gt; 2. execute transaction-1 statement
&gt; &gt; 3. start transaction-2
&gt; &gt; 4. commit transaction-1
&gt; &gt; 5. execute transaction-2 statement 
&gt; &gt; 6. commit transaction-2
&gt; &gt; And the tasks are dispatched from IPC thread.
&gt; &gt; 
&gt; &gt; The async suspend task by PrepareToSuspend can be at any position of the
&gt; &gt; queue, and aborting transaction in the invalidation handler will happen
&gt; &gt; during the suspend task (if invalidation handler is called before
&gt; &gt; ProcessDidResume). So I am not sure how scheduling async suspend task help
&gt; &gt; avoid data loss. Can you give an example?
&gt; &gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; 2. network process assertion is invalidated before task runs (maybe due to
&gt; &gt; &gt; &gt; too many tasks scheduled on the thread), old transactions are aborted but
&gt; &gt; &gt; &gt; thread is not suspended and new transaction can start =&gt; not fixing the crash
&gt; &gt; &gt; 
&gt; &gt; &gt; Right, when the assertion is invalidated, we should abort all existing tasks
&gt; &gt; &gt; and make sure the thread is suspended (synchronously).
&gt; 
&gt; If PrepareToSuspend schedules a task to suspend/hang the thread, then no new
&gt; transactions can be started from this point, they&apos;ll just get queued. Upon
&gt; doing process suspension and then later resuming, those queued transactions
&gt; can now get processes and won&apos;t get lost/aborted.

No task can be handled from the point: meaning no new transaction can be started and no ongoing transaction can be finished: we cannot commit ongoing IDB transaction because they may have statements to execute in later tasks.

&gt; 
&gt; If we hadn&apos;t suspended/hung the threads then those transactions would have
&gt; been started and could thus have been aborted when the process assertion
&gt; gets invalidated.
&gt; 

It&apos;s also possible if we don&apos;t suspend the thread, all transactions (including the new ones) can be finished before timeout. There is no evidence or proof that suspending in PrepareToSuspend will give us better chance of no rollback.

&gt; I don&apos;t know much about IDB but I do know that it would be very unfortunate
&gt; if we started *new* IDB transactions after receiving the PrepareToSuspend
&gt; IPC. My understanding is that this was the reason why we suspended the IDB
&gt; thread in PrepareToSuspend.

We suspended the IDB thread (and aborted transactions) in PrepareToSuspend, because that&apos;s only indicator that network process is going to be suspended. We have to do that there. Now the indicator is network process&apos;s own assertion.

My understanding is UI process now sends PrepareToSuspend without considering the network process&apos;s SQLite activities, which it used to take care, so this patch just gets us close to the old behavior. We suspend IDB (suspending thread and aborting transaction) synchronously on the final notice. 

I tend to believe that&apos;s what we should do for other databases too. Either they don&apos;t suspend, or they suspend immediately/synchronously. That makes it easier to manage the suspension states and get things right (crashes show some thread is suspended and some thread is still processing tasks).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1775740</commentid>
    <comment_count>11</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-07-08 11:39:46 -0700</bug_when>
    <thetext>(In reply to Sihui Liu from comment #10)
&gt; (In reply to Chris Dumez from comment #9)
&gt; &gt; (In reply to Sihui Liu from comment #8)
&gt; &gt; &gt; (In reply to Chris Dumez from comment #7)
&gt; &gt; &gt; &gt; (In reply to Sihui Liu from comment #6)
&gt; &gt; &gt; &gt; &gt; (In reply to Chris Dumez from comment #5)
&gt; &gt; &gt; &gt; &gt; &gt; (In reply to Chris Dumez from comment #4)
&gt; &gt; &gt; &gt; &gt; &gt; &gt; (In reply to Chris Dumez from comment #3)
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; Comment on attachment 433116 [details]
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; Patch
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; View in context:
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; https://bugs.webkit.org/attachment.cgi?id=433116&amp;action=review
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; Source/WebKit/NetworkProcess/NetworkProcess.cpp:-2219
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; -    for (auto&amp; server : m_webIDBServers.values())
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; Not suspending the IDB thread in PrepareToSuspend seems like a big no-no.
&gt; &gt; &gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; &gt; To repeat what I said last week, I think we should schedule a task to
&gt; &gt; &gt; &gt; &gt; &gt; &gt; suspend / hang the thread in PrepareToSuspend and abort any pending
&gt; &gt; &gt; &gt; &gt; &gt; &gt; transaction when the assertion gets invalidated.
&gt; &gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; We want to suspend as soon as possible after the app has been backgrounded.
&gt; &gt; &gt; &gt; &gt; &gt; When the app is backgrounded, it sends us the PrepareToSuspend IPC and we
&gt; &gt; &gt; &gt; &gt; &gt; should stop doing any additional work (e.g. new IDB transactions) at this
&gt; &gt; &gt; &gt; &gt; &gt; point that may delay suspension (due to the network process taking a process
&gt; &gt; &gt; &gt; &gt; &gt; assertion).
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; With you proposed approach that network process receives PrepareToSuspend
&gt; &gt; &gt; &gt; &gt; message and schedules a suspend task to IDB thread, there are 2 possible
&gt; &gt; &gt; &gt; &gt; cases:
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; 1. task runs before network process assertion is invalidated: thread is
&gt; &gt; &gt; &gt; &gt; suspended in task and transactions are aborted in invalidation handler =&gt;
&gt; &gt; &gt; &gt; &gt; why don&apos;t we just abort transactions in the task since nothing scheduled on
&gt; &gt; &gt; &gt; &gt; the thread after the task can run after suspension? In this case, aborting
&gt; &gt; &gt; &gt; &gt; earlier in the task also means network process can release the assertion
&gt; &gt; &gt; &gt; &gt; sooner.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; We want to avoid data loss as much as possible. We should only abort
&gt; &gt; &gt; &gt; transactions when we&apos;re really about the get suspended. PrepareToSuspend
&gt; &gt; &gt; &gt; indicates we should get ready to get suspended and thus stop scheduling new
&gt; &gt; &gt; &gt; work. However, the network process is holding an assertion for whatever
&gt; &gt; &gt; &gt; current SQLiteTransaction to finish.
&gt; &gt; &gt; &gt; It is best to let this already running transaction finish rather than abort
&gt; &gt; &gt; &gt; it and potentially lose data. The whole point of taking an assertion is to
&gt; &gt; &gt; &gt; let an operation finish before suspension.
&gt; &gt; &gt; 
&gt; &gt; &gt; IDB&apos;s transactions are interleaving, so the task queue can be:
&gt; &gt; &gt; 1. start transaction-1 
&gt; &gt; &gt; 2. execute transaction-1 statement
&gt; &gt; &gt; 3. start transaction-2
&gt; &gt; &gt; 4. commit transaction-1
&gt; &gt; &gt; 5. execute transaction-2 statement 
&gt; &gt; &gt; 6. commit transaction-2
&gt; &gt; &gt; And the tasks are dispatched from IPC thread.
&gt; &gt; &gt; 
&gt; &gt; &gt; The async suspend task by PrepareToSuspend can be at any position of the
&gt; &gt; &gt; queue, and aborting transaction in the invalidation handler will happen
&gt; &gt; &gt; during the suspend task (if invalidation handler is called before
&gt; &gt; &gt; ProcessDidResume). So I am not sure how scheduling async suspend task help
&gt; &gt; &gt; avoid data loss. Can you give an example?
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; 2. network process assertion is invalidated before task runs (maybe due to
&gt; &gt; &gt; &gt; &gt; too many tasks scheduled on the thread), old transactions are aborted but
&gt; &gt; &gt; &gt; &gt; thread is not suspended and new transaction can start =&gt; not fixing the crash
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Right, when the assertion is invalidated, we should abort all existing tasks
&gt; &gt; &gt; &gt; and make sure the thread is suspended (synchronously).
&gt; &gt; 
&gt; &gt; If PrepareToSuspend schedules a task to suspend/hang the thread, then no new
&gt; &gt; transactions can be started from this point, they&apos;ll just get queued. Upon
&gt; &gt; doing process suspension and then later resuming, those queued transactions
&gt; &gt; can now get processes and won&apos;t get lost/aborted.
&gt; 
&gt; No task can be handled from the point: meaning no new transaction can be
&gt; started and no ongoing transaction can be finished: we cannot commit ongoing
&gt; IDB transaction because they may have statements to execute in later tasks.
&gt; 
&gt; &gt; 
&gt; &gt; If we hadn&apos;t suspended/hung the threads then those transactions would have
&gt; &gt; been started and could thus have been aborted when the process assertion
&gt; &gt; gets invalidated.
&gt; &gt; 
&gt; 
&gt; It&apos;s also possible if we don&apos;t suspend the thread, all transactions
&gt; (including the new ones) can be finished before timeout. There is no
&gt; evidence or proof that suspending in PrepareToSuspend will give us better
&gt; chance of no rollback.
&gt; 
&gt; &gt; I don&apos;t know much about IDB but I do know that it would be very unfortunate
&gt; &gt; if we started *new* IDB transactions after receiving the PrepareToSuspend
&gt; &gt; IPC. My understanding is that this was the reason why we suspended the IDB
&gt; &gt; thread in PrepareToSuspend.
&gt; 
&gt; We suspended the IDB thread (and aborted transactions) in PrepareToSuspend,
&gt; because that&apos;s only indicator that network process is going to be suspended.
&gt; We have to do that there. Now the indicator is network process&apos;s own
&gt; assertion.
&gt; 
&gt; My understanding is UI process now sends PrepareToSuspend without
&gt; considering the network process&apos;s SQLite activities, which it used to take
&gt; care, so this patch just gets us close to the old behavior. We suspend IDB
&gt; (suspending thread and aborting transaction) synchronously on the final
&gt; notice. 
&gt; 
&gt; I tend to believe that&apos;s what we should do for other databases too. Either
&gt; they don&apos;t suspend, or they suspend immediately/synchronously. That makes it
&gt; easier to manage the suspension states and get things right (crashes show
&gt; some thread is suspended and some thread is still processing tasks).

Let me try another way: there is zero guarantee your invalidation handler will have time to run before suspension. Not only is there no guarantee, we see suspension happening before the invalidation handler getting called happening very frequently in logs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1775747</commentid>
    <comment_count>12</comment_count>
    <who name="Sihui Liu">sihui_liu</who>
    <bug_when>2021-07-08 11:58:45 -0700</bug_when>
    <thetext>(In reply to Chris Dumez from comment #11)
&gt; (In reply to Sihui Liu from comment #10)
&gt; &gt; (In reply to Chris Dumez from comment #9)
&gt; &gt; &gt; (In reply to Sihui Liu from comment #8)
&gt; &gt; &gt; &gt; (In reply to Chris Dumez from comment #7)
&gt; &gt; &gt; &gt; &gt; (In reply to Sihui Liu from comment #6)
&gt; &gt; &gt; &gt; &gt; &gt; (In reply to Chris Dumez from comment #5)
&gt; &gt; &gt; &gt; &gt; &gt; &gt; (In reply to Chris Dumez from comment #4)
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; (In reply to Chris Dumez from comment #3)
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; Comment on attachment 433116 [details]
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; Patch
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; View in context:
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; https://bugs.webkit.org/attachment.cgi?id=433116&amp;action=review
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; Source/WebKit/NetworkProcess/NetworkProcess.cpp:-2219
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; -    for (auto&amp; server : m_webIDBServers.values())
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; Not suspending the IDB thread in PrepareToSuspend seems like a big no-no.
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; To repeat what I said last week, I think we should schedule a task to
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; suspend / hang the thread in PrepareToSuspend and abort any pending
&gt; &gt; &gt; &gt; &gt; &gt; &gt; &gt; transaction when the assertion gets invalidated.
&gt; &gt; &gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; &gt; We want to suspend as soon as possible after the app has been backgrounded.
&gt; &gt; &gt; &gt; &gt; &gt; &gt; When the app is backgrounded, it sends us the PrepareToSuspend IPC and we
&gt; &gt; &gt; &gt; &gt; &gt; &gt; should stop doing any additional work (e.g. new IDB transactions) at this
&gt; &gt; &gt; &gt; &gt; &gt; &gt; point that may delay suspension (due to the network process taking a process
&gt; &gt; &gt; &gt; &gt; &gt; &gt; assertion).
&gt; &gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; With you proposed approach that network process receives PrepareToSuspend
&gt; &gt; &gt; &gt; &gt; &gt; message and schedules a suspend task to IDB thread, there are 2 possible
&gt; &gt; &gt; &gt; &gt; &gt; cases:
&gt; &gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; 1. task runs before network process assertion is invalidated: thread is
&gt; &gt; &gt; &gt; &gt; &gt; suspended in task and transactions are aborted in invalidation handler =&gt;
&gt; &gt; &gt; &gt; &gt; &gt; why don&apos;t we just abort transactions in the task since nothing scheduled on
&gt; &gt; &gt; &gt; &gt; &gt; the thread after the task can run after suspension? In this case, aborting
&gt; &gt; &gt; &gt; &gt; &gt; earlier in the task also means network process can release the assertion
&gt; &gt; &gt; &gt; &gt; &gt; sooner.
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; We want to avoid data loss as much as possible. We should only abort
&gt; &gt; &gt; &gt; &gt; transactions when we&apos;re really about the get suspended. PrepareToSuspend
&gt; &gt; &gt; &gt; &gt; indicates we should get ready to get suspended and thus stop scheduling new
&gt; &gt; &gt; &gt; &gt; work. However, the network process is holding an assertion for whatever
&gt; &gt; &gt; &gt; &gt; current SQLiteTransaction to finish.
&gt; &gt; &gt; &gt; &gt; It is best to let this already running transaction finish rather than abort
&gt; &gt; &gt; &gt; &gt; it and potentially lose data. The whole point of taking an assertion is to
&gt; &gt; &gt; &gt; &gt; let an operation finish before suspension.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; IDB&apos;s transactions are interleaving, so the task queue can be:
&gt; &gt; &gt; &gt; 1. start transaction-1 
&gt; &gt; &gt; &gt; 2. execute transaction-1 statement
&gt; &gt; &gt; &gt; 3. start transaction-2
&gt; &gt; &gt; &gt; 4. commit transaction-1
&gt; &gt; &gt; &gt; 5. execute transaction-2 statement 
&gt; &gt; &gt; &gt; 6. commit transaction-2
&gt; &gt; &gt; &gt; And the tasks are dispatched from IPC thread.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; The async suspend task by PrepareToSuspend can be at any position of the
&gt; &gt; &gt; &gt; queue, and aborting transaction in the invalidation handler will happen
&gt; &gt; &gt; &gt; during the suspend task (if invalidation handler is called before
&gt; &gt; &gt; &gt; ProcessDidResume). So I am not sure how scheduling async suspend task help
&gt; &gt; &gt; &gt; avoid data loss. Can you give an example?
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; &gt; 2. network process assertion is invalidated before task runs (maybe due to
&gt; &gt; &gt; &gt; &gt; &gt; too many tasks scheduled on the thread), old transactions are aborted but
&gt; &gt; &gt; &gt; &gt; &gt; thread is not suspended and new transaction can start =&gt; not fixing the crash
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; Right, when the assertion is invalidated, we should abort all existing tasks
&gt; &gt; &gt; &gt; &gt; and make sure the thread is suspended (synchronously).
&gt; &gt; &gt; 
&gt; &gt; &gt; If PrepareToSuspend schedules a task to suspend/hang the thread, then no new
&gt; &gt; &gt; transactions can be started from this point, they&apos;ll just get queued. Upon
&gt; &gt; &gt; doing process suspension and then later resuming, those queued transactions
&gt; &gt; &gt; can now get processes and won&apos;t get lost/aborted.
&gt; &gt; 
&gt; &gt; No task can be handled from the point: meaning no new transaction can be
&gt; &gt; started and no ongoing transaction can be finished: we cannot commit ongoing
&gt; &gt; IDB transaction because they may have statements to execute in later tasks.
&gt; &gt; 
&gt; &gt; &gt; 
&gt; &gt; &gt; If we hadn&apos;t suspended/hung the threads then those transactions would have
&gt; &gt; &gt; been started and could thus have been aborted when the process assertion
&gt; &gt; &gt; gets invalidated.
&gt; &gt; &gt; 
&gt; &gt; 
&gt; &gt; It&apos;s also possible if we don&apos;t suspend the thread, all transactions
&gt; &gt; (including the new ones) can be finished before timeout. There is no
&gt; &gt; evidence or proof that suspending in PrepareToSuspend will give us better
&gt; &gt; chance of no rollback.
&gt; &gt; 
&gt; &gt; &gt; I don&apos;t know much about IDB but I do know that it would be very unfortunate
&gt; &gt; &gt; if we started *new* IDB transactions after receiving the PrepareToSuspend
&gt; &gt; &gt; IPC. My understanding is that this was the reason why we suspended the IDB
&gt; &gt; &gt; thread in PrepareToSuspend.
&gt; &gt; 
&gt; &gt; We suspended the IDB thread (and aborted transactions) in PrepareToSuspend,
&gt; &gt; because that&apos;s only indicator that network process is going to be suspended.
&gt; &gt; We have to do that there. Now the indicator is network process&apos;s own
&gt; &gt; assertion.
&gt; &gt; 
&gt; &gt; My understanding is UI process now sends PrepareToSuspend without
&gt; &gt; considering the network process&apos;s SQLite activities, which it used to take
&gt; &gt; care, so this patch just gets us close to the old behavior. We suspend IDB
&gt; &gt; (suspending thread and aborting transaction) synchronously on the final
&gt; &gt; notice. 
&gt; &gt; 
&gt; &gt; I tend to believe that&apos;s what we should do for other databases too. Either
&gt; &gt; they don&apos;t suspend, or they suspend immediately/synchronously. That makes it
&gt; &gt; easier to manage the suspension states and get things right (crashes show
&gt; &gt; some thread is suspended and some thread is still processing tasks).
&gt; 
&gt; Let me try another way: there is zero guarantee your invalidation handler
&gt; will have time to run before suspension. Not only is there no guarantee, we
&gt; see suspension happening before the invalidation handler getting called
&gt; happening very frequently in logs.

Not sure if it matters but this is willinvalidate handler, not the invalidation handler; invalidation handler seems to be called after assertion is dropped?

If we don&apos;t think the handler will be called or it&apos;s very likely it&apos;s will not be called, then the proposal will also not work. We suspend the thread, but we don&apos;t abort transactions so database lock is still held. In this case, we&apos;d better keep current implementation. 

But isn&apos;t our implementation based on that we will get the call? Compared to imminent prepareToSuspend, at least this message is sent directly to network process.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1775779</commentid>
    <comment_count>13</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2021-07-08 13:45:19 -0700</bug_when>
    <thetext>It seems like the problem in trunk is that, often, when we background Safari, we immediately receive prepareToSuspend(), and then respond by aborting in-flight IDB transactions.

Ideally, in prepareToSuspend(), we would (a) complete in-flight IDB transactions (using an assertion) and (b) avoid starting new IDB transactions, and (c) only abort transactions if they truly are super-long-running.

I think trunk does (a), this patch does (c); and doing (b) is a little challenging in our current architecture, because our current architecture doesn&apos;t distinguish new IDB transactions from operations on existing IDB transactions.

Is that right?

If so, doing only (c) now might be an improvement -- and we probably want to follow up and do (b) too.

Is that right?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1775790</commentid>
    <comment_count>14</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-07-08 13:59:56 -0700</bug_when>
    <thetext>(In reply to Geoffrey Garen from comment #13)
&gt; It seems like the problem in trunk is that, often, when we background
&gt; Safari, we immediately receive prepareToSuspend(), and then respond by
&gt; aborting in-flight IDB transactions.
&gt; 
&gt; Ideally, in prepareToSuspend(), we would (a) complete in-flight IDB
&gt; transactions (using an assertion) and (b) avoid starting new IDB
&gt; transactions, and (c) only abort transactions if they truly are
&gt; super-long-running.
&gt; 
&gt; I think trunk does (a), this patch does (c); and doing (b) is a little
&gt; challenging in our current architecture, because our current architecture
&gt; doesn&apos;t distinguish new IDB transactions from operations on existing IDB
&gt; transactions.
&gt; 
&gt; Is that right?
&gt; 
&gt; If so, doing only (c) now might be an improvement -- and we probably want to
&gt; follow up and do (b) too.
&gt; 
&gt; Is that right?

That patch *attempts to* do (c). With this patch we would only have handling when the process assertion gets invalidated. As stated before, we already know for a fact that our invalidation logic doesn&apos;t reliably get called before suspension. This is *especially true* in the cases where we just keep scheduling work *after* the app was backgrounded (i.e. PrepareToSuspend has been received) because the 30 second timer may be close to exhausted when trying to take an assertion.

This patch makes things work by allowing work to get scheduled after PrepareToSuspend has been received, which we know makes it way more likely that:
1. Our assertion will get invalidated and our invalidation logic may or may not run
2. We run for 30 seconds after backgrounding, which will be a power regression.

Doing thing in an invalidation handler is a good idea but it should really be LAST resort, not our MAIN way of dealing with suspension. Our process assertion getting invalidated is a BUG, it should not be happening if we did our job right.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1775798</commentid>
    <comment_count>15</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2021-07-08 14:10:58 -0700</bug_when>
    <thetext>I see: There&apos;s a tradeoff. Making this change now would reduce the number of unwanted immediate IDB transaction aborts, reducing data loss; but it would also increase the number of suspensions while holding locked files, increasing Network process crashes (which, when they happen, lose the same data, and more).

Argh.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1775800</commentid>
    <comment_count>16</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-07-08 14:16:18 -0700</bug_when>
    <thetext>(In reply to Geoffrey Garen from comment #15)
&gt; I see: There&apos;s a tradeoff. Making this change now would reduce the number of
&gt; unwanted immediate IDB transaction aborts, reducing data loss; but it would
&gt; also increase the number of suspensions while holding locked files,
&gt; increasing Network process crashes (which, when they happen, lose the same
&gt; data, and more).
&gt; 
&gt; Argh.

That&apos;s why, while I think it is good to abort things in the invalidation handler, I still think we should do *something* in the PrepareToSuspend. I am not super familiar with IndexedDB so it is a bit difficult for me to know what that something can be but ideally:
1. We would stop scheduling new work / transactions
2. We would allow any open transaction to finish/commit (asynchronously). Hopefully, these will finish within the 30s invalidation. If they don&apos;t, the safety net (our invalidation handler) would trigger and abort them.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1775801</commentid>
    <comment_count>17</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2021-07-08 14:18:47 -0700</bug_when>
    <thetext>Maybe a reasonable compromise for the time being would be for prepareToSuspend (when not imminent) to schedule a 10s timer, and only abort transactions after that? 10s is well below the effective 30s limit, and I expect it to be well above the 95th percentile transaction time. (Need a little logic to only fire that timer while suspending, and not after resuming.)

Then we can make this incremental improvement now; and after we have a way to avoid starting new transactions, we can remove the abort behavior from prepareToSuspend entirely.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1775808</commentid>
    <comment_count>18</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-07-08 14:25:52 -0700</bug_when>
    <thetext>(In reply to Geoffrey Garen from comment #17)
&gt; Maybe a reasonable compromise for the time being would be for
&gt; prepareToSuspend (when not imminent) to schedule a 10s timer, and only abort
&gt; transactions after that? 10s is well below the effective 30s limit, and I
&gt; expect it to be well above the 95th percentile transaction time. (Need a
&gt; little logic to only fire that timer while suspending, and not after
&gt; resuming.)
&gt; 
&gt; Then we can make this incremental improvement now; and after we have a way
&gt; to avoid starting new transactions, we can remove the abort behavior from
&gt; prepareToSuspend entirely.

Yes, something like this may be a reasonable compromise.

Although, if you don&apos;t prevent any new work from getting scheduled, are you really less likely to abort DB work if you wait 10 seconds before aborting?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1775854</commentid>
    <comment_count>19</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2021-07-08 16:20:47 -0700</bug_when>
    <thetext>After backgrounding, there&apos;s no more user interaction. Maybe that reduces the chances of new DB transactions.

Can we additionally count on WebContent process suspension preventing new DB transactions in the common case?

Relatedly, do we do anything in the WebContent process to prevent suspension during a DB transaction? (If we don&apos;t, we probably haven&apos;t solved the problem of aborting transactions, since WebContent can start a transaction and never stop it.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1775857</commentid>
    <comment_count>20</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-07-08 16:26:48 -0700</bug_when>
    <thetext>(In reply to Geoffrey Garen from comment #19)
&gt; After backgrounding, there&apos;s no more user interaction. Maybe that reduces
&gt; the chances of new DB transactions.

User interaction may be a trigger for indexed db writes but as long as JS is running in the WebContent, I think it is safe to assume indexed db write may happen, user interactions or not.

&gt; 
&gt; Can we additionally count on WebContent process suspension preventing new DB
&gt; transactions in the common case?

Yes, to some extent. *If* the WebProcess suspends promptly upon app backgrounding then it cannot schedule to IndexedDB work with the network process so this likely helps. Note the *if* though :) If there is something in the WebProcess that delays suspension (e.g. App Cache writing, loading, ...) then it could in theory keep scheduling work with the network process for up to 30 seconds.

&gt; Relatedly, do we do anything in the WebContent process to prevent suspension
&gt; during a DB transaction? (If we don&apos;t, we probably haven&apos;t solved the
&gt; problem of aborting transactions, since WebContent can start a transaction
&gt; and never stop it.)

No, I am not aware of any logic to prevent WebProcess suspension during an IDB transaction.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1775922</commentid>
    <comment_count>21</comment_count>
    <who name="Sihui Liu">sihui_liu</who>
    <bug_when>2021-07-08 22:30:39 -0700</bug_when>
    <thetext>Chris suggested maybe we should make the change after (In reply to Geoffrey Garen from comment #19)
&gt; After backgrounding, there&apos;s no more user interaction. Maybe that reduces
&gt; the chances of new DB transactions.
&gt; 

Nope, like Chris said.

&gt; Can we additionally count on WebContent process suspension preventing new DB
&gt; transactions in the common case?
&gt; 

If all web processes using IDB are suspended, no new task will be scheduled, so no new transaction after all existing tasks. But we don&apos;t know when web process are suspended; they can also ask UI process to take background assertion.

&gt; Relatedly, do we do anything in the WebContent process to prevent suspension
&gt; during a DB transaction? (If we don&apos;t, we probably haven&apos;t solved the
&gt; problem of aborting transactions, since WebContent can start a transaction
&gt; and never stop it.)

Yes, we avoid aborting transaction (to avoid data loss) on a best-effort basis.
If user chooses to use API in this way, then it is expected that the transaction will likely never succeed.

The goal of this patch is to approach the old behavior at when we take the assertion in UI process for database activities. In previous implementation, if assertion is taken before app enters background, the assertion can last until timeout. We did not do anything to stop starting new transaction after backgrounding. To get the old behavior, the patch should be:
1. if PrepareToSuspend is imminent, suspend IDB (suspending thread + aborting transactions)
2. if PrepareToSuspend is non-imminent: 
2.1 if assertion is taken, let it run as long as timeout, and suspend IDB in assertion invalidation handler or when assertion is released
2.2 if assertion is not taken, suspend IDB

Our trunk behavior is: if PrepareToSuspend, suspend IDB. This can be a regression for avoiding data loss, e.g. in the case where app is backgrounded and foregrounded soon, where transactions would not be aborted before. But this can also be good for power, as we don&apos;t allow network process to stay active once backgrounded.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1777069</commentid>
    <comment_count>22</comment_count>
      <attachid>433535</attachid>
    <who name="Sihui Liu">sihui_liu</who>
    <bug_when>2021-07-14 15:53:48 -0700</bug_when>
    <thetext>Created attachment 433535
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1777076</commentid>
    <comment_count>23</comment_count>
      <attachid>433537</attachid>
    <who name="Sihui Liu">sihui_liu</who>
    <bug_when>2021-07-14 16:16:39 -0700</bug_when>
    <thetext>Created attachment 433537
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1777077</commentid>
    <comment_count>24</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2021-07-14 16:21:16 -0700</bug_when>
    <thetext>&lt;rdar://problem/80602557&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1777087</commentid>
    <comment_count>25</comment_count>
      <attachid>433542</attachid>
    <who name="Sihui Liu">sihui_liu</who>
    <bug_when>2021-07-14 16:41:58 -0700</bug_when>
    <thetext>Created attachment 433542
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1777215</commentid>
    <comment_count>26</comment_count>
      <attachid>433542</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-07-15 09:15:21 -0700</bug_when>
    <thetext>Comment on attachment 433542
Patch

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

&gt; Source/WebCore/Modules/indexeddb/server/IDBServer.cpp:776
&gt; +        return true;

Shouldn&apos;t this be false?

&gt; Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h:55
&gt; +    enum class IsSuspensionImminent : bool { No, Yes };

This should probably be in database terms, not suspension terms. IDB shouldn&apos;t really have to care about suspension. Should be something like: &quot;ShouldAbortTransactions&quot; or &quot;ForceSuspension&quot;.

&gt; Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h:56
&gt; +    bool suspend(IsSuspensionImminent = IsSuspensionImminent::Yes);

I think having a default parameter value is confusing when I look at call sites.

Maybe we should name this something like trySuspend() since it return a boolean and may not suspend?

&gt; Source/WebKit/NetworkProcess/NetworkProcess.cpp:2216
&gt; +    m_shouldSuspendIDBServer = true;

m_shouldSuspendIDBServers (plural) ?

&gt; Source/WebKit/NetworkProcess/NetworkProcess.cpp:2219
&gt; +        for (auto&amp; server : m_webIDBServers.values())

Ideally, we would not duplicate the loop here and below for the non-imminent case.

&gt; Source/WebKit/NetworkProcess/NetworkProcess.cpp:2237
&gt; +        if (!m_shouldSuspendIDBServer)

I guess we&apos;re not too concerned about this timer firing early in the case where you:
1. Home out of safari
2. quickly home back into Safari
3. Quickly home back out (you won&apos;t get 5 seconds)

It is kind of an edge case and the result is not terrible (we abort transactions early) so I guess this is fine.

&gt; Source/WebKit/NetworkProcess/ios/NetworkProcessIOS.mm:117
&gt; +        callOnMainRunLoopAndWait([this, weakThis = WTFMove(weakThis)]() {

Why the &quot;AndWait&quot; ? I know if is important for an invalidation handler but is it useful for a prepare to invalidate handler? I don&apos;t know enough about this RB delegate to answer that.

&gt; Source/WebKit/NetworkProcess/ios/NetworkProcessIOS.mm:122
&gt; +                server-&gt;suspend();

This will almost certainly introduce cases where the network process has resumed but its IDB threads are suspended. Imagine the network process getting a ProcessDidResume IPC in between your prepare for invalidation handler getting called on the background thread and you suspending IDBservers on the main thread.

Also note that since you&apos;re using a &quot;prepareForInvalidationHandler&quot; and not an invalidation handler, the assertion is still valid after you suspend IDB and may never actually get invalidated.

&gt; Source/WebKit/UIProcess/ProcessAssertion.h:75
&gt; +    void setPrepareForInvalidationHandler(Function&lt;void()&gt;&amp;&amp; handler) { m_prepareForInvalidationHandler = WTFMove(handler); }

Can&apos;t you use setInvalidationHandler() like the others? I know very little about the prepareForInvalidationCallback so it is hard for me to understand why we need this one instead of the invalidation handler that the rest of our code relies on.
May be worth discussing with RunningBoard developers to see which one is best and why.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1777242</commentid>
    <comment_count>27</comment_count>
      <attachid>433542</attachid>
    <who name="Sihui Liu">sihui_liu</who>
    <bug_when>2021-07-15 10:28:23 -0700</bug_when>
    <thetext>Comment on attachment 433542
Patch

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

&gt;&gt; Source/WebCore/Modules/indexeddb/server/IDBServer.cpp:776
&gt;&gt; +        return true;
&gt; 
&gt; Shouldn&apos;t this be false?

We don&apos;t need to hang the thread for ephemeral session, but I guess it doesn&apos;t hurt to hang it; will change

&gt;&gt; Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h:55
&gt;&gt; +    enum class IsSuspensionImminent : bool { No, Yes };
&gt; 
&gt; This should probably be in database terms, not suspension terms. IDB shouldn&apos;t really have to care about suspension. Should be something like: &quot;ShouldAbortTransactions&quot; or &quot;ForceSuspension&quot;.

Okay, will rename it.

&gt;&gt; Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h:56
&gt;&gt; +    bool suspend(IsSuspensionImminent = IsSuspensionImminent::Yes);
&gt; 
&gt; I think having a default parameter value is confusing when I look at call sites.
&gt; 
&gt; Maybe we should name this something like trySuspend() since it return a boolean and may not suspend?

Okay, will rename it to trySuspend.

&gt;&gt; Source/WebKit/NetworkProcess/NetworkProcess.cpp:2216
&gt;&gt; +    m_shouldSuspendIDBServer = true;
&gt; 
&gt; m_shouldSuspendIDBServers (plural) ?

Will change.

&gt;&gt; Source/WebKit/NetworkProcess/NetworkProcess.cpp:2219
&gt;&gt; +        for (auto&amp; server : m_webIDBServers.values())
&gt; 
&gt; Ideally, we would not duplicate the loop here and below for the non-imminent case.

Like adding a function?

&gt;&gt; Source/WebKit/NetworkProcess/NetworkProcess.cpp:2237
&gt;&gt; +        if (!m_shouldSuspendIDBServer)
&gt; 
&gt; I guess we&apos;re not too concerned about this timer firing early in the case where you:
&gt; 1. Home out of safari
&gt; 2. quickly home back into Safari
&gt; 3. Quickly home back out (you won&apos;t get 5 seconds)
&gt; 
&gt; It is kind of an edge case and the result is not terrible (we abort transactions early) so I guess this is fine.

Yes; seems we don&apos;t need to dispatch a task again if there is a pending one though

&gt;&gt; Source/WebKit/NetworkProcess/ios/NetworkProcessIOS.mm:117
&gt;&gt; +        callOnMainRunLoopAndWait([this, weakThis = WTFMove(weakThis)]() {
&gt; 
&gt; Why the &quot;AndWait&quot; ? I know if is important for an invalidation handler but is it useful for a prepare to invalidate handler? I don&apos;t know enough about this RB delegate to answer that.

Just confirmed it&apos;s ~5s before invalidation. We don&apos;t need to AndWait I guess.

&gt;&gt; Source/WebKit/NetworkProcess/ios/NetworkProcessIOS.mm:122
&gt;&gt; +                server-&gt;suspend();
&gt; 
&gt; This will almost certainly introduce cases where the network process has resumed but its IDB threads are suspended. Imagine the network process getting a ProcessDidResume IPC in between your prepare for invalidation handler getting called on the background thread and you suspending IDBservers on the main thread.
&gt; 
&gt; Also note that since you&apos;re using a &quot;prepareForInvalidationHandler&quot; and not an invalidation handler, the assertion is still valid after you suspend IDB and may never actually get invalidated.

Yes, should check m_shouldSuspendIDBServer

&gt;&gt; Source/WebKit/UIProcess/ProcessAssertion.h:75
&gt;&gt; +    void setPrepareForInvalidationHandler(Function&lt;void()&gt;&amp;&amp; handler) { m_prepareForInvalidationHandler = WTFMove(handler); }
&gt; 
&gt; Can&apos;t you use setInvalidationHandler() like the others? I know very little about the prepareForInvalidationCallback so it is hard for me to understand why we need this one instead of the invalidation handler that the rest of our code relies on.
&gt; May be worth discussing with RunningBoard developers to see which one is best and why.

I asked RunningBoard people: 
- (void)assertion:(RBSAssertion *)assertion didInvalidateWithError:(nullable NSError *)error can be called the same time as suspension happens, which means process can get suspended before the function returns.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1777243</commentid>
    <comment_count>28</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-07-15 10:31:32 -0700</bug_when>
    <thetext>(In reply to Sihui Liu from comment #27)
&gt; Comment on attachment 433542 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=433542&amp;action=review
&gt; 
&gt; &gt;&gt; Source/WebCore/Modules/indexeddb/server/IDBServer.cpp:776
&gt; &gt;&gt; +        return true;
&gt; &gt; 
&gt; &gt; Shouldn&apos;t this be false?
&gt; 
&gt; We don&apos;t need to hang the thread for ephemeral session, but I guess it
&gt; doesn&apos;t hurt to hang it; will change
&gt; 
&gt; &gt;&gt; Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h:55
&gt; &gt;&gt; +    enum class IsSuspensionImminent : bool { No, Yes };
&gt; &gt; 
&gt; &gt; This should probably be in database terms, not suspension terms. IDB shouldn&apos;t really have to care about suspension. Should be something like: &quot;ShouldAbortTransactions&quot; or &quot;ForceSuspension&quot;.
&gt; 
&gt; Okay, will rename it.
&gt; 
&gt; &gt;&gt; Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h:56
&gt; &gt;&gt; +    bool suspend(IsSuspensionImminent = IsSuspensionImminent::Yes);
&gt; &gt; 
&gt; &gt; I think having a default parameter value is confusing when I look at call sites.
&gt; &gt; 
&gt; &gt; Maybe we should name this something like trySuspend() since it return a boolean and may not suspend?
&gt; 
&gt; Okay, will rename it to trySuspend.
&gt; 
&gt; &gt;&gt; Source/WebKit/NetworkProcess/NetworkProcess.cpp:2216
&gt; &gt;&gt; +    m_shouldSuspendIDBServer = true;
&gt; &gt; 
&gt; &gt; m_shouldSuspendIDBServers (plural) ?
&gt; 
&gt; Will change.
&gt; 
&gt; &gt;&gt; Source/WebKit/NetworkProcess/NetworkProcess.cpp:2219
&gt; &gt;&gt; +        for (auto&amp; server : m_webIDBServers.values())
&gt; &gt; 
&gt; &gt; Ideally, we would not duplicate the loop here and below for the non-imminent case.
&gt; 
&gt; Like adding a function?

No, just use the same loop:
for (auto&amp; server : m_webIDBServers.values())
    server-&gt;trySuspend(isImminentSuspension? ForceSuspend::Yes : ForceSuspend::No);

&gt; 
&gt; &gt;&gt; Source/WebKit/NetworkProcess/NetworkProcess.cpp:2237
&gt; &gt;&gt; +        if (!m_shouldSuspendIDBServer)
&gt; &gt; 
&gt; &gt; I guess we&apos;re not too concerned about this timer firing early in the case where you:
&gt; &gt; 1. Home out of safari
&gt; &gt; 2. quickly home back into Safari
&gt; &gt; 3. Quickly home back out (you won&apos;t get 5 seconds)
&gt; &gt; 
&gt; &gt; It is kind of an edge case and the result is not terrible (we abort transactions early) so I guess this is fine.
&gt; 
&gt; Yes; seems we don&apos;t need to dispatch a task again if there is a pending one
&gt; though
&gt; 
&gt; &gt;&gt; Source/WebKit/NetworkProcess/ios/NetworkProcessIOS.mm:117
&gt; &gt;&gt; +        callOnMainRunLoopAndWait([this, weakThis = WTFMove(weakThis)]() {
&gt; &gt; 
&gt; &gt; Why the &quot;AndWait&quot; ? I know if is important for an invalidation handler but is it useful for a prepare to invalidate handler? I don&apos;t know enough about this RB delegate to answer that.
&gt; 
&gt; Just confirmed it&apos;s ~5s before invalidation. We don&apos;t need to AndWait I
&gt; guess.
&gt; 
&gt; &gt;&gt; Source/WebKit/NetworkProcess/ios/NetworkProcessIOS.mm:122
&gt; &gt;&gt; +                server-&gt;suspend();
&gt; &gt; 
&gt; &gt; This will almost certainly introduce cases where the network process has resumed but its IDB threads are suspended. Imagine the network process getting a ProcessDidResume IPC in between your prepare for invalidation handler getting called on the background thread and you suspending IDBservers on the main thread.
&gt; &gt; 
&gt; &gt; Also note that since you&apos;re using a &quot;prepareForInvalidationHandler&quot; and not an invalidation handler, the assertion is still valid after you suspend IDB and may never actually get invalidated.
&gt; 
&gt; Yes, should check m_shouldSuspendIDBServer
&gt; 
&gt; &gt;&gt; Source/WebKit/UIProcess/ProcessAssertion.h:75
&gt; &gt;&gt; +    void setPrepareForInvalidationHandler(Function&lt;void()&gt;&amp;&amp; handler) { m_prepareForInvalidationHandler = WTFMove(handler); }
&gt; &gt; 
&gt; &gt; Can&apos;t you use setInvalidationHandler() like the others? I know very little about the prepareForInvalidationCallback so it is hard for me to understand why we need this one instead of the invalidation handler that the rest of our code relies on.
&gt; &gt; May be worth discussing with RunningBoard developers to see which one is best and why.
&gt; 
&gt; I asked RunningBoard people: 
&gt; - (void)assertion:(RBSAssertion *)assertion didInvalidateWithError:(nullable
&gt; NSError *)error can be called the same time as suspension happens, which
&gt; means process can get suspended before the function returns.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1777291</commentid>
    <comment_count>29</comment_count>
      <attachid>433610</attachid>
    <who name="Sihui Liu">sihui_liu</who>
    <bug_when>2021-07-15 12:28:34 -0700</bug_when>
    <thetext>Created attachment 433610
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1777298</commentid>
    <comment_count>30</comment_count>
      <attachid>433613</attachid>
    <who name="Sihui Liu">sihui_liu</who>
    <bug_when>2021-07-15 12:49:42 -0700</bug_when>
    <thetext>Created attachment 433613
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1777321</commentid>
    <comment_count>31</comment_count>
      <attachid>433613</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-07-15 13:38:34 -0700</bug_when>
    <thetext>Comment on attachment 433613
Patch

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

&gt; Source/WebKit/NetworkProcess/NetworkProcess.cpp:2219
&gt; +        for (auto&amp; server : m_webIDBServers.values())

Why is this loop still here?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1777326</commentid>
    <comment_count>32</comment_count>
      <attachid>433613</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-07-15 13:43:58 -0700</bug_when>
    <thetext>Comment on attachment 433613
Patch

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

&gt; Source/WebKit/NetworkProcess/ios/NetworkProcessIOS.mm:117
&gt; +        callOnMainRunLoop([this, weakThis = WTFMove(weakThis)]() {

Seems we end up dispatching on the main thread anyway.

&gt; Source/WebKit/UIProcess/ios/ProcessAssertionIOS.mm:274
&gt; +    _prepareForInvalidationCallback();

Should we dispatch to the main thread here like we do in didInvalidateWithError? I&apos;d feel better about the thread safety of this.

&gt; Source/WebKit/UIProcess/ios/ProcessAssertionIOS.mm:395
&gt; +    if (m_prepareForInvalidationHandler)

because I don&apos;t know how this is thread safe if this function doesn&apos;t get called on the main thread.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1777330</commentid>
    <comment_count>33</comment_count>
      <attachid>433613</attachid>
    <who name="Sihui Liu">sihui_liu</who>
    <bug_when>2021-07-15 14:02:57 -0700</bug_when>
    <thetext>Comment on attachment 433613
Patch

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

&gt;&gt; Source/WebKit/NetworkProcess/NetworkProcess.cpp:2219
&gt;&gt; +        for (auto&amp; server : m_webIDBServers.values())
&gt; 
&gt; Why is this loop still here?

Oh!

&gt;&gt; Source/WebKit/UIProcess/ios/ProcessAssertionIOS.mm:274
&gt;&gt; +    _prepareForInvalidationCallback();
&gt; 
&gt; Should we dispatch to the main thread here like we do in didInvalidateWithError? I&apos;d feel better about the thread safety of this.

Sure.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1777331</commentid>
    <comment_count>34</comment_count>
      <attachid>433623</attachid>
    <who name="Sihui Liu">sihui_liu</who>
    <bug_when>2021-07-15 14:04:05 -0700</bug_when>
    <thetext>Created attachment 433623
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1777336</commentid>
    <comment_count>35</comment_count>
      <attachid>433623</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2021-07-15 14:24:15 -0700</bug_when>
    <thetext>Comment on attachment 433623
Patch

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

r=me with minor comments.

&gt; Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.cpp:124
&gt;  

I think it would be helpful for debugging purposes to have release logging both in there and in resume().

&gt; Source/WebKit/NetworkProcess/IndexedDB/WebIDBServer.h:56
&gt; +    bool trySuspend(SuspendType);

I am still not super happy about the naming. Here is a proposal that I think I like better:
enum class OnlyIfIdle : bool { No, Yes };
bool suspend(OnlyIfIdle = OnlyIfIdle::No);

or
enum class SuspensionCondition : bool { Always, IfIdle };
bool suspend(SuspensionCondition = SuspendCondition::Always);

I changed my mind about the &quot;trySuspend&quot; naming. I think it will be clear if the enum parameter is nicely named.

&gt; Source/WebKit/UIProcess/ios/ProcessAssertionIOS.mm:397
&gt; +    RELEASE_LOG(ProcessSuspension, &quot;%p - ProcessAssertion::processAssertionWillBeInvalidated() PID=%d&quot;, this, m_pid);

ASSERT(RunLoop::isMain());</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1777337</commentid>
    <comment_count>36</comment_count>
      <attachid>433624</attachid>
    <who name="Sihui Liu">sihui_liu</who>
    <bug_when>2021-07-15 14:49:57 -0700</bug_when>
    <thetext>Created attachment 433624
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1777353</commentid>
    <comment_count>37</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2021-07-15 15:45:31 -0700</bug_when>
    <thetext>Committed r279966 (239709@main): &lt;https://commits.webkit.org/239709@main&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 433624.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>433092</attachid>
            <date>2021-07-07 16:43:10 -0700</date>
            <delta_ts>2021-07-07 21:40:46 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-227778-20210707164309.patch</filename>
            <type>text/plain</type>
            <size>7988</size>
            <attacher name="Sihui Liu">sihui_liu</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjc5NjQ0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDhjMTVlODFhNzAxOGZjYWVi
MmY3NTE0ODYxMzJmNmM0YjM2NzU3ZGIuLjBiNTMwY2I0ZTQzYzM3N2FjM2IzYzE2YjZjZDU2NmRi
NDQ4MmQxODIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjkgQEAKKzIwMjEtMDctMDcgIFNpaHVpIExp
dSAgPHNpaHVpX2xpdUBhcHBsZS5jb20+CisKKyAgICAgICAgU3VzcGVuZCBXZWJJREJTZXJ2ZXIg
d2hlbiBhc3NlcnRpb24gaW4gbmV0d29yayBpcyBnb2luZyB0byBiZSBpbnZhbGlkYXRlZAorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjI3Nzc4CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV2UgdGFrZSBhc3Nl
cnRpb24gZm9yIFNRTGl0ZSBhY3Rpdml0aWVzIGluIG5ldHdvcmsgcHJvY2VzcyBub3csIGFuZCBV
SSBwcm9jZXNzIGRvZXMgbm90IGtub3cgYWJvdXQgdGhlIFNRTGl0ZQorICAgICAgICBzdGF0ZSBv
ZiBuZXR3b3JrIHByb2Nlc3MsIHNvIFVJIHByb2Nlc3MgbWF5IHNlbmQgUHJlcGFyZVRvU3VzcGVu
ZCBtZXNzYWdlcyB0byBuZXR3b3JrIHByb2Nlc3Mgd2hlbiBuZXR3b3JrCisgICAgICAgIHByb2Nl
c3NlcyBoYXMgdGhlIGFzc2VydGluIHRvIHBlcmZvcm0gZGF0YWJhc2Ugb3BlcmF0aW9ucy4gV2hl
biBXZWJJREJTZXJ2ZXIgaXMgc3VzcGVuZGVkLCB0aGUgb25nb2luZyAKKyAgICAgICAgZGF0YWJh
c2UgdHJhbnNhY3Rpb25zIGFyZSBhYm9ydGVkLiBXZSBzaG91bGQgYXZvaWQgdW5uZWNlc3Nhcnkg
dHJhbnNhY3Rpb24gcm9sbGJhY2ssIHNvIG5ldHdvcmsgcHJvY2VzcyBzaG91bGQgCisgICAgICAg
IHN1c3BlbmQgV2ViSURCU2VydmVyIHdoZW4gYXNzZXJ0aW9uIGluIG5ldHdvcmsgcHJvY2Vzc3Mg
d2lsbCBiZSBpbnZhbGlkYXRlZCBpbnN0ZWFkIG9mIHdoZW4gcmVjZWl2aW5nIAorICAgICAgICBQ
cmVwYXJlVG9TdXNwZW5kIG1lc3NhZ2UuCisKKyAgICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9OZXR3
b3JrUHJvY2Vzcy5jcHA6CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtQcm9jZXNzOjpyZXN1bWUp
OgorICAgICAgICAqIE5ldHdvcmtQcm9jZXNzL2lvcy9OZXR3b3JrUHJvY2Vzc0lPUy5tbToKKyAg
ICAgICAgKFdlYktpdDo6TmV0d29ya1Byb2Nlc3M6OnNldElzSG9sZGluZ0xvY2tlZEZpbGVzKToK
KyAgICAgICAgKiBVSVByb2Nlc3MvUHJvY2Vzc0Fzc2VydGlvbi5oOgorICAgICAgICAoV2ViS2l0
OjpQcm9jZXNzQXNzZXJ0aW9uOjpzZXRQcmVwYXJlRm9ySW52YWxpZGF0aW9uSGFuZGxlcik6Cisg
ICAgICAgICogVUlQcm9jZXNzL2lvcy9Qcm9jZXNzQXNzZXJ0aW9uSU9TLm1tOgorICAgICAgICAo
LVtXS1JCU0Fzc2VydGlvbkRlbGVnYXRlIGRlYWxsb2NdKToKKyAgICAgICAgKC1bV0tSQlNBc3Nl
cnRpb25EZWxlZ2F0ZSBhc3NlcnRpb25XaWxsSW52YWxpZGF0ZTpdKToKKyAgICAgICAgKFdlYktp
dDo6UHJvY2Vzc0Fzc2VydGlvbjo6UHJvY2Vzc0Fzc2VydGlvbik6CisgICAgICAgIChXZWJLaXQ6
OlByb2Nlc3NBc3NlcnRpb246OnByb2Nlc3NBc3NlcnRpb25XaWxsQmVJbnZhbGlkYXRlZCk6CisK
IDIwMjEtMDctMDcgIENocmlzIER1bWV6ICA8Y2R1bWV6QGFwcGxlLmNvbT4KIAogICAgICAgICBb
bWFjT1NdIFN1c3BlbmQgV2ViUHJvY2Vzc2VzIHRoYXQgYXJlIGluIHRoZSBwcm9jZXNzIGNhY2hl
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L05ldHdvcmtQcm9jZXNzL05ldHdvcmtQcm9jZXNz
LmNwcCBiL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvTmV0d29ya1Byb2Nlc3MuY3BwCmlu
ZGV4IDAzNzRmNWM0N2E4MTlkNmE2OGY3NjIwN2RiMmYwM2FkOGMyMWY0OGQuLjUxODY1MGQ3NGY1
NTFlMzQ1NmRhNDJkZTc1NTcyOTZhNWQ3MDBmZmMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQv
TmV0d29ya1Byb2Nlc3MvTmV0d29ya1Byb2Nlc3MuY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQvTmV0
d29ya1Byb2Nlc3MvTmV0d29ya1Byb2Nlc3MuY3BwCkBAIC0yMjE1LDEyICsyMjE1LDYgQEAgdm9p
ZCBOZXR3b3JrUHJvY2Vzczo6cHJlcGFyZVRvU3VzcGVuZChib29sIGlzU3VzcGVuc2lvbkltbWlu
ZW50LCBDb21wbGV0aW9uSGFuZGwKIHsKICAgICBSRUxFQVNFX0xPRyhQcm9jZXNzU3VzcGVuc2lv
biwgIiVwIC0gTmV0d29ya1Byb2Nlc3M6OnByZXBhcmVUb1N1c3BlbmQoKSwgaXNTdXNwZW5zaW9u
SW1taW5lbnQ9JWQiLCB0aGlzLCBpc1N1c3BlbnNpb25JbW1pbmVudCk7CiAKLSNpZiBQTEFURk9S
TShJT1NfRkFNSUxZKQotICAgIGZvciAoYXV0byYgc2VydmVyIDogbV93ZWJJREJTZXJ2ZXJzLnZh
bHVlcygpKQotICAgICAgICBzZXJ2ZXItPnN1c3BlbmQoKTsKLSAgICBtX3Nob3VsZFN1c3BlbmRJ
REJTZXJ2ZXIgPSB0cnVlOwotI2VuZGlmCi0KICAgICBsb3dNZW1vcnlIYW5kbGVyKENyaXRpY2Fs
OjpZZXMpOwogCiAgICAgUmVmUHRyPENhbGxiYWNrQWdncmVnYXRvcj4gY2FsbGJhY2tBZ2dyZWdh
dG9yID0gQ2FsbGJhY2tBZ2dyZWdhdG9yOjpjcmVhdGUoW3RoaXMsIGNvbXBsZXRpb25IYW5kbGVy
ID0gV1RGTW92ZShjb21wbGV0aW9uSGFuZGxlcildKCkgbXV0YWJsZSB7CkBAIC0yMjc5LDExICsy
MjczLDEyIEBAIHZvaWQgTmV0d29ya1Byb2Nlc3M6OnJlc3VtZSgpCiAgICAgZm9yIChhdXRvJiBz
ZXJ2ZXIgOiBtX3N3U2VydmVycy52YWx1ZXMoKSkKICAgICAgICAgc2VydmVyLT5lbmRTdXNwZW5z
aW9uKCk7CiAjZW5kaWYKLSNpZiBQTEFURk9STShJT1NfRkFNSUxZKQotICAgIGZvciAoYXV0byYg
c2VydmVyIDogbV93ZWJJREJTZXJ2ZXJzLnZhbHVlcygpKQotICAgICAgICBzZXJ2ZXItPnJlc3Vt
ZSgpOwotICAgIG1fc2hvdWxkU3VzcGVuZElEQlNlcnZlciA9IGZhbHNlOwotI2VuZGlmCisKKyAg
ICBpZiAobV9zaG91bGRTdXNwZW5kSURCU2VydmVyKSB7CisgICAgICAgIGZvciAoYXV0byYgc2Vy
dmVyIDogbV93ZWJJREJTZXJ2ZXJzLnZhbHVlcygpKQorICAgICAgICAgICAgc2VydmVyLT5yZXN1
bWUoKTsKKyAgICAgICAgbV9zaG91bGRTdXNwZW5kSURCU2VydmVyID0gZmFsc2U7CisgICAgfQog
CiAgICAgbV9zdG9yYWdlTWFuYWdlclNldC0+cmVzdW1lKCk7CiB9CmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViS2l0L05ldHdvcmtQcm9jZXNzL2lvcy9OZXR3b3JrUHJvY2Vzc0lPUy5tbSBiL1NvdXJj
ZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvaW9zL05ldHdvcmtQcm9jZXNzSU9TLm1tCmluZGV4IDY0
OTRiNWE3OThhZjY5MDgxZWEzZDdhNWEzY2M1NWVjODI3ZTRiZjQuLmQyMTAzZmNhMDQ0ZjUwMmQ0
NGIzMDY0ZTQyNDI3ZmNhZGRjZmRhMzEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvTmV0d29y
a1Byb2Nlc3MvaW9zL05ldHdvcmtQcm9jZXNzSU9TLm1tCisrKyBiL1NvdXJjZS9XZWJLaXQvTmV0
d29ya1Byb2Nlc3MvaW9zL05ldHdvcmtQcm9jZXNzSU9TLm1tCkBAIC0xMTMsNiArMTEzLDE2IEBA
IHZvaWQgTmV0d29ya1Byb2Nlc3M6OnNldElzSG9sZGluZ0xvY2tlZEZpbGVzKGJvb2wgaXNIb2xk
aW5nTG9ja2VkRmlsZXMpCiAgICAgLy8gV2Ugc3luY2hyb25vdXNseSB0YWtlIGEgcHJvY2VzcyBh
c3NlcnRpb24gd2hlbiBiZWdpbm5pbmcgYSBTUUxpdGUgdHJhbnNhY3Rpb24gc28gdGhhdCB3ZSBk
b24ndCBnZXQgc3VzcGVuZGVkCiAgICAgLy8gd2hpbGUgaG9sZGluZyBhIGxvY2tlZCBmaWxlLiBX
ZSB3b3VsZCBnZXQga2lsbGVkIGlmIHN1c3BlbmRlZCB3aGlsZSBob2xkaW5nIGxvY2tlZCBmaWxl
cy4KICAgICBtX2hvbGRpbmdMb2NrZWRGaWxlQXNzZXJ0aW9uID0gUHJvY2Vzc0Fzc2VydGlvbjo6
Y3JlYXRlKGdldEN1cnJlbnRQcm9jZXNzSUQoKSwgIk5ldHdvcmsgUHJvY2VzcyBpcyBob2xkaW5n
IGxvY2tlZCBmaWxlcyJfcywgUHJvY2Vzc0Fzc2VydGlvblR5cGU6OkZpbmlzaFRhc2tVbmludGVy
cnVwdGFibGUsIFByb2Nlc3NBc3NlcnRpb246Ok1vZGU6OlN5bmMpOworICAgIG1faG9sZGluZ0xv
Y2tlZEZpbGVBc3NlcnRpb24tPnNldFByZXBhcmVGb3JJbnZhbGlkYXRpb25IYW5kbGVyKFt0aGlz
LCB3ZWFrVGhpcyA9IG1ha2VXZWFrUHRyKCp0aGlzKV0oKSBtdXRhYmxlIHsKKyAgICAgICAgY2Fs
bE9uTWFpblJ1bkxvb3BBbmRXYWl0KFt0aGlzLCB3ZWFrVGhpcyA9IFdURk1vdmUod2Vha1RoaXMp
XSgpIHsKKyAgICAgICAgICAgIGlmICghd2Vha1RoaXMpCisgICAgICAgICAgICAgICAgcmV0dXJu
OworCisgICAgICAgICAgICBmb3IgKGF1dG8mIHNlcnZlciA6IG1fd2ViSURCU2VydmVycy52YWx1
ZXMoKSkKKyAgICAgICAgICAgICAgICBzZXJ2ZXItPnN1c3BlbmQoKTsKKyAgICAgICAgICAgIG1f
c2hvdWxkU3VzcGVuZElEQlNlcnZlciA9IHRydWU7CisgICAgICAgIH0pOworICAgIH0pOwogfQog
CiB9IC8vIG5hbWVzcGFjZSBXZWJLaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvVUlQcm9j
ZXNzL1Byb2Nlc3NBc3NlcnRpb24uaCBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1Byb2Nlc3NB
c3NlcnRpb24uaAppbmRleCA3MjEwM2MzMWFiYjA0MmI3ZjhmYzEzOGZjNzEwNzJmNWMxYWVjMTQ2
Li5mNjllYTJiNzc0MTJkM2I0MTIxZGJhYzg4OWIxMzQ4NzNkOGFlYmU2IDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9Qcm9jZXNzQXNzZXJ0aW9uLmgKKysrIGIvU291cmNlL1dl
YktpdC9VSVByb2Nlc3MvUHJvY2Vzc0Fzc2VydGlvbi5oCkBAIC03Miw2ICs3Miw3IEBAIHB1Ymxp
YzoKICAgICB9CiAgICAgdmlydHVhbCB+UHJvY2Vzc0Fzc2VydGlvbigpOwogCisgICAgdm9pZCBz
ZXRQcmVwYXJlRm9ySW52YWxpZGF0aW9uSGFuZGxlcihGdW5jdGlvbjx2b2lkKCk+JiYgaGFuZGxl
cikgeyBtX3ByZXBhcmVGb3JJbnZhbGlkYXRpb25IYW5kbGVyID0gV1RGTW92ZShoYW5kbGVyKTsg
fQogICAgIHZvaWQgc2V0SW52YWxpZGF0aW9uSGFuZGxlcihGdW5jdGlvbjx2b2lkKCk+JiYgaGFu
ZGxlcikgeyBtX2ludmFsaWRhdGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGhhbmRsZXIpOyB9CiAKICAg
ICBQcm9jZXNzQXNzZXJ0aW9uVHlwZSB0eXBlKCkgY29uc3QgeyByZXR1cm4gbV9hc3NlcnRpb25U
eXBlOyB9CkBAIC04Niw2ICs4Nyw3IEBAIHByb3RlY3RlZDoKICAgICB2b2lkIGFjcXVpcmVTeW5j
KCk7CiAKICNpZiBQTEFURk9STShJT1NfRkFNSUxZKQorICAgIHZvaWQgcHJvY2Vzc0Fzc2VydGlv
bldpbGxCZUludmFsaWRhdGVkKCk7CiAgICAgdmlydHVhbCB2b2lkIHByb2Nlc3NBc3NlcnRpb25X
YXNJbnZhbGlkYXRlZCgpOwogI2VuZGlmCiAKQEAgLTk4LDYgKzEwMCw3IEBAIHByaXZhdGU6CiAg
ICAgUmV0YWluUHRyPFdLUkJTQXNzZXJ0aW9uRGVsZWdhdGU+IG1fZGVsZWdhdGU7CiAgICAgYm9v
bCBtX3dhc0ludmFsaWRhdGVkIHsgZmFsc2UgfTsKICNlbmRpZgorICAgIEZ1bmN0aW9uPHZvaWQo
KT4gbV9wcmVwYXJlRm9ySW52YWxpZGF0aW9uSGFuZGxlcjsKICAgICBGdW5jdGlvbjx2b2lkKCk+
IG1faW52YWxpZGF0aW9uSGFuZGxlcjsKIH07CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQv
VUlQcm9jZXNzL2lvcy9Qcm9jZXNzQXNzZXJ0aW9uSU9TLm1tIGIvU291cmNlL1dlYktpdC9VSVBy
b2Nlc3MvaW9zL1Byb2Nlc3NBc3NlcnRpb25JT1MubW0KaW5kZXggYzE3ZWVjMzZlY2QxMzIyNmMw
ZGYwZjIyM2YzMjkwZGYzYjVjZmI1OC4uM2VhYjgzMWIwZGY2NzBmODFkYzQxOWY3ZjQ5MTFlMmE0
OTUzMGI5MSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvaW9zL1Byb2Nlc3NB
c3NlcnRpb25JT1MubW0KKysrIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvaW9zL1Byb2Nlc3NB
c3NlcnRpb25JT1MubW0KQEAgLTI1NSwxMiArMjU1LDE0IEBAIHN0YXRpYyBib29sIHByb2Nlc3NI
YXNBY3RpdmVSdW5UaW1lTGltaXRhdGlvbigpCiB0eXBlZGVmIHZvaWQoXlJCU0Fzc2VydGlvbklu
dmFsaWRhdGlvbkNhbGxiYWNrVHlwZSkoKTsKIAogQGludGVyZmFjZSBXS1JCU0Fzc2VydGlvbkRl
bGVnYXRlIDogTlNPYmplY3Q8UkJTQXNzZXJ0aW9uT2JzZXJ2aW5nPgorQHByb3BlcnR5IChjb3B5
KSBSQlNBc3NlcnRpb25JbnZhbGlkYXRpb25DYWxsYmFja1R5cGUgcHJlcGFyZUZvckludmFsaWRh
dGlvbkNhbGxiYWNrOwogQHByb3BlcnR5IChjb3B5KSBSQlNBc3NlcnRpb25JbnZhbGlkYXRpb25D
YWxsYmFja1R5cGUgaW52YWxpZGF0aW9uQ2FsbGJhY2s7CiBAZW5kCiAKIEBpbXBsZW1lbnRhdGlv
biBXS1JCU0Fzc2VydGlvbkRlbGVnYXRlCiAtICh2b2lkKWRlYWxsb2MKIHsKKyAgICBbX3ByZXBh
cmVGb3JJbnZhbGlkYXRpb25DYWxsYmFjayByZWxlYXNlXTsKICAgICBbX2ludmFsaWRhdGlvbkNh
bGxiYWNrIHJlbGVhc2VdOwogICAgIFtzdXBlciBkZWFsbG9jXTsKIH0KQEAgLTI2OCw2ICsyNzAs
OCBAQCB0eXBlZGVmIHZvaWQoXlJCU0Fzc2VydGlvbkludmFsaWRhdGlvbkNhbGxiYWNrVHlwZSko
KTsKIC0gKHZvaWQpYXNzZXJ0aW9uV2lsbEludmFsaWRhdGU6KFJCU0Fzc2VydGlvbiAqKWFzc2Vy
dGlvbgogewogICAgIFJFTEVBU0VfTE9HKFByb2Nlc3NTdXNwZW5zaW9uLCAiJXAgLSBXS1JCU0Fz
c2VydGlvbkRlbGVnYXRlOiBhc3NlcnRpb25XaWxsSW52YWxpZGF0ZSIsIHNlbGYpOworCisgICAg
X3ByZXBhcmVGb3JJbnZhbGlkYXRpb25DYWxsYmFjaygpOwogfQogCiAtICh2b2lkKWFzc2VydGlv
bjooUkJTQXNzZXJ0aW9uICopYXNzZXJ0aW9uIGRpZEludmFsaWRhdGVXaXRoRXJyb3I6KE5TRXJy
b3IgKillcnJvcgpAQCAtMzM5LDYgKzM0MywxMCBAQCBQcm9jZXNzQXNzZXJ0aW9uOjpQcm9jZXNz
QXNzZXJ0aW9uKHBpZF90IHBpZCwgY29uc3QgU3RyaW5nJiByZWFzb24sIFByb2Nlc3NBc3Nlcgog
ICAgICAgICBSRUxFQVNFX0xPRyhQcm9jZXNzU3VzcGVuc2lvbiwgIiVwIC0gUHJvY2Vzc0Fzc2Vy
dGlvbjogUkJTICV7cHVibGljfUAgYXNzZXJ0aW9uIGZvciBwcm9jZXNzIHdpdGggUElEPSVkIHdh
cyBpbnZhbGlkYXRlZCIsIHRoaXMsIHJ1bm5pbmdCb2FyZEFzc2VydGlvbk5hbWUsIHBpZCk7CiAg
ICAgICAgIHByb2Nlc3NBc3NlcnRpb25XYXNJbnZhbGlkYXRlZCgpOwogICAgIH07CisgICAgbV9k
ZWxlZ2F0ZS5nZXQoKS5wcmVwYXJlRm9ySW52YWxpZGF0aW9uQ2FsbGJhY2sgPSBeeworICAgICAg
ICBSRUxFQVNFX0xPRyhQcm9jZXNzU3VzcGVuc2lvbiwgIiVwIC0gUHJvY2Vzc0Fzc2VydGlvbigp
IFJCUyAle3B1YmxpY31AIGFzc2VydGlvbiBmb3IgcHJvY2VzcyB3aXRoIFBJRD0lZCB3aWxsIGJl
IGludmFsaWRhdGVkIiwgdGhpcywgcnVubmluZ0JvYXJkQXNzZXJ0aW9uTmFtZSwgcGlkKTsKKyAg
ICAgICAgcHJvY2Vzc0Fzc2VydGlvbldpbGxCZUludmFsaWRhdGVkKCk7CisgICAgfTsKIH0KIAog
dm9pZCBQcm9jZXNzQXNzZXJ0aW9uOjphY3F1aXJlQXN5bmMoQ29tcGxldGlvbkhhbmRsZXI8dm9p
ZCgpPiYmIGNvbXBsZXRpb25IYW5kbGVyKQpAQCAtMzc1LDYgKzM4MywxNCBAQCBQcm9jZXNzQXNz
ZXJ0aW9uOjp+UHJvY2Vzc0Fzc2VydGlvbigpCiAgICAgfQogfQogCit2b2lkIFByb2Nlc3NBc3Nl
cnRpb246OnByb2Nlc3NBc3NlcnRpb25XaWxsQmVJbnZhbGlkYXRlZCgpCit7CisgICAgUkVMRUFT
RV9MT0coUHJvY2Vzc1N1c3BlbnNpb24sICIlcCAtIFByb2Nlc3NBc3NlcnRpb246OnByb2Nlc3NB
c3NlcnRpb25XaWxsQmVJbnZhbGlkYXRlZCgpIFBJRD0lZCIsIHRoaXMsIG1fcGlkKTsKKworICAg
IGlmIChtX3ByZXBhcmVGb3JJbnZhbGlkYXRpb25IYW5kbGVyKQorICAgICAgICBtX3ByZXBhcmVG
b3JJbnZhbGlkYXRpb25IYW5kbGVyKCk7Cit9CisKIHZvaWQgUHJvY2Vzc0Fzc2VydGlvbjo6cHJv
Y2Vzc0Fzc2VydGlvbldhc0ludmFsaWRhdGVkKCkKIHsKICAgICBBU1NFUlQoUnVuTG9vcDo6aXNN
YWluKCkpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>433116</attachid>
            <date>2021-07-07 21:40:47 -0700</date>
            <delta_ts>2021-07-14 15:53:46 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-227778-20210707214047.patch</filename>
            <type>text/plain</type>
            <size>11605</size>
            <attacher name="Sihui Liu">sihui_liu</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjc5NjQ0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDhjMTVlODFhNzAxOGZjYWVi
MmY3NTE0ODYxMzJmNmM0YjM2NzU3ZGIuLmMzY2MzNGVmMmI0MzZlMmJjZmIxYzU2NjE2NWU3NGVl
OTIyNTg1OWIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzAgQEAKKzIwMjEtMDctMDcgIFNpaHVpIExp
dSAgPHNpaHVpX2xpdUBhcHBsZS5jb20+CisKKyAgICAgICAgU3VzcGVuZCBXZWJJREJTZXJ2ZXIg
d2hlbiBhc3NlcnRpb24gaW4gbmV0d29yayBpcyBnb2luZyB0byBiZSBpbnZhbGlkYXRlZAorICAg
ICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjI3Nzc4CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV2UgdGFrZSBhc3Nl
cnRpb24gZm9yIFNRTGl0ZSBhY3Rpdml0aWVzIGluIG5ldHdvcmsgcHJvY2VzcyBub3csIGFuZCBV
SSBwcm9jZXNzIGRvZXMgbm90IGtub3cgYWJvdXQgdGhlIFNRTGl0ZQorICAgICAgICBzdGF0ZSBv
ZiBuZXR3b3JrIHByb2Nlc3MsIHNvIFVJIHByb2Nlc3MgbWF5IHNlbmQgUHJlcGFyZVRvU3VzcGVu
ZCBtZXNzYWdlcyB0byBuZXR3b3JrIHByb2Nlc3Mgd2hlbiBuZXR3b3JrCisgICAgICAgIHByb2Nl
c3NlcyBoYXMgdGhlIGFzc2VydGluIHRvIHBlcmZvcm0gZGF0YWJhc2Ugb3BlcmF0aW9ucy4gV2hl
biBXZWJJREJTZXJ2ZXIgaXMgc3VzcGVuZGVkLCB0aGUgb25nb2luZyAKKyAgICAgICAgZGF0YWJh
c2UgdHJhbnNhY3Rpb25zIGFyZSBhYm9ydGVkLiBXZSBzaG91bGQgYXZvaWQgdW5uZWNlc3Nhcnkg
dHJhbnNhY3Rpb24gcm9sbGJhY2ssIHNvIG5ldHdvcmsgcHJvY2VzcyBzaG91bGQgCisgICAgICAg
IHN1c3BlbmQgV2ViSURCU2VydmVyIHdoZW4gYXNzZXJ0aW9uIGluIG5ldHdvcmsgcHJvY2Vzc3Mg
d2lsbCBiZSBpbnZhbGlkYXRlZCBpbnN0ZWFkIG9mIHdoZW4gcmVjZWl2aW5nIAorICAgICAgICBQ
cmVwYXJlVG9TdXNwZW5kIG1lc3NhZ2UuCisKKyAgICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9OZXR3
b3JrUHJvY2Vzcy5jcHA6CisgICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtQcm9jZXNzOjpwcmVwYXJl
VG9TdXNwZW5kKToKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya1Byb2Nlc3M6OnJlc3VtZSk6Cisg
ICAgICAgICogTmV0d29ya1Byb2Nlc3MvaW9zL05ldHdvcmtQcm9jZXNzSU9TLm1tOgorICAgICAg
ICAoV2ViS2l0OjpOZXR3b3JrUHJvY2Vzczo6c2V0SXNIb2xkaW5nTG9ja2VkRmlsZXMpOgorICAg
ICAgICAqIFVJUHJvY2Vzcy9Qcm9jZXNzQXNzZXJ0aW9uLmg6CisgICAgICAgIChXZWJLaXQ6OlBy
b2Nlc3NBc3NlcnRpb246OnNldFByZXBhcmVGb3JJbnZhbGlkYXRpb25IYW5kbGVyKToKKyAgICAg
ICAgKiBVSVByb2Nlc3MvaW9zL1Byb2Nlc3NBc3NlcnRpb25JT1MubW06CisgICAgICAgICgtW1dL
UkJTQXNzZXJ0aW9uRGVsZWdhdGUgZGVhbGxvY10pOgorICAgICAgICAoLVtXS1JCU0Fzc2VydGlv
bkRlbGVnYXRlIGFzc2VydGlvbldpbGxJbnZhbGlkYXRlOl0pOgorICAgICAgICAoV2ViS2l0OjpQ
cm9jZXNzQXNzZXJ0aW9uOjpQcm9jZXNzQXNzZXJ0aW9uKToKKyAgICAgICAgKFdlYktpdDo6UHJv
Y2Vzc0Fzc2VydGlvbjo6cHJvY2Vzc0Fzc2VydGlvbldpbGxCZUludmFsaWRhdGVkKToKKwogMjAy
MS0wNy0wNyAgQ2hyaXMgRHVtZXogIDxjZHVtZXpAYXBwbGUuY29tPgogCiAgICAgICAgIFttYWNP
U10gU3VzcGVuZCBXZWJQcm9jZXNzZXMgdGhhdCBhcmUgaW4gdGhlIHByb2Nlc3MgY2FjaGUKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvTmV0d29ya1Byb2Nlc3MuY3Bw
IGIvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9OZXR3b3JrUHJvY2Vzcy5jcHAKaW5kZXgg
MDM3NGY1YzQ3YTgxOWQ2YTY4Zjc2MjA3ZGIyZjAzYWQ4YzIxZjQ4ZC4uNTE4NjUwZDc0ZjU1MWUz
NDU2ZGE0MmRlNzU1NzI5NmE1ZDcwMGZmYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9OZXR3
b3JrUHJvY2Vzcy9OZXR3b3JrUHJvY2Vzcy5jcHAKKysrIGIvU291cmNlL1dlYktpdC9OZXR3b3Jr
UHJvY2Vzcy9OZXR3b3JrUHJvY2Vzcy5jcHAKQEAgLTIyMTUsMTIgKzIyMTUsNiBAQCB2b2lkIE5l
dHdvcmtQcm9jZXNzOjpwcmVwYXJlVG9TdXNwZW5kKGJvb2wgaXNTdXNwZW5zaW9uSW1taW5lbnQs
IENvbXBsZXRpb25IYW5kbAogewogICAgIFJFTEVBU0VfTE9HKFByb2Nlc3NTdXNwZW5zaW9uLCAi
JXAgLSBOZXR3b3JrUHJvY2Vzczo6cHJlcGFyZVRvU3VzcGVuZCgpLCBpc1N1c3BlbnNpb25JbW1p
bmVudD0lZCIsIHRoaXMsIGlzU3VzcGVuc2lvbkltbWluZW50KTsKIAotI2lmIFBMQVRGT1JNKElP
U19GQU1JTFkpCi0gICAgZm9yIChhdXRvJiBzZXJ2ZXIgOiBtX3dlYklEQlNlcnZlcnMudmFsdWVz
KCkpCi0gICAgICAgIHNlcnZlci0+c3VzcGVuZCgpOwotICAgIG1fc2hvdWxkU3VzcGVuZElEQlNl
cnZlciA9IHRydWU7Ci0jZW5kaWYKLQogICAgIGxvd01lbW9yeUhhbmRsZXIoQ3JpdGljYWw6Olll
cyk7CiAKICAgICBSZWZQdHI8Q2FsbGJhY2tBZ2dyZWdhdG9yPiBjYWxsYmFja0FnZ3JlZ2F0b3Ig
PSBDYWxsYmFja0FnZ3JlZ2F0b3I6OmNyZWF0ZShbdGhpcywgY29tcGxldGlvbkhhbmRsZXIgPSBX
VEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKV0oKSBtdXRhYmxlIHsKQEAgLTIyNzksMTEgKzIyNzMs
MTIgQEAgdm9pZCBOZXR3b3JrUHJvY2Vzczo6cmVzdW1lKCkKICAgICBmb3IgKGF1dG8mIHNlcnZl
ciA6IG1fc3dTZXJ2ZXJzLnZhbHVlcygpKQogICAgICAgICBzZXJ2ZXItPmVuZFN1c3BlbnNpb24o
KTsKICNlbmRpZgotI2lmIFBMQVRGT1JNKElPU19GQU1JTFkpCi0gICAgZm9yIChhdXRvJiBzZXJ2
ZXIgOiBtX3dlYklEQlNlcnZlcnMudmFsdWVzKCkpCi0gICAgICAgIHNlcnZlci0+cmVzdW1lKCk7
Ci0gICAgbV9zaG91bGRTdXNwZW5kSURCU2VydmVyID0gZmFsc2U7Ci0jZW5kaWYKKworICAgIGlm
IChtX3Nob3VsZFN1c3BlbmRJREJTZXJ2ZXIpIHsKKyAgICAgICAgZm9yIChhdXRvJiBzZXJ2ZXIg
OiBtX3dlYklEQlNlcnZlcnMudmFsdWVzKCkpCisgICAgICAgICAgICBzZXJ2ZXItPnJlc3VtZSgp
OworICAgICAgICBtX3Nob3VsZFN1c3BlbmRJREJTZXJ2ZXIgPSBmYWxzZTsKKyAgICB9CiAKICAg
ICBtX3N0b3JhZ2VNYW5hZ2VyU2V0LT5yZXN1bWUoKTsKIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJLaXQvTmV0d29ya1Byb2Nlc3MvaW9zL05ldHdvcmtQcm9jZXNzSU9TLm1tIGIvU291cmNlL1dl
YktpdC9OZXR3b3JrUHJvY2Vzcy9pb3MvTmV0d29ya1Byb2Nlc3NJT1MubW0KaW5kZXggNjQ5NGI1
YTc5OGFmNjkwODFlYTNkN2E1YTNjYzU1ZWM4MjdlNGJmNC4uZDIxMDNmY2EwNDRmNTAyZDQ0YjMw
NjRlNDI0MjdmY2FkZGNmZGEzMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9OZXR3b3JrUHJv
Y2Vzcy9pb3MvTmV0d29ya1Byb2Nlc3NJT1MubW0KKysrIGIvU291cmNlL1dlYktpdC9OZXR3b3Jr
UHJvY2Vzcy9pb3MvTmV0d29ya1Byb2Nlc3NJT1MubW0KQEAgLTExMyw2ICsxMTMsMTYgQEAgdm9p
ZCBOZXR3b3JrUHJvY2Vzczo6c2V0SXNIb2xkaW5nTG9ja2VkRmlsZXMoYm9vbCBpc0hvbGRpbmdM
b2NrZWRGaWxlcykKICAgICAvLyBXZSBzeW5jaHJvbm91c2x5IHRha2UgYSBwcm9jZXNzIGFzc2Vy
dGlvbiB3aGVuIGJlZ2lubmluZyBhIFNRTGl0ZSB0cmFuc2FjdGlvbiBzbyB0aGF0IHdlIGRvbid0
IGdldCBzdXNwZW5kZWQKICAgICAvLyB3aGlsZSBob2xkaW5nIGEgbG9ja2VkIGZpbGUuIFdlIHdv
dWxkIGdldCBraWxsZWQgaWYgc3VzcGVuZGVkIHdoaWxlIGhvbGRpbmcgbG9ja2VkIGZpbGVzLgog
ICAgIG1faG9sZGluZ0xvY2tlZEZpbGVBc3NlcnRpb24gPSBQcm9jZXNzQXNzZXJ0aW9uOjpjcmVh
dGUoZ2V0Q3VycmVudFByb2Nlc3NJRCgpLCAiTmV0d29yayBQcm9jZXNzIGlzIGhvbGRpbmcgbG9j
a2VkIGZpbGVzIl9zLCBQcm9jZXNzQXNzZXJ0aW9uVHlwZTo6RmluaXNoVGFza1VuaW50ZXJydXB0
YWJsZSwgUHJvY2Vzc0Fzc2VydGlvbjo6TW9kZTo6U3luYyk7CisgICAgbV9ob2xkaW5nTG9ja2Vk
RmlsZUFzc2VydGlvbi0+c2V0UHJlcGFyZUZvckludmFsaWRhdGlvbkhhbmRsZXIoW3RoaXMsIHdl
YWtUaGlzID0gbWFrZVdlYWtQdHIoKnRoaXMpXSgpIG11dGFibGUgeworICAgICAgICBjYWxsT25N
YWluUnVuTG9vcEFuZFdhaXQoW3RoaXMsIHdlYWtUaGlzID0gV1RGTW92ZSh3ZWFrVGhpcyldKCkg
eworICAgICAgICAgICAgaWYgKCF3ZWFrVGhpcykKKyAgICAgICAgICAgICAgICByZXR1cm47CisK
KyAgICAgICAgICAgIGZvciAoYXV0byYgc2VydmVyIDogbV93ZWJJREJTZXJ2ZXJzLnZhbHVlcygp
KQorICAgICAgICAgICAgICAgIHNlcnZlci0+c3VzcGVuZCgpOworICAgICAgICAgICAgbV9zaG91
bGRTdXNwZW5kSURCU2VydmVyID0gdHJ1ZTsKKyAgICAgICAgfSk7CisgICAgfSk7CiB9CiAKIH0g
Ly8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3Mv
UHJvY2Vzc0Fzc2VydGlvbi5oIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvUHJvY2Vzc0Fzc2Vy
dGlvbi5oCmluZGV4IDcyMTAzYzMxYWJiMDQyYjdmOGZjMTM4ZmM3MTA3MmY1YzFhZWMxNDYuLmY2
OWVhMmI3NzQxMmQzYjQxMjFkYmFjODg5YjEzNDg3M2Q4YWViZTYgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJLaXQvVUlQcm9jZXNzL1Byb2Nlc3NBc3NlcnRpb24uaAorKysgYi9Tb3VyY2UvV2ViS2l0
L1VJUHJvY2Vzcy9Qcm9jZXNzQXNzZXJ0aW9uLmgKQEAgLTcyLDYgKzcyLDcgQEAgcHVibGljOgog
ICAgIH0KICAgICB2aXJ0dWFsIH5Qcm9jZXNzQXNzZXJ0aW9uKCk7CiAKKyAgICB2b2lkIHNldFBy
ZXBhcmVGb3JJbnZhbGlkYXRpb25IYW5kbGVyKEZ1bmN0aW9uPHZvaWQoKT4mJiBoYW5kbGVyKSB7
IG1fcHJlcGFyZUZvckludmFsaWRhdGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGhhbmRsZXIpOyB9CiAg
ICAgdm9pZCBzZXRJbnZhbGlkYXRpb25IYW5kbGVyKEZ1bmN0aW9uPHZvaWQoKT4mJiBoYW5kbGVy
KSB7IG1faW52YWxpZGF0aW9uSGFuZGxlciA9IFdURk1vdmUoaGFuZGxlcik7IH0KIAogICAgIFBy
b2Nlc3NBc3NlcnRpb25UeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiBtX2Fzc2VydGlvblR5cGU7
IH0KQEAgLTg2LDYgKzg3LDcgQEAgcHJvdGVjdGVkOgogICAgIHZvaWQgYWNxdWlyZVN5bmMoKTsK
IAogI2lmIFBMQVRGT1JNKElPU19GQU1JTFkpCisgICAgdm9pZCBwcm9jZXNzQXNzZXJ0aW9uV2ls
bEJlSW52YWxpZGF0ZWQoKTsKICAgICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0Fzc2VydGlvbldhc0lu
dmFsaWRhdGVkKCk7CiAjZW5kaWYKIApAQCAtOTgsNiArMTAwLDcgQEAgcHJpdmF0ZToKICAgICBS
ZXRhaW5QdHI8V0tSQlNBc3NlcnRpb25EZWxlZ2F0ZT4gbV9kZWxlZ2F0ZTsKICAgICBib29sIG1f
d2FzSW52YWxpZGF0ZWQgeyBmYWxzZSB9OwogI2VuZGlmCisgICAgRnVuY3Rpb248dm9pZCgpPiBt
X3ByZXBhcmVGb3JJbnZhbGlkYXRpb25IYW5kbGVyOwogICAgIEZ1bmN0aW9uPHZvaWQoKT4gbV9p
bnZhbGlkYXRpb25IYW5kbGVyOwogfTsKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9VSVBy
b2Nlc3MvaW9zL1Byb2Nlc3NBc3NlcnRpb25JT1MubW0gYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vz
cy9pb3MvUHJvY2Vzc0Fzc2VydGlvbklPUy5tbQppbmRleCBjMTdlZWMzNmVjZDEzMjI2YzBkZjBm
MjIzZjMyOTBkZjNiNWNmYjU4Li4zZWFiODMxYjBkZjY3MGY4MWRjNDE5ZjdmNDkxMWUyYTQ5NTMw
YjkxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9pb3MvUHJvY2Vzc0Fzc2Vy
dGlvbklPUy5tbQorKysgYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9pb3MvUHJvY2Vzc0Fzc2Vy
dGlvbklPUy5tbQpAQCAtMjU1LDEyICsyNTUsMTQgQEAgc3RhdGljIGJvb2wgcHJvY2Vzc0hhc0Fj
dGl2ZVJ1blRpbWVMaW1pdGF0aW9uKCkKIHR5cGVkZWYgdm9pZCheUkJTQXNzZXJ0aW9uSW52YWxp
ZGF0aW9uQ2FsbGJhY2tUeXBlKSgpOwogCiBAaW50ZXJmYWNlIFdLUkJTQXNzZXJ0aW9uRGVsZWdh
dGUgOiBOU09iamVjdDxSQlNBc3NlcnRpb25PYnNlcnZpbmc+CitAcHJvcGVydHkgKGNvcHkpIFJC
U0Fzc2VydGlvbkludmFsaWRhdGlvbkNhbGxiYWNrVHlwZSBwcmVwYXJlRm9ySW52YWxpZGF0aW9u
Q2FsbGJhY2s7CiBAcHJvcGVydHkgKGNvcHkpIFJCU0Fzc2VydGlvbkludmFsaWRhdGlvbkNhbGxi
YWNrVHlwZSBpbnZhbGlkYXRpb25DYWxsYmFjazsKIEBlbmQKIAogQGltcGxlbWVudGF0aW9uIFdL
UkJTQXNzZXJ0aW9uRGVsZWdhdGUKIC0gKHZvaWQpZGVhbGxvYwogeworICAgIFtfcHJlcGFyZUZv
ckludmFsaWRhdGlvbkNhbGxiYWNrIHJlbGVhc2VdOwogICAgIFtfaW52YWxpZGF0aW9uQ2FsbGJh
Y2sgcmVsZWFzZV07CiAgICAgW3N1cGVyIGRlYWxsb2NdOwogfQpAQCAtMjY4LDYgKzI3MCw4IEBA
IHR5cGVkZWYgdm9pZCheUkJTQXNzZXJ0aW9uSW52YWxpZGF0aW9uQ2FsbGJhY2tUeXBlKSgpOwog
LSAodm9pZClhc3NlcnRpb25XaWxsSW52YWxpZGF0ZTooUkJTQXNzZXJ0aW9uICopYXNzZXJ0aW9u
CiB7CiAgICAgUkVMRUFTRV9MT0coUHJvY2Vzc1N1c3BlbnNpb24sICIlcCAtIFdLUkJTQXNzZXJ0
aW9uRGVsZWdhdGU6IGFzc2VydGlvbldpbGxJbnZhbGlkYXRlIiwgc2VsZik7CisKKyAgICBfcHJl
cGFyZUZvckludmFsaWRhdGlvbkNhbGxiYWNrKCk7CiB9CiAKIC0gKHZvaWQpYXNzZXJ0aW9uOihS
QlNBc3NlcnRpb24gKilhc3NlcnRpb24gZGlkSW52YWxpZGF0ZVdpdGhFcnJvcjooTlNFcnJvciAq
KWVycm9yCkBAIC0zMzksNiArMzQzLDEwIEBAIFByb2Nlc3NBc3NlcnRpb246OlByb2Nlc3NBc3Nl
cnRpb24ocGlkX3QgcGlkLCBjb25zdCBTdHJpbmcmIHJlYXNvbiwgUHJvY2Vzc0Fzc2VyCiAgICAg
ICAgIFJFTEVBU0VfTE9HKFByb2Nlc3NTdXNwZW5zaW9uLCAiJXAgLSBQcm9jZXNzQXNzZXJ0aW9u
OiBSQlMgJXtwdWJsaWN9QCBhc3NlcnRpb24gZm9yIHByb2Nlc3Mgd2l0aCBQSUQ9JWQgd2FzIGlu
dmFsaWRhdGVkIiwgdGhpcywgcnVubmluZ0JvYXJkQXNzZXJ0aW9uTmFtZSwgcGlkKTsKICAgICAg
ICAgcHJvY2Vzc0Fzc2VydGlvbldhc0ludmFsaWRhdGVkKCk7CiAgICAgfTsKKyAgICBtX2RlbGVn
YXRlLmdldCgpLnByZXBhcmVGb3JJbnZhbGlkYXRpb25DYWxsYmFjayA9IF57CisgICAgICAgIFJF
TEVBU0VfTE9HKFByb2Nlc3NTdXNwZW5zaW9uLCAiJXAgLSBQcm9jZXNzQXNzZXJ0aW9uKCkgUkJT
ICV7cHVibGljfUAgYXNzZXJ0aW9uIGZvciBwcm9jZXNzIHdpdGggUElEPSVkIHdpbGwgYmUgaW52
YWxpZGF0ZWQiLCB0aGlzLCBydW5uaW5nQm9hcmRBc3NlcnRpb25OYW1lLCBwaWQpOworICAgICAg
ICBwcm9jZXNzQXNzZXJ0aW9uV2lsbEJlSW52YWxpZGF0ZWQoKTsKKyAgICB9OwogfQogCiB2b2lk
IFByb2Nlc3NBc3NlcnRpb246OmFjcXVpcmVBc3luYyhDb21wbGV0aW9uSGFuZGxlcjx2b2lkKCk+
JiYgY29tcGxldGlvbkhhbmRsZXIpCkBAIC0zNzUsNiArMzgzLDE0IEBAIFByb2Nlc3NBc3NlcnRp
b246On5Qcm9jZXNzQXNzZXJ0aW9uKCkKICAgICB9CiB9CiAKK3ZvaWQgUHJvY2Vzc0Fzc2VydGlv
bjo6cHJvY2Vzc0Fzc2VydGlvbldpbGxCZUludmFsaWRhdGVkKCkKK3sKKyAgICBSRUxFQVNFX0xP
RyhQcm9jZXNzU3VzcGVuc2lvbiwgIiVwIC0gUHJvY2Vzc0Fzc2VydGlvbjo6cHJvY2Vzc0Fzc2Vy
dGlvbldpbGxCZUludmFsaWRhdGVkKCkgUElEPSVkIiwgdGhpcywgbV9waWQpOworCisgICAgaWYg
KG1fcHJlcGFyZUZvckludmFsaWRhdGlvbkhhbmRsZXIpCisgICAgICAgIG1fcHJlcGFyZUZvcklu
dmFsaWRhdGlvbkhhbmRsZXIoKTsKK30KKwogdm9pZCBQcm9jZXNzQXNzZXJ0aW9uOjpwcm9jZXNz
QXNzZXJ0aW9uV2FzSW52YWxpZGF0ZWQoKQogewogICAgIEFTU0VSVChSdW5Mb29wOjppc01haW4o
KSk7CmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cgYi9Ub29scy9DaGFuZ2VMb2cKaW5kZXgg
ZmUwNDJiNTUxNDg5NzI1MjEzNjQ2NzM3OWQzMmVjOThhN2M1NTQxZC4uYmU2ODE2N2I3ZTdlZjQx
NzFmM2VjOTJmMDkzYjNiNjMyMGRhOGY0MCAxMDA2NDQKLS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisr
KyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE2IEBACisyMDIxLTA3LTA3ICBTaWh1aSBM
aXUgIDxzaWh1aV9saXVAYXBwbGUuY29tPgorCisgICAgICAgIFN1c3BlbmQgV2ViSURCU2VydmVy
IHdoZW4gYXNzZXJ0aW9uIGluIG5ldHdvcmsgaXMgZ29pbmcgdG8gYmUgaW52YWxpZGF0ZWQKKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIyNzc3OAorCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFVwZGF0ZSB0ZXN0
IHRvIHJlZmxlY3QgdGhlIGNoYW5nZSB0aGF0IElEQiB0cmFuc2FjdGlvbnMgd2lsbCBub3QgYmUg
YWJvcnRlZCBvbiBQcmVwYXJlVG9TdXNwZW5kIG1lc3NhZ2Ugbm93LgorCisgICAgICAgICogVGVz
dFdlYktpdEFQSS9UZXN0cy9XZWJLaXRDb2NvYS9JbmRleGVkREJTdXNwZW5kSW1taW5lbnRseS5o
dG1sOgorICAgICAgICAqIFRlc3RXZWJLaXRBUEkvVGVzdHMvV2ViS2l0Q29jb2EvSW5kZXhlZERC
U3VzcGVuZEltbWluZW50bHkubW06CisgICAgICAgIChURVNUKToKKwogMjAyMS0wNy0wNiAgSGFy
c2hpbCBSYXRudSAgPGhyYXRudUBhcHBsZS5jb20+CiAKICAgICAgICAgQWRkIG15c2VsZiAoSGFy
c2hpbCBSYXRudSkgdG8gY29udHJpYnV0b3JzLmpzb24KZGlmZiAtLWdpdCBhL1Rvb2xzL1Rlc3RX
ZWJLaXRBUEkvVGVzdHMvV2ViS2l0Q29jb2EvSW5kZXhlZERCU3VzcGVuZEltbWluZW50bHkuaHRt
bCBiL1Rvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2ViS2l0Q29jb2EvSW5kZXhlZERCU3VzcGVu
ZEltbWluZW50bHkuaHRtbAppbmRleCA3Y2Y2Y2QyZDZmZWMxMDU2YmFjODYzNTNlYTFlYTM5ZmVi
MmM0Zjk2Li45YjQ0ZDVmMjkwMDU2MWY5OWNhYjYyMzJjMzAzYTlmYThiMDg3MTU3IDEwMDY0NAot
LS0gYS9Ub29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dlYktpdENvY29hL0luZGV4ZWREQlN1c3Bl
bmRJbW1pbmVudGx5Lmh0bWwKKysrIGIvVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0cy9XZWJLaXRD
b2NvYS9JbmRleGVkREJTdXNwZW5kSW1taW5lbnRseS5odG1sCkBAIC0yLDMwICsyLDIyIEBACiA8
c2NyaXB0PgogCiB2YXIgZGI7Ci12YXIgc2hvdWxkU2VuZFN1Y2Nlc3NNZXNzYWdlID0gZmFsc2U7
Ci12YXIgaGFzQWJvcnQgPSBmYWxzZTsKIHZhciByZXF1ZXN0ID0gd2luZG93LmluZGV4ZWREQi5v
cGVuKCJJbmRleGVkREJTdXNwZW5kSW1taW5lbnRseSIpOwogcmVxdWVzdC5vbnN1Y2Nlc3MgPSBm
dW5jdGlvbihldmVudCkgewogICAgIHdpbmRvdy53ZWJraXQubWVzc2FnZUhhbmRsZXJzLnRlc3RI
YW5kbGVyLnBvc3RNZXNzYWdlKCJDb250aW51ZSIpOwogICAgIGRiID0gZXZlbnQudGFyZ2V0LnJl
c3VsdDsKLSAgICBmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICBmb3IgKGxldCBp
ID0gMDsgaSA8PSAxMDsgaSsrKSB7CiAgICAgICAgIHRyYW5zYWN0aW9uID0gZGIudHJhbnNhY3Rp
b24oIlRlc3RPYmplY3RTdG9yZSIsICJyZWFkd3JpdGUiKTsKICAgICAgICAgb2JqZWN0U3RvcmUg
PSB0cmFuc2FjdGlvbi5vYmplY3RTdG9yZSgiVGVzdE9iamVjdFN0b3JlIik7CiAgICAgICAgIGZv
ciAobGV0IHRpbWVzID0gMDsgdGltZXMgPCAxMDA7IHRpbWVzKyspCiAgICAgICAgICAgICBvYmpl
Y3RTdG9yZS5wdXQoaSwgaSk7Ci0gICAgICAgIHRyYW5zYWN0aW9uLm9uYWJvcnQgPSAoKT0+IHsK
LSAgICAgICAgICAgIGlmICghaGFzQWJvcnQpIHsKLSAgICAgICAgICAgICAgICBoYXNBYm9ydCA9
IHRydWU7Ci0gICAgICAgICAgICAgICAgc2hvdWxkU2VuZFN1Y2Nlc3NNZXNzYWdlID0gdHJ1ZTsK
LSAgICAgICAgICAgICAgICB3aW5kb3cud2Via2l0Lm1lc3NhZ2VIYW5kbGVycy50ZXN0SGFuZGxl
ci5wb3N0TWVzc2FnZSgiRXhwZWN0ZWQgQWJvcnQgRm9yIFN1c3BlbnNpb24iKTsKLSAgICAgICAg
ICAgIH0gZWxzZSB7CisKKyAgICAgICAgaWYgKGkgPT0gMTApIHsKKyAgICAgICAgICAgIHRyYW5z
YWN0aW9uLm9uYWJvcnQgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICAgd2luZG93LndlYmtpdC5t
ZXNzYWdlSGFuZGxlcnMudGVzdEhhbmRsZXIucG9zdE1lc3NhZ2UoIlVuZXhwZWN0ZWQgQWJvcnQi
KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0cmFuc2FjdGlvbi5vbmNvbXBs
ZXRlID0gKCk9PiB7Ci0gICAgICAgICAgICBpZiAoc2hvdWxkU2VuZFN1Y2Nlc3NNZXNzYWdlKSB7
Ci0gICAgICAgICAgICAgICAgd2luZG93LndlYmtpdC5tZXNzYWdlSGFuZGxlcnMudGVzdEhhbmRs
ZXIucG9zdE1lc3NhZ2UoIkV4cGVjdGVkIFN1Y2Nlc3MgQWZ0ZXIgUmVzdW1lIik7Ci0gICAgICAg
ICAgICAgICAgc2hvdWxkU2VuZFN1Y2Nlc3NNZXNzYWdlID0gZmFsc2U7CisgICAgICAgICAgICB0
cmFuc2FjdGlvbi5vbmNvbXBsZXRlID0gKCkgPT4geworICAgICAgICAgICAgICAgIHdpbmRvdy53
ZWJraXQubWVzc2FnZUhhbmRsZXJzLnRlc3RIYW5kbGVyLnBvc3RNZXNzYWdlKCJFeHBlY3RlZCBT
dWNjZXNzIik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9U
b29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dlYktpdENvY29hL0luZGV4ZWREQlN1c3BlbmRJbW1p
bmVudGx5Lm1tIGIvVG9vbHMvVGVzdFdlYktpdEFQSS9UZXN0cy9XZWJLaXRDb2NvYS9JbmRleGVk
REJTdXNwZW5kSW1taW5lbnRseS5tbQppbmRleCA1MTBiMjRmNTY5ZDIyYmQ0MGE3YWRiZTI1ZWNm
ZDBlY2ZjOGFjNzI2Li5hYzU0NWQ2OWFjYzk2MTljZDUyMTRlNjcyZDI3NWFkMWYzNWM4MTM4IDEw
MDY0NAotLS0gYS9Ub29scy9UZXN0V2ViS2l0QVBJL1Rlc3RzL1dlYktpdENvY29hL0luZGV4ZWRE
QlN1c3BlbmRJbW1pbmVudGx5Lm1tCisrKyBiL1Rvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2Vi
S2l0Q29jb2EvSW5kZXhlZERCU3VzcGVuZEltbWluZW50bHkubW0KQEAgLTkyLDggKzkyLDcgQEAg
VEVTVChJbmRleGVkREIsIEluZGV4ZWREQlN1c3BlbmRJbW1pbmVudGx5KQogICAgIFtjb25maWd1
cmF0aW9uLmdldCgpLndlYnNpdGVEYXRhU3RvcmUgX3NlbmROZXR3b3JrUHJvY2Vzc1dpbGxTdXNw
ZW5kSW1taW5lbnRseV07CiAgICAgW2NvbmZpZ3VyYXRpb24uZ2V0KCkud2Vic2l0ZURhdGFTdG9y
ZSBfc2VuZE5ldHdvcmtQcm9jZXNzRGlkUmVzdW1lXTsKIAotICAgIHJ1blRlc3RBbmRDaGVja1Jl
c3VsdChAIkV4cGVjdGVkIEFib3J0IEZvciBTdXNwZW5zaW9uIik7Ci0gICAgcnVuVGVzdEFuZENo
ZWNrUmVzdWx0KEAiRXhwZWN0ZWQgU3VjY2VzcyBBZnRlciBSZXN1bWUiKTsKKyAgICBydW5UZXN0
QW5kQ2hlY2tSZXN1bHQoQCJFeHBlY3RlZCBTdWNjZXNzIik7CiB9CiAKIHN0YXRpYyBOU1N0cmlu
ZyAqbWFpbkZyYW1lU3RyaW5nID0gQCI8c2NyaXB0PiBcCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>433535</attachid>
            <date>2021-07-14 15:53:48 -0700</date>
            <delta_ts>2021-07-14 16:28:19 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-227778-20210714155347.patch</filename>
            <type>text/plain</type>
            <size>15509</size>
            <attacher name="Sihui Liu">sihui_liu</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjc5OTAzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMzljMmIyNWVlNmE3YzNh
ZmE2NTZlNzc2MDNmY2YxZjIyNjQ5OWFhNC4uNGU0NmQwYTA3M2ZlYWZmZWNiNTE2N2ZlNWQ2ZjQ5
NDY4MGRlMDc3ZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE3IEBACisyMDIxLTA3LTE0ICBTaWh1
aSBMaXUgIDxzaWh1aV9saXVAYXBwbGUuY29tPgorCisgICAgICAgIERvIG5vdCBhYm9ydCBvbmdv
aW5nIElEQiB0cmFuc2FjdGlvbiBzeW5jaHJvbm91c2x5IG9uIG5vbi1pbW1pbmVudCBQcmVwYXJl
VG9TdXNwZW5kIG1lc3NhZ2UKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTIyNzc3OAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgICogTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL0lEQlNlcnZlci5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpJREJTZXJ2ZXI6OklEQlNlcnZlcjo6aGFzRGF0YWJhc2VBY3Rpdml0aWVz
T25NYWluVGhyZWFkIGNvbnN0KToKKyAgICAgICAgKiBNb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIv
SURCU2VydmVyLmg6CisgICAgICAgICogTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL1VuaXF1ZUlE
QkRhdGFiYXNlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OklEQlNlcnZlcjo6VW5pcXVlSURCRGF0
YWJhc2U6Omhhc0FjdGl2ZVRyYW5zYWN0aW9ucyBjb25zdCk6CisgICAgICAgICogTW9kdWxlcy9p
bmRleGVkZGIvc2VydmVyL1VuaXF1ZUlEQkRhdGFiYXNlLmg6CisKIDIwMjEtMDctMTMgIEFsZXgg
Q2hyaXN0ZW5zZW4gIDxhY2hyaXN0ZW5zZW5Ad2Via2l0Lm9yZz4KIAogICAgICAgICA+NEsgUmVm
ZXJlciBzaG91bGQgaGF2ZSB0YWlsaW5nIC8KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvQ2hh
bmdlTG9nIGIvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cKaW5kZXggODJjOGNjODhmZjAyNTUxMmVh
ZjU0N2JlZmIwNTAwYmFmNmRkYzBjMS4uM2ViNDEzZjg5MzQxNWJjYTc4ZTIyZmU3OTYxMzdiZDU0
MWU4ZDZhYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cKKysrIGIvU291cmNl
L1dlYktpdC9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzMyBAQAorMjAyMS0wNy0xNCAgU2lodWkgTGl1
ICA8c2lodWlfbGl1QGFwcGxlLmNvbT4KKworICAgICAgICBEbyBub3QgYWJvcnQgb25nb2luZyBJ
REIgdHJhbnNhY3Rpb24gc3luY2hyb25vdXNseSBvbiBub24taW1taW5lbnQgUHJlcGFyZVRvU3Vz
cGVuZCBtZXNzYWdlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD0yMjc3NzgKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAg
ICAgICBDdXJyZW50bHkgd2UgYWJvcnQgSURCIHRyYW5zYWN0aW9ucyBhbmQgc3VzcGVuZCBJREIg
dGhyZWFkIHN5bmNocm9ub3VzbHkgaW4gTmV0d29ya1Byb2Nlc3M6OnByZXBhcmVUb1N1c3BlbmQu
CisgICAgICAgIEFzIFVJIHByb2Nlc3MgZG9lcyBub3Qga25vdyB0aGUgZmlsZSBsb2NraW5nIHN0
YXRlIGluIG5ldHdvcmsgcHJvY2VzcyBub3cgKGJlY2F1c2UgbmV0d29yayBwcm9jZXNzIHRyYWNr
cworICAgICAgICB0aGUgc3RhdGUgYW5kIHRha2VzIHRoZSBhc3NlcnRpb24gYnkgaXRzZWxmKSwg
VUkgcHJvY2VzcyBtYXkgc2VuZCBub24taW1taW5lbnQgUHJlcGFyZVRvU3VzcGVuZCBtb3JlIG9m
dGVuLAorICAgICAgICBhbmQgd2UgbWF5IGFib3J0IHRyYW5zYWN0aW9uIHRvbyBhZ2dyZXNzaXZl
bHkgKGUuZy4gVUkgcHJvY2VzcyBtYXkgc2VuZCB0aGUgbWVzc2FnZSBhcyBzb29uIGFzIGFwcCBp
cyBpbiAKKyAgICAgICAgYmFja2dyb3VuZCkuIFRvIGZpeCB0aGUgcG9zc2libGUgcmVncmVzc2lv
biBvZiBkYXRhIGxvc3MsIHdlIG5vdyBzY2hlZHVsZSBhIHRhc2sgd2l0aCA1cyBkZWxheSB0byBh
Ym9ydAorICAgICAgICBldmVyeXRoaW5nLiBJbiB0aGlzIGNhc2UsIHRyYW5zYWN0aW9ucyBmaW5p
c2hlZCBpbiA1cyBhZnRlciBQcmVwYXJlVG9TdXNwZW5kIG1lc3NhZ2Ugd2lsbCBub3QgYmUgYWJv
cnRlZC4KKworICAgICAgICAqIE5ldHdvcmtQcm9jZXNzL0luZGV4ZWREQi9XZWJJREJTZXJ2ZXIu
Y3BwOgorICAgICAgICAqIE5ldHdvcmtQcm9jZXNzL0luZGV4ZWREQi9XZWJJREJTZXJ2ZXIuaDoK
KyAgICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9OZXR3b3JrUHJvY2Vzcy5jcHA6CisgICAgICAgIChX
ZWJLaXQ6Ok5ldHdvcmtQcm9jZXNzOjpzdXNwZW5kSURCU2VydmVycyk6CisgICAgICAgIChXZWJL
aXQ6Ok5ldHdvcmtQcm9jZXNzOjpwcmVwYXJlVG9TdXNwZW5kKToKKyAgICAgICAgKiBOZXR3b3Jr
UHJvY2Vzcy9OZXR3b3JrUHJvY2Vzcy5oOgorICAgICAgICAqIE5ldHdvcmtQcm9jZXNzL2lvcy9O
ZXR3b3JrUHJvY2Vzc0lPUy5tbToKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya1Byb2Nlc3M6OnNl
dElzSG9sZGluZ0xvY2tlZEZpbGVzKToKKyAgICAgICAgKiBVSVByb2Nlc3MvUHJvY2Vzc0Fzc2Vy
dGlvbi5oOgorICAgICAgICAoV2ViS2l0OjpQcm9jZXNzQXNzZXJ0aW9uOjpzZXRQcmVwYXJlRm9y
SW52YWxpZGF0aW9uSGFuZGxlcik6CisgICAgICAgICogVUlQcm9jZXNzL2lvcy9Qcm9jZXNzQXNz
ZXJ0aW9uSU9TLm1tOgorICAgICAgICAoLVtXS1Byb2Nlc3NBc3NlcnRpb25CYWNrZ3JvdW5kVGFz
a01hbmFnZXIgZGVhbGxvY10pOgorICAgICAgICAoLVtXS1JCU0Fzc2VydGlvbkRlbGVnYXRlIGFz
c2VydGlvbldpbGxJbnZhbGlkYXRlOl0pOgorICAgICAgICAoV2ViS2l0OjpQcm9jZXNzQXNzZXJ0
aW9uOjpQcm9jZXNzQXNzZXJ0aW9uKToKKyAgICAgICAgKFdlYktpdDo6UHJvY2Vzc0Fzc2VydGlv
bjo6cHJvY2Vzc0Fzc2VydGlvbldpbGxCZUludmFsaWRhdGVkKToKKwogMjAyMS0wNy0xMyAgV2Vu
c29uIEhzaWVoICA8d2Vuc29uX2hzaWVoQGFwcGxlLmNvbT4KIAogICAgICAgICBbV0syXSBQdXNo
IE9TIHN0YXRlIGR1bXBpbmcgbG9naWMgZG93biBmcm9tIFdlYlByb2Nlc3MgdG8gQXV4aWxpYXJ5
UHJvY2VzcwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2Vy
dmVyL0lEQlNlcnZlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2
ZXIvSURCU2VydmVyLmNwcAppbmRleCA0OWQ4NzY2MmZjYjNhNWFlMjNmMmE3YWI1MjdlNjU1N2Mz
MjZlYTNiLi44MjBkMzJmNWI3YmM1OGRlY2ZmODU3ZDIxMTVlNGQ5ODA3MzZmY2FjIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmNw
cAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVy
LmNwcApAQCAtNzY3LDYgKzc2NywyMiBAQCB2b2lkIElEQlNlcnZlcjo6dXBncmFkZUZpbGVzSWZO
ZWNlc3NhcnkoKQogICAgICAgICBGaWxlU3lzdGVtOjptYWtlQWxsRGlyZWN0b3JpZXMobmV3VmVy
c2lvbkRpcmVjdG9yeSk7CiB9CiAKK2Jvb2wgSURCU2VydmVyOjpoYXNEYXRhYmFzZUFjdGl2aXRp
ZXNPbk1haW5UaHJlYWQoKSBjb25zdAoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Cisg
ICAgQVNTRVJUKG1fbG9jay5pc0hlbGQoKSk7CisKKyAgICBpZiAobV9zZXNzaW9uSUQuaXNFcGhl
bWVyYWwoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBmb3IgKGF1dG8mIGRhdGFiYXNl
IDogbV91bmlxdWVJREJEYXRhYmFzZU1hcC52YWx1ZXMoKSkgeworICAgICAgICBpZiAoIWRhdGFi
YXNlLT5pZGVudGlmaWVyKCkuaXNUcmFuc2llbnQoKSAmJiBkYXRhYmFzZS0+aGFzQWN0aXZlVHJh
bnNhY3Rpb25zKCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAg
cmV0dXJuIGZhbHNlOworfQorCiB2b2lkIElEQlNlcnZlcjo6c3RvcERhdGFiYXNlQWN0aXZpdGll
c09uTWFpblRocmVhZCgpCiB7CiAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9JREJTZXJ2ZXIuaCBi
L1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9JREJTZXJ2ZXIuaAppbmRl
eCBiYzcyMzBjODBjZmI2NDZhZmVjOGRlNTkwYzMwMzU0NjcwZjRjN2VkLi42MDhkN2ZhYjllY2Q3
NjVkOTdmMGMwODMzM2ZmNGRiNTQwMDEwN2IxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9N
b2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmgKKysrIGIvU291cmNlL1dlYkNvcmUv
TW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL0lEQlNlcnZlci5oCkBAIC0xMDcsNiArMTA3LDcgQEAg
cHVibGljOgogICAgIFN0b3JhZ2VRdW90YU1hbmFnZXI6OkRlY2lzaW9uIHJlcXVlc3RTcGFjZShj
b25zdCBDbGllbnRPcmlnaW4mLCB1aW50NjRfdCB0YXNrU2l6ZSk7CiAgICAgV0VCQ09SRV9FWFBP
UlQgc3RhdGljIHVpbnQ2NF90IGRpc2tVc2FnZShjb25zdCBTdHJpbmcmIHJvb3REaXJlY3Rvcnks
IGNvbnN0IENsaWVudE9yaWdpbiYpOwogCisgICAgV0VCQ09SRV9FWFBPUlQgYm9vbCBoYXNEYXRh
YmFzZUFjdGl2aXRpZXNPbk1haW5UaHJlYWQoKSBjb25zdDsKICAgICBXRUJDT1JFX0VYUE9SVCB2
b2lkIHN0b3BEYXRhYmFzZUFjdGl2aXRpZXNPbk1haW5UaHJlYWQoKTsKIAogcHJpdmF0ZToKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9VbmlxdWVJ
REJEYXRhYmFzZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIv
VW5pcXVlSURCRGF0YWJhc2UuY3BwCmluZGV4IDk5ZTE4NTg0ODNiODdkM2U0Y2Q0MDJjOTcyN2M4
Y2E1M2ZmM2E3M2YuLjg2Y2I3MDVjNTU3Y2E2MjhhYjI1NDJjYzRlNWU3ODI2Y2Y1YTAzOTMgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9VbmlxdWVJ
REJEYXRhYmFzZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2Vy
dmVyL1VuaXF1ZUlEQkRhdGFiYXNlLmNwcApAQCAtMTE5MSw2ICsxMTkxLDEzIEBAIHZvaWQgVW5p
cXVlSURCRGF0YWJhc2U6OmltbWVkaWF0ZUNsb3NlKCkKICAgICBjbG9zZSgpOwogfQogCitib29s
IFVuaXF1ZUlEQkRhdGFiYXNlOjpoYXNBY3RpdmVUcmFuc2FjdGlvbnMoKSBjb25zdAoreworICAg
IEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisKKyAgICByZXR1cm4gIW1faW5Qcm9ncmVzc1RyYW5z
YWN0aW9ucy5pc0VtcHR5KCk7Cit9CisKIHZvaWQgVW5pcXVlSURCRGF0YWJhc2U6OmFib3J0QWN0
aXZlVHJhbnNhY3Rpb25zKCkKIHsKICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL1VuaXF1ZUlEQkRh
dGFiYXNlLmggYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVl
SURCRGF0YWJhc2UuaAppbmRleCAyMzZlMmJiNTVhMzUzNjI4OWFjNWY3NTVjOThhYzBmODVhYTM4
Nzk4Li5kZmFkZGI5N2NjMjI1OGU3ZTQwZWVjOGZhMjEwODQ2OGIwY2RjYTM0IDEwMDY0NAotLS0g
YS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVlSURCRGF0YWJh
c2UuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVl
SURCRGF0YWJhc2UuaApAQCAtMTA3LDYgKzEwNyw3IEBAIHB1YmxpYzoKICAgICB2b2lkIGhhbmRs
ZURlbGV0ZShJREJDb25uZWN0aW9uVG9DbGllbnQmLCBjb25zdCBJREJSZXF1ZXN0RGF0YSYpOwog
ICAgIHZvaWQgaW1tZWRpYXRlQ2xvc2UoKTsKIAorICAgIGJvb2wgaGFzQWN0aXZlVHJhbnNhY3Rp
b25zKCkgY29uc3Q7CiAgICAgdm9pZCBhYm9ydEFjdGl2ZVRyYW5zYWN0aW9ucygpOwogICAgIGJv
b2wgdHJ5Q2xvc2UoKTsKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vz
cy9JbmRleGVkREIvV2ViSURCU2VydmVyLmNwcCBiL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nl
c3MvSW5kZXhlZERCL1dlYklEQlNlcnZlci5jcHAKaW5kZXggNTc1Mzc3ZDhlMmZkM2ZlMWQ3NTAy
ZDcxODA5NTFiNmRmMjYxZTE1NS4uNjU2OTQxMzQ0OWJlZjI1MmFjMjVmZWE0YjU1ZjBkNmUyOWFl
OWI1OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9JbmRleGVkREIv
V2ViSURCU2VydmVyLmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0L05ldHdvcmtQcm9jZXNzL0luZGV4
ZWREQi9XZWJJREJTZXJ2ZXIuY3BwCkBAIC0xMTUsMTcgKzExNSwzMiBAQCB2b2lkIFdlYklEQlNl
cnZlcjo6cmVuYW1lT3JpZ2luKGNvbnN0IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYgb2xk
T3JpZ2luLCBjbwogICAgIH0pOwogfQogCi12b2lkIFdlYklEQlNlcnZlcjo6c3VzcGVuZCgpIFdU
Rl9JR05PUkVTX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMKK2Jvb2wgV2ViSURCU2VydmVyOjpzdXNw
ZW5kKElzU3VzcGVuc2lvbkltbWluZW50IGlzU3VzcGVuc2lvbkltbWluZW50KSBXVEZfSUdOT1JF
U19USFJFQURfU0FGRVRZX0FOQUxZU0lTCiB7CiAgICAgQVNTRVJUKFJ1bkxvb3A6OmlzTWFpbigp
KTsKIAogICAgIGlmIChtX2lzU3VzcGVuZGVkKQotICAgICAgICByZXR1cm47CisgICAgICAgIHJl
dHVybiB0cnVlOwogCiAgICAgbV9pc1N1c3BlbmRlZCA9IHRydWU7CiAgICAgbV9zZXJ2ZXJMb2Nr
LmxvY2soKTsKLSAgICBpZiAobV9zZXJ2ZXIpCisKKyAgICBpZiAoIW1fc2VydmVyKQorICAgICAg
ICByZXR1cm4gdHJ1ZTsKKworICAgIGlmIChpc1N1c3BlbnNpb25JbW1pbmVudCA9PSBJc1N1c3Bl
bnNpb25JbW1pbmVudDo6WWVzKSB7CiAgICAgICAgIG1fc2VydmVyLT5zdG9wRGF0YWJhc2VBY3Rp
dml0aWVzT25NYWluVGhyZWFkKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAg
IC8vIFN1c3BlbmQgdG8gYXZvaWQgc3RhcnRpbmcgbmV3IHRyYW5zYWN0aW9ucyBpZiB0aGVyZSBp
cyBubyBvbmdvaW5nIHRyYW5zYWN0aW9uLgorICAgIGlmICghbV9zZXJ2ZXItPmhhc0RhdGFiYXNl
QWN0aXZpdGllc09uTWFpblRocmVhZCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8v
IFJlc3VtZSB0byBhbGxvdyBvbmdvaW5nIHRyYW5zYWN0aW9ucyB0byBiZSBmaW5pc2hlZC4KKyAg
ICBtX3NlcnZlckxvY2sudW5sb2NrKCk7CisgICAgbV9pc1N1c3BlbmRlZCA9IGZhbHNlOworICAg
IHJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBXZWJJREJTZXJ2ZXI6OnJlc3VtZSgpIFdURl9JR05P
UkVTX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvTmV0
d29ya1Byb2Nlc3MvSW5kZXhlZERCL1dlYklEQlNlcnZlci5oIGIvU291cmNlL1dlYktpdC9OZXR3
b3JrUHJvY2Vzcy9JbmRleGVkREIvV2ViSURCU2VydmVyLmgKaW5kZXggNjk3MDdiMjczOTdkYmU1
NmU0NmY3NWMzMWYzMTkwNTk2ZTBiNDE5OC4uNTFiZGUzOGU3MDkzZDNkNTdhNmJiOGY0NmU4Mzcx
ZDYwNjBkNjIzMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9JbmRl
eGVkREIvV2ViSURCU2VydmVyLmgKKysrIGIvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9J
bmRleGVkREIvV2ViSURCU2VydmVyLmgKQEAgLTUyLDcgKzUyLDggQEAgcHVibGljOgogICAgIHZv
aWQgY2xvc2VBbmREZWxldGVEYXRhYmFzZXNGb3JPcmlnaW5zKGNvbnN0IFZlY3RvcjxXZWJDb3Jl
OjpTZWN1cml0eU9yaWdpbkRhdGE+JiwgQ29tcGxldGlvbkhhbmRsZXI8dm9pZCgpPiYmIGNhbGxi
YWNrKTsKICAgICB2b2lkIHJlbmFtZU9yaWdpbihjb25zdCBXZWJDb3JlOjpTZWN1cml0eU9yaWdp
bkRhdGEmLCBjb25zdCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmLCBDb21wbGV0aW9uSGFu
ZGxlcjx2b2lkKCk+JiYpOwogCi0gICAgdm9pZCBzdXNwZW5kKCk7CisgICAgZW51bSBjbGFzcyBJ
c1N1c3BlbnNpb25JbW1pbmVudCA6IGJvb2wgeyBObywgWWVzIH07CisgICAgYm9vbCBzdXNwZW5k
KElzU3VzcGVuc2lvbkltbWluZW50ID0gSXNTdXNwZW5zaW9uSW1taW5lbnQ6Olllcyk7CiAgICAg
dm9pZCByZXN1bWUoKTsKIAogICAgIC8vIE1lc3NhZ2UgaGFuZGxlcnMuCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViS2l0L05ldHdvcmtQcm9jZXNzL05ldHdvcmtQcm9jZXNzLmNwcCBiL1NvdXJjZS9X
ZWJLaXQvTmV0d29ya1Byb2Nlc3MvTmV0d29ya1Byb2Nlc3MuY3BwCmluZGV4IGFlYTJmYWE1OGEx
NTgxZjAwYmY1NmJjZWVlZDE3N2I0NGE0MzYwOTYuLjk1OTU3MmYzYzc3Yzc4ZTBhOTUzZjg0MzM5
ZjNiMzFlNTVlOGIxYWMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3Mv
TmV0d29ya1Byb2Nlc3MuY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvTmV0
d29ya1Byb2Nlc3MuY3BwCkBAIC0yMjExLDE0ICsyMjExLDQzIEBAIHZvaWQgTmV0d29ya1Byb2Nl
c3M6OnByb2Nlc3NXaWxsU3VzcGVuZEltbWluZW50bHlGb3JUZXN0aW5nU3luYyhDb21wbGV0aW9u
SGFuZGxlCiAgICAgcHJlcGFyZVRvU3VzcGVuZCh0cnVlLCBXVEZNb3ZlKGNvbXBsZXRpb25IYW5k
bGVyKSk7CiB9CiAKK3ZvaWQgTmV0d29ya1Byb2Nlc3M6OnN1c3BlbmRJREJTZXJ2ZXJzKGJvb2wg
aXNTdXNwZW5zaW9uSW1taW5lbnQpCit7CisgICAgbV9zaG91bGRTdXNwZW5kSURCU2VydmVyID0g
dHJ1ZTsKKworICAgIGlmIChpc1N1c3BlbnNpb25JbW1pbmVudCkgeworICAgICAgICBmb3IgKGF1
dG8mIHNlcnZlciA6IG1fd2ViSURCU2VydmVycy52YWx1ZXMoKSkKKyAgICAgICAgICAgIHNlcnZl
ci0+c3VzcGVuZCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBzaG91bGRT
Y2hlZHVsZVN1c3BlbnNpb25UYXNrID0gZmFsc2U7CisgICAgZm9yIChhdXRvJiBzZXJ2ZXIgOiBt
X3dlYklEQlNlcnZlcnMudmFsdWVzKCkpIHsKKyAgICAgICAgaWYgKCFzZXJ2ZXItPnN1c3BlbmQo
V2ViSURCU2VydmVyOjpJc1N1c3BlbnNpb25JbW1pbmVudDo6Tm8pKQorICAgICAgICAgICAgc2hv
dWxkU2NoZWR1bGVTdXNwZW5zaW9uVGFzayA9IHRydWU7CisgICAgfQorCisgICAgaWYgKCFzaG91
bGRTY2hlZHVsZVN1c3BlbnNpb25UYXNrKQorICAgICAgICByZXR1cm47CisKKyAgICBSdW5Mb29w
OjptYWluKCkuZGlzcGF0Y2hBZnRlcig1X3MsIFt0aGlzLCB3ZWFrVGhpcyA9IG1ha2VXZWFrUHRy
KCp0aGlzKV0geworICAgICAgICBpZiAoIXdlYWtUaGlzKQorICAgICAgICAgICAgcmV0dXJuOwor
CisgICAgICAgIGlmICghbV9zaG91bGRTdXNwZW5kSURCU2VydmVyKQorICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICAKKyAgICAgICAgZm9yIChhdXRvJiBzZXJ2ZXIgOiBtX3dlYklEQlNlcnZl
cnMudmFsdWVzKCkpCisgICAgICAgICAgICBzZXJ2ZXItPnN1c3BlbmQoKTsKKyAgICB9KTsKK30K
Kwogdm9pZCBOZXR3b3JrUHJvY2Vzczo6cHJlcGFyZVRvU3VzcGVuZChib29sIGlzU3VzcGVuc2lv
bkltbWluZW50LCBDb21wbGV0aW9uSGFuZGxlcjx2b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIp
CiB7CiAgICAgUkVMRUFTRV9MT0coUHJvY2Vzc1N1c3BlbnNpb24sICIlcCAtIE5ldHdvcmtQcm9j
ZXNzOjpwcmVwYXJlVG9TdXNwZW5kKCksIGlzU3VzcGVuc2lvbkltbWluZW50PSVkIiwgdGhpcywg
aXNTdXNwZW5zaW9uSW1taW5lbnQpOwogCiAjaWYgUExBVEZPUk0oSU9TX0ZBTUlMWSkKLSAgICBm
b3IgKGF1dG8mIHNlcnZlciA6IG1fd2ViSURCU2VydmVycy52YWx1ZXMoKSkKLSAgICAgICAgc2Vy
dmVyLT5zdXNwZW5kKCk7Ci0gICAgbV9zaG91bGRTdXNwZW5kSURCU2VydmVyID0gdHJ1ZTsKKyAg
ICBzdXNwZW5kSURCU2VydmVycyhpc1N1c3BlbnNpb25JbW1pbmVudCk7CiAjZW5kaWYKIAogICAg
IGxvd01lbW9yeUhhbmRsZXIoQ3JpdGljYWw6Olllcyk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
S2l0L05ldHdvcmtQcm9jZXNzL05ldHdvcmtQcm9jZXNzLmggYi9Tb3VyY2UvV2ViS2l0L05ldHdv
cmtQcm9jZXNzL05ldHdvcmtQcm9jZXNzLmgKaW5kZXggNzk0ODA5N2FhM2RjMzg2YTJmZDQxZmFk
NjIzYjNjZWNkZjhkN2U0YS4uZWE5Y2JiYjI3MTg2MzllODg4ZTNjMDUzMzgyODA3ZmVhZTk0YTcw
YyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9OZXR3b3JrUHJvY2Vz
cy5oCisrKyBiL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvTmV0d29ya1Byb2Nlc3MuaApA
QCAtNDg2LDYgKzQ4Niw3IEBAIHByaXZhdGU6CiAgICAgUmVmPFdlYklEQlNlcnZlcj4gY3JlYXRl
V2ViSURCU2VydmVyKFBBTDo6U2Vzc2lvbklEKTsKICAgICB2b2lkIHNldFNlc3Npb25TdG9yYWdl
UXVvdGFNYW5hZ2VySURCUm9vdFBhdGgoUEFMOjpTZXNzaW9uSUQsIGNvbnN0IFN0cmluZyYgaWRi
Um9vdFBhdGgpOwogICAgIHZvaWQgcmVtb3ZlV2ViSURCU2VydmVySWZQb3NzaWJsZShQQUw6OlNl
c3Npb25JRCk7CisgICAgdm9pZCBzdXNwZW5kSURCU2VydmVycyhib29sIGlzU3VzcGVuc2lvbklt
bWluZW50KTsKIAogI2lmIEVOQUJMRShTRVJWSUNFX1dPUktFUikKICAgICB2b2lkIGRpZENyZWF0
ZVdvcmtlckNvbnRleHRQcm9jZXNzQ29ubmVjdGlvbihjb25zdCBJUEM6OkF0dGFjaG1lbnQmKTsK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvaW9zL05ldHdvcmtQcm9j
ZXNzSU9TLm1tIGIvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9pb3MvTmV0d29ya1Byb2Nl
c3NJT1MubW0KaW5kZXggNjQ5NGI1YTc5OGFmNjkwODFlYTNkN2E1YTNjYzU1ZWM4MjdlNGJmNC4u
MmYzYjFlNjAyNDEwZjQyMzEwNThkODc0ZmM0NDQ4YmJmNmQ4ZTM4ZCAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9pb3MvTmV0d29ya1Byb2Nlc3NJT1MubW0KKysrIGIv
U291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9pb3MvTmV0d29ya1Byb2Nlc3NJT1MubW0KQEAg
LTExMyw2ICsxMTMsMTUgQEAgdm9pZCBOZXR3b3JrUHJvY2Vzczo6c2V0SXNIb2xkaW5nTG9ja2Vk
RmlsZXMoYm9vbCBpc0hvbGRpbmdMb2NrZWRGaWxlcykKICAgICAvLyBXZSBzeW5jaHJvbm91c2x5
IHRha2UgYSBwcm9jZXNzIGFzc2VydGlvbiB3aGVuIGJlZ2lubmluZyBhIFNRTGl0ZSB0cmFuc2Fj
dGlvbiBzbyB0aGF0IHdlIGRvbid0IGdldCBzdXNwZW5kZWQKICAgICAvLyB3aGlsZSBob2xkaW5n
IGEgbG9ja2VkIGZpbGUuIFdlIHdvdWxkIGdldCBraWxsZWQgaWYgc3VzcGVuZGVkIHdoaWxlIGhv
bGRpbmcgbG9ja2VkIGZpbGVzLgogICAgIG1faG9sZGluZ0xvY2tlZEZpbGVBc3NlcnRpb24gPSBQ
cm9jZXNzQXNzZXJ0aW9uOjpjcmVhdGUoZ2V0Q3VycmVudFByb2Nlc3NJRCgpLCAiTmV0d29yayBQ
cm9jZXNzIGlzIGhvbGRpbmcgbG9ja2VkIGZpbGVzIl9zLCBQcm9jZXNzQXNzZXJ0aW9uVHlwZTo6
RmluaXNoVGFza1VuaW50ZXJydXB0YWJsZSwgUHJvY2Vzc0Fzc2VydGlvbjo6TW9kZTo6U3luYyk7
CisgICAgbV9ob2xkaW5nTG9ja2VkRmlsZUFzc2VydGlvbi0+c2V0UHJlcGFyZUZvckludmFsaWRh
dGlvbkhhbmRsZXIoW3RoaXMsIHdlYWtUaGlzID0gbWFrZVdlYWtQdHIoKnRoaXMpXSgpIG11dGFi
bGUgeworICAgICAgICBjYWxsT25NYWluUnVuTG9vcEFuZFdhaXQoW3RoaXMsIHdlYWtUaGlzID0g
V1RGTW92ZSh3ZWFrVGhpcyldKCkgeworICAgICAgICAgICAgaWYgKCF3ZWFrVGhpcykKKyAgICAg
ICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGZvciAoYXV0byYgc2VydmVyIDogbV93
ZWJJREJTZXJ2ZXJzLnZhbHVlcygpKQorICAgICAgICAgICAgICAgIHNlcnZlci0+c3VzcGVuZCgp
OworICAgICAgICB9KTsKKyAgICB9KTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9Qcm9jZXNzQXNzZXJ0aW9uLmggYi9Tb3Vy
Y2UvV2ViS2l0L1VJUHJvY2Vzcy9Qcm9jZXNzQXNzZXJ0aW9uLmgKaW5kZXggNzEzZmI5ZmJhYjE4
NmZhNzdmMWQwMGNjNTUyMzY5MGM0Y2U1MDNjOC4uY2I3ZGRlZDZmZWQ4ZmE1Y2NmM2E5MDZjMzM4
NDBlN2Y5Y2ExYjMzNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvUHJvY2Vz
c0Fzc2VydGlvbi5oCisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1Byb2Nlc3NBc3NlcnRp
b24uaApAQCAtNzIsNiArNzIsNyBAQCBwdWJsaWM6CiAgICAgfQogICAgIHZpcnR1YWwgflByb2Nl
c3NBc3NlcnRpb24oKTsKIAorICAgIHZvaWQgc2V0UHJlcGFyZUZvckludmFsaWRhdGlvbkhhbmRs
ZXIoRnVuY3Rpb248dm9pZCgpPiYmIGhhbmRsZXIpIHsgbV9wcmVwYXJlRm9ySW52YWxpZGF0aW9u
SGFuZGxlciA9IFdURk1vdmUoaGFuZGxlcik7IH0KICAgICB2b2lkIHNldEludmFsaWRhdGlvbkhh
bmRsZXIoRnVuY3Rpb248dm9pZCgpPiYmIGhhbmRsZXIpIHsgbV9pbnZhbGlkYXRpb25IYW5kbGVy
ID0gV1RGTW92ZShoYW5kbGVyKTsgfQogCiAgICAgUHJvY2Vzc0Fzc2VydGlvblR5cGUgdHlwZSgp
IGNvbnN0IHsgcmV0dXJuIG1fYXNzZXJ0aW9uVHlwZTsgfQpAQCAtODYsNiArODcsNyBAQCBwcm90
ZWN0ZWQ6CiAgICAgdm9pZCBhY3F1aXJlU3luYygpOwogCiAjaWYgUExBVEZPUk0oSU9TX0ZBTUlM
WSkKKyAgICB2b2lkIHByb2Nlc3NBc3NlcnRpb25XaWxsQmVJbnZhbGlkYXRlZCgpOwogICAgIHZp
cnR1YWwgdm9pZCBwcm9jZXNzQXNzZXJ0aW9uV2FzSW52YWxpZGF0ZWQoKTsKICNlbmRpZgogCkBA
IC05OCw2ICsxMDAsNyBAQCBwcml2YXRlOgogICAgIFJldGFpblB0cjxXS1JCU0Fzc2VydGlvbkRl
bGVnYXRlPiBtX2RlbGVnYXRlOwogICAgIGJvb2wgbV93YXNJbnZhbGlkYXRlZCB7IGZhbHNlIH07
CiAjZW5kaWYKKyAgICBGdW5jdGlvbjx2b2lkKCk+IG1fcHJlcGFyZUZvckludmFsaWRhdGlvbkhh
bmRsZXI7CiAgICAgRnVuY3Rpb248dm9pZCgpPiBtX2ludmFsaWRhdGlvbkhhbmRsZXI7CiB9Owog
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9pb3MvUHJvY2Vzc0Fzc2VydGlv
bklPUy5tbSBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL2lvcy9Qcm9jZXNzQXNzZXJ0aW9uSU9T
Lm1tCmluZGV4IGYzNTExNmQxYTBhNGMzZmI5OTU0Mjc0ZWE1NTZlMzlkYzVkNmYxYzUuLjVlYWI2
ODg4Y2NkODRhYmQzNGE3NDI5YjNmMTRlMGVjMWJlNjdmMWEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJLaXQvVUlQcm9jZXNzL2lvcy9Qcm9jZXNzQXNzZXJ0aW9uSU9TLm1tCisrKyBiL1NvdXJjZS9X
ZWJLaXQvVUlQcm9jZXNzL2lvcy9Qcm9jZXNzQXNzZXJ0aW9uSU9TLm1tCkBAIC0xMDQsNiArMTA0
LDcgQEAgc3RhdGljIGJvb2wgcHJvY2Vzc0hhc0FjdGl2ZVJ1blRpbWVMaW1pdGF0aW9uKCkKIAog
LSAodm9pZClkZWFsbG9jCiB7CisgICAgW19wcmVwYXJlRm9ySW52YWxpZGF0aW9uQ2FsbGJhY2sg
cmVsZWFzZV07CiAgICAgW3NlbGYgX3JlbGVhc2VCYWNrZ3JvdW5kVGFza107CiAgICAgW3N1cGVy
IGRlYWxsb2NdOwogfQpAQCAtMjU1LDYgKzI1Niw3IEBAIHN0YXRpYyBib29sIHByb2Nlc3NIYXNB
Y3RpdmVSdW5UaW1lTGltaXRhdGlvbigpCiB0eXBlZGVmIHZvaWQoXlJCU0Fzc2VydGlvbkludmFs
aWRhdGlvbkNhbGxiYWNrVHlwZSkoKTsKIAogQGludGVyZmFjZSBXS1JCU0Fzc2VydGlvbkRlbGVn
YXRlIDogTlNPYmplY3Q8UkJTQXNzZXJ0aW9uT2JzZXJ2aW5nPgorQHByb3BlcnR5IChjb3B5KSBS
QlNBc3NlcnRpb25JbnZhbGlkYXRpb25DYWxsYmFja1R5cGUgcHJlcGFyZUZvckludmFsaWRhdGlv
bkNhbGxiYWNrOwogQHByb3BlcnR5IChjb3B5KSBSQlNBc3NlcnRpb25JbnZhbGlkYXRpb25DYWxs
YmFja1R5cGUgaW52YWxpZGF0aW9uQ2FsbGJhY2s7CiBAZW5kCiAKQEAgLTI2OCw2ICsyNzAsOCBA
QCB0eXBlZGVmIHZvaWQoXlJCU0Fzc2VydGlvbkludmFsaWRhdGlvbkNhbGxiYWNrVHlwZSkoKTsK
IC0gKHZvaWQpYXNzZXJ0aW9uV2lsbEludmFsaWRhdGU6KFJCU0Fzc2VydGlvbiAqKWFzc2VydGlv
bgogewogICAgIFJFTEVBU0VfTE9HKFByb2Nlc3NTdXNwZW5zaW9uLCAiJXAgLSBXS1JCU0Fzc2Vy
dGlvbkRlbGVnYXRlOiBhc3NlcnRpb25XaWxsSW52YWxpZGF0ZSIsIHNlbGYpOworCisgICAgX3By
ZXBhcmVGb3JJbnZhbGlkYXRpb25DYWxsYmFjaygpOwogfQogCiAtICh2b2lkKWFzc2VydGlvbjoo
UkJTQXNzZXJ0aW9uICopYXNzZXJ0aW9uIGRpZEludmFsaWRhdGVXaXRoRXJyb3I6KE5TRXJyb3Ig
KillcnJvcgpAQCAtMzM5LDYgKzM0MywxMCBAQCBQcm9jZXNzQXNzZXJ0aW9uOjpQcm9jZXNzQXNz
ZXJ0aW9uKHBpZF90IHBpZCwgY29uc3QgU3RyaW5nJiByZWFzb24sIFByb2Nlc3NBc3NlcgogICAg
ICAgICBSRUxFQVNFX0xPRyhQcm9jZXNzU3VzcGVuc2lvbiwgIiVwIC0gUHJvY2Vzc0Fzc2VydGlv
bjogUkJTICV7cHVibGljfUAgYXNzZXJ0aW9uIGZvciBwcm9jZXNzIHdpdGggUElEPSVkIHdhcyBp
bnZhbGlkYXRlZCIsIHRoaXMsIHJ1bm5pbmdCb2FyZEFzc2VydGlvbk5hbWUsIHBpZCk7CiAgICAg
ICAgIHByb2Nlc3NBc3NlcnRpb25XYXNJbnZhbGlkYXRlZCgpOwogICAgIH07CisgICAgbV9kZWxl
Z2F0ZS5nZXQoKS5wcmVwYXJlRm9ySW52YWxpZGF0aW9uQ2FsbGJhY2sgPSBeeworICAgICAgICBS
RUxFQVNFX0xPRyhQcm9jZXNzU3VzcGVuc2lvbiwgIiVwIC0gUHJvY2Vzc0Fzc2VydGlvbigpIFJC
UyAle3B1YmxpY31AIGFzc2VydGlvbiBmb3IgcHJvY2VzcyB3aXRoIFBJRD0lZCB3aWxsIGJlIGlu
dmFsaWRhdGVkIiwgdGhpcywgcnVubmluZ0JvYXJkQXNzZXJ0aW9uTmFtZSwgcGlkKTsKKyAgICAg
ICAgcHJvY2Vzc0Fzc2VydGlvbldpbGxCZUludmFsaWRhdGVkKCk7CisgICAgfTsKIH0KIAogdm9p
ZCBQcm9jZXNzQXNzZXJ0aW9uOjphY3F1aXJlQXN5bmMoQ29tcGxldGlvbkhhbmRsZXI8dm9pZCgp
PiYmIGNvbXBsZXRpb25IYW5kbGVyKQpAQCAtMzc5LDYgKzM4NywxNCBAQCBQcm9jZXNzQXNzZXJ0
aW9uOjp+UHJvY2Vzc0Fzc2VydGlvbigpCiAgICAgfQogfQogCit2b2lkIFByb2Nlc3NBc3NlcnRp
b246OnByb2Nlc3NBc3NlcnRpb25XaWxsQmVJbnZhbGlkYXRlZCgpCit7CisgICAgUkVMRUFTRV9M
T0coUHJvY2Vzc1N1c3BlbnNpb24sICIlcCAtIFByb2Nlc3NBc3NlcnRpb246OnByb2Nlc3NBc3Nl
cnRpb25XaWxsQmVJbnZhbGlkYXRlZCgpIFBJRD0lZCIsIHRoaXMsIG1fcGlkKTsKKworICAgIGlm
IChtX3ByZXBhcmVGb3JJbnZhbGlkYXRpb25IYW5kbGVyKQorICAgICAgICBtX3ByZXBhcmVGb3JJ
bnZhbGlkYXRpb25IYW5kbGVyKCk7Cit9CisKIHZvaWQgUHJvY2Vzc0Fzc2VydGlvbjo6cHJvY2Vz
c0Fzc2VydGlvbldhc0ludmFsaWRhdGVkKCkKIHsKICAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWlu
KCkpOwo=
</data>
<flag name="commit-queue"
          id="455824"
          type_id="3"
          status="-"
          setter="ews-feeder"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>433537</attachid>
            <date>2021-07-14 16:16:39 -0700</date>
            <delta_ts>2021-07-14 16:42:48 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-227778-20210714161638.patch</filename>
            <type>text/plain</type>
            <size>15954</size>
            <attacher name="Sihui Liu">sihui_liu</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjc5OTAzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMzljMmIyNWVlNmE3YzNh
ZmE2NTZlNzc2MDNmY2YxZjIyNjQ5OWFhNC4uNGU0NmQwYTA3M2ZlYWZmZWNiNTE2N2ZlNWQ2ZjQ5
NDY4MGRlMDc3ZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE3IEBACisyMDIxLTA3LTE0ICBTaWh1
aSBMaXUgIDxzaWh1aV9saXVAYXBwbGUuY29tPgorCisgICAgICAgIERvIG5vdCBhYm9ydCBvbmdv
aW5nIElEQiB0cmFuc2FjdGlvbiBzeW5jaHJvbm91c2x5IG9uIG5vbi1pbW1pbmVudCBQcmVwYXJl
VG9TdXNwZW5kIG1lc3NhZ2UKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTIyNzc3OAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgICogTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL0lEQlNlcnZlci5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpJREJTZXJ2ZXI6OklEQlNlcnZlcjo6aGFzRGF0YWJhc2VBY3Rpdml0aWVz
T25NYWluVGhyZWFkIGNvbnN0KToKKyAgICAgICAgKiBNb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIv
SURCU2VydmVyLmg6CisgICAgICAgICogTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL1VuaXF1ZUlE
QkRhdGFiYXNlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OklEQlNlcnZlcjo6VW5pcXVlSURCRGF0
YWJhc2U6Omhhc0FjdGl2ZVRyYW5zYWN0aW9ucyBjb25zdCk6CisgICAgICAgICogTW9kdWxlcy9p
bmRleGVkZGIvc2VydmVyL1VuaXF1ZUlEQkRhdGFiYXNlLmg6CisKIDIwMjEtMDctMTMgIEFsZXgg
Q2hyaXN0ZW5zZW4gIDxhY2hyaXN0ZW5zZW5Ad2Via2l0Lm9yZz4KIAogICAgICAgICA+NEsgUmVm
ZXJlciBzaG91bGQgaGF2ZSB0YWlsaW5nIC8KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvQ2hh
bmdlTG9nIGIvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cKaW5kZXggODJjOGNjODhmZjAyNTUxMmVh
ZjU0N2JlZmIwNTAwYmFmNmRkYzBjMS4uM2ViNDEzZjg5MzQxNWJjYTc4ZTIyZmU3OTYxMzdiZDU0
MWU4ZDZhYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cKKysrIGIvU291cmNl
L1dlYktpdC9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzMyBAQAorMjAyMS0wNy0xNCAgU2lodWkgTGl1
ICA8c2lodWlfbGl1QGFwcGxlLmNvbT4KKworICAgICAgICBEbyBub3QgYWJvcnQgb25nb2luZyBJ
REIgdHJhbnNhY3Rpb24gc3luY2hyb25vdXNseSBvbiBub24taW1taW5lbnQgUHJlcGFyZVRvU3Vz
cGVuZCBtZXNzYWdlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD0yMjc3NzgKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAg
ICAgICBDdXJyZW50bHkgd2UgYWJvcnQgSURCIHRyYW5zYWN0aW9ucyBhbmQgc3VzcGVuZCBJREIg
dGhyZWFkIHN5bmNocm9ub3VzbHkgaW4gTmV0d29ya1Byb2Nlc3M6OnByZXBhcmVUb1N1c3BlbmQu
CisgICAgICAgIEFzIFVJIHByb2Nlc3MgZG9lcyBub3Qga25vdyB0aGUgZmlsZSBsb2NraW5nIHN0
YXRlIGluIG5ldHdvcmsgcHJvY2VzcyBub3cgKGJlY2F1c2UgbmV0d29yayBwcm9jZXNzIHRyYWNr
cworICAgICAgICB0aGUgc3RhdGUgYW5kIHRha2VzIHRoZSBhc3NlcnRpb24gYnkgaXRzZWxmKSwg
VUkgcHJvY2VzcyBtYXkgc2VuZCBub24taW1taW5lbnQgUHJlcGFyZVRvU3VzcGVuZCBtb3JlIG9m
dGVuLAorICAgICAgICBhbmQgd2UgbWF5IGFib3J0IHRyYW5zYWN0aW9uIHRvbyBhZ2dyZXNzaXZl
bHkgKGUuZy4gVUkgcHJvY2VzcyBtYXkgc2VuZCB0aGUgbWVzc2FnZSBhcyBzb29uIGFzIGFwcCBp
cyBpbiAKKyAgICAgICAgYmFja2dyb3VuZCkuIFRvIGZpeCB0aGUgcG9zc2libGUgcmVncmVzc2lv
biBvZiBkYXRhIGxvc3MsIHdlIG5vdyBzY2hlZHVsZSBhIHRhc2sgd2l0aCA1cyBkZWxheSB0byBh
Ym9ydAorICAgICAgICBldmVyeXRoaW5nLiBJbiB0aGlzIGNhc2UsIHRyYW5zYWN0aW9ucyBmaW5p
c2hlZCBpbiA1cyBhZnRlciBQcmVwYXJlVG9TdXNwZW5kIG1lc3NhZ2Ugd2lsbCBub3QgYmUgYWJv
cnRlZC4KKworICAgICAgICAqIE5ldHdvcmtQcm9jZXNzL0luZGV4ZWREQi9XZWJJREJTZXJ2ZXIu
Y3BwOgorICAgICAgICAqIE5ldHdvcmtQcm9jZXNzL0luZGV4ZWREQi9XZWJJREJTZXJ2ZXIuaDoK
KyAgICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9OZXR3b3JrUHJvY2Vzcy5jcHA6CisgICAgICAgIChX
ZWJLaXQ6Ok5ldHdvcmtQcm9jZXNzOjpzdXNwZW5kSURCU2VydmVycyk6CisgICAgICAgIChXZWJL
aXQ6Ok5ldHdvcmtQcm9jZXNzOjpwcmVwYXJlVG9TdXNwZW5kKToKKyAgICAgICAgKiBOZXR3b3Jr
UHJvY2Vzcy9OZXR3b3JrUHJvY2Vzcy5oOgorICAgICAgICAqIE5ldHdvcmtQcm9jZXNzL2lvcy9O
ZXR3b3JrUHJvY2Vzc0lPUy5tbToKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya1Byb2Nlc3M6OnNl
dElzSG9sZGluZ0xvY2tlZEZpbGVzKToKKyAgICAgICAgKiBVSVByb2Nlc3MvUHJvY2Vzc0Fzc2Vy
dGlvbi5oOgorICAgICAgICAoV2ViS2l0OjpQcm9jZXNzQXNzZXJ0aW9uOjpzZXRQcmVwYXJlRm9y
SW52YWxpZGF0aW9uSGFuZGxlcik6CisgICAgICAgICogVUlQcm9jZXNzL2lvcy9Qcm9jZXNzQXNz
ZXJ0aW9uSU9TLm1tOgorICAgICAgICAoLVtXS1Byb2Nlc3NBc3NlcnRpb25CYWNrZ3JvdW5kVGFz
a01hbmFnZXIgZGVhbGxvY10pOgorICAgICAgICAoLVtXS1JCU0Fzc2VydGlvbkRlbGVnYXRlIGFz
c2VydGlvbldpbGxJbnZhbGlkYXRlOl0pOgorICAgICAgICAoV2ViS2l0OjpQcm9jZXNzQXNzZXJ0
aW9uOjpQcm9jZXNzQXNzZXJ0aW9uKToKKyAgICAgICAgKFdlYktpdDo6UHJvY2Vzc0Fzc2VydGlv
bjo6cHJvY2Vzc0Fzc2VydGlvbldpbGxCZUludmFsaWRhdGVkKToKKwogMjAyMS0wNy0xMyAgV2Vu
c29uIEhzaWVoICA8d2Vuc29uX2hzaWVoQGFwcGxlLmNvbT4KIAogICAgICAgICBbV0syXSBQdXNo
IE9TIHN0YXRlIGR1bXBpbmcgbG9naWMgZG93biBmcm9tIFdlYlByb2Nlc3MgdG8gQXV4aWxpYXJ5
UHJvY2VzcwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2Vy
dmVyL0lEQlNlcnZlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2
ZXIvSURCU2VydmVyLmNwcAppbmRleCA0OWQ4NzY2MmZjYjNhNWFlMjNmMmE3YWI1MjdlNjU1N2Mz
MjZlYTNiLi44MjBkMzJmNWI3YmM1OGRlY2ZmODU3ZDIxMTVlNGQ5ODA3MzZmY2FjIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmNw
cAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVy
LmNwcApAQCAtNzY3LDYgKzc2NywyMiBAQCB2b2lkIElEQlNlcnZlcjo6dXBncmFkZUZpbGVzSWZO
ZWNlc3NhcnkoKQogICAgICAgICBGaWxlU3lzdGVtOjptYWtlQWxsRGlyZWN0b3JpZXMobmV3VmVy
c2lvbkRpcmVjdG9yeSk7CiB9CiAKK2Jvb2wgSURCU2VydmVyOjpoYXNEYXRhYmFzZUFjdGl2aXRp
ZXNPbk1haW5UaHJlYWQoKSBjb25zdAoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Cisg
ICAgQVNTRVJUKG1fbG9jay5pc0hlbGQoKSk7CisKKyAgICBpZiAobV9zZXNzaW9uSUQuaXNFcGhl
bWVyYWwoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBmb3IgKGF1dG8mIGRhdGFiYXNl
IDogbV91bmlxdWVJREJEYXRhYmFzZU1hcC52YWx1ZXMoKSkgeworICAgICAgICBpZiAoIWRhdGFi
YXNlLT5pZGVudGlmaWVyKCkuaXNUcmFuc2llbnQoKSAmJiBkYXRhYmFzZS0+aGFzQWN0aXZlVHJh
bnNhY3Rpb25zKCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAg
cmV0dXJuIGZhbHNlOworfQorCiB2b2lkIElEQlNlcnZlcjo6c3RvcERhdGFiYXNlQWN0aXZpdGll
c09uTWFpblRocmVhZCgpCiB7CiAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9JREJTZXJ2ZXIuaCBi
L1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9JREJTZXJ2ZXIuaAppbmRl
eCBiYzcyMzBjODBjZmI2NDZhZmVjOGRlNTkwYzMwMzU0NjcwZjRjN2VkLi42MDhkN2ZhYjllY2Q3
NjVkOTdmMGMwODMzM2ZmNGRiNTQwMDEwN2IxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9N
b2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmgKKysrIGIvU291cmNlL1dlYkNvcmUv
TW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL0lEQlNlcnZlci5oCkBAIC0xMDcsNiArMTA3LDcgQEAg
cHVibGljOgogICAgIFN0b3JhZ2VRdW90YU1hbmFnZXI6OkRlY2lzaW9uIHJlcXVlc3RTcGFjZShj
b25zdCBDbGllbnRPcmlnaW4mLCB1aW50NjRfdCB0YXNrU2l6ZSk7CiAgICAgV0VCQ09SRV9FWFBP
UlQgc3RhdGljIHVpbnQ2NF90IGRpc2tVc2FnZShjb25zdCBTdHJpbmcmIHJvb3REaXJlY3Rvcnks
IGNvbnN0IENsaWVudE9yaWdpbiYpOwogCisgICAgV0VCQ09SRV9FWFBPUlQgYm9vbCBoYXNEYXRh
YmFzZUFjdGl2aXRpZXNPbk1haW5UaHJlYWQoKSBjb25zdDsKICAgICBXRUJDT1JFX0VYUE9SVCB2
b2lkIHN0b3BEYXRhYmFzZUFjdGl2aXRpZXNPbk1haW5UaHJlYWQoKTsKIAogcHJpdmF0ZToKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9VbmlxdWVJ
REJEYXRhYmFzZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIv
VW5pcXVlSURCRGF0YWJhc2UuY3BwCmluZGV4IDk5ZTE4NTg0ODNiODdkM2U0Y2Q0MDJjOTcyN2M4
Y2E1M2ZmM2E3M2YuLjg2Y2I3MDVjNTU3Y2E2MjhhYjI1NDJjYzRlNWU3ODI2Y2Y1YTAzOTMgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9VbmlxdWVJ
REJEYXRhYmFzZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2Vy
dmVyL1VuaXF1ZUlEQkRhdGFiYXNlLmNwcApAQCAtMTE5MSw2ICsxMTkxLDEzIEBAIHZvaWQgVW5p
cXVlSURCRGF0YWJhc2U6OmltbWVkaWF0ZUNsb3NlKCkKICAgICBjbG9zZSgpOwogfQogCitib29s
IFVuaXF1ZUlEQkRhdGFiYXNlOjpoYXNBY3RpdmVUcmFuc2FjdGlvbnMoKSBjb25zdAoreworICAg
IEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisKKyAgICByZXR1cm4gIW1faW5Qcm9ncmVzc1RyYW5z
YWN0aW9ucy5pc0VtcHR5KCk7Cit9CisKIHZvaWQgVW5pcXVlSURCRGF0YWJhc2U6OmFib3J0QWN0
aXZlVHJhbnNhY3Rpb25zKCkKIHsKICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL1VuaXF1ZUlEQkRh
dGFiYXNlLmggYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVl
SURCRGF0YWJhc2UuaAppbmRleCAyMzZlMmJiNTVhMzUzNjI4OWFjNWY3NTVjOThhYzBmODVhYTM4
Nzk4Li5kZmFkZGI5N2NjMjI1OGU3ZTQwZWVjOGZhMjEwODQ2OGIwY2RjYTM0IDEwMDY0NAotLS0g
YS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVlSURCRGF0YWJh
c2UuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVl
SURCRGF0YWJhc2UuaApAQCAtMTA3LDYgKzEwNyw3IEBAIHB1YmxpYzoKICAgICB2b2lkIGhhbmRs
ZURlbGV0ZShJREJDb25uZWN0aW9uVG9DbGllbnQmLCBjb25zdCBJREJSZXF1ZXN0RGF0YSYpOwog
ICAgIHZvaWQgaW1tZWRpYXRlQ2xvc2UoKTsKIAorICAgIGJvb2wgaGFzQWN0aXZlVHJhbnNhY3Rp
b25zKCkgY29uc3Q7CiAgICAgdm9pZCBhYm9ydEFjdGl2ZVRyYW5zYWN0aW9ucygpOwogICAgIGJv
b2wgdHJ5Q2xvc2UoKTsKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vz
cy9JbmRleGVkREIvV2ViSURCU2VydmVyLmNwcCBiL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nl
c3MvSW5kZXhlZERCL1dlYklEQlNlcnZlci5jcHAKaW5kZXggNTc1Mzc3ZDhlMmZkM2ZlMWQ3NTAy
ZDcxODA5NTFiNmRmMjYxZTE1NS4uNjU2OTQxMzQ0OWJlZjI1MmFjMjVmZWE0YjU1ZjBkNmUyOWFl
OWI1OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9JbmRleGVkREIv
V2ViSURCU2VydmVyLmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0L05ldHdvcmtQcm9jZXNzL0luZGV4
ZWREQi9XZWJJREJTZXJ2ZXIuY3BwCkBAIC0xMTUsMTcgKzExNSwzMiBAQCB2b2lkIFdlYklEQlNl
cnZlcjo6cmVuYW1lT3JpZ2luKGNvbnN0IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYgb2xk
T3JpZ2luLCBjbwogICAgIH0pOwogfQogCi12b2lkIFdlYklEQlNlcnZlcjo6c3VzcGVuZCgpIFdU
Rl9JR05PUkVTX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMKK2Jvb2wgV2ViSURCU2VydmVyOjpzdXNw
ZW5kKElzU3VzcGVuc2lvbkltbWluZW50IGlzU3VzcGVuc2lvbkltbWluZW50KSBXVEZfSUdOT1JF
U19USFJFQURfU0FGRVRZX0FOQUxZU0lTCiB7CiAgICAgQVNTRVJUKFJ1bkxvb3A6OmlzTWFpbigp
KTsKIAogICAgIGlmIChtX2lzU3VzcGVuZGVkKQotICAgICAgICByZXR1cm47CisgICAgICAgIHJl
dHVybiB0cnVlOwogCiAgICAgbV9pc1N1c3BlbmRlZCA9IHRydWU7CiAgICAgbV9zZXJ2ZXJMb2Nr
LmxvY2soKTsKLSAgICBpZiAobV9zZXJ2ZXIpCisKKyAgICBpZiAoIW1fc2VydmVyKQorICAgICAg
ICByZXR1cm4gdHJ1ZTsKKworICAgIGlmIChpc1N1c3BlbnNpb25JbW1pbmVudCA9PSBJc1N1c3Bl
bnNpb25JbW1pbmVudDo6WWVzKSB7CiAgICAgICAgIG1fc2VydmVyLT5zdG9wRGF0YWJhc2VBY3Rp
dml0aWVzT25NYWluVGhyZWFkKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAg
IC8vIFN1c3BlbmQgdG8gYXZvaWQgc3RhcnRpbmcgbmV3IHRyYW5zYWN0aW9ucyBpZiB0aGVyZSBp
cyBubyBvbmdvaW5nIHRyYW5zYWN0aW9uLgorICAgIGlmICghbV9zZXJ2ZXItPmhhc0RhdGFiYXNl
QWN0aXZpdGllc09uTWFpblRocmVhZCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8v
IFJlc3VtZSB0byBhbGxvdyBvbmdvaW5nIHRyYW5zYWN0aW9ucyB0byBiZSBmaW5pc2hlZC4KKyAg
ICBtX3NlcnZlckxvY2sudW5sb2NrKCk7CisgICAgbV9pc1N1c3BlbmRlZCA9IGZhbHNlOworICAg
IHJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBXZWJJREJTZXJ2ZXI6OnJlc3VtZSgpIFdURl9JR05P
UkVTX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvTmV0
d29ya1Byb2Nlc3MvSW5kZXhlZERCL1dlYklEQlNlcnZlci5oIGIvU291cmNlL1dlYktpdC9OZXR3
b3JrUHJvY2Vzcy9JbmRleGVkREIvV2ViSURCU2VydmVyLmgKaW5kZXggNjk3MDdiMjczOTdkYmU1
NmU0NmY3NWMzMWYzMTkwNTk2ZTBiNDE5OC4uNTFiZGUzOGU3MDkzZDNkNTdhNmJiOGY0NmU4Mzcx
ZDYwNjBkNjIzMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9JbmRl
eGVkREIvV2ViSURCU2VydmVyLmgKKysrIGIvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9J
bmRleGVkREIvV2ViSURCU2VydmVyLmgKQEAgLTUyLDcgKzUyLDggQEAgcHVibGljOgogICAgIHZv
aWQgY2xvc2VBbmREZWxldGVEYXRhYmFzZXNGb3JPcmlnaW5zKGNvbnN0IFZlY3RvcjxXZWJDb3Jl
OjpTZWN1cml0eU9yaWdpbkRhdGE+JiwgQ29tcGxldGlvbkhhbmRsZXI8dm9pZCgpPiYmIGNhbGxi
YWNrKTsKICAgICB2b2lkIHJlbmFtZU9yaWdpbihjb25zdCBXZWJDb3JlOjpTZWN1cml0eU9yaWdp
bkRhdGEmLCBjb25zdCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmLCBDb21wbGV0aW9uSGFu
ZGxlcjx2b2lkKCk+JiYpOwogCi0gICAgdm9pZCBzdXNwZW5kKCk7CisgICAgZW51bSBjbGFzcyBJ
c1N1c3BlbnNpb25JbW1pbmVudCA6IGJvb2wgeyBObywgWWVzIH07CisgICAgYm9vbCBzdXNwZW5k
KElzU3VzcGVuc2lvbkltbWluZW50ID0gSXNTdXNwZW5zaW9uSW1taW5lbnQ6Olllcyk7CiAgICAg
dm9pZCByZXN1bWUoKTsKIAogICAgIC8vIE1lc3NhZ2UgaGFuZGxlcnMuCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViS2l0L05ldHdvcmtQcm9jZXNzL05ldHdvcmtQcm9jZXNzLmNwcCBiL1NvdXJjZS9X
ZWJLaXQvTmV0d29ya1Byb2Nlc3MvTmV0d29ya1Byb2Nlc3MuY3BwCmluZGV4IGFlYTJmYWE1OGEx
NTgxZjAwYmY1NmJjZWVlZDE3N2I0NGE0MzYwOTYuLjk1OTU3MmYzYzc3Yzc4ZTBhOTUzZjg0MzM5
ZjNiMzFlNTVlOGIxYWMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3Mv
TmV0d29ya1Byb2Nlc3MuY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvTmV0
d29ya1Byb2Nlc3MuY3BwCkBAIC0yMjExLDE0ICsyMjExLDQzIEBAIHZvaWQgTmV0d29ya1Byb2Nl
c3M6OnByb2Nlc3NXaWxsU3VzcGVuZEltbWluZW50bHlGb3JUZXN0aW5nU3luYyhDb21wbGV0aW9u
SGFuZGxlCiAgICAgcHJlcGFyZVRvU3VzcGVuZCh0cnVlLCBXVEZNb3ZlKGNvbXBsZXRpb25IYW5k
bGVyKSk7CiB9CiAKK3ZvaWQgTmV0d29ya1Byb2Nlc3M6OnN1c3BlbmRJREJTZXJ2ZXJzKGJvb2wg
aXNTdXNwZW5zaW9uSW1taW5lbnQpCit7CisgICAgbV9zaG91bGRTdXNwZW5kSURCU2VydmVyID0g
dHJ1ZTsKKworICAgIGlmIChpc1N1c3BlbnNpb25JbW1pbmVudCkgeworICAgICAgICBmb3IgKGF1
dG8mIHNlcnZlciA6IG1fd2ViSURCU2VydmVycy52YWx1ZXMoKSkKKyAgICAgICAgICAgIHNlcnZl
ci0+c3VzcGVuZCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBzaG91bGRT
Y2hlZHVsZVN1c3BlbnNpb25UYXNrID0gZmFsc2U7CisgICAgZm9yIChhdXRvJiBzZXJ2ZXIgOiBt
X3dlYklEQlNlcnZlcnMudmFsdWVzKCkpIHsKKyAgICAgICAgaWYgKCFzZXJ2ZXItPnN1c3BlbmQo
V2ViSURCU2VydmVyOjpJc1N1c3BlbnNpb25JbW1pbmVudDo6Tm8pKQorICAgICAgICAgICAgc2hv
dWxkU2NoZWR1bGVTdXNwZW5zaW9uVGFzayA9IHRydWU7CisgICAgfQorCisgICAgaWYgKCFzaG91
bGRTY2hlZHVsZVN1c3BlbnNpb25UYXNrKQorICAgICAgICByZXR1cm47CisKKyAgICBSdW5Mb29w
OjptYWluKCkuZGlzcGF0Y2hBZnRlcig1X3MsIFt0aGlzLCB3ZWFrVGhpcyA9IG1ha2VXZWFrUHRy
KCp0aGlzKV0geworICAgICAgICBpZiAoIXdlYWtUaGlzKQorICAgICAgICAgICAgcmV0dXJuOwor
CisgICAgICAgIGlmICghbV9zaG91bGRTdXNwZW5kSURCU2VydmVyKQorICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICAKKyAgICAgICAgZm9yIChhdXRvJiBzZXJ2ZXIgOiBtX3dlYklEQlNlcnZl
cnMudmFsdWVzKCkpCisgICAgICAgICAgICBzZXJ2ZXItPnN1c3BlbmQoKTsKKyAgICB9KTsKK30K
Kwogdm9pZCBOZXR3b3JrUHJvY2Vzczo6cHJlcGFyZVRvU3VzcGVuZChib29sIGlzU3VzcGVuc2lv
bkltbWluZW50LCBDb21wbGV0aW9uSGFuZGxlcjx2b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIp
CiB7CiAgICAgUkVMRUFTRV9MT0coUHJvY2Vzc1N1c3BlbnNpb24sICIlcCAtIE5ldHdvcmtQcm9j
ZXNzOjpwcmVwYXJlVG9TdXNwZW5kKCksIGlzU3VzcGVuc2lvbkltbWluZW50PSVkIiwgdGhpcywg
aXNTdXNwZW5zaW9uSW1taW5lbnQpOwogCiAjaWYgUExBVEZPUk0oSU9TX0ZBTUlMWSkKLSAgICBm
b3IgKGF1dG8mIHNlcnZlciA6IG1fd2ViSURCU2VydmVycy52YWx1ZXMoKSkKLSAgICAgICAgc2Vy
dmVyLT5zdXNwZW5kKCk7Ci0gICAgbV9zaG91bGRTdXNwZW5kSURCU2VydmVyID0gdHJ1ZTsKKyAg
ICBzdXNwZW5kSURCU2VydmVycyhpc1N1c3BlbnNpb25JbW1pbmVudCk7CiAjZW5kaWYKIAogICAg
IGxvd01lbW9yeUhhbmRsZXIoQ3JpdGljYWw6Olllcyk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
S2l0L05ldHdvcmtQcm9jZXNzL05ldHdvcmtQcm9jZXNzLmggYi9Tb3VyY2UvV2ViS2l0L05ldHdv
cmtQcm9jZXNzL05ldHdvcmtQcm9jZXNzLmgKaW5kZXggNzk0ODA5N2FhM2RjMzg2YTJmZDQxZmFk
NjIzYjNjZWNkZjhkN2U0YS4uZWE5Y2JiYjI3MTg2MzllODg4ZTNjMDUzMzgyODA3ZmVhZTk0YTcw
YyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9OZXR3b3JrUHJvY2Vz
cy5oCisrKyBiL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvTmV0d29ya1Byb2Nlc3MuaApA
QCAtNDg2LDYgKzQ4Niw3IEBAIHByaXZhdGU6CiAgICAgUmVmPFdlYklEQlNlcnZlcj4gY3JlYXRl
V2ViSURCU2VydmVyKFBBTDo6U2Vzc2lvbklEKTsKICAgICB2b2lkIHNldFNlc3Npb25TdG9yYWdl
UXVvdGFNYW5hZ2VySURCUm9vdFBhdGgoUEFMOjpTZXNzaW9uSUQsIGNvbnN0IFN0cmluZyYgaWRi
Um9vdFBhdGgpOwogICAgIHZvaWQgcmVtb3ZlV2ViSURCU2VydmVySWZQb3NzaWJsZShQQUw6OlNl
c3Npb25JRCk7CisgICAgdm9pZCBzdXNwZW5kSURCU2VydmVycyhib29sIGlzU3VzcGVuc2lvbklt
bWluZW50KTsKIAogI2lmIEVOQUJMRShTRVJWSUNFX1dPUktFUikKICAgICB2b2lkIGRpZENyZWF0
ZVdvcmtlckNvbnRleHRQcm9jZXNzQ29ubmVjdGlvbihjb25zdCBJUEM6OkF0dGFjaG1lbnQmKTsK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvaW9zL05ldHdvcmtQcm9j
ZXNzSU9TLm1tIGIvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9pb3MvTmV0d29ya1Byb2Nl
c3NJT1MubW0KaW5kZXggNjQ5NGI1YTc5OGFmNjkwODFlYTNkN2E1YTNjYzU1ZWM4MjdlNGJmNC4u
MmYzYjFlNjAyNDEwZjQyMzEwNThkODc0ZmM0NDQ4YmJmNmQ4ZTM4ZCAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9pb3MvTmV0d29ya1Byb2Nlc3NJT1MubW0KKysrIGIv
U291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9pb3MvTmV0d29ya1Byb2Nlc3NJT1MubW0KQEAg
LTExMyw2ICsxMTMsMTUgQEAgdm9pZCBOZXR3b3JrUHJvY2Vzczo6c2V0SXNIb2xkaW5nTG9ja2Vk
RmlsZXMoYm9vbCBpc0hvbGRpbmdMb2NrZWRGaWxlcykKICAgICAvLyBXZSBzeW5jaHJvbm91c2x5
IHRha2UgYSBwcm9jZXNzIGFzc2VydGlvbiB3aGVuIGJlZ2lubmluZyBhIFNRTGl0ZSB0cmFuc2Fj
dGlvbiBzbyB0aGF0IHdlIGRvbid0IGdldCBzdXNwZW5kZWQKICAgICAvLyB3aGlsZSBob2xkaW5n
IGEgbG9ja2VkIGZpbGUuIFdlIHdvdWxkIGdldCBraWxsZWQgaWYgc3VzcGVuZGVkIHdoaWxlIGhv
bGRpbmcgbG9ja2VkIGZpbGVzLgogICAgIG1faG9sZGluZ0xvY2tlZEZpbGVBc3NlcnRpb24gPSBQ
cm9jZXNzQXNzZXJ0aW9uOjpjcmVhdGUoZ2V0Q3VycmVudFByb2Nlc3NJRCgpLCAiTmV0d29yayBQ
cm9jZXNzIGlzIGhvbGRpbmcgbG9ja2VkIGZpbGVzIl9zLCBQcm9jZXNzQXNzZXJ0aW9uVHlwZTo6
RmluaXNoVGFza1VuaW50ZXJydXB0YWJsZSwgUHJvY2Vzc0Fzc2VydGlvbjo6TW9kZTo6U3luYyk7
CisgICAgbV9ob2xkaW5nTG9ja2VkRmlsZUFzc2VydGlvbi0+c2V0UHJlcGFyZUZvckludmFsaWRh
dGlvbkhhbmRsZXIoW3RoaXMsIHdlYWtUaGlzID0gbWFrZVdlYWtQdHIoKnRoaXMpXSgpIG11dGFi
bGUgeworICAgICAgICBjYWxsT25NYWluUnVuTG9vcEFuZFdhaXQoW3RoaXMsIHdlYWtUaGlzID0g
V1RGTW92ZSh3ZWFrVGhpcyldKCkgeworICAgICAgICAgICAgaWYgKCF3ZWFrVGhpcykKKyAgICAg
ICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGZvciAoYXV0byYgc2VydmVyIDogbV93
ZWJJREJTZXJ2ZXJzLnZhbHVlcygpKQorICAgICAgICAgICAgICAgIHNlcnZlci0+c3VzcGVuZCgp
OworICAgICAgICB9KTsKKyAgICB9KTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9Qcm9jZXNzQXNzZXJ0aW9uLmggYi9Tb3Vy
Y2UvV2ViS2l0L1VJUHJvY2Vzcy9Qcm9jZXNzQXNzZXJ0aW9uLmgKaW5kZXggNzEzZmI5ZmJhYjE4
NmZhNzdmMWQwMGNjNTUyMzY5MGM0Y2U1MDNjOC4uY2I3ZGRlZDZmZWQ4ZmE1Y2NmM2E5MDZjMzM4
NDBlN2Y5Y2ExYjMzNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvUHJvY2Vz
c0Fzc2VydGlvbi5oCisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1Byb2Nlc3NBc3NlcnRp
b24uaApAQCAtNzIsNiArNzIsNyBAQCBwdWJsaWM6CiAgICAgfQogICAgIHZpcnR1YWwgflByb2Nl
c3NBc3NlcnRpb24oKTsKIAorICAgIHZvaWQgc2V0UHJlcGFyZUZvckludmFsaWRhdGlvbkhhbmRs
ZXIoRnVuY3Rpb248dm9pZCgpPiYmIGhhbmRsZXIpIHsgbV9wcmVwYXJlRm9ySW52YWxpZGF0aW9u
SGFuZGxlciA9IFdURk1vdmUoaGFuZGxlcik7IH0KICAgICB2b2lkIHNldEludmFsaWRhdGlvbkhh
bmRsZXIoRnVuY3Rpb248dm9pZCgpPiYmIGhhbmRsZXIpIHsgbV9pbnZhbGlkYXRpb25IYW5kbGVy
ID0gV1RGTW92ZShoYW5kbGVyKTsgfQogCiAgICAgUHJvY2Vzc0Fzc2VydGlvblR5cGUgdHlwZSgp
IGNvbnN0IHsgcmV0dXJuIG1fYXNzZXJ0aW9uVHlwZTsgfQpAQCAtODYsNiArODcsNyBAQCBwcm90
ZWN0ZWQ6CiAgICAgdm9pZCBhY3F1aXJlU3luYygpOwogCiAjaWYgUExBVEZPUk0oSU9TX0ZBTUlM
WSkKKyAgICB2b2lkIHByb2Nlc3NBc3NlcnRpb25XaWxsQmVJbnZhbGlkYXRlZCgpOwogICAgIHZp
cnR1YWwgdm9pZCBwcm9jZXNzQXNzZXJ0aW9uV2FzSW52YWxpZGF0ZWQoKTsKICNlbmRpZgogCkBA
IC05OCw2ICsxMDAsNyBAQCBwcml2YXRlOgogICAgIFJldGFpblB0cjxXS1JCU0Fzc2VydGlvbkRl
bGVnYXRlPiBtX2RlbGVnYXRlOwogICAgIGJvb2wgbV93YXNJbnZhbGlkYXRlZCB7IGZhbHNlIH07
CiAjZW5kaWYKKyAgICBGdW5jdGlvbjx2b2lkKCk+IG1fcHJlcGFyZUZvckludmFsaWRhdGlvbkhh
bmRsZXI7CiAgICAgRnVuY3Rpb248dm9pZCgpPiBtX2ludmFsaWRhdGlvbkhhbmRsZXI7CiB9Owog
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9pb3MvUHJvY2Vzc0Fzc2VydGlv
bklPUy5tbSBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL2lvcy9Qcm9jZXNzQXNzZXJ0aW9uSU9T
Lm1tCmluZGV4IGYzNTExNmQxYTBhNGMzZmI5OTU0Mjc0ZWE1NTZlMzlkYzVkNmYxYzUuLjc2ZjBm
ZTNjNmJiM2NmY2YzYmJhYmJhNWU5YTM0Zjg2Nzg4NTg1ZGQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJLaXQvVUlQcm9jZXNzL2lvcy9Qcm9jZXNzQXNzZXJ0aW9uSU9TLm1tCisrKyBiL1NvdXJjZS9X
ZWJLaXQvVUlQcm9jZXNzL2lvcy9Qcm9jZXNzQXNzZXJ0aW9uSU9TLm1tCkBAIC0xMDQsNiArMTA0
LDcgQEAgc3RhdGljIGJvb2wgcHJvY2Vzc0hhc0FjdGl2ZVJ1blRpbWVMaW1pdGF0aW9uKCkKIAog
LSAodm9pZClkZWFsbG9jCiB7CisgICAgW19wcmVwYXJlRm9ySW52YWxpZGF0aW9uQ2FsbGJhY2sg
cmVsZWFzZV07CiAgICAgW3NlbGYgX3JlbGVhc2VCYWNrZ3JvdW5kVGFza107CiAgICAgW3N1cGVy
IGRlYWxsb2NdOwogfQpAQCAtMjU1LDEyICsyNTYsMTQgQEAgc3RhdGljIGJvb2wgcHJvY2Vzc0hh
c0FjdGl2ZVJ1blRpbWVMaW1pdGF0aW9uKCkKIHR5cGVkZWYgdm9pZCheUkJTQXNzZXJ0aW9uSW52
YWxpZGF0aW9uQ2FsbGJhY2tUeXBlKSgpOwogCiBAaW50ZXJmYWNlIFdLUkJTQXNzZXJ0aW9uRGVs
ZWdhdGUgOiBOU09iamVjdDxSQlNBc3NlcnRpb25PYnNlcnZpbmc+CitAcHJvcGVydHkgKGNvcHkp
IFJCU0Fzc2VydGlvbkludmFsaWRhdGlvbkNhbGxiYWNrVHlwZSBwcmVwYXJlRm9ySW52YWxpZGF0
aW9uQ2FsbGJhY2s7CiBAcHJvcGVydHkgKGNvcHkpIFJCU0Fzc2VydGlvbkludmFsaWRhdGlvbkNh
bGxiYWNrVHlwZSBpbnZhbGlkYXRpb25DYWxsYmFjazsKIEBlbmQKIAogQGltcGxlbWVudGF0aW9u
IFdLUkJTQXNzZXJ0aW9uRGVsZWdhdGUKIC0gKHZvaWQpZGVhbGxvYwogeworICAgIFtfcHJlcGFy
ZUZvckludmFsaWRhdGlvbkNhbGxiYWNrIHJlbGVhc2VdOwogICAgIFtfaW52YWxpZGF0aW9uQ2Fs
bGJhY2sgcmVsZWFzZV07CiAgICAgW3N1cGVyIGRlYWxsb2NdOwogfQpAQCAtMjY4LDYgKzI3MSw4
IEBAIHR5cGVkZWYgdm9pZCheUkJTQXNzZXJ0aW9uSW52YWxpZGF0aW9uQ2FsbGJhY2tUeXBlKSgp
OwogLSAodm9pZClhc3NlcnRpb25XaWxsSW52YWxpZGF0ZTooUkJTQXNzZXJ0aW9uICopYXNzZXJ0
aW9uCiB7CiAgICAgUkVMRUFTRV9MT0coUHJvY2Vzc1N1c3BlbnNpb24sICIlcCAtIFdLUkJTQXNz
ZXJ0aW9uRGVsZWdhdGU6IGFzc2VydGlvbldpbGxJbnZhbGlkYXRlIiwgc2VsZik7CisKKyAgICBf
cHJlcGFyZUZvckludmFsaWRhdGlvbkNhbGxiYWNrKCk7CiB9CiAKIC0gKHZvaWQpYXNzZXJ0aW9u
OihSQlNBc3NlcnRpb24gKilhc3NlcnRpb24gZGlkSW52YWxpZGF0ZVdpdGhFcnJvcjooTlNFcnJv
ciAqKWVycm9yCkBAIC0zMzksNiArMzQ0LDEwIEBAIFByb2Nlc3NBc3NlcnRpb246OlByb2Nlc3NB
c3NlcnRpb24ocGlkX3QgcGlkLCBjb25zdCBTdHJpbmcmIHJlYXNvbiwgUHJvY2Vzc0Fzc2VyCiAg
ICAgICAgIFJFTEVBU0VfTE9HKFByb2Nlc3NTdXNwZW5zaW9uLCAiJXAgLSBQcm9jZXNzQXNzZXJ0
aW9uOiBSQlMgJXtwdWJsaWN9QCBhc3NlcnRpb24gZm9yIHByb2Nlc3Mgd2l0aCBQSUQ9JWQgd2Fz
IGludmFsaWRhdGVkIiwgdGhpcywgcnVubmluZ0JvYXJkQXNzZXJ0aW9uTmFtZSwgcGlkKTsKICAg
ICAgICAgcHJvY2Vzc0Fzc2VydGlvbldhc0ludmFsaWRhdGVkKCk7CiAgICAgfTsKKyAgICBtX2Rl
bGVnYXRlLmdldCgpLnByZXBhcmVGb3JJbnZhbGlkYXRpb25DYWxsYmFjayA9IF57CisgICAgICAg
IFJFTEVBU0VfTE9HKFByb2Nlc3NTdXNwZW5zaW9uLCAiJXAgLSBQcm9jZXNzQXNzZXJ0aW9uKCkg
UkJTICV7cHVibGljfUAgYXNzZXJ0aW9uIGZvciBwcm9jZXNzIHdpdGggUElEPSVkIHdpbGwgYmUg
aW52YWxpZGF0ZWQiLCB0aGlzLCBydW5uaW5nQm9hcmRBc3NlcnRpb25OYW1lLCBwaWQpOworICAg
ICAgICBwcm9jZXNzQXNzZXJ0aW9uV2lsbEJlSW52YWxpZGF0ZWQoKTsKKyAgICB9OwogfQogCiB2
b2lkIFByb2Nlc3NBc3NlcnRpb246OmFjcXVpcmVBc3luYyhDb21wbGV0aW9uSGFuZGxlcjx2b2lk
KCk+JiYgY29tcGxldGlvbkhhbmRsZXIpCkBAIC0zNzMsMTIgKzM4MiwyMSBAQCBQcm9jZXNzQXNz
ZXJ0aW9uOjp+UHJvY2Vzc0Fzc2VydGlvbigpCiAKICAgICBpZiAobV9yYnNBc3NlcnRpb24pIHsK
ICAgICAgICAgbV9kZWxlZ2F0ZS5nZXQoKS5pbnZhbGlkYXRpb25DYWxsYmFjayA9IG5pbDsKKyAg
ICAgICAgbV9kZWxlZ2F0ZS5nZXQoKS5wcmVwYXJlRm9ySW52YWxpZGF0aW9uQ2FsbGJhY2sgPSBu
aWw7CiAgICAgICAgIFttX3Jic0Fzc2VydGlvbiByZW1vdmVPYnNlcnZlcjptX2RlbGVnYXRlLmdl
dCgpXTsKICAgICAgICAgbV9kZWxlZ2F0ZSA9IG5pbDsKICAgICAgICAgW21fcmJzQXNzZXJ0aW9u
IGludmFsaWRhdGVdOwogICAgIH0KIH0KIAordm9pZCBQcm9jZXNzQXNzZXJ0aW9uOjpwcm9jZXNz
QXNzZXJ0aW9uV2lsbEJlSW52YWxpZGF0ZWQoKQoreworICAgIFJFTEVBU0VfTE9HKFByb2Nlc3NT
dXNwZW5zaW9uLCAiJXAgLSBQcm9jZXNzQXNzZXJ0aW9uOjpwcm9jZXNzQXNzZXJ0aW9uV2lsbEJl
SW52YWxpZGF0ZWQoKSBQSUQ9JWQiLCB0aGlzLCBtX3BpZCk7CisKKyAgICBpZiAobV9wcmVwYXJl
Rm9ySW52YWxpZGF0aW9uSGFuZGxlcikKKyAgICAgICAgbV9wcmVwYXJlRm9ySW52YWxpZGF0aW9u
SGFuZGxlcigpOworfQorCiB2b2lkIFByb2Nlc3NBc3NlcnRpb246OnByb2Nlc3NBc3NlcnRpb25X
YXNJbnZhbGlkYXRlZCgpCiB7CiAgICAgQVNTRVJUKFJ1bkxvb3A6OmlzTWFpbigpKTsK
</data>
<flag name="commit-queue"
          id="455828"
          type_id="3"
          status="-"
          setter="ews-feeder"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>433542</attachid>
            <date>2021-07-14 16:41:58 -0700</date>
            <delta_ts>2021-07-15 12:28:32 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-227778-20210714164157.patch</filename>
            <type>text/plain</type>
            <size>15755</size>
            <attacher name="Sihui Liu">sihui_liu</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjc5OTAzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMzljMmIyNWVlNmE3YzNh
ZmE2NTZlNzc2MDNmY2YxZjIyNjQ5OWFhNC4uNGU0NmQwYTA3M2ZlYWZmZWNiNTE2N2ZlNWQ2ZjQ5
NDY4MGRlMDc3ZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE3IEBACisyMDIxLTA3LTE0ICBTaWh1
aSBMaXUgIDxzaWh1aV9saXVAYXBwbGUuY29tPgorCisgICAgICAgIERvIG5vdCBhYm9ydCBvbmdv
aW5nIElEQiB0cmFuc2FjdGlvbiBzeW5jaHJvbm91c2x5IG9uIG5vbi1pbW1pbmVudCBQcmVwYXJl
VG9TdXNwZW5kIG1lc3NhZ2UKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTIyNzc3OAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgICogTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL0lEQlNlcnZlci5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpJREJTZXJ2ZXI6OklEQlNlcnZlcjo6aGFzRGF0YWJhc2VBY3Rpdml0aWVz
T25NYWluVGhyZWFkIGNvbnN0KToKKyAgICAgICAgKiBNb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIv
SURCU2VydmVyLmg6CisgICAgICAgICogTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL1VuaXF1ZUlE
QkRhdGFiYXNlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OklEQlNlcnZlcjo6VW5pcXVlSURCRGF0
YWJhc2U6Omhhc0FjdGl2ZVRyYW5zYWN0aW9ucyBjb25zdCk6CisgICAgICAgICogTW9kdWxlcy9p
bmRleGVkZGIvc2VydmVyL1VuaXF1ZUlEQkRhdGFiYXNlLmg6CisKIDIwMjEtMDctMTMgIEFsZXgg
Q2hyaXN0ZW5zZW4gIDxhY2hyaXN0ZW5zZW5Ad2Via2l0Lm9yZz4KIAogICAgICAgICA+NEsgUmVm
ZXJlciBzaG91bGQgaGF2ZSB0YWlsaW5nIC8KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvQ2hh
bmdlTG9nIGIvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cKaW5kZXggODJjOGNjODhmZjAyNTUxMmVh
ZjU0N2JlZmIwNTAwYmFmNmRkYzBjMS4uM2ViNDEzZjg5MzQxNWJjYTc4ZTIyZmU3OTYxMzdiZDU0
MWU4ZDZhYyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cKKysrIGIvU291cmNl
L1dlYktpdC9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzMyBAQAorMjAyMS0wNy0xNCAgU2lodWkgTGl1
ICA8c2lodWlfbGl1QGFwcGxlLmNvbT4KKworICAgICAgICBEbyBub3QgYWJvcnQgb25nb2luZyBJ
REIgdHJhbnNhY3Rpb24gc3luY2hyb25vdXNseSBvbiBub24taW1taW5lbnQgUHJlcGFyZVRvU3Vz
cGVuZCBtZXNzYWdlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNn
aT9pZD0yMjc3NzgKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAg
ICAgICBDdXJyZW50bHkgd2UgYWJvcnQgSURCIHRyYW5zYWN0aW9ucyBhbmQgc3VzcGVuZCBJREIg
dGhyZWFkIHN5bmNocm9ub3VzbHkgaW4gTmV0d29ya1Byb2Nlc3M6OnByZXBhcmVUb1N1c3BlbmQu
CisgICAgICAgIEFzIFVJIHByb2Nlc3MgZG9lcyBub3Qga25vdyB0aGUgZmlsZSBsb2NraW5nIHN0
YXRlIGluIG5ldHdvcmsgcHJvY2VzcyBub3cgKGJlY2F1c2UgbmV0d29yayBwcm9jZXNzIHRyYWNr
cworICAgICAgICB0aGUgc3RhdGUgYW5kIHRha2VzIHRoZSBhc3NlcnRpb24gYnkgaXRzZWxmKSwg
VUkgcHJvY2VzcyBtYXkgc2VuZCBub24taW1taW5lbnQgUHJlcGFyZVRvU3VzcGVuZCBtb3JlIG9m
dGVuLAorICAgICAgICBhbmQgd2UgbWF5IGFib3J0IHRyYW5zYWN0aW9uIHRvbyBhZ2dyZXNzaXZl
bHkgKGUuZy4gVUkgcHJvY2VzcyBtYXkgc2VuZCB0aGUgbWVzc2FnZSBhcyBzb29uIGFzIGFwcCBp
cyBpbiAKKyAgICAgICAgYmFja2dyb3VuZCkuIFRvIGZpeCB0aGUgcG9zc2libGUgcmVncmVzc2lv
biBvZiBkYXRhIGxvc3MsIHdlIG5vdyBzY2hlZHVsZSBhIHRhc2sgd2l0aCA1cyBkZWxheSB0byBh
Ym9ydAorICAgICAgICBldmVyeXRoaW5nLiBJbiB0aGlzIGNhc2UsIHRyYW5zYWN0aW9ucyBmaW5p
c2hlZCBpbiA1cyBhZnRlciBQcmVwYXJlVG9TdXNwZW5kIG1lc3NhZ2Ugd2lsbCBub3QgYmUgYWJv
cnRlZC4KKworICAgICAgICAqIE5ldHdvcmtQcm9jZXNzL0luZGV4ZWREQi9XZWJJREJTZXJ2ZXIu
Y3BwOgorICAgICAgICAqIE5ldHdvcmtQcm9jZXNzL0luZGV4ZWREQi9XZWJJREJTZXJ2ZXIuaDoK
KyAgICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9OZXR3b3JrUHJvY2Vzcy5jcHA6CisgICAgICAgIChX
ZWJLaXQ6Ok5ldHdvcmtQcm9jZXNzOjpzdXNwZW5kSURCU2VydmVycyk6CisgICAgICAgIChXZWJL
aXQ6Ok5ldHdvcmtQcm9jZXNzOjpwcmVwYXJlVG9TdXNwZW5kKToKKyAgICAgICAgKiBOZXR3b3Jr
UHJvY2Vzcy9OZXR3b3JrUHJvY2Vzcy5oOgorICAgICAgICAqIE5ldHdvcmtQcm9jZXNzL2lvcy9O
ZXR3b3JrUHJvY2Vzc0lPUy5tbToKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya1Byb2Nlc3M6OnNl
dElzSG9sZGluZ0xvY2tlZEZpbGVzKToKKyAgICAgICAgKiBVSVByb2Nlc3MvUHJvY2Vzc0Fzc2Vy
dGlvbi5oOgorICAgICAgICAoV2ViS2l0OjpQcm9jZXNzQXNzZXJ0aW9uOjpzZXRQcmVwYXJlRm9y
SW52YWxpZGF0aW9uSGFuZGxlcik6CisgICAgICAgICogVUlQcm9jZXNzL2lvcy9Qcm9jZXNzQXNz
ZXJ0aW9uSU9TLm1tOgorICAgICAgICAoLVtXS1Byb2Nlc3NBc3NlcnRpb25CYWNrZ3JvdW5kVGFz
a01hbmFnZXIgZGVhbGxvY10pOgorICAgICAgICAoLVtXS1JCU0Fzc2VydGlvbkRlbGVnYXRlIGFz
c2VydGlvbldpbGxJbnZhbGlkYXRlOl0pOgorICAgICAgICAoV2ViS2l0OjpQcm9jZXNzQXNzZXJ0
aW9uOjpQcm9jZXNzQXNzZXJ0aW9uKToKKyAgICAgICAgKFdlYktpdDo6UHJvY2Vzc0Fzc2VydGlv
bjo6cHJvY2Vzc0Fzc2VydGlvbldpbGxCZUludmFsaWRhdGVkKToKKwogMjAyMS0wNy0xMyAgV2Vu
c29uIEhzaWVoICA8d2Vuc29uX2hzaWVoQGFwcGxlLmNvbT4KIAogICAgICAgICBbV0syXSBQdXNo
IE9TIHN0YXRlIGR1bXBpbmcgbG9naWMgZG93biBmcm9tIFdlYlByb2Nlc3MgdG8gQXV4aWxpYXJ5
UHJvY2VzcwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2Vy
dmVyL0lEQlNlcnZlci5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2
ZXIvSURCU2VydmVyLmNwcAppbmRleCA0OWQ4NzY2MmZjYjNhNWFlMjNmMmE3YWI1MjdlNjU1N2Mz
MjZlYTNiLi44MjBkMzJmNWI3YmM1OGRlY2ZmODU3ZDIxMTVlNGQ5ODA3MzZmY2FjIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmNw
cAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVy
LmNwcApAQCAtNzY3LDYgKzc2NywyMiBAQCB2b2lkIElEQlNlcnZlcjo6dXBncmFkZUZpbGVzSWZO
ZWNlc3NhcnkoKQogICAgICAgICBGaWxlU3lzdGVtOjptYWtlQWxsRGlyZWN0b3JpZXMobmV3VmVy
c2lvbkRpcmVjdG9yeSk7CiB9CiAKK2Jvb2wgSURCU2VydmVyOjpoYXNEYXRhYmFzZUFjdGl2aXRp
ZXNPbk1haW5UaHJlYWQoKSBjb25zdAoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7Cisg
ICAgQVNTRVJUKG1fbG9jay5pc0hlbGQoKSk7CisKKyAgICBpZiAobV9zZXNzaW9uSUQuaXNFcGhl
bWVyYWwoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBmb3IgKGF1dG8mIGRhdGFiYXNl
IDogbV91bmlxdWVJREJEYXRhYmFzZU1hcC52YWx1ZXMoKSkgeworICAgICAgICBpZiAoIWRhdGFi
YXNlLT5pZGVudGlmaWVyKCkuaXNUcmFuc2llbnQoKSAmJiBkYXRhYmFzZS0+aGFzQWN0aXZlVHJh
bnNhY3Rpb25zKCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAg
cmV0dXJuIGZhbHNlOworfQorCiB2b2lkIElEQlNlcnZlcjo6c3RvcERhdGFiYXNlQWN0aXZpdGll
c09uTWFpblRocmVhZCgpCiB7CiAgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9JREJTZXJ2ZXIuaCBi
L1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9JREJTZXJ2ZXIuaAppbmRl
eCBiYzcyMzBjODBjZmI2NDZhZmVjOGRlNTkwYzMwMzU0NjcwZjRjN2VkLi42MDhkN2ZhYjllY2Q3
NjVkOTdmMGMwODMzM2ZmNGRiNTQwMDEwN2IxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9N
b2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmgKKysrIGIvU291cmNlL1dlYkNvcmUv
TW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL0lEQlNlcnZlci5oCkBAIC0xMDcsNiArMTA3LDcgQEAg
cHVibGljOgogICAgIFN0b3JhZ2VRdW90YU1hbmFnZXI6OkRlY2lzaW9uIHJlcXVlc3RTcGFjZShj
b25zdCBDbGllbnRPcmlnaW4mLCB1aW50NjRfdCB0YXNrU2l6ZSk7CiAgICAgV0VCQ09SRV9FWFBP
UlQgc3RhdGljIHVpbnQ2NF90IGRpc2tVc2FnZShjb25zdCBTdHJpbmcmIHJvb3REaXJlY3Rvcnks
IGNvbnN0IENsaWVudE9yaWdpbiYpOwogCisgICAgV0VCQ09SRV9FWFBPUlQgYm9vbCBoYXNEYXRh
YmFzZUFjdGl2aXRpZXNPbk1haW5UaHJlYWQoKSBjb25zdDsKICAgICBXRUJDT1JFX0VYUE9SVCB2
b2lkIHN0b3BEYXRhYmFzZUFjdGl2aXRpZXNPbk1haW5UaHJlYWQoKTsKIAogcHJpdmF0ZToKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9VbmlxdWVJ
REJEYXRhYmFzZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIv
VW5pcXVlSURCRGF0YWJhc2UuY3BwCmluZGV4IDk5ZTE4NTg0ODNiODdkM2U0Y2Q0MDJjOTcyN2M4
Y2E1M2ZmM2E3M2YuLjg2Y2I3MDVjNTU3Y2E2MjhhYjI1NDJjYzRlNWU3ODI2Y2Y1YTAzOTMgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9VbmlxdWVJ
REJEYXRhYmFzZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2Vy
dmVyL1VuaXF1ZUlEQkRhdGFiYXNlLmNwcApAQCAtMTE5MSw2ICsxMTkxLDEzIEBAIHZvaWQgVW5p
cXVlSURCRGF0YWJhc2U6OmltbWVkaWF0ZUNsb3NlKCkKICAgICBjbG9zZSgpOwogfQogCitib29s
IFVuaXF1ZUlEQkRhdGFiYXNlOjpoYXNBY3RpdmVUcmFuc2FjdGlvbnMoKSBjb25zdAoreworICAg
IEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisKKyAgICByZXR1cm4gIW1faW5Qcm9ncmVzc1RyYW5z
YWN0aW9ucy5pc0VtcHR5KCk7Cit9CisKIHZvaWQgVW5pcXVlSURCRGF0YWJhc2U6OmFib3J0QWN0
aXZlVHJhbnNhY3Rpb25zKCkKIHsKICAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOwpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL1VuaXF1ZUlEQkRh
dGFiYXNlLmggYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVl
SURCRGF0YWJhc2UuaAppbmRleCAyMzZlMmJiNTVhMzUzNjI4OWFjNWY3NTVjOThhYzBmODVhYTM4
Nzk4Li5kZmFkZGI5N2NjMjI1OGU3ZTQwZWVjOGZhMjEwODQ2OGIwY2RjYTM0IDEwMDY0NAotLS0g
YS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVlSURCRGF0YWJh
c2UuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVl
SURCRGF0YWJhc2UuaApAQCAtMTA3LDYgKzEwNyw3IEBAIHB1YmxpYzoKICAgICB2b2lkIGhhbmRs
ZURlbGV0ZShJREJDb25uZWN0aW9uVG9DbGllbnQmLCBjb25zdCBJREJSZXF1ZXN0RGF0YSYpOwog
ICAgIHZvaWQgaW1tZWRpYXRlQ2xvc2UoKTsKIAorICAgIGJvb2wgaGFzQWN0aXZlVHJhbnNhY3Rp
b25zKCkgY29uc3Q7CiAgICAgdm9pZCBhYm9ydEFjdGl2ZVRyYW5zYWN0aW9ucygpOwogICAgIGJv
b2wgdHJ5Q2xvc2UoKTsKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vz
cy9JbmRleGVkREIvV2ViSURCU2VydmVyLmNwcCBiL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nl
c3MvSW5kZXhlZERCL1dlYklEQlNlcnZlci5jcHAKaW5kZXggNTc1Mzc3ZDhlMmZkM2ZlMWQ3NTAy
ZDcxODA5NTFiNmRmMjYxZTE1NS4uNjU2OTQxMzQ0OWJlZjI1MmFjMjVmZWE0YjU1ZjBkNmUyOWFl
OWI1OCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9JbmRleGVkREIv
V2ViSURCU2VydmVyLmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0L05ldHdvcmtQcm9jZXNzL0luZGV4
ZWREQi9XZWJJREJTZXJ2ZXIuY3BwCkBAIC0xMTUsMTcgKzExNSwzMiBAQCB2b2lkIFdlYklEQlNl
cnZlcjo6cmVuYW1lT3JpZ2luKGNvbnN0IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYgb2xk
T3JpZ2luLCBjbwogICAgIH0pOwogfQogCi12b2lkIFdlYklEQlNlcnZlcjo6c3VzcGVuZCgpIFdU
Rl9JR05PUkVTX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMKK2Jvb2wgV2ViSURCU2VydmVyOjpzdXNw
ZW5kKElzU3VzcGVuc2lvbkltbWluZW50IGlzU3VzcGVuc2lvbkltbWluZW50KSBXVEZfSUdOT1JF
U19USFJFQURfU0FGRVRZX0FOQUxZU0lTCiB7CiAgICAgQVNTRVJUKFJ1bkxvb3A6OmlzTWFpbigp
KTsKIAogICAgIGlmIChtX2lzU3VzcGVuZGVkKQotICAgICAgICByZXR1cm47CisgICAgICAgIHJl
dHVybiB0cnVlOwogCiAgICAgbV9pc1N1c3BlbmRlZCA9IHRydWU7CiAgICAgbV9zZXJ2ZXJMb2Nr
LmxvY2soKTsKLSAgICBpZiAobV9zZXJ2ZXIpCisKKyAgICBpZiAoIW1fc2VydmVyKQorICAgICAg
ICByZXR1cm4gdHJ1ZTsKKworICAgIGlmIChpc1N1c3BlbnNpb25JbW1pbmVudCA9PSBJc1N1c3Bl
bnNpb25JbW1pbmVudDo6WWVzKSB7CiAgICAgICAgIG1fc2VydmVyLT5zdG9wRGF0YWJhc2VBY3Rp
dml0aWVzT25NYWluVGhyZWFkKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAg
IC8vIFN1c3BlbmQgdG8gYXZvaWQgc3RhcnRpbmcgbmV3IHRyYW5zYWN0aW9ucyBpZiB0aGVyZSBp
cyBubyBvbmdvaW5nIHRyYW5zYWN0aW9uLgorICAgIGlmICghbV9zZXJ2ZXItPmhhc0RhdGFiYXNl
QWN0aXZpdGllc09uTWFpblRocmVhZCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8v
IFJlc3VtZSB0byBhbGxvdyBvbmdvaW5nIHRyYW5zYWN0aW9ucyB0byBiZSBmaW5pc2hlZC4KKyAg
ICBtX3NlcnZlckxvY2sudW5sb2NrKCk7CisgICAgbV9pc1N1c3BlbmRlZCA9IGZhbHNlOworICAg
IHJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBXZWJJREJTZXJ2ZXI6OnJlc3VtZSgpIFdURl9JR05P
UkVTX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvTmV0
d29ya1Byb2Nlc3MvSW5kZXhlZERCL1dlYklEQlNlcnZlci5oIGIvU291cmNlL1dlYktpdC9OZXR3
b3JrUHJvY2Vzcy9JbmRleGVkREIvV2ViSURCU2VydmVyLmgKaW5kZXggNjk3MDdiMjczOTdkYmU1
NmU0NmY3NWMzMWYzMTkwNTk2ZTBiNDE5OC4uNTFiZGUzOGU3MDkzZDNkNTdhNmJiOGY0NmU4Mzcx
ZDYwNjBkNjIzMyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9JbmRl
eGVkREIvV2ViSURCU2VydmVyLmgKKysrIGIvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9J
bmRleGVkREIvV2ViSURCU2VydmVyLmgKQEAgLTUyLDcgKzUyLDggQEAgcHVibGljOgogICAgIHZv
aWQgY2xvc2VBbmREZWxldGVEYXRhYmFzZXNGb3JPcmlnaW5zKGNvbnN0IFZlY3RvcjxXZWJDb3Jl
OjpTZWN1cml0eU9yaWdpbkRhdGE+JiwgQ29tcGxldGlvbkhhbmRsZXI8dm9pZCgpPiYmIGNhbGxi
YWNrKTsKICAgICB2b2lkIHJlbmFtZU9yaWdpbihjb25zdCBXZWJDb3JlOjpTZWN1cml0eU9yaWdp
bkRhdGEmLCBjb25zdCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmLCBDb21wbGV0aW9uSGFu
ZGxlcjx2b2lkKCk+JiYpOwogCi0gICAgdm9pZCBzdXNwZW5kKCk7CisgICAgZW51bSBjbGFzcyBJ
c1N1c3BlbnNpb25JbW1pbmVudCA6IGJvb2wgeyBObywgWWVzIH07CisgICAgYm9vbCBzdXNwZW5k
KElzU3VzcGVuc2lvbkltbWluZW50ID0gSXNTdXNwZW5zaW9uSW1taW5lbnQ6Olllcyk7CiAgICAg
dm9pZCByZXN1bWUoKTsKIAogICAgIC8vIE1lc3NhZ2UgaGFuZGxlcnMuCmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViS2l0L05ldHdvcmtQcm9jZXNzL05ldHdvcmtQcm9jZXNzLmNwcCBiL1NvdXJjZS9X
ZWJLaXQvTmV0d29ya1Byb2Nlc3MvTmV0d29ya1Byb2Nlc3MuY3BwCmluZGV4IGFlYTJmYWE1OGEx
NTgxZjAwYmY1NmJjZWVlZDE3N2I0NGE0MzYwOTYuLjk1OTU3MmYzYzc3Yzc4ZTBhOTUzZjg0MzM5
ZjNiMzFlNTVlOGIxYWMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3Mv
TmV0d29ya1Byb2Nlc3MuY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvTmV0
d29ya1Byb2Nlc3MuY3BwCkBAIC0yMjExLDE0ICsyMjExLDQzIEBAIHZvaWQgTmV0d29ya1Byb2Nl
c3M6OnByb2Nlc3NXaWxsU3VzcGVuZEltbWluZW50bHlGb3JUZXN0aW5nU3luYyhDb21wbGV0aW9u
SGFuZGxlCiAgICAgcHJlcGFyZVRvU3VzcGVuZCh0cnVlLCBXVEZNb3ZlKGNvbXBsZXRpb25IYW5k
bGVyKSk7CiB9CiAKK3ZvaWQgTmV0d29ya1Byb2Nlc3M6OnN1c3BlbmRJREJTZXJ2ZXJzKGJvb2wg
aXNTdXNwZW5zaW9uSW1taW5lbnQpCit7CisgICAgbV9zaG91bGRTdXNwZW5kSURCU2VydmVyID0g
dHJ1ZTsKKworICAgIGlmIChpc1N1c3BlbnNpb25JbW1pbmVudCkgeworICAgICAgICBmb3IgKGF1
dG8mIHNlcnZlciA6IG1fd2ViSURCU2VydmVycy52YWx1ZXMoKSkKKyAgICAgICAgICAgIHNlcnZl
ci0+c3VzcGVuZCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBzaG91bGRT
Y2hlZHVsZVN1c3BlbnNpb25UYXNrID0gZmFsc2U7CisgICAgZm9yIChhdXRvJiBzZXJ2ZXIgOiBt
X3dlYklEQlNlcnZlcnMudmFsdWVzKCkpIHsKKyAgICAgICAgaWYgKCFzZXJ2ZXItPnN1c3BlbmQo
V2ViSURCU2VydmVyOjpJc1N1c3BlbnNpb25JbW1pbmVudDo6Tm8pKQorICAgICAgICAgICAgc2hv
dWxkU2NoZWR1bGVTdXNwZW5zaW9uVGFzayA9IHRydWU7CisgICAgfQorCisgICAgaWYgKCFzaG91
bGRTY2hlZHVsZVN1c3BlbnNpb25UYXNrKQorICAgICAgICByZXR1cm47CisKKyAgICBSdW5Mb29w
OjptYWluKCkuZGlzcGF0Y2hBZnRlcig1X3MsIFt0aGlzLCB3ZWFrVGhpcyA9IG1ha2VXZWFrUHRy
KCp0aGlzKV0geworICAgICAgICBpZiAoIXdlYWtUaGlzKQorICAgICAgICAgICAgcmV0dXJuOwor
CisgICAgICAgIGlmICghbV9zaG91bGRTdXNwZW5kSURCU2VydmVyKQorICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICAKKyAgICAgICAgZm9yIChhdXRvJiBzZXJ2ZXIgOiBtX3dlYklEQlNlcnZl
cnMudmFsdWVzKCkpCisgICAgICAgICAgICBzZXJ2ZXItPnN1c3BlbmQoKTsKKyAgICB9KTsKK30K
Kwogdm9pZCBOZXR3b3JrUHJvY2Vzczo6cHJlcGFyZVRvU3VzcGVuZChib29sIGlzU3VzcGVuc2lv
bkltbWluZW50LCBDb21wbGV0aW9uSGFuZGxlcjx2b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIp
CiB7CiAgICAgUkVMRUFTRV9MT0coUHJvY2Vzc1N1c3BlbnNpb24sICIlcCAtIE5ldHdvcmtQcm9j
ZXNzOjpwcmVwYXJlVG9TdXNwZW5kKCksIGlzU3VzcGVuc2lvbkltbWluZW50PSVkIiwgdGhpcywg
aXNTdXNwZW5zaW9uSW1taW5lbnQpOwogCiAjaWYgUExBVEZPUk0oSU9TX0ZBTUlMWSkKLSAgICBm
b3IgKGF1dG8mIHNlcnZlciA6IG1fd2ViSURCU2VydmVycy52YWx1ZXMoKSkKLSAgICAgICAgc2Vy
dmVyLT5zdXNwZW5kKCk7Ci0gICAgbV9zaG91bGRTdXNwZW5kSURCU2VydmVyID0gdHJ1ZTsKKyAg
ICBzdXNwZW5kSURCU2VydmVycyhpc1N1c3BlbnNpb25JbW1pbmVudCk7CiAjZW5kaWYKIAogICAg
IGxvd01lbW9yeUhhbmRsZXIoQ3JpdGljYWw6Olllcyk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
S2l0L05ldHdvcmtQcm9jZXNzL05ldHdvcmtQcm9jZXNzLmggYi9Tb3VyY2UvV2ViS2l0L05ldHdv
cmtQcm9jZXNzL05ldHdvcmtQcm9jZXNzLmgKaW5kZXggNzk0ODA5N2FhM2RjMzg2YTJmZDQxZmFk
NjIzYjNjZWNkZjhkN2U0YS4uZWE5Y2JiYjI3MTg2MzllODg4ZTNjMDUzMzgyODA3ZmVhZTk0YTcw
YyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9OZXR3b3JrUHJvY2Vz
cy5oCisrKyBiL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvTmV0d29ya1Byb2Nlc3MuaApA
QCAtNDg2LDYgKzQ4Niw3IEBAIHByaXZhdGU6CiAgICAgUmVmPFdlYklEQlNlcnZlcj4gY3JlYXRl
V2ViSURCU2VydmVyKFBBTDo6U2Vzc2lvbklEKTsKICAgICB2b2lkIHNldFNlc3Npb25TdG9yYWdl
UXVvdGFNYW5hZ2VySURCUm9vdFBhdGgoUEFMOjpTZXNzaW9uSUQsIGNvbnN0IFN0cmluZyYgaWRi
Um9vdFBhdGgpOwogICAgIHZvaWQgcmVtb3ZlV2ViSURCU2VydmVySWZQb3NzaWJsZShQQUw6OlNl
c3Npb25JRCk7CisgICAgdm9pZCBzdXNwZW5kSURCU2VydmVycyhib29sIGlzU3VzcGVuc2lvbklt
bWluZW50KTsKIAogI2lmIEVOQUJMRShTRVJWSUNFX1dPUktFUikKICAgICB2b2lkIGRpZENyZWF0
ZVdvcmtlckNvbnRleHRQcm9jZXNzQ29ubmVjdGlvbihjb25zdCBJUEM6OkF0dGFjaG1lbnQmKTsK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvaW9zL05ldHdvcmtQcm9j
ZXNzSU9TLm1tIGIvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9pb3MvTmV0d29ya1Byb2Nl
c3NJT1MubW0KaW5kZXggNjQ5NGI1YTc5OGFmNjkwODFlYTNkN2E1YTNjYzU1ZWM4MjdlNGJmNC4u
MmYzYjFlNjAyNDEwZjQyMzEwNThkODc0ZmM0NDQ4YmJmNmQ4ZTM4ZCAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9pb3MvTmV0d29ya1Byb2Nlc3NJT1MubW0KKysrIGIv
U291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9pb3MvTmV0d29ya1Byb2Nlc3NJT1MubW0KQEAg
LTExMyw2ICsxMTMsMTUgQEAgdm9pZCBOZXR3b3JrUHJvY2Vzczo6c2V0SXNIb2xkaW5nTG9ja2Vk
RmlsZXMoYm9vbCBpc0hvbGRpbmdMb2NrZWRGaWxlcykKICAgICAvLyBXZSBzeW5jaHJvbm91c2x5
IHRha2UgYSBwcm9jZXNzIGFzc2VydGlvbiB3aGVuIGJlZ2lubmluZyBhIFNRTGl0ZSB0cmFuc2Fj
dGlvbiBzbyB0aGF0IHdlIGRvbid0IGdldCBzdXNwZW5kZWQKICAgICAvLyB3aGlsZSBob2xkaW5n
IGEgbG9ja2VkIGZpbGUuIFdlIHdvdWxkIGdldCBraWxsZWQgaWYgc3VzcGVuZGVkIHdoaWxlIGhv
bGRpbmcgbG9ja2VkIGZpbGVzLgogICAgIG1faG9sZGluZ0xvY2tlZEZpbGVBc3NlcnRpb24gPSBQ
cm9jZXNzQXNzZXJ0aW9uOjpjcmVhdGUoZ2V0Q3VycmVudFByb2Nlc3NJRCgpLCAiTmV0d29yayBQ
cm9jZXNzIGlzIGhvbGRpbmcgbG9ja2VkIGZpbGVzIl9zLCBQcm9jZXNzQXNzZXJ0aW9uVHlwZTo6
RmluaXNoVGFza1VuaW50ZXJydXB0YWJsZSwgUHJvY2Vzc0Fzc2VydGlvbjo6TW9kZTo6U3luYyk7
CisgICAgbV9ob2xkaW5nTG9ja2VkRmlsZUFzc2VydGlvbi0+c2V0UHJlcGFyZUZvckludmFsaWRh
dGlvbkhhbmRsZXIoW3RoaXMsIHdlYWtUaGlzID0gbWFrZVdlYWtQdHIoKnRoaXMpXSgpIG11dGFi
bGUgeworICAgICAgICBjYWxsT25NYWluUnVuTG9vcEFuZFdhaXQoW3RoaXMsIHdlYWtUaGlzID0g
V1RGTW92ZSh3ZWFrVGhpcyldKCkgeworICAgICAgICAgICAgaWYgKCF3ZWFrVGhpcykKKyAgICAg
ICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGZvciAoYXV0byYgc2VydmVyIDogbV93
ZWJJREJTZXJ2ZXJzLnZhbHVlcygpKQorICAgICAgICAgICAgICAgIHNlcnZlci0+c3VzcGVuZCgp
OworICAgICAgICB9KTsKKyAgICB9KTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9Qcm9jZXNzQXNzZXJ0aW9uLmggYi9Tb3Vy
Y2UvV2ViS2l0L1VJUHJvY2Vzcy9Qcm9jZXNzQXNzZXJ0aW9uLmgKaW5kZXggNzEzZmI5ZmJhYjE4
NmZhNzdmMWQwMGNjNTUyMzY5MGM0Y2U1MDNjOC4uY2I3ZGRlZDZmZWQ4ZmE1Y2NmM2E5MDZjMzM4
NDBlN2Y5Y2ExYjMzNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvUHJvY2Vz
c0Fzc2VydGlvbi5oCisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1Byb2Nlc3NBc3NlcnRp
b24uaApAQCAtNzIsNiArNzIsNyBAQCBwdWJsaWM6CiAgICAgfQogICAgIHZpcnR1YWwgflByb2Nl
c3NBc3NlcnRpb24oKTsKIAorICAgIHZvaWQgc2V0UHJlcGFyZUZvckludmFsaWRhdGlvbkhhbmRs
ZXIoRnVuY3Rpb248dm9pZCgpPiYmIGhhbmRsZXIpIHsgbV9wcmVwYXJlRm9ySW52YWxpZGF0aW9u
SGFuZGxlciA9IFdURk1vdmUoaGFuZGxlcik7IH0KICAgICB2b2lkIHNldEludmFsaWRhdGlvbkhh
bmRsZXIoRnVuY3Rpb248dm9pZCgpPiYmIGhhbmRsZXIpIHsgbV9pbnZhbGlkYXRpb25IYW5kbGVy
ID0gV1RGTW92ZShoYW5kbGVyKTsgfQogCiAgICAgUHJvY2Vzc0Fzc2VydGlvblR5cGUgdHlwZSgp
IGNvbnN0IHsgcmV0dXJuIG1fYXNzZXJ0aW9uVHlwZTsgfQpAQCAtODYsNiArODcsNyBAQCBwcm90
ZWN0ZWQ6CiAgICAgdm9pZCBhY3F1aXJlU3luYygpOwogCiAjaWYgUExBVEZPUk0oSU9TX0ZBTUlM
WSkKKyAgICB2b2lkIHByb2Nlc3NBc3NlcnRpb25XaWxsQmVJbnZhbGlkYXRlZCgpOwogICAgIHZp
cnR1YWwgdm9pZCBwcm9jZXNzQXNzZXJ0aW9uV2FzSW52YWxpZGF0ZWQoKTsKICNlbmRpZgogCkBA
IC05OCw2ICsxMDAsNyBAQCBwcml2YXRlOgogICAgIFJldGFpblB0cjxXS1JCU0Fzc2VydGlvbkRl
bGVnYXRlPiBtX2RlbGVnYXRlOwogICAgIGJvb2wgbV93YXNJbnZhbGlkYXRlZCB7IGZhbHNlIH07
CiAjZW5kaWYKKyAgICBGdW5jdGlvbjx2b2lkKCk+IG1fcHJlcGFyZUZvckludmFsaWRhdGlvbkhh
bmRsZXI7CiAgICAgRnVuY3Rpb248dm9pZCgpPiBtX2ludmFsaWRhdGlvbkhhbmRsZXI7CiB9Owog
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9pb3MvUHJvY2Vzc0Fzc2VydGlv
bklPUy5tbSBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL2lvcy9Qcm9jZXNzQXNzZXJ0aW9uSU9T
Lm1tCmluZGV4IGYzNTExNmQxYTBhNGMzZmI5OTU0Mjc0ZWE1NTZlMzlkYzVkNmYxYzUuLjQ5ZmJi
MTAzMGFlYjkzNTBjNWEzNGFmMWZjMTRlOTRkMjc3M2ZlZDQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJLaXQvVUlQcm9jZXNzL2lvcy9Qcm9jZXNzQXNzZXJ0aW9uSU9TLm1tCisrKyBiL1NvdXJjZS9X
ZWJLaXQvVUlQcm9jZXNzL2lvcy9Qcm9jZXNzQXNzZXJ0aW9uSU9TLm1tCkBAIC0yNTUsMTIgKzI1
NSwxNCBAQCBzdGF0aWMgYm9vbCBwcm9jZXNzSGFzQWN0aXZlUnVuVGltZUxpbWl0YXRpb24oKQog
dHlwZWRlZiB2b2lkKF5SQlNBc3NlcnRpb25JbnZhbGlkYXRpb25DYWxsYmFja1R5cGUpKCk7CiAK
IEBpbnRlcmZhY2UgV0tSQlNBc3NlcnRpb25EZWxlZ2F0ZSA6IE5TT2JqZWN0PFJCU0Fzc2VydGlv
bk9ic2VydmluZz4KK0Bwcm9wZXJ0eSAoY29weSkgUkJTQXNzZXJ0aW9uSW52YWxpZGF0aW9uQ2Fs
bGJhY2tUeXBlIHByZXBhcmVGb3JJbnZhbGlkYXRpb25DYWxsYmFjazsKIEBwcm9wZXJ0eSAoY29w
eSkgUkJTQXNzZXJ0aW9uSW52YWxpZGF0aW9uQ2FsbGJhY2tUeXBlIGludmFsaWRhdGlvbkNhbGxi
YWNrOwogQGVuZAogCiBAaW1wbGVtZW50YXRpb24gV0tSQlNBc3NlcnRpb25EZWxlZ2F0ZQogLSAo
dm9pZClkZWFsbG9jCiB7CisgICAgW19wcmVwYXJlRm9ySW52YWxpZGF0aW9uQ2FsbGJhY2sgcmVs
ZWFzZV07CiAgICAgW19pbnZhbGlkYXRpb25DYWxsYmFjayByZWxlYXNlXTsKICAgICBbc3VwZXIg
ZGVhbGxvY107CiB9CkBAIC0yNjgsNiArMjcwLDggQEAgdHlwZWRlZiB2b2lkKF5SQlNBc3NlcnRp
b25JbnZhbGlkYXRpb25DYWxsYmFja1R5cGUpKCk7CiAtICh2b2lkKWFzc2VydGlvbldpbGxJbnZh
bGlkYXRlOihSQlNBc3NlcnRpb24gKilhc3NlcnRpb24KIHsKICAgICBSRUxFQVNFX0xPRyhQcm9j
ZXNzU3VzcGVuc2lvbiwgIiVwIC0gV0tSQlNBc3NlcnRpb25EZWxlZ2F0ZTogYXNzZXJ0aW9uV2ls
bEludmFsaWRhdGUiLCBzZWxmKTsKKworICAgIF9wcmVwYXJlRm9ySW52YWxpZGF0aW9uQ2FsbGJh
Y2soKTsKIH0KIAogLSAodm9pZClhc3NlcnRpb246KFJCU0Fzc2VydGlvbiAqKWFzc2VydGlvbiBk
aWRJbnZhbGlkYXRlV2l0aEVycm9yOihOU0Vycm9yICopZXJyb3IKQEAgLTMzOSw2ICszNDMsMTAg
QEAgUHJvY2Vzc0Fzc2VydGlvbjo6UHJvY2Vzc0Fzc2VydGlvbihwaWRfdCBwaWQsIGNvbnN0IFN0
cmluZyYgcmVhc29uLCBQcm9jZXNzQXNzZXIKICAgICAgICAgUkVMRUFTRV9MT0coUHJvY2Vzc1N1
c3BlbnNpb24sICIlcCAtIFByb2Nlc3NBc3NlcnRpb246IFJCUyAle3B1YmxpY31AIGFzc2VydGlv
biBmb3IgcHJvY2VzcyB3aXRoIFBJRD0lZCB3YXMgaW52YWxpZGF0ZWQiLCB0aGlzLCBydW5uaW5n
Qm9hcmRBc3NlcnRpb25OYW1lLCBwaWQpOwogICAgICAgICBwcm9jZXNzQXNzZXJ0aW9uV2FzSW52
YWxpZGF0ZWQoKTsKICAgICB9OworICAgIG1fZGVsZWdhdGUuZ2V0KCkucHJlcGFyZUZvckludmFs
aWRhdGlvbkNhbGxiYWNrID0gXnsKKyAgICAgICAgUkVMRUFTRV9MT0coUHJvY2Vzc1N1c3BlbnNp
b24sICIlcCAtIFByb2Nlc3NBc3NlcnRpb24oKSBSQlMgJXtwdWJsaWN9QCBhc3NlcnRpb24gZm9y
IHByb2Nlc3Mgd2l0aCBQSUQ9JWQgd2lsbCBiZSBpbnZhbGlkYXRlZCIsIHRoaXMsIHJ1bm5pbmdC
b2FyZEFzc2VydGlvbk5hbWUsIHBpZCk7CisgICAgICAgIHByb2Nlc3NBc3NlcnRpb25XaWxsQmVJ
bnZhbGlkYXRlZCgpOworICAgIH07CiB9CiAKIHZvaWQgUHJvY2Vzc0Fzc2VydGlvbjo6YWNxdWly
ZUFzeW5jKENvbXBsZXRpb25IYW5kbGVyPHZvaWQoKT4mJiBjb21wbGV0aW9uSGFuZGxlcikKQEAg
LTM3MywxMiArMzgxLDIxIEBAIFByb2Nlc3NBc3NlcnRpb246On5Qcm9jZXNzQXNzZXJ0aW9uKCkK
IAogICAgIGlmIChtX3Jic0Fzc2VydGlvbikgewogICAgICAgICBtX2RlbGVnYXRlLmdldCgpLmlu
dmFsaWRhdGlvbkNhbGxiYWNrID0gbmlsOworICAgICAgICBtX2RlbGVnYXRlLmdldCgpLnByZXBh
cmVGb3JJbnZhbGlkYXRpb25DYWxsYmFjayA9IG5pbDsKICAgICAgICAgW21fcmJzQXNzZXJ0aW9u
IHJlbW92ZU9ic2VydmVyOm1fZGVsZWdhdGUuZ2V0KCldOwogICAgICAgICBtX2RlbGVnYXRlID0g
bmlsOwogICAgICAgICBbbV9yYnNBc3NlcnRpb24gaW52YWxpZGF0ZV07CiAgICAgfQogfQogCit2
b2lkIFByb2Nlc3NBc3NlcnRpb246OnByb2Nlc3NBc3NlcnRpb25XaWxsQmVJbnZhbGlkYXRlZCgp
Cit7CisgICAgUkVMRUFTRV9MT0coUHJvY2Vzc1N1c3BlbnNpb24sICIlcCAtIFByb2Nlc3NBc3Nl
cnRpb246OnByb2Nlc3NBc3NlcnRpb25XaWxsQmVJbnZhbGlkYXRlZCgpIFBJRD0lZCIsIHRoaXMs
IG1fcGlkKTsKKworICAgIGlmIChtX3ByZXBhcmVGb3JJbnZhbGlkYXRpb25IYW5kbGVyKQorICAg
ICAgICBtX3ByZXBhcmVGb3JJbnZhbGlkYXRpb25IYW5kbGVyKCk7Cit9CisKIHZvaWQgUHJvY2Vz
c0Fzc2VydGlvbjo6cHJvY2Vzc0Fzc2VydGlvbldhc0ludmFsaWRhdGVkKCkKIHsKICAgICBBU1NF
UlQoUnVuTG9vcDo6aXNNYWluKCkpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>433610</attachid>
            <date>2021-07-15 12:28:34 -0700</date>
            <delta_ts>2021-07-15 12:57:55 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-227778-20210715122833.patch</filename>
            <type>text/plain</type>
            <size>17153</size>
            <attacher name="Sihui Liu">sihui_liu</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjc5OTAzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMzljMmIyNWVlNmE3YzNh
ZmE2NTZlNzc2MDNmY2YxZjIyNjQ5OWFhNC4uMGYxNjNmNjlkNjVhNjAxNWQ2NDQ0OTRmMjRjNDVi
YzJjNmNjNzhlMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE4IEBACisyMDIxLTA3LTE1ICBTaWh1
aSBMaXUgIDxzaWh1aV9saXVAYXBwbGUuY29tPgorCisgICAgICAgIERvIG5vdCBhYm9ydCBvbmdv
aW5nIElEQiB0cmFuc2FjdGlvbiBzeW5jaHJvbm91c2x5IG9uIG5vbi1pbW1pbmVudCBQcmVwYXJl
VG9TdXNwZW5kIG1lc3NhZ2UKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTIyNzc3OAorICAgICAgICA8cmRhcjovL3Byb2JsZW0vODA2MDI1NTc+CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBNb2R1bGVzL2lu
ZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OklEQlNlcnZl
cjo6SURCU2VydmVyOjpoYXNEYXRhYmFzZUFjdGl2aXRpZXNPbk1haW5UaHJlYWQgY29uc3QpOgor
ICAgICAgICAqIE1vZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9JREJTZXJ2ZXIuaDoKKyAgICAgICAg
KiBNb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVlSURCRGF0YWJhc2UuY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6SURCU2VydmVyOjpVbmlxdWVJREJEYXRhYmFzZTo6aGFzQWN0aXZlVHJhbnNh
Y3Rpb25zIGNvbnN0KToKKyAgICAgICAgKiBNb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVl
SURCRGF0YWJhc2UuaDoKKwogMjAyMS0wNy0xMyAgQWxleCBDaHJpc3RlbnNlbiAgPGFjaHJpc3Rl
bnNlbkB3ZWJraXQub3JnPgogCiAgICAgICAgID40SyBSZWZlcmVyIHNob3VsZCBoYXZlIHRhaWxp
bmcgLwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cgYi9Tb3VyY2UvV2ViS2l0
L0NoYW5nZUxvZwppbmRleCA4MmM4Y2M4OGZmMDI1NTEyZWFmNTQ3YmVmYjA1MDBiYWY2ZGRjMGMx
Li5mMGE4MzczNGEwY2NkZjYyMTNlZjRjZjQwMmUzOWI1ZDkxYzU5YmRmIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViS2l0L0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViS2l0L0NoYW5nZUxvZwpAQCAt
MSwzICsxLDM4IEBACisyMDIxLTA3LTE1ICBTaWh1aSBMaXUgIDxzaWh1aV9saXVAYXBwbGUuY29t
PgorCisgICAgICAgIERvIG5vdCBhYm9ydCBvbmdvaW5nIElEQiB0cmFuc2FjdGlvbiBzeW5jaHJv
bm91c2x5IG9uIG5vbi1pbW1pbmVudCBQcmVwYXJlVG9TdXNwZW5kIG1lc3NhZ2UKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIyNzc3OAorICAgICAgICA8
cmRhcjovL3Byb2JsZW0vODA2MDI1NTc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQ3VycmVudGx5IHdlIGFib3J0IElEQiB0cmFuc2FjdGlvbnMgYW5k
IHN1c3BlbmQgSURCIHRocmVhZCBzeW5jaHJvbm91c2x5IGluIE5ldHdvcmtQcm9jZXNzOjpwcmVw
YXJlVG9TdXNwZW5kLgorICAgICAgICBBcyBVSSBwcm9jZXNzIGRvZXMgbm90IGtub3cgdGhlIGZp
bGUgbG9ja2luZyBzdGF0ZSBpbiBuZXR3b3JrIHByb2Nlc3Mgbm93IChiZWNhdXNlIG5ldHdvcmsg
cHJvY2VzcyB0cmFja3MKKyAgICAgICAgdGhlIHN0YXRlIGFuZCB0YWtlcyB0aGUgYXNzZXJ0aW9u
IGJ5IGl0c2VsZiksIFVJIHByb2Nlc3MgbWF5IHNlbmQgbm9uLWltbWluZW50IFByZXBhcmVUb1N1
c3BlbmQgbW9yZSBvZnRlbiwKKyAgICAgICAgYW5kIHdlIG1heSBhYm9ydCB0cmFuc2FjdGlvbiB0
b28gYWdncmVzc2l2ZWx5IChlLmcuIFVJIHByb2Nlc3MgbWF5IHNlbmQgdGhlIG1lc3NhZ2UgYXMg
c29vbiBhcyBhcHAgaXMgaW4gCisgICAgICAgIGJhY2tncm91bmQpLiBUbyBmaXggdGhlIHBvc3Np
YmxlIHJlZ3Jlc3Npb24gb2YgZGF0YSBsb3NzLCB3ZSB3aWxsIHNjaGVkdWxlIGEgdGFzayB3aXRo
IDVzIGRlbGF5IHRvIGFib3J0CisgICAgICAgIHRyYW5zYWN0aW9ucyBhZnRlciBwcmVwYXJlVG9T
dXNwZW5kLiBJbiB0aGlzIGNhc2UsIHRyYW5zYWN0aW9ucyBmaW5pc2hlZCBpbiA1cyBjYW4gaGF2
ZSBhIGNoYW5jZSB0byBmaW5pc2guCisKKyAgICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9JbmRleGVk
REIvV2ViSURCU2VydmVyLmNwcDoKKyAgICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9JbmRleGVkREIv
V2ViSURCU2VydmVyLmg6CisgICAgICAgICogTmV0d29ya1Byb2Nlc3MvTmV0d29ya1Byb2Nlc3Mu
Y3BwOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrUHJvY2Vzczo6c3VzcGVuZElEQlNlcnZlcnMp
OgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrUHJvY2Vzczo6cHJlcGFyZVRvU3VzcGVuZCk6Cisg
ICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtQcm9jZXNzOjpyZXN1bWUpOgorICAgICAgICAoV2ViS2l0
OjpOZXR3b3JrUHJvY2Vzczo6Y3JlYXRlV2ViSURCU2VydmVyKToKKyAgICAgICAgKiBOZXR3b3Jr
UHJvY2Vzcy9OZXR3b3JrUHJvY2Vzcy5oOgorICAgICAgICAqIE5ldHdvcmtQcm9jZXNzL2lvcy9O
ZXR3b3JrUHJvY2Vzc0lPUy5tbToKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya1Byb2Nlc3M6OnNl
dElzSG9sZGluZ0xvY2tlZEZpbGVzKToKKyAgICAgICAgKiBVSVByb2Nlc3MvUHJvY2Vzc0Fzc2Vy
dGlvbi5oOgorICAgICAgICAoV2ViS2l0OjpQcm9jZXNzQXNzZXJ0aW9uOjpzZXRQcmVwYXJlRm9y
SW52YWxpZGF0aW9uSGFuZGxlcik6CisgICAgICAgICogVUlQcm9jZXNzL2lvcy9Qcm9jZXNzQXNz
ZXJ0aW9uSU9TLm1tOgorICAgICAgICAoLVtXS1JCU0Fzc2VydGlvbkRlbGVnYXRlIGRlYWxsb2Nd
KToKKyAgICAgICAgKC1bV0tSQlNBc3NlcnRpb25EZWxlZ2F0ZSBhc3NlcnRpb25XaWxsSW52YWxp
ZGF0ZTpdKTogVGhpcyB3aWxsIGNhbGxlZCBzZWNvbmRzIGJlZm9yZSBhc3NlcnRpb24gaXMgdGlt
ZWQgb3V0LCBzbworICAgICAgICB3ZSBzaG91bGQgaGF2ZSBlbm91Z2ggdGltZSB0byBjbGVhbiB1
cC4KKyAgICAgICAgKFdlYktpdDo6UHJvY2Vzc0Fzc2VydGlvbjo6UHJvY2Vzc0Fzc2VydGlvbik6
CisgICAgICAgIChXZWJLaXQ6OlByb2Nlc3NBc3NlcnRpb246On5Qcm9jZXNzQXNzZXJ0aW9uKToK
KyAgICAgICAgKFdlYktpdDo6UHJvY2Vzc0Fzc2VydGlvbjo6cHJvY2Vzc0Fzc2VydGlvbldpbGxC
ZUludmFsaWRhdGVkKToKKwogMjAyMS0wNy0xMyAgV2Vuc29uIEhzaWVoICA8d2Vuc29uX2hzaWVo
QGFwcGxlLmNvbT4KIAogICAgICAgICBbV0syXSBQdXNoIE9TIHN0YXRlIGR1bXBpbmcgbG9naWMg
ZG93biBmcm9tIFdlYlByb2Nlc3MgdG8gQXV4aWxpYXJ5UHJvY2VzcwpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL0lEQlNlcnZlci5jcHAgYi9Tb3Vy
Y2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmNwcAppbmRleCA0
OWQ4NzY2MmZjYjNhNWFlMjNmMmE3YWI1MjdlNjU1N2MzMjZlYTNiLi5lYTNmNmQ2YTIxZGVmZTNi
ZjVhNzIwZTU0MDYwNTA1Nzc3Zjg1ZjYxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1
bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9N
b2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmNwcApAQCAtNzY3LDYgKzc2NywyMiBA
QCB2b2lkIElEQlNlcnZlcjo6dXBncmFkZUZpbGVzSWZOZWNlc3NhcnkoKQogICAgICAgICBGaWxl
U3lzdGVtOjptYWtlQWxsRGlyZWN0b3JpZXMobmV3VmVyc2lvbkRpcmVjdG9yeSk7CiB9CiAKK2Jv
b2wgSURCU2VydmVyOjpoYXNEYXRhYmFzZUFjdGl2aXRpZXNPbk1haW5UaHJlYWQoKSBjb25zdAor
eworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgQVNTRVJUKG1fbG9jay5pc0hlbGQo
KSk7CisKKyAgICBpZiAobV9zZXNzaW9uSUQuaXNFcGhlbWVyYWwoKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgZm9yIChhdXRvJiBkYXRhYmFzZSA6IG1fdW5pcXVlSURCRGF0YWJhc2VN
YXAudmFsdWVzKCkpIHsKKyAgICAgICAgaWYgKCFkYXRhYmFzZS0+aWRlbnRpZmllcigpLmlzVHJh
bnNpZW50KCkgJiYgZGF0YWJhc2UtPmhhc0FjdGl2ZVRyYW5zYWN0aW9ucygpKQorICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHJldHVybiBmYWxzZTsKK30KKwogdm9p
ZCBJREJTZXJ2ZXI6OnN0b3BEYXRhYmFzZUFjdGl2aXRpZXNPbk1haW5UaHJlYWQoKQogewogICAg
IEFTU0VSVChpc01haW5UaHJlYWQoKSk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1
bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmggYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVz
L2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmgKaW5kZXggYmM3MjMwYzgwY2ZiNjQ2YWZlYzhk
ZTU5MGMzMDM1NDY3MGY0YzdlZC4uNjA4ZDdmYWI5ZWNkNzY1ZDk3ZjBjMDgzMzNmZjRkYjU0MDAx
MDdiMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVy
L0lEQlNlcnZlci5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL3NlcnZl
ci9JREJTZXJ2ZXIuaApAQCAtMTA3LDYgKzEwNyw3IEBAIHB1YmxpYzoKICAgICBTdG9yYWdlUXVv
dGFNYW5hZ2VyOjpEZWNpc2lvbiByZXF1ZXN0U3BhY2UoY29uc3QgQ2xpZW50T3JpZ2luJiwgdWlu
dDY0X3QgdGFza1NpemUpOwogICAgIFdFQkNPUkVfRVhQT1JUIHN0YXRpYyB1aW50NjRfdCBkaXNr
VXNhZ2UoY29uc3QgU3RyaW5nJiByb290RGlyZWN0b3J5LCBjb25zdCBDbGllbnRPcmlnaW4mKTsK
IAorICAgIFdFQkNPUkVfRVhQT1JUIGJvb2wgaGFzRGF0YWJhc2VBY3Rpdml0aWVzT25NYWluVGhy
ZWFkKCkgY29uc3Q7CiAgICAgV0VCQ09SRV9FWFBPUlQgdm9pZCBzdG9wRGF0YWJhc2VBY3Rpdml0
aWVzT25NYWluVGhyZWFkKCk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVlSURCRGF0YWJhc2UuY3BwIGIvU291cmNl
L1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL1VuaXF1ZUlEQkRhdGFiYXNlLmNwcApp
bmRleCA5OWUxODU4NDgzYjg3ZDNlNGNkNDAyYzk3MjdjOGNhNTNmZjNhNzNmLi44NmNiNzA1YzU1
N2NhNjI4YWIyNTQyY2M0ZTVlNzgyNmNmNWEwMzkzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVlSURCRGF0YWJhc2UuY3BwCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9VbmlxdWVJREJEYXRhYmFzZS5j
cHAKQEAgLTExOTEsNiArMTE5MSwxMyBAQCB2b2lkIFVuaXF1ZUlEQkRhdGFiYXNlOjppbW1lZGlh
dGVDbG9zZSgpCiAgICAgY2xvc2UoKTsKIH0KIAorYm9vbCBVbmlxdWVJREJEYXRhYmFzZTo6aGFz
QWN0aXZlVHJhbnNhY3Rpb25zKCkgY29uc3QKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkp
OworCisgICAgcmV0dXJuICFtX2luUHJvZ3Jlc3NUcmFuc2FjdGlvbnMuaXNFbXB0eSgpOworfQor
CiB2b2lkIFVuaXF1ZUlEQkRhdGFiYXNlOjphYm9ydEFjdGl2ZVRyYW5zYWN0aW9ucygpCiB7CiAg
ICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL01v
ZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9VbmlxdWVJREJEYXRhYmFzZS5oIGIvU291cmNlL1dlYkNv
cmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL1VuaXF1ZUlEQkRhdGFiYXNlLmgKaW5kZXggMjM2
ZTJiYjU1YTM1MzYyODlhYzVmNzU1Yzk4YWMwZjg1YWEzODc5OC4uZGZhZGRiOTdjYzIyNThlN2U0
MGVlYzhmYTIxMDg0NjhiMGNkY2EzNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxl
cy9pbmRleGVkZGIvc2VydmVyL1VuaXF1ZUlEQkRhdGFiYXNlLmgKKysrIGIvU291cmNlL1dlYkNv
cmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL1VuaXF1ZUlEQkRhdGFiYXNlLmgKQEAgLTEwNyw2
ICsxMDcsNyBAQCBwdWJsaWM6CiAgICAgdm9pZCBoYW5kbGVEZWxldGUoSURCQ29ubmVjdGlvblRv
Q2xpZW50JiwgY29uc3QgSURCUmVxdWVzdERhdGEmKTsKICAgICB2b2lkIGltbWVkaWF0ZUNsb3Nl
KCk7CiAKKyAgICBib29sIGhhc0FjdGl2ZVRyYW5zYWN0aW9ucygpIGNvbnN0OwogICAgIHZvaWQg
YWJvcnRBY3RpdmVUcmFuc2FjdGlvbnMoKTsKICAgICBib29sIHRyeUNsb3NlKCk7CiAKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvSW5kZXhlZERCL1dlYklEQlNlcnZl
ci5jcHAgYi9Tb3VyY2UvV2ViS2l0L05ldHdvcmtQcm9jZXNzL0luZGV4ZWREQi9XZWJJREJTZXJ2
ZXIuY3BwCmluZGV4IDU3NTM3N2Q4ZTJmZDNmZTFkNzUwMmQ3MTgwOTUxYjZkZjI2MWUxNTUuLjY4
ZjNlMzA1MDJhZjc0ODE3NGNiYTE2NTRjOTViNWExOGI2NTkxNDQgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvSW5kZXhlZERCL1dlYklEQlNlcnZlci5jcHAKKysrIGIv
U291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9JbmRleGVkREIvV2ViSURCU2VydmVyLmNwcApA
QCAtMTE1LDE3ICsxMTUsMzIgQEAgdm9pZCBXZWJJREJTZXJ2ZXI6OnJlbmFtZU9yaWdpbihjb25z
dCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmIG9sZE9yaWdpbiwgY28KICAgICB9KTsKIH0K
IAotdm9pZCBXZWJJREJTZXJ2ZXI6OnN1c3BlbmQoKSBXVEZfSUdOT1JFU19USFJFQURfU0FGRVRZ
X0FOQUxZU0lTCitib29sIFdlYklEQlNlcnZlcjo6dHJ5U3VzcGVuZChTdXNwZW5kVHlwZSBzdXNw
ZW5kVHlwZSkgV1RGX0lHTk9SRVNfVEhSRUFEX1NBRkVUWV9BTkFMWVNJUwogewogICAgIEFTU0VS
VChSdW5Mb29wOjppc01haW4oKSk7CiAKICAgICBpZiAobV9pc1N1c3BlbmRlZCkKLSAgICAgICAg
cmV0dXJuOworICAgICAgICByZXR1cm4gdHJ1ZTsKIAogICAgIG1faXNTdXNwZW5kZWQgPSB0cnVl
OwogICAgIG1fc2VydmVyTG9jay5sb2NrKCk7Ci0gICAgaWYgKG1fc2VydmVyKQorCisgICAgaWYg
KCFtX3NlcnZlcikKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoc3VzcGVuZFR5cGUg
PT0gU3VzcGVuZFR5cGU6OkltbWVkaWF0ZSkgewogICAgICAgICBtX3NlcnZlci0+c3RvcERhdGFi
YXNlQWN0aXZpdGllc09uTWFpblRocmVhZCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
CisKKyAgICAvLyBTdXNwZW5kIHRvIGF2b2lkIHN0YXJ0aW5nIG5ldyB0cmFuc2FjdGlvbnMgaWYg
dGhlcmUgaXMgbm8gb25nb2luZyB0cmFuc2FjdGlvbi4KKyAgICBpZiAoIW1fc2VydmVyLT5oYXNE
YXRhYmFzZUFjdGl2aXRpZXNPbk1haW5UaHJlYWQoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisK
KyAgICAvLyBSZXN1bWUgdG8gYWxsb3cgb25nb2luZyB0cmFuc2FjdGlvbnMgdG8gYmUgZmluaXNo
ZWQuCisgICAgbV9zZXJ2ZXJMb2NrLnVubG9jaygpOworICAgIG1faXNTdXNwZW5kZWQgPSBmYWxz
ZTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgV2ViSURCU2VydmVyOjpyZXN1bWUoKSBX
VEZfSUdOT1JFU19USFJFQURfU0FGRVRZX0FOQUxZU0lTCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
S2l0L05ldHdvcmtQcm9jZXNzL0luZGV4ZWREQi9XZWJJREJTZXJ2ZXIuaCBiL1NvdXJjZS9XZWJL
aXQvTmV0d29ya1Byb2Nlc3MvSW5kZXhlZERCL1dlYklEQlNlcnZlci5oCmluZGV4IDY5NzA3YjI3
Mzk3ZGJlNTZlNDZmNzVjMzFmMzE5MDU5NmUwYjQxOTguLjMzZTBkM2M2YjMxMDZmZTI1ODFlMzFk
YTcwOTA4YWJlNjQ3MDVmNWYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nl
c3MvSW5kZXhlZERCL1dlYklEQlNlcnZlci5oCisrKyBiL1NvdXJjZS9XZWJLaXQvTmV0d29ya1By
b2Nlc3MvSW5kZXhlZERCL1dlYklEQlNlcnZlci5oCkBAIC01Miw3ICs1Miw4IEBAIHB1YmxpYzoK
ICAgICB2b2lkIGNsb3NlQW5kRGVsZXRlRGF0YWJhc2VzRm9yT3JpZ2lucyhjb25zdCBWZWN0b3I8
V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhPiYsIENvbXBsZXRpb25IYW5kbGVyPHZvaWQoKT4m
JiBjYWxsYmFjayk7CiAgICAgdm9pZCByZW5hbWVPcmlnaW4oY29uc3QgV2ViQ29yZTo6U2VjdXJp
dHlPcmlnaW5EYXRhJiwgY29uc3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJiwgQ29tcGxl
dGlvbkhhbmRsZXI8dm9pZCgpPiYmKTsKIAotICAgIHZvaWQgc3VzcGVuZCgpOworICAgIGVudW0g
Y2xhc3MgU3VzcGVuZFR5cGUgOiBib29sIHsgSWZQb3NzaWJsZSwgSW1tZWRpYXRlIH07CisgICAg
Ym9vbCB0cnlTdXNwZW5kKFN1c3BlbmRUeXBlKTsKICAgICB2b2lkIHJlc3VtZSgpOwogCiAgICAg
Ly8gTWVzc2FnZSBoYW5kbGVycy4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvTmV0d29ya1By
b2Nlc3MvTmV0d29ya1Byb2Nlc3MuY3BwIGIvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9O
ZXR3b3JrUHJvY2Vzcy5jcHAKaW5kZXggYWVhMmZhYTU4YTE1ODFmMDBiZjU2YmNlZWVkMTc3YjQ0
YTQzNjA5Ni4uODZjYjA4Y2MxZGI3M2JmNmRkMzZiNTFlMjA5YjlmMDdmZmFiZjU2NiAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9OZXR3b3JrUHJvY2Vzcy5jcHAKKysr
IGIvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9OZXR3b3JrUHJvY2Vzcy5jcHAKQEAgLTIy
MTEsMTQgKzIyMTEsNDIgQEAgdm9pZCBOZXR3b3JrUHJvY2Vzczo6cHJvY2Vzc1dpbGxTdXNwZW5k
SW1taW5lbnRseUZvclRlc3RpbmdTeW5jKENvbXBsZXRpb25IYW5kbGUKICAgICBwcmVwYXJlVG9T
dXNwZW5kKHRydWUsIFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpKTsKIH0KIAordm9pZCBOZXR3
b3JrUHJvY2Vzczo6c3VzcGVuZElEQlNlcnZlcnMoYm9vbCBpc1N1c3BlbnNpb25JbW1pbmVudCkK
K3sKKyAgICBtX3Nob3VsZFN1c3BlbmRJREJTZXJ2ZXJzID0gdHJ1ZTsKKworICAgIGlmIChpc1N1
c3BlbnNpb25JbW1pbmVudCkgeworICAgICAgICBmb3IgKGF1dG8mIHNlcnZlciA6IG1fd2ViSURC
U2VydmVycy52YWx1ZXMoKSkKKyAgICAgICAgICAgIHNlcnZlci0+dHJ5U3VzcGVuZChXZWJJREJT
ZXJ2ZXI6OlN1c3BlbmRUeXBlOjpJbW1lZGlhdGUpOworICAgICAgICByZXR1cm47CisgICAgfQor
ICAgIAorICAgIGJvb2wgYWxsU3VzcGVuZGVkID0gdHJ1ZTsKKyAgICBhdXRvIHR5cGUgPSBpc1N1
c3BlbnNpb25JbW1pbmVudCA/IFdlYklEQlNlcnZlcjo6U3VzcGVuZFR5cGU6OkltbWVkaWF0ZSA6
IFdlYklEQlNlcnZlcjo6U3VzcGVuZFR5cGU6OklmUG9zc2libGU7CisgICAgZm9yIChhdXRvJiBz
ZXJ2ZXIgOiBtX3dlYklEQlNlcnZlcnMudmFsdWVzKCkpCisgICAgICAgIGFsbFN1c3BlbmRlZCAm
PSBzZXJ2ZXItPnRyeVN1c3BlbmQodHlwZSk7CisKKyAgICBpZiAoYWxsU3VzcGVuZGVkKQorICAg
ICAgICByZXR1cm47CisKKyAgICBSdW5Mb29wOjptYWluKCkuZGlzcGF0Y2hBZnRlcig1X3MsIFt0
aGlzLCB3ZWFrVGhpcyA9IG1ha2VXZWFrUHRyKCp0aGlzKV0geworICAgICAgICBpZiAoIXdlYWtU
aGlzKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmICghbV9zaG91bGRTdXNwZW5k
SURCU2VydmVycykKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGZvciAo
YXV0byYgc2VydmVyIDogbV93ZWJJREJTZXJ2ZXJzLnZhbHVlcygpKQorICAgICAgICAgICAgc2Vy
dmVyLT50cnlTdXNwZW5kKFdlYklEQlNlcnZlcjo6U3VzcGVuZFR5cGU6OkltbWVkaWF0ZSk7Cisg
ICAgfSk7Cit9CisKIHZvaWQgTmV0d29ya1Byb2Nlc3M6OnByZXBhcmVUb1N1c3BlbmQoYm9vbCBp
c1N1c3BlbnNpb25JbW1pbmVudCwgQ29tcGxldGlvbkhhbmRsZXI8dm9pZCgpPiYmIGNvbXBsZXRp
b25IYW5kbGVyKQogewogICAgIFJFTEVBU0VfTE9HKFByb2Nlc3NTdXNwZW5zaW9uLCAiJXAgLSBO
ZXR3b3JrUHJvY2Vzczo6cHJlcGFyZVRvU3VzcGVuZCgpLCBpc1N1c3BlbnNpb25JbW1pbmVudD0l
ZCIsIHRoaXMsIGlzU3VzcGVuc2lvbkltbWluZW50KTsKIAogI2lmIFBMQVRGT1JNKElPU19GQU1J
TFkpCi0gICAgZm9yIChhdXRvJiBzZXJ2ZXIgOiBtX3dlYklEQlNlcnZlcnMudmFsdWVzKCkpCi0g
ICAgICAgIHNlcnZlci0+c3VzcGVuZCgpOwotICAgIG1fc2hvdWxkU3VzcGVuZElEQlNlcnZlciA9
IHRydWU7CisgICAgc3VzcGVuZElEQlNlcnZlcnMoaXNTdXNwZW5zaW9uSW1taW5lbnQpOwogI2Vu
ZGlmCiAKICAgICBsb3dNZW1vcnlIYW5kbGVyKENyaXRpY2FsOjpZZXMpOwpAQCAtMjI4Miw3ICsy
MzEwLDcgQEAgdm9pZCBOZXR3b3JrUHJvY2Vzczo6cmVzdW1lKCkKICNpZiBQTEFURk9STShJT1Nf
RkFNSUxZKQogICAgIGZvciAoYXV0byYgc2VydmVyIDogbV93ZWJJREJTZXJ2ZXJzLnZhbHVlcygp
KQogICAgICAgICBzZXJ2ZXItPnJlc3VtZSgpOwotICAgIG1fc2hvdWxkU3VzcGVuZElEQlNlcnZl
ciA9IGZhbHNlOworICAgIG1fc2hvdWxkU3VzcGVuZElEQlNlcnZlcnMgPSBmYWxzZTsKICNlbmRp
ZgogCiAgICAgbV9zdG9yYWdlTWFuYWdlclNldC0+cmVzdW1lKCk7CkBAIC0yMzQ3LDggKzIzNzUs
OCBAQCBSZWY8V2ViSURCU2VydmVyPiBOZXR3b3JrUHJvY2Vzczo6Y3JlYXRlV2ViSURCU2VydmVy
KFBBTDo6U2Vzc2lvbklEIHNlc3Npb25JRCkKICAgICB9OwogCiAgICAgYXV0byByZXN1bHQgPSBX
ZWJJREJTZXJ2ZXI6OmNyZWF0ZShzZXNzaW9uSUQsIHBhdGgsIFdURk1vdmUoc3BhY2VSZXF1ZXN0
ZXIpKTsKLSAgICBpZiAobV9zaG91bGRTdXNwZW5kSURCU2VydmVyKQotICAgICAgICByZXN1bHQt
PnN1c3BlbmQoKTsKKyAgICBpZiAobV9zaG91bGRTdXNwZW5kSURCU2VydmVycykKKyAgICAgICAg
cmVzdWx0LT50cnlTdXNwZW5kKFdlYklEQlNlcnZlcjo6U3VzcGVuZFR5cGU6OkltbWVkaWF0ZSk7
CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9OZXR3
b3JrUHJvY2Vzcy9OZXR3b3JrUHJvY2Vzcy5oIGIvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vz
cy9OZXR3b3JrUHJvY2Vzcy5oCmluZGV4IDc5NDgwOTdhYTNkYzM4NmEyZmQ0MWZhZDYyM2IzY2Vj
ZGY4ZDdlNGEuLmZmYjZlZjYxMTdlMzcyMTM5ZTNiNGVlYzE0Y2RmMzY2OTQ3NzYwZWQgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvTmV0d29ya1Byb2Nlc3MuaAorKysg
Yi9Tb3VyY2UvV2ViS2l0L05ldHdvcmtQcm9jZXNzL05ldHdvcmtQcm9jZXNzLmgKQEAgLTQ4Niw2
ICs0ODYsNyBAQCBwcml2YXRlOgogICAgIFJlZjxXZWJJREJTZXJ2ZXI+IGNyZWF0ZVdlYklEQlNl
cnZlcihQQUw6OlNlc3Npb25JRCk7CiAgICAgdm9pZCBzZXRTZXNzaW9uU3RvcmFnZVF1b3RhTWFu
YWdlcklEQlJvb3RQYXRoKFBBTDo6U2Vzc2lvbklELCBjb25zdCBTdHJpbmcmIGlkYlJvb3RQYXRo
KTsKICAgICB2b2lkIHJlbW92ZVdlYklEQlNlcnZlcklmUG9zc2libGUoUEFMOjpTZXNzaW9uSUQp
OworICAgIHZvaWQgc3VzcGVuZElEQlNlcnZlcnMoYm9vbCBpc1N1c3BlbnNpb25JbW1pbmVudCk7
CiAKICNpZiBFTkFCTEUoU0VSVklDRV9XT1JLRVIpCiAgICAgdm9pZCBkaWRDcmVhdGVXb3JrZXJD
b250ZXh0UHJvY2Vzc0Nvbm5lY3Rpb24oY29uc3QgSVBDOjpBdHRhY2htZW50Jik7CkBAIC01ODMs
NyArNTg0LDcgQEAgcHJpdmF0ZToKIAogICAgIEhhc2hNYXA8UEFMOjpTZXNzaW9uSUQsIFN0cmlu
Zz4gbV9pZGJEYXRhYmFzZVBhdGhzOwogICAgIEhhc2hNYXA8UEFMOjpTZXNzaW9uSUQsIFJlZlB0
cjxXZWJJREJTZXJ2ZXI+PiBtX3dlYklEQlNlcnZlcnM7Ci0gICAgYm9vbCBtX3Nob3VsZFN1c3Bl
bmRJREJTZXJ2ZXIgeyBmYWxzZSB9OworICAgIGJvb2wgbV9zaG91bGRTdXNwZW5kSURCU2VydmVy
cyB7IGZhbHNlIH07CiAgICAgCiAjaWYgRU5BQkxFKFNFUlZJQ0VfV09SS0VSKQogICAgIHN0cnVj
dCBTZXJ2aWNlV29ya2VySW5mbyB7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L05ldHdvcmtQ
cm9jZXNzL2lvcy9OZXR3b3JrUHJvY2Vzc0lPUy5tbSBiL1NvdXJjZS9XZWJLaXQvTmV0d29ya1By
b2Nlc3MvaW9zL05ldHdvcmtQcm9jZXNzSU9TLm1tCmluZGV4IDY0OTRiNWE3OThhZjY5MDgxZWEz
ZDdhNWEzY2M1NWVjODI3ZTRiZjQuLmM4NjljYjgzZWJiY2Y4NDY3OTQ2NzVhOWRjYjI2OTgzMmU3
MmMzOTYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvaW9zL05ldHdv
cmtQcm9jZXNzSU9TLm1tCisrKyBiL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvaW9zL05l
dHdvcmtQcm9jZXNzSU9TLm1tCkBAIC0xMTMsNiArMTEzLDE4IEBAIHZvaWQgTmV0d29ya1Byb2Nl
c3M6OnNldElzSG9sZGluZ0xvY2tlZEZpbGVzKGJvb2wgaXNIb2xkaW5nTG9ja2VkRmlsZXMpCiAg
ICAgLy8gV2Ugc3luY2hyb25vdXNseSB0YWtlIGEgcHJvY2VzcyBhc3NlcnRpb24gd2hlbiBiZWdp
bm5pbmcgYSBTUUxpdGUgdHJhbnNhY3Rpb24gc28gdGhhdCB3ZSBkb24ndCBnZXQgc3VzcGVuZGVk
CiAgICAgLy8gd2hpbGUgaG9sZGluZyBhIGxvY2tlZCBmaWxlLiBXZSB3b3VsZCBnZXQga2lsbGVk
IGlmIHN1c3BlbmRlZCB3aGlsZSBob2xkaW5nIGxvY2tlZCBmaWxlcy4KICAgICBtX2hvbGRpbmdM
b2NrZWRGaWxlQXNzZXJ0aW9uID0gUHJvY2Vzc0Fzc2VydGlvbjo6Y3JlYXRlKGdldEN1cnJlbnRQ
cm9jZXNzSUQoKSwgIk5ldHdvcmsgUHJvY2VzcyBpcyBob2xkaW5nIGxvY2tlZCBmaWxlcyJfcywg
UHJvY2Vzc0Fzc2VydGlvblR5cGU6OkZpbmlzaFRhc2tVbmludGVycnVwdGFibGUsIFByb2Nlc3NB
c3NlcnRpb246Ok1vZGU6OlN5bmMpOworICAgIG1faG9sZGluZ0xvY2tlZEZpbGVBc3NlcnRpb24t
PnNldFByZXBhcmVGb3JJbnZhbGlkYXRpb25IYW5kbGVyKFt0aGlzLCB3ZWFrVGhpcyA9IG1ha2VX
ZWFrUHRyKCp0aGlzKV0oKSBtdXRhYmxlIHsKKyAgICAgICAgY2FsbE9uTWFpblJ1bkxvb3AoW3Ro
aXMsIHdlYWtUaGlzID0gV1RGTW92ZSh3ZWFrVGhpcyldKCkgeworICAgICAgICAgICAgaWYgKCF3
ZWFrVGhpcykKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGlmICghbV9z
aG91bGRTdXNwZW5kSURCU2VydmVycykKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAg
ICAgICAgIGZvciAoYXV0byYgc2VydmVyIDogbV93ZWJJREJTZXJ2ZXJzLnZhbHVlcygpKQorICAg
ICAgICAgICAgICAgIHNlcnZlci0+c3VzcGVuZCgpOworICAgICAgICB9KTsKKyAgICB9KTsKIH0K
IAogfSAvLyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJv
Y2Vzcy9Qcm9jZXNzQXNzZXJ0aW9uLmggYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9Qcm9jZXNz
QXNzZXJ0aW9uLmgKaW5kZXggNzEzZmI5ZmJhYjE4NmZhNzdmMWQwMGNjNTUyMzY5MGM0Y2U1MDNj
OC4uY2I3ZGRlZDZmZWQ4ZmE1Y2NmM2E5MDZjMzM4NDBlN2Y5Y2ExYjMzNCAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYktpdC9VSVByb2Nlc3MvUHJvY2Vzc0Fzc2VydGlvbi5oCisrKyBiL1NvdXJjZS9X
ZWJLaXQvVUlQcm9jZXNzL1Byb2Nlc3NBc3NlcnRpb24uaApAQCAtNzIsNiArNzIsNyBAQCBwdWJs
aWM6CiAgICAgfQogICAgIHZpcnR1YWwgflByb2Nlc3NBc3NlcnRpb24oKTsKIAorICAgIHZvaWQg
c2V0UHJlcGFyZUZvckludmFsaWRhdGlvbkhhbmRsZXIoRnVuY3Rpb248dm9pZCgpPiYmIGhhbmRs
ZXIpIHsgbV9wcmVwYXJlRm9ySW52YWxpZGF0aW9uSGFuZGxlciA9IFdURk1vdmUoaGFuZGxlcik7
IH0KICAgICB2b2lkIHNldEludmFsaWRhdGlvbkhhbmRsZXIoRnVuY3Rpb248dm9pZCgpPiYmIGhh
bmRsZXIpIHsgbV9pbnZhbGlkYXRpb25IYW5kbGVyID0gV1RGTW92ZShoYW5kbGVyKTsgfQogCiAg
ICAgUHJvY2Vzc0Fzc2VydGlvblR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fYXNzZXJ0aW9u
VHlwZTsgfQpAQCAtODYsNiArODcsNyBAQCBwcm90ZWN0ZWQ6CiAgICAgdm9pZCBhY3F1aXJlU3lu
YygpOwogCiAjaWYgUExBVEZPUk0oSU9TX0ZBTUlMWSkKKyAgICB2b2lkIHByb2Nlc3NBc3NlcnRp
b25XaWxsQmVJbnZhbGlkYXRlZCgpOwogICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzQXNzZXJ0aW9u
V2FzSW52YWxpZGF0ZWQoKTsKICNlbmRpZgogCkBAIC05OCw2ICsxMDAsNyBAQCBwcml2YXRlOgog
ICAgIFJldGFpblB0cjxXS1JCU0Fzc2VydGlvbkRlbGVnYXRlPiBtX2RlbGVnYXRlOwogICAgIGJv
b2wgbV93YXNJbnZhbGlkYXRlZCB7IGZhbHNlIH07CiAjZW5kaWYKKyAgICBGdW5jdGlvbjx2b2lk
KCk+IG1fcHJlcGFyZUZvckludmFsaWRhdGlvbkhhbmRsZXI7CiAgICAgRnVuY3Rpb248dm9pZCgp
PiBtX2ludmFsaWRhdGlvbkhhbmRsZXI7CiB9OwogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0
L1VJUHJvY2Vzcy9pb3MvUHJvY2Vzc0Fzc2VydGlvbklPUy5tbSBiL1NvdXJjZS9XZWJLaXQvVUlQ
cm9jZXNzL2lvcy9Qcm9jZXNzQXNzZXJ0aW9uSU9TLm1tCmluZGV4IGYzNTExNmQxYTBhNGMzZmI5
OTU0Mjc0ZWE1NTZlMzlkYzVkNmYxYzUuLjQ5ZmJiMTAzMGFlYjkzNTBjNWEzNGFmMWZjMTRlOTRk
Mjc3M2ZlZDQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL2lvcy9Qcm9jZXNz
QXNzZXJ0aW9uSU9TLm1tCisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL2lvcy9Qcm9jZXNz
QXNzZXJ0aW9uSU9TLm1tCkBAIC0yNTUsMTIgKzI1NSwxNCBAQCBzdGF0aWMgYm9vbCBwcm9jZXNz
SGFzQWN0aXZlUnVuVGltZUxpbWl0YXRpb24oKQogdHlwZWRlZiB2b2lkKF5SQlNBc3NlcnRpb25J
bnZhbGlkYXRpb25DYWxsYmFja1R5cGUpKCk7CiAKIEBpbnRlcmZhY2UgV0tSQlNBc3NlcnRpb25E
ZWxlZ2F0ZSA6IE5TT2JqZWN0PFJCU0Fzc2VydGlvbk9ic2VydmluZz4KK0Bwcm9wZXJ0eSAoY29w
eSkgUkJTQXNzZXJ0aW9uSW52YWxpZGF0aW9uQ2FsbGJhY2tUeXBlIHByZXBhcmVGb3JJbnZhbGlk
YXRpb25DYWxsYmFjazsKIEBwcm9wZXJ0eSAoY29weSkgUkJTQXNzZXJ0aW9uSW52YWxpZGF0aW9u
Q2FsbGJhY2tUeXBlIGludmFsaWRhdGlvbkNhbGxiYWNrOwogQGVuZAogCiBAaW1wbGVtZW50YXRp
b24gV0tSQlNBc3NlcnRpb25EZWxlZ2F0ZQogLSAodm9pZClkZWFsbG9jCiB7CisgICAgW19wcmVw
YXJlRm9ySW52YWxpZGF0aW9uQ2FsbGJhY2sgcmVsZWFzZV07CiAgICAgW19pbnZhbGlkYXRpb25D
YWxsYmFjayByZWxlYXNlXTsKICAgICBbc3VwZXIgZGVhbGxvY107CiB9CkBAIC0yNjgsNiArMjcw
LDggQEAgdHlwZWRlZiB2b2lkKF5SQlNBc3NlcnRpb25JbnZhbGlkYXRpb25DYWxsYmFja1R5cGUp
KCk7CiAtICh2b2lkKWFzc2VydGlvbldpbGxJbnZhbGlkYXRlOihSQlNBc3NlcnRpb24gKilhc3Nl
cnRpb24KIHsKICAgICBSRUxFQVNFX0xPRyhQcm9jZXNzU3VzcGVuc2lvbiwgIiVwIC0gV0tSQlNB
c3NlcnRpb25EZWxlZ2F0ZTogYXNzZXJ0aW9uV2lsbEludmFsaWRhdGUiLCBzZWxmKTsKKworICAg
IF9wcmVwYXJlRm9ySW52YWxpZGF0aW9uQ2FsbGJhY2soKTsKIH0KIAogLSAodm9pZClhc3NlcnRp
b246KFJCU0Fzc2VydGlvbiAqKWFzc2VydGlvbiBkaWRJbnZhbGlkYXRlV2l0aEVycm9yOihOU0Vy
cm9yICopZXJyb3IKQEAgLTMzOSw2ICszNDMsMTAgQEAgUHJvY2Vzc0Fzc2VydGlvbjo6UHJvY2Vz
c0Fzc2VydGlvbihwaWRfdCBwaWQsIGNvbnN0IFN0cmluZyYgcmVhc29uLCBQcm9jZXNzQXNzZXIK
ICAgICAgICAgUkVMRUFTRV9MT0coUHJvY2Vzc1N1c3BlbnNpb24sICIlcCAtIFByb2Nlc3NBc3Nl
cnRpb246IFJCUyAle3B1YmxpY31AIGFzc2VydGlvbiBmb3IgcHJvY2VzcyB3aXRoIFBJRD0lZCB3
YXMgaW52YWxpZGF0ZWQiLCB0aGlzLCBydW5uaW5nQm9hcmRBc3NlcnRpb25OYW1lLCBwaWQpOwog
ICAgICAgICBwcm9jZXNzQXNzZXJ0aW9uV2FzSW52YWxpZGF0ZWQoKTsKICAgICB9OworICAgIG1f
ZGVsZWdhdGUuZ2V0KCkucHJlcGFyZUZvckludmFsaWRhdGlvbkNhbGxiYWNrID0gXnsKKyAgICAg
ICAgUkVMRUFTRV9MT0coUHJvY2Vzc1N1c3BlbnNpb24sICIlcCAtIFByb2Nlc3NBc3NlcnRpb24o
KSBSQlMgJXtwdWJsaWN9QCBhc3NlcnRpb24gZm9yIHByb2Nlc3Mgd2l0aCBQSUQ9JWQgd2lsbCBi
ZSBpbnZhbGlkYXRlZCIsIHRoaXMsIHJ1bm5pbmdCb2FyZEFzc2VydGlvbk5hbWUsIHBpZCk7Cisg
ICAgICAgIHByb2Nlc3NBc3NlcnRpb25XaWxsQmVJbnZhbGlkYXRlZCgpOworICAgIH07CiB9CiAK
IHZvaWQgUHJvY2Vzc0Fzc2VydGlvbjo6YWNxdWlyZUFzeW5jKENvbXBsZXRpb25IYW5kbGVyPHZv
aWQoKT4mJiBjb21wbGV0aW9uSGFuZGxlcikKQEAgLTM3MywxMiArMzgxLDIxIEBAIFByb2Nlc3NB
c3NlcnRpb246On5Qcm9jZXNzQXNzZXJ0aW9uKCkKIAogICAgIGlmIChtX3Jic0Fzc2VydGlvbikg
ewogICAgICAgICBtX2RlbGVnYXRlLmdldCgpLmludmFsaWRhdGlvbkNhbGxiYWNrID0gbmlsOwor
ICAgICAgICBtX2RlbGVnYXRlLmdldCgpLnByZXBhcmVGb3JJbnZhbGlkYXRpb25DYWxsYmFjayA9
IG5pbDsKICAgICAgICAgW21fcmJzQXNzZXJ0aW9uIHJlbW92ZU9ic2VydmVyOm1fZGVsZWdhdGUu
Z2V0KCldOwogICAgICAgICBtX2RlbGVnYXRlID0gbmlsOwogICAgICAgICBbbV9yYnNBc3NlcnRp
b24gaW52YWxpZGF0ZV07CiAgICAgfQogfQogCit2b2lkIFByb2Nlc3NBc3NlcnRpb246OnByb2Nl
c3NBc3NlcnRpb25XaWxsQmVJbnZhbGlkYXRlZCgpCit7CisgICAgUkVMRUFTRV9MT0coUHJvY2Vz
c1N1c3BlbnNpb24sICIlcCAtIFByb2Nlc3NBc3NlcnRpb246OnByb2Nlc3NBc3NlcnRpb25XaWxs
QmVJbnZhbGlkYXRlZCgpIFBJRD0lZCIsIHRoaXMsIG1fcGlkKTsKKworICAgIGlmIChtX3ByZXBh
cmVGb3JJbnZhbGlkYXRpb25IYW5kbGVyKQorICAgICAgICBtX3ByZXBhcmVGb3JJbnZhbGlkYXRp
b25IYW5kbGVyKCk7Cit9CisKIHZvaWQgUHJvY2Vzc0Fzc2VydGlvbjo6cHJvY2Vzc0Fzc2VydGlv
bldhc0ludmFsaWRhdGVkKCkKIHsKICAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOwo=
</data>
<flag name="commit-queue"
          id="455924"
          type_id="3"
          status="-"
          setter="ews-feeder"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>433613</attachid>
            <date>2021-07-15 12:49:42 -0700</date>
            <delta_ts>2021-07-15 14:04:03 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-227778-20210715124941.patch</filename>
            <type>text/plain</type>
            <size>17192</size>
            <attacher name="Sihui Liu">sihui_liu</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjc5OTAzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMzljMmIyNWVlNmE3YzNh
ZmE2NTZlNzc2MDNmY2YxZjIyNjQ5OWFhNC4uMGYxNjNmNjlkNjVhNjAxNWQ2NDQ0OTRmMjRjNDVi
YzJjNmNjNzhlMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE4IEBACisyMDIxLTA3LTE1ICBTaWh1
aSBMaXUgIDxzaWh1aV9saXVAYXBwbGUuY29tPgorCisgICAgICAgIERvIG5vdCBhYm9ydCBvbmdv
aW5nIElEQiB0cmFuc2FjdGlvbiBzeW5jaHJvbm91c2x5IG9uIG5vbi1pbW1pbmVudCBQcmVwYXJl
VG9TdXNwZW5kIG1lc3NhZ2UKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTIyNzc3OAorICAgICAgICA8cmRhcjovL3Byb2JsZW0vODA2MDI1NTc+CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBNb2R1bGVzL2lu
ZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OklEQlNlcnZl
cjo6SURCU2VydmVyOjpoYXNEYXRhYmFzZUFjdGl2aXRpZXNPbk1haW5UaHJlYWQgY29uc3QpOgor
ICAgICAgICAqIE1vZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9JREJTZXJ2ZXIuaDoKKyAgICAgICAg
KiBNb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVlSURCRGF0YWJhc2UuY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6SURCU2VydmVyOjpVbmlxdWVJREJEYXRhYmFzZTo6aGFzQWN0aXZlVHJhbnNh
Y3Rpb25zIGNvbnN0KToKKyAgICAgICAgKiBNb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVl
SURCRGF0YWJhc2UuaDoKKwogMjAyMS0wNy0xMyAgQWxleCBDaHJpc3RlbnNlbiAgPGFjaHJpc3Rl
bnNlbkB3ZWJraXQub3JnPgogCiAgICAgICAgID40SyBSZWZlcmVyIHNob3VsZCBoYXZlIHRhaWxp
bmcgLwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cgYi9Tb3VyY2UvV2ViS2l0
L0NoYW5nZUxvZwppbmRleCA4MmM4Y2M4OGZmMDI1NTEyZWFmNTQ3YmVmYjA1MDBiYWY2ZGRjMGMx
Li5mMGE4MzczNGEwY2NkZjYyMTNlZjRjZjQwMmUzOWI1ZDkxYzU5YmRmIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViS2l0L0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViS2l0L0NoYW5nZUxvZwpAQCAt
MSwzICsxLDM4IEBACisyMDIxLTA3LTE1ICBTaWh1aSBMaXUgIDxzaWh1aV9saXVAYXBwbGUuY29t
PgorCisgICAgICAgIERvIG5vdCBhYm9ydCBvbmdvaW5nIElEQiB0cmFuc2FjdGlvbiBzeW5jaHJv
bm91c2x5IG9uIG5vbi1pbW1pbmVudCBQcmVwYXJlVG9TdXNwZW5kIG1lc3NhZ2UKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIyNzc3OAorICAgICAgICA8
cmRhcjovL3Byb2JsZW0vODA2MDI1NTc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQ3VycmVudGx5IHdlIGFib3J0IElEQiB0cmFuc2FjdGlvbnMgYW5k
IHN1c3BlbmQgSURCIHRocmVhZCBzeW5jaHJvbm91c2x5IGluIE5ldHdvcmtQcm9jZXNzOjpwcmVw
YXJlVG9TdXNwZW5kLgorICAgICAgICBBcyBVSSBwcm9jZXNzIGRvZXMgbm90IGtub3cgdGhlIGZp
bGUgbG9ja2luZyBzdGF0ZSBpbiBuZXR3b3JrIHByb2Nlc3Mgbm93IChiZWNhdXNlIG5ldHdvcmsg
cHJvY2VzcyB0cmFja3MKKyAgICAgICAgdGhlIHN0YXRlIGFuZCB0YWtlcyB0aGUgYXNzZXJ0aW9u
IGJ5IGl0c2VsZiksIFVJIHByb2Nlc3MgbWF5IHNlbmQgbm9uLWltbWluZW50IFByZXBhcmVUb1N1
c3BlbmQgbW9yZSBvZnRlbiwKKyAgICAgICAgYW5kIHdlIG1heSBhYm9ydCB0cmFuc2FjdGlvbiB0
b28gYWdncmVzc2l2ZWx5IChlLmcuIFVJIHByb2Nlc3MgbWF5IHNlbmQgdGhlIG1lc3NhZ2UgYXMg
c29vbiBhcyBhcHAgaXMgaW4gCisgICAgICAgIGJhY2tncm91bmQpLiBUbyBmaXggdGhlIHBvc3Np
YmxlIHJlZ3Jlc3Npb24gb2YgZGF0YSBsb3NzLCB3ZSB3aWxsIHNjaGVkdWxlIGEgdGFzayB3aXRo
IDVzIGRlbGF5IHRvIGFib3J0CisgICAgICAgIHRyYW5zYWN0aW9ucyBhZnRlciBwcmVwYXJlVG9T
dXNwZW5kLiBJbiB0aGlzIGNhc2UsIHRyYW5zYWN0aW9ucyBmaW5pc2hlZCBpbiA1cyBjYW4gaGF2
ZSBhIGNoYW5jZSB0byBmaW5pc2guCisKKyAgICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9JbmRleGVk
REIvV2ViSURCU2VydmVyLmNwcDoKKyAgICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9JbmRleGVkREIv
V2ViSURCU2VydmVyLmg6CisgICAgICAgICogTmV0d29ya1Byb2Nlc3MvTmV0d29ya1Byb2Nlc3Mu
Y3BwOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrUHJvY2Vzczo6c3VzcGVuZElEQlNlcnZlcnMp
OgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrUHJvY2Vzczo6cHJlcGFyZVRvU3VzcGVuZCk6Cisg
ICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtQcm9jZXNzOjpyZXN1bWUpOgorICAgICAgICAoV2ViS2l0
OjpOZXR3b3JrUHJvY2Vzczo6Y3JlYXRlV2ViSURCU2VydmVyKToKKyAgICAgICAgKiBOZXR3b3Jr
UHJvY2Vzcy9OZXR3b3JrUHJvY2Vzcy5oOgorICAgICAgICAqIE5ldHdvcmtQcm9jZXNzL2lvcy9O
ZXR3b3JrUHJvY2Vzc0lPUy5tbToKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya1Byb2Nlc3M6OnNl
dElzSG9sZGluZ0xvY2tlZEZpbGVzKToKKyAgICAgICAgKiBVSVByb2Nlc3MvUHJvY2Vzc0Fzc2Vy
dGlvbi5oOgorICAgICAgICAoV2ViS2l0OjpQcm9jZXNzQXNzZXJ0aW9uOjpzZXRQcmVwYXJlRm9y
SW52YWxpZGF0aW9uSGFuZGxlcik6CisgICAgICAgICogVUlQcm9jZXNzL2lvcy9Qcm9jZXNzQXNz
ZXJ0aW9uSU9TLm1tOgorICAgICAgICAoLVtXS1JCU0Fzc2VydGlvbkRlbGVnYXRlIGRlYWxsb2Nd
KToKKyAgICAgICAgKC1bV0tSQlNBc3NlcnRpb25EZWxlZ2F0ZSBhc3NlcnRpb25XaWxsSW52YWxp
ZGF0ZTpdKTogVGhpcyB3aWxsIGNhbGxlZCBzZWNvbmRzIGJlZm9yZSBhc3NlcnRpb24gaXMgdGlt
ZWQgb3V0LCBzbworICAgICAgICB3ZSBzaG91bGQgaGF2ZSBlbm91Z2ggdGltZSB0byBjbGVhbiB1
cC4KKyAgICAgICAgKFdlYktpdDo6UHJvY2Vzc0Fzc2VydGlvbjo6UHJvY2Vzc0Fzc2VydGlvbik6
CisgICAgICAgIChXZWJLaXQ6OlByb2Nlc3NBc3NlcnRpb246On5Qcm9jZXNzQXNzZXJ0aW9uKToK
KyAgICAgICAgKFdlYktpdDo6UHJvY2Vzc0Fzc2VydGlvbjo6cHJvY2Vzc0Fzc2VydGlvbldpbGxC
ZUludmFsaWRhdGVkKToKKwogMjAyMS0wNy0xMyAgV2Vuc29uIEhzaWVoICA8d2Vuc29uX2hzaWVo
QGFwcGxlLmNvbT4KIAogICAgICAgICBbV0syXSBQdXNoIE9TIHN0YXRlIGR1bXBpbmcgbG9naWMg
ZG93biBmcm9tIFdlYlByb2Nlc3MgdG8gQXV4aWxpYXJ5UHJvY2VzcwpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL0lEQlNlcnZlci5jcHAgYi9Tb3Vy
Y2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmNwcAppbmRleCA0
OWQ4NzY2MmZjYjNhNWFlMjNmMmE3YWI1MjdlNjU1N2MzMjZlYTNiLi5lYTNmNmQ2YTIxZGVmZTNi
ZjVhNzIwZTU0MDYwNTA1Nzc3Zjg1ZjYxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1
bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9N
b2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmNwcApAQCAtNzY3LDYgKzc2NywyMiBA
QCB2b2lkIElEQlNlcnZlcjo6dXBncmFkZUZpbGVzSWZOZWNlc3NhcnkoKQogICAgICAgICBGaWxl
U3lzdGVtOjptYWtlQWxsRGlyZWN0b3JpZXMobmV3VmVyc2lvbkRpcmVjdG9yeSk7CiB9CiAKK2Jv
b2wgSURCU2VydmVyOjpoYXNEYXRhYmFzZUFjdGl2aXRpZXNPbk1haW5UaHJlYWQoKSBjb25zdAor
eworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgQVNTRVJUKG1fbG9jay5pc0hlbGQo
KSk7CisKKyAgICBpZiAobV9zZXNzaW9uSUQuaXNFcGhlbWVyYWwoKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgZm9yIChhdXRvJiBkYXRhYmFzZSA6IG1fdW5pcXVlSURCRGF0YWJhc2VN
YXAudmFsdWVzKCkpIHsKKyAgICAgICAgaWYgKCFkYXRhYmFzZS0+aWRlbnRpZmllcigpLmlzVHJh
bnNpZW50KCkgJiYgZGF0YWJhc2UtPmhhc0FjdGl2ZVRyYW5zYWN0aW9ucygpKQorICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHJldHVybiBmYWxzZTsKK30KKwogdm9p
ZCBJREJTZXJ2ZXI6OnN0b3BEYXRhYmFzZUFjdGl2aXRpZXNPbk1haW5UaHJlYWQoKQogewogICAg
IEFTU0VSVChpc01haW5UaHJlYWQoKSk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1
bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmggYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVz
L2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmgKaW5kZXggYmM3MjMwYzgwY2ZiNjQ2YWZlYzhk
ZTU5MGMzMDM1NDY3MGY0YzdlZC4uNjA4ZDdmYWI5ZWNkNzY1ZDk3ZjBjMDgzMzNmZjRkYjU0MDAx
MDdiMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVy
L0lEQlNlcnZlci5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL3NlcnZl
ci9JREJTZXJ2ZXIuaApAQCAtMTA3LDYgKzEwNyw3IEBAIHB1YmxpYzoKICAgICBTdG9yYWdlUXVv
dGFNYW5hZ2VyOjpEZWNpc2lvbiByZXF1ZXN0U3BhY2UoY29uc3QgQ2xpZW50T3JpZ2luJiwgdWlu
dDY0X3QgdGFza1NpemUpOwogICAgIFdFQkNPUkVfRVhQT1JUIHN0YXRpYyB1aW50NjRfdCBkaXNr
VXNhZ2UoY29uc3QgU3RyaW5nJiByb290RGlyZWN0b3J5LCBjb25zdCBDbGllbnRPcmlnaW4mKTsK
IAorICAgIFdFQkNPUkVfRVhQT1JUIGJvb2wgaGFzRGF0YWJhc2VBY3Rpdml0aWVzT25NYWluVGhy
ZWFkKCkgY29uc3Q7CiAgICAgV0VCQ09SRV9FWFBPUlQgdm9pZCBzdG9wRGF0YWJhc2VBY3Rpdml0
aWVzT25NYWluVGhyZWFkKCk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVlSURCRGF0YWJhc2UuY3BwIGIvU291cmNl
L1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL1VuaXF1ZUlEQkRhdGFiYXNlLmNwcApp
bmRleCA5OWUxODU4NDgzYjg3ZDNlNGNkNDAyYzk3MjdjOGNhNTNmZjNhNzNmLi44NmNiNzA1YzU1
N2NhNjI4YWIyNTQyY2M0ZTVlNzgyNmNmNWEwMzkzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVlSURCRGF0YWJhc2UuY3BwCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9VbmlxdWVJREJEYXRhYmFzZS5j
cHAKQEAgLTExOTEsNiArMTE5MSwxMyBAQCB2b2lkIFVuaXF1ZUlEQkRhdGFiYXNlOjppbW1lZGlh
dGVDbG9zZSgpCiAgICAgY2xvc2UoKTsKIH0KIAorYm9vbCBVbmlxdWVJREJEYXRhYmFzZTo6aGFz
QWN0aXZlVHJhbnNhY3Rpb25zKCkgY29uc3QKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkp
OworCisgICAgcmV0dXJuICFtX2luUHJvZ3Jlc3NUcmFuc2FjdGlvbnMuaXNFbXB0eSgpOworfQor
CiB2b2lkIFVuaXF1ZUlEQkRhdGFiYXNlOjphYm9ydEFjdGl2ZVRyYW5zYWN0aW9ucygpCiB7CiAg
ICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL01v
ZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9VbmlxdWVJREJEYXRhYmFzZS5oIGIvU291cmNlL1dlYkNv
cmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL1VuaXF1ZUlEQkRhdGFiYXNlLmgKaW5kZXggMjM2
ZTJiYjU1YTM1MzYyODlhYzVmNzU1Yzk4YWMwZjg1YWEzODc5OC4uZGZhZGRiOTdjYzIyNThlN2U0
MGVlYzhmYTIxMDg0NjhiMGNkY2EzNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxl
cy9pbmRleGVkZGIvc2VydmVyL1VuaXF1ZUlEQkRhdGFiYXNlLmgKKysrIGIvU291cmNlL1dlYkNv
cmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL1VuaXF1ZUlEQkRhdGFiYXNlLmgKQEAgLTEwNyw2
ICsxMDcsNyBAQCBwdWJsaWM6CiAgICAgdm9pZCBoYW5kbGVEZWxldGUoSURCQ29ubmVjdGlvblRv
Q2xpZW50JiwgY29uc3QgSURCUmVxdWVzdERhdGEmKTsKICAgICB2b2lkIGltbWVkaWF0ZUNsb3Nl
KCk7CiAKKyAgICBib29sIGhhc0FjdGl2ZVRyYW5zYWN0aW9ucygpIGNvbnN0OwogICAgIHZvaWQg
YWJvcnRBY3RpdmVUcmFuc2FjdGlvbnMoKTsKICAgICBib29sIHRyeUNsb3NlKCk7CiAKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvSW5kZXhlZERCL1dlYklEQlNlcnZl
ci5jcHAgYi9Tb3VyY2UvV2ViS2l0L05ldHdvcmtQcm9jZXNzL0luZGV4ZWREQi9XZWJJREJTZXJ2
ZXIuY3BwCmluZGV4IDU3NTM3N2Q4ZTJmZDNmZTFkNzUwMmQ3MTgwOTUxYjZkZjI2MWUxNTUuLjY4
ZjNlMzA1MDJhZjc0ODE3NGNiYTE2NTRjOTViNWExOGI2NTkxNDQgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvSW5kZXhlZERCL1dlYklEQlNlcnZlci5jcHAKKysrIGIv
U291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9JbmRleGVkREIvV2ViSURCU2VydmVyLmNwcApA
QCAtMTE1LDE3ICsxMTUsMzIgQEAgdm9pZCBXZWJJREJTZXJ2ZXI6OnJlbmFtZU9yaWdpbihjb25z
dCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmIG9sZE9yaWdpbiwgY28KICAgICB9KTsKIH0K
IAotdm9pZCBXZWJJREJTZXJ2ZXI6OnN1c3BlbmQoKSBXVEZfSUdOT1JFU19USFJFQURfU0FGRVRZ
X0FOQUxZU0lTCitib29sIFdlYklEQlNlcnZlcjo6dHJ5U3VzcGVuZChTdXNwZW5kVHlwZSBzdXNw
ZW5kVHlwZSkgV1RGX0lHTk9SRVNfVEhSRUFEX1NBRkVUWV9BTkFMWVNJUwogewogICAgIEFTU0VS
VChSdW5Mb29wOjppc01haW4oKSk7CiAKICAgICBpZiAobV9pc1N1c3BlbmRlZCkKLSAgICAgICAg
cmV0dXJuOworICAgICAgICByZXR1cm4gdHJ1ZTsKIAogICAgIG1faXNTdXNwZW5kZWQgPSB0cnVl
OwogICAgIG1fc2VydmVyTG9jay5sb2NrKCk7Ci0gICAgaWYgKG1fc2VydmVyKQorCisgICAgaWYg
KCFtX3NlcnZlcikKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoc3VzcGVuZFR5cGUg
PT0gU3VzcGVuZFR5cGU6OkltbWVkaWF0ZSkgewogICAgICAgICBtX3NlcnZlci0+c3RvcERhdGFi
YXNlQWN0aXZpdGllc09uTWFpblRocmVhZCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
CisKKyAgICAvLyBTdXNwZW5kIHRvIGF2b2lkIHN0YXJ0aW5nIG5ldyB0cmFuc2FjdGlvbnMgaWYg
dGhlcmUgaXMgbm8gb25nb2luZyB0cmFuc2FjdGlvbi4KKyAgICBpZiAoIW1fc2VydmVyLT5oYXNE
YXRhYmFzZUFjdGl2aXRpZXNPbk1haW5UaHJlYWQoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisK
KyAgICAvLyBSZXN1bWUgdG8gYWxsb3cgb25nb2luZyB0cmFuc2FjdGlvbnMgdG8gYmUgZmluaXNo
ZWQuCisgICAgbV9zZXJ2ZXJMb2NrLnVubG9jaygpOworICAgIG1faXNTdXNwZW5kZWQgPSBmYWxz
ZTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgV2ViSURCU2VydmVyOjpyZXN1bWUoKSBX
VEZfSUdOT1JFU19USFJFQURfU0FGRVRZX0FOQUxZU0lTCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
S2l0L05ldHdvcmtQcm9jZXNzL0luZGV4ZWREQi9XZWJJREJTZXJ2ZXIuaCBiL1NvdXJjZS9XZWJL
aXQvTmV0d29ya1Byb2Nlc3MvSW5kZXhlZERCL1dlYklEQlNlcnZlci5oCmluZGV4IDY5NzA3YjI3
Mzk3ZGJlNTZlNDZmNzVjMzFmMzE5MDU5NmUwYjQxOTguLjMzZTBkM2M2YjMxMDZmZTI1ODFlMzFk
YTcwOTA4YWJlNjQ3MDVmNWYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nl
c3MvSW5kZXhlZERCL1dlYklEQlNlcnZlci5oCisrKyBiL1NvdXJjZS9XZWJLaXQvTmV0d29ya1By
b2Nlc3MvSW5kZXhlZERCL1dlYklEQlNlcnZlci5oCkBAIC01Miw3ICs1Miw4IEBAIHB1YmxpYzoK
ICAgICB2b2lkIGNsb3NlQW5kRGVsZXRlRGF0YWJhc2VzRm9yT3JpZ2lucyhjb25zdCBWZWN0b3I8
V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhPiYsIENvbXBsZXRpb25IYW5kbGVyPHZvaWQoKT4m
JiBjYWxsYmFjayk7CiAgICAgdm9pZCByZW5hbWVPcmlnaW4oY29uc3QgV2ViQ29yZTo6U2VjdXJp
dHlPcmlnaW5EYXRhJiwgY29uc3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJiwgQ29tcGxl
dGlvbkhhbmRsZXI8dm9pZCgpPiYmKTsKIAotICAgIHZvaWQgc3VzcGVuZCgpOworICAgIGVudW0g
Y2xhc3MgU3VzcGVuZFR5cGUgOiBib29sIHsgSWZQb3NzaWJsZSwgSW1tZWRpYXRlIH07CisgICAg
Ym9vbCB0cnlTdXNwZW5kKFN1c3BlbmRUeXBlKTsKICAgICB2b2lkIHJlc3VtZSgpOwogCiAgICAg
Ly8gTWVzc2FnZSBoYW5kbGVycy4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvTmV0d29ya1By
b2Nlc3MvTmV0d29ya1Byb2Nlc3MuY3BwIGIvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9O
ZXR3b3JrUHJvY2Vzcy5jcHAKaW5kZXggYWVhMmZhYTU4YTE1ODFmMDBiZjU2YmNlZWVkMTc3YjQ0
YTQzNjA5Ni4uODZjYjA4Y2MxZGI3M2JmNmRkMzZiNTFlMjA5YjlmMDdmZmFiZjU2NiAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9OZXR3b3JrUHJvY2Vzcy5jcHAKKysr
IGIvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9OZXR3b3JrUHJvY2Vzcy5jcHAKQEAgLTIy
MTEsMTQgKzIyMTEsNDIgQEAgdm9pZCBOZXR3b3JrUHJvY2Vzczo6cHJvY2Vzc1dpbGxTdXNwZW5k
SW1taW5lbnRseUZvclRlc3RpbmdTeW5jKENvbXBsZXRpb25IYW5kbGUKICAgICBwcmVwYXJlVG9T
dXNwZW5kKHRydWUsIFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpKTsKIH0KIAordm9pZCBOZXR3
b3JrUHJvY2Vzczo6c3VzcGVuZElEQlNlcnZlcnMoYm9vbCBpc1N1c3BlbnNpb25JbW1pbmVudCkK
K3sKKyAgICBtX3Nob3VsZFN1c3BlbmRJREJTZXJ2ZXJzID0gdHJ1ZTsKKworICAgIGlmIChpc1N1
c3BlbnNpb25JbW1pbmVudCkgeworICAgICAgICBmb3IgKGF1dG8mIHNlcnZlciA6IG1fd2ViSURC
U2VydmVycy52YWx1ZXMoKSkKKyAgICAgICAgICAgIHNlcnZlci0+dHJ5U3VzcGVuZChXZWJJREJT
ZXJ2ZXI6OlN1c3BlbmRUeXBlOjpJbW1lZGlhdGUpOworICAgICAgICByZXR1cm47CisgICAgfQor
ICAgIAorICAgIGJvb2wgYWxsU3VzcGVuZGVkID0gdHJ1ZTsKKyAgICBhdXRvIHR5cGUgPSBpc1N1
c3BlbnNpb25JbW1pbmVudCA/IFdlYklEQlNlcnZlcjo6U3VzcGVuZFR5cGU6OkltbWVkaWF0ZSA6
IFdlYklEQlNlcnZlcjo6U3VzcGVuZFR5cGU6OklmUG9zc2libGU7CisgICAgZm9yIChhdXRvJiBz
ZXJ2ZXIgOiBtX3dlYklEQlNlcnZlcnMudmFsdWVzKCkpCisgICAgICAgIGFsbFN1c3BlbmRlZCAm
PSBzZXJ2ZXItPnRyeVN1c3BlbmQodHlwZSk7CisKKyAgICBpZiAoYWxsU3VzcGVuZGVkKQorICAg
ICAgICByZXR1cm47CisKKyAgICBSdW5Mb29wOjptYWluKCkuZGlzcGF0Y2hBZnRlcig1X3MsIFt0
aGlzLCB3ZWFrVGhpcyA9IG1ha2VXZWFrUHRyKCp0aGlzKV0geworICAgICAgICBpZiAoIXdlYWtU
aGlzKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmICghbV9zaG91bGRTdXNwZW5k
SURCU2VydmVycykKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGZvciAo
YXV0byYgc2VydmVyIDogbV93ZWJJREJTZXJ2ZXJzLnZhbHVlcygpKQorICAgICAgICAgICAgc2Vy
dmVyLT50cnlTdXNwZW5kKFdlYklEQlNlcnZlcjo6U3VzcGVuZFR5cGU6OkltbWVkaWF0ZSk7Cisg
ICAgfSk7Cit9CisKIHZvaWQgTmV0d29ya1Byb2Nlc3M6OnByZXBhcmVUb1N1c3BlbmQoYm9vbCBp
c1N1c3BlbnNpb25JbW1pbmVudCwgQ29tcGxldGlvbkhhbmRsZXI8dm9pZCgpPiYmIGNvbXBsZXRp
b25IYW5kbGVyKQogewogICAgIFJFTEVBU0VfTE9HKFByb2Nlc3NTdXNwZW5zaW9uLCAiJXAgLSBO
ZXR3b3JrUHJvY2Vzczo6cHJlcGFyZVRvU3VzcGVuZCgpLCBpc1N1c3BlbnNpb25JbW1pbmVudD0l
ZCIsIHRoaXMsIGlzU3VzcGVuc2lvbkltbWluZW50KTsKIAogI2lmIFBMQVRGT1JNKElPU19GQU1J
TFkpCi0gICAgZm9yIChhdXRvJiBzZXJ2ZXIgOiBtX3dlYklEQlNlcnZlcnMudmFsdWVzKCkpCi0g
ICAgICAgIHNlcnZlci0+c3VzcGVuZCgpOwotICAgIG1fc2hvdWxkU3VzcGVuZElEQlNlcnZlciA9
IHRydWU7CisgICAgc3VzcGVuZElEQlNlcnZlcnMoaXNTdXNwZW5zaW9uSW1taW5lbnQpOwogI2Vu
ZGlmCiAKICAgICBsb3dNZW1vcnlIYW5kbGVyKENyaXRpY2FsOjpZZXMpOwpAQCAtMjI4Miw3ICsy
MzEwLDcgQEAgdm9pZCBOZXR3b3JrUHJvY2Vzczo6cmVzdW1lKCkKICNpZiBQTEFURk9STShJT1Nf
RkFNSUxZKQogICAgIGZvciAoYXV0byYgc2VydmVyIDogbV93ZWJJREJTZXJ2ZXJzLnZhbHVlcygp
KQogICAgICAgICBzZXJ2ZXItPnJlc3VtZSgpOwotICAgIG1fc2hvdWxkU3VzcGVuZElEQlNlcnZl
ciA9IGZhbHNlOworICAgIG1fc2hvdWxkU3VzcGVuZElEQlNlcnZlcnMgPSBmYWxzZTsKICNlbmRp
ZgogCiAgICAgbV9zdG9yYWdlTWFuYWdlclNldC0+cmVzdW1lKCk7CkBAIC0yMzQ3LDggKzIzNzUs
OCBAQCBSZWY8V2ViSURCU2VydmVyPiBOZXR3b3JrUHJvY2Vzczo6Y3JlYXRlV2ViSURCU2VydmVy
KFBBTDo6U2Vzc2lvbklEIHNlc3Npb25JRCkKICAgICB9OwogCiAgICAgYXV0byByZXN1bHQgPSBX
ZWJJREJTZXJ2ZXI6OmNyZWF0ZShzZXNzaW9uSUQsIHBhdGgsIFdURk1vdmUoc3BhY2VSZXF1ZXN0
ZXIpKTsKLSAgICBpZiAobV9zaG91bGRTdXNwZW5kSURCU2VydmVyKQotICAgICAgICByZXN1bHQt
PnN1c3BlbmQoKTsKKyAgICBpZiAobV9zaG91bGRTdXNwZW5kSURCU2VydmVycykKKyAgICAgICAg
cmVzdWx0LT50cnlTdXNwZW5kKFdlYklEQlNlcnZlcjo6U3VzcGVuZFR5cGU6OkltbWVkaWF0ZSk7
CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9OZXR3
b3JrUHJvY2Vzcy9OZXR3b3JrUHJvY2Vzcy5oIGIvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vz
cy9OZXR3b3JrUHJvY2Vzcy5oCmluZGV4IDc5NDgwOTdhYTNkYzM4NmEyZmQ0MWZhZDYyM2IzY2Vj
ZGY4ZDdlNGEuLmZmYjZlZjYxMTdlMzcyMTM5ZTNiNGVlYzE0Y2RmMzY2OTQ3NzYwZWQgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvTmV0d29ya1Byb2Nlc3MuaAorKysg
Yi9Tb3VyY2UvV2ViS2l0L05ldHdvcmtQcm9jZXNzL05ldHdvcmtQcm9jZXNzLmgKQEAgLTQ4Niw2
ICs0ODYsNyBAQCBwcml2YXRlOgogICAgIFJlZjxXZWJJREJTZXJ2ZXI+IGNyZWF0ZVdlYklEQlNl
cnZlcihQQUw6OlNlc3Npb25JRCk7CiAgICAgdm9pZCBzZXRTZXNzaW9uU3RvcmFnZVF1b3RhTWFu
YWdlcklEQlJvb3RQYXRoKFBBTDo6U2Vzc2lvbklELCBjb25zdCBTdHJpbmcmIGlkYlJvb3RQYXRo
KTsKICAgICB2b2lkIHJlbW92ZVdlYklEQlNlcnZlcklmUG9zc2libGUoUEFMOjpTZXNzaW9uSUQp
OworICAgIHZvaWQgc3VzcGVuZElEQlNlcnZlcnMoYm9vbCBpc1N1c3BlbnNpb25JbW1pbmVudCk7
CiAKICNpZiBFTkFCTEUoU0VSVklDRV9XT1JLRVIpCiAgICAgdm9pZCBkaWRDcmVhdGVXb3JrZXJD
b250ZXh0UHJvY2Vzc0Nvbm5lY3Rpb24oY29uc3QgSVBDOjpBdHRhY2htZW50Jik7CkBAIC01ODMs
NyArNTg0LDcgQEAgcHJpdmF0ZToKIAogICAgIEhhc2hNYXA8UEFMOjpTZXNzaW9uSUQsIFN0cmlu
Zz4gbV9pZGJEYXRhYmFzZVBhdGhzOwogICAgIEhhc2hNYXA8UEFMOjpTZXNzaW9uSUQsIFJlZlB0
cjxXZWJJREJTZXJ2ZXI+PiBtX3dlYklEQlNlcnZlcnM7Ci0gICAgYm9vbCBtX3Nob3VsZFN1c3Bl
bmRJREJTZXJ2ZXIgeyBmYWxzZSB9OworICAgIGJvb2wgbV9zaG91bGRTdXNwZW5kSURCU2VydmVy
cyB7IGZhbHNlIH07CiAgICAgCiAjaWYgRU5BQkxFKFNFUlZJQ0VfV09SS0VSKQogICAgIHN0cnVj
dCBTZXJ2aWNlV29ya2VySW5mbyB7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L05ldHdvcmtQ
cm9jZXNzL2lvcy9OZXR3b3JrUHJvY2Vzc0lPUy5tbSBiL1NvdXJjZS9XZWJLaXQvTmV0d29ya1By
b2Nlc3MvaW9zL05ldHdvcmtQcm9jZXNzSU9TLm1tCmluZGV4IDY0OTRiNWE3OThhZjY5MDgxZWEz
ZDdhNWEzY2M1NWVjODI3ZTRiZjQuLjE4OTgyMmFmMzYyM2Y5NmJmN2E1OGRlNmU5NzNhYWNjYmZl
MDA2YjcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvaW9zL05ldHdv
cmtQcm9jZXNzSU9TLm1tCisrKyBiL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvaW9zL05l
dHdvcmtQcm9jZXNzSU9TLm1tCkBAIC0xMTMsNiArMTEzLDE4IEBAIHZvaWQgTmV0d29ya1Byb2Nl
c3M6OnNldElzSG9sZGluZ0xvY2tlZEZpbGVzKGJvb2wgaXNIb2xkaW5nTG9ja2VkRmlsZXMpCiAg
ICAgLy8gV2Ugc3luY2hyb25vdXNseSB0YWtlIGEgcHJvY2VzcyBhc3NlcnRpb24gd2hlbiBiZWdp
bm5pbmcgYSBTUUxpdGUgdHJhbnNhY3Rpb24gc28gdGhhdCB3ZSBkb24ndCBnZXQgc3VzcGVuZGVk
CiAgICAgLy8gd2hpbGUgaG9sZGluZyBhIGxvY2tlZCBmaWxlLiBXZSB3b3VsZCBnZXQga2lsbGVk
IGlmIHN1c3BlbmRlZCB3aGlsZSBob2xkaW5nIGxvY2tlZCBmaWxlcy4KICAgICBtX2hvbGRpbmdM
b2NrZWRGaWxlQXNzZXJ0aW9uID0gUHJvY2Vzc0Fzc2VydGlvbjo6Y3JlYXRlKGdldEN1cnJlbnRQ
cm9jZXNzSUQoKSwgIk5ldHdvcmsgUHJvY2VzcyBpcyBob2xkaW5nIGxvY2tlZCBmaWxlcyJfcywg
UHJvY2Vzc0Fzc2VydGlvblR5cGU6OkZpbmlzaFRhc2tVbmludGVycnVwdGFibGUsIFByb2Nlc3NB
c3NlcnRpb246Ok1vZGU6OlN5bmMpOworICAgIG1faG9sZGluZ0xvY2tlZEZpbGVBc3NlcnRpb24t
PnNldFByZXBhcmVGb3JJbnZhbGlkYXRpb25IYW5kbGVyKFt0aGlzLCB3ZWFrVGhpcyA9IG1ha2VX
ZWFrUHRyKCp0aGlzKV0oKSBtdXRhYmxlIHsKKyAgICAgICAgY2FsbE9uTWFpblJ1bkxvb3AoW3Ro
aXMsIHdlYWtUaGlzID0gV1RGTW92ZSh3ZWFrVGhpcyldKCkgeworICAgICAgICAgICAgaWYgKCF3
ZWFrVGhpcykKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgICAgIGlmICghbV9z
aG91bGRTdXNwZW5kSURCU2VydmVycykKKyAgICAgICAgICAgICAgICByZXR1cm47CisKKyAgICAg
ICAgICAgIGZvciAoYXV0byYgc2VydmVyIDogbV93ZWJJREJTZXJ2ZXJzLnZhbHVlcygpKQorICAg
ICAgICAgICAgICAgIHNlcnZlci0+dHJ5U3VzcGVuZChXZWJJREJTZXJ2ZXI6OlN1c3BlbmRUeXBl
OjpJbW1lZGlhdGUpOworICAgICAgICB9KTsKKyAgICB9KTsKIH0KIAogfSAvLyBuYW1lc3BhY2Ug
V2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9Qcm9jZXNzQXNzZXJ0
aW9uLmggYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9Qcm9jZXNzQXNzZXJ0aW9uLmgKaW5kZXgg
NzEzZmI5ZmJhYjE4NmZhNzdmMWQwMGNjNTUyMzY5MGM0Y2U1MDNjOC4uY2I3ZGRlZDZmZWQ4ZmE1
Y2NmM2E5MDZjMzM4NDBlN2Y5Y2ExYjMzNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9VSVBy
b2Nlc3MvUHJvY2Vzc0Fzc2VydGlvbi5oCisrKyBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1By
b2Nlc3NBc3NlcnRpb24uaApAQCAtNzIsNiArNzIsNyBAQCBwdWJsaWM6CiAgICAgfQogICAgIHZp
cnR1YWwgflByb2Nlc3NBc3NlcnRpb24oKTsKIAorICAgIHZvaWQgc2V0UHJlcGFyZUZvckludmFs
aWRhdGlvbkhhbmRsZXIoRnVuY3Rpb248dm9pZCgpPiYmIGhhbmRsZXIpIHsgbV9wcmVwYXJlRm9y
SW52YWxpZGF0aW9uSGFuZGxlciA9IFdURk1vdmUoaGFuZGxlcik7IH0KICAgICB2b2lkIHNldElu
dmFsaWRhdGlvbkhhbmRsZXIoRnVuY3Rpb248dm9pZCgpPiYmIGhhbmRsZXIpIHsgbV9pbnZhbGlk
YXRpb25IYW5kbGVyID0gV1RGTW92ZShoYW5kbGVyKTsgfQogCiAgICAgUHJvY2Vzc0Fzc2VydGlv
blR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1fYXNzZXJ0aW9uVHlwZTsgfQpAQCAtODYsNiAr
ODcsNyBAQCBwcm90ZWN0ZWQ6CiAgICAgdm9pZCBhY3F1aXJlU3luYygpOwogCiAjaWYgUExBVEZP
Uk0oSU9TX0ZBTUlMWSkKKyAgICB2b2lkIHByb2Nlc3NBc3NlcnRpb25XaWxsQmVJbnZhbGlkYXRl
ZCgpOwogICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzQXNzZXJ0aW9uV2FzSW52YWxpZGF0ZWQoKTsK
ICNlbmRpZgogCkBAIC05OCw2ICsxMDAsNyBAQCBwcml2YXRlOgogICAgIFJldGFpblB0cjxXS1JC
U0Fzc2VydGlvbkRlbGVnYXRlPiBtX2RlbGVnYXRlOwogICAgIGJvb2wgbV93YXNJbnZhbGlkYXRl
ZCB7IGZhbHNlIH07CiAjZW5kaWYKKyAgICBGdW5jdGlvbjx2b2lkKCk+IG1fcHJlcGFyZUZvcklu
dmFsaWRhdGlvbkhhbmRsZXI7CiAgICAgRnVuY3Rpb248dm9pZCgpPiBtX2ludmFsaWRhdGlvbkhh
bmRsZXI7CiB9OwogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9pb3MvUHJv
Y2Vzc0Fzc2VydGlvbklPUy5tbSBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL2lvcy9Qcm9jZXNz
QXNzZXJ0aW9uSU9TLm1tCmluZGV4IGYzNTExNmQxYTBhNGMzZmI5OTU0Mjc0ZWE1NTZlMzlkYzVk
NmYxYzUuLjQ5ZmJiMTAzMGFlYjkzNTBjNWEzNGFmMWZjMTRlOTRkMjc3M2ZlZDQgMTAwNjQ0Ci0t
LSBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL2lvcy9Qcm9jZXNzQXNzZXJ0aW9uSU9TLm1tCisr
KyBiL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL2lvcy9Qcm9jZXNzQXNzZXJ0aW9uSU9TLm1tCkBA
IC0yNTUsMTIgKzI1NSwxNCBAQCBzdGF0aWMgYm9vbCBwcm9jZXNzSGFzQWN0aXZlUnVuVGltZUxp
bWl0YXRpb24oKQogdHlwZWRlZiB2b2lkKF5SQlNBc3NlcnRpb25JbnZhbGlkYXRpb25DYWxsYmFj
a1R5cGUpKCk7CiAKIEBpbnRlcmZhY2UgV0tSQlNBc3NlcnRpb25EZWxlZ2F0ZSA6IE5TT2JqZWN0
PFJCU0Fzc2VydGlvbk9ic2VydmluZz4KK0Bwcm9wZXJ0eSAoY29weSkgUkJTQXNzZXJ0aW9uSW52
YWxpZGF0aW9uQ2FsbGJhY2tUeXBlIHByZXBhcmVGb3JJbnZhbGlkYXRpb25DYWxsYmFjazsKIEBw
cm9wZXJ0eSAoY29weSkgUkJTQXNzZXJ0aW9uSW52YWxpZGF0aW9uQ2FsbGJhY2tUeXBlIGludmFs
aWRhdGlvbkNhbGxiYWNrOwogQGVuZAogCiBAaW1wbGVtZW50YXRpb24gV0tSQlNBc3NlcnRpb25E
ZWxlZ2F0ZQogLSAodm9pZClkZWFsbG9jCiB7CisgICAgW19wcmVwYXJlRm9ySW52YWxpZGF0aW9u
Q2FsbGJhY2sgcmVsZWFzZV07CiAgICAgW19pbnZhbGlkYXRpb25DYWxsYmFjayByZWxlYXNlXTsK
ICAgICBbc3VwZXIgZGVhbGxvY107CiB9CkBAIC0yNjgsNiArMjcwLDggQEAgdHlwZWRlZiB2b2lk
KF5SQlNBc3NlcnRpb25JbnZhbGlkYXRpb25DYWxsYmFja1R5cGUpKCk7CiAtICh2b2lkKWFzc2Vy
dGlvbldpbGxJbnZhbGlkYXRlOihSQlNBc3NlcnRpb24gKilhc3NlcnRpb24KIHsKICAgICBSRUxF
QVNFX0xPRyhQcm9jZXNzU3VzcGVuc2lvbiwgIiVwIC0gV0tSQlNBc3NlcnRpb25EZWxlZ2F0ZTog
YXNzZXJ0aW9uV2lsbEludmFsaWRhdGUiLCBzZWxmKTsKKworICAgIF9wcmVwYXJlRm9ySW52YWxp
ZGF0aW9uQ2FsbGJhY2soKTsKIH0KIAogLSAodm9pZClhc3NlcnRpb246KFJCU0Fzc2VydGlvbiAq
KWFzc2VydGlvbiBkaWRJbnZhbGlkYXRlV2l0aEVycm9yOihOU0Vycm9yICopZXJyb3IKQEAgLTMz
OSw2ICszNDMsMTAgQEAgUHJvY2Vzc0Fzc2VydGlvbjo6UHJvY2Vzc0Fzc2VydGlvbihwaWRfdCBw
aWQsIGNvbnN0IFN0cmluZyYgcmVhc29uLCBQcm9jZXNzQXNzZXIKICAgICAgICAgUkVMRUFTRV9M
T0coUHJvY2Vzc1N1c3BlbnNpb24sICIlcCAtIFByb2Nlc3NBc3NlcnRpb246IFJCUyAle3B1Ymxp
Y31AIGFzc2VydGlvbiBmb3IgcHJvY2VzcyB3aXRoIFBJRD0lZCB3YXMgaW52YWxpZGF0ZWQiLCB0
aGlzLCBydW5uaW5nQm9hcmRBc3NlcnRpb25OYW1lLCBwaWQpOwogICAgICAgICBwcm9jZXNzQXNz
ZXJ0aW9uV2FzSW52YWxpZGF0ZWQoKTsKICAgICB9OworICAgIG1fZGVsZWdhdGUuZ2V0KCkucHJl
cGFyZUZvckludmFsaWRhdGlvbkNhbGxiYWNrID0gXnsKKyAgICAgICAgUkVMRUFTRV9MT0coUHJv
Y2Vzc1N1c3BlbnNpb24sICIlcCAtIFByb2Nlc3NBc3NlcnRpb24oKSBSQlMgJXtwdWJsaWN9QCBh
c3NlcnRpb24gZm9yIHByb2Nlc3Mgd2l0aCBQSUQ9JWQgd2lsbCBiZSBpbnZhbGlkYXRlZCIsIHRo
aXMsIHJ1bm5pbmdCb2FyZEFzc2VydGlvbk5hbWUsIHBpZCk7CisgICAgICAgIHByb2Nlc3NBc3Nl
cnRpb25XaWxsQmVJbnZhbGlkYXRlZCgpOworICAgIH07CiB9CiAKIHZvaWQgUHJvY2Vzc0Fzc2Vy
dGlvbjo6YWNxdWlyZUFzeW5jKENvbXBsZXRpb25IYW5kbGVyPHZvaWQoKT4mJiBjb21wbGV0aW9u
SGFuZGxlcikKQEAgLTM3MywxMiArMzgxLDIxIEBAIFByb2Nlc3NBc3NlcnRpb246On5Qcm9jZXNz
QXNzZXJ0aW9uKCkKIAogICAgIGlmIChtX3Jic0Fzc2VydGlvbikgewogICAgICAgICBtX2RlbGVn
YXRlLmdldCgpLmludmFsaWRhdGlvbkNhbGxiYWNrID0gbmlsOworICAgICAgICBtX2RlbGVnYXRl
LmdldCgpLnByZXBhcmVGb3JJbnZhbGlkYXRpb25DYWxsYmFjayA9IG5pbDsKICAgICAgICAgW21f
cmJzQXNzZXJ0aW9uIHJlbW92ZU9ic2VydmVyOm1fZGVsZWdhdGUuZ2V0KCldOwogICAgICAgICBt
X2RlbGVnYXRlID0gbmlsOwogICAgICAgICBbbV9yYnNBc3NlcnRpb24gaW52YWxpZGF0ZV07CiAg
ICAgfQogfQogCit2b2lkIFByb2Nlc3NBc3NlcnRpb246OnByb2Nlc3NBc3NlcnRpb25XaWxsQmVJ
bnZhbGlkYXRlZCgpCit7CisgICAgUkVMRUFTRV9MT0coUHJvY2Vzc1N1c3BlbnNpb24sICIlcCAt
IFByb2Nlc3NBc3NlcnRpb246OnByb2Nlc3NBc3NlcnRpb25XaWxsQmVJbnZhbGlkYXRlZCgpIFBJ
RD0lZCIsIHRoaXMsIG1fcGlkKTsKKworICAgIGlmIChtX3ByZXBhcmVGb3JJbnZhbGlkYXRpb25I
YW5kbGVyKQorICAgICAgICBtX3ByZXBhcmVGb3JJbnZhbGlkYXRpb25IYW5kbGVyKCk7Cit9CisK
IHZvaWQgUHJvY2Vzc0Fzc2VydGlvbjo6cHJvY2Vzc0Fzc2VydGlvbldhc0ludmFsaWRhdGVkKCkK
IHsKICAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>433623</attachid>
            <date>2021-07-15 14:04:05 -0700</date>
            <delta_ts>2021-07-15 14:49:55 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-227778-20210715140404.patch</filename>
            <type>text/plain</type>
            <size>17172</size>
            <attacher name="Sihui Liu">sihui_liu</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjc5OTAzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMzljMmIyNWVlNmE3YzNh
ZmE2NTZlNzc2MDNmY2YxZjIyNjQ5OWFhNC4uMGYxNjNmNjlkNjVhNjAxNWQ2NDQ0OTRmMjRjNDVi
YzJjNmNjNzhlMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE4IEBACisyMDIxLTA3LTE1ICBTaWh1
aSBMaXUgIDxzaWh1aV9saXVAYXBwbGUuY29tPgorCisgICAgICAgIERvIG5vdCBhYm9ydCBvbmdv
aW5nIElEQiB0cmFuc2FjdGlvbiBzeW5jaHJvbm91c2x5IG9uIG5vbi1pbW1pbmVudCBQcmVwYXJl
VG9TdXNwZW5kIG1lc3NhZ2UKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTIyNzc3OAorICAgICAgICA8cmRhcjovL3Byb2JsZW0vODA2MDI1NTc+CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBNb2R1bGVzL2lu
ZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OklEQlNlcnZl
cjo6SURCU2VydmVyOjpoYXNEYXRhYmFzZUFjdGl2aXRpZXNPbk1haW5UaHJlYWQgY29uc3QpOgor
ICAgICAgICAqIE1vZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9JREJTZXJ2ZXIuaDoKKyAgICAgICAg
KiBNb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVlSURCRGF0YWJhc2UuY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6SURCU2VydmVyOjpVbmlxdWVJREJEYXRhYmFzZTo6aGFzQWN0aXZlVHJhbnNh
Y3Rpb25zIGNvbnN0KToKKyAgICAgICAgKiBNb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVl
SURCRGF0YWJhc2UuaDoKKwogMjAyMS0wNy0xMyAgQWxleCBDaHJpc3RlbnNlbiAgPGFjaHJpc3Rl
bnNlbkB3ZWJraXQub3JnPgogCiAgICAgICAgID40SyBSZWZlcmVyIHNob3VsZCBoYXZlIHRhaWxp
bmcgLwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cgYi9Tb3VyY2UvV2ViS2l0
L0NoYW5nZUxvZwppbmRleCA4MmM4Y2M4OGZmMDI1NTEyZWFmNTQ3YmVmYjA1MDBiYWY2ZGRjMGMx
Li5mMGE4MzczNGEwY2NkZjYyMTNlZjRjZjQwMmUzOWI1ZDkxYzU5YmRmIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViS2l0L0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViS2l0L0NoYW5nZUxvZwpAQCAt
MSwzICsxLDM4IEBACisyMDIxLTA3LTE1ICBTaWh1aSBMaXUgIDxzaWh1aV9saXVAYXBwbGUuY29t
PgorCisgICAgICAgIERvIG5vdCBhYm9ydCBvbmdvaW5nIElEQiB0cmFuc2FjdGlvbiBzeW5jaHJv
bm91c2x5IG9uIG5vbi1pbW1pbmVudCBQcmVwYXJlVG9TdXNwZW5kIG1lc3NhZ2UKKyAgICAgICAg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIyNzc3OAorICAgICAgICA8
cmRhcjovL3Byb2JsZW0vODA2MDI1NTc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChP
T1BTISkuCisKKyAgICAgICAgQ3VycmVudGx5IHdlIGFib3J0IElEQiB0cmFuc2FjdGlvbnMgYW5k
IHN1c3BlbmQgSURCIHRocmVhZCBzeW5jaHJvbm91c2x5IGluIE5ldHdvcmtQcm9jZXNzOjpwcmVw
YXJlVG9TdXNwZW5kLgorICAgICAgICBBcyBVSSBwcm9jZXNzIGRvZXMgbm90IGtub3cgdGhlIGZp
bGUgbG9ja2luZyBzdGF0ZSBpbiBuZXR3b3JrIHByb2Nlc3Mgbm93IChiZWNhdXNlIG5ldHdvcmsg
cHJvY2VzcyB0cmFja3MKKyAgICAgICAgdGhlIHN0YXRlIGFuZCB0YWtlcyB0aGUgYXNzZXJ0aW9u
IGJ5IGl0c2VsZiksIFVJIHByb2Nlc3MgbWF5IHNlbmQgbm9uLWltbWluZW50IFByZXBhcmVUb1N1
c3BlbmQgbW9yZSBvZnRlbiwKKyAgICAgICAgYW5kIHdlIG1heSBhYm9ydCB0cmFuc2FjdGlvbiB0
b28gYWdncmVzc2l2ZWx5IChlLmcuIFVJIHByb2Nlc3MgbWF5IHNlbmQgdGhlIG1lc3NhZ2UgYXMg
c29vbiBhcyBhcHAgaXMgaW4gCisgICAgICAgIGJhY2tncm91bmQpLiBUbyBmaXggdGhlIHBvc3Np
YmxlIHJlZ3Jlc3Npb24gb2YgZGF0YSBsb3NzLCB3ZSB3aWxsIHNjaGVkdWxlIGEgdGFzayB3aXRo
IDVzIGRlbGF5IHRvIGFib3J0CisgICAgICAgIHRyYW5zYWN0aW9ucyBhZnRlciBwcmVwYXJlVG9T
dXNwZW5kLiBJbiB0aGlzIGNhc2UsIHRyYW5zYWN0aW9ucyBmaW5pc2hlZCBpbiA1cyBjYW4gaGF2
ZSBhIGNoYW5jZSB0byBmaW5pc2guCisKKyAgICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9JbmRleGVk
REIvV2ViSURCU2VydmVyLmNwcDoKKyAgICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9JbmRleGVkREIv
V2ViSURCU2VydmVyLmg6CisgICAgICAgICogTmV0d29ya1Byb2Nlc3MvTmV0d29ya1Byb2Nlc3Mu
Y3BwOgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrUHJvY2Vzczo6c3VzcGVuZElEQlNlcnZlcnMp
OgorICAgICAgICAoV2ViS2l0OjpOZXR3b3JrUHJvY2Vzczo6cHJlcGFyZVRvU3VzcGVuZCk6Cisg
ICAgICAgIChXZWJLaXQ6Ok5ldHdvcmtQcm9jZXNzOjpyZXN1bWUpOgorICAgICAgICAoV2ViS2l0
OjpOZXR3b3JrUHJvY2Vzczo6Y3JlYXRlV2ViSURCU2VydmVyKToKKyAgICAgICAgKiBOZXR3b3Jr
UHJvY2Vzcy9OZXR3b3JrUHJvY2Vzcy5oOgorICAgICAgICAqIE5ldHdvcmtQcm9jZXNzL2lvcy9O
ZXR3b3JrUHJvY2Vzc0lPUy5tbToKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya1Byb2Nlc3M6OnNl
dElzSG9sZGluZ0xvY2tlZEZpbGVzKToKKyAgICAgICAgKiBVSVByb2Nlc3MvUHJvY2Vzc0Fzc2Vy
dGlvbi5oOgorICAgICAgICAoV2ViS2l0OjpQcm9jZXNzQXNzZXJ0aW9uOjpzZXRQcmVwYXJlRm9y
SW52YWxpZGF0aW9uSGFuZGxlcik6CisgICAgICAgICogVUlQcm9jZXNzL2lvcy9Qcm9jZXNzQXNz
ZXJ0aW9uSU9TLm1tOgorICAgICAgICAoLVtXS1JCU0Fzc2VydGlvbkRlbGVnYXRlIGRlYWxsb2Nd
KToKKyAgICAgICAgKC1bV0tSQlNBc3NlcnRpb25EZWxlZ2F0ZSBhc3NlcnRpb25XaWxsSW52YWxp
ZGF0ZTpdKTogVGhpcyB3aWxsIGNhbGxlZCBzZWNvbmRzIGJlZm9yZSBhc3NlcnRpb24gaXMgdGlt
ZWQgb3V0LCBzbworICAgICAgICB3ZSBzaG91bGQgaGF2ZSBlbm91Z2ggdGltZSB0byBjbGVhbiB1
cC4KKyAgICAgICAgKFdlYktpdDo6UHJvY2Vzc0Fzc2VydGlvbjo6UHJvY2Vzc0Fzc2VydGlvbik6
CisgICAgICAgIChXZWJLaXQ6OlByb2Nlc3NBc3NlcnRpb246On5Qcm9jZXNzQXNzZXJ0aW9uKToK
KyAgICAgICAgKFdlYktpdDo6UHJvY2Vzc0Fzc2VydGlvbjo6cHJvY2Vzc0Fzc2VydGlvbldpbGxC
ZUludmFsaWRhdGVkKToKKwogMjAyMS0wNy0xMyAgV2Vuc29uIEhzaWVoICA8d2Vuc29uX2hzaWVo
QGFwcGxlLmNvbT4KIAogICAgICAgICBbV0syXSBQdXNoIE9TIHN0YXRlIGR1bXBpbmcgbG9naWMg
ZG93biBmcm9tIFdlYlByb2Nlc3MgdG8gQXV4aWxpYXJ5UHJvY2VzcwpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL0lEQlNlcnZlci5jcHAgYi9Tb3Vy
Y2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmNwcAppbmRleCA0
OWQ4NzY2MmZjYjNhNWFlMjNmMmE3YWI1MjdlNjU1N2MzMjZlYTNiLi5lYTNmNmQ2YTIxZGVmZTNi
ZjVhNzIwZTU0MDYwNTA1Nzc3Zjg1ZjYxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1
bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9N
b2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmNwcApAQCAtNzY3LDYgKzc2NywyMiBA
QCB2b2lkIElEQlNlcnZlcjo6dXBncmFkZUZpbGVzSWZOZWNlc3NhcnkoKQogICAgICAgICBGaWxl
U3lzdGVtOjptYWtlQWxsRGlyZWN0b3JpZXMobmV3VmVyc2lvbkRpcmVjdG9yeSk7CiB9CiAKK2Jv
b2wgSURCU2VydmVyOjpoYXNEYXRhYmFzZUFjdGl2aXRpZXNPbk1haW5UaHJlYWQoKSBjb25zdAor
eworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgQVNTRVJUKG1fbG9jay5pc0hlbGQo
KSk7CisKKyAgICBpZiAobV9zZXNzaW9uSUQuaXNFcGhlbWVyYWwoKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgZm9yIChhdXRvJiBkYXRhYmFzZSA6IG1fdW5pcXVlSURCRGF0YWJhc2VN
YXAudmFsdWVzKCkpIHsKKyAgICAgICAgaWYgKCFkYXRhYmFzZS0+aWRlbnRpZmllcigpLmlzVHJh
bnNpZW50KCkgJiYgZGF0YWJhc2UtPmhhc0FjdGl2ZVRyYW5zYWN0aW9ucygpKQorICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHJldHVybiBmYWxzZTsKK30KKwogdm9p
ZCBJREJTZXJ2ZXI6OnN0b3BEYXRhYmFzZUFjdGl2aXRpZXNPbk1haW5UaHJlYWQoKQogewogICAg
IEFTU0VSVChpc01haW5UaHJlYWQoKSk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1
bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmggYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVz
L2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmgKaW5kZXggYmM3MjMwYzgwY2ZiNjQ2YWZlYzhk
ZTU5MGMzMDM1NDY3MGY0YzdlZC4uNjA4ZDdmYWI5ZWNkNzY1ZDk3ZjBjMDgzMzNmZjRkYjU0MDAx
MDdiMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVy
L0lEQlNlcnZlci5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL3NlcnZl
ci9JREJTZXJ2ZXIuaApAQCAtMTA3LDYgKzEwNyw3IEBAIHB1YmxpYzoKICAgICBTdG9yYWdlUXVv
dGFNYW5hZ2VyOjpEZWNpc2lvbiByZXF1ZXN0U3BhY2UoY29uc3QgQ2xpZW50T3JpZ2luJiwgdWlu
dDY0X3QgdGFza1NpemUpOwogICAgIFdFQkNPUkVfRVhQT1JUIHN0YXRpYyB1aW50NjRfdCBkaXNr
VXNhZ2UoY29uc3QgU3RyaW5nJiByb290RGlyZWN0b3J5LCBjb25zdCBDbGllbnRPcmlnaW4mKTsK
IAorICAgIFdFQkNPUkVfRVhQT1JUIGJvb2wgaGFzRGF0YWJhc2VBY3Rpdml0aWVzT25NYWluVGhy
ZWFkKCkgY29uc3Q7CiAgICAgV0VCQ09SRV9FWFBPUlQgdm9pZCBzdG9wRGF0YWJhc2VBY3Rpdml0
aWVzT25NYWluVGhyZWFkKCk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVlSURCRGF0YWJhc2UuY3BwIGIvU291cmNl
L1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL1VuaXF1ZUlEQkRhdGFiYXNlLmNwcApp
bmRleCA5OWUxODU4NDgzYjg3ZDNlNGNkNDAyYzk3MjdjOGNhNTNmZjNhNzNmLi44NmNiNzA1YzU1
N2NhNjI4YWIyNTQyY2M0ZTVlNzgyNmNmNWEwMzkzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVlSURCRGF0YWJhc2UuY3BwCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9VbmlxdWVJREJEYXRhYmFzZS5j
cHAKQEAgLTExOTEsNiArMTE5MSwxMyBAQCB2b2lkIFVuaXF1ZUlEQkRhdGFiYXNlOjppbW1lZGlh
dGVDbG9zZSgpCiAgICAgY2xvc2UoKTsKIH0KIAorYm9vbCBVbmlxdWVJREJEYXRhYmFzZTo6aGFz
QWN0aXZlVHJhbnNhY3Rpb25zKCkgY29uc3QKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkp
OworCisgICAgcmV0dXJuICFtX2luUHJvZ3Jlc3NUcmFuc2FjdGlvbnMuaXNFbXB0eSgpOworfQor
CiB2b2lkIFVuaXF1ZUlEQkRhdGFiYXNlOjphYm9ydEFjdGl2ZVRyYW5zYWN0aW9ucygpCiB7CiAg
ICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL01v
ZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9VbmlxdWVJREJEYXRhYmFzZS5oIGIvU291cmNlL1dlYkNv
cmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL1VuaXF1ZUlEQkRhdGFiYXNlLmgKaW5kZXggMjM2
ZTJiYjU1YTM1MzYyODlhYzVmNzU1Yzk4YWMwZjg1YWEzODc5OC4uZGZhZGRiOTdjYzIyNThlN2U0
MGVlYzhmYTIxMDg0NjhiMGNkY2EzNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxl
cy9pbmRleGVkZGIvc2VydmVyL1VuaXF1ZUlEQkRhdGFiYXNlLmgKKysrIGIvU291cmNlL1dlYkNv
cmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL1VuaXF1ZUlEQkRhdGFiYXNlLmgKQEAgLTEwNyw2
ICsxMDcsNyBAQCBwdWJsaWM6CiAgICAgdm9pZCBoYW5kbGVEZWxldGUoSURCQ29ubmVjdGlvblRv
Q2xpZW50JiwgY29uc3QgSURCUmVxdWVzdERhdGEmKTsKICAgICB2b2lkIGltbWVkaWF0ZUNsb3Nl
KCk7CiAKKyAgICBib29sIGhhc0FjdGl2ZVRyYW5zYWN0aW9ucygpIGNvbnN0OwogICAgIHZvaWQg
YWJvcnRBY3RpdmVUcmFuc2FjdGlvbnMoKTsKICAgICBib29sIHRyeUNsb3NlKCk7CiAKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvSW5kZXhlZERCL1dlYklEQlNlcnZl
ci5jcHAgYi9Tb3VyY2UvV2ViS2l0L05ldHdvcmtQcm9jZXNzL0luZGV4ZWREQi9XZWJJREJTZXJ2
ZXIuY3BwCmluZGV4IDU3NTM3N2Q4ZTJmZDNmZTFkNzUwMmQ3MTgwOTUxYjZkZjI2MWUxNTUuLjY4
ZjNlMzA1MDJhZjc0ODE3NGNiYTE2NTRjOTViNWExOGI2NTkxNDQgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvSW5kZXhlZERCL1dlYklEQlNlcnZlci5jcHAKKysrIGIv
U291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9JbmRleGVkREIvV2ViSURCU2VydmVyLmNwcApA
QCAtMTE1LDE3ICsxMTUsMzIgQEAgdm9pZCBXZWJJREJTZXJ2ZXI6OnJlbmFtZU9yaWdpbihjb25z
dCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmIG9sZE9yaWdpbiwgY28KICAgICB9KTsKIH0K
IAotdm9pZCBXZWJJREJTZXJ2ZXI6OnN1c3BlbmQoKSBXVEZfSUdOT1JFU19USFJFQURfU0FGRVRZ
X0FOQUxZU0lTCitib29sIFdlYklEQlNlcnZlcjo6dHJ5U3VzcGVuZChTdXNwZW5kVHlwZSBzdXNw
ZW5kVHlwZSkgV1RGX0lHTk9SRVNfVEhSRUFEX1NBRkVUWV9BTkFMWVNJUwogewogICAgIEFTU0VS
VChSdW5Mb29wOjppc01haW4oKSk7CiAKICAgICBpZiAobV9pc1N1c3BlbmRlZCkKLSAgICAgICAg
cmV0dXJuOworICAgICAgICByZXR1cm4gdHJ1ZTsKIAogICAgIG1faXNTdXNwZW5kZWQgPSB0cnVl
OwogICAgIG1fc2VydmVyTG9jay5sb2NrKCk7Ci0gICAgaWYgKG1fc2VydmVyKQorCisgICAgaWYg
KCFtX3NlcnZlcikKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoc3VzcGVuZFR5cGUg
PT0gU3VzcGVuZFR5cGU6OkltbWVkaWF0ZSkgewogICAgICAgICBtX3NlcnZlci0+c3RvcERhdGFi
YXNlQWN0aXZpdGllc09uTWFpblRocmVhZCgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
CisKKyAgICAvLyBTdXNwZW5kIHRvIGF2b2lkIHN0YXJ0aW5nIG5ldyB0cmFuc2FjdGlvbnMgaWYg
dGhlcmUgaXMgbm8gb25nb2luZyB0cmFuc2FjdGlvbi4KKyAgICBpZiAoIW1fc2VydmVyLT5oYXNE
YXRhYmFzZUFjdGl2aXRpZXNPbk1haW5UaHJlYWQoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisK
KyAgICAvLyBSZXN1bWUgdG8gYWxsb3cgb25nb2luZyB0cmFuc2FjdGlvbnMgdG8gYmUgZmluaXNo
ZWQuCisgICAgbV9zZXJ2ZXJMb2NrLnVubG9jaygpOworICAgIG1faXNTdXNwZW5kZWQgPSBmYWxz
ZTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgV2ViSURCU2VydmVyOjpyZXN1bWUoKSBX
VEZfSUdOT1JFU19USFJFQURfU0FGRVRZX0FOQUxZU0lTCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
S2l0L05ldHdvcmtQcm9jZXNzL0luZGV4ZWREQi9XZWJJREJTZXJ2ZXIuaCBiL1NvdXJjZS9XZWJL
aXQvTmV0d29ya1Byb2Nlc3MvSW5kZXhlZERCL1dlYklEQlNlcnZlci5oCmluZGV4IDY5NzA3YjI3
Mzk3ZGJlNTZlNDZmNzVjMzFmMzE5MDU5NmUwYjQxOTguLjMzZTBkM2M2YjMxMDZmZTI1ODFlMzFk
YTcwOTA4YWJlNjQ3MDVmNWYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nl
c3MvSW5kZXhlZERCL1dlYklEQlNlcnZlci5oCisrKyBiL1NvdXJjZS9XZWJLaXQvTmV0d29ya1By
b2Nlc3MvSW5kZXhlZERCL1dlYklEQlNlcnZlci5oCkBAIC01Miw3ICs1Miw4IEBAIHB1YmxpYzoK
ICAgICB2b2lkIGNsb3NlQW5kRGVsZXRlRGF0YWJhc2VzRm9yT3JpZ2lucyhjb25zdCBWZWN0b3I8
V2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhPiYsIENvbXBsZXRpb25IYW5kbGVyPHZvaWQoKT4m
JiBjYWxsYmFjayk7CiAgICAgdm9pZCByZW5hbWVPcmlnaW4oY29uc3QgV2ViQ29yZTo6U2VjdXJp
dHlPcmlnaW5EYXRhJiwgY29uc3QgV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW5EYXRhJiwgQ29tcGxl
dGlvbkhhbmRsZXI8dm9pZCgpPiYmKTsKIAotICAgIHZvaWQgc3VzcGVuZCgpOworICAgIGVudW0g
Y2xhc3MgU3VzcGVuZFR5cGUgOiBib29sIHsgSWZQb3NzaWJsZSwgSW1tZWRpYXRlIH07CisgICAg
Ym9vbCB0cnlTdXNwZW5kKFN1c3BlbmRUeXBlKTsKICAgICB2b2lkIHJlc3VtZSgpOwogCiAgICAg
Ly8gTWVzc2FnZSBoYW5kbGVycy4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvTmV0d29ya1By
b2Nlc3MvTmV0d29ya1Byb2Nlc3MuY3BwIGIvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9O
ZXR3b3JrUHJvY2Vzcy5jcHAKaW5kZXggYWVhMmZhYTU4YTE1ODFmMDBiZjU2YmNlZWVkMTc3YjQ0
YTQzNjA5Ni4uZWI5NjdkYmUzNjVkMDQxOGMyYWI2YzJlMmNmNjE0OTRlM2Q3ZjJmNCAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9OZXR3b3JrUHJvY2Vzcy5jcHAKKysr
IGIvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9OZXR3b3JrUHJvY2Vzcy5jcHAKQEAgLTIy
MTEsMTQgKzIyMTEsMzYgQEAgdm9pZCBOZXR3b3JrUHJvY2Vzczo6cHJvY2Vzc1dpbGxTdXNwZW5k
SW1taW5lbnRseUZvclRlc3RpbmdTeW5jKENvbXBsZXRpb25IYW5kbGUKICAgICBwcmVwYXJlVG9T
dXNwZW5kKHRydWUsIFdURk1vdmUoY29tcGxldGlvbkhhbmRsZXIpKTsKIH0KIAordm9pZCBOZXR3
b3JrUHJvY2Vzczo6c3VzcGVuZElEQlNlcnZlcnMoYm9vbCBpc1N1c3BlbnNpb25JbW1pbmVudCkK
K3sKKyAgICBtX3Nob3VsZFN1c3BlbmRJREJTZXJ2ZXJzID0gdHJ1ZTsKKworICAgIGJvb2wgYWxs
U3VzcGVuZGVkID0gdHJ1ZTsKKyAgICBhdXRvIHR5cGUgPSBpc1N1c3BlbnNpb25JbW1pbmVudCA/
IFdlYklEQlNlcnZlcjo6U3VzcGVuZFR5cGU6OkltbWVkaWF0ZSA6IFdlYklEQlNlcnZlcjo6U3Vz
cGVuZFR5cGU6OklmUG9zc2libGU7CisgICAgZm9yIChhdXRvJiBzZXJ2ZXIgOiBtX3dlYklEQlNl
cnZlcnMudmFsdWVzKCkpCisgICAgICAgIGFsbFN1c3BlbmRlZCAmPSBzZXJ2ZXItPnRyeVN1c3Bl
bmQodHlwZSk7CisKKyAgICBpZiAoYWxsU3VzcGVuZGVkKQorICAgICAgICByZXR1cm47CisKKyAg
ICBSdW5Mb29wOjptYWluKCkuZGlzcGF0Y2hBZnRlcig1X3MsIFt0aGlzLCB3ZWFrVGhpcyA9IG1h
a2VXZWFrUHRyKCp0aGlzKV0geworICAgICAgICBpZiAoIXdlYWtUaGlzKQorICAgICAgICAgICAg
cmV0dXJuOworCisgICAgICAgIGlmICghbV9zaG91bGRTdXNwZW5kSURCU2VydmVycykKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGZvciAoYXV0byYgc2VydmVyIDogbV93
ZWJJREJTZXJ2ZXJzLnZhbHVlcygpKQorICAgICAgICAgICAgc2VydmVyLT50cnlTdXNwZW5kKFdl
YklEQlNlcnZlcjo6U3VzcGVuZFR5cGU6OkltbWVkaWF0ZSk7CisgICAgfSk7Cit9CisKIHZvaWQg
TmV0d29ya1Byb2Nlc3M6OnByZXBhcmVUb1N1c3BlbmQoYm9vbCBpc1N1c3BlbnNpb25JbW1pbmVu
dCwgQ29tcGxldGlvbkhhbmRsZXI8dm9pZCgpPiYmIGNvbXBsZXRpb25IYW5kbGVyKQogewogICAg
IFJFTEVBU0VfTE9HKFByb2Nlc3NTdXNwZW5zaW9uLCAiJXAgLSBOZXR3b3JrUHJvY2Vzczo6cHJl
cGFyZVRvU3VzcGVuZCgpLCBpc1N1c3BlbnNpb25JbW1pbmVudD0lZCIsIHRoaXMsIGlzU3VzcGVu
c2lvbkltbWluZW50KTsKIAogI2lmIFBMQVRGT1JNKElPU19GQU1JTFkpCi0gICAgZm9yIChhdXRv
JiBzZXJ2ZXIgOiBtX3dlYklEQlNlcnZlcnMudmFsdWVzKCkpCi0gICAgICAgIHNlcnZlci0+c3Vz
cGVuZCgpOwotICAgIG1fc2hvdWxkU3VzcGVuZElEQlNlcnZlciA9IHRydWU7CisgICAgc3VzcGVu
ZElEQlNlcnZlcnMoaXNTdXNwZW5zaW9uSW1taW5lbnQpOwogI2VuZGlmCiAKICAgICBsb3dNZW1v
cnlIYW5kbGVyKENyaXRpY2FsOjpZZXMpOwpAQCAtMjI4Miw3ICsyMzA0LDcgQEAgdm9pZCBOZXR3
b3JrUHJvY2Vzczo6cmVzdW1lKCkKICNpZiBQTEFURk9STShJT1NfRkFNSUxZKQogICAgIGZvciAo
YXV0byYgc2VydmVyIDogbV93ZWJJREJTZXJ2ZXJzLnZhbHVlcygpKQogICAgICAgICBzZXJ2ZXIt
PnJlc3VtZSgpOwotICAgIG1fc2hvdWxkU3VzcGVuZElEQlNlcnZlciA9IGZhbHNlOworICAgIG1f
c2hvdWxkU3VzcGVuZElEQlNlcnZlcnMgPSBmYWxzZTsKICNlbmRpZgogCiAgICAgbV9zdG9yYWdl
TWFuYWdlclNldC0+cmVzdW1lKCk7CkBAIC0yMzQ3LDggKzIzNjksOCBAQCBSZWY8V2ViSURCU2Vy
dmVyPiBOZXR3b3JrUHJvY2Vzczo6Y3JlYXRlV2ViSURCU2VydmVyKFBBTDo6U2Vzc2lvbklEIHNl
c3Npb25JRCkKICAgICB9OwogCiAgICAgYXV0byByZXN1bHQgPSBXZWJJREJTZXJ2ZXI6OmNyZWF0
ZShzZXNzaW9uSUQsIHBhdGgsIFdURk1vdmUoc3BhY2VSZXF1ZXN0ZXIpKTsKLSAgICBpZiAobV9z
aG91bGRTdXNwZW5kSURCU2VydmVyKQotICAgICAgICByZXN1bHQtPnN1c3BlbmQoKTsKKyAgICBp
ZiAobV9zaG91bGRTdXNwZW5kSURCU2VydmVycykKKyAgICAgICAgcmVzdWx0LT50cnlTdXNwZW5k
KFdlYklEQlNlcnZlcjo6U3VzcGVuZFR5cGU6OkltbWVkaWF0ZSk7CiAgICAgcmV0dXJuIHJlc3Vs
dDsKIH0KIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9OZXR3b3Jr
UHJvY2Vzcy5oIGIvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9OZXR3b3JrUHJvY2Vzcy5o
CmluZGV4IDc5NDgwOTdhYTNkYzM4NmEyZmQ0MWZhZDYyM2IzY2VjZGY4ZDdlNGEuLmZmYjZlZjYx
MTdlMzcyMTM5ZTNiNGVlYzE0Y2RmMzY2OTQ3NzYwZWQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJL
aXQvTmV0d29ya1Byb2Nlc3MvTmV0d29ya1Byb2Nlc3MuaAorKysgYi9Tb3VyY2UvV2ViS2l0L05l
dHdvcmtQcm9jZXNzL05ldHdvcmtQcm9jZXNzLmgKQEAgLTQ4Niw2ICs0ODYsNyBAQCBwcml2YXRl
OgogICAgIFJlZjxXZWJJREJTZXJ2ZXI+IGNyZWF0ZVdlYklEQlNlcnZlcihQQUw6OlNlc3Npb25J
RCk7CiAgICAgdm9pZCBzZXRTZXNzaW9uU3RvcmFnZVF1b3RhTWFuYWdlcklEQlJvb3RQYXRoKFBB
TDo6U2Vzc2lvbklELCBjb25zdCBTdHJpbmcmIGlkYlJvb3RQYXRoKTsKICAgICB2b2lkIHJlbW92
ZVdlYklEQlNlcnZlcklmUG9zc2libGUoUEFMOjpTZXNzaW9uSUQpOworICAgIHZvaWQgc3VzcGVu
ZElEQlNlcnZlcnMoYm9vbCBpc1N1c3BlbnNpb25JbW1pbmVudCk7CiAKICNpZiBFTkFCTEUoU0VS
VklDRV9XT1JLRVIpCiAgICAgdm9pZCBkaWRDcmVhdGVXb3JrZXJDb250ZXh0UHJvY2Vzc0Nvbm5l
Y3Rpb24oY29uc3QgSVBDOjpBdHRhY2htZW50Jik7CkBAIC01ODMsNyArNTg0LDcgQEAgcHJpdmF0
ZToKIAogICAgIEhhc2hNYXA8UEFMOjpTZXNzaW9uSUQsIFN0cmluZz4gbV9pZGJEYXRhYmFzZVBh
dGhzOwogICAgIEhhc2hNYXA8UEFMOjpTZXNzaW9uSUQsIFJlZlB0cjxXZWJJREJTZXJ2ZXI+PiBt
X3dlYklEQlNlcnZlcnM7Ci0gICAgYm9vbCBtX3Nob3VsZFN1c3BlbmRJREJTZXJ2ZXIgeyBmYWxz
ZSB9OworICAgIGJvb2wgbV9zaG91bGRTdXNwZW5kSURCU2VydmVycyB7IGZhbHNlIH07CiAgICAg
CiAjaWYgRU5BQkxFKFNFUlZJQ0VfV09SS0VSKQogICAgIHN0cnVjdCBTZXJ2aWNlV29ya2VySW5m
byB7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L05ldHdvcmtQcm9jZXNzL2lvcy9OZXR3b3Jr
UHJvY2Vzc0lPUy5tbSBiL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvaW9zL05ldHdvcmtQ
cm9jZXNzSU9TLm1tCmluZGV4IDY0OTRiNWE3OThhZjY5MDgxZWEzZDdhNWEzY2M1NWVjODI3ZTRi
ZjQuLmY4MDFmNTI5ZTk4OWU1MmIzOGIwMjQyMjMyOTRmN2UyZjBjYmU1ZGMgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvaW9zL05ldHdvcmtQcm9jZXNzSU9TLm1tCisr
KyBiL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvaW9zL05ldHdvcmtQcm9jZXNzSU9TLm1t
CkBAIC0xMTMsNiArMTEzLDE3IEBAIHZvaWQgTmV0d29ya1Byb2Nlc3M6OnNldElzSG9sZGluZ0xv
Y2tlZEZpbGVzKGJvb2wgaXNIb2xkaW5nTG9ja2VkRmlsZXMpCiAgICAgLy8gV2Ugc3luY2hyb25v
dXNseSB0YWtlIGEgcHJvY2VzcyBhc3NlcnRpb24gd2hlbiBiZWdpbm5pbmcgYSBTUUxpdGUgdHJh
bnNhY3Rpb24gc28gdGhhdCB3ZSBkb24ndCBnZXQgc3VzcGVuZGVkCiAgICAgLy8gd2hpbGUgaG9s
ZGluZyBhIGxvY2tlZCBmaWxlLiBXZSB3b3VsZCBnZXQga2lsbGVkIGlmIHN1c3BlbmRlZCB3aGls
ZSBob2xkaW5nIGxvY2tlZCBmaWxlcy4KICAgICBtX2hvbGRpbmdMb2NrZWRGaWxlQXNzZXJ0aW9u
ID0gUHJvY2Vzc0Fzc2VydGlvbjo6Y3JlYXRlKGdldEN1cnJlbnRQcm9jZXNzSUQoKSwgIk5ldHdv
cmsgUHJvY2VzcyBpcyBob2xkaW5nIGxvY2tlZCBmaWxlcyJfcywgUHJvY2Vzc0Fzc2VydGlvblR5
cGU6OkZpbmlzaFRhc2tVbmludGVycnVwdGFibGUsIFByb2Nlc3NBc3NlcnRpb246Ok1vZGU6OlN5
bmMpOworICAgIG1faG9sZGluZ0xvY2tlZEZpbGVBc3NlcnRpb24tPnNldFByZXBhcmVGb3JJbnZh
bGlkYXRpb25IYW5kbGVyKFt0aGlzLCB3ZWFrVGhpcyA9IG1ha2VXZWFrUHRyKCp0aGlzKV0oKSBt
dXRhYmxlIHsKKyAgICAgICAgQVNTRVJUKGlzTWFpblJ1bkxvb3AoKSk7CisgICAgICAgIGlmICgh
d2Vha1RoaXMpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKCFtX3Nob3VsZFN1
c3BlbmRJREJTZXJ2ZXJzKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGZvciAoYXV0
byYgc2VydmVyIDogbV93ZWJJREJTZXJ2ZXJzLnZhbHVlcygpKQorICAgICAgICAgICAgc2VydmVy
LT50cnlTdXNwZW5kKFdlYklEQlNlcnZlcjo6U3VzcGVuZFR5cGU6OkltbWVkaWF0ZSk7CisgICAg
fSk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktp
dC9VSVByb2Nlc3MvUHJvY2Vzc0Fzc2VydGlvbi5oIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3Mv
UHJvY2Vzc0Fzc2VydGlvbi5oCmluZGV4IDcxM2ZiOWZiYWIxODZmYTc3ZjFkMDBjYzU1MjM2OTBj
NGNlNTAzYzguLmNiN2RkZWQ2ZmVkOGZhNWNjZjNhOTA2YzMzODQwZTdmOWNhMWIzMzQgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1Byb2Nlc3NBc3NlcnRpb24uaAorKysgYi9T
b3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9Qcm9jZXNzQXNzZXJ0aW9uLmgKQEAgLTcyLDYgKzcyLDcg
QEAgcHVibGljOgogICAgIH0KICAgICB2aXJ0dWFsIH5Qcm9jZXNzQXNzZXJ0aW9uKCk7CiAKKyAg
ICB2b2lkIHNldFByZXBhcmVGb3JJbnZhbGlkYXRpb25IYW5kbGVyKEZ1bmN0aW9uPHZvaWQoKT4m
JiBoYW5kbGVyKSB7IG1fcHJlcGFyZUZvckludmFsaWRhdGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGhh
bmRsZXIpOyB9CiAgICAgdm9pZCBzZXRJbnZhbGlkYXRpb25IYW5kbGVyKEZ1bmN0aW9uPHZvaWQo
KT4mJiBoYW5kbGVyKSB7IG1faW52YWxpZGF0aW9uSGFuZGxlciA9IFdURk1vdmUoaGFuZGxlcik7
IH0KIAogICAgIFByb2Nlc3NBc3NlcnRpb25UeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiBtX2Fz
c2VydGlvblR5cGU7IH0KQEAgLTg2LDYgKzg3LDcgQEAgcHJvdGVjdGVkOgogICAgIHZvaWQgYWNx
dWlyZVN5bmMoKTsKIAogI2lmIFBMQVRGT1JNKElPU19GQU1JTFkpCisgICAgdm9pZCBwcm9jZXNz
QXNzZXJ0aW9uV2lsbEJlSW52YWxpZGF0ZWQoKTsKICAgICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0Fz
c2VydGlvbldhc0ludmFsaWRhdGVkKCk7CiAjZW5kaWYKIApAQCAtOTgsNiArMTAwLDcgQEAgcHJp
dmF0ZToKICAgICBSZXRhaW5QdHI8V0tSQlNBc3NlcnRpb25EZWxlZ2F0ZT4gbV9kZWxlZ2F0ZTsK
ICAgICBib29sIG1fd2FzSW52YWxpZGF0ZWQgeyBmYWxzZSB9OwogI2VuZGlmCisgICAgRnVuY3Rp
b248dm9pZCgpPiBtX3ByZXBhcmVGb3JJbnZhbGlkYXRpb25IYW5kbGVyOwogICAgIEZ1bmN0aW9u
PHZvaWQoKT4gbV9pbnZhbGlkYXRpb25IYW5kbGVyOwogfTsKIApkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYktpdC9VSVByb2Nlc3MvaW9zL1Byb2Nlc3NBc3NlcnRpb25JT1MubW0gYi9Tb3VyY2UvV2Vi
S2l0L1VJUHJvY2Vzcy9pb3MvUHJvY2Vzc0Fzc2VydGlvbklPUy5tbQppbmRleCBmMzUxMTZkMWEw
YTRjM2ZiOTk1NDI3NGVhNTU2ZTM5ZGM1ZDZmMWM1Li42NWE2NWQzODNlMTU0YzBlYTQ3OGQxMTMw
OGNjZjE2MWUxMDNjOTI0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9pb3Mv
UHJvY2Vzc0Fzc2VydGlvbklPUy5tbQorKysgYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9pb3Mv
UHJvY2Vzc0Fzc2VydGlvbklPUy5tbQpAQCAtMjU1LDEyICsyNTUsMTQgQEAgc3RhdGljIGJvb2wg
cHJvY2Vzc0hhc0FjdGl2ZVJ1blRpbWVMaW1pdGF0aW9uKCkKIHR5cGVkZWYgdm9pZCheUkJTQXNz
ZXJ0aW9uSW52YWxpZGF0aW9uQ2FsbGJhY2tUeXBlKSgpOwogCiBAaW50ZXJmYWNlIFdLUkJTQXNz
ZXJ0aW9uRGVsZWdhdGUgOiBOU09iamVjdDxSQlNBc3NlcnRpb25PYnNlcnZpbmc+CitAcHJvcGVy
dHkgKGNvcHkpIFJCU0Fzc2VydGlvbkludmFsaWRhdGlvbkNhbGxiYWNrVHlwZSBwcmVwYXJlRm9y
SW52YWxpZGF0aW9uQ2FsbGJhY2s7CiBAcHJvcGVydHkgKGNvcHkpIFJCU0Fzc2VydGlvbkludmFs
aWRhdGlvbkNhbGxiYWNrVHlwZSBpbnZhbGlkYXRpb25DYWxsYmFjazsKIEBlbmQKIAogQGltcGxl
bWVudGF0aW9uIFdLUkJTQXNzZXJ0aW9uRGVsZWdhdGUKIC0gKHZvaWQpZGVhbGxvYwogeworICAg
IFtfcHJlcGFyZUZvckludmFsaWRhdGlvbkNhbGxiYWNrIHJlbGVhc2VdOwogICAgIFtfaW52YWxp
ZGF0aW9uQ2FsbGJhY2sgcmVsZWFzZV07CiAgICAgW3N1cGVyIGRlYWxsb2NdOwogfQpAQCAtMjY4
LDYgKzI3MCwxMiBAQCB0eXBlZGVmIHZvaWQoXlJCU0Fzc2VydGlvbkludmFsaWRhdGlvbkNhbGxi
YWNrVHlwZSkoKTsKIC0gKHZvaWQpYXNzZXJ0aW9uV2lsbEludmFsaWRhdGU6KFJCU0Fzc2VydGlv
biAqKWFzc2VydGlvbgogewogICAgIFJFTEVBU0VfTE9HKFByb2Nlc3NTdXNwZW5zaW9uLCAiJXAg
LSBXS1JCU0Fzc2VydGlvbkRlbGVnYXRlOiBhc3NlcnRpb25XaWxsSW52YWxpZGF0ZSIsIHNlbGYp
OworCisgICAgUnVuTG9vcDo6bWFpbigpLmRpc3BhdGNoKFt3ZWFrU2VsZiA9IFdlYWtPYmpDUHRy
PFdLUkJTQXNzZXJ0aW9uRGVsZWdhdGU+KHNlbGYpXSB7CisgICAgICAgIGF1dG8gc3Ryb25nU2Vs
ZiA9IHdlYWtTZWxmLmdldCgpOworICAgICAgICBpZiAoc3Ryb25nU2VsZiAmJiBzdHJvbmdTZWxm
LmdldCgpLnByZXBhcmVGb3JJbnZhbGlkYXRpb25DYWxsYmFjaykKKyAgICAgICAgICAgIHN0cm9u
Z1NlbGYuZ2V0KCkucHJlcGFyZUZvckludmFsaWRhdGlvbkNhbGxiYWNrKCk7CisgICAgfSk7CiB9
CiAKIC0gKHZvaWQpYXNzZXJ0aW9uOihSQlNBc3NlcnRpb24gKilhc3NlcnRpb24gZGlkSW52YWxp
ZGF0ZVdpdGhFcnJvcjooTlNFcnJvciAqKWVycm9yCkBAIC0zMzksNiArMzQ3LDEwIEBAIFByb2Nl
c3NBc3NlcnRpb246OlByb2Nlc3NBc3NlcnRpb24ocGlkX3QgcGlkLCBjb25zdCBTdHJpbmcmIHJl
YXNvbiwgUHJvY2Vzc0Fzc2VyCiAgICAgICAgIFJFTEVBU0VfTE9HKFByb2Nlc3NTdXNwZW5zaW9u
LCAiJXAgLSBQcm9jZXNzQXNzZXJ0aW9uOiBSQlMgJXtwdWJsaWN9QCBhc3NlcnRpb24gZm9yIHBy
b2Nlc3Mgd2l0aCBQSUQ9JWQgd2FzIGludmFsaWRhdGVkIiwgdGhpcywgcnVubmluZ0JvYXJkQXNz
ZXJ0aW9uTmFtZSwgcGlkKTsKICAgICAgICAgcHJvY2Vzc0Fzc2VydGlvbldhc0ludmFsaWRhdGVk
KCk7CiAgICAgfTsKKyAgICBtX2RlbGVnYXRlLmdldCgpLnByZXBhcmVGb3JJbnZhbGlkYXRpb25D
YWxsYmFjayA9IF57CisgICAgICAgIFJFTEVBU0VfTE9HKFByb2Nlc3NTdXNwZW5zaW9uLCAiJXAg
LSBQcm9jZXNzQXNzZXJ0aW9uKCkgUkJTICV7cHVibGljfUAgYXNzZXJ0aW9uIGZvciBwcm9jZXNz
IHdpdGggUElEPSVkIHdpbGwgYmUgaW52YWxpZGF0ZWQiLCB0aGlzLCBydW5uaW5nQm9hcmRBc3Nl
cnRpb25OYW1lLCBwaWQpOworICAgICAgICBwcm9jZXNzQXNzZXJ0aW9uV2lsbEJlSW52YWxpZGF0
ZWQoKTsKKyAgICB9OwogfQogCiB2b2lkIFByb2Nlc3NBc3NlcnRpb246OmFjcXVpcmVBc3luYyhD
b21wbGV0aW9uSGFuZGxlcjx2b2lkKCk+JiYgY29tcGxldGlvbkhhbmRsZXIpCkBAIC0zNzMsMTIg
KzM4NSwyMSBAQCBQcm9jZXNzQXNzZXJ0aW9uOjp+UHJvY2Vzc0Fzc2VydGlvbigpCiAKICAgICBp
ZiAobV9yYnNBc3NlcnRpb24pIHsKICAgICAgICAgbV9kZWxlZ2F0ZS5nZXQoKS5pbnZhbGlkYXRp
b25DYWxsYmFjayA9IG5pbDsKKyAgICAgICAgbV9kZWxlZ2F0ZS5nZXQoKS5wcmVwYXJlRm9ySW52
YWxpZGF0aW9uQ2FsbGJhY2sgPSBuaWw7CiAgICAgICAgIFttX3Jic0Fzc2VydGlvbiByZW1vdmVP
YnNlcnZlcjptX2RlbGVnYXRlLmdldCgpXTsKICAgICAgICAgbV9kZWxlZ2F0ZSA9IG5pbDsKICAg
ICAgICAgW21fcmJzQXNzZXJ0aW9uIGludmFsaWRhdGVdOwogICAgIH0KIH0KIAordm9pZCBQcm9j
ZXNzQXNzZXJ0aW9uOjpwcm9jZXNzQXNzZXJ0aW9uV2lsbEJlSW52YWxpZGF0ZWQoKQoreworICAg
IFJFTEVBU0VfTE9HKFByb2Nlc3NTdXNwZW5zaW9uLCAiJXAgLSBQcm9jZXNzQXNzZXJ0aW9uOjpw
cm9jZXNzQXNzZXJ0aW9uV2lsbEJlSW52YWxpZGF0ZWQoKSBQSUQ9JWQiLCB0aGlzLCBtX3BpZCk7
CisKKyAgICBpZiAobV9wcmVwYXJlRm9ySW52YWxpZGF0aW9uSGFuZGxlcikKKyAgICAgICAgbV9w
cmVwYXJlRm9ySW52YWxpZGF0aW9uSGFuZGxlcigpOworfQorCiB2b2lkIFByb2Nlc3NBc3NlcnRp
b246OnByb2Nlc3NBc3NlcnRpb25XYXNJbnZhbGlkYXRlZCgpCiB7CiAgICAgQVNTRVJUKFJ1bkxv
b3A6OmlzTWFpbigpKTsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>433624</attachid>
            <date>2021-07-15 14:49:57 -0700</date>
            <delta_ts>2021-07-15 15:45:32 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-227778-20210715144956.patch</filename>
            <type>text/plain</type>
            <size>17570</size>
            <attacher name="Sihui Liu">sihui_liu</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjc5OTAzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMzljMmIyNWVlNmE3YzNh
ZmE2NTZlNzc2MDNmY2YxZjIyNjQ5OWFhNC4uOWMxZDFjZTc1YjA2MjFkZDZjZjY4ZjBhOGFhMzUy
ZWYxZTVjNzU1YiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE4IEBACisyMDIxLTA3LTE1ICBTaWh1
aSBMaXUgIDxzaWh1aV9saXVAYXBwbGUuY29tPgorCisgICAgICAgIERvIG5vdCBhYm9ydCBvbmdv
aW5nIElEQiB0cmFuc2FjdGlvbiBzeW5jaHJvbm91c2x5IG9uIG5vbi1pbW1pbmVudCBQcmVwYXJl
VG9TdXNwZW5kIG1lc3NhZ2UKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTIyNzc3OAorICAgICAgICA8cmRhcjovL3Byb2JsZW0vODA2MDI1NTc+CisKKyAg
ICAgICAgUmV2aWV3ZWQgYnkgQ2hyaXMgRHVtZXouCisKKyAgICAgICAgKiBNb2R1bGVzL2luZGV4
ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OklEQlNlcnZlcjo6
SURCU2VydmVyOjpoYXNEYXRhYmFzZUFjdGl2aXRpZXNPbk1haW5UaHJlYWQgY29uc3QpOgorICAg
ICAgICAqIE1vZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9JREJTZXJ2ZXIuaDoKKyAgICAgICAgKiBN
b2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVlSURCRGF0YWJhc2UuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6SURCU2VydmVyOjpVbmlxdWVJREJEYXRhYmFzZTo6aGFzQWN0aXZlVHJhbnNhY3Rp
b25zIGNvbnN0KToKKyAgICAgICAgKiBNb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVlSURC
RGF0YWJhc2UuaDoKKwogMjAyMS0wNy0xMyAgQWxleCBDaHJpc3RlbnNlbiAgPGFjaHJpc3RlbnNl
bkB3ZWJraXQub3JnPgogCiAgICAgICAgID40SyBSZWZlcmVyIHNob3VsZCBoYXZlIHRhaWxpbmcg
LwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9DaGFuZ2VMb2cgYi9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZwppbmRleCA4MmM4Y2M4OGZmMDI1NTEyZWFmNTQ3YmVmYjA1MDBiYWY2ZGRjMGMxLi5i
OWU1MmIzMmNiMGJiNjJlYTdjMjEwYmFlMGM4ZTM4NzIzM2MxYTY2IDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViS2l0L0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViS2l0L0NoYW5nZUxvZwpAQCAtMSwz
ICsxLDM3IEBACisyMDIxLTA3LTE1ICBTaWh1aSBMaXUgIDxzaWh1aV9saXVAYXBwbGUuY29tPgor
CisgICAgICAgIERvIG5vdCBhYm9ydCBvbmdvaW5nIElEQiB0cmFuc2FjdGlvbiBzeW5jaHJvbm91
c2x5IG9uIG5vbi1pbW1pbmVudCBQcmVwYXJlVG9TdXNwZW5kIG1lc3NhZ2UKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIyNzc3OAorICAgICAgICA8cmRh
cjovL3Byb2JsZW0vODA2MDI1NTc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgQ2hyaXMgRHVtZXou
CisKKyAgICAgICAgQ3VycmVudGx5IHdlIGFib3J0IElEQiB0cmFuc2FjdGlvbnMgYW5kIHN1c3Bl
bmQgSURCIHRocmVhZCBzeW5jaHJvbm91c2x5IGluIE5ldHdvcmtQcm9jZXNzOjpwcmVwYXJlVG9T
dXNwZW5kLgorICAgICAgICBBcyBVSSBwcm9jZXNzIGRvZXMgbm90IGtub3cgdGhlIGZpbGUgbG9j
a2luZyBzdGF0ZSBpbiBuZXR3b3JrIHByb2Nlc3Mgbm93IChiZWNhdXNlIG5ldHdvcmsgcHJvY2Vz
cyB0cmFja3MKKyAgICAgICAgdGhlIHN0YXRlIGFuZCB0YWtlcyB0aGUgYXNzZXJ0aW9uIGJ5IGl0
c2VsZiksIFVJIHByb2Nlc3MgbWF5IHNlbmQgbm9uLWltbWluZW50IFByZXBhcmVUb1N1c3BlbmQg
bW9yZSBvZnRlbiwKKyAgICAgICAgYW5kIHdlIG1heSBhYm9ydCB0cmFuc2FjdGlvbiB0b28gYWdn
cmVzc2l2ZWx5IChlLmcuIFVJIHByb2Nlc3MgbWF5IHNlbmQgdGhlIG1lc3NhZ2UgYXMgc29vbiBh
cyBhcHAgaXMgaW4gCisgICAgICAgIGJhY2tncm91bmQpLiBUbyBmaXggdGhlIHBvc3NpYmxlIHJl
Z3Jlc3Npb24gb2YgZGF0YSBsb3NzLCB3ZSB3aWxsIHNjaGVkdWxlIGEgdGFzayB3aXRoIDVzIGRl
bGF5IHRvIGFib3J0CisgICAgICAgIHRyYW5zYWN0aW9ucyBhZnRlciBwcmVwYXJlVG9TdXNwZW5k
LiBJbiB0aGlzIGNhc2UsIHRyYW5zYWN0aW9ucyBmaW5pc2hlZCBpbiA1cyBjYW4gaGF2ZSBhIGNo
YW5jZSB0byBmaW5pc2guCisKKyAgICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9JbmRleGVkREIvV2Vi
SURCU2VydmVyLmNwcDoKKyAgICAgICAgKiBOZXR3b3JrUHJvY2Vzcy9JbmRleGVkREIvV2ViSURC
U2VydmVyLmg6CisgICAgICAgICogTmV0d29ya1Byb2Nlc3MvTmV0d29ya1Byb2Nlc3MuY3BwOgor
ICAgICAgICAoV2ViS2l0OjpOZXR3b3JrUHJvY2Vzczo6c3VzcGVuZElEQlNlcnZlcnMpOgorICAg
ICAgICAoV2ViS2l0OjpOZXR3b3JrUHJvY2Vzczo6cHJlcGFyZVRvU3VzcGVuZCk6CisgICAgICAg
IChXZWJLaXQ6Ok5ldHdvcmtQcm9jZXNzOjpyZXN1bWUpOgorICAgICAgICAoV2ViS2l0OjpOZXR3
b3JrUHJvY2Vzczo6Y3JlYXRlV2ViSURCU2VydmVyKToKKyAgICAgICAgKiBOZXR3b3JrUHJvY2Vz
cy9OZXR3b3JrUHJvY2Vzcy5oOgorICAgICAgICAqIE5ldHdvcmtQcm9jZXNzL2lvcy9OZXR3b3Jr
UHJvY2Vzc0lPUy5tbToKKyAgICAgICAgKFdlYktpdDo6TmV0d29ya1Byb2Nlc3M6OnNldElzSG9s
ZGluZ0xvY2tlZEZpbGVzKToKKyAgICAgICAgKiBVSVByb2Nlc3MvUHJvY2Vzc0Fzc2VydGlvbi5o
OgorICAgICAgICAoV2ViS2l0OjpQcm9jZXNzQXNzZXJ0aW9uOjpzZXRQcmVwYXJlRm9ySW52YWxp
ZGF0aW9uSGFuZGxlcik6CisgICAgICAgICogVUlQcm9jZXNzL2lvcy9Qcm9jZXNzQXNzZXJ0aW9u
SU9TLm1tOgorICAgICAgICAoLVtXS1JCU0Fzc2VydGlvbkRlbGVnYXRlIGRlYWxsb2NdKToKKyAg
ICAgICAgKC1bV0tSQlNBc3NlcnRpb25EZWxlZ2F0ZSBhc3NlcnRpb25XaWxsSW52YWxpZGF0ZTpd
KToKKyAgICAgICAgKFdlYktpdDo6UHJvY2Vzc0Fzc2VydGlvbjo6UHJvY2Vzc0Fzc2VydGlvbik6
CisgICAgICAgIChXZWJLaXQ6OlByb2Nlc3NBc3NlcnRpb246On5Qcm9jZXNzQXNzZXJ0aW9uKToK
KyAgICAgICAgKFdlYktpdDo6UHJvY2Vzc0Fzc2VydGlvbjo6cHJvY2Vzc0Fzc2VydGlvbldpbGxC
ZUludmFsaWRhdGVkKToKKwogMjAyMS0wNy0xMyAgV2Vuc29uIEhzaWVoICA8d2Vuc29uX2hzaWVo
QGFwcGxlLmNvbT4KIAogICAgICAgICBbV0syXSBQdXNoIE9TIHN0YXRlIGR1bXBpbmcgbG9naWMg
ZG93biBmcm9tIFdlYlByb2Nlc3MgdG8gQXV4aWxpYXJ5UHJvY2VzcwpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL0lEQlNlcnZlci5jcHAgYi9Tb3Vy
Y2UvV2ViQ29yZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmNwcAppbmRleCA0
OWQ4NzY2MmZjYjNhNWFlMjNmMmE3YWI1MjdlNjU1N2MzMjZlYTNiLi5lYTNmNmQ2YTIxZGVmZTNi
ZjVhNzIwZTU0MDYwNTA1Nzc3Zjg1ZjYxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1
bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9N
b2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmNwcApAQCAtNzY3LDYgKzc2NywyMiBA
QCB2b2lkIElEQlNlcnZlcjo6dXBncmFkZUZpbGVzSWZOZWNlc3NhcnkoKQogICAgICAgICBGaWxl
U3lzdGVtOjptYWtlQWxsRGlyZWN0b3JpZXMobmV3VmVyc2lvbkRpcmVjdG9yeSk7CiB9CiAKK2Jv
b2wgSURCU2VydmVyOjpoYXNEYXRhYmFzZUFjdGl2aXRpZXNPbk1haW5UaHJlYWQoKSBjb25zdAor
eworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgQVNTRVJUKG1fbG9jay5pc0hlbGQo
KSk7CisKKyAgICBpZiAobV9zZXNzaW9uSUQuaXNFcGhlbWVyYWwoKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgZm9yIChhdXRvJiBkYXRhYmFzZSA6IG1fdW5pcXVlSURCRGF0YWJhc2VN
YXAudmFsdWVzKCkpIHsKKyAgICAgICAgaWYgKCFkYXRhYmFzZS0+aWRlbnRpZmllcigpLmlzVHJh
bnNpZW50KCkgJiYgZGF0YWJhc2UtPmhhc0FjdGl2ZVRyYW5zYWN0aW9ucygpKQorICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHJldHVybiBmYWxzZTsKK30KKwogdm9p
ZCBJREJTZXJ2ZXI6OnN0b3BEYXRhYmFzZUFjdGl2aXRpZXNPbk1haW5UaHJlYWQoKQogewogICAg
IEFTU0VSVChpc01haW5UaHJlYWQoKSk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1
bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmggYi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVz
L2luZGV4ZWRkYi9zZXJ2ZXIvSURCU2VydmVyLmgKaW5kZXggYmM3MjMwYzgwY2ZiNjQ2YWZlYzhk
ZTU5MGMzMDM1NDY3MGY0YzdlZC4uNjA4ZDdmYWI5ZWNkNzY1ZDk3ZjBjMDgzMzNmZjRkYjU0MDAx
MDdiMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVy
L0lEQlNlcnZlci5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL3NlcnZl
ci9JREJTZXJ2ZXIuaApAQCAtMTA3LDYgKzEwNyw3IEBAIHB1YmxpYzoKICAgICBTdG9yYWdlUXVv
dGFNYW5hZ2VyOjpEZWNpc2lvbiByZXF1ZXN0U3BhY2UoY29uc3QgQ2xpZW50T3JpZ2luJiwgdWlu
dDY0X3QgdGFza1NpemUpOwogICAgIFdFQkNPUkVfRVhQT1JUIHN0YXRpYyB1aW50NjRfdCBkaXNr
VXNhZ2UoY29uc3QgU3RyaW5nJiByb290RGlyZWN0b3J5LCBjb25zdCBDbGllbnRPcmlnaW4mKTsK
IAorICAgIFdFQkNPUkVfRVhQT1JUIGJvb2wgaGFzRGF0YWJhc2VBY3Rpdml0aWVzT25NYWluVGhy
ZWFkKCkgY29uc3Q7CiAgICAgV0VCQ09SRV9FWFBPUlQgdm9pZCBzdG9wRGF0YWJhc2VBY3Rpdml0
aWVzT25NYWluVGhyZWFkKCk7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVlSURCRGF0YWJhc2UuY3BwIGIvU291cmNl
L1dlYkNvcmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL1VuaXF1ZUlEQkRhdGFiYXNlLmNwcApp
bmRleCA5OWUxODU4NDgzYjg3ZDNlNGNkNDAyYzk3MjdjOGNhNTNmZjNhNzNmLi44NmNiNzA1YzU1
N2NhNjI4YWIyNTQyY2M0ZTVlNzgyNmNmNWEwMzkzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29y
ZS9Nb2R1bGVzL2luZGV4ZWRkYi9zZXJ2ZXIvVW5pcXVlSURCRGF0YWJhc2UuY3BwCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL01vZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9VbmlxdWVJREJEYXRhYmFzZS5j
cHAKQEAgLTExOTEsNiArMTE5MSwxMyBAQCB2b2lkIFVuaXF1ZUlEQkRhdGFiYXNlOjppbW1lZGlh
dGVDbG9zZSgpCiAgICAgY2xvc2UoKTsKIH0KIAorYm9vbCBVbmlxdWVJREJEYXRhYmFzZTo6aGFz
QWN0aXZlVHJhbnNhY3Rpb25zKCkgY29uc3QKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkp
OworCisgICAgcmV0dXJuICFtX2luUHJvZ3Jlc3NUcmFuc2FjdGlvbnMuaXNFbXB0eSgpOworfQor
CiB2b2lkIFVuaXF1ZUlEQkRhdGFiYXNlOjphYm9ydEFjdGl2ZVRyYW5zYWN0aW9ucygpCiB7CiAg
ICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL01v
ZHVsZXMvaW5kZXhlZGRiL3NlcnZlci9VbmlxdWVJREJEYXRhYmFzZS5oIGIvU291cmNlL1dlYkNv
cmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL1VuaXF1ZUlEQkRhdGFiYXNlLmgKaW5kZXggMjM2
ZTJiYjU1YTM1MzYyODlhYzVmNzU1Yzk4YWMwZjg1YWEzODc5OC4uZGZhZGRiOTdjYzIyNThlN2U0
MGVlYzhmYTIxMDg0NjhiMGNkY2EzNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvTW9kdWxl
cy9pbmRleGVkZGIvc2VydmVyL1VuaXF1ZUlEQkRhdGFiYXNlLmgKKysrIGIvU291cmNlL1dlYkNv
cmUvTW9kdWxlcy9pbmRleGVkZGIvc2VydmVyL1VuaXF1ZUlEQkRhdGFiYXNlLmgKQEAgLTEwNyw2
ICsxMDcsNyBAQCBwdWJsaWM6CiAgICAgdm9pZCBoYW5kbGVEZWxldGUoSURCQ29ubmVjdGlvblRv
Q2xpZW50JiwgY29uc3QgSURCUmVxdWVzdERhdGEmKTsKICAgICB2b2lkIGltbWVkaWF0ZUNsb3Nl
KCk7CiAKKyAgICBib29sIGhhc0FjdGl2ZVRyYW5zYWN0aW9ucygpIGNvbnN0OwogICAgIHZvaWQg
YWJvcnRBY3RpdmVUcmFuc2FjdGlvbnMoKTsKICAgICBib29sIHRyeUNsb3NlKCk7CiAKZGlmZiAt
LWdpdCBhL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvSW5kZXhlZERCL1dlYklEQlNlcnZl
ci5jcHAgYi9Tb3VyY2UvV2ViS2l0L05ldHdvcmtQcm9jZXNzL0luZGV4ZWREQi9XZWJJREJTZXJ2
ZXIuY3BwCmluZGV4IDU3NTM3N2Q4ZTJmZDNmZTFkNzUwMmQ3MTgwOTUxYjZkZjI2MWUxNTUuLjhm
Y2FmMzhlZDUyYzEzNmVjZTgyNmQ0MzEzMjIzYzk2ZGRkYTJiZjIgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvSW5kZXhlZERCL1dlYklEQlNlcnZlci5jcHAKKysrIGIv
U291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9JbmRleGVkREIvV2ViSURCU2VydmVyLmNwcApA
QCAtMTE1LDE3ICsxMTUsMzQgQEAgdm9pZCBXZWJJREJTZXJ2ZXI6OnJlbmFtZU9yaWdpbihjb25z
dCBXZWJDb3JlOjpTZWN1cml0eU9yaWdpbkRhdGEmIG9sZE9yaWdpbiwgY28KICAgICB9KTsKIH0K
IAotdm9pZCBXZWJJREJTZXJ2ZXI6OnN1c3BlbmQoKSBXVEZfSUdOT1JFU19USFJFQURfU0FGRVRZ
X0FOQUxZU0lTCitib29sIFdlYklEQlNlcnZlcjo6c3VzcGVuZChTdXNwZW5zaW9uQ29uZGl0aW9u
IHN1c3BlbnNpb25Db25kaXRpb24pIFdURl9JR05PUkVTX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMK
IHsKICAgICBBU1NFUlQoUnVuTG9vcDo6aXNNYWluKCkpOwogCiAgICAgaWYgKG1faXNTdXNwZW5k
ZWQpCi0gICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBSRUxFQVNF
X0xPRyhQcm9jZXNzU3VzcGVuc2lvbiwgIiVwIC0gV2ViSURCU2VydmVyOjpzdXNwZW5kKCksIHN1
c3BlbnNpb25Db25kaXRpb249JXMiLCB0aGlzLCBzdXNwZW5zaW9uQ29uZGl0aW9uID09IFN1c3Bl
bnNpb25Db25kaXRpb246OkFsd2F5cyA/ICJBbHdheXMiIDogIklmSWRsZSIpOwogCiAgICAgbV9p
c1N1c3BlbmRlZCA9IHRydWU7CiAgICAgbV9zZXJ2ZXJMb2NrLmxvY2soKTsKLSAgICBpZiAobV9z
ZXJ2ZXIpCisKKyAgICBpZiAoIW1fc2VydmVyKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAg
IGlmIChzdXNwZW5zaW9uQ29uZGl0aW9uID09IFN1c3BlbnNpb25Db25kaXRpb246OkFsd2F5cykg
ewogICAgICAgICBtX3NlcnZlci0+c3RvcERhdGFiYXNlQWN0aXZpdGllc09uTWFpblRocmVhZCgp
OworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBTdXNwZW5kIHRvIGF2b2lk
IHN0YXJ0aW5nIG5ldyB0cmFuc2FjdGlvbnMgaWYgdGhlcmUgaXMgbm8gb25nb2luZyB0cmFuc2Fj
dGlvbi4KKyAgICBpZiAoIW1fc2VydmVyLT5oYXNEYXRhYmFzZUFjdGl2aXRpZXNPbk1haW5UaHJl
YWQoKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBSZXN1bWUgdG8gYWxsb3cgb25n
b2luZyB0cmFuc2FjdGlvbnMgdG8gYmUgZmluaXNoZWQuCisgICAgbV9zZXJ2ZXJMb2NrLnVubG9j
aygpOworICAgIG1faXNTdXNwZW5kZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CiB9CiAK
IHZvaWQgV2ViSURCU2VydmVyOjpyZXN1bWUoKSBXVEZfSUdOT1JFU19USFJFQURfU0FGRVRZX0FO
QUxZU0lTCkBAIC0xMzUsNiArMTUyLDggQEAgdm9pZCBXZWJJREJTZXJ2ZXI6OnJlc3VtZSgpIFdU
Rl9JR05PUkVTX1RIUkVBRF9TQUZFVFlfQU5BTFlTSVMKICAgICBpZiAoIW1faXNTdXNwZW5kZWQp
CiAgICAgICAgIHJldHVybjsKIAorICAgIFJFTEVBU0VfTE9HKFByb2Nlc3NTdXNwZW5zaW9uLCAi
JXAgLSBXZWJJREJTZXJ2ZXI6OnJlc3VtZSgpIiwgdGhpcyk7CisKICAgICBtX2lzU3VzcGVuZGVk
ID0gZmFsc2U7CiAgICAgbV9zZXJ2ZXJMb2NrLnVubG9jaygpOwogfQpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9JbmRleGVkREIvV2ViSURCU2VydmVyLmggYi9Tb3Vy
Y2UvV2ViS2l0L05ldHdvcmtQcm9jZXNzL0luZGV4ZWREQi9XZWJJREJTZXJ2ZXIuaAppbmRleCA2
OTcwN2IyNzM5N2RiZTU2ZTQ2Zjc1YzMxZjMxOTA1OTZlMGI0MTk4Li5hN2U5NjVkZTAxNGU5ODE4
NjBjYjM2OTE4ODczYzk1YWFiMjc3YTMzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L05ldHdv
cmtQcm9jZXNzL0luZGV4ZWREQi9XZWJJREJTZXJ2ZXIuaAorKysgYi9Tb3VyY2UvV2ViS2l0L05l
dHdvcmtQcm9jZXNzL0luZGV4ZWREQi9XZWJJREJTZXJ2ZXIuaApAQCAtNTIsNyArNTIsOCBAQCBw
dWJsaWM6CiAgICAgdm9pZCBjbG9zZUFuZERlbGV0ZURhdGFiYXNlc0Zvck9yaWdpbnMoY29uc3Qg
VmVjdG9yPFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YT4mLCBDb21wbGV0aW9uSGFuZGxlcjx2
b2lkKCk+JiYgY2FsbGJhY2spOwogICAgIHZvaWQgcmVuYW1lT3JpZ2luKGNvbnN0IFdlYkNvcmU6
OlNlY3VyaXR5T3JpZ2luRGF0YSYsIGNvbnN0IFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luRGF0YSYs
IENvbXBsZXRpb25IYW5kbGVyPHZvaWQoKT4mJik7CiAKLSAgICB2b2lkIHN1c3BlbmQoKTsKKyAg
ICBlbnVtIGNsYXNzIFN1c3BlbnNpb25Db25kaXRpb24gOiBib29sIHsgQWx3YXlzLCBJZklkbGUg
fTsKKyAgICBib29sIHN1c3BlbmQoU3VzcGVuc2lvbkNvbmRpdGlvbiA9IFN1c3BlbnNpb25Db25k
aXRpb246OkFsd2F5cyk7CiAgICAgdm9pZCByZXN1bWUoKTsKIAogICAgIC8vIE1lc3NhZ2UgaGFu
ZGxlcnMuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L05ldHdvcmtQcm9jZXNzL05ldHdvcmtQ
cm9jZXNzLmNwcCBiL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvTmV0d29ya1Byb2Nlc3Mu
Y3BwCmluZGV4IGFlYTJmYWE1OGExNTgxZjAwYmY1NmJjZWVlZDE3N2I0NGE0MzYwOTYuLjU4MGYy
ZTRiMGE4MjMwYmI2MjdhOTMyNTJiMjMxODc1N2Q1NTI1NmUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJLaXQvTmV0d29ya1Byb2Nlc3MvTmV0d29ya1Byb2Nlc3MuY3BwCisrKyBiL1NvdXJjZS9XZWJL
aXQvTmV0d29ya1Byb2Nlc3MvTmV0d29ya1Byb2Nlc3MuY3BwCkBAIC0yMjExLDE0ICsyMjExLDM2
IEBAIHZvaWQgTmV0d29ya1Byb2Nlc3M6OnByb2Nlc3NXaWxsU3VzcGVuZEltbWluZW50bHlGb3JU
ZXN0aW5nU3luYyhDb21wbGV0aW9uSGFuZGxlCiAgICAgcHJlcGFyZVRvU3VzcGVuZCh0cnVlLCBX
VEZNb3ZlKGNvbXBsZXRpb25IYW5kbGVyKSk7CiB9CiAKK3ZvaWQgTmV0d29ya1Byb2Nlc3M6OnN1
c3BlbmRJREJTZXJ2ZXJzKGJvb2wgaXNTdXNwZW5zaW9uSW1taW5lbnQpCit7CisgICAgbV9zaG91
bGRTdXNwZW5kSURCU2VydmVycyA9IHRydWU7CisKKyAgICBib29sIGFsbFN1c3BlbmRlZCA9IHRy
dWU7CisgICAgYXV0byBjb25kaXRpb24gPSBpc1N1c3BlbnNpb25JbW1pbmVudCA/IFdlYklEQlNl
cnZlcjo6U3VzcGVuc2lvbkNvbmRpdGlvbjo6QWx3YXlzIDogV2ViSURCU2VydmVyOjpTdXNwZW5z
aW9uQ29uZGl0aW9uOjpJZklkbGU7CisgICAgZm9yIChhdXRvJiBzZXJ2ZXIgOiBtX3dlYklEQlNl
cnZlcnMudmFsdWVzKCkpCisgICAgICAgIGFsbFN1c3BlbmRlZCAmPSBzZXJ2ZXItPnN1c3BlbmQo
Y29uZGl0aW9uKTsKKworICAgIGlmIChhbGxTdXNwZW5kZWQpCisgICAgICAgIHJldHVybjsKKwor
ICAgIFJ1bkxvb3A6Om1haW4oKS5kaXNwYXRjaEFmdGVyKDVfcywgW3RoaXMsIHdlYWtUaGlzID0g
bWFrZVdlYWtQdHIoKnRoaXMpXSB7CisgICAgICAgIGlmICghd2Vha1RoaXMpCisgICAgICAgICAg
ICByZXR1cm47CisKKyAgICAgICAgaWYgKCFtX3Nob3VsZFN1c3BlbmRJREJTZXJ2ZXJzKQorICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgZm9yIChhdXRvJiBzZXJ2ZXIgOiBt
X3dlYklEQlNlcnZlcnMudmFsdWVzKCkpCisgICAgICAgICAgICBzZXJ2ZXItPnN1c3BlbmQoV2Vi
SURCU2VydmVyOjpTdXNwZW5zaW9uQ29uZGl0aW9uOjpBbHdheXMpOworICAgIH0pOworfQorCiB2
b2lkIE5ldHdvcmtQcm9jZXNzOjpwcmVwYXJlVG9TdXNwZW5kKGJvb2wgaXNTdXNwZW5zaW9uSW1t
aW5lbnQsIENvbXBsZXRpb25IYW5kbGVyPHZvaWQoKT4mJiBjb21wbGV0aW9uSGFuZGxlcikKIHsK
ICAgICBSRUxFQVNFX0xPRyhQcm9jZXNzU3VzcGVuc2lvbiwgIiVwIC0gTmV0d29ya1Byb2Nlc3M6
OnByZXBhcmVUb1N1c3BlbmQoKSwgaXNTdXNwZW5zaW9uSW1taW5lbnQ9JWQiLCB0aGlzLCBpc1N1
c3BlbnNpb25JbW1pbmVudCk7CiAKICNpZiBQTEFURk9STShJT1NfRkFNSUxZKQotICAgIGZvciAo
YXV0byYgc2VydmVyIDogbV93ZWJJREJTZXJ2ZXJzLnZhbHVlcygpKQotICAgICAgICBzZXJ2ZXIt
PnN1c3BlbmQoKTsKLSAgICBtX3Nob3VsZFN1c3BlbmRJREJTZXJ2ZXIgPSB0cnVlOworICAgIHN1
c3BlbmRJREJTZXJ2ZXJzKGlzU3VzcGVuc2lvbkltbWluZW50KTsKICNlbmRpZgogCiAgICAgbG93
TWVtb3J5SGFuZGxlcihDcml0aWNhbDo6WWVzKTsKQEAgLTIyODIsNyArMjMwNCw3IEBAIHZvaWQg
TmV0d29ya1Byb2Nlc3M6OnJlc3VtZSgpCiAjaWYgUExBVEZPUk0oSU9TX0ZBTUlMWSkKICAgICBm
b3IgKGF1dG8mIHNlcnZlciA6IG1fd2ViSURCU2VydmVycy52YWx1ZXMoKSkKICAgICAgICAgc2Vy
dmVyLT5yZXN1bWUoKTsKLSAgICBtX3Nob3VsZFN1c3BlbmRJREJTZXJ2ZXIgPSBmYWxzZTsKKyAg
ICBtX3Nob3VsZFN1c3BlbmRJREJTZXJ2ZXJzID0gZmFsc2U7CiAjZW5kaWYKIAogICAgIG1fc3Rv
cmFnZU1hbmFnZXJTZXQtPnJlc3VtZSgpOwpAQCAtMjM0Nyw4ICsyMzY5LDggQEAgUmVmPFdlYklE
QlNlcnZlcj4gTmV0d29ya1Byb2Nlc3M6OmNyZWF0ZVdlYklEQlNlcnZlcihQQUw6OlNlc3Npb25J
RCBzZXNzaW9uSUQpCiAgICAgfTsKIAogICAgIGF1dG8gcmVzdWx0ID0gV2ViSURCU2VydmVyOjpj
cmVhdGUoc2Vzc2lvbklELCBwYXRoLCBXVEZNb3ZlKHNwYWNlUmVxdWVzdGVyKSk7Ci0gICAgaWYg
KG1fc2hvdWxkU3VzcGVuZElEQlNlcnZlcikKLSAgICAgICAgcmVzdWx0LT5zdXNwZW5kKCk7Cisg
ICAgaWYgKG1fc2hvdWxkU3VzcGVuZElEQlNlcnZlcnMpCisgICAgICAgIHJlc3VsdC0+c3VzcGVu
ZChXZWJJREJTZXJ2ZXI6OlN1c3BlbnNpb25Db25kaXRpb246OkFsd2F5cyk7CiAgICAgcmV0dXJu
IHJlc3VsdDsKIH0KIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9O
ZXR3b3JrUHJvY2Vzcy5oIGIvU291cmNlL1dlYktpdC9OZXR3b3JrUHJvY2Vzcy9OZXR3b3JrUHJv
Y2Vzcy5oCmluZGV4IDc5NDgwOTdhYTNkYzM4NmEyZmQ0MWZhZDYyM2IzY2VjZGY4ZDdlNGEuLmZm
YjZlZjYxMTdlMzcyMTM5ZTNiNGVlYzE0Y2RmMzY2OTQ3NzYwZWQgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvTmV0d29ya1Byb2Nlc3MuaAorKysgYi9Tb3VyY2UvV2Vi
S2l0L05ldHdvcmtQcm9jZXNzL05ldHdvcmtQcm9jZXNzLmgKQEAgLTQ4Niw2ICs0ODYsNyBAQCBw
cml2YXRlOgogICAgIFJlZjxXZWJJREJTZXJ2ZXI+IGNyZWF0ZVdlYklEQlNlcnZlcihQQUw6OlNl
c3Npb25JRCk7CiAgICAgdm9pZCBzZXRTZXNzaW9uU3RvcmFnZVF1b3RhTWFuYWdlcklEQlJvb3RQ
YXRoKFBBTDo6U2Vzc2lvbklELCBjb25zdCBTdHJpbmcmIGlkYlJvb3RQYXRoKTsKICAgICB2b2lk
IHJlbW92ZVdlYklEQlNlcnZlcklmUG9zc2libGUoUEFMOjpTZXNzaW9uSUQpOworICAgIHZvaWQg
c3VzcGVuZElEQlNlcnZlcnMoYm9vbCBpc1N1c3BlbnNpb25JbW1pbmVudCk7CiAKICNpZiBFTkFC
TEUoU0VSVklDRV9XT1JLRVIpCiAgICAgdm9pZCBkaWRDcmVhdGVXb3JrZXJDb250ZXh0UHJvY2Vz
c0Nvbm5lY3Rpb24oY29uc3QgSVBDOjpBdHRhY2htZW50Jik7CkBAIC01ODMsNyArNTg0LDcgQEAg
cHJpdmF0ZToKIAogICAgIEhhc2hNYXA8UEFMOjpTZXNzaW9uSUQsIFN0cmluZz4gbV9pZGJEYXRh
YmFzZVBhdGhzOwogICAgIEhhc2hNYXA8UEFMOjpTZXNzaW9uSUQsIFJlZlB0cjxXZWJJREJTZXJ2
ZXI+PiBtX3dlYklEQlNlcnZlcnM7Ci0gICAgYm9vbCBtX3Nob3VsZFN1c3BlbmRJREJTZXJ2ZXIg
eyBmYWxzZSB9OworICAgIGJvb2wgbV9zaG91bGRTdXNwZW5kSURCU2VydmVycyB7IGZhbHNlIH07
CiAgICAgCiAjaWYgRU5BQkxFKFNFUlZJQ0VfV09SS0VSKQogICAgIHN0cnVjdCBTZXJ2aWNlV29y
a2VySW5mbyB7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L05ldHdvcmtQcm9jZXNzL2lvcy9O
ZXR3b3JrUHJvY2Vzc0lPUy5tbSBiL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvaW9zL05l
dHdvcmtQcm9jZXNzSU9TLm1tCmluZGV4IDY0OTRiNWE3OThhZjY5MDgxZWEzZDdhNWEzY2M1NWVj
ODI3ZTRiZjQuLmM2NmQyYTk2NzM1MGZlOWU3ZTU2NDQzNDc5Mzc1MjhmM2JiMDZjNzggMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvaW9zL05ldHdvcmtQcm9jZXNzSU9T
Lm1tCisrKyBiL1NvdXJjZS9XZWJLaXQvTmV0d29ya1Byb2Nlc3MvaW9zL05ldHdvcmtQcm9jZXNz
SU9TLm1tCkBAIC0xMTMsNiArMTEzLDE3IEBAIHZvaWQgTmV0d29ya1Byb2Nlc3M6OnNldElzSG9s
ZGluZ0xvY2tlZEZpbGVzKGJvb2wgaXNIb2xkaW5nTG9ja2VkRmlsZXMpCiAgICAgLy8gV2Ugc3lu
Y2hyb25vdXNseSB0YWtlIGEgcHJvY2VzcyBhc3NlcnRpb24gd2hlbiBiZWdpbm5pbmcgYSBTUUxp
dGUgdHJhbnNhY3Rpb24gc28gdGhhdCB3ZSBkb24ndCBnZXQgc3VzcGVuZGVkCiAgICAgLy8gd2hp
bGUgaG9sZGluZyBhIGxvY2tlZCBmaWxlLiBXZSB3b3VsZCBnZXQga2lsbGVkIGlmIHN1c3BlbmRl
ZCB3aGlsZSBob2xkaW5nIGxvY2tlZCBmaWxlcy4KICAgICBtX2hvbGRpbmdMb2NrZWRGaWxlQXNz
ZXJ0aW9uID0gUHJvY2Vzc0Fzc2VydGlvbjo6Y3JlYXRlKGdldEN1cnJlbnRQcm9jZXNzSUQoKSwg
Ik5ldHdvcmsgUHJvY2VzcyBpcyBob2xkaW5nIGxvY2tlZCBmaWxlcyJfcywgUHJvY2Vzc0Fzc2Vy
dGlvblR5cGU6OkZpbmlzaFRhc2tVbmludGVycnVwdGFibGUsIFByb2Nlc3NBc3NlcnRpb246Ok1v
ZGU6OlN5bmMpOworICAgIG1faG9sZGluZ0xvY2tlZEZpbGVBc3NlcnRpb24tPnNldFByZXBhcmVG
b3JJbnZhbGlkYXRpb25IYW5kbGVyKFt0aGlzLCB3ZWFrVGhpcyA9IG1ha2VXZWFrUHRyKCp0aGlz
KV0oKSBtdXRhYmxlIHsKKyAgICAgICAgQVNTRVJUKGlzTWFpblJ1bkxvb3AoKSk7CisgICAgICAg
IGlmICghd2Vha1RoaXMpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgaWYgKCFtX3No
b3VsZFN1c3BlbmRJREJTZXJ2ZXJzKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGZv
ciAoYXV0byYgc2VydmVyIDogbV93ZWJJREJTZXJ2ZXJzLnZhbHVlcygpKQorICAgICAgICAgICAg
c2VydmVyLT5zdXNwZW5kKCk7CisgICAgfSk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIFdlYktpdApk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvUHJvY2Vzc0Fzc2VydGlvbi5oIGIv
U291cmNlL1dlYktpdC9VSVByb2Nlc3MvUHJvY2Vzc0Fzc2VydGlvbi5oCmluZGV4IDcxM2ZiOWZi
YWIxODZmYTc3ZjFkMDBjYzU1MjM2OTBjNGNlNTAzYzguLmNiN2RkZWQ2ZmVkOGZhNWNjZjNhOTA2
YzMzODQwZTdmOWNhMWIzMzQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL1By
b2Nlc3NBc3NlcnRpb24uaAorKysgYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9Qcm9jZXNzQXNz
ZXJ0aW9uLmgKQEAgLTcyLDYgKzcyLDcgQEAgcHVibGljOgogICAgIH0KICAgICB2aXJ0dWFsIH5Q
cm9jZXNzQXNzZXJ0aW9uKCk7CiAKKyAgICB2b2lkIHNldFByZXBhcmVGb3JJbnZhbGlkYXRpb25I
YW5kbGVyKEZ1bmN0aW9uPHZvaWQoKT4mJiBoYW5kbGVyKSB7IG1fcHJlcGFyZUZvckludmFsaWRh
dGlvbkhhbmRsZXIgPSBXVEZNb3ZlKGhhbmRsZXIpOyB9CiAgICAgdm9pZCBzZXRJbnZhbGlkYXRp
b25IYW5kbGVyKEZ1bmN0aW9uPHZvaWQoKT4mJiBoYW5kbGVyKSB7IG1faW52YWxpZGF0aW9uSGFu
ZGxlciA9IFdURk1vdmUoaGFuZGxlcik7IH0KIAogICAgIFByb2Nlc3NBc3NlcnRpb25UeXBlIHR5
cGUoKSBjb25zdCB7IHJldHVybiBtX2Fzc2VydGlvblR5cGU7IH0KQEAgLTg2LDYgKzg3LDcgQEAg
cHJvdGVjdGVkOgogICAgIHZvaWQgYWNxdWlyZVN5bmMoKTsKIAogI2lmIFBMQVRGT1JNKElPU19G
QU1JTFkpCisgICAgdm9pZCBwcm9jZXNzQXNzZXJ0aW9uV2lsbEJlSW52YWxpZGF0ZWQoKTsKICAg
ICB2aXJ0dWFsIHZvaWQgcHJvY2Vzc0Fzc2VydGlvbldhc0ludmFsaWRhdGVkKCk7CiAjZW5kaWYK
IApAQCAtOTgsNiArMTAwLDcgQEAgcHJpdmF0ZToKICAgICBSZXRhaW5QdHI8V0tSQlNBc3NlcnRp
b25EZWxlZ2F0ZT4gbV9kZWxlZ2F0ZTsKICAgICBib29sIG1fd2FzSW52YWxpZGF0ZWQgeyBmYWxz
ZSB9OwogI2VuZGlmCisgICAgRnVuY3Rpb248dm9pZCgpPiBtX3ByZXBhcmVGb3JJbnZhbGlkYXRp
b25IYW5kbGVyOwogICAgIEZ1bmN0aW9uPHZvaWQoKT4gbV9pbnZhbGlkYXRpb25IYW5kbGVyOwog
fTsKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvaW9zL1Byb2Nlc3NBc3Nl
cnRpb25JT1MubW0gYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9pb3MvUHJvY2Vzc0Fzc2VydGlv
bklPUy5tbQppbmRleCBmMzUxMTZkMWEwYTRjM2ZiOTk1NDI3NGVhNTU2ZTM5ZGM1ZDZmMWM1Li4x
NDJjNGFhNTJlY2I1OGU5YWZiZTBjOWU4NDE3MDEzODdiYTQwMmY3IDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViS2l0L1VJUHJvY2Vzcy9pb3MvUHJvY2Vzc0Fzc2VydGlvbklPUy5tbQorKysgYi9Tb3Vy
Y2UvV2ViS2l0L1VJUHJvY2Vzcy9pb3MvUHJvY2Vzc0Fzc2VydGlvbklPUy5tbQpAQCAtMjU1LDEy
ICsyNTUsMTQgQEAgc3RhdGljIGJvb2wgcHJvY2Vzc0hhc0FjdGl2ZVJ1blRpbWVMaW1pdGF0aW9u
KCkKIHR5cGVkZWYgdm9pZCheUkJTQXNzZXJ0aW9uSW52YWxpZGF0aW9uQ2FsbGJhY2tUeXBlKSgp
OwogCiBAaW50ZXJmYWNlIFdLUkJTQXNzZXJ0aW9uRGVsZWdhdGUgOiBOU09iamVjdDxSQlNBc3Nl
cnRpb25PYnNlcnZpbmc+CitAcHJvcGVydHkgKGNvcHkpIFJCU0Fzc2VydGlvbkludmFsaWRhdGlv
bkNhbGxiYWNrVHlwZSBwcmVwYXJlRm9ySW52YWxpZGF0aW9uQ2FsbGJhY2s7CiBAcHJvcGVydHkg
KGNvcHkpIFJCU0Fzc2VydGlvbkludmFsaWRhdGlvbkNhbGxiYWNrVHlwZSBpbnZhbGlkYXRpb25D
YWxsYmFjazsKIEBlbmQKIAogQGltcGxlbWVudGF0aW9uIFdLUkJTQXNzZXJ0aW9uRGVsZWdhdGUK
IC0gKHZvaWQpZGVhbGxvYwogeworICAgIFtfcHJlcGFyZUZvckludmFsaWRhdGlvbkNhbGxiYWNr
IHJlbGVhc2VdOwogICAgIFtfaW52YWxpZGF0aW9uQ2FsbGJhY2sgcmVsZWFzZV07CiAgICAgW3N1
cGVyIGRlYWxsb2NdOwogfQpAQCAtMjY4LDYgKzI3MCwxMiBAQCB0eXBlZGVmIHZvaWQoXlJCU0Fz
c2VydGlvbkludmFsaWRhdGlvbkNhbGxiYWNrVHlwZSkoKTsKIC0gKHZvaWQpYXNzZXJ0aW9uV2ls
bEludmFsaWRhdGU6KFJCU0Fzc2VydGlvbiAqKWFzc2VydGlvbgogewogICAgIFJFTEVBU0VfTE9H
KFByb2Nlc3NTdXNwZW5zaW9uLCAiJXAgLSBXS1JCU0Fzc2VydGlvbkRlbGVnYXRlOiBhc3NlcnRp
b25XaWxsSW52YWxpZGF0ZSIsIHNlbGYpOworCisgICAgUnVuTG9vcDo6bWFpbigpLmRpc3BhdGNo
KFt3ZWFrU2VsZiA9IFdlYWtPYmpDUHRyPFdLUkJTQXNzZXJ0aW9uRGVsZWdhdGU+KHNlbGYpXSB7
CisgICAgICAgIGF1dG8gc3Ryb25nU2VsZiA9IHdlYWtTZWxmLmdldCgpOworICAgICAgICBpZiAo
c3Ryb25nU2VsZiAmJiBzdHJvbmdTZWxmLmdldCgpLnByZXBhcmVGb3JJbnZhbGlkYXRpb25DYWxs
YmFjaykKKyAgICAgICAgICAgIHN0cm9uZ1NlbGYuZ2V0KCkucHJlcGFyZUZvckludmFsaWRhdGlv
bkNhbGxiYWNrKCk7CisgICAgfSk7CiB9CiAKIC0gKHZvaWQpYXNzZXJ0aW9uOihSQlNBc3NlcnRp
b24gKilhc3NlcnRpb24gZGlkSW52YWxpZGF0ZVdpdGhFcnJvcjooTlNFcnJvciAqKWVycm9yCkBA
IC0zMzksNiArMzQ3LDEwIEBAIFByb2Nlc3NBc3NlcnRpb246OlByb2Nlc3NBc3NlcnRpb24ocGlk
X3QgcGlkLCBjb25zdCBTdHJpbmcmIHJlYXNvbiwgUHJvY2Vzc0Fzc2VyCiAgICAgICAgIFJFTEVB
U0VfTE9HKFByb2Nlc3NTdXNwZW5zaW9uLCAiJXAgLSBQcm9jZXNzQXNzZXJ0aW9uOiBSQlMgJXtw
dWJsaWN9QCBhc3NlcnRpb24gZm9yIHByb2Nlc3Mgd2l0aCBQSUQ9JWQgd2FzIGludmFsaWRhdGVk
IiwgdGhpcywgcnVubmluZ0JvYXJkQXNzZXJ0aW9uTmFtZSwgcGlkKTsKICAgICAgICAgcHJvY2Vz
c0Fzc2VydGlvbldhc0ludmFsaWRhdGVkKCk7CiAgICAgfTsKKyAgICBtX2RlbGVnYXRlLmdldCgp
LnByZXBhcmVGb3JJbnZhbGlkYXRpb25DYWxsYmFjayA9IF57CisgICAgICAgIFJFTEVBU0VfTE9H
KFByb2Nlc3NTdXNwZW5zaW9uLCAiJXAgLSBQcm9jZXNzQXNzZXJ0aW9uKCkgUkJTICV7cHVibGlj
fUAgYXNzZXJ0aW9uIGZvciBwcm9jZXNzIHdpdGggUElEPSVkIHdpbGwgYmUgaW52YWxpZGF0ZWQi
LCB0aGlzLCBydW5uaW5nQm9hcmRBc3NlcnRpb25OYW1lLCBwaWQpOworICAgICAgICBwcm9jZXNz
QXNzZXJ0aW9uV2lsbEJlSW52YWxpZGF0ZWQoKTsKKyAgICB9OwogfQogCiB2b2lkIFByb2Nlc3NB
c3NlcnRpb246OmFjcXVpcmVBc3luYyhDb21wbGV0aW9uSGFuZGxlcjx2b2lkKCk+JiYgY29tcGxl
dGlvbkhhbmRsZXIpCkBAIC0zNzMsMTIgKzM4NSwyMiBAQCBQcm9jZXNzQXNzZXJ0aW9uOjp+UHJv
Y2Vzc0Fzc2VydGlvbigpCiAKICAgICBpZiAobV9yYnNBc3NlcnRpb24pIHsKICAgICAgICAgbV9k
ZWxlZ2F0ZS5nZXQoKS5pbnZhbGlkYXRpb25DYWxsYmFjayA9IG5pbDsKKyAgICAgICAgbV9kZWxl
Z2F0ZS5nZXQoKS5wcmVwYXJlRm9ySW52YWxpZGF0aW9uQ2FsbGJhY2sgPSBuaWw7CiAgICAgICAg
IFttX3Jic0Fzc2VydGlvbiByZW1vdmVPYnNlcnZlcjptX2RlbGVnYXRlLmdldCgpXTsKICAgICAg
ICAgbV9kZWxlZ2F0ZSA9IG5pbDsKICAgICAgICAgW21fcmJzQXNzZXJ0aW9uIGludmFsaWRhdGVd
OwogICAgIH0KIH0KIAordm9pZCBQcm9jZXNzQXNzZXJ0aW9uOjpwcm9jZXNzQXNzZXJ0aW9uV2ls
bEJlSW52YWxpZGF0ZWQoKQoreworICAgIEFTU0VSVChSdW5Mb29wOjppc01haW4oKSk7CisgICAg
UkVMRUFTRV9MT0coUHJvY2Vzc1N1c3BlbnNpb24sICIlcCAtIFByb2Nlc3NBc3NlcnRpb246OnBy
b2Nlc3NBc3NlcnRpb25XaWxsQmVJbnZhbGlkYXRlZCgpIFBJRD0lZCIsIHRoaXMsIG1fcGlkKTsK
KworICAgIGlmIChtX3ByZXBhcmVGb3JJbnZhbGlkYXRpb25IYW5kbGVyKQorICAgICAgICBtX3By
ZXBhcmVGb3JJbnZhbGlkYXRpb25IYW5kbGVyKCk7Cit9CisKIHZvaWQgUHJvY2Vzc0Fzc2VydGlv
bjo6cHJvY2Vzc0Fzc2VydGlvbldhc0ludmFsaWRhdGVkKCkKIHsKICAgICBBU1NFUlQoUnVuTG9v
cDo6aXNNYWluKCkpOwo=
</data>

          </attachment>
      

    </bug>

</bugzilla>