<?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>37978</bug_id>
          
          <creation_ts>2010-04-22 00:34:43 -0700</creation_ts>
          <short_desc>Unify JSC::IdentifierTable and WebCore::AtomicStringTable implementations.</short_desc>
          <delta_ts>2010-04-22 13:55:29 -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>Web Template Framework</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</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="Gavin Barraclough">barraclough</reporter>
          <assigned_to name="Gavin Barraclough">barraclough</assigned_to>
          <cc>abarth</cc>
    
    <cc>eric</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>215754</commentid>
    <comment_count>0</comment_count>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2010-04-22 00:34:43 -0700</bug_when>
    <thetext>These two classes both implement a HashSet of uniqued StringImpls, with translator classes to avoid unnecessary object creation.
The only difference between the classes is which flag (isIdentifier or inTable) is set.  Combine the two classes using a template predicated on which flag to use.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215761</commentid>
    <comment_count>1</comment_count>
      <attachid>54036</attachid>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2010-04-22 00:42:19 -0700</bug_when>
    <thetext>Created attachment 54036
The patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215762</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-04-22 00:44:47 -0700</bug_when>
    <thetext>Attachment 54036 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;]&quot; exit_code: 1
JavaScriptCore/wtf/text/AtomicStringTable.h:32:  Alphabetical sorting problem.  [build/include_order] [4]
JavaScriptCore/wtf/text/AtomicStringTable.h:53:  Tests for true/false, null/non-null, and zero/non-zero should all be done without equality comparisons.  [readability/comparison_to_zero] [5]
Total errors found: 2 in 16 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215765</commentid>
    <comment_count>3</comment_count>
      <attachid>54038</attachid>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2010-04-22 00:47:01 -0700</bug_when>
    <thetext>Created attachment 54038
Fix review bot issues</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>215932</commentid>
    <comment_count>4</comment_count>
      <attachid>54038</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2010-04-22 09:58:45 -0700</bug_when>
    <thetext>Comment on attachment 54038
Fix review bot issues

Looks good. 

A few hashtable comments:


+    LiteralTable* literalTable = globalData-&gt;literalTable;
+    const LiteralTable::iterator&amp; iter = literalTable-&gt;find(c);
+    if (iter != literalTable-&gt;end())
         return iter-&gt;second;
 
-    pair&lt;HashSet&lt;UString::Rep*&gt;::iterator, bool&gt; addResult = identifierTable.add&lt;const char*, IdentifierCStringTranslator&gt;(c);
-
-    // If the string is newly-translated, then we need to adopt it.
-    // The boolean in the pair tells us if that is so.
-    RefPtr&lt;UString::Rep&gt; addedString = addResult.second ? adoptRef(*addResult.first) : *addResult.first;
-
-    literalIdentifierTable.add(c, addedString.get());
-
+    RefPtr&lt;StringImpl&gt; addedString = globalData-&gt;identifierTable-&gt;add(c);
+    literalTable-&gt;add(c, addedString.get());
     return addedString.release();

I&apos;m surprised that we have a separate table for char*. Weird. Maybe it&apos;s just legacy code that can go away?

Anyhoo, &quot;literalTable-&gt;find&quot; followed by &quot;literalTable-&gt;add&quot; is a double-lookup. The idiom for avoiding double-lookup is:

pair&lt;iterator, bool&gt; result = literalTable-&gt;add(c, 0);
if (!result.second) // pre-existing entry
    return result.first-&gt;second;
...
result.first-&gt;second = addedString.get();


+template&lt;bool isIdentifierTable&gt;
+IdentifierOrAtomicStringTable&lt;isIdentifierTable&gt;::~IdentifierOrAtomicStringTable()
+{
+    HashSet&lt;StringImpl*&gt;::iterator end = m_table.end();
+    for (HashSet&lt;StringImpl*&gt;::iterator iter = m_table.begin(); iter != end; ++iter) {
+        if (isIdentifierTable)
+            (*iter)-&gt;setIsIdentifier(false);
+        else
+            (*iter)-&gt;setIsAtomic(false);
+    }
+}

This would probably be more efficient if you wrote two copies of the loop, and moved the isIdentifierTable test out of the loop. We know that isIdentifierTable is constant inside the loop, but GCC probably doesn&apos;t.

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>216021</commentid>
    <comment_count>5</comment_count>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2010-04-22 12:39:08 -0700</bug_when>
    <thetext>&gt; I&apos;m surprised that we have a separate table for char*. Weird. Maybe it&apos;s just
&gt; legacy code that can go away?

This table holds RefPtrs rather than StringImpl*s, I think the idea is to prevernt thrash creating &amp; destroying string objects for literal strings in JSC&apos;s source.  I&apos;m not sure if it&apos;s still necessary, but would rather not change in this patch.

&gt; Anyhoo, &quot;literalTable-&gt;find&quot; followed by &quot;literalTable-&gt;add&quot; is a
&gt; double-lookup. The idiom for avoiding double-lookup is:

*nod, will do.

&gt; This would probably be more efficient if you wrote two copies of the loop, and
&gt; moved the isIdentifierTable test out of the loop. We know that
&gt; isIdentifierTable is constant inside the loop, but GCC probably doesn&apos;t.

If you think about it, GCC absolutely must know all template parameter values to code generate to be able to code specialize, which is the whole purpose of templates.  This is more obvious in the case where the template parameter is a type, also holds where the template parameter is a value.

Still, happy to rejig the check out the loop to make it more obvious that no redundant checking is going on.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>216053</commentid>
    <comment_count>6</comment_count>
    <who name="Gavin Barraclough">barraclough</who>
    <bug_when>2010-04-22 13:38:57 -0700</bug_when>
    <thetext>Transmitting file data ................
Committed revision 58114.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>216061</commentid>
    <comment_count>7</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-04-22 13:55:29 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/58114 might have broken Qt Linux Release</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>54036</attachid>
            <date>2010-04-22 00:42:19 -0700</date>
            <delta_ts>2010-04-22 00:47:01 -0700</delta_ts>
            <desc>The patch</desc>
            <filename>patch.mergeidenttables.txt</filename>
            <type>text/plain</type>
            <size>42482</size>
            <attacher name="Gavin Barraclough">barraclough</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDU4MDY2KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzAgQEAKKzIwMTAtMDQtMjIgIEdhdmluIEJh
cnJhY2xvdWdoICA8YmFycmFjbG91Z2hAYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0zNzk3OAorICAgICAgICBVbmlmeSBKU0M6OklkZW50aWZpZXJUYWJsZSBhbmQg
V2ViQ29yZTo6QXRvbWljU3RyaW5nVGFibGUgaW1wbGVtZW50YXRpb25zLgorCisgICAgICAgIFRo
ZXNlIHR3byBjbGFzc2VzIGJvdGggaW1wbGVtZW50IGEgSGFzaFNldCBvZiB1bmlxdWVkIFN0cmlu
Z0ltcGxzLCB3aXRoCisgICAgICAgIHRyYW5zbGF0b3IgY2xhc3NlcyB0byBhdm9pZCB1bm5lY2Vz
c2FyeSBvYmplY3QgY3JlYXRpb24uIFRoZSBvbmx5IGRpZmZlcmVuY2UKKyAgICAgICAgYmV0d2Vl
biB0aGUgY2xhc3NlcyBpcyB3aGljaCBmbGFnIChpc0lkZW50aWZpZXIgb3IgaW5UYWJsZSkgaXMg
c2V0LgorICAgICAgICBDb21iaW5lIHRoZSB0d28gY2xhc3NlcyB1c2luZyBhIHRlbXBsYXRlIHBy
ZWRpY2F0ZWQgb24gd2hpY2ggZmxhZyB0byB1c2UuCisKKyAgICAgICAgTmV3IGNsYXNzIEF0b21p
Y1N0cmluZ1RhYmxlIGNyZWF0ZWQsIGNvbnRhaW5pbmcgYWxsIHRoZSBnb29kbmVzcyBmcm9tCisg
ICAgICAgIElkZW50aWZpZXJUYWJsZSAmIEF0b21pY1N0cmluZ1RhYmxlLCBleHBlY3QgZm9yIElk
ZW50aWZpZXIncyBsaXRlcmFsVGFibGUsCisgICAgICAgIHdoaWNoIGhhcyBiZWVuIG1vdmVkIG9u
dG8gSlNHbG9iYWxEYXRhLiBSZW1vdmVkIGR1cGxpY2F0ZSBzdHJpbmcgdHJhbnNsYXRvcgorICAg
ICAgICBjbGFzc2VzLiBSZW5hbWVkIFN0cmluZ0ltcGwncyBpblRhYmxlIGZsYWcgdG8gbW9yZSBl
eHBsaWNpdCAnaXNBdG9taWMnLAorICAgICAgICBhbmQgc2V0IHRoaXMgb24gdGhlIGVtcHR5IHN0
cmluZyAod2hpY2ggbWF0Y2hlcyBJZGVudGlmaWVyIGJlaGF2aW91ciwgYW5kCisgICAgICAgIHJl
bW92ZXMgYSByZWR1bmRhbnQgY2hlY2sgZm9yIHplcm8tbGVuZ3RoKS4KKworICAgICAgICAqIEdO
VW1ha2VmaWxlLmFtOgorICAgICAgICAqIEphdmFTY3JpcHRDb3JlLmd5cGk6CisgICAgICAgICog
SmF2YVNjcmlwdENvcmUudmNwcm9qL1dURi9XVEYudmNwcm9qOgorICAgICAgICAqIEphdmFTY3Jp
cHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogcnVudGltZS9JZGVu
dGlmaWVyLmNwcDoKKyAgICAgICAgKEpTQzo6Y3JlYXRlTGl0ZXJhbFRhYmxlKToKKyAgICAgICAg
KEpTQzo6ZGVsZXRlTGl0ZXJhbFRhYmxlKToKKyAgICAgICAgKEpTQzo6SWRlbnRpZmllcjo6YWRk
KToKKyAgICAgICAgKEpTQzo6SWRlbnRpZmllcjo6YWRkU2xvd0Nhc2UpOgorICAgICAgICAqIHJ1
bnRpbWUvSWRlbnRpZmllci5oOgorICAgICAgICAqIHJ1bnRpbWUvSlNHbG9iYWxEYXRhLmNwcDoK
KyAgICAgICAgKEpTQzo6SlNHbG9iYWxEYXRhOjpKU0dsb2JhbERhdGEpOgorICAgICAgICAoSlND
OjpKU0dsb2JhbERhdGE6On5KU0dsb2JhbERhdGEpOgorICAgICAgICAqIHJ1bnRpbWUvSlNHbG9i
YWxEYXRhLmg6CisgICAgICAgICogd3RmL1dURlRocmVhZERhdGEuY3BwOgorICAgICAgICAoV1RG
OjpXVEZUaHJlYWREYXRhOjpXVEZUaHJlYWREYXRhKToKKyAgICAgICAgKFdURjo6V1RGVGhyZWFk
RGF0YTo6fldURlRocmVhZERhdGEpOgorICAgICAgICAqIHd0Zi9XVEZUaHJlYWREYXRhLmg6Cisg
ICAgICAgIChXVEY6OldURlRocmVhZERhdGE6OmF0b21pY1N0cmluZ1RhYmxlKToKKyAgICAgICAg
KiB3dGYvdGV4dC9BdG9taWNTdHJpbmcuY3BwOgorICAgICAgICAoV2ViQ29yZTo6dGFibGUpOgor
ICAgICAgICAoV2ViQ29yZTo6b3BlcmF0b3I9PSk6CisgICAgICAgIChXZWJDb3JlOjpBdG9taWNT
dHJpbmc6OmFkZCk6CisgICAgICAgIChXZWJDb3JlOjpBdG9taWNTdHJpbmc6OmZpbmQpOgorICAg
ICAgICAoV2ViQ29yZTo6QXRvbWljU3RyaW5nOjpyZW1vdmUpOgorICAgICAgICAqIHd0Zi90ZXh0
L0F0b21pY1N0cmluZ1RhYmxlLmg6IEFkZGVkLgorICAgICAgICAoV1RGOjpDU3RyaW5nVHJhbnNs
YXRvcjo6aGFzaCk6CisgICAgICAgIChXVEY6OkNTdHJpbmdUcmFuc2xhdG9yOjplcXVhbCk6Cisg
ICAgICAgIChXVEY6OkNTdHJpbmdUcmFuc2xhdG9yOjp0cmFuc2xhdGUpOgorICAgICAgICAoV1RG
OjpVQ2hhckJ1ZmZlclRyYW5zbGF0b3I6Omhhc2gpOgorICAgICAgICAoV1RGOjpVQ2hhckJ1ZmZl
clRyYW5zbGF0b3I6OmVxdWFsKToKKyAgICAgICAgKFdURjo6VUNoYXJCdWZmZXJUcmFuc2xhdG9y
Ojp0cmFuc2xhdGUpOgorICAgICAgICAoV1RGOjpIYXNoQW5kQ2hhcmFjdGVyc1RyYW5zbGF0b3I6
Omhhc2gpOgorICAgICAgICAoV1RGOjpIYXNoQW5kQ2hhcmFjdGVyc1RyYW5zbGF0b3I6OmVxdWFs
KToKKyAgICAgICAgKFdURjo6SGFzaEFuZENoYXJhY3RlcnNUcmFuc2xhdG9yOjp0cmFuc2xhdGUp
OgorICAgICAgICAoV1RGOjpJZGVudGlmaWVyT3JBdG9taWNTdHJpbmdUYWJsZTo6cmVtb3ZlKToK
KyAgICAgICAgKFdURjo6Ojp+SWRlbnRpZmllck9yQXRvbWljU3RyaW5nVGFibGUpOgorICAgICAg
ICAoV1RGOjo6OmFkZCk6CisgICAgICAgIChXVEY6Ojo6ZmluZCk6CisgICAgICAgICogd3RmL3Rl
eHQvU3RyaW5nSW1wbC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTdHJpbmdJbXBsOjp+U3RyaW5n
SW1wbCk6CisgICAgICAgICogd3RmL3RleHQvU3RyaW5nSW1wbC5oOgorICAgICAgICAoV2ViQ29y
ZTo6U3RyaW5nSW1wbDo6aXNBdG9taWMpOgorICAgICAgICAoV2ViQ29yZTo6U3RyaW5nSW1wbDo6
c2V0SXNBdG9taWMpOgorICAgICAgICAoV2ViQ29yZTo6ZXF1YWwpOgorICAgICAgICAqIHd0Zi90
ZXh0L1N0cmluZ0ltcGxCYXNlLmg6CisgICAgICAgIChXVEY6OlN0cmluZ0ltcGxCYXNlOjpTdHJp
bmdJbXBsQmFzZSk6CisKIDIwMTAtMDQtMjEgIEFuZHkgRXN0ZXMgIDxhZXN0ZXNAYXBwbGUuY29t
PgogCiAgICAgICAgIFJ1YmJlciBzdGFtcGVkIGJ5IE1hcmsgUm93ZS4KSW5kZXg6IEphdmFTY3Jp
cHRDb3JlL0dOVW1ha2VmaWxlLmFtCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL0dOVW1h
a2VmaWxlLmFtCShyZXZpc2lvbiA1ODAyOCkKKysrIEphdmFTY3JpcHRDb3JlL0dOVW1ha2VmaWxl
LmFtCSh3b3JraW5nIGNvcHkpCkBAIC0zMDAsNiArMzAwLDcgQEAgamF2YXNjcmlwdGNvcmVfc291
cmNlcyArPSBcCiAJSmF2YVNjcmlwdENvcmUvd3RmL3RleHQvQXRvbWljU3RyaW5nLmNwcCBcCiAJ
SmF2YVNjcmlwdENvcmUvd3RmL3RleHQvQXRvbWljU3RyaW5nLmggXAogCUphdmFTY3JpcHRDb3Jl
L3d0Zi90ZXh0L0F0b21pY1N0cmluZ0ltcGwuaCBcCisJSmF2YVNjcmlwdENvcmUvd3RmL3RleHQv
QXRvbWljU3RyaW5nVGFibGUuaCBcCiAJSmF2YVNjcmlwdENvcmUvd3RmL3RleHQvQ1N0cmluZy5j
cHAgXAogCUphdmFTY3JpcHRDb3JlL3d0Zi90ZXh0L0NTdHJpbmcuaCBcCiAJSmF2YVNjcmlwdENv
cmUvd3RmL3RleHQvU3RyaW5nSGFzaC5oIFwKSW5kZXg6IEphdmFTY3JpcHRDb3JlL0phdmFTY3Jp
cHRDb3JlLmd5cGkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUu
Z3lwaQkocmV2aXNpb24gNTgwMjgpCisrKyBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5n
eXBpCSh3b3JraW5nIGNvcHkpCkBAIC00MjIsNiArNDIyLDcgQEAKICAgICAgICAgICAgICd3dGYv
dGV4dC9BdG9taWNTdHJpbmcuY3BwJywKICAgICAgICAgICAgICd3dGYvdGV4dC9BdG9taWNTdHJp
bmcuaCcsCiAgICAgICAgICAgICAnd3RmL3RleHQvQXRvbWljU3RyaW5nSW1wbC5oJywKKyAgICAg
ICAgICAgICd3dGYvdGV4dC9BdG9taWNTdHJpbmdUYWJsZS5oJywKICAgICAgICAgICAgICd3dGYv
dGV4dC9DU3RyaW5nLmNwcCcsCiAgICAgICAgICAgICAnd3RmL3RleHQvQ1N0cmluZy5oJywKICAg
ICAgICAgICAgICd3dGYvdGV4dC9TdHJpbmdIYXNoLmgnLApJbmRleDogSmF2YVNjcmlwdENvcmUv
SmF2YVNjcmlwdENvcmUudmNwcm9qL1dURi9XVEYudmNwcm9qCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFT
Y3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnZjcHJvai9XVEYvV1RGLnZjcHJvagkocmV2aXNpb24g
NTgwMjgpCisrKyBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3Byb2ovV1RGL1dURi52
Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAgLTU0OCw2ICs1NDgsMTAgQEAKICAJCQlSZWxhdGl2ZVBh
dGg9Ii4uXC4uXHd0Zlx0ZXh0XEF0b21pY1N0cmluZ0ltcGwuaCINCiAgCQkJPg0KICAJCTwvRmls
ZT4NCisgCQk8RmlsZQ0KKyAJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHd0Zlx0ZXh0XEF0b21pY1N0
cmluZ1RhYmxlLmgiDQorIAkJCT4NCisgCQk8L0ZpbGU+DQogCQk8RmlsZQ0KICAJCQlSZWxhdGl2
ZVBhdGg9Ii4uXC4uXHd0Zlx0ZXh0XENTdHJpbmcuY3BwIg0KICAJCQk+DQpJbmRleDogSmF2YVNj
cmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvago9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5w
Ynhwcm9qCShyZXZpc2lvbiA1ODAyOCkKKysrIEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3Jl
Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTIxNyw2ICsyMTcs
NyBAQAogCQk4NkI5OUFCOTExN0UzOTFFMDBERjVBOTAgLyogUm9wZUltcGwuaCBpbiBIZWFkZXJz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDg2Qjk5QUI3MTE3RTM5MUUwMERG
NUE5MCAvKiBSb3BlSW1wbC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUs
ICk7IH07IH07CiAJCTg2Qjk5QUUzMTE3RTU3ODEwMERGNUE5MCAvKiBTdHJpbmdCdWZmZXIuaCBp
biBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDg2Qjk5QUUxMTE3
RTU3ODEwMERGNUE5MCAvKiBTdHJpbmdCdWZmZXIuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRF
UyA9IChQcml2YXRlLCApOyB9OyB9OwogCQk4NkI5OUFFNDExN0U1NzgxMDBERjVBOTAgLyogU3Ry
aW5nSW1wbEJhc2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IDg2Qjk5QUUyMTE3RTU3ODEwMERGNUE5MCAvKiBTdHJpbmdJbXBsQmFzZS5oICovOyBzZXR0
aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CisJCTg2Qjk5REE3MTE4MDBG
ODUwMERGNUE5MCAvKiBBdG9taWNTdHJpbmdUYWJsZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODZCOTlEQTYxMTgwMEY4NTAwREY1QTkwIC8qIEF0b21p
Y1N0cmluZ1RhYmxlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsg
fTsgfTsKIAkJODZDMzZFRUEwRUUxMjg5RDAwQjNERjU5IC8qIE1hY3JvQXNzZW1ibGVyLmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4NkMzNkVFOTBFRTEy
ODlEMDBCM0RGNTkgLyogTWFjcm9Bc3NlbWJsZXIuaCAqLzsgfTsKIAkJODZDQTAzMkUxMDM4RTg0
NDAwMjhBNjA5IC8qIEV4ZWN1dGFibGUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gODZDQTAzMkQxMDM4RTg0NDAwMjhBNjA5IC8qIEV4ZWN1dGFibGUu
Y3BwICovOyB9OwogCQk4NkNBRkVFMzEwMzVEREU2MDAyOEE2MDkgLyogRXhlY3V0YWJsZS5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODZDQUZFRTIxMDM1
RERFNjAwMjhBNjA5IC8qIEV4ZWN1dGFibGUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9
ICgpOyB9OyB9OwpAQCAtNzU5LDYgKzc2MCw3IEBACiAJCTg2Qjk5QUI3MTE3RTM5MUUwMERGNUE5
MCAvKiBSb3BlSW1wbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBSb3BlSW1w
bC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4NkI5OUFFMTExN0U1NzgxMDBERjVB
OTAgLyogU3RyaW5nQnVmZmVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFN0
cmluZ0J1ZmZlci5oOyBwYXRoID0gdGV4dC9TdHJpbmdCdWZmZXIuaDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKIAkJODZCOTlBRTIxMTdFNTc4MTAwREY1QTkwIC8qIFN0cmluZ0ltcGxCYXNl
LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFN0cmluZ0ltcGxCYXNlLmg7IHBh
dGggPSB0ZXh0L1N0cmluZ0ltcGxCYXNlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJ
CTg2Qjk5REE2MTE4MDBGODUwMERGNUE5MCAvKiBBdG9taWNTdHJpbmdUYWJsZS5oICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBdG9taWNTdHJpbmdUYWJsZS5oOyBwYXRoID0gdGV4
dC9BdG9taWNTdHJpbmdUYWJsZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4NkMz
NkVFOTBFRTEyODlEMDBCM0RGNTkgLyogTWFjcm9Bc3NlbWJsZXIuaCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBwYXRoID0gTWFjcm9Bc3NlbWJsZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKIAkJODZDQTAzMkQxMDM4RTg0NDAwMjhBNjA5IC8qIEV4ZWN1dGFibGUuY3BwICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gRXhlY3V0YWJsZS5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCTg2Q0FGRUUyMTAzNURERTYwMDI4QTYwOSAvKiBFeGVjdXRh
YmxlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEV4ZWN1dGFibGUuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTE2NzYsNiArMTY3OCw3IEBACiAJCQkJODY4QkZB
MDAxMTdDRUZEMTAwQjkwOEIxIC8qIEF0b21pY1N0cmluZy5jcHAgKi8sCiAJCQkJODY4QkZBMDEx
MTdDRUZEMTAwQjkwOEIxIC8qIEF0b21pY1N0cmluZy5oICovLAogCQkJCTg2OEJGQTAyMTE3Q0VG
RDEwMEI5MDhCMSAvKiBBdG9taWNTdHJpbmdJbXBsLmggKi8sCisJCQkJODZCOTlEQTYxMTgwMEY4
NTAwREY1QTkwIC8qIEF0b21pY1N0cmluZ1RhYmxlLmggKi8sCiAJCQkJODY1NjU3NDAxMTVCRTNE
QTAwMjkxRjQwIC8qIENTdHJpbmcuY3BwICovLAogCQkJCTg2NTY1NzQxMTE1QkUzREEwMDI5MUY0
MCAvKiBDU3RyaW5nLmggKi8sCiAJCQkJODZCOTlBRTExMTdFNTc4MTAwREY1QTkwIC8qIFN0cmlu
Z0J1ZmZlci5oICovLApAQCAtMjA4OSw2ICsyMDkyLDcgQEAKIAkJCQk4NkI5OUFCOTExN0UzOTFF
MDBERjVBOTAgLyogUm9wZUltcGwuaCBpbiBIZWFkZXJzICovLAogCQkJCTg2Qjk5QUUzMTE3RTU3
ODEwMERGNUE5MCAvKiBTdHJpbmdCdWZmZXIuaCBpbiBIZWFkZXJzICovLAogCQkJCTg2Qjk5QUU0
MTE3RTU3ODEwMERGNUE5MCAvKiBTdHJpbmdJbXBsQmFzZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJ
ODZCOTlEQTcxMTgwMEY4NTAwREY1QTkwIC8qIEF0b21pY1N0cmluZ1RhYmxlLmggaW4gSGVhZGVy
cyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsK
IAkJfTsKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvSWRlbnRpZmllci5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gSmF2YVNjcmlwdENvcmUvcnVudGltZS9JZGVudGlmaWVyLmNwcAkocmV2aXNpb24g
NTgwMjgpCisrKyBKYXZhU2NyaXB0Q29yZS9ydW50aW1lL0lkZW50aWZpZXIuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0yOSwzMCArMjksMjMgQEAKICNpbmNsdWRlIDx3dGYvRmFzdE1hbGxvYy5oPgog
I2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CiAjaW5jbHVkZSA8d3RmL1dURlRocmVhZERhdGEuaD4K
KyNpbmNsdWRlIDx3dGYvdGV4dC9BdG9taWNTdHJpbmdUYWJsZS5oPgogI2luY2x1ZGUgPHd0Zi90
ZXh0L1N0cmluZ0hhc2guaD4KIAogdXNpbmcgV1RGOjpUaHJlYWRTcGVjaWZpYzsKIAogbmFtZXNw
YWNlIEpTQyB7CiAKLUlkZW50aWZpZXJUYWJsZTo6fklkZW50aWZpZXJUYWJsZSgpCi17Ci0gICAg
SGFzaFNldDxTdHJpbmdJbXBsKj46Oml0ZXJhdG9yIGVuZCA9IG1fdGFibGUuZW5kKCk7Ci0gICAg
Zm9yIChIYXNoU2V0PFN0cmluZ0ltcGwqPjo6aXRlcmF0b3IgaXRlciA9IG1fdGFibGUuYmVnaW4o
KTsgaXRlciAhPSBlbmQ7ICsraXRlcikKLSAgICAgICAgKCppdGVyKS0+c2V0SXNJZGVudGlmaWVy
KGZhbHNlKTsKLX0KLXN0ZDo6cGFpcjxIYXNoU2V0PFN0cmluZ0ltcGwqPjo6aXRlcmF0b3IsIGJv
b2w+IElkZW50aWZpZXJUYWJsZTo6YWRkKFN0cmluZ0ltcGwqIHZhbHVlKQorY2xhc3MgTGl0ZXJh
bFRhYmxlIDogcHVibGljIEhhc2hNYXA8Y29uc3QgY2hhciosIFJlZlB0cjxTdHJpbmdJbXBsPiwg
UHRySGFzaDxjb25zdCBjaGFyKj4gPiB7fTsKKworTGl0ZXJhbFRhYmxlKiBjcmVhdGVMaXRlcmFs
VGFibGUoKQogewotICAgIHN0ZDo6cGFpcjxIYXNoU2V0PFN0cmluZ0ltcGwqPjo6aXRlcmF0b3Is
IGJvb2w+IHJlc3VsdCA9IG1fdGFibGUuYWRkKHZhbHVlKTsKLSAgICAoKnJlc3VsdC5maXJzdCkt
PnNldElzSWRlbnRpZmllcih0cnVlKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBu
ZXcgTGl0ZXJhbFRhYmxlOwogfQotdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgVj4KLXN0
ZDo6cGFpcjxIYXNoU2V0PFN0cmluZ0ltcGwqPjo6aXRlcmF0b3IsIGJvb2w+IElkZW50aWZpZXJU
YWJsZTo6YWRkKFUgdmFsdWUpCisKK3ZvaWQgZGVsZXRlTGl0ZXJhbFRhYmxlKExpdGVyYWxUYWJs
ZSogdGFibGUpCiB7Ci0gICAgc3RkOjpwYWlyPEhhc2hTZXQ8U3RyaW5nSW1wbCo+OjppdGVyYXRv
ciwgYm9vbD4gcmVzdWx0ID0gbV90YWJsZS5hZGQ8VSwgVj4odmFsdWUpOwotICAgICgqcmVzdWx0
LmZpcnN0KS0+c2V0SXNJZGVudGlmaWVyKHRydWUpOwotICAgIHJldHVybiByZXN1bHQ7CisgICAg
ZGVsZXRlIHRhYmxlOwogfQogCiBJZGVudGlmaWVyVGFibGUqIGNyZWF0ZUlkZW50aWZpZXJUYWJs
ZSgpCkBAIC04NiwyOSArNzksNiBAQCBib29sIElkZW50aWZpZXI6OmVxdWFsKGNvbnN0IFVTdHJp
bmc6OlJlCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0cnVjdCBJZGVudGlmaWVyQ1N0cmluZ1Ry
YW5zbGF0b3IgewotICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IGNoYXIqIGMpCi0gICAg
ewotICAgICAgICByZXR1cm4gVVN0cmluZzo6UmVwOjpjb21wdXRlSGFzaChjKTsKLSAgICB9Ci0K
LSAgICBzdGF0aWMgYm9vbCBlcXVhbChVU3RyaW5nOjpSZXAqIHIsIGNvbnN0IGNoYXIqIHMpCi0g
ICAgewotICAgICAgICByZXR1cm4gSWRlbnRpZmllcjo6ZXF1YWwociwgcyk7Ci0gICAgfQotCi0g
ICAgc3RhdGljIHZvaWQgdHJhbnNsYXRlKFVTdHJpbmc6OlJlcComIGxvY2F0aW9uLCBjb25zdCBj
aGFyKiBjLCB1bnNpZ25lZCBoYXNoKQotICAgIHsKLSAgICAgICAgc2l6ZV90IGxlbmd0aCA9IHN0
cmxlbihjKTsKLSAgICAgICAgVUNoYXIqIGQ7Ci0gICAgICAgIFVTdHJpbmc6OlJlcCogciA9IFVT
dHJpbmc6OlJlcDo6Y3JlYXRlVW5pbml0aWFsaXplZChsZW5ndGgsIGQpLnJlbGVhc2VSZWYoKTsK
LSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gbGVuZ3RoOyBpKyspCi0gICAgICAgICAg
ICBkW2ldID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY1tpXSk7IC8vIHVzZSB1bnNpZ25l
ZCBjaGFyIHRvIHplcm8tZXh0ZW5kIGluc3RlYWQgb2Ygc2lnbi1leHRlbmQKLSAgICAgICAgci0+
c2V0SGFzaChoYXNoKTsKLSAgICAgICAgbG9jYXRpb24gPSByOwotICAgIH0KLX07Ci0KIFBhc3NS
ZWZQdHI8VVN0cmluZzo6UmVwPiBJZGVudGlmaWVyOjphZGQoSlNHbG9iYWxEYXRhKiBnbG9iYWxE
YXRhLCBjb25zdCBjaGFyKiBjKQogewogICAgIGlmICghYykKQEAgLTExOCwyMSArODgsMTMgQEAg
UGFzc1JlZlB0cjxVU3RyaW5nOjpSZXA+IElkZW50aWZpZXI6OmFkZAogICAgIGlmICghY1sxXSkK
ICAgICAgICAgcmV0dXJuIGFkZChnbG9iYWxEYXRhLCBnbG9iYWxEYXRhLT5zbWFsbFN0cmluZ3Mu
c2luZ2xlQ2hhcmFjdGVyU3RyaW5nUmVwKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNbMF0p
KSk7CiAKLSAgICBJZGVudGlmaWVyVGFibGUmIGlkZW50aWZpZXJUYWJsZSA9ICpnbG9iYWxEYXRh
LT5pZGVudGlmaWVyVGFibGU7Ci0gICAgTGl0ZXJhbElkZW50aWZpZXJUYWJsZSYgbGl0ZXJhbElk
ZW50aWZpZXJUYWJsZSA9IGlkZW50aWZpZXJUYWJsZS5saXRlcmFsVGFibGUoKTsKLQotICAgIGNv
bnN0IExpdGVyYWxJZGVudGlmaWVyVGFibGU6Oml0ZXJhdG9yJiBpdGVyID0gbGl0ZXJhbElkZW50
aWZpZXJUYWJsZS5maW5kKGMpOwotICAgIGlmIChpdGVyICE9IGxpdGVyYWxJZGVudGlmaWVyVGFi
bGUuZW5kKCkpCisgICAgTGl0ZXJhbFRhYmxlKiBsaXRlcmFsVGFibGUgPSBnbG9iYWxEYXRhLT5s
aXRlcmFsVGFibGU7CisgICAgY29uc3QgTGl0ZXJhbFRhYmxlOjppdGVyYXRvciYgaXRlciA9IGxp
dGVyYWxUYWJsZS0+ZmluZChjKTsKKyAgICBpZiAoaXRlciAhPSBsaXRlcmFsVGFibGUtPmVuZCgp
KQogICAgICAgICByZXR1cm4gaXRlci0+c2Vjb25kOwogCi0gICAgcGFpcjxIYXNoU2V0PFVTdHJp
bmc6OlJlcCo+OjppdGVyYXRvciwgYm9vbD4gYWRkUmVzdWx0ID0gaWRlbnRpZmllclRhYmxlLmFk
ZDxjb25zdCBjaGFyKiwgSWRlbnRpZmllckNTdHJpbmdUcmFuc2xhdG9yPihjKTsKLQotICAgIC8v
IElmIHRoZSBzdHJpbmcgaXMgbmV3bHktdHJhbnNsYXRlZCwgdGhlbiB3ZSBuZWVkIHRvIGFkb3B0
IGl0LgotICAgIC8vIFRoZSBib29sZWFuIGluIHRoZSBwYWlyIHRlbGxzIHVzIGlmIHRoYXQgaXMg
c28uCi0gICAgUmVmUHRyPFVTdHJpbmc6OlJlcD4gYWRkZWRTdHJpbmcgPSBhZGRSZXN1bHQuc2Vj
b25kID8gYWRvcHRSZWYoKmFkZFJlc3VsdC5maXJzdCkgOiAqYWRkUmVzdWx0LmZpcnN0OwotCi0g
ICAgbGl0ZXJhbElkZW50aWZpZXJUYWJsZS5hZGQoYywgYWRkZWRTdHJpbmcuZ2V0KCkpOwotCisg
ICAgUmVmUHRyPFN0cmluZ0ltcGw+IGFkZGVkU3RyaW5nID0gZ2xvYmFsRGF0YS0+aWRlbnRpZmll
clRhYmxlLT5hZGQoYyk7CisgICAgbGl0ZXJhbFRhYmxlLT5hZGQoYywgYWRkZWRTdHJpbmcuZ2V0
KCkpOwogICAgIHJldHVybiBhZGRlZFN0cmluZy5yZWxlYXNlKCk7CiB9CiAKQEAgLTE0MSwzMyAr
MTAzLDYgQEAgUGFzc1JlZlB0cjxVU3RyaW5nOjpSZXA+IElkZW50aWZpZXI6OmFkZAogICAgIHJl
dHVybiBhZGQoJmV4ZWMtPmdsb2JhbERhdGEoKSwgYyk7CiB9CiAKLXN0cnVjdCBVQ2hhckJ1ZmZl
ciB7Ci0gICAgY29uc3QgVUNoYXIqIHM7Ci0gICAgdW5zaWduZWQgaW50IGxlbmd0aDsKLX07Ci0K
LXN0cnVjdCBJZGVudGlmaWVyVUNoYXJCdWZmZXJUcmFuc2xhdG9yIHsKLSAgICBzdGF0aWMgdW5z
aWduZWQgaGFzaChjb25zdCBVQ2hhckJ1ZmZlciYgYnVmKQotICAgIHsKLSAgICAgICAgcmV0dXJu
IFVTdHJpbmc6OlJlcDo6Y29tcHV0ZUhhc2goYnVmLnMsIGJ1Zi5sZW5ndGgpOwotICAgIH0KLQot
ICAgIHN0YXRpYyBib29sIGVxdWFsKFVTdHJpbmc6OlJlcCogc3RyLCBjb25zdCBVQ2hhckJ1ZmZl
ciYgYnVmKQotICAgIHsKLSAgICAgICAgcmV0dXJuIElkZW50aWZpZXI6OmVxdWFsKHN0ciwgYnVm
LnMsIGJ1Zi5sZW5ndGgpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHRyYW5zbGF0ZShVU3Ry
aW5nOjpSZXAqJiBsb2NhdGlvbiwgY29uc3QgVUNoYXJCdWZmZXImIGJ1ZiwgdW5zaWduZWQgaGFz
aCkKLSAgICB7Ci0gICAgICAgIFVDaGFyKiBkOwotICAgICAgICBVU3RyaW5nOjpSZXAqIHIgPSBV
U3RyaW5nOjpSZXA6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQoYnVmLmxlbmd0aCwgZCkucmVsZWFzZVJl
ZigpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IGJ1Zi5sZW5ndGg7IGkrKykK
LSAgICAgICAgICAgIGRbaV0gPSBidWYuc1tpXTsKLSAgICAgICAgci0+c2V0SGFzaChoYXNoKTsK
LSAgICAgICAgbG9jYXRpb24gPSByOyAKLSAgICB9Ci19OwotCiBQYXNzUmVmUHRyPFVTdHJpbmc6
OlJlcD4gSWRlbnRpZmllcjo6YWRkKEpTR2xvYmFsRGF0YSogZ2xvYmFsRGF0YSwgY29uc3QgVUNo
YXIqIHMsIGludCBsZW5ndGgpCiB7CiAgICAgaWYgKGxlbmd0aCA9PSAxKSB7CkBAIC0xNzcsMTIg
KzExMiw4IEBAIFBhc3NSZWZQdHI8VVN0cmluZzo6UmVwPiBJZGVudGlmaWVyOjphZGQKICAgICB9
CiAgICAgaWYgKCFsZW5ndGgpCiAgICAgICAgIHJldHVybiBVU3RyaW5nOjpSZXA6OmVtcHR5KCk7
Ci0gICAgVUNoYXJCdWZmZXIgYnVmID0ge3MsIGxlbmd0aH07IAotICAgIHBhaXI8SGFzaFNldDxV
U3RyaW5nOjpSZXAqPjo6aXRlcmF0b3IsIGJvb2w+IGFkZFJlc3VsdCA9IGdsb2JhbERhdGEtPmlk
ZW50aWZpZXJUYWJsZS0+YWRkPFVDaGFyQnVmZmVyLCBJZGVudGlmaWVyVUNoYXJCdWZmZXJUcmFu
c2xhdG9yPihidWYpOwogCi0gICAgLy8gSWYgdGhlIHN0cmluZyBpcyBuZXdseS10cmFuc2xhdGVk
LCB0aGVuIHdlIG5lZWQgdG8gYWRvcHQgaXQuCi0gICAgLy8gVGhlIGJvb2xlYW4gaW4gdGhlIHBh
aXIgdGVsbHMgdXMgaWYgdGhhdCBpcyBzby4KLSAgICByZXR1cm4gYWRkUmVzdWx0LnNlY29uZCA/
IGFkb3B0UmVmKCphZGRSZXN1bHQuZmlyc3QpIDogKmFkZFJlc3VsdC5maXJzdDsKKyAgICByZXR1
cm4gZ2xvYmFsRGF0YS0+aWRlbnRpZmllclRhYmxlLT5hZGQocywgbGVuZ3RoKTsKIH0KIAogUGFz
c1JlZlB0cjxVU3RyaW5nOjpSZXA+IElkZW50aWZpZXI6OmFkZChFeGVjU3RhdGUqIGV4ZWMsIGNv
bnN0IFVDaGFyKiBzLCBpbnQgbGVuZ3RoKQpAQCAtMjA1LDcgKzEzNiw3IEBAIFBhc3NSZWZQdHI8
VVN0cmluZzo6UmVwPiBJZGVudGlmaWVyOjphZGQKICAgICAgICAgICAgICAgICByZXR1cm4gcjsK
ICAgICB9CiAKLSAgICByZXR1cm4gKmdsb2JhbERhdGEtPmlkZW50aWZpZXJUYWJsZS0+YWRkKHIp
LmZpcnN0OworICAgIHJldHVybiBnbG9iYWxEYXRhLT5pZGVudGlmaWVyVGFibGUtPmFkZChyKTsK
IH0KIAogUGFzc1JlZlB0cjxVU3RyaW5nOjpSZXA+IElkZW50aWZpZXI6OmFkZFNsb3dDYXNlKEV4
ZWNTdGF0ZSogZXhlYywgVVN0cmluZzo6UmVwKiByKQpJbmRleDogSmF2YVNjcmlwdENvcmUvcnVu
dGltZS9JZGVudGlmaWVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvcnVudGltZS9J
ZGVudGlmaWVyLmgJKHJldmlzaW9uIDU4MDI4KQorKysgSmF2YVNjcmlwdENvcmUvcnVudGltZS9J
ZGVudGlmaWVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTEzNyw2ICsxMzcsOCBAQCBuYW1lc3BhY2Ug
SlNDIHsKIAogICAgIElkZW50aWZpZXJUYWJsZSogY3JlYXRlSWRlbnRpZmllclRhYmxlKCk7CiAg
ICAgdm9pZCBkZWxldGVJZGVudGlmaWVyVGFibGUoSWRlbnRpZmllclRhYmxlKik7CisgICAgTGl0
ZXJhbFRhYmxlKiBjcmVhdGVMaXRlcmFsVGFibGUoKTsKKyAgICB2b2lkIGRlbGV0ZUxpdGVyYWxU
YWJsZShMaXRlcmFsVGFibGUqKTsKIAogfSAvLyBuYW1lc3BhY2UgSlNDCiAKSW5kZXg6IEphdmFT
Y3JpcHRDb3JlL3J1bnRpbWUvSlNHbG9iYWxEYXRhLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2Ny
aXB0Q29yZS9ydW50aW1lL0pTR2xvYmFsRGF0YS5jcHAJKHJldmlzaW9uIDU4MDI4KQorKysgSmF2
YVNjcmlwdENvcmUvcnVudGltZS9KU0dsb2JhbERhdGEuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0x
MjksNiArMTI5LDcgQEAgSlNHbG9iYWxEYXRhOjpKU0dsb2JhbERhdGEoYm9vbCBpc1NoYXJlZAog
ICAgICwgbnVtYmVyU3RydWN0dXJlKEpTTnVtYmVyQ2VsbDo6Y3JlYXRlU3RydWN0dXJlKGpzTnVs
bCgpKSkKICNlbmRpZgogICAgICwgaWRlbnRpZmllclRhYmxlKGNyZWF0ZUlkZW50aWZpZXJUYWJs
ZSgpKQorICAgICwgbGl0ZXJhbFRhYmxlKGNyZWF0ZUxpdGVyYWxUYWJsZSgpKQogICAgICwgcHJv
cGVydHlOYW1lcyhuZXcgQ29tbW9uSWRlbnRpZmllcnModGhpcykpCiAgICAgLCBlbXB0eUxpc3Qo
bmV3IE1hcmtlZEFyZ3VtZW50QnVmZmVyKQogICAgICwgbGV4ZXIobmV3IExleGVyKHRoaXMpKQpA
QCAtMTkzLDYgKzE5NCw3IEBAIEpTR2xvYmFsRGF0YTo6fkpTR2xvYmFsRGF0YSgpCiAKICAgICBk
ZWxldGUgcHJvcGVydHlOYW1lczsKICAgICBkZWxldGVJZGVudGlmaWVyVGFibGUoaWRlbnRpZmll
clRhYmxlKTsKKyAgICBkZWxldGVMaXRlcmFsVGFibGUobGl0ZXJhbFRhYmxlKTsKIAogICAgIGRl
bGV0ZSBjbGllbnREYXRhOwogfQpJbmRleDogSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU0dsb2Jh
bERhdGEuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTR2xvYmFsRGF0
YS5oCShyZXZpc2lvbiA1ODAyOCkKKysrIEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNHbG9iYWxE
YXRhLmgJKHdvcmtpbmcgY29weSkKQEAgLTU2LDYgKzU2LDcgQEAgbmFtZXNwYWNlIEpTQyB7CiAg
ICAgY2xhc3MgSlNHbG9iYWxPYmplY3Q7CiAgICAgY2xhc3MgSlNPYmplY3Q7CiAgICAgY2xhc3Mg
TGV4ZXI7CisgICAgY2xhc3MgTGl0ZXJhbFRhYmxlOwogICAgIGNsYXNzIFBhcnNlcjsKICAgICBj
bGFzcyBTdHJpbmdpZmllcjsKICAgICBjbGFzcyBTdHJ1Y3R1cmU7CkBAIC0xNDMsNiArMTQ0LDcg
QEAgbmFtZXNwYWNlIEpTQyB7CiAgICAgICAgIHN0YXRpYyBKU19FWFBPUlREQVRBIHZvaWQqIGpz
RnVuY3Rpb25WUHRyOwogCiAgICAgICAgIElkZW50aWZpZXJUYWJsZSogaWRlbnRpZmllclRhYmxl
OworICAgICAgICBMaXRlcmFsVGFibGUqIGxpdGVyYWxUYWJsZTsKICAgICAgICAgQ29tbW9uSWRl
bnRpZmllcnMqIHByb3BlcnR5TmFtZXM7CiAgICAgICAgIGNvbnN0IE1hcmtlZEFyZ3VtZW50QnVm
ZmVyKiBlbXB0eUxpc3Q7IC8vIExpc3RzIGFyZSBzdXBwb3NlZCB0byBiZSBhbGxvY2F0ZWQgb24g
dGhlIHN0YWNrIHRvIGhhdmUgdGhlaXIgZWxlbWVudHMgcHJvcGVybHkgbWFya2VkLCB3aGljaCBp
cyBub3QgdGhlIGNhc2UgaGVyZSAtIGJ1dCB0aGlzIGxpc3QgaGFzIG5vdGhpbmcgdG8gbWFyay4K
ICAgICAgICAgU21hbGxTdHJpbmdzIHNtYWxsU3RyaW5nczsKSW5kZXg6IEphdmFTY3JpcHRDb3Jl
L3d0Zi9XVEZUaHJlYWREYXRhLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYv
V1RGVGhyZWFkRGF0YS5jcHAJKHJldmlzaW9uIDU4MDI4KQorKysgSmF2YVNjcmlwdENvcmUvd3Rm
L1dURlRocmVhZERhdGEuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNiw2ICsyNiw3IEBACiAKICNp
bmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJXVEZUaHJlYWREYXRhLmgiCisjaW5jbHVkZSA8
d3RmL3RleHQvQXRvbWljU3RyaW5nVGFibGUuaD4KIAogbmFtZXNwYWNlIFdURiB7CiAKQEAgLTM2
LDggKzM3LDcgQEAgV1RGVGhyZWFkRGF0YSogV1RGVGhyZWFkRGF0YTo6c3RhdGljRGF0YQogI2Vu
ZGlmCiAKIFdURlRocmVhZERhdGE6OldURlRocmVhZERhdGEoKQotICAgIDogbV9hdG9taWNTdHJp
bmdUYWJsZSgwKQotICAgICwgbV9hdG9taWNTdHJpbmdUYWJsZURlc3RydWN0b3IoMCkKKyAgICA6
IG1fYXRvbWljU3RyaW5nVGFibGUobmV3IFdlYkNvcmU6OkF0b21pY1N0cmluZ1RhYmxlKCkpCiAj
aWYgVVNFKEpTQykKICAgICAsIG1fZGVmYXVsdElkZW50aWZpZXJUYWJsZSgwKQogICAgICwgbV9j
dXJyZW50SWRlbnRpZmllclRhYmxlKDApCkBAIC00Nyw4ICs0Nyw3IEBAIFdURlRocmVhZERhdGE6
OldURlRocmVhZERhdGEoKQogCiBXVEZUaHJlYWREYXRhOjp+V1RGVGhyZWFkRGF0YSgpCiB7Ci0g
ICAgaWYgKG1fYXRvbWljU3RyaW5nVGFibGVEZXN0cnVjdG9yKQotICAgICAgICBtX2F0b21pY1N0
cmluZ1RhYmxlRGVzdHJ1Y3RvcihtX2F0b21pY1N0cmluZ1RhYmxlKTsKKyAgICBkZWxldGUgbV9h
dG9taWNTdHJpbmdUYWJsZTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogSmF2
YVNjcmlwdENvcmUvd3RmL1dURlRocmVhZERhdGEuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS93dGYvV1RGVGhyZWFkRGF0YS5oCShyZXZpc2lvbiA1ODAyOCkKKysrIEphdmFTY3JpcHRD
b3JlL3d0Zi9XVEZUaHJlYWREYXRhLmgJKHdvcmtpbmcgY29weSkKQEAgLTI3LDEwICsyNyw3IEBA
CiAjaWZuZGVmIFdURlRocmVhZERhdGFfaAogI2RlZmluZSBXVEZUaHJlYWREYXRhX2gKIAotI2lu
Y2x1ZGUgPHd0Zi9IYXNoTWFwLmg+Ci0jaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KICNpbmNsdWRl
IDx3dGYvTm9uY29weWFibGUuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdIYXNoLmg+CiAK
IC8vIFRoaXMgd2FzIEVOQUJMRShXT1JLRVJTKSBpbiBXZWJDb3JlLCBidXQgdGhpcyBpcyBub3Qg
ZGVmaW5lZCB3aGVuIGNvbXBpbGluZyBKU0MuCiAvLyBIb3dldmVyIHRoaXMgY2hlY2sgd2FzIG5v
dCBjb3JyZWN0IGFueXdheSwgcmUgdGhpcyBjb21tZW50OgpAQCAtNDYsMzkgKzQzLDE0IEBACiAj
ZW5kaWYKIAogLy8gRklYTUU6IFRoaXMgaXMgYSB0ZW1wb3JhcnkgbGF5ZXJpbmcgdmlvbGF0aW9u
IHdoaWxlIHdlIG1vdmUgbW9yZSBzdHJpbmcgY29kZSB0byBXVEYuCi1uYW1lc3BhY2UgV2ViQ29y
ZSB7Ci1jbGFzcyBBdG9taWNTdHJpbmdUYWJsZTsKLWNsYXNzIFN0cmluZ0ltcGw7CituYW1lc3Bh
Y2UgSlNDIHsKK2NsYXNzIElkZW50aWZpZXJUYWJsZTsKIH0KLXVzaW5nIFdlYkNvcmU6OlN0cmlu
Z0ltcGw7CiAKLXR5cGVkZWYgdm9pZCAoKkF0b21pY1N0cmluZ1RhYmxlRGVzdHJ1Y3RvcikoV2Vi
Q29yZTo6QXRvbWljU3RyaW5nVGFibGUqKTsKLQotI2lmIFVTRShKU0MpCiAvLyBGSVhNRTogVGhp
cyBpcyBhIHRlbXBvcmFyeSBsYXllcmluZyB2aW9sYXRpb24gd2hpbGUgd2UgbW92ZSBtb3JlIHN0
cmluZyBjb2RlIHRvIFdURi4KLW5hbWVzcGFjZSBKU0MgewotCi10eXBlZGVmIEhhc2hNYXA8Y29u
c3QgY2hhciosIFJlZlB0cjxTdHJpbmdJbXBsPiwgUHRySGFzaDxjb25zdCBjaGFyKj4gPiBMaXRl
cmFsSWRlbnRpZmllclRhYmxlOwotCi1jbGFzcyBJZGVudGlmaWVyVGFibGUgOiBwdWJsaWMgRmFz
dEFsbG9jQmFzZSB7Ci1wdWJsaWM6Ci0gICAgfklkZW50aWZpZXJUYWJsZSgpOwotCi0gICAgc3Rk
OjpwYWlyPEhhc2hTZXQ8U3RyaW5nSW1wbCo+OjppdGVyYXRvciwgYm9vbD4gYWRkKFN0cmluZ0lt
cGwqIHZhbHVlKTsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBWPgotICAgIHN0
ZDo6cGFpcjxIYXNoU2V0PFN0cmluZ0ltcGwqPjo6aXRlcmF0b3IsIGJvb2w+IGFkZChVIHZhbHVl
KTsKLQotICAgIHZvaWQgcmVtb3ZlKFN0cmluZ0ltcGwqIHIpIHsgbV90YWJsZS5yZW1vdmUocik7
IH0KLQotICAgIExpdGVyYWxJZGVudGlmaWVyVGFibGUmIGxpdGVyYWxUYWJsZSgpIHsgcmV0dXJu
IG1fbGl0ZXJhbFRhYmxlOyB9Ci0KLXByaXZhdGU6Ci0gICAgSGFzaFNldDxTdHJpbmdJbXBsKj4g
bV90YWJsZTsKLSAgICBMaXRlcmFsSWRlbnRpZmllclRhYmxlIG1fbGl0ZXJhbFRhYmxlOwotfTsK
LQorbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgQXRvbWljU3RyaW5nVGFibGU7CiB9Ci0jZW5k
aWYKIAogbmFtZXNwYWNlIFdURiB7CiAKQEAgLTg3LDkgKzU5LDkgQEAgcHVibGljOgogICAgIFdU
RlRocmVhZERhdGEoKTsKICAgICB+V1RGVGhyZWFkRGF0YSgpOwogCi0gICAgV2ViQ29yZTo6QXRv
bWljU3RyaW5nVGFibGUqIGF0b21pY1N0cmluZ1RhYmxlKCkKKyAgICBXZWJDb3JlOjpBdG9taWNT
dHJpbmdUYWJsZSYgYXRvbWljU3RyaW5nVGFibGUoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG1f
YXRvbWljU3RyaW5nVGFibGU7CisgICAgICAgIHJldHVybiAqbV9hdG9taWNTdHJpbmdUYWJsZTsK
ICAgICB9CiAKICNpZiBVU0UoSlNDKQpAQCAtMTE5LDcgKzkxLDYgQEAgcHVibGljOgogCiBwcml2
YXRlOgogICAgIFdlYkNvcmU6OkF0b21pY1N0cmluZ1RhYmxlKiBtX2F0b21pY1N0cmluZ1RhYmxl
OwotICAgIEF0b21pY1N0cmluZ1RhYmxlRGVzdHJ1Y3RvciBtX2F0b21pY1N0cmluZ1RhYmxlRGVz
dHJ1Y3RvcjsKIAogI2lmIFVTRShKU0MpCiAgICAgSlNDOjpJZGVudGlmaWVyVGFibGUqIG1fZGVm
YXVsdElkZW50aWZpZXJUYWJsZTsKQEAgLTEzMiw3ICsxMDMsNiBAQCBwcml2YXRlOgogICAgIHN0
YXRpYyBKU19FWFBPUlREQVRBIFdURlRocmVhZERhdGEqIHN0YXRpY0RhdGE7CiAjZW5kaWYKICAg
ICBmcmllbmQgV1RGVGhyZWFkRGF0YSYgd3RmVGhyZWFkRGF0YSgpOwotICAgIGZyaWVuZCBjbGFz
cyBXZWJDb3JlOjpBdG9taWNTdHJpbmdUYWJsZTsKIH07CiAKIGlubGluZSBXVEZUaHJlYWREYXRh
JiB3dGZUaHJlYWREYXRhKCkKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi90ZXh0L0F0b21pY1N0
cmluZy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvd3RmL3RleHQvQXRvbWljU3Ry
aW5nLmNwcAkocmV2aXNpb24gNTgwMjgpCisrKyBKYXZhU2NyaXB0Q29yZS93dGYvdGV4dC9BdG9t
aWNTdHJpbmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMSw3MSArMzEsMTUgQEAKICNpbmNsdWRl
IDx3dGYvVGhyZWFkaW5nLmg+CiAjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KICNpbmNsdWRlIDx3
dGYvV1RGVGhyZWFkRGF0YS5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0F0b21pY1N0cmluZ1RhYmxl
Lmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotY2xhc3MgQXRvbWljU3RyaW5nVGFibGUgewot
cHVibGljOgotICAgIHN0YXRpYyBBdG9taWNTdHJpbmdUYWJsZSogY3JlYXRlKCkKLSAgICB7Ci0g
ICAgICAgIEF0b21pY1N0cmluZ1RhYmxlKiB0YWJsZSA9IG5ldyBBdG9taWNTdHJpbmdUYWJsZTsK
LQotICAgICAgICBXVEZUaHJlYWREYXRhJiBkYXRhID0gd3RmVGhyZWFkRGF0YSgpOwotICAgICAg
ICBkYXRhLm1fYXRvbWljU3RyaW5nVGFibGUgPSB0YWJsZTsKLSAgICAgICAgZGF0YS5tX2F0b21p
Y1N0cmluZ1RhYmxlRGVzdHJ1Y3RvciA9IEF0b21pY1N0cmluZ1RhYmxlOjpkZXN0cm95OwotCi0g
ICAgICAgIHJldHVybiB0YWJsZTsKLSAgICB9Ci0KLSAgICBIYXNoU2V0PFN0cmluZ0ltcGwqPiYg
dGFibGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fdGFibGU7Ci0gICAgfQotCi1wcml2YXRl
OgotICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koQXRvbWljU3RyaW5nVGFibGUqIHRhYmxlKQotICAg
IHsKLSAgICAgICAgZGVsZXRlIHRhYmxlOwotICAgIH0KLQotICAgIEhhc2hTZXQ8U3RyaW5nSW1w
bCo+IG1fdGFibGU7Ci19OwotCi1zdGF0aWMgaW5saW5lIEhhc2hTZXQ8U3RyaW5nSW1wbCo+JiBz
dHJpbmdUYWJsZSgpCitzdGF0aWMgaW5saW5lIEF0b21pY1N0cmluZ1RhYmxlJiB0YWJsZSgpCiB7
Ci0gICAgLy8gT25jZSBwb3NzaWJsZSB3ZSBzaG91bGQgbWFrZSB0aGlzIG5vbi1sYXp5IChjb25z
dHJ1Y3RlZCBpbiBXVEZUaHJlYWREYXRhJ3MgY29uc3RydWN0b3IpLgotICAgIEF0b21pY1N0cmlu
Z1RhYmxlKiB0YWJsZSA9IHd0ZlRocmVhZERhdGEoKS5hdG9taWNTdHJpbmdUYWJsZSgpOwotICAg
IGlmIChVTkxJS0VMWSghdGFibGUpKQotICAgICAgICB0YWJsZSA9IEF0b21pY1N0cmluZ1RhYmxl
OjpjcmVhdGUoKTsKLSAgICByZXR1cm4gdGFibGUtPnRhYmxlKCk7CisgICAgcmV0dXJuIHd0ZlRo
cmVhZERhdGEoKS5hdG9taWNTdHJpbmdUYWJsZSgpOwogfQogCi1zdHJ1Y3QgQ1N0cmluZ1RyYW5z
bGF0b3IgewotICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IGNoYXIqIGMpCi0gICAgewot
ICAgICAgICByZXR1cm4gU3RyaW5nSW1wbDo6Y29tcHV0ZUhhc2goYyk7Ci0gICAgfQotCi0gICAg
c3RhdGljIGJvb2wgZXF1YWwoU3RyaW5nSW1wbCogciwgY29uc3QgY2hhciogcykKLSAgICB7Ci0g
ICAgICAgIGludCBsZW5ndGggPSByLT5sZW5ndGgoKTsKLSAgICAgICAgY29uc3QgVUNoYXIqIGQg
PSByLT5jaGFyYWN0ZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpICE9IGxlbmd0aDsg
KytpKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBzW2ldOwotICAgICAgICAgICAg
aWYgKGRbaV0gIT0gYykKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0K
LSAgICAgICAgcmV0dXJuIHNbbGVuZ3RoXSA9PSAwOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lk
IHRyYW5zbGF0ZShTdHJpbmdJbXBsKiYgbG9jYXRpb24sIGNvbnN0IGNoYXIqIGNvbnN0JiBjLCB1
bnNpZ25lZCBoYXNoKQotICAgIHsKLSAgICAgICAgbG9jYXRpb24gPSBTdHJpbmdJbXBsOjpjcmVh
dGUoYykucmVsZWFzZVJlZigpOyAKLSAgICAgICAgbG9jYXRpb24tPnNldEhhc2goaGFzaCk7Ci0g
ICAgICAgIGxvY2F0aW9uLT5zZXRJblRhYmxlKCk7Ci0gICAgfQotfTsKLQogYm9vbCBvcGVyYXRv
cj09KGNvbnN0IEF0b21pY1N0cmluZyYgYSwgY29uc3QgY2hhciogYikKIHsgCiAgICAgU3RyaW5n
SW1wbCogaW1wbCA9IGEuaW1wbCgpOwpAQCAtMTAzLDcgKzQ3LDcgQEAgYm9vbCBvcGVyYXRvcj09
KGNvbnN0IEF0b21pY1N0cmluZyYgYSwgYwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICBpZiAo
KCFpbXBsIHx8ICFpbXBsLT5jaGFyYWN0ZXJzKCkpIHx8ICFiKQogICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgcmV0dXJuIENTdHJpbmdUcmFuc2xhdG9yOjplcXVhbChpbXBsLCBiKTsgCisgICAg
cmV0dXJuIDo6ZXF1YWwoaW1wbCwgYik7IAogfQogCiBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IEF0
b21pY1N0cmluZzo6YWRkKGNvbnN0IGNoYXIqIGMpCkBAIC0xMTEsOTYgKzU1LDEwIEBAIFBhc3NS
ZWZQdHI8U3RyaW5nSW1wbD4gQXRvbWljU3RyaW5nOjphZGQKICAgICBpZiAoIWMpCiAgICAgICAg
IHJldHVybiAwOwogICAgIGlmICghKmMpCi0gICAgICAgIHJldHVybiBTdHJpbmdJbXBsOjplbXB0
eSgpOyAgICAKLSAgICBwYWlyPEhhc2hTZXQ8U3RyaW5nSW1wbCo+OjppdGVyYXRvciwgYm9vbD4g
YWRkUmVzdWx0ID0gc3RyaW5nVGFibGUoKS5hZGQ8Y29uc3QgY2hhciosIENTdHJpbmdUcmFuc2xh
dG9yPihjKTsKLSAgICBpZiAoIWFkZFJlc3VsdC5zZWNvbmQpCi0gICAgICAgIHJldHVybiAqYWRk
UmVzdWx0LmZpcnN0OwotICAgIHJldHVybiBhZG9wdFJlZigqYWRkUmVzdWx0LmZpcnN0KTsKLX0K
LQotc3RydWN0IFVDaGFyQnVmZmVyIHsKLSAgICBjb25zdCBVQ2hhciogczsKLSAgICB1bnNpZ25l
ZCBsZW5ndGg7Ci19OwotCi1zdGF0aWMgaW5saW5lIGJvb2wgZXF1YWwoU3RyaW5nSW1wbCogc3Ry
aW5nLCBjb25zdCBVQ2hhciogY2hhcmFjdGVycywgdW5zaWduZWQgbGVuZ3RoKQotewotICAgIGlm
IChzdHJpbmctPmxlbmd0aCgpICE9IGxlbmd0aCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgLy8gRklYTUU6IHBlcmhhcHMgd2Ugc2hvdWxkIGhhdmUgYSBtb3JlIGFic3RyYWN0IG1hY3Jv
IHRoYXQgaW5kaWNhdGVzIHdoZW4KLSAgICAvLyBnb2luZyA0IGJ5dGVzIGF0IGEgdGltZSBpcyB1
bnNhZmUKLSNpZiBDUFUoQVJNKSB8fCBDUFUoU0g0KQotICAgIGNvbnN0IFVDaGFyKiBzdHJpbmdD
aGFyYWN0ZXJzID0gc3RyaW5nLT5jaGFyYWN0ZXJzKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSAhPSBsZW5ndGg7ICsraSkgewotICAgICAgICBpZiAoKnN0cmluZ0NoYXJhY3RlcnMrKyAh
PSAqY2hhcmFjdGVycysrKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBy
ZXR1cm4gdHJ1ZTsKLSNlbHNlCi0gICAgLyogRG8gaXQgNC1ieXRlcy1hdC1hLXRpbWUgb24gYXJj
aGl0ZWN0dXJlcyB3aGVyZSBpdCdzIHNhZmUgKi8KLQotICAgIGNvbnN0IHVpbnQzMl90KiBzdHJp
bmdDaGFyYWN0ZXJzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KHN0cmluZy0+
Y2hhcmFjdGVycygpKTsKLSAgICBjb25zdCB1aW50MzJfdCogYnVmZmVyQ2hhcmFjdGVycyA9IHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPihjaGFyYWN0ZXJzKTsKLQotICAgIHVuc2ln
bmVkIGhhbGZMZW5ndGggPSBsZW5ndGggPj4gMTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
ICE9IGhhbGZMZW5ndGg7ICsraSkgewotICAgICAgICBpZiAoKnN0cmluZ0NoYXJhY3RlcnMrKyAh
PSAqYnVmZmVyQ2hhcmFjdGVycysrKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0K
LQotICAgIGlmIChsZW5ndGggJiAxICYmICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MTZf
dCo+KHN0cmluZ0NoYXJhY3RlcnMpICE9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQxNl90
Kj4oYnVmZmVyQ2hhcmFjdGVycykpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVy
biB0cnVlOwotI2VuZGlmCisgICAgICAgIHJldHVybiBTdHJpbmdJbXBsOjplbXB0eSgpOworICAg
IHJldHVybiB0YWJsZSgpLmFkZChjKTsKIH0KIAotc3RydWN0IFVDaGFyQnVmZmVyVHJhbnNsYXRv
ciB7Ci0gICAgc3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3QgVUNoYXJCdWZmZXImIGJ1ZikKLSAg
ICB7Ci0gICAgICAgIHJldHVybiBTdHJpbmdJbXBsOjpjb21wdXRlSGFzaChidWYucywgYnVmLmxl
bmd0aCk7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2wgZXF1YWwoU3RyaW5nSW1wbCogY29uc3Qm
IHN0ciwgY29uc3QgVUNoYXJCdWZmZXImIGJ1ZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBXZWJD
b3JlOjplcXVhbChzdHIsIGJ1Zi5zLCBidWYubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMg
dm9pZCB0cmFuc2xhdGUoU3RyaW5nSW1wbComIGxvY2F0aW9uLCBjb25zdCBVQ2hhckJ1ZmZlciYg
YnVmLCB1bnNpZ25lZCBoYXNoKQotICAgIHsKLSAgICAgICAgbG9jYXRpb24gPSBTdHJpbmdJbXBs
OjpjcmVhdGUoYnVmLnMsIGJ1Zi5sZW5ndGgpLnJlbGVhc2VSZWYoKTsgCi0gICAgICAgIGxvY2F0
aW9uLT5zZXRIYXNoKGhhc2gpOwotICAgICAgICBsb2NhdGlvbi0+c2V0SW5UYWJsZSgpOwotICAg
IH0KLX07Ci0KLXN0cnVjdCBIYXNoQW5kQ2hhcmFjdGVycyB7Ci0gICAgdW5zaWduZWQgaGFzaDsK
LSAgICBjb25zdCBVQ2hhciogY2hhcmFjdGVyczsKLSAgICB1bnNpZ25lZCBsZW5ndGg7Ci19Owot
Ci1zdHJ1Y3QgSGFzaEFuZENoYXJhY3RlcnNUcmFuc2xhdG9yIHsKLSAgICBzdGF0aWMgdW5zaWdu
ZWQgaGFzaChjb25zdCBIYXNoQW5kQ2hhcmFjdGVycyYgYnVmZmVyKQotICAgIHsKLSAgICAgICAg
QVNTRVJUKGJ1ZmZlci5oYXNoID09IFN0cmluZ0ltcGw6OmNvbXB1dGVIYXNoKGJ1ZmZlci5jaGFy
YWN0ZXJzLCBidWZmZXIubGVuZ3RoKSk7Ci0gICAgICAgIHJldHVybiBidWZmZXIuaGFzaDsKLSAg
ICB9Ci0KLSAgICBzdGF0aWMgYm9vbCBlcXVhbChTdHJpbmdJbXBsKiBjb25zdCYgc3RyaW5nLCBj
b25zdCBIYXNoQW5kQ2hhcmFjdGVycyYgYnVmZmVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFdl
YkNvcmU6OmVxdWFsKHN0cmluZywgYnVmZmVyLmNoYXJhY3RlcnMsIGJ1ZmZlci5sZW5ndGgpOwot
ICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHRyYW5zbGF0ZShTdHJpbmdJbXBsKiYgbG9jYXRpb24s
IGNvbnN0IEhhc2hBbmRDaGFyYWN0ZXJzJiBidWZmZXIsIHVuc2lnbmVkIGhhc2gpCi0gICAgewot
ICAgICAgICBsb2NhdGlvbiA9IFN0cmluZ0ltcGw6OmNyZWF0ZShidWZmZXIuY2hhcmFjdGVycywg
YnVmZmVyLmxlbmd0aCkucmVsZWFzZVJlZigpOwotICAgICAgICBsb2NhdGlvbi0+c2V0SGFzaCho
YXNoKTsKLSAgICAgICAgbG9jYXRpb24tPnNldEluVGFibGUoKTsKLSAgICB9Ci19OwotCiBQYXNz
UmVmUHRyPFN0cmluZ0ltcGw+IEF0b21pY1N0cmluZzo6YWRkKGNvbnN0IFVDaGFyKiBzLCB1bnNp
Z25lZCBsZW5ndGgpCiB7CiAgICAgaWYgKCFzKQpAQCAtMjA5LDEyICs2Nyw3IEBAIFBhc3NSZWZQ
dHI8U3RyaW5nSW1wbD4gQXRvbWljU3RyaW5nOjphZGQKICAgICBpZiAobGVuZ3RoID09IDApCiAg
ICAgICAgIHJldHVybiBTdHJpbmdJbXBsOjplbXB0eSgpOwogICAgIAotICAgIFVDaGFyQnVmZmVy
IGJ1ZiA9IHsgcywgbGVuZ3RoIH07IAotICAgIHBhaXI8SGFzaFNldDxTdHJpbmdJbXBsKj46Oml0
ZXJhdG9yLCBib29sPiBhZGRSZXN1bHQgPSBzdHJpbmdUYWJsZSgpLmFkZDxVQ2hhckJ1ZmZlciwg
VUNoYXJCdWZmZXJUcmFuc2xhdG9yPihidWYpOwotCi0gICAgLy8gSWYgdGhlIHN0cmluZyBpcyBu
ZXdseS10cmFuc2xhdGVkLCB0aGVuIHdlIG5lZWQgdG8gYWRvcHQgaXQuCi0gICAgLy8gVGhlIGJv
b2xlYW4gaW4gdGhlIHBhaXIgdGVsbHMgdXMgaWYgdGhhdCBpcyBzby4KLSAgICByZXR1cm4gYWRk
UmVzdWx0LnNlY29uZCA/IGFkb3B0UmVmKCphZGRSZXN1bHQuZmlyc3QpIDogKmFkZFJlc3VsdC5m
aXJzdDsKKyAgICByZXR1cm4gdGFibGUoKS5hZGQocywgbGVuZ3RoKTsKIH0KIAogUGFzc1JlZlB0
cjxTdHJpbmdJbXBsPiBBdG9taWNTdHJpbmc6OmFkZChjb25zdCBVQ2hhciogcywgdW5zaWduZWQg
bGVuZ3RoLCB1bnNpZ25lZCBleGlzdGluZ0hhc2gpCkBAIC0yMjQsMTIgKzc3LDggQEAgUGFzc1Jl
ZlB0cjxTdHJpbmdJbXBsPiBBdG9taWNTdHJpbmc6OmFkZAogCiAgICAgaWYgKGxlbmd0aCA9PSAw
KQogICAgICAgICByZXR1cm4gU3RyaW5nSW1wbDo6ZW1wdHkoKTsKLSAgICAKLSAgICBIYXNoQW5k
Q2hhcmFjdGVycyBidWZmZXIgPSB7IGV4aXN0aW5nSGFzaCwgcywgbGVuZ3RoIH07IAotICAgIHBh
aXI8SGFzaFNldDxTdHJpbmdJbXBsKj46Oml0ZXJhdG9yLCBib29sPiBhZGRSZXN1bHQgPSBzdHJp
bmdUYWJsZSgpLmFkZDxIYXNoQW5kQ2hhcmFjdGVycywgSGFzaEFuZENoYXJhY3RlcnNUcmFuc2xh
dG9yPihidWZmZXIpOwotICAgIGlmICghYWRkUmVzdWx0LnNlY29uZCkKLSAgICAgICAgcmV0dXJu
ICphZGRSZXN1bHQuZmlyc3Q7Ci0gICAgcmV0dXJuIGFkb3B0UmVmKCphZGRSZXN1bHQuZmlyc3Qp
OworCisgICAgcmV0dXJuIHRhYmxlKCkuYWRkKHMsIGxlbmd0aCwgZXhpc3RpbmdIYXNoKTsKIH0K
IAogUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBBdG9taWNTdHJpbmc6OmFkZChjb25zdCBVQ2hhciog
cykKQEAgLTIzNywzMyArODYsMjUgQEAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBBdG9taWNTdHJp
bmc6OmFkZAogICAgIGlmICghcykKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBpbnQgbGVuZ3Ro
ID0gMDsKKyAgICB1bnNpZ25lZCBsZW5ndGggPSAwOwogICAgIHdoaWxlIChzW2xlbmd0aF0gIT0g
VUNoYXIoMCkpCiAgICAgICAgIGxlbmd0aCsrOwogCiAgICAgaWYgKGxlbmd0aCA9PSAwKQogICAg
ICAgICByZXR1cm4gU3RyaW5nSW1wbDo6ZW1wdHkoKTsKIAotICAgIFVDaGFyQnVmZmVyIGJ1ZiA9
IHtzLCBsZW5ndGh9OyAKLSAgICBwYWlyPEhhc2hTZXQ8U3RyaW5nSW1wbCo+OjppdGVyYXRvciwg
Ym9vbD4gYWRkUmVzdWx0ID0gc3RyaW5nVGFibGUoKS5hZGQ8VUNoYXJCdWZmZXIsIFVDaGFyQnVm
ZmVyVHJhbnNsYXRvcj4oYnVmKTsKLQotICAgIC8vIElmIHRoZSBzdHJpbmcgaXMgbmV3bHktdHJh
bnNsYXRlZCwgdGhlbiB3ZSBuZWVkIHRvIGFkb3B0IGl0LgotICAgIC8vIFRoZSBib29sZWFuIGlu
IHRoZSBwYWlyIHRlbGxzIHVzIGlmIHRoYXQgaXMgc28uCi0gICAgcmV0dXJuIGFkZFJlc3VsdC5z
ZWNvbmQgPyBhZG9wdFJlZigqYWRkUmVzdWx0LmZpcnN0KSA6ICphZGRSZXN1bHQuZmlyc3Q7Cisg
ICAgcmV0dXJuIHRhYmxlKCkuYWRkKHMsIGxlbmd0aCk7CiB9CiAKIFBhc3NSZWZQdHI8U3RyaW5n
SW1wbD4gQXRvbWljU3RyaW5nOjphZGQoU3RyaW5nSW1wbCogcikKIHsKLSAgICBpZiAoIXIgfHwg
ci0+aW5UYWJsZSgpKQorICAgIGlmICghciB8fCByLT5pc0F0b21pYygpKQogICAgICAgICByZXR1
cm4gcjsKIAotICAgIGlmIChyLT5sZW5ndGgoKSA9PSAwKQotICAgICAgICByZXR1cm4gU3RyaW5n
SW1wbDo6ZW1wdHkoKTsKKyAgICAvLyBUaGUgc2luZ2xldG9uIGVtcHR5IHN0cmluZyBpcyBhdG9t
aWMuCisgICAgQVNTRVJUKHItPmxlbmd0aCgpKTsKICAgICAKLSAgICBTdHJpbmdJbXBsKiByZXN1
bHQgPSAqc3RyaW5nVGFibGUoKS5hZGQocikuZmlyc3Q7Ci0gICAgaWYgKHJlc3VsdCA9PSByKQot
ICAgICAgICByLT5zZXRJblRhYmxlKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4g
dGFibGUoKS5hZGQocik7CiB9CiAKIEF0b21pY1N0cmluZ0ltcGwqIEF0b21pY1N0cmluZzo6Zmlu
ZChjb25zdCBVQ2hhciogcywgdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBleGlzdGluZ0hhc2gp
CkBAIC0yNzMsMTcgKzExNCwxMyBAQCBBdG9taWNTdHJpbmdJbXBsKiBBdG9taWNTdHJpbmc6OmZp
bmQoY29uCiAKICAgICBpZiAobGVuZ3RoID09IDApCiAgICAgICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxBdG9taWNTdHJpbmdJbXBsKj4oU3RyaW5nSW1wbDo6ZW1wdHkoKSk7Ci0KLSAgICBIYXNoQW5k
Q2hhcmFjdGVycyBidWZmZXIgPSB7IGV4aXN0aW5nSGFzaCwgcywgbGVuZ3RoIH07IAotICAgIEhh
c2hTZXQ8U3RyaW5nSW1wbCo+OjppdGVyYXRvciBpdGVyYXRvciA9IHN0cmluZ1RhYmxlKCkuZmlu
ZDxIYXNoQW5kQ2hhcmFjdGVycywgSGFzaEFuZENoYXJhY3RlcnNUcmFuc2xhdG9yPihidWZmZXIp
OwotICAgIGlmIChpdGVyYXRvciA9PSBzdHJpbmdUYWJsZSgpLmVuZCgpKQotICAgICAgICByZXR1
cm4gMDsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QXRvbWljU3RyaW5nSW1wbCo+KCppdGVyYXRv
cik7CisgICAgCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEF0b21pY1N0cmluZ0ltcGwqPih0YWJs
ZSgpLmZpbmQocywgbGVuZ3RoLCBleGlzdGluZ0hhc2gpKTsKIH0KIAogdm9pZCBBdG9taWNTdHJp
bmc6OnJlbW92ZShTdHJpbmdJbXBsKiByKQogewotICAgIHN0cmluZ1RhYmxlKCkucmVtb3ZlKHIp
OworICAgIHRhYmxlKCkucmVtb3ZlKHIpOwogfQogICAgIAogQXRvbWljU3RyaW5nIEF0b21pY1N0
cmluZzo6bG93ZXIoKSBjb25zdApJbmRleDogSmF2YVNjcmlwdENvcmUvd3RmL3RleHQvQXRvbWlj
U3RyaW5nVGFibGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvdGV4dC9BdG9t
aWNTdHJpbmdUYWJsZS5oCShyZXZpc2lvbiAwKQorKysgSmF2YVNjcmlwdENvcmUvd3RmL3RleHQv
QXRvbWljU3RyaW5nVGFibGUuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyNTYgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBBdG9taWNT
dHJpbmdUYWJsZV9oCisjZGVmaW5lIEF0b21pY1N0cmluZ1RhYmxlX2gKKworI2luY2x1ZGUgPHd0
Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KKyNpbmNsdWRlIDx3dGYvdGV4
dC9TdHJpbmdJbXBsLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nSGFzaC5oPgorCituYW1l
c3BhY2UgV1RGIHsKKworc3RydWN0IENTdHJpbmdUcmFuc2xhdG9yIHsKKyAgICBzdGF0aWMgdW5z
aWduZWQgaGFzaChjb25zdCBjaGFyKiBjKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZ0lt
cGw6OmNvbXB1dGVIYXNoKGMpOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGVxdWFsKFN0cmlu
Z0ltcGwqIHIsIGNvbnN0IGNoYXIqIHMpCisgICAgeworICAgICAgICBBU1NFUlQocik7CisgICAg
ICAgIEFTU0VSVChzKTsKKyAgICAgICAgaW50IGxlbmd0aCA9IHItPmxlbmd0aCgpOworICAgICAg
ICBjb25zdCBVQ2hhciogZCA9IHItPmNoYXJhY3RlcnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9
IDA7IGkgIT0gbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IHNb
aV07CisgICAgICAgICAgICBpZiAoZFtpXSAhPSBjKQorICAgICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc1tsZW5ndGhdID09IDA7CisgICAgfQor
CisgICAgc3RhdGljIHZvaWQgdHJhbnNsYXRlKFN0cmluZ0ltcGwqJiBsb2NhdGlvbiwgY29uc3Qg
Y2hhciogY29uc3QmIGMsIHVuc2lnbmVkIGhhc2gpCisgICAgeworICAgICAgICBsb2NhdGlvbiA9
IFN0cmluZ0ltcGw6OmNyZWF0ZShjKS5yZWxlYXNlUmVmKCk7IAorICAgICAgICBsb2NhdGlvbi0+
c2V0SGFzaChoYXNoKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgVUNoYXJCdWZmZXIgeworICAgIGNv
bnN0IFVDaGFyKiBzOworICAgIHVuc2lnbmVkIGludCBsZW5ndGg7Cit9OworCitzdHJ1Y3QgVUNo
YXJCdWZmZXJUcmFuc2xhdG9yIHsKKyAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBVQ2hh
ckJ1ZmZlciYgYnVmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZ0ltcGw6OmNvbXB1dGVI
YXNoKGJ1Zi5zLCBidWYubGVuZ3RoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBlcXVhbChT
dHJpbmdJbXBsKiBzdHIsIGNvbnN0IFVDaGFyQnVmZmVyJiBidWYpCisgICAgeworICAgICAgICBy
ZXR1cm4gOjplcXVhbChzdHIsIGJ1Zi5zLCBidWYubGVuZ3RoKTsKKyAgICB9CisKKyAgICBzdGF0
aWMgdm9pZCB0cmFuc2xhdGUoU3RyaW5nSW1wbComIGxvY2F0aW9uLCBjb25zdCBVQ2hhckJ1ZmZl
ciYgYnVmLCB1bnNpZ25lZCBoYXNoKQorICAgIHsKKyAgICAgICAgbG9jYXRpb24gPSBTdHJpbmdJ
bXBsOjpjcmVhdGUoYnVmLnMsIGJ1Zi5sZW5ndGgpLnJlbGVhc2VSZWYoKTsgCisgICAgICAgIGxv
Y2F0aW9uLT5zZXRIYXNoKGhhc2gpOworICAgIH0KK307CisKK3N0cnVjdCBIYXNoQW5kQ2hhcmFj
dGVycyB7CisgICAgdW5zaWduZWQgaGFzaDsKKyAgICBjb25zdCBVQ2hhciogY2hhcmFjdGVyczsK
KyAgICB1bnNpZ25lZCBsZW5ndGg7Cit9OworCitzdHJ1Y3QgSGFzaEFuZENoYXJhY3RlcnNUcmFu
c2xhdG9yIHsKKyAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBIYXNoQW5kQ2hhcmFjdGVy
cyYgYnVmZmVyKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGJ1ZmZlci5oYXNoID09IFN0cmluZ0lt
cGw6OmNvbXB1dGVIYXNoKGJ1ZmZlci5jaGFyYWN0ZXJzLCBidWZmZXIubGVuZ3RoKSk7CisgICAg
ICAgIHJldHVybiBidWZmZXIuaGFzaDsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBlcXVhbChT
dHJpbmdJbXBsKiBjb25zdCYgc3RyaW5nLCBjb25zdCBIYXNoQW5kQ2hhcmFjdGVycyYgYnVmZmVy
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIFdlYkNvcmU6OmVxdWFsKHN0cmluZywgYnVmZmVyLmNo
YXJhY3RlcnMsIGJ1ZmZlci5sZW5ndGgpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHRyYW5z
bGF0ZShTdHJpbmdJbXBsKiYgbG9jYXRpb24sIGNvbnN0IEhhc2hBbmRDaGFyYWN0ZXJzJiBidWZm
ZXIsIHVuc2lnbmVkIGhhc2gpCisgICAgeworICAgICAgICBsb2NhdGlvbiA9IFN0cmluZ0ltcGw6
OmNyZWF0ZShidWZmZXIuY2hhcmFjdGVycywgYnVmZmVyLmxlbmd0aCkucmVsZWFzZVJlZigpOwor
ICAgICAgICBsb2NhdGlvbi0+c2V0SGFzaChoYXNoKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTxi
b29sIGlzSWRlbnRpZmVyVGFibGU+CitjbGFzcyBJZGVudGlmaWVyT3JBdG9taWNTdHJpbmdUYWJs
ZSA6IHB1YmxpYyBGYXN0QWxsb2NCYXNlIHsKK3B1YmxpYzoKKyAgICB+SWRlbnRpZmllck9yQXRv
bWljU3RyaW5nVGFibGUoKTsKKworICAgIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gYWRkKFN0cmlu
Z0ltcGwqIHZhbHVlKTsKKyAgICBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IGFkZChjb25zdCBjaGFy
Kik7CisgICAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBhZGQoY29uc3QgVUNoYXIqLCB1bnNpZ25l
ZCk7CisgICAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBhZGQoY29uc3QgVUNoYXIqLCB1bnNpZ25l
ZCwgdW5zaWduZWQgZXhpc3RpbmdIYXNoKTsKKworICAgIHZvaWQgcmVtb3ZlKFN0cmluZ0ltcGwq
IHIpIHsgbV90YWJsZS5yZW1vdmUocik7IH0KKworICAgIFN0cmluZ0ltcGwqIGZpbmQoY29uc3Qg
VUNoYXIqLCB1bnNpZ25lZCwgdW5zaWduZWQgZXhpc3RpbmdIYXNoKTsKKworcHJpdmF0ZToKKyAg
ICBIYXNoU2V0PFN0cmluZ0ltcGwqPiBtX3RhYmxlOworfTsKKwordGVtcGxhdGU8Ym9vbCBpc0lk
ZW50aWZpZXJUYWJsZT4KK0lkZW50aWZpZXJPckF0b21pY1N0cmluZ1RhYmxlPGlzSWRlbnRpZmll
clRhYmxlPjo6fklkZW50aWZpZXJPckF0b21pY1N0cmluZ1RhYmxlKCkKK3sKKyAgICBIYXNoU2V0
PFN0cmluZ0ltcGwqPjo6aXRlcmF0b3IgZW5kID0gbV90YWJsZS5lbmQoKTsKKyAgICBmb3IgKEhh
c2hTZXQ8U3RyaW5nSW1wbCo+OjppdGVyYXRvciBpdGVyID0gbV90YWJsZS5iZWdpbigpOyBpdGVy
ICE9IGVuZDsgKytpdGVyKSB7CisgICAgICAgIGlmIChpc0lkZW50aWZpZXJUYWJsZSkKKyAgICAg
ICAgICAgICgqaXRlciktPnNldElzSWRlbnRpZmllcihmYWxzZSk7CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgICgqaXRlciktPnNldElzQXRvbWljKGZhbHNlKTsKKyAgICB9Cit9CisKK3RlbXBs
YXRlPGJvb2wgaXNJZGVudGlmaWVyVGFibGU+CitQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IElkZW50
aWZpZXJPckF0b21pY1N0cmluZ1RhYmxlPGlzSWRlbnRpZmllclRhYmxlPjo6YWRkKFN0cmluZ0lt
cGwqIHZhbHVlKQoreworICAgIEFTU0VSVCh2YWx1ZSk7CisgICAgQVNTRVJUKHZhbHVlLT5sZW5n
dGgoKSk7CisKKyAgICBzdGQ6OnBhaXI8SGFzaFNldDxTdHJpbmdJbXBsKj46Oml0ZXJhdG9yLCBi
b29sPiByZXN1bHQgPSBtX3RhYmxlLmFkZCh2YWx1ZSk7CisgICAgU3RyaW5nSW1wbCogaWRlbnRp
ZmllciA9ICpyZXN1bHQuZmlyc3Q7CisKKyAgICBpZiAocmVzdWx0LnNlY29uZCkgeworICAgICAg
ICBpZiAoaXNJZGVudGlmaWVyVGFibGUpCisgICAgICAgICAgICBpZGVudGlmaWVyLT5zZXRJc0lk
ZW50aWZpZXIodHJ1ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlkZW50aWZpZXItPnNl
dElzQXRvbWljKHRydWUpOworICAgIH0KKworICAgIHJldHVybiBpZGVudGlmaWVyOworfQorCit0
ZW1wbGF0ZTxib29sIGlzSWRlbnRpZmllclRhYmxlPgorUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBJ
ZGVudGlmaWVyT3JBdG9taWNTdHJpbmdUYWJsZTxpc0lkZW50aWZpZXJUYWJsZT46OmFkZChjb25z
dCBjaGFyKiBjKQoreworICAgIEFTU0VSVChjKTsKKyAgICBBU1NFUlQoKmMpOworCisgICAgc3Rk
OjpwYWlyPEhhc2hTZXQ8U3RyaW5nSW1wbCo+OjppdGVyYXRvciwgYm9vbD4gcmVzdWx0ID0gbV90
YWJsZS5hZGQ8Y29uc3QgY2hhciosIENTdHJpbmdUcmFuc2xhdG9yPihjKTsKKyAgICBTdHJpbmdJ
bXBsKiBpZGVudGlmaWVyID0gKnJlc3VsdC5maXJzdDsKKworICAgIC8vIElmIHRoZSBzdHJpbmcg
aXMgbmV3bHktdHJhbnNsYXRlZCwgdGhlbiB3ZSBuZWVkIHRvIGFkb3B0IGl0LgorICAgIC8vIFRo
ZSBib29sZWFuIGluIHRoZSBwYWlyIHRlbGxzIHVzIGlmIHRoYXQgaXMgc28uCisgICAgaWYgKHJl
c3VsdC5zZWNvbmQpIHsKKyAgICAgICAgaWYgKGlzSWRlbnRpZmllclRhYmxlKQorICAgICAgICAg
ICAgaWRlbnRpZmllci0+c2V0SXNJZGVudGlmaWVyKHRydWUpOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICBpZGVudGlmaWVyLT5zZXRJc0F0b21pYyh0cnVlKTsKKyAgICAgICAgcmV0dXJuIGFk
b3B0UmVmKGlkZW50aWZpZXIpOworICAgIH0KKworICAgIHJldHVybiBpZGVudGlmaWVyOworfQor
Cit0ZW1wbGF0ZTxib29sIGlzSWRlbnRpZmllclRhYmxlPgorUGFzc1JlZlB0cjxTdHJpbmdJbXBs
PiBJZGVudGlmaWVyT3JBdG9taWNTdHJpbmdUYWJsZTxpc0lkZW50aWZpZXJUYWJsZT46OmFkZChj
b25zdCBVQ2hhciogcywgdW5zaWduZWQgbGVuZ3RoKQoreworICAgIEFTU0VSVChzKTsKKyAgICBB
U1NFUlQobGVuZ3RoKTsKKworICAgIFVDaGFyQnVmZmVyIGJ1ZiA9IHtzLCBsZW5ndGh9OworICAg
IHN0ZDo6cGFpcjxIYXNoU2V0PFN0cmluZ0ltcGwqPjo6aXRlcmF0b3IsIGJvb2w+IHJlc3VsdCA9
IG1fdGFibGUuYWRkPFVDaGFyQnVmZmVyLCBVQ2hhckJ1ZmZlclRyYW5zbGF0b3I+KGJ1Zik7Cisg
ICAgU3RyaW5nSW1wbCogaWRlbnRpZmllciA9ICpyZXN1bHQuZmlyc3Q7CisKKyAgICAvLyBJZiB0
aGUgc3RyaW5nIGlzIG5ld2x5LXRyYW5zbGF0ZWQsIHRoZW4gd2UgbmVlZCB0byBhZG9wdCBpdC4K
KyAgICAvLyBUaGUgYm9vbGVhbiBpbiB0aGUgcGFpciB0ZWxscyB1cyBpZiB0aGF0IGlzIHNvLgor
ICAgIGlmIChyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgIGlmIChpc0lkZW50aWZpZXJUYWJsZSkK
KyAgICAgICAgICAgIGlkZW50aWZpZXItPnNldElzSWRlbnRpZmllcih0cnVlKTsKKyAgICAgICAg
ZWxzZQorICAgICAgICAgICAgaWRlbnRpZmllci0+c2V0SXNBdG9taWModHJ1ZSk7CisgICAgICAg
IHJldHVybiBhZG9wdFJlZihpZGVudGlmaWVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gaWRlbnRp
ZmllcjsKK30KKwordGVtcGxhdGU8Ym9vbCBpc0lkZW50aWZpZXJUYWJsZT4KK1Bhc3NSZWZQdHI8
U3RyaW5nSW1wbD4gSWRlbnRpZmllck9yQXRvbWljU3RyaW5nVGFibGU8aXNJZGVudGlmaWVyVGFi
bGU+OjphZGQoY29uc3QgVUNoYXIqIHMsIHVuc2lnbmVkIGxlbmd0aCwgdW5zaWduZWQgZXhpc3Rp
bmdIYXNoKQoreworICAgIEFTU0VSVChzKTsKKyAgICBBU1NFUlQobGVuZ3RoKTsKKyAgICBBU1NF
UlQoZXhpc3RpbmdIYXNoKTsKKworICAgIEhhc2hBbmRDaGFyYWN0ZXJzIGJ1ZmZlciA9IHsgZXhp
c3RpbmdIYXNoLCBzLCBsZW5ndGggfTsgCisgICAgc3RkOjpwYWlyPEhhc2hTZXQ8U3RyaW5nSW1w
bCo+OjppdGVyYXRvciwgYm9vbD4gcmVzdWx0ID0gbV90YWJsZS5hZGQ8SGFzaEFuZENoYXJhY3Rl
cnMsIEhhc2hBbmRDaGFyYWN0ZXJzVHJhbnNsYXRvcj4oYnVmZmVyKTsKKyAgICBTdHJpbmdJbXBs
KiBpZGVudGlmaWVyID0gKnJlc3VsdC5maXJzdDsKKworICAgIC8vIElmIHRoZSBzdHJpbmcgaXMg
bmV3bHktdHJhbnNsYXRlZCwgdGhlbiB3ZSBuZWVkIHRvIGFkb3B0IGl0LgorICAgIC8vIFRoZSBi
b29sZWFuIGluIHRoZSBwYWlyIHRlbGxzIHVzIGlmIHRoYXQgaXMgc28uCisgICAgaWYgKHJlc3Vs
dC5zZWNvbmQpIHsKKyAgICAgICAgaWYgKGlzSWRlbnRpZmllclRhYmxlKQorICAgICAgICAgICAg
aWRlbnRpZmllci0+c2V0SXNJZGVudGlmaWVyKHRydWUpOworICAgICAgICBlbHNlCisgICAgICAg
ICAgICBpZGVudGlmaWVyLT5zZXRJc0F0b21pYyh0cnVlKTsKKyAgICAgICAgcmV0dXJuIGFkb3B0
UmVmKGlkZW50aWZpZXIpOworICAgIH0KKworICAgIHJldHVybiBpZGVudGlmaWVyOworfQorCit0
ZW1wbGF0ZTxib29sIGlzSWRlbnRpZmllclRhYmxlPgorU3RyaW5nSW1wbCogSWRlbnRpZmllck9y
QXRvbWljU3RyaW5nVGFibGU8aXNJZGVudGlmaWVyVGFibGU+OjpmaW5kKGNvbnN0IFVDaGFyKiBz
ICwgdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBleGlzdGluZ0hhc2gpCit7CisgICAgQVNTRVJU
KHMpOworICAgIEFTU0VSVChsZW5ndGgpOworICAgIEFTU0VSVChleGlzdGluZ0hhc2gpOworCisg
ICAgSGFzaEFuZENoYXJhY3RlcnMgYnVmZmVyID0geyBleGlzdGluZ0hhc2gsIHMsIGxlbmd0aCB9
OyAKKyAgICBIYXNoU2V0PFN0cmluZ0ltcGwqPjo6aXRlcmF0b3IgaXRlcmF0b3IgPSBtX3RhYmxl
LmZpbmQ8SGFzaEFuZENoYXJhY3RlcnMsIEhhc2hBbmRDaGFyYWN0ZXJzVHJhbnNsYXRvcj4oYnVm
ZmVyKTsKKyAgICBpZiAoaXRlcmF0b3IgPT0gbV90YWJsZS5lbmQoKSkKKyAgICAgICAgcmV0dXJu
IDA7CisgICAgcmV0dXJuICppdGVyYXRvcjsKK30KKworfQorCisjaWYgVVNFKEpTQykKKy8vIEZJ
WE1FOiBUaGlzIGlzIGEgdGVtcG9yYXJ5IGxheWVyaW5nIHZpb2xhdGlvbiB3aGlsZSB3ZSBtb3Zl
IG1vcmUgc3RyaW5nIGNvZGUgdG8gV1RGLgorbmFtZXNwYWNlIEpTQyB7CitjbGFzcyBJZGVudGlm
aWVyVGFibGUgOiBwdWJsaWMgV1RGOjpJZGVudGlmaWVyT3JBdG9taWNTdHJpbmdUYWJsZTx0cnVl
PiB7fTsKK30KKyNlbmRpZgorCisvLyBGSVhNRTogVGhpcyBpcyBhIHRlbXBvcmFyeSBsYXllcmlu
ZyB2aW9sYXRpb24gd2hpbGUgd2UgbW92ZSBtb3JlIHN0cmluZyBjb2RlIHRvIFdURi4KK25hbWVz
cGFjZSBXZWJDb3JlIHsKK2NsYXNzIEF0b21pY1N0cmluZ1RhYmxlIDogcHVibGljIFdURjo6SWRl
bnRpZmllck9yQXRvbWljU3RyaW5nVGFibGU8ZmFsc2U+IHt9OworfQorI2VuZGlmIC8vIEF0b21p
Y1N0cmluZ1RhYmxlX2gKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi90ZXh0L1N0cmluZ0ltcGwu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3d0Zi90ZXh0L1N0cmluZ0ltcGwuY3Bw
CShyZXZpc2lvbiA1ODAyOCkKKysrIEphdmFTY3JpcHRDb3JlL3d0Zi90ZXh0L1N0cmluZ0ltcGwu
Y3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSAiU3RyaW5nSGFz
aC5oIgogI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KICNpbmNsdWRlIDx3dGYvV1RGVGhy
ZWFkRGF0YS5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0F0b21pY1N0cmluZ1RhYmxlLmg+CiAKIHVz
aW5nIG5hbWVzcGFjZSBXVEY7CiB1c2luZyBuYW1lc3BhY2UgVW5pY29kZTsKQEAgLTQyLDcgKzQz
LDcgQEAgU3RyaW5nSW1wbDo6flN0cmluZ0ltcGwoKQogewogICAgIEFTU0VSVCghaXNTdGF0aWMo
KSk7CiAKLSAgICBpZiAoaW5UYWJsZSgpKQorICAgIGlmIChpc0F0b21pYygpKQogICAgICAgICBB
dG9taWNTdHJpbmc6OnJlbW92ZSh0aGlzKTsKICNpZiBVU0UoSlNDKQogICAgIGlmIChpc0lkZW50
aWZpZXIoKSkKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi90ZXh0L1N0cmluZ0ltcGwuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvdGV4dC9TdHJpbmdJbXBsLmgJKHJldmlzaW9u
IDU4MDI4KQorKysgSmF2YVNjcmlwdENvcmUvd3RmL3RleHQvU3RyaW5nSW1wbC5oCSh3b3JraW5n
IGNvcHkpCkBAIC00MiwxMCArNDIsMTEgQEAgdHlwZWRlZiBjb25zdCBzdHJ1Y3QgX19DRlN0cmlu
ZyAqIENGU3RyaQogCiAvLyBGSVhNRTogVGhpcyBpcyBhIHRlbXBvcmFyeSBsYXllcmluZyB2aW9s
YXRpb24gd2hpbGUgd2UgbW92ZSBzdHJpbmcgY29kZSB0byBXVEYuCiAvLyBMYW5kaW5nIHRoZSBm
aWxlIG1vdmVzIGluIG9uZSBwYXRjaCwgd2lsbCBmb2xsb3cgb24gd2l0aCBwYXRjaGVzIHRvIGNo
YW5nZSB0aGUgbmFtZXNwYWNlcy4KLW5hbWVzcGFjZSBKU0MgeworbmFtZXNwYWNlIFdURiB7CiAK
LXN0cnVjdCBJZGVudGlmaWVyQ1N0cmluZ1RyYW5zbGF0b3I7Ci1zdHJ1Y3QgSWRlbnRpZmllclVD
aGFyQnVmZmVyVHJhbnNsYXRvcjsKK3N0cnVjdCBDU3RyaW5nVHJhbnNsYXRvcjsKK3N0cnVjdCBV
Q2hhckJ1ZmZlclRyYW5zbGF0b3I7CitzdHJ1Y3QgSGFzaEFuZENoYXJhY3RlcnNUcmFuc2xhdG9y
OwogCiB9CiAKQEAgLTU1LDEwICs1Niw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xhc3Mg
U3RyaW5nQnVmZmVyOwogCi1zdHJ1Y3QgQ1N0cmluZ1RyYW5zbGF0b3I7Ci1zdHJ1Y3QgSGFzaEFu
ZENoYXJhY3RlcnNUcmFuc2xhdG9yOwogc3RydWN0IFN0cmluZ0hhc2g7Ci1zdHJ1Y3QgVUNoYXJC
dWZmZXJUcmFuc2xhdG9yOwogCiBlbnVtIFRleHRDYXNlU2Vuc2l0aXZpdHkgeyBUZXh0Q2FzZVNl
bnNpdGl2ZSwgVGV4dENhc2VJbnNlbnNpdGl2ZSB9OwogCkBAIC02NywxMSArNjUsOSBAQCB0eXBl
ZGVmIENyb3NzVGhyZWFkUmVmQ291bnRlZDxTaGFyYWJsZVVDCiB0eXBlZGVmIGJvb2wgKCpDaGFy
YWN0ZXJNYXRjaEZ1bmN0aW9uUHRyKShVQ2hhcik7CiAKIGNsYXNzIFN0cmluZ0ltcGwgOiBwdWJs
aWMgU3RyaW5nSW1wbEJhc2UgewotICAgIGZyaWVuZCBzdHJ1Y3QgSlNDOjpJZGVudGlmaWVyQ1N0
cmluZ1RyYW5zbGF0b3I7Ci0gICAgZnJpZW5kIHN0cnVjdCBKU0M6OklkZW50aWZpZXJVQ2hhckJ1
ZmZlclRyYW5zbGF0b3I7Ci0gICAgZnJpZW5kIHN0cnVjdCBDU3RyaW5nVHJhbnNsYXRvcjsKLSAg
ICBmcmllbmQgc3RydWN0IEhhc2hBbmRDaGFyYWN0ZXJzVHJhbnNsYXRvcjsKLSAgICBmcmllbmQg
c3RydWN0IFVDaGFyQnVmZmVyVHJhbnNsYXRvcjsKKyAgICBmcmllbmQgc3RydWN0IFdURjo6Q1N0
cmluZ1RyYW5zbGF0b3I7CisgICAgZnJpZW5kIHN0cnVjdCBXVEY6OlVDaGFyQnVmZmVyVHJhbnNs
YXRvcjsKKyAgICBmcmllbmQgc3RydWN0IFdURjo6SGFzaEFuZENoYXJhY3RlcnNUcmFuc2xhdG9y
OwogcHJpdmF0ZToKICAgICAvLyBVc2VkIHRvIGNvbnN0cnVjdCBzdGF0aWMgc3RyaW5ncywgd2hp
Y2ggaGF2ZSBhbiBzcGVjaWFsIHJlZkNvdW50IHRoYXQgY2FuIG5ldmVyIGhpdCB6ZXJvLgogICAg
IC8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgc3RhdGljIHN0cmluZyB3aWxsIG5ldmVyIGJlIGRlc3Ry
b3llZCwgd2hpY2ggaXMgaW1wb3J0YW50IGJlY2F1c2UKQEAgLTIyMCw4ICsyMTYsMTUgQEAgcHVi
bGljOgogCiAgICAgYm9vbCBoYXNUZXJtaW5hdGluZ051bGxDaGFyYWN0ZXIoKSBjb25zdCB7IHJl
dHVybiBtX3JlZkNvdW50QW5kRmxhZ3MgJiBzX3JlZkNvdW50RmxhZ0hhc1Rlcm1pbmF0aW5nTnVs
bENoYXJhY3RlcjsgfQogCi0gICAgYm9vbCBpblRhYmxlKCkgY29uc3QgeyByZXR1cm4gbV9yZWZD
b3VudEFuZEZsYWdzICYgc19yZWZDb3VudEZsYWdJblRhYmxlOyB9Ci0gICAgdm9pZCBzZXRJblRh
YmxlKCkgeyBtX3JlZkNvdW50QW5kRmxhZ3MgfD0gc19yZWZDb3VudEZsYWdJblRhYmxlOyB9Cisg
ICAgYm9vbCBpc0F0b21pYygpIGNvbnN0IHsgcmV0dXJuIG1fcmVmQ291bnRBbmRGbGFncyAmIHNf
cmVmQ291bnRGbGFnSXNBdG9taWM7IH0KKyAgICB2b2lkIHNldElzQXRvbWljKGJvb2wgaW5UYWJs
ZSkKKyAgICB7CisgICAgICAgIEFTU0VSVCghaXNTdGF0aWMoKSk7CisgICAgICAgIGlmIChpblRh
YmxlKQorICAgICAgICAgICAgbV9yZWZDb3VudEFuZEZsYWdzIHw9IHNfcmVmQ291bnRGbGFnSXNB
dG9taWM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1fcmVmQ291bnRBbmRGbGFncyAmPSBz
X3JlZkNvdW50RmxhZ0lzQXRvbWljOworICAgIH0KIAogICAgIHVuc2lnbmVkIGhhc2goKSBjb25z
dCB7IGlmICghbV9oYXNoKSBtX2hhc2ggPSBjb21wdXRlSGFzaChtX2RhdGEsIG1fbGVuZ3RoKTsg
cmV0dXJuIG1faGFzaDsgfQogICAgIHVuc2lnbmVkIGV4aXN0aW5nSGFzaCgpIGNvbnN0IHsgQVNT
RVJUKG1faGFzaCk7IHJldHVybiBtX2hhc2g7IH0KQEAgLTMzMCw2ICszMzMsMzggQEAgcHJpdmF0
ZToKIGJvb2wgZXF1YWwoY29uc3QgU3RyaW5nSW1wbCosIGNvbnN0IFN0cmluZ0ltcGwqKTsKIGJv
b2wgZXF1YWwoY29uc3QgU3RyaW5nSW1wbCosIGNvbnN0IGNoYXIqKTsKIGlubGluZSBib29sIGVx
dWFsKGNvbnN0IGNoYXIqIGEsIFN0cmluZ0ltcGwqIGIpIHsgcmV0dXJuIGVxdWFsKGIsIGEpOyB9
CitpbmxpbmUgYm9vbCBlcXVhbChTdHJpbmdJbXBsKiBzdHJpbmcsIGNvbnN0IFVDaGFyKiBjaGFy
YWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgpCit7CisgICAgaWYgKHN0cmluZy0+bGVuZ3RoKCkgIT0g
bGVuZ3RoKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBGSVhNRTogcGVyaGFwcyB3
ZSBzaG91bGQgaGF2ZSBhIG1vcmUgYWJzdHJhY3QgbWFjcm8gdGhhdCBpbmRpY2F0ZXMgd2hlbgor
ICAgIC8vIGdvaW5nIDQgYnl0ZXMgYXQgYSB0aW1lIGlzIHVuc2FmZQorI2lmIENQVShBUk0pIHx8
IENQVShTSDQpCisgICAgY29uc3QgVUNoYXIqIHN0cmluZ0NoYXJhY3RlcnMgPSBzdHJpbmctPmNo
YXJhY3RlcnMoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IGxlbmd0aDsgKytpKSB7
CisgICAgICAgIGlmICgqc3RyaW5nQ2hhcmFjdGVycysrICE9ICpjaGFyYWN0ZXJzKyspCisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworI2Vsc2UKKyAg
ICAvKiBEbyBpdCA0LWJ5dGVzLWF0LWEtdGltZSBvbiBhcmNoaXRlY3R1cmVzIHdoZXJlIGl0J3Mg
c2FmZSAqLworCisgICAgY29uc3QgdWludDMyX3QqIHN0cmluZ0NoYXJhY3RlcnMgPSByZWludGVy
cHJldF9jYXN0PGNvbnN0IHVpbnQzMl90Kj4oc3RyaW5nLT5jaGFyYWN0ZXJzKCkpOworICAgIGNv
bnN0IHVpbnQzMl90KiBidWZmZXJDaGFyYWN0ZXJzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1
aW50MzJfdCo+KGNoYXJhY3RlcnMpOworCisgICAgdW5zaWduZWQgaGFsZkxlbmd0aCA9IGxlbmd0
aCA+PiAxOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gaGFsZkxlbmd0aDsgKytpKSB7
CisgICAgICAgIGlmICgqc3RyaW5nQ2hhcmFjdGVycysrICE9ICpidWZmZXJDaGFyYWN0ZXJzKysp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGxlbmd0aCAmIDEg
JiYgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQxNl90Kj4oc3RyaW5nQ2hhcmFjdGVycykg
IT0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDE2X3QqPihidWZmZXJDaGFyYWN0ZXJzKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7CisjZW5kaWYKK30KIAog
Ym9vbCBlcXVhbElnbm9yaW5nQ2FzZShTdHJpbmdJbXBsKiwgU3RyaW5nSW1wbCopOwogYm9vbCBl
cXVhbElnbm9yaW5nQ2FzZShTdHJpbmdJbXBsKiwgY29uc3QgY2hhciopOwpAQCAtMzcyLDYgKzQw
Nyw3IEBAIGlubGluZSBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IFN0cmluZ0ltcGwKIH0KIAogdXNp
bmcgV2ViQ29yZTo6ZXF1YWw7Cit1c2luZyBXZWJDb3JlOjpTdHJpbmdJbXBsOwogCiBuYW1lc3Bh
Y2UgV1RGIHsKIApJbmRleDogSmF2YVNjcmlwdENvcmUvd3RmL3RleHQvU3RyaW5nSW1wbEJhc2Uu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvdGV4dC9TdHJpbmdJbXBsQmFzZS5o
CShyZXZpc2lvbiA1ODAyOCkKKysrIEphdmFTY3JpcHRDb3JlL3d0Zi90ZXh0L1N0cmluZ0ltcGxC
YXNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTYwLDcgKzYwLDcgQEAgcHJvdGVjdGVkOgogCiAgICAg
ZW51bSBTdGF0aWNTdHJpbmdDb25zdHJ1Y3RUeXBlIHsgQ29uc3RydWN0U3RhdGljU3RyaW5nIH07
CiAgICAgU3RyaW5nSW1wbEJhc2UodW5zaWduZWQgbGVuZ3RoLCBTdGF0aWNTdHJpbmdDb25zdHJ1
Y3RUeXBlKQotICAgICAgICA6IG1fcmVmQ291bnRBbmRGbGFncyhzX3JlZkNvdW50RmxhZ1N0YXRp
YyB8IHNfcmVmQ291bnRGbGFnSXNJZGVudGlmaWVyIHwgQnVmZmVyT3duZWQpCisgICAgICAgIDog
bV9yZWZDb3VudEFuZEZsYWdzKHNfcmVmQ291bnRGbGFnU3RhdGljIHwgc19yZWZDb3VudEZsYWdJ
c0F0b21pYyB8IHNfcmVmQ291bnRGbGFnSXNJZGVudGlmaWVyIHwgQnVmZmVyT3duZWQpCiAgICAg
ICAgICwgbV9sZW5ndGgobGVuZ3RoKQogICAgIHsKICAgICAgICAgQVNTRVJUKGlzU3RyaW5nSW1w
bCgpKTsKQEAgLTgzLDcgKzgzLDcgQEAgcHJvdGVjdGVkOgogICAgIHN0YXRpYyBjb25zdCB1bnNp
Z25lZCBzX3JlZkNvdW50SW5jcmVtZW50ID0gMHg4MDsKICAgICBzdGF0aWMgY29uc3QgdW5zaWdu
ZWQgc19yZWZDb3VudEZsYWdTdGF0aWMgPSAweDQwOwogICAgIHN0YXRpYyBjb25zdCB1bnNpZ25l
ZCBzX3JlZkNvdW50RmxhZ0hhc1Rlcm1pbmF0aW5nTnVsbENoYXJhY3RlciA9IDB4MjA7Ci0gICAg
c3RhdGljIGNvbnN0IHVuc2lnbmVkIHNfcmVmQ291bnRGbGFnSW5UYWJsZSA9IDB4MTA7CisgICAg
c3RhdGljIGNvbnN0IHVuc2lnbmVkIHNfcmVmQ291bnRGbGFnSXNBdG9taWMgPSAweDEwOwogICAg
IHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzX3JlZkNvdW50RmxhZ1Nob3VsZFJlcG9ydGVkQ29zdCA9
IDB4ODsKICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc19yZWZDb3VudEZsYWdJc0lkZW50aWZp
ZXIgPSAweDQ7CiAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNfcmVmQ291bnRNYXNrQnVmZmVy
T3duZXJzaGlwID0gMHgzOwo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>54038</attachid>
            <date>2010-04-22 00:47:01 -0700</date>
            <delta_ts>2010-04-22 09:58:45 -0700</delta_ts>
            <desc>Fix review bot issues</desc>
            <filename>patch.mergeidenttables.2.txt</filename>
            <type>text/plain</type>
            <size>42485</size>
            <attacher name="Gavin Barraclough">barraclough</attacher>
            
              <data encoding="base64">SW5kZXg6IEphdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDU4MDY2KQorKysgSmF2YVNjcmlwdENvcmUvQ2hhbmdl
TG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNzAgQEAKKzIwMTAtMDQtMjIgIEdhdmluIEJh
cnJhY2xvdWdoICA8YmFycmFjbG91Z2hAYXBwbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0zNzk3OAorICAgICAgICBVbmlmeSBKU0M6OklkZW50aWZpZXJUYWJsZSBhbmQg
V2ViQ29yZTo6QXRvbWljU3RyaW5nVGFibGUgaW1wbGVtZW50YXRpb25zLgorCisgICAgICAgIFRo
ZXNlIHR3byBjbGFzc2VzIGJvdGggaW1wbGVtZW50IGEgSGFzaFNldCBvZiB1bmlxdWVkIFN0cmlu
Z0ltcGxzLCB3aXRoCisgICAgICAgIHRyYW5zbGF0b3IgY2xhc3NlcyB0byBhdm9pZCB1bm5lY2Vz
c2FyeSBvYmplY3QgY3JlYXRpb24uIFRoZSBvbmx5IGRpZmZlcmVuY2UKKyAgICAgICAgYmV0d2Vl
biB0aGUgY2xhc3NlcyBpcyB3aGljaCBmbGFnIChpc0lkZW50aWZpZXIgb3IgaW5UYWJsZSkgaXMg
c2V0LgorICAgICAgICBDb21iaW5lIHRoZSB0d28gY2xhc3NlcyB1c2luZyBhIHRlbXBsYXRlIHBy
ZWRpY2F0ZWQgb24gd2hpY2ggZmxhZyB0byB1c2UuCisKKyAgICAgICAgTmV3IGNsYXNzIEF0b21p
Y1N0cmluZ1RhYmxlIGNyZWF0ZWQsIGNvbnRhaW5pbmcgYWxsIHRoZSBnb29kbmVzcyBmcm9tCisg
ICAgICAgIElkZW50aWZpZXJUYWJsZSAmIEF0b21pY1N0cmluZ1RhYmxlLCBleHBlY3QgZm9yIElk
ZW50aWZpZXIncyBsaXRlcmFsVGFibGUsCisgICAgICAgIHdoaWNoIGhhcyBiZWVuIG1vdmVkIG9u
dG8gSlNHbG9iYWxEYXRhLiBSZW1vdmVkIGR1cGxpY2F0ZSBzdHJpbmcgdHJhbnNsYXRvcgorICAg
ICAgICBjbGFzc2VzLiBSZW5hbWVkIFN0cmluZ0ltcGwncyBpblRhYmxlIGZsYWcgdG8gbW9yZSBl
eHBsaWNpdCAnaXNBdG9taWMnLAorICAgICAgICBhbmQgc2V0IHRoaXMgb24gdGhlIGVtcHR5IHN0
cmluZyAod2hpY2ggbWF0Y2hlcyBJZGVudGlmaWVyIGJlaGF2aW91ciwgYW5kCisgICAgICAgIHJl
bW92ZXMgYSByZWR1bmRhbnQgY2hlY2sgZm9yIHplcm8tbGVuZ3RoKS4KKworICAgICAgICAqIEdO
VW1ha2VmaWxlLmFtOgorICAgICAgICAqIEphdmFTY3JpcHRDb3JlLmd5cGk6CisgICAgICAgICog
SmF2YVNjcmlwdENvcmUudmNwcm9qL1dURi9XVEYudmNwcm9qOgorICAgICAgICAqIEphdmFTY3Jp
cHRDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2o6CisgICAgICAgICogcnVudGltZS9JZGVu
dGlmaWVyLmNwcDoKKyAgICAgICAgKEpTQzo6Y3JlYXRlTGl0ZXJhbFRhYmxlKToKKyAgICAgICAg
KEpTQzo6ZGVsZXRlTGl0ZXJhbFRhYmxlKToKKyAgICAgICAgKEpTQzo6SWRlbnRpZmllcjo6YWRk
KToKKyAgICAgICAgKEpTQzo6SWRlbnRpZmllcjo6YWRkU2xvd0Nhc2UpOgorICAgICAgICAqIHJ1
bnRpbWUvSWRlbnRpZmllci5oOgorICAgICAgICAqIHJ1bnRpbWUvSlNHbG9iYWxEYXRhLmNwcDoK
KyAgICAgICAgKEpTQzo6SlNHbG9iYWxEYXRhOjpKU0dsb2JhbERhdGEpOgorICAgICAgICAoSlND
OjpKU0dsb2JhbERhdGE6On5KU0dsb2JhbERhdGEpOgorICAgICAgICAqIHJ1bnRpbWUvSlNHbG9i
YWxEYXRhLmg6CisgICAgICAgICogd3RmL1dURlRocmVhZERhdGEuY3BwOgorICAgICAgICAoV1RG
OjpXVEZUaHJlYWREYXRhOjpXVEZUaHJlYWREYXRhKToKKyAgICAgICAgKFdURjo6V1RGVGhyZWFk
RGF0YTo6fldURlRocmVhZERhdGEpOgorICAgICAgICAqIHd0Zi9XVEZUaHJlYWREYXRhLmg6Cisg
ICAgICAgIChXVEY6OldURlRocmVhZERhdGE6OmF0b21pY1N0cmluZ1RhYmxlKToKKyAgICAgICAg
KiB3dGYvdGV4dC9BdG9taWNTdHJpbmcuY3BwOgorICAgICAgICAoV2ViQ29yZTo6dGFibGUpOgor
ICAgICAgICAoV2ViQ29yZTo6b3BlcmF0b3I9PSk6CisgICAgICAgIChXZWJDb3JlOjpBdG9taWNT
dHJpbmc6OmFkZCk6CisgICAgICAgIChXZWJDb3JlOjpBdG9taWNTdHJpbmc6OmZpbmQpOgorICAg
ICAgICAoV2ViQ29yZTo6QXRvbWljU3RyaW5nOjpyZW1vdmUpOgorICAgICAgICAqIHd0Zi90ZXh0
L0F0b21pY1N0cmluZ1RhYmxlLmg6IEFkZGVkLgorICAgICAgICAoV1RGOjpDU3RyaW5nVHJhbnNs
YXRvcjo6aGFzaCk6CisgICAgICAgIChXVEY6OkNTdHJpbmdUcmFuc2xhdG9yOjplcXVhbCk6Cisg
ICAgICAgIChXVEY6OkNTdHJpbmdUcmFuc2xhdG9yOjp0cmFuc2xhdGUpOgorICAgICAgICAoV1RG
OjpVQ2hhckJ1ZmZlclRyYW5zbGF0b3I6Omhhc2gpOgorICAgICAgICAoV1RGOjpVQ2hhckJ1ZmZl
clRyYW5zbGF0b3I6OmVxdWFsKToKKyAgICAgICAgKFdURjo6VUNoYXJCdWZmZXJUcmFuc2xhdG9y
Ojp0cmFuc2xhdGUpOgorICAgICAgICAoV1RGOjpIYXNoQW5kQ2hhcmFjdGVyc1RyYW5zbGF0b3I6
Omhhc2gpOgorICAgICAgICAoV1RGOjpIYXNoQW5kQ2hhcmFjdGVyc1RyYW5zbGF0b3I6OmVxdWFs
KToKKyAgICAgICAgKFdURjo6SGFzaEFuZENoYXJhY3RlcnNUcmFuc2xhdG9yOjp0cmFuc2xhdGUp
OgorICAgICAgICAoV1RGOjpJZGVudGlmaWVyT3JBdG9taWNTdHJpbmdUYWJsZTo6cmVtb3ZlKToK
KyAgICAgICAgKFdURjo6Ojp+SWRlbnRpZmllck9yQXRvbWljU3RyaW5nVGFibGUpOgorICAgICAg
ICAoV1RGOjo6OmFkZCk6CisgICAgICAgIChXVEY6Ojo6ZmluZCk6CisgICAgICAgICogd3RmL3Rl
eHQvU3RyaW5nSW1wbC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpTdHJpbmdJbXBsOjp+U3RyaW5n
SW1wbCk6CisgICAgICAgICogd3RmL3RleHQvU3RyaW5nSW1wbC5oOgorICAgICAgICAoV2ViQ29y
ZTo6U3RyaW5nSW1wbDo6aXNBdG9taWMpOgorICAgICAgICAoV2ViQ29yZTo6U3RyaW5nSW1wbDo6
c2V0SXNBdG9taWMpOgorICAgICAgICAoV2ViQ29yZTo6ZXF1YWwpOgorICAgICAgICAqIHd0Zi90
ZXh0L1N0cmluZ0ltcGxCYXNlLmg6CisgICAgICAgIChXVEY6OlN0cmluZ0ltcGxCYXNlOjpTdHJp
bmdJbXBsQmFzZSk6CisKIDIwMTAtMDQtMjEgIEFuZHkgRXN0ZXMgIDxhZXN0ZXNAYXBwbGUuY29t
PgogCiAgICAgICAgIFJ1YmJlciBzdGFtcGVkIGJ5IE1hcmsgUm93ZS4KSW5kZXg6IEphdmFTY3Jp
cHRDb3JlL0dOVW1ha2VmaWxlLmFtCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL0dOVW1h
a2VmaWxlLmFtCShyZXZpc2lvbiA1ODAyOCkKKysrIEphdmFTY3JpcHRDb3JlL0dOVW1ha2VmaWxl
LmFtCSh3b3JraW5nIGNvcHkpCkBAIC0zMDAsNiArMzAwLDcgQEAgamF2YXNjcmlwdGNvcmVfc291
cmNlcyArPSBcCiAJSmF2YVNjcmlwdENvcmUvd3RmL3RleHQvQXRvbWljU3RyaW5nLmNwcCBcCiAJ
SmF2YVNjcmlwdENvcmUvd3RmL3RleHQvQXRvbWljU3RyaW5nLmggXAogCUphdmFTY3JpcHRDb3Jl
L3d0Zi90ZXh0L0F0b21pY1N0cmluZ0ltcGwuaCBcCisJSmF2YVNjcmlwdENvcmUvd3RmL3RleHQv
QXRvbWljU3RyaW5nVGFibGUuaCBcCiAJSmF2YVNjcmlwdENvcmUvd3RmL3RleHQvQ1N0cmluZy5j
cHAgXAogCUphdmFTY3JpcHRDb3JlL3d0Zi90ZXh0L0NTdHJpbmcuaCBcCiAJSmF2YVNjcmlwdENv
cmUvd3RmL3RleHQvU3RyaW5nSGFzaC5oIFwKSW5kZXg6IEphdmFTY3JpcHRDb3JlL0phdmFTY3Jp
cHRDb3JlLmd5cGkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvSmF2YVNjcmlwdENvcmUu
Z3lwaQkocmV2aXNpb24gNTgwMjgpCisrKyBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS5n
eXBpCSh3b3JraW5nIGNvcHkpCkBAIC00MjIsNiArNDIyLDcgQEAKICAgICAgICAgICAgICd3dGYv
dGV4dC9BdG9taWNTdHJpbmcuY3BwJywKICAgICAgICAgICAgICd3dGYvdGV4dC9BdG9taWNTdHJp
bmcuaCcsCiAgICAgICAgICAgICAnd3RmL3RleHQvQXRvbWljU3RyaW5nSW1wbC5oJywKKyAgICAg
ICAgICAgICd3dGYvdGV4dC9BdG9taWNTdHJpbmdUYWJsZS5oJywKICAgICAgICAgICAgICd3dGYv
dGV4dC9DU3RyaW5nLmNwcCcsCiAgICAgICAgICAgICAnd3RmL3RleHQvQ1N0cmluZy5oJywKICAg
ICAgICAgICAgICd3dGYvdGV4dC9TdHJpbmdIYXNoLmgnLApJbmRleDogSmF2YVNjcmlwdENvcmUv
SmF2YVNjcmlwdENvcmUudmNwcm9qL1dURi9XVEYudmNwcm9qCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIEphdmFT
Y3JpcHRDb3JlL0phdmFTY3JpcHRDb3JlLnZjcHJvai9XVEYvV1RGLnZjcHJvagkocmV2aXNpb24g
NTgwMjgpCisrKyBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS52Y3Byb2ovV1RGL1dURi52
Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAgLTU0OCw2ICs1NDgsMTAgQEAKICAJCQlSZWxhdGl2ZVBh
dGg9Ii4uXC4uXHd0Zlx0ZXh0XEF0b21pY1N0cmluZ0ltcGwuaCINCiAgCQkJPg0KICAJCTwvRmls
ZT4NCisgCQk8RmlsZQ0KKyAJCQlSZWxhdGl2ZVBhdGg9Ii4uXC4uXHd0Zlx0ZXh0XEF0b21pY1N0
cmluZ1RhYmxlLmgiDQorIAkJCT4NCisgCQk8L0ZpbGU+DQogCQk8RmlsZQ0KICAJCQlSZWxhdGl2
ZVBhdGg9Ii4uXC4uXHd0Zlx0ZXh0XENTdHJpbmcuY3BwIg0KICAJCQk+DQpJbmRleDogSmF2YVNj
cmlwdENvcmUvSmF2YVNjcmlwdENvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvago9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9KYXZhU2NyaXB0Q29yZS54Y29kZXByb2ovcHJvamVjdC5w
Ynhwcm9qCShyZXZpc2lvbiA1ODAyOCkKKysrIEphdmFTY3JpcHRDb3JlL0phdmFTY3JpcHRDb3Jl
Lnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oJKHdvcmtpbmcgY29weSkKQEAgLTIxNyw2ICsyMTcs
NyBAQAogCQk4NkI5OUFCOTExN0UzOTFFMDBERjVBOTAgLyogUm9wZUltcGwuaCBpbiBIZWFkZXJz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDg2Qjk5QUI3MTE3RTM5MUUwMERG
NUE5MCAvKiBSb3BlSW1wbC5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUs
ICk7IH07IH07CiAJCTg2Qjk5QUUzMTE3RTU3ODEwMERGNUE5MCAvKiBTdHJpbmdCdWZmZXIuaCBp
biBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDg2Qjk5QUUxMTE3
RTU3ODEwMERGNUE5MCAvKiBTdHJpbmdCdWZmZXIuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRF
UyA9IChQcml2YXRlLCApOyB9OyB9OwogCQk4NkI5OUFFNDExN0U1NzgxMDBERjVBOTAgLyogU3Ry
aW5nSW1wbEJhc2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IDg2Qjk5QUUyMTE3RTU3ODEwMERGNUE5MCAvKiBTdHJpbmdJbXBsQmFzZS5oICovOyBzZXR0
aW5ncyA9IHtBVFRSSUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CisJCTg2Qjk5REE3MTE4MDBG
ODUwMERGNUE5MCAvKiBBdG9taWNTdHJpbmdUYWJsZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0g
UEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODZCOTlEQTYxMTgwMEY4NTAwREY1QTkwIC8qIEF0b21p
Y1N0cmluZ1RhYmxlLmggKi87IHNldHRpbmdzID0ge0FUVFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsg
fTsgfTsKIAkJODZDMzZFRUEwRUUxMjg5RDAwQjNERjU5IC8qIE1hY3JvQXNzZW1ibGVyLmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4NkMzNkVFOTBFRTEy
ODlEMDBCM0RGNTkgLyogTWFjcm9Bc3NlbWJsZXIuaCAqLzsgfTsKIAkJODZDQTAzMkUxMDM4RTg0
NDAwMjhBNjA5IC8qIEV4ZWN1dGFibGUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gODZDQTAzMkQxMDM4RTg0NDAwMjhBNjA5IC8qIEV4ZWN1dGFibGUu
Y3BwICovOyB9OwogCQk4NkNBRkVFMzEwMzVEREU2MDAyOEE2MDkgLyogRXhlY3V0YWJsZS5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODZDQUZFRTIxMDM1
RERFNjAwMjhBNjA5IC8qIEV4ZWN1dGFibGUuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9
ICgpOyB9OyB9OwpAQCAtNzU5LDYgKzc2MCw3IEBACiAJCTg2Qjk5QUI3MTE3RTM5MUUwMERGNUE5
MCAvKiBSb3BlSW1wbC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBSb3BlSW1w
bC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4NkI5OUFFMTExN0U1NzgxMDBERjVB
OTAgLyogU3RyaW5nQnVmZmVyLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVu
Y29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFN0
cmluZ0J1ZmZlci5oOyBwYXRoID0gdGV4dC9TdHJpbmdCdWZmZXIuaDsgc291cmNlVHJlZSA9ICI8
Z3JvdXA+IjsgfTsKIAkJODZCOTlBRTIxMTdFNTc4MTAwREY1QTkwIC8qIFN0cmluZ0ltcGxCYXNl
LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IFN0cmluZ0ltcGxCYXNlLmg7IHBh
dGggPSB0ZXh0L1N0cmluZ0ltcGxCYXNlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJ
CTg2Qjk5REE2MTE4MDBGODUwMERGNUE5MCAvKiBBdG9taWNTdHJpbmdUYWJsZS5oICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBdG9taWNTdHJpbmdUYWJsZS5oOyBwYXRoID0gdGV4
dC9BdG9taWNTdHJpbmdUYWJsZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk4NkMz
NkVFOTBFRTEyODlEMDBCM0RGNTkgLyogTWFjcm9Bc3NlbWJsZXIuaCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBwYXRoID0gTWFjcm9Bc3NlbWJsZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKIAkJODZDQTAzMkQxMDM4RTg0NDAwMjhBNjA5IC8qIEV4ZWN1dGFibGUuY3BwICovID0g
e2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVU
eXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gRXhlY3V0YWJsZS5jcHA7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CiAJCTg2Q0FGRUUyMTAzNURERTYwMDI4QTYwOSAvKiBFeGVjdXRh
YmxlLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFz
dEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEV4ZWN1dGFibGUuaDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTE2NzYsNiArMTY3OCw3IEBACiAJCQkJODY4QkZB
MDAxMTdDRUZEMTAwQjkwOEIxIC8qIEF0b21pY1N0cmluZy5jcHAgKi8sCiAJCQkJODY4QkZBMDEx
MTdDRUZEMTAwQjkwOEIxIC8qIEF0b21pY1N0cmluZy5oICovLAogCQkJCTg2OEJGQTAyMTE3Q0VG
RDEwMEI5MDhCMSAvKiBBdG9taWNTdHJpbmdJbXBsLmggKi8sCisJCQkJODZCOTlEQTYxMTgwMEY4
NTAwREY1QTkwIC8qIEF0b21pY1N0cmluZ1RhYmxlLmggKi8sCiAJCQkJODY1NjU3NDAxMTVCRTNE
QTAwMjkxRjQwIC8qIENTdHJpbmcuY3BwICovLAogCQkJCTg2NTY1NzQxMTE1QkUzREEwMDI5MUY0
MCAvKiBDU3RyaW5nLmggKi8sCiAJCQkJODZCOTlBRTExMTdFNTc4MTAwREY1QTkwIC8qIFN0cmlu
Z0J1ZmZlci5oICovLApAQCAtMjA4OSw2ICsyMDkyLDcgQEAKIAkJCQk4NkI5OUFCOTExN0UzOTFF
MDBERjVBOTAgLyogUm9wZUltcGwuaCBpbiBIZWFkZXJzICovLAogCQkJCTg2Qjk5QUUzMTE3RTU3
ODEwMERGNUE5MCAvKiBTdHJpbmdCdWZmZXIuaCBpbiBIZWFkZXJzICovLAogCQkJCTg2Qjk5QUU0
MTE3RTU3ODEwMERGNUE5MCAvKiBTdHJpbmdJbXBsQmFzZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJ
ODZCOTlEQTcxMTgwMEY4NTAwREY1QTkwIC8qIEF0b21pY1N0cmluZ1RhYmxlLmggaW4gSGVhZGVy
cyAqLywKIAkJCSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsK
IAkJfTsKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvSWRlbnRpZmllci5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gSmF2YVNjcmlwdENvcmUvcnVudGltZS9JZGVudGlmaWVyLmNwcAkocmV2aXNpb24g
NTgwMjgpCisrKyBKYXZhU2NyaXB0Q29yZS9ydW50aW1lL0lkZW50aWZpZXIuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0yOSwzMCArMjksMjMgQEAKICNpbmNsdWRlIDx3dGYvRmFzdE1hbGxvYy5oPgog
I2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CiAjaW5jbHVkZSA8d3RmL1dURlRocmVhZERhdGEuaD4K
KyNpbmNsdWRlIDx3dGYvdGV4dC9BdG9taWNTdHJpbmdUYWJsZS5oPgogI2luY2x1ZGUgPHd0Zi90
ZXh0L1N0cmluZ0hhc2guaD4KIAogdXNpbmcgV1RGOjpUaHJlYWRTcGVjaWZpYzsKIAogbmFtZXNw
YWNlIEpTQyB7CiAKLUlkZW50aWZpZXJUYWJsZTo6fklkZW50aWZpZXJUYWJsZSgpCi17Ci0gICAg
SGFzaFNldDxTdHJpbmdJbXBsKj46Oml0ZXJhdG9yIGVuZCA9IG1fdGFibGUuZW5kKCk7Ci0gICAg
Zm9yIChIYXNoU2V0PFN0cmluZ0ltcGwqPjo6aXRlcmF0b3IgaXRlciA9IG1fdGFibGUuYmVnaW4o
KTsgaXRlciAhPSBlbmQ7ICsraXRlcikKLSAgICAgICAgKCppdGVyKS0+c2V0SXNJZGVudGlmaWVy
KGZhbHNlKTsKLX0KLXN0ZDo6cGFpcjxIYXNoU2V0PFN0cmluZ0ltcGwqPjo6aXRlcmF0b3IsIGJv
b2w+IElkZW50aWZpZXJUYWJsZTo6YWRkKFN0cmluZ0ltcGwqIHZhbHVlKQorY2xhc3MgTGl0ZXJh
bFRhYmxlIDogcHVibGljIEhhc2hNYXA8Y29uc3QgY2hhciosIFJlZlB0cjxTdHJpbmdJbXBsPiwg
UHRySGFzaDxjb25zdCBjaGFyKj4gPiB7fTsKKworTGl0ZXJhbFRhYmxlKiBjcmVhdGVMaXRlcmFs
VGFibGUoKQogewotICAgIHN0ZDo6cGFpcjxIYXNoU2V0PFN0cmluZ0ltcGwqPjo6aXRlcmF0b3Is
IGJvb2w+IHJlc3VsdCA9IG1fdGFibGUuYWRkKHZhbHVlKTsKLSAgICAoKnJlc3VsdC5maXJzdCkt
PnNldElzSWRlbnRpZmllcih0cnVlKTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBu
ZXcgTGl0ZXJhbFRhYmxlOwogfQotdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgVj4KLXN0
ZDo6cGFpcjxIYXNoU2V0PFN0cmluZ0ltcGwqPjo6aXRlcmF0b3IsIGJvb2w+IElkZW50aWZpZXJU
YWJsZTo6YWRkKFUgdmFsdWUpCisKK3ZvaWQgZGVsZXRlTGl0ZXJhbFRhYmxlKExpdGVyYWxUYWJs
ZSogdGFibGUpCiB7Ci0gICAgc3RkOjpwYWlyPEhhc2hTZXQ8U3RyaW5nSW1wbCo+OjppdGVyYXRv
ciwgYm9vbD4gcmVzdWx0ID0gbV90YWJsZS5hZGQ8VSwgVj4odmFsdWUpOwotICAgICgqcmVzdWx0
LmZpcnN0KS0+c2V0SXNJZGVudGlmaWVyKHRydWUpOwotICAgIHJldHVybiByZXN1bHQ7CisgICAg
ZGVsZXRlIHRhYmxlOwogfQogCiBJZGVudGlmaWVyVGFibGUqIGNyZWF0ZUlkZW50aWZpZXJUYWJs
ZSgpCkBAIC04NiwyOSArNzksNiBAQCBib29sIElkZW50aWZpZXI6OmVxdWFsKGNvbnN0IFVTdHJp
bmc6OlJlCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0cnVjdCBJZGVudGlmaWVyQ1N0cmluZ1Ry
YW5zbGF0b3IgewotICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IGNoYXIqIGMpCi0gICAg
ewotICAgICAgICByZXR1cm4gVVN0cmluZzo6UmVwOjpjb21wdXRlSGFzaChjKTsKLSAgICB9Ci0K
LSAgICBzdGF0aWMgYm9vbCBlcXVhbChVU3RyaW5nOjpSZXAqIHIsIGNvbnN0IGNoYXIqIHMpCi0g
ICAgewotICAgICAgICByZXR1cm4gSWRlbnRpZmllcjo6ZXF1YWwociwgcyk7Ci0gICAgfQotCi0g
ICAgc3RhdGljIHZvaWQgdHJhbnNsYXRlKFVTdHJpbmc6OlJlcComIGxvY2F0aW9uLCBjb25zdCBj
aGFyKiBjLCB1bnNpZ25lZCBoYXNoKQotICAgIHsKLSAgICAgICAgc2l6ZV90IGxlbmd0aCA9IHN0
cmxlbihjKTsKLSAgICAgICAgVUNoYXIqIGQ7Ci0gICAgICAgIFVTdHJpbmc6OlJlcCogciA9IFVT
dHJpbmc6OlJlcDo6Y3JlYXRlVW5pbml0aWFsaXplZChsZW5ndGgsIGQpLnJlbGVhc2VSZWYoKTsK
LSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIT0gbGVuZ3RoOyBpKyspCi0gICAgICAgICAg
ICBkW2ldID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY1tpXSk7IC8vIHVzZSB1bnNpZ25l
ZCBjaGFyIHRvIHplcm8tZXh0ZW5kIGluc3RlYWQgb2Ygc2lnbi1leHRlbmQKLSAgICAgICAgci0+
c2V0SGFzaChoYXNoKTsKLSAgICAgICAgbG9jYXRpb24gPSByOwotICAgIH0KLX07Ci0KIFBhc3NS
ZWZQdHI8VVN0cmluZzo6UmVwPiBJZGVudGlmaWVyOjphZGQoSlNHbG9iYWxEYXRhKiBnbG9iYWxE
YXRhLCBjb25zdCBjaGFyKiBjKQogewogICAgIGlmICghYykKQEAgLTExOCwyMSArODgsMTMgQEAg
UGFzc1JlZlB0cjxVU3RyaW5nOjpSZXA+IElkZW50aWZpZXI6OmFkZAogICAgIGlmICghY1sxXSkK
ICAgICAgICAgcmV0dXJuIGFkZChnbG9iYWxEYXRhLCBnbG9iYWxEYXRhLT5zbWFsbFN0cmluZ3Mu
c2luZ2xlQ2hhcmFjdGVyU3RyaW5nUmVwKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGNbMF0p
KSk7CiAKLSAgICBJZGVudGlmaWVyVGFibGUmIGlkZW50aWZpZXJUYWJsZSA9ICpnbG9iYWxEYXRh
LT5pZGVudGlmaWVyVGFibGU7Ci0gICAgTGl0ZXJhbElkZW50aWZpZXJUYWJsZSYgbGl0ZXJhbElk
ZW50aWZpZXJUYWJsZSA9IGlkZW50aWZpZXJUYWJsZS5saXRlcmFsVGFibGUoKTsKLQotICAgIGNv
bnN0IExpdGVyYWxJZGVudGlmaWVyVGFibGU6Oml0ZXJhdG9yJiBpdGVyID0gbGl0ZXJhbElkZW50
aWZpZXJUYWJsZS5maW5kKGMpOwotICAgIGlmIChpdGVyICE9IGxpdGVyYWxJZGVudGlmaWVyVGFi
bGUuZW5kKCkpCisgICAgTGl0ZXJhbFRhYmxlKiBsaXRlcmFsVGFibGUgPSBnbG9iYWxEYXRhLT5s
aXRlcmFsVGFibGU7CisgICAgY29uc3QgTGl0ZXJhbFRhYmxlOjppdGVyYXRvciYgaXRlciA9IGxp
dGVyYWxUYWJsZS0+ZmluZChjKTsKKyAgICBpZiAoaXRlciAhPSBsaXRlcmFsVGFibGUtPmVuZCgp
KQogICAgICAgICByZXR1cm4gaXRlci0+c2Vjb25kOwogCi0gICAgcGFpcjxIYXNoU2V0PFVTdHJp
bmc6OlJlcCo+OjppdGVyYXRvciwgYm9vbD4gYWRkUmVzdWx0ID0gaWRlbnRpZmllclRhYmxlLmFk
ZDxjb25zdCBjaGFyKiwgSWRlbnRpZmllckNTdHJpbmdUcmFuc2xhdG9yPihjKTsKLQotICAgIC8v
IElmIHRoZSBzdHJpbmcgaXMgbmV3bHktdHJhbnNsYXRlZCwgdGhlbiB3ZSBuZWVkIHRvIGFkb3B0
IGl0LgotICAgIC8vIFRoZSBib29sZWFuIGluIHRoZSBwYWlyIHRlbGxzIHVzIGlmIHRoYXQgaXMg
c28uCi0gICAgUmVmUHRyPFVTdHJpbmc6OlJlcD4gYWRkZWRTdHJpbmcgPSBhZGRSZXN1bHQuc2Vj
b25kID8gYWRvcHRSZWYoKmFkZFJlc3VsdC5maXJzdCkgOiAqYWRkUmVzdWx0LmZpcnN0OwotCi0g
ICAgbGl0ZXJhbElkZW50aWZpZXJUYWJsZS5hZGQoYywgYWRkZWRTdHJpbmcuZ2V0KCkpOwotCisg
ICAgUmVmUHRyPFN0cmluZ0ltcGw+IGFkZGVkU3RyaW5nID0gZ2xvYmFsRGF0YS0+aWRlbnRpZmll
clRhYmxlLT5hZGQoYyk7CisgICAgbGl0ZXJhbFRhYmxlLT5hZGQoYywgYWRkZWRTdHJpbmcuZ2V0
KCkpOwogICAgIHJldHVybiBhZGRlZFN0cmluZy5yZWxlYXNlKCk7CiB9CiAKQEAgLTE0MSwzMyAr
MTAzLDYgQEAgUGFzc1JlZlB0cjxVU3RyaW5nOjpSZXA+IElkZW50aWZpZXI6OmFkZAogICAgIHJl
dHVybiBhZGQoJmV4ZWMtPmdsb2JhbERhdGEoKSwgYyk7CiB9CiAKLXN0cnVjdCBVQ2hhckJ1ZmZl
ciB7Ci0gICAgY29uc3QgVUNoYXIqIHM7Ci0gICAgdW5zaWduZWQgaW50IGxlbmd0aDsKLX07Ci0K
LXN0cnVjdCBJZGVudGlmaWVyVUNoYXJCdWZmZXJUcmFuc2xhdG9yIHsKLSAgICBzdGF0aWMgdW5z
aWduZWQgaGFzaChjb25zdCBVQ2hhckJ1ZmZlciYgYnVmKQotICAgIHsKLSAgICAgICAgcmV0dXJu
IFVTdHJpbmc6OlJlcDo6Y29tcHV0ZUhhc2goYnVmLnMsIGJ1Zi5sZW5ndGgpOwotICAgIH0KLQot
ICAgIHN0YXRpYyBib29sIGVxdWFsKFVTdHJpbmc6OlJlcCogc3RyLCBjb25zdCBVQ2hhckJ1ZmZl
ciYgYnVmKQotICAgIHsKLSAgICAgICAgcmV0dXJuIElkZW50aWZpZXI6OmVxdWFsKHN0ciwgYnVm
LnMsIGJ1Zi5sZW5ndGgpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHRyYW5zbGF0ZShVU3Ry
aW5nOjpSZXAqJiBsb2NhdGlvbiwgY29uc3QgVUNoYXJCdWZmZXImIGJ1ZiwgdW5zaWduZWQgaGFz
aCkKLSAgICB7Ci0gICAgICAgIFVDaGFyKiBkOwotICAgICAgICBVU3RyaW5nOjpSZXAqIHIgPSBV
U3RyaW5nOjpSZXA6OmNyZWF0ZVVuaW5pdGlhbGl6ZWQoYnVmLmxlbmd0aCwgZCkucmVsZWFzZVJl
ZigpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IGJ1Zi5sZW5ndGg7IGkrKykK
LSAgICAgICAgICAgIGRbaV0gPSBidWYuc1tpXTsKLSAgICAgICAgci0+c2V0SGFzaChoYXNoKTsK
LSAgICAgICAgbG9jYXRpb24gPSByOyAKLSAgICB9Ci19OwotCiBQYXNzUmVmUHRyPFVTdHJpbmc6
OlJlcD4gSWRlbnRpZmllcjo6YWRkKEpTR2xvYmFsRGF0YSogZ2xvYmFsRGF0YSwgY29uc3QgVUNo
YXIqIHMsIGludCBsZW5ndGgpCiB7CiAgICAgaWYgKGxlbmd0aCA9PSAxKSB7CkBAIC0xNzcsMTIg
KzExMiw4IEBAIFBhc3NSZWZQdHI8VVN0cmluZzo6UmVwPiBJZGVudGlmaWVyOjphZGQKICAgICB9
CiAgICAgaWYgKCFsZW5ndGgpCiAgICAgICAgIHJldHVybiBVU3RyaW5nOjpSZXA6OmVtcHR5KCk7
Ci0gICAgVUNoYXJCdWZmZXIgYnVmID0ge3MsIGxlbmd0aH07IAotICAgIHBhaXI8SGFzaFNldDxV
U3RyaW5nOjpSZXAqPjo6aXRlcmF0b3IsIGJvb2w+IGFkZFJlc3VsdCA9IGdsb2JhbERhdGEtPmlk
ZW50aWZpZXJUYWJsZS0+YWRkPFVDaGFyQnVmZmVyLCBJZGVudGlmaWVyVUNoYXJCdWZmZXJUcmFu
c2xhdG9yPihidWYpOwogCi0gICAgLy8gSWYgdGhlIHN0cmluZyBpcyBuZXdseS10cmFuc2xhdGVk
LCB0aGVuIHdlIG5lZWQgdG8gYWRvcHQgaXQuCi0gICAgLy8gVGhlIGJvb2xlYW4gaW4gdGhlIHBh
aXIgdGVsbHMgdXMgaWYgdGhhdCBpcyBzby4KLSAgICByZXR1cm4gYWRkUmVzdWx0LnNlY29uZCA/
IGFkb3B0UmVmKCphZGRSZXN1bHQuZmlyc3QpIDogKmFkZFJlc3VsdC5maXJzdDsKKyAgICByZXR1
cm4gZ2xvYmFsRGF0YS0+aWRlbnRpZmllclRhYmxlLT5hZGQocywgbGVuZ3RoKTsKIH0KIAogUGFz
c1JlZlB0cjxVU3RyaW5nOjpSZXA+IElkZW50aWZpZXI6OmFkZChFeGVjU3RhdGUqIGV4ZWMsIGNv
bnN0IFVDaGFyKiBzLCBpbnQgbGVuZ3RoKQpAQCAtMjA1LDcgKzEzNiw3IEBAIFBhc3NSZWZQdHI8
VVN0cmluZzo6UmVwPiBJZGVudGlmaWVyOjphZGQKICAgICAgICAgICAgICAgICByZXR1cm4gcjsK
ICAgICB9CiAKLSAgICByZXR1cm4gKmdsb2JhbERhdGEtPmlkZW50aWZpZXJUYWJsZS0+YWRkKHIp
LmZpcnN0OworICAgIHJldHVybiBnbG9iYWxEYXRhLT5pZGVudGlmaWVyVGFibGUtPmFkZChyKTsK
IH0KIAogUGFzc1JlZlB0cjxVU3RyaW5nOjpSZXA+IElkZW50aWZpZXI6OmFkZFNsb3dDYXNlKEV4
ZWNTdGF0ZSogZXhlYywgVVN0cmluZzo6UmVwKiByKQpJbmRleDogSmF2YVNjcmlwdENvcmUvcnVu
dGltZS9JZGVudGlmaWVyLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvcnVudGltZS9J
ZGVudGlmaWVyLmgJKHJldmlzaW9uIDU4MDI4KQorKysgSmF2YVNjcmlwdENvcmUvcnVudGltZS9J
ZGVudGlmaWVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTEzNyw2ICsxMzcsOCBAQCBuYW1lc3BhY2Ug
SlNDIHsKIAogICAgIElkZW50aWZpZXJUYWJsZSogY3JlYXRlSWRlbnRpZmllclRhYmxlKCk7CiAg
ICAgdm9pZCBkZWxldGVJZGVudGlmaWVyVGFibGUoSWRlbnRpZmllclRhYmxlKik7CisgICAgTGl0
ZXJhbFRhYmxlKiBjcmVhdGVMaXRlcmFsVGFibGUoKTsKKyAgICB2b2lkIGRlbGV0ZUxpdGVyYWxU
YWJsZShMaXRlcmFsVGFibGUqKTsKIAogfSAvLyBuYW1lc3BhY2UgSlNDCiAKSW5kZXg6IEphdmFT
Y3JpcHRDb3JlL3J1bnRpbWUvSlNHbG9iYWxEYXRhLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2Ny
aXB0Q29yZS9ydW50aW1lL0pTR2xvYmFsRGF0YS5jcHAJKHJldmlzaW9uIDU4MDI4KQorKysgSmF2
YVNjcmlwdENvcmUvcnVudGltZS9KU0dsb2JhbERhdGEuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0x
MjksNiArMTI5LDcgQEAgSlNHbG9iYWxEYXRhOjpKU0dsb2JhbERhdGEoYm9vbCBpc1NoYXJlZAog
ICAgICwgbnVtYmVyU3RydWN0dXJlKEpTTnVtYmVyQ2VsbDo6Y3JlYXRlU3RydWN0dXJlKGpzTnVs
bCgpKSkKICNlbmRpZgogICAgICwgaWRlbnRpZmllclRhYmxlKGNyZWF0ZUlkZW50aWZpZXJUYWJs
ZSgpKQorICAgICwgbGl0ZXJhbFRhYmxlKGNyZWF0ZUxpdGVyYWxUYWJsZSgpKQogICAgICwgcHJv
cGVydHlOYW1lcyhuZXcgQ29tbW9uSWRlbnRpZmllcnModGhpcykpCiAgICAgLCBlbXB0eUxpc3Qo
bmV3IE1hcmtlZEFyZ3VtZW50QnVmZmVyKQogICAgICwgbGV4ZXIobmV3IExleGVyKHRoaXMpKQpA
QCAtMTkzLDYgKzE5NCw3IEBAIEpTR2xvYmFsRGF0YTo6fkpTR2xvYmFsRGF0YSgpCiAKICAgICBk
ZWxldGUgcHJvcGVydHlOYW1lczsKICAgICBkZWxldGVJZGVudGlmaWVyVGFibGUoaWRlbnRpZmll
clRhYmxlKTsKKyAgICBkZWxldGVMaXRlcmFsVGFibGUobGl0ZXJhbFRhYmxlKTsKIAogICAgIGRl
bGV0ZSBjbGllbnREYXRhOwogfQpJbmRleDogSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU0dsb2Jh
bERhdGEuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTR2xvYmFsRGF0
YS5oCShyZXZpc2lvbiA1ODAyOCkKKysrIEphdmFTY3JpcHRDb3JlL3J1bnRpbWUvSlNHbG9iYWxE
YXRhLmgJKHdvcmtpbmcgY29weSkKQEAgLTU2LDYgKzU2LDcgQEAgbmFtZXNwYWNlIEpTQyB7CiAg
ICAgY2xhc3MgSlNHbG9iYWxPYmplY3Q7CiAgICAgY2xhc3MgSlNPYmplY3Q7CiAgICAgY2xhc3Mg
TGV4ZXI7CisgICAgY2xhc3MgTGl0ZXJhbFRhYmxlOwogICAgIGNsYXNzIFBhcnNlcjsKICAgICBj
bGFzcyBTdHJpbmdpZmllcjsKICAgICBjbGFzcyBTdHJ1Y3R1cmU7CkBAIC0xNDMsNiArMTQ0LDcg
QEAgbmFtZXNwYWNlIEpTQyB7CiAgICAgICAgIHN0YXRpYyBKU19FWFBPUlREQVRBIHZvaWQqIGpz
RnVuY3Rpb25WUHRyOwogCiAgICAgICAgIElkZW50aWZpZXJUYWJsZSogaWRlbnRpZmllclRhYmxl
OworICAgICAgICBMaXRlcmFsVGFibGUqIGxpdGVyYWxUYWJsZTsKICAgICAgICAgQ29tbW9uSWRl
bnRpZmllcnMqIHByb3BlcnR5TmFtZXM7CiAgICAgICAgIGNvbnN0IE1hcmtlZEFyZ3VtZW50QnVm
ZmVyKiBlbXB0eUxpc3Q7IC8vIExpc3RzIGFyZSBzdXBwb3NlZCB0byBiZSBhbGxvY2F0ZWQgb24g
dGhlIHN0YWNrIHRvIGhhdmUgdGhlaXIgZWxlbWVudHMgcHJvcGVybHkgbWFya2VkLCB3aGljaCBp
cyBub3QgdGhlIGNhc2UgaGVyZSAtIGJ1dCB0aGlzIGxpc3QgaGFzIG5vdGhpbmcgdG8gbWFyay4K
ICAgICAgICAgU21hbGxTdHJpbmdzIHNtYWxsU3RyaW5nczsKSW5kZXg6IEphdmFTY3JpcHRDb3Jl
L3d0Zi9XVEZUaHJlYWREYXRhLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYv
V1RGVGhyZWFkRGF0YS5jcHAJKHJldmlzaW9uIDU4MDI4KQorKysgSmF2YVNjcmlwdENvcmUvd3Rm
L1dURlRocmVhZERhdGEuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yNiw2ICsyNiw3IEBACiAKICNp
bmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJXVEZUaHJlYWREYXRhLmgiCisjaW5jbHVkZSA8
d3RmL3RleHQvQXRvbWljU3RyaW5nVGFibGUuaD4KIAogbmFtZXNwYWNlIFdURiB7CiAKQEAgLTM2
LDggKzM3LDcgQEAgV1RGVGhyZWFkRGF0YSogV1RGVGhyZWFkRGF0YTo6c3RhdGljRGF0YQogI2Vu
ZGlmCiAKIFdURlRocmVhZERhdGE6OldURlRocmVhZERhdGEoKQotICAgIDogbV9hdG9taWNTdHJp
bmdUYWJsZSgwKQotICAgICwgbV9hdG9taWNTdHJpbmdUYWJsZURlc3RydWN0b3IoMCkKKyAgICA6
IG1fYXRvbWljU3RyaW5nVGFibGUobmV3IFdlYkNvcmU6OkF0b21pY1N0cmluZ1RhYmxlKCkpCiAj
aWYgVVNFKEpTQykKICAgICAsIG1fZGVmYXVsdElkZW50aWZpZXJUYWJsZSgwKQogICAgICwgbV9j
dXJyZW50SWRlbnRpZmllclRhYmxlKDApCkBAIC00Nyw4ICs0Nyw3IEBAIFdURlRocmVhZERhdGE6
OldURlRocmVhZERhdGEoKQogCiBXVEZUaHJlYWREYXRhOjp+V1RGVGhyZWFkRGF0YSgpCiB7Ci0g
ICAgaWYgKG1fYXRvbWljU3RyaW5nVGFibGVEZXN0cnVjdG9yKQotICAgICAgICBtX2F0b21pY1N0
cmluZ1RhYmxlRGVzdHJ1Y3RvcihtX2F0b21pY1N0cmluZ1RhYmxlKTsKKyAgICBkZWxldGUgbV9h
dG9taWNTdHJpbmdUYWJsZTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogSmF2
YVNjcmlwdENvcmUvd3RmL1dURlRocmVhZERhdGEuaAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0
Q29yZS93dGYvV1RGVGhyZWFkRGF0YS5oCShyZXZpc2lvbiA1ODAyOCkKKysrIEphdmFTY3JpcHRD
b3JlL3d0Zi9XVEZUaHJlYWREYXRhLmgJKHdvcmtpbmcgY29weSkKQEAgLTI3LDEwICsyNyw3IEBA
CiAjaWZuZGVmIFdURlRocmVhZERhdGFfaAogI2RlZmluZSBXVEZUaHJlYWREYXRhX2gKIAotI2lu
Y2x1ZGUgPHd0Zi9IYXNoTWFwLmg+Ci0jaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KICNpbmNsdWRl
IDx3dGYvTm9uY29weWFibGUuaD4KLSNpbmNsdWRlIDx3dGYvdGV4dC9TdHJpbmdIYXNoLmg+CiAK
IC8vIFRoaXMgd2FzIEVOQUJMRShXT1JLRVJTKSBpbiBXZWJDb3JlLCBidXQgdGhpcyBpcyBub3Qg
ZGVmaW5lZCB3aGVuIGNvbXBpbGluZyBKU0MuCiAvLyBIb3dldmVyIHRoaXMgY2hlY2sgd2FzIG5v
dCBjb3JyZWN0IGFueXdheSwgcmUgdGhpcyBjb21tZW50OgpAQCAtNDYsMzkgKzQzLDE0IEBACiAj
ZW5kaWYKIAogLy8gRklYTUU6IFRoaXMgaXMgYSB0ZW1wb3JhcnkgbGF5ZXJpbmcgdmlvbGF0aW9u
IHdoaWxlIHdlIG1vdmUgbW9yZSBzdHJpbmcgY29kZSB0byBXVEYuCi1uYW1lc3BhY2UgV2ViQ29y
ZSB7Ci1jbGFzcyBBdG9taWNTdHJpbmdUYWJsZTsKLWNsYXNzIFN0cmluZ0ltcGw7CituYW1lc3Bh
Y2UgSlNDIHsKK2NsYXNzIElkZW50aWZpZXJUYWJsZTsKIH0KLXVzaW5nIFdlYkNvcmU6OlN0cmlu
Z0ltcGw7CiAKLXR5cGVkZWYgdm9pZCAoKkF0b21pY1N0cmluZ1RhYmxlRGVzdHJ1Y3RvcikoV2Vi
Q29yZTo6QXRvbWljU3RyaW5nVGFibGUqKTsKLQotI2lmIFVTRShKU0MpCiAvLyBGSVhNRTogVGhp
cyBpcyBhIHRlbXBvcmFyeSBsYXllcmluZyB2aW9sYXRpb24gd2hpbGUgd2UgbW92ZSBtb3JlIHN0
cmluZyBjb2RlIHRvIFdURi4KLW5hbWVzcGFjZSBKU0MgewotCi10eXBlZGVmIEhhc2hNYXA8Y29u
c3QgY2hhciosIFJlZlB0cjxTdHJpbmdJbXBsPiwgUHRySGFzaDxjb25zdCBjaGFyKj4gPiBMaXRl
cmFsSWRlbnRpZmllclRhYmxlOwotCi1jbGFzcyBJZGVudGlmaWVyVGFibGUgOiBwdWJsaWMgRmFz
dEFsbG9jQmFzZSB7Ci1wdWJsaWM6Ci0gICAgfklkZW50aWZpZXJUYWJsZSgpOwotCi0gICAgc3Rk
OjpwYWlyPEhhc2hTZXQ8U3RyaW5nSW1wbCo+OjppdGVyYXRvciwgYm9vbD4gYWRkKFN0cmluZ0lt
cGwqIHZhbHVlKTsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBWPgotICAgIHN0
ZDo6cGFpcjxIYXNoU2V0PFN0cmluZ0ltcGwqPjo6aXRlcmF0b3IsIGJvb2w+IGFkZChVIHZhbHVl
KTsKLQotICAgIHZvaWQgcmVtb3ZlKFN0cmluZ0ltcGwqIHIpIHsgbV90YWJsZS5yZW1vdmUocik7
IH0KLQotICAgIExpdGVyYWxJZGVudGlmaWVyVGFibGUmIGxpdGVyYWxUYWJsZSgpIHsgcmV0dXJu
IG1fbGl0ZXJhbFRhYmxlOyB9Ci0KLXByaXZhdGU6Ci0gICAgSGFzaFNldDxTdHJpbmdJbXBsKj4g
bV90YWJsZTsKLSAgICBMaXRlcmFsSWRlbnRpZmllclRhYmxlIG1fbGl0ZXJhbFRhYmxlOwotfTsK
LQorbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgQXRvbWljU3RyaW5nVGFibGU7CiB9Ci0jZW5k
aWYKIAogbmFtZXNwYWNlIFdURiB7CiAKQEAgLTg3LDkgKzU5LDkgQEAgcHVibGljOgogICAgIFdU
RlRocmVhZERhdGEoKTsKICAgICB+V1RGVGhyZWFkRGF0YSgpOwogCi0gICAgV2ViQ29yZTo6QXRv
bWljU3RyaW5nVGFibGUqIGF0b21pY1N0cmluZ1RhYmxlKCkKKyAgICBXZWJDb3JlOjpBdG9taWNT
dHJpbmdUYWJsZSYgYXRvbWljU3RyaW5nVGFibGUoKQogICAgIHsKLSAgICAgICAgcmV0dXJuIG1f
YXRvbWljU3RyaW5nVGFibGU7CisgICAgICAgIHJldHVybiAqbV9hdG9taWNTdHJpbmdUYWJsZTsK
ICAgICB9CiAKICNpZiBVU0UoSlNDKQpAQCAtMTE5LDcgKzkxLDYgQEAgcHVibGljOgogCiBwcml2
YXRlOgogICAgIFdlYkNvcmU6OkF0b21pY1N0cmluZ1RhYmxlKiBtX2F0b21pY1N0cmluZ1RhYmxl
OwotICAgIEF0b21pY1N0cmluZ1RhYmxlRGVzdHJ1Y3RvciBtX2F0b21pY1N0cmluZ1RhYmxlRGVz
dHJ1Y3RvcjsKIAogI2lmIFVTRShKU0MpCiAgICAgSlNDOjpJZGVudGlmaWVyVGFibGUqIG1fZGVm
YXVsdElkZW50aWZpZXJUYWJsZTsKQEAgLTEzMiw3ICsxMDMsNiBAQCBwcml2YXRlOgogICAgIHN0
YXRpYyBKU19FWFBPUlREQVRBIFdURlRocmVhZERhdGEqIHN0YXRpY0RhdGE7CiAjZW5kaWYKICAg
ICBmcmllbmQgV1RGVGhyZWFkRGF0YSYgd3RmVGhyZWFkRGF0YSgpOwotICAgIGZyaWVuZCBjbGFz
cyBXZWJDb3JlOjpBdG9taWNTdHJpbmdUYWJsZTsKIH07CiAKIGlubGluZSBXVEZUaHJlYWREYXRh
JiB3dGZUaHJlYWREYXRhKCkKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi90ZXh0L0F0b21pY1N0
cmluZy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gSmF2YVNjcmlwdENvcmUvd3RmL3RleHQvQXRvbWljU3Ry
aW5nLmNwcAkocmV2aXNpb24gNTgwMjgpCisrKyBKYXZhU2NyaXB0Q29yZS93dGYvdGV4dC9BdG9t
aWNTdHJpbmcuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMSw3MSArMzEsMTUgQEAKICNpbmNsdWRl
IDx3dGYvVGhyZWFkaW5nLmg+CiAjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KICNpbmNsdWRlIDx3
dGYvV1RGVGhyZWFkRGF0YS5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0F0b21pY1N0cmluZ1RhYmxl
Lmg+CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotY2xhc3MgQXRvbWljU3RyaW5nVGFibGUgewot
cHVibGljOgotICAgIHN0YXRpYyBBdG9taWNTdHJpbmdUYWJsZSogY3JlYXRlKCkKLSAgICB7Ci0g
ICAgICAgIEF0b21pY1N0cmluZ1RhYmxlKiB0YWJsZSA9IG5ldyBBdG9taWNTdHJpbmdUYWJsZTsK
LQotICAgICAgICBXVEZUaHJlYWREYXRhJiBkYXRhID0gd3RmVGhyZWFkRGF0YSgpOwotICAgICAg
ICBkYXRhLm1fYXRvbWljU3RyaW5nVGFibGUgPSB0YWJsZTsKLSAgICAgICAgZGF0YS5tX2F0b21p
Y1N0cmluZ1RhYmxlRGVzdHJ1Y3RvciA9IEF0b21pY1N0cmluZ1RhYmxlOjpkZXN0cm95OwotCi0g
ICAgICAgIHJldHVybiB0YWJsZTsKLSAgICB9Ci0KLSAgICBIYXNoU2V0PFN0cmluZ0ltcGwqPiYg
dGFibGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1fdGFibGU7Ci0gICAgfQotCi1wcml2YXRl
OgotICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3koQXRvbWljU3RyaW5nVGFibGUqIHRhYmxlKQotICAg
IHsKLSAgICAgICAgZGVsZXRlIHRhYmxlOwotICAgIH0KLQotICAgIEhhc2hTZXQ8U3RyaW5nSW1w
bCo+IG1fdGFibGU7Ci19OwotCi1zdGF0aWMgaW5saW5lIEhhc2hTZXQ8U3RyaW5nSW1wbCo+JiBz
dHJpbmdUYWJsZSgpCitzdGF0aWMgaW5saW5lIEF0b21pY1N0cmluZ1RhYmxlJiB0YWJsZSgpCiB7
Ci0gICAgLy8gT25jZSBwb3NzaWJsZSB3ZSBzaG91bGQgbWFrZSB0aGlzIG5vbi1sYXp5IChjb25z
dHJ1Y3RlZCBpbiBXVEZUaHJlYWREYXRhJ3MgY29uc3RydWN0b3IpLgotICAgIEF0b21pY1N0cmlu
Z1RhYmxlKiB0YWJsZSA9IHd0ZlRocmVhZERhdGEoKS5hdG9taWNTdHJpbmdUYWJsZSgpOwotICAg
IGlmIChVTkxJS0VMWSghdGFibGUpKQotICAgICAgICB0YWJsZSA9IEF0b21pY1N0cmluZ1RhYmxl
OjpjcmVhdGUoKTsKLSAgICByZXR1cm4gdGFibGUtPnRhYmxlKCk7CisgICAgcmV0dXJuIHd0ZlRo
cmVhZERhdGEoKS5hdG9taWNTdHJpbmdUYWJsZSgpOwogfQogCi1zdHJ1Y3QgQ1N0cmluZ1RyYW5z
bGF0b3IgewotICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IGNoYXIqIGMpCi0gICAgewot
ICAgICAgICByZXR1cm4gU3RyaW5nSW1wbDo6Y29tcHV0ZUhhc2goYyk7Ci0gICAgfQotCi0gICAg
c3RhdGljIGJvb2wgZXF1YWwoU3RyaW5nSW1wbCogciwgY29uc3QgY2hhciogcykKLSAgICB7Ci0g
ICAgICAgIGludCBsZW5ndGggPSByLT5sZW5ndGgoKTsKLSAgICAgICAgY29uc3QgVUNoYXIqIGQg
PSByLT5jaGFyYWN0ZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpICE9IGxlbmd0aDsg
KytpKSB7Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGMgPSBzW2ldOwotICAgICAgICAgICAg
aWYgKGRbaV0gIT0gYykKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0K
LSAgICAgICAgcmV0dXJuIHNbbGVuZ3RoXSA9PSAwOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lk
IHRyYW5zbGF0ZShTdHJpbmdJbXBsKiYgbG9jYXRpb24sIGNvbnN0IGNoYXIqIGNvbnN0JiBjLCB1
bnNpZ25lZCBoYXNoKQotICAgIHsKLSAgICAgICAgbG9jYXRpb24gPSBTdHJpbmdJbXBsOjpjcmVh
dGUoYykucmVsZWFzZVJlZigpOyAKLSAgICAgICAgbG9jYXRpb24tPnNldEhhc2goaGFzaCk7Ci0g
ICAgICAgIGxvY2F0aW9uLT5zZXRJblRhYmxlKCk7Ci0gICAgfQotfTsKLQogYm9vbCBvcGVyYXRv
cj09KGNvbnN0IEF0b21pY1N0cmluZyYgYSwgY29uc3QgY2hhciogYikKIHsgCiAgICAgU3RyaW5n
SW1wbCogaW1wbCA9IGEuaW1wbCgpOwpAQCAtMTAzLDcgKzQ3LDcgQEAgYm9vbCBvcGVyYXRvcj09
KGNvbnN0IEF0b21pY1N0cmluZyYgYSwgYwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICBpZiAo
KCFpbXBsIHx8ICFpbXBsLT5jaGFyYWN0ZXJzKCkpIHx8ICFiKQogICAgICAgICByZXR1cm4gZmFs
c2U7Ci0gICAgcmV0dXJuIENTdHJpbmdUcmFuc2xhdG9yOjplcXVhbChpbXBsLCBiKTsgCisgICAg
cmV0dXJuIDo6ZXF1YWwoaW1wbCwgYik7IAogfQogCiBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IEF0
b21pY1N0cmluZzo6YWRkKGNvbnN0IGNoYXIqIGMpCkBAIC0xMTEsOTYgKzU1LDEwIEBAIFBhc3NS
ZWZQdHI8U3RyaW5nSW1wbD4gQXRvbWljU3RyaW5nOjphZGQKICAgICBpZiAoIWMpCiAgICAgICAg
IHJldHVybiAwOwogICAgIGlmICghKmMpCi0gICAgICAgIHJldHVybiBTdHJpbmdJbXBsOjplbXB0
eSgpOyAgICAKLSAgICBwYWlyPEhhc2hTZXQ8U3RyaW5nSW1wbCo+OjppdGVyYXRvciwgYm9vbD4g
YWRkUmVzdWx0ID0gc3RyaW5nVGFibGUoKS5hZGQ8Y29uc3QgY2hhciosIENTdHJpbmdUcmFuc2xh
dG9yPihjKTsKLSAgICBpZiAoIWFkZFJlc3VsdC5zZWNvbmQpCi0gICAgICAgIHJldHVybiAqYWRk
UmVzdWx0LmZpcnN0OwotICAgIHJldHVybiBhZG9wdFJlZigqYWRkUmVzdWx0LmZpcnN0KTsKLX0K
LQotc3RydWN0IFVDaGFyQnVmZmVyIHsKLSAgICBjb25zdCBVQ2hhciogczsKLSAgICB1bnNpZ25l
ZCBsZW5ndGg7Ci19OwotCi1zdGF0aWMgaW5saW5lIGJvb2wgZXF1YWwoU3RyaW5nSW1wbCogc3Ry
aW5nLCBjb25zdCBVQ2hhciogY2hhcmFjdGVycywgdW5zaWduZWQgbGVuZ3RoKQotewotICAgIGlm
IChzdHJpbmctPmxlbmd0aCgpICE9IGxlbmd0aCkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0g
ICAgLy8gRklYTUU6IHBlcmhhcHMgd2Ugc2hvdWxkIGhhdmUgYSBtb3JlIGFic3RyYWN0IG1hY3Jv
IHRoYXQgaW5kaWNhdGVzIHdoZW4KLSAgICAvLyBnb2luZyA0IGJ5dGVzIGF0IGEgdGltZSBpcyB1
bnNhZmUKLSNpZiBDUFUoQVJNKSB8fCBDUFUoU0g0KQotICAgIGNvbnN0IFVDaGFyKiBzdHJpbmdD
aGFyYWN0ZXJzID0gc3RyaW5nLT5jaGFyYWN0ZXJzKCk7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSAhPSBsZW5ndGg7ICsraSkgewotICAgICAgICBpZiAoKnN0cmluZ0NoYXJhY3RlcnMrKyAh
PSAqY2hhcmFjdGVycysrKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBy
ZXR1cm4gdHJ1ZTsKLSNlbHNlCi0gICAgLyogRG8gaXQgNC1ieXRlcy1hdC1hLXRpbWUgb24gYXJj
aGl0ZWN0dXJlcyB3aGVyZSBpdCdzIHNhZmUgKi8KLQotICAgIGNvbnN0IHVpbnQzMl90KiBzdHJp
bmdDaGFyYWN0ZXJzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCo+KHN0cmluZy0+
Y2hhcmFjdGVycygpKTsKLSAgICBjb25zdCB1aW50MzJfdCogYnVmZmVyQ2hhcmFjdGVycyA9IHJl
aW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QqPihjaGFyYWN0ZXJzKTsKLQotICAgIHVuc2ln
bmVkIGhhbGZMZW5ndGggPSBsZW5ndGggPj4gMTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp
ICE9IGhhbGZMZW5ndGg7ICsraSkgewotICAgICAgICBpZiAoKnN0cmluZ0NoYXJhY3RlcnMrKyAh
PSAqYnVmZmVyQ2hhcmFjdGVycysrKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0K
LQotICAgIGlmIChsZW5ndGggJiAxICYmICAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MTZf
dCo+KHN0cmluZ0NoYXJhY3RlcnMpICE9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQxNl90
Kj4oYnVmZmVyQ2hhcmFjdGVycykpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVy
biB0cnVlOwotI2VuZGlmCisgICAgICAgIHJldHVybiBTdHJpbmdJbXBsOjplbXB0eSgpOworICAg
IHJldHVybiB0YWJsZSgpLmFkZChjKTsKIH0KIAotc3RydWN0IFVDaGFyQnVmZmVyVHJhbnNsYXRv
ciB7Ci0gICAgc3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3QgVUNoYXJCdWZmZXImIGJ1ZikKLSAg
ICB7Ci0gICAgICAgIHJldHVybiBTdHJpbmdJbXBsOjpjb21wdXRlSGFzaChidWYucywgYnVmLmxl
bmd0aCk7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2wgZXF1YWwoU3RyaW5nSW1wbCogY29uc3Qm
IHN0ciwgY29uc3QgVUNoYXJCdWZmZXImIGJ1ZikKLSAgICB7Ci0gICAgICAgIHJldHVybiBXZWJD
b3JlOjplcXVhbChzdHIsIGJ1Zi5zLCBidWYubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMg
dm9pZCB0cmFuc2xhdGUoU3RyaW5nSW1wbComIGxvY2F0aW9uLCBjb25zdCBVQ2hhckJ1ZmZlciYg
YnVmLCB1bnNpZ25lZCBoYXNoKQotICAgIHsKLSAgICAgICAgbG9jYXRpb24gPSBTdHJpbmdJbXBs
OjpjcmVhdGUoYnVmLnMsIGJ1Zi5sZW5ndGgpLnJlbGVhc2VSZWYoKTsgCi0gICAgICAgIGxvY2F0
aW9uLT5zZXRIYXNoKGhhc2gpOwotICAgICAgICBsb2NhdGlvbi0+c2V0SW5UYWJsZSgpOwotICAg
IH0KLX07Ci0KLXN0cnVjdCBIYXNoQW5kQ2hhcmFjdGVycyB7Ci0gICAgdW5zaWduZWQgaGFzaDsK
LSAgICBjb25zdCBVQ2hhciogY2hhcmFjdGVyczsKLSAgICB1bnNpZ25lZCBsZW5ndGg7Ci19Owot
Ci1zdHJ1Y3QgSGFzaEFuZENoYXJhY3RlcnNUcmFuc2xhdG9yIHsKLSAgICBzdGF0aWMgdW5zaWdu
ZWQgaGFzaChjb25zdCBIYXNoQW5kQ2hhcmFjdGVycyYgYnVmZmVyKQotICAgIHsKLSAgICAgICAg
QVNTRVJUKGJ1ZmZlci5oYXNoID09IFN0cmluZ0ltcGw6OmNvbXB1dGVIYXNoKGJ1ZmZlci5jaGFy
YWN0ZXJzLCBidWZmZXIubGVuZ3RoKSk7Ci0gICAgICAgIHJldHVybiBidWZmZXIuaGFzaDsKLSAg
ICB9Ci0KLSAgICBzdGF0aWMgYm9vbCBlcXVhbChTdHJpbmdJbXBsKiBjb25zdCYgc3RyaW5nLCBj
b25zdCBIYXNoQW5kQ2hhcmFjdGVycyYgYnVmZmVyKQotICAgIHsKLSAgICAgICAgcmV0dXJuIFdl
YkNvcmU6OmVxdWFsKHN0cmluZywgYnVmZmVyLmNoYXJhY3RlcnMsIGJ1ZmZlci5sZW5ndGgpOwot
ICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHRyYW5zbGF0ZShTdHJpbmdJbXBsKiYgbG9jYXRpb24s
IGNvbnN0IEhhc2hBbmRDaGFyYWN0ZXJzJiBidWZmZXIsIHVuc2lnbmVkIGhhc2gpCi0gICAgewot
ICAgICAgICBsb2NhdGlvbiA9IFN0cmluZ0ltcGw6OmNyZWF0ZShidWZmZXIuY2hhcmFjdGVycywg
YnVmZmVyLmxlbmd0aCkucmVsZWFzZVJlZigpOwotICAgICAgICBsb2NhdGlvbi0+c2V0SGFzaCho
YXNoKTsKLSAgICAgICAgbG9jYXRpb24tPnNldEluVGFibGUoKTsKLSAgICB9Ci19OwotCiBQYXNz
UmVmUHRyPFN0cmluZ0ltcGw+IEF0b21pY1N0cmluZzo6YWRkKGNvbnN0IFVDaGFyKiBzLCB1bnNp
Z25lZCBsZW5ndGgpCiB7CiAgICAgaWYgKCFzKQpAQCAtMjA5LDEyICs2Nyw3IEBAIFBhc3NSZWZQ
dHI8U3RyaW5nSW1wbD4gQXRvbWljU3RyaW5nOjphZGQKICAgICBpZiAobGVuZ3RoID09IDApCiAg
ICAgICAgIHJldHVybiBTdHJpbmdJbXBsOjplbXB0eSgpOwogICAgIAotICAgIFVDaGFyQnVmZmVy
IGJ1ZiA9IHsgcywgbGVuZ3RoIH07IAotICAgIHBhaXI8SGFzaFNldDxTdHJpbmdJbXBsKj46Oml0
ZXJhdG9yLCBib29sPiBhZGRSZXN1bHQgPSBzdHJpbmdUYWJsZSgpLmFkZDxVQ2hhckJ1ZmZlciwg
VUNoYXJCdWZmZXJUcmFuc2xhdG9yPihidWYpOwotCi0gICAgLy8gSWYgdGhlIHN0cmluZyBpcyBu
ZXdseS10cmFuc2xhdGVkLCB0aGVuIHdlIG5lZWQgdG8gYWRvcHQgaXQuCi0gICAgLy8gVGhlIGJv
b2xlYW4gaW4gdGhlIHBhaXIgdGVsbHMgdXMgaWYgdGhhdCBpcyBzby4KLSAgICByZXR1cm4gYWRk
UmVzdWx0LnNlY29uZCA/IGFkb3B0UmVmKCphZGRSZXN1bHQuZmlyc3QpIDogKmFkZFJlc3VsdC5m
aXJzdDsKKyAgICByZXR1cm4gdGFibGUoKS5hZGQocywgbGVuZ3RoKTsKIH0KIAogUGFzc1JlZlB0
cjxTdHJpbmdJbXBsPiBBdG9taWNTdHJpbmc6OmFkZChjb25zdCBVQ2hhciogcywgdW5zaWduZWQg
bGVuZ3RoLCB1bnNpZ25lZCBleGlzdGluZ0hhc2gpCkBAIC0yMjQsMTIgKzc3LDggQEAgUGFzc1Jl
ZlB0cjxTdHJpbmdJbXBsPiBBdG9taWNTdHJpbmc6OmFkZAogCiAgICAgaWYgKGxlbmd0aCA9PSAw
KQogICAgICAgICByZXR1cm4gU3RyaW5nSW1wbDo6ZW1wdHkoKTsKLSAgICAKLSAgICBIYXNoQW5k
Q2hhcmFjdGVycyBidWZmZXIgPSB7IGV4aXN0aW5nSGFzaCwgcywgbGVuZ3RoIH07IAotICAgIHBh
aXI8SGFzaFNldDxTdHJpbmdJbXBsKj46Oml0ZXJhdG9yLCBib29sPiBhZGRSZXN1bHQgPSBzdHJp
bmdUYWJsZSgpLmFkZDxIYXNoQW5kQ2hhcmFjdGVycywgSGFzaEFuZENoYXJhY3RlcnNUcmFuc2xh
dG9yPihidWZmZXIpOwotICAgIGlmICghYWRkUmVzdWx0LnNlY29uZCkKLSAgICAgICAgcmV0dXJu
ICphZGRSZXN1bHQuZmlyc3Q7Ci0gICAgcmV0dXJuIGFkb3B0UmVmKCphZGRSZXN1bHQuZmlyc3Qp
OworCisgICAgcmV0dXJuIHRhYmxlKCkuYWRkKHMsIGxlbmd0aCwgZXhpc3RpbmdIYXNoKTsKIH0K
IAogUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBBdG9taWNTdHJpbmc6OmFkZChjb25zdCBVQ2hhciog
cykKQEAgLTIzNywzMyArODYsMjUgQEAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBBdG9taWNTdHJp
bmc6OmFkZAogICAgIGlmICghcykKICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICBpbnQgbGVuZ3Ro
ID0gMDsKKyAgICB1bnNpZ25lZCBsZW5ndGggPSAwOwogICAgIHdoaWxlIChzW2xlbmd0aF0gIT0g
VUNoYXIoMCkpCiAgICAgICAgIGxlbmd0aCsrOwogCiAgICAgaWYgKGxlbmd0aCA9PSAwKQogICAg
ICAgICByZXR1cm4gU3RyaW5nSW1wbDo6ZW1wdHkoKTsKIAotICAgIFVDaGFyQnVmZmVyIGJ1ZiA9
IHtzLCBsZW5ndGh9OyAKLSAgICBwYWlyPEhhc2hTZXQ8U3RyaW5nSW1wbCo+OjppdGVyYXRvciwg
Ym9vbD4gYWRkUmVzdWx0ID0gc3RyaW5nVGFibGUoKS5hZGQ8VUNoYXJCdWZmZXIsIFVDaGFyQnVm
ZmVyVHJhbnNsYXRvcj4oYnVmKTsKLQotICAgIC8vIElmIHRoZSBzdHJpbmcgaXMgbmV3bHktdHJh
bnNsYXRlZCwgdGhlbiB3ZSBuZWVkIHRvIGFkb3B0IGl0LgotICAgIC8vIFRoZSBib29sZWFuIGlu
IHRoZSBwYWlyIHRlbGxzIHVzIGlmIHRoYXQgaXMgc28uCi0gICAgcmV0dXJuIGFkZFJlc3VsdC5z
ZWNvbmQgPyBhZG9wdFJlZigqYWRkUmVzdWx0LmZpcnN0KSA6ICphZGRSZXN1bHQuZmlyc3Q7Cisg
ICAgcmV0dXJuIHRhYmxlKCkuYWRkKHMsIGxlbmd0aCk7CiB9CiAKIFBhc3NSZWZQdHI8U3RyaW5n
SW1wbD4gQXRvbWljU3RyaW5nOjphZGQoU3RyaW5nSW1wbCogcikKIHsKLSAgICBpZiAoIXIgfHwg
ci0+aW5UYWJsZSgpKQorICAgIGlmICghciB8fCByLT5pc0F0b21pYygpKQogICAgICAgICByZXR1
cm4gcjsKIAotICAgIGlmIChyLT5sZW5ndGgoKSA9PSAwKQotICAgICAgICByZXR1cm4gU3RyaW5n
SW1wbDo6ZW1wdHkoKTsKKyAgICAvLyBUaGUgc2luZ2xldG9uIGVtcHR5IHN0cmluZyBpcyBhdG9t
aWMuCisgICAgQVNTRVJUKHItPmxlbmd0aCgpKTsKICAgICAKLSAgICBTdHJpbmdJbXBsKiByZXN1
bHQgPSAqc3RyaW5nVGFibGUoKS5hZGQocikuZmlyc3Q7Ci0gICAgaWYgKHJlc3VsdCA9PSByKQot
ICAgICAgICByLT5zZXRJblRhYmxlKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4g
dGFibGUoKS5hZGQocik7CiB9CiAKIEF0b21pY1N0cmluZ0ltcGwqIEF0b21pY1N0cmluZzo6Zmlu
ZChjb25zdCBVQ2hhciogcywgdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBleGlzdGluZ0hhc2gp
CkBAIC0yNzMsMTcgKzExNCwxMyBAQCBBdG9taWNTdHJpbmdJbXBsKiBBdG9taWNTdHJpbmc6OmZp
bmQoY29uCiAKICAgICBpZiAobGVuZ3RoID09IDApCiAgICAgICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxBdG9taWNTdHJpbmdJbXBsKj4oU3RyaW5nSW1wbDo6ZW1wdHkoKSk7Ci0KLSAgICBIYXNoQW5k
Q2hhcmFjdGVycyBidWZmZXIgPSB7IGV4aXN0aW5nSGFzaCwgcywgbGVuZ3RoIH07IAotICAgIEhh
c2hTZXQ8U3RyaW5nSW1wbCo+OjppdGVyYXRvciBpdGVyYXRvciA9IHN0cmluZ1RhYmxlKCkuZmlu
ZDxIYXNoQW5kQ2hhcmFjdGVycywgSGFzaEFuZENoYXJhY3RlcnNUcmFuc2xhdG9yPihidWZmZXIp
OwotICAgIGlmIChpdGVyYXRvciA9PSBzdHJpbmdUYWJsZSgpLmVuZCgpKQotICAgICAgICByZXR1
cm4gMDsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QXRvbWljU3RyaW5nSW1wbCo+KCppdGVyYXRv
cik7CisgICAgCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEF0b21pY1N0cmluZ0ltcGwqPih0YWJs
ZSgpLmZpbmQocywgbGVuZ3RoLCBleGlzdGluZ0hhc2gpKTsKIH0KIAogdm9pZCBBdG9taWNTdHJp
bmc6OnJlbW92ZShTdHJpbmdJbXBsKiByKQogewotICAgIHN0cmluZ1RhYmxlKCkucmVtb3ZlKHIp
OworICAgIHRhYmxlKCkucmVtb3ZlKHIpOwogfQogICAgIAogQXRvbWljU3RyaW5nIEF0b21pY1N0
cmluZzo6bG93ZXIoKSBjb25zdApJbmRleDogSmF2YVNjcmlwdENvcmUvd3RmL3RleHQvQXRvbWlj
U3RyaW5nVGFibGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvdGV4dC9BdG9t
aWNTdHJpbmdUYWJsZS5oCShyZXZpc2lvbiAwKQorKysgSmF2YVNjcmlwdENvcmUvd3RmL3RleHQv
QXRvbWljU3RyaW5nVGFibGUuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyNTYgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBBdG9taWNT
dHJpbmdUYWJsZV9oCisjZGVmaW5lIEF0b21pY1N0cmluZ1RhYmxlX2gKKworI2luY2x1ZGUgPHd0
Zi9IYXNoTWFwLmg+CisjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KKyNpbmNsdWRlIDx3dGYvdGV4
dC9TdHJpbmdIYXNoLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nSW1wbC5oPgorCituYW1l
c3BhY2UgV1RGIHsKKworc3RydWN0IENTdHJpbmdUcmFuc2xhdG9yIHsKKyAgICBzdGF0aWMgdW5z
aWduZWQgaGFzaChjb25zdCBjaGFyKiBjKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZ0lt
cGw6OmNvbXB1dGVIYXNoKGMpOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGVxdWFsKFN0cmlu
Z0ltcGwqIHIsIGNvbnN0IGNoYXIqIHMpCisgICAgeworICAgICAgICBBU1NFUlQocik7CisgICAg
ICAgIEFTU0VSVChzKTsKKyAgICAgICAgaW50IGxlbmd0aCA9IHItPmxlbmd0aCgpOworICAgICAg
ICBjb25zdCBVQ2hhciogZCA9IHItPmNoYXJhY3RlcnMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9
IDA7IGkgIT0gbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYyA9IHNb
aV07CisgICAgICAgICAgICBpZiAoZFtpXSAhPSBjKQorICAgICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc1tsZW5ndGhdID09ICdcMCc7CisgICAg
fQorCisgICAgc3RhdGljIHZvaWQgdHJhbnNsYXRlKFN0cmluZ0ltcGwqJiBsb2NhdGlvbiwgY29u
c3QgY2hhciogY29uc3QmIGMsIHVuc2lnbmVkIGhhc2gpCisgICAgeworICAgICAgICBsb2NhdGlv
biA9IFN0cmluZ0ltcGw6OmNyZWF0ZShjKS5yZWxlYXNlUmVmKCk7IAorICAgICAgICBsb2NhdGlv
bi0+c2V0SGFzaChoYXNoKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgVUNoYXJCdWZmZXIgeworICAg
IGNvbnN0IFVDaGFyKiBzOworICAgIHVuc2lnbmVkIGludCBsZW5ndGg7Cit9OworCitzdHJ1Y3Qg
VUNoYXJCdWZmZXJUcmFuc2xhdG9yIHsKKyAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBV
Q2hhckJ1ZmZlciYgYnVmKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZ0ltcGw6OmNvbXB1
dGVIYXNoKGJ1Zi5zLCBidWYubGVuZ3RoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBlcXVh
bChTdHJpbmdJbXBsKiBzdHIsIGNvbnN0IFVDaGFyQnVmZmVyJiBidWYpCisgICAgeworICAgICAg
ICByZXR1cm4gOjplcXVhbChzdHIsIGJ1Zi5zLCBidWYubGVuZ3RoKTsKKyAgICB9CisKKyAgICBz
dGF0aWMgdm9pZCB0cmFuc2xhdGUoU3RyaW5nSW1wbComIGxvY2F0aW9uLCBjb25zdCBVQ2hhckJ1
ZmZlciYgYnVmLCB1bnNpZ25lZCBoYXNoKQorICAgIHsKKyAgICAgICAgbG9jYXRpb24gPSBTdHJp
bmdJbXBsOjpjcmVhdGUoYnVmLnMsIGJ1Zi5sZW5ndGgpLnJlbGVhc2VSZWYoKTsgCisgICAgICAg
IGxvY2F0aW9uLT5zZXRIYXNoKGhhc2gpOworICAgIH0KK307CisKK3N0cnVjdCBIYXNoQW5kQ2hh
cmFjdGVycyB7CisgICAgdW5zaWduZWQgaGFzaDsKKyAgICBjb25zdCBVQ2hhciogY2hhcmFjdGVy
czsKKyAgICB1bnNpZ25lZCBsZW5ndGg7Cit9OworCitzdHJ1Y3QgSGFzaEFuZENoYXJhY3RlcnNU
cmFuc2xhdG9yIHsKKyAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBIYXNoQW5kQ2hhcmFj
dGVycyYgYnVmZmVyKQorICAgIHsKKyAgICAgICAgQVNTRVJUKGJ1ZmZlci5oYXNoID09IFN0cmlu
Z0ltcGw6OmNvbXB1dGVIYXNoKGJ1ZmZlci5jaGFyYWN0ZXJzLCBidWZmZXIubGVuZ3RoKSk7Cisg
ICAgICAgIHJldHVybiBidWZmZXIuaGFzaDsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBlcXVh
bChTdHJpbmdJbXBsKiBjb25zdCYgc3RyaW5nLCBjb25zdCBIYXNoQW5kQ2hhcmFjdGVycyYgYnVm
ZmVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFdlYkNvcmU6OmVxdWFsKHN0cmluZywgYnVmZmVy
LmNoYXJhY3RlcnMsIGJ1ZmZlci5sZW5ndGgpOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHRy
YW5zbGF0ZShTdHJpbmdJbXBsKiYgbG9jYXRpb24sIGNvbnN0IEhhc2hBbmRDaGFyYWN0ZXJzJiBi
dWZmZXIsIHVuc2lnbmVkIGhhc2gpCisgICAgeworICAgICAgICBsb2NhdGlvbiA9IFN0cmluZ0lt
cGw6OmNyZWF0ZShidWZmZXIuY2hhcmFjdGVycywgYnVmZmVyLmxlbmd0aCkucmVsZWFzZVJlZigp
OworICAgICAgICBsb2NhdGlvbi0+c2V0SGFzaChoYXNoKTsKKyAgICB9Cit9OworCit0ZW1wbGF0
ZTxib29sIGlzSWRlbnRpZmVyVGFibGU+CitjbGFzcyBJZGVudGlmaWVyT3JBdG9taWNTdHJpbmdU
YWJsZSA6IHB1YmxpYyBGYXN0QWxsb2NCYXNlIHsKK3B1YmxpYzoKKyAgICB+SWRlbnRpZmllck9y
QXRvbWljU3RyaW5nVGFibGUoKTsKKworICAgIFBhc3NSZWZQdHI8U3RyaW5nSW1wbD4gYWRkKFN0
cmluZ0ltcGwqIHZhbHVlKTsKKyAgICBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IGFkZChjb25zdCBj
aGFyKik7CisgICAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBhZGQoY29uc3QgVUNoYXIqLCB1bnNp
Z25lZCk7CisgICAgUGFzc1JlZlB0cjxTdHJpbmdJbXBsPiBhZGQoY29uc3QgVUNoYXIqLCB1bnNp
Z25lZCwgdW5zaWduZWQgZXhpc3RpbmdIYXNoKTsKKworICAgIHZvaWQgcmVtb3ZlKFN0cmluZ0lt
cGwqIHIpIHsgbV90YWJsZS5yZW1vdmUocik7IH0KKworICAgIFN0cmluZ0ltcGwqIGZpbmQoY29u
c3QgVUNoYXIqLCB1bnNpZ25lZCwgdW5zaWduZWQgZXhpc3RpbmdIYXNoKTsKKworcHJpdmF0ZToK
KyAgICBIYXNoU2V0PFN0cmluZ0ltcGwqPiBtX3RhYmxlOworfTsKKwordGVtcGxhdGU8Ym9vbCBp
c0lkZW50aWZpZXJUYWJsZT4KK0lkZW50aWZpZXJPckF0b21pY1N0cmluZ1RhYmxlPGlzSWRlbnRp
ZmllclRhYmxlPjo6fklkZW50aWZpZXJPckF0b21pY1N0cmluZ1RhYmxlKCkKK3sKKyAgICBIYXNo
U2V0PFN0cmluZ0ltcGwqPjo6aXRlcmF0b3IgZW5kID0gbV90YWJsZS5lbmQoKTsKKyAgICBmb3Ig
KEhhc2hTZXQ8U3RyaW5nSW1wbCo+OjppdGVyYXRvciBpdGVyID0gbV90YWJsZS5iZWdpbigpOyBp
dGVyICE9IGVuZDsgKytpdGVyKSB7CisgICAgICAgIGlmIChpc0lkZW50aWZpZXJUYWJsZSkKKyAg
ICAgICAgICAgICgqaXRlciktPnNldElzSWRlbnRpZmllcihmYWxzZSk7CisgICAgICAgIGVsc2UK
KyAgICAgICAgICAgICgqaXRlciktPnNldElzQXRvbWljKGZhbHNlKTsKKyAgICB9Cit9CisKK3Rl
bXBsYXRlPGJvb2wgaXNJZGVudGlmaWVyVGFibGU+CitQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IElk
ZW50aWZpZXJPckF0b21pY1N0cmluZ1RhYmxlPGlzSWRlbnRpZmllclRhYmxlPjo6YWRkKFN0cmlu
Z0ltcGwqIHZhbHVlKQoreworICAgIEFTU0VSVCh2YWx1ZSk7CisgICAgQVNTRVJUKHZhbHVlLT5s
ZW5ndGgoKSk7CisKKyAgICBzdGQ6OnBhaXI8SGFzaFNldDxTdHJpbmdJbXBsKj46Oml0ZXJhdG9y
LCBib29sPiByZXN1bHQgPSBtX3RhYmxlLmFkZCh2YWx1ZSk7CisgICAgU3RyaW5nSW1wbCogaWRl
bnRpZmllciA9ICpyZXN1bHQuZmlyc3Q7CisKKyAgICBpZiAocmVzdWx0LnNlY29uZCkgeworICAg
ICAgICBpZiAoaXNJZGVudGlmaWVyVGFibGUpCisgICAgICAgICAgICBpZGVudGlmaWVyLT5zZXRJ
c0lkZW50aWZpZXIodHJ1ZSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGlkZW50aWZpZXIt
PnNldElzQXRvbWljKHRydWUpOworICAgIH0KKworICAgIHJldHVybiBpZGVudGlmaWVyOworfQor
Cit0ZW1wbGF0ZTxib29sIGlzSWRlbnRpZmllclRhYmxlPgorUGFzc1JlZlB0cjxTdHJpbmdJbXBs
PiBJZGVudGlmaWVyT3JBdG9taWNTdHJpbmdUYWJsZTxpc0lkZW50aWZpZXJUYWJsZT46OmFkZChj
b25zdCBjaGFyKiBjKQoreworICAgIEFTU0VSVChjKTsKKyAgICBBU1NFUlQoKmMpOworCisgICAg
c3RkOjpwYWlyPEhhc2hTZXQ8U3RyaW5nSW1wbCo+OjppdGVyYXRvciwgYm9vbD4gcmVzdWx0ID0g
bV90YWJsZS5hZGQ8Y29uc3QgY2hhciosIENTdHJpbmdUcmFuc2xhdG9yPihjKTsKKyAgICBTdHJp
bmdJbXBsKiBpZGVudGlmaWVyID0gKnJlc3VsdC5maXJzdDsKKworICAgIC8vIElmIHRoZSBzdHJp
bmcgaXMgbmV3bHktdHJhbnNsYXRlZCwgdGhlbiB3ZSBuZWVkIHRvIGFkb3B0IGl0LgorICAgIC8v
IFRoZSBib29sZWFuIGluIHRoZSBwYWlyIHRlbGxzIHVzIGlmIHRoYXQgaXMgc28uCisgICAgaWYg
KHJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgaWYgKGlzSWRlbnRpZmllclRhYmxlKQorICAgICAg
ICAgICAgaWRlbnRpZmllci0+c2V0SXNJZGVudGlmaWVyKHRydWUpOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICBpZGVudGlmaWVyLT5zZXRJc0F0b21pYyh0cnVlKTsKKyAgICAgICAgcmV0dXJu
IGFkb3B0UmVmKGlkZW50aWZpZXIpOworICAgIH0KKworICAgIHJldHVybiBpZGVudGlmaWVyOwor
fQorCit0ZW1wbGF0ZTxib29sIGlzSWRlbnRpZmllclRhYmxlPgorUGFzc1JlZlB0cjxTdHJpbmdJ
bXBsPiBJZGVudGlmaWVyT3JBdG9taWNTdHJpbmdUYWJsZTxpc0lkZW50aWZpZXJUYWJsZT46OmFk
ZChjb25zdCBVQ2hhciogcywgdW5zaWduZWQgbGVuZ3RoKQoreworICAgIEFTU0VSVChzKTsKKyAg
ICBBU1NFUlQobGVuZ3RoKTsKKworICAgIFVDaGFyQnVmZmVyIGJ1ZiA9IHtzLCBsZW5ndGh9Owor
ICAgIHN0ZDo6cGFpcjxIYXNoU2V0PFN0cmluZ0ltcGwqPjo6aXRlcmF0b3IsIGJvb2w+IHJlc3Vs
dCA9IG1fdGFibGUuYWRkPFVDaGFyQnVmZmVyLCBVQ2hhckJ1ZmZlclRyYW5zbGF0b3I+KGJ1Zik7
CisgICAgU3RyaW5nSW1wbCogaWRlbnRpZmllciA9ICpyZXN1bHQuZmlyc3Q7CisKKyAgICAvLyBJ
ZiB0aGUgc3RyaW5nIGlzIG5ld2x5LXRyYW5zbGF0ZWQsIHRoZW4gd2UgbmVlZCB0byBhZG9wdCBp
dC4KKyAgICAvLyBUaGUgYm9vbGVhbiBpbiB0aGUgcGFpciB0ZWxscyB1cyBpZiB0aGF0IGlzIHNv
LgorICAgIGlmIChyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgIGlmIChpc0lkZW50aWZpZXJUYWJs
ZSkKKyAgICAgICAgICAgIGlkZW50aWZpZXItPnNldElzSWRlbnRpZmllcih0cnVlKTsKKyAgICAg
ICAgZWxzZQorICAgICAgICAgICAgaWRlbnRpZmllci0+c2V0SXNBdG9taWModHJ1ZSk7CisgICAg
ICAgIHJldHVybiBhZG9wdFJlZihpZGVudGlmaWVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gaWRl
bnRpZmllcjsKK30KKwordGVtcGxhdGU8Ym9vbCBpc0lkZW50aWZpZXJUYWJsZT4KK1Bhc3NSZWZQ
dHI8U3RyaW5nSW1wbD4gSWRlbnRpZmllck9yQXRvbWljU3RyaW5nVGFibGU8aXNJZGVudGlmaWVy
VGFibGU+OjphZGQoY29uc3QgVUNoYXIqIHMsIHVuc2lnbmVkIGxlbmd0aCwgdW5zaWduZWQgZXhp
c3RpbmdIYXNoKQoreworICAgIEFTU0VSVChzKTsKKyAgICBBU1NFUlQobGVuZ3RoKTsKKyAgICBB
U1NFUlQoZXhpc3RpbmdIYXNoKTsKKworICAgIEhhc2hBbmRDaGFyYWN0ZXJzIGJ1ZmZlciA9IHsg
ZXhpc3RpbmdIYXNoLCBzLCBsZW5ndGggfTsgCisgICAgc3RkOjpwYWlyPEhhc2hTZXQ8U3RyaW5n
SW1wbCo+OjppdGVyYXRvciwgYm9vbD4gcmVzdWx0ID0gbV90YWJsZS5hZGQ8SGFzaEFuZENoYXJh
Y3RlcnMsIEhhc2hBbmRDaGFyYWN0ZXJzVHJhbnNsYXRvcj4oYnVmZmVyKTsKKyAgICBTdHJpbmdJ
bXBsKiBpZGVudGlmaWVyID0gKnJlc3VsdC5maXJzdDsKKworICAgIC8vIElmIHRoZSBzdHJpbmcg
aXMgbmV3bHktdHJhbnNsYXRlZCwgdGhlbiB3ZSBuZWVkIHRvIGFkb3B0IGl0LgorICAgIC8vIFRo
ZSBib29sZWFuIGluIHRoZSBwYWlyIHRlbGxzIHVzIGlmIHRoYXQgaXMgc28uCisgICAgaWYgKHJl
c3VsdC5zZWNvbmQpIHsKKyAgICAgICAgaWYgKGlzSWRlbnRpZmllclRhYmxlKQorICAgICAgICAg
ICAgaWRlbnRpZmllci0+c2V0SXNJZGVudGlmaWVyKHRydWUpOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICBpZGVudGlmaWVyLT5zZXRJc0F0b21pYyh0cnVlKTsKKyAgICAgICAgcmV0dXJuIGFk
b3B0UmVmKGlkZW50aWZpZXIpOworICAgIH0KKworICAgIHJldHVybiBpZGVudGlmaWVyOworfQor
Cit0ZW1wbGF0ZTxib29sIGlzSWRlbnRpZmllclRhYmxlPgorU3RyaW5nSW1wbCogSWRlbnRpZmll
ck9yQXRvbWljU3RyaW5nVGFibGU8aXNJZGVudGlmaWVyVGFibGU+OjpmaW5kKGNvbnN0IFVDaGFy
KiBzICwgdW5zaWduZWQgbGVuZ3RoLCB1bnNpZ25lZCBleGlzdGluZ0hhc2gpCit7CisgICAgQVNT
RVJUKHMpOworICAgIEFTU0VSVChsZW5ndGgpOworICAgIEFTU0VSVChleGlzdGluZ0hhc2gpOwor
CisgICAgSGFzaEFuZENoYXJhY3RlcnMgYnVmZmVyID0geyBleGlzdGluZ0hhc2gsIHMsIGxlbmd0
aCB9OyAKKyAgICBIYXNoU2V0PFN0cmluZ0ltcGwqPjo6aXRlcmF0b3IgaXRlcmF0b3IgPSBtX3Rh
YmxlLmZpbmQ8SGFzaEFuZENoYXJhY3RlcnMsIEhhc2hBbmRDaGFyYWN0ZXJzVHJhbnNsYXRvcj4o
YnVmZmVyKTsKKyAgICBpZiAoaXRlcmF0b3IgPT0gbV90YWJsZS5lbmQoKSkKKyAgICAgICAgcmV0
dXJuIDA7CisgICAgcmV0dXJuICppdGVyYXRvcjsKK30KKworfQorCisjaWYgVVNFKEpTQykKKy8v
IEZJWE1FOiBUaGlzIGlzIGEgdGVtcG9yYXJ5IGxheWVyaW5nIHZpb2xhdGlvbiB3aGlsZSB3ZSBt
b3ZlIG1vcmUgc3RyaW5nIGNvZGUgdG8gV1RGLgorbmFtZXNwYWNlIEpTQyB7CitjbGFzcyBJZGVu
dGlmaWVyVGFibGUgOiBwdWJsaWMgV1RGOjpJZGVudGlmaWVyT3JBdG9taWNTdHJpbmdUYWJsZTx0
cnVlPiB7fTsKK30KKyNlbmRpZgorCisvLyBGSVhNRTogVGhpcyBpcyBhIHRlbXBvcmFyeSBsYXll
cmluZyB2aW9sYXRpb24gd2hpbGUgd2UgbW92ZSBtb3JlIHN0cmluZyBjb2RlIHRvIFdURi4KK25h
bWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIEF0b21pY1N0cmluZ1RhYmxlIDogcHVibGljIFdURjo6
SWRlbnRpZmllck9yQXRvbWljU3RyaW5nVGFibGU8ZmFsc2U+IHt9OworfQorI2VuZGlmIC8vIEF0
b21pY1N0cmluZ1RhYmxlX2gKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi90ZXh0L1N0cmluZ0lt
cGwuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIEphdmFTY3JpcHRDb3JlL3d0Zi90ZXh0L1N0cmluZ0ltcGwu
Y3BwCShyZXZpc2lvbiA1ODAyOCkKKysrIEphdmFTY3JpcHRDb3JlL3d0Zi90ZXh0L1N0cmluZ0lt
cGwuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw2ICszMCw3IEBACiAjaW5jbHVkZSAiU3RyaW5n
SGFzaC5oIgogI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KICNpbmNsdWRlIDx3dGYvV1RG
VGhyZWFkRGF0YS5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L0F0b21pY1N0cmluZ1RhYmxlLmg+CiAK
IHVzaW5nIG5hbWVzcGFjZSBXVEY7CiB1c2luZyBuYW1lc3BhY2UgVW5pY29kZTsKQEAgLTQyLDcg
KzQzLDcgQEAgU3RyaW5nSW1wbDo6flN0cmluZ0ltcGwoKQogewogICAgIEFTU0VSVCghaXNTdGF0
aWMoKSk7CiAKLSAgICBpZiAoaW5UYWJsZSgpKQorICAgIGlmIChpc0F0b21pYygpKQogICAgICAg
ICBBdG9taWNTdHJpbmc6OnJlbW92ZSh0aGlzKTsKICNpZiBVU0UoSlNDKQogICAgIGlmIChpc0lk
ZW50aWZpZXIoKSkKSW5kZXg6IEphdmFTY3JpcHRDb3JlL3d0Zi90ZXh0L1N0cmluZ0ltcGwuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvdGV4dC9TdHJpbmdJbXBsLmgJKHJldmlz
aW9uIDU4MDI4KQorKysgSmF2YVNjcmlwdENvcmUvd3RmL3RleHQvU3RyaW5nSW1wbC5oCSh3b3Jr
aW5nIGNvcHkpCkBAIC00MiwxMCArNDIsMTEgQEAgdHlwZWRlZiBjb25zdCBzdHJ1Y3QgX19DRlN0
cmluZyAqIENGU3RyaQogCiAvLyBGSVhNRTogVGhpcyBpcyBhIHRlbXBvcmFyeSBsYXllcmluZyB2
aW9sYXRpb24gd2hpbGUgd2UgbW92ZSBzdHJpbmcgY29kZSB0byBXVEYuCiAvLyBMYW5kaW5nIHRo
ZSBmaWxlIG1vdmVzIGluIG9uZSBwYXRjaCwgd2lsbCBmb2xsb3cgb24gd2l0aCBwYXRjaGVzIHRv
IGNoYW5nZSB0aGUgbmFtZXNwYWNlcy4KLW5hbWVzcGFjZSBKU0MgeworbmFtZXNwYWNlIFdURiB7
CiAKLXN0cnVjdCBJZGVudGlmaWVyQ1N0cmluZ1RyYW5zbGF0b3I7Ci1zdHJ1Y3QgSWRlbnRpZmll
clVDaGFyQnVmZmVyVHJhbnNsYXRvcjsKK3N0cnVjdCBDU3RyaW5nVHJhbnNsYXRvcjsKK3N0cnVj
dCBVQ2hhckJ1ZmZlclRyYW5zbGF0b3I7CitzdHJ1Y3QgSGFzaEFuZENoYXJhY3RlcnNUcmFuc2xh
dG9yOwogCiB9CiAKQEAgLTU1LDEwICs1Niw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAogY2xh
c3MgU3RyaW5nQnVmZmVyOwogCi1zdHJ1Y3QgQ1N0cmluZ1RyYW5zbGF0b3I7Ci1zdHJ1Y3QgSGFz
aEFuZENoYXJhY3RlcnNUcmFuc2xhdG9yOwogc3RydWN0IFN0cmluZ0hhc2g7Ci1zdHJ1Y3QgVUNo
YXJCdWZmZXJUcmFuc2xhdG9yOwogCiBlbnVtIFRleHRDYXNlU2Vuc2l0aXZpdHkgeyBUZXh0Q2Fz
ZVNlbnNpdGl2ZSwgVGV4dENhc2VJbnNlbnNpdGl2ZSB9OwogCkBAIC02NywxMSArNjUsOSBAQCB0
eXBlZGVmIENyb3NzVGhyZWFkUmVmQ291bnRlZDxTaGFyYWJsZVVDCiB0eXBlZGVmIGJvb2wgKCpD
aGFyYWN0ZXJNYXRjaEZ1bmN0aW9uUHRyKShVQ2hhcik7CiAKIGNsYXNzIFN0cmluZ0ltcGwgOiBw
dWJsaWMgU3RyaW5nSW1wbEJhc2UgewotICAgIGZyaWVuZCBzdHJ1Y3QgSlNDOjpJZGVudGlmaWVy
Q1N0cmluZ1RyYW5zbGF0b3I7Ci0gICAgZnJpZW5kIHN0cnVjdCBKU0M6OklkZW50aWZpZXJVQ2hh
ckJ1ZmZlclRyYW5zbGF0b3I7Ci0gICAgZnJpZW5kIHN0cnVjdCBDU3RyaW5nVHJhbnNsYXRvcjsK
LSAgICBmcmllbmQgc3RydWN0IEhhc2hBbmRDaGFyYWN0ZXJzVHJhbnNsYXRvcjsKLSAgICBmcmll
bmQgc3RydWN0IFVDaGFyQnVmZmVyVHJhbnNsYXRvcjsKKyAgICBmcmllbmQgc3RydWN0IFdURjo6
Q1N0cmluZ1RyYW5zbGF0b3I7CisgICAgZnJpZW5kIHN0cnVjdCBXVEY6OlVDaGFyQnVmZmVyVHJh
bnNsYXRvcjsKKyAgICBmcmllbmQgc3RydWN0IFdURjo6SGFzaEFuZENoYXJhY3RlcnNUcmFuc2xh
dG9yOwogcHJpdmF0ZToKICAgICAvLyBVc2VkIHRvIGNvbnN0cnVjdCBzdGF0aWMgc3RyaW5ncywg
d2hpY2ggaGF2ZSBhbiBzcGVjaWFsIHJlZkNvdW50IHRoYXQgY2FuIG5ldmVyIGhpdCB6ZXJvLgog
ICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgc3RhdGljIHN0cmluZyB3aWxsIG5ldmVyIGJlIGRl
c3Ryb3llZCwgd2hpY2ggaXMgaW1wb3J0YW50IGJlY2F1c2UKQEAgLTIyMCw4ICsyMTYsMTUgQEAg
cHVibGljOgogCiAgICAgYm9vbCBoYXNUZXJtaW5hdGluZ051bGxDaGFyYWN0ZXIoKSBjb25zdCB7
IHJldHVybiBtX3JlZkNvdW50QW5kRmxhZ3MgJiBzX3JlZkNvdW50RmxhZ0hhc1Rlcm1pbmF0aW5n
TnVsbENoYXJhY3RlcjsgfQogCi0gICAgYm9vbCBpblRhYmxlKCkgY29uc3QgeyByZXR1cm4gbV9y
ZWZDb3VudEFuZEZsYWdzICYgc19yZWZDb3VudEZsYWdJblRhYmxlOyB9Ci0gICAgdm9pZCBzZXRJ
blRhYmxlKCkgeyBtX3JlZkNvdW50QW5kRmxhZ3MgfD0gc19yZWZDb3VudEZsYWdJblRhYmxlOyB9
CisgICAgYm9vbCBpc0F0b21pYygpIGNvbnN0IHsgcmV0dXJuIG1fcmVmQ291bnRBbmRGbGFncyAm
IHNfcmVmQ291bnRGbGFnSXNBdG9taWM7IH0KKyAgICB2b2lkIHNldElzQXRvbWljKGJvb2wgaW5U
YWJsZSkKKyAgICB7CisgICAgICAgIEFTU0VSVCghaXNTdGF0aWMoKSk7CisgICAgICAgIGlmIChp
blRhYmxlKQorICAgICAgICAgICAgbV9yZWZDb3VudEFuZEZsYWdzIHw9IHNfcmVmQ291bnRGbGFn
SXNBdG9taWM7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1fcmVmQ291bnRBbmRGbGFncyAm
PSBzX3JlZkNvdW50RmxhZ0lzQXRvbWljOworICAgIH0KIAogICAgIHVuc2lnbmVkIGhhc2goKSBj
b25zdCB7IGlmICghbV9oYXNoKSBtX2hhc2ggPSBjb21wdXRlSGFzaChtX2RhdGEsIG1fbGVuZ3Ro
KTsgcmV0dXJuIG1faGFzaDsgfQogICAgIHVuc2lnbmVkIGV4aXN0aW5nSGFzaCgpIGNvbnN0IHsg
QVNTRVJUKG1faGFzaCk7IHJldHVybiBtX2hhc2g7IH0KQEAgLTMzMCw2ICszMzMsMzggQEAgcHJp
dmF0ZToKIGJvb2wgZXF1YWwoY29uc3QgU3RyaW5nSW1wbCosIGNvbnN0IFN0cmluZ0ltcGwqKTsK
IGJvb2wgZXF1YWwoY29uc3QgU3RyaW5nSW1wbCosIGNvbnN0IGNoYXIqKTsKIGlubGluZSBib29s
IGVxdWFsKGNvbnN0IGNoYXIqIGEsIFN0cmluZ0ltcGwqIGIpIHsgcmV0dXJuIGVxdWFsKGIsIGEp
OyB9CitpbmxpbmUgYm9vbCBlcXVhbChTdHJpbmdJbXBsKiBzdHJpbmcsIGNvbnN0IFVDaGFyKiBj
aGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgpCit7CisgICAgaWYgKHN0cmluZy0+bGVuZ3RoKCkg
IT0gbGVuZ3RoKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBGSVhNRTogcGVyaGFw
cyB3ZSBzaG91bGQgaGF2ZSBhIG1vcmUgYWJzdHJhY3QgbWFjcm8gdGhhdCBpbmRpY2F0ZXMgd2hl
bgorICAgIC8vIGdvaW5nIDQgYnl0ZXMgYXQgYSB0aW1lIGlzIHVuc2FmZQorI2lmIENQVShBUk0p
IHx8IENQVShTSDQpCisgICAgY29uc3QgVUNoYXIqIHN0cmluZ0NoYXJhY3RlcnMgPSBzdHJpbmct
PmNoYXJhY3RlcnMoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IGxlbmd0aDsgKytp
KSB7CisgICAgICAgIGlmICgqc3RyaW5nQ2hhcmFjdGVycysrICE9ICpjaGFyYWN0ZXJzKyspCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworI2Vsc2UK
KyAgICAvKiBEbyBpdCA0LWJ5dGVzLWF0LWEtdGltZSBvbiBhcmNoaXRlY3R1cmVzIHdoZXJlIGl0
J3Mgc2FmZSAqLworCisgICAgY29uc3QgdWludDMyX3QqIHN0cmluZ0NoYXJhY3RlcnMgPSByZWlu
dGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90Kj4oc3RyaW5nLT5jaGFyYWN0ZXJzKCkpOworICAg
IGNvbnN0IHVpbnQzMl90KiBidWZmZXJDaGFyYWN0ZXJzID0gcmVpbnRlcnByZXRfY2FzdDxjb25z
dCB1aW50MzJfdCo+KGNoYXJhY3RlcnMpOworCisgICAgdW5zaWduZWQgaGFsZkxlbmd0aCA9IGxl
bmd0aCA+PiAxOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gaGFsZkxlbmd0aDsgKytp
KSB7CisgICAgICAgIGlmICgqc3RyaW5nQ2hhcmFjdGVycysrICE9ICpidWZmZXJDaGFyYWN0ZXJz
KyspCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGxlbmd0aCAm
IDEgJiYgICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQxNl90Kj4oc3RyaW5nQ2hhcmFjdGVy
cykgIT0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDE2X3QqPihidWZmZXJDaGFyYWN0ZXJz
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIHRydWU7CisjZW5kaWYKK30K
IAogYm9vbCBlcXVhbElnbm9yaW5nQ2FzZShTdHJpbmdJbXBsKiwgU3RyaW5nSW1wbCopOwogYm9v
bCBlcXVhbElnbm9yaW5nQ2FzZShTdHJpbmdJbXBsKiwgY29uc3QgY2hhciopOwpAQCAtMzcyLDYg
KzQwNyw3IEBAIGlubGluZSBQYXNzUmVmUHRyPFN0cmluZ0ltcGw+IFN0cmluZ0ltcGwKIH0KIAog
dXNpbmcgV2ViQ29yZTo6ZXF1YWw7Cit1c2luZyBXZWJDb3JlOjpTdHJpbmdJbXBsOwogCiBuYW1l
c3BhY2UgV1RGIHsKIApJbmRleDogSmF2YVNjcmlwdENvcmUvd3RmL3RleHQvU3RyaW5nSW1wbEJh
c2UuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBKYXZhU2NyaXB0Q29yZS93dGYvdGV4dC9TdHJpbmdJbXBsQmFz
ZS5oCShyZXZpc2lvbiA1ODAyOCkKKysrIEphdmFTY3JpcHRDb3JlL3d0Zi90ZXh0L1N0cmluZ0lt
cGxCYXNlLmgJKHdvcmtpbmcgY29weSkKQEAgLTYwLDcgKzYwLDcgQEAgcHJvdGVjdGVkOgogCiAg
ICAgZW51bSBTdGF0aWNTdHJpbmdDb25zdHJ1Y3RUeXBlIHsgQ29uc3RydWN0U3RhdGljU3RyaW5n
IH07CiAgICAgU3RyaW5nSW1wbEJhc2UodW5zaWduZWQgbGVuZ3RoLCBTdGF0aWNTdHJpbmdDb25z
dHJ1Y3RUeXBlKQotICAgICAgICA6IG1fcmVmQ291bnRBbmRGbGFncyhzX3JlZkNvdW50RmxhZ1N0
YXRpYyB8IHNfcmVmQ291bnRGbGFnSXNJZGVudGlmaWVyIHwgQnVmZmVyT3duZWQpCisgICAgICAg
IDogbV9yZWZDb3VudEFuZEZsYWdzKHNfcmVmQ291bnRGbGFnU3RhdGljIHwgc19yZWZDb3VudEZs
YWdJc0F0b21pYyB8IHNfcmVmQ291bnRGbGFnSXNJZGVudGlmaWVyIHwgQnVmZmVyT3duZWQpCiAg
ICAgICAgICwgbV9sZW5ndGgobGVuZ3RoKQogICAgIHsKICAgICAgICAgQVNTRVJUKGlzU3RyaW5n
SW1wbCgpKTsKQEAgLTgzLDcgKzgzLDcgQEAgcHJvdGVjdGVkOgogICAgIHN0YXRpYyBjb25zdCB1
bnNpZ25lZCBzX3JlZkNvdW50SW5jcmVtZW50ID0gMHg4MDsKICAgICBzdGF0aWMgY29uc3QgdW5z
aWduZWQgc19yZWZDb3VudEZsYWdTdGF0aWMgPSAweDQwOwogICAgIHN0YXRpYyBjb25zdCB1bnNp
Z25lZCBzX3JlZkNvdW50RmxhZ0hhc1Rlcm1pbmF0aW5nTnVsbENoYXJhY3RlciA9IDB4MjA7Ci0g
ICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNfcmVmQ291bnRGbGFnSW5UYWJsZSA9IDB4MTA7Cisg
ICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNfcmVmQ291bnRGbGFnSXNBdG9taWMgPSAweDEwOwog
ICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzX3JlZkNvdW50RmxhZ1Nob3VsZFJlcG9ydGVkQ29z
dCA9IDB4ODsKICAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc19yZWZDb3VudEZsYWdJc0lkZW50
aWZpZXIgPSAweDQ7CiAgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNfcmVmQ291bnRNYXNrQnVm
ZmVyT3duZXJzaGlwID0gMHgzOwo=
</data>
<flag name="review"
          id="37896"
          type_id="1"
          status="+"
          setter="ggaren"
    />
          </attachment>
      

    </bug>

</bugzilla>