<?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>119437</bug_id>
          
          <creation_ts>2013-08-02 03:09:08 -0700</creation_ts>
          <short_desc>Remove SimplePDFPlugin</short_desc>
          <delta_ts>2013-11-21 17:27: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>PDF</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="Tim Horton">thorton</reporter>
          <assigned_to name="Tim Horton">thorton</assigned_to>
          <cc>andersca</cc>
    
    <cc>ap</cc>
    
    <cc>commit-queue</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>914074</commentid>
    <comment_count>0</comment_count>
    <who name="Tim Horton">thorton</who>
    <bug_when>2013-08-02 03:09:08 -0700</bug_when>
    <thetext>PDFPlugin has replaced SimplePDFPlugin everywhere, so we can merge the required parts of SimplePDFPlugin into PDFPlugin and get rid of unnecessary bits.

Nightlies on some outdated versions of OS X (a fully-updated Lion/Mountain Lion will work fine) will lose the ability to view PDFs (unless you install an external plugin), but everything should still build fine.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>914075</commentid>
    <comment_count>1</comment_count>
      <attachid>207996</attachid>
    <who name="Tim Horton">thorton</who>
    <bug_when>2013-08-02 03:12:50 -0700</bug_when>
    <thetext>Created attachment 207996
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>914076</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2013-08-02 03:15:23 -0700</bug_when>
    <thetext>Attachment 207996 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebKit2/ChangeLog&apos;, u&apos;Source/WebKit2/UIProcess/WebProcessProxy.cpp&apos;, u&apos;Source/WebKit2/WebKit2.xcodeproj/project.pbxproj&apos;, u&apos;Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.h&apos;, u&apos;Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm&apos;, u&apos;Source/WebKit2/WebProcess/Plugins/PDF/SimplePDFPlugin.h&apos;, u&apos;Source/WebKit2/WebProcess/Plugins/PDF/SimplePDFPlugin.mm&apos;, u&apos;Source/WebKit2/WebProcess/WebPage/WebPage.cpp&apos;]&quot; exit_code: 1
Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.h:119:  Missing space inside { }.  [whitespace/braces] [5]
Total errors found: 1 in 5 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>914185</commentid>
    <comment_count>3</comment_count>
      <attachid>207996</attachid>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2013-08-02 10:06:30 -0700</bug_when>
    <thetext>Comment on attachment 207996
patch

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

It&apos;s sad how huge the class has become. Does it have any responsibilities that can be logically separated?

&gt; Source/WebKit2/UIProcess/WebProcessProxy.cpp:51
&gt; +#if PLATFORM(MAC) &amp;&amp; ENABLE(PDFKIT_PLUGIN)
&gt;  #include &quot;PDFPlugin.h&quot;

I think that at least the ENABLE check should be in the header. It&apos;s so ugly and fragile to have ifdefs around every include site.

Also, I don&apos;t understand why we need a PLATFORM check. ENABLE should only be enabled on appropriate platforms.

&gt; Source/WebKit2/UIProcess/WebProcessProxy.cpp:318
&gt; +#if PLATFORM(MAC) &amp;&amp; ENABLE(PDFKIT_PLUGIN)

Same concern about ENABLE.

&gt; Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.h:66
&gt; +class PDFPlugin FINAL : public Plugin, protected WebCore::ScrollableArea {

Protected base class doesn&apos;t make sense in a FINAL class. It should just be private (and clang should have a warning).

&gt; Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.h:157
&gt; +    // In-process PDFViews don&apos;t support asynchronous initialization.
&gt; +    virtual bool isBeingAsynchronouslyInitialized() const OVERRIDE { return false; }

Not sure what this comment means.

&gt; Source/WebKit2/WebProcess/WebPage/WebPage.cpp:166
&gt;  #if PLATFORM(MAC)
&gt; -#include &quot;SimplePDFPlugin.h&quot;
&gt;  #if ENABLE(PDFKIT_PLUGIN)

Same concerns about ifdefs.

&gt; Source/WebKit2/WebProcess/WebPage/WebPage.cpp:570
&gt; -#if PLATFORM(MAC)
&gt; +#if PLATFORM(MAC) &amp;&amp; ENABLE(PDFKIT_PLUGIN)

Ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>914405</commentid>
    <comment_count>4</comment_count>
    <who name="Tim Horton">thorton</who>
    <bug_when>2013-08-03 18:13:37 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 207996 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=207996&amp;action=review
&gt; 
&gt; It&apos;s sad how huge the class has become. Does it have any responsibilities that can be logically separated?

Sad but not super surprising. I&apos;d like to do something about this in the future, definitely, but I&apos;m not totally sure how yet.

&gt; &gt; Source/WebKit2/UIProcess/WebProcessProxy.cpp:51
&gt; &gt; +#if PLATFORM(MAC) &amp;&amp; ENABLE(PDFKIT_PLUGIN)
&gt; &gt;  #include &quot;PDFPlugin.h&quot;
&gt; 
&gt; I think that at least the ENABLE check should be in the header. It&apos;s so ugly and fragile to have ifdefs around every include site.
&gt; 
&gt; Also, I don&apos;t understand why we need a PLATFORM check. ENABLE should only be enabled on appropriate platforms.

Quite right on both counts.

&gt; &gt; Source/WebKit2/UIProcess/WebProcessProxy.cpp:318
&gt; &gt; +#if PLATFORM(MAC) &amp;&amp; ENABLE(PDFKIT_PLUGIN)
&gt; 
&gt; Same concern about ENABLE.
&gt; 
&gt; &gt; Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.h:66
&gt; &gt; +class PDFPlugin FINAL : public Plugin, protected WebCore::ScrollableArea {
&gt; 
&gt; Protected base class doesn&apos;t make sense in a FINAL class. It should just be private (and clang should have a warning).

Ooh. I wonder if a warning doesn&apos;t make sense because of &apos;friend&apos;, but other than that agreed.

&gt; &gt; Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.h:157
&gt; &gt; +    // In-process PDFViews don&apos;t support asynchronous initialization.
&gt; &gt; +    virtual bool isBeingAsynchronouslyInitialized() const OVERRIDE { return false; }
&gt; 
&gt; Not sure what this comment means.

I assumed you wrote it, but never checked :) I think it means exactly what it says; we&apos;ll never use the async plugin init code, so we can never be being-asynchronously-initialized. I&apos;m going to remove it because you&apos;re like the third person to complain about it and I don&apos;t think it&apos;s useful.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>914410</commentid>
    <comment_count>5</comment_count>
    <who name="Tim Horton">thorton</who>
    <bug_when>2013-08-03 20:51:27 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/153693</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>914411</commentid>
    <comment_count>6</comment_count>
    <who name="Tim Horton">thorton</who>
    <bug_when>2013-08-03 21:03:30 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; Also, I don&apos;t understand why we need a PLATFORM check. ENABLE should only be enabled on appropriate platforms.

The enable check is in the header, but I put the PLATFORM checks back for now because of http://build.webkit.org/builders/Qt%20Linux%20MIPS32R2%20LE%20Release/builds/17113. I&apos;m not sure why Qt can&apos;t find the header… maybe it not being included in their project files means they can&apos;t find it? (no idea how their build system works).

I guess I could add it to their project files...</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>914412</commentid>
    <comment_count>7</comment_count>
    <who name="Tim Horton">thorton</who>
    <bug_when>2013-08-03 21:03:47 -0700</bug_when>
    <thetext>Build fix was http://trac.webkit.org/changeset/153694</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>914466</commentid>
    <comment_count>8</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2013-08-04 10:59:00 -0700</bug_when>
    <thetext>&gt; I wonder if a warning doesn&apos;t make sense because of &apos;friend&apos;

I can&apos;t follow, could you please elaborate?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>914472</commentid>
    <comment_count>9</comment_count>
    <who name="Tim Horton">thorton</who>
    <bug_when>2013-08-04 12:21:31 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; &gt; I wonder if a warning doesn&apos;t make sense because of &apos;friend&apos;
&gt; 
&gt; I can&apos;t follow, could you please elaborate?

I was thinking that protected methods on final classes still made some sense (and therefore shouldn&apos;t have a warning) because friend classes could still access them, but friend classes can also access private methods so I guess it doesn&apos;t make sense :) ignore me!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>914623</commentid>
    <comment_count>10</comment_count>
    <who name="Alexey Proskuryakov">ap</who>
    <bug_when>2013-08-05 10:36:03 -0700</bug_when>
    <thetext>&gt; &gt; Not sure what this comment means.
&gt; I assumed you wrote it, but never checked :)

Probably. I guess I was thinking about moving PDF rendering to a separate process then, in which case async initialization could make sense.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>953368</commentid>
    <comment_count>11</comment_count>
    <who name="Tim Horton">thorton</who>
    <bug_when>2013-11-21 17:27:20 -0800</bug_when>
    <thetext>Hilariously, the landed patch did NOT remove the SimplePDFPlugin sources. I believe enrica is going to fix this shortly.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>207996</attachid>
            <date>2013-08-02 03:12:50 -0700</date>
            <delta_ts>2013-08-02 10:06:30 -0700</delta_ts>
            <desc>patch</desc>
            <filename>remove-simple.diff</filename>
            <type>text/plain</type>
            <size>91717</size>
            <attacher name="Tim Horton">thorton</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQyL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQyL0No
YW5nZUxvZwppbmRleCAyYWY5ZmFlLi43YzE5Zjk3IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0
Mi9DaGFuZ2VMb2cKKysrIGIvU291cmNlL1dlYktpdDIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjUg
QEAKKzIwMTMtMDgtMDIgIFRpbSBIb3J0b24gIDx0aW1vdGh5X2hvcnRvbkBhcHBsZS5jb20+CisK
KyAgICAgICAgUmVtb3ZlIFNpbXBsZVBERlBsdWdpbgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTE5NDM3CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9C
T0RZIChPT1BTISkuCisKKyAgICAgICAgKiBVSVByb2Nlc3MvV2ViUHJvY2Vzc1Byb3h5LmNwcDoK
KyAgICAgICAgKFdlYktpdDo6V2ViUHJvY2Vzc1Byb3h5OjpnZXRQbHVnaW5zKToKKyAgICAgICAg
KiBXZWJQcm9jZXNzL1dlYlBhZ2UvV2ViUGFnZS5jcHA6CisgICAgICAgIChXZWJLaXQ6OldlYlBh
Z2U6OmNyZWF0ZVBsdWdpbik6CisgICAgICAgIERvbid0IGFkZCBTaW1wbGVQREZQbHVnaW4sIG5v
ciB0cnkgdG8gaW5zdGFudGlhdGUgaXQuCisKKyAgICAgICAgKiBXZWJQcm9jZXNzL1BsdWdpbnMv
UERGL1BERlBsdWdpbi5oOgorICAgICAgICAqIFdlYlByb2Nlc3MvUGx1Z2lucy9QREYvUERGUGx1
Z2luLm1tOgorICAgICAgICBNZXJnZSBwcmV2aW91c2x5IGluaGVyaXRlZCBiZWhhdmlvciBpbiBm
cm9tIFNpbXBsZVBERlBsdWdpbi4KKworICAgICAgICAqIFdlYktpdDIueGNvZGVwcm9qL3Byb2pl
Y3QucGJ4cHJvajoKKyAgICAgICAgKiBXZWJQcm9jZXNzL1BsdWdpbnMvUERGL1NpbXBsZVBERlBs
dWdpbi5oOiBSZW1vdmVkLgorICAgICAgICAqIFdlYlByb2Nlc3MvUGx1Z2lucy9QREYvU2ltcGxl
UERGUGx1Z2luLm1tOiBSZW1vdmVkLgorICAgICAgICBSZW1vdmUgU2ltcGxlUERGUGx1Z2luLgor
CiAyMDEzLTA4LTAxICBSdXRoIEZvbmcgIDxydXRoX2ZvbmdAYXBwbGUuY29tPgogCiAgICAgICAg
IFtGb3JtczogY29sb3JdIDxpbnB1dCB0eXBlPSdjb2xvcic+IHBvcG92ZXIgY29sb3Igd2VsbCBp
bXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvVUlQcm9jZXNzL1dlYlBy
b2Nlc3NQcm94eS5jcHAgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nlc3MvV2ViUHJvY2Vzc1Byb3h5
LmNwcAppbmRleCA4ODY1OTg0Li5jZTc0OTZkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9V
SVByb2Nlc3MvV2ViUHJvY2Vzc1Byb3h5LmNwcAorKysgYi9Tb3VyY2UvV2ViS2l0Mi9VSVByb2Nl
c3MvV2ViUHJvY2Vzc1Byb3h5LmNwcApAQCAtNDcsMTIgKzQ3LDkgQEAKICNpbmNsdWRlIDx3dGYv
dGV4dC9DU3RyaW5nLmg+CiAjaW5jbHVkZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+CiAKLSNpZiBQ
TEFURk9STShNQUMpCi0jaW5jbHVkZSAiU2ltcGxlUERGUGx1Z2luLmgiCi0jaWYgRU5BQkxFKFBE
RktJVF9QTFVHSU4pCisjaWYgUExBVEZPUk0oTUFDKSAmJiBFTkFCTEUoUERGS0lUX1BMVUdJTikK
ICNpbmNsdWRlICJQREZQbHVnaW4uaCIKICNlbmRpZgotI2VuZGlmCiAKICNpZiBFTkFCTEUoQ1VT
VE9NX1BST1RPQ09MUykKICNpbmNsdWRlICJDdXN0b21Qcm90b2NvbE1hbmFnZXJQcm94eU1lc3Nh
Z2VzLmgiCkBAIC0zMTgsMTUgKzMxNSwxMSBAQCB2b2lkIFdlYlByb2Nlc3NQcm94eTo6Z2V0UGx1
Z2lucyhib29sIHJlZnJlc2gsIFZlY3RvcjxQbHVnaW5JbmZvPiYgcGx1Z2lucykKICAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IHBsdWdpbk1vZHVsZXMuc2l6ZSgpOyArK2kpCiAgICAgICAgIHBs
dWdpbnMuYXBwZW5kKHBsdWdpbk1vZHVsZXNbaV0uaW5mbyk7CiAKLSNpZiBQTEFURk9STShNQUMp
CisjaWYgUExBVEZPUk0oTUFDKSAmJiBFTkFCTEUoUERGS0lUX1BMVUdJTikKICAgICAvLyBBZGQg
YnVpbHQtaW4gUERGIGxhc3QsIHNvIHRoYXQgaXQncyBub3QgdXNlZCB3aGVuIGEgcmVhbCBwbHVn
LWluIGlzIGluc3RhbGxlZC4KLSAgICBpZiAoIW1fY29udGV4dC0+b21pdFBERlN1cHBvcnQoKSkg
ewotI2lmIEVOQUJMRShQREZLSVRfUExVR0lOKQorICAgIGlmICghbV9jb250ZXh0LT5vbWl0UERG
U3VwcG9ydCgpKQogICAgICAgICBwbHVnaW5zLmFwcGVuZChQREZQbHVnaW46OnBsdWdpbkluZm8o
KSk7CiAjZW5kaWYKLSAgICAgICAgcGx1Z2lucy5hcHBlbmQoU2ltcGxlUERGUGx1Z2luOjpwbHVn
aW5JbmZvKCkpOwotICAgIH0KLSNlbmRpZgogfQogI2VuZGlmIC8vIEVOQUJMRShORVRTQ0FQRV9Q
TFVHSU5fQVBJKQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9XZWJLaXQyLnhjb2RlcHJv
ai9wcm9qZWN0LnBieHByb2ogYi9Tb3VyY2UvV2ViS2l0Mi9XZWJLaXQyLnhjb2RlcHJvai9wcm9q
ZWN0LnBieHByb2oKaW5kZXggZjA0NWZmNS4uOWMzODNlMSAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YktpdDIvV2ViS2l0Mi54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCisrKyBiL1NvdXJjZS9XZWJL
aXQyL1dlYktpdDIueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagpAQCAtMTE2NSw3ICsxMTY1LDYg
QEAKIAkJRTE4RTY5MTgxNjlCNjY3QjAwOUI2NjcwIC8qIFNlY0l0ZW1TaGltUHJveHlNZXNzYWdl
cy5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTE4RTY5
MTQxNjlCNjY3QjAwOUI2NjcwIC8qIFNlY0l0ZW1TaGltUHJveHlNZXNzYWdlcy5oICovOyB9Owog
CQlFMTk1ODJEMzE1M0NCRkQ3MDBCNjA4NzUgLyogUERGS2l0SW1wb3J0cy5oIGluIEhlYWRlcnMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gRTE5NTgyRDIxNTNDQkZENzAwQjYw
ODc1IC8qIFBERktpdEltcG9ydHMuaCAqLzsgfTsKIAkJRTE5NTgyRDYxNTNDQzA1NDAwQjYwODc1
IC8qIFBERktpdEltcG9ydHMubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSBFMTk1ODJENDE1M0NDMDUzMDBCNjA4NzUgLyogUERGS2l0SW1wb3J0cy5tbSAq
LzsgfTsKLQkJRTE5OTg3NUUxNDJDMDQ1NDAwQkIyREU3IC8qIFNpbXBsZVBERlBsdWdpbi5tbSBp
biBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEUxOTk4NzVDMTQy
QkZDOTcwMEJCMkRFNyAvKiBTaW1wbGVQREZQbHVnaW4ubW0gKi87IH07CiAJCUUxQTMxNzMyMTM0
Q0VBNkMwMDdDOUE0RiAvKiBBdHRyaWJ1dGVkU3RyaW5nLmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBFMUEzMTczMTEzNENFQTZDMDA3QzlBNEYgLyogQXR0
cmlidXRlZFN0cmluZy5oICovOyB9OwogCQlFMUEzMTczNTEzNENFQTgwMDA3QzlBNEYgLyogQXR0
cmlidXRlZFN0cmluZy5tbSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IEUxQTMxNzM0MTM0Q0VBODAwMDdDOUE0RiAvKiBBdHRyaWJ1dGVkU3RyaW5nLm1tICov
OyB9OwogCQlFMUE5QTg1MjE2OUUyMDI1MDAyRDcxNzYgLyogV2ViS2l0LmljbnMgaW4gUmVzb3Vy
Y2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEUxMzNGRDg5MTQyM0REN0Yw
MEZDN0JGQiAvKiBXZWJLaXQuaWNucyAqLzsgfTsKQEAgLTI2OTUsOCArMjY5NCw2IEBACiAJCUUx
OTU4MkQyMTUzQ0JGRDcwMEI2MDg3NSAvKiBQREZLaXRJbXBvcnRzLmggKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmMuaDsgcGF0aCA9IFBERktpdEltcG9ydHMuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKIAkJRTE5NTgyRDQxNTNDQzA1MzAwQjYwODc1IC8qIFBERktpdEltcG9ydHMubW0gKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGggPSBQREZLaXRJbXBvcnRzLm1tOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFMTk2N0UzNzE1MEFCNUUyMDBDNzMxNjkgLyog
Y29tLmFwcGxlLldlYlByb2Nlc3Muc2IgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSB0ZXh0OyBwYXRoID0gY29tLmFwcGxl
LldlYlByb2Nlc3Muc2I7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCUUxOTk4NzVBMTQy
QkY5QjgwMEJCMkRFNyAvKiBTaW1wbGVQREZQbHVnaW4uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Yy5oOyBuYW1lID0gU2ltcGxlUERGUGx1Z2luLmg7IHBhdGggPSBQREYvU2ltcGxlUERGUGx1Z2lu
Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07Ci0JCUUxOTk4NzVDMTQyQkZDOTcwMEJCMkRF
NyAvKiBTaW1wbGVQREZQbHVnaW4ubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7
IG5hbWUgPSBTaW1wbGVQREZQbHVnaW4ubW07IHBhdGggPSBQREYvU2ltcGxlUERGUGx1Z2luLm1t
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlFMUEzMTczMTEzNENFQTZDMDA3QzlBNEYg
LyogQXR0cmlidXRlZFN0cmluZy5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBB
dHRyaWJ1dGVkU3RyaW5nLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUUxQTMxNzM0
MTM0Q0VBODAwMDdDOUE0RiAvKiBBdHRyaWJ1dGVkU3RyaW5nLm1tICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAub2JqY3BwOyBwYXRoID0gQXR0cmlidXRlZFN0cmluZy5tbTsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKIAkJRTFBRUEyMkQxNDY4N0JEQjAwODA0NTY5IC8qIFdLRnVsbEtleWJv
YXJkQWNjZXNzV2F0Y2hlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBXS0Z1
bGxLZXlib2FyZEFjY2Vzc1dhdGNoZXIuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAg
LTUyMzgsOCArNTIzNSw2IEBACiAJCQkJMkQ0MjlCRkIxNzIxRTJCQTAwRUM2ODFGIC8qIFBERlBs
dWdpblBhc3N3b3JkRmllbGQubW0gKi8sCiAJCQkJMkQyQURGMDUxNjM2MkRDNzAwMTk3RTQ3IC8q
IFBERlBsdWdpblRleHRBbm5vdGF0aW9uLmggKi8sCiAJCQkJMkQyQURGMDYxNjM2MkRDNzAwMTk3
RTQ3IC8qIFBERlBsdWdpblRleHRBbm5vdGF0aW9uLm1tICovLAotCQkJCUUxOTk4NzVBMTQyQkY5
QjgwMEJCMkRFNyAvKiBTaW1wbGVQREZQbHVnaW4uaCAqLywKLQkJCQlFMTk5ODc1QzE0MkJGQzk3
MDBCQjJERTcgLyogU2ltcGxlUERGUGx1Z2luLm1tICovLAogCQkJKTsKIAkJCW5hbWUgPSBQREY7
CiAJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOwpAQCAtNjc4OSw3ICs2Nzg0LDYgQEAKIAkJCQlF
MUVERkUxNTE2MjhERDdBMDAzOUVDREEgLyogU2hhcmVkV29ya2VyUHJvY2Vzc1Byb3h5LmNwcCBp
biBTb3VyY2VzICovLAogCQkJCTlGNEY1OTQ0MTY0OEI2N0YwMDQ5M0I3RSAvKiBTaGFyZWRXb3Jr
ZXJQcm9jZXNzUHJveHlNYWMubW0gaW4gU291cmNlcyAqLywKIAkJCQlFMUVERkRCNzE2MjhBRDcz
MDAzOUVDREEgLyogU2hhcmVkV29ya2VyUHJvY2Vzc1Byb3h5TWVzc2FnZVJlY2VpdmVyLmNwcCBp
biBTb3VyY2VzICovLAotCQkJCUUxOTk4NzVFMTQyQzA0NTQwMEJCMkRFNyAvKiBTaW1wbGVQREZQ
bHVnaW4ubW0gaW4gU291cmNlcyAqLywKIAkJCQk1MjcyQjI4QTE0MDY5ODVEMDA5NkE1RDAgLyog
U3RhdGlzdGljc0RhdGEuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJNTFBNEQ1QTkxNkNBQzRGRjAw
MEU2MTVFIC8qIFN0YXRpc3RpY3NSZXF1ZXN0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTFBRDMz
MDZFMTZCMUQ5OTEwMDRGNjBFNyAvKiBTdG9yYWdlQXJlYUltcGwuY3BwIGluIFNvdXJjZXMgKi8s
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1BsdWdpbnMvUERGL1BERlBs
dWdpbi5oIGIvU291cmNlL1dlYktpdDIvV2ViUHJvY2Vzcy9QbHVnaW5zL1BERi9QREZQbHVnaW4u
aAppbmRleCAyNzkxODY0Li44ZTFiZDlhIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9XZWJQ
cm9jZXNzL1BsdWdpbnMvUERGL1BERlBsdWdpbi5oCisrKyBiL1NvdXJjZS9XZWJLaXQyL1dlYlBy
b2Nlc3MvUGx1Z2lucy9QREYvUERGUGx1Z2luLmgKQEAgLTI5LDcgKzI5LDYgQEAKICNpZiBFTkFC
TEUoUERGS0lUX1BMVUdJTikKIAogI2luY2x1ZGUgIlBsdWdpbi5oIgotI2luY2x1ZGUgIlNpbXBs
ZVBERlBsdWdpbi5oIgogI2luY2x1ZGUgIldlYkV2ZW50LmgiCiAjaW5jbHVkZSA8V2ViQ29yZS9B
ZmZpbmVUcmFuc2Zvcm0uaD4KICNpbmNsdWRlIDxXZWJDb3JlL0ZpbmRPcHRpb25zLmg+CkBAIC00
MSw2ICs0MCw3IEBAIHR5cGVkZWYgc3RydWN0IE9wYXF1ZUpTVmFsdWUqIEpTT2JqZWN0UmVmOwog
dHlwZWRlZiBjb25zdCBzdHJ1Y3QgT3BhcXVlSlNWYWx1ZSogSlNWYWx1ZVJlZjsKIAogT0JKQ19D
TEFTUyBOU0FycmF5OworT0JKQ19DTEFTUyBOU0RhdGE7CiBPQkpDX0NMQVNTIFBERkFubm90YXRp
b247CiBPQkpDX0NMQVNTIFBERkxheWVyQ29udHJvbGxlcjsKIE9CSkNfQ0xBU1MgUERGU2VsZWN0
aW9uOwpAQCAtNjMsMTEgKzYzLDE3IEBAIGNsYXNzIFBERlBsdWdpblBhc3N3b3JkRmllbGQ7CiBj
bGFzcyBQbHVnaW5WaWV3OwogY2xhc3MgV2ViRnJhbWU7CiAKLWNsYXNzIFBERlBsdWdpbiA6IHB1
YmxpYyBTaW1wbGVQREZQbHVnaW4geworY2xhc3MgUERGUGx1Z2luIEZJTkFMIDogcHVibGljIFBs
dWdpbiwgcHJvdGVjdGVkIFdlYkNvcmU6OlNjcm9sbGFibGVBcmVhIHsKIHB1YmxpYzoKICAgICBz
dGF0aWMgUGFzc1JlZlB0cjxQREZQbHVnaW4+IGNyZWF0ZShXZWJGcmFtZSopOwogICAgIH5QREZQ
bHVnaW4oKTsKIAorICAgIHN0YXRpYyBXZWJDb3JlOjpQbHVnaW5JbmZvIHBsdWdpbkluZm8oKTsK
KworICAgIFdlYkNvcmU6OkludFNpemUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQor
CisgICAgdm9pZCBkaWRNdXRhdGVQREZEb2N1bWVudCgpIHsgbV9wZGZEb2N1bWVudFdhc011dGF0
ZWQgPSB0cnVlOyB9CisKICAgICB2b2lkIHBhaW50Q29udHJvbEZvckxheWVySW5Db250ZXh0KENB
TGF5ZXIgKiwgQ0dDb250ZXh0UmVmKTsKICAgICB2b2lkIHNldEFjdGl2ZUFubm90YXRpb24oUERG
QW5ub3RhdGlvbiAqKTsKICAgICAKQEAgLTk4LDE5ICsxMDQsMzIgQEAgcHVibGljOgogcHJpdmF0
ZToKICAgICBleHBsaWNpdCBQREZQbHVnaW4oV2ViRnJhbWUqKTsKIAotICAgIHZpcnR1YWwgdm9p
ZCB1cGRhdGVTY3JvbGxiYXJzKCkgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCBQYXNzUmVmUHRyPFdl
YkNvcmU6OlNjcm9sbGJhcj4gY3JlYXRlU2Nyb2xsYmFyKFdlYkNvcmU6OlNjcm9sbGJhck9yaWVu
dGF0aW9uKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIHZvaWQgZGVzdHJveVNjcm9sbGJhcihXZWJD
b3JlOjpTY3JvbGxiYXJPcmllbnRhdGlvbikgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCB2b2lkIHBk
ZkRvY3VtZW50RGlkTG9hZCgpIE9WRVJSSURFOwotICAgIHZpcnR1YWwgdm9pZCBjYWxjdWxhdGVT
aXplcygpIE9WRVJSSURFOwotCisgICAgLy8gUGx1Z2luIGZ1bmN0aW9ucy4KKyAgICB2aXJ0dWFs
IGJvb2wgaW5pdGlhbGl6ZShjb25zdCBQYXJhbWV0ZXJzJik7CiAgICAgdmlydHVhbCB2b2lkIGRl
c3Ryb3koKSBPVkVSUklERTsKLSAgICB2aXJ0dWFsIHZvaWQgcGFpbnQoV2ViQ29yZTo6R3JhcGhp
Y3NDb250ZXh0KiwgY29uc3QgV2ViQ29yZTo6SW50UmVjdCYgZGlydHlSZWN0SW5XaW5kb3dDb29y
ZGluYXRlcykgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lkIHBhaW50KFdlYkNvcmU6OkdyYXBo
aWNzQ29udGV4dCosIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIGRpcnR5UmVjdEluV2luZG93Q29v
cmRpbmF0ZXMpIE9WRVJSSURFIHsgfQorICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVDb250cm9sVGlu
dHMoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0KikgT1ZFUlJJREU7CisgICAgdmlydHVhbCBib29s
IHN1cHBvcnRzU25hcHNob3R0aW5nKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gdHJ1ZTsgfQog
ICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxTaGFyZWFibGVCaXRtYXA+IHNuYXBzaG90KCkgT1ZFUlJJ
REU7CiAgICAgdmlydHVhbCBQbGF0Zm9ybUxheWVyKiBwbHVnaW5MYXllcigpIE9WRVJSSURFOwor
ICAgIHZpcnR1YWwgYm9vbCBpc1RyYW5zcGFyZW50KCkgT1ZFUlJJREUgeyByZXR1cm4gZmFsc2U7
IH0KKyAgICB2aXJ0dWFsIGJvb2wgd2FudHNXaGVlbEV2ZW50cygpIE9WRVJSSURFIHsgcmV0dXJu
IHRydWU7IH0KICAgICB2aXJ0dWFsIHZvaWQgZ2VvbWV0cnlEaWRDaGFuZ2UoY29uc3QgV2ViQ29y
ZTo6SW50U2l6ZSYgcGx1Z2luU2l6ZSwgY29uc3QgV2ViQ29yZTo6SW50UmVjdCYgY2xpcFJlY3Qs
IGNvbnN0IFdlYkNvcmU6OkFmZmluZVRyYW5zZm9ybSYgcGx1Z2luVG9Sb290Vmlld1RyYW5zZm9y
bSkgT1ZFUlJJREU7CiAgICAgdmlydHVhbCB2b2lkIGNvbnRlbnRzU2NhbGVGYWN0b3JDaGFuZ2Vk
KGZsb2F0KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgdmlzaWJpbGl0eURpZENoYW5nZSgp
IE9WRVJSSURFIHt9CisgICAgdmlydHVhbCB2b2lkIGZyYW1lRGlkRmluaXNoTG9hZGluZyh1aW50
NjRfdCByZXF1ZXN0SUQpIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBmcmFtZURpZEZhaWwo
dWludDY0X3QgcmVxdWVzdElELCBib29sIHdhc0NhbmNlbGxlZCkgT1ZFUlJJREU7CisgICAgdmly
dHVhbCB2b2lkIGRpZEV2YWx1YXRlSmF2YVNjcmlwdCh1aW50NjRfdCByZXF1ZXN0SUQsIGNvbnN0
IFN0cmluZyYgcmVzdWx0KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtRGlkUmVj
ZWl2ZVJlc3BvbnNlKHVpbnQ2NF90IHN0cmVhbUlELCBjb25zdCBXZWJDb3JlOjpLVVJMJiByZXNw
b25zZVVSTCwgdWludDMyX3Qgc3RyZWFtTGVuZ3RoLCB1aW50MzJfdCBsYXN0TW9kaWZpZWRUaW1l
LCBjb25zdCBTdHJpbmcmIG1pbWVUeXBlLCBjb25zdCBTdHJpbmcmIGhlYWRlcnMsIGNvbnN0IFN0
cmluZyYgc3VnZ2VzdGVkRmlsZU5hbWUpIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBzdHJl
YW1EaWRSZWNlaXZlRGF0YSh1aW50NjRfdCBzdHJlYW1JRCwgY29uc3QgY2hhciogYnl0ZXMsIGlu
dCBsZW5ndGgpIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1EaWRGaW5pc2hMb2Fk
aW5nKHVpbnQ2NF90IHN0cmVhbUlEKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgc3RyZWFt
RGlkRmFpbCh1aW50NjRfdCBzdHJlYW1JRCwgYm9vbCB3YXNDYW5jZWxsZWQpIE9WRVJSSURFOwor
ICAgIHZpcnR1YWwgdm9pZCBtYW51YWxTdHJlYW1EaWRSZWNlaXZlUmVzcG9uc2UoY29uc3QgV2Vi
Q29yZTo6S1VSTCYgcmVzcG9uc2VVUkwsIHVpbnQzMl90IHN0cmVhbUxlbmd0aCwgdWludDMyX3Qg
bGFzdE1vZGlmaWVkVGltZSwgY29uc3QgV1RGOjpTdHJpbmcmIG1pbWVUeXBlLCBjb25zdCBXVEY6
OlN0cmluZyYgaGVhZGVycywgY29uc3QgU3RyaW5nJiBzdWdnZXN0ZWRGaWxlTmFtZSkgT1ZFUlJJ
REU7CisgICAgdmlydHVhbCB2b2lkIG1hbnVhbFN0cmVhbURpZFJlY2VpdmVEYXRhKGNvbnN0IGNo
YXIqIGJ5dGVzLCBpbnQgbGVuZ3RoKSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIHZvaWQgbWFudWFs
U3RyZWFtRGlkRmluaXNoTG9hZGluZygpIE9WRVJSSURFOworICAgIHZpcnR1YWwgdm9pZCBtYW51
YWxTdHJlYW1EaWRGYWlsKGJvb2wgd2FzQ2FuY2VsbGVkKSBPVkVSUklERTsKICAgICB2aXJ0dWFs
IGJvb2wgaGFuZGxlTW91c2VFdmVudChjb25zdCBXZWJNb3VzZUV2ZW50JikgT1ZFUlJJREU7Cisg
ICAgdmlydHVhbCBib29sIGhhbmRsZVdoZWVsRXZlbnQoY29uc3QgV2ViV2hlZWxFdmVudCYpIE9W
RVJSSURFOwogICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVNb3VzZUVudGVyRXZlbnQoY29uc3QgV2Vi
TW91c2VFdmVudCYpIE9WRVJSSURFOwogICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVNb3VzZUxlYXZl
RXZlbnQoY29uc3QgV2ViTW91c2VFdmVudCYpIE9WRVJSSURFOwogICAgIHZpcnR1YWwgYm9vbCBo
YW5kbGVDb250ZXh0TWVudUV2ZW50KGNvbnN0IFdlYk1vdXNlRXZlbnQmKSBPVkVSUklERTsKQEAg
LTExOCw2ICsxMzcsMjcgQEAgcHJpdmF0ZToKICAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlRWRpdGlu
Z0NvbW1hbmQoY29uc3QgU3RyaW5nJiBjb21tYW5kTmFtZSwgY29uc3QgU3RyaW5nJiBhcmd1bWVu
dCkgT1ZFUlJJREU7CiAgICAgdmlydHVhbCBib29sIGlzRWRpdGluZ0NvbW1hbmRFbmFibGVkKGNv
bnN0IFN0cmluZyYpIE9WRVJSSURFOwogICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVzUGFnZVNjYWxl
RmFjdG9yKCkgT1ZFUlJJREU7CisgICAgdmlydHVhbCB2b2lkIHNldEZvY3VzKGJvb2wpIE9WRVJS
SURFIHsgfQorICAgIHZpcnR1YWwgTlBPYmplY3QqIHBsdWdpblNjcmlwdGFibGVOUE9iamVjdCgp
IE9WRVJSSURFIHsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIHZvaWQgd2luZG93Rm9jdXNDaGFu
Z2VkKGJvb2wpIE9WRVJSSURFIHsgfQorICAgIHZpcnR1YWwgdm9pZCB3aW5kb3dBbmRWaWV3RnJh
bWVzQ2hhbmdlZChjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiB3aW5kb3dGcmFtZUluU2NyZWVuQ29v
cmRpbmF0ZXMsIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIHZpZXdGcmFtZUluV2luZG93Q29vcmRp
bmF0ZXMpIE9WRVJSSURFIHsgfQorICAgIHZpcnR1YWwgdm9pZCB3aW5kb3dWaXNpYmlsaXR5Q2hh
bmdlZChib29sKSBPVkVSUklERSB7IH0KKyAgICB2aXJ0dWFsIHVpbnQ2NF90IHBsdWdpbkNvbXBs
ZXhUZXh0SW5wdXRJZGVudGlmaWVyKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gMDsgfQorICAg
IHZpcnR1YWwgdm9pZCBzZW5kQ29tcGxleFRleHRJbnB1dChjb25zdCBTdHJpbmcmIHRleHRJbnB1
dCkgT1ZFUlJJREUgeyB9CisgICAgdmlydHVhbCB2b2lkIHNldExheWVySG9zdGluZ01vZGUoTGF5
ZXJIb3N0aW5nTW9kZSkgT1ZFUlJJREUgeyB9CisgICAgdmlydHVhbCBXZWJDb3JlOjpTY3JvbGxi
YXIqIGhvcml6b250YWxTY3JvbGxiYXIoKSBPVkVSUklERSB7IHJldHVybiBtX2hvcml6b250YWxT
Y3JvbGxiYXIuZ2V0KCk7IH0KKyAgICB2aXJ0dWFsIFdlYkNvcmU6OlNjcm9sbGJhciogdmVydGlj
YWxTY3JvbGxiYXIoKSBPVkVSUklERSB7IHJldHVybiBtX3ZlcnRpY2FsU2Nyb2xsYmFyLmdldCgp
OyB9CisgICAgdmlydHVhbCB2b2lkIHN0b3JhZ2VCbG9ja2luZ1N0YXRlQ2hhbmdlZChib29sKSBP
VkVSUklERSB7IH0KKyAgICB2aXJ0dWFsIHZvaWQgcHJpdmF0ZUJyb3dzaW5nU3RhdGVDaGFuZ2Vk
KGJvb2wpIE9WRVJSSURFIHsgfQorICAgIHZpcnR1YWwgYm9vbCBnZXRGb3JtVmFsdWUoU3RyaW5n
JiBmb3JtVmFsdWUpIE9WRVJSSURFIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgdmlydHVhbCBib29s
IGhhbmRsZVNjcm9sbChXZWJDb3JlOjpTY3JvbGxEaXJlY3Rpb24sIFdlYkNvcmU6OlNjcm9sbEdy
YW51bGFyaXR5KSBPVkVSUklERTsKKyAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8V2ViQ29yZTo6U2hh
cmVkQnVmZmVyPiBsaXZlUmVzb3VyY2VEYXRhKCkgY29uc3QgT1ZFUlJJREU7CisKKyAgICAvLyBJ
bi1wcm9jZXNzIFBERlZpZXdzIGRvbid0IHN1cHBvcnQgYXN5bmNocm9ub3VzIGluaXRpYWxpemF0
aW9uLgorICAgIHZpcnR1YWwgYm9vbCBpc0JlaW5nQXN5bmNocm9ub3VzbHlJbml0aWFsaXplZCgp
IGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICB2aXJ0dWFsIFJldGFpblB0
cjxQREZEb2N1bWVudD4gcGRmRG9jdW1lbnRGb3JQcmludGluZygpIGNvbnN0IE9WRVJSSURFIHsg
cmV0dXJuIG1fcGRmRG9jdW1lbnQ7IH0KKyAgICB2aXJ0dWFsIE5TT2JqZWN0ICphY2Nlc3NpYmls
aXR5T2JqZWN0KCkgY29uc3QgT1ZFUlJJREU7CiAKICAgICB2aXJ0dWFsIHVuc2lnbmVkIGNvdW50
RmluZE1hdGNoZXMoY29uc3QgU3RyaW5nJiB0YXJnZXQsIFdlYkNvcmU6OkZpbmRPcHRpb25zLCB1
bnNpZ25lZCBtYXhNYXRjaENvdW50KSBPVkVSUklERTsKICAgICB2aXJ0dWFsIGJvb2wgZmluZFN0
cmluZyhjb25zdCBTdHJpbmcmIHRhcmdldCwgV2ViQ29yZTo6RmluZE9wdGlvbnMsIHVuc2lnbmVk
IG1heE1hdGNoQ291bnQpIE9WRVJSSURFOwpAQCAtMTI3LDE0ICsxNjcsNDggQEAgcHJpdmF0ZToK
ICAgICB2aXJ0dWFsIGJvb2wgcGVyZm9ybURpY3Rpb25hcnlMb29rdXBBdExvY2F0aW9uKGNvbnN0
IFdlYkNvcmU6OkZsb2F0UG9pbnQmKSBPVkVSUklERTsKICAgICB2aXJ0dWFsIFN0cmluZyBnZXRT
ZWxlY3Rpb25TdHJpbmcoKSBjb25zdCBPVkVSUklERTsKIAotICAgIHZpcnR1YWwgYm9vbCBoYW5k
bGVXaGVlbEV2ZW50KGNvbnN0IFdlYldoZWVsRXZlbnQmIGV2ZW50KSBPVkVSUklERTsKKyAgICB2
aXJ0dWFsIGJvb2wgc2hvdWxkQWxsb3dTY3JpcHRpbmcoKSBPVkVSUklERSB7IHJldHVybiBmYWxz
ZTsgfQorICAgIHZpcnR1YWwgYm9vbCBzaG91bGRBbGxvd05hdmlnYXRpb25Gcm9tRHJhZ3MoKSBP
VkVSUklERSB7IHJldHVybiB0cnVlOyB9CisgICAgdmlydHVhbCBib29sIHNob3VsZEFsd2F5c0F1
dG9TdGFydCgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIHRydWU7IH0KIAogICAgIC8vIFNjcm9s
bGFibGVBcmVhIGZ1bmN0aW9ucy4KKyAgICB2aXJ0dWFsIFdlYkNvcmU6OkludFJlY3Qgc2Nyb2xs
Q29ybmVyUmVjdCgpIGNvbnN0IE9WRVJSSURFOworICAgIHZpcnR1YWwgV2ViQ29yZTo6U2Nyb2xs
YWJsZUFyZWEqIGVuY2xvc2luZ1Njcm9sbGFibGVBcmVhKCkgY29uc3QgT1ZFUlJJREU7CisgICAg
dmlydHVhbCBXZWJDb3JlOjpJbnRSZWN0IHNjcm9sbGFibGVBcmVhQm91bmRpbmdCb3goKSBjb25z
dCBPVkVSUklERTsKICAgICB2aXJ0dWFsIHZvaWQgc2V0U2Nyb2xsT2Zmc2V0KGNvbnN0IFdlYkNv
cmU6OkludFBvaW50JikgT1ZFUlJJREU7CiAgICAgdmlydHVhbCB2b2lkIGludmFsaWRhdGVTY3Jv
bGxiYXJSZWN0KFdlYkNvcmU6OlNjcm9sbGJhciosIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmKSBP
VkVSUklERTsKICAgICB2aXJ0dWFsIHZvaWQgaW52YWxpZGF0ZVNjcm9sbENvcm5lclJlY3QoY29u
c3QgV2ViQ29yZTo6SW50UmVjdCYpIE9WRVJSSURFOwogICAgIHZpcnR1YWwgV2ViQ29yZTo6SW50
UG9pbnQgbGFzdEtub3duTW91c2VQb3NpdGlvbigpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIG1f
bGFzdE1vdXNlUG9zaXRpb25JblBsdWdpbkNvb3JkaW5hdGVzOyB9Ci0gICAgCisgICAgdmlydHVh
bCBpbnQgc2Nyb2xsU2l6ZShXZWJDb3JlOjpTY3JvbGxiYXJPcmllbnRhdGlvbikgY29uc3QgT1ZF
UlJJREU7CisgICAgdmlydHVhbCBib29sIGlzQWN0aXZlKCkgY29uc3QgT1ZFUlJJREU7CisgICAg
dmlydHVhbCBib29sIGlzU2Nyb2xsQ29ybmVyVmlzaWJsZSgpIGNvbnN0IE9WRVJSSURFIHsgcmV0
dXJuIGZhbHNlOyB9CisgICAgdmlydHVhbCBpbnQgc2Nyb2xsUG9zaXRpb24oV2ViQ29yZTo6U2Ny
b2xsYmFyKikgY29uc3QgT1ZFUlJJREU7CisgICAgdmlydHVhbCBXZWJDb3JlOjpJbnRQb2ludCBz
Y3JvbGxQb3NpdGlvbigpIGNvbnN0IE9WRVJSSURFOworICAgIHZpcnR1YWwgV2ViQ29yZTo6SW50
UG9pbnQgbWluaW11bVNjcm9sbFBvc2l0aW9uKCkgY29uc3QgT1ZFUlJJREU7CisgICAgdmlydHVh
bCBXZWJDb3JlOjpJbnRQb2ludCBtYXhpbXVtU2Nyb2xsUG9zaXRpb24oKSBjb25zdCBPVkVSUklE
RTsKKyAgICB2aXJ0dWFsIGludCB2aXNpYmxlSGVpZ2h0KCkgY29uc3QgT1ZFUlJJREUgeyByZXR1
cm4gbV9zaXplLmhlaWdodCgpOyB9CisgICAgdmlydHVhbCBpbnQgdmlzaWJsZVdpZHRoKCkgY29u
c3QgT1ZFUlJJREUgeyByZXR1cm4gbV9zaXplLndpZHRoKCk7IH0KKyAgICB2aXJ0dWFsIFdlYkNv
cmU6OkludFNpemUgY29udGVudHNTaXplKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gbV9wZGZE
b2N1bWVudFNpemU7IH0KKyAgICB2aXJ0dWFsIFdlYkNvcmU6OlNjcm9sbGJhciogaG9yaXpvbnRh
bFNjcm9sbGJhcigpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIG1faG9yaXpvbnRhbFNjcm9sbGJh
ci5nZXQoKTsgfQorICAgIHZpcnR1YWwgV2ViQ29yZTo6U2Nyb2xsYmFyKiB2ZXJ0aWNhbFNjcm9s
bGJhcigpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIG1fdmVydGljYWxTY3JvbGxiYXIuZ2V0KCk7
IH0KKyAgICB2aXJ0dWFsIGJvb2wgc2Nyb2xsYmFyc0NhbkJlQWN0aXZlKCkgY29uc3QgT1ZFUlJJ
REU7CisgICAgdmlydHVhbCBib29sIHNob3VsZFN1c3BlbmRTY3JvbGxBbmltYXRpb25zKCkgY29u
c3QgT1ZFUlJJREUgeyByZXR1cm4gZmFsc2U7IH0gLy8gSWYgd2UgcmV0dXJuIHRydWUsIFNjcm9s
bEFuaW1hdG9yTWFjIHdpbGwga2VlcCBjeWNsaW5nIGEgdGltZXIgZm9yZXZlciwgd2FpdGluZyBm
b3IgYSBnb29kIHRpbWUgdG8gYW5pbWF0ZS4KKyAgICB2aXJ0dWFsIHZvaWQgc2Nyb2xsYmFyU3R5
bGVDaGFuZ2VkKGludCBuZXdTdHlsZSwgYm9vbCBmb3JjZVVwZGF0ZSkgT1ZFUlJJREU7CisgICAg
dmlydHVhbCBXZWJDb3JlOjpJbnRSZWN0IGNvbnZlcnRGcm9tU2Nyb2xsYmFyVG9Db250YWluaW5n
Vmlldyhjb25zdCBXZWJDb3JlOjpTY3JvbGxiYXIqLCBjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiBz
Y3JvbGxiYXJSZWN0KSBjb25zdCBPVkVSUklERTsKKyAgICB2aXJ0dWFsIFdlYkNvcmU6OkludFJl
Y3QgY29udmVydEZyb21Db250YWluaW5nVmlld1RvU2Nyb2xsYmFyKGNvbnN0IFdlYkNvcmU6OlNj
cm9sbGJhciosIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIHBhcmVudFJlY3QpIGNvbnN0IE9WRVJS
SURFOworICAgIHZpcnR1YWwgV2ViQ29yZTo6SW50UG9pbnQgY29udmVydEZyb21TY3JvbGxiYXJU
b0NvbnRhaW5pbmdWaWV3KGNvbnN0IFdlYkNvcmU6OlNjcm9sbGJhciosIGNvbnN0IFdlYkNvcmU6
OkludFBvaW50JiBzY3JvbGxiYXJQb2ludCkgY29uc3QgT1ZFUlJJREU7CisgICAgdmlydHVhbCBX
ZWJDb3JlOjpJbnRQb2ludCBjb252ZXJ0RnJvbUNvbnRhaW5pbmdWaWV3VG9TY3JvbGxiYXIoY29u
c3QgV2ViQ29yZTo6U2Nyb2xsYmFyKiwgY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmIHBhcmVudFBv
aW50KSBjb25zdCBPVkVSUklERTsKKworICAgIC8vIFBERlBsdWdpbiBmdW5jdGlvbnMuCisgICAg
dm9pZCB1cGRhdGVTY3JvbGxiYXJzKCk7CisgICAgUGFzc1JlZlB0cjxXZWJDb3JlOjpTY3JvbGxi
YXI+IGNyZWF0ZVNjcm9sbGJhcihXZWJDb3JlOjpTY3JvbGxiYXJPcmllbnRhdGlvbik7CisgICAg
dm9pZCBkZXN0cm95U2Nyb2xsYmFyKFdlYkNvcmU6OlNjcm9sbGJhck9yaWVudGF0aW9uKTsKKyAg
ICB2b2lkIHBkZkRvY3VtZW50RGlkTG9hZCgpOworICAgIHZvaWQgYWRkQXJjaGl2ZVJlc291cmNl
KCk7CisgICAgdm9pZCBjb21wdXRlUGFnZUJveGVzKCk7CisgICAgdm9pZCBjYWxjdWxhdGVTaXpl
cygpOworICAgIHZvaWQgcnVuU2NyaXB0c0luUERGRG9jdW1lbnQoKTsKKwogICAgIE5TRXZlbnQg
Km5zRXZlbnRGb3JXZWJNb3VzZUV2ZW50KGNvbnN0IFdlYk1vdXNlRXZlbnQmKTsKICAgICBXZWJD
b3JlOjpJbnRQb2ludCBjb252ZXJ0RnJvbVBsdWdpblRvUERGVmlldyhjb25zdCBXZWJDb3JlOjpJ
bnRQb2ludCYpIGNvbnN0OwogICAgIFdlYkNvcmU6OkludFBvaW50IGNvbnZlcnRGcm9tUm9vdFZp
ZXdUb1BsdWdpbihjb25zdCBXZWJDb3JlOjpJbnRQb2ludCYpIGNvbnN0OwpAQCAtMTQ3LDcgKzIy
MSwxNiBAQCBwcml2YXRlOgogCiAgICAgdm9pZCBjcmVhdGVQYXNzd29yZEVudHJ5Rm9ybSgpOwog
Ci0gICAgdmlydHVhbCBOU0RhdGEgKmxpdmVEYXRhKCkgY29uc3QgT1ZFUlJJREU7CisgICAgUmV0
YWluUHRyPFBERkRvY3VtZW50PiBwZGZEb2N1bWVudCgpIGNvbnN0IHsgcmV0dXJuIG1fcGRmRG9j
dW1lbnQ7IH0KKyAgICB2b2lkIHNldFBERkRvY3VtZW50KFJldGFpblB0cjxQREZEb2N1bWVudD4g
ZG9jdW1lbnQpIHsgbV9wZGZEb2N1bWVudCA9IGRvY3VtZW50OyB9CisKKyAgICBXZWJDb3JlOjpJ
bnRTaXplIHBkZkRvY3VtZW50U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fcGRmRG9jdW1lbnRTaXpl
OyB9CisgICAgdm9pZCBzZXRQREZEb2N1bWVudFNpemUoV2ViQ29yZTo6SW50U2l6ZSBzaXplKSB7
IG1fcGRmRG9jdW1lbnRTaXplID0gc2l6ZTsgfQorCisgICAgTlNEYXRhICpsaXZlRGF0YSgpIGNv
bnN0OworICAgIE5TRGF0YSAqcmF3RGF0YSgpIGNvbnN0IHsgcmV0dXJuIChOU0RhdGEgKiltX2Rh
dGEuZ2V0KCk7IH0KKworICAgIFdlYkZyYW1lKiB3ZWJGcmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1f
ZnJhbWU7IH0KIAogICAgIGVudW0gVXBkYXRlQ3Vyc29yTW9kZSB7CiAgICAgICAgIFVwZGF0ZUlm
TmVlZGVkLApAQCAtMTYxLDcgKzI0NCwyMSBAQCBwcml2YXRlOgogCiAgICAgdm9pZCB1cGRhdGVD
dXJzb3IoY29uc3QgV2ViTW91c2VFdmVudCYsIFVwZGF0ZUN1cnNvck1vZGUgPSBVcGRhdGVJZk5l
ZWRlZCk7CiAKLSAgICB2aXJ0dWFsIE5TT2JqZWN0ICphY2Nlc3NpYmlsaXR5T2JqZWN0KCkgY29u
c3QgT1ZFUlJJREU7CisgICAgSlNPYmplY3RSZWYgbWFrZUpTUERGRG9jKEpTQ29udGV4dFJlZik7
CisgICAgc3RhdGljIEpTVmFsdWVSZWYganNQREZEb2NQcmludChKU0NvbnRleHRSZWYsIEpTT2Jq
ZWN0UmVmIGZ1bmN0aW9uLCBKU09iamVjdFJlZiB0aGlzT2JqZWN0LCBzaXplX3QgYXJndW1lbnRD
b3VudCwgY29uc3QgSlNWYWx1ZVJlZiBhcmd1bWVudHNbXSwgSlNWYWx1ZVJlZiogZXhjZXB0aW9u
KTsKKworICAgIHZvaWQgY29udmVydFBvc3RTY3JpcHREYXRhSWZOZWVkZWQoKTsKKworICAgIC8v
IFJlZ3VsYXIgcGx1Zy1pbnMgZG9uJ3QgbmVlZCBhY2Nlc3MgdG8gdmlldywgYnV0IHdlIGFkZCBz
Y3JvbGxiYXJzIHRvIGVtYmVkZGluZyBGcmFtZVZpZXcgZm9yIHByb3BlciBldmVudCBoYW5kbGlu
Zy4KKyAgICBQbHVnaW5WaWV3KiBwbHVnaW5WaWV3KCk7CisgICAgY29uc3QgUGx1Z2luVmlldyog
cGx1Z2luVmlldygpIGNvbnN0OworCisgICAgV2ViRnJhbWUqIG1fZnJhbWU7CisKKyAgICBib29s
IG1faXNQb3N0U2NyaXB0OworICAgIGJvb2wgbV9wZGZEb2N1bWVudFdhc011dGF0ZWQ7CisKKyAg
ICBXZWJDb3JlOjpJbnRTaXplIG1fc2Nyb2xsT2Zmc2V0OwogCiAgICAgUmV0YWluUHRyPENBTGF5
ZXI+IG1fY29udGFpbmVyTGF5ZXI7CiAgICAgUmV0YWluUHRyPENBTGF5ZXI+IG1fY29udGVudExh
eWVyOwpAQCAtMTg2LDYgKzI4MywyMCBAQCBwcml2YXRlOgogICAgIEhpdFRlc3RSZXN1bHQgbV9s
YXN0SGl0VGVzdFJlc3VsdDsKICAgICAKICAgICBSZXRhaW5QdHI8V0tQREZMYXllckNvbnRyb2xs
ZXJEZWxlZ2F0ZT4gbV9wZGZMYXllckNvbnRyb2xsZXJEZWxlZ2F0ZTsKKworICAgIFdlYkNvcmU6
OkludFNpemUgbV9zaXplOworCisgICAgV2ViQ29yZTo6S1VSTCBtX3NvdXJjZVVSTDsKKworICAg
IFN0cmluZyBtX3N1Z2dlc3RlZEZpbGVuYW1lOworICAgIFJldGFpblB0cjxDRk11dGFibGVEYXRh
UmVmPiBtX2RhdGE7CisKKyAgICBSZXRhaW5QdHI8UERGRG9jdW1lbnQ+IG1fcGRmRG9jdW1lbnQ7
CisgICAgVmVjdG9yPFdlYkNvcmU6OkludFJlY3Q+IG1fcGFnZUJveGVzOworICAgIFdlYkNvcmU6
OkludFNpemUgbV9wZGZEb2N1bWVudFNpemU7IC8vIEFsbCBwYWdlcywgaW5jbHVkaW5nIGdhcHMu
CisKKyAgICBSZWZQdHI8V2ViQ29yZTo6U2Nyb2xsYmFyPiBtX2hvcml6b250YWxTY3JvbGxiYXI7
CisgICAgUmVmUHRyPFdlYkNvcmU6OlNjcm9sbGJhcj4gbV92ZXJ0aWNhbFNjcm9sbGJhcjsKIH07
CiAKIH0gLy8gbmFtZXNwYWNlIFdlYktpdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvV2Vi
UHJvY2Vzcy9QbHVnaW5zL1BERi9QREZQbHVnaW4ubW0gYi9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9j
ZXNzL1BsdWdpbnMvUERGL1BERlBsdWdpbi5tbQppbmRleCBhYzliZDdjLi5lOTZlZDMwIDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1BsdWdpbnMvUERGL1BERlBsdWdpbi5t
bQorKysgYi9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1BsdWdpbnMvUERGL1BERlBsdWdpbi5t
bQpAQCAtNDYsOSArNDYsMTYgQEAKICNpbXBvcnQgIldlYlBhZ2VQcm94eU1lc3NhZ2VzLmgiCiAj
aW1wb3J0ICJXZWJQcm9jZXNzLmgiCiAjaW1wb3J0ICJXS0FjY2Vzc2liaWxpdHlXZWJQYWdlT2Jq
ZWN0LmgiCisjaW1wb3J0IDxKYXZhU2NyaXB0Q29yZS9KU0NvbnRleHRSZWYuaD4KKyNpbXBvcnQg
PEphdmFTY3JpcHRDb3JlL0pTT2JqZWN0UmVmLmg+CisjaW1wb3J0IDxKYXZhU2NyaXB0Q29yZS9K
U1N0cmluZ1JlZi5oPgorI2ltcG9ydCA8SmF2YVNjcmlwdENvcmUvSlNTdHJpbmdSZWZDRi5oPgog
I2ltcG9ydCA8UERGS2l0L1BERktpdC5oPgogI2ltcG9ydCA8UXVhcnR6Q29yZS9RdWFydHpDb3Jl
Lmg+CisjaW1wb3J0IDxXZWJDb3JlL0FyY2hpdmVSZXNvdXJjZS5oPgorI2ltcG9ydCA8V2ViQ29y
ZS9DaHJvbWUuaD4KICNpbXBvcnQgPFdlYkNvcmUvQ3Vyc29yLmg+CisjaW1wb3J0IDxXZWJDb3Jl
L0RvY3VtZW50TG9hZGVyLmg+CiAjaW1wb3J0IDxXZWJDb3JlL0ZvY3VzQ29udHJvbGxlci5oPgog
I2ltcG9ydCA8V2ViQ29yZS9Gb3JtU3RhdGUuaD4KICNpbXBvcnQgPFdlYkNvcmUvRnJhbWUuaD4K
QEAgLTYxLDYgKzY4LDcgQEAKICNpbXBvcnQgPFdlYkNvcmUvTW91c2VFdmVudC5oPgogI2ltcG9y
dCA8V2ViQ29yZS9QYWdlLmg+CiAjaW1wb3J0IDxXZWJDb3JlL1Bhc3RlYm9hcmQuaD4KKyNpbXBv
cnQgPFdlYkNvcmUvUGx1Z2luRGF0YS5oPgogI2ltcG9ydCA8V2ViQ29yZS9QbHVnaW5Eb2N1bWVu
dC5oPgogI2ltcG9ydCA8V2ViQ29yZS9TY3JvbGxiYXJUaGVtZS5oPgogI2ltcG9ydCA8V2ViQ29y
ZS9VVUlELmg+CkBAIC0zODEsNiArMzg5LDEwMiBAQCBzdGF0aWMgY29uc3QgaW50IGRlZmF1bHRT
Y3JvbGxNYWduaXR1ZGVUaHJlc2hvbGRGb3JQYWdlRmxpcCA9IDIwOwogCiBAZW5kCiAKK3N0YXRp
YyBjb25zdCBjaGFyKiBwb3N0U2NyaXB0TUlNRVR5cGUgPSAiYXBwbGljYXRpb24vcG9zdHNjcmlw
dCI7Citjb25zdCB1aW50NjRfdCBwZGZEb2N1bWVudFJlcXVlc3RJRCA9IDE7IC8vIFBsdWdpbkNv
bnRyb2xsZXIgc3VwcG9ydHMgbG9hZGluZyBtdWx0aXBsZSBzdHJlYW1zLCBidXQgd2Ugb25seSBu
ZWVkIG9uZSBmb3IgUERGLgorCitzdGF0aWMgdm9pZCBhcHBlbmRWYWx1ZXNJblBERk5hbWVTdWJ0
cmVlVG9WZWN0b3IoQ0dQREZEaWN0aW9uYXJ5UmVmIHN1YnRyZWUsIFZlY3RvcjxDR1BERk9iamVj
dFJlZj4mIHZhbHVlcykKK3sKKyAgICBDR1BERkFycmF5UmVmIG5hbWVzOworICAgIGlmIChDR1BE
RkRpY3Rpb25hcnlHZXRBcnJheShzdWJ0cmVlLCAiTmFtZXMiLCAmbmFtZXMpKSB7CisgICAgICAg
IHNpemVfdCBuYW1lQ291bnQgPSBDR1BERkFycmF5R2V0Q291bnQobmFtZXMpIC8gMjsKKyAgICAg
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuYW1lQ291bnQ7ICsraSkgeworICAgICAgICAgICAg
Q0dQREZPYmplY3RSZWYgb2JqZWN0OworICAgICAgICAgICAgQ0dQREZBcnJheUdldE9iamVjdChu
YW1lcywgMiAqIGkgKyAxLCAmb2JqZWN0KTsKKyAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQob2Jq
ZWN0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ0dQREZBcnJh
eVJlZiBraWRzOworICAgIGlmICghQ0dQREZEaWN0aW9uYXJ5R2V0QXJyYXkoc3VidHJlZSwgIktp
ZHMiLCAma2lkcykpCisgICAgICAgIHJldHVybjsKKworICAgIHNpemVfdCBraWRDb3VudCA9IENH
UERGQXJyYXlHZXRDb3VudChraWRzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtpZENv
dW50OyArK2kpIHsKKyAgICAgICAgQ0dQREZEaWN0aW9uYXJ5UmVmIGtpZDsKKyAgICAgICAgaWYg
KCFDR1BERkFycmF5R2V0RGljdGlvbmFyeShraWRzLCBpLCAma2lkKSkKKyAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICBhcHBlbmRWYWx1ZXNJblBERk5hbWVTdWJ0cmVlVG9WZWN0b3Ioa2lk
LCB2YWx1ZXMpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZ2V0QWxsVmFsdWVzSW5QREZOYW1l
VHJlZShDR1BERkRpY3Rpb25hcnlSZWYgdHJlZSwgVmVjdG9yPENHUERGT2JqZWN0UmVmPiYgYWxs
VmFsdWVzKQoreworICAgIGFwcGVuZFZhbHVlc0luUERGTmFtZVN1YnRyZWVUb1ZlY3Rvcih0cmVl
LCBhbGxWYWx1ZXMpOworfQorCitzdGF0aWMgdm9pZCBnZXRBbGxTY3JpcHRzSW5QREZEb2N1bWVu
dChDR1BERkRvY3VtZW50UmVmIHBkZkRvY3VtZW50LCBWZWN0b3I8UmV0YWluUHRyPENGU3RyaW5n
UmVmPj4mIHNjcmlwdHMpCit7CisgICAgaWYgKCFwZGZEb2N1bWVudCkKKyAgICAgICAgcmV0dXJu
OworCisgICAgQ0dQREZEaWN0aW9uYXJ5UmVmIHBkZkNhdGFsb2cgPSBDR1BERkRvY3VtZW50R2V0
Q2F0YWxvZyhwZGZEb2N1bWVudCk7CisgICAgaWYgKCFwZGZDYXRhbG9nKQorICAgICAgICByZXR1
cm47CisKKyAgICAvLyBHZXQgdGhlIGRpY3Rpb25hcnkgb2YgYWxsIGRvY3VtZW50LWxldmVsIG5h
bWUgdHJlZXMuCisgICAgQ0dQREZEaWN0aW9uYXJ5UmVmIG5hbWVzRGljdGlvbmFyeTsKKyAgICBp
ZiAoIUNHUERGRGljdGlvbmFyeUdldERpY3Rpb25hcnkocGRmQ2F0YWxvZywgIk5hbWVzIiwgJm5h
bWVzRGljdGlvbmFyeSkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEdldCB0aGUgZG9jdW1l
bnQtbGV2ZWwgIkphdmFTY3JpcHQiIG5hbWUgdHJlZS4KKyAgICBDR1BERkRpY3Rpb25hcnlSZWYg
amF2YVNjcmlwdE5hbWVUcmVlOworICAgIGlmICghQ0dQREZEaWN0aW9uYXJ5R2V0RGljdGlvbmFy
eShuYW1lc0RpY3Rpb25hcnksICJKYXZhU2NyaXB0IiwgJmphdmFTY3JpcHROYW1lVHJlZSkpCisg
ICAgICAgIHJldHVybjsKKworICAgIC8vIFRoZSBuYW1lcyBhcmUgYXJiaXRyYXJ5LiBXZSBhcmUg
b25seSBpbnRlcmVzdGVkIGluIHRoZSB2YWx1ZXMuCisgICAgVmVjdG9yPENHUERGT2JqZWN0UmVm
PiBvYmplY3RzOworICAgIGdldEFsbFZhbHVlc0luUERGTmFtZVRyZWUoamF2YVNjcmlwdE5hbWVU
cmVlLCBvYmplY3RzKTsKKyAgICBzaXplX3Qgb2JqZWN0Q291bnQgPSBvYmplY3RzLnNpemUoKTsK
KworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb2JqZWN0Q291bnQ7ICsraSkgeworICAgICAg
ICBDR1BERkRpY3Rpb25hcnlSZWYgamF2YVNjcmlwdEFjdGlvbjsKKyAgICAgICAgaWYgKCFDR1BE
Rk9iamVjdEdldFZhbHVlKHJlaW50ZXJwcmV0X2Nhc3Q8Q0dQREZPYmplY3RSZWY+KG9iamVjdHNb
aV0pLCBrQ0dQREZPYmplY3RUeXBlRGljdGlvbmFyeSwgJmphdmFTY3JpcHRBY3Rpb24pKQorICAg
ICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gQSBKYXZhU2NyaXB0IGFjdGlvbiBtdXN0
IGhhdmUgYW4gYWN0aW9uIHR5cGUgb2YgIkphdmFTY3JpcHQiLgorICAgICAgICBjb25zdCBjaGFy
KiBhY3Rpb25UeXBlOworICAgICAgICBpZiAoIUNHUERGRGljdGlvbmFyeUdldE5hbWUoamF2YVNj
cmlwdEFjdGlvbiwgIlMiLCAmYWN0aW9uVHlwZSkgfHwgc3RyY21wKGFjdGlvblR5cGUsICJKYXZh
U2NyaXB0IikpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBjb25zdCBVSW50OCog
Ynl0ZXMgPSAwOworICAgICAgICBDRkluZGV4IGxlbmd0aDsKKyAgICAgICAgQ0dQREZTdHJlYW1S
ZWYgc3RyZWFtOworICAgICAgICBDR1BERlN0cmluZ1JlZiBzdHJpbmc7CisgICAgICAgIFJldGFp
blB0cjxDRkRhdGFSZWY+IGRhdGE7CisgICAgICAgIGlmIChDR1BERkRpY3Rpb25hcnlHZXRTdHJl
YW0oamF2YVNjcmlwdEFjdGlvbiwgIkpTIiwgJnN0cmVhbSkpIHsKKyAgICAgICAgICAgIENHUERG
RGF0YUZvcm1hdCBmb3JtYXQ7CisgICAgICAgICAgICBkYXRhID0gYWRvcHRDRihDR1BERlN0cmVh
bUNvcHlEYXRhKHN0cmVhbSwgJmZvcm1hdCkpOworICAgICAgICAgICAgaWYgKCFkYXRhKQorICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgYnl0ZXMgPSBDRkRhdGFHZXRCeXRl
UHRyKGRhdGEuZ2V0KCkpOworICAgICAgICAgICAgbGVuZ3RoID0gQ0ZEYXRhR2V0TGVuZ3RoKGRh
dGEuZ2V0KCkpOworICAgICAgICB9IGVsc2UgaWYgKENHUERGRGljdGlvbmFyeUdldFN0cmluZyhq
YXZhU2NyaXB0QWN0aW9uLCAiSlMiLCAmc3RyaW5nKSkgeworICAgICAgICAgICAgYnl0ZXMgPSBD
R1BERlN0cmluZ0dldEJ5dGVQdHIoc3RyaW5nKTsKKyAgICAgICAgICAgIGxlbmd0aCA9IENHUERG
U3RyaW5nR2V0TGVuZ3RoKHN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFieXRlcykK
KyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIENGU3RyaW5nRW5jb2RpbmcgZW5jb2Rp
bmcgPSAobGVuZ3RoID4gMSAmJiBieXRlc1swXSA9PSAweEZFICYmIGJ5dGVzWzFdID09IDB4RkYp
ID8ga0NGU3RyaW5nRW5jb2RpbmdVbmljb2RlIDoga0NGU3RyaW5nRW5jb2RpbmdVVEY4OworICAg
ICAgICBSZXRhaW5QdHI8Q0ZTdHJpbmdSZWY+IHNjcmlwdCA9IGFkb3B0Q0YoQ0ZTdHJpbmdDcmVh
dGVXaXRoQnl0ZXMoa0NGQWxsb2NhdG9yRGVmYXVsdCwgYnl0ZXMsIGxlbmd0aCwgZW5jb2Rpbmcs
IHRydWUpKTsKKyAgICAgICAgaWYgKCFzY3JpcHQpCisgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgCisgICAgICAgIHNjcmlwdHMuYXBwZW5kKHNjcmlwdCk7CisgICAgfQorfQorCiBuYW1l
c3BhY2UgV2ViS2l0IHsKIAogdXNpbmcgbmFtZXNwYWNlIEhUTUxOYW1lczsKQEAgLTM5MSw3ICs0
OTUsOSBAQCBQYXNzUmVmUHRyPFBERlBsdWdpbj4gUERGUGx1Z2luOjpjcmVhdGUoV2ViRnJhbWUq
IGZyYW1lKQogfQogCiBQREZQbHVnaW46OlBERlBsdWdpbihXZWJGcmFtZSogZnJhbWUpCi0gICAg
OiBTaW1wbGVQREZQbHVnaW4oZnJhbWUpCisgICAgOiBtX2ZyYW1lKGZyYW1lKQorICAgICwgbV9p
c1Bvc3RTY3JpcHQoZmFsc2UpCisgICAgLCBtX3BkZkRvY3VtZW50V2FzTXV0YXRlZChmYWxzZSkK
ICAgICAsIG1fY29udGFpbmVyTGF5ZXIoYWRvcHROUyhbW0NBTGF5ZXIgYWxsb2NdIGluaXRdKSkK
ICAgICAsIG1fY29udGVudExheWVyKGFkb3B0TlMoW1tDQUxheWVyIGFsbG9jXSBpbml0XSkpCiAg
ICAgLCBtX3Njcm9sbENvcm5lckxheWVyKGFkb3B0TlMoW1tXS1BERlBsdWdpblNjcm9sbGJhckxh
eWVyIGFsbG9jXSBpbml0V2l0aFBERlBsdWdpbjp0aGlzXSkpCkBAIC00MjUsOSArNTMxLDg0IEBA
IFBERlBsdWdpbjo6flBERlBsdWdpbigpCiB7CiB9CiAKK1BsdWdpbkluZm8gUERGUGx1Z2luOjpw
bHVnaW5JbmZvKCkKK3sKKyAgICBQbHVnaW5JbmZvIGluZm87CisgICAgaW5mby5uYW1lID0gYnVp
bHRJblBERlBsdWdpbk5hbWUoKTsKKyAgICBpbmZvLmlzQXBwbGljYXRpb25QbHVnaW4gPSB0cnVl
OworCisgICAgTWltZUNsYXNzSW5mbyBwZGZNaW1lQ2xhc3NJbmZvOworICAgIHBkZk1pbWVDbGFz
c0luZm8udHlwZSA9ICJhcHBsaWNhdGlvbi9wZGYiOworICAgIHBkZk1pbWVDbGFzc0luZm8uZGVz
YyA9IHBkZkRvY3VtZW50VHlwZURlc2NyaXB0aW9uKCk7CisgICAgcGRmTWltZUNsYXNzSW5mby5l
eHRlbnNpb25zLmFwcGVuZCgicGRmIik7CisgICAgaW5mby5taW1lcy5hcHBlbmQocGRmTWltZUNs
YXNzSW5mbyk7CisKKyAgICBNaW1lQ2xhc3NJbmZvIHRleHRQREZNaW1lQ2xhc3NJbmZvOworICAg
IHRleHRQREZNaW1lQ2xhc3NJbmZvLnR5cGUgPSAidGV4dC9wZGYiOworICAgIHRleHRQREZNaW1l
Q2xhc3NJbmZvLmRlc2MgPSBwZGZEb2N1bWVudFR5cGVEZXNjcmlwdGlvbigpOworICAgIHRleHRQ
REZNaW1lQ2xhc3NJbmZvLmV4dGVuc2lvbnMuYXBwZW5kKCJwZGYiKTsKKyAgICBpbmZvLm1pbWVz
LmFwcGVuZCh0ZXh0UERGTWltZUNsYXNzSW5mbyk7CisKKyAgICBNaW1lQ2xhc3NJbmZvIHBvc3RT
Y3JpcHRNaW1lQ2xhc3NJbmZvOworICAgIHBvc3RTY3JpcHRNaW1lQ2xhc3NJbmZvLnR5cGUgPSBw
b3N0U2NyaXB0TUlNRVR5cGU7CisgICAgcG9zdFNjcmlwdE1pbWVDbGFzc0luZm8uZGVzYyA9IHBv
c3RTY3JpcHREb2N1bWVudFR5cGVEZXNjcmlwdGlvbigpOworICAgIHBvc3RTY3JpcHRNaW1lQ2xh
c3NJbmZvLmV4dGVuc2lvbnMuYXBwZW5kKCJwcyIpOworICAgIGluZm8ubWltZXMuYXBwZW5kKHBv
c3RTY3JpcHRNaW1lQ2xhc3NJbmZvKTsKKyAgICAKKyAgICByZXR1cm4gaW5mbzsKK30KKwogdm9p
ZCBQREZQbHVnaW46OnVwZGF0ZVNjcm9sbGJhcnMoKQogewotICAgIFNpbXBsZVBERlBsdWdpbjo6
dXBkYXRlU2Nyb2xsYmFycygpOworICAgIGJvb2wgaGFkU2Nyb2xsYmFycyA9IG1faG9yaXpvbnRh
bFNjcm9sbGJhciB8fCBtX3ZlcnRpY2FsU2Nyb2xsYmFyOworCisgICAgaWYgKG1faG9yaXpvbnRh
bFNjcm9sbGJhcikgeworICAgICAgICBpZiAobV9zaXplLndpZHRoKCkgPj0gbV9wZGZEb2N1bWVu
dFNpemUud2lkdGgoKSkKKyAgICAgICAgICAgIGRlc3Ryb3lTY3JvbGxiYXIoSG9yaXpvbnRhbFNj
cm9sbGJhcik7CisgICAgfSBlbHNlIGlmIChtX3NpemUud2lkdGgoKSA8IG1fcGRmRG9jdW1lbnRT
aXplLndpZHRoKCkpCisgICAgICAgIG1faG9yaXpvbnRhbFNjcm9sbGJhciA9IGNyZWF0ZVNjcm9s
bGJhcihIb3Jpem9udGFsU2Nyb2xsYmFyKTsKKworICAgIGlmIChtX3ZlcnRpY2FsU2Nyb2xsYmFy
KSB7CisgICAgICAgIGlmIChtX3NpemUuaGVpZ2h0KCkgPj0gbV9wZGZEb2N1bWVudFNpemUuaGVp
Z2h0KCkpCisgICAgICAgICAgICBkZXN0cm95U2Nyb2xsYmFyKFZlcnRpY2FsU2Nyb2xsYmFyKTsK
KyAgICB9IGVsc2UgaWYgKG1fc2l6ZS5oZWlnaHQoKSA8IG1fcGRmRG9jdW1lbnRTaXplLmhlaWdo
dCgpKQorICAgICAgICBtX3ZlcnRpY2FsU2Nyb2xsYmFyID0gY3JlYXRlU2Nyb2xsYmFyKFZlcnRp
Y2FsU2Nyb2xsYmFyKTsKKworICAgIGludCBob3Jpem9udGFsU2Nyb2xsYmFySGVpZ2h0ID0gKG1f
aG9yaXpvbnRhbFNjcm9sbGJhciAmJiAhbV9ob3Jpem9udGFsU2Nyb2xsYmFyLT5pc092ZXJsYXlT
Y3JvbGxiYXIoKSkgPyBtX2hvcml6b250YWxTY3JvbGxiYXItPmhlaWdodCgpIDogMDsKKyAgICBp
bnQgdmVydGljYWxTY3JvbGxiYXJXaWR0aCA9IChtX3ZlcnRpY2FsU2Nyb2xsYmFyICYmICFtX3Zl
cnRpY2FsU2Nyb2xsYmFyLT5pc092ZXJsYXlTY3JvbGxiYXIoKSkgPyBtX3ZlcnRpY2FsU2Nyb2xs
YmFyLT53aWR0aCgpIDogMDsKKworICAgIGludCBwYWdlU3RlcCA9IG1fcGFnZUJveGVzLmlzRW1w
dHkoKSA/IDAgOiBtX3BhZ2VCb3hlc1swXS5oZWlnaHQoKTsKKworICAgIGlmIChtX2hvcml6b250
YWxTY3JvbGxiYXIpIHsKKyAgICAgICAgbV9ob3Jpem9udGFsU2Nyb2xsYmFyLT5zZXRTdGVwcyhT
Y3JvbGxiYXI6OnBpeGVsc1BlckxpbmVTdGVwKCksIHBhZ2VTdGVwKTsKKyAgICAgICAgbV9ob3Jp
em9udGFsU2Nyb2xsYmFyLT5zZXRQcm9wb3J0aW9uKG1fc2l6ZS53aWR0aCgpIC0gdmVydGljYWxT
Y3JvbGxiYXJXaWR0aCwgbV9wZGZEb2N1bWVudFNpemUud2lkdGgoKSk7CisgICAgICAgIEludFJl
Y3Qgc2Nyb2xsYmFyUmVjdChwbHVnaW5WaWV3KCktPngoKSwgcGx1Z2luVmlldygpLT55KCkgKyBt
X3NpemUuaGVpZ2h0KCkgLSBtX2hvcml6b250YWxTY3JvbGxiYXItPmhlaWdodCgpLCBtX3NpemUu
d2lkdGgoKSwgbV9ob3Jpem9udGFsU2Nyb2xsYmFyLT5oZWlnaHQoKSk7CisgICAgICAgIGlmICht
X3ZlcnRpY2FsU2Nyb2xsYmFyKQorICAgICAgICAgICAgc2Nyb2xsYmFyUmVjdC5jb250cmFjdCht
X3ZlcnRpY2FsU2Nyb2xsYmFyLT53aWR0aCgpLCAwKTsKKyAgICAgICAgbV9ob3Jpem9udGFsU2Ny
b2xsYmFyLT5zZXRGcmFtZVJlY3Qoc2Nyb2xsYmFyUmVjdCk7CisgICAgfQorICAgIGlmIChtX3Zl
cnRpY2FsU2Nyb2xsYmFyKSB7CisgICAgICAgIG1fdmVydGljYWxTY3JvbGxiYXItPnNldFN0ZXBz
KFNjcm9sbGJhcjo6cGl4ZWxzUGVyTGluZVN0ZXAoKSwgcGFnZVN0ZXApOworICAgICAgICBtX3Zl
cnRpY2FsU2Nyb2xsYmFyLT5zZXRQcm9wb3J0aW9uKG1fc2l6ZS5oZWlnaHQoKSAtIGhvcml6b250
YWxTY3JvbGxiYXJIZWlnaHQsIG1fcGRmRG9jdW1lbnRTaXplLmhlaWdodCgpKTsKKyAgICAgICAg
SW50UmVjdCBzY3JvbGxiYXJSZWN0KEludFJlY3QocGx1Z2luVmlldygpLT54KCkgKyBtX3NpemUu
d2lkdGgoKSAtIG1fdmVydGljYWxTY3JvbGxiYXItPndpZHRoKCksIHBsdWdpblZpZXcoKS0+eSgp
LCBtX3ZlcnRpY2FsU2Nyb2xsYmFyLT53aWR0aCgpLCBtX3NpemUuaGVpZ2h0KCkpKTsKKyAgICAg
ICAgaWYgKG1faG9yaXpvbnRhbFNjcm9sbGJhcikKKyAgICAgICAgICAgIHNjcm9sbGJhclJlY3Qu
Y29udHJhY3QoMCwgbV9ob3Jpem9udGFsU2Nyb2xsYmFyLT5oZWlnaHQoKSk7CisgICAgICAgIG1f
dmVydGljYWxTY3JvbGxiYXItPnNldEZyYW1lUmVjdChzY3JvbGxiYXJSZWN0KTsKKyAgICB9CisK
KyAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IG1fZnJhbWUtPmNvcmVGcmFtZSgpLT52aWV3KCk7
CisgICAgaWYgKCFmcmFtZVZpZXcpCisgICAgICAgIHJldHVybjsKKworICAgIGJvb2wgaGFzU2Ny
b2xsYmFycyA9IG1faG9yaXpvbnRhbFNjcm9sbGJhciB8fCBtX3ZlcnRpY2FsU2Nyb2xsYmFyOwor
ICAgIGlmIChoYWRTY3JvbGxiYXJzICE9IGhhc1Njcm9sbGJhcnMpIHsKKyAgICAgICAgaWYgKGhh
c1Njcm9sbGJhcnMpCisgICAgICAgICAgICBmcmFtZVZpZXctPmFkZFNjcm9sbGFibGVBcmVhKHRo
aXMpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmcmFtZVZpZXctPnJlbW92ZVNjcm9sbGFi
bGVBcmVhKHRoaXMpOworCisgICAgICAgIGZyYW1lVmlldy0+c2V0TmVlZHNMYXlvdXQoKTsKKyAg
ICB9CiAgICAgCiAgICAgaWYgKG1fdmVydGljYWxTY3JvbGxiYXJMYXllcikgewogICAgICAgICBt
X3ZlcnRpY2FsU2Nyb2xsYmFyTGF5ZXIuZ2V0KCkuZnJhbWUgPSB2ZXJ0aWNhbFNjcm9sbGJhcigp
LT5mcmFtZVJlY3QoKTsKQEAgLTQ0NSw2ICs2MjYsMTYgQEAgdm9pZCBQREZQbHVnaW46OnVwZGF0
ZVNjcm9sbGJhcnMoKQogICAgIH0KIH0KIAorUGx1Z2luVmlldyogUERGUGx1Z2luOjpwbHVnaW5W
aWV3KCkKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UGx1Z2luVmlldyo+KGNvbnRyb2xsZXIo
KSk7Cit9CisKK2NvbnN0IFBsdWdpblZpZXcqIFBERlBsdWdpbjo6cGx1Z2luVmlldygpIGNvbnN0
Cit7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IFBsdWdpblZpZXcqPihjb250cm9sbGVy
KCkpOworfQorCiBQYXNzUmVmUHRyPFNjcm9sbGJhcj4gUERGUGx1Z2luOjpjcmVhdGVTY3JvbGxi
YXIoU2Nyb2xsYmFyT3JpZW50YXRpb24gb3JpZW50YXRpb24pCiB7CiAgICAgUmVmUHRyPFNjcm9s
bGJhcj4gd2lkZ2V0ID0gU2Nyb2xsYmFyOjpjcmVhdGVOYXRpdmVTY3JvbGxiYXIodGhpcywgb3Jp
ZW50YXRpb24sIFJlZ3VsYXJTY3JvbGxiYXIpOwpAQCAtNDYyLDcgKzY1MywxNCBAQCBQYXNzUmVm
UHRyPFNjcm9sbGJhcj4gUERGUGx1Z2luOjpjcmVhdGVTY3JvbGxiYXIoU2Nyb2xsYmFyT3JpZW50
YXRpb24gb3JpZW50YXRpbwogCiB2b2lkIFBERlBsdWdpbjo6ZGVzdHJveVNjcm9sbGJhcihTY3Jv
bGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbikKIHsKLSAgICBTaW1wbGVQREZQbHVnaW46OmRl
c3Ryb3lTY3JvbGxiYXIob3JpZW50YXRpb24pOworICAgIFJlZlB0cjxTY3JvbGxiYXI+JiBzY3Jv
bGxiYXIgPSBvcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gbV9ob3Jpem9udGFs
U2Nyb2xsYmFyIDogbV92ZXJ0aWNhbFNjcm9sbGJhcjsKKyAgICBpZiAoIXNjcm9sbGJhcikKKyAg
ICAgICAgcmV0dXJuOworCisgICAgd2lsbFJlbW92ZVNjcm9sbGJhcihzY3JvbGxiYXIuZ2V0KCks
IG9yaWVudGF0aW9uKTsKKyAgICBzY3JvbGxiYXItPnJlbW92ZUZyb21QYXJlbnQoKTsKKyAgICBz
Y3JvbGxiYXItPmRpc2Nvbm5lY3RGcm9tU2Nyb2xsYWJsZUFyZWEoKTsKKyAgICBzY3JvbGxiYXIg
PSAwOwogCiAgICAgaWYgKG9yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpIHsKICAg
ICAgICAgW21faG9yaXpvbnRhbFNjcm9sbGJhckxheWVyLmdldCgpIHJlbW92ZUZyb21TdXBlcmxh
eWVyXTsKQEAgLTQ3Myw2ICs2NzEsMjI1IEBAIHZvaWQgUERGUGx1Z2luOjpkZXN0cm95U2Nyb2xs
YmFyKFNjcm9sbGJhck9yaWVudGF0aW9uIG9yaWVudGF0aW9uKQogICAgIH0KIH0KIAorSW50UmVj
dCBQREZQbHVnaW46OmNvbnZlcnRGcm9tU2Nyb2xsYmFyVG9Db250YWluaW5nVmlldyhjb25zdCBT
Y3JvbGxiYXIqIHNjcm9sbGJhciwgY29uc3QgSW50UmVjdCYgc2Nyb2xsYmFyUmVjdCkgY29uc3QK
K3sKKyAgICBJbnRSZWN0IHJlY3QgPSBzY3JvbGxiYXJSZWN0OworICAgIHJlY3QubW92ZShzY3Jv
bGxiYXItPmxvY2F0aW9uKCkgLSBwbHVnaW5WaWV3KCktPmxvY2F0aW9uKCkpOworCisgICAgcmV0
dXJuIHBsdWdpblZpZXcoKS0+ZnJhbWUoKS0+dmlldygpLT5jb252ZXJ0RnJvbVJlbmRlcmVyKHBs
dWdpblZpZXcoKS0+cmVuZGVyZXIoKSwgcmVjdCk7Cit9CisKK0ludFJlY3QgUERGUGx1Z2luOjpj
b252ZXJ0RnJvbUNvbnRhaW5pbmdWaWV3VG9TY3JvbGxiYXIoY29uc3QgU2Nyb2xsYmFyKiBzY3Jv
bGxiYXIsIGNvbnN0IEludFJlY3QmIHBhcmVudFJlY3QpIGNvbnN0Cit7CisgICAgSW50UmVjdCBy
ZWN0ID0gcGx1Z2luVmlldygpLT5mcmFtZSgpLT52aWV3KCktPmNvbnZlcnRUb1JlbmRlcmVyKHBs
dWdpblZpZXcoKS0+cmVuZGVyZXIoKSwgcGFyZW50UmVjdCk7CisgICAgcmVjdC5tb3ZlKHBsdWdp
blZpZXcoKS0+bG9jYXRpb24oKSAtIHNjcm9sbGJhci0+bG9jYXRpb24oKSk7CisKKyAgICByZXR1
cm4gcmVjdDsKK30KKworSW50UG9pbnQgUERGUGx1Z2luOjpjb252ZXJ0RnJvbVNjcm9sbGJhclRv
Q29udGFpbmluZ1ZpZXcoY29uc3QgU2Nyb2xsYmFyKiBzY3JvbGxiYXIsIGNvbnN0IEludFBvaW50
JiBzY3JvbGxiYXJQb2ludCkgY29uc3QKK3sKKyAgICBJbnRQb2ludCBwb2ludCA9IHNjcm9sbGJh
clBvaW50OworICAgIHBvaW50Lm1vdmUoc2Nyb2xsYmFyLT5sb2NhdGlvbigpIC0gcGx1Z2luVmll
dygpLT5sb2NhdGlvbigpKTsKKworICAgIHJldHVybiBwbHVnaW5WaWV3KCktPmZyYW1lKCktPnZp
ZXcoKS0+Y29udmVydEZyb21SZW5kZXJlcihwbHVnaW5WaWV3KCktPnJlbmRlcmVyKCksIHBvaW50
KTsKK30KKworSW50UG9pbnQgUERGUGx1Z2luOjpjb252ZXJ0RnJvbUNvbnRhaW5pbmdWaWV3VG9T
Y3JvbGxiYXIoY29uc3QgU2Nyb2xsYmFyKiBzY3JvbGxiYXIsIGNvbnN0IEludFBvaW50JiBwYXJl
bnRQb2ludCkgY29uc3QKK3sKKyAgICBJbnRQb2ludCBwb2ludCA9IHBsdWdpblZpZXcoKS0+ZnJh
bWUoKS0+dmlldygpLT5jb252ZXJ0VG9SZW5kZXJlcihwbHVnaW5WaWV3KCktPnJlbmRlcmVyKCks
IHBhcmVudFBvaW50KTsKKyAgICBwb2ludC5tb3ZlKHBsdWdpblZpZXcoKS0+bG9jYXRpb24oKSAt
IHNjcm9sbGJhci0+bG9jYXRpb24oKSk7CisgICAgCisgICAgcmV0dXJuIHBvaW50OworfQorCiti
b29sIFBERlBsdWdpbjo6aGFuZGxlU2Nyb2xsKFNjcm9sbERpcmVjdGlvbiBkaXJlY3Rpb24sIFNj
cm9sbEdyYW51bGFyaXR5IGdyYW51bGFyaXR5KQoreworICAgIHJldHVybiBzY3JvbGwoZGlyZWN0
aW9uLCBncmFudWxhcml0eSk7Cit9CisKK0ludFJlY3QgUERGUGx1Z2luOjpzY3JvbGxDb3JuZXJS
ZWN0KCkgY29uc3QKK3sKKyAgICBpZiAoIW1faG9yaXpvbnRhbFNjcm9sbGJhciB8fCAhbV92ZXJ0
aWNhbFNjcm9sbGJhcikKKyAgICAgICAgcmV0dXJuIEludFJlY3QoKTsKKyAgICBpZiAobV9ob3Jp
em9udGFsU2Nyb2xsYmFyLT5pc092ZXJsYXlTY3JvbGxiYXIoKSkgeworICAgICAgICBBU1NFUlQo
bV92ZXJ0aWNhbFNjcm9sbGJhci0+aXNPdmVybGF5U2Nyb2xsYmFyKCkpOworICAgICAgICByZXR1
cm4gSW50UmVjdCgpOworICAgIH0KKyAgICByZXR1cm4gSW50UmVjdChwbHVnaW5WaWV3KCktPndp
ZHRoKCkgLSBtX3ZlcnRpY2FsU2Nyb2xsYmFyLT53aWR0aCgpLCBwbHVnaW5WaWV3KCktPmhlaWdo
dCgpIC0gbV9ob3Jpem9udGFsU2Nyb2xsYmFyLT5oZWlnaHQoKSwgbV92ZXJ0aWNhbFNjcm9sbGJh
ci0+d2lkdGgoKSwgbV9ob3Jpem9udGFsU2Nyb2xsYmFyLT5oZWlnaHQoKSk7Cit9CisKK1Njcm9s
bGFibGVBcmVhKiBQREZQbHVnaW46OmVuY2xvc2luZ1Njcm9sbGFibGVBcmVhKCkgY29uc3QKK3sK
KyAgICAvLyBGSVhNRTogV2FsayB1cCB0aGUgZnJhbWUgdHJlZSBhbmQgbG9vayBmb3IgYSBzY3Jv
bGxhYmxlIHBhcmVudCBmcmFtZSBvciBSZW5kZXJMYXllci4KKyAgICByZXR1cm4gMDsKK30KKwor
SW50UmVjdCBQREZQbHVnaW46OnNjcm9sbGFibGVBcmVhQm91bmRpbmdCb3goKSBjb25zdAorewor
ICAgIHJldHVybiBwbHVnaW5WaWV3KCktPmZyYW1lUmVjdCgpOworfQorCitpbnQgUERGUGx1Z2lu
OjpzY3JvbGxTaXplKFNjcm9sbGJhck9yaWVudGF0aW9uIG9yaWVudGF0aW9uKSBjb25zdAorewor
ICAgIFNjcm9sbGJhciogc2Nyb2xsYmFyID0gKChvcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Ny
b2xsYmFyKSA/IG1faG9yaXpvbnRhbFNjcm9sbGJhciA6IG1fdmVydGljYWxTY3JvbGxiYXIpLmdl
dCgpOworICAgIHJldHVybiBzY3JvbGxiYXIgPyAoc2Nyb2xsYmFyLT50b3RhbFNpemUoKSAtIHNj
cm9sbGJhci0+dmlzaWJsZVNpemUoKSkgOiAwOworfQorCitib29sIFBERlBsdWdpbjo6aXNBY3Rp
dmUoKSBjb25zdAoreworICAgIGlmIChGcmFtZSogY29yZUZyYW1lID0gbV9mcmFtZS0+Y29yZUZy
YW1lKCkpIHsKKyAgICAgICAgaWYgKFBhZ2UqIHBhZ2UgPSBjb3JlRnJhbWUtPnBhZ2UoKSkKKyAg
ICAgICAgICAgIHJldHVybiBwYWdlLT5mb2N1c0NvbnRyb2xsZXIoKS0+aXNBY3RpdmUoKTsKKyAg
ICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2ludCBQREZQbHVnaW46OnNjcm9sbFBvc2l0
aW9uKFNjcm9sbGJhciogc2Nyb2xsYmFyKSBjb25zdAoreworICAgIGlmIChzY3JvbGxiYXItPm9y
aWVudGF0aW9uKCkgPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikKKyAgICAgICAgcmV0dXJuIG1fc2Ny
b2xsT2Zmc2V0LndpZHRoKCk7CisgICAgaWYgKHNjcm9sbGJhci0+b3JpZW50YXRpb24oKSA9PSBW
ZXJ0aWNhbFNjcm9sbGJhcikKKyAgICAgICAgcmV0dXJuIG1fc2Nyb2xsT2Zmc2V0LmhlaWdodCgp
OworICAgIEFTU0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAwOworfQorCitJbnRQb2lu
dCBQREZQbHVnaW46OnNjcm9sbFBvc2l0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gSW50UG9p
bnQobV9zY3JvbGxPZmZzZXQud2lkdGgoKSwgbV9zY3JvbGxPZmZzZXQuaGVpZ2h0KCkpOworfQor
CitJbnRQb2ludCBQREZQbHVnaW46Om1pbmltdW1TY3JvbGxQb3NpdGlvbigpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIEludFBvaW50KCk7Cit9CisKK0ludFBvaW50IFBERlBsdWdpbjo6bWF4aW11bVNj
cm9sbFBvc2l0aW9uKCkgY29uc3QKK3sKKyAgICBpbnQgaG9yaXpvbnRhbFNjcm9sbGJhckhlaWdo
dCA9IChtX2hvcml6b250YWxTY3JvbGxiYXIgJiYgIW1faG9yaXpvbnRhbFNjcm9sbGJhci0+aXNP
dmVybGF5U2Nyb2xsYmFyKCkpID8gbV9ob3Jpem9udGFsU2Nyb2xsYmFyLT5oZWlnaHQoKSA6IDA7
CisgICAgaW50IHZlcnRpY2FsU2Nyb2xsYmFyV2lkdGggPSAobV92ZXJ0aWNhbFNjcm9sbGJhciAm
JiAhbV92ZXJ0aWNhbFNjcm9sbGJhci0+aXNPdmVybGF5U2Nyb2xsYmFyKCkpID8gbV92ZXJ0aWNh
bFNjcm9sbGJhci0+d2lkdGgoKSA6IDA7CisKKyAgICBJbnRQb2ludCBtYXhpbXVtT2Zmc2V0KG1f
cGRmRG9jdW1lbnRTaXplLndpZHRoKCkgLSBtX3NpemUud2lkdGgoKSArIHZlcnRpY2FsU2Nyb2xs
YmFyV2lkdGgsIG1fcGRmRG9jdW1lbnRTaXplLmhlaWdodCgpIC0gbV9zaXplLmhlaWdodCgpICsg
aG9yaXpvbnRhbFNjcm9sbGJhckhlaWdodCk7CisgICAgbWF4aW11bU9mZnNldC5jbGFtcE5lZ2F0
aXZlVG9aZXJvKCk7CisgICAgcmV0dXJuIG1heGltdW1PZmZzZXQ7Cit9CisKK2Jvb2wgUERGUGx1
Z2luOjpzY3JvbGxiYXJzQ2FuQmVBY3RpdmUoKSBjb25zdAoreworICAgIHJldHVybiAhcGx1Z2lu
VmlldygpLT5mcmFtZSgpLT5kb2N1bWVudCgpLT5pblBhZ2VDYWNoZSgpOworfQorCit2b2lkIFBE
RlBsdWdpbjo6c2Nyb2xsYmFyU3R5bGVDaGFuZ2VkKGludCwgYm9vbCBmb3JjZVVwZGF0ZSkKK3sK
KyAgICBpZiAoIWZvcmNlVXBkYXRlKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBJZiB0aGUg
UERGIHdhcyBzY3JvbGxlZCBhbGwgdGhlIHdheSB0byBib3R0b20gcmlnaHQgYW5kIHNjcm9sbGJh
cnMgY2hhbmdlIHRvIG92ZXJsYXkgc3R5bGUsIHdlIGRvbid0IHdhbnQgdG8gZGlzcGxheSB3aGl0
ZSByZWN0YW5nbGVzIHdoZXJlIHNjcm9sbGJhcnMgd2VyZS4KKyAgICBJbnRQb2ludCBuZXdTY3Jv
bGxPZmZzZXQgPSBJbnRQb2ludChtX3Njcm9sbE9mZnNldCkuc2hydW5rVG8obWF4aW11bVNjcm9s
bFBvc2l0aW9uKCkpOworICAgIHNldFNjcm9sbE9mZnNldChuZXdTY3JvbGxPZmZzZXQpOworICAg
IAorICAgIC8vIEFzIHNpemUgb2YgdGhlIGNvbnRlbnQgYXJlYSBjaGFuZ2VzLCBzY3JvbGxiYXJz
IG1heSBuZWVkIHRvIGFwcGVhciBvciB0byBkaXNhcHBlYXIuCisgICAgdXBkYXRlU2Nyb2xsYmFy
cygpOworICAgIAorICAgIFNjcm9sbGFibGVBcmVhOjpjb250ZW50c1Jlc2l6ZWQoKTsKK30KKwor
dm9pZCBQREZQbHVnaW46OmFkZEFyY2hpdmVSZXNvdXJjZSgpCit7CisgICAgLy8gRklYTUU6IEl0
J3MgYSBoYWNrIHRvIGZvcmNlIGFkZCBhIHJlc291cmNlIHRvIERvY3VtZW50TG9hZGVyLiBQREYg
ZG9jdW1lbnRzIHNob3VsZCBqdXN0IGJlIGZldGNoZWQgYXMgQ2FjaGVkUmVzb3VyY2VzLgorCisg
ICAgLy8gQWRkIGp1c3QgZW5vdWdoIGRhdGEgZm9yIGNvbnRleHQgbWVudSBoYW5kbGluZyBhbmQg
d2ViIGFyY2hpdmVzIHRvIHdvcmsuCisgICAgUmVzb3VyY2VSZXNwb25zZSBzeW50aGVzaXplZFJl
c3BvbnNlOworICAgIHN5bnRoZXNpemVkUmVzcG9uc2Uuc2V0U3VnZ2VzdGVkRmlsZW5hbWUobV9z
dWdnZXN0ZWRGaWxlbmFtZSk7CisgICAgc3ludGhlc2l6ZWRSZXNwb25zZS5zZXRVUkwobV9zb3Vy
Y2VVUkwpOyAvLyBOZWVkcyB0byBtYXRjaCB0aGUgSGl0VGVzdFJlc3VsdDo6YWJzb2x1dGVQREZV
UkwuCisgICAgc3ludGhlc2l6ZWRSZXNwb25zZS5zZXRNaW1lVHlwZSgiYXBwbGljYXRpb24vcGRm
Iik7CisKKyAgICBSZWZQdHI8QXJjaGl2ZVJlc291cmNlPiByZXNvdXJjZSA9IEFyY2hpdmVSZXNv
dXJjZTo6Y3JlYXRlKFNoYXJlZEJ1ZmZlcjo6d3JhcENGRGF0YShtX2RhdGEuZ2V0KCkpLCBtX3Nv
dXJjZVVSTCwgImFwcGxpY2F0aW9uL3BkZiIsIFN0cmluZygpLCBTdHJpbmcoKSwgc3ludGhlc2l6
ZWRSZXNwb25zZSk7CisgICAgcGx1Z2luVmlldygpLT5mcmFtZSgpLT5kb2N1bWVudCgpLT5sb2Fk
ZXIoKS0+YWRkQXJjaGl2ZVJlc291cmNlKHJlc291cmNlLnJlbGVhc2UoKSk7Cit9CisKK3N0YXRp
YyB2b2lkIGpzUERGRG9jSW5pdGlhbGl6ZShKU0NvbnRleHRSZWYgY3R4LCBKU09iamVjdFJlZiBv
YmplY3QpCit7CisgICAgUERGUGx1Z2luKiBwZGZWaWV3ID0gc3RhdGljX2Nhc3Q8UERGUGx1Z2lu
Kj4oSlNPYmplY3RHZXRQcml2YXRlKG9iamVjdCkpOworICAgIHBkZlZpZXctPnJlZigpOworfQor
CitzdGF0aWMgdm9pZCBqc1BERkRvY0ZpbmFsaXplKEpTT2JqZWN0UmVmIG9iamVjdCkKK3sKKyAg
ICBQREZQbHVnaW4qIHBkZlZpZXcgPSBzdGF0aWNfY2FzdDxQREZQbHVnaW4qPihKU09iamVjdEdl
dFByaXZhdGUob2JqZWN0KSk7CisgICAgcGRmVmlldy0+ZGVyZWYoKTsKK30KKworSlNWYWx1ZVJl
ZiBQREZQbHVnaW46OmpzUERGRG9jUHJpbnQoSlNDb250ZXh0UmVmIGN0eCwgSlNPYmplY3RSZWYg
ZnVuY3Rpb24sIEpTT2JqZWN0UmVmIHRoaXNPYmplY3QsIHNpemVfdCBhcmd1bWVudENvdW50LCBj
b25zdCBKU1ZhbHVlUmVmIGFyZ3VtZW50c1tdLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCit7Cisg
ICAgUERGUGx1Z2luKiBwZGZWaWV3ID0gc3RhdGljX2Nhc3Q8UERGUGx1Z2luKj4oSlNPYmplY3RH
ZXRQcml2YXRlKHRoaXNPYmplY3QpKTsKKworICAgIFdlYkZyYW1lKiBmcmFtZSA9IHBkZlZpZXct
Pm1fZnJhbWU7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5k
ZWZpbmVkKGN0eCk7CisKKyAgICBGcmFtZSogY29yZUZyYW1lID0gZnJhbWUtPmNvcmVGcmFtZSgp
OworICAgIGlmICghY29yZUZyYW1lKQorICAgICAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmlu
ZWQoY3R4KTsKKworICAgIFBhZ2UqIHBhZ2UgPSBjb3JlRnJhbWUtPnBhZ2UoKTsKKyAgICBpZiAo
IXBhZ2UpCisgICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjdHgpOworCisgICAg
cGFnZS0+Y2hyb21lKCkucHJpbnQoY29yZUZyYW1lKTsKKworICAgIHJldHVybiBKU1ZhbHVlTWFr
ZVVuZGVmaW5lZChjdHgpOworfQorCitKU09iamVjdFJlZiBQREZQbHVnaW46Om1ha2VKU1BERkRv
YyhKU0NvbnRleHRSZWYgY3R4KQoreworICAgIHN0YXRpYyBKU1N0YXRpY0Z1bmN0aW9uIGpzUERG
RG9jU3RhdGljRnVuY3Rpb25zW10gPSB7CisgICAgICAgIHsgInByaW50IiwganNQREZEb2NQcmlu
dCwga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25seSB8IGtKU1Byb3BlcnR5QXR0cmlidXRlRG9u
dERlbGV0ZSB9LAorICAgICAgICB7IDAsIDAsIDAgfSwKKyAgICB9OworCisgICAgc3RhdGljIEpT
Q2xhc3NEZWZpbml0aW9uIGpzUERGRG9jQ2xhc3NEZWZpbml0aW9uID0geworICAgICAgICAwLAor
ICAgICAgICBrSlNDbGFzc0F0dHJpYnV0ZU5vbmUsCisgICAgICAgICJEb2MiLAorICAgICAgICAw
LAorICAgICAgICAwLAorICAgICAgICBqc1BERkRvY1N0YXRpY0Z1bmN0aW9ucywKKyAgICAgICAg
anNQREZEb2NJbml0aWFsaXplLCBqc1BERkRvY0ZpbmFsaXplLCAwLCAwLCAwLCAwLCAwLCAwLCAw
LCAwLCAwCisgICAgfTsKKworICAgIHN0YXRpYyBKU0NsYXNzUmVmIGpzUERGRG9jQ2xhc3MgPSBK
U0NsYXNzQ3JlYXRlKCZqc1BERkRvY0NsYXNzRGVmaW5pdGlvbik7CisKKyAgICByZXR1cm4gSlNP
YmplY3RNYWtlKGN0eCwganNQREZEb2NDbGFzcywgdGhpcyk7Cit9CisKK3N0YXRpYyBSZXRhaW5Q
dHI8Q0ZNdXRhYmxlRGF0YVJlZj4gY29udmVydFBvc3RTY3JpcHREYXRhVG9QREYoUmV0YWluUHRy
PENGRGF0YVJlZj4gcG9zdFNjcmlwdERhdGEpCit7CisgICAgLy8gQ29udmVydCBQb3N0U2NyaXB0
IHRvIFBERiB1c2luZyB0aGUgUXVhcnR6IDJEIEFQSS4KKyAgICAvLyBodHRwOi8vZGV2ZWxvcGVy
LmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL0dyYXBoaWNzSW1hZ2luZy9Db25jZXB0dWFsL2RyYXdp
bmd3aXRocXVhcnR6MmQvZHFfcHNfY29udmVydC9jaGFwdGVyXzE2X3NlY3Rpb25fMS5odG1sCisK
KyAgICBDR1BTQ29udmVydGVyQ2FsbGJhY2tzIGNhbGxiYWNrcyA9IHsgMCwgMCwgMCwgMCwgMCwg
MCwgMCwgMCB9OworICAgIFJldGFpblB0cjxDR1BTQ29udmVydGVyUmVmPiBjb252ZXJ0ZXIgPSBh
ZG9wdENGKENHUFNDb252ZXJ0ZXJDcmVhdGUoMCwgJmNhbGxiYWNrcywgMCkpOworICAgIFJldGFp
blB0cjxDR0RhdGFQcm92aWRlclJlZj4gcHJvdmlkZXIgPSBhZG9wdENGKENHRGF0YVByb3ZpZGVy
Q3JlYXRlV2l0aENGRGF0YShwb3N0U2NyaXB0RGF0YS5nZXQoKSkpOworICAgIFJldGFpblB0cjxD
Rk11dGFibGVEYXRhUmVmPiBwZGZEYXRhID0gYWRvcHRDRihDRkRhdGFDcmVhdGVNdXRhYmxlKGtD
RkFsbG9jYXRvckRlZmF1bHQsIDApKTsKKyAgICBSZXRhaW5QdHI8Q0dEYXRhQ29uc3VtZXJSZWY+
IGNvbnN1bWVyID0gYWRvcHRDRihDR0RhdGFDb25zdW1lckNyZWF0ZVdpdGhDRkRhdGEocGRmRGF0
YS5nZXQoKSkpOworICAgIAorICAgIENHUFNDb252ZXJ0ZXJDb252ZXJ0KGNvbnZlcnRlci5nZXQo
KSwgcHJvdmlkZXIuZ2V0KCksIGNvbnN1bWVyLmdldCgpLCAwKTsKKyAgICAKKyAgICByZXR1cm4g
cGRmRGF0YTsKK30KKwordm9pZCBQREZQbHVnaW46OmNvbnZlcnRQb3N0U2NyaXB0RGF0YUlmTmVl
ZGVkKCkKK3sKKyAgICBpZiAoIW1faXNQb3N0U2NyaXB0KQorICAgICAgICByZXR1cm47CisKKyAg
ICBtX3N1Z2dlc3RlZEZpbGVuYW1lID0gU3RyaW5nKG1fc3VnZ2VzdGVkRmlsZW5hbWUgKyAiLnBk
ZiIpOworICAgIG1fZGF0YSA9IGNvbnZlcnRQb3N0U2NyaXB0RGF0YVRvUERGKG1fZGF0YSk7Cit9
CisKIHZvaWQgUERGUGx1Z2luOjpwZGZEb2N1bWVudERpZExvYWQoKQogewogICAgIGFkZEFyY2hp
dmVSZXNvdXJjZSgpOwpAQCAtNTAwLDYgKzkxNyw4OSBAQCB2b2lkIFBERlBsdWdpbjo6cGRmRG9j
dW1lbnREaWRMb2FkKCkKICAgICAgICAgY3JlYXRlUGFzc3dvcmRFbnRyeUZvcm0oKTsKIH0KIAor
dm9pZCBQREZQbHVnaW46OnN0cmVhbURpZFJlY2VpdmVSZXNwb25zZSh1aW50NjRfdCBzdHJlYW1J
RCwgY29uc3QgS1VSTCYsIHVpbnQzMl90LCB1aW50MzJfdCwgY29uc3QgU3RyaW5nJiBtaW1lVHlw
ZSwgY29uc3QgU3RyaW5nJiwgY29uc3QgU3RyaW5nJiBzdWdnZXN0ZWRGaWxlbmFtZSkKK3sKKyAg
ICBBU1NFUlRfVU5VU0VEKHN0cmVhbUlELCBzdHJlYW1JRCA9PSBwZGZEb2N1bWVudFJlcXVlc3RJ
RCk7CisKKyAgICBtX3N1Z2dlc3RlZEZpbGVuYW1lID0gc3VnZ2VzdGVkRmlsZW5hbWU7CisKKyAg
ICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UobWltZVR5cGUsIHBvc3RTY3JpcHRNSU1FVHlwZSkpCisg
ICAgICAgIG1faXNQb3N0U2NyaXB0ID0gdHJ1ZTsKK30KKwordm9pZCBQREZQbHVnaW46OnN0cmVh
bURpZFJlY2VpdmVEYXRhKHVpbnQ2NF90IHN0cmVhbUlELCBjb25zdCBjaGFyKiBieXRlcywgaW50
IGxlbmd0aCkKK3sKKyAgICBBU1NFUlRfVU5VU0VEKHN0cmVhbUlELCBzdHJlYW1JRCA9PSBwZGZE
b2N1bWVudFJlcXVlc3RJRCk7CisKKyAgICBpZiAoIW1fZGF0YSkKKyAgICAgICAgbV9kYXRhID0g
YWRvcHRDRihDRkRhdGFDcmVhdGVNdXRhYmxlKDAsIDApKTsKKworICAgIENGRGF0YUFwcGVuZEJ5
dGVzKG1fZGF0YS5nZXQoKSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBVSW50OCo+KGJ5dGVzKSwg
bGVuZ3RoKTsKK30KKwordm9pZCBQREZQbHVnaW46OnN0cmVhbURpZEZpbmlzaExvYWRpbmcodWlu
dDY0X3Qgc3RyZWFtSUQpCit7CisgICAgQVNTRVJUX1VOVVNFRChzdHJlYW1JRCwgc3RyZWFtSUQg
PT0gcGRmRG9jdW1lbnRSZXF1ZXN0SUQpOworCisgICAgY29udmVydFBvc3RTY3JpcHREYXRhSWZO
ZWVkZWQoKTsKKyAgICBwZGZEb2N1bWVudERpZExvYWQoKTsKK30KKwordm9pZCBQREZQbHVnaW46
OnN0cmVhbURpZEZhaWwodWludDY0X3Qgc3RyZWFtSUQsIGJvb2wgd2FzQ2FuY2VsbGVkKQorewor
ICAgIEFTU0VSVF9VTlVTRUQoc3RyZWFtSUQsIHN0cmVhbUlEID09IHBkZkRvY3VtZW50UmVxdWVz
dElEKTsKKworICAgIG1fZGF0YS5jbGVhcigpOworfQorCit2b2lkIFBERlBsdWdpbjo6bWFudWFs
U3RyZWFtRGlkUmVjZWl2ZVJlc3BvbnNlKGNvbnN0IEtVUkwmIHJlc3BvbnNlVVJMLCB1aW50MzJf
dCBzdHJlYW1MZW5ndGgsICB1aW50MzJfdCBsYXN0TW9kaWZpZWRUaW1lLCBjb25zdCBTdHJpbmcm
IG1pbWVUeXBlLCBjb25zdCBTdHJpbmcmIGhlYWRlcnMsIGNvbnN0IFN0cmluZyYgc3VnZ2VzdGVk
RmlsZW5hbWUpCit7CisgICAgbV9zdWdnZXN0ZWRGaWxlbmFtZSA9IHN1Z2dlc3RlZEZpbGVuYW1l
OworCisgICAgaWYgKGVxdWFsSWdub3JpbmdDYXNlKG1pbWVUeXBlLCBwb3N0U2NyaXB0TUlNRVR5
cGUpKQorICAgICAgICBtX2lzUG9zdFNjcmlwdCA9IHRydWU7Cit9CisKK3ZvaWQgUERGUGx1Z2lu
OjptYW51YWxTdHJlYW1EaWRSZWNlaXZlRGF0YShjb25zdCBjaGFyKiBieXRlcywgaW50IGxlbmd0
aCkKK3sKKyAgICBpZiAoIW1fZGF0YSkKKyAgICAgICAgbV9kYXRhID0gYWRvcHRDRihDRkRhdGFD
cmVhdGVNdXRhYmxlKDAsIDApKTsKKworICAgIENGRGF0YUFwcGVuZEJ5dGVzKG1fZGF0YS5nZXQo
KSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBVSW50OCo+KGJ5dGVzKSwgbGVuZ3RoKTsKK30KKwor
dm9pZCBQREZQbHVnaW46Om1hbnVhbFN0cmVhbURpZEZpbmlzaExvYWRpbmcoKQoreworICAgIGNv
bnZlcnRQb3N0U2NyaXB0RGF0YUlmTmVlZGVkKCk7CisgICAgcGRmRG9jdW1lbnREaWRMb2FkKCk7
Cit9CisKK3ZvaWQgUERGUGx1Z2luOjptYW51YWxTdHJlYW1EaWRGYWlsKGJvb2wpCit7CisgICAg
bV9kYXRhLmNsZWFyKCk7Cit9CisKK3ZvaWQgUERGUGx1Z2luOjpydW5TY3JpcHRzSW5QREZEb2N1
bWVudCgpCit7CisgICAgVmVjdG9yPFJldGFpblB0cjxDRlN0cmluZ1JlZj4+IHNjcmlwdHM7Cisg
ICAgZ2V0QWxsU2NyaXB0c0luUERGRG9jdW1lbnQoW21fcGRmRG9jdW1lbnQuZ2V0KCkgZG9jdW1l
bnRSZWZdLCBzY3JpcHRzKTsKKworICAgIHNpemVfdCBzY3JpcHRDb3VudCA9IHNjcmlwdHMuc2l6
ZSgpOworICAgIGlmICghc2NyaXB0Q291bnQpCisgICAgICAgIHJldHVybjsKKworICAgIEpTR2xv
YmFsQ29udGV4dFJlZiBjdHggPSBKU0dsb2JhbENvbnRleHRDcmVhdGUoMCk7CisgICAgSlNPYmpl
Y3RSZWYganNQREZEb2MgPSBtYWtlSlNQREZEb2MoY3R4KTsKKworICAgIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgc2NyaXB0Q291bnQ7ICsraSkgeworICAgICAgICBKU1N0cmluZ1JlZiBzY3JpcHQg
PSBKU1N0cmluZ0NyZWF0ZVdpdGhDRlN0cmluZyhzY3JpcHRzW2ldLmdldCgpKTsKKyAgICAgICAg
SlNFdmFsdWF0ZVNjcmlwdChjdHgsIHNjcmlwdCwganNQREZEb2MsIDAsIDAsIDApOworICAgICAg
ICBKU1N0cmluZ1JlbGVhc2Uoc2NyaXB0KTsKKyAgICB9CisgICAgCisgICAgSlNHbG9iYWxDb250
ZXh0UmVsZWFzZShjdHgpOworfQorCiB2b2lkIFBERlBsdWdpbjo6Y3JlYXRlUGFzc3dvcmRFbnRy
eUZvcm0oKQogewogICAgIG1fcGFzc3dvcmRGaWVsZCA9IFBERlBsdWdpblBhc3N3b3JkRmllbGQ6
OmNyZWF0ZShtX3BkZkxheWVyQ29udHJvbGxlci5nZXQoKSwgdGhpcyk7CkBAIC01MzIsNiArMTAz
MiwyMCBAQCB2b2lkIFBERlBsdWdpbjo6Y29udGVudHNTY2FsZUZhY3RvckNoYW5nZWQoZmxvYXQp
CiAgICAgdXBkYXRlUGFnZUFuZERldmljZVNjYWxlRmFjdG9ycygpOwogfQogCit2b2lkIFBERlBs
dWdpbjo6Y29tcHV0ZVBhZ2VCb3hlcygpCit7CisgICAgc2l6ZV90IHBhZ2VDb3VudCA9IENHUERG
RG9jdW1lbnRHZXROdW1iZXJPZlBhZ2VzKFttX3BkZkRvY3VtZW50LmdldCgpIGRvY3VtZW50UmVm
XSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYWdlQ291bnQ7ICsraSkgeworICAgICAg
ICBDR1BERlBhZ2VSZWYgcGRmUGFnZSA9IENHUERGRG9jdW1lbnRHZXRQYWdlKFttX3BkZkRvY3Vt
ZW50LmdldCgpIGRvY3VtZW50UmVmXSwgaSArIDEpOworICAgICAgICBBU1NFUlQocGRmUGFnZSk7
CisKKyAgICAgICAgQ0dSZWN0IGJveCA9IENHUERGUGFnZUdldEJveFJlY3QocGRmUGFnZSwga0NH
UERGQ3JvcEJveCk7CisgICAgICAgIGlmIChDR1JlY3RJc0VtcHR5KGJveCkpCisgICAgICAgICAg
ICBib3ggPSBDR1BERlBhZ2VHZXRCb3hSZWN0KHBkZlBhZ2UsIGtDR1BERk1lZGlhQm94KTsKKyAg
ICAgICAgbV9wYWdlQm94ZXMuYXBwZW5kKEludFJlY3QoYm94KSk7CisgICAgfQorfQorCiB2b2lk
IFBERlBsdWdpbjo6Y2FsY3VsYXRlU2l6ZXMoKQogewogICAgIGlmIChbcGRmRG9jdW1lbnQoKSBp
c0xvY2tlZF0pIHsKQEAgLTU0NSw2ICsxMDU5LDE2IEBAIHZvaWQgUERGUGx1Z2luOjpjYWxjdWxh
dGVTaXplcygpCiAgICAgc2V0UERGRG9jdW1lbnRTaXplKEludFNpemUoW21fcGRmTGF5ZXJDb250
cm9sbGVyLmdldCgpIGNvbnRlbnRTaXplUmVzcGVjdGluZ1pvb21dKSk7CiB9CiAKK2Jvb2wgUERG
UGx1Z2luOjppbml0aWFsaXplKGNvbnN0IFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMpCit7CisgICAg
bV9zb3VyY2VVUkwgPSBwYXJhbWV0ZXJzLnVybDsKKyAgICBpZiAoIXBhcmFtZXRlcnMuc2hvdWxk
VXNlTWFudWFsTG9hZGVyICYmICFwYXJhbWV0ZXJzLnVybC5pc0VtcHR5KCkpCisgICAgICAgIGNv
bnRyb2xsZXIoKS0+bG9hZFVSTChwZGZEb2N1bWVudFJlcXVlc3RJRCwgIkdFVCIsIHBhcmFtZXRl
cnMudXJsLnN0cmluZygpLCBTdHJpbmcoKSwgSFRUUEhlYWRlck1hcCgpLCBWZWN0b3I8dWludDhf
dD4oKSwgZmFsc2UpOworCisgICAgY29udHJvbGxlcigpLT5kaWRJbml0aWFsaXplUGx1Z2luKCk7
CisgICAgcmV0dXJuIHRydWU7Cit9CisKIHZvaWQgUERGUGx1Z2luOjpkZXN0cm95KCkKIHsKICAg
ICBtX3BkZkxheWVyQ29udHJvbGxlci5nZXQoKS5kZWxlZ2F0ZSA9IDA7CkBAIC01NjQsMTAgKzEw
ODgsMTcgQEAgdm9pZCBQREZQbHVnaW46OmRlc3Ryb3koKQogICAgIFttX2NvbnRlbnRMYXllci5n
ZXQoKSByZW1vdmVGcm9tU3VwZXJsYXllcl07CiB9CiAKLXZvaWQgUERGUGx1Z2luOjpwYWludChH
cmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgSW50UmVjdCYgZGlydHlSZWN0
KQordm9pZCBQREZQbHVnaW46OnVwZGF0ZUNvbnRyb2xUaW50cyhHcmFwaGljc0NvbnRleHQqIGdy
YXBoaWNzQ29udGV4dCkKIHsKKyAgICBBU1NFUlQoZ3JhcGhpY3NDb250ZXh0LT51cGRhdGluZ0Nv
bnRyb2xUaW50cygpKTsKKworICAgIGlmIChtX2hvcml6b250YWxTY3JvbGxiYXIpCisgICAgICAg
IG1faG9yaXpvbnRhbFNjcm9sbGJhci0+aW52YWxpZGF0ZSgpOworICAgIGlmIChtX3ZlcnRpY2Fs
U2Nyb2xsYmFyKQorICAgICAgICBtX3ZlcnRpY2FsU2Nyb2xsYmFyLT5pbnZhbGlkYXRlKCk7Cisg
ICAgaW52YWxpZGF0ZVNjcm9sbENvcm5lcihzY3JvbGxDb3JuZXJSZWN0KCkpOwogfQotICAgIAor
CiB2b2lkIFBERlBsdWdpbjo6cGFpbnRDb250cm9sRm9yTGF5ZXJJbkNvbnRleHQoQ0FMYXllciAq
bGF5ZXIsIENHQ29udGV4dFJlZiBjb250ZXh0KQogewogICAgIEdyYXBoaWNzQ29udGV4dCBncmFw
aGljc0NvbnRleHQoY29udGV4dCk7CkBAIC02NjcsNyArMTE5OCw3IEBAIHZvaWQgUERGUGx1Z2lu
OjpnZW9tZXRyeURpZENoYW5nZShjb25zdCBJbnRTaXplJiBwbHVnaW5TaXplLCBjb25zdCBJbnRS
ZWN0JiwgY29uCiAgICAgaWYgKHNpemUoKSA9PSBwbHVnaW5TaXplICYmIHBsdWdpblZpZXcoKS0+
cGFnZVNjYWxlRmFjdG9yKCkgPT0gW21fcGRmTGF5ZXJDb250cm9sbGVyLmdldCgpIGNvbnRlbnRT
Y2FsZUZhY3Rvcl0pCiAgICAgICAgIHJldHVybjsKIAotICAgIHNldFNpemUocGx1Z2luU2l6ZSk7
CisgICAgbV9zaXplID0gcGx1Z2luU2l6ZTsKICAgICBtX3Jvb3RWaWV3VG9QbHVnaW5UcmFuc2Zv
cm0gPSBwbHVnaW5Ub1Jvb3RWaWV3VHJhbnNmb3JtLmludmVyc2UoKTsKICAgICBbbV9wZGZMYXll
ckNvbnRyb2xsZXIuZ2V0KCkgc2V0RnJhbWVTaXplOnBsdWdpblNpemVdOwogCkBAIC02OTcsNiAr
MTIyOCwyMiBAQCB2b2lkIFBERlBsdWdpbjo6Z2VvbWV0cnlEaWRDaGFuZ2UoY29uc3QgSW50U2l6
ZSYgcGx1Z2luU2l6ZSwgY29uc3QgSW50UmVjdCYsIGNvbgogICAgIFttX2NvbnRlbnRMYXllci5n
ZXQoKSBzZXRTdWJsYXllclRyYW5zZm9ybTp0cmFuc2Zvcm1dOwogICAgIFtDQVRyYW5zYWN0aW9u
IGNvbW1pdF07CiB9CisKK3ZvaWQgUERGUGx1Z2luOjpmcmFtZURpZEZpbmlzaExvYWRpbmcodWlu
dDY0X3QpCit7CisgICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Cit9CisKK3ZvaWQgUERGUGx1Z2lu
OjpmcmFtZURpZEZhaWwodWludDY0X3QsIGJvb2wpCit7CisgICAgQVNTRVJUX05PVF9SRUFDSEVE
KCk7Cit9CisKK3ZvaWQgUERGUGx1Z2luOjpkaWRFdmFsdWF0ZUphdmFTY3JpcHQodWludDY0X3Qs
IGNvbnN0IFdURjo6U3RyaW5nJikKK3sKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKK30KKwog
ICAgIAogc3RhdGljIE5TVUludGVnZXIgbW9kaWZpZXJGbGFnc0Zyb21XZWJFdmVudChjb25zdCBX
ZWJFdmVudCYgZXZlbnQpCiB7CkBAIC0xMDQ2LDYgKzE1OTMsMTYgQEAgdm9pZCBQREZQbHVnaW46
Om5vdGlmeURpc3BsYXlNb2RlQ2hhbmdlZChpbnQpCiAgICAgdXBkYXRlU2Nyb2xsYmFycygpOwog
fQogCitQYXNzUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gUERGUGx1Z2luOjpsaXZlUmVzb3VyY2VEYXRh
KCkgY29uc3QKK3sKKyAgICBOU0RhdGEgKnBkZkRhdGEgPSBsaXZlRGF0YSgpOworCisgICAgaWYg
KCFwZGZEYXRhKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBTaGFyZWRCdWZmZXI6
OndyYXBOU0RhdGEocGRmRGF0YSk7Cit9CisKIHZvaWQgUERGUGx1Z2luOjpzYXZlVG9QREYoKQog
ewogICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgcHJvYmFibHkgbm90aWZ5IHRoZSB1c2VyIHRoYXQg
dGhleSBjYW4ndCBzYXZlIGJlZm9yZSB0aGUgZG9jdW1lbnQgaXMgZmluaXNoZWQgbG9hZGluZy4K
QEAgLTEwNTQsNyArMTYxMSw3IEBAIHZvaWQgUERGUGx1Z2luOjpzYXZlVG9QREYoKQogICAgICAg
ICByZXR1cm47CiAKICAgICBOU0RhdGEgKmRhdGEgPSBsaXZlRGF0YSgpOwotICAgIHdlYkZyYW1l
KCktPnBhZ2UoKS0+c2F2ZVBERlRvRmlsZUluRG93bmxvYWRzRm9sZGVyKHN1Z2dlc3RlZEZpbGVu
YW1lKCksIHdlYkZyYW1lKCktPnVybCgpLCBzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFy
ICo+KFtkYXRhIGJ5dGVzXSksIFtkYXRhIGxlbmd0aF0pOworICAgIHdlYkZyYW1lKCktPnBhZ2Uo
KS0+c2F2ZVBERlRvRmlsZUluRG93bmxvYWRzRm9sZGVyKG1fc3VnZ2VzdGVkRmlsZW5hbWUsIHdl
YkZyYW1lKCktPnVybCgpLCBzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyICo+KFtkYXRh
IGJ5dGVzXSksIFtkYXRhIGxlbmd0aF0pOwogfQogCiB2b2lkIFBERlBsdWdpbjo6b3BlbldpdGhO
YXRpdmVBcHBsaWNhdGlvbigpCkBAIC0xMDcwLDcgKzE2MjcsNyBAQCB2b2lkIFBERlBsdWdpbjo6
b3BlbldpdGhOYXRpdmVBcHBsaWNhdGlvbigpCiAgICAgICAgIG1fdGVtcG9yYXJ5UERGVVVJRCA9
IFdlYkNvcmU6OmNyZWF0ZUNhbm9uaWNhbFVVSURTdHJpbmcoKTsKICAgICAgICAgQVNTRVJUKG1f
dGVtcG9yYXJ5UERGVVVJRCk7CiAKLSAgICAgICAgd2ViRnJhbWUoKS0+cGFnZSgpLT5zYXZlUERG
VG9UZW1wb3JhcnlGb2xkZXJBbmRPcGVuV2l0aE5hdGl2ZUFwcGxpY2F0aW9uKHN1Z2dlc3RlZEZp
bGVuYW1lKCksIHdlYkZyYW1lKCktPnVybCgpLCBzdGF0aWNfY2FzdDxjb25zdCB1bnNpZ25lZCBj
aGFyICo+KFtkYXRhIGJ5dGVzXSksIFtkYXRhIGxlbmd0aF0sIG1fdGVtcG9yYXJ5UERGVVVJRCk7
CisgICAgICAgIHdlYkZyYW1lKCktPnBhZ2UoKS0+c2F2ZVBERlRvVGVtcG9yYXJ5Rm9sZGVyQW5k
T3BlbldpdGhOYXRpdmVBcHBsaWNhdGlvbihtX3N1Z2dlc3RlZEZpbGVuYW1lLCB3ZWJGcmFtZSgp
LT51cmwoKSwgc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhciAqPihbZGF0YSBieXRlc10p
LCBbZGF0YSBsZW5ndGhdLCBtX3RlbXBvcmFyeVBERlVVSUQpOwogICAgICAgICByZXR1cm47CiAg
ICAgfQogCkBAIC0xMjYxLDcgKzE4MTgsNyBAQCBib29sIFBERlBsdWdpbjo6aGFuZGxlV2hlZWxF
dmVudChjb25zdCBXZWJXaGVlbEV2ZW50JiBldmVudCkKICAgICBQREZEaXNwbGF5TW9kZSBkaXNw
bGF5TW9kZSA9IFttX3BkZkxheWVyQ29udHJvbGxlci5nZXQoKSBkaXNwbGF5TW9kZV07CiAKICAg
ICBpZiAoZGlzcGxheU1vZGUgPT0ga1BERkRpc3BsYXlTaW5nbGVQYWdlQ29udGludW91cyB8fCBk
aXNwbGF5TW9kZSA9PSBrUERGRGlzcGxheVR3b1VwQ29udGludW91cykKLSAgICAgICAgcmV0dXJu
IFNpbXBsZVBERlBsdWdpbjo6aGFuZGxlV2hlZWxFdmVudChldmVudCk7CisgICAgICAgIHJldHVy
biBTY3JvbGxhYmxlQXJlYTo6aGFuZGxlV2hlZWxFdmVudChwbGF0Zm9ybShldmVudCkpOwogCiAg
ICAgTlNVSW50ZWdlciBjdXJyZW50UGFnZUluZGV4ID0gW21fcGRmTGF5ZXJDb250cm9sbGVyLmdl
dCgpIGN1cnJlbnRQYWdlSW5kZXhdOwogICAgIGJvb2wgaW5GaXJzdFBhZ2UgPSBjdXJyZW50UGFn
ZUluZGV4ID09IDA7CkBAIC0xMjkyLDcgKzE4NDksNyBAQCBib29sIFBERlBsdWdpbjo6aGFuZGxl
V2hlZWxFdmVudChjb25zdCBXZWJXaGVlbEV2ZW50JiBldmVudCkKICAgICAgICAgcmV0dXJuIHRy
dWU7CiAgICAgfQogCi0gICAgcmV0dXJuIFNpbXBsZVBERlBsdWdpbjo6aGFuZGxlV2hlZWxFdmVu
dChldmVudCk7CisgICAgcmV0dXJuIFNjcm9sbGFibGVBcmVhOjpoYW5kbGVXaGVlbEV2ZW50KHBs
YXRmb3JtKGV2ZW50KSk7CiB9CiAKIE5TRGF0YSAqUERGUGx1Z2luOjpsaXZlRGF0YSgpIGNvbnN0
CkBAIC0xMzAwLDcgKzE4NTcsMTIgQEAgTlNEYXRhICpQREZQbHVnaW46OmxpdmVEYXRhKCkgY29u
c3QKICAgICBpZiAobV9hY3RpdmVBbm5vdGF0aW9uKQogICAgICAgICBtX2FjdGl2ZUFubm90YXRp
b24tPmNvbW1pdCgpOwogCi0gICAgcmV0dXJuIFNpbXBsZVBERlBsdWdpbjo6bGl2ZURhdGEoKTsK
KyAgICAvLyBTYXZlIGRhdGEgc3RyYWlnaHQgZnJvbSB0aGUgcmVzb3VyY2UgaW5zdGVhZCBvZiBQ
REZLaXQgaWYgdGhlIGRvY3VtZW50IGlzCisgICAgLy8gdW50b3VjaGVkIGJ5IHRoZSB1c2VyLCBz
byB0aGF0IFBERnMgd2hpY2ggUERGS2l0IGNhbid0IGRpc3BsYXkgd2lsbCBzdGlsbCBiZSBkb3du
bG9hZGFibGUuCisgICAgaWYgKG1fcGRmRG9jdW1lbnRXYXNNdXRhdGVkKQorICAgICAgICByZXR1
cm4gW21fcGRmRG9jdW1lbnQuZ2V0KCkgZGF0YVJlcHJlc2VudGF0aW9uXTsKKyAgICBlbHNlCisg
ICAgICAgIHJldHVybiByYXdEYXRhKCk7CiB9CiAKIE5TT2JqZWN0ICpQREZQbHVnaW46OmFjY2Vz
c2liaWxpdHlPYmplY3QoKSBjb25zdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYktpdDIvV2ViUHJv
Y2Vzcy9QbHVnaW5zL1BERi9TaW1wbGVQREZQbHVnaW4uaCBiL1NvdXJjZS9XZWJLaXQyL1dlYlBy
b2Nlc3MvUGx1Z2lucy9QREYvU2ltcGxlUERGUGx1Z2luLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDFkOWU5N2MuLjAwMDAwMDAKLS0tIGEvU291cmNlL1dlYktpdDIvV2ViUHJvY2Vz
cy9QbHVnaW5zL1BERi9TaW1wbGVQREZQbHVnaW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNyAr
MCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExLCAyMDEyIEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1l
dDoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQotICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5Z
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKLSAqIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUgotICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4KLSAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRlZiBTaW1wbGVQREZQbHVnaW5faAotI2Rl
ZmluZSBTaW1wbGVQREZQbHVnaW5faAotCi0jaW5jbHVkZSAiUGx1Z2luLmgiCi0jaW5jbHVkZSA8
V2ViQ29yZS9TY3JvbGxhYmxlQXJlYS5oPgotI2luY2x1ZGUgPHd0Zi9SZXRhaW5QdHIuaD4KLQot
dHlwZWRlZiBjb25zdCBzdHJ1Y3QgT3BhcXVlSlNDb250ZXh0KiBKU0NvbnRleHRSZWY7Ci10eXBl
ZGVmIHN0cnVjdCBPcGFxdWVKU1ZhbHVlKiBKU09iamVjdFJlZjsKLXR5cGVkZWYgY29uc3Qgc3Ry
dWN0IE9wYXF1ZUpTVmFsdWUqIEpTVmFsdWVSZWY7Ci0KLU9CSkNfQ0xBU1MgTlNEYXRhOwotCi1u
YW1lc3BhY2UgV2ViQ29yZSB7Ci1zdHJ1Y3QgUGx1Z2luSW5mbzsKLX0KLQotbmFtZXNwYWNlIFdl
YktpdCB7Ci0KLWNsYXNzIFBsdWdpblZpZXc7Ci1jbGFzcyBXZWJGcmFtZTsKLQotY2xhc3MgU2lt
cGxlUERGUGx1Z2luIDogcHVibGljIFBsdWdpbiwgcHJvdGVjdGVkIFdlYkNvcmU6OlNjcm9sbGFi
bGVBcmVhIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgUGFzc1JlZlB0cjxTaW1wbGVQREZQbHVnaW4+
IGNyZWF0ZShXZWJGcmFtZSopOwotICAgIH5TaW1wbGVQREZQbHVnaW4oKTsKLQotICAgIHN0YXRp
YyBXZWJDb3JlOjpQbHVnaW5JbmZvIHBsdWdpbkluZm8oKTsKLQotICAgIC8vIEluLXByb2Nlc3Mg
UERGVmlld3MgZG9uJ3Qgc3VwcG9ydCBhc3luY2hyb25vdXMgaW5pdGlhbGl6YXRpb24uCi0gICAg
dmlydHVhbCBib29sIGlzQmVpbmdBc3luY2hyb25vdXNseUluaXRpYWxpemVkKCkgY29uc3QgeyBy
ZXR1cm4gZmFsc2U7IH0KLQotICAgIHZvaWQgZGlkTXV0YXRlUERGRG9jdW1lbnQoKSB7IG1fcGRm
RG9jdW1lbnRXYXNNdXRhdGVkID0gdHJ1ZTsgfQotICAgIAotICAgIFdlYkNvcmU6OkludFNpemUg
c2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgZXhwbGlj
aXQgU2ltcGxlUERGUGx1Z2luKFdlYkZyYW1lKik7Ci0KLSAgICBXZWJGcmFtZSogd2ViRnJhbWUo
KSBjb25zdCB7IHJldHVybiBtX2ZyYW1lOyB9Ci0KLSAgICB2b2lkIHNldFNpemUoV2ViQ29yZTo6
SW50U2l6ZSBzaXplKSB7IG1fc2l6ZSA9IHNpemU7IH0KLQotICAgIFJldGFpblB0cjxQREZEb2N1
bWVudD4gcGRmRG9jdW1lbnQoKSBjb25zdCB7IHJldHVybiBtX3BkZkRvY3VtZW50OyB9Ci0gICAg
dm9pZCBzZXRQREZEb2N1bWVudChSZXRhaW5QdHI8UERGRG9jdW1lbnQ+IGRvY3VtZW50KSB7IG1f
cGRmRG9jdW1lbnQgPSBkb2N1bWVudDsgfQotCi0gICAgV2ViQ29yZTo6SW50U2l6ZSBwZGZEb2N1
bWVudFNpemUoKSBjb25zdCB7IHJldHVybiBtX3BkZkRvY3VtZW50U2l6ZTsgfQotICAgIHZvaWQg
c2V0UERGRG9jdW1lbnRTaXplKFdlYkNvcmU6OkludFNpemUgc2l6ZSkgeyBtX3BkZkRvY3VtZW50
U2l6ZSA9IHNpemU7IH0KLQotICAgIGNvbnN0IFN0cmluZyYgc3VnZ2VzdGVkRmlsZW5hbWUoKSB7
IHJldHVybiBtX3N1Z2dlc3RlZEZpbGVuYW1lOyB9Ci0gICAgCi0gICAgdmlydHVhbCBOU0RhdGEg
KmxpdmVEYXRhKCkgY29uc3Q7Ci0gICAgTlNEYXRhICpyYXdEYXRhKCkgY29uc3QgeyByZXR1cm4g
KE5TRGF0YSAqKW1fZGF0YS5nZXQoKTsgfQotCi0gICAgYm9vbCBwZGZEb2N1bWVudFdhc011dGF0
ZWQoKSBjb25zdCB7IHJldHVybiBtX3BkZkRvY3VtZW50V2FzTXV0YXRlZDsgfQotCi0gICAgLy8g
UmVndWxhciBwbHVnLWlucyBkb24ndCBuZWVkIGFjY2VzcyB0byB2aWV3LCBidXQgd2UgYWRkIHNj
cm9sbGJhcnMgdG8gZW1iZWRkaW5nIEZyYW1lVmlldyBmb3IgcHJvcGVyIGV2ZW50IGhhbmRsaW5n
LgotICAgIFBsdWdpblZpZXcqIHBsdWdpblZpZXcoKTsKLSAgICBjb25zdCBQbHVnaW5WaWV3KiBw
bHVnaW5WaWV3KCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlU2Nyb2xsYmFycygp
OwotICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxXZWJDb3JlOjpTY3JvbGxiYXI+IGNyZWF0ZVNjcm9s
bGJhcihXZWJDb3JlOjpTY3JvbGxiYXJPcmllbnRhdGlvbik7Ci0gICAgdmlydHVhbCB2b2lkIGRl
c3Ryb3lTY3JvbGxiYXIoV2ViQ29yZTo6U2Nyb2xsYmFyT3JpZW50YXRpb24pOwotICAgIHZpcnR1
YWwgdm9pZCBhZGRBcmNoaXZlUmVzb3VyY2UoKTsKLSAgICB2aXJ0dWFsIHZvaWQgcGRmRG9jdW1l
bnREaWRMb2FkKCk7Ci0gICAgdmlydHVhbCB2b2lkIGNvbXB1dGVQYWdlQm94ZXMoKTsKLSAgICB2
aXJ0dWFsIHZvaWQgY2FsY3VsYXRlU2l6ZXMoKTsKLSAgICB2b2lkIHBhaW50QmFja2dyb3VuZChX
ZWJDb3JlOjpHcmFwaGljc0NvbnRleHQqLCBjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiBkaXJ0eVJl
Y3QpOwotICAgIHZvaWQgcGFpbnRDb250ZW50KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dCosIGNv
bnN0IFdlYkNvcmU6OkludFJlY3QmIGRpcnR5UmVjdCk7Ci0gICAgdm9pZCBwYWludENvbnRyb2xz
KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dCosIGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIGRpcnR5
UmVjdCk7Ci0gICAgCi0gICAgdm9pZCBydW5TY3JpcHRzSW5QREZEb2N1bWVudCgpOwotCi0gICAg
Ly8gUGx1Zy1pbiBtZXRob2RzCi0gICAgdmlydHVhbCBib29sIGluaXRpYWxpemUoY29uc3QgUGFy
YW1ldGVycyYpOwotICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95KCk7Ci0gICAgdmlydHVhbCB2b2lk
IHBhaW50KFdlYkNvcmU6OkdyYXBoaWNzQ29udGV4dCosIGNvbnN0IFdlYkNvcmU6OkludFJlY3Qm
IGRpcnR5UmVjdEluV2luZG93Q29vcmRpbmF0ZXMpOwotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVD
b250cm9sVGludHMoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0Kik7Ci0gICAgdmlydHVhbCBib29s
IHN1cHBvcnRzU25hcHNob3R0aW5nKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICB2aXJ0
dWFsIFBhc3NSZWZQdHI8U2hhcmVhYmxlQml0bWFwPiBzbmFwc2hvdCgpOwotI2lmIFBMQVRGT1JN
KE1BQykKLSAgICB2aXJ0dWFsIFBsYXRmb3JtTGF5ZXIqIHBsdWdpbkxheWVyKCk7Ci0jZW5kaWYK
LSAgICB2aXJ0dWFsIGJvb2wgaXNUcmFuc3BhcmVudCgpOwotICAgIHZpcnR1YWwgYm9vbCB3YW50
c1doZWVsRXZlbnRzKCkgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCB2b2lkIGdlb21ldHJ5RGlkQ2hh
bmdlKGNvbnN0IFdlYkNvcmU6OkludFNpemUmIHBsdWdpblNpemUsIGNvbnN0IFdlYkNvcmU6Oklu
dFJlY3QmIGNsaXBSZWN0LCBjb25zdCBXZWJDb3JlOjpBZmZpbmVUcmFuc2Zvcm0mIHBsdWdpblRv
Um9vdFZpZXdUcmFuc2Zvcm0pOwotICAgIHZpcnR1YWwgdm9pZCB2aXNpYmlsaXR5RGlkQ2hhbmdl
KCk7Ci0gICAgdmlydHVhbCB2b2lkIGZyYW1lRGlkRmluaXNoTG9hZGluZyh1aW50NjRfdCByZXF1
ZXN0SUQpOwotICAgIHZpcnR1YWwgdm9pZCBmcmFtZURpZEZhaWwodWludDY0X3QgcmVxdWVzdElE
LCBib29sIHdhc0NhbmNlbGxlZCk7Ci0gICAgdmlydHVhbCB2b2lkIGRpZEV2YWx1YXRlSmF2YVNj
cmlwdCh1aW50NjRfdCByZXF1ZXN0SUQsIGNvbnN0IFN0cmluZyYgcmVzdWx0KTsKLSAgICB2aXJ0
dWFsIHZvaWQgc3RyZWFtRGlkUmVjZWl2ZVJlc3BvbnNlKHVpbnQ2NF90IHN0cmVhbUlELCBjb25z
dCBXZWJDb3JlOjpLVVJMJiByZXNwb25zZVVSTCwgdWludDMyX3Qgc3RyZWFtTGVuZ3RoLCB1aW50
MzJfdCBsYXN0TW9kaWZpZWRUaW1lLCBjb25zdCBTdHJpbmcmIG1pbWVUeXBlLCBjb25zdCBTdHJp
bmcmIGhlYWRlcnMsIGNvbnN0IFN0cmluZyYgc3VnZ2VzdGVkRmlsZU5hbWUpOwotICAgIHZpcnR1
YWwgdm9pZCBzdHJlYW1EaWRSZWNlaXZlRGF0YSh1aW50NjRfdCBzdHJlYW1JRCwgY29uc3QgY2hh
ciogYnl0ZXMsIGludCBsZW5ndGgpOwotICAgIHZpcnR1YWwgdm9pZCBzdHJlYW1EaWRGaW5pc2hM
b2FkaW5nKHVpbnQ2NF90IHN0cmVhbUlEKTsKLSAgICB2aXJ0dWFsIHZvaWQgc3RyZWFtRGlkRmFp
bCh1aW50NjRfdCBzdHJlYW1JRCwgYm9vbCB3YXNDYW5jZWxsZWQpOwotICAgIHZpcnR1YWwgdm9p
ZCBtYW51YWxTdHJlYW1EaWRSZWNlaXZlUmVzcG9uc2UoY29uc3QgV2ViQ29yZTo6S1VSTCYgcmVz
cG9uc2VVUkwsIHVpbnQzMl90IHN0cmVhbUxlbmd0aCwgdWludDMyX3QgbGFzdE1vZGlmaWVkVGlt
ZSwgY29uc3QgV1RGOjpTdHJpbmcmIG1pbWVUeXBlLCBjb25zdCBXVEY6OlN0cmluZyYgaGVhZGVy
cywgY29uc3QgU3RyaW5nJiBzdWdnZXN0ZWRGaWxlTmFtZSk7Ci0gICAgdmlydHVhbCB2b2lkIG1h
bnVhbFN0cmVhbURpZFJlY2VpdmVEYXRhKGNvbnN0IGNoYXIqIGJ5dGVzLCBpbnQgbGVuZ3RoKTsK
LSAgICB2aXJ0dWFsIHZvaWQgbWFudWFsU3RyZWFtRGlkRmluaXNoTG9hZGluZygpOwotICAgIHZp
cnR1YWwgdm9pZCBtYW51YWxTdHJlYW1EaWRGYWlsKGJvb2wgd2FzQ2FuY2VsbGVkKTsKLSAgICB2
aXJ0dWFsIGJvb2wgaGFuZGxlTW91c2VFdmVudChjb25zdCBXZWJNb3VzZUV2ZW50Jik7Ci0gICAg
dmlydHVhbCBib29sIGhhbmRsZVdoZWVsRXZlbnQoY29uc3QgV2ViV2hlZWxFdmVudCYpOwotICAg
IHZpcnR1YWwgYm9vbCBoYW5kbGVNb3VzZUVudGVyRXZlbnQoY29uc3QgV2ViTW91c2VFdmVudCYp
OwotICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVNb3VzZUxlYXZlRXZlbnQoY29uc3QgV2ViTW91c2VF
dmVudCYpOwotICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVDb250ZXh0TWVudUV2ZW50KGNvbnN0IFdl
Yk1vdXNlRXZlbnQmKTsKLSAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlS2V5Ym9hcmRFdmVudChjb25z
dCBXZWJLZXlib2FyZEV2ZW50Jik7Ci0gICAgdmlydHVhbCB2b2lkIHNldEZvY3VzKGJvb2wpOwot
ICAgIHZpcnR1YWwgTlBPYmplY3QqIHBsdWdpblNjcmlwdGFibGVOUE9iamVjdCgpOwotI2lmIFBM
QVRGT1JNKE1BQykKLSAgICB2aXJ0dWFsIHZvaWQgd2luZG93Rm9jdXNDaGFuZ2VkKGJvb2wpOwot
ICAgIHZpcnR1YWwgdm9pZCB3aW5kb3dBbmRWaWV3RnJhbWVzQ2hhbmdlZChjb25zdCBXZWJDb3Jl
OjpJbnRSZWN0JiB3aW5kb3dGcmFtZUluU2NyZWVuQ29vcmRpbmF0ZXMsIGNvbnN0IFdlYkNvcmU6
OkludFJlY3QmIHZpZXdGcmFtZUluV2luZG93Q29vcmRpbmF0ZXMpOwotICAgIHZpcnR1YWwgdm9p
ZCB3aW5kb3dWaXNpYmlsaXR5Q2hhbmdlZChib29sKTsKLSAgICB2aXJ0dWFsIHZvaWQgY29udGVu
dHNTY2FsZUZhY3RvckNoYW5nZWQoZmxvYXQpOwotICAgIHZpcnR1YWwgdWludDY0X3QgcGx1Z2lu
Q29tcGxleFRleHRJbnB1dElkZW50aWZpZXIoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHZvaWQgc2Vu
ZENvbXBsZXhUZXh0SW5wdXQoY29uc3QgU3RyaW5nJiB0ZXh0SW5wdXQpOwotICAgIHZpcnR1YWwg
dm9pZCBzZXRMYXllckhvc3RpbmdNb2RlKExheWVySG9zdGluZ01vZGUpIE9WRVJSSURFOwotI2Vu
ZGlmCi0KLSAgICB2aXJ0dWFsIHZvaWQgc3RvcmFnZUJsb2NraW5nU3RhdGVDaGFuZ2VkKGJvb2wp
OwotICAgIHZpcnR1YWwgdm9pZCBwcml2YXRlQnJvd3NpbmdTdGF0ZUNoYW5nZWQoYm9vbCk7Ci0g
ICAgdmlydHVhbCBib29sIGdldEZvcm1WYWx1ZShTdHJpbmcmIGZvcm1WYWx1ZSk7Ci0gICAgdmly
dHVhbCBib29sIGhhbmRsZVNjcm9sbChXZWJDb3JlOjpTY3JvbGxEaXJlY3Rpb24sIFdlYkNvcmU6
OlNjcm9sbEdyYW51bGFyaXR5KTsKLSAgICB2aXJ0dWFsIFdlYkNvcmU6OlNjcm9sbGJhciogaG9y
aXpvbnRhbFNjcm9sbGJhcigpOwotICAgIHZpcnR1YWwgV2ViQ29yZTo6U2Nyb2xsYmFyKiB2ZXJ0
aWNhbFNjcm9sbGJhcigpOwotCi0gICAgdmlydHVhbCBSZXRhaW5QdHI8UERGRG9jdW1lbnQ+IHBk
ZkRvY3VtZW50Rm9yUHJpbnRpbmcoKSBjb25zdCBPVkVSUklERSB7IHJldHVybiBtX3BkZkRvY3Vt
ZW50OyB9Ci0KLSAgICAvLyBTY3JvbGxhYmxlQXJlYSBtZXRob2RzLgotICAgIHZpcnR1YWwgV2Vi
Q29yZTo6SW50UmVjdCBzY3JvbGxDb3JuZXJSZWN0KCkgY29uc3QgT1ZFUlJJREU7Ci0gICAgdmly
dHVhbCBXZWJDb3JlOjpTY3JvbGxhYmxlQXJlYSogZW5jbG9zaW5nU2Nyb2xsYWJsZUFyZWEoKSBj
b25zdCBPVkVSUklERTsKLSAgICB2aXJ0dWFsIFdlYkNvcmU6OkludFJlY3Qgc2Nyb2xsYWJsZUFy
ZWFCb3VuZGluZ0JveCgpIGNvbnN0IE9WRVJSSURFOwotICAgIHZpcnR1YWwgdm9pZCBzZXRTY3Jv
bGxPZmZzZXQoY29uc3QgV2ViQ29yZTo6SW50UG9pbnQmKSBPVkVSUklERTsKLSAgICB2aXJ0dWFs
IGludCBzY3JvbGxTaXplKFdlYkNvcmU6OlNjcm9sbGJhck9yaWVudGF0aW9uKSBjb25zdCBPVkVS
UklERTsKLSAgICB2aXJ0dWFsIGJvb2wgaXNBY3RpdmUoKSBjb25zdCBPVkVSUklERTsKLSAgICB2
aXJ0dWFsIHZvaWQgaW52YWxpZGF0ZVNjcm9sbGJhclJlY3QoV2ViQ29yZTo6U2Nyb2xsYmFyKiwg
Y29uc3QgV2ViQ29yZTo6SW50UmVjdCYpIE9WRVJSSURFOwotICAgIHZpcnR1YWwgdm9pZCBpbnZh
bGlkYXRlU2Nyb2xsQ29ybmVyUmVjdChjb25zdCBXZWJDb3JlOjpJbnRSZWN0JikgT1ZFUlJJREU7
Ci0gICAgdmlydHVhbCBib29sIGlzU2Nyb2xsQ29ybmVyVmlzaWJsZSgpIGNvbnN0IE9WRVJSSURF
OwotICAgIHZpcnR1YWwgaW50IHNjcm9sbFBvc2l0aW9uKFdlYkNvcmU6OlNjcm9sbGJhciopIGNv
bnN0IE9WRVJSSURFOwotICAgIHZpcnR1YWwgV2ViQ29yZTo6SW50UG9pbnQgc2Nyb2xsUG9zaXRp
b24oKSBjb25zdCBPVkVSUklERTsKLSAgICB2aXJ0dWFsIFdlYkNvcmU6OkludFBvaW50IG1pbmlt
dW1TY3JvbGxQb3NpdGlvbigpIGNvbnN0IE9WRVJSSURFOwotICAgIHZpcnR1YWwgV2ViQ29yZTo6
SW50UG9pbnQgbWF4aW11bVNjcm9sbFBvc2l0aW9uKCkgY29uc3QgT1ZFUlJJREU7Ci0gICAgdmly
dHVhbCBpbnQgdmlzaWJsZUhlaWdodCgpIGNvbnN0IE9WRVJSSURFOwotICAgIHZpcnR1YWwgaW50
IHZpc2libGVXaWR0aCgpIGNvbnN0IE9WRVJSSURFOwotICAgIHZpcnR1YWwgV2ViQ29yZTo6SW50
U2l6ZSBjb250ZW50c1NpemUoKSBjb25zdCBPVkVSUklERTsKLSAgICB2aXJ0dWFsIFdlYkNvcmU6
OlNjcm9sbGJhciogaG9yaXpvbnRhbFNjcm9sbGJhcigpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJu
IG1faG9yaXpvbnRhbFNjcm9sbGJhci5nZXQoKTsgfQotICAgIHZpcnR1YWwgV2ViQ29yZTo6U2Ny
b2xsYmFyKiB2ZXJ0aWNhbFNjcm9sbGJhcigpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIG1fdmVy
dGljYWxTY3JvbGxiYXIuZ2V0KCk7IH0KLSAgICB2aXJ0dWFsIGJvb2wgc2Nyb2xsYmFyc0NhbkJl
QWN0aXZlKCkgY29uc3QgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCBib29sIHNob3VsZFN1c3BlbmRT
Y3JvbGxBbmltYXRpb25zKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gZmFsc2U7IH0gLy8gSWYg
d2UgcmV0dXJuIHRydWUsIFNjcm9sbEFuaW1hdG9yTWFjIHdpbGwga2VlcCBjeWNsaW5nIGEgdGlt
ZXIgZm9yZXZlciwgd2FpdGluZyBmb3IgYSBnb29kIHRpbWUgdG8gYW5pbWF0ZS4KLSAgICB2aXJ0
dWFsIHZvaWQgc2Nyb2xsYmFyU3R5bGVDaGFuZ2VkKGludCBuZXdTdHlsZSwgYm9vbCBmb3JjZVVw
ZGF0ZSkgT1ZFUlJJREU7Ci0gICAgCi0gICAgdmlydHVhbCBXZWJDb3JlOjpJbnRSZWN0IGNvbnZl
cnRGcm9tU2Nyb2xsYmFyVG9Db250YWluaW5nVmlldyhjb25zdCBXZWJDb3JlOjpTY3JvbGxiYXIq
LCBjb25zdCBXZWJDb3JlOjpJbnRSZWN0JiBzY3JvbGxiYXJSZWN0KSBjb25zdCBPVkVSUklERTsK
LSAgICB2aXJ0dWFsIFdlYkNvcmU6OkludFJlY3QgY29udmVydEZyb21Db250YWluaW5nVmlld1Rv
U2Nyb2xsYmFyKGNvbnN0IFdlYkNvcmU6OlNjcm9sbGJhciosIGNvbnN0IFdlYkNvcmU6OkludFJl
Y3QmIHBhcmVudFJlY3QpIGNvbnN0IE9WRVJSSURFOwotICAgIHZpcnR1YWwgV2ViQ29yZTo6SW50
UG9pbnQgY29udmVydEZyb21TY3JvbGxiYXJUb0NvbnRhaW5pbmdWaWV3KGNvbnN0IFdlYkNvcmU6
OlNjcm9sbGJhciosIGNvbnN0IFdlYkNvcmU6OkludFBvaW50JiBzY3JvbGxiYXJQb2ludCkgY29u
c3QgT1ZFUlJJREU7Ci0gICAgdmlydHVhbCBXZWJDb3JlOjpJbnRQb2ludCBjb252ZXJ0RnJvbUNv
bnRhaW5pbmdWaWV3VG9TY3JvbGxiYXIoY29uc3QgV2ViQ29yZTo6U2Nyb2xsYmFyKiwgY29uc3Qg
V2ViQ29yZTo6SW50UG9pbnQmIHBhcmVudFBvaW50KSBjb25zdCBPVkVSUklERTsKLSAgICAKLSAg
ICB2aXJ0dWFsIGJvb2wgaXNFZGl0aW5nQ29tbWFuZEVuYWJsZWQoY29uc3QgU3RyaW5nJikgT1ZF
UlJJREU7Ci0gICAgdmlydHVhbCBib29sIGhhbmRsZUVkaXRpbmdDb21tYW5kKGNvbnN0IFN0cmlu
ZyYsIGNvbnN0IFN0cmluZyYpIE9WRVJSSURFOwotICAgIHZpcnR1YWwgYm9vbCBoYW5kbGVzUGFn
ZVNjYWxlRmFjdG9yKCkgT1ZFUlJJREU7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkQWxsb3dT
Y3JpcHRpbmcoKSBPVkVSUklERSB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgYm9vbCBz
aG91bGRBbGxvd05hdmlnYXRpb25Gcm9tRHJhZ3MoKSB7IHJldHVybiB0cnVlOyB9Ci0KLSAgICB2
aXJ0dWFsIHVuc2lnbmVkIGNvdW50RmluZE1hdGNoZXMoY29uc3QgU3RyaW5nJiwgV2ViQ29yZTo6
RmluZE9wdGlvbnMsIHVuc2lnbmVkKSBPVkVSUklERSB7IHJldHVybiAwOyB9Ci0gICAgdmlydHVh
bCBib29sIGZpbmRTdHJpbmcoY29uc3QgU3RyaW5nJiwgV2ViQ29yZTo6RmluZE9wdGlvbnMsIHVu
c2lnbmVkKSBPVkVSUklERSB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgdmlydHVhbCBQYXNzUmVm
UHRyPFdlYkNvcmU6OlNoYXJlZEJ1ZmZlcj4gbGl2ZVJlc291cmNlRGF0YSgpIGNvbnN0IE9WRVJS
SURFOwotICAgIHZpcnR1YWwgYm9vbCBwZXJmb3JtRGljdGlvbmFyeUxvb2t1cEF0TG9jYXRpb24o
Y29uc3QgV2ViQ29yZTo6RmxvYXRQb2ludCYpIE9WRVJSSURFIHsgcmV0dXJuIGZhbHNlOyB9Ci0K
LSAgICB2aXJ0dWFsIFN0cmluZyBnZXRTZWxlY3Rpb25TdHJpbmcoKSBjb25zdCBPVkVSUklERSB7
IHJldHVybiBTdHJpbmcoKTsgfQotCi0gICAgV2ViQ29yZTo6SW50U2l6ZSBtX3Njcm9sbE9mZnNl
dDsKLQotcHJpdmF0ZToKLQotICAgIEpTT2JqZWN0UmVmIG1ha2VKU1BERkRvYyhKU0NvbnRleHRS
ZWYpOwotICAgIHN0YXRpYyBKU1ZhbHVlUmVmIGpzUERGRG9jUHJpbnQoSlNDb250ZXh0UmVmLCBK
U09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmplY3RSZWYgdGhpc09iamVjdCwgc2l6ZV90IGFyZ3Vt
ZW50Q291bnQsIGNvbnN0IEpTVmFsdWVSZWYgYXJndW1lbnRzW10sIEpTVmFsdWVSZWYqIGV4Y2Vw
dGlvbik7Ci0KLSAgICB2b2lkIGNvbnZlcnRQb3N0U2NyaXB0RGF0YUlmTmVlZGVkKCk7Ci0KLSAg
ICB2aXJ0dWFsIGJvb2wgc2hvdWxkQWx3YXlzQXV0b1N0YXJ0KCkgY29uc3QgT1ZFUlJJREUgeyBy
ZXR1cm4gdHJ1ZTsgfQotCi0gICAgV2ViQ29yZTo6SW50U2l6ZSBtX3NpemU7Ci0KLSAgICBXZWJD
b3JlOjpLVVJMIG1fc291cmNlVVJMOwotCi0gICAgU3RyaW5nIG1fc3VnZ2VzdGVkRmlsZW5hbWU7
Ci0gICAgUmV0YWluUHRyPENGTXV0YWJsZURhdGFSZWY+IG1fZGF0YTsKLQotICAgIFJldGFpblB0
cjxQREZEb2N1bWVudD4gbV9wZGZEb2N1bWVudDsKLSAgICBWZWN0b3I8V2ViQ29yZTo6SW50UmVj
dD4gbV9wYWdlQm94ZXM7Ci0gICAgV2ViQ29yZTo6SW50U2l6ZSBtX3BkZkRvY3VtZW50U2l6ZTsg
Ly8gQWxsIHBhZ2VzLCBpbmNsdWRpbmcgZ2Fwcy4KLQotICAgIFJlZlB0cjxXZWJDb3JlOjpTY3Jv
bGxiYXI+IG1faG9yaXpvbnRhbFNjcm9sbGJhcjsKLSAgICBSZWZQdHI8V2ViQ29yZTo6U2Nyb2xs
YmFyPiBtX3ZlcnRpY2FsU2Nyb2xsYmFyOwotCi0gICAgV2ViRnJhbWUqIG1fZnJhbWU7Ci0KLSAg
ICBib29sIG1faXNQb3N0U2NyaXB0OwotICAgIGJvb2wgbV9wZGZEb2N1bWVudFdhc011dGF0ZWQ7
Ci19OwotCi19IC8vIG5hbWVzcGFjZSBXZWJLaXQKLQotI2VuZGlmIC8vIFNpbXBsZVBERlBsdWdp
bl9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1BsdWdpbnMvUERGL1Np
bXBsZVBERlBsdWdpbi5tbSBiL1NvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvUGx1Z2lucy9QREYv
U2ltcGxlUERGUGx1Z2luLm1tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzQ5MWYz
Li4wMDAwMDAwCi0tLSBhL1NvdXJjZS9XZWJLaXQyL1dlYlByb2Nlc3MvUGx1Z2lucy9QREYvU2lt
cGxlUERGUGx1Z2luLm1tCisrKyAvZGV2L251bGwKQEAgLTEsMTAwMiArMCwwIEBACi0vKgotICog
Q29weXJpZ2h0IChDKSAyMDA5LCAyMDExLCAyMDEyIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQotICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnCi0gKiBBTkQgQU5ZIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKLSAq
IFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwotICogQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgotICog
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YKLSAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwotICogSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KLSAqIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpCi0gKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCi0gKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCi0gKi8KLQotI2ltcG9ydCAiY29uZmlnLmgiCi0jaW1wb3J0ICJTaW1wbGVQREZQ
bHVnaW4uaCIKLQotI2ltcG9ydCAiUERGS2l0SW1wb3J0cy5oIgotI2ltcG9ydCAiUGx1Z2luVmll
dy5oIgotI2ltcG9ydCAiU2hhcmVhYmxlQml0bWFwLmgiCi0jaW1wb3J0ICJXZWJFdmVudC5oIgot
I2ltcG9ydCAiV2ViRXZlbnRDb252ZXJzaW9uLmgiCi0jaW1wb3J0IDxKYXZhU2NyaXB0Q29yZS9K
U0NvbnRleHRSZWYuaD4KLSNpbXBvcnQgPEphdmFTY3JpcHRDb3JlL0pTT2JqZWN0UmVmLmg+Ci0j
aW1wb3J0IDxKYXZhU2NyaXB0Q29yZS9KU1N0cmluZ1JlZi5oPgotI2ltcG9ydCA8SmF2YVNjcmlw
dENvcmUvSlNTdHJpbmdSZWZDRi5oPgotI2ltcG9ydCA8UERGS2l0L1BERktpdC5oPgotI2ltcG9y
dCA8V2ViQ29yZS9BcmNoaXZlUmVzb3VyY2UuaD4KLSNpbXBvcnQgPFdlYkNvcmUvQ2hyb21lLmg+
Ci0jaW1wb3J0IDxXZWJDb3JlL0RvY3VtZW50TG9hZGVyLmg+Ci0jaW1wb3J0IDxXZWJDb3JlL0Zv
Y3VzQ29udHJvbGxlci5oPgotI2ltcG9ydCA8V2ViQ29yZS9GcmFtZS5oPgotI2ltcG9ydCA8V2Vi
Q29yZS9GcmFtZVZpZXcuaD4KLSNpbXBvcnQgPFdlYkNvcmUvR3JhcGhpY3NDb250ZXh0Lmg+Ci0j
aW1wb3J0IDxXZWJDb3JlL0hUVFBIZWFkZXJNYXAuaD4KLSNpbXBvcnQgPFdlYkNvcmUvTG9jYWxp
emVkU3RyaW5ncy5oPgotI2ltcG9ydCA8V2ViQ29yZS9QYWdlLmg+Ci0jaW1wb3J0IDxXZWJDb3Jl
L1BsdWdpbkRhdGEuaD4KLSNpbXBvcnQgPFdlYkNvcmUvUmVuZGVyQm94TW9kZWxPYmplY3QuaD4K
LSNpbXBvcnQgPFdlYkNvcmUvU2Nyb2xsQW5pbWF0b3IuaD4KLSNpbXBvcnQgPFdlYkNvcmUvU2Ny
b2xsYmFyVGhlbWUuaD4KLQotdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7Ci0KLXN0YXRpYyBjb25z
dCBjaGFyKiBwb3N0U2NyaXB0TUlNRVR5cGUgPSAiYXBwbGljYXRpb24vcG9zdHNjcmlwdCI7Ci0K
LXN0YXRpYyB2b2lkIGFwcGVuZFZhbHVlc0luUERGTmFtZVN1YnRyZWVUb1ZlY3RvcihDR1BERkRp
Y3Rpb25hcnlSZWYgc3VidHJlZSwgVmVjdG9yPENHUERGT2JqZWN0UmVmPiYgdmFsdWVzKQotewot
ICAgIENHUERGQXJyYXlSZWYgbmFtZXM7Ci0gICAgaWYgKENHUERGRGljdGlvbmFyeUdldEFycmF5
KHN1YnRyZWUsICJOYW1lcyIsICZuYW1lcykpIHsKLSAgICAgICAgc2l6ZV90IG5hbWVDb3VudCA9
IENHUERGQXJyYXlHZXRDb3VudChuYW1lcykgLyAyOwotICAgICAgICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IG5hbWVDb3VudDsgKytpKSB7Ci0gICAgICAgICAgICBDR1BERk9iamVjdFJlZiBvYmpl
Y3Q7Ci0gICAgICAgICAgICBDR1BERkFycmF5R2V0T2JqZWN0KG5hbWVzLCAyICogaSArIDEsICZv
YmplY3QpOwotICAgICAgICAgICAgdmFsdWVzLmFwcGVuZChvYmplY3QpOwotICAgICAgICB9Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBDR1BERkFycmF5UmVmIGtpZHM7Ci0gICAgaWYg
KCFDR1BERkRpY3Rpb25hcnlHZXRBcnJheShzdWJ0cmVlLCAiS2lkcyIsICZraWRzKSkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgc2l6ZV90IGtpZENvdW50ID0gQ0dQREZBcnJheUdldENvdW50KGtp
ZHMpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga2lkQ291bnQ7ICsraSkgewotICAgICAg
ICBDR1BERkRpY3Rpb25hcnlSZWYga2lkOwotICAgICAgICBpZiAoIUNHUERGQXJyYXlHZXREaWN0
aW9uYXJ5KGtpZHMsIGksICZraWQpKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGFw
cGVuZFZhbHVlc0luUERGTmFtZVN1YnRyZWVUb1ZlY3RvcihraWQsIHZhbHVlcyk7Ci0gICAgfQot
fQotCi1zdGF0aWMgdm9pZCBnZXRBbGxWYWx1ZXNJblBERk5hbWVUcmVlKENHUERGRGljdGlvbmFy
eVJlZiB0cmVlLCBWZWN0b3I8Q0dQREZPYmplY3RSZWY+JiBhbGxWYWx1ZXMpCi17Ci0gICAgYXBw
ZW5kVmFsdWVzSW5QREZOYW1lU3VidHJlZVRvVmVjdG9yKHRyZWUsIGFsbFZhbHVlcyk7Ci19Ci0K
LXN0YXRpYyB2b2lkIGdldEFsbFNjcmlwdHNJblBERkRvY3VtZW50KENHUERGRG9jdW1lbnRSZWYg
cGRmRG9jdW1lbnQsIFZlY3RvcjxSZXRhaW5QdHI8Q0ZTdHJpbmdSZWY+PiYgc2NyaXB0cykKLXsK
LSAgICBpZiAoIXBkZkRvY3VtZW50KQotICAgICAgICByZXR1cm47Ci0KLSAgICBDR1BERkRpY3Rp
b25hcnlSZWYgcGRmQ2F0YWxvZyA9IENHUERGRG9jdW1lbnRHZXRDYXRhbG9nKHBkZkRvY3VtZW50
KTsKLSAgICBpZiAoIXBkZkNhdGFsb2cpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIEdldCB0
aGUgZGljdGlvbmFyeSBvZiBhbGwgZG9jdW1lbnQtbGV2ZWwgbmFtZSB0cmVlcy4KLSAgICBDR1BE
RkRpY3Rpb25hcnlSZWYgbmFtZXNEaWN0aW9uYXJ5OwotICAgIGlmICghQ0dQREZEaWN0aW9uYXJ5
R2V0RGljdGlvbmFyeShwZGZDYXRhbG9nLCAiTmFtZXMiLCAmbmFtZXNEaWN0aW9uYXJ5KSkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgLy8gR2V0IHRoZSBkb2N1bWVudC1sZXZlbCAiSmF2YVNjcmlw
dCIgbmFtZSB0cmVlLgotICAgIENHUERGRGljdGlvbmFyeVJlZiBqYXZhU2NyaXB0TmFtZVRyZWU7
Ci0gICAgaWYgKCFDR1BERkRpY3Rpb25hcnlHZXREaWN0aW9uYXJ5KG5hbWVzRGljdGlvbmFyeSwg
IkphdmFTY3JpcHQiLCAmamF2YVNjcmlwdE5hbWVUcmVlKSkKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgLy8gVGhlIG5hbWVzIGFyZSBhcmJpdHJhcnkuIFdlIGFyZSBvbmx5IGludGVyZXN0ZWQgaW4g
dGhlIHZhbHVlcy4KLSAgICBWZWN0b3I8Q0dQREZPYmplY3RSZWY+IG9iamVjdHM7Ci0gICAgZ2V0
QWxsVmFsdWVzSW5QREZOYW1lVHJlZShqYXZhU2NyaXB0TmFtZVRyZWUsIG9iamVjdHMpOwotICAg
IHNpemVfdCBvYmplY3RDb3VudCA9IG9iamVjdHMuc2l6ZSgpOwotCi0gICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCBvYmplY3RDb3VudDsgKytpKSB7Ci0gICAgICAgIENHUERGRGljdGlvbmFyeVJl
ZiBqYXZhU2NyaXB0QWN0aW9uOwotICAgICAgICBpZiAoIUNHUERGT2JqZWN0R2V0VmFsdWUocmVp
bnRlcnByZXRfY2FzdDxDR1BERk9iamVjdFJlZj4ob2JqZWN0c1tpXSksIGtDR1BERk9iamVjdFR5
cGVEaWN0aW9uYXJ5LCAmamF2YVNjcmlwdEFjdGlvbikpCi0gICAgICAgICAgICBjb250aW51ZTsK
LQotICAgICAgICAvLyBBIEphdmFTY3JpcHQgYWN0aW9uIG11c3QgaGF2ZSBhbiBhY3Rpb24gdHlw
ZSBvZiAiSmF2YVNjcmlwdCIuCi0gICAgICAgIGNvbnN0IGNoYXIqIGFjdGlvblR5cGU7Ci0gICAg
ICAgIGlmICghQ0dQREZEaWN0aW9uYXJ5R2V0TmFtZShqYXZhU2NyaXB0QWN0aW9uLCAiUyIsICZh
Y3Rpb25UeXBlKSB8fCBzdHJjbXAoYWN0aW9uVHlwZSwgIkphdmFTY3JpcHQiKSkKLSAgICAgICAg
ICAgIGNvbnRpbnVlOwotCi0gICAgICAgIGNvbnN0IFVJbnQ4KiBieXRlcyA9IDA7Ci0gICAgICAg
IENGSW5kZXggbGVuZ3RoOwotICAgICAgICBDR1BERlN0cmVhbVJlZiBzdHJlYW07Ci0gICAgICAg
IENHUERGU3RyaW5nUmVmIHN0cmluZzsKLSAgICAgICAgUmV0YWluUHRyPENGRGF0YVJlZj4gZGF0
YTsKLSAgICAgICAgaWYgKENHUERGRGljdGlvbmFyeUdldFN0cmVhbShqYXZhU2NyaXB0QWN0aW9u
LCAiSlMiLCAmc3RyZWFtKSkgewotICAgICAgICAgICAgQ0dQREZEYXRhRm9ybWF0IGZvcm1hdDsK
LSAgICAgICAgICAgIGRhdGEgPSBhZG9wdENGKENHUERGU3RyZWFtQ29weURhdGEoc3RyZWFtLCAm
Zm9ybWF0KSk7Ci0gICAgICAgICAgICBpZiAoIWRhdGEpCi0gICAgICAgICAgICAgICAgY29udGlu
dWU7Ci0gICAgICAgICAgICBieXRlcyA9IENGRGF0YUdldEJ5dGVQdHIoZGF0YS5nZXQoKSk7Ci0g
ICAgICAgICAgICBsZW5ndGggPSBDRkRhdGFHZXRMZW5ndGgoZGF0YS5nZXQoKSk7Ci0gICAgICAg
IH0gZWxzZSBpZiAoQ0dQREZEaWN0aW9uYXJ5R2V0U3RyaW5nKGphdmFTY3JpcHRBY3Rpb24sICJK
UyIsICZzdHJpbmcpKSB7Ci0gICAgICAgICAgICBieXRlcyA9IENHUERGU3RyaW5nR2V0Qnl0ZVB0
cihzdHJpbmcpOwotICAgICAgICAgICAgbGVuZ3RoID0gQ0dQREZTdHJpbmdHZXRMZW5ndGgoc3Ry
aW5nKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWJ5dGVzKQotICAgICAgICAgICAgY29udGlu
dWU7Ci0KLSAgICAgICAgQ0ZTdHJpbmdFbmNvZGluZyBlbmNvZGluZyA9IChsZW5ndGggPiAxICYm
IGJ5dGVzWzBdID09IDB4RkUgJiYgYnl0ZXNbMV0gPT0gMHhGRikgPyBrQ0ZTdHJpbmdFbmNvZGlu
Z1VuaWNvZGUgOiBrQ0ZTdHJpbmdFbmNvZGluZ1VURjg7Ci0gICAgICAgIFJldGFpblB0cjxDRlN0
cmluZ1JlZj4gc2NyaXB0ID0gYWRvcHRDRihDRlN0cmluZ0NyZWF0ZVdpdGhCeXRlcyhrQ0ZBbGxv
Y2F0b3JEZWZhdWx0LCBieXRlcywgbGVuZ3RoLCBlbmNvZGluZywgdHJ1ZSkpOwotICAgICAgICBp
ZiAoIXNjcmlwdCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotCi0gICAgICAgIHNjcmlwdHMuYXBw
ZW5kKHNjcmlwdCk7Ci0gICAgfQotfQotCi1uYW1lc3BhY2UgV2ViS2l0IHsKLQotY29uc3QgdWlu
dDY0X3QgcGRmRG9jdW1lbnRSZXF1ZXN0SUQgPSAxOyAvLyBQbHVnaW5Db250cm9sbGVyIHN1cHBv
cnRzIGxvYWRpbmcgbXVsdGlwbGUgc3RyZWFtcywgYnV0IHdlIG9ubHkgbmVlZCBvbmUgZm9yIFBE
Ri4KLQotY29uc3QgaW50IGd1dHRlckhlaWdodCA9IDEwOwotY29uc3QgaW50IHNoYWRvd09mZnNl
dFggPSAwOwotY29uc3QgaW50IHNoYWRvd09mZnNldFkgPSAtMjsKLWNvbnN0IGludCBzaGFkb3dT
aXplID0gNzsKLQotUGFzc1JlZlB0cjxTaW1wbGVQREZQbHVnaW4+IFNpbXBsZVBERlBsdWdpbjo6
Y3JlYXRlKFdlYkZyYW1lKiBmcmFtZSkKLXsKLSAgICByZXR1cm4gYWRvcHRSZWYobmV3IFNpbXBs
ZVBERlBsdWdpbihmcmFtZSkpOwotfQotCi1TaW1wbGVQREZQbHVnaW46OlNpbXBsZVBERlBsdWdp
bihXZWJGcmFtZSogZnJhbWUpCi0gICAgOiBtX2ZyYW1lKGZyYW1lKQotICAgICwgbV9pc1Bvc3RT
Y3JpcHQoZmFsc2UpCi0gICAgLCBtX3BkZkRvY3VtZW50V2FzTXV0YXRlZChmYWxzZSkKLXsKLX0K
LQotU2ltcGxlUERGUGx1Z2luOjp+U2ltcGxlUERGUGx1Z2luKCkKLXsKLX0KLQotUGx1Z2luSW5m
byBTaW1wbGVQREZQbHVnaW46OnBsdWdpbkluZm8oKQotewotICAgIFBsdWdpbkluZm8gaW5mbzsK
LSAgICBpbmZvLm5hbWUgPSBidWlsdEluUERGUGx1Z2luTmFtZSgpOwotICAgIGluZm8uaXNBcHBs
aWNhdGlvblBsdWdpbiA9IHRydWU7Ci0KLSAgICBNaW1lQ2xhc3NJbmZvIHBkZk1pbWVDbGFzc0lu
Zm87Ci0gICAgcGRmTWltZUNsYXNzSW5mby50eXBlID0gImFwcGxpY2F0aW9uL3BkZiI7Ci0gICAg
cGRmTWltZUNsYXNzSW5mby5kZXNjID0gcGRmRG9jdW1lbnRUeXBlRGVzY3JpcHRpb24oKTsKLSAg
ICBwZGZNaW1lQ2xhc3NJbmZvLmV4dGVuc2lvbnMuYXBwZW5kKCJwZGYiKTsKLSAgICBpbmZvLm1p
bWVzLmFwcGVuZChwZGZNaW1lQ2xhc3NJbmZvKTsKLSAgICAKLSAgICBNaW1lQ2xhc3NJbmZvIHRl
eHRQREZNaW1lQ2xhc3NJbmZvOwotICAgIHRleHRQREZNaW1lQ2xhc3NJbmZvLnR5cGUgPSAidGV4
dC9wZGYiOwotICAgIHRleHRQREZNaW1lQ2xhc3NJbmZvLmRlc2MgPSBwZGZEb2N1bWVudFR5cGVE
ZXNjcmlwdGlvbigpOwotICAgIHRleHRQREZNaW1lQ2xhc3NJbmZvLmV4dGVuc2lvbnMuYXBwZW5k
KCJwZGYiKTsKLSAgICBpbmZvLm1pbWVzLmFwcGVuZCh0ZXh0UERGTWltZUNsYXNzSW5mbyk7Ci0K
LSAgICBNaW1lQ2xhc3NJbmZvIHBvc3RTY3JpcHRNaW1lQ2xhc3NJbmZvOwotICAgIHBvc3RTY3Jp
cHRNaW1lQ2xhc3NJbmZvLnR5cGUgPSBwb3N0U2NyaXB0TUlNRVR5cGU7Ci0gICAgcG9zdFNjcmlw
dE1pbWVDbGFzc0luZm8uZGVzYyA9IHBvc3RTY3JpcHREb2N1bWVudFR5cGVEZXNjcmlwdGlvbigp
OwotICAgIHBvc3RTY3JpcHRNaW1lQ2xhc3NJbmZvLmV4dGVuc2lvbnMuYXBwZW5kKCJwcyIpOwot
ICAgIGluZm8ubWltZXMuYXBwZW5kKHBvc3RTY3JpcHRNaW1lQ2xhc3NJbmZvKTsKLQotICAgIHJl
dHVybiBpbmZvOwotfQotCi1QbHVnaW5WaWV3KiBTaW1wbGVQREZQbHVnaW46OnBsdWdpblZpZXco
KQotewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxQbHVnaW5WaWV3Kj4oY29udHJvbGxlcigpKTsK
LX0KLQotY29uc3QgUGx1Z2luVmlldyogU2ltcGxlUERGUGx1Z2luOjpwbHVnaW5WaWV3KCkgY29u
c3QKLXsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgUGx1Z2luVmlldyo+KGNvbnRyb2xs
ZXIoKSk7Ci19Ci0KLXZvaWQgU2ltcGxlUERGUGx1Z2luOjp1cGRhdGVTY3JvbGxiYXJzKCkKLXsK
LSAgICBib29sIGhhZFNjcm9sbGJhcnMgPSBtX2hvcml6b250YWxTY3JvbGxiYXIgfHwgbV92ZXJ0
aWNhbFNjcm9sbGJhcjsKLQotICAgIGlmIChtX2hvcml6b250YWxTY3JvbGxiYXIpIHsKLSAgICAg
ICAgaWYgKG1fc2l6ZS53aWR0aCgpID49IG1fcGRmRG9jdW1lbnRTaXplLndpZHRoKCkpCi0gICAg
ICAgICAgICBkZXN0cm95U2Nyb2xsYmFyKEhvcml6b250YWxTY3JvbGxiYXIpOwotICAgIH0gZWxz
ZSBpZiAobV9zaXplLndpZHRoKCkgPCBtX3BkZkRvY3VtZW50U2l6ZS53aWR0aCgpKQotICAgICAg
ICBtX2hvcml6b250YWxTY3JvbGxiYXIgPSBjcmVhdGVTY3JvbGxiYXIoSG9yaXpvbnRhbFNjcm9s
bGJhcik7Ci0KLSAgICBpZiAobV92ZXJ0aWNhbFNjcm9sbGJhcikgewotICAgICAgICBpZiAobV9z
aXplLmhlaWdodCgpID49IG1fcGRmRG9jdW1lbnRTaXplLmhlaWdodCgpKQotICAgICAgICAgICAg
ZGVzdHJveVNjcm9sbGJhcihWZXJ0aWNhbFNjcm9sbGJhcik7Ci0gICAgfSBlbHNlIGlmIChtX3Np
emUuaGVpZ2h0KCkgPCBtX3BkZkRvY3VtZW50U2l6ZS5oZWlnaHQoKSkKLSAgICAgICAgbV92ZXJ0
aWNhbFNjcm9sbGJhciA9IGNyZWF0ZVNjcm9sbGJhcihWZXJ0aWNhbFNjcm9sbGJhcik7Ci0KLSAg
ICBpbnQgaG9yaXpvbnRhbFNjcm9sbGJhckhlaWdodCA9IChtX2hvcml6b250YWxTY3JvbGxiYXIg
JiYgIW1faG9yaXpvbnRhbFNjcm9sbGJhci0+aXNPdmVybGF5U2Nyb2xsYmFyKCkpID8gbV9ob3Jp
em9udGFsU2Nyb2xsYmFyLT5oZWlnaHQoKSA6IDA7Ci0gICAgaW50IHZlcnRpY2FsU2Nyb2xsYmFy
V2lkdGggPSAobV92ZXJ0aWNhbFNjcm9sbGJhciAmJiAhbV92ZXJ0aWNhbFNjcm9sbGJhci0+aXNP
dmVybGF5U2Nyb2xsYmFyKCkpID8gbV92ZXJ0aWNhbFNjcm9sbGJhci0+d2lkdGgoKSA6IDA7Ci0K
LSAgICBpbnQgcGFnZVN0ZXAgPSBtX3BhZ2VCb3hlcy5pc0VtcHR5KCkgPyAwIDogbV9wYWdlQm94
ZXNbMF0uaGVpZ2h0KCk7Ci0KLSAgICBpZiAobV9ob3Jpem9udGFsU2Nyb2xsYmFyKSB7Ci0gICAg
ICAgIG1faG9yaXpvbnRhbFNjcm9sbGJhci0+c2V0U3RlcHMoU2Nyb2xsYmFyOjpwaXhlbHNQZXJM
aW5lU3RlcCgpLCBwYWdlU3RlcCk7Ci0gICAgICAgIG1faG9yaXpvbnRhbFNjcm9sbGJhci0+c2V0
UHJvcG9ydGlvbihtX3NpemUud2lkdGgoKSAtIHZlcnRpY2FsU2Nyb2xsYmFyV2lkdGgsIG1fcGRm
RG9jdW1lbnRTaXplLndpZHRoKCkpOwotICAgICAgICBJbnRSZWN0IHNjcm9sbGJhclJlY3QocGx1
Z2luVmlldygpLT54KCksIHBsdWdpblZpZXcoKS0+eSgpICsgbV9zaXplLmhlaWdodCgpIC0gbV9o
b3Jpem9udGFsU2Nyb2xsYmFyLT5oZWlnaHQoKSwgbV9zaXplLndpZHRoKCksIG1faG9yaXpvbnRh
bFNjcm9sbGJhci0+aGVpZ2h0KCkpOwotICAgICAgICBpZiAobV92ZXJ0aWNhbFNjcm9sbGJhcikK
LSAgICAgICAgICAgIHNjcm9sbGJhclJlY3QuY29udHJhY3QobV92ZXJ0aWNhbFNjcm9sbGJhci0+
d2lkdGgoKSwgMCk7Ci0gICAgICAgIG1faG9yaXpvbnRhbFNjcm9sbGJhci0+c2V0RnJhbWVSZWN0
KHNjcm9sbGJhclJlY3QpOwotICAgIH0KLSAgICBpZiAobV92ZXJ0aWNhbFNjcm9sbGJhcikgewot
ICAgICAgICBtX3ZlcnRpY2FsU2Nyb2xsYmFyLT5zZXRTdGVwcyhTY3JvbGxiYXI6OnBpeGVsc1Bl
ckxpbmVTdGVwKCksIHBhZ2VTdGVwKTsKLSAgICAgICAgbV92ZXJ0aWNhbFNjcm9sbGJhci0+c2V0
UHJvcG9ydGlvbihtX3NpemUuaGVpZ2h0KCkgLSBob3Jpem9udGFsU2Nyb2xsYmFySGVpZ2h0LCBt
X3BkZkRvY3VtZW50U2l6ZS5oZWlnaHQoKSk7Ci0gICAgICAgIEludFJlY3Qgc2Nyb2xsYmFyUmVj
dChJbnRSZWN0KHBsdWdpblZpZXcoKS0+eCgpICsgbV9zaXplLndpZHRoKCkgLSBtX3ZlcnRpY2Fs
U2Nyb2xsYmFyLT53aWR0aCgpLCBwbHVnaW5WaWV3KCktPnkoKSwgbV92ZXJ0aWNhbFNjcm9sbGJh
ci0+d2lkdGgoKSwgbV9zaXplLmhlaWdodCgpKSk7Ci0gICAgICAgIGlmIChtX2hvcml6b250YWxT
Y3JvbGxiYXIpCi0gICAgICAgICAgICBzY3JvbGxiYXJSZWN0LmNvbnRyYWN0KDAsIG1faG9yaXpv
bnRhbFNjcm9sbGJhci0+aGVpZ2h0KCkpOwotICAgICAgICBtX3ZlcnRpY2FsU2Nyb2xsYmFyLT5z
ZXRGcmFtZVJlY3Qoc2Nyb2xsYmFyUmVjdCk7Ci0gICAgfQotICAgIAotICAgIEZyYW1lVmlldyog
ZnJhbWVWaWV3ID0gbV9mcmFtZS0+Y29yZUZyYW1lKCktPnZpZXcoKTsKLSAgICBpZiAoIWZyYW1l
VmlldykKLSAgICAgICAgcmV0dXJuOwotCi0gICAgYm9vbCBoYXNTY3JvbGxiYXJzID0gbV9ob3Jp
em9udGFsU2Nyb2xsYmFyIHx8IG1fdmVydGljYWxTY3JvbGxiYXI7Ci0gICAgaWYgKGhhZFNjcm9s
bGJhcnMgIT0gaGFzU2Nyb2xsYmFycykgewotICAgICAgICBpZiAoaGFzU2Nyb2xsYmFycykKLSAg
ICAgICAgICAgIGZyYW1lVmlldy0+YWRkU2Nyb2xsYWJsZUFyZWEodGhpcyk7Ci0gICAgICAgIGVs
c2UKLSAgICAgICAgICAgIGZyYW1lVmlldy0+cmVtb3ZlU2Nyb2xsYWJsZUFyZWEodGhpcyk7Ci0K
LSAgICAgICAgZnJhbWVWaWV3LT5zZXROZWVkc0xheW91dCgpOwotICAgIH0KLX0KLQotUGFzc1Jl
ZlB0cjxTY3JvbGxiYXI+IFNpbXBsZVBERlBsdWdpbjo6Y3JlYXRlU2Nyb2xsYmFyKFNjcm9sbGJh
ck9yaWVudGF0aW9uIG9yaWVudGF0aW9uKQotewotICAgIFJlZlB0cjxTY3JvbGxiYXI+IHdpZGdl
dCA9IFNjcm9sbGJhcjo6Y3JlYXRlTmF0aXZlU2Nyb2xsYmFyKHRoaXMsIG9yaWVudGF0aW9uLCBS
ZWd1bGFyU2Nyb2xsYmFyKTsKLSAgICBkaWRBZGRTY3JvbGxiYXIod2lkZ2V0LmdldCgpLCBvcmll
bnRhdGlvbik7Ci0gICAgcGx1Z2luVmlldygpLT5mcmFtZSgpLT52aWV3KCktPmFkZENoaWxkKHdp
ZGdldC5nZXQoKSk7Ci0gICAgcmV0dXJuIHdpZGdldC5yZWxlYXNlKCk7Ci19Ci0KLXZvaWQgU2lt
cGxlUERGUGx1Z2luOjpkZXN0cm95U2Nyb2xsYmFyKFNjcm9sbGJhck9yaWVudGF0aW9uIG9yaWVu
dGF0aW9uKQotewotICAgIFJlZlB0cjxTY3JvbGxiYXI+JiBzY3JvbGxiYXIgPSBvcmllbnRhdGlv
biA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyID8gbV9ob3Jpem9udGFsU2Nyb2xsYmFyIDogbV92ZXJ0
aWNhbFNjcm9sbGJhcjsKLSAgICBpZiAoIXNjcm9sbGJhcikKLSAgICAgICAgcmV0dXJuOwotCi0g
ICAgd2lsbFJlbW92ZVNjcm9sbGJhcihzY3JvbGxiYXIuZ2V0KCksIG9yaWVudGF0aW9uKTsKLSAg
ICBzY3JvbGxiYXItPnJlbW92ZUZyb21QYXJlbnQoKTsKLSAgICBzY3JvbGxiYXItPmRpc2Nvbm5l
Y3RGcm9tU2Nyb2xsYWJsZUFyZWEoKTsKLSAgICBzY3JvbGxiYXIgPSAwOwotfQotCi12b2lkIFNp
bXBsZVBERlBsdWdpbjo6YWRkQXJjaGl2ZVJlc291cmNlKCkKLXsKLSAgICAvLyBGSVhNRTogSXQn
cyBhIGhhY2sgdG8gZm9yY2UgYWRkIGEgcmVzb3VyY2UgdG8gRG9jdW1lbnRMb2FkZXIuIFBERiBk
b2N1bWVudHMgc2hvdWxkIGp1c3QgYmUgZmV0Y2hlZCBhcyBDYWNoZWRSZXNvdXJjZXMuCi0KLSAg
ICAvLyBBZGQganVzdCBlbm91Z2ggZGF0YSBmb3IgY29udGV4dCBtZW51IGhhbmRsaW5nIGFuZCB3
ZWIgYXJjaGl2ZXMgdG8gd29yay4KLSAgICBSZXNvdXJjZVJlc3BvbnNlIHN5bnRoZXNpemVkUmVz
cG9uc2U7Ci0gICAgc3ludGhlc2l6ZWRSZXNwb25zZS5zZXRTdWdnZXN0ZWRGaWxlbmFtZShtX3N1
Z2dlc3RlZEZpbGVuYW1lKTsKLSAgICBzeW50aGVzaXplZFJlc3BvbnNlLnNldFVSTChtX3NvdXJj
ZVVSTCk7IC8vIE5lZWRzIHRvIG1hdGNoIHRoZSBIaXRUZXN0UmVzdWx0OjphYnNvbHV0ZVBERlVS
TC4KLSAgICBzeW50aGVzaXplZFJlc3BvbnNlLnNldE1pbWVUeXBlKCJhcHBsaWNhdGlvbi9wZGYi
KTsKLQotICAgIFJlZlB0cjxBcmNoaXZlUmVzb3VyY2U+IHJlc291cmNlID0gQXJjaGl2ZVJlc291
cmNlOjpjcmVhdGUoU2hhcmVkQnVmZmVyOjp3cmFwQ0ZEYXRhKG1fZGF0YS5nZXQoKSksIG1fc291
cmNlVVJMLCAiYXBwbGljYXRpb24vcGRmIiwgU3RyaW5nKCksIFN0cmluZygpLCBzeW50aGVzaXpl
ZFJlc3BvbnNlKTsKLSAgICBwbHVnaW5WaWV3KCktPmZyYW1lKCktPmRvY3VtZW50KCktPmxvYWRl
cigpLT5hZGRBcmNoaXZlUmVzb3VyY2UocmVzb3VyY2UucmVsZWFzZSgpKTsKLX0KLQotc3RhdGlj
IHZvaWQganNQREZEb2NJbml0aWFsaXplKEpTQ29udGV4dFJlZiBjdHgsIEpTT2JqZWN0UmVmIG9i
amVjdCkKLXsKLSAgICBTaW1wbGVQREZQbHVnaW4qIHBkZlZpZXcgPSBzdGF0aWNfY2FzdDxTaW1w
bGVQREZQbHVnaW4qPihKU09iamVjdEdldFByaXZhdGUob2JqZWN0KSk7Ci0gICAgcGRmVmlldy0+
cmVmKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGpzUERGRG9jRmluYWxpemUoSlNPYmplY3RSZWYgb2Jq
ZWN0KQotewotICAgIFNpbXBsZVBERlBsdWdpbiogcGRmVmlldyA9IHN0YXRpY19jYXN0PFNpbXBs
ZVBERlBsdWdpbio+KEpTT2JqZWN0R2V0UHJpdmF0ZShvYmplY3QpKTsKLSAgICBwZGZWaWV3LT5k
ZXJlZigpOwotfQotCi1KU1ZhbHVlUmVmIFNpbXBsZVBERlBsdWdpbjo6anNQREZEb2NQcmludChK
U0NvbnRleHRSZWYgY3R4LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmplY3RSZWYgdGhpc09i
amVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFsdWVSZWYgYXJndW1lbnRzW10s
IEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKLXsKLSAgICBTaW1wbGVQREZQbHVnaW4qIHBkZlZpZXcg
PSBzdGF0aWNfY2FzdDxTaW1wbGVQREZQbHVnaW4qPihKU09iamVjdEdldFByaXZhdGUodGhpc09i
amVjdCkpOwotICAgIAotICAgIFdlYkZyYW1lKiBmcmFtZSA9IHBkZlZpZXctPm1fZnJhbWU7Ci0g
ICAgaWYgKCFmcmFtZSkKLSAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGN0eCk7
Ci0gICAgCi0gICAgRnJhbWUqIGNvcmVGcmFtZSA9IGZyYW1lLT5jb3JlRnJhbWUoKTsKLSAgICBp
ZiAoIWNvcmVGcmFtZSkKLSAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGN0eCk7
Ci0gICAgCi0gICAgUGFnZSogcGFnZSA9IGNvcmVGcmFtZS0+cGFnZSgpOwotICAgIGlmICghcGFn
ZSkKLSAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGN0eCk7Ci0gICAgCi0gICAg
cGFnZS0+Y2hyb21lKCkucHJpbnQoY29yZUZyYW1lKTsKLSAgICAKLSAgICByZXR1cm4gSlNWYWx1
ZU1ha2VVbmRlZmluZWQoY3R4KTsKLX0KLQotSlNPYmplY3RSZWYgU2ltcGxlUERGUGx1Z2luOjpt
YWtlSlNQREZEb2MoSlNDb250ZXh0UmVmIGN0eCkKLXsKLSAgICBzdGF0aWMgSlNTdGF0aWNGdW5j
dGlvbiBqc1BERkRvY1N0YXRpY0Z1bmN0aW9uc1tdID0gewotICAgICAgICB7ICJwcmludCIsIGpz
UERGRG9jUHJpbnQsIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0
dHJpYnV0ZURvbnREZWxldGUgfSwKLSAgICAgICAgeyAwLCAwLCAwIH0sCi0gICAgfTsKLSAgICAK
LSAgICBzdGF0aWMgSlNDbGFzc0RlZmluaXRpb24ganNQREZEb2NDbGFzc0RlZmluaXRpb24gPSB7
Ci0gICAgICAgIDAsCi0gICAgICAgIGtKU0NsYXNzQXR0cmlidXRlTm9uZSwKLSAgICAgICAgIkRv
YyIsCi0gICAgICAgIDAsCi0gICAgICAgIDAsCi0gICAgICAgIGpzUERGRG9jU3RhdGljRnVuY3Rp
b25zLAotICAgICAgICBqc1BERkRvY0luaXRpYWxpemUsIGpzUERGRG9jRmluYWxpemUsIDAsIDAs
IDAsIDAsIDAsIDAsIDAsIDAsIDAKLSAgICB9OwotICAgIAotICAgIHN0YXRpYyBKU0NsYXNzUmVm
IGpzUERGRG9jQ2xhc3MgPSBKU0NsYXNzQ3JlYXRlKCZqc1BERkRvY0NsYXNzRGVmaW5pdGlvbik7
Ci0gICAgCi0gICAgcmV0dXJuIEpTT2JqZWN0TWFrZShjdHgsIGpzUERGRG9jQ2xhc3MsIHRoaXMp
OwotfQotCi1zdGF0aWMgUmV0YWluUHRyPENGTXV0YWJsZURhdGFSZWY+IGNvbnZlcnRQb3N0U2Ny
aXB0RGF0YVRvUERGKFJldGFpblB0cjxDRkRhdGFSZWY+IHBvc3RTY3JpcHREYXRhKQotewotICAg
IC8vIENvbnZlcnQgUG9zdFNjcmlwdCB0byBQREYgdXNpbmcgdGhlIFF1YXJ0eiAyRCBBUEkuCi0g
ICAgLy8gaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi9HcmFwaGljc0lt
YWdpbmcvQ29uY2VwdHVhbC9kcmF3aW5nd2l0aHF1YXJ0ejJkL2RxX3BzX2NvbnZlcnQvY2hhcHRl
cl8xNl9zZWN0aW9uXzEuaHRtbAotCi0gICAgQ0dQU0NvbnZlcnRlckNhbGxiYWNrcyBjYWxsYmFj
a3MgPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKLSAgICBSZXRhaW5QdHI8Q0dQU0NvbnZl
cnRlclJlZj4gY29udmVydGVyID0gYWRvcHRDRihDR1BTQ29udmVydGVyQ3JlYXRlKDAsICZjYWxs
YmFja3MsIDApKTsKLSAgICBSZXRhaW5QdHI8Q0dEYXRhUHJvdmlkZXJSZWY+IHByb3ZpZGVyID0g
YWRvcHRDRihDR0RhdGFQcm92aWRlckNyZWF0ZVdpdGhDRkRhdGEocG9zdFNjcmlwdERhdGEuZ2V0
KCkpKTsKLSAgICBSZXRhaW5QdHI8Q0ZNdXRhYmxlRGF0YVJlZj4gcGRmRGF0YSA9IGFkb3B0Q0Yo
Q0ZEYXRhQ3JlYXRlTXV0YWJsZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCAwKSk7Ci0gICAgUmV0YWlu
UHRyPENHRGF0YUNvbnN1bWVyUmVmPiBjb25zdW1lciA9IGFkb3B0Q0YoQ0dEYXRhQ29uc3VtZXJD
cmVhdGVXaXRoQ0ZEYXRhKHBkZkRhdGEuZ2V0KCkpKTsKLQotICAgIENHUFNDb252ZXJ0ZXJDb252
ZXJ0KGNvbnZlcnRlci5nZXQoKSwgcHJvdmlkZXIuZ2V0KCksIGNvbnN1bWVyLmdldCgpLCAwKTsK
LQotICAgIHJldHVybiBwZGZEYXRhOwotfQotCi12b2lkIFNpbXBsZVBERlBsdWdpbjo6cGRmRG9j
dW1lbnREaWRMb2FkKCkKLXsKLSAgICBhZGRBcmNoaXZlUmVzb3VyY2UoKTsKLQotICAgIG1fcGRm
RG9jdW1lbnQgPSBhZG9wdE5TKFtbcGRmRG9jdW1lbnRDbGFzcygpIGFsbG9jXSBpbml0V2l0aERh
dGE6KE5TRGF0YSAqKW1fZGF0YS5nZXQoKV0pOwotCi0gICAgY2FsY3VsYXRlU2l6ZXMoKTsKLSAg
ICB1cGRhdGVTY3JvbGxiYXJzKCk7Ci0KLSAgICBjb250cm9sbGVyKCktPmludmFsaWRhdGUoSW50
UmVjdCgwLCAwLCBtX3NpemUud2lkdGgoKSwgbV9zaXplLmhlaWdodCgpKSk7Ci0KLSAgICBydW5T
Y3JpcHRzSW5QREZEb2N1bWVudCgpOwotfQotICAgIAotdm9pZCBTaW1wbGVQREZQbHVnaW46OnJ1
blNjcmlwdHNJblBERkRvY3VtZW50KCkKLXsKLSAgICBWZWN0b3I8UmV0YWluUHRyPENGU3RyaW5n
UmVmPj4gc2NyaXB0czsKLSAgICBnZXRBbGxTY3JpcHRzSW5QREZEb2N1bWVudChbbV9wZGZEb2N1
bWVudC5nZXQoKSBkb2N1bWVudFJlZl0sIHNjcmlwdHMpOwotCi0gICAgc2l6ZV90IHNjcmlwdENv
dW50ID0gc2NyaXB0cy5zaXplKCk7Ci0gICAgaWYgKCFzY3JpcHRDb3VudCkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgSlNHbG9iYWxDb250ZXh0UmVmIGN0eCA9IEpTR2xvYmFsQ29udGV4dENyZWF0
ZSgwKTsKLSAgICBKU09iamVjdFJlZiBqc1BERkRvYyA9IG1ha2VKU1BERkRvYyhjdHgpOwotCi0g
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzY3JpcHRDb3VudDsgKytpKSB7Ci0gICAgICAgIEpT
U3RyaW5nUmVmIHNjcmlwdCA9IEpTU3RyaW5nQ3JlYXRlV2l0aENGU3RyaW5nKHNjcmlwdHNbaV0u
Z2V0KCkpOwotICAgICAgICBKU0V2YWx1YXRlU2NyaXB0KGN0eCwgc2NyaXB0LCBqc1BERkRvYywg
MCwgMCwgMCk7Ci0gICAgICAgIEpTU3RyaW5nUmVsZWFzZShzY3JpcHQpOwotICAgIH0KLQotICAg
IEpTR2xvYmFsQ29udGV4dFJlbGVhc2UoY3R4KTsKLX0KLSAgICAKLXZvaWQgU2ltcGxlUERGUGx1
Z2luOjpjb21wdXRlUGFnZUJveGVzKCkKLXsKLSAgICBzaXplX3QgcGFnZUNvdW50ID0gQ0dQREZE
b2N1bWVudEdldE51bWJlck9mUGFnZXMoW21fcGRmRG9jdW1lbnQuZ2V0KCkgZG9jdW1lbnRSZWZd
KTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhZ2VDb3VudDsgKytpKSB7Ci0gICAgICAg
IENHUERGUGFnZVJlZiBwZGZQYWdlID0gQ0dQREZEb2N1bWVudEdldFBhZ2UoW21fcGRmRG9jdW1l
bnQuZ2V0KCkgZG9jdW1lbnRSZWZdLCBpICsgMSk7Ci0gICAgICAgIEFTU0VSVChwZGZQYWdlKTsK
LSAgICAgICAgCi0gICAgICAgIENHUmVjdCBib3ggPSBDR1BERlBhZ2VHZXRCb3hSZWN0KHBkZlBh
Z2UsIGtDR1BERkNyb3BCb3gpOwotICAgICAgICBpZiAoQ0dSZWN0SXNFbXB0eShib3gpKQotICAg
ICAgICAgICAgYm94ID0gQ0dQREZQYWdlR2V0Qm94UmVjdChwZGZQYWdlLCBrQ0dQREZNZWRpYUJv
eCk7Ci0gICAgICAgIG1fcGFnZUJveGVzLmFwcGVuZChJbnRSZWN0KGJveCkpOwotICAgIH0KLX0K
LQotdm9pZCBTaW1wbGVQREZQbHVnaW46OmNhbGN1bGF0ZVNpemVzKCkKLXsKLSAgICBzaXplX3Qg
cGFnZUNvdW50ID0gQ0dQREZEb2N1bWVudEdldE51bWJlck9mUGFnZXMoW21fcGRmRG9jdW1lbnQu
Z2V0KCkgZG9jdW1lbnRSZWZdKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhZ2VDb3Vu
dDsgKytpKSB7Ci0gICAgICAgIENHUERGUGFnZVJlZiBwZGZQYWdlID0gQ0dQREZEb2N1bWVudEdl
dFBhZ2UoW21fcGRmRG9jdW1lbnQuZ2V0KCkgZG9jdW1lbnRSZWZdLCBpICsgMSk7Ci0gICAgICAg
IEFTU0VSVChwZGZQYWdlKTsKLQotICAgICAgICBDR1JlY3QgYm94ID0gQ0dQREZQYWdlR2V0Qm94
UmVjdChwZGZQYWdlLCBrQ0dQREZDcm9wQm94KTsKLSAgICAgICAgaWYgKENHUmVjdElzRW1wdHko
Ym94KSkKLSAgICAgICAgICAgIGJveCA9IENHUERGUGFnZUdldEJveFJlY3QocGRmUGFnZSwga0NH
UERGTWVkaWFCb3gpOwotICAgICAgICBtX3BhZ2VCb3hlcy5hcHBlbmQoSW50UmVjdChib3gpKTsK
LSAgICAgICAgbV9wZGZEb2N1bWVudFNpemUuc2V0V2lkdGgobWF4KG1fcGRmRG9jdW1lbnRTaXpl
LndpZHRoKCksIHN0YXRpY19jYXN0PGludD4oYm94LnNpemUud2lkdGgpKSk7Ci0gICAgICAgIG1f
cGRmRG9jdW1lbnRTaXplLmV4cGFuZCgwLCBib3guc2l6ZS5oZWlnaHQpOwotICAgIH0KLSAgICBt
X3BkZkRvY3VtZW50U2l6ZS5leHBhbmQoMCwgZ3V0dGVySGVpZ2h0ICogKG1fcGFnZUJveGVzLnNp
emUoKSAtIDEpKTsKLX0KLQotYm9vbCBTaW1wbGVQREZQbHVnaW46OmluaXRpYWxpemUoY29uc3Qg
UGFyYW1ldGVycyYgcGFyYW1ldGVycykKLXsKLSAgICAvLyBMb2FkIHRoZSBzcmMgVVJMIGlmIG5l
ZWRlZC4KLSAgICBtX3NvdXJjZVVSTCA9IHBhcmFtZXRlcnMudXJsOwotICAgIGlmICghcGFyYW1l
dGVycy5zaG91bGRVc2VNYW51YWxMb2FkZXIgJiYgIXBhcmFtZXRlcnMudXJsLmlzRW1wdHkoKSkK
LSAgICAgICAgY29udHJvbGxlcigpLT5sb2FkVVJMKHBkZkRvY3VtZW50UmVxdWVzdElELCAiR0VU
IiwgcGFyYW1ldGVycy51cmwuc3RyaW5nKCksIFN0cmluZygpLCBIVFRQSGVhZGVyTWFwKCksIFZl
Y3Rvcjx1aW50OF90PigpLCBmYWxzZSk7Ci0KLSAgICBjb250cm9sbGVyKCktPmRpZEluaXRpYWxp
emVQbHVnaW4oKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBTaW1wbGVQREZQbHVnaW46
OmRlc3Ryb3koKQotewotICAgIGlmIChtX2ZyYW1lKSB7Ci0gICAgICAgIGlmIChGcmFtZVZpZXcq
IGZyYW1lVmlldyA9IG1fZnJhbWUtPmNvcmVGcmFtZSgpLT52aWV3KCkpCi0gICAgICAgICAgICBm
cmFtZVZpZXctPnJlbW92ZVNjcm9sbGFibGVBcmVhKHRoaXMpOwotICAgIH0KLQotICAgIGRlc3Ry
b3lTY3JvbGxiYXIoSG9yaXpvbnRhbFNjcm9sbGJhcik7Ci0gICAgZGVzdHJveVNjcm9sbGJhcihW
ZXJ0aWNhbFNjcm9sbGJhcik7Ci19Ci0KLXZvaWQgU2ltcGxlUERGUGx1Z2luOjpwYWludChHcmFw
aGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgSW50UmVjdCYgZGlydHlSZWN0KQot
ewotICAgIGNvbnRlbnRBcmVhV2lsbFBhaW50KCk7Ci0KLSAgICBwYWludEJhY2tncm91bmQoZ3Jh
cGhpY3NDb250ZXh0LCBkaXJ0eVJlY3QpOwotCi0gICAgaWYgKCFtX3BkZkRvY3VtZW50KSAvLyBG
SVhNRTogRHJhdyBsb2FkaW5nIHByb2dyZXNzLgotICAgICAgICByZXR1cm47Ci0KLSAgICBwYWlu
dENvbnRlbnQoZ3JhcGhpY3NDb250ZXh0LCBkaXJ0eVJlY3QpOwotICAgIHBhaW50Q29udHJvbHMo
Z3JhcGhpY3NDb250ZXh0LCBkaXJ0eVJlY3QpOwotfQotCi12b2lkIFNpbXBsZVBERlBsdWdpbjo6
cGFpbnRCYWNrZ3JvdW5kKEdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3NDb250ZXh0LCBjb25zdCBJ
bnRSZWN0JiBkaXJ0eVJlY3QpCi17Ci0gICAgR3JhcGhpY3NDb250ZXh0U3RhdGVTYXZlciBzdGF0
ZVNhdmVyKCpncmFwaGljc0NvbnRleHQpOwotICAgIGdyYXBoaWNzQ29udGV4dC0+c2V0RmlsbENv
bG9yKENvbG9yOjpncmF5LCBDb2xvclNwYWNlRGV2aWNlUkdCKTsKLSAgICBncmFwaGljc0NvbnRl
eHQtPmZpbGxSZWN0KGRpcnR5UmVjdCk7Ci19Ci0KLXZvaWQgU2ltcGxlUERGUGx1Z2luOjpwYWlu
dENvbnRlbnQoR3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGNvbnN0IEludFJlY3Qm
IGRpcnR5UmVjdCkKLXsKLSAgICBHcmFwaGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIo
KmdyYXBoaWNzQ29udGV4dCk7Ci0gICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBncmFwaGljc0Nv
bnRleHQtPnBsYXRmb3JtQ29udGV4dCgpOwotCi0gICAgZ3JhcGhpY3NDb250ZXh0LT5zZXRJbWFn
ZUludGVycG9sYXRpb25RdWFsaXR5KEludGVycG9sYXRpb25IaWdoKTsKLSAgICBncmFwaGljc0Nv
bnRleHQtPnNldFNob3VsZEFudGlhbGlhcyh0cnVlKTsKLSAgICBncmFwaGljc0NvbnRleHQtPnNl
dFNob3VsZFNtb290aEZvbnRzKHRydWUpOwotICAgIGdyYXBoaWNzQ29udGV4dC0+c2V0RmlsbENv
bG9yKENvbG9yOjp3aGl0ZSwgQ29sb3JTcGFjZURldmljZVJHQik7Ci0KLSAgICBncmFwaGljc0Nv
bnRleHQtPmNsaXAoZGlydHlSZWN0KTsKLSAgICBJbnRSZWN0IGNvbnRlbnRSZWN0KGRpcnR5UmVj
dCk7Ci0gICAgY29udGVudFJlY3QubW92ZUJ5KEludFBvaW50KG1fc2Nyb2xsT2Zmc2V0KSk7Ci0g
ICAgZ3JhcGhpY3NDb250ZXh0LT50cmFuc2xhdGUoLW1fc2Nyb2xsT2Zmc2V0LndpZHRoKCksIC1t
X3Njcm9sbE9mZnNldC5oZWlnaHQoKSk7Ci0KLSAgICBDR0NvbnRleHRTY2FsZUNUTShjb250ZXh0
LCAxLCAtMSk7Ci0KLSAgICBpbnQgcGFnZVRvcCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7
IGkgPCBtX3BhZ2VCb3hlcy5zaXplKCk7ICsraSkgewotICAgICAgICBJbnRSZWN0IHBhZ2VCb3gg
PSBtX3BhZ2VCb3hlc1tpXTsKLSAgICAgICAgZmxvYXQgZXh0cmFPZmZzZXRGb3JDZW50ZXJpbmdY
ID0gbWF4KHJvdW5kZigobV9zaXplLndpZHRoKCkgLSBwYWdlQm94LndpZHRoKCkpIC8gMi4wZiks
IDAuMGYpOwotICAgICAgICBmbG9hdCBleHRyYU9mZnNldEZvckNlbnRlcmluZ1kgPSAobV9wYWdl
Qm94ZXMuc2l6ZSgpID09IDEpID8gbWF4KHJvdW5kZigobV9zaXplLmhlaWdodCgpIC0gcGFnZUJv
eC5oZWlnaHQoKSArIHNoYWRvd09mZnNldFkpIC8gMi4wZiksIDAuMGYpIDogMDsKLQotICAgICAg
ICBpZiAocGFnZVRvcCA+IGNvbnRlbnRSZWN0Lm1heFkoKSkKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICBpZiAocGFnZVRvcCArIHBhZ2VCb3guaGVpZ2h0KCkgKyBleHRyYU9mZnNldEZvckNl
bnRlcmluZ1kgKyBndXR0ZXJIZWlnaHQgPj0gY29udGVudFJlY3QueSgpKSB7Ci0gICAgICAgICAg
ICBDR1BERlBhZ2VSZWYgcGRmUGFnZSA9IENHUERGRG9jdW1lbnRHZXRQYWdlKFttX3BkZkRvY3Vt
ZW50LmdldCgpIGRvY3VtZW50UmVmXSwgaSArIDEpOwotCi0gICAgICAgICAgICBncmFwaGljc0Nv
bnRleHQtPnNhdmUoKTsKLSAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4dC0+dHJhbnNsYXRlKGV4
dHJhT2Zmc2V0Rm9yQ2VudGVyaW5nWCAtIHBhZ2VCb3gueCgpLCAtZXh0cmFPZmZzZXRGb3JDZW50
ZXJpbmdZIC0gcGFnZUJveC55KCkgLSBwYWdlQm94LmhlaWdodCgpKTsKLQotICAgICAgICAgICAg
Z3JhcGhpY3NDb250ZXh0LT5zZXRTaGFkb3coRmxvYXRTaXplKHNoYWRvd09mZnNldFgsIHNoYWRv
d09mZnNldFkpLCBzaGFkb3dTaXplLCBDb2xvcjo6YmxhY2ssIENvbG9yU3BhY2VEZXZpY2VSR0Ip
OwotICAgICAgICAgICAgZ3JhcGhpY3NDb250ZXh0LT5maWxsUmVjdChwYWdlQm94KTsKLSAgICAg
ICAgICAgIGdyYXBoaWNzQ29udGV4dC0+Y2xlYXJTaGFkb3coKTsKLQotICAgICAgICAgICAgZ3Jh
cGhpY3NDb250ZXh0LT5jbGlwKHBhZ2VCb3gpOwotCi0gICAgICAgICAgICBDR0NvbnRleHREcmF3
UERGUGFnZShjb250ZXh0LCBwZGZQYWdlKTsKLSAgICAgICAgICAgIGdyYXBoaWNzQ29udGV4dC0+
cmVzdG9yZSgpOwotICAgICAgICB9Ci0gICAgICAgIHBhZ2VUb3AgKz0gcGFnZUJveC5oZWlnaHQo
KSArIGd1dHRlckhlaWdodDsKLSAgICAgICAgQ0dDb250ZXh0VHJhbnNsYXRlQ1RNKGNvbnRleHQs
IDAsIC1wYWdlQm94LmhlaWdodCgpIC0gZ3V0dGVySGVpZ2h0KTsKLSAgICB9Ci19Ci0KLXZvaWQg
U2ltcGxlUERGUGx1Z2luOjpwYWludENvbnRyb2xzKEdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3ND
b250ZXh0LCBjb25zdCBJbnRSZWN0JiBkaXJ0eVJlY3QpCi17Ci0gICAgewotICAgICAgICBHcmFw
aGljc0NvbnRleHRTdGF0ZVNhdmVyIHN0YXRlU2F2ZXIoKmdyYXBoaWNzQ29udGV4dCk7Ci0gICAg
ICAgIEludFJlY3Qgc2Nyb2xsYmFyRGlydHlSZWN0ID0gZGlydHlSZWN0OwotICAgICAgICBzY3Jv
bGxiYXJEaXJ0eVJlY3QubW92ZUJ5KHBsdWdpblZpZXcoKS0+ZnJhbWVSZWN0KCkubG9jYXRpb24o
KSk7Ci0gICAgICAgIGdyYXBoaWNzQ29udGV4dC0+dHJhbnNsYXRlKC1wbHVnaW5WaWV3KCktPmZy
YW1lUmVjdCgpLngoKSwgLXBsdWdpblZpZXcoKS0+ZnJhbWVSZWN0KCkueSgpKTsKLQotICAgICAg
ICBpZiAobV9ob3Jpem9udGFsU2Nyb2xsYmFyKQotICAgICAgICAgICAgbV9ob3Jpem9udGFsU2Ny
b2xsYmFyLT5wYWludChncmFwaGljc0NvbnRleHQsIHNjcm9sbGJhckRpcnR5UmVjdCk7Ci0KLSAg
ICAgICAgaWYgKG1fdmVydGljYWxTY3JvbGxiYXIpCi0gICAgICAgICAgICBtX3ZlcnRpY2FsU2Ny
b2xsYmFyLT5wYWludChncmFwaGljc0NvbnRleHQsIHNjcm9sbGJhckRpcnR5UmVjdCk7Ci0gICAg
fQotCi0gICAgSW50UmVjdCBkaXJ0eUNvcm5lclJlY3QgPSBpbnRlcnNlY3Rpb24oc2Nyb2xsQ29y
bmVyUmVjdCgpLCBkaXJ0eVJlY3QpOwotICAgIFNjcm9sbGJhclRoZW1lOjp0aGVtZSgpLT5wYWlu
dFNjcm9sbENvcm5lcigwLCBncmFwaGljc0NvbnRleHQsIGRpcnR5Q29ybmVyUmVjdCk7Ci19Ci0K
LXZvaWQgU2ltcGxlUERGUGx1Z2luOjp1cGRhdGVDb250cm9sVGludHMoR3JhcGhpY3NDb250ZXh0
KiBncmFwaGljc0NvbnRleHQpCi17Ci0gICAgQVNTRVJUKGdyYXBoaWNzQ29udGV4dC0+dXBkYXRp
bmdDb250cm9sVGludHMoKSk7Ci0KLSAgICBpZiAobV9ob3Jpem9udGFsU2Nyb2xsYmFyKQotICAg
ICAgICBtX2hvcml6b250YWxTY3JvbGxiYXItPmludmFsaWRhdGUoKTsKLSAgICBpZiAobV92ZXJ0
aWNhbFNjcm9sbGJhcikKLSAgICAgICAgbV92ZXJ0aWNhbFNjcm9sbGJhci0+aW52YWxpZGF0ZSgp
OwotICAgIGludmFsaWRhdGVTY3JvbGxDb3JuZXIoc2Nyb2xsQ29ybmVyUmVjdCgpKTsKLX0KLQot
UGFzc1JlZlB0cjxTaGFyZWFibGVCaXRtYXA+IFNpbXBsZVBERlBsdWdpbjo6c25hcHNob3QoKQot
ewotICAgIHJldHVybiAwOwotfQotCi0jaWYgUExBVEZPUk0oTUFDKQotUGxhdGZvcm1MYXllciog
U2ltcGxlUERGUGx1Z2luOjpwbHVnaW5MYXllcigpCi17Ci0gICAgcmV0dXJuIDA7Ci19Ci0jZW5k
aWYKLQotCi1ib29sIFNpbXBsZVBERlBsdWdpbjo6aXNUcmFuc3BhcmVudCgpCi17Ci0gICAgLy8g
VGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGZyb20gdGhlIHdlYiBwcm9jZXNzLgotICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBTaW1wbGVQ
REZQbHVnaW46OndhbnRzV2hlZWxFdmVudHMoKQotewotICAgIHJldHVybiB0cnVlOwotfQotCi12
b2lkIFNpbXBsZVBERlBsdWdpbjo6Z2VvbWV0cnlEaWRDaGFuZ2UoY29uc3QgSW50U2l6ZSYgc2l6
ZSwgY29uc3QgSW50UmVjdCYgY2xpcFJlY3QsIGNvbnN0IEFmZmluZVRyYW5zZm9ybSYgcGx1Z2lu
VG9Sb290Vmlld1RyYW5zZm9ybSkKLXsKLSAgICBpZiAobV9zaXplID09IHNpemUpIHsKLSAgICAg
ICAgLy8gTm90aGluZyB0byBkby4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1fc2l6
ZSA9IHNpemU7Ci0gICAgdXBkYXRlU2Nyb2xsYmFycygpOwotfQotCi12b2lkIFNpbXBsZVBERlBs
dWdpbjo6dmlzaWJpbGl0eURpZENoYW5nZSgpCi17Ci19Ci0KLXZvaWQgU2ltcGxlUERGUGx1Z2lu
OjpmcmFtZURpZEZpbmlzaExvYWRpbmcodWludDY0X3QpCi17Ci0gICAgQVNTRVJUX05PVF9SRUFD
SEVEKCk7Ci19Ci0KLXZvaWQgU2ltcGxlUERGUGx1Z2luOjpmcmFtZURpZEZhaWwodWludDY0X3Qs
IGJvb2wpCi17Ci0gICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci19Ci0KLXZvaWQgU2ltcGxlUERG
UGx1Z2luOjpkaWRFdmFsdWF0ZUphdmFTY3JpcHQodWludDY0X3QsIGNvbnN0IFdURjo6U3RyaW5n
JikKLXsKLSAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKLX0KLQotdm9pZCBTaW1wbGVQREZQbHVn
aW46OmNvbnZlcnRQb3N0U2NyaXB0RGF0YUlmTmVlZGVkKCkKLXsKLSAgICBpZiAoIW1faXNQb3N0
U2NyaXB0KQotICAgICAgICByZXR1cm47Ci0KLSAgICBtX3N1Z2dlc3RlZEZpbGVuYW1lID0gU3Ry
aW5nKG1fc3VnZ2VzdGVkRmlsZW5hbWUgKyAiLnBkZiIpOwotICAgIG1fZGF0YSA9IGNvbnZlcnRQ
b3N0U2NyaXB0RGF0YVRvUERGKG1fZGF0YSk7Ci19Ci0KLXZvaWQgU2ltcGxlUERGUGx1Z2luOjpz
dHJlYW1EaWRSZWNlaXZlUmVzcG9uc2UodWludDY0X3Qgc3RyZWFtSUQsIGNvbnN0IEtVUkwmLCB1
aW50MzJfdCwgdWludDMyX3QsIGNvbnN0IFN0cmluZyYgbWltZVR5cGUsIGNvbnN0IFN0cmluZyYs
IGNvbnN0IFN0cmluZyYgc3VnZ2VzdGVkRmlsZW5hbWUpCi17Ci0gICAgQVNTRVJUX1VOVVNFRChz
dHJlYW1JRCwgc3RyZWFtSUQgPT0gcGRmRG9jdW1lbnRSZXF1ZXN0SUQpOwotCi0gICAgbV9zdWdn
ZXN0ZWRGaWxlbmFtZSA9IHN1Z2dlc3RlZEZpbGVuYW1lOwotCi0gICAgaWYgKGVxdWFsSWdub3Jp
bmdDYXNlKG1pbWVUeXBlLCBwb3N0U2NyaXB0TUlNRVR5cGUpKQotICAgICAgICBtX2lzUG9zdFNj
cmlwdCA9IHRydWU7Ci19Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgCi12b2lkIFNpbXBsZVBERlBsdWdpbjo6c3RyZWFtRGlkUmVjZWl2ZURhdGEodWludDY0X3Qg
c3RyZWFtSUQsIGNvbnN0IGNoYXIqIGJ5dGVzLCBpbnQgbGVuZ3RoKQotewotICAgIEFTU0VSVF9V
TlVTRUQoc3RyZWFtSUQsIHN0cmVhbUlEID09IHBkZkRvY3VtZW50UmVxdWVzdElEKTsKLQotICAg
IGlmICghbV9kYXRhKQotICAgICAgICBtX2RhdGEgPSBhZG9wdENGKENGRGF0YUNyZWF0ZU11dGFi
bGUoMCwgMCkpOwotCi0gICAgQ0ZEYXRhQXBwZW5kQnl0ZXMobV9kYXRhLmdldCgpLCByZWludGVy
cHJldF9jYXN0PGNvbnN0IFVJbnQ4Kj4oYnl0ZXMpLCBsZW5ndGgpOwotfQotCi12b2lkIFNpbXBs
ZVBERlBsdWdpbjo6c3RyZWFtRGlkRmluaXNoTG9hZGluZyh1aW50NjRfdCBzdHJlYW1JRCkKLXsK
LSAgICBBU1NFUlRfVU5VU0VEKHN0cmVhbUlELCBzdHJlYW1JRCA9PSBwZGZEb2N1bWVudFJlcXVl
c3RJRCk7Ci0KLSAgICBjb252ZXJ0UG9zdFNjcmlwdERhdGFJZk5lZWRlZCgpOwotICAgIHBkZkRv
Y3VtZW50RGlkTG9hZCgpOwotfQotCi12b2lkIFNpbXBsZVBERlBsdWdpbjo6c3RyZWFtRGlkRmFp
bCh1aW50NjRfdCBzdHJlYW1JRCwgYm9vbCB3YXNDYW5jZWxsZWQpCi17Ci0gICAgQVNTRVJUX1VO
VVNFRChzdHJlYW1JRCwgc3RyZWFtSUQgPT0gcGRmRG9jdW1lbnRSZXF1ZXN0SUQpOwotCi0gICAg
bV9kYXRhLmNsZWFyKCk7Ci19Ci0KLXZvaWQgU2ltcGxlUERGUGx1Z2luOjptYW51YWxTdHJlYW1E
aWRSZWNlaXZlUmVzcG9uc2UoY29uc3QgS1VSTCYgcmVzcG9uc2VVUkwsIHVpbnQzMl90IHN0cmVh
bUxlbmd0aCwgIHVpbnQzMl90IGxhc3RNb2RpZmllZFRpbWUsIGNvbnN0IFN0cmluZyYgbWltZVR5
cGUsIGNvbnN0IFN0cmluZyYgaGVhZGVycywgY29uc3QgU3RyaW5nJiBzdWdnZXN0ZWRGaWxlbmFt
ZSkKLXsKLSAgICBtX3N1Z2dlc3RlZEZpbGVuYW1lID0gc3VnZ2VzdGVkRmlsZW5hbWU7Ci0KLSAg
ICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UobWltZVR5cGUsIHBvc3RTY3JpcHRNSU1FVHlwZSkpCi0g
ICAgICAgIG1faXNQb3N0U2NyaXB0ID0gdHJ1ZTsKLX0KLQotdm9pZCBTaW1wbGVQREZQbHVnaW46
Om1hbnVhbFN0cmVhbURpZFJlY2VpdmVEYXRhKGNvbnN0IGNoYXIqIGJ5dGVzLCBpbnQgbGVuZ3Ro
KQotewotICAgIGlmICghbV9kYXRhKQotICAgICAgICBtX2RhdGEgPSBhZG9wdENGKENGRGF0YUNy
ZWF0ZU11dGFibGUoMCwgMCkpOwotCi0gICAgQ0ZEYXRhQXBwZW5kQnl0ZXMobV9kYXRhLmdldCgp
LCByZWludGVycHJldF9jYXN0PGNvbnN0IFVJbnQ4Kj4oYnl0ZXMpLCBsZW5ndGgpOwotfQotCi12
b2lkIFNpbXBsZVBERlBsdWdpbjo6bWFudWFsU3RyZWFtRGlkRmluaXNoTG9hZGluZygpCi17Ci0g
ICAgY29udmVydFBvc3RTY3JpcHREYXRhSWZOZWVkZWQoKTsKLSAgICBwZGZEb2N1bWVudERpZExv
YWQoKTsKLX0KLQotTlNEYXRhICpTaW1wbGVQREZQbHVnaW46OmxpdmVEYXRhKCkgY29uc3QKLXsK
LSAgICAvLyBTYXZlIGRhdGEgc3RyYWlnaHQgZnJvbSB0aGUgcmVzb3VyY2UgaW5zdGVhZCBvZiBQ
REZLaXQgaWYgdGhlIGRvY3VtZW50IGlzCi0gICAgLy8gdW50b3VjaGVkIGJ5IHRoZSB1c2VyLCBz
byB0aGF0IFBERnMgd2hpY2ggUERGS2l0IGNhbid0IGRpc3BsYXkgd2lsbCBzdGlsbCBiZSBkb3du
bG9hZGFibGUuCi0gICAgaWYgKHBkZkRvY3VtZW50V2FzTXV0YXRlZCgpKQotICAgICAgICByZXR1
cm4gW21fcGRmRG9jdW1lbnQuZ2V0KCkgZGF0YVJlcHJlc2VudGF0aW9uXTsKLSAgICBlbHNlCi0g
ICAgICAgIHJldHVybiByYXdEYXRhKCk7Ci19Ci0KLVBhc3NSZWZQdHI8U2hhcmVkQnVmZmVyPiBT
aW1wbGVQREZQbHVnaW46OmxpdmVSZXNvdXJjZURhdGEoKSBjb25zdAotewotICAgIE5TRGF0YSAq
cGRmRGF0YSA9IGxpdmVEYXRhKCk7Ci0KLSAgICBpZiAoIXBkZkRhdGEpCi0gICAgICAgIHJldHVy
biAwOwotCi0gICAgcmV0dXJuIFNoYXJlZEJ1ZmZlcjo6d3JhcE5TRGF0YShwZGZEYXRhKTsKLX0K
LQotdm9pZCBTaW1wbGVQREZQbHVnaW46Om1hbnVhbFN0cmVhbURpZEZhaWwoYm9vbCkKLXsKLSAg
ICBtX2RhdGEuY2xlYXIoKTsKLX0KLQotYm9vbCBTaW1wbGVQREZQbHVnaW46OmhhbmRsZU1vdXNl
RXZlbnQoY29uc3QgV2ViTW91c2VFdmVudCYgZXZlbnQpCi17Ci0gICAgc3dpdGNoIChldmVudC50
eXBlKCkpIHsKLSAgICBjYXNlIFdlYkV2ZW50OjpNb3VzZU1vdmU6Ci0gICAgICAgIG1vdXNlTW92
ZWRJbkNvbnRlbnRBcmVhKCk7Ci0gICAgICAgIC8vIEZJWE1FOiBTaG91bGQgYWxzbyBub3RpZnkg
c2Nyb2xsYmFyIHRvIHNob3cgaG92ZXIgZWZmZWN0LiBTaG91bGQgYWxzbyBzZW5kIG1vdXNlRXhp
dGVkIHRvIGhpZGUgaXQuCi0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgV2ViRXZlbnQ6Ok1vdXNl
RG93bjogewotICAgICAgICAvLyBSZXR1cm5pbmcgZmFsc2UgYXMgd2lsbCBtYWtlIEV2ZW50SGFu
ZGxlciB1bmZvY3VzIHRoZSBwbHVnLWluLCB3aGljaCBpcyBhcHByb3ByaWF0ZSB3aGVuIGNsaWNr
aW5nIHNjcm9sbGJhcnMuCi0gICAgICAgIC8vIElkZWFsbHksIHdlIHdvdWxkbid0IGNoYW5nZSBm
b2N1cyBhdCBhbGwsIGJ1dCBQbHVnaW5WaWV3IGFscmVhZHkgZGlkIHRoYXQgZm9yIHVzLgotICAg
ICAgICAvLyBXaGVuIHN1cHBvcnQgZm9yIFBERiBmb3JtcyBpcyBhZGRlZCwgd2UnbGwgbmVlZCB0
byBhY3R1YWxseSBmb2N1cyB0aGUgcGx1Zy1pbiB3aGVuIGNsaWNraW5nIGluIGEgZm9ybS4KLSAg
ICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgV2ViRXZlbnQ6Ok1vdXNlVXA6IHsKLSAgICAg
ICAgUGxhdGZvcm1Nb3VzZUV2ZW50IHBsYXRmb3JtRXZlbnQgPSBwbGF0Zm9ybShldmVudCk7Ci0g
ICAgICAgIGlmIChtX2hvcml6b250YWxTY3JvbGxiYXIpCi0gICAgICAgICAgICBtX2hvcml6b250
YWxTY3JvbGxiYXItPm1vdXNlVXAocGxhdGZvcm1FdmVudCk7Ci0gICAgICAgIGlmIChtX3ZlcnRp
Y2FsU2Nyb2xsYmFyKQotICAgICAgICAgICAgbV92ZXJ0aWNhbFNjcm9sbGJhci0+bW91c2VVcChw
bGF0Zm9ybUV2ZW50KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAg
ICAgIGJyZWFrOwotICAgIH0KLSAgICAgICAgCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29s
IFNpbXBsZVBERlBsdWdpbjo6aGFuZGxlV2hlZWxFdmVudChjb25zdCBXZWJXaGVlbEV2ZW50JiBl
dmVudCkKLXsKLSAgICBQbGF0Zm9ybVdoZWVsRXZlbnQgcGxhdGZvcm1FdmVudCA9IHBsYXRmb3Jt
KGV2ZW50KTsKLSAgICByZXR1cm4gU2Nyb2xsYWJsZUFyZWE6OmhhbmRsZVdoZWVsRXZlbnQocGxh
dGZvcm1FdmVudCk7Ci19Ci0KLWJvb2wgU2ltcGxlUERGUGx1Z2luOjpoYW5kbGVNb3VzZUVudGVy
RXZlbnQoY29uc3QgV2ViTW91c2VFdmVudCYpCi17Ci0gICAgbW91c2VFbnRlcmVkQ29udGVudEFy
ZWEoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgU2ltcGxlUERGUGx1Z2luOjpoYW5k
bGVNb3VzZUxlYXZlRXZlbnQoY29uc3QgV2ViTW91c2VFdmVudCYpCi17Ci0gICAgbW91c2VFeGl0
ZWRDb250ZW50QXJlYSgpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBTaW1wbGVQREZQ
bHVnaW46OmhhbmRsZUNvbnRleHRNZW51RXZlbnQoY29uc3QgV2ViTW91c2VFdmVudCYpCi17Ci0g
ICAgLy8gVXNlIGRlZmF1bHQgV2ViS2l0IGNvbnRleHQgbWVudS4KLSAgICByZXR1cm4gZmFsc2U7
Ci19Ci0KLWJvb2wgU2ltcGxlUERGUGx1Z2luOjpoYW5kbGVLZXlib2FyZEV2ZW50KGNvbnN0IFdl
YktleWJvYXJkRXZlbnQmKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBTaW1wbGVQ
REZQbHVnaW46OnNldEZvY3VzKGJvb2wgaGFzRm9jdXMpCi17Ci19Ci0KLU5QT2JqZWN0KiBTaW1w
bGVQREZQbHVnaW46OnBsdWdpblNjcmlwdGFibGVOUE9iamVjdCgpCi17Ci0gICAgcmV0dXJuIDA7
Ci19Ci0KLSNpZiBQTEFURk9STShNQUMpCi0KLXZvaWQgU2ltcGxlUERGUGx1Z2luOjp3aW5kb3dG
b2N1c0NoYW5nZWQoYm9vbCkKLXsKLX0KLQotdm9pZCBTaW1wbGVQREZQbHVnaW46OndpbmRvd0Fu
ZFZpZXdGcmFtZXNDaGFuZ2VkKGNvbnN0IFdlYkNvcmU6OkludFJlY3QmIHdpbmRvd0ZyYW1lSW5T
Y3JlZW5Db29yZGluYXRlcywgY29uc3QgV2ViQ29yZTo6SW50UmVjdCYgdmlld0ZyYW1lSW5XaW5k
b3dDb29yZGluYXRlcykKLXsKLX0KLQotdm9pZCBTaW1wbGVQREZQbHVnaW46OndpbmRvd1Zpc2li
aWxpdHlDaGFuZ2VkKGJvb2wpCi17Ci19Ci0KLXZvaWQgU2ltcGxlUERGUGx1Z2luOjpjb250ZW50
c1NjYWxlRmFjdG9yQ2hhbmdlZChmbG9hdCkKLXsKLX0KLQotdWludDY0X3QgU2ltcGxlUERGUGx1
Z2luOjpwbHVnaW5Db21wbGV4VGV4dElucHV0SWRlbnRpZmllcigpIGNvbnN0Ci17Ci0gICAgcmV0
dXJuIDA7Ci19Ci0KLXZvaWQgU2ltcGxlUERGUGx1Z2luOjpzZW5kQ29tcGxleFRleHRJbnB1dChj
b25zdCBTdHJpbmcmKQotewotfQotCi12b2lkIFNpbXBsZVBERlBsdWdpbjo6c2V0TGF5ZXJIb3N0
aW5nTW9kZShMYXllckhvc3RpbmdNb2RlKQotewotfQotCi0jZW5kaWYKLQotdm9pZCBTaW1wbGVQ
REZQbHVnaW46OnN0b3JhZ2VCbG9ja2luZ1N0YXRlQ2hhbmdlZChib29sKQotewotfQotCi12b2lk
IFNpbXBsZVBERlBsdWdpbjo6cHJpdmF0ZUJyb3dzaW5nU3RhdGVDaGFuZ2VkKGJvb2wpCi17Ci19
Ci0KLWJvb2wgU2ltcGxlUERGUGx1Z2luOjpnZXRGb3JtVmFsdWUoU3RyaW5nJikKLXsKLSAgICBy
ZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgU2ltcGxlUERGUGx1Z2luOjpoYW5kbGVTY3JvbGwoU2Ny
b2xsRGlyZWN0aW9uIGRpcmVjdGlvbiwgU2Nyb2xsR3JhbnVsYXJpdHkgZ3JhbnVsYXJpdHkpCi17
Ci0gICAgcmV0dXJuIHNjcm9sbChkaXJlY3Rpb24sIGdyYW51bGFyaXR5KTsKLX0KLQotU2Nyb2xs
YmFyKiBTaW1wbGVQREZQbHVnaW46Omhvcml6b250YWxTY3JvbGxiYXIoKQotewotICAgIHJldHVy
biBtX2hvcml6b250YWxTY3JvbGxiYXIuZ2V0KCk7Ci19Ci0KLVNjcm9sbGJhciogU2ltcGxlUERG
UGx1Z2luOjp2ZXJ0aWNhbFNjcm9sbGJhcigpCi17Ci0gICAgcmV0dXJuIG1fdmVydGljYWxTY3Jv
bGxiYXIuZ2V0KCk7Ci19Ci0KLUludFJlY3QgU2ltcGxlUERGUGx1Z2luOjpzY3JvbGxDb3JuZXJS
ZWN0KCkgY29uc3QKLXsKLSAgICBpZiAoIW1faG9yaXpvbnRhbFNjcm9sbGJhciB8fCAhbV92ZXJ0
aWNhbFNjcm9sbGJhcikKLSAgICAgICAgcmV0dXJuIEludFJlY3QoKTsKLSAgICBpZiAobV9ob3Jp
em9udGFsU2Nyb2xsYmFyLT5pc092ZXJsYXlTY3JvbGxiYXIoKSkgewotICAgICAgICBBU1NFUlQo
bV92ZXJ0aWNhbFNjcm9sbGJhci0+aXNPdmVybGF5U2Nyb2xsYmFyKCkpOwotICAgICAgICByZXR1
cm4gSW50UmVjdCgpOwotICAgIH0KLSAgICByZXR1cm4gSW50UmVjdChwbHVnaW5WaWV3KCktPndp
ZHRoKCkgLSBtX3ZlcnRpY2FsU2Nyb2xsYmFyLT53aWR0aCgpLCBwbHVnaW5WaWV3KCktPmhlaWdo
dCgpIC0gbV9ob3Jpem9udGFsU2Nyb2xsYmFyLT5oZWlnaHQoKSwgbV92ZXJ0aWNhbFNjcm9sbGJh
ci0+d2lkdGgoKSwgbV9ob3Jpem9udGFsU2Nyb2xsYmFyLT5oZWlnaHQoKSk7Ci19Ci0KLVNjcm9s
bGFibGVBcmVhKiBTaW1wbGVQREZQbHVnaW46OmVuY2xvc2luZ1Njcm9sbGFibGVBcmVhKCkgY29u
c3QKLXsKLSAgICAvLyBGSVhNRTogV2FsayB1cCB0aGUgZnJhbWUgdHJlZSBhbmQgbG9vayBmb3Ig
YSBzY3JvbGxhYmxlIHBhcmVudCBmcmFtZSBvciBSZW5kZXJMYXllci4KLSAgICByZXR1cm4gMDsK
LX0KLQotSW50UmVjdCBTaW1wbGVQREZQbHVnaW46OnNjcm9sbGFibGVBcmVhQm91bmRpbmdCb3go
KSBjb25zdAotewotICAgIHJldHVybiBwbHVnaW5WaWV3KCktPmZyYW1lUmVjdCgpOwotfQotCi12
b2lkIFNpbXBsZVBERlBsdWdpbjo6c2V0U2Nyb2xsT2Zmc2V0KGNvbnN0IEludFBvaW50JiBvZmZz
ZXQpCi17Ci0gICAgbV9zY3JvbGxPZmZzZXQgPSBJbnRTaXplKG9mZnNldC54KCksIG9mZnNldC55
KCkpOwotICAgIC8vIEZJWE1FOiBJdCB3b3VsZCBiZSBiZXR0ZXIgZm9yIHBlcmZvcm1hbmNlIHRv
IGJsaXQgcGFydHMgdGhhdCByZW1haW4gdmlzaWJsZS4KLSAgICBjb250cm9sbGVyKCktPmludmFs
aWRhdGUoSW50UmVjdCgwLCAwLCBtX3NpemUud2lkdGgoKSwgbV9zaXplLmhlaWdodCgpKSk7Ci19
Ci0KLWludCBTaW1wbGVQREZQbHVnaW46OnNjcm9sbFNpemUoU2Nyb2xsYmFyT3JpZW50YXRpb24g
b3JpZW50YXRpb24pIGNvbnN0Ci17Ci0gICAgU2Nyb2xsYmFyKiBzY3JvbGxiYXIgPSAoKG9yaWVu
dGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpID8gbV9ob3Jpem9udGFsU2Nyb2xsYmFyIDog
bV92ZXJ0aWNhbFNjcm9sbGJhcikuZ2V0KCk7Ci0gICAgcmV0dXJuIHNjcm9sbGJhciA/IChzY3Jv
bGxiYXItPnRvdGFsU2l6ZSgpIC0gc2Nyb2xsYmFyLT52aXNpYmxlU2l6ZSgpKSA6IDA7Ci19Ci0K
LWJvb2wgU2ltcGxlUERGUGx1Z2luOjppc0FjdGl2ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKEZyYW1l
KiBjb3JlRnJhbWUgPSBtX2ZyYW1lLT5jb3JlRnJhbWUoKSkgewotICAgICAgICBpZiAoUGFnZSog
cGFnZSA9IGNvcmVGcmFtZS0+cGFnZSgpKQotICAgICAgICAgICAgcmV0dXJuIHBhZ2UtPmZvY3Vz
Q29udHJvbGxlcigpLT5pc0FjdGl2ZSgpOwotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsKLX0K
LQotdm9pZCBTaW1wbGVQREZQbHVnaW46OmludmFsaWRhdGVTY3JvbGxiYXJSZWN0KFNjcm9sbGJh
ciogc2Nyb2xsYmFyLCBjb25zdCBJbnRSZWN0JiByZWN0KQotewotICAgIEludFJlY3QgZGlydHlS
ZWN0ID0gcmVjdDsKLSAgICBkaXJ0eVJlY3QubW92ZUJ5KHNjcm9sbGJhci0+bG9jYXRpb24oKSk7
Ci0gICAgZGlydHlSZWN0Lm1vdmVCeSgtcGx1Z2luVmlldygpLT5sb2NhdGlvbigpKTsKLSAgICBj
b250cm9sbGVyKCktPmludmFsaWRhdGUoZGlydHlSZWN0KTsKLX0KLQotdm9pZCBTaW1wbGVQREZQ
bHVnaW46OmludmFsaWRhdGVTY3JvbGxDb3JuZXJSZWN0KGNvbnN0IEludFJlY3QmIHJlY3QpCi17
Ci0gICAgY29udHJvbGxlcigpLT5pbnZhbGlkYXRlKHJlY3QpOwotfQotCi1ib29sIFNpbXBsZVBE
RlBsdWdpbjo6aXNTY3JvbGxDb3JuZXJWaXNpYmxlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZmFs
c2U7Ci19Ci0KLWludCBTaW1wbGVQREZQbHVnaW46OnNjcm9sbFBvc2l0aW9uKFNjcm9sbGJhciog
c2Nyb2xsYmFyKSBjb25zdAotewotICAgIGlmIChzY3JvbGxiYXItPm9yaWVudGF0aW9uKCkgPT0g
SG9yaXpvbnRhbFNjcm9sbGJhcikKLSAgICAgICAgcmV0dXJuIG1fc2Nyb2xsT2Zmc2V0LndpZHRo
KCk7Ci0gICAgaWYgKHNjcm9sbGJhci0+b3JpZW50YXRpb24oKSA9PSBWZXJ0aWNhbFNjcm9sbGJh
cikKLSAgICAgICAgcmV0dXJuIG1fc2Nyb2xsT2Zmc2V0LmhlaWdodCgpOwotICAgIEFTU0VSVF9O
T1RfUkVBQ0hFRCgpOwotICAgIHJldHVybiAwOwotfQotCi1JbnRQb2ludCBTaW1wbGVQREZQbHVn
aW46OnNjcm9sbFBvc2l0aW9uKCkgY29uc3QKLXsKLSAgICByZXR1cm4gSW50UG9pbnQobV9zY3Jv
bGxPZmZzZXQud2lkdGgoKSwgbV9zY3JvbGxPZmZzZXQuaGVpZ2h0KCkpOwotfQotCi1JbnRQb2lu
dCBTaW1wbGVQREZQbHVnaW46Om1pbmltdW1TY3JvbGxQb3NpdGlvbigpIGNvbnN0Ci17Ci0gICAg
cmV0dXJuIEludFBvaW50KDAsIDApOwotfQotCi1JbnRQb2ludCBTaW1wbGVQREZQbHVnaW46Om1h
eGltdW1TY3JvbGxQb3NpdGlvbigpIGNvbnN0Ci17Ci0gICAgaW50IGhvcml6b250YWxTY3JvbGxi
YXJIZWlnaHQgPSAobV9ob3Jpem9udGFsU2Nyb2xsYmFyICYmICFtX2hvcml6b250YWxTY3JvbGxi
YXItPmlzT3ZlcmxheVNjcm9sbGJhcigpKSA/IG1faG9yaXpvbnRhbFNjcm9sbGJhci0+aGVpZ2h0
KCkgOiAwOwotICAgIGludCB2ZXJ0aWNhbFNjcm9sbGJhcldpZHRoID0gKG1fdmVydGljYWxTY3Jv
bGxiYXIgJiYgIW1fdmVydGljYWxTY3JvbGxiYXItPmlzT3ZlcmxheVNjcm9sbGJhcigpKSA/IG1f
dmVydGljYWxTY3JvbGxiYXItPndpZHRoKCkgOiAwOwotCi0gICAgSW50UG9pbnQgbWF4aW11bU9m
ZnNldChtX3BkZkRvY3VtZW50U2l6ZS53aWR0aCgpIC0gbV9zaXplLndpZHRoKCkgKyB2ZXJ0aWNh
bFNjcm9sbGJhcldpZHRoLCBtX3BkZkRvY3VtZW50U2l6ZS5oZWlnaHQoKSAtIG1fc2l6ZS5oZWln
aHQoKSArIGhvcml6b250YWxTY3JvbGxiYXJIZWlnaHQpOwotICAgIG1heGltdW1PZmZzZXQuY2xh
bXBOZWdhdGl2ZVRvWmVybygpOwotICAgIHJldHVybiBtYXhpbXVtT2Zmc2V0OwotfQotCi1pbnQg
U2ltcGxlUERGUGx1Z2luOjp2aXNpYmxlSGVpZ2h0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbV9z
aXplLmhlaWdodCgpOwotfQotCi1pbnQgU2ltcGxlUERGUGx1Z2luOjp2aXNpYmxlV2lkdGgoKSBj
b25zdAotewotICAgIHJldHVybiBtX3NpemUud2lkdGgoKTsKLX0KLQotSW50U2l6ZSBTaW1wbGVQ
REZQbHVnaW46OmNvbnRlbnRzU2l6ZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fcGRmRG9jdW1l
bnRTaXplOwotfQotCi1ib29sIFNpbXBsZVBERlBsdWdpbjo6c2Nyb2xsYmFyc0NhbkJlQWN0aXZl
KCkgY29uc3QKLXsKLSAgICByZXR1cm4gIXBsdWdpblZpZXcoKS0+ZnJhbWUoKS0+ZG9jdW1lbnQo
KS0+aW5QYWdlQ2FjaGUoKTsKLX0KLQotdm9pZCBTaW1wbGVQREZQbHVnaW46OnNjcm9sbGJhclN0
eWxlQ2hhbmdlZChpbnQsIGJvb2wgZm9yY2VVcGRhdGUpCi17Ci0gICAgaWYgKCFmb3JjZVVwZGF0
ZSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gSWYgdGhlIFBERiB3YXMgc2Nyb2xsZWQgYWxs
IHRoZSB3YXkgdG8gYm90dG9tIHJpZ2h0IGFuZCBzY3JvbGxiYXJzIGNoYW5nZSB0byBvdmVybGF5
IHN0eWxlLCB3ZSBkb24ndCB3YW50IHRvIGRpc3BsYXkgd2hpdGUgcmVjdGFuZ2xlcyB3aGVyZSBz
Y3JvbGxiYXJzIHdlcmUuCi0gICAgSW50UG9pbnQgbmV3U2Nyb2xsT2Zmc2V0ID0gSW50UG9pbnQo
bV9zY3JvbGxPZmZzZXQpLnNocnVua1RvKG1heGltdW1TY3JvbGxQb3NpdGlvbigpKTsKLSAgICBz
ZXRTY3JvbGxPZmZzZXQobmV3U2Nyb2xsT2Zmc2V0KTsKLQotICAgIC8vIEFzIHNpemUgb2YgdGhl
IGNvbnRlbnQgYXJlYSBjaGFuZ2VzLCBzY3JvbGxiYXJzIG1heSBuZWVkIHRvIGFwcGVhciBvciB0
byBkaXNhcHBlYXIuCi0gICAgdXBkYXRlU2Nyb2xsYmFycygpOwotCi0gICAgU2Nyb2xsYWJsZUFy
ZWE6OmNvbnRlbnRzUmVzaXplZCgpOwotfQotCi1JbnRSZWN0IFNpbXBsZVBERlBsdWdpbjo6Y29u
dmVydEZyb21TY3JvbGxiYXJUb0NvbnRhaW5pbmdWaWV3KGNvbnN0IFNjcm9sbGJhciogc2Nyb2xs
YmFyLCBjb25zdCBJbnRSZWN0JiBzY3JvbGxiYXJSZWN0KSBjb25zdAotewotICAgIEludFJlY3Qg
cmVjdCA9IHNjcm9sbGJhclJlY3Q7Ci0gICAgcmVjdC5tb3ZlKHNjcm9sbGJhci0+bG9jYXRpb24o
KSAtIHBsdWdpblZpZXcoKS0+bG9jYXRpb24oKSk7Ci0gICAgCi0gICAgcmV0dXJuIHBsdWdpblZp
ZXcoKS0+ZnJhbWUoKS0+dmlldygpLT5jb252ZXJ0RnJvbVJlbmRlcmVyKHBsdWdpblZpZXcoKS0+
cmVuZGVyZXIoKSwgcmVjdCk7Ci19Ci0KLUludFJlY3QgU2ltcGxlUERGUGx1Z2luOjpjb252ZXJ0
RnJvbUNvbnRhaW5pbmdWaWV3VG9TY3JvbGxiYXIoY29uc3QgU2Nyb2xsYmFyKiBzY3JvbGxiYXIs
IGNvbnN0IEludFJlY3QmIHBhcmVudFJlY3QpIGNvbnN0Ci17Ci0gICAgSW50UmVjdCByZWN0ID0g
cGx1Z2luVmlldygpLT5mcmFtZSgpLT52aWV3KCktPmNvbnZlcnRUb1JlbmRlcmVyKHBsdWdpblZp
ZXcoKS0+cmVuZGVyZXIoKSwgcGFyZW50UmVjdCk7Ci0gICAgcmVjdC5tb3ZlKHBsdWdpblZpZXco
KS0+bG9jYXRpb24oKSAtIHNjcm9sbGJhci0+bG9jYXRpb24oKSk7Ci0gICAgCi0gICAgcmV0dXJu
IHJlY3Q7Ci19Ci0KLUludFBvaW50IFNpbXBsZVBERlBsdWdpbjo6Y29udmVydEZyb21TY3JvbGxi
YXJUb0NvbnRhaW5pbmdWaWV3KGNvbnN0IFNjcm9sbGJhciogc2Nyb2xsYmFyLCBjb25zdCBJbnRQ
b2ludCYgc2Nyb2xsYmFyUG9pbnQpIGNvbnN0Ci17Ci0gICAgSW50UG9pbnQgcG9pbnQgPSBzY3Jv
bGxiYXJQb2ludDsKLSAgICBwb2ludC5tb3ZlKHNjcm9sbGJhci0+bG9jYXRpb24oKSAtIHBsdWdp
blZpZXcoKS0+bG9jYXRpb24oKSk7Ci0gICAgCi0gICAgcmV0dXJuIHBsdWdpblZpZXcoKS0+ZnJh
bWUoKS0+dmlldygpLT5jb252ZXJ0RnJvbVJlbmRlcmVyKHBsdWdpblZpZXcoKS0+cmVuZGVyZXIo
KSwgcG9pbnQpOwotfQotCi1JbnRQb2ludCBTaW1wbGVQREZQbHVnaW46OmNvbnZlcnRGcm9tQ29u
dGFpbmluZ1ZpZXdUb1Njcm9sbGJhcihjb25zdCBTY3JvbGxiYXIqIHNjcm9sbGJhciwgY29uc3Qg
SW50UG9pbnQmIHBhcmVudFBvaW50KSBjb25zdAotewotICAgIEludFBvaW50IHBvaW50ID0gcGx1
Z2luVmlldygpLT5mcmFtZSgpLT52aWV3KCktPmNvbnZlcnRUb1JlbmRlcmVyKHBsdWdpblZpZXco
KS0+cmVuZGVyZXIoKSwgcGFyZW50UG9pbnQpOwotICAgIHBvaW50Lm1vdmUocGx1Z2luVmlldygp
LT5sb2NhdGlvbigpIC0gc2Nyb2xsYmFyLT5sb2NhdGlvbigpKTsKLSAgICAKLSAgICByZXR1cm4g
cG9pbnQ7Ci19Ci0KLWJvb2wgU2ltcGxlUERGUGx1Z2luOjppc0VkaXRpbmdDb21tYW5kRW5hYmxl
ZChjb25zdCBTdHJpbmcmKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBTaW1wbGVQ
REZQbHVnaW46OmhhbmRsZUVkaXRpbmdDb21tYW5kKGNvbnN0IFN0cmluZyYsIGNvbnN0IFN0cmlu
ZyYpCi17Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotICAgIAotYm9vbCBTaW1wbGVQREZQbHVnaW46
OmhhbmRsZXNQYWdlU2NhbGVGYWN0b3IoKQotewotICAgIHJldHVybiBmYWxzZTsKLX0KLQotfSAv
LyBuYW1lc3BhY2UgV2ViS2l0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNz
L1dlYlBhZ2UvV2ViUGFnZS5jcHAgYi9Tb3VyY2UvV2ViS2l0Mi9XZWJQcm9jZXNzL1dlYlBhZ2Uv
V2ViUGFnZS5jcHAKaW5kZXggNzg1YjgxOC4uZDVmNjNjNSAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YktpdDIvV2ViUHJvY2Vzcy9XZWJQYWdlL1dlYlBhZ2UuY3BwCisrKyBiL1NvdXJjZS9XZWJLaXQy
L1dlYlByb2Nlc3MvV2ViUGFnZS9XZWJQYWdlLmNwcApAQCAtMTYzLDcgKzE2Myw2IEBACiAjZW5k
aWYKIAogI2lmIFBMQVRGT1JNKE1BQykKLSNpbmNsdWRlICJTaW1wbGVQREZQbHVnaW4uaCIKICNp
ZiBFTkFCTEUoUERGS0lUX1BMVUdJTikKICNpbmNsdWRlICJQREZQbHVnaW4uaCIKICNlbmRpZgpA
QCAtNTY4LDE1ICs1NjcsMTAgQEAgUGFzc1JlZlB0cjxQbHVnaW4+IFdlYlBhZ2U6OmNyZWF0ZVBs
dWdpbihXZWJGcmFtZSogZnJhbWUsIEhUTUxQbHVnSW5FbGVtZW50KiBwbHUKICAgICB9CiAKICAg
ICBpZiAoIXBsdWdpblByb2Nlc3NUb2tlbikgewotI2lmIFBMQVRGT1JNKE1BQykKKyNpZiBQTEFU
Rk9STShNQUMpICYmIEVOQUJMRShQREZLSVRfUExVR0lOKQogICAgICAgICBTdHJpbmcgcGF0aCA9
IHBhcmFtZXRlcnMudXJsLnBhdGgoKTsKLSAgICAgICAgaWYgKE1JTUVUeXBlUmVnaXN0cnk6Omlz
UERGT3JQb3N0U2NyaXB0TUlNRVR5cGUocGFyYW1ldGVycy5taW1lVHlwZSkgfHwgKHBhcmFtZXRl
cnMubWltZVR5cGUuaXNFbXB0eSgpICYmIChwYXRoLmVuZHNXaXRoKCIucGRmIiwgZmFsc2UpIHx8
IHBhdGguZW5kc1dpdGgoIi5wcyIsIGZhbHNlKSkpKSB7Ci0jaWYgRU5BQkxFKFBERktJVF9QTFVH
SU4pCi0gICAgICAgICAgICBpZiAoc2hvdWxkVXNlUERGUGx1Z2luKCkpCi0gICAgICAgICAgICAg
ICAgcmV0dXJuIFBERlBsdWdpbjo6Y3JlYXRlKGZyYW1lKTsKLSNlbmRpZgotICAgICAgICAgICAg
cmV0dXJuIFNpbXBsZVBERlBsdWdpbjo6Y3JlYXRlKGZyYW1lKTsKLSAgICAgICAgfQorICAgICAg
ICBpZiAoc2hvdWxkVXNlUERGUGx1Z2luKCkgJiYgKE1JTUVUeXBlUmVnaXN0cnk6OmlzUERGT3JQ
b3N0U2NyaXB0TUlNRVR5cGUocGFyYW1ldGVycy5taW1lVHlwZSkgfHwgKHBhcmFtZXRlcnMubWlt
ZVR5cGUuaXNFbXB0eSgpICYmIChwYXRoLmVuZHNXaXRoKCIucGRmIiwgZmFsc2UpIHx8IHBhdGgu
ZW5kc1dpdGgoIi5wcyIsIGZhbHNlKSkpKSkKKyAgICAgICAgICAgIHJldHVybiBQREZQbHVnaW46
OmNyZWF0ZShmcmFtZSk7CiAjZWxzZQogICAgICAgICBVTlVTRURfUEFSQU0oZnJhbWUpOwogI2Vu
ZGlmCg==
</data>
<flag name="review"
          id="229852"
          type_id="1"
          status="+"
          setter="ap"
    />
          </attachment>
      

    </bug>

</bugzilla>