<?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>206791</bug_id>
          
          <creation_ts>2020-01-24 18:53:55 -0800</creation_ts>
          <short_desc>Move singleton Intl string locales out of JSGlobalObject.</short_desc>
          <delta_ts>2020-01-28 09:05:56 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=206779</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Mark Lam">mark.lam</reporter>
          <assigned_to name="Mark Lam">mark.lam</assigned_to>
          <cc>aakash_jain</cc>
    
    <cc>andy</cc>
    
    <cc>benjamin</cc>
    
    <cc>cdumez</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>darin</cc>
    
    <cc>dbates</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>keith_miller</cc>
    
    <cc>msaboff</cc>
    
    <cc>saam</cc>
    
    <cc>tzagallo</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>ysuzuki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1610970</commentid>
    <comment_count>0</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2020-01-24 18:53:55 -0800</bug_when>
    <thetext>We&apos;re creating an instance of these for each JSGlobalObject when they can be a global singleton since they are always initialized with the same intl data (barring a mid-flight change in intl settings, which we don&apos;t support even in the existing code).

Also fix a bug in StringImpl::createStaticStringImpl(): I forgot to set its hash value when I introduced it.  StaticStringImpls require that its hash code be set ahead of time, and cannot be mutated at runtime.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1610971</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2020-01-24 18:54:36 -0800</bug_when>
    <thetext>&lt;rdar://problem/58889037&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1610976</commentid>
    <comment_count>2</comment_count>
    <who name="Andy VanWagoner">andy</who>
    <bug_when>2020-01-24 19:08:56 -0800</bug_when>
    <thetext>That sounds good to me. I don’t know of any reason not to use a global singleton.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1610977</commentid>
    <comment_count>3</comment_count>
      <attachid>388755</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2020-01-24 19:10:57 -0800</bug_when>
    <thetext>Created attachment 388755
proposed patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1610978</commentid>
    <comment_count>4</comment_count>
      <attachid>388755</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2020-01-24 19:13:28 -0800</bug_when>
    <thetext>Comment on attachment 388755
proposed patch.

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

&gt; Source/JavaScriptCore/runtime/IntlPluralRules.cpp:124
&gt; -    const HashSet&lt;String&gt; availableLocales = globalObject-&gt;intlNumberFormatAvailableLocales();
&gt; +    const HashSet&lt;String&gt;&amp; availableLocales = intlNumberFormatAvailableLocales();

Andy, can you confirm that it is intentional to use intlNumberFormatAvailableLocales() instead of intlPluralRulesAvailableLocales() here?  I noticed that intlPluralRulesAvailableLocales() is called anywhere, which may me suspicious of this code.  Thought you might know better what is correct.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1610979</commentid>
    <comment_count>5</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2020-01-24 19:14:36 -0800</bug_when>
    <thetext>(In reply to Mark Lam from comment #4)
&gt; Andy, can you confirm that it is intentional to use
&gt; intlNumberFormatAvailableLocales() instead of
&gt; intlPluralRulesAvailableLocales() here?  I noticed that
&gt; intlPluralRulesAvailableLocales() is called anywhere, which may me
&gt; suspicious of this code.  Thought you might know better what is correct.

typo: I actually meant &quot;intlPluralRulesAvailableLocales() is NOT called anywhere&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1610980</commentid>
    <comment_count>6</comment_count>
    <who name="Andy VanWagoner">andy</who>
    <bug_when>2020-01-24 19:20:28 -0800</bug_when>
    <thetext>(In reply to Mark Lam from comment #5)
&gt; (In reply to Mark Lam from comment #4)
&gt; &gt; Andy, can you confirm that it is intentional to use
&gt; &gt; intlNumberFormatAvailableLocales() instead of
&gt; &gt; intlPluralRulesAvailableLocales() here?  I noticed that
&gt; &gt; intlPluralRulesAvailableLocales() is called anywhere, which may me
&gt; &gt; suspicious of this code.  Thought you might know better what is correct.
&gt; 
&gt; typo: I actually meant &quot;intlPluralRulesAvailableLocales() is NOT called
&gt; anywhere&quot;.

I’ll double check.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1610985</commentid>
    <comment_count>7</comment_count>
    <who name="Andy VanWagoner">andy</who>
    <bug_when>2020-01-24 20:21:47 -0800</bug_when>
    <thetext>The ECMA 402 spec calls for %PluralRules%.[[AvailableLocales]] to be passed into ResolveLocale during InitializePluralRules[0] and used in supportedLocalesOf[1]. I believe this is what intlPluralRulesAvailableLocales was created for.

However, there is no uplrules_getAvailable[2], so intlPluralRulesAvailableLocales was just using uloc_getAvailable (all available locales). It seems a better assumption that number formatting supporting locales would have plural rules support, than all known locales, and in IntlPluralRules::select, sometimes calls unum_formatDouble &amp; unum_formatDouble too, so it seems appropriate to draw the available locales from unum_getAvailable.

IntlPluralRules::initializePluralRules[3] and IntlPluralRulesConstructorFuncSupportedLocalesOf[4] are already just using intlNumberFormatAvailableLocales, and I don&apos;t see a reason to duplicate that list into intlPluralRulesAvailableLocales. Let&apos;s just drop it entirely.

In JSC %PluralRules%.[[AvailableLocales]] will just be the same as %NumberFormat%.[[AvailableLocales]].

[0] https://tc39.es/ecma402/#sec-initializepluralrules
[1] https://tc39.es/ecma402/#sec-intl.pluralrules.supportedlocalesof
[2] https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/upluralrules_8h.html
[3] https://trac.webkit.org/browser/webkit/trunk/Source/JavaScriptCore/runtime/IntlPluralRules.cpp#L124
[4] https://trac.webkit.org/browser/webkit/trunk/Source/JavaScriptCore/runtime/IntlPluralRulesConstructor.cpp#L120</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1610988</commentid>
    <comment_count>8</comment_count>
    <who name="Andy VanWagoner">andy</who>
    <bug_when>2020-01-24 20:27:25 -0800</bug_when>
    <thetext>We could have intlPluralRulesAvailableLocales be a reference to intlNumberFormatAvailableLocales, and use that in IntlPluralRules::initializePluralRules and IntlPluralRulesConstructorFuncSupportedLocalesOf.
That would remove the suspect use of intlNumberFormatAvailableLocales.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1610991</commentid>
    <comment_count>9</comment_count>
      <attachid>388755</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2020-01-24 20:59:14 -0800</bug_when>
    <thetext>Comment on attachment 388755
proposed patch.

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

r=me, nice.

&gt; Source/JavaScriptCore/runtime/IntlObject.h:62
&gt; +const HashSet&lt;String&gt;&amp; intlNumberFormatAvailableLocales();

Define intlPluralRulesAvailableLocales.

&gt;&gt; Source/JavaScriptCore/runtime/IntlPluralRules.cpp:124
&gt;&gt; +    const HashSet&lt;String&gt;&amp; availableLocales = intlNumberFormatAvailableLocales();
&gt; 
&gt; Andy, can you confirm that it is intentional to use intlNumberFormatAvailableLocales() instead of intlPluralRulesAvailableLocales() here?  I noticed that intlPluralRulesAvailableLocales() is called anywhere, which may me suspicious of this code.  Thought you might know better what is correct.

Thanks, Andy. Yeah, seems that,

defining intlPluralRulesAvailableLocales, which just calls intlNumberFormatAvailableLocales() internally.

Would be nice.

&gt; Source/JavaScriptCore/runtime/IntlPluralRulesConstructor.cpp:121
&gt; +    const HashSet&lt;String&gt;&amp; availableLocales = intlNumberFormatAvailableLocales();

Yeah, use intlPluralRulesAvailableLocales, which should just call intlNumberFormatAvailableLocales() internally.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1611047</commentid>
    <comment_count>10</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2020-01-25 09:04:53 -0800</bug_when>
    <thetext>Thanks for the reviews.  I&apos;ve applied the requested changes.

Landed in r255120: &lt;http://trac.webkit.org/r255120&gt;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1611050</commentid>
    <comment_count>11</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2020-01-25 09:09:31 -0800</bug_when>
    <thetext>FYI, this patch also contains a fix for a bug in r255112:&lt;http://trac.webkit.org/r255112&gt; which was landed for https://bugs.webkit.org/show_bug.cgi?id=20677.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1611064</commentid>
    <comment_count>12</comment_count>
      <attachid>388755</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2020-01-25 09:46:06 -0800</bug_when>
    <thetext>Comment on attachment 388755
proposed patch.

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

&gt; Source/WTF/wtf/text/StringImpl.cpp:287
&gt; +    ASSERT(charactersAreAllASCII&lt;LChar&gt;(lcharCharacters, length));

The &lt;LChar&gt; here isn’t needed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1611065</commentid>
    <comment_count>13</comment_count>
      <attachid>388755</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2020-01-25 09:48:47 -0800</bug_when>
    <thetext>Comment on attachment 388755
proposed patch.

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

&gt; Source/WTF/ChangeLog:12
&gt; +        Fix a bug in StringImpl::createStaticStringImpl(): I forgot to set its hash value
&gt; +        when I introduced it.  StaticStringImpls require that its hash code be set ahead
&gt; +        of time, and cannot be mutated at runtime.  See the comment in the definition of
&gt; +        StaticStringImpl in StringImpl.h.

Do we have a test that shows this is correct now?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1611074</commentid>
    <comment_count>14</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2020-01-25 10:55:33 -0800</bug_when>
    <thetext>(In reply to Darin Adler from comment #12)
&gt; &gt; Source/WTF/wtf/text/StringImpl.cpp:287
&gt; &gt; +    ASSERT(charactersAreAllASCII&lt;LChar&gt;(lcharCharacters, length));
&gt; 
&gt; The &lt;LChar&gt; here isn’t needed.

I copied this code over from StringImpl::createFromLiteral().  I&apos;ll fix it there too.

(In reply to Darin Adler from comment #13)
&gt; &gt; Source/WTF/ChangeLog:12
&gt; &gt; +        Fix a bug in StringImpl::createStaticStringImpl(): I forgot to set its hash value
&gt; &gt; +        when I introduced it.  StaticStringImpls require that its hash code be set ahead
&gt; &gt; +        of time, and cannot be mutated at runtime.  See the comment in the definition of
&gt; &gt; +        StaticStringImpl in StringImpl.h.
&gt; 
&gt; Do we have a test that shows this is correct now?

This was caught by existing JSC tests.  But I&apos;ll add some API tests.

Will do these in https://bugs.webkit.org/show_bug.cgi?id=206802.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1611973</commentid>
    <comment_count>15</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2020-01-28 09:05:56 -0800</bug_when>
    <thetext>*** Bug 206869 has been marked as a duplicate of this bug. ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>388755</attachid>
            <date>2020-01-24 19:10:57 -0800</date>
            <delta_ts>2020-01-24 20:59:14 -0800</delta_ts>
            <desc>proposed patch.</desc>
            <filename>bug-206791.patch</filename>
            <type>text/plain</type>
            <size>25983</size>
            <attacher name="Mark Lam">mark.lam</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMjU1MTE0KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDU2IEBA
CisyMDIwLTAxLTI0ICBNYXJrIExhbSAgPG1hcmsubGFtQGFwcGxlLmNvbT4KKworICAgICAgICBN
b3ZlIHNpbmdsZXRvbiBJbnRsIHN0cmluZyBsb2NhbGVzIG91dCBvZiBKU0dsb2JhbE9iamVjdC4K
KyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIwNjc5MQor
ICAgICAgICA8cmRhcjovL3Byb2JsZW0vNTg4ODkwMzc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkg
Tk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV2Ugd2VyZSBjcmVhdGluZyBhbiBpbnN0YW5jZSBv
ZiB0aGVzZSBmb3IgZWFjaCBKU0dsb2JhbE9iamVjdCB3aGVuIHRoZXkgY2FuIGJlIGEKKyAgICAg
ICAgZ2xvYmFsIHNpbmdsZXRvbiBzaW5jZSB0aGV5IGFyZSBhbHdheXMgaW5pdGlhbGl6ZWQgd2l0
aCB0aGUgc2FtZSBpbnRsIGRhdGEKKyAgICAgICAgKGJhcnJpbmcgYSBtaWQtZmxpZ2h0IGNoYW5n
ZSBpbiBpbnRsIHNldHRpbmdzLCB3aGljaCB3ZSBkb24ndCBzdXBwb3J0IGV2ZW4gaW4gdGhlCisg
ICAgICAgIGV4aXN0aW5nIGNvZGUpLgorCisgICAgICAgIEl0IHR1cm5zIG91dCB0aGF0IGludGxQ
bHVyYWxSdWxlc0F2YWlsYWJsZUxvY2FsZXMoKSBpc24ndCBjYWxsZWQgYW55d2hlcmUuICBTbywK
KyAgICAgICAgSSBkZWxldGVkIGl0LgorCisgICAgICAgIEluIGFkZE1pc3NpbmdTY3JpcHRMb2Nh
bGVzKCksIEknbSBkZWxpYmVyYXRlbHkgbmFtaW5nIHRoZSBzdHJpbmcgd2l0aCB1bmRlcnNjb3Jl
cworICAgICAgICBiZWNhdXNlIGl0J3MgbXVjaCBlYXNpZXIgdG8gcmVhZCBwYV9QS19TdHJpbmcg
YW5kIHNlZSB0aGF0IGl0IHJlZmVycyB0byAicGEtUEsiCisgICAgICAgIGFzIG9wcG9zZWQgdG8g
cGFQS1N0cmluZy4gIERpdHRvIGZvciB6aF9DTl9TdHJpbmcsIHpoX0hLX1N0cmluZywgemhfU0df
U3RyaW5nLAorICAgICAgICBhbmQgemhfVFdfU3RyaW5nLgorCisgICAgICAgICogcnVudGltZS9J
bnRsQ29sbGF0b3IuY3BwOgorICAgICAgICAoSlNDOjpJbnRsQ29sbGF0b3I6OmluaXRpYWxpemVD
b2xsYXRvcik6CisgICAgICAgICogcnVudGltZS9JbnRsQ29sbGF0b3JDb25zdHJ1Y3Rvci5jcHA6
CisgICAgICAgIChKU0M6OkludGxDb2xsYXRvckNvbnN0cnVjdG9yRnVuY1N1cHBvcnRlZExvY2Fs
ZXNPZik6CisgICAgICAgICogcnVudGltZS9JbnRsRGF0ZVRpbWVGb3JtYXQuY3BwOgorICAgICAg
ICAoSlNDOjpJbnRsRGF0ZVRpbWVGb3JtYXQ6OmluaXRpYWxpemVEYXRlVGltZUZvcm1hdCk6Cisg
ICAgICAgICogcnVudGltZS9JbnRsRGF0ZVRpbWVGb3JtYXRDb25zdHJ1Y3Rvci5jcHA6CisgICAg
ICAgIChKU0M6OkludGxEYXRlVGltZUZvcm1hdENvbnN0cnVjdG9yRnVuY1N1cHBvcnRlZExvY2Fs
ZXNPZik6CisgICAgICAgICogcnVudGltZS9JbnRsTnVtYmVyRm9ybWF0LmNwcDoKKyAgICAgICAg
KEpTQzo6SW50bE51bWJlckZvcm1hdDo6aW5pdGlhbGl6ZU51bWJlckZvcm1hdCk6CisgICAgICAg
ICogcnVudGltZS9JbnRsTnVtYmVyRm9ybWF0Q29uc3RydWN0b3IuY3BwOgorICAgICAgICAoSlND
OjpJbnRsTnVtYmVyRm9ybWF0Q29uc3RydWN0b3JGdW5jU3VwcG9ydGVkTG9jYWxlc09mKToKKyAg
ICAgICAgKiBydW50aW1lL0ludGxPYmplY3QuY3BwOgorICAgICAgICAoSlNDOjpjb252ZXJ0SUNV
TG9jYWxlVG9CQ1A0N0xhbmd1YWdlVGFnKToKKyAgICAgICAgKEpTQzo6YWRkTWlzc2luZ1Njcmlw
dExvY2FsZXMpOgorICAgICAgICAoSlNDOjppbnRsQ29sbGF0b3JBdmFpbGFibGVMb2NhbGVzKToK
KyAgICAgICAgKEpTQzo6aW50bERhdGVUaW1lRm9ybWF0QXZhaWxhYmxlTG9jYWxlcyk6CisgICAg
ICAgIChKU0M6OmludGxOdW1iZXJGb3JtYXRBdmFpbGFibGVMb2NhbGVzKToKKyAgICAgICAgKEpT
Qzo6ZGVmYXVsdExvY2FsZSk6CisgICAgICAgICogcnVudGltZS9JbnRsT2JqZWN0Lmg6CisgICAg
ICAgICogcnVudGltZS9JbnRsUGx1cmFsUnVsZXMuY3BwOgorICAgICAgICAoSlNDOjpJbnRsUGx1
cmFsUnVsZXM6OmluaXRpYWxpemVQbHVyYWxSdWxlcyk6CisgICAgICAgICogcnVudGltZS9JbnRs
UGx1cmFsUnVsZXNDb25zdHJ1Y3Rvci5jcHA6CisgICAgICAgIChKU0M6OkludGxQbHVyYWxSdWxl
c0NvbnN0cnVjdG9yRnVuY1N1cHBvcnRlZExvY2FsZXNPZik6CisgICAgICAgICogcnVudGltZS9K
U0dsb2JhbE9iamVjdC5jcHA6CisgICAgICAgIChKU0M6OmFkZE1pc3NpbmdTY3JpcHRMb2NhbGVz
KTogRGVsZXRlZC4KKyAgICAgICAgKEpTQzo6SlNHbG9iYWxPYmplY3Q6OmludGxDb2xsYXRvckF2
YWlsYWJsZUxvY2FsZXMpOiBEZWxldGVkLgorICAgICAgICAoSlNDOjpKU0dsb2JhbE9iamVjdDo6
aW50bERhdGVUaW1lRm9ybWF0QXZhaWxhYmxlTG9jYWxlcyk6IERlbGV0ZWQuCisgICAgICAgIChK
U0M6OkpTR2xvYmFsT2JqZWN0OjppbnRsTnVtYmVyRm9ybWF0QXZhaWxhYmxlTG9jYWxlcyk6IERl
bGV0ZWQuCisgICAgICAgIChKU0M6OkpTR2xvYmFsT2JqZWN0OjppbnRsUGx1cmFsUnVsZXNBdmFp
bGFibGVMb2NhbGVzKTogRGVsZXRlZC4KKyAgICAgICAgKiBydW50aW1lL0pTR2xvYmFsT2JqZWN0
Lmg6CisKIDIwMjAtMDEtMjQgIE1hcmsgTGFtICA8bWFyay5sYW1AYXBwbGUuY29tPgogCiAgICAg
ICAgIEludGxPYmplY3QncyBjYWNoZWQgc3RyaW5ncyBzaG91bGQgYmUgaW1tb3J0YWwgYW5kIHNh
ZmUgZm9yIGNvbmN1cnJlbnQgYWNjZXNzLgpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1
bnRpbWUvSW50bENvbGxhdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvcnVudGltZS9JbnRsQ29sbGF0b3IuY3BwCShyZXZpc2lvbiAyNTUxMTEpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvcnVudGltZS9JbnRsQ29sbGF0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDcgKzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAxNSBBbmR5IFZhbldhZ29uZXIg
KGFuZHlAdmFud2Fnb25lci5mYW1pbHkpCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTUgU3Vrb2xzYWsg
U2Frc2h1d29uZyAoc3Vrb2xzYWtAZ21haWwuY29tKQotICogQ29weXJpZ2h0IChDKSAyMDE2LTIw
MTkgQXBwbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDE2
LTIwMjAgQXBwbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAog
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCkBAIC0yMTksNyArMjE5LDcgQEAgdm9pZCBJbnRsQ29sbGF0b3I6OmluaXRp
YWxpemVDb2xsYXRvcihKUwogICAgICAgICAgICAgb3B0LmFkZCgia2YiX3MsIGNhc2VGaXJzdCk7
CiAgICAgfQogCi0gICAgYXV0byYgYXZhaWxhYmxlTG9jYWxlcyA9IGdsb2JhbE9iamVjdC0+aW50
bENvbGxhdG9yQXZhaWxhYmxlTG9jYWxlcygpOworICAgIGF1dG8mIGF2YWlsYWJsZUxvY2FsZXMg
PSBpbnRsQ29sbGF0b3JBdmFpbGFibGVMb2NhbGVzKCk7CiAgICAgYXV0byByZXN1bHQgPSByZXNv
bHZlTG9jYWxlKGdsb2JhbE9iamVjdCwgYXZhaWxhYmxlTG9jYWxlcywgcmVxdWVzdGVkTG9jYWxl
cywgb3B0LCByZWxldmFudENvbGxhdG9yRXh0ZW5zaW9uS2V5cywgV1RGX0FSUkFZX0xFTkdUSChy
ZWxldmFudENvbGxhdG9yRXh0ZW5zaW9uS2V5cyksIGxvY2FsZURhdGEpOwogCiAgICAgbV9sb2Nh
bGUgPSByZXN1bHQuZ2V0KCJsb2NhbGUiX3MpOwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3Jl
L3J1bnRpbWUvSW50bENvbGxhdG9yQ29uc3RydWN0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0ludGxDb2xsYXRvckNvbnN0cnVjdG9yLmNwcAkocmV2
aXNpb24gMjU1MTExKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSW50bENvbGxh
dG9yQ29uc3RydWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDcgKzEsNyBAQAogLyoKICAq
IENvcHlyaWdodCAoQykgMjAxNSBBbmR5IFZhbldhZ29uZXIgKGFuZHlAdmFud2Fnb25lci5mYW1p
bHkpCiAgKiBDb3B5cmlnaHQgKEMpIDIwMTUgU3Vrb2xzYWsgU2Frc2h1d29uZyAoc3Vrb2xzYWtA
Z21haWwuY29tKQotICogQ29weXJpZ2h0IChDKSAyMDE2IEFwcGxlIEluYy4gQWxsIFJpZ2h0cyBS
ZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxNi0yMDIwIEFwcGxlIEluYy4gQWxsIFJpZ2h0
cyBSZXNlcnZlZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMTM5LDcgKzEz
OSw3IEBAIEVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgSW50bENvbGxhdG8KICAgICBSRVRV
Uk5fSUZfRVhDRVBUSU9OKHNjb3BlLCBlbmNvZGVkSlNWYWx1ZSgpKTsKIAogICAgIC8vIDMuIFJl
dHVybiBTdXBwb3J0ZWRMb2NhbGVzKCVDb2xsYXRvciUuW1thdmFpbGFibGVMb2NhbGVzXV0sIHJl
cXVlc3RlZExvY2FsZXMsIG9wdGlvbnMpLgotICAgIFJFTEVBU0VfQU5EX1JFVFVSTihzY29wZSwg
SlNWYWx1ZTo6ZW5jb2RlKHN1cHBvcnRlZExvY2FsZXMoZ2xvYmFsT2JqZWN0LCBnbG9iYWxPYmpl
Y3QtPmludGxDb2xsYXRvckF2YWlsYWJsZUxvY2FsZXMoKSwgcmVxdWVzdGVkTG9jYWxlcywgY2Fs
bEZyYW1lLT5hcmd1bWVudCgxKSkpKTsKKyAgICBSRUxFQVNFX0FORF9SRVRVUk4oc2NvcGUsIEpT
VmFsdWU6OmVuY29kZShzdXBwb3J0ZWRMb2NhbGVzKGdsb2JhbE9iamVjdCwgaW50bENvbGxhdG9y
QXZhaWxhYmxlTG9jYWxlcygpLCByZXF1ZXN0ZWRMb2NhbGVzLCBjYWxsRnJhbWUtPmFyZ3VtZW50
KDEpKSkpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBKU0MKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9ydW50aW1lL0ludGxEYXRlVGltZUZvcm1hdC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSW50bERhdGVUaW1lRm9ybWF0LmNwcAkocmV2aXNpb24g
MjU1MTExKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSW50bERhdGVUaW1lRm9y
bWF0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQg
KEMpIDIwMTUgQW5keSBWYW5XYWdvbmVyIChhbmR5QHZhbndhZ29uZXIuZmFtaWx5KQotICogQ29w
eXJpZ2h0IChDKSAyMDE2LTIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICog
Q29weXJpZ2h0IChDKSAyMDE2LTIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgog
ICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC00NzAsNyArNDcwLDcgQEAgdm9pZCBJ
bnRsRGF0ZVRpbWVGb3JtYXQ6OmluaXRpYWxpemVEYXRlVAogICAgIH0gZWxzZQogICAgICAgICBv
cHQuYWRkKCJoYyJfcywgU3RyaW5nKCkpOwogCi0gICAgY29uc3QgSGFzaFNldDxTdHJpbmc+IGF2
YWlsYWJsZUxvY2FsZXMgPSBnbG9iYWxPYmplY3QtPmludGxEYXRlVGltZUZvcm1hdEF2YWlsYWJs
ZUxvY2FsZXMoKTsKKyAgICBjb25zdCBIYXNoU2V0PFN0cmluZz4mIGF2YWlsYWJsZUxvY2FsZXMg
PSBpbnRsRGF0ZVRpbWVGb3JtYXRBdmFpbGFibGVMb2NhbGVzKCk7CiAgICAgSGFzaE1hcDxTdHJp
bmcsIFN0cmluZz4gcmVzb2x2ZWQgPSByZXNvbHZlTG9jYWxlKGdsb2JhbE9iamVjdCwgYXZhaWxh
YmxlTG9jYWxlcywgcmVxdWVzdGVkTG9jYWxlcywgb3B0LCBJbnRsRFRGSW50ZXJuYWw6OnJlbGV2
YW50RXh0ZW5zaW9uS2V5cywgV1RGX0FSUkFZX0xFTkdUSChJbnRsRFRGSW50ZXJuYWw6OnJlbGV2
YW50RXh0ZW5zaW9uS2V5cyksIEludGxEVEZJbnRlcm5hbDo6bG9jYWxlRGF0YSk7CiAKICAgICBt
X2xvY2FsZSA9IHJlc29sdmVkLmdldCh2bS5wcm9wZXJ0eU5hbWVzLT5sb2NhbGUuc3RyaW5nKCkp
OwpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSW50bERhdGVUaW1lRm9ybWF0
Q29uc3RydWN0b3IuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50
aW1lL0ludGxEYXRlVGltZUZvcm1hdENvbnN0cnVjdG9yLmNwcAkocmV2aXNpb24gMjU1MTExKQor
KysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSW50bERhdGVUaW1lRm9ybWF0Q29uc3Ry
dWN0b3IuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMzMsNyArMTMzLDcgQEAgRW5jb2RlZEpTVmFs
dWUgSlNDX0hPU1RfQ0FMTCBJbnRsRGF0ZVRpbQogICAgIC8vIDEyLjIuMiBJbnRsLkRhdGVUaW1l
Rm9ybWF0LnN1cHBvcnRlZExvY2FsZXNPZihsb2NhbGVzIFssIG9wdGlvbnNdKSAoRUNNQS00MDIg
Mi4wKQogCiAgICAgLy8gMS4gTGV0IGF2YWlsYWJsZUxvY2FsZXMgYmUgJURhdGVUaW1lRm9ybWF0
JS5bW2F2YWlsYWJsZUxvY2FsZXNdXS4KLSAgICBjb25zdCBIYXNoU2V0PFN0cmluZz4gYXZhaWxh
YmxlTG9jYWxlcyA9IGdsb2JhbE9iamVjdC0+aW50bERhdGVUaW1lRm9ybWF0QXZhaWxhYmxlTG9j
YWxlcygpOworICAgIGNvbnN0IEhhc2hTZXQ8U3RyaW5nPiYgYXZhaWxhYmxlTG9jYWxlcyA9IGlu
dGxEYXRlVGltZUZvcm1hdEF2YWlsYWJsZUxvY2FsZXMoKTsKIAogICAgIC8vIDIuIExldCByZXF1
ZXN0ZWRMb2NhbGVzIGJlIENhbm9uaWNhbGl6ZUxvY2FsZUxpc3QobG9jYWxlcykuCiAgICAgVmVj
dG9yPFN0cmluZz4gcmVxdWVzdGVkTG9jYWxlcyA9IGNhbm9uaWNhbGl6ZUxvY2FsZUxpc3QoZ2xv
YmFsT2JqZWN0LCBjYWxsRnJhbWUtPmFyZ3VtZW50KDApKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9ydW50aW1lL0ludGxOdW1iZXJGb3JtYXQuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0ludGxOdW1iZXJGb3JtYXQuY3BwCShyZXZpc2lvbiAy
NTUxMTEpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9JbnRsTnVtYmVyRm9ybWF0
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMp
IDIwMTUgQW5keSBWYW5XYWdvbmVyIChhbmR5QHZhbndhZ29uZXIuZmFtaWx5KQogICogQ29weXJp
Z2h0IChDKSAyMDE2IFN1a29sc2FrIFNha3NodXdvbmcgKHN1a29sc2FrQGdtYWlsLmNvbSkKLSAq
IENvcHlyaWdodCAoQykgMjAxNi0yMDE5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqIENvcHlyaWdodCAoQykgMjAxNi0yMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMTc5LDcgKzE3OSw3IEBAIHZv
aWQgSW50bE51bWJlckZvcm1hdDo6aW5pdGlhbGl6ZU51bWJlckYKICAgICBSRVRVUk5fSUZfRVhD
RVBUSU9OKHNjb3BlLCB2b2lkKCkpOwogICAgIG9wdC5hZGQoImxvY2FsZU1hdGNoZXIiX3MsIG1h
dGNoZXIpOwogCi0gICAgYXV0byYgYXZhaWxhYmxlTG9jYWxlcyA9IGdsb2JhbE9iamVjdC0+aW50
bE51bWJlckZvcm1hdEF2YWlsYWJsZUxvY2FsZXMoKTsKKyAgICBhdXRvJiBhdmFpbGFibGVMb2Nh
bGVzID0gaW50bE51bWJlckZvcm1hdEF2YWlsYWJsZUxvY2FsZXMoKTsKICAgICBhdXRvIHJlc3Vs
dCA9IHJlc29sdmVMb2NhbGUoZ2xvYmFsT2JqZWN0LCBhdmFpbGFibGVMb2NhbGVzLCByZXF1ZXN0
ZWRMb2NhbGVzLCBvcHQsIHJlbGV2YW50TnVtYmVyRXh0ZW5zaW9uS2V5cywgV1RGX0FSUkFZX0xF
TkdUSChyZWxldmFudE51bWJlckV4dGVuc2lvbktleXMpLCBJbnRsTkZJbnRlcm5hbDo6bG9jYWxl
RGF0YSk7CiAKICAgICBtX2xvY2FsZSA9IHJlc3VsdC5nZXQoImxvY2FsZSJfcyk7CkluZGV4OiBT
b3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9JbnRsTnVtYmVyRm9ybWF0Q29uc3RydWN0b3Iu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0ludGxOdW1i
ZXJGb3JtYXRDb25zdHJ1Y3Rvci5jcHAJKHJldmlzaW9uIDI1NTExMSkKKysrIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9ydW50aW1lL0ludGxOdW1iZXJGb3JtYXRDb25zdHJ1Y3Rvci5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTEsNiArMSw2IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDE1IEFuZHkg
VmFuV2Fnb25lciAoYW5keUB2YW53YWdvbmVyLmZhbWlseSkKLSAqIENvcHlyaWdodCAoQykgMjAx
NiBBcHBsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYt
MjAyMCBBcHBsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKQEAgLTEzMyw3ICsxMzMsNyBAQCBFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9D
QUxMIEludGxOdW1iZXJGCiAgICAgLy8gMTEuMi4yIEludGwuTnVtYmVyRm9ybWF0LnN1cHBvcnRl
ZExvY2FsZXNPZihsb2NhbGVzIFssIG9wdGlvbnNdKSAoRUNNQS00MDIgMi4wKQogCiAgICAgLy8g
MS4gTGV0IGF2YWlsYWJsZUxvY2FsZXMgYmUgJU51bWJlckZvcm1hdCUuW1thdmFpbGFibGVMb2Nh
bGVzXV0uCi0gICAgY29uc3QgSGFzaFNldDxTdHJpbmc+IGF2YWlsYWJsZUxvY2FsZXMgPSBnbG9i
YWxPYmplY3QtPmludGxOdW1iZXJGb3JtYXRBdmFpbGFibGVMb2NhbGVzKCk7CisgICAgY29uc3Qg
SGFzaFNldDxTdHJpbmc+JiBhdmFpbGFibGVMb2NhbGVzID0gaW50bE51bWJlckZvcm1hdEF2YWls
YWJsZUxvY2FsZXMoKTsKIAogICAgIC8vIDIuIExldCByZXF1ZXN0ZWRMb2NhbGVzIGJlIENhbm9u
aWNhbGl6ZUxvY2FsZUxpc3QobG9jYWxlcykuCiAgICAgVmVjdG9yPFN0cmluZz4gcmVxdWVzdGVk
TG9jYWxlcyA9IGNhbm9uaWNhbGl6ZUxvY2FsZUxpc3QoZ2xvYmFsT2JqZWN0LCBjYWxsRnJhbWUt
PmFyZ3VtZW50KDApKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0ludGxP
YmplY3QuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0lu
dGxPYmplY3QuY3BwCShyZXZpc2lvbiAyNTUxMTIpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
cnVudGltZS9JbnRsT2JqZWN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDYsMTIgKzQ2LDE2IEBA
CiAjaW5jbHVkZSAiTG9va3VwLmgiCiAjaW5jbHVkZSAiT2JqZWN0UHJvdG90eXBlLmgiCiAjaW5j
bHVkZSAiT3B0aW9ucy5oIgorI2luY2x1ZGUgPHVuaWNvZGUvdWNvbC5oPgorI2luY2x1ZGUgPHVu
aWNvZGUvdWRhdC5oPgogI2luY2x1ZGUgPHVuaWNvZGUvdWxvYy5oPgorI2luY2x1ZGUgPHVuaWNv
ZGUvdW51bS5oPgogI2luY2x1ZGUgPHVuaWNvZGUvdW51bXN5cy5oPgogI2luY2x1ZGUgPHd0Zi9B
c3NlcnRpb25zLmg+CiAjaW5jbHVkZSA8d3RmL0xhbmd1YWdlLmg+CiAjaW5jbHVkZSA8d3RmL05l
dmVyRGVzdHJveWVkLmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvU3RyaW5nQnVpbGRlci5oPgorI2lu
Y2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0ltcGwuaD4KIAogbmFtZXNwYWNlIEpTQyB7CiAKQEAgLTEy
OCw3ICsxMzIsNyBAQCBTdHJ1Y3R1cmUqIEludGxPYmplY3Q6OmNyZWF0ZVN0cnVjdHVyZShWCiAg
ICAgcmV0dXJuIFN0cnVjdHVyZTo6Y3JlYXRlKHZtLCBnbG9iYWxPYmplY3QsIHByb3RvdHlwZSwg
VHlwZUluZm8oT2JqZWN0VHlwZSwgU3RydWN0dXJlRmxhZ3MpLCBpbmZvKCkpOwogfQogCi1TdHJp
bmcgY29udmVydElDVUxvY2FsZVRvQkNQNDdMYW5ndWFnZVRhZyhjb25zdCBjaGFyKiBsb2NhbGVJ
RCkKK3N0YXRpYyBTdHJpbmcgY29udmVydElDVUxvY2FsZVRvQkNQNDdMYW5ndWFnZVRhZyhjb25z
dCBjaGFyKiBsb2NhbGVJRCkKIHsKICAgICBVRXJyb3JDb2RlIHN0YXR1cyA9IFVfWkVST19FUlJP
UjsKICAgICBWZWN0b3I8Y2hhciwgMzI+IGJ1ZmZlcigzMik7CkBAIC0xMzksMTAgKzE0Myw4NiBA
QCBTdHJpbmcgY29udmVydElDVUxvY2FsZVRvQkNQNDdMYW5ndWFnZVRhCiAgICAgICAgIHVsb2Nf
dG9MYW5ndWFnZVRhZyhsb2NhbGVJRCwgYnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSwgZmFs
c2UsICZzdGF0dXMpOwogICAgIH0KICAgICBpZiAoIVVfRkFJTFVSRShzdGF0dXMpKQotICAgICAg
ICByZXR1cm4gU3RyaW5nKGJ1ZmZlci5kYXRhKCksIGxlbmd0aCk7CisgICAgICAgIHJldHVybiBT
dHJpbmcoU3RyaW5nSW1wbDo6Y3JlYXRlU3RhdGljU3RyaW5nSW1wbChidWZmZXIuZGF0YSgpLCBs
ZW5ndGgpKTsKICAgICByZXR1cm4gU3RyaW5nKCk7CiB9CiAKK3N0YXRpYyB2b2lkIGFkZE1pc3Np
bmdTY3JpcHRMb2NhbGVzKEhhc2hTZXQ8U3RyaW5nPiYgYXZhaWxhYmxlTG9jYWxlcykKK3sKKyAg
ICBzdGF0aWMgY29uc3QgTmV2ZXJEZXN0cm95ZWQ8U3RyaW5nPiBwYV9QS19TdHJpbmcoTUFLRV9T
VEFUSUNfU1RSSU5HX0lNUEwoInBhLVBLIikpOworICAgIHN0YXRpYyBjb25zdCBOZXZlckRlc3Ry
b3llZDxTdHJpbmc+IHpoX0NOX1N0cmluZyhNQUtFX1NUQVRJQ19TVFJJTkdfSU1QTCgiemgtQ04i
KSk7CisgICAgc3RhdGljIGNvbnN0IE5ldmVyRGVzdHJveWVkPFN0cmluZz4gemhfSEtfU3RyaW5n
KE1BS0VfU1RBVElDX1NUUklOR19JTVBMKCJ6aC1ISyIpKTsKKyAgICBzdGF0aWMgY29uc3QgTmV2
ZXJEZXN0cm95ZWQ8U3RyaW5nPiB6aF9TR19TdHJpbmcoTUFLRV9TVEFUSUNfU1RSSU5HX0lNUEwo
InpoLVNHIikpOworICAgIHN0YXRpYyBjb25zdCBOZXZlckRlc3Ryb3llZDxTdHJpbmc+IHpoX1RX
X1N0cmluZyhNQUtFX1NUQVRJQ19TVFJJTkdfSU1QTCgiemgtVFciKSk7CisgICAgaWYgKGF2YWls
YWJsZUxvY2FsZXMuY29udGFpbnMoInBhLUFyYWItUEsiKSkKKyAgICAgICAgYXZhaWxhYmxlTG9j
YWxlcy5hZGQocGFfUEtfU3RyaW5nLmdldCgpKTsKKyAgICBpZiAoYXZhaWxhYmxlTG9jYWxlcy5j
b250YWlucygiemgtSGFucy1DTiIpKQorICAgICAgICBhdmFpbGFibGVMb2NhbGVzLmFkZCh6aF9D
Tl9TdHJpbmcuZ2V0KCkpOworICAgIGlmIChhdmFpbGFibGVMb2NhbGVzLmNvbnRhaW5zKCJ6aC1I
YW50LUhLIikpCisgICAgICAgIGF2YWlsYWJsZUxvY2FsZXMuYWRkKHpoX0hLX1N0cmluZy5nZXQo
KSk7CisgICAgaWYgKGF2YWlsYWJsZUxvY2FsZXMuY29udGFpbnMoInpoLUhhbnMtU0ciKSkKKyAg
ICAgICAgYXZhaWxhYmxlTG9jYWxlcy5hZGQoemhfU0dfU3RyaW5nLmdldCgpKTsKKyAgICBpZiAo
YXZhaWxhYmxlTG9jYWxlcy5jb250YWlucygiemgtSGFudC1UVyIpKQorICAgICAgICBhdmFpbGFi
bGVMb2NhbGVzLmFkZCh6aF9UV19TdHJpbmcuZ2V0KCkpOworfQorCitjb25zdCBIYXNoU2V0PFN0
cmluZz4mIGludGxDb2xsYXRvckF2YWlsYWJsZUxvY2FsZXMoKQoreworICAgIHN0YXRpYyBOZXZl
ckRlc3Ryb3llZDxIYXNoU2V0PFN0cmluZz4+IGNhY2hlZEF2YWlsYWJsZUxvY2FsZXM7CisgICAg
SGFzaFNldDxTdHJpbmc+JiBhdmFpbGFibGVMb2NhbGVzID0gY2FjaGVkQXZhaWxhYmxlTG9jYWxl
cy5nZXQoKTsKKworICAgIHN0YXRpYyBzdGQ6Om9uY2VfZmxhZyBpbml0aWFsaXplT25jZTsKKyAg
ICBzdGQ6OmNhbGxfb25jZShpbml0aWFsaXplT25jZSwgWyZdIHsKKyAgICAgICAgQVNTRVJUKGF2
YWlsYWJsZUxvY2FsZXMuaXNFbXB0eSgpKTsKKyAgICAgICAgaW50MzJfdCBjb3VudCA9IHVjb2xf
Y291bnRBdmFpbGFibGUoKTsKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7
ICsraSkgeworICAgICAgICAgICAgU3RyaW5nIGxvY2FsZSA9IGNvbnZlcnRJQ1VMb2NhbGVUb0JD
UDQ3TGFuZ3VhZ2VUYWcodWNvbF9nZXRBdmFpbGFibGUoaSkpOworICAgICAgICAgICAgaWYgKCFs
b2NhbGUuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgIGF2YWlsYWJsZUxvY2FsZXMuYWRkKGxv
Y2FsZSk7CisgICAgICAgIH0KKyAgICAgICAgYWRkTWlzc2luZ1NjcmlwdExvY2FsZXMoYXZhaWxh
YmxlTG9jYWxlcyk7CisgICAgfSk7CisgICAgcmV0dXJuIGF2YWlsYWJsZUxvY2FsZXM7Cit9CisK
K2NvbnN0IEhhc2hTZXQ8U3RyaW5nPiYgaW50bERhdGVUaW1lRm9ybWF0QXZhaWxhYmxlTG9jYWxl
cygpCit7CisgICAgc3RhdGljIE5ldmVyRGVzdHJveWVkPEhhc2hTZXQ8U3RyaW5nPj4gY2FjaGVk
QXZhaWxhYmxlTG9jYWxlczsKKyAgICBIYXNoU2V0PFN0cmluZz4mIGF2YWlsYWJsZUxvY2FsZXMg
PSBjYWNoZWRBdmFpbGFibGVMb2NhbGVzLmdldCgpOworCisgICAgc3RhdGljIHN0ZDo6b25jZV9m
bGFnIGluaXRpYWxpemVPbmNlOworICAgIHN0ZDo6Y2FsbF9vbmNlKGluaXRpYWxpemVPbmNlLCBb
Jl0geworICAgICAgICBBU1NFUlQoYXZhaWxhYmxlTG9jYWxlcy5pc0VtcHR5KCkpOworICAgICAg
ICBpbnQzMl90IGNvdW50ID0gdWRhdF9jb3VudEF2YWlsYWJsZSgpOworICAgICAgICBmb3IgKGlu
dDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICBTdHJpbmcgbG9jYWxl
ID0gY29udmVydElDVUxvY2FsZVRvQkNQNDdMYW5ndWFnZVRhZyh1ZGF0X2dldEF2YWlsYWJsZShp
KSk7CisgICAgICAgICAgICBpZiAoIWxvY2FsZS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAg
YXZhaWxhYmxlTG9jYWxlcy5hZGQobG9jYWxlKTsKKyAgICAgICAgfQorICAgICAgICBhZGRNaXNz
aW5nU2NyaXB0TG9jYWxlcyhhdmFpbGFibGVMb2NhbGVzKTsKKyAgICB9KTsKKyAgICByZXR1cm4g
YXZhaWxhYmxlTG9jYWxlczsKK30KKworY29uc3QgSGFzaFNldDxTdHJpbmc+JiBpbnRsTnVtYmVy
Rm9ybWF0QXZhaWxhYmxlTG9jYWxlcygpCit7CisgICAgc3RhdGljIE5ldmVyRGVzdHJveWVkPEhh
c2hTZXQ8U3RyaW5nPj4gY2FjaGVkQXZhaWxhYmxlTG9jYWxlczsKKyAgICBIYXNoU2V0PFN0cmlu
Zz4mIGF2YWlsYWJsZUxvY2FsZXMgPSBjYWNoZWRBdmFpbGFibGVMb2NhbGVzLmdldCgpOworCisg
ICAgc3RhdGljIHN0ZDo6b25jZV9mbGFnIGluaXRpYWxpemVPbmNlOworICAgIHN0ZDo6Y2FsbF9v
bmNlKGluaXRpYWxpemVPbmNlLCBbJl0geworICAgICAgICBBU1NFUlQoYXZhaWxhYmxlTG9jYWxl
cy5pc0VtcHR5KCkpOworICAgICAgICBpbnQzMl90IGNvdW50ID0gdW51bV9jb3VudEF2YWlsYWJs
ZSgpOworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAg
ICAgICAgICBTdHJpbmcgbG9jYWxlID0gY29udmVydElDVUxvY2FsZVRvQkNQNDdMYW5ndWFnZVRh
Zyh1bnVtX2dldEF2YWlsYWJsZShpKSk7CisgICAgICAgICAgICBpZiAoIWxvY2FsZS5pc0VtcHR5
KCkpCisgICAgICAgICAgICAgICAgYXZhaWxhYmxlTG9jYWxlcy5hZGQobG9jYWxlKTsKKyAgICAg
ICAgfQorICAgICAgICBhZGRNaXNzaW5nU2NyaXB0TG9jYWxlcyhhdmFpbGFibGVMb2NhbGVzKTsK
KyAgICB9KTsKKyAgICByZXR1cm4gYXZhaWxhYmxlTG9jYWxlczsKK30KKwogYm9vbCBpbnRsQm9v
bGVhbk9wdGlvbihKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU1ZhbHVlIG9wdGlvbnMs
IFByb3BlcnR5TmFtZSBwcm9wZXJ0eSwgYm9vbCYgdXNlc0ZhbGxiYWNrKQogewogICAgIC8vIEdl
dE9wdGlvbiAob3B0aW9ucywgcHJvcGVydHksIHR5cGU9ImJvb2xlYW4iLCB2YWx1ZXMsIGZhbGxi
YWNrKQpAQCAtNjIyLDkgKzcwMiwxMyBAQCBTdHJpbmcgZGVmYXVsdExvY2FsZShKU0dsb2JhbE9i
amVjdCogZ2xvCiAKICAgICAvLyBJZiBhbGwgZWxzZSBmYWlscywgYXNrIElDVS4gSXQgd2lsbCBw
cm9iYWJseSBzYXkgc29tZXRoaW5nIGJvZ3VzIGxpa2UgZW5fdXMgZXZlbiBpZiB0aGUgdXNlcgog
ICAgIC8vIGhhcyBjb25maWd1cmVkIHNvbWUgb3RoZXIgbGFuZ3VhZ2UsIGJ1dCBiZWluZyB3cm9u
ZyBpcyBiZXR0ZXIgdGhhbiBjcmFzaGluZy4KLSAgICBTdHJpbmcgbG9jYWxlID0gY29udmVydElD
VUxvY2FsZVRvQkNQNDdMYW5ndWFnZVRhZyh1bG9jX2dldERlZmF1bHQoKSk7Ci0gICAgaWYgKCFs
b2NhbGUuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gbG9jYWxlOworICAgIHN0YXRpYyBOZXZl
ckRlc3Ryb3llZDxTdHJpbmc+IGljdURlZmF1bHRMb2NhbFN0cmluZzsKKyAgICBzdGF0aWMgc3Rk
OjpvbmNlX2ZsYWcgaW5pdGlhbGl6ZU9uY2U7CisgICAgc3RkOjpjYWxsX29uY2UoaW5pdGlhbGl6
ZU9uY2UsIFsmXSB7CisgICAgICAgIGljdURlZmF1bHRMb2NhbFN0cmluZy5nZXQoKSA9IGNvbnZl
cnRJQ1VMb2NhbGVUb0JDUDQ3TGFuZ3VhZ2VUYWcodWxvY19nZXREZWZhdWx0KCkpOworICAgIH0p
OworICAgIGlmICghaWN1RGVmYXVsdExvY2FsU3RyaW5nLT5pc0VtcHR5KCkpCisgICAgICAgIHJl
dHVybiBpY3VEZWZhdWx0TG9jYWxTdHJpbmcuZ2V0KCk7CiAKICAgICByZXR1cm4gImVuIl9zOwog
fQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSW50bE9iamVjdC5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0ludGxPYmplY3QuaAkocmV2
aXNpb24gMjU1MTExKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSW50bE9iamVj
dC5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDYgKzEsNiBAQAogLyoKICAqIENvcHlyaWdodCAoQykg
MjAxNSBBbmR5IFZhbldhZ29uZXIgKGFuZHlAdmFud2Fnb25lci5mYW1pbHkpCi0gKiBDb3B5cmln
aHQgKEMpIDIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0
IChDKSAyMDE5LTIwMjAgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC01Nyw3ICs1NywxMCBAQCBwcml2YXRlOgogfTsKIAog
U3RyaW5nIGRlZmF1bHRMb2NhbGUoSlNHbG9iYWxPYmplY3QqKTsKLVN0cmluZyBjb252ZXJ0SUNV
TG9jYWxlVG9CQ1A0N0xhbmd1YWdlVGFnKGNvbnN0IGNoYXIqIGxvY2FsZUlEKTsKK2NvbnN0IEhh
c2hTZXQ8U3RyaW5nPiYgaW50bENvbGxhdG9yQXZhaWxhYmxlTG9jYWxlcygpOworY29uc3QgSGFz
aFNldDxTdHJpbmc+JiBpbnRsRGF0ZVRpbWVGb3JtYXRBdmFpbGFibGVMb2NhbGVzKCk7Citjb25z
dCBIYXNoU2V0PFN0cmluZz4mIGludGxOdW1iZXJGb3JtYXRBdmFpbGFibGVMb2NhbGVzKCk7CisK
IGJvb2wgaW50bEJvb2xlYW5PcHRpb24oSlNHbG9iYWxPYmplY3QqLCBKU1ZhbHVlIG9wdGlvbnMs
IFByb3BlcnR5TmFtZSwgYm9vbCYgdXNlc0ZhbGxiYWNrKTsKIFN0cmluZyBpbnRsU3RyaW5nT3B0
aW9uKEpTR2xvYmFsT2JqZWN0KiwgSlNWYWx1ZSBvcHRpb25zLCBQcm9wZXJ0eU5hbWUsIHN0ZDo6
aW5pdGlhbGl6ZXJfbGlzdDxjb25zdCBjaGFyKj4gdmFsdWVzLCBjb25zdCBjaGFyKiBub3RGb3Vu
ZCwgY29uc3QgY2hhciogZmFsbGJhY2spOwogdW5zaWduZWQgaW50bE51bWJlck9wdGlvbihKU0ds
b2JhbE9iamVjdCosIEpTVmFsdWUgb3B0aW9ucywgUHJvcGVydHlOYW1lLCB1bnNpZ25lZCBtaW5p
bXVtLCB1bnNpZ25lZCBtYXhpbXVtLCB1bnNpZ25lZCBmYWxsYmFjayk7CkluZGV4OiBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvcnVudGltZS9JbnRsUGx1cmFsUnVsZXMuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0ludGxQbHVyYWxSdWxlcy5jcHAJKHJldmlz
aW9uIDI1NTExMSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0ludGxQbHVyYWxS
dWxlcy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsNiArMSw2IEBACiAvKgogICogQ29weXJpZ2h0
IChDKSAyMDE4IEFuZHkgVmFuV2Fnb25lciAoYW5keUB2YW53YWdvbmVyLmZhbWlseSkKLSAqIENv
cHlyaWdodCAoQykgMjAxOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTktMjAyMCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgog
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTEyMSw3ICsxMjEsNyBAQCB2b2lkIEludGxQ
bHVyYWxSdWxlczo6aW5pdGlhbGl6ZVBsdXJhbFJ1CiAgICAgUkVUVVJOX0lGX0VYQ0VQVElPTihz
Y29wZSwgdm9pZCgpKTsKICAgICBsb2NhbGVPcHQuYWRkKHZtLnByb3BlcnR5TmFtZXMtPmxvY2Fs
ZU1hdGNoZXIuc3RyaW5nKCksIGxvY2FsZU1hdGNoZXIpOwogCi0gICAgY29uc3QgSGFzaFNldDxT
dHJpbmc+IGF2YWlsYWJsZUxvY2FsZXMgPSBnbG9iYWxPYmplY3QtPmludGxOdW1iZXJGb3JtYXRB
dmFpbGFibGVMb2NhbGVzKCk7CisgICAgY29uc3QgSGFzaFNldDxTdHJpbmc+JiBhdmFpbGFibGVM
b2NhbGVzID0gaW50bE51bWJlckZvcm1hdEF2YWlsYWJsZUxvY2FsZXMoKTsKICAgICBIYXNoTWFw
PFN0cmluZywgU3RyaW5nPiByZXNvbHZlZCA9IHJlc29sdmVMb2NhbGUoZ2xvYmFsT2JqZWN0LCBh
dmFpbGFibGVMb2NhbGVzLCByZXF1ZXN0ZWRMb2NhbGVzLCBsb2NhbGVPcHQsIG51bGxwdHIsIDAs
IEludGxQUkludGVybmFsOjpsb2NhbGVEYXRhKTsKICAgICBtX2xvY2FsZSA9IHJlc29sdmVkLmdl
dCh2bS5wcm9wZXJ0eU5hbWVzLT5sb2NhbGUuc3RyaW5nKCkpOwogICAgIGlmIChtX2xvY2FsZS5p
c0VtcHR5KCkpIHsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0ludGxQbHVy
YWxSdWxlc0NvbnN0cnVjdG9yLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvcnVudGltZS9JbnRsUGx1cmFsUnVsZXNDb25zdHJ1Y3Rvci5jcHAJKHJldmlzaW9uIDI1NTEx
MSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0ludGxQbHVyYWxSdWxlc0NvbnN0
cnVjdG9yLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmln
aHQgKEMpIDIwMTggQW5keSBWYW5XYWdvbmVyIChhbmR5QHZhbndhZ29uZXIuZmFtaWx5KQorICog
Q29weXJpZ2h0IChDKSAyMDIwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpAQCAtMTE3LDcgKzExOCw3IEBAIEVuY29kZWRKU1Zh
bHVlIEpTQ19IT1NUX0NBTEwgSW50bFBsdXJhbFIKIAogICAgIC8vIDEzLjMuMiBJbnRsLlBsdXJh
bFJ1bGVzLnN1cHBvcnRlZExvY2FsZXNPZiAobG9jYWxlcyBbLCBvcHRpb25zIF0pCiAgICAgLy8g
aHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hNDAyLyNzZWMtaW50bC5wbHVyYWxydWxlcy5zdXBw
b3J0ZWRsb2NhbGVzb2YKLSAgICBjb25zdCBIYXNoU2V0PFN0cmluZz4gYXZhaWxhYmxlTG9jYWxl
cyA9IGdsb2JhbE9iamVjdC0+aW50bE51bWJlckZvcm1hdEF2YWlsYWJsZUxvY2FsZXMoKTsKKyAg
ICBjb25zdCBIYXNoU2V0PFN0cmluZz4mIGF2YWlsYWJsZUxvY2FsZXMgPSBpbnRsTnVtYmVyRm9y
bWF0QXZhaWxhYmxlTG9jYWxlcygpOwogCiAgICAgVmVjdG9yPFN0cmluZz4gcmVxdWVzdGVkTG9j
YWxlcyA9IGNhbm9uaWNhbGl6ZUxvY2FsZUxpc3QoZ2xvYmFsT2JqZWN0LCBjYWxsRnJhbWUtPmFy
Z3VtZW50KDApKTsKICAgICBSRVRVUk5fSUZfRVhDRVBUSU9OKHNjb3BlLCBlbmNvZGVkSlNWYWx1
ZSgpKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0pTR2xvYmFsT2JqZWN0
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9KU0dsb2Jh
bE9iamVjdC5jcHAJKHJldmlzaW9uIDI1NTExMSkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9y
dW50aW1lL0pTR2xvYmFsT2JqZWN0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjE3LDkgKzIxNyw2
IEBACiAjaW5jbHVkZSAiSW50bE9iamVjdC5oIgogI2luY2x1ZGUgIkludGxQbHVyYWxSdWxlcy5o
IgogI2luY2x1ZGUgIkludGxQbHVyYWxSdWxlc1Byb3RvdHlwZS5oIgotI2luY2x1ZGUgPHVuaWNv
ZGUvdWNvbC5oPgotI2luY2x1ZGUgPHVuaWNvZGUvdWRhdC5oPgotI2luY2x1ZGUgPHVuaWNvZGUv
dW51bS5oPgogI2VuZGlmIC8vIEVOQUJMRShJTlRMKQogCiAjaWYgRU5BQkxFKFJFTU9URV9JTlNQ
RUNUT1IpCkBAIC0yMDY3LDc5ICsyMDY0LDYgQEAgdm9pZCBKU0dsb2JhbE9iamVjdDo6c2V0TmFt
ZShjb25zdCBTdHJpbgogI2VuZGlmCiB9CiAKLSMgaWYgRU5BQkxFKElOVEwpCi1zdGF0aWMgdm9p
ZCBhZGRNaXNzaW5nU2NyaXB0TG9jYWxlcyhIYXNoU2V0PFN0cmluZz4mIGF2YWlsYWJsZUxvY2Fs
ZXMpCi17Ci0gICAgaWYgKGF2YWlsYWJsZUxvY2FsZXMuY29udGFpbnMoInBhLUFyYWItUEsiKSkK
LSAgICAgICAgYXZhaWxhYmxlTG9jYWxlcy5hZGQoInBhLVBLIl9zKTsKLSAgICBpZiAoYXZhaWxh
YmxlTG9jYWxlcy5jb250YWlucygiemgtSGFucy1DTiIpKQotICAgICAgICBhdmFpbGFibGVMb2Nh
bGVzLmFkZCgiemgtQ04iX3MpOwotICAgIGlmIChhdmFpbGFibGVMb2NhbGVzLmNvbnRhaW5zKCJ6
aC1IYW50LUhLIikpCi0gICAgICAgIGF2YWlsYWJsZUxvY2FsZXMuYWRkKCJ6aC1ISyJfcyk7Ci0g
ICAgaWYgKGF2YWlsYWJsZUxvY2FsZXMuY29udGFpbnMoInpoLUhhbnMtU0ciKSkKLSAgICAgICAg
YXZhaWxhYmxlTG9jYWxlcy5hZGQoInpoLVNHIl9zKTsKLSAgICBpZiAoYXZhaWxhYmxlTG9jYWxl
cy5jb250YWlucygiemgtSGFudC1UVyIpKQotICAgICAgICBhdmFpbGFibGVMb2NhbGVzLmFkZCgi
emgtVFciX3MpOwotfQotCi1jb25zdCBIYXNoU2V0PFN0cmluZz4mIEpTR2xvYmFsT2JqZWN0Ojpp
bnRsQ29sbGF0b3JBdmFpbGFibGVMb2NhbGVzKCkKLXsKLSAgICBpZiAobV9pbnRsQ29sbGF0b3JB
dmFpbGFibGVMb2NhbGVzLmlzRW1wdHkoKSkgewotICAgICAgICBpbnQzMl90IGNvdW50ID0gdWNv
bF9jb3VudEF2YWlsYWJsZSgpOwotICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb3Vu
dDsgKytpKSB7Ci0gICAgICAgICAgICBTdHJpbmcgbG9jYWxlID0gY29udmVydElDVUxvY2FsZVRv
QkNQNDdMYW5ndWFnZVRhZyh1Y29sX2dldEF2YWlsYWJsZShpKSk7Ci0gICAgICAgICAgICBpZiAo
IWxvY2FsZS5pc0VtcHR5KCkpCi0gICAgICAgICAgICAgICAgbV9pbnRsQ29sbGF0b3JBdmFpbGFi
bGVMb2NhbGVzLmFkZChsb2NhbGUpOwotICAgICAgICB9Ci0gICAgICAgIGFkZE1pc3NpbmdTY3Jp
cHRMb2NhbGVzKG1faW50bENvbGxhdG9yQXZhaWxhYmxlTG9jYWxlcyk7Ci0gICAgfQotICAgIHJl
dHVybiBtX2ludGxDb2xsYXRvckF2YWlsYWJsZUxvY2FsZXM7Ci19Ci0KLWNvbnN0IEhhc2hTZXQ8
U3RyaW5nPiYgSlNHbG9iYWxPYmplY3Q6OmludGxEYXRlVGltZUZvcm1hdEF2YWlsYWJsZUxvY2Fs
ZXMoKQotewotICAgIGlmIChtX2ludGxEYXRlVGltZUZvcm1hdEF2YWlsYWJsZUxvY2FsZXMuaXNF
bXB0eSgpKSB7Ci0gICAgICAgIGludDMyX3QgY291bnQgPSB1ZGF0X2NvdW50QXZhaWxhYmxlKCk7
Ci0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAg
ICAgIFN0cmluZyBsb2NhbGUgPSBjb252ZXJ0SUNVTG9jYWxlVG9CQ1A0N0xhbmd1YWdlVGFnKHVk
YXRfZ2V0QXZhaWxhYmxlKGkpKTsKLSAgICAgICAgICAgIGlmICghbG9jYWxlLmlzRW1wdHkoKSkK
LSAgICAgICAgICAgICAgICBtX2ludGxEYXRlVGltZUZvcm1hdEF2YWlsYWJsZUxvY2FsZXMuYWRk
KGxvY2FsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkTWlzc2luZ1NjcmlwdExvY2FsZXMobV9p
bnRsRGF0ZVRpbWVGb3JtYXRBdmFpbGFibGVMb2NhbGVzKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1f
aW50bERhdGVUaW1lRm9ybWF0QXZhaWxhYmxlTG9jYWxlczsKLX0KLQotY29uc3QgSGFzaFNldDxT
dHJpbmc+JiBKU0dsb2JhbE9iamVjdDo6aW50bE51bWJlckZvcm1hdEF2YWlsYWJsZUxvY2FsZXMo
KQotewotICAgIGlmIChtX2ludGxOdW1iZXJGb3JtYXRBdmFpbGFibGVMb2NhbGVzLmlzRW1wdHko
KSkgewotICAgICAgICBpbnQzMl90IGNvdW50ID0gdW51bV9jb3VudEF2YWlsYWJsZSgpOwotICAg
ICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICAgICAgICBT
dHJpbmcgbG9jYWxlID0gY29udmVydElDVUxvY2FsZVRvQkNQNDdMYW5ndWFnZVRhZyh1bnVtX2dl
dEF2YWlsYWJsZShpKSk7Ci0gICAgICAgICAgICBpZiAoIWxvY2FsZS5pc0VtcHR5KCkpCi0gICAg
ICAgICAgICAgICAgbV9pbnRsTnVtYmVyRm9ybWF0QXZhaWxhYmxlTG9jYWxlcy5hZGQobG9jYWxl
KTsKLSAgICAgICAgfQotICAgICAgICBhZGRNaXNzaW5nU2NyaXB0TG9jYWxlcyhtX2ludGxOdW1i
ZXJGb3JtYXRBdmFpbGFibGVMb2NhbGVzKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1faW50bE51bWJl
ckZvcm1hdEF2YWlsYWJsZUxvY2FsZXM7Ci19Ci0KLWNvbnN0IEhhc2hTZXQ8U3RyaW5nPiYgSlNH
bG9iYWxPYmplY3Q6OmludGxQbHVyYWxSdWxlc0F2YWlsYWJsZUxvY2FsZXMoKQotewotICAgIGlm
IChtX2ludGxQbHVyYWxSdWxlc0F2YWlsYWJsZUxvY2FsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAg
IGludDMyX3QgY291bnQgPSB1bG9jX2NvdW50QXZhaWxhYmxlKCk7Ci0gICAgICAgIGZvciAoaW50
MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgICAgIFN0cmluZyBsb2NhbGUg
PSBjb252ZXJ0SUNVTG9jYWxlVG9CQ1A0N0xhbmd1YWdlVGFnKHVsb2NfZ2V0QXZhaWxhYmxlKGkp
KTsKLSAgICAgICAgICAgIGlmICghbG9jYWxlLmlzRW1wdHkoKSkKLSAgICAgICAgICAgICAgICBt
X2ludGxQbHVyYWxSdWxlc0F2YWlsYWJsZUxvY2FsZXMuYWRkKGxvY2FsZSk7Ci0gICAgICAgIH0K
LSAgICAgICAgYWRkTWlzc2luZ1NjcmlwdExvY2FsZXMobV9pbnRsUGx1cmFsUnVsZXNBdmFpbGFi
bGVMb2NhbGVzKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1faW50bFBsdXJhbFJ1bGVzQXZhaWxhYmxl
TG9jYWxlczsKLX0KLQotI2VuZGlmIC8vIEVOQUJMRShJTlRMKQotCiB2b2lkIEpTR2xvYmFsT2Jq
ZWN0OjpidW1wR2xvYmFsTGV4aWNhbEJpbmRpbmdFcG9jaChWTSYgdm0pCiB7CiAgICAgaWYgKCsr
bV9nbG9iYWxMZXhpY2FsQmluZGluZ0Vwb2NoID09IE9wdGlvbnM6OnRocmVzaG9sZEZvckdsb2Jh
bExleGljYWxCaW5kaW5nRXBvY2goKSkgewpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1
bnRpbWUvSlNHbG9iYWxPYmplY3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvcnVudGltZS9KU0dsb2JhbE9iamVjdC5oCShyZXZpc2lvbiAyNTUxMTEpCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvcnVudGltZS9KU0dsb2JhbE9iamVjdC5oCSh3b3JraW5nIGNvcHkpCkBA
IC00MzUsMTMgKzQzNSw2IEBAIHB1YmxpYzoKICAgICBzdGQ6OnVuaXF1ZV9wdHI8SlNHbG9iYWxP
YmplY3REZWJ1Z2dhYmxlPiBtX2luc3BlY3RvckRlYnVnZ2FibGU7CiAjZW5kaWYKIAotI2lmIEVO
QUJMRShJTlRMKQotICAgIEhhc2hTZXQ8U3RyaW5nPiBtX2ludGxDb2xsYXRvckF2YWlsYWJsZUxv
Y2FsZXM7Ci0gICAgSGFzaFNldDxTdHJpbmc+IG1faW50bERhdGVUaW1lRm9ybWF0QXZhaWxhYmxl
TG9jYWxlczsKLSAgICBIYXNoU2V0PFN0cmluZz4gbV9pbnRsTnVtYmVyRm9ybWF0QXZhaWxhYmxl
TG9jYWxlczsKLSAgICBIYXNoU2V0PFN0cmluZz4gbV9pbnRsUGx1cmFsUnVsZXNBdmFpbGFibGVM
b2NhbGVzOwotI2VuZGlmIC8vIEVOQUJMRShJTlRMKQotCiAgICAgUmVmUHRyPFdhdGNocG9pbnRT
ZXQ+IG1fbWFzcXVlcmFkZXNBc1VuZGVmaW5lZFdhdGNocG9pbnQ7CiAgICAgUmVmUHRyPFdhdGNo
cG9pbnRTZXQ+IG1faGF2aW5nQUJhZFRpbWVXYXRjaHBvaW50OwogICAgIFJlZlB0cjxXYXRjaHBv
aW50U2V0PiBtX3ZhckluamVjdGlvbldhdGNocG9pbnQ7CkBAIC03OTgsMTMgKzc5MSw2IEBAIHB1
YmxpYzoKICAgICBKU0dsb2JhbE9iamVjdERlYnVnZ2FibGUmIGluc3BlY3RvckRlYnVnZ2FibGUo
KSB7IHJldHVybiAqbV9pbnNwZWN0b3JEZWJ1Z2dhYmxlLmdldCgpOyB9CiAjZW5kaWYKIAotI2lm
IEVOQUJMRShJTlRMKQotICAgIGNvbnN0IEhhc2hTZXQ8U3RyaW5nPiYgaW50bENvbGxhdG9yQXZh
aWxhYmxlTG9jYWxlcygpOwotICAgIGNvbnN0IEhhc2hTZXQ8U3RyaW5nPiYgaW50bERhdGVUaW1l
Rm9ybWF0QXZhaWxhYmxlTG9jYWxlcygpOwotICAgIGNvbnN0IEhhc2hTZXQ8U3RyaW5nPiYgaW50
bE51bWJlckZvcm1hdEF2YWlsYWJsZUxvY2FsZXMoKTsKLSAgICBjb25zdCBIYXNoU2V0PFN0cmlu
Zz4mIGludGxQbHVyYWxSdWxlc0F2YWlsYWJsZUxvY2FsZXMoKTsKLSNlbmRpZiAvLyBFTkFCTEUo
SU5UTCkKLQogICAgIHZvaWQgYnVtcEdsb2JhbExleGljYWxCaW5kaW5nRXBvY2goVk0mKTsKICAg
ICB1bnNpZ25lZCBnbG9iYWxMZXhpY2FsQmluZGluZ0Vwb2NoKCkgY29uc3QgeyByZXR1cm4gbV9n
bG9iYWxMZXhpY2FsQmluZGluZ0Vwb2NoOyB9CiAgICAgc3RhdGljIHB0cmRpZmZfdCBnbG9iYWxM
ZXhpY2FsQmluZGluZ0Vwb2NoT2Zmc2V0KCkgeyByZXR1cm4gT0JKRUNUX09GRlNFVE9GKEpTR2xv
YmFsT2JqZWN0LCBtX2dsb2JhbExleGljYWxCaW5kaW5nRXBvY2gpOyB9CkluZGV4OiBTb3VyY2Uv
V1RGL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV1RGL0NoYW5nZUxvZwkocmV2aXNp
b24gMjU1MTEyKQorKysgU291cmNlL1dURi9DaGFuZ2VMb2cJKHdvcmtpbmcgY29weSkKQEAgLTEs
MyArMSwxOSBAQAorMjAyMC0wMS0yNCAgTWFyayBMYW0gIDxtYXJrLmxhbUBhcHBsZS5jb20+CisK
KyAgICAgICAgTW92ZSBzaW5nbGV0b24gSW50bCBzdHJpbmcgbG9jYWxlcyBvdXQgb2YgSlNHbG9i
YWxPYmplY3QuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0yMDY3OTEKKyAgICAgICAgPHJkYXI6Ly9wcm9ibGVtLzU4ODg5MDM3PgorCisgICAgICAgIFJl
dmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIEZpeCBhIGJ1ZyBpbiBTdHJpbmdJ
bXBsOjpjcmVhdGVTdGF0aWNTdHJpbmdJbXBsKCk6IEkgZm9yZ290IHRvIHNldCBpdHMgaGFzaCB2
YWx1ZQorICAgICAgICB3aGVuIEkgaW50cm9kdWNlZCBpdC4gIFN0YXRpY1N0cmluZ0ltcGxzIHJl
cXVpcmUgdGhhdCBpdHMgaGFzaCBjb2RlIGJlIHNldCBhaGVhZAorICAgICAgICBvZiB0aW1lLCBh
bmQgY2Fubm90IGJlIG11dGF0ZWQgYXQgcnVudGltZS4gIFNlZSB0aGUgY29tbWVudCBpbiB0aGUg
ZGVmaW5pdGlvbiBvZgorICAgICAgICBTdGF0aWNTdHJpbmdJbXBsIGluIFN0cmluZ0ltcGwuaC4K
KworICAgICAgICAqIHd0Zi90ZXh0L1N0cmluZ0ltcGwuY3BwOgorICAgICAgICAoV1RGOjpTdHJp
bmdJbXBsOjpjcmVhdGVTdGF0aWNTdHJpbmdJbXBsKToKKwogMjAyMC0wMS0yNCAgTWFyayBMYW0g
IDxtYXJrLmxhbUBhcHBsZS5jb20+CiAKICAgICAgICAgSW50bE9iamVjdCdzIGNhY2hlZCBzdHJp
bmdzIHNob3VsZCBiZSBpbW1vcnRhbCBhbmQgc2FmZSBmb3IgY29uY3VycmVudCBhY2Nlc3MuCklu
ZGV4OiBTb3VyY2UvV1RGL3d0Zi90ZXh0L1N0cmluZ0ltcGwuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XVEYvd3RmL3RleHQvU3RyaW5nSW1wbC5jcHAJKHJldmlzaW9uIDI1NTExMikKKysrIFNv
dXJjZS9XVEYvd3RmL3RleHQvU3RyaW5nSW1wbC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI4Myw4
ICsyODMsMTAgQEAgUmVmPFN0cmluZ0ltcGw+IFN0cmluZ0ltcGw6OmNyZWF0ZShjb25zdAogCiBS
ZWY8U3RyaW5nSW1wbD4gU3RyaW5nSW1wbDo6Y3JlYXRlU3RhdGljU3RyaW5nSW1wbChjb25zdCBj
aGFyKiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBsZW5ndGgpCiB7Ci0gICAgQVNTRVJUKGNoYXJhY3Rl
cnNBcmVBbGxBU0NJSTxMQ2hhcj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBMQ2hhcio+KGNoYXJh
Y3RlcnMpLCBsZW5ndGgpKTsKLSAgICBSZWY8U3RyaW5nSW1wbD4gcmVzdWx0ID0gY3JlYXRlSW50
ZXJuYWwocmVpbnRlcnByZXRfY2FzdDxjb25zdCBMQ2hhcio+KGNoYXJhY3RlcnMpLCBsZW5ndGgp
OworICAgIGNvbnN0IExDaGFyKiBsY2hhckNoYXJhY3RlcnMgPSByZWludGVycHJldF9jYXN0PGNv
bnN0IExDaGFyKj4oY2hhcmFjdGVycyk7CisgICAgQVNTRVJUKGNoYXJhY3RlcnNBcmVBbGxBU0NJ
STxMQ2hhcj4obGNoYXJDaGFyYWN0ZXJzLCBsZW5ndGgpKTsKKyAgICBSZWY8U3RyaW5nSW1wbD4g
cmVzdWx0ID0gY3JlYXRlSW50ZXJuYWwobGNoYXJDaGFyYWN0ZXJzLCBsZW5ndGgpOworICAgIHJl
c3VsdC0+c2V0SGFzaChTdHJpbmdIYXNoZXI6OmNvbXB1dGVIYXNoQW5kTWFza1RvcDhCaXRzKGxj
aGFyQ2hhcmFjdGVycywgbGVuZ3RoKSk7CiAgICAgcmVzdWx0LT5tX3JlZkNvdW50IHw9IHNfcmVm
Q291bnRGbGFnSXNTdGF0aWNTdHJpbmc7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0K
</data>
<flag name="review"
          id="404474"
          type_id="1"
          status="+"
          setter="ysuzuki"
    />
          </attachment>
      

    </bug>

</bugzilla>