<?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>218045</bug_id>
          
          <creation_ts>2020-10-21 12:45:07 -0700</creation_ts>
          <short_desc>Add addOutput() / removeOutput() utility functions to AudioSummingJunction</short_desc>
          <delta_ts>2020-10-21 15:39:51 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Web Audio</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>
          
          <blocked>212611</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Chris Dumez">cdumez</reporter>
          <assigned_to name="Chris Dumez">cdumez</assigned_to>
          <cc>cdumez</cc>
    
    <cc>darin</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>ggaren</cc>
    
    <cc>glenn</cc>
    
    <cc>jer.noble</cc>
    
    <cc>philipj</cc>
    
    <cc>sam</cc>
    
    <cc>sergio</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1700325</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2020-10-21 12:45:07 -0700</bug_when>
    <thetext>Add addOutput() / removeOutput() utility functions to AudioSummingJunction to add or remove outputs from m_outputs and abstract away the call to changedOutputs(). It was awkward that subclasses were modifying m_outputs directly and had to explicitly call changedOutputs() whenever they did.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1700327</commentid>
    <comment_count>1</comment_count>
      <attachid>412018</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2020-10-21 12:46:58 -0700</bug_when>
    <thetext>Created attachment 412018
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1700347</commentid>
    <comment_count>2</comment_count>
      <attachid>412018</attachid>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2020-10-21 13:22:42 -0700</bug_when>
    <thetext>Comment on attachment 412018
Patch

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

&gt; Source/WebCore/Modules/webaudio/AudioNodeInput.cpp:60
&gt; +    auto addPotentiallyDisabledOutput = [this](AudioNodeOutput&amp; output) {
&gt; +        if (output.isEnabled())
&gt; +            return addOutput(output);
&gt; +        return m_disabledOutputs.add(&amp;output).isNewEntry;
&gt; +    };

Is it not necessary to mark rendering state as dirty when a disabled output is connected?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1700349</commentid>
    <comment_count>3</comment_count>
      <attachid>412018</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2020-10-21 13:24:16 -0700</bug_when>
    <thetext>Comment on attachment 412018
Patch

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

&gt;&gt; Source/WebCore/Modules/webaudio/AudioNodeInput.cpp:60
&gt;&gt; +    };
&gt; 
&gt; Is it not necessary to mark rendering state as dirty when a disabled output is connected?

No, it is only necessary when m_output changes. We were calling it unnecessarily in this case previously. You can see in this file that m_disabledOutputs gets changed in several places without calling changedOutputs().</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1700354</commentid>
    <comment_count>4</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2020-10-21 13:27:57 -0700</bug_when>
    <thetext>Committed r268820: &lt;https://trac.webkit.org/changeset/268820&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 412018.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1700356</commentid>
    <comment_count>5</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2020-10-21 13:28:26 -0700</bug_when>
    <thetext>&lt;rdar://problem/70542842&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1700417</commentid>
    <comment_count>6</comment_count>
      <attachid>412018</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2020-10-21 15:21:02 -0700</bug_when>
    <thetext>Comment on attachment 412018
Patch

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

&gt; Source/WebCore/Modules/webaudio/AudioSummingJunction.cpp:97
&gt; +    std::for_each(m_outputs.begin(), m_outputs.end(), [&amp;](auto* output) {

Since this is a little non-standard for WebKit, what made you use std::for_each here rather than a range-for loop? e.g.

for (auto output : m_outputs)
    maxChannels = std::max(maxChannels, output-&gt;numberOfChannels());</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1700421</commentid>
    <comment_count>7</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2020-10-21 15:26:46 -0700</bug_when>
    <thetext>(In reply to Sam Weinig from comment #6)
&gt; Comment on attachment 412018 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=412018&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/Modules/webaudio/AudioSummingJunction.cpp:97
&gt; &gt; +    std::for_each(m_outputs.begin(), m_outputs.end(), [&amp;](auto* output) {
&gt; 
&gt; Since this is a little non-standard for WebKit, what made you use
&gt; std::for_each here rather than a range-for loop? e.g.
&gt; 
&gt; for (auto output : m_outputs)
&gt;     maxChannels = std::max(maxChannels, output-&gt;numberOfChannels());

It actually used to be such a for-loop before I moved the code. This was my attempt at modernizing the code. Do you prefer the for loop?

I believe we are using STL algorithm more and more. Here are some examples:
Source/WebCore/accessibility/AXObjectCache.cpp:    std::for_each(m_deferredFocusedNodeChange.begin(), m_deferredFocusedNodeChange.end(), [&amp;node](auto&amp; entry) {
Source/WebCore/platform/graphics/ImageSource.cpp:    std::for_each(m_frameCommitQueue.begin(), m_frameCommitQueue.end(), [this](const ImageFrameRequest&amp; frameRequest) {
Source/WebCore/Modules/encryptedmedia/MediaKeyStatusMap.cpp:    return std::any_of(statuses.begin(), statuses.end(),
Source/WebCore/Modules/encryptedmedia/MediaKeys.cpp:    return std::any_of(m_sessions.begin(), m_sessions.end(),
Source/WebCore/Modules/mediasource/MediaSource.cpp:    if (std::any_of(m_sourceBuffers-&gt;begin(), m_sourceBuffers-&gt;end(), [](auto&amp; sourceBuffer) { return sourceBuffer-&gt;updating(); }))
Source/WebCore/accessibility/AccessibilityRenderObject.cpp:        if (std::any_of(parentTags-&gt;begin(), parentTags-&gt;end(), [&amp;name] (auto* possibleName) { return *possibleName == name; }))
Source/WebCore/crypto/gcrypt/CryptoKeyRSAGCrypt.cpp:        if (std::any_of(exponent.begin(), exponent.end() - 4, [](uint8_t element) { return !!element; }))
Source/WebCore/platform/encryptedmedia/clearkey/CDMClearKey.cpp:    return std::any_of(types.begin(), types.end(),
Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.mm:    return std::any_of(m_activeSourceBuffers.begin(), m_activeSourceBuffers.end(), MediaSourcePrivateAVFObjCHasAudio);
Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.mm:    return std::any_of(m_activeSourceBuffers.begin(), m_activeSourceBuffers.end(), [] (SourceBufferPrivateAVFObjC* sourceBuffer) {
Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.mm:    return std::any_of(m_activeSourceBuffers.begin(), m_activeSourceBuffers.end(), [] (SourceBufferPrivateAVFObjC* sourceBuffer) {
Source/WebCore/platform/graphics/nicosia/NicosiaAnimation.cpp:    return std::any_of(m_animations.begin(), m_animations.end(),
Source/WebCore/platform/graphics/nicosia/NicosiaAnimation.cpp:    return std::any_of(m_animations.begin(), m_animations.end(),
Source/WebCore/platform/graphics/texmap/TextureMapperGL.cpp:            ASSERT(std::any_of(contextDataMap().begin(), contextDataMap().end(),
Source/WebCore/platform/graphics/texmap/TextureMapperLayer.cpp:    return std::any_of(m_children.begin(), m_children.end(),
Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.cpp:    bool alreadyRecorded = std::any_of(rects.begin(), rects.end(),
Source/WebCore/platform/mediastream/mac/CoreAudioCaptureDeviceManager.cpp:    return std::any_of(devices.begin(), devices.end(), [&amp;deviceID, deviceType](auto&amp; device) {
Source/WebCore/platform/mock/mediasource/MockMediaSourcePrivate.cpp:    return std::any_of(m_activeSourceBuffers.begin(), m_activeSourceBuffers.end(), MockSourceBufferPrivateHasAudio);
Source/WebCore/platform/mock/mediasource/MockMediaSourcePrivate.cpp:    return std::any_of(m_activeSourceBuffers.begin(), m_activeSourceBuffers.end(), MockSourceBufferPrivateHasVideo);</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1700424</commentid>
    <comment_count>8</comment_count>
    <who name="Sam Weinig">sam</who>
    <bug_when>2020-10-21 15:33:04 -0700</bug_when>
    <thetext>(In reply to Chris Dumez from comment #7)
&gt; (In reply to Sam Weinig from comment #6)
&gt; &gt; Comment on attachment 412018 [details]
&gt; &gt; Patch
&gt; &gt; 
&gt; &gt; View in context:
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=412018&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/Modules/webaudio/AudioSummingJunction.cpp:97
&gt; &gt; &gt; +    std::for_each(m_outputs.begin(), m_outputs.end(), [&amp;](auto* output) {
&gt; &gt; 
&gt; &gt; Since this is a little non-standard for WebKit, what made you use
&gt; &gt; std::for_each here rather than a range-for loop? e.g.
&gt; &gt; 
&gt; &gt; for (auto output : m_outputs)
&gt; &gt;     maxChannels = std::max(maxChannels, output-&gt;numberOfChannels());
&gt; 
&gt; It actually used to be such a for-loop before I moved the code. This was my
&gt; attempt at modernizing the code. Do you prefer the for loop?
&gt; 
&gt; I believe we are using STL algorithm more and more. Here are some examples:
&gt; Source/WebCore/accessibility/AXObjectCache.cpp:   
&gt; std::for_each(m_deferredFocusedNodeChange.begin(),
&gt; m_deferredFocusedNodeChange.end(), [&amp;node](auto&amp; entry) {
&gt; Source/WebCore/platform/graphics/ImageSource.cpp:   
&gt; std::for_each(m_frameCommitQueue.begin(), m_frameCommitQueue.end(),
&gt; [this](const ImageFrameRequest&amp; frameRequest) {
&gt; Source/WebCore/Modules/encryptedmedia/MediaKeyStatusMap.cpp:    return
&gt; std::any_of(statuses.begin(), statuses.end(),
&gt; Source/WebCore/Modules/encryptedmedia/MediaKeys.cpp:    return
&gt; std::any_of(m_sessions.begin(), m_sessions.end(),
&gt; Source/WebCore/Modules/mediasource/MediaSource.cpp:    if
&gt; (std::any_of(m_sourceBuffers-&gt;begin(), m_sourceBuffers-&gt;end(), [](auto&amp;
&gt; sourceBuffer) { return sourceBuffer-&gt;updating(); }))
&gt; Source/WebCore/accessibility/AccessibilityRenderObject.cpp:        if
&gt; (std::any_of(parentTags-&gt;begin(), parentTags-&gt;end(), [&amp;name] (auto*
&gt; possibleName) { return *possibleName == name; }))
&gt; Source/WebCore/crypto/gcrypt/CryptoKeyRSAGCrypt.cpp:        if
&gt; (std::any_of(exponent.begin(), exponent.end() - 4, [](uint8_t element) {
&gt; return !!element; }))
&gt; Source/WebCore/platform/encryptedmedia/clearkey/CDMClearKey.cpp:    return
&gt; std::any_of(types.begin(), types.end(),
&gt; Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.
&gt; mm:    return std::any_of(m_activeSourceBuffers.begin(),
&gt; m_activeSourceBuffers.end(), MediaSourcePrivateAVFObjCHasAudio);
&gt; Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.
&gt; mm:    return std::any_of(m_activeSourceBuffers.begin(),
&gt; m_activeSourceBuffers.end(), [] (SourceBufferPrivateAVFObjC* sourceBuffer) {
&gt; Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.
&gt; mm:    return std::any_of(m_activeSourceBuffers.begin(),
&gt; m_activeSourceBuffers.end(), [] (SourceBufferPrivateAVFObjC* sourceBuffer) {
&gt; Source/WebCore/platform/graphics/nicosia/NicosiaAnimation.cpp:    return
&gt; std::any_of(m_animations.begin(), m_animations.end(),
&gt; Source/WebCore/platform/graphics/nicosia/NicosiaAnimation.cpp:    return
&gt; std::any_of(m_animations.begin(), m_animations.end(),
&gt; Source/WebCore/platform/graphics/texmap/TextureMapperGL.cpp:           
&gt; ASSERT(std::any_of(contextDataMap().begin(), contextDataMap().end(),
&gt; Source/WebCore/platform/graphics/texmap/TextureMapperLayer.cpp:    return
&gt; std::any_of(m_children.begin(), m_children.end(),
&gt; Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.
&gt; cpp:    bool alreadyRecorded = std::any_of(rects.begin(), rects.end(),
&gt; Source/WebCore/platform/mediastream/mac/CoreAudioCaptureDeviceManager.cpp:  
&gt; return std::any_of(devices.begin(), devices.end(), [&amp;deviceID,
&gt; deviceType](auto&amp; device) {
&gt; Source/WebCore/platform/mock/mediasource/MockMediaSourcePrivate.cpp:   
&gt; return std::any_of(m_activeSourceBuffers.begin(),
&gt; m_activeSourceBuffers.end(), MockSourceBufferPrivateHasAudio);
&gt; Source/WebCore/platform/mock/mediasource/MockMediaSourcePrivate.cpp:   
&gt; return std::any_of(m_activeSourceBuffers.begin(),
&gt; m_activeSourceBuffers.end(), MockSourceBufferPrivateHasVideo);

Personally, I like the use of the c++ algorithm functions in cases where they make it more clear what is happening than a range-for loop. That includes things like std::any_of and std::fill_n (and will like them more when we have c++20 ranges, and don&apos;t have to pass in explicit begin/end iterators). But in the case of that a range-for loop is identical or shorter, I think we should stick with it. Perhaps something to re-evaluate when we adopt c++20 ranges and can pipeline things.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1700427</commentid>
    <comment_count>9</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2020-10-21 15:38:42 -0700</bug_when>
    <thetext>(In reply to Sam Weinig from comment #8)
&gt; (In reply to Chris Dumez from comment #7)
&gt; &gt; (In reply to Sam Weinig from comment #6)
&gt; &gt; &gt; Comment on attachment 412018 [details]
&gt; &gt; &gt; Patch
&gt; &gt; &gt; 
&gt; &gt; &gt; View in context:
&gt; &gt; &gt; https://bugs.webkit.org/attachment.cgi?id=412018&amp;action=review
&gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Source/WebCore/Modules/webaudio/AudioSummingJunction.cpp:97
&gt; &gt; &gt; &gt; +    std::for_each(m_outputs.begin(), m_outputs.end(), [&amp;](auto* output) {
&gt; &gt; &gt; 
&gt; &gt; &gt; Since this is a little non-standard for WebKit, what made you use
&gt; &gt; &gt; std::for_each here rather than a range-for loop? e.g.
&gt; &gt; &gt; 
&gt; &gt; &gt; for (auto output : m_outputs)
&gt; &gt; &gt;     maxChannels = std::max(maxChannels, output-&gt;numberOfChannels());
&gt; &gt; 
&gt; &gt; It actually used to be such a for-loop before I moved the code. This was my
&gt; &gt; attempt at modernizing the code. Do you prefer the for loop?
&gt; &gt; 
&gt; &gt; I believe we are using STL algorithm more and more. Here are some examples:
&gt; &gt; Source/WebCore/accessibility/AXObjectCache.cpp:   
&gt; &gt; std::for_each(m_deferredFocusedNodeChange.begin(),
&gt; &gt; m_deferredFocusedNodeChange.end(), [&amp;node](auto&amp; entry) {
&gt; &gt; Source/WebCore/platform/graphics/ImageSource.cpp:   
&gt; &gt; std::for_each(m_frameCommitQueue.begin(), m_frameCommitQueue.end(),
&gt; &gt; [this](const ImageFrameRequest&amp; frameRequest) {
&gt; &gt; Source/WebCore/Modules/encryptedmedia/MediaKeyStatusMap.cpp:    return
&gt; &gt; std::any_of(statuses.begin(), statuses.end(),
&gt; &gt; Source/WebCore/Modules/encryptedmedia/MediaKeys.cpp:    return
&gt; &gt; std::any_of(m_sessions.begin(), m_sessions.end(),
&gt; &gt; Source/WebCore/Modules/mediasource/MediaSource.cpp:    if
&gt; &gt; (std::any_of(m_sourceBuffers-&gt;begin(), m_sourceBuffers-&gt;end(), [](auto&amp;
&gt; &gt; sourceBuffer) { return sourceBuffer-&gt;updating(); }))
&gt; &gt; Source/WebCore/accessibility/AccessibilityRenderObject.cpp:        if
&gt; &gt; (std::any_of(parentTags-&gt;begin(), parentTags-&gt;end(), [&amp;name] (auto*
&gt; &gt; possibleName) { return *possibleName == name; }))
&gt; &gt; Source/WebCore/crypto/gcrypt/CryptoKeyRSAGCrypt.cpp:        if
&gt; &gt; (std::any_of(exponent.begin(), exponent.end() - 4, [](uint8_t element) {
&gt; &gt; return !!element; }))
&gt; &gt; Source/WebCore/platform/encryptedmedia/clearkey/CDMClearKey.cpp:    return
&gt; &gt; std::any_of(types.begin(), types.end(),
&gt; &gt; Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.
&gt; &gt; mm:    return std::any_of(m_activeSourceBuffers.begin(),
&gt; &gt; m_activeSourceBuffers.end(), MediaSourcePrivateAVFObjCHasAudio);
&gt; &gt; Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.
&gt; &gt; mm:    return std::any_of(m_activeSourceBuffers.begin(),
&gt; &gt; m_activeSourceBuffers.end(), [] (SourceBufferPrivateAVFObjC* sourceBuffer) {
&gt; &gt; Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.
&gt; &gt; mm:    return std::any_of(m_activeSourceBuffers.begin(),
&gt; &gt; m_activeSourceBuffers.end(), [] (SourceBufferPrivateAVFObjC* sourceBuffer) {
&gt; &gt; Source/WebCore/platform/graphics/nicosia/NicosiaAnimation.cpp:    return
&gt; &gt; std::any_of(m_animations.begin(), m_animations.end(),
&gt; &gt; Source/WebCore/platform/graphics/nicosia/NicosiaAnimation.cpp:    return
&gt; &gt; std::any_of(m_animations.begin(), m_animations.end(),
&gt; &gt; Source/WebCore/platform/graphics/texmap/TextureMapperGL.cpp:           
&gt; &gt; ASSERT(std::any_of(contextDataMap().begin(), contextDataMap().end(),
&gt; &gt; Source/WebCore/platform/graphics/texmap/TextureMapperLayer.cpp:    return
&gt; &gt; std::any_of(m_children.begin(), m_children.end(),
&gt; &gt; Source/WebCore/platform/graphics/texmap/coordinated/CoordinatedGraphicsLayer.
&gt; &gt; cpp:    bool alreadyRecorded = std::any_of(rects.begin(), rects.end(),
&gt; &gt; Source/WebCore/platform/mediastream/mac/CoreAudioCaptureDeviceManager.cpp:  
&gt; &gt; return std::any_of(devices.begin(), devices.end(), [&amp;deviceID,
&gt; &gt; deviceType](auto&amp; device) {
&gt; &gt; Source/WebCore/platform/mock/mediasource/MockMediaSourcePrivate.cpp:   
&gt; &gt; return std::any_of(m_activeSourceBuffers.begin(),
&gt; &gt; m_activeSourceBuffers.end(), MockSourceBufferPrivateHasAudio);
&gt; &gt; Source/WebCore/platform/mock/mediasource/MockMediaSourcePrivate.cpp:   
&gt; &gt; return std::any_of(m_activeSourceBuffers.begin(),
&gt; &gt; m_activeSourceBuffers.end(), MockSourceBufferPrivateHasVideo);
&gt; 
&gt; Personally, I like the use of the c++ algorithm functions in cases where
&gt; they make it more clear what is happening than a range-for loop. That
&gt; includes things like std::any_of and std::fill_n (and will like them more
&gt; when we have c++20 ranges, and don&apos;t have to pass in explicit begin/end
&gt; iterators). But in the case of that a range-for loop is identical or
&gt; shorter, I think we should stick with it. Perhaps something to re-evaluate
&gt; when we adopt c++20 ranges and can pipeline things.

Ok. Fixed in &lt;https://trac.webkit.org/changeset/268841&gt;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1700428</commentid>
    <comment_count>10</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2020-10-21 15:39:51 -0700</bug_when>
    <thetext>(In reply to Sam Weinig from comment #8)
&gt; will like them more when we have c++20 ranges

^^^</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>412018</attachid>
            <date>2020-10-21 12:46:58 -0700</date>
            <delta_ts>2020-10-21 13:27:58 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-218045-20201021124657.patch</filename>
            <type>text/plain</type>
            <size>11080</size>
            <attacher name="Chris Dumez">cdumez</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjY4ODEyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggYTU0YzAyZjMxNjAyYTM4
YmM2MWU5NzExNzg0ZTQzMDcyOTcwZGM1MC4uNGNlODJiMTc0MjFmMTBhZGRkNDIzOTMyMzZmNzcy
OTZlZDRlMjE2NCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDM2IEBACisyMDIwLTEwLTIxICBDaHJp
cyBEdW1leiAgPGNkdW1lekBhcHBsZS5jb20+CisKKyAgICAgICAgQWRkIGFkZE91dHB1dCgpIC8g
cmVtb3ZlT3V0cHV0KCkgdXRpbGl0eSBmdW5jdGlvbnMgdG8gQXVkaW9TdW1taW5nSnVuY3Rpb24K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIxODA0NQor
CisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEFkZCBhZGRP
dXRwdXQoKSAvIHJlbW92ZU91dHB1dCgpIHV0aWxpdHkgZnVuY3Rpb25zIHRvIEF1ZGlvU3VtbWlu
Z0p1bmN0aW9uIHRvIGFkZAorICAgICAgICBvciByZW1vdmUgb3V0cHV0cyBmcm9tIG1fb3V0cHV0
cyBhbmQgYWJzdHJhY3QgYXdheSB0aGUgY2FsbCB0byBjaGFuZ2VkT3V0cHV0cygpLgorICAgICAg
ICBJdCB3YXMgYXdrd2FyZCB0aGF0IHN1YmNsYXNzZXMgd2VyZSBtb2RpZnlpbmcgbV9vdXRwdXRz
IGRpcmVjdGx5IGFuZCBoYWQgdG8KKyAgICAgICAgZXhwbGljaXRseSBjYWxsIGNoYW5nZWRPdXRw
dXRzKCkgd2hlbmV2ZXIgdGhleSBkaWQuCisKKyAgICAgICAgTm8gbmV3IHRlc3RzLCBubyB3ZWIt
ZmFjaW5nIGJlaGF2aW9yIGNoYW5nZS4KKworICAgICAgICAqIE1vZHVsZXMvd2ViYXVkaW8vQXVk
aW9Ob2RlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvTm9kZTo6dXBkYXRlQ2hhbm5lbHNG
b3JJbnB1dHMpOgorICAgICAgICAqIE1vZHVsZXMvd2ViYXVkaW8vQXVkaW9Ob2RlSW5wdXQuY3Bw
OgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Ob2RlSW5wdXQ6OmNvbm5lY3QpOgorICAgICAgICAo
V2ViQ29yZTo6QXVkaW9Ob2RlSW5wdXQ6OmRpc2Nvbm5lY3QpOgorICAgICAgICAoV2ViQ29yZTo6
QXVkaW9Ob2RlSW5wdXQ6OmRpc2FibGUpOgorICAgICAgICAoV2ViQ29yZTo6QXVkaW9Ob2RlSW5w
dXQ6OmVuYWJsZSk6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb05vZGVJbnB1dDo6bnVtYmVyT2ZD
aGFubmVscyBjb25zdCk6CisgICAgICAgICogTW9kdWxlcy93ZWJhdWRpby9BdWRpb1BhcmFtLmNw
cDoKKyAgICAgICAgKFdlYkNvcmU6OkF1ZGlvUGFyYW06OmNvbm5lY3QpOgorICAgICAgICAoV2Vi
Q29yZTo6QXVkaW9QYXJhbTo6ZGlzY29ubmVjdCk6CisgICAgICAgICogTW9kdWxlcy93ZWJhdWRp
by9BdWRpb1N1bW1pbmdKdW5jdGlvbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpBdWRpb1N1bW1p
bmdKdW5jdGlvbjo6bWFya1JlbmRlcmluZ1N0YXRlQXNEaXJ0eSk6CisgICAgICAgIChXZWJDb3Jl
OjpBdWRpb1N1bW1pbmdKdW5jdGlvbjo6YWRkT3V0cHV0KToKKyAgICAgICAgKFdlYkNvcmU6OkF1
ZGlvU3VtbWluZ0p1bmN0aW9uOjpyZW1vdmVPdXRwdXQpOgorICAgICAgICAoV2ViQ29yZTo6QXVk
aW9TdW1taW5nSnVuY3Rpb246Om1heGltdW1OdW1iZXJPZkNoYW5uZWxzIGNvbnN0KToKKyAgICAg
ICAgKFdlYkNvcmU6OkF1ZGlvU3VtbWluZ0p1bmN0aW9uOjpjaGFuZ2VkT3V0cHV0cyk6IERlbGV0
ZWQuCisgICAgICAgICogTW9kdWxlcy93ZWJhdWRpby9BdWRpb1N1bW1pbmdKdW5jdGlvbi5oOgor
CiAyMDIwLTEwLTIxICBDaHJpcyBEdW1leiAgPGNkdW1lekBhcHBsZS5jb20+CiAKICAgICAgICAg
TWFrZSBzdXJlIFdlYkF1ZGlvIEFQSSB0aHJvd3MgZXhjZXB0aW9ucyB3aXRoIHVzZWZ1bCBlcnJv
ciBtZXNzYWdlcwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9B
dWRpb05vZGUuY3BwIGIvU291cmNlL1dlYkNvcmUvTW9kdWxlcy93ZWJhdWRpby9BdWRpb05vZGUu
Y3BwCmluZGV4IGQ1YTRlMzEyYTJmNzdhMWNiYWEwYjM5Zjc3MGE2MGUzOTdhNzIzMWEuLjZmYzNm
OWExOTQ2OGZjNjdkOTE3NDAxMTJhZWY3NjkyMGFkYTg1OGYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQXVkaW9Ob2RlLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9Nb2R1bGVzL3dlYmF1ZGlvL0F1ZGlvTm9kZS5jcHAKQEAgLTQyMyw3ICs0MjMsNyBAQCBFeGNl
cHRpb25Pcjx2b2lkPiBBdWRpb05vZGU6OnNldENoYW5uZWxJbnRlcnByZXRhdGlvbihDaGFubmVs
SW50ZXJwcmV0YXRpb24gaW50ZQogdm9pZCBBdWRpb05vZGU6OnVwZGF0ZUNoYW5uZWxzRm9ySW5w
dXRzKCkKIHsKICAgICBmb3IgKGF1dG8mIGlucHV0IDogbV9pbnB1dHMpCi0gICAgICAgIGlucHV0
LT5jaGFuZ2VkT3V0cHV0cygpOworICAgICAgICBpbnB1dC0+bWFya1JlbmRlcmluZ1N0YXRlQXNE
aXJ0eSgpOwogfQogCiB2b2lkIEF1ZGlvTm9kZTo6aW5pdGlhbGl6ZURlZmF1bHROb2RlT3B0aW9u
cyh1bnNpZ25lZCBjb3VudCwgQ2hhbm5lbENvdW50TW9kZSBtb2RlLCBXZWJDb3JlOjpDaGFubmVs
SW50ZXJwcmV0YXRpb24gaW50ZXJwcmV0YXRpb24pCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9Nb2R1bGVzL3dlYmF1ZGlvL0F1ZGlvTm9kZUlucHV0LmNwcCBiL1NvdXJjZS9XZWJDb3JlL01v
ZHVsZXMvd2ViYXVkaW8vQXVkaW9Ob2RlSW5wdXQuY3BwCmluZGV4IDM0MzE4OWI0ZGM2NGU1YmEw
NGJiMTE0ZDhhNjE4MmQ4OWMwMTQ3NzQuLjg5MjBkOTE2YjEzNGZlMDc1OWI3NWJiZDdmODY2NjJm
ZDI4MjFjZGQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQXVk
aW9Ob2RlSW5wdXQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQXVk
aW9Ob2RlSW5wdXQuY3BwCkBAIC01MywxMyArNTMsMTQgQEAgdm9pZCBBdWRpb05vZGVJbnB1dDo6
Y29ubmVjdChBdWRpb05vZGVPdXRwdXQqIG91dHB1dCkKICAgICBpZiAoIW91dHB1dCB8fCAhbm9k
ZSgpKQogICAgICAgICByZXR1cm47CiAKLSAgICBhdXRvJiBvdXRwdXRzTWFwID0gb3V0cHV0LT5p
c0VuYWJsZWQoKSA/IG1fb3V0cHV0cyA6IG1fZGlzYWJsZWRPdXRwdXRzOwotICAgIC8vIENoZWNr
IGlmIHdlJ3JlIGFscmVhZHkgY29ubmVjdGVkIHRvIHRoaXMgb3V0cHV0LgotICAgIGlmICghb3V0
cHV0c01hcC5hZGQob3V0cHV0KS5pc05ld0VudHJ5KQotICAgICAgICByZXR1cm47Ci0KLSAgICBv
dXRwdXQtPmFkZElucHV0KHRoaXMpOwotICAgIGNoYW5nZWRPdXRwdXRzKCk7CisgICAgYXV0byBh
ZGRQb3RlbnRpYWxseURpc2FibGVkT3V0cHV0ID0gW3RoaXNdKEF1ZGlvTm9kZU91dHB1dCYgb3V0
cHV0KSB7CisgICAgICAgIGlmIChvdXRwdXQuaXNFbmFibGVkKCkpCisgICAgICAgICAgICByZXR1
cm4gYWRkT3V0cHV0KG91dHB1dCk7CisgICAgICAgIHJldHVybiBtX2Rpc2FibGVkT3V0cHV0cy5h
ZGQoJm91dHB1dCkuaXNOZXdFbnRyeTsKKyAgICB9OworCisgICAgaWYgKGFkZFBvdGVudGlhbGx5
RGlzYWJsZWRPdXRwdXQoKm91dHB1dCkpCisgICAgICAgIG91dHB1dC0+YWRkSW5wdXQodGhpcyk7
CiB9CiAKIHZvaWQgQXVkaW9Ob2RlSW5wdXQ6OmRpc2Nvbm5lY3QoQXVkaW9Ob2RlT3V0cHV0KiBv
dXRwdXQpCkBAIC03MSw4ICs3Miw3IEBAIHZvaWQgQXVkaW9Ob2RlSW5wdXQ6OmRpc2Nvbm5lY3Qo
QXVkaW9Ob2RlT3V0cHV0KiBvdXRwdXQpCiAgICAgICAgIHJldHVybjsKIAogICAgIC8vIEZpcnN0
IHRyeSB0byBkaXNjb25uZWN0IGZyb20gImFjdGl2ZSIgY29ubmVjdGlvbnMuCi0gICAgaWYgKG1f
b3V0cHV0cy5yZW1vdmUob3V0cHV0KSkgewotICAgICAgICBjaGFuZ2VkT3V0cHV0cygpOworICAg
IGlmIChyZW1vdmVPdXRwdXQoKm91dHB1dCkpIHsKICAgICAgICAgb3V0cHV0LT5yZW1vdmVJbnB1
dCh0aGlzKTsgLy8gTm90ZTogaXQncyBpbXBvcnRhbnQgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IGFm
dGVyIHRoaXMgc2luY2UgdGhlIG5vZGUgbWF5IGJlIGRlbGV0ZWQuCiAgICAgICAgIHJldHVybjsK
ICAgICB9CkBAIC05NCwxMSArOTQsOSBAQCB2b2lkIEF1ZGlvTm9kZUlucHV0OjpkaXNhYmxlKEF1
ZGlvTm9kZU91dHB1dCogb3V0cHV0KQogICAgIGlmICghb3V0cHV0IHx8ICFub2RlKCkpCiAgICAg
ICAgIHJldHVybjsKIAotICAgIEFTU0VSVChtX291dHB1dHMuY29udGFpbnMob3V0cHV0KSk7Ci0g
ICAgCiAgICAgbV9kaXNhYmxlZE91dHB1dHMuYWRkKG91dHB1dCk7Ci0gICAgbV9vdXRwdXRzLnJl
bW92ZShvdXRwdXQpOwotICAgIGNoYW5nZWRPdXRwdXRzKCk7CisgICAgYm9vbCB3YXNSZW1vdmVk
ID0gcmVtb3ZlT3V0cHV0KCpvdXRwdXQpOworICAgIEFTU0VSVF9VTlVTRUQod2FzUmVtb3ZlZCwg
d2FzUmVtb3ZlZCk7CiAKICAgICAvLyBQcm9wYWdhdGUgZGlzYWJsZWQgc3RhdGUgdG8gb3V0cHV0
cy4KICAgICBub2RlKCktPmRpc2FibGVPdXRwdXRzSWZOZWNlc3NhcnkoKTsKQEAgLTExNSw5ICsx
MTMsOCBAQCB2b2lkIEF1ZGlvTm9kZUlucHV0OjplbmFibGUoQXVkaW9Ob2RlT3V0cHV0KiBvdXRw
dXQpCiAgICAgQVNTRVJUKG1fZGlzYWJsZWRPdXRwdXRzLmNvbnRhaW5zKG91dHB1dCkpOwogCiAg
ICAgLy8gTW92ZSBvdXRwdXQgZnJvbSBkaXNhYmxlZCBsaXN0IHRvIGFjdGl2ZSBsaXN0LgotICAg
IG1fb3V0cHV0cy5hZGQob3V0cHV0KTsKKyAgICBhZGRPdXRwdXQoKm91dHB1dCk7CiAgICAgbV9k
aXNhYmxlZE91dHB1dHMucmVtb3ZlKG91dHB1dCk7Ci0gICAgY2hhbmdlZE91dHB1dHMoKTsKIAog
ICAgIC8vIFByb3BhZ2F0ZSBlbmFibGVkIHN0YXRlIHRvIG91dHB1dHMuCiAgICAgbm9kZSgpLT5l
bmFibGVPdXRwdXRzSWZOZWNlc3NhcnkoKTsKQEAgLTE0NywxMyArMTQ0LDcgQEAgdW5zaWduZWQg
QXVkaW9Ob2RlSW5wdXQ6Om51bWJlck9mQ2hhbm5lbHMoKSBjb25zdAogICAgICAgICByZXR1cm4g
bm9kZSgpLT5jaGFubmVsQ291bnQoKTsKIAogICAgIC8vIEZpbmQgdGhlIG51bWJlciBvZiBjaGFu
bmVscyBvZiB0aGUgY29ubmVjdGlvbiB3aXRoIHRoZSBsYXJnZXN0IG51bWJlciBvZiBjaGFubmVs
cy4KLSAgICB1bnNpZ25lZCBtYXhDaGFubmVscyA9IDE7IC8vIG9uZSBjaGFubmVsIGlzIHRoZSBt
aW5pbXVtIGFsbG93ZWQKLQotICAgIGZvciAoYXV0byYgb3V0cHV0IDogbV9vdXRwdXRzKSB7Ci0g
ICAgICAgIC8vIFVzZSBvdXRwdXQoKS0+bnVtYmVyT2ZDaGFubmVscygpIGluc3RlYWQgb2Ygb3V0
cHV0LT5idXMoKS0+bnVtYmVyT2ZDaGFubmVscygpLAotICAgICAgICAvLyBiZWNhdXNlIHRoZSBj
YWxsaW5nIG9mIEF1ZGlvTm9kZU91dHB1dDo6YnVzKCkgaXMgbm90IHNhZmUgaGVyZS4KLSAgICAg
ICAgbWF4Q2hhbm5lbHMgPSBzdGQ6Om1heChtYXhDaGFubmVscywgb3V0cHV0LT5udW1iZXJPZkNo
YW5uZWxzKCkpOwotICAgIH0KKyAgICB1bnNpZ25lZCBtYXhDaGFubmVscyA9IHN0ZDo6bWF4KG1h
eGltdW1OdW1iZXJPZkNoYW5uZWxzKCksIDF1KTsgLy8gT25lIGNoYW5uZWwgaXMgdGhlIG1pbmlt
dW0gYWxsb3dlZC4KIAogICAgIGlmIChtb2RlID09IENoYW5uZWxDb3VudE1vZGU6OkNsYW1wZWRN
YXgpCiAgICAgICAgIG1heENoYW5uZWxzID0gc3RkOjptaW4obWF4Q2hhbm5lbHMsIHN0YXRpY19j
YXN0PHVuc2lnbmVkPihub2RlKCktPmNoYW5uZWxDb3VudCgpKSk7CmRpZmYgLS1naXQgYS9Tb3Vy
Y2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0F1ZGlvUGFyYW0uY3BwIGIvU291cmNlL1dlYkNv
cmUvTW9kdWxlcy93ZWJhdWRpby9BdWRpb1BhcmFtLmNwcAppbmRleCBhMTQyMGJiYWI5NjM2NTRi
MzYwOGNkZmExNGRjMDlmMDkyMmIxMDIxLi4zNTk4NDdkNzdkMzkwOTY0MDVlNzExNTM5MzdjZWYw
N2JhYTU4ZTRjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0F1
ZGlvUGFyYW0uY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQXVkaW9Q
YXJhbS5jcHAKQEAgLTMyMCwxMyArMzIwLDExIEBAIHZvaWQgQXVkaW9QYXJhbTo6Y29ubmVjdChB
dWRpb05vZGVPdXRwdXQqIG91dHB1dCkKICAgICBpZiAoIW91dHB1dCkKICAgICAgICAgcmV0dXJu
OwogCi0gICAgaWYgKCFtX291dHB1dHMuYWRkKG91dHB1dCkuaXNOZXdFbnRyeSkKKyAgICBpZiAo
IWFkZE91dHB1dCgqb3V0cHV0KSkKICAgICAgICAgcmV0dXJuOwogCiAgICAgSU5GT19MT0coTE9H
SURFTlRJRklFUiwgb3V0cHV0LT5ub2RlKCktPm5vZGVUeXBlKCkpOwotCiAgICAgb3V0cHV0LT5h
ZGRQYXJhbSh0aGlzKTsKLSAgICBjaGFuZ2VkT3V0cHV0cygpOwogfQogCiB2b2lkIEF1ZGlvUGFy
YW06OmRpc2Nvbm5lY3QoQXVkaW9Ob2RlT3V0cHV0KiBvdXRwdXQpCkBAIC0zMzksMTAgKzMzNyw4
IEBAIHZvaWQgQXVkaW9QYXJhbTo6ZGlzY29ubmVjdChBdWRpb05vZGVPdXRwdXQqIG91dHB1dCkK
IAogICAgIElORk9fTE9HKExPR0lERU5USUZJRVIsIG91dHB1dC0+bm9kZSgpLT5ub2RlVHlwZSgp
KTsKIAotICAgIGlmIChtX291dHB1dHMucmVtb3ZlKG91dHB1dCkpIHsKLSAgICAgICAgY2hhbmdl
ZE91dHB1dHMoKTsKKyAgICBpZiAocmVtb3ZlT3V0cHV0KCgqb3V0cHV0KSkpCiAgICAgICAgIG91
dHB1dC0+cmVtb3ZlUGFyYW0odGhpcyk7Ci0gICAgfQogfQogCiAjaWYgIVJFTEVBU0VfTE9HX0RJ
U0FCTEVECmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0F1ZGlv
U3VtbWluZ0p1bmN0aW9uLmNwcCBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQXVk
aW9TdW1taW5nSnVuY3Rpb24uY3BwCmluZGV4IDEyOGI0N2I2YjEzYjIzNjc1NThlODVlZTdkNWQ3
OTAwNWRjMTZhNDYuLjI1YTdkZTE4NWEyMTRkMmU2YzA1ZTNmZTEzYzUzNmJmMmVmMjQzZjMgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQXVkaW9TdW1taW5nSnVu
Y3Rpb24uY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQXVkaW9TdW1t
aW5nSnVuY3Rpb24uY3BwCkBAIC00NSw3ICs0NSw3IEBAIEF1ZGlvU3VtbWluZ0p1bmN0aW9uOjp+
QXVkaW9TdW1taW5nSnVuY3Rpb24oKQogICAgICAgICBjb250ZXh0KCkucmVtb3ZlTWFya2VkU3Vt
bWluZ0p1bmN0aW9uKHRoaXMpOwogfQogCi12b2lkIEF1ZGlvU3VtbWluZ0p1bmN0aW9uOjpjaGFu
Z2VkT3V0cHV0cygpCit2b2lkIEF1ZGlvU3VtbWluZ0p1bmN0aW9uOjptYXJrUmVuZGVyaW5nU3Rh
dGVBc0RpcnR5KCkKIHsKICAgICBBU1NFUlQoY29udGV4dCgpLmlzR3JhcGhPd25lcigpKTsKICAg
ICBpZiAoIW1fcmVuZGVyaW5nU3RhdGVOZWVkVXBkYXRpbmcgJiYgY2FuVXBkYXRlU3RhdGUoKSkg
ewpAQCAtNTQsNiArNTQsMjQgQEAgdm9pZCBBdWRpb1N1bW1pbmdKdW5jdGlvbjo6Y2hhbmdlZE91
dHB1dHMoKQogICAgIH0KIH0KIAorYm9vbCBBdWRpb1N1bW1pbmdKdW5jdGlvbjo6YWRkT3V0cHV0
KEF1ZGlvTm9kZU91dHB1dCYgb3V0cHV0KQoreworICAgIEFTU0VSVChjb250ZXh0KCkuaXNHcmFw
aE93bmVyKCkpOworICAgIGlmICghbV9vdXRwdXRzLmFkZCgmb3V0cHV0KS5pc05ld0VudHJ5KQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgbWFya1JlbmRlcmluZ1N0YXRlQXNEaXJ0eSgpOwor
ICAgIHJldHVybiB0cnVlOworfQorCitib29sIEF1ZGlvU3VtbWluZ0p1bmN0aW9uOjpyZW1vdmVP
dXRwdXQoQXVkaW9Ob2RlT3V0cHV0JiBvdXRwdXQpCit7CisgICAgQVNTRVJUKGNvbnRleHQoKS5p
c0dyYXBoT3duZXIoKSk7CisgICAgaWYgKCFtX291dHB1dHMucmVtb3ZlKCZvdXRwdXQpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgbWFya1JlbmRlcmluZ1N0YXRlQXNEaXJ0eSgpOworICAg
IHJldHVybiB0cnVlOworfQorCiB2b2lkIEF1ZGlvU3VtbWluZ0p1bmN0aW9uOjp1cGRhdGVSZW5k
ZXJpbmdTdGF0ZSgpCiB7CiAgICAgQVNTRVJUKGNvbnRleHQoKS5pc0F1ZGlvVGhyZWFkKCkgJiYg
Y29udGV4dCgpLmlzR3JhcGhPd25lcigpKTsKQEAgLTczLDYgKzkxLDE3IEBAIHZvaWQgQXVkaW9T
dW1taW5nSnVuY3Rpb246OnVwZGF0ZVJlbmRlcmluZ1N0YXRlKCkKICAgICB9CiB9CiAKK3Vuc2ln
bmVkIEF1ZGlvU3VtbWluZ0p1bmN0aW9uOjptYXhpbXVtTnVtYmVyT2ZDaGFubmVscygpIGNvbnN0
Cit7CisgICAgdW5zaWduZWQgbWF4Q2hhbm5lbHMgPSAwOworICAgIHN0ZDo6Zm9yX2VhY2gobV9v
dXRwdXRzLmJlZ2luKCksIG1fb3V0cHV0cy5lbmQoKSwgWyZdKGF1dG8qIG91dHB1dCkgeworICAg
ICAgICAvLyBVc2Ugb3V0cHV0KCktPm51bWJlck9mQ2hhbm5lbHMoKSBpbnN0ZWFkIG9mIG91dHB1
dC0+YnVzKCktPm51bWJlck9mQ2hhbm5lbHMoKSwKKyAgICAgICAgLy8gYmVjYXVzZSB0aGUgY2Fs
bGluZyBvZiBBdWRpb05vZGVPdXRwdXQ6OmJ1cygpIGlzIG5vdCBzYWZlIGhlcmUuCisgICAgICAg
IG1heENoYW5uZWxzID0gc3RkOjptYXgobWF4Q2hhbm5lbHMsIG91dHB1dC0+bnVtYmVyT2ZDaGFu
bmVscygpKTsKKyAgICB9KTsKKyAgICByZXR1cm4gbWF4Q2hhbm5lbHM7Cit9CisKIH0gLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKIAogI2VuZGlmIC8vIEVOQUJMRShXRUJfQVVESU8pCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0F1ZGlvU3VtbWluZ0p1bmN0aW9uLmgg
Yi9Tb3VyY2UvV2ViQ29yZS9Nb2R1bGVzL3dlYmF1ZGlvL0F1ZGlvU3VtbWluZ0p1bmN0aW9uLmgK
aW5kZXggZjI1ZWRkZmUzZTg5MTFlYzE5MGVmMzdhNTA5NzE5YzAyMzRkMzY4OC4uYTUxMjg2YWNi
YmZhOGE5YTc1NGVkMTc5YTIyNzMzOGYxMDE2NTI3NSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNv
cmUvTW9kdWxlcy93ZWJhdWRpby9BdWRpb1N1bW1pbmdKdW5jdGlvbi5oCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL01vZHVsZXMvd2ViYXVkaW8vQXVkaW9TdW1taW5nSnVuY3Rpb24uaApAQCAtNDQsOSAr
NDQsNiBAQCBwdWJsaWM6CiAgICAgQmFzZUF1ZGlvQ29udGV4dCYgY29udGV4dCgpIHsgcmV0dXJu
IG1fY29udGV4dDsgfQogICAgIGNvbnN0IEJhc2VBdWRpb0NvbnRleHQmIGNvbnRleHQoKSBjb25z
dCB7IHJldHVybiBtX2NvbnRleHQ7IH0KIAotICAgIC8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgd2hl
bmV2ZXIgd2UgbW9kaWZ5IG1fb3V0cHV0cy4KLSAgICB2b2lkIGNoYW5nZWRPdXRwdXRzKCk7Ci0K
ICAgICAvLyBUaGlzIGNvcGllcyBtX291dHB1dHMgdG8gbV9yZW5kZXJpbmdPdXRwdXRzLiBQbGVh
c2Ugc2VlIGNvbW1lbnRzIGZvciB0aGVzZSBsaXN0cyBiZWxvdy4KICAgICAvLyBUaGlzIG11c3Qg
YmUgY2FsbGVkIHdoZW4gd2Ugb3duIHRoZSBjb250ZXh0J3MgZ3JhcGggbG9jayBpbiB0aGUgYXVk
aW8gdGhyZWFkIGF0IHRoZSB2ZXJ5IHN0YXJ0IG9yIGVuZCBvZiB0aGUgcmVuZGVyIHF1YW50dW0u
CiAgICAgdm9pZCB1cGRhdGVSZW5kZXJpbmdTdGF0ZSgpOwpAQCAtNjAsMTcgKzU3LDIwIEBAIHB1
YmxpYzoKICAgICB2aXJ0dWFsIGJvb2wgY2FuVXBkYXRlU3RhdGUoKSA9IDA7CiAgICAgdmlydHVh
bCB2b2lkIGRpZFVwZGF0ZSgpID0gMDsKIAorICAgIGJvb2wgYWRkT3V0cHV0KEF1ZGlvTm9kZU91
dHB1dCYpOworICAgIGJvb2wgcmVtb3ZlT3V0cHV0KEF1ZGlvTm9kZU91dHB1dCYpOworCisgICAg
dm9pZCBtYXJrUmVuZGVyaW5nU3RhdGVBc0RpcnR5KCk7CisKIHByb3RlY3RlZDoKICAgICBSZWY8
QmFzZUF1ZGlvQ29udGV4dD4gbV9jb250ZXh0OwogCi0gICAgLy8gbV9vdXRwdXRzIGNvbnRhaW5z
IHRoZSBBdWRpb05vZGVPdXRwdXRzIHJlcHJlc2VudGluZyBjdXJyZW50IGNvbm5lY3Rpb25zIHdo
aWNoIGFyZSBub3QgZGlzYWJsZWQuCi0gICAgLy8gVGhlIHJlbmRlcmluZyBjb2RlIHNob3VsZCBu
ZXZlciB1c2UgdGhpcyBkaXJlY3RseSwgYnV0IGluc3RlYWQgdXNlcyBtX3JlbmRlcmluZ091dHB1
dHMuCi0gICAgSGFzaFNldDxBdWRpb05vZGVPdXRwdXQqPiBtX291dHB1dHM7Ci0KICAgICAvLyBu
dW1iZXJPZkNvbm5lY3Rpb25zKCkgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBmcm9tIHRoZSBhdWRp
byByZW5kZXJpbmcgdGhyZWFkLgogICAgIC8vIEluc3RlYWQgbnVtYmVyT2ZSZW5kZXJpbmdDb25u
ZWN0aW9ucygpIGFuZCByZW5kZXJpbmdPdXRwdXQoKSBzaG91bGQgYmUgdXNlZC4KICAgICB1bnNp
Z25lZCBudW1iZXJPZkNvbm5lY3Rpb25zKCkgY29uc3QgeyByZXR1cm4gbV9vdXRwdXRzLnNpemUo
KTsgfQogCisgICAgdW5zaWduZWQgbWF4aW11bU51bWJlck9mQ2hhbm5lbHMoKSBjb25zdDsKKwog
ICAgIC8vIG1fcmVuZGVyaW5nT3V0cHV0cyBpcyBhIGNvcHkgb2YgbV9vdXRwdXRzIHdoaWNoIHdp
bGwgbmV2ZXIgYmUgbW9kaWZpZWQgZHVyaW5nIHRoZSBncmFwaCByZW5kZXJpbmcgb24gdGhlIGF1
ZGlvIHRocmVhZC4KICAgICAvLyBUaGlzIGlzIHRoZSBsaXN0IHdoaWNoIGlzIHVzZWQgYnkgdGhl
IHJlbmRlcmluZyBjb2RlLgogICAgIC8vIFdoZW5ldmVyIG1fb3V0cHV0cyBpcyBtb2RpZmllZCwg
dGhlIGNvbnRleHQgaXMgdG9sZCBzbyBpdCBjYW4gbGF0ZXIgdXBkYXRlIG1fcmVuZGVyaW5nT3V0
cHV0cyBmcm9tIG1fb3V0cHV0cyBhdCBhIHNhZmUgdGltZS4KQEAgLTc5LDYgKzc5LDExIEBAIHBy
b3RlY3RlZDoKIAogICAgIC8vIG1fcmVuZGVyaW5nU3RhdGVOZWVkVXBkYXRpbmcga2VlcHMgdHJh
Y2sgaWYgbV9vdXRwdXRzIGlzIG1vZGlmaWVkLgogICAgIGJvb2wgbV9yZW5kZXJpbmdTdGF0ZU5l
ZWRVcGRhdGluZyB7IGZhbHNlIH07CisKK3ByaXZhdGU6CisgICAgLy8gbV9vdXRwdXRzIGNvbnRh
aW5zIHRoZSBBdWRpb05vZGVPdXRwdXRzIHJlcHJlc2VudGluZyBjdXJyZW50IGNvbm5lY3Rpb25z
IHdoaWNoIGFyZSBub3QgZGlzYWJsZWQuCisgICAgLy8gVGhlIHJlbmRlcmluZyBjb2RlIHNob3Vs
ZCBuZXZlciB1c2UgdGhpcyBkaXJlY3RseSwgYnV0IGluc3RlYWQgdXNlcyBtX3JlbmRlcmluZ091
dHB1dHMuCisgICAgSGFzaFNldDxBdWRpb05vZGVPdXRwdXQqPiBtX291dHB1dHM7CiB9OwogCiB9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCg==
</data>

          </attachment>
      

    </bug>

</bugzilla>