<?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>65400</bug_id>
          
          <creation_ts>2011-07-29 16:11:00 -0700</creation_ts>
          <short_desc>Adopt AVCF media back end on Windows</short_desc>
          <delta_ts>2011-08-04 13:14:39 -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>Media</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>65552</dependson>
    
    <dependson>65634</dependson>
    
    <dependson>65660</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Jeff Miller">jeffm</reporter>
          <assigned_to name="Jeff Miller">jeffm</assigned_to>
          <cc>aroben</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>jeffm</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>444162</commentid>
    <comment_count>0</comment_count>
    <who name="Jeff Miller">jeffm</who>
    <bug_when>2011-07-29 16:11:00 -0700</bug_when>
    <thetext>Adopt AVFoundation / AVCF media back end on Windows.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>444163</commentid>
    <comment_count>1</comment_count>
    <who name="Jeff Miller">jeffm</who>
    <bug_when>2011-07-29 16:11:08 -0700</bug_when>
    <thetext>&lt;rdar://problem/9083559&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>444169</commentid>
    <comment_count>2</comment_count>
      <attachid>102409</attachid>
    <who name="Jeff Miller">jeffm</who>
    <bug_when>2011-07-29 16:27:11 -0700</bug_when>
    <thetext>Created attachment 102409
Make MediaPlayerPrivateAVFoundation::setDelayCallbacks() const

Required by the Windows subclass of MediaPlayerPrivateAVFoundation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>444189</commentid>
    <comment_count>3</comment_count>
      <attachid>102412</attachid>
    <who name="Jeff Miller">jeffm</who>
    <bug_when>2011-07-29 17:17:10 -0700</bug_when>
    <thetext>Created attachment 102412
Prepare WebCore.vcproj to support AVCF media back end on Windows</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>444190</commentid>
    <comment_count>4</comment_count>
      <attachid>102412</attachid>
    <who name="Jeff Miller">jeffm</who>
    <bug_when>2011-07-29 17:18:48 -0700</bug_when>
    <thetext>Comment on attachment 102412
Prepare WebCore.vcproj to support AVCF media back end on Windows

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

&gt; Source/WebCore/ChangeLog:11
&gt; +         No changes to functionality so no new tests.

I&apos;ve already removed the extra leading space.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>444197</commentid>
    <comment_count>5</comment_count>
      <attachid>102412</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-07-29 17:38:27 -0700</bug_when>
    <thetext>Comment on attachment 102412
Prepare WebCore.vcproj to support AVCF media back end on Windows

Thanks. Seems fine to add these files like this and then fill them in later.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>444198</commentid>
    <comment_count>6</comment_count>
      <attachid>102409</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-07-29 17:40:04 -0700</bug_when>
    <thetext>Comment on attachment 102409
Make MediaPlayerPrivateAVFoundation::setDelayCallbacks() const

I guess this is OK, but it makes me wonder why a const function could do something that could trigger a callback. Maybe such a function shouldn’t really be const!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>444200</commentid>
    <comment_count>7</comment_count>
    <who name="Jeff Miller">jeffm</who>
    <bug_when>2011-07-29 17:45:28 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; (From update of attachment 102409 [details])
&gt; I guess this is OK, but it makes me wonder why a const function could do something that could trigger a callback. Maybe such a function shouldn’t really be const!

Yes, that was the other option that Eric and I considered, and Eric felt that using mutable was a suitable solution.  Thanks for the review!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>444202</commentid>
    <comment_count>8</comment_count>
    <who name="Jeff Miller">jeffm</who>
    <bug_when>2011-07-29 17:49:09 -0700</bug_when>
    <thetext>Patch to make MediaPlayerPrivateAVFoundation::setDelayCallbacks() const landed in &lt;http://trac.webkit.org/changeset/92034&gt;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>444204</commentid>
    <comment_count>9</comment_count>
    <who name="Jeff Miller">jeffm</who>
    <bug_when>2011-07-29 17:52:38 -0700</bug_when>
    <thetext>Patch to prepare WebCore.vcproj to support AVCF media back end on Windows landed in &lt;http://trac.webkit.org/changeset/92035&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>446244</commentid>
    <comment_count>10</comment_count>
      <attachid>102865</attachid>
    <who name="Jeff Miller">jeffm</who>
    <bug_when>2011-08-03 17:54:39 -0700</bug_when>
    <thetext>Created attachment 102865
First cut at implementing AVCF support on Windows.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>446246</commentid>
    <comment_count>11</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-08-03 17:56:08 -0700</bug_when>
    <thetext>Attachment 102865 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCor...&quot; exit_code: 1

Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.h:47:  The parameter name &quot;player&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:34:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:45:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:47:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:48:  Alphabetical sorting problem.  [build/include_order] [4]
Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:85:  The parameter name &quot;rect&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:134:  Missing space inside { }.  [whitespace/braces] [5]
Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:885:  One line control clauses should not use braces.  [whitespace/braces] [4]
Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:1016:  One line control clauses should not use braces.  [whitespace/braces] [4]
Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:1057:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:1107:  Tab found; better to use spaces  [whitespace/tab] [1]
Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:1156:  Extra space before )  [whitespace/parens] [2]
Total errors found: 12 in 8 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>446248</commentid>
    <comment_count>12</comment_count>
      <attachid>102865</attachid>
    <who name="Brian Weinstein">bweinstein</who>
    <bug_when>2011-08-03 18:04:17 -0700</bug_when>
    <thetext>Comment on attachment 102865
First cut at implementing AVCF support on Windows.

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

&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp:782
&gt; +         contentsNeedsDisplay();

Spacing is a little bit weird here.

&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h:284
&gt; +#endif // MediaPlayerPrivateAVFoundation_h

A blank line between these end ifs would be nice.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>446249</commentid>
    <comment_count>13</comment_count>
    <who name="Jeff Miller">jeffm</who>
    <bug_when>2011-08-03 18:06:42 -0700</bug_when>
    <thetext>Note this is now &lt;rdar://problem/9894105&gt;, not &lt;rdar://problem/9083559&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>446250</commentid>
    <comment_count>14</comment_count>
      <attachid>102865</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-08-03 18:09:35 -0700</bug_when>
    <thetext>Comment on attachment 102865
First cut at implementing AVCF support on Windows.

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

Looks good.

&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp:782
&gt; +         contentsNeedsDisplay();

Indented here by an extra space.

&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:176
&gt; +    static CFArrayRef keys;
&gt; +    if (!keys) {
&gt; +        static const CFStringRef keyNames[] = {
&gt; +            AVCFAssetPropertyDuration,
&gt; +            AVCFAssetPropertyNaturalSize,
&gt; +            AVCFAssetPropertyPreferredTransform,
&gt; +            AVCFAssetPropertyPreferredRate,
&gt; +            AVCFAssetPropertyPlayable,
&gt; +            AVCFAssetPropertyTracks 
&gt; +        };
&gt; +        keys = CFArrayCreate(0, (const void**)keyNames, sizeof(keyNames) / sizeof(keyNames[0]), &amp;kCFTypeArrayCallBacks);
&gt; +    }
&gt; +    return keys;

I suggest putting the creation of the array in a separate create function, then you can just do it like this:

    static CFArrayRef keys = createMetadataKeysArray();
    return keys;

&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:613
&gt; +    return static_cast&lt;unsigned&gt;(totalMediaSize);

What makes it safe to cast this to unsigned?

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:1057
&gt;&gt; +    AVCFAssetLoadValuesAsynchronouslyForProperties(avAsset(), metadataKeyNames(), loadMetadataCompletionCallback, this);	
&gt; 
&gt; Tab found; better to use spaces  [whitespace/tab] [1]

Tab is at the end of this line.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>446251</commentid>
    <comment_count>15</comment_count>
      <attachid>102865</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2011-08-03 18:09:53 -0700</bug_when>
    <thetext>Comment on attachment 102865
First cut at implementing AVCF support on Windows.

Please fix the things the style bot complained about.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>446253</commentid>
    <comment_count>16</comment_count>
    <who name="Jeff Miller">jeffm</who>
    <bug_when>2011-08-03 18:10:39 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; (From update of attachment 102865 [details])
&gt; Please fix the things the style bot complained about.

Yup, working on that now, as well as Brian&apos;s comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>446260</commentid>
    <comment_count>17</comment_count>
      <attachid>102865</attachid>
    <who name="Jeff Miller">jeffm</who>
    <bug_when>2011-08-03 18:25:16 -0700</bug_when>
    <thetext>Comment on attachment 102865
First cut at implementing AVCF support on Windows.

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

&gt;&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.cpp:782
&gt;&gt;&gt; +         contentsNeedsDisplay();
&gt;&gt; 
&gt;&gt; Spacing is a little bit weird here.
&gt; 
&gt; Indented here by an extra space.

Fixed.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundation.h:284
&gt;&gt; +#endif // MediaPlayerPrivateAVFoundation_h
&gt; 
&gt; A blank line between these end ifs would be nice.

Fixed, also added a comment on the #endif for namespace WebCore above these two

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:34
&gt;&gt; +#include &quot;FloatConversion.h&quot;
&gt; 
&gt; Alphabetical sorting problem.  [build/include_order] [4]

Fixed.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:45
&gt;&gt; +#include &lt;wtf/Threading.h&gt;
&gt; 
&gt; Alphabetical sorting problem.  [build/include_order] [4]

Fixed.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:47
&gt;&gt; +#include &lt;AVFoundationCF/AVFoundationCF.h&gt;
&gt; 
&gt; Alphabetical sorting problem.  [build/include_order] [4]

Fixed.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:48
&gt;&gt; +#include &lt;AVFoundationCF/AVCFPlayerLayer.h&gt;
&gt; 
&gt; Alphabetical sorting problem.  [build/include_order] [4]

Fixed.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:85
&gt;&gt; +    RetainPtr&lt;CGImageRef&gt; createImageForTimeInRect(float time, const IntRect&amp; rect);
&gt; 
&gt; The parameter name &quot;rect&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]

Fixed.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:134
&gt;&gt; +    LayerClient(AVFWrapper* parent) : m_parent(parent) {}
&gt; 
&gt; Missing space inside { }.  [whitespace/braces] [5]

Fixed.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:176
&gt;&gt; +    return keys;
&gt; 
&gt; I suggest putting the creation of the array in a separate create function, then you can just do it like this:
&gt; 
&gt;     static CFArrayRef keys = createMetadataKeysArray();
&gt;     return keys;

Sounds good, will do.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:613
&gt;&gt; +    return static_cast&lt;unsigned&gt;(totalMediaSize);
&gt; 
&gt; What makes it safe to cast this to unsigned?

This isn&apos;t a good answer, but we&apos;re already doing the same thing on the Mac in MediaPlayerPrivateAVFoundationObjC::totalBytes().  I will add a FIXME for now and talk to Eric about this tomorrow.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:885
&gt;&gt; +        }
&gt; 
&gt; One line control clauses should not use braces.  [whitespace/braces] [4]

Fixed.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:1016
&gt;&gt; +    }
&gt; 
&gt; One line control clauses should not use braces.  [whitespace/braces] [4]

Fixed.

&gt;&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:1057
&gt;&gt;&gt; +    AVCFAssetLoadValuesAsynchronouslyForProperties(avAsset(), metadataKeyNames(), loadMetadataCompletionCallback, this);	
&gt;&gt; 
&gt;&gt; Tab found; better to use spaces  [whitespace/tab] [1]
&gt; 
&gt; Tab is at the end of this line.

Fixed.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:1107
&gt;&gt; +	CACFLayerInsertSublayer(m_videoLayerWrapper-&gt;platformLayer(), m_caVideoLayer.get(), 0);
&gt; 
&gt; Tab found; better to use spaces  [whitespace/tab] [1]

Fixed.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:1156
&gt;&gt; +    AVCFAssetImageGeneratorSetApertureMode(m_imageGenerator.get(), AVCFAssetImageGeneratorApertureModeCleanAperture );
&gt; 
&gt; Extra space before )  [whitespace/parens] [2]

Fixed.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.h:47
&gt;&gt; +    static PassOwnPtr&lt;MediaPlayerPrivateInterface&gt; create(MediaPlayer* player);
&gt; 
&gt; The parameter name &quot;player&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>446487</commentid>
    <comment_count>18</comment_count>
      <attachid>102865</attachid>
    <who name="Adam Roben (:aroben)">aroben</who>
    <bug_when>2011-08-04 07:34:29 -0700</bug_when>
    <thetext>Comment on attachment 102865
First cut at implementing AVCF support on Windows.

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

&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:58
&gt; +#pragma comment(lib, &quot;AVFoundationCF.lib&quot;)
&gt; +#pragma comment(lib, &quot;CoreMedia.lib&quot;)
&gt; +#pragma comment(lib, &quot;libdispatch.lib&quot;)
&gt; +
&gt; +// Use the soft link macros so we can easily test for the existence of the dlls.
&gt; +SOFT_LINK_LIBRARY(AVFoundationCF)
&gt; +SOFT_LINK_LIBRARY(CoreMedia)
&gt; +SOFT_LINK_LIBRARY(libdispatch)

It doesn&apos;t seem right to both link against and delay-load these DLLs. Also, we should be linking/loading the _debug variants in Debug_All builds.

&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:60
&gt; +using namespace WTF;

Is this really needed?

&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:66
&gt; +class LayerClient;
&gt; +class AVFWrapper {

Missing a blank line here.

&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:69
&gt; +public:
&gt; +
&gt; +    AVFWrapper(MediaPlayerPrivateAVFoundationCF*);

Extra blank line here.

&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:195
&gt; +static const CFStringRef CMTimeRangeStartKey()
&gt; +{
&gt; +    DEFINE_STATIC_LOCAL(CFStringRef, key, (CFSTR(&quot;start&quot;)));
&gt; +    return key;
&gt; +}
&gt; +
&gt; +static const CFStringRef CMTimeRangeDurationKey()
&gt; +{
&gt; +    DEFINE_STATIC_LOCAL(CFStringRef, key, (CFSTR(&quot;duration&quot;)));
&gt; +    return key;
&gt; +}
&gt; +
&gt; +static const CFStringRef CACFContextNeedsFlushNotification()
&gt; +{
&gt; +    DEFINE_STATIC_LOCAL(CFStringRef, name, (CFSTR(&quot;kCACFContextNeedsFlushNotification&quot;)));
&gt; +    return name;
&gt; +}

I don&apos;t think the &quot;const&quot;s here have any effect.

Should we have FIXMEs to use real constants for these strings (ideally provided by CoreMedia and AVCF)?

&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:725
&gt; +bool MediaPlayerPrivateAVFoundationCF::isAvailable()
&gt; +{
&gt; +    return AVFoundationCFLibrary() &amp;&amp; CoreMediaLibrary() &amp;&amp; libdispatchLibrary();
&gt; +}

Do we really expect this code to ever be called when these DLLs aren&apos;t available?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>446538</commentid>
    <comment_count>19</comment_count>
      <attachid>102865</attachid>
    <who name="Eric Carlson">eric.carlson</who>
    <bug_when>2011-08-04 09:09:42 -0700</bug_when>
    <thetext>Comment on attachment 102865
First cut at implementing AVCF support on Windows.

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

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:58
&gt;&gt; +SOFT_LINK_LIBRARY(libdispatch)
&gt; 
&gt; It doesn&apos;t seem right to both link against and delay-load these DLLs. Also, we should be linking/loading the _debug variants in Debug_All builds.

I think it is worth soft linking with the dlls so they aren&apos;t loaded until a page used a media element.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:725
&gt;&gt; +}
&gt; 
&gt; Do we really expect this code to ever be called when these DLLs aren&apos;t available?

I think we might as well do this as long as we soft link the dlls. It doesn&apos;t cost anything and it will prevent Safari from crashing on a system where one or more of the dlls isn&apos;t available for whatever reason.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>446572</commentid>
    <comment_count>20</comment_count>
      <attachid>102865</attachid>
    <who name="Jeff Miller">jeffm</who>
    <bug_when>2011-08-04 09:49:09 -0700</bug_when>
    <thetext>Comment on attachment 102865
First cut at implementing AVCF support on Windows.

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

&gt;&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:58
&gt;&gt;&gt; +SOFT_LINK_LIBRARY(libdispatch)
&gt;&gt; 
&gt;&gt; It doesn&apos;t seem right to both link against and delay-load these DLLs. Also, we should be linking/loading the _debug variants in Debug_All builds.
&gt; 
&gt; I think it is worth soft linking with the dlls so they aren&apos;t loaded until a page used a media element.

I will leave the soft linking in, but use the debug versions when appropriate.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:60
&gt;&gt; +using namespace WTF;
&gt; 
&gt; Is this really needed?

No, I removed it.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:66
&gt;&gt; +class AVFWrapper {
&gt; 
&gt; Missing a blank line here.

Fixed.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:69
&gt;&gt; +    AVFWrapper(MediaPlayerPrivateAVFoundationCF*);
&gt; 
&gt; Extra blank line here.

Removed.

&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:195
&gt;&gt; +}
&gt; 
&gt; I don&apos;t think the &quot;const&quot;s here have any effect.
&gt; 
&gt; Should we have FIXMEs to use real constants for these strings (ideally provided by CoreMedia and AVCF)?

Removed the const&apos;s and added FIXMEs.

&gt;&gt;&gt; Source/WebCore/platform/graphics/avfoundation/MediaPlayerPrivateAVFoundationCF.cpp:725
&gt;&gt;&gt; +}
&gt;&gt; 
&gt;&gt; Do we really expect this code to ever be called when these DLLs aren&apos;t available?
&gt; 
&gt; I think we might as well do this as long as we soft link the dlls. It doesn&apos;t cost anything and it will prevent Safari from crashing on a system where one or more of the dlls isn&apos;t available for whatever reason.

I&apos;m going to leave this in, based on Eric&apos;s comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>446726</commentid>
    <comment_count>21</comment_count>
    <who name="Jeff Miller">jeffm</who>
    <bug_when>2011-08-04 13:14:39 -0700</bug_when>
    <thetext>AVCF support on Windows landed in &lt;http://trac.webkit.org/changeset/92404&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>102409</attachid>
            <date>2011-07-29 16:27:11 -0700</date>
            <delta_ts>2011-07-29 17:40:04 -0700</delta_ts>
            <desc>Make MediaPlayerPrivateAVFoundation::setDelayCallbacks() const</desc>
            <filename>setDelayCallbacks.patch</filename>
            <type>text/plain</type>
            <size>2893</size>
            <attacher name="Jeff Miller">jeffm</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDkyMDMxKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjAgQEAKKzIwMTEtMDctMjkgIEplZmYgTWls
bGVyICA8amVmZm1AYXBwbGUuY29tPgorCisgICAgICAgIFdvcmstaW4tcHJvZ3Jlc3Mgb24gQWRv
cHQgQVZDRiBtZWRpYSBiYWNrIGVuZCBvbiBXaW5kb3dzCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02NTQwMAorICAgICAgICA8cmRhcjovL3Byb2JsZW0v
OTA4MzU1OT4KKyAgICAgICAgCisgICAgICAgIE1ha2UgTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3Vu
ZGF0aW9uOjpzZXREZWxheUNhbGxiYWNrcygpIGNvbnN0IGFuZCBtYWtlIHRoZSBpdmFycworICAg
ICAgICBpdCByZWZlcmVuY2VzIG11dGFibGUgc28gb3RoZXIgY29uc3QgbWVtYmVyIGZ1bmN0aW9u
cyBjYW4gY2FsbCBpdC4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwor
ICAgICAgICBObyBjaGFuZ2VzIHRvIGZ1bmN0aW9uYWxpdHkgc28gbm8gbmV3IHRlc3RzLgorCisg
ICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvYXZmb3VuZGF0aW9uL01lZGlhUGxheWVyUHJpdmF0
ZUFWRm91bmRhdGlvbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYVBsYXllclByaXZhdGVB
VkZvdW5kYXRpb246OnNldERlbGF5Q2FsbGJhY2tzKToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9hdmZvdW5kYXRpb24vTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uLmg6CisKIDIw
MTEtMDctMjkgIEFkcmllbm5lIFdhbGtlciAgPGVubmVAZ29vZ2xlLmNvbT4KIAogICAgICAgICBb
Y2hyb21pdW1dIE9ubHkgZm9yY2Ugc2xvdyBzY3JvbGxpbmcgZm9yIGlmcmFtZXMgdW5kZXIgLS1m
b3JjZS1jb21wb3NpdGluZy1tb2RlCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9hdmZvdW5kYXRpb24vTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9hdmZvdW5kYXRpb24v
TWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uLmNwcAkocmV2aXNpb24gOTIwMDUpCisrKyBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9hdmZvdW5kYXRpb24vTWVkaWFQbGF5ZXJQ
cml2YXRlQVZGb3VuZGF0aW9uLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjI5LDcgKzYyOSw3IEBA
IHZvaWQgTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uOjpzZXQKICAgICBzZXREZWxheUNh
bGxiYWNrcyhmYWxzZSk7CiB9CiAKLXZvaWQgTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9u
OjpzZXREZWxheUNhbGxiYWNrcyhib29sIGRlbGF5KQordm9pZCBNZWRpYVBsYXllclByaXZhdGVB
VkZvdW5kYXRpb246OnNldERlbGF5Q2FsbGJhY2tzKGJvb2wgZGVsYXkpIGNvbnN0CiB7CiAgICAg
TXV0ZXhMb2NrZXIgbG9jayhtX3F1ZXVlTXV0ZXgpOwogICAgIGlmIChkZWxheSkKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2F2Zm91bmRhdGlvbi9NZWRpYVBsYXllclBy
aXZhdGVBVkZvdW5kYXRpb24uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9hdmZvdW5kYXRpb24vTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uLmgJ
KHJldmlzaW9uIDkyMDA1KQorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYXZm
b3VuZGF0aW9uL01lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbi5oCSh3b3JraW5nIGNvcHkp
CkBAIC0yMTUsNyArMjE1LDcgQEAgcHJvdGVjdGVkOgogICAgIHZvaWQgc2V0SGFzVmlkZW8oYm9v
bCk7CiAgICAgdm9pZCBzZXRIYXNBdWRpbyhib29sKTsKICAgICB2b2lkIHNldEhhc0Nsb3NlZENh
cHRpb25zKGJvb2wpOwotICAgIHZvaWQgc2V0RGVsYXlDYWxsYmFja3MoYm9vbCk7CisgICAgdm9p
ZCBzZXREZWxheUNhbGxiYWNrcyhib29sKSBjb25zdDsKICAgICB2b2lkIHNldElnbm9yZUxvYWRT
dGF0ZUNoYW5nZXMoYm9vbCBkZWxheSkgeyBtX2lnbm9yZUxvYWRTdGF0ZUNoYW5nZXMgPSBkZWxh
eTsgfQogICAgIHZvaWQgc2V0TmF0dXJhbFNpemUoSW50U2l6ZSk7CiAgICAgYm9vbCBpc0xpdmVT
dHJlYW0oKSBjb25zdCB7IHJldHVybiBpc2luZihkdXJhdGlvbigpKTsgfQpAQCAtMjQyLDcgKzI0
Miw3IEBAIHByaXZhdGU6CiAgICAgTWVkaWFQbGF5ZXIqIG1fcGxheWVyOwogCiAgICAgVmVjdG9y
PE5vdGlmaWNhdGlvbj4gbV9xdWV1ZWROb3RpZmljYXRpb25zOwotICAgIE11dGV4IG1fcXVldWVN
dXRleDsKKyAgICBtdXRhYmxlIE11dGV4IG1fcXVldWVNdXRleDsKIAogICAgIG11dGFibGUgUmVm
UHRyPFRpbWVSYW5nZXM+IG1fY2FjaGVkTG9hZGVkVGltZVJhbmdlczsKIApAQCAtMjYxLDcgKzI2
MSw3IEBAIHByaXZhdGU6CiAKICAgICBmbG9hdCBtX3NlZWtUbzsKICAgICBmbG9hdCBtX3JlcXVl
c3RlZFJhdGU7Ci0gICAgaW50IG1fZGVsYXlDYWxsYmFja3M7CisgICAgbXV0YWJsZSBpbnQgbV9k
ZWxheUNhbGxiYWNrczsKICAgICBib29sIG1fbWFpblRocmVhZENhbGxQZW5kaW5nOwogICAgIGJv
b2wgbV9hc3NldElzUGxheWFibGU7CiAgICAgYm9vbCBtX3Zpc2libGU7Cg==
</data>
<flag name="review"
          id="97657"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>102412</attachid>
            <date>2011-07-29 17:17:10 -0700</date>
            <delta_ts>2011-07-29 17:38:27 -0700</delta_ts>
            <desc>Prepare WebCore.vcproj to support AVCF media back end on Windows</desc>
            <filename>AVCFProjectChanges.patch</filename>
            <type>text/plain</type>
            <size>6866</size>
            <attacher name="Jeff Miller">jeffm</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDkyMDMzKQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjAgQEAKKzIwMTEtMDctMjkgIEplZmYgTWls
bGVyICA8amVmZm1AYXBwbGUuY29tPgorCisgICAgICAgIFdvcmstaW4tcHJvZ3Jlc3Mgb24gQWRv
cHQgQVZDRiBtZWRpYSBiYWNrIGVuZCBvbiBXaW5kb3dzCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD02NTQwMAorICAgICAgICA8cmRhcjovL3Byb2JsZW0v
OTA4MzU1OT4KKyAgICAgICAgCisgICAgICAgIFByZXBhcmUgV2ViQ29yZS52Y3Byb2ogdG8gc3Vw
cG9ydCBBVkNGIG1lZGlhIGJhY2sgZW5kIG9uIFdpbmRvd3MuCisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgIE5vIGNoYW5nZXMgdG8gZnVuY3Rpb25hbGl0
eSBzbyBubyBuZXcgdGVzdHMuCisKKyAgICAgICAgKiBXZWJDb3JlLnZjcHJvai9XZWJDb3JlLnZj
cHJvajogQWRkZWQgTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uIGFuZCBNZWRpYVBsYXll
clByaXZhdGVBVkZvdW5kYXRpb25DRiBzb3VyY2VzLgorICAgICAgICAqIFdlYkNvcmUudmNwcm9q
L1dlYkNvcmVNZWRpYVFULnZzcHJvcHM6IEFkZGVkIGFkZGl0aW9uYWwgaW5jbHVkZSBkaXJlY3Rv
cmllcyBhbmQgZGxlYXkgbG9hZCBETExzIGZvciBBVkNGLgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL2F2Zm91bmRhdGlvbi9NZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25DRi5jcHA6
IEFkZGVkLCBqdXN0IGEgc3R1YiBmb3Igbm93LgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L2F2Zm91bmRhdGlvbi9NZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25DRi5oOiBBZGRlZCwg
anVzdCBhIHN0dWIgZm9yIG5vdy4KKwogMjAxMS0wNy0yOSAgWmhlbnlhbyBNbyAgPHptb0Bnb29n
bGUuY29tPgogCiAgICAgICAgIFVucmV2aWV3ZWQsIHJvbGxpbmcgb3V0IHI5MjAxMS4KSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qCShyZXZpc2lv
biA5MjAwOCkKKysrIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9q
CSh3b3JraW5nIGNvcHkpCkBAIC0zMDE2MCw2ICszMDE2MCwyNiBAQAogCQkJCQkJPC9GaWxlPgog
CQkJCQk8L0ZpbHRlcj4KIAkJCQk8L0ZpbHRlcj4KKwkJCQk8RmlsdGVyCisJCQkJCU5hbWU9ImF2
Zm91bmRhdGlvbiIKKwkJCQkJPgorCQkJCQk8RmlsZQorCQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxw
bGF0Zm9ybVxncmFwaGljc1xhdmZvdW5kYXRpb25cTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0
aW9uLmNwcCIKKwkJCQkJCT4KKwkJCQkJPC9GaWxlPgorCQkJCQk8RmlsZQorCQkJCQkJUmVsYXRp
dmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1xhdmZvdW5kYXRpb25cTWVkaWFQbGF5ZXJQcml2
YXRlQVZGb3VuZGF0aW9uLmgiCisJCQkJCQk+CisJCQkJCTwvRmlsZT4KKwkJCQkJPEZpbGUKKwkJ
CQkJCVJlbGF0aXZlUGF0aD0iLi5ccGxhdGZvcm1cZ3JhcGhpY3NcYXZmb3VuZGF0aW9uXE1lZGlh
UGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbkNGLmNwcCIKKwkJCQkJCT4KKwkJCQkJPC9GaWxlPgor
CQkJCQk8RmlsZQorCQkJCQkJUmVsYXRpdmVQYXRoPSIuLlxwbGF0Zm9ybVxncmFwaGljc1xhdmZv
dW5kYXRpb25cTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0YuaCIKKwkJCQkJCT4KKwkJ
CQkJPC9GaWxlPgorCQkJCTwvRmlsdGVyPgogCQkJPC9GaWx0ZXI+CiAJCQk8RmlsdGVyCiAJCQkJ
TmFtZT0ibmV0d29yayIKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUudmNwcm9qL1dlYkNv
cmVNZWRpYVFULnZzcHJvcHMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvV2ViQ29yZS52
Y3Byb2ovV2ViQ29yZU1lZGlhUVQudnNwcm9wcwkocmV2aXNpb24gOTIwMDUpCisrKyBTb3VyY2Uv
V2ViQ29yZS9XZWJDb3JlLnZjcHJvai9XZWJDb3JlTWVkaWFRVC52c3Byb3BzCSh3b3JraW5nIGNv
cHkpCkBAIC00LDQgKzQsMTIgQEAKIAlWZXJzaW9uPSI4LjAwIgogCU5hbWU9IldlYkNvcmVNZWRp
YVFUIgogCT4KKwk8VG9vbAorCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIgorCQlBZGRpdGlvbmFs
SW5jbHVkZURpcmVjdG9yaWVzPSImcXVvdDskKFdlYktpdExpYnJhcmllc0RpcilcaW5jbHVkZVxD
b3JlQXVkaW8mcXVvdDs7JnF1b3Q7JChXZWJLaXRMaWJyYXJpZXNEaXIpXGluY2x1ZGVcQVZGb3Vu
ZGF0aW9uJnF1b3Q7OyZxdW90OyQoUHJvamVjdERpcikuLlxwbGF0Zm9ybVxncmFwaGljc1xhdmZv
dW5kYXRpb24mcXVvdDsiCisJLz4KKwk8VG9vbAorCQlOYW1lPSJWQ0xpbmtlclRvb2wiCisJCURl
bGF5TG9hZERMTHM9IkFWRm91bmRhdGlvbkNGLmRsbDtDb3JlVmlkZW8kKFdlYktpdENvbmZpZ1N1
ZmZpeCkuZGxsO01lZGlhVG9vbGJveCQoV2ViS2l0Q29uZmlnU3VmZml4KS5kbGwiCisJLz4KIDwv
VmlzdWFsU3R1ZGlvUHJvcGVydHlTaGVldD4KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2F2Zm91bmRhdGlvbi9NZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25DRi5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYXZmb3Vu
ZGF0aW9uL01lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbkNGLmNwcAkocmV2aXNpb24gMCkK
KysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2F2Zm91bmRhdGlvbi9NZWRpYVBs
YXllclByaXZhdGVBVkZvdW5kYXRpb25DRi5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjQg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
Q09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBD
T01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLwoKUHJvcGVydHkgY2hhbmdlcyBvbjogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvYXZmb3VuZGF0aW9uL01lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbkNGLmNw
cApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fCkFkZGVkOiBzdm46ZW9sLXN0eWxlCiAgICsgbmF0aXZlCgpJbmRleDogU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYXZmb3VuZGF0aW9uL01lZGlhUGxheWVyUHJp
dmF0ZUFWRm91bmRhdGlvbkNGLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvYXZmb3VuZGF0aW9uL01lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbkNG
LmgJKHJldmlzaW9uIDApCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9hdmZv
dW5kYXRpb24vTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0YuaAkocmV2aXNpb24gMCkK
QEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgTWVkaWFQbGF5ZXJQcml2YXRlQVZG
b3VuZGF0aW9uQ0ZfaAorI2RlZmluZSBNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25DRl9o
CisKKyNlbmRpZiAvLyBNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25DRl9oCgpQcm9wZXJ0
eSBjaGFuZ2VzIG9uOiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9hdmZvdW5kYXRp
b24vTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0YuaApfX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkFkZGVkOiBz
dm46ZW9sLXN0eWxlCiAgICsgbmF0aXZlCgo=
</data>
<flag name="review"
          id="97659"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>102865</attachid>
            <date>2011-08-03 17:54:39 -0700</date>
            <delta_ts>2011-08-04 09:49:09 -0700</delta_ts>
            <desc>First cut at implementing AVCF support on Windows.</desc>
            <filename>AdoptAVCF.patch</filename>
            <type>text/plain</type>
            <size>63705</size>
            <attacher name="Jeff Miller">jeffm</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDkyMzM3KQorKysgU291cmNlL1dlYkNvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTM3IEBACisyMDExLTA4LTAzICBKZWZmIE1p
bGxlciAgPGplZmZtQGFwcGxlLmNvbT4KKworICAgICAgICBBZG9wdCBBVkNGIG1lZGlhIGJhY2sg
ZW5kIG9uIFdpbmRvd3MKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcu
Y2dpP2lkPTY1NDAwCisgICAgICAgIDxyZGFyOi8vcHJvYmxlbS85MDgzNTU5PgorICAgICAgICAK
KyAgICAgICAgRmlyc3QgY3V0IGF0IGltcGxlbWVudGF0aW9uIGluIE1lZGlhUGxheWVyUHJpdmF0
ZUFWRm91bmRhdGlvbkNGLmNwcC8uaCwgYmFzZWQgb24KKyAgICAgICAgd29yayBieSBFcmljIENh
cmxzb24uIE5vdGUgdGhhdCB1c2Ugb2YgQVZGb3VuZGF0aW9uIGlzIGRldGVybWluZWQgYXQgcnVu
dGltZSwgYW5kCisgICAgICAgIGRlZmF1bHRzIHRvIG9mZi4KKworICAgICAgICBSZXZpZXdlZCBi
eSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBObyBuZXcgdGVzdHMsIHVzZXMgZXhpc3Rpbmcg
bWVkaWEgdGVzdHMuCisKKyAgICAgICAgKiBjb25maWcuaDogVHVybiBvbiBXVEZfVVNFX0FWRk9V
TkRBVElPTiBvbiBXaW5kb3dzIGlmIEFWRm91bmRhdGlvbkNGIGlzIGF2YWlsYWJsZS4KKyAgICAg
ICAgCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvTWVkaWFQbGF5ZXIuY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6aW5zdGFsbGVkTWVkaWFFbmdpbmVzKTogUmVnaXN0ZXIgTWVkaWFQbGF5ZXJQ
cml2YXRlQVZGb3VuZGF0aW9uQ0Ygb24gV2luZG93cy4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFw
aGljcy9NZWRpYVBsYXllci5oOiBBZGQgc3VwcG9ydCBmb3IgYW4gQVZDRlBsYXllci4KKyAgICAg
ICAgCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvYXZmb3VuZGF0aW9uL01lZGlhUGxheWVy
UHJpdmF0ZUFWRm91bmRhdGlvbi5jcHA6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYVBsYXllclBy
aXZhdGVBVkZvdW5kYXRpb246OnNldFByZWxvYWQpOiBXb3JrYXJvdW5kIGFuIEFWQ0YgbGltaXRh
dGlvbiB0aGF0IHByZXZlbnRzIGFuIEFWQ0ZQbGF5ZXIgZnJvbSBiZWluZyBjcmVhdGVkIHdpdGhv
dXQgYW4gQVZDRkl0ZW0uCisgICAgICAgIChXZWJDb3JlOjpNZWRpYVBsYXllclByaXZhdGVBVkZv
dW5kYXRpb246OmRpc3BhdGNoTm90aWZpY2F0aW9uKTogQWRkZWQgc3VwcG9ydCBmb3IgQ29udGVu
dHNOZWVkc0Rpc3BsYXkgbm90aWZpY2F0aW9uLgorICAgICAgICAKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9hdmZvdW5kYXRpb24vTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uLmg6
CisgICAgICAgIChXZWJDb3JlOjpNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb246OmNvbnRl
bnRzTmVlZHNEaXNwbGF5KTogQWRkZWQgc3VwcG9ydCBmb3IgQ29udGVudHNOZWVkc0Rpc3BsYXkg
bm90aWZpY2F0aW9uLgorICAgICAgICAKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9hdmZv
dW5kYXRpb24vTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0YuY3BwOiBBZGRlZCBpbXBs
ZW1lbnRhdGlvbi4KKyAgICAgICAgKFdlYkNvcmU6OkFWRldyYXBwZXI6OmNhVmlkZW9MYXllcik6
CisgICAgICAgIChXZWJDb3JlOjpBVkZXcmFwcGVyOjp2aWRlb0xheWVyV3JhcHBlcik6CisgICAg
ICAgIChXZWJDb3JlOjpBVkZXcmFwcGVyOjp2aWRlb0xheWVyKToKKyAgICAgICAgKFdlYkNvcmU6
OkFWRldyYXBwZXI6OmF2UGxheWVyKToKKyAgICAgICAgKFdlYkNvcmU6OkFWRldyYXBwZXI6OmF2
QXNzZXQpOgorICAgICAgICAoV2ViQ29yZTo6QVZGV3JhcHBlcjo6YXZQbGF5ZXJJdGVtKToKKyAg
ICAgICAgKFdlYkNvcmU6OkFWRldyYXBwZXI6OnRpbWVPYnNlcnZlcik6CisgICAgICAgIChXZWJD
b3JlOjpBVkZXcmFwcGVyOjppbWFnZUdlbmVyYXRvcik6CisgICAgICAgIChXZWJDb3JlOjpBVkZX
cmFwcGVyOjpkaXNwYXRjaFF1ZXVlKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2xpZW50OjpM
YXllckNsaWVudCk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNsaWVudDo6fkxheWVyQ2xpZW50
KToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2xpZW50OjpwbGF0Zm9ybUNBTGF5ZXJSZXNwb25k
c1RvTGF5b3V0Q2hhbmdlcyk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNsaWVudDo6cGxhdGZv
cm1DQUxheWVyQW5pbWF0aW9uU3RhcnRlZCk6CisgICAgICAgIChXZWJDb3JlOjpMYXllckNsaWVu
dDo6cGxhdGZvcm1DQUxheWVyQ29udGVudHNPcmllbnRhdGlvbik6CisgICAgICAgIChXZWJDb3Jl
OjpMYXllckNsaWVudDo6cGxhdGZvcm1DQUxheWVyUGFpbnRDb250ZW50cyk6CisgICAgICAgIChX
ZWJDb3JlOjpMYXllckNsaWVudDo6cGxhdGZvcm1DQUxheWVyU2hvd0RlYnVnQm9yZGVycyk6Cisg
ICAgICAgIChXZWJDb3JlOjpMYXllckNsaWVudDo6cGxhdGZvcm1DQUxheWVyU2hvd1JlcGFpbnRD
b3VudGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2xpZW50OjpwbGF0Zm9ybUNBTGF5ZXJJ
bmNyZW1lbnRSZXBhaW50Q291bnQpOgorICAgICAgICAoV2ViQ29yZTo6TGF5ZXJDbGllbnQ6OnBs
YXRmb3JtQ0FMYXllckNvbnRlbnRzT3BhcXVlKToKKyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2xp
ZW50OjpwbGF0Zm9ybUNBTGF5ZXJEcmF3c0NvbnRlbnQpOgorICAgICAgICAoV2ViQ29yZTo6TGF5
ZXJDbGllbnQ6OnBsYXRmb3JtQ0FMYXllckxheWVyRGlkRGlzcGxheSk6CisgICAgICAgIChXZWJD
b3JlOjpib29sU3RyaW5nKToKKyAgICAgICAgKFdlYkNvcmU6Om1ldGFkYXRhS2V5TmFtZXMpOgor
ICAgICAgICAoV2ViQ29yZTo6Q01UaW1lUmFuZ2VTdGFydEtleSk6CisgICAgICAgIChXZWJDb3Jl
OjpDTVRpbWVSYW5nZUR1cmF0aW9uS2V5KToKKyAgICAgICAgKFdlYkNvcmU6OkNBQ0ZDb250ZXh0
TmVlZHNGbHVzaE5vdGlmaWNhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjp2aWRlb0xheWVyKToK
KyAgICAgICAgKFdlYkNvcmU6OmF2UGxheWVyKToKKyAgICAgICAgKFdlYkNvcmU6OmF2QXNzZXQp
OgorICAgICAgICAoV2ViQ29yZTo6YXZQbGF5ZXJJdGVtKToKKyAgICAgICAgKFdlYkNvcmU6Omlt
YWdlR2VuZXJhdG9yKToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhUGxheWVyUHJpdmF0ZUFWRm91
bmRhdGlvbkNGOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFQbGF5ZXJQcml2YXRl
QVZGb3VuZGF0aW9uQ0Y6OnJlZ2lzdGVyTWVkaWFFbmdpbmUpOgorICAgICAgICAoV2ViQ29yZTo6
TWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6Ok1lZGlhUGxheWVyUHJpdmF0ZUFWRm91
bmRhdGlvbkNGKToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRh
dGlvbkNGOjp+TWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0YpOgorICAgICAgICAoV2Vi
Q29yZTo6TWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6OmNhbmNlbExvYWQpOgorICAg
ICAgICAoV2ViQ29yZTo6TWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6Omhhc0xheWVy
UmVuZGVyZXIpOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0
aW9uQ0Y6Omhhc0NvbnRleHRSZW5kZXJlcik6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYVBsYXll
clByaXZhdGVBVkZvdW5kYXRpb25DRjo6Y3JlYXRlQ29udGV4dFZpZGVvUmVuZGVyZXIpOgorICAg
ICAgICAoV2ViQ29yZTo6TWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6OmRlc3Ryb3lD
b250ZXh0VmlkZW9SZW5kZXJlcik6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYVBsYXllclByaXZh
dGVBVkZvdW5kYXRpb25DRjo6Y3JlYXRlVmlkZW9MYXllcik6CisgICAgICAgIChXZWJDb3JlOjpN
ZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25DRjo6ZGVzdHJveVZpZGVvTGF5ZXIpOgorICAg
ICAgICAoV2ViQ29yZTo6TWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6Omhhc0F2YWls
YWJsZVZpZGVvRnJhbWUpOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFQbGF5ZXJQcml2YXRlQVZG
b3VuZGF0aW9uQ0Y6OmNyZWF0ZUFWUGxheWVyKToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhUGxh
eWVyUHJpdmF0ZUFWRm91bmRhdGlvbkNGOjpjcmVhdGVBVlBsYXllckl0ZW0pOgorICAgICAgICAo
V2ViQ29yZTo6TWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6OmNyZWF0ZUFWQXNzZXRG
b3JVUkwpOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9u
Q0Y6OmNoZWNrUGxheWFiaWxpdHkpOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFQbGF5ZXJQcml2
YXRlQVZGb3VuZGF0aW9uQ0Y6OmJlZ2luTG9hZGluZ01ldGFkYXRhKToKKyAgICAgICAgKFdlYkNv
cmU6Ok1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbkNGOjpwbGF5ZXJJdGVtU3RhdHVzKToK
KyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbkNGOjpwbGF0
Zm9ybU1lZGlhKToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRh
dGlvbkNGOjpwbGF0Zm9ybUxheWVyKToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhUGxheWVyUHJp
dmF0ZUFWRm91bmRhdGlvbkNGOjpwbGF0Zm9ybVNldFZpc2libGUpOgorICAgICAgICAoV2ViQ29y
ZTo6TWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6OnBsYXRmb3JtUGxheSk6CisgICAg
ICAgIChXZWJDb3JlOjpNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25DRjo6cGxhdGZvcm1Q
YXVzZSk6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25D
Rjo6dXBkYXRlUmF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYVBsYXllclByaXZhdGVBVkZv
dW5kYXRpb25DRjo6cGxhdGZvcm1EdXJhdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYVBs
YXllclByaXZhdGVBVkZvdW5kYXRpb25DRjo6Y3VycmVudFRpbWUpOgorICAgICAgICAoV2ViQ29y
ZTo6TWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6OnNlZWtUb1RpbWUpOgorICAgICAg
ICAoV2ViQ29yZTo6TWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6OnNldFZvbHVtZSk6
CisgICAgICAgIChXZWJDb3JlOjpNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25DRjo6c2V0
Q2xvc2VkQ2FwdGlvbnNWaXNpYmxlKToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhUGxheWVyUHJp
dmF0ZUFWRm91bmRhdGlvbkNGOjpyYXRlKToKKyAgICAgICAgKFdlYkNvcmU6OnRpbWVSYW5nZUlz
VmFsaWRBbmROb3RFbXB0eSk6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYVBsYXllclByaXZhdGVB
VkZvdW5kYXRpb25DRjo6cGxhdGZvcm1CdWZmZXJlZFRpbWVSYW5nZXMpOgorICAgICAgICAoV2Vi
Q29yZTo6TWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6OnBsYXRmb3JtTWF4VGltZVNl
ZWthYmxlKToKKyAgICAgICAgKFdlYkNvcmU6Ok1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlv
bkNGOjpwbGF0Zm9ybU1heFRpbWVMb2FkZWQpOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFQbGF5
ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6OnRvdGFsQnl0ZXMpOgorICAgICAgICAoV2ViQ29yZTo6
TWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6OmFzc2V0U3RhdHVzKToKKyAgICAgICAg
KFdlYkNvcmU6Ok1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbkNGOjpwYWludEN1cnJlbnRG
cmFtZUluQ29udGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYVBsYXllclByaXZhdGVBVkZv
dW5kYXRpb25DRjo6cGFpbnQpOgorICAgICAgICAoV2ViQ29yZTo6bWltZVR5cGVDYWNoZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25DRjo6Z2V0U3Vw
cG9ydGVkVHlwZXMpOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFQbGF5ZXJQcml2YXRlQVZGb3Vu
ZGF0aW9uQ0Y6OnN1cHBvcnRzVHlwZSk6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYVBsYXllclBy
aXZhdGVBVkZvdW5kYXRpb25DRjo6aXNBdmFpbGFibGUpOgorICAgICAgICAoV2ViQ29yZTo6TWVk
aWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6Om1lZGlhVGltZUZvclRpbWVWYWx1ZSk6Cisg
ICAgICAgIChXZWJDb3JlOjpNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25DRjo6dHJhY2tz
Q2hhbmdlZCk6CisgICAgICAgIChXZWJDb3JlOjpNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRp
b25DRjo6c2l6ZUNoYW5nZWQpOgorICAgICAgICAoV2ViQ29yZTo6TWVkaWFQbGF5ZXJQcml2YXRl
QVZGb3VuZGF0aW9uQ0Y6OmNvbnRlbnRzTmVlZHNEaXNwbGF5KToKKyAgICAgICAgKFdlYkNvcmU6
OkFWRldyYXBwZXI6OkFWRldyYXBwZXIpOgorICAgICAgICAoV2ViQ29yZTo6QVZGV3JhcHBlcjo6
fkFWRldyYXBwZXIpOgorICAgICAgICAoV2ViQ29yZTo6QVZGV3JhcHBlcjo6c2NoZWR1bGVEaXNj
b25uZWN0QW5kRGVsZXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkFWRldyYXBwZXI6OmRpc2Nvbm5l
Y3RBbmREZWxldGVBVkZXcmFwcGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkFWRldyYXBwZXI6OmRl
bGV0ZUFWRldyYXBwZXIpOgorICAgICAgICAoV2ViQ29yZTo6QVZGV3JhcHBlcjo6Y3JlYXRlQXNz
ZXRGb3JVUkwpOgorICAgICAgICAoV2ViQ29yZTo6QVZGV3JhcHBlcjo6Y3JlYXRlUGxheWVyKToK
KyAgICAgICAgKFdlYkNvcmU6OkFWRldyYXBwZXI6OmNyZWF0ZVBsYXllckl0ZW0pOgorICAgICAg
ICAoV2ViQ29yZTo6QVZGV3JhcHBlcjo6cGVyaW9kaWNUaW1lT2JzZXJ2ZXJDYWxsYmFjayk6Cisg
ICAgICAgIChXZWJDb3JlOjpBVkZXcmFwcGVyOjpub3RpZmljYXRpb25DYWxsYmFjayk6CisgICAg
ICAgIChXZWJDb3JlOjpBVkZXcmFwcGVyOjpsb2FkUGxheWFibGVDb21wbGV0aW9uQ2FsbGJhY2sp
OgorICAgICAgICAoV2ViQ29yZTo6QVZGV3JhcHBlcjo6Y2hlY2tQbGF5YWJpbGl0eSk6CisgICAg
ICAgIChXZWJDb3JlOjpBVkZXcmFwcGVyOjpsb2FkTWV0YWRhdGFDb21wbGV0aW9uQ2FsbGJhY2sp
OgorICAgICAgICAoV2ViQ29yZTo6QVZGV3JhcHBlcjo6YmVnaW5Mb2FkaW5nTWV0YWRhdGEpOgor
ICAgICAgICAoV2ViQ29yZTo6QVZGV3JhcHBlcjo6c2Vla0NvbXBsZXRlZENhbGxiYWNrKToKKyAg
ICAgICAgKFdlYkNvcmU6OkFWRldyYXBwZXI6OnNlZWtUb1RpbWUpOgorICAgICAgICAoV2ViQ29y
ZTo6QVZGV3JhcHBlcjo6c2V0QXNzZXQpOgorICAgICAgICAoV2ViQ29yZTo6QVZGV3JhcHBlcjo6
cGxhdGZvcm1MYXllcik6CisgICAgICAgIChXZWJDb3JlOjpBVkZXcmFwcGVyOjpjcmVhdGVBVkNG
VmlkZW9MYXllcik6CisgICAgICAgIChXZWJDb3JlOjpBVkZXcmFwcGVyOjpkZXN0cm95VmlkZW9M
YXllcik6CisgICAgICAgIChXZWJDb3JlOjpBVkZXcmFwcGVyOjpzZXRWaWRlb0xheWVyTmVlZHND
b21taXQpOgorICAgICAgICAoV2ViQ29yZTo6QVZGV3JhcHBlcjo6c2V0VmlkZW9MYXllckhpZGRl
bik6CisgICAgICAgIChXZWJDb3JlOjpBVkZXcmFwcGVyOjpjcmVhdGVJbWFnZUdlbmVyYXRvcik6
CisgICAgICAgIChXZWJDb3JlOjpBVkZXcmFwcGVyOjpkZXN0cm95SW1hZ2VHZW5lcmF0b3IpOgor
ICAgICAgICAoV2ViQ29yZTo6QVZGV3JhcHBlcjo6Y3JlYXRlSW1hZ2VGb3JUaW1lSW5SZWN0KToK
KyAgICAgICAgKFdlYkNvcmU6OkxheWVyQ2xpZW50OjpwbGF0Zm9ybUNBTGF5ZXJMYXlvdXRTdWJs
YXllcnNPZkxheWVyKToKKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2F2Zm91bmRhdGlv
bi9NZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25DRi5oOiBBZGRlZCBpbXBsZW1lbnRhdGlv
bi4KKwogMjAxMS0wOC0wMyAgTm8nYW0gUm9zZW50aGFsICA8bm9hbS5yb3NlbnRoYWxAbm9raWEu
Y29tPgogCiAgICAgICAgIFtRdF1bVGV4bWFwXVtSRUdSRVNTSU9OXSBodHRwOi8vd2Via2l0Lm9y
Zy9ibG9nLWZpbGVzL3RyYW5zZm9ybS1zdHlsZS5odG1sIGRvZXNuJ3Qgc2hvdyBjb21wb3NpdGVk
IGNvbnRlbnQKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2NvbmZpZy5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL2NvbmZpZy5oCShyZXZpc2lvbiA5MjMxNSkKKysrIFNvdXJjZS9XZWJDb3Jl
L2NvbmZpZy5oCSh3b3JraW5nIGNvcHkpCkBAIC0yMjYsNiArMjI2LDUgQEAgdHlwZWRlZiBmbG9h
dCBDR0Zsb2F0OwogI2VuZGlmCiAKICNpZiBQTEFURk9STShXSU4pICYmIEhBVkUoQVZDRikKLS8v
LyBGSVhNRTogQWRvcHQgQVZDRiBtZWRpYSBiYWNrIGVuZCBvbiBXaW5kb3dzIGh0dHA6Ly93ZWJr
aXQub3JnL2IvNjU0MDAKLSNkZWZpbmUgV1RGX1VTRV9BVkZPVU5EQVRJT04gMAorI2RlZmluZSBX
VEZfVVNFX0FWRk9VTkRBVElPTiAxCiAjZW5kaWYKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL01lZGlhUGxheWVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9NZWRpYVBsYXllci5jcHAJKHJldmlzaW9uIDkyMzE1KQorKysg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvTWVkaWFQbGF5ZXIuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC01OSw2ICs1OSw5IEBACiAjZWxpZiBQTEFURk9STShXSU4pCiAjaW5jbHVkZSAi
TWVkaWFQbGF5ZXJQcml2YXRlUXVpY2tUaW1lVmlzdWFsQ29udGV4dC5oIgogI2RlZmluZSBQbGF0
Zm9ybU1lZGlhRW5naW5lQ2xhc3NOYW1lIE1lZGlhUGxheWVyUHJpdmF0ZVF1aWNrVGltZVZpc3Vh
bENvbnRleHQKKyNpZiBVU0UoQVZGT1VOREFUSU9OKQorI2luY2x1ZGUgIk1lZGlhUGxheWVyUHJp
dmF0ZUFWRm91bmRhdGlvbkNGLmgiCisjZW5kaWYKICNlbGlmIFBMQVRGT1JNKFFUKQogI2lmIFVT
RShRVF9NVUxUSU1FRElBKSAmJiAhVVNFKEdTVFJFQU1FUikKICNpbmNsdWRlICJNZWRpYVBsYXll
clByaXZhdGVRdC5oIgpAQCAtMTg4LDkgKzE5MSwxNCBAQCBzdGF0aWMgVmVjdG9yPE1lZGlhUGxh
eWVyRmFjdG9yeSo+JiBpbnN0CiAgICAgICAgIE1lZGlhUGxheWVyUHJpdmF0ZUdTdHJlYW1lcjo6
cmVnaXN0ZXJNZWRpYUVuZ2luZShhZGRNZWRpYUVuZ2luZSk7CiAjZW5kaWYKIAotI2lmIFVTRShB
VkZPVU5EQVRJT04pICYmIFBMQVRGT1JNKE1BQykKLSAgICAgICAgaWYgKFNldHRpbmdzOjppc0FW
Rm91bmRhdGlvbkVuYWJsZWQoKSkKKyNpZiBVU0UoQVZGT1VOREFUSU9OKQorICAgICAgICBpZiAo
U2V0dGluZ3M6OmlzQVZGb3VuZGF0aW9uRW5hYmxlZCgpKSB7CisjaWYgUExBVEZPUk0oTUFDKQog
ICAgICAgICAgICAgTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uT2JqQzo6cmVnaXN0ZXJN
ZWRpYUVuZ2luZShhZGRNZWRpYUVuZ2luZSk7CisjZWxpZiBQTEFURk9STShXSU4pCisgICAgICAg
ICAgICBNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25DRjo6cmVnaXN0ZXJNZWRpYUVuZ2lu
ZShhZGRNZWRpYUVuZ2luZSk7CisjZW5kaWYKKyAgICAgICAgfQogI2VuZGlmCiAKICNpZiAhUExB
VEZPUk0oR1RLKSAmJiAhUExBVEZPUk0oRUZMKSAmJiAhKFBMQVRGT1JNKFFUKSAmJiBVU0UoR1NU
UkVBTUVSKSkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL01lZGlhUGxh
eWVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvTWVk
aWFQbGF5ZXIuaAkocmV2aXNpb24gOTIzMTUpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9NZWRpYVBsYXllci5oCSh3b3JraW5nIGNvcHkpCkBAIC01Miw2ICs1Miw3IEBACiBj
bGFzcyBBVlBsYXllcjsKIGNsYXNzIFFUTW92aWU7CiAjZW5kaWYKK2NsYXNzIEFWQ0ZQbGF5ZXI7
CiBjbGFzcyBRVE1vdmllR1dvcmxkOwogY2xhc3MgUVRNb3ZpZVZpc3VhbENvbnRleHQ7CiAKQEAg
LTc0LDYgKzc1LDcgQEAgc3RydWN0IFBsYXRmb3JtTWVkaWEgewogICAgICAgICBDaHJvbWl1bU1l
ZGlhUGxheWVyVHlwZSwKICAgICAgICAgUXRNZWRpYVBsYXllclR5cGUsCiAgICAgICAgIEFWRm91
bmRhdGlvbk1lZGlhUGxheWVyVHlwZSwKKyAgICAgICAgQVZGb3VuZGF0aW9uQ0ZNZWRpYVBsYXll
clR5cGUKICAgICB9IHR5cGU7CiAKICAgICB1bmlvbiB7CkBAIC04NCw2ICs4Niw3IEBAIHN0cnVj
dCBQbGF0Zm9ybU1lZGlhIHsKICAgICAgICAgTWVkaWFQbGF5ZXJQcml2YXRlSW50ZXJmYWNlKiBj
aHJvbWl1bU1lZGlhUGxheWVyOwogICAgICAgICBNZWRpYVBsYXllclByaXZhdGVJbnRlcmZhY2Uq
IHF0TWVkaWFQbGF5ZXI7CiAgICAgICAgIEFWUGxheWVyKiBhdmZNZWRpYVBsYXllcjsKKyAgICAg
ICAgQVZDRlBsYXllciogYXZjZk1lZGlhUGxheWVyOwogICAgIH0gbWVkaWE7CiB9OwogCkluZGV4
OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9hdmZvdW5kYXRpb24vTWVkaWFQbGF5
ZXJQcml2YXRlQVZGb3VuZGF0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9hdmZvdW5kYXRpb24vTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0
aW9uLmNwcAkocmV2aXNpb24gOTIzMTUpCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9hdmZvdW5kYXRpb24vTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtNjE4LDE0ICs2MTgsMjMgQEAgdm9pZCBNZWRpYVBsYXllclByaXZhdGVB
VkZvdW5kYXRpb246OnNldAogCiAgICAgaWYgKG1fcHJlbG9hZCA+PSBNZWRpYVBsYXllcjo6TWV0
YURhdGEgJiYgYXNzZXRTdGF0dXMoKSA9PSBNZWRpYVBsYXllckFWQXNzZXRTdGF0dXNEb2VzTm90
RXhpc3QpIHsKICAgICAgICAgY3JlYXRlQVZBc3NldEZvclVSTChtX2Fzc2V0VVJMKTsKKyAgICAg
ICAgLy8gRklYTUU6IFJlbW92ZSB0aGlzIFdpbmRvd3Mtc3BlY2lmaWMgY29kZSB3aGVuIDxyZGFy
Oi8vcHJvYmxlbS85ODc3NzMwPiBpcyBmaXhlZCwgdW50aWwgdGhlbgorICAgICAgICAvLyB3ZSBj
YW4ndCBjcmVhdGUgYW4gQVZQbGF5ZXIgd2l0aG91dCBhbiBBVlBsYXllckl0ZW0gb24gV2luZG93
cywgc28gd2UgYWx3YXlzIGhhdmUgdG8gY3JlYXRlCisgICAgICAgIC8vIHRoZSBpdGVtIGZpcnN0
LgorI2lmIFBMQVRGT1JNKFdJTikKKyAgICAgICAgY3JlYXRlQVZQbGF5ZXJJdGVtKCk7CisjZW5k
aWYKICAgICAgICAgY3JlYXRlQVZQbGF5ZXIoKTsKICAgICAgICAgY2hlY2tQbGF5YWJpbGl0eSgp
OwogICAgIH0KIAorICAgIC8vIEZJWE1FOiBFbmFibGUgdGhpcyBjb2RlIG9uIFdpbmRvd3Mgd2hl
biA8cmRhcjovL3Byb2JsZW0vOTg3NzczMD4gaXMgZml4ZWQuCisjaWYgUExBVEZPUk0oTUFDKQog
ICAgIC8vIERvbid0IGZvcmNlIGNyZWF0aW9uIG9mIHRoZSBwbGF5ZXIgaXRlbSB1bmxlc3Mgd2Ug
YWxyZWFkeSBrbm93IHRoYXQgdGhlIGFzc2V0IGlzIHBsYXlhYmxlLiBJZiB3ZSBhcmVuJ3QKICAg
ICAvLyB0aGVyZSB5ZXQsIG9yIGlmIHdlIGFscmVhZHkga25vdyBpdCBpcyBub3QgcGxheWFibGUs
IGNyZWF0aW5nIGl0IG5vdyB3b24ndCBoZWxwLgogICAgIGlmIChtX3ByZWxvYWQgPT0gTWVkaWFQ
bGF5ZXI6OkF1dG8gJiYgbV9hc3NldElzUGxheWFibGUpCiAgICAgICAgIGNyZWF0ZUFWUGxheWVy
SXRlbSgpOworI2VuZGlmCiAKICAgICBzZXREZWxheUNhbGxiYWNrcyhmYWxzZSk7CiB9CkBAIC03
NjksNiArNzc4LDkgQEAgdm9pZCBNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb246OmRpcwog
ICAgIGNhc2UgTm90aWZpY2F0aW9uOjpEdXJhdGlvbkNoYW5nZWQ6CiAgICAgICAgIGludmFsaWRh
dGVDYWNoZWREdXJhdGlvbigpOwogICAgICAgICBicmVhazsKKyAgICBjYXNlIE5vdGlmaWNhdGlv
bjo6Q29udGVudHNOZWVkc0Rpc3BsYXk6CisgICAgICAgICBjb250ZW50c05lZWRzRGlzcGxheSgp
OworICAgICAgICBicmVhazsKIAogICAgIGNhc2UgTm90aWZpY2F0aW9uOjpOb25lOgogICAgICAg
ICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2F2Zm91bmRhdGlvbi9NZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb24uaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9hdmZvdW5kYXRpb24v
TWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uLmgJKHJldmlzaW9uIDkyMzE1KQorKysgU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYXZmb3VuZGF0aW9uL01lZGlhUGxheWVyUHJp
dmF0ZUFWRm91bmRhdGlvbi5oCSh3b3JraW5nIGNvcHkpCkBAIC00Nyw2ICs0Nyw3IEBAIHB1Ymxp
YzoKICAgICB2aXJ0dWFsIHZvaWQgdGltZUNoYW5nZWQoZG91YmxlKTsKICAgICB2aXJ0dWFsIHZv
aWQgc2Vla0NvbXBsZXRlZChib29sKTsKICAgICB2aXJ0dWFsIHZvaWQgZGlkRW5kKCk7CisgICAg
dmlydHVhbCB2b2lkIGNvbnRlbnRzTmVlZHNEaXNwbGF5KCkgeyB9CiAKICAgICBjbGFzcyBOb3Rp
ZmljYXRpb24gewogICAgIHB1YmxpYzoKQEAgLTY3LDYgKzY4LDcgQEAgcHVibGljOgogICAgICAg
ICAgICAgUGxheWVyVGltZUNoYW5nZWQsCiAgICAgICAgICAgICBTZWVrQ29tcGxldGVkLAogICAg
ICAgICAgICAgRHVyYXRpb25DaGFuZ2VkLAorICAgICAgICAgICAgQ29udGVudHNOZWVkc0Rpc3Bs
YXksCiAgICAgICAgIH07CiAgICAgICAgIAogICAgICAgICBOb3RpZmljYXRpb24oKQpAQCAtMjM4
LDYgKzI0MCw3IEBAIHByb3RlY3RlZDoKICAgICB2b2lkIGludmFsaWRhdGVDYWNoZWREdXJhdGlv
bigpOwogCiAgICAgY29uc3QgU3RyaW5nJiBhc3NldFVSTCgpIGNvbnN0IHsgcmV0dXJuIG1fYXNz
ZXRVUkw7IH0KKwogcHJpdmF0ZToKICAgICBNZWRpYVBsYXllciogbV9wbGF5ZXI7CiAKQEAgLTI3
Nyw1ICsyODAsNSBAQCBwcml2YXRlOgogCiB9CiAKLSNlbmRpZgotI2VuZGlmCisjZW5kaWYgLy8g
RU5BQkxFKFZJREVPKSAmJiBVU0UoQVZGT1VOREFUSU9OKQorI2VuZGlmIC8vIE1lZGlhUGxheWVy
UHJpdmF0ZUFWRm91bmRhdGlvbl9oCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9hdmZvdW5kYXRpb24vTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0YuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2F2Zm91bmRhdGlv
bi9NZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25DRi5jcHAJKHJldmlzaW9uIDkyMzE1KQor
KysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvYXZmb3VuZGF0aW9uL01lZGlhUGxh
eWVyUHJpdmF0ZUFWRm91bmRhdGlvbkNGLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjIsMyArMjIs
MTE4NCBAQAogICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCiAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKICAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisKKyNpZiBQTEFURk9STShXSU4pICYmIEVOQUJMRShWSURFTykgJiYgVVNF
KEFWRk9VTkRBVElPTikKKworI2luY2x1ZGUgIk1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlv
bkNGLmgiCisKKyNpbmNsdWRlICJBcHBsaWNhdGlvbkNhY2hlUmVzb3VyY2UuaCIKKyNpbmNsdWRl
ICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJGbG9hdENvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJH
cmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJLVVJMLmgiCisjaW5jbHVkZSAiTG9nZ2luZy5o
IgorI2luY2x1ZGUgIlBsYXRmb3JtQ0FMYXllci5oIgorI2luY2x1ZGUgIlNvZnRMaW5raW5nLmgi
CisjaW5jbHVkZSAiVGltZVJhbmdlcy5oIgorCisjaW5jbHVkZSA8ZGVsYXlpbXAuaD4KKyNpbmNs
dWRlIDxkaXNwYXRjaC9kaXNwYXRjaC5oPgorI2luY2x1ZGUgPHd0Zi9VbnVzZWRQYXJhbS5oPgor
I2luY2x1ZGUgPHd0Zi9UaHJlYWRpbmcuaD4KKworI2luY2x1ZGUgPEFWRm91bmRhdGlvbkNGL0FW
Rm91bmRhdGlvbkNGLmg+CisjaW5jbHVkZSA8QVZGb3VuZGF0aW9uQ0YvQVZDRlBsYXllckxheWVy
Lmg+CisjaW5jbHVkZSA8Q29yZU1lZGlhL0NvcmVNZWRpYS5oPgorCisjcHJhZ21hIGNvbW1lbnQo
bGliLCAiQVZGb3VuZGF0aW9uQ0YubGliIikKKyNwcmFnbWEgY29tbWVudChsaWIsICJDb3JlTWVk
aWEubGliIikKKyNwcmFnbWEgY29tbWVudChsaWIsICJsaWJkaXNwYXRjaC5saWIiKQorCisvLyBV
c2UgdGhlIHNvZnQgbGluayBtYWNyb3Mgc28gd2UgY2FuIGVhc2lseSB0ZXN0IGZvciB0aGUgZXhp
c3RlbmNlIG9mIHRoZSBkbGxzLgorU09GVF9MSU5LX0xJQlJBUlkoQVZGb3VuZGF0aW9uQ0YpCitT
T0ZUX0xJTktfTElCUkFSWShDb3JlTWVkaWEpCitTT0ZUX0xJTktfTElCUkFSWShsaWJkaXNwYXRj
aCkKKwordXNpbmcgbmFtZXNwYWNlIFdURjsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworY2xhc3MgTGF5ZXJDbGllbnQ7CitjbGFzcyBBVkZXcmFwcGVyIHsK
K3B1YmxpYzoKKworICAgIEFWRldyYXBwZXIoTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9u
Q0YqKTsKKyAgICB+QVZGV3JhcHBlcigpOworCisgICAgdm9pZCBzY2hlZHVsZURpc2Nvbm5lY3RB
bmREZWxldGUoKTsKKworICAgIHZvaWQgY3JlYXRlQVZDRlZpZGVvTGF5ZXIoKTsKKyAgICB2b2lk
IGRlc3Ryb3lWaWRlb0xheWVyKCk7CisgICAgUGxhdGZvcm1MYXllciogcGxhdGZvcm1MYXllcigp
OworCisgICAgQ0FDRkxheWVyUmVmIGNhVmlkZW9MYXllcigpIHsgcmV0dXJuIG1fY2FWaWRlb0xh
eWVyLmdldCgpOyB9CisgICAgUGxhdGZvcm1MYXllciogdmlkZW9MYXllcldyYXBwZXIoKSB7IHJl
dHVybiBtX3ZpZGVvTGF5ZXJXcmFwcGVyID8gbV92aWRlb0xheWVyV3JhcHBlci0+cGxhdGZvcm1M
YXllcigpIDogMDsgfTsKKyAgICB2b2lkIHNldFZpZGVvTGF5ZXJOZWVkc0NvbW1pdCgpOworICAg
IHZvaWQgc2V0VmlkZW9MYXllckhpZGRlbihib29sKTsKKworICAgIHZvaWQgY3JlYXRlSW1hZ2VH
ZW5lcmF0b3IoKTsKKyAgICB2b2lkIGRlc3Ryb3lJbWFnZUdlbmVyYXRvcigpOworICAgIFJldGFp
blB0cjxDR0ltYWdlUmVmPiBjcmVhdGVJbWFnZUZvclRpbWVJblJlY3QoZmxvYXQgdGltZSwgY29u
c3QgSW50UmVjdCYgcmVjdCk7CisKKyAgICB2b2lkIGNyZWF0ZUFzc2V0Rm9yVVJMKGNvbnN0IFN0
cmluZyYgdXJsKTsKKyAgICB2b2lkIHNldEFzc2V0KEFWQ0ZVUkxBc3NldFJlZik7CisgICAgCisg
ICAgdm9pZCBjcmVhdGVQbGF5ZXIoKTsKKyAgICB2b2lkIGNyZWF0ZVBsYXllckl0ZW0oKTsKKyAg
ICAKKyAgICB2b2lkIGNoZWNrUGxheWFiaWxpdHkoKTsKKyAgICB2b2lkIGJlZ2luTG9hZGluZ01l
dGFkYXRhKCk7CisgICAgCisgICAgdm9pZCBzZWVrVG9UaW1lKGZsb2F0KTsKKworICAgIHN0YXRp
YyB2b2lkIGxvYWRNZXRhZGF0YUNvbXBsZXRpb25DYWxsYmFjayhBVkNGQXNzZXRSZWYsIHZvaWQq
KTsKKyAgICBzdGF0aWMgdm9pZCBsb2FkUGxheWFibGVDb21wbGV0aW9uQ2FsbGJhY2soQVZDRkFz
c2V0UmVmLCB2b2lkKik7CisgICAgc3RhdGljIHZvaWQgcGVyaW9kaWNUaW1lT2JzZXJ2ZXJDYWxs
YmFjayhBVkNGUGxheWVyUmVmLCBDTVRpbWUsIHZvaWQqKTsKKyAgICBzdGF0aWMgdm9pZCBzZWVr
Q29tcGxldGVkQ2FsbGJhY2soQVZDRlBsYXllckl0ZW1SZWYsIEJvb2xlYW4sIHZvaWQqKTsKKyAg
ICBzdGF0aWMgdm9pZCBub3RpZmljYXRpb25DYWxsYmFjayhDRk5vdGlmaWNhdGlvbkNlbnRlclJl
Ziwgdm9pZCosIENGU3RyaW5nUmVmLCBjb25zdCB2b2lkKiwgQ0ZEaWN0aW9uYXJ5UmVmKTsKKwor
ICAgIGlubGluZSBBVkNGUGxheWVyTGF5ZXJSZWYgdmlkZW9MYXllcigpIGNvbnN0IHsgcmV0dXJu
IChBVkNGUGxheWVyTGF5ZXJSZWYpbV9hdkNGVmlkZW9MYXllci5nZXQoKTsgfQorICAgIGlubGlu
ZSBBVkNGUGxheWVyUmVmIGF2UGxheWVyKCkgY29uc3QgeyByZXR1cm4gKEFWQ0ZQbGF5ZXJSZWYp
bV9hdlBsYXllci5nZXQoKTsgfQorICAgIGlubGluZSBBVkNGVVJMQXNzZXRSZWYgYXZBc3NldCgp
IGNvbnN0IHsgcmV0dXJuIChBVkNGVVJMQXNzZXRSZWYpbV9hdkFzc2V0LmdldCgpOyB9CisgICAg
aW5saW5lIEFWQ0ZQbGF5ZXJJdGVtUmVmIGF2UGxheWVySXRlbSgpIGNvbnN0IHsgcmV0dXJuIChB
VkNGUGxheWVySXRlbVJlZiltX2F2UGxheWVySXRlbS5nZXQoKTsgfQorICAgIGlubGluZSBBVkNG
UGxheWVyT2JzZXJ2ZXJSZWYgdGltZU9ic2VydmVyKCkgY29uc3QgeyByZXR1cm4gKEFWQ0ZQbGF5
ZXJPYnNlcnZlclJlZiltX3RpbWVPYnNlcnZlci5nZXQoKTsgfQorICAgIGlubGluZSBBVkNGQXNz
ZXRJbWFnZUdlbmVyYXRvclJlZiBpbWFnZUdlbmVyYXRvcigpIGNvbnN0IHsgcmV0dXJuIG1faW1h
Z2VHZW5lcmF0b3IuZ2V0KCk7IH0KKyAgICBpbmxpbmUgZGlzcGF0Y2hfcXVldWVfdCBkaXNwYXRj
aFF1ZXVlKCkgY29uc3QgeyByZXR1cm4gbV9ub3RpZmljYXRpb25RdWV1ZTsgfQorCitwcml2YXRl
OgorICAgIHN0YXRpYyB2b2lkIGRpc2Nvbm5lY3RBbmREZWxldGVBVkZXcmFwcGVyKHZvaWQqKTsK
KyAgICBzdGF0aWMgdm9pZCBkZWxldGVBVkZXcmFwcGVyKHZvaWQqKTsKKworICAgIE1lZGlhUGxh
eWVyUHJpdmF0ZUFWRm91bmRhdGlvbkNGKiBtX293bmVyOworCisgICAgUmV0YWluUHRyPEFWQ0ZQ
bGF5ZXJSZWY+IG1fYXZQbGF5ZXI7CisgICAgUmV0YWluUHRyPEFWQ0ZVUkxBc3NldFJlZj4gbV9h
dkFzc2V0OworICAgIFJldGFpblB0cjxBVkNGUGxheWVySXRlbVJlZj4gbV9hdlBsYXllckl0ZW07
CisgICAgUmV0YWluUHRyPEFWQ0ZQbGF5ZXJMYXllclJlZj4gbV9hdkNGVmlkZW9MYXllcjsKKyAg
ICBSZXRhaW5QdHI8QVZDRlBsYXllck9ic2VydmVyUmVmPiBtX3RpbWVPYnNlcnZlcjsKKyAgICBS
ZXRhaW5QdHI8QVZDRkFzc2V0SW1hZ2VHZW5lcmF0b3JSZWY+IG1faW1hZ2VHZW5lcmF0b3I7Cisg
ICAgZGlzcGF0Y2hfcXVldWVfdCBtX25vdGlmaWNhdGlvblF1ZXVlOworCisgICAgbXV0YWJsZSBS
ZXRhaW5QdHI8Q0FDRkxheWVyUmVmPiBtX2NhVmlkZW9MYXllcjsKKyAgICBSZWZQdHI8UGxhdGZv
cm1DQUxheWVyPiBtX3ZpZGVvTGF5ZXJXcmFwcGVyOworCisgICAgT3duUHRyPExheWVyQ2xpZW50
PiBtX2xheWVyQ2xpZW50OworfTsKKworY2xhc3MgTGF5ZXJDbGllbnQgOiBwdWJsaWMgUGxhdGZv
cm1DQUxheWVyQ2xpZW50IHsKK3B1YmxpYzoKKyAgICBMYXllckNsaWVudChBVkZXcmFwcGVyKiBw
YXJlbnQpIDogbV9wYXJlbnQocGFyZW50KSB7fQorICAgIHZpcnR1YWwgfkxheWVyQ2xpZW50KCkg
eyBtX3BhcmVudCA9IDA7IH0KKworcHJpdmF0ZToKKyAgICB2aXJ0dWFsIHZvaWQgcGxhdGZvcm1D
QUxheWVyTGF5b3V0U3VibGF5ZXJzT2ZMYXllcihQbGF0Zm9ybUNBTGF5ZXIqKTsKKyAgICB2aXJ0
dWFsIGJvb2wgcGxhdGZvcm1DQUxheWVyUmVzcG9uZHNUb0xheW91dENoYW5nZXMoKSBjb25zdCB7
IHJldHVybiB0cnVlOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcGxhdGZvcm1DQUxheWVyQW5pbWF0
aW9uU3RhcnRlZChDRlRpbWVJbnRlcnZhbCBiZWdpblRpbWUpIHsgfQorICAgIHZpcnR1YWwgR3Jh
cGhpY3NMYXllcjo6Q29tcG9zaXRpbmdDb29yZGluYXRlc09yaWVudGF0aW9uIHBsYXRmb3JtQ0FM
YXllckNvbnRlbnRzT3JpZW50YXRpb24oKSBjb25zdCB7IHJldHVybiBHcmFwaGljc0xheWVyOjpD
b21wb3NpdGluZ0Nvb3JkaW5hdGVzQm90dG9tVXA7IH0KKyAgICB2aXJ0dWFsIHZvaWQgcGxhdGZv
cm1DQUxheWVyUGFpbnRDb250ZW50cyhHcmFwaGljc0NvbnRleHQmLCBjb25zdCBJbnRSZWN0JiBp
bkNsaXApIHsgfQorICAgIHZpcnR1YWwgYm9vbCBwbGF0Zm9ybUNBTGF5ZXJTaG93RGVidWdCb3Jk
ZXJzKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFsIGJvb2wgcGxhdGZvcm1D
QUxheWVyU2hvd1JlcGFpbnRDb3VudGVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICB2
aXJ0dWFsIGludCBwbGF0Zm9ybUNBTGF5ZXJJbmNyZW1lbnRSZXBhaW50Q291bnQoKSB7IHJldHVy
biAwOyB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcGxhdGZvcm1DQUxheWVyQ29udGVudHNPcGFxdWUo
KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgYm9vbCBwbGF0Zm9ybUNBTGF5
ZXJEcmF3c0NvbnRlbnQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1YWwgdm9p
ZCBwbGF0Zm9ybUNBTGF5ZXJMYXllckRpZERpc3BsYXkoUGxhdGZvcm1MYXllciopIHsgfQorCisg
ICAgQVZGV3JhcHBlciogbV9wYXJlbnQ7Cit9OworCisjaWYgIUxPR19ESVNBQkxFRAorc3RhdGlj
IGNvbnN0IGNoYXIqIGJvb2xTdHJpbmcoYm9vbCB2YWwpCit7CisgICAgcmV0dXJuIHZhbCA/ICJ0
cnVlIiA6ICJmYWxzZSI7Cit9CisjZW5kaWYKKworc3RhdGljIENGQXJyYXlSZWYgbWV0YWRhdGFL
ZXlOYW1lcygpCit7CisgICAgc3RhdGljIENGQXJyYXlSZWYga2V5czsKKyAgICBpZiAoIWtleXMp
IHsKKyAgICAgICAgc3RhdGljIGNvbnN0IENGU3RyaW5nUmVmIGtleU5hbWVzW10gPSB7CisgICAg
ICAgICAgICBBVkNGQXNzZXRQcm9wZXJ0eUR1cmF0aW9uLAorICAgICAgICAgICAgQVZDRkFzc2V0
UHJvcGVydHlOYXR1cmFsU2l6ZSwKKyAgICAgICAgICAgIEFWQ0ZBc3NldFByb3BlcnR5UHJlZmVy
cmVkVHJhbnNmb3JtLAorICAgICAgICAgICAgQVZDRkFzc2V0UHJvcGVydHlQcmVmZXJyZWRSYXRl
LAorICAgICAgICAgICAgQVZDRkFzc2V0UHJvcGVydHlQbGF5YWJsZSwKKyAgICAgICAgICAgIEFW
Q0ZBc3NldFByb3BlcnR5VHJhY2tzIAorICAgICAgICB9OworICAgICAgICBrZXlzID0gQ0ZBcnJh
eUNyZWF0ZSgwLCAoY29uc3Qgdm9pZCoqKWtleU5hbWVzLCBzaXplb2Yoa2V5TmFtZXMpIC8gc2l6
ZW9mKGtleU5hbWVzWzBdKSwgJmtDRlR5cGVBcnJheUNhbGxCYWNrcyk7CisgICAgfQorICAgIHJl
dHVybiBrZXlzOworfQorCitzdGF0aWMgY29uc3QgQ0ZTdHJpbmdSZWYgQ01UaW1lUmFuZ2VTdGFy
dEtleSgpCit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChDRlN0cmluZ1JlZiwga2V5LCAoQ0ZT
VFIoInN0YXJ0IikpKTsKKyAgICByZXR1cm4ga2V5OworfQorCitzdGF0aWMgY29uc3QgQ0ZTdHJp
bmdSZWYgQ01UaW1lUmFuZ2VEdXJhdGlvbktleSgpCit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NB
TChDRlN0cmluZ1JlZiwga2V5LCAoQ0ZTVFIoImR1cmF0aW9uIikpKTsKKyAgICByZXR1cm4ga2V5
OworfQorCitzdGF0aWMgY29uc3QgQ0ZTdHJpbmdSZWYgQ0FDRkNvbnRleHROZWVkc0ZsdXNoTm90
aWZpY2F0aW9uKCkKK3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKENGU3RyaW5nUmVmLCBuYW1l
LCAoQ0ZTVFIoImtDQUNGQ29udGV4dE5lZWRzRmx1c2hOb3RpZmljYXRpb24iKSkpOworICAgIHJl
dHVybiBuYW1lOworfQorCisvLyBEZWZpbmUgQVZDRiBvYmplY3QgYWNjZXNzb3JzIGFzIGlubGlu
ZSBmdW5jdGlvbnMgaGVyZSBpbnN0ZWFkIG9mIGluIE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRh
dGlvbkNGIHNvIHdlIGRvbid0IGhhdmUKKy8vIHRvIGluY2x1ZGUgdGhlIEFWQ0YgaGVhZGVycyBp
biBNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25DRi5oCitpbmxpbmUgQVZDRlBsYXllckxh
eWVyUmVmIHZpZGVvTGF5ZXIoQVZGV3JhcHBlciogd3JhcHBlcikKK3sgCisgICAgcmV0dXJuIHdy
YXBwZXIgPyB3cmFwcGVyLT52aWRlb0xheWVyKCkgOiAwOyAKK30KKworaW5saW5lIEFWQ0ZQbGF5
ZXJSZWYgYXZQbGF5ZXIoQVZGV3JhcHBlciogd3JhcHBlcikKK3sgCisgICAgcmV0dXJuIHdyYXBw
ZXIgPyB3cmFwcGVyLT5hdlBsYXllcigpIDogMDsgCit9CisKK2lubGluZSBBVkNGVVJMQXNzZXRS
ZWYgYXZBc3NldChBVkZXcmFwcGVyKiB3cmFwcGVyKQoreyAKKyAgICByZXR1cm4gd3JhcHBlciA/
IHdyYXBwZXItPmF2QXNzZXQoKSA6IDA7IAorfQorCitpbmxpbmUgQVZDRlBsYXllckl0ZW1SZWYg
YXZQbGF5ZXJJdGVtKEFWRldyYXBwZXIqIHdyYXBwZXIpCit7IAorICAgIHJldHVybiB3cmFwcGVy
ID8gd3JhcHBlci0+YXZQbGF5ZXJJdGVtKCkgOiAwOyAKK30KKworaW5saW5lIEFWQ0ZBc3NldElt
YWdlR2VuZXJhdG9yUmVmIGltYWdlR2VuZXJhdG9yKEFWRldyYXBwZXIqIHdyYXBwZXIpCit7IAor
ICAgIHJldHVybiB3cmFwcGVyID8gd3JhcHBlci0+aW1hZ2VHZW5lcmF0b3IoKSA6IDA7IAorfQor
CitQYXNzT3duUHRyPE1lZGlhUGxheWVyUHJpdmF0ZUludGVyZmFjZT4gTWVkaWFQbGF5ZXJQcml2
YXRlQVZGb3VuZGF0aW9uQ0Y6OmNyZWF0ZShNZWRpYVBsYXllciogcGxheWVyKSAKK3sgCisgICAg
cmV0dXJuIGFkb3B0UHRyKG5ldyBNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25DRihwbGF5
ZXIpKTsKK30KKwordm9pZCBNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25DRjo6cmVnaXN0
ZXJNZWRpYUVuZ2luZShNZWRpYUVuZ2luZVJlZ2lzdHJhciByZWdpc3RyYXIpCit7CisgICAgaWYg
KGlzQXZhaWxhYmxlKCkpCisgICAgICAgIHJlZ2lzdHJhcihjcmVhdGUsIGdldFN1cHBvcnRlZFR5
cGVzLCBzdXBwb3J0c1R5cGUsIDAsIDAsIDApOworfQorCitNZWRpYVBsYXllclByaXZhdGVBVkZv
dW5kYXRpb25DRjo6TWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0YoTWVkaWFQbGF5ZXIq
IHBsYXllcikKKyAgICA6IE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbihwbGF5ZXIpCisg
ICAgLCBtX2F2ZldyYXBwZXIoMCkKKyAgICAsIG1fdmlkZW9GcmFtZUhhc0RyYXduKGZhbHNlKQor
eworICAgIExPRyhNZWRpYSwgIk1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbkNGOjpNZWRp
YVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25DRiglcCkiLCB0aGlzKTsKK30KKworTWVkaWFQbGF5
ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6On5NZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25D
RigpCit7CisgICAgTE9HKE1lZGlhLCAiTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6
On5NZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25DRiglcCkiLCB0aGlzKTsKKyAgICBjYW5j
ZWxMb2FkKCk7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6OmNh
bmNlbExvYWQoKQoreworICAgIExPRyhNZWRpYSwgIk1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRh
dGlvbkNGOjpjYW5jZWxMb2FkKCVwKSIsIHRoaXMpOworCisgICAgLy8gRG8gbm90aGluZyB3aGVu
IG91ciBjYW5jZWxsYXRpb24gb2YgcGVuZGluZyBsb2FkaW5nIGNhbGxzIGl0cyBjb21wbGV0aW9u
IGhhbmRsZXIKKyAgICBzZXREZWxheUNhbGxiYWNrcyh0cnVlKTsKKyAgICBzZXRJZ25vcmVMb2Fk
U3RhdGVDaGFuZ2VzKHRydWUpOworCisgICAgdGVhckRvd25WaWRlb1JlbmRlcmluZygpOworCisg
ICAgaWYgKG1fYXZmV3JhcHBlcikgeworICAgICAgICAvLyBUaGUgQVZDRiBvYmplY3RzIGhhdmUg
dG8gYmUgZGVzdHJveWVkIG9uIHRoZSBzYW1lIGRpc3BhdGNoIHF1ZXVlIHVzZWQgZm9yIG5vdGlm
aWNhdGlvbnMsIHNvIHNjaGVkdWxlIGEgY2FsbCB0byAKKyAgICAgICAgLy8gZGlzY29ubmVjdEFu
ZERlbGV0ZUFWRldyYXBwZXIgb24gdGhhdCBxdWV1ZS4gCisgICAgICAgIG1fYXZmV3JhcHBlci0+
c2NoZWR1bGVEaXNjb25uZWN0QW5kRGVsZXRlKCk7CisgICAgICAgIG1fYXZmV3JhcHBlciA9IDA7
CisgICAgfQorCisgICAgc2V0SWdub3JlTG9hZFN0YXRlQ2hhbmdlcyhmYWxzZSk7CisgICAgc2V0
RGVsYXlDYWxsYmFja3MoZmFsc2UpOworfQorCitib29sIE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91
bmRhdGlvbkNGOjpoYXNMYXllclJlbmRlcmVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gdmlkZW9M
YXllcihtX2F2ZldyYXBwZXIpOworfQorCitib29sIE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRh
dGlvbkNGOjpoYXNDb250ZXh0UmVuZGVyZXIoKSBjb25zdAoreworICAgIHJldHVybiBpbWFnZUdl
bmVyYXRvcihtX2F2ZldyYXBwZXIpOworfQorCit2b2lkIE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91
bmRhdGlvbkNGOjpjcmVhdGVDb250ZXh0VmlkZW9SZW5kZXJlcigpCit7CisgICAgTE9HKE1lZGlh
LCAiTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6OmNyZWF0ZUNvbnRleHRWaWRlb1Jl
bmRlcmVyKCVwKSIsIHRoaXMpOworCisgICAgaWYgKGltYWdlR2VuZXJhdG9yKG1fYXZmV3JhcHBl
cikpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtX2F2ZldyYXBwZXIpCisgICAgICAgIG1f
YXZmV3JhcHBlci0+Y3JlYXRlSW1hZ2VHZW5lcmF0b3IoKTsKK30KKwordm9pZCBNZWRpYVBsYXll
clByaXZhdGVBVkZvdW5kYXRpb25DRjo6ZGVzdHJveUNvbnRleHRWaWRlb1JlbmRlcmVyKCkKK3sK
KyAgICBpZiAobV9hdmZXcmFwcGVyKQorICAgICAgICBtX2F2ZldyYXBwZXItPmRlc3Ryb3lJbWFn
ZUdlbmVyYXRvcigpOworfQorCit2b2lkIE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbkNG
OjpjcmVhdGVWaWRlb0xheWVyKCkKK3sKKyAgICBBU1NFUlQoc3VwcG9ydHNBY2NlbGVyYXRlZFJl
bmRlcmluZygpKTsKKworICAgIGlmIChtX2F2ZldyYXBwZXIpCisgICAgICAgIG1fYXZmV3JhcHBl
ci0+Y3JlYXRlQVZDRlZpZGVvTGF5ZXIoKTsKK30KKwordm9pZCBNZWRpYVBsYXllclByaXZhdGVB
VkZvdW5kYXRpb25DRjo6ZGVzdHJveVZpZGVvTGF5ZXIoKQoreworICAgIExPRyhNZWRpYSwgIk1l
ZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbkNGOjpkZXN0cm95VmlkZW9MYXllciglcCkgLSBk
ZXN0cm95aW5nICVwIiwgdGhpcywgdmlkZW9MYXllcihtX2F2ZldyYXBwZXIpKTsKKyAgICBpZiAo
bV9hdmZXcmFwcGVyKQorICAgICAgICBtX2F2ZldyYXBwZXItPmRlc3Ryb3lWaWRlb0xheWVyKCk7
Cit9CisKK2Jvb2wgTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6Omhhc0F2YWlsYWJs
ZVZpZGVvRnJhbWUoKSBjb25zdAoreworICAgIHJldHVybiAobV92aWRlb0ZyYW1lSGFzRHJhd24g
fHwgKHZpZGVvTGF5ZXIobV9hdmZXcmFwcGVyKSAmJiBBVkNGUGxheWVyTGF5ZXJJc1JlYWR5Rm9y
RGlzcGxheSh2aWRlb0xheWVyKG1fYXZmV3JhcHBlcikpKSk7Cit9CisKK3ZvaWQgTWVkaWFQbGF5
ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6OmNyZWF0ZUFWUGxheWVyKCkKK3sKKyAgICBBU1NFUlQo
bV9hdmZXcmFwcGVyKTsKKyAgICAKKyAgICBzZXREZWxheUNhbGxiYWNrcyh0cnVlKTsKKyAgICBt
X2F2ZldyYXBwZXItPmNyZWF0ZVBsYXllcigpOworICAgIHNldERlbGF5Q2FsbGJhY2tzKGZhbHNl
KTsKK30KKwordm9pZCBNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25DRjo6Y3JlYXRlQVZQ
bGF5ZXJJdGVtKCkKK3sKKyAgICBBU1NFUlQobV9hdmZXcmFwcGVyKTsKKyAgICAKKyAgICBzZXRE
ZWxheUNhbGxiYWNrcyh0cnVlKTsKKyAgICBtX2F2ZldyYXBwZXItPmNyZWF0ZVBsYXllckl0ZW0o
KTsKKyAgICBzZXREZWxheUNhbGxiYWNrcyhmYWxzZSk7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXJQ
cml2YXRlQVZGb3VuZGF0aW9uQ0Y6OmNyZWF0ZUFWQXNzZXRGb3JVUkwoY29uc3QgU3RyaW5nJiB1
cmwpCit7CisgICAgQVNTRVJUKCFtX2F2ZldyYXBwZXIpOworICAgIAorICAgIHNldERlbGF5Q2Fs
bGJhY2tzKHRydWUpOworICAgIG1fYXZmV3JhcHBlciA9IG5ldyBBVkZXcmFwcGVyKHRoaXMpOwor
ICAgIG1fYXZmV3JhcHBlci0+Y3JlYXRlQXNzZXRGb3JVUkwodXJsKTsKKyAgICBzZXREZWxheUNh
bGxiYWNrcyhmYWxzZSk7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9u
Q0Y6OmNoZWNrUGxheWFiaWxpdHkoKQoreworICAgIEFTU0VSVChtX2F2ZldyYXBwZXIpOworICAg
IG1fYXZmV3JhcHBlci0+Y2hlY2tQbGF5YWJpbGl0eSgpOworfQorCit2b2lkIE1lZGlhUGxheWVy
UHJpdmF0ZUFWRm91bmRhdGlvbkNGOjpiZWdpbkxvYWRpbmdNZXRhZGF0YSgpCit7CisgICAgQVNT
RVJUKG1fYXZmV3JhcHBlcik7CisgICAgbV9hdmZXcmFwcGVyLT5iZWdpbkxvYWRpbmdNZXRhZGF0
YSgpOworfQorCitNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb246Okl0ZW1TdGF0dXMgTWVk
aWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6OnBsYXllckl0ZW1TdGF0dXMoKSBjb25zdAor
eworICAgIGlmICghYXZQbGF5ZXJJdGVtKG1fYXZmV3JhcHBlcikpCisgICAgICAgIHJldHVybiBN
ZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb246Ok1lZGlhUGxheWVyQVZQbGF5ZXJJdGVtU3Rh
dHVzVW5rbm93bjsKKworICAgIEFWQ0ZQbGF5ZXJJdGVtU3RhdHVzIHN0YXR1cyA9IEFWQ0ZQbGF5
ZXJJdGVtR2V0U3RhdHVzKGF2UGxheWVySXRlbShtX2F2ZldyYXBwZXIpLCAwKTsKKyAgICBpZiAo
c3RhdHVzID09IEFWQ0ZQbGF5ZXJJdGVtU3RhdHVzVW5rbm93bikKKyAgICAgICAgcmV0dXJuIE1l
ZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbjo6TWVkaWFQbGF5ZXJBVlBsYXllckl0ZW1TdGF0
dXNVbmtub3duOworICAgIGlmIChzdGF0dXMgPT0gQVZDRlBsYXllckl0ZW1TdGF0dXNGYWlsZWQp
CisgICAgICAgIHJldHVybiBNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb246Ok1lZGlhUGxh
eWVyQVZQbGF5ZXJJdGVtU3RhdHVzRmFpbGVkOworICAgIGlmIChBVkNGUGxheWVySXRlbUlzUGxh
eWJhY2tMaWtlbHlUb0tlZXBVcChhdlBsYXllckl0ZW0obV9hdmZXcmFwcGVyKSkpCisgICAgICAg
IHJldHVybiBNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb246Ok1lZGlhUGxheWVyQVZQbGF5
ZXJJdGVtU3RhdHVzUGxheWJhY2tMaWtlbHlUb0tlZXBVcDsKKyAgICBpZiAoQVZDRlBsYXllckl0
ZW1Jc1BsYXliYWNrQnVmZmVyRnVsbChhdlBsYXllckl0ZW0obV9hdmZXcmFwcGVyKSkpCisgICAg
ICAgIHJldHVybiBNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb246Ok1lZGlhUGxheWVyQVZQ
bGF5ZXJJdGVtU3RhdHVzUGxheWJhY2tCdWZmZXJGdWxsOworICAgIGlmIChBVkNGUGxheWVySXRl
bUlzUGxheWJhY2tCdWZmZXJFbXB0eShhdlBsYXllckl0ZW0obV9hdmZXcmFwcGVyKSkpCisgICAg
ICAgIHJldHVybiBNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb246Ok1lZGlhUGxheWVyQVZQ
bGF5ZXJJdGVtU3RhdHVzUGxheWJhY2tCdWZmZXJFbXB0eTsKKyAgICByZXR1cm4gTWVkaWFQbGF5
ZXJQcml2YXRlQVZGb3VuZGF0aW9uOjpNZWRpYVBsYXllckFWUGxheWVySXRlbVN0YXR1c1JlYWR5
VG9QbGF5OworfQorCitQbGF0Zm9ybU1lZGlhIE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlv
bkNGOjpwbGF0Zm9ybU1lZGlhKCkgY29uc3QKK3sKKyAgICBMT0coTWVkaWEsICJNZWRpYVBsYXll
clByaXZhdGVBVkZvdW5kYXRpb25DRjo6cGxhdGZvcm1NZWRpYSglcCkiLCB0aGlzKTsKKyAgICBQ
bGF0Zm9ybU1lZGlhIHBtOworICAgIHBtLnR5cGUgPSBQbGF0Zm9ybU1lZGlhOjpBVkZvdW5kYXRp
b25DRk1lZGlhUGxheWVyVHlwZTsKKyAgICBwbS5tZWRpYS5hdmNmTWVkaWFQbGF5ZXIgPSAoQVZD
RlBsYXllciopYXZQbGF5ZXIobV9hdmZXcmFwcGVyKTsKKyAgICByZXR1cm4gcG07Cit9CisKK1Bs
YXRmb3JtTGF5ZXIqIE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbkNGOjpwbGF0Zm9ybUxh
eWVyKCkgY29uc3QKK3sKKyAgICBpZiAoIW1fYXZmV3JhcHBlcikKKyAgICAgICAgcmV0dXJuIDA7
CisKKyAgICByZXR1cm4gbV9hdmZXcmFwcGVyLT5wbGF0Zm9ybUxheWVyKCk7Cit9CisKK3ZvaWQg
TWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6OnBsYXRmb3JtU2V0VmlzaWJsZShib29s
IGlzVmlzaWJsZSkKK3sKKyAgICBpZiAoIW1fYXZmV3JhcHBlcikKKyAgICAgICAgcmV0dXJuOwor
ICAgIAorICAgIC8vIEZJWE1FOiBXZSB1c2UgYSBDQVRyYW5zYWN0aW9uIGhlcmUgb24gdGhlIE1h
Yywgd2UgbmVlZCB0byBmaWd1cmUgb3V0IHdoeSB0aGlzIHdhcyBkb25lIHRoZXJlIGFuZAorICAg
IC8vIHdoZXRoZXIgd2UncmUgYWZmZWN0ZWQgYnkgdGhlIHNhbWUgaXNzdWUuCisgICAgc2V0RGVs
YXlDYWxsYmFja3ModHJ1ZSk7CisgICAgbV9hdmZXcmFwcGVyLT5zZXRWaWRlb0xheWVySGlkZGVu
KCFpc1Zpc2libGUpOyAgICAKKyAgICBzZXREZWxheUNhbGxiYWNrcyhmYWxzZSk7Cit9CisKK3Zv
aWQgTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6OnBsYXRmb3JtUGxheSgpCit7Cisg
ICAgTE9HKE1lZGlhLCAiTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6OnBsYXkoJXAp
IiwgdGhpcyk7CisgICAgaWYgKCFtZXRhRGF0YUF2YWlsYWJsZSgpIHx8ICFhdlBsYXllcihtX2F2
ZldyYXBwZXIpKQorICAgICAgICByZXR1cm47CisKKyAgICBzZXREZWxheUNhbGxiYWNrcyh0cnVl
KTsKKyAgICBBVkNGUGxheWVyU2V0UmF0ZShhdlBsYXllcihtX2F2ZldyYXBwZXIpLCByZXF1ZXN0
ZWRSYXRlKCkpOworICAgIHNldERlbGF5Q2FsbGJhY2tzKGZhbHNlKTsKK30KKwordm9pZCBNZWRp
YVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25DRjo6cGxhdGZvcm1QYXVzZSgpCit7CisgICAgTE9H
KE1lZGlhLCAiTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6OnBhdXNlKCVwKSIsIHRo
aXMpOworICAgIGlmICghbWV0YURhdGFBdmFpbGFibGUoKSB8fCAhYXZQbGF5ZXIobV9hdmZXcmFw
cGVyKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc2V0RGVsYXlDYWxsYmFja3ModHJ1ZSk7Cisg
ICAgQVZDRlBsYXllclNldFJhdGUoYXZQbGF5ZXIobV9hdmZXcmFwcGVyKSwgMCk7CisgICAgc2V0
RGVsYXlDYWxsYmFja3MoZmFsc2UpOworfQorCit2b2lkIE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91
bmRhdGlvbkNGOjp1cGRhdGVSYXRlKCkKK3sKKyAgICBMT0coTWVkaWEsICJNZWRpYVBsYXllclBy
aXZhdGVBVkZvdW5kYXRpb25DRjo6dXBkYXRlUmF0ZSglcCkiLCB0aGlzKTsKKyAgICBpZiAoIW1l
dGFEYXRhQXZhaWxhYmxlKCkgfHwgIWF2UGxheWVyKG1fYXZmV3JhcHBlcikpCisgICAgICAgIHJl
dHVybjsKKworICAgIHNldERlbGF5Q2FsbGJhY2tzKHRydWUpOworICAgIEFWQ0ZQbGF5ZXJTZXRS
YXRlKGF2UGxheWVyKG1fYXZmV3JhcHBlciksIHJlcXVlc3RlZFJhdGUoKSk7CisgICAgc2V0RGVs
YXlDYWxsYmFja3MoZmFsc2UpOworfQorCitmbG9hdCBNZWRpYVBsYXllclByaXZhdGVBVkZvdW5k
YXRpb25DRjo6cGxhdGZvcm1EdXJhdGlvbigpIGNvbnN0Cit7CisgICAgaWYgKCFtZXRhRGF0YUF2
YWlsYWJsZSgpIHx8ICFhdkFzc2V0KG1fYXZmV3JhcHBlcikpCisgICAgICAgIHJldHVybiAwOwor
CisgICAgZmxvYXQgZHVyYXRpb247CisgICAgQ01UaW1lIGNtRHVyYXRpb24gPSBBVkNGQXNzZXRH
ZXREdXJhdGlvbihhdkFzc2V0KG1fYXZmV3JhcHBlcikpOworICAgIGlmIChDTVRJTUVfSVNfTlVN
RVJJQyhjbUR1cmF0aW9uKSkKKyAgICAgICAgZHVyYXRpb24gPSBuYXJyb3dQcmVjaXNpb25Ub0Zs
b2F0KENNVGltZUdldFNlY29uZHMoY21EdXJhdGlvbikpOworICAgIGVsc2UgaWYgKENNVElNRV9J
U19JTkRFRklOSVRFKGNtRHVyYXRpb24pKQorICAgICAgICBkdXJhdGlvbiA9IG51bWVyaWNfbGlt
aXRzPGZsb2F0Pjo6aW5maW5pdHkoKTsKKyAgICBlbHNlIHsKKyAgICAgICAgTE9HKE1lZGlhLCAi
TWVkaWFQbGF5ZXJQcml2YXRlQVZGTWFjOjpkdXJhdGlvbiglcCkgLSBpbnZhbGlkIGR1cmF0aW9u
LCByZXR1cm5pbmcgMCIsIHRoaXMpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBy
ZXR1cm4gZHVyYXRpb247Cit9CisKK2Zsb2F0IE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlv
bkNGOjpjdXJyZW50VGltZSgpIGNvbnN0Cit7CisgICAgaWYgKCFtZXRhRGF0YUF2YWlsYWJsZSgp
IHx8ICFhdlBsYXllckl0ZW0obV9hdmZXcmFwcGVyKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAg
ICBDTVRpbWUgaXRlbVRpbWUgPSBBVkNGUGxheWVySXRlbUdldEN1cnJlbnRUaW1lKGF2UGxheWVy
SXRlbShtX2F2ZldyYXBwZXIpKTsKKyAgICBpZiAoQ01USU1FX0lTX05VTUVSSUMoaXRlbVRpbWUp
KQorICAgICAgICByZXR1cm4gbmFycm93UHJlY2lzaW9uVG9GbG9hdChDTVRpbWVHZXRTZWNvbmRz
KGl0ZW1UaW1lKSk7CisKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBNZWRpYVBsYXllclByaXZh
dGVBVkZvdW5kYXRpb25DRjo6c2Vla1RvVGltZShmbG9hdCB0aW1lKQoreworICAgIGlmICghbV9h
dmZXcmFwcGVyKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgLy8gc2Vla1RvVGltZSBnZW5l
cmF0ZXMgc2V2ZXJhbCBldmVudCBjYWxsYmFja3MsIHVwZGF0ZSBhZnRlcndhcmRzLgorICAgIHNl
dERlbGF5Q2FsbGJhY2tzKHRydWUpOworICAgIG1fYXZmV3JhcHBlci0+c2Vla1RvVGltZSh0aW1l
KTsKKyAgICBzZXREZWxheUNhbGxiYWNrcyhmYWxzZSk7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXJQ
cml2YXRlQVZGb3VuZGF0aW9uQ0Y6OnNldFZvbHVtZShmbG9hdCB2b2x1bWUpCit7CisgICAgaWYg
KCFtZXRhRGF0YUF2YWlsYWJsZSgpIHx8ICFhdlBsYXllcihtX2F2ZldyYXBwZXIpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBBVkNGUGxheWVyU2V0Vm9sdW1lKGF2UGxheWVyKG1fYXZmV3JhcHBl
ciksIHZvbHVtZSk7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6
OnNldENsb3NlZENhcHRpb25zVmlzaWJsZShib29sIGNsb3NlZENhcHRpb25zVmlzaWJsZSkKK3sK
KyAgICBpZiAoIW1ldGFEYXRhQXZhaWxhYmxlKCkgfHwgIWF2UGxheWVyKG1fYXZmV3JhcHBlcikp
CisgICAgICAgIHJldHVybjsKKworICAgIExPRyhNZWRpYSwgIk1lZGlhUGxheWVyUHJpdmF0ZUFW
Rm91bmRhdGlvbkNGOjpzZXRDbG9zZWRDYXB0aW9uc1Zpc2libGUoJXApIC0gc2V0dGluZyB0byAl
cyIsIHRoaXMsIGJvb2xTdHJpbmcoY2xvc2VkQ2FwdGlvbnNWaXNpYmxlKSk7CisgICAgQVZDRlBs
YXllclNldENsb3NlZENhcHRpb25EaXNwbGF5RW5hYmxlZChhdlBsYXllcihtX2F2ZldyYXBwZXIp
LCBjbG9zZWRDYXB0aW9uc1Zpc2libGUpOworfQorCitmbG9hdCBNZWRpYVBsYXllclByaXZhdGVB
VkZvdW5kYXRpb25DRjo6cmF0ZSgpIGNvbnN0Cit7CisgICAgaWYgKCFtZXRhRGF0YUF2YWlsYWJs
ZSgpIHx8ICFhdlBsYXllcihtX2F2ZldyYXBwZXIpKQorICAgICAgICByZXR1cm4gMDsKKworICAg
IHNldERlbGF5Q2FsbGJhY2tzKHRydWUpOworICAgIGZsb2F0IGN1cnJlbnRSYXRlID0gQVZDRlBs
YXllckdldFJhdGUoYXZQbGF5ZXIobV9hdmZXcmFwcGVyKSk7CisgICAgc2V0RGVsYXlDYWxsYmFj
a3MoZmFsc2UpOworCisgICAgcmV0dXJuIGN1cnJlbnRSYXRlOworfQorCitzdGF0aWMgYm9vbCB0
aW1lUmFuZ2VJc1ZhbGlkQW5kTm90RW1wdHkoQ01UaW1lIHN0YXJ0LCBDTVRpbWUgZHVyYXRpb24p
Cit7CisgICAgLy8gSXMgdGhlIHJhbmdlIHZhbGlkPworICAgIGlmICghQ01USU1FX0lTX1ZBTElE
KHN0YXJ0KSB8fCAhQ01USU1FX0lTX1ZBTElEKGR1cmF0aW9uKSB8fCBkdXJhdGlvbi5lcG9jaCB8
fCBkdXJhdGlvbi52YWx1ZSA8IDApCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChD
TVRJTUVfQ09NUEFSRV9JTkxJTkUoZHVyYXRpb24sID09LCBrQ01UaW1lWmVybykpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworfQorCitQYXNzUmVmUHRyPFRpbWVS
YW5nZXM+IE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbkNGOjpwbGF0Zm9ybUJ1ZmZlcmVk
VGltZVJhbmdlcygpIGNvbnN0Cit7CisgICAgUmVmUHRyPFRpbWVSYW5nZXM+IHRpbWVSYW5nZXMg
PSBUaW1lUmFuZ2VzOjpjcmVhdGUoKTsKKworICAgIGlmICghYXZQbGF5ZXJJdGVtKG1fYXZmV3Jh
cHBlcikpCisgICAgICAgIHJldHVybiB0aW1lUmFuZ2VzLnJlbGVhc2UoKTsKKworICAgIFJldGFp
blB0cjxDRkFycmF5UmVmPiBsb2FkZWRSYW5nZXMoQWRvcHRDRiwgQVZDRlBsYXllckl0ZW1Db3B5
TG9hZGVkVGltZVJhbmdlcyhhdlBsYXllckl0ZW0obV9hdmZXcmFwcGVyKSkpOworICAgIGlmICgh
bG9hZGVkUmFuZ2VzKQorICAgICAgICByZXR1cm4gdGltZVJhbmdlcy5yZWxlYXNlKCk7CisKKyAg
ICBDRkluZGV4IHJhbmdlQ291bnQgPSBDRkFycmF5R2V0Q291bnQobG9hZGVkUmFuZ2VzLmdldCgp
KTsKKyAgICBmb3IgKENGSW5kZXggaSA9IDA7IGkgPCByYW5nZUNvdW50OyBpKyspIHsKKyAgICAg
ICAgQ0ZEaWN0aW9uYXJ5UmVmIHJhbmdlID0gc3RhdGljX2Nhc3Q8Q0ZEaWN0aW9uYXJ5UmVmPihD
RkFycmF5R2V0VmFsdWVBdEluZGV4KGxvYWRlZFJhbmdlcy5nZXQoKSwgaSkpOworICAgICAgICBD
TVRpbWUgc3RhcnQgPSBDTVRpbWVNYWtlRnJvbURpY3Rpb25hcnkoc3RhdGljX2Nhc3Q8Q0ZEaWN0
aW9uYXJ5UmVmPihDRkRpY3Rpb25hcnlHZXRWYWx1ZShyYW5nZSwgQ01UaW1lUmFuZ2VTdGFydEtl
eSgpKSkpOworICAgICAgICBDTVRpbWUgZHVyYXRpb24gPSBDTVRpbWVNYWtlRnJvbURpY3Rpb25h
cnkoc3RhdGljX2Nhc3Q8Q0ZEaWN0aW9uYXJ5UmVmPihDRkRpY3Rpb25hcnlHZXRWYWx1ZShyYW5n
ZSwgQ01UaW1lUmFuZ2VEdXJhdGlvbktleSgpKSkpOworICAgICAgICAKKyAgICAgICAgaWYgKHRp
bWVSYW5nZUlzVmFsaWRBbmROb3RFbXB0eShzdGFydCwgZHVyYXRpb24pKSB7CisgICAgICAgICAg
ICBmbG9hdCByYW5nZVN0YXJ0ID0gbmFycm93UHJlY2lzaW9uVG9GbG9hdChDTVRpbWVHZXRTZWNv
bmRzKHN0YXJ0KSk7CisgICAgICAgICAgICBmbG9hdCByYW5nZUVuZCA9IG5hcnJvd1ByZWNpc2lv
blRvRmxvYXQoQ01UaW1lR2V0U2Vjb25kcyhDTVRpbWVBZGQoc3RhcnQsIGR1cmF0aW9uKSkpOwor
ICAgICAgICAgICAgdGltZVJhbmdlcy0+YWRkKHJhbmdlU3RhcnQsIHJhbmdlRW5kKTsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIHJldHVybiB0aW1lUmFuZ2VzLnJlbGVhc2UoKTsKK30KKworZmxv
YXQgTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6OnBsYXRmb3JtTWF4VGltZVNlZWth
YmxlKCkgY29uc3QKK3sKKyAgICBpZiAoIWF2UGxheWVySXRlbShtX2F2ZldyYXBwZXIpKQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIFJldGFpblB0cjxDRkFycmF5UmVmPiBzZWVrYWJsZVJhbmdl
cyhBZG9wdENGLCBBVkNGUGxheWVySXRlbUNvcHlTZWVrYWJsZVRpbWVSYW5nZXMoYXZQbGF5ZXJJ
dGVtKG1fYXZmV3JhcHBlcikpKTsKKyAgICBpZiAoIXNlZWthYmxlUmFuZ2VzKQorICAgICAgICBy
ZXR1cm4gMDsKKworICAgIGZsb2F0IG1heFRpbWVTZWVrYWJsZSA9IDA7CisgICAgQ0ZJbmRleCBy
YW5nZUNvdW50ID0gQ0ZBcnJheUdldENvdW50KHNlZWthYmxlUmFuZ2VzLmdldCgpKTsKKyAgICBm
b3IgKENGSW5kZXggaSA9IDA7IGkgPCByYW5nZUNvdW50OyBpKyspIHsKKyAgICAgICAgQ0ZEaWN0
aW9uYXJ5UmVmIHJhbmdlID0gc3RhdGljX2Nhc3Q8Q0ZEaWN0aW9uYXJ5UmVmPihDRkFycmF5R2V0
VmFsdWVBdEluZGV4KHNlZWthYmxlUmFuZ2VzLmdldCgpLCBpKSk7CisgICAgICAgIENNVGltZSBz
dGFydCA9IENNVGltZU1ha2VGcm9tRGljdGlvbmFyeShzdGF0aWNfY2FzdDxDRkRpY3Rpb25hcnlS
ZWY+KENGRGljdGlvbmFyeUdldFZhbHVlKHJhbmdlLCBDTVRpbWVSYW5nZVN0YXJ0S2V5KCkpKSk7
CisgICAgICAgIENNVGltZSBkdXJhdGlvbiA9IENNVGltZU1ha2VGcm9tRGljdGlvbmFyeShzdGF0
aWNfY2FzdDxDRkRpY3Rpb25hcnlSZWY+KENGRGljdGlvbmFyeUdldFZhbHVlKHJhbmdlLCBDTVRp
bWVSYW5nZUR1cmF0aW9uS2V5KCkpKSk7CisgICAgICAgIGlmICghdGltZVJhbmdlSXNWYWxpZEFu
ZE5vdEVtcHR5KHN0YXJ0LCBkdXJhdGlvbikpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgCisgICAgICAgIGZsb2F0IGVuZE9mUmFuZ2UgPSBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0KENN
VGltZUdldFNlY29uZHMoQ01UaW1lQWRkKHN0YXJ0LCBkdXJhdGlvbikpKTsKKyAgICAgICAgaWYg
KG1heFRpbWVTZWVrYWJsZSA8IGVuZE9mUmFuZ2UpCisgICAgICAgICAgICBtYXhUaW1lU2Vla2Fi
bGUgPSBlbmRPZlJhbmdlOworICAgIH0KKworICAgIHJldHVybiBtYXhUaW1lU2Vla2FibGU7ICAg
Cit9CisKK2Zsb2F0IE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbkNGOjpwbGF0Zm9ybU1h
eFRpbWVMb2FkZWQoKSBjb25zdAoreworICAgIGlmICghYXZQbGF5ZXJJdGVtKG1fYXZmV3JhcHBl
cikpCisgICAgICAgIHJldHVybiAwOworCisgICAgUmV0YWluUHRyPENGQXJyYXlSZWY+IGxvYWRl
ZFJhbmdlcyhBZG9wdENGLCBBVkNGUGxheWVySXRlbUNvcHlMb2FkZWRUaW1lUmFuZ2VzKGF2UGxh
eWVySXRlbShtX2F2ZldyYXBwZXIpKSk7CisgICAgaWYgKCFsb2FkZWRSYW5nZXMpCisgICAgICAg
IHJldHVybiAwOworCisgICAgZmxvYXQgbWF4VGltZUxvYWRlZCA9IDA7CisgICAgQ0ZJbmRleCBy
YW5nZUNvdW50ID0gQ0ZBcnJheUdldENvdW50KGxvYWRlZFJhbmdlcy5nZXQoKSk7CisgICAgZm9y
IChDRkluZGV4IGkgPSAwOyBpIDwgcmFuZ2VDb3VudDsgaSsrKSB7CisgICAgICAgIENGRGljdGlv
bmFyeVJlZiByYW5nZSA9IHN0YXRpY19jYXN0PENGRGljdGlvbmFyeVJlZj4oQ0ZBcnJheUdldFZh
bHVlQXRJbmRleChsb2FkZWRSYW5nZXMuZ2V0KCksIGkpKTsKKyAgICAgICAgQ01UaW1lIHN0YXJ0
ID0gQ01UaW1lTWFrZUZyb21EaWN0aW9uYXJ5KHN0YXRpY19jYXN0PENGRGljdGlvbmFyeVJlZj4o
Q0ZEaWN0aW9uYXJ5R2V0VmFsdWUocmFuZ2UsIENNVGltZVJhbmdlU3RhcnRLZXkoKSkpKTsKKyAg
ICAgICAgQ01UaW1lIGR1cmF0aW9uID0gQ01UaW1lTWFrZUZyb21EaWN0aW9uYXJ5KHN0YXRpY19j
YXN0PENGRGljdGlvbmFyeVJlZj4oQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUocmFuZ2UsIENNVGltZVJh
bmdlRHVyYXRpb25LZXkoKSkpKTsKKyAgICAgICAgaWYgKCF0aW1lUmFuZ2VJc1ZhbGlkQW5kTm90
RW1wdHkoc3RhcnQsIGR1cmF0aW9uKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAK
KyAgICAgICAgZmxvYXQgZW5kT2ZSYW5nZSA9IG5hcnJvd1ByZWNpc2lvblRvRmxvYXQoQ01UaW1l
R2V0U2Vjb25kcyhDTVRpbWVBZGQoc3RhcnQsIGR1cmF0aW9uKSkpOworICAgICAgICBpZiAobWF4
VGltZUxvYWRlZCA8IGVuZE9mUmFuZ2UpCisgICAgICAgICAgICBtYXhUaW1lTG9hZGVkID0gZW5k
T2ZSYW5nZTsKKyAgICB9CisKKyAgICByZXR1cm4gbWF4VGltZUxvYWRlZDsgICAKK30KKwordW5z
aWduZWQgTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6OnRvdGFsQnl0ZXMoKSBjb25z
dAoreworICAgIGlmICghbWV0YURhdGFBdmFpbGFibGUoKSB8fCAhYXZBc3NldChtX2F2ZldyYXBw
ZXIpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIGludDY0X3QgdG90YWxNZWRpYVNpemUgPSAw
OworICAgIFJldGFpblB0cjxDRkFycmF5UmVmPiB0cmFja3MoQWRvcHRDRiwgQVZDRkFzc2V0Q29w
eUFzc2V0VHJhY2tzKGF2QXNzZXQobV9hdmZXcmFwcGVyKSkpOworICAgIENGSW5kZXggdHJhY2tD
b3VudCA9IENGQXJyYXlHZXRDb3VudCh0cmFja3MuZ2V0KCkpOworICAgIGZvciAoQ0ZJbmRleCBp
ID0gMDsgaSA8IHRyYWNrQ291bnQ7IGkrKykgeworICAgICAgICBBVkNGQXNzZXRUcmFja1JlZiBh
c3NldFRyYWNrID0gKEFWQ0ZBc3NldFRyYWNrUmVmKUNGQXJyYXlHZXRWYWx1ZUF0SW5kZXgodHJh
Y2tzLmdldCgpLCBpKTsKKyAgICAgICAgdG90YWxNZWRpYVNpemUgKz0gQVZDRkFzc2V0VHJhY2tH
ZXRUb3RhbFNhbXBsZURhdGFMZW5ndGgoYXNzZXRUcmFjayk7CisgICAgfQorCisgICAgcmV0dXJu
IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0b3RhbE1lZGlhU2l6ZSk7Cit9CisKK01lZGlhUGxheWVy
UHJpdmF0ZUFWRm91bmRhdGlvbjo6QXNzZXRTdGF0dXMgTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3Vu
ZGF0aW9uQ0Y6OmFzc2V0U3RhdHVzKCkgY29uc3QKK3sKKyAgICBpZiAoIWF2QXNzZXQobV9hdmZX
cmFwcGVyKSkKKyAgICAgICAgcmV0dXJuIE1lZGlhUGxheWVyQVZBc3NldFN0YXR1c0RvZXNOb3RF
eGlzdDsKKworICAgIC8vIEZpcnN0LCBtYWtlIHN1cmUgYWxsIG1ldGFkYXRhIHByb3BlcnRpZXMg
d2UgcmVseSBvbiBhcmUgbG9hZGVkLgorICAgIENGQXJyYXlSZWYga2V5cyA9IG1ldGFkYXRhS2V5
TmFtZXMoKTsKKyAgICBDRkluZGV4IGtleUNvdW50ID0gQ0ZBcnJheUdldENvdW50KGtleXMpOwor
ICAgIGZvciAoQ0ZJbmRleCBpID0gMDsgaSA8IGtleUNvdW50OyBpKyspIHsKKyAgICAgICAgQ0ZT
dHJpbmdSZWYga2V5TmFtZSA9IHN0YXRpY19jYXN0PENGU3RyaW5nUmVmPihDRkFycmF5R2V0VmFs
dWVBdEluZGV4KGtleXMsIGkpKTsKKyAgICAgICAgQVZDRlByb3BlcnR5VmFsdWVTdGF0dXMga2V5
U3RhdHVzID0gQVZDRkFzc2V0R2V0U3RhdHVzT2ZWYWx1ZUZvclByb3BlcnR5KGF2QXNzZXQobV9h
dmZXcmFwcGVyKSwga2V5TmFtZSwgMCk7CisgICAgICAgIAorICAgICAgICBpZiAoa2V5U3RhdHVz
IDwgQVZDRlByb3BlcnR5VmFsdWVTdGF0dXNMb2FkZWQpCisgICAgICAgICAgICByZXR1cm4gTWVk
aWFQbGF5ZXJBVkFzc2V0U3RhdHVzTG9hZGluZzsKKyAgICAgICAgaWYgKGtleVN0YXR1cyA9PSBB
VkNGUHJvcGVydHlWYWx1ZVN0YXR1c0ZhaWxlZCkKKyAgICAgICAgICAgIHJldHVybiBNZWRpYVBs
YXllckFWQXNzZXRTdGF0dXNGYWlsZWQ7CisgICAgICAgIGlmIChrZXlTdGF0dXMgPT0gQVZDRlBy
b3BlcnR5VmFsdWVTdGF0dXNDYW5jZWxsZWQpCisgICAgICAgICAgICByZXR1cm4gTWVkaWFQbGF5
ZXJBVkFzc2V0U3RhdHVzQ2FuY2VsbGVkOworICAgIH0KKworICAgIGlmIChBVkNGQXNzZXRJc1Bs
YXlhYmxlKGF2QXNzZXQobV9hdmZXcmFwcGVyKSkpCisgICAgICAgIHJldHVybiBNZWRpYVBsYXll
ckFWQXNzZXRTdGF0dXNQbGF5YWJsZTsKKworICAgIHJldHVybiBNZWRpYVBsYXllckFWQXNzZXRT
dGF0dXNMb2FkZWQ7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0Y6
OnBhaW50Q3VycmVudEZyYW1lSW5Db250ZXh0KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29u
c3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAoY29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoY3VycmVudFJlbmRlcmluZ01vZGUoKSA9PSBN
ZWRpYVJlbmRlcmluZ1RvTGF5ZXIgJiYgIWltYWdlR2VuZXJhdG9yKG1fYXZmV3JhcHBlcikpIHsK
KyAgICAgICAgLy8gV2UncmUgYmVpbmcgdG9sZCB0byByZW5kZXIgaW50byBhIGNvbnRleHQsIGJ1
dCB3ZSBhbHJlYWR5IGhhdmUgdGhlCisgICAgICAgIC8vIHZpZGVvIGxheWVyLCB3aGljaCBwcm9i
YWJseSBtZWFucyB3ZSd2ZSBiZWVuIGNhbGxlZCBmcm9tIDxjYW52YXM+LgorICAgICAgICBjcmVh
dGVDb250ZXh0VmlkZW9SZW5kZXJlcigpOworICAgIH0KKworICAgIHBhaW50KGNvbnRleHQsIHJl
Y3QpOworfQorCit2b2lkIE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbkNGOjpwYWludChH
cmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgaWYg
KGNvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQoKSB8fCAhaW1hZ2VHZW5lcmF0b3IobV9hdmZXcmFw
cGVyKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgTE9HKE1lZGlhLCAiTWVkaWFQbGF5ZXJQcml2
YXRlQVZGb3VuZGF0aW9uQ0Y6OnBhaW50KCVwKSIsIHRoaXMpOworCisgICAgc2V0RGVsYXlDYWxs
YmFja3ModHJ1ZSk7CisgICAgUmV0YWluUHRyPENHSW1hZ2VSZWY+IGltYWdlID0gbV9hdmZXcmFw
cGVyLT5jcmVhdGVJbWFnZUZvclRpbWVJblJlY3QoY3VycmVudFRpbWUoKSwgcmVjdCk7CisgICAg
aWYgKGltYWdlKSB7CisgICAgICAgIGNvbnRleHQtPnNhdmUoKTsKKyAgICAgICAgY29udGV4dC0+
dHJhbnNsYXRlKHJlY3QueCgpLCByZWN0LnkoKSArIHJlY3QuaGVpZ2h0KCkpOworICAgICAgICBj
b250ZXh0LT5zY2FsZShGbG9hdFNpemUoMS4wZiwgLTEuMGYpKTsKKyAgICAgICAgY29udGV4dC0+
c2V0SW1hZ2VJbnRlcnBvbGF0aW9uUXVhbGl0eShJbnRlcnBvbGF0aW9uTG93KTsKKyAgICAgICAg
SW50UmVjdCBwYWludFJlY3QoSW50UG9pbnQoMCwgMCksIEludFNpemUocmVjdC53aWR0aCgpLCBy
ZWN0LmhlaWdodCgpKSk7CisgICAgICAgIENHQ29udGV4dERyYXdJbWFnZShjb250ZXh0LT5wbGF0
Zm9ybUNvbnRleHQoKSwgQ0dSZWN0TWFrZSgwLCAwLCBwYWludFJlY3Qud2lkdGgoKSwgcGFpbnRS
ZWN0LmhlaWdodCgpKSwgaW1hZ2UuZ2V0KCkpOworICAgICAgICBjb250ZXh0LT5yZXN0b3JlKCk7
CisgICAgICAgIGltYWdlID0gMDsKKyAgICB9CisgICAgc2V0RGVsYXlDYWxsYmFja3MoZmFsc2Up
OworICAgIAorICAgIG1fdmlkZW9GcmFtZUhhc0RyYXduID0gdHJ1ZTsKK30KKworc3RhdGljIEhh
c2hTZXQ8U3RyaW5nPiBtaW1lVHlwZUNhY2hlKCkKK3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FM
KEhhc2hTZXQ8U3RyaW5nPiwgY2FjaGUsICgpKTsKKyAgICBzdGF0aWMgYm9vbCB0eXBlTGlzdElu
aXRpYWxpemVkID0gZmFsc2U7CisKKyAgICBpZiAodHlwZUxpc3RJbml0aWFsaXplZCkKKyAgICAg
ICAgcmV0dXJuIGNhY2hlOworICAgIHR5cGVMaXN0SW5pdGlhbGl6ZWQgPSB0cnVlOworCisgICAg
Ly8gTm90IHBvc3NpYmxlIHRvIHF1ZXJ5IEFWRm91bmRhdGlvbiBmb3Igc3VwcG9ydGVkIE1JTUUg
dHlwZXMsIDxyZGFyOi8vcHJvYmxlbS84NzIxNjkzPiwgc28KKyAgICAvLyBoYXJkIGNvZGUgc29t
ZSB0eXBlcyBmb3Igbm93LgorICAgIGNhY2hlLmFkZCgidmlkZW8vcXVpY2t0aW1lIik7CisgICAg
Y2FjaGUuYWRkKCJ2aWRlby9tcDQiKTsKKyAgICBjYWNoZS5hZGQoInZpZGVvL21wZWciKTsKKyAg
ICBjYWNoZS5hZGQoImF1ZGlvLzNncHAiKTsKKyAgICBjYWNoZS5hZGQoImF1ZGlvL21wMyIpOwor
ICAgIGNhY2hlLmFkZCgiYXVkaW8vbXA0Iik7CisgICAgY2FjaGUuYWRkKCJhdWRpby9tcDQiKTsK
KyAgICBjYWNoZS5hZGQoImF1ZGlvL200YSIpOworICAgIGNhY2hlLmFkZCgiYXVkaW8vYWFjIik7
CisgICAgY2FjaGUuYWRkKCJhdWRpby93YXYiKTsKKyAgICBjYWNoZS5hZGQoImFwcGxpY2F0aW9u
L3ZuZC5hcHBsZS5tcGVndXJsIik7CisKKyAgICByZXR1cm4gY2FjaGU7Cit9IAorCit2b2lkIE1l
ZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbkNGOjpnZXRTdXBwb3J0ZWRUeXBlcyhIYXNoU2V0
PFN0cmluZz4mIHN1cHBvcnRlZFR5cGVzKQoreworICAgIHN1cHBvcnRlZFR5cGVzID0gbWltZVR5
cGVDYWNoZSgpOworfSAKKworTWVkaWFQbGF5ZXI6OlN1cHBvcnRzVHlwZSBNZWRpYVBsYXllclBy
aXZhdGVBVkZvdW5kYXRpb25DRjo6c3VwcG9ydHNUeXBlKGNvbnN0IFN0cmluZyYgdHlwZSwgY29u
c3QgU3RyaW5nJiBjb2RlY3MpCit7CisgICAgLy8gT25seSByZXR1cm4gIklzU3VwcG9ydGVkIiBp
ZiB0aGVyZSBpcyBubyBjb2RlY3MgcGFyYW1ldGVyIGZvciBub3cgYXMgdGhlcmUgaXMgbm8gd2F5
IHRvIGFzayBpZiBpdCBzdXBwb3J0cyBhbgorICAgIC8vIGV4dGVuZGVkIE1JTUUgdHlwZSB1bnRp
bCByZGFyOi8vODcyMTcxNSBpcyBmaXhlZC4KKyAgICBpZiAobWltZVR5cGVDYWNoZSgpLmNvbnRh
aW5zKHR5cGUpKQorICAgICAgICByZXR1cm4gY29kZWNzLmlzRW1wdHkoKSA/IE1lZGlhUGxheWVy
OjpNYXlCZVN1cHBvcnRlZCA6IE1lZGlhUGxheWVyOjpJc1N1cHBvcnRlZDsKKworICAgIHJldHVy
biBNZWRpYVBsYXllcjo6SXNOb3RTdXBwb3J0ZWQ7Cit9CisKKworYm9vbCBNZWRpYVBsYXllclBy
aXZhdGVBVkZvdW5kYXRpb25DRjo6aXNBdmFpbGFibGUoKQoreworICAgIHJldHVybiBBVkZvdW5k
YXRpb25DRkxpYnJhcnkoKSAmJiBDb3JlTWVkaWFMaWJyYXJ5KCkgJiYgbGliZGlzcGF0Y2hMaWJy
YXJ5KCk7Cit9CisKK2Zsb2F0IE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbkNGOjptZWRp
YVRpbWVGb3JUaW1lVmFsdWUoZmxvYXQgdGltZVZhbHVlKSBjb25zdAoreworICAgIGlmICghbWV0
YURhdGFBdmFpbGFibGUoKSkKKyAgICAgICAgcmV0dXJuIHRpbWVWYWx1ZTsKKworICAgIC8vIEZJ
WE1FIC0gY2FuIG5vdCBpbXBsZW1lbnQgdW50aWwgcmRhcjovLzg3MjE2NjkgaXMgZml4ZWQuCisg
ICAgcmV0dXJuIHRpbWVWYWx1ZTsKK30KKwordm9pZCBNZWRpYVBsYXllclByaXZhdGVBVkZvdW5k
YXRpb25DRjo6dHJhY2tzQ2hhbmdlZCgpCit7CisgICAgaWYgKCFhdkFzc2V0KG1fYXZmV3JhcHBl
cikpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuZXZl
ciB0aGUgdHJhY2tzIGNvbGxlY3Rpb24gY2hhbmdlcyBzbyBjYWNoZSBoYXNWaWRlbyBhbmQgaGFz
QXVkaW8gc2luY2Ugd2UgYXJlCisgICAgLy8gYXNrZWQgYWJvdXQgdGhvc2UgZmFpcmx5IGZyZXF1
ZW50bHkuCisgICAgaWYgKCFhdlBsYXllckl0ZW0obV9hdmZXcmFwcGVyKSkgeworICAgICAgICAv
LyBXZSBkb24ndCBoYXZlIGEgcGxheWVyIGl0ZW0geWV0LCBzbyBjaGVjayB3aXRoIHRoZSBhc3Nl
dCBiZWNhdXNlIHNvbWUgYXNzZXRzIHN1cHBvcnQgaW5zcGVjdGlvbgorICAgICAgICAvLyBwcmlv
ciB0byBiZWNvbWluZyByZWFkeSB0byBwbGF5LgorICAgICAgICBSZXRhaW5QdHI8Q0ZBcnJheVJl
Zj4gdmlzdWFsVHJhY2tzKEFkb3B0Q0YsIEFWQ0ZBc3NldENvcHlUcmFja3NXaXRoTWVkaWFDaGFy
YWN0ZXJpc3RpYyhhdkFzc2V0KG1fYXZmV3JhcHBlciksIEFWQ0ZNZWRpYUNoYXJhY3RlcmlzdGlj
VmlzdWFsKSk7CisgICAgICAgIHNldEhhc1ZpZGVvKENGQXJyYXlHZXRDb3VudCh2aXN1YWxUcmFj
a3MuZ2V0KCkpKTsKKworICAgICAgICBSZXRhaW5QdHI8Q0ZBcnJheVJlZj4gYXVkaW9UcmFja3Mo
QWRvcHRDRiwgQVZDRkFzc2V0Q29weVRyYWNrc1dpdGhNZWRpYUNoYXJhY3RlcmlzdGljKGF2QXNz
ZXQobV9hdmZXcmFwcGVyKSwgQVZDRk1lZGlhQ2hhcmFjdGVyaXN0aWNBdWRpYmxlKSk7CisgICAg
ICAgIHNldEhhc0F1ZGlvKENGQXJyYXlHZXRDb3VudChhdWRpb1RyYWNrcy5nZXQoKSkpOworCisg
ICAgICAgIFJldGFpblB0cjxDRkFycmF5UmVmPiBjYXB0aW9uVHJhY2tzKEFkb3B0Q0YsIEFWQ0ZB
c3NldENvcHlUcmFja3NXaXRoTWVkaWFUeXBlKGF2QXNzZXQobV9hdmZXcmFwcGVyKSwgQVZDRk1l
ZGlhVHlwZUNsb3NlZENhcHRpb24pKTsKKyAgICAgICAgc2V0SGFzQXVkaW8oQ0ZBcnJheUdldENv
dW50KGNhcHRpb25UcmFja3MuZ2V0KCkpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBib29sIGhh
c1ZpZGVvID0gZmFsc2U7CisgICAgICAgIGJvb2wgaGFzQXVkaW8gPSBmYWxzZTsKKyAgICAgICAg
Ym9vbCBoYXNDYXB0aW9ucyA9IGZhbHNlOworCisgICAgICAgIFJldGFpblB0cjxDRkFycmF5UmVm
PiB0cmFja3MoQWRvcHRDRiwgQVZDRlBsYXllckl0ZW1Db3B5VHJhY2tzKGF2UGxheWVySXRlbSht
X2F2ZldyYXBwZXIpKSk7CisKKyAgICAgICAgQ0ZJbmRleCB0cmFja0NvdW50ID0gQ0ZBcnJheUdl
dENvdW50KHRyYWNrcy5nZXQoKSk7CisgICAgICAgIGZvciAoQ0ZJbmRleCBpID0gMDsgaSA8IHRy
YWNrQ291bnQ7IGkrKykgeworICAgICAgICAgICAgQVZDRlBsYXllckl0ZW1UcmFja1JlZiB0cmFj
ayA9IChBVkNGUGxheWVySXRlbVRyYWNrUmVmKShDRkFycmF5R2V0VmFsdWVBdEluZGV4KHRyYWNr
cy5nZXQoKSwgaSkpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoQVZDRlBsYXllckl0
ZW1UcmFja0lzRW5hYmxlZCh0cmFjaykpIHsKKyAgICAgICAgICAgICAgICBSZXRhaW5QdHI8QVZD
RkFzc2V0VHJhY2tSZWY+IGFzc2V0VHJhY2soQWRvcHRDRiwgQVZDRlBsYXllckl0ZW1UcmFja0Nv
cHlBc3NldFRyYWNrKHRyYWNrKSk7CisgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWYgbWVkaWFU
eXBlID0gQVZDRkFzc2V0VHJhY2tHZXRNZWRpYVR5cGUoYXNzZXRUcmFjay5nZXQoKSk7CisgICAg
ICAgICAgICAgICAgaWYgKCFtZWRpYVR5cGUpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGlmIChDRlN0cmluZ0NvbXBhcmUo
bWVkaWFUeXBlLCBBVkNGTWVkaWFUeXBlVmlkZW8sIGtDRkNvbXBhcmVDYXNlSW5zZW5zaXRpdmUp
ID09IGtDRkNvbXBhcmVFcXVhbFRvKQorICAgICAgICAgICAgICAgICAgICBoYXNWaWRlbyA9IHRy
dWU7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoQ0ZTdHJpbmdDb21wYXJlKG1lZGlhVHlwZSwg
QVZDRk1lZGlhVHlwZUF1ZGlvLCBrQ0ZDb21wYXJlQ2FzZUluc2Vuc2l0aXZlKSA9PSBrQ0ZDb21w
YXJlRXF1YWxUbykKKyAgICAgICAgICAgICAgICAgICAgaGFzQXVkaW8gPSB0cnVlOworICAgICAg
ICAgICAgICAgIGVsc2UgaWYgKENGU3RyaW5nQ29tcGFyZShtZWRpYVR5cGUsIEFWQ0ZNZWRpYVR5
cGVDbG9zZWRDYXB0aW9uLCBrQ0ZDb21wYXJlQ2FzZUluc2Vuc2l0aXZlKSA9PSBrQ0ZDb21wYXJl
RXF1YWxUbykKKyAgICAgICAgICAgICAgICAgICAgaGFzQ2FwdGlvbnMgPSB0cnVlOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2V0SGFzVmlkZW8oaGFzVmlkZW8pOworICAg
ICAgICBzZXRIYXNBdWRpbyhoYXNBdWRpbyk7CisgICAgICAgIHNldEhhc0Nsb3NlZENhcHRpb25z
KGhhc0NhcHRpb25zKTsKKyAgICB9CisKKyAgICBMT0coTWVkaWEsICJNZWRpYVBsYXllclByaXZh
dGVBVkZvdW5kYXRpb25DRjp0cmFja3NDaGFuZ2VkKCVwKSAtIGhhc1ZpZGVvID0gJXMsIGhhc0F1
ZGlvID0gJXMsIGhhc0NhcHRpb25zID0gJXMiLCAKKyAgICAgICAgdGhpcywgYm9vbFN0cmluZyho
YXNWaWRlbygpKSwgYm9vbFN0cmluZyhoYXNBdWRpbygpKSwgYm9vbFN0cmluZyhoYXNDbG9zZWRD
YXB0aW9ucygpKSk7CisKKyAgICBzaXplQ2hhbmdlZCgpOworfQorCit2b2lkIE1lZGlhUGxheWVy
UHJpdmF0ZUFWRm91bmRhdGlvbkNGOjpzaXplQ2hhbmdlZCgpCit7CisgICAgaWYgKCFhdkFzc2V0
KG1fYXZmV3JhcHBlcikpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICAvLyBBVkFzc2V0J3Mg
J25hdHVyYWxTaXplJyBwcm9wZXJ0eSBvbmx5IGNvbnNpZGVycyB0aGUgbW92aWUncyBmaXJzdCB2
aWRlbyB0cmFjaywgc28gd2UgbmVlZCB0byBjb21wdXRlCisgICAgLy8gdGhlIHVuaW9uIG9mIGFs
bCB2aXN1YWwgdHJhY2sgcmVjdHMuCisgICAgQ0dSZWN0IHRyYWNrUmVjdFVuaW9uID0gQ0dSZWN0
WmVybzsKKyAgICBSZXRhaW5QdHI8Q0ZBcnJheVJlZj4gdHJhY2tzKEFkb3B0Q0YsIEFWQ0ZBc3Nl
dENvcHlUcmFja3NXaXRoTWVkaWFUeXBlKGF2QXNzZXQobV9hdmZXcmFwcGVyKSwgQVZDRk1lZGlh
Q2hhcmFjdGVyaXN0aWNWaXN1YWwpKTsKKyAgICBDRkluZGV4IHRyYWNrQ291bnQgPSBDRkFycmF5
R2V0Q291bnQodHJhY2tzLmdldCgpKTsKKyAgICBmb3IgKENGSW5kZXggaSA9IDA7IGkgPCB0cmFj
a0NvdW50OyBpKyspIHsKKyAgICAgICAgQVZDRkFzc2V0VHJhY2tSZWYgYXNzZXRUcmFjayA9IChB
VkNGQXNzZXRUcmFja1JlZikoQ0ZBcnJheUdldFZhbHVlQXRJbmRleCh0cmFja3MuZ2V0KCksIGkp
KTsKKyAgICAgICAgCisgICAgICAgIENHU2l6ZSB0cmFja1NpemUgPSBBVkNGQXNzZXRUcmFja0dl
dE5hdHVyYWxTaXplKGFzc2V0VHJhY2spOworICAgICAgICBDR1JlY3QgdHJhY2tSZWN0ID0gQ0dS
ZWN0TWFrZSgwLCAwLCB0cmFja1NpemUud2lkdGgsIHRyYWNrU2l6ZS5oZWlnaHQpOworICAgICAg
ICB0cmFja1JlY3RVbmlvbiA9IENHUmVjdFVuaW9uKHRyYWNrUmVjdFVuaW9uLCBDR1JlY3RBcHBs
eUFmZmluZVRyYW5zZm9ybSh0cmFja1JlY3QsIEFWQ0ZBc3NldFRyYWNrR2V0UHJlZmVycmVkVHJh
bnNmb3JtKGFzc2V0VHJhY2spKSk7CisgICAgfQorICAgIC8vIFRoZSBtb3ZpZSBpcyBhbHdheXMg
ZGlzcGxheWVkIGF0IDAsMCBzbyBtb3ZlIHRoZSB0cmFjayByZWN0IHRvIHRoZSBvcmlnaW4gYmVm
b3JlIHVzaW5nIHdpZHRoIGFuZCBoZWlnaHQuCisgICAgdHJhY2tSZWN0VW5pb24gPSBDR1JlY3RP
ZmZzZXQodHJhY2tSZWN0VW5pb24sIHRyYWNrUmVjdFVuaW9uLm9yaWdpbi54LCB0cmFja1JlY3RV
bmlvbi5vcmlnaW4ueSk7CisgICAgQ0dTaXplIG5hdHVyYWxTaXplID0gdHJhY2tSZWN0VW5pb24u
c2l6ZTsKKworICAgIC8vIEFsc28gbG9vayBhdCB0aGUgYXNzZXQncyBwcmVmZXJyZWQgdHJhbnNm
b3JtIHNvIHdlIGFjY291bnQgZm9yIGEgbW92aWUgbWF0cml4LgorICAgIENHU2l6ZSBtb3ZpZVNp
emUgPSBDR1NpemVBcHBseUFmZmluZVRyYW5zZm9ybShBVkNGQXNzZXRHZXROYXR1cmFsU2l6ZShh
dkFzc2V0KG1fYXZmV3JhcHBlcikpLCBBVkNGQXNzZXRHZXRQcmVmZXJyZWRUcmFuc2Zvcm0oYXZB
c3NldChtX2F2ZldyYXBwZXIpKSk7CisgICAgaWYgKG1vdmllU2l6ZS53aWR0aCA+IG5hdHVyYWxT
aXplLndpZHRoKQorICAgICAgICBuYXR1cmFsU2l6ZS53aWR0aCA9IG1vdmllU2l6ZS53aWR0aDsK
KyAgICBpZiAobW92aWVTaXplLmhlaWdodCA+IG5hdHVyYWxTaXplLmhlaWdodCkKKyAgICAgICAg
bmF0dXJhbFNpemUuaGVpZ2h0ID0gbW92aWVTaXplLmhlaWdodDsKKyAgICBzZXROYXR1cmFsU2l6
ZShJbnRTaXplKG5hdHVyYWxTaXplKSk7Cit9CisKK3ZvaWQgTWVkaWFQbGF5ZXJQcml2YXRlQVZG
b3VuZGF0aW9uQ0Y6OmNvbnRlbnRzTmVlZHNEaXNwbGF5KCkKK3sKKyAgICBpZiAobV9hdmZXcmFw
cGVyKQorICAgICAgICBtX2F2ZldyYXBwZXItPnNldFZpZGVvTGF5ZXJOZWVkc0NvbW1pdCgpOwor
fQorCitBVkZXcmFwcGVyOjpBVkZXcmFwcGVyKE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlv
bkNGKiBvd25lcikKKyAgICA6IG1fb3duZXIob3duZXIpCit7CisgICAgTE9HKE1lZGlhLCAiQVZG
V3JhcHBlcjo6QVZGV3JhcHBlciglcCkiLCB0aGlzKTsKKworICAgIG1fbm90aWZpY2F0aW9uUXVl
dWUgPSBkaXNwYXRjaF9xdWV1ZV9jcmVhdGUoIk1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlv
bkNGLm5vdGlmaWNhdGlvblF1ZXVlIiwgMCk7Cit9CisKK0FWRldyYXBwZXI6On5BVkZXcmFwcGVy
KCkKK3sKKyAgICBMT0coTWVkaWEsICJBVkZXcmFwcGVyOjp+QVZGV3JhcHBlciglcCkiLCB0aGlz
KTsKKyAgICBBU1NFUlQoIW1fb3duZXIpOworCisgICAgZGVzdHJveVZpZGVvTGF5ZXIoKTsKKyAg
ICBkZXN0cm95SW1hZ2VHZW5lcmF0b3IoKTsKKworICAgIGlmIChtX25vdGlmaWNhdGlvblF1ZXVl
KQorICAgICAgICBkaXNwYXRjaF9yZWxlYXNlKG1fbm90aWZpY2F0aW9uUXVldWUpOworCisgICAg
aWYgKGF2QXNzZXQoKSkgeworICAgICAgICBBVkNGQXNzZXRDYW5jZWxMb2FkaW5nKGF2QXNzZXQo
KSk7CisgICAgICAgIG1fYXZBc3NldCA9IDA7CisgICAgfQorCisgICAgbV9hdlBsYXllckl0ZW0g
PSAwOworICAgIG1fdGltZU9ic2VydmVyID0gMDsKKyAgICBtX2F2UGxheWVyID0gMDsKK30KKwor
dm9pZCBBVkZXcmFwcGVyOjpzY2hlZHVsZURpc2Nvbm5lY3RBbmREZWxldGUoKQoreworICAgIC8v
IElnbm9yZSBhbnkgc3Vic2VxdWVudCBub3RpZmljYXRpb25zIHdlIG1pZ2h0IHJlY2VpdmUgaW4g
bm90aWZpY2F0aW9uQ2FsbGJhY2soKS4KKyAgICBtX293bmVyID0gMDsKKyAgICBkaXNwYXRjaF9h
c3luY19mKGRpc3BhdGNoUXVldWUoKSwgdGhpcywgZGlzY29ubmVjdEFuZERlbGV0ZUFWRldyYXBw
ZXIpOworfQorCit2b2lkIEFWRldyYXBwZXI6OmRpc2Nvbm5lY3RBbmREZWxldGVBVkZXcmFwcGVy
KHZvaWQqIGNvbnRleHQpCit7CisgICAgQVZGV3JhcHBlciogYXZmV3JhcHBlciA9IHN0YXRpY19j
YXN0PEFWRldyYXBwZXIqPihjb250ZXh0KTsKKworICAgIExPRyhNZWRpYSwgIkFWRldyYXBwZXI6
OmRpc2Nvbm5lY3RBbmREZWxldGVBVkZXcmFwcGVyKCVwKSIsIGF2ZldyYXBwZXIpOworCisgICAg
aWYgKGF2ZldyYXBwZXItPmF2UGxheWVySXRlbSgpKSB7CisgICAgICAgIENGTm90aWZpY2F0aW9u
Q2VudGVyUmVmIGNlbnRlciA9IENGTm90aWZpY2F0aW9uQ2VudGVyR2V0TG9jYWxDZW50ZXIoKTsK
KyAgICAgICAgQ0ZOb3RpZmljYXRpb25DZW50ZXJSZW1vdmVPYnNlcnZlcihjZW50ZXIsIGF2Zldy
YXBwZXIsIEFWQ0ZQbGF5ZXJJdGVtRGlkUGxheVRvRW5kVGltZU5vdGlmaWNhdGlvbiwgYXZmV3Jh
cHBlci0+YXZQbGF5ZXJJdGVtKCkpOworICAgICAgICBDRk5vdGlmaWNhdGlvbkNlbnRlclJlbW92
ZU9ic2VydmVyKGNlbnRlciwgYXZmV3JhcHBlciwgQVZDRlBsYXllckl0ZW1TdGF0dXNDaGFuZ2Vk
Tm90aWZpY2F0aW9uLCBhdmZXcmFwcGVyLT5hdlBsYXllckl0ZW0oKSk7CisgICAgICAgIENGTm90
aWZpY2F0aW9uQ2VudGVyUmVtb3ZlT2JzZXJ2ZXIoY2VudGVyLCBhdmZXcmFwcGVyLCBBVkNGUGxh
eWVySXRlbVRyYWNrc0NoYW5nZWROb3RpZmljYXRpb24sIGF2ZldyYXBwZXItPmF2UGxheWVySXRl
bSgpKTsKKyAgICAgICAgQ0ZOb3RpZmljYXRpb25DZW50ZXJSZW1vdmVPYnNlcnZlcihjZW50ZXIs
IGF2ZldyYXBwZXIsIEFWQ0ZQbGF5ZXJJdGVtU2Vla2FibGVUaW1lUmFuZ2VzQ2hhbmdlZE5vdGlm
aWNhdGlvbiwgYXZmV3JhcHBlci0+YXZQbGF5ZXJJdGVtKCkpOworICAgICAgICBDRk5vdGlmaWNh
dGlvbkNlbnRlclJlbW92ZU9ic2VydmVyKGNlbnRlciwgYXZmV3JhcHBlciwgQVZDRlBsYXllckl0
ZW1Mb2FkZWRUaW1lUmFuZ2VzQ2hhbmdlZE5vdGlmaWNhdGlvbiwgYXZmV3JhcHBlci0+YXZQbGF5
ZXJJdGVtKCkpOworICAgICAgICBDRk5vdGlmaWNhdGlvbkNlbnRlclJlbW92ZU9ic2VydmVyKGNl
bnRlciwgYXZmV3JhcHBlciwgQVZDRlBsYXllckl0ZW1Jc1BsYXliYWNrTGlrZWx5VG9LZWVwVXBD
aGFuZ2VkTm90aWZpY2F0aW9uLCBhdmZXcmFwcGVyLT5hdlBsYXllckl0ZW0oKSk7CisgICAgICAg
IENGTm90aWZpY2F0aW9uQ2VudGVyUmVtb3ZlT2JzZXJ2ZXIoY2VudGVyLCBhdmZXcmFwcGVyLCBB
VkNGUGxheWVySXRlbUlzUGxheWJhY2tCdWZmZXJFbXB0eUNoYW5nZWROb3RpZmljYXRpb24sIGF2
ZldyYXBwZXItPmF2UGxheWVySXRlbSgpKTsKKyAgICAgICAgQ0ZOb3RpZmljYXRpb25DZW50ZXJS
ZW1vdmVPYnNlcnZlcihjZW50ZXIsIGF2ZldyYXBwZXIsIEFWQ0ZQbGF5ZXJJdGVtSXNQbGF5YmFj
a0J1ZmZlckZ1bGxDaGFuZ2VkTm90aWZpY2F0aW9uLCBhdmZXcmFwcGVyLT5hdlBsYXllckl0ZW0o
KSk7CisgICAgICAgIENGTm90aWZpY2F0aW9uQ2VudGVyUmVtb3ZlT2JzZXJ2ZXIoY2VudGVyLCBh
dmZXcmFwcGVyLCBDQUNGQ29udGV4dE5lZWRzRmx1c2hOb3RpZmljYXRpb24oKSwgYXZmV3JhcHBl
ci0+YXZQbGF5ZXJJdGVtKCkpOworICAgIH0KKworICAgIGlmIChhdmZXcmFwcGVyLT5hdlBsYXll
cigpKSB7CisgICAgICAgIGlmIChhdmZXcmFwcGVyLT50aW1lT2JzZXJ2ZXIoKSkgeworICAgICAg
ICAgICAgQVZDRlBsYXllclJlbW92ZU9ic2VydmVyKGF2ZldyYXBwZXItPmF2UGxheWVyKCksIGF2
ZldyYXBwZXItPnRpbWVPYnNlcnZlcigpKTsKKyAgICAgICAgfQorICAgICAgICBDRk5vdGlmaWNh
dGlvbkNlbnRlclJlbW92ZU9ic2VydmVyKENGTm90aWZpY2F0aW9uQ2VudGVyR2V0TG9jYWxDZW50
ZXIoKSwgYXZmV3JhcHBlciwgQVZDRlBsYXllclJhdGVDaGFuZ2VkTm90aWZpY2F0aW9uLCBhdmZX
cmFwcGVyLT5hdlBsYXllcigpKTsKKyAgICB9CisKKyAgICBkaXNwYXRjaF9hc3luY19mKGF2Zldy
YXBwZXItPmRpc3BhdGNoUXVldWUoKSwgYXZmV3JhcHBlciwgZGVsZXRlQVZGV3JhcHBlcik7Cit9
CisKK3ZvaWQgQVZGV3JhcHBlcjo6ZGVsZXRlQVZGV3JhcHBlcih2b2lkKiBjb250ZXh0KQorewor
ICAgIEFWRldyYXBwZXIqIGF2ZldyYXBwZXIgPSBzdGF0aWNfY2FzdDxBVkZXcmFwcGVyKj4oY29u
dGV4dCk7CisgICAgTE9HKE1lZGlhLCAiQVZGV3JhcHBlcjo6ZGVsZXRlQVZGV3JhcHBlciglcCki
LCBhdmZXcmFwcGVyKTsKKyAgICAKKyAgICAvLyBGSVhNRTogTGVhayBBVkZXcmFwcGVyIHVudGls
IDxyZGFyOi8vcHJvYmxlbS85ODg1NTA1PiBpcyBmaXhlZCwgYnV0IGNsZWFuIHVwIGl0cyBpdmFy
cy4KKyAgICAvLyBkZWxldGUgYXZmV3JhcHBlcjsKKyAgICBhdmZXcmFwcGVyLT5kZXN0cm95Vmlk
ZW9MYXllcigpOworICAgIGF2ZldyYXBwZXItPmRlc3Ryb3lJbWFnZUdlbmVyYXRvcigpOworCisg
ICAgaWYgKGF2ZldyYXBwZXItPm1fbm90aWZpY2F0aW9uUXVldWUpIHsKKyAgICAgICAgZGlzcGF0
Y2hfcmVsZWFzZShhdmZXcmFwcGVyLT5tX25vdGlmaWNhdGlvblF1ZXVlKTsKKyAgICAgICAgYXZm
V3JhcHBlci0+bV9ub3RpZmljYXRpb25RdWV1ZSA9IDA7CisgICAgfQorCisgICAgaWYgKGF2Zldy
YXBwZXItPmF2QXNzZXQoKSkgeworICAgICAgICBBVkNGQXNzZXRDYW5jZWxMb2FkaW5nKGF2Zldy
YXBwZXItPmF2QXNzZXQoKSk7CisgICAgICAgIGF2ZldyYXBwZXItPm1fYXZBc3NldCA9IDA7Cisg
ICAgfQorCisgICAgYXZmV3JhcHBlci0+bV9hdlBsYXllckl0ZW0gPSAwOworICAgIGF2ZldyYXBw
ZXItPm1fdGltZU9ic2VydmVyID0gMDsKKyAgICBhdmZXcmFwcGVyLT5tX2F2UGxheWVyID0gMDsK
K30KKwordm9pZCBBVkZXcmFwcGVyOjpjcmVhdGVBc3NldEZvclVSTChjb25zdCBTdHJpbmcmIHVy
bCkKK3sKKyAgICBBU1NFUlQoIWF2QXNzZXQoKSk7CisgICAgCisgICAgUmV0YWluUHRyPENGVVJM
UmVmPiB1cmxSZWYoQWRvcHRDRiwgS1VSTChQYXJzZWRVUkxTdHJpbmcsIHVybCkuY3JlYXRlQ0ZV
UkwoKSk7CisgICAgQVZDRlVSTEFzc2V0UmVmIGFzc2V0UmVmID0gQVZDRlVSTEFzc2V0Q3JlYXRl
V2l0aFVSTEFuZE9wdGlvbnMoa0NGQWxsb2NhdG9yRGVmYXVsdCwgdXJsUmVmLmdldCgpLCAwLCBt
X25vdGlmaWNhdGlvblF1ZXVlKTsKKyAgICBtX2F2QXNzZXQuYWRvcHRDRihhc3NldFJlZik7Cit9
CisKK3ZvaWQgQVZGV3JhcHBlcjo6Y3JlYXRlUGxheWVyKCkKK3sKKyAgICBBU1NFUlQoIWF2UGxh
eWVyKCkgJiYgYXZQbGF5ZXJJdGVtKCkpOworCisgICAgLy8gRklYTUU6IFdlIG5lZWQgYSB3YXkg
dG8gY3JlYXRlIGEgQVZQbGF5ZXIgd2l0aG91dCBhbiBBVlBsYXllckl0ZW0sIHNlZSA8cmRhcjov
L3Byb2JsZW0vOTg3NzczMD4uCisgICAgQVZDRlBsYXllclJlZiBwbGF5ZXJSZWYgPSBBVkNGUGxh
eWVyQ3JlYXRlV2l0aFBsYXllckl0ZW1BbmRPcHRpb25zKGtDRkFsbG9jYXRvckRlZmF1bHQsIGF2
UGxheWVySXRlbSgpLCAwLCBtX25vdGlmaWNhdGlvblF1ZXVlKTsKKyAgICBtX2F2UGxheWVyLmFk
b3B0Q0YocGxheWVyUmVmKTsKKworICAgIENGTm90aWZpY2F0aW9uQ2VudGVyUmVmIGNlbnRlciA9
IENGTm90aWZpY2F0aW9uQ2VudGVyR2V0TG9jYWxDZW50ZXIoKTsKKyAgICBBU1NFUlQoY2VudGVy
KTsKKworICAgIENGTm90aWZpY2F0aW9uQ2VudGVyQWRkT2JzZXJ2ZXIoY2VudGVyLCB0aGlzLCBu
b3RpZmljYXRpb25DYWxsYmFjaywgQVZDRlBsYXllclJhdGVDaGFuZ2VkTm90aWZpY2F0aW9uLCBw
bGF5ZXJSZWYsIENGTm90aWZpY2F0aW9uU3VzcGVuc2lvbkJlaGF2aW9yRGVsaXZlckltbWVkaWF0
ZWx5KTsKKworICAgIC8vIEFkZCBhIHRpbWUgb2JzZXJ2ZXIsIGFzayB0byBiZSBjYWxsZWQgaW5m
cmVxdWVudGx5IGJlY2F1c2Ugd2UgZG9uJ3QgcmVhbGx5IHdhbnQgcGVyaW9kaWMgY2FsbGJhY2tz
IGJ1dAorICAgIC8vIG91ciBvYnNlcnZlciB3aWxsIGFsc28gYmUgY2FsbGVkIHdoZW5ldmVyIGEg
c2VlayBoYXBwZW5zLgorICAgIGNvbnN0IGRvdWJsZSB2ZXJ5TG9uZ0ludGVydmFsID0gNjAqNjAq
NjAqMjQqMzA7CisgICAgbV90aW1lT2JzZXJ2ZXIuYWRvcHRDRihBVkNGUGxheWVyQ3JlYXRlUGVy
aW9kaWNUaW1lT2JzZXJ2ZXJGb3JJbnRlcnZhbChwbGF5ZXJSZWYsIENNVGltZU1ha2UodmVyeUxv
bmdJbnRlcnZhbCwgMTApLCBtX25vdGlmaWNhdGlvblF1ZXVlLCAmcGVyaW9kaWNUaW1lT2JzZXJ2
ZXJDYWxsYmFjaywgdGhpcykpOworfQorCit2b2lkIEFWRldyYXBwZXI6OmNyZWF0ZVBsYXllckl0
ZW0oKQoreworICAgIEFTU0VSVCghYXZQbGF5ZXJJdGVtKCkgJiYgYXZBc3NldCgpKTsKKworICAg
IC8vIENyZWF0ZSB0aGUgcGxheWVyIGl0ZW0gc28gd2UgYmVnaW4gbG9hZGluZyBtZWRpYSBkYXRh
LgorICAgIEFWQ0ZQbGF5ZXJJdGVtUmVmIGl0ZW1SZWYgPSBBVkNGUGxheWVySXRlbUNyZWF0ZVdp
dGhBc3NldChrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBhdkFzc2V0KCksIG1fbm90aWZpY2F0aW9uUXVl
dWUpOworICAgIG1fYXZQbGF5ZXJJdGVtLmFkb3B0Q0YoaXRlbVJlZik7CisKKyAgICBDRk5vdGlm
aWNhdGlvbkNlbnRlclJlZiBjZW50ZXIgPSBDRk5vdGlmaWNhdGlvbkNlbnRlckdldExvY2FsQ2Vu
dGVyKCk7CisgICAgQVNTRVJUKGNlbnRlcik7CisKKyAgICBDRk5vdGlmaWNhdGlvbkNlbnRlckFk
ZE9ic2VydmVyKGNlbnRlciwgdGhpcywgbm90aWZpY2F0aW9uQ2FsbGJhY2ssIEFWQ0ZQbGF5ZXJJ
dGVtRGlkUGxheVRvRW5kVGltZU5vdGlmaWNhdGlvbiwgaXRlbVJlZiwgQ0ZOb3RpZmljYXRpb25T
dXNwZW5zaW9uQmVoYXZpb3JEZWxpdmVySW1tZWRpYXRlbHkpOworICAgIENGTm90aWZpY2F0aW9u
Q2VudGVyQWRkT2JzZXJ2ZXIoY2VudGVyLCB0aGlzLCBub3RpZmljYXRpb25DYWxsYmFjaywgQVZD
RlBsYXllckl0ZW1TdGF0dXNDaGFuZ2VkTm90aWZpY2F0aW9uLCBpdGVtUmVmLCBDRk5vdGlmaWNh
dGlvblN1c3BlbnNpb25CZWhhdmlvckRlbGl2ZXJJbW1lZGlhdGVseSk7CisgICAgQ0ZOb3RpZmlj
YXRpb25DZW50ZXJBZGRPYnNlcnZlcihjZW50ZXIsIHRoaXMsIG5vdGlmaWNhdGlvbkNhbGxiYWNr
LCBBVkNGUGxheWVySXRlbVRyYWNrc0NoYW5nZWROb3RpZmljYXRpb24sIGl0ZW1SZWYsIENGTm90
aWZpY2F0aW9uU3VzcGVuc2lvbkJlaGF2aW9yRGVsaXZlckltbWVkaWF0ZWx5KTsKKyAgICBDRk5v
dGlmaWNhdGlvbkNlbnRlckFkZE9ic2VydmVyKGNlbnRlciwgdGhpcywgbm90aWZpY2F0aW9uQ2Fs
bGJhY2ssIEFWQ0ZQbGF5ZXJJdGVtU2Vla2FibGVUaW1lUmFuZ2VzQ2hhbmdlZE5vdGlmaWNhdGlv
biwgaXRlbVJlZiwgQ0ZOb3RpZmljYXRpb25TdXNwZW5zaW9uQmVoYXZpb3JEZWxpdmVySW1tZWRp
YXRlbHkpOworICAgIENGTm90aWZpY2F0aW9uQ2VudGVyQWRkT2JzZXJ2ZXIoY2VudGVyLCB0aGlz
LCBub3RpZmljYXRpb25DYWxsYmFjaywgQVZDRlBsYXllckl0ZW1Mb2FkZWRUaW1lUmFuZ2VzQ2hh
bmdlZE5vdGlmaWNhdGlvbiwgaXRlbVJlZiwgQ0ZOb3RpZmljYXRpb25TdXNwZW5zaW9uQmVoYXZp
b3JEZWxpdmVySW1tZWRpYXRlbHkpOworICAgIENGTm90aWZpY2F0aW9uQ2VudGVyQWRkT2JzZXJ2
ZXIoY2VudGVyLCB0aGlzLCBub3RpZmljYXRpb25DYWxsYmFjaywgQVZDRlBsYXllckl0ZW1Jc1Bs
YXliYWNrTGlrZWx5VG9LZWVwVXBDaGFuZ2VkTm90aWZpY2F0aW9uLCBpdGVtUmVmLCBDRk5vdGlm
aWNhdGlvblN1c3BlbnNpb25CZWhhdmlvckRlbGl2ZXJJbW1lZGlhdGVseSk7CisgICAgQ0ZOb3Rp
ZmljYXRpb25DZW50ZXJBZGRPYnNlcnZlcihjZW50ZXIsIHRoaXMsIG5vdGlmaWNhdGlvbkNhbGxi
YWNrLCBBVkNGUGxheWVySXRlbUlzUGxheWJhY2tCdWZmZXJFbXB0eUNoYW5nZWROb3RpZmljYXRp
b24sIGl0ZW1SZWYsIENGTm90aWZpY2F0aW9uU3VzcGVuc2lvbkJlaGF2aW9yRGVsaXZlckltbWVk
aWF0ZWx5KTsKKyAgICBDRk5vdGlmaWNhdGlvbkNlbnRlckFkZE9ic2VydmVyKGNlbnRlciwgdGhp
cywgbm90aWZpY2F0aW9uQ2FsbGJhY2ssIEFWQ0ZQbGF5ZXJJdGVtSXNQbGF5YmFja0J1ZmZlckZ1
bGxDaGFuZ2VkTm90aWZpY2F0aW9uLCBpdGVtUmVmLCBDRk5vdGlmaWNhdGlvblN1c3BlbnNpb25C
ZWhhdmlvckRlbGl2ZXJJbW1lZGlhdGVseSk7CisKKyAgICBDRk5vdGlmaWNhdGlvbkNlbnRlckFk
ZE9ic2VydmVyKGNlbnRlciwgdGhpcywgbm90aWZpY2F0aW9uQ2FsbGJhY2ssIENBQ0ZDb250ZXh0
TmVlZHNGbHVzaE5vdGlmaWNhdGlvbigpLCAwLCBDRk5vdGlmaWNhdGlvblN1c3BlbnNpb25CZWhh
dmlvckRlbGl2ZXJJbW1lZGlhdGVseSk7Cit9CisKK3ZvaWQgQVZGV3JhcHBlcjo6cGVyaW9kaWNU
aW1lT2JzZXJ2ZXJDYWxsYmFjayhBVkNGUGxheWVyUmVmLCBDTVRpbWUgY21UaW1lLCB2b2lkKiBj
b250ZXh0KQoreworICAgIEFWRldyYXBwZXIqIHNlbGYgPSBzdGF0aWNfY2FzdDxBVkZXcmFwcGVy
Kj4oY29udGV4dCk7CisgICAgaWYgKCFzZWxmLT5tX293bmVyKQorICAgICAgICByZXR1cm47CisK
KyAgICBkb3VibGUgdGltZSA9IHN0ZDo6bWF4KDAuMCwgQ01UaW1lR2V0U2Vjb25kcyhjbVRpbWUp
KTsgLy8gQ2xhbXAgdG8gemVybywgbmVnYXRpdmUgdmFsdWVzIGFyZSBzb21ldGltZXMgcmVwb3J0
ZWQuCisgICAgc2VsZi0+bV9vd25lci0+c2NoZWR1bGVNYWluVGhyZWFkTm90aWZpY2F0aW9uKE1l
ZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbjo6Tm90aWZpY2F0aW9uOjpQbGF5ZXJUaW1lQ2hh
bmdlZCwgdGltZSk7Cit9CisKK3ZvaWQgQVZGV3JhcHBlcjo6bm90aWZpY2F0aW9uQ2FsbGJhY2so
Q0ZOb3RpZmljYXRpb25DZW50ZXJSZWYsIHZvaWQqIG9ic2VydmVyLCBDRlN0cmluZ1JlZiBwcm9w
ZXJ0eU5hbWUsIGNvbnN0IHZvaWQqIG9iamVjdCwgQ0ZEaWN0aW9uYXJ5UmVmKQoreworICAgIEFW
RldyYXBwZXIqIHNlbGYgPSBzdGF0aWNfY2FzdDxBVkZXcmFwcGVyKj4ob2JzZXJ2ZXIpOworICAg
IAorICAgIGlmICghc2VsZi0+bV9vd25lcikKKyAgICAgICAgcmV0dXJuOworCisgICAgTE9HKE1l
ZGlhLCAiQVZGV3JhcHBlcjo6bm90aWZpY2F0aW9uQ2FsbGJhY2soJXApIiwgc2VsZik7CisKKyAg
ICBpZiAoQ0ZFcXVhbChwcm9wZXJ0eU5hbWUsIEFWQ0ZQbGF5ZXJJdGVtRGlkUGxheVRvRW5kVGlt
ZU5vdGlmaWNhdGlvbikpCisgICAgICAgIHNlbGYtPm1fb3duZXItPnNjaGVkdWxlTWFpblRocmVh
ZE5vdGlmaWNhdGlvbihNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb246Ok5vdGlmaWNhdGlv
bjo6SXRlbURpZFBsYXlUb0VuZFRpbWUpOworICAgIGVsc2UgaWYgKENGRXF1YWwocHJvcGVydHlO
YW1lLCBBVkNGUGxheWVySXRlbVRyYWNrc0NoYW5nZWROb3RpZmljYXRpb24pKQorICAgICAgICBz
ZWxmLT5tX293bmVyLT5zY2hlZHVsZU1haW5UaHJlYWROb3RpZmljYXRpb24oTWVkaWFQbGF5ZXJQ
cml2YXRlQVZGb3VuZGF0aW9uOjpOb3RpZmljYXRpb246Okl0ZW1UcmFja3NDaGFuZ2VkKTsKKyAg
ICBlbHNlIGlmIChDRkVxdWFsKHByb3BlcnR5TmFtZSwgQVZDRlBsYXllckl0ZW1TdGF0dXNDaGFu
Z2VkTm90aWZpY2F0aW9uKSkgeworICAgICAgICBBVkNGVVJMQXNzZXRSZWYgYXNzZXQgPSBBVkNG
UGxheWVySXRlbUdldEFzc2V0KHNlbGYtPmF2UGxheWVySXRlbSgpKTsKKyAgICAgICAgaWYgKGFz
c2V0KQorICAgICAgICAgICAgc2VsZi0+c2V0QXNzZXQoYXNzZXQpOworICAgICAgICBzZWxmLT5t
X293bmVyLT5zY2hlZHVsZU1haW5UaHJlYWROb3RpZmljYXRpb24oTWVkaWFQbGF5ZXJQcml2YXRl
QVZGb3VuZGF0aW9uOjpOb3RpZmljYXRpb246Okl0ZW1TdGF0dXNDaGFuZ2VkKTsKKyAgICB9IGVs
c2UgaWYgKENGRXF1YWwocHJvcGVydHlOYW1lLCBBVkNGUGxheWVySXRlbVNlZWthYmxlVGltZVJh
bmdlc0NoYW5nZWROb3RpZmljYXRpb24pKQorICAgICAgICBzZWxmLT5tX293bmVyLT5zY2hlZHVs
ZU1haW5UaHJlYWROb3RpZmljYXRpb24oTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uOjpO
b3RpZmljYXRpb246Okl0ZW1TZWVrYWJsZVRpbWVSYW5nZXNDaGFuZ2VkKTsKKyAgICBlbHNlIGlm
IChDRkVxdWFsKHByb3BlcnR5TmFtZSwgQVZDRlBsYXllckl0ZW1Mb2FkZWRUaW1lUmFuZ2VzQ2hh
bmdlZE5vdGlmaWNhdGlvbikpCisgICAgICAgIHNlbGYtPm1fb3duZXItPnNjaGVkdWxlTWFpblRo
cmVhZE5vdGlmaWNhdGlvbihNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb246Ok5vdGlmaWNh
dGlvbjo6SXRlbUxvYWRlZFRpbWVSYW5nZXNDaGFuZ2VkKTsKKyAgICBlbHNlIGlmIChDRkVxdWFs
KHByb3BlcnR5TmFtZSwgQVZDRlBsYXllckl0ZW1QcmVzZW50YXRpb25TaXplQ2hhbmdlZE5vdGlm
aWNhdGlvbikpCisgICAgICAgIHNlbGYtPm1fb3duZXItPnNjaGVkdWxlTWFpblRocmVhZE5vdGlm
aWNhdGlvbihNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb246Ok5vdGlmaWNhdGlvbjo6SXRl
bVByZXNlbnRhdGlvblNpemVDaGFuZ2VkKTsKKyAgICBlbHNlIGlmIChDRkVxdWFsKHByb3BlcnR5
TmFtZSwgQVZDRlBsYXllckl0ZW1Jc1BsYXliYWNrTGlrZWx5VG9LZWVwVXBDaGFuZ2VkTm90aWZp
Y2F0aW9uKSkKKyAgICAgICAgc2VsZi0+bV9vd25lci0+c2NoZWR1bGVNYWluVGhyZWFkTm90aWZp
Y2F0aW9uKE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbjo6Tm90aWZpY2F0aW9uOjpJdGVt
SXNQbGF5YmFja0xpa2VseVRvS2VlcFVwQ2hhbmdlZCk7CisgICAgZWxzZSBpZiAoQ0ZFcXVhbChw
cm9wZXJ0eU5hbWUsIEFWQ0ZQbGF5ZXJJdGVtSXNQbGF5YmFja0J1ZmZlckVtcHR5Q2hhbmdlZE5v
dGlmaWNhdGlvbikpCisgICAgICAgIHNlbGYtPm1fb3duZXItPnNjaGVkdWxlTWFpblRocmVhZE5v
dGlmaWNhdGlvbihNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb246Ok5vdGlmaWNhdGlvbjo6
SXRlbUlzUGxheWJhY2tCdWZmZXJFbXB0eUNoYW5nZWQpOworICAgIGVsc2UgaWYgKENGRXF1YWwo
cHJvcGVydHlOYW1lLCBBVkNGUGxheWVySXRlbUlzUGxheWJhY2tCdWZmZXJGdWxsQ2hhbmdlZE5v
dGlmaWNhdGlvbikpCisgICAgICAgIHNlbGYtPm1fb3duZXItPnNjaGVkdWxlTWFpblRocmVhZE5v
dGlmaWNhdGlvbihNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb246Ok5vdGlmaWNhdGlvbjo6
SXRlbUlzUGxheWJhY2tCdWZmZXJGdWxsQ2hhbmdlZCk7CisgICAgZWxzZSBpZiAoQ0ZFcXVhbChw
cm9wZXJ0eU5hbWUsIEFWQ0ZQbGF5ZXJSYXRlQ2hhbmdlZE5vdGlmaWNhdGlvbikpCisgICAgICAg
IHNlbGYtPm1fb3duZXItPnNjaGVkdWxlTWFpblRocmVhZE5vdGlmaWNhdGlvbihNZWRpYVBsYXll
clByaXZhdGVBVkZvdW5kYXRpb246Ok5vdGlmaWNhdGlvbjo6UGxheWVyUmF0ZUNoYW5nZWQpOwor
ICAgIGVsc2UgaWYgKENGRXF1YWwocHJvcGVydHlOYW1lLCBDQUNGQ29udGV4dE5lZWRzRmx1c2hO
b3RpZmljYXRpb24oKSkpIHsKKyAgICAgICAgLy8gRklYTUU6IE5vdGUgdGhhdCB1bnRpbCA8cmRh
cjovL3Byb2JsZW0vOTg4NTUwNT4gaXMgZml4ZWQsIHdlIGNhbiBnZXQgYSBrQ0FDRkNvbnRleHRO
ZWVkc0ZsdXNoTm90aWZpY2F0aW9uIGFmdGVyCisgICAgICAgIC8vIHRoZSBBVkZXcmFwcGVyIGhh
cyBnb25lIGF3YXkuIFdlIHdvcmsgYXJvdW5kIHRoaXMgZm9yIG5vdyBieSBuZXZlciBhY3R1YWxs
eSBkZWxldGluZyB0aGUgdW5kZXJseWluZyBBVkZXcmFwcGVyIG9iamVjdC4gCisgICAgICAgIHNl
bGYtPm1fb3duZXItPnNjaGVkdWxlTWFpblRocmVhZE5vdGlmaWNhdGlvbihNZWRpYVBsYXllclBy
aXZhdGVBVkZvdW5kYXRpb246Ok5vdGlmaWNhdGlvbjo6Q29udGVudHNOZWVkc0Rpc3BsYXkpOwor
ICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIH0KK30KKwor
dm9pZCBBVkZXcmFwcGVyOjpsb2FkUGxheWFibGVDb21wbGV0aW9uQ2FsbGJhY2soQVZDRkFzc2V0
UmVmLCB2b2lkKiBjb250ZXh0KQoreworICAgIEFWRldyYXBwZXIqIHNlbGYgPSBzdGF0aWNfY2Fz
dDxBVkZXcmFwcGVyKj4oY29udGV4dCk7CisKKyAgICBpZiAoIXNlbGYtPm1fb3duZXIpCisgICAg
ICAgIHJldHVybjsKKyAgICBzZWxmLT5tX293bmVyLT5zY2hlZHVsZU1haW5UaHJlYWROb3RpZmlj
YXRpb24oTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uOjpOb3RpZmljYXRpb246OkFzc2V0
UGxheWFiaWxpdHlLbm93bik7Cit9CisKK3ZvaWQgQVZGV3JhcHBlcjo6Y2hlY2tQbGF5YWJpbGl0
eSgpCit7CisgICAgTE9HKE1lZGlhLCAiQVZGV3JhcHBlcjo6Y2hlY2tQbGF5YWJpbGl0eSglcCki
LCB0aGlzKTsKKworICAgIHN0YXRpYyBDRkFycmF5UmVmIHByb3BlcnR5S2V5TmFtZTsKKyAgICBp
ZiAoIXByb3BlcnR5S2V5TmFtZSkgeworICAgICAgICBzdGF0aWMgY29uc3QgQ0ZTdHJpbmdSZWYg
a2V5TmFtZXNbXSA9IHsgCisgICAgICAgICAgICBBVkNGQXNzZXRQcm9wZXJ0eVBsYXlhYmxlCisg
ICAgICAgIH07CisgICAgICAgIHByb3BlcnR5S2V5TmFtZSA9IENGQXJyYXlDcmVhdGUoMCwgKGNv
bnN0IHZvaWQqKilrZXlOYW1lcywgc2l6ZW9mKGtleU5hbWVzKSAvIHNpemVvZihrZXlOYW1lc1sw
XSksICZrQ0ZUeXBlQXJyYXlDYWxsQmFja3MpOworICAgIH0KKworICAgIEFWQ0ZBc3NldExvYWRW
YWx1ZXNBc3luY2hyb25vdXNseUZvclByb3BlcnRpZXMoYXZBc3NldCgpLCBwcm9wZXJ0eUtleU5h
bWUsIGxvYWRQbGF5YWJsZUNvbXBsZXRpb25DYWxsYmFjaywgdGhpcyk7Cit9CisKK3ZvaWQgQVZG
V3JhcHBlcjo6bG9hZE1ldGFkYXRhQ29tcGxldGlvbkNhbGxiYWNrKEFWQ0ZBc3NldFJlZiwgdm9p
ZCogY29udGV4dCkKK3sKKyAgICBMT0coTWVkaWEsICJBVkZXcmFwcGVyOjpsb2FkTWV0YWRhdGFD
b21wbGV0aW9uQ2FsbGJhY2soJXApIiwgY29udGV4dCk7CisgICAgQVZGV3JhcHBlciogc2VsZiA9
IHN0YXRpY19jYXN0PEFWRldyYXBwZXIqPihjb250ZXh0KTsKKworICAgIGlmICghc2VsZi0+bV9v
d25lcikKKyAgICAgICAgcmV0dXJuOworICAgIHNlbGYtPm1fb3duZXItPnNjaGVkdWxlTWFpblRo
cmVhZE5vdGlmaWNhdGlvbihNZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb246Ok5vdGlmaWNh
dGlvbjo6QXNzZXRNZXRhZGF0YUxvYWRlZCk7Cit9CisKK3ZvaWQgQVZGV3JhcHBlcjo6YmVnaW5M
b2FkaW5nTWV0YWRhdGEoKQoreworICAgIEFTU0VSVChhdkFzc2V0KCkpOworICAgIExPRyhNZWRp
YSwgIkFWRldyYXBwZXI6OmJlZ2luTG9hZGluZ01ldGFkYXRhKCVwKSAtIHJlcXVlc3RpbmcgbWV0
YWRhdGEgbG9hZGluZyIsIHRoaXMpOworICAgIEFWQ0ZBc3NldExvYWRWYWx1ZXNBc3luY2hyb25v
dXNseUZvclByb3BlcnRpZXMoYXZBc3NldCgpLCBtZXRhZGF0YUtleU5hbWVzKCksIGxvYWRNZXRh
ZGF0YUNvbXBsZXRpb25DYWxsYmFjaywgdGhpcyk7CQorfQorCit2b2lkIEFWRldyYXBwZXI6OnNl
ZWtDb21wbGV0ZWRDYWxsYmFjayhBVkNGUGxheWVySXRlbVJlZiwgQm9vbGVhbiBmaW5pc2hlZCwg
dm9pZCogY29udGV4dCkKK3sKKyAgICBBVkZXcmFwcGVyKiBzZWxmID0gc3RhdGljX2Nhc3Q8QVZG
V3JhcHBlcio+KGNvbnRleHQpOworICAgIGlmICghc2VsZi0+bV9vd25lcikKKyAgICAgICAgcmV0
dXJuOworCisgICAgc2VsZi0+bV9vd25lci0+c2NoZWR1bGVNYWluVGhyZWFkTm90aWZpY2F0aW9u
KE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbjo6Tm90aWZpY2F0aW9uOjpTZWVrQ29tcGxl
dGVkLCBzdGF0aWNfY2FzdDxib29sPihmaW5pc2hlZCkpOworfQorCit2b2lkIEFWRldyYXBwZXI6
OnNlZWtUb1RpbWUoZmxvYXQgdGltZSkKK3sKKyAgICBBU1NFUlQoYXZQbGF5ZXJJdGVtKCkpOwor
ICAgIEFWQ0ZQbGF5ZXJJdGVtU2Vla1RvVGltZVdpdGhUb2xlcmFuY2VBbmRDb21wbGV0aW9uQ2Fs
bGJhY2soYXZQbGF5ZXJJdGVtKCksIENNVGltZU1ha2VXaXRoU2Vjb25kcyh0aW1lLCA2MDApLAor
ICAgICAgICBrQ01UaW1lWmVybywga0NNVGltZVplcm8sICZzZWVrQ29tcGxldGVkQ2FsbGJhY2ss
IHRoaXMpOworfQorCit2b2lkIEFWRldyYXBwZXI6OnNldEFzc2V0KEFWQ0ZVUkxBc3NldFJlZiBh
c3NldCkKK3sKKyAgICBpZiAoYXNzZXQgPT0gYXZBc3NldCgpKQorICAgICAgICByZXR1cm47CisK
KyAgICBBVkNGQXNzZXRDYW5jZWxMb2FkaW5nKGF2QXNzZXQoKSk7CisgICAgbV9hdkFzc2V0LmFk
b3B0Q0YoYXNzZXQpOworfQorCitQbGF0Zm9ybUxheWVyKiBBVkZXcmFwcGVyOjpwbGF0Zm9ybUxh
eWVyKCkKK3sKKyAgICBMT0coTWVkaWEsICJBVkZXcmFwcGVyOjpwbGF0Zm9ybUxheWVyKCVwKSIs
IHRoaXMpOworCisgICAgaWYgKG1fdmlkZW9MYXllcldyYXBwZXIpCisgICAgICAgIHJldHVybiBt
X3ZpZGVvTGF5ZXJXcmFwcGVyLT5wbGF0Zm9ybUxheWVyKCk7CisKKyAgICBpZiAoIXZpZGVvTGF5
ZXIoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBDcmVhdGUgYSBQbGF0Zm9ybUNBTGF5
ZXIgc28gd2UgY2FuIHJlc2l6ZSB0aGUgdmlkZW8gbGF5ZXIgdG8gbWF0Y2ggdGhlIGVsZW1lbnQg
c2l6ZS4KKyAgICBtX2xheWVyQ2xpZW50ID0gYWRvcHRQdHIobmV3IExheWVyQ2xpZW50KHRoaXMp
KTsKKyAgICBpZiAoIW1fbGF5ZXJDbGllbnQpCisgICAgICAgIHJldHVybiAwOworCisgICAgbV92
aWRlb0xheWVyV3JhcHBlciA9IFBsYXRmb3JtQ0FMYXllcjo6Y3JlYXRlKFBsYXRmb3JtQ0FMYXll
cjo6TGF5ZXJUeXBlTGF5ZXIsIG1fbGF5ZXJDbGllbnQuZ2V0KCkpOworICAgIGlmICghbV92aWRl
b0xheWVyV3JhcHBlcikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBDQUNGTGF5ZXJSZWYgbGF5
ZXJSZWYgPSBBVkNGUGxheWVyTGF5ZXJDb3B5Q0FDRkxheWVyKG1fYXZDRlZpZGVvTGF5ZXIuZ2V0
KCkpOworICAgIG1fY2FWaWRlb0xheWVyLmFkb3B0Q0YobGF5ZXJSZWYpOworCisJQ0FDRkxheWVy
SW5zZXJ0U3VibGF5ZXIobV92aWRlb0xheWVyV3JhcHBlci0+cGxhdGZvcm1MYXllcigpLCBtX2Nh
VmlkZW9MYXllci5nZXQoKSwgMCk7CisgICAgbV92aWRlb0xheWVyV3JhcHBlci0+c2V0QW5jaG9y
UG9pbnQoRmxvYXRQb2ludDNEKCkpOworICAgIG1fdmlkZW9MYXllcldyYXBwZXItPnNldE5lZWRz
TGF5b3V0KCk7CisKKyAgICByZXR1cm4gbV92aWRlb0xheWVyV3JhcHBlci0+cGxhdGZvcm1MYXll
cigpOworfQorCit2b2lkIEFWRldyYXBwZXI6OmNyZWF0ZUFWQ0ZWaWRlb0xheWVyKCkKK3sKKyAg
ICBpZiAoIWF2UGxheWVyKCkgfHwgbV9hdkNGVmlkZW9MYXllcikKKyAgICAgICAgcmV0dXJuOwor
CisgICAgLy8gVGhlIGxheWVyIHdpbGwgZ2V0IGhvb2tlZCB1cCB2aWEgUmVuZGVyTGF5ZXJCYWNr
aW5nOjp1cGRhdGVHcmFwaGljc0xheWVyQ29uZmlndXJhdGlvbigpLgorICAgIG1fYXZDRlZpZGVv
TGF5ZXIuYWRvcHRDRihBVkNGUGxheWVyTGF5ZXJDcmVhdGVXaXRoQVZDRlBsYXllcihrQ0ZBbGxv
Y2F0b3JEZWZhdWx0LCBhdlBsYXllcigpLCBtX25vdGlmaWNhdGlvblF1ZXVlKSk7CisgICAgTE9H
KE1lZGlhLCAiQVZGV3JhcHBlcjo6Y3JlYXRlQVZDRlZpZGVvTGF5ZXIoJXApIC0gcmV0dXJuaW5n
ICVwIiwgdGhpcywgdmlkZW9MYXllcigpKTsKK30KKwordm9pZCBBVkZXcmFwcGVyOjpkZXN0cm95
VmlkZW9MYXllcigpCit7CisgICAgTE9HKE1lZGlhLCAiQVZGV3JhcHBlcjo6ZGVzdHJveVZpZGVv
TGF5ZXIoJXApIiwgdGhpcyk7CisgICAgbV9sYXllckNsaWVudCA9IG51bGxwdHI7CisgICAgbV9j
YVZpZGVvTGF5ZXIgPSAwOworICAgIG1fdmlkZW9MYXllcldyYXBwZXIgPSAwOworICAgIGlmICgh
bV9hdkNGVmlkZW9MYXllci5nZXQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgQVZDRlBsYXll
ckxheWVyU2V0UGxheWVyKChBVkNGUGxheWVyTGF5ZXJSZWYpbV9hdkNGVmlkZW9MYXllci5nZXQo
KSwgMCk7CisgICAgbV9hdkNGVmlkZW9MYXllciA9IDA7Cit9CisKK3ZvaWQgQVZGV3JhcHBlcjo6
c2V0VmlkZW9MYXllck5lZWRzQ29tbWl0KCkKK3sKKyAgICBpZiAobV92aWRlb0xheWVyV3JhcHBl
cikKKyAgICAgICAgbV92aWRlb0xheWVyV3JhcHBlci0+c2V0TmVlZHNDb21taXQoKTsKK30KKwor
dm9pZCBBVkZXcmFwcGVyOjpzZXRWaWRlb0xheWVySGlkZGVuKGJvb2wgdmFsdWUpCit7CisgICAg
aWYgKG1fdmlkZW9MYXllcldyYXBwZXIpCisgICAgICAgIG1fdmlkZW9MYXllcldyYXBwZXItPnNl
dEhpZGRlbih2YWx1ZSk7Cit9CisKK3ZvaWQgQVZGV3JhcHBlcjo6Y3JlYXRlSW1hZ2VHZW5lcmF0
b3IoKQoreworICAgIGlmICghYXZBc3NldCgpIHx8IG1faW1hZ2VHZW5lcmF0b3IpCisgICAgICAg
IHJldHVybjsKKworICAgIG1faW1hZ2VHZW5lcmF0b3IuYWRvcHRDRihBVkNGQXNzZXRJbWFnZUdl
bmVyYXRvckNyZWF0ZVdpdGhBc3NldChrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBhdkFzc2V0KCkpKTsK
KworICAgIEFWQ0ZBc3NldEltYWdlR2VuZXJhdG9yU2V0QXBlcnR1cmVNb2RlKG1faW1hZ2VHZW5l
cmF0b3IuZ2V0KCksIEFWQ0ZBc3NldEltYWdlR2VuZXJhdG9yQXBlcnR1cmVNb2RlQ2xlYW5BcGVy
dHVyZSApOworICAgIEFWQ0ZBc3NldEltYWdlR2VuZXJhdG9yU2V0UmVxdWVzdGVkVGltZVRvbGVy
YW5jZUJlZm9yZShtX2ltYWdlR2VuZXJhdG9yLmdldCgpLCBrQ01UaW1lWmVybyk7CisgICAgQVZD
RkFzc2V0SW1hZ2VHZW5lcmF0b3JTZXRSZXF1ZXN0ZWRUaW1lVG9sZXJhbmNlQWZ0ZXIobV9pbWFn
ZUdlbmVyYXRvci5nZXQoKSwga0NNVGltZVplcm8pOworICAgIEFWQ0ZBc3NldEltYWdlR2VuZXJh
dG9yU2V0QXBwbGllc1ByZWZlcnJlZFRyYWNrVHJhbnNmb3JtKG1faW1hZ2VHZW5lcmF0b3IuZ2V0
KCksIHRydWUpOworCisgICAgTE9HKE1lZGlhLCAiQVZGV3JhcHBlcjo6Y3JlYXRlSW1hZ2VHZW5l
cmF0b3IoJXApIC0gcmV0dXJuaW5nICVwIiwgdGhpcywgbV9pbWFnZUdlbmVyYXRvci5nZXQoKSk7
Cit9CisKK3ZvaWQgQVZGV3JhcHBlcjo6ZGVzdHJveUltYWdlR2VuZXJhdG9yKCkKK3sKKyAgICBM
T0coTWVkaWEsICJBVkZXcmFwcGVyOjpkZXN0cm95SW1hZ2VHZW5lcmF0b3IoJXApIiwgdGhpcyk7
CisgICAgbV9pbWFnZUdlbmVyYXRvciA9IDA7Cit9CisKK1JldGFpblB0cjxDR0ltYWdlUmVmPiBB
VkZXcmFwcGVyOjpjcmVhdGVJbWFnZUZvclRpbWVJblJlY3QoZmxvYXQgdGltZSwgY29uc3QgSW50
UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAoIW1faW1hZ2VHZW5lcmF0b3IpCisgICAgICAgIHJldHVy
biAwOworCisjaWYgIUxPR19ESVNBQkxFRAorICAgIGRvdWJsZSBzdGFydCA9IFdURjo6Y3VycmVu
dFRpbWUoKTsKKyNlbmRpZgorCisgICAgQVZDRkFzc2V0SW1hZ2VHZW5lcmF0b3JTZXRNYXhpbXVt
U2l6ZShtX2ltYWdlR2VuZXJhdG9yLmdldCgpLCBDR1NpemUocmVjdC5zaXplKCkpKTsKKyAgICBD
R0ltYWdlUmVmIGltYWdlID0gQVZDRkFzc2V0SW1hZ2VHZW5lcmF0b3JDb3B5Q0dJbWFnZUF0VGlt
ZShtX2ltYWdlR2VuZXJhdG9yLmdldCgpLCBDTVRpbWVNYWtlV2l0aFNlY29uZHModGltZSwgNjAw
KSwgMCwgMCk7CisKKyNpZiAhTE9HX0RJU0FCTEVECisgICAgZG91YmxlIGR1cmF0aW9uID0gV1RG
OjpjdXJyZW50VGltZSgpIC0gc3RhcnQ7CisgICAgTE9HKE1lZGlhLCAiQVZGV3JhcHBlcjo6Y3Jl
YXRlSW1hZ2VGb3JUaW1lSW5SZWN0KCVwKSAtIGNyZWF0aW5nIGltYWdlIHRvb2sgJS40ZiIsIHRo
aXMsIG5hcnJvd1ByZWNpc2lvblRvRmxvYXQoZHVyYXRpb24pKTsKKyNlbmRpZgorCisgICAgcmV0
dXJuIGltYWdlOworfQorCit2b2lkIExheWVyQ2xpZW50OjpwbGF0Zm9ybUNBTGF5ZXJMYXlvdXRT
dWJsYXllcnNPZkxheWVyKFBsYXRmb3JtQ0FMYXllciogd3JhcHBlckxheWVyKQoreworICAgIEFT
U0VSVChtX3BhcmVudCk7CisgICAgQVNTRVJUKG1fcGFyZW50LT52aWRlb0xheWVyV3JhcHBlcigp
ID09IHdyYXBwZXJMYXllci0+cGxhdGZvcm1MYXllcigpKTsKKworICAgIENHUmVjdCBib3VuZHMg
PSB3cmFwcGVyTGF5ZXItPmJvdW5kcygpOworICAgIENHUG9pbnQgYW5jaG9yID0gQ0FDRkxheWVy
R2V0QW5jaG9yUG9pbnQobV9wYXJlbnQtPmNhVmlkZW9MYXllcigpKTsKKyAgICBGbG9hdFBvaW50
IHBvc2l0aW9uKGJvdW5kcy5zaXplLndpZHRoICogYW5jaG9yLngsIGJvdW5kcy5zaXplLmhlaWdo
dCAqIGFuY2hvci55KTsgCisKKyAgICBDQUNGTGF5ZXJTZXRQb3NpdGlvbihtX3BhcmVudC0+Y2FW
aWRlb0xheWVyKCksIHBvc2l0aW9uKTsKKyAgICBDQUNGTGF5ZXJTZXRCb3VuZHMobV9wYXJlbnQt
PmNhVmlkZW9MYXllcigpLCBib3VuZHMpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisK
KyNlbmRpZiAvLyBQTEFURk9STShXSU4pICYmIEVOQUJMRShWSURFTykgJiYgVVNFKEFWRk9VTkRB
VElPTikKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2F2Zm91bmRhdGlv
bi9NZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRpb25DRi5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2F2Zm91bmRhdGlvbi9NZWRpYVBsYXllclByaXZh
dGVBVkZvdW5kYXRpb25DRi5oCShyZXZpc2lvbiA5MjMxNSkKKysrIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2F2Zm91bmRhdGlvbi9NZWRpYVBsYXllclByaXZhdGVBVkZvdW5kYXRp
b25DRi5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNiw0ICsyNiw4NCBAQAogI2lmbmRlZiBNZWRpYVBs
YXllclByaXZhdGVBVkZvdW5kYXRpb25DRl9oCiAjZGVmaW5lIE1lZGlhUGxheWVyUHJpdmF0ZUFW
Rm91bmRhdGlvbkNGX2gKIAorI2lmIFBMQVRGT1JNKFdJTikgJiYgRU5BQkxFKFZJREVPKSAmJiBV
U0UoQVZGT1VOREFUSU9OKQorCisjaW5jbHVkZSAiTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0
aW9uLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQVZGV3JhcHBlcjsKKworY2xh
c3MgTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uQ0YgOiBwdWJsaWMgTWVkaWFQbGF5ZXJQ
cml2YXRlQVZGb3VuZGF0aW9uIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5NZWRpYVBsYXllclBy
aXZhdGVBVkZvdW5kYXRpb25DRigpOworCisgICAgc3RhdGljIHZvaWQgcmVnaXN0ZXJNZWRpYUVu
Z2luZShNZWRpYUVuZ2luZVJlZ2lzdHJhcik7CisKK3ByaXZhdGU6CisgICAgTWVkaWFQbGF5ZXJQ
cml2YXRlQVZGb3VuZGF0aW9uQ0YoTWVkaWFQbGF5ZXIqKTsKKworICAgIC8vIEVuZ2luZSBzdXBw
b3J0CisgICAgc3RhdGljIFBhc3NPd25QdHI8TWVkaWFQbGF5ZXJQcml2YXRlSW50ZXJmYWNlPiBj
cmVhdGUoTWVkaWFQbGF5ZXIqIHBsYXllcik7CisgICAgc3RhdGljIHZvaWQgZ2V0U3VwcG9ydGVk
VHlwZXMoSGFzaFNldDxTdHJpbmc+JiB0eXBlcyk7CisgICAgc3RhdGljIE1lZGlhUGxheWVyOjpT
dXBwb3J0c1R5cGUgc3VwcG9ydHNUeXBlKGNvbnN0IFN0cmluZyYgdHlwZSwgY29uc3QgU3RyaW5n
JiBjb2RlY3MpOworICAgIHN0YXRpYyBib29sIGlzQXZhaWxhYmxlKCk7CisKKyAgICB2aXJ0dWFs
IHZvaWQgY2FuY2VsTG9hZCgpOworCisgICAgdmlydHVhbCBQbGF0Zm9ybU1lZGlhIHBsYXRmb3Jt
TWVkaWEoKSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBwbGF0Zm9ybVNldFZpc2libGUoYm9v
bCk7CisgICAgdmlydHVhbCB2b2lkIHBsYXRmb3JtUGxheSgpOworICAgIHZpcnR1YWwgdm9pZCBw
bGF0Zm9ybVBhdXNlKCk7CisgICAgdmlydHVhbCBmbG9hdCBjdXJyZW50VGltZSgpIGNvbnN0Owor
ICAgIHZpcnR1YWwgdm9pZCBzZXRWb2x1bWUoZmxvYXQpOworICAgIHZpcnR1YWwgdm9pZCBzZXRD
bG9zZWRDYXB0aW9uc1Zpc2libGUoYm9vbCk7CisgICAgdmlydHVhbCB2b2lkIHBhaW50KEdyYXBo
aWNzQ29udGV4dCosIGNvbnN0IEludFJlY3QmKTsKKyAgICB2aXJ0dWFsIHZvaWQgcGFpbnRDdXJy
ZW50RnJhbWVJbkNvbnRleHQoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgSW50UmVjdCYpOworICAg
IHZpcnR1YWwgUGxhdGZvcm1MYXllciogcGxhdGZvcm1MYXllcigpIGNvbnN0OworICAgIHZpcnR1
YWwgYm9vbCBzdXBwb3J0c0FjY2VsZXJhdGVkUmVuZGVyaW5nKCkgY29uc3QgeyByZXR1cm4gdHJ1
ZTsgfQorICAgIHZpcnR1YWwgZmxvYXQgbWVkaWFUaW1lRm9yVGltZVZhbHVlKGZsb2F0KSBjb25z
dDsKKworICAgIHZpcnR1YWwgdm9pZCBjcmVhdGVBVlBsYXllcigpOworICAgIHZpcnR1YWwgdm9p
ZCBjcmVhdGVBVlBsYXllckl0ZW0oKTsKKyAgICB2aXJ0dWFsIHZvaWQgY3JlYXRlQVZBc3NldEZv
clVSTChjb25zdCBTdHJpbmcmIHVybCk7CisgICAgdmlydHVhbCBNZWRpYVBsYXllclByaXZhdGVB
VkZvdW5kYXRpb246Okl0ZW1TdGF0dXMgcGxheWVySXRlbVN0YXR1cygpIGNvbnN0OworICAgIHZp
cnR1YWwgTWVkaWFQbGF5ZXJQcml2YXRlQVZGb3VuZGF0aW9uOjpBc3NldFN0YXR1cyBhc3NldFN0
YXR1cygpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIGNoZWNrUGxheWFiaWxpdHkoKTsKKyAg
ICB2aXJ0dWFsIHZvaWQgdXBkYXRlUmF0ZSgpOworICAgIHZpcnR1YWwgZmxvYXQgcmF0ZSgpIGNv
bnN0OworICAgIHZpcnR1YWwgdm9pZCBzZWVrVG9UaW1lKGZsb2F0IHRpbWUpOworICAgIHZpcnR1
YWwgdW5zaWduZWQgdG90YWxCeXRlcygpIGNvbnN0OworICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxU
aW1lUmFuZ2VzPiBwbGF0Zm9ybUJ1ZmZlcmVkVGltZVJhbmdlcygpIGNvbnN0OworICAgIHZpcnR1
YWwgZmxvYXQgcGxhdGZvcm1NYXhUaW1lU2Vla2FibGUoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGZs
b2F0IHBsYXRmb3JtRHVyYXRpb24oKSBjb25zdDsKKyAgICB2aXJ0dWFsIGZsb2F0IHBsYXRmb3Jt
TWF4VGltZUxvYWRlZCgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCBiZWdpbkxvYWRpbmdNZXRh
ZGF0YSgpOworICAgIHZpcnR1YWwgdm9pZCB0cmFja3NDaGFuZ2VkKCk7CisgICAgdmlydHVhbCB2
b2lkIHNpemVDaGFuZ2VkKCk7CisKKyAgICB2aXJ0dWFsIGJvb2wgaGFzQXZhaWxhYmxlVmlkZW9G
cmFtZSgpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIGNyZWF0ZUNvbnRleHRWaWRlb1JlbmRl
cmVyKCk7CisgICAgdmlydHVhbCB2b2lkIGRlc3Ryb3lDb250ZXh0VmlkZW9SZW5kZXJlcigpOwor
CisgICAgdmlydHVhbCB2b2lkIGNyZWF0ZVZpZGVvTGF5ZXIoKTsKKyAgICB2aXJ0dWFsIHZvaWQg
ZGVzdHJveVZpZGVvTGF5ZXIoKTsKKworICAgIHZpcnR1YWwgYm9vbCBoYXNDb250ZXh0UmVuZGVy
ZXIoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgaGFzTGF5ZXJSZW5kZXJlcigpIGNvbnN0Owor
CisgICAgdmlydHVhbCB2b2lkIGNvbnRlbnRzTmVlZHNEaXNwbGF5KCk7CisKKyAgICBmcmllbmQg
Y2xhc3MgQVZGV3JhcHBlcjsKKyAgICBBVkZXcmFwcGVyKiBtX2F2ZldyYXBwZXI7CisgICAgCisg
ICAgYm9vbCBtX3ZpZGVvRnJhbWVIYXNEcmF3bjsKK307CisKK30KKworI2VuZGlmIC8vIFBMQVRG
T1JNKFdJTikgJiYgRU5BQkxFKFZJREVPKSAmJiBVU0UoQVZGT1VOREFUSU9OKQogI2VuZGlmIC8v
IE1lZGlhUGxheWVyUHJpdmF0ZUFWRm91bmRhdGlvbkNGX2gK
</data>
<flag name="review"
          id="98259"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>