<?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>102063</bug_id>
          
          <creation_ts>2012-11-13 02:12:44 -0800</creation_ts>
          <short_desc>Porting WebKit to a new graphics library backend</short_desc>
          <delta_ts>2012-11-17 09:09:44 -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>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>UNCONFIRMED</bug_status>
          <resolution></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>0</everconfirmed>
          <reporter name="Zhang Ji Peng">onecoolx</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>ap</cc>
    
    <cc>cmarcelo</cc>
    
    <cc>eric</cc>
    
    <cc>gaborb</cc>
    
    <cc>onecoolx</cc>
    
    <cc>peter</cc>
    
    <cc>reed</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>765409</commentid>
    <comment_count>0</comment_count>
      <attachid>173852</attachid>
    <who name="Zhang Ji Peng">onecoolx</who>
    <bug_when>2012-11-13 02:12:44 -0800</bug_when>
    <thetext>Created attachment 173852
picasso backend porting

Porting webkit to a new graphics library for rendering.  I porting webkit to a new graphics library, because I need to rendeting webpage to any platform. The graphic library named Picasso(http://picasso-graphic.googlecode.com/files/picasso12_source.tar.gz). Only a Mobile browser use this port at present(http://www.zncsoft.com/down.html).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>765415</commentid>
    <comment_count>1</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-11-13 02:16:47 -0800</bug_when>
    <thetext>Attachment 173852 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;]&quot; exit_code: 1
Total errors found: 0 in 0 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>765427</commentid>
    <comment_count>2</comment_count>
    <who name="Peter Beverloo">peter</who>
    <bug_when>2012-11-13 02:52:21 -0800</bug_when>
    <thetext>Which port will be using Picasso? Will it be actively maintained?

Please send an e-mail to webkit-dev about your plans so others can chime in here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>766186</commentid>
    <comment_count>3</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-11-13 17:00:37 -0800</bug_when>
    <thetext>According to http://code.google.com/p/picasso-graphic/ there is only one member of that project (the author of this bug).

Unless there are ports wanting to use this already, I believe this violates one of WebKit&apos;s stated non-goals:

WebKit is an engineering project not a science project.
For new features to be adopted into WebKit, we strongly prefer for the technology or at least the use case for it to be proven.

http://www.webkit.org/projects/goals.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>766387</commentid>
    <comment_count>4</comment_count>
    <who name="Zhang Ji Peng">onecoolx</who>
    <bug_when>2012-11-13 21:13:40 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; According to http://code.google.com/p/picasso-graphic/ there is only one member of that project (the author of this bug).
&gt; 
&gt; Unless there are ports wanting to use this already, I believe this violates one of WebKit&apos;s stated non-goals:
&gt; 
&gt; WebKit is an engineering project not a science project.
&gt; For new features to be adopted into WebKit, we strongly prefer for the technology or at least the use case for it to be proven.
&gt; 
&gt; http://www.webkit.org/projects/goals.html

The Picasso porting is used to a mobile webbrowser. Home page athttp://www.zncsoft.com/down.html  It is running on WinCE, Windows Mobile and Linux. All platforms use the same porting, so I want to contribute to this part of the code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>768301</commentid>
    <comment_count>5</comment_count>
      <attachid>173852</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-11-15 10:51:12 -0800</bug_when>
    <thetext>Comment on attachment 173852
picasso backend porting

I&apos;m sorry, but this patch is too large to review.  We also need buy-in from the community before making a change like this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>769349</commentid>
    <comment_count>6</comment_count>
    <who name="Zhang Ji Peng">onecoolx</who>
    <bug_when>2012-11-16 09:21:37 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 173852 [details])
&gt; I&apos;m sorry, but this patch is too large to review.  We also need buy-in from the community before making a change like this.
Please tell me the right way to contribute a porting , I will be very grateful.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>769372</commentid>
    <comment_count>7</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-11-16 09:46:04 -0800</bug_when>
    <thetext>&gt; Please tell me the right way to contribute a porting , I will be very grateful.

The first step is to get community buy-in for this project.  The thread you&apos;ve started in webkit-dev is a good way to do that.

After you have support from the community, you&apos;ll need to break up this patch into smaller pieces that can be reviewed.  I think we recommend patches that are smaller than 20 KB, but that&apos;s just a guideline, not any kind of hard rule.

I think the main question that people have about this patch is how widely used will USE(PICASSO) be?  Are you the only one who is going to work on it?  Are there going to be buildbots that build and test this configuration?  etc.  Supporting a new graphics back end is a lot of work for the community.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>769953</commentid>
    <comment_count>8</comment_count>
    <who name="Zhang Ji Peng">onecoolx</who>
    <bug_when>2012-11-17 09:09:44 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; &gt; Please tell me the right way to contribute a porting , I will be very grateful.
&gt; 
&gt; The first step is to get community buy-in for this project.  The thread you&apos;ve started in webkit-dev is a good way to do that.
&gt; 
&gt; After you have support from the community, you&apos;ll need to break up this patch into smaller pieces that can be reviewed.  I think we recommend patches that are smaller than 20 KB, but that&apos;s just a guideline, not any kind of hard rule.
&gt; 
&gt; I think the main question that people have about this patch is how widely used will USE(PICASSO) be?  Are you the only one who is going to work on it?  Are there going to be buildbots that build and test this configuration?  etc.  Supporting a new graphics back end is a lot of work for the community.

ok, I get it. Thanks</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>173852</attachid>
            <date>2012-11-13 02:12:44 -0800</date>
            <delta_ts>2012-11-15 10:51:12 -0800</delta_ts>
            <desc>picasso backend porting</desc>
            <filename>picasso_port.patch</filename>
            <type>text/plain</type>
            <size>178175</size>
            <attacher name="Zhang Ji Peng">onecoolx</attacher>
            
              <data encoding="base64">ZGlmZiAtdXJOIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0JpdG1hcEltYWdlLmgg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQml0bWFwSW1hZ2UuaAotLS0gU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvQml0bWFwSW1hZ2UuaAkyMDEyLTExLTEwIDEzOjQw
OjIxLjAwMDAwMDAwMCArMDgwMAorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Qml0bWFwSW1hZ2UuaAkyMDEyLTExLTEyIDIwOjE2OjQ5LjAwMDAwMDAwMCArMDgwMApAQCAtMiw2
ICsyLDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwNiBTYW11ZWwgV2VpbmlnIChzYW0ud2Vpbmln
QGdtYWlsLmNvbSkKICAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNiBBcHBsZSBDb21w
dXRlciwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAwOC0y
MDA5IFRvcmNoIE1vYmlsZSwgSW5jLgorICogQ29weXJpZ2h0IChjKSAyMDEyIFpoYW5nIEppIFBl
bmcgPG9uZWNvb2x4QGdtYWlsLmNvbT4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwpA
QCAtMTY5LDYgKzE3MCwxMCBAQAogICAgIHN0YXRpYyBQYXNzUmVmUHRyPEJpdG1hcEltYWdlPiBj
cmVhdGUoY2Fpcm9fc3VyZmFjZV90Kik7CiAjZW5kaWYKIAorI2lmIFVTRShQSUNBU1NPKQorICAg
IHN0YXRpYyBQYXNzUmVmUHRyPEJpdG1hcEltYWdlPiBjcmVhdGUocHNfaW1hZ2UqLCBib29sKTsK
KyNlbmRpZgorCiAjaWYgUExBVEZPUk0oR1RLKQogICAgIHZpcnR1YWwgR2RrUGl4YnVmKiBnZXRH
ZGtQaXhidWYoKTsKICNlbmRpZgpkaWZmIC11ck4gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvRmxvYXRSZWN0LmggU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRmxvYXRS
ZWN0LmgKLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0Zsb2F0UmVjdC5oCTIw
MTItMTEtMDggMTI6MjY6MjUuMDAwMDAwMDAwICswODAwCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9GbG9hdFJlY3QuaAkyMDEyLTExLTEyIDIwOjE2OjQ5LjAwMDAwMDAwMCAr
MDgwMApAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDYsIDIw
MDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqIENvcHlyaWdodCAoQykgMjAw
NSBOb2tpYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgWmhh
bmcgSmkgUGVuZyA8b25lY29vbHhAZ21haWwuY29tPgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCkBAIC02OCw2ICs2OSwxMCBAQAogdHlwZWRlZiBzdHJ1Y3QgX2NhaXJvX3JlY3Rhbmds
ZSBjYWlyb19yZWN0YW5nbGVfdDsKICNlbmRpZgogCisjaWYgVVNFKFBJQ0FTU08pCit0eXBlZGVm
IHN0cnVjdCBfcHNfcmVjdCBwc19yZWN0OworI2VuZGlmCisKIG5hbWVzcGFjZSBXZWJDb3JlIHsK
IAogI2lmIFBMQVRGT1JNKE9QRU5WRykKQEAgLTIzMSw2ICsyMzYsMTAgQEAKICAgICBvcGVyYXRv
ciBjYWlyb19yZWN0YW5nbGVfdCgpIGNvbnN0OwogI2VuZGlmCiAKKyNpZiBVU0UoUElDQVNTTykK
KyAgICBGbG9hdFJlY3QoY29uc3QgcHNfcmVjdCYpOworICAgIG9wZXJhdG9yIHBzX3JlY3QoKSBj
b25zdDsKKyNlbmRpZgogcHJpdmF0ZToKICAgICBGbG9hdFBvaW50IG1fbG9jYXRpb247CiAgICAg
RmxvYXRTaXplIG1fc2l6ZTsKZGlmZiAtdXJOIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL0ZvbnRQbGF0Zm9ybURhdGEuaCBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9G
b250UGxhdGZvcm1EYXRhLmgKLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0Zv
bnRQbGF0Zm9ybURhdGEuaAkyMDEyLTEwLTMxIDA4OjIyOjIwLjAwMDAwMDAwMCArMDgwMAorKysg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udFBsYXRmb3JtRGF0YS5oCTIwMTIt
MTEtMTIgMjA6MTY6NDkuMDAwMDAwMDAwICswODAwCkBAIC00LDYgKzQsNyBAQAogICogQ29weXJp
Z2h0IChDKSAyMDA3IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCiAgKiBDb3B5cmlnaHQgKEMp
IDIwMDcgUGlvbmVlciBSZXNlYXJjaCBDZW50ZXIgVVNBLCBJbmMuCiAgKiBDb3B5cmlnaHQgKEMp
IDIwMTAsIDIwMTEgQnJlbnQgRnVsZ2hhbSA8YmZ1bGdoYW1Ad2Via2l0Lm9yZz4KKyAqIENvcHly
aWdodCAoYykgMjAxMiBaaGFuZyBKaSBQZW5nIDxvbmVjb29seEBnbWFpbC5jb20+CiAgKgogICog
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgogICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMKQEAgLTMxLDYgKzMyLDggQEAKICNpbmNsdWRlICJ3aW5jZS9Gb250UGxhdGZv
cm1EYXRhLmgiCiAjZWxpZiBQTEFURk9STShXWCkKICNpbmNsdWRlICJ3eC9Gb250UGxhdGZvcm1E
YXRhLmgiCisjZWxpZiBVU0UoUElDQVNTTykKKyNpbmNsdWRlICJwaWNhc3NvL0ZvbnRQbGF0Zm9y
bURhdGEuaCIKICNlbGlmIChQTEFURk9STShFRkwpIHx8IFBMQVRGT1JNKEdUSykpICYmIFVTRShG
UkVFVFlQRSkKICNpbmNsdWRlICJmcmVldHlwZS9Gb250UGxhdGZvcm1EYXRhLmgiCiAjZWxpZiAo
UExBVEZPUk0oRUZMKSB8fCBQTEFURk9STShHVEspKSAmJiBVU0UoUEFOR08pCmRpZmYgLXVyTiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFkaWVudC5oIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL0dyYWRpZW50LmgKLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL0dyYWRpZW50LmgJMjAxMi0wNy0xNSAxMTowMzo1Ny4wMDAwMDAwMDAgKzA4MDAK
KysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYWRpZW50LmgJMjAxMi0xMS0x
MiAyMDoxNjo0OS4wMDAwMDAwMDAgKzA4MDAKQEAgLTIsNiArMiw3IEBACiAgKiBDb3B5cmlnaHQg
KEMpIDIwMDYsIDIwMDcsIDIwMDgsIDIwMTEgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgogICogQ29weXJpZ2h0IChDKSAyMDA3IEFscCBUb2tlciA8YWxwQGF0b2tlci5jb20+CiAgKiBD
b3B5cmlnaHQgKEMpIDIwMDggVG9yY2ggTW9iaWxlLCBJbmMuCisgKiBDb3B5cmlnaHQgKGMpIDIw
MTIgWmhhbmcgSmkgUGVuZyA8b25lY29vbHhAZ21haWwuY29tPgogICoKICAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAog
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCkBAIC01Nyw2ICs1OCw5IEBACiAjZWxpZiBVU0UoQ0FJUk8pCiB0eXBlZGVm
IHN0cnVjdCBfY2Fpcm9fcGF0dGVybiBjYWlyb19wYXR0ZXJuX3Q7CiB0eXBlZGVmIGNhaXJvX3Bh
dHRlcm5fdCogUGxhdGZvcm1HcmFkaWVudDsKKyNlbGlmIFVTRShQSUNBU1NPKQordHlwZWRlZiBz
dHJ1Y3QgX3BzX2dyYWRpZW50IHBzX2dyYWRpZW50OwordHlwZWRlZiBwc19ncmFkaWVudCogUGxh
dGZvcm1HcmFkaWVudDsKICNlbGlmIFVTRShTS0lBKQogY2xhc3MgU2tTaGFkZXI7CiB0eXBlZGVm
IGNsYXNzIFNrU2hhZGVyKiBQbGF0Zm9ybUdyYWRpZW50OwpAQCAtMTc4LDcgKzE4Miw3IEBACiAj
aWYgVVNFKENHKQogICAgICAgICB2b2lkIHBhaW50KENHQ29udGV4dFJlZik7CiAgICAgICAgIHZv
aWQgcGFpbnQoR3JhcGhpY3NDb250ZXh0Kik7Ci0jZWxpZiBVU0UoQ0FJUk8pCisjZWxpZiBVU0Uo
Q0FJUk8pIHx8IFVTRShQSUNBU1NPKQogICAgICAgICBQbGF0Zm9ybUdyYWRpZW50IHBsYXRmb3Jt
R3JhZGllbnQoZmxvYXQgZ2xvYmFsQWxwaGEpOwogI2VuZGlmCiAKQEAgLTIwOSw3ICsyMTMsNyBA
QAogCiAgICAgICAgIFBsYXRmb3JtR3JhZGllbnQgbV9ncmFkaWVudDsKIAotI2lmIFVTRShDQUlS
TykKKyNpZiBVU0UoQ0FJUk8pIHx8IFVTRShQSUNBU1NPKQogICAgICAgICBmbG9hdCBtX3BsYXRm
b3JtR3JhZGllbnRBbHBoYTsKICNlbmRpZgogCmRpZmYgLXVyTiBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQzRC5oIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dDNELmgKLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dDNELmgJMjAxMi0xMC0yNiAyMzowNDoyNi4wMDAwMDAw
MDAgKzA4MDAKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29u
dGV4dDNELmgJMjAxMi0xMS0xMiAyMDoxNjo0OS4wMDAwMDAwMDAgKzA4MDAKQEAgLTEsNSArMSw2
IEBACiAvKgogICogQ29weXJpZ2h0IChDKSAyMDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMiBaaGFuZyBKaSBQZW5nIDxvbmVjb29seEBnbWFp
bC5jb20+CiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTEwNiw2ICsxMDcsOCBA
QAogY2xhc3MgSW50U2l6ZTsKICNpZiBVU0UoQ0FJUk8pCiBjbGFzcyBQbGF0Zm9ybUNvbnRleHRD
YWlybzsKKyNlbGlmIFVTRShQSUNBU1NPKQorY2xhc3MgUGxhdGZvcm1Db250ZXh0UFM7CiAjZWxp
ZiBQTEFURk9STShCTEFDS0JFUlJZKQogY2xhc3MgR3JhcGhpY3NDb250ZXh0OwogI2VuZGlmCkBA
IC04MDIsOSArODA1LDEyIEBACiAjaWYgVVNFKENHKQogICAgIHN0YXRpYyB2b2lkIHBhaW50VG9D
YW52YXMoY29uc3QgdW5zaWduZWQgY2hhciogaW1hZ2VQaXhlbHMsIGludCBpbWFnZVdpZHRoLCBp
bnQgaW1hZ2VIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FudmFz
V2lkdGgsIGludCBjYW52YXNIZWlnaHQsIENHQ29udGV4dFJlZik7Ci0jZWxpZiBQTEFURk9STShH
VEspIHx8IFBMQVRGT1JNKEVGTCkKKyNlbGlmIFVTRShDQUlSTykKICAgICB2b2lkIHBhaW50VG9D
YW52YXMoY29uc3QgdW5zaWduZWQgY2hhciogaW1hZ2VQaXhlbHMsIGludCBpbWFnZVdpZHRoLCBp
bnQgaW1hZ2VIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYW52YXNXaWR0aCwg
aW50IGNhbnZhc0hlaWdodCwgUGxhdGZvcm1Db250ZXh0Q2Fpcm8qIGNvbnRleHQpOworI2VsaWYg
VVNFKFBJQ0FTU08pCisgICAgdm9pZCBwYWludFRvQ2FudmFzKGNvbnN0IHVuc2lnbmVkIGNoYXIq
IGltYWdlUGl4ZWxzLCBpbnQgaW1hZ2VXaWR0aCwgaW50IGltYWdlSGVpZ2h0LAorICAgICAgICAg
ICAgICAgICAgICAgICBpbnQgY2FudmFzV2lkdGgsIGludCBjYW52YXNIZWlnaHQsIFBsYXRmb3Jt
Q29udGV4dFBTKiBjb250ZXh0KTsKICNlbGlmIFBMQVRGT1JNKFFUKQogICAgIHZvaWQgcGFpbnRU
b0NhbnZhcyhjb25zdCB1bnNpZ25lZCBjaGFyKiBpbWFnZVBpeGVscywgaW50IGltYWdlV2lkdGgs
IGludCBpbWFnZUhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhbnZhc1dpZHRo
LCBpbnQgY2FudmFzSGVpZ2h0LCBRUGFpbnRlciogY29udGV4dCk7CmRpZmYgLXVyTiBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuaCBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuaAotLS0gU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0LmgJMjAxMi0xMC0yMyAwMjoxODozNi4w
MDAwMDAwMDAgKzA4MDAKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBo
aWNzQ29udGV4dC5oCTIwMTItMTEtMTIgMjA6MTY6NDkuMDAwMDAwMDAwICswODAwCkBAIC0xLDYg
KzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAoQykgMjAwMywgMjAwNiwgMjAwNywgMjAwOCwgMjAw
OSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDgt
MjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KKyAqIENvcHlyaWdodCAoYykgMjAxMiBaaGFuZyBKaSBQ
ZW5nIDxvbmVjb29seEBnbWFpbC5jb20+CiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
QEAgLTQ1LDYgKzQ2LDExIEBACiBjbGFzcyBQbGF0Zm9ybUNvbnRleHRDYWlybzsKIH0KIHR5cGVk
ZWYgV2ViQ29yZTo6UGxhdGZvcm1Db250ZXh0Q2Fpcm8gUGxhdGZvcm1HcmFwaGljc0NvbnRleHQ7
CisjZWxpZiBVU0UoUElDQVNTTykKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIFBsYXRmb3Jt
Q29udGV4dFBTOworfQordHlwZWRlZiBXZWJDb3JlOjpQbGF0Zm9ybUNvbnRleHRQUyBQbGF0Zm9y
bUdyYXBoaWNzQ29udGV4dDsKICNlbGlmIFBMQVRGT1JNKE9QRU5WRykKIG5hbWVzcGFjZSBXZWJD
b3JlIHsKIGNsYXNzIFN1cmZhY2VPcGVuVkc7CkBAIC01MTUsNiArNTIxLDEwIEBACiAgICAgICAg
IEdyYXBoaWNzQ29udGV4dChjYWlyb190Kik7CiAjZW5kaWYKIAorI2lmIFVTRShQSUNBU1NPKQor
ICAgICAgICBHcmFwaGljc0NvbnRleHQocHNfY29udGV4dCopOworI2VuZGlmCisKICNpZiBQTEFU
Rk9STShHVEspCiAgICAgICAgIHZvaWQgc2V0R2RrRXhwb3NlRXZlbnQoR2RrRXZlbnRFeHBvc2Uq
KTsKICAgICAgICAgR2RrV2luZG93KiBnZGtXaW5kb3coKSBjb25zdDsKZGlmZiAtdXJOIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9JbWFnZUdTdHJlYW1lclBTLmNw
cCBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9nc3RyZWFtZXIvSW1hZ2VHU3RyZWFt
ZXJQUy5jcHAKLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2dzdHJlYW1lci9J
bWFnZUdTdHJlYW1lclBTLmNwcAkxOTcwLTAxLTAxIDA4OjAwOjAwLjAwMDAwMDAwMCArMDgwMAor
KysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3N0cmVhbWVyL0ltYWdlR1N0cmVh
bWVyUFMuY3BwCTIwMTItMTEtMTIgMjA6MTY6NDkuMDAwMDAwMDAwICswODAwCkBAIC0wLDAgKzEs
NzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgWmhhbmcgSmkgUGVuZyA8b25lY29vbHhA
Z21haWwuY29tPgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2Fu
IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2Vp
dmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICog
YWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5v
dCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZy
YW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVT
QS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW1hZ2VHU3RyZWFtZXIu
aCIKKworI2lmIEVOQUJMRShWSURFTykgJiYgVVNFKEdTVFJFQU1FUikKKworI2luY2x1ZGUgPHBp
Y2Fzc28uaD4KKyNpbmNsdWRlIDxnc3QvZ3N0Lmg+CisjaW5jbHVkZSA8Z3N0L3ZpZGVvL3ZpZGVv
Lmg+CisjaW5jbHVkZSA8d3RmL2dvYmplY3QvR093blB0ci5oPgorCisjaWZkZWYgR1NUX0FQSV9W
RVJTSU9OXzEKKyNpbmNsdWRlIDxnc3QvdmlkZW8vZ3N0dmlkZW9tZXRhLmg+CisjZW5kaWYKKwor
Cit1c2luZyBuYW1lc3BhY2Ugc3RkOwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK0ltYWdl
R1N0cmVhbWVyOjpJbWFnZUdTdHJlYW1lcihHc3RCdWZmZXIqIGJ1ZmZlciwgR3N0Q2FwcyogY2Fw
cykKK3sKKyAgICBHc3RWaWRlb0Zvcm1hdCBmb3JtYXQ7CisgICAgSW50U2l6ZSBzaXplOworICAg
IGludCBwaXhlbEFzcGVjdFJhdGlvTnVtZXJhdG9yLCBwaXhlbEFzcGVjdFJhdGlvRGVub21pbmF0
b3IsIHN0cmlkZTsKKyAgICBnZXRWaWRlb1NpemVBbmRGb3JtYXRGcm9tQ2FwcyhjYXBzLCBzaXpl
LCBmb3JtYXQsIHBpeGVsQXNwZWN0UmF0aW9OdW1lcmF0b3IsIHBpeGVsQXNwZWN0UmF0aW9EZW5v
bWluYXRvciwgc3RyaWRlKTsKKworI2lmZGVmIEdTVF9BUElfVkVSU0lPTl8xCisgICAgR3N0TWFw
SW5mbyBtYXBJbmZvOworICAgIGdzdF9idWZmZXJfbWFwKGJ1ZmZlciwgJm1hcEluZm8sIEdTVF9N
QVBfUkVBRCk7CisgICAgdW5zaWduZWQgY2hhciogYnVmZmVyRGF0YSA9IHJlaW50ZXJwcmV0X2Nh
c3Q8dW5zaWduZWQgY2hhcio+KG1hcEluZm8uZGF0YSk7CisjZWxzZQorICAgIHVuc2lnbmVkIGNo
YXIqIGJ1ZmZlckRhdGEgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPihHU1RfQlVG
RkVSX0RBVEEoYnVmZmVyKSk7CisjZW5kaWYKKworICAgIHBzX2NvbG9yX2Zvcm1hdCBGb3JtYXQ7
CisjaWYgR19CWVRFX09SREVSID09IEdfTElUVExFX0VORElBTgorICAgIEZvcm1hdCA9IChmb3Jt
YXQgPT0gR1NUX1ZJREVPX0ZPUk1BVF9CR1JBKSA/IENPTE9SX0ZPUk1BVF9CR1JBIDogQ09MT1Jf
Rk9STUFUX0JHUjsKKyNlbHNlCisgICAgRm9ybWF0ID0gKGZvcm1hdCA9PSBHU1RfVklERU9fRk9S
TUFUX0FSR0IpID8gQ09MT1JfRk9STUFUX0FSR0IgOiBDT0xPUl9GT1JNQVRfUkdCOworI2VuZGlm
CisKKyAgICBwc19pbWFnZSogaW1hZ2UgPSBwc19pbWFnZV9jcmVhdGVfZnJvbV9kYXRhKGJ1ZmZl
ckRhdGEsIEZvcm1hdCwgc2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpLCBzdHJpZGUpOworICAg
IG1faW1hZ2UgPSBCaXRtYXBJbWFnZTo6Y3JlYXRlKGltYWdlLCBmYWxzZSk7CisKKyNpZmRlZiBH
U1RfQVBJX1ZFUlNJT05fMQorICAgIGlmIChHc3RWaWRlb0Nyb3BNZXRhKiBjcm9wTWV0YSA9IGdz
dF9idWZmZXJfZ2V0X3ZpZGVvX2Nyb3BfbWV0YShidWZmZXIpKQorICAgICAgICBzZXRDcm9wUmVj
dChGbG9hdFJlY3QoY3JvcE1ldGEtPngsIGNyb3BNZXRhLT55LCBjcm9wTWV0YS0+d2lkdGgsIGNy
b3BNZXRhLT5oZWlnaHQpKTsKKworICAgIGdzdF9idWZmZXJfdW5tYXAoYnVmZmVyLCAmbWFwSW5m
byk7CisjZW5kaWYKK30KKworSW1hZ2VHU3RyZWFtZXI6On5JbWFnZUdTdHJlYW1lcigpCit7Cisg
ICAgaWYgKG1faW1hZ2UpCisgICAgICAgIG1faW1hZ2UuY2xlYXIoKTsKKworICAgIG1faW1hZ2Ug
PSAwOworfQorI2VuZGlmIC8vIFVTRShHU1RSRUFNRVIpCmRpZmYgLXVyTiBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9JbWFnZUJ1ZmZlckRhdGEuaCBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9JbWFnZUJ1ZmZlckRhdGEuaAotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvSW1hZ2VCdWZmZXJEYXRhLmgJMjAxMS0wOS0yNiAwNzo1MjoxOS4wMDAwMDAw
MDAgKzA4MDAKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ltYWdlQnVmZmVy
RGF0YS5oCTIwMTItMTEtMTIgMjA6MTY6NDkuMDAwMDAwMDAwICswODAwCkBAIC0xLDUgKzEsNiBA
QAogLyoKICAqIENvcHlyaWdodCAoQykgMjAxMSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgWmhhbmcgSmkgUGVuZyA8b25lY29vbHhAZ21haWwu
Y29tPgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0yNyw2ICsyOCw4IEBACiAj
aW5jbHVkZSAiSW1hZ2VCdWZmZXJEYXRhQ0cuaCIKICNlbGlmIFVTRShDQUlSTykKICNpbmNsdWRl
ICJJbWFnZUJ1ZmZlckRhdGFDYWlyby5oIgorI2VsaWYgVVNFKFBJQ0FTU08pCisjaW5jbHVkZSAi
SW1hZ2VCdWZmZXJEYXRhUFMuaCIKICNlbGlmIFBMQVRGT1JNKFFUKQogI2luY2x1ZGUgIkltYWdl
QnVmZmVyRGF0YVF0LmgiCiAjZWxpZiBVU0UoU0tJQSkKZGlmZiAtdXJOIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL0ltYWdlU291cmNlLmggU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvSW1hZ2VTb3VyY2UuaAotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvSW1hZ2VTb3VyY2UuaAkyMDEyLTEwLTIwIDA5OjU2OjIwLjAwMDAwMDAwMCArMDgwMAorKysg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvSW1hZ2VTb3VyY2UuaAkyMDEyLTExLTEy
IDIwOjE2OjQ5LjAwMDAwMDAwMCArMDgwMApAQCAtMSw2ICsxLDcgQEAKIC8qCiAgKiBDb3B5cmln
aHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUb3JjaCBNb2JpbGUsIEluYy4K
KyAqIENvcHlyaWdodCAoYykgMjAxMiBaaGFuZyBKaSBQZW5nIDxvbmVjb29seEBnbWFpbC5jb20+
CiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTE2Nyw2ICsxNjgsMTAgQEAKIAog
ICAgIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2UoTWVtb3J5T2JqZWN0SW5mbyopIGNvbnN0OwogCisj
aWYgVVNFKFBJQ0FTU08pCisgICAgSW1hZ2VEZWNvZGVyKiBkZWNvZGVyKCkgY29uc3QgeyByZXR1
cm4gbV9kZWNvZGVyOyB9CisjZW5kaWYKKwogcHJpdmF0ZToKICAgICBOYXRpdmVJbWFnZURlY29k
ZXJQdHIgbV9kZWNvZGVyOwogCmRpZmYgLXVyTiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9JbnRSZWN0LmggU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvSW50UmVjdC5o
Ci0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9JbnRSZWN0LmgJMjAxMi0xMS0w
OCAxMjoyNjoyNS4wMDAwMDAwMDAgKzA4MDAKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL0ludFJlY3QuaAkyMDEyLTExLTEyIDIwOjE2OjQ5LjAwMDAwMDAwMCArMDgwMApAQCAt
MSw1ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDYsIDIwMDkgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDEyIFpoYW5nIEpp
IFBlbmcgPG9uZWNvb2x4QGdtYWlsLmNvbT4KICAqCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cwpAQCAtNjUsNiArNjYsMTAgQEAKIHR5cGVkZWYgc3RydWN0IF9jYWlyb19yZWN0YW5nbGVfaW50
IGNhaXJvX3JlY3RhbmdsZV9pbnRfdDsKICNlbmRpZgogCisjaWYgVVNFKFBJQ0FTU08pCit0eXBl
ZGVmIHN0cnVjdCBfcHNfcmVjdCBwc19yZWN0OworI2VuZGlmCisKICNpZiBQTEFURk9STShXWCkK
IGNsYXNzIHd4UmVjdDsKICNlbmRpZgpAQCAtMjIwLDYgKzIyNSwxMSBAQAogICAgIG9wZXJhdG9y
IGNhaXJvX3JlY3RhbmdsZV9pbnRfdCgpIGNvbnN0OwogI2VuZGlmCiAKKyNpZiBVU0UoUElDQVNT
TykKKyAgICBJbnRSZWN0KGNvbnN0IHBzX3JlY3QmKTsKKyAgICBvcGVyYXRvciBwc19yZWN0KCkg
Y29uc3Q7CisjZW5kaWYKKwogI2lmIFVTRShDRykgfHwgVVNFKFNLSUFfT05fTUFDX0NIUk9NSVVN
KQogICAgIG9wZXJhdG9yIENHUmVjdCgpIGNvbnN0OwogI2VuZGlmCmRpZmYgLXVyTiBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9OYXRpdmVJbWFnZVB0ci5oIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL05hdGl2ZUltYWdlUHRyLmgKLS0tIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL05hdGl2ZUltYWdlUHRyLmgJMjAxMi0xMC0wOSAwNjoxMDo0NC4wMDAw
MDAwMDAgKzA4MDAKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL05hdGl2ZUlt
YWdlUHRyLmgJMjAxMi0xMS0xMiAyMDoxNjo0OS4wMDAwMDAwMDAgKzA4MDAKQEAgLTIsNiArMiw3
IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIElu
Yy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUb3Jj
aCBNb2JpbGUsIEluYy4KICAqIENvcHlyaWdodCAoQykgMjAxMiBDb21wYW55IDEwMCBJbmMuCisg
KiBDb3B5cmlnaHQgKGMpIDIwMTIgWmhhbmcgSmkgUGVuZyA8b25lY29vbHhAZ21haWwuY29tPgog
ICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC00MCw2ICs0MSw4IEBACiBRVF9FTkRf
TkFNRVNQQUNFCiAjZWxpZiBVU0UoQ0FJUk8pCiAjaW5jbHVkZSAiTmF0aXZlSW1hZ2VDYWlyby5o
IgorI2VsaWYgVVNFKFBJQ0FTU08pCisjaW5jbHVkZSAiTmF0aXZlSW1hZ2VQUy5oIgogI2VsaWYg
VVNFKFNLSUEpCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiBjbGFzcyBOYXRpdmVJbWFnZVNraWE7CkBA
IC02OSw2ICs3Miw4IEBACiAjZW5kaWYKICNlbGlmIFVTRShDQUlSTykKIHR5cGVkZWYgV2ViQ29y
ZTo6TmF0aXZlSW1hZ2VDYWlybyogTmF0aXZlSW1hZ2VQdHI7CisjZWxpZiBVU0UoUElDQVNTTykK
K3R5cGVkZWYgV2ViQ29yZTo6TmF0aXZlSW1hZ2VQUyogTmF0aXZlSW1hZ2VQdHI7CiAjZWxpZiBV
U0UoU0tJQSkKIHR5cGVkZWYgV2ViQ29yZTo6TmF0aXZlSW1hZ2VTa2lhKiBOYXRpdmVJbWFnZVB0
cjsKIHZvaWQgcmVwb3J0TWVtb3J5VXNhZ2UoY29uc3QgTmF0aXZlSW1hZ2VTa2lhKiBjb25zdCYs
IFdURjo6TWVtb3J5T2JqZWN0SW5mbyopOwpkaWZmIC11ck4gU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvUGF0aC5oIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1BhdGgu
aAotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvUGF0aC5oCTIwMTItMDgtMDIg
MDg6NDY6MTUuMDAwMDAwMDAwICswODAwCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9QYXRoLmgJMjAxMi0xMS0xMiAyMDoxNjo0OS4wMDAwMDAwMDAgKzA4MDAKQEAgLTIsNiAr
Miw3IEBACiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDYsIDIwMDkgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgogICogICAgICAgICAgICAgICAyMDA2IFJvYiBCdWlzIDxidWlzQGtk
ZS5vcmc+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUb3JjaCBNb2JpbGUsIEluYy4KKyAq
IENvcHlyaWdodCAoYykgMjAxMiBaaGFuZyBKaSBQZW5nIDxvbmVjb29seEBnbWFpbC5jb20+CiAg
KgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTUxLDYgKzUyLDExIEBACiBjbGFzcyBD
YWlyb1BhdGg7CiB9CiB0eXBlZGVmIFdlYkNvcmU6OkNhaXJvUGF0aCBQbGF0Zm9ybVBhdGg7Cisj
ZWxpZiBVU0UoUElDQVNTTykKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIFBpY2Fzc29QYXRo
OworfQordHlwZWRlZiBXZWJDb3JlOjpQaWNhc3NvUGF0aCBQbGF0Zm9ybVBhdGg7CiAjZWxpZiBV
U0UoU0tJQSkKIGNsYXNzIFNrUGF0aDsKIHR5cGVkZWYgU2tQYXRoIFBsYXRmb3JtUGF0aDsKZGlm
ZiAtdXJOIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1BhdHRlcm4uaCBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9QYXR0ZXJuLmgKLS0tIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL1BhdHRlcm4uaAkyMDEyLTA2LTI5IDExOjE2OjM0LjAwMDAwMDAwMCAr
MDgwMAorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvUGF0dGVybi5oCTIwMTIt
MTEtMTIgMjA6MTY6NDkuMDAwMDAwMDAwICswODAwCkBAIC00MSw2ICs0MSw5IEBACiAjZWxpZiBV
U0UoQ0FJUk8pCiAjaW5jbHVkZSA8Y2Fpcm8uaD4KIHR5cGVkZWYgY2Fpcm9fcGF0dGVybl90KiBQ
bGF0Zm9ybVBhdHRlcm5QdHI7CisjZWxpZiBVU0UoUElDQVNTTykKKyNpbmNsdWRlIDxwaWNhc3Nv
Lmg+Cit0eXBlZGVmIHBzX3BhdHRlcm4qIFBsYXRmb3JtUGF0dGVyblB0cjsKICNlbGlmIFVTRShT
S0lBKQogY2xhc3MgU2tTaGFkZXI7CiB0eXBlZGVmIFNrU2hhZGVyKiBQbGF0Zm9ybVBhdHRlcm5Q
dHI7CmRpZmYgLXVyTiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL0Jp
dG1hcEltYWdlUFMuY3BwIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28v
Qml0bWFwSW1hZ2VQUy5jcHAKLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3Bp
Y2Fzc28vQml0bWFwSW1hZ2VQUy5jcHAJMTk3MC0wMS0wMSAwODowMDowMC4wMDAwMDAwMDAgKzA4
MDAKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vQml0bWFwSW1h
Z2VQUy5jcHAJMjAxMi0xMS0xMiAyMDoxNjo0OS4wMDAwMDAwMDAgKzA4MDAKQEAgLTAsMCArMSwx
MzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgWmhhbmcgSmkgUGVuZyA8b25lY29vbHhA
Z21haWwuY29tPgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJCaXRtYXBJ
bWFnZS5oIgorCisjaW5jbHVkZSAiSW1hZ2VPYnNlcnZlci5oIgorI2luY2x1ZGUgIk5hdGl2ZUlt
YWdlUFMuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUNvbnRleHRQUy5oIgorI2luY2x1ZGUgPHBpY2Fz
c28uaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitQYXNzUmVmUHRyPEJpdG1hcEltYWdlPiBC
aXRtYXBJbWFnZTo6Y3JlYXRlKHBzX2ltYWdlKiBpbWFnZSwgYm9vbCBoYXNBbHBoYSkKK3sKKyAg
ICByZXR1cm4gQml0bWFwSW1hZ2U6OmNyZWF0ZShuZXcgTmF0aXZlSW1hZ2VQUyhpbWFnZSwgaGFz
QWxwaGEpKTsKK30KKworQml0bWFwSW1hZ2U6OkJpdG1hcEltYWdlKE5hdGl2ZUltYWdlUFMqIG5h
dGl2ZUltYWdlLCBJbWFnZU9ic2VydmVyKiBvYnNlcnZlcikKKyAgICA6IEltYWdlKG9ic2VydmVy
KQorICAgICwgbV9jdXJyZW50RnJhbWUoMCkKKyAgICAsIG1fZnJhbWVzKDApCisgICAgLCBtX2Zy
YW1lVGltZXIoMCkKKyAgICAsIG1fcmVwZXRpdGlvbkNvdW50KGNBbmltYXRpb25Ob25lKQorICAg
ICwgbV9yZXBldGl0aW9uQ291bnRTdGF0dXMoVW5rbm93bikKKyAgICAsIG1fcmVwZXRpdGlvbnND
b21wbGV0ZSgwKQorICAgICwgbV9kZWNvZGVkU2l6ZSgwKQorICAgICwgbV9mcmFtZUNvdW50KDEp
CisgICAgLCBtX2lzU29saWRDb2xvcihmYWxzZSkKKyAgICAsIG1fY2hlY2tlZEZvclNvbGlkQ29s
b3IoZmFsc2UpCisgICAgLCBtX2FuaW1hdGlvbkZpbmlzaGVkKHRydWUpCisgICAgLCBtX2FsbERh
dGFSZWNlaXZlZCh0cnVlKQorICAgICwgbV9oYXZlU2l6ZSh0cnVlKQorICAgICwgbV9zaXplQXZh
aWxhYmxlKHRydWUpCisgICAgLCBtX2hhdmVGcmFtZUNvdW50KHRydWUpCit7CisgICAgcHNfaW1h
Z2UqIGltYWdlID0gbmF0aXZlSW1hZ2UtPmltYWdlKCk7CisgICAgcHNfc2l6ZSBzaXplID0gcHNf
aW1hZ2VfZ2V0X3NpemUoaW1hZ2UpOworICAgIGludCB3aWR0aCA9IChpbnQpc2l6ZS53OworICAg
IGludCBoZWlnaHQgPSAoaW50KXNpemUuaDsKKyAgICBtX2RlY29kZWRTaXplID0gd2lkdGggKiBo
ZWlnaHQgKiA0OworICAgIG1fc2l6ZSA9IEludFNpemUod2lkdGgsIGhlaWdodCk7CisKKyAgICBt
X2ZyYW1lcy5ncm93KDEpOworICAgIG1fZnJhbWVzWzBdLm1fZnJhbWUgPSBuYXRpdmVJbWFnZTsK
KyAgICBtX2ZyYW1lc1swXS5tX2hhc0FscGhhID0gbmF0aXZlSW1hZ2UtPmhhc0FscGhhKCk7Cisg
ICAgbV9mcmFtZXNbMF0ubV9oYXZlTWV0YWRhdGEgPSB0cnVlOworICAgIGNoZWNrRm9yU29saWRD
b2xvcigpOworfQorCit2b2lkIEJpdG1hcEltYWdlOjpkcmF3KEdyYXBoaWNzQ29udGV4dCogY29u
dGV4dCwgY29uc3QgRmxvYXRSZWN0JiBkc3QsIGNvbnN0IEZsb2F0UmVjdCYgc3JjLCBDb2xvclNw
YWNlIHN0eWxlQ29sb3JTcGFjZSwgQ29tcG9zaXRlT3BlcmF0b3Igb3ApCit7CisgICAgaWYgKCFk
c3Qud2lkdGgoKSB8fCAhZHN0LmhlaWdodCgpIHx8ICFzcmMud2lkdGgoKSB8fCAhc3JjLmhlaWdo
dCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBzdGFydEFuaW1hdGlvbigpOworCisgICAgTmF0
aXZlSW1hZ2VQUyogbmF0aXZlSW1hZ2UgPSBmcmFtZUF0SW5kZXgobV9jdXJyZW50RnJhbWUpOwor
ICAgIGlmICghbmF0aXZlSW1hZ2UpIC8vIElmIGl0J3MgdG9vIGVhcmx5IHdlIHdvbid0IGhhdmUg
YW4gaW1hZ2UgeWV0LgorICAgICAgICByZXR1cm47CisKKyAgICBpZiAobWF5RmlsbFdpdGhTb2xp
ZENvbG9yKCkpIHsKKyAgICAgICAgZmlsbFdpdGhTb2xpZENvbG9yKGNvbnRleHQsIGRzdCwgc29s
aWRDb2xvcigpLCBzdHlsZUNvbG9yU3BhY2UsIG9wKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KworICAgIGNvbnRleHQtPnNhdmUoKTsKKworICAgIC8vIFNldCB0aGUgY29tcG9zaXRpbmcgb3Bl
cmF0aW9uLgorICAgIGlmIChvcCA9PSBDb21wb3NpdGVTb3VyY2VPdmVyICYmICFmcmFtZUhhc0Fs
cGhhQXRJbmRleChtX2N1cnJlbnRGcmFtZSkpCisgICAgICAgIGNvbnRleHQtPnNldENvbXBvc2l0
ZU9wZXJhdGlvbihDb21wb3NpdGVDb3B5KTsKKyAgICBlbHNlCisgICAgICAgIGNvbnRleHQtPnNl
dENvbXBvc2l0ZU9wZXJhdGlvbihvcCk7CisKKyNpZiBFTkFCTEUoSU1BR0VfREVDT0RFUl9ET1dO
X1NBTVBMSU5HKQorICAgIHBzX2ltYWdlKiBpbWFnZSA9IG5hdGl2ZUltYWdlLT5pbWFnZSgpOwor
ICAgIHBzX3NpemUgc2l6ZSA9IHBzX2ltYWdlX2dldF9zaXplKGltYWdlKTsKKyAgICBJbnRTaXpl
IHNjYWxlZFNpemUoKGludClzaXplLncsIChpbnQpc2l6ZS5oKTsKKyAgICBGbG9hdFJlY3QgYWRq
dXN0ZWRTcmNSZWN0ID0gYWRqdXN0U291cmNlUmVjdEZvckRvd25TYW1wbGluZyhzcmMsIHNjYWxl
ZFNpemUpOworI2Vsc2UKKyAgICBGbG9hdFJlY3QgYWRqdXN0ZWRTcmNSZWN0KHNyYyk7CisjZW5k
aWYKKworICAgIGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5kcmF3SW1hZ2VUb0NvbnRleHQo
bmF0aXZlSW1hZ2UtPmltYWdlKCksIGRzdCwgYWRqdXN0ZWRTcmNSZWN0LCBjb250ZXh0KTsKKwor
ICAgIGNvbnRleHQtPnJlc3RvcmUoKTsKKworICAgIGlmIChpbWFnZU9ic2VydmVyKCkpCisgICAg
ICAgIGltYWdlT2JzZXJ2ZXIoKS0+ZGlkRHJhdyh0aGlzKTsKK30KKwordm9pZCBCaXRtYXBJbWFn
ZTo6Y2hlY2tGb3JTb2xpZENvbG9yKCkKK3sKKyAgICBtX2lzU29saWRDb2xvciA9IGZhbHNlOwor
ICAgIG1fY2hlY2tlZEZvclNvbGlkQ29sb3IgPSB0cnVlOworfQorCitib29sIEZyYW1lRGF0YTo6
Y2xlYXIoYm9vbCBjbGVhck1ldGFkYXRhKQoreworICAgIGlmIChjbGVhck1ldGFkYXRhKQorICAg
ICAgICBtX2hhdmVNZXRhZGF0YSA9IGZhbHNlOworCisgICAgaWYgKG1fZnJhbWUpIHsKKyAgICAg
ICAgZGVsZXRlIG1fZnJhbWU7CisgICAgICAgIG1fZnJhbWUgPSAwOworICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCisKZGlmZiAtdXJOIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28v
RHJhd2luZ0J1ZmZlclBTLmNwcCBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNh
c3NvL0RyYXdpbmdCdWZmZXJQUy5jcHAKLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3BpY2Fzc28vRHJhd2luZ0J1ZmZlclBTLmNwcAkxOTcwLTAxLTAxIDA4OjAwOjAwLjAwMDAw
MDAwMCArMDgwMAorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9E
cmF3aW5nQnVmZmVyUFMuY3BwCTIwMTItMTEtMTIgMjA6MTY6NDkuMDAwMDAwMDAwICswODAwCkBA
IC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIFpoYW5nIEppIFBlbmcg
PG9uZWNvb2x4QGdtYWlsLmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpZiBFTkFCTEUoQUND
RUxFUkFURURfMkRfQ0FOVkFTKSB8fCBVU0UoM0RfR1JBUEhJQ1MpCisKKyNpbmNsdWRlICJEcmF3
aW5nQnVmZmVyLmgiCisKKyNpbmNsdWRlICJFeHRlbnNpb25zM0QuaCIKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitEcmF3aW5nQnVmZmVyOjpEcmF3aW5nQnVmZmVyKEdyYXBoaWNzQ29udGV4dDNE
KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnRTaXplJiBz
aXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG11bHRpc2FtcGxlRXh0ZW5z
aW9uU3VwcG9ydGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBhY2tlZERl
cHRoU3RlbmNpbEV4dGVuc2lvblN1cHBvcnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgUHJlc2VydmVEcmF3aW5nQnVmZmVyIHByZXNlcnZlRHJhd2luZ0J1ZmZlciwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgQWxwaGFSZXF1aXJlbWVudCBhbHBoYSkKKyAgICA6IG1fcHJl
c2VydmVEcmF3aW5nQnVmZmVyKHByZXNlcnZlRHJhd2luZ0J1ZmZlcikKKyAgICAsIG1fYWxwaGEo
YWxwaGEpCisgICAgLCBtX3NjaXNzb3JFbmFibGVkKGZhbHNlKQorICAgICwgbV90ZXh0dXJlMkRC
aW5kaW5nKDApCisgICAgLCBtX2ZyYW1lYnVmZmVyQmluZGluZygwKQorICAgICwgbV9hY3RpdmVU
ZXh0dXJlVW5pdChHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRTApCisgICAgLCBtX2NvbnRleHQo
Y29udGV4dCkKKyAgICAsIG1fc2l6ZSgtMSwgLTEpCisgICAgLCBtX211bHRpc2FtcGxlRXh0ZW5z
aW9uU3VwcG9ydGVkKG11bHRpc2FtcGxlRXh0ZW5zaW9uU3VwcG9ydGVkKQorICAgICwgbV9wYWNr
ZWREZXB0aFN0ZW5jaWxFeHRlbnNpb25TdXBwb3J0ZWQocGFja2VkRGVwdGhTdGVuY2lsRXh0ZW5z
aW9uU3VwcG9ydGVkKQorICAgICwgbV9mYm8oY29udGV4dC0+Y3JlYXRlRnJhbWVidWZmZXIoKSkK
KyAgICAsIG1fY29sb3JCdWZmZXIoMCkKKyAgICAsIG1fZnJvbnRDb2xvckJ1ZmZlcigwKQorICAg
ICwgbV9zZXBhcmF0ZUZyb250VGV4dHVyZShmYWxzZSkKKyAgICAsIG1fZGVwdGhTdGVuY2lsQnVm
ZmVyKDApCisgICAgLCBtX2RlcHRoQnVmZmVyKDApCisgICAgLCBtX3N0ZW5jaWxCdWZmZXIoMCkK
KyAgICAsIG1fbXVsdGlzYW1wbGVGQk8oMCkKKyAgICAsIG1fbXVsdGlzYW1wbGVDb2xvckJ1ZmZl
cigwKQoreworICAgIEFTU0VSVChtX2Zibyk7CisgICAgaWYgKCFtX2ZibykgeworICAgICAgICBj
bGVhcigpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgICAgICAKKyAgICAvLyBjcmVhdGUg
YSB0ZXh0dXJlIHRvIHJlbmRlciBpbnRvCisgICAgbV9jb2xvckJ1ZmZlciA9IGNvbnRleHQtPmNy
ZWF0ZVRleHR1cmUoKTsKKyAgICBjb250ZXh0LT5iaW5kVGV4dHVyZShHcmFwaGljc0NvbnRleHQz
RDo6VEVYVFVSRV8yRCwgbV9jb2xvckJ1ZmZlcik7CisgICAgY29udGV4dC0+dGV4UGFyYW1ldGVy
ZihHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV8yRCwgR3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRV
UkVfTUFHX0ZJTFRFUiwgR3JhcGhpY3NDb250ZXh0M0Q6OkxJTkVBUik7CisgICAgY29udGV4dC0+
dGV4UGFyYW1ldGVyZihHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV8yRCwgR3JhcGhpY3NDb250
ZXh0M0Q6OlRFWFRVUkVfTUlOX0ZJTFRFUiwgR3JhcGhpY3NDb250ZXh0M0Q6OkxJTkVBUik7Cisg
ICAgY29udGV4dC0+dGV4UGFyYW1ldGVyaShHcmFwaGljc0NvbnRleHQzRDo6VEVYVFVSRV8yRCwg
R3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfV1JBUF9TLCBHcmFwaGljc0NvbnRleHQzRDo6Q0xB
TVBfVE9fRURHRSk7CisgICAgY29udGV4dC0+dGV4UGFyYW1ldGVyaShHcmFwaGljc0NvbnRleHQz
RDo6VEVYVFVSRV8yRCwgR3JhcGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfV1JBUF9ULCBHcmFwaGlj
c0NvbnRleHQzRDo6Q0xBTVBfVE9fRURHRSk7CisgICAgY29udGV4dC0+YmluZFRleHR1cmUoR3Jh
cGhpY3NDb250ZXh0M0Q6OlRFWFRVUkVfMkQsIDApOworICAgIAorICAgIGNyZWF0ZVNlY29uZGFy
eUJ1ZmZlcnMoKTsKKyAgICByZXNldChzaXplKTsKK30KKworRHJhd2luZ0J1ZmZlcjo6fkRyYXdp
bmdCdWZmZXIoKQoreworICAgIGNsZWFyKCk7Cit9CisKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09N
UE9TSVRJTkcpCit2b2lkIERyYXdpbmdCdWZmZXI6OnByZXBhcmVCYWNrQnVmZmVyKCkKK3sKK30K
KworYm9vbCBEcmF3aW5nQnVmZmVyOjpyZXF1aXJlc0NvcHlGcm9tQmFja1RvRnJvbnRCdWZmZXIo
KSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30KKwordW5zaWduZWQgRHJhd2luZ0J1ZmZl
cjo6ZnJvbnRDb2xvckJ1ZmZlcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNvbG9yQnVmZmVyKCk7
Cit9CisKK3ZvaWQgRHJhd2luZ0J1ZmZlcjo6cGFpbnRDb21wb3NpdGVkUmVzdWx0c1RvQ2FudmFz
KEltYWdlQnVmZmVyKikKK3sKK30KKyNlbmRpZgorCit9CisKKyNlbmRpZgpkaWZmIC11ck4gU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9GbG9hdFJlY3RQUy5jcHAgU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9GbG9hdFJlY3RQUy5jcHAKLS0t
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vRmxvYXRSZWN0UFMuY3Bw
CTE5NzAtMDEtMDEgMDg6MDA6MDAuMDAwMDAwMDAwICswODAwCisrKyBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL0Zsb2F0UmVjdFBTLmNwcAkyMDEyLTExLTEyIDIwOjE2
OjQ5LjAwMDAwMDAwMCArMDgwMApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChj
KSAyMDEyIFpoYW5nIEppIFBlbmcgPG9uZWNvb2x4QGdtYWlsLmNvbT4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisKKyNpbmNsdWRlIDxwaWNhc3Nv
Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworRmxvYXRSZWN0OjpGbG9hdFJlY3QoY29uc3Qg
cHNfcmVjdCYgcikKKyAgICA6IG1fbG9jYXRpb24oci54LCByLnkpCisgICAgLCBtX3NpemUoci53
LCByLmgpCit7Cit9CisKK0Zsb2F0UmVjdDo6b3BlcmF0b3IgcHNfcmVjdCgpIGNvbnN0Cit7Cisg
ICAgcHNfcmVjdCByID0geyB4KCksIHkoKSwgd2lkdGgoKSwgaGVpZ2h0KCkgfTsKKyAgICByZXR1
cm4gcjsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC11ck4gU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9Gb250Q2FjaGVQUy5jcHAgU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9Gb250Q2FjaGVQUy5jcHAKLS0tIFNvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vRm9udENhY2hlUFMuY3BwCTE5NzAtMDEt
MDEgMDg6MDA6MDAuMDAwMDAwMDAwICswODAwCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9waWNhc3NvL0ZvbnRDYWNoZVBTLmNwcAkyMDEyLTExLTEyIDIwOjE2OjQ5LjAwMDAw
MDAwMCArMDgwMApAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIFpo
YW5nIEppIFBlbmcgPG9uZWNvb2x4QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICog
TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0
aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRo
ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFO
VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklM
SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAq
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq
IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZp
bGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9z
dG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJGb250Q2FjaGUuaCIKKworI2luY2x1ZGUgIkZvbnQuaCIKKyNpbmNsdWRlICJP
d25QdHJQUy5oIgorI2luY2x1ZGUgIlJlZlB0clBTLmgiCisjaW5jbHVkZSA8cGljYXNzby5oPgor
I2luY2x1ZGUgIlNpbXBsZUZvbnREYXRhLmgiCisjaW5jbHVkZSA8d3RmL0Fzc2VydGlvbnMuaD4K
KyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
dm9pZCBGb250Q2FjaGU6OnBsYXRmb3JtSW5pdCgpCit7Cit9CisKK1Bhc3NSZWZQdHI8U2ltcGxl
Rm9udERhdGE+IEZvbnRDYWNoZTo6Z2V0Rm9udERhdGFGb3JDaGFyYWN0ZXJzKGNvbnN0IEZvbnQm
IGZvbnQsIGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoKQoreworICAgIHJldHVy
biAwOworfQorCitQYXNzUmVmUHRyPFNpbXBsZUZvbnREYXRhPiBGb250Q2FjaGU6OmdldFNpbWls
YXJGb250UGxhdGZvcm1EYXRhKGNvbnN0IEZvbnQmKQoreworICAgIHJldHVybiAwOworfQorCitQ
YXNzUmVmUHRyPFNpbXBsZUZvbnREYXRhPiBGb250Q2FjaGU6OmdldExhc3RSZXNvcnRGYWxsYmFj
a0ZvbnQoY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24sIFNob3VsZFJldGFp
biBzaG91bGRSZXRhaW4pCit7CisgICAgLy8gV2Ugd2FudCB0byByZXR1cm4gYSBmYWxsYmFjayBm
b250IGhlcmUsIG90aGVyd2lzZSB0aGUgbG9naWMgcHJldmVudGluZyBGb250Q29uZmlnCisgICAg
Ly8gbWF0Y2hlcyBmb3Igbm9uLWZhbGxiYWNrIGZvbnRzIG1pZ2h0IHJldHVybiAwLiBTZWUgaXNG
YWxsYmFja0ZvbnRBbGxvd2VkLgorICAgIHN0YXRpYyBBdG9taWNTdHJpbmcgdGltZXNTdHIoInNl
cmlmIik7CisgICAgcmV0dXJuIGdldENhY2hlZEZvbnREYXRhKGZvbnREZXNjcmlwdGlvbiwgdGlt
ZXNTdHIsIGZhbHNlLCBzaG91bGRSZXRhaW4pOworfQorCit2b2lkIEZvbnRDYWNoZTo6Z2V0VHJh
aXRzSW5GYW1pbHkoY29uc3QgQXRvbWljU3RyaW5nJiwgVmVjdG9yPHVuc2lnbmVkPiYpCit7Cit9
CisKK0ZvbnRQbGF0Zm9ybURhdGEqIEZvbnRDYWNoZTo6Y3JlYXRlRm9udFBsYXRmb3JtRGF0YShj
b25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbiwgY29uc3QgQXRvbWljU3RyaW5n
JiBmYW1pbHkpCit7CisgICAgcHNfYm9vbCBpdGFsaWM7CisgICAgcHNfZm9udF93ZWlnaHQgYmxv
ZDsKKworICAgIGlmIChmb250RGVzY3JpcHRpb24uaXRhbGljKCkpCisgICAgICAgIGl0YWxpYyA9
IFRydWU7CisgICAgZWxzZQorICAgICAgICBpdGFsaWMgPSBGYWxzZTsKKworICAgIGlmIChmb250
RGVzY3JpcHRpb24ud2VpZ2h0KCk9PUZvbnRXZWlnaHRCb2xkKQorICAgICAgICBibG9kID0gRk9O
VF9XRUlHSFRfQk9MRDsKKyAgICBlbHNlCisgICAgICAgIGJsb2QgPSBGT05UX1dFSUdIVF9NRURJ
VU07CisKKyAgICBwc19mb250KiBmb250ID0gcHNfZm9udF9jcmVhdGUgKChjaGFyKilmYW1pbHku
c3RyaW5nKCkudXRmOCgpLmRhdGEoKSwgQ0hBUlNFVF9VTklDT0RFLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIEZPTlRfVFlQRV9TTU9PVEgsIGZvbnREZXNjcmlwdGlvbi5jb21wdXRl
ZFBpeGVsU2l6ZSgpLCBibG9kLCBpdGFsaWMpOworCisgICAgcmV0dXJuIG5ldyBGb250UGxhdGZv
cm1EYXRhKGZvbnQsIGZvbnREZXNjcmlwdGlvbi5jb21wdXRlZFBpeGVsU2l6ZSgpLCBibG9kLCBp
dGFsaWMpOworfQorCit9CmRpZmYgLXVyTiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9waWNhc3NvL0ZvbnRDdXN0b21QbGF0Zm9ybURhdGEuaCBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9waWNhc3NvL0ZvbnRDdXN0b21QbGF0Zm9ybURhdGEuaAotLS0gU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9Gb250Q3VzdG9tUGxhdGZvcm1EYXRhLmgJ
MTk3MC0wMS0wMSAwODowMDowMC4wMDAwMDAwMDAgKzA4MDAKKysrIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vRm9udEN1c3RvbVBsYXRmb3JtRGF0YS5oCTIwMTItMTEt
MTIgMjA6MTY6NDkuMDAwMDAwMDAwICswODAwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKGMpIDIwMTIgWmhhbmcgSmkgUGVuZyA8b25lY29vbHhAZ21haWwuY29tPgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMg
ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBX
SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m
CisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl
IGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxp
YnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlm
dGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lm
bmRlZiBGb250Q3VzdG9tUGxhdGZvcm1EYXRhX2gKKyNkZWZpbmUgRm9udEN1c3RvbVBsYXRmb3Jt
RGF0YV9oCisKKyNpbmNsdWRlICJGb250T3JpZW50YXRpb24uaCIKKyNpbmNsdWRlICJGb250UmVu
ZGVyaW5nTW9kZS5oIgorI2luY2x1ZGUgIkZvbnRXaWR0aFZhcmlhbnQuaCIKKyNpbmNsdWRlICJU
ZXh0T3JpZW50YXRpb24uaCIKKyNpbmNsdWRlICJSZWZQdHJQUy5oIgorI2luY2x1ZGUgPHd0Zi9G
b3J3YXJkLmg+CisjaW5jbHVkZSA8d3RmL05vbmNvcHlhYmxlLmg+CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworY2xhc3MgRm9udFBsYXRmb3JtRGF0YTsKK2NsYXNzIFNoYXJlZEJ1ZmZlcjsKKwor
c3RydWN0IEZvbnRDdXN0b21QbGF0Zm9ybURhdGEgeworICAgIFdURl9NQUtFX05PTkNPUFlBQkxF
KEZvbnRDdXN0b21QbGF0Zm9ybURhdGEpOworcHVibGljOgorICAgIEZvbnRDdXN0b21QbGF0Zm9y
bURhdGEocHNfZm9udCosIFNoYXJlZEJ1ZmZlciopOworICAgIH5Gb250Q3VzdG9tUGxhdGZvcm1E
YXRhKCk7CisgICAgRm9udFBsYXRmb3JtRGF0YSBmb250UGxhdGZvcm1EYXRhKGludCBzaXplLCBi
b29sIGJvbGQsIGJvb2wgaXRhbGljLCBGb250T3JpZW50YXRpb24gPSBIb3Jpem9udGFsLCBUZXh0
T3JpZW50YXRpb24gPSBUZXh0T3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0LCBGb250V2lkdGhWYXJp
YW50ID0gUmVndWxhcldpZHRoLCBGb250UmVuZGVyaW5nTW9kZSA9IE5vcm1hbFJlbmRlcmluZ01v
ZGUpOworICAgIHN0YXRpYyBib29sIHN1cHBvcnRzRm9ybWF0KGNvbnN0IFN0cmluZyYpOworCitw
cml2YXRlOgorICAgIHBzX2ZvbnQqIG1fZm9udDsKKyAgICBTaGFyZWRCdWZmZXIqIG1fYnVmZmVy
OworfTsKKworRm9udEN1c3RvbVBsYXRmb3JtRGF0YSogY3JlYXRlRm9udEN1c3RvbVBsYXRmb3Jt
RGF0YShTaGFyZWRCdWZmZXIqIGJ1ZmZlcik7CisKK30KKworI2VuZGlmCmRpZmYgLXVyTiBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL0ZvbnRDdXN0b21QbGF0Zm9ybURh
dGFQUy5jcHAgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9Gb250Q3Vz
dG9tUGxhdGZvcm1EYXRhUFMuY3BwCi0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9waWNhc3NvL0ZvbnRDdXN0b21QbGF0Zm9ybURhdGFQUy5jcHAJMTk3MC0wMS0wMSAwODowMDow
MC4wMDAwMDAwMDAgKzA4MDAKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3Bp
Y2Fzc28vRm9udEN1c3RvbVBsYXRmb3JtRGF0YVBTLmNwcAkyMDEyLTExLTEyIDIwOjE2OjQ5LjAw
MDAwMDAwMCArMDgwMApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEy
IFpoYW5nIEppIFBlbmcgPG9uZWNvb2x4QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJhcnkg
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2Rp
ZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwor
ICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg
ZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikg
YW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGlu
IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRB
QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUK
KyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoK
KyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhl
IGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICog
Qm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJGb250Q3VzdG9tUGxhdGZvcm1EYXRhLmgiCisKKyNpbmNsdWRlICJGb250
UGxhdGZvcm1EYXRhLmgiCisjaW5jbHVkZSAiU2hhcmVkQnVmZmVyLmgiCisjaW5jbHVkZSAiV09G
RkZpbGVGb3JtYXQuaCIKKyNpbmNsdWRlIDxwaWNhc3NvLmg+CisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworRm9udEN1c3RvbVBsYXRmb3JtRGF0YTo6Rm9udEN1c3RvbVBsYXRmb3JtRGF0YShwc19m
b250KiBmb250LCBTaGFyZWRCdWZmZXIqIGJ1ZmZlcikKKyAgICA6IG1fZm9udChwc19mb250X3Jl
Zihmb250KSkKKyAgICAsIG1fYnVmZmVyKGJ1ZmZlcikKK3sKKyAgICBtX2J1ZmZlci0+cmVmKCk7
Cit9CisKK0ZvbnRDdXN0b21QbGF0Zm9ybURhdGE6On5Gb250Q3VzdG9tUGxhdGZvcm1EYXRhKCkK
K3sKKyAgICBwc19mb250X3VucmVmKG1fZm9udCk7CisgICAgbV9idWZmZXItPmRlcmVmKCk7Cit9
CisKK0ZvbnRQbGF0Zm9ybURhdGEgRm9udEN1c3RvbVBsYXRmb3JtRGF0YTo6Zm9udFBsYXRmb3Jt
RGF0YShpbnQgc2l6ZSwgYm9vbCBib2xkLCBib29sIGl0YWxpYywgRm9udE9yaWVudGF0aW9uLCBU
ZXh0T3JpZW50YXRpb24sIEZvbnRXaWR0aFZhcmlhbnQsIEZvbnRSZW5kZXJpbmdNb2RlKQorewor
ICAgIHJldHVybiBGb250UGxhdGZvcm1EYXRhKG1fZm9udCwgc2l6ZSwgYm9sZCwgaXRhbGljKTsK
K30KKworRm9udEN1c3RvbVBsYXRmb3JtRGF0YSogY3JlYXRlRm9udEN1c3RvbVBsYXRmb3JtRGF0
YShTaGFyZWRCdWZmZXIqIGJ1ZmZlcikKK3sKKyAgICBBU1NFUlRfQVJHKGJ1ZmZlciwgYnVmZmVy
KTsKKworICAgIFJlZlB0cjxTaGFyZWRCdWZmZXI+IHNmbnRCdWZmZXI7CisgICAgaWYgKGlzV09G
RihidWZmZXIpKSB7CisgICAgICAgIFZlY3RvcjxjaGFyPiBzZm50OworICAgICAgICBpZiAoIWNv
bnZlcnRXT0ZGVG9TZm50KGJ1ZmZlciwgc2ZudCkpCisgICAgICAgICAgICByZXR1cm4gMDsKKwor
ICAgICAgICBzZm50QnVmZmVyID0gU2hhcmVkQnVmZmVyOjphZG9wdFZlY3RvcihzZm50KTsKKyAg
ICAgICAgYnVmZmVyID0gc2ZudEJ1ZmZlci5nZXQoKTsKKyAgICB9CisKKyAgICAvL0ZJWE1FOiBu
b3Qgc3VwcG9ydCBjdXN0b20gZm9udC4KKyAgICAvLyBuZWVkIGltcGxlbWVudCByZXR1cm4gbmV3
IEZvbnRDdXN0b21QbGF0Zm9ybURhdGEoZm9udCwgYnVmZmVyKTsKKyAgICByZXR1cm4gMDsKK30K
KworYm9vbCBGb250Q3VzdG9tUGxhdGZvcm1EYXRhOjpzdXBwb3J0c0Zvcm1hdChjb25zdCBTdHJp
bmcmIGZvcm1hdCkKK3sKKyAgICByZXR1cm4gZXF1YWxJZ25vcmluZ0Nhc2UoZm9ybWF0LCAidHJ1
ZXR5cGUiKSB8fCBlcXVhbElnbm9yaW5nQ2FzZShmb3JtYXQsICJvcGVudHlwZSIpIHx8IGVxdWFs
SWdub3JpbmdDYXNlKGZvcm1hdCwgIndvZmYiKTsKK30KKworfQpkaWZmIC11ck4gU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9Gb250UGxhdGZvcm1EYXRhLmggU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9Gb250UGxhdGZvcm1EYXRhLmgKLS0t
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vRm9udFBsYXRmb3JtRGF0
YS5oCTE5NzAtMDEtMDEgMDg6MDA6MDAuMDAwMDAwMDAwICswODAwCisrKyBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL0ZvbnRQbGF0Zm9ybURhdGEuaAkyMDEyLTExLTEy
IDIwOjE2OjQ5LjAwMDAwMDAwMCArMDgwMApAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJp
Z2h0IChjKSAyMDEyIFpoYW5nIEppIFBlbmcgPG9uZWNvb2x4QGdtYWlsLmNvbT4KKyAqCisgKiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJl
OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUg
dGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNp
b24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv
bi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp
dCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl
dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBo
YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJ
Qi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEw
LTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBGb250UGxhdGZvcm1EYXRhUFNfaAorI2Rl
ZmluZSBGb250UGxhdGZvcm1EYXRhUFNfaAorCisjaW5jbHVkZSAiRm9udERlc2NyaXB0aW9uLmgi
CisjaW5jbHVkZSAiRm9udE9yaWVudGF0aW9uLmgiCisjaW5jbHVkZSAiR2x5cGhCdWZmZXIuaCIK
KyNpbmNsdWRlICJSZWZQdHJQUy5oIgorI2luY2x1ZGUgPHd0Zi9Gb3J3YXJkLmg+CisjaW5jbHVk
ZSA8d3RmL0hhc2hGdW5jdGlvbnMuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBG
b250UGxhdGZvcm1EYXRhIHsKK3B1YmxpYzoKKyAgICBGb250UGxhdGZvcm1EYXRhKFdURjo6SGFz
aFRhYmxlRGVsZXRlZFZhbHVlVHlwZSkKKyAgICAgICAgOiBtX3NpemUoMCkKKyAgICAgICAgLCBt
X3N5bnRoZXRpY0JvbGQoZmFsc2UpCisgICAgICAgICwgbV9zeW50aGV0aWNPYmxpcXVlKGZhbHNl
KQorICAgICAgICAsIG1fZm9udChoYXNoVGFibGVEZWxldGVkRm9udFZhbHVlKCkpCisgICAgICAg
IHsgfQorCisgICAgRm9udFBsYXRmb3JtRGF0YSgpCisgICAgICAgIDogbV9zaXplKDApCisgICAg
ICAgICwgbV9zeW50aGV0aWNCb2xkKGZhbHNlKQorICAgICAgICAsIG1fc3ludGhldGljT2JsaXF1
ZShmYWxzZSkKKyAgICAgICAgLCBtX2ZvbnQoMCkKKyAgICAgICAgeyB9CisKKyAgICBGb250UGxh
dGZvcm1EYXRhKHBzX2ZvbnQqIGZvbnRGYWNlLCBmbG9hdCBzaXplLCBib29sIGJvbGQsIGJvb2wg
aXRhbGljKTsKKyAgICBGb250UGxhdGZvcm1EYXRhKGZsb2F0IHNpemUsIGJvb2wgYm9sZCwgYm9v
bCBpdGFsaWMpOworICAgIEZvbnRQbGF0Zm9ybURhdGEoY29uc3QgRm9udFBsYXRmb3JtRGF0YSYp
OworICAgIEZvbnRQbGF0Zm9ybURhdGEoY29uc3QgRm9udFBsYXRmb3JtRGF0YSYsIGZsb2F0IHNp
emUpOworCisgICAgfkZvbnRQbGF0Zm9ybURhdGEoKTsKKworICAgIGJvb2wgaXNGaXhlZFBpdGNo
KCk7CisgICAgZmxvYXQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQorICAgIHZvaWQg
c2V0U2l6ZShmbG9hdCBzaXplKSB7IG1fc2l6ZSA9IHNpemU7IH0KKyAgICBib29sIHN5bnRoZXRp
Y0JvbGQoKSBjb25zdCB7IHJldHVybiBtX3N5bnRoZXRpY0JvbGQ7IH0KKyAgICBib29sIHN5bnRo
ZXRpY09ibGlxdWUoKSBjb25zdCB7IHJldHVybiBtX3N5bnRoZXRpY09ibGlxdWU7IH0KKyAgICBi
b29sIGhhc0NvbXBhdGlibGVDaGFybWFwKCk7CisKKyAgICBGb250T3JpZW50YXRpb24gb3JpZW50
YXRpb24oKSBjb25zdCB7IHJldHVybiBIb3Jpem9udGFsOyB9IC8vIEZJWE1FOiBJbXBsZW1lbnQu
CisgICAgdm9pZCBzZXRPcmllbnRhdGlvbihGb250T3JpZW50YXRpb24pIHsgfSAvLyBGSVhNRTog
SW1wbGVtZW50LgorCisgICAgcHNfZm9udCogZm9udCgpIGNvbnN0IHsgcmV0dXJuIG1fZm9udDsg
fQorCisgICAgdW5zaWduZWQgaGFzaCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gUHRy
SGFzaDxwc19mb250Kj46Omhhc2gobV9mb250KTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9y
PT0oY29uc3QgRm9udFBsYXRmb3JtRGF0YSYpIGNvbnN0OworICAgIEZvbnRQbGF0Zm9ybURhdGEm
IG9wZXJhdG9yPShjb25zdCBGb250UGxhdGZvcm1EYXRhJik7CisgICAgYm9vbCBpc0hhc2hUYWJs
ZURlbGV0ZWRWYWx1ZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV9mb250ID09IGhh
c2hUYWJsZURlbGV0ZWRGb250VmFsdWUoKTsKKyAgICB9CisKKyNpZm5kZWYgTkRFQlVHCisgICAg
U3RyaW5nIGRlc2NyaXB0aW9uKCkgY29uc3Q7CisjZW5kaWYKKworICAgIGZsb2F0IG1fc2l6ZTsK
KyAgICBib29sIG1fc3ludGhldGljQm9sZDsKKyAgICBib29sIG1fc3ludGhldGljT2JsaXF1ZTsK
KyAgICBib29sIG1fZml4ZWRXaWR0aDsKKyAgICBwc19mb250ICogbV9mb250OworCitwcml2YXRl
OgorICAgIHZvaWQgaW5pdGlhbGl6ZVdpdGhGb250RmFjZShwc19mb250KiwgY29uc3QgRm9udERl
c2NyaXB0aW9uJiA9IEZvbnREZXNjcmlwdGlvbigpKTsKKyAgICBzdGF0aWMgcHNfZm9udCogaGFz
aFRhYmxlRGVsZXRlZEZvbnRWYWx1ZSgpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8cHNfZm9u
dCo+KC0xKTsgfQorfTsKKworfQorCisjZW5kaWYgLy8gRm9udFBsYXRmb3JtRGF0YV9oCmRpZmYg
LXVyTiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL0ZvbnRQUy5jcHAg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9Gb250UFMuY3BwCi0tLSBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL0ZvbnRQUy5jcHAJMTk3MC0w
MS0wMSAwODowMDowMC4wMDAwMDAwMDAgKzA4MDAKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3BpY2Fzc28vRm9udFBTLmNwcAkyMDEyLTExLTEyIDIwOjE2OjQ5LjAwMDAwMDAw
MCArMDgwMApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIFpoYW5n
IEppIFBlbmcgPG9uZWNvb2x4QGdtYWlsLmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiRm9udC5oIgorCisjaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCisjaW5j
bHVkZSAiUFNVdGlsaXRpZXMuaCIKKyNpbmNsdWRlICJHbHlwaEJ1ZmZlci5oIgorI2luY2x1ZGUg
IkdyYWRpZW50LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSW1h
Z2VCdWZmZXIuaCIKKyNpbmNsdWRlICJQYXR0ZXJuLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Db250
ZXh0UFMuaCIKKyNpbmNsdWRlICJTaGFkb3dCbHVyLmgiCisjaW5jbHVkZSAiU2ltcGxlRm9udERh
dGEuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lkIEZvbnQ6OmRyYXdHbHlwaHMoR3Jh
cGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBTaW1wbGVGb250RGF0YSogZm9udCwgY29uc3Qg
R2x5cGhCdWZmZXImIGdseXBoQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgIGludCBmcm9t
LCBpbnQgbnVtR2x5cGhzLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICBp
ZiAoIWZvbnQtPnBsYXRmb3JtRGF0YSgpLnNpemUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
UGxhdGZvcm1Db250ZXh0UFMqIHBsYXRmb3JtQ29udGV4dCA9IGNvbnRleHQtPnBsYXRmb3JtQ29u
dGV4dCgpOworCisgICAgcHNfY29udGV4dCogZ2MgPSBwbGF0Zm9ybUNvbnRleHQtPmNvbnRleHQo
KTsKKyAgICBwc19zZXRfZm9udChnYywgZm9udC0+cGxhdGZvcm1EYXRhKCkuZm9udCgpKTsKKwor
ICAgIGNvbnN0IEdseXBoQnVmZmVyR2x5cGgqIGdseXBocyA9IChHbHlwaEJ1ZmZlckdseXBoKiln
bHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSk7CisgICAgcHNfd2lkZV90ZXh0X291dF9sZW5ndGgoZ2Ms
IHBvaW50LngoKSwgcG9pbnQueSgpLCBnbHlwaHMsIG51bUdseXBocyk7Cit9CisKK30KZGlmZiAt
dXJOIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vR0xDb250ZXh0LmNw
cCBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL0dMQ29udGV4dC5jcHAK
LS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vR0xDb250ZXh0LmNw
cAkxOTcwLTAxLTAxIDA4OjAwOjAwLjAwMDAwMDAwMCArMDgwMAorKysgU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9HTENvbnRleHQuY3BwCTIwMTItMTEtMTIgMjA6MTY6
NDkuMDAwMDAwMDAwICswODAwCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogIENvcHlyaWdodCAo
QykgMjAxMSwgMjAxMiBJZ2FsaWEsIFMuTC4KKyAqICBDb3B5cmlnaHQgKGMpIDIwMTIsIFpoYW5n
IEppIFBlbmcgPG9uZWNvb2x4QGdtYWlsLmNvbT4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBp
dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBM
aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJS
QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRB
QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUK
KyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoK
KyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdl
bmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90
LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDUxIEZy
YW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJHTENvbnRleHQuaCIKKworI2lm
IFVTRShPUEVOR0wpCisKKyNpbmNsdWRlICJHTENvbnRleHRFR0wuaCIKKyNpbmNsdWRlICJHTENv
bnRleHRHTFguaCIKKyNpbmNsdWRlIDx3dGYvTWFpblRocmVhZC5oPgorCisjaWYgUExBVEZPUk0o
WDExKQorI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitHTENvbnRleHQqIEdMQ29udGV4dDo6c2hhcmluZ0NvbnRleHQoKQoreworICAgIEFTU0VS
VChpc01haW5UaHJlYWQoKSk7CisgICAgREVGSU5FX1NUQVRJQ19MT0NBTChPd25QdHI8R0xDb250
ZXh0Piwgc2hhcmluZywgKGNyZWF0ZU9mZnNjcmVlbkNvbnRleHQoKSkpOworICAgIHJldHVybiBz
aGFyaW5nLmdldCgpOworfQorCisjaWYgUExBVEZPUk0oWDExKQorLy8gV2UgZG8gbm90IHdhbnQg
dG8gY2FsbCBnbFhNYWtlQ29udGV4dEN1cnJlbnQgdXNpbmcgZGlmZmVyZW50IERpc3BsYXkgcG9p
bnRlcnMsCisvLyBiZWNhdXNlIGl0IG1pZ2h0IGxlYWQgdG8gY3Jhc2hlcyBpbiBzb21lIGRyaXZl
cnMgKGZnbHJ4KS4gV2UgdXNlIGEgc2hhcmVkIGRpc3BsYXkKKy8vIHBvaW50ZXIgaGVyZS4KK3N0
YXRpYyBEaXNwbGF5KiBnU2hhcmVkWDExRGlzcGxheSA9IDA7CitEaXNwbGF5KiBHTENvbnRleHQ6
OnNoYXJlZFgxMURpc3BsYXkoKQoreworICAgIGlmICghZ1NoYXJlZFgxMURpc3BsYXkpCisgICAg
ICAgIGdTaGFyZWRYMTFEaXNwbGF5ID0gWE9wZW5EaXNwbGF5KDApOworICAgIHJldHVybiBnU2hh
cmVkWDExRGlzcGxheTsKK30KKwordm9pZCBHTENvbnRleHQ6OmNsZWFudXBTaGFyZWRYMTFEaXNw
bGF5KCkKK3sKKyAgICBpZiAoIWdTaGFyZWRYMTFEaXNwbGF5KQorICAgICAgICByZXR1cm47Cisg
ICAgWENsb3NlRGlzcGxheShnU2hhcmVkWDExRGlzcGxheSk7CisgICAgZ1NoYXJlZFgxMURpc3Bs
YXkgPSAwOworfQorI2VuZGlmIC8vIFBMQVRGT1JNKFgxMSkKKworLy8gQmVjYXVzZSBvZiBkcml2
ZXIgYnVncywgZXhpdGluZyB0aGUgcHJvZ3JhbSB3aGVuIHRoZXJlIGFyZSBhY3RpdmUgcGJ1ZmZl
cnMKKy8vIGNhbiBjcmFzaCB0aGUgWCBzZXJ2ZXIgKHRoaXMgaGFzIGJlZW4gb2JzZXJ2ZWQgd2l0
aCB0aGUgb2ZmaWNpYWwgTnZpZGlhIGRyaXZlcnMpLgorLy8gV2UgbmVlZCB0byBlbnN1cmUgdGhh
dCB3ZSBjbGVhbiBldmVyeXRoaW5nIHVwIG9uIGV4aXQuIFRoZXJlIGFyZSBzZXZlcmFsIHJlYXNv
bnMKKy8vIHRoYXQgR3JhcGhpY3NDb250ZXh0M0RzIHdpbGwgc3RpbGwgYmUgYWxpdmUgYXQgZXhp
dCwgaW5jbHVkaW5nIHVzZXIgZXJyb3IgKG1lbW9yeQorLy8gbGVha3MpIGFuZCB0aGUgcGFnZSBj
YWNoZS4gSW4gYW55IGNhc2UsIHdlIGRvbid0IHdhbnQgdGhlIFggc2VydmVyIHRvIGNyYXNoLgor
dHlwZWRlZiBWZWN0b3I8R0xDb250ZXh0Kj4gQWN0aXZlQ29udGV4dExpc3Q7CitzdGF0aWMgQWN0
aXZlQ29udGV4dExpc3QmIGFjdGl2ZUNvbnRleHRMaXN0KCkKK3sKKyAgICBERUZJTkVfU1RBVElD
X0xPQ0FMKEFjdGl2ZUNvbnRleHRMaXN0LCBhY3RpdmVDb250ZXh0cywgKCkpOworICAgIHJldHVy
biBhY3RpdmVDb250ZXh0czsKK30KKwordm9pZCBHTENvbnRleHQ6OmFkZEFjdGl2ZUNvbnRleHQo
R0xDb250ZXh0KiBjb250ZXh0KQoreworICAgIHN0YXRpYyBib29sIGFkZGVkQXRFeGl0SGFuZGxl
ciA9IGZhbHNlOworICAgIGlmICghYWRkZWRBdEV4aXRIYW5kbGVyKSB7CisgICAgICAgIGF0ZXhp
dCgmR0xDb250ZXh0OjpjbGVhbnVwQWN0aXZlQ29udGV4dHNBdEV4aXQpOworICAgICAgICBhZGRl
ZEF0RXhpdEhhbmRsZXIgPSB0cnVlOworICAgIH0KKyAgICBhY3RpdmVDb250ZXh0TGlzdCgpLmFw
cGVuZChjb250ZXh0KTsKK30KKworc3RhdGljIGJvb2wgZ0NsZWFuaW5nVXBBdEV4aXQgPSBmYWxz
ZTsKKwordm9pZCBHTENvbnRleHQ6OnJlbW92ZUFjdGl2ZUNvbnRleHQoR0xDb250ZXh0KiBjb250
ZXh0KQoreworICAgIC8vIElmIHdlIGFyZSBjbGVhbmluZyB1cCB0aGUgY29udGV4dCBsaXN0IGF0
IGV4aXQsIGRvbid0IGJvdGhlciByZW1vdmluZyB0aGUgY29udGV4dAorICAgIC8vIGZyb20gdGhl
IGxpc3QsIHNpbmNlIHdlIGRvbid0IHdhbnQgdG8gbW9kaWZ5IHRoZSBsaXN0IHdoaWxlIGl0J3Mg
YmVpbmcgaXRlcmF0ZWQuCisgICAgaWYgKGdDbGVhbmluZ1VwQXRFeGl0KQorICAgICAgICByZXR1
cm47CisKKyAgICBBY3RpdmVDb250ZXh0TGlzdCYgY29udGV4dExpc3QgPSBhY3RpdmVDb250ZXh0
TGlzdCgpOworICAgIHNpemVfdCBpID0gY29udGV4dExpc3QuZmluZChjb250ZXh0KTsKKyAgICBp
ZiAoaSAhPSBub3RGb3VuZCkKKyAgICAgICAgY29udGV4dExpc3QucmVtb3ZlKGkpOworfQorCit2
b2lkIEdMQ29udGV4dDo6Y2xlYW51cEFjdGl2ZUNvbnRleHRzQXRFeGl0KCkKK3sKKyAgICBnQ2xl
YW5pbmdVcEF0RXhpdCA9IHRydWU7CisKKyAgICBBY3RpdmVDb250ZXh0TGlzdCYgY29udGV4dExp
c3QgPSBhY3RpdmVDb250ZXh0TGlzdCgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29u
dGV4dExpc3Quc2l6ZSgpOyArK2kpCisgICAgICAgIGRlbGV0ZSBjb250ZXh0TGlzdFtpXTsKKwor
I2lmIFBMQVRGT1JNKFgxMSkKKyAgICBjbGVhbnVwU2hhcmVkWDExRGlzcGxheSgpOworI2VuZGlm
Cit9CisKK1Bhc3NPd25QdHI8R0xDb250ZXh0PiBHTENvbnRleHQ6OmNyZWF0ZUNvbnRleHRGb3JX
aW5kb3codWludDY0X3Qgd2luZG93SGFuZGxlLCBHTENvbnRleHQqIHNoYXJpbmdDb250ZXh0KQor
eworI2lmIFVTRShHTFgpCisgICAgaWYgKE93blB0cjxHTENvbnRleHQ+IGdseENvbnRleHQgPSBH
TENvbnRleHRHTFg6OmNyZWF0ZUNvbnRleHQod2luZG93SGFuZGxlLCBzaGFyaW5nQ29udGV4dCkp
CisgICAgICAgIHJldHVybiBnbHhDb250ZXh0LnJlbGVhc2UoKTsKKyNlbmRpZgorI2lmIFVTRShF
R0wpCisgICAgaWYgKE93blB0cjxHTENvbnRleHQ+IGVnbENvbnRleHQgPSBHTENvbnRleHRFR0w6
OmNyZWF0ZUNvbnRleHQod2luZG93SGFuZGxlLCBzaGFyaW5nQ29udGV4dCkpCisgICAgICAgIHJl
dHVybiBlZ2xDb250ZXh0LnJlbGVhc2UoKTsKKyNlbmRpZgorICAgIHJldHVybiBudWxscHRyOwor
fQorCitHTENvbnRleHQ6OkdMQ29udGV4dCgpCit7CisgICAgYWRkQWN0aXZlQ29udGV4dCh0aGlz
KTsKK30KKworUGFzc093blB0cjxHTENvbnRleHQ+IEdMQ29udGV4dDo6Y3JlYXRlT2Zmc2NyZWVu
Q29udGV4dChHTENvbnRleHQqIHNoYXJpbmdDb250ZXh0KQoreworI2lmIFVTRShHTFgpCisgICAg
aWYgKE93blB0cjxHTENvbnRleHQ+IGdseENvbnRleHQgPSBHTENvbnRleHRHTFg6OmNyZWF0ZUNv
bnRleHQoMCwgc2hhcmluZ0NvbnRleHQpKQorICAgICAgICByZXR1cm4gZ2x4Q29udGV4dC5yZWxl
YXNlKCk7CisjZW5kaWYKKyNpZiBVU0UoRUdMKQorICAgIGlmIChPd25QdHI8R0xDb250ZXh0PiBl
Z2xDb250ZXh0ID0gR0xDb250ZXh0RUdMOjpjcmVhdGVDb250ZXh0KDAsIHNoYXJpbmdDb250ZXh0
KSkKKyAgICAgICAgcmV0dXJuIGVnbENvbnRleHQucmVsZWFzZSgpOworI2VuZGlmCisgICAgcmV0
dXJuIG51bGxwdHI7Cit9CisKKy8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBhIHRocmVhZCBsb2Nh
bCBldmVudHVhbGx5IGlmIHdlCisvLyB3YW50IHRvIHN1cHBvcnQgdXNpbmcgR0xDb250ZXh0cyBm
cm9tIG11bHRpcGxlIHRocmVhZHMuCitzdGF0aWMgR0xDb250ZXh0KiBnQ3VycmVudENvbnRleHQg
PSAwOworCitHTENvbnRleHQ6On5HTENvbnRleHQoKQoreworICAgIGlmICh0aGlzID09IGdDdXJy
ZW50Q29udGV4dCkKKyAgICAgICAgZ0N1cnJlbnRDb250ZXh0ID0gMDsKKyAgICByZW1vdmVBY3Rp
dmVDb250ZXh0KHRoaXMpOworfQorCitib29sIEdMQ29udGV4dDo6bWFrZUNvbnRleHRDdXJyZW50
KCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworICAgIGdDdXJyZW50Q29udGV4dCA9
IHRoaXM7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK0dMQ29udGV4dCogR0xDb250ZXh0OjpnZXRD
dXJyZW50KCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFkKCkpOworICAgIHJldHVybiBnQ3Vy
cmVudENvbnRleHQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFVT
RShPUEVOR0wpCisKZGlmZiAtdXJOIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3Bp
Y2Fzc28vR0xDb250ZXh0LmggU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNz
by9HTENvbnRleHQuaAotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNz
by9HTENvbnRleHQuaAkxOTcwLTAxLTAxIDA4OjAwOjAwLjAwMDAwMDAwMCArMDgwMAorKysgU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9HTENvbnRleHQuaAkyMDEyLTEx
LTEyIDIwOjE2OjQ5LjAwMDAwMDAwMCArMDgwMApAQCAtMCwwICsxLDY3IEBACisvKgorICogIENv
cHlyaWdodCAoQykgMjAxMiBJZ2FsaWEgUy5MLgorICogIENvcHlyaWdodCAoYykgMjAxMiwgWmhh
bmcgSmkgUGVuZyA8b25lY29vbHhAZ21haWwuY29tPgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICog
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBh
bnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGlu
IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdB
UlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO
VQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIg
R2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBu
b3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEg
RnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEg
VVNBCisgKi8KKworI2lmbmRlZiBHTENvbnRleHRfaAorI2RlZmluZSBHTENvbnRleHRfaAorCisj
aW5jbHVkZSAiV2lkZ2V0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0M0QuaCIKKyNpbmNs
dWRlIDx3dGYvTm9uY29weWFibGUuaD4KKyNpbmNsdWRlIDx3dGYvUGFzc093blB0ci5oPgorCisj
aWYgUExBVEZPUk0oWDExKQordHlwZWRlZiBzdHJ1Y3QgX1hEaXNwbGF5IERpc3BsYXk7CisjZW5k
aWYKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBHTENvbnRleHQgeworICAgIFdURl9N
QUtFX05PTkNPUFlBQkxFKEdMQ29udGV4dCk7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NPd25Q
dHI8R0xDb250ZXh0PiBjcmVhdGVDb250ZXh0Rm9yV2luZG93KHVpbnQ2NF90IHdpbmRvd0hhbmRs
ZSwgR0xDb250ZXh0KiBzaGFyaW5nQ29udGV4dCk7CisgICAgc3RhdGljIFBhc3NPd25QdHI8R0xD
b250ZXh0PiBjcmVhdGVPZmZzY3JlZW5Db250ZXh0KEdMQ29udGV4dCogc2hhcmluZyA9IDApOwor
ICAgIHN0YXRpYyBHTENvbnRleHQqIGdldEN1cnJlbnQoKTsKKyAgICBzdGF0aWMgR0xDb250ZXh0
KiBzaGFyaW5nQ29udGV4dCgpOworCisgICAgR0xDb250ZXh0KCk7CisgICAgdmlydHVhbCB+R0xD
b250ZXh0KCk7CisgICAgdmlydHVhbCBib29sIG1ha2VDb250ZXh0Q3VycmVudCgpOworICAgIHZp
cnR1YWwgdm9pZCBzd2FwQnVmZmVycygpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgd2FpdE5hdGl2
ZSgpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgY2FuUmVuZGVyVG9EZWZhdWx0RnJhbWVidWZmZXIo
KSA9IDA7CisgICAgdmlydHVhbCBJbnRTaXplIGRlZmF1bHRGcmFtZUJ1ZmZlclNpemUoKSA9IDA7
CisKKyNpZiBQTEFURk9STShYMTEpCisgICAgc3RhdGljIERpc3BsYXkqIHNoYXJlZFgxMURpc3Bs
YXkoKTsKKyAgICBzdGF0aWMgdm9pZCBjbGVhbnVwU2hhcmVkWDExRGlzcGxheSgpOworI2VuZGlm
CisKKyAgICBzdGF0aWMgdm9pZCBhZGRBY3RpdmVDb250ZXh0KEdMQ29udGV4dCopOworICAgIHN0
YXRpYyB2b2lkIHJlbW92ZUFjdGl2ZUNvbnRleHQoR0xDb250ZXh0Kik7CisgICAgc3RhdGljIHZv
aWQgY2xlYW51cEFjdGl2ZUNvbnRleHRzQXRFeGl0KCk7CisKKyNpZiBVU0UoM0RfR1JBUEhJQ1Mp
CisgICAgdmlydHVhbCBQbGF0Zm9ybUdyYXBoaWNzQ29udGV4dDNEIHBsYXRmb3JtQ29udGV4dCgp
ID0gMDsKKyNlbmRpZgorfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8g
R0xDb250ZXh0X2gKZGlmZiAtdXJOIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3Bp
Y2Fzc28vR2x5cGhQYWdlVHJlZU5vZGVQUy5jcHAgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvcGljYXNzby9HbHlwaFBhZ2VUcmVlTm9kZVBTLmNwcAotLS0gU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9HbHlwaFBhZ2VUcmVlTm9kZVBTLmNwcAkxOTcwLTAx
LTAxIDA4OjAwOjAwLjAwMDAwMDAwMCArMDgwMAorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvcGljYXNzby9HbHlwaFBhZ2VUcmVlTm9kZVBTLmNwcAkyMDEyLTExLTEyIDIwOjE2
OjQ5LjAwMDAwMDAwMCArMDgwMApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChj
KSAyMDEyIFpoYW5nIEppIFBlbmcgPG9uZWNvb2x4QGdtYWlsLmNvbT4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBw
bGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhp
cyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVU
T1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFS
RQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiR2x5cGhQYWdlVHJlZU5vZGUuaCIKKworI2luY2x1ZGUgIlNpbXBsZUZv
bnREYXRhLmgiCisjaW5jbHVkZSA8cGljYXNzby5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K2Jvb2wgR2x5cGhQYWdlOjpmaWxsKHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbGVuZ3RoLCBV
Q2hhciogYnVmZmVyLCB1bnNpZ25lZCBidWZmZXJMZW5ndGgsIGNvbnN0IFNpbXBsZUZvbnREYXRh
KiBmb250RGF0YSkKK3sKKyAgICBpZiAoYnVmZmVyTGVuZ3RoID4gR2x5cGhQYWdlOjpzaXplKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbGVu
Z3RoOyBpKyspIAorICAgICAgICBzZXRHbHlwaERhdGFGb3JJbmRleChvZmZzZXQgKyBpLCBidWZm
ZXJbaV0sIGZvbnREYXRhKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit9CmRpZmYgLXVyTiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL0dyYWRpZW50UFMuY3BwIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vR3JhZGllbnRQUy5jcHAKLS0t
IFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vR3JhZGllbnRQUy5jcHAJ
MTk3MC0wMS0wMSAwODowMDowMC4wMDAwMDAwMDAgKzA4MDAKKysrIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vR3JhZGllbnRQUy5jcHAJMjAxMi0xMS0xMiAyMDoxNjo0
OS4wMDAwMDAwMDAgKzA4MDAKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMp
IDIwMTIgWmhhbmcgSmkgUGVuZyA8b25lY29vbHhAZ21haWwuY29tPgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiR3JhZGllbnQuaCIKKworI2luY2x1ZGUgIkNTU1BhcnNl
ci5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ29u
dGV4dFBTLmgiCisjaW5jbHVkZSA8cGljYXNzby5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisK
K3ZvaWQgR3JhZGllbnQ6OnBsYXRmb3JtRGVzdHJveSgpCit7CisgICAgaWYgKG1fZ3JhZGllbnQp
IHsKKyAgICAgICAgcHNfZ3JhZGllbnRfdW5yZWYobV9ncmFkaWVudCk7CisgICAgICAgIG1fZ3Jh
ZGllbnQgPSAwOworICAgIH0KK30KKworcHNfZ3JhZGllbnQqIEdyYWRpZW50OjpwbGF0Zm9ybUdy
YWRpZW50KCkKK3sKKyAgICByZXR1cm4gcGxhdGZvcm1HcmFkaWVudCgxKTsKK30KKworcHNfZ3Jh
ZGllbnQqIEdyYWRpZW50OjpwbGF0Zm9ybUdyYWRpZW50KGZsb2F0IGdsb2JhbEFscGhhKQorewor
ICAgIGlmIChtX2dyYWRpZW50ICYmIG1fcGxhdGZvcm1HcmFkaWVudEFscGhhID09IGdsb2JhbEFs
cGhhKQorICAgICAgICByZXR1cm4gbV9ncmFkaWVudDsKKworICAgIHBsYXRmb3JtRGVzdHJveSgp
OworICAgIG1fcGxhdGZvcm1HcmFkaWVudEFscGhhID0gZ2xvYmFsQWxwaGE7CisKKyAgICBwc19n
cmFkaWVudF9zcHJlYWQgc3ByZWFkID0gR1JBRElFTlRfU1BSRUFEX1BBRDsKKyAgICBzd2l0Y2gg
KG1fc3ByZWFkTWV0aG9kKSB7CisgICAgY2FzZSBTcHJlYWRNZXRob2RQYWQ6CisgICAgICAgIHNw
cmVhZCA9IEdSQURJRU5UX1NQUkVBRF9QQUQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU3By
ZWFkTWV0aG9kUmVmbGVjdDoKKyAgICAgICAgc3ByZWFkID0gR1JBRElFTlRfU1BSRUFEX1JFRkxF
Q1Q7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU3ByZWFkTWV0aG9kUmVwZWF0OgorICAgICAg
ICBzcHJlYWQgPSBHUkFESUVOVF9TUFJFQURfUkVQRUFUOworICAgICAgICBicmVhazsKKyAgICB9
CisKKyAgICBpZiAobV9yYWRpYWwpIHsKKwlwc19wb2ludCBwMCA9IHttX3AwLngoKSwgbV9wMC55
KCl9OworCXBzX3BvaW50IHAxID0ge21fcDEueCgpLCBtX3AxLnkoKX07CisgICAgICAgIG1fZ3Jh
ZGllbnQgPSBwc19ncmFkaWVudF9jcmVhdGVfcmFkaWFsKHNwcmVhZCwgJnAwLCBtX3IwLCAmcDEs
IG1fcjEpOworICAgIH0gZWxzZSB7CisJcHNfcG9pbnQgcDAgPSB7bV9wMC54KCksIG1fcDAueSgp
fTsKKwlwc19wb2ludCBwMSA9IHttX3AxLngoKSwgbV9wMS55KCl9OworICAgICAgICBtX2dyYWRp
ZW50ID0gcHNfZ3JhZGllbnRfY3JlYXRlX2xpbmVhcihzcHJlYWQsICZwMCwgJnAxKTsKKyAgICB9
CisKKyAgICBWZWN0b3I8Q29sb3JTdG9wPjo6aXRlcmF0b3Igc3RvcEl0ZXJhdG9yID0gbV9zdG9w
cy5iZWdpbigpOworICAgIHdoaWxlIChzdG9wSXRlcmF0b3IgIT0gbV9zdG9wcy5lbmQoKSkgewor
CXBzX2NvbG9yIGNvbG9yID0ge3N0b3BJdGVyYXRvci0+cmVkLCBzdG9wSXRlcmF0b3ItPmdyZWVu
LCAKKwkJCXN0b3BJdGVyYXRvci0+Ymx1ZSxzdG9wSXRlcmF0b3ItPmFscGhhICogZ2xvYmFsQWxw
aGF9OworICAgICAgICBwc19ncmFkaWVudF9hZGRfY29sb3Jfc3RvcChtX2dyYWRpZW50LCBzdG9w
SXRlcmF0b3ItPnN0b3AsICZjb2xvcik7CisgICAgICAgICsrc3RvcEl0ZXJhdG9yOworICAgIH0K
KworCisgICAgcHNfbWF0cml4KiBtYXRyaXggPSBtX2dyYWRpZW50U3BhY2VUcmFuc2Zvcm1hdGlv
bi5tYWtlTWF0cml4KCk7CisgICAgcHNfbWF0cml4X2ludmVydChtYXRyaXgpOworICAgIHBzX2dy
YWRpZW50X3RyYW5zZm9ybShtX2dyYWRpZW50LCBtYXRyaXgpOworICAgIHBzX21hdHJpeF91bnJl
ZihtYXRyaXgpOworCisgICAgcmV0dXJuIG1fZ3JhZGllbnQ7Cit9CisKK3ZvaWQgR3JhZGllbnQ6
OnNldFBsYXRmb3JtR3JhZGllbnRTcGFjZVRyYW5zZm9ybShjb25zdCBBZmZpbmVUcmFuc2Zvcm0m
IGdyYWRpZW50U3BhY2VUcmFuc2Zvcm1hdGlvbikKK3sKKyAgICBpZiAobV9ncmFkaWVudCkgewor
ICAgICAgICBwc19tYXRyaXgqIG1hdHJpeCA9IGdyYWRpZW50U3BhY2VUcmFuc2Zvcm1hdGlvbi5t
YWtlTWF0cml4KCk7CisgICAgICAgIHBzX21hdHJpeF9pbnZlcnQobWF0cml4KTsKKyAgICAgICAg
cHNfZ3JhZGllbnRfdHJhbnNmb3JtKG1fZ3JhZGllbnQsIG1hdHJpeCk7CisgICAgCXBzX21hdHJp
eF91bnJlZihtYXRyaXgpOworICAgIH0KK30KKwordm9pZCBHcmFkaWVudDo6ZmlsbChHcmFwaGlj
c0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEZsb2F0UmVjdCYgcmVjdCkKK3sKKyAgICBwc19jb250
ZXh0KiBjdHggPSBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKS0+Y29udGV4dCgpOworICAgIHBz
X3JlY3QgcmMgPSB7cmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0
KCl9OworCisgICAgY29udGV4dC0+c2F2ZSgpOworICAgIHBzX3NldF9zb3VyY2VfZ3JhZGllbnQo
Y3R4LCBwbGF0Zm9ybUdyYWRpZW50KCkpOworICAgIHBzX3JlY3RhbmdsZShjdHgsICZyYyk7Cisg
ICAgcHNfZmlsbChjdHgpOworICAgIGNvbnRleHQtPnJlc3RvcmUoKTsKK30KKworfSAvL25hbWVz
cGFjZQpkaWZmIC11ck4gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9H
cmFwaGljc0NvbnRleHQzRFByaXZhdGUuY3BwIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3BpY2Fzc28vR3JhcGhpY3NDb250ZXh0M0RQcml2YXRlLmNwcAotLS0gU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9HcmFwaGljc0NvbnRleHQzRFByaXZhdGUuY3Bw
CTE5NzAtMDEtMDEgMDg6MDA6MDAuMDAwMDAwMDAwICswODAwCisrKyBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL0dyYXBoaWNzQ29udGV4dDNEUHJpdmF0ZS5jcHAJMjAx
Mi0xMS0xMiAyMDoxNjo0OS4wMDAwMDAwMDAgKzA4MDAKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisg
KiAgQ29weXJpZ2h0IChjKSAyMDEyIFpoYW5nIEppIFBlbmcgPG9uZWNvb2x4QGdtYWlsLmNvbT4K
KyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBM
ZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisg
KiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQzRFByaXZhdGUuaCIKKworI2lmIFVTRSgzRF9HUkFQ
SElDUykKKworI2luY2x1ZGUgIkhvc3RXaW5kb3cuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRl
ZC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dFBTLmgiCisjaW5jbHVkZSA8d3RmL093bkFy
cmF5UHRyLmg+CisKKyNpZiBVU0UoT1BFTkdMX0VTXzIpCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+
CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisjZWxzZQorI2luY2x1ZGUgIk9wZW5HTFNoaW1z
LmgiCisjZW5kaWYKKworI2lmIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElORykgJiYgVVNFKFRF
WFRVUkVfTUFQUEVSKSAmJiBVU0UoVEVYVFVSRV9NQVBQRVJfR0wpCisjaW5jbHVkZSA8dGV4bWFw
L1RleHR1cmVNYXBwZXJHTC5oPgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworUGFzc093blB0cjxHcmFwaGljc0NvbnRleHQzRFByaXZhdGU+
IEdyYXBoaWNzQ29udGV4dDNEUHJpdmF0ZTo6Y3JlYXRlKEdyYXBoaWNzQ29udGV4dDNEKiBjb250
ZXh0LCBHcmFwaGljc0NvbnRleHQzRDo6UmVuZGVyU3R5bGUgcmVuZGVyU3R5bGUpCit7CisgICAg
cmV0dXJuIGFkb3B0UHRyKG5ldyBHcmFwaGljc0NvbnRleHQzRFByaXZhdGUoY29udGV4dCwgcmVu
ZGVyU3R5bGUpKTsKK30KKworR3JhcGhpY3NDb250ZXh0M0RQcml2YXRlOjpHcmFwaGljc0NvbnRl
eHQzRFByaXZhdGUoR3JhcGhpY3NDb250ZXh0M0QqIGNvbnRleHQsIEdyYXBoaWNzQ29udGV4dDNE
OjpSZW5kZXJTdHlsZSByZW5kZXJTdHlsZSkKKyAgICA6IG1fY29udGV4dChjb250ZXh0KQorICAg
ICwgbV9yZW5kZXJTdHlsZShyZW5kZXJTdHlsZSkKK3sKKyAgICBzd2l0Y2ggKHJlbmRlclN0eWxl
KSB7CisgICAgY2FzZSBHcmFwaGljc0NvbnRleHQzRDo6UmVuZGVyT2Zmc2NyZWVuOgorICAgICAg
ICBtX2dsQ29udGV4dCA9IEdMQ29udGV4dDo6Y3JlYXRlT2Zmc2NyZWVuQ29udGV4dChHTENvbnRl
eHQ6OnNoYXJpbmdDb250ZXh0KCkpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEdyYXBoaWNz
Q29udGV4dDNEOjpSZW5kZXJUb0N1cnJlbnRHTENvbnRleHQ6CisgICAgICAgIGJyZWFrOworICAg
IGNhc2UgR3JhcGhpY3NDb250ZXh0M0Q6OlJlbmRlckRpcmVjdGx5VG9Ib3N0V2luZG93OgorICAg
ICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitH
cmFwaGljc0NvbnRleHQzRFByaXZhdGU6On5HcmFwaGljc0NvbnRleHQzRFByaXZhdGUoKQorewor
fQorCitib29sIEdyYXBoaWNzQ29udGV4dDNEUHJpdmF0ZTo6bWFrZUNvbnRleHRDdXJyZW50KCkK
K3sKKyAgICByZXR1cm4gbV9nbENvbnRleHQgPyBtX2dsQ29udGV4dC0+bWFrZUNvbnRleHRDdXJy
ZW50KCkgOiBmYWxzZTsKK30KKworUGxhdGZvcm1HcmFwaGljc0NvbnRleHQzRCBHcmFwaGljc0Nv
bnRleHQzRFByaXZhdGU6OnBsYXRmb3JtQ29udGV4dCgpCit7CisgICAgcmV0dXJuIG1fZ2xDb250
ZXh0ID8gbV9nbENvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpIDogR0xDb250ZXh0OjpnZXRDdXJy
ZW50KCktPnBsYXRmb3JtQ29udGV4dCgpOworfQorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBP
U0lUSU5HKSAmJiBVU0UoVEVYVFVSRV9NQVBQRVIpCit2b2lkIEdyYXBoaWNzQ29udGV4dDNEUHJp
dmF0ZTo6cGFpbnRUb1RleHR1cmVNYXBwZXIoVGV4dHVyZU1hcHBlciogdGV4dHVyZU1hcHBlciwg
Y29uc3QgRmxvYXRSZWN0JiB0YXJnZXRSZWN0LCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYg
bWF0cml4LCBmbG9hdCBvcGFjaXR5LCBCaXRtYXBUZXh0dXJlKiBtYXNrKQoreworICAgIGlmICgh
bV9nbENvbnRleHQpCisgICAgICAgIHJldHVybjsKKworICAgIEFTU0VSVChtX3JlbmRlclN0eWxl
ID09IEdyYXBoaWNzQ29udGV4dDNEOjpSZW5kZXJPZmZzY3JlZW4pOworCisgICAgLy8gRklYTUU6
IFdlIGRvIG5vdCBzdXBwb3J0IG1hc2sgZm9yIHRoZSBtb21lbnQgd2l0aCBUZXh0dXJlTWFwcGVy
SW1hZ2VCdWZmZXIuCisgICAgaWYgKHRleHR1cmVNYXBwZXItPmFjY2VsZXJhdGlvbk1vZGUoKSAh
PSBUZXh0dXJlTWFwcGVyOjpPcGVuR0xNb2RlKSB7CisgICAgICAgIEdyYXBoaWNzQ29udGV4dCog
Y29udGV4dCA9IHRleHR1cmVNYXBwZXItPmdyYXBoaWNzQ29udGV4dCgpOworICAgICAgICBjb250
ZXh0LT5zYXZlKCk7CisgICAgICAgIGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5zZXRHbG9i
YWxBbHBoYShvcGFjaXR5KTsKKworICAgICAgICBjb25zdCBpbnQgaGVpZ2h0ID0gbV9jb250ZXh0
LT5tX2N1cnJlbnRIZWlnaHQ7CisgICAgICAgIGNvbnN0IGludCB3aWR0aCA9IG1fY29udGV4dC0+
bV9jdXJyZW50V2lkdGg7CisgICAgICAgIGludCB0b3RhbEJ5dGVzID0gd2lkdGggKiBoZWlnaHQg
KiA0OworCisgICAgICAgIE93bkFycmF5UHRyPHVuc2lnbmVkIGNoYXI+IHBpeGVscyA9IGFkb3B0
QXJyYXlQdHIobmV3IHVuc2lnbmVkIGNoYXJbdG90YWxCeXRlc10pOworICAgICAgICBpZiAoIXBp
eGVscykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBPcGVuR0wga2VlcHMgdGhl
IHBpeGVscyBzdG9yZWQgYm90dG9tIHVwLCBzbyB3ZSBuZWVkIHRvIGZsaXAgdGhlIGltYWdlIGhl
cmUuCisgICAgICAgIGNvbnRleHQtPnRyYW5zbGF0ZSgwLCBoZWlnaHQpOworICAgICAgICBjb250
ZXh0LT5zY2FsZShGbG9hdFNpemUoMSwgLTEpKTsKKworICAgICAgICBjb250ZXh0LT5jb25jYXRD
VE0obWF0cml4LnRvQWZmaW5lVHJhbnNmb3JtKCkpOworCisgICAgICAgIG1fY29udGV4dC0+cmVh
ZFJlbmRlcmluZ1Jlc3VsdHMocGl4ZWxzLmdldCgpLCB0b3RhbEJ5dGVzKTsKKworICAgICAgICAv
LyBQcmVtdWx0aXBseSBhbHBoYS4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbEJ5
dGVzOyBpICs9IDQpCisgICAgICAgICAgICBpZiAocGl4ZWxzW2kgKyAzXSAhPSAyNTUpIHsKKyAg
ICAgICAgICAgICAgICBwaXhlbHNbaSArIDBdID0gbWluKDI1NSwgcGl4ZWxzW2kgKyAwXSAqIHBp
eGVsc1tpICsgM10gLyAyNTUpOworICAgICAgICAgICAgICAgIHBpeGVsc1tpICsgMV0gPSBtaW4o
MjU1LCBwaXhlbHNbaSArIDFdICogcGl4ZWxzW2kgKyAzXSAvIDI1NSk7CisgICAgICAgICAgICAg
ICAgcGl4ZWxzW2kgKyAyXSA9IG1pbigyNTUsIHBpeGVsc1tpICsgMl0gKiBwaXhlbHNbaSArIDNd
IC8gMjU1KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICBSZWZQdHI8cHNfaW1hZ2U+IGltYWdl
U3VyZmFjZSA9IGFkb3B0UmVmKHBzX2ltYWdlX2NyZWF0ZV93aXRoX2RhdGEoCisgICAgICAgICAg
ICBjb25zdF9jYXN0PHVuc2lnbmVkIGNoYXIqPihwaXhlbHMuZ2V0KCkpLCBDT0xPUl9GT1JNQVRf
QVJHQiwgd2lkdGgsIGhlaWdodCwgd2lkdGggKiA0KSk7CisKKyAgICAgICAgY29udGV4dC0+cGxh
dGZvcm1Db250ZXh0KCktPmRyYXdJbWFnZVRvQ29udGV4dChpbWFnZVN1cmZhY2UuZ2V0KCksIHRh
cmdldFJlY3QsIEludFJlY3QoMCwgMCwgd2lkdGgsIGhlaWdodCksIGNvbnRleHQpOworCisgICAg
ICAgIGNvbnRleHQtPnJlc3RvcmUoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIFVT
RShURVhUVVJFX01BUFBFUl9HTCkKKyAgICBpZiAobV9jb250ZXh0LT5tX2F0dHJzLmFudGlhbGlh
cyAmJiBtX2NvbnRleHQtPm1fYm91bmRGQk8gPT0gbV9jb250ZXh0LT5tX211bHRpc2FtcGxlRkJP
KSB7CisgICAgICAgIEdMQ29udGV4dCogcHJldmlvdXNBY3RpdmVDb250ZXh0ID0gR0xDb250ZXh0
OjpnZXRDdXJyZW50KCk7CisgICAgICAgIGlmIChwcmV2aW91c0FjdGl2ZUNvbnRleHQgIT0gbV9n
bENvbnRleHQpCisgICAgICAgICAgICBtX2NvbnRleHQtPm1ha2VDb250ZXh0Q3VycmVudCgpOwor
CisgICAgICAgIG1fY29udGV4dC0+cmVzb2x2ZU11bHRpc2FtcGxpbmdJZk5lY2Vzc2FyeSgpOwor
ICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyKEdyYXBoaWNzQ29udGV4dDNEOjpGUkFNRUJVRkZF
UiwgbV9jb250ZXh0LT5tX2JvdW5kRkJPKTsKKworICAgICAgICBpZiAocHJldmlvdXNBY3RpdmVD
b250ZXh0ICYmIHByZXZpb3VzQWN0aXZlQ29udGV4dCAhPSBtX2dsQ29udGV4dCkKKyAgICAgICAg
ICAgIHByZXZpb3VzQWN0aXZlQ29udGV4dC0+bWFrZUNvbnRleHRDdXJyZW50KCk7CisgICAgfQor
CisgICAgVGV4dHVyZU1hcHBlckdMKiB0ZXhtYXBHTCA9IHN0YXRpY19jYXN0PFRleHR1cmVNYXBw
ZXJHTCo+KHRleHR1cmVNYXBwZXIpOworICAgIFRleHR1cmVNYXBwZXJHTDo6RmxhZ3MgZmxhZ3Mg
PSBUZXh0dXJlTWFwcGVyR0w6OlNob3VsZEZsaXBUZXh0dXJlIHwgKG1fY29udGV4dC0+bV9hdHRy
cy5hbHBoYSA/IFRleHR1cmVNYXBwZXJHTDo6U3VwcG9ydHNCbGVuZGluZyA6IDApOworICAgIElu
dFNpemUgdGV4dHVyZVNpemUobV9jb250ZXh0LT5tX2N1cnJlbnRXaWR0aCwgbV9jb250ZXh0LT5t
X2N1cnJlbnRIZWlnaHQpOworICAgIHRleG1hcEdMLT5kcmF3VGV4dHVyZShtX2NvbnRleHQtPm1f
dGV4dHVyZSwgZmxhZ3MsIHRleHR1cmVTaXplLCB0YXJnZXRSZWN0LCBtYXRyaXgsIG9wYWNpdHks
IG1hc2spOworI2VuZGlmIC8vIFVTRShBQ0NFTEVSQVRFRF9DT01QT1NJVElOR19HTCkKK30KKyNl
bmRpZiAvLyBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpCisKK30gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKKworI2VuZGlmIC8vIFVTRSgzRF9HUkFQSElDUykKZGlmZiAtdXJOIFNvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vR3JhcGhpY3NDb250ZXh0M0RQcml2YXRlLmgg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9HcmFwaGljc0NvbnRleHQz
RFByaXZhdGUuaAotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9H
cmFwaGljc0NvbnRleHQzRFByaXZhdGUuaAkxOTcwLTAxLTAxIDA4OjAwOjAwLjAwMDAwMDAwMCAr
MDgwMAorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9HcmFwaGlj
c0NvbnRleHQzRFByaXZhdGUuaAkyMDEyLTExLTEyIDIwOjE2OjQ5LjAwMDAwMDAwMCArMDgwMApA
QCAtMCwwICsxLDYwIEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMiBaaGFuZyBKaSBQZW5n
IDxvbmVjb29seEBnbWFpbC5jb20+CisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBh
cyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAg
dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2
ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg
dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBv
ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGVz
c2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91
IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1
YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUg
dG8gdGhlIEZyZWUKKyAqICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBT
dHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EKKyAqLwor
CisjaWZuZGVmIEdyYXBoaWNzQ29udGV4dDNEUHJpdmF0ZV9oCisjZGVmaW5lIEdyYXBoaWNzQ29u
dGV4dDNEUHJpdmF0ZV9oCisKKyNpbmNsdWRlICJHTENvbnRleHQuaCIKKyNpbmNsdWRlICJHcmFw
aGljc0NvbnRleHQzRC5oIgorI2luY2x1ZGUgPHd0Zi9QYXNzT3duUHRyLmg+CisKKyNpZiBVU0Uo
QUNDRUxFUkFURURfQ09NUE9TSVRJTkcpICYmIFVTRShURVhUVVJFX01BUFBFUikKKyNpbmNsdWRl
ICJUZXh0dXJlTWFwcGVyLmgiCisjZW5kaWYKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFz
cyBHcmFwaGljc0NvbnRleHQzRFByaXZhdGUKKyNpZiBVU0UoQUNDRUxFUkFURURfQ09NUE9TSVRJ
TkcpICYmIFVTRShURVhUVVJFX01BUFBFUikKKyAgICA6IHB1YmxpYyBUZXh0dXJlTWFwcGVyUGxh
dGZvcm1MYXllcgorI2VuZGlmCit7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NPd25QdHI8R3Jh
cGhpY3NDb250ZXh0M0RQcml2YXRlPiBjcmVhdGUoR3JhcGhpY3NDb250ZXh0M0QqLCBHcmFwaGlj
c0NvbnRleHQzRDo6UmVuZGVyU3R5bGUpOworICAgIH5HcmFwaGljc0NvbnRleHQzRFByaXZhdGUo
KTsKKyAgICBib29sIG1ha2VDb250ZXh0Q3VycmVudCgpOworICAgIFBsYXRmb3JtR3JhcGhpY3ND
b250ZXh0M0QgcGxhdGZvcm1Db250ZXh0KCk7CisKKyAgICBHcmFwaGljc0NvbnRleHQzRDo6UmVu
ZGVyU3R5bGUgcmVuZGVyU3R5bGUoKSB7IHJldHVybiBtX3JlbmRlclN0eWxlOyB9CisKKyNpZiBV
U0UoQUNDRUxFUkFURURfQ09NUE9TSVRJTkcpICYmIFVTRShURVhUVVJFX01BUFBFUikKKyAgICB2
aXJ0dWFsIHZvaWQgcGFpbnRUb1RleHR1cmVNYXBwZXIoVGV4dHVyZU1hcHBlciosIGNvbnN0IEZs
b2F0UmVjdCYgdGFyZ2V0LCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYsIGZsb2F0IG9wYWNp
dHksIEJpdG1hcFRleHR1cmUqIG1hc2spOworI2VuZGlmCisKK3ByaXZhdGU6CisgICAgR3JhcGhp
Y3NDb250ZXh0M0RQcml2YXRlKEdyYXBoaWNzQ29udGV4dDNEKiwgR3JhcGhpY3NDb250ZXh0M0Q6
OlJlbmRlclN0eWxlKTsKKworICAgIEdyYXBoaWNzQ29udGV4dDNEKiBtX2NvbnRleHQ7CisgICAg
T3duUHRyPEdMQ29udGV4dD4gbV9nbENvbnRleHQ7CisgICAgR3JhcGhpY3NDb250ZXh0M0Q6OlJl
bmRlclN0eWxlIG1fcmVuZGVyU3R5bGU7Cit9OworCit9CisKKyNlbmRpZiAvLyBHcmFwaGljc0Nv
bnRleHQzRFByaXZhdGVfaApkaWZmIC11ck4gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvcGljYXNzby9HcmFwaGljc0NvbnRleHQzRFBTLmNwcCBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9waWNhc3NvL0dyYXBoaWNzQ29udGV4dDNEUFMuY3BwCi0tLSBTb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL0dyYXBoaWNzQ29udGV4dDNEUFMuY3BwCTE5
NzAtMDEtMDEgMDg6MDA6MDAuMDAwMDAwMDAwICswODAwCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9waWNhc3NvL0dyYXBoaWNzQ29udGV4dDNEUFMuY3BwCTIwMTItMTEtMTIg
MjA6MTY6NDkuMDAwMDAwMDAwICswODAwCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICogQ29weXJp
Z2h0IChjKSAyMDEyIFpoYW5nIEppIFBlbmcgPG9uZWNvb2x4QGdtYWlsLmNvbT4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dDNELmgiCisKKyNp
ZiBVU0UoM0RfR1JBUEhJQ1MpCisKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQzRFByaXZhdGUu
aCIKKyNpbmNsdWRlICJJbWFnZS5oIgorI2luY2x1ZGUgIkltYWdlU291cmNlLmgiCisjaW5jbHVk
ZSAiSW1hZ2VEZWNvZGVyLmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRl
ICJQbGF0Zm9ybUNvbnRleHRQUy5oIgorI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgorI2luY2x1
ZGUgIlJlZlB0clBTLmgiCisjaW5jbHVkZSAiU2hhZGVyTGFuZy5oIgorI2luY2x1ZGUgPHBpY2Fz
c28uaD4KKyNpbmNsdWRlIDx3dGYvTm90Rm91bmQuaD4KKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+
CisjaW5jbHVkZSA8d3RmL1Bhc3NPd25QdHIuaD4KKworI2lmIFVTRShPUEVOR0xfRVNfMikKKyNp
bmNsdWRlICJFeHRlbnNpb25zM0RPcGVuR0xFUy5oIgorI2Vsc2UKKyNpbmNsdWRlICJFeHRlbnNp
b25zM0RPcGVuR0wuaCIKKyNpbmNsdWRlICJPcGVuR0xTaGltcy5oIgorI2VuZGlmCisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworUGFzc1JlZlB0cjxHcmFwaGljc0NvbnRleHQzRD4gR3JhcGhpY3ND
b250ZXh0M0Q6OmNyZWF0ZShHcmFwaGljc0NvbnRleHQzRDo6QXR0cmlidXRlcyBhdHRyaWJ1dGVz
LCBIb3N0V2luZG93KiBob3N0V2luZG93LCBHcmFwaGljc0NvbnRleHQzRDo6UmVuZGVyU3R5bGUg
cmVuZGVyU3R5bGUpCit7CisgICAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGN1cnJl
bnRseSBzdXBwb3J0IHJlbmRlcmluZyBkaXJlY3RseSB0byB0aGUgSG9zdFdpbmRvdy4KKyAgICBp
ZiAocmVuZGVyU3R5bGUgPT0gUmVuZGVyRGlyZWN0bHlUb0hvc3RXaW5kb3cpCisgICAgICAgIHJl
dHVybiAwOworCisgICAgc3RhdGljIGJvb2wgaW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBzdGF0
aWMgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKKyAgICBpZiAoIWluaXRpYWxpemVkKSB7CisjaWYgIVVT
RShPUEVOR0xfRVNfMikKKyAgICAgICAgc3VjY2VzcyA9IGluaXRpYWxpemVPcGVuR0xTaGltcygp
OworI2VuZGlmCisgICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICB9CisgICAgaWYgKCFz
dWNjZXNzKQorICAgICAgICByZXR1cm4gMDsKKworICAgIFJlZlB0cjxHcmFwaGljc0NvbnRleHQz
RD4gY29udGV4dCA9IGFkb3B0UmVmKG5ldyBHcmFwaGljc0NvbnRleHQzRChhdHRyaWJ1dGVzLCBo
b3N0V2luZG93LCByZW5kZXJTdHlsZSkpOworICAgIHJldHVybiBjb250ZXh0LnJlbGVhc2UoKTsK
K30KKworR3JhcGhpY3NDb250ZXh0M0Q6OkdyYXBoaWNzQ29udGV4dDNEKEdyYXBoaWNzQ29udGV4
dDNEOjpBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMsIEhvc3RXaW5kb3cqLCBHcmFwaGljc0NvbnRleHQz
RDo6UmVuZGVyU3R5bGUgcmVuZGVyU3R5bGUpCisgICAgOiBtX2N1cnJlbnRXaWR0aCgwKQorICAg
ICwgbV9jdXJyZW50SGVpZ2h0KDApCisgICAgLCBtX2F0dHJzKGF0dHJpYnV0ZXMpCisgICAgLCBt
X3RleHR1cmUoMCkKKyAgICAsIG1fZmJvKDApCisgICAgLCBtX2RlcHRoU3RlbmNpbEJ1ZmZlcigw
KQorICAgICwgbV9ib3VuZEZCTygwKQorICAgICwgbV9hY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUw
KQorICAgICwgbV9ib3VuZFRleHR1cmUwKDApCisgICAgLCBtX211bHRpc2FtcGxlRkJPKDApCisg
ICAgLCBtX211bHRpc2FtcGxlRGVwdGhTdGVuY2lsQnVmZmVyKDApCisgICAgLCBtX211bHRpc2Ft
cGxlQ29sb3JCdWZmZXIoMCkKKyAgICAsIG1fcHJpdmF0ZShHcmFwaGljc0NvbnRleHQzRFByaXZh
dGU6OmNyZWF0ZSh0aGlzLCByZW5kZXJTdHlsZSkpCit7CisgICAgbWFrZUNvbnRleHRDdXJyZW50
KCk7CisKKyAgICB2YWxpZGF0ZUF0dHJpYnV0ZXMoKTsKKworICAgIGlmIChyZW5kZXJTdHlsZSA9
PSBSZW5kZXJPZmZzY3JlZW4pIHsKKyAgICAgICAgLy8gQ3JlYXRlIGEgdGV4dHVyZSB0byByZW5k
ZXIgaW50by4KKyAgICAgICAgOjpnbEdlblRleHR1cmVzKDEsICZtX3RleHR1cmUpOworICAgICAg
ICA6OmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgbV90ZXh0dXJlKTsKKyAgICAgICAgOjpn
bFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9M
SU5FQVIpOworICAgICAgICA6OmdsVGV4UGFyYW1ldGVyZihHTF9URVhUVVJFXzJELCBHTF9URVhU
VVJFX01JTl9GSUxURVIsIEdMX0xJTkVBUik7CisgICAgICAgIDo6Z2xUZXhQYXJhbWV0ZXJpKEdM
X1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKTsKKyAgICAg
ICAgOjpnbFRleFBhcmFtZXRlcmkoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdM
X0NMQU1QX1RPX0VER0UpOworICAgICAgICA6OmdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwg
MCk7CisKKyAgICAgICAgLy8gQ3JlYXRlIGFuIEZCTy4KKyAgICAgICAgOjpnbEdlbkZyYW1lYnVm
ZmVycygxLCAmbV9mYm8pOworICAgICAgICA6OmdsQmluZEZyYW1lYnVmZmVyKEdMX0ZSQU1FQlVG
RkVSLCBtX2Zibyk7CisKKyAgICAgICAgbV9ib3VuZEZCTyA9IG1fZmJvOworICAgICAgICBpZiAo
IW1fYXR0cnMuYW50aWFsaWFzICYmIChtX2F0dHJzLnN0ZW5jaWwgfHwgbV9hdHRycy5kZXB0aCkp
CisgICAgICAgICAgICA6OmdsR2VuUmVuZGVyYnVmZmVycygxLCAmbV9kZXB0aFN0ZW5jaWxCdWZm
ZXIpOworCisgICAgICAgIC8vIENyZWF0ZSBhIG11bHRpc2FtcGxlIEZCTy4KKyAgICAgICAgaWYg
KG1fYXR0cnMuYW50aWFsaWFzKSB7CisgICAgICAgICAgICA6OmdsR2VuRnJhbWVidWZmZXJzKDEs
ICZtX211bHRpc2FtcGxlRkJPKTsKKyAgICAgICAgICAgIDo6Z2xCaW5kRnJhbWVidWZmZXIoR0xf
RlJBTUVCVUZGRVIsIG1fbXVsdGlzYW1wbGVGQk8pOworICAgICAgICAgICAgbV9ib3VuZEZCTyA9
IG1fbXVsdGlzYW1wbGVGQk87CisgICAgICAgICAgICA6OmdsR2VuUmVuZGVyYnVmZmVycygxLCAm
bV9tdWx0aXNhbXBsZUNvbG9yQnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChtX2F0dHJzLnN0ZW5j
aWwgfHwgbV9hdHRycy5kZXB0aCkKKyAgICAgICAgICAgICAgICA6OmdsR2VuUmVuZGVyYnVmZmVy
cygxLCAmbV9tdWx0aXNhbXBsZURlcHRoU3RlbmNpbEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICAvLyBBTkdMRSBpbml0aWFsaXphdGlvbi4KKyAgICBTaEJ1aWx0SW5SZXNvdXJjZXMg
QU5HTEVSZXNvdXJjZXM7CisgICAgU2hJbml0QnVpbHRJblJlc291cmNlcygmQU5HTEVSZXNvdXJj
ZXMpOworCisgICAgZ2V0SW50ZWdlcnYoR3JhcGhpY3NDb250ZXh0M0Q6Ok1BWF9WRVJURVhfQVRU
UklCUywgJkFOR0xFUmVzb3VyY2VzLk1heFZlcnRleEF0dHJpYnMpOworICAgIGdldEludGVnZXJ2
KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfVkVSVEVYX1VOSUZPUk1fVkVDVE9SUywgJkFOR0xFUmVz
b3VyY2VzLk1heFZlcnRleFVuaWZvcm1WZWN0b3JzKTsKKyAgICBnZXRJbnRlZ2VydihHcmFwaGlj
c0NvbnRleHQzRDo6TUFYX1ZBUllJTkdfVkVDVE9SUywgJkFOR0xFUmVzb3VyY2VzLk1heFZhcnlp
bmdWZWN0b3JzKTsKKyAgICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX1ZFUlRF
WF9URVhUVVJFX0lNQUdFX1VOSVRTLCAmQU5HTEVSZXNvdXJjZXMuTWF4VmVydGV4VGV4dHVyZUlt
YWdlVW5pdHMpOworICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfQ09NQklO
RURfVEVYVFVSRV9JTUFHRV9VTklUUywgJkFOR0xFUmVzb3VyY2VzLk1heENvbWJpbmVkVGV4dHVy
ZUltYWdlVW5pdHMpOworICAgIGdldEludGVnZXJ2KEdyYXBoaWNzQ29udGV4dDNEOjpNQVhfVEVY
VFVSRV9JTUFHRV9VTklUUywgJkFOR0xFUmVzb3VyY2VzLk1heFRleHR1cmVJbWFnZVVuaXRzKTsK
KyAgICBnZXRJbnRlZ2VydihHcmFwaGljc0NvbnRleHQzRDo6TUFYX0ZSQUdNRU5UX1VOSUZPUk1f
VkVDVE9SUywgJkFOR0xFUmVzb3VyY2VzLk1heEZyYWdtZW50VW5pZm9ybVZlY3RvcnMpOworCisg
ICAgLy8gQWx3YXlzIHNldCB0byAxIGZvciBPcGVuR0wgRVMuCisgICAgQU5HTEVSZXNvdXJjZXMu
TWF4RHJhd0J1ZmZlcnMgPSAxOworICAgIG1fY29tcGlsZXIuc2V0UmVzb3VyY2VzKEFOR0xFUmVz
b3VyY2VzKTsKKworI2lmICFVU0UoT1BFTkdMX0VTXzIpCisgICAgOjpnbEVuYWJsZShHTF9WRVJU
RVhfUFJPR1JBTV9QT0lOVF9TSVpFKTsKKyAgICA6OmdsRW5hYmxlKEdMX1BPSU5UX1NQUklURSk7
CisjZW5kaWYKKworICAgIDo6Z2xDbGVhckNvbG9yKDAsIDAsIDAsIDApOworfQorCitHcmFwaGlj
c0NvbnRleHQzRDo6fkdyYXBoaWNzQ29udGV4dDNEKCkKK3sKKyAgICBpZiAobV9wcml2YXRlLT5y
ZW5kZXJTdHlsZSgpID09IFJlbmRlclRvQ3VycmVudEdMQ29udGV4dCkKKyAgICAgICAgcmV0dXJu
OworCisgICAgbWFrZUNvbnRleHRDdXJyZW50KCk7CisgICAgOjpnbERlbGV0ZVRleHR1cmVzKDEs
ICZtX3RleHR1cmUpOworICAgIGlmIChtX2F0dHJzLmFudGlhbGlhcykgeworICAgICAgICA6Omds
RGVsZXRlUmVuZGVyYnVmZmVycygxLCAmbV9tdWx0aXNhbXBsZUNvbG9yQnVmZmVyKTsKKyAgICAg
ICAgaWYgKG1fYXR0cnMuc3RlbmNpbCB8fCBtX2F0dHJzLmRlcHRoKQorICAgICAgICAgICAgOjpn
bERlbGV0ZVJlbmRlcmJ1ZmZlcnMoMSwgJm1fbXVsdGlzYW1wbGVEZXB0aFN0ZW5jaWxCdWZmZXIp
OworICAgICAgICA6OmdsRGVsZXRlRnJhbWVidWZmZXJzKDEsICZtX211bHRpc2FtcGxlRkJPKTsK
KyAgICB9IGVsc2UgeworICAgICAgICBpZiAobV9hdHRycy5zdGVuY2lsIHx8IG1fYXR0cnMuZGVw
dGgpCisgICAgICAgICAgICA6OmdsRGVsZXRlUmVuZGVyYnVmZmVycygxLCAmbV9kZXB0aFN0ZW5j
aWxCdWZmZXIpOworICAgIH0KKyAgICA6OmdsRGVsZXRlRnJhbWVidWZmZXJzKDEsICZtX2Zibyk7
Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0M0Q6OmdldEltYWdlRGF0YShJbWFnZSogaW1hZ2Us
IHVuc2lnbmVkIGludCBmb3JtYXQsIHVuc2lnbmVkIGludCB0eXBlLCBib29sIHByZW11bHRpcGx5
QWxwaGEsIGJvb2wgaWdub3JlR2FtbWFBbmRDb2xvclByb2ZpbGUsIFZlY3Rvcjx1aW50OF90PiYg
b3V0cHV0VmVjdG9yKQoreworICAgIGlmICghaW1hZ2UpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAvLyBXZSBuZWVkIHRoaXMgdG8gc3RheSBpbiBzY29wZSBiZWNhdXNlIHRoZSBuYXRpdmUg
aW1hZ2UgaXMganVzdCBhIHNoYWxsb3cgY29weSBvZiB0aGUgZGF0YS4KKyAgICBJbWFnZVNvdXJj
ZSBkZWNvZGVyKHByZW11bHRpcGx5QWxwaGEgPyBJbWFnZVNvdXJjZTo6QWxwaGFQcmVtdWx0aXBs
aWVkIDogSW1hZ2VTb3VyY2U6OkFscGhhTm90UHJlbXVsdGlwbGllZCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgIGlnbm9yZUdhbW1hQW5kQ29sb3JQcm9maWxlID8gSW1hZ2VTb3VyY2U6OkdhbW1h
QW5kQ29sb3JQcm9maWxlSWdub3JlZCA6IEltYWdlU291cmNlOjpHYW1tYUFuZENvbG9yUHJvZmls
ZUFwcGxpZWQpOworICAgIEFscGhhT3AgYWxwaGFPcCA9IEFscGhhRG9Ob3RoaW5nOworICAgIFJl
ZlB0cjxwc19pbWFnZT4gaW1hZ2VTdXJmYWNlOworICAgIGlmIChpbWFnZS0+ZGF0YSgpKSB7Cisg
ICAgICAgIGRlY29kZXIuc2V0RGF0YShpbWFnZS0+ZGF0YSgpLCB0cnVlKTsKKyAgICAgICAgaWYg
KCFkZWNvZGVyLmZyYW1lQ291bnQoKSB8fCAhZGVjb2Rlci5mcmFtZUlzQ29tcGxldGVBdEluZGV4
KDApKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBPd25QdHI8TmF0aXZlSW1h
Z2VQUz4gbmF0aXZlSW1hZ2UgPSBhZG9wdFB0cihkZWNvZGVyLmNyZWF0ZUZyYW1lQXRJbmRleCgw
KSk7CisgICAgICAgIGltYWdlU3VyZmFjZSA9IG5hdGl2ZUltYWdlLT5pbWFnZSgpOworICAgIH0g
ZWxzZSB7CisgICAgICAgIGltYWdlU3VyZmFjZSA9IGltYWdlLT5uYXRpdmVJbWFnZUZvckN1cnJl
bnRGcmFtZSgpLT5pbWFnZSgpOworICAgICAgICBpZiAoIXByZW11bHRpcGx5QWxwaGEpCisgICAg
ICAgICAgICBhbHBoYU9wID0gQWxwaGFEb1VubXVsdGlwbHk7CisgICAgfQorCisgICAgaWYgKCFp
bWFnZVN1cmZhY2UpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHBzX3NpemUgc2l6ZSA9
IHBzX2ltYWdlX2dldF9zaXplKGltYWdlU3VyZmFjZS5nZXQoKSk7IAorICAgIGludCB3aWR0aCA9
IChpbnQpc2l6ZS53OworICAgIGludCBoZWlnaHQgPSAoaW50KXNpemUuaDsKKyAgICBpZiAoIXdp
ZHRoIHx8ICFoZWlnaHQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChwc19pbWFn
ZV9nZXRfZm9ybWF0KGltYWdlU3VyZmFjZS5nZXQoKSkgIT0gQ09MT1JfRk9STUFUX0FSR0IpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIGludCBzcmNVbnBhY2tBbGlnbm1l
bnQgPSAxOworICAgIHNpemVfdCBieXRlc1BlclJvdyA9IHdpZHRoICogNDsKKyAgICBzaXplX3Qg
Yml0c1BlclBpeGVsID0gMzI7CisgICAgdW5zaWduZWQgaW50IHBhZGRpbmcgPSBieXRlc1BlclJv
dyAtIGJpdHNQZXJQaXhlbCAvIDggKiB3aWR0aDsKKyAgICBpZiAocGFkZGluZykgeworICAgICAg
ICBzcmNVbnBhY2tBbGlnbm1lbnQgPSBwYWRkaW5nICsgMTsKKyAgICAgICAgd2hpbGUgKGJ5dGVz
UGVyUm93ICUgc3JjVW5wYWNrQWxpZ25tZW50KQorICAgICAgICAgICAgKytzcmNVbnBhY2tBbGln
bm1lbnQ7CisgICAgfQorCisgICAgdW5zaWduZWQgaW50IHBhY2tlZFNpemU7CisgICAgLy8gT3V0
cHV0IGRhdGEgaXMgdGlnaHRseSBwYWNrZWQgKGFsaWdubWVudCA9PSAxKS4KKyAgICBpZiAoY29t
cHV0ZUltYWdlU2l6ZUluQnl0ZXMoZm9ybWF0LCB0eXBlLCB3aWR0aCwgaGVpZ2h0LCAxLCAmcGFj
a2VkU2l6ZSwgMCkgIT0gR3JhcGhpY3NDb250ZXh0M0Q6Ok5PX0VSUk9SKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgb3V0cHV0VmVjdG9yLnJlc2l6ZShwYWNrZWRTaXplKTsKKworICAgIHJl
dHVybiBwYWNrUGl4ZWxzKChjb25zdCB1aW50OF90KikoZGVjb2Rlci5kZWNvZGVyKCktPmZyYW1l
QnVmZmVyQXRJbmRleCgwKS0+Z2V0QWRkcigwLDApKSwgCisJCSAgICAgU291cmNlRm9ybWF0QkdS
QTgsd2lkdGgsIGhlaWdodCwgc3JjVW5wYWNrQWxpZ25tZW50LCBmb3JtYXQsIHR5cGUsIGFscGhh
T3AsIAorCQkgICAgIG91dHB1dFZlY3Rvci5kYXRhKCkpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDNEOjpwYWludFRvQ2FudmFzKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGltYWdlUGl4ZWxzLCBp
bnQgaW1hZ2VXaWR0aCwgaW50IGltYWdlSGVpZ2h0LCBpbnQgY2FudmFzV2lkdGgsIGludCBjYW52
YXNIZWlnaHQsIFBsYXRmb3JtQ29udGV4dFBTKiBjb250ZXh0KQoreworICAgIGlmICghaW1hZ2VQ
aXhlbHMgfHwgaW1hZ2VXaWR0aCA8PSAwIHx8IGltYWdlSGVpZ2h0IDw9IDAgfHwgY2FudmFzV2lk
dGggPD0gMCB8fCBjYW52YXNIZWlnaHQgPD0gMCB8fCAhY29udGV4dCkKKyAgICAgICAgcmV0dXJu
OworCisgICAgcHNfY29udGV4dCAqZ2MgPSBjb250ZXh0LT5jb250ZXh0KCk7CisgICAgY29udGV4
dC0+c2F2ZSgpOworCisgICAgcHNfcmVjdCByYyA9IHswLCAwLCBjYW52YXNXaWR0aCwgY2FudmFz
SGVpZ2h0fTsKKyAgICBwc19yZWN0YW5nbGUoZ2MsICZyYyk7CisgICAgcHNfc2V0X2NvbXBvc2l0
ZV9vcGVyYXRvcihnYywgQ09NUE9TSVRFX0NMRUFSKTsKKyAgICBwc19wYWludChnYyk7CisKKyAg
ICBSZWZQdHI8cHNfaW1hZ2U+IGltYWdlU3VyZmFjZSA9IGFkb3B0UmVmKHBzX2ltYWdlX2NyZWF0
ZV93aXRoX2RhdGEoCisgICAgICAgIGNvbnN0X2Nhc3Q8dW5zaWduZWQgY2hhcio+KGltYWdlUGl4
ZWxzKSwgQ09MT1JfRk9STUFUX0FSR0IsIGltYWdlV2lkdGgsIGltYWdlSGVpZ2h0LCBpbWFnZVdp
ZHRoICogNCkpOworCisgICAgLy8gT3BlbkdMIGtlZXBzIHRoZSBwaXhlbHMgc3RvcmVkIGJvdHRv
bSB1cCwgc28gd2UgbmVlZCB0byBmbGlwIHRoZSBpbWFnZSBoZXJlLgorICAgIHBzX3RyYW5zbGF0
ZShnYywgMCwgaW1hZ2VIZWlnaHQpOworICAgIHBzX3NjYWxlKGdjLCAxLCAtMSk7CisKKyAgICBw
c19zZXRfY29tcG9zaXRlX29wZXJhdG9yKGdjLCBDT01QT1NJVEVfU1JDX09WRVIpOworICAgIHBz
X3NldF9zb3VyY2VfaW1hZ2UoZ2MsIGltYWdlU3VyZmFjZS5nZXQoKSk7CisgICAgcHNfcmVjdCBy
YzIgPSB7MCwgMCwgY2FudmFzV2lkdGgsIC1jYW52YXNIZWlnaHR9OworICAgIHBzX3JlY3Rhbmds
ZShnYywgJnJjMik7CisKKyAgICBwc19maWxsKGdjKTsKKyAgICBjb250ZXh0LT5yZXN0b3JlKCk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0M0Q6OnNldENvbnRleHRMb3N0Q2FsbGJhY2soUGFz
c093blB0cjxDb250ZXh0TG9zdENhbGxiYWNrPikKK3sKK30KKwordm9pZCBHcmFwaGljc0NvbnRl
eHQzRDo6c2V0RXJyb3JNZXNzYWdlQ2FsbGJhY2soUGFzc093blB0cjxFcnJvck1lc3NhZ2VDYWxs
YmFjaz4pCit7Cit9CisKK2Jvb2wgR3JhcGhpY3NDb250ZXh0M0Q6Om1ha2VDb250ZXh0Q3VycmVu
dCgpCit7CisgICAgaWYgKCFtX3ByaXZhdGUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBy
ZXR1cm4gbV9wcml2YXRlLT5tYWtlQ29udGV4dEN1cnJlbnQoKTsKK30KK1BsYXRmb3JtR3JhcGhp
Y3NDb250ZXh0M0QgR3JhcGhpY3NDb250ZXh0M0Q6OnBsYXRmb3JtR3JhcGhpY3NDb250ZXh0M0Qo
KQoreworICAgIHJldHVybiBtX3ByaXZhdGUtPnBsYXRmb3JtQ29udGV4dCgpOworfQorCitib29s
IEdyYXBoaWNzQ29udGV4dDNEOjppc0dMRVMyQ29tcGxpYW50KCkgY29uc3QKK3sKKyNpZiBVU0Uo
T1BFTkdMX0VTXzIpCisgICAgcmV0dXJuIHRydWU7CisjZWxzZQorICAgIHJldHVybiBmYWxzZTsK
KyNlbmRpZgorfQorCisjaWYgVVNFKEFDQ0VMRVJBVEVEX0NPTVBPU0lUSU5HKQorUGxhdGZvcm1M
YXllciogR3JhcGhpY3NDb250ZXh0M0Q6OnBsYXRmb3JtTGF5ZXIoKSBjb25zdAoreworICAgIHJl
dHVybiBtX3ByaXZhdGUuZ2V0KCk7Cit9CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQorCisjZW5kaWYgLy8gVVNFKDNEX0dSQVBISUNTKQpkaWZmIC11ck4gU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVQ
Uy5oIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vR3JhcGhpY3NDb250
ZXh0UGxhdGZvcm1Qcml2YXRlUFMuaAotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvcGljYXNzby9HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVQUy5oCTE5NzAtMDEtMDEg
MDg6MDA6MDAuMDAwMDAwMDAwICswODAwCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9waWNhc3NvL0dyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZVBTLmgJMjAxMi0xMS0x
MiAyMDoxNjo0OS4wMDAwMDAwMDAgKzA4MDAKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHly
aWdodCAoYykgMjAxMiBaaGFuZyBKaSBQZW5nIDxvbmVjb29seEBnbWFpbC5jb20+CisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpZm5kZWYgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlUFNfaAorI2RlZmluZSBHcmFw
aGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVQU19oCisKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRl
eHQuaCIKKworI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dFBTLmgiCisjaW5jbHVkZSAiUmVmUHRy
UFMuaCIKKyNpbmNsdWRlIDxwaWNhc3NvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUg
PHd0Zi9NYXRoRXh0cmFzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgR3JhcGhp
Y3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlIHsKK3B1YmxpYzoKKyAgICBHcmFwaGljc0NvbnRleHRQ
bGF0Zm9ybVByaXZhdGUoUGxhdGZvcm1Db250ZXh0UFMqIG5ld1BsYXRmb3JtQ29udGV4dCkKKyAg
ICAgICAgOiBwbGF0Zm9ybUNvbnRleHQobmV3UGxhdGZvcm1Db250ZXh0KQorICAgIHsKKyAgICB9
CisKKyAgICB2aXJ0dWFsIH5HcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGUoKQorICAgIHsK
KyAgICB9CisKKyAgICAvLyBPbiBldmVyeXRoaW5nIGVsc2UsIHdlIGRvIG5vdGhpbmcuCisgICAg
dm9pZCBzYXZlKCkge30KKyAgICB2b2lkIHJlc3RvcmUoKSB7fQorICAgIHZvaWQgZmx1c2goKSB7
fQorICAgIHZvaWQgY2xpcChjb25zdCBGbG9hdFJlY3QmKSB7fQorICAgIHZvaWQgY2xpcChjb25z
dCBQYXRoJikge30KKyAgICB2b2lkIHNjYWxlKGNvbnN0IEZsb2F0U2l6ZSYpIHt9CisgICAgdm9p
ZCByb3RhdGUoZmxvYXQpIHt9CisgICAgdm9pZCB0cmFuc2xhdGUoZmxvYXQsIGZsb2F0KSB7fQor
ICAgIHZvaWQgY29uY2F0Q1RNKGNvbnN0IEFmZmluZVRyYW5zZm9ybSYpIHt9CisgICAgdm9pZCBz
ZXRDVE0oY29uc3QgQWZmaW5lVHJhbnNmb3JtJikge30KKyAgICB2b2lkIHN5bmNDb250ZXh0KHBz
X2NvbnRleHQqKSB7IH0KKworICAgIFBsYXRmb3JtQ29udGV4dFBTKiBwbGF0Zm9ybUNvbnRleHQ7
CisgICAgVmVjdG9yPHBzX2NhbnZhcyo+IGxheWVyczsKK307CisKKy8vIFRoaXMgaXMgYSBzcGVj
aWFsaXplZCBwcml2YXRlIHNlY3Rpb24gZm9yIHRoZSBQaWNhc3NvIEdyYXBoaWNzQ29udGV4dCwg
d2hpY2gga25vd3MgaG93CisvLyB0byBjbGVhbiB1cCB0aGUgaGVhcCBhbGxvY2F0ZWQgUGxhdGZv
cm1Db250ZXh0UFMgdGhhdCB3ZSBtdXN0IHVzZSBmb3IgdGhlIHRvcC1sZXZlbAorLy8gR3JhcGhp
Y3NDb250ZXh0LgorY2xhc3MgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlVG9wbGV2ZWwg
OiBwdWJsaWMgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlIHsKK3B1YmxpYzoKKyAgICBH
cmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVUb3BsZXZlbChQbGF0Zm9ybUNvbnRleHRQUyog
cGxhdGZvcm1Db250ZXh0KQorICAgICAgICA6IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0
ZShwbGF0Zm9ybUNvbnRleHQpCisgICAgeworICAgIH0KKworICAgIHZpcnR1YWwgfkdyYXBoaWNz
Q29udGV4dFBsYXRmb3JtUHJpdmF0ZVRvcGxldmVsKCkKKyAgICB7CisgICAgICAgIGRlbGV0ZSBw
bGF0Zm9ybUNvbnRleHQ7CisgICAgfQorfTsKKworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisK
KyNlbmRpZiAvLyBHcmFwaGljc0NvbnRleHRQbGF0Zm9ybVByaXZhdGVQU19oCmRpZmYgLXVyTiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL0dyYXBoaWNzQ29udGV4dFBT
LmNwcCBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL0dyYXBoaWNzQ29u
dGV4dFBTLmNwcAotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9H
cmFwaGljc0NvbnRleHRQUy5jcHAJMTk3MC0wMS0wMSAwODowMDowMC4wMDAwMDAwMDAgKzA4MDAK
KysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vR3JhcGhpY3NDb250
ZXh0UFMuY3BwCTIwMTItMTEtMTIgMjA6MTY6NDkuMDAwMDAwMDAwICswODAwCkBAIC0wLDAgKzEs
OTA3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIFpoYW5nIEppIFBlbmcgPG9uZWNvb2x4
QGdtYWlsLmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiR3JhcGhp
Y3NDb250ZXh0LmgiCisKKyNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJQ
U1V0aWxpdGllcy5oIgorI2luY2x1ZGUgIkZsb2F0Q29udmVyc2lvbi5oIgorI2luY2x1ZGUgIkZs
b2F0UmVjdC5oIgorI2luY2x1ZGUgIkZvbnQuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHRQ
bGF0Zm9ybVByaXZhdGVQUy5oIgorI2luY2x1ZGUgIkludFJlY3QuaCIKKyNpbmNsdWRlICJOb3RJ
bXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIk93blB0clBTLmgiCisjaW5jbHVkZSAiUGF0aC5oIgor
I2luY2x1ZGUgIlBhdHRlcm4uaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUNvbnRleHRQUy5oIgorI2lu
Y2x1ZGUgIlBsYXRmb3JtUGF0aFBTLmgiCisjaW5jbHVkZSAiUmVmUHRyUFMuaCIKKyNpbmNsdWRl
ICJTaGFkb3dCbHVyLmgiCisjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKKyNpbmNsdWRlIDxw
aWNhc3NvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+
CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gQSBo
ZWxwZXIgd2hpY2ggcXVpY2tseSBmaWxscyBhIHJlY3RhbmdsZSB3aXRoIGEgc2ltcGxlIGNvbG9y
IGZpbGwuCitzdGF0aWMgaW5saW5lIHZvaWQgZmlsbFJlY3RXaXRoQ29sb3IocHNfY29udGV4dCog
Z2MsIGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIGlm
ICghY29sb3IuYWxwaGEoKSkKKyAgICAgICAgcmV0dXJuOworICAgIHNldFNvdXJjZVJHQkFGcm9t
Q29sb3IoZ2MsIGNvbG9yKTsKKyAgICBwc19yZWN0IHIgPSB7cmVjdC54KCksIHJlY3QueSgpLCBy
ZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCl9OworICAgIHBzX3JlY3RhbmdsZShnYywgJnIpOwor
ICAgIHBzX2ZpbGwoZ2MpOworfQorCitzdGF0aWMgdm9pZCBhZGRDb252ZXhQb2x5Z29uVG9Db250
ZXh0KHBzX2NvbnRleHQqIGNvbnRleHQsIHNpemVfdCBudW1Qb2ludHMsIGNvbnN0IEZsb2F0UG9p
bnQqIHBvaW50cykKK3sKKyAgICBwc19wb2ludCBwID0ge3BvaW50c1swXS54KCksIHBvaW50c1sw
XS55KCl9OworICAgIHBzX21vdmVfdG8oY29udGV4dCwgJnApOworICAgIGZvciAoc2l6ZV90IGkg
PSAxOyBpIDwgbnVtUG9pbnRzOyBpKyspeworICAgIAlwc19wb2ludCBwMSA9IHtwb2ludHNbaV0u
eCgpLCBwb2ludHNbaV0ueSgpfTsKKyAgICAgICAgcHNfbGluZV90byhjb250ZXh0LCAmcDEpOwor
ICAgIH0KKyAgICBwc19jbG9zZV9wYXRoKGNvbnRleHQpOworfQorCitzdGF0aWMgaW5saW5lIHZv
aWQgRmlsbEN1cnJlbnRQYXRoKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCkKK3sKKyAgICBwc19j
b250ZXh0KiBnYyA9IGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5jb250ZXh0KCk7CisgICAg
cHNfc2F2ZShnYyk7CisgICAgY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCktPnByZXBhcmVGb3JG
aWxsaW5nKGNvbnRleHQtPnN0YXRlKCksIAorCQkJCVBsYXRmb3JtQ29udGV4dFBTOjpBZGp1c3RQ
YXR0ZXJuRm9yR2xvYmFsQWxwaGEpOworICAgIHBzX2ZpbGwoZ2MpOworICAgIHBzX3Jlc3RvcmUo
Z2MpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgU3Ryb2tlQ3VycmVudFBhdGgoR3JhcGhpY3ND
b250ZXh0KiBjb250ZXh0KQoreworICAgIGNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpLT5wcmVw
YXJlRm9yU3Ryb2tpbmcoY29udGV4dC0+c3RhdGUoKSk7CisgICAgcHNfc3Ryb2tlKGNvbnRleHQt
PnBsYXRmb3JtQ29udGV4dCgpLT5jb250ZXh0KCkpOworfQorCitHcmFwaGljc0NvbnRleHQ6Okdy
YXBoaWNzQ29udGV4dChwc19jb250ZXh0KiBjb250ZXh0KQorICAgIDogbV91cGRhdGluZ0NvbnRy
b2xUaW50cyhmYWxzZSksCisgICAgICBtX3RyYW5zcGFyZW5jeUNvdW50KDApCit7CisgICAgbV9k
YXRhID0gbmV3IEdyYXBoaWNzQ29udGV4dFBsYXRmb3JtUHJpdmF0ZVRvcGxldmVsKG5ldyBQbGF0
Zm9ybUNvbnRleHRQUyhjb250ZXh0KSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpwbGF0
Zm9ybUluaXQoUGxhdGZvcm1Db250ZXh0UFMqIHBsYXRmb3JtQ29udGV4dCkKK3sKKyAgICBtX2Rh
dGEgPSBuZXcgR3JhcGhpY3NDb250ZXh0UGxhdGZvcm1Qcml2YXRlKHBsYXRmb3JtQ29udGV4dCk7
CisgICAgaWYgKHBsYXRmb3JtQ29udGV4dCkKKyAgICAgICAgbV9kYXRhLT5zeW5jQ29udGV4dChw
bGF0Zm9ybUNvbnRleHQtPmNvbnRleHQoKSk7CisgICAgZWxzZQorICAgICAgICBzZXRQYWludGlu
Z0Rpc2FibGVkKHRydWUpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6cGxhdGZvcm1EZXN0
cm95KCkKK3sKKyAgICBkZWxldGUgbV9kYXRhOworfQorCitBZmZpbmVUcmFuc2Zvcm0gR3JhcGhp
Y3NDb250ZXh0OjpnZXRDVE0oSW5jbHVkZURldmljZVNjYWxlKSBjb25zdAoreworICAgIGlmIChw
YWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybiBBZmZpbmVUcmFuc2Zvcm0oKTsKKwor
ICAgIHBzX2NvbnRleHQqIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKS0+Y29udGV4dCgpOwor
ICAgIHBzX21hdHJpeCogbSA9IHBzX21hdHJpeF9jcmVhdGUoKTsKKyAgICBwc19nZXRfbWF0cml4
KGNvbnRleHQsIG0pOworICAgIEFmZmluZVRyYW5zZm9ybSBtdHgobSk7CisgICAgcHNfbWF0cml4
X3VucmVmKG0pOworICAgIHJldHVybiBtdHg7Cit9CisKK1BsYXRmb3JtQ29udGV4dFBTKiBHcmFw
aGljc0NvbnRleHQ6OnBsYXRmb3JtQ29udGV4dCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZGF0
YS0+cGxhdGZvcm1Db250ZXh0OworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2F2ZVBsYXRm
b3JtU3RhdGUoKQoreworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zYXZlKCk7CisgICAgbV9kYXRh
LT5zYXZlKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpyZXN0b3JlUGxhdGZvcm1TdGF0
ZSgpCit7CisgICAgcGxhdGZvcm1Db250ZXh0KCktPnJlc3RvcmUoKTsKKyAgICBtX2RhdGEtPnJl
c3RvcmUoKTsKKworICAgIHBsYXRmb3JtQ29udGV4dCgpLT5zaGFkb3dCbHVyKCkuc2V0U2hhZG93
VmFsdWVzKEZsb2F0U2l6ZShtX3N0YXRlLnNoYWRvd0JsdXIsIG1fc3RhdGUuc2hhZG93Qmx1ciks
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9z
dGF0ZS5zaGFkb3dPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgbV9zdGF0ZS5zaGFkb3dDb2xvciwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXRlLnNoYWRvd0NvbG9yU3BhY2Us
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9z
dGF0ZS5zaGFkb3dzSWdub3JlVHJhbnNmb3Jtcyk7Cit9CisKKy8vIERyYXdzIGEgZmlsbGVkIHJl
Y3RhbmdsZSB3aXRoIGEgc3Ryb2tlZCBib3JkZXIuCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJh
d1JlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBBU1NFUlQoIXJlY3QuaXNFbXB0eSgpKTsKKworICAg
IHBzX2NvbnRleHQqIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKS0+Y29udGV4dCgpOworICAg
IHBzX3NhdmUoY29udGV4dCk7CisgICAgZmlsbFJlY3RXaXRoQ29sb3IoY29udGV4dCwgcmVjdCwg
ZmlsbENvbG9yKCkpOworCisKKyAgICBpZiAoc3Ryb2tlU3R5bGUoKSAhPSBOb1N0cm9rZSkgewor
ICAgICAgICBzZXRTb3VyY2VSR0JBRnJvbUNvbG9yKGNvbnRleHQsIHN0cm9rZUNvbG9yKCkpOwor
CXBzX3JlY3QgcmMgPSB7cmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVp
Z2h0KCl9OworICAgICAgICBwc19yZWN0YW5nbGUoY29udGV4dCwgJnJjKTsKKyAgICAgICAgcHNf
c2V0X2xpbmVfd2lkdGgoY29udGV4dCwgMS4wKTsKKyAgICAgICAgcHNfc3Ryb2tlKGNvbnRleHQp
OworICAgIH0KKyAgICBwc19yZXN0b3JlKGNvbnRleHQpOworfQorCitzdGF0aWMgZG91YmxlIGNh
bGN1bGF0ZVN0cm9rZVBhdHRlcm5PZmZzZXQoaW50IGRpc3RhbmNlLCBpbnQgcGF0dGVybldpZHRo
KQoreworICAgIC8vIEV4YW1wbGU6IDgwIHBpeGVscyB3aXRoIGEgd2lkdGggb2YgMzAgcGl4ZWxz
LiBSZW1haW5kZXIgaXMgMjAuCisgICAgLy8gVGhlIG1heGltdW0gcGl4ZWxzIG9mIGxpbmUgd2Ug
Y291bGQgcGFpbnQgd2lsbCBiZSA1MCBwaXhlbHMuCisgICAgaW50IHJlbWFpbmRlciA9IGRpc3Rh
bmNlICUgcGF0dGVybldpZHRoOworICAgIGludCBudW1TZWdtZW50cyA9IChkaXN0YW5jZSAtIHJl
bWFpbmRlcikgLyBwYXR0ZXJuV2lkdGg7CisKKyAgICAvLyBTcGVjaWFsIGNhc2UgMXB4IGRvdHRl
ZCBib3JkZXJzIGZvciBzcGVlZC4KKyAgICBpZiAocGF0dGVybldpZHRoID09IDEpCisgICAgICAg
IHJldHVybiAxOworCisgICAgYm9vbCBldmVuTnVtYmVyT2ZTZWdtZW50cyA9ICEobnVtU2VnbWVu
dHMgJSAyKTsKKyAgICBpZiAocmVtYWluZGVyKQorICAgICAgICBldmVuTnVtYmVyT2ZTZWdtZW50
cyA9ICFldmVuTnVtYmVyT2ZTZWdtZW50czsKKworICAgIGlmIChldmVuTnVtYmVyT2ZTZWdtZW50
cykgeworICAgICAgICBpZiAocmVtYWluZGVyKQorICAgICAgICAgICAgcmV0dXJuIChwYXR0ZXJu
V2lkdGggLSByZW1haW5kZXIpICsgKHJlbWFpbmRlciAvIDIpOworICAgICAgICByZXR1cm4gcGF0
dGVybldpZHRoIC8gMjsKKyAgICB9CisKKyAgICAvLyBPZGQgbnVtYmVyIG9mIHNlZ21lbnRzLgor
ICAgIGlmIChyZW1haW5kZXIpCisgICAgICAgIHJldHVybiAocGF0dGVybldpZHRoIC0gcmVtYWlu
ZGVyKSAvIDIuZjsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHJhd0xpbmVPbkNv
bnRleHQoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIHBzX2NvbnRleHQqIGNvbnRl
eHQsIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50MSwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQyKQor
eworICAgIFN0cm9rZVN0eWxlIHN0eWxlID0gZ3JhcGhpY3NDb250ZXh0LT5zdHJva2VTdHlsZSgp
OworICAgIGlmIChzdHlsZSA9PSBOb1N0cm9rZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY29u
c3QgQ29sb3ImIHN0cm9rZUNvbG9yID0gZ3JhcGhpY3NDb250ZXh0LT5zdHJva2VDb2xvcigpOwor
ICAgIGludCBzdHJva2VUaGlja25lc3MgPSBmbG9vcmYoZ3JhcGhpY3NDb250ZXh0LT5zdHJva2VU
aGlja25lc3MoKSk7CisgICAgaWYgKGdyYXBoaWNzQ29udGV4dC0+c3Ryb2tlVGhpY2tuZXNzKCkg
PCAxKQorICAgICAgICBzdHJva2VUaGlja25lc3MgPSAxOworCisgICAgaW50IHBhdHRlcm5XaWR0
aCA9IDA7CisgICAgaWYgKHN0eWxlID09IERvdHRlZFN0cm9rZSkKKyAgICAgICAgcGF0dGVybldp
ZHRoID0gc3Ryb2tlVGhpY2tuZXNzOworICAgIGVsc2UgaWYgKHN0eWxlID09IERhc2hlZFN0cm9r
ZSkKKyAgICAgICAgcGF0dGVybldpZHRoID0gMyAqIHN0cm9rZVRoaWNrbmVzczsKKworICAgIGJv
b2wgaXNWZXJ0aWNhbExpbmUgPSBwb2ludDEueCgpID09IHBvaW50Mi54KCk7CisgICAgRmxvYXRQ
b2ludCBwb2ludDFPblBpeGVsQm91bmRhcmllcyA9IHBvaW50MTsKKyAgICBGbG9hdFBvaW50IHBv
aW50Mk9uUGl4ZWxCb3VuZGFyaWVzID0gcG9pbnQyOworICAgIEdyYXBoaWNzQ29udGV4dDo6YWRq
dXN0TGluZVRvUGl4ZWxCb3VuZGFyaWVzKHBvaW50MU9uUGl4ZWxCb3VuZGFyaWVzLCBwb2ludDJP
blBpeGVsQm91bmRhcmllcywgc3Ryb2tlVGhpY2tuZXNzLCBzdHlsZSk7CisKKyAgICBwc19zZXRf
YW50aWFsaWFzKGNvbnRleHQsIEZhbHNlKTsKKyAgICBpZiAocGF0dGVybldpZHRoKSB7CisgICAg
ICAgIC8vIERvIGEgcmVjdCBmaWxsIG9mIG91ciBlbmRwb2ludHMuICBUaGlzIGVuc3VyZXMgd2Ug
YWx3YXlzIGhhdmUgdGhlCisgICAgICAgIC8vIGFwcGVhcmFuY2Ugb2YgYmVpbmcgYSBib3JkZXIu
ICBXZSB0aGVuIGRyYXcgdGhlIGFjdHVhbCBkb3R0ZWQvZGFzaGVkIGxpbmUuCisgICAgICAgIEZs
b2F0UmVjdCBmaXJzdFJlY3QocG9pbnQxT25QaXhlbEJvdW5kYXJpZXMsIEZsb2F0U2l6ZShzdHJv
a2VUaGlja25lc3MsIHN0cm9rZVRoaWNrbmVzcykpOworICAgICAgICBGbG9hdFJlY3Qgc2Vjb25k
UmVjdChwb2ludDJPblBpeGVsQm91bmRhcmllcywgRmxvYXRTaXplKHN0cm9rZVRoaWNrbmVzcywg
c3Ryb2tlVGhpY2tuZXNzKSk7CisgICAgICAgIGlmIChpc1ZlcnRpY2FsTGluZSkgeworICAgICAg
ICAgICAgZmlyc3RSZWN0Lm1vdmUoLXN0cm9rZVRoaWNrbmVzcyAvIDIsIC1zdHJva2VUaGlja25l
c3MpOworICAgICAgICAgICAgc2Vjb25kUmVjdC5tb3ZlKC1zdHJva2VUaGlja25lc3MgLyAyLCAw
KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpcnN0UmVjdC5tb3ZlKC1zdHJva2VU
aGlja25lc3MsIC1zdHJva2VUaGlja25lc3MgLyAyKTsKKyAgICAgICAgICAgIHNlY29uZFJlY3Qu
bW92ZSgwLCAtc3Ryb2tlVGhpY2tuZXNzIC8gMik7CisgICAgICAgIH0KKyAgICAgICAgZmlsbFJl
Y3RXaXRoQ29sb3IoY29udGV4dCwgZmlyc3RSZWN0LCBzdHJva2VDb2xvcik7CisgICAgICAgIGZp
bGxSZWN0V2l0aENvbG9yKGNvbnRleHQsIHNlY29uZFJlY3QsIHN0cm9rZUNvbG9yKTsKKworICAg
ICAgICBpbnQgZGlzdGFuY2UgPSAoaXNWZXJ0aWNhbExpbmUgPyAocG9pbnQyLnkoKSAtIHBvaW50
MS55KCkpIDogKHBvaW50Mi54KCkgLSBwb2ludDEueCgpKSkgLSAyICogc3Ryb2tlVGhpY2tuZXNz
OworICAgICAgICBkb3VibGUgcGF0dGVybk9mZnNldCA9IGNhbGN1bGF0ZVN0cm9rZVBhdHRlcm5P
ZmZzZXQoZGlzdGFuY2UsIHBhdHRlcm5XaWR0aCk7CisgICAgICAgIGRvdWJsZSBwYXR0ZXJuV2lk
dGhBc0RvdWJsZVtdID0ge3BhdHRlcm5XaWR0aCwgcGF0dGVybldpZHRofTsKKyAgICAgICAgcHNf
c2V0X2xpbmVfZGFzaChjb250ZXh0LCBwYXR0ZXJuT2Zmc2V0LCBwYXR0ZXJuV2lkdGhBc0RvdWJs
ZSwgMik7CisgICAgfQorCisgICAgc2V0U291cmNlUkdCQUZyb21Db2xvcihjb250ZXh0LCBzdHJv
a2VDb2xvcik7CisgICAgcHNfc2V0X2xpbmVfd2lkdGgoY29udGV4dCwgc3Ryb2tlVGhpY2tuZXNz
KTsKKyAgICBwc19wb2ludCBwMSA9IHtwb2ludDFPblBpeGVsQm91bmRhcmllcy54KCksIHBvaW50
MU9uUGl4ZWxCb3VuZGFyaWVzLnkoKX07CisgICAgcHNfbW92ZV90byhjb250ZXh0LCAmcDEpOwor
ICAgIHBzX3BvaW50IHAyID0ge3BvaW50Mk9uUGl4ZWxCb3VuZGFyaWVzLngoKSwgcG9pbnQyT25Q
aXhlbEJvdW5kYXJpZXMueSgpfTsKKyAgICBwc19saW5lX3RvKGNvbnRleHQsICZwMik7CisgICAg
cHNfc3Ryb2tlKGNvbnRleHQpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZHJhd0xpbmUo
Y29uc3QgSW50UG9pbnQmIHBvaW50MSwgY29uc3QgSW50UG9pbnQmIHBvaW50MikKK3sKKyAgICBp
ZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBwc19jb250ZXh0
KiBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCktPmNvbnRleHQoKTsKKyAgICBwc19zYXZlKGNv
bnRleHQpOworICAgIGRyYXdMaW5lT25Db250ZXh0KHRoaXMsIGNvbnRleHQsIHBvaW50MSwgcG9p
bnQyKTsKKyAgICBwc19yZXN0b3JlKGNvbnRleHQpOworfQorCisvLyBUaGlzIG1ldGhvZCBpcyBv
bmx5IHVzZWQgdG8gZHJhdyB0aGUgbGl0dGxlIGNpcmNsZXMgdXNlZCBpbiBsaXN0cy4KK3ZvaWQg
R3JhcGhpY3NDb250ZXh0OjpkcmF3RWxsaXBzZShjb25zdCBJbnRSZWN0JiByKQoreworICAgIGlm
IChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHBzX2NvbnRleHQq
IGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKS0+Y29udGV4dCgpOworICAgIHBzX3JlY3QgcmVj
dCA9IHtyLngoKSwgci55KCksIHIud2lkdGgoKSwgci5oZWlnaHQoKX07CisgICAgcHNfZWxsaXBz
ZShjb250ZXh0LCAmcmVjdCk7CisKKyAgICBpZiAoZmlsbENvbG9yKCkuYWxwaGEoKSkgeworICAg
ICAgICBzZXRTb3VyY2VSR0JBRnJvbUNvbG9yKGNvbnRleHQsIGZpbGxDb2xvcigpKTsKKyAgICAg
ICAgcHNfZmlsbChjb250ZXh0KTsKKyAgICB9CisKKyAgICBpZiAoc3Ryb2tlU3R5bGUoKSAhPSBO
b1N0cm9rZSkgeworICAgICAgICBzZXRTb3VyY2VSR0JBRnJvbUNvbG9yKGNvbnRleHQsIHN0cm9r
ZUNvbG9yKCkpOworICAgICAgICBwc19zZXRfbGluZV93aWR0aChjb250ZXh0LCBzdHJva2VUaGlj
a25lc3MoKSk7CisgICAgICAgIHBzX3N0cm9rZShjb250ZXh0KTsKKyAgICB9Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0OjpzdHJva2VBcmMoY29uc3QgSW50UmVjdCYgciwgaW50IHN0YXJ0QW5n
bGUsIGludCBhbmdsZVNwYW4pCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSB8fCBzdHJv
a2VTdHlsZSgpID09IE5vU3Ryb2tlKQorICAgICAgICByZXR1cm47CisKKyAgICBmbG9hdCB3ID0g
ci53aWR0aCgpOworICAgIGZsb2F0IGggPSByLmhlaWdodCgpOworICAgIGZsb2F0IHNjYWxlRmFj
dG9yID0gaCAvIHc7CisgICAgZmxvYXQgcmV2ZXJzZVNjYWxlRmFjdG9yID0gdyAvIGg7CisKKyAg
ICBmbG9hdCBoUmFkaXVzID0gdyAvIDI7CisgICAgZmxvYXQgdlJhZGl1cyA9IGggLyAyOworCisg
ICAgcHNfY29udGV4dCogZ2MgPSBwbGF0Zm9ybUNvbnRleHQoKS0+Y29udGV4dCgpOworICAgIHBz
X3NhdmUoZ2MpOworCisgICAgaWYgKHcgIT0gaCkKKyAgICAgICAgcHNfc2NhbGUoZ2MsIDEuLCBz
Y2FsZUZhY3Rvcik7CisKKyAgICBwc19yZWN0IHJlY3QgPSB7ci54KCksIHIueSgpLCByLndpZHRo
KCksIHIuaGVpZ2h0KCl9OworICAgIHBzX3RhbmdlbnRfYXJjKGdjLCAmcmVjdCwgLWRlZzJyYWQo
KGRvdWJsZSlzdGFydEFuZ2xlKSwgLWRlZzJyYWQoKGRvdWJsZSlhbmdsZVNwYW4pKTsKKworICAg
IGlmICh3ICE9IGgpCisgICAgICAgIHBzX3NjYWxlKGdjLCAxLiwgcmV2ZXJzZVNjYWxlRmFjdG9y
KTsKKworICAgIGludCBwYXR0ZXJuV2lkdGggPSAwOworICAgIHN3aXRjaCAoc3Ryb2tlU3R5bGUo
KSkgeworICAgIGNhc2UgRG90dGVkU3Ryb2tlOgorICAgICAgICBwYXR0ZXJuV2lkdGggPSBmbG9v
cmYoc3Ryb2tlVGhpY2tuZXNzKCkgLyAyLmYpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIERh
c2hlZFN0cm9rZToKKyAgICAgICAgcGF0dGVybldpZHRoID0gMyAqIGZsb29yZihzdHJva2VUaGlj
a25lc3MoKSAvIDIuZik7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGJy
ZWFrOworICAgIH0KKworICAgIHNldFNvdXJjZVJHQkFGcm9tQ29sb3IoZ2MsIHN0cm9rZUNvbG9y
KCkpOworCisgICAgaWYgKHBhdHRlcm5XaWR0aCkgeworICAgICAgICBmbG9hdCBkaXN0YW5jZSA9
IDA7CisgICAgICAgIGlmIChoUmFkaXVzID09IHZSYWRpdXMpCisgICAgICAgICAgICBkaXN0YW5j
ZSA9IChwaUZsb2F0ICogaFJhZGl1cykgLyAyLmY7CisgICAgICAgIGVsc2UgLy8gV2UgYXJlIGVs
bGlwdGljYWwgYW5kIHdpbGwgaGF2ZSB0byBlc3RpbWF0ZSB0aGUgZGlzdGFuY2UKKyAgICAgICAg
ICAgIGRpc3RhbmNlID0gKHBpRmxvYXQgKiBzcXJ0ZigoaFJhZGl1cyAqIGhSYWRpdXMgKyB2UmFk
aXVzICogdlJhZGl1cykgLyAyLmYpKSAvIDIuZjsKKyAgICAgICAgZG91YmxlIHBhdHRlcm5PZmZz
ZXQgPSBjYWxjdWxhdGVTdHJva2VQYXR0ZXJuT2Zmc2V0KGZsb29yZihkaXN0YW5jZSksIHBhdHRl
cm5XaWR0aCk7CisgICAgICAgIGRvdWJsZSBwYXR0ZXJuV2lkdGhBc0RvdWJsZVtdID0ge3BhdHRl
cm5XaWR0aCAsIHBhdHRlcm5XaWR0aH07CisgICAgICAgIHBzX3NldF9saW5lX2Rhc2goZ2MsIHBh
dHRlcm5PZmZzZXQsIHBhdHRlcm5XaWR0aEFzRG91YmxlLCAyKTsKKyAgICB9CisKKyAgICBwc19z
dHJva2UoZ2MpOworICAgIHBzX3Jlc3RvcmUoZ2MpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDo6ZHJhd0NvbnZleFBvbHlnb24oc2l6ZV90IG5wb2ludHMsIGNvbnN0IEZsb2F0UG9pbnQqIHBv
aW50cywgYm9vbCBzaG91bGRBbnRpYWxpYXMpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQo
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG5wb2ludHMgPD0gMSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgcHNfY29udGV4dCogY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpLT5jb250
ZXh0KCk7CisKKyAgICBwc19zYXZlKGNvbnRleHQpOworICAgIHBzX3NldF9hbnRpYWxpYXMoY29u
dGV4dCwgc2hvdWxkQW50aWFsaWFzID8gVHJ1ZSA6IEZhbHNlKTsKKyAgICBhZGRDb252ZXhQb2x5
Z29uVG9Db250ZXh0KGNvbnRleHQsIG5wb2ludHMsIHBvaW50cyk7CisKKyAgICBpZiAoZmlsbENv
bG9yKCkuYWxwaGEoKSkgeworICAgICAgICBzZXRTb3VyY2VSR0JBRnJvbUNvbG9yKGNvbnRleHQs
IGZpbGxDb2xvcigpKTsKKyAgICAgICAgcHNfc2V0X2ZpbGxfcnVsZShjb250ZXh0LCBGSUxMX1JV
TEVfRVZFTl9PREQpOworICAgICAgICBwc19maWxsKGNvbnRleHQpOworICAgIH0KKworICAgIGlm
IChzdHJva2VTdHlsZSgpICE9IE5vU3Ryb2tlKSB7CisgICAgICAgIHNldFNvdXJjZVJHQkFGcm9t
Q29sb3IoY29udGV4dCwgc3Ryb2tlQ29sb3IoKSk7CisgICAgICAgIHBzX3NldF9saW5lX3dpZHRo
KGNvbnRleHQsIHN0cm9rZVRoaWNrbmVzcygpKTsKKyAgICAgICAgcHNfc3Ryb2tlKGNvbnRleHQp
OworICAgIH0KKworICAgIHBzX3Jlc3RvcmUoY29udGV4dCk7Cit9CisKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0OjpjbGlwQ29udmV4UG9seWdvbihzaXplX3QgbnVtUG9pbnRzLCBjb25zdCBGbG9hdFBv
aW50KiBwb2ludHMsIGJvb2wgYW50aWFsaWFzZWQpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJs
ZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG51bVBvaW50cyA8PSAxKQorICAgICAg
ICByZXR1cm47CisKKyAgICBwc19jb250ZXh0KiBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCkt
PmNvbnRleHQoKTsKKworICAgIHBzX25ld19wYXRoKGNvbnRleHQpOworCisgICAgcHNfc2V0X2Fu
dGlhbGlhcyhjb250ZXh0LCBhbnRpYWxpYXNlZCA/IFRydWUgOiBGYWxzZSk7CisgICAgcHNfc2V0
X2ZpbGxfcnVsZShjb250ZXh0LCBGSUxMX1JVTEVfV0lORElORyk7CisgICAgYWRkQ29udmV4UG9s
eWdvblRvQ29udGV4dChjb250ZXh0LCBudW1Qb2ludHMsIHBvaW50cyk7CisgICAgcHNfY2xpcChj
b250ZXh0KTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxQYXRoKGNvbnN0IFBhdGgm
IHBhdGgpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSB8fCBwYXRoLmlzRW1wdHkoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgcHNfY29udGV4dCogY29udGV4dCA9IHBsYXRmb3JtQ29u
dGV4dCgpLT5jb250ZXh0KCk7CisgICAgc2V0UGF0aE9uQ29udGV4dChjb250ZXh0LCBwYXRoLnBs
YXRmb3JtUGF0aCgpLT5wYXRoKCkpOworICAgIEZpbGxDdXJyZW50UGF0aCh0aGlzKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OnN0cm9rZVBhdGgoY29uc3QgUGF0aCYgcGF0aCkKK3sKKyAg
ICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpIHx8IHBhdGguaXNFbXB0eSgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBwc19jb250ZXh0KiBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCktPmNvbnRl
eHQoKTsKKyAgICBzZXRQYXRoT25Db250ZXh0KGNvbnRleHQsIHBhdGgucGxhdGZvcm1QYXRoKCkt
PnBhdGgoKSk7CisgICAgU3Ryb2tlQ3VycmVudFBhdGgodGhpcyk7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0OjpmaWxsUmVjdChjb25zdCBGbG9hdFJlY3QmIHJlY3QpCit7CisgICAgaWYgKHBh
aW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcHNfY29udGV4dCogY29u
dGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpLT5jb250ZXh0KCk7CisgICAgcHNfcmVjdCByID0ge3Jl
Y3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpfTsKKyAgICBwc19y
ZWN0YW5nbGUoY29udGV4dCwgJnIpOworICAgIEZpbGxDdXJyZW50UGF0aCh0aGlzKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcmVjdCwgY29u
c3QgQ29sb3ImIGNvbG9yLCBDb2xvclNwYWNlKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVk
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGZpbGxSZWN0V2l0aENvbG9yKHBsYXRmb3JtQ29u
dGV4dCgpLT5jb250ZXh0KCksIHJlY3QsIGNvbG9yKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRl
eHQ6OmNsaXAoY29uc3QgRmxvYXRSZWN0JiByKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVk
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIHBzX3JlY3QgcnQgPSB7ci54KCksIHIueSgpLCBy
LndpZHRoKCksIHIuaGVpZ2h0KCl9OworICAgIHBzX2NsaXBfcmVjdChwbGF0Zm9ybUNvbnRleHQo
KS0+Y29udGV4dCgpLCAmcnQpOworICAgIG1fZGF0YS0+Y2xpcChyKTsKK30KKwordm9pZCBHcmFw
aGljc0NvbnRleHQ6OmNsaXBQYXRoKGNvbnN0IFBhdGgmIHBhdGgsIFdpbmRSdWxlIGNsaXBSdWxl
KQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IHBzX2NvbnRleHQqIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKS0+Y29udGV4dCgpOworICAg
IHBzX2NsaXBfcGF0aChjb250ZXh0LCBwYXRoLnBsYXRmb3JtUGF0aCgpLT5wYXRoKCksIAorCQlj
bGlwUnVsZSA9PSBSVUxFX0VWRU5PREQgPyBGSUxMX1JVTEVfRVZFTl9PREQgOiBGSUxMX1JVTEVf
V0lORElORyk7CisgICAgbV9kYXRhLT5jbGlwKHBhdGgpOworfQorCitJbnRSZWN0IEdyYXBoaWNz
Q29udGV4dDo6Y2xpcEJvdW5kcygpIGNvbnN0Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAg
ICByZXR1cm4gSW50UmVjdCgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWRqdXN0Rm9jdXNS
aW5nQ29sb3IoQ29sb3ImIGNvbG9yKQoreworICAgIC8vIEZvcmNlIHRoZSBhbHBoYSB0byA1MCUu
ICBUaGlzIG1hdGNoZXMgd2hhdCB0aGUgTWFjIGRvZXMgd2l0aCBvdXRsaW5lIHJpbmdzLgorICAg
IGNvbG9yLnNldFJHQihtYWtlUkdCQShjb2xvci5yZWQoKSwgY29sb3IuZ3JlZW4oKSwgY29sb3Iu
Ymx1ZSgpLCAxMjcpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkanVzdEZvY3VzUmluZ0xp
bmVXaWR0aChpbnQmIHdpZHRoKQoreworICAgIFVOVVNFRF9QQVJBTSh3aWR0aCk7Cit9CisKK3N0
YXRpYyBpbmxpbmUgU3Ryb2tlU3R5bGUgZm9jdXNSaW5nU3Ryb2tlU3R5bGUoKQoreworICAgIHJl
dHVybiBTb2xpZFN0cm9rZTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdGb2N1c1Jp
bmcoY29uc3QgUGF0aCYgcGF0aCwgaW50IHdpZHRoLCBpbnQgLyogb2Zmc2V0ICovLCBjb25zdCBD
b2xvciYgY29sb3IpCit7CisgICAgLy8gRklYTUU6IFdlIHNob3VsZCBkcmF3IHBhdGhzIHRoYXQg
ZGVzY3JpYmUgYSByZWN0YW5nbGUgd2l0aCByb3VuZGVkIGNvcm5lcnMKKyAgICAvLyBzbyBhcyB0
byBiZSBjb25zaXN0ZW50IHdpdGggaG93IHdlIGRyYXcgcmVjdGFuZ3VsYXIgZm9jdXMgcmluZ3Mu
CisgICAgQ29sb3IgcmluZ0NvbG9yID0gY29sb3I7CisgICAgYWRqdXN0Rm9jdXNSaW5nQ29sb3Io
cmluZ0NvbG9yKTsKKyAgICBhZGp1c3RGb2N1c1JpbmdMaW5lV2lkdGgod2lkdGgpOworCisgICAg
cHNfY29udGV4dCogY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpLT5jb250ZXh0KCk7CisgICAg
cHNfc2F2ZShjb250ZXh0KTsKKyAgICBhcHBlbmRXZWJDb3JlUGF0aFRvQ29udGV4dChjb250ZXh0
LCBwYXRoKTsKKyAgICBzZXRTb3VyY2VSR0JBRnJvbUNvbG9yKGNvbnRleHQsIHJpbmdDb2xvcik7
CisgICAgcHNfc2V0X2xpbmVfd2lkdGgoY29udGV4dCwgd2lkdGgpOworICAgIHNldFBsYXRmb3Jt
U3Ryb2tlU3R5bGUoZm9jdXNSaW5nU3Ryb2tlU3R5bGUoKSk7CisgICAgcHNfc3Ryb2tlKGNvbnRl
eHQpOworICAgIHBzX3Jlc3RvcmUoY29udGV4dCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0
OjpkcmF3Rm9jdXNSaW5nKGNvbnN0IFZlY3RvcjxJbnRSZWN0PiYgcmVjdHMsIGludCB3aWR0aCwg
aW50ICBvZmZzZXQsIGNvbnN0IENvbG9yJiBjb2xvcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNh
YmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBwc19jb250ZXh0KiBnYyA9IHBsYXRmb3Jt
Q29udGV4dCgpLT5jb250ZXh0KCk7CisgICAgCisgICAgdW5zaWduZWQgcmVjdENvdW50ID0gcmVj
dHMuc2l6ZSgpOworICAgIEludFJlY3QgZmluYWxGb2N1c1JlY3Q7CisgICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IHJlY3RDb3VudDsgaSsrKSB7CisgICAgICAgIEludFJlY3QgZm9jdXNSZWN0
ID0gcmVjdHNbaV07CisgICAgICAgIGZvY3VzUmVjdC5pbmZsYXRlKG9mZnNldCk7CisgICAgICAg
IGZpbmFsRm9jdXNSZWN0LnVuaXRlKGZvY3VzUmVjdCk7CisgICAgfQorCisgICAgcHNfcmVjdCBy
YyA9IHtmaW5hbEZvY3VzUmVjdC54KCktMSwgZmluYWxGb2N1c1JlY3QueSgpLTEsIAorCQkJCQlm
aW5hbEZvY3VzUmVjdC53aWR0aCgpKzEsIGZpbmFsRm9jdXNSZWN0LmhlaWdodCgpKzF9OworICAg
IHBzX3NhdmUoZ2MpOworICAgIHNldFNvdXJjZVJHQkFGcm9tQ29sb3IoZ2MsIENvbG9yKENvbG9y
OjpibGFjaykpOworICAgIGRvdWJsZSBkW10gPSB7MSwgMn07CisgICAgcHNfc2V0X2xpbmVfZGFz
aChnYywgMCwgZCwgMik7CisgICAgcHNfcmVjdGFuZ2xlKGdjLCAmcmMpOworICAgIHBzX3N0cm9r
ZShnYyk7CisgICAgcHNfcmVzdG9yZShnYyk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojpk
cmF3TGluZUZvclRleHQoY29uc3QgRmxvYXRQb2ludCYgb3JpZ2luLCBmbG9hdCB3aWR0aCwgYm9v
bCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBwc19jb250ZXh0KiBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCktPmNvbnRleHQoKTsKKyAg
ICBwc19zYXZlKGNvbnRleHQpOworCisgICAgLy8gVGhpcyBidW1waW5nIG9mIDwxIHN0cm9rZSB0
aGlja25lc3NlcyBtYXRjaGVzIHRoZSBvbmUgaW4gZHJhd0xpbmVPbkNhaXJvQ29udGV4dC4KKyAg
ICBGbG9hdFBvaW50IGVuZFBvaW50KG9yaWdpbiArIEludFNpemUod2lkdGgsIDApKTsKKyAgICBG
bG9hdFJlY3QgbGluZUV4dGVudHMob3JpZ2luLCBGbG9hdFNpemUod2lkdGgsIHN0cm9rZVRoaWNr
bmVzcygpKSk7CisKKyAgICBkcmF3TGluZU9uQ29udGV4dCh0aGlzLCBjb250ZXh0LCBvcmlnaW4s
IGVuZFBvaW50KTsKKyAgICBwc19yZXN0b3JlKGNvbnRleHQpOworfQorCit2b2lkIEdyYXBoaWNz
Q29udGV4dDo6ZHJhd0xpbmVGb3JEb2N1bWVudE1hcmtlcihjb25zdCBGbG9hdFBvaW50JiBvcmln
aW4sIGZsb2F0IHdpZHRoLCBEb2N1bWVudE1hcmtlckxpbmVTdHlsZSBzdHlsZSkKK3sKKyAgICBu
b3RJbXBsZW1lbnRlZCgpOworfQorCitGbG9hdFJlY3QgR3JhcGhpY3NDb250ZXh0Ojpyb3VuZFRv
RGV2aWNlUGl4ZWxzKGNvbnN0IEZsb2F0UmVjdCYgZnJlY3QsIFJvdW5kaW5nTW9kZSkKK3sKKyAg
ICByZXR1cm4gZnJlY3Q7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0Ojp0cmFuc2xhdGUoZmxv
YXQgeCwgZmxvYXQgeSkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBwc190cmFuc2xhdGUocGxhdGZvcm1Db250ZXh0KCktPmNvbnRleHQoKSwg
eCwgeSk7CisgICAgbV9kYXRhLT50cmFuc2xhdGUoeCwgeSk7Cit9CisKK3N0YXRpYyBpbmxpbmUg
cHNfY29sb3IgbWFrZV9jb2xvcihjb25zdCBDb2xvciYgYykKK3sKKyAgICBwc19jb2xvciBjb2xv
cjsKKyAgICBjb2xvci5yID0gKGRvdWJsZSljLnJlZCgpLzI1NTsKKyAgICBjb2xvci5nID0gKGRv
dWJsZSljLmdyZWVuKCkvMjU1OworICAgIGNvbG9yLmIgPSAoZG91YmxlKWMuYmx1ZSgpLzI1NTsK
KyAgICBjb2xvci5hID0gKGRvdWJsZSljLmFscGhhKCkvMjU1OworICAgIHJldHVybiBjb2xvcjsK
K30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtRmlsbENvbG9yKGNvbnN0IENv
bG9yJiBjb2xvciwgQ29sb3JTcGFjZSkKK3sKKyAgICBwc19jb2xvciBmYyA9IG1ha2VfY29sb3Io
Y29sb3IpOworICAgIHBzX3NldF9zb3VyY2VfY29sb3IocGxhdGZvcm1Db250ZXh0KCktPmNvbnRl
eHQoKSwgJmZjKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OnNldFBsYXRmb3JtU3Ryb2tl
Q29sb3IoY29uc3QgQ29sb3ImIGNvbG9yLCBDb2xvclNwYWNlKQoreworICAgIHBzX2NvbG9yIHNj
ID0gbWFrZV9jb2xvcihjb2xvcik7CisgICAgcHNfc2V0X3N0cm9rZV9jb2xvcihwbGF0Zm9ybUNv
bnRleHQoKS0+Y29udGV4dCgpLCAmc2MpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0
UGxhdGZvcm1TdHJva2VUaGlja25lc3MoZmxvYXQgc3Ryb2tlVGhpY2tuZXNzKQoreworICAgIGlm
IChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHBzX3NldF9saW5l
X3dpZHRoKHBsYXRmb3JtQ29udGV4dCgpLT5jb250ZXh0KCksIHN0cm9rZVRoaWNrbmVzcyk7Cit9
CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVN0cm9rZVN0eWxlKFN0cm9rZVN0
eWxlIHN0cm9rZVN0eWxlKQoreworICAgIHN0YXRpYyBkb3VibGUgZGFzaFBhdHRlcm5bXSA9IHs1
LjAsIDUuMH07CisgICAgc3RhdGljIGRvdWJsZSBkb3RQYXR0ZXJuW10gPSB7MS4wLCAxLjB9Owor
CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc3dp
dGNoIChzdHJva2VTdHlsZSkgeworICAgIGNhc2UgTm9TdHJva2U6CisgICAgICAgIGJyZWFrOwor
ICAgIGNhc2UgU29saWRTdHJva2U6CisjaWYgRU5BQkxFKENTUzNfVEVYVCkKKyAgICBjYXNlIERv
dWJsZVN0cm9rZToKKyAgICBjYXNlIFdhdnlTdHJva2U6CisjZW5kaWYgLy8gQ1NTM19URVhUCisg
ICAgICAgIHBzX3Jlc2V0X2xpbmVfZGFzaChwbGF0Zm9ybUNvbnRleHQoKS0+Y29udGV4dCgpKTsK
KyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEb3R0ZWRTdHJva2U6CisgICAgICAgIHBzX3NldF9s
aW5lX2Rhc2gocGxhdGZvcm1Db250ZXh0KCktPmNvbnRleHQoKSwgMCwgZG90UGF0dGVybiwgMik7
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRGFzaGVkU3Ryb2tlOgorICAgICAgICBwc19zZXRf
bGluZV9kYXNoKHBsYXRmb3JtQ29udGV4dCgpLT5jb250ZXh0KCksIDAsIGRhc2hQYXR0ZXJuLCAy
KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0
VVJMRm9yUmVjdChjb25zdCBLVVJMJiwgY29uc3QgSW50UmVjdCYpCit7CisgICAgbm90SW1wbGVt
ZW50ZWQoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNvbmNhdENUTShjb25zdCBBZmZp
bmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBwc19jb250ZXh0KiBjb250ZXh0ID0gcGxhdGZvcm1Db250
ZXh0KCktPmNvbnRleHQoKTsKKyAgICBwc19tYXRyaXgqIG10eCA9IHRyYW5zZm9ybS5tYWtlTWF0
cml4KCk7CisgICAgcHNfdHJhbnNmb3JtKGNvbnRleHQsIG10eCk7CisgICAgcHNfbWF0cml4X3Vu
cmVmKG10eCk7CisgICAgbV9kYXRhLT5jb25jYXRDVE0odHJhbnNmb3JtKTsKK30KKwordm9pZCBH
cmFwaGljc0NvbnRleHQ6OnNldENUTShjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHRyYW5zZm9ybSkK
K3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBw
c19jb250ZXh0KiBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCktPmNvbnRleHQoKTsKKyAgICBw
c19tYXRyaXgqIG10eCA9IHRyYW5zZm9ybS5tYWtlTWF0cml4KCk7CisgICAgcHNfc2V0X21hdHJp
eChjb250ZXh0LCBtdHgpOworICAgIHBzX21hdHJpeF91bnJlZihtdHgpOworICAgIG1fZGF0YS0+
c2V0Q1RNKHRyYW5zZm9ybSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjphZGRJbm5lclJv
dW5kZWRSZWN0Q2xpcChjb25zdCBJbnRSZWN0JiByZWN0LCBpbnQgdGhpY2tuZXNzKQoreworICAg
IGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHBzX2NvbnRl
eHQqIGNvbnRleHQgPSBwbGF0Zm9ybUNvbnRleHQoKS0+Y29udGV4dCgpOworICAgIGNsaXAocmVj
dCk7CisKKyAgICBQYXRoIHA7CisgICAgRmxvYXRSZWN0IHIocmVjdCk7CisgICAgLy8gQWRkIG91
dGVyIGVsbGlwc2UKKyAgICBwLmFkZEVsbGlwc2Uocik7CisgICAgLy8gQWRkIGlubmVyIGVsbGlw
c2UKKyAgICByLmluZmxhdGUoLXRoaWNrbmVzcyk7CisgICAgcC5hZGRFbGxpcHNlKHIpOworICAg
IGFwcGVuZFdlYkNvcmVQYXRoVG9Db250ZXh0KGNvbnRleHQsIHApOworCisgICAgcHNfc2V0X2Zp
bGxfcnVsZShjb250ZXh0LCBGSUxMX1JVTEVfRVZFTl9PREQpOworICAgIHBzX2NsaXAoY29udGV4
dCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpzZXRQbGF0Zm9ybVNoYWRvdyhGbG9hdFNp
emUgY29uc3QmIHNpemUsIGZsb2F0IGJsdXIsIENvbG9yIGNvbnN0JiBjb2xvciwgQ29sb3JTcGFj
ZSkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBpZiAobV9zdGF0ZS5zaGFkb3dzSWdub3JlVHJhbnNmb3JtcykgeworICAgICAgICAvLyBNZWFu
aW5nIHRoYXQgdGhpcyBncmFwaGljcyBjb250ZXh0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIENhbnZh
c1JlbmRlcmluZ0NvbnRleHQKKyAgICAgICAgLy8gV2UgZmxpcCB0aGUgaGVpZ2h0IHNpbmNlIENH
IGFuZCBIVE1MNSBDYW52YXMgaGF2ZSBvcHBvc2l0ZSBZIGF4aXMKKyAgICAgICAgbV9zdGF0ZS5z
aGFkb3dPZmZzZXQgPSBGbG9hdFNpemUoc2l6ZS53aWR0aCgpLCAtc2l6ZS5oZWlnaHQoKSk7Cisg
ICAgfQorCisgICAgcGxhdGZvcm1Db250ZXh0KCktPnNoYWRvd0JsdXIoKS5zZXRTaGFkb3dWYWx1
ZXMoRmxvYXRTaXplKG1fc3RhdGUuc2hhZG93Qmx1ciwgbV9zdGF0ZS5zaGFkb3dCbHVyKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXRl
LnNoYWRvd09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBtX3N0YXRlLnNoYWRvd0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdGUuc2hhZG93Q29sb3JTcGFjZSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXRl
LnNoYWRvd3NJZ25vcmVUcmFuc2Zvcm1zKTsKKyAgICBwc19jb2xvciBzYyA9IG1ha2VfY29sb3Io
Y29sb3IpOworICAgIHBzX3NldF9zaGFkb3cocGxhdGZvcm1Db250ZXh0KCktPmNvbnRleHQoKSwg
c2l6ZS53aWR0aCgpLCBzaXplLmhlaWdodCgpLCAoZG91YmxlKWJsdXIvNDApOworICAgIHBzX3Nl
dF9zaGFkb3dfY29sb3IocGxhdGZvcm1Db250ZXh0KCktPmNvbnRleHQoKSwgJnNjKTsKK30KKwor
dm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsZWFyUGxhdGZvcm1TaGFkb3coKQoreworICAgIGlmIChw
YWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHBzX3Jlc2V0X3NoYWRv
dyhwbGF0Zm9ybUNvbnRleHQoKS0+Y29udGV4dCgpKTsKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+
c2hhZG93Qmx1cigpLmNsZWFyKCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpiZWdpblBs
YXRmb3JtVHJhbnNwYXJlbmN5TGF5ZXIoZmxvYXQgb3BhY2l0eSkKK3sKKyAgICBpZiAocGFpbnRp
bmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBub3RJbXBsZW1lbnRlZCgpOwor
fQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZW5kUGxhdGZvcm1UcmFuc3BhcmVuY3lMYXllcigp
Cit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
bm90SW1wbGVtZW50ZWQoKTsKK30KKworYm9vbCBHcmFwaGljc0NvbnRleHQ6OnN1cHBvcnRzVHJh
bnNwYXJlbmN5TGF5ZXJzKCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBm
YWxzZTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsZWFyUmVjdChjb25zdCBGbG9hdFJl
Y3QmIHJlY3QpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgcHNfY29udGV4dCogY29udGV4dCA9IHBsYXRmb3JtQ29udGV4dCgpLT5jb250ZXh0
KCk7CisKKyAgICBwc19zYXZlKGNvbnRleHQpOworICAgIHBzX3JlY3QgciA9IHtyZWN0LngoKSwg
cmVjdC55KCksIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKX07CisgICAgcHNfcmVjdGFuZ2xl
KGNvbnRleHQsICZyKTsKKyAgICBwc19zZXRfY29tcG9zaXRlX29wZXJhdG9yKGNvbnRleHQsIENP
TVBPU0lURV9DTEVBUik7CisgICAgcHNfZmlsbChjb250ZXh0KTsKKyAgICBwc19yZXN0b3JlKGNv
bnRleHQpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c3Ryb2tlUmVjdChjb25zdCBGbG9h
dFJlY3QmIHJlY3QsIGZsb2F0IHdpZHRoKQoreworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIHBzX2NvbnRleHQqIGNvbnRleHQgPSBwbGF0Zm9ybUNv
bnRleHQoKS0+Y29udGV4dCgpOworICAgIHBzX3NhdmUoY29udGV4dCk7CisgICAgcHNfcmVjdCBy
ID0ge3JlY3QueCgpLCByZWN0LnkoKSwgcmVjdC53aWR0aCgpLCByZWN0LmhlaWdodCgpfTsKKyAg
ICBwc19yZWN0YW5nbGUoY29udGV4dCwgJnIpOworICAgIHBzX3NldF9saW5lX3dpZHRoKGNvbnRl
eHQsIHdpZHRoKTsKKyAgICBTdHJva2VDdXJyZW50UGF0aCh0aGlzKTsKKyAgICBwc19yZXN0b3Jl
KGNvbnRleHQpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0TGluZUNhcChMaW5lQ2Fw
IGxpbmVDYXApCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgcHNfbGluZV9jYXAgQ2FwID0gTElORV9DQVBfQlVUVDsKKyAgICBzd2l0Y2ggKGxp
bmVDYXApIHsKKyAgICBjYXNlIEJ1dHRDYXA6CisgICAgICAgIENhcCA9IExJTkVfQ0FQX0JVVFQ7
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUm91bmRDYXA6CisgICAgICAgIENhcCA9IExJTkVf
Q0FQX1JPVU5EOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNxdWFyZUNhcDoKKyAgICAgICAg
Q2FwID0gTElORV9DQVBfU1FVQVJFOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcHNfc2V0
X2xpbmVfY2FwKHBsYXRmb3JtQ29udGV4dCgpLT5jb250ZXh0KCksIENhcCk7Cit9CisKK3ZvaWQg
R3JhcGhpY3NDb250ZXh0OjpzZXRMaW5lRGFzaChjb25zdCBEYXNoQXJyYXkmIGRhc2hlcywgZmxv
YXQgZGFzaE9mZnNldCkKK3sKKyAgICBzaXplX3QgbGVuID0gZGFzaGVzLnNpemUoKTsKKyAgICBk
b3VibGUqIGRhdGFzID0gbmV3IGRvdWJsZVtsZW5dOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
KGludClsZW47IGkrKykKKwlkYXRhc1tpXSA9IGRhc2hlcy5kYXRhKClbaV07CisKKyAgICBwc19z
ZXRfbGluZV9kYXNoKHBsYXRmb3JtQ29udGV4dCgpLT5jb250ZXh0KCksIGRhc2hPZmZzZXQsIGRh
dGFzLCBkYXNoZXMuc2l6ZSgpKTsKKyAgICBkZWxldGUgW10gZGF0YXM7Cit9CisKK3ZvaWQgR3Jh
cGhpY3NDb250ZXh0OjpzZXRMaW5lSm9pbihMaW5lSm9pbiBsaW5lSm9pbikKK3sKKyAgICBpZiAo
cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBwc19saW5lX2pvaW4g
Sm9pbiA9IExJTkVfSk9JTl9NSVRFUjsKKyAgICBzd2l0Y2ggKGxpbmVKb2luKSB7CisgICAgY2Fz
ZSBNaXRlckpvaW46CisgICAgICAgIEpvaW4gPSBMSU5FX0pPSU5fTUlURVI7CisgICAgICAgIGJy
ZWFrOworICAgIGNhc2UgUm91bmRKb2luOgorICAgICAgICBKb2luID0gTElORV9KT0lOX1JPVU5E
OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEJldmVsSm9pbjoKKyAgICAgICAgSm9pbiA9IExJ
TkVfSk9JTl9CRVZFTDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHBzX3NldF9saW5lX2pv
aW4ocGxhdGZvcm1Db250ZXh0KCktPmNvbnRleHQoKSwgSm9pbik7Cit9CisKK3ZvaWQgR3JhcGhp
Y3NDb250ZXh0OjpzZXRNaXRlckxpbWl0KGZsb2F0IG1pdGVyKQoreworICAgIGlmIChwYWludGlu
Z0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHBzX3NldF9taXRlcl9saW1pdChw
bGF0Zm9ybUNvbnRleHQoKS0+Y29udGV4dCgpLCBtaXRlcik7Cit9CisKK3ZvaWQgR3JhcGhpY3ND
b250ZXh0OjpzZXRBbHBoYShmbG9hdCBhbHBoYSkKK3sKKyAgICBwbGF0Zm9ybUNvbnRleHQoKS0+
c2V0R2xvYmFsQWxwaGEoYWxwaGEpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0UGxh
dGZvcm1Db21wb3NpdGVPcGVyYXRpb24oQ29tcG9zaXRlT3BlcmF0b3Igb3ApCit7CisgICAgaWYg
KHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcHNfc2V0X2NvbXBv
c2l0ZV9vcGVyYXRvcihwbGF0Zm9ybUNvbnRleHQoKS0+Y29udGV4dCgpLCB0b0NvbXBvc2l0ZShv
cCkpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6Y2xpcChjb25zdCBQYXRoJiBwYXRoKQor
eworICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHBz
X2NsaXBfcGF0aChwbGF0Zm9ybUNvbnRleHQoKS0+Y29udGV4dCgpLCBwYXRoLnBsYXRmb3JtUGF0
aCgpLT5wYXRoKCksIEZJTExfUlVMRV9XSU5ESU5HKTsKKyAgICBtX2RhdGEtPmNsaXAocGF0aCk7
Cit9CisKK3ZvaWQgR3JhcGhpY3NDb250ZXh0OjpjYW52YXNDbGlwKGNvbnN0IFBhdGgmIHBhdGgp
Cit7CisgICAgY2xpcChwYXRoKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6OmNsaXBPdXQo
Y29uc3QgUGF0aCYgcGF0aCkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29u
dGV4dDo6cm90YXRlKGZsb2F0IHJhZGlhbnMpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQo
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcHNfcm90YXRlKHBsYXRmb3JtQ29udGV4dCgpLT5j
b250ZXh0KCksIHJhZGlhbnMpOworICAgIG1fZGF0YS0+cm90YXRlKHJhZGlhbnMpOworfQorCit2
b2lkIEdyYXBoaWNzQ29udGV4dDo6c2NhbGUoY29uc3QgRmxvYXRTaXplJiBzaXplKQoreworICAg
IGlmIChwYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHBzX3NjYWxl
KHBsYXRmb3JtQ29udGV4dCgpLT5jb250ZXh0KCksIHNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQo
KSk7CisgICAgbV9kYXRhLT5zY2FsZShzaXplKTsKK30KKwordm9pZCBHcmFwaGljc0NvbnRleHQ6
OmNsaXBPdXQoY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgp
KQorICAgICAgICByZXR1cm47CisKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEdy
YXBoaWNzQ29udGV4dDo6ZmlsbFJvdW5kZWRSZWN0KGNvbnN0IEludFJlY3QmIHJjLCBjb25zdCBJ
bnRTaXplJiB0b3BMZWZ0LCBjb25zdCBJbnRTaXplJiB0b3BSaWdodCwgY29uc3QgSW50U2l6ZSYg
Ym90dG9tTGVmdCwgY29uc3QgSW50U2l6ZSYgYm90dG9tUmlnaHQsIGNvbnN0IENvbG9yJiBjb2xv
ciwgQ29sb3JTcGFjZSkKK3sKKyAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBwc19jb250ZXh0KiBjb250ZXh0ID0gcGxhdGZvcm1Db250ZXh0KCktPmNv
bnRleHQoKTsKKyAgICBwc19zYXZlKGNvbnRleHQpOworICAgIHBzX3JlY3QgciA9IHtyYy54KCks
IHJjLnkoKSwgcmMud2lkdGgoKSwgcmMuaGVpZ2h0KCl9OworICAgIHBzX3JvdW5kZWRfcmVjdChj
b250ZXh0LCAmciwgdG9wTGVmdC53aWR0aCgpLCB0b3BMZWZ0LmhlaWdodCgpLCB0b3BSaWdodC53
aWR0aCgpLCAKKwkJCQl0b3BSaWdodC5oZWlnaHQoKSwgYm90dG9tTGVmdC53aWR0aCgpLCBib3R0
b21MZWZ0LmhlaWdodCgpLCAKKwkJCQlib3R0b21SaWdodC53aWR0aCgpLCBib3R0b21SaWdodC5o
ZWlnaHQoKSk7CisgICAgc2V0U291cmNlUkdCQUZyb21Db2xvcihjb250ZXh0LCBjb2xvcik7Cisg
ICAgcHNfZmlsbChjb250ZXh0KTsKKyAgICBwc19yZXN0b3JlKGNvbnRleHQpOworfQorCit2b2lk
IEdyYXBoaWNzQ29udGV4dDo6c2V0UGxhdGZvcm1TaG91bGRBbnRpYWxpYXMoYm9vbCBlbmFibGUp
Cit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
cHNfc2V0X2FudGlhbGlhcyhwbGF0Zm9ybUNvbnRleHQoKS0+Y29udGV4dCgpLCBlbmFibGUgPyBU
cnVlIDogRmFsc2UpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0SW1hZ2VJbnRlcnBv
bGF0aW9uUXVhbGl0eShJbnRlcnBvbGF0aW9uUXVhbGl0eSBxdWFsaXR5KQoreworICAgIHBsYXRm
b3JtQ29udGV4dCgpLT5zZXRJbWFnZUludGVycG9sYXRpb25RdWFsaXR5KHF1YWxpdHkpOworfQor
CitJbnRlcnBvbGF0aW9uUXVhbGl0eSBHcmFwaGljc0NvbnRleHQ6OmltYWdlSW50ZXJwb2xhdGlv
blF1YWxpdHkoKSBjb25zdAoreworICAgIHJldHVybiBwbGF0Zm9ybUNvbnRleHQoKS0+aW1hZ2VJ
bnRlcnBvbGF0aW9uUXVhbGl0eSgpOworfQorCisjaWYgRU5BQkxFKDNEX1JFTkRFUklORykgJiYg
VVNFKFRFWFRVUkVfTUFQUEVSKQorVHJhbnNmb3JtYXRpb25NYXRyaXggR3JhcGhpY3NDb250ZXh0
OjpnZXQzRFRyYW5zZm9ybSgpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IENhbiB3ZSBhcHByb3hp
bWF0ZSB0aGUgdHJhbnNmb3JtYXRpb24gYmV0dGVyIHRoYW4gdGhpcz8KKyAgICByZXR1cm4gZ2V0
Q1RNKCkudG9UcmFuc2Zvcm1hdGlvbk1hdHJpeCgpOworfQorCit2b2lkIEdyYXBoaWNzQ29udGV4
dDo6Y29uY2F0M0RUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyYW5zZm9y
bSkKK3sKKyAgICBjb25jYXRDVE0odHJhbnNmb3JtLnRvQWZmaW5lVHJhbnNmb3JtKCkpOworfQor
Cit2b2lkIEdyYXBoaWNzQ29udGV4dDo6c2V0M0RUcmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRp
b25NYXRyaXgmIHRyYW5zZm9ybSkKK3sKKyAgICBzZXRDVE0odHJhbnNmb3JtLnRvQWZmaW5lVHJh
bnNmb3JtKCkpOworfQorI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKwpkaWZmIC11
ck4gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9JbWFnZUJ1ZmZlckRh
dGFQUy5oIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vSW1hZ2VCdWZm
ZXJEYXRhUFMuaAotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9J
bWFnZUJ1ZmZlckRhdGFQUy5oCTE5NzAtMDEtMDEgMDg6MDA6MDAuMDAwMDAwMDAwICswODAwCisr
KyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL0ltYWdlQnVmZmVyRGF0
YVBTLmgJMjAxMi0xMS0xMiAyMDoxNjo0OS4wMDAwMDAwMDAgKzA4MDAKQEAgLTAsMCArMSw0NCBA
QAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBaaGFuZyBKaSBQZW5nIDxvbmVjb29seEBnbWFp
bC5jb20+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2luY2x1ZGUgIlBsYXRmb3JtQ29udGV4dFBTLmgiCisKK3R5cGVkZWYg
c3RydWN0IF9wc19jYW52YXMgcHNfY2FudmFzOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2Ns
YXNzIEludFNpemU7CisKK2NsYXNzIEltYWdlQnVmZmVyRGF0YSB7CitwdWJsaWM6CisgICAgSW1h
Z2VCdWZmZXJEYXRhKGNvbnN0IEludFNpemUmKTsKKworICAgIHBzX2J5dGUqIG1fYnVmZmVyOwor
ICAgIGludCBtX3N0cmlkZTsKKyAgICBwc19jYW52YXMqIG1fY2FudmFzOworICAgIFBsYXRmb3Jt
Q29udGV4dFBTIG1fcGxhdGZvcm1Db250ZXh0OworfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQpkaWZmIC11ck4gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9JbWFn
ZUJ1ZmZlclBTLmNwcCBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL0lt
YWdlQnVmZmVyUFMuY3BwCi0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNh
c3NvL0ltYWdlQnVmZmVyUFMuY3BwCTE5NzAtMDEtMDEgMDg6MDA6MDAuMDAwMDAwMDAwICswODAw
CisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL0ltYWdlQnVmZmVy
UFMuY3BwCTIwMTItMTEtMTIgMjA6MTY6NDkuMDAwMDAwMDAwICswODAwCkBAIC0wLDAgKzEsMjYx
IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIFpoYW5nIEppIFBlbmcgPG9uZWNvb2x4QGdt
YWlsLmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiSW1hZ2VCdWZm
ZXIuaCIKKworI2luY2x1ZGUgIkJpdG1hcEltYWdlLmgiCisjaW5jbHVkZSAiUFNVdGlsaXRpZXMu
aCIKKyNpbmNsdWRlICJDb2xvci5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2lu
Y2x1ZGUgIkltYWdlRGF0YS5oIgorI2luY2x1ZGUgIk1JTUVUeXBlUmVnaXN0cnkuaCIKKyNpbmNs
dWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBhdHRlcm4uaCIKKyNpbmNsdWRlICJQ
bGF0Zm9ybUNvbnRleHRQUy5oIgorI2luY2x1ZGUgIlJlZlB0clBTLmgiCisjaW5jbHVkZSA8cGlj
YXNzby5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9CYXNl
NjQuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKwordXNpbmcgbmFtZXNwYWNl
IHN0ZDsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitJbWFnZUJ1ZmZlckRhdGE6OkltYWdlQnVm
ZmVyRGF0YShjb25zdCBJbnRTaXplJikKKyAgICA6IG1fYnVmZmVyKDApCisgICAgLCBtX3N0cmlk
ZSgwKQorICAgICwgbV9jYW52YXMoMCkKKyAgICAsIG1fcGxhdGZvcm1Db250ZXh0KDApCit7Cit9
CisKK0ltYWdlQnVmZmVyOjpJbWFnZUJ1ZmZlcihjb25zdCBJbnRTaXplJiBzaXplLCBmbG9hdCAv
KiByZXNvbHV0aW9uU2NhbGUgKi8sIENvbG9yU3BhY2UsIFJlbmRlcmluZ01vZGUsIERlZmVycmFs
TW9kZSwgYm9vbCYgc3VjY2VzcykKKyAgICA6IG1fZGF0YShzaXplKQorICAgICwgbV9zaXplKHNp
emUpCisgICAgLCBtX2xvZ2ljYWxTaXplKHNpemUpCit7CisgICAgc3VjY2VzcyA9IGZhbHNlOyAg
Ly8gTWFrZSBlYXJseSByZXR1cm4gbWVhbiBlcnJvci4KKworICAgIG1fZGF0YS5tX3N0cmlkZSA9
IHNpemUud2lkdGgoKSAqIDQ7CisgICAgbV9kYXRhLm1fYnVmZmVyID0gKHBzX2J5dGUqKWNhbGxv
YygxLCBzaXplLmhlaWdodCgpICogbV9kYXRhLm1fc3RyaWRlKTsKKyAgICBpZiAoIW1fZGF0YS5t
X2J1ZmZlcikKKwlyZXR1cm47CisKKyAgICBtX2RhdGEubV9jYW52YXMgPSBwc19jYW52YXNfY3Jl
YXRlX3dpdGhfZGF0YShtX2RhdGEubV9idWZmZXIsIENPTE9SX0ZPUk1BVF9BUkdCLCAKKwkJCQkJ
CXNpemUud2lkdGgoKSwgc2l6ZS5oZWlnaHQoKSwgbV9kYXRhLm1fc3RyaWRlKTsKKyAgICBpZiAo
IW1fZGF0YS5tX2NhbnZhcykKKyAgICAgICAgcmV0dXJuOyAgLy8gY3JlYXRlIHdpbGwgbm90aWNl
IHdlIGRpZG4ndCBzZXQgbV9pbml0aWFsaXplZCBhbmQgZmFpbC4KKworICAgIFJlZlB0cjxwc19j
b250ZXh0PiBjb250ZXh0ID0gYWRvcHRSZWYocHNfY29udGV4dF9jcmVhdGUobV9kYXRhLm1fY2Fu
dmFzKSk7CisgICAgbV9kYXRhLm1fcGxhdGZvcm1Db250ZXh0LnNldENvbnRleHQoY29udGV4dC5n
ZXQoKSk7CisgICAgbV9jb250ZXh0ID0gYWRvcHRQdHIobmV3IEdyYXBoaWNzQ29udGV4dCgmbV9k
YXRhLm1fcGxhdGZvcm1Db250ZXh0KSk7CisgICAgc3VjY2VzcyA9IHRydWU7Cit9CisKK0ltYWdl
QnVmZmVyOjp+SW1hZ2VCdWZmZXIoKQoreworICAgIHBzX2NhbnZhc191bnJlZihtX2RhdGEubV9j
YW52YXMpOworICAgIGZyZWUobV9kYXRhLm1fYnVmZmVyKTsKK30KKworR3JhcGhpY3NDb250ZXh0
KiBJbWFnZUJ1ZmZlcjo6Y29udGV4dCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fY29udGV4dC5n
ZXQoKTsKK30KKworUGFzc1JlZlB0cjxJbWFnZT4gSW1hZ2VCdWZmZXI6OmNvcHlJbWFnZShCYWNr
aW5nU3RvcmVDb3B5IGNvcHlCZWhhdmlvcikgY29uc3QKK3sKKyAgICBpZiAoY29weUJlaGF2aW9y
ID09IENvcHlCYWNraW5nU3RvcmUpCisgICAgICAgIHJldHVybiBCaXRtYXBJbWFnZTo6Y3JlYXRl
KGNvcHlJbWFnZUNhbnZhcyhtX2RhdGEubV9jYW52YXMpLmxlYWtSZWYoKSwgZmFsc2UpOworCisg
ICAgLy8gQml0bWFwSW1hZ2Ugd2lsbCByZWxlYXNlIHRoZSBwYXNzZWQgaW4gc3VyZmFjZSBvbiBk
ZXN0cnVjdGlvbgorICAgIHJldHVybiBCaXRtYXBJbWFnZTo6Y3JlYXRlKHBzX2ltYWdlX2NyZWF0
ZV9mcm9tX2NhbnZhcyhtX2RhdGEubV9jYW52YXMsIDApLCBmYWxzZSk7Cit9CisKK3ZvaWQgSW1h
Z2VCdWZmZXI6OmNsaXAoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBGbG9hdFJlY3Qm
IG1hc2tSZWN0KSBjb25zdAoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgSW1h
Z2VCdWZmZXI6OmRyYXcoR3JhcGhpY3NDb250ZXh0KiBkZXN0aW5hdGlvbkNvbnRleHQsIENvbG9y
U3BhY2Ugc3R5bGVDb2xvclNwYWNlLCBjb25zdCBGbG9hdFJlY3QmIGRlc3RSZWN0LCBjb25zdCBG
bG9hdFJlY3QmIHNyY1JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgIENvbXBvc2l0ZU9wZXJh
dG9yIG9wICwgYm9vbCB1c2VMb3dRdWFsaXR5U2NhbGUpCit7CisgICAgQmFja2luZ1N0b3JlQ29w
eSBjb3B5TW9kZSA9IGRlc3RpbmF0aW9uQ29udGV4dCA9PSBjb250ZXh0KCkgPyBDb3B5QmFja2lu
Z1N0b3JlIDogRG9udENvcHlCYWNraW5nU3RvcmU7CisgICAgUmVmUHRyPEltYWdlPiBpbWFnZSA9
IGNvcHlJbWFnZShjb3B5TW9kZSk7CisgICAgZGVzdGluYXRpb25Db250ZXh0LT5kcmF3SW1hZ2Uo
aW1hZ2UuZ2V0KCksIHN0eWxlQ29sb3JTcGFjZSwgZGVzdFJlY3QsIHNyY1JlY3QsIG9wLCBEb05v
dFJlc3BlY3RJbWFnZU9yaWVudGF0aW9uLCB1c2VMb3dRdWFsaXR5U2NhbGUpOworfQorCit2b2lk
IEltYWdlQnVmZmVyOjpkcmF3UGF0dGVybihHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0
IEZsb2F0UmVjdCYgc3JjUmVjdCwgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBwYXR0ZXJuVHJhbnNm
b3JtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmxvYXRQb2ludCYgcGhh
c2UsIENvbG9yU3BhY2Ugc3R5bGVDb2xvclNwYWNlLCBDb21wb3NpdGVPcGVyYXRvciBvcCwgY29u
c3QgRmxvYXRSZWN0JiBkZXN0UmVjdCkKK3sKKyAgICBSZWZQdHI8SW1hZ2U+IGltYWdlID0gY29w
eUltYWdlKERvbnRDb3B5QmFja2luZ1N0b3JlKTsKKyAgICBpbWFnZS0+ZHJhd1BhdHRlcm4oY29u
dGV4dCwgc3JjUmVjdCwgcGF0dGVyblRyYW5zZm9ybSwgcGhhc2UsIHN0eWxlQ29sb3JTcGFjZSwg
b3AsIGRlc3RSZWN0KTsKK30KKwordm9pZCBJbWFnZUJ1ZmZlcjo6cGxhdGZvcm1UcmFuc2Zvcm1D
b2xvclNwYWNlKGNvbnN0IFZlY3RvcjxpbnQ+JiBsb29rVXBUYWJsZSkKK3sKKyAgICB1bnNpZ25l
ZCBjaGFyKiBkYXRhU3JjID0gbV9kYXRhLm1fYnVmZmVyOworICAgIGludCBzdHJpZGUgPSBtX2Rh
dGEubV9zdHJpZGU7CisgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBtX3NpemUuaGVpZ2h0KCk7ICsr
eSkgeworICAgICAgICB1bnNpZ25lZCogcm93ID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCo+
KGRhdGFTcmMgKyBzdHJpZGUgKiB5KTsKKyAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBtX3Np
emUud2lkdGgoKTsgeCsrKSB7CisgICAgICAgICAgICB1bnNpZ25lZCogcGl4ZWwgPSByb3cgKyB4
OworICAgICAgICAgICAgQ29sb3IgcGl4ZWxDb2xvciA9IGNvbG9yRnJvbVByZW11bHRpcGxpZWRB
UkdCKCpwaXhlbCk7CisgICAgICAgICAgICBwaXhlbENvbG9yID0gQ29sb3IobG9va1VwVGFibGVb
cGl4ZWxDb2xvci5yZWQoKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va1Vw
VGFibGVbcGl4ZWxDb2xvci5ncmVlbigpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBsb29rVXBUYWJsZVtwaXhlbENvbG9yLmJsdWUoKV0sCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgcGl4ZWxDb2xvci5hbHBoYSgpKTsKKyAgICAgICAgICAgICpwaXhlbCA9IHByZW11
bHRpcGxpZWRBUkdCRnJvbUNvbG9yKHBpeGVsQ29sb3IpOworICAgICAgICB9CisgICAgfQorfQor
Cit0ZW1wbGF0ZSA8TXVsdGlwbHkgbXVsdGlwbGllZD4KK1Bhc3NSZWZQdHI8VWludDhDbGFtcGVk
QXJyYXk+IGdldEltYWdlRGF0YShjb25zdCBJbnRSZWN0JiByZWN0LCBjb25zdCBJbWFnZUJ1ZmZl
ckRhdGEmIGRhdGEsIGNvbnN0IEludFNpemUmIHNpemUpCit7CisgICAgUmVmUHRyPFVpbnQ4Q2xh
bXBlZEFycmF5PiByZXN1bHQgPSBVaW50OENsYW1wZWRBcnJheTo6Y3JlYXRlVW5pbml0aWFsaXpl
ZChyZWN0LndpZHRoKCkgKiByZWN0LmhlaWdodCgpICogNCk7CisgICAgdW5zaWduZWQgY2hhciog
ZGF0YVNyYyA9IGRhdGEubV9idWZmZXI7CisgICAgdW5zaWduZWQgY2hhciogZGF0YURzdCA9IHJl
c3VsdC0+ZGF0YSgpOworCisgICAgaWYgKHJlY3QueCgpIDwgMCB8fCByZWN0LnkoKSA8IDAgfHwg
KHJlY3QueCgpICsgcmVjdC53aWR0aCgpKSA+IHNpemUud2lkdGgoKSB8fCAocmVjdC55KCkgKyBy
ZWN0LmhlaWdodCgpKSA+IHNpemUuaGVpZ2h0KCkpCisgICAgICAgIHJlc3VsdC0+emVyb0ZpbGwo
KTsKKworICAgIGludCBvcmlnaW54ID0gcmVjdC54KCk7CisgICAgaW50IGRlc3R4ID0gMDsKKyAg
ICBpZiAob3JpZ2lueCA8IDApIHsKKyAgICAgICAgZGVzdHggPSAtb3JpZ2lueDsKKyAgICAgICAg
b3JpZ2lueCA9IDA7CisgICAgfQorICAgIGludCBlbmR4ID0gcmVjdC5tYXhYKCk7CisgICAgaWYg
KGVuZHggPiBzaXplLndpZHRoKCkpCisgICAgICAgIGVuZHggPSBzaXplLndpZHRoKCk7CisgICAg
aW50IG51bUNvbHVtbnMgPSBlbmR4IC0gb3JpZ2lueDsKKworICAgIGludCBvcmlnaW55ID0gcmVj
dC55KCk7CisgICAgaW50IGRlc3R5ID0gMDsKKyAgICBpZiAob3JpZ2lueSA8IDApIHsKKyAgICAg
ICAgZGVzdHkgPSAtb3JpZ2lueTsKKyAgICAgICAgb3JpZ2lueSA9IDA7CisgICAgfQorICAgIGlu
dCBlbmR5ID0gcmVjdC5tYXhZKCk7CisgICAgaWYgKGVuZHkgPiBzaXplLmhlaWdodCgpKQorICAg
ICAgICBlbmR5ID0gc2l6ZS5oZWlnaHQoKTsKKyAgICBpbnQgbnVtUm93cyA9IGVuZHkgLSBvcmln
aW55OworCisgICAgaW50IHN0cmlkZSA9IGRhdGEubV9zdHJpZGU7CisgICAgdW5zaWduZWQgZGVz
dEJ5dGVzUGVyUm93ID0gNCAqIHJlY3Qud2lkdGgoKTsKKworICAgIHVuc2lnbmVkIGNoYXIqIGRl
c3RSb3dzID0gZGF0YURzdCArIGRlc3R5ICogZGVzdEJ5dGVzUGVyUm93ICsgZGVzdHggKiA0Owor
ICAgIGZvciAoaW50IHkgPSAwOyB5IDwgbnVtUm93czsgKyt5KSB7CisgICAgICAgIHVuc2lnbmVk
KiByb3cgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkKj4oZGF0YVNyYyArIHN0cmlkZSAqICh5
ICsgb3JpZ2lueSkpOworICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IG51bUNvbHVtbnM7IHgr
KykgeworICAgICAgICAgICAgaW50IGJhc2V4ID0geCAqIDQ7CisgICAgICAgICAgICB1bnNpZ25l
ZCogcGl4ZWwgPSByb3cgKyB4ICsgb3JpZ2lueDsKKyAgICAgICAgICAgIENvbG9yIHBpeGVsQ29s
b3I7CisgICAgICAgICAgICBpZiAobXVsdGlwbGllZCA9PSBVbm11bHRpcGxpZWQpCisgICAgICAg
ICAgICAgICAgcGl4ZWxDb2xvciA9IGNvbG9yRnJvbVByZW11bHRpcGxpZWRBUkdCKCpwaXhlbCk7
CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcGl4ZWxDb2xvciA9IENvbG9yKCpw
aXhlbCk7CisgICAgICAgICAgICBkZXN0Um93c1tiYXNleF0gICAgID0gcGl4ZWxDb2xvci5yZWQo
KTsKKyAgICAgICAgICAgIGRlc3RSb3dzW2Jhc2V4ICsgMV0gPSBwaXhlbENvbG9yLmdyZWVuKCk7
CisgICAgICAgICAgICBkZXN0Um93c1tiYXNleCArIDJdID0gcGl4ZWxDb2xvci5ibHVlKCk7Cisg
ICAgICAgICAgICBkZXN0Um93c1tiYXNleCArIDNdID0gcGl4ZWxDb2xvci5hbHBoYSgpOworICAg
ICAgICB9CisgICAgICAgIGRlc3RSb3dzICs9IGRlc3RCeXRlc1BlclJvdzsKKyAgICB9CisKKyAg
ICByZXR1cm4gcmVzdWx0LnJlbGVhc2UoKTsKK30KKworUGFzc1JlZlB0cjxVaW50OENsYW1wZWRB
cnJheT4gSW1hZ2VCdWZmZXI6OmdldFVubXVsdGlwbGllZEltYWdlRGF0YShjb25zdCBJbnRSZWN0
JiByZWN0LCBDb29yZGluYXRlU3lzdGVtKSBjb25zdAoreworICAgIHJldHVybiBnZXRJbWFnZURh
dGE8VW5tdWx0aXBsaWVkPihyZWN0LCBtX2RhdGEsIG1fc2l6ZSk7Cit9CisKK1Bhc3NSZWZQdHI8
VWludDhDbGFtcGVkQXJyYXk+IEltYWdlQnVmZmVyOjpnZXRQcmVtdWx0aXBsaWVkSW1hZ2VEYXRh
KGNvbnN0IEludFJlY3QmIHJlY3QsIENvb3JkaW5hdGVTeXN0ZW0pIGNvbnN0Cit7CisgICAgcmV0
dXJuIGdldEltYWdlRGF0YTxQcmVtdWx0aXBsaWVkPihyZWN0LCBtX2RhdGEsIG1fc2l6ZSk7Cit9
CisKK3ZvaWQgSW1hZ2VCdWZmZXI6OnB1dEJ5dGVBcnJheShNdWx0aXBseSBtdWx0aXBsaWVkLCBV
aW50OENsYW1wZWRBcnJheSogc291cmNlLCBjb25zdCBJbnRTaXplJiBzb3VyY2VTaXplLCBjb25z
dCBJbnRSZWN0JiBzb3VyY2VSZWN0LCBjb25zdCBJbnRQb2ludCYgZGVzdFBvaW50LCBDb29yZGlu
YXRlU3lzdGVtKQoreworICAgIHVuc2lnbmVkIGNoYXIqIGRhdGFEc3QgPSBtX2RhdGEubV9idWZm
ZXI7CisKKyAgICBBU1NFUlQoc291cmNlUmVjdC53aWR0aCgpID4gMCk7CisgICAgQVNTRVJUKHNv
dXJjZVJlY3QuaGVpZ2h0KCkgPiAwKTsKKworICAgIGludCBvcmlnaW54ID0gc291cmNlUmVjdC54
KCk7CisgICAgaW50IGRlc3R4ID0gZGVzdFBvaW50LngoKSArIHNvdXJjZVJlY3QueCgpOworICAg
IEFTU0VSVChkZXN0eCA+PSAwKTsKKyAgICBBU1NFUlQoZGVzdHggPCBtX3NpemUud2lkdGgoKSk7
CisgICAgQVNTRVJUKG9yaWdpbnggPj0gMCk7CisgICAgQVNTRVJUKG9yaWdpbnggPD0gc291cmNl
UmVjdC5tYXhYKCkpOworCisgICAgaW50IGVuZHggPSBkZXN0UG9pbnQueCgpICsgc291cmNlUmVj
dC5tYXhYKCk7CisgICAgQVNTRVJUKGVuZHggPD0gbV9zaXplLndpZHRoKCkpOworCisgICAgaW50
IG51bUNvbHVtbnMgPSBlbmR4IC0gZGVzdHg7CisKKyAgICBpbnQgb3JpZ2lueSA9IHNvdXJjZVJl
Y3QueSgpOworICAgIGludCBkZXN0eSA9IGRlc3RQb2ludC55KCkgKyBzb3VyY2VSZWN0LnkoKTsK
KyAgICBBU1NFUlQoZGVzdHkgPj0gMCk7CisgICAgQVNTRVJUKGRlc3R5IDwgbV9zaXplLmhlaWdo
dCgpKTsKKyAgICBBU1NFUlQob3JpZ2lueSA+PSAwKTsKKyAgICBBU1NFUlQob3JpZ2lueSA8PSBz
b3VyY2VSZWN0Lm1heFkoKSk7CisKKyAgICBpbnQgZW5keSA9IGRlc3RQb2ludC55KCkgKyBzb3Vy
Y2VSZWN0Lm1heFkoKTsKKyAgICBBU1NFUlQoZW5keSA8PSBtX3NpemUuaGVpZ2h0KCkpOworICAg
IGludCBudW1Sb3dzID0gZW5keSAtIGRlc3R5OworCisgICAgdW5zaWduZWQgc3JjQnl0ZXNQZXJS
b3cgPSA0ICogc291cmNlU2l6ZS53aWR0aCgpOworICAgIGludCBzdHJpZGUgPSBtX2RhdGEubV9z
dHJpZGU7CisKKyAgICB1bnNpZ25lZCBjaGFyKiBzcmNSb3dzID0gc291cmNlLT5kYXRhKCkgKyBv
cmlnaW55ICogc3JjQnl0ZXNQZXJSb3cgKyBvcmlnaW54ICogNDsKKyAgICBmb3IgKGludCB5ID0g
MDsgeSA8IG51bVJvd3M7ICsreSkgeworICAgICAgICB1bnNpZ25lZCogcm93ID0gcmVpbnRlcnBy
ZXRfY2FzdDx1bnNpZ25lZCo+KGRhdGFEc3QgKyBzdHJpZGUgKiAoeSArIGRlc3R5KSk7CisgICAg
ICAgIGZvciAoaW50IHggPSAwOyB4IDwgbnVtQ29sdW1uczsgeCsrKSB7CisgICAgICAgICAgICBp
bnQgYmFzZXggPSB4ICogNDsKKyAgICAgICAgICAgIHVuc2lnbmVkKiBwaXhlbCA9IHJvdyArIHgg
KyBkZXN0eDsKKyAgICAgICAgICAgIENvbG9yIHBpeGVsQ29sb3IgPSBDb2xvcjo6Y3JlYXRlVW5D
aGVrZWQoc3JjUm93c1tiYXNleF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHNyY1Jvd3NbYmFzZXggKyAxXSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjUm93c1tiYXNleCArIDJdLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNS
b3dzW2Jhc2V4ICsgM10pOworICAgICAgICAgICAgaWYgKG11bHRpcGxpZWQgPT0gVW5tdWx0aXBs
aWVkKQorICAgICAgICAgICAgICAgICpwaXhlbCA9IHByZW11bHRpcGxpZWRBUkdCRnJvbUNvbG9y
KHBpeGVsQ29sb3IpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICpwaXhlbCA9
IHBpeGVsQ29sb3IucmdiKCk7CisgICAgICAgIH0KKyAgICAgICAgc3JjUm93cyArPSBzcmNCeXRl
c1BlclJvdzsKKyAgICB9Cit9CisKK1N0cmluZyBJbWFnZUJ1ZmZlcjo6dG9EYXRhVVJMKGNvbnN0
IFN0cmluZyYgbWltZVR5cGUsIGNvbnN0IGRvdWJsZSosIENvb3JkaW5hdGVTeXN0ZW0pIGNvbnN0
Cit7CisgICAgcmV0dXJuIFN0cmluZygpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRp
ZmYgLXVyTiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL0ltYWdlUFMu
Y3BwIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vSW1hZ2VQUy5jcHAK
LS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vSW1hZ2VQUy5jcHAJ
MTk3MC0wMS0wMSAwODowMDowMC4wMDAwMDAwMDAgKzA4MDAKKysrIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vSW1hZ2VQUy5jcHAJMjAxMi0xMS0xMiAyMDoxNjo0OS4w
MDAwMDAwMDAgKzA4MDAKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAx
MiBaaGFuZyBKaSBQZW5nIDxvbmVjb29seEBnbWFpbC5jb20+CisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIkltYWdlLmgiCisKKyNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0u
aCIKKyNpbmNsdWRlICJQU1V0aWxpdGllcy5oIgorI2luY2x1ZGUgIkNvbG9yLmgiCisjaW5jbHVk
ZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSW1hZ2VPYnNlcnZlci5oIgorI2luY2x1
ZGUgIk5hdGl2ZUltYWdlUFMuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUNvbnRleHRQUy5oIgorI2lu
Y2x1ZGUgPHBpY2Fzc28uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKworc3RhdGljIHZvaWQgZHJhd1BhdHRlcm5Ub0NvbnRleHQocHNfY29udGV4dCogY29udGV4
dCwgcHNfaW1hZ2UqIGltYWdlLCBjb25zdCBJbnRTaXplJiBpbWFnZVNpemUsIAorCQkJCWNvbnN0
IEZsb2F0UmVjdCYgdGlsZVJlY3QsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgcGF0dGVyblRyYW5z
Zm9ybSwgCisJCQkJY29uc3QgRmxvYXRQb2ludCYgcGhhc2UsIHBzX2NvbXBvc2l0ZSBvcCwgY29u
c3QgRmxvYXRSZWN0JiBkc3QpCit7CisgICAgLy8gQXZvaWQgTmFOCisgICAgaWYgKCFpc2Zpbml0
ZShwaGFzZS54KCkpIHx8ICFpc2Zpbml0ZShwaGFzZS55KCkpKQorICAgICAgIHJldHVybjsKKwor
ICAgIHBzX3NhdmUoY29udGV4dCk7CisKKyAgICBwc19yZWN0IHJlY3QgPSB7dGlsZVJlY3QueCgp
LCB0aWxlUmVjdC55KCksIHRpbGVSZWN0LndpZHRoKCksIHRpbGVSZWN0LmhlaWdodCgpfTsKKyAg
ICBwc19pbWFnZSogcGltZyA9IHBzX2ltYWdlX2NyZWF0ZV9mcm9tX2ltYWdlKGltYWdlLCAmcmVj
dCk7CisgICAgcHNfc2V0X2NvbXBvc2l0ZV9vcGVyYXRvcihjb250ZXh0LCBvcCk7CisKKyAgICBp
ZiAodGlsZVJlY3Quc2l6ZSgpID09IGRzdC5zaXplKCkgJiYgIXBoYXNlLngoKSAmJiAhcGhhc2Uu
eSgpKSB7IC8vRm9yIG9wdGltaXphdGlvbiB3aXRoIHNpbmdsZSBpbWFnZQorICAgICAgICBwc19z
ZXRfc291cmNlX2ltYWdlKGNvbnRleHQsIHBpbWcpOworCS8vZHJhdyBpbWFnZQorICAgICAgICBw
c19yZWN0IGRyZWN0ID0ge2RzdC54KCksIGRzdC55KCksIGRzdC53aWR0aCgpLCBkc3QuaGVpZ2h0
KCl9OworICAgICAgICBwc19yZWN0YW5nbGUoY29udGV4dCwgJmRyZWN0KTsKKyAgICAgICAgcHNf
ZmlsbChjb250ZXh0KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvL2NyZWF0ZSB0aWxlIGltYWdl
CisJcHNfbWF0cml4KiBtdHggPSBwYXR0ZXJuVHJhbnNmb3JtLm1ha2VNYXRyaXgoKTsKKwlwc19t
YXRyaXhfdHJhbnNsYXRlIChtdHgsIHBoYXNlLngoKS1kc3QueCgpLCBwaGFzZS55KCktZHN0Lnko
KSk7CisKKwlwc19wYXR0ZXJuKiBwYXR0ZXJuID0gcHNfcGF0dGVybl9jcmVhdGVfaW1hZ2UocGlt
ZywgV1JBUF9UWVBFX1JFUEVBVCwgV1JBUF9UWVBFX1JFUEVBVCwgbXR4KTsKKwlwc19zZXRfc291
cmNlX3BhdHRlcm4oY29udGV4dCwgcGF0dGVybik7CisKKwkgICAgLy9kcmF3IHBhdHRlcm4KKwlw
c19yZWN0IGRyZWN0ID0ge2RzdC54KCksIGRzdC55KCksIGRzdC53aWR0aCgpLCBkc3QuaGVpZ2h0
KCl9OworCXBzX3JlY3RhbmdsZShjb250ZXh0LCAmZHJlY3QpOworCXBzX2ZpbGwoY29udGV4dCk7
CisKKwkgICAgLy9kZXN0b3J5IHBhdHRlcm4gb2JqZWN0cworCXBzX3BhdHRlcm5fdW5yZWYocGF0
dGVybik7CisJcHNfbWF0cml4X3VucmVmKG10eCk7CisgICAgfQorCisgICAgcHNfaW1hZ2VfdW5y
ZWYocGltZyk7CisgICAgcHNfcmVzdG9yZShjb250ZXh0KTsKK30KKwordm9pZCBJbWFnZTo6ZHJh
d1BhdHRlcm4oR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBGbG9hdFJlY3QmIHRpbGVS
ZWN0LCBjb25zdCBBZmZpbmVUcmFuc2Zvcm0mIHBhdHRlcm5UcmFuc2Zvcm0sCisgICAgICAgICAg
ICAgICAgICAgICAgICBjb25zdCBGbG9hdFBvaW50JiBwaGFzZSwgQ29sb3JTcGFjZSwgQ29tcG9z
aXRlT3BlcmF0b3Igb3AsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QpCit7CisgICAgTmF0aXZl
SW1hZ2VQUyogaW1hZ2UgPSBuYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpOworICAgIGlmICgh
aW1hZ2UpIC8vIElmIGl0J3MgdG9vIGVhcmx5IHdlIHdvbid0IGhhdmUgYW4gaW1hZ2UgeWV0Lgor
ICAgICAgICByZXR1cm47CisKKyAgICBwc19jb250ZXh0KiBjdHggPSBjb250ZXh0LT5wbGF0Zm9y
bUNvbnRleHQoKS0+Y29udGV4dCgpOworICAgIGRyYXdQYXR0ZXJuVG9Db250ZXh0KGN0eCwgaW1h
Z2UtPmltYWdlKCksIHNpemUoKSwgdGlsZVJlY3QsIHBhdHRlcm5UcmFuc2Zvcm0sIHBoYXNlLCB0
b0NvbXBvc2l0ZShvcCksIGRlc3RSZWN0KTsKKworICAgIGlmIChpbWFnZU9ic2VydmVyKCkpCisg
ICAgICAgIGltYWdlT2JzZXJ2ZXIoKS0+ZGlkRHJhdyh0aGlzKTsKK30KKworfQorCmRpZmYgLXVy
TiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL0ludFJlY3RQUy5jcHAg
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9JbnRSZWN0UFMuY3BwCi0t
LSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL0ludFJlY3RQUy5jcHAJ
MTk3MC0wMS0wMSAwODowMDowMC4wMDAwMDAwMDAgKzA4MDAKKysrIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vSW50UmVjdFBTLmNwcAkyMDEyLTExLTEyIDIwOjE2OjQ5
LjAwMDAwMDAwMCArMDgwMApAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAy
MDEyIFpoYW5nIEppIFBlbmcgPG9uZWNvb2x4QGdtYWlsLmNvbT4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBt
b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1Ymxp
YworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgor
ICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUg
dGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAor
ICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkludFJlY3QuaCIKKworI2luY2x1ZGUgPHBpY2Fzc28uaD4KKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitJbnRSZWN0OjpJbnRSZWN0KGNvbnN0IHBzX3JlY3QmIHIpCisgICAg
OiBtX2xvY2F0aW9uKEludFBvaW50KHIueCwgci55KSkKKyAgICAsIG1fc2l6ZShyLncsIHIuaCkK
K3sKK30KKworSW50UmVjdDo6b3BlcmF0b3IgcHNfcmVjdCgpIGNvbnN0Cit7CisgICAgcHNfcmVj
dCByID0geyB4KCksIHkoKSwgd2lkdGgoKSwgaGVpZ2h0KCkgfTsKKyAgICByZXR1cm4gcjsKK30K
KworfQpkaWZmIC11ck4gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9O
YXRpdmVJbWFnZVBTLmNwcCBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3Nv
L05hdGl2ZUltYWdlUFMuY3BwCi0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9w
aWNhc3NvL05hdGl2ZUltYWdlUFMuY3BwCTE5NzAtMDEtMDEgMDg6MDA6MDAuMDAwMDAwMDAwICsw
ODAwCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL05hdGl2ZUlt
YWdlUFMuY3BwCTIwMTItMTEtMTIgMjA6MTY6NDkuMDAwMDAwMDAwICswODAwCkBAIC0wLDAgKzEs
NTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgWmhhbmcgSmkgUGVuZyA8b25lY29vbHhA
Z21haWwuY29tPgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0Ogor
ICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisg
KiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdv
b2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVz
ZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBz
b2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQg
Q09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdI
VAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEs
IE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJOYXRpdmVJbWFnZVBTLmgiCisj
aW5jbHVkZSAicGljYXNzby5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK05hdGl2ZUltYWdl
UFM6Ok5hdGl2ZUltYWdlUFMoKQorICAgIDogbV9hbHBoYShmYWxzZSkKK3sKK30KKworTmF0aXZl
SW1hZ2VQUzo6TmF0aXZlSW1hZ2VQUyhwc19pbWFnZSogaW1hZ2UsIGJvb2wgYWxwaGEpCisgICAg
OiBtX2ltYWdlKGFkb3B0UmVmKGltYWdlKSkKKyAgICAsIG1fYWxwaGEoYWxwaGEpCit7Cit9CisK
K05hdGl2ZUltYWdlUFM6On5OYXRpdmVJbWFnZVBTKCkKK3sKK30KKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQpkaWZmIC11ck4gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNz
by9OYXRpdmVJbWFnZVBTLmggU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNz
by9OYXRpdmVJbWFnZVBTLmgKLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3Bp
Y2Fzc28vTmF0aXZlSW1hZ2VQUy5oCTE5NzAtMDEtMDEgMDg6MDA6MDAuMDAwMDAwMDAwICswODAw
CisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL05hdGl2ZUltYWdl
UFMuaAkyMDEyLTExLTEyIDIwOjE2OjQ5LjAwMDAwMDAwMCArMDgwMApAQCAtMCwwICsxLDUzIEBA
CisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIFpoYW5nIEppIFBlbmcgPG9uZWNvb2x4QGdtYWls
LmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisg
KiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4g
dGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUg
SW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRv
IGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdh
cmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRS
SUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAq
IE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaWZuZGVmIE5hdGl2ZUltYWdlUFNfaAorI2RlZmluZSBOYXRpdmVJbWFnZVBTX2gKKworI2lu
Y2x1ZGUgIlJlZlB0clBTLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgTmF0aXZl
SW1hZ2VQUyB7CitwdWJsaWM6CisgICAgTmF0aXZlSW1hZ2VQUygpOworICAgIH5OYXRpdmVJbWFn
ZVBTKCk7CisgICAgZXhwbGljaXQgTmF0aXZlSW1hZ2VQUyhwc19pbWFnZSosIGJvb2wgaGFzQWxw
aGEpOworICAgIHBzX2ltYWdlKiBpbWFnZSgpIHsgcmV0dXJuIG1faW1hZ2UuZ2V0KCk7IH0KKyAg
ICBib29sIGhhc0FscGhhKCkgY29uc3QgeyByZXR1cm4gbV9hbHBoYTsgfQorICAgIHZvaWQgc2V0
QWxwaGEoYm9vbCBiKSB7IG1fYWxwaGEgPSBiOyB9Citwcml2YXRlOgorICAgIFJlZlB0cjxwc19p
bWFnZT4gbV9pbWFnZTsKKyAgICBib29sIG1fYWxwaGE7Cit9OworCit9CisjZW5kaWYgLy8gTmF0
aXZlSW1hZ2VQU19oCisKZGlmZiAtdXJOIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3BpY2Fzc28vT3duUHRyUFMuY3BwIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3Bp
Y2Fzc28vT3duUHRyUFMuY3BwCi0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9w
aWNhc3NvL093blB0clBTLmNwcAkxOTcwLTAxLTAxIDA4OjAwOjAwLjAwMDAwMDAwMCArMDgwMAor
KysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9Pd25QdHJQUy5jcHAJ
MjAxMi0xMS0xMiAyMDoxNjo0OS4wMDAwMDAwMDAgKzA4MDAKQEAgLTAsMCArMSwzMyBAQAorLyoK
KyAqICBDb3B5cmlnaHQgKGMpIDIwMTIgWmhhbmcgSmkgUGVuZyA8b25lY29vbHhAZ21haWwuY29t
PgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhp
cyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm
dWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp
ZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl
ZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAgU29m
dHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwK
KyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIk93blB0clBTLmgiCisKKyNpbmNsdWRlIDxwaWNhc3NvLmg+CisKK25hbWVz
cGFjZSBXVEYgeworCit0ZW1wbGF0ZSA8PiB2b2lkIGRlbGV0ZU93bmVkUHRyPHBzX3BhdGg+KHBz
X3BhdGgqIHB0cikKK3sKKyAgICBpZiAocHRyKQorICAgICAgICBwc19wYXRoX3VucmVmKHB0cik7
Cit9CisKK30gLy8gbmFtZXNwYWNlIFdURgpkaWZmIC11ck4gU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvcGljYXNzby9Pd25QdHJQUy5oIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3BpY2Fzc28vT3duUHRyUFMuaAotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvcGljYXNzby9Pd25QdHJQUy5oCTE5NzAtMDEtMDEgMDg6MDA6MDAuMDAwMDAwMDAwICsw
ODAwCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL093blB0clBT
LmgJMjAxMi0xMS0xMiAyMDoxNjo0OS4wMDAwMDAwMDAgKzA4MDAKQEAgLTAsMCArMSwzNCBAQAor
LyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTIgWmhhbmcgSmkgUGVuZyA8b25lY29vbHhAZ21haWwu
Y29tPgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUg
TGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAg
VGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1
c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGlt
cGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNl
aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNl
IGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCisgKiAg
U29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9v
ciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBCisgKi8KKworI2lmbmRlZiBPd25QdHJQ
U19oCisjZGVmaW5lIE93blB0clBTX2gKKworI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKyNpbmNs
dWRlIDx3dGYvUGFzc093blB0ci5oPgorCit0eXBlZGVmIHN0cnVjdCBfcHNfcGF0aCBwc19wYXRo
OworCituYW1lc3BhY2UgV1RGIHsKKwordGVtcGxhdGUgPD4gdm9pZCBkZWxldGVPd25lZFB0cjxw
c19wYXRoPihwc19wYXRoKik7CisKK30gLy8gbmFtZXNwYWNlIFdURgorCisjZW5kaWYKZGlmZiAt
dXJOIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vUGF0aFBTLmNwcCBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL1BhdGhQUy5jcHAKLS0tIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vUGF0aFBTLmNwcAkxOTcwLTAx
LTAxIDA4OjAwOjAwLjAwMDAwMDAwMCArMDgwMAorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvcGljYXNzby9QYXRoUFMuY3BwCTIwMTItMTEtMTIgMjA6MTY6NDkuMDAwMDAwMDAw
ICswODAwCkBAIC0wLDAgKzEsMzA1IEBACisvKgorICogIENvcHlyaWdodCAoYykgMjAxMiBaaGFu
ZyBKaSBQZW5nIDxvbmVjb29seEBnbWFpbC5jb20+CisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJl
ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBM
aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhl
IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFO
VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
ICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAg
ICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWludCB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBm
aWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICAgIHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgICAg
Qm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiUGF0aC5oIgorCisjaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCisjaW5jbHVk
ZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAi
T3duUHRyUFMuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVBhdGhQUy5oIgorI2luY2x1ZGUgIlN0cm9r
ZVN0eWxlQXBwbGllci5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSA8
cGljYXNzby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5o
PgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK1BhdGg6OlBhdGgoKQorICAgIDogbV9wYXRoKDApCit7Cit9CisKK1BhdGg6On5QYXRoKCkK
K3sKKyAgICBpZiAobV9wYXRoKQorICAgICAgICBkZWxldGUgbV9wYXRoOworfQorCitQYXRoOjpQ
YXRoKGNvbnN0IFBhdGgmIG90aGVyKQorICAgIDogbV9wYXRoKDApCit7CisgICAgaWYgKG90aGVy
LmlzTnVsbCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBlbnN1cmVQbGF0Zm9ybVBhdGgoKTsK
KyAgICBtX3BhdGgtPm1fcGF0aCA9IGFkb3B0UmVmKHBzX3BhdGhfY3JlYXRlX2NvcHkob3RoZXIu
cGxhdGZvcm1QYXRoKCktPnBhdGgoKSkpOworfQorCitQbGF0Zm9ybVBhdGhQdHIgUGF0aDo6ZW5z
dXJlUGxhdGZvcm1QYXRoKCkKK3sKKyAgICBpZiAoIW1fcGF0aCkKKyAgICAgICAgbV9wYXRoID0g
bmV3IFBpY2Fzc29QYXRoKCk7CisgICAgcmV0dXJuIG1fcGF0aDsKK30KKworUGF0aCYgUGF0aDo6
b3BlcmF0b3I9KGNvbnN0IFBhdGgmIG90aGVyKQoreworICAgIGlmICgmb3RoZXIgPT0gdGhpcykK
KyAgICAgICAgcmV0dXJuICp0aGlzOworCisgICAgaWYgKG90aGVyLmlzTnVsbCgpKSB7CisgICAg
ICAgIGlmIChtX3BhdGgpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBtX3BhdGg7CisgICAgICAgICAg
ICBtX3BhdGggPSAwOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY2xlYXIoKTsK
KwllbnN1cmVQbGF0Zm9ybVBhdGgoKTsKKwltX3BhdGgtPm1fcGF0aCA9IGFkb3B0UmVmKHBzX3Bh
dGhfY3JlYXRlX2NvcHkob3RoZXIucGxhdGZvcm1QYXRoKCktPnBhdGgoKSkpOworICAgIH0KKwor
ICAgIHJldHVybiAqdGhpczsKK30KKwordm9pZCBQYXRoOjpjbGVhcigpCit7CisgICAgaWYgKGlz
TnVsbCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBwc19wYXRoKiBwYXRoID0gcGxhdGZvcm1Q
YXRoKCktPnBhdGgoKTsKKyAgICBwc19wYXRoX2NsZWFyKHBhdGgpOworfQorCitib29sIFBhdGg6
OmlzRW1wdHkoKSBjb25zdAoreworICAgIHJldHVybiBpc051bGwoKSB8fCBwc19wYXRoX2lzX2Vt
cHR5KHBsYXRmb3JtUGF0aCgpLT5wYXRoKCkpOworfQorCitib29sIFBhdGg6Omhhc0N1cnJlbnRQ
b2ludCgpIGNvbnN0Cit7CisgICAgcmV0dXJuICFpc0VtcHR5KCk7Cit9CisKK0Zsb2F0UG9pbnQg
UGF0aDo6Y3VycmVudFBvaW50KCkgY29uc3QgCit7CisgICAgaWYgKGlzTnVsbCgpKQorICAgICAg
ICByZXR1cm4gRmxvYXRQb2ludCgpOworCisgICAgcHNfcGF0aCogcGF0aCA9IHBsYXRmb3JtUGF0
aCgpLT5wYXRoKCk7CisgICAgdW5zaWduZWQgaW50IGxlbiA9IHBzX3BhdGhfZ2V0X3ZlcnRleF9j
b3VudChwYXRoKTsKKyAgICBpZiAoIWxlbikKKyAgICAgICAgcmV0dXJuIEZsb2F0UG9pbnQoKTsK
KworICAgIHBzX3BvaW50IHAgPSB7MCwgMH07CisgICAgcHNfcGF0aF9nZXRfdmVydGV4KHBhdGgs
IGxlbi0xLCAmcCk7CisgICAgcmV0dXJuIEZsb2F0UG9pbnQocC54LCBwLnkpOworfQorCit2b2lk
IFBhdGg6OnRyYW5zbGF0ZShjb25zdCBGbG9hdFNpemUmIHApCit7CisgICAgQWZmaW5lVHJhbnNm
b3JtIG1hdHJpeDsKKyAgICBtYXRyaXgudHJhbnNsYXRlIChwLndpZHRoKCksIHAuaGVpZ2h0KCkp
OworICAgIHRyYW5zZm9ybSAobWF0cml4KTsKK30KKwordm9pZCBQYXRoOjptb3ZlVG8oY29uc3Qg
RmxvYXRQb2ludCYgcCkKK3sKKyAgICBwc19wYXRoKiBwYXRoID0gZW5zdXJlUGxhdGZvcm1QYXRo
KCktPnBhdGgoKTsKKyAgICBwc19wb2ludCBwdCA9IHtwLngoKSwgcC55KCl9OworICAgIHBzX3Bh
dGhfbW92ZV90byhwYXRoLCAmcHQpOworfQorCit2b2lkIFBhdGg6OmFkZExpbmVUbyhjb25zdCBG
bG9hdFBvaW50JiBwKQoreworICAgIHBzX3BhdGgqIHBhdGggPSBlbnN1cmVQbGF0Zm9ybVBhdGgo
KS0+cGF0aCgpOworICAgIHBzX3BvaW50IHB0ID0ge3AueCgpLCBwLnkoKX07CisgICAgcHNfcGF0
aF9saW5lX3RvKHBhdGgsICZwdCk7Cit9CisKK3ZvaWQgUGF0aDo6YWRkUmVjdChjb25zdCBGbG9h
dFJlY3QmIHIpCit7CisgICAgcHNfcGF0aCogcGF0aCA9IGVuc3VyZVBsYXRmb3JtUGF0aCgpLT5w
YXRoKCk7CisgICAgcHNfcmVjdCByYyA9IHtyLngoKSwgci55KCksIHIud2lkdGgoKSwgci5oZWln
aHQoKX07CisgICAgcHNfcGF0aF9hZGRfcmVjdChwYXRoLCAmcmMpOworfQorCit2b2lkIFBhdGg6
OmFkZFF1YWRDdXJ2ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIGMsIGNvbnN0IEZsb2F0UG9pbnQmIGUp
Cit7CisgICAgcHNfcGF0aCogcGF0aCA9IGVuc3VyZVBsYXRmb3JtUGF0aCgpLT5wYXRoKCk7Cisg
ICAgcHNfcG9pbnQgcGMxID0ge2MueCgpLCBjLnkoKX07CisgICAgcHNfcG9pbnQgcGMyID0ge2Uu
eCgpLCBlLnkoKX07CisgICAgcHNfcGF0aF9xdWFkX3RvKHBhdGgsICZwYzEsICZwYzIpOworfQor
Cit2b2lkIFBhdGg6OmFkZEJlemllckN1cnZlVG8oY29uc3QgRmxvYXRQb2ludCYgYzEsIGNvbnN0
IEZsb2F0UG9pbnQmIGMyLCBjb25zdCBGbG9hdFBvaW50JiBldCkKK3sKKyAgICBwc19wYXRoKiBw
YXRoID0gZW5zdXJlUGxhdGZvcm1QYXRoKCktPnBhdGgoKTsKKyAgICBwc19wb2ludCBwYzEgPSB7
YzEueCgpLCBjMS55KCl9OworICAgIHBzX3BvaW50IHBjMiA9IHtjMi54KCksIGMyLnkoKX07Cisg
ICAgcHNfcG9pbnQgcGV0ID0ge2V0LngoKSwgZXQueSgpfTsKKyAgICBwc19wYXRoX2Jlemllcl90
byhwYXRoLCAmcGMxLCAmcGMyLCAmcGV0KTsKK30KKwordm9pZCBQYXRoOjphZGRBcmMoY29uc3Qg
RmxvYXRQb2ludCYgcCwgZmxvYXQgciwgZmxvYXQgc2FyLCBmbG9hdCBlYXIsIGJvb2wgYW50aWNs
b2Nrd2lzZSkKK3sKKyAgICBwc19wYXRoKiBwYXRoID0gZW5zdXJlUGxhdGZvcm1QYXRoKCktPnBh
dGgoKTsKKyAgICBwc19wb2ludCBwdCA9IHtwLngoKSwgcC55KCl9OworICAgIHBzX3BhdGhfYWRk
X2FyYyhwYXRoLCAmcHQsIHIsIHNhciwgZWFyLCAoYW50aWNsb2Nrd2lzZSA/IFRydWUgOiBGYWxz
ZSkpOworfQorCitzdGF0aWMgaW5saW5lIGZsb2F0IGFyZWFPZlRyaWFuZ2xlRm9ybWVkQnlQb2lu
dHMoY29uc3QgRmxvYXRQb2ludCYgcDEsIGNvbnN0IEZsb2F0UG9pbnQmIHAyLCBjb25zdCBGbG9h
dFBvaW50JiBwMykKK3sKKyAgICByZXR1cm4gcDEueCgpICogKHAyLnkoKSAtIHAzLnkoKSkgKyBw
Mi54KCkgKiAocDMueSgpIC0gcDEueSgpKSArIHAzLngoKSAqIChwMS55KCkgLSBwMi55KCkpOwor
fQorCit2b2lkIFBhdGg6OmFkZEFyY1RvKGNvbnN0IEZsb2F0UG9pbnQmIHAxLCBjb25zdCBGbG9h
dFBvaW50JiBwMiwgZmxvYXQgcmFkaXVzKQoreworICAgIHBzX3BhdGgqIHBhdGggPSBlbnN1cmVQ
bGF0Zm9ybVBhdGgoKS0+cGF0aCgpOworICAgIHBzX3BvaW50IHBwMSA9IHtwMS54KCksIHAxLnko
KX07CisgICAgcHNfcG9pbnQgcHAyID0ge3AyLngoKSwgcDIueSgpfTsKKyAgICBwc19wYXRoX3Rh
bmdlbnRfYXJjX3RvKHBhdGgsIHJhZGl1cywgJnBwMSwgJnBwMik7Cit9CisKK3ZvaWQgUGF0aDo6
YWRkRWxsaXBzZShjb25zdCBGbG9hdFJlY3QmIHIpCit7CisgICAgcHNfcGF0aCogcGF0aCA9IGVu
c3VyZVBsYXRmb3JtUGF0aCgpLT5wYXRoKCk7CisgICAgcHNfcmVjdCByYyA9IHtyLngoKSwgci55
KCksIHIud2lkdGgoKSwgci5oZWlnaHQoKX07CisgICAgcHNfcGF0aF9hZGRfZWxsaXBzZShwYXRo
LCAmcmMpOworfQorCit2b2lkIFBhdGg6OmNsb3NlU3VicGF0aCgpCit7CisgICAgcHNfcGF0aCog
cGF0aCA9IGVuc3VyZVBsYXRmb3JtUGF0aCgpLT5wYXRoKCk7CisgICAgaWYgKHBzX3BhdGhfaXNf
ZW1wdHkocGF0aCkpCisJcmV0dXJuOworCisgICAgcHNfcGF0aF9zdWJfY2xvc2UocGF0aCk7CQor
fQorCitGbG9hdFJlY3QgUGF0aDo6Ym91bmRpbmdSZWN0KCkgY29uc3QKK3sKKyAgICBwc19wYXRo
KiBwYXRoID0gcGxhdGZvcm1QYXRoKCktPnBhdGgoKTsKKyAgICBpZiAocHNfcGF0aF9pc19lbXB0
eShwYXRoKSkKKwlyZXR1cm4gRmxvYXRSZWN0KCk7CisKKyAgICBwc19yZWN0IHIgPSBwc19wYXRo
X2JvdW5kaW5nX3JlY3QocGF0aCk7CisgICAgcmV0dXJuIEZsb2F0UmVjdChyLngsIHIueSwgci53
LCByLmgpOworfQorCitib29sIFBhdGg6OmNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHB0LCBX
aW5kUnVsZSBydWxlKSBjb25zdAoreworICAgIGlmIChpc051bGwoKSB8fCAhaXNmaW5pdGUocHQu
eCgpKSB8fCAhaXNmaW5pdGUocHQueSgpKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
cHNfcGF0aCogcGF0aCA9IHBsYXRmb3JtUGF0aCgpLT5wYXRoKCk7CisgICAgaWYgKHBzX3BhdGhf
aXNfZW1wdHkocGF0aCkpCisJcmV0dXJuIGZhbHNlOworCisgICAgcHNfZmlsbF9ydWxlIGZsID0g
RklMTF9SVUxFX0VSUk9SOworICAgIHN3aXRjaChydWxlKSB7CisJY2FzZSBSVUxFX05PTlpFUk86
CisJCWZsID0gRklMTF9SVUxFX1dJTkRJTkc7CisJCWJyZWFrOworCWNhc2UgUlVMRV9FVkVOT0RE
OgorCQlmbCA9IEZJTExfUlVMRV9FVkVOX09ERDsKKwkJYnJlYWs7CisgICAgfQorCisgICAgcHNf
cG9pbnQgcCA9IHtwdC54KCksIHB0LnkoKX07CisgICAgcmV0dXJuIHBzX3BhdGhfY29udGFpbnMo
cGF0aCwgJnAsIGZsKSA/IHRydWUgOiBmYWxzZTsKK30KKwordm9pZCBQYXRoOjphcHBseSh2b2lk
KiBpbmZvLCBQYXRoQXBwbGllckZ1bmN0aW9uIGZ1bmN0aW9uKSBjb25zdAoreworICAgIGlmIChp
c051bGwoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcHNfcGF0aCogcGF0aCA9IHBsYXRmb3Jt
UGF0aCgpLT5wYXRoKCk7CisgICAgUGF0aEVsZW1lbnQgcGVsZW1lbnQ7CisgICAgRmxvYXRQb2lu
dCBwb2ludHNbM107CisgICAgcGVsZW1lbnQucG9pbnRzID0gcG9pbnRzOworCisgICAgdW5zaWdu
ZWQgaW50IHNpemUgPSBwc19wYXRoX2dldF92ZXJ0ZXhfY291bnQocGF0aCk7CisKKyAgICBwc19w
b2ludCBwID0gezAsIDB9OworICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgc2l6ZTsg
aSsrKSB7CisgICAgICAgIHVuc2lnbmVkIGludCBjbWQgPSBwc19wYXRoX2dldF92ZXJ0ZXgocGF0
aCwgaSwgJnApOworICAgICAgICBzd2l0Y2ggKGNtZCkgeworICAgICAgICBjYXNlIFBBVEhfQ01E
X01PVkVfVE86CisgICAgICAgICAgICBwZWxlbWVudC50eXBlID0gUGF0aEVsZW1lbnRNb3ZlVG9Q
b2ludDsKKyAgICAgICAgICAgIHBlbGVtZW50LnBvaW50c1swXSA9IEZsb2F0UG9pbnQocC54LCBw
LnkpOworICAgICAgICAgICAgZnVuY3Rpb24oaW5mbywgJnBlbGVtZW50KTsKKyAgICAgICAgICAg
IGJyZWFrOworICAgICAgICBjYXNlIFBBVEhfQ01EX0xJTkVfVE86CisgICAgICAgICAgICBwZWxl
bWVudC50eXBlID0gUGF0aEVsZW1lbnRBZGRMaW5lVG9Qb2ludDsKKyAgICAgICAgICAgIHBlbGVt
ZW50LnBvaW50c1swXSA9IEZsb2F0UG9pbnQocC54LCBwLnkpOworICAgICAgICAgICAgZnVuY3Rp
b24oaW5mbywgJnBlbGVtZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBB
VEhfQ01EX0NVUlZFMzoKKyAgICAgICAgICAgIHBlbGVtZW50LnR5cGUgPSBQYXRoRWxlbWVudEFk
ZFF1YWRDdXJ2ZVRvUG9pbnQ7CisgICAgICAgICAgICBwZWxlbWVudC5wb2ludHNbMF0gPSBGbG9h
dFBvaW50KHAueCwgcC55KTsKKwkgICAgaSsrOworCSAgICBwc19wYXRoX2dldF92ZXJ0ZXgocGF0
aCwgaSwgJnApOworICAgICAgICAgICAgcGVsZW1lbnQucG9pbnRzWzFdID0gRmxvYXRQb2ludChw
LngsIHAueSk7CisgICAgICAgICAgICBmdW5jdGlvbihpbmZvLCAmcGVsZW1lbnQpOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUEFUSF9DTURfQ1VSVkU0OgorICAgICAgICAgICAg
cGVsZW1lbnQudHlwZSA9IFBhdGhFbGVtZW50QWRkQ3VydmVUb1BvaW50OworICAgICAgICAgICAg
cGVsZW1lbnQucG9pbnRzWzBdID0gRmxvYXRQb2ludChwLngsIHAueSk7CisJICAgIGkrKzsKKwkg
ICAgcHNfcGF0aF9nZXRfdmVydGV4KHBhdGgsIGksICZwKTsKKyAgICAgICAgICAgIHBlbGVtZW50
LnBvaW50c1sxXSA9IEZsb2F0UG9pbnQocC54LCBwLnkpOworCSAgICBpKys7CisJICAgIHBzX3Bh
dGhfZ2V0X3ZlcnRleChwYXRoLCBpLCAmcCk7CisgICAgICAgICAgICBwZWxlbWVudC5wb2ludHNb
Ml0gPSBGbG9hdFBvaW50KHAueCwgcC55KTsKKyAgICAgICAgICAgIGZ1bmN0aW9uKGluZm8sICZw
ZWxlbWVudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQQVRIX0NNRF9TVE9Q
OgorICAgICAgICAgICAgcGVsZW1lbnQudHlwZSA9IFBhdGhFbGVtZW50Q2xvc2VTdWJwYXRoOwor
ICAgICAgICAgICAgZnVuY3Rpb24oaW5mbywgJnBlbGVtZW50KTsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFBhdGg6OnRyYW5zZm9ybShjb25zdCBBZmZp
bmVUcmFuc2Zvcm0mIHRyYW5zKQoreworICAgIHBzX3BhdGgqIHBhdGggPSBlbnN1cmVQbGF0Zm9y
bVBhdGgoKS0+cGF0aCgpOworICAgIHBzX21hdHJpeCogbXR4ID0gdHJhbnMubWFrZU1hdHJpeCgp
OyAKKyAgICBwc19tYXRyaXhfdHJhbnNmb3JtX3BhdGgobXR4LCBwYXRoKTsKKyAgICBwc19tYXRy
aXhfdW5yZWYobXR4KTsKK30KKworRmxvYXRSZWN0IFBhdGg6OnN0cm9rZUJvdW5kaW5nUmVjdChT
dHJva2VTdHlsZUFwcGxpZXIqIGFwcGxpZXIpIGNvbnN0Cit7CisgICAgbm90SW1wbGVtZW50ZWQo
KTsKKyAgICByZXR1cm4gRmxvYXRSZWN0KCk7Cit9CisKK2Jvb2wgUGF0aDo6c3Ryb2tlQ29udGFp
bnMoU3Ryb2tlU3R5bGVBcHBsaWVyKiBhcHBsaWVyLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCkg
Y29uc3QKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBmYWxzZTsKK30KKwor
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC11ck4gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvcGljYXNzby9QYXR0ZXJuUFMuY3BwIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3BpY2Fzc28vUGF0dGVyblBTLmNwcAotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvcGljYXNzby9QYXR0ZXJuUFMuY3BwCTE5NzAtMDEtMDEgMDg6MDA6MDAuMDAwMDAw
MDAwICswODAwCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL1Bh
dHRlcm5QUy5jcHAJMjAxMi0xMS0xMiAyMDoxNjo0OS4wMDAwMDAwMDAgKzA4MDAKQEAgLTAsMCAr
MSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBaaGFuZyBKaSBQZW5nIDxvbmVjb29s
eEBnbWFpbC5jb20+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJQYXR0
ZXJuLmgiCisKKyNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKKyNpbmNsdWRlICJHcmFwaGlj
c0NvbnRleHQuaCIKKyNpbmNsdWRlIDxwaWNhc3NvLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworcHNfcGF0dGVybiogUGF0dGVybjo6Y3JlYXRlUGxhdGZvcm1QYXR0ZXJuKGNvbnN0IEFmZmlu
ZVRyYW5zZm9ybSYpIGNvbnN0Cit7CisgICAgTmF0aXZlSW1hZ2VQUyogaW1hZ2UgPSB0aWxlSW1h
Z2UoKS0+bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKTsKKyAgICBpZiAoIWltYWdlKQorICAg
ICAgICByZXR1cm4gMDsKKworICAgIHBzX3dyYXBfdHlwZSB3cmFwX3ggPSBXUkFQX1RZUEVfUkVQ
RUFUOyAKKyAgICBwc193cmFwX3R5cGUgd3JhcF95ID0gV1JBUF9UWVBFX1JFUEVBVDsgCisgICAg
CisgICAgcHNfcGF0dGVybiogcGF0dGVybiA9IHBzX3BhdHRlcm5fY3JlYXRlX2ltYWdlKGltYWdl
LT5pbWFnZSgpLCB3cmFwX3gsIHdyYXBfeSwgMCk7CisKKyAgICBwc19tYXRyaXgqIG1hdHJpeCA9
IG1fcGF0dGVyblNwYWNlVHJhbnNmb3JtYXRpb24ubWFrZU1hdHJpeCgpOworICAgIHBzX3BhdHRl
cm5fdHJhbnNmb3JtKHBhdHRlcm4sIG1hdHJpeCk7CisgICAgcHNfbWF0cml4X3VucmVmKG1hdHJp
eCk7CisKKyAgICByZXR1cm4gcGF0dGVybjsKK30KKworfQpkaWZmIC11ck4gU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9QbGF0Zm9ybUNvbnRleHRQUy5jcHAgU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9QbGF0Zm9ybUNvbnRleHRQUy5jcHAK
LS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vUGxhdGZvcm1Db250
ZXh0UFMuY3BwCTE5NzAtMDEtMDEgMDg6MDA6MDAuMDAwMDAwMDAwICswODAwCisrKyBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL1BsYXRmb3JtQ29udGV4dFBTLmNwcAky
MDEyLTExLTEyIDIwOjE2OjQ5LjAwMDAwMDAwMCArMDgwMApAQCAtMCwwICsxLDIwOSBAQAorLyoK
KyAqIENvcHlyaWdodCAoYykgMjAxMiBaaGFuZyBKaSBQZW5nIDxvbmVjb29seEBnbWFpbC5jb20+
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBV
VEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybUNvbnRleHRQ
Uy5oIgorCisjaW5jbHVkZSAiUFNVdGlsaXRpZXMuaCIKKyNpbmNsdWRlICJHcmFkaWVudC5oIgor
I2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIk93blB0clBTLmgiCisjaW5j
bHVkZSAiUGF0dGVybi5oIgorI2luY2x1ZGUgPHBpY2Fzc28uaD4KKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCitjbGFzcyBQbGF0Zm9ybUNvbnRleHRQUzo6U3RhdGUgeworcHVibGljOgorICAgIFN0
YXRlKCkKKyAgICAgICAgOiBtX2dsb2JhbEFscGhhKDEpCisgICAgICAgICwgbV9pbWFnZUludGVy
cG9sYXRpb25RdWFsaXR5KEludGVycG9sYXRpb25EZWZhdWx0KQorICAgIHsKKyAgICB9CisKKyAg
ICBTdGF0ZShjb25zdCBTdGF0ZSYgc3RhdGUpCisgICAgICAgIDogbV9nbG9iYWxBbHBoYShzdGF0
ZS5tX2dsb2JhbEFscGhhKQorICAgICAgICAsIG1faW1hZ2VJbnRlcnBvbGF0aW9uUXVhbGl0eShz
dGF0ZS5tX2ltYWdlSW50ZXJwb2xhdGlvblF1YWxpdHkpCisgICAgeworICAgIH0KKworICAgIGZs
b2F0IG1fZ2xvYmFsQWxwaGE7CisgICAgSW50ZXJwb2xhdGlvblF1YWxpdHkgbV9pbWFnZUludGVy
cG9sYXRpb25RdWFsaXR5OworfTsKKworUGxhdGZvcm1Db250ZXh0UFM6OlBsYXRmb3JtQ29udGV4
dFBTKHBzX2NvbnRleHQqIGNvbnRleHQpCisgICAgOiBtX2NvbnRleHQoY29udGV4dCkKK3sKKyAg
ICBtX3N0YXRlU3RhY2suYXBwZW5kKFN0YXRlKCkpOworICAgIG1fc3RhdGUgPSAmbV9zdGF0ZVN0
YWNrLmxhc3QoKTsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHRQUzo6cmVzdG9yZSgpCit7Cisg
ICAgbV9zdGF0ZVN0YWNrLnJlbW92ZUxhc3QoKTsKKyAgICBBU1NFUlQoIW1fc3RhdGVTdGFjay5p
c0VtcHR5KCkpOworICAgIG1fc3RhdGUgPSAmbV9zdGF0ZVN0YWNrLmxhc3QoKTsKKworICAgIHBz
X3Jlc3RvcmUobV9jb250ZXh0LmdldCgpKTsKK30KKworUGxhdGZvcm1Db250ZXh0UFM6On5QbGF0
Zm9ybUNvbnRleHRQUygpCit7Cit9CisKK3ZvaWQgUGxhdGZvcm1Db250ZXh0UFM6OnNhdmUoKQor
eworICAgIG1fc3RhdGVTdGFjay5hcHBlbmQoU3RhdGUoKm1fc3RhdGUpKTsKKyAgICBtX3N0YXRl
ID0gJm1fc3RhdGVTdGFjay5sYXN0KCk7CisKKyAgICBwc19zYXZlKG1fY29udGV4dC5nZXQoKSk7
Cit9CisKK3N0YXRpYyB2b2lkIGRyYXdJbWFnZShwc19jb250ZXh0KiBjb250ZXh0LCBwc19pbWFn
ZSogaW1hZ2UsIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJlY3QsIGZsb2F0IGFscGhhKQoreworICAg
IHBzX3NldF9zb3VyY2VfaW1hZ2UoY29udGV4dCwgaW1hZ2UpOworICAgIHBzX3JlY3QgcmMgPSB7
ZGVzdFJlY3QueCgpLCBkZXN0UmVjdC55KCksIGRlc3RSZWN0LndpZHRoKCksIGRlc3RSZWN0Lmhl
aWdodCgpfTsKKyAgICBwc19yZWN0YW5nbGUoY29udGV4dCwgJnJjKTsKKworICAgIGlmIChhbHBo
YSA8IDEpIHsKKyAgICAgICAgcHNfY2xpcChjb250ZXh0KTsKKyAgICAgICAgcHNfc2V0X2FscGhh
KGNvbnRleHQsIGFscGhhKTsKKyAgICAgICAgcHNfZmlsbChjb250ZXh0KTsKKyAgICB9IGVsc2UK
KyAgICAgICAgcHNfZmlsbChjb250ZXh0KTsKK30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHRQUzo6
ZHJhd0ltYWdlVG9Db250ZXh0KHBzX2ltYWdlKiBpbWFnZSwgY29uc3QgRmxvYXRSZWN0JiBkc3Qs
IGNvbnN0IEZsb2F0UmVjdCYgc3JjLCBHcmFwaGljc0NvbnRleHQqIGNvbnRleHQpCit7CisgICAg
QVNTRVJUKG1fc3RhdGUpOworICAgIHN3aXRjaCAobV9zdGF0ZS0+bV9pbWFnZUludGVycG9sYXRp
b25RdWFsaXR5KSB7CisgICAgY2FzZSBJbnRlcnBvbGF0aW9uTm9uZToKKyAgICBjYXNlIEludGVy
cG9sYXRpb25Mb3c6CisgICAgICAgIHBzX3NldF9maWx0ZXIobV9jb250ZXh0LmdldCgpLCBGSUxU
RVJfTkVBUkVTVCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSW50ZXJwb2xhdGlvbk1lZGl1
bToKKyAgICBjYXNlIEludGVycG9sYXRpb25IaWdoOgorICAgICAgICBwc19zZXRfZmlsdGVyKG1f
Y29udGV4dC5nZXQoKSwgRklMVEVSX0JJTElORUFSKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBJbnRlcnBvbGF0aW9uRGVmYXVsdDoKKyAgICAgICAgcHNfc2V0X2ZpbHRlcihtX2NvbnRleHQu
Z2V0KCksIEZJTFRFUl9CSUxJTkVBUik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHBz
X3JlY3QgcmVjdCA9IHtzcmMueCgpLCBzcmMueSgpLCBzcmMud2lkdGgoKSwgc3JjLmhlaWdodCgp
fTsKKyAgICBwc19pbWFnZSogcGltZyA9IHBzX2ltYWdlX2NyZWF0ZV9mcm9tX2ltYWdlKGltYWdl
LCAmcmVjdCk7CisgICAgZHJhd0ltYWdlKG1fY29udGV4dC5nZXQoKSwgcGltZywgZHN0LCBnbG9i
YWxBbHBoYSgpKTsKKyAgICBwc19pbWFnZV91bnJlZihwaW1nKTsKK30KKwordm9pZCBQbGF0Zm9y
bUNvbnRleHRQUzo6c2V0SW1hZ2VJbnRlcnBvbGF0aW9uUXVhbGl0eShJbnRlcnBvbGF0aW9uUXVh
bGl0eSBxdWFsaXR5KQoreworICAgIEFTU0VSVChtX3N0YXRlKTsKKyAgICBtX3N0YXRlLT5tX2lt
YWdlSW50ZXJwb2xhdGlvblF1YWxpdHkgPSBxdWFsaXR5OworfQorCitJbnRlcnBvbGF0aW9uUXVh
bGl0eSBQbGF0Zm9ybUNvbnRleHRQUzo6aW1hZ2VJbnRlcnBvbGF0aW9uUXVhbGl0eSgpIGNvbnN0
Cit7CisgICAgQVNTRVJUKG1fc3RhdGUpOworICAgIHJldHVybiBtX3N0YXRlLT5tX2ltYWdlSW50
ZXJwb2xhdGlvblF1YWxpdHk7Cit9CisKKworZmxvYXQgUGxhdGZvcm1Db250ZXh0UFM6Omdsb2Jh
bEFscGhhKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9zdGF0ZS0+bV9nbG9iYWxBbHBoYTsKK30K
Kwordm9pZCBQbGF0Zm9ybUNvbnRleHRQUzo6c2V0R2xvYmFsQWxwaGEoZmxvYXQgZ2xvYmFsQWxw
aGEpCit7CisgICAgbV9zdGF0ZS0+bV9nbG9iYWxBbHBoYSA9IGdsb2JhbEFscGhhOworfQorCitz
dGF0aWMgdm9pZCBwcmVwYXJlQ29udGV4dFNvdXJjZShwc19jb250ZXh0KiBnYywgUGF0dGVybiog
cGF0dGVybiwgR3JhZGllbnQqIGdyYWRpZW50LCAKKwkJCQkJCQljb25zdCBDb2xvciYgY29sb3Is
IGZsb2F0IGdsb2JhbEFscGhhKQoreworICAgIGlmIChwYXR0ZXJuKSB7CisgICAgICAgIHBzX3Nl
dF9zb3VyY2VfcGF0dGVybihnYywgcGF0dGVybi0+Y3JlYXRlUGxhdGZvcm1QYXR0ZXJuKEFmZmlu
ZVRyYW5zZm9ybSgpKSk7CisgICAgfSBlbHNlIGlmIChncmFkaWVudCkKKyAgICAgICAgcHNfc2V0
X3NvdXJjZV9ncmFkaWVudChnYywgZ3JhZGllbnQtPnBsYXRmb3JtR3JhZGllbnQoZ2xvYmFsQWxw
aGEpKTsKKyAgICBlbHNlIHsgLy8gU29saWQgY29sb3Igc291cmNlLgorICAgICAgICBpZiAoZ2xv
YmFsQWxwaGEgPCAxKQorICAgICAgICAgICAgc2V0U291cmNlUkdCQUZyb21Db2xvcihnYywgY29s
b3JXaXRoT3ZlcnJpZGVBbHBoYShjb2xvci5yZ2IoKSwgY29sb3IuYWxwaGEoKS8yNTUuZipnbG9i
YWxBbHBoYSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBzZXRTb3VyY2VSR0JBRnJvbUNv
bG9yKGdjLCBjb2xvcik7CisgICAgfQorfQorCit2b2lkIFBsYXRmb3JtQ29udGV4dFBTOjpwcmVw
YXJlRm9yRmlsbGluZyhjb25zdCBHcmFwaGljc0NvbnRleHRTdGF0ZSYgc3RhdGUsIFBhdHRlcm5B
ZGp1c3RtZW50IHBhdHRlcm5BZGp1c3RtZW50KQoreworICAgIHBzX3NldF9maWxsX3J1bGUobV9j
b250ZXh0LmdldCgpLCBzdGF0ZS5maWxsUnVsZSA9PSBSVUxFX0VWRU5PREQgPyBGSUxMX1JVTEVf
RVZFTl9PREQgOiBGSUxMX1JVTEVfV0lORElORyk7CisgICAgcHJlcGFyZUNvbnRleHRTb3VyY2Uo
bV9jb250ZXh0LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuZmls
bFBhdHRlcm4uZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5maWxs
R3JhZGllbnQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5maWxs
Q29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuQWRqdXN0bWVudCA9
PSBBZGp1c3RQYXR0ZXJuRm9yR2xvYmFsQWxwaGEgPyBnbG9iYWxBbHBoYSgpIDogMSk7CisKKyAg
ICBpZiAoc3RhdGUuZmlsbFBhdHRlcm4pCisgICAgICAgIGNsaXBGb3JGaWxsaW5nKHN0YXRlKTsK
K30KKwordm9pZCBQbGF0Zm9ybUNvbnRleHRQUzo6cHJlcGFyZUZvclN0cm9raW5nKGNvbnN0IEdy
YXBoaWNzQ29udGV4dFN0YXRlJiBzdGF0ZSwgQWxwaGFQcmVzZXJ2YXRpb24gYWxwaGFQcmVzZXJ2
YXRpb24pCit7CisgICAgcHJlcGFyZUNvbnRleHRTb3VyY2UobV9jb250ZXh0LmdldCgpLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3Ryb2tlUGF0dGVybi5nZXQoKSwKKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0cm9rZUdyYWRpZW50LmdldCgpLAor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3Ryb2tlQ29sb3IsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBhbHBoYVByZXNlcnZhdGlvbiA9PSBQcmVzZXJ2ZUFscGhh
ID8gZ2xvYmFsQWxwaGEoKSA6IDEpOworfQorCit2b2lkIFBsYXRmb3JtQ29udGV4dFBTOjpjbGlw
Rm9yRmlsbGluZyhjb25zdCBHcmFwaGljc0NvbnRleHRTdGF0ZSYgc3RhdGUpCit7CisgICAgQVNT
RVJUKHN0YXRlLmZpbGxQYXR0ZXJuKTsKKworICAgIEZsb2F0UmVjdCBjbGlwUmVjdDsKKworICAg
IEltYWdlKiBwYXR0ZXJuSW1hZ2UgPSBzdGF0ZS5maWxsUGF0dGVybi0+dGlsZUltYWdlKCk7Cisg
ICAgQVNTRVJUKHBhdHRlcm5JbWFnZSk7CisgICAgY29uc3QgQWZmaW5lVHJhbnNmb3JtJiBwYXR0
ZXJuVHJhbnNmb3JtID0gc3RhdGUuZmlsbFBhdHRlcm4tPmdldFBhdHRlcm5TcGFjZVRyYW5zZm9y
bSgpOworICAgIEZsb2F0UmVjdCBwYXR0ZXJuUmVjdCA9IHBhdHRlcm5UcmFuc2Zvcm0ubWFwUmVj
dChGbG9hdFJlY3QoMCwgMCwgcGF0dGVybkltYWdlLT53aWR0aCgpLCBwYXR0ZXJuSW1hZ2UtPmhl
aWdodCgpKSk7CisKKyAgICBib29sIHJlcGVhdFggPSBzdGF0ZS5maWxsUGF0dGVybi0+cmVwZWF0
WCgpOworICAgIGJvb2wgcmVwZWF0WSA9IHN0YXRlLmZpbGxQYXR0ZXJuLT5yZXBlYXRZKCk7CisK
KyAgICBpZiAoIXJlcGVhdFgpIHsKKyAgICAgICAgY2xpcFJlY3Quc2V0WChwYXR0ZXJuUmVjdC54
KCkpOworICAgICAgICBjbGlwUmVjdC5zZXRXaWR0aChwYXR0ZXJuUmVjdC53aWR0aCgpKTsKKyAg
ICB9CisgICAgaWYgKCFyZXBlYXRZKSB7CisgICAgICAgIGNsaXBSZWN0LnNldFkocGF0dGVyblJl
Y3QueSgpKTsKKyAgICAgICAgY2xpcFJlY3Quc2V0SGVpZ2h0KHBhdHRlcm5SZWN0LmhlaWdodCgp
KTsKKyAgICB9CisgICAgaWYgKCFyZXBlYXRYIHx8ICFyZXBlYXRZKSB7CisgICAgICAgIHBzX3Jl
Y3QgcmVjdCA9IHtjbGlwUmVjdC54KCksIGNsaXBSZWN0LnkoKSwgY2xpcFJlY3Qud2lkdGgoKSwg
Y2xpcFJlY3QuaGVpZ2h0KCl9OworICAgICAgICBwc19jbGlwX3JlY3QobV9jb250ZXh0LmdldCgp
LCAmcmVjdCk7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLXVyTiBT
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL1BsYXRmb3JtQ29udGV4dFBT
LmggU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9QbGF0Zm9ybUNvbnRl
eHRQUy5oCi0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL1BsYXRm
b3JtQ29udGV4dFBTLmgJMTk3MC0wMS0wMSAwODowMDowMC4wMDAwMDAwMDAgKzA4MDAKKysrIFNv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vUGxhdGZvcm1Db250ZXh0UFMu
aAkyMDEyLTExLTEyIDIwOjE2OjQ5LjAwMDAwMDAwMCArMDgwMApAQCAtMCwwICsxLDg0IEBACisv
KgorICogQ29weXJpZ2h0IChjKSAyMDEyIFpoYW5nIEppIFBlbmcgPG9uZWNvb2x4QGdtYWlsLmNv
bT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENP
TVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09N
UFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI2lmbmRlZiBQbGF0Zm9ybUNvbnRleHRQU19oCisjZGVmaW5lIFBsYXRmb3Jt
Q29udGV4dFBTX2gKKworI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIlJl
ZlB0clBTLmgiCisjaW5jbHVkZSAiU2hhZG93Qmx1ci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK3N0cnVjdCBHcmFwaGljc0NvbnRleHRTdGF0ZTsKKworLy8gTXVjaCBsaWtlIFBsYXRmb3Jt
Q29udGV4dFNraWEgaW4gdGhlIFNraWEgcG9ydCwgdGhpcyBjbGFzcyBob2xkcyBpbmZvcm1hdGlv
biB0aGF0CisvLyB3b3VsZCBub3JtYWxseSBiZSBwcml2YXRlIHRvIEdyYXBoaWNzQ29udGV4dCwg
ZXhjZXB0IHRoYXQgd2Ugd2FudCB0byBhbGxvdyBhY2Nlc3MKKy8vIHRvIGl0IGluIEZvbnQgYW5k
IEltYWdlIGNvZGUuIFRoaXMgYWxsb3dzIHVzIHRvIHNlcGFyYXRlIHRoZSBjb25jZXJucyBvZiBD
YWlyby1zcGVjaWZpYworLy8gY29kZSBmcm9tIHRoZSBwbGF0Zm9ybS1pbmRlcGVuZGVudCBHcmFw
aGljc0NvbnRleHQuCisKK2NsYXNzIFBsYXRmb3JtQ29udGV4dFBTIHsKKyAgICBXVEZfTUFLRV9O
T05DT1BZQUJMRShQbGF0Zm9ybUNvbnRleHRQUyk7CitwdWJsaWM6CisgICAgUGxhdGZvcm1Db250
ZXh0UFMocHNfY29udGV4dCopOworICAgIH5QbGF0Zm9ybUNvbnRleHRQUygpOworCisgICAgcHNf
Y29udGV4dCogY29udGV4dCgpIHsgcmV0dXJuIG1fY29udGV4dC5nZXQoKTsgfQorICAgIHZvaWQg
c2V0Q29udGV4dChwc19jb250ZXh0KiBjb250ZXh0KSB7IG1fY29udGV4dCA9IGNvbnRleHQ7IH0K
KworICAgIFNoYWRvd0JsdXImIHNoYWRvd0JsdXIoKSB7IHJldHVybiBtX3NoYWRvd0JsdXI7IH0K
KworICAgIHZvaWQgc2F2ZSgpOworICAgIHZvaWQgcmVzdG9yZSgpOworICAgIHZvaWQgc2V0R2xv
YmFsQWxwaGEoZmxvYXQpOworICAgIGZsb2F0IGdsb2JhbEFscGhhKCkgY29uc3Q7CisKKyAgICB2
b2lkIGRyYXdJbWFnZVRvQ29udGV4dChwc19pbWFnZSosIGNvbnN0IEZsb2F0UmVjdCYgZGVzdFJl
Y3QsIGNvbnN0IEZsb2F0UmVjdCYgc3JjUmVjdCwgR3JhcGhpY3NDb250ZXh0Kik7CisKKyAgICB2
b2lkIHNldEltYWdlSW50ZXJwb2xhdGlvblF1YWxpdHkoSW50ZXJwb2xhdGlvblF1YWxpdHkpOwor
ICAgIEludGVycG9sYXRpb25RdWFsaXR5IGltYWdlSW50ZXJwb2xhdGlvblF1YWxpdHkoKSBjb25z
dDsKKworICAgIGVudW0gUGF0dGVybkFkanVzdG1lbnQgeyBOb0FkanVzdG1lbnQsIEFkanVzdFBh
dHRlcm5Gb3JHbG9iYWxBbHBoYSB9OworICAgIHZvaWQgcHJlcGFyZUZvckZpbGxpbmcoY29uc3Qg
R3JhcGhpY3NDb250ZXh0U3RhdGUmLCBQYXR0ZXJuQWRqdXN0bWVudCk7CisKKyAgICBlbnVtIEFs
cGhhUHJlc2VydmF0aW9uIHsgRG9Ob3RQcmVzZXJ2ZUFscGhhLCBQcmVzZXJ2ZUFscGhhIH07Cisg
ICAgdm9pZCBwcmVwYXJlRm9yU3Ryb2tpbmcoY29uc3QgR3JhcGhpY3NDb250ZXh0U3RhdGUmLCBB
bHBoYVByZXNlcnZhdGlvbiA9IFByZXNlcnZlQWxwaGEpOworCitwcml2YXRlOgorICAgIHZvaWQg
Y2xpcEZvckZpbGxpbmcoY29uc3QgR3JhcGhpY3NDb250ZXh0U3RhdGUmKTsKKworICAgIFJlZlB0
cjxwc19jb250ZXh0PiBtX2NvbnRleHQ7CisKKyAgICBjbGFzcyBTdGF0ZTsKKyAgICBTdGF0ZSog
bV9zdGF0ZTsKKyAgICBXVEY6OlZlY3RvcjxTdGF0ZT4gbV9zdGF0ZVN0YWNrOworCisgICAgU2hh
ZG93Qmx1ciBtX3NoYWRvd0JsdXI7CisKK307CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKwor
I2VuZGlmIC8vIFBsYXRmb3JtQ29udGV4dFBTX2gKZGlmZiAtdXJOIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vUGxhdGZvcm1QYXRoUFMuY3BwIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vUGxhdGZvcm1QYXRoUFMuY3BwCi0tLSBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL1BsYXRmb3JtUGF0aFBTLmNwcAkxOTcw
LTAxLTAxIDA4OjAwOjAwLjAwMDAwMDAwMCArMDgwMAorKysgU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvcGljYXNzby9QbGF0Zm9ybVBhdGhQUy5jcHAJMjAxMi0xMS0xMiAyMDoxNjo0
OS4wMDAwMDAwMDAgKzA4MDAKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykg
MjAxMiBaaGFuZyBKaSBQZW5nIDxvbmVjb29seEBnbWFpbC5jb20+CisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICog
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRp
b24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRl
ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5Z
IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNI
QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUg
R05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4K
KyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2Vl
IHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwK
KyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJQbGF0Zm9ybVBhdGhQUy5oIgorCisjaW5jbHVkZSA8cGljYXNzby5oPgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKKworUGljYXNzb1BhdGg6OlBpY2Fzc29QYXRoKCkKKyAg
ICA6IG1fcGF0aChhZG9wdFJlZihwc19wYXRoX2NyZWF0ZSgpKSkKK3sKK30KKworfQpkaWZmIC11
ck4gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9QbGF0Zm9ybVBhdGhQ
Uy5oIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28vUGxhdGZvcm1QYXRo
UFMuaAotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9QbGF0Zm9y
bVBhdGhQUy5oCTE5NzAtMDEtMDEgMDg6MDA6MDAuMDAwMDAwMDAwICswODAwCisrKyBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL1BsYXRmb3JtUGF0aFBTLmgJMjAxMi0x
MS0xMiAyMDoxNjo0OS4wMDAwMDAwMDAgKzA4MDAKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENv
cHlyaWdodCAoYykgMjAxMiBaaGFuZyBKaSBQZW5nIDxvbmVjb29seEBnbWFpbC5jb20+CisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMg
bGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICog
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5k
ZWYgUGxhdGZvcm1QYXRoUFNfaAorI2RlZmluZSBQbGF0Zm9ybVBhdGhQU19oCisKKyNpbmNsdWRl
ICJSZWZQdHJQUy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNzIFBpY2Fzc29QYXRo
IHsKK3B1YmxpYzoKKyAgICBQaWNhc3NvUGF0aCgpOworCisgICAgflBpY2Fzc29QYXRoKCkge30K
KworICAgIHBzX3BhdGgqIHBhdGgoKSB7IHJldHVybiBtX3BhdGguZ2V0KCk7IH0KKworcHVibGlj
OgorICAgIFJlZlB0cjxwc19wYXRoPiBtX3BhdGg7Cit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCisKKyNlbmRpZiAvLyBQbGF0Zm9ybVBhdGhQU19oCmRpZmYgLXVyTiBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL1BTVXRpbGl0aWVzLmNwcCBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL1BTVXRpbGl0aWVzLmNwcAotLS0gU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9QU1V0aWxpdGllcy5jcHAJMTk3MC0wMS0w
MSAwODowMDowMC4wMDAwMDAwMDAgKzA4MDAKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3BpY2Fzc28vUFNVdGlsaXRpZXMuY3BwCTIwMTItMTEtMTIgMjA6MjI6MjcuMDAwMDAw
MDAwICswODAwCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIFpo
YW5nIEppIFBlbmcgPG9uZWNvb2x4QGdtYWlsLmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiUFNVdGlsaXRpZXMuaCIKKworI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9y
bS5oIgorI2luY2x1ZGUgIkNvbG9yLmgiCisjaW5jbHVkZSAiRmxvYXRQb2ludC5oIgorI2luY2x1
ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIkludFJlY3QuaCIKKyNpbmNsdWRlICJPd25QdHJQ
Uy5oIgorI2luY2x1ZGUgIlBhdGguaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVBhdGhQUy5oIgorI2lu
Y2x1ZGUgIlJlZlB0clBTLmgiCisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK3N0YXRpYyBwc19jb250ZXh0KiBnX2NvbnRleHQgPSAwOworc3RhdGljIHBz
X2NhbnZhcyogZ19jYW52YXMgPSAwOworCitzdGF0aWMgYm9vbCBjb250ZXh0X2luaXQgPSBmYWxz
ZTsKK3N0YXRpYyB2b2lkIGdsb2JhbF9jb250ZXh0X2luaXQodm9pZCkKK3sKKyAgICBnX2NhbnZh
cyA9IHBzX2NhbnZhc19jcmVhdGUoQ09MT1JfRk9STUFUX0FSR0IsIDEwLCAxMCk7CisgICAgZ19j
b250ZXh0ID0gcHNfY29udGV4dF9jcmVhdGUoZ19jYW52YXMpOworICAgIGNvbnRleHRfaW5pdCA9
IHRydWU7Cit9CisKK3BzX2NvbnRleHQqIGdldEdsb2JhbENvbnRleHQodm9pZCkKK3sKKyAgICBp
ZiAoIWNvbnRleHRfaW5pdCkKKwlnbG9iYWxfY29udGV4dF9pbml0KCk7CisKKyAgICByZXR1cm4g
Z19jb250ZXh0OworfQorCit2b2lkIHNldFNvdXJjZVJHQkFGcm9tQ29sb3IocHNfY29udGV4dCog
Y29udGV4dCwgY29uc3QgQ29sb3ImIGNvbG9yKQoreworICAgIGZsb2F0IHJlZCwgZ3JlZW4sIGJs
dWUsIGFscGhhOworICAgIGNvbG9yLmdldFJHQkEocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOwor
ICAgIHBzX2NvbG9yIGMgPSB7cmVkLCBncmVlbiwgYmx1ZSwgYWxwaGF9OworICAgIHBzX3NldF9z
b3VyY2VfY29sb3IoY29udGV4dCwgJmMpOworfQorCit2b2lkIGFwcGVuZFBhdGhUb0NvbnRleHQo
cHNfY29udGV4dCogZ2MsIHBzX3BhdGgqIHBhdGgpCit7CisgICAgcHNfc2V0X3BhdGgoZ2MsIHBh
dGgpOworfQorCit2b2lkIHNldFBhdGhPbkNvbnRleHQocHNfY29udGV4dCogZ2MsIHBzX3BhdGgq
IHBhdGgpCit7CisgICAgcHNfbmV3X3BhdGgoZ2MpOworICAgIGFwcGVuZFBhdGhUb0NvbnRleHQo
Z2MsIHBhdGgpOworfQorCit2b2lkIGFwcGVuZFdlYkNvcmVQYXRoVG9Db250ZXh0KHBzX2NvbnRl
eHQqIGNvbnRleHQsIGNvbnN0IFBhdGgmIHBhdGgpCit7CisgICAgaWYgKHBhdGguaXNFbXB0eSgp
KQorICAgICAgICByZXR1cm47CisgICAgYXBwZW5kUGF0aFRvQ29udGV4dChjb250ZXh0LCBwYXRo
LnBsYXRmb3JtUGF0aCgpLT5wYXRoKCkpOworfQorCitwc19jb21wb3NpdGUgdG9Db21wb3NpdGUo
Q29tcG9zaXRlT3BlcmF0b3Igb3ApCit7CisgICAgc3dpdGNoIChvcCkgeworICAgIGNhc2UgQ29t
cG9zaXRlQ2xlYXI6CisgICAgICAgIHJldHVybiBDT01QT1NJVEVfQ0xFQVI7CisgICAgY2FzZSBD
b21wb3NpdGVDb3B5OgorICAgICAgICByZXR1cm4gQ09NUE9TSVRFX1NSQzsKKyAgICBjYXNlIENv
bXBvc2l0ZVNvdXJjZU92ZXI6CisgICAgICAgIHJldHVybiBDT01QT1NJVEVfU1JDX09WRVI7Cisg
ICAgY2FzZSBDb21wb3NpdGVTb3VyY2VJbjoKKyAgICAgICAgcmV0dXJuIENPTVBPU0lURV9TUkNf
SU47CisgICAgY2FzZSBDb21wb3NpdGVTb3VyY2VPdXQ6CisgICAgICAgIHJldHVybiBDT01QT1NJ
VEVfU1JDX09VVDsKKyAgICBjYXNlIENvbXBvc2l0ZVNvdXJjZUF0b3A6CisgICAgICAgIHJldHVy
biBDT01QT1NJVEVfU1JDX0FUT1A7CisgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbk92ZXI6
CisgICAgICAgIHJldHVybiBDT01QT1NJVEVfRFNUX09WRVI7CisgICAgY2FzZSBDb21wb3NpdGVE
ZXN0aW5hdGlvbkluOgorICAgICAgICByZXR1cm4gQ09NUE9TSVRFX0RTVF9JTjsKKyAgICBjYXNl
IENvbXBvc2l0ZURlc3RpbmF0aW9uT3V0OgorICAgICAgICByZXR1cm4gQ09NUE9TSVRFX0RTVF9P
VVQ7CisgICAgY2FzZSBDb21wb3NpdGVEZXN0aW5hdGlvbkF0b3A6CisgICAgICAgIHJldHVybiBD
T01QT1NJVEVfRFNUX0FUT1A7CisgICAgY2FzZSBDb21wb3NpdGVYT1I6CisgICAgICAgIHJldHVy
biBDT01QT1NJVEVfWE9SOworICAgIGNhc2UgQ29tcG9zaXRlUGx1c0RhcmtlcjoKKyAgICAgICAg
cmV0dXJuIENPTVBPU0lURV9EQVJLRU47CisgICAgY2FzZSBDb21wb3NpdGVQbHVzTGlnaHRlcjoK
KyAgICAgICAgcmV0dXJuIENPTVBPU0lURV9MSUdIVEVOOworICAgIGNhc2UgQ29tcG9zaXRlRGlm
ZmVyZW5jZToKKyAgICAgICAgcmV0dXJuIENPTVBPU0lURV9ESUZGRVJFTkNFOworICAgIGRlZmF1
bHQ6CisgICAgICAgIHJldHVybiBDT01QT1NJVEVfU1JDX09WRVI7CisgICAgfQorfQorCitQYXNz
UmVmUHRyPHBzX2ltYWdlPiBjb3B5SW1hZ2VDYW52YXMocHNfY2FudmFzKiBjYW52YXMpCit7Cisg
ICAgcHNfY2FudmFzICogbmV3X2NhbnZhcyA9IHBzX2NhbnZhc19jcmVhdGVfY29tcGF0aWJsZShj
YW52YXMsIDAsIDApOyAKKyAgICBwc19jYW52YXNfYml0Ymx0KGNhbnZhcywgMCwgbmV3X2NhbnZh
cywgMCk7CisgICAgUmVmUHRyPHBzX2ltYWdlPiBuZXdJbWFnZSA9IGFkb3B0UmVmKHBzX2ltYWdl
X2NyZWF0ZV9mcm9tX2NhbnZhcyhuZXdfY2FudmFzLCAwKSk7CisgICAgcHNfY2FudmFzX3VucmVm
KG5ld19jYW52YXMpOworICAgIHJldHVybiBuZXdJbWFnZS5yZWxlYXNlKCk7Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtdXJOIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3BpY2Fzc28vUFNVdGlsaXRpZXMuaCBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9waWNhc3NvL1BTVXRpbGl0aWVzLmgKLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL3BpY2Fzc28vUFNVdGlsaXRpZXMuaAkxOTcwLTAxLTAxIDA4OjAwOjAwLjAwMDAwMDAwMCAr
MDgwMAorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9QU1V0aWxp
dGllcy5oCTIwMTItMTEtMTIgMjA6MTk6MTIuMDAwMDAwMDAwICswODAwCkBAIC0wLDAgKzEsNDkg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIgWmhhbmcgSmkgUGVuZyA8b25lY29vbHhAZ21h
aWwuY29tPgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLgorICovCisKKyNpZm5kZWYgUFNVdGlsaXRpZXNfaAorI2RlZmluZSBQU1V0aWxpdGll
c19oCisKKyNpbmNsdWRlICJHcmFwaGljc1R5cGVzLmgiCisjaW5jbHVkZSA8cGljYXNzby5oPgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBBZmZpbmVUcmFuc2Zvcm07CitjbGFzcyBDb2xv
cjsKK2NsYXNzIEZsb2F0UmVjdDsKK2NsYXNzIEZsb2F0UG9pbnQ7CitjbGFzcyBJbnRTaXplOwor
Y2xhc3MgSW50UmVjdDsKK2NsYXNzIFBhdGg7CisKK3ZvaWQgc2V0UGF0aE9uQ29udGV4dChwc19j
b250ZXh0KiBjb250ZXh0LCBwc19wYXRoKiBwYXRoKTsKK3ZvaWQgYXBwZW5kV2ViQ29yZVBhdGhU
b0NvbnRleHQocHNfY29udGV4dCogY29udGV4dCwgY29uc3QgUGF0aCYgcGF0aCk7Cit2b2lkIHNl
dFNvdXJjZVJHQkFGcm9tQ29sb3IocHNfY29udGV4dCosIGNvbnN0IENvbG9yJik7Citwc19jb21w
b3NpdGUgdG9Db21wb3NpdGUoQ29tcG9zaXRlT3BlcmF0b3Igb3ApOworUGFzc1JlZlB0cjxwc19p
bWFnZT4gY29weUltYWdlQ2FudmFzKHBzX2NhbnZhcyopOworcHNfY29udGV4dCogZ2V0R2xvYmFs
Q29udGV4dCh2b2lkKTsKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFBTVXRp
bGl0aWVzX2gKZGlmZiAtdXJOIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fz
c28vUmVmUHRyUFMuY3BwIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3BpY2Fzc28v
UmVmUHRyUFMuY3BwCi0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3Nv
L1JlZlB0clBTLmNwcAkxOTcwLTAxLTAxIDA4OjAwOjAwLjAwMDAwMDAwMCArMDgwMAorKysgU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9SZWZQdHJQUy5jcHAJMjAxMi0x
MS0xMiAyMDoxNjo0OS4wMDAwMDAwMDAgKzA4MDAKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqICBD
b3B5cmlnaHQgKGMpIDIwMTIgWmhhbmcgSmkgUGVuZyA8b25lY29vbHhAZ21haWwuY29tPgorICoK
KyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg
aXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3Nl
ciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg
KiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv
cHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdp
dGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAg
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9u
LCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIlJlZlB0clBTLmgiCisKKyNpbmNsdWRlIDxwaWNhc3NvLmg+CisKK25hbWVzcGFjZSBXVEYg
eworCit0ZW1wbGF0ZTw+IHZvaWQgcmVmSWZOb3ROdWxsKHBzX2NvbnRleHQqIHB0cikKK3sKKyAg
ICBpZiAoTElLRUxZKHB0ciAhPSAwKSkKKyAgICAgICAgcHNfY29udGV4dF9yZWYocHRyKTsKK30K
KwordGVtcGxhdGU8PiB2b2lkIGRlcmVmSWZOb3ROdWxsKHBzX2NvbnRleHQqIHB0cikKK3sKKyAg
ICBpZiAoTElLRUxZKHB0ciAhPSAwKSkKKyAgICAgICAgcHNfY29udGV4dF91bnJlZihwdHIpOwor
fQorCit0ZW1wbGF0ZTw+IHZvaWQgcmVmSWZOb3ROdWxsKHBzX2ltYWdlKiBwdHIpCit7CisgICAg
aWYgKExJS0VMWShwdHIgIT0gMCkpCisgICAgICAgIHBzX2ltYWdlX3JlZihwdHIpOworfQorCit0
ZW1wbGF0ZTw+IHZvaWQgZGVyZWZJZk5vdE51bGwocHNfaW1hZ2UqIHB0cikKK3sKKyAgICBpZiAo
TElLRUxZKHB0ciAhPSAwKSkKKyAgICAgICAgcHNfaW1hZ2VfdW5yZWYocHRyKTsKK30KKwordGVt
cGxhdGU8PiB2b2lkIHJlZklmTm90TnVsbChwc19wYXR0ZXJuKiBwdHIpCit7CisgICAgaWYgKExJ
S0VMWShwdHIgIT0gMCkpCisgICAgICAgIHBzX3BhdHRlcm5fcmVmKHB0cik7Cit9CisKK3RlbXBs
YXRlPD4gdm9pZCBkZXJlZklmTm90TnVsbChwc19wYXR0ZXJuKiBwdHIpCit7CisgICAgaWYgKExJ
S0VMWShwdHIgIT0gMCkpCisgICAgICAgIHBzX3BhdHRlcm5fdW5yZWYocHRyKTsKK30KKwordGVt
cGxhdGU8PiB2b2lkIHJlZklmTm90TnVsbChwc19wYXRoKiBwdHIpCit7CisgICAgaWYgKExJS0VM
WShwdHIgIT0gMCkpCisgICAgICAgIHBzX3BhdGhfcmVmKHB0cik7Cit9CisKK3RlbXBsYXRlPD4g
dm9pZCBkZXJlZklmTm90TnVsbChwc19wYXRoKiBwdHIpCit7CisgICAgaWYgKExJS0VMWShwdHIg
IT0gMCkpCisgICAgICAgIHBzX3BhdGhfdW5yZWYocHRyKTsKK30KKwordGVtcGxhdGU8PiB2b2lk
IHJlZklmTm90TnVsbChwc19mb250KiBwdHIpCit7CisgICAgaWYgKExJS0VMWShwdHIgIT0gMCkp
CisgICAgICAgIHBzX2ZvbnRfcmVmKHB0cik7Cit9CisKK3RlbXBsYXRlPD4gdm9pZCBkZXJlZklm
Tm90TnVsbChwc19mb250KiBwdHIpCit7CisgICAgaWYgKExJS0VMWShwdHIgIT0gMCkpCisgICAg
ICAgIHBzX2ZvbnRfdW5yZWYocHRyKTsKK30KKworfQpkaWZmIC11ck4gU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9SZWZQdHJQUy5oIFNvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3BpY2Fzc28vUmVmUHRyUFMuaAotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvcGljYXNzby9SZWZQdHJQUy5oCTE5NzAtMDEtMDEgMDg6MDA6MDAuMDAwMDAw
MDAwICswODAwCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL1Jl
ZlB0clBTLmgJMjAxMi0xMS0xMiAyMDoxNjo0OS4wMDAwMDAwMDAgKzA4MDAKQEAgLTAsMCArMSw1
MCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKGMpIDIwMTIgWmhhbmcgSmkgUGVuZyA8b25lY29vbHhA
Z21haWwuY29tPgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIg
b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisg
KgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp
bGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBo
YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5M
SUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg
SW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAy
MTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIFJlZlB0clBTX2gKKyNkZWZpbmUgUmVmUHRy
UFNfaAorCisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorCit0eXBlZGVmIHN0cnVjdCBfcHNfY29u
dGV4dCBwc19jb250ZXh0OwordHlwZWRlZiBzdHJ1Y3QgX3BzX2ltYWdlIHBzX2ltYWdlOwordHlw
ZWRlZiBzdHJ1Y3QgX3BzX3BhdHRlcm4gcHNfcGF0dGVybjsKK3R5cGVkZWYgc3RydWN0IF9wc19w
YXRoIHBzX3BhdGg7Cit0eXBlZGVmIHN0cnVjdCBfcHNfZm9udCBwc19mb250OworCituYW1lc3Bh
Y2UgV1RGIHsKKwordGVtcGxhdGU8PiB2b2lkIHJlZklmTm90TnVsbChwc19jb250ZXh0KiBwdHIp
OwordGVtcGxhdGU8PiB2b2lkIGRlcmVmSWZOb3ROdWxsKHBzX2NvbnRleHQqIHB0cik7CisKK3Rl
bXBsYXRlPD4gdm9pZCByZWZJZk5vdE51bGwocHNfaW1hZ2UqIHB0cik7Cit0ZW1wbGF0ZTw+IHZv
aWQgZGVyZWZJZk5vdE51bGwocHNfaW1hZ2UqIHB0cik7CisKK3RlbXBsYXRlPD4gdm9pZCByZWZJ
Zk5vdE51bGwocHNfcGF0dGVybiogcHRyKTsKK3RlbXBsYXRlPD4gdm9pZCBkZXJlZklmTm90TnVs
bChwc19wYXR0ZXJuKiBwdHIpOworCit0ZW1wbGF0ZTw+IHZvaWQgcmVmSWZOb3ROdWxsKHBzX3Bh
dGgqKTsKK3RlbXBsYXRlPD4gdm9pZCBkZXJlZklmTm90TnVsbChwc19wYXRoKik7CisKK3RlbXBs
YXRlPD4gdm9pZCByZWZJZk5vdE51bGwocHNfZm9udCopOwordGVtcGxhdGU8PiB2b2lkIGRlcmVm
SWZOb3ROdWxsKHBzX2ZvbnQqKTsKKworfQorCisjZW5kaWYgLy8gUmVmUHRyUFNfaApkaWZmIC11
ck4gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNzby9TaW1wbGVGb250RGF0
YVBTLmNwcCBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL1NpbXBsZUZv
bnREYXRhUFMuY3BwCi0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3Nv
L1NpbXBsZUZvbnREYXRhUFMuY3BwCTE5NzAtMDEtMDEgMDg6MDA6MDAuMDAwMDAwMDAwICswODAw
CisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL1NpbXBsZUZvbnRE
YXRhUFMuY3BwCTIwMTItMTEtMTIgMjA6MTg6NDQuMDAwMDAwMDAwICswODAwCkBAIC0wLDAgKzEs
MTUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyIFpoYW5nIEppIFBlbmcgPG9uZWNvb2x4
QGdtYWlsLmNvbT4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBs
ZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk
IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlz
IHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRP
UlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
CisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgorCisjaW5jbHVkZSAiUFNVdGlsaXRpZXMu
aCIKKyNpbmNsdWRlICJGbG9hdENvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIK
KyNpbmNsdWRlICJGb250LmgiCisjaW5jbHVkZSAiRm9udENhY2hlLmgiCisjaW5jbHVkZSAiRm9u
dERlc2NyaXB0aW9uLmgiCisjaW5jbHVkZSAiR2x5cGhCdWZmZXIuaCIKKyNpbmNsdWRlIDxwaWNh
c3NvLmg+CisjaW5jbHVkZSA8dW5pY29kZS9ub3JtbHpyLmg+CisjaW5jbHVkZSA8d3RmL01hdGhF
eHRyYXMuaD4KKyNpbmNsdWRlIDx3dGYvdW5pY29kZS9Vbmljb2RlLmg+CisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKwordm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKK3sKKyAgICBp
ZiAoIW1fcGxhdGZvcm1EYXRhLm1fc2l6ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgcHNfZm9u
dF9pbmZvIGluZm87CisgICAgcHNfZm9udCogZiA9IHBzX3NldF9mb250KGdldEdsb2JhbENvbnRl
eHQoKSwgbV9wbGF0Zm9ybURhdGEuZm9udCgpKTsKKyAgICBwc19nZXRfZm9udF9pbmZvKGdldEds
b2JhbENvbnRleHQoKSwgJmluZm8pOworCisgICAgZmxvYXQgYXNjZW50ID0gbmFycm93UHJlY2lz
aW9uVG9GbG9hdChpbmZvLmFzY2VudCk7CisgICAgZmxvYXQgZGVzY2VudCA9IG5hcnJvd1ByZWNp
c2lvblRvRmxvYXQoaW5mby5kZXNjZW50KTsKKyAgICBmbG9hdCBsaW5lR2FwID0gMzsKKworICAg
IG1fZm9udE1ldHJpY3Muc2V0QXNjZW50KGFzY2VudCk7CisgICAgbV9mb250TWV0cmljcy5zZXRE
ZXNjZW50KGRlc2NlbnQpOworCisgICAgLy8gTWF0Y2ggQ29yZUdyYXBoaWNzIG1ldHJpY3MuCisg
ICAgbV9mb250TWV0cmljcy5zZXRMaW5lU3BhY2luZyhscm91bmRmKGFzY2VudCkgKyBscm91bmRm
KGRlc2NlbnQpICsgbHJvdW5kZihsaW5lR2FwKSk7CisgICAgbV9mb250TWV0cmljcy5zZXRMaW5l
R2FwKGxpbmVHYXApOworCisgICAgcHNfc2l6ZSBzaXplOworICAgIHNpemUgPSBwc19nZXRfdGV4
dF9leHRlbnQoZ2V0R2xvYmFsQ29udGV4dCgpLCAieCIsIDEpOworICAgIG1fZm9udE1ldHJpY3Mu
c2V0WEhlaWdodChuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0KHNpemUuaCkpOworCisgICAgc2l6ZSA9
IHBzX2dldF90ZXh0X2V4dGVudChnZXRHbG9iYWxDb250ZXh0KCksICIgIiwgMSk7CisgICAgbV9z
cGFjZVdpZHRoID0gbmFycm93UHJlY2lzaW9uVG9GbG9hdChzaXplLncpOworICAgIAorICAgIHBz
X3NldF9mb250KGdldEdsb2JhbENvbnRleHQoKSwgZik7Cit9CisKK3ZvaWQgU2ltcGxlRm9udERh
dGE6OnBsYXRmb3JtQ2hhcldpZHRoSW5pdCgpCit7CisgICAgbV9hdmdDaGFyV2lkdGggPSAwLmY7
CisgICAgbV9tYXhDaGFyV2lkdGggPSAwLmY7CisgICAgaW5pdENoYXJXaWR0aHMoKTsKK30KKwor
dm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1EZXN0cm95KCkKK3sKK30KKworUGFzc1JlZlB0
cjxTaW1wbGVGb250RGF0YT4gU2ltcGxlRm9udERhdGE6OmNyZWF0ZVNjYWxlZEZvbnREYXRhKGNv
bnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uLCBmbG9hdCBzY2FsZUZhY3Rvcikg
Y29uc3QKK3sKKyAgICBBU1NFUlQobV9wbGF0Zm9ybURhdGEuZm9udCgpKTsKKyAgICBpbnQgc21h
bGxDYXBzSGVpZ2h0ID0gbHJvdW5kZihzY2FsZUZhY3RvciAqIGZvbnREZXNjcmlwdGlvbi5jb21w
dXRlZFNpemUoKSk7CisgICAgcHNfZm9udCogaGZvbnQgPSBwc19mb250X2NyZWF0ZV9jb3B5KG1f
cGxhdGZvcm1EYXRhLmZvbnQoKSk7CisgICAgcHNfZm9udF9zZXRfc2l6ZShoZm9udCwgc21hbGxD
YXBzSGVpZ2h0KTsKKyAgICByZXR1cm4gU2ltcGxlRm9udERhdGE6OmNyZWF0ZShGb250UGxhdGZv
cm1EYXRhKGhmb250LCBzY2FsZUZhY3RvciAqIGZvbnREZXNjcmlwdGlvbi5jb21wdXRlZFNpemUo
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1f
cGxhdGZvcm1EYXRhLnN5bnRoZXRpY0JvbGQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIG1fcGxhdGZvcm1EYXRhLnN5bnRoZXRpY09ibGlxdWUo
KSksIGlzQ3VzdG9tRm9udCgpLCBmYWxzZSk7Cit9CisKK1Bhc3NSZWZQdHI8U2ltcGxlRm9udERh
dGE+IFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0YShjb25zdCBGb250RGVzY3JpcHRp
b24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKK3sKKyAgICBpZiAoIW1fZGVyaXZlZEZvbnREYXRh
KQorICAgICAgICBtX2Rlcml2ZWRGb250RGF0YSA9IERlcml2ZWRGb250RGF0YTo6Y3JlYXRlKGlz
Q3VzdG9tRm9udCgpKTsKKyAgICBpZiAoIW1fZGVyaXZlZEZvbnREYXRhLT5zbWFsbENhcHMpCisg
ICAgICAgIG1fZGVyaXZlZEZvbnREYXRhLT5zbWFsbENhcHMgPSBjcmVhdGVTY2FsZWRGb250RGF0
YShmb250RGVzY3JpcHRpb24sIC43KTsKKworICAgIHJldHVybiBtX2Rlcml2ZWRGb250RGF0YS0+
c21hbGxDYXBzOworfQorCitQYXNzUmVmUHRyPFNpbXBsZUZvbnREYXRhPiBTaW1wbGVGb250RGF0
YTo6ZW1waGFzaXNNYXJrRm9udERhdGEoY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3Jp
cHRpb24pIGNvbnN0Cit7CisgICAgaWYgKCFtX2Rlcml2ZWRGb250RGF0YSkKKyAgICAgICAgbV9k
ZXJpdmVkRm9udERhdGEgPSBEZXJpdmVkRm9udERhdGE6OmNyZWF0ZShpc0N1c3RvbUZvbnQoKSk7
CisgICAgaWYgKCFtX2Rlcml2ZWRGb250RGF0YS0+ZW1waGFzaXNNYXJrKQorICAgICAgICBtX2Rl
cml2ZWRGb250RGF0YS0+ZW1waGFzaXNNYXJrID0gY3JlYXRlU2NhbGVkRm9udERhdGEoZm9udERl
c2NyaXB0aW9uLCAuNSk7CisKKyAgICByZXR1cm4gbV9kZXJpdmVkRm9udERhdGEtPmVtcGhhc2lz
TWFyazsKK30KKworYm9vbCBTaW1wbGVGb250RGF0YTo6Y29udGFpbnNDaGFyYWN0ZXJzKGNvbnN0
IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoKSBjb25zdAoreworICAgIHJldHVybiB0cnVl
OworfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpkZXRlcm1pbmVQaXRjaCgpCit7CisgICAgbV90
cmVhdEFzRml4ZWRQaXRjaCA9IGZhbHNlOworfQorCitGbG9hdFJlY3QgU2ltcGxlRm9udERhdGE6
OnBsYXRmb3JtQm91bmRzRm9yR2x5cGgoR2x5cGggZ2x5cGgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IEZsb2F0UmVjdCgpOworfQorCitmbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZv
ckdseXBoKEdseXBoIGdseXBoKSBjb25zdAoreworICAgIGlmICghbV9wbGF0Zm9ybURhdGEuc2l6
ZSgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHBzX2dseXBoIGc7CisgICAgcHNfZm9udCog
ZiA9IHBzX3NldF9mb250KGdldEdsb2JhbENvbnRleHQoKSwgbV9wbGF0Zm9ybURhdGEuZm9udCgp
KTsKKyAgICBpZiAoIXBzX2dldF9nbHlwaChnZXRHbG9iYWxDb250ZXh0KCksIChpbnQpZ2x5cGgs
ICZnKSl7CisJcHNfc2V0X2ZvbnQoZ2V0R2xvYmFsQ29udGV4dCgpLCBmKTsKKwlyZXR1cm4gMDsJ
CisgICAgfQorICAgIHBzX3NpemUgc2l6ZSA9IHBzX2dseXBoX2dldF9leHRlbnQoJmcpOworICAg
IHBzX3NldF9mb250KGdldEdsb2JhbENvbnRleHQoKSwgZik7CisgICAgcmV0dXJuIHNpemUudzsK
K30KKworfQpkaWZmIC11ck4gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcGljYXNz
by9UcmFuc2Zvcm1hdGlvbk1hdHJpeFBTLmNwcCBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9waWNhc3NvL1RyYW5zZm9ybWF0aW9uTWF0cml4UFMuY3BwCi0tLSBTb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9waWNhc3NvL1RyYW5zZm9ybWF0aW9uTWF0cml4UFMuY3BwCTE5
NzAtMDEtMDEgMDg6MDA6MDAuMDAwMDAwMDAwICswODAwCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9waWNhc3NvL1RyYW5zZm9ybWF0aW9uTWF0cml4UFMuY3BwCTIwMTItMTEt
MTIgMjA6MTY6NDkuMDAwMDAwMDAwICswODAwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiAgQ29w
eXJpZ2h0IChjKSAyMDEyIFpoYW5nIEppIFBlbmcgPG9uZWNvb2x4QGdtYWlsLmNvbT4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCisjaW5j
bHVkZSAiVHJhbnNmb3JtYXRpb25NYXRyaXguaCIKKworI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgor
I2luY2x1ZGUgIkludFJlY3QuaCIKKworI2luY2x1ZGUgPHBpY2Fzc28uaD4KKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCitBZmZpbmVUcmFuc2Zvcm06OkFmZmluZVRyYW5zZm9ybShjb25zdCBwc19t
YXRyaXgqIG0pCit7CisgICAgZG91YmxlIHN4LCBzeSwgc2h4LCBzaHksIHR4LCB0eTsKKyAgICBw
c19tYXRyaXhfZ2V0X3NjYWxlX2ZhY3Rvcihjb25zdF9jYXN0PHBzX21hdHJpeCo+KG0pLCAmc3gs
ICZzeSk7CisgICAgcHNfbWF0cml4X2dldF9zaGVhcl9mYWN0b3IoY29uc3RfY2FzdDxwc19tYXRy
aXgqPihtKSwgJnNoeCwgJnNoeSk7CisgICAgcHNfbWF0cml4X2dldF90cmFuc2xhdGVfZmFjdG9y
KGNvbnN0X2Nhc3Q8cHNfbWF0cml4Kj4obSksICZ0eCwgJnR5KTsKKyAgICBzZXRNYXRyaXgoc3gs
IHNoeSwgc2h4LCBzeSwgdHgsIHR5KTsKK30KKworcHNfbWF0cml4ICogQWZmaW5lVHJhbnNmb3Jt
OjptYWtlTWF0cml4KCkgY29uc3QgCit7CisgICAgcHNfbWF0cml4KiBtID0gcHNfbWF0cml4X2Ny
ZWF0ZV9pbml0KGEoKSxiKCksYygpLGQoKSxlKCksZigpKTsKKyAgICByZXR1cm4gbTsKK30KKwor
fQorCisvLyB2aW06IHRzPTQgc3c9NCBldApkaWZmIC11ck4gU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvdHJhbnNmb3Jtcy9BZmZpbmVUcmFuc2Zvcm0uaCBTb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy90cmFuc2Zvcm1zL0FmZmluZVRyYW5zZm9ybS5oCi0tLSBTb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy90cmFuc2Zvcm1zL0FmZmluZVRyYW5zZm9ybS5oCTIw
MTItMDEtMTkgMTA6MTU6MzAuMDAwMDAwMDAwICswODAwCisrKyBTb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy90cmFuc2Zvcm1zL0FmZmluZVRyYW5zZm9ybS5oCTIwMTItMTEtMTIgMjA6
MTY6NDkuMDAwMDAwMDAwICswODAwCkBAIC0xLDYgKzEsNyBAQAogLyoKICAqIENvcHlyaWdodCAo
QykgMjAwNSwgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4K
ICAqICAgICAgICAgICAgICAgMjAxMCBEaXJrIFNjaHVsemUgPGtyaXRAd2Via2l0Lm9yZz4KKyAq
IENvcHlyaWdodCAoYykgMjAxMiBaaGFuZyBKaSBQZW5nIDxvbmVjb29seEBnbWFpbC5jb20+CiAg
KgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTM2LDYgKzM3LDggQEAKICNpbmNsdWRl
IDxDb3JlR3JhcGhpY3MvQ0dBZmZpbmVUcmFuc2Zvcm0uaD4KICNlbGlmIFVTRShDQUlSTykKICNp
bmNsdWRlIDxjYWlyby5oPgorI2VsaWYgVVNFKFBJQ0FTU08pCisjaW5jbHVkZSA8cGljYXNzby5o
PgogI2VsaWYgUExBVEZPUk0oT1BFTlZHKQogI2luY2x1ZGUgIlZHVXRpbHMuaCIKICNlbGlmIFBM
QVRGT1JNKFFUKQpAQCAtNjcsNiArNzAsOSBAQAogICAgIEFmZmluZVRyYW5zZm9ybShjb25zdCBD
R0FmZmluZVRyYW5zZm9ybSYpOwogI2VuZGlmCiAKKyNpZiBVU0UoUElDQVNTTykKKyAgICBBZmZp
bmVUcmFuc2Zvcm0oY29uc3QgcHNfbWF0cml4Kik7CisjZW5kaWYKICAgICB2b2lkIHNldE1hdHJp
eChkb3VibGUgYSwgZG91YmxlIGIsIGRvdWJsZSBjLCBkb3VibGUgZCwgZG91YmxlIGUsIGRvdWJs
ZSBmKTsKIAogICAgIHZvaWQgbWFwKGRvdWJsZSB4LCBkb3VibGUgeSwgZG91YmxlJiB4MiwgZG91
YmxlJiB5MikgY29uc3Q7CkBAIC0xODQsNiArMTkwLDEwIEBACiAgICAgb3BlcmF0b3Igd3hHcmFw
aGljc01hdHJpeCgpIGNvbnN0OwogI2VuZGlmCiAKKyNpZiBVU0UoUElDQVNTTykKKyAgIHBzX21h
dHJpeCAqIG1ha2VNYXRyaXgoKSBjb25zdDsgCisjZW5kaWYKKwogICAgIHN0YXRpYyBBZmZpbmVU
cmFuc2Zvcm0gdHJhbnNsYXRpb24oZG91YmxlIHgsIGRvdWJsZSB5KQogICAgIHsKICAgICAgICAg
cmV0dXJuIEFmZmluZVRyYW5zZm9ybSgxLCAwLCAwLCAxLCB4LCB5KTsKZGlmZiAtdXJOIFNvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3BpY2Fzc28vSW1hZ2VEZWNvZGVyUFMu
Y3BwIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2ltYWdlLWRlY29kZXJzL3BpY2Fzc28vSW1hZ2VE
ZWNvZGVyUFMuY3BwCi0tLSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9pbWFnZS1kZWNvZGVycy9w
aWNhc3NvL0ltYWdlRGVjb2RlclBTLmNwcAkxOTcwLTAxLTAxIDA4OjAwOjAwLjAwMDAwMDAwMCAr
MDgwMAorKysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vaW1hZ2UtZGVjb2RlcnMvcGljYXNzby9J
bWFnZURlY29kZXJQUy5jcHAJMjAxMi0xMS0xMiAyMDoxNjo0OS4wMDAwMDAwMDAgKzA4MDAKQEAg
LTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiBaaGFuZyBKaSBQZW5nIDxv
bmVjb29seEBnbWFpbC5jb20+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJJbWFnZURlY29kZXIuaCIKKworI2luY2x1ZGUgPHBpY2Fzc28uaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitOYXRpdmVJbWFnZVB0ciBJbWFnZUZyYW1lOjphc05ld05hdGl2ZUltYWdlKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gbmV3IE5hdGl2ZUltYWdlUFMocHNfaW1hZ2VfY3JlYXRlX2Zy
b21fZGF0YSgKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4oY29uc3Rf
Y2FzdDxQaXhlbERhdGEqPihtX2J5dGVzKSksCisgICAgICAgIENPTE9SX0ZPUk1BVF9BUkdCLCB3
aWR0aCgpLCBoZWlnaHQoKSwgd2lkdGgoKSAqIHNpemVvZihQaXhlbERhdGEpKSwgbV9oYXNBbHBo
YSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtdXJOIFNvdXJjZS9XVEYvd3Rm
L1BsYXRmb3JtLmggU291cmNlL1dURi93dGYvUGxhdGZvcm0uaAotLS0gU291cmNlL1dURi93dGYv
UGxhdGZvcm0uaAkyMDEyLTExLTA4IDEyOjI2OjI1LjAwMDAwMDAwMCArMDgwMAorKysgU291cmNl
L1dURi93dGYvUGxhdGZvcm0uaAkyMDEyLTExLTEyIDIwOjE2OjQ5LjAwMDAwMDAwMCArMDgwMApA
QCAtMiw2ICsyLDcgQEAKICAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAw
OSBUb3JjaCBNb2JpbGUsIEluYy4KICAqIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMSBSZXNlYXJj
aCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAo
YykgMjAxMiBaaGFuZyBKaSBQZW5nIDxvbmVjb29seEBnbWFpbC5jb20+CiAgKgogICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKQEAgLTUwNCw4ICs1MDUsMTUgQEAKICNkZWZpbmUgV1RGX1VTRV9M
T1dfUVVBTElUWV9JTUFHRV9OT19KUEVHX0ZBTkNZX1VQU0FNUExJTkcgMQogI2VuZGlmCiAKLSNp
ZiBQTEFURk9STShHVEspCisjaWYgZGVmaW5lZChCVUlMRElOR19DQUlST19fKQogI2RlZmluZSBX
VEZfVVNFX0NBSVJPIDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChCVUlMRElOR19QSUNBU1NPX18p
CisjZGVmaW5lIFdURl9VU0VfUElDQVNTTyAxCisjZW5kaWYKKworI2lmIFBMQVRGT1JNKEdUSykK
ICNkZWZpbmUgRU5BQkxFX0dMT0JBTF9GQVNUTUFMTE9DX05FVyAwCiAjZW5kaWYKIAo=
</data>
<flag name="review"
          id="188698"
          type_id="1"
          status="-"
          setter="abarth"
    />
          </attachment>
      

    </bug>

</bugzilla>