<?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>140544</bug_id>
          
          <creation_ts>2015-01-16 06:51:41 -0800</creation_ts>
          <short_desc>Correct naming for FontCascade implementation files</short_desc>
          <delta_ts>2015-01-16 08:09:20 -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>Layout and Rendering</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Antti Koivisto">koivisto</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1061814</commentid>
    <comment_count>0</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2015-01-16 06:51:41 -0800</bug_when>
    <thetext>The implementation is spread over several .cpp and .mm files.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1061817</commentid>
    <comment_count>1</comment_count>
      <attachid>244766</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2015-01-16 07:01:33 -0800</bug_when>
    <thetext>Created attachment 244766
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1061819</commentid>
    <comment_count>2</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2015-01-16 08:09:20 -0800</bug_when>
    <thetext>https://trac.webkit.org/r178578</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>244766</attachid>
            <date>2015-01-16 07:01:33 -0800</date>
            <delta_ts>2015-01-16 07:48:17 -0800</delta_ts>
            <desc>patch</desc>
            <filename>fontcascade-files.patch</filename>
            <type>text/plain</type>
            <size>104415</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE3ODU3NykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQ2IEBACisyMDE1LTAxLTE2ICBBbnR0aSBL
b2l2aXN0byAgPGFudHRpQGFwcGxlLmNvbT4KKworICAgICAgICBDb3JyZWN0IG5hbWluZyBmb3Ig
Rm9udENhc2NhZGUgaW1wbGVtZW50YXRpb24gZmlsZXMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0MDU0NAorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIEFsc28gcmVkdWNlIHRoZWlyIG51bWJlci4KKworICAg
ICAgICBNZXJnZSBGb250RmFzdFBhdGguY3BwIGludG8gRm9udENhc2NhZGUuY3BwCisgICAgICAg
IE1lcmdlIEZvbnRNYWMubW0gYW5kIEZvbnRDb21wbGV4VGV4dE1hYy5jcHAgaW50byBGb250Q2Fz
Y2FkZUNvY29hLm1tCisKKyAgICAgICAgKiBDTWFrZUxpc3RzLnR4dDoKKyAgICAgICAgKiBXZWJD
b3JlLnZjeHByb2ovV2ViQ29yZS52Y3hwcm9qOgorICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9q
L3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FzY2Fk
ZS5jcHA6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FzY2FkZTo6Z2V0RW1waGFzaXNNYXJrR2x5
cGhEYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYXNjYWRlOjplbXBoYXNpc01hcmtBc2Nl
bnQpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhc2NhZGU6OmVtcGhhc2lzTWFya0Rlc2NlbnQp
OgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhc2NhZGU6OmVtcGhhc2lzTWFya0hlaWdodCk6Cisg
ICAgICAgIChXZWJDb3JlOjpGb250Q2FzY2FkZTo6Z2V0R2x5cGhzQW5kQWR2YW5jZXNGb3JTaW1w
bGVUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYXNjYWRlOjpkcmF3U2ltcGxlVGV4dCk6
CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FzY2FkZTo6ZHJhd0VtcGhhc2lzTWFya3NGb3JTaW1w
bGVUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYXNjYWRlOjpkcmF3R2x5cGhCdWZmZXIp
OgorICAgICAgICAoV2ViQ29yZTo6b2Zmc2V0VG9NaWRkbGVPZkdseXBoKToKKyAgICAgICAgKFdl
YkNvcmU6Om9mZnNldFRvTWlkZGxlT2ZHbHlwaEF0SW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6
Rm9udENhc2NhZGU6OmRyYXdFbXBoYXNpc01hcmtzKToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRD
YXNjYWRlOjpmbG9hdFdpZHRoRm9yU2ltcGxlVGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpGb250
Q2FzY2FkZTo6YWRqdXN0U2VsZWN0aW9uUmVjdEZvclNpbXBsZVRleHQpOgorICAgICAgICAoV2Vi
Q29yZTo6Rm9udENhc2NhZGU6Om9mZnNldEZvclBvc2l0aW9uRm9yU2ltcGxlVGV4dCk6CisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvRm9udEZhc3RQYXRoLmNwcDogUmVtb3ZlZC4KKyAgICAg
ICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9jb2NvYS9Gb250Q2FzY2FkZUNvY29hLm1tOiBDb3BpZWQg
ZnJvbSBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvRm9udE1hYy5tbS4KKyAg
ICAgICAgKFdlYkNvcmU6OkZvbnRDYXNjYWRlOjpkcmF3R2x5cGhzKToKKyAgICAgICAgKFdlYkNv
cmU6OkZvbnRDYXNjYWRlOjphZGp1c3RTZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQpOgorICAg
ICAgICAoV2ViQ29yZTo6Rm9udENhc2NhZGU6OmdldEdseXBoc0FuZEFkdmFuY2VzRm9yQ29tcGxl
eFRleHQpOgorICAgICAgICAoV2ViQ29yZTo6Rm9udENhc2NhZGU6OmRyYXdDb21wbGV4VGV4dCk6
CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FzY2FkZTo6ZHJhd0VtcGhhc2lzTWFya3NGb3JDb21w
bGV4VGV4dCk6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2FzY2FkZTo6ZmxvYXRXaWR0aEZvckNv
bXBsZXhUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYXNjYWRlOjpvZmZzZXRGb3JQb3Np
dGlvbkZvckNvbXBsZXhUZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYXNjYWRlOjpmb250
RGF0YUZvckNvbWJpbmluZ0NoYXJhY3RlclNlcXVlbmNlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9n
cmFwaGljcy9tYWMvRm9udENvbXBsZXhUZXh0TWFjLmNwcDogUmVtb3ZlZC4KKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy9tYWMvRm9udE1hYy5tbTogUmVtb3ZlZC4KKwogMjAxNC0xMS0yNiAg
U2VyZ2lvIFZpbGxhciBTZW5pbiAgPHN2aWxsYXJAaWdhbGlhLmNvbT4KIAogICAgICAgICBbQ1NT
IEdyaWQgTGF5b3V0XSBUcmFja3Mgc2hyaW5rIHNvbWV0aW1lcyB3aXRoIGluZGVmaW5pdGUgcmVt
YWluaW5nIHNwYWNlCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9DTWFrZUxpc3RzLnR4dAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9DTWFrZUxpc3RzLnR4dAkocmV2aXNpb24gMTc4NTc3KQor
KysgU291cmNlL1dlYkNvcmUvQ01ha2VMaXN0cy50eHQJKHdvcmtpbmcgY29weSkKQEAgLTIwNTIs
NyArMjA1Miw2IEBAIHNldChXZWJDb3JlX1NPVVJDRVMKICAgICBwbGF0Zm9ybS9ncmFwaGljcy9G
b250Q2FjaGUuY3BwCiAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhc2NhZGUuY3BwCiAgICAg
cGxhdGZvcm0vZ3JhcGhpY3MvRm9udERlc2NyaXB0aW9uLmNwcAotICAgIHBsYXRmb3JtL2dyYXBo
aWNzL0ZvbnRGYXN0UGF0aC5jcHAKICAgICBwbGF0Zm9ybS9ncmFwaGljcy9Gb250RmVhdHVyZVNl
dHRpbmdzLmNwcAogICAgIHBsYXRmb3JtL2dyYXBoaWNzL0ZvbnRHZW5lcmljRmFtaWxpZXMuY3Bw
CiAgICAgcGxhdGZvcm0vZ3JhcGhpY3MvRm9udEdseXBocy5jcHAKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL1dlYkNvcmUudmN4cHJvai9XZWJDb3JlLnZjeHByb2oKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvV2ViQ29yZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJvagkocmV2aXNpb24gMTc4NTc3
KQorKysgU291cmNlL1dlYkNvcmUvV2ViQ29yZS52Y3hwcm9qL1dlYkNvcmUudmN4cHJvagkod29y
a2luZyBjb3B5KQpAQCAtNzk4Myw3ICs3OTgzLDYgQEAKICAgICA8Q2xDb21waWxlIEluY2x1ZGU9
Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXEZvbnREZXNjcmlwdGlvbi5jcHAiIC8+CiAgICAgPENsQ29t
cGlsZSBJbmNsdWRlPSIuLlxwbGF0Zm9ybVxncmFwaGljc1xGb250R2VuZXJpY0ZhbWlsaWVzLmNw
cCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHBsYXRmb3JtXGdyYXBoaWNzXEZvbnRH
bHlwaHMuY3BwIiAvPgotICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iLi5ccGxhdGZvcm1cZ3JhcGhp
Y3NcRm9udEZhc3RQYXRoLmNwcCIgLz4KICAgICA8Q2xDb21waWxlIEluY2x1ZGU9Ii4uXHBsYXRm
b3JtXGdyYXBoaWNzXEZvbnRGZWF0dXJlU2V0dGluZ3MuY3BwIiAvPgogICAgIDxDbENvbXBpbGUg
SW5jbHVkZT0iLi5ccGxhdGZvcm1cZ3JhcGhpY3NcRm9udFBsYXRmb3JtRGF0YS5jcHAiIC8+CiAg
ICAgPENsQ29tcGlsZSBJbmNsdWRlPSIuLlxwbGF0Zm9ybVxncmFwaGljc1xGb250UmFuZ2VzLmNw
cCIgLz4KSW5kZXg6IFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4
cHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9q
ZWN0LnBieHByb2oJKHJldmlzaW9uIDE3ODU3NykKKysrIFNvdXJjZS9XZWJDb3JlL1dlYkNvcmUu
eGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtMTM4Nyw3ICsxMzg3
LDYgQEAKIAkJMzdBQ0NFNDIwREEyOTgwRjAwODlFNjAyIC8qIEZvbnRSZW5kZXJpbmdNb2RlLmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzN0FDQ0U0MTBE
QTI5ODBGMDA4OUU2MDIgLyogRm9udFJlbmRlcmluZ01vZGUuaCAqLzsgc2V0dGluZ3MgPSB7QVRU
UklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQkzN0FDQ0Y2OTBEQTQxNEU3MDA4OUU2MDIg
LyogRm9udERlc2NyaXB0aW9uLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IDM3QUNDRTYyMERBMkFBOTYwMDg5RTYwMiAvKiBGb250RGVzY3JpcHRpb24u
Y3BwICovOyB9OwogCQkzN0JBQUU1ODE5ODBEMUREMDA1REZFNzEgLyogUHJvdGVjdGlvblNwYWNl
LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAzN0JBQUU1
NzE5ODBEMUREMDA1REZFNzEgLyogUHJvdGVjdGlvblNwYWNlLmggKi87IHNldHRpbmdzID0ge0FU
VFJJQlVURVMgPSAoUHJpdmF0ZSwgKTsgfTsgfTsKLQkJMzdDMjM2MEIxMDk3RURFRDAwRUY5Rjcy
IC8qIEZvbnRDb21wbGV4VGV4dE1hYy5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWls
ZEZpbGU7IGZpbGVSZWYgPSAzN0MyMzYwQTEwOTdFREVEMDBFRjlGNzIgLyogRm9udENvbXBsZXhU
ZXh0TWFjLmNwcCAqLzsgfTsKIAkJMzdDMjM2MTAxMDk3RUU3NzAwRUY5RjcyIC8qIENvbXBsZXhU
ZXh0Q29udHJvbGxlci5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSAzN0MyMzYwRTEwOTdFRTc3MDBFRjlGNzIgLyogQ29tcGxleFRleHRDb250cm9sbGVy
LmNwcCAqLzsgfTsKIAkJMzdDMjM2MTExMDk3RUU3NzAwRUY5RjcyIC8qIENvbXBsZXhUZXh0Q29u
dHJvbGxlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
MzdDMjM2MEYxMDk3RUU3NzAwRUY5RjcyIC8qIENvbXBsZXhUZXh0Q29udHJvbGxlci5oICovOyB9
OwogCQkzN0MyMzgyMjEwOThDODQyMDBFRjlGNzIgLyogQ29tcGxleFRleHRDb250cm9sbGVyQ29y
ZVRleHQubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAz
N0MyMzgyMDEwOThDODQyMDBFRjlGNzIgLyogQ29tcGxleFRleHRDb250cm9sbGVyQ29yZVRleHQu
bW0gKi87IH07CkBAIC0yMzM5LDcgKzIzMzgsNiBAQAogCQk3MjRFRDMyQzFBM0E3RTU0MDBGNUYx
M0MgLyogRVhUQmxlbmRNaW5NYXguY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gNzI0RUQzMjkxQTNBN0U1NDAwRjVGMTNDIC8qIEVYVEJsZW5kTWluTWF4
LmNwcCAqLzsgfTsKIAkJNzI0RUQzMzExQTNBOEIyMzAwRjVGMTNDIC8qIEpTRVhUQmxlbmRNaW5N
YXguY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzI0
RUQzMkYxQTNBOEIyMzAwRjVGMTNDIC8qIEpTRVhUQmxlbmRNaW5NYXguY3BwICovOyB9OwogCQk3
MjRFRDMzMjFBM0E4QjIzMDBGNUYxM0MgLyogSlNFWFRCbGVuZE1pbk1heC5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzI0RUQzMzAxQTNBOEIyMzAwRjVG
MTNDIC8qIEpTRVhUQmxlbmRNaW5NYXguaCAqLzsgfTsKLQkJNzI2MjZFMDIwRUYwMjJGRTAwQTA3
RTIwIC8qIEZvbnRGYXN0UGF0aC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSA3MjYyNkUwMTBFRjAyMkZFMDBBMDdFMjAgLyogRm9udEZhc3RQYXRoLmNw
cCAqLzsgfTsKIAkJNzI3QUZFRDQxQTJFQTZBRTAwMDQ0MkU4IC8qIEVYVHNSR0IuY3BwIGluIFNv
dXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNzI3QUZFRDExQTJFQTZB
MDAwMDQ0MkU4IC8qIEVYVHNSR0IuY3BwICovOyB9OwogCQk3MkU0MTc2MzFBMkU4RDJGMDA0QzU2
MkEgLyogSlNFWFRzUkdCLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IDcyRTQxNzYxMUEyRThEMkYwMDRDNTYyQSAvKiBKU0VYVHNSR0IuY3BwICovOyB9
OwogCQk3MkYxQURBMjFBMzkwNERDMDAwMTRFMTggLyogRVhURnJhZ0RlcHRoLmNwcCBpbiBTb3Vy
Y2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDcyRjFBRDlGMUEzOTA0QzMw
MDAxNEUxOCAvKiBFWFRGcmFnRGVwdGguY3BwICovOyB9OwpAQCAtNDY3MCw3ICs0NjY4LDcgQEAK
IAkJQjJBRkZDN0QwRDAwQTVDMTAwMzAwNzREIC8qIEZvbnRDdXN0b21QbGF0Zm9ybURhdGEuY3Bw
IGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQjJBRkZDNzUw
RDAwQTVDMTAwMzAwNzREIC8qIEZvbnRDdXN0b21QbGF0Zm9ybURhdGEuY3BwICovOyB9OwogCQlC
MkFGRkM3RTBEMDBBNUMxMDAzMDA3NEQgLyogRm9udEN1c3RvbVBsYXRmb3JtRGF0YS5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQjJBRkZDNzYwRDAwQTVD
MTAwMzAwNzREIC8qIEZvbnRDdXN0b21QbGF0Zm9ybURhdGEuaCAqLzsgfTsKIAkJQjJBRkZDN0Yw
RDAwQTVDMTAwMzAwNzREIC8qIFNpbXBsZUZvbnREYXRhTWFjLm1tIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQjJBRkZDNzcwRDAwQTVDMTAwMzAwNzREIC8q
IFNpbXBsZUZvbnREYXRhTWFjLm1tICovOyB9OwotCQlCMkFGRkM4MDBEMDBBNUMxMDAzMDA3NEQg
LyogRm9udE1hYy5tbSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IEIyQUZGQzc4MEQwMEE1QzEwMDMwMDc0RCAvKiBGb250TWFjLm1tICovOyB9OworCQlCMkFG
RkM4MDBEMDBBNUMxMDAzMDA3NEQgLyogRm9udENhc2NhZGVDb2NvYS5tbSBpbiBTb3VyY2VzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEIyQUZGQzc4MEQwMEE1QzEwMDMwMDc0
RCAvKiBGb250Q2FzY2FkZUNvY29hLm1tICovOyB9OwogCQlCMkFGRkM4MzBEMDBBNUMxMDAzMDA3
NEQgLyogR2x5cGhQYWdlTWFjLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IEIyQUZGQzdCMEQwMEE1QzEwMDMwMDc0RCAvKiBHbHlwaFBhZ2VNYWMuY3Bw
ICovOyB9OwogCQlCMkFGRkM5NzBEMDBBNURGMDAzMDA3NEQgLyogVGV4dEJvdW5kYXJpZXMubW0g
aW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCMkFGRkM4QzBE
MDBBNURGMDAzMDA3NEQgLyogVGV4dEJvdW5kYXJpZXMubW0gKi87IH07CiAJCUIyQUZGQzk4MEQw
MEE1REYwMDMwMDc0RCAvKiBUZXh0QnJlYWtJdGVyYXRvckludGVybmFsSUNVTWFjLm1tIGluIFNv
dXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQjJBRkZDOEQwRDAwQTVE
RjAwMzAwNzREIC8qIFRleHRCcmVha0l0ZXJhdG9ySW50ZXJuYWxJQ1VNYWMubW0gKi87IH07CkBA
IC04NDMwLDcgKzg0MjgsNiBAQAogCQkzN0FDQ0U0MTBEQTI5ODBGMDA4OUU2MDIgLyogRm9udFJl
bmRlcmluZ01vZGUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gRm9udFJlbmRl
cmluZ01vZGUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMzdBQ0NFNjIwREEyQUE5
NjAwODlFNjAyIC8qIEZvbnREZXNjcmlwdGlvbi5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNw
cC5jcHA7IHBhdGggPSBGb250RGVzY3JpcHRpb24uY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwogCQkzN0JBQUU1NzE5ODBEMUREMDA1REZFNzEgLyogUHJvdGVjdGlvblNwYWNlLmggKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFByb3RlY3Rpb25TcGFjZS5oOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwotCQkzN0MyMzYwQTEwOTdFREVEMDBFRjlGNzIgLyogRm9udENv
bXBsZXhUZXh0TWFjLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEZv
bnRDb21wbGV4VGV4dE1hYy5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTM3QzIz
NjBFMTA5N0VFNzcwMEVGOUY3MiAvKiBDb21wbGV4VGV4dENvbnRyb2xsZXIuY3BwICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gQ29tcGxleFRleHRDb250cm9sbGVyLmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMzdDMjM2MEYxMDk3RUU3NzAwRUY5RjcyIC8q
IENvbXBsZXhUZXh0Q29udHJvbGxlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGgg
PSBDb21wbGV4VGV4dENvbnRyb2xsZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
MzdDMjM4MjAxMDk4Qzg0MjAwRUY5RjcyIC8qIENvbXBsZXhUZXh0Q29udHJvbGxlckNvcmVUZXh0
Lm1tICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3BwOyBwYXRoID0gQ29tcGxleFRleHRD
b250cm9sbGVyQ29yZVRleHQubW07IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IHhjTGFuZ3VhZ2VT
cGVjaWZpY2F0aW9uSWRlbnRpZmllciA9IHhjb2RlLmxhbmcub2JqY3BwOyB9OwpAQCAtOTQ3Nyw3
ICs5NDc0LDYgQEAKIAkJNzI0RUQzMkIxQTNBN0U1NDAwRjVGMTNDIC8qIEVYVEJsZW5kTWluTWF4
LmlkbCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHRleHQ7IG5hbWUgPSBFWFRCbGVuZE1pbk1heC5pZGw7IHBhdGggPSBj
YW52YXMvRVhUQmxlbmRNaW5NYXguaWRsOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3
MjRFRDMyRjFBM0E4QjIzMDBGNUYxM0MgLyogSlNFWFRCbGVuZE1pbk1heC5jcHAgKi8gPSB7aXNh
ID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBKU0VYVEJsZW5kTWluTWF4LmNwcDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNzI0RUQzMzAxQTNBOEIyMzAwRjVGMTNDIC8qIEpTRVhU
QmxlbmRNaW5NYXguaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSlNFWFRCbGVu
ZE1pbk1heC5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQk3MjYyNkUwMTBFRjAyMkZF
MDBBMDdFMjAgLyogRm9udEZhc3RQYXRoLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNw
cDsgcGF0aCA9IEZvbnRGYXN0UGF0aC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJ
CTcyN0FGRUQxMUEyRUE2QTAwMDA0NDJFOCAvKiBFWFRzUkdCLmNwcCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuY3BwLmNwcDsgbmFtZSA9IEVYVHNSR0IuY3BwOyBwYXRoID0gY2FudmFzL0VYVHNSR0Iu
Y3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk3MjdBRkVEMjFBMkVBNkEwMDAwNDQy
RTggLyogRVhUc1JHQi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBFWFRzUkdC
Lmg7IHBhdGggPSBjYW52YXMvRVhUc1JHQi5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owog
CQk3MjdBRkVEMzFBMkVBNkEwMDAwNDQyRTggLyogRVhUc1JHQi5pZGwgKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0
OyBuYW1lID0gRVhUc1JHQi5pZGw7IHBhdGggPSBjYW52YXMvRVhUc1JHQi5pZGw7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07CkBAIC0xMjA0NCw3ICsxMjA0MCw3IEBACiAJCUIyQUZGQzc1MEQw
MEE1QzEwMDMwMDc0RCAvKiBGb250Q3VzdG9tUGxhdGZvcm1EYXRhLmNwcCAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBGb250Q3VzdG9tUGxhdGZvcm1EYXRhLmNwcDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQjJBRkZDNzYwRDAwQTVDMTAwMzAwNzREIC8qIEZv
bnRDdXN0b21QbGF0Zm9ybURhdGEuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxl
RW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IEZvbnRDdXN0b21QbGF0Zm9ybURhdGEuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJ
QjJBRkZDNzcwRDAwQTVDMTAwMzAwNzREIC8qIFNpbXBsZUZvbnREYXRhTWFjLm1tICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlw
ZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgcGF0aCA9IFNpbXBsZUZvbnREYXRhTWFjLm1tOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQlCMkFGRkM3ODBEMDBBNUMxMDAzMDA3NEQgLyog
Rm9udE1hYy5tbSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAz
MDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGggPSBGb250
TWFjLm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQlCMkFGRkM3ODBEMDBBNUMxMDAz
MDA3NEQgLyogRm9udENhc2NhZGVDb2NvYS5tbSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNl
OyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5v
YmpjcHA7IHBhdGggPSBGb250Q2FzY2FkZUNvY29hLm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwogCQlCMkFGRkM3QjBEMDBBNUMxMDAzMDA3NEQgLyogR2x5cGhQYWdlTWFjLmNwcCAqLyA9
IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBHbHlwaFBhZ2VNYWMuY3BwOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCMkFGRkM4NTBEMDBBNURGMDAzMDA3NEQgLyogY2hh
cmFjdGVyLXNldHMudHh0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSAiY2hhcmFjdGVyLXNldHMu
dHh0Ijsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQjJBRkZDODYwRDAwQTVERjAwMzAw
NzREIC8qIG1hYy1lbmNvZGluZ3MudHh0ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZp
bGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHRleHQ7IHBhdGggPSAibWFjLWVu
Y29kaW5ncy50eHQiOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMjAzNjIsMTAgKzIw
MzU4LDggQEAKIAkJCQlCMjc1MzU0QzBCMDUzODE0MDAyQ0U2NEYgLyogRmxvYXRSZWN0TWFjLm1t
ICovLAogCQkJCUIyNzUzNTREMEIwNTM4MTQwMDJDRTY0RiAvKiBGbG9hdFNpemVNYWMubW0gKi8s
CiAJCQkJQjJBRkZDNzQwRDAwQTVDMTAwMzAwNzREIC8qIEZvbnRDYWNoZU1hYy5tbSAqLywKLQkJ
CQkzN0MyMzYwQTEwOTdFREVEMDBFRjlGNzIgLyogRm9udENvbXBsZXhUZXh0TWFjLmNwcCAqLywK
IAkJCQlCMkFGRkM3NTBEMDBBNUMxMDAzMDA3NEQgLyogRm9udEN1c3RvbVBsYXRmb3JtRGF0YS5j
cHAgKi8sCiAJCQkJQjJBRkZDNzYwRDAwQTVDMTAwMzAwNzREIC8qIEZvbnRDdXN0b21QbGF0Zm9y
bURhdGEuaCAqLywKLQkJCQlCMkFGRkM3ODBEMDBBNUMxMDAzMDA3NEQgLyogRm9udE1hYy5tbSAq
LywKIAkJCQlCMkFGRkM3QjBEMDBBNUMxMDAzMDA3NEQgLyogR2x5cGhQYWdlTWFjLmNwcCAqLywK
IAkJCQk0OUZGQkYxQzExQzg1NTBFMDA2QTcxMTggLyogR3JhcGhpY3NDb250ZXh0M0RNYWMubW0g
Ki8sCiAJCQkJQjI3N0I0MDMwQjIyRjM3QzAwMDRCRUM2IC8qIEdyYXBoaWNzQ29udGV4dE1hYy5t
bSAqLywKQEAgLTIwNDQ2LDcgKzIwNDQwLDYgQEAKIAkJCQlCMkMzREE1MjBEMDA2Q0Q2MDBFRjZG
MjYgLyogRm9udENhY2hlLmggKi8sCiAJCQkJMzdBQ0NFNjIwREEyQUE5NjAwODlFNjAyIC8qIEZv
bnREZXNjcmlwdGlvbi5jcHAgKi8sCiAJCQkJQjJDM0RBNTUwRDAwNkNENjAwRUY2RjI2IC8qIEZv
bnREZXNjcmlwdGlvbi5oICovLAotCQkJCTcyNjI2RTAxMEVGMDIyRkUwMEEwN0UyMCAvKiBGb250
RmFzdFBhdGguY3BwICovLAogCQkJCTRBNkU5RkM1MTNDMTdENTcwMDQ2QTdGOCAvKiBGb250RmVh
dHVyZVNldHRpbmdzLmNwcCAqLywKIAkJCQk0QTZFOUZDNjEzQzE3RDU3MDA0NkE3RjggLyogRm9u
dEZlYXR1cmVTZXR0aW5ncy5oICovLAogCQkJCUU0NEVFM0E2MTc1NzZFNTUwMEVFRThDRiAvKiBG
b250R2VuZXJpY0ZhbWlsaWVzLmNwcCAqLywKQEAgLTIwNzE0LDYgKzIwNzA3LDcgQEAKIAkJQjUz
MjBENjgxMjJBMjRFOTAwMkQxNDQwIC8qIGNvY29hICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7
CiAJCQljaGlsZHJlbiA9ICgKKwkJCQlCMkFGRkM3ODBEMDBBNUMxMDAzMDA3NEQgLyogRm9udENh
c2NhZGVDb2NvYS5tbSAqLywKIAkJCQlCNTMyMEQ2QTEyMkEyNEU5MDAyRDE0NDAgLyogRm9udFBs
YXRmb3JtRGF0YUNvY29hLm1tICovLAogCQkJCTJEMEI0QUE5MThEQTFDQ0QwMDQzNERFMSAvKiBJ
T1N1cmZhY2UuaCAqLywKIAkJCQkyRDBCNEFBQTE4REExQ0NEMDA0MzRERTEgLyogSU9TdXJmYWNl
Lm1tICovLApAQCAtMjc4MjAsMTUgKzI3ODE0LDEzIEBACiAJCQkJQjJDM0RBNjIwRDAwNkNENjAw
RUY2RjI2IC8qIEZvbnRDYWNoZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQkzNzI3REZENTE0MkFB
RTQ1MDBENDQ5Q0IgLyogRm9udENhY2hlSU9TLm1tIGluIFNvdXJjZXMgKi8sCiAJCQkJQjJBRkZD
N0MwRDAwQTVDMTAwMzAwNzREIC8qIEZvbnRDYWNoZU1hYy5tbSBpbiBTb3VyY2VzICovLAotCQkJ
CTM3QzIzNjBCMTA5N0VERUQwMEVGOUY3MiAvKiBGb250Q29tcGxleFRleHRNYWMuY3BwIGluIFNv
dXJjZXMgKi8sCiAJCQkJQjJBRkZDN0QwRDAwQTVDMTAwMzAwNzREIC8qIEZvbnRDdXN0b21QbGF0
Zm9ybURhdGEuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJMzdBQ0NGNjkwREE0MTRFNzAwODlFNjAy
IC8qIEZvbnREZXNjcmlwdGlvbi5jcHAgaW4gU291cmNlcyAqLywKLQkJCQk3MjYyNkUwMjBFRjAy
MkZFMDBBMDdFMjAgLyogRm9udEZhc3RQYXRoLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTRBNkU5
RkM3MTNDMTdENTcwMDQ2QTdGOCAvKiBGb250RmVhdHVyZVNldHRpbmdzLmNwcCBpbiBTb3VyY2Vz
ICovLAogCQkJCUU0NEVFM0E4MTc1NzdFQkQwMEVFRThDRiAvKiBGb250R2VuZXJpY0ZhbWlsaWVz
LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUIyQzNEQTY3MEQwMDZDRDYwMEVGNkYyNiAvKiBGb250
R2x5cGhzLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUZEOTZDOTk3MTk4MkZCREYwMDg2RTE1NiAv
KiBGb250TG9hZGVyLmNwcCBpbiBTb3VyY2VzICovLAotCQkJCUIyQUZGQzgwMEQwMEE1QzEwMDMw
MDc0RCAvKiBGb250TWFjLm1tIGluIFNvdXJjZXMgKi8sCisJCQkJQjJBRkZDODAwRDAwQTVDMTAw
MzAwNzREIC8qIEZvbnRDYXNjYWRlQ29jb2EubW0gaW4gU291cmNlcyAqLywKIAkJCQk4NEI2MjY4
NTEzMzEzOEY5MDA5NUE0ODkgLyogRm9udFBsYXRmb3JtRGF0YS5jcHAgaW4gU291cmNlcyAqLywK
IAkJCQlCNTMyMEQ2QzEyMkEyNEU5MDAyRDE0NDAgLyogRm9udFBsYXRmb3JtRGF0YUNvY29hLm1t
IGluIFNvdXJjZXMgKi8sCiAJCQkJQzU4MzYxQUExNzQ0NTIzRjAwMTczNTExIC8qIEZvbnRTZXJ2
aWNlc0lPUy5tbSBpbiBTb3VyY2VzICovLApJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvRm9udENhc2NhZGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0ZvbnRDYXNjYWRlLmNwcAkocmV2aXNpb24gMTc4NTc3KQorKysgU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhc2NhZGUuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC0xMTM5LDQgKzExMzksMzA0IEBAIEdseXBoVG9QYXRoVHJhbnNsYXRvcjo6R2x5cGhV
bmRlcmxpbmVUeXAKICAgICB9CiB9CiAKKy8vIEZJWE1FOiBUaGlzIGZ1bmN0aW9uIG1heSBub3Qg
d29yayBpZiB0aGUgZW1waGFzaXMgbWFyayB1c2VzIGEgY29tcGxleCBzY3JpcHQsIGJ1dCBub25l
IG9mIHRoZQorLy8gc3RhbmRhcmQgZW1waGFzaXMgbWFya3MgZG8gc28uCitib29sIEZvbnRDYXNj
YWRlOjpnZXRFbXBoYXNpc01hcmtHbHlwaERhdGEoY29uc3QgQXRvbWljU3RyaW5nJiBtYXJrLCBH
bHlwaERhdGEmIGdseXBoRGF0YSkgY29uc3QKK3sKKyAgICBpZiAobWFyay5pc0VtcHR5KCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFVDaGFyMzIgY2hhcmFjdGVyID0gbWFya1swXTsK
KworICAgIGlmIChVMTZfSVNfU1VSUk9HQVRFKGNoYXJhY3RlcikpIHsKKyAgICAgICAgaWYgKCFV
MTZfSVNfU1VSUk9HQVRFX0xFQUQoY2hhcmFjdGVyKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgICAgICBpZiAobWFyay5sZW5ndGgoKSA8IDIpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICAgICAgVUNoYXIgbG93ID0gbWFya1sxXTsKKyAgICAgICAgaWYgKCFVMTZf
SVNfVFJBSUwobG93KSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBjaGFy
YWN0ZXIgPSBVMTZfR0VUX1NVUFBMRU1FTlRBUlkoY2hhcmFjdGVyLCBsb3cpOworICAgIH0KKwor
ICAgIGdseXBoRGF0YSA9IGdseXBoRGF0YUZvckNoYXJhY3RlcihjaGFyYWN0ZXIsIGZhbHNlLCBF
bXBoYXNpc01hcmtWYXJpYW50KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW50IEZvbnRDYXNj
YWRlOjplbXBoYXNpc01hcmtBc2NlbnQoY29uc3QgQXRvbWljU3RyaW5nJiBtYXJrKSBjb25zdAor
eworICAgIEdseXBoRGF0YSBtYXJrR2x5cGhEYXRhOworICAgIGlmICghZ2V0RW1waGFzaXNNYXJr
R2x5cGhEYXRhKG1hcmssIG1hcmtHbHlwaERhdGEpKQorICAgICAgICByZXR1cm4gMDsKKworICAg
IGNvbnN0IFNpbXBsZUZvbnREYXRhKiBtYXJrRm9udERhdGEgPSBtYXJrR2x5cGhEYXRhLmZvbnRE
YXRhOworICAgIEFTU0VSVChtYXJrRm9udERhdGEpOworICAgIGlmICghbWFya0ZvbnREYXRhKQor
ICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBtYXJrRm9udERhdGEtPmZvbnRNZXRyaWNz
KCkuYXNjZW50KCk7Cit9CisKK2ludCBGb250Q2FzY2FkZTo6ZW1waGFzaXNNYXJrRGVzY2VudChj
b25zdCBBdG9taWNTdHJpbmcmIG1hcmspIGNvbnN0Cit7CisgICAgR2x5cGhEYXRhIG1hcmtHbHlw
aERhdGE7CisgICAgaWYgKCFnZXRFbXBoYXNpc01hcmtHbHlwaERhdGEobWFyaywgbWFya0dseXBo
RGF0YSkpCisgICAgICAgIHJldHVybiAwOworCisgICAgY29uc3QgU2ltcGxlRm9udERhdGEqIG1h
cmtGb250RGF0YSA9IG1hcmtHbHlwaERhdGEuZm9udERhdGE7CisgICAgQVNTRVJUKG1hcmtGb250
RGF0YSk7CisgICAgaWYgKCFtYXJrRm9udERhdGEpCisgICAgICAgIHJldHVybiAwOworCisgICAg
cmV0dXJuIG1hcmtGb250RGF0YS0+Zm9udE1ldHJpY3MoKS5kZXNjZW50KCk7Cit9CisKK2ludCBG
b250Q2FzY2FkZTo6ZW1waGFzaXNNYXJrSGVpZ2h0KGNvbnN0IEF0b21pY1N0cmluZyYgbWFyaykg
Y29uc3QKK3sKKyAgICBHbHlwaERhdGEgbWFya0dseXBoRGF0YTsKKyAgICBpZiAoIWdldEVtcGhh
c2lzTWFya0dseXBoRGF0YShtYXJrLCBtYXJrR2x5cGhEYXRhKSkKKyAgICAgICAgcmV0dXJuIDA7
CisKKyAgICBjb25zdCBTaW1wbGVGb250RGF0YSogbWFya0ZvbnREYXRhID0gbWFya0dseXBoRGF0
YS5mb250RGF0YTsKKyAgICBBU1NFUlQobWFya0ZvbnREYXRhKTsKKyAgICBpZiAoIW1hcmtGb250
RGF0YSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gbWFya0ZvbnREYXRhLT5mb250
TWV0cmljcygpLmhlaWdodCgpOworfQorCitmbG9hdCBGb250Q2FzY2FkZTo6Z2V0R2x5cGhzQW5k
QWR2YW5jZXNGb3JTaW1wbGVUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgaW50IGZyb20sIGludCB0
bywgR2x5cGhCdWZmZXImIGdseXBoQnVmZmVyLCBGb3JUZXh0RW1waGFzaXNPck5vdCBmb3JUZXh0
RW1waGFzaXMpIGNvbnN0Cit7CisgICAgZmxvYXQgaW5pdGlhbEFkdmFuY2U7CisKKyAgICBXaWR0
aEl0ZXJhdG9yIGl0KHRoaXMsIHJ1biwgMCwgZmFsc2UsIGZvclRleHRFbXBoYXNpcyk7CisgICAg
Ly8gRklYTUU6IFVzaW5nIHNlcGFyYXRlIGdseXBoIGJ1ZmZlcnMgZm9yIHRoZSBwcmVmaXggYW5k
IHRoZSBzdWZmaXggaXMgaW5jb3JyZWN0IHdoZW4ga2VybmluZyBvcgorICAgIC8vIGxpZ2F0dXJl
cyBhcmUgZW5hYmxlZC4KKyAgICBHbHlwaEJ1ZmZlciBsb2NhbEdseXBoQnVmZmVyOworICAgIGl0
LmFkdmFuY2UoZnJvbSwgJmxvY2FsR2x5cGhCdWZmZXIpOworICAgIGZsb2F0IGJlZm9yZVdpZHRo
ID0gaXQubV9ydW5XaWR0aFNvRmFyOworICAgIGl0LmFkdmFuY2UodG8sICZnbHlwaEJ1ZmZlcik7
CisKKyAgICBpZiAoZ2x5cGhCdWZmZXIuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gMDsKKwor
ICAgIGZsb2F0IGFmdGVyV2lkdGggPSBpdC5tX3J1bldpZHRoU29GYXI7CisKKyAgICBpZiAocnVu
LnJ0bCgpKSB7CisgICAgICAgIGZsb2F0IGZpbmFsUm91bmRpbmdXaWR0aCA9IGl0Lm1fZmluYWxS
b3VuZGluZ1dpZHRoOworICAgICAgICBpdC5hZHZhbmNlKHJ1bi5sZW5ndGgoKSwgJmxvY2FsR2x5
cGhCdWZmZXIpOworICAgICAgICBpbml0aWFsQWR2YW5jZSA9IGZpbmFsUm91bmRpbmdXaWR0aCAr
IGl0Lm1fcnVuV2lkdGhTb0ZhciAtIGFmdGVyV2lkdGg7CisgICAgfSBlbHNlCisgICAgICAgIGlu
aXRpYWxBZHZhbmNlID0gYmVmb3JlV2lkdGg7CisKKyAgICBpZiAocnVuLnJ0bCgpKQorICAgICAg
ICBnbHlwaEJ1ZmZlci5yZXZlcnNlKDAsIGdseXBoQnVmZmVyLnNpemUoKSk7CisKKyAgICByZXR1
cm4gaW5pdGlhbEFkdmFuY2U7Cit9CisKK2Zsb2F0IEZvbnRDYXNjYWRlOjpkcmF3U2ltcGxlVGV4
dChHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxv
YXRQb2ludCYgcG9pbnQsIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0Cit7CisgICAgLy8gVGhpcyBn
bHlwaCBidWZmZXIgaG9sZHMgb3VyIGdseXBocythZHZhbmNlcytmb250IGRhdGEgZm9yIGVhY2gg
Z2x5cGguCisgICAgR2x5cGhCdWZmZXIgZ2x5cGhCdWZmZXI7CisKKyAgICBmbG9hdCBzdGFydFgg
PSBwb2ludC54KCkgKyBnZXRHbHlwaHNBbmRBZHZhbmNlc0ZvclNpbXBsZVRleHQocnVuLCBmcm9t
LCB0bywgZ2x5cGhCdWZmZXIpOworCisgICAgaWYgKGdseXBoQnVmZmVyLmlzRW1wdHkoKSkKKyAg
ICAgICAgcmV0dXJuIDA7CisKKyAgICBGbG9hdFBvaW50IHN0YXJ0UG9pbnQoc3RhcnRYLCBwb2lu
dC55KCkpOworICAgIGRyYXdHbHlwaEJ1ZmZlcihjb250ZXh0LCBydW4sIGdseXBoQnVmZmVyLCBz
dGFydFBvaW50KTsKKworICAgIHJldHVybiBzdGFydFBvaW50LngoKSAtIHN0YXJ0WDsKK30KKwor
dm9pZCBGb250Q2FzY2FkZTo6ZHJhd0VtcGhhc2lzTWFya3NGb3JTaW1wbGVUZXh0KEdyYXBoaWNz
Q29udGV4dCogY29udGV4dCwgY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBBdG9taWNTdHJpbmcm
IG1hcmssIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAor
eworICAgIEdseXBoQnVmZmVyIGdseXBoQnVmZmVyOworICAgIGZsb2F0IGluaXRpYWxBZHZhbmNl
ID0gZ2V0R2x5cGhzQW5kQWR2YW5jZXNGb3JTaW1wbGVUZXh0KHJ1biwgZnJvbSwgdG8sIGdseXBo
QnVmZmVyLCBGb3JUZXh0RW1waGFzaXMpOworCisgICAgaWYgKGdseXBoQnVmZmVyLmlzRW1wdHko
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgZHJhd0VtcGhhc2lzTWFya3MoY29udGV4dCwgcnVu
LCBnbHlwaEJ1ZmZlciwgbWFyaywgRmxvYXRQb2ludChwb2ludC54KCkgKyBpbml0aWFsQWR2YW5j
ZSwgcG9pbnQueSgpKSk7Cit9CisKK3ZvaWQgRm9udENhc2NhZGU6OmRyYXdHbHlwaEJ1ZmZlcihH
cmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgR2x5cGhC
dWZmZXImIGdseXBoQnVmZmVyLCBGbG9hdFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyNpZiAhRU5B
QkxFKFNWR19GT05UUykKKyAgICBVTlVTRURfUEFSQU0ocnVuKTsKKyNlbmRpZgorCisgICAgLy8g
RHJhdyBlYWNoIGNvbnRpZ3VvdXMgcnVuIG9mIGdseXBocyB0aGF0IHVzZSB0aGUgc2FtZSBmb250
IGRhdGEuCisgICAgY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnREYXRhID0gZ2x5cGhCdWZmZXIu
Zm9udERhdGFBdCgwKTsKKyAgICBGbG9hdFNpemUgb2Zmc2V0ID0gZ2x5cGhCdWZmZXIub2Zmc2V0
QXQoMCk7CisgICAgRmxvYXRQb2ludCBzdGFydFBvaW50KHBvaW50LngoKSwgcG9pbnQueSgpIC0g
Z2x5cGhCdWZmZXIuaW5pdGlhbEFkdmFuY2UoKS5oZWlnaHQoKSk7CisgICAgZmxvYXQgbmV4dFgg
PSBzdGFydFBvaW50LngoKSArIGdseXBoQnVmZmVyLmFkdmFuY2VBdCgwKS53aWR0aCgpOworICAg
IGZsb2F0IG5leHRZID0gc3RhcnRQb2ludC55KCkgKyBnbHlwaEJ1ZmZlci5hZHZhbmNlQXQoMCku
aGVpZ2h0KCk7CisgICAgaW50IGxhc3RGcm9tID0gMDsKKyAgICBpbnQgbmV4dEdseXBoID0gMTsK
KyNpZiBFTkFCTEUoU1ZHX0ZPTlRTKQorICAgIFRleHRSdW46OlJlbmRlcmluZ0NvbnRleHQqIHJl
bmRlcmluZ0NvbnRleHQgPSBydW4ucmVuZGVyaW5nQ29udGV4dCgpOworI2VuZGlmCisgICAgd2hp
bGUgKG5leHRHbHlwaCA8IGdseXBoQnVmZmVyLnNpemUoKSkgeworICAgICAgICBjb25zdCBTaW1w
bGVGb250RGF0YSogbmV4dEZvbnREYXRhID0gZ2x5cGhCdWZmZXIuZm9udERhdGFBdChuZXh0R2x5
cGgpOworICAgICAgICBGbG9hdFNpemUgbmV4dE9mZnNldCA9IGdseXBoQnVmZmVyLm9mZnNldEF0
KG5leHRHbHlwaCk7CisKKyAgICAgICAgaWYgKG5leHRGb250RGF0YSAhPSBmb250RGF0YSB8fCBu
ZXh0T2Zmc2V0ICE9IG9mZnNldCkgeworI2lmIEVOQUJMRShTVkdfRk9OVFMpCisgICAgICAgICAg
ICBpZiAocmVuZGVyaW5nQ29udGV4dCAmJiBmb250RGF0YS0+aXNTVkdGb250KCkpCisgICAgICAg
ICAgICAgICAgcmVuZGVyaW5nQ29udGV4dC0+ZHJhd1NWR0dseXBocyhjb250ZXh0LCBmb250RGF0
YSwgZ2x5cGhCdWZmZXIsIGxhc3RGcm9tLCBuZXh0R2x5cGggLSBsYXN0RnJvbSwgc3RhcnRQb2lu
dCk7CisgICAgICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICBkcmF3R2x5cGhz
KGNvbnRleHQsIGZvbnREYXRhLCBnbHlwaEJ1ZmZlciwgbGFzdEZyb20sIG5leHRHbHlwaCAtIGxh
c3RGcm9tLCBzdGFydFBvaW50KTsKKworICAgICAgICAgICAgbGFzdEZyb20gPSBuZXh0R2x5cGg7
CisgICAgICAgICAgICBmb250RGF0YSA9IG5leHRGb250RGF0YTsKKyAgICAgICAgICAgIG9mZnNl
dCA9IG5leHRPZmZzZXQ7CisgICAgICAgICAgICBzdGFydFBvaW50LnNldFgobmV4dFgpOworICAg
ICAgICAgICAgc3RhcnRQb2ludC5zZXRZKG5leHRZKTsKKyAgICAgICAgfQorICAgICAgICBuZXh0
WCArPSBnbHlwaEJ1ZmZlci5hZHZhbmNlQXQobmV4dEdseXBoKS53aWR0aCgpOworICAgICAgICBu
ZXh0WSArPSBnbHlwaEJ1ZmZlci5hZHZhbmNlQXQobmV4dEdseXBoKS5oZWlnaHQoKTsKKyAgICAg
ICAgbmV4dEdseXBoKys7CisgICAgfQorCisjaWYgRU5BQkxFKFNWR19GT05UUykKKyAgICBpZiAo
cmVuZGVyaW5nQ29udGV4dCAmJiBmb250RGF0YS0+aXNTVkdGb250KCkpCisgICAgICAgIHJlbmRl
cmluZ0NvbnRleHQtPmRyYXdTVkdHbHlwaHMoY29udGV4dCwgZm9udERhdGEsIGdseXBoQnVmZmVy
LCBsYXN0RnJvbSwgbmV4dEdseXBoIC0gbGFzdEZyb20sIHN0YXJ0UG9pbnQpOworICAgIGVsc2UK
KyNlbmRpZgorICAgIHsKKyAgICAgICAgZHJhd0dseXBocyhjb250ZXh0LCBmb250RGF0YSwgZ2x5
cGhCdWZmZXIsIGxhc3RGcm9tLCBuZXh0R2x5cGggLSBsYXN0RnJvbSwgc3RhcnRQb2ludCk7Cisg
ICAgICAgIHBvaW50LnNldFgobmV4dFgpOworICAgIH0KK30KKworaW5saW5lIHN0YXRpYyBmbG9h
dCBvZmZzZXRUb01pZGRsZU9mR2x5cGgoY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnREYXRhLCBH
bHlwaCBnbHlwaCkKK3sKKyAgICBpZiAoZm9udERhdGEtPnBsYXRmb3JtRGF0YSgpLm9yaWVudGF0
aW9uKCkgPT0gSG9yaXpvbnRhbCkgeworICAgICAgICBGbG9hdFJlY3QgYm91bmRzID0gZm9udERh
dGEtPmJvdW5kc0ZvckdseXBoKGdseXBoKTsKKyAgICAgICAgcmV0dXJuIGJvdW5kcy54KCkgKyBi
b3VuZHMud2lkdGgoKSAvIDI7CisgICAgfQorICAgIC8vIEZJWE1FOiBVc2UgZ2x5cGggYm91bmRz
IG9uY2UgdGhleSBtYWtlIHNlbnNlIGZvciB2ZXJ0aWNhbCBmb250cy4KKyAgICByZXR1cm4gZm9u
dERhdGEtPndpZHRoRm9yR2x5cGgoZ2x5cGgpIC8gMjsKK30KKworaW5saW5lIHN0YXRpYyBmbG9h
dCBvZmZzZXRUb01pZGRsZU9mR2x5cGhBdEluZGV4KGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1
ZmZlciwgc2l6ZV90IGkpCit7CisgICAgcmV0dXJuIG9mZnNldFRvTWlkZGxlT2ZHbHlwaChnbHlw
aEJ1ZmZlci5mb250RGF0YUF0KGkpLCBnbHlwaEJ1ZmZlci5nbHlwaEF0KGkpKTsKK30KKwordm9p
ZCBGb250Q2FzY2FkZTo6ZHJhd0VtcGhhc2lzTWFya3MoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0
LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwgY29u
c3QgQXRvbWljU3RyaW5nJiBtYXJrLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29uc3QKK3sK
KyAgICBHbHlwaERhdGEgbWFya0dseXBoRGF0YTsKKyAgICBpZiAoIWdldEVtcGhhc2lzTWFya0ds
eXBoRGF0YShtYXJrLCBtYXJrR2x5cGhEYXRhKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY29u
c3QgU2ltcGxlRm9udERhdGEqIG1hcmtGb250RGF0YSA9IG1hcmtHbHlwaERhdGEuZm9udERhdGE7
CisgICAgQVNTRVJUKG1hcmtGb250RGF0YSk7CisgICAgaWYgKCFtYXJrRm9udERhdGEpCisgICAg
ICAgIHJldHVybjsKKworICAgIEdseXBoIG1hcmtHbHlwaCA9IG1hcmtHbHlwaERhdGEuZ2x5cGg7
CisgICAgR2x5cGggc3BhY2VHbHlwaCA9IG1hcmtGb250RGF0YS0+c3BhY2VHbHlwaCgpOworCisg
ICAgZmxvYXQgbWlkZGxlT2ZMYXN0R2x5cGggPSBvZmZzZXRUb01pZGRsZU9mR2x5cGhBdEluZGV4
KGdseXBoQnVmZmVyLCAwKTsKKyAgICBGbG9hdFBvaW50IHN0YXJ0UG9pbnQocG9pbnQueCgpICsg
bWlkZGxlT2ZMYXN0R2x5cGggLSBvZmZzZXRUb01pZGRsZU9mR2x5cGgobWFya0ZvbnREYXRhLCBt
YXJrR2x5cGgpLCBwb2ludC55KCkpOworCisgICAgR2x5cGhCdWZmZXIgbWFya0J1ZmZlcjsKKyAg
ICBmb3IgKGludCBpID0gMDsgaSArIDEgPCBnbHlwaEJ1ZmZlci5zaXplKCk7ICsraSkgeworICAg
ICAgICBmbG9hdCBtaWRkbGVPZk5leHRHbHlwaCA9IG9mZnNldFRvTWlkZGxlT2ZHbHlwaEF0SW5k
ZXgoZ2x5cGhCdWZmZXIsIGkgKyAxKTsKKyAgICAgICAgZmxvYXQgYWR2YW5jZSA9IGdseXBoQnVm
ZmVyLmFkdmFuY2VBdChpKS53aWR0aCgpIC0gbWlkZGxlT2ZMYXN0R2x5cGggKyBtaWRkbGVPZk5l
eHRHbHlwaDsKKyAgICAgICAgbWFya0J1ZmZlci5hZGQoZ2x5cGhCdWZmZXIuZ2x5cGhBdChpKSA/
IG1hcmtHbHlwaCA6IHNwYWNlR2x5cGgsIG1hcmtGb250RGF0YSwgYWR2YW5jZSk7CisgICAgICAg
IG1pZGRsZU9mTGFzdEdseXBoID0gbWlkZGxlT2ZOZXh0R2x5cGg7CisgICAgfQorICAgIG1hcmtC
dWZmZXIuYWRkKGdseXBoQnVmZmVyLmdseXBoQXQoZ2x5cGhCdWZmZXIuc2l6ZSgpIC0gMSkgPyBt
YXJrR2x5cGggOiBzcGFjZUdseXBoLCBtYXJrRm9udERhdGEsIDApOworCisgICAgZHJhd0dseXBo
QnVmZmVyKGNvbnRleHQsIHJ1biwgbWFya0J1ZmZlciwgc3RhcnRQb2ludCk7Cit9CisKK2Zsb2F0
IEZvbnRDYXNjYWRlOjpmbG9hdFdpZHRoRm9yU2ltcGxlVGV4dChjb25zdCBUZXh0UnVuJiBydW4s
IEhhc2hTZXQ8Y29uc3QgU2ltcGxlRm9udERhdGEqPiogZmFsbGJhY2tGb250cywgR2x5cGhPdmVy
ZmxvdyogZ2x5cGhPdmVyZmxvdykgY29uc3QKK3sKKyAgICBXaWR0aEl0ZXJhdG9yIGl0KHRoaXMs
IHJ1biwgZmFsbGJhY2tGb250cywgZ2x5cGhPdmVyZmxvdyk7CisgICAgR2x5cGhCdWZmZXIgZ2x5
cGhCdWZmZXI7CisgICAgaXQuYWR2YW5jZShydW4ubGVuZ3RoKCksICh0eXBlc2V0dGluZ0ZlYXR1
cmVzKCkgJiAoS2VybmluZyB8IExpZ2F0dXJlcykpID8gJmdseXBoQnVmZmVyIDogMCk7CisKKyAg
ICBpZiAoZ2x5cGhPdmVyZmxvdykgeworICAgICAgICBnbHlwaE92ZXJmbG93LT50b3AgPSBzdGQ6
Om1heDxpbnQ+KGdseXBoT3ZlcmZsb3ctPnRvcCwgY2VpbGYoLWl0Lm1pbkdseXBoQm91bmRpbmdC
b3hZKCkpIC0gKGdseXBoT3ZlcmZsb3ctPmNvbXB1dGVCb3VuZHMgPyAwIDogZm9udE1ldHJpY3Mo
KS5hc2NlbnQoKSkpOworICAgICAgICBnbHlwaE92ZXJmbG93LT5ib3R0b20gPSBzdGQ6Om1heDxp
bnQ+KGdseXBoT3ZlcmZsb3ctPmJvdHRvbSwgY2VpbGYoaXQubWF4R2x5cGhCb3VuZGluZ0JveFko
KSkgLSAoZ2x5cGhPdmVyZmxvdy0+Y29tcHV0ZUJvdW5kcyA/IDAgOiBmb250TWV0cmljcygpLmRl
c2NlbnQoKSkpOworICAgICAgICBnbHlwaE92ZXJmbG93LT5sZWZ0ID0gY2VpbGYoaXQuZmlyc3RH
bHlwaE92ZXJmbG93KCkpOworICAgICAgICBnbHlwaE92ZXJmbG93LT5yaWdodCA9IGNlaWxmKGl0
Lmxhc3RHbHlwaE92ZXJmbG93KCkpOworICAgIH0KKworICAgIHJldHVybiBpdC5tX3J1bldpZHRo
U29GYXI7Cit9CisKK3ZvaWQgRm9udENhc2NhZGU6OmFkanVzdFNlbGVjdGlvblJlY3RGb3JTaW1w
bGVUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgTGF5b3V0UmVjdCYgc2VsZWN0aW9uUmVjdCwgaW50
IGZyb20sIGludCB0bykgY29uc3QKK3sKKyAgICBHbHlwaEJ1ZmZlciBnbHlwaEJ1ZmZlcjsKKyAg
ICBXaWR0aEl0ZXJhdG9yIGl0KHRoaXMsIHJ1bik7CisgICAgaXQuYWR2YW5jZShmcm9tLCAmZ2x5
cGhCdWZmZXIpOworICAgIGZsb2F0IGJlZm9yZVdpZHRoID0gaXQubV9ydW5XaWR0aFNvRmFyOwor
ICAgIGl0LmFkdmFuY2UodG8sICZnbHlwaEJ1ZmZlcik7CisgICAgZmxvYXQgYWZ0ZXJXaWR0aCA9
IGl0Lm1fcnVuV2lkdGhTb0ZhcjsKKyAgICBmbG9hdCB0b3RhbFdpZHRoID0gLTE7CisKKyAgICBp
ZiAocnVuLnJ0bCgpKSB7CisgICAgICAgIGl0LmFkdmFuY2UocnVuLmxlbmd0aCgpLCAmZ2x5cGhC
dWZmZXIpOworICAgICAgICB0b3RhbFdpZHRoID0gaXQubV9ydW5XaWR0aFNvRmFyOworICAgICAg
ICBzZWxlY3Rpb25SZWN0Lm1vdmUodG90YWxXaWR0aCAtIGFmdGVyV2lkdGgsIDApOworICAgIH0g
ZWxzZQorICAgICAgICBzZWxlY3Rpb25SZWN0Lm1vdmUoYmVmb3JlV2lkdGgsIDApOworICAgIHNl
bGVjdGlvblJlY3Quc2V0V2lkdGgoYWZ0ZXJXaWR0aCAtIGJlZm9yZVdpZHRoKTsKK30KKworaW50
IEZvbnRDYXNjYWRlOjpvZmZzZXRGb3JQb3NpdGlvbkZvclNpbXBsZVRleHQoY29uc3QgVGV4dFJ1
biYgcnVuLCBmbG9hdCB4LCBib29sIGluY2x1ZGVQYXJ0aWFsR2x5cGhzKSBjb25zdAoreworICAg
IGZsb2F0IGRlbHRhID0geDsKKworICAgIFdpZHRoSXRlcmF0b3IgaXQodGhpcywgcnVuKTsKKyAg
ICBHbHlwaEJ1ZmZlciBsb2NhbEdseXBoQnVmZmVyOworICAgIHVuc2lnbmVkIG9mZnNldDsKKyAg
ICBpZiAocnVuLnJ0bCgpKSB7CisgICAgICAgIGRlbHRhIC09IGZsb2F0V2lkdGhGb3JTaW1wbGVU
ZXh0KHJ1bik7CisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBvZmZzZXQgPSBpdC5t
X2N1cnJlbnRDaGFyYWN0ZXI7CisgICAgICAgICAgICBmbG9hdCB3OworICAgICAgICAgICAgaWYg
KCFpdC5hZHZhbmNlT25lQ2hhcmFjdGVyKHcsIGxvY2FsR2x5cGhCdWZmZXIpKQorICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVsdGEgKz0gdzsKKyAgICAgICAgICAgIGlmIChp
bmNsdWRlUGFydGlhbEdseXBocykgeworICAgICAgICAgICAgICAgIGlmIChkZWx0YSAtIHcgLyAy
ID49IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB3aGls
ZSAoMSkgeworICAgICAgICAgICAgb2Zmc2V0ID0gaXQubV9jdXJyZW50Q2hhcmFjdGVyOworICAg
ICAgICAgICAgZmxvYXQgdzsKKyAgICAgICAgICAgIGlmICghaXQuYWR2YW5jZU9uZUNoYXJhY3Rl
cih3LCBsb2NhbEdseXBoQnVmZmVyKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgIGRlbHRhIC09IHc7CisgICAgICAgICAgICBpZiAoaW5jbHVkZVBhcnRpYWxHbHlwaHMpIHsK
KyAgICAgICAgICAgICAgICBpZiAoZGVsdGEgKyB3IC8gMiA8PSAwKQorICAgICAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGRl
bHRhIDw9IDApCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAg
ICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG9mZnNldDsKK30KKworCiB9CkluZGV4OiBTb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250RmFzdFBhdGguY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRGYXN0UGF0aC5jcHAJKHJl
dmlzaW9uIDE3ODU3NykKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0ZvbnRG
YXN0UGF0aC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEsMzQxICswLDAgQEAKLS8qKgotICogQ29w
eXJpZ2h0IChDKSAyMDAzLCAyMDA2LCAyMDEwIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KLSAqIENvcHlyaWdodCAoQykgMjAwOCBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgotICog
Q29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgotICoKLSAqIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
Ci0gKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKLSAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO
VQotICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0g
KgotICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZQotICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KLSAqIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0g
KiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KLSAqCi0gKi8KLQotI2luY2x1ZGUgImNvbmZp
Zy5oIgotI2luY2x1ZGUgIkZvbnRDYXNjYWRlLmgiCi0KLSNpbmNsdWRlICJGbG9hdFJlY3QuaCIK
LSNpbmNsdWRlICJGb250R2x5cGhzLmgiCi0jaW5jbHVkZSAiR2x5cGhCdWZmZXIuaCIKLSNpbmNs
dWRlICJMYXlvdXRSZWN0LmgiCi0jaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKLSNpbmNsdWRl
ICJUZXh0UnVuLmgiCi0jaW5jbHVkZSAiV2lkdGhJdGVyYXRvci5oIgotI2luY2x1ZGUgPHd0Zi9N
YWluVGhyZWFkLmg+Ci0jaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KLSNpbmNsdWRlIDx3dGYv
dW5pY29kZS9DaGFyYWN0ZXJOYW1lcy5oPgotCi11c2luZyBuYW1lc3BhY2UgV1RGOwotdXNpbmcg
bmFtZXNwYWNlIFVuaWNvZGU7Ci0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotLy8gRklYTUU6IFRo
aXMgZnVuY3Rpb24gbWF5IG5vdCB3b3JrIGlmIHRoZSBlbXBoYXNpcyBtYXJrIHVzZXMgYSBjb21w
bGV4IHNjcmlwdCwgYnV0IG5vbmUgb2YgdGhlCi0vLyBzdGFuZGFyZCBlbXBoYXNpcyBtYXJrcyBk
byBzby4KLWJvb2wgRm9udENhc2NhZGU6OmdldEVtcGhhc2lzTWFya0dseXBoRGF0YShjb25zdCBB
dG9taWNTdHJpbmcmIG1hcmssIEdseXBoRGF0YSYgZ2x5cGhEYXRhKSBjb25zdAotewotICAgIGlm
IChtYXJrLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgVUNoYXIzMiBj
aGFyYWN0ZXIgPSBtYXJrWzBdOwotCi0gICAgaWYgKFUxNl9JU19TVVJST0dBVEUoY2hhcmFjdGVy
KSkgewotICAgICAgICBpZiAoIVUxNl9JU19TVVJST0dBVEVfTEVBRChjaGFyYWN0ZXIpKQotICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmIChtYXJrLmxlbmd0aCgpIDwgMikK
LSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQotICAgICAgICBVQ2hhciBsb3cgPSBtYXJrWzFd
OwotICAgICAgICBpZiAoIVUxNl9JU19UUkFJTChsb3cpKQotICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotCi0gICAgICAgIGNoYXJhY3RlciA9IFUxNl9HRVRfU1VQUExFTUVOVEFSWShjaGFyYWN0
ZXIsIGxvdyk7Ci0gICAgfQotCi0gICAgZ2x5cGhEYXRhID0gZ2x5cGhEYXRhRm9yQ2hhcmFjdGVy
KGNoYXJhY3RlciwgZmFsc2UsIEVtcGhhc2lzTWFya1ZhcmlhbnQpOwotICAgIHJldHVybiB0cnVl
OwotfQotCi1pbnQgRm9udENhc2NhZGU6OmVtcGhhc2lzTWFya0FzY2VudChjb25zdCBBdG9taWNT
dHJpbmcmIG1hcmspIGNvbnN0Ci17Ci0gICAgR2x5cGhEYXRhIG1hcmtHbHlwaERhdGE7Ci0gICAg
aWYgKCFnZXRFbXBoYXNpc01hcmtHbHlwaERhdGEobWFyaywgbWFya0dseXBoRGF0YSkpCi0gICAg
ICAgIHJldHVybiAwOwotCi0gICAgY29uc3QgU2ltcGxlRm9udERhdGEqIG1hcmtGb250RGF0YSA9
IG1hcmtHbHlwaERhdGEuZm9udERhdGE7Ci0gICAgQVNTRVJUKG1hcmtGb250RGF0YSk7Ci0gICAg
aWYgKCFtYXJrRm9udERhdGEpCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIG1hcmtG
b250RGF0YS0+Zm9udE1ldHJpY3MoKS5hc2NlbnQoKTsKLX0KLQotaW50IEZvbnRDYXNjYWRlOjpl
bXBoYXNpc01hcmtEZXNjZW50KGNvbnN0IEF0b21pY1N0cmluZyYgbWFyaykgY29uc3QKLXsKLSAg
ICBHbHlwaERhdGEgbWFya0dseXBoRGF0YTsKLSAgICBpZiAoIWdldEVtcGhhc2lzTWFya0dseXBo
RGF0YShtYXJrLCBtYXJrR2x5cGhEYXRhKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBjb25z
dCBTaW1wbGVGb250RGF0YSogbWFya0ZvbnREYXRhID0gbWFya0dseXBoRGF0YS5mb250RGF0YTsK
LSAgICBBU1NFUlQobWFya0ZvbnREYXRhKTsKLSAgICBpZiAoIW1hcmtGb250RGF0YSkKLSAgICAg
ICAgcmV0dXJuIDA7Ci0KLSAgICByZXR1cm4gbWFya0ZvbnREYXRhLT5mb250TWV0cmljcygpLmRl
c2NlbnQoKTsKLX0KLQotaW50IEZvbnRDYXNjYWRlOjplbXBoYXNpc01hcmtIZWlnaHQoY29uc3Qg
QXRvbWljU3RyaW5nJiBtYXJrKSBjb25zdAotewotICAgIEdseXBoRGF0YSBtYXJrR2x5cGhEYXRh
OwotICAgIGlmICghZ2V0RW1waGFzaXNNYXJrR2x5cGhEYXRhKG1hcmssIG1hcmtHbHlwaERhdGEp
KQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBtYXJrRm9u
dERhdGEgPSBtYXJrR2x5cGhEYXRhLmZvbnREYXRhOwotICAgIEFTU0VSVChtYXJrRm9udERhdGEp
OwotICAgIGlmICghbWFya0ZvbnREYXRhKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHJldHVy
biBtYXJrRm9udERhdGEtPmZvbnRNZXRyaWNzKCkuaGVpZ2h0KCk7Ci19Ci0KLWZsb2F0IEZvbnRD
YXNjYWRlOjpnZXRHbHlwaHNBbmRBZHZhbmNlc0ZvclNpbXBsZVRleHQoY29uc3QgVGV4dFJ1biYg
cnVuLCBpbnQgZnJvbSwgaW50IHRvLCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsIEZvclRleHRF
bXBoYXNpc09yTm90IGZvclRleHRFbXBoYXNpcykgY29uc3QKLXsKLSAgICBmbG9hdCBpbml0aWFs
QWR2YW5jZTsKLQotICAgIFdpZHRoSXRlcmF0b3IgaXQodGhpcywgcnVuLCAwLCBmYWxzZSwgZm9y
VGV4dEVtcGhhc2lzKTsKLSAgICAvLyBGSVhNRTogVXNpbmcgc2VwYXJhdGUgZ2x5cGggYnVmZmVy
cyBmb3IgdGhlIHByZWZpeCBhbmQgdGhlIHN1ZmZpeCBpcyBpbmNvcnJlY3Qgd2hlbiBrZXJuaW5n
IG9yCi0gICAgLy8gbGlnYXR1cmVzIGFyZSBlbmFibGVkLgotICAgIEdseXBoQnVmZmVyIGxvY2Fs
R2x5cGhCdWZmZXI7Ci0gICAgaXQuYWR2YW5jZShmcm9tLCAmbG9jYWxHbHlwaEJ1ZmZlcik7Ci0g
ICAgZmxvYXQgYmVmb3JlV2lkdGggPSBpdC5tX3J1bldpZHRoU29GYXI7Ci0gICAgaXQuYWR2YW5j
ZSh0bywgJmdseXBoQnVmZmVyKTsKLQotICAgIGlmIChnbHlwaEJ1ZmZlci5pc0VtcHR5KCkpCi0g
ICAgICAgIHJldHVybiAwOwotCi0gICAgZmxvYXQgYWZ0ZXJXaWR0aCA9IGl0Lm1fcnVuV2lkdGhT
b0ZhcjsKLQotICAgIGlmIChydW4ucnRsKCkpIHsKLSAgICAgICAgZmxvYXQgZmluYWxSb3VuZGlu
Z1dpZHRoID0gaXQubV9maW5hbFJvdW5kaW5nV2lkdGg7Ci0gICAgICAgIGl0LmFkdmFuY2UocnVu
Lmxlbmd0aCgpLCAmbG9jYWxHbHlwaEJ1ZmZlcik7Ci0gICAgICAgIGluaXRpYWxBZHZhbmNlID0g
ZmluYWxSb3VuZGluZ1dpZHRoICsgaXQubV9ydW5XaWR0aFNvRmFyIC0gYWZ0ZXJXaWR0aDsKLSAg
ICB9IGVsc2UKLSAgICAgICAgaW5pdGlhbEFkdmFuY2UgPSBiZWZvcmVXaWR0aDsKLQotICAgIGlm
IChydW4ucnRsKCkpCi0gICAgICAgIGdseXBoQnVmZmVyLnJldmVyc2UoMCwgZ2x5cGhCdWZmZXIu
c2l6ZSgpKTsKLQotICAgIHJldHVybiBpbml0aWFsQWR2YW5jZTsKLX0KLQotZmxvYXQgRm9udENh
c2NhZGU6OmRyYXdTaW1wbGVUZXh0KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgVGV4
dFJ1biYgcnVuLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgaW50IGZyb20sIGludCB0bykgY29u
c3QKLXsKLSAgICAvLyBUaGlzIGdseXBoIGJ1ZmZlciBob2xkcyBvdXIgZ2x5cGhzK2FkdmFuY2Vz
K2ZvbnQgZGF0YSBmb3IgZWFjaCBnbHlwaC4KLSAgICBHbHlwaEJ1ZmZlciBnbHlwaEJ1ZmZlcjsK
LQotICAgIGZsb2F0IHN0YXJ0WCA9IHBvaW50LngoKSArIGdldEdseXBoc0FuZEFkdmFuY2VzRm9y
U2ltcGxlVGV4dChydW4sIGZyb20sIHRvLCBnbHlwaEJ1ZmZlcik7Ci0KLSAgICBpZiAoZ2x5cGhC
dWZmZXIuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIEZsb2F0UG9pbnQgc3Rh
cnRQb2ludChzdGFydFgsIHBvaW50LnkoKSk7Ci0gICAgZHJhd0dseXBoQnVmZmVyKGNvbnRleHQs
IHJ1biwgZ2x5cGhCdWZmZXIsIHN0YXJ0UG9pbnQpOwotCi0gICAgcmV0dXJuIHN0YXJ0UG9pbnQu
eCgpIC0gc3RhcnRYOwotfQotCi12b2lkIEZvbnRDYXNjYWRlOjpkcmF3RW1waGFzaXNNYXJrc0Zv
clNpbXBsZVRleHQoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBUZXh0UnVuJiBydW4s
IGNvbnN0IEF0b21pY1N0cmluZyYgbWFyaywgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGludCBm
cm9tLCBpbnQgdG8pIGNvbnN0Ci17Ci0gICAgR2x5cGhCdWZmZXIgZ2x5cGhCdWZmZXI7Ci0gICAg
ZmxvYXQgaW5pdGlhbEFkdmFuY2UgPSBnZXRHbHlwaHNBbmRBZHZhbmNlc0ZvclNpbXBsZVRleHQo
cnVuLCBmcm9tLCB0bywgZ2x5cGhCdWZmZXIsIEZvclRleHRFbXBoYXNpcyk7Ci0KLSAgICBpZiAo
Z2x5cGhCdWZmZXIuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICBkcmF3RW1waGFz
aXNNYXJrcyhjb250ZXh0LCBydW4sIGdseXBoQnVmZmVyLCBtYXJrLCBGbG9hdFBvaW50KHBvaW50
LngoKSArIGluaXRpYWxBZHZhbmNlLCBwb2ludC55KCkpKTsKLX0KLQotdm9pZCBGb250Q2FzY2Fk
ZTo6ZHJhd0dseXBoQnVmZmVyKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgVGV4dFJ1
biYgcnVuLCBjb25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsIEZsb2F0UG9pbnQmIHBvaW50
KSBjb25zdAotewotI2lmICFFTkFCTEUoU1ZHX0ZPTlRTKQotICAgIFVOVVNFRF9QQVJBTShydW4p
OwotI2VuZGlmCi0KLSAgICAvLyBEcmF3IGVhY2ggY29udGlndW91cyBydW4gb2YgZ2x5cGhzIHRo
YXQgdXNlIHRoZSBzYW1lIGZvbnQgZGF0YS4KLSAgICBjb25zdCBTaW1wbGVGb250RGF0YSogZm9u
dERhdGEgPSBnbHlwaEJ1ZmZlci5mb250RGF0YUF0KDApOwotICAgIEZsb2F0U2l6ZSBvZmZzZXQg
PSBnbHlwaEJ1ZmZlci5vZmZzZXRBdCgwKTsKLSAgICBGbG9hdFBvaW50IHN0YXJ0UG9pbnQocG9p
bnQueCgpLCBwb2ludC55KCkgLSBnbHlwaEJ1ZmZlci5pbml0aWFsQWR2YW5jZSgpLmhlaWdodCgp
KTsKLSAgICBmbG9hdCBuZXh0WCA9IHN0YXJ0UG9pbnQueCgpICsgZ2x5cGhCdWZmZXIuYWR2YW5j
ZUF0KDApLndpZHRoKCk7Ci0gICAgZmxvYXQgbmV4dFkgPSBzdGFydFBvaW50LnkoKSArIGdseXBo
QnVmZmVyLmFkdmFuY2VBdCgwKS5oZWlnaHQoKTsKLSAgICBpbnQgbGFzdEZyb20gPSAwOwotICAg
IGludCBuZXh0R2x5cGggPSAxOwotI2lmIEVOQUJMRShTVkdfRk9OVFMpCi0gICAgVGV4dFJ1bjo6
UmVuZGVyaW5nQ29udGV4dCogcmVuZGVyaW5nQ29udGV4dCA9IHJ1bi5yZW5kZXJpbmdDb250ZXh0
KCk7Ci0jZW5kaWYKLSAgICB3aGlsZSAobmV4dEdseXBoIDwgZ2x5cGhCdWZmZXIuc2l6ZSgpKSB7
Ci0gICAgICAgIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBuZXh0Rm9udERhdGEgPSBnbHlwaEJ1ZmZl
ci5mb250RGF0YUF0KG5leHRHbHlwaCk7Ci0gICAgICAgIEZsb2F0U2l6ZSBuZXh0T2Zmc2V0ID0g
Z2x5cGhCdWZmZXIub2Zmc2V0QXQobmV4dEdseXBoKTsKLQotICAgICAgICBpZiAobmV4dEZvbnRE
YXRhICE9IGZvbnREYXRhIHx8IG5leHRPZmZzZXQgIT0gb2Zmc2V0KSB7Ci0jaWYgRU5BQkxFKFNW
R19GT05UUykKLSAgICAgICAgICAgIGlmIChyZW5kZXJpbmdDb250ZXh0ICYmIGZvbnREYXRhLT5p
c1NWR0ZvbnQoKSkKLSAgICAgICAgICAgICAgICByZW5kZXJpbmdDb250ZXh0LT5kcmF3U1ZHR2x5
cGhzKGNvbnRleHQsIGZvbnREYXRhLCBnbHlwaEJ1ZmZlciwgbGFzdEZyb20sIG5leHRHbHlwaCAt
IGxhc3RGcm9tLCBzdGFydFBvaW50KTsKLSAgICAgICAgICAgIGVsc2UKLSNlbmRpZgotICAgICAg
ICAgICAgICAgIGRyYXdHbHlwaHMoY29udGV4dCwgZm9udERhdGEsIGdseXBoQnVmZmVyLCBsYXN0
RnJvbSwgbmV4dEdseXBoIC0gbGFzdEZyb20sIHN0YXJ0UG9pbnQpOwotCi0gICAgICAgICAgICBs
YXN0RnJvbSA9IG5leHRHbHlwaDsKLSAgICAgICAgICAgIGZvbnREYXRhID0gbmV4dEZvbnREYXRh
OwotICAgICAgICAgICAgb2Zmc2V0ID0gbmV4dE9mZnNldDsKLSAgICAgICAgICAgIHN0YXJ0UG9p
bnQuc2V0WChuZXh0WCk7Ci0gICAgICAgICAgICBzdGFydFBvaW50LnNldFkobmV4dFkpOwotICAg
ICAgICB9Ci0gICAgICAgIG5leHRYICs9IGdseXBoQnVmZmVyLmFkdmFuY2VBdChuZXh0R2x5cGgp
LndpZHRoKCk7Ci0gICAgICAgIG5leHRZICs9IGdseXBoQnVmZmVyLmFkdmFuY2VBdChuZXh0R2x5
cGgpLmhlaWdodCgpOwotICAgICAgICBuZXh0R2x5cGgrKzsKLSAgICB9Ci0KLSNpZiBFTkFCTEUo
U1ZHX0ZPTlRTKQotICAgIGlmIChyZW5kZXJpbmdDb250ZXh0ICYmIGZvbnREYXRhLT5pc1NWR0Zv
bnQoKSkKLSAgICAgICAgcmVuZGVyaW5nQ29udGV4dC0+ZHJhd1NWR0dseXBocyhjb250ZXh0LCBm
b250RGF0YSwgZ2x5cGhCdWZmZXIsIGxhc3RGcm9tLCBuZXh0R2x5cGggLSBsYXN0RnJvbSwgc3Rh
cnRQb2ludCk7Ci0gICAgZWxzZQotI2VuZGlmCi0gICAgewotICAgICAgICBkcmF3R2x5cGhzKGNv
bnRleHQsIGZvbnREYXRhLCBnbHlwaEJ1ZmZlciwgbGFzdEZyb20sIG5leHRHbHlwaCAtIGxhc3RG
cm9tLCBzdGFydFBvaW50KTsKLSAgICAgICAgcG9pbnQuc2V0WChuZXh0WCk7Ci0gICAgfQotfQot
Ci1pbmxpbmUgc3RhdGljIGZsb2F0IG9mZnNldFRvTWlkZGxlT2ZHbHlwaChjb25zdCBTaW1wbGVG
b250RGF0YSogZm9udERhdGEsIEdseXBoIGdseXBoKQotewotICAgIGlmIChmb250RGF0YS0+cGxh
dGZvcm1EYXRhKCkub3JpZW50YXRpb24oKSA9PSBIb3Jpem9udGFsKSB7Ci0gICAgICAgIEZsb2F0
UmVjdCBib3VuZHMgPSBmb250RGF0YS0+Ym91bmRzRm9yR2x5cGgoZ2x5cGgpOwotICAgICAgICBy
ZXR1cm4gYm91bmRzLngoKSArIGJvdW5kcy53aWR0aCgpIC8gMjsKLSAgICB9Ci0gICAgLy8gRklY
TUU6IFVzZSBnbHlwaCBib3VuZHMgb25jZSB0aGV5IG1ha2Ugc2Vuc2UgZm9yIHZlcnRpY2FsIGZv
bnRzLgotICAgIHJldHVybiBmb250RGF0YS0+d2lkdGhGb3JHbHlwaChnbHlwaCkgLyAyOwotfQot
Ci1pbmxpbmUgc3RhdGljIGZsb2F0IG9mZnNldFRvTWlkZGxlT2ZHbHlwaEF0SW5kZXgoY29uc3Qg
R2x5cGhCdWZmZXImIGdseXBoQnVmZmVyLCBzaXplX3QgaSkKLXsKLSAgICByZXR1cm4gb2Zmc2V0
VG9NaWRkbGVPZkdseXBoKGdseXBoQnVmZmVyLmZvbnREYXRhQXQoaSksIGdseXBoQnVmZmVyLmds
eXBoQXQoaSkpOwotfQotCi12b2lkIEZvbnRDYXNjYWRlOjpkcmF3RW1waGFzaXNNYXJrcyhHcmFw
aGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgR2x5cGhCdWZm
ZXImIGdseXBoQnVmZmVyLCBjb25zdCBBdG9taWNTdHJpbmcmIG1hcmssIGNvbnN0IEZsb2F0UG9p
bnQmIHBvaW50KSBjb25zdAotewotICAgIEdseXBoRGF0YSBtYXJrR2x5cGhEYXRhOwotICAgIGlm
ICghZ2V0RW1waGFzaXNNYXJrR2x5cGhEYXRhKG1hcmssIG1hcmtHbHlwaERhdGEpKQotICAgICAg
ICByZXR1cm47Ci0KLSAgICBjb25zdCBTaW1wbGVGb250RGF0YSogbWFya0ZvbnREYXRhID0gbWFy
a0dseXBoRGF0YS5mb250RGF0YTsKLSAgICBBU1NFUlQobWFya0ZvbnREYXRhKTsKLSAgICBpZiAo
IW1hcmtGb250RGF0YSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgR2x5cGggbWFya0dseXBoID0g
bWFya0dseXBoRGF0YS5nbHlwaDsKLSAgICBHbHlwaCBzcGFjZUdseXBoID0gbWFya0ZvbnREYXRh
LT5zcGFjZUdseXBoKCk7Ci0KLSAgICBmbG9hdCBtaWRkbGVPZkxhc3RHbHlwaCA9IG9mZnNldFRv
TWlkZGxlT2ZHbHlwaEF0SW5kZXgoZ2x5cGhCdWZmZXIsIDApOwotICAgIEZsb2F0UG9pbnQgc3Rh
cnRQb2ludChwb2ludC54KCkgKyBtaWRkbGVPZkxhc3RHbHlwaCAtIG9mZnNldFRvTWlkZGxlT2ZH
bHlwaChtYXJrRm9udERhdGEsIG1hcmtHbHlwaCksIHBvaW50LnkoKSk7Ci0KLSAgICBHbHlwaEJ1
ZmZlciBtYXJrQnVmZmVyOwotICAgIGZvciAoaW50IGkgPSAwOyBpICsgMSA8IGdseXBoQnVmZmVy
LnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGZsb2F0IG1pZGRsZU9mTmV4dEdseXBoID0gb2Zmc2V0
VG9NaWRkbGVPZkdseXBoQXRJbmRleChnbHlwaEJ1ZmZlciwgaSArIDEpOwotICAgICAgICBmbG9h
dCBhZHZhbmNlID0gZ2x5cGhCdWZmZXIuYWR2YW5jZUF0KGkpLndpZHRoKCkgLSBtaWRkbGVPZkxh
c3RHbHlwaCArIG1pZGRsZU9mTmV4dEdseXBoOwotICAgICAgICBtYXJrQnVmZmVyLmFkZChnbHlw
aEJ1ZmZlci5nbHlwaEF0KGkpID8gbWFya0dseXBoIDogc3BhY2VHbHlwaCwgbWFya0ZvbnREYXRh
LCBhZHZhbmNlKTsKLSAgICAgICAgbWlkZGxlT2ZMYXN0R2x5cGggPSBtaWRkbGVPZk5leHRHbHlw
aDsKLSAgICB9Ci0gICAgbWFya0J1ZmZlci5hZGQoZ2x5cGhCdWZmZXIuZ2x5cGhBdChnbHlwaEJ1
ZmZlci5zaXplKCkgLSAxKSA/IG1hcmtHbHlwaCA6IHNwYWNlR2x5cGgsIG1hcmtGb250RGF0YSwg
MCk7Ci0KLSAgICBkcmF3R2x5cGhCdWZmZXIoY29udGV4dCwgcnVuLCBtYXJrQnVmZmVyLCBzdGFy
dFBvaW50KTsKLX0KLQotZmxvYXQgRm9udENhc2NhZGU6OmZsb2F0V2lkdGhGb3JTaW1wbGVUZXh0
KGNvbnN0IFRleHRSdW4mIHJ1biwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiBmYWxs
YmFja0ZvbnRzLCBHbHlwaE92ZXJmbG93KiBnbHlwaE92ZXJmbG93KSBjb25zdAotewotICAgIFdp
ZHRoSXRlcmF0b3IgaXQodGhpcywgcnVuLCBmYWxsYmFja0ZvbnRzLCBnbHlwaE92ZXJmbG93KTsK
LSAgICBHbHlwaEJ1ZmZlciBnbHlwaEJ1ZmZlcjsKLSAgICBpdC5hZHZhbmNlKHJ1bi5sZW5ndGgo
KSwgKHR5cGVzZXR0aW5nRmVhdHVyZXMoKSAmIChLZXJuaW5nIHwgTGlnYXR1cmVzKSkgPyAmZ2x5
cGhCdWZmZXIgOiAwKTsKLQotICAgIGlmIChnbHlwaE92ZXJmbG93KSB7Ci0gICAgICAgIGdseXBo
T3ZlcmZsb3ctPnRvcCA9IHN0ZDo6bWF4PGludD4oZ2x5cGhPdmVyZmxvdy0+dG9wLCBjZWlsZigt
aXQubWluR2x5cGhCb3VuZGluZ0JveFkoKSkgLSAoZ2x5cGhPdmVyZmxvdy0+Y29tcHV0ZUJvdW5k
cyA/IDAgOiBmb250TWV0cmljcygpLmFzY2VudCgpKSk7Ci0gICAgICAgIGdseXBoT3ZlcmZsb3ct
PmJvdHRvbSA9IHN0ZDo6bWF4PGludD4oZ2x5cGhPdmVyZmxvdy0+Ym90dG9tLCBjZWlsZihpdC5t
YXhHbHlwaEJvdW5kaW5nQm94WSgpKSAtIChnbHlwaE92ZXJmbG93LT5jb21wdXRlQm91bmRzID8g
MCA6IGZvbnRNZXRyaWNzKCkuZGVzY2VudCgpKSk7Ci0gICAgICAgIGdseXBoT3ZlcmZsb3ctPmxl
ZnQgPSBjZWlsZihpdC5maXJzdEdseXBoT3ZlcmZsb3coKSk7Ci0gICAgICAgIGdseXBoT3ZlcmZs
b3ctPnJpZ2h0ID0gY2VpbGYoaXQubGFzdEdseXBoT3ZlcmZsb3coKSk7Ci0gICAgfQotCi0gICAg
cmV0dXJuIGl0Lm1fcnVuV2lkdGhTb0ZhcjsKLX0KLQotdm9pZCBGb250Q2FzY2FkZTo6YWRqdXN0
U2VsZWN0aW9uUmVjdEZvclNpbXBsZVRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBMYXlvdXRSZWN0
JiBzZWxlY3Rpb25SZWN0LCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAotewotICAgIEdseXBoQnVm
ZmVyIGdseXBoQnVmZmVyOwotICAgIFdpZHRoSXRlcmF0b3IgaXQodGhpcywgcnVuKTsKLSAgICBp
dC5hZHZhbmNlKGZyb20sICZnbHlwaEJ1ZmZlcik7Ci0gICAgZmxvYXQgYmVmb3JlV2lkdGggPSBp
dC5tX3J1bldpZHRoU29GYXI7Ci0gICAgaXQuYWR2YW5jZSh0bywgJmdseXBoQnVmZmVyKTsKLSAg
ICBmbG9hdCBhZnRlcldpZHRoID0gaXQubV9ydW5XaWR0aFNvRmFyOwotICAgIGZsb2F0IHRvdGFs
V2lkdGggPSAtMTsKLQotICAgIGlmIChydW4ucnRsKCkpIHsKLSAgICAgICAgaXQuYWR2YW5jZShy
dW4ubGVuZ3RoKCksICZnbHlwaEJ1ZmZlcik7Ci0gICAgICAgIHRvdGFsV2lkdGggPSBpdC5tX3J1
bldpZHRoU29GYXI7Ci0gICAgICAgIHNlbGVjdGlvblJlY3QubW92ZSh0b3RhbFdpZHRoIC0gYWZ0
ZXJXaWR0aCwgMCk7Ci0gICAgfSBlbHNlCi0gICAgICAgIHNlbGVjdGlvblJlY3QubW92ZShiZWZv
cmVXaWR0aCwgMCk7Ci0gICAgc2VsZWN0aW9uUmVjdC5zZXRXaWR0aChhZnRlcldpZHRoIC0gYmVm
b3JlV2lkdGgpOwotfQotCi1pbnQgRm9udENhc2NhZGU6Om9mZnNldEZvclBvc2l0aW9uRm9yU2lt
cGxlVGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGZsb2F0IHgsIGJvb2wgaW5jbHVkZVBhcnRpYWxH
bHlwaHMpIGNvbnN0Ci17Ci0gICAgZmxvYXQgZGVsdGEgPSB4OwotCi0gICAgV2lkdGhJdGVyYXRv
ciBpdCh0aGlzLCBydW4pOwotICAgIEdseXBoQnVmZmVyIGxvY2FsR2x5cGhCdWZmZXI7Ci0gICAg
dW5zaWduZWQgb2Zmc2V0OwotICAgIGlmIChydW4ucnRsKCkpIHsKLSAgICAgICAgZGVsdGEgLT0g
ZmxvYXRXaWR0aEZvclNpbXBsZVRleHQocnVuKTsKLSAgICAgICAgd2hpbGUgKDEpIHsKLSAgICAg
ICAgICAgIG9mZnNldCA9IGl0Lm1fY3VycmVudENoYXJhY3RlcjsKLSAgICAgICAgICAgIGZsb2F0
IHc7Ci0gICAgICAgICAgICBpZiAoIWl0LmFkdmFuY2VPbmVDaGFyYWN0ZXIodywgbG9jYWxHbHlw
aEJ1ZmZlcikpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWx0YSArPSB3
OwotICAgICAgICAgICAgaWYgKGluY2x1ZGVQYXJ0aWFsR2x5cGhzKSB7Ci0gICAgICAgICAgICAg
ICAgaWYgKGRlbHRhIC0gdyAvIDIgPj0gMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0g
ICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+PSAwKQotICAg
ICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0g
ZWxzZSB7Ci0gICAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgICAgICBvZmZzZXQgPSBpdC5tX2N1
cnJlbnRDaGFyYWN0ZXI7Ci0gICAgICAgICAgICBmbG9hdCB3OwotICAgICAgICAgICAgaWYgKCFp
dC5hZHZhbmNlT25lQ2hhcmFjdGVyKHcsIGxvY2FsR2x5cGhCdWZmZXIpKQotICAgICAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICAgICAgZGVsdGEgLT0gdzsKLSAgICAgICAgICAgIGlmIChpbmNs
dWRlUGFydGlhbEdseXBocykgewotICAgICAgICAgICAgICAgIGlmIChkZWx0YSArIHcgLyAyIDw9
IDApCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgICAgICBpZiAoZGVsdGEgPD0gMCkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gb2Zmc2V0Owot
fQotCi19CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jb2NvYS9Gb250
Q2FzY2FkZUNvY29hLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2NvY29hL0ZvbnRDYXNjYWRlQ29jb2EubW0JKHJldmlzaW9uIDE3ODUxMCkJKGZyb20g
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0ZvbnRNYWMubW06MTc4NTEwKQor
KysgU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY29jb2EvRm9udENhc2NhZGVDb2Nv
YS5tbQkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYwNSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMTk5OSBMYXJzIEtub2xsIChrbm9sbEBrZGUub3JnKQorICogICAgICAgICAgIChDKSAxOTk5
IEFudHRpIEtvaXZpc3RvIChrb2l2aXN0b0BrZGUub3JnKQorICogICAgICAgICAgIChDKSAyMDAw
IERpcmsgTXVlbGxlciAobXVlbGxlckBrZGUub3JnKQorICogQ29weXJpZ2h0IChDKSAyMDAzLCAy
MDA2LCAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwLCAyMDExIEFwcGxlIEluYy4KKyAqCisgKiBUaGlz
IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y
CisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3Vy
IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3Ry
aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9V
VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICog
TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl
IHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh
aWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5
OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZs
b29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2ltcG9ydCAiY29u
ZmlnLmgiCisjaW1wb3J0ICJGb250Q2FzY2FkZS5oIgorCisjaW1wb3J0ICJDb3JlR3JhcGhpY3NT
UEkuaCIKKyNpbXBvcnQgIkNvcmVUZXh0U1BJLmgiCisjaW1wb3J0ICJEYXNoQXJyYXkuaCIKKyNp
bXBvcnQgIkdseXBoQnVmZmVyLmgiCisjaW1wb3J0ICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbXBv
cnQgIkxvZ2dpbmcuaCIKKyNpbXBvcnQgIlNpbXBsZUZvbnREYXRhLmgiCisjaW1wb3J0ICJXZWJD
b3JlU3lzdGVtSW50ZXJmYWNlLmgiCisjaWYgVVNFKEFQUEtJVCkKKyNpbXBvcnQgPEFwcEtpdC9B
cHBLaXQuaD4KKyNlbmRpZgorI2ltcG9ydCA8d3RmL01hdGhFeHRyYXMuaD4KKworI2lmIEVOQUJM
RShMRVRURVJQUkVTUykKKyNpbXBvcnQgIkNvcmVVSVNQSS5oIgorI2ltcG9ydCAiU29mdExpbmtp
bmcuaCIKKworU09GVF9MSU5LX1BSSVZBVEVfRlJBTUVXT1JLKENvcmVVSSkKK1NPRlRfTElOS19D
TEFTUyhDb3JlVUksIENVSUNhdGFsb2cpCitTT0ZUX0xJTktfQ0xBU1MoQ29yZVVJLCBDVUlTdHls
ZUVmZmVjdENvbmZpZ3VyYXRpb24pCisKK1NPRlRfTElOS19GUkFNRVdPUksoVUlLaXQpCitTT0ZU
X0xJTksoVUlLaXQsIF9VSUtpdEdldFRleHRFZmZlY3RzQ2F0YWxvZywgQ1VJQ2F0YWxvZyAqLCAo
dm9pZCksICgpKQorI2VuZGlmCisKKyNkZWZpbmUgU1lOVEhFVElDX09CTElRVUVfQU5HTEUgMTQK
KworI2lmZGVmIF9fTFA2NF9fCisjZGVmaW5lIFVSZWZDb24gdm9pZCoKKyNlbHNlCisjZGVmaW5l
IFVSZWZDb24gVUludDMyCisjZW5kaWYKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitib29sIEZv
bnRDYXNjYWRlOjpjYW5SZXR1cm5GYWxsYmFja0ZvbnRzRm9yQ29tcGxleFRleHQoKQoreworICAg
IHJldHVybiB0cnVlOworfQorCitib29sIEZvbnRDYXNjYWRlOjpjYW5FeHBhbmRBcm91bmRJZGVv
Z3JhcGhzSW5Db21wbGV4VGV4dCgpCit7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBp
bmxpbmUgdm9pZCBmaWxsVmVjdG9yV2l0aEhvcml6b250YWxHbHlwaFBvc2l0aW9ucyhWZWN0b3I8
Q0dQb2ludCwgMjU2PiYgcG9zaXRpb25zLCBDR0NvbnRleHRSZWYgY29udGV4dCwgY29uc3QgQ0dT
aXplKiBhZHZhbmNlcywgc2l6ZV90IGNvdW50KQoreworICAgIENHQWZmaW5lVHJhbnNmb3JtIG1h
dHJpeCA9IENHQWZmaW5lVHJhbnNmb3JtSW52ZXJ0KENHQ29udGV4dEdldFRleHRNYXRyaXgoY29u
dGV4dCkpOworICAgIHBvc2l0aW9uc1swXSA9IENHUG9pbnRaZXJvOworICAgIGZvciAoc2l6ZV90
IGkgPSAxOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICBDR1NpemUgYWR2YW5jZSA9IENHU2l6
ZUFwcGx5QWZmaW5lVHJhbnNmb3JtKGFkdmFuY2VzW2kgLSAxXSwgbWF0cml4KTsKKyAgICAgICAg
cG9zaXRpb25zW2ldLnggPSBwb3NpdGlvbnNbaSAtIDFdLnggKyBhZHZhbmNlLndpZHRoOworICAg
ICAgICBwb3NpdGlvbnNbaV0ueSA9IHBvc2l0aW9uc1tpIC0gMV0ueSArIGFkdmFuY2UuaGVpZ2h0
OworICAgIH0KK30KKworc3RhdGljIGlubGluZSBib29sIHNob3VsZFVzZUxldHRlcnByZXNzRWZm
ZWN0KGNvbnN0IEdyYXBoaWNzQ29udGV4dCYgY29udGV4dCkKK3sKKyNpZiBFTkFCTEUoTEVUVEVS
UFJFU1MpCisgICAgcmV0dXJuIGNvbnRleHQudGV4dERyYXdpbmdNb2RlKCkgJiBUZXh0TW9kZUxl
dHRlcnByZXNzOworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0oY29udGV4dCk7CisgICAgcmV0dXJu
IGZhbHNlOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHNob3dMZXR0ZXJwcmVzc2VkR2x5cGhz
V2l0aEFkdmFuY2VzKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBjb25zdCBTaW1wbGVGb250RGF0
YSogZm9udCwgQ0dDb250ZXh0UmVmIGNvbnRleHQsIGNvbnN0IENHR2x5cGgqIGdseXBocywgY29u
c3QgQ0dTaXplKiBhZHZhbmNlcywgc2l6ZV90IGNvdW50KQoreworI2lmIEVOQUJMRShMRVRURVJQ
UkVTUykKKyAgICBpZiAoIWNvdW50KQorICAgICAgICByZXR1cm47CisKKyAgICBjb25zdCBGb250
UGxhdGZvcm1EYXRhJiBwbGF0Zm9ybURhdGEgPSBmb250LT5wbGF0Zm9ybURhdGEoKTsKKyAgICBp
ZiAocGxhdGZvcm1EYXRhLm9yaWVudGF0aW9uKCkgPT0gVmVydGljYWwpIHsKKyAgICAgICAgLy8g
RklYTUU6IEltcGxlbWVudCBzdXBwb3J0IGZvciB2ZXJ0aWNhbCB0ZXh0LiBTZWUgPHJkYXI6Ly9w
cm9ibGVtLzEzNzM3Mjk4Pi4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENHQ29udGV4
dFNldFRleHRQb3NpdGlvbihjb250ZXh0LCBwb2ludC54KCksIHBvaW50LnkoKSk7CisgICAgVmVj
dG9yPENHUG9pbnQsIDI1Nj4gcG9zaXRpb25zKGNvdW50KTsKKyAgICBmaWxsVmVjdG9yV2l0aEhv
cml6b250YWxHbHlwaFBvc2l0aW9ucyhwb3NpdGlvbnMsIGNvbnRleHQsIGFkdmFuY2VzLCBjb3Vu
dCk7CisKKyAgICBDVEZvbnRSZWYgY3RGb250ID0gcGxhdGZvcm1EYXRhLmN0Rm9udCgpOworICAg
IENHQ29udGV4dFNldEZvbnRTaXplKGNvbnRleHQsIENURm9udEdldFNpemUoY3RGb250KSk7CisK
KyAgICBzdGF0aWMgQ1VJQ2F0YWxvZyAqY2F0YWxvZyA9IF9VSUtpdEdldFRleHRFZmZlY3RzQ2F0
YWxvZygpOworICAgIGlmICghY2F0YWxvZykKKyAgICAgICAgcmV0dXJuOworCisgICAgc3RhdGlj
IENVSVN0eWxlRWZmZWN0Q29uZmlndXJhdGlvbiAqc3R5bGVDb25maWd1cmF0aW9uOworICAgIGlm
ICghc3R5bGVDb25maWd1cmF0aW9uKSB7CisgICAgICAgIHN0eWxlQ29uZmlndXJhdGlvbiA9IFth
bGxvY0NVSVN0eWxlRWZmZWN0Q29uZmlndXJhdGlvbkluc3RhbmNlKCkgaW5pdF07CisgICAgICAg
IHN0eWxlQ29uZmlndXJhdGlvbi51c2VTaW1wbGlmaWVkRWZmZWN0ID0gWUVTOworICAgIH0KKwor
ICAgIFtjYXRhbG9nIGRyYXdHbHlwaHM6Z2x5cGhzIGF0UG9zaXRpb25zOnBvc2l0aW9ucy5kYXRh
KCkgaW5Db250ZXh0OmNvbnRleHQgd2l0aEZvbnQ6Y3RGb250IGNvdW50OmNvdW50IHN0eWxlUHJl
c2V0TmFtZTpAIl9VSUtpdE5ld0xldHRlcnByZXNzU3R5bGUiIHN0eWxlQ29uZmlndXJhdGlvbjpz
dHlsZUNvbmZpZ3VyYXRpb24gZm9yZWdyb3VuZENvbG9yOkNHQ29udGV4dEdldEZpbGxDb2xvckFz
Q29sb3IoY29udGV4dCldOworI2Vsc2UKKyAgICBVTlVTRURfUEFSQU0ocG9pbnQpOworICAgIFVO
VVNFRF9QQVJBTShmb250KTsKKyAgICBVTlVTRURfUEFSQU0oY29udGV4dCk7CisgICAgVU5VU0VE
X1BBUkFNKGdseXBocyk7CisgICAgVU5VU0VEX1BBUkFNKGFkdmFuY2VzKTsKKyAgICBVTlVTRURf
UEFSQU0oY291bnQpOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHNob3dHbHlwaHNXaXRoQWR2
YW5jZXMoY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250
LCBDR0NvbnRleHRSZWYgY29udGV4dCwgY29uc3QgQ0dHbHlwaCogZ2x5cGhzLCBjb25zdCBDR1Np
emUqIGFkdmFuY2VzLCBzaXplX3QgY291bnQpCit7CisgICAgaWYgKCFjb3VudCkKKyAgICAgICAg
cmV0dXJuOworCisgICAgQ0dDb250ZXh0U2V0VGV4dFBvc2l0aW9uKGNvbnRleHQsIHBvaW50Lngo
KSwgcG9pbnQueSgpKTsKKworICAgIGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0
YSA9IGZvbnQtPnBsYXRmb3JtRGF0YSgpOworICAgIFZlY3RvcjxDR1BvaW50LCAyNTY+IHBvc2l0
aW9ucyhjb3VudCk7CisgICAgaWYgKHBsYXRmb3JtRGF0YS5pc0NvbG9yQml0bWFwRm9udCgpKQor
ICAgICAgICBmaWxsVmVjdG9yV2l0aEhvcml6b250YWxHbHlwaFBvc2l0aW9ucyhwb3NpdGlvbnMs
IGNvbnRleHQsIGFkdmFuY2VzLCBjb3VudCk7CisgICAgaWYgKHBsYXRmb3JtRGF0YS5vcmllbnRh
dGlvbigpID09IFZlcnRpY2FsKSB7CisgICAgICAgIENHQWZmaW5lVHJhbnNmb3JtIHNhdmVkTWF0
cml4OworICAgICAgICBDR0FmZmluZVRyYW5zZm9ybSByb3RhdGVMZWZ0VHJhbnNmb3JtID0gQ0dB
ZmZpbmVUcmFuc2Zvcm1NYWtlKDAsIC0xLCAxLCAwLCAwLCAwKTsKKyAgICAgICAgc2F2ZWRNYXRy
aXggPSBDR0NvbnRleHRHZXRUZXh0TWF0cml4KGNvbnRleHQpOworICAgICAgICBDR0FmZmluZVRy
YW5zZm9ybSBydW5NYXRyaXggPSBDR0FmZmluZVRyYW5zZm9ybUNvbmNhdChzYXZlZE1hdHJpeCwg
cm90YXRlTGVmdFRyYW5zZm9ybSk7CisgICAgICAgIENHQ29udGV4dFNldFRleHRNYXRyaXgoY29u
dGV4dCwgcnVuTWF0cml4KTsKKworICAgICAgICBWZWN0b3I8Q0dTaXplLCAyNTY+IHRyYW5zbGF0
aW9ucyhjb3VudCk7CisgICAgICAgIENURm9udEdldFZlcnRpY2FsVHJhbnNsYXRpb25zRm9yR2x5
cGhzKHBsYXRmb3JtRGF0YS5jdEZvbnQoKSwgZ2x5cGhzLCB0cmFuc2xhdGlvbnMuZGF0YSgpLCBj
b3VudCk7CisKKyAgICAgICAgQ0dBZmZpbmVUcmFuc2Zvcm0gdHJhbnNmb3JtID0gQ0dBZmZpbmVU
cmFuc2Zvcm1JbnZlcnQoQ0dDb250ZXh0R2V0VGV4dE1hdHJpeChjb250ZXh0KSk7CisKKyAgICAg
ICAgQ0dQb2ludCBwb3NpdGlvbiA9IEZsb2F0UG9pbnQocG9pbnQueCgpLCBwb2ludC55KCkgKyBm
b250LT5mb250TWV0cmljcygpLmZsb2F0QXNjZW50KElkZW9ncmFwaGljQmFzZWxpbmUpIC0gZm9u
dC0+Zm9udE1ldHJpY3MoKS5mbG9hdEFzY2VudCgpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICAgICAgICBDR1NpemUgdHJhbnNsYXRpb24gPSBD
R1NpemVBcHBseUFmZmluZVRyYW5zZm9ybSh0cmFuc2xhdGlvbnNbaV0sIHJvdGF0ZUxlZnRUcmFu
c2Zvcm0pOworICAgICAgICAgICAgcG9zaXRpb25zW2ldID0gQ0dQb2ludEFwcGx5QWZmaW5lVHJh
bnNmb3JtKENHUG9pbnRNYWtlKHBvc2l0aW9uLnggLSB0cmFuc2xhdGlvbi53aWR0aCwgcG9zaXRp
b24ueSArIHRyYW5zbGF0aW9uLmhlaWdodCksIHRyYW5zZm9ybSk7CisgICAgICAgICAgICBwb3Np
dGlvbi54ICs9IGFkdmFuY2VzW2ldLndpZHRoOworICAgICAgICAgICAgcG9zaXRpb24ueSArPSBh
ZHZhbmNlc1tpXS5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFwbGF0Zm9ybURhdGEu
aXNDb2xvckJpdG1hcEZvbnQoKSkKKyAgICAgICAgICAgIENHQ29udGV4dFNob3dHbHlwaHNBdFBv
c2l0aW9ucyhjb250ZXh0LCBnbHlwaHMsIHBvc2l0aW9ucy5kYXRhKCksIGNvdW50KTsKKyAgICAg
ICAgZWxzZQorICAgICAgICAgICAgQ1RGb250RHJhd0dseXBocyhwbGF0Zm9ybURhdGEuY3RGb250
KCksIGdseXBocywgcG9zaXRpb25zLmRhdGEoKSwgY291bnQsIGNvbnRleHQpOworICAgICAgICBD
R0NvbnRleHRTZXRUZXh0TWF0cml4KGNvbnRleHQsIHNhdmVkTWF0cml4KTsKKyAgICB9IGVsc2Ug
eworICAgICAgICBpZiAoIXBsYXRmb3JtRGF0YS5pc0NvbG9yQml0bWFwRm9udCgpKQorI3ByYWdt
YSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVk
ICItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIgorICAgICAgICAgICAgQ0dDb250ZXh0U2hvd0ds
eXBoc1dpdGhBZHZhbmNlcyhjb250ZXh0LCBnbHlwaHMsIGFkdmFuY2VzLCBjb3VudCk7CisjcHJh
Z21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENURm9u
dERyYXdHbHlwaHMocGxhdGZvcm1EYXRhLmN0Rm9udCgpLCBnbHlwaHMsIHBvc2l0aW9ucy5kYXRh
KCksIGNvdW50LCBjb250ZXh0KTsKKyAgICB9Cit9CisKKyNpZiBQTEFURk9STShNQUMpCitzdGF0
aWMgdm9pZCBzZXRDR0ZvbnRSZW5kZXJpbmdNb2RlKENHQ29udGV4dFJlZiBjZ0NvbnRleHQsIE5T
Rm9udFJlbmRlcmluZ01vZGUgcmVuZGVyaW5nTW9kZSwgQk9PTCBzaG91bGRTdWJwaXhlbFF1YW50
aXplKQoreworICAgIGlmIChyZW5kZXJpbmdNb2RlID09IE5TRm9udEludGVnZXJBZHZhbmNlbWVu
dHNSZW5kZXJpbmdNb2RlKSB7CisgICAgICAgIENHQ29udGV4dFNldFNob3VsZEFudGlhbGlhc0Zv
bnRzKGNnQ29udGV4dCwgZmFsc2UpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ0dD
b250ZXh0U2V0U2hvdWxkQW50aWFsaWFzRm9udHMoY2dDb250ZXh0LCB0cnVlKTsKKworICAgIENH
QWZmaW5lVHJhbnNmb3JtIGNvbnRleHRUcmFuc2Zvcm0gPSBDR0NvbnRleHRHZXRDVE0oY2dDb250
ZXh0KTsKKyAgICBCT09MIGlzVHJhbnNsYXRpb25PckludGVncmFsU2NhbGUgPSBXVEY6OmlzSW50
ZWdyYWwoY29udGV4dFRyYW5zZm9ybS5hKSAmJiBXVEY6OmlzSW50ZWdyYWwoY29udGV4dFRyYW5z
Zm9ybS5kKSAmJiBjb250ZXh0VHJhbnNmb3JtLmIgPT0gMC5mICYmIGNvbnRleHRUcmFuc2Zvcm0u
YyA9PSAwLmY7CisgICAgQk9PTCBpc1JvdGF0ZWQgPSAoKGNvbnRleHRUcmFuc2Zvcm0uYiB8fCBj
b250ZXh0VHJhbnNmb3JtLmMpICYmIChjb250ZXh0VHJhbnNmb3JtLmEgfHwgY29udGV4dFRyYW5z
Zm9ybS5kKSk7CisgICAgQk9PTCBkb1N1YnBpeGVsUXVhbnRpemF0aW9uID0gaXNUcmFuc2xhdGlv
bk9ySW50ZWdyYWxTY2FsZSB8fCAoIWlzUm90YXRlZCAmJiBzaG91bGRTdWJwaXhlbFF1YW50aXpl
KTsKKworICAgIENHQ29udGV4dFNldFNob3VsZFN1YnBpeGVsUG9zaXRpb25Gb250cyhjZ0NvbnRl
eHQsIHJlbmRlcmluZ01vZGUgIT0gTlNGb250QW50aWFsaWFzZWRJbnRlZ2VyQWR2YW5jZW1lbnRz
UmVuZGVyaW5nTW9kZSB8fCAhaXNUcmFuc2xhdGlvbk9ySW50ZWdyYWxTY2FsZSk7CisgICAgQ0dD
b250ZXh0U2V0U2hvdWxkU3VicGl4ZWxRdWFudGl6ZUZvbnRzKGNnQ29udGV4dCwgZG9TdWJwaXhl
bFF1YW50aXphdGlvbik7Cit9CisjZW5kaWYKKwordm9pZCBGb250Q2FzY2FkZTo6ZHJhd0dseXBo
cyhHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250LCBj
b25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsIGludCBmcm9tLCBpbnQgbnVtR2x5cGhzLCBj
b25zdCBGbG9hdFBvaW50JiBhbmNob3JQb2ludCkgY29uc3QKK3sKKyAgICBjb25zdCBGb250UGxh
dGZvcm1EYXRhJiBwbGF0Zm9ybURhdGEgPSBmb250LT5wbGF0Zm9ybURhdGEoKTsKKyAgICBpZiAo
IXBsYXRmb3JtRGF0YS5zaXplKCkpCisgICAgICAgIHJldHVybjsKKworICAgIENHQ29udGV4dFJl
ZiBjZ0NvbnRleHQgPSBjb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKTsKKworICAgIGJvb2wgc2hv
dWxkU21vb3RoRm9udHM7CisgICAgYm9vbCBjaGFuZ2VGb250U21vb3RoaW5nOworICAgIAorICAg
IHN3aXRjaChmb250RGVzY3JpcHRpb24oKS5mb250U21vb3RoaW5nKCkpIHsKKyAgICBjYXNlIEFu
dGlhbGlhc2VkOiB7CisgICAgICAgIGNvbnRleHQtPnNldFNob3VsZEFudGlhbGlhcyh0cnVlKTsK
KyAgICAgICAgc2hvdWxkU21vb3RoRm9udHMgPSBmYWxzZTsKKyAgICAgICAgY2hhbmdlRm9udFNt
b290aGluZyA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFN1YnBpeGVs
QW50aWFsaWFzZWQ6IHsKKyAgICAgICAgY29udGV4dC0+c2V0U2hvdWxkQW50aWFsaWFzKHRydWUp
OworICAgICAgICBzaG91bGRTbW9vdGhGb250cyA9IHRydWU7CisgICAgICAgIGNoYW5nZUZvbnRT
bW9vdGhpbmcgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBOb1Ntb290
aGluZzogeworICAgICAgICBjb250ZXh0LT5zZXRTaG91bGRBbnRpYWxpYXMoZmFsc2UpOworICAg
ICAgICBzaG91bGRTbW9vdGhGb250cyA9IGZhbHNlOworICAgICAgICBjaGFuZ2VGb250U21vb3Ro
aW5nID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQXV0b1Ntb290aGlu
ZzogeworICAgICAgICBzaG91bGRTbW9vdGhGb250cyA9IHRydWU7CisgICAgICAgIGNoYW5nZUZv
bnRTbW9vdGhpbmcgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIH0KKyAgICAK
KyAgICBpZiAoIXNob3VsZFVzZVNtb290aGluZygpKSB7CisgICAgICAgIHNob3VsZFNtb290aEZv
bnRzID0gZmFsc2U7CisgICAgICAgIGNoYW5nZUZvbnRTbW9vdGhpbmcgPSB0cnVlOworICAgIH0K
KworI2lmICFQTEFURk9STShJT1MpCisgICAgYm9vbCBvcmlnaW5hbFNob3VsZFVzZUZvbnRTbW9v
dGhpbmcgPSBmYWxzZTsKKyAgICBpZiAoY2hhbmdlRm9udFNtb290aGluZykgeworICAgICAgICBv
cmlnaW5hbFNob3VsZFVzZUZvbnRTbW9vdGhpbmcgPSBDR0NvbnRleHRHZXRTaG91bGRTbW9vdGhG
b250cyhjZ0NvbnRleHQpOworICAgICAgICBDR0NvbnRleHRTZXRTaG91bGRTbW9vdGhGb250cyhj
Z0NvbnRleHQsIHNob3VsZFNtb290aEZvbnRzKTsKKyAgICB9CisjZW5kaWYKKworI2lmICFQTEFU
Rk9STShJT1MpCisgICAgTlNGb250KiBkcmF3Rm9udDsKKyAgICBpZiAoIWlzUHJpbnRlckZvbnQo
KSkgeworICAgICAgICBkcmF3Rm9udCA9IFtwbGF0Zm9ybURhdGEubnNGb250KCkgc2NyZWVuRm9u
dF07CisgICAgICAgIGlmIChkcmF3Rm9udCAhPSBwbGF0Zm9ybURhdGEubnNGb250KCkpIHsKKyAg
ICAgICAgICAgIC8vIFdlIGFyZSBnZXR0aW5nIHRoaXMgaW4gdG9vIG1hbnkgcGxhY2VzICgzNDA2
NDExKTsgdXNlIEVSUk9SIHNvIGl0IG9ubHkgcHJpbnRzIG9uIGRlYnVnIHZlcnNpb25zIGZvciBu
b3cuIChXZSBzaG91bGQgZGVidWcgdGhpcyBhbHNvLCBldmVudHVhbGx5KS4KKyAgICAgICAgICAg
IExPR19FUlJPUigiQXR0ZW1wdGluZyB0byBzZXQgbm9uLXNjcmVlbiBmb250ICglQCkgd2hlbiBk
cmF3aW5nIHRvIHNjcmVlbi4gIFVzaW5nIHNjcmVlbiBmb250IGFueXdheSwgbWF5IHJlc3VsdCBp
biBpbmNvcnJlY3QgbWV0cmljcy4iLAorICAgICAgICAgICAgICAgIFtbW3BsYXRmb3JtRGF0YS5u
c0ZvbnQoKSBmb250RGVzY3JpcHRvcl0gZm9udEF0dHJpYnV0ZXNdIG9iamVjdEZvcktleTpOU0Zv
bnROYW1lQXR0cmlidXRlXSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkcmF3
Rm9udCA9IFtwbGF0Zm9ybURhdGEubnNGb250KCkgcHJpbnRlckZvbnRdOworICAgICAgICBpZiAo
ZHJhd0ZvbnQgIT0gcGxhdGZvcm1EYXRhLm5zRm9udCgpKSB7CisgICAgICAgICAgICBOU0xvZyhA
IkF0dGVtcHRpbmcgdG8gc2V0IG5vbi1wcmludGVyIGZvbnQgKCVAKSB3aGVuIHByaW50aW5nLiAg
VXNpbmcgcHJpbnRlciBmb250IGFueXdheSwgbWF5IHJlc3VsdCBpbiBpbmNvcnJlY3QgbWV0cmlj
cy4iLAorICAgICAgICAgICAgICAgIFtbW3BsYXRmb3JtRGF0YS5uc0ZvbnQoKSBmb250RGVzY3Jp
cHRvcl0gZm9udEF0dHJpYnV0ZXNdIG9iamVjdEZvcktleTpOU0ZvbnROYW1lQXR0cmlidXRlXSk7
CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyAgICAKKyAgICBDR0NvbnRleHRTZXRGb250KGNn
Q29udGV4dCwgcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKKworICAgIGJvb2wgdXNlTGV0dGVycHJl
c3NFZmZlY3QgPSBzaG91bGRVc2VMZXR0ZXJwcmVzc0VmZmVjdCgqY29udGV4dCk7CisgICAgRmxv
YXRQb2ludCBwb2ludCA9IGFuY2hvclBvaW50OworI2lmIFBMQVRGT1JNKElPUykKKyAgICBmbG9h
dCBmb250U2l6ZSA9IHBsYXRmb3JtRGF0YS5zaXplKCk7CisgICAgQ0dBZmZpbmVUcmFuc2Zvcm0g
bWF0cml4ID0gdXNlTGV0dGVycHJlc3NFZmZlY3QgfHwgcGxhdGZvcm1EYXRhLmlzQ29sb3JCaXRt
YXBGb250KCkgPyBDR0FmZmluZVRyYW5zZm9ybUlkZW50aXR5IDogQ0dBZmZpbmVUcmFuc2Zvcm1N
YWtlU2NhbGUoZm9udFNpemUsIGZvbnRTaXplKTsKKyAgICBpZiAocGxhdGZvcm1EYXRhLm1faXNF
bW9qaSkgeworICAgICAgICBpZiAoIWNvbnRleHQtPmVtb2ppRHJhd2luZ0VuYWJsZWQoKSkKKyAg
ICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBNaW1pYyB0aGUgcG9zaXRpb2luaW5nIG9m
IG5vbi1iaXRtYXAgZ2x5cGhzLCB3aGljaCBhcmUgbm90IHN1YnBpeGVsLXBvc2l0aW9uZWQuCisg
ICAgICAgIHBvaW50LnNldFkoY2VpbGYocG9pbnQueSgpKSk7CisKKyAgICAgICAgLy8gRW1vamkg
Z2x5cGhzIHNuYXAgdG8gdGhlIENTUyBwaXhlbCBncmlkLgorICAgICAgICBwb2ludC5zZXRYKGZs
b29yZihwb2ludC54KCkpKTsKKworICAgICAgICAvLyBFbW9qaSBnbHlwaHMgYXJlIG9mZnNldCBv
bmUgQ1NTIHBpeGVsIHRvIHRoZSByaWdodC4KKyAgICAgICAgcG9pbnQubW92ZSgxLCAwKTsKKwor
ICAgICAgICAvLyBFbW9qaSBnbHlwaHMgYXJlIG9mZnNldCB2ZXJ0aWNhbGx5IGJhc2VkIG9uIGZv
bnQgc2l6ZS4KKyAgICAgICAgZmxvYXQgeSA9IHBvaW50LnkoKTsKKyAgICAgICAgaWYgKGZvbnRT
aXplIDw9IDE1KSB7CisgICAgICAgICAgICAvLyBVbmRvIENvcmUgVGV4dCdzIHkgYWRqdXN0bWVu
dC4KKyAgICAgICAgICAgIHN0YXRpYyBmbG9hdCB5QWRqdXN0bWVudEZhY3RvciA9IGlvc0V4ZWN1
dGFibGVXYXNMaW5rZWRPbk9yQWZ0ZXJWZXJzaW9uKHdrSU9TU3lzdGVtVmVyc2lvbl82XzApID8g
LjE5IDogLjE7CisgICAgICAgICAgICBwb2ludC5zZXRZKGZsb29yZih5IC0geUFkanVzdG1lbnRG
YWN0b3IgKiAoZm9udFNpemUgKyAyKSArIDIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg
ICAgIGlmIChmb250U2l6ZSA8IDI2KQorICAgICAgICAgICAgICAgIHkgLT0gLjM1ZiAqIGZvbnRT
aXplIC0gMTA7CisKKyAgICAgICAgICAgIC8vIFVuZG8gQ29yZSBUZXh0J3MgeSBhZGp1c3RtZW50
LgorICAgICAgICAgICAgc3RhdGljIGZsb2F0IHlBZGp1c3RtZW50ID0gaW9zRXhlY3V0YWJsZVdh
c0xpbmtlZE9uT3JBZnRlclZlcnNpb24od2tJT1NTeXN0ZW1WZXJzaW9uXzZfMCkgPyAzLjggOiAy
OworICAgICAgICAgICAgcG9pbnQuc2V0WShmbG9vcmYoeSAtIHlBZGp1c3RtZW50KSk7CisgICAg
ICAgIH0KKyAgICB9CisjZWxzZQorICAgIENHQWZmaW5lVHJhbnNmb3JtIG1hdHJpeCA9IENHQWZm
aW5lVHJhbnNmb3JtSWRlbnRpdHk7CisgICAgaWYgKGRyYXdGb250ICYmICFwbGF0Zm9ybURhdGEu
aXNDb2xvckJpdG1hcEZvbnQoKSkKKyAgICAgICAgbWVtY3B5KCZtYXRyaXgsIFtkcmF3Rm9udCBt
YXRyaXhdLCBzaXplb2YobWF0cml4KSk7CisjZW5kaWYKKyAgICBtYXRyaXguYiA9IC1tYXRyaXgu
YjsKKyAgICBtYXRyaXguZCA9IC1tYXRyaXguZDsKKyAgICBpZiAocGxhdGZvcm1EYXRhLm1fc3lu
dGhldGljT2JsaXF1ZSkgeworICAgICAgICBzdGF0aWMgZmxvYXQgb2JsaXF1ZVNrZXcgPSB0YW5m
KFNZTlRIRVRJQ19PQkxJUVVFX0FOR0xFICogcGlGbG9hdCAvIDE4MCk7CisgICAgICAgIGlmIChw
bGF0Zm9ybURhdGEub3JpZW50YXRpb24oKSA9PSBWZXJ0aWNhbCkKKyAgICAgICAgICAgIG1hdHJp
eCA9IENHQWZmaW5lVHJhbnNmb3JtQ29uY2F0KG1hdHJpeCwgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtl
KDEsIG9ibGlxdWVTa2V3LCAwLCAxLCAwLCAwKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IG1hdHJpeCA9IENHQWZmaW5lVHJhbnNmb3JtQ29uY2F0KG1hdHJpeCwgQ0dBZmZpbmVUcmFuc2Zv
cm1NYWtlKDEsIDAsIC1vYmxpcXVlU2tldywgMSwgMCwgMCkpOworICAgIH0KKyAgICBDR0NvbnRl
eHRTZXRUZXh0TWF0cml4KGNnQ29udGV4dCwgbWF0cml4KTsKKworI2lmIFBMQVRGT1JNKElPUykK
KyAgICBDR0NvbnRleHRTZXRGb250U2l6ZShjZ0NvbnRleHQsIDEpOworICAgIENHQ29udGV4dFNl
dFNob3VsZFN1YnBpeGVsUXVhbnRpemVGb250cyhjZ0NvbnRleHQsIGNvbnRleHQtPnNob3VsZFN1
YnBpeGVsUXVhbnRpemVGb250cygpKTsKKyNlbHNlCisgICAgc2V0Q0dGb250UmVuZGVyaW5nTW9k
ZShjZ0NvbnRleHQsIFtkcmF3Rm9udCByZW5kZXJpbmdNb2RlXSwgY29udGV4dC0+c2hvdWxkU3Vi
cGl4ZWxRdWFudGl6ZUZvbnRzKCkpOworICAgIGlmIChkcmF3Rm9udCkKKyAgICAgICAgQ0dDb250
ZXh0U2V0Rm9udFNpemUoY2dDb250ZXh0LCAxKTsKKyAgICBlbHNlCisgICAgICAgIENHQ29udGV4
dFNldEZvbnRTaXplKGNnQ29udGV4dCwgcGxhdGZvcm1EYXRhLm1fc2l6ZSk7CisjZW5kaWYKKwor
CisgICAgRmxvYXRTaXplIHNoYWRvd09mZnNldDsKKyAgICBmbG9hdCBzaGFkb3dCbHVyOworICAg
IENvbG9yIHNoYWRvd0NvbG9yOworICAgIENvbG9yU3BhY2Ugc2hhZG93Q29sb3JTcGFjZTsKKyAg
ICBDb2xvclNwYWNlIGZpbGxDb2xvclNwYWNlID0gY29udGV4dC0+ZmlsbENvbG9yU3BhY2UoKTsK
KyAgICBjb250ZXh0LT5nZXRTaGFkb3coc2hhZG93T2Zmc2V0LCBzaGFkb3dCbHVyLCBzaGFkb3dD
b2xvciwgc2hhZG93Q29sb3JTcGFjZSk7CisKKyAgICBBZmZpbmVUcmFuc2Zvcm0gY29udGV4dENU
TSA9IGNvbnRleHQtPmdldENUTSgpOworICAgIGZsb2F0IHN5bnRoZXRpY0JvbGRPZmZzZXQgPSBm
b250LT5zeW50aGV0aWNCb2xkT2Zmc2V0KCk7CisgICAgaWYgKHN5bnRoZXRpY0JvbGRPZmZzZXQg
JiYgIWNvbnRleHRDVE0uaXNJZGVudGl0eU9yVHJhbnNsYXRpb25PckZsaXBwZWQoKSkgeworICAg
ICAgICBGbG9hdFNpemUgaG9yaXpvbnRhbFVuaXRTaXplSW5EZXZpY2VQaXhlbHMgPSBjb250ZXh0
Q1RNLm1hcFNpemUoRmxvYXRTaXplKDEsIDApKTsKKyAgICAgICAgZmxvYXQgaG9yaXpvbnRhbFVu
aXRMZW5ndGhJbkRldmljZVBpeGVscyA9IHNxcnRmKGhvcml6b250YWxVbml0U2l6ZUluRGV2aWNl
UGl4ZWxzLndpZHRoKCkgKiBob3Jpem9udGFsVW5pdFNpemVJbkRldmljZVBpeGVscy53aWR0aCgp
ICsgaG9yaXpvbnRhbFVuaXRTaXplSW5EZXZpY2VQaXhlbHMuaGVpZ2h0KCkgKiBob3Jpem9udGFs
VW5pdFNpemVJbkRldmljZVBpeGVscy5oZWlnaHQoKSk7CisgICAgICAgIGlmIChob3Jpem9udGFs
VW5pdExlbmd0aEluRGV2aWNlUGl4ZWxzKQorICAgICAgICAgICAgc3ludGhldGljQm9sZE9mZnNl
dCAvPSBob3Jpem9udGFsVW5pdExlbmd0aEluRGV2aWNlUGl4ZWxzOworICAgIH07CisKKyAgICBi
b29sIGhhc1NpbXBsZVNoYWRvdyA9IGNvbnRleHQtPnRleHREcmF3aW5nTW9kZSgpID09IFRleHRN
b2RlRmlsbCAmJiBzaGFkb3dDb2xvci5pc1ZhbGlkKCkgJiYgIXNoYWRvd0JsdXIgJiYgIXBsYXRm
b3JtRGF0YS5pc0NvbG9yQml0bWFwRm9udCgpICYmICghY29udGV4dC0+c2hhZG93c0lnbm9yZVRy
YW5zZm9ybXMoKSB8fCBjb250ZXh0Q1RNLmlzSWRlbnRpdHlPclRyYW5zbGF0aW9uT3JGbGlwcGVk
KCkpICYmICFjb250ZXh0LT5pc0luVHJhbnNwYXJlbmN5TGF5ZXIoKTsKKyAgICBpZiAoaGFzU2lt
cGxlU2hhZG93KSB7CisgICAgICAgIC8vIFBhaW50IHNpbXBsZSBzaGFkb3dzIG91cnNlbHZlcyBp
bnN0ZWFkIG9mIHJlbHlpbmcgb24gQ0cgc2hhZG93cywgdG8gYXZvaWQgbG9zaW5nIHN1YnBpeGVs
IGFudGlhbGlhc2luZy4KKyAgICAgICAgY29udGV4dC0+Y2xlYXJTaGFkb3coKTsKKyAgICAgICAg
Q29sb3IgZmlsbENvbG9yID0gY29udGV4dC0+ZmlsbENvbG9yKCk7CisgICAgICAgIENvbG9yIHNo
YWRvd0ZpbGxDb2xvcihzaGFkb3dDb2xvci5yZWQoKSwgc2hhZG93Q29sb3IuZ3JlZW4oKSwgc2hh
ZG93Q29sb3IuYmx1ZSgpLCBzaGFkb3dDb2xvci5hbHBoYSgpICogZmlsbENvbG9yLmFscGhhKCkg
LyAyNTUpOworICAgICAgICBjb250ZXh0LT5zZXRGaWxsQ29sb3Ioc2hhZG93RmlsbENvbG9yLCBz
aGFkb3dDb2xvclNwYWNlKTsKKyAgICAgICAgZmxvYXQgc2hhZG93VGV4dFggPSBwb2ludC54KCkg
KyBzaGFkb3dPZmZzZXQud2lkdGgoKTsKKyAgICAgICAgLy8gSWYgc2hhZG93cyBhcmUgaWdub3Jp
bmcgdHJhbnNmb3JtcywgdGhlbiB3ZSBoYXZlbid0IGFwcGxpZWQgdGhlIFkgY29vcmRpbmF0ZSBm
bGlwIHlldCwgc28gZG93biBpcyBuZWdhdGl2ZS4KKyAgICAgICAgZmxvYXQgc2hhZG93VGV4dFkg
PSBwb2ludC55KCkgKyBzaGFkb3dPZmZzZXQuaGVpZ2h0KCkgKiAoY29udGV4dC0+c2hhZG93c0ln
bm9yZVRyYW5zZm9ybXMoKSA/IC0xIDogMSk7CisgICAgICAgIHNob3dHbHlwaHNXaXRoQWR2YW5j
ZXMoRmxvYXRQb2ludChzaGFkb3dUZXh0WCwgc2hhZG93VGV4dFkpLCBmb250LCBjZ0NvbnRleHQs
IGdseXBoQnVmZmVyLmdseXBocyhmcm9tKSwgc3RhdGljX2Nhc3Q8Y29uc3QgQ0dTaXplKj4oZ2x5
cGhCdWZmZXIuYWR2YW5jZXMoZnJvbSkpLCBudW1HbHlwaHMpOworI2lmICFQTEFURk9STShJT1Mp
CisgICAgICAgIGlmIChzeW50aGV0aWNCb2xkT2Zmc2V0KQorI2Vsc2UKKyAgICAgICAgaWYgKHN5
bnRoZXRpY0JvbGRPZmZzZXQgJiYgIXBsYXRmb3JtRGF0YS5tX2lzRW1vamkpCisjZW5kaWYKKyAg
ICAgICAgICAgIHNob3dHbHlwaHNXaXRoQWR2YW5jZXMoRmxvYXRQb2ludChzaGFkb3dUZXh0WCAr
IHN5bnRoZXRpY0JvbGRPZmZzZXQsIHNoYWRvd1RleHRZKSwgZm9udCwgY2dDb250ZXh0LCBnbHlw
aEJ1ZmZlci5nbHlwaHMoZnJvbSksIHN0YXRpY19jYXN0PGNvbnN0IENHU2l6ZSo+KGdseXBoQnVm
ZmVyLmFkdmFuY2VzKGZyb20pKSwgbnVtR2x5cGhzKTsKKyAgICAgICAgY29udGV4dC0+c2V0Rmls
bENvbG9yKGZpbGxDb2xvciwgZmlsbENvbG9yU3BhY2UpOworICAgIH0KKworICAgIGlmICh1c2VM
ZXR0ZXJwcmVzc0VmZmVjdCkKKyAgICAgICAgc2hvd0xldHRlcnByZXNzZWRHbHlwaHNXaXRoQWR2
YW5jZXMocG9pbnQsIGZvbnQsIGNnQ29udGV4dCwgZ2x5cGhCdWZmZXIuZ2x5cGhzKGZyb20pLCBz
dGF0aWNfY2FzdDxjb25zdCBDR1NpemUqPihnbHlwaEJ1ZmZlci5hZHZhbmNlcyhmcm9tKSksIG51
bUdseXBocyk7CisgICAgZWxzZQorICAgICAgICBzaG93R2x5cGhzV2l0aEFkdmFuY2VzKHBvaW50
LCBmb250LCBjZ0NvbnRleHQsIGdseXBoQnVmZmVyLmdseXBocyhmcm9tKSwgc3RhdGljX2Nhc3Q8
Y29uc3QgQ0dTaXplKj4oZ2x5cGhCdWZmZXIuYWR2YW5jZXMoZnJvbSkpLCBudW1HbHlwaHMpOwor
I2lmICFQTEFURk9STShJT1MpCisgICAgaWYgKHN5bnRoZXRpY0JvbGRPZmZzZXQpCisjZWxzZQor
ICAgIGlmIChzeW50aGV0aWNCb2xkT2Zmc2V0ICYmICFwbGF0Zm9ybURhdGEubV9pc0Vtb2ppKQor
I2VuZGlmCisgICAgICAgIHNob3dHbHlwaHNXaXRoQWR2YW5jZXMoRmxvYXRQb2ludChwb2ludC54
KCkgKyBzeW50aGV0aWNCb2xkT2Zmc2V0LCBwb2ludC55KCkpLCBmb250LCBjZ0NvbnRleHQsIGds
eXBoQnVmZmVyLmdseXBocyhmcm9tKSwgc3RhdGljX2Nhc3Q8Y29uc3QgQ0dTaXplKj4oZ2x5cGhC
dWZmZXIuYWR2YW5jZXMoZnJvbSkpLCBudW1HbHlwaHMpOworCisgICAgaWYgKGhhc1NpbXBsZVNo
YWRvdykKKyAgICAgICAgY29udGV4dC0+c2V0U2hhZG93KHNoYWRvd09mZnNldCwgc2hhZG93Qmx1
ciwgc2hhZG93Q29sb3IsIHNoYWRvd0NvbG9yU3BhY2UpOworCisjaWYgIVBMQVRGT1JNKElPUykK
KyAgICBpZiAoY2hhbmdlRm9udFNtb290aGluZykKKyAgICAgICAgQ0dDb250ZXh0U2V0U2hvdWxk
U21vb3RoRm9udHMoY2dDb250ZXh0LCBvcmlnaW5hbFNob3VsZFVzZUZvbnRTbW9vdGhpbmcpOwor
I2VuZGlmCit9CisKKyNpZiBFTkFCTEUoQ1NTM19URVhUX0RFQ09SQVRJT05fU0tJUF9JTkspCitz
dHJ1Y3QgR2x5cGhJdGVyYXRpb25TdGF0ZSB7CisgICAgR2x5cGhJdGVyYXRpb25TdGF0ZShDR1Bv
aW50IHN0YXJ0aW5nUG9pbnQsIENHUG9pbnQgY3VycmVudFBvaW50LCBDR0Zsb2F0IHkxLCBDR0Zs
b2F0IHkyLCBDR0Zsb2F0IG1pblgsIENHRmxvYXQgbWF4WCkKKyAgICAgICAgOiBzdGFydGluZ1Bv
aW50KHN0YXJ0aW5nUG9pbnQpCisgICAgICAgICwgY3VycmVudFBvaW50KGN1cnJlbnRQb2ludCkK
KyAgICAgICAgLCB5MSh5MSkKKyAgICAgICAgLCB5Mih5MikKKyAgICAgICAgLCBtaW5YKG1pblgp
CisgICAgICAgICwgbWF4WChtYXhYKQorICAgIHsKKyAgICB9CisgICAgQ0dQb2ludCBzdGFydGlu
Z1BvaW50OworICAgIENHUG9pbnQgY3VycmVudFBvaW50OworICAgIENHRmxvYXQgeTE7CisgICAg
Q0dGbG9hdCB5MjsKKyAgICBDR0Zsb2F0IG1pblg7CisgICAgQ0dGbG9hdCBtYXhYOworfTsKKwor
c3RhdGljIGJvb2wgZmluZEludGVyc2VjdGlvblBvaW50KGZsb2F0IHksIENHUG9pbnQgcDEsIENH
UG9pbnQgcDIsIENHRmxvYXQmIHgpCit7CisgICAgeCA9IHAxLnggKyAoeSAtIHAxLnkpICogKHAy
LnggLSBwMS54KSAvIChwMi55IC0gcDEueSk7CisgICAgcmV0dXJuIChwMS55IDwgeSAmJiBwMi55
ID4geSkgfHwgKHAxLnkgPiB5ICYmIHAyLnkgPCB5KTsKK30KKworc3RhdGljIHZvaWQgdXBkYXRl
WChHbHlwaEl0ZXJhdGlvblN0YXRlJiBzdGF0ZSwgQ0dGbG9hdCB4KQoreworICAgIHN0YXRlLm1p
blggPSBzdGQ6Om1pbihzdGF0ZS5taW5YLCB4KTsKKyAgICBzdGF0ZS5tYXhYID0gc3RkOjptYXgo
c3RhdGUubWF4WCwgeCk7Cit9CisKKy8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IENHUGF0
aEFwcGx5IGFuZCBpcyB0aGVyZWZvcmUgaW52b2tlZCBmb3IgZWFjaAorLy8gY29udG91ciBpbiBh
IGdseXBoLiBUaGlzIGZ1bmN0aW9uIG1vZGVscyBlYWNoIGNvbnRvdXJzIGFzIGEgc3RyYWlnaHQg
bGluZQorLy8gYW5kIGNhbGN1bGF0ZXMgdGhlIGludGVyc2VjdGlvbnMgYmV0d2VlbiBlYWNoIHBz
ZXVkby1jb250b3VyIGFuZAorLy8gdHdvIGhvcml6b250YWwgbGluZXMgKHRoZSB1cHBlciBhbmQg
bG93ZXIgYm91bmRzIG9mIGFuIHVuZGVybGluZSkgZm91bmQgaW4KKy8vIEdseXBoSXRlcmF0aW9u
U3RhdGU6OnkxIGFuZCBHbHlwaEl0ZXJhdGlvblN0YXRlOjp5Mi4gSXQga2VlcHMgdHJhY2sgb2Yg
dGhlCisvLyBsZWZ0bW9zdCBhbmQgcmlnaHRtb3N0IGludGVyc2VjdGlvbiBpbiBHbHlwaEl0ZXJh
dGlvblN0YXRlOjptaW5YIGFuZAorLy8gR2x5cGhJdGVyYXRpb25TdGF0ZTo6bWF4WC4KK3N0YXRp
YyB2b2lkIGZpbmRQYXRoSW50ZXJzZWN0aW9ucyh2b2lkKiBzdGF0ZUFzVm9pZFBvaW50ZXIsIGNv
bnN0IENHUGF0aEVsZW1lbnQqIGUpCit7CisgICAgYXV0byYgc3RhdGUgPSAqc3RhdGljX2Nhc3Q8
R2x5cGhJdGVyYXRpb25TdGF0ZSo+KHN0YXRlQXNWb2lkUG9pbnRlcik7CisgICAgYm9vbCBkb0lu
dGVyc2VjdGlvbiA9IGZhbHNlOworICAgIENHUG9pbnQgcG9pbnQgPSBDR1BvaW50WmVybzsKKyAg
ICBzd2l0Y2ggKGUtPnR5cGUpIHsKKyAgICBjYXNlIGtDR1BhdGhFbGVtZW50TW92ZVRvUG9pbnQ6
CisgICAgICAgIHN0YXRlLnN0YXJ0aW5nUG9pbnQgPSBlLT5wb2ludHNbMF07CisgICAgICAgIHN0
YXRlLmN1cnJlbnRQb2ludCA9IGUtPnBvaW50c1swXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBrQ0dQYXRoRWxlbWVudEFkZExpbmVUb1BvaW50OgorICAgICAgICBkb0ludGVyc2VjdGlvbiA9
IHRydWU7CisgICAgICAgIHBvaW50ID0gZS0+cG9pbnRzWzBdOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIGtDR1BhdGhFbGVtZW50QWRkUXVhZEN1cnZlVG9Qb2ludDoKKyAgICAgICAgZG9JbnRl
cnNlY3Rpb24gPSB0cnVlOworICAgICAgICBwb2ludCA9IGUtPnBvaW50c1sxXTsKKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBrQ0dQYXRoRWxlbWVudEFkZEN1cnZlVG9Qb2ludDoKKyAgICAgICAg
ZG9JbnRlcnNlY3Rpb24gPSB0cnVlOworICAgICAgICBwb2ludCA9IGUtPnBvaW50c1syXTsKKyAg
ICAgICAgYnJlYWs7CisgICAgY2FzZSBrQ0dQYXRoRWxlbWVudENsb3NlU3VicGF0aDoKKyAgICAg
ICAgZG9JbnRlcnNlY3Rpb24gPSB0cnVlOworICAgICAgICBwb2ludCA9IHN0YXRlLnN0YXJ0aW5n
UG9pbnQ7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoIWRvSW50ZXJzZWN0aW9uKQor
ICAgICAgICByZXR1cm47CisgICAgQ0dGbG9hdCB4OworICAgIGlmIChmaW5kSW50ZXJzZWN0aW9u
UG9pbnQoc3RhdGUueTEsIHN0YXRlLmN1cnJlbnRQb2ludCwgcG9pbnQsIHgpKQorICAgICAgICB1
cGRhdGVYKHN0YXRlLCB4KTsKKyAgICBpZiAoZmluZEludGVyc2VjdGlvblBvaW50KHN0YXRlLnky
LCBzdGF0ZS5jdXJyZW50UG9pbnQsIHBvaW50LCB4KSkKKyAgICAgICAgdXBkYXRlWChzdGF0ZSwg
eCk7CisgICAgaWYgKChzdGF0ZS5jdXJyZW50UG9pbnQueSA+PSBzdGF0ZS55MSAmJiBzdGF0ZS5j
dXJyZW50UG9pbnQueSA8PSBzdGF0ZS55MikKKyAgICAgICAgfHwgKHN0YXRlLmN1cnJlbnRQb2lu
dC55IDw9IHN0YXRlLnkxICYmIHN0YXRlLmN1cnJlbnRQb2ludC55ID49IHN0YXRlLnkyKSkKKyAg
ICAgICAgdXBkYXRlWChzdGF0ZSwgc3RhdGUuY3VycmVudFBvaW50LngpOworICAgIHN0YXRlLmN1
cnJlbnRQb2ludCA9IHBvaW50OworfQorCitjbGFzcyBNYWNHbHlwaFRvUGF0aFRyYW5zbGF0b3Ig
ZmluYWwgOiBwdWJsaWMgR2x5cGhUb1BhdGhUcmFuc2xhdG9yIHsKK3B1YmxpYzoKKyAgICBNYWNH
bHlwaFRvUGF0aFRyYW5zbGF0b3IoY29uc3QgVGV4dFJ1biYgdGV4dFJ1biwgY29uc3QgR2x5cGhC
dWZmZXImIGdseXBoQnVmZmVyLCBjb25zdCBGbG9hdFBvaW50JiB0ZXh0T3JpZ2luKQorICAgICAg
ICA6IG1faW5kZXgoMCkKKyAgICAgICAgLCBtX3RleHRSdW4odGV4dFJ1bikKKyAgICAgICAgLCBt
X2dseXBoQnVmZmVyKGdseXBoQnVmZmVyKQorICAgICAgICAsIG1fZm9udERhdGEoZ2x5cGhCdWZm
ZXIuZm9udERhdGFBdChtX2luZGV4KSkKKyAgICAgICAgLCBtX3RyYW5zbGF0aW9uKENHQWZmaW5l
VHJhbnNmb3JtU2NhbGUoQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlVHJhbnNsYXRpb24odGV4dE9yaWdp
bi54KCksIHRleHRPcmlnaW4ueSgpKSwgMSwgLTEpKQorICAgIHsKKyAgICAgICAgbW92ZVRvTmV4
dFZhbGlkR2x5cGgoKTsKKyAgICB9Citwcml2YXRlOgorICAgIHZpcnR1YWwgYm9vbCBjb250YWlu
c01vcmVQYXRocygpIG92ZXJyaWRlCisgICAgeworICAgICAgICByZXR1cm4gbV9pbmRleCAhPSBt
X2dseXBoQnVmZmVyLnNpemUoKTsKKyAgICB9CisgICAgdmlydHVhbCBQYXRoIHBhdGgoKSBvdmVy
cmlkZTsKKyAgICB2aXJ0dWFsIHN0ZDo6cGFpcjxmbG9hdCwgZmxvYXQ+IGV4dGVudHMoKSBvdmVy
cmlkZTsKKyAgICB2aXJ0dWFsIEdseXBoVW5kZXJsaW5lVHlwZSB1bmRlcmxpbmVUeXBlKCkgb3Zl
cnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGFkdmFuY2UoKSBvdmVycmlkZTsKKyAgICB2b2lkIG1v
dmVUb05leHRWYWxpZEdseXBoKCk7CisKKyAgICBpbnQgbV9pbmRleDsKKyAgICBjb25zdCBUZXh0
UnVuJiBtX3RleHRSdW47CisgICAgY29uc3QgR2x5cGhCdWZmZXImIG1fZ2x5cGhCdWZmZXI7Cisg
ICAgY29uc3QgU2ltcGxlRm9udERhdGEqIG1fZm9udERhdGE7CisgICAgQ0dBZmZpbmVUcmFuc2Zv
cm0gbV90cmFuc2xhdGlvbjsKK307CisKK1BhdGggTWFjR2x5cGhUb1BhdGhUcmFuc2xhdG9yOjpw
YXRoKCkKK3sKKyAgICBSZXRhaW5QdHI8Q0dQYXRoUmVmPiByZXN1bHQgPSBhZG9wdENGKENURm9u
dENyZWF0ZVBhdGhGb3JHbHlwaChtX2ZvbnREYXRhLT5wbGF0Zm9ybURhdGEoKS5jdEZvbnQoKSwg
bV9nbHlwaEJ1ZmZlci5nbHlwaEF0KG1faW5kZXgpLCAmbV90cmFuc2xhdGlvbikpOworICAgIHJl
dHVybiBhZG9wdENGKENHUGF0aENyZWF0ZU11dGFibGVDb3B5KHJlc3VsdC5nZXQoKSkpOworfQor
CitzdGQ6OnBhaXI8ZmxvYXQsIGZsb2F0PiBNYWNHbHlwaFRvUGF0aFRyYW5zbGF0b3I6OmV4dGVu
dHMoKQoreworICAgIENHUG9pbnQgYmVnaW5uaW5nID0gQ0dQb2ludEFwcGx5QWZmaW5lVHJhbnNm
b3JtKENHUG9pbnRNYWtlKDAsIDApLCBtX3RyYW5zbGF0aW9uKTsKKyAgICBDR1NpemUgZW5kID0g
Q0dTaXplQXBwbHlBZmZpbmVUcmFuc2Zvcm0obV9nbHlwaEJ1ZmZlci5hZHZhbmNlQXQobV9pbmRl
eCksIG1fdHJhbnNsYXRpb24pOworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihzdGF0aWNfY2Fz
dDxmbG9hdD4oYmVnaW5uaW5nLngpLCBzdGF0aWNfY2FzdDxmbG9hdD4oYmVnaW5uaW5nLnggKyBl
bmQud2lkdGgpKTsKK30KKworYXV0byBNYWNHbHlwaFRvUGF0aFRyYW5zbGF0b3I6OnVuZGVybGlu
ZVR5cGUoKSAtPiBHbHlwaFVuZGVybGluZVR5cGUKK3sKKyAgICByZXR1cm4gY29tcHV0ZVVuZGVy
bGluZVR5cGUobV90ZXh0UnVuLCBtX2dseXBoQnVmZmVyLCBtX2luZGV4KTsKK30KKwordm9pZCBN
YWNHbHlwaFRvUGF0aFRyYW5zbGF0b3I6Om1vdmVUb05leHRWYWxpZEdseXBoKCkKK3sKKyAgICBp
ZiAoIW1fZm9udERhdGEtPmlzU1ZHRm9udCgpKQorICAgICAgICByZXR1cm47CisgICAgYWR2YW5j
ZSgpOworfQorCit2b2lkIE1hY0dseXBoVG9QYXRoVHJhbnNsYXRvcjo6YWR2YW5jZSgpCit7Cisg
ICAgZG8geworICAgICAgICBHbHlwaEJ1ZmZlckFkdmFuY2UgYWR2YW5jZSA9IG1fZ2x5cGhCdWZm
ZXIuYWR2YW5jZUF0KG1faW5kZXgpOworICAgICAgICBtX3RyYW5zbGF0aW9uID0gQ0dBZmZpbmVU
cmFuc2Zvcm1UcmFuc2xhdGUobV90cmFuc2xhdGlvbiwgYWR2YW5jZS53aWR0aCgpLCBhZHZhbmNl
LmhlaWdodCgpKTsKKyAgICAgICAgKyttX2luZGV4OworICAgICAgICBpZiAobV9pbmRleCA+PSBt
X2dseXBoQnVmZmVyLnNpemUoKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBtX2ZvbnRE
YXRhID0gbV9nbHlwaEJ1ZmZlci5mb250RGF0YUF0KG1faW5kZXgpOworICAgIH0gd2hpbGUgKG1f
Zm9udERhdGEtPmlzU1ZHRm9udCgpICYmIG1faW5kZXggPCBtX2dseXBoQnVmZmVyLnNpemUoKSk7
Cit9CisKK0Rhc2hBcnJheSBGb250Q2FzY2FkZTo6ZGFzaGVzRm9ySW50ZXJzZWN0aW9uc1dpdGhS
ZWN0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgdGV4dE9yaWdpbiwgY29u
c3QgRmxvYXRSZWN0JiBsaW5lRXh0ZW50cykgY29uc3QKK3sKKyAgICBpZiAoaXNMb2FkaW5nQ3Vz
dG9tRm9udHMoKSkKKyAgICAgICAgcmV0dXJuIERhc2hBcnJheSgpOworCisgICAgR2x5cGhCdWZm
ZXIgZ2x5cGhCdWZmZXI7CisgICAgZ2x5cGhCdWZmZXIuc2F2ZU9mZnNldHNJblN0cmluZygpOwor
ICAgIGZsb2F0IGRlbHRhWDsKKyAgICBpZiAoY29kZVBhdGgocnVuKSAhPSBGb250Q2FzY2FkZTo6
Q29tcGxleCkKKyAgICAgICAgZGVsdGFYID0gZ2V0R2x5cGhzQW5kQWR2YW5jZXNGb3JTaW1wbGVU
ZXh0KHJ1biwgMCwgcnVuLmxlbmd0aCgpLCBnbHlwaEJ1ZmZlcik7CisgICAgZWxzZQorICAgICAg
ICBkZWx0YVggPSBnZXRHbHlwaHNBbmRBZHZhbmNlc0ZvckNvbXBsZXhUZXh0KHJ1biwgMCwgcnVu
Lmxlbmd0aCgpLCBnbHlwaEJ1ZmZlcik7CisKKyAgICBpZiAoIWdseXBoQnVmZmVyLnNpemUoKSkK
KyAgICAgICAgcmV0dXJuIERhc2hBcnJheSgpOworICAgIAorICAgIC8vIEZJWE1FOiBIYW5kbGUg
U1ZHICsgbm9uLVNWRyBpbnRlcmxlYXZlZCBydW5zLiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MTMzNzc4CisgICAgY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnREYXRh
ID0gZ2x5cGhCdWZmZXIuZm9udERhdGFBdCgwKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8R2x5cGhU
b1BhdGhUcmFuc2xhdG9yPiB0cmFuc2xhdG9yOworICAgIGJvb2wgaXNTVkcgPSBmYWxzZTsKKyAg
ICBGbG9hdFBvaW50IG9yaWdpbiA9IEZsb2F0UG9pbnQodGV4dE9yaWdpbi54KCkgKyBkZWx0YVgs
IHRleHRPcmlnaW4ueSgpKTsKKyAgICBpZiAoIWZvbnREYXRhLT5pc1NWR0ZvbnQoKSkKKyAgICAg
ICAgdHJhbnNsYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8TWFjR2x5cGhUb1BhdGhUcmFuc2xhdG9y
PihydW4sIGdseXBoQnVmZmVyLCBvcmlnaW4pOworICAgIGVsc2UgeworICAgICAgICBUZXh0UnVu
OjpSZW5kZXJpbmdDb250ZXh0KiByZW5kZXJpbmdDb250ZXh0ID0gcnVuLnJlbmRlcmluZ0NvbnRl
eHQoKTsKKyAgICAgICAgaWYgKCFyZW5kZXJpbmdDb250ZXh0KQorICAgICAgICAgICAgcmV0dXJu
IERhc2hBcnJheSgpOworICAgICAgICB0cmFuc2xhdG9yID0gcmVuZGVyaW5nQ29udGV4dC0+Y3Jl
YXRlR2x5cGhUb1BhdGhUcmFuc2xhdG9yKCpmb250RGF0YSwgJnJ1biwgZ2x5cGhCdWZmZXIsIDAs
IGdseXBoQnVmZmVyLnNpemUoKSwgb3JpZ2luKTsKKyAgICAgICAgaXNTVkcgPSB0cnVlOworICAg
IH0KKyAgICBEYXNoQXJyYXkgcmVzdWx0OworICAgIGZvciAoaW50IGluZGV4ID0gMDsgdHJhbnNs
YXRvci0+Y29udGFpbnNNb3JlUGF0aHMoKTsgKytpbmRleCwgdHJhbnNsYXRvci0+YWR2YW5jZSgp
KSB7CisgICAgICAgIEdseXBoSXRlcmF0aW9uU3RhdGUgaW5mbyA9IEdseXBoSXRlcmF0aW9uU3Rh
dGUoQ0dQb2ludE1ha2UoMCwgMCksIENHUG9pbnRNYWtlKDAsIDApLCBsaW5lRXh0ZW50cy55KCks
IGxpbmVFeHRlbnRzLnkoKSArIGxpbmVFeHRlbnRzLmhlaWdodCgpLCBsaW5lRXh0ZW50cy54KCkg
KyBsaW5lRXh0ZW50cy53aWR0aCgpLCBsaW5lRXh0ZW50cy54KCkpOworICAgICAgICBjb25zdCBT
aW1wbGVGb250RGF0YSogbG9jYWxGb250RGF0YSA9IGdseXBoQnVmZmVyLmZvbnREYXRhQXQoaW5k
ZXgpOworICAgICAgICBpZiAoIWxvY2FsRm9udERhdGEgfHwgKCFpc1NWRyAmJiBsb2NhbEZvbnRE
YXRhLT5pc1NWR0ZvbnQoKSkgfHwgKGlzU1ZHICYmIGxvY2FsRm9udERhdGEgIT0gZm9udERhdGEp
KSB7CisgICAgICAgICAgICAvLyBUaGUgYWR2YW5jZXMgd2lsbCBnZXQgYWxsIG1lc3NlZCB1cCBp
ZiB3ZSBkbyBhbnl0aGluZyBvdGhlciB0aGFuIGJhaWwgaGVyZS4KKyAgICAgICAgICAgIHJlc3Vs
dC5jbGVhcigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNo
ICh0cmFuc2xhdG9yLT51bmRlcmxpbmVUeXBlKCkpIHsKKyAgICAgICAgY2FzZSBHbHlwaFRvUGF0
aFRyYW5zbGF0b3I6OkdseXBoVW5kZXJsaW5lVHlwZTo6U2tpcERlc2NlbmRlcnM6IHsKKyAgICAg
ICAgICAgIFBhdGggcGF0aCA9IHRyYW5zbGF0b3ItPnBhdGgoKTsKKyAgICAgICAgICAgIENHUGF0
aEFwcGx5KHBhdGgucGxhdGZvcm1QYXRoKCksICZpbmZvLCAmZmluZFBhdGhJbnRlcnNlY3Rpb25z
KTsKKyAgICAgICAgICAgIGlmIChpbmZvLm1pblggPCBpbmZvLm1heFgpIHsKKyAgICAgICAgICAg
ICAgICByZXN1bHQuYXBwZW5kKGluZm8ubWluWCAtIGxpbmVFeHRlbnRzLngoKSk7CisgICAgICAg
ICAgICAgICAgcmVzdWx0LmFwcGVuZChpbmZvLm1heFggLSBsaW5lRXh0ZW50cy54KCkpOworICAg
ICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBH
bHlwaFRvUGF0aFRyYW5zbGF0b3I6OkdseXBoVW5kZXJsaW5lVHlwZTo6U2tpcEdseXBoOiB7Cisg
ICAgICAgICAgICBzdGQ6OnBhaXI8ZmxvYXQsIGZsb2F0PiBleHRlbnRzID0gdHJhbnNsYXRvci0+
ZXh0ZW50cygpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChleHRlbnRzLmZpcnN0IC0gbGlu
ZUV4dGVudHMueCgpKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZXh0ZW50cy5zZWNvbmQg
LSBsaW5lRXh0ZW50cy54KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAg
ICAgY2FzZSBHbHlwaFRvUGF0aFRyYW5zbGF0b3I6OkdseXBoVW5kZXJsaW5lVHlwZTo6RHJhd092
ZXJHbHlwaDoKKyAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8KKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKKworYm9v
bCBGb250Q2FzY2FkZTo6cHJpbWFyeUZvbnREYXRhSXNTeXN0ZW1Gb250KCkgY29uc3QKK3sKKyNp
ZiBQTEFURk9STShJT1MpIHx8IF9fTUFDX09TX1hfVkVSU0lPTl9NSU5fUkVRVUlSRUQgPiAxMDkw
CisgICAgY29uc3QgYXV0byYgZm9udERhdGEgPSBwcmltYXJ5Rm9udERhdGEoKTsKKyAgICByZXR1
cm4gIWZvbnREYXRhLmlzU1ZHRm9udCgpICYmIENURm9udERlc2NyaXB0b3JJc1N5c3RlbVVJRm9u
dChhZG9wdENGKENURm9udENvcHlGb250RGVzY3JpcHRvcihmb250RGF0YS5wbGF0Zm9ybURhdGEo
KS5jdEZvbnQoKSkpLmdldCgpKTsKKyNlbHNlCisgICAgLy8gU3lzdGVtIGZvbnRzIGFyZSBoaWRk
ZW4gYnkgaGF2aW5nIGEgbmFtZSB0aGF0IGJlZ2lucyB3aXRoIGEgcGVyaW9kLCBzbyBzaW1wbHkg
c2VhcmNoCisgICAgLy8gZm9yIHRoYXQgaGVyZSByYXRoZXIgdGhhbiB0cnkgdG8ga2VlcCB0aGUg
bGlzdCB1cCB0byBkYXRlLgorICAgIHJldHVybiBmaXJzdEZhbWlseSgpLnN0YXJ0c1dpdGgoJy4n
KTsKKyNlbmRpZgorfQorCit9CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jb2NvYS9Gb250Q2FzY2FkZUNvY29hLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2NvY29hL0ZvbnRDYXNjYWRlQ29jb2EubW0JKHdvcmtpbmcgY29w
eSkKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NvY29hL0ZvbnRDYXNjYWRl
Q29jb2EubW0JKHdvcmtpbmcgY29weSkKQEAgLTIzLDExICsyMywxMyBAQAogI2ltcG9ydCAiY29u
ZmlnLmgiCiAjaW1wb3J0ICJGb250Q2FzY2FkZS5oIgogCisjaW1wb3J0ICJDb21wbGV4VGV4dENv
bnRyb2xsZXIuaCIKICNpbXBvcnQgIkNvcmVHcmFwaGljc1NQSS5oIgogI2ltcG9ydCAiQ29yZVRl
eHRTUEkuaCIKICNpbXBvcnQgIkRhc2hBcnJheS5oIgogI2ltcG9ydCAiR2x5cGhCdWZmZXIuaCIK
ICNpbXBvcnQgIkdyYXBoaWNzQ29udGV4dC5oIgorI2ltcG9ydCAiTGF5b3V0UmVjdC5oIgogI2lt
cG9ydCAiTG9nZ2luZy5oIgogI2ltcG9ydCAiU2ltcGxlRm9udERhdGEuaCIKICNpbXBvcnQgIldl
YkNvcmVTeXN0ZW1JbnRlcmZhY2UuaCIKQEAgLTIwNiw3ICsyMDgsNyBAQCB2b2lkIEZvbnRDYXNj
YWRlOjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29uCiAgICAgYm9vbCBzaG91bGRTbW9vdGhGb250czsK
ICAgICBib29sIGNoYW5nZUZvbnRTbW9vdGhpbmc7CiAgICAgCi0gICAgc3dpdGNoKGZvbnREZXNj
cmlwdGlvbigpLmZvbnRTbW9vdGhpbmcoKSkgeworICAgIHN3aXRjaCAoZm9udERlc2NyaXB0aW9u
KCkuZm9udFNtb290aGluZygpKSB7CiAgICAgY2FzZSBBbnRpYWxpYXNlZDogewogICAgICAgICBj
b250ZXh0LT5zZXRTaG91bGRBbnRpYWxpYXModHJ1ZSk7CiAgICAgICAgIHNob3VsZFNtb290aEZv
bnRzID0gZmFsc2U7CkBAIC02MDIsNCArNjA0LDE0OCBAQCBib29sIEZvbnRDYXNjYWRlOjpwcmlt
YXJ5Rm9udERhdGFJc1N5c3RlCiAjZW5kaWYKIH0KIAordm9pZCBGb250Q2FzY2FkZTo6YWRqdXN0
U2VsZWN0aW9uUmVjdEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgTGF5b3V0UmVj
dCYgc2VsZWN0aW9uUmVjdCwgaW50IGZyb20sIGludCB0bykgY29uc3QKK3sKKyAgICBDb21wbGV4
VGV4dENvbnRyb2xsZXIgY29udHJvbGxlcih0aGlzLCBydW4pOworICAgIGNvbnRyb2xsZXIuYWR2
YW5jZShmcm9tKTsKKyAgICBmbG9hdCBiZWZvcmVXaWR0aCA9IGNvbnRyb2xsZXIucnVuV2lkdGhT
b0ZhcigpOworICAgIGNvbnRyb2xsZXIuYWR2YW5jZSh0byk7CisgICAgZmxvYXQgYWZ0ZXJXaWR0
aCA9IGNvbnRyb2xsZXIucnVuV2lkdGhTb0ZhcigpOworCisgICAgaWYgKHJ1bi5ydGwoKSkKKyAg
ICAgICAgc2VsZWN0aW9uUmVjdC5tb3ZlKGNvbnRyb2xsZXIudG90YWxXaWR0aCgpIC0gYWZ0ZXJX
aWR0aCwgMCk7CisgICAgZWxzZQorICAgICAgICBzZWxlY3Rpb25SZWN0Lm1vdmUoYmVmb3JlV2lk
dGgsIDApOworICAgIHNlbGVjdGlvblJlY3Quc2V0V2lkdGgoYWZ0ZXJXaWR0aCAtIGJlZm9yZVdp
ZHRoKTsKK30KKworZmxvYXQgRm9udENhc2NhZGU6OmdldEdseXBoc0FuZEFkdmFuY2VzRm9yQ29t
cGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBpbnQgZnJvbSwgaW50IHRvLCBHbHlwaEJ1ZmZl
ciYgZ2x5cGhCdWZmZXIsIEZvclRleHRFbXBoYXNpc09yTm90IGZvclRleHRFbXBoYXNpcykgY29u
c3QKK3sKKyAgICBmbG9hdCBpbml0aWFsQWR2YW5jZTsKKworICAgIENvbXBsZXhUZXh0Q29udHJv
bGxlciBjb250cm9sbGVyKHRoaXMsIHJ1biwgZmFsc2UsIDAsIGZvclRleHRFbXBoYXNpcyk7Cisg
ICAgY29udHJvbGxlci5hZHZhbmNlKGZyb20pOworICAgIGZsb2F0IGJlZm9yZVdpZHRoID0gY29u
dHJvbGxlci5ydW5XaWR0aFNvRmFyKCk7CisgICAgY29udHJvbGxlci5hZHZhbmNlKHRvLCAmZ2x5
cGhCdWZmZXIpOworCisgICAgaWYgKGdseXBoQnVmZmVyLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0
dXJuIDA7CisKKyAgICBmbG9hdCBhZnRlcldpZHRoID0gY29udHJvbGxlci5ydW5XaWR0aFNvRmFy
KCk7CisKKyAgICBpZiAocnVuLnJ0bCgpKSB7CisgICAgICAgIGluaXRpYWxBZHZhbmNlID0gY29u
dHJvbGxlci50b3RhbFdpZHRoKCkgKyBjb250cm9sbGVyLmZpbmFsUm91bmRpbmdXaWR0aCgpIC0g
YWZ0ZXJXaWR0aDsKKyAgICAgICAgZ2x5cGhCdWZmZXIucmV2ZXJzZSgwLCBnbHlwaEJ1ZmZlci5z
aXplKCkpOworICAgIH0gZWxzZQorICAgICAgICBpbml0aWFsQWR2YW5jZSA9IGJlZm9yZVdpZHRo
OworCisgICAgcmV0dXJuIGluaXRpYWxBZHZhbmNlOworfQorCitmbG9hdCBGb250Q2FzY2FkZTo6
ZHJhd0NvbXBsZXhUZXh0KEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgVGV4dFJ1biYg
cnVuLCBjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgaW50IGZyb20sIGludCB0bykgY29uc3QKK3sK
KyAgICAvLyBUaGlzIGdseXBoIGJ1ZmZlciBob2xkcyBvdXIgZ2x5cGhzICsgYWR2YW5jZXMgKyBm
b250IGRhdGEgZm9yIGVhY2ggZ2x5cGguCisgICAgR2x5cGhCdWZmZXIgZ2x5cGhCdWZmZXI7CisK
KyAgICBmbG9hdCBzdGFydFggPSBwb2ludC54KCkgKyBnZXRHbHlwaHNBbmRBZHZhbmNlc0ZvckNv
bXBsZXhUZXh0KHJ1biwgZnJvbSwgdG8sIGdseXBoQnVmZmVyKTsKKworICAgIC8vIFdlIGNvdWxk
bid0IGdlbmVyYXRlIGFueSBnbHlwaHMgZm9yIHRoZSBydW4uIEdpdmUgdXAuCisgICAgaWYgKGds
eXBoQnVmZmVyLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBEcmF3IHRo
ZSBnbHlwaCBidWZmZXIgbm93IGF0IHRoZSBzdGFydGluZyBwb2ludCByZXR1cm5lZCBpbiBzdGFy
dFguCisgICAgRmxvYXRQb2ludCBzdGFydFBvaW50KHN0YXJ0WCwgcG9pbnQueSgpKTsKKyAgICBk
cmF3R2x5cGhCdWZmZXIoY29udGV4dCwgcnVuLCBnbHlwaEJ1ZmZlciwgc3RhcnRQb2ludCk7CisK
KyAgICByZXR1cm4gc3RhcnRQb2ludC54KCkgLSBzdGFydFg7Cit9CisKK3ZvaWQgRm9udENhc2Nh
ZGU6OmRyYXdFbXBoYXNpc01hcmtzRm9yQ29tcGxleFRleHQoR3JhcGhpY3NDb250ZXh0KiBjb250
ZXh0LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEF0b21pY1N0cmluZyYgbWFyaywgY29uc3Qg
RmxvYXRQb2ludCYgcG9pbnQsIGludCBmcm9tLCBpbnQgdG8pIGNvbnN0Cit7CisgICAgR2x5cGhC
dWZmZXIgZ2x5cGhCdWZmZXI7CisgICAgZmxvYXQgaW5pdGlhbEFkdmFuY2UgPSBnZXRHbHlwaHNB
bmRBZHZhbmNlc0ZvckNvbXBsZXhUZXh0KHJ1biwgZnJvbSwgdG8sIGdseXBoQnVmZmVyLCBGb3JU
ZXh0RW1waGFzaXMpOworCisgICAgaWYgKGdseXBoQnVmZmVyLmlzRW1wdHkoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgZHJhd0VtcGhhc2lzTWFya3MoY29udGV4dCwgcnVuLCBnbHlwaEJ1ZmZl
ciwgbWFyaywgRmxvYXRQb2ludChwb2ludC54KCkgKyBpbml0aWFsQWR2YW5jZSwgcG9pbnQueSgp
KSk7Cit9CisKK2Zsb2F0IEZvbnRDYXNjYWRlOjpmbG9hdFdpZHRoRm9yQ29tcGxleFRleHQoY29u
c3QgVGV4dFJ1biYgcnVuLCBIYXNoU2V0PGNvbnN0IFNpbXBsZUZvbnREYXRhKj4qIGZhbGxiYWNr
Rm9udHMsIEdseXBoT3ZlcmZsb3cqIGdseXBoT3ZlcmZsb3cpIGNvbnN0Cit7CisgICAgQ29tcGxl
eFRleHRDb250cm9sbGVyIGNvbnRyb2xsZXIodGhpcywgcnVuLCB0cnVlLCBmYWxsYmFja0ZvbnRz
KTsKKyAgICBpZiAoZ2x5cGhPdmVyZmxvdykgeworICAgICAgICBnbHlwaE92ZXJmbG93LT50b3Ag
PSBzdGQ6Om1heDxpbnQ+KGdseXBoT3ZlcmZsb3ctPnRvcCwgY2VpbGYoLWNvbnRyb2xsZXIubWlu
R2x5cGhCb3VuZGluZ0JveFkoKSkgLSAoZ2x5cGhPdmVyZmxvdy0+Y29tcHV0ZUJvdW5kcyA/IDAg
OiBmb250TWV0cmljcygpLmFzY2VudCgpKSk7CisgICAgICAgIGdseXBoT3ZlcmZsb3ctPmJvdHRv
bSA9IHN0ZDo6bWF4PGludD4oZ2x5cGhPdmVyZmxvdy0+Ym90dG9tLCBjZWlsZihjb250cm9sbGVy
Lm1heEdseXBoQm91bmRpbmdCb3hZKCkpIC0gKGdseXBoT3ZlcmZsb3ctPmNvbXB1dGVCb3VuZHMg
PyAwIDogZm9udE1ldHJpY3MoKS5kZXNjZW50KCkpKTsKKyAgICAgICAgZ2x5cGhPdmVyZmxvdy0+
bGVmdCA9IHN0ZDo6bWF4PGludD4oMCwgY2VpbGYoLWNvbnRyb2xsZXIubWluR2x5cGhCb3VuZGlu
Z0JveFgoKSkpOworICAgICAgICBnbHlwaE92ZXJmbG93LT5yaWdodCA9IHN0ZDo6bWF4PGludD4o
MCwgY2VpbGYoY29udHJvbGxlci5tYXhHbHlwaEJvdW5kaW5nQm94WCgpIC0gY29udHJvbGxlci50
b3RhbFdpZHRoKCkpKTsKKyAgICB9CisgICAgcmV0dXJuIGNvbnRyb2xsZXIudG90YWxXaWR0aCgp
OworfQorCitpbnQgRm9udENhc2NhZGU6Om9mZnNldEZvclBvc2l0aW9uRm9yQ29tcGxleFRleHQo
Y29uc3QgVGV4dFJ1biYgcnVuLCBmbG9hdCB4LCBib29sIGluY2x1ZGVQYXJ0aWFsR2x5cGhzKSBj
b25zdAoreworICAgIENvbXBsZXhUZXh0Q29udHJvbGxlciBjb250cm9sbGVyKHRoaXMsIHJ1bik7
CisgICAgcmV0dXJuIGNvbnRyb2xsZXIub2Zmc2V0Rm9yUG9zaXRpb24oeCwgaW5jbHVkZVBhcnRp
YWxHbHlwaHMpOworfQorCitjb25zdCBTaW1wbGVGb250RGF0YSogRm9udENhc2NhZGU6OmZvbnRE
YXRhRm9yQ29tYmluaW5nQ2hhcmFjdGVyU2VxdWVuY2UoY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMs
IHNpemVfdCBsZW5ndGgsIEZvbnREYXRhVmFyaWFudCB2YXJpYW50KSBjb25zdAoreworICAgIFVD
aGFyMzIgYmFzZUNoYXJhY3RlcjsKKyAgICBzaXplX3QgYmFzZUNoYXJhY3Rlckxlbmd0aCA9IDA7
CisgICAgVTE2X05FWFQoY2hhcmFjdGVycywgYmFzZUNoYXJhY3Rlckxlbmd0aCwgbGVuZ3RoLCBi
YXNlQ2hhcmFjdGVyKTsKKworICAgIEdseXBoRGF0YSBiYXNlQ2hhcmFjdGVyR2x5cGhEYXRhID0g
Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKGJhc2VDaGFyYWN0ZXIsIGZhbHNlLCB2YXJpYW50KTsKKwor
ICAgIGlmICghYmFzZUNoYXJhY3RlckdseXBoRGF0YS5nbHlwaCkKKyAgICAgICAgcmV0dXJuIDA7
CisKKyAgICBpZiAobGVuZ3RoID09IGJhc2VDaGFyYWN0ZXJMZW5ndGgpCisgICAgICAgIHJldHVy
biBiYXNlQ2hhcmFjdGVyR2x5cGhEYXRhLmZvbnREYXRhOworCisgICAgYm9vbCB0cmllZEJhc2VD
aGFyYWN0ZXJGb250RGF0YSA9IGZhbHNlOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgIWZh
bGxiYWNrUmFuZ2VzQXQoaSkuaXNOdWxsKCk7ICsraSkgeworICAgICAgICBjb25zdCBTaW1wbGVG
b250RGF0YSogc2ltcGxlRm9udERhdGEgPSBmYWxsYmFja1Jhbmdlc0F0KGkpLmZvbnREYXRhRm9y
Q2hhcmFjdGVyKGJhc2VDaGFyYWN0ZXIpOworICAgICAgICBpZiAoIXNpbXBsZUZvbnREYXRhKQor
ICAgICAgICAgICAgY29udGludWU7CisjaWYgUExBVEZPUk0oSU9TKQorICAgICAgICBpZiAoYmFz
ZUNoYXJhY3RlciA+PSAweDA2MDAgJiYgYmFzZUNoYXJhY3RlciA8PSAweDA2ZmYgJiYgc2ltcGxl
Rm9udERhdGEtPnNob3VsZE5vdEJlVXNlZEZvckFyYWJpYygpKQorICAgICAgICAgICAgY29udGlu
dWU7CisjZW5kaWYKKyAgICAgICAgaWYgKHZhcmlhbnQgPT0gTm9ybWFsVmFyaWFudCkgeworICAg
ICAgICAgICAgaWYgKHNpbXBsZUZvbnREYXRhLT5wbGF0Zm9ybURhdGEoKS5vcmllbnRhdGlvbigp
ID09IFZlcnRpY2FsKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzQ0pLSWRlb2dyYXBoT3JTeW1i
b2woYmFzZUNoYXJhY3RlcikgJiYgIXNpbXBsZUZvbnREYXRhLT5oYXNWZXJ0aWNhbEdseXBocygp
KSB7CisgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQgPSBCcm9rZW5JZGVvZ3JhcGhWYXJpYW50
OworICAgICAgICAgICAgICAgICAgICBzaW1wbGVGb250RGF0YSA9IHNpbXBsZUZvbnREYXRhLT5i
cm9rZW5JZGVvZ3JhcGhGb250RGF0YSgpLmdldCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSBp
ZiAobV9mb250RGVzY3JpcHRpb24ubm9uQ0pLR2x5cGhPcmllbnRhdGlvbigpID09IE5vbkNKS0ds
eXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgIFNpbXBs
ZUZvbnREYXRhKiB2ZXJ0aWNhbFJpZ2h0Rm9udERhdGEgPSBzaW1wbGVGb250RGF0YS0+dmVydGlj
YWxSaWdodE9yaWVudGF0aW9uRm9udERhdGEoKS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAg
R2x5cGggdmVydGljYWxSaWdodEdseXBoID0gdmVydGljYWxSaWdodEZvbnREYXRhLT5nbHlwaEZv
ckNoYXJhY3RlcihiYXNlQ2hhcmFjdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZlcnRp
Y2FsUmlnaHRHbHlwaCA9PSBiYXNlQ2hhcmFjdGVyR2x5cGhEYXRhLmdseXBoKQorICAgICAgICAg
ICAgICAgICAgICAgICAgc2ltcGxlRm9udERhdGEgPSB2ZXJ0aWNhbFJpZ2h0Rm9udERhdGE7Cisg
ICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU2ltcGxlRm9udERh
dGEqIHVwcmlnaHRGb250RGF0YSA9IHNpbXBsZUZvbnREYXRhLT51cHJpZ2h0T3JpZW50YXRpb25G
b250RGF0YSgpLmdldCgpOworICAgICAgICAgICAgICAgICAgICBHbHlwaCB1cHJpZ2h0R2x5cGgg
PSB1cHJpZ2h0Rm9udERhdGEtPmdseXBoRm9yQ2hhcmFjdGVyKGJhc2VDaGFyYWN0ZXIpOworICAg
ICAgICAgICAgICAgICAgICBpZiAodXByaWdodEdseXBoICE9IGJhc2VDaGFyYWN0ZXJHbHlwaERh
dGEuZ2x5cGgpCisgICAgICAgICAgICAgICAgICAgICAgICBzaW1wbGVGb250RGF0YSA9IHVwcmln
aHRGb250RGF0YTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICBpZiAoY29uc3QgU2ltcGxlRm9udERhdGEqIHZhcmlhbnRGb250
RGF0YSA9IHNpbXBsZUZvbnREYXRhLT52YXJpYW50Rm9udERhdGEobV9mb250RGVzY3JpcHRpb24s
IHZhcmlhbnQpLmdldCgpKQorICAgICAgICAgICAgICAgIHNpbXBsZUZvbnREYXRhID0gdmFyaWFu
dEZvbnREYXRhOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNpbXBsZUZvbnREYXRhID09IGJh
c2VDaGFyYWN0ZXJHbHlwaERhdGEuZm9udERhdGEpCisgICAgICAgICAgICB0cmllZEJhc2VDaGFy
YWN0ZXJGb250RGF0YSA9IHRydWU7CisKKyAgICAgICAgaWYgKHNpbXBsZUZvbnREYXRhLT5jYW5S
ZW5kZXJDb21iaW5pbmdDaGFyYWN0ZXJTZXF1ZW5jZShjaGFyYWN0ZXJzLCBsZW5ndGgpKQorICAg
ICAgICAgICAgcmV0dXJuIHNpbXBsZUZvbnREYXRhOworICAgIH0KKworICAgIGlmICghdHJpZWRC
YXNlQ2hhcmFjdGVyRm9udERhdGEgJiYgYmFzZUNoYXJhY3RlckdseXBoRGF0YS5mb250RGF0YSAm
JiBiYXNlQ2hhcmFjdGVyR2x5cGhEYXRhLmZvbnREYXRhLT5jYW5SZW5kZXJDb21iaW5pbmdDaGFy
YWN0ZXJTZXF1ZW5jZShjaGFyYWN0ZXJzLCBsZW5ndGgpKQorICAgICAgICByZXR1cm4gYmFzZUNo
YXJhY3RlckdseXBoRGF0YS5mb250RGF0YTsKKworICAgIHJldHVybiBTaW1wbGVGb250RGF0YTo6
c3lzdGVtRmFsbGJhY2soKTsKK30KKwogfQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvbWFjL0ZvbnRDb21wbGV4VGV4dE1hYy5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0ZvbnRDb21wbGV4VGV4dE1hYy5jcHAJKHJl
dmlzaW9uIDE3ODU3NykKKysrIFNvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9G
b250Q29tcGxleFRleHRNYWMuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDE4NCArMCwwIEBACi0v
KgotICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJl
IG1ldDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkK
LSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWQotICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLSAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKLSAq
IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTgotICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RSBPRiBUSElTCi0gKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jaW5jbHVkZSAi
Rm9udENhc2NhZGUuaCIKLQotI2luY2x1ZGUgIkNvbXBsZXhUZXh0Q29udHJvbGxlci5oIgotI2lu
Y2x1ZGUgIkZvbnRHbHlwaHMuaCIKLSNpbmNsdWRlICJHbHlwaEJ1ZmZlci5oIgotI2luY2x1ZGUg
IkdyYXBoaWNzQ29udGV4dC5oIgotI2luY2x1ZGUgIkludFJlY3QuaCIKLSNpbmNsdWRlICJMYXlv
dXRSZWN0LmgiCi0jaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKLSNpbmNsdWRlICJUZXh0UnVu
LmgiCi0jaW5jbHVkZSA8d3RmL01hdGhFeHRyYXMuaD4KLQotbmFtZXNwYWNlIFdlYkNvcmUgewot
Ci12b2lkIEZvbnRDYXNjYWRlOjphZGp1c3RTZWxlY3Rpb25SZWN0Rm9yQ29tcGxleFRleHQoY29u
c3QgVGV4dFJ1biYgcnVuLCBMYXlvdXRSZWN0JiBzZWxlY3Rpb25SZWN0LCBpbnQgZnJvbSwgaW50
IHRvKSBjb25zdAotewotICAgIENvbXBsZXhUZXh0Q29udHJvbGxlciBjb250cm9sbGVyKHRoaXMs
IHJ1bik7Ci0gICAgY29udHJvbGxlci5hZHZhbmNlKGZyb20pOwotICAgIGZsb2F0IGJlZm9yZVdp
ZHRoID0gY29udHJvbGxlci5ydW5XaWR0aFNvRmFyKCk7Ci0gICAgY29udHJvbGxlci5hZHZhbmNl
KHRvKTsKLSAgICBmbG9hdCBhZnRlcldpZHRoID0gY29udHJvbGxlci5ydW5XaWR0aFNvRmFyKCk7
Ci0KLSAgICBpZiAocnVuLnJ0bCgpKQotICAgICAgICBzZWxlY3Rpb25SZWN0Lm1vdmUoY29udHJv
bGxlci50b3RhbFdpZHRoKCkgLSBhZnRlcldpZHRoLCAwKTsKLSAgICBlbHNlCi0gICAgICAgIHNl
bGVjdGlvblJlY3QubW92ZShiZWZvcmVXaWR0aCwgMCk7Ci0gICAgc2VsZWN0aW9uUmVjdC5zZXRX
aWR0aChhZnRlcldpZHRoIC0gYmVmb3JlV2lkdGgpOwotfQotCi1mbG9hdCBGb250Q2FzY2FkZTo6
Z2V0R2x5cGhzQW5kQWR2YW5jZXNGb3JDb21wbGV4VGV4dChjb25zdCBUZXh0UnVuJiBydW4sIGlu
dCBmcm9tLCBpbnQgdG8sIEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwgRm9yVGV4dEVtcGhhc2lz
T3JOb3QgZm9yVGV4dEVtcGhhc2lzKSBjb25zdAotewotICAgIGZsb2F0IGluaXRpYWxBZHZhbmNl
OwotCi0gICAgQ29tcGxleFRleHRDb250cm9sbGVyIGNvbnRyb2xsZXIodGhpcywgcnVuLCBmYWxz
ZSwgMCwgZm9yVGV4dEVtcGhhc2lzKTsKLSAgICBjb250cm9sbGVyLmFkdmFuY2UoZnJvbSk7Ci0g
ICAgZmxvYXQgYmVmb3JlV2lkdGggPSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKTsKLSAgICBj
b250cm9sbGVyLmFkdmFuY2UodG8sICZnbHlwaEJ1ZmZlcik7Ci0KLSAgICBpZiAoZ2x5cGhCdWZm
ZXIuaXNFbXB0eSgpKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIGZsb2F0IGFmdGVyV2lkdGgg
PSBjb250cm9sbGVyLnJ1bldpZHRoU29GYXIoKTsKLQotICAgIGlmIChydW4ucnRsKCkpIHsKLSAg
ICAgICAgaW5pdGlhbEFkdmFuY2UgPSBjb250cm9sbGVyLnRvdGFsV2lkdGgoKSArIGNvbnRyb2xs
ZXIuZmluYWxSb3VuZGluZ1dpZHRoKCkgLSBhZnRlcldpZHRoOwotICAgICAgICBnbHlwaEJ1ZmZl
ci5yZXZlcnNlKDAsIGdseXBoQnVmZmVyLnNpemUoKSk7Ci0gICAgfSBlbHNlCi0gICAgICAgIGlu
aXRpYWxBZHZhbmNlID0gYmVmb3JlV2lkdGg7Ci0KLSAgICByZXR1cm4gaW5pdGlhbEFkdmFuY2U7
Ci19Ci0KLWZsb2F0IEZvbnRDYXNjYWRlOjpkcmF3Q29tcGxleFRleHQoR3JhcGhpY3NDb250ZXh0
KiBjb250ZXh0LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBp
bnQgZnJvbSwgaW50IHRvKSBjb25zdAotewotICAgIC8vIFRoaXMgZ2x5cGggYnVmZmVyIGhvbGRz
IG91ciBnbHlwaHMgKyBhZHZhbmNlcyArIGZvbnQgZGF0YSBmb3IgZWFjaCBnbHlwaC4KLSAgICBH
bHlwaEJ1ZmZlciBnbHlwaEJ1ZmZlcjsKLQotICAgIGZsb2F0IHN0YXJ0WCA9IHBvaW50LngoKSAr
IGdldEdseXBoc0FuZEFkdmFuY2VzRm9yQ29tcGxleFRleHQocnVuLCBmcm9tLCB0bywgZ2x5cGhC
dWZmZXIpOwotCi0gICAgLy8gV2UgY291bGRuJ3QgZ2VuZXJhdGUgYW55IGdseXBocyBmb3IgdGhl
IHJ1bi4gIEdpdmUgdXAuCi0gICAgaWYgKGdseXBoQnVmZmVyLmlzRW1wdHkoKSkKLSAgICAgICAg
cmV0dXJuIDA7Ci0KLSAgICAvLyBEcmF3IHRoZSBnbHlwaCBidWZmZXIgbm93IGF0IHRoZSBzdGFy
dGluZyBwb2ludCByZXR1cm5lZCBpbiBzdGFydFguCi0gICAgRmxvYXRQb2ludCBzdGFydFBvaW50
KHN0YXJ0WCwgcG9pbnQueSgpKTsKLSAgICBkcmF3R2x5cGhCdWZmZXIoY29udGV4dCwgcnVuLCBn
bHlwaEJ1ZmZlciwgc3RhcnRQb2ludCk7Ci0KLSAgICByZXR1cm4gc3RhcnRQb2ludC54KCkgLSBz
dGFydFg7Ci19Ci0KLXZvaWQgRm9udENhc2NhZGU6OmRyYXdFbXBoYXNpc01hcmtzRm9yQ29tcGxl
eFRleHQoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0
IEF0b21pY1N0cmluZyYgbWFyaywgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGludCBmcm9tLCBp
bnQgdG8pIGNvbnN0Ci17Ci0gICAgR2x5cGhCdWZmZXIgZ2x5cGhCdWZmZXI7Ci0gICAgZmxvYXQg
aW5pdGlhbEFkdmFuY2UgPSBnZXRHbHlwaHNBbmRBZHZhbmNlc0ZvckNvbXBsZXhUZXh0KHJ1biwg
ZnJvbSwgdG8sIGdseXBoQnVmZmVyLCBGb3JUZXh0RW1waGFzaXMpOwotCi0gICAgaWYgKGdseXBo
QnVmZmVyLmlzRW1wdHkoKSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgZHJhd0VtcGhhc2lzTWFy
a3MoY29udGV4dCwgcnVuLCBnbHlwaEJ1ZmZlciwgbWFyaywgRmxvYXRQb2ludChwb2ludC54KCkg
KyBpbml0aWFsQWR2YW5jZSwgcG9pbnQueSgpKSk7Ci19Ci0KLWZsb2F0IEZvbnRDYXNjYWRlOjpm
bG9hdFdpZHRoRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBIYXNoU2V0PGNvbnN0
IFNpbXBsZUZvbnREYXRhKj4qIGZhbGxiYWNrRm9udHMsIEdseXBoT3ZlcmZsb3cqIGdseXBoT3Zl
cmZsb3cpIGNvbnN0Ci17Ci0gICAgQ29tcGxleFRleHRDb250cm9sbGVyIGNvbnRyb2xsZXIodGhp
cywgcnVuLCB0cnVlLCBmYWxsYmFja0ZvbnRzKTsKLSAgICBpZiAoZ2x5cGhPdmVyZmxvdykgewot
ICAgICAgICBnbHlwaE92ZXJmbG93LT50b3AgPSBzdGQ6Om1heDxpbnQ+KGdseXBoT3ZlcmZsb3ct
PnRvcCwgY2VpbGYoLWNvbnRyb2xsZXIubWluR2x5cGhCb3VuZGluZ0JveFkoKSkgLSAoZ2x5cGhP
dmVyZmxvdy0+Y29tcHV0ZUJvdW5kcyA/IDAgOiBmb250TWV0cmljcygpLmFzY2VudCgpKSk7Ci0g
ICAgICAgIGdseXBoT3ZlcmZsb3ctPmJvdHRvbSA9IHN0ZDo6bWF4PGludD4oZ2x5cGhPdmVyZmxv
dy0+Ym90dG9tLCBjZWlsZihjb250cm9sbGVyLm1heEdseXBoQm91bmRpbmdCb3hZKCkpIC0gKGds
eXBoT3ZlcmZsb3ctPmNvbXB1dGVCb3VuZHMgPyAwIDogZm9udE1ldHJpY3MoKS5kZXNjZW50KCkp
KTsKLSAgICAgICAgZ2x5cGhPdmVyZmxvdy0+bGVmdCA9IHN0ZDo6bWF4PGludD4oMCwgY2VpbGYo
LWNvbnRyb2xsZXIubWluR2x5cGhCb3VuZGluZ0JveFgoKSkpOwotICAgICAgICBnbHlwaE92ZXJm
bG93LT5yaWdodCA9IHN0ZDo6bWF4PGludD4oMCwgY2VpbGYoY29udHJvbGxlci5tYXhHbHlwaEJv
dW5kaW5nQm94WCgpIC0gY29udHJvbGxlci50b3RhbFdpZHRoKCkpKTsKLSAgICB9Ci0gICAgcmV0
dXJuIGNvbnRyb2xsZXIudG90YWxXaWR0aCgpOwotfQotCi1pbnQgRm9udENhc2NhZGU6Om9mZnNl
dEZvclBvc2l0aW9uRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBmbG9hdCB4LCBi
b29sIGluY2x1ZGVQYXJ0aWFsR2x5cGhzKSBjb25zdAotewotICAgIENvbXBsZXhUZXh0Q29udHJv
bGxlciBjb250cm9sbGVyKHRoaXMsIHJ1bik7Ci0gICAgcmV0dXJuIGNvbnRyb2xsZXIub2Zmc2V0
Rm9yUG9zaXRpb24oeCwgaW5jbHVkZVBhcnRpYWxHbHlwaHMpOwotfQotCi1jb25zdCBTaW1wbGVG
b250RGF0YSogRm9udENhc2NhZGU6OmZvbnREYXRhRm9yQ29tYmluaW5nQ2hhcmFjdGVyU2VxdWVu
Y2UoY29uc3QgVUNoYXIqIGNoYXJhY3RlcnMsIHNpemVfdCBsZW5ndGgsIEZvbnREYXRhVmFyaWFu
dCB2YXJpYW50KSBjb25zdAotewotICAgIFVDaGFyMzIgYmFzZUNoYXJhY3RlcjsKLSAgICBzaXpl
X3QgYmFzZUNoYXJhY3Rlckxlbmd0aCA9IDA7Ci0gICAgVTE2X05FWFQoY2hhcmFjdGVycywgYmFz
ZUNoYXJhY3Rlckxlbmd0aCwgbGVuZ3RoLCBiYXNlQ2hhcmFjdGVyKTsKLQotICAgIEdseXBoRGF0
YSBiYXNlQ2hhcmFjdGVyR2x5cGhEYXRhID0gZ2x5cGhEYXRhRm9yQ2hhcmFjdGVyKGJhc2VDaGFy
YWN0ZXIsIGZhbHNlLCB2YXJpYW50KTsKLQotICAgIGlmICghYmFzZUNoYXJhY3RlckdseXBoRGF0
YS5nbHlwaCkKLSAgICAgICAgcmV0dXJuIDA7Ci0KLSAgICBpZiAobGVuZ3RoID09IGJhc2VDaGFy
YWN0ZXJMZW5ndGgpCi0gICAgICAgIHJldHVybiBiYXNlQ2hhcmFjdGVyR2x5cGhEYXRhLmZvbnRE
YXRhOwotCi0gICAgYm9vbCB0cmllZEJhc2VDaGFyYWN0ZXJGb250RGF0YSA9IGZhbHNlOwotCi0g
ICAgZm9yICh1bnNpZ25lZCBpID0gMDsgIWZhbGxiYWNrUmFuZ2VzQXQoaSkuaXNOdWxsKCk7ICsr
aSkgewotICAgICAgICBjb25zdCBTaW1wbGVGb250RGF0YSogc2ltcGxlRm9udERhdGEgPSBmYWxs
YmFja1Jhbmdlc0F0KGkpLmZvbnREYXRhRm9yQ2hhcmFjdGVyKGJhc2VDaGFyYWN0ZXIpOwotICAg
ICAgICBpZiAoIXNpbXBsZUZvbnREYXRhKQotICAgICAgICAgICAgY29udGludWU7Ci0jaWYgUExB
VEZPUk0oSU9TKQotICAgICAgICBpZiAoYmFzZUNoYXJhY3RlciA+PSAweDA2MDAgJiYgYmFzZUNo
YXJhY3RlciA8PSAweDA2ZmYgJiYgc2ltcGxlRm9udERhdGEtPnNob3VsZE5vdEJlVXNlZEZvckFy
YWJpYygpKQotICAgICAgICAgICAgY29udGludWU7Ci0jZW5kaWYKLSAgICAgICAgaWYgKHZhcmlh
bnQgPT0gTm9ybWFsVmFyaWFudCkgewotICAgICAgICAgICAgaWYgKHNpbXBsZUZvbnREYXRhLT5w
bGF0Zm9ybURhdGEoKS5vcmllbnRhdGlvbigpID09IFZlcnRpY2FsKSB7Ci0gICAgICAgICAgICAg
ICAgaWYgKGlzQ0pLSWRlb2dyYXBoT3JTeW1ib2woYmFzZUNoYXJhY3RlcikgJiYgIXNpbXBsZUZv
bnREYXRhLT5oYXNWZXJ0aWNhbEdseXBocygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhcmlh
bnQgPSBCcm9rZW5JZGVvZ3JhcGhWYXJpYW50OwotICAgICAgICAgICAgICAgICAgICBzaW1wbGVG
b250RGF0YSA9IHNpbXBsZUZvbnREYXRhLT5icm9rZW5JZGVvZ3JhcGhGb250RGF0YSgpLmdldCgp
OwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobV9mb250RGVzY3JpcHRpb24ubm9uQ0pLR2x5
cGhPcmllbnRhdGlvbigpID09IE5vbkNKS0dseXBoT3JpZW50YXRpb25WZXJ0aWNhbFJpZ2h0KSB7
Ci0gICAgICAgICAgICAgICAgICAgIFNpbXBsZUZvbnREYXRhKiB2ZXJ0aWNhbFJpZ2h0Rm9udERh
dGEgPSBzaW1wbGVGb250RGF0YS0+dmVydGljYWxSaWdodE9yaWVudGF0aW9uRm9udERhdGEoKS5n
ZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgR2x5cGggdmVydGljYWxSaWdodEdseXBoID0gdmVy
dGljYWxSaWdodEZvbnREYXRhLT5nbHlwaEZvckNoYXJhY3RlcihiYXNlQ2hhcmFjdGVyKTsKLSAg
ICAgICAgICAgICAgICAgICAgaWYgKHZlcnRpY2FsUmlnaHRHbHlwaCA9PSBiYXNlQ2hhcmFjdGVy
R2x5cGhEYXRhLmdseXBoKQotICAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlRm9udERhdGEg
PSB2ZXJ0aWNhbFJpZ2h0Rm9udERhdGE7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAg
ICAgICAgICAgICAgICAgU2ltcGxlRm9udERhdGEqIHVwcmlnaHRGb250RGF0YSA9IHNpbXBsZUZv
bnREYXRhLT51cHJpZ2h0T3JpZW50YXRpb25Gb250RGF0YSgpLmdldCgpOwotICAgICAgICAgICAg
ICAgICAgICBHbHlwaCB1cHJpZ2h0R2x5cGggPSB1cHJpZ2h0Rm9udERhdGEtPmdseXBoRm9yQ2hh
cmFjdGVyKGJhc2VDaGFyYWN0ZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAodXByaWdodEds
eXBoICE9IGJhc2VDaGFyYWN0ZXJHbHlwaERhdGEuZ2x5cGgpCi0gICAgICAgICAgICAgICAgICAg
ICAgICBzaW1wbGVGb250RGF0YSA9IHVwcmlnaHRGb250RGF0YTsKLSAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoY29uc3Qg
U2ltcGxlRm9udERhdGEqIHZhcmlhbnRGb250RGF0YSA9IHNpbXBsZUZvbnREYXRhLT52YXJpYW50
Rm9udERhdGEobV9mb250RGVzY3JpcHRpb24sIHZhcmlhbnQpLmdldCgpKQotICAgICAgICAgICAg
ICAgIHNpbXBsZUZvbnREYXRhID0gdmFyaWFudEZvbnREYXRhOwotICAgICAgICB9Ci0KLSAgICAg
ICAgaWYgKHNpbXBsZUZvbnREYXRhID09IGJhc2VDaGFyYWN0ZXJHbHlwaERhdGEuZm9udERhdGEp
Ci0gICAgICAgICAgICB0cmllZEJhc2VDaGFyYWN0ZXJGb250RGF0YSA9IHRydWU7Ci0KLSAgICAg
ICAgaWYgKHNpbXBsZUZvbnREYXRhLT5jYW5SZW5kZXJDb21iaW5pbmdDaGFyYWN0ZXJTZXF1ZW5j
ZShjaGFyYWN0ZXJzLCBsZW5ndGgpKQotICAgICAgICAgICAgcmV0dXJuIHNpbXBsZUZvbnREYXRh
OwotICAgIH0KLQotICAgIGlmICghdHJpZWRCYXNlQ2hhcmFjdGVyRm9udERhdGEgJiYgYmFzZUNo
YXJhY3RlckdseXBoRGF0YS5mb250RGF0YSAmJiBiYXNlQ2hhcmFjdGVyR2x5cGhEYXRhLmZvbnRE
YXRhLT5jYW5SZW5kZXJDb21iaW5pbmdDaGFyYWN0ZXJTZXF1ZW5jZShjaGFyYWN0ZXJzLCBsZW5n
dGgpKQotICAgICAgICByZXR1cm4gYmFzZUNoYXJhY3RlckdseXBoRGF0YS5mb250RGF0YTsKLQot
ICAgIHJldHVybiBTaW1wbGVGb250RGF0YTo6c3lzdGVtRmFsbGJhY2soKTsKLX0KLQotfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQpJbmRleDogU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
bWFjL0ZvbnRNYWMubW0KPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvbWFjL0ZvbnRNYWMubW0JKHJldmlzaW9uIDE3ODU3NykKKysrIFNvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Gb250TWFjLm1tCSh3b3JraW5nIGNvcHkpCkBAIC0xLDYw
NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAxOTk5IExhcnMgS25vbGwgKGtub2xsQGtk
ZS5vcmcpCi0gKiAgICAgICAgICAgKEMpIDE5OTkgQW50dGkgS29pdmlzdG8gKGtvaXZpc3RvQGtk
ZS5vcmcpCi0gKiAgICAgICAgICAgKEMpIDIwMDAgRGlyayBNdWVsbGVyIChtdWVsbGVyQGtkZS5v
cmcpCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAs
IDIwMTEgQXBwbGUgSW5jLgotICoKLSAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKLSAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy
bXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKLSAqIHZlcnNpb24g
MiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
LSAqCi0gKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3
aWxsIGJlIHVzZWZ1bCwKLSAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCi0gKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCi0gKgotICogWW91IHNob3VsZCBoYXZl
IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZQotICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4g
IElmIG5vdCwgd3JpdGUgdG8KLSAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4s
IDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCi0gKiBCb3N0b24sIE1BIDAyMTEwLTEz
MDEsIFVTQS4KLSAqLwotCi0jaW1wb3J0ICJjb25maWcuaCIKLSNpbXBvcnQgIkZvbnRDYXNjYWRl
LmgiCi0KLSNpbXBvcnQgIkNvcmVHcmFwaGljc1NQSS5oIgotI2ltcG9ydCAiQ29yZVRleHRTUEku
aCIKLSNpbXBvcnQgIkRhc2hBcnJheS5oIgotI2ltcG9ydCAiR2x5cGhCdWZmZXIuaCIKLSNpbXBv
cnQgIkdyYXBoaWNzQ29udGV4dC5oIgotI2ltcG9ydCAiTG9nZ2luZy5oIgotI2ltcG9ydCAiU2lt
cGxlRm9udERhdGEuaCIKLSNpbXBvcnQgIldlYkNvcmVTeXN0ZW1JbnRlcmZhY2UuaCIKLSNpZiBV
U0UoQVBQS0lUKQotI2ltcG9ydCA8QXBwS2l0L0FwcEtpdC5oPgotI2VuZGlmCi0jaW1wb3J0IDx3
dGYvTWF0aEV4dHJhcy5oPgotCi0jaWYgRU5BQkxFKExFVFRFUlBSRVNTKQotI2ltcG9ydCAiQ29y
ZVVJU1BJLmgiCi0jaW1wb3J0ICJTb2Z0TGlua2luZy5oIgotCi1TT0ZUX0xJTktfUFJJVkFURV9G
UkFNRVdPUksoQ29yZVVJKQotU09GVF9MSU5LX0NMQVNTKENvcmVVSSwgQ1VJQ2F0YWxvZykKLVNP
RlRfTElOS19DTEFTUyhDb3JlVUksIENVSVN0eWxlRWZmZWN0Q29uZmlndXJhdGlvbikKLQotU09G
VF9MSU5LX0ZSQU1FV09SSyhVSUtpdCkKLVNPRlRfTElOSyhVSUtpdCwgX1VJS2l0R2V0VGV4dEVm
ZmVjdHNDYXRhbG9nLCBDVUlDYXRhbG9nICosICh2b2lkKSwgKCkpCi0jZW5kaWYKLQotI2RlZmlu
ZSBTWU5USEVUSUNfT0JMSVFVRV9BTkdMRSAxNAotCi0jaWZkZWYgX19MUDY0X18KLSNkZWZpbmUg
VVJlZkNvbiB2b2lkKgotI2Vsc2UKLSNkZWZpbmUgVVJlZkNvbiBVSW50MzIKLSNlbmRpZgotCi1u
YW1lc3BhY2UgV2ViQ29yZSB7Ci0KLWJvb2wgRm9udENhc2NhZGU6OmNhblJldHVybkZhbGxiYWNr
Rm9udHNGb3JDb21wbGV4VGV4dCgpCi17Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRm9u
dENhc2NhZGU6OmNhbkV4cGFuZEFyb3VuZElkZW9ncmFwaHNJbkNvbXBsZXhUZXh0KCkKLXsKLSAg
ICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGZpbGxWZWN0b3JXaXRoSG9y
aXpvbnRhbEdseXBoUG9zaXRpb25zKFZlY3RvcjxDR1BvaW50LCAyNTY+JiBwb3NpdGlvbnMsIENH
Q29udGV4dFJlZiBjb250ZXh0LCBjb25zdCBDR1NpemUqIGFkdmFuY2VzLCBzaXplX3QgY291bnQp
Ci17Ci0gICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbWF0cml4ID0gQ0dBZmZpbmVUcmFuc2Zvcm1JbnZl
cnQoQ0dDb250ZXh0R2V0VGV4dE1hdHJpeChjb250ZXh0KSk7Ci0gICAgcG9zaXRpb25zWzBdID0g
Q0dQb2ludFplcm87Ci0gICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBjb3VudDsgKytpKSB7Ci0g
ICAgICAgIENHU2l6ZSBhZHZhbmNlID0gQ0dTaXplQXBwbHlBZmZpbmVUcmFuc2Zvcm0oYWR2YW5j
ZXNbaSAtIDFdLCBtYXRyaXgpOwotICAgICAgICBwb3NpdGlvbnNbaV0ueCA9IHBvc2l0aW9uc1tp
IC0gMV0ueCArIGFkdmFuY2Uud2lkdGg7Ci0gICAgICAgIHBvc2l0aW9uc1tpXS55ID0gcG9zaXRp
b25zW2kgLSAxXS55ICsgYWR2YW5jZS5oZWlnaHQ7Ci0gICAgfQotfQotCi1zdGF0aWMgaW5saW5l
IGJvb2wgc2hvdWxkVXNlTGV0dGVycHJlc3NFZmZlY3QoY29uc3QgR3JhcGhpY3NDb250ZXh0JiBj
b250ZXh0KQotewotI2lmIEVOQUJMRShMRVRURVJQUkVTUykKLSAgICByZXR1cm4gY29udGV4dC50
ZXh0RHJhd2luZ01vZGUoKSAmIFRleHRNb2RlTGV0dGVycHJlc3M7Ci0jZWxzZQotICAgIFVOVVNF
RF9QQVJBTShjb250ZXh0KTsKLSAgICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLX0KLQotc3RhdGlj
IHZvaWQgc2hvd0xldHRlcnByZXNzZWRHbHlwaHNXaXRoQWR2YW5jZXMoY29uc3QgRmxvYXRQb2lu
dCYgcG9pbnQsIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250LCBDR0NvbnRleHRSZWYgY29udGV4
dCwgY29uc3QgQ0dHbHlwaCogZ2x5cGhzLCBjb25zdCBDR1NpemUqIGFkdmFuY2VzLCBzaXplX3Qg
Y291bnQpCi17Ci0jaWYgRU5BQkxFKExFVFRFUlBSRVNTKQotICAgIGlmICghY291bnQpCi0gICAg
ICAgIHJldHVybjsKLQotICAgIGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0YSA9
IGZvbnQtPnBsYXRmb3JtRGF0YSgpOwotICAgIGlmIChwbGF0Zm9ybURhdGEub3JpZW50YXRpb24o
KSA9PSBWZXJ0aWNhbCkgewotICAgICAgICAvLyBGSVhNRTogSW1wbGVtZW50IHN1cHBvcnQgZm9y
IHZlcnRpY2FsIHRleHQuIFNlZSA8cmRhcjovL3Byb2JsZW0vMTM3MzcyOTg+LgotICAgICAgICBy
ZXR1cm47Ci0gICAgfQotCi0gICAgQ0dDb250ZXh0U2V0VGV4dFBvc2l0aW9uKGNvbnRleHQsIHBv
aW50LngoKSwgcG9pbnQueSgpKTsKLSAgICBWZWN0b3I8Q0dQb2ludCwgMjU2PiBwb3NpdGlvbnMo
Y291bnQpOwotICAgIGZpbGxWZWN0b3JXaXRoSG9yaXpvbnRhbEdseXBoUG9zaXRpb25zKHBvc2l0
aW9ucywgY29udGV4dCwgYWR2YW5jZXMsIGNvdW50KTsKLQotICAgIENURm9udFJlZiBjdEZvbnQg
PSBwbGF0Zm9ybURhdGEuY3RGb250KCk7Ci0gICAgQ0dDb250ZXh0U2V0Rm9udFNpemUoY29udGV4
dCwgQ1RGb250R2V0U2l6ZShjdEZvbnQpKTsKLQotICAgIHN0YXRpYyBDVUlDYXRhbG9nICpjYXRh
bG9nID0gX1VJS2l0R2V0VGV4dEVmZmVjdHNDYXRhbG9nKCk7Ci0gICAgaWYgKCFjYXRhbG9nKQot
ICAgICAgICByZXR1cm47Ci0KLSAgICBzdGF0aWMgQ1VJU3R5bGVFZmZlY3RDb25maWd1cmF0aW9u
ICpzdHlsZUNvbmZpZ3VyYXRpb247Ci0gICAgaWYgKCFzdHlsZUNvbmZpZ3VyYXRpb24pIHsKLSAg
ICAgICAgc3R5bGVDb25maWd1cmF0aW9uID0gW2FsbG9jQ1VJU3R5bGVFZmZlY3RDb25maWd1cmF0
aW9uSW5zdGFuY2UoKSBpbml0XTsKLSAgICAgICAgc3R5bGVDb25maWd1cmF0aW9uLnVzZVNpbXBs
aWZpZWRFZmZlY3QgPSBZRVM7Ci0gICAgfQotCi0gICAgW2NhdGFsb2cgZHJhd0dseXBoczpnbHlw
aHMgYXRQb3NpdGlvbnM6cG9zaXRpb25zLmRhdGEoKSBpbkNvbnRleHQ6Y29udGV4dCB3aXRoRm9u
dDpjdEZvbnQgY291bnQ6Y291bnQgc3R5bGVQcmVzZXROYW1lOkAiX1VJS2l0TmV3TGV0dGVycHJl
c3NTdHlsZSIgc3R5bGVDb25maWd1cmF0aW9uOnN0eWxlQ29uZmlndXJhdGlvbiBmb3JlZ3JvdW5k
Q29sb3I6Q0dDb250ZXh0R2V0RmlsbENvbG9yQXNDb2xvcihjb250ZXh0KV07Ci0jZWxzZQotICAg
IFVOVVNFRF9QQVJBTShwb2ludCk7Ci0gICAgVU5VU0VEX1BBUkFNKGZvbnQpOwotICAgIFVOVVNF
RF9QQVJBTShjb250ZXh0KTsKLSAgICBVTlVTRURfUEFSQU0oZ2x5cGhzKTsKLSAgICBVTlVTRURf
UEFSQU0oYWR2YW5jZXMpOwotICAgIFVOVVNFRF9QQVJBTShjb3VudCk7Ci0jZW5kaWYKLX0KLQot
c3RhdGljIHZvaWQgc2hvd0dseXBoc1dpdGhBZHZhbmNlcyhjb25zdCBGbG9hdFBvaW50JiBwb2lu
dCwgY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnQsIENHQ29udGV4dFJlZiBjb250ZXh0LCBjb25z
dCBDR0dseXBoKiBnbHlwaHMsIGNvbnN0IENHU2l6ZSogYWR2YW5jZXMsIHNpemVfdCBjb3VudCkK
LXsKLSAgICBpZiAoIWNvdW50KQotICAgICAgICByZXR1cm47Ci0KLSAgICBDR0NvbnRleHRTZXRU
ZXh0UG9zaXRpb24oY29udGV4dCwgcG9pbnQueCgpLCBwb2ludC55KCkpOwotCi0gICAgY29uc3Qg
Rm9udFBsYXRmb3JtRGF0YSYgcGxhdGZvcm1EYXRhID0gZm9udC0+cGxhdGZvcm1EYXRhKCk7Ci0g
ICAgVmVjdG9yPENHUG9pbnQsIDI1Nj4gcG9zaXRpb25zKGNvdW50KTsKLSAgICBpZiAocGxhdGZv
cm1EYXRhLmlzQ29sb3JCaXRtYXBGb250KCkpCi0gICAgICAgIGZpbGxWZWN0b3JXaXRoSG9yaXpv
bnRhbEdseXBoUG9zaXRpb25zKHBvc2l0aW9ucywgY29udGV4dCwgYWR2YW5jZXMsIGNvdW50KTsK
LSAgICBpZiAocGxhdGZvcm1EYXRhLm9yaWVudGF0aW9uKCkgPT0gVmVydGljYWwpIHsKLSAgICAg
ICAgQ0dBZmZpbmVUcmFuc2Zvcm0gc2F2ZWRNYXRyaXg7Ci0gICAgICAgIENHQWZmaW5lVHJhbnNm
b3JtIHJvdGF0ZUxlZnRUcmFuc2Zvcm0gPSBDR0FmZmluZVRyYW5zZm9ybU1ha2UoMCwgLTEsIDEs
IDAsIDAsIDApOwotICAgICAgICBzYXZlZE1hdHJpeCA9IENHQ29udGV4dEdldFRleHRNYXRyaXgo
Y29udGV4dCk7Ci0gICAgICAgIENHQWZmaW5lVHJhbnNmb3JtIHJ1bk1hdHJpeCA9IENHQWZmaW5l
VHJhbnNmb3JtQ29uY2F0KHNhdmVkTWF0cml4LCByb3RhdGVMZWZ0VHJhbnNmb3JtKTsKLSAgICAg
ICAgQ0dDb250ZXh0U2V0VGV4dE1hdHJpeChjb250ZXh0LCBydW5NYXRyaXgpOwotCi0gICAgICAg
IFZlY3RvcjxDR1NpemUsIDI1Nj4gdHJhbnNsYXRpb25zKGNvdW50KTsKLSAgICAgICAgQ1RGb250
R2V0VmVydGljYWxUcmFuc2xhdGlvbnNGb3JHbHlwaHMocGxhdGZvcm1EYXRhLmN0Rm9udCgpLCBn
bHlwaHMsIHRyYW5zbGF0aW9ucy5kYXRhKCksIGNvdW50KTsKLQotICAgICAgICBDR0FmZmluZVRy
YW5zZm9ybSB0cmFuc2Zvcm0gPSBDR0FmZmluZVRyYW5zZm9ybUludmVydChDR0NvbnRleHRHZXRU
ZXh0TWF0cml4KGNvbnRleHQpKTsKLQotICAgICAgICBDR1BvaW50IHBvc2l0aW9uID0gRmxvYXRQ
b2ludChwb2ludC54KCksIHBvaW50LnkoKSArIGZvbnQtPmZvbnRNZXRyaWNzKCkuZmxvYXRBc2Nl
bnQoSWRlb2dyYXBoaWNCYXNlbGluZSkgLSBmb250LT5mb250TWV0cmljcygpLmZsb2F0QXNjZW50
KCkpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAg
ICAgICAgIENHU2l6ZSB0cmFuc2xhdGlvbiA9IENHU2l6ZUFwcGx5QWZmaW5lVHJhbnNmb3JtKHRy
YW5zbGF0aW9uc1tpXSwgcm90YXRlTGVmdFRyYW5zZm9ybSk7Ci0gICAgICAgICAgICBwb3NpdGlv
bnNbaV0gPSBDR1BvaW50QXBwbHlBZmZpbmVUcmFuc2Zvcm0oQ0dQb2ludE1ha2UocG9zaXRpb24u
eCAtIHRyYW5zbGF0aW9uLndpZHRoLCBwb3NpdGlvbi55ICsgdHJhbnNsYXRpb24uaGVpZ2h0KSwg
dHJhbnNmb3JtKTsKLSAgICAgICAgICAgIHBvc2l0aW9uLnggKz0gYWR2YW5jZXNbaV0ud2lkdGg7
Ci0gICAgICAgICAgICBwb3NpdGlvbi55ICs9IGFkdmFuY2VzW2ldLmhlaWdodDsKLSAgICAgICAg
fQotICAgICAgICBpZiAoIXBsYXRmb3JtRGF0YS5pc0NvbG9yQml0bWFwRm9udCgpKQotICAgICAg
ICAgICAgQ0dDb250ZXh0U2hvd0dseXBoc0F0UG9zaXRpb25zKGNvbnRleHQsIGdseXBocywgcG9z
aXRpb25zLmRhdGEoKSwgY291bnQpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBDVEZvbnRE
cmF3R2x5cGhzKHBsYXRmb3JtRGF0YS5jdEZvbnQoKSwgZ2x5cGhzLCBwb3NpdGlvbnMuZGF0YSgp
LCBjb3VudCwgY29udGV4dCk7Ci0gICAgICAgIENHQ29udGV4dFNldFRleHRNYXRyaXgoY29udGV4
dCwgc2F2ZWRNYXRyaXgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghcGxhdGZvcm1EYXRh
LmlzQ29sb3JCaXRtYXBGb250KCkpCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAotI3By
YWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMi
Ci0gICAgICAgICAgICBDR0NvbnRleHRTaG93R2x5cGhzV2l0aEFkdmFuY2VzKGNvbnRleHQsIGds
eXBocywgYWR2YW5jZXMsIGNvdW50KTsKLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKLSAg
ICAgICAgZWxzZQotICAgICAgICAgICAgQ1RGb250RHJhd0dseXBocyhwbGF0Zm9ybURhdGEuY3RG
b250KCksIGdseXBocywgcG9zaXRpb25zLmRhdGEoKSwgY291bnQsIGNvbnRleHQpOwotICAgIH0K
LX0KLQotI2lmIFBMQVRGT1JNKE1BQykKLXN0YXRpYyB2b2lkIHNldENHRm9udFJlbmRlcmluZ01v
ZGUoQ0dDb250ZXh0UmVmIGNnQ29udGV4dCwgTlNGb250UmVuZGVyaW5nTW9kZSByZW5kZXJpbmdN
b2RlLCBCT09MIHNob3VsZFN1YnBpeGVsUXVhbnRpemUpCi17Ci0gICAgaWYgKHJlbmRlcmluZ01v
ZGUgPT0gTlNGb250SW50ZWdlckFkdmFuY2VtZW50c1JlbmRlcmluZ01vZGUpIHsKLSAgICAgICAg
Q0dDb250ZXh0U2V0U2hvdWxkQW50aWFsaWFzRm9udHMoY2dDb250ZXh0LCBmYWxzZSk7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBDR0NvbnRleHRTZXRTaG91bGRBbnRpYWxpYXNGb250
cyhjZ0NvbnRleHQsIHRydWUpOwotCi0gICAgQ0dBZmZpbmVUcmFuc2Zvcm0gY29udGV4dFRyYW5z
Zm9ybSA9IENHQ29udGV4dEdldENUTShjZ0NvbnRleHQpOwotICAgIEJPT0wgaXNUcmFuc2xhdGlv
bk9ySW50ZWdyYWxTY2FsZSA9IFdURjo6aXNJbnRlZ3JhbChjb250ZXh0VHJhbnNmb3JtLmEpICYm
IFdURjo6aXNJbnRlZ3JhbChjb250ZXh0VHJhbnNmb3JtLmQpICYmIGNvbnRleHRUcmFuc2Zvcm0u
YiA9PSAwLmYgJiYgY29udGV4dFRyYW5zZm9ybS5jID09IDAuZjsKLSAgICBCT09MIGlzUm90YXRl
ZCA9ICgoY29udGV4dFRyYW5zZm9ybS5iIHx8IGNvbnRleHRUcmFuc2Zvcm0uYykgJiYgKGNvbnRl
eHRUcmFuc2Zvcm0uYSB8fCBjb250ZXh0VHJhbnNmb3JtLmQpKTsKLSAgICBCT09MIGRvU3VicGl4
ZWxRdWFudGl6YXRpb24gPSBpc1RyYW5zbGF0aW9uT3JJbnRlZ3JhbFNjYWxlIHx8ICghaXNSb3Rh
dGVkICYmIHNob3VsZFN1YnBpeGVsUXVhbnRpemUpOwotCi0gICAgQ0dDb250ZXh0U2V0U2hvdWxk
U3VicGl4ZWxQb3NpdGlvbkZvbnRzKGNnQ29udGV4dCwgcmVuZGVyaW5nTW9kZSAhPSBOU0ZvbnRB
bnRpYWxpYXNlZEludGVnZXJBZHZhbmNlbWVudHNSZW5kZXJpbmdNb2RlIHx8ICFpc1RyYW5zbGF0
aW9uT3JJbnRlZ3JhbFNjYWxlKTsKLSAgICBDR0NvbnRleHRTZXRTaG91bGRTdWJwaXhlbFF1YW50
aXplRm9udHMoY2dDb250ZXh0LCBkb1N1YnBpeGVsUXVhbnRpemF0aW9uKTsKLX0KLSNlbmRpZgot
Ci12b2lkIEZvbnRDYXNjYWRlOjpkcmF3R2x5cGhzKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwg
Y29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnQsIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZl
ciwgaW50IGZyb20sIGludCBudW1HbHlwaHMsIGNvbnN0IEZsb2F0UG9pbnQmIGFuY2hvclBvaW50
KSBjb25zdAotewotICAgIGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEmIHBsYXRmb3JtRGF0YSA9IGZv
bnQtPnBsYXRmb3JtRGF0YSgpOwotICAgIGlmICghcGxhdGZvcm1EYXRhLnNpemUoKSkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgQ0dDb250ZXh0UmVmIGNnQ29udGV4dCA9IGNvbnRleHQtPnBsYXRm
b3JtQ29udGV4dCgpOwotCi0gICAgYm9vbCBzaG91bGRTbW9vdGhGb250czsKLSAgICBib29sIGNo
YW5nZUZvbnRTbW9vdGhpbmc7Ci0gICAgCi0gICAgc3dpdGNoKGZvbnREZXNjcmlwdGlvbigpLmZv
bnRTbW9vdGhpbmcoKSkgewotICAgIGNhc2UgQW50aWFsaWFzZWQ6IHsKLSAgICAgICAgY29udGV4
dC0+c2V0U2hvdWxkQW50aWFsaWFzKHRydWUpOwotICAgICAgICBzaG91bGRTbW9vdGhGb250cyA9
IGZhbHNlOwotICAgICAgICBjaGFuZ2VGb250U21vb3RoaW5nID0gdHJ1ZTsKLSAgICAgICAgYnJl
YWs7Ci0gICAgfQotICAgIGNhc2UgU3VicGl4ZWxBbnRpYWxpYXNlZDogewotICAgICAgICBjb250
ZXh0LT5zZXRTaG91bGRBbnRpYWxpYXModHJ1ZSk7Ci0gICAgICAgIHNob3VsZFNtb290aEZvbnRz
ID0gdHJ1ZTsKLSAgICAgICAgY2hhbmdlRm9udFNtb290aGluZyA9IHRydWU7Ci0gICAgICAgIGJy
ZWFrOwotICAgIH0KLSAgICBjYXNlIE5vU21vb3RoaW5nOiB7Ci0gICAgICAgIGNvbnRleHQtPnNl
dFNob3VsZEFudGlhbGlhcyhmYWxzZSk7Ci0gICAgICAgIHNob3VsZFNtb290aEZvbnRzID0gZmFs
c2U7Ci0gICAgICAgIGNoYW5nZUZvbnRTbW9vdGhpbmcgPSB0cnVlOwotICAgICAgICBicmVhazsK
LSAgICB9Ci0gICAgY2FzZSBBdXRvU21vb3RoaW5nOiB7Ci0gICAgICAgIHNob3VsZFNtb290aEZv
bnRzID0gdHJ1ZTsKLSAgICAgICAgY2hhbmdlRm9udFNtb290aGluZyA9IGZhbHNlOwotICAgICAg
ICBicmVhazsKLSAgICB9Ci0gICAgfQotICAgIAotICAgIGlmICghc2hvdWxkVXNlU21vb3RoaW5n
KCkpIHsKLSAgICAgICAgc2hvdWxkU21vb3RoRm9udHMgPSBmYWxzZTsKLSAgICAgICAgY2hhbmdl
Rm9udFNtb290aGluZyA9IHRydWU7Ci0gICAgfQotCi0jaWYgIVBMQVRGT1JNKElPUykKLSAgICBi
b29sIG9yaWdpbmFsU2hvdWxkVXNlRm9udFNtb290aGluZyA9IGZhbHNlOwotICAgIGlmIChjaGFu
Z2VGb250U21vb3RoaW5nKSB7Ci0gICAgICAgIG9yaWdpbmFsU2hvdWxkVXNlRm9udFNtb290aGlu
ZyA9IENHQ29udGV4dEdldFNob3VsZFNtb290aEZvbnRzKGNnQ29udGV4dCk7Ci0gICAgICAgIENH
Q29udGV4dFNldFNob3VsZFNtb290aEZvbnRzKGNnQ29udGV4dCwgc2hvdWxkU21vb3RoRm9udHMp
OwotICAgIH0KLSNlbmRpZgotCi0jaWYgIVBMQVRGT1JNKElPUykKLSAgICBOU0ZvbnQqIGRyYXdG
b250OwotICAgIGlmICghaXNQcmludGVyRm9udCgpKSB7Ci0gICAgICAgIGRyYXdGb250ID0gW3Bs
YXRmb3JtRGF0YS5uc0ZvbnQoKSBzY3JlZW5Gb250XTsKLSAgICAgICAgaWYgKGRyYXdGb250ICE9
IHBsYXRmb3JtRGF0YS5uc0ZvbnQoKSkgewotICAgICAgICAgICAgLy8gV2UgYXJlIGdldHRpbmcg
dGhpcyBpbiB0b28gbWFueSBwbGFjZXMgKDM0MDY0MTEpOyB1c2UgRVJST1Igc28gaXQgb25seSBw
cmludHMgb24gZGVidWcgdmVyc2lvbnMgZm9yIG5vdy4gKFdlIHNob3VsZCBkZWJ1ZyB0aGlzIGFs
c28sIGV2ZW50dWFsbHkpLgotICAgICAgICAgICAgTE9HX0VSUk9SKCJBdHRlbXB0aW5nIHRvIHNl
dCBub24tc2NyZWVuIGZvbnQgKCVAKSB3aGVuIGRyYXdpbmcgdG8gc2NyZWVuLiAgVXNpbmcgc2Ny
ZWVuIGZvbnQgYW55d2F5LCBtYXkgcmVzdWx0IGluIGluY29ycmVjdCBtZXRyaWNzLiIsCi0gICAg
ICAgICAgICAgICAgW1tbcGxhdGZvcm1EYXRhLm5zRm9udCgpIGZvbnREZXNjcmlwdG9yXSBmb250
QXR0cmlidXRlc10gb2JqZWN0Rm9yS2V5Ok5TRm9udE5hbWVBdHRyaWJ1dGVdKTsKLSAgICAgICAg
fQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRyYXdGb250ID0gW3BsYXRmb3JtRGF0YS5uc0ZvbnQo
KSBwcmludGVyRm9udF07Ci0gICAgICAgIGlmIChkcmF3Rm9udCAhPSBwbGF0Zm9ybURhdGEubnNG
b250KCkpIHsKLSAgICAgICAgICAgIE5TTG9nKEAiQXR0ZW1wdGluZyB0byBzZXQgbm9uLXByaW50
ZXIgZm9udCAoJUApIHdoZW4gcHJpbnRpbmcuICBVc2luZyBwcmludGVyIGZvbnQgYW55d2F5LCBt
YXkgcmVzdWx0IGluIGluY29ycmVjdCBtZXRyaWNzLiIsCi0gICAgICAgICAgICAgICAgW1tbcGxh
dGZvcm1EYXRhLm5zRm9udCgpIGZvbnREZXNjcmlwdG9yXSBmb250QXR0cmlidXRlc10gb2JqZWN0
Rm9yS2V5Ok5TRm9udE5hbWVBdHRyaWJ1dGVdKTsKLSAgICAgICAgfQotICAgIH0KLSNlbmRpZgot
ICAgIAotICAgIENHQ29udGV4dFNldEZvbnQoY2dDb250ZXh0LCBwbGF0Zm9ybURhdGEuY2dGb250
KCkpOwotCi0gICAgYm9vbCB1c2VMZXR0ZXJwcmVzc0VmZmVjdCA9IHNob3VsZFVzZUxldHRlcnBy
ZXNzRWZmZWN0KCpjb250ZXh0KTsKLSAgICBGbG9hdFBvaW50IHBvaW50ID0gYW5jaG9yUG9pbnQ7
Ci0jaWYgUExBVEZPUk0oSU9TKQotICAgIGZsb2F0IGZvbnRTaXplID0gcGxhdGZvcm1EYXRhLnNp
emUoKTsKLSAgICBDR0FmZmluZVRyYW5zZm9ybSBtYXRyaXggPSB1c2VMZXR0ZXJwcmVzc0VmZmVj
dCB8fCBwbGF0Zm9ybURhdGEuaXNDb2xvckJpdG1hcEZvbnQoKSA/IENHQWZmaW5lVHJhbnNmb3Jt
SWRlbnRpdHkgOiBDR0FmZmluZVRyYW5zZm9ybU1ha2VTY2FsZShmb250U2l6ZSwgZm9udFNpemUp
OwotICAgIGlmIChwbGF0Zm9ybURhdGEubV9pc0Vtb2ppKSB7Ci0gICAgICAgIGlmICghY29udGV4
dC0+ZW1vamlEcmF3aW5nRW5hYmxlZCgpKQotICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAg
IC8vIE1pbWljIHRoZSBwb3NpdGlvaW5pbmcgb2Ygbm9uLWJpdG1hcCBnbHlwaHMsIHdoaWNoIGFy
ZSBub3Qgc3VicGl4ZWwtcG9zaXRpb25lZC4KLSAgICAgICAgcG9pbnQuc2V0WShjZWlsZihwb2lu
dC55KCkpKTsKLQotICAgICAgICAvLyBFbW9qaSBnbHlwaHMgc25hcCB0byB0aGUgQ1NTIHBpeGVs
IGdyaWQuCi0gICAgICAgIHBvaW50LnNldFgoZmxvb3JmKHBvaW50LngoKSkpOwotCi0gICAgICAg
IC8vIEVtb2ppIGdseXBocyBhcmUgb2Zmc2V0IG9uZSBDU1MgcGl4ZWwgdG8gdGhlIHJpZ2h0Lgot
ICAgICAgICBwb2ludC5tb3ZlKDEsIDApOwotCi0gICAgICAgIC8vIEVtb2ppIGdseXBocyBhcmUg
b2Zmc2V0IHZlcnRpY2FsbHkgYmFzZWQgb24gZm9udCBzaXplLgotICAgICAgICBmbG9hdCB5ID0g
cG9pbnQueSgpOwotICAgICAgICBpZiAoZm9udFNpemUgPD0gMTUpIHsKLSAgICAgICAgICAgIC8v
IFVuZG8gQ29yZSBUZXh0J3MgeSBhZGp1c3RtZW50LgotICAgICAgICAgICAgc3RhdGljIGZsb2F0
IHlBZGp1c3RtZW50RmFjdG9yID0gaW9zRXhlY3V0YWJsZVdhc0xpbmtlZE9uT3JBZnRlclZlcnNp
b24od2tJT1NTeXN0ZW1WZXJzaW9uXzZfMCkgPyAuMTkgOiAuMTsKLSAgICAgICAgICAgIHBvaW50
LnNldFkoZmxvb3JmKHkgLSB5QWRqdXN0bWVudEZhY3RvciAqIChmb250U2l6ZSArIDIpICsgMikp
OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGZvbnRTaXplIDwgMjYpCi0gICAg
ICAgICAgICAgICAgeSAtPSAuMzVmICogZm9udFNpemUgLSAxMDsKLQotICAgICAgICAgICAgLy8g
VW5kbyBDb3JlIFRleHQncyB5IGFkanVzdG1lbnQuCi0gICAgICAgICAgICBzdGF0aWMgZmxvYXQg
eUFkanVzdG1lbnQgPSBpb3NFeGVjdXRhYmxlV2FzTGlua2VkT25PckFmdGVyVmVyc2lvbih3a0lP
U1N5c3RlbVZlcnNpb25fNl8wKSA/IDMuOCA6IDI7Ci0gICAgICAgICAgICBwb2ludC5zZXRZKGZs
b29yZih5IC0geUFkanVzdG1lbnQpKTsKLSAgICAgICAgfQotICAgIH0KLSNlbHNlCi0gICAgQ0dB
ZmZpbmVUcmFuc2Zvcm0gbWF0cml4ID0gQ0dBZmZpbmVUcmFuc2Zvcm1JZGVudGl0eTsKLSAgICBp
ZiAoZHJhd0ZvbnQgJiYgIXBsYXRmb3JtRGF0YS5pc0NvbG9yQml0bWFwRm9udCgpKQotICAgICAg
ICBtZW1jcHkoJm1hdHJpeCwgW2RyYXdGb250IG1hdHJpeF0sIHNpemVvZihtYXRyaXgpKTsKLSNl
bmRpZgotICAgIG1hdHJpeC5iID0gLW1hdHJpeC5iOwotICAgIG1hdHJpeC5kID0gLW1hdHJpeC5k
OwotICAgIGlmIChwbGF0Zm9ybURhdGEubV9zeW50aGV0aWNPYmxpcXVlKSB7Ci0gICAgICAgIHN0
YXRpYyBmbG9hdCBvYmxpcXVlU2tldyA9IHRhbmYoU1lOVEhFVElDX09CTElRVUVfQU5HTEUgKiBw
aUZsb2F0IC8gMTgwKTsKLSAgICAgICAgaWYgKHBsYXRmb3JtRGF0YS5vcmllbnRhdGlvbigpID09
IFZlcnRpY2FsKQotICAgICAgICAgICAgbWF0cml4ID0gQ0dBZmZpbmVUcmFuc2Zvcm1Db25jYXQo
bWF0cml4LCBDR0FmZmluZVRyYW5zZm9ybU1ha2UoMSwgb2JsaXF1ZVNrZXcsIDAsIDEsIDAsIDAp
KTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbWF0cml4ID0gQ0dBZmZpbmVUcmFuc2Zvcm1D
b25jYXQobWF0cml4LCBDR0FmZmluZVRyYW5zZm9ybU1ha2UoMSwgMCwgLW9ibGlxdWVTa2V3LCAx
LCAwLCAwKSk7Ci0gICAgfQotICAgIENHQ29udGV4dFNldFRleHRNYXRyaXgoY2dDb250ZXh0LCBt
YXRyaXgpOwotCi0jaWYgUExBVEZPUk0oSU9TKQotICAgIENHQ29udGV4dFNldEZvbnRTaXplKGNn
Q29udGV4dCwgMSk7Ci0gICAgQ0dDb250ZXh0U2V0U2hvdWxkU3VicGl4ZWxRdWFudGl6ZUZvbnRz
KGNnQ29udGV4dCwgY29udGV4dC0+c2hvdWxkU3VicGl4ZWxRdWFudGl6ZUZvbnRzKCkpOwotI2Vs
c2UKLSAgICBzZXRDR0ZvbnRSZW5kZXJpbmdNb2RlKGNnQ29udGV4dCwgW2RyYXdGb250IHJlbmRl
cmluZ01vZGVdLCBjb250ZXh0LT5zaG91bGRTdWJwaXhlbFF1YW50aXplRm9udHMoKSk7Ci0gICAg
aWYgKGRyYXdGb250KQotICAgICAgICBDR0NvbnRleHRTZXRGb250U2l6ZShjZ0NvbnRleHQsIDEp
OwotICAgIGVsc2UKLSAgICAgICAgQ0dDb250ZXh0U2V0Rm9udFNpemUoY2dDb250ZXh0LCBwbGF0
Zm9ybURhdGEubV9zaXplKTsKLSNlbmRpZgotCi0KLSAgICBGbG9hdFNpemUgc2hhZG93T2Zmc2V0
OwotICAgIGZsb2F0IHNoYWRvd0JsdXI7Ci0gICAgQ29sb3Igc2hhZG93Q29sb3I7Ci0gICAgQ29s
b3JTcGFjZSBzaGFkb3dDb2xvclNwYWNlOwotICAgIENvbG9yU3BhY2UgZmlsbENvbG9yU3BhY2Ug
PSBjb250ZXh0LT5maWxsQ29sb3JTcGFjZSgpOwotICAgIGNvbnRleHQtPmdldFNoYWRvdyhzaGFk
b3dPZmZzZXQsIHNoYWRvd0JsdXIsIHNoYWRvd0NvbG9yLCBzaGFkb3dDb2xvclNwYWNlKTsKLQot
ICAgIEFmZmluZVRyYW5zZm9ybSBjb250ZXh0Q1RNID0gY29udGV4dC0+Z2V0Q1RNKCk7Ci0gICAg
ZmxvYXQgc3ludGhldGljQm9sZE9mZnNldCA9IGZvbnQtPnN5bnRoZXRpY0JvbGRPZmZzZXQoKTsK
LSAgICBpZiAoc3ludGhldGljQm9sZE9mZnNldCAmJiAhY29udGV4dENUTS5pc0lkZW50aXR5T3JU
cmFuc2xhdGlvbk9yRmxpcHBlZCgpKSB7Ci0gICAgICAgIEZsb2F0U2l6ZSBob3Jpem9udGFsVW5p
dFNpemVJbkRldmljZVBpeGVscyA9IGNvbnRleHRDVE0ubWFwU2l6ZShGbG9hdFNpemUoMSwgMCkp
OwotICAgICAgICBmbG9hdCBob3Jpem9udGFsVW5pdExlbmd0aEluRGV2aWNlUGl4ZWxzID0gc3Fy
dGYoaG9yaXpvbnRhbFVuaXRTaXplSW5EZXZpY2VQaXhlbHMud2lkdGgoKSAqIGhvcml6b250YWxV
bml0U2l6ZUluRGV2aWNlUGl4ZWxzLndpZHRoKCkgKyBob3Jpem9udGFsVW5pdFNpemVJbkRldmlj
ZVBpeGVscy5oZWlnaHQoKSAqIGhvcml6b250YWxVbml0U2l6ZUluRGV2aWNlUGl4ZWxzLmhlaWdo
dCgpKTsKLSAgICAgICAgaWYgKGhvcml6b250YWxVbml0TGVuZ3RoSW5EZXZpY2VQaXhlbHMpCi0g
ICAgICAgICAgICBzeW50aGV0aWNCb2xkT2Zmc2V0IC89IGhvcml6b250YWxVbml0TGVuZ3RoSW5E
ZXZpY2VQaXhlbHM7Ci0gICAgfTsKLQotICAgIGJvb2wgaGFzU2ltcGxlU2hhZG93ID0gY29udGV4
dC0+dGV4dERyYXdpbmdNb2RlKCkgPT0gVGV4dE1vZGVGaWxsICYmIHNoYWRvd0NvbG9yLmlzVmFs
aWQoKSAmJiAhc2hhZG93Qmx1ciAmJiAhcGxhdGZvcm1EYXRhLmlzQ29sb3JCaXRtYXBGb250KCkg
JiYgKCFjb250ZXh0LT5zaGFkb3dzSWdub3JlVHJhbnNmb3JtcygpIHx8IGNvbnRleHRDVE0uaXNJ
ZGVudGl0eU9yVHJhbnNsYXRpb25PckZsaXBwZWQoKSkgJiYgIWNvbnRleHQtPmlzSW5UcmFuc3Bh
cmVuY3lMYXllcigpOwotICAgIGlmIChoYXNTaW1wbGVTaGFkb3cpIHsKLSAgICAgICAgLy8gUGFp
bnQgc2ltcGxlIHNoYWRvd3Mgb3Vyc2VsdmVzIGluc3RlYWQgb2YgcmVseWluZyBvbiBDRyBzaGFk
b3dzLCB0byBhdm9pZCBsb3Npbmcgc3VicGl4ZWwgYW50aWFsaWFzaW5nLgotICAgICAgICBjb250
ZXh0LT5jbGVhclNoYWRvdygpOwotICAgICAgICBDb2xvciBmaWxsQ29sb3IgPSBjb250ZXh0LT5m
aWxsQ29sb3IoKTsKLSAgICAgICAgQ29sb3Igc2hhZG93RmlsbENvbG9yKHNoYWRvd0NvbG9yLnJl
ZCgpLCBzaGFkb3dDb2xvci5ncmVlbigpLCBzaGFkb3dDb2xvci5ibHVlKCksIHNoYWRvd0NvbG9y
LmFscGhhKCkgKiBmaWxsQ29sb3IuYWxwaGEoKSAvIDI1NSk7Ci0gICAgICAgIGNvbnRleHQtPnNl
dEZpbGxDb2xvcihzaGFkb3dGaWxsQ29sb3IsIHNoYWRvd0NvbG9yU3BhY2UpOwotICAgICAgICBm
bG9hdCBzaGFkb3dUZXh0WCA9IHBvaW50LngoKSArIHNoYWRvd09mZnNldC53aWR0aCgpOwotICAg
ICAgICAvLyBJZiBzaGFkb3dzIGFyZSBpZ25vcmluZyB0cmFuc2Zvcm1zLCB0aGVuIHdlIGhhdmVu
J3QgYXBwbGllZCB0aGUgWSBjb29yZGluYXRlIGZsaXAgeWV0LCBzbyBkb3duIGlzIG5lZ2F0aXZl
LgotICAgICAgICBmbG9hdCBzaGFkb3dUZXh0WSA9IHBvaW50LnkoKSArIHNoYWRvd09mZnNldC5o
ZWlnaHQoKSAqIChjb250ZXh0LT5zaGFkb3dzSWdub3JlVHJhbnNmb3JtcygpID8gLTEgOiAxKTsK
LSAgICAgICAgc2hvd0dseXBoc1dpdGhBZHZhbmNlcyhGbG9hdFBvaW50KHNoYWRvd1RleHRYLCBz
aGFkb3dUZXh0WSksIGZvbnQsIGNnQ29udGV4dCwgZ2x5cGhCdWZmZXIuZ2x5cGhzKGZyb20pLCBz
dGF0aWNfY2FzdDxjb25zdCBDR1NpemUqPihnbHlwaEJ1ZmZlci5hZHZhbmNlcyhmcm9tKSksIG51
bUdseXBocyk7Ci0jaWYgIVBMQVRGT1JNKElPUykKLSAgICAgICAgaWYgKHN5bnRoZXRpY0JvbGRP
ZmZzZXQpCi0jZWxzZQotICAgICAgICBpZiAoc3ludGhldGljQm9sZE9mZnNldCAmJiAhcGxhdGZv
cm1EYXRhLm1faXNFbW9qaSkKLSNlbmRpZgotICAgICAgICAgICAgc2hvd0dseXBoc1dpdGhBZHZh
bmNlcyhGbG9hdFBvaW50KHNoYWRvd1RleHRYICsgc3ludGhldGljQm9sZE9mZnNldCwgc2hhZG93
VGV4dFkpLCBmb250LCBjZ0NvbnRleHQsIGdseXBoQnVmZmVyLmdseXBocyhmcm9tKSwgc3RhdGlj
X2Nhc3Q8Y29uc3QgQ0dTaXplKj4oZ2x5cGhCdWZmZXIuYWR2YW5jZXMoZnJvbSkpLCBudW1HbHlw
aHMpOwotICAgICAgICBjb250ZXh0LT5zZXRGaWxsQ29sb3IoZmlsbENvbG9yLCBmaWxsQ29sb3JT
cGFjZSk7Ci0gICAgfQotCi0gICAgaWYgKHVzZUxldHRlcnByZXNzRWZmZWN0KQotICAgICAgICBz
aG93TGV0dGVycHJlc3NlZEdseXBoc1dpdGhBZHZhbmNlcyhwb2ludCwgZm9udCwgY2dDb250ZXh0
LCBnbHlwaEJ1ZmZlci5nbHlwaHMoZnJvbSksIHN0YXRpY19jYXN0PGNvbnN0IENHU2l6ZSo+KGds
eXBoQnVmZmVyLmFkdmFuY2VzKGZyb20pKSwgbnVtR2x5cGhzKTsKLSAgICBlbHNlCi0gICAgICAg
IHNob3dHbHlwaHNXaXRoQWR2YW5jZXMocG9pbnQsIGZvbnQsIGNnQ29udGV4dCwgZ2x5cGhCdWZm
ZXIuZ2x5cGhzKGZyb20pLCBzdGF0aWNfY2FzdDxjb25zdCBDR1NpemUqPihnbHlwaEJ1ZmZlci5h
ZHZhbmNlcyhmcm9tKSksIG51bUdseXBocyk7Ci0jaWYgIVBMQVRGT1JNKElPUykKLSAgICBpZiAo
c3ludGhldGljQm9sZE9mZnNldCkKLSNlbHNlCi0gICAgaWYgKHN5bnRoZXRpY0JvbGRPZmZzZXQg
JiYgIXBsYXRmb3JtRGF0YS5tX2lzRW1vamkpCi0jZW5kaWYKLSAgICAgICAgc2hvd0dseXBoc1dp
dGhBZHZhbmNlcyhGbG9hdFBvaW50KHBvaW50LngoKSArIHN5bnRoZXRpY0JvbGRPZmZzZXQsIHBv
aW50LnkoKSksIGZvbnQsIGNnQ29udGV4dCwgZ2x5cGhCdWZmZXIuZ2x5cGhzKGZyb20pLCBzdGF0
aWNfY2FzdDxjb25zdCBDR1NpemUqPihnbHlwaEJ1ZmZlci5hZHZhbmNlcyhmcm9tKSksIG51bUds
eXBocyk7Ci0KLSAgICBpZiAoaGFzU2ltcGxlU2hhZG93KQotICAgICAgICBjb250ZXh0LT5zZXRT
aGFkb3coc2hhZG93T2Zmc2V0LCBzaGFkb3dCbHVyLCBzaGFkb3dDb2xvciwgc2hhZG93Q29sb3JT
cGFjZSk7Ci0KLSNpZiAhUExBVEZPUk0oSU9TKQotICAgIGlmIChjaGFuZ2VGb250U21vb3RoaW5n
KQotICAgICAgICBDR0NvbnRleHRTZXRTaG91bGRTbW9vdGhGb250cyhjZ0NvbnRleHQsIG9yaWdp
bmFsU2hvdWxkVXNlRm9udFNtb290aGluZyk7Ci0jZW5kaWYKLX0KLQotI2lmIEVOQUJMRShDU1Mz
X1RFWFRfREVDT1JBVElPTl9TS0lQX0lOSykKLXN0cnVjdCBHbHlwaEl0ZXJhdGlvblN0YXRlIHsK
LSAgICBHbHlwaEl0ZXJhdGlvblN0YXRlKENHUG9pbnQgc3RhcnRpbmdQb2ludCwgQ0dQb2ludCBj
dXJyZW50UG9pbnQsIENHRmxvYXQgeTEsIENHRmxvYXQgeTIsIENHRmxvYXQgbWluWCwgQ0dGbG9h
dCBtYXhYKQotICAgICAgICA6IHN0YXJ0aW5nUG9pbnQoc3RhcnRpbmdQb2ludCkKLSAgICAgICAg
LCBjdXJyZW50UG9pbnQoY3VycmVudFBvaW50KQotICAgICAgICAsIHkxKHkxKQotICAgICAgICAs
IHkyKHkyKQotICAgICAgICAsIG1pblgobWluWCkKLSAgICAgICAgLCBtYXhYKG1heFgpCi0gICAg
ewotICAgIH0KLSAgICBDR1BvaW50IHN0YXJ0aW5nUG9pbnQ7Ci0gICAgQ0dQb2ludCBjdXJyZW50
UG9pbnQ7Ci0gICAgQ0dGbG9hdCB5MTsKLSAgICBDR0Zsb2F0IHkyOwotICAgIENHRmxvYXQgbWlu
WDsKLSAgICBDR0Zsb2F0IG1heFg7Ci19OwotCi1zdGF0aWMgYm9vbCBmaW5kSW50ZXJzZWN0aW9u
UG9pbnQoZmxvYXQgeSwgQ0dQb2ludCBwMSwgQ0dQb2ludCBwMiwgQ0dGbG9hdCYgeCkKLXsKLSAg
ICB4ID0gcDEueCArICh5IC0gcDEueSkgKiAocDIueCAtIHAxLngpIC8gKHAyLnkgLSBwMS55KTsK
LSAgICByZXR1cm4gKHAxLnkgPCB5ICYmIHAyLnkgPiB5KSB8fCAocDEueSA+IHkgJiYgcDIueSA8
IHkpOwotfQotCi1zdGF0aWMgdm9pZCB1cGRhdGVYKEdseXBoSXRlcmF0aW9uU3RhdGUmIHN0YXRl
LCBDR0Zsb2F0IHgpCi17Ci0gICAgc3RhdGUubWluWCA9IHN0ZDo6bWluKHN0YXRlLm1pblgsIHgp
OwotICAgIHN0YXRlLm1heFggPSBzdGQ6Om1heChzdGF0ZS5tYXhYLCB4KTsKLX0KLQotLy8gVGhp
cyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgQ0dQYXRoQXBwbHkgYW5kIGlzIHRoZXJlZm9yZSBpbnZv
a2VkIGZvciBlYWNoCi0vLyBjb250b3VyIGluIGEgZ2x5cGguIFRoaXMgZnVuY3Rpb24gbW9kZWxz
IGVhY2ggY29udG91cnMgYXMgYSBzdHJhaWdodCBsaW5lCi0vLyBhbmQgY2FsY3VsYXRlcyB0aGUg
aW50ZXJzZWN0aW9ucyBiZXR3ZWVuIGVhY2ggcHNldWRvLWNvbnRvdXIgYW5kCi0vLyB0d28gaG9y
aXpvbnRhbCBsaW5lcyAodGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgb2YgYW4gdW5kZXJsaW5l
KSBmb3VuZCBpbgotLy8gR2x5cGhJdGVyYXRpb25TdGF0ZTo6eTEgYW5kIEdseXBoSXRlcmF0aW9u
U3RhdGU6OnkyLiBJdCBrZWVwcyB0cmFjayBvZiB0aGUKLS8vIGxlZnRtb3N0IGFuZCByaWdodG1v
c3QgaW50ZXJzZWN0aW9uIGluIEdseXBoSXRlcmF0aW9uU3RhdGU6Om1pblggYW5kCi0vLyBHbHlw
aEl0ZXJhdGlvblN0YXRlOjptYXhYLgotc3RhdGljIHZvaWQgZmluZFBhdGhJbnRlcnNlY3Rpb25z
KHZvaWQqIHN0YXRlQXNWb2lkUG9pbnRlciwgY29uc3QgQ0dQYXRoRWxlbWVudCogZSkKLXsKLSAg
ICBhdXRvJiBzdGF0ZSA9ICpzdGF0aWNfY2FzdDxHbHlwaEl0ZXJhdGlvblN0YXRlKj4oc3RhdGVB
c1ZvaWRQb2ludGVyKTsKLSAgICBib29sIGRvSW50ZXJzZWN0aW9uID0gZmFsc2U7Ci0gICAgQ0dQ
b2ludCBwb2ludCA9IENHUG9pbnRaZXJvOwotICAgIHN3aXRjaCAoZS0+dHlwZSkgewotICAgIGNh
c2Uga0NHUGF0aEVsZW1lbnRNb3ZlVG9Qb2ludDoKLSAgICAgICAgc3RhdGUuc3RhcnRpbmdQb2lu
dCA9IGUtPnBvaW50c1swXTsKLSAgICAgICAgc3RhdGUuY3VycmVudFBvaW50ID0gZS0+cG9pbnRz
WzBdOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGtDR1BhdGhFbGVtZW50QWRkTGluZVRvUG9p
bnQ6Ci0gICAgICAgIGRvSW50ZXJzZWN0aW9uID0gdHJ1ZTsKLSAgICAgICAgcG9pbnQgPSBlLT5w
b2ludHNbMF07Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2Uga0NHUGF0aEVsZW1lbnRBZGRRdWFk
Q3VydmVUb1BvaW50OgotICAgICAgICBkb0ludGVyc2VjdGlvbiA9IHRydWU7Ci0gICAgICAgIHBv
aW50ID0gZS0+cG9pbnRzWzFdOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGtDR1BhdGhFbGVt
ZW50QWRkQ3VydmVUb1BvaW50OgotICAgICAgICBkb0ludGVyc2VjdGlvbiA9IHRydWU7Ci0gICAg
ICAgIHBvaW50ID0gZS0+cG9pbnRzWzJdOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIGtDR1Bh
dGhFbGVtZW50Q2xvc2VTdWJwYXRoOgotICAgICAgICBkb0ludGVyc2VjdGlvbiA9IHRydWU7Ci0g
ICAgICAgIHBvaW50ID0gc3RhdGUuc3RhcnRpbmdQb2ludDsKLSAgICAgICAgYnJlYWs7Ci0gICAg
fQotICAgIGlmICghZG9JbnRlcnNlY3Rpb24pCi0gICAgICAgIHJldHVybjsKLSAgICBDR0Zsb2F0
IHg7Ci0gICAgaWYgKGZpbmRJbnRlcnNlY3Rpb25Qb2ludChzdGF0ZS55MSwgc3RhdGUuY3VycmVu
dFBvaW50LCBwb2ludCwgeCkpCi0gICAgICAgIHVwZGF0ZVgoc3RhdGUsIHgpOwotICAgIGlmIChm
aW5kSW50ZXJzZWN0aW9uUG9pbnQoc3RhdGUueTIsIHN0YXRlLmN1cnJlbnRQb2ludCwgcG9pbnQs
IHgpKQotICAgICAgICB1cGRhdGVYKHN0YXRlLCB4KTsKLSAgICBpZiAoKHN0YXRlLmN1cnJlbnRQ
b2ludC55ID49IHN0YXRlLnkxICYmIHN0YXRlLmN1cnJlbnRQb2ludC55IDw9IHN0YXRlLnkyKQot
ICAgICAgICB8fCAoc3RhdGUuY3VycmVudFBvaW50LnkgPD0gc3RhdGUueTEgJiYgc3RhdGUuY3Vy
cmVudFBvaW50LnkgPj0gc3RhdGUueTIpKQotICAgICAgICB1cGRhdGVYKHN0YXRlLCBzdGF0ZS5j
dXJyZW50UG9pbnQueCk7Ci0gICAgc3RhdGUuY3VycmVudFBvaW50ID0gcG9pbnQ7Ci19Ci0KLWNs
YXNzIE1hY0dseXBoVG9QYXRoVHJhbnNsYXRvciBmaW5hbCA6IHB1YmxpYyBHbHlwaFRvUGF0aFRy
YW5zbGF0b3IgewotcHVibGljOgotICAgIE1hY0dseXBoVG9QYXRoVHJhbnNsYXRvcihjb25zdCBU
ZXh0UnVuJiB0ZXh0UnVuLCBjb25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsIGNvbnN0IEZs
b2F0UG9pbnQmIHRleHRPcmlnaW4pCi0gICAgICAgIDogbV9pbmRleCgwKQotICAgICAgICAsIG1f
dGV4dFJ1bih0ZXh0UnVuKQotICAgICAgICAsIG1fZ2x5cGhCdWZmZXIoZ2x5cGhCdWZmZXIpCi0g
ICAgICAgICwgbV9mb250RGF0YShnbHlwaEJ1ZmZlci5mb250RGF0YUF0KG1faW5kZXgpKQotICAg
ICAgICAsIG1fdHJhbnNsYXRpb24oQ0dBZmZpbmVUcmFuc2Zvcm1TY2FsZShDR0FmZmluZVRyYW5z
Zm9ybU1ha2VUcmFuc2xhdGlvbih0ZXh0T3JpZ2luLngoKSwgdGV4dE9yaWdpbi55KCkpLCAxLCAt
MSkpCi0gICAgewotICAgICAgICBtb3ZlVG9OZXh0VmFsaWRHbHlwaCgpOwotICAgIH0KLXByaXZh
dGU6Ci0gICAgdmlydHVhbCBib29sIGNvbnRhaW5zTW9yZVBhdGhzKCkgb3ZlcnJpZGUKLSAgICB7
Ci0gICAgICAgIHJldHVybiBtX2luZGV4ICE9IG1fZ2x5cGhCdWZmZXIuc2l6ZSgpOwotICAgIH0K
LSAgICB2aXJ0dWFsIFBhdGggcGF0aCgpIG92ZXJyaWRlOwotICAgIHZpcnR1YWwgc3RkOjpwYWly
PGZsb2F0LCBmbG9hdD4gZXh0ZW50cygpIG92ZXJyaWRlOwotICAgIHZpcnR1YWwgR2x5cGhVbmRl
cmxpbmVUeXBlIHVuZGVybGluZVR5cGUoKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIHZvaWQgYWR2
YW5jZSgpIG92ZXJyaWRlOwotICAgIHZvaWQgbW92ZVRvTmV4dFZhbGlkR2x5cGgoKTsKLQotICAg
IGludCBtX2luZGV4OwotICAgIGNvbnN0IFRleHRSdW4mIG1fdGV4dFJ1bjsKLSAgICBjb25zdCBH
bHlwaEJ1ZmZlciYgbV9nbHlwaEJ1ZmZlcjsKLSAgICBjb25zdCBTaW1wbGVGb250RGF0YSogbV9m
b250RGF0YTsKLSAgICBDR0FmZmluZVRyYW5zZm9ybSBtX3RyYW5zbGF0aW9uOwotfTsKLQotUGF0
aCBNYWNHbHlwaFRvUGF0aFRyYW5zbGF0b3I6OnBhdGgoKQotewotICAgIFJldGFpblB0cjxDR1Bh
dGhSZWY+IHJlc3VsdCA9IGFkb3B0Q0YoQ1RGb250Q3JlYXRlUGF0aEZvckdseXBoKG1fZm9udERh
dGEtPnBsYXRmb3JtRGF0YSgpLmN0Rm9udCgpLCBtX2dseXBoQnVmZmVyLmdseXBoQXQobV9pbmRl
eCksICZtX3RyYW5zbGF0aW9uKSk7Ci0gICAgcmV0dXJuIGFkb3B0Q0YoQ0dQYXRoQ3JlYXRlTXV0
YWJsZUNvcHkocmVzdWx0LmdldCgpKSk7Ci19Ci0KLXN0ZDo6cGFpcjxmbG9hdCwgZmxvYXQ+IE1h
Y0dseXBoVG9QYXRoVHJhbnNsYXRvcjo6ZXh0ZW50cygpCi17Ci0gICAgQ0dQb2ludCBiZWdpbm5p
bmcgPSBDR1BvaW50QXBwbHlBZmZpbmVUcmFuc2Zvcm0oQ0dQb2ludE1ha2UoMCwgMCksIG1fdHJh
bnNsYXRpb24pOwotICAgIENHU2l6ZSBlbmQgPSBDR1NpemVBcHBseUFmZmluZVRyYW5zZm9ybSht
X2dseXBoQnVmZmVyLmFkdmFuY2VBdChtX2luZGV4KSwgbV90cmFuc2xhdGlvbik7Ci0gICAgcmV0
dXJuIHN0ZDo6bWFrZV9wYWlyKHN0YXRpY19jYXN0PGZsb2F0PihiZWdpbm5pbmcueCksIHN0YXRp
Y19jYXN0PGZsb2F0PihiZWdpbm5pbmcueCArIGVuZC53aWR0aCkpOwotfQotCi1hdXRvIE1hY0ds
eXBoVG9QYXRoVHJhbnNsYXRvcjo6dW5kZXJsaW5lVHlwZSgpIC0+IEdseXBoVW5kZXJsaW5lVHlw
ZQotewotICAgIHJldHVybiBjb21wdXRlVW5kZXJsaW5lVHlwZShtX3RleHRSdW4sIG1fZ2x5cGhC
dWZmZXIsIG1faW5kZXgpOwotfQotCi12b2lkIE1hY0dseXBoVG9QYXRoVHJhbnNsYXRvcjo6bW92
ZVRvTmV4dFZhbGlkR2x5cGgoKQotewotICAgIGlmICghbV9mb250RGF0YS0+aXNTVkdGb250KCkp
Ci0gICAgICAgIHJldHVybjsKLSAgICBhZHZhbmNlKCk7Ci19Ci0KLXZvaWQgTWFjR2x5cGhUb1Bh
dGhUcmFuc2xhdG9yOjphZHZhbmNlKCkKLXsKLSAgICBkbyB7Ci0gICAgICAgIEdseXBoQnVmZmVy
QWR2YW5jZSBhZHZhbmNlID0gbV9nbHlwaEJ1ZmZlci5hZHZhbmNlQXQobV9pbmRleCk7Ci0gICAg
ICAgIG1fdHJhbnNsYXRpb24gPSBDR0FmZmluZVRyYW5zZm9ybVRyYW5zbGF0ZShtX3RyYW5zbGF0
aW9uLCBhZHZhbmNlLndpZHRoKCksIGFkdmFuY2UuaGVpZ2h0KCkpOwotICAgICAgICArK21faW5k
ZXg7Ci0gICAgICAgIGlmIChtX2luZGV4ID49IG1fZ2x5cGhCdWZmZXIuc2l6ZSgpKQotICAgICAg
ICAgICAgYnJlYWs7Ci0gICAgICAgIG1fZm9udERhdGEgPSBtX2dseXBoQnVmZmVyLmZvbnREYXRh
QXQobV9pbmRleCk7Ci0gICAgfSB3aGlsZSAobV9mb250RGF0YS0+aXNTVkdGb250KCkgJiYgbV9p
bmRleCA8IG1fZ2x5cGhCdWZmZXIuc2l6ZSgpKTsKLX0KLQotRGFzaEFycmF5IEZvbnRDYXNjYWRl
OjpkYXNoZXNGb3JJbnRlcnNlY3Rpb25zV2l0aFJlY3QoY29uc3QgVGV4dFJ1biYgcnVuLCBjb25z
dCBGbG9hdFBvaW50JiB0ZXh0T3JpZ2luLCBjb25zdCBGbG9hdFJlY3QmIGxpbmVFeHRlbnRzKSBj
b25zdAotewotICAgIGlmIChpc0xvYWRpbmdDdXN0b21Gb250cygpKQotICAgICAgICByZXR1cm4g
RGFzaEFycmF5KCk7Ci0KLSAgICBHbHlwaEJ1ZmZlciBnbHlwaEJ1ZmZlcjsKLSAgICBnbHlwaEJ1
ZmZlci5zYXZlT2Zmc2V0c0luU3RyaW5nKCk7Ci0gICAgZmxvYXQgZGVsdGFYOwotICAgIGlmIChj
b2RlUGF0aChydW4pICE9IEZvbnRDYXNjYWRlOjpDb21wbGV4KQotICAgICAgICBkZWx0YVggPSBn
ZXRHbHlwaHNBbmRBZHZhbmNlc0ZvclNpbXBsZVRleHQocnVuLCAwLCBydW4ubGVuZ3RoKCksIGds
eXBoQnVmZmVyKTsKLSAgICBlbHNlCi0gICAgICAgIGRlbHRhWCA9IGdldEdseXBoc0FuZEFkdmFu
Y2VzRm9yQ29tcGxleFRleHQocnVuLCAwLCBydW4ubGVuZ3RoKCksIGdseXBoQnVmZmVyKTsKLQot
ICAgIGlmICghZ2x5cGhCdWZmZXIuc2l6ZSgpKQotICAgICAgICByZXR1cm4gRGFzaEFycmF5KCk7
Ci0gICAgCi0gICAgLy8gRklYTUU6IEhhbmRsZSBTVkcgKyBub24tU1ZHIGludGVybGVhdmVkIHJ1
bnMuIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzM3NzgKLSAgICBj
b25zdCBTaW1wbGVGb250RGF0YSogZm9udERhdGEgPSBnbHlwaEJ1ZmZlci5mb250RGF0YUF0KDAp
OwotICAgIHN0ZDo6dW5pcXVlX3B0cjxHbHlwaFRvUGF0aFRyYW5zbGF0b3I+IHRyYW5zbGF0b3I7
Ci0gICAgYm9vbCBpc1NWRyA9IGZhbHNlOwotICAgIEZsb2F0UG9pbnQgb3JpZ2luID0gRmxvYXRQ
b2ludCh0ZXh0T3JpZ2luLngoKSArIGRlbHRhWCwgdGV4dE9yaWdpbi55KCkpOwotICAgIGlmICgh
Zm9udERhdGEtPmlzU1ZHRm9udCgpKQotICAgICAgICB0cmFuc2xhdG9yID0gc3RkOjptYWtlX3Vu
aXF1ZTxNYWNHbHlwaFRvUGF0aFRyYW5zbGF0b3I+KHJ1biwgZ2x5cGhCdWZmZXIsIG9yaWdpbik7
Ci0gICAgZWxzZSB7Ci0gICAgICAgIFRleHRSdW46OlJlbmRlcmluZ0NvbnRleHQqIHJlbmRlcmlu
Z0NvbnRleHQgPSBydW4ucmVuZGVyaW5nQ29udGV4dCgpOwotICAgICAgICBpZiAoIXJlbmRlcmlu
Z0NvbnRleHQpCi0gICAgICAgICAgICByZXR1cm4gRGFzaEFycmF5KCk7Ci0gICAgICAgIHRyYW5z
bGF0b3IgPSByZW5kZXJpbmdDb250ZXh0LT5jcmVhdGVHbHlwaFRvUGF0aFRyYW5zbGF0b3IoKmZv
bnREYXRhLCAmcnVuLCBnbHlwaEJ1ZmZlciwgMCwgZ2x5cGhCdWZmZXIuc2l6ZSgpLCBvcmlnaW4p
OwotICAgICAgICBpc1NWRyA9IHRydWU7Ci0gICAgfQotICAgIERhc2hBcnJheSByZXN1bHQ7Ci0g
ICAgZm9yIChpbnQgaW5kZXggPSAwOyB0cmFuc2xhdG9yLT5jb250YWluc01vcmVQYXRocygpOyAr
K2luZGV4LCB0cmFuc2xhdG9yLT5hZHZhbmNlKCkpIHsKLSAgICAgICAgR2x5cGhJdGVyYXRpb25T
dGF0ZSBpbmZvID0gR2x5cGhJdGVyYXRpb25TdGF0ZShDR1BvaW50TWFrZSgwLCAwKSwgQ0dQb2lu
dE1ha2UoMCwgMCksIGxpbmVFeHRlbnRzLnkoKSwgbGluZUV4dGVudHMueSgpICsgbGluZUV4dGVu
dHMuaGVpZ2h0KCksIGxpbmVFeHRlbnRzLngoKSArIGxpbmVFeHRlbnRzLndpZHRoKCksIGxpbmVF
eHRlbnRzLngoKSk7Ci0gICAgICAgIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBsb2NhbEZvbnREYXRh
ID0gZ2x5cGhCdWZmZXIuZm9udERhdGFBdChpbmRleCk7Ci0gICAgICAgIGlmICghbG9jYWxGb250
RGF0YSB8fCAoIWlzU1ZHICYmIGxvY2FsRm9udERhdGEtPmlzU1ZHRm9udCgpKSB8fCAoaXNTVkcg
JiYgbG9jYWxGb250RGF0YSAhPSBmb250RGF0YSkpIHsKLSAgICAgICAgICAgIC8vIFRoZSBhZHZh
bmNlcyB3aWxsIGdldCBhbGwgbWVzc2VkIHVwIGlmIHdlIGRvIGFueXRoaW5nIG90aGVyIHRoYW4g
YmFpbCBoZXJlLgotICAgICAgICAgICAgcmVzdWx0LmNsZWFyKCk7Ci0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKHRyYW5zbGF0b3ItPnVuZGVybGluZVR5cGUo
KSkgewotICAgICAgICBjYXNlIEdseXBoVG9QYXRoVHJhbnNsYXRvcjo6R2x5cGhVbmRlcmxpbmVU
eXBlOjpTa2lwRGVzY2VuZGVyczogewotICAgICAgICAgICAgUGF0aCBwYXRoID0gdHJhbnNsYXRv
ci0+cGF0aCgpOwotICAgICAgICAgICAgQ0dQYXRoQXBwbHkocGF0aC5wbGF0Zm9ybVBhdGgoKSwg
JmluZm8sICZmaW5kUGF0aEludGVyc2VjdGlvbnMpOwotICAgICAgICAgICAgaWYgKGluZm8ubWlu
WCA8IGluZm8ubWF4WCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaW5mby5taW5Y
IC0gbGluZUV4dGVudHMueCgpKTsKLSAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGluZm8u
bWF4WCAtIGxpbmVFeHRlbnRzLngoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVh
azsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEdseXBoVG9QYXRoVHJhbnNsYXRvcjo6R2x5cGhV
bmRlcmxpbmVUeXBlOjpTa2lwR2x5cGg6IHsKLSAgICAgICAgICAgIHN0ZDo6cGFpcjxmbG9hdCwg
ZmxvYXQ+IGV4dGVudHMgPSB0cmFuc2xhdG9yLT5leHRlbnRzKCk7Ci0gICAgICAgICAgICByZXN1
bHQuYXBwZW5kKGV4dGVudHMuZmlyc3QgLSBsaW5lRXh0ZW50cy54KCkpOwotICAgICAgICAgICAg
cmVzdWx0LmFwcGVuZChleHRlbnRzLnNlY29uZCAtIGxpbmVFeHRlbnRzLngoKSk7Ci0gICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEdseXBoVG9QYXRoVHJhbnNsYXRv
cjo6R2x5cGhVbmRlcmxpbmVUeXBlOjpEcmF3T3ZlckdseXBoOgotICAgICAgICAgICAgLy8gTm90
aGluZyB0byBkbwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0
dXJuIHJlc3VsdDsKLX0KLSNlbmRpZgotCi1ib29sIEZvbnRDYXNjYWRlOjpwcmltYXJ5Rm9udERh
dGFJc1N5c3RlbUZvbnQoKSBjb25zdAotewotI2lmIFBMQVRGT1JNKElPUykgfHwgX19NQUNfT1Nf
WF9WRVJTSU9OX01JTl9SRVFVSVJFRCA+IDEwOTAKLSAgICBjb25zdCBhdXRvJiBmb250RGF0YSA9
IHByaW1hcnlGb250RGF0YSgpOwotICAgIHJldHVybiAhZm9udERhdGEuaXNTVkdGb250KCkgJiYg
Q1RGb250RGVzY3JpcHRvcklzU3lzdGVtVUlGb250KGFkb3B0Q0YoQ1RGb250Q29weUZvbnREZXNj
cmlwdG9yKGZvbnREYXRhLnBsYXRmb3JtRGF0YSgpLmN0Rm9udCgpKSkuZ2V0KCkpOwotI2Vsc2UK
LSAgICAvLyBTeXN0ZW0gZm9udHMgYXJlIGhpZGRlbiBieSBoYXZpbmcgYSBuYW1lIHRoYXQgYmVn
aW5zIHdpdGggYSBwZXJpb2QsIHNvIHNpbXBseSBzZWFyY2gKLSAgICAvLyBmb3IgdGhhdCBoZXJl
IHJhdGhlciB0aGFuIHRyeSB0byBrZWVwIHRoZSBsaXN0IHVwIHRvIGRhdGUuCi0gICAgcmV0dXJu
IGZpcnN0RmFtaWx5KCkuc3RhcnRzV2l0aCgnLicpOwotI2VuZGlmCi19Ci0KLX0K
</data>
<flag name="review"
          id="269693"
          type_id="1"
          status="+"
          setter="zalan"
    />
          </attachment>
      

    </bug>

</bugzilla>