<?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>48810</bug_id>
          
          <creation_ts>2010-11-01 17:24:00 -0700</creation_ts>
          <short_desc>Add RealtimeAnalyser files</short_desc>
          <delta_ts>2010-11-02 17:44:54 -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>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Chris Rogers">crogers</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>cmarrin</cc>
    
    <cc>commit-queue</cc>
    
    <cc>dglazkov</cc>
    
    <cc>eric.carlson</cc>
    
    <cc>jamesr</cc>
    
    <cc>jer.noble</cc>
    
    <cc>kbr</cc>
    
    <cc>simon.fraser</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>303107</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-11-01 17:24:00 -0700</bug_when>
    <thetext>Add RealtimeAnalyser files</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>303109</commentid>
    <comment_count>1</comment_count>
      <attachid>72606</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-11-01 17:25:51 -0700</bug_when>
    <thetext>Created attachment 72606
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>303167</commentid>
    <comment_count>2</comment_count>
      <attachid>72606</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-11-01 19:26:48 -0700</bug_when>
    <thetext>Comment on attachment 72606
Patch

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

A few relatively minor issues.

&gt; WebCore/webaudio/RealtimeAnalyser.cpp:53
&gt; +const unsigned RealtimeAnalyser::InputBufferSize = RealtimeAnalyser::MaxFFTSize * 2;

I recall that you may have compilation problems on Windows with static constants. I think the MSVC compiler wants the definition in the header and none in the .cpp file. However I guess we&apos;ll cross that bridge when we come to it.

&gt; WebCore/webaudio/RealtimeAnalyser.cpp:109
&gt; +        return;

This check is redundant with the second half of the isDestinationGood check below, and has the disadvantage that it uses the InputBufferSize constant instead of m_inputBuffer.size(). It should be removed and the isDestinationGood check hoisted up to here.

&gt; WebCore/webaudio/RealtimeAnalyser.cpp:129
&gt; +static void ApplyWindow(float* p, size_t n)

WebKit style is lower case for first letter. Also, consider using an anonymous namespace rather than a static function.

&gt; WebCore/webaudio/RealtimeAnalyser.cpp:153
&gt; +    AudioFloatArray temporaryBuffer(fftSize);

Isn&apos;t the reallocation of this array expensive? If so consider caching it and only reallocating if fftSize changes.

&gt; WebCore/webaudio/RealtimeAnalyser.cpp:158
&gt; +    // FIXME : optimize with memcpy()

Add period at end of sentence.

&gt; WebCore/webaudio/RealtimeAnalyser.cpp:215
&gt; +            double dbMag = !linearValue ? MinDecibels : 20.0 * log10(linearValue);

What&apos;s this 20.0 constant? Can it be defined somewhere?

&gt; WebCore/webaudio/RealtimeAnalyser.cpp:241
&gt; +            double dbMag = !linearValue ? m_minDecibels : 20.0 * log10(linearValue);

Same comment about the 20.0 constant.

&gt; WebCore/webaudio/RealtimeAnalyser.cpp:244
&gt; +            double scaledValue = 255.0 * (dbMag - m_minDecibels) * RangeScaleFactor;

Please #include &lt;limits.h&gt; and use UCHAR_MAX rather than 255.0 sprinkled everywhere.

&gt; WebCore/webaudio/RealtimeAnalyser.cpp:282
&gt; +            double scaledValue = 128.0 * (value + 1.0);

Unfortunately SCHAR_MAX is 127 and not 128, but if there is a reasonable way to express this scaling in terms of predefined constants please do so.

&gt; WebCore/webaudio/RealtimeAnalyser.cpp:288
&gt; +            if (scaledValue &gt; 255.0)
&gt; +                scaledValue = 255.0;

These should use UCHAR_MAX.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>303545</commentid>
    <comment_count>3</comment_count>
      <attachid>72606</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-11-02 12:16:40 -0700</bug_when>
    <thetext>Comment on attachment 72606
Patch

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

&gt;&gt; WebCore/webaudio/RealtimeAnalyser.cpp:53
&gt;&gt; +const unsigned RealtimeAnalyser::InputBufferSize = RealtimeAnalyser::MaxFFTSize * 2;
&gt; 
&gt; I recall that you may have compilation problems on Windows with static constants. I think the MSVC compiler wants the definition in the header and none in the .cpp file. However I guess we&apos;ll cross that bridge when we come to it.

Actually jamesr thought the problem was the other way where MSVC didn&apos;t like the definition in the header, but required it in the .cpp

&gt;&gt; WebCore/webaudio/RealtimeAnalyser.cpp:109
&gt;&gt; +        return;
&gt; 
&gt; This check is redundant with the second half of the isDestinationGood check below, and has the disadvantage that it uses the InputBufferSize constant instead of m_inputBuffer.size(). It should be removed and the isDestinationGood check hoisted up to here.

FIXED

&gt;&gt; WebCore/webaudio/RealtimeAnalyser.cpp:129
&gt;&gt; +static void ApplyWindow(float* p, size_t n)
&gt; 
&gt; WebKit style is lower case for first letter. Also, consider using an anonymous namespace rather than a static function.

FIXED

&gt;&gt; WebCore/webaudio/RealtimeAnalyser.cpp:153
&gt;&gt; +    AudioFloatArray temporaryBuffer(fftSize);
&gt; 
&gt; Isn&apos;t the reallocation of this array expensive? If so consider caching it and only reallocating if fftSize changes.

In this situation, compared with the cost of doing the windowing and the FFT, the cost of malloc() is extremely small.

&gt;&gt; WebCore/webaudio/RealtimeAnalyser.cpp:158
&gt;&gt; +    // FIXME : optimize with memcpy()
&gt; 
&gt; Add period at end of sentence.

FIXED

&gt;&gt; WebCore/webaudio/RealtimeAnalyser.cpp:215
&gt;&gt; +            double dbMag = !linearValue ? MinDecibels : 20.0 * log10(linearValue);
&gt; 
&gt; What&apos;s this 20.0 constant? Can it be defined somewhere?

Sorry, I forgot I had defined a function for this:
AudioUtilities::linearToDecibels()

FIXED

&gt;&gt; WebCore/webaudio/RealtimeAnalyser.cpp:241
&gt;&gt; +            double dbMag = !linearValue ? m_minDecibels : 20.0 * log10(linearValue);
&gt; 
&gt; Same comment about the 20.0 constant.

FIXED: switched to AudioUtilities::linearToDecibels()

&gt;&gt; WebCore/webaudio/RealtimeAnalyser.cpp:244
&gt;&gt; +            double scaledValue = 255.0 * (dbMag - m_minDecibels) * RangeScaleFactor;
&gt; 
&gt; Please #include &lt;limits.h&gt; and use UCHAR_MAX rather than 255.0 sprinkled everywhere.

FIXED

&gt;&gt; WebCore/webaudio/RealtimeAnalyser.cpp:288
&gt;&gt; +                scaledValue = 255.0;
&gt; 
&gt; These should use UCHAR_MAX.

FIXED</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>303549</commentid>
    <comment_count>4</comment_count>
      <attachid>72713</attachid>
    <who name="Chris Rogers">crogers</who>
    <bug_when>2010-11-02 12:23:20 -0700</bug_when>
    <thetext>Created attachment 72713
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>303581</commentid>
    <comment_count>5</comment_count>
      <attachid>72713</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2010-11-02 12:50:15 -0700</bug_when>
    <thetext>Comment on attachment 72713
Patch

Looks good.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>303817</commentid>
    <comment_count>6</comment_count>
      <attachid>72713</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-11-02 17:44:48 -0700</bug_when>
    <thetext>Comment on attachment 72713
Patch

Clearing flags on attachment: 72713

Committed r71193: &lt;http://trac.webkit.org/changeset/71193&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>303818</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-11-02 17:44:54 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>72606</attachid>
            <date>2010-11-01 17:25:51 -0700</date>
            <delta_ts>2010-11-02 12:23:16 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-48810-20101101172550.patch</filename>
            <type>text/plain</type>
            <size>16028</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3MTA4MykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzQgQEAKKzIwMTAtMTEtMDEgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgUmVhbHRpbWVBbmFseXNlciBmaWxlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9NDg4MTAKKworICAgICAgICBObyBuZXcgdGVzdHMgc2luY2UgYXVk
aW8gQVBJIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCisKKyAgICAgICAgKiB3ZWJhdWRpby9SZWFs
dGltZUFuYWx5c2VyLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZWFsdGltZUFuYWx5
c2VyOjpSZWFsdGltZUFuYWx5c2VyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlYWx0aW1lQW5hbHlz
ZXI6On5SZWFsdGltZUFuYWx5c2VyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlYWx0aW1lQW5hbHlz
ZXI6OnJlc2V0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlYWx0aW1lQW5hbHlzZXI6OnNldEZmdFNp
emUpOgorICAgICAgICAoV2ViQ29yZTo6UmVhbHRpbWVBbmFseXNlcjo6d3JpdGVJbnB1dCk6Cisg
ICAgICAgIChXZWJDb3JlOjpBcHBseVdpbmRvdyk6CisgICAgICAgIChXZWJDb3JlOjpSZWFsdGlt
ZUFuYWx5c2VyOjpkb0ZGVEFuYWx5c2lzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlYWx0aW1lQW5h
bHlzZXI6OmdldEZsb2F0RnJlcXVlbmN5RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpSZWFsdGlt
ZUFuYWx5c2VyOjpnZXRCeXRlRnJlcXVlbmN5RGF0YSk6CisgICAgICAgIChXZWJDb3JlOjpSZWFs
dGltZUFuYWx5c2VyOjpnZXRCeXRlVGltZURvbWFpbkRhdGEpOgorICAgICAgICAqIHdlYmF1ZGlv
L1JlYWx0aW1lQW5hbHlzZXIuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZWFsdGltZUFu
YWx5c2VyOjpmZnRTaXplKToKKyAgICAgICAgKFdlYkNvcmU6OlJlYWx0aW1lQW5hbHlzZXI6OmZy
ZXF1ZW5jeUJpbkNvdW50KToKKyAgICAgICAgKFdlYkNvcmU6OlJlYWx0aW1lQW5hbHlzZXI6OnNl
dE1pbkRlY2liZWxzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlYWx0aW1lQW5hbHlzZXI6Om1pbkRl
Y2liZWxzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlYWx0aW1lQW5hbHlzZXI6OnNldE1heERlY2li
ZWxzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlYWx0aW1lQW5hbHlzZXI6Om1heERlY2liZWxzKToK
KyAgICAgICAgKFdlYkNvcmU6OlJlYWx0aW1lQW5hbHlzZXI6OnNldFNtb290aGluZ1RpbWVDb25z
dGFudCk6CisgICAgICAgIChXZWJDb3JlOjpSZWFsdGltZUFuYWx5c2VyOjpzbW9vdGhpbmdUaW1l
Q29uc3RhbnQpOgorICAgICAgICAoV2ViQ29yZTo6UmVhbHRpbWVBbmFseXNlcjo6bWFnbml0dWRl
QnVmZmVyKToKKwogMjAxMC0xMS0wMSAgTWFydGluIFJvYmluc29uICA8bXJvYmluc29uQGlnYWxp
YS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgWGFuIExvcGV6LgpJbmRleDogV2ViQ29yZS93
ZWJhdWRpby9SZWFsdGltZUFuYWx5c2VyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3dlYmF1
ZGlvL1JlYWx0aW1lQW5hbHlzZXIuY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS93ZWJhdWRp
by9SZWFsdGltZUFuYWx5c2VyLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyOTkgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiAgUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElN
UExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoV0VCX0FVRElPKQor
CisjaW5jbHVkZSAiUmVhbHRpbWVBbmFseXNlci5oIgorCisjaW5jbHVkZSAiQXVkaW9CdXMuaCIK
KyNpbmNsdWRlICJGRlRGcmFtZS5oIgorCisjaWYgRU5BQkxFKDNEX0NBTlZBUykKKyNpbmNsdWRl
ICJGbG9hdDMyQXJyYXkuaCIKKyNpbmNsdWRlICJVaW50OEFycmF5LmgiCisjZW5kaWYKKworI2lu
Y2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx3dGYvQ29tcGxleC5oPgorI2luY2x1ZGUgPHd0
Zi9UaHJlYWRpbmcuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCitjb25zdCBkb3VibGUgUmVhbHRpbWVBbmFseXNlcjo6RGVmYXVsdFNtb290aGluZ1Rp
bWVDb25zdGFudCAgPSAwLjg7Citjb25zdCBkb3VibGUgUmVhbHRpbWVBbmFseXNlcjo6RGVmYXVs
dE1pbkRlY2liZWxzID0gLTEwMC4wOworY29uc3QgZG91YmxlIFJlYWx0aW1lQW5hbHlzZXI6OkRl
ZmF1bHRNYXhEZWNpYmVscyA9IC0zMC4wOworCitjb25zdCB1bnNpZ25lZCBSZWFsdGltZUFuYWx5
c2VyOjpEZWZhdWx0RkZUU2l6ZSA9IDIwNDg7Citjb25zdCB1bnNpZ25lZCBSZWFsdGltZUFuYWx5
c2VyOjpNYXhGRlRTaXplID0gMjA0ODsKK2NvbnN0IHVuc2lnbmVkIFJlYWx0aW1lQW5hbHlzZXI6
OklucHV0QnVmZmVyU2l6ZSA9IFJlYWx0aW1lQW5hbHlzZXI6Ok1heEZGVFNpemUgKiAyOworCitS
ZWFsdGltZUFuYWx5c2VyOjpSZWFsdGltZUFuYWx5c2VyKCkKKyAgICA6IG1faW5wdXRCdWZmZXIo
SW5wdXRCdWZmZXJTaXplKQorICAgICwgbV93cml0ZUluZGV4KDApCisgICAgLCBtX2ZmdFNpemUo
RGVmYXVsdEZGVFNpemUpCisgICAgLCBtX21hZ25pdHVkZUJ1ZmZlcihEZWZhdWx0RkZUU2l6ZSAv
IDIpCisgICAgLCBtX3Ntb290aGluZ1RpbWVDb25zdGFudChEZWZhdWx0U21vb3RoaW5nVGltZUNv
bnN0YW50KQorICAgICwgbV9taW5EZWNpYmVscyhEZWZhdWx0TWluRGVjaWJlbHMpCisgICAgLCBt
X21heERlY2liZWxzKERlZmF1bHRNYXhEZWNpYmVscykKK3sKKyAgICBtX2FuYWx5c2lzRnJhbWUg
PSBhZG9wdFB0cihuZXcgRkZURnJhbWUoRGVmYXVsdEZGVFNpemUpKTsKK30KKworUmVhbHRpbWVB
bmFseXNlcjo6flJlYWx0aW1lQW5hbHlzZXIoKQoreworfQorCit2b2lkIFJlYWx0aW1lQW5hbHlz
ZXI6OnJlc2V0KCkKK3sKKyAgICBtX3dyaXRlSW5kZXggPSAwOworICAgIG1faW5wdXRCdWZmZXIu
emVybygpOworICAgIG1fbWFnbml0dWRlQnVmZmVyLnplcm8oKTsKK30KKwordm9pZCBSZWFsdGlt
ZUFuYWx5c2VyOjpzZXRGZnRTaXplKHNpemVfdCBzaXplKQoreworICAgIEFTU0VSVChpc01haW5U
aHJlYWQoKSk7CisKKyAgICAvLyBPbmx5IGFsbG93IHBvd2VycyBvZiB0d28uCisgICAgdW5zaWdu
ZWQgbG9nMnNpemUgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4obG9nMihzaXplKSk7CisgICAgYm9v
bCBpc1BPVCgxVUwgPDwgbG9nMnNpemUgPT0gc2l6ZSk7CisgICAgCisgICAgaWYgKCFpc1BPVCB8
fCBzaXplID4gTWF4RkZUU2l6ZSkgeworICAgICAgICAvLyBGSVhNRTogSXQgd291bGQgYmUgZ29v
ZCB0byBhbHNvIHNldCBhbiBleGNlcHRpb24uCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBpZiAobV9mZnRTaXplICE9IHNpemUpIHsKKyAgICAgICAgbV9hbmFseXNpc0ZyYW1lID0gYWRv
cHRQdHIobmV3IEZGVEZyYW1lKG1fZmZ0U2l6ZSkpOworICAgICAgICBtX21hZ25pdHVkZUJ1ZmZl
ci5yZXNpemUoc2l6ZSk7CisgICAgICAgIG1fZmZ0U2l6ZSA9IHNpemU7CisgICAgfQorfQorCit2
b2lkIFJlYWx0aW1lQW5hbHlzZXI6OndyaXRlSW5wdXQoQXVkaW9CdXMqIGJ1cywgc2l6ZV90IGZy
YW1lc1RvUHJvY2VzcykKK3sKKyAgICBib29sIGlzQnVzR29vZCA9IGJ1cyAmJiBidXMtPm51bWJl
ck9mQ2hhbm5lbHMoKSA+IDAgJiYgYnVzLT5jaGFubmVsKDApLT5sZW5ndGgoKSA+PSBmcmFtZXNU
b1Byb2Nlc3M7CisgICAgQVNTRVJUKGlzQnVzR29vZCk7CisgICAgaWYgKCFpc0J1c0dvb2QpCisg
ICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgLy8gRklYTUUgOiBhbGxvdyB0byB3b3JrIHdp
dGggbm9uLUZGVFNpemUgZGl2aXNpYmxlIGNodW5raW5nCisgICAgYm9vbCBpc0ZyYW1lc1RvUHJv
Y2Vzc0dvb2QgPSBtX3dyaXRlSW5kZXggKyBmcmFtZXNUb1Byb2Nlc3MgPD0gSW5wdXRCdWZmZXJT
aXplOworICAgIEFTU0VSVChpc0ZyYW1lc1RvUHJvY2Vzc0dvb2QpOworICAgIGlmICghaXNGcmFt
ZXNUb1Byb2Nlc3NHb29kKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgLy8gUGVyZm9ybSBy
ZWFsLXRpbWUgYW5hbHlzaXMKKyAgICAvLyBGSVhNRSA6IGZvciBub3cganVzdCB1c2UgbGVmdCBj
aGFubmVsIChtdXN0IG1peCBpZiBzdGVyZW8gc291cmNlKQorICAgIGZsb2F0KiBzb3VyY2UgPSBi
dXMtPmNoYW5uZWwoMCktPmRhdGEoKTsKKworICAgIC8vIFRoZSBzb3VyY2UgaGFzIGFscmVhZHkg
YmVlbiBzYW5pdHkgY2hlY2tlZCB3aXRoIGlzQnVzR29vZCBhYm92ZS4KKyAgICAKKyAgICBib29s
IGlzRGVzdGluYXRpb25Hb29kID0gbV93cml0ZUluZGV4IDwgbV9pbnB1dEJ1ZmZlci5zaXplKCkg
JiYgbV93cml0ZUluZGV4ICsgZnJhbWVzVG9Qcm9jZXNzIDw9IG1faW5wdXRCdWZmZXIuc2l6ZSgp
OworICAgIEFTU0VSVChpc0Rlc3RpbmF0aW9uR29vZCk7CisgICAgaWYgKCFpc0Rlc3RpbmF0aW9u
R29vZCkKKyAgICAgICAgcmV0dXJuOyAgICAKKworICAgIG1lbWNweShtX2lucHV0QnVmZmVyLmRh
dGEoKSArIG1fd3JpdGVJbmRleCwgc291cmNlLCBzaXplb2YoZmxvYXQpICogZnJhbWVzVG9Qcm9j
ZXNzKTsKKworICAgIG1fd3JpdGVJbmRleCArPSBmcmFtZXNUb1Byb2Nlc3M7CisgICAgaWYgKG1f
d3JpdGVJbmRleCA+PSBJbnB1dEJ1ZmZlclNpemUpCisgICAgICAgIG1fd3JpdGVJbmRleCA9IDA7
Cit9CisKK3N0YXRpYyB2b2lkIEFwcGx5V2luZG93KGZsb2F0KiBwLCBzaXplX3QgbikKK3sKKyAg
ICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworICAgIAorICAgIC8vIEJsYWNrbWFuIHdpbmRvdwor
ICAgIGRvdWJsZSBhbHBoYSA9IDAuMTY7CisgICAgZG91YmxlIGEwID0gMC41ICogKDEuMCAtIGFs
cGhhKTsKKyAgICBkb3VibGUgYTEgPSAwLjU7CisgICAgZG91YmxlIGEyID0gMC41ICogYWxwaGE7
CisgICAgCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICBk
b3VibGUgeCA9IHN0YXRpY19jYXN0PGRvdWJsZT4oaSkgLyBzdGF0aWNfY2FzdDxkb3VibGU+KG4p
OworICAgICAgICBkb3VibGUgd2luZG93ID0gYTAgLSBhMSAqIGNvcygyLjAgKiBNX1BJICogeCkg
KyBhMiAqIGNvcyg0LjAgKiBNX1BJICogeCk7CisgICAgICAgIHBbaV0gKj0gZmxvYXQod2luZG93
KTsKKyAgICB9Cit9CisKK3ZvaWQgUmVhbHRpbWVBbmFseXNlcjo6ZG9GRlRBbmFseXNpcygpCit7
ICAgIAorICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisKKyAgICAvLyBVbnJvbGwgdGhlIGlu
cHV0IGJ1ZmZlciBpbnRvIGEgdGVtcG9yYXJ5IGJ1ZmZlciwgd2hlcmUgd2UnbGwgYXBwbHkgYW4g
YW5hbHlzaXMgd2luZG93IGZvbGxvd2VkIGJ5IGFuIEZGVC4KKyAgICBzaXplX3QgZmZ0U2l6ZSA9
IHRoaXMtPmZmdFNpemUoKTsKKyAgICAKKyAgICBBdWRpb0Zsb2F0QXJyYXkgdGVtcG9yYXJ5QnVm
ZmVyKGZmdFNpemUpOworICAgIGZsb2F0KiBpbnB1dEJ1ZmZlciA9IG1faW5wdXRCdWZmZXIuZGF0
YSgpOworICAgIGZsb2F0KiB0ZW1wUCA9IHRlbXBvcmFyeUJ1ZmZlci5kYXRhKCk7CisKKyAgICAv
LyBUYWtlIHRoZSBwcmV2aW91cyBmZnRTaXplIHZhbHVlcyBmcm9tIHRoZSBpbnB1dCBidWZmZXIg
YW5kIGNvcHkgaW50byB0aGUgdGVtcG9yYXJ5IGJ1ZmZlci4KKyAgICAvLyBGSVhNRSA6IG9wdGlt
aXplIHdpdGggbWVtY3B5KCkKKyAgICB1bnNpZ25lZCB3cml0ZUluZGV4ID0gbV93cml0ZUluZGV4
OworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBmZnRTaXplOyArK2kpCisgICAgICAgIHRl
bXBQW2ldID0gaW5wdXRCdWZmZXJbKGkgKyB3cml0ZUluZGV4IC0gZmZ0U2l6ZSArIElucHV0QnVm
ZmVyU2l6ZSkgJSBJbnB1dEJ1ZmZlclNpemVdOworICAgIAorICAgIC8vIFdpbmRvdyB0aGUgaW5w
dXQgc2FtcGxlcy4KKyAgICBBcHBseVdpbmRvdyh0ZW1wUCwgZmZ0U2l6ZSk7CisgICAgCisgICAg
Ly8gRG8gdGhlIGFuYWx5c2lzLgorICAgIG1fYW5hbHlzaXNGcmFtZS0+ZG9GRlQodGVtcFApOwor
CisgICAgc2l6ZV90IG4gPSBEZWZhdWx0RkZUU2l6ZSAvIDI7CisKKyAgICBmbG9hdCogcmVhbFAg
PSBtX2FuYWx5c2lzRnJhbWUtPnJlYWxEYXRhKCk7CisgICAgZmxvYXQqIGltYWdQID0gbV9hbmFs
eXNpc0ZyYW1lLT5pbWFnRGF0YSgpOworCisgICAgLy8gQmxvdyBhd2F5IHRoZSBwYWNrZWQgbnlx
dWlzdCBjb21wb25lbnQuCisgICAgaW1hZ1BbMF0gPSAwLjBmOworICAgIAorICAgIC8vIE5vcm1h
bGl6ZSBzbyB0aGFuIGFuIGlucHV0IHNpbmUgd2F2ZSBhdCAwZEJmcyByZWdpc3RlcnMgYXMgMGRC
ZnMgKHVuZG8gRkZUIHNjYWxpbmcgZmFjdG9yKS4KKyAgICBjb25zdCBkb3VibGUgTWFnbml0dWRl
U2NhbGUgPSAxLjAgLyBEZWZhdWx0RkZUU2l6ZTsKKworICAgIC8vIEEgdmFsdWUgb2YgMCBkb2Vz
IG5vIGF2ZXJhZ2luZyB3aXRoIHRoZSBwcmV2aW91cyByZXN1bHQuICBMYXJnZXIgdmFsdWVzIHBy
b2R1Y2Ugc2xvd2VyLCBidXQgc21vb3RoZXIgY2hhbmdlcy4KKyAgICBkb3VibGUgayA9IG1fc21v
b3RoaW5nVGltZUNvbnN0YW50OworICAgIGsgPSBtYXgoMC4wLCBrKTsKKyAgICBrID0gbWluKDEu
MCwgayk7ICAgIAorICAgIAorICAgIC8vIENvbnZlcnQgdGhlIGFuYWx5c2lzIGRhdGEgZnJvbSBj
b21wbGV4IHRvIG1hZ25pdHVkZSBhbmQgYXZlcmFnZSB3aXRoIHRoZSBwcmV2aW91cyByZXN1bHQu
CisgICAgZmxvYXQqIGRlc3RpbmF0aW9uID0gbWFnbml0dWRlQnVmZmVyKCkuZGF0YSgpOworICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgQ29tcGxleCBjKHJl
YWxQW2ldLCBpbWFnUFtpXSk7CisgICAgICAgIGRvdWJsZSBzY2FsYXJNYWduaXR1ZGUgPSBhYnMo
YykgKiBNYWduaXR1ZGVTY2FsZTsgICAgICAgIAorICAgICAgICBkZXN0aW5hdGlvbltpXSA9IGZs
b2F0KGsgKiBkZXN0aW5hdGlvbltpXSArICgxLjAgLSBrKSAqIHNjYWxhck1hZ25pdHVkZSk7Cisg
ICAgfQorfQorCisjaWYgRU5BQkxFKDNEX0NBTlZBUykKKwordm9pZCBSZWFsdGltZUFuYWx5c2Vy
OjpnZXRGbG9hdEZyZXF1ZW5jeURhdGEoRmxvYXQzMkFycmF5KiBkZXN0aW5hdGlvbkFycmF5KQor
eworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisKKyAgICBpZiAoIWRlc3RpbmF0aW9uQXJy
YXkpCisgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgZG9GRlRBbmFseXNpcygpOworICAg
IAorICAgIC8vIENvbnZlcnQgZnJvbSBsaW5lYXIgbWFnbml0dWRlIHRvIGZsb2F0aW5nLXBvaW50
IGRlY2liZWxzLgorICAgIGNvbnN0IGRvdWJsZSBNaW5EZWNpYmVscyA9IG1fbWluRGVjaWJlbHM7
CisgICAgdW5zaWduZWQgc291cmNlTGVuZ3RoID0gbWFnbml0dWRlQnVmZmVyKCkuc2l6ZSgpOwor
ICAgIHNpemVfdCBsZW4gPSBtaW4oc291cmNlTGVuZ3RoLCBkZXN0aW5hdGlvbkFycmF5LT5sZW5n
dGgoKSk7CisgICAgaWYgKGxlbiA+IDApIHsKKyAgICAgICAgY29uc3QgZmxvYXQqIHNvdXJjZSA9
IG1hZ25pdHVkZUJ1ZmZlcigpLmRhdGEoKTsKKyAgICAgICAgZmxvYXQqIGRlc3RpbmF0aW9uID0g
ZGVzdGluYXRpb25BcnJheS0+ZGF0YSgpOworICAgICAgICAKKyAgICAgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgICAgICBmbG9hdCBsaW5lYXJWYWx1ZSA9
IHNvdXJjZVtpXTsKKyAgICAgICAgICAgIGRvdWJsZSBkYk1hZyA9ICFsaW5lYXJWYWx1ZSA/IE1p
bkRlY2liZWxzIDogMjAuMCAqIGxvZzEwKGxpbmVhclZhbHVlKTsKKyAgICAgICAgICAgIGRlc3Rp
bmF0aW9uW2ldID0gZmxvYXQoZGJNYWcpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFJl
YWx0aW1lQW5hbHlzZXI6OmdldEJ5dGVGcmVxdWVuY3lEYXRhKFVpbnQ4QXJyYXkqIGRlc3RpbmF0
aW9uQXJyYXkpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKworICAgIGlmICghZGVz
dGluYXRpb25BcnJheSkKKyAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICBkb0ZGVEFuYWx5
c2lzKCk7CisgICAgCisgICAgLy8gQ29udmVydCBmcm9tIGxpbmVhciBtYWduaXR1ZGUgdG8gdW5z
aWduZWQtYnl0ZSBkZWNpYmVscy4KKyAgICB1bnNpZ25lZCBzb3VyY2VMZW5ndGggPSBtYWduaXR1
ZGVCdWZmZXIoKS5zaXplKCk7CisgICAgc2l6ZV90IGxlbiA9IG1pbihzb3VyY2VMZW5ndGgsIGRl
c3RpbmF0aW9uQXJyYXktPmxlbmd0aCgpKTsKKyAgICBpZiAobGVuID4gMCkgeworICAgICAgICBj
b25zdCBkb3VibGUgUmFuZ2VTY2FsZUZhY3RvciA9IG1fbWF4RGVjaWJlbHMgPT0gbV9taW5EZWNp
YmVscyA/IDEuMCA6IDEuMCAvIChtX21heERlY2liZWxzIC0gbV9taW5EZWNpYmVscyk7CisKKyAg
ICAgICAgY29uc3QgZmxvYXQqIHNvdXJjZSA9IG1hZ25pdHVkZUJ1ZmZlcigpLmRhdGEoKTsKKyAg
ICAgICAgdW5zaWduZWQgY2hhciogZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbkFycmF5LT5kYXRh
KCk7ICAgICAgICAKKyAgICAgICAgCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBs
ZW47ICsraSkgeworICAgICAgICAgICAgZmxvYXQgbGluZWFyVmFsdWUgPSBzb3VyY2VbaV07Cisg
ICAgICAgICAgICBkb3VibGUgZGJNYWcgPSAhbGluZWFyVmFsdWUgPyBtX21pbkRlY2liZWxzIDog
MjAuMCAqIGxvZzEwKGxpbmVhclZhbHVlKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8g
VGhlIHJhbmdlIG1fbWluRGVjaWJlbHMgdG8gbV9tYXhEZWNpYmVscyB3aWxsIGJlIHNjYWxlZCB0
byBieXRlIHZhbHVlcyBmcm9tIDAgdG8gMjU1LgorICAgICAgICAgICAgZG91YmxlIHNjYWxlZFZh
bHVlID0gMjU1LjAgKiAoZGJNYWcgLSBtX21pbkRlY2liZWxzKSAqIFJhbmdlU2NhbGVGYWN0b3I7
CisKKyAgICAgICAgICAgIC8vIENsaXAgdG8gdmFsaWQgcmFuZ2UuCisgICAgICAgICAgICBpZiAo
c2NhbGVkVmFsdWUgPCAwLjApCisgICAgICAgICAgICAgICAgc2NhbGVkVmFsdWUgPSAwLjA7Cisg
ICAgICAgICAgICBpZiAoc2NhbGVkVmFsdWUgPiAyNTUuMCkKKyAgICAgICAgICAgICAgICBzY2Fs
ZWRWYWx1ZSA9IDI1NS4wOworICAgICAgICAgICAgCisgICAgICAgICAgICBkZXN0aW5hdGlvbltp
XSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHNjYWxlZFZhbHVlKTsKKyAgICAgICAgfQor
ICAgIH0KK30KKwordm9pZCBSZWFsdGltZUFuYWx5c2VyOjpnZXRCeXRlVGltZURvbWFpbkRhdGEo
VWludDhBcnJheSogZGVzdGluYXRpb25BcnJheSkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFk
KCkpOworCisgICAgaWYgKCFkZXN0aW5hdGlvbkFycmF5KQorICAgICAgICByZXR1cm47CisgICAg
ICAgIAorICAgIHVuc2lnbmVkIGZmdFNpemUgPSB0aGlzLT5mZnRTaXplKCk7CisgICAgc2l6ZV90
IGxlbiA9IG1pbihmZnRTaXplLCBkZXN0aW5hdGlvbkFycmF5LT5sZW5ndGgoKSk7CisgICAgaWYg
KGxlbiA+IDApIHsKKyAgICAgICAgYm9vbCBpc0lucHV0QnVmZmVyR29vZCA9IG1faW5wdXRCdWZm
ZXIuc2l6ZSgpID09IElucHV0QnVmZmVyU2l6ZSAmJiBtX2lucHV0QnVmZmVyLnNpemUoKSA+IGZm
dFNpemU7CisgICAgICAgIEFTU0VSVChpc0lucHV0QnVmZmVyR29vZCk7CisgICAgICAgIGlmICgh
aXNJbnB1dEJ1ZmZlckdvb2QpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgZmxvYXQq
IGlucHV0QnVmZmVyID0gbV9pbnB1dEJ1ZmZlci5kYXRhKCk7ICAgICAgICAKKyAgICAgICAgdW5z
aWduZWQgY2hhciogZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbkFycmF5LT5kYXRhKCk7CisgICAg
ICAgIAorICAgICAgICB1bnNpZ25lZCB3cml0ZUluZGV4ID0gbV93cml0ZUluZGV4OworCisgICAg
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICAgICAgLy8g
QnVmZmVyIGFjY2VzcyBpcyBwcm90ZWN0ZWQgZHVlIHRvIG1vZHVsbyBvcGVyYXRpb24uCisgICAg
ICAgICAgICBmbG9hdCB2YWx1ZSA9IGlucHV0QnVmZmVyWyhpICsgd3JpdGVJbmRleCAtIGZmdFNp
emUgKyBJbnB1dEJ1ZmZlclNpemUpICUgSW5wdXRCdWZmZXJTaXplXTsKKworICAgICAgICAgICAg
Ly8gU2NhbGUgZnJvbSBub21pbmFsIC0xLjAgLT4gKzEuMCB0byB1bnNpZ25lZCBieXRlLgorICAg
ICAgICAgICAgZG91YmxlIHNjYWxlZFZhbHVlID0gMTI4LjAgKiAodmFsdWUgKyAxLjApOworCisg
ICAgICAgICAgICAvLyBDbGlwIHRvIHZhbGlkIHJhbmdlLgorICAgICAgICAgICAgaWYgKHNjYWxl
ZFZhbHVlIDwgMC4wKQorICAgICAgICAgICAgICAgIHNjYWxlZFZhbHVlID0gMC4wOworICAgICAg
ICAgICAgaWYgKHNjYWxlZFZhbHVlID4gMjU1LjApCisgICAgICAgICAgICAgICAgc2NhbGVkVmFs
dWUgPSAyNTUuMDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZGVzdGluYXRpb25baV0gPSBz
dGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihzY2FsZWRWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9
Cit9CisKKyNlbmRpZiAvLyAzRF9DQU5WQVMKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisj
ZW5kaWYgLy8gRU5BQkxFKFdFQl9BVURJTykKSW5kZXg6IFdlYkNvcmUvd2ViYXVkaW8vUmVhbHRp
bWVBbmFseXNlci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvd2ViYXVkaW8vUmVhbHRpbWVBbmFs
eXNlci5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS93ZWJhdWRpby9SZWFsdGltZUFuYWx5c2Vy
LmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDEwLCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVU
T1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Ug
QVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBS
ZWFsdGltZUFuYWx5c2VyX2gKKyNkZWZpbmUgUmVhbHRpbWVBbmFseXNlcl9oCisKKyNpbmNsdWRl
ICJBdWRpb0FycmF5LmgiCisjaW5jbHVkZSA8d3RmL05vbkNvcHlhYmxlLmg+CisjaW5jbHVkZSA8
d3RmL093blB0ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEF1ZGlvQnVzOwor
Y2xhc3MgRkZURnJhbWU7CisKKyNpZiBFTkFCTEUoM0RfQ0FOVkFTKQorY2xhc3MgRmxvYXQzMkFy
cmF5OworY2xhc3MgVWludDhBcnJheTsKKyNlbmRpZgorCitjbGFzcyBSZWFsdGltZUFuYWx5c2Vy
IDogcHVibGljIE5vbmNvcHlhYmxlIHsKK3B1YmxpYzoKKyAgICBSZWFsdGltZUFuYWx5c2VyKCk7
CisgICAgdmlydHVhbCB+UmVhbHRpbWVBbmFseXNlcigpOworICAgIAorICAgIHZvaWQgcmVzZXQo
KTsKKworICAgIHNpemVfdCBmZnRTaXplKCkgY29uc3QgeyByZXR1cm4gbV9mZnRTaXplOyB9Cisg
ICAgdm9pZCBzZXRGZnRTaXplKHNpemVfdCBzaXplKTsKKworICAgIHVuc2lnbmVkIGZyZXF1ZW5j
eUJpbkNvdW50KCkgY29uc3QgeyByZXR1cm4gbV9mZnRTaXplIC8gMjsgfQorCisgICAgdm9pZCBz
ZXRNaW5EZWNpYmVscyhmbG9hdCBrKSB7IG1fbWluRGVjaWJlbHMgPSBrOyB9CisgICAgZmxvYXQg
bWluRGVjaWJlbHMoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxmbG9hdD4obV9taW5EZWNp
YmVscyk7IH0KKworICAgIHZvaWQgc2V0TWF4RGVjaWJlbHMoZmxvYXQgaykgeyBtX21heERlY2li
ZWxzID0gazsgfQorICAgIGZsb2F0IG1heERlY2liZWxzKCkgY29uc3QgeyByZXR1cm4gc3RhdGlj
X2Nhc3Q8ZmxvYXQ+KG1fbWF4RGVjaWJlbHMpOyB9CisKKyAgICB2b2lkIHNldFNtb290aGluZ1Rp
bWVDb25zdGFudChmbG9hdCBrKSB7IG1fc21vb3RoaW5nVGltZUNvbnN0YW50ID0gazsgfQorICAg
IGZsb2F0IHNtb290aGluZ1RpbWVDb25zdGFudCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0
PGZsb2F0PihtX3Ntb290aGluZ1RpbWVDb25zdGFudCk7IH0KKworI2lmIEVOQUJMRSgzRF9DQU5W
QVMpCisgICAgdm9pZCBnZXRGbG9hdEZyZXF1ZW5jeURhdGEoRmxvYXQzMkFycmF5Kik7CisgICAg
dm9pZCBnZXRCeXRlRnJlcXVlbmN5RGF0YShVaW50OEFycmF5Kik7CisgICAgdm9pZCBnZXRCeXRl
VGltZURvbWFpbkRhdGEoVWludDhBcnJheSopOworI2VuZGlmCisKKyAgICAvLyBUaGUgYXVkaW8g
dGhyZWFkIHdyaXRlcyBpbnB1dCBkYXRhIGhlcmUuCisgICAgdm9pZCB3cml0ZUlucHV0KEF1ZGlv
QnVzKiwgc2l6ZV90IGZyYW1lc1RvUHJvY2Vzcyk7CisKKyAgICBzdGF0aWMgY29uc3QgZG91Ymxl
IERlZmF1bHRTbW9vdGhpbmdUaW1lQ29uc3RhbnQ7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBE
ZWZhdWx0TWluRGVjaWJlbHM7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBEZWZhdWx0TWF4RGVj
aWJlbHM7CisKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgRGVmYXVsdEZGVFNpemU7CisgICAg
c3RhdGljIGNvbnN0IHVuc2lnbmVkIE1heEZGVFNpemU7CisgICAgc3RhdGljIGNvbnN0IHVuc2ln
bmVkIElucHV0QnVmZmVyU2l6ZTsKKworcHJpdmF0ZToKKyAgICAvLyBUaGUgYXVkaW8gdGhyZWFk
IHdyaXRlcyB0aGUgaW5wdXQgYXVkaW8gaGVyZS4KKyAgICBBdWRpb0Zsb2F0QXJyYXkgbV9pbnB1
dEJ1ZmZlcjsKKyAgICB1bnNpZ25lZCBtX3dyaXRlSW5kZXg7CisgICAgCisgICAgc2l6ZV90IG1f
ZmZ0U2l6ZTsKKyAgICBPd25QdHI8RkZURnJhbWU+IG1fYW5hbHlzaXNGcmFtZTsKKyAgICB2b2lk
IGRvRkZUQW5hbHlzaXMoKTsKKyAgICAKKyAgICAvLyBkb0ZGVEFuYWx5c2lzKCkgc3RvcmVzIHRo
ZSBmbG9hdGluZy1wb2ludCBtYWduaXR1ZGUgYW5hbHlzaXMgZGF0YSBoZXJlLgorICAgIEF1ZGlv
RmxvYXRBcnJheSBtX21hZ25pdHVkZUJ1ZmZlcjsKKyAgICBBdWRpb0Zsb2F0QXJyYXkmIG1hZ25p
dHVkZUJ1ZmZlcigpIHsgcmV0dXJuIG1fbWFnbml0dWRlQnVmZmVyOyB9CisKKyAgICAvLyBBIHZh
bHVlIGJldHdlZW4gMCBhbmQgMSB3aGljaCBhdmVyYWdlcyB0aGUgcHJldmlvdXMgdmVyc2lvbiBv
ZiBtX21hZ25pdHVkZUJ1ZmZlciB3aXRoIHRoZSBjdXJyZW50IGFuYWx5c2lzIG1hZ25pdHVkZSBk
YXRhLgorICAgIGRvdWJsZSBtX3Ntb290aGluZ1RpbWVDb25zdGFudDsgICAgCisKKyAgICAvLyBU
aGUgcmFuZ2UgdXNlZCB3aGVuIGNvbnZlcnRpbmcgd2hlbiB1c2luZyBnZXRCeXRlRnJlcXVlbmN5
RGF0YSgpLiAKKyAgICBkb3VibGUgbV9taW5EZWNpYmVsczsKKyAgICBkb3VibGUgbV9tYXhEZWNp
YmVsczsKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFJlYWx0aW1l
QW5hbHlzZXJfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>72713</attachid>
            <date>2010-11-02 12:23:20 -0700</date>
            <delta_ts>2010-11-02 17:44:47 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-48810-20101102122319.patch</filename>
            <type>text/plain</type>
            <size>15959</size>
            <attacher name="Chris Rogers">crogers</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3MTE0NykKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzMgQEAKKzIwMTAtMTEtMDIgIENocmlzIFJvZ2VycyAgPGNyb2dlcnNAZ29vZ2xl
LmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBB
ZGQgUmVhbHRpbWVBbmFseXNlciBmaWxlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9NDg4MTAKKworICAgICAgICBObyBuZXcgdGVzdHMgc2luY2UgYXVk
aW8gQVBJIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCisKKyAgICAgICAgKiB3ZWJhdWRpby9SZWFs
dGltZUFuYWx5c2VyLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpSZWFsdGltZUFuYWx5
c2VyOjpSZWFsdGltZUFuYWx5c2VyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlYWx0aW1lQW5hbHlz
ZXI6On5SZWFsdGltZUFuYWx5c2VyKToKKyAgICAgICAgKFdlYkNvcmU6OlJlYWx0aW1lQW5hbHlz
ZXI6OnJlc2V0KToKKyAgICAgICAgKFdlYkNvcmU6OlJlYWx0aW1lQW5hbHlzZXI6OnNldEZmdFNp
emUpOgorICAgICAgICAoV2ViQ29yZTo6UmVhbHRpbWVBbmFseXNlcjo6d3JpdGVJbnB1dCk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZWFsdGltZUFuYWx5c2VyOjpkb0ZGVEFuYWx5c2lzKToKKyAgICAg
ICAgKFdlYkNvcmU6OlJlYWx0aW1lQW5hbHlzZXI6OmdldEZsb2F0RnJlcXVlbmN5RGF0YSk6Cisg
ICAgICAgIChXZWJDb3JlOjpSZWFsdGltZUFuYWx5c2VyOjpnZXRCeXRlRnJlcXVlbmN5RGF0YSk6
CisgICAgICAgIChXZWJDb3JlOjpSZWFsdGltZUFuYWx5c2VyOjpnZXRCeXRlVGltZURvbWFpbkRh
dGEpOgorICAgICAgICAqIHdlYmF1ZGlvL1JlYWx0aW1lQW5hbHlzZXIuaDogQWRkZWQuCisgICAg
ICAgIChXZWJDb3JlOjpSZWFsdGltZUFuYWx5c2VyOjpmZnRTaXplKToKKyAgICAgICAgKFdlYkNv
cmU6OlJlYWx0aW1lQW5hbHlzZXI6OmZyZXF1ZW5jeUJpbkNvdW50KToKKyAgICAgICAgKFdlYkNv
cmU6OlJlYWx0aW1lQW5hbHlzZXI6OnNldE1pbkRlY2liZWxzKToKKyAgICAgICAgKFdlYkNvcmU6
OlJlYWx0aW1lQW5hbHlzZXI6Om1pbkRlY2liZWxzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlYWx0
aW1lQW5hbHlzZXI6OnNldE1heERlY2liZWxzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlYWx0aW1l
QW5hbHlzZXI6Om1heERlY2liZWxzKToKKyAgICAgICAgKFdlYkNvcmU6OlJlYWx0aW1lQW5hbHlz
ZXI6OnNldFNtb290aGluZ1RpbWVDb25zdGFudCk6CisgICAgICAgIChXZWJDb3JlOjpSZWFsdGlt
ZUFuYWx5c2VyOjpzbW9vdGhpbmdUaW1lQ29uc3RhbnQpOgorICAgICAgICAoV2ViQ29yZTo6UmVh
bHRpbWVBbmFseXNlcjo6bWFnbml0dWRlQnVmZmVyKToKKwogMjAxMC0xMS0wMiAgQWRhbSBCYXJ0
aCAgPGFiYXJ0aEB3ZWJraXQub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEVyaWMgU2VpZGVs
LgpJbmRleDogV2ViQ29yZS93ZWJhdWRpby9SZWFsdGltZUFuYWx5c2VyLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3dlYmF1ZGlvL1JlYWx0aW1lQW5hbHlzZXIuY3BwCShyZXZpc2lvbiAwKQor
KysgV2ViQ29yZS93ZWJhdWRpby9SZWFsdGltZUFuYWx5c2VyLmNwcAkocmV2aXNpb24gMCkKQEAg
LTAsMCArMSwzMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAsIEdvb2dsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsK
KyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBF
TkFCTEUoV0VCX0FVRElPKQorCisjaW5jbHVkZSAiUmVhbHRpbWVBbmFseXNlci5oIgorCisjaW5j
bHVkZSAiQXVkaW9CdXMuaCIKKyNpbmNsdWRlICJBdWRpb1V0aWxpdGllcy5oIgorI2luY2x1ZGUg
IkZGVEZyYW1lLmgiCisKKyNpZiBFTkFCTEUoM0RfQ0FOVkFTKQorI2luY2x1ZGUgIkZsb2F0MzJB
cnJheS5oIgorI2luY2x1ZGUgIlVpbnQ4QXJyYXkuaCIKKyNlbmRpZgorCisjaW5jbHVkZSA8YWxn
b3JpdGhtPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHd0Zi9Db21wbGV4Lmg+Cisj
aW5jbHVkZSA8d3RmL1RocmVhZGluZy5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1l
c3BhY2UgV2ViQ29yZSB7CisKK2NvbnN0IGRvdWJsZSBSZWFsdGltZUFuYWx5c2VyOjpEZWZhdWx0
U21vb3RoaW5nVGltZUNvbnN0YW50ICA9IDAuODsKK2NvbnN0IGRvdWJsZSBSZWFsdGltZUFuYWx5
c2VyOjpEZWZhdWx0TWluRGVjaWJlbHMgPSAtMTAwLjA7Citjb25zdCBkb3VibGUgUmVhbHRpbWVB
bmFseXNlcjo6RGVmYXVsdE1heERlY2liZWxzID0gLTMwLjA7CisKK2NvbnN0IHVuc2lnbmVkIFJl
YWx0aW1lQW5hbHlzZXI6OkRlZmF1bHRGRlRTaXplID0gMjA0ODsKK2NvbnN0IHVuc2lnbmVkIFJl
YWx0aW1lQW5hbHlzZXI6Ok1heEZGVFNpemUgPSAyMDQ4OworY29uc3QgdW5zaWduZWQgUmVhbHRp
bWVBbmFseXNlcjo6SW5wdXRCdWZmZXJTaXplID0gUmVhbHRpbWVBbmFseXNlcjo6TWF4RkZUU2l6
ZSAqIDI7CisKK1JlYWx0aW1lQW5hbHlzZXI6OlJlYWx0aW1lQW5hbHlzZXIoKQorICAgIDogbV9p
bnB1dEJ1ZmZlcihJbnB1dEJ1ZmZlclNpemUpCisgICAgLCBtX3dyaXRlSW5kZXgoMCkKKyAgICAs
IG1fZmZ0U2l6ZShEZWZhdWx0RkZUU2l6ZSkKKyAgICAsIG1fbWFnbml0dWRlQnVmZmVyKERlZmF1
bHRGRlRTaXplIC8gMikKKyAgICAsIG1fc21vb3RoaW5nVGltZUNvbnN0YW50KERlZmF1bHRTbW9v
dGhpbmdUaW1lQ29uc3RhbnQpCisgICAgLCBtX21pbkRlY2liZWxzKERlZmF1bHRNaW5EZWNpYmVs
cykKKyAgICAsIG1fbWF4RGVjaWJlbHMoRGVmYXVsdE1heERlY2liZWxzKQoreworICAgIG1fYW5h
bHlzaXNGcmFtZSA9IGFkb3B0UHRyKG5ldyBGRlRGcmFtZShEZWZhdWx0RkZUU2l6ZSkpOworfQor
CitSZWFsdGltZUFuYWx5c2VyOjp+UmVhbHRpbWVBbmFseXNlcigpCit7Cit9CisKK3ZvaWQgUmVh
bHRpbWVBbmFseXNlcjo6cmVzZXQoKQoreworICAgIG1fd3JpdGVJbmRleCA9IDA7CisgICAgbV9p
bnB1dEJ1ZmZlci56ZXJvKCk7CisgICAgbV9tYWduaXR1ZGVCdWZmZXIuemVybygpOworfQorCit2
b2lkIFJlYWx0aW1lQW5hbHlzZXI6OnNldEZmdFNpemUoc2l6ZV90IHNpemUpCit7CisgICAgQVNT
RVJUKGlzTWFpblRocmVhZCgpKTsKKworICAgIC8vIE9ubHkgYWxsb3cgcG93ZXJzIG9mIHR3by4K
KyAgICB1bnNpZ25lZCBsb2cyc2l6ZSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihsb2cyKHNpemUp
KTsKKyAgICBib29sIGlzUE9UKDFVTCA8PCBsb2cyc2l6ZSA9PSBzaXplKTsKKyAgICAKKyAgICBp
ZiAoIWlzUE9UIHx8IHNpemUgPiBNYXhGRlRTaXplKSB7CisgICAgICAgIC8vIEZJWE1FOiBJdCB3
b3VsZCBiZSBnb29kIHRvIGFsc28gc2V0IGFuIGV4Y2VwdGlvbi4KKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKworICAgIGlmIChtX2ZmdFNpemUgIT0gc2l6ZSkgeworICAgICAgICBtX2FuYWx5c2lz
RnJhbWUgPSBhZG9wdFB0cihuZXcgRkZURnJhbWUobV9mZnRTaXplKSk7CisgICAgICAgIG1fbWFn
bml0dWRlQnVmZmVyLnJlc2l6ZShzaXplKTsKKyAgICAgICAgbV9mZnRTaXplID0gc2l6ZTsKKyAg
ICB9Cit9CisKK3ZvaWQgUmVhbHRpbWVBbmFseXNlcjo6d3JpdGVJbnB1dChBdWRpb0J1cyogYnVz
LCBzaXplX3QgZnJhbWVzVG9Qcm9jZXNzKQoreworICAgIGJvb2wgaXNCdXNHb29kID0gYnVzICYm
IGJ1cy0+bnVtYmVyT2ZDaGFubmVscygpID4gMCAmJiBidXMtPmNoYW5uZWwoMCktPmxlbmd0aCgp
ID49IGZyYW1lc1RvUHJvY2VzczsKKyAgICBBU1NFUlQoaXNCdXNHb29kKTsKKyAgICBpZiAoIWlz
QnVzR29vZCkKKyAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAvLyBGSVhNRSA6IGFsbG93
IHRvIHdvcmsgd2l0aCBub24tRkZUU2l6ZSBkaXZpc2libGUgY2h1bmtpbmcKKyAgICBib29sIGlz
RGVzdGluYXRpb25Hb29kID0gbV93cml0ZUluZGV4IDwgbV9pbnB1dEJ1ZmZlci5zaXplKCkgJiYg
bV93cml0ZUluZGV4ICsgZnJhbWVzVG9Qcm9jZXNzIDw9IG1faW5wdXRCdWZmZXIuc2l6ZSgpOwor
ICAgIEFTU0VSVChpc0Rlc3RpbmF0aW9uR29vZCk7CisgICAgaWYgKCFpc0Rlc3RpbmF0aW9uR29v
ZCkKKyAgICAgICAgcmV0dXJuOyAgICAKKyAgICAKKyAgICAvLyBQZXJmb3JtIHJlYWwtdGltZSBh
bmFseXNpcworICAgIC8vIEZJWE1FIDogZm9yIG5vdyBqdXN0IHVzZSBsZWZ0IGNoYW5uZWwgKG11
c3QgbWl4IGlmIHN0ZXJlbyBzb3VyY2UpCisgICAgZmxvYXQqIHNvdXJjZSA9IGJ1cy0+Y2hhbm5l
bCgwKS0+ZGF0YSgpOworCisgICAgLy8gVGhlIHNvdXJjZSBoYXMgYWxyZWFkeSBiZWVuIHNhbml0
eSBjaGVja2VkIHdpdGggaXNCdXNHb29kIGFib3ZlLgorICAgIAorICAgIG1lbWNweShtX2lucHV0
QnVmZmVyLmRhdGEoKSArIG1fd3JpdGVJbmRleCwgc291cmNlLCBzaXplb2YoZmxvYXQpICogZnJh
bWVzVG9Qcm9jZXNzKTsKKworICAgIG1fd3JpdGVJbmRleCArPSBmcmFtZXNUb1Byb2Nlc3M7Cisg
ICAgaWYgKG1fd3JpdGVJbmRleCA+PSBJbnB1dEJ1ZmZlclNpemUpCisgICAgICAgIG1fd3JpdGVJ
bmRleCA9IDA7Cit9CisKK25hbWVzcGFjZSB7CisKK3ZvaWQgYXBwbHlXaW5kb3coZmxvYXQqIHAs
IHNpemVfdCBuKQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7CisgICAgCisgICAgLy8g
QmxhY2ttYW4gd2luZG93CisgICAgZG91YmxlIGFscGhhID0gMC4xNjsKKyAgICBkb3VibGUgYTAg
PSAwLjUgKiAoMS4wIC0gYWxwaGEpOworICAgIGRvdWJsZSBhMSA9IDAuNTsKKyAgICBkb3VibGUg
YTIgPSAwLjUgKiBhbHBoYTsKKyAgICAKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbjsg
KytpKSB7CisgICAgICAgIGRvdWJsZSB4ID0gc3RhdGljX2Nhc3Q8ZG91YmxlPihpKSAvIHN0YXRp
Y19jYXN0PGRvdWJsZT4obik7CisgICAgICAgIGRvdWJsZSB3aW5kb3cgPSBhMCAtIGExICogY29z
KDIuMCAqIE1fUEkgKiB4KSArIGEyICogY29zKDQuMCAqIE1fUEkgKiB4KTsKKyAgICAgICAgcFtp
XSAqPSBmbG9hdCh3aW5kb3cpOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UKKwordm9pZCBS
ZWFsdGltZUFuYWx5c2VyOjpkb0ZGVEFuYWx5c2lzKCkKK3sgICAgCisgICAgQVNTRVJUKGlzTWFp
blRocmVhZCgpKTsKKworICAgIC8vIFVucm9sbCB0aGUgaW5wdXQgYnVmZmVyIGludG8gYSB0ZW1w
b3JhcnkgYnVmZmVyLCB3aGVyZSB3ZSdsbCBhcHBseSBhbiBhbmFseXNpcyB3aW5kb3cgZm9sbG93
ZWQgYnkgYW4gRkZULgorICAgIHNpemVfdCBmZnRTaXplID0gdGhpcy0+ZmZ0U2l6ZSgpOworICAg
IAorICAgIEF1ZGlvRmxvYXRBcnJheSB0ZW1wb3JhcnlCdWZmZXIoZmZ0U2l6ZSk7CisgICAgZmxv
YXQqIGlucHV0QnVmZmVyID0gbV9pbnB1dEJ1ZmZlci5kYXRhKCk7CisgICAgZmxvYXQqIHRlbXBQ
ID0gdGVtcG9yYXJ5QnVmZmVyLmRhdGEoKTsKKworICAgIC8vIFRha2UgdGhlIHByZXZpb3VzIGZm
dFNpemUgdmFsdWVzIGZyb20gdGhlIGlucHV0IGJ1ZmZlciBhbmQgY29weSBpbnRvIHRoZSB0ZW1w
b3JhcnkgYnVmZmVyLgorICAgIC8vIEZJWE1FIDogb3B0aW1pemUgd2l0aCBtZW1jcHkoKS4KKyAg
ICB1bnNpZ25lZCB3cml0ZUluZGV4ID0gbV93cml0ZUluZGV4OworICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBmZnRTaXplOyArK2kpCisgICAgICAgIHRlbXBQW2ldID0gaW5wdXRCdWZmZXJb
KGkgKyB3cml0ZUluZGV4IC0gZmZ0U2l6ZSArIElucHV0QnVmZmVyU2l6ZSkgJSBJbnB1dEJ1ZmZl
clNpemVdOworICAgIAorICAgIC8vIFdpbmRvdyB0aGUgaW5wdXQgc2FtcGxlcy4KKyAgICBhcHBs
eVdpbmRvdyh0ZW1wUCwgZmZ0U2l6ZSk7CisgICAgCisgICAgLy8gRG8gdGhlIGFuYWx5c2lzLgor
ICAgIG1fYW5hbHlzaXNGcmFtZS0+ZG9GRlQodGVtcFApOworCisgICAgc2l6ZV90IG4gPSBEZWZh
dWx0RkZUU2l6ZSAvIDI7CisKKyAgICBmbG9hdCogcmVhbFAgPSBtX2FuYWx5c2lzRnJhbWUtPnJl
YWxEYXRhKCk7CisgICAgZmxvYXQqIGltYWdQID0gbV9hbmFseXNpc0ZyYW1lLT5pbWFnRGF0YSgp
OworCisgICAgLy8gQmxvdyBhd2F5IHRoZSBwYWNrZWQgbnlxdWlzdCBjb21wb25lbnQuCisgICAg
aW1hZ1BbMF0gPSAwLjBmOworICAgIAorICAgIC8vIE5vcm1hbGl6ZSBzbyB0aGFuIGFuIGlucHV0
IHNpbmUgd2F2ZSBhdCAwZEJmcyByZWdpc3RlcnMgYXMgMGRCZnMgKHVuZG8gRkZUIHNjYWxpbmcg
ZmFjdG9yKS4KKyAgICBjb25zdCBkb3VibGUgTWFnbml0dWRlU2NhbGUgPSAxLjAgLyBEZWZhdWx0
RkZUU2l6ZTsKKworICAgIC8vIEEgdmFsdWUgb2YgMCBkb2VzIG5vIGF2ZXJhZ2luZyB3aXRoIHRo
ZSBwcmV2aW91cyByZXN1bHQuICBMYXJnZXIgdmFsdWVzIHByb2R1Y2Ugc2xvd2VyLCBidXQgc21v
b3RoZXIgY2hhbmdlcy4KKyAgICBkb3VibGUgayA9IG1fc21vb3RoaW5nVGltZUNvbnN0YW50Owor
ICAgIGsgPSBtYXgoMC4wLCBrKTsKKyAgICBrID0gbWluKDEuMCwgayk7ICAgIAorICAgIAorICAg
IC8vIENvbnZlcnQgdGhlIGFuYWx5c2lzIGRhdGEgZnJvbSBjb21wbGV4IHRvIG1hZ25pdHVkZSBh
bmQgYXZlcmFnZSB3aXRoIHRoZSBwcmV2aW91cyByZXN1bHQuCisgICAgZmxvYXQqIGRlc3RpbmF0
aW9uID0gbWFnbml0dWRlQnVmZmVyKCkuZGF0YSgpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7
IGkgPCBuOyArK2kpIHsKKyAgICAgICAgQ29tcGxleCBjKHJlYWxQW2ldLCBpbWFnUFtpXSk7Cisg
ICAgICAgIGRvdWJsZSBzY2FsYXJNYWduaXR1ZGUgPSBhYnMoYykgKiBNYWduaXR1ZGVTY2FsZTsg
ICAgICAgIAorICAgICAgICBkZXN0aW5hdGlvbltpXSA9IGZsb2F0KGsgKiBkZXN0aW5hdGlvbltp
XSArICgxLjAgLSBrKSAqIHNjYWxhck1hZ25pdHVkZSk7CisgICAgfQorfQorCisjaWYgRU5BQkxF
KDNEX0NBTlZBUykKKwordm9pZCBSZWFsdGltZUFuYWx5c2VyOjpnZXRGbG9hdEZyZXF1ZW5jeURh
dGEoRmxvYXQzMkFycmF5KiBkZXN0aW5hdGlvbkFycmF5KQoreworICAgIEFTU0VSVChpc01haW5U
aHJlYWQoKSk7CisKKyAgICBpZiAoIWRlc3RpbmF0aW9uQXJyYXkpCisgICAgICAgIHJldHVybjsK
KyAgICAgICAgCisgICAgZG9GRlRBbmFseXNpcygpOworICAgIAorICAgIC8vIENvbnZlcnQgZnJv
bSBsaW5lYXIgbWFnbml0dWRlIHRvIGZsb2F0aW5nLXBvaW50IGRlY2liZWxzLgorICAgIGNvbnN0
IGRvdWJsZSBNaW5EZWNpYmVscyA9IG1fbWluRGVjaWJlbHM7CisgICAgdW5zaWduZWQgc291cmNl
TGVuZ3RoID0gbWFnbml0dWRlQnVmZmVyKCkuc2l6ZSgpOworICAgIHNpemVfdCBsZW4gPSBtaW4o
c291cmNlTGVuZ3RoLCBkZXN0aW5hdGlvbkFycmF5LT5sZW5ndGgoKSk7CisgICAgaWYgKGxlbiA+
IDApIHsKKyAgICAgICAgY29uc3QgZmxvYXQqIHNvdXJjZSA9IG1hZ25pdHVkZUJ1ZmZlcigpLmRh
dGEoKTsKKyAgICAgICAgZmxvYXQqIGRlc3RpbmF0aW9uID0gZGVzdGluYXRpb25BcnJheS0+ZGF0
YSgpOworICAgICAgICAKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxlbjsgKytp
KSB7CisgICAgICAgICAgICBmbG9hdCBsaW5lYXJWYWx1ZSA9IHNvdXJjZVtpXTsKKyAgICAgICAg
ICAgIGRvdWJsZSBkYk1hZyA9ICFsaW5lYXJWYWx1ZSA/IE1pbkRlY2liZWxzIDogQXVkaW9VdGls
aXRpZXM6OmxpbmVhclRvRGVjaWJlbHMobGluZWFyVmFsdWUpOworICAgICAgICAgICAgZGVzdGlu
YXRpb25baV0gPSBmbG9hdChkYk1hZyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgUmVh
bHRpbWVBbmFseXNlcjo6Z2V0Qnl0ZUZyZXF1ZW5jeURhdGEoVWludDhBcnJheSogZGVzdGluYXRp
b25BcnJheSkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworCisgICAgaWYgKCFkZXN0
aW5hdGlvbkFycmF5KQorICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgIGRvRkZUQW5hbHlz
aXMoKTsKKyAgICAKKyAgICAvLyBDb252ZXJ0IGZyb20gbGluZWFyIG1hZ25pdHVkZSB0byB1bnNp
Z25lZC1ieXRlIGRlY2liZWxzLgorICAgIHVuc2lnbmVkIHNvdXJjZUxlbmd0aCA9IG1hZ25pdHVk
ZUJ1ZmZlcigpLnNpemUoKTsKKyAgICBzaXplX3QgbGVuID0gbWluKHNvdXJjZUxlbmd0aCwgZGVz
dGluYXRpb25BcnJheS0+bGVuZ3RoKCkpOworICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAgIGNv
bnN0IGRvdWJsZSBSYW5nZVNjYWxlRmFjdG9yID0gbV9tYXhEZWNpYmVscyA9PSBtX21pbkRlY2li
ZWxzID8gMS4wIDogMS4wIC8gKG1fbWF4RGVjaWJlbHMgLSBtX21pbkRlY2liZWxzKTsKKworICAg
ICAgICBjb25zdCBmbG9hdCogc291cmNlID0gbWFnbml0dWRlQnVmZmVyKCkuZGF0YSgpOworICAg
ICAgICB1bnNpZ25lZCBjaGFyKiBkZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uQXJyYXktPmRhdGEo
KTsgICAgICAgIAorICAgICAgICAKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGxl
bjsgKytpKSB7CisgICAgICAgICAgICBmbG9hdCBsaW5lYXJWYWx1ZSA9IHNvdXJjZVtpXTsKKyAg
ICAgICAgICAgIGRvdWJsZSBkYk1hZyA9ICFsaW5lYXJWYWx1ZSA/IG1fbWluRGVjaWJlbHMgOiBB
dWRpb1V0aWxpdGllczo6bGluZWFyVG9EZWNpYmVscyhsaW5lYXJWYWx1ZSk7CisgICAgICAgICAg
ICAKKyAgICAgICAgICAgIC8vIFRoZSByYW5nZSBtX21pbkRlY2liZWxzIHRvIG1fbWF4RGVjaWJl
bHMgd2lsbCBiZSBzY2FsZWQgdG8gYnl0ZSB2YWx1ZXMgZnJvbSAwIHRvIFVDSEFSX01BWC4KKyAg
ICAgICAgICAgIGRvdWJsZSBzY2FsZWRWYWx1ZSA9IFVDSEFSX01BWCAqIChkYk1hZyAtIG1fbWlu
RGVjaWJlbHMpICogUmFuZ2VTY2FsZUZhY3RvcjsKKworICAgICAgICAgICAgLy8gQ2xpcCB0byB2
YWxpZCByYW5nZS4KKyAgICAgICAgICAgIGlmIChzY2FsZWRWYWx1ZSA8IDAuMCkKKyAgICAgICAg
ICAgICAgICBzY2FsZWRWYWx1ZSA9IDAuMDsKKyAgICAgICAgICAgIGlmIChzY2FsZWRWYWx1ZSA+
IFVDSEFSX01BWCkKKyAgICAgICAgICAgICAgICBzY2FsZWRWYWx1ZSA9IFVDSEFSX01BWDsKKyAg
ICAgICAgICAgIAorICAgICAgICAgICAgZGVzdGluYXRpb25baV0gPSBzdGF0aWNfY2FzdDx1bnNp
Z25lZCBjaGFyPihzY2FsZWRWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgUmVh
bHRpbWVBbmFseXNlcjo6Z2V0Qnl0ZVRpbWVEb21haW5EYXRhKFVpbnQ4QXJyYXkqIGRlc3RpbmF0
aW9uQXJyYXkpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKworICAgIGlmICghZGVz
dGluYXRpb25BcnJheSkKKyAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICB1bnNpZ25lZCBm
ZnRTaXplID0gdGhpcy0+ZmZ0U2l6ZSgpOworICAgIHNpemVfdCBsZW4gPSBtaW4oZmZ0U2l6ZSwg
ZGVzdGluYXRpb25BcnJheS0+bGVuZ3RoKCkpOworICAgIGlmIChsZW4gPiAwKSB7CisgICAgICAg
IGJvb2wgaXNJbnB1dEJ1ZmZlckdvb2QgPSBtX2lucHV0QnVmZmVyLnNpemUoKSA9PSBJbnB1dEJ1
ZmZlclNpemUgJiYgbV9pbnB1dEJ1ZmZlci5zaXplKCkgPiBmZnRTaXplOworICAgICAgICBBU1NF
UlQoaXNJbnB1dEJ1ZmZlckdvb2QpOworICAgICAgICBpZiAoIWlzSW5wdXRCdWZmZXJHb29kKQor
ICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGZsb2F0KiBpbnB1dEJ1ZmZlciA9IG1faW5w
dXRCdWZmZXIuZGF0YSgpOyAgICAgICAgCisgICAgICAgIHVuc2lnbmVkIGNoYXIqIGRlc3RpbmF0
aW9uID0gZGVzdGluYXRpb25BcnJheS0+ZGF0YSgpOworICAgICAgICAKKyAgICAgICAgdW5zaWdu
ZWQgd3JpdGVJbmRleCA9IG1fd3JpdGVJbmRleDsKKworICAgICAgICBmb3IgKHVuc2lnbmVkIGkg
PSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgICAgIC8vIEJ1ZmZlciBhY2Nlc3MgaXMgcHJv
dGVjdGVkIGR1ZSB0byBtb2R1bG8gb3BlcmF0aW9uLgorICAgICAgICAgICAgZmxvYXQgdmFsdWUg
PSBpbnB1dEJ1ZmZlclsoaSArIHdyaXRlSW5kZXggLSBmZnRTaXplICsgSW5wdXRCdWZmZXJTaXpl
KSAlIElucHV0QnVmZmVyU2l6ZV07CisKKyAgICAgICAgICAgIC8vIFNjYWxlIGZyb20gbm9taW5h
bCAtMS4wIC0+ICsxLjAgdG8gdW5zaWduZWQgYnl0ZS4KKyAgICAgICAgICAgIGRvdWJsZSBzY2Fs
ZWRWYWx1ZSA9IDEyOC4wICogKHZhbHVlICsgMS4wKTsKKworICAgICAgICAgICAgLy8gQ2xpcCB0
byB2YWxpZCByYW5nZS4KKyAgICAgICAgICAgIGlmIChzY2FsZWRWYWx1ZSA8IDAuMCkKKyAgICAg
ICAgICAgICAgICBzY2FsZWRWYWx1ZSA9IDAuMDsKKyAgICAgICAgICAgIGlmIChzY2FsZWRWYWx1
ZSA+IFVDSEFSX01BWCkKKyAgICAgICAgICAgICAgICBzY2FsZWRWYWx1ZSA9IFVDSEFSX01BWDsK
KyAgICAgICAgICAgIAorICAgICAgICAgICAgZGVzdGluYXRpb25baV0gPSBzdGF0aWNfY2FzdDx1
bnNpZ25lZCBjaGFyPihzY2FsZWRWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNlbmRp
ZiAvLyAzRF9DQU5WQVMKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gRU5B
QkxFKFdFQl9BVURJTykKSW5kZXg6IFdlYkNvcmUvd2ViYXVkaW8vUmVhbHRpbWVBbmFseXNlci5o
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvd2ViYXVkaW8vUmVhbHRpbWVBbmFseXNlci5oCShyZXZp
c2lvbiAwKQorKysgV2ViQ29yZS93ZWJhdWRpby9SZWFsdGltZUFuYWx5c2VyLmgJKHJldmlzaW9u
IDApCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBSZWFsdGltZUFuYWx5
c2VyX2gKKyNkZWZpbmUgUmVhbHRpbWVBbmFseXNlcl9oCisKKyNpbmNsdWRlICJBdWRpb0FycmF5
LmgiCisjaW5jbHVkZSA8d3RmL05vbkNvcHlhYmxlLmg+CisjaW5jbHVkZSA8d3RmL093blB0ci5o
PgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIEF1ZGlvQnVzOworY2xhc3MgRkZURnJh
bWU7CisKKyNpZiBFTkFCTEUoM0RfQ0FOVkFTKQorY2xhc3MgRmxvYXQzMkFycmF5OworY2xhc3Mg
VWludDhBcnJheTsKKyNlbmRpZgorCitjbGFzcyBSZWFsdGltZUFuYWx5c2VyIDogcHVibGljIE5v
bmNvcHlhYmxlIHsKK3B1YmxpYzoKKyAgICBSZWFsdGltZUFuYWx5c2VyKCk7CisgICAgdmlydHVh
bCB+UmVhbHRpbWVBbmFseXNlcigpOworICAgIAorICAgIHZvaWQgcmVzZXQoKTsKKworICAgIHNp
emVfdCBmZnRTaXplKCkgY29uc3QgeyByZXR1cm4gbV9mZnRTaXplOyB9CisgICAgdm9pZCBzZXRG
ZnRTaXplKHNpemVfdCBzaXplKTsKKworICAgIHVuc2lnbmVkIGZyZXF1ZW5jeUJpbkNvdW50KCkg
Y29uc3QgeyByZXR1cm4gbV9mZnRTaXplIC8gMjsgfQorCisgICAgdm9pZCBzZXRNaW5EZWNpYmVs
cyhmbG9hdCBrKSB7IG1fbWluRGVjaWJlbHMgPSBrOyB9CisgICAgZmxvYXQgbWluRGVjaWJlbHMo
KSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxmbG9hdD4obV9taW5EZWNpYmVscyk7IH0KKwor
ICAgIHZvaWQgc2V0TWF4RGVjaWJlbHMoZmxvYXQgaykgeyBtX21heERlY2liZWxzID0gazsgfQor
ICAgIGZsb2F0IG1heERlY2liZWxzKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+
KG1fbWF4RGVjaWJlbHMpOyB9CisKKyAgICB2b2lkIHNldFNtb290aGluZ1RpbWVDb25zdGFudChm
bG9hdCBrKSB7IG1fc21vb3RoaW5nVGltZUNvbnN0YW50ID0gazsgfQorICAgIGZsb2F0IHNtb290
aGluZ1RpbWVDb25zdGFudCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0PihtX3Nt
b290aGluZ1RpbWVDb25zdGFudCk7IH0KKworI2lmIEVOQUJMRSgzRF9DQU5WQVMpCisgICAgdm9p
ZCBnZXRGbG9hdEZyZXF1ZW5jeURhdGEoRmxvYXQzMkFycmF5Kik7CisgICAgdm9pZCBnZXRCeXRl
RnJlcXVlbmN5RGF0YShVaW50OEFycmF5Kik7CisgICAgdm9pZCBnZXRCeXRlVGltZURvbWFpbkRh
dGEoVWludDhBcnJheSopOworI2VuZGlmCisKKyAgICAvLyBUaGUgYXVkaW8gdGhyZWFkIHdyaXRl
cyBpbnB1dCBkYXRhIGhlcmUuCisgICAgdm9pZCB3cml0ZUlucHV0KEF1ZGlvQnVzKiwgc2l6ZV90
IGZyYW1lc1RvUHJvY2Vzcyk7CisKKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIERlZmF1bHRTbW9v
dGhpbmdUaW1lQ29uc3RhbnQ7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBEZWZhdWx0TWluRGVj
aWJlbHM7CisgICAgc3RhdGljIGNvbnN0IGRvdWJsZSBEZWZhdWx0TWF4RGVjaWJlbHM7CisKKyAg
ICBzdGF0aWMgY29uc3QgdW5zaWduZWQgRGVmYXVsdEZGVFNpemU7CisgICAgc3RhdGljIGNvbnN0
IHVuc2lnbmVkIE1heEZGVFNpemU7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIElucHV0QnVm
ZmVyU2l6ZTsKKworcHJpdmF0ZToKKyAgICAvLyBUaGUgYXVkaW8gdGhyZWFkIHdyaXRlcyB0aGUg
aW5wdXQgYXVkaW8gaGVyZS4KKyAgICBBdWRpb0Zsb2F0QXJyYXkgbV9pbnB1dEJ1ZmZlcjsKKyAg
ICB1bnNpZ25lZCBtX3dyaXRlSW5kZXg7CisgICAgCisgICAgc2l6ZV90IG1fZmZ0U2l6ZTsKKyAg
ICBPd25QdHI8RkZURnJhbWU+IG1fYW5hbHlzaXNGcmFtZTsKKyAgICB2b2lkIGRvRkZUQW5hbHlz
aXMoKTsKKyAgICAKKyAgICAvLyBkb0ZGVEFuYWx5c2lzKCkgc3RvcmVzIHRoZSBmbG9hdGluZy1w
b2ludCBtYWduaXR1ZGUgYW5hbHlzaXMgZGF0YSBoZXJlLgorICAgIEF1ZGlvRmxvYXRBcnJheSBt
X21hZ25pdHVkZUJ1ZmZlcjsKKyAgICBBdWRpb0Zsb2F0QXJyYXkmIG1hZ25pdHVkZUJ1ZmZlcigp
IHsgcmV0dXJuIG1fbWFnbml0dWRlQnVmZmVyOyB9CisKKyAgICAvLyBBIHZhbHVlIGJldHdlZW4g
MCBhbmQgMSB3aGljaCBhdmVyYWdlcyB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZiBtX21hZ25pdHVk
ZUJ1ZmZlciB3aXRoIHRoZSBjdXJyZW50IGFuYWx5c2lzIG1hZ25pdHVkZSBkYXRhLgorICAgIGRv
dWJsZSBtX3Ntb290aGluZ1RpbWVDb25zdGFudDsgICAgCisKKyAgICAvLyBUaGUgcmFuZ2UgdXNl
ZCB3aGVuIGNvbnZlcnRpbmcgd2hlbiB1c2luZyBnZXRCeXRlRnJlcXVlbmN5RGF0YSgpLiAKKyAg
ICBkb3VibGUgbV9taW5EZWNpYmVsczsKKyAgICBkb3VibGUgbV9tYXhEZWNpYmVsczsKK307CisK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFJlYWx0aW1lQW5hbHlzZXJfaAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>