<?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>143010</bug_id>
          
          <creation_ts>2015-03-24 12:22:54 -0700</creation_ts>
          <short_desc>Content extensions need multi-dfa compiler</short_desc>
          <delta_ts>2015-03-25 10:33:57 -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>WebCore Misc.</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></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>143041</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Alex Christensen">achristensen</reporter>
          <assigned_to name="Alex Christensen">achristensen</assigned_to>
          <cc>benjamin</cc>
    
    <cc>commit-queue</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1079652</commentid>
    <comment_count>0</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-03-24 12:22:54 -0700</bug_when>
    <thetext>In order to balance compiling time, byte code size, and interpreting time, we need to be able to compile multiple DFAs.  Here&apos;s a patch that does that, but I&apos;m not sure about the conditions to add another NFA or how to decide which NFA to put this regex in.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1079657</commentid>
    <comment_count>1</comment_count>
      <attachid>249339</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-03-24 12:30:05 -0700</bug_when>
    <thetext>Created attachment 249339
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1079686</commentid>
    <comment_count>2</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-03-24 13:31:41 -0700</bug_when>
    <thetext>This could also cause problems with locality of memory accesses within the byte code.  If we do things right, we would have as many hot spots as DFAs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1079738</commentid>
    <comment_count>3</comment_count>
      <attachid>249339</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-03-24 15:36:11 -0700</bug_when>
    <thetext>Comment on attachment 249339
Patch

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

I was thinking about this feature very differently:
-Add a global header chain to the binary.
-Make all jumps relative.
-Stream the DFAs one by one to the output.

You patch is much simpler :)

The patch looks good, but can you please add at least one test? Generate a filter of 2k patterns programmatically and test that patterns matching works with both half.
It may be good to test actions from the second half can be overridden by actions from the first half.

&gt; Source/WebCore/contentextensions/ContentExtensionCompiler.cpp:118
&gt; +        if (nfas[nfas.size() - 1].graphSize() &gt; 1000) // Need a better condition here. Not sure what.

That&apos;s fine, we&apos;ll study this closely.

&gt; Source/WebCore/contentextensions/ContentExtensionCompiler.cpp:120
&gt; +        NFA&amp; lastNFA = nfas[nfas.size() - 1]; // Need to find &quot;best&quot; nfa here. Not sure how.

You can remove the comment.

&gt; Source/WebCore/contentextensions/ContentExtensionCompiler.cpp:157
&gt; +    for (size_t i = 0; i &lt; nfas.size(); i++) {

WebKit style: ++i

&gt; Source/WebCore/contentextensions/DFABytecodeCompiler.cpp:187
&gt; +    // Set size header.
&gt; +    set32Bits(m_bytecode, startLocation, m_bytecode.size() - startLocation);

I was thinking of implementing this using a global header, like on real binaries. This is so much simpler :)

&gt; Source/WebCore/contentextensions/DFABytecodeInterpreter.cpp:64
&gt; +    for (unsigned programCounter = 0; programCounter &lt; m_bytecodeLength;) {

This is a bit cryptic. I think the condition would be clearer if it was handled at &quot;nextDFA:&quot;.

I am afraid this for() loop make it look like the program counter is incremented sequentially in the loop.

&gt; Source/WebCore/contentextensions/DFABytecodeInterpreter.cpp:142
&gt; +        programCounter = dfaStart + dfaBytecodeLength;

Let&apos;s assert dfaBytecodeLength is non-zero.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1079748</commentid>
    <comment_count>4</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-03-24 15:50:10 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; This could also cause problems with locality of memory accesses within the
&gt; byte code.  If we do things right, we would have as many hot spots as DFAs.

I think that would be fine. Pages are small, it does not matter how they are distributed.

Are you gonna look into locality optimization next? :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1079816</commentid>
    <comment_count>5</comment_count>
      <attachid>249375</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-03-24 18:55:02 -0700</bug_when>
    <thetext>Created attachment 249375
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1079867</commentid>
    <comment_count>6</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-03-24 22:20:42 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/181932</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1079884</commentid>
    <comment_count>7</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2015-03-25 00:19:19 -0700</bug_when>
    <thetext>This test fails most of the time on bots. Will roll out.

TIMEOUT ContentExtensionTest.MultiDFA</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1079886</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2015-03-25 00:37:53 -0700</bug_when>
    <thetext>Re-opened since this is blocked by bug 143041</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1079977</commentid>
    <comment_count>9</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-03-25 10:33:57 -0700</bug_when>
    <thetext>Tweaked the test and max NFA size slightly to not timeout on debug builds while still testing the multi-DFA functionality.
Recommitted to http://trac.webkit.org/changeset/181932</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>249339</attachid>
            <date>2015-03-24 12:30:05 -0700</date>
            <delta_ts>2015-03-24 18:54:59 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-143010-20150324122928.patch</filename>
            <type>text/plain</type>
            <size>14570</size>
            <attacher name="Alex Christensen">achristensen</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE4MTg5OCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDIxIEBACisyMDE1LTAzLTI0ICBBbGV4IENo
cmlzdGVuc2VuICA8YWNocmlzdGVuc2VuQHdlYmtpdC5vcmc+CisKKyAgICAgICAgW0NvbnRlbnQg
RXh0ZW5zaW9uc10gQWRkIG11bHRpLURGQSBjb21waWxpbmcgYW5kIGludGVycHJldGluZy4KKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0MzAxMAorCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogY29udGVudGV4
dGVuc2lvbnMvQ29udGVudEV4dGVuc2lvbkNvbXBpbGVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OkNvbnRlbnRFeHRlbnNpb25zOjpjb21waWxlUnVsZUxpc3QpOgorICAgICAgICBDb21waWxlIG11
bHRpcGxlIE5GQXMgdG8gREZBcy4KKyAgICAgICAgKiBjb250ZW50ZXh0ZW5zaW9ucy9ERkFCeXRl
Y29kZUNvbXBpbGVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNvbnRlbnRFeHRlbnNpb25zOjpE
RkFCeXRlY29kZUNvbXBpbGVyOjpjb21waWxlKToKKyAgICAgICAgQWRkIGEgaGVhZGVyIGZvciBl
YWNoIERGQS4KKyAgICAgICAgKiBjb250ZW50ZXh0ZW5zaW9ucy9ERkFCeXRlY29kZUludGVycHJl
dGVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNvbnRlbnRFeHRlbnNpb25zOjpERkFCeXRlY29k
ZUludGVycHJldGVyOjphY3Rpb25zRnJvbURGQVJvb3QpOgorICAgICAgICAoV2ViQ29yZTo6Q29u
dGVudEV4dGVuc2lvbnM6OkRGQUJ5dGVjb2RlSW50ZXJwcmV0ZXI6OmludGVycHJldCk6CisgICAg
ICAgIEludGVycHJldCBhcyBtYW55IERGQXMgYXMgdGhlcmUgYXJlIGluIHRoZSBieXRlY29kZS4K
KwogMjAxNS0wMy0yNCAgRGF2aWQgSHlhdHQgIDxoeWF0dEBhcHBsZS5jb20+CiAKICAgICAgICAg
SW1wcm92ZSB0aGUgb2Zmc2V0V2lkdGgvSGVpZ2h0IGxheW91dCBvcHRpbWl6YXRpb24KSW5kZXg6
IFNvdXJjZS9XZWJDb3JlL2NvbnRlbnRleHRlbnNpb25zL0NvbnRlbnRFeHRlbnNpb25Db21waWxl
ci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY29udGVudGV4dGVuc2lvbnMvQ29u
dGVudEV4dGVuc2lvbkNvbXBpbGVyLmNwcAkocmV2aXNpb24gMTgxODgwKQorKysgU291cmNlL1dl
YkNvcmUvY29udGVudGV4dGVuc2lvbnMvQ29udGVudEV4dGVuc2lvbkNvbXBpbGVyLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMTExLDEwICsxMTEsMTQgQEAgQ29tcGlsZWRDb250ZW50RXh0ZW5zaW9u
RGF0YSBjb21waWxlUnVsZQogICAgIFZlY3Rvcjx1bnNpZ25lZD4gYWN0aW9uTG9jYXRpb25zID0g
c2VyaWFsaXplQWN0aW9ucyhwYXJzZWRSdWxlTGlzdCwgYWN0aW9ucyk7CiAgICAgVmVjdG9yPHVp
bnQ2NF90PiB1bml2ZXJzYWxBY3Rpb25Mb2NhdGlvbnM7CiAKLSAgICBORkEgbmZhOwotICAgIFVS
TEZpbHRlclBhcnNlciB1cmxGaWx0ZXJQYXJzZXIobmZhKTsKKyAgICBWZWN0b3I8TkZBPiBuZmFz
OworICAgIG5mYXMuYXBwZW5kKE5GQSgpKTsKICAgICBib29sIG5vblVuaXZlcnNhbEFjdGlvblNl
ZW4gPSBmYWxzZTsKICAgICBmb3IgKHVuc2lnbmVkIHJ1bGVJbmRleCA9IDA7IHJ1bGVJbmRleCA8
IHBhcnNlZFJ1bGVMaXN0LnNpemUoKTsgKytydWxlSW5kZXgpIHsKKyAgICAgICAgaWYgKG5mYXNb
bmZhcy5zaXplKCkgLSAxXS5ncmFwaFNpemUoKSA+IDEwMDApIC8vIE5lZWQgYSBiZXR0ZXIgY29u
ZGl0aW9uIGhlcmUuIE5vdCBzdXJlIHdoYXQuCisgICAgICAgICAgICBuZmFzLmFwcGVuZChORkEo
KSk7CisgICAgICAgIE5GQSYgbGFzdE5GQSA9IG5mYXNbbmZhcy5zaXplKCkgLSAxXTsgLy8gTmVl
ZCB0byBmaW5kICJiZXN0IiBuZmEgaGVyZS4gTm90IHN1cmUgaG93LgorICAgICAgICBVUkxGaWx0
ZXJQYXJzZXIgdXJsRmlsdGVyUGFyc2VyKGxhc3RORkEpOwogICAgICAgICBjb25zdCBDb250ZW50
RXh0ZW5zaW9uUnVsZSYgY29udGVudEV4dGVuc2lvblJ1bGUgPSBwYXJzZWRSdWxlTGlzdFtydWxl
SW5kZXhdOwogICAgICAgICBjb25zdCBUcmlnZ2VyJiB0cmlnZ2VyID0gY29udGVudEV4dGVuc2lv
blJ1bGUudHJpZ2dlcigpOwogICAgICAgICBBU1NFUlQodHJpZ2dlci51cmxGaWx0ZXIubGVuZ3Ro
KCkpOwpAQCAtMTQ5LDkgKzE1MywxNyBAQCBDb21waWxlZENvbnRlbnRFeHRlbnNpb25EYXRhIGNv
bXBpbGVSdWxlCiAgICAgZG91YmxlIGRmYUJ1aWxkVGltZVN0YXJ0ID0gbW9ub3RvbmljYWxseUlu
Y3JlYXNpbmdUaW1lKCk7CiAjZW5kaWYKIAotICAgIERGQSBkZmEgPSBORkFUb0RGQTo6Y29udmVy
dChuZmEpOwotICAgIGZvciAodWludDY0X3QgYWN0aW9uTG9jYXRpb24gOiB1bml2ZXJzYWxBY3Rp
b25Mb2NhdGlvbnMpCi0gICAgICAgIGRmYS5ub2RlQXQoZGZhLnJvb3QoKSkuYWN0aW9ucy5hcHBl
bmQoYWN0aW9uTG9jYXRpb24pOworICAgIFZlY3RvcjxERkFCeXRlY29kZT4gYnl0ZWNvZGU7Cisg
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuZmFzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIERG
QSBkZmEgPSBORkFUb0RGQTo6Y29udmVydChuZmFzW2ldKTsKKyAgICAgICAgaWYgKCFpKSB7Cisg
ICAgICAgICAgICAvLyBQdXQgYWxsIHRoZSB1bml2ZXJzYWwgYWN0aW9ucyBvbiB0aGUgZmlyc3Qg
REZBLgorICAgICAgICAgICAgZm9yICh1aW50NjRfdCBhY3Rpb25Mb2NhdGlvbiA6IHVuaXZlcnNh
bEFjdGlvbkxvY2F0aW9ucykKKyAgICAgICAgICAgICAgICBkZmEubm9kZUF0KGRmYS5yb290KCkp
LmFjdGlvbnMuYXBwZW5kKGFjdGlvbkxvY2F0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBERkFC
eXRlY29kZUNvbXBpbGVyIGNvbXBpbGVyKGRmYSwgYnl0ZWNvZGUpOworICAgICAgICBjb21waWxl
ci5jb21waWxlKCk7CisgICAgfQogCiAjaWYgQ09OVEVOVF9FWFRFTlNJT05TX1BFUkZPUk1BTkNF
X1JFUE9SVElORwogICAgIGRvdWJsZSBkZmFCdWlsZFRpbWVFbmQgPSBtb25vdG9uaWNhbGx5SW5j
cmVhc2luZ1RpbWUoKTsKQEAgLTE2NCwxMCArMTc2LDYgQEAgQ29tcGlsZWRDb250ZW50RXh0ZW5z
aW9uRGF0YSBjb21waWxlUnVsZQogICAgIGRmYS5kZWJ1Z1ByaW50RG90KCk7CiAjZW5kaWYKIAot
ICAgIFZlY3RvcjxERkFCeXRlY29kZT4gYnl0ZWNvZGU7Ci0gICAgREZBQnl0ZWNvZGVDb21waWxl
ciBjb21waWxlcihkZmEsIGJ5dGVjb2RlKTsKLSAgICBjb21waWxlci5jb21waWxlKCk7Ci0KICAg
ICByZXR1cm4geyBXVEY6Om1vdmUoYnl0ZWNvZGUpLCBXVEY6Om1vdmUoYWN0aW9ucykgfTsKIH0K
IApJbmRleDogU291cmNlL1dlYkNvcmUvY29udGVudGV4dGVuc2lvbnMvREZBQnl0ZWNvZGVDb21w
aWxlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY29udGVudGV4dGVuc2lvbnMv
REZBQnl0ZWNvZGVDb21waWxlci5jcHAJKHJldmlzaW9uIDE4MTg4MCkKKysrIFNvdXJjZS9XZWJD
b3JlL2NvbnRlbnRleHRlbnNpb25zL0RGQUJ5dGVjb2RlQ29tcGlsZXIuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xNjcsNyArMTY3LDkgQEAgdm9pZCBERkFCeXRlY29kZUNvbXBpbGVyOjpjb21waWxl
Q2hlY2tGbwogCiB2b2lkIERGQUJ5dGVjb2RlQ29tcGlsZXI6OmNvbXBpbGUoKQogewotICAgIEFT
U0VSVCghbV9ieXRlY29kZS5zaXplKCkpOworICAgIC8vIERGQSBoZWFkZXIuCisgICAgdW5zaWdu
ZWQgc3RhcnRMb2NhdGlvbiA9IG1fYnl0ZWNvZGUuc2l6ZSgpOworICAgIGFwcGVuZDx1bnNpZ25l
ZD4obV9ieXRlY29kZSwgMCk7CiAgICAgbV9ub2RlU3RhcnRPZmZzZXRzLnJlc2l6ZShtX2RmYS5z
aXplKCkpOwogICAgIAogICAgIC8vIE1ha2Ugc3VyZSB0aGUgcm9vdCBpcyBhbHdheXMgYXQgdGhl
IGJlZ2lubmluZyBvZiB0aGUgYnl0ZWNvZGUuCkBAIC0xODAsNiArMTgyLDkgQEAgdm9pZCBERkFC
eXRlY29kZUNvbXBpbGVyOjpjb21waWxlKCkKICAgICAvLyBMaW5rLgogICAgIGZvciAoY29uc3Qg
YXV0byYgbGlua1JlY29yZCA6IG1fbGlua1JlY29yZHMpCiAgICAgICAgIHNldDMyQml0cyhtX2J5
dGVjb2RlLCBsaW5rUmVjb3JkLmZpcnN0LCBtX25vZGVTdGFydE9mZnNldHNbbGlua1JlY29yZC5z
ZWNvbmRdKTsKKyAgICAKKyAgICAvLyBTZXQgc2l6ZSBoZWFkZXIuCisgICAgc2V0MzJCaXRzKG1f
Ynl0ZWNvZGUsIHN0YXJ0TG9jYXRpb24sIG1fYnl0ZWNvZGUuc2l6ZSgpIC0gc3RhcnRMb2NhdGlv
bik7CiB9CiAgICAgCiB9IC8vIG5hbWVzcGFjZSBDb250ZW50RXh0ZW5zaW9ucwpJbmRleDogU291
cmNlL1dlYkNvcmUvY29udGVudGV4dGVuc2lvbnMvREZBQnl0ZWNvZGVJbnRlcnByZXRlci5jcHAK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY29udGVudGV4dGVuc2lvbnMvREZBQnl0ZWNv
ZGVJbnRlcnByZXRlci5jcHAJKHJldmlzaW9uIDE4MTg4MCkKKysrIFNvdXJjZS9XZWJDb3JlL2Nv
bnRlbnRleHRlbnNpb25zL0RGQUJ5dGVjb2RlSW50ZXJwcmV0ZXIuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC00MywxMyArNDMsMTUgQEAgc3RhdGljIGlubGluZSBJbnRUeXBlIGdldEJpdHMoY29uc3Qg
REZBQgogICAgIAogREZBQnl0ZWNvZGVJbnRlcnByZXRlcjo6QWN0aW9ucyBERkFCeXRlY29kZUlu
dGVycHJldGVyOjphY3Rpb25zRnJvbURGQVJvb3QoKQogewotICAgIHVuc2lnbmVkIHByb2dyYW1D
b3VudGVyID0gMDsKLSAgICBERkFCeXRlY29kZUludGVycHJldGVyOjpBY3Rpb25zIGdsb2JhbEFj
dGlvbkxvY2F0aW9uczsKKyAgICBERkFCeXRlY29kZUludGVycHJldGVyOjpBY3Rpb25zIHVuaXZl
cnNhbEFjdGlvbkxvY2F0aW9uczsKKworICAgIC8vIFNraXAgZmlyc3QgREZBIGhlYWRlci4gQWxs
IHVuaXZlcnNhbCBhY3Rpb25zIGFyZSBpbiB0aGUgZmlyc3QgREZBIHJvb3QuCisgICAgdW5zaWdu
ZWQgcHJvZ3JhbUNvdW50ZXIgPSBzaXplb2YodW5zaWduZWQpOwogICAgIHdoaWxlIChzdGF0aWNf
Y2FzdDxERkFCeXRlY29kZUluc3RydWN0aW9uPihtX2J5dGVjb2RlW3Byb2dyYW1Db3VudGVyXSkg
PT0gREZBQnl0ZWNvZGVJbnN0cnVjdGlvbjo6QXBwZW5kQWN0aW9uKSB7Ci0gICAgICAgIGdsb2Jh
bEFjdGlvbkxvY2F0aW9ucy5hZGQoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGdldEJpdHM8dW5zaWdu
ZWQ+KG1fYnl0ZWNvZGUsIG1fYnl0ZWNvZGVMZW5ndGgsIHByb2dyYW1Db3VudGVyICsgc2l6ZW9m
KERGQUJ5dGVjb2RlKSkpKTsKKyAgICAgICAgdW5pdmVyc2FsQWN0aW9uTG9jYXRpb25zLmFkZChz
dGF0aWNfY2FzdDx1aW50NjRfdD4oZ2V0Qml0czx1bnNpZ25lZD4obV9ieXRlY29kZSwgbV9ieXRl
Y29kZUxlbmd0aCwgcHJvZ3JhbUNvdW50ZXIgKyBzaXplb2YoREZBQnl0ZWNvZGUpKSkpOwogICAg
ICAgICBwcm9ncmFtQ291bnRlciArPSBpbnN0cnVjdGlvblNpemVXaXRoQXJndW1lbnRzKERGQUJ5
dGVjb2RlSW5zdHJ1Y3Rpb246OkFwcGVuZEFjdGlvbik7CiAgICAgfQotICAgIHJldHVybiBnbG9i
YWxBY3Rpb25Mb2NhdGlvbnM7CisgICAgcmV0dXJuIHVuaXZlcnNhbEFjdGlvbkxvY2F0aW9uczsK
IH0KICAgICAKIERGQUJ5dGVjb2RlSW50ZXJwcmV0ZXI6OkFjdGlvbnMgREZBQnl0ZWNvZGVJbnRl
cnByZXRlcjo6aW50ZXJwcmV0KGNvbnN0IENTdHJpbmcmIHVybENTdHJpbmcsIHVpbnQxNl90IGZs
YWdzKQpAQCAtNTcsNzggKzU5LDg5IEBAIERGQUJ5dGVjb2RlSW50ZXJwcmV0ZXI6OkFjdGlvbnMg
REZBQnl0ZWMKICAgICBjb25zdCBjaGFyKiB1cmwgPSB1cmxDU3RyaW5nLmRhdGEoKTsKICAgICBB
U1NFUlQodXJsKTsKICAgICAKLSAgICB1bnNpZ25lZCBwcm9ncmFtQ291bnRlciA9IDA7Ci0gICAg
dW5zaWduZWQgdXJsSW5kZXggPSAwOwotICAgIGJvb2wgdXJsSW5kZXhJc0FmdGVyRW5kT2ZTdHJp
bmcgPSBmYWxzZTsKICAgICBBY3Rpb25zIGFjdGlvbnM7CiAgICAgCi0gICAgd2hpbGUgKHN0YXRp
Y19jYXN0PERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb24+KG1fYnl0ZWNvZGVbcHJvZ3JhbUNvdW50ZXJd
KSA9PSBERkFCeXRlY29kZUluc3RydWN0aW9uOjpBcHBlbmRBY3Rpb24pCi0gICAgICAgIHByb2dy
YW1Db3VudGVyICs9IGluc3RydWN0aW9uU2l6ZVdpdGhBcmd1bWVudHMoREZBQnl0ZWNvZGVJbnN0
cnVjdGlvbjo6QXBwZW5kQWN0aW9uKTsKLQotICAgIC8vIFRoaXMgc2hvdWxkIGFsd2F5cyB0ZXJt
aW5hdGUgaWYgaW50ZXJwcmV0aW5nIGNvcnJlY3RseSBjb21waWxlZCBieXRlY29kZS4KLSAgICB3
aGlsZSAodHJ1ZSkgewotICAgICAgICBBU1NFUlQocHJvZ3JhbUNvdW50ZXIgPD0gbV9ieXRlY29k
ZUxlbmd0aCk7Ci0gICAgICAgIHN3aXRjaCAoc3RhdGljX2Nhc3Q8REZBQnl0ZWNvZGVJbnN0cnVj
dGlvbj4obV9ieXRlY29kZVtwcm9ncmFtQ291bnRlcl0pKSB7Ci0KLSAgICAgICAgY2FzZSBERkFC
eXRlY29kZUluc3RydWN0aW9uOjpUZXJtaW5hdGU6Ci0gICAgICAgICAgICByZXR1cm4gYWN0aW9u
czsKLQotICAgICAgICBjYXNlIERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb246OkNoZWNrVmFsdWU6Ci0g
ICAgICAgICAgICBpZiAodXJsSW5kZXhJc0FmdGVyRW5kT2ZTdHJpbmcpCi0gICAgICAgICAgICAg
ICAgcmV0dXJuIGFjdGlvbnM7Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUg
bmV4dCBjaGFyYWN0ZXIgaW4gdGhlIHVybCBpcyB0aGUgdmFsdWUgc3RvcmVkIHdpdGggdGhlIGJ5
dGVjb2RlLgotICAgICAgICAgICAgaWYgKHVybFt1cmxJbmRleF0gPT0gZ2V0Qml0czx1aW50OF90
PihtX2J5dGVjb2RlLCBtX2J5dGVjb2RlTGVuZ3RoLCBwcm9ncmFtQ291bnRlciArIHNpemVvZihE
RkFCeXRlY29kZSkpKSB7Ci0gICAgICAgICAgICAgICAgcHJvZ3JhbUNvdW50ZXIgPSBnZXRCaXRz
PHVuc2lnbmVkPihtX2J5dGVjb2RlLCBtX2J5dGVjb2RlTGVuZ3RoLCBwcm9ncmFtQ291bnRlciAr
IHNpemVvZihERkFCeXRlY29kZSkgKyBzaXplb2YodWludDhfdCkpOwotICAgICAgICAgICAgICAg
IGlmICghdXJsW3VybEluZGV4XSkKLSAgICAgICAgICAgICAgICAgICAgdXJsSW5kZXhJc0FmdGVy
RW5kT2ZTdHJpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgIHVybEluZGV4Kys7IC8vIFRoaXMg
cmVwcmVzZW50cyBhbiBlZGdlIGluIHRoZSBERkEuCi0gICAgICAgICAgICB9IGVsc2UKLSAgICAg
ICAgICAgICAgICBwcm9ncmFtQ291bnRlciArPSBpbnN0cnVjdGlvblNpemVXaXRoQXJndW1lbnRz
KERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb246OkNoZWNrVmFsdWUpOwotICAgICAgICAgICAgYnJlYWs7
Ci0KLSAgICAgICAgY2FzZSBERkFCeXRlY29kZUluc3RydWN0aW9uOjpDaGVja1ZhbHVlUmFuZ2U6
IHsKLSAgICAgICAgICAgIGlmICh1cmxJbmRleElzQWZ0ZXJFbmRPZlN0cmluZykKLSAgICAgICAg
ICAgICAgICByZXR1cm4gYWN0aW9uczsKLQotICAgICAgICAgICAgY2hhciBjaGFyYWN0ZXIgPSB1
cmxbdXJsSW5kZXhdOwotICAgICAgICAgICAgaWYgKGNoYXJhY3RlciA+PSBnZXRCaXRzPHVpbnQ4
X3Q+KG1fYnl0ZWNvZGUsIG1fYnl0ZWNvZGVMZW5ndGgsIHByb2dyYW1Db3VudGVyICsgc2l6ZW9m
KERGQUJ5dGVjb2RlKSkKLSAgICAgICAgICAgICAgICAmJiBjaGFyYWN0ZXIgPD0gZ2V0Qml0czx1
aW50OF90PihtX2J5dGVjb2RlLCBtX2J5dGVjb2RlTGVuZ3RoLCBwcm9ncmFtQ291bnRlciArIHNp
emVvZihERkFCeXRlY29kZSkgKyBzaXplb2YodWludDhfdCkpKSB7Ci0gICAgICAgICAgICAgICAg
cHJvZ3JhbUNvdW50ZXIgPSBnZXRCaXRzPHVuc2lnbmVkPihtX2J5dGVjb2RlLCBtX2J5dGVjb2Rl
TGVuZ3RoLCBwcm9ncmFtQ291bnRlciArIHNpemVvZihERkFCeXRlY29kZSkgKyBzaXplb2YodWlu
dDhfdCkgKyBzaXplb2YodWludDhfdCkpOwotICAgICAgICAgICAgICAgIGlmICghY2hhcmFjdGVy
KQotICAgICAgICAgICAgICAgICAgICB1cmxJbmRleElzQWZ0ZXJFbmRPZlN0cmluZyA9IHRydWU7
Ci0gICAgICAgICAgICAgICAgdXJsSW5kZXgrKzsgLy8gVGhpcyByZXByZXNlbnRzIGFuIGVkZ2Ug
aW4gdGhlIERGQS4KLSAgICAgICAgICAgIH0gZWxzZQotICAgICAgICAgICAgICAgIHByb2dyYW1D
b3VudGVyICs9IGluc3RydWN0aW9uU2l6ZVdpdGhBcmd1bWVudHMoREZBQnl0ZWNvZGVJbnN0cnVj
dGlvbjo6Q2hlY2tWYWx1ZVJhbmdlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0K
LSAgICAgICAgY2FzZSBERkFCeXRlY29kZUluc3RydWN0aW9uOjpKdW1wOgotICAgICAgICAgICAg
aWYgKCF1cmxbdXJsSW5kZXhdIHx8IHVybEluZGV4SXNBZnRlckVuZE9mU3RyaW5nKQotICAgICAg
ICAgICAgICAgIHJldHVybiBhY3Rpb25zOwotCi0gICAgICAgICAgICBwcm9ncmFtQ291bnRlciA9
IGdldEJpdHM8dW5zaWduZWQ+KG1fYnl0ZWNvZGUsIG1fYnl0ZWNvZGVMZW5ndGgsIHByb2dyYW1D
b3VudGVyICsgc2l6ZW9mKERGQUJ5dGVjb2RlKSk7Ci0gICAgICAgICAgICB1cmxJbmRleCsrOyAv
LyBUaGlzIHJlcHJlc2VudHMgYW4gZWRnZSBpbiB0aGUgREZBLgotICAgICAgICAgICAgYnJlYWs7
Ci0KLSAgICAgICAgY2FzZSBERkFCeXRlY29kZUluc3RydWN0aW9uOjpBcHBlbmRBY3Rpb246Ci0g
ICAgICAgICAgICBhY3Rpb25zLmFkZChzdGF0aWNfY2FzdDx1aW50NjRfdD4oZ2V0Qml0czx1bnNp
Z25lZD4obV9ieXRlY29kZSwgbV9ieXRlY29kZUxlbmd0aCwgcHJvZ3JhbUNvdW50ZXIgKyBzaXpl
b2YoREZBQnl0ZWNvZGUpKSkpOworICAgIGZvciAodW5zaWduZWQgcHJvZ3JhbUNvdW50ZXIgPSAw
OyBwcm9ncmFtQ291bnRlciA8IG1fYnl0ZWNvZGVMZW5ndGg7KSB7CisgICAgICAgIC8vIERGQSBo
ZWFkZXIuCisgICAgICAgIHVuc2lnbmVkIGRmYVN0YXJ0ID0gcHJvZ3JhbUNvdW50ZXI7CisgICAg
ICAgIHVuc2lnbmVkIGRmYUJ5dGVjb2RlTGVuZ3RoID0gZ2V0Qml0czx1bnNpZ25lZD4obV9ieXRl
Y29kZSwgbV9ieXRlY29kZUxlbmd0aCwgcHJvZ3JhbUNvdW50ZXIpOworICAgICAgICBwcm9ncmFt
Q291bnRlciArPSBzaXplb2YodW5zaWduZWQpOworCisgICAgICAgIC8vIFNraXAgdGhlIHVuaXZl
cnNhbCBhY3Rpb25zLgorICAgICAgICAvLyBGSVhNRTogUmVwbGFjZSBBcHBlbmRBY3Rpb24gd2l0
aCBBcHBlbmRBY3Rpb25zIHRvIG1ha2UgdGhpcyBqdXN0IG9uZSBqdW1wIGFuZCBtYWtlIHN1cmUg
dGhlcmUgYXJlbid0IHVuaXZlcnNhbCBhY3Rpb25zIHdpdGggZmxhZ3MuCisgICAgICAgIHdoaWxl
IChzdGF0aWNfY2FzdDxERkFCeXRlY29kZUluc3RydWN0aW9uPihtX2J5dGVjb2RlW3Byb2dyYW1D
b3VudGVyXSkgPT0gREZBQnl0ZWNvZGVJbnN0cnVjdGlvbjo6QXBwZW5kQWN0aW9uKQogICAgICAg
ICAgICAgcHJvZ3JhbUNvdW50ZXIgKz0gaW5zdHJ1Y3Rpb25TaXplV2l0aEFyZ3VtZW50cyhERkFC
eXRlY29kZUluc3RydWN0aW9uOjpBcHBlbmRBY3Rpb24pOwotICAgICAgICAgICAgYnJlYWs7Ci0K
LSAgICAgICAgY2FzZSBERkFCeXRlY29kZUluc3RydWN0aW9uOjpUZXN0RmxhZ3NBbmRBcHBlbmRB
Y3Rpb246Ci0gICAgICAgICAgICBpZiAoZmxhZ3MgJiBnZXRCaXRzPHVpbnQxNl90PihtX2J5dGVj
b2RlLCBtX2J5dGVjb2RlTGVuZ3RoLCBwcm9ncmFtQ291bnRlciArIHNpemVvZihERkFCeXRlY29k
ZSkpKQotICAgICAgICAgICAgICAgIGFjdGlvbnMuYWRkKHN0YXRpY19jYXN0PHVpbnQ2NF90Pihn
ZXRCaXRzPHVuc2lnbmVkPihtX2J5dGVjb2RlLCBtX2J5dGVjb2RlTGVuZ3RoLCBwcm9ncmFtQ291
bnRlciArIHNpemVvZihERkFCeXRlY29kZSkgKyBzaXplb2YodWludDE2X3QpKSkpOwotICAgICAg
ICAgICAgcHJvZ3JhbUNvdW50ZXIgKz0gaW5zdHJ1Y3Rpb25TaXplV2l0aEFyZ3VtZW50cyhERkFC
eXRlY29kZUluc3RydWN0aW9uOjpUZXN0RmxhZ3NBbmRBcHBlbmRBY3Rpb24pOwotICAgICAgICAg
ICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJU
X05PVF9SRUFDSEVEKCk7IC8vIEludmFsaWQgYnl0ZWNvZGUuCisgICAgICAgIAorICAgICAgICAv
LyBJbnRlcnByZXQgdGhlIGJ5dGVjb2RlIGZyb20gdGhpcyBERkEuCisgICAgICAgIC8vIFRoaXMg
c2hvdWxkIGFsd2F5cyB0ZXJtaW5hdGUgaWYgaW50ZXJwcmV0aW5nIGNvcnJlY3RseSBjb21waWxl
ZCBieXRlY29kZS4KKyAgICAgICAgdW5zaWduZWQgdXJsSW5kZXggPSAwOworICAgICAgICBib29s
IHVybEluZGV4SXNBZnRlckVuZE9mU3RyaW5nID0gZmFsc2U7CisgICAgICAgIHdoaWxlICh0cnVl
KSB7CisgICAgICAgICAgICBBU1NFUlQocHJvZ3JhbUNvdW50ZXIgPD0gbV9ieXRlY29kZUxlbmd0
aCk7CisgICAgICAgICAgICBzd2l0Y2ggKHN0YXRpY19jYXN0PERGQUJ5dGVjb2RlSW5zdHJ1Y3Rp
b24+KG1fYnl0ZWNvZGVbcHJvZ3JhbUNvdW50ZXJdKSkgeworCisgICAgICAgICAgICBjYXNlIERG
QUJ5dGVjb2RlSW5zdHJ1Y3Rpb246OlRlcm1pbmF0ZToKKyAgICAgICAgICAgICAgICBnb3RvIG5l
eHRERkE7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgY2FzZSBERkFCeXRlY29k
ZUluc3RydWN0aW9uOjpDaGVja1ZhbHVlOgorICAgICAgICAgICAgICAgIGlmICh1cmxJbmRleElz
QWZ0ZXJFbmRPZlN0cmluZykKKyAgICAgICAgICAgICAgICAgICAgZ290byBuZXh0REZBOworCisg
ICAgICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0
aGUgdXJsIGlzIHRoZSB2YWx1ZSBzdG9yZWQgd2l0aCB0aGUgYnl0ZWNvZGUuCisgICAgICAgICAg
ICAgICAgaWYgKHVybFt1cmxJbmRleF0gPT0gZ2V0Qml0czx1aW50OF90PihtX2J5dGVjb2RlLCBt
X2J5dGVjb2RlTGVuZ3RoLCBwcm9ncmFtQ291bnRlciArIHNpemVvZihERkFCeXRlY29kZSkpKSB7
CisgICAgICAgICAgICAgICAgICAgIHByb2dyYW1Db3VudGVyID0gZ2V0Qml0czx1bnNpZ25lZD4o
bV9ieXRlY29kZSwgbV9ieXRlY29kZUxlbmd0aCwgcHJvZ3JhbUNvdW50ZXIgKyBzaXplb2YoREZB
Qnl0ZWNvZGUpICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF1
cmxbdXJsSW5kZXhdKQorICAgICAgICAgICAgICAgICAgICAgICAgdXJsSW5kZXhJc0FmdGVyRW5k
T2ZTdHJpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB1cmxJbmRleCsrOyAvLyBUaGlz
IHJlcHJlc2VudHMgYW4gZWRnZSBpbiB0aGUgREZBLgorICAgICAgICAgICAgICAgIH0gZWxzZQor
ICAgICAgICAgICAgICAgICAgICBwcm9ncmFtQ291bnRlciArPSBpbnN0cnVjdGlvblNpemVXaXRo
QXJndW1lbnRzKERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb246OkNoZWNrVmFsdWUpOworICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgREZB
Qnl0ZWNvZGVJbnN0cnVjdGlvbjo6Q2hlY2tWYWx1ZVJhbmdlOiB7CisgICAgICAgICAgICAgICAg
aWYgKHVybEluZGV4SXNBZnRlckVuZE9mU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICBnb3Rv
IG5leHRERkE7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgY2hhciBjaGFyYWN0
ZXIgPSB1cmxbdXJsSW5kZXhdOworICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXIgPj0gZ2V0
Qml0czx1aW50OF90PihtX2J5dGVjb2RlLCBtX2J5dGVjb2RlTGVuZ3RoLCBwcm9ncmFtQ291bnRl
ciArIHNpemVvZihERkFCeXRlY29kZSkpCisgICAgICAgICAgICAgICAgICAgICYmIGNoYXJhY3Rl
ciA8PSBnZXRCaXRzPHVpbnQ4X3Q+KG1fYnl0ZWNvZGUsIG1fYnl0ZWNvZGVMZW5ndGgsIHByb2dy
YW1Db3VudGVyICsgc2l6ZW9mKERGQUJ5dGVjb2RlKSArIHNpemVvZih1aW50OF90KSkpIHsKKyAg
ICAgICAgICAgICAgICAgICAgcHJvZ3JhbUNvdW50ZXIgPSBnZXRCaXRzPHVuc2lnbmVkPihtX2J5
dGVjb2RlLCBtX2J5dGVjb2RlTGVuZ3RoLCBwcm9ncmFtQ291bnRlciArIHNpemVvZihERkFCeXRl
Y29kZSkgKyBzaXplb2YodWludDhfdCkgKyBzaXplb2YodWludDhfdCkpOworICAgICAgICAgICAg
ICAgICAgICBpZiAoIWNoYXJhY3RlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIHVybEluZGV4
SXNBZnRlckVuZE9mU3RyaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgdXJsSW5kZXgr
KzsgLy8gVGhpcyByZXByZXNlbnRzIGFuIGVkZ2UgaW4gdGhlIERGQS4KKyAgICAgICAgICAgICAg
ICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbUNvdW50ZXIgKz0gaW5zdHJ1Y3Rp
b25TaXplV2l0aEFyZ3VtZW50cyhERkFCeXRlY29kZUluc3RydWN0aW9uOjpDaGVja1ZhbHVlUmFu
Z2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICBjYXNlIERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb246Okp1bXA6CisgICAgICAgICAgICAgICAgaWYg
KCF1cmxbdXJsSW5kZXhdIHx8IHVybEluZGV4SXNBZnRlckVuZE9mU3RyaW5nKQorICAgICAgICAg
ICAgICAgICAgICBnb3RvIG5leHRERkE7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAg
ICAgcHJvZ3JhbUNvdW50ZXIgPSBnZXRCaXRzPHVuc2lnbmVkPihtX2J5dGVjb2RlLCBtX2J5dGVj
b2RlTGVuZ3RoLCBwcm9ncmFtQ291bnRlciArIHNpemVvZihERkFCeXRlY29kZSkpOworICAgICAg
ICAgICAgICAgIHVybEluZGV4Kys7IC8vIFRoaXMgcmVwcmVzZW50cyBhbiBlZGdlIGluIHRoZSBE
RkEuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAg
ICAgICAgY2FzZSBERkFCeXRlY29kZUluc3RydWN0aW9uOjpBcHBlbmRBY3Rpb246CisgICAgICAg
ICAgICAgICAgYWN0aW9ucy5hZGQoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGdldEJpdHM8dW5zaWdu
ZWQ+KG1fYnl0ZWNvZGUsIG1fYnl0ZWNvZGVMZW5ndGgsIHByb2dyYW1Db3VudGVyICsgc2l6ZW9m
KERGQUJ5dGVjb2RlKSkpKTsKKyAgICAgICAgICAgICAgICBwcm9ncmFtQ291bnRlciArPSBpbnN0
cnVjdGlvblNpemVXaXRoQXJndW1lbnRzKERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb246OkFwcGVuZEFj
dGlvbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIAorICAg
ICAgICAgICAgY2FzZSBERkFCeXRlY29kZUluc3RydWN0aW9uOjpUZXN0RmxhZ3NBbmRBcHBlbmRB
Y3Rpb246CisgICAgICAgICAgICAgICAgaWYgKGZsYWdzICYgZ2V0Qml0czx1aW50MTZfdD4obV9i
eXRlY29kZSwgbV9ieXRlY29kZUxlbmd0aCwgcHJvZ3JhbUNvdW50ZXIgKyBzaXplb2YoREZBQnl0
ZWNvZGUpKSkKKyAgICAgICAgICAgICAgICAgICAgYWN0aW9ucy5hZGQoc3RhdGljX2Nhc3Q8dWlu
dDY0X3Q+KGdldEJpdHM8dW5zaWduZWQ+KG1fYnl0ZWNvZGUsIG1fYnl0ZWNvZGVMZW5ndGgsIHBy
b2dyYW1Db3VudGVyICsgc2l6ZW9mKERGQUJ5dGVjb2RlKSArIHNpemVvZih1aW50MTZfdCkpKSk7
CisgICAgICAgICAgICAgICAgcHJvZ3JhbUNvdW50ZXIgKz0gaW5zdHJ1Y3Rpb25TaXplV2l0aEFy
Z3VtZW50cyhERkFCeXRlY29kZUluc3RydWN0aW9uOjpUZXN0RmxhZ3NBbmRBcHBlbmRBY3Rpb24p
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAg
ICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgUkVMRUFTRV9BU1NFUlRfTk9UX1JFQUNIRUQo
KTsgLy8gSW52YWxpZCBieXRlY29kZS4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFdl
IHNob3VsZCBhbHdheXMgdGVybWluYXRlIGJlZm9yZSBvciBhdCBhIG51bGwgY2hhcmFjdGVyIGF0
IHRoZSBlbmQgb2YgYSBTdHJpbmcuCisgICAgICAgICAgICBBU1NFUlQodXJsSW5kZXggPD0gdXJs
Q1N0cmluZy5sZW5ndGgoKSB8fCAodXJsSW5kZXhJc0FmdGVyRW5kT2ZTdHJpbmcgJiYgdXJsSW5k
ZXggPD0gdXJsQ1N0cmluZy5sZW5ndGgoKSArIDEpKTsKICAgICAgICAgfQotICAgICAgICAvLyBX
ZSBzaG91bGQgYWx3YXlzIHRlcm1pbmF0ZSBiZWZvcmUgb3IgYXQgYSBudWxsIGNoYXJhY3RlciBh
dCB0aGUgZW5kIG9mIGEgU3RyaW5nLgotICAgICAgICBBU1NFUlQodXJsSW5kZXggPD0gdXJsQ1N0
cmluZy5sZW5ndGgoKSB8fCAodXJsSW5kZXhJc0FmdGVyRW5kT2ZTdHJpbmcgJiYgdXJsSW5kZXgg
PD0gdXJsQ1N0cmluZy5sZW5ndGgoKSArIDEpKTsKKyAgICAgICAgbmV4dERGQToKKyAgICAgICAg
cHJvZ3JhbUNvdW50ZXIgPSBkZmFTdGFydCArIGRmYUJ5dGVjb2RlTGVuZ3RoOwogICAgIH0KLSAg
ICBSRUxFQVNFX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiBhY3Rpb25zOwogfQog
CiB9IC8vIG5hbWVzcGFjZSBDb250ZW50RXh0ZW5zaW9ucwo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>249375</attachid>
            <date>2015-03-24 18:55:02 -0700</date>
            <delta_ts>2015-03-24 22:16:20 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-143010-20150324185425.patch</filename>
            <type>text/plain</type>
            <size>22441</size>
            <attacher name="Alex Christensen">achristensen</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE4MTkyNSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI3IEBACisyMDE1LTAzLTI0ICBBbGV4IENo
cmlzdGVuc2VuICA8YWNocmlzdGVuc2VuQHdlYmtpdC5vcmc+CisKKyAgICAgICAgW0NvbnRlbnQg
RXh0ZW5zaW9uc10gQWRkIG11bHRpLURGQSBjb21waWxpbmcgYW5kIGludGVycHJldGluZy4KKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0MzAxMAorCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogY29udGVudGV4
dGVuc2lvbnMvQ29udGVudEV4dGVuc2lvbkNvbXBpbGVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OkNvbnRlbnRFeHRlbnNpb25zOjpjb21waWxlUnVsZUxpc3QpOgorICAgICAgICBDb21waWxlIG11
bHRpcGxlIE5GQXMgdG8gREZBcy4KKyAgICAgICAgKiBjb250ZW50ZXh0ZW5zaW9ucy9Db250ZW50
RXh0ZW5zaW9uc0JhY2tlbmQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Q29udGVudEV4dGVuc2lv
bnM6OkNvbnRlbnRFeHRlbnNpb25zQmFja2VuZDo6YWN0aW9uc0ZvclJlc291cmNlTG9hZCk6Cisg
ICAgICAgIEZpeGVkIGEgYnVnIHdoZW4gdGhlcmUgYXJlIG5vIG5vbi11bml2ZXJzYWwgYWN0aW9u
cy4KKyAgICAgICAgV2Ugc3RpbGwgbmVlZCB0byByZXBvcnQgdGhhdCBubyBpZ25vcmUtcHJldmlv
dXMtcnVsZXMgd2FzIGhpdCB0byBhcHBseSB0aGUKKyAgICAgICAgdW5pdmVyc2FsIGFjdGlvbnMg
d2hpY2ggYXJlIG5vdyBhY2Nlc3NlZCB0aHJvdWdoIERGQUJ5dGVjb2RlSW50ZXJwcmV0ZXI6OmFj
dGlvbnNGcm9tREZBUm9vdAorICAgICAgICBhbmQgc2tpcHBlZCBpbiBERkFCeXRlY29kZUludGVy
cHJldGVyOjppbnRlcnByZXQuCisgICAgICAgICogY29udGVudGV4dGVuc2lvbnMvREZBQnl0ZWNv
ZGVDb21waWxlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDb250ZW50RXh0ZW5zaW9uczo6REZB
Qnl0ZWNvZGVDb21waWxlcjo6Y29tcGlsZSk6CisgICAgICAgIEFkZCBhIGhlYWRlciBmb3IgZWFj
aCBERkEuCisgICAgICAgICogY29udGVudGV4dGVuc2lvbnMvREZBQnl0ZWNvZGVJbnRlcnByZXRl
ci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpDb250ZW50RXh0ZW5zaW9uczo6REZBQnl0ZWNvZGVJ
bnRlcnByZXRlcjo6YWN0aW9uc0Zyb21ERkFSb290KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbnRl
bnRFeHRlbnNpb25zOjpERkFCeXRlY29kZUludGVycHJldGVyOjppbnRlcnByZXQpOgorICAgICAg
ICBJbnRlcnByZXQgYXMgbWFueSBERkFzIGFzIHRoZXJlIGFyZSBpbiB0aGUgYnl0ZWNvZGUuCisK
IDIwMTUtMDMtMjQgIFpodW8gTGkgIDx6YWNobGlAYXBwbGUuY29tPgogCiAgICAgICAgIFNjcmlw
dHMgcnVubmluZyBpbiBpc29sYXRlZCB3b3JsZCBzaG91bGQgbm90IHN1YmplY3QgdG8gYSBwYWdl
J3MgQ1NQIGFib3V0ICdldmFsJy4KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2NvbnRlbnRleHRlbnNp
b25zL0NvbnRlbnRFeHRlbnNpb25Db21waWxlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dl
YkNvcmUvY29udGVudGV4dGVuc2lvbnMvQ29udGVudEV4dGVuc2lvbkNvbXBpbGVyLmNwcAkocmV2
aXNpb24gMTgxODgwKQorKysgU291cmNlL1dlYkNvcmUvY29udGVudGV4dGVuc2lvbnMvQ29udGVu
dEV4dGVuc2lvbkNvbXBpbGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMTExLDE2ICsxMTEsMjMg
QEAgQ29tcGlsZWRDb250ZW50RXh0ZW5zaW9uRGF0YSBjb21waWxlUnVsZQogICAgIFZlY3Rvcjx1
bnNpZ25lZD4gYWN0aW9uTG9jYXRpb25zID0gc2VyaWFsaXplQWN0aW9ucyhwYXJzZWRSdWxlTGlz
dCwgYWN0aW9ucyk7CiAgICAgVmVjdG9yPHVpbnQ2NF90PiB1bml2ZXJzYWxBY3Rpb25Mb2NhdGlv
bnM7CiAKLSAgICBORkEgbmZhOwotICAgIFVSTEZpbHRlclBhcnNlciB1cmxGaWx0ZXJQYXJzZXIo
bmZhKTsKKyAgICBWZWN0b3I8TkZBPiBuZmFzOworICAgIG5mYXMuYXBwZW5kKE5GQSgpKTsKICAg
ICBib29sIG5vblVuaXZlcnNhbEFjdGlvblNlZW4gPSBmYWxzZTsKICAgICBmb3IgKHVuc2lnbmVk
IHJ1bGVJbmRleCA9IDA7IHJ1bGVJbmRleCA8IHBhcnNlZFJ1bGVMaXN0LnNpemUoKTsgKytydWxl
SW5kZXgpIHsKKworICAgICAgICAvLyBGSVhNRTogVHVuZSB0aGlzIGJldHRlciBhbmQgYWRqdXN0
IENvbnRlbnRFeHRlbnNpb25UZXN0Lk11bHRpREZBIGFjY29yZGluZ2x5LgorICAgICAgICBpZiAo
bmZhc1tuZmFzLnNpemUoKSAtIDFdLmdyYXBoU2l6ZSgpID4gNTAwKQorICAgICAgICAgICAgbmZh
cy5hcHBlbmQoTkZBKCkpOworCisgICAgICAgIE5GQSYgbGFzdE5GQSA9IG5mYXNbbmZhcy5zaXpl
KCkgLSAxXTsKKyAgICAgICAgVVJMRmlsdGVyUGFyc2VyIHVybEZpbHRlclBhcnNlcihsYXN0TkZB
KTsKICAgICAgICAgY29uc3QgQ29udGVudEV4dGVuc2lvblJ1bGUmIGNvbnRlbnRFeHRlbnNpb25S
dWxlID0gcGFyc2VkUnVsZUxpc3RbcnVsZUluZGV4XTsKICAgICAgICAgY29uc3QgVHJpZ2dlciYg
dHJpZ2dlciA9IGNvbnRlbnRFeHRlbnNpb25SdWxlLnRyaWdnZXIoKTsKICAgICAgICAgQVNTRVJU
KHRyaWdnZXIudXJsRmlsdGVyLmxlbmd0aCgpKTsKIAogICAgICAgICAvLyBIaWdoIGJpdHMgYXJl
IHVzZWQgZm9yIGZsYWdzLiBUaGlzIHNob3VsZCBtYXRjaCBob3cgdGhleSBhcmUgdXNlZCBpbiBE
RkFCeXRlY29kZUNvbXBpbGVyOjpjb21waWxlTm9kZS4KLSAgICAgICAgdWludDY0X3QgYWN0aW9u
TG9jYXRpb25BbmRGbGFncyA9KHN0YXRpY19jYXN0PHVpbnQ2NF90Pih0cmlnZ2VyLmZsYWdzKSA8
PCAzMikgfCBzdGF0aWNfY2FzdDx1aW50NjRfdD4oYWN0aW9uTG9jYXRpb25zW3J1bGVJbmRleF0p
OworICAgICAgICB1aW50NjRfdCBhY3Rpb25Mb2NhdGlvbkFuZEZsYWdzID0gKHN0YXRpY19jYXN0
PHVpbnQ2NF90Pih0cmlnZ2VyLmZsYWdzKSA8PCAzMikgfCBzdGF0aWNfY2FzdDx1aW50NjRfdD4o
YWN0aW9uTG9jYXRpb25zW3J1bGVJbmRleF0pOwogICAgICAgICBVUkxGaWx0ZXJQYXJzZXI6OlBh
cnNlU3RhdHVzIHN0YXR1cyA9IHVybEZpbHRlclBhcnNlci5hZGRQYXR0ZXJuKHRyaWdnZXIudXJs
RmlsdGVyLCB0cmlnZ2VyLnVybEZpbHRlcklzQ2FzZVNlbnNpdGl2ZSwgYWN0aW9uTG9jYXRpb25B
bmRGbGFncyk7CiAKICAgICAgICAgaWYgKHN0YXR1cyA9PSBVUkxGaWx0ZXJQYXJzZXI6Ok1hdGNo
ZXNFdmVyeXRoaW5nKSB7CkBAIC0xNDksOSArMTU2LDE3IEBAIENvbXBpbGVkQ29udGVudEV4dGVu
c2lvbkRhdGEgY29tcGlsZVJ1bGUKICAgICBkb3VibGUgZGZhQnVpbGRUaW1lU3RhcnQgPSBtb25v
dG9uaWNhbGx5SW5jcmVhc2luZ1RpbWUoKTsKICNlbmRpZgogCi0gICAgREZBIGRmYSA9IE5GQVRv
REZBOjpjb252ZXJ0KG5mYSk7Ci0gICAgZm9yICh1aW50NjRfdCBhY3Rpb25Mb2NhdGlvbiA6IHVu
aXZlcnNhbEFjdGlvbkxvY2F0aW9ucykKLSAgICAgICAgZGZhLm5vZGVBdChkZmEucm9vdCgpKS5h
Y3Rpb25zLmFwcGVuZChhY3Rpb25Mb2NhdGlvbik7CisgICAgVmVjdG9yPERGQUJ5dGVjb2RlPiBi
eXRlY29kZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5mYXMuc2l6ZSgpOyArK2kpIHsK
KyAgICAgICAgREZBIGRmYSA9IE5GQVRvREZBOjpjb252ZXJ0KG5mYXNbaV0pOworICAgICAgICBp
ZiAoIWkpIHsKKyAgICAgICAgICAgIC8vIFB1dCBhbGwgdGhlIHVuaXZlcnNhbCBhY3Rpb25zIG9u
IHRoZSBmaXJzdCBERkEuCisgICAgICAgICAgICBmb3IgKHVpbnQ2NF90IGFjdGlvbkxvY2F0aW9u
IDogdW5pdmVyc2FsQWN0aW9uTG9jYXRpb25zKQorICAgICAgICAgICAgICAgIGRmYS5ub2RlQXQo
ZGZhLnJvb3QoKSkuYWN0aW9ucy5hcHBlbmQoYWN0aW9uTG9jYXRpb24pOworICAgICAgICB9Cisg
ICAgICAgIERGQUJ5dGVjb2RlQ29tcGlsZXIgY29tcGlsZXIoZGZhLCBieXRlY29kZSk7CisgICAg
ICAgIGNvbXBpbGVyLmNvbXBpbGUoKTsKKyAgICB9CiAKICNpZiBDT05URU5UX0VYVEVOU0lPTlNf
UEVSRk9STUFOQ0VfUkVQT1JUSU5HCiAgICAgZG91YmxlIGRmYUJ1aWxkVGltZUVuZCA9IG1vbm90
b25pY2FsbHlJbmNyZWFzaW5nVGltZSgpOwpAQCAtMTY0LDEwICsxNzksNiBAQCBDb21waWxlZENv
bnRlbnRFeHRlbnNpb25EYXRhIGNvbXBpbGVSdWxlCiAgICAgZGZhLmRlYnVnUHJpbnREb3QoKTsK
ICNlbmRpZgogCi0gICAgVmVjdG9yPERGQUJ5dGVjb2RlPiBieXRlY29kZTsKLSAgICBERkFCeXRl
Y29kZUNvbXBpbGVyIGNvbXBpbGVyKGRmYSwgYnl0ZWNvZGUpOwotICAgIGNvbXBpbGVyLmNvbXBp
bGUoKTsKLQogICAgIHJldHVybiB7IFdURjo6bW92ZShieXRlY29kZSksIFdURjo6bW92ZShhY3Rp
b25zKSB9OwogfQogCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jb250ZW50ZXh0ZW5zaW9ucy9Db250
ZW50RXh0ZW5zaW9uc0JhY2tlbmQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2Nv
bnRlbnRleHRlbnNpb25zL0NvbnRlbnRFeHRlbnNpb25zQmFja2VuZC5jcHAJKHJldmlzaW9uIDE4
MTg4MykKKysrIFNvdXJjZS9XZWJDb3JlL2NvbnRlbnRleHRlbnNpb25zL0NvbnRlbnRFeHRlbnNp
b25zQmFja2VuZC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTgwLDYgKzgwLDcgQEAgVmVjdG9yPEFj
dGlvbj4gQ29udGVudEV4dGVuc2lvbnNCYWNrZW5kOgogICAgICAgICBjb25zdCBTZXJpYWxpemVk
QWN0aW9uQnl0ZSogYWN0aW9ucyA9IGNvbXBpbGVkRXh0ZW5zaW9uLmFjdGlvbnMoKTsKICAgICAg
ICAgY29uc3QgdW5zaWduZWQgYWN0aW9uc0xlbmd0aCA9IGNvbXBpbGVkRXh0ZW5zaW9uLmFjdGlv
bnNMZW5ndGgoKTsKICAgICAgICAgCisgICAgICAgIGJvb2wgc2F3SWdub3JlUHJldmlvdXNSdWxl
cyA9IGZhbHNlOwogICAgICAgICBpZiAoIXRyaWdnZXJlZEFjdGlvbnMuaXNFbXB0eSgpKSB7CiAg
ICAgICAgICAgICBWZWN0b3I8dW5zaWduZWQ+IGFjdGlvbkxvY2F0aW9uczsKICAgICAgICAgICAg
IGFjdGlvbkxvY2F0aW9ucy5yZXNlcnZlSW5pdGlhbENhcGFjaXR5KHRyaWdnZXJlZEFjdGlvbnMu
c2l6ZSgpKTsKQEAgLTg3LDggKzg4LDYgQEAgVmVjdG9yPEFjdGlvbj4gQ29udGVudEV4dGVuc2lv
bnNCYWNrZW5kOgogICAgICAgICAgICAgICAgIGFjdGlvbkxvY2F0aW9ucy5hcHBlbmQoc3RhdGlj
X2Nhc3Q8dW5zaWduZWQ+KGFjdGlvbkxvY2F0aW9uKSk7CiAgICAgICAgICAgICBzdGQ6OnNvcnQo
YWN0aW9uTG9jYXRpb25zLmJlZ2luKCksIGFjdGlvbkxvY2F0aW9ucy5lbmQoKSk7CiAKLSAgICAg
ICAgICAgIGJvb2wgc2F3SWdub3JlUHJldmlvdXNSdWxlcyA9IGZhbHNlOwotCiAgICAgICAgICAg
ICAvLyBBZGQgYWN0aW9ucyBpbiByZXZlcnNlIG9yZGVyIHRvIHByb3Blcmx5IGRlYWwgd2l0aCBJ
Z25vcmVQcmV2aW91c1J1bGVzLgogICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gYWN0aW9u
TG9jYXRpb25zLnNpemUoKTsgaTsgaS0tKSB7CiAgICAgICAgICAgICAgICAgQWN0aW9uIGFjdGlv
biA9IEFjdGlvbjo6ZGVzZXJpYWxpemUoYWN0aW9ucywgYWN0aW9uc0xlbmd0aCwgYWN0aW9uTG9j
YXRpb25zW2kgLSAxXSk7CkBAIC05OCwxMCArOTcsOSBAQCBWZWN0b3I8QWN0aW9uPiBDb250ZW50
RXh0ZW5zaW9uc0JhY2tlbmQ6CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGZp
bmFsQWN0aW9ucy5hcHBlbmQoYWN0aW9uKTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAg
aWYgKCFzYXdJZ25vcmVQcmV2aW91c1J1bGVzKQotICAgICAgICAgICAgICAgIGZpbmFsQWN0aW9u
cy5hcHBlbmQoQWN0aW9uKEFjdGlvblR5cGU6OkNTU0Rpc3BsYXlOb25lU3R5bGVTaGVldCwgY29u
dGVudEV4dGVuc2lvbi0+aWRlbnRpZmllcigpKSk7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKCFz
YXdJZ25vcmVQcmV2aW91c1J1bGVzKQorICAgICAgICAgICAgZmluYWxBY3Rpb25zLmFwcGVuZChB
Y3Rpb24oQWN0aW9uVHlwZTo6Q1NTRGlzcGxheU5vbmVTdHlsZVNoZWV0LCBjb250ZW50RXh0ZW5z
aW9uLT5pZGVudGlmaWVyKCkpKTsKICAgICB9CiAgICAgcmV0dXJuIGZpbmFsQWN0aW9uczsKIH0K
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL2NvbnRlbnRleHRlbnNpb25zL0RGQUJ5dGVjb2RlQ29tcGls
ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2NvbnRlbnRleHRlbnNpb25zL0RG
QUJ5dGVjb2RlQ29tcGlsZXIuY3BwCShyZXZpc2lvbiAxODE4ODApCisrKyBTb3VyY2UvV2ViQ29y
ZS9jb250ZW50ZXh0ZW5zaW9ucy9ERkFCeXRlY29kZUNvbXBpbGVyLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMTY3LDcgKzE2Nyw5IEBAIHZvaWQgREZBQnl0ZWNvZGVDb21waWxlcjo6Y29tcGlsZUNo
ZWNrRm8KIAogdm9pZCBERkFCeXRlY29kZUNvbXBpbGVyOjpjb21waWxlKCkKIHsKLSAgICBBU1NF
UlQoIW1fYnl0ZWNvZGUuc2l6ZSgpKTsKKyAgICAvLyBERkEgaGVhZGVyLgorICAgIHVuc2lnbmVk
IHN0YXJ0TG9jYXRpb24gPSBtX2J5dGVjb2RlLnNpemUoKTsKKyAgICBhcHBlbmQ8dW5zaWduZWQ+
KG1fYnl0ZWNvZGUsIDApOwogICAgIG1fbm9kZVN0YXJ0T2Zmc2V0cy5yZXNpemUobV9kZmEuc2l6
ZSgpKTsKICAgICAKICAgICAvLyBNYWtlIHN1cmUgdGhlIHJvb3QgaXMgYWx3YXlzIGF0IHRoZSBi
ZWdpbm5pbmcgb2YgdGhlIGJ5dGVjb2RlLgpAQCAtMTgwLDYgKzE4Miw5IEBAIHZvaWQgREZBQnl0
ZWNvZGVDb21waWxlcjo6Y29tcGlsZSgpCiAgICAgLy8gTGluay4KICAgICBmb3IgKGNvbnN0IGF1
dG8mIGxpbmtSZWNvcmQgOiBtX2xpbmtSZWNvcmRzKQogICAgICAgICBzZXQzMkJpdHMobV9ieXRl
Y29kZSwgbGlua1JlY29yZC5maXJzdCwgbV9ub2RlU3RhcnRPZmZzZXRzW2xpbmtSZWNvcmQuc2Vj
b25kXSk7CisgICAgCisgICAgLy8gU2V0IHNpemUgaGVhZGVyLgorICAgIHNldDMyQml0cyhtX2J5
dGVjb2RlLCBzdGFydExvY2F0aW9uLCBtX2J5dGVjb2RlLnNpemUoKSAtIHN0YXJ0TG9jYXRpb24p
OwogfQogICAgIAogfSAvLyBuYW1lc3BhY2UgQ29udGVudEV4dGVuc2lvbnMKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL2NvbnRlbnRleHRlbnNpb25zL0RGQUJ5dGVjb2RlSW50ZXJwcmV0ZXIuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2NvbnRlbnRleHRlbnNpb25zL0RGQUJ5dGVjb2Rl
SW50ZXJwcmV0ZXIuY3BwCShyZXZpc2lvbiAxODE4ODApCisrKyBTb3VyY2UvV2ViQ29yZS9jb250
ZW50ZXh0ZW5zaW9ucy9ERkFCeXRlY29kZUludGVycHJldGVyLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtNDMsMTMgKzQzLDE1IEBAIHN0YXRpYyBpbmxpbmUgSW50VHlwZSBnZXRCaXRzKGNvbnN0IERG
QUIKICAgICAKIERGQUJ5dGVjb2RlSW50ZXJwcmV0ZXI6OkFjdGlvbnMgREZBQnl0ZWNvZGVJbnRl
cnByZXRlcjo6YWN0aW9uc0Zyb21ERkFSb290KCkKIHsKLSAgICB1bnNpZ25lZCBwcm9ncmFtQ291
bnRlciA9IDA7Ci0gICAgREZBQnl0ZWNvZGVJbnRlcnByZXRlcjo6QWN0aW9ucyBnbG9iYWxBY3Rp
b25Mb2NhdGlvbnM7CisgICAgREZBQnl0ZWNvZGVJbnRlcnByZXRlcjo6QWN0aW9ucyB1bml2ZXJz
YWxBY3Rpb25Mb2NhdGlvbnM7CisKKyAgICAvLyBTa2lwIGZpcnN0IERGQSBoZWFkZXIuIEFsbCB1
bml2ZXJzYWwgYWN0aW9ucyBhcmUgaW4gdGhlIGZpcnN0IERGQSByb290LgorICAgIHVuc2lnbmVk
IHByb2dyYW1Db3VudGVyID0gc2l6ZW9mKHVuc2lnbmVkKTsKICAgICB3aGlsZSAoc3RhdGljX2Nh
c3Q8REZBQnl0ZWNvZGVJbnN0cnVjdGlvbj4obV9ieXRlY29kZVtwcm9ncmFtQ291bnRlcl0pID09
IERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb246OkFwcGVuZEFjdGlvbikgewotICAgICAgICBnbG9iYWxB
Y3Rpb25Mb2NhdGlvbnMuYWRkKHN0YXRpY19jYXN0PHVpbnQ2NF90PihnZXRCaXRzPHVuc2lnbmVk
PihtX2J5dGVjb2RlLCBtX2J5dGVjb2RlTGVuZ3RoLCBwcm9ncmFtQ291bnRlciArIHNpemVvZihE
RkFCeXRlY29kZSkpKSk7CisgICAgICAgIHVuaXZlcnNhbEFjdGlvbkxvY2F0aW9ucy5hZGQoc3Rh
dGljX2Nhc3Q8dWludDY0X3Q+KGdldEJpdHM8dW5zaWduZWQ+KG1fYnl0ZWNvZGUsIG1fYnl0ZWNv
ZGVMZW5ndGgsIHByb2dyYW1Db3VudGVyICsgc2l6ZW9mKERGQUJ5dGVjb2RlKSkpKTsKICAgICAg
ICAgcHJvZ3JhbUNvdW50ZXIgKz0gaW5zdHJ1Y3Rpb25TaXplV2l0aEFyZ3VtZW50cyhERkFCeXRl
Y29kZUluc3RydWN0aW9uOjpBcHBlbmRBY3Rpb24pOwogICAgIH0KLSAgICByZXR1cm4gZ2xvYmFs
QWN0aW9uTG9jYXRpb25zOworICAgIHJldHVybiB1bml2ZXJzYWxBY3Rpb25Mb2NhdGlvbnM7CiB9
CiAgICAgCiBERkFCeXRlY29kZUludGVycHJldGVyOjpBY3Rpb25zIERGQUJ5dGVjb2RlSW50ZXJw
cmV0ZXI6OmludGVycHJldChjb25zdCBDU3RyaW5nJiB1cmxDU3RyaW5nLCB1aW50MTZfdCBmbGFn
cykKQEAgLTU3LDc4ICs1OSw5MiBAQCBERkFCeXRlY29kZUludGVycHJldGVyOjpBY3Rpb25zIERG
QUJ5dGVjCiAgICAgY29uc3QgY2hhciogdXJsID0gdXJsQ1N0cmluZy5kYXRhKCk7CiAgICAgQVNT
RVJUKHVybCk7CiAgICAgCi0gICAgdW5zaWduZWQgcHJvZ3JhbUNvdW50ZXIgPSAwOwotICAgIHVu
c2lnbmVkIHVybEluZGV4ID0gMDsKLSAgICBib29sIHVybEluZGV4SXNBZnRlckVuZE9mU3RyaW5n
ID0gZmFsc2U7CiAgICAgQWN0aW9ucyBhY3Rpb25zOwogICAgIAotICAgIHdoaWxlIChzdGF0aWNf
Y2FzdDxERkFCeXRlY29kZUluc3RydWN0aW9uPihtX2J5dGVjb2RlW3Byb2dyYW1Db3VudGVyXSkg
PT0gREZBQnl0ZWNvZGVJbnN0cnVjdGlvbjo6QXBwZW5kQWN0aW9uKQotICAgICAgICBwcm9ncmFt
Q291bnRlciArPSBpbnN0cnVjdGlvblNpemVXaXRoQXJndW1lbnRzKERGQUJ5dGVjb2RlSW5zdHJ1
Y3Rpb246OkFwcGVuZEFjdGlvbik7Ci0KLSAgICAvLyBUaGlzIHNob3VsZCBhbHdheXMgdGVybWlu
YXRlIGlmIGludGVycHJldGluZyBjb3JyZWN0bHkgY29tcGlsZWQgYnl0ZWNvZGUuCi0gICAgd2hp
bGUgKHRydWUpIHsKLSAgICAgICAgQVNTRVJUKHByb2dyYW1Db3VudGVyIDw9IG1fYnl0ZWNvZGVM
ZW5ndGgpOwotICAgICAgICBzd2l0Y2ggKHN0YXRpY19jYXN0PERGQUJ5dGVjb2RlSW5zdHJ1Y3Rp
b24+KG1fYnl0ZWNvZGVbcHJvZ3JhbUNvdW50ZXJdKSkgewotCi0gICAgICAgIGNhc2UgREZBQnl0
ZWNvZGVJbnN0cnVjdGlvbjo6VGVybWluYXRlOgotICAgICAgICAgICAgcmV0dXJuIGFjdGlvbnM7
Ci0KLSAgICAgICAgY2FzZSBERkFCeXRlY29kZUluc3RydWN0aW9uOjpDaGVja1ZhbHVlOgotICAg
ICAgICAgICAgaWYgKHVybEluZGV4SXNBZnRlckVuZE9mU3RyaW5nKQotICAgICAgICAgICAgICAg
IHJldHVybiBhY3Rpb25zOwotCi0gICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG5l
eHQgY2hhcmFjdGVyIGluIHRoZSB1cmwgaXMgdGhlIHZhbHVlIHN0b3JlZCB3aXRoIHRoZSBieXRl
Y29kZS4KLSAgICAgICAgICAgIGlmICh1cmxbdXJsSW5kZXhdID09IGdldEJpdHM8dWludDhfdD4o
bV9ieXRlY29kZSwgbV9ieXRlY29kZUxlbmd0aCwgcHJvZ3JhbUNvdW50ZXIgKyBzaXplb2YoREZB
Qnl0ZWNvZGUpKSkgewotICAgICAgICAgICAgICAgIHByb2dyYW1Db3VudGVyID0gZ2V0Qml0czx1
bnNpZ25lZD4obV9ieXRlY29kZSwgbV9ieXRlY29kZUxlbmd0aCwgcHJvZ3JhbUNvdW50ZXIgKyBz
aXplb2YoREZBQnl0ZWNvZGUpICsgc2l6ZW9mKHVpbnQ4X3QpKTsKLSAgICAgICAgICAgICAgICBp
ZiAoIXVybFt1cmxJbmRleF0pCi0gICAgICAgICAgICAgICAgICAgIHVybEluZGV4SXNBZnRlckVu
ZE9mU3RyaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB1cmxJbmRleCsrOyAvLyBUaGlzIHJl
cHJlc2VudHMgYW4gZWRnZSBpbiB0aGUgREZBLgotICAgICAgICAgICAgfSBlbHNlCi0gICAgICAg
ICAgICAgICAgcHJvZ3JhbUNvdW50ZXIgKz0gaW5zdHJ1Y3Rpb25TaXplV2l0aEFyZ3VtZW50cyhE
RkFCeXRlY29kZUluc3RydWN0aW9uOjpDaGVja1ZhbHVlKTsKLSAgICAgICAgICAgIGJyZWFrOwot
Ci0gICAgICAgIGNhc2UgREZBQnl0ZWNvZGVJbnN0cnVjdGlvbjo6Q2hlY2tWYWx1ZVJhbmdlOiB7
Ci0gICAgICAgICAgICBpZiAodXJsSW5kZXhJc0FmdGVyRW5kT2ZTdHJpbmcpCi0gICAgICAgICAg
ICAgICAgcmV0dXJuIGFjdGlvbnM7Ci0KLSAgICAgICAgICAgIGNoYXIgY2hhcmFjdGVyID0gdXJs
W3VybEluZGV4XTsKLSAgICAgICAgICAgIGlmIChjaGFyYWN0ZXIgPj0gZ2V0Qml0czx1aW50OF90
PihtX2J5dGVjb2RlLCBtX2J5dGVjb2RlTGVuZ3RoLCBwcm9ncmFtQ291bnRlciArIHNpemVvZihE
RkFCeXRlY29kZSkpCi0gICAgICAgICAgICAgICAgJiYgY2hhcmFjdGVyIDw9IGdldEJpdHM8dWlu
dDhfdD4obV9ieXRlY29kZSwgbV9ieXRlY29kZUxlbmd0aCwgcHJvZ3JhbUNvdW50ZXIgKyBzaXpl
b2YoREZBQnl0ZWNvZGUpICsgc2l6ZW9mKHVpbnQ4X3QpKSkgewotICAgICAgICAgICAgICAgIHBy
b2dyYW1Db3VudGVyID0gZ2V0Qml0czx1bnNpZ25lZD4obV9ieXRlY29kZSwgbV9ieXRlY29kZUxl
bmd0aCwgcHJvZ3JhbUNvdW50ZXIgKyBzaXplb2YoREZBQnl0ZWNvZGUpICsgc2l6ZW9mKHVpbnQ4
X3QpICsgc2l6ZW9mKHVpbnQ4X3QpKTsKLSAgICAgICAgICAgICAgICBpZiAoIWNoYXJhY3RlcikK
LSAgICAgICAgICAgICAgICAgICAgdXJsSW5kZXhJc0FmdGVyRW5kT2ZTdHJpbmcgPSB0cnVlOwot
ICAgICAgICAgICAgICAgIHVybEluZGV4Kys7IC8vIFRoaXMgcmVwcmVzZW50cyBhbiBlZGdlIGlu
IHRoZSBERkEuCi0gICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBwcm9ncmFtQ291
bnRlciArPSBpbnN0cnVjdGlvblNpemVXaXRoQXJndW1lbnRzKERGQUJ5dGVjb2RlSW5zdHJ1Y3Rp
b246OkNoZWNrVmFsdWVSYW5nZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0g
ICAgICAgIGNhc2UgREZBQnl0ZWNvZGVJbnN0cnVjdGlvbjo6SnVtcDoKLSAgICAgICAgICAgIGlm
ICghdXJsW3VybEluZGV4XSB8fCB1cmxJbmRleElzQWZ0ZXJFbmRPZlN0cmluZykKLSAgICAgICAg
ICAgICAgICByZXR1cm4gYWN0aW9uczsKLQotICAgICAgICAgICAgcHJvZ3JhbUNvdW50ZXIgPSBn
ZXRCaXRzPHVuc2lnbmVkPihtX2J5dGVjb2RlLCBtX2J5dGVjb2RlTGVuZ3RoLCBwcm9ncmFtQ291
bnRlciArIHNpemVvZihERkFCeXRlY29kZSkpOwotICAgICAgICAgICAgdXJsSW5kZXgrKzsgLy8g
VGhpcyByZXByZXNlbnRzIGFuIGVkZ2UgaW4gdGhlIERGQS4KLSAgICAgICAgICAgIGJyZWFrOwor
ICAgIHVuc2lnbmVkIHByb2dyYW1Db3VudGVyID0gMDsKKyAgICB3aGlsZSAocHJvZ3JhbUNvdW50
ZXIgPCBtX2J5dGVjb2RlTGVuZ3RoKSB7CiAKLSAgICAgICAgY2FzZSBERkFCeXRlY29kZUluc3Ry
dWN0aW9uOjpBcHBlbmRBY3Rpb246Ci0gICAgICAgICAgICBhY3Rpb25zLmFkZChzdGF0aWNfY2Fz
dDx1aW50NjRfdD4oZ2V0Qml0czx1bnNpZ25lZD4obV9ieXRlY29kZSwgbV9ieXRlY29kZUxlbmd0
aCwgcHJvZ3JhbUNvdW50ZXIgKyBzaXplb2YoREZBQnl0ZWNvZGUpKSkpOworICAgICAgICAvLyBE
RkEgaGVhZGVyLgorICAgICAgICB1bnNpZ25lZCBkZmFTdGFydCA9IHByb2dyYW1Db3VudGVyOwor
ICAgICAgICB1bnNpZ25lZCBkZmFCeXRlY29kZUxlbmd0aCA9IGdldEJpdHM8dW5zaWduZWQ+KG1f
Ynl0ZWNvZGUsIG1fYnl0ZWNvZGVMZW5ndGgsIHByb2dyYW1Db3VudGVyKTsKKyAgICAgICAgcHJv
Z3JhbUNvdW50ZXIgKz0gc2l6ZW9mKHVuc2lnbmVkKTsKKworICAgICAgICAvLyBTa2lwIHRoZSB1
bml2ZXJzYWwgYWN0aW9ucy4KKyAgICAgICAgLy8gRklYTUU6IFJlcGxhY2UgQXBwZW5kQWN0aW9u
IHdpdGggQXBwZW5kQWN0aW9ucyB0byBtYWtlIHRoaXMganVzdCBvbmUganVtcCBhbmQgbWFrZSBz
dXJlIHRoZXJlIGFyZW4ndCB1bml2ZXJzYWwgYWN0aW9ucyB3aXRoIGZsYWdzLgorICAgICAgICB3
aGlsZSAoc3RhdGljX2Nhc3Q8REZBQnl0ZWNvZGVJbnN0cnVjdGlvbj4obV9ieXRlY29kZVtwcm9n
cmFtQ291bnRlcl0pID09IERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb246OkFwcGVuZEFjdGlvbikKICAg
ICAgICAgICAgIHByb2dyYW1Db3VudGVyICs9IGluc3RydWN0aW9uU2l6ZVdpdGhBcmd1bWVudHMo
REZBQnl0ZWNvZGVJbnN0cnVjdGlvbjo6QXBwZW5kQWN0aW9uKTsKLSAgICAgICAgICAgIGJyZWFr
OwotCi0gICAgICAgIGNhc2UgREZBQnl0ZWNvZGVJbnN0cnVjdGlvbjo6VGVzdEZsYWdzQW5kQXBw
ZW5kQWN0aW9uOgotICAgICAgICAgICAgaWYgKGZsYWdzICYgZ2V0Qml0czx1aW50MTZfdD4obV9i
eXRlY29kZSwgbV9ieXRlY29kZUxlbmd0aCwgcHJvZ3JhbUNvdW50ZXIgKyBzaXplb2YoREZBQnl0
ZWNvZGUpKSkKLSAgICAgICAgICAgICAgICBhY3Rpb25zLmFkZChzdGF0aWNfY2FzdDx1aW50NjRf
dD4oZ2V0Qml0czx1bnNpZ25lZD4obV9ieXRlY29kZSwgbV9ieXRlY29kZUxlbmd0aCwgcHJvZ3Jh
bUNvdW50ZXIgKyBzaXplb2YoREZBQnl0ZWNvZGUpICsgc2l6ZW9mKHVpbnQxNl90KSkpKTsKLSAg
ICAgICAgICAgIHByb2dyYW1Db3VudGVyICs9IGluc3RydWN0aW9uU2l6ZVdpdGhBcmd1bWVudHMo
REZBQnl0ZWNvZGVJbnN0cnVjdGlvbjo6VGVzdEZsYWdzQW5kQXBwZW5kQWN0aW9uKTsKLSAgICAg
ICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBSRUxFQVNFX0FT
U0VSVF9OT1RfUkVBQ0hFRCgpOyAvLyBJbnZhbGlkIGJ5dGVjb2RlLgorICAgICAgICAKKyAgICAg
ICAgLy8gSW50ZXJwcmV0IHRoZSBieXRlY29kZSBmcm9tIHRoaXMgREZBLgorICAgICAgICAvLyBU
aGlzIHNob3VsZCBhbHdheXMgdGVybWluYXRlIGlmIGludGVycHJldGluZyBjb3JyZWN0bHkgY29t
cGlsZWQgYnl0ZWNvZGUuCisgICAgICAgIHVuc2lnbmVkIHVybEluZGV4ID0gMDsKKyAgICAgICAg
Ym9vbCB1cmxJbmRleElzQWZ0ZXJFbmRPZlN0cmluZyA9IGZhbHNlOworICAgICAgICB3aGlsZSAo
dHJ1ZSkgeworICAgICAgICAgICAgQVNTRVJUKHByb2dyYW1Db3VudGVyIDw9IG1fYnl0ZWNvZGVM
ZW5ndGgpOworICAgICAgICAgICAgc3dpdGNoIChzdGF0aWNfY2FzdDxERkFCeXRlY29kZUluc3Ry
dWN0aW9uPihtX2J5dGVjb2RlW3Byb2dyYW1Db3VudGVyXSkpIHsKKworICAgICAgICAgICAgY2Fz
ZSBERkFCeXRlY29kZUluc3RydWN0aW9uOjpUZXJtaW5hdGU6CisgICAgICAgICAgICAgICAgZ290
byBuZXh0REZBOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIGNhc2UgREZBQnl0
ZWNvZGVJbnN0cnVjdGlvbjo6Q2hlY2tWYWx1ZToKKyAgICAgICAgICAgICAgICBpZiAodXJsSW5k
ZXhJc0FmdGVyRW5kT2ZTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgIGdvdG8gbmV4dERGQTsK
KworICAgICAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgbmV4dCBjaGFyYWN0ZXIg
aW4gdGhlIHVybCBpcyB0aGUgdmFsdWUgc3RvcmVkIHdpdGggdGhlIGJ5dGVjb2RlLgorICAgICAg
ICAgICAgICAgIGlmICh1cmxbdXJsSW5kZXhdID09IGdldEJpdHM8dWludDhfdD4obV9ieXRlY29k
ZSwgbV9ieXRlY29kZUxlbmd0aCwgcHJvZ3JhbUNvdW50ZXIgKyBzaXplb2YoREZBQnl0ZWNvZGUp
KSkgeworICAgICAgICAgICAgICAgICAgICBwcm9ncmFtQ291bnRlciA9IGdldEJpdHM8dW5zaWdu
ZWQ+KG1fYnl0ZWNvZGUsIG1fYnl0ZWNvZGVMZW5ndGgsIHByb2dyYW1Db3VudGVyICsgc2l6ZW9m
KERGQUJ5dGVjb2RlKSArIHNpemVvZih1aW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIGlm
ICghdXJsW3VybEluZGV4XSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVybEluZGV4SXNBZnRl
ckVuZE9mU3RyaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgdXJsSW5kZXgrKzsgLy8g
VGhpcyByZXByZXNlbnRzIGFuIGVkZ2UgaW4gdGhlIERGQS4KKyAgICAgICAgICAgICAgICB9IGVs
c2UKKyAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbUNvdW50ZXIgKz0gaW5zdHJ1Y3Rpb25TaXpl
V2l0aEFyZ3VtZW50cyhERkFCeXRlY29kZUluc3RydWN0aW9uOjpDaGVja1ZhbHVlKTsKKyAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICBjYXNl
IERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb246OkNoZWNrVmFsdWVSYW5nZTogeworICAgICAgICAgICAg
ICAgIGlmICh1cmxJbmRleElzQWZ0ZXJFbmRPZlN0cmluZykKKyAgICAgICAgICAgICAgICAgICAg
Z290byBuZXh0REZBOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGNoYXIgY2hh
cmFjdGVyID0gdXJsW3VybEluZGV4XTsKKyAgICAgICAgICAgICAgICBpZiAoY2hhcmFjdGVyID49
IGdldEJpdHM8dWludDhfdD4obV9ieXRlY29kZSwgbV9ieXRlY29kZUxlbmd0aCwgcHJvZ3JhbUNv
dW50ZXIgKyBzaXplb2YoREZBQnl0ZWNvZGUpKQorICAgICAgICAgICAgICAgICAgICAmJiBjaGFy
YWN0ZXIgPD0gZ2V0Qml0czx1aW50OF90PihtX2J5dGVjb2RlLCBtX2J5dGVjb2RlTGVuZ3RoLCBw
cm9ncmFtQ291bnRlciArIHNpemVvZihERkFCeXRlY29kZSkgKyBzaXplb2YodWludDhfdCkpKSB7
CisgICAgICAgICAgICAgICAgICAgIHByb2dyYW1Db3VudGVyID0gZ2V0Qml0czx1bnNpZ25lZD4o
bV9ieXRlY29kZSwgbV9ieXRlY29kZUxlbmd0aCwgcHJvZ3JhbUNvdW50ZXIgKyBzaXplb2YoREZB
Qnl0ZWNvZGUpICsgc2l6ZW9mKHVpbnQ4X3QpICsgc2l6ZW9mKHVpbnQ4X3QpKTsKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKCFjaGFyYWN0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICB1cmxJ
bmRleElzQWZ0ZXJFbmRPZlN0cmluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHVybElu
ZGV4Kys7IC8vIFRoaXMgcmVwcmVzZW50cyBhbiBlZGdlIGluIHRoZSBERkEuCisgICAgICAgICAg
ICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIHByb2dyYW1Db3VudGVyICs9IGluc3Ry
dWN0aW9uU2l6ZVdpdGhBcmd1bWVudHMoREZBQnl0ZWNvZGVJbnN0cnVjdGlvbjo6Q2hlY2tWYWx1
ZVJhbmdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgY2FzZSBERkFCeXRlY29kZUluc3RydWN0aW9uOjpKdW1wOgorICAgICAgICAgICAgICAg
IGlmICghdXJsW3VybEluZGV4XSB8fCB1cmxJbmRleElzQWZ0ZXJFbmRPZlN0cmluZykKKyAgICAg
ICAgICAgICAgICAgICAgZ290byBuZXh0REZBOworICAgICAgICAgICAgICAgIAorICAgICAgICAg
ICAgICAgIHByb2dyYW1Db3VudGVyID0gZ2V0Qml0czx1bnNpZ25lZD4obV9ieXRlY29kZSwgbV9i
eXRlY29kZUxlbmd0aCwgcHJvZ3JhbUNvdW50ZXIgKyBzaXplb2YoREZBQnl0ZWNvZGUpKTsKKyAg
ICAgICAgICAgICAgICB1cmxJbmRleCsrOyAvLyBUaGlzIHJlcHJlc2VudHMgYW4gZWRnZSBpbiB0
aGUgREZBLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgIGNhc2UgREZBQnl0ZWNvZGVJbnN0cnVjdGlvbjo6QXBwZW5kQWN0aW9uOgorICAg
ICAgICAgICAgICAgIGFjdGlvbnMuYWRkKHN0YXRpY19jYXN0PHVpbnQ2NF90PihnZXRCaXRzPHVu
c2lnbmVkPihtX2J5dGVjb2RlLCBtX2J5dGVjb2RlTGVuZ3RoLCBwcm9ncmFtQ291bnRlciArIHNp
emVvZihERkFCeXRlY29kZSkpKSk7CisgICAgICAgICAgICAgICAgcHJvZ3JhbUNvdW50ZXIgKz0g
aW5zdHJ1Y3Rpb25TaXplV2l0aEFyZ3VtZW50cyhERkFCeXRlY29kZUluc3RydWN0aW9uOjpBcHBl
bmRBY3Rpb24pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAK
KyAgICAgICAgICAgIGNhc2UgREZBQnl0ZWNvZGVJbnN0cnVjdGlvbjo6VGVzdEZsYWdzQW5kQXBw
ZW5kQWN0aW9uOgorICAgICAgICAgICAgICAgIGlmIChmbGFncyAmIGdldEJpdHM8dWludDE2X3Q+
KG1fYnl0ZWNvZGUsIG1fYnl0ZWNvZGVMZW5ndGgsIHByb2dyYW1Db3VudGVyICsgc2l6ZW9mKERG
QUJ5dGVjb2RlKSkpCisgICAgICAgICAgICAgICAgICAgIGFjdGlvbnMuYWRkKHN0YXRpY19jYXN0
PHVpbnQ2NF90PihnZXRCaXRzPHVuc2lnbmVkPihtX2J5dGVjb2RlLCBtX2J5dGVjb2RlTGVuZ3Ro
LCBwcm9ncmFtQ291bnRlciArIHNpemVvZihERkFCeXRlY29kZSkgKyBzaXplb2YodWludDE2X3Qp
KSkpOworICAgICAgICAgICAgICAgIHByb2dyYW1Db3VudGVyICs9IGluc3RydWN0aW9uU2l6ZVdp
dGhBcmd1bWVudHMoREZBQnl0ZWNvZGVJbnN0cnVjdGlvbjo6VGVzdEZsYWdzQW5kQXBwZW5kQWN0
aW9uKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgCisgICAg
ICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIFJFTEVBU0VfQVNTRVJUX05PVF9SRUFD
SEVEKCk7IC8vIEludmFsaWQgYnl0ZWNvZGUuCisgICAgICAgICAgICB9CisgICAgICAgICAgICAv
LyBXZSBzaG91bGQgYWx3YXlzIHRlcm1pbmF0ZSBiZWZvcmUgb3IgYXQgYSBudWxsIGNoYXJhY3Rl
ciBhdCB0aGUgZW5kIG9mIGEgU3RyaW5nLgorICAgICAgICAgICAgQVNTRVJUKHVybEluZGV4IDw9
IHVybENTdHJpbmcubGVuZ3RoKCkgfHwgKHVybEluZGV4SXNBZnRlckVuZE9mU3RyaW5nICYmIHVy
bEluZGV4IDw9IHVybENTdHJpbmcubGVuZ3RoKCkgKyAxKSk7CiAgICAgICAgIH0KLSAgICAgICAg
Ly8gV2Ugc2hvdWxkIGFsd2F5cyB0ZXJtaW5hdGUgYmVmb3JlIG9yIGF0IGEgbnVsbCBjaGFyYWN0
ZXIgYXQgdGhlIGVuZCBvZiBhIFN0cmluZy4KLSAgICAgICAgQVNTRVJUKHVybEluZGV4IDw9IHVy
bENTdHJpbmcubGVuZ3RoKCkgfHwgKHVybEluZGV4SXNBZnRlckVuZE9mU3RyaW5nICYmIHVybElu
ZGV4IDw9IHVybENTdHJpbmcubGVuZ3RoKCkgKyAxKSk7CisgICAgICAgIG5leHRERkE6CisgICAg
ICAgIEFTU0VSVChkZmFCeXRlY29kZUxlbmd0aCk7CisgICAgICAgIHByb2dyYW1Db3VudGVyID0g
ZGZhU3RhcnQgKyBkZmFCeXRlY29kZUxlbmd0aDsKICAgICB9Ci0gICAgUkVMRUFTRV9BU1NFUlRf
Tk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gYWN0aW9uczsKIH0KIAogfSAvLyBuYW1lc3BhY2Ug
Q29udGVudEV4dGVuc2lvbnMKSW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBU
b29scy9DaGFuZ2VMb2cJKHJldmlzaW9uIDE4MTkyNSkKKysrIFRvb2xzL0NoYW5nZUxvZwkod29y
a2luZyBjb3B5KQpAQCAtMSwzICsxLDE1IEBACisyMDE1LTAzLTI0ICBBbGV4IENocmlzdGVuc2Vu
ICA8YWNocmlzdGVuc2VuQHdlYmtpdC5vcmc+CisKKyAgICAgICAgW0NvbnRlbnQgRXh0ZW5zaW9u
c10gQWRkIG11bHRpLURGQSBjb21waWxpbmcgYW5kIGludGVycHJldGluZy4KKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0MzAxMAorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogVGVzdFdlYktpdEFQSS9UZXN0
cy9XZWJDb3JlL0NvbnRlbnRFeHRlbnNpb25zLmNwcDoKKyAgICAgICAgKFRlc3RXZWJLaXRBUEk6
OnRlc3RSZXF1ZXN0KToKKyAgICAgICAgKFRlc3RXZWJLaXRBUEk6OlRFU1RfRik6CisgICAgICAg
IEFkZCBzb21lIHRlc3RzIGZvciBpZ25vcmUtcHJldmlvdXMtcnVsZXMgYW5kIGxhcmdlIHJ1bGVz
ZXRzLgorCiAyMDE1LTAzLTI0ICBCZW5qYW1pbiBQb3VsYWluICA8YnBvdWxhaW5AYXBwbGUuY29t
PgogCiAgICAgICAgIE1ha2UgVVJMIGZpbHRlciBwYXR0ZXJucyBtYXRjaGluZyBjb25zaXN0ZW50
IGFuZCBhZGQgYSBzaW1wbGUgY2Fub25pY2FsaXphdGlvbiBzdGVwCkluZGV4OiBUb29scy9UZXN0
V2ViS2l0QVBJL1Rlc3RzL1dlYkNvcmUvQ29udGVudEV4dGVuc2lvbnMuY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2ViQ29yZS9Db250ZW50RXh0ZW5zaW9ucy5j
cHAJKHJldmlzaW9uIDE4MTg4MCkKKysrIFRvb2xzL1Rlc3RXZWJLaXRBUEkvVGVzdHMvV2ViQ29y
ZS9Db250ZW50RXh0ZW5zaW9ucy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM2LDYgKzM2LDcgQEAK
ICNpbmNsdWRlIDx3dGYvTWFpblRocmVhZC5oPgogI2luY2x1ZGUgPHd0Zi9SdW5Mb29wLmg+CiAj
aW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0J1
aWxkZXIuaD4KIAogbmFtZXNwYWNlIFdlYkNvcmUgewogbmFtZXNwYWNlIENvbnRlbnRFeHRlbnNp
b25zIHsKQEAgLTk4LDE2ICs5OSwyMiBAQCBwcml2YXRlOgogICAgIENvbnRlbnRFeHRlbnNpb25z
OjpDb21waWxlZENvbnRlbnRFeHRlbnNpb25EYXRhIG1fZGF0YTsKIH07CiAKLXZvaWQgc3RhdGlj
IHRlc3RSZXF1ZXN0KENvbnRlbnRFeHRlbnNpb25zOjpDb250ZW50RXh0ZW5zaW9uc0JhY2tlbmQg
Y29udGVudEV4dGVuc2lvbnNCYWNrZW5kLCBjb25zdCBSZXNvdXJjZUxvYWRJbmZvJiByZXNvdXJj
ZUxvYWRJbmZvLCBWZWN0b3I8Q29udGVudEV4dGVuc2lvbnM6OkFjdGlvblR5cGU+IGV4cGVjdGVk
QWN0aW9ucykKK3ZvaWQgc3RhdGljIHRlc3RSZXF1ZXN0KENvbnRlbnRFeHRlbnNpb25zOjpDb250
ZW50RXh0ZW5zaW9uc0JhY2tlbmQgY29udGVudEV4dGVuc2lvbnNCYWNrZW5kLCBjb25zdCBSZXNv
dXJjZUxvYWRJbmZvJiByZXNvdXJjZUxvYWRJbmZvLCBWZWN0b3I8Q29udGVudEV4dGVuc2lvbnM6
OkFjdGlvblR5cGU+IGV4cGVjdGVkQWN0aW9ucywgYm9vbCBpZ25vcmVQcmV2aW91c1J1bGVzID0g
ZmFsc2UpCiB7CiAgICAgYXV0byBhY3Rpb25zID0gY29udGVudEV4dGVuc2lvbnNCYWNrZW5kLmFj
dGlvbnNGb3JSZXNvdXJjZUxvYWQocmVzb3VyY2VMb2FkSW5mbyk7Ci0gICAgLy8gVGhlIGxhc3Qg
YWN0aW9uIGlzIGFwcGx5aW5nIHRoZSBjb21waWxlZCBzdHlsZXNoZWV0LgotICAgIEVYUEVDVF9F
UShleHBlY3RlZEFjdGlvbnMuc2l6ZSgpLCBhY3Rpb25zLnNpemUoKSA/IGFjdGlvbnMuc2l6ZSgp
IC0gMSA6IDApOwotICAgIGlmIChleHBlY3RlZEFjdGlvbnMuc2l6ZSgpICE9IChhY3Rpb25zLnNp
emUoKSA/IGFjdGlvbnMuc2l6ZSgpIC0gMSA6IDApKQorCisgICAgdW5zaWduZWQgZXhwZWN0ZWRT
aXplID0gYWN0aW9ucy5zaXplKCk7CisgICAgaWYgKGFjdGlvbnMuc2l6ZSgpICYmICFpZ25vcmVQ
cmV2aW91c1J1bGVzKQorICAgICAgICBleHBlY3RlZFNpemUtLTsgLy8gVGhlIGxhc3QgYWN0aW9u
IGlzIGFwcGx5aW5nIHRoZSBjb21waWxlZCBzdHlsZXNoZWV0LgorICAgIAorICAgIEVYUEVDVF9F
UShleHBlY3RlZEFjdGlvbnMuc2l6ZSgpLCBleHBlY3RlZFNpemUpOworICAgIGlmIChleHBlY3Rl
ZEFjdGlvbnMuc2l6ZSgpICE9IGV4cGVjdGVkU2l6ZSkKICAgICAgICAgcmV0dXJuOwogCiAgICAg
Zm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGV4cGVjdGVkQWN0aW9ucy5zaXplKCk7ICsraSkKICAg
ICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkQWN0aW9uc1tpXSwgYWN0aW9uc1tpXS50eXBlKCkpOwor
ICAgIGlmICghaWdub3JlUHJldmlvdXNSdWxlcykKKyAgICAgICAgRVhQRUNUX0VRKGFjdGlvbnNb
YWN0aW9ucy5zaXplKCkgLSAxXS50eXBlKCksIENvbnRlbnRFeHRlbnNpb25zOjpBY3Rpb25UeXBl
OjpDU1NEaXNwbGF5Tm9uZVN0eWxlU2hlZXQpOwogfQogCiBSZXNvdXJjZUxvYWRJbmZvIG1haW5E
b2N1bWVudFJlcXVlc3QoY29uc3QgY2hhciogdXJsLCBSZXNvdXJjZVR5cGUgcmVzb3VyY2VUeXBl
ID0gUmVzb3VyY2VUeXBlOjpEb2N1bWVudCkKQEAgLTM0MSw2ICszNDgsNDcgQEAgVEVTVF9GKENv
bnRlbnRFeHRlbnNpb25UZXN0LCBSZXNvdXJjZVR5cAogICAgIHRlc3RSZXF1ZXN0KGJhY2tlbmQs
IG1haW5Eb2N1bWVudFJlcXVlc3QoImh0dHA6Ly9ibG9ja19vbmx5X2ltYWdlcy5vcmciLCBSZXNv
dXJjZVR5cGU6OkRvY3VtZW50KSwgeyB9KTsKIH0KIAorVEVTVF9GKENvbnRlbnRFeHRlbnNpb25U
ZXN0LCBNdWx0aURGQSkKK3sKKyAgICAvLyBNYWtlIGFuIE5GQSB3aXRoIGFib3V0IDIwMDAgbm9k
ZXMuCisgICAgU3RyaW5nQnVpbGRlciBydWxlTGlzdDsKKyAgICBydWxlTGlzdC5hcHBlbmQoJ1sn
KTsKKyAgICBmb3IgKGNoYXIgYzEgPSAnQSc7IGMxIDw9ICdaJzsgKytjMSkgeworICAgICAgICBm
b3IgKGNoYXIgYzIgPSAnQSc7IGMyIDw9ICdaJzsgKytjMikgeworICAgICAgICAgICAgZm9yIChj
aGFyIGMzID0gJ0EnOyBjMyA8PSAnQyc7ICsrYzMpIHsKKyAgICAgICAgICAgICAgICBpZiAoYzEg
IT0gJ0EnIHx8IGMyICE9ICdBJyB8fCBjMyAhPSAnQScpCisgICAgICAgICAgICAgICAgICAgIHJ1
bGVMaXN0LmFwcGVuZCgnLCcpOworICAgICAgICAgICAgICAgIHJ1bGVMaXN0LmFwcGVuZCgie1wi
YWN0aW9uXCI6e1widHlwZVwiOlwiIik7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAg
ICAgLy8gUHV0IGFuIGlnbm9yZS1wcmV2aW91cy1ydWxlcyBuZWFyIHRoZSBtaWRkbGUuCisgICAg
ICAgICAgICAgICAgaWYgKGMxID09ICdMJyAmJiBjMiA9PSAnTCcgJiYgYzMgPT0gJ0EnKQorICAg
ICAgICAgICAgICAgICAgICBydWxlTGlzdC5hcHBlbmQoImlnbm9yZS1wcmV2aW91cy1ydWxlcyIp
OworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcnVsZUxpc3QuYXBw
ZW5kKCJibG9jayIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJ1bGVMaXN0
LmFwcGVuZCgiXCJ9LFwidHJpZ2dlclwiOntcInVybC1maWx0ZXJcIjpcIi4qIik7CisgICAgICAg
ICAgICAgICAgcnVsZUxpc3QuYXBwZW5kKGMxKTsKKyAgICAgICAgICAgICAgICBydWxlTGlzdC5h
cHBlbmQoYzIpOworICAgICAgICAgICAgICAgIHJ1bGVMaXN0LmFwcGVuZChjMyk7CisgICAgICAg
ICAgICAgICAgcnVsZUxpc3QuYXBwZW5kKCJcIiwgXCJ1cmwtZmlsdGVyLWlzLWNhc2Utc2Vuc2l0
aXZlXCI6dHJ1ZX19Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcnVs
ZUxpc3QuYXBwZW5kKCddJyk7CisgICAgCisgICAgYXV0byBleHRlbnNpb25EYXRhID0gQ29udGVu
dEV4dGVuc2lvbnM6OmNvbXBpbGVSdWxlTGlzdChydWxlTGlzdC50b1N0cmluZygpKTsKKyAgICBh
dXRvIGV4dGVuc2lvbiA9IEluTWVtb3J5Q29tcGlsZWRDb250ZW50RXh0ZW5zaW9uOjpjcmVhdGUo
V1RGOjptb3ZlKGV4dGVuc2lvbkRhdGEpKTsKKyAgICAgICAgCisgICAgQ29udGVudEV4dGVuc2lv
bnM6OkNvbnRlbnRFeHRlbnNpb25zQmFja2VuZCBiYWNrZW5kOworICAgIGJhY2tlbmQuYWRkQ29u
dGVudEV4dGVuc2lvbigiUmVzb3VyY2VUeXBlRmlsdGVyIiwgZXh0ZW5zaW9uKTsKKworICAgIHRl
c3RSZXF1ZXN0KGJhY2tlbmQsIG1haW5Eb2N1bWVudFJlcXVlc3QoImh0dHA6Ly93ZWJraXQub3Jn
L0FBQSIpLCB7IENvbnRlbnRFeHRlbnNpb25zOjpBY3Rpb25UeXBlOjpCbG9ja0xvYWQgfSk7Cisg
ICAgdGVzdFJlcXVlc3QoYmFja2VuZCwgbWFpbkRvY3VtZW50UmVxdWVzdCgiaHR0cDovL3dlYmtp
dC5vcmcvWlpDIiksIHsgQ29udGVudEV4dGVuc2lvbnM6OkFjdGlvblR5cGU6OkJsb2NrTG9hZCB9
KTsKKyAgICB0ZXN0UmVxdWVzdChiYWNrZW5kLCBtYWluRG9jdW1lbnRSZXF1ZXN0KCJodHRwOi8v
d2Via2l0Lm9yZy9MTEEvQUFBIiksIHsgfSwgdHJ1ZSk7CisgICAgdGVzdFJlcXVlc3QoYmFja2Vu
ZCwgbWFpbkRvY3VtZW50UmVxdWVzdCgiaHR0cDovL3dlYmtpdC5vcmcvTExBL01NQyIpLCB7IENv
bnRlbnRFeHRlbnNpb25zOjpBY3Rpb25UeXBlOjpCbG9ja0xvYWQgfSwgdHJ1ZSk7CisgICAgdGVz
dFJlcXVlc3QoYmFja2VuZCwgbWFpbkRvY3VtZW50UmVxdWVzdCgiaHR0cDovL3dlYmtpdC5vcmcv
IiksIHsgfSk7Cit9CisKIHN0YXRpYyB2b2lkIHRlc3RQYXR0ZXJuU3RhdHVzKFN0cmluZyBwYXR0
ZXJuLCBDb250ZW50RXh0ZW5zaW9uczo6VVJMRmlsdGVyUGFyc2VyOjpQYXJzZVN0YXR1cyBzdGF0
dXMpCiB7CiAgICAgQ29udGVudEV4dGVuc2lvbnM6Ok5GQSBuZmE7Cg==
</data>
<flag name="review"
          id="274183"
          type_id="1"
          status="+"
          setter="benjamin"
    />
          </attachment>
      

    </bug>

</bugzilla>