<?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>59692</bug_id>
          
          <creation_ts>2011-04-28 06:12:35 -0700</creation_ts>
          <short_desc>IndexedDB: Unit tests for LevelDB key coding functions</short_desc>
          <delta_ts>2011-05-05 01:36:49 -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>1</everconfirmed>
          <reporter name="Hans Wennborg">hans</reporter>
          <assigned_to name="Hans Wennborg">hans</assigned_to>
          <cc>andreip</cc>
    
    <cc>dgrogan</cc>
    
    <cc>steveblock</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>394385</commentid>
    <comment_count>0</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-28 06:12:35 -0700</bug_when>
    <thetext>IndexedDB: Unit tests for LevelDB key coding functions</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>394386</commentid>
    <comment_count>1</comment_count>
      <attachid>91476</attachid>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-04-28 06:17:12 -0700</bug_when>
    <thetext>Created attachment 91476
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>395042</commentid>
    <comment_count>2</comment_count>
      <attachid>91476</attachid>
    <who name="David Grogan">dgrogan</who>
    <bug_when>2011-04-28 19:30:58 -0700</bug_when>
    <thetext>Comment on attachment 91476
Patch

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

LGTM

I checked about 80% of these to make sure I understood what was going on.

&gt; Source/WebCore/storage/IDBLevelDBCoding.cpp:192
&gt; +    int shift = 0;

How did these get by the layout tests?

&gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:84
&gt; +TEST(IDBLevelDBCodingTest, EncodeInt)

We just use encodeint and decodeint for the meta data right?  Integers in the key are always encoded as part of a NumberType IDBKey?  How do we convert integers as the Value into a string?  Just dump the SerializedScriptValue internal representation?  Sorry for the lame out-of-scope questions.

&gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:103
&gt; +            n += 1234;

This maxes out at 499 * 1234 + 1000 * 63 = 678766?  Does it handle INT64_MAX?  What does it do with INT64_MAX + 5?

&gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:298
&gt; +    keys.append(IDBKey::createDate(100000));

What does the parameter to createDate represent?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>397020</commentid>
    <comment_count>3</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-05-03 02:44:33 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 91476 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=91476&amp;action=review
&gt; 
&gt; LGTM
&gt; 
&gt; I checked about 80% of these to make sure I understood what was going on.
&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBCoding.cpp:192
&gt; &gt; +    int shift = 0;
&gt; 
&gt; How did these get by the layout tests?

That&apos;s a good question. I suppose none of the tests caused us to encode any integers larger than 255. Having these unit tests will make me sleep better at night :)

&gt; 
&gt; &gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:84
&gt; &gt; +TEST(IDBLevelDBCodingTest, EncodeInt)
&gt; 
&gt; We just use encodeint and decodeint for the meta data right?

Yes.

&gt; Integers in the key are always encoded as part of a NumberType IDBKey?

Yes.

&gt; How do we convert integers as the Value into a string?  Just dump the SerializedScriptValue internal representation?

Exactly. From the back-end point of view, all values are String objects.

&gt; Sorry for the lame out-of-scope questions.

No worries, I&apos;m glad someone is paying attention :)

&gt; 
&gt; &gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:103
&gt; &gt; +            n += 1234;
&gt; 
&gt; This maxes out at 499 * 1234 + 1000 * 63 = 678766?  Does it handle INT64_MAX?

Yes, that works. Adding that to the test.

&gt; What does it do with INT64_MAX + 5?

How do you mean? We can&apos;t pass that to the function anyway..

&gt; 
&gt; &gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:298
&gt; &gt; +    keys.append(IDBKey::createDate(100000));
&gt; 
&gt; What does the parameter to createDate represent?

For date values, we use a double representing number of seconds since the epoch. This is the same as V8 does internally.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>397021</commentid>
    <comment_count>4</comment_count>
      <attachid>92057</attachid>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-05-03 02:46:18 -0700</bug_when>
    <thetext>Created attachment 92057
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>397022</commentid>
    <comment_count>5</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-05-03 02:47:15 -0700</bug_when>
    <thetext>Steve, would you like to take a look?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>397607</commentid>
    <comment_count>6</comment_count>
    <who name="David Grogan">dgrogan</who>
    <bug_when>2011-05-03 18:24:03 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (In reply to comment #2)
&gt; &gt; (From update of attachment 91476 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=91476&amp;action=review
&gt; &gt; &gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:103
&gt; &gt; &gt; +            n += 1234;
&gt; &gt; 
&gt; &gt; This maxes out at 499 * 1234 + 1000 * 63 = 678766?  Does it handle INT64_MAX?
&gt; 
&gt; Yes, that works. Adding that to the test.
&gt; 
&gt; &gt; What does it do with INT64_MAX + 5?
&gt; 
&gt; How do you mean? We can&apos;t pass that to the function anyway..

I suppose the compiler wouldn&apos;t let us?  I was curious what this would yield, just so we know

decode(encode(INT64_MAX + 5))</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>397789</commentid>
    <comment_count>7</comment_count>
      <attachid>92057</attachid>
    <who name="Steve Block">steveblock</who>
    <bug_when>2011-05-04 04:07:56 -0700</bug_when>
    <thetext>Comment on attachment 92057
Patch

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

&gt; Source/WebCore/storage/IDBLevelDBCoding.cpp:195
&gt; +        ret = ret | (static_cast&lt;int64_t&gt;(c) &lt;&lt; shift);

Use |=

&gt; Source/WebCore/storage/IDBLevelDBCoding.cpp:227
&gt; +        foundInt |= static_cast&lt;int64_t&gt;(*p &amp; 0x7f) &lt;&lt; shift;

This might be easier to read if you use a local &apos;char c&apos; like in decodeInt.

&gt; Source/WebCore/storage/IDBLevelDBCoding.cpp:229
&gt;      } while (*p++ &amp; 128);

Would &apos;0x80&apos; be easier to read than &apos;128&apos;, since you use hex for the other mask? - throughout.

&gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:34
&gt; +#if ENABLE(LEVELDB)

Should these be above this block of headers?

&gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:46
&gt; +    for (int i = 0; i &lt; 256; ++i) {

I don&apos;t know about Chromium style, but I thought that usually one tests only the &apos;interesting&apos; values, rather than doing all by brute force, so it&apos;s clear what we&apos;re testing? Maybe 0, 1, 255 here?

&gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:47
&gt; +        unsigned char c = i;

Wwhy not loop on a char to avoid the local?

&gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:86
&gt; +    EXPECT_EQ(static_cast&lt;size_t&gt;(1), encodeInt(1).size());

What should encodeInt(0)do? Should we add a test? Same for encodeVarInt.

&gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:97
&gt; +    for (int i = 0; i &lt; 1000; i++) {

Same comment about brute force

&gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:164
&gt; +    EXPECT_EQ(static_cast&lt;size_t&gt;(2), encodeString(&quot;a&quot;).size());

encodeString(&quot;&quot;) ?

&gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:167
&gt; +    EXPECT_EQ(static_cast&lt;size_t&gt;(4), encodeString(testStringB).size());

It looks like there&apos;s only a single encodeString() function, and it takes &apos;const String&amp;&apos;. So the conversion from 8 and 16 bit char arrays to a 16 bit String is done by the String constructor, right? Given this, is there any point in testing both 8 and 16 bit here? If so, I think you should use explicit calls to String(). Same comment for &apos;WithLength&apos;.

&gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:245
&gt; +    EXPECT_EQ(static_cast&lt;size_t&gt;(8), encodeDouble(3.14).size());

encodeDouble(0.0) ?

&gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:266
&gt; +    EXPECT_FALSE(p);

EXPECT_EQ(0, p)? Same comment below.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>397904</commentid>
    <comment_count>8</comment_count>
      <attachid>92236</attachid>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-05-04 07:07:45 -0700</bug_when>
    <thetext>Created attachment 92236
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>397905</commentid>
    <comment_count>9</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-05-04 07:08:07 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (From update of attachment 92057 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=92057&amp;action=review

Thanks very much for the review Steve.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBCoding.cpp:195
&gt; &gt; +        ret = ret | (static_cast&lt;int64_t&gt;(c) &lt;&lt; shift);
&gt; 
&gt; Use |=
Done.

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBCoding.cpp:227
&gt; &gt; +        foundInt |= static_cast&lt;int64_t&gt;(*p &amp; 0x7f) &lt;&lt; shift;
&gt; 
&gt; This might be easier to read if you use a local &apos;char c&apos; like in decodeInt.
Done. (I assume you mean for *p, right?)

&gt; 
&gt; &gt; Source/WebCore/storage/IDBLevelDBCoding.cpp:229
&gt; &gt;      } while (*p++ &amp; 128);
&gt; 
&gt; Would &apos;0x80&apos; be easier to read than &apos;128&apos;, since you use hex for the other mask? - throughout.
Yes, that&apos;s probably better. Done.

&gt; 
&gt; &gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:34
&gt; &gt; +#if ENABLE(LEVELDB)
&gt; 
&gt; Should these be above this block of headers?
Yes, that makes sense. Done.

&gt; 
&gt; &gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:46
&gt; &gt; +    for (int i = 0; i &lt; 256; ++i) {
&gt; 
&gt; I don&apos;t know about Chromium style, but I thought that usually one tests only the &apos;interesting&apos; values, rather than doing all by brute force, so it&apos;s clear what we&apos;re testing? Maybe 0, 1, 255 here?
Yes, makes sense. Done.

&gt; 
&gt; &gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:47
&gt; &gt; +        unsigned char c = i;
&gt; 
&gt; Wwhy not loop on a char to avoid the local?
Because a char would always be less than 256, and the loop would never finish. But that loop is gone now anyway.

&gt; 
&gt; &gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:86
&gt; &gt; +    EXPECT_EQ(static_cast&lt;size_t&gt;(1), encodeInt(1).size());
&gt; 
&gt; What should encodeInt(0)do? Should we add a test? Same for encodeVarInt.
Yes, we should add a test. Done.

&gt; 
&gt; &gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:97
&gt; &gt; +    for (int i = 0; i &lt; 1000; i++) {
&gt; 
&gt; Same comment about brute force
Done.

&gt; 
&gt; &gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:164
&gt; &gt; +    EXPECT_EQ(static_cast&lt;size_t&gt;(2), encodeString(&quot;a&quot;).size());
&gt; 
&gt; encodeString(&quot;&quot;) ?
Done.

&gt; 
&gt; &gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:167
&gt; &gt; +    EXPECT_EQ(static_cast&lt;size_t&gt;(4), encodeString(testStringB).size());
&gt; 
&gt; It looks like there&apos;s only a single encodeString() function, and it takes &apos;const String&amp;&apos;. So the conversion from 8 and 16 bit char arrays to a 16 bit String is done by the String constructor, right? Given this, is there any point in testing both 8 and 16 bit here?

I want to test that encodeInt can also handle Strings where some characters are using more than the low eight bits.

&gt; If so, I think you should use explicit calls to String(). Same comment for &apos;WithLength&apos;.

Done.

&gt; 
&gt; &gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:245
&gt; &gt; +    EXPECT_EQ(static_cast&lt;size_t&gt;(8), encodeDouble(3.14).size());
&gt; 
&gt; encodeDouble(0.0) ?
Done.

&gt; 
&gt; &gt; Source/WebKit/chromium/tests/IDBLevelDBCodingTest.cpp:266
&gt; &gt; +    EXPECT_FALSE(p);
&gt; 
&gt; EXPECT_EQ(0, p)? Same comment below.

Done. Fixed throughout.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>397907</commentid>
    <comment_count>10</comment_count>
      <attachid>92236</attachid>
    <who name="Steve Block">steveblock</who>
    <bug_when>2011-05-04 07:15:58 -0700</bug_when>
    <thetext>Comment on attachment 92236
Patch

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>398617</commentid>
    <comment_count>11</comment_count>
    <who name="Hans Wennborg">hans</who>
    <bug_when>2011-05-05 01:36:49 -0700</bug_when>
    <thetext>Committed r85844: &lt;http://trac.webkit.org/changeset/85844&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>91476</attachid>
            <date>2011-04-28 06:17:12 -0700</date>
            <delta_ts>2011-05-03 02:46:10 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-59692-20110428141710.patch</filename>
            <type>text/plain</type>
            <size>15118</size>
            <attacher name="Hans Wennborg">hans</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogODUxNzEKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCBmZGJjMDQxYTk1ZGY2OGYy
MjZkODM5NTBlNDlmYzk0M2IzZDVhZTg0Li5iNThmZWNmZWI5YWM0ODBjOWQ2Y2ViMmM2N2QyMTVi
NGM1MWVkYmY4IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTggQEAKKzIwMTEtMDQtMjggIEhhbnMg
V2VubmJvcmcgIDxoYW5zQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBJbmRleGVkREI6IFVuaXQgdGVzdHMgZm9yIExldmVsREIg
a2V5IGNvZGluZyBmdW5jdGlvbnMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTU5NjkyCisKKyAgICAgICAgRml4IHNvbWUgZW1iYXJyYXNzaW5nIGJ1Z3Mg
dW5jb3ZlcmVkIGJ5IHVuaXQgdGVzdHMuCisKKyAgICAgICAgTm8gbmV3IGZ1bmN0aW9uYWxpdHks
IGJ1dCB0aGlzIGlzIG5vdyBjb3ZlcmVkIGJ5IHVuaXQgdGVzdHMgaW4gdGhlIENocm9taXVtIFdl
YktpdCBwb3J0LgorCisgICAgICAgICogc3RvcmFnZS9JREJMZXZlbERCQ29kaW5nLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OmRlY29kZUludCk6CisgICAgICAgIChX
ZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpkZWNvZGVWYXJJbnQpOgorCiAyMDExLTA0LTI4ICBK
b24gTGVlICA8am9ubGVlQGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBTaW1vbiBG
cmFzZXIuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxldmVsREJDb2Rp
bmcuY3BwIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJMZXZlbERCQ29kaW5nLmNwcAppbmRl
eCA4MjJhYzE3OGUxZDcyYTQ2MTc4ZDdjZmYzMjIwNTgwYjEwZjlhZWFiLi4xOGE3NGY2ODg0NTIz
ZGFiMTBhZmFkNGQyZGY2YjM5MTM3MzIwMzFjIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9z
dG9yYWdlL0lEQkxldmVsREJDb2RpbmcuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2Uv
SURCTGV2ZWxEQkNvZGluZy5jcHAKQEAgLTE4OSw5ICsxODksMTEgQEAgaW50NjRfdCBkZWNvZGVJ
bnQoY29uc3QgY2hhciogYmVnaW4sIGNvbnN0IGNoYXIqIGVuZCkKICAgICBBU1NFUlQoYmVnaW4g
PD0gZW5kKTsKICAgICBpbnQ2NF90IHJldCA9IDA7CiAKKyAgICBpbnQgc2hpZnQgPSAwOwogICAg
IHdoaWxlIChiZWdpbiA8IGVuZCkgewogICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSAqYmVnaW4r
KzsKLSAgICAgICAgcmV0ID0gKHJldCA8PCA4KSB8IGM7CisgICAgICAgIHJldCA9IHJldCB8IChz
dGF0aWNfY2FzdDxpbnQ2NF90PihjKSA8PCBzaGlmdCk7CisgICAgICAgIHNoaWZ0ICs9IDg7CiAg
ICAgfQogCiAgICAgcmV0dXJuIHJldDsKQEAgLTIxNiwxMiArMjE4LDE0IEBAIGNvbnN0IGNoYXIq
IGRlY29kZVZhckludChjb25zdCBjaGFyICpwLCBjb25zdCBjaGFyKiBsaW1pdCwgaW50NjRfdCYg
Zm91bmRJbnQpCiB7CiAgICAgQVNTRVJUKGxpbWl0ID49IHApOwogICAgIGZvdW5kSW50ID0gMDsK
KyAgICBpbnQgc2hpZnQgPSAwOwogCiAgICAgZG8gewogICAgICAgICBpZiAocCA+PSBsaW1pdCkK
ICAgICAgICAgICAgIHJldHVybiAwOwogCi0gICAgICAgIGZvdW5kSW50ID0gKGZvdW5kSW50IDw8
IDcpIHwgKCpwICYgMHg3Zik7CisgICAgICAgIGZvdW5kSW50IHw9IHN0YXRpY19jYXN0PGludDY0
X3Q+KCpwICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgICAgIHNoaWZ0ICs9IDc7CiAgICAgfSB3aGls
ZSAoKnArKyAmIDEyOCk7CiAgICAgcmV0dXJuIHA7CiB9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
S2l0L2Nocm9taXVtL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9n
CmluZGV4IDMzMmMxNjc4ZTI3NDI1ZWI0YjE2MzFiODMwY2E4OTc4YzcwNjVhYjIuLmIwNWYwYWI4
NTU0MWI4OTA0ZDg5YzBmYmEwY2IwNGQ0MGRlYzcxNDMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJL
aXQvY2hyb21pdW0vQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdl
TG9nCkBAIC0xLDMgKzEsMTYgQEAKKzIwMTEtMDQtMjggIEhhbnMgV2VubmJvcmcgIDxoYW5zQGNo
cm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAg
ICAgICBJbmRleGVkREI6IFVuaXQgdGVzdHMgZm9yIExldmVsREIga2V5IGNvZGluZyBmdW5jdGlv
bnMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTU5Njky
CisKKyAgICAgICAgQWRkIHVuaXQgdGVzdHMgZm9yIHRoZSBiYXNpYyBrZXkgY29kaW5nIGZ1bmN0
aW9ucyB1c2VkIGJ5IHRoZSBMZXZlbERCIGJhY2stZW5kLgorCisgICAgICAgICogV2ViS2l0Lmd5
cGk6CisgICAgICAgICogdGVzdHMvSURCTGV2ZWxEQkNvZGluZ1Rlc3QuY3BwOiBBZGRlZC4KKyAg
ICAgICAgKElEQkxldmVsREJDb2Rpbmc6OlRFU1QpOgorCiAyMDExLTA0LTI3ICBEbWl0cnkgTG9t
b3YgIDxkc2xvbW92QGdvb2dsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGF2aWQgTGV2
aW4uCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXBpIGIvU291
cmNlL1dlYktpdC9jaHJvbWl1bS9XZWJLaXQuZ3lwaQppbmRleCBiMDUyOTgxZmQzZDdiZjEwNDMx
YWM5ZDI5OWRjMGEwNTQzMWQyOTQ4Li5kZGYzNTAzZmUwZWNiNzAyYzAzZTcyMzM3MTFjNzZiYWVi
N2QyYjg1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXBpCisr
KyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cGkKQEAgLTU3LDYgKzU3LDcgQEAK
ICAgICAgICAgICAgICd0ZXN0cy9DQ1RocmVhZFRlc3QuY3BwJywKICAgICAgICAgICAgICd0ZXN0
cy9JREJCaW5kaW5nVXRpbGl0aWVzVGVzdC5jcHAnLAogICAgICAgICAgICAgJ3Rlc3RzL0lEQktl
eVBhdGhUZXN0LmNwcCcsCisgICAgICAgICAgICAndGVzdHMvSURCTGV2ZWxEQkNvZGluZ1Rlc3Qu
Y3BwJywKICAgICAgICAgICAgICd0ZXN0cy9LZXlib2FyZFRlc3QuY3BwJywKICAgICAgICAgICAg
ICd0ZXN0cy9LVVJMVGVzdC5jcHAnLAogICAgICAgICAgICAgJ3Rlc3RzL1BPREFyZW5hVGVzdC5j
cHAnLApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9JREJMZXZlbERC
Q29kaW5nVGVzdC5jcHAgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL3Rlc3RzL0lEQkxldmVsREJD
b2RpbmdUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4xYjdmNGJiMTRkN2Q1ZDRhZmQ5NThmODBjNmUyYzRl
MTMzNGQzM2QzCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0
cy9JREJMZXZlbERCQ29kaW5nVGVzdC5jcHAKQEAgLTAsMCArMSwzMzkgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJ
VFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICog
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1Ig
SVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMK
KyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSURCTGV2ZWxEQkNvZGluZy5oIgorCisjaW5jbHVk
ZSAiSURCS2V5LmgiCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDx3dGYvVmVj
dG9yLmg+CisKKyNpZiBFTkFCTEUoSU5ERVhFRF9EQVRBQkFTRSkKKyNpZiBFTkFCTEUoTEVWRUxE
QikKKwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7Cit1c2luZyBuYW1lc3BhY2UgSURCTGV2ZWxE
QkNvZGluZzsKKworbmFtZXNwYWNlIHsKKworVEVTVChJREJMZXZlbERCQ29kaW5nVGVzdCwgRW5j
b2RlQnl0ZSkKK3sKKyAgICBWZWN0b3I8Y2hhcj4gZXhwZWN0ZWQ7CisgICAgZXhwZWN0ZWQuYXBw
ZW5kKDApOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7ICsraSkgeworICAgICAgICB1
bnNpZ25lZCBjaGFyIGMgPSBpOworCisgICAgICAgIGV4cGVjdGVkWzBdID0gYzsKKyAgICAgICAg
RVhQRUNUX0VRKGV4cGVjdGVkLCBlbmNvZGVCeXRlKGMpKTsKKyAgICB9Cit9CisKK1RFU1QoSURC
TGV2ZWxEQkNvZGluZ1Rlc3QsIE1heElEQktleSkKK3sKKyAgICBWZWN0b3I8Y2hhcj4gbWF4S2V5
ID0gbWF4SURCS2V5KCk7CisKKyAgICBWZWN0b3I8Y2hhcj4gbWluS2V5ID0gbWluSURCS2V5KCk7
CisgICAgVmVjdG9yPGNoYXI+IHN0cmluZ0tleSA9IGVuY29kZUlEQktleSgqSURCS2V5OjpjcmVh
dGVTdHJpbmcoIkhlbGxvIHdvcmxkIikpOworICAgIFZlY3RvcjxjaGFyPiBudW1iZXJLZXkgPSBl
bmNvZGVJREJLZXkoKklEQktleTo6Y3JlYXRlTnVtYmVyKDMuMTQpKTsKKyAgICBWZWN0b3I8Y2hh
cj4gZGF0ZUtleSA9IGVuY29kZUlEQktleSgqSURCS2V5OjpjcmVhdGVEYXRlKDEwMDAwMDApKTsK
KworICAgIEVYUEVDVF9HVChjb21wYXJlRW5jb2RlZElEQktleXMobWF4S2V5LCBtaW5LZXkpLCAw
KTsKKyAgICBFWFBFQ1RfR1QoY29tcGFyZUVuY29kZWRJREJLZXlzKG1heEtleSwgc3RyaW5nS2V5
KSwgMCk7CisgICAgRVhQRUNUX0dUKGNvbXBhcmVFbmNvZGVkSURCS2V5cyhtYXhLZXksIG51bWJl
cktleSksIDApOworICAgIEVYUEVDVF9HVChjb21wYXJlRW5jb2RlZElEQktleXMobWF4S2V5LCBk
YXRlS2V5KSwgMCk7Cit9CisKK1RFU1QoSURCTGV2ZWxEQkNvZGluZ1Rlc3QsIE1pbklEQktleSkK
K3sKKyAgICBWZWN0b3I8Y2hhcj4gbWluS2V5ID0gbWluSURCS2V5KCk7CisKKyAgICBWZWN0b3I8
Y2hhcj4gbWF4S2V5ID0gbWF4SURCS2V5KCk7CisgICAgVmVjdG9yPGNoYXI+IHN0cmluZ0tleSA9
IGVuY29kZUlEQktleSgqSURCS2V5OjpjcmVhdGVTdHJpbmcoIkhlbGxvIHdvcmxkIikpOworICAg
IFZlY3RvcjxjaGFyPiBudW1iZXJLZXkgPSBlbmNvZGVJREJLZXkoKklEQktleTo6Y3JlYXRlTnVt
YmVyKDMuMTQpKTsKKyAgICBWZWN0b3I8Y2hhcj4gZGF0ZUtleSA9IGVuY29kZUlEQktleSgqSURC
S2V5OjpjcmVhdGVEYXRlKDEwMDAwMDApKTsKKworICAgIEVYUEVDVF9MVChjb21wYXJlRW5jb2Rl
ZElEQktleXMobWluS2V5LCBtYXhLZXkpLCAwKTsKKyAgICBFWFBFQ1RfTFQoY29tcGFyZUVuY29k
ZWRJREJLZXlzKG1pbktleSwgc3RyaW5nS2V5KSwgMCk7CisgICAgRVhQRUNUX0xUKGNvbXBhcmVF
bmNvZGVkSURCS2V5cyhtaW5LZXksIG51bWJlcktleSksIDApOworICAgIEVYUEVDVF9MVChjb21w
YXJlRW5jb2RlZElEQktleXMobWluS2V5LCBkYXRlS2V5KSwgMCk7Cit9CisKK1RFU1QoSURCTGV2
ZWxEQkNvZGluZ1Rlc3QsIEVuY29kZUludCkKK3sKKyAgICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8
c2l6ZV90PigxKSwgZW5jb2RlSW50KDEpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKHN0YXRpY19j
YXN0PHNpemVfdD4oMSksIGVuY29kZUludCgyNTUpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKHN0
YXRpY19jYXN0PHNpemVfdD4oMiksIGVuY29kZUludCgyNTYpLnNpemUoKSk7CisgICAgRVhQRUNU
X0VRKHN0YXRpY19jYXN0PHNpemVfdD4oNCksIGVuY29kZUludCgweGZmZmZmZmZmKS5zaXplKCkp
OworfQorCitURVNUKElEQkxldmVsREJDb2RpbmdUZXN0LCBEZWNvZGVJbnQpCit7CisgICAgaW50
NjRfdCBuID0gMDsKKyAgICBWZWN0b3I8Y2hhcj4gdjsKKworICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgMTAwMDsgaSsrKSB7CisgICAgICAgIHYgPSBlbmNvZGVJbnQobik7CisgICAgICAgIEVYUEVD
VF9FUShuLCBkZWNvZGVJbnQodi5kYXRhKCksIHYuZGF0YSgpICsgdi5zaXplKCkpKTsKKworICAg
ICAgICBuICs9IDYzOworICAgICAgICBpZiAoaSA+IDUwMCkKKyAgICAgICAgICAgIG4gKz0gMTIz
NDsKKyAgICB9CisKKyAgICBuID0gNzcxMTE5MjQzMTc1NTY2NTc5MmxsOworICAgIHYgPSBlbmNv
ZGVJbnQobik7CisgICAgRVhQRUNUX0VRKG4sIGRlY29kZUludCh2LmRhdGEoKSwgdi5kYXRhKCkg
KyB2LnNpemUoKSkpOworfQorCitURVNUKElEQkxldmVsREJDb2RpbmdUZXN0LCBFbmNvZGVWYXJJ
bnQpCit7CisgICAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PHNpemVfdD4oMSksIGVuY29kZVZhcklu
dCgxKS5zaXplKCkpOworICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxzaXplX3Q+KDIpLCBlbmNv
ZGVWYXJJbnQoMjU1KS5zaXplKCkpOworICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxzaXplX3Q+
KDIpLCBlbmNvZGVWYXJJbnQoMjU2KS5zaXplKCkpOworICAgIEVYUEVDVF9FUShzdGF0aWNfY2Fz
dDxzaXplX3Q+KDUpLCBlbmNvZGVWYXJJbnQoMHhmZmZmZmZmZikuc2l6ZSgpKTsKK30KKworVEVT
VChJREJMZXZlbERCQ29kaW5nVGVzdCwgRGVjb2RlVmFySW50KQoreworICAgIGludDY0X3QgbiA9
IDA7CisgICAgaW50NjRfdCByZXM7CisgICAgVmVjdG9yPGNoYXI+IHY7CisgICAgY29uc3QgY2hh
ciogcDsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgIHYg
PSBlbmNvZGVWYXJJbnQobik7CisgICAgICAgIHAgPSBkZWNvZGVWYXJJbnQodi5kYXRhKCksIHYu
ZGF0YSgpICsgdi5zaXplKCksIHJlcyk7CisgICAgICAgIEVYUEVDVF9FUShuLCByZXMpOworICAg
ICAgICBFWFBFQ1RfRVEodi5kYXRhKCkgKyB2LnNpemUoKSwgcCk7CisKKyAgICAgICAgcCA9IGRl
Y29kZVZhckludCh2LmRhdGEoKSwgdi5kYXRhKCkgKyB2LnNpemUoKSAtIDEsIHJlcyk7CisgICAg
ICAgIEVYUEVDVF9GQUxTRShwKTsKKworICAgICAgICBuICs9IDYzOworICAgICAgICBpZiAoaSA+
IDUwMCkKKyAgICAgICAgICAgIG4gKz0gMTIzNDsKKyAgICB9CisKKyAgICBuID0gNzcxMTE5MjQz
MTc1NTY2NTc5MmxsOworICAgIHYgPSBlbmNvZGVWYXJJbnQobik7CisgICAgcCA9IGRlY29kZVZh
ckludCh2LmRhdGEoKSwgdi5kYXRhKCkgKyB2LnNpemUoKSwgcmVzKTsKKyAgICBFWFBFQ1RfRVEo
biwgcmVzKTsKKyAgICBFWFBFQ1RfRVEodi5kYXRhKCkgKyB2LnNpemUoKSwgcCk7CisKKyAgICBF
WFBFQ1RfRkFMU0UoZGVjb2RlVmFySW50KHYuZGF0YSgpLCB2LmRhdGEoKSwgcmVzKSk7Cit9CisK
K1RFU1QoSURCTGV2ZWxEQkNvZGluZ1Rlc3QsIEVuY29kZVN0cmluZykKK3sKKyAgICBjb25zdCBV
Q2hhciB0ZXN0U3RyaW5nQVtdID0geydmJywgJ28nLCAnbycsICdcMCd9OworICAgIGNvbnN0IFVD
aGFyIHRlc3RTdHJpbmdCW10gPSB7MHhkZWFkLCAweGJlZWYsICdcMCd9OworCisgICAgRVhQRUNU
X0VRKHN0YXRpY19jYXN0PHNpemVfdD4oMiksIGVuY29kZVN0cmluZygiYSIpLnNpemUoKSk7Cisg
ICAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PHNpemVfdD4oNiksIGVuY29kZVN0cmluZygiZm9vIiku
c2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8c2l6ZV90Pig2KSwgZW5jb2RlU3Ry
aW5nKHRlc3RTdHJpbmdBKS5zaXplKCkpOworICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxzaXpl
X3Q+KDQpLCBlbmNvZGVTdHJpbmcodGVzdFN0cmluZ0IpLnNpemUoKSk7Cit9CisKK1RFU1QoSURC
TGV2ZWxEQkNvZGluZ1Rlc3QsIERlY29kZVN0cmluZykKK3sKKyAgICBjb25zdCBVQ2hhciB0ZXN0
U3RyaW5nQVtdID0geydmJywgJ28nLCAnbycsICdcMCd9OworICAgIGNvbnN0IFVDaGFyIHRlc3RT
dHJpbmdCW10gPSB7MHhkZWFkLCAweGJlZWYsICdcMCd9OworICAgIFZlY3RvcjxjaGFyPiB2Owor
CisgICAgdiA9IGVuY29kZVN0cmluZygiYSIpOworICAgIEVYUEVDVF9FUShTdHJpbmcoImEiKSwg
ZGVjb2RlU3RyaW5nKHYuZGF0YSgpLCB2LmRhdGEoKSArIHYuc2l6ZSgpKSk7CisKKyAgICB2ID0g
ZW5jb2RlU3RyaW5nKCJmb28iKTsKKyAgICBFWFBFQ1RfRVEoU3RyaW5nKCJmb28iKSwgZGVjb2Rl
U3RyaW5nKHYuZGF0YSgpLCB2LmRhdGEoKSArIHYuc2l6ZSgpKSk7CisKKyAgICB2ID0gZW5jb2Rl
U3RyaW5nKHRlc3RTdHJpbmdBKTsKKyAgICBFWFBFQ1RfRVEodGVzdFN0cmluZ0EsIGRlY29kZVN0
cmluZyh2LmRhdGEoKSwgdi5kYXRhKCkgKyB2LnNpemUoKSkpOworCisgICAgdiA9IGVuY29kZVN0
cmluZyh0ZXN0U3RyaW5nQik7CisgICAgRVhQRUNUX0VRKHRlc3RTdHJpbmdCLCBkZWNvZGVTdHJp
bmcodi5kYXRhKCksIHYuZGF0YSgpICsgdi5zaXplKCkpKTsKK30KKworVEVTVChJREJMZXZlbERC
Q29kaW5nVGVzdCwgRW5jb2RlU3RyaW5nV2l0aExlbmd0aCkKK3sKKyAgICBjb25zdCBVQ2hhciB0
ZXN0U3RyaW5nQVtdID0geydmJywgJ28nLCAnbycsICdcMCd9OworICAgIGNvbnN0IFVDaGFyIHRl
c3RTdHJpbmdCW10gPSB7MHhkZWFkLCAweGJlZWYsICdcMCd9OworCisgICAgRVhQRUNUX0VRKHN0
YXRpY19jYXN0PHNpemVfdD4oMyksIGVuY29kZVN0cmluZ1dpdGhMZW5ndGgoImEiKS5zaXplKCkp
OworICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxzaXplX3Q+KDcpLCBlbmNvZGVTdHJpbmdXaXRo
TGVuZ3RoKHRlc3RTdHJpbmdBKS5zaXplKCkpOworICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxz
aXplX3Q+KDUpLCBlbmNvZGVTdHJpbmdXaXRoTGVuZ3RoKHRlc3RTdHJpbmdCKS5zaXplKCkpOwor
fQorCitURVNUKElEQkxldmVsREJDb2RpbmdUZXN0LCBEZWNvZGVTdHJpbmdXaXRoTGVuZ3RoKQor
eworICAgIGNvbnN0IFVDaGFyIHRlc3RTdHJpbmdBW10gPSB7J2YnLCAnbycsICdvJywgJ1wwJ307
CisgICAgY29uc3QgVUNoYXIgdGVzdFN0cmluZ0JbXSA9IHsweGRlYWQsIDB4YmVlZiwgJ1wwJ307
CisKKyAgICBWZWN0b3I8Y2hhcj4gdjsKKyAgICBTdHJpbmcgczsKKyAgICBjb25zdCBjaGFyKiBw
OworCisgICAgdiA9IGVuY29kZVN0cmluZ1dpdGhMZW5ndGgoImEiKTsKKyAgICBwID0gZGVjb2Rl
U3RyaW5nV2l0aExlbmd0aCh2LmRhdGEoKSwgdi5kYXRhKCkgKyB2LnNpemUoKSwgcyk7CisgICAg
RVhQRUNUX0VRKFN0cmluZygiYSIpLCBzKTsKKyAgICBFWFBFQ1RfRVEodi5kYXRhKCkgKyB2LnNp
emUoKSwgcCk7CisKKyAgICB2ID0gZW5jb2RlU3RyaW5nV2l0aExlbmd0aCgiZm9vIik7CisgICAg
cCA9IGRlY29kZVN0cmluZ1dpdGhMZW5ndGgodi5kYXRhKCksIHYuZGF0YSgpICsgdi5zaXplKCks
IHMpOworICAgIEVYUEVDVF9FUShTdHJpbmcoImZvbyIpLCBzKTsKKyAgICBFWFBFQ1RfRVEodi5k
YXRhKCkgKyB2LnNpemUoKSwgcCk7CisKKyAgICB2ID0gZW5jb2RlU3RyaW5nV2l0aExlbmd0aCh0
ZXN0U3RyaW5nQSk7CisgICAgcCA9IGRlY29kZVN0cmluZ1dpdGhMZW5ndGgodi5kYXRhKCksIHYu
ZGF0YSgpICsgdi5zaXplKCksIHMpOworICAgIEVYUEVDVF9FUSh0ZXN0U3RyaW5nQSwgcyk7Cisg
ICAgRVhQRUNUX0VRKHYuZGF0YSgpICsgdi5zaXplKCksIHApOworCisgICAgdiA9IGVuY29kZVN0
cmluZ1dpdGhMZW5ndGgodGVzdFN0cmluZ0IpOworICAgIHAgPSBkZWNvZGVTdHJpbmdXaXRoTGVu
Z3RoKHYuZGF0YSgpLCB2LmRhdGEoKSArIHYuc2l6ZSgpLCBzKTsKKyAgICBFWFBFQ1RfRVEodGVz
dFN0cmluZ0IsIHMpOworICAgIEVYUEVDVF9FUSh2LmRhdGEoKSArIHYuc2l6ZSgpLCBwKTsKKwor
ICAgIHYgPSBlbmNvZGVTdHJpbmdXaXRoTGVuZ3RoKHRlc3RTdHJpbmdCKTsKKyAgICBFWFBFQ1Rf
RkFMU0UoZGVjb2RlU3RyaW5nV2l0aExlbmd0aCh2LmRhdGEoKSwgdi5kYXRhKCkgKyB2LnNpemUo
KSAtIDEsIHMpKTsKKworICAgIGNvbnN0IGludCBrTG9uZ1N0cmluZ0xlbiA9IDEyMzQ7CisgICAg
VUNoYXIgbG9uZ1N0cmluZ1trTG9uZ1N0cmluZ0xlbiArIDFdOworICAgIGZvciAoaW50IGkgPSAw
OyBpIDwga0xvbmdTdHJpbmdMZW47IGkrKykKKyAgICAgICAgbG9uZ1N0cmluZ1tpXSA9IGk7Cisg
ICAgbG9uZ1N0cmluZ1trTG9uZ1N0cmluZ0xlbl0gPSAwOworCisgICAgdiA9IGVuY29kZVN0cmlu
Z1dpdGhMZW5ndGgobG9uZ1N0cmluZyk7CisgICAgcCA9IGRlY29kZVN0cmluZ1dpdGhMZW5ndGgo
di5kYXRhKCksIHYuZGF0YSgpICsgdi5zaXplKCksIHMpOworICAgIEVYUEVDVF9FUShsb25nU3Ry
aW5nLCBzKTsKKyAgICBFWFBFQ1RfRVEodi5kYXRhKCkgKyB2LnNpemUoKSwgcCk7Cit9CisKK1RF
U1QoSURCTGV2ZWxEQkNvZGluZ1Rlc3QsIEVuY29kZURvdWJsZSkKK3sKKyAgICBFWFBFQ1RfRVEo
c3RhdGljX2Nhc3Q8c2l6ZV90Pig4KSwgZW5jb2RlRG91YmxlKDMuMTQpLnNpemUoKSk7Cit9CisK
K1RFU1QoSURCTGV2ZWxEQkNvZGluZ1Rlc3QsIERlY29kZURvdWJsZSkKK3sKKyAgICBWZWN0b3I8
Y2hhcj4gdjsKKyAgICBjb25zdCBjaGFyKiBwOworICAgIGRvdWJsZSBkOworCisgICAgdiA9IGVu
Y29kZURvdWJsZSgzLjE0KTsKKyAgICBwID0gZGVjb2RlRG91YmxlKHYuZGF0YSgpLCB2LmRhdGEo
KSArIHYuc2l6ZSgpLCAmZCk7CisgICAgRVhQRUNUX0VRKDMuMTQsIGQpOworICAgIEVYUEVDVF9F
USh2LmRhdGEoKSArIHYuc2l6ZSgpLCBwKTsKKworICAgIHYgPSBlbmNvZGVEb3VibGUoLTMuMTQp
OworICAgIHAgPSBkZWNvZGVEb3VibGUodi5kYXRhKCksIHYuZGF0YSgpICsgdi5zaXplKCksICZk
KTsKKyAgICBFWFBFQ1RfRVEoLTMuMTQsIGQpOworICAgIEVYUEVDVF9FUSh2LmRhdGEoKSArIHYu
c2l6ZSgpLCBwKTsKKworICAgIHYgPSBlbmNvZGVEb3VibGUoMy4xNCk7CisgICAgcCA9IGRlY29k
ZURvdWJsZSh2LmRhdGEoKSwgdi5kYXRhKCkgKyB2LnNpemUoKSAtIDEsICZkKTsKKyAgICBFWFBF
Q1RfRkFMU0UocCk7Cit9CisKK1RFU1QoSURCTGV2ZWxEQkNvZGluZ1Rlc3QsIEVuY29kZURlY29k
ZUlEQktleSkKK3sKKyAgICBSZWZQdHI8SURCS2V5PiBleHBlY3RlZEtleTsKKyAgICBSZWZQdHI8
SURCS2V5PiBkZWNvZGVkS2V5OworICAgIFZlY3RvcjxjaGFyPiB2OworICAgIGNvbnN0IGNoYXIq
IHA7CisKKyAgICBleHBlY3RlZEtleSA9IElEQktleTo6Y3JlYXRlTnVtYmVyKDEyMzQpOworICAg
IHYgPSBlbmNvZGVJREJLZXkoKmV4cGVjdGVkS2V5KTsKKyAgICBwID0gZGVjb2RlSURCS2V5KHYu
ZGF0YSgpLCB2LmRhdGEoKSArIHYuc2l6ZSgpLCBkZWNvZGVkS2V5KTsKKyAgICBFWFBFQ1RfVFJV
RShkZWNvZGVkS2V5LT5pc0VxdWFsKGV4cGVjdGVkS2V5LmdldCgpKSk7CisgICAgRVhQRUNUX0VR
KHYuZGF0YSgpICsgdi5zaXplKCksIHApOworICAgIEVYUEVDVF9GQUxTRShkZWNvZGVJREJLZXko
di5kYXRhKCksIHYuZGF0YSgpICsgdi5zaXplKCkgLSAxLCBkZWNvZGVkS2V5KSk7CisKKyAgICBl
eHBlY3RlZEtleSA9IElEQktleTo6Y3JlYXRlU3RyaW5nKCJIZWxsbyBXb3JsZCEiKTsKKyAgICB2
ID0gZW5jb2RlSURCS2V5KCpleHBlY3RlZEtleSk7CisgICAgcCA9IGRlY29kZUlEQktleSh2LmRh
dGEoKSwgdi5kYXRhKCkgKyB2LnNpemUoKSwgZGVjb2RlZEtleSk7CisgICAgRVhQRUNUX1RSVUUo
ZGVjb2RlZEtleS0+aXNFcXVhbChleHBlY3RlZEtleS5nZXQoKSkpOworICAgIEVYUEVDVF9FUSh2
LmRhdGEoKSArIHYuc2l6ZSgpLCBwKTsKKyAgICBFWFBFQ1RfRkFMU0UoZGVjb2RlSURCS2V5KHYu
ZGF0YSgpLCB2LmRhdGEoKSArIHYuc2l6ZSgpIC0gMSwgZGVjb2RlZEtleSkpOworCisgICAgZXhw
ZWN0ZWRLZXkgPSBJREJLZXk6OmNyZWF0ZURhdGUoNzg5MCk7CisgICAgdiA9IGVuY29kZUlEQktl
eSgqZXhwZWN0ZWRLZXkpOworICAgIHAgPSBkZWNvZGVJREJLZXkodi5kYXRhKCksIHYuZGF0YSgp
ICsgdi5zaXplKCksIGRlY29kZWRLZXkpOworICAgIEVYUEVDVF9UUlVFKGRlY29kZWRLZXktPmlz
RXF1YWwoZXhwZWN0ZWRLZXkuZ2V0KCkpKTsKKyAgICBFWFBFQ1RfRVEodi5kYXRhKCkgKyB2LnNp
emUoKSwgcCk7CisgICAgRVhQRUNUX0ZBTFNFKGRlY29kZUlEQktleSh2LmRhdGEoKSwgdi5kYXRh
KCkgKyB2LnNpemUoKSAtIDEsIGRlY29kZWRLZXkpKTsKK30KKworVEVTVChJREJMZXZlbERCQ29k
aW5nVGVzdCwgRXh0cmFjdEFuZENvbXBhcmVJREJLZXlzKQoreworICAgIFZlY3RvcjxSZWZQdHI8
SURCS2V5PiA+IGtleXM7CisKKyAgICBrZXlzLmFwcGVuZChJREJLZXk6OmNyZWF0ZU51bWJlcigt
MTApKTsKKyAgICBrZXlzLmFwcGVuZChJREJLZXk6OmNyZWF0ZU51bWJlcigwKSk7CisgICAga2V5
cy5hcHBlbmQoSURCS2V5OjpjcmVhdGVOdW1iZXIoMy4xNCkpOworCisgICAga2V5cy5hcHBlbmQo
SURCS2V5OjpjcmVhdGVEYXRlKDApKTsKKyAgICBrZXlzLmFwcGVuZChJREJLZXk6OmNyZWF0ZURh
dGUoMTAwKSk7CisgICAga2V5cy5hcHBlbmQoSURCS2V5OjpjcmVhdGVEYXRlKDEwMDAwMCkpOwor
CisgICAga2V5cy5hcHBlbmQoSURCS2V5OjpjcmVhdGVTdHJpbmcoIiIpKTsKKyAgICBrZXlzLmFw
cGVuZChJREJLZXk6OmNyZWF0ZVN0cmluZygiYSIpKTsKKyAgICBrZXlzLmFwcGVuZChJREJLZXk6
OmNyZWF0ZVN0cmluZygiYiIpKTsKKyAgICBrZXlzLmFwcGVuZChJREJLZXk6OmNyZWF0ZVN0cmlu
ZygiYmFhYSIpKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga2V5cy5zaXplKCkgLSAx
OyBpKyspIHsKKyAgICAgICAgUmVmUHRyPElEQktleT4ga2V5QSA9IGtleXNbaV07CisgICAgICAg
IFJlZlB0cjxJREJLZXk+IGtleUIgPSBrZXlzW2kgKyAxXTsKKworICAgICAgICBFWFBFQ1RfVFJV
RShrZXlBLT5pc0xlc3NUaGFuKGtleUIuZ2V0KCkpKTsKKworICAgICAgICBWZWN0b3I8Y2hhcj4g
ZW5jb2RlZEEgPSBlbmNvZGVJREJLZXkoKmtleUEpOworICAgICAgICBFWFBFQ1RfVFJVRShlbmNv
ZGVkQS5zaXplKCkpOworICAgICAgICBWZWN0b3I8Y2hhcj4gZW5jb2RlZEIgPSBlbmNvZGVJREJL
ZXkoKmtleUIpOworICAgICAgICBFWFBFQ1RfVFJVRShlbmNvZGVkQi5zaXplKCkpOworCisgICAg
ICAgIFZlY3RvcjxjaGFyPiBleHRyYWN0ZWRBOworICAgICAgICBWZWN0b3I8Y2hhcj4gZXh0cmFj
dGVkQjsKKworICAgICAgICBjb25zdCBjaGFyKiBwID0gZXh0cmFjdEVuY29kZWRJREJLZXkoZW5j
b2RlZEEuZGF0YSgpLCBlbmNvZGVkQS5kYXRhKCkgKyBlbmNvZGVkQS5zaXplKCksICZleHRyYWN0
ZWRBKTsKKyAgICAgICAgRVhQRUNUX0VRKGVuY29kZWRBLmRhdGEoKSArIGVuY29kZWRBLnNpemUo
KSwgcCk7CisgICAgICAgIEVYUEVDVF9FUShlbmNvZGVkQSwgZXh0cmFjdGVkQSk7CisKKyAgICAg
ICAgY29uc3QgY2hhciogcSA9IGV4dHJhY3RFbmNvZGVkSURCS2V5KGVuY29kZWRCLmRhdGEoKSwg
ZW5jb2RlZEIuZGF0YSgpICsgZW5jb2RlZEIuc2l6ZSgpLCAmZXh0cmFjdGVkQik7CisgICAgICAg
IEVYUEVDVF9FUShlbmNvZGVkQi5kYXRhKCkgKyBlbmNvZGVkQi5zaXplKCksIHEpOworICAgICAg
ICBFWFBFQ1RfRVEoZW5jb2RlZEIsIGV4dHJhY3RlZEIpOworCisgICAgICAgIEVYUEVDVF9MVChj
b21wYXJlRW5jb2RlZElEQktleXMoZXh0cmFjdGVkQSwgZXh0cmFjdGVkQiksIDApOworICAgICAg
ICBFWFBFQ1RfR1QoY29tcGFyZUVuY29kZWRJREJLZXlzKGV4dHJhY3RlZEIsIGV4dHJhY3RlZEEp
LCAwKTsKKyAgICAgICAgRVhQRUNUX0VRKGNvbXBhcmVFbmNvZGVkSURCS2V5cyhleHRyYWN0ZWRB
LCBleHRyYWN0ZWRBKSwgMCk7CisgICAgICAgIEVYUEVDVF9FUShjb21wYXJlRW5jb2RlZElEQktl
eXMoZXh0cmFjdGVkQiwgZXh0cmFjdGVkQiksIDApOworCisgICAgICAgIEVYUEVDVF9GQUxTRShl
eHRyYWN0RW5jb2RlZElEQktleShlbmNvZGVkQS5kYXRhKCksIGVuY29kZWRBLmRhdGEoKSArIGVu
Y29kZWRBLnNpemUoKSAtIDEsICZleHRyYWN0ZWRBKSk7CisgICAgfQorfQorCit9IC8vIG5hbWVz
cGFjZQorCisjZW5kaWYgLy8gRU5BQkxFKExFVkVMREIpCisjZW5kaWYgLy8gRU5BQkxFKElOREVY
RURfREFUQUJBU0UpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>92057</attachid>
            <date>2011-05-03 02:46:18 -0700</date>
            <delta_ts>2011-05-04 07:07:38 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-59692-20110503104615.patch</filename>
            <type>text/plain</type>
            <size>15442</size>
            <attacher name="Hans Wennborg">hans</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogODU1OTIKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCBiZmJlYmQ3Yjk1YTFlOTY3
NzEwODUzOTRjOTUyMzdlMjI4Y2IwN2Y2Li40YjE5OTRiMDIwOGZjYTZmN2MzNjNhYTAxNDY3Mjhj
ZTU1OGIyZjVlIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTggQEAKKzIwMTEtMDUtMDMgIEhhbnMg
V2VubmJvcmcgIDxoYW5zQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBJbmRleGVkREI6IFVuaXQgdGVzdHMgZm9yIExldmVsREIg
a2V5IGNvZGluZyBmdW5jdGlvbnMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTU5NjkyCisKKyAgICAgICAgRml4IHNvbWUgZW1iYXJyYXNzaW5nIGJ1Z3Mg
dW5jb3ZlcmVkIGJ5IHVuaXQgdGVzdHMuCisKKyAgICAgICAgTm8gbmV3IGZ1bmN0aW9uYWxpdHks
IGJ1dCB0aGlzIGlzIG5vdyBjb3ZlcmVkIGJ5IHVuaXQgdGVzdHMgaW4gdGhlIENocm9taXVtIFdl
YktpdCBwb3J0LgorCisgICAgICAgICogc3RvcmFnZS9JREJMZXZlbERCQ29kaW5nLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OmRlY29kZUludCk6CisgICAgICAgIChX
ZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpkZWNvZGVWYXJJbnQpOgorCiAyMDExLTA1LTAzICBQ
YXZlbCBGZWxkbWFuICA8cGZlbGRtYW5AY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2Vk
IGJ5IFl1cnkgU2VtaWtoYXRza3kuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdl
L0lEQkxldmVsREJDb2RpbmcuY3BwIGIvU291cmNlL1dlYkNvcmUvc3RvcmFnZS9JREJMZXZlbERC
Q29kaW5nLmNwcAppbmRleCA4MjJhYzE3OGUxZDcyYTQ2MTc4ZDdjZmYzMjIwNTgwYjEwZjlhZWFi
Li4xOGE3NGY2ODg0NTIzZGFiMTBhZmFkNGQyZGY2YjM5MTM3MzIwMzFjIDEwMDY0NAotLS0gYS9T
b3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxldmVsREJDb2RpbmcuY3BwCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3N0b3JhZ2UvSURCTGV2ZWxEQkNvZGluZy5jcHAKQEAgLTE4OSw5ICsxODksMTEgQEAg
aW50NjRfdCBkZWNvZGVJbnQoY29uc3QgY2hhciogYmVnaW4sIGNvbnN0IGNoYXIqIGVuZCkKICAg
ICBBU1NFUlQoYmVnaW4gPD0gZW5kKTsKICAgICBpbnQ2NF90IHJldCA9IDA7CiAKKyAgICBpbnQg
c2hpZnQgPSAwOwogICAgIHdoaWxlIChiZWdpbiA8IGVuZCkgewogICAgICAgICB1bnNpZ25lZCBj
aGFyIGMgPSAqYmVnaW4rKzsKLSAgICAgICAgcmV0ID0gKHJldCA8PCA4KSB8IGM7CisgICAgICAg
IHJldCA9IHJldCB8IChzdGF0aWNfY2FzdDxpbnQ2NF90PihjKSA8PCBzaGlmdCk7CisgICAgICAg
IHNoaWZ0ICs9IDg7CiAgICAgfQogCiAgICAgcmV0dXJuIHJldDsKQEAgLTIxNiwxMiArMjE4LDE0
IEBAIGNvbnN0IGNoYXIqIGRlY29kZVZhckludChjb25zdCBjaGFyICpwLCBjb25zdCBjaGFyKiBs
aW1pdCwgaW50NjRfdCYgZm91bmRJbnQpCiB7CiAgICAgQVNTRVJUKGxpbWl0ID49IHApOwogICAg
IGZvdW5kSW50ID0gMDsKKyAgICBpbnQgc2hpZnQgPSAwOwogCiAgICAgZG8gewogICAgICAgICBp
ZiAocCA+PSBsaW1pdCkKICAgICAgICAgICAgIHJldHVybiAwOwogCi0gICAgICAgIGZvdW5kSW50
ID0gKGZvdW5kSW50IDw8IDcpIHwgKCpwICYgMHg3Zik7CisgICAgICAgIGZvdW5kSW50IHw9IHN0
YXRpY19jYXN0PGludDY0X3Q+KCpwICYgMHg3ZikgPDwgc2hpZnQ7CisgICAgICAgIHNoaWZ0ICs9
IDc7CiAgICAgfSB3aGlsZSAoKnArKyAmIDEyOCk7CiAgICAgcmV0dXJuIHA7CiB9CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvY2hy
b21pdW0vQ2hhbmdlTG9nCmluZGV4IDZlNGE2NDlkZmZmZGE2ZjI2N2U5Y2U4MDljYWVkYjlmY2Uw
MDhiNjAuLmIyMDY3ZTdjNDg2NzJjYzc4NzAxM2E4ZGJmMjM2ZDgyMzEzODA0ZjkgMTAwNjQ0Ci0t
LSBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQv
Y2hyb21pdW0vQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTYgQEAKKzIwMTEtMDUtMDMgIEhhbnMgV2Vu
bmJvcmcgIDxoYW5zQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBJbmRleGVkREI6IFVuaXQgdGVzdHMgZm9yIExldmVsREIga2V5
IGNvZGluZyBmdW5jdGlvbnMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTU5NjkyCisKKyAgICAgICAgQWRkIHVuaXQgdGVzdHMgZm9yIHRoZSBiYXNpYyBr
ZXkgY29kaW5nIGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBMZXZlbERCIGJhY2stZW5kLgorCisgICAg
ICAgICogV2ViS2l0Lmd5cGk6CisgICAgICAgICogdGVzdHMvSURCTGV2ZWxEQkNvZGluZ1Rlc3Qu
Y3BwOiBBZGRlZC4KKyAgICAgICAgKElEQkxldmVsREJDb2Rpbmc6OlRFU1QpOgorCiAyMDExLTA1
LTAzICBQYXZlbCBGZWxkbWFuICA8cGZlbGRtYW5AZ29vZ2xlLmNvbT4KIAogICAgICAgICBOb3Qg
cmV2aWV3ZWQ6IHJlLWFwcGxpZWQgcjg1NTg5LgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9j
aHJvbWl1bS9XZWJLaXQuZ3lwaSBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cGkK
aW5kZXggN2QzYTZiOTU3NjJmMmE4MjRiYjUyZmJjNGU1OThkN2M5MzNjNjM1OC4uMDU2N2ZhZDRi
NGNjYjQxNmE3YmY0NGQ4YmIxY2YwMTViMzgwMjA1YyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktp
dC9jaHJvbWl1bS9XZWJLaXQuZ3lwaQorKysgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL1dlYktp
dC5neXBpCkBAIC01Nyw2ICs1Nyw3IEBACiAgICAgICAgICAgICAndGVzdHMvQ0NUaHJlYWRUZXN0
LmNwcCcsCiAgICAgICAgICAgICAndGVzdHMvSURCQmluZGluZ1V0aWxpdGllc1Rlc3QuY3BwJywK
ICAgICAgICAgICAgICd0ZXN0cy9JREJLZXlQYXRoVGVzdC5jcHAnLAorICAgICAgICAgICAgJ3Rl
c3RzL0lEQkxldmVsREJDb2RpbmdUZXN0LmNwcCcsCiAgICAgICAgICAgICAndGVzdHMvS2V5Ym9h
cmRUZXN0LmNwcCcsCiAgICAgICAgICAgICAndGVzdHMvS1VSTFRlc3QuY3BwJywKICAgICAgICAg
ICAgICd0ZXN0cy9QT0RBcmVuYVRlc3QuY3BwJywKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQv
Y2hyb21pdW0vdGVzdHMvSURCTGV2ZWxEQkNvZGluZ1Rlc3QuY3BwIGIvU291cmNlL1dlYktpdC9j
aHJvbWl1bS90ZXN0cy9JREJMZXZlbERCQ29kaW5nVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZjg4ZTUz
NTRjNGI4YTFjZjk0Y2I2ODEyMjlmZGYyNjQzMzMxZjAwZAotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvSURCTGV2ZWxEQkNvZGluZ1Rlc3QuY3BwCkBAIC0w
LDAgKzEsMzQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YK
KyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIklEQkxl
dmVsREJDb2RpbmcuaCIKKworI2luY2x1ZGUgIklEQktleS5oIgorI2luY2x1ZGUgPGd0ZXN0L2d0
ZXN0Lmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCisjaWYgRU5BQkxFKElOREVYRURfREFU
QUJBU0UpCisjaWYgRU5BQkxFKExFVkVMREIpCisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwor
dXNpbmcgbmFtZXNwYWNlIElEQkxldmVsREJDb2Rpbmc7CisKK25hbWVzcGFjZSB7CisKK1RFU1Qo
SURCTGV2ZWxEQkNvZGluZ1Rlc3QsIEVuY29kZUJ5dGUpCit7CisgICAgVmVjdG9yPGNoYXI+IGV4
cGVjdGVkOworICAgIGV4cGVjdGVkLmFwcGVuZCgwKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBp
IDwgMjU2OyArK2kpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhciBjID0gaTsKKworICAgICAgICBl
eHBlY3RlZFswXSA9IGM7CisgICAgICAgIEVYUEVDVF9FUShleHBlY3RlZCwgZW5jb2RlQnl0ZShj
KSk7CisgICAgfQorfQorCitURVNUKElEQkxldmVsREJDb2RpbmdUZXN0LCBNYXhJREJLZXkpCit7
CisgICAgVmVjdG9yPGNoYXI+IG1heEtleSA9IG1heElEQktleSgpOworCisgICAgVmVjdG9yPGNo
YXI+IG1pbktleSA9IG1pbklEQktleSgpOworICAgIFZlY3RvcjxjaGFyPiBzdHJpbmdLZXkgPSBl
bmNvZGVJREJLZXkoKklEQktleTo6Y3JlYXRlU3RyaW5nKCJIZWxsbyB3b3JsZCIpKTsKKyAgICBW
ZWN0b3I8Y2hhcj4gbnVtYmVyS2V5ID0gZW5jb2RlSURCS2V5KCpJREJLZXk6OmNyZWF0ZU51bWJl
cigzLjE0KSk7CisgICAgVmVjdG9yPGNoYXI+IGRhdGVLZXkgPSBlbmNvZGVJREJLZXkoKklEQktl
eTo6Y3JlYXRlRGF0ZSgxMDAwMDAwKSk7CisKKyAgICBFWFBFQ1RfR1QoY29tcGFyZUVuY29kZWRJ
REJLZXlzKG1heEtleSwgbWluS2V5KSwgMCk7CisgICAgRVhQRUNUX0dUKGNvbXBhcmVFbmNvZGVk
SURCS2V5cyhtYXhLZXksIHN0cmluZ0tleSksIDApOworICAgIEVYUEVDVF9HVChjb21wYXJlRW5j
b2RlZElEQktleXMobWF4S2V5LCBudW1iZXJLZXkpLCAwKTsKKyAgICBFWFBFQ1RfR1QoY29tcGFy
ZUVuY29kZWRJREJLZXlzKG1heEtleSwgZGF0ZUtleSksIDApOworfQorCitURVNUKElEQkxldmVs
REJDb2RpbmdUZXN0LCBNaW5JREJLZXkpCit7CisgICAgVmVjdG9yPGNoYXI+IG1pbktleSA9IG1p
bklEQktleSgpOworCisgICAgVmVjdG9yPGNoYXI+IG1heEtleSA9IG1heElEQktleSgpOworICAg
IFZlY3RvcjxjaGFyPiBzdHJpbmdLZXkgPSBlbmNvZGVJREJLZXkoKklEQktleTo6Y3JlYXRlU3Ry
aW5nKCJIZWxsbyB3b3JsZCIpKTsKKyAgICBWZWN0b3I8Y2hhcj4gbnVtYmVyS2V5ID0gZW5jb2Rl
SURCS2V5KCpJREJLZXk6OmNyZWF0ZU51bWJlcigzLjE0KSk7CisgICAgVmVjdG9yPGNoYXI+IGRh
dGVLZXkgPSBlbmNvZGVJREJLZXkoKklEQktleTo6Y3JlYXRlRGF0ZSgxMDAwMDAwKSk7CisKKyAg
ICBFWFBFQ1RfTFQoY29tcGFyZUVuY29kZWRJREJLZXlzKG1pbktleSwgbWF4S2V5KSwgMCk7Cisg
ICAgRVhQRUNUX0xUKGNvbXBhcmVFbmNvZGVkSURCS2V5cyhtaW5LZXksIHN0cmluZ0tleSksIDAp
OworICAgIEVYUEVDVF9MVChjb21wYXJlRW5jb2RlZElEQktleXMobWluS2V5LCBudW1iZXJLZXkp
LCAwKTsKKyAgICBFWFBFQ1RfTFQoY29tcGFyZUVuY29kZWRJREJLZXlzKG1pbktleSwgZGF0ZUtl
eSksIDApOworfQorCitURVNUKElEQkxldmVsREJDb2RpbmdUZXN0LCBFbmNvZGVJbnQpCit7Cisg
ICAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PHNpemVfdD4oMSksIGVuY29kZUludCgxKS5zaXplKCkp
OworICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxzaXplX3Q+KDEpLCBlbmNvZGVJbnQoMjU1KS5z
aXplKCkpOworICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxzaXplX3Q+KDIpLCBlbmNvZGVJbnQo
MjU2KS5zaXplKCkpOworICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxzaXplX3Q+KDQpLCBlbmNv
ZGVJbnQoMHhmZmZmZmZmZikuc2l6ZSgpKTsKK30KKworVEVTVChJREJMZXZlbERCQ29kaW5nVGVz
dCwgRGVjb2RlSW50KQoreworICAgIGludDY0X3QgbiA9IDA7CisgICAgVmVjdG9yPGNoYXI+IHY7
CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgICAgICB2ID0gZW5j
b2RlSW50KG4pOworICAgICAgICBFWFBFQ1RfRVEobiwgZGVjb2RlSW50KHYuZGF0YSgpLCB2LmRh
dGEoKSArIHYuc2l6ZSgpKSk7CisKKyAgICAgICAgbiArPSA2MzsKKyAgICAgICAgaWYgKGkgPiA1
MDApCisgICAgICAgICAgICBuICs9IDEyMzQ7CisgICAgfQorCisgICAgbiA9IDc3MTExOTI0MzE3
NTU2NjU3OTJsbDsKKyAgICB2ID0gZW5jb2RlSW50KG4pOworICAgIEVYUEVDVF9FUShuLCBkZWNv
ZGVJbnQodi5kYXRhKCksIHYuZGF0YSgpICsgdi5zaXplKCkpKTsKKworICAgIG4gPSAweDdmZmZm
ZmZmZmZmZmZmZmZsbDsKKyAgICB2ID0gZW5jb2RlSW50KG4pOworICAgIEVYUEVDVF9FUShuLCBk
ZWNvZGVJbnQodi5kYXRhKCksIHYuZGF0YSgpICsgdi5zaXplKCkpKTsKK30KKworVEVTVChJREJM
ZXZlbERCQ29kaW5nVGVzdCwgRW5jb2RlVmFySW50KQoreworICAgIEVYUEVDVF9FUShzdGF0aWNf
Y2FzdDxzaXplX3Q+KDEpLCBlbmNvZGVWYXJJbnQoMSkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEo
c3RhdGljX2Nhc3Q8c2l6ZV90PigyKSwgZW5jb2RlVmFySW50KDI1NSkuc2l6ZSgpKTsKKyAgICBF
WFBFQ1RfRVEoc3RhdGljX2Nhc3Q8c2l6ZV90PigyKSwgZW5jb2RlVmFySW50KDI1Nikuc2l6ZSgp
KTsKKyAgICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8c2l6ZV90Pig1KSwgZW5jb2RlVmFySW50KDB4
ZmZmZmZmZmYpLnNpemUoKSk7Cit9CisKK1RFU1QoSURCTGV2ZWxEQkNvZGluZ1Rlc3QsIERlY29k
ZVZhckludCkKK3sKKyAgICBpbnQ2NF90IG4gPSAwOworICAgIGludDY0X3QgcmVzOworICAgIFZl
Y3RvcjxjaGFyPiB2OworICAgIGNvbnN0IGNoYXIqIHA7CisKKyAgICBmb3IgKGludCBpID0gMDsg
aSA8IDEwMDA7IGkrKykgeworICAgICAgICB2ID0gZW5jb2RlVmFySW50KG4pOworICAgICAgICBw
ID0gZGVjb2RlVmFySW50KHYuZGF0YSgpLCB2LmRhdGEoKSArIHYuc2l6ZSgpLCByZXMpOworICAg
ICAgICBFWFBFQ1RfRVEobiwgcmVzKTsKKyAgICAgICAgRVhQRUNUX0VRKHYuZGF0YSgpICsgdi5z
aXplKCksIHApOworCisgICAgICAgIHAgPSBkZWNvZGVWYXJJbnQodi5kYXRhKCksIHYuZGF0YSgp
ICsgdi5zaXplKCkgLSAxLCByZXMpOworICAgICAgICBFWFBFQ1RfRkFMU0UocCk7CisKKyAgICAg
ICAgbiArPSA2MzsKKyAgICAgICAgaWYgKGkgPiA1MDApCisgICAgICAgICAgICBuICs9IDEyMzQ7
CisgICAgfQorCisgICAgbiA9IDc3MTExOTI0MzE3NTU2NjU3OTJsbDsKKyAgICB2ID0gZW5jb2Rl
VmFySW50KG4pOworICAgIHAgPSBkZWNvZGVWYXJJbnQodi5kYXRhKCksIHYuZGF0YSgpICsgdi5z
aXplKCksIHJlcyk7CisgICAgRVhQRUNUX0VRKG4sIHJlcyk7CisgICAgRVhQRUNUX0VRKHYuZGF0
YSgpICsgdi5zaXplKCksIHApOworCisgICAgbiA9IDB4N2ZmZmZmZmZmZmZmZmZmZmxsOworICAg
IHYgPSBlbmNvZGVWYXJJbnQobik7CisgICAgcCA9IGRlY29kZVZhckludCh2LmRhdGEoKSwgdi5k
YXRhKCkgKyB2LnNpemUoKSwgcmVzKTsKKyAgICBFWFBFQ1RfRVEobiwgcmVzKTsKKyAgICBFWFBF
Q1RfRVEodi5kYXRhKCkgKyB2LnNpemUoKSwgcCk7CisKKyAgICBFWFBFQ1RfRkFMU0UoZGVjb2Rl
VmFySW50KHYuZGF0YSgpLCB2LmRhdGEoKSwgcmVzKSk7Cit9CisKK1RFU1QoSURCTGV2ZWxEQkNv
ZGluZ1Rlc3QsIEVuY29kZVN0cmluZykKK3sKKyAgICBjb25zdCBVQ2hhciB0ZXN0U3RyaW5nQVtd
ID0geydmJywgJ28nLCAnbycsICdcMCd9OworICAgIGNvbnN0IFVDaGFyIHRlc3RTdHJpbmdCW10g
PSB7MHhkZWFkLCAweGJlZWYsICdcMCd9OworCisgICAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PHNp
emVfdD4oMiksIGVuY29kZVN0cmluZygiYSIpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKHN0YXRp
Y19jYXN0PHNpemVfdD4oNiksIGVuY29kZVN0cmluZygiZm9vIikuc2l6ZSgpKTsKKyAgICBFWFBF
Q1RfRVEoc3RhdGljX2Nhc3Q8c2l6ZV90Pig2KSwgZW5jb2RlU3RyaW5nKHRlc3RTdHJpbmdBKS5z
aXplKCkpOworICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxzaXplX3Q+KDQpLCBlbmNvZGVTdHJp
bmcodGVzdFN0cmluZ0IpLnNpemUoKSk7Cit9CisKK1RFU1QoSURCTGV2ZWxEQkNvZGluZ1Rlc3Qs
IERlY29kZVN0cmluZykKK3sKKyAgICBjb25zdCBVQ2hhciB0ZXN0U3RyaW5nQVtdID0geydmJywg
J28nLCAnbycsICdcMCd9OworICAgIGNvbnN0IFVDaGFyIHRlc3RTdHJpbmdCW10gPSB7MHhkZWFk
LCAweGJlZWYsICdcMCd9OworICAgIFZlY3RvcjxjaGFyPiB2OworCisgICAgdiA9IGVuY29kZVN0
cmluZygiYSIpOworICAgIEVYUEVDVF9FUShTdHJpbmcoImEiKSwgZGVjb2RlU3RyaW5nKHYuZGF0
YSgpLCB2LmRhdGEoKSArIHYuc2l6ZSgpKSk7CisKKyAgICB2ID0gZW5jb2RlU3RyaW5nKCJmb28i
KTsKKyAgICBFWFBFQ1RfRVEoU3RyaW5nKCJmb28iKSwgZGVjb2RlU3RyaW5nKHYuZGF0YSgpLCB2
LmRhdGEoKSArIHYuc2l6ZSgpKSk7CisKKyAgICB2ID0gZW5jb2RlU3RyaW5nKHRlc3RTdHJpbmdB
KTsKKyAgICBFWFBFQ1RfRVEodGVzdFN0cmluZ0EsIGRlY29kZVN0cmluZyh2LmRhdGEoKSwgdi5k
YXRhKCkgKyB2LnNpemUoKSkpOworCisgICAgdiA9IGVuY29kZVN0cmluZyh0ZXN0U3RyaW5nQik7
CisgICAgRVhQRUNUX0VRKHRlc3RTdHJpbmdCLCBkZWNvZGVTdHJpbmcodi5kYXRhKCksIHYuZGF0
YSgpICsgdi5zaXplKCkpKTsKK30KKworVEVTVChJREJMZXZlbERCQ29kaW5nVGVzdCwgRW5jb2Rl
U3RyaW5nV2l0aExlbmd0aCkKK3sKKyAgICBjb25zdCBVQ2hhciB0ZXN0U3RyaW5nQVtdID0geydm
JywgJ28nLCAnbycsICdcMCd9OworICAgIGNvbnN0IFVDaGFyIHRlc3RTdHJpbmdCW10gPSB7MHhk
ZWFkLCAweGJlZWYsICdcMCd9OworCisgICAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PHNpemVfdD4o
MyksIGVuY29kZVN0cmluZ1dpdGhMZW5ndGgoImEiKS5zaXplKCkpOworICAgIEVYUEVDVF9FUShz
dGF0aWNfY2FzdDxzaXplX3Q+KDcpLCBlbmNvZGVTdHJpbmdXaXRoTGVuZ3RoKHRlc3RTdHJpbmdB
KS5zaXplKCkpOworICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxzaXplX3Q+KDUpLCBlbmNvZGVT
dHJpbmdXaXRoTGVuZ3RoKHRlc3RTdHJpbmdCKS5zaXplKCkpOworfQorCitURVNUKElEQkxldmVs
REJDb2RpbmdUZXN0LCBEZWNvZGVTdHJpbmdXaXRoTGVuZ3RoKQoreworICAgIGNvbnN0IFVDaGFy
IHRlc3RTdHJpbmdBW10gPSB7J2YnLCAnbycsICdvJywgJ1wwJ307CisgICAgY29uc3QgVUNoYXIg
dGVzdFN0cmluZ0JbXSA9IHsweGRlYWQsIDB4YmVlZiwgJ1wwJ307CisKKyAgICBWZWN0b3I8Y2hh
cj4gdjsKKyAgICBTdHJpbmcgczsKKyAgICBjb25zdCBjaGFyKiBwOworCisgICAgdiA9IGVuY29k
ZVN0cmluZ1dpdGhMZW5ndGgoImEiKTsKKyAgICBwID0gZGVjb2RlU3RyaW5nV2l0aExlbmd0aCh2
LmRhdGEoKSwgdi5kYXRhKCkgKyB2LnNpemUoKSwgcyk7CisgICAgRVhQRUNUX0VRKFN0cmluZygi
YSIpLCBzKTsKKyAgICBFWFBFQ1RfRVEodi5kYXRhKCkgKyB2LnNpemUoKSwgcCk7CisKKyAgICB2
ID0gZW5jb2RlU3RyaW5nV2l0aExlbmd0aCgiZm9vIik7CisgICAgcCA9IGRlY29kZVN0cmluZ1dp
dGhMZW5ndGgodi5kYXRhKCksIHYuZGF0YSgpICsgdi5zaXplKCksIHMpOworICAgIEVYUEVDVF9F
UShTdHJpbmcoImZvbyIpLCBzKTsKKyAgICBFWFBFQ1RfRVEodi5kYXRhKCkgKyB2LnNpemUoKSwg
cCk7CisKKyAgICB2ID0gZW5jb2RlU3RyaW5nV2l0aExlbmd0aCh0ZXN0U3RyaW5nQSk7CisgICAg
cCA9IGRlY29kZVN0cmluZ1dpdGhMZW5ndGgodi5kYXRhKCksIHYuZGF0YSgpICsgdi5zaXplKCks
IHMpOworICAgIEVYUEVDVF9FUSh0ZXN0U3RyaW5nQSwgcyk7CisgICAgRVhQRUNUX0VRKHYuZGF0
YSgpICsgdi5zaXplKCksIHApOworCisgICAgdiA9IGVuY29kZVN0cmluZ1dpdGhMZW5ndGgodGVz
dFN0cmluZ0IpOworICAgIHAgPSBkZWNvZGVTdHJpbmdXaXRoTGVuZ3RoKHYuZGF0YSgpLCB2LmRh
dGEoKSArIHYuc2l6ZSgpLCBzKTsKKyAgICBFWFBFQ1RfRVEodGVzdFN0cmluZ0IsIHMpOworICAg
IEVYUEVDVF9FUSh2LmRhdGEoKSArIHYuc2l6ZSgpLCBwKTsKKworICAgIHYgPSBlbmNvZGVTdHJp
bmdXaXRoTGVuZ3RoKHRlc3RTdHJpbmdCKTsKKyAgICBFWFBFQ1RfRkFMU0UoZGVjb2RlU3RyaW5n
V2l0aExlbmd0aCh2LmRhdGEoKSwgdi5kYXRhKCkgKyB2LnNpemUoKSAtIDEsIHMpKTsKKworICAg
IGNvbnN0IGludCBrTG9uZ1N0cmluZ0xlbiA9IDEyMzQ7CisgICAgVUNoYXIgbG9uZ1N0cmluZ1tr
TG9uZ1N0cmluZ0xlbiArIDFdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0xvbmdTdHJpbmdM
ZW47IGkrKykKKyAgICAgICAgbG9uZ1N0cmluZ1tpXSA9IGk7CisgICAgbG9uZ1N0cmluZ1trTG9u
Z1N0cmluZ0xlbl0gPSAwOworCisgICAgdiA9IGVuY29kZVN0cmluZ1dpdGhMZW5ndGgobG9uZ1N0
cmluZyk7CisgICAgcCA9IGRlY29kZVN0cmluZ1dpdGhMZW5ndGgodi5kYXRhKCksIHYuZGF0YSgp
ICsgdi5zaXplKCksIHMpOworICAgIEVYUEVDVF9FUShsb25nU3RyaW5nLCBzKTsKKyAgICBFWFBF
Q1RfRVEodi5kYXRhKCkgKyB2LnNpemUoKSwgcCk7Cit9CisKK1RFU1QoSURCTGV2ZWxEQkNvZGlu
Z1Rlc3QsIEVuY29kZURvdWJsZSkKK3sKKyAgICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8c2l6ZV90
Pig4KSwgZW5jb2RlRG91YmxlKDMuMTQpLnNpemUoKSk7Cit9CisKK1RFU1QoSURCTGV2ZWxEQkNv
ZGluZ1Rlc3QsIERlY29kZURvdWJsZSkKK3sKKyAgICBWZWN0b3I8Y2hhcj4gdjsKKyAgICBjb25z
dCBjaGFyKiBwOworICAgIGRvdWJsZSBkOworCisgICAgdiA9IGVuY29kZURvdWJsZSgzLjE0KTsK
KyAgICBwID0gZGVjb2RlRG91YmxlKHYuZGF0YSgpLCB2LmRhdGEoKSArIHYuc2l6ZSgpLCAmZCk7
CisgICAgRVhQRUNUX0VRKDMuMTQsIGQpOworICAgIEVYUEVDVF9FUSh2LmRhdGEoKSArIHYuc2l6
ZSgpLCBwKTsKKworICAgIHYgPSBlbmNvZGVEb3VibGUoLTMuMTQpOworICAgIHAgPSBkZWNvZGVE
b3VibGUodi5kYXRhKCksIHYuZGF0YSgpICsgdi5zaXplKCksICZkKTsKKyAgICBFWFBFQ1RfRVEo
LTMuMTQsIGQpOworICAgIEVYUEVDVF9FUSh2LmRhdGEoKSArIHYuc2l6ZSgpLCBwKTsKKworICAg
IHYgPSBlbmNvZGVEb3VibGUoMy4xNCk7CisgICAgcCA9IGRlY29kZURvdWJsZSh2LmRhdGEoKSwg
di5kYXRhKCkgKyB2LnNpemUoKSAtIDEsICZkKTsKKyAgICBFWFBFQ1RfRkFMU0UocCk7Cit9CisK
K1RFU1QoSURCTGV2ZWxEQkNvZGluZ1Rlc3QsIEVuY29kZURlY29kZUlEQktleSkKK3sKKyAgICBS
ZWZQdHI8SURCS2V5PiBleHBlY3RlZEtleTsKKyAgICBSZWZQdHI8SURCS2V5PiBkZWNvZGVkS2V5
OworICAgIFZlY3RvcjxjaGFyPiB2OworICAgIGNvbnN0IGNoYXIqIHA7CisKKyAgICBleHBlY3Rl
ZEtleSA9IElEQktleTo6Y3JlYXRlTnVtYmVyKDEyMzQpOworICAgIHYgPSBlbmNvZGVJREJLZXko
KmV4cGVjdGVkS2V5KTsKKyAgICBwID0gZGVjb2RlSURCS2V5KHYuZGF0YSgpLCB2LmRhdGEoKSAr
IHYuc2l6ZSgpLCBkZWNvZGVkS2V5KTsKKyAgICBFWFBFQ1RfVFJVRShkZWNvZGVkS2V5LT5pc0Vx
dWFsKGV4cGVjdGVkS2V5LmdldCgpKSk7CisgICAgRVhQRUNUX0VRKHYuZGF0YSgpICsgdi5zaXpl
KCksIHApOworICAgIEVYUEVDVF9GQUxTRShkZWNvZGVJREJLZXkodi5kYXRhKCksIHYuZGF0YSgp
ICsgdi5zaXplKCkgLSAxLCBkZWNvZGVkS2V5KSk7CisKKyAgICBleHBlY3RlZEtleSA9IElEQktl
eTo6Y3JlYXRlU3RyaW5nKCJIZWxsbyBXb3JsZCEiKTsKKyAgICB2ID0gZW5jb2RlSURCS2V5KCpl
eHBlY3RlZEtleSk7CisgICAgcCA9IGRlY29kZUlEQktleSh2LmRhdGEoKSwgdi5kYXRhKCkgKyB2
LnNpemUoKSwgZGVjb2RlZEtleSk7CisgICAgRVhQRUNUX1RSVUUoZGVjb2RlZEtleS0+aXNFcXVh
bChleHBlY3RlZEtleS5nZXQoKSkpOworICAgIEVYUEVDVF9FUSh2LmRhdGEoKSArIHYuc2l6ZSgp
LCBwKTsKKyAgICBFWFBFQ1RfRkFMU0UoZGVjb2RlSURCS2V5KHYuZGF0YSgpLCB2LmRhdGEoKSAr
IHYuc2l6ZSgpIC0gMSwgZGVjb2RlZEtleSkpOworCisgICAgZXhwZWN0ZWRLZXkgPSBJREJLZXk6
OmNyZWF0ZURhdGUoNzg5MCk7CisgICAgdiA9IGVuY29kZUlEQktleSgqZXhwZWN0ZWRLZXkpOwor
ICAgIHAgPSBkZWNvZGVJREJLZXkodi5kYXRhKCksIHYuZGF0YSgpICsgdi5zaXplKCksIGRlY29k
ZWRLZXkpOworICAgIEVYUEVDVF9UUlVFKGRlY29kZWRLZXktPmlzRXF1YWwoZXhwZWN0ZWRLZXku
Z2V0KCkpKTsKKyAgICBFWFBFQ1RfRVEodi5kYXRhKCkgKyB2LnNpemUoKSwgcCk7CisgICAgRVhQ
RUNUX0ZBTFNFKGRlY29kZUlEQktleSh2LmRhdGEoKSwgdi5kYXRhKCkgKyB2LnNpemUoKSAtIDEs
IGRlY29kZWRLZXkpKTsKK30KKworVEVTVChJREJMZXZlbERCQ29kaW5nVGVzdCwgRXh0cmFjdEFu
ZENvbXBhcmVJREJLZXlzKQoreworICAgIFZlY3RvcjxSZWZQdHI8SURCS2V5PiA+IGtleXM7CisK
KyAgICBrZXlzLmFwcGVuZChJREJLZXk6OmNyZWF0ZU51bWJlcigtMTApKTsKKyAgICBrZXlzLmFw
cGVuZChJREJLZXk6OmNyZWF0ZU51bWJlcigwKSk7CisgICAga2V5cy5hcHBlbmQoSURCS2V5Ojpj
cmVhdGVOdW1iZXIoMy4xNCkpOworCisgICAga2V5cy5hcHBlbmQoSURCS2V5OjpjcmVhdGVEYXRl
KDApKTsKKyAgICBrZXlzLmFwcGVuZChJREJLZXk6OmNyZWF0ZURhdGUoMTAwKSk7CisgICAga2V5
cy5hcHBlbmQoSURCS2V5OjpjcmVhdGVEYXRlKDEwMDAwMCkpOworCisgICAga2V5cy5hcHBlbmQo
SURCS2V5OjpjcmVhdGVTdHJpbmcoIiIpKTsKKyAgICBrZXlzLmFwcGVuZChJREJLZXk6OmNyZWF0
ZVN0cmluZygiYSIpKTsKKyAgICBrZXlzLmFwcGVuZChJREJLZXk6OmNyZWF0ZVN0cmluZygiYiIp
KTsKKyAgICBrZXlzLmFwcGVuZChJREJLZXk6OmNyZWF0ZVN0cmluZygiYmFhYSIpKTsKKworICAg
IGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga2V5cy5zaXplKCkgLSAxOyBpKyspIHsKKyAgICAgICAg
UmVmUHRyPElEQktleT4ga2V5QSA9IGtleXNbaV07CisgICAgICAgIFJlZlB0cjxJREJLZXk+IGtl
eUIgPSBrZXlzW2kgKyAxXTsKKworICAgICAgICBFWFBFQ1RfVFJVRShrZXlBLT5pc0xlc3NUaGFu
KGtleUIuZ2V0KCkpKTsKKworICAgICAgICBWZWN0b3I8Y2hhcj4gZW5jb2RlZEEgPSBlbmNvZGVJ
REJLZXkoKmtleUEpOworICAgICAgICBFWFBFQ1RfVFJVRShlbmNvZGVkQS5zaXplKCkpOworICAg
ICAgICBWZWN0b3I8Y2hhcj4gZW5jb2RlZEIgPSBlbmNvZGVJREJLZXkoKmtleUIpOworICAgICAg
ICBFWFBFQ1RfVFJVRShlbmNvZGVkQi5zaXplKCkpOworCisgICAgICAgIFZlY3RvcjxjaGFyPiBl
eHRyYWN0ZWRBOworICAgICAgICBWZWN0b3I8Y2hhcj4gZXh0cmFjdGVkQjsKKworICAgICAgICBj
b25zdCBjaGFyKiBwID0gZXh0cmFjdEVuY29kZWRJREJLZXkoZW5jb2RlZEEuZGF0YSgpLCBlbmNv
ZGVkQS5kYXRhKCkgKyBlbmNvZGVkQS5zaXplKCksICZleHRyYWN0ZWRBKTsKKyAgICAgICAgRVhQ
RUNUX0VRKGVuY29kZWRBLmRhdGEoKSArIGVuY29kZWRBLnNpemUoKSwgcCk7CisgICAgICAgIEVY
UEVDVF9FUShlbmNvZGVkQSwgZXh0cmFjdGVkQSk7CisKKyAgICAgICAgY29uc3QgY2hhciogcSA9
IGV4dHJhY3RFbmNvZGVkSURCS2V5KGVuY29kZWRCLmRhdGEoKSwgZW5jb2RlZEIuZGF0YSgpICsg
ZW5jb2RlZEIuc2l6ZSgpLCAmZXh0cmFjdGVkQik7CisgICAgICAgIEVYUEVDVF9FUShlbmNvZGVk
Qi5kYXRhKCkgKyBlbmNvZGVkQi5zaXplKCksIHEpOworICAgICAgICBFWFBFQ1RfRVEoZW5jb2Rl
ZEIsIGV4dHJhY3RlZEIpOworCisgICAgICAgIEVYUEVDVF9MVChjb21wYXJlRW5jb2RlZElEQktl
eXMoZXh0cmFjdGVkQSwgZXh0cmFjdGVkQiksIDApOworICAgICAgICBFWFBFQ1RfR1QoY29tcGFy
ZUVuY29kZWRJREJLZXlzKGV4dHJhY3RlZEIsIGV4dHJhY3RlZEEpLCAwKTsKKyAgICAgICAgRVhQ
RUNUX0VRKGNvbXBhcmVFbmNvZGVkSURCS2V5cyhleHRyYWN0ZWRBLCBleHRyYWN0ZWRBKSwgMCk7
CisgICAgICAgIEVYUEVDVF9FUShjb21wYXJlRW5jb2RlZElEQktleXMoZXh0cmFjdGVkQiwgZXh0
cmFjdGVkQiksIDApOworCisgICAgICAgIEVYUEVDVF9GQUxTRShleHRyYWN0RW5jb2RlZElEQktl
eShlbmNvZGVkQS5kYXRhKCksIGVuY29kZWRBLmRhdGEoKSArIGVuY29kZWRBLnNpemUoKSAtIDEs
ICZleHRyYWN0ZWRBKSk7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZQorCisjZW5kaWYgLy8g
RU5BQkxFKExFVkVMREIpCisjZW5kaWYgLy8gRU5BQkxFKElOREVYRURfREFUQUJBU0UpCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>92236</attachid>
            <date>2011-05-04 07:07:45 -0700</date>
            <delta_ts>2011-05-04 07:15:58 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-59692-20110504150743.patch</filename>
            <type>text/plain</type>
            <size>15917</size>
            <attacher name="Hans Wennborg">hans</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogODU3MjUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCBiOTFiMmI4MGFhYjA3NDUx
MWI2ZGM5OTE0NzVkN2IxZjVjNzM1YjZmLi5jOGY1OGZlMDExM2U0ZmJiZjI1OTEzYjczNjJkNzE1
MjY4Mjk3MWEzIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTggQEAKKzIwMTEtMDUtMDMgIEhhbnMg
V2VubmJvcmcgIDxoYW5zQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBJbmRleGVkREI6IFVuaXQgdGVzdHMgZm9yIExldmVsREIg
a2V5IGNvZGluZyBmdW5jdGlvbnMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTU5NjkyCisKKyAgICAgICAgRml4IHNvbWUgZW1iYXJyYXNzaW5nIGJ1Z3Mg
dW5jb3ZlcmVkIGJ5IHVuaXQgdGVzdHMuCisKKyAgICAgICAgTm8gbmV3IGZ1bmN0aW9uYWxpdHks
IGJ1dCB0aGlzIGlzIG5vdyBjb3ZlcmVkIGJ5IHVuaXQgdGVzdHMgaW4gdGhlIENocm9taXVtIFdl
YktpdCBwb3J0LgorCisgICAgICAgICogc3RvcmFnZS9JREJMZXZlbERCQ29kaW5nLmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OklEQkxldmVsREJDb2Rpbmc6OmRlY29kZUludCk6CisgICAgICAgIChX
ZWJDb3JlOjpJREJMZXZlbERCQ29kaW5nOjpkZWNvZGVWYXJJbnQpOgorCiAyMDExLTA1LTA0ICBZ
dXJ5IFNlbWlraGF0c2t5ICA8eXVyeXNAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFVucmV2aWV3
ZWQuIEJ1aWxkIGZpeC4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3N0b3JhZ2UvSURCTGV2
ZWxEQkNvZGluZy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9zdG9yYWdlL0lEQkxldmVsREJDb2Rpbmcu
Y3BwCmluZGV4IDgyMmFjMTc4ZTFkNzJhNDYxNzhkN2NmZjMyMjA1ODBiMTBmOWFlYWIuLmVlMDJh
YzA3MGU4YzAzZGM1OTFlOTZlNTM4YWExMjBmMDgwYzUzOTYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJDb3JlL3N0b3JhZ2UvSURCTGV2ZWxEQkNvZGluZy5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUv
c3RvcmFnZS9JREJMZXZlbERCQ29kaW5nLmNwcApAQCAtMTg5LDkgKzE4OSwxMSBAQCBpbnQ2NF90
IGRlY29kZUludChjb25zdCBjaGFyKiBiZWdpbiwgY29uc3QgY2hhciogZW5kKQogICAgIEFTU0VS
VChiZWdpbiA8PSBlbmQpOwogICAgIGludDY0X3QgcmV0ID0gMDsKIAorICAgIGludCBzaGlmdCA9
IDA7CiAgICAgd2hpbGUgKGJlZ2luIDwgZW5kKSB7CiAgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9
ICpiZWdpbisrOwotICAgICAgICByZXQgPSAocmV0IDw8IDgpIHwgYzsKKyAgICAgICAgcmV0IHw9
IHN0YXRpY19jYXN0PGludDY0X3Q+KGMpIDw8IHNoaWZ0OworICAgICAgICBzaGlmdCArPSA4Owog
ICAgIH0KIAogICAgIHJldHVybiByZXQ7CkBAIC0yMDUsNyArMjA3LDcgQEAgVmVjdG9yPGNoYXI+
IGVuY29kZVZhckludChpbnQ2NF90IG4pCiAgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IG4gJiAw
eDdmOwogICAgICAgICBuID4+PSA3OwogICAgICAgICBpZiAobikKLSAgICAgICAgICAgIGMgfD0g
MTI4OworICAgICAgICAgICAgYyB8PSAweDgwOwogICAgICAgICByZXQuYXBwZW5kKGMpOwogICAg
IH0gd2hpbGUgKG4pOwogCkBAIC0yMTYsMTMgKzIxOCwxNiBAQCBjb25zdCBjaGFyKiBkZWNvZGVW
YXJJbnQoY29uc3QgY2hhciAqcCwgY29uc3QgY2hhciogbGltaXQsIGludDY0X3QmIGZvdW5kSW50
KQogewogICAgIEFTU0VSVChsaW1pdCA+PSBwKTsKICAgICBmb3VuZEludCA9IDA7CisgICAgaW50
IHNoaWZ0ID0gMDsKIAogICAgIGRvIHsKICAgICAgICAgaWYgKHAgPj0gbGltaXQpCiAgICAgICAg
ICAgICByZXR1cm4gMDsKIAotICAgICAgICBmb3VuZEludCA9IChmb3VuZEludCA8PCA3KSB8ICgq
cCAmIDB4N2YpOwotICAgIH0gd2hpbGUgKCpwKysgJiAxMjgpOworICAgICAgICB1bnNpZ25lZCBj
aGFyIGMgPSAqcDsKKyAgICAgICAgZm91bmRJbnQgfD0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oYyAm
IDB4N2YpIDw8IHNoaWZ0OworICAgICAgICBzaGlmdCArPSA3OworICAgIH0gd2hpbGUgKCpwKysg
JiAweDgwKTsKICAgICByZXR1cm4gcDsKIH0KIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9j
aHJvbWl1bS9DaGFuZ2VMb2cgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwppbmRl
eCAzMGU0ZTM2NDVkMDg1NzZkYzc0ZjliMDk0MDg2NjcyOTk5NDI3MzBlLi5iNmQ5YzU0NTc1NDIz
ZDk2NGY3ZTFhMDFhZmQ3OTFmN2Q1M2Q1ZThkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0L2No
cm9taXVtL0NoYW5nZUxvZworKysgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZwpA
QCAtMSwzICsxLDE2IEBACisyMDExLTA1LTAzICBIYW5zIFdlbm5ib3JnICA8aGFuc0BjaHJvbWl1
bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
SW5kZXhlZERCOiBVbml0IHRlc3RzIGZvciBMZXZlbERCIGtleSBjb2RpbmcgZnVuY3Rpb25zCisg
ICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD01OTY5MgorCisg
ICAgICAgIEFkZCB1bml0IHRlc3RzIGZvciB0aGUgYmFzaWMga2V5IGNvZGluZyBmdW5jdGlvbnMg
dXNlZCBieSB0aGUgTGV2ZWxEQiBiYWNrLWVuZC4KKworICAgICAgICAqIFdlYktpdC5neXBpOgor
ICAgICAgICAqIHRlc3RzL0lEQkxldmVsREJDb2RpbmdUZXN0LmNwcDogQWRkZWQuCisgICAgICAg
IChJREJMZXZlbERCQ29kaW5nOjpURVNUKToKKwogMjAxMS0wNS0wMyAgSnVzdGluIE5vdm9zYWQg
IDxqdW5vdkBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgS2VubmV0aCBSdXNz
ZWxsLgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9XZWJLaXQuZ3lwaSBiL1Nv
dXJjZS9XZWJLaXQvY2hyb21pdW0vV2ViS2l0Lmd5cGkKaW5kZXggN2QzYTZiOTU3NjJmMmE4MjRi
YjUyZmJjNGU1OThkN2M5MzNjNjM1OC4uMDU2N2ZhZDRiNGNjYjQxNmE3YmY0NGQ4YmIxY2YwMTVi
MzgwMjA1YyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9XZWJLaXQuZ3lwaQor
KysgYi9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXBpCkBAIC01Nyw2ICs1Nyw3IEBA
CiAgICAgICAgICAgICAndGVzdHMvQ0NUaHJlYWRUZXN0LmNwcCcsCiAgICAgICAgICAgICAndGVz
dHMvSURCQmluZGluZ1V0aWxpdGllc1Rlc3QuY3BwJywKICAgICAgICAgICAgICd0ZXN0cy9JREJL
ZXlQYXRoVGVzdC5jcHAnLAorICAgICAgICAgICAgJ3Rlc3RzL0lEQkxldmVsREJDb2RpbmdUZXN0
LmNwcCcsCiAgICAgICAgICAgICAndGVzdHMvS2V5Ym9hcmRUZXN0LmNwcCcsCiAgICAgICAgICAg
ICAndGVzdHMvS1VSTFRlc3QuY3BwJywKICAgICAgICAgICAgICd0ZXN0cy9QT0RBcmVuYVRlc3Qu
Y3BwJywKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVzdHMvSURCTGV2ZWxE
QkNvZGluZ1Rlc3QuY3BwIGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9JREJMZXZlbERC
Q29kaW5nVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uNDBjYzJjM2U4MmFiMGE1ZDcwMDVkYjNkOTJhMGUy
Nzk1MjMzZTAyYgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vdGVz
dHMvSURCTGV2ZWxEQkNvZGluZ1Rlc3QuY3BwCkBAIC0wLDAgKzEsMzM5IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQg
SVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAq
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9S
IElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
CisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFO
WSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIklEQkxldmVsREJDb2RpbmcuaCIKKworI2lmIEVO
QUJMRShJTkRFWEVEX0RBVEFCQVNFKQorI2lmIEVOQUJMRShMRVZFTERCKQorCisjaW5jbHVkZSAi
SURCS2V5LmgiCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDx3dGYvVmVjdG9y
Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXZWJDb3JlOwordXNpbmcgbmFtZXNwYWNlIElEQkxldmVs
REJDb2Rpbmc7CisKK25hbWVzcGFjZSB7CisKK1RFU1QoSURCTGV2ZWxEQkNvZGluZ1Rlc3QsIEVu
Y29kZUJ5dGUpCit7CisgICAgVmVjdG9yPGNoYXI+IGV4cGVjdGVkOworICAgIGV4cGVjdGVkLmFw
cGVuZCgwKTsKKyAgICB1bnNpZ25lZCBjaGFyIGM7CisKKyAgICBjID0gMDsKKyAgICBleHBlY3Rl
ZFswXSA9IGM7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkLCBlbmNvZGVCeXRlKGMpKTsKKworICAg
IGMgPSAxOworICAgIGV4cGVjdGVkWzBdID0gYzsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWQsIGVu
Y29kZUJ5dGUoYykpOworCisgICAgYyA9IDI1NTsKKyAgICBleHBlY3RlZFswXSA9IGM7CisgICAg
RVhQRUNUX0VRKGV4cGVjdGVkLCBlbmNvZGVCeXRlKGMpKTsKK30KKworVEVTVChJREJMZXZlbERC
Q29kaW5nVGVzdCwgTWF4SURCS2V5KQoreworICAgIFZlY3RvcjxjaGFyPiBtYXhLZXkgPSBtYXhJ
REJLZXkoKTsKKworICAgIFZlY3RvcjxjaGFyPiBtaW5LZXkgPSBtaW5JREJLZXkoKTsKKyAgICBW
ZWN0b3I8Y2hhcj4gc3RyaW5nS2V5ID0gZW5jb2RlSURCS2V5KCpJREJLZXk6OmNyZWF0ZVN0cmlu
ZygiSGVsbG8gd29ybGQiKSk7CisgICAgVmVjdG9yPGNoYXI+IG51bWJlcktleSA9IGVuY29kZUlE
QktleSgqSURCS2V5OjpjcmVhdGVOdW1iZXIoMy4xNCkpOworICAgIFZlY3RvcjxjaGFyPiBkYXRl
S2V5ID0gZW5jb2RlSURCS2V5KCpJREJLZXk6OmNyZWF0ZURhdGUoMTAwMDAwMCkpOworCisgICAg
RVhQRUNUX0dUKGNvbXBhcmVFbmNvZGVkSURCS2V5cyhtYXhLZXksIG1pbktleSksIDApOworICAg
IEVYUEVDVF9HVChjb21wYXJlRW5jb2RlZElEQktleXMobWF4S2V5LCBzdHJpbmdLZXkpLCAwKTsK
KyAgICBFWFBFQ1RfR1QoY29tcGFyZUVuY29kZWRJREJLZXlzKG1heEtleSwgbnVtYmVyS2V5KSwg
MCk7CisgICAgRVhQRUNUX0dUKGNvbXBhcmVFbmNvZGVkSURCS2V5cyhtYXhLZXksIGRhdGVLZXkp
LCAwKTsKK30KKworVEVTVChJREJMZXZlbERCQ29kaW5nVGVzdCwgTWluSURCS2V5KQoreworICAg
IFZlY3RvcjxjaGFyPiBtaW5LZXkgPSBtaW5JREJLZXkoKTsKKworICAgIFZlY3RvcjxjaGFyPiBt
YXhLZXkgPSBtYXhJREJLZXkoKTsKKyAgICBWZWN0b3I8Y2hhcj4gc3RyaW5nS2V5ID0gZW5jb2Rl
SURCS2V5KCpJREJLZXk6OmNyZWF0ZVN0cmluZygiSGVsbG8gd29ybGQiKSk7CisgICAgVmVjdG9y
PGNoYXI+IG51bWJlcktleSA9IGVuY29kZUlEQktleSgqSURCS2V5OjpjcmVhdGVOdW1iZXIoMy4x
NCkpOworICAgIFZlY3RvcjxjaGFyPiBkYXRlS2V5ID0gZW5jb2RlSURCS2V5KCpJREJLZXk6OmNy
ZWF0ZURhdGUoMTAwMDAwMCkpOworCisgICAgRVhQRUNUX0xUKGNvbXBhcmVFbmNvZGVkSURCS2V5
cyhtaW5LZXksIG1heEtleSksIDApOworICAgIEVYUEVDVF9MVChjb21wYXJlRW5jb2RlZElEQktl
eXMobWluS2V5LCBzdHJpbmdLZXkpLCAwKTsKKyAgICBFWFBFQ1RfTFQoY29tcGFyZUVuY29kZWRJ
REJLZXlzKG1pbktleSwgbnVtYmVyS2V5KSwgMCk7CisgICAgRVhQRUNUX0xUKGNvbXBhcmVFbmNv
ZGVkSURCS2V5cyhtaW5LZXksIGRhdGVLZXkpLCAwKTsKK30KKworVEVTVChJREJMZXZlbERCQ29k
aW5nVGVzdCwgRW5jb2RlSW50KQoreworICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxzaXplX3Q+
KDEpLCBlbmNvZGVJbnQoMCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8c2l6
ZV90PigxKSwgZW5jb2RlSW50KDEpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKHN0YXRpY19jYXN0
PHNpemVfdD4oMSksIGVuY29kZUludCgyNTUpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKHN0YXRp
Y19jYXN0PHNpemVfdD4oMiksIGVuY29kZUludCgyNTYpLnNpemUoKSk7CisgICAgRVhQRUNUX0VR
KHN0YXRpY19jYXN0PHNpemVfdD4oNCksIGVuY29kZUludCgweGZmZmZmZmZmKS5zaXplKCkpOwor
fQorCitURVNUKElEQkxldmVsREJDb2RpbmdUZXN0LCBEZWNvZGVJbnQpCit7CisgICAgVmVjdG9y
PGludDY0X3Q+IHRlc3RDYXNlczsKKyAgICB0ZXN0Q2FzZXMuYXBwZW5kKDApOworICAgIHRlc3RD
YXNlcy5hcHBlbmQoMSk7CisgICAgdGVzdENhc2VzLmFwcGVuZCgyNTUpOworICAgIHRlc3RDYXNl
cy5hcHBlbmQoMjU2KTsKKyAgICB0ZXN0Q2FzZXMuYXBwZW5kKDY1NTM1KTsKKyAgICB0ZXN0Q2Fz
ZXMuYXBwZW5kKDY1NTUzNik7CisgICAgdGVzdENhc2VzLmFwcGVuZCg3NzExMTkyNDMxNzU1NjY1
NzkybGwpOworICAgIHRlc3RDYXNlcy5hcHBlbmQoMHg3ZmZmZmZmZmZmZmZmZmZmbGwpOworCisg
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0Q2FzZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAg
ICAgaW50NjRfdCBuID0gdGVzdENhc2VzW2ldOworICAgICAgICBWZWN0b3I8Y2hhcj4gdiA9IGVu
Y29kZUludChuKTsKKyAgICAgICAgRVhQRUNUX0VRKG4sIGRlY29kZUludCh2LmRhdGEoKSwgdi5k
YXRhKCkgKyB2LnNpemUoKSkpOworICAgIH0KK30KKworVEVTVChJREJMZXZlbERCQ29kaW5nVGVz
dCwgRW5jb2RlVmFySW50KQoreworICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxzaXplX3Q+KDEp
LCBlbmNvZGVWYXJJbnQoMCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8c2l6
ZV90PigxKSwgZW5jb2RlVmFySW50KDEpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKHN0YXRpY19j
YXN0PHNpemVfdD4oMiksIGVuY29kZVZhckludCgyNTUpLnNpemUoKSk7CisgICAgRVhQRUNUX0VR
KHN0YXRpY19jYXN0PHNpemVfdD4oMiksIGVuY29kZVZhckludCgyNTYpLnNpemUoKSk7CisgICAg
RVhQRUNUX0VRKHN0YXRpY19jYXN0PHNpemVfdD4oNSksIGVuY29kZVZhckludCgweGZmZmZmZmZm
KS5zaXplKCkpOworfQorCitURVNUKElEQkxldmVsREJDb2RpbmdUZXN0LCBEZWNvZGVWYXJJbnQp
Cit7CisgICAgVmVjdG9yPGludDY0X3Q+IHRlc3RDYXNlczsKKyAgICB0ZXN0Q2FzZXMuYXBwZW5k
KDApOworICAgIHRlc3RDYXNlcy5hcHBlbmQoMSk7CisgICAgdGVzdENhc2VzLmFwcGVuZCgyNTUp
OworICAgIHRlc3RDYXNlcy5hcHBlbmQoMjU2KTsKKyAgICB0ZXN0Q2FzZXMuYXBwZW5kKDY1NTM1
KTsKKyAgICB0ZXN0Q2FzZXMuYXBwZW5kKDY1NTUzNik7CisgICAgdGVzdENhc2VzLmFwcGVuZCg3
NzExMTkyNDMxNzU1NjY1NzkybGwpOworICAgIHRlc3RDYXNlcy5hcHBlbmQoMHg3ZmZmZmZmZmZm
ZmZmZmZmbGwpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0Q2FzZXMuc2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgaW50NjRfdCBuID0gdGVzdENhc2VzW2ldOworICAgICAgICBWZWN0
b3I8Y2hhcj4gdiA9IGVuY29kZVZhckludChuKTsKKworICAgICAgICBpbnQ2NF90IHJlczsKKyAg
ICAgICAgY29uc3QgY2hhciogcCA9IGRlY29kZVZhckludCh2LmRhdGEoKSwgdi5kYXRhKCkgKyB2
LnNpemUoKSwgcmVzKTsKKyAgICAgICAgRVhQRUNUX0VRKG4sIHJlcyk7CisgICAgICAgIEVYUEVD
VF9FUSh2LmRhdGEoKSArIHYuc2l6ZSgpLCBwKTsKKworICAgICAgICBwID0gZGVjb2RlVmFySW50
KHYuZGF0YSgpLCB2LmRhdGEoKSArIHYuc2l6ZSgpIC0gMSwgcmVzKTsKKyAgICAgICAgRVhQRUNU
X0VRKDAsIHApOworICAgICAgICBwID0gZGVjb2RlVmFySW50KHYuZGF0YSgpLCB2LmRhdGEoKSwg
cmVzKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIHApOworICAgIH0KK30KKworVEVTVChJREJMZXZl
bERCQ29kaW5nVGVzdCwgRW5jb2RlU3RyaW5nKQoreworICAgIGNvbnN0IFVDaGFyIHRlc3RTdHJp
bmdBW10gPSB7J2YnLCAnbycsICdvJywgJ1wwJ307CisgICAgY29uc3QgVUNoYXIgdGVzdFN0cmlu
Z0JbXSA9IHsweGRlYWQsIDB4YmVlZiwgJ1wwJ307CisKKyAgICBFWFBFQ1RfRVEoc3RhdGljX2Nh
c3Q8c2l6ZV90PigwKSwgZW5jb2RlU3RyaW5nKFN0cmluZygiIikpLnNpemUoKSk7CisgICAgRVhQ
RUNUX0VRKHN0YXRpY19jYXN0PHNpemVfdD4oMiksIGVuY29kZVN0cmluZyhTdHJpbmcoImEiKSku
c2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8c2l6ZV90Pig2KSwgZW5jb2RlU3Ry
aW5nKFN0cmluZygiZm9vIikpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PHNp
emVfdD4oNiksIGVuY29kZVN0cmluZyhTdHJpbmcodGVzdFN0cmluZ0EpKS5zaXplKCkpOworICAg
IEVYUEVDVF9FUShzdGF0aWNfY2FzdDxzaXplX3Q+KDQpLCBlbmNvZGVTdHJpbmcoU3RyaW5nKHRl
c3RTdHJpbmdCKSkuc2l6ZSgpKTsKK30KKworVEVTVChJREJMZXZlbERCQ29kaW5nVGVzdCwgRGVj
b2RlU3RyaW5nKQoreworICAgIGNvbnN0IFVDaGFyIHRlc3RTdHJpbmdBW10gPSB7J2YnLCAnbycs
ICdvJywgJ1wwJ307CisgICAgY29uc3QgVUNoYXIgdGVzdFN0cmluZ0JbXSA9IHsweGRlYWQsIDB4
YmVlZiwgJ1wwJ307CisgICAgVmVjdG9yPGNoYXI+IHY7CisKKyAgICB2ID0gZW5jb2RlU3RyaW5n
KFN0cmluZygiIikpOworICAgIEVYUEVDVF9FUShTdHJpbmcoIiIpLCBkZWNvZGVTdHJpbmcodi5k
YXRhKCksIHYuZGF0YSgpICsgdi5zaXplKCkpKTsKKworICAgIHYgPSBlbmNvZGVTdHJpbmcoU3Ry
aW5nKCJhIikpOworICAgIEVYUEVDVF9FUShTdHJpbmcoImEiKSwgZGVjb2RlU3RyaW5nKHYuZGF0
YSgpLCB2LmRhdGEoKSArIHYuc2l6ZSgpKSk7CisKKyAgICB2ID0gZW5jb2RlU3RyaW5nKFN0cmlu
ZygiZm9vIikpOworICAgIEVYUEVDVF9FUShTdHJpbmcoImZvbyIpLCBkZWNvZGVTdHJpbmcodi5k
YXRhKCksIHYuZGF0YSgpICsgdi5zaXplKCkpKTsKKworICAgIHYgPSBlbmNvZGVTdHJpbmcoU3Ry
aW5nKHRlc3RTdHJpbmdBKSk7CisgICAgRVhQRUNUX0VRKHRlc3RTdHJpbmdBLCBkZWNvZGVTdHJp
bmcodi5kYXRhKCksIHYuZGF0YSgpICsgdi5zaXplKCkpKTsKKworICAgIHYgPSBlbmNvZGVTdHJp
bmcoU3RyaW5nKHRlc3RTdHJpbmdCKSk7CisgICAgRVhQRUNUX0VRKHRlc3RTdHJpbmdCLCBkZWNv
ZGVTdHJpbmcodi5kYXRhKCksIHYuZGF0YSgpICsgdi5zaXplKCkpKTsKK30KKworVEVTVChJREJM
ZXZlbERCQ29kaW5nVGVzdCwgRW5jb2RlU3RyaW5nV2l0aExlbmd0aCkKK3sKKyAgICBjb25zdCBV
Q2hhciB0ZXN0U3RyaW5nQVtdID0geydmJywgJ28nLCAnbycsICdcMCd9OworICAgIGNvbnN0IFVD
aGFyIHRlc3RTdHJpbmdCW10gPSB7MHhkZWFkLCAweGJlZWYsICdcMCd9OworCisgICAgRVhQRUNU
X0VRKHN0YXRpY19jYXN0PHNpemVfdD4oMSksIGVuY29kZVN0cmluZ1dpdGhMZW5ndGgoU3RyaW5n
KCIiKSkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8c2l6ZV90PigzKSwgZW5j
b2RlU3RyaW5nV2l0aExlbmd0aChTdHJpbmcoImEiKSkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEo
c3RhdGljX2Nhc3Q8c2l6ZV90Pig3KSwgZW5jb2RlU3RyaW5nV2l0aExlbmd0aChTdHJpbmcodGVz
dFN0cmluZ0EpKS5zaXplKCkpOworICAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxzaXplX3Q+KDUp
LCBlbmNvZGVTdHJpbmdXaXRoTGVuZ3RoKFN0cmluZyh0ZXN0U3RyaW5nQikpLnNpemUoKSk7Cit9
CisKK1RFU1QoSURCTGV2ZWxEQkNvZGluZ1Rlc3QsIERlY29kZVN0cmluZ1dpdGhMZW5ndGgpCit7
CisgICAgY29uc3QgVUNoYXIgdGVzdFN0cmluZ0FbXSA9IHsnZicsICdvJywgJ28nLCAnXDAnfTsK
KyAgICBjb25zdCBVQ2hhciB0ZXN0U3RyaW5nQltdID0gezB4ZGVhZCwgMHhiZWVmLCAnXDAnfTsK
KworICAgIGNvbnN0IGludCBrTG9uZ1N0cmluZ0xlbiA9IDEyMzQ7CisgICAgVUNoYXIgbG9uZ1N0
cmluZ1trTG9uZ1N0cmluZ0xlbiArIDFdOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0xvbmdT
dHJpbmdMZW47IGkrKykKKyAgICAgICAgbG9uZ1N0cmluZ1tpXSA9IGk7CisgICAgbG9uZ1N0cmlu
Z1trTG9uZ1N0cmluZ0xlbl0gPSAwOworCisgICAgVmVjdG9yPFN0cmluZz4gdGVzdENhc2VzOwor
ICAgIHRlc3RDYXNlcy5hcHBlbmQoU3RyaW5nKCIiKSk7CisgICAgdGVzdENhc2VzLmFwcGVuZChT
dHJpbmcoImEiKSk7CisgICAgdGVzdENhc2VzLmFwcGVuZChTdHJpbmcoImZvbyIpKTsKKyAgICB0
ZXN0Q2FzZXMuYXBwZW5kKFN0cmluZyh0ZXN0U3RyaW5nQSkpOworICAgIHRlc3RDYXNlcy5hcHBl
bmQoU3RyaW5nKHRlc3RTdHJpbmdCKSk7CisgICAgdGVzdENhc2VzLmFwcGVuZChTdHJpbmcobG9u
Z1N0cmluZykpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0ZXN0Q2FzZXMuc2l6ZSgp
OyArK2kpIHsKKyAgICAgICAgU3RyaW5nIHMgPSB0ZXN0Q2FzZXNbaV07CisgICAgICAgIFZlY3Rv
cjxjaGFyPiB2ID0gZW5jb2RlU3RyaW5nV2l0aExlbmd0aChzKTsKKyAgICAgICAgU3RyaW5nIHJl
czsKKyAgICAgICAgY29uc3QgY2hhciogcCA9IGRlY29kZVN0cmluZ1dpdGhMZW5ndGgodi5kYXRh
KCksIHYuZGF0YSgpICsgdi5zaXplKCksIHJlcyk7CisgICAgICAgIEVYUEVDVF9FUShzLCByZXMp
OworICAgICAgICBFWFBFQ1RfRVEodi5kYXRhKCkgKyB2LnNpemUoKSwgcCk7CisKKyAgICAgICAg
RVhQRUNUX0VRKDAsIGRlY29kZVN0cmluZ1dpdGhMZW5ndGgodi5kYXRhKCksIHYuZGF0YSgpICsg
di5zaXplKCkgLSAxLCByZXMpKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGRlY29kZVN0cmluZ1dp
dGhMZW5ndGgodi5kYXRhKCksIHYuZGF0YSgpLCByZXMpKTsKKyAgICB9Cit9CisKK1RFU1QoSURC
TGV2ZWxEQkNvZGluZ1Rlc3QsIEVuY29kZURvdWJsZSkKK3sKKyAgICBFWFBFQ1RfRVEoc3RhdGlj
X2Nhc3Q8c2l6ZV90Pig4KSwgZW5jb2RlRG91YmxlKDApLnNpemUoKSk7CisgICAgRVhQRUNUX0VR
KHN0YXRpY19jYXN0PHNpemVfdD4oOCksIGVuY29kZURvdWJsZSgzLjE0KS5zaXplKCkpOworfQor
CitURVNUKElEQkxldmVsREJDb2RpbmdUZXN0LCBEZWNvZGVEb3VibGUpCit7CisgICAgVmVjdG9y
PGNoYXI+IHY7CisgICAgY29uc3QgY2hhciogcDsKKyAgICBkb3VibGUgZDsKKworICAgIHYgPSBl
bmNvZGVEb3VibGUoMy4xNCk7CisgICAgcCA9IGRlY29kZURvdWJsZSh2LmRhdGEoKSwgdi5kYXRh
KCkgKyB2LnNpemUoKSwgJmQpOworICAgIEVYUEVDVF9FUSgzLjE0LCBkKTsKKyAgICBFWFBFQ1Rf
RVEodi5kYXRhKCkgKyB2LnNpemUoKSwgcCk7CisKKyAgICB2ID0gZW5jb2RlRG91YmxlKC0zLjE0
KTsKKyAgICBwID0gZGVjb2RlRG91YmxlKHYuZGF0YSgpLCB2LmRhdGEoKSArIHYuc2l6ZSgpLCAm
ZCk7CisgICAgRVhQRUNUX0VRKC0zLjE0LCBkKTsKKyAgICBFWFBFQ1RfRVEodi5kYXRhKCkgKyB2
LnNpemUoKSwgcCk7CisKKyAgICB2ID0gZW5jb2RlRG91YmxlKDMuMTQpOworICAgIHAgPSBkZWNv
ZGVEb3VibGUodi5kYXRhKCksIHYuZGF0YSgpICsgdi5zaXplKCkgLSAxLCAmZCk7CisgICAgRVhQ
RUNUX0VRKDAsIHApOworfQorCitURVNUKElEQkxldmVsREJDb2RpbmdUZXN0LCBFbmNvZGVEZWNv
ZGVJREJLZXkpCit7CisgICAgUmVmUHRyPElEQktleT4gZXhwZWN0ZWRLZXk7CisgICAgUmVmUHRy
PElEQktleT4gZGVjb2RlZEtleTsKKyAgICBWZWN0b3I8Y2hhcj4gdjsKKyAgICBjb25zdCBjaGFy
KiBwOworCisgICAgZXhwZWN0ZWRLZXkgPSBJREJLZXk6OmNyZWF0ZU51bWJlcigxMjM0KTsKKyAg
ICB2ID0gZW5jb2RlSURCS2V5KCpleHBlY3RlZEtleSk7CisgICAgcCA9IGRlY29kZUlEQktleSh2
LmRhdGEoKSwgdi5kYXRhKCkgKyB2LnNpemUoKSwgZGVjb2RlZEtleSk7CisgICAgRVhQRUNUX1RS
VUUoZGVjb2RlZEtleS0+aXNFcXVhbChleHBlY3RlZEtleS5nZXQoKSkpOworICAgIEVYUEVDVF9F
USh2LmRhdGEoKSArIHYuc2l6ZSgpLCBwKTsKKyAgICBFWFBFQ1RfRVEoMCwgZGVjb2RlSURCS2V5
KHYuZGF0YSgpLCB2LmRhdGEoKSArIHYuc2l6ZSgpIC0gMSwgZGVjb2RlZEtleSkpOworCisgICAg
ZXhwZWN0ZWRLZXkgPSBJREJLZXk6OmNyZWF0ZVN0cmluZygiSGVsbG8gV29ybGQhIik7CisgICAg
diA9IGVuY29kZUlEQktleSgqZXhwZWN0ZWRLZXkpOworICAgIHAgPSBkZWNvZGVJREJLZXkodi5k
YXRhKCksIHYuZGF0YSgpICsgdi5zaXplKCksIGRlY29kZWRLZXkpOworICAgIEVYUEVDVF9UUlVF
KGRlY29kZWRLZXktPmlzRXF1YWwoZXhwZWN0ZWRLZXkuZ2V0KCkpKTsKKyAgICBFWFBFQ1RfRVEo
di5kYXRhKCkgKyB2LnNpemUoKSwgcCk7CisgICAgRVhQRUNUX0VRKDAsIGRlY29kZUlEQktleSh2
LmRhdGEoKSwgdi5kYXRhKCkgKyB2LnNpemUoKSAtIDEsIGRlY29kZWRLZXkpKTsKKworICAgIGV4
cGVjdGVkS2V5ID0gSURCS2V5OjpjcmVhdGVEYXRlKDc4OTApOworICAgIHYgPSBlbmNvZGVJREJL
ZXkoKmV4cGVjdGVkS2V5KTsKKyAgICBwID0gZGVjb2RlSURCS2V5KHYuZGF0YSgpLCB2LmRhdGEo
KSArIHYuc2l6ZSgpLCBkZWNvZGVkS2V5KTsKKyAgICBFWFBFQ1RfVFJVRShkZWNvZGVkS2V5LT5p
c0VxdWFsKGV4cGVjdGVkS2V5LmdldCgpKSk7CisgICAgRVhQRUNUX0VRKHYuZGF0YSgpICsgdi5z
aXplKCksIHApOworICAgIEVYUEVDVF9FUSgwLCBkZWNvZGVJREJLZXkodi5kYXRhKCksIHYuZGF0
YSgpICsgdi5zaXplKCkgLSAxLCBkZWNvZGVkS2V5KSk7Cit9CisKK1RFU1QoSURCTGV2ZWxEQkNv
ZGluZ1Rlc3QsIEV4dHJhY3RBbmRDb21wYXJlSURCS2V5cykKK3sKKyAgICBWZWN0b3I8UmVmUHRy
PElEQktleT4gPiBrZXlzOworCisgICAga2V5cy5hcHBlbmQoSURCS2V5OjpjcmVhdGVOdW1iZXIo
LTEwKSk7CisgICAga2V5cy5hcHBlbmQoSURCS2V5OjpjcmVhdGVOdW1iZXIoMCkpOworICAgIGtl
eXMuYXBwZW5kKElEQktleTo6Y3JlYXRlTnVtYmVyKDMuMTQpKTsKKworICAgIGtleXMuYXBwZW5k
KElEQktleTo6Y3JlYXRlRGF0ZSgwKSk7CisgICAga2V5cy5hcHBlbmQoSURCS2V5OjpjcmVhdGVE
YXRlKDEwMCkpOworICAgIGtleXMuYXBwZW5kKElEQktleTo6Y3JlYXRlRGF0ZSgxMDAwMDApKTsK
KworICAgIGtleXMuYXBwZW5kKElEQktleTo6Y3JlYXRlU3RyaW5nKCIiKSk7CisgICAga2V5cy5h
cHBlbmQoSURCS2V5OjpjcmVhdGVTdHJpbmcoImEiKSk7CisgICAga2V5cy5hcHBlbmQoSURCS2V5
OjpjcmVhdGVTdHJpbmcoImIiKSk7CisgICAga2V5cy5hcHBlbmQoSURCS2V5OjpjcmVhdGVTdHJp
bmcoImJhYWEiKSk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtleXMuc2l6ZSgpIC0g
MTsgaSsrKSB7CisgICAgICAgIFJlZlB0cjxJREJLZXk+IGtleUEgPSBrZXlzW2ldOworICAgICAg
ICBSZWZQdHI8SURCS2V5PiBrZXlCID0ga2V5c1tpICsgMV07CisKKyAgICAgICAgRVhQRUNUX1RS
VUUoa2V5QS0+aXNMZXNzVGhhbihrZXlCLmdldCgpKSk7CisKKyAgICAgICAgVmVjdG9yPGNoYXI+
IGVuY29kZWRBID0gZW5jb2RlSURCS2V5KCprZXlBKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoZW5j
b2RlZEEuc2l6ZSgpKTsKKyAgICAgICAgVmVjdG9yPGNoYXI+IGVuY29kZWRCID0gZW5jb2RlSURC
S2V5KCprZXlCKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoZW5jb2RlZEIuc2l6ZSgpKTsKKworICAg
ICAgICBWZWN0b3I8Y2hhcj4gZXh0cmFjdGVkQTsKKyAgICAgICAgVmVjdG9yPGNoYXI+IGV4dHJh
Y3RlZEI7CisKKyAgICAgICAgY29uc3QgY2hhciogcCA9IGV4dHJhY3RFbmNvZGVkSURCS2V5KGVu
Y29kZWRBLmRhdGEoKSwgZW5jb2RlZEEuZGF0YSgpICsgZW5jb2RlZEEuc2l6ZSgpLCAmZXh0cmFj
dGVkQSk7CisgICAgICAgIEVYUEVDVF9FUShlbmNvZGVkQS5kYXRhKCkgKyBlbmNvZGVkQS5zaXpl
KCksIHApOworICAgICAgICBFWFBFQ1RfRVEoZW5jb2RlZEEsIGV4dHJhY3RlZEEpOworCisgICAg
ICAgIGNvbnN0IGNoYXIqIHEgPSBleHRyYWN0RW5jb2RlZElEQktleShlbmNvZGVkQi5kYXRhKCks
IGVuY29kZWRCLmRhdGEoKSArIGVuY29kZWRCLnNpemUoKSwgJmV4dHJhY3RlZEIpOworICAgICAg
ICBFWFBFQ1RfRVEoZW5jb2RlZEIuZGF0YSgpICsgZW5jb2RlZEIuc2l6ZSgpLCBxKTsKKyAgICAg
ICAgRVhQRUNUX0VRKGVuY29kZWRCLCBleHRyYWN0ZWRCKTsKKworICAgICAgICBFWFBFQ1RfTFQo
Y29tcGFyZUVuY29kZWRJREJLZXlzKGV4dHJhY3RlZEEsIGV4dHJhY3RlZEIpLCAwKTsKKyAgICAg
ICAgRVhQRUNUX0dUKGNvbXBhcmVFbmNvZGVkSURCS2V5cyhleHRyYWN0ZWRCLCBleHRyYWN0ZWRB
KSwgMCk7CisgICAgICAgIEVYUEVDVF9FUShjb21wYXJlRW5jb2RlZElEQktleXMoZXh0cmFjdGVk
QSwgZXh0cmFjdGVkQSksIDApOworICAgICAgICBFWFBFQ1RfRVEoY29tcGFyZUVuY29kZWRJREJL
ZXlzKGV4dHJhY3RlZEIsIGV4dHJhY3RlZEIpLCAwKTsKKworICAgICAgICBFWFBFQ1RfRVEoMCwg
ZXh0cmFjdEVuY29kZWRJREJLZXkoZW5jb2RlZEEuZGF0YSgpLCBlbmNvZGVkQS5kYXRhKCkgKyBl
bmNvZGVkQS5zaXplKCkgLSAxLCAmZXh0cmFjdGVkQSkpOworICAgIH0KK30KKworfSAvLyBuYW1l
c3BhY2UKKworI2VuZGlmIC8vIEVOQUJMRShMRVZFTERCKQorI2VuZGlmIC8vIEVOQUJMRShJTkRF
WEVEX0RBVEFCQVNFKQo=
</data>
<flag name="review"
          id="85183"
          type_id="1"
          status="+"
          setter="steveblock"
    />
          </attachment>
      

    </bug>

</bugzilla>