<?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>112957</bug_id>
          
          <creation_ts>2013-03-21 13:19:43 -0700</creation_ts>
          <short_desc>JSC: op_debug bytecode charPosition to column computation is O(n^2)</short_desc>
          <delta_ts>2013-03-21 19:00:35 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Mark Lam">mark.lam</reporter>
          <assigned_to name="Mark Lam">mark.lam</assigned_to>
          <cc>benjamin</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>fpizlo</cc>
    
    <cc>ggaren</cc>
    
    <cc>joepeck</cc>
    
    <cc>mhahnenberg</cc>
    
    <cc>msaboff</cc>
    
    <cc>ojan.autocc</cc>
    
    <cc>oliver</cc>
    
    <cc>timothy</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>860613</commentid>
    <comment_count>0</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2013-03-21 13:19:43 -0700</bug_when>
    <thetext>With a minified script all on a single line, the computation of debug hook column numbers will be an O(n^2) operation.  We’re going to fix this by computing a line start column table (on demand) for the SourceProvider, and using that to fix up op_debug bytecode column numbers whenever we link an UnlinkedCodeBlock into a CodeBlock.  The computation of the SourceProvider line start column table should be an O(n) operation, and the op_debug column number fixup in the CodeBlock constructor should be an O(log(n)) operation. 

Thereafter, the op_debug column number can be fetched directly from the opcode operand and is ready for use with no further computation.
 
ref: &lt;rdar://problem/13466251&gt;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>860950</commentid>
    <comment_count>1</comment_count>
      <attachid>194405</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2013-03-21 17:57:13 -0700</bug_when>
    <thetext>Created attachment 194405
the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>860965</commentid>
    <comment_count>2</comment_count>
      <attachid>194405</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2013-03-21 18:22:15 -0700</bug_when>
    <thetext>Comment on attachment 194405
the patch

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

&gt; Source/JavaScriptCore/parser/SourceProvider.cpp:53
&gt; +        m_lineStarts = adoptPtr(new Vector&lt;size_t&gt;());

This code should be a separate accessor function named lineStarts().

&gt; Source/JavaScriptCore/parser/SourceProvider.cpp:57
&gt; +            m_lineStarts-&gt;append(static_cast&lt;int&gt;(index));

Why cast to int here, when appending to a size_t vector?

&gt; Source/JavaScriptCore/parser/SourceProvider.cpp:71
&gt; +    if (lineStartPosition &gt; charPosition)

The if should use brackets.

&gt; Source/WTF/wtf/text/StringImpl.h:1113
&gt; +inline size_t findNextLineStart(const CharacterType* characters, unsigned length, unsigned index = 0)

Since this is a complement to reverseFindLineTerminator, let&apos;s call it &quot;findLineTerminator&quot; or &quot;forwardFindLineTerminator&quot;.

&gt; Source/WTF/wtf/text/StringImpl.h:1137
&gt; +        // There can only be a start of a new line if there are more characters
&gt; +        // beyond the current character.
&gt; +        if (index &lt; length) {
&gt; +            // The 3 common types of line terminators are 1. \r\n (Windows), 
&gt; +            // 2. \r (old MacOS) and 3. \n (Unix&apos;es).
&gt; +
&gt; +            if (c == &apos;\n&apos;)
&gt; +                return index; // Case 3: just \n.
&gt; +
&gt; +            CharacterType c2 = characters[index];
&gt; +            if (c2 != &apos;\n&apos;)
&gt; +                return index; // Case 2: just \r.
&gt; +
&gt; +            // Case 1: \r\n.
&gt; +            // But, there&apos;s only a start of a new line if there are more
&gt; +            // characters beyond the \r\n.
&gt; +            if (++index &lt; length)
&gt; +                return index; 

Why is the logic here for what is a newline different from the logic when searching backwards?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>860972</commentid>
    <comment_count>3</comment_count>
      <attachid>194405</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2013-03-21 18:31:39 -0700</bug_when>
    <thetext>Comment on attachment 194405
the patch

I see -- this function returns the character after the line terminator. I think &quot;lineStart&quot; is a fine name for that, and now I see why it needs different logic.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>860992</commentid>
    <comment_count>4</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2013-03-21 19:00:35 -0700</bug_when>
    <thetext>Thanks for the review.  Updated and landed in r146552: &lt;http://trac.webkit.org/changeset/146552&gt;.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>194405</attachid>
            <date>2013-03-21 17:57:13 -0700</date>
            <delta_ts>2013-03-21 18:31:39 -0700</delta_ts>
            <desc>the patch</desc>
            <filename>bug-112957.patch</filename>
            <type>text/plain</type>
            <size>14589</size>
            <attacher name="Mark Lam">mark.lam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTQ2NTM2KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM4IEBA
CisyMDEzLTAzLTIxICBNYXJrIExhbSAgPG1hcmsubGFtQGFwcGxlLmNvbT4KKworICAgICAgICBG
aXggTyhuXjIpIG9wX2RlYnVnIGJ5dGVjb2RlIGNoYXJQb3NpdGlvbiB0byBjb2x1bW4gY29tcHV0
YXRpb24uCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0x
MTI5NTcuCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
VGhlIHByZXZpb3VzIGFsZ29yaXRobSBkb2VzIGEgbGluZWFyIHJldmVyc2Ugc2NhbiBvZiB0aGUg
c291cmNlIHN0cmluZworICAgICAgICB0byBmaW5kIHRoZSBsaW5lIHN0YXJ0IGZvciBhbnkgZ2l2
ZW4gY2hhciBwb3NpdGlvbi4gVGhpcyByZXN1bHRzIGluIGEKKyAgICAgICAgTyhuXjIpIGFsZ29y
dGl0aG0gd2hlbiB0aGUgc291cmNlIHN0cmluZyBoYXMgbm8gbGluZSBicmVha3MuCisKKyAgICAg
ICAgVGhlIG5ldyBhbGdvcml0aG0gY29tcHV0ZXMgYSBsaW5lIHN0YXJ0IGNvbHVtbiB0YWJsZSBm
b3IgYQorICAgICAgICBTb3VyY2VQcm92aWRlciBvbiBmaXJzdCB1c2UuIFRoaXMgbGluZSBzdGFy
dCB0YWJsZSBpcyB1c2VkIHRvIGZpeCB1cAorICAgICAgICBvcF9kZWJ1ZydzIGNoYXJQb3NpdGlv
biBvcGVyYW5kIGludG8gYSBjb2x1bW4gb3BlcmFuZCB3aGVuIGFuCisgICAgICAgIFVubGlua2Vk
Q29kZUJsb2NrIGlzIGxpbmtlZCBpbnRvIGEgQ29kZUJsb2NrLiBUaGUgaW5pdGlhbGl6YXRpb24g
b2YKKyAgICAgICAgdGhlIGxpbmUgc3RhcnQgdGFibGUgaXMgTyhuKSwgYW5kIHRoZSBDb2RlQmxv
Y2sgY29sdW1uIGZpeCB1cCBpcworICAgICAgICBPKGxvZyhuKSkuCisKKyAgICAgICAgKiBieXRl
Y29kZS9Db2RlQmxvY2suY3BwOgorICAgICAgICAoSlNDOjpDb2RlQmxvY2s6OmR1bXBCeXRlY29k
ZSk6IAorICAgICAgICAoSlNDOjpDb2RlQmxvY2s6OkNvZGVCbG9jayk6IC0gZG8gY29sdW1uIGZp
eCB1cC4KKyAgICAgICAgKiBpbnRlcnByZXRlci9JbnRlcnByZXRlci5jcHA6CisgICAgICAgIChK
U0M6OkludGVycHJldGVyOjpkZWJ1Zyk6IC0gbm8gbmVlZCB0byBkbyBjb2x1bW4gZml4dXAgYW55
bW9yZS4KKyAgICAgICAgKiBpbnRlcnByZXRlci9JbnRlcnByZXRlci5oOgorICAgICAgICAqIGpp
dC9KSVRTdHVicy5jcHA6CisgICAgICAgIChKU0M6OkRFRklORV9TVFVCX0ZVTkNUSU9OKToKKyAg
ICAgICAgKiBsbGludC9MTEludFNsb3dQYXRocy5jcHA6CisgICAgICAgIChKU0M6OkxMSW50OjpM
TElOVF9TTE9XX1BBVEhfREVDTCk6CisgICAgICAgICogcGFyc2VyL1NvdXJjZVByb3ZpZGVyLmNw
cDoKKyAgICAgICAgKEpTQzo6Y2hhclBvc2l0aW9uRXh0cmFjdG9yKToKKyAgICAgICAgKEpTQzo6
U291cmNlUHJvdmlkZXI6OmNoYXJQb3NpdGlvblRvQ29sdW1uTnVtYmVyKToKKyAgICAgICAgLSBp
bml0aWFsaXplIGxpbmUgc3RhcnQgY29sdW1uIHRhYmxlIGlmIG5lZWRlZC4KKyAgICAgICAgLSBs
b29rIHVwIGxpbmUgc3RhcnQgZm9yIHRoZSBnaXZlbiBjaGFyIHBvc2l0aW9uLgorICAgICAgICAq
IHBhcnNlci9Tb3VyY2VQcm92aWRlci5oOgorCiAyMDEzLTAzLTIxICBNYXJrIExhbSAgPG1hcmsu
bGFtQGFwcGxlLmNvbT4KIAogICAgICAgICBGaXggbGV4ZXIgY2hhclBvc2l0aW9uIGNvbXB1dGF0
aW9uIHdoZW4gInJld2luZCJpbmcgdGhlIGxleGVyLgpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2J5dGVjb2RlL0NvZGVCbG9jay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2J5dGVjb2RlL0NvZGVCbG9jay5jcHAJKHJldmlzaW9uIDE0NjM1OCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9Db2RlQmxvY2suY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0xNDczLDggKzE0NzMsOCBAQCB2b2lkIENvZGVCbG9jazo6ZHVtcEJ5dGVjb2RlKFByaW50U3Ry
ZWFtCiAgICAgICAgICAgICBpbnQgZGVidWdIb29rSUQgPSAoKytpdCktPnUub3BlcmFuZDsKICAg
ICAgICAgICAgIGludCBmaXJzdExpbmUgPSAoKytpdCktPnUub3BlcmFuZDsKICAgICAgICAgICAg
IGludCBsYXN0TGluZSA9ICgrK2l0KS0+dS5vcGVyYW5kOwotICAgICAgICAgICAgaW50IGNoYXJQ
b3NpdGlvbiA9ICgrK2l0KS0+dS5vcGVyYW5kOwotICAgICAgICAgICAgb3V0LnByaW50ZigiWyU0
ZF0gZGVidWdcdFx0ICVzLCAlZCwgJWQsICVkIiwgbG9jYXRpb24sIGRlYnVnSG9va05hbWUoZGVi
dWdIb29rSUQpLCBmaXJzdExpbmUsIGxhc3RMaW5lLCBjaGFyUG9zaXRpb24pOworICAgICAgICAg
ICAgaW50IGNvbHVtbiA9ICgrK2l0KS0+dS5vcGVyYW5kOworICAgICAgICAgICAgb3V0LnByaW50
ZigiWyU0ZF0gZGVidWdcdFx0ICVzLCAlZCwgJWQsICVkIiwgbG9jYXRpb24sIGRlYnVnSG9va05h
bWUoZGVidWdIb29rSUQpLCBmaXJzdExpbmUsIGxhc3RMaW5lLCBjb2x1bW4pOwogICAgICAgICAg
ICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBvcF9wcm9maWxlX3dpbGxfY2FsbDog
ewpAQCAtMjAwMyw2ICsyMDAzLDE1IEBAIENvZGVCbG9jazo6Q29kZUJsb2NrKFNjcmlwdEV4ZWN1
dGFibGUqIG8KICAgICAgICAgICAgIGluc3RydWN0aW9uc1tpICsgMV0gPSAmZ2xvYmFsT2JqZWN0
LT5yZWdpc3RlckF0KGVudHJ5LmdldEluZGV4KCkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAg
ICAgIH0KKworICAgICAgICBjYXNlIG9wX2RlYnVnOiB7CisgICAgICAgICAgICBzaXplX3QgY2hh
clBvc2l0aW9uID0gcGNbaSArIDRdLnUub3BlcmFuZDsKKyAgICAgICAgICAgIHNpemVfdCBhY3R1
YWxDaGFyUG9zaXRpb24gPSBjaGFyUG9zaXRpb24gKyBtX3NvdXJjZU9mZnNldDsKKyAgICAgICAg
ICAgIHNpemVfdCBjb2x1bW4gPSBtX3NvdXJjZS0+Y2hhclBvc2l0aW9uVG9Db2x1bW5OdW1iZXIo
YWN0dWFsQ2hhclBvc2l0aW9uKTsKKyAgICAgICAgICAgIGluc3RydWN0aW9uc1tpICsgNF0gPSBj
b2x1bW47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6
CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2ludGVycHJldGVyL0ludGVycHJldGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvaW50ZXJwcmV0ZXIvSW50ZXJwcmV0ZXIuY3BwCShyZXZpc2lvbiAxNDYzNTgp
CisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaW50ZXJwcmV0ZXIvSW50ZXJwcmV0ZXIuY3BwCSh3
b3JraW5nIGNvcHkpCkBAIC0xMzMzLDI0ICsxMzMzLDEyIEBAIEpTVmFsdWUgSW50ZXJwcmV0ZXI6
OmV4ZWN1dGUoRXZhbEV4ZWN1dGEKICAgICByZXR1cm4gY2hlY2tlZFJldHVybihyZXN1bHQpOwog
fQogCi1ORVZFUl9JTkxJTkUgdm9pZCBJbnRlcnByZXRlcjo6ZGVidWcoQ2FsbEZyYW1lKiBjYWxs
RnJhbWUsIERlYnVnSG9va0lEIGRlYnVnSG9va0lELCBpbnQgZmlyc3RMaW5lLCBpbnQgbGFzdExp
bmUsIGludCBjaGFyUG9zaXRpb24pCitORVZFUl9JTkxJTkUgdm9pZCBJbnRlcnByZXRlcjo6ZGVi
dWcoQ2FsbEZyYW1lKiBjYWxsRnJhbWUsIERlYnVnSG9va0lEIGRlYnVnSG9va0lELCBpbnQgZmly
c3RMaW5lLCBpbnQgbGFzdExpbmUsIGludCBjb2x1bW4pCiB7CiAgICAgRGVidWdnZXIqIGRlYnVn
Z2VyID0gY2FsbEZyYW1lLT5keW5hbWljR2xvYmFsT2JqZWN0KCktPmRlYnVnZ2VyKCk7CiAgICAg
aWYgKCFkZWJ1Z2dlcikKICAgICAgICAgcmV0dXJuOwogCi0gICAgQ29kZUJsb2NrKiBjb2RlQmxv
Y2sgPSBjYWxsRnJhbWUtPmNvZGVCbG9jaygpOwotICAgIHNpemVfdCBhY3R1YWxDaGFyUG9zaXRp
b24gPSBjaGFyUG9zaXRpb24gKyBjb2RlQmxvY2stPnNvdXJjZU9mZnNldCgpOwotCi0gICAgU291
cmNlUHJvdmlkZXIqIHByb3ZpZGVyID0gY29kZUJsb2NrLT5zb3VyY2UoKTsKLSAgICBTdHJpbmcg
c291cmNlID0gcHJvdmlkZXItPnNvdXJjZSgpOwotICAgIHNpemVfdCBsaW5lVGVybWluYXRvclBv
c2l0aW9uID0gc291cmNlLnJldmVyc2VGaW5kTGluZVRlcm1pbmF0b3IoYWN0dWFsQ2hhclBvc2l0
aW9uKTsKLSAgICBpbnQgY29sdW1uOwotICAgIGlmIChsaW5lVGVybWluYXRvclBvc2l0aW9uICE9
IG5vdEZvdW5kKQotICAgICAgICBjb2x1bW4gPSBhY3R1YWxDaGFyUG9zaXRpb24gLSAobGluZVRl
cm1pbmF0b3JQb3NpdGlvbiArIDEpOwotICAgIGVsc2UKLSAgICAgICAgY29sdW1uID0gYWN0dWFs
Q2hhclBvc2l0aW9uOwotCiAgICAgc3dpdGNoIChkZWJ1Z0hvb2tJRCkgewogICAgICAgICBjYXNl
IERpZEVudGVyQ2FsbEZyYW1lOgogICAgICAgICAgICAgZGVidWdnZXItPmNhbGxFdmVudChjYWxs
RnJhbWUsIGNhbGxGcmFtZS0+Y29kZUJsb2NrKCktPm93bmVyRXhlY3V0YWJsZSgpLT5zb3VyY2VJ
RCgpLCBmaXJzdExpbmUsIGNvbHVtbik7CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvaW50
ZXJwcmV0ZXIvSW50ZXJwcmV0ZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvaW50ZXJwcmV0ZXIvSW50ZXJwcmV0ZXIuaAkocmV2aXNpb24gMTQ2MzU4KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL2ludGVycHJldGVyL0ludGVycHJldGVyLmgJKHdvcmtpbmcgY29weSkK
QEAgLTIzMCw3ICsyMzAsNyBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgU2FtcGxpbmdUb29s
KiBzYW1wbGVyKCkgeyByZXR1cm4gbV9zYW1wbGVyLmdldCgpOyB9CiAKICAgICAgICAgTkVWRVJf
SU5MSU5FIEhhbmRsZXJJbmZvKiB0aHJvd0V4Y2VwdGlvbihDYWxsRnJhbWUqJiwgSlNWYWx1ZSYs
IHVuc2lnbmVkIGJ5dGVjb2RlT2Zmc2V0KTsKLSAgICAgICAgTkVWRVJfSU5MSU5FIHZvaWQgZGVi
dWcoQ2FsbEZyYW1lKiwgRGVidWdIb29rSUQsIGludCBmaXJzdExpbmUsIGludCBsYXN0TGluZSwg
aW50IGNoYXJQb3NpdGlvbik7CisgICAgICAgIE5FVkVSX0lOTElORSB2b2lkIGRlYnVnKENhbGxG
cmFtZSosIERlYnVnSG9va0lELCBpbnQgZmlyc3RMaW5lLCBpbnQgbGFzdExpbmUsIGludCBjb2x1
bW4pOwogICAgICAgICBzdGF0aWMgY29uc3QgU3RyaW5nIGdldFRyYWNlTGluZShDYWxsRnJhbWUq
LCBTdGFja0ZyYW1lQ29kZVR5cGUsIGNvbnN0IFN0cmluZyYsIGludCk7CiAgICAgICAgIEpTX0VY
UE9SVF9QUklWQVRFIHN0YXRpYyB2b2lkIGdldFN0YWNrVHJhY2UoSlNHbG9iYWxEYXRhKiwgVmVj
dG9yPFN0YWNrRnJhbWU+JiByZXN1bHRzKTsKICAgICAgICAgc3RhdGljIHZvaWQgYWRkU3RhY2tU
cmFjZUlmTmVjZXNzYXJ5KENhbGxGcmFtZSosIEpTT2JqZWN0KiBlcnJvcik7CkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvaml0L0pJVFN0dWJzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvaml0L0pJVFN0dWJzLmNwcAkocmV2aXNpb24gMTQ2MzU4KQorKysgU291
cmNlL0phdmFTY3JpcHRDb3JlL2ppdC9KSVRTdHVicy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM0
NjgsOSArMzQ2OCw5IEBAIERFRklORV9TVFVCX0ZVTkNUSU9OKHZvaWQsIG9wX2RlYnVnKQogICAg
IGludCBkZWJ1Z0hvb2tJRCA9IHN0YWNrRnJhbWUuYXJnc1swXS5pbnQzMigpOwogICAgIGludCBm
aXJzdExpbmUgPSBzdGFja0ZyYW1lLmFyZ3NbMV0uaW50MzIoKTsKICAgICBpbnQgbGFzdExpbmUg
PSBzdGFja0ZyYW1lLmFyZ3NbMl0uaW50MzIoKTsKLSAgICBpbnQgY2hhclBvc2l0aW9uID0gc3Rh
Y2tGcmFtZS5hcmdzWzNdLmludDMyKCk7CisgICAgaW50IGNvbHVtbiA9IHN0YWNrRnJhbWUuYXJn
c1szXS5pbnQzMigpOwogCi0gICAgc3RhY2tGcmFtZS5nbG9iYWxEYXRhLT5pbnRlcnByZXRlci0+
ZGVidWcoY2FsbEZyYW1lLCBzdGF0aWNfY2FzdDxEZWJ1Z0hvb2tJRD4oZGVidWdIb29rSUQpLCBm
aXJzdExpbmUsIGxhc3RMaW5lLCBjaGFyUG9zaXRpb24pOworICAgIHN0YWNrRnJhbWUuZ2xvYmFs
RGF0YS0+aW50ZXJwcmV0ZXItPmRlYnVnKGNhbGxGcmFtZSwgc3RhdGljX2Nhc3Q8RGVidWdIb29r
SUQ+KGRlYnVnSG9va0lEKSwgZmlyc3RMaW5lLCBsYXN0TGluZSwgY29sdW1uKTsKIH0KIAogREVG
SU5FX1NUVUJfRlVOQ1RJT04odm9pZCosIHZtX3Rocm93KQpJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2xsaW50L0xMSW50U2xvd1BhdGhzLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2
YVNjcmlwdENvcmUvbGxpbnQvTExJbnRTbG93UGF0aHMuY3BwCShyZXZpc2lvbiAxNDYzNTgpCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvbGxpbnQvTExJbnRTbG93UGF0aHMuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0xNjM3LDkgKzE2MzcsOSBAQCBMTElOVF9TTE9XX1BBVEhfREVDTChzbG93X3Bh
dGhfZGVidWcpCiAgICAgaW50IGRlYnVnSG9va0lEID0gcGNbMV0udS5vcGVyYW5kOwogICAgIGlu
dCBmaXJzdExpbmUgPSBwY1syXS51Lm9wZXJhbmQ7CiAgICAgaW50IGxhc3RMaW5lID0gcGNbM10u
dS5vcGVyYW5kOwotICAgIGludCBjaGFyUG9zaXRpb24gPSBwY1s0XS51Lm9wZXJhbmQ7CisgICAg
aW50IGNvbHVtbiA9IHBjWzRdLnUub3BlcmFuZDsKIAotICAgIGdsb2JhbERhdGEuaW50ZXJwcmV0
ZXItPmRlYnVnKGV4ZWMsIHN0YXRpY19jYXN0PERlYnVnSG9va0lEPihkZWJ1Z0hvb2tJRCksIGZp
cnN0TGluZSwgbGFzdExpbmUsIGNoYXJQb3NpdGlvbik7CisgICAgZ2xvYmFsRGF0YS5pbnRlcnBy
ZXRlci0+ZGVidWcoZXhlYywgc3RhdGljX2Nhc3Q8RGVidWdIb29rSUQ+KGRlYnVnSG9va0lEKSwg
Zmlyc3RMaW5lLCBsYXN0TGluZSwgY29sdW1uKTsKICAgICAKICAgICBMTElOVF9FTkQoKTsKIH0K
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9wYXJzZXIvU291cmNlUHJvdmlkZXIuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9wYXJzZXIvU291cmNlUHJvdmlkZXIu
Y3BwCShyZXZpc2lvbiAxNDYzNTgpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcGFyc2VyL1Nv
dXJjZVByb3ZpZGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjUsNiArMjUsNyBAQAogCiAjaW5j
bHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiU291cmNlUHJvdmlkZXIuaCIKKyNpbmNsdWRlIDx3
dGYvU3RkTGliRXh0cmFzLmg+CiAjaW5jbHVkZSA8d3RmL1RDU3BpbkxvY2suaD4KIAogbmFtZXNw
YWNlIEpTQyB7CkBAIC00MSw2ICs0Miw0MyBAQCBTb3VyY2VQcm92aWRlcjo6flNvdXJjZVByb3Zp
ZGVyKCkKIHsKIH0KIAorc3RhdGljIGlubGluZSBzaXplX3QgY2hhclBvc2l0aW9uRXh0cmFjdG9y
KGNvbnN0IHNpemVfdCogdmFsdWUpCit7CisgICAgcmV0dXJuICp2YWx1ZTsKK30KKworc2l6ZV90
IFNvdXJjZVByb3ZpZGVyOjpjaGFyUG9zaXRpb25Ub0NvbHVtbk51bWJlcihzaXplX3QgY2hhclBv
c2l0aW9uKQoreworICAgIGlmICghbV9saW5lU3RhcnRzKSB7CisgICAgICAgIG1fbGluZVN0YXJ0
cyA9IGFkb3B0UHRyKG5ldyBWZWN0b3I8c2l6ZV90PigpKTsKKyAgICAgICAgU3RyaW5nIHNvdXJj
ZSA9IHRoaXMtPnNvdXJjZSgpOworICAgICAgICBzaXplX3QgaW5kZXggPSAwOworICAgICAgICBk
byB7CisgICAgICAgICAgICBtX2xpbmVTdGFydHMtPmFwcGVuZChzdGF0aWNfY2FzdDxpbnQ+KGlu
ZGV4KSk7CisgICAgICAgICAgICBpbmRleCA9IHNvdXJjZS5maW5kTmV4dExpbmVTdGFydChpbmRl
eCk7CisgICAgICAgIH0gd2hpbGUgKGluZGV4ICE9IG5vdEZvdW5kKTsKKyAgICAgICAgbV9saW5l
U3RhcnRzLT5zaHJpbmtUb0ZpdCgpOworICAgIH0KKworICAgIHNpemVfdCogZGF0YSA9IG1fbGlu
ZVN0YXJ0cy0+ZGF0YSgpOworICAgIHNpemVfdCBkYXRhU2l6ZSA9IG1fbGluZVN0YXJ0cy0+c2l6
ZSgpOworCisgICAgLy8gR2V0IHRoZSBuZWFyZXN0IGxpbmUgc3RhcnQgZW50cnkgKHdoaWNoIGNv
dWxkIGJlIHRvIHRoZSBsZWZ0IG9yIHRvIHRoZQorICAgIC8vIHJpZ2h0IG9mIHRoZSByZXF1ZXN0
ZWQgY2hhclBvc2l0aW9uLgorICAgIGNvbnN0IHNpemVfdCogbGluZSA9IGFwcHJveGltYXRlQmlu
YXJ5U2VhcmNoPHNpemVfdCwgc2l6ZV90PihkYXRhLCBkYXRhU2l6ZSwgY2hhclBvc2l0aW9uLCBj
aGFyUG9zaXRpb25FeHRyYWN0b3IpOworICAgIHNpemVfdCBsaW5lU3RhcnRQb3NpdGlvbiA9ICps
aW5lOworCisgICAgaWYgKGxpbmVTdGFydFBvc2l0aW9uID4gY2hhclBvc2l0aW9uKQorICAgICAg
ICBpZiAoZGF0YSA8IGxpbmUpIHsKKyAgICAgICAgICAgIGxpbmUtLTsKKyAgICAgICAgICAgIGxp
bmVTdGFydFBvc2l0aW9uID0gKmxpbmU7CisgICAgICAgIH0KKworICAgIEFTU0VSVChkYXRhIDw9
IGxpbmUpOworICAgIEFTU0VSVChsaW5lU3RhcnRQb3NpdGlvbiA8PSBjaGFyUG9zaXRpb24pOwor
ICAgIHJldHVybiBjaGFyUG9zaXRpb24gLSBsaW5lU3RhcnRQb3NpdGlvbjsKK30KKwogc3RhdGlj
IFRDTWFsbG9jX1NwaW5Mb2NrIHByb3ZpZGVySWRMb2NrID0gU1BJTkxPQ0tfSU5JVElBTElaRVI7
CiAKIHZvaWQgU291cmNlUHJvdmlkZXI6OmdldElEKCkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9wYXJzZXIvU291cmNlUHJvdmlkZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvcGFyc2VyL1NvdXJjZVByb3ZpZGVyLmgJKHJldmlzaW9uIDE0NjM1OCkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9wYXJzZXIvU291cmNlUHJvdmlkZXIuaAkod29ya2luZyBjb3B5
KQpAQCAtNjYsNiArNjYsOCBAQCBuYW1lc3BhY2UgSlNDIHsKICAgICAgICAgYm9vbCBpc1ZhbGlk
KCkgY29uc3QgeyByZXR1cm4gbV92YWxpZGF0ZWQ7IH0KICAgICAgICAgdm9pZCBzZXRWYWxpZCgp
IHsgbV92YWxpZGF0ZWQgPSB0cnVlOyB9CiAKKyAgICAgICAgc2l6ZV90IGNoYXJQb3NpdGlvblRv
Q29sdW1uTnVtYmVyKHNpemVfdCBjaGFyUG9zaXRpb24pOworCiAgICAgcHJpdmF0ZToKIAogICAg
ICAgICBKU19FWFBPUlRfUFJJVkFURSB2b2lkIGdldElEKCk7CkBAIC03NCw2ICs3Niw4IEBAIG5h
bWVzcGFjZSBKU0MgewogICAgICAgICBUZXh0UG9zaXRpb24gbV9zdGFydFBvc2l0aW9uOwogICAg
ICAgICBib29sIG1fdmFsaWRhdGVkIDogMTsKICAgICAgICAgdWludHB0cl90IG1faWQgOiBzaXpl
b2YodWludHB0cl90KSAqIDggLSAxOworCisgICAgICAgIE93blB0cjxWZWN0b3I8c2l6ZV90PiA+
IG1fbGluZVN0YXJ0czsKICAgICB9OwogCiAgICAgY2xhc3MgU3RyaW5nU291cmNlUHJvdmlkZXIg
OiBwdWJsaWMgU291cmNlUHJvdmlkZXIgewpJbmRleDogU291cmNlL1dURi9DaGFuZ2VMb2cKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL1dURi9DaGFuZ2VMb2cJKHJldmlzaW9uIDE0NjUzNikKKysrIFNv
dXJjZS9XVEYvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMjAgQEAKKzIwMTMt
MDMtMjEgIE1hcmsgTGFtICA8bWFyay5sYW1AYXBwbGUuY29tPgorCisgICAgICAgIEludHJvZHVj
aW5nIFN0cmluZzo6ZmluZE5leHRMaW5lU3RhcnQoKS4KKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTExMjk1Ny4KKworICAgICAgICBSZXZpZXdlZCBieSBO
T0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUaGlzIGlzIHJlcGxhY2VzIFN0cmluZzo6cmV2ZXJz
ZUZpbmRMaW5lVGVybWluYXRvcigpIGluIHRoZSBKU0MKKyAgICAgICAgZGVidWdnZXIncyBjb2Rl
IGZvciBjb21wdXRpbmcgY29sdW1uIG51bWJlcnMuCisKKyAgICAgICAgKiB3dGYvdGV4dC9TdHJp
bmdJbXBsLmNwcDoKKyAgICAgICAgKFdURjo6U3RyaW5nSW1wbDo6ZmluZE5leHRMaW5lU3RhcnQp
OgorICAgICAgICAqIHd0Zi90ZXh0L1N0cmluZ0ltcGwuaDoKKyAgICAgICAgKFdURjo6ZmluZE5l
eHRMaW5lU3RhcnQpOgorICAgICAgICAqIHd0Zi90ZXh0L1dURlN0cmluZy5oOgorICAgICAgICAo
V1RGOjpTdHJpbmc6OmZpbmROZXh0TGluZVN0YXJ0KToKKwogMjAxMy0wMy0yMSAgQWRhbSBCYXJ0
aCAgPGFiYXJ0aEB3ZWJraXQub3JnPgogCiAgICAgICAgIEhUTUxOYW1lcyBzaG91bGQgY29uc3Ry
dWN0IHN0cmluZ3MgYXQgY29tcGlsZSB0aW1lCkluZGV4OiBTb3VyY2UvV1RGL3d0Zi90ZXh0L1N0
cmluZ0ltcGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvd3RmL3RleHQvU3RyaW5nSW1w
bC5jcHAJKHJldmlzaW9uIDE0NjM1OCkKKysrIFNvdXJjZS9XVEYvd3RmL3RleHQvU3RyaW5nSW1w
bC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTExMTYsMTEgKzExMTYsMTEgQEAgc2l6ZV90IFN0cmlu
Z0ltcGw6OmZpbmRJZ25vcmluZ0Nhc2UoU3RyaQogICAgIHJldHVybiBmaW5kSWdub3JpbmdDYXNl
SW5uZXIoY2hhcmFjdGVyczE2KCkgKyBpbmRleCwgbWF0Y2hTdHJpbmctPmNoYXJhY3RlcnMxNigp
LCBpbmRleCwgc2VhcmNoTGVuZ3RoLCBtYXRjaExlbmd0aCk7CiB9CiAKLXNpemVfdCBTdHJpbmdJ
bXBsOjpyZXZlcnNlRmluZExpbmVUZXJtaW5hdG9yKHVuc2lnbmVkIGluZGV4KQorc2l6ZV90IFN0
cmluZ0ltcGw6OmZpbmROZXh0TGluZVN0YXJ0KHVuc2lnbmVkIGluZGV4KQogewogICAgIGlmIChp
czhCaXQoKSkKLSAgICAgICAgcmV0dXJuIFdURjo6cmV2ZXJzZUZpbmRMaW5lVGVybWluYXRvcihj
aGFyYWN0ZXJzOCgpLCBtX2xlbmd0aCwgaW5kZXgpOwotICAgIHJldHVybiBXVEY6OnJldmVyc2VG
aW5kTGluZVRlcm1pbmF0b3IoY2hhcmFjdGVyczE2KCksIG1fbGVuZ3RoLCBpbmRleCk7CisgICAg
ICAgIHJldHVybiBXVEY6OmZpbmROZXh0TGluZVN0YXJ0KGNoYXJhY3RlcnM4KCksIG1fbGVuZ3Ro
LCBpbmRleCk7CisgICAgcmV0dXJuIFdURjo6ZmluZE5leHRMaW5lU3RhcnQoY2hhcmFjdGVyczE2
KCksIG1fbGVuZ3RoLCBpbmRleCk7CiB9CiAKIHNpemVfdCBTdHJpbmdJbXBsOjpyZXZlcnNlRmlu
ZChVQ2hhciBjLCB1bnNpZ25lZCBpbmRleCkKSW5kZXg6IFNvdXJjZS9XVEYvd3RmL3RleHQvU3Ry
aW5nSW1wbC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XVEYvd3RmL3RleHQvU3RyaW5nSW1wbC5o
CShyZXZpc2lvbiAxNDYzNTgpCisrKyBTb3VyY2UvV1RGL3d0Zi90ZXh0L1N0cmluZ0ltcGwuaAko
d29ya2luZyBjb3B5KQpAQCAtNjk3LDcgKzY5Nyw4IEBAIHB1YmxpYzoKICAgICBBTFdBWVNfSU5M
SU5FIHNpemVfdCBmaW5kSWdub3JpbmdDYXNlKGNvbnN0IGNoYXIqIHMsIHVuc2lnbmVkIGluZGV4
ID0gMCkgeyByZXR1cm4gZmluZElnbm9yaW5nQ2FzZShyZWludGVycHJldF9jYXN0PGNvbnN0IExD
aGFyKj4ocyksIGluZGV4KTsgfTsKICAgICBXVEZfRVhQT1JUX1NUUklOR19BUEkgc2l6ZV90IGZp
bmRJZ25vcmluZ0Nhc2UoU3RyaW5nSW1wbCosIHVuc2lnbmVkIGluZGV4ID0gMCk7CiAKLSAgICBX
VEZfRVhQT1JUX1NUUklOR19BUEkgc2l6ZV90IHJldmVyc2VGaW5kTGluZVRlcm1pbmF0b3IodW5z
aWduZWQgaW5kZXggPSBVSU5UX01BWCk7CisgICAgV1RGX0VYUE9SVF9TVFJJTkdfQVBJIHNpemVf
dCBmaW5kTmV4dExpbmVTdGFydCh1bnNpZ25lZCBpbmRleCA9IFVJTlRfTUFYKTsKKwogICAgIFdU
Rl9FWFBPUlRfU1RSSU5HX0FQSSBzaXplX3QgcmV2ZXJzZUZpbmQoVUNoYXIsIHVuc2lnbmVkIGlu
ZGV4ID0gVUlOVF9NQVgpOwogICAgIFdURl9FWFBPUlRfU1RSSU5HX0FQSSBzaXplX3QgcmV2ZXJz
ZUZpbmQoU3RyaW5nSW1wbCosIHVuc2lnbmVkIGluZGV4ID0gVUlOVF9NQVgpOwogICAgIFdURl9F
WFBPUlRfU1RSSU5HX0FQSSBzaXplX3QgcmV2ZXJzZUZpbmRJZ25vcmluZ0Nhc2UoU3RyaW5nSW1w
bCosIHVuc2lnbmVkIGluZGV4ID0gVUlOVF9NQVgpOwpAQCAtMTEwOSw2ICsxMTEwLDM3IEBAIGlu
bGluZSBzaXplX3QgZmluZChjb25zdCBVQ2hhciogY2hhcmFjdGUKIH0KIAogdGVtcGxhdGU8dHlw
ZW5hbWUgQ2hhcmFjdGVyVHlwZT4KK2lubGluZSBzaXplX3QgZmluZE5leHRMaW5lU3RhcnQoY29u
c3QgQ2hhcmFjdGVyVHlwZSogY2hhcmFjdGVycywgdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBp
bmRleCA9IDApCit7CisgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7CisgICAgICAgIENoYXJh
Y3RlclR5cGUgYyA9IGNoYXJhY3RlcnNbaW5kZXgrK107CisgICAgICAgIGlmICgoYyAhPSAnXG4n
KSAmJiAoYyAhPSAnXHInKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8vIFRo
ZXJlIGNhbiBvbmx5IGJlIGEgc3RhcnQgb2YgYSBuZXcgbGluZSBpZiB0aGVyZSBhcmUgbW9yZSBj
aGFyYWN0ZXJzCisgICAgICAgIC8vIGJleW9uZCB0aGUgY3VycmVudCBjaGFyYWN0ZXIuCisgICAg
ICAgIGlmIChpbmRleCA8IGxlbmd0aCkgeworICAgICAgICAgICAgLy8gVGhlIDMgY29tbW9uIHR5
cGVzIG9mIGxpbmUgdGVybWluYXRvcnMgYXJlIDEuIFxyXG4gKFdpbmRvd3MpLCAKKyAgICAgICAg
ICAgIC8vIDIuIFxyIChvbGQgTWFjT1MpIGFuZCAzLiBcbiAoVW5peCdlcykuCisKKyAgICAgICAg
ICAgIGlmIChjID09ICdcbicpCisgICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OyAvLyBDYXNl
IDM6IGp1c3QgXG4uCisKKyAgICAgICAgICAgIENoYXJhY3RlclR5cGUgYzIgPSBjaGFyYWN0ZXJz
W2luZGV4XTsKKyAgICAgICAgICAgIGlmIChjMiAhPSAnXG4nKQorICAgICAgICAgICAgICAgIHJl
dHVybiBpbmRleDsgLy8gQ2FzZSAyOiBqdXN0IFxyLgorCisgICAgICAgICAgICAvLyBDYXNlIDE6
IFxyXG4uCisgICAgICAgICAgICAvLyBCdXQsIHRoZXJlJ3Mgb25seSBhIHN0YXJ0IG9mIGEgbmV3
IGxpbmUgaWYgdGhlcmUgYXJlIG1vcmUKKyAgICAgICAgICAgIC8vIGNoYXJhY3RlcnMgYmV5b25k
IHRoZSBcclxuLgorICAgICAgICAgICAgaWYgKCsraW5kZXggPCBsZW5ndGgpCisgICAgICAgICAg
ICAgICAgcmV0dXJuIGluZGV4OyAKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbm90Rm91
bmQ7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIENoYXJhY3RlclR5cGU+CiBpbmxpbmUgc2l6ZV90
IHJldmVyc2VGaW5kTGluZVRlcm1pbmF0b3IoY29uc3QgQ2hhcmFjdGVyVHlwZSogY2hhcmFjdGVy
cywgdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBpbmRleCA9IFVJTlRfTUFYKQogewogICAgIGlm
ICghbGVuZ3RoKQpJbmRleDogU291cmNlL1dURi93dGYvdGV4dC9XVEZTdHJpbmcuaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV1RGL3d0Zi90ZXh0L1dURlN0cmluZy5oCShyZXZpc2lvbiAxNDYzNTgp
CisrKyBTb3VyY2UvV1RGL3d0Zi90ZXh0L1dURlN0cmluZy5oCSh3b3JraW5nIGNvcHkpCkBAIC0y
NjEsOCArMjYxLDggQEAgcHVibGljOgogICAgIHNpemVfdCBmaW5kKGNvbnN0IExDaGFyKiBzdHIs
IHVuc2lnbmVkIHN0YXJ0ID0gMCkgY29uc3QKICAgICAgICAgeyByZXR1cm4gbV9pbXBsID8gbV9p
bXBsLT5maW5kKHN0ciwgc3RhcnQpIDogbm90Rm91bmQ7IH0KIAotICAgIHNpemVfdCByZXZlcnNl
RmluZExpbmVUZXJtaW5hdG9yKHVuc2lnbmVkIHN0YXJ0ID0gVUlOVF9NQVgpIGNvbnN0Ci0gICAg
ICAgIHsgcmV0dXJuIG1faW1wbCA/IG1faW1wbC0+cmV2ZXJzZUZpbmRMaW5lVGVybWluYXRvcihz
dGFydCkgOiBub3RGb3VuZDsgfQorICAgIHNpemVfdCBmaW5kTmV4dExpbmVTdGFydCh1bnNpZ25l
ZCBzdGFydCA9IDApIGNvbnN0CisgICAgICAgIHsgcmV0dXJuIG1faW1wbCA/IG1faW1wbC0+Zmlu
ZE5leHRMaW5lU3RhcnQoc3RhcnQpIDogbm90Rm91bmQ7IH0KIAogICAgIC8vIEZpbmQgdGhlIGxh
c3QgaW5zdGFuY2Ugb2YgYSBzaW5nbGUgY2hhcmFjdGVyIG9yIHN0cmluZy4KICAgICBzaXplX3Qg
cmV2ZXJzZUZpbmQoVUNoYXIgYywgdW5zaWduZWQgc3RhcnQgPSBVSU5UX01BWCkgY29uc3QK
</data>
<flag name="review"
          id="216166"
          type_id="1"
          status="+"
          setter="ggaren"
    />
          </attachment>
      

    </bug>

</bugzilla>