<?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>20604</bug_id>
          
          <creation_ts>2008-09-02 11:39:00 -0700</creation_ts>
          <short_desc>AnimationController.cpp should be split into separate files</short_desc>
          <delta_ts>2008-09-02 18:37:52 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>CSS</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Mac</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>0</everconfirmed>
          <reporter name="Chris Marrin">cmarrin</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>dino</cc>
    
    <cc>simon.fraser</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>89923</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2008-09-02 11:39:00 -0700</bug_when>
    <thetext>The file has gotten very large and unweildy. I propose we split it into 5 parts:

    AnimationController
    CompositeAnimation
    AnimationBase
    ImplicitAnimation
    KeyframeAnimation

and put them all into a new subdirectory of page named &apos;animation&apos;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>89924</commentid>
    <comment_count>1</comment_count>
      <attachid>23122</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2008-09-02 11:52:09 -0700</bug_when>
    <thetext>Created attachment 23122
Patch to fix bug</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>89942</commentid>
    <comment_count>2</comment_count>
      <attachid>23122</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2008-09-02 15:16:29 -0700</bug_when>
    <thetext>Comment on attachment 23122
Patch to fix bug

The Windows project file changes aren&apos;t right.  Each file needs to get its own individual &lt;File&gt; entry.  Look more closely at the file and you&apos;ll see what I mean.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>89946</commentid>
    <comment_count>3</comment_count>
      <attachid>23129</attachid>
    <who name="Chris Marrin">cmarrin</who>
    <bug_when>2008-09-02 15:26:55 -0700</bug_when>
    <thetext>Created attachment 23129
Second attempt at patch to fix issues in WebCore.vcproj</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>89949</commentid>
    <comment_count>4</comment_count>
      <attachid>23129</attachid>
    <who name="Dave Hyatt">hyatt</who>
    <bug_when>2008-09-02 15:35:20 -0700</bug_when>
    <thetext>Comment on attachment 23129
Second attempt at patch to fix issues in WebCore.vcproj

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>89964</commentid>
    <comment_count>5</comment_count>
    <who name="Dean Jackson">dino</who>
    <bug_when>2008-09-02 18:37:52 -0700</bug_when>
    <thetext>Committed r36031
	M	WebCore/GNUmakefile.am
	M	WebCore/WebCore.xcodeproj/project.pbxproj
	M	WebCore/WebCore.pro
	M	WebCore/ChangeLog
	M	WebCore/WebCore.vcproj/WebCore.vcproj
	M	WebCore/WebCoreSources.bkl
	D	WebCore/page/AnimationController.h
	D	WebCore/page/AnimationController.cpp
	A	WebCore/page/animation/AnimationBase.h
	A	WebCore/page/animation/ImplicitAnimation.h
	A	WebCore/page/animation/CompositeAnimation.cpp
	A	WebCore/page/animation/AnimationController.cpp
	A	WebCore/page/animation/KeyframeAnimation.cpp
	A	WebCore/page/animation/CompositeAnimation.h
	A	WebCore/page/animation/AnimationController.h
	A	WebCore/page/animation/KeyframeAnimation.h
	A	WebCore/page/animation/AnimationBase.cpp
	A	WebCore/page/animation/ImplicitAnimation.cpp

</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>23122</attachid>
            <date>2008-09-02 11:52:09 -0700</date>
            <delta_ts>2008-09-02 15:27:25 -0700</delta_ts>
            <desc>Patch to fix bug</desc>
            <filename>20604.patch</filename>
            <type>text/plain</type>
            <size>396583</size>
            <attacher name="Chris Marrin">cmarrin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAzNjAyNSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTcyIEBACisyMDA4LTA5LTAyICBDaHJpcyBNYXJyaW4gIDxzZXQgRU1BSUxfQURE
UkVTUyBlbnZpcm9ubWVudCB2YXJpYWJsZT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBBbmltYXRpb25Db250cm9sbGVyLmNwcCBzaG91bGQgYmUgc3Bs
aXQgaW50byBzZXBhcmF0ZSBmaWxlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MjA2MDQKKyAgICAgICAgCisgICAgICAgIE5vdGU6IEFsbCBtYWtlZmls
ZXMsIGV4Y2VwdCBXZWJDb3JlLnhjb2RlcHJvaiBoYXZlIGJlZW4gY2hhbmdlZCB3aXRob3V0IHRl
c3RpbmcsIHVwb24KKyAgICAgICAgcmVjb21tZW5kYXRpb24gb2YgRGF2ZSBIeWF0dC4KKworICAg
ICAgICAqIEdOVW1ha2VmaWxlLmFtOgorICAgICAgICAqIFdlYkNvcmUucHJvOgorICAgICAgICAq
IFdlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qOgorICAgICAgICAqIFdlYkNvcmUueGNvZGVw
cm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAgKiBXZWJDb3JlU291cmNlcy5ia2w6CisgICAg
ICAgICogcGFnZS9BbmltYXRpb25Db250cm9sbGVyLmNwcDogUmVtb3ZlZC4KKyAgICAgICAgKiBw
YWdlL0FuaW1hdGlvbkNvbnRyb2xsZXIuaDogUmVtb3ZlZC4KKyAgICAgICAgKiBwYWdlL2FuaW1h
dGlvbjogQWRkZWQuCisgICAgICAgICogcGFnZS9hbmltYXRpb24vQW5pbWF0aW9uQmFzZS5jcHA6
IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6c29sdmVFcHNpbG9uKToKKyAgICAgICAgKFdlYkNv
cmU6OnNvbHZlQ3ViaWNCZXppZXJGdW5jdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpBbmltYXRp
b25UaW1lckNhbGxiYWNrOjp0aW1lckZpcmVkKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlv
bkV2ZW50RGlzcGF0Y2hlcjo6QW5pbWF0aW9uRXZlbnREaXNwYXRjaGVyKToKKyAgICAgICAgKFdl
YkNvcmU6OkFuaW1hdGlvbkV2ZW50RGlzcGF0Y2hlcjo6dGltZXJGaXJlZCk6CisgICAgICAgIChX
ZWJDb3JlOjpibGVuZEZ1bmMpOgorICAgICAgICAoV2ViQ29yZTo6UHJvcGVydHlXcmFwcGVyQmFz
ZTo6UHJvcGVydHlXcmFwcGVyQmFzZSk6CisgICAgICAgIChXZWJDb3JlOjpQcm9wZXJ0eVdyYXBw
ZXJCYXNlOjp+UHJvcGVydHlXcmFwcGVyQmFzZSk6CisgICAgICAgIChXZWJDb3JlOjpQcm9wZXJ0
eVdyYXBwZXJCYXNlOjpwcm9wZXJ0eSk6CisgICAgICAgIChXZWJDb3JlOjpQcm9wZXJ0eVdyYXBw
ZXJHZXR0ZXI6OlByb3BlcnR5V3JhcHBlckdldHRlcik6CisgICAgICAgIChXZWJDb3JlOjpQcm9w
ZXJ0eVdyYXBwZXJHZXR0ZXI6OmVxdWFscyk6CisgICAgICAgIChXZWJDb3JlOjpQcm9wZXJ0eVdy
YXBwZXI6OlByb3BlcnR5V3JhcHBlcik6CisgICAgICAgIChXZWJDb3JlOjpQcm9wZXJ0eVdyYXBw
ZXI6OmJsZW5kKToKKyAgICAgICAgKFdlYkNvcmU6OlByb3BlcnR5V3JhcHBlclNoYWRvdzo6UHJv
cGVydHlXcmFwcGVyU2hhZG93KToKKyAgICAgICAgKFdlYkNvcmU6OlByb3BlcnR5V3JhcHBlclNo
YWRvdzo6ZXF1YWxzKToKKyAgICAgICAgKFdlYkNvcmU6OlByb3BlcnR5V3JhcHBlclNoYWRvdzo6
YmxlbmQpOgorICAgICAgICAoV2ViQ29yZTo6UHJvcGVydHlXcmFwcGVyTWF5YmVJbnZhbGlkQ29s
b3I6OlByb3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6
OlByb3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENvbG9yOjplcXVhbHMpOgorICAgICAgICAoV2Vi
Q29yZTo6UHJvcGVydHlXcmFwcGVyTWF5YmVJbnZhbGlkQ29sb3I6OmJsZW5kKToKKyAgICAgICAg
KFdlYkNvcmU6OmVuc3VyZVByb3BlcnR5TWFwKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlv
bkJhc2U6OkFuaW1hdGlvbkJhc2UpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6
fkFuaW1hdGlvbkJhc2UpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6cHJvcGVy
dGllc0VxdWFsKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvbkJhc2U6OmdldFByb3BlcnR5
QXRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpBbmltYXRpb25CYXNlOjpnZXROdW1Qcm9wZXJ0
aWVzKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvbkJhc2U6OmJsZW5kUHJvcGVydGllcyk6
CisgICAgICAgIChXZWJDb3JlOjpBbmltYXRpb25CYXNlOjpzZXRDaGFuZ2VkKToKKyAgICAgICAg
KFdlYkNvcmU6OkFuaW1hdGlvbkJhc2U6OmR1cmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkFu
aW1hdGlvbkJhc2U6OnBsYXlTdGF0ZVBsYXlpbmcpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0
aW9uQmFzZTo6YW5pbWF0aW9uc01hdGNoKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvbkJh
c2U6OmVsZW1lbnRGb3JFdmVudERpc3BhdGNoKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlv
bkJhc2U6OnVwZGF0ZVN0YXRlTWFjaGluZSk6CisgICAgICAgIChXZWJDb3JlOjpBbmltYXRpb25C
YXNlOjphbmltYXRpb25UaW1lckNhbGxiYWNrRmlyZWQpOgorICAgICAgICAoV2ViQ29yZTo6QW5p
bWF0aW9uQmFzZTo6YW5pbWF0aW9uRXZlbnREaXNwYXRjaGVyRmlyZWQpOgorICAgICAgICAoV2Vi
Q29yZTo6QW5pbWF0aW9uQmFzZTo6dXBkYXRlUGxheVN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OkFuaW1hdGlvbkJhc2U6OnByb2dyZXNzKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvbkJh
c2U6OnByaW1lRXZlbnRUaW1lcnMpOgorICAgICAgICAqIHBhZ2UvYW5pbWF0aW9uL0FuaW1hdGlv
bkJhc2UuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpBbmltYXRpb25UaW1lckJhc2U6OkFu
aW1hdGlvblRpbWVyQmFzZSk6CisgICAgICAgIChXZWJDb3JlOjpBbmltYXRpb25UaW1lckJhc2U6
On5BbmltYXRpb25UaW1lckJhc2UpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uVGltZXJC
YXNlOjpzdGFydFRpbWVyKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvblRpbWVyQmFzZTo6
Y2FuY2VsVGltZXIpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uRXZlbnREaXNwYXRjaGVy
Ojp+QW5pbWF0aW9uRXZlbnREaXNwYXRjaGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlv
bkV2ZW50RGlzcGF0Y2hlcjo6c3RhcnRUaW1lcik6CisgICAgICAgIChXZWJDb3JlOjpBbmltYXRp
b25UaW1lckNhbGxiYWNrOjpBbmltYXRpb25UaW1lckNhbGxiYWNrKToKKyAgICAgICAgKFdlYkNv
cmU6OkFuaW1hdGlvblRpbWVyQ2FsbGJhY2s6On5BbmltYXRpb25UaW1lckNhbGxiYWNrKToKKyAg
ICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvblRpbWVyQ2FsbGJhY2s6OnN0YXJ0VGltZXIpOgorICAg
ICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6cmVuZGVyZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6QW5pbWF0aW9uQmFzZTo6c3RhcnRUaW1lKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlv
bkJhc2U6OmNhbmNlbFRpbWVycyk6CisgICAgICAgIChXZWJDb3JlOjpBbmltYXRpb25CYXNlOjop
OgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6d2FpdGluZ1RvU3RhcnQpOgorICAg
ICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6cHJlQWN0aXZlKToKKyAgICAgICAgKFdlYkNv
cmU6OkFuaW1hdGlvbkJhc2U6OnBvc3RBY3RpdmUpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0
aW9uQmFzZTo6YWN0aXZlKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvbkJhc2U6OnJ1bm5p
bmcpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6cGF1c2VkKToKKyAgICAgICAg
KFdlYkNvcmU6OkFuaW1hdGlvbkJhc2U6OmlzTmV3KToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1h
dGlvbkJhc2U6OndhaXRpbmdGb3JTdGFydFRpbWUpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0
aW9uQmFzZTo6d2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKToKKyAgICAgICAgKFdlYkNvcmU6OkFu
aW1hdGlvbkJhc2U6OndhaXRpbmdGb3JFbmRFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpBbmlt
YXRpb25CYXNlOjpzZXRBbmltYXRpbmcpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFz
ZTo6YW5pbWF0aW5nKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvbkJhc2U6OmFuaW1hdGUp
OgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6cmVzZXQpOgorICAgICAgICAoV2Vi
Q29yZTo6QW5pbWF0aW9uQmFzZTo6c2hvdWxkRmlyZUV2ZW50cyk6CisgICAgICAgIChXZWJDb3Jl
OjpBbmltYXRpb25CYXNlOjpzZXRBbmltYXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0
aW9uQmFzZTo6b3ZlcnJpZGRlbik6CisgICAgICAgIChXZWJDb3JlOjpBbmltYXRpb25CYXNlOjph
ZmZlY3RzUHJvcGVydHkpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6aXNBbmlt
YXRpbmdQcm9wZXJ0eSk6CisgICAgICAgIChXZWJDb3JlOjpBbmltYXRpb25CYXNlOjpvdmVycmlk
ZUFuaW1hdGlvbnMpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6cmVzdW1lT3Zl
cnJpZGRlbkFuaW1hdGlvbnMpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6Y29t
cG9zaXRlQW5pbWF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvbkJhc2U6Om9uQW5p
bWF0aW9uU3RhcnQpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6b25BbmltYXRp
b25JdGVyYXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6b25BbmltYXRp
b25FbmQpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6c3RhcnRBbmltYXRpb24p
OgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6ZW5kQW5pbWF0aW9uKToKKyAgICAg
ICAgKiBwYWdlL2FuaW1hdGlvbi9BbmltYXRpb25Db250cm9sbGVyLmNwcDogQ29waWVkIGZyb20g
V2ViQ29yZS9wYWdlL0FuaW1hdGlvbkNvbnRyb2xsZXIuY3BwLgorICAgICAgICAoV2ViQ29yZTo6
QW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OkFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlKToK
KyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjphY2Nlc3NDb21w
b3NpdGVBbmltYXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQ29udHJvbGxlclBy
aXZhdGU6OnN0eWxlQXZhaWxhYmxlKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvbkNvbnRy
b2xsZXJQcml2YXRlOjphbmltYXRpb25UaW1lckZpcmVkKToKKyAgICAgICAgKFdlYkNvcmU6OkFu
aW1hdGlvbkNvbnRyb2xsZXI6OkFuaW1hdGlvbkNvbnRyb2xsZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6QW5pbWF0aW9uQ29udHJvbGxlcjo6Y2FuY2VsQW5pbWF0aW9ucyk6CisgICAgICAgIChXZWJD
b3JlOjpBbmltYXRpb25Db250cm9sbGVyOjpzdHlsZUF2YWlsYWJsZSk6CisgICAgICAgICogcGFn
ZS9hbmltYXRpb24vQW5pbWF0aW9uQ29udHJvbGxlci5oOiBDb3BpZWQgZnJvbSBXZWJDb3JlL3Bh
Z2UvQW5pbWF0aW9uQ29udHJvbGxlci5oLgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQ29u
dHJvbGxlcjo6c2V0V2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKToKKyAgICAgICAgKiBwYWdlL2Fu
aW1hdGlvbi9Db21wb3NpdGVBbmltYXRpb24uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6
OkNvbXBvc2l0ZUFuaW1hdGlvbjo6fkNvbXBvc2l0ZUFuaW1hdGlvbik6CisgICAgICAgIChXZWJD
b3JlOjpDb21wb3NpdGVBbmltYXRpb246OnVwZGF0ZVRyYW5zaXRpb25zKToKKyAgICAgICAgKFdl
YkNvcmU6OkNvbXBvc2l0ZUFuaW1hdGlvbjo6dXBkYXRlS2V5ZnJhbWVBbmltYXRpb25zKToKKyAg
ICAgICAgKFdlYkNvcmU6OkNvbXBvc2l0ZUFuaW1hdGlvbjo6ZmluZEtleWZyYW1lQW5pbWF0aW9u
KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBvc2l0ZUFuaW1hdGlvbjo6YW5pbWF0ZSk6CisgICAg
ICAgIChXZWJDb3JlOjpDb21wb3NpdGVBbmltYXRpb246OnNldEFuaW1hdGluZyk6CisgICAgICAg
IChXZWJDb3JlOjpDb21wb3NpdGVBbmltYXRpb246OmFuaW1hdGluZyk6CisgICAgICAgIChXZWJD
b3JlOjpDb21wb3NpdGVBbmltYXRpb246OnJlc2V0VHJhbnNpdGlvbnMpOgorICAgICAgICAoV2Vi
Q29yZTo6Q29tcG9zaXRlQW5pbWF0aW9uOjpyZXNldEFuaW1hdGlvbnMpOgorICAgICAgICAoV2Vi
Q29yZTo6Q29tcG9zaXRlQW5pbWF0aW9uOjpjbGVhbnVwRmluaXNoZWRBbmltYXRpb25zKToKKyAg
ICAgICAgKFdlYkNvcmU6OkNvbXBvc2l0ZUFuaW1hdGlvbjo6c2V0QW5pbWF0aW9uU3RhcnRUaW1l
KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBvc2l0ZUFuaW1hdGlvbjo6c2V0VHJhbnNpdGlvblN0
YXJ0VGltZSk6CisgICAgICAgIChXZWJDb3JlOjpDb21wb3NpdGVBbmltYXRpb246OnN1c3BlbmRB
bmltYXRpb25zKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBvc2l0ZUFuaW1hdGlvbjo6cmVzdW1l
QW5pbWF0aW9ucyk6CisgICAgICAgIChXZWJDb3JlOjpDb21wb3NpdGVBbmltYXRpb246Om92ZXJy
aWRlSW1wbGljaXRBbmltYXRpb25zKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBvc2l0ZUFuaW1h
dGlvbjo6cmVzdW1lT3ZlcnJpZGRlbkltcGxpY2l0QW5pbWF0aW9ucyk6CisgICAgICAgIChXZWJD
b3JlOjpjb21wYXJlQW5pbWF0aW9uSW5kaWNlcyk6CisgICAgICAgIChXZWJDb3JlOjpDb21wb3Np
dGVBbmltYXRpb246OnN0eWxlQXZhaWxhYmxlKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBvc2l0
ZUFuaW1hdGlvbjo6aXNBbmltYXRpbmdQcm9wZXJ0eSk6CisgICAgICAgIChXZWJDb3JlOjpDb21w
b3NpdGVBbmltYXRpb246OnNldFdhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZSk6CisgICAgICAgICog
cGFnZS9hbmltYXRpb24vQ29tcG9zaXRlQW5pbWF0aW9uLmg6IEFkZGVkLgorICAgICAgICAoV2Vi
Q29yZTo6Q29tcG9zaXRlQW5pbWF0aW9uOjpDb21wb3NpdGVBbmltYXRpb24pOgorICAgICAgICAo
V2ViQ29yZTo6Q29tcG9zaXRlQW5pbWF0aW9uOjpoYXNBbmltYXRpb25Gb3JQcm9wZXJ0eSk6Cisg
ICAgICAgIChXZWJDb3JlOjpDb21wb3NpdGVBbmltYXRpb246OnN1c3BlbmRlZCk6CisgICAgICAg
ICogcGFnZS9hbmltYXRpb24vSW1wbGljaXRBbmltYXRpb24uY3BwOiBBZGRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OkltcGxpY2l0QW5pbWF0aW9uOjpJbXBsaWNpdEFuaW1hdGlvbik6CisgICAgICAg
IChXZWJDb3JlOjpJbXBsaWNpdEFuaW1hdGlvbjo6c2hvdWxkU2VuZEV2ZW50Rm9yTGlzdGVuZXIp
OgorICAgICAgICAoV2ViQ29yZTo6SW1wbGljaXRBbmltYXRpb246OmFuaW1hdGUpOgorICAgICAg
ICAoV2ViQ29yZTo6SW1wbGljaXRBbmltYXRpb246Om9uQW5pbWF0aW9uRW5kKToKKyAgICAgICAg
KFdlYkNvcmU6OkltcGxpY2l0QW5pbWF0aW9uOjpzZW5kVHJhbnNpdGlvbkV2ZW50KToKKyAgICAg
ICAgKFdlYkNvcmU6OkltcGxpY2l0QW5pbWF0aW9uOjpyZXNldCk6CisgICAgICAgIChXZWJDb3Jl
OjpJbXBsaWNpdEFuaW1hdGlvbjo6c2V0T3ZlcnJpZGRlbik6CisgICAgICAgIChXZWJDb3JlOjpJ
bXBsaWNpdEFuaW1hdGlvbjo6YWZmZWN0c1Byb3BlcnR5KToKKyAgICAgICAgKFdlYkNvcmU6Oklt
cGxpY2l0QW5pbWF0aW9uOjppc1RhcmdldFByb3BlcnR5RXF1YWwpOgorICAgICAgICAoV2ViQ29y
ZTo6SW1wbGljaXRBbmltYXRpb246OmJsZW5kUHJvcGVydHlWYWx1ZUluU3R5bGUpOgorICAgICAg
ICAqIHBhZ2UvYW5pbWF0aW9uL0ltcGxpY2l0QW5pbWF0aW9uLmg6IEFkZGVkLgorICAgICAgICAo
V2ViQ29yZTo6SW1wbGljaXRBbmltYXRpb246On5JbXBsaWNpdEFuaW1hdGlvbik6CisgICAgICAg
IChXZWJDb3JlOjpJbXBsaWNpdEFuaW1hdGlvbjo6dHJhbnNpdGlvblByb3BlcnR5KToKKyAgICAg
ICAgKFdlYkNvcmU6OkltcGxpY2l0QW5pbWF0aW9uOjphbmltYXRpbmdQcm9wZXJ0eSk6CisgICAg
ICAgIChXZWJDb3JlOjpJbXBsaWNpdEFuaW1hdGlvbjo6b3ZlcnJpZGRlbik6CisgICAgICAgIChX
ZWJDb3JlOjpJbXBsaWNpdEFuaW1hdGlvbjo6c2hvdWxkRmlyZUV2ZW50cyk6CisgICAgICAgIChX
ZWJDb3JlOjpJbXBsaWNpdEFuaW1hdGlvbjo6aGFzU3R5bGUpOgorICAgICAgICAqIHBhZ2UvYW5p
bWF0aW9uL0tleWZyYW1lQW5pbWF0aW9uLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpL
ZXlmcmFtZUFuaW1hdGlvbjo6YW5pbWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlmcmFtZUFu
aW1hdGlvbjo6ZW5kQW5pbWF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OktleWZyYW1lQW5pbWF0
aW9uOjpzaG91bGRTZW5kRXZlbnRGb3JMaXN0ZW5lcik6CisgICAgICAgIChXZWJDb3JlOjpLZXlm
cmFtZUFuaW1hdGlvbjo6b25BbmltYXRpb25TdGFydCk6CisgICAgICAgIChXZWJDb3JlOjpLZXlm
cmFtZUFuaW1hdGlvbjo6b25BbmltYXRpb25JdGVyYXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6
S2V5ZnJhbWVBbmltYXRpb246Om9uQW5pbWF0aW9uRW5kKToKKyAgICAgICAgKFdlYkNvcmU6Oktl
eWZyYW1lQW5pbWF0aW9uOjpzZW5kQW5pbWF0aW9uRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6
S2V5ZnJhbWVBbmltYXRpb246Om92ZXJyaWRlQW5pbWF0aW9ucyk6CisgICAgICAgIChXZWJDb3Jl
OjpLZXlmcmFtZUFuaW1hdGlvbjo6cmVzdW1lT3ZlcnJpZGRlbkFuaW1hdGlvbnMpOgorICAgICAg
ICAoV2ViQ29yZTo6S2V5ZnJhbWVBbmltYXRpb246OmFmZmVjdHNQcm9wZXJ0eSk6CisgICAgICAg
ICogcGFnZS9hbmltYXRpb24vS2V5ZnJhbWVBbmltYXRpb24uaDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpLZXlmcmFtZUFuaW1hdGlvbjo6S2V5ZnJhbWVBbmltYXRpb24pOgorICAgICAgICAo
V2ViQ29yZTo6S2V5ZnJhbWVBbmltYXRpb246On5LZXlmcmFtZUFuaW1hdGlvbik6CisgICAgICAg
IChXZWJDb3JlOjpLZXlmcmFtZUFuaW1hdGlvbjo6c2V0TmFtZSk6CisgICAgICAgIChXZWJDb3Jl
OjpLZXlmcmFtZUFuaW1hdGlvbjo6bmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlmcmFtZUFu
aW1hdGlvbjo6aW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6S2V5ZnJhbWVBbmltYXRpb246OnNo
b3VsZEZpcmVFdmVudHMpOgorCiAyMDA4LTA5LTAyICBBbGV4ZXkgUHJvc2t1cnlha292ICA8YXBA
d2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBBZGFtIFJvYmVuLgpJbmRleDogV2Vi
Q29yZS9HTlVtYWtlZmlsZS5hbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL0dOVW1ha2VmaWxlLmFt
CShyZXZpc2lvbiAzNTk5NSkKKysrIFdlYkNvcmUvR05VbWFrZWZpbGUuYW0JKHdvcmtpbmcgY29w
eSkKQEAgLTE0MDUsOCArMTQwNSwxNiBAQCB3ZWJjb3JlX3NvdXJjZXMgKz0gXAogCVdlYkNvcmUv
cGFnZS9BY2Nlc3NpYmlsaXR5VGFibGVIZWFkZXJDb250YWluZXIuaCBcCiAJV2ViQ29yZS9wYWdl
L0FjY2Vzc2liaWxpdHlUYWJsZVJvdy5jcHAgXAogCVdlYkNvcmUvcGFnZS9BY2Nlc3NpYmlsaXR5
VGFibGVSb3cuaCBcCi0JV2ViQ29yZS9wYWdlL0FuaW1hdGlvbkNvbnRyb2xsZXIuY3BwIFwKLQlX
ZWJDb3JlL3BhZ2UvQW5pbWF0aW9uQ29udHJvbGxlci5oIFwKKwlXZWJDb3JlL3BhZ2UvYW5pbWF0
aW9uL0FuaW1hdGlvbkJhc2UuY3BwIFwKKwlXZWJDb3JlL3BhZ2UvYW5pbWF0aW9uL0FuaW1hdGlv
bkJhc2UuaCBcCisJV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9BbmltYXRpb25Db250cm9sbGVyLmNw
cCBcCisJV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9BbmltYXRpb25Db250cm9sbGVyLmggXAorCVdl
YkNvcmUvcGFnZS9hbmltYXRpb24vQ29tcG9zaXRlQW5pbWF0aW9uLmNwcCBcCisJV2ViQ29yZS9w
YWdlL2FuaW1hdGlvbi9Db21wb3NpdGVBbmltYXRpb24uaCBcCisJV2ViQ29yZS9wYWdlL2FuaW1h
dGlvbi9JbXBsaWNpdEFuaW1hdGlvbi5jcHAgXAorCVdlYkNvcmUvcGFnZS9hbmltYXRpb24vSW1w
bGljaXRBbmltYXRpb24uaCBcCisJV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9LZXlmcmFtZUFuaW1h
dGlvbi5jcHAgXAorCVdlYkNvcmUvcGFnZS9hbmltYXRpb24vS2V5ZnJhbWVBbmltYXRpb24uaCBc
CiAJV2ViQ29yZS9wYWdlL0JhckluZm8uY3BwIFwKIAlXZWJDb3JlL3BhZ2UvQmFySW5mby5oIFwK
IAlXZWJDb3JlL3BhZ2UvQ2hyb21lLmNwcCBcCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUucHJvCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS5wcm8JKHJldmlzaW9uIDM1OTk1KQorKysgV2Vi
Q29yZS9XZWJDb3JlLnBybwkod29ya2luZyBjb3B5KQpAQCAtNzMwLDcgKzczMCwxMSBAQCBTT1VS
Q0VTICs9IFwKICAgICBwYWdlL0FjY2Vzc2liaWxpdHlUYWJsZUNvbHVtbi5jcHAgXCAgICAKICAg
ICBwYWdlL0FjY2Vzc2liaWxpdHlUYWJsZUhlYWRlckNvbnRhaW5lci5jcHAgXCAgICAKICAgICBw
YWdlL0FjY2Vzc2liaWxpdHlUYWJsZVJvdy5jcHAgXCAgICAKLSAgICBwYWdlL0FuaW1hdGlvbkNv
bnRyb2xsZXIuY3BwIFwgICAgCisgICAgcGFnZS9hbmltYXRpb24vQW5pbWF0aW9uQmFzZS5jcHAg
XAorICAgIHBhZ2UvYW5pbWF0aW9uL0FuaW1hdGlvbkNvbnRyb2xsZXIuY3BwIFwKKyAgICBwYWdl
L2FuaW1hdGlvbi9Db21wb3NpdGVBbmltYXRpb24uY3BwIFwKKyAgICBwYWdlL2FuaW1hdGlvbi9J
bXBsaWNpdEFuaW1hdGlvbi5jcHAgXAorICAgIHBhZ2UvYW5pbWF0aW9uL0tleWZyYW1lQW5pbWF0
aW9uLmNwcCBcCiAgICAgcGFnZS9BWE9iamVjdENhY2hlLmNwcCBcCiAgICAgcGFnZS9CYXJJbmZv
LmNwcCBcCiAgICAgcGFnZS9DaHJvbWUuY3BwIFwKSW5kZXg6IFdlYkNvcmUvV2ViQ29yZVNvdXJj
ZXMuYmtsCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZVNvdXJjZXMuYmtsCShyZXZpc2lv
biAzNTk5NSkKKysrIFdlYkNvcmUvV2ViQ29yZVNvdXJjZXMuYmtsCSh3b3JraW5nIGNvcHkpCkBA
IC02MjcsNyArNjI3LDExIEBAIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbGlzdCBvZiBmaWxlcyBu
ZWUKICAgICAgICAgcGFnZS9BY2Nlc3NpYmlsaXR5VGFibGVDb2x1bW4uY3BwCiAgICAgICAgIHBh
Z2UvQWNjZXNzaWJpbGl0eVRhYmxlSGVhZGVyQ29udGFpbmVyLmNwcAogICAgICAgICBwYWdlL0Fj
Y2Vzc2liaWxpdHlUYWJsZVJvdy5jcHAKLSAgICAgICAgcGFnZS9BbmltYXRpb25Db250cm9sbGVy
LmNwcAorICAgICAgICBwYWdlL2FuaW1hdGlvbi9BbmltYXRpb25CYXNlLmNwcAorICAgICAgICBw
YWdlL2FuaW1hdGlvbi9BbmltYXRpb25Db250cm9sbGVyLmNwcAorICAgICAgICBwYWdlL2FuaW1h
dGlvbi9Db21wb3NpdGVBbmltYXRpb24uY3BwCisgICAgICAgIHBhZ2UvYW5pbWF0aW9uL0ltcGxp
Y2l0QW5pbWF0aW9uLmNwcAorICAgICAgICBwYWdlL2FuaW1hdGlvbi9LZXlmcmFtZUFuaW1hdGlv
bi5jcHAKICAgICAgICAgcGFnZS9BWE9iamVjdENhY2hlLmNwcAogICAgICAgICBwYWdlL0Jhcklu
Zm8uY3BwCiAgICAgICAgIHBhZ2UvQ2hyb21lLmNwcApJbmRleDogV2ViQ29yZS9XZWJDb3JlLnZj
cHJvai9XZWJDb3JlLnZjcHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUudmNwcm9q
L1dlYkNvcmUudmNwcm9qCShyZXZpc2lvbiAzNTk5NSkKKysrIFdlYkNvcmUvV2ViQ29yZS52Y3By
b2ovV2ViQ29yZS52Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAgLTE5MDQsNyArMTkwNCwxMSBAQAog
CQkJCT4NCiAJCQk8L0ZpbGU+DQogCQkJPEZpbGUNCi0JCQkJUmVsYXRpdmVQYXRoPSIuLlxwYWdl
XEFuaW1hdGlvbkNvbnRyb2xsZXIuY3BwIg0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBhZ2VcYW5p
bWF0aW9uXEFuaW1hdGlvbkJhc2UuY3BwIg0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBhZ2VcYW5p
bWF0aW9uXEFuaW1hdGlvbkNvbnRyb2xsZXIuY3BwIg0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBh
Z2VcYW5pbWF0aW9uXENvbXBvc2l0ZUFuaW1hdGlvbi5jcHAiDQorCQkJCVJlbGF0aXZlUGF0aD0i
Li5ccGFnZVxhbmltYXRpb25cSW1wbGljaXRBbmltYXRpb24uY3BwIg0KKwkJCQlSZWxhdGl2ZVBh
dGg9Ii4uXHBhZ2VcYW5pbWF0aW9uXEtleWZyYW1lQW5pbWF0aW9uLmNwcCINCiAJCQkJPg0KIAkJ
CQk8RmlsZUNvbmZpZ3VyYXRpb24NCiAJCQkJCU5hbWU9IlJlbGVhc2VfUEdPfFdpbjMyIg0KQEAg
LTE5MTYsNyArMTkyMCwxMSBAQAogCQkJCTwvRmlsZUNvbmZpZ3VyYXRpb24+DQogCQkJPC9GaWxl
Pg0KIAkJCTxGaWxlDQotCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGFnZVxBbmltYXRpb25Db250cm9s
bGVyLmgiDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGFnZVxhbmltYXRpb25cQW5pbWF0aW9uQmFz
ZS5oIg0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBhZ2VcYW5pbWF0aW9uXEFuaW1hdGlvbkNvbnRy
b2xsZXIuaCINCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxwYWdlXGFuaW1hdGlvblxDb21wb3NpdGVB
bmltYXRpb24uaCINCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxwYWdlXGFuaW1hdGlvblxJbXBsaWNp
dEFuaW1hdGlvbi5oIg0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBhZ2VcYW5pbWF0aW9uXEtleWZy
YW1lQW5pbWF0aW9uLmgiDQogCQkJCT4NCiAJCQk8L0ZpbGU+DQogCQkJPEZpbGUNCkluZGV4OiBX
ZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvago9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gMzU5OTUp
CisrKyBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBj
b3B5KQpAQCAtNDcyLDYgKzQ3MiwxNiBAQAogCQk0NkY5RDVERDBCMEQ2MDE3MDAyOEVFMzYgLyog
YWxpYXNDdXJzb3IucG5nIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSA0NkY5RDVEQTBCMEQ2MDE3MDAyOEVFMzYgLyogYWxpYXNDdXJzb3IucG5nICovOyB9
OwogCQk0NkY5RDVERTBCMEQ2MDE3MDAyOEVFMzYgLyogbm9Ecm9wQ3Vyc29yLnBuZyBpbiBSZXNv
dXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDZGOUQ1REIwQjBENjAx
NzAwMjhFRTM2IC8qIG5vRHJvcEN1cnNvci5wbmcgKi87IH07CiAJCTQ2RjlENURGMEIwRDYwMTcw
MDI4RUUzNiAvKiBwcm9ncmVzc0N1cnNvci5wbmcgaW4gUmVzb3VyY2VzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ2RjlENURDMEIwRDYwMTcwMDI4RUUzNiAvKiBwcm9ncmVz
c0N1cnNvci5wbmcgKi87IH07CisJCTQ5QkQ1OTVCMEU2OEEyNzgwMDk0NzA2QyAvKiBBbmltYXRp
b25Db250cm9sbGVyLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IDQ5QkQ1OTU5MEU2OEEyNzgwMDk0NzA2QyAvKiBBbmltYXRpb25Db250cm9sbGVyLmNw
cCAqLzsgfTsKKwkJNDlCRDU5NUMwRTY4QTI3ODAwOTQ3MDZDIC8qIEFuaW1hdGlvbkNvbnRyb2xs
ZXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ5QkQ1
OTVBMEU2OEEyNzgwMDk0NzA2QyAvKiBBbmltYXRpb25Db250cm9sbGVyLmggKi87IH07CisJCTQ5
QkQ1OTkwMEU2OEI4NEUwMDk0NzA2QyAvKiBBbmltYXRpb25CYXNlLmggaW4gSGVhZGVycyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0OUJENTk4RTBFNjhCODRFMDA5NDcwNkMg
LyogQW5pbWF0aW9uQmFzZS5oICovOyB9OworCQk0OUJENTk5MTBFNjhCODRFMDA5NDcwNkMgLyog
QW5pbWF0aW9uQmFzZS5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSA0OUJENTk4RjBFNjhCODRFMDA5NDcwNkMgLyogQW5pbWF0aW9uQmFzZS5jcHAgKi87
IH07CisJCTQ5QkQ1OUM4MEU2OEM2MTQwMDk0NzA2QyAvKiBLZXlmcmFtZUFuaW1hdGlvbi5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDlCRDU5QzQwRTY4
QzYxNDAwOTQ3MDZDIC8qIEtleWZyYW1lQW5pbWF0aW9uLmggKi87IH07CisJCTQ5QkQ1OUM5MEU2
OEM2MTQwMDk0NzA2QyAvKiBLZXlmcmFtZUFuaW1hdGlvbi5jcHAgaW4gU291cmNlcyAqLyA9IHtp
c2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0OUJENTlDNTBFNjhDNjE0MDA5NDcwNkMgLyog
S2V5ZnJhbWVBbmltYXRpb24uY3BwICovOyB9OworCQk0OUJENTlDQTBFNjhDNjE0MDA5NDcwNkMg
LyogSW1wbGljaXRBbmltYXRpb24uaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IDQ5QkQ1OUM2MEU2OEM2MTQwMDk0NzA2QyAvKiBJbXBsaWNpdEFuaW1hdGlv
bi5oICovOyB9OworCQk0OUJENTlDQjBFNjhDNjE0MDA5NDcwNkMgLyogSW1wbGljaXRBbmltYXRp
b24uY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDlC
RDU5QzcwRTY4QzYxNDAwOTQ3MDZDIC8qIEltcGxpY2l0QW5pbWF0aW9uLmNwcCAqLzsgfTsKKwkJ
NDlCRDVBMjcwRTY4QzlCQjAwOTQ3MDZDIC8qIENvbXBvc2l0ZUFuaW1hdGlvbi5oIGluIEhlYWRl
cnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDlCRDVBMjUwRTY4QzlCQjAw
OTQ3MDZDIC8qIENvbXBvc2l0ZUFuaW1hdGlvbi5oICovOyB9OworCQk0OUJENUEyODBFNjhDOUJC
MDA5NDcwNkMgLyogQ29tcG9zaXRlQW5pbWF0aW9uLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ5QkQ1QTI2MEU2OEM5QkIwMDk0NzA2QyAvKiBDb21w
b3NpdGVBbmltYXRpb24uY3BwICovOyB9OwogCQk0QThDOTZFQjBCRTY5MDMyMDA0RUVGRjAgLyog
U2VsZWN0aW9uQ29udHJvbGxlck1hYy5tbSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxk
RmlsZTsgZmlsZVJlZiA9IDRBOEM5NkVBMEJFNjkwMzIwMDRFRUZGMCAvKiBTZWxlY3Rpb25Db250
cm9sbGVyTWFjLm1tICovOyB9OwogCQk0QjE3Q0JDOTBEOTQ1QjM3MDA1M0YxODMgLyogQWNjZXNz
aWJpbGl0eU9iamVjdC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gNEIxN0NCQzgwRDk0NUIzNzAwNTNGMTgzIC8qIEFjY2Vzc2liaWxpdHlPYmplY3QuaCAq
Lzsgc2V0dGluZ3MgPSB7QVRUUklCVVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQk0QjE3Q0JD
QzBEOTQ1QjkxMDA1M0YxODMgLyogQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXIubW0gaW4gU291
cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0QjE3Q0JDQTBEOTQ1Qjkx
MDA1M0YxODMgLyogQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXIubW0gKi87IH07CkBAIC0zNzgy
LDggKzM3OTIsNiBAQAogCQlCQzdGQTY4MjBEMUYxNjc5MDBEQjIyQTkgLyogU2VsZWN0b3JOb2Rl
TGlzdC5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBC
QzdGQTY4MDBEMUYxNjc5MDBEQjIyQTkgLyogU2VsZWN0b3JOb2RlTGlzdC5jcHAgKi87IH07CiAJ
CUJDODBDOTg3MENEMjk0RUUwMEEwQjdCMyAvKiBDU1NUaW1pbmdGdW5jdGlvblZhbHVlLmNwcCBp
biBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDODBDOTg1MENE
Mjk0RUUwMEEwQjdCMyAvKiBDU1NUaW1pbmdGdW5jdGlvblZhbHVlLmNwcCAqLzsgfTsKIAkJQkM4
MEM5ODgwQ0QyOTRFRTAwQTBCN0IzIC8qIENTU1RpbWluZ0Z1bmN0aW9uVmFsdWUuaCBpbiBIZWFk
ZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDODBDOTg2MENEMjk0RUUw
MEEwQjdCMyAvKiBDU1NUaW1pbmdGdW5jdGlvblZhbHVlLmggKi87IH07Ci0JCUJDODBDOThCMENE
Mjk1MDUwMEEwQjdCMyAvKiBBbmltYXRpb25Db250cm9sbGVyLmNwcCBpbiBTb3VyY2VzICovID0g
e2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDODBDOTg5MENEMjk1MDUwMEEwQjdCMyAv
KiBBbmltYXRpb25Db250cm9sbGVyLmNwcCAqLzsgfTsKLQkJQkM4MEM5OEMwQ0QyOTUwNTAwQTBC
N0IzIC8qIEFuaW1hdGlvbkNvbnRyb2xsZXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1
aWxkRmlsZTsgZmlsZVJlZiA9IEJDODBDOThBMENEMjk1MDUwMEEwQjdCMyAvKiBBbmltYXRpb25D
b250cm9sbGVyLmggKi87IH07CiAJCUJDODI0MzI5MEQwQ0U4QTIwMDQ2MEM4RiAvKiBKU1NRTEVy
cm9yLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSBCQzgy
NDMyNTBEMENFOEEyMDA0NjBDOEYgLyogSlNTUUxFcnJvci5oICovOyB9OwogCQlCQzgyNDMyQTBE
MENFOEEyMDA0NjBDOEYgLyogSlNTUUxUcmFuc2FjdGlvbi5oIGluIEhlYWRlcnMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkM4MjQzMjYwRDBDRThBMjAwNDYwQzhGIC8qIEpT
U1FMVHJhbnNhY3Rpb24uaCAqLzsgfTsKIAkJQkM4MjQzMkIwRDBDRThBMjAwNDYwQzhGIC8qIEpT
Vm9pZENhbGxiYWNrLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmls
ZVJlZiA9IEJDODI0MzI3MEQwQ0U4QTIwMDQ2MEM4RiAvKiBKU1ZvaWRDYWxsYmFjay5jcHAgKi87
IH07CkBAIC01MDQyLDYgKzUwNTAsMTYgQEAKIAkJNDZGOUQ1REEwQjBENjAxNzAwMjhFRTM2IC8q
IGFsaWFzQ3Vyc29yLnBuZyAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25G
aWxlVHlwZSA9IGltYWdlLnBuZzsgcGF0aCA9IGFsaWFzQ3Vyc29yLnBuZzsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKIAkJNDZGOUQ1REIwQjBENjAxNzAwMjhFRTM2IC8qIG5vRHJvcEN1cnNv
ci5wbmcgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBp
bWFnZS5wbmc7IHBhdGggPSBub0Ryb3BDdXJzb3IucG5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwogCQk0NkY5RDVEQzBCMEQ2MDE3MDAyOEVFMzYgLyogcHJvZ3Jlc3NDdXJzb3IucG5nICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gaW1hZ2UucG5n
OyBwYXRoID0gcHJvZ3Jlc3NDdXJzb3IucG5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owor
CQk0OUJENTk1OTBFNjhBMjc4MDA5NDcwNkMgLyogQW5pbWF0aW9uQ29udHJvbGxlci5jcHAgKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IG5hbWUgPSBBbmltYXRpb25Db250cm9sbGVyLmNw
cDsgcGF0aCA9IGFuaW1hdGlvbi9BbmltYXRpb25Db250cm9sbGVyLmNwcDsgc291cmNlVHJlZSA9
ICI8Z3JvdXA+IjsgfTsKKwkJNDlCRDU5NUEwRTY4QTI3ODAwOTQ3MDZDIC8qIEFuaW1hdGlvbkNv
bnRyb2xsZXIuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQW5pbWF0aW9uQ29u
dHJvbGxlci5oOyBwYXRoID0gYW5pbWF0aW9uL0FuaW1hdGlvbkNvbnRyb2xsZXIuaDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDlCRDU5OEUwRTY4Qjg0RTAwOTQ3MDZDIC8qIEFuaW1h
dGlvbkJhc2UuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gQW5pbWF0aW9uQmFz
ZS5oOyBwYXRoID0gYW5pbWF0aW9uL0FuaW1hdGlvbkJhc2UuaDsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgfTsKKwkJNDlCRDU5OEYwRTY4Qjg0RTAwOTQ3MDZDIC8qIEFuaW1hdGlvbkJhc2UuY3Bw
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gQW5pbWF0aW9uQmFzZS5jcHA7
IHBhdGggPSBhbmltYXRpb24vQW5pbWF0aW9uQmFzZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CisJCTQ5QkQ1OUM0MEU2OEM2MTQwMDk0NzA2QyAvKiBLZXlmcmFtZUFuaW1hdGlvbi5o
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBLZXlmcmFtZUFuaW1hdGlvbi5oOyBw
YXRoID0gYW5pbWF0aW9uL0tleWZyYW1lQW5pbWF0aW9uLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3Vw
PiI7IH07CisJCTQ5QkQ1OUM1MEU2OEM2MTQwMDk0NzA2QyAvKiBLZXlmcmFtZUFuaW1hdGlvbi5j
cHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IG5hbWUgPSBLZXlmcmFtZUFuaW1hdGlv
bi5jcHA7IHBhdGggPSBhbmltYXRpb24vS2V5ZnJhbWVBbmltYXRpb24uY3BwOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OworCQk0OUJENTlDNjBFNjhDNjE0MDA5NDcwNkMgLyogSW1wbGljaXRB
bmltYXRpb24uaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0
OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBuYW1lID0gSW1wbGljaXRBbmlt
YXRpb24uaDsgcGF0aCA9IGFuaW1hdGlvbi9JbXBsaWNpdEFuaW1hdGlvbi5oOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OworCQk0OUJENTlDNzBFNjhDNjE0MDA5NDcwNkMgLyogSW1wbGljaXRB
bmltYXRpb24uY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBuYW1lID0gSW1wbGlj
aXRBbmltYXRpb24uY3BwOyBwYXRoID0gYW5pbWF0aW9uL0ltcGxpY2l0QW5pbWF0aW9uLmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDlCRDVBMjUwRTY4QzlCQjAwOTQ3MDZDIC8q
IENvbXBvc2l0ZUFuaW1hdGlvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBD
b21wb3NpdGVBbmltYXRpb24uaDsgcGF0aCA9IGFuaW1hdGlvbi9Db21wb3NpdGVBbmltYXRpb24u
aDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDlCRDVBMjYwRTY4QzlCQjAwOTQ3MDZD
IC8qIENvbXBvc2l0ZUFuaW1hdGlvbi5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsg
ZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7
IG5hbWUgPSBDb21wb3NpdGVBbmltYXRpb24uY3BwOyBwYXRoID0gYW5pbWF0aW9uL0NvbXBvc2l0
ZUFuaW1hdGlvbi5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTRBOEM5NkVBMEJF
NjkwMzIwMDRFRUZGMCAvKiBTZWxlY3Rpb25Db250cm9sbGVyTWFjLm1tICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNv
dXJjZWNvZGUuY3BwLm9iamNwcDsgbmFtZSA9IFNlbGVjdGlvbkNvbnRyb2xsZXJNYWMubW07IHBh
dGggPSBtYWMvU2VsZWN0aW9uQ29udHJvbGxlck1hYy5tbTsgc291cmNlVHJlZSA9ICI8Z3JvdXA+
IjsgfTsKIAkJNEIxN0NCQzgwRDk0NUIzNzAwNTNGMTgzIC8qIEFjY2Vzc2liaWxpdHlPYmplY3Qu
aCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25v
d25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gQWNjZXNzaWJpbGl0eU9iamVjdC5o
OyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk0QjE3Q0JDQTBEOTQ1QjkxMDA1M0YxODMg
LyogQWNjZXNzaWJpbGl0eU9iamVjdFdyYXBwZXIubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNw
cC5vYmpjcHA7IHBhdGggPSBBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlci5tbTsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTgxOTgsOCArODIxNiw2IEBACiAJCUJDN0ZBNjgwMEQxRjE2
NzkwMERCMjJBOSAvKiBTZWxlY3Rvck5vZGVMaXN0LmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Y3BwLmNwcDsgcGF0aCA9IFNlbGVjdG9yTm9kZUxpc3QuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQlCQzgwQzk4NTBDRDI5NEVFMDBBMEI3QjMgLyogQ1NTVGltaW5nRnVuY3Rpb25W
YWx1ZS5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gQ1NTVGltaW5n
RnVuY3Rpb25WYWx1ZS5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDODBDOTg2
MENEMjk0RUUwMEEwQjdCMyAvKiBDU1NUaW1pbmdGdW5jdGlvblZhbHVlLmggKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0g
c291cmNlY29kZS5jLmg7IHBhdGggPSBDU1NUaW1pbmdGdW5jdGlvblZhbHVlLmg7IHNvdXJjZVRy
ZWUgPSAiPGdyb3VwPiI7IH07Ci0JCUJDODBDOTg5MENEMjk1MDUwMEEwQjdCMyAvKiBBbmltYXRp
b25Db250cm9sbGVyLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rp
bmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBB
bmltYXRpb25Db250cm9sbGVyLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKLQkJQkM4
MEM5OEEwQ0QyOTUwNTAwQTBCN0IzIC8qIEFuaW1hdGlvbkNvbnRyb2xsZXIuaCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEFuaW1hdGlvbkNvbnRyb2xsZXIuaDsgc291cmNlVHJl
ZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQkM4MjQzMjUwRDBDRThBMjAwNDYwQzhGIC8qIEpTU1FMRXJy
b3IuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0
S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0gSlNTUUxFcnJvci5oOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwogCQlCQzgyNDMyNjBEMENFOEEyMDA0NjBDOEYgLyogSlNT
UUxUcmFuc2FjdGlvbi5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBKU1NRTFRy
YW5zYWN0aW9uLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDODI0MzI3MEQwQ0U4
QTIwMDQ2MEM4RiAvKiBKU1ZvaWRDYWxsYmFjay5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNw
cC5jcHA7IHBhdGggPSBKU1ZvaWRDYWxsYmFjay5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CkBAIC04OTQzLDYgKzg5NTksMjMgQEAKIAkJCXRhYldpZHRoID0gNDsKIAkJCXVzZXNUYWJz
ID0gMDsKIAkJfTsKKwkJNDlCRDU5NTgwRTY4QTI1MzAwOTQ3MDZDIC8qIGFuaW1hdGlvbiAqLyA9
IHsKKwkJCWlzYSA9IFBCWEdyb3VwOworCQkJY2hpbGRyZW4gPSAoCisJCQkJNDlCRDU5NTkwRTY4
QTI3ODAwOTQ3MDZDIC8qIEFuaW1hdGlvbkNvbnRyb2xsZXIuY3BwICovLAorCQkJCTQ5QkQ1OTVB
MEU2OEEyNzgwMDk0NzA2QyAvKiBBbmltYXRpb25Db250cm9sbGVyLmggKi8sCisJCQkJNDlCRDU5
OEUwRTY4Qjg0RTAwOTQ3MDZDIC8qIEFuaW1hdGlvbkJhc2UuaCAqLywKKwkJCQk0OUJENTk4RjBF
NjhCODRFMDA5NDcwNkMgLyogQW5pbWF0aW9uQmFzZS5jcHAgKi8sCisJCQkJNDlCRDU5QzQwRTY4
QzYxNDAwOTQ3MDZDIC8qIEtleWZyYW1lQW5pbWF0aW9uLmggKi8sCisJCQkJNDlCRDU5QzUwRTY4
QzYxNDAwOTQ3MDZDIC8qIEtleWZyYW1lQW5pbWF0aW9uLmNwcCAqLywKKwkJCQk0OUJENTlDNjBF
NjhDNjE0MDA5NDcwNkMgLyogSW1wbGljaXRBbmltYXRpb24uaCAqLywKKwkJCQk0OUJENTlDNzBF
NjhDNjE0MDA5NDcwNkMgLyogSW1wbGljaXRBbmltYXRpb24uY3BwICovLAorCQkJCTQ5QkQ1QTI1
MEU2OEM5QkIwMDk0NzA2QyAvKiBDb21wb3NpdGVBbmltYXRpb24uaCAqLywKKwkJCQk0OUJENUEy
NjBFNjhDOUJCMDA5NDcwNkMgLyogQ29tcG9zaXRlQW5pbWF0aW9uLmNwcCAqLywKKwkJCSk7CisJ
CQluYW1lID0gYW5pbWF0aW9uOworCQkJc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsKKwkJfTsKIAkJ
NTEyNkU2QjYwQTJFM0FFRjAwNUMyOUZBIC8qIGljb24gKi8gPSB7CiAJCQlpc2EgPSBQQlhHcm91
cDsKIAkJCWNoaWxkcmVuID0gKApAQCAtOTIwOCw2ICs5MjQxLDcgQEAKIAkJNjVCRjAyMTgwOTc0
ODA2MzAwQzQzMTk2IC8qIHBhZ2UgKi8gPSB7CiAJCQlpc2EgPSBQQlhHcm91cDsKIAkJCWNoaWxk
cmVuID0gKAorCQkJCTQ5QkQ1OTU4MEU2OEEyNTMwMDk0NzA2QyAvKiBhbmltYXRpb24gKi8sCiAJ
CQkJOTNDMDlBODIwQjA2NEYwNTAwNUFCRDREIC8qIG1hYyAqLywKIAkJCQkwNjY5M0Y0NTBCRkJD
OTE2MDAyMTYwNzIgLyogaW5zcGVjdG9yICovLAogCQkJCTg1MzhGMDAwMEFENzE3NzAwMDZBODFE
MSAvKiBBYnN0cmFjdFZpZXcuaWRsICovLApAQCAtOTIzMSw4ICs5MjY1LDYgQEAKIAkJCQkyOUFB
QzUxRDBFNTM5NjNCMDA4RjlCM0IgLyogQWNjZXNzaWJpbGl0eVRhYmxlSGVhZGVyQ29udGFpbmVy
LmggKi8sCiAJCQkJMjk4MDBDOTQwRTUyNEM4QjAwMDI1NTM2IC8qIEFjY2Vzc2liaWxpdHlUYWJs
ZVJvdy5jcHAgKi8sCiAJCQkJMjk4MDBDOTMwRTUyNEM4QjAwMDI1NTM2IC8qIEFjY2Vzc2liaWxp
dHlUYWJsZVJvdy5oICovLAotCQkJCUJDODBDOTg5MENEMjk1MDUwMEEwQjdCMyAvKiBBbmltYXRp
b25Db250cm9sbGVyLmNwcCAqLywKLQkJCQlCQzgwQzk4QTBDRDI5NTA1MDBBMEI3QjMgLyogQW5p
bWF0aW9uQ29udHJvbGxlci5oICovLAogCQkJCTRCMjRGOUE3MERBNzA1MEIwMDI2OUU1OCAvKiBB
WE9iamVjdENhY2hlLmNwcCAqLywKIAkJCQkxQUYzMjY3NjBENzhCOTQ0MDA2OEYwQzQgLyogQVhP
YmplY3RDYWNoZS5oICovLAogCQkJCUJDMTI0RUU0MEMyNjQxQ0QwMDlFMjM0OSAvKiBCYXJJbmZv
LmNwcCAqLywKQEAgLTEzNDQ2LDcgKzEzNDc4LDYgQEAKIAkJCWJ1aWxkQWN0aW9uTWFzayA9IDIx
NDc0ODM2NDc7CiAJCQlmaWxlcyA9ICgKIAkJCQlCMjc1MzU1NzBCMDUzODE0MDAyQ0U2NEYgLyog
QWZmaW5lVHJhbnNmb3JtLmggaW4gSGVhZGVycyAqLywKLQkJCQlCQzgwQzk4QzBDRDI5NTA1MDBB
MEI3QjMgLyogQW5pbWF0aW9uQ29udHJvbGxlci5oIGluIEhlYWRlcnMgKi8sCiAJCQkJOTMzMDlE
RDcwOTlFNjQ5MjAwNTZFNTgxIC8qIEFwcGVuZE5vZGVDb21tYW5kLmggaW4gSGVhZGVycyAqLywK
IAkJCQk5MzMwOUREOTA5OUU2NDkyMDA1NkU1ODEgLyogQXBwbHlTdHlsZUNvbW1hbmQuaCBpbiBI
ZWFkZXJzICovLAogCQkJCUJDRkIyRjc3MDk3QTJFMUEwMEJBNzAzRCAvKiBBcmVuYS5oIGluIEhl
YWRlcnMgKi8sCkBAIC0xNTQ2OSw2ICsxNTUwMCwxMSBAQAogCQkJCUJDRUY0NDRBMEU2NzQ1RTAw
MDFDMTI4NyAvKiBTdHlsZUdlbmVyYXRlZEltYWdlLmggaW4gSGVhZGVycyAqLywKIAkJCQlCQ0VG
NDQ0RDBFNjc0NjI4MDAxQzEyODcgLyogU3R5bGVDYWNoZWRJbWFnZS5oIGluIEhlYWRlcnMgKi8s
CiAJCQkJQTg4RkUzMzQwRTVFRUU4NzAwOEQ4QzBGIC8qIEdyYXBoaWNzQ29udGV4dFByaXZhdGUu
aCBpbiBIZWFkZXJzICovLAorCQkJCTQ5QkQ1OTVDMEU2OEEyNzgwMDk0NzA2QyAvKiBBbmltYXRp
b25Db250cm9sbGVyLmggaW4gSGVhZGVycyAqLywKKwkJCQk0OUJENTk5MDBFNjhCODRFMDA5NDcw
NkMgLyogQW5pbWF0aW9uQmFzZS5oIGluIEhlYWRlcnMgKi8sCisJCQkJNDlCRDU5QzgwRTY4QzYx
NDAwOTQ3MDZDIC8qIEtleWZyYW1lQW5pbWF0aW9uLmggaW4gSGVhZGVycyAqLywKKwkJCQk0OUJE
NTlDQTBFNjhDNjE0MDA5NDcwNkMgLyogSW1wbGljaXRBbmltYXRpb24uaCBpbiBIZWFkZXJzICov
LAorCQkJCTQ5QkQ1QTI3MEU2OEM5QkIwMDk0NzA2QyAvKiBDb21wb3NpdGVBbmltYXRpb24uaCBp
biBIZWFkZXJzICovLAogCQkJKTsKIAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3Np
bmcgPSAwOwogCQl9OwpAQCAtMTU3MTEsNyArMTU3NDcsNiBAQAogCQkJZmlsZXMgPSAoCiAJCQkJ
QjI3NTM1NTYwQjA1MzgxNDAwMkNFNjRGIC8qIEFmZmluZVRyYW5zZm9ybS5jcHAgaW4gU291cmNl
cyAqLywKIAkJCQlCMjc1MzU1ODBCMDUzODE0MDAyQ0U2NEYgLyogQWZmaW5lVHJhbnNmb3JtQ0cu
Y3BwIGluIFNvdXJjZXMgKi8sCi0JCQkJQkM4MEM5OEIwQ0QyOTUwNTAwQTBCN0IzIC8qIEFuaW1h
dGlvbkNvbnRyb2xsZXIuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTMzMDlERDYwOTlFNjQ5MjAw
NTZFNTgxIC8qIEFwcGVuZE5vZGVDb21tYW5kLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCTkzMzA5
REQ4MDk5RTY0OTIwMDU2RTU4MSAvKiBBcHBseVN0eWxlQ29tbWFuZC5jcHAgaW4gU291cmNlcyAq
LywKIAkJCQlCQ0ZCMkY3NjA5N0EyRTFBMDBCQTcwM0QgLyogQXJlbmEuY3BwIGluIFNvdXJjZXMg
Ki8sCkBAIC0xNzI2NCw2ICsxNzI5OSwxMSBAQAogCQkJCUJDRUY0M0UwMEU2NzQxMTAwMDFDMTI4
NyAvKiBOaW5lUGllY2VJbWFnZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlCQ0VGNDQ3QTBFNjc0
N0QwMDAxQzEyODcgLyogU3R5bGVDYWNoZWRJbWFnZS5jcHAgaW4gU291cmNlcyAqLywKIAkJCQlC
Q0VGNDQ3RDBFNjc0ODA2MDAxQzEyODcgLyogU3R5bGVHZW5lcmF0ZWRJbWFnZS5jcHAgaW4gU291
cmNlcyAqLywKKwkJCQk0OUJENTk1QjBFNjhBMjc4MDA5NDcwNkMgLyogQW5pbWF0aW9uQ29udHJv
bGxlci5jcHAgaW4gU291cmNlcyAqLywKKwkJCQk0OUJENTk5MTBFNjhCODRFMDA5NDcwNkMgLyog
QW5pbWF0aW9uQmFzZS5jcHAgaW4gU291cmNlcyAqLywKKwkJCQk0OUJENTlDOTBFNjhDNjE0MDA5
NDcwNkMgLyogS2V5ZnJhbWVBbmltYXRpb24uY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJNDlCRDU5
Q0IwRTY4QzYxNDAwOTQ3MDZDIC8qIEltcGxpY2l0QW5pbWF0aW9uLmNwcCBpbiBTb3VyY2VzICov
LAorCQkJCTQ5QkQ1QTI4MEU2OEM5QkIwMDk0NzA2QyAvKiBDb21wb3NpdGVBbmltYXRpb24uY3Bw
IGluIFNvdXJjZXMgKi8sCiAJCQkpOwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vz
c2luZyA9IDA7CiAJCX07CkluZGV4OiBXZWJDb3JlL3BhZ2UvQW5pbWF0aW9uQ29udHJvbGxlci5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wYWdlL0FuaW1hdGlvbkNvbnRyb2xsZXIuY3BwCShy
ZXZpc2lvbiAzNTk5NSkKKysrIFdlYkNvcmUvcGFnZS9BbmltYXRpb25Db250cm9sbGVyLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMSwyMTczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIw
MDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0g
KiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKLSAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0gKiAgICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCi0g
KiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikg
bm9yIHRoZSBuYW1lcyBvZgotICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8g
ZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKLSAqICAgICBmcm9tIHRoaXMgc29m
dHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAotICoKLSAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMg
IkFTIElTIiBBTkQgQU5ZCi0gKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0g
KiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GCi0gKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLSNpbmNsdWRlICJjb25maWcuaCIK
LSNpbmNsdWRlICJBbmltYXRpb25Db250cm9sbGVyLmgiCi0KLSNpbmNsdWRlICJDU1NQcm9wZXJ0
eU5hbWVzLmgiCi0jaW5jbHVkZSAiQ1N0cmluZy5oIgotI2luY2x1ZGUgIkRvY3VtZW50LmgiCi0j
aW5jbHVkZSAiRXZlbnROYW1lcy5oIgotI2luY2x1ZGUgIkZsb2F0Q29udmVyc2lvbi5oIgotI2lu
Y2x1ZGUgIkZyYW1lLmgiCi0jaW5jbHVkZSAiUmVuZGVyT2JqZWN0LmgiCi0jaW5jbHVkZSAiUmVu
ZGVyU3R5bGUuaCIKLSNpbmNsdWRlICJTeXN0ZW1UaW1lLmgiCi0jaW5jbHVkZSAiVGltZXIuaCIK
LSNpbmNsdWRlICJVbml0QmV6aWVyLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQotc3RhdGlj
IGNvbnN0IGRvdWJsZSBjQW5pbWF0aW9uVGltZXJEZWxheSA9IDAuMDI1OwotCi1zdGF0aWMgdm9p
ZCBzZXRDaGFuZ2VkKE5vZGUqIG5vZGUpCi17Ci0gICAgQVNTRVJUKCFub2RlIHx8IChub2RlLT5k
b2N1bWVudCgpICYmICFub2RlLT5kb2N1bWVudCgpLT5pblBhZ2VDYWNoZSgpKSk7Ci0gICAgbm9k
ZS0+c2V0Q2hhbmdlZChBbmltYXRpb25TdHlsZUNoYW5nZSk7Ci19Ci0KLS8vIFRoZSBlcHNpbG9u
IHZhbHVlIHdlIHBhc3MgdG8gVW5pdEJlemllcjo6c29sdmUgZ2l2ZW4gdGhhdCB0aGUgYW5pbWF0
aW9uIGlzIGdvaW5nIHRvIHJ1biBvdmVyIHxkdXJ8IHNlY29uZHMuIFRoZSBsb25nZXIgdGhlCi0v
LyBhbmltYXRpb24sIHRoZSBtb3JlIHByZWNpc2lvbiB3ZSBuZWVkIGluIHRoZSB0aW1pbmcgZnVu
Y3Rpb24gcmVzdWx0IHRvIGF2b2lkIHVnbHkgZGlzY29udGludWl0aWVzLgotc3RhdGljIGlubGlu
ZSBkb3VibGUgc29sdmVFcHNpbG9uKGRvdWJsZSBkdXJhdGlvbikgeyByZXR1cm4gMS4gLyAoMjAw
LiAqIGR1cmF0aW9uKTsgfQotCi1zdGF0aWMgaW5saW5lIGRvdWJsZSBzb2x2ZUN1YmljQmV6aWVy
RnVuY3Rpb24oZG91YmxlIHAxeCwgZG91YmxlIHAxeSwgZG91YmxlIHAyeCwgZG91YmxlIHAyeSwg
ZG91YmxlIHQsIGRvdWJsZSBkdXJhdGlvbikKLXsKLSAgICAvLyBDb252ZXJ0IGZyb20gaW5wdXQg
dGltZSB0byBwYXJhbWV0cmljIHZhbHVlIGluIGN1cnZlLCB0aGVuIGZyb20KLSAgICAvLyB0aGF0
IHRvIG91dHB1dCB0aW1lLgotICAgIFVuaXRCZXppZXIgYmV6aWVyKHAxeCwgcDF5LCBwMngsIHAy
eSk7Ci0gICAgcmV0dXJuIGJlemllci5zb2x2ZSh0LCBzb2x2ZUVwc2lsb24oZHVyYXRpb24pKTsK
LX0KLQotY2xhc3MgQ29tcG9zaXRlQW5pbWF0aW9uOwotY2xhc3MgQW5pbWF0aW9uQmFzZTsKLQot
Y2xhc3MgQW5pbWF0aW9uVGltZXJCYXNlIHsKLXB1YmxpYzoKLSAgICBBbmltYXRpb25UaW1lckJh
c2UoQW5pbWF0aW9uQmFzZSogYW5pbSkKLSAgICA6IG1fdGltZXIodGhpcywgJkFuaW1hdGlvblRp
bWVyQmFzZTo6dGltZXJGaXJlZCkKLSAgICAsIG1fYW5pbShhbmltKQotICAgIHsKLSAgICAgICAg
bV90aW1lci5zdGFydE9uZVNob3QoMCk7Ci0gICAgfQotICAgIHZpcnR1YWwgfkFuaW1hdGlvblRp
bWVyQmFzZSgpCi0gICAgewotICAgIH0KLSAgICAKLSAgICB2b2lkIHN0YXJ0VGltZXIoZG91Ymxl
IHRpbWVvdXQ9MCkKLSAgICB7Ci0gICAgICAgIG1fdGltZXIuc3RhcnRPbmVTaG90KHRpbWVvdXQp
OwotICAgIH0KLSAgICAKLSAgICB2b2lkIGNhbmNlbFRpbWVyKCkKLSAgICB7Ci0gICAgICAgIG1f
dGltZXIuc3RvcCgpOwotICAgIH0KLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgdGltZXJGaXJlZChU
aW1lcjxBbmltYXRpb25UaW1lckJhc2U+KikgPSAwOwotICAgIAotcHJpdmF0ZToKLSAgICBUaW1l
cjxBbmltYXRpb25UaW1lckJhc2U+IG1fdGltZXI7Ci0gICAgCi1wcm90ZWN0ZWQ6Ci0gICAgQW5p
bWF0aW9uQmFzZSogbV9hbmltOwotfTsKLQotY2xhc3MgQW5pbWF0aW9uRXZlbnREaXNwYXRjaGVy
IDogcHVibGljIEFuaW1hdGlvblRpbWVyQmFzZSB7Ci1wdWJsaWM6Ci0gICAgQW5pbWF0aW9uRXZl
bnREaXNwYXRjaGVyKEFuaW1hdGlvbkJhc2UqIGFuaW0pIAotICAgIDogQW5pbWF0aW9uVGltZXJC
YXNlKGFuaW0pCi0gICAgLCBtX3Byb3BlcnR5KENTU1Byb3BlcnR5SW52YWxpZCkKLSAgICAsIG1f
cmVzZXQoZmFsc2UpCi0gICAgLCBtX2VsYXBzZWRUaW1lKC0xKQotICAgIHsKLSAgICB9Ci0gICAg
Ci0gICAgdmlydHVhbCB+QW5pbWF0aW9uRXZlbnREaXNwYXRjaGVyKCkKLSAgICB7Ci0gICAgfQot
ICAgIAotICAgIHZvaWQgc3RhcnRUaW1lcihFbGVtZW50KiBlbGVtZW50LCBjb25zdCBBdG9taWNT
dHJpbmcmIG5hbWUsIGludCBwcm9wZXJ0eSwgYm9vbCByZXNldCwKLSAgICAgICAgICAgICAgICAg
ICAgY29uc3QgQXRvbWljU3RyaW5nJiBldmVudFR5cGUsIGRvdWJsZSBlbGFwc2VkVGltZSkKLSAg
ICB7Ci0gICAgICAgIG1fZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgICAgIG1fbmFtZSA9IG5hbWU7
Ci0gICAgICAgIG1fcHJvcGVydHkgPSBwcm9wZXJ0eTsKLSAgICAgICAgbV9yZXNldCA9IHJlc2V0
OwotICAgICAgICBtX2V2ZW50VHlwZSA9IGV2ZW50VHlwZTsKLSAgICAgICAgbV9lbGFwc2VkVGlt
ZSA9IGVsYXBzZWRUaW1lOwotICAgICAgICBBbmltYXRpb25UaW1lckJhc2U6OnN0YXJ0VGltZXIo
KTsKLSAgICB9Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkIHRpbWVyRmlyZWQoVGltZXI8QW5pbWF0
aW9uVGltZXJCYXNlPiopOwotICAgIAotcHJpdmF0ZToKLSAgICBSZWZQdHI8RWxlbWVudD4gbV9l
bGVtZW50OwotICAgIEF0b21pY1N0cmluZyBtX25hbWU7Ci0gICAgaW50IG1fcHJvcGVydHk7Ci0g
ICAgYm9vbCBtX3Jlc2V0OwotICAgIEF0b21pY1N0cmluZyBtX2V2ZW50VHlwZTsKLSAgICBkb3Vi
bGUgbV9lbGFwc2VkVGltZTsKLX07Ci0KLWNsYXNzIEFuaW1hdGlvblRpbWVyQ2FsbGJhY2sgOiBw
dWJsaWMgQW5pbWF0aW9uVGltZXJCYXNlIHsKLXB1YmxpYzoKLSAgICBBbmltYXRpb25UaW1lckNh
bGxiYWNrKEFuaW1hdGlvbkJhc2UqIGFuaW0pIAotICAgIDogQW5pbWF0aW9uVGltZXJCYXNlKGFu
aW0pCi0gICAgLCBtX2VsYXBzZWRUaW1lKDApCi0gICAgeyB9Ci0gICAgdmlydHVhbCB+QW5pbWF0
aW9uVGltZXJDYWxsYmFjaygpIHsgfQotICAgIAotICAgIHZpcnR1YWwgdm9pZCB0aW1lckZpcmVk
KFRpbWVyPEFuaW1hdGlvblRpbWVyQmFzZT4qKTsKLSAgICAKLSAgICB2b2lkIHN0YXJ0VGltZXIo
ZG91YmxlIHRpbWVvdXQsIGNvbnN0IEF0b21pY1N0cmluZyYgZXZlbnRUeXBlLCBkb3VibGUgZWxh
cHNlZFRpbWUpCi0gICAgewotICAgICAgICBtX2V2ZW50VHlwZSA9IGV2ZW50VHlwZTsKLSAgICAg
ICAgbV9lbGFwc2VkVGltZSA9IGVsYXBzZWRUaW1lOwotICAgICAgICBBbmltYXRpb25UaW1lckJh
c2U6OnN0YXJ0VGltZXIodGltZW91dCk7Ci0gICAgfQotICAgIAotcHJpdmF0ZToKLSAgICBBdG9t
aWNTdHJpbmcgbV9ldmVudFR5cGU7Ci0gICAgZG91YmxlIG1fZWxhcHNlZFRpbWU7Ci19OwotCi1j
bGFzcyBJbXBsaWNpdEFuaW1hdGlvbjsKLWNsYXNzIEtleWZyYW1lQW5pbWF0aW9uOwotY2xhc3Mg
QW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU7Ci0KLS8vIEEgQ29tcG9zaXRlQW5pbWF0aW9uIHJl
cHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIGFuaW1hdGlvbnMgdGhhdCBhcmUgcnVubmluZwotLy8g
b24gYSBzaW5nbGUgUmVuZGVyT2JqZWN0LCBzdWNoIGFzIGEgbnVtYmVyIG9mIHByb3BlcnRpZXMg
dHJhbnNpdGlvbmluZyBhdCBvbmNlLgotY2xhc3MgQ29tcG9zaXRlQW5pbWF0aW9uIDogcHVibGlj
IE5vbmNvcHlhYmxlIHsKLXB1YmxpYzoKLSAgICBDb21wb3NpdGVBbmltYXRpb24oQW5pbWF0aW9u
Q29udHJvbGxlclByaXZhdGUqIGFuaW1hdGlvbkNvbnRyb2xsZXIpCi0gICAgOiBtX3N1c3BlbmRl
ZChmYWxzZSkKLSAgICAsIG1fYW5pbWF0aW9uQ29udHJvbGxlcihhbmltYXRpb25Db250cm9sbGVy
KQotICAgICwgbV9udW1TdHlsZUF2YWlsYWJsZVdhaXRlcnMoMCkKLSAgICB7IH0KLSAgICAKLSAg
ICB+Q29tcG9zaXRlQW5pbWF0aW9uKCkKLSAgICB7Ci0gICAgICAgIGRlbGV0ZUFsbFZhbHVlcyht
X3RyYW5zaXRpb25zKTsKLSAgICAgICAgZGVsZXRlQWxsVmFsdWVzKG1fa2V5ZnJhbWVBbmltYXRp
b25zKTsKLSAgICB9Ci0gICAgCi0gICAgUmVuZGVyU3R5bGUqIGFuaW1hdGUoUmVuZGVyT2JqZWN0
KiwgY29uc3QgUmVuZGVyU3R5bGUqIGN1cnJlbnRTdHlsZSwgUmVuZGVyU3R5bGUqIHRhcmdldFN0
eWxlKTsKLSAgICAKLSAgICB2b2lkIHNldEFuaW1hdGluZyhib29sIGluQW5pbWF0aW5nKTsKLSAg
ICBib29sIGFuaW1hdGluZygpOwotICAgIAotICAgIGJvb2wgaGFzQW5pbWF0aW9uRm9yUHJvcGVy
dHkoaW50IHByb3ApIGNvbnN0IHsgcmV0dXJuIG1fdHJhbnNpdGlvbnMuY29udGFpbnMocHJvcCk7
IH0KLSAgICAKLSAgICB2b2lkIHJlc2V0VHJhbnNpdGlvbnMoUmVuZGVyT2JqZWN0Kik7Ci0gICAg
dm9pZCByZXNldEFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0Kik7Ci0gICAgCi0gICAgdm9pZCBjbGVh
bnVwRmluaXNoZWRBbmltYXRpb25zKFJlbmRlck9iamVjdCopOwotCi0gICAgdm9pZCBzZXRBbmlt
YXRpb25TdGFydFRpbWUoZG91YmxlIHQpOwotICAgIHZvaWQgc2V0VHJhbnNpdGlvblN0YXJ0VGlt
ZShpbnQgcHJvcGVydHksIGRvdWJsZSB0KTsKLSAgICAKLSAgICB2b2lkIHN1c3BlbmRBbmltYXRp
b25zKCk7Ci0gICAgdm9pZCByZXN1bWVBbmltYXRpb25zKCk7Ci0gICAgYm9vbCBzdXNwZW5kZWQo
KSBjb25zdCB7IHJldHVybiBtX3N1c3BlbmRlZDsgfQotICAgIAotICAgIHZvaWQgb3ZlcnJpZGVJ
bXBsaWNpdEFuaW1hdGlvbnMoaW50IHByb3BlcnR5KTsKLSAgICB2b2lkIHJlc3VtZU92ZXJyaWRk
ZW5JbXBsaWNpdEFuaW1hdGlvbnMoaW50IHByb3BlcnR5KTsKLSAgICAKLSAgICB2b2lkIHN0eWxl
QXZhaWxhYmxlKCk7Ci0gICAgCi0gICAgYm9vbCBpc0FuaW1hdGluZ1Byb3BlcnR5KGludCBwcm9w
ZXJ0eSwgYm9vbCBpc1J1bm5pbmdOb3cpIGNvbnN0OwotICAgIAotICAgIHZvaWQgc2V0V2FpdGlu
Z0ZvclN0eWxlQXZhaWxhYmxlKGJvb2wgd2FpdGluZyk7Ci0KLXByb3RlY3RlZDoKLSAgICB2b2lk
IHVwZGF0ZVRyYW5zaXRpb25zKFJlbmRlck9iamVjdCogcmVuZGVyZXIsIGNvbnN0IFJlbmRlclN0
eWxlKiBjdXJyZW50U3R5bGUsIFJlbmRlclN0eWxlKiB0YXJnZXRTdHlsZSk7Ci0gICAgdm9pZCB1
cGRhdGVLZXlmcmFtZUFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVu
ZGVyU3R5bGUqIGN1cnJlbnRTdHlsZSwgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlKTsKLQotICAg
IEtleWZyYW1lQW5pbWF0aW9uKiBmaW5kS2V5ZnJhbWVBbmltYXRpb24oY29uc3QgQXRvbWljU3Ry
aW5nJiBuYW1lKTsKLSAgICAKLXByaXZhdGU6Ci0gICAgdHlwZWRlZiBIYXNoTWFwPGludCwgSW1w
bGljaXRBbmltYXRpb24qPiBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOwotICAgIHR5cGVkZWYg
SGFzaE1hcDxBdG9taWNTdHJpbmdJbXBsKiwgS2V5ZnJhbWVBbmltYXRpb24qPiAgQW5pbWF0aW9u
TmFtZU1hcDsKLSAgICAKLSAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwICAgbV90cmFuc2l0
aW9uczsKLSAgICBBbmltYXRpb25OYW1lTWFwICAgICAgICAgICAgbV9rZXlmcmFtZUFuaW1hdGlv
bnM7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1fc3VzcGVuZGVkOwotICAgIEFu
aW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlKiBtX2FuaW1hdGlvbkNvbnRyb2xsZXI7Ci0gICAgdWlu
dDMyX3QgICAgICAgICAgICAgICAgICAgIG1fbnVtU3R5bGVBdmFpbGFibGVXYWl0ZXJzOwotfTsK
LQotY2xhc3MgQW5pbWF0aW9uQmFzZSA6IHB1YmxpYyBOb25jb3B5YWJsZSB7Ci1wdWJsaWM6Ci0g
ICAgQW5pbWF0aW9uQmFzZShjb25zdCBBbmltYXRpb24qIHRyYW5zaXRpb24sIFJlbmRlck9iamVj
dCogcmVuZGVyZXIsIENvbXBvc2l0ZUFuaW1hdGlvbiogY29tcEFuaW0pOwotICAgIHZpcnR1YWwg
fkFuaW1hdGlvbkJhc2UoKQotICAgIHsKLSAgICAgICAgaWYgKG1fYW5pbVN0YXRlID09IFNUQVRF
X1NUQVJUX1dBSVRfU1RZTEVfQVZBSUxBQkxFKQotICAgICAgICAgICAgbV9jb21wQW5pbS0+c2V0
V2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKGZhbHNlKTsKLSAgICB9Ci0gICAgCi0gICAgUmVuZGVy
T2JqZWN0KiByZW5kZXJlcigpIGNvbnN0IHsgcmV0dXJuIG1fb2JqZWN0OyB9Ci0gICAgZG91Ymxl
IHN0YXJ0VGltZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhcnRUaW1lOyB9Ci0gICAgZG91YmxlIGR1
cmF0aW9uKCkgY29uc3QgIHsgcmV0dXJuIG1fYW5pbWF0aW9uLT5kdXJhdGlvbigpOyB9Ci0gICAg
Ci0gICAgdm9pZCBjYW5jZWxUaW1lcnMoKQotICAgIHsKLSAgICAgICAgbV9hbmltYXRpb25UaW1l
ckNhbGxiYWNrLmNhbmNlbFRpbWVyKCk7Ci0gICAgICAgIG1fYW5pbWF0aW9uRXZlbnREaXNwYXRj
aGVyLmNhbmNlbFRpbWVyKCk7Ci0gICAgfQotICAgIAotICAgIC8vIEFuaW1hdGlvbnMgYW5kIFRy
YW5zaXRpb25zIGdvIHRocm91Z2ggdGhlIHN0YXRlcyBiZWxvdy4gV2hlbiBlbnRlcmluZyB0aGUg
U1RBUlRFRCBzdGF0ZQotICAgIC8vIHRoZSBhbmltYXRpb24gaXMgc3RhcnRlZC4gVGhpcyBtYXkg
b3IgbWF5IG5vdCByZXF1aXJlIGRlZmVycmVkIHJlc3BvbnNlIGZyb20gdGhlIGFuaW1hdG9yLgot
ICAgIC8vIElmIHNvLCB3ZSBzdGF5IGluIHRoaXMgc3RhdGUgdW50aWwgdGhhdCByZXNwb25zZSBp
cyByZWNlaXZlZCAoYW5kIGl0IHJldHVybnMgdGhlIHN0YXJ0IHRpbWUpLgotICAgIC8vIE90aGVy
d2lzZSwgd2UgdXNlIHRoZSBjdXJyZW50IHRpbWUgYXMgdGhlIHN0YXJ0IHRpbWUgYW5kIGdvIGlt
bWVkaWF0ZWx5IHRvIHRoZSBMT09QSU5HIG9yCi0gICAgLy8gRU5ESU5HIHN0YXRlLgotICAgIGVu
dW0gQW5pbVN0YXRlIHsgCi0gICAgICAgIFNUQVRFX05FVywgICAgICAgICAgICAgICAgICAgICAg
Ly8gYW5pbWF0aW9uIGp1c3QgY3JlYXRlZCwgYW5pbWF0aW9uIG5vdCBydW5uaW5nIHlldAotICAg
ICAgICBTVEFURV9TVEFSVF9XQUlUX1RJTUVSLCAgICAgICAgIC8vIHN0YXJ0IHRpbWVyIHJ1bm5p
bmcsIHdhaXRpbmcgZm9yIGZpcmUKLSAgICAgICAgU1RBVEVfU1RBUlRfV0FJVF9TVFlMRV9BVkFJ
TEFCTEUsICAgLy8gd2FpdGluZyBmb3Igc3R5bGUgc2V0dXAgc28gd2UgY2FuIHN0YXJ0IGFuaW1h
dGlvbnMKLSAgICAgICAgU1RBVEVfU1RBUlRfV0FJVF9SRVNQT05TRSwgICAgICAvLyBhbmltYXRp
b24gc3RhcnRlZCwgd2FpdGluZyBmb3IgcmVzcG9uc2UKLSAgICAgICAgU1RBVEVfTE9PUElORywg
ICAgICAgICAgICAgICAgICAvLyByZXNwb25zZSByZWNlaXZlZCwgYW5pbWF0aW9uIHJ1bm5pbmcs
IGxvb3AgdGltZXIgcnVubmluZywgd2FpdGluZyBmb3IgZmlyZQotICAgICAgICBTVEFURV9FTkRJ
TkcsICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIHJlY2VpdmVkLCBhbmltYXRpb24gcnVu
bmluZywgZW5kIHRpbWVyIHJ1bm5pbmcsIHdhaXRpbmcgZm9yIGZpcmUKLSAgICAgICAgU1RBVEVf
UEFVU0VEX1dBSVRfVElNRVIsICAgICAgICAvLyBhbmltYXRpb24gaW4gcGF1c2UgbW9kZSB3aGVu
IGFuaW1hdGlvbiBzdGFydGVkCi0gICAgICAgIFNUQVRFX1BBVVNFRF9XQUlUX1JFU1BPTlNFLCAg
ICAgLy8gYW5pbWF0aW9uIHBhdXNlZCB3aGVuIGluIFNUQVJUSU5HIHN0YXRlCi0gICAgICAgIFNU
QVRFX1BBVVNFRF9SVU4sICAgICAgICAgICAgICAgLy8gYW5pbWF0aW9uIHBhdXNlZCB3aGVuIGlu
IExPT1BJTkcgb3IgRU5ESU5HIHN0YXRlCi0gICAgICAgIFNUQVRFX0RPTkUgICAgICAgICAgICAg
ICAgICAgICAgLy8gZW5kIHRpbWVyIGZpcmVkLCBhbmltYXRpb24gZmluaXNoZWQgYW5kIHJlbW92
ZWQKLSAgICB9OwotICAgIAotICAgIGVudW0gQW5pbVN0YXRlSW5wdXQgewotICAgICAgICBTVEFU
RV9JTlBVVF9NQUtFX05FVywgICAgICAgICAgIC8vIHJlc2V0IGJhY2sgdG8gbmV3IGZyb20gYW55
IHN0YXRlCi0gICAgICAgIFNUQVRFX0lOUFVUX1NUQVJUX0FOSU1BVElPTiwgICAgLy8gYW5pbWF0
aW9uIHJlcXVlc3RzIGEgc3RhcnQKLSAgICAgICAgU1RBVEVfSU5QVVRfUkVTVEFSVF9BTklNQVRJ
T04sICAvLyBmb3JjZSBhIHJlc3RhcnQgZnJvbSBhbnkgc3RhdGUKLSAgICAgICAgU1RBVEVfSU5Q
VVRfU1RBUlRfVElNRVJfRklSRUQsICAvLyBzdGFydCB0aW1lciBmaXJlZAotICAgICAgICBTVEFU
RV9JTlBVVF9TVFlMRV9BVkFJTEFCTEUsICAgICAgICAvLyBzdHlsZSBpcyBzZXR1cCwgcmVhZHkg
dG8gc3RhcnQgYW5pbWF0aW5nCi0gICAgICAgIFNUQVRFX0lOUFVUX1NUQVJUX1RJTUVfU0VULCAg
ICAgLy8gbV9zdGFydFRpbWUgd2FzIHNldAotICAgICAgICBTVEFURV9JTlBVVF9MT09QX1RJTUVS
X0ZJUkVELCAgIC8vIGxvb3AgdGltZXIgZmlyZWQKLSAgICAgICAgU1RBVEVfSU5QVVRfRU5EX1RJ
TUVSX0ZJUkVELCAgICAvLyBlbmQgdGltZXIgZmlyZWQKLSAgICAgICAgU1RBVEVfSU5QVVRfUEFV
U0VfT1ZFUlJJREUsICAgICAvLyBwYXVzZSBhbiBhbmltYXRpb24gZHVlIHRvIG92ZXJyaWRlCi0g
ICAgICAgIFNUQVRFX0lOUFVUX1JFU1VNRV9PVkVSUklERSwgICAgLy8gcmVzdW1lIGFuIG92ZXJy
aWRkZW4gYW5pbWF0aW9uCi0gICAgICAgIFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUlVOTklORywg
Ly8gcGxheSBzdGF0ZSBwYXVzZWQgLT4gcnVubmluZwotICAgICAgICBTVEFURV9JTlBVVF9QTEFZ
X1NUQVRFX1BBVVNFRCwgIC8vIHBsYXkgc3RhdGUgcnVubmluZyAtPiBwYXVzZWQKLSAgICAgICAg
U1RBVEVfSU5QVVRfRU5EX0FOSU1BVElPTiAgICAgICAvLyBmb3JjZSBhbiBlbmQgZnJvbSBhbnkg
c3RhdGUKLSAgICB9OwotICAgIAotICAgIC8vIENhbGxlZCB3aGVuIGFuaW1hdGlvbiBpcyBpbiBO
RVcgc3RhdGUgdG8gc3RhcnQgYW5pbWF0aW9uCi0gICAgdm9pZCB1cGRhdGVTdGF0ZU1hY2hpbmUo
QW5pbVN0YXRlSW5wdXQgaW5wdXQsIGRvdWJsZSBwYXJhbSk7Ci0gICAgCi0gICAgLy8gQW5pbWF0
aW9uIGhhcyBhY3R1YWxseSBzdGFydGVkLCBhdCBwYXNzZWQgdGltZQotICAgIHZvaWQgb25Bbmlt
YXRpb25TdGFydFJlc3BvbnNlKGRvdWJsZSBzdGFydFRpbWUpOwotICAgIAotICAgIC8vIENhbGxl
ZCB0byBjaGFuZ2UgdG8gb3IgZnJvbSBwYXVzZWQgc3RhdGUKLSAgICB2b2lkIHVwZGF0ZVBsYXlT
dGF0ZShib29sIHJ1bm5pbmcpOwotICAgIGJvb2wgcGxheVN0YXRlUGxheWluZygpIGNvbnN0IHsg
cmV0dXJuIG1fYW5pbWF0aW9uICYmIG1fYW5pbWF0aW9uLT5wbGF5U3RhdGUoKSA9PSBBbmltUGxh
eVN0YXRlUGxheWluZzsgfQotICAgIAotICAgIGJvb2wgd2FpdGluZ1RvU3RhcnQoKSBjb25zdCB7
IHJldHVybiBtX2FuaW1TdGF0ZSA9PSBTVEFURV9ORVcgfHwgbV9hbmltU3RhdGUgPT0gU1RBVEVf
U1RBUlRfV0FJVF9USU1FUjsgfQotICAgIGJvb2wgcHJlYWN0aXZlKCkgY29uc3QKLSAgICB7IHJl
dHVybiBtX2FuaW1TdGF0ZSA9PSBTVEFURV9ORVcgfHwKLSAgICAgICAgICAgICBtX2FuaW1TdGF0
ZSA9PSBTVEFURV9TVEFSVF9XQUlUX1RJTUVSIHx8Ci0gICAgICAgICAgICAgbV9hbmltU3RhdGUg
PT0gU1RBVEVfU1RBUlRfV0FJVF9TVFlMRV9BVkFJTEFCTEUgfHwKLSAgICAgICAgICAgICBtX2Fu
aW1TdGF0ZSA9PSBTVEFURV9TVEFSVF9XQUlUX1JFU1BPTlNFOwotICAgIH0KLSAgICBib29sIHBv
c3RhY3RpdmUoKSBjb25zdCB7IHJldHVybiBtX2FuaW1TdGF0ZSA9PSBTVEFURV9ET05FOyB9Ci0g
ICAgYm9vbCBhY3RpdmUoKSBjb25zdCB7IHJldHVybiAhcG9zdGFjdGl2ZSgpICYmICFwcmVhY3Rp
dmUoKTsgfQotICAgIGJvb2wgcnVubmluZygpIGNvbnN0IHsgcmV0dXJuICFpc25ldygpICYmICFw
b3N0YWN0aXZlKCk7IH0KLSAgICBib29sIHBhdXNlZCgpIGNvbnN0IHsgcmV0dXJuIG1fcGF1c2VU
aW1lID49IDA7IH0KLSAgICBib29sIGlzbmV3KCkgY29uc3QgeyByZXR1cm4gbV9hbmltU3RhdGUg
PT0gU1RBVEVfTkVXOyB9Ci0gICAgYm9vbCB3YWl0aW5nRm9yU3RhcnRUaW1lKCkgY29uc3QgeyBy
ZXR1cm4gbV9hbmltU3RhdGUgPT0gU1RBVEVfU1RBUlRfV0FJVF9SRVNQT05TRTsgfQotICAgIGJv
b2wgd2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKCkgY29uc3QgeyByZXR1cm4gbV9hbmltU3RhdGUg
PT0gU1RBVEVfU1RBUlRfV0FJVF9TVFlMRV9BVkFJTEFCTEU7IH0KLSAgICBib29sIHdhaXRpbmdG
b3JFbmRFdmVudCgpIGNvbnN0ICB7IHJldHVybiBtX3dhaXRpbmdGb3JFbmRFdmVudDsgfQotICAg
IAotICAgIC8vICJhbmltYXRpbmciIG1lYW5zIHRoYXQgc29tZXRoaW5nIGlzIHJ1bm5pbmcgdGhh
dCByZXF1aXJlcyBhIHRpbWVyIHRvIGtlZXAgZmlyaW5nCi0gICAgLy8gKGUuZy4gYSBzb2Z0d2Fy
ZSBhbmltYXRpb24pCi0gICAgdm9pZCBzZXRBbmltYXRpbmcoYm9vbCBpbkFuaW1hdGluZyA9IHRy
dWUpIHsgbV9hbmltYXRpbmcgPSBpbkFuaW1hdGluZzsgfQotICAgIGJvb2wgYW5pbWF0aW5nKCkg
Y29uc3QgeyByZXR1cm4gbV9hbmltYXRpbmc7IH0KLSAgICAKLSAgICBkb3VibGUgcHJvZ3Jlc3Mo
ZG91YmxlIHNjYWxlLCBkb3VibGUgb2Zmc2V0KSBjb25zdDsKLSAgICAKLSAgICB2aXJ0dWFsIHZv
aWQgYW5pbWF0ZShDb21wb3NpdGVBbmltYXRpb24qLCBSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5k
ZXJTdHlsZSogY3VycmVudFN0eWxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBS
ZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUsIFJlbmRlclN0eWxlKiYgYW5pbWF0ZWRTdHlsZSkgeyB9
Ci0gICAgdmlydHVhbCB2b2lkIHJlc2V0KFJlbmRlck9iamVjdCogcmVuZGVyZXIsIGNvbnN0IFJl
bmRlclN0eWxlKiBmcm9tID0gMCwgY29uc3QgUmVuZGVyU3R5bGUqIHRvID0gMCkgeyB9Ci0gICAg
Ci0gICAgdmlydHVhbCBib29sIHNob3VsZEZpcmVFdmVudHMoKSBjb25zdCB7IHJldHVybiBmYWxz
ZTsgfQotICAgIAotICAgIHZvaWQgYW5pbWF0aW9uVGltZXJDYWxsYmFja0ZpcmVkKGNvbnN0IEF0
b21pY1N0cmluZyYgZXZlbnRUeXBlLCBkb3VibGUgZWxhcHNlZFRpbWUpOwotICAgIHZvaWQgYW5p
bWF0aW9uRXZlbnREaXNwYXRjaGVyRmlyZWQoRWxlbWVudCogZWxlbWVudCwgY29uc3QgQXRvbWlj
U3RyaW5nJiBuYW1lLCBpbnQgcHJvcGVydHksIGJvb2wgcmVzZXQsCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIGV2ZW50VHlwZSwgZG91
YmxlIGVsYXBzZWRUaW1lKTsKLSAgICAKLSAgICBib29sIGFuaW1hdGlvbnNNYXRjaChjb25zdCBB
bmltYXRpb24qIGFuaW0pIGNvbnN0IHsgcmV0dXJuIG1fYW5pbWF0aW9uLT5hbmltYXRpb25zTWF0
Y2goYW5pbSk7IH0KLSAgICAKLSAgICB2b2lkIHNldEFuaW1hdGlvbihjb25zdCBBbmltYXRpb24q
IGFuaW0pIHsgbV9hbmltYXRpb24gPSBjb25zdF9jYXN0PEFuaW1hdGlvbio+KGFuaW0pOyB9Ci0g
ICAgCi0gICAgLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBhbmltYXRpb24gaXMgb3ZlcnJpZGRlbi4g
VGhpcyB3aWxsIG9ubHkgYmUgdGhlIGNhc2UgZm9yCi0gICAgLy8gSW1wbGljaXRBbmltYXRpb25z
IGFuZCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB3ZSBzaG91bGQgZm9yY2UK
LSAgICAvLyBzZXQgdGhlIHN0YXJ0IHRpbWUuIElmIGFuIGFuaW1hdGlvbiBpcyBvdmVycmlkZGVu
LCBpdCB3aWxsIHByb2JhYmx5IG5vdCBnZXQKLSAgICAvLyBiYWNrIHRoZSBTVEFSVF9USU1FIGV2
ZW50LgotICAgIHZpcnR1YWwgYm9vbCBvdmVycmlkZGVuKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7
IH0KLSAgICAKLSAgICAvLyBEb2VzIHRoaXMgYW5pbWF0aW9uL3RyYW5zaXRpb24gaW52b2x2ZSB0
aGUgZ2l2ZW4gcHJvcGVydHk/Ci0gICAgdmlydHVhbCBib29sIGFmZmVjdHNQcm9wZXJ0eShpbnQg
cHJvcGVydHkpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgYm9vbCBpc0FuaW1hdGluZ1By
b3BlcnR5KGludCBwcm9wZXJ0eSwgYm9vbCBpc1J1bm5pbmdOb3cpIGNvbnN0Ci0gICAgewotICAg
ICAgICBpZiAoaXNSdW5uaW5nTm93KQotICAgICAgICAgICAgcmV0dXJuICghd2FpdGluZ1RvU3Rh
cnQoKSAmJiAhcG9zdGFjdGl2ZSgpKSAmJiBhZmZlY3RzUHJvcGVydHkocHJvcGVydHkpOwotCi0g
ICAgICAgIHJldHVybiAhcG9zdGFjdGl2ZSgpICYmIGFmZmVjdHNQcm9wZXJ0eShwcm9wZXJ0eSk7
Ci0gICAgfQotICAgICAgICAKLXByb3RlY3RlZDoKLSAgICBFbGVtZW50KiBlbGVtZW50Rm9yRXZl
bnREaXNwYXRjaCgpCi0gICAgewotICAgICAgICBpZiAobV9vYmplY3QtPm5vZGUoKSAmJiBtX29i
amVjdC0+bm9kZSgpLT5pc0VsZW1lbnROb2RlKCkpCi0gICAgICAgICAgICByZXR1cm4gc3RhdGlj
X2Nhc3Q8RWxlbWVudCo+KG1fb2JqZWN0LT5ub2RlKCkpOwotICAgICAgICByZXR1cm4gMDsKLSAg
ICB9Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkIG92ZXJyaWRlQW5pbWF0aW9ucygpIHsgfQotICAg
IHZpcnR1YWwgdm9pZCByZXN1bWVPdmVycmlkZGVuQW5pbWF0aW9ucygpIHsgfQotICAgIAotICAg
IENvbXBvc2l0ZUFuaW1hdGlvbiogY29tcG9zaXRlQW5pbWF0aW9uKCkgeyByZXR1cm4gbV9jb21w
QW5pbTsgfQotICAgIAotICAgIC8vIFRoZXNlIGFyZSBjYWxsZWQgd2hlbiB0aGUgY29ycmVzcG9u
ZGluZyB0aW1lciBmaXJlcyBzbyBzdWJjbGFzc2VzIGNhbiBkbyBhbnkgZXh0cmEgd29yawotICAg
IHZpcnR1YWwgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KGRvdWJsZSBlbGFwc2VkVGltZSkgeyB9Ci0g
ICAgdmlydHVhbCB2b2lkIG9uQW5pbWF0aW9uSXRlcmF0aW9uKGRvdWJsZSBlbGFwc2VkVGltZSkg
eyB9Ci0gICAgdmlydHVhbCB2b2lkIG9uQW5pbWF0aW9uRW5kKGRvdWJsZSBlbGFwc2VkVGltZSkg
eyB9Ci0gICAgdmlydHVhbCBib29sIHN0YXJ0QW5pbWF0aW9uKGRvdWJsZSBiZWdpblRpbWUpIHsg
cmV0dXJuIGZhbHNlOyB9Ci0gICAgdmlydHVhbCB2b2lkIGVuZEFuaW1hdGlvbihib29sIHJlc2V0
KSB7IH0KLSAgICAKLSAgICB2b2lkIHByaW1lRXZlbnRUaW1lcnMoKTsKLSAgICAKLXByb3RlY3Rl
ZDoKLSAgICBBbmltU3RhdGUgbV9hbmltU3RhdGU7Ci0gICAgaW50IG1faXRlcmF0aW9uOwotICAg
IAotICAgIGJvb2wgbV9hbmltYXRpbmc7ICAgICAgIC8vIHRyYW5zaXRpb24vYW5pbWF0aW9uIHJl
cXVpcmVzIGNvbnRpbnVhbCB0aW1lciBmaXJpbmcKLSAgICBib29sIG1fd2FpdGVkRm9yUmVzcG9u
c2U7Ci0gICAgZG91YmxlIG1fc3RhcnRUaW1lOwotICAgIGRvdWJsZSBtX3BhdXNlVGltZTsKLSAg
ICBSZW5kZXJPYmplY3QqIG1fb2JqZWN0OwotICAgIAotICAgIEFuaW1hdGlvblRpbWVyQ2FsbGJh
Y2sgbV9hbmltYXRpb25UaW1lckNhbGxiYWNrOwotICAgIEFuaW1hdGlvbkV2ZW50RGlzcGF0Y2hl
ciBtX2FuaW1hdGlvbkV2ZW50RGlzcGF0Y2hlcjsKLSAgICBSZWZQdHI8QW5pbWF0aW9uPiBtX2Fu
aW1hdGlvbjsKLSAgICBDb21wb3NpdGVBbmltYXRpb24qIG1fY29tcEFuaW07Ci0gICAgYm9vbCBt
X3dhaXRpbmdGb3JFbmRFdmVudDsKLX07Ci0KLS8vIEFuIEltcGxpY2l0QW5pbWF0aW9uIHRyYWNr
cyB0aGUgc3RhdGUgb2YgYSB0cmFuc2l0aW9uIG9mIGEgc3BlY2lmaWMgQ1NTIHByb3BlcnR5Ci0v
LyBmb3IgYSBzaW5nbGUgUmVuZGVyT2JqZWN0LgotY2xhc3MgSW1wbGljaXRBbmltYXRpb24gOiBw
dWJsaWMgQW5pbWF0aW9uQmFzZSB7Ci1wdWJsaWM6Ci0gICAgSW1wbGljaXRBbmltYXRpb24oY29u
c3QgQW5pbWF0aW9uKiB0cmFuc2l0aW9uLCBpbnQgYW5pbWF0aW5nUHJvcGVydHksIFJlbmRlck9i
amVjdCogcmVuZGVyZXIsIENvbXBvc2l0ZUFuaW1hdGlvbiogY29tcEFuaW0pCi0gICAgOiBBbmlt
YXRpb25CYXNlKHRyYW5zaXRpb24sIHJlbmRlcmVyLCBjb21wQW5pbSkKLSAgICAsIG1fdHJhbnNp
dGlvblByb3BlcnR5KHRyYW5zaXRpb24tPnByb3BlcnR5KCkpCi0gICAgLCBtX2FuaW1hdGluZ1By
b3BlcnR5KGFuaW1hdGluZ1Byb3BlcnR5KQotICAgICwgbV9vdmVycmlkZGVuKGZhbHNlKQotICAg
ICwgbV9mcm9tU3R5bGUoMCkKLSAgICAsIG1fdG9TdHlsZSgwKQotICAgIHsKLSAgICAgICAgQVNT
RVJUKGFuaW1hdGluZ1Byb3BlcnR5ICE9IGNBbmltYXRlQWxsKTsKLSAgICB9Ci0gICAgCi0gICAg
dmlydHVhbCB+SW1wbGljaXRBbmltYXRpb24oKQotICAgIHsKLSAgICAgICAgQVNTRVJUKCFtX2Zy
b21TdHlsZSAmJiAhbV90b1N0eWxlKTsKLSAgICAgICAgCi0gICAgICAgIC8vIElmIHdlIHdlcmUg
d2FpdGluZyBmb3IgYW4gZW5kIGV2ZW50LCB3ZSBuZWVkIHRvIGZpbmlzaCB0aGUgYW5pbWF0aW9u
IHRvIG1ha2Ugc3VyZSBubyBvbGQKLSAgICAgICAgLy8gYW5pbWF0aW9ucyBzdGljayBhcm91bmQg
aW4gdGhlIGxvd2VyIGxldmVscwotICAgICAgICBpZiAod2FpdGluZ0ZvckVuZEV2ZW50KCkgJiYg
bV9vYmplY3QpCi0gICAgICAgICAgICBBU1NFUlQoMCk7Ci0gICAgICAgIAotICAgICAgICAvLyBE
byB0aGUgY2xlYW51cCBoZXJlIGluc3RlYWQgb2YgaW4gdGhlIGJhc2UgY2xhc3Mgc28gdGhlIHNw
ZWNpYWxpemVkIG1ldGhvZHMgZ2V0IGNhbGxlZAotICAgICAgICBpZiAoIXBvc3RhY3RpdmUoKSkK
LSAgICAgICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFURV9JTlBVVF9FTkRfQU5JTUFUSU9O
LCAtMSk7ICAgICAKLSAgICB9Ci0gICAgCi0gICAgaW50IHRyYW5zaXRpb25Qcm9wZXJ0eSgpIGNv
bnN0IHsgcmV0dXJuIG1fdHJhbnNpdGlvblByb3BlcnR5OyB9Ci0gICAgaW50IGFuaW1hdGluZ1By
b3BlcnR5KCkgY29uc3QgeyByZXR1cm4gbV9hbmltYXRpbmdQcm9wZXJ0eTsgfQotICAgIAotICAg
IHZpcnR1YWwgdm9pZCBvbkFuaW1hdGlvbkVuZChkb3VibGUgaW5FbGFwc2VkVGltZSk7Ci0gICAg
Ci0gICAgdmlydHVhbCB2b2lkIGFuaW1hdGUoQ29tcG9zaXRlQW5pbWF0aW9uKiwgUmVuZGVyT2Jq
ZWN0KiwgY29uc3QgUmVuZGVyU3R5bGUqIGN1cnJlbnRTdHlsZSwgCi0gICAgICAgICAgICAgICAg
ICAgICAgICAgY29uc3QgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlLCBSZW5kZXJTdHlsZSomIGFu
aW1hdGVkU3R5bGUpOwotICAgIHZpcnR1YWwgdm9pZCByZXNldChSZW5kZXJPYmplY3QqIHJlbmRl
cmVyLCBjb25zdCBSZW5kZXJTdHlsZSogZnJvbSA9IDAsIGNvbnN0IFJlbmRlclN0eWxlKiB0byA9
IDApOwotICAgIAotICAgIHZvaWQgc2V0T3ZlcnJpZGRlbihib29sIGIpOwotICAgIHZpcnR1YWwg
Ym9vbCBvdmVycmlkZGVuKCkgY29uc3QgeyByZXR1cm4gbV9vdmVycmlkZGVuOyB9Ci0gICAgCi0g
ICAgdmlydHVhbCBib29sIHNob3VsZEZpcmVFdmVudHMoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9
Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGFmZmVjdHNQcm9wZXJ0eShpbnQgcHJvcGVydHkpIGNv
bnN0OwotICAgIAotICAgIGJvb2wgaGFzU3R5bGUoKSBjb25zdCB7IHJldHVybiBtX2Zyb21TdHls
ZSAmJiBtX3RvU3R5bGU7IH0KLSAgICAKLSAgICBib29sIGlzVGFyZ2V0UHJvcGVydHlFcXVhbChp
bnQgcHJvcCwgY29uc3QgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlKTsKLQotICAgIHZvaWQgYmxl
bmRQcm9wZXJ0eVZhbHVlSW5TdHlsZShpbnQgcHJvcCwgUmVuZGVyU3R5bGUqIGN1cnJlbnRTdHls
ZSk7Ci0gICAgCi1wcm90ZWN0ZWQ6Ci0gICAgYm9vbCBzaG91bGRTZW5kRXZlbnRGb3JMaXN0ZW5l
cihEb2N1bWVudDo6TGlzdGVuZXJUeXBlIGluTGlzdGVuZXJUeXBlKQotICAgIHsKLSAgICAgICAg
cmV0dXJuIG1fb2JqZWN0LT5kb2N1bWVudCgpLT5oYXNMaXN0ZW5lclR5cGUoaW5MaXN0ZW5lclR5
cGUpOwotICAgIH0KLSAgICAKLSAgICBib29sIHNlbmRUcmFuc2l0aW9uRXZlbnQoY29uc3QgQXRv
bWljU3RyaW5nJiBpbkV2ZW50VHlwZSwgZG91YmxlIGluRWxhcHNlZFRpbWUpOwotICAgIAotcHJp
dmF0ZToKLSAgICBpbnQgbV90cmFuc2l0aW9uUHJvcGVydHk7ICAgLy8gVHJhbnNpdGlvbiBwcm9w
ZXJ0eSBhcyBzcGVjaWZpZWQgaW4gdGhlIFJlbmRlclN0eWxlLiBNYXkgYmUgY0FuaW1hdGVBbGwK
LSAgICBpbnQgbV9hbmltYXRpbmdQcm9wZXJ0eTsgICAgLy8gU3BlY2lmaWMgcHJvcGVydHkgZm9y
IHRoaXMgSW1wbGljaXRBbmltYXRpb24KLSAgICBib29sIG1fb3ZlcnJpZGRlbjsgICAgICAgICAg
Ly8gdHJ1ZSB3aGVuIHRoZXJlIGlzIGEga2V5ZnJhbWUgYW5pbWF0aW9uIHRoYXQgb3ZlcnJpZGVz
IHRoZSB0cmFuc2l0aW9uaW5nIHByb3BlcnR5Ci0gICAgCi0gICAgLy8gVGhlIHR3byBzdHlsZXMg
dGhhdCB3ZSBhcmUgYmxlbmRpbmcuCi0gICAgUmVuZGVyU3R5bGUqIG1fZnJvbVN0eWxlOwotICAg
IFJlbmRlclN0eWxlKiBtX3RvU3R5bGU7Ci19OwotCi12b2lkIEFuaW1hdGlvblRpbWVyQ2FsbGJh
Y2s6OnRpbWVyRmlyZWQoVGltZXI8QW5pbWF0aW9uVGltZXJCYXNlPiopCi17Ci0gICAgbV9hbmlt
LT5hbmltYXRpb25UaW1lckNhbGxiYWNrRmlyZWQobV9ldmVudFR5cGUsIG1fZWxhcHNlZFRpbWUp
OwotfQotCi12b2lkIEFuaW1hdGlvbkV2ZW50RGlzcGF0Y2hlcjo6dGltZXJGaXJlZChUaW1lcjxB
bmltYXRpb25UaW1lckJhc2U+KikKLXsKLSAgICBtX2FuaW0tPmFuaW1hdGlvbkV2ZW50RGlzcGF0
Y2hlckZpcmVkKG1fZWxlbWVudC5nZXQoKSwgbV9uYW1lLCBtX3Byb3BlcnR5LCBtX3Jlc2V0LCBt
X2V2ZW50VHlwZSwgbV9lbGFwc2VkVGltZSk7Ci19Ci0KLS8vIEFuIEtleWZyYW1lQW5pbWF0aW9u
IHRyYWNrcyB0aGUgc3RhdGUgb2YgYW4gZXhwbGljaXQgYW5pbWF0aW9uCi0vLyBmb3IgYSBzaW5n
bGUgUmVuZGVyT2JqZWN0LgotY2xhc3MgS2V5ZnJhbWVBbmltYXRpb24gOiBwdWJsaWMgQW5pbWF0
aW9uQmFzZSB7Ci1wdWJsaWM6Ci0gICAgS2V5ZnJhbWVBbmltYXRpb24oY29uc3QgQW5pbWF0aW9u
KiBhbmltYXRpb24sIFJlbmRlck9iamVjdCogcmVuZGVyZXIsIGludCBpbmRleCwgQ29tcG9zaXRl
QW5pbWF0aW9uKiBjb21wQW5pbSkKLSAgICA6IEFuaW1hdGlvbkJhc2UoYW5pbWF0aW9uLCByZW5k
ZXJlciwgY29tcEFuaW0pCi0gICAgLCBtX2tleWZyYW1lcyhhbmltYXRpb24tPmtleWZyYW1lTGlz
dCgpKQotICAgICwgbV9uYW1lKGFuaW1hdGlvbi0+bmFtZSgpKQotICAgICwgbV9pbmRleChpbmRl
eCkKLSAgICB7Ci0gICAgfQotCi0gICAgdmlydHVhbCB+S2V5ZnJhbWVBbmltYXRpb24oKQotICAg
IHsKLSAgICAgICAgLy8gRG8gdGhlIGNsZWFudXAgaGVyZSBpbnN0ZWFkIG9mIGluIHRoZSBiYXNl
IGNsYXNzIHNvIHRoZSBzcGVjaWFsaXplZCBtZXRob2RzIGdldCBjYWxsZWQKLSAgICAgICAgaWYg
KCFwb3N0YWN0aXZlKCkpCi0gICAgICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUoU1RBVEVfSU5Q
VVRfRU5EX0FOSU1BVElPTiwgLTEpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBhbmltYXRl
KENvbXBvc2l0ZUFuaW1hdGlvbiosIFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlclN0eWxlKiBj
dXJyZW50U3R5bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVuZGVyU3R5bGUq
IHRhcmdldFN0eWxlLCBSZW5kZXJTdHlsZSomIGFuaW1hdGVkU3R5bGUpOwotCi0gICAgdm9pZCBz
ZXROYW1lKGNvbnN0IFN0cmluZyYgcykgeyBtX25hbWUgPSBzOyB9Ci0gICAgY29uc3QgQXRvbWlj
U3RyaW5nJiBuYW1lKCkgY29uc3QgeyByZXR1cm4gbV9uYW1lOyB9Ci0gICAgaW50IGluZGV4KCkg
Y29uc3QgeyByZXR1cm4gbV9pbmRleDsgfQotCi0gICAgdmlydHVhbCBib29sIHNob3VsZEZpcmVF
dmVudHMoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFs
IHZvaWQgb25BbmltYXRpb25TdGFydChkb3VibGUgaW5FbGFwc2VkVGltZSk7Ci0gICAgdmlydHVh
bCB2b2lkIG9uQW5pbWF0aW9uSXRlcmF0aW9uKGRvdWJsZSBpbkVsYXBzZWRUaW1lKTsKLSAgICB2
aXJ0dWFsIHZvaWQgb25BbmltYXRpb25FbmQoZG91YmxlIGluRWxhcHNlZFRpbWUpOwotICAgIHZp
cnR1YWwgdm9pZCBlbmRBbmltYXRpb24oYm9vbCByZXNldCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQg
b3ZlcnJpZGVBbmltYXRpb25zKCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlc3VtZU92ZXJyaWRkZW5B
bmltYXRpb25zKCk7Ci0gICAgCi0gICAgYm9vbCBzaG91bGRTZW5kRXZlbnRGb3JMaXN0ZW5lcihE
b2N1bWVudDo6TGlzdGVuZXJUeXBlIGluTGlzdGVuZXJUeXBlKQotICAgIHsKLSAgICAgICAgcmV0
dXJuIG1fb2JqZWN0LT5kb2N1bWVudCgpLT5oYXNMaXN0ZW5lclR5cGUoaW5MaXN0ZW5lclR5cGUp
OwotICAgIH0KLSAgICAKLSAgICBib29sIHNlbmRBbmltYXRpb25FdmVudChjb25zdCBBdG9taWNT
dHJpbmcmIGluRXZlbnRUeXBlLCBkb3VibGUgaW5FbGFwc2VkVGltZSk7Ci0gICAgCi0gICAgdmly
dHVhbCBib29sIGFmZmVjdHNQcm9wZXJ0eShpbnQgcHJvcGVydHkpIGNvbnN0OwotCi1wcml2YXRl
OgotICAgIC8vIFRoZSBrZXlmcmFtZXMgdGhhdCB3ZSBhcmUgYmxlbmRpbmcuCi0gICAgUmVmUHRy
PEtleWZyYW1lTGlzdD4gbV9rZXlmcmFtZXM7Ci0gICAgQXRvbWljU3RyaW5nIG1fbmFtZTsKLSAg
ICAvLyBUaGUgb3JkZXIgaW4gd2hpY2ggdGhpcyBhbmltYXRpb24gYXBwZWFycyBpbiB0aGUgYW5p
bWF0aW9uLW5hbWUgc3R5bGUuCi0gICAgaW50IG1faW5kZXg7Ci19OwotCi1BbmltYXRpb25CYXNl
OjpBbmltYXRpb25CYXNlKGNvbnN0IEFuaW1hdGlvbiogdHJhbnNpdGlvbiwgUmVuZGVyT2JqZWN0
KiByZW5kZXJlciwgQ29tcG9zaXRlQW5pbWF0aW9uKiBjb21wQW5pbSkKLTogbV9hbmltU3RhdGUo
U1RBVEVfTkVXKQotLCBtX2l0ZXJhdGlvbigwKQotLCBtX2FuaW1hdGluZyhmYWxzZSkKLSwgbV93
YWl0ZWRGb3JSZXNwb25zZShmYWxzZSkKLSwgbV9zdGFydFRpbWUoMCkKLSwgbV9wYXVzZVRpbWUo
LTEpCi0sIG1fb2JqZWN0KHJlbmRlcmVyKQotLCBtX2FuaW1hdGlvblRpbWVyQ2FsbGJhY2soY29u
c3RfY2FzdDxBbmltYXRpb25CYXNlKj4odGhpcykpCi0sIG1fYW5pbWF0aW9uRXZlbnREaXNwYXRj
aGVyKGNvbnN0X2Nhc3Q8QW5pbWF0aW9uQmFzZSo+KHRoaXMpKQotLCBtX2FuaW1hdGlvbihjb25z
dF9jYXN0PEFuaW1hdGlvbio+KHRyYW5zaXRpb24pKQotLCBtX2NvbXBBbmltKGNvbXBBbmltKQot
LCBtX3dhaXRpbmdGb3JFbmRFdmVudChmYWxzZSkKLXsKLX0KLQotdm9pZCBBbmltYXRpb25CYXNl
Ojp1cGRhdGVTdGF0ZU1hY2hpbmUoQW5pbVN0YXRlSW5wdXQgaW5wdXQsIGRvdWJsZSBwYXJhbSkK
LXsKLSAgICAvLyBJZiB3ZSBnZXQgYSBSRVNUQVJUIHRoZW4gd2UgZm9yY2UgYSBuZXcgYW5pbWF0
aW9uLCByZWdhcmRsZXNzIG9mIHN0YXRlCi0gICAgaWYgKGlucHV0ID09IFNUQVRFX0lOUFVUX01B
S0VfTkVXKSB7Ci0gICAgICAgIGlmIChtX2FuaW1TdGF0ZSA9PSBTVEFURV9TVEFSVF9XQUlUX1NU
WUxFX0FWQUlMQUJMRSkKLSAgICAgICAgICAgIG1fY29tcEFuaW0tPnNldFdhaXRpbmdGb3JTdHls
ZUF2YWlsYWJsZShmYWxzZSk7Ci0gICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfTkVXOwotICAg
ICAgICBtX3N0YXJ0VGltZSA9IDA7Ci0gICAgICAgIG1fcGF1c2VUaW1lID0gLTE7Ci0gICAgICAg
IG1fd2FpdGVkRm9yUmVzcG9uc2UgPSBmYWxzZTsKLSAgICAgICAgZW5kQW5pbWF0aW9uKGZhbHNl
KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCA9PSBTVEFURV9J
TlBVVF9SRVNUQVJUX0FOSU1BVElPTikgewotICAgICAgICBjYW5jZWxUaW1lcnMoKTsKLSAgICAg
ICAgaWYgKG1fYW5pbVN0YXRlID09IFNUQVRFX1NUQVJUX1dBSVRfU1RZTEVfQVZBSUxBQkxFKQot
ICAgICAgICAgICAgbV9jb21wQW5pbS0+c2V0V2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKGZhbHNl
KTsKLSAgICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9ORVc7Ci0gICAgICAgIG1fc3RhcnRUaW1l
ID0gMDsKLSAgICAgICAgbV9wYXVzZVRpbWUgPSAtMTsKLSAgICAgICAgZW5kQW5pbWF0aW9uKGZh
bHNlKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghcGF1c2VkKCkpCi0gICAgICAgICAgICB1cGRh
dGVTdGF0ZU1hY2hpbmUoU1RBVEVfSU5QVVRfU1RBUlRfQU5JTUFUSU9OLCAtMSk7Ci0gICAgICAg
IHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfRU5EX0FO
SU1BVElPTikgewotICAgICAgICBjYW5jZWxUaW1lcnMoKTsKLSAgICAgICAgaWYgKG1fYW5pbVN0
YXRlID09IFNUQVRFX1NUQVJUX1dBSVRfU1RZTEVfQVZBSUxBQkxFKQotICAgICAgICAgICAgbV9j
b21wQW5pbS0+c2V0V2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKGZhbHNlKTsKLSAgICAgICAgbV9h
bmltU3RhdGUgPSBTVEFURV9ET05FOwotICAgICAgICBlbmRBbmltYXRpb24odHJ1ZSk7Ci0gICAg
ICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfUEFV
U0VfT1ZFUlJJREUpIHsKLSAgICAgICAgaWYgKG1fYW5pbVN0YXRlID09IFNUQVRFX1NUQVJUX1dB
SVRfUkVTUE9OU0UpIHsKLSAgICAgICAgICAgIC8vIElmIHdlIGFyZSBpbiB0aGUgV0FJVF9SRVNQ
T05TRSBzdGF0ZSwgdGhlIGFuaW1hdGlvbiB3aWxsIGdldCBjYW5jZWxlZCBiZWZvcmUgCi0gICAg
ICAgICAgICAvLyB3ZSBnZXQgYSByZXNwb25zZSwgc28gbW92ZSB0byB0aGUgbmV4dCBzdGF0ZQot
ICAgICAgICAgICAgZW5kQW5pbWF0aW9uKGZhbHNlKTsKLSAgICAgICAgICAgIHVwZGF0ZVN0YXRl
TWFjaGluZShTVEFURV9JTlBVVF9TVEFSVF9USU1FX1NFVCwgY3VycmVudFRpbWUoKSk7Ci0gICAg
ICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBlbHNlIGlmIChpbnB1dCA9PSBTVEFU
RV9JTlBVVF9SRVNVTUVfT1ZFUlJJREUpIHsKLSAgICAgICAgaWYgKG1fYW5pbVN0YXRlID09IFNU
QVRFX0xPT1BJTkcgfHwgbV9hbmltU3RhdGUgPT0gU1RBVEVfRU5ESU5HKSB7Ci0gICAgICAgICAg
ICAvLyBTdGFydCB0aGUgYW5pbWF0aW9uCi0gICAgICAgICAgICBzdGFydEFuaW1hdGlvbihtX3N0
YXJ0VGltZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAKLSAgICAv
LyBFeGVjdXRlIHN0YXRlIG1hY2hpbmUKLSAgICBzd2l0Y2gobV9hbmltU3RhdGUpIHsKLSAgICAg
ICAgY2FzZSBTVEFURV9ORVc6Ci0gICAgICAgICAgICBBU1NFUlQoaW5wdXQgPT0gU1RBVEVfSU5Q
VVRfU1RBUlRfQU5JTUFUSU9OIHx8IGlucHV0ID09IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUlVO
TklORyB8fCBpbnB1dCA9PSBTVEFURV9JTlBVVF9QTEFZX1NUQVRFX1BBVVNFRCk7Ci0gICAgICAg
ICAgICBpZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfU1RBUlRfQU5JTUFUSU9OIHx8IGlucHV0ID09
IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUlVOTklORykgewotICAgICAgICAgICAgICAgIC8vIFNl
dCB0aGUgc3RhcnQgdGltZXIgdG8gdGhlIGluaXRpYWwgZGVsYXkgKDAgaWYgbm8gZGVsYXkpCi0g
ICAgICAgICAgICAgICAgbV93YWl0ZWRGb3JSZXNwb25zZSA9IGZhbHNlOwotICAgICAgICAgICAg
ICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfU1RBUlRfV0FJVF9USU1FUjsKLSAgICAgICAgICAgICAg
ICBtX2FuaW1hdGlvblRpbWVyQ2FsbGJhY2suc3RhcnRUaW1lcihtX2FuaW1hdGlvbi0+ZGVsYXko
KSwgRXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uU3RhcnRFdmVudCwgbV9hbmltYXRpb24tPmRl
bGF5KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Ug
U1RBVEVfU1RBUlRfV0FJVF9USU1FUjoKLSAgICAgICAgICAgIEFTU0VSVChpbnB1dCA9PSBTVEFU
RV9JTlBVVF9TVEFSVF9USU1FUl9GSVJFRCB8fCBpbnB1dCA9PSBTVEFURV9JTlBVVF9QTEFZX1NU
QVRFX1BBVVNFRCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpbnB1dCA9PSBTVEFU
RV9JTlBVVF9TVEFSVF9USU1FUl9GSVJFRCkgewotICAgICAgICAgICAgICAgIEFTU0VSVChwYXJh
bSA+PSAwKTsKLSAgICAgICAgICAgICAgICAvLyBTdGFydCB0aW1lciBoYXMgZmlyZWQsIHRlbGwg
dGhlIGFuaW1hdGlvbiB0byBzdGFydCBhbmQgd2FpdCBmb3IgaXQgdG8gcmVzcG9uZCB3aXRoIHN0
YXJ0IHRpbWUKLSAgICAgICAgICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX1NUQVJUX1dBSVRf
U1RZTEVfQVZBSUxBQkxFOwotICAgICAgICAgICAgICAgIG1fY29tcEFuaW0tPnNldFdhaXRpbmdG
b3JTdHlsZUF2YWlsYWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAg
ICAvLyBUcmlnZ2VyIGEgcmVuZGVyIHNvIHdlIGNhbiBzdGFydCB0aGUgYW5pbWF0aW9uCi0gICAg
ICAgICAgICAgICAgc2V0Q2hhbmdlZChtX29iamVjdC0+ZWxlbWVudCgpKTsKLSAgICAgICAgICAg
ICAgICBtX29iamVjdC0+YW5pbWF0aW9uKCktPnN0YXJ0VXBkYXRlUmVuZGVyaW5nRGlzcGF0Y2hl
cigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAg
QVNTRVJUKHJ1bm5pbmcoKSk7Ci0gICAgICAgICAgICAgICAgLy8gV2UncmUgd2FpdGluZyBmb3Ig
dGhlIHN0YXJ0IHRpbWVyIHRvIGZpcmUgYW5kIHdlIGdvdCBhIHBhdXNlLiBDYW5jZWwgdGhlIHRp
bWVyLCBwYXVzZSBhbmQgd2FpdAotICAgICAgICAgICAgICAgIG1fcGF1c2VUaW1lID0gY3VycmVu
dFRpbWUoKTsKLSAgICAgICAgICAgICAgICBjYW5jZWxUaW1lcnMoKTsKLSAgICAgICAgICAgICAg
ICBtX2FuaW1TdGF0ZSA9IFNUQVRFX1BBVVNFRF9XQUlUX1RJTUVSOwotICAgICAgICAgICAgfQot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RBUlRfV0FJVF9TVFlMRV9B
VkFJTEFCTEU6Ci0gICAgICAgICAgICBBU1NFUlQoaW5wdXQgPT0gU1RBVEVfSU5QVVRfU1RZTEVf
QVZBSUxBQkxFIHx8IGlucHV0ID09IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUEFVU0VEKTsKLSAg
ICAgICAgICAgIAotICAgICAgICAgICAgbV9jb21wQW5pbS0+c2V0V2FpdGluZ0ZvclN0eWxlQXZh
aWxhYmxlKGZhbHNlKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGlucHV0ID09IFNU
QVRFX0lOUFVUX1NUWUxFX0FWQUlMQUJMRSkgewotICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHRp
bWVyIGhhcyBmaXJlZCwgdGVsbCB0aGUgYW5pbWF0aW9uIHRvIHN0YXJ0IGFuZCB3YWl0IGZvciBp
dCB0byByZXNwb25kIHdpdGggc3RhcnQgdGltZQotICAgICAgICAgICAgICAgIG1fYW5pbVN0YXRl
ID0gU1RBVEVfU1RBUlRfV0FJVF9SRVNQT05TRTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAg
ICAgICAgICBvdmVycmlkZUFuaW1hdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAg
ICAgICAgICAvLyBTZW5kIHN0YXJ0IGV2ZW50LCBpZiBuZWVkZWQKLSAgICAgICAgICAgICAgICBv
bkFuaW1hdGlvblN0YXJ0KDAuMGYpOyAvLyBUaGUgZWxhcHNlZFRpbWUgaXMgYWx3YXlzIDAgaGVy
ZQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBhbmltYXRp
b24KLSAgICAgICAgICAgICAgICBpZiAob3ZlcnJpZGRlbigpIHx8ICFzdGFydEFuaW1hdGlvbigw
KSkgewotICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgZ29pbmcgdG8gZ2V0IGEgc3Rh
cnRUaW1lIGNhbGxiYWNrLCBzbyBmaXJlIHRoZSBzdGFydCB0aW1lIGhlcmUKLSAgICAgICAgICAg
ICAgICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9TVEFSVF9XQUlUX1JFU1BPTlNFOwotICAgICAg
ICAgICAgICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUoU1RBVEVfSU5QVVRfU1RBUlRfVElNRV9T
RVQsIGN1cnJlbnRUaW1lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBl
bHNlCi0gICAgICAgICAgICAgICAgICAgIG1fd2FpdGVkRm9yUmVzcG9uc2UgPSB0cnVlOwotICAg
ICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHJ1
bm5pbmcoKSk7Ci0gICAgICAgICAgICAgICAgLy8gV2UncmUgd2FpdGluZyBmb3IgdGhlIGEgbm90
aWZpY2F0aW9uIHRoYXQgdGhlIHN0eWxlIGhhcyBiZWVuIHNldHVwLiBJZiB3ZSdyZSBhc2tlZCB0
byB3YWl0Ci0gICAgICAgICAgICAgICAgLy8gYXQgdGhpcyBwb2ludCwgdGhlIHN0eWxlIG11c3Qg
aGF2ZSBiZWVuIHByb2Nlc3NlZCwgc28gd2UgY2FuIGRlYWwgd2l0aCB0aGlzIGxpa2Ugd2Ugd291
bGQKLSAgICAgICAgICAgICAgICAvLyBmb3IgV0FJVF9SRVNQT05TRSwgZXhjZXB0IHRoYXQgd2Ug
ZG9uJ3QgbmVlZCB0byBkbyBhbiBlbmRBbmltYXRpb24oKS4KLSAgICAgICAgICAgICAgICBtX3Bh
dXNlVGltZSA9IDA7Ci0gICAgICAgICAgICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9TVEFSVF9X
QUlUX1JFU1BPTlNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAg
IGNhc2UgU1RBVEVfU1RBUlRfV0FJVF9SRVNQT05TRToKLSAgICAgICAgICAgIEFTU0VSVChpbnB1
dCA9PSBTVEFURV9JTlBVVF9TVEFSVF9USU1FX1NFVCB8fCBpbnB1dCA9PSBTVEFURV9JTlBVVF9Q
TEFZX1NUQVRFX1BBVVNFRCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpbnB1dCA9
PSBTVEFURV9JTlBVVF9TVEFSVF9USU1FX1NFVCkgewotICAgICAgICAgICAgICAgIEFTU0VSVChw
YXJhbSA+PSAwKTsKLSAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgc3RhcnQgdGltZSwgc2V0
IGl0LCB1bmxlc3MgdGhlIHN0YXJ0VGltZSBpcyBhbHJlYWR5IHNldAotICAgICAgICAgICAgICAg
IGlmIChtX3N0YXJ0VGltZSA8PSAwKQotICAgICAgICAgICAgICAgICAgICBtX3N0YXJ0VGltZSA9
IHBhcmFtOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIERlY2lkZSB3aGVu
IHRoZSBlbmQgb3IgbG9vcCBldmVudCBuZWVkcyB0byBmaXJlCi0gICAgICAgICAgICAgICAgcHJp
bWVFdmVudFRpbWVycygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIFRy
aWdnZXIgYSByZW5kZXIgc28gd2UgY2FuIHN0YXJ0IHRoZSBhbmltYXRpb24KLSAgICAgICAgICAg
ICAgICBzZXRDaGFuZ2VkKG1fb2JqZWN0LT5lbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIG1f
b2JqZWN0LT5hbmltYXRpb24oKS0+c3RhcnRVcGRhdGVSZW5kZXJpbmdEaXNwYXRjaGVyKCk7Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBh
cmUgcGF1c2luZyB3aGlsZSB3YWl0aW5nIGZvciBhIHN0YXJ0IHJlc3BvbnNlLiBDYW5jZWwgdGhl
IGFuaW1hdGlvbiBhbmQgd2FpdC4gV2hlbiAKLSAgICAgICAgICAgICAgICAvLyB3ZSB1bnBhdXNl
LCB3ZSB3aWxsIGFjdCBhcyB0aG91Z2ggdGhlIHN0YXJ0IHRpbWVyIGp1c3QgZmlyZWQKLSAgICAg
ICAgICAgICAgICBtX3BhdXNlVGltZSA9IDA7Ci0gICAgICAgICAgICAgICAgZW5kQW5pbWF0aW9u
KGZhbHNlKTsKLSAgICAgICAgICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX1BBVVNFRF9XQUlU
X1JFU1BPTlNFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNh
c2UgU1RBVEVfTE9PUElORzoKLSAgICAgICAgICAgIEFTU0VSVChpbnB1dCA9PSBTVEFURV9JTlBV
VF9MT09QX1RJTUVSX0ZJUkVEIHx8IGlucHV0ID09IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUEFV
U0VEKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGlucHV0ID09IFNUQVRFX0lOUFVU
X0xPT1BfVElNRVJfRklSRUQpIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQocGFyYW0gPj0gMCk7
Ci0gICAgICAgICAgICAgICAgLy8gTG9vcCB0aW1lciBmaXJlZCwgbG9vcCBhZ2FpbiBvciBlbmQu
Ci0gICAgICAgICAgICAgICAgb25BbmltYXRpb25JdGVyYXRpb24ocGFyYW0pOwotICAgICAgICAg
ICAgICAgIHByaW1lRXZlbnRUaW1lcnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVs
c2UgewotICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBwYXVzaW5nIHdoaWxlIHJ1bm5pbmcuIENh
bmNlbCB0aGUgYW5pbWF0aW9uIGFuZCB3YWl0Ci0gICAgICAgICAgICAgICAgbV9wYXVzZVRpbWUg
PSBjdXJyZW50VGltZSgpOwotICAgICAgICAgICAgICAgIGNhbmNlbFRpbWVycygpOwotICAgICAg
ICAgICAgICAgIGVuZEFuaW1hdGlvbihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbV9hbmltU3Rh
dGUgPSBTVEFURV9QQVVTRURfUlVOOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIGNhc2UgU1RBVEVfRU5ESU5HOgotICAgICAgICAgICAgQVNTRVJUKGlucHV0ID09
IFNUQVRFX0lOUFVUX0VORF9USU1FUl9GSVJFRCB8fCBpbnB1dCA9PSBTVEFURV9JTlBVVF9QTEFZ
X1NUQVRFX1BBVVNFRCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpbnB1dCA9PSBT
VEFURV9JTlBVVF9FTkRfVElNRVJfRklSRUQpIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQocGFy
YW0gPj0gMCk7Ci0gICAgICAgICAgICAgICAgLy8gRW5kIHRpbWVyIGZpcmVkLCBmaW5pc2ggdXAK
LSAgICAgICAgICAgICAgICBvbkFuaW1hdGlvbkVuZChwYXJhbSk7Ci0gICAgICAgICAgICAgICAg
Ci0gICAgICAgICAgICAgICAgcmVzdW1lT3ZlcnJpZGRlbkFuaW1hdGlvbnMoKTsKLSAgICAgICAg
ICAgICAgICAKLSAgICAgICAgICAgICAgICAvLyBGaXJlIG9mZiBhbm90aGVyIHN0eWxlIGNoYW5n
ZSBzbyB3ZSBjYW4gc2V0IHRoZSBmaW5hbCB2YWx1ZQotICAgICAgICAgICAgICAgIHNldENoYW5n
ZWQobV9vYmplY3QtPmVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgbV9hbmltU3RhdGUgPSBT
VEFURV9ET05FOwotICAgICAgICAgICAgICAgIG1fb2JqZWN0LT5hbmltYXRpb24oKS0+c3RhcnRV
cGRhdGVSZW5kZXJpbmdEaXNwYXRjaGVyKCk7Ci0gICAgICAgICAgICAgICAgLy8gfHRoaXN8IG1h
eSBiZSBkZWxldGVkIGhlcmUgd2hlbiB3ZSd2ZSBiZWVuIGNhbGxlZCBmcm9tIHRpbWVyRmlyZWQo
KQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8g
V2UgYXJlIHBhdXNpbmcgd2hpbGUgcnVubmluZy4gQ2FuY2VsIHRoZSBhbmltYXRpb24gYW5kIHdh
aXQKLSAgICAgICAgICAgICAgICBtX3BhdXNlVGltZSA9IGN1cnJlbnRUaW1lKCk7Ci0gICAgICAg
ICAgICAgICAgY2FuY2VsVGltZXJzKCk7Ci0gICAgICAgICAgICAgICAgZW5kQW5pbWF0aW9uKGZh
bHNlKTsKLSAgICAgICAgICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX1BBVVNFRF9SVU47Ci0g
ICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyB8dGhpc3wgbWF5IGJlIGRlbGV0ZWQgaGVyZQot
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEX1dBSVRfVElNRVI6
Ci0gICAgICAgICAgICBBU1NFUlQoaW5wdXQgPT0gU1RBVEVfSU5QVVRfUExBWV9TVEFURV9SVU5O
SU5HKTsKLSAgICAgICAgICAgIEFTU0VSVCghcnVubmluZygpKTsKLSAgICAgICAgICAgIC8vIFVw
ZGF0ZSB0aGUgdGltZXMKLSAgICAgICAgICAgIG1fc3RhcnRUaW1lICs9IGN1cnJlbnRUaW1lKCkg
LSBtX3BhdXNlVGltZTsKLSAgICAgICAgICAgIG1fcGF1c2VUaW1lID0gLTE7Ci0gICAgICAgICAg
ICAKLSAgICAgICAgICAgIC8vIHdlIHdlcmUgd2FpdGluZyBmb3IgdGhlIHN0YXJ0IHRpbWVyIHRv
IGZpcmUsIGdvIGJhY2sgYW5kIHdhaXQgYWdhaW4KLSAgICAgICAgICAgIG1fYW5pbVN0YXRlID0g
U1RBVEVfTkVXOwotICAgICAgICAgICAgdXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVUX1NU
QVJUX0FOSU1BVElPTiwgMCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVEFU
RV9QQVVTRURfV0FJVF9SRVNQT05TRToKLSAgICAgICAgY2FzZSBTVEFURV9QQVVTRURfUlVOOgot
ICAgICAgICAgICAgLy8gV2UgdHJlYXQgdGhlc2UgdHdvIGNhc2VzIHRoZSBzYW1lLiBUaGUgb25s
eSBkaWZmZXJlbmNlIGlzIHRoYXQsIHdoZW4gd2UgYXJlIGluIHRoZSBXQUlUX1JFU1BPTlNFCi0g
ICAgICAgICAgICAvLyBzdGF0ZSwgd2UgZG9uJ3QgeWV0IGhhdmUgYSB2YWxpZCBzdGFydFRpbWUs
IHNvIHdlIHNlbmQgMCB0byBzdGFydEFuaW1hdGlvbi4gV2hlbiB0aGUgU1RBUlRfVElNRQotICAg
ICAgICAgICAgLy8gZXZlbnQgY29tZXMgaW4gcW5kIHdlIHdlcmUgaW4gdGhlIFJVTiBzdGF0ZSwg
d2Ugd2lsbCBub3RpY2UgdGhhdCB3ZSBoYXZlIGFscmVhZHkgc2V0IHRoZSAKLSAgICAgICAgICAg
IC8vIHN0YXJ0VGltZSBhbmQgd2lsbCBpZ25vcmUgaXQuCi0gICAgICAgICAgICBBU1NFUlQoaW5w
dXQgPT0gU1RBVEVfSU5QVVRfUExBWV9TVEFURV9SVU5OSU5HKTsKLSAgICAgICAgICAgIEFTU0VS
VCghcnVubmluZygpKTsKLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgdGltZXMKLSAgICAgICAg
ICAgIGlmIChtX2FuaW1TdGF0ZSA9PSBTVEFURV9QQVVTRURfUlVOKQotICAgICAgICAgICAgICAg
IG1fc3RhcnRUaW1lICs9IGN1cnJlbnRUaW1lKCkgLSBtX3BhdXNlVGltZTsKLSAgICAgICAgICAg
IGVsc2UKLSAgICAgICAgICAgICAgICBtX3N0YXJ0VGltZSA9IDA7Ci0gICAgICAgICAgICBtX3Bh
dXNlVGltZSA9IC0xOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBXZSB3ZXJlIHdhaXRp
bmcgZm9yIGEgYmVnaW4gdGltZSByZXNwb25zZSBmcm9tIHRoZSBhbmltYXRpb24sIGdvIGJhY2sg
YW5kIHdhaXQgYWdhaW4KLSAgICAgICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfU1RBUlRfV0FJ
VF9SRVNQT05TRTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gU3RhcnQgdGhlIGFuaW1h
dGlvbgotICAgICAgICAgICAgaWYgKG92ZXJyaWRkZW4oKSB8fCAhc3RhcnRBbmltYXRpb24obV9z
dGFydFRpbWUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IGdvaW5nIHRvIGdldCBh
IHN0YXJ0VGltZSBjYWxsYmFjaywgc28gZmlyZSB0aGUgc3RhcnQgdGltZSBoZXJlCi0gICAgICAg
ICAgICAgICAgdXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVUX1NUQVJUX1RJTUVfU0VULCBj
dXJyZW50VGltZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAg
ICAgICAgICBtX3dhaXRlZEZvclJlc3BvbnNlID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICBjYXNlIFNUQVRFX0RPTkU6Ci0gICAgICAgICAgICAvLyBXZSdyZSBkb25lLiBTdGF5
IGluIHRoaXMgc3RhdGUgdW50aWwgd2UgYXJlIGRlbGV0ZWQKLSAgICAgICAgICAgIGJyZWFrOwot
ICAgIH0KLSAgICAvLyB8dGhpc3wgbWF5IGJlIGRlbGV0ZWQgaGVyZSBpZiB3ZSBjYW1lIG91dCBv
ZiBTVEFURV9FTkRJTkcgd2hlbiB3ZSd2ZSBiZWVuIGNhbGxlZCBmcm9tIHRpbWVyRmlyZWQoKQot
fQotICAgIAotdm9pZCBBbmltYXRpb25CYXNlOjphbmltYXRpb25UaW1lckNhbGxiYWNrRmlyZWQo
Y29uc3QgQXRvbWljU3RyaW5nJiBldmVudFR5cGUsIGRvdWJsZSBlbGFwc2VkVGltZSkKLXsKLSAg
ICBBU1NFUlQobV9vYmplY3QtPmRvY3VtZW50KCkgJiYgIW1fb2JqZWN0LT5kb2N1bWVudCgpLT5p
blBhZ2VDYWNoZSgpKTsKLSAgICAKLSAgICAvLyBGSVhNRTogdXNlIGFuIGVudW0KLSAgICBpZiAo
ZXZlbnRUeXBlID09IEV2ZW50TmFtZXM6OndlYmtpdEFuaW1hdGlvblN0YXJ0RXZlbnQpCi0gICAg
ICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFURV9JTlBVVF9TVEFSVF9USU1FUl9GSVJFRCwgZWxh
cHNlZFRpbWUpOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBFdmVudE5hbWVzOjp3ZWJraXRB
bmltYXRpb25JdGVyYXRpb25FdmVudCkKLSAgICAgICAgdXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRF
X0lOUFVUX0xPT1BfVElNRVJfRklSRUQsIGVsYXBzZWRUaW1lKTsKLSAgICBlbHNlIGlmIChldmVu
dFR5cGUgPT0gRXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uRW5kRXZlbnQpIHsKLSAgICAgICAg
dXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVUX0VORF9USU1FUl9GSVJFRCwgZWxhcHNlZFRp
bWUpOwotICAgICAgICAvLyB8dGhpc3wgbWF5IGJlIGRlbGV0ZWQgaGVyZQotICAgIH0KLX0KLQot
dm9pZCBBbmltYXRpb25CYXNlOjphbmltYXRpb25FdmVudERpc3BhdGNoZXJGaXJlZChFbGVtZW50
KiBlbGVtZW50LCBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUsIGludCBwcm9wZXJ0eSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXNldCwg
Y29uc3QgQXRvbWljU3RyaW5nJiBldmVudFR5cGUsIGRvdWJsZSBlbGFwc2VkVGltZSkKLXsKLSAg
ICBtX3dhaXRpbmdGb3JFbmRFdmVudCA9IGZhbHNlOwotICAgIAotICAgIC8vIEtlZXAgYW4gYXRv
bWljIHN0cmluZyBvbiB0aGUgc3RhY2sgdG8ga2VlcCBpdCBhbGl2ZSB1bnRpbCB3ZSBleGl0IHRo
aXMgbWV0aG9kCi0gICAgLy8gKHNpbmNlIGRpc3BhdGNoaW5nIHRoZSBldmVudCBtYXkgY2F1c2Ug
fHRoaXN8IHRvIGJlIGRlbGV0ZWQsIHRoZXJlZm9yZSByZW1vdmluZwotICAgIC8vIHRoZSBsYXN0
IHJlZiB0byB0aGUgYXRvbWljIHN0cmluZykuCi0gICAgQXRvbWljU3RyaW5nIGFuaW1OYW1lKG5h
bWUpOwotICAgIEF0b21pY1N0cmluZyBhbmltRXZlbnRUeXBlKGV2ZW50VHlwZSk7Ci0gICAgLy8g
TWFrZSBzdXJlIHRoZSBlbGVtZW50IHN0aWNrcyBhcm91bmQgdG9vCi0gICAgUmVmUHRyPEVsZW1l
bnQ+IGVsZW1lbnRSZXRhaW5lcihlbGVtZW50KTsKLSAgICAKLSAgICBBU1NFUlQoIWVsZW1lbnQg
fHwgKGVsZW1lbnQtPmRvY3VtZW50KCkgJiYgIWVsZW1lbnQtPmRvY3VtZW50KCktPmluUGFnZUNh
Y2hlKCkpKTsKLSAgICBpZiAoIWVsZW1lbnQpCi0gICAgICAgIHJldHVybjsKLQotICAgIGlmIChl
dmVudFR5cGUgPT0gRXZlbnROYW1lczo6d2Via2l0VHJhbnNpdGlvbkVuZEV2ZW50KQotICAgICAg
ICBlbGVtZW50LT5kaXNwYXRjaFdlYktpdFRyYW5zaXRpb25FdmVudChldmVudFR5cGUsIG5hbWUs
IGVsYXBzZWRUaW1lKTsKLSAgICBlbHNlCi0gICAgICAgIGVsZW1lbnQtPmRpc3BhdGNoV2ViS2l0
QW5pbWF0aW9uRXZlbnQoZXZlbnRUeXBlLCBuYW1lLCBlbGFwc2VkVGltZSk7Ci0KLSAgICAvLyBS
ZXN0b3JlIHRoZSBvcmlnaW5hbCAodW5hbmltYXRlZCkgc3R5bGUKLSAgICBpZiAoYW5pbUV2ZW50
VHlwZSA9PSBFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRpb25FbmRFdmVudCkKLSAgICAgICAgaWYg
KGVsZW1lbnQtPnJlbmRlcmVyKCkpCi0gICAgICAgICAgICBzZXRDaGFuZ2VkKGVsZW1lbnQtPnJl
bmRlcmVyKCktPmVsZW1lbnQoKSk7Ci19Ci0KLXZvaWQgQW5pbWF0aW9uQmFzZTo6dXBkYXRlUGxh
eVN0YXRlKGJvb2wgcnVuKQotewotICAgIGlmIChwYXVzZWQoKSA9PSBydW4gfHwgaXNuZXcoKSkK
LSAgICAgICAgdXBkYXRlU3RhdGVNYWNoaW5lKHJ1biA/IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVf
UlVOTklORyA6IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUEFVU0VELCAtMSk7Ci19Ci0KLWRvdWJs
ZSBBbmltYXRpb25CYXNlOjpwcm9ncmVzcyhkb3VibGUgc2NhbGUsIGRvdWJsZSBvZmZzZXQpIGNv
bnN0Ci17Ci0gICAgaWYgKHByZWFjdGl2ZSgpKQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAg
ICBkb3VibGUgZWxhcHNlZFRpbWUgPSBydW5uaW5nKCkgPyAoY3VycmVudFRpbWUoKSAtIG1fc3Rh
cnRUaW1lKSA6IChtX3BhdXNlVGltZSAtIG1fc3RhcnRUaW1lKTsKLSAgICBpZiAocnVubmluZygp
ICYmIGVsYXBzZWRUaW1lIDwgMCkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgCi0gICAgZG91Ymxl
IGR1ciA9IG1fYW5pbWF0aW9uLT5kdXJhdGlvbigpOwotICAgIGlmIChtX2FuaW1hdGlvbi0+aXRl
cmF0aW9uQ291bnQoKSA+IDApCi0gICAgICAgIGR1ciAqPSBtX2FuaW1hdGlvbi0+aXRlcmF0aW9u
Q291bnQoKTsKLSAgICAKLSAgICBpZiAocG9zdGFjdGl2ZSgpIHx8ICFtX2FuaW1hdGlvbi0+ZHVy
YXRpb24oKSB8fCAobV9hbmltYXRpb24tPml0ZXJhdGlvbkNvdW50KCkgPiAwICYmIGVsYXBzZWRU
aW1lID49IGR1cikpCi0gICAgICAgIHJldHVybiAxLjA7Ci0gICAgCi0gICAgLy8gQ29tcHV0ZSB0
aGUgZnJhY3Rpb25hbCB0aW1lLCB0YWtpbmcgaW50byBhY2NvdW50IGRpcmVjdGlvbi4KLSAgICAv
LyBUaGVyZSBpcyBubyBuZWVkIHRvIHdvcnJ5IGFib3V0IGl0ZXJhdGlvbnMsIHdlIGFzc3VtZSB0
aGF0IHdlIHdvdWxkIGhhdmUKLSAgICAvLyBzaG9ydCBjaXJjdWl0ZWQgYWJvdmUgaWYgd2Ugd2Vy
ZSBkb25lCi0gICAgZG91YmxlIGZyYWN0aW9uYWxUaW1lID0gZWxhcHNlZFRpbWUgLyBtX2FuaW1h
dGlvbi0+ZHVyYXRpb24oKTsKLSAgICBpbnQgaW50ZWdyYWxUaW1lID0gKGludCkgZnJhY3Rpb25h
bFRpbWU7Ci0gICAgZnJhY3Rpb25hbFRpbWUgLT0gaW50ZWdyYWxUaW1lOwotICAgIAotICAgIGlm
IChtX2FuaW1hdGlvbi0+ZGlyZWN0aW9uKCkgJiYgKGludGVncmFsVGltZSAmIDEpKQotICAgICAg
ICBmcmFjdGlvbmFsVGltZSA9IDEgLSBmcmFjdGlvbmFsVGltZTsKLSAgICAKLSAgICBpZiAoc2Nh
bGUgIT0gMSB8fCBvZmZzZXQgIT0gMCkKLSAgICAgICAgZnJhY3Rpb25hbFRpbWUgPSAoZnJhY3Rp
b25hbFRpbWUgLSBvZmZzZXQpICogc2NhbGU7Ci0gICAgCi0gICAgaWYgKG1fYW5pbWF0aW9uLT50
aW1pbmdGdW5jdGlvbigpLnR5cGUoKSA9PSBMaW5lYXJUaW1pbmdGdW5jdGlvbikKLSAgICAgICAg
cmV0dXJuIGZyYWN0aW9uYWxUaW1lOwotICAgIAotICAgIC8vIEN1YmljIGJlemllci4KLSAgICBk
b3VibGUgcmVzdWx0ID0gc29sdmVDdWJpY0JlemllckZ1bmN0aW9uKG1fYW5pbWF0aW9uLT50aW1p
bmdGdW5jdGlvbigpLngxKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIG1fYW5pbWF0aW9uLT50aW1pbmdGdW5jdGlvbigpLnkxKCksCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYW5pbWF0aW9uLT50aW1pbmdGdW5jdGlv
bigpLngyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1f
YW5pbWF0aW9uLT50aW1pbmdGdW5jdGlvbigpLnkyKCksCi0gICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uYWxUaW1lLCBtX2FuaW1hdGlvbi0+ZHVyYXRp
b24oKSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBBbmltYXRpb25CYXNlOjpwcmlt
ZUV2ZW50VGltZXJzKCkKLXsKLSAgICAvLyBEZWNpZGUgd2hlbiB0aGUgZW5kIG9yIGxvb3AgZXZl
bnQgbmVlZHMgdG8gZmlyZQotICAgIGRvdWJsZSBjdCA9IGN1cnJlbnRUaW1lKCk7Ci0gICAgY29u
c3QgZG91YmxlIGVsYXBzZWREdXJhdGlvbiA9IGN0IC0gbV9zdGFydFRpbWU7Ci0gICAgQVNTRVJU
KGVsYXBzZWREdXJhdGlvbiA+PSAwKTsKLSAgICAKLSAgICBkb3VibGUgdG90YWxEdXJhdGlvbiA9
IC0xOwotICAgIGlmIChtX2FuaW1hdGlvbi0+aXRlcmF0aW9uQ291bnQoKSA+IDApCi0gICAgICAg
IHRvdGFsRHVyYXRpb24gPSBtX2FuaW1hdGlvbi0+ZHVyYXRpb24oKSAqIG1fYW5pbWF0aW9uLT5p
dGVyYXRpb25Db3VudCgpOwotCi0gICAgZG91YmxlIGR1cmF0aW9uTGVmdCA9IDA7Ci0gICAgZG91
YmxlIG5leHRJdGVyYXRpb25UaW1lID0gdG90YWxEdXJhdGlvbjsKLSAgICBpZiAodG90YWxEdXJh
dGlvbiA8IDAgfHwgZWxhcHNlZER1cmF0aW9uIDwgdG90YWxEdXJhdGlvbikgewotICAgICAgICBk
dXJhdGlvbkxlZnQgPSBtX2FuaW1hdGlvbi0+ZHVyYXRpb24oKSAtIGZtb2QoZWxhcHNlZER1cmF0
aW9uLCBtX2FuaW1hdGlvbi0+ZHVyYXRpb24oKSk7Ci0gICAgICAgIG5leHRJdGVyYXRpb25UaW1l
ID0gZWxhcHNlZER1cmF0aW9uICsgZHVyYXRpb25MZWZ0OwotICAgIH0KLSAgICAKLSAgICAvLyBB
dCB0aGlzIHBvaW50LCB3ZSBtYXkgaGF2ZSAwIGR1cmF0aW9uTGVmdCwgaWYgd2UndmUgZ290dGVu
IHRoZSBldmVudCBsYXRlIGFuZCB3ZSBhcmUgYWxyZWFkeQotICAgIC8vIHBhc3QgdG90YWxEdXJh
dGlvbi4gSW4gdGhpcyBjYXNlIHdlIHN0aWxsIGZpcmUgYW4gZW5kIHRpbWVyIGJlZm9yZSBwcm9j
ZXNzaW5nIHRoZSBlbmQuIAotICAgIC8vIFRoaXMgZGVmZXJzIHRoZSBjYWxsIHRvIHNlbmRBbmlt
YXRpb25FdmVudHMgdG8gYXZvaWQgcmUtZW50cmFudCBjYWxscyB0aGF0IGRlc3Ryb3kKLSAgICAv
LyB0aGUgUmVuZGVyT2JqZWN0LCBhbmQgdGhlcmVmb3JlIHx0aGlzfCBiZWZvcmUgd2UncmUgZG9u
ZSB3aXRoIGl0LgotICAgIGlmICh0b3RhbER1cmF0aW9uIDwgMCB8fCBuZXh0SXRlcmF0aW9uVGlt
ZSA8IHRvdGFsRHVyYXRpb24pIHsKLSAgICAgICAgLy8gV2UgYXJlIG5vdCBhdCB0aGUgZW5kIHll
dCwgc2VuZCBhIGxvb3AgZXZlbnQKLSAgICAgICAgQVNTRVJUKG5leHRJdGVyYXRpb25UaW1lID4g
MCk7Ci0gICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfTE9PUElORzsKLSAgICAgICAgbV9hbmlt
YXRpb25UaW1lckNhbGxiYWNrLnN0YXJ0VGltZXIoZHVyYXRpb25MZWZ0LCBFdmVudE5hbWVzOjp3
ZWJraXRBbmltYXRpb25JdGVyYXRpb25FdmVudCwgbmV4dEl0ZXJhdGlvblRpbWUpOwotICAgIH0K
LSAgICBlbHNlIHsKLSAgICAgICAgLy8gV2UgYXJlIGF0IHRoZSBlbmQsIHNlbmQgYW4gZW5kIGV2
ZW50Ci0gICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfRU5ESU5HOwotICAgICAgICBtX2FuaW1h
dGlvblRpbWVyQ2FsbGJhY2suc3RhcnRUaW1lcihkdXJhdGlvbkxlZnQsIEV2ZW50TmFtZXM6Ondl
YmtpdEFuaW1hdGlvbkVuZEV2ZW50LCBuZXh0SXRlcmF0aW9uVGltZSk7Ci0gICAgfQotfQotCi1z
dGF0aWMgaW5saW5lIGludCBibGVuZEZ1bmMoaW50IGZyb20sIGludCB0bywgZG91YmxlIHByb2dy
ZXNzKQoteyAgCi0gICAgcmV0dXJuIGludChmcm9tICsgKHRvIC0gZnJvbSkgKiBwcm9ncmVzcyk7
Ci19Ci0KLXN0YXRpYyBpbmxpbmUgZG91YmxlIGJsZW5kRnVuYyhkb3VibGUgZnJvbSwgZG91Ymxl
IHRvLCBkb3VibGUgcHJvZ3Jlc3MpCi17ICAKLSAgICByZXR1cm4gZnJvbSArICh0byAtIGZyb20p
ICogcHJvZ3Jlc3M7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgZmxvYXQgYmxlbmRGdW5jKGZsb2F0IGZy
b20sIGZsb2F0IHRvLCBkb3VibGUgcHJvZ3Jlc3MpCi17ICAKLSAgICByZXR1cm4gbmFycm93UHJl
Y2lzaW9uVG9GbG9hdChmcm9tICsgKHRvIC0gZnJvbSkgKiBwcm9ncmVzcyk7Ci19Ci0KLXN0YXRp
YyBpbmxpbmUgQ29sb3IgYmxlbmRGdW5jKGNvbnN0IENvbG9yJiBmcm9tLCBjb25zdCBDb2xvciYg
dG8sIGRvdWJsZSBwcm9ncmVzcykKLXsgIAotICAgIHJldHVybiBDb2xvcihibGVuZEZ1bmMoZnJv
bS5yZWQoKSwgdG8ucmVkKCksIHByb2dyZXNzKSwKLSAgICAgICAgICAgICAgICAgYmxlbmRGdW5j
KGZyb20uZ3JlZW4oKSwgdG8uZ3JlZW4oKSwgcHJvZ3Jlc3MpLAotICAgICAgICAgICAgICAgICBi
bGVuZEZ1bmMoZnJvbS5ibHVlKCksIHRvLmJsdWUoKSwgcHJvZ3Jlc3MpLAotICAgICAgICAgICAg
ICAgICBibGVuZEZ1bmMoZnJvbS5hbHBoYSgpLCB0by5hbHBoYSgpLCBwcm9ncmVzcykpOwotfQot
Ci1zdGF0aWMgaW5saW5lIExlbmd0aCBibGVuZEZ1bmMoY29uc3QgTGVuZ3RoJiBmcm9tLCBjb25z
dCBMZW5ndGgmIHRvLCBkb3VibGUgcHJvZ3Jlc3MpCi17ICAKLSAgICByZXR1cm4gdG8uYmxlbmQo
ZnJvbSwgcHJvZ3Jlc3MpOwotfQotCi1zdGF0aWMgaW5saW5lIEludFNpemUgYmxlbmRGdW5jKGNv
bnN0IEludFNpemUmIGZyb20sIGNvbnN0IEludFNpemUmIHRvLCBkb3VibGUgcHJvZ3Jlc3MpCi17
ICAKLSAgICByZXR1cm4gSW50U2l6ZShibGVuZEZ1bmMoZnJvbS53aWR0aCgpLCB0by53aWR0aCgp
LCBwcm9ncmVzcyksCi0gICAgICAgICAgICAgICAgICAgYmxlbmRGdW5jKGZyb20uaGVpZ2h0KCks
IHRvLmhlaWdodCgpLCBwcm9ncmVzcykpOwotfQotCi1zdGF0aWMgaW5saW5lIFNoYWRvd0RhdGEq
IGJsZW5kRnVuYyhjb25zdCBTaGFkb3dEYXRhKiBmcm9tLCBjb25zdCBTaGFkb3dEYXRhKiB0bywg
ZG91YmxlIHByb2dyZXNzKQoteyAgCi0gICAgQVNTRVJUKGZyb20gJiYgdG8pOwotICAgIHJldHVy
biBuZXcgU2hhZG93RGF0YShibGVuZEZ1bmMoZnJvbS0+eCwgdG8tPngsIHByb2dyZXNzKSwgYmxl
bmRGdW5jKGZyb20tPnksIHRvLT55LCBwcm9ncmVzcyksIAotICAgICAgICAgICAgICAgICAgICAg
ICAgICBibGVuZEZ1bmMoZnJvbS0+Ymx1ciwgdG8tPmJsdXIsIHByb2dyZXNzKSwgYmxlbmRGdW5j
KGZyb20tPmNvbG9yLCB0by0+Y29sb3IsIHByb2dyZXNzKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUg
VHJhbnNmb3JtT3BlcmF0aW9ucyBibGVuZEZ1bmMoY29uc3QgVHJhbnNmb3JtT3BlcmF0aW9ucyYg
ZnJvbSwgY29uc3QgVHJhbnNmb3JtT3BlcmF0aW9ucyYgdG8sIGRvdWJsZSBwcm9ncmVzcykKLXsg
ICAgCi0gICAgLy8gQmxlbmQgYW55IG9wZXJhdGlvbnMgd2hvc2UgdHlwZXMgYWN0dWFsbHkgbWF0
Y2ggdXAuICBPdGhlcndpc2UgZG9uJ3QgYm90aGVyLgotICAgIHVuc2lnbmVkIGZyb21TaXplID0g
ZnJvbS5zaXplKCk7Ci0gICAgdW5zaWduZWQgdG9TaXplID0gdG8uc2l6ZSgpOwotICAgIHVuc2ln
bmVkIHNpemUgPSBtYXgoZnJvbVNpemUsIHRvU2l6ZSk7Ci0gICAgVHJhbnNmb3JtT3BlcmF0aW9u
cyByZXN1bHQ7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAg
ICAgICBSZWZQdHI8VHJhbnNmb3JtT3BlcmF0aW9uPiBmcm9tT3AgPSBpIDwgZnJvbVNpemUgPyBm
cm9tW2ldIDogMDsKLSAgICAgICAgUmVmUHRyPFRyYW5zZm9ybU9wZXJhdGlvbj4gdG9PcCA9IGkg
PCB0b1NpemUgPyB0b1tpXSA6IDA7Ci0gICAgICAgIFJlZlB0cjxUcmFuc2Zvcm1PcGVyYXRpb24+
IGJsZW5kZWRPcCA9IHRvT3AgPyB0b09wLT5ibGVuZChmcm9tT3AuZ2V0KCksIHByb2dyZXNzKSA6
IGZyb21PcC0+YmxlbmQoMCwgcHJvZ3Jlc3MsIHRydWUpOwotICAgICAgICBpZiAoYmxlbmRlZE9w
KQotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChibGVuZGVkT3ApOwotICAgIH0KLSAgICByZXR1
cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgaW5saW5lIEVWaXNpYmlsaXR5IGJsZW5kRnVuYyhFVmlz
aWJpbGl0eSBmcm9tLCBFVmlzaWJpbGl0eSB0bywgZG91YmxlIHByb2dyZXNzKQotewotICAgIC8v
IEFueSBub24temVybyByZXN1bHQgbWVhbnMgd2UgY29uc2lkZXIgdGhlIG9iamVjdCB0byBiZSB2
aXNpYmxlLiAgT25seSBhdCAwIGRvIHdlIGNvbnNpZGVyIHRoZSBvYmplY3QgdG8gYmUKLSAgICAv
LyBpbnZpc2libGUuICAgVGhlIGludmlzaWJsZSB2YWx1ZSB3ZSB1c2UgKEhJRERFTiB2cy4gQ09M
TEFQU0UpIGRlcGVuZHMgb24gdGhlIHNwZWNpZmllZCBmcm9tL3RvIHZhbHVlcy4KLSAgICBkb3Vi
bGUgZnJvbVZhbCA9IGZyb20gPT0gVklTSUJMRSA/IDEuIDogMC47Ci0gICAgZG91YmxlIHRvVmFs
ID0gdG8gPT0gVklTSUJMRSA/IDEuIDogMC47Ci0gICAgaWYgKGZyb21WYWwgPT0gdG9WYWwpCi0g
ICAgICAgIHJldHVybiB0bzsKLSAgICBkb3VibGUgcmVzdWx0ID0gYmxlbmRGdW5jKGZyb21WYWws
IHRvVmFsLCBwcm9ncmVzcyk7Ci0gICAgcmV0dXJuIHJlc3VsdCA+IDAuID8gVklTSUJMRSA6ICh0
byAhPSBWSVNJQkxFID8gdG8gOiBmcm9tKTsKLX0KLQotY2xhc3MgUHJvcGVydHlXcmFwcGVyQmFz
ZSB7Ci1wdWJsaWM6Ci0gICAgUHJvcGVydHlXcmFwcGVyQmFzZShpbnQgcHJvcCkKLSAgICA6IG1f
cHJvcChwcm9wKQotICAgIHsgfQotICAgIHZpcnR1YWwgflByb3BlcnR5V3JhcHBlckJhc2UoKSB7
IH0KLSAgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IFJlbmRlclN0eWxlKiBhLCBjb25zdCBS
ZW5kZXJTdHlsZSogYikgY29uc3Q9MDsKLSAgICB2aXJ0dWFsIHZvaWQgYmxlbmQoUmVuZGVyU3R5
bGUqIGRzdCwgY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJlbmRlclN0eWxlKiBiLCBkb3Vi
bGUgcHJvZykgY29uc3Q9MDsKLSAgICAKLSAgICBpbnQgcHJvcGVydHkoKSBjb25zdCB7IHJldHVy
biBtX3Byb3A7IH0KLSAgICAKLXByaXZhdGU6Ci0gICAgaW50IG1fcHJvcDsKLX07Ci0KLXRlbXBs
YXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgUHJvcGVydHlXcmFwcGVyR2V0dGVyIDogcHVibGljIFBy
b3BlcnR5V3JhcHBlckJhc2UgewotcHVibGljOgotICAgIFByb3BlcnR5V3JhcHBlckdldHRlcihp
bnQgcHJvcCwgVCAoUmVuZGVyU3R5bGU6OipnZXR0ZXIpKCkgY29uc3QpCi0gICAgOiBQcm9wZXJ0
eVdyYXBwZXJCYXNlKHByb3ApCi0gICAgLCBtX2dldHRlcihnZXR0ZXIpCi0gICAgeyB9Ci0gICAg
Ci0gICAgdmlydHVhbCBib29sIGVxdWFscyhjb25zdCBSZW5kZXJTdHlsZSogYSwgY29uc3QgUmVu
ZGVyU3R5bGUqIGIpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gKGEtPiptX2dldHRlciko
KSA9PSAoYi0+Km1fZ2V0dGVyKSgpOwotICAgIH0KLSAgICAKLXByb3RlY3RlZDoKLSAgICBUIChS
ZW5kZXJTdHlsZTo6Km1fZ2V0dGVyKSgpIGNvbnN0OwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1l
IFQ+Ci1jbGFzcyBQcm9wZXJ0eVdyYXBwZXIgOiBwdWJsaWMgUHJvcGVydHlXcmFwcGVyR2V0dGVy
PFQ+IHsKLXB1YmxpYzoKLSAgICBQcm9wZXJ0eVdyYXBwZXIoaW50IHByb3AsIFQgKFJlbmRlclN0
eWxlOjoqZ2V0dGVyKSgpIGNvbnN0LCB2b2lkIChSZW5kZXJTdHlsZTo6KnNldHRlcikoVCkpCi0g
ICAgOiBQcm9wZXJ0eVdyYXBwZXJHZXR0ZXI8VD4ocHJvcCwgZ2V0dGVyKQotICAgICwgbV9zZXR0
ZXIoc2V0dGVyKQotICAgIHsgfQotICAgIAotICAgIHZpcnR1YWwgdm9pZCBibGVuZChSZW5kZXJT
dHlsZSogZHN0LCBjb25zdCBSZW5kZXJTdHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUqIGIsIGRv
dWJsZSBwcm9nKSBjb25zdAotICAgIHsKLSAgICAgICAgKGRzdC0+Km1fc2V0dGVyKShibGVuZEZ1
bmMoKGEtPipQcm9wZXJ0eVdyYXBwZXJHZXR0ZXI8VD46Om1fZ2V0dGVyKSgpLCAoYi0+KlByb3Bl
cnR5V3JhcHBlckdldHRlcjxUPjo6bV9nZXR0ZXIpKCksIHByb2cpKTsKLSAgICB9Ci0gICAgCi1w
cm90ZWN0ZWQ6Ci0gICAgdm9pZCAoUmVuZGVyU3R5bGU6OiptX3NldHRlcikoVCk7Ci19OwotCi1j
bGFzcyBQcm9wZXJ0eVdyYXBwZXJTaGFkb3cgOiBwdWJsaWMgUHJvcGVydHlXcmFwcGVyR2V0dGVy
PFNoYWRvd0RhdGEqPiB7Ci1wdWJsaWM6Ci0gICAgUHJvcGVydHlXcmFwcGVyU2hhZG93KGludCBw
cm9wLCBTaGFkb3dEYXRhKiAoUmVuZGVyU3R5bGU6OipnZXR0ZXIpKCkgY29uc3QsIHZvaWQgKFJl
bmRlclN0eWxlOjoqc2V0dGVyKShTaGFkb3dEYXRhKiwgYm9vbCkpCi0gICAgOiBQcm9wZXJ0eVdy
YXBwZXJHZXR0ZXI8U2hhZG93RGF0YSo+KHByb3AsIGdldHRlcikKLSAgICAsIG1fc2V0dGVyKHNl
dHRlcikKLSAgICB7IH0KLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IFJlbmRl
clN0eWxlKiBhLCBjb25zdCBSZW5kZXJTdHlsZSogYikgY29uc3QKLSAgICB7Ci0gICAgICAgIFNo
YWRvd0RhdGEqIHNoYWRvd2EgPSAoYS0+Km1fZ2V0dGVyKSgpOwotICAgICAgICBTaGFkb3dEYXRh
KiBzaGFkb3diID0gKGItPiptX2dldHRlcikoKTsKLSAgICAgICAgCi0gICAgICAgIGlmICghc2hh
ZG93YSAmJiBzaGFkb3diIHx8IHNoYWRvd2EgJiYgIXNoYWRvd2IpCi0gICAgICAgICAgICByZXR1
cm4gZmFsc2U7Ci0gICAgICAgIGlmIChzaGFkb3dhICYmIHNoYWRvd2IgJiYgKCpzaGFkb3dhICE9
ICpzaGFkb3diKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgcmV0dXJuIHRy
dWU7Ci0gICAgfQotICAgIAotICAgIHZpcnR1YWwgdm9pZCBibGVuZChSZW5kZXJTdHlsZSogZHN0
LCBjb25zdCBSZW5kZXJTdHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUqIGIsIGRvdWJsZSBwcm9n
KSBjb25zdAotICAgIHsKLSAgICAgICAgU2hhZG93RGF0YSogc2hhZG93YSA9IChhLT4qbV9nZXR0
ZXIpKCk7Ci0gICAgICAgIFNoYWRvd0RhdGEqIHNoYWRvd2IgPSAoYi0+Km1fZ2V0dGVyKSgpOwot
ICAgICAgICBTaGFkb3dEYXRhIGRlZmF1bHRTaGFkb3dEYXRhKDAsIDAsIDAsIENvbG9yOjp0cmFu
c3BhcmVudCk7Ci0gICAgICAgIAotICAgICAgICBpZiAoIXNoYWRvd2EpCi0gICAgICAgICAgICBz
aGFkb3dhID0gJmRlZmF1bHRTaGFkb3dEYXRhOwotICAgICAgICBpZiAoIXNoYWRvd2IpCi0gICAg
ICAgICAgICBzaGFkb3diID0gJmRlZmF1bHRTaGFkb3dEYXRhOwotICAgICAgICAKLSAgICAgICAg
KGRzdC0+Km1fc2V0dGVyKShibGVuZEZ1bmMoc2hhZG93YSwgc2hhZG93YiwgcHJvZyksIGZhbHNl
KTsKLSAgICB9Ci0gICAgCi1wcml2YXRlOgotICAgIHZvaWQgKFJlbmRlclN0eWxlOjoqbV9zZXR0
ZXIpKFNoYWRvd0RhdGEqLCBib29sKTsKLX07Ci0KLWNsYXNzIFByb3BlcnR5V3JhcHBlck1heWJl
SW52YWxpZENvbG9yIDogcHVibGljIFByb3BlcnR5V3JhcHBlckJhc2UgewotcHVibGljOgotICAg
IFByb3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENvbG9yKGludCBwcm9wLCBjb25zdCBDb2xvciYg
KFJlbmRlclN0eWxlOjoqZ2V0dGVyKSgpIGNvbnN0LCB2b2lkIChSZW5kZXJTdHlsZTo6KnNldHRl
cikoY29uc3QgQ29sb3ImKSkKLSAgICA6IFByb3BlcnR5V3JhcHBlckJhc2UocHJvcCkKLSAgICAs
IG1fZ2V0dGVyKGdldHRlcikKLSAgICAsIG1fc2V0dGVyKHNldHRlcikKLSAgICB7IH0KLSAgICAK
LSAgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IFJlbmRlclN0eWxlKiBhLCBjb25zdCBSZW5k
ZXJTdHlsZSogYikgY29uc3QKLSAgICB7Ci0gICAgICAgIENvbG9yIGZyb21Db2xvciA9IChhLT4q
bV9nZXR0ZXIpKCk7Ci0gICAgICAgIENvbG9yIHRvQ29sb3IgPSAoYi0+Km1fZ2V0dGVyKSgpOwot
ICAgICAgICBpZiAoIWZyb21Db2xvci5pc1ZhbGlkKCkpCi0gICAgICAgICAgICBmcm9tQ29sb3Ig
PSBhLT5jb2xvcigpOwotICAgICAgICBpZiAoIXRvQ29sb3IuaXNWYWxpZCgpKQotICAgICAgICAg
ICAgdG9Db2xvciA9IGItPmNvbG9yKCk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gZnJvbUNv
bG9yID09IHRvQ29sb3I7Ci0gICAgfQotICAgIAotICAgIHZpcnR1YWwgdm9pZCBibGVuZChSZW5k
ZXJTdHlsZSogZHN0LCBjb25zdCBSZW5kZXJTdHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUqIGIs
IGRvdWJsZSBwcm9nKSBjb25zdAotICAgIHsKLSAgICAgICAgQ29sb3IgZnJvbUNvbG9yID0gKGEt
PiptX2dldHRlcikoKTsKLSAgICAgICAgQ29sb3IgdG9Db2xvciA9IChiLT4qbV9nZXR0ZXIpKCk7
Ci0gICAgICAgIGlmICghZnJvbUNvbG9yLmlzVmFsaWQoKSkKLSAgICAgICAgICAgIGZyb21Db2xv
ciA9IGEtPmNvbG9yKCk7Ci0gICAgICAgIGlmICghdG9Db2xvci5pc1ZhbGlkKCkpCi0gICAgICAg
ICAgICB0b0NvbG9yID0gYi0+Y29sb3IoKTsKLSAgICAgICAgKGRzdC0+Km1fc2V0dGVyKShibGVu
ZEZ1bmMoZnJvbUNvbG9yLCB0b0NvbG9yLCBwcm9nKSk7Ci0gICAgfQotICAgIAotcHJpdmF0ZToK
LSAgICBjb25zdCBDb2xvciYgKFJlbmRlclN0eWxlOjoqbV9nZXR0ZXIpKCkgY29uc3Q7Ci0gICAg
dm9pZCAoUmVuZGVyU3R5bGU6OiptX3NldHRlcikoY29uc3QgQ29sb3ImKTsKLX07Ci0KLWNsYXNz
IEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlIHsKLXB1YmxpYzoKLSAgICBBbmltYXRpb25Db250
cm9sbGVyUHJpdmF0ZShGcmFtZSopOwotICAgIH5BbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZSgp
OwotICAgIAotICAgIENvbXBvc2l0ZUFuaW1hdGlvbiogYWNjZXNzQ29tcG9zaXRlQW5pbWF0aW9u
KFJlbmRlck9iamVjdCopOwotICAgIGJvb2wgY2xlYXIoUmVuZGVyT2JqZWN0Kik7Ci0gICAgCi0g
ICAgdm9pZCBhbmltYXRpb25UaW1lckZpcmVkKFRpbWVyPEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2
YXRlPiopOwotICAgIHZvaWQgdXBkYXRlQW5pbWF0aW9uVGltZXIoKTsKLSAgICAKLSAgICB2b2lk
IHVwZGF0ZVJlbmRlcmluZ0Rpc3BhdGNoZXJGaXJlZChUaW1lcjxBbmltYXRpb25Db250cm9sbGVy
UHJpdmF0ZT4qKTsKLSAgICB2b2lkIHN0YXJ0VXBkYXRlUmVuZGVyaW5nRGlzcGF0Y2hlcigpOwot
ICAgIAotICAgIGJvb2wgaGFzQW5pbWF0aW9ucygpIGNvbnN0IHsgcmV0dXJuICFtX2NvbXBvc2l0
ZUFuaW1hdGlvbnMuaXNFbXB0eSgpOyB9Ci0gICAgCi0gICAgdm9pZCBzdXNwZW5kQW5pbWF0aW9u
cyhEb2N1bWVudCogZG9jdW1lbnQpOwotICAgIHZvaWQgcmVzdW1lQW5pbWF0aW9ucyhEb2N1bWVu
dCogZG9jdW1lbnQpOwotICAgIAotICAgIHZvaWQgc3R5bGVBdmFpbGFibGUoKTsKLSAgICAKLSAg
ICBib29sIGlzQW5pbWF0aW5nUHJvcGVydHlPblJlbmRlcmVyKFJlbmRlck9iamVjdCogb2JqLCBp
bnQgcHJvcGVydHksIGJvb2wgaXNSdW5uaW5nTm93KSBjb25zdDsKLSAgICAKLSAgICBzdGF0aWMg
Ym9vbCBwcm9wZXJ0aWVzRXF1YWwoaW50IHByb3AsIGNvbnN0IFJlbmRlclN0eWxlKiBhLCBjb25z
dCBSZW5kZXJTdHlsZSogYik7Ci0gICAgc3RhdGljIGludCBnZXRQcm9wZXJ0eUF0SW5kZXgoaW50
IGkpOwotICAgIHN0YXRpYyBpbnQgZ2V0TnVtUHJvcGVydGllcygpIHsgcmV0dXJuIGdQcm9wZXJ0
eVdyYXBwZXJzLT5zaXplKCk7IH0KLSAgICAKLSAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB3ZSBuZWVk
IHRvIHN0YXJ0IHNvZnR3YXJlIGFuaW1hdGlvbiB0aW1lcnMKLSAgICBzdGF0aWMgYm9vbCBibGVu
ZFByb3BlcnRpZXMoaW50IHByb3AsIFJlbmRlclN0eWxlKiBkc3QsIGNvbnN0IFJlbmRlclN0eWxl
KiBhLCBjb25zdCBSZW5kZXJTdHlsZSogYiwgZG91YmxlIHByb2cpOwotICAgIAotICAgIHZvaWQg
c2V0V2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKGJvb2wgd2FpdGluZykgeyBpZiAod2FpdGluZykg
bV9udW1TdHlsZUF2YWlsYWJsZVdhaXRlcnMrKzsgZWxzZSBtX251bVN0eWxlQXZhaWxhYmxlV2Fp
dGVycy0tOyB9Ci0gICAgCi1wcml2YXRlOgotICAgIHN0YXRpYyB2b2lkIGVuc3VyZVByb3BlcnR5
TWFwKCk7Ci0gICAgCi0gICAgdHlwZWRlZiBIYXNoTWFwPFJlbmRlck9iamVjdCosIENvbXBvc2l0
ZUFuaW1hdGlvbio+IFJlbmRlck9iamVjdEFuaW1hdGlvbk1hcDsKLSAgICAKLSAgICBSZW5kZXJP
YmplY3RBbmltYXRpb25NYXAgbV9jb21wb3NpdGVBbmltYXRpb25zOwotICAgIFRpbWVyPEFuaW1h
dGlvbkNvbnRyb2xsZXJQcml2YXRlPiBtX2FuaW1hdGlvblRpbWVyOwotICAgIFRpbWVyPEFuaW1h
dGlvbkNvbnRyb2xsZXJQcml2YXRlPiBtX3VwZGF0ZVJlbmRlcmluZ0Rpc3BhdGNoZXI7Ci0gICAg
RnJhbWUqIG1fZnJhbWU7Ci0gICAgdWludDMyX3QgbV9udW1TdHlsZUF2YWlsYWJsZVdhaXRlcnM7
Ci0gICAgCi0gICAgc3RhdGljIFZlY3RvcjxQcm9wZXJ0eVdyYXBwZXJCYXNlKj4qIGdQcm9wZXJ0
eVdyYXBwZXJzOwotICAgIHN0YXRpYyBpbnQgZ1Byb3BlcnR5V3JhcHBlck1hcFtudW1DU1NQcm9w
ZXJ0aWVzXTsKLX07Ci0KLVZlY3RvcjxQcm9wZXJ0eVdyYXBwZXJCYXNlKj4qIEFuaW1hdGlvbkNv
bnRyb2xsZXJQcml2YXRlOjpnUHJvcGVydHlXcmFwcGVycyA9IDA7Ci1pbnQgQW5pbWF0aW9uQ29u
dHJvbGxlclByaXZhdGU6OmdQcm9wZXJ0eVdyYXBwZXJNYXBbXTsKLQotQW5pbWF0aW9uQ29udHJv
bGxlclByaXZhdGU6OkFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlKEZyYW1lKiBmcmFtZSkKLTog
bV9hbmltYXRpb25UaW1lcih0aGlzLCAmQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OmFuaW1h
dGlvblRpbWVyRmlyZWQpCi0sIG1fdXBkYXRlUmVuZGVyaW5nRGlzcGF0Y2hlcih0aGlzLCAmQW5p
bWF0aW9uQ29udHJvbGxlclByaXZhdGU6OnVwZGF0ZVJlbmRlcmluZ0Rpc3BhdGNoZXJGaXJlZCkK
LSwgbV9mcmFtZShmcmFtZSkKLSwgbV9udW1TdHlsZUF2YWlsYWJsZVdhaXRlcnMoMCkKLXsKLSAg
ICBlbnN1cmVQcm9wZXJ0eU1hcCgpOwotfQotCi1BbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6
fkFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlKCkKLXsKLSAgICBkZWxldGVBbGxWYWx1ZXMobV9j
b21wb3NpdGVBbmltYXRpb25zKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEFuaW1hdGlvbkNvbnRy
b2xsZXJQcml2YXRlOjplbnN1cmVQcm9wZXJ0eU1hcCgpCi17Ci0gICAgLy8gRklYTUU6IFRoaXMg
ZGF0YSBpcyBuZXZlciBkZXN0cm95ZWQuIE1heWJlIHdlIHNob3VsZCByZWYgY291bnQgaXQgYW5k
IHRvc3MgaXQgd2hlbiB0aGUgbGFzdCBBbmltYXRpb25Db250cm9sbGVyIGlzIGRlc3Ryb3llZD8K
LSAgICBpZiAoZ1Byb3BlcnR5V3JhcHBlcnMgPT0gMCkgewotICAgICAgICBnUHJvcGVydHlXcmFw
cGVycyA9IG5ldyBWZWN0b3I8UHJvcGVydHlXcmFwcGVyQmFzZSo+KCk7Ci0gICAgICAgIAotICAg
ICAgICAvLyBidWlsZCB0aGUgbGlzdCBvZiBwcm9wZXJ0eSB3cmFwcGVycyB0byBkbyB0aGUgY29t
cGFyaXNvbnMgYW5kIGJsZW5kcwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5l
dyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eUxlZnQsICZSZW5kZXJTdHlsZTo6
bGVmdCwgJlJlbmRlclN0eWxlOjpzZXRMZWZ0KSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJz
LT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5UmlnaHQsICZS
ZW5kZXJTdHlsZTo6cmlnaHQsICZSZW5kZXJTdHlsZTo6c2V0UmlnaHQpKTsKLSAgICAgICAgZ1By
b3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJv
cGVydHlUb3AsICZSZW5kZXJTdHlsZTo6dG9wLCAmUmVuZGVyU3R5bGU6OnNldFRvcCkpOwotICAg
ICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3Ro
PihDU1NQcm9wZXJ0eUJvdHRvbSwgJlJlbmRlclN0eWxlOjpib3R0b20sICZSZW5kZXJTdHlsZTo6
c2V0Qm90dG9tKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3Bl
cnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5V2lkdGgsICZSZW5kZXJTdHlsZTo6d2lkdGgs
ICZSZW5kZXJTdHlsZTo6c2V0V2lkdGgpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFw
cGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlIZWlnaHQsICZSZW5k
ZXJTdHlsZTo6aGVpZ2h0LCAmUmVuZGVyU3R5bGU6OnNldEhlaWdodCkpOwotICAgICAgICBnUHJv
cGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8dW5zaWduZWQgc2hvcnQ+
KENTU1Byb3BlcnR5Qm9yZGVyTGVmdFdpZHRoLCAmUmVuZGVyU3R5bGU6OmJvcmRlckxlZnRXaWR0
aCwgJlJlbmRlclN0eWxlOjpzZXRCb3JkZXJMZWZ0V2lkdGgpKTsKLSAgICAgICAgZ1Byb3BlcnR5
V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPHVuc2lnbmVkIHNob3J0PihDU1NQ
cm9wZXJ0eUJvcmRlclJpZ2h0V2lkdGgsICZSZW5kZXJTdHlsZTo6Ym9yZGVyUmlnaHRXaWR0aCwg
JlJlbmRlclN0eWxlOjpzZXRCb3JkZXJSaWdodFdpZHRoKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdy
YXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjx1bnNpZ25lZCBzaG9ydD4oQ1NTUHJv
cGVydHlCb3JkZXJUb3BXaWR0aCwgJlJlbmRlclN0eWxlOjpib3JkZXJUb3BXaWR0aCwgJlJlbmRl
clN0eWxlOjpzZXRCb3JkZXJUb3BXaWR0aCkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+
YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8dW5zaWduZWQgc2hvcnQ+KENTU1Byb3BlcnR5Qm9y
ZGVyQm90dG9tV2lkdGgsICZSZW5kZXJTdHlsZTo6Ym9yZGVyQm90dG9tV2lkdGgsICZSZW5kZXJT
dHlsZTo6c2V0Qm9yZGVyQm90dG9tV2lkdGgpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMt
PmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlNYXJnaW5MZWZ0
LCAmUmVuZGVyU3R5bGU6Om1hcmdpbkxlZnQsICZSZW5kZXJTdHlsZTo6c2V0TWFyZ2luTGVmdCkp
OwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8
TGVuZ3RoPihDU1NQcm9wZXJ0eU1hcmdpblJpZ2h0LCAmUmVuZGVyU3R5bGU6Om1hcmdpblJpZ2h0
LCAmUmVuZGVyU3R5bGU6OnNldE1hcmdpblJpZ2h0KSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBw
ZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5TWFyZ2lu
VG9wLCAmUmVuZGVyU3R5bGU6Om1hcmdpblRvcCwgJlJlbmRlclN0eWxlOjpzZXRNYXJnaW5Ub3Ap
KTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVy
PExlbmd0aD4oQ1NTUHJvcGVydHlNYXJnaW5Cb3R0b20sICZSZW5kZXJTdHlsZTo6bWFyZ2luQm90
dG9tLCAmUmVuZGVyU3R5bGU6OnNldE1hcmdpbkJvdHRvbSkpOwotICAgICAgICBnUHJvcGVydHlX
cmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eVBh
ZGRpbmdMZWZ0LCAmUmVuZGVyU3R5bGU6OnBhZGRpbmdMZWZ0LCAmUmVuZGVyU3R5bGU6OnNldFBh
ZGRpbmdMZWZ0KSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3Bl
cnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5UGFkZGluZ1JpZ2h0LCAmUmVuZGVyU3R5bGU6
OnBhZGRpbmdSaWdodCwgJlJlbmRlclN0eWxlOjpzZXRQYWRkaW5nUmlnaHQpKTsKLSAgICAgICAg
Z1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4oQ1NT
UHJvcGVydHlQYWRkaW5nVG9wLCAmUmVuZGVyU3R5bGU6OnBhZGRpbmdUb3AsICZSZW5kZXJTdHls
ZTo6c2V0UGFkZGluZ1RvcCkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5l
dyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eVBhZGRpbmdCb3R0b20sICZSZW5k
ZXJTdHlsZTo6cGFkZGluZ0JvdHRvbSwgJlJlbmRlclN0eWxlOjpzZXRQYWRkaW5nQm90dG9tKSk7
Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxm
bG9hdD4oQ1NTUHJvcGVydHlPcGFjaXR5LCAmUmVuZGVyU3R5bGU6Om9wYWNpdHksICZSZW5kZXJT
dHlsZTo6c2V0T3BhY2l0eSkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5l
dyBQcm9wZXJ0eVdyYXBwZXI8Y29uc3QgQ29sb3ImPihDU1NQcm9wZXJ0eUNvbG9yLCAmUmVuZGVy
U3R5bGU6OmNvbG9yLCAmUmVuZGVyU3R5bGU6OnNldENvbG9yKSk7Ci0gICAgICAgIGdQcm9wZXJ0
eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxjb25zdCBDb2xvciY+KENTU1By
b3BlcnR5QmFja2dyb3VuZENvbG9yLCAmUmVuZGVyU3R5bGU6OmJhY2tncm91bmRDb2xvciwgJlJl
bmRlclN0eWxlOjpzZXRCYWNrZ3JvdW5kQ29sb3IpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBl
cnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPGludD4oQ1NTUHJvcGVydHlGb250U2l6ZSwg
JlJlbmRlclN0eWxlOjpmb250U2l6ZSwgJlJlbmRlclN0eWxlOjpzZXRCbGVuZGVkRm9udFNpemUp
KTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVy
PHVuc2lnbmVkIHNob3J0PihDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGVXaWR0aCwgJlJlbmRl
clN0eWxlOjpjb2x1bW5SdWxlV2lkdGgsICZSZW5kZXJTdHlsZTo6c2V0Q29sdW1uUnVsZVdpZHRo
KSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBl
cjxmbG9hdD4oQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5HYXAsICZSZW5kZXJTdHlsZTo6Y29sdW1u
R2FwLCAmUmVuZGVyU3R5bGU6OnNldENvbHVtbkdhcCkpOwotICAgICAgICBnUHJvcGVydHlXcmFw
cGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8dW5zaWduZWQgc2hvcnQ+KENTU1Byb3Bl
cnR5V2Via2l0Q29sdW1uQ291bnQsICZSZW5kZXJTdHlsZTo6Y29sdW1uQ291bnQsICZSZW5kZXJT
dHlsZTo6c2V0Q29sdW1uQ291bnQpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVu
ZChuZXcgUHJvcGVydHlXcmFwcGVyPGZsb2F0PihDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbldpZHRo
LCAmUmVuZGVyU3R5bGU6OmNvbHVtbldpZHRoLCAmUmVuZGVyU3R5bGU6OnNldENvbHVtbldpZHRo
KSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBl
cjxzaG9ydD4oQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJIb3Jpem9udGFsU3BhY2luZywgJlJlbmRl
clN0eWxlOjpob3Jpem9udGFsQm9yZGVyU3BhY2luZywgJlJlbmRlclN0eWxlOjpzZXRIb3Jpem9u
dGFsQm9yZGVyU3BhY2luZykpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5l
dyBQcm9wZXJ0eVdyYXBwZXI8c2hvcnQ+KENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyVmVydGljYWxT
cGFjaW5nLCAmUmVuZGVyU3R5bGU6OnZlcnRpY2FsQm9yZGVyU3BhY2luZywgJlJlbmRlclN0eWxl
OjpzZXRWZXJ0aWNhbEJvcmRlclNwYWNpbmcpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMt
PmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPGludD4oQ1NTUHJvcGVydHlaSW5kZXgsICZSZW5k
ZXJTdHlsZTo6ekluZGV4LCAmUmVuZGVyU3R5bGU6OnNldFpJbmRleCkpOwotICAgICAgICBnUHJv
cGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9w
ZXJ0eUxpbmVIZWlnaHQsICZSZW5kZXJTdHlsZTo6bGluZUhlaWdodCwgJlJlbmRlclN0eWxlOjpz
ZXRMaW5lSGVpZ2h0KSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFBy
b3BlcnR5V3JhcHBlcjxpbnQ+KENTU1Byb3BlcnR5T3V0bGluZU9mZnNldCwgJlJlbmRlclN0eWxl
OjpvdXRsaW5lT2Zmc2V0LCAmUmVuZGVyU3R5bGU6OnNldE91dGxpbmVPZmZzZXQpKTsKLSAgICAg
ICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPHVuc2lnbmVk
IHNob3J0PihDU1NQcm9wZXJ0eU91dGxpbmVXaWR0aCwgJlJlbmRlclN0eWxlOjpvdXRsaW5lV2lk
dGgsICZSZW5kZXJTdHlsZTo6c2V0T3V0bGluZVdpZHRoKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdy
YXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxpbnQ+KENTU1Byb3BlcnR5TGV0dGVy
U3BhY2luZywgJlJlbmRlclN0eWxlOjpsZXR0ZXJTcGFjaW5nLCAmUmVuZGVyU3R5bGU6OnNldExl
dHRlclNwYWNpbmcpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJv
cGVydHlXcmFwcGVyPGludD4oQ1NTUHJvcGVydHlXb3JkU3BhY2luZywgJlJlbmRlclN0eWxlOjp3
b3JkU3BhY2luZywgJlJlbmRlclN0eWxlOjpzZXRXb3JkU3BhY2luZykpOwotICAgICAgICBnUHJv
cGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8Y29uc3QgVHJhbnNmb3Jt
T3BlcmF0aW9ucyY+KENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtLCAmUmVuZGVyU3R5bGU6OnRy
YW5zZm9ybSwgJlJlbmRlclN0eWxlOjpzZXRUcmFuc2Zvcm0pKTsKLSAgICAgICAgZ1Byb3BlcnR5
V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlX
ZWJraXRUcmFuc2Zvcm1PcmlnaW5YLCAmUmVuZGVyU3R5bGU6OnRyYW5zZm9ybU9yaWdpblgsICZS
ZW5kZXJTdHlsZTo6c2V0VHJhbnNmb3JtT3JpZ2luWCkpOwotICAgICAgICBnUHJvcGVydHlXcmFw
cGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eVdlYmtp
dFRyYW5zZm9ybU9yaWdpblksICZSZW5kZXJTdHlsZTo6dHJhbnNmb3JtT3JpZ2luWSwgJlJlbmRl
clN0eWxlOjpzZXRUcmFuc2Zvcm1PcmlnaW5ZKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJz
LT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxjb25zdCBJbnRTaXplJj4oQ1NTUHJvcGVydHlX
ZWJraXRCb3JkZXJUb3BMZWZ0UmFkaXVzLCAmUmVuZGVyU3R5bGU6OmJvcmRlclRvcExlZnRSYWRp
dXMsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyVG9wTGVmdFJhZGl1cykpOwotICAgICAgICBnUHJv
cGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8Y29uc3QgSW50U2l6ZSY+
KENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyVG9wUmlnaHRSYWRpdXMsICZSZW5kZXJTdHlsZTo6Ym9y
ZGVyVG9wUmlnaHRSYWRpdXMsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyVG9wUmlnaHRSYWRpdXMp
KTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVy
PGNvbnN0IEludFNpemUmPihDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckJvdHRvbUxlZnRSYWRpdXMs
ICZSZW5kZXJTdHlsZTo6Ym9yZGVyQm90dG9tTGVmdFJhZGl1cywgJlJlbmRlclN0eWxlOjpzZXRC
b3JkZXJCb3R0b21MZWZ0UmFkaXVzKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBl
bmQobmV3IFByb3BlcnR5V3JhcHBlcjxjb25zdCBJbnRTaXplJj4oQ1NTUHJvcGVydHlXZWJraXRC
b3JkZXJCb3R0b21SaWdodFJhZGl1cywgJlJlbmRlclN0eWxlOjpib3JkZXJCb3R0b21SaWdodFJh
ZGl1cywgJlJlbmRlclN0eWxlOjpzZXRCb3JkZXJCb3R0b21SaWdodFJhZGl1cykpOwotICAgICAg
ICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8RVZpc2liaWxp
dHk+KENTU1Byb3BlcnR5VmlzaWJpbGl0eSwgJlJlbmRlclN0eWxlOjp2aXNpYmlsaXR5LCAmUmVu
ZGVyU3R5bGU6OnNldFZpc2liaWxpdHkpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFw
cGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPGZsb2F0PihDU1NQcm9wZXJ0eVpvb20sICZSZW5kZXJT
dHlsZTo6em9vbSwgJlJlbmRlclN0eWxlOjpzZXRab29tKSk7Ci0gICAgICAgIAotICAgICAgICAv
LyBGSVhNRTogdGhlc2UgbWlnaHQgYmUgaW52YWxpZCBjb2xvcnMsIG5lZWQgdG8gY2hlY2sgZm9y
IHRoYXQKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFw
cGVyTWF5YmVJbnZhbGlkQ29sb3IoQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5SdWxlQ29sb3IsICZS
ZW5kZXJTdHlsZTo6Y29sdW1uUnVsZUNvbG9yLCAmUmVuZGVyU3R5bGU6OnNldENvbHVtblJ1bGVD
b2xvcikpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdy
YXBwZXJNYXliZUludmFsaWRDb2xvcihDU1NQcm9wZXJ0eVdlYmtpdFRleHRTdHJva2VDb2xvciwg
JlJlbmRlclN0eWxlOjp0ZXh0U3Ryb2tlQ29sb3IsICZSZW5kZXJTdHlsZTo6c2V0VGV4dFN0cm9r
ZUNvbG9yKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5
V3JhcHBlck1heWJlSW52YWxpZENvbG9yKENTU1Byb3BlcnR5V2Via2l0VGV4dEZpbGxDb2xvciwg
JlJlbmRlclN0eWxlOjp0ZXh0RmlsbENvbG9yLCAmUmVuZGVyU3R5bGU6OnNldFRleHRGaWxsQ29s
b3IpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFw
cGVyTWF5YmVJbnZhbGlkQ29sb3IoQ1NTUHJvcGVydHlCb3JkZXJMZWZ0Q29sb3IsICZSZW5kZXJT
dHlsZTo6Ym9yZGVyTGVmdENvbG9yLCAmUmVuZGVyU3R5bGU6OnNldEJvcmRlckxlZnRDb2xvcikp
OwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXJN
YXliZUludmFsaWRDb2xvcihDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0Q29sb3IsICZSZW5kZXJTdHls
ZTo6Ym9yZGVyUmlnaHRDb2xvciwgJlJlbmRlclN0eWxlOjpzZXRCb3JkZXJSaWdodENvbG9yKSk7
Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlck1h
eWJlSW52YWxpZENvbG9yKENTU1Byb3BlcnR5Qm9yZGVyVG9wQ29sb3IsICZSZW5kZXJTdHlsZTo6
Ym9yZGVyVG9wQ29sb3IsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyVG9wQ29sb3IpKTsKLSAgICAg
ICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyTWF5YmVJbnZh
bGlkQ29sb3IoQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21Db2xvciwgJlJlbmRlclN0eWxlOjpib3Jk
ZXJCb3R0b21Db2xvciwgJlJlbmRlclN0eWxlOjpzZXRCb3JkZXJCb3R0b21Db2xvcikpOwotICAg
ICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXJNYXliZUlu
dmFsaWRDb2xvcihDU1NQcm9wZXJ0eU91dGxpbmVDb2xvciwgJlJlbmRlclN0eWxlOjpvdXRsaW5l
Q29sb3IsICZSZW5kZXJTdHlsZTo6c2V0T3V0bGluZUNvbG9yKSk7Ci0gICAgICAgIAotICAgICAg
ICAvLyBUaGVzZSBhcmUgZm9yIHNoYWRvd3MKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFw
cGVuZChuZXcgUHJvcGVydHlXcmFwcGVyU2hhZG93KENTU1Byb3BlcnR5V2Via2l0Qm94U2hhZG93
LCAmUmVuZGVyU3R5bGU6OmJveFNoYWRvdywgJlJlbmRlclN0eWxlOjpzZXRCb3hTaGFkb3cpKTsK
LSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyU2hh
ZG93KENTU1Byb3BlcnR5VGV4dFNoYWRvdywgJlJlbmRlclN0eWxlOjp0ZXh0U2hhZG93LCAmUmVu
ZGVyU3R5bGU6OnNldFRleHRTaGFkb3cpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE1ha2Ugc3Vy
ZSB1bnVzZWQgc2xvdHMgaGF2ZSBhIHZhbHVlCi0gICAgICAgIGZvciAodW5zaWduZWQgaW50IGkg
PSAwOyBpIDwgKHVuc2lnbmVkIGludCkgbnVtQ1NTUHJvcGVydGllczsgKytpKQotICAgICAgICAg
ICAgZ1Byb3BlcnR5V3JhcHBlck1hcFtpXSA9IENTU1Byb3BlcnR5SW52YWxpZDsKLSAgICAgICAg
Ci0gICAgICAgIHNpemVfdCBuID0gZ1Byb3BlcnR5V3JhcHBlcnMtPnNpemUoKTsKLSAgICAgICAg
Zm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgIEFTU0VS
VCgoKmdQcm9wZXJ0eVdyYXBwZXJzKVtpXS0+cHJvcGVydHkoKSAtIGZpcnN0Q1NTUHJvcGVydHkg
PCBudW1DU1NQcm9wZXJ0aWVzKTsKLSAgICAgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJNYXBbKCpn
UHJvcGVydHlXcmFwcGVycylbaV0tPnByb3BlcnR5KCkgLSBmaXJzdENTU1Byb3BlcnR5XSA9IGk7
Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBBbmltYXRpb25Db250cm9s
bGVyUHJpdmF0ZTo6cHJvcGVydGllc0VxdWFsKGludCBwcm9wLCBjb25zdCBSZW5kZXJTdHlsZSog
YSwgY29uc3QgUmVuZGVyU3R5bGUqIGIpCi17Ci0gICAgaWYgKHByb3AgPT0gY0FuaW1hdGVBbGwp
IHsKLSAgICAgICAgc2l6ZV90IG4gPSBnUHJvcGVydHlXcmFwcGVycy0+c2l6ZSgpOwotICAgICAg
ICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgaWYg
KCEoKmdQcm9wZXJ0eVdyYXBwZXJzKVtpXS0+ZXF1YWxzKGEsIGIpKQotICAgICAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgICAgaW50
IHByb3BJbmRleCA9IHByb3AgLSBmaXJzdENTU1Byb3BlcnR5OwotICAgICAgICAKLSAgICAgICAg
aWYgKHByb3BJbmRleCA+PSAwICYmIHByb3BJbmRleCA8IG51bUNTU1Byb3BlcnRpZXMpIHsKLSAg
ICAgICAgICAgIGludCBpID0gZ1Byb3BlcnR5V3JhcHBlck1hcFtwcm9wSW5kZXhdOwotICAgICAg
ICAgICAgcmV0dXJuIChpID49IDApID8gKCpnUHJvcGVydHlXcmFwcGVycylbaV0tPmVxdWFscyhh
LCBiKSA6IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8v
IHN0YXRpYwotaW50IEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpnZXRQcm9wZXJ0eUF0SW5k
ZXgoaW50IGkpCi17Ci0gICAgaWYgKGkgPCAwIHx8IGkgPj0gKGludCkgZ1Byb3BlcnR5V3JhcHBl
cnMtPnNpemUoKSkKLSAgICAgICAgcmV0dXJuIENTU1Byb3BlcnR5SW52YWxpZDsKLSAgICAgICAg
Ci0gICAgcmV0dXJuICgqZ1Byb3BlcnR5V3JhcHBlcnMpW2ldLT5wcm9wZXJ0eSgpOwotfQotICAg
IAotLy8gc3RhdGljIC0gcmV0dXJuIHRydWUgaWYgd2UgbmVlZCB0byBzdGFydCBzb2Z0d2FyZSBh
bmltYXRpb24gdGltZXJzCi1ib29sIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpibGVuZFBy
b3BlcnRpZXMoaW50IHByb3AsIFJlbmRlclN0eWxlKiBkc3QsIGNvbnN0IFJlbmRlclN0eWxlKiBh
LCBjb25zdCBSZW5kZXJTdHlsZSogYiwgZG91YmxlIHByb2cpCi17Ci0gICAgaWYgKHByb3AgPT0g
Y0FuaW1hdGVBbGwpIHsKLSAgICAgICAgQVNTRVJUKDApOwotICAgICAgICBib29sIG5lZWRzVGlt
ZXIgPSBmYWxzZTsKLSAgICAKLSAgICAgICAgc2l6ZV90IG4gPSBnUHJvcGVydHlXcmFwcGVycy0+
c2l6ZSgpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG47ICsraSkgewot
ICAgICAgICAgICAgUHJvcGVydHlXcmFwcGVyQmFzZSogd3JhcHBlciA9ICgqZ1Byb3BlcnR5V3Jh
cHBlcnMpW2ldOwotICAgICAgICAgICAgaWYgKCF3cmFwcGVyLT5lcXVhbHMoYSwgYikpIHsKLSAg
ICAgICAgICAgICAgICB3cmFwcGVyLT5ibGVuZChkc3QsIGEsIGIsIHByb2cpOwotICAgICAgICAg
ICAgICAgIG5lZWRzVGltZXIgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAg
ICAgIHJldHVybiBuZWVkc1RpbWVyOwotICAgIH0KLSAgICAKLSAgICBpbnQgcHJvcEluZGV4ID0g
cHJvcCAtIGZpcnN0Q1NTUHJvcGVydHk7Ci0gICAgaWYgKHByb3BJbmRleCA+PSAwICYmIHByb3BJ
bmRleCA8IG51bUNTU1Byb3BlcnRpZXMpIHsKLSAgICAgICAgaW50IGkgPSBnUHJvcGVydHlXcmFw
cGVyTWFwW3Byb3BJbmRleF07Ci0gICAgICAgIGlmIChpID49IDApIHsKLSAgICAgICAgICAgIFBy
b3BlcnR5V3JhcHBlckJhc2UqIHdyYXBwZXIgPSAoKmdQcm9wZXJ0eVdyYXBwZXJzKVtpXTsKLSAg
ICAgICAgICAgIHdyYXBwZXItPmJsZW5kKGRzdCwgYSwgYiwgcHJvZyk7Ci0gICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gZmFsc2U7Ci19
Ci0KLUNvbXBvc2l0ZUFuaW1hdGlvbiogQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OmFjY2Vz
c0NvbXBvc2l0ZUFuaW1hdGlvbihSZW5kZXJPYmplY3QqIHJlbmRlcmVyKQotewotICAgIENvbXBv
c2l0ZUFuaW1hdGlvbiogYW5pbWF0aW9uID0gbV9jb21wb3NpdGVBbmltYXRpb25zLmdldChyZW5k
ZXJlcik7Ci0gICAgaWYgKCFhbmltYXRpb24pIHsKLSAgICAgICAgYW5pbWF0aW9uID0gbmV3IENv
bXBvc2l0ZUFuaW1hdGlvbih0aGlzKTsKLSAgICAgICAgbV9jb21wb3NpdGVBbmltYXRpb25zLnNl
dChyZW5kZXJlciwgYW5pbWF0aW9uKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFuaW1hdGlvbjsKLX0K
LQotYm9vbCBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6Y2xlYXIoUmVuZGVyT2JqZWN0KiBy
ZW5kZXJlcikKLXsKLSAgICAvLyBSZXR1cm4gZmFsc2UgaWYgd2UgZGlkbid0IGRvIGFueXRoaW5n
IE9SIHdlIGFyZSBzdXNwZW5kZWQgKHNvIHdlIGRvbid0IHRyeSB0bwotICAgIC8vIGRvIGEgc2V0
Q2hhbmdlZCgpIHdoZW4gc3VzcGVuZGVkCi0gICAgQ29tcG9zaXRlQW5pbWF0aW9uKiBhbmltYXRp
b24gPSBtX2NvbXBvc2l0ZUFuaW1hdGlvbnMudGFrZShyZW5kZXJlcik7Ci0gICAgaWYgKCFhbmlt
YXRpb24pCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICBhbmltYXRpb24tPnJlc2V0VHJhbnNp
dGlvbnMocmVuZGVyZXIpOwotICAgIGJvb2wgd2FzU3VzcGVuZGVkID0gYW5pbWF0aW9uLT5zdXNw
ZW5kZWQoKTsKLSAgICBkZWxldGUgYW5pbWF0aW9uOwotICAgIHJldHVybiAhd2FzU3VzcGVuZGVk
OwotfQotCi12b2lkIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpzdHlsZUF2YWlsYWJsZSgp
Ci17Ci0gICAgaWYgKG1fbnVtU3R5bGVBdmFpbGFibGVXYWl0ZXJzID09IDApCi0gICAgICAgIHJl
dHVybjsKLSAgICAKLSAgICBSZW5kZXJPYmplY3RBbmltYXRpb25NYXA6OmNvbnN0X2l0ZXJhdG9y
IGFuaW1hdGlvbnNFbmQgPSBtX2NvbXBvc2l0ZUFuaW1hdGlvbnMuZW5kKCk7Ci0gICAgZm9yIChS
ZW5kZXJPYmplY3RBbmltYXRpb25NYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9jb21wb3NpdGVB
bmltYXRpb25zLmJlZ2luKCk7IAotICAgICAgICAgaXQgIT0gYW5pbWF0aW9uc0VuZDsgKytpdCkg
ewotICAgICAgICBpdC0+c2Vjb25kLT5zdHlsZUF2YWlsYWJsZSgpOwotICAgIH0KLX0KLQotdm9p
ZCBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6dXBkYXRlQW5pbWF0aW9uVGltZXIoKQotewot
ICAgIGJvb2wgYW5pbWF0aW5nID0gZmFsc2U7Ci0gICAgCi0gICAgUmVuZGVyT2JqZWN0QW5pbWF0
aW9uTWFwOjpjb25zdF9pdGVyYXRvciBhbmltYXRpb25zRW5kID0gbV9jb21wb3NpdGVBbmltYXRp
b25zLmVuZCgpOwotICAgIGZvciAoUmVuZGVyT2JqZWN0QW5pbWF0aW9uTWFwOjpjb25zdF9pdGVy
YXRvciBpdCA9IG1fY29tcG9zaXRlQW5pbWF0aW9ucy5iZWdpbigpOyAKLSAgICAgICAgIGl0ICE9
IGFuaW1hdGlvbnNFbmQ7ICsraXQpIHsKLSAgICAgICAgQ29tcG9zaXRlQW5pbWF0aW9uKiBjb21w
QW5pbSA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIGlmICghY29tcEFuaW0tPnN1c3BlbmRlZCgpICYm
IGNvbXBBbmltLT5hbmltYXRpbmcoKSkgewotICAgICAgICAgICAgYW5pbWF0aW5nID0gdHJ1ZTsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmIChhbmlt
YXRpbmcpIHsKLSAgICAgICAgaWYgKCFtX2FuaW1hdGlvblRpbWVyLmlzQWN0aXZlKCkpCi0gICAg
ICAgICAgICBtX2FuaW1hdGlvblRpbWVyLnN0YXJ0UmVwZWF0aW5nKGNBbmltYXRpb25UaW1lckRl
bGF5KTsKLSAgICB9IGVsc2UgaWYgKG1fYW5pbWF0aW9uVGltZXIuaXNBY3RpdmUoKSkKLSAgICAg
ICAgbV9hbmltYXRpb25UaW1lci5zdG9wKCk7Ci19Ci0KLXZvaWQgQW5pbWF0aW9uQ29udHJvbGxl
clByaXZhdGU6OnVwZGF0ZVJlbmRlcmluZ0Rpc3BhdGNoZXJGaXJlZChUaW1lcjxBbmltYXRpb25D
b250cm9sbGVyUHJpdmF0ZT4qKQotewotICAgIGlmIChtX2ZyYW1lICYmIG1fZnJhbWUtPmRvY3Vt
ZW50KCkpIHsKLSAgICAgICAgbV9mcmFtZS0+ZG9jdW1lbnQoKS0+dXBkYXRlUmVuZGVyaW5nKCk7
Ci0gICAgfQotfQotCi12b2lkIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpzdGFydFVwZGF0
ZVJlbmRlcmluZ0Rpc3BhdGNoZXIoKQotewotICAgIGlmICghbV91cGRhdGVSZW5kZXJpbmdEaXNw
YXRjaGVyLmlzQWN0aXZlKCkpIHsKLSAgICAgICAgbV91cGRhdGVSZW5kZXJpbmdEaXNwYXRjaGVy
LnN0YXJ0T25lU2hvdCgwKTsKLSAgICB9Ci19Ci0KLXZvaWQgQW5pbWF0aW9uQ29udHJvbGxlclBy
aXZhdGU6OmFuaW1hdGlvblRpbWVyRmlyZWQoVGltZXI8QW5pbWF0aW9uQ29udHJvbGxlclByaXZh
dGU+KiB0aW1lcikKLXsKLSAgICAvLyBXaGVuIHRoZSB0aW1lciBmaXJlcywgYWxsIHdlIGRvIGlz
IGNhbGwgc2V0Q2hhbmdlZCBvbiBhbGwgRE9NIG5vZGVzIHdpdGggcnVubmluZyBhbmltYXRpb25z
IGFuZCB0aGVuIGRvIGFuIGltbWVkaWF0ZQotICAgIC8vIHVwZGF0ZVJlbmRlcmluZy4gIEl0IHdp
bGwgdGhlbiBjYWxsIGJhY2sgdG8gdXMgd2l0aCBuZXcgaW5mb3JtYXRpb24uCi0gICAgYm9vbCBh
bmltYXRpbmcgPSBmYWxzZTsKLSAgICBSZW5kZXJPYmplY3RBbmltYXRpb25NYXA6OmNvbnN0X2l0
ZXJhdG9yIGFuaW1hdGlvbnNFbmQgPSBtX2NvbXBvc2l0ZUFuaW1hdGlvbnMuZW5kKCk7Ci0gICAg
Zm9yIChSZW5kZXJPYmplY3RBbmltYXRpb25NYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9jb21w
b3NpdGVBbmltYXRpb25zLmJlZ2luKCk7IAotICAgICAgICAgaXQgIT0gYW5pbWF0aW9uc0VuZDsg
KytpdCkgewotICAgICAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gaXQtPmZpcnN0OwotICAg
ICAgICBDb21wb3NpdGVBbmltYXRpb24qIGNvbXBBbmltID0gaXQtPnNlY29uZDsKLSAgICAgICAg
aWYgKCFjb21wQW5pbS0+c3VzcGVuZGVkKCkgJiYgY29tcEFuaW0tPmFuaW1hdGluZygpKSB7Ci0g
ICAgICAgICAgICBhbmltYXRpbmcgPSB0cnVlOwotICAgICAgICAgICAgY29tcEFuaW0tPnNldEFu
aW1hdGluZyhmYWxzZSk7Ci0gICAgICAgICAgICBzZXRDaGFuZ2VkKHJlbmRlcmVyLT5lbGVtZW50
KCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIG1fZnJhbWUtPmRvY3VtZW50KCktPnVw
ZGF0ZVJlbmRlcmluZygpOwotICAgIAotICAgIHVwZGF0ZUFuaW1hdGlvblRpbWVyKCk7Ci19Ci0K
LWJvb2wgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OmlzQW5pbWF0aW5nUHJvcGVydHlPblJl
bmRlcmVyKFJlbmRlck9iamVjdCogb2JqLCBpbnQgcHJvcGVydHksIGJvb2wgaXNSdW5uaW5nTm93
KSBjb25zdAotewotICAgIENvbXBvc2l0ZUFuaW1hdGlvbiogYW5pbWF0aW9uID0gbV9jb21wb3Np
dGVBbmltYXRpb25zLmdldChvYmopOwotICAgIGlmICghYW5pbWF0aW9uKSByZXR1cm4gZmFsc2U7
Ci0KLSAgICByZXR1cm4gYW5pbWF0aW9uLT5pc0FuaW1hdGluZ1Byb3BlcnR5KHByb3BlcnR5LCBp
c1J1bm5pbmdOb3cpOwotfQotCi12b2lkIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpzdXNw
ZW5kQW5pbWF0aW9ucyhEb2N1bWVudCogZG9jdW1lbnQpCi17Ci0gICAgUmVuZGVyT2JqZWN0QW5p
bWF0aW9uTWFwOjpjb25zdF9pdGVyYXRvciBhbmltYXRpb25zRW5kID0gbV9jb21wb3NpdGVBbmlt
YXRpb25zLmVuZCgpOwotICAgIGZvciAoUmVuZGVyT2JqZWN0QW5pbWF0aW9uTWFwOjpjb25zdF9p
dGVyYXRvciBpdCA9IG1fY29tcG9zaXRlQW5pbWF0aW9ucy5iZWdpbigpOyAKLSAgICAgICAgIGl0
ICE9IGFuaW1hdGlvbnNFbmQ7ICsraXQpIHsKLSAgICAgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJl
ciA9IGl0LT5maXJzdDsKLSAgICAgICAgQ29tcG9zaXRlQW5pbWF0aW9uKiBjb21wQW5pbSA9IGl0
LT5zZWNvbmQ7Ci0gICAgICAgIGlmIChyZW5kZXJlci0+ZG9jdW1lbnQoKSA9PSBkb2N1bWVudCkK
LSAgICAgICAgICAgIGNvbXBBbmltLT5zdXNwZW5kQW5pbWF0aW9ucygpOwotICAgIH0KLSAgICAK
LSAgICB1cGRhdGVBbmltYXRpb25UaW1lcigpOwotfQotCi12b2lkIEFuaW1hdGlvbkNvbnRyb2xs
ZXJQcml2YXRlOjpyZXN1bWVBbmltYXRpb25zKERvY3VtZW50KiBkb2N1bWVudCkKLXsKLSAgICBS
ZW5kZXJPYmplY3RBbmltYXRpb25NYXA6OmNvbnN0X2l0ZXJhdG9yIGFuaW1hdGlvbnNFbmQgPSBt
X2NvbXBvc2l0ZUFuaW1hdGlvbnMuZW5kKCk7Ci0gICAgZm9yIChSZW5kZXJPYmplY3RBbmltYXRp
b25NYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9jb21wb3NpdGVBbmltYXRpb25zLmJlZ2luKCk7
IAotICAgICAgICAgaXQgIT0gYW5pbWF0aW9uc0VuZDsgKytpdCkgewotICAgICAgICBSZW5kZXJP
YmplY3QqIHJlbmRlcmVyID0gaXQtPmZpcnN0OwotICAgICAgICBDb21wb3NpdGVBbmltYXRpb24q
IGNvbXBBbmltID0gaXQtPnNlY29uZDsKLSAgICAgICAgaWYgKHJlbmRlcmVyLT5kb2N1bWVudCgp
ID09IGRvY3VtZW50KQotICAgICAgICAgICAgY29tcEFuaW0tPnJlc3VtZUFuaW1hdGlvbnMoKTsK
LSAgICB9Ci0gICAgCi0gICAgdXBkYXRlQW5pbWF0aW9uVGltZXIoKTsKLX0KLQotdm9pZCBDb21w
b3NpdGVBbmltYXRpb246OnVwZGF0ZVRyYW5zaXRpb25zKFJlbmRlck9iamVjdCogcmVuZGVyZXIs
IGNvbnN0IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUsIFJlbmRlclN0eWxlKiB0YXJnZXRTdHls
ZSkKLXsKLSAgICAvLyBJZiBjdXJyZW50U3R5bGUgaXMgbnVsbCwgd2UgZG9uJ3QgZG8gdHJhbnNp
dGlvbnMKLSAgICBpZiAoIWN1cnJlbnRTdHlsZSB8fCAhdGFyZ2V0U3R5bGUtPnRyYW5zaXRpb25z
KCkpCi0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdl
IG5lZWQgdG8gdXBkYXRlIHRoZSBhY3RpdmUgdHJhbnNpdGlvbnMKLSAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IHRhcmdldFN0eWxlLT50cmFuc2l0aW9ucygpLT5zaXplKCk7ICsraSkgewotICAg
ICAgICBjb25zdCBBbmltYXRpb24qIGFuaW0gPSAoKnRhcmdldFN0eWxlLT50cmFuc2l0aW9ucygp
KVtpXS5nZXQoKTsKLSAgICAgICAgZG91YmxlIGR1cmF0aW9uID0gYW5pbS0+ZHVyYXRpb24oKTsK
LSAgICAgICAgZG91YmxlIGRlbGF5ID0gYW5pbS0+ZGVsYXkoKTsKLQotICAgICAgICAvLyBJZiB0
aGlzIGlzIGFuIGVtcHR5IHRyYW5zaXRpb24sIHNraXAgaXQKLSAgICAgICAgaWYgKGR1cmF0aW9u
ID09IDAgJiYgZGVsYXkgPD0gMCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgCi0g
ICAgICAgIGludCBwcm9wID0gYW5pbS0+cHJvcGVydHkoKTsKLSAgICAgICAgYm9vbCBhbGwgPSBw
cm9wID09IGNBbmltYXRlQWxsOwotICAgICAgICAKLSAgICAgICAgLy8gSGFuZGxlIGJvdGggdGhl
ICdhbGwnIGFuZCBzaW5nbGUgcHJvcGVydHkgY2FzZXMuIEZvciB0aGUgc2luZ2xlIHByb3AgY2Fz
ZSwgd2UgbWFrZSBvbmx5IG9uZSBwYXNzCi0gICAgICAgIC8vIHRocm91Z2ggdGhlIGxvb3AKLSAg
ICAgICAgZm9yIChpbnQgcHJvcGVydHlJbmRleCA9IDA7IDsgKytwcm9wZXJ0eUluZGV4KSB7Ci0g
ICAgICAgICAgICBpZiAoYWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5SW5kZXgg
Pj0gQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OmdldE51bVByb3BlcnRpZXMoKSkKLSAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBuZXh0IHBy
b3AKLSAgICAgICAgICAgICAgICBwcm9wID0gQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6Omdl
dFByb3BlcnR5QXRJbmRleChwcm9wZXJ0eUluZGV4KTsKLSAgICAgICAgICAgIH0KLQotICAgICAg
ICAgICAgLy8gSW1wbGljaXRBbmltYXRpb25zIGFyZSBhbHdheXMgaGFzaGVkIGJ5IGFjdHVhbCBw
cm9wZXJ0aWVzLCBuZXZlciBjQW5pbWF0ZUFsbAotICAgICAgICAgICAgQVNTRVJUKHByb3AgPiBm
aXJzdENTU1Byb3BlcnR5ICYmIHByb3AgPCAoZmlyc3RDU1NQcm9wZXJ0eSArIG51bUNTU1Byb3Bl
cnRpZXMpKTsKLQotICAgICAgICAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGEgY3VycmVudCB0cmFu
c2l0aW9uIGZvciB0aGlzIHByb3AKLSAgICAgICAgICAgIEltcGxpY2l0QW5pbWF0aW9uKiBpbXBs
QW5pbSA9IG1fdHJhbnNpdGlvbnMuZ2V0KHByb3ApOwotICAgICAgICAgICAgYm9vbCBlcXVhbCA9
IHRydWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpbXBsQW5pbSkgewotICAgICAg
ICAgICAgICAgIC8vIFRoZXJlIGlzIG9uZSwgaGFzIG91ciB0YXJnZXQgY2hhbmdlZD8KLSAgICAg
ICAgICAgICAgICBpZiAoIWltcGxBbmltLT5pc1RhcmdldFByb3BlcnR5RXF1YWwocHJvcCwgdGFy
Z2V0U3R5bGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGltcGxBbmltLT5yZXNldChyZW5kZXJl
cik7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpbXBsQW5pbTsKLSAgICAgICAgICAgICAg
ICAgICAgbV90cmFuc2l0aW9ucy5yZW1vdmUocHJvcCk7Ci0gICAgICAgICAgICAgICAgICAgIGVx
dWFsID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAg
ICAgICAgICAgICAgICAvLyBTZWUgaWYgd2UgbmVlZCB0byBzdGFydCBhIG5ldyB0cmFuc2l0aW9u
Ci0gICAgICAgICAgICAgICAgZXF1YWwgPSBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6cHJv
cGVydGllc0VxdWFsKHByb3AsIGN1cnJlbnRTdHlsZSwgdGFyZ2V0U3R5bGUpOwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIWVxdWFsKSB7Ci0gICAgICAgICAg
ICAgICAgLy8gQWRkIHRoZSBuZXcgdHJhbnNpdGlvbgotICAgICAgICAgICAgICAgIEltcGxpY2l0
QW5pbWF0aW9uKiBhbmltYXRpb24gPSBuZXcgSW1wbGljaXRBbmltYXRpb24oY29uc3RfY2FzdDxB
bmltYXRpb24qPihhbmltKSwgcHJvcCwgcmVuZGVyZXIsIHRoaXMpOwotICAgICAgICAgICAgICAg
IG1fdHJhbnNpdGlvbnMuc2V0KHByb3AsIGFuaW1hdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAKLSAgICAgICAgICAgIC8vIFdlIG9ubHkgbmVlZCBvbmUgcGFzcyBmb3IgdGhlIHNp
bmdsZSBwcm9wIGNhc2UKLSAgICAgICAgICAgIGlmICghYWxsKQotICAgICAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6dXBk
YXRlS2V5ZnJhbWVBbmltYXRpb25zKFJlbmRlck9iamVjdCogcmVuZGVyZXIsIGNvbnN0IFJlbmRl
clN0eWxlKiBjdXJyZW50U3R5bGUsIFJlbmRlclN0eWxlKiB0YXJnZXRTdHlsZSkKLXsKLSAgICAv
LyBOb3RoaW5nIHRvIGRvIGlmIHdlIGRvbid0IGhhdmUgYW55IGFuaW1hdGlvbnMsIGFuZCBkaWRu
J3QgaGF2ZSBhbnkgYmVmb3JlCi0gICAgaWYgKG1fa2V5ZnJhbWVBbmltYXRpb25zLmlzRW1wdHko
KSAmJiAhdGFyZ2V0U3R5bGUtPmhhc0FuaW1hdGlvbnMoKSkKLSAgICAgICAgcmV0dXJuOwotICAg
IAotICAgIC8vIE5vdGhpbmcgdG8gZG8gaWYgdGhlIGN1cnJlbnQgYW5kIHRhcmdldCBhbmltYXRp
b25zIGFyZSB0aGUgc2FtZQotICAgIGlmIChjdXJyZW50U3R5bGUgJiYgY3VycmVudFN0eWxlLT5o
YXNBbmltYXRpb25zKCkgJiYgdGFyZ2V0U3R5bGUtPmhhc0FuaW1hdGlvbnMoKSAmJiAqKGN1cnJl
bnRTdHlsZS0+YW5pbWF0aW9ucygpKSA9PSAqKHRhcmdldFN0eWxlLT5hbmltYXRpb25zKCkpKQot
ICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIGludCBudW1BbmltcyA9IDA7Ci0gICAgYm9v
bCBhbmltc0NoYW5nZWQgPSBmYWxzZTsKLSAgICAKLSAgICAvLyBzZWUgaWYgdGhlIGxpc3RzIG1h
dGNoCi0gICAgaWYgKHRhcmdldFN0eWxlLT5hbmltYXRpb25zKCkpIHsKLSAgICAgICAgZm9yIChz
aXplX3QgaSA9IDA7IGkgPCB0YXJnZXRTdHlsZS0+YW5pbWF0aW9ucygpLT5zaXplKCk7ICsraSkg
ewotICAgICAgICAgICAgY29uc3QgQW5pbWF0aW9uKiBhbmltID0gKCp0YXJnZXRTdHlsZS0+YW5p
bWF0aW9ucygpKVtpXS5nZXQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCFhbmlt
LT5pc1ZhbGlkQW5pbWF0aW9uKCkpCi0gICAgICAgICAgICAgICAgYW5pbXNDaGFuZ2VkID0gdHJ1
ZTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIEF0b21pY1N0cmluZyBuYW1l
KGFuaW0tPm5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGtmQW5p
bSA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmdldChuYW1lLmltcGwoKSk7Ci0gICAgICAgICAgICAg
ICAgaWYgKCFrZkFuaW0gfHwgIWtmQW5pbS0+YW5pbWF0aW9uc01hdGNoKGFuaW0pKQotICAgICAg
ICAgICAgICAgICAgICBhbmltc0NoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGVsc2UK
LSAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAg
IC8vIGFuaW1hdGlvbnMgbWF0Y2gsIGJ1dCBwbGF5IHN0YXRlcyBtYXkgZGlmZmVyLiB1cGRhdGUg
aWYgbmVlZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBrZkFuaW0tPnVwZGF0ZVBsYXlTdGF0
ZShhbmltLT5wbGF5U3RhdGUoKSA9PSBBbmltUGxheVN0YXRlUGxheWluZyk7Ci0gICAgICAgICAg
ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgc2F2ZWQg
YW5pbWF0aW9uIHRvIHRoaXMgbmV3IG9uZSwganVzdCBpbiBjYXNlIHRoZSBwbGF5IHN0YXRlIGhh
cyBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgICAgICAgICBrZkFuaW0tPnNldEFuaW1hdGlvbihh
bmltKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAg
KytudW1BbmltczsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoIWFuaW1zQ2hhbmdl
ZCAmJiBtX2tleWZyYW1lQW5pbWF0aW9ucy5zaXplKCkgIT0gbnVtQW5pbXMpCi0gICAgICAgIGFu
aW1zQ2hhbmdlZCA9IHRydWU7Ci0KLSAgICBpZiAoIWFuaW1zQ2hhbmdlZCkKLSAgICAgICAgcmV0
dXJuOwotCi0gICAgLy8gYW5pbWF0aW9ucyBoYXZlIGNoYW5nZWQsIHVwZGF0ZSB0aGUgbGlzdAot
ICAgIHJlc2V0QW5pbWF0aW9ucyhyZW5kZXJlcik7Ci0KLSAgICBpZiAoIXRhcmdldFN0eWxlLT5h
bmltYXRpb25zKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIGFkZCBhbGwgdGhlIG5ldyBh
bmltYXRpb25zCi0gICAgaW50IGluZGV4ID0gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IHRhcmdldFN0eWxlLT5hbmltYXRpb25zKCktPnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0
IEFuaW1hdGlvbiogYW5pbSA9ICgqdGFyZ2V0U3R5bGUtPmFuaW1hdGlvbnMoKSlbaV0uZ2V0KCk7
Ci0KLSAgICAgICAgaWYgKCFhbmltLT5pc1ZhbGlkQW5pbWF0aW9uKCkpCi0gICAgICAgICAgICBj
b250aW51ZTsKLSAgICAgICAgICAgIAotICAgICAgICAvLyBkb24ndCBib3RoZXIgYWRkaW5nIHRo
ZSBhbmltYXRpb24gaWYgaXQgaGFzIG5vIGtleWZyYW1lcyBvciB3b24ndCBhbmltYXRlCi0gICAg
ICAgIGlmICgoYW5pbS0+ZHVyYXRpb24oKSB8fCBhbmltLT5kZWxheSgpKSAmJiBhbmltLT5pdGVy
YXRpb25Db3VudCgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGFuaW0tPmtleWZyYW1lTGlzdCgpLmdldCgpICYmICFhbmltLT5rZXlmcmFtZUxpc3QoKS0+
aXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbioga2ZhbmltID0gbmV3
IEtleWZyYW1lQW5pbWF0aW9uKGNvbnN0X2Nhc3Q8QW5pbWF0aW9uKj4oYW5pbSksIHJlbmRlcmVy
LCBpbmRleCsrLCB0aGlzKTsKLSAgICAgICAgICAgIG1fa2V5ZnJhbWVBbmltYXRpb25zLnNldChr
ZmFuaW0tPm5hbWUoKS5pbXBsKCksIGtmYW5pbSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLUtl
eWZyYW1lQW5pbWF0aW9uKiBDb21wb3NpdGVBbmltYXRpb246OmZpbmRLZXlmcmFtZUFuaW1hdGlv
bihjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUpCi17Ci0gICAgcmV0dXJuIG1fa2V5ZnJhbWVBbmlt
YXRpb25zLmdldChuYW1lLmltcGwoKSk7Ci19Ci0KLVJlbmRlclN0eWxlKiBDb21wb3NpdGVBbmlt
YXRpb246OmFuaW1hdGUoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5bGUq
IGN1cnJlbnRTdHlsZSwgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlKQotewotICAgIFJlbmRlclN0
eWxlKiByZXN1bHRTdHlsZSA9IDA7Ci0gICAgCi0gICAgLy8gV2UgZG9uJ3QgZG8gYW55IHRyYW5z
aXRpb25zIGlmIHdlIGRvbid0IGhhdmUgYSBjdXJyZW50U3R5bGUgKG9uIHN0YXJ0dXApCi0gICAg
dXBkYXRlVHJhbnNpdGlvbnMocmVuZGVyZXIsIGN1cnJlbnRTdHlsZSwgdGFyZ2V0U3R5bGUpOwot
ICAgIAotICAgIGlmIChjdXJyZW50U3R5bGUpIHsKLSAgICAgICAgLy8gTm93IHRoYXQgd2UgaGF2
ZSB0cmFuc2l0aW9uIG9iamVjdHMgcmVhZHksIGxldCB0aGVtIGtub3cgYWJvdXQgdGhlIG5ldyBn
b2FsIHN0YXRlLiAgV2Ugd2FudCB0aGVtCi0gICAgICAgIC8vIHRvIGZpbGwgaW4gYSBSZW5kZXJT
dHlsZSomIG9ubHkgaWYgbmVlZGVkLgotICAgICAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFw
Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3RyYW5zaXRpb25zLmVuZCgpOwotICAgICAgICBmb3Ig
KENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0
aW9ucy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgICAgIEltcGxpY2l0QW5p
bWF0aW9uKiAgYW5pbSA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgICAgICBpZiAoYW5pbSkgewotICAg
ICAgICAgICAgICAgIGFuaW0tPmFuaW1hdGUodGhpcywgcmVuZGVyZXIsIGN1cnJlbnRTdHlsZSwg
dGFyZ2V0U3R5bGUsIHJlc3VsdFN0eWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAg
IH0KLQotICAgIHVwZGF0ZUtleWZyYW1lQW5pbWF0aW9ucyhyZW5kZXJlciwgY3VycmVudFN0eWxl
LCB0YXJnZXRTdHlsZSk7Ci0KLSAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGFuaW1hdGlvbiBvYmpl
Y3RzIHJlYWR5LCBsZXQgdGhlbSBrbm93IGFib3V0IHRoZSBuZXcgZ29hbCBzdGF0ZS4gIFdlIHdh
bnQgdGhlbQotICAgIC8vIHRvIGZpbGwgaW4gYSBSZW5kZXJTdHlsZSomIG9ubHkgaWYgbmVlZGVk
LgotICAgIGlmICh0YXJnZXRTdHlsZS0+aGFzQW5pbWF0aW9ucygpKSB7Ci0gICAgICAgIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgdGFyZ2V0U3R5bGUtPmFuaW1hdGlvbnMoKS0+c2l6ZSgpOyArK2kp
IHsKLSAgICAgICAgICAgIGNvbnN0IEFuaW1hdGlvbiogYW5pbSA9ICgqdGFyZ2V0U3R5bGUtPmFu
aW1hdGlvbnMoKSlbaV0uZ2V0KCk7Ci0KLSAgICAgICAgICAgIGlmIChhbmltLT5pc1ZhbGlkQW5p
bWF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBBdG9taWNTdHJpbmcgbmFtZShhbmltLT5uYW1l
KCkpOwotICAgICAgICAgICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBrZXlmcmFtZUFuaW0gPSBt
X2tleWZyYW1lQW5pbWF0aW9ucy5nZXQobmFtZS5pbXBsKCkpOwotICAgICAgICAgICAgICAgIGlm
IChrZXlmcmFtZUFuaW0pCi0gICAgICAgICAgICAgICAgICAgIGtleWZyYW1lQW5pbS0+YW5pbWF0
ZSh0aGlzLCByZW5kZXJlciwgY3VycmVudFN0eWxlLCB0YXJnZXRTdHlsZSwgcmVzdWx0U3R5bGUp
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIGNsZWFudXBGaW5p
c2hlZEFuaW1hdGlvbnMocmVuZGVyZXIpOwotCi0gICAgcmV0dXJuIHJlc3VsdFN0eWxlID8gcmVz
dWx0U3R5bGUgOiB0YXJnZXRTdHlsZTsKLX0KLQotLy8gImFuaW1hdGluZyIgbWVhbnMgdGhhdCBz
b21ldGhpbmcgaXMgcnVubmluZyB0aGF0IHJlcXVpcmVzIHRoZSB0aW1lciB0byBrZWVwIGZpcmlu
ZwotLy8gKGUuZy4gYSB0cmFuc2l0aW9uKQotdm9pZCBDb21wb3NpdGVBbmltYXRpb246OnNldEFu
aW1hdGluZyhib29sIGluQW5pbWF0aW5nKQotewotICAgIENTU1Byb3BlcnR5VHJhbnNpdGlvbnNN
YXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7Ci0gICAgZm9yIChD
U1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fdHJhbnNpdGlv
bnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIEltcGxpY2l0QW5pbWF0aW9u
KiAgdHJhbnNpdGlvbiA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIHRyYW5zaXRpb24tPnNldEFuaW1h
dGluZyhpbkFuaW1hdGluZyk7Ci0gICAgfQotCi0gICAgQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3Rf
aXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5lbmQoKTsKLSAgICBmb3IgKEFu
aW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMu
YmVnaW4oKTsgaXQgIT0ga2ZlbmQ7ICsraXQpIHsKLSAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24q
IGFuaW0gPSBpdC0+c2Vjb25kOwotICAgICAgICBhbmltLT5zZXRBbmltYXRpbmcoaW5BbmltYXRp
bmcpOwotICAgIH0KLX0KLQotYm9vbCBDb21wb3NpdGVBbmltYXRpb246OmFuaW1hdGluZygpCi17
Ci0gICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV90
cmFuc2l0aW9ucy5lbmQoKTsKLSAgICBmb3IgKENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNv
bnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQp
IHsKLSAgICAgICAgSW1wbGljaXRBbmltYXRpb24qICB0cmFuc2l0aW9uID0gaXQtPnNlY29uZDsK
LSAgICAgICAgaWYgKHRyYW5zaXRpb24gJiYgdHJhbnNpdGlvbi0+YW5pbWF0aW5nKCkgJiYgdHJh
bnNpdGlvbi0+cnVubmluZygpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAg
IAotICAgIEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlmcmFt
ZUFuaW1hdGlvbnMuZW5kKCk7Ci0gICAgZm9yIChBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVy
YXRvciBpdCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IGtmZW5kOyArK2l0
KSB7Ci0gICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKLSAgICAg
ICAgaWYgKGFuaW0gJiYgIWFuaW0tPnBhdXNlZCgpICYmIGFuaW0tPmFuaW1hdGluZygpICYmIGFu
aW0tPmFjdGl2ZSgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcmV0
dXJuIGZhbHNlOwotfQotCi12b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6cmVzZXRUcmFuc2l0aW9u
cyhSZW5kZXJPYmplY3QqIHJlbmRlcmVyKQotewotICAgIENTU1Byb3BlcnR5VHJhbnNpdGlvbnNN
YXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7Ci0gICAgZm9yIChD
U1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fdHJhbnNpdGlv
bnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIEltcGxpY2l0QW5pbWF0aW9u
KiAgdHJhbnNpdGlvbiA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIHRyYW5zaXRpb24tPnJlc2V0KHJl
bmRlcmVyKTsKLSAgICAgICAgZGVsZXRlIHRyYW5zaXRpb247Ci0gICAgfQotICAgIG1fdHJhbnNp
dGlvbnMuY2xlYXIoKTsKLX0KLQotdm9pZCBDb21wb3NpdGVBbmltYXRpb246OnJlc2V0QW5pbWF0
aW9ucyhSZW5kZXJPYmplY3QqIHJlbmRlcmVyKQotewotICAgIGRlbGV0ZUFsbFZhbHVlcyhtX2tl
eWZyYW1lQW5pbWF0aW9ucyk7Ci0gICAgbV9rZXlmcmFtZUFuaW1hdGlvbnMuY2xlYXIoKTsKLX0K
LQotdm9pZCBDb21wb3NpdGVBbmltYXRpb246OmNsZWFudXBGaW5pc2hlZEFuaW1hdGlvbnMoUmVu
ZGVyT2JqZWN0KiByZW5kZXJlcikKLXsKLSAgICBpZiAoc3VzcGVuZGVkKCkpCi0gICAgICAgIHJl
dHVybjsKLSAgICAKLSAgICAvLyBNYWtlIGEgbGlzdCBvZiB0cmFuc2l0aW9ucyB0byBiZSBkZWxl
dGVkCi0gICAgVmVjdG9yPGludD4gZmluaXNoZWRUcmFuc2l0aW9uczsKLSAgICBDU1NQcm9wZXJ0
eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3RyYW5zaXRpb25zLmVuZCgp
OwotCi0gICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBp
dCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIElt
cGxpY2l0QW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKLSAgICAgICAgaWYgKCFhbmltKQot
ICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChhbmltLT5wb3N0YWN0aXZlKCkgJiYg
IWFuaW0tPndhaXRpbmdGb3JFbmRFdmVudCgpKQotICAgICAgICAgICAgZmluaXNoZWRUcmFuc2l0
aW9ucy5hcHBlbmQoYW5pbS0+YW5pbWF0aW5nUHJvcGVydHkoKSk7Ci0gICAgfQotICAgIAotICAg
IC8vIERlbGV0ZSB0aGVtCi0gICAgZm9yIChWZWN0b3I8aW50Pjo6aXRlcmF0b3IgaXQgPSBmaW5p
c2hlZFRyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9IGZpbmlzaGVkVHJhbnNpdGlvbnMuZW5kKCk7
ICsraXQpIHsKLSAgICAgICAgSW1wbGljaXRBbmltYXRpb24qIGFuaW0gPSBtX3RyYW5zaXRpb25z
LmdldCgqaXQpOwotICAgICAgICBpZiAoYW5pbSkgewotICAgICAgICAgICAgYW5pbS0+cmVzZXQo
cmVuZGVyZXIpOwotICAgICAgICAgICAgZGVsZXRlIGFuaW07Ci0gICAgICAgIH0KLSAgICAgICAg
bV90cmFuc2l0aW9ucy5yZW1vdmUoKml0KTsKLSAgICB9Ci0KLSAgICAvLyBNYWtlIGEgbGlzdCBv
ZiBhbmltYXRpb25zIHRvIGJlIGRlbGV0ZWQKLSAgICBWZWN0b3I8QXRvbWljU3RyaW5nSW1wbCo+
IGZpbmlzaGVkQW5pbWF0aW9uczsKLSAgICBBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRv
ciBrZmVuZCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmVuZCgpOwotCi0gICAgZm9yIChBbmltYXRp
b25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmJlZ2lu
KCk7IGl0ICE9IGtmZW5kOyArK2l0KSB7Ci0gICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBhbmlt
ID0gaXQtPnNlY29uZDsKLSAgICAgICAgaWYgKCFhbmltKQotICAgICAgICAgICAgY29udGludWU7
Ci0gICAgICAgIGlmIChhbmltLT5wb3N0YWN0aXZlKCkgJiYgIWFuaW0tPndhaXRpbmdGb3JFbmRF
dmVudCgpKQotICAgICAgICAgICAgZmluaXNoZWRBbmltYXRpb25zLmFwcGVuZChhbmltLT5uYW1l
KCkuaW1wbCgpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gZGVsZXRlIHRoZW0KLSAgICBmb3IgKFZl
Y3RvcjxBdG9taWNTdHJpbmdJbXBsKj46Oml0ZXJhdG9yIGl0ID0gZmluaXNoZWRBbmltYXRpb25z
LmJlZ2luKCk7IGl0ICE9IGZpbmlzaGVkQW5pbWF0aW9ucy5lbmQoKTsgKytpdCkgewotICAgICAg
ICBLZXlmcmFtZUFuaW1hdGlvbioga2ZhbmltID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuZ2V0KCpp
dCk7Ci0gICAgICAgIGlmIChrZmFuaW0pIHsKLSAgICAgICAgICAgIGtmYW5pbS0+cmVzZXQocmVu
ZGVyZXIpOwotICAgICAgICAgICAgZGVsZXRlIGtmYW5pbTsKLSAgICAgICAgfQotICAgICAgICBt
X2tleWZyYW1lQW5pbWF0aW9ucy5yZW1vdmUoKml0KTsKLSAgICB9Ci19Ci0KLXZvaWQgQ29tcG9z
aXRlQW5pbWF0aW9uOjpzZXRBbmltYXRpb25TdGFydFRpbWUoZG91YmxlIHQpCi17Ci0gICAgLy8g
c2V0IHN0YXJ0IHRpbWUgb24gYWxsIGFuaW1hdGlvbnMgd2FpdGluZyBmb3IgaXQKLSAgICBBbmlt
YXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBrZmVuZCA9IG1fa2V5ZnJhbWVBbmltYXRpb25z
LmVuZCgpOwotICAgIGZvciAoQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBt
X2tleWZyYW1lQW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBrZmVuZDsgKytpdCkgewotICAgICAg
ICBLZXlmcmFtZUFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIGlmIChhbmlt
ICYmIGFuaW0tPndhaXRpbmdGb3JTdGFydFRpbWUoKSkKLSAgICAgICAgICAgIGFuaW0tPnVwZGF0
ZVN0YXRlTWFjaGluZShBbmltYXRpb25CYXNlOjpTVEFURV9JTlBVVF9TVEFSVF9USU1FX1NFVCwg
dCk7Ci0gICAgfQotfQotCi12b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6c2V0VHJhbnNpdGlvblN0
YXJ0VGltZShpbnQgcHJvcGVydHksIGRvdWJsZSB0KQotewotICAgIC8vIFNldCB0aGUgc3RhcnQg
dGltZSBmb3IgZ2l2ZW4gcHJvcGVydHkgdHJhbnNpdGlvbgotICAgIENTU1Byb3BlcnR5VHJhbnNp
dGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7Ci0gICAg
Zm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fdHJh
bnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIEltcGxpY2l0QW5p
bWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKLSAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+d2Fp
dGluZ0ZvclN0YXJ0VGltZSgpICYmIGFuaW0tPmFuaW1hdGluZ1Byb3BlcnR5KCkgPT0gcHJvcGVy
dHkpCi0gICAgICAgICAgICBhbmltLT51cGRhdGVTdGF0ZU1hY2hpbmUoQW5pbWF0aW9uQmFzZTo6
U1RBVEVfSU5QVVRfU1RBUlRfVElNRV9TRVQsIHQpOwotICAgIH0KLX0KLQotdm9pZCBDb21wb3Np
dGVBbmltYXRpb246OnN1c3BlbmRBbmltYXRpb25zKCkKLXsKLSAgICBpZiAobV9zdXNwZW5kZWQp
Ci0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBtX3N1c3BlbmRlZCA9IHRydWU7Ci0KLSAgICBB
bmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBrZmVuZCA9IG1fa2V5ZnJhbWVBbmltYXRp
b25zLmVuZCgpOwotICAgIGZvciAoQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQg
PSBtX2tleWZyYW1lQW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBrZmVuZDsgKytpdCkgewotICAg
ICAgICBLZXlmcmFtZUFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIGlmIChh
bmltKQotICAgICAgICAgICAgYW5pbS0+dXBkYXRlUGxheVN0YXRlKGZhbHNlKTsKLSAgICB9Ci0K
LSAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3Ry
YW5zaXRpb25zLmVuZCgpOwotICAgIGZvciAoQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29u
c3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkg
ewotICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7Ci0gICAgICAg
IGlmIChhbmltICYmIGFuaW0tPmhhc1N0eWxlKCkpCi0gICAgICAgICAgICBhbmltLT51cGRhdGVQ
bGF5U3RhdGUoZmFsc2UpOwotICAgIH0KLX0KLQotdm9pZCBDb21wb3NpdGVBbmltYXRpb246OnJl
c3VtZUFuaW1hdGlvbnMoKQotewotICAgIGlmICghbV9zdXNwZW5kZWQpCi0gICAgICAgIHJldHVy
bjsKLSAgICAKLSAgICBtX3N1c3BlbmRlZCA9IGZhbHNlOwotICAgIAotICAgIEFuaW1hdGlvbk5h
bWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuZW5kKCk7
Ci0gICAgZm9yIChBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJh
bWVBbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IGtmZW5kOyArK2l0KSB7Ci0gICAgICAgIEtleWZy
YW1lQW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKLSAgICAgICAgaWYgKGFuaW0gJiYgYW5p
bS0+cGxheVN0YXRlUGxheWluZygpKQotICAgICAgICAgICAgYW5pbS0+dXBkYXRlUGxheVN0YXRl
KHRydWUpOwotICAgIH0KLSAgICAKLSAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25z
dF9pdGVyYXRvciBlbmQgPSBtX3RyYW5zaXRpb25zLmVuZCgpOwotICAgIGZvciAoQ1NTUHJvcGVy
dHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2lu
KCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogYW5pbSA9
IGl0LT5zZWNvbmQ7Ci0gICAgICAgIGlmIChhbmltICYmIGFuaW0tPmhhc1N0eWxlKCkpCi0gICAg
ICAgICAgICBhbmltLT51cGRhdGVQbGF5U3RhdGUodHJ1ZSk7Ci0gICAgfQotfQotCi12b2lkIENv
bXBvc2l0ZUFuaW1hdGlvbjo6b3ZlcnJpZGVJbXBsaWNpdEFuaW1hdGlvbnMoaW50IHByb3BlcnR5
KQotewotICAgIENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9
IG1fdHJhbnNpdGlvbnMuZW5kKCk7Ci0gICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFw
Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyAr
K2l0KSB7Ci0gICAgICAgIEltcGxpY2l0QW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKLSAg
ICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+YW5pbWF0aW5nUHJvcGVydHkoKSA9PSBwcm9wZXJ0eSkK
LSAgICAgICAgICAgIGFuaW0tPnNldE92ZXJyaWRkZW4odHJ1ZSk7Ci0gICAgfQotfQotCi12b2lk
IENvbXBvc2l0ZUFuaW1hdGlvbjo6cmVzdW1lT3ZlcnJpZGRlbkltcGxpY2l0QW5pbWF0aW9ucyhp
bnQgcHJvcGVydHkpCi17Ci0gICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRl
cmF0b3IgZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKLSAgICBmb3IgKENTU1Byb3BlcnR5VHJh
bnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5iZWdpbigpOyBp
dCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgSW1wbGljaXRBbmltYXRpb24qIGFuaW0gPSBpdC0+
c2Vjb25kOwotICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT5hbmltYXRpbmdQcm9wZXJ0eSgpID09
IHByb3BlcnR5KQotICAgICAgICAgICAgYW5pbS0+c2V0T3ZlcnJpZGRlbihmYWxzZSk7Ci0gICAg
fQotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgY29tcGFyZUFuaW1hdGlvbkluZGljZXMoY29uc3Qg
S2V5ZnJhbWVBbmltYXRpb24qIGEsIGNvbnN0IEtleWZyYW1lQW5pbWF0aW9uKiBiKQotewotICAg
IHJldHVybiBhLT5pbmRleCgpIDwgYi0+aW5kZXgoKTsKLX0KLQotdm9pZCBDb21wb3NpdGVBbmlt
YXRpb246OnN0eWxlQXZhaWxhYmxlKCkKLXsKLSAgICBpZiAobV9udW1TdHlsZUF2YWlsYWJsZVdh
aXRlcnMgPT0gMCkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIC8vIFdlIGhhdmUgdG8gZ28g
dGhyb3VnaCBhbmltYXRpb25zIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbgot
ICAgIC8vIHRoZSBzdHlsZSwgYmVjYXVzZSBvcmRlciBtYXR0ZXJzIGZvciBhZGRpdGl2aXR5Lgot
ICAgIFZlY3RvcjxLZXlmcmFtZUFuaW1hdGlvbio+IGFuaW1hdGlvbnMobV9rZXlmcmFtZUFuaW1h
dGlvbnMuc2l6ZSgpKTsKLSAgICBBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBrZmVu
ZCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmVuZCgpOwotICAgIHNpemVfdCBpID0gMDsKLSAgICBm
b3IgKEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZUFuaW1h
dGlvbnMuYmVnaW4oKTsgaXQgIT0ga2ZlbmQ7ICsraXQpIHsKLSAgICAgICAgS2V5ZnJhbWVBbmlt
YXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOwotICAgICAgICAvLyBXZSBjYW4ndCBqdXN0IGluc2Vy
dCBiYXNlZCBvbiBhbmltLT5pbmRleCgpIGJlY2F1c2UgaW52YWxpZCBhbmltYXRpb25zIGRvbid0
Ci0gICAgICAgIC8vIG1ha2UgaXQgaW50byB0aGUgaGFzaC4KLSAgICAgICAgYW5pbWF0aW9uc1tp
KytdID0gYW5pbTsKLSAgICB9Ci0KLSAgICBpZiAoYW5pbWF0aW9ucy5zaXplKCkgPiAxKQotICAg
ICAgICBzdGQ6OnN0YWJsZV9zb3J0KGFuaW1hdGlvbnMuYmVnaW4oKSwgYW5pbWF0aW9ucy5lbmQo
KSwgY29tcGFyZUFuaW1hdGlvbkluZGljZXMpOwotICAgIAotICAgIGZvciAoaSA9IDA7IGkgPCBh
bmltYXRpb25zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBhbmlt
ID0gYW5pbWF0aW9uc1tpXTsKLSAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+d2FpdGluZ0ZvclN0
eWxlQXZhaWxhYmxlKCkpCi0gICAgICAgICAgICBhbmltLT51cGRhdGVTdGF0ZU1hY2hpbmUoQW5p
bWF0aW9uQmFzZTo6U1RBVEVfSU5QVVRfU1RZTEVfQVZBSUxBQkxFLCAtMSk7Ci0gICAgfQotICAg
IAotICAgIENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1f
dHJhbnNpdGlvbnMuZW5kKCk7Ci0gICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpj
b25zdF9pdGVyYXRvciBpdCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0
KSB7Ci0gICAgICAgIEltcGxpY2l0QW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKLSAgICAg
ICAgaWYgKGFuaW0gJiYgYW5pbS0+d2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKCkpCi0gICAgICAg
ICAgICBhbmltLT51cGRhdGVTdGF0ZU1hY2hpbmUoQW5pbWF0aW9uQmFzZTo6U1RBVEVfSU5QVVRf
U1RZTEVfQVZBSUxBQkxFLCAtMSk7Ci0gICAgfQotfQotCi1ib29sIENvbXBvc2l0ZUFuaW1hdGlv
bjo6aXNBbmltYXRpbmdQcm9wZXJ0eShpbnQgcHJvcGVydHksIGJvb2wgaXNSdW5uaW5nTm93KSBj
b25zdAotewotICAgIEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0gbV9r
ZXlmcmFtZUFuaW1hdGlvbnMuZW5kKCk7Ci0gICAgZm9yIChBbmltYXRpb25OYW1lTWFwOjpjb25z
dF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IGtmZW5k
OyArK2l0KSB7Ci0gICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsK
LSAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+aXNBbmltYXRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwg
aXNSdW5uaW5nTm93KSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAg
ICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3RyYW5z
aXRpb25zLmVuZCgpOwotICAgIGZvciAoQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3Rf
aXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewot
ICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIGlm
IChhbmltICYmIGFuaW0tPmlzQW5pbWF0aW5nUHJvcGVydHkocHJvcGVydHksIGlzUnVubmluZ05v
dykpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwot
fQotCi12b2lkIEltcGxpY2l0QW5pbWF0aW9uOjphbmltYXRlKENvbXBvc2l0ZUFuaW1hdGlvbiog
YW5pbWF0aW9uLCBSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBjb25zdCBSZW5kZXJTdHlsZSogY3Vy
cmVudFN0eWxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVuZGVy
U3R5bGUqIHRhcmdldFN0eWxlLCBSZW5kZXJTdHlsZSomIGFuaW1hdGVkU3R5bGUpCi17Ci0gICAg
aWYgKHBhdXNlZCgpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgLy8gSWYgd2UgZ2V0IHRo
aXMgZmFyIGFuZCB0aGUgYW5pbWF0aW9uIGlzIGRvbmUsIGl0IG1lYW5zIHdlIGFyZSBjbGVhbmlu
ZyB1cCBhIGp1c3QgZmluaXNoZWQgYW5pbWF0aW9uLgotICAgIC8vIFNvIGp1c3QgcmV0dXJuLiBF
dmVyeXRoaW5nIGlzIGFscmVhZHkgYWxsIGNsZWFuZWQgdXAKLSAgICBpZiAocG9zdGFjdGl2ZSgp
KQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBSZXNldCB0byBzdGFydCB0aGUgdHJhbnNpdGlv
biBpZiB3ZSBhcmUgbmV3Ci0gICAgaWYgKGlzbmV3KCkpCi0gICAgICAgIHJlc2V0KHJlbmRlcmVy
LCBjdXJyZW50U3R5bGUsIHRhcmdldFN0eWxlKTsKLSAgICAKLSAgICAvLyBSdW4gYSBjeWNsZSBv
ZiBhbmltYXRpb24uCi0gICAgLy8gV2Uga25vdyB3ZSB3aWxsIG5lZWQgYSBuZXcgcmVuZGVyIHN0
eWxlLCBzbyBtYWtlIG9uZSBpZiBuZWVkZWQKLSAgICBpZiAoIWFuaW1hdGVkU3R5bGUpCi0gICAg
ICAgIGFuaW1hdGVkU3R5bGUgPSBuZXcgKHJlbmRlcmVyLT5yZW5kZXJBcmVuYSgpKSBSZW5kZXJT
dHlsZSgqdGFyZ2V0U3R5bGUpOwotICAgIAotICAgIGRvdWJsZSBwcm9nID0gcHJvZ3Jlc3MoMSwg
MCk7Ci0gICAgYm9vbCBuZWVkc0FuaW0gPSBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6Ymxl
bmRQcm9wZXJ0aWVzKG1fYW5pbWF0aW5nUHJvcGVydHksIGFuaW1hdGVkU3R5bGUsIG1fZnJvbVN0
eWxlLCBtX3RvU3R5bGUsIHByb2cpOwotICAgIGlmIChuZWVkc0FuaW0pCi0gICAgICAgIHNldEFu
aW1hdGluZygpOwotfQotCi12b2lkIEltcGxpY2l0QW5pbWF0aW9uOjpvbkFuaW1hdGlvbkVuZChk
b3VibGUgaW5FbGFwc2VkVGltZSkKLXsKLSAgICBpZiAoIXNlbmRUcmFuc2l0aW9uRXZlbnQoRXZl
bnROYW1lczo6d2Via2l0VHJhbnNpdGlvbkVuZEV2ZW50LCBpbkVsYXBzZWRUaW1lKSkgewotICAg
ICAgICAvLyBXZSBkaWRuJ3QgZGlzcGF0Y2ggYW4gZXZlbnQsIHdoaWNoIHdvdWxkIGNhbGwgZW5k
QW5pbWF0aW9uKCksIHNvIHdlJ2xsIGp1c3QgY2FsbCBpdCBoZXJlLgotICAgICAgICBlbmRBbmlt
YXRpb24odHJ1ZSk7Ci0gICAgfQotfQotCi1ib29sIEltcGxpY2l0QW5pbWF0aW9uOjpzZW5kVHJh
bnNpdGlvbkV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyYgaW5FdmVudFR5cGUsIGRvdWJsZSBpbkVs
YXBzZWRUaW1lKQotewotICAgIGlmIChpbkV2ZW50VHlwZSA9PSBFdmVudE5hbWVzOjp3ZWJraXRU
cmFuc2l0aW9uRW5kRXZlbnQpIHsKLSAgICAgICAgRG9jdW1lbnQ6Okxpc3RlbmVyVHlwZSBsaXN0
ZW5lclR5cGUgPSBEb2N1bWVudDo6VFJBTlNJVElPTkVORF9MSVNURU5FUjsKLSAgICAgICAgCi0g
ICAgICAgIGlmIChzaG91bGRTZW5kRXZlbnRGb3JMaXN0ZW5lcihsaXN0ZW5lclR5cGUpKSB7Ci0g
ICAgICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gZWxlbWVudEZvckV2ZW50RGlzcGF0Y2goKTsK
LSAgICAgICAgICAgIGlmIChlbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHByb3Bl
cnR5TmFtZTsKLSAgICAgICAgICAgICAgICBpZiAobV90cmFuc2l0aW9uUHJvcGVydHkgIT0gY0Fu
aW1hdGVBbGwpCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IFN0cmluZyhnZXRQ
cm9wZXJ0eU5hbWUoKENTU1Byb3BlcnR5SUQpbV90cmFuc2l0aW9uUHJvcGVydHkpKTsKLSAgICAg
ICAgICAgICAgICBtX3dhaXRpbmdGb3JFbmRFdmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAg
bV9hbmltYXRpb25FdmVudERpc3BhdGNoZXIuc3RhcnRUaW1lcihlbGVtZW50LCBwcm9wZXJ0eU5h
bWUsIG1fdHJhbnNpdGlvblByb3BlcnR5LCB0cnVlLCBpbkV2ZW50VHlwZSwgaW5FbGFwc2VkVGlt
ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIERpZCBkaXNwYXRjaCBhbiBldmVu
dAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBmYWxz
ZTsgLy8gRGlkbid0IGRpc3BhdGNoIGFuIGV2ZW50Ci19Ci0KLXZvaWQgSW1wbGljaXRBbmltYXRp
b246OnJlc2V0KFJlbmRlck9iamVjdCogcmVuZGVyZXIsIGNvbnN0IFJlbmRlclN0eWxlKiBmcm9t
IC8qID0gMCAqLywgY29uc3QgUmVuZGVyU3R5bGUqIHRvIC8qID0gMCAqLykKLXsKLSAgICBBU1NF
UlQoKCFtX3RvU3R5bGUgJiYgIXRvKSB8fCBtX3RvU3R5bGUgIT0gdG8pOwotICAgIEFTU0VSVCgo
IW1fZnJvbVN0eWxlICYmICFmcm9tKSB8fCBtX2Zyb21TdHlsZSAhPSBmcm9tKTsKLSAgICBpZiAo
bV9mcm9tU3R5bGUpCi0gICAgICAgIG1fZnJvbVN0eWxlLT5kZXJlZihyZW5kZXJlci0+cmVuZGVy
QXJlbmEoKSk7Ci0gICAgaWYgKG1fdG9TdHlsZSkKLSAgICAgICAgbV90b1N0eWxlLT5kZXJlZihy
ZW5kZXJlci0+cmVuZGVyQXJlbmEoKSk7Ci0gICAgCi0gICAgbV9mcm9tU3R5bGUgPSBjb25zdF9j
YXN0PFJlbmRlclN0eWxlKj4oZnJvbSk7ICAgLy8gaXQgaXMgcmVhZC1vbmx5LCBvdGhlciB0aGFu
IHRoZSByZWYKLSAgICBpZiAobV9mcm9tU3R5bGUpCi0gICAgICAgIG1fZnJvbVN0eWxlLT5yZWYo
KTsKLSAgICAKLSAgICBtX3RvU3R5bGUgPSBjb25zdF9jYXN0PFJlbmRlclN0eWxlKj4odG8pOyAg
ICAgICAvLyBpdCBpcyByZWFkLW9ubHksIG90aGVyIHRoYW4gdGhlIHJlZgotICAgIGlmIChtX3Rv
U3R5bGUpCi0gICAgICAgIG1fdG9TdHlsZS0+cmVmKCk7Ci0gICAgCi0gICAgLy8gcmVzdGFydCB0
aGUgdHJhbnNpdGlvbgotICAgIGlmIChmcm9tICYmIHRvKQotICAgICAgICB1cGRhdGVTdGF0ZU1h
Y2hpbmUoU1RBVEVfSU5QVVRfUkVTVEFSVF9BTklNQVRJT04sIC0xKTsKLX0KLQotdm9pZCBJbXBs
aWNpdEFuaW1hdGlvbjo6c2V0T3ZlcnJpZGRlbihib29sIGIpCi17Ci0gICAgaWYgKGIgIT0gbV9v
dmVycmlkZGVuKSB7Ci0gICAgICAgIG1fb3ZlcnJpZGRlbiA9IGI7Ci0gICAgICAgIHVwZGF0ZVN0
YXRlTWFjaGluZShtX292ZXJyaWRkZW4gPyBTVEFURV9JTlBVVF9QQVVTRV9PVkVSUklERSA6IFNU
QVRFX0lOUFVUX1JFU1VNRV9PVkVSUklERSwgLTEpOwotICAgIH0KLX0KLQotYm9vbCBJbXBsaWNp
dEFuaW1hdGlvbjo6YWZmZWN0c1Byb3BlcnR5KGludCBwcm9wZXJ0eSkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gKG1fYW5pbWF0aW5nUHJvcGVydHkgPT0gcHJvcGVydHkpOwotfQotCi1ib29sIEltcGxp
Y2l0QW5pbWF0aW9uOjppc1RhcmdldFByb3BlcnR5RXF1YWwoaW50IHByb3AsIGNvbnN0IFJlbmRl
clN0eWxlKiB0YXJnZXRTdHlsZSkKLXsKLSAgICByZXR1cm4gQW5pbWF0aW9uQ29udHJvbGxlclBy
aXZhdGU6OnByb3BlcnRpZXNFcXVhbChwcm9wLCBtX3RvU3R5bGUsIHRhcmdldFN0eWxlKTsKLX0K
LQotdm9pZCBJbXBsaWNpdEFuaW1hdGlvbjo6YmxlbmRQcm9wZXJ0eVZhbHVlSW5TdHlsZShpbnQg
cHJvcCwgUmVuZGVyU3R5bGUqIGN1cnJlbnRTdHlsZSkKLXsKLSAgICBkb3VibGUgcHJvZyA9IHBy
b2dyZXNzKDEsIDApOwotICAgIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpibGVuZFByb3Bl
cnRpZXMocHJvcCwgY3VycmVudFN0eWxlLCBtX2Zyb21TdHlsZSwgbV90b1N0eWxlLCBwcm9nKTsK
LX0gICAgCi0KLXZvaWQgS2V5ZnJhbWVBbmltYXRpb246OmFuaW1hdGUoQ29tcG9zaXRlQW5pbWF0
aW9uKiBhbmltYXRpb24sIFJlbmRlck9iamVjdCogcmVuZGVyZXIsIGNvbnN0IFJlbmRlclN0eWxl
KiBjdXJyZW50U3R5bGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29u
c3QgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlLCBSZW5kZXJTdHlsZSomIGFuaW1hdGVkU3R5bGUp
Ci17Ci0gICAgLy8gaWYgd2UgaGF2ZSBub3QgeWV0IHN0YXJ0ZWQsIHdlIHdpbGwgbm90IGhhdmUg
YSB2YWxpZCBzdGFydCB0aW1lLCBzbyBqdXN0IHN0YXJ0IHRoZSBhbmltYXRpb24gaWYgbmVlZGVk
Ci0gICAgaWYgKGlzbmV3KCkgJiYgbV9hbmltYXRpb24tPnBsYXlTdGF0ZSgpID09IEFuaW1QbGF5
U3RhdGVQbGF5aW5nKQotICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUoU1RBVEVfSU5QVVRfU1RB
UlRfQU5JTUFUSU9OLCAtMSk7Ci0gICAgCi0gICAgLy8gSWYgd2UgZ2V0IHRoaXMgZmFyIGFuZCB0
aGUgYW5pbWF0aW9uIGlzIGRvbmUsIGl0IG1lYW5zIHdlIGFyZSBjbGVhbmluZyB1cCBhIGp1c3Qg
ZmluaXNoZWQgYW5pbWF0aW9uLgotICAgIC8vIElmIHNvLCB3ZSBuZWVkIHRvIHNlbmQgYmFjayB0
aGUgdGFyZ2V0U3R5bGUKLSAgICBpZiAocG9zdGFjdGl2ZSgpKSB7Ci0gICAgICAgIGlmICghYW5p
bWF0ZWRTdHlsZSkKLSAgICAgICAgICAgIGFuaW1hdGVkU3R5bGUgPSBjb25zdF9jYXN0PFJlbmRl
clN0eWxlKj4odGFyZ2V0U3R5bGUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8g
aWYgd2UgYXJlIHdhaXRpbmcgZm9yIHRoZSBzdGFydCB0aW1lciwgd2UgZG9uJ3Qgd2FudCB0byBj
aGFuZ2UgdGhlIHN0eWxlIHlldAotICAgIC8vIFNwZWNpYWwgY2FzZSAtIGlmIHRoZSBkZWxheSB0
aW1lIGlzIDAsIHRoZW4gd2UgZG8gd2FudCB0byBzZXQgdGhlIGZpcnN0IGZyYW1lIG9mIHRoZQot
ICAgIC8vIGFuaW1hdGlvbiByaWdodCBhd2F5LiBUaGlzIGF2b2lkcyBhIGZsYXNoIHdoZW4gdGhl
IGFuaW1hdGlvbiBzdGFydHMKLSAgICBpZiAod2FpdGluZ1RvU3RhcnQoKSAmJiBtX2FuaW1hdGlv
bi0+ZGVsYXkoKSA+IDApCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICAvLyBGSVhNRTogd2Ug
bmVlZCB0byBiZSBtb3JlIGVmZmljaWVudCBhYm91dCBkZXRlcm1pbmluZyB3aGljaCBrZXlmcmFt
ZXMgd2UgYXJlIGFuaW1hdGluZyBiZXR3ZWVuLgotICAgIC8vIFdlIHNob3VsZCBjYWNoZSB0aGUg
bGFzdCBwYWlyIG9yIHNvbWV0aGluZwotICAgIAotICAgIC8vIGZpbmQgdGhlIGZpcnN0IGtleQot
ICAgIGRvdWJsZSBlbGFwc2VkVGltZSA9IChtX3N0YXJ0VGltZSA+IDApID8gKCghcGF1c2VkKCkg
PyBjdXJyZW50VGltZSgpIDogbV9wYXVzZVRpbWUpIC0gbV9zdGFydFRpbWUpIDogMC4wOwotICAg
IGlmIChlbGFwc2VkVGltZSA8IDAuMCkKLSAgICAgICAgZWxhcHNlZFRpbWUgPSAwLjA7Ci0gICAg
ICAgIAotICAgIGRvdWJsZSB0ID0gbV9hbmltYXRpb24tPmR1cmF0aW9uKCkgPyAoZWxhcHNlZFRp
bWUgLyBtX2FuaW1hdGlvbi0+ZHVyYXRpb24oKSkgOiAxLjA7Ci0gICAgaW50IGkgPSAoaW50KSB0
OwotICAgIHQgLT0gaTsKLSAgICBpZiAobV9hbmltYXRpb24tPmRpcmVjdGlvbigpICYmIChpICYg
MSkpCi0gICAgICAgIHQgPSAxIC0gdDsKLQotICAgIFJlbmRlclN0eWxlKiBmcm9tU3R5bGUgPSAw
OwotICAgIFJlbmRlclN0eWxlKiB0b1N0eWxlID0gMDsKLSAgICBkb3VibGUgc2NhbGUgPSAxLjA7
Ci0gICAgZG91YmxlIG9mZnNldCA9IDAuMDsKLSAgICBpZiAobV9rZXlmcmFtZXMuZ2V0KCkpIHsK
LSAgICAgICAgVmVjdG9yPEtleWZyYW1lVmFsdWU+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX2tl
eWZyYW1lcy0+ZW5kS2V5ZnJhbWVzKCk7Ci0gICAgICAgIGZvciAoVmVjdG9yPEtleWZyYW1lVmFs
dWU+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVzLT5iZWdpbktleWZyYW1lcygpOyBp
dCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgICAgIGlmICh0IDwgaXQtPmtleSkgewotICAgICAg
ICAgICAgICAgIC8vIFRoZSBmaXJzdCBrZXkgc2hvdWxkIGFsd2F5cyBiZSAwLCBzbyB3ZSBzaG91
bGQgbmV2ZXIgc3VjY2VlZCBvbiB0aGUgZmlyc3Qga2V5Ci0gICAgICAgICAgICAgICAgaWYgKCFm
cm9tU3R5bGUpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIHNj
YWxlID0gMS4wIC8gKGl0LT5rZXkgLSBvZmZzZXQpOwotICAgICAgICAgICAgICAgIHRvU3R5bGUg
PSBjb25zdF9jYXN0PFJlbmRlclN0eWxlKj4oJihpdC0+c3R5bGUpKTsKLSAgICAgICAgICAgICAg
ICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgb2Zmc2V0
ID0gaXQtPmtleTsKLSAgICAgICAgICAgIGZyb21TdHlsZSA9IGNvbnN0X2Nhc3Q8UmVuZGVyU3R5
bGUqPigmKGl0LT5zdHlsZSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIC8vIGlmIGVp
dGhlciBzdHlsZSBpcyAwIHdlIGhhdmUgYW4gaW52YWxpZCBjYXNlLCBqdXN0IHN0b3AgdGhlIGFu
aW1hdGlvbgotICAgIGlmICghZnJvbVN0eWxlIHx8ICF0b1N0eWxlKSB7Ci0gICAgICAgIHVwZGF0
ZVN0YXRlTWFjaGluZShTVEFURV9JTlBVVF9FTkRfQU5JTUFUSU9OLCAtMSk7Ci0gICAgICAgIHJl
dHVybjsKLSAgICB9Ci0gICAgCi0gICAgLy8gcnVuIGEgY3ljbGUgb2YgYW5pbWF0aW9uLgotICAg
IC8vIFdlIGtub3cgd2Ugd2lsbCBuZWVkIGEgbmV3IHJlbmRlciBzdHlsZSwgc28gbWFrZSBvbmUg
aWYgbmVlZGVkCi0gICAgaWYgKCFhbmltYXRlZFN0eWxlKQotICAgICAgICBhbmltYXRlZFN0eWxl
ID0gbmV3IChyZW5kZXJlci0+cmVuZGVyQXJlbmEoKSkgUmVuZGVyU3R5bGUoKnRhcmdldFN0eWxl
KTsKLSAgICAKLSAgICBkb3VibGUgcHJvZyA9IHByb2dyZXNzKHNjYWxlLCBvZmZzZXQpOwotCi0g
ICAgSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX2tleWZyYW1lcy0+ZW5kUHJv
cGVydGllcygpOwotICAgIGZvciAoSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1f
a2V5ZnJhbWVzLT5iZWdpblByb3BlcnRpZXMoKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAg
IGlmIChBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6YmxlbmRQcm9wZXJ0aWVzKCppdCwgYW5p
bWF0ZWRTdHlsZSwgZnJvbVN0eWxlLCB0b1N0eWxlLCBwcm9nKSkKLSAgICAgICAgICAgIHNldEFu
aW1hdGluZygpOwotICAgIH0KLX0KLQotdm9pZCBLZXlmcmFtZUFuaW1hdGlvbjo6ZW5kQW5pbWF0
aW9uKGJvb2wgcmVzZXQpCi17Ci0gICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgKHVuYW5pbWF0
ZWQpIHN0eWxlCi0gICAgaWYgKG1fb2JqZWN0KQotICAgICAgICBzZXRDaGFuZ2VkKG1fb2JqZWN0
LT5lbGVtZW50KCkpOwotfQotCi12b2lkIEtleWZyYW1lQW5pbWF0aW9uOjpvbkFuaW1hdGlvblN0
YXJ0KGRvdWJsZSBpbkVsYXBzZWRUaW1lKQotewotICAgIHNlbmRBbmltYXRpb25FdmVudChFdmVu
dE5hbWVzOjp3ZWJraXRBbmltYXRpb25TdGFydEV2ZW50LCBpbkVsYXBzZWRUaW1lKTsKLX0KLQot
dm9pZCBLZXlmcmFtZUFuaW1hdGlvbjo6b25BbmltYXRpb25JdGVyYXRpb24oZG91YmxlIGluRWxh
cHNlZFRpbWUpCi17Ci0gICAgc2VuZEFuaW1hdGlvbkV2ZW50KEV2ZW50TmFtZXM6OndlYmtpdEFu
aW1hdGlvbkl0ZXJhdGlvbkV2ZW50LCBpbkVsYXBzZWRUaW1lKTsKLX0KLQotdm9pZCBLZXlmcmFt
ZUFuaW1hdGlvbjo6b25BbmltYXRpb25FbmQoZG91YmxlIGluRWxhcHNlZFRpbWUpCi17Ci0gICAg
aWYgKCFzZW5kQW5pbWF0aW9uRXZlbnQoRXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uRW5kRXZl
bnQsIGluRWxhcHNlZFRpbWUpKSB7Ci0gICAgICAgIC8vIFdlIGRpZG4ndCBkaXNwYXRjaCBhbiBl
dmVudCwgd2hpY2ggd291bGQgY2FsbCBlbmRBbmltYXRpb24oKSwgc28gd2UnbGwganVzdCBjYWxs
IGl0IGhlcmUuCi0gICAgICAgIGVuZEFuaW1hdGlvbih0cnVlKTsKLSAgICB9Ci19Ci0KLWJvb2wg
S2V5ZnJhbWVBbmltYXRpb246OnNlbmRBbmltYXRpb25FdmVudChjb25zdCBBdG9taWNTdHJpbmcm
IGluRXZlbnRUeXBlLCBkb3VibGUgaW5FbGFwc2VkVGltZSkKLXsKLSAgICBEb2N1bWVudDo6TGlz
dGVuZXJUeXBlIGxpc3RlbmVyVHlwZTsKLSAgICBpZiAoaW5FdmVudFR5cGUgPT0gRXZlbnROYW1l
czo6d2Via2l0QW5pbWF0aW9uSXRlcmF0aW9uRXZlbnQpCi0gICAgICAgIGxpc3RlbmVyVHlwZSA9
IERvY3VtZW50OjpBTklNQVRJT05JVEVSQVRJT05fTElTVEVORVI7Ci0gICAgZWxzZSBpZiAoaW5F
dmVudFR5cGUgPT0gRXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uRW5kRXZlbnQpCi0gICAgICAg
IGxpc3RlbmVyVHlwZSA9IERvY3VtZW50OjpBTklNQVRJT05FTkRfTElTVEVORVI7Ci0gICAgZWxz
ZQotICAgICAgICBsaXN0ZW5lclR5cGUgPSBEb2N1bWVudDo6QU5JTUFUSU9OU1RBUlRfTElTVEVO
RVI7Ci0gICAgCi0gICAgaWYgKHNob3VsZFNlbmRFdmVudEZvckxpc3RlbmVyKGxpc3RlbmVyVHlw
ZSkpIHsKLSAgICAgICAgRWxlbWVudCogZWxlbWVudCA9IGVsZW1lbnRGb3JFdmVudERpc3BhdGNo
KCk7Ci0gICAgICAgIGlmIChlbGVtZW50KSB7Ci0gICAgICAgICAgICBtX3dhaXRpbmdGb3JFbmRF
dmVudCA9IHRydWU7Ci0gICAgICAgICAgICBtX2FuaW1hdGlvbkV2ZW50RGlzcGF0Y2hlci5zdGFy
dFRpbWVyKGVsZW1lbnQsIG1fbmFtZSwgLTEsIHRydWUsIGluRXZlbnRUeXBlLCBpbkVsYXBzZWRU
aW1lKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBEaWQgZGlzcGF0Y2ggYW4gZXZlbnQK
LSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsgLy8gRGlkIG5vdCBkaXNwYXRj
aCBhbiBldmVudAotfQotCi12b2lkIEtleWZyYW1lQW5pbWF0aW9uOjpvdmVycmlkZUFuaW1hdGlv
bnMoKQotewotICAgIC8vIFRoaXMgd2lsbCBvdmVycmlkZSBpbXBsaWNpdCBhbmltYXRpb25zIHRo
YXQgbWF0Y2ggdGhlIHByb3BlcnRpZXMgaW4gdGhlIGtleWZyYW1lIGFuaW1hdGlvbgotICAgIEhh
c2hTZXQ8aW50Pjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9rZXlmcmFtZXMtPmVuZFByb3BlcnRp
ZXMoKTsKLSAgICBmb3IgKEhhc2hTZXQ8aW50Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZy
YW1lcy0+YmVnaW5Qcm9wZXJ0aWVzKCk7IGl0ICE9IGVuZDsgKytpdCkKLSAgICAgICAgY29tcG9z
aXRlQW5pbWF0aW9uKCktPm92ZXJyaWRlSW1wbGljaXRBbmltYXRpb25zKCppdCk7Ci19Ci0KLXZv
aWQgS2V5ZnJhbWVBbmltYXRpb246OnJlc3VtZU92ZXJyaWRkZW5BbmltYXRpb25zKCkKLXsKLSAg
ICAvLyBUaGlzIHdpbGwgcmVzdW1lIG92ZXJyaWRkZW4gaW1wbGljaXQgYW5pbWF0aW9ucwotICAg
IEhhc2hTZXQ8aW50Pjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9rZXlmcmFtZXMtPmVuZFByb3Bl
cnRpZXMoKTsKLSAgICBmb3IgKEhhc2hTZXQ8aW50Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tl
eWZyYW1lcy0+YmVnaW5Qcm9wZXJ0aWVzKCk7IGl0ICE9IGVuZDsgKytpdCkKLSAgICAgICAgY29t
cG9zaXRlQW5pbWF0aW9uKCktPnJlc3VtZU92ZXJyaWRkZW5JbXBsaWNpdEFuaW1hdGlvbnMoKml0
KTsKLX0KLQotYm9vbCBLZXlmcmFtZUFuaW1hdGlvbjo6YWZmZWN0c1Byb3BlcnR5KGludCBwcm9w
ZXJ0eSkgY29uc3QKLXsKLSAgICBIYXNoU2V0PGludD46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1f
a2V5ZnJhbWVzLT5lbmRQcm9wZXJ0aWVzKCk7Ci0gICAgZm9yIChIYXNoU2V0PGludD46OmNvbnN0
X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZXMtPmJlZ2luUHJvcGVydGllcygpOyBpdCAhPSBlbmQ7
ICsraXQpIHsKLSAgICAgICAgaWYgKCgqaXQpID09IHByb3BlcnR5KQotICAgICAgICAgICAgcmV0
dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotQW5pbWF0aW9uQ29udHJv
bGxlcjo6QW5pbWF0aW9uQ29udHJvbGxlcihGcmFtZSogZnJhbWUpCi06IG1fZGF0YShuZXcgQW5p
bWF0aW9uQ29udHJvbGxlclByaXZhdGUoZnJhbWUpKQotewotICAgIAotfQotCi1BbmltYXRpb25D
b250cm9sbGVyOjp+QW5pbWF0aW9uQ29udHJvbGxlcigpCi17Ci0gICAgZGVsZXRlIG1fZGF0YTsK
LX0KLQotdm9pZCBBbmltYXRpb25Db250cm9sbGVyOjpjYW5jZWxBbmltYXRpb25zKFJlbmRlck9i
amVjdCogcmVuZGVyZXIpCi17Ci0gICAgaWYgKCFtX2RhdGEtPmhhc0FuaW1hdGlvbnMoKSkKLSAg
ICAgICAgcmV0dXJuOwotICAgIAotICAgIGlmIChtX2RhdGEtPmNsZWFyKHJlbmRlcmVyKSkKLSAg
ICAgICAgc2V0Q2hhbmdlZChyZW5kZXJlci0+ZWxlbWVudCgpKTsKLX0KLQotUmVuZGVyU3R5bGUq
IEFuaW1hdGlvbkNvbnRyb2xsZXI6OnVwZGF0ZUFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0KiByZW5k
ZXJlciwgUmVuZGVyU3R5bGUqIG5ld1N0eWxlKQoteyAgICAKLSAgICAvLyBkb24ndCBkbyBhbnl0
aGluZyBpZiB3ZSdyZSBpbiB0aGUgY2FjaGUKLSAgICBpZiAoIXJlbmRlcmVyLT5kb2N1bWVudCgp
IHx8IHJlbmRlcmVyLT5kb2N1bWVudCgpLT5pblBhZ2VDYWNoZSgpKQotICAgICAgICByZXR1cm4g
bmV3U3R5bGU7Ci0gICAgCi0gICAgUmVuZGVyU3R5bGUqIG9sZFN0eWxlID0gcmVuZGVyZXItPnN0
eWxlKCk7Ci0gICAgCi0gICAgaWYgKCghb2xkU3R5bGUgfHwgKCFvbGRTdHlsZS0+YW5pbWF0aW9u
cygpICYmICFvbGRTdHlsZS0+dHJhbnNpdGlvbnMoKSkpICYmIAotICAgICAgICAgICAgICAgICAg
ICAgICAgKCFuZXdTdHlsZS0+YW5pbWF0aW9ucygpICYmICFuZXdTdHlsZS0+dHJhbnNpdGlvbnMo
KSkpCi0gICAgICAgIHJldHVybiBuZXdTdHlsZTsKLSAgICAKLSAgICBSZW5kZXJTdHlsZSogYmxl
bmRlZFN0eWxlID0gbmV3U3R5bGU7Ci0gICAgCi0gICAgLy8gRmV0Y2ggb3VyIGN1cnJlbnQgc2V0
IG9mIGltcGxpY2l0IGFuaW1hdGlvbnMgZnJvbSBhIGhhc2h0YWJsZS4gIFdlIHRoZW4gY29tcGFy
ZSB0aGVtCi0gICAgLy8gYWdhaW5zdCB0aGUgYW5pbWF0aW9ucyBpbiB0aGUgc3R5bGUgYW5kIG1h
a2Ugc3VyZSB3ZSdyZSBpbiBzeW5jLiAgSWYgZGVzdGluYXRpb24gdmFsdWVzCi0gICAgLy8gaGF2
ZSBjaGFuZ2VkLCB3ZSByZXNldCB0aGUgYW5pbWF0aW9uLiAgV2UgdGhlbiBkbyBhIGJsZW5kIHRv
IGdldCBuZXcgdmFsdWVzIGFuZCB3ZSByZXR1cm4KLSAgICAvLyBhIG5ldyBzdHlsZS4KLSAgICBB
U1NFUlQocmVuZGVyZXItPmVsZW1lbnQoKSk7IC8vIEZJWE1FOiBXZSBkbyBub3QgYW5pbWF0ZSBn
ZW5lcmF0ZWQgY29udGVudCB5ZXQuCi0gICAgCi0gICAgQ29tcG9zaXRlQW5pbWF0aW9uKiByZW5k
ZXJlckFuaW1hdGlvbnMgPSBtX2RhdGEtPmFjY2Vzc0NvbXBvc2l0ZUFuaW1hdGlvbihyZW5kZXJl
cik7Ci0gICAgYmxlbmRlZFN0eWxlID0gcmVuZGVyZXJBbmltYXRpb25zLT5hbmltYXRlKHJlbmRl
cmVyLCBvbGRTdHlsZSwgbmV3U3R5bGUpOwotICAgIAotICAgIG1fZGF0YS0+dXBkYXRlQW5pbWF0
aW9uVGltZXIoKTsKLSAgICAKLSAgICBpZiAoYmxlbmRlZFN0eWxlICE9IG5ld1N0eWxlKSB7Ci0g
ICAgICAgIC8vIElmIHRoZSBhbmltYXRpb25zL3RyYW5zaXRpb25zIGNoYW5nZSBvcGFjaXR5IG9y
IHRyYW5zZm9ybSwgd2UgbmVlZWQgdG8gdXBkYXRlCi0gICAgICAgIC8vIHRoZSBzdHlsZSB0byBp
bXBvc2UgdGhlIHN0YWNraW5nIHJ1bGVzLiBOb3RlIHRoYXQgdGhpcyBpcyBhbHNvCi0gICAgICAg
IC8vIGRvbmUgaW4gQ1NTU3R5bGVTZWxlY3Rvcjo6YWRqdXN0UmVuZGVyU3R5bGUoKS4KLSAgICAg
ICAgaWYgKGJsZW5kZWRTdHlsZS0+aGFzQXV0b1pJbmRleCgpICYmIChibGVuZGVkU3R5bGUtPm9w
YWNpdHkoKSA8IDEuMGYgfHwgYmxlbmRlZFN0eWxlLT5oYXNUcmFuc2Zvcm0oKSkpCi0gICAgICAg
ICAgICBibGVuZGVkU3R5bGUtPnNldFpJbmRleCgwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGJsZW5k
ZWRTdHlsZTsKLX0KLQotdm9pZCBBbmltYXRpb25Db250cm9sbGVyOjpzZXRBbmltYXRpb25TdGFy
dFRpbWUoUmVuZGVyT2JqZWN0KiBvYmosIGRvdWJsZSB0KQotewotICAgIENvbXBvc2l0ZUFuaW1h
dGlvbiogcmVuZGVyZXJBbmltYXRpb25zID0gbV9kYXRhLT5hY2Nlc3NDb21wb3NpdGVBbmltYXRp
b24ob2JqKTsKLSAgICByZW5kZXJlckFuaW1hdGlvbnMtPnNldEFuaW1hdGlvblN0YXJ0VGltZSh0
KTsKLX0KLQotdm9pZCBBbmltYXRpb25Db250cm9sbGVyOjpzZXRUcmFuc2l0aW9uU3RhcnRUaW1l
KFJlbmRlck9iamVjdCogb2JqLCBpbnQgcHJvcGVydHksIGRvdWJsZSB0KQotewotICAgIENvbXBv
c2l0ZUFuaW1hdGlvbiogcmVuZGVyZXJBbmltYXRpb25zID0gbV9kYXRhLT5hY2Nlc3NDb21wb3Np
dGVBbmltYXRpb24ob2JqKTsKLSAgICByZW5kZXJlckFuaW1hdGlvbnMtPnNldFRyYW5zaXRpb25T
dGFydFRpbWUocHJvcGVydHksIHQpOwotfQotCi1ib29sIEFuaW1hdGlvbkNvbnRyb2xsZXI6Omlz
QW5pbWF0aW5nUHJvcGVydHlPblJlbmRlcmVyKFJlbmRlck9iamVjdCogb2JqLCBpbnQgcHJvcGVy
dHksIGJvb2wgaXNSdW5uaW5nTm93KSBjb25zdAotewotICAgIHJldHVybiBtX2RhdGEtPmlzQW5p
bWF0aW5nUHJvcGVydHlPblJlbmRlcmVyKG9iaiwgcHJvcGVydHksIGlzUnVubmluZ05vdyk7Ci19
Ci0KLXZvaWQgQW5pbWF0aW9uQ29udHJvbGxlcjo6c3VzcGVuZEFuaW1hdGlvbnMoRG9jdW1lbnQq
IGRvY3VtZW50KQotewotICAgIG1fZGF0YS0+c3VzcGVuZEFuaW1hdGlvbnMoZG9jdW1lbnQpOwot
fQotCi12b2lkIEFuaW1hdGlvbkNvbnRyb2xsZXI6OnJlc3VtZUFuaW1hdGlvbnMoRG9jdW1lbnQq
IGRvY3VtZW50KQotewotICAgIG1fZGF0YS0+cmVzdW1lQW5pbWF0aW9ucyhkb2N1bWVudCk7Ci19
Ci0KLXZvaWQgQW5pbWF0aW9uQ29udHJvbGxlcjo6c3RhcnRVcGRhdGVSZW5kZXJpbmdEaXNwYXRj
aGVyKCkKLXsKLSAgICBtX2RhdGEtPnN0YXJ0VXBkYXRlUmVuZGVyaW5nRGlzcGF0Y2hlcigpOwot
fQotCi12b2lkIEFuaW1hdGlvbkNvbnRyb2xsZXI6OnN0eWxlQXZhaWxhYmxlKCkKLXsKLSAgICBt
X2RhdGEtPnN0eWxlQXZhaWxhYmxlKCk7Ci19Ci0KLXZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpz
ZXRXYWl0aW5nRm9yU3R5bGVBdmFpbGFibGUoYm9vbCB3YWl0aW5nKQotewotICAgIGlmICh3YWl0
aW5nKQotICAgICAgICBtX251bVN0eWxlQXZhaWxhYmxlV2FpdGVycysrOwotICAgIGVsc2UKLSAg
ICAgICAgbV9udW1TdHlsZUF2YWlsYWJsZVdhaXRlcnMtLTsKLSAgICBtX2FuaW1hdGlvbkNvbnRy
b2xsZXItPnNldFdhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZSh3YWl0aW5nKTsKLX0KLSAgICAKLX0K
SW5kZXg6IFdlYkNvcmUvcGFnZS9BbmltYXRpb25Db250cm9sbGVyLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wYWdlL0FuaW1hdGlvbkNvbnRyb2xsZXIuaAkocmV2aXNpb24gMzU5OTUpCisrKyBX
ZWJDb3JlL3BhZ2UvQW5pbWF0aW9uQ29udHJvbGxlci5oCSh3b3JraW5nIGNvcHkpCkBAIC0xLDcx
ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0Ogot
ICoKLSAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAotICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCi0gKiAyLiAgUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCi0gKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCi0gKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBv
ZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgotICogICAg
IGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1
Y3RzIGRlcml2ZWQKLSAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBw
cmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCi0gKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRSBJTVBMSUVECi0gKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCi0gKiBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUwotICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0Us
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCi0gKiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLgotICovCi0KLSNpZm5kZWYgQW5pbWF0aW9uQ29udHJvbGxlcl9oCi0jZGVmaW5lIEFuaW1h
dGlvbkNvbnRyb2xsZXJfaAotCi0jaW5jbHVkZSAiQ1NTUHJvcGVydHlOYW1lcy5oIgotCi1uYW1l
c3BhY2UgV2ViQ29yZSB7Ci0KLWNsYXNzIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOwotY2xh
c3MgRG9jdW1lbnQ7Ci1jbGFzcyBGcmFtZTsKLWNsYXNzIFJlbmRlck9iamVjdDsKLWNsYXNzIFJl
bmRlclN0eWxlOwotCi1jbGFzcyBBbmltYXRpb25Db250cm9sbGVyCi17Ci1wdWJsaWM6Ci0gICAg
QW5pbWF0aW9uQ29udHJvbGxlcihGcmFtZSopOwotICAgIH5BbmltYXRpb25Db250cm9sbGVyKCk7
Ci0gICAgCi0gICAgdm9pZCBjYW5jZWxBbmltYXRpb25zKFJlbmRlck9iamVjdCopOwotICAgIFJl
bmRlclN0eWxlKiB1cGRhdGVBbmltYXRpb25zKFJlbmRlck9iamVjdCosIFJlbmRlclN0eWxlKiBu
ZXdTdHlsZSk7Ci0gICAgCi0gICAgdm9pZCBzZXRBbmltYXRpb25TdGFydFRpbWUoUmVuZGVyT2Jq
ZWN0KiBvYmosIGRvdWJsZSB0KTsKLSAgICB2b2lkIHNldFRyYW5zaXRpb25TdGFydFRpbWUoUmVu
ZGVyT2JqZWN0KiBvYmosIGludCBwcm9wZXJ0eSwgZG91YmxlIHQpOwotICAgIAotICAgIGJvb2wg
aXNBbmltYXRpbmdQcm9wZXJ0eU9uUmVuZGVyZXIoUmVuZGVyT2JqZWN0KiBvYmosIGludCBwcm9w
ZXJ0eSwgYm9vbCBpc1J1bm5pbmdOb3cpIGNvbnN0OwotICAgIAotICAgIHZvaWQgc3VzcGVuZEFu
aW1hdGlvbnMoRG9jdW1lbnQqIGRvY3VtZW50KTsKLSAgICB2b2lkIHJlc3VtZUFuaW1hdGlvbnMo
RG9jdW1lbnQqIGRvY3VtZW50KTsKLSAgICB2b2lkIHVwZGF0ZUFuaW1hdGlvblRpbWVyKCk7Ci0g
ICAgCi0gICAgdm9pZCBzdGFydFVwZGF0ZVJlbmRlcmluZ0Rpc3BhdGNoZXIoKTsKLSAgICAKLSAg
ICB2b2lkIHN0eWxlQXZhaWxhYmxlKCk7Ci0gICAgCi1wcml2YXRlOgotICAgIEFuaW1hdGlvbkNv
bnRyb2xsZXJQcml2YXRlKiBtX2RhdGE7Ci0gICAgCi19OwotCi19Ci0KLSNlbmRpZgpJbmRleDog
V2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9BbmltYXRpb25CYXNlLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BhZ2UvYW5pbWF0aW9uL0FuaW1hdGlvbkJhc2UuY3BwCShyZXZpc2lvbiAwKQorKysg
V2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9BbmltYXRpb25CYXNlLmNwcAkocmV2aXNpb24gMCkKQEAg
LTAsMCArMSw4MjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAyLiAgUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAzLiAgTmVpdGhlciB0aGUg
bmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgor
ICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3Rl
IHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVj
aWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
CisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBP
RiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisg
KiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJBbmltYXRp
b25CYXNlLmgiCisjaW5jbHVkZSAiQW5pbWF0aW9uQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIktl
eWZyYW1lQW5pbWF0aW9uLmgiCisjaW5jbHVkZSAiSW1wbGljaXRBbmltYXRpb24uaCIKKyNpbmNs
dWRlICJDb21wb3NpdGVBbmltYXRpb24uaCIKKworI2luY2x1ZGUgIkNTU1Byb3BlcnR5TmFtZXMu
aCIKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRl
ICJFdmVudE5hbWVzLmgiCisjaW5jbHVkZSAiRmxvYXRDb252ZXJzaW9uLmgiCisjaW5jbHVkZSAi
RnJhbWUuaCIKKyNpbmNsdWRlICJSZW5kZXJPYmplY3QuaCIKKyNpbmNsdWRlICJSZW5kZXJTdHls
ZS5oIgorI2luY2x1ZGUgIlN5c3RlbVRpbWUuaCIKKyNpbmNsdWRlICJVbml0QmV6aWVyLmgiCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIGNvbnN0IGRvdWJsZSBjQW5pbWF0aW9uVGlt
ZXJEZWxheSA9IDAuMDI1OworCisvLyBUaGUgZXBzaWxvbiB2YWx1ZSB3ZSBwYXNzIHRvIFVuaXRC
ZXppZXI6OnNvbHZlIGdpdmVuIHRoYXQgdGhlIGFuaW1hdGlvbiBpcyBnb2luZyB0byBydW4gb3Zl
ciB8ZHVyfCBzZWNvbmRzLiBUaGUgbG9uZ2VyIHRoZQorLy8gYW5pbWF0aW9uLCB0aGUgbW9yZSBw
cmVjaXNpb24gd2UgbmVlZCBpbiB0aGUgdGltaW5nIGZ1bmN0aW9uIHJlc3VsdCB0byBhdm9pZCB1
Z2x5IGRpc2NvbnRpbnVpdGllcy4KK3N0YXRpYyBpbmxpbmUgZG91YmxlIHNvbHZlRXBzaWxvbihk
b3VibGUgZHVyYXRpb24pIHsgcmV0dXJuIDEuIC8gKDIwMC4gKiBkdXJhdGlvbik7IH0KKworc3Rh
dGljIGlubGluZSBkb3VibGUgc29sdmVDdWJpY0JlemllckZ1bmN0aW9uKGRvdWJsZSBwMXgsIGRv
dWJsZSBwMXksIGRvdWJsZSBwMngsIGRvdWJsZSBwMnksIGRvdWJsZSB0LCBkb3VibGUgZHVyYXRp
b24pCit7CisgICAgLy8gQ29udmVydCBmcm9tIGlucHV0IHRpbWUgdG8gcGFyYW1ldHJpYyB2YWx1
ZSBpbiBjdXJ2ZSwgdGhlbiBmcm9tCisgICAgLy8gdGhhdCB0byBvdXRwdXQgdGltZS4KKyAgICBV
bml0QmV6aWVyIGJlemllcihwMXgsIHAxeSwgcDJ4LCBwMnkpOworICAgIHJldHVybiBiZXppZXIu
c29sdmUodCwgc29sdmVFcHNpbG9uKGR1cmF0aW9uKSk7Cit9CisKK3ZvaWQgQW5pbWF0aW9uVGlt
ZXJDYWxsYmFjazo6dGltZXJGaXJlZChUaW1lcjxBbmltYXRpb25UaW1lckJhc2U+KikKK3sKKyAg
ICBtX2FuaW0tPmFuaW1hdGlvblRpbWVyQ2FsbGJhY2tGaXJlZChtX2V2ZW50VHlwZSwgbV9lbGFw
c2VkVGltZSk7Cit9CisKK0FuaW1hdGlvbkV2ZW50RGlzcGF0Y2hlcjo6QW5pbWF0aW9uRXZlbnRE
aXNwYXRjaGVyKEFuaW1hdGlvbkJhc2UqIGFuaW0pIAorOiBBbmltYXRpb25UaW1lckJhc2UoYW5p
bSkKKywgbV9wcm9wZXJ0eShDU1NQcm9wZXJ0eUludmFsaWQpCissIG1fcmVzZXQoZmFsc2UpCiss
IG1fZWxhcHNlZFRpbWUoLTEpCit7Cit9CisKK3ZvaWQgQW5pbWF0aW9uRXZlbnREaXNwYXRjaGVy
Ojp0aW1lckZpcmVkKFRpbWVyPEFuaW1hdGlvblRpbWVyQmFzZT4qKQoreworICAgIG1fYW5pbS0+
YW5pbWF0aW9uRXZlbnREaXNwYXRjaGVyRmlyZWQobV9lbGVtZW50LmdldCgpLCBtX25hbWUsIG1f
cHJvcGVydHksIG1fcmVzZXQsIG1fZXZlbnRUeXBlLCBtX2VsYXBzZWRUaW1lKTsKK30KKworc3Rh
dGljIGlubGluZSBpbnQgYmxlbmRGdW5jKGludCBmcm9tLCBpbnQgdG8sIGRvdWJsZSBwcm9ncmVz
cykKK3sgIAorICAgIHJldHVybiBpbnQoZnJvbSArICh0byAtIGZyb20pICogcHJvZ3Jlc3MpOwor
fQorCitzdGF0aWMgaW5saW5lIGRvdWJsZSBibGVuZEZ1bmMoZG91YmxlIGZyb20sIGRvdWJsZSB0
bywgZG91YmxlIHByb2dyZXNzKQoreyAgCisgICAgcmV0dXJuIGZyb20gKyAodG8gLSBmcm9tKSAq
IHByb2dyZXNzOworfQorCitzdGF0aWMgaW5saW5lIGZsb2F0IGJsZW5kRnVuYyhmbG9hdCBmcm9t
LCBmbG9hdCB0bywgZG91YmxlIHByb2dyZXNzKQoreyAgCisgICAgcmV0dXJuIG5hcnJvd1ByZWNp
c2lvblRvRmxvYXQoZnJvbSArICh0byAtIGZyb20pICogcHJvZ3Jlc3MpOworfQorCitzdGF0aWMg
aW5saW5lIENvbG9yIGJsZW5kRnVuYyhjb25zdCBDb2xvciYgZnJvbSwgY29uc3QgQ29sb3ImIHRv
LCBkb3VibGUgcHJvZ3Jlc3MpCit7ICAKKyAgICByZXR1cm4gQ29sb3IoYmxlbmRGdW5jKGZyb20u
cmVkKCksIHRvLnJlZCgpLCBwcm9ncmVzcyksCisgICAgICAgICAgICAgICAgIGJsZW5kRnVuYyhm
cm9tLmdyZWVuKCksIHRvLmdyZWVuKCksIHByb2dyZXNzKSwKKyAgICAgICAgICAgICAgICAgYmxl
bmRGdW5jKGZyb20uYmx1ZSgpLCB0by5ibHVlKCksIHByb2dyZXNzKSwKKyAgICAgICAgICAgICAg
ICAgYmxlbmRGdW5jKGZyb20uYWxwaGEoKSwgdG8uYWxwaGEoKSwgcHJvZ3Jlc3MpKTsKK30KKwor
c3RhdGljIGlubGluZSBMZW5ndGggYmxlbmRGdW5jKGNvbnN0IExlbmd0aCYgZnJvbSwgY29uc3Qg
TGVuZ3RoJiB0bywgZG91YmxlIHByb2dyZXNzKQoreyAgCisgICAgcmV0dXJuIHRvLmJsZW5kKGZy
b20sIHByb2dyZXNzKTsKK30KKworc3RhdGljIGlubGluZSBJbnRTaXplIGJsZW5kRnVuYyhjb25z
dCBJbnRTaXplJiBmcm9tLCBjb25zdCBJbnRTaXplJiB0bywgZG91YmxlIHByb2dyZXNzKQoreyAg
CisgICAgcmV0dXJuIEludFNpemUoYmxlbmRGdW5jKGZyb20ud2lkdGgoKSwgdG8ud2lkdGgoKSwg
cHJvZ3Jlc3MpLAorICAgICAgICAgICAgICAgICAgIGJsZW5kRnVuYyhmcm9tLmhlaWdodCgpLCB0
by5oZWlnaHQoKSwgcHJvZ3Jlc3MpKTsKK30KKworc3RhdGljIGlubGluZSBTaGFkb3dEYXRhKiBi
bGVuZEZ1bmMoY29uc3QgU2hhZG93RGF0YSogZnJvbSwgY29uc3QgU2hhZG93RGF0YSogdG8sIGRv
dWJsZSBwcm9ncmVzcykKK3sgIAorICAgIEFTU0VSVChmcm9tICYmIHRvKTsKKyAgICByZXR1cm4g
bmV3IFNoYWRvd0RhdGEoYmxlbmRGdW5jKGZyb20tPngsIHRvLT54LCBwcm9ncmVzcyksIGJsZW5k
RnVuYyhmcm9tLT55LCB0by0+eSwgcHJvZ3Jlc3MpLCAKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgYmxlbmRGdW5jKGZyb20tPmJsdXIsIHRvLT5ibHVyLCBwcm9ncmVzcyksIGJsZW5kRnVuYyhm
cm9tLT5jb2xvciwgdG8tPmNvbG9yLCBwcm9ncmVzcykpOworfQorCitzdGF0aWMgaW5saW5lIFRy
YW5zZm9ybU9wZXJhdGlvbnMgYmxlbmRGdW5jKGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMmIGZy
b20sIGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMmIHRvLCBkb3VibGUgcHJvZ3Jlc3MpCit7ICAg
IAorICAgIC8vIEJsZW5kIGFueSBvcGVyYXRpb25zIHdob3NlIHR5cGVzIGFjdHVhbGx5IG1hdGNo
IHVwLiAgT3RoZXJ3aXNlIGRvbid0IGJvdGhlci4KKyAgICB1bnNpZ25lZCBmcm9tU2l6ZSA9IGZy
b20uc2l6ZSgpOworICAgIHVuc2lnbmVkIHRvU2l6ZSA9IHRvLnNpemUoKTsKKyAgICB1bnNpZ25l
ZCBzaXplID0gbWF4KGZyb21TaXplLCB0b1NpemUpOworICAgIFRyYW5zZm9ybU9wZXJhdGlvbnMg
cmVzdWx0OworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAg
ICAgUmVmUHRyPFRyYW5zZm9ybU9wZXJhdGlvbj4gZnJvbU9wID0gaSA8IGZyb21TaXplID8gZnJv
bVtpXSA6IDA7CisgICAgICAgIFJlZlB0cjxUcmFuc2Zvcm1PcGVyYXRpb24+IHRvT3AgPSBpIDwg
dG9TaXplID8gdG9baV0gOiAwOworICAgICAgICBSZWZQdHI8VHJhbnNmb3JtT3BlcmF0aW9uPiBi
bGVuZGVkT3AgPSB0b09wID8gdG9PcC0+YmxlbmQoZnJvbU9wLmdldCgpLCBwcm9ncmVzcykgOiBm
cm9tT3AtPmJsZW5kKDAsIHByb2dyZXNzLCB0cnVlKTsKKyAgICAgICAgaWYgKGJsZW5kZWRPcCkK
KyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYmxlbmRlZE9wKTsKKyAgICB9CisgICAgcmV0dXJu
IHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSBFVmlzaWJpbGl0eSBibGVuZEZ1bmMoRVZpc2li
aWxpdHkgZnJvbSwgRVZpc2liaWxpdHkgdG8sIGRvdWJsZSBwcm9ncmVzcykKK3sKKyAgICAvLyBB
bnkgbm9uLXplcm8gcmVzdWx0IG1lYW5zIHdlIGNvbnNpZGVyIHRoZSBvYmplY3QgdG8gYmUgdmlz
aWJsZS4gIE9ubHkgYXQgMCBkbyB3ZSBjb25zaWRlciB0aGUgb2JqZWN0IHRvIGJlCisgICAgLy8g
aW52aXNpYmxlLiAgIFRoZSBpbnZpc2libGUgdmFsdWUgd2UgdXNlIChISURERU4gdnMuIENPTExB
UFNFKSBkZXBlbmRzIG9uIHRoZSBzcGVjaWZpZWQgZnJvbS90byB2YWx1ZXMuCisgICAgZG91Ymxl
IGZyb21WYWwgPSBmcm9tID09IFZJU0lCTEUgPyAxLiA6IDAuOworICAgIGRvdWJsZSB0b1ZhbCA9
IHRvID09IFZJU0lCTEUgPyAxLiA6IDAuOworICAgIGlmIChmcm9tVmFsID09IHRvVmFsKQorICAg
ICAgICByZXR1cm4gdG87CisgICAgZG91YmxlIHJlc3VsdCA9IGJsZW5kRnVuYyhmcm9tVmFsLCB0
b1ZhbCwgcHJvZ3Jlc3MpOworICAgIHJldHVybiByZXN1bHQgPiAwLiA/IFZJU0lCTEUgOiAodG8g
IT0gVklTSUJMRSA/IHRvIDogZnJvbSk7Cit9CisKK2NsYXNzIFByb3BlcnR5V3JhcHBlckJhc2Ug
eworcHVibGljOgorICAgIFByb3BlcnR5V3JhcHBlckJhc2UoaW50IHByb3ApCisgICAgOiBtX3By
b3AocHJvcCkKKyAgICB7IH0KKyAgICB2aXJ0dWFsIH5Qcm9wZXJ0eVdyYXBwZXJCYXNlKCkgeyB9
CisgICAgdmlydHVhbCBib29sIGVxdWFscyhjb25zdCBSZW5kZXJTdHlsZSogYSwgY29uc3QgUmVu
ZGVyU3R5bGUqIGIpIGNvbnN0PTA7CisgICAgdmlydHVhbCB2b2lkIGJsZW5kKFJlbmRlclN0eWxl
KiBkc3QsIGNvbnN0IFJlbmRlclN0eWxlKiBhLCBjb25zdCBSZW5kZXJTdHlsZSogYiwgZG91Ymxl
IHByb2cpIGNvbnN0PTA7CisgICAgCisgICAgaW50IHByb3BlcnR5KCkgY29uc3QgeyByZXR1cm4g
bV9wcm9wOyB9CisgICAgCitwcml2YXRlOgorICAgIGludCBtX3Byb3A7Cit9OworCit0ZW1wbGF0
ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFByb3BlcnR5V3JhcHBlckdldHRlciA6IHB1YmxpYyBQcm9w
ZXJ0eVdyYXBwZXJCYXNlIHsKK3B1YmxpYzoKKyAgICBQcm9wZXJ0eVdyYXBwZXJHZXR0ZXIoaW50
IHByb3AsIFQgKFJlbmRlclN0eWxlOjoqZ2V0dGVyKSgpIGNvbnN0KQorICAgIDogUHJvcGVydHlX
cmFwcGVyQmFzZShwcm9wKQorICAgICwgbV9nZXR0ZXIoZ2V0dGVyKQorICAgIHsgfQorICAgIAor
ICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJlbmRl
clN0eWxlKiBiKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIChhLT4qbV9nZXR0ZXIpKCkg
PT0gKGItPiptX2dldHRlcikoKTsKKyAgICB9CisgICAgCitwcm90ZWN0ZWQ6CisgICAgVCAoUmVu
ZGVyU3R5bGU6OiptX2dldHRlcikoKSBjb25zdDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBU
PgorY2xhc3MgUHJvcGVydHlXcmFwcGVyIDogcHVibGljIFByb3BlcnR5V3JhcHBlckdldHRlcjxU
PiB7CitwdWJsaWM6CisgICAgUHJvcGVydHlXcmFwcGVyKGludCBwcm9wLCBUIChSZW5kZXJTdHls
ZTo6KmdldHRlcikoKSBjb25zdCwgdm9pZCAoUmVuZGVyU3R5bGU6OipzZXR0ZXIpKFQpKQorICAg
IDogUHJvcGVydHlXcmFwcGVyR2V0dGVyPFQ+KHByb3AsIGdldHRlcikKKyAgICAsIG1fc2V0dGVy
KHNldHRlcikKKyAgICB7IH0KKyAgICAKKyAgICB2aXJ0dWFsIHZvaWQgYmxlbmQoUmVuZGVyU3R5
bGUqIGRzdCwgY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJlbmRlclN0eWxlKiBiLCBkb3Vi
bGUgcHJvZykgY29uc3QKKyAgICB7CisgICAgICAgIChkc3QtPiptX3NldHRlcikoYmxlbmRGdW5j
KChhLT4qUHJvcGVydHlXcmFwcGVyR2V0dGVyPFQ+OjptX2dldHRlcikoKSwgKGItPipQcm9wZXJ0
eVdyYXBwZXJHZXR0ZXI8VD46Om1fZ2V0dGVyKSgpLCBwcm9nKSk7CisgICAgfQorICAgIAorcHJv
dGVjdGVkOgorICAgIHZvaWQgKFJlbmRlclN0eWxlOjoqbV9zZXR0ZXIpKFQpOworfTsKKworY2xh
c3MgUHJvcGVydHlXcmFwcGVyU2hhZG93IDogcHVibGljIFByb3BlcnR5V3JhcHBlckdldHRlcjxT
aGFkb3dEYXRhKj4geworcHVibGljOgorICAgIFByb3BlcnR5V3JhcHBlclNoYWRvdyhpbnQgcHJv
cCwgU2hhZG93RGF0YSogKFJlbmRlclN0eWxlOjoqZ2V0dGVyKSgpIGNvbnN0LCB2b2lkIChSZW5k
ZXJTdHlsZTo6KnNldHRlcikoU2hhZG93RGF0YSosIGJvb2wpKQorICAgIDogUHJvcGVydHlXcmFw
cGVyR2V0dGVyPFNoYWRvd0RhdGEqPihwcm9wLCBnZXR0ZXIpCisgICAgLCBtX3NldHRlcihzZXR0
ZXIpCisgICAgeyB9CisgICAgCisgICAgdmlydHVhbCBib29sIGVxdWFscyhjb25zdCBSZW5kZXJT
dHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUqIGIpIGNvbnN0CisgICAgeworICAgICAgICBTaGFk
b3dEYXRhKiBzaGFkb3dhID0gKGEtPiptX2dldHRlcikoKTsKKyAgICAgICAgU2hhZG93RGF0YSog
c2hhZG93YiA9IChiLT4qbV9nZXR0ZXIpKCk7CisgICAgICAgIAorICAgICAgICBpZiAoIXNoYWRv
d2EgJiYgc2hhZG93YiB8fCBzaGFkb3dhICYmICFzaGFkb3diKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICBpZiAoc2hhZG93YSAmJiBzaGFkb3diICYmICgqc2hhZG93YSAhPSAq
c2hhZG93YikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVl
OworICAgIH0KKyAgICAKKyAgICB2aXJ0dWFsIHZvaWQgYmxlbmQoUmVuZGVyU3R5bGUqIGRzdCwg
Y29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJlbmRlclN0eWxlKiBiLCBkb3VibGUgcHJvZykg
Y29uc3QKKyAgICB7CisgICAgICAgIFNoYWRvd0RhdGEqIHNoYWRvd2EgPSAoYS0+Km1fZ2V0dGVy
KSgpOworICAgICAgICBTaGFkb3dEYXRhKiBzaGFkb3diID0gKGItPiptX2dldHRlcikoKTsKKyAg
ICAgICAgU2hhZG93RGF0YSBkZWZhdWx0U2hhZG93RGF0YSgwLCAwLCAwLCBDb2xvcjo6dHJhbnNw
YXJlbnQpOworICAgICAgICAKKyAgICAgICAgaWYgKCFzaGFkb3dhKQorICAgICAgICAgICAgc2hh
ZG93YSA9ICZkZWZhdWx0U2hhZG93RGF0YTsKKyAgICAgICAgaWYgKCFzaGFkb3diKQorICAgICAg
ICAgICAgc2hhZG93YiA9ICZkZWZhdWx0U2hhZG93RGF0YTsKKyAgICAgICAgCisgICAgICAgIChk
c3QtPiptX3NldHRlcikoYmxlbmRGdW5jKHNoYWRvd2EsIHNoYWRvd2IsIHByb2cpLCBmYWxzZSk7
CisgICAgfQorICAgIAorcHJpdmF0ZToKKyAgICB2b2lkIChSZW5kZXJTdHlsZTo6Km1fc2V0dGVy
KShTaGFkb3dEYXRhKiwgYm9vbCk7Cit9OworCitjbGFzcyBQcm9wZXJ0eVdyYXBwZXJNYXliZUlu
dmFsaWRDb2xvciA6IHB1YmxpYyBQcm9wZXJ0eVdyYXBwZXJCYXNlIHsKK3B1YmxpYzoKKyAgICBQ
cm9wZXJ0eVdyYXBwZXJNYXliZUludmFsaWRDb2xvcihpbnQgcHJvcCwgY29uc3QgQ29sb3ImIChS
ZW5kZXJTdHlsZTo6KmdldHRlcikoKSBjb25zdCwgdm9pZCAoUmVuZGVyU3R5bGU6OipzZXR0ZXIp
KGNvbnN0IENvbG9yJikpCisgICAgOiBQcm9wZXJ0eVdyYXBwZXJCYXNlKHByb3ApCisgICAgLCBt
X2dldHRlcihnZXR0ZXIpCisgICAgLCBtX3NldHRlcihzZXR0ZXIpCisgICAgeyB9CisgICAgCisg
ICAgdmlydHVhbCBib29sIGVxdWFscyhjb25zdCBSZW5kZXJTdHlsZSogYSwgY29uc3QgUmVuZGVy
U3R5bGUqIGIpIGNvbnN0CisgICAgeworICAgICAgICBDb2xvciBmcm9tQ29sb3IgPSAoYS0+Km1f
Z2V0dGVyKSgpOworICAgICAgICBDb2xvciB0b0NvbG9yID0gKGItPiptX2dldHRlcikoKTsKKyAg
ICAgICAgaWYgKCFmcm9tQ29sb3IuaXNWYWxpZCgpKQorICAgICAgICAgICAgZnJvbUNvbG9yID0g
YS0+Y29sb3IoKTsKKyAgICAgICAgaWYgKCF0b0NvbG9yLmlzVmFsaWQoKSkKKyAgICAgICAgICAg
IHRvQ29sb3IgPSBiLT5jb2xvcigpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIGZyb21Db2xv
ciA9PSB0b0NvbG9yOworICAgIH0KKyAgICAKKyAgICB2aXJ0dWFsIHZvaWQgYmxlbmQoUmVuZGVy
U3R5bGUqIGRzdCwgY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJlbmRlclN0eWxlKiBiLCBk
b3VibGUgcHJvZykgY29uc3QKKyAgICB7CisgICAgICAgIENvbG9yIGZyb21Db2xvciA9IChhLT4q
bV9nZXR0ZXIpKCk7CisgICAgICAgIENvbG9yIHRvQ29sb3IgPSAoYi0+Km1fZ2V0dGVyKSgpOwor
ICAgICAgICBpZiAoIWZyb21Db2xvci5pc1ZhbGlkKCkpCisgICAgICAgICAgICBmcm9tQ29sb3Ig
PSBhLT5jb2xvcigpOworICAgICAgICBpZiAoIXRvQ29sb3IuaXNWYWxpZCgpKQorICAgICAgICAg
ICAgdG9Db2xvciA9IGItPmNvbG9yKCk7CisgICAgICAgIChkc3QtPiptX3NldHRlcikoYmxlbmRG
dW5jKGZyb21Db2xvciwgdG9Db2xvciwgcHJvZykpOworICAgIH0KKyAgICAKK3ByaXZhdGU6Cisg
ICAgY29uc3QgQ29sb3ImIChSZW5kZXJTdHlsZTo6Km1fZ2V0dGVyKSgpIGNvbnN0OworICAgIHZv
aWQgKFJlbmRlclN0eWxlOjoqbV9zZXR0ZXIpKGNvbnN0IENvbG9yJik7Cit9OworCitWZWN0b3I8
UHJvcGVydHlXcmFwcGVyQmFzZSo+KiBnUHJvcGVydHlXcmFwcGVycyA9IDA7CitpbnQgZ1Byb3Bl
cnR5V3JhcHBlck1hcFtudW1DU1NQcm9wZXJ0aWVzXTsKKworc3RhdGljIHZvaWQgZW5zdXJlUHJv
cGVydHlNYXAoKQoreworICAgIC8vIEZJWE1FOiBUaGlzIGRhdGEgaXMgbmV2ZXIgZGVzdHJveWVk
LiBNYXliZSB3ZSBzaG91bGQgcmVmIGNvdW50IGl0IGFuZCB0b3NzIGl0IHdoZW4gdGhlIGxhc3Qg
QW5pbWF0aW9uQ29udHJvbGxlciBpcyBkZXN0cm95ZWQ/CisgICAgaWYgKGdQcm9wZXJ0eVdyYXBw
ZXJzID09IDApIHsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMgPSBuZXcgVmVjdG9yPFByb3Bl
cnR5V3JhcHBlckJhc2UqPigpOworICAgICAgICAKKyAgICAgICAgLy8gYnVpbGQgdGhlIGxpc3Qg
b2YgcHJvcGVydHkgd3JhcHBlcnMgdG8gZG8gdGhlIGNvbXBhcmlzb25zIGFuZCBibGVuZHMKKyAg
ICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0
aD4oQ1NTUHJvcGVydHlMZWZ0LCAmUmVuZGVyU3R5bGU6OmxlZnQsICZSZW5kZXJTdHlsZTo6c2V0
TGVmdCkpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdy
YXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eVJpZ2h0LCAmUmVuZGVyU3R5bGU6OnJpZ2h0LCAmUmVu
ZGVyU3R5bGU6OnNldFJpZ2h0KSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQo
bmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5VG9wLCAmUmVuZGVyU3R5bGU6
OnRvcCwgJlJlbmRlclN0eWxlOjpzZXRUb3ApKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMt
PmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlCb3R0b20sICZS
ZW5kZXJTdHlsZTo6Ym90dG9tLCAmUmVuZGVyU3R5bGU6OnNldEJvdHRvbSkpOworICAgICAgICBn
UHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQ
cm9wZXJ0eVdpZHRoLCAmUmVuZGVyU3R5bGU6OndpZHRoLCAmUmVuZGVyU3R5bGU6OnNldFdpZHRo
KSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBl
cjxMZW5ndGg+KENTU1Byb3BlcnR5SGVpZ2h0LCAmUmVuZGVyU3R5bGU6OmhlaWdodCwgJlJlbmRl
clN0eWxlOjpzZXRIZWlnaHQpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChu
ZXcgUHJvcGVydHlXcmFwcGVyPHVuc2lnbmVkIHNob3J0PihDU1NQcm9wZXJ0eUJvcmRlckxlZnRX
aWR0aCwgJlJlbmRlclN0eWxlOjpib3JkZXJMZWZ0V2lkdGgsICZSZW5kZXJTdHlsZTo6c2V0Qm9y
ZGVyTGVmdFdpZHRoKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFBy
b3BlcnR5V3JhcHBlcjx1bnNpZ25lZCBzaG9ydD4oQ1NTUHJvcGVydHlCb3JkZXJSaWdodFdpZHRo
LCAmUmVuZGVyU3R5bGU6OmJvcmRlclJpZ2h0V2lkdGgsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVy
UmlnaHRXaWR0aCkpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9w
ZXJ0eVdyYXBwZXI8dW5zaWduZWQgc2hvcnQ+KENTU1Byb3BlcnR5Qm9yZGVyVG9wV2lkdGgsICZS
ZW5kZXJTdHlsZTo6Ym9yZGVyVG9wV2lkdGgsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyVG9wV2lk
dGgpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFw
cGVyPHVuc2lnbmVkIHNob3J0PihDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbVdpZHRoLCAmUmVuZGVy
U3R5bGU6OmJvcmRlckJvdHRvbVdpZHRoLCAmUmVuZGVyU3R5bGU6OnNldEJvcmRlckJvdHRvbVdp
ZHRoKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3Jh
cHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5TWFyZ2luTGVmdCwgJlJlbmRlclN0eWxlOjptYXJnaW5M
ZWZ0LCAmUmVuZGVyU3R5bGU6OnNldE1hcmdpbkxlZnQpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3Jh
cHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlNYXJn
aW5SaWdodCwgJlJlbmRlclN0eWxlOjptYXJnaW5SaWdodCwgJlJlbmRlclN0eWxlOjpzZXRNYXJn
aW5SaWdodCkpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0
eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eU1hcmdpblRvcCwgJlJlbmRlclN0eWxlOjptYXJn
aW5Ub3AsICZSZW5kZXJTdHlsZTo6c2V0TWFyZ2luVG9wKSk7CisgICAgICAgIGdQcm9wZXJ0eVdy
YXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5TWFy
Z2luQm90dG9tLCAmUmVuZGVyU3R5bGU6Om1hcmdpbkJvdHRvbSwgJlJlbmRlclN0eWxlOjpzZXRN
YXJnaW5Cb3R0b20pKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJv
cGVydHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlQYWRkaW5nTGVmdCwgJlJlbmRlclN0eWxl
OjpwYWRkaW5nTGVmdCwgJlJlbmRlclN0eWxlOjpzZXRQYWRkaW5nTGVmdCkpOworICAgICAgICBn
UHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQ
cm9wZXJ0eVBhZGRpbmdSaWdodCwgJlJlbmRlclN0eWxlOjpwYWRkaW5nUmlnaHQsICZSZW5kZXJT
dHlsZTo6c2V0UGFkZGluZ1JpZ2h0KSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBl
bmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5UGFkZGluZ1RvcCwgJlJl
bmRlclN0eWxlOjpwYWRkaW5nVG9wLCAmUmVuZGVyU3R5bGU6OnNldFBhZGRpbmdUb3ApKTsKKyAg
ICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0
aD4oQ1NTUHJvcGVydHlQYWRkaW5nQm90dG9tLCAmUmVuZGVyU3R5bGU6OnBhZGRpbmdCb3R0b20s
ICZSZW5kZXJTdHlsZTo6c2V0UGFkZGluZ0JvdHRvbSkpOworICAgICAgICBnUHJvcGVydHlXcmFw
cGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8ZmxvYXQ+KENTU1Byb3BlcnR5T3BhY2l0
eSwgJlJlbmRlclN0eWxlOjpvcGFjaXR5LCAmUmVuZGVyU3R5bGU6OnNldE9wYWNpdHkpKTsKKyAg
ICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPGNvbnN0
IENvbG9yJj4oQ1NTUHJvcGVydHlDb2xvciwgJlJlbmRlclN0eWxlOjpjb2xvciwgJlJlbmRlclN0
eWxlOjpzZXRDb2xvcikpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQ
cm9wZXJ0eVdyYXBwZXI8Y29uc3QgQ29sb3ImPihDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvciwg
JlJlbmRlclN0eWxlOjpiYWNrZ3JvdW5kQ29sb3IsICZSZW5kZXJTdHlsZTo6c2V0QmFja2dyb3Vu
ZENvbG9yKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5
V3JhcHBlcjxpbnQ+KENTU1Byb3BlcnR5Rm9udFNpemUsICZSZW5kZXJTdHlsZTo6Zm9udFNpemUs
ICZSZW5kZXJTdHlsZTo6c2V0QmxlbmRlZEZvbnRTaXplKSk7CisgICAgICAgIGdQcm9wZXJ0eVdy
YXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjx1bnNpZ25lZCBzaG9ydD4oQ1NTUHJv
cGVydHlXZWJraXRDb2x1bW5SdWxlV2lkdGgsICZSZW5kZXJTdHlsZTo6Y29sdW1uUnVsZVdpZHRo
LCAmUmVuZGVyU3R5bGU6OnNldENvbHVtblJ1bGVXaWR0aCkpOworICAgICAgICBnUHJvcGVydHlX
cmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8ZmxvYXQ+KENTU1Byb3BlcnR5V2Vi
a2l0Q29sdW1uR2FwLCAmUmVuZGVyU3R5bGU6OmNvbHVtbkdhcCwgJlJlbmRlclN0eWxlOjpzZXRD
b2x1bW5HYXApKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVy
dHlXcmFwcGVyPHVuc2lnbmVkIHNob3J0PihDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbkNvdW50LCAm
UmVuZGVyU3R5bGU6OmNvbHVtbkNvdW50LCAmUmVuZGVyU3R5bGU6OnNldENvbHVtbkNvdW50KSk7
CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxm
bG9hdD4oQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5XaWR0aCwgJlJlbmRlclN0eWxlOjpjb2x1bW5X
aWR0aCwgJlJlbmRlclN0eWxlOjpzZXRDb2x1bW5XaWR0aCkpOworICAgICAgICBnUHJvcGVydHlX
cmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8c2hvcnQ+KENTU1Byb3BlcnR5V2Vi
a2l0Qm9yZGVySG9yaXpvbnRhbFNwYWNpbmcsICZSZW5kZXJTdHlsZTo6aG9yaXpvbnRhbEJvcmRl
clNwYWNpbmcsICZSZW5kZXJTdHlsZTo6c2V0SG9yaXpvbnRhbEJvcmRlclNwYWNpbmcpKTsKKyAg
ICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPHNob3J0
PihDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclZlcnRpY2FsU3BhY2luZywgJlJlbmRlclN0eWxlOjp2
ZXJ0aWNhbEJvcmRlclNwYWNpbmcsICZSZW5kZXJTdHlsZTo6c2V0VmVydGljYWxCb3JkZXJTcGFj
aW5nKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3Jh
cHBlcjxpbnQ+KENTU1Byb3BlcnR5WkluZGV4LCAmUmVuZGVyU3R5bGU6OnpJbmRleCwgJlJlbmRl
clN0eWxlOjpzZXRaSW5kZXgpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChu
ZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlMaW5lSGVpZ2h0LCAmUmVuZGVy
U3R5bGU6OmxpbmVIZWlnaHQsICZSZW5kZXJTdHlsZTo6c2V0TGluZUhlaWdodCkpOworICAgICAg
ICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8aW50PihDU1NQ
cm9wZXJ0eU91dGxpbmVPZmZzZXQsICZSZW5kZXJTdHlsZTo6b3V0bGluZU9mZnNldCwgJlJlbmRl
clN0eWxlOjpzZXRPdXRsaW5lT2Zmc2V0KSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5h
cHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjx1bnNpZ25lZCBzaG9ydD4oQ1NTUHJvcGVydHlPdXRs
aW5lV2lkdGgsICZSZW5kZXJTdHlsZTo6b3V0bGluZVdpZHRoLCAmUmVuZGVyU3R5bGU6OnNldE91
dGxpbmVXaWR0aCkpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9w
ZXJ0eVdyYXBwZXI8aW50PihDU1NQcm9wZXJ0eUxldHRlclNwYWNpbmcsICZSZW5kZXJTdHlsZTo6
bGV0dGVyU3BhY2luZywgJlJlbmRlclN0eWxlOjpzZXRMZXR0ZXJTcGFjaW5nKSk7CisgICAgICAg
IGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxpbnQ+KENTU1By
b3BlcnR5V29yZFNwYWNpbmcsICZSZW5kZXJTdHlsZTo6d29yZFNwYWNpbmcsICZSZW5kZXJTdHls
ZTo6c2V0V29yZFNwYWNpbmcpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChu
ZXcgUHJvcGVydHlXcmFwcGVyPGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMmPihDU1NQcm9wZXJ0
eVdlYmtpdFRyYW5zZm9ybSwgJlJlbmRlclN0eWxlOjp0cmFuc2Zvcm0sICZSZW5kZXJTdHlsZTo6
c2V0VHJhbnNmb3JtKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFBy
b3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luWCwg
JlJlbmRlclN0eWxlOjp0cmFuc2Zvcm1PcmlnaW5YLCAmUmVuZGVyU3R5bGU6OnNldFRyYW5zZm9y
bU9yaWdpblgpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVy
dHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlXZWJraXRUcmFuc2Zvcm1PcmlnaW5ZLCAmUmVu
ZGVyU3R5bGU6OnRyYW5zZm9ybU9yaWdpblksICZSZW5kZXJTdHlsZTo6c2V0VHJhbnNmb3JtT3Jp
Z2luWSkpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdy
YXBwZXI8Y29uc3QgSW50U2l6ZSY+KENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyVG9wTGVmdFJhZGl1
cywgJlJlbmRlclN0eWxlOjpib3JkZXJUb3BMZWZ0UmFkaXVzLCAmUmVuZGVyU3R5bGU6OnNldEJv
cmRlclRvcExlZnRSYWRpdXMpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChu
ZXcgUHJvcGVydHlXcmFwcGVyPGNvbnN0IEludFNpemUmPihDU1NQcm9wZXJ0eVdlYmtpdEJvcmRl
clRvcFJpZ2h0UmFkaXVzLCAmUmVuZGVyU3R5bGU6OmJvcmRlclRvcFJpZ2h0UmFkaXVzLCAmUmVu
ZGVyU3R5bGU6OnNldEJvcmRlclRvcFJpZ2h0UmFkaXVzKSk7CisgICAgICAgIGdQcm9wZXJ0eVdy
YXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxjb25zdCBJbnRTaXplJj4oQ1NTUHJv
cGVydHlXZWJraXRCb3JkZXJCb3R0b21MZWZ0UmFkaXVzLCAmUmVuZGVyU3R5bGU6OmJvcmRlckJv
dHRvbUxlZnRSYWRpdXMsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyQm90dG9tTGVmdFJhZGl1cykp
OworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8
Y29uc3QgSW50U2l6ZSY+KENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQm90dG9tUmlnaHRSYWRpdXMs
ICZSZW5kZXJTdHlsZTo6Ym9yZGVyQm90dG9tUmlnaHRSYWRpdXMsICZSZW5kZXJTdHlsZTo6c2V0
Qm9yZGVyQm90dG9tUmlnaHRSYWRpdXMpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFw
cGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPEVWaXNpYmlsaXR5PihDU1NQcm9wZXJ0eVZpc2liaWxp
dHksICZSZW5kZXJTdHlsZTo6dmlzaWJpbGl0eSwgJlJlbmRlclN0eWxlOjpzZXRWaXNpYmlsaXR5
KSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBl
cjxmbG9hdD4oQ1NTUHJvcGVydHlab29tLCAmUmVuZGVyU3R5bGU6Onpvb20sICZSZW5kZXJTdHls
ZTo6c2V0Wm9vbSkpOworICAgICAgICAKKyAgICAgICAgLy8gRklYTUU6IHRoZXNlIG1pZ2h0IGJl
IGludmFsaWQgY29sb3JzLCBuZWVkIHRvIGNoZWNrIGZvciB0aGF0CisgICAgICAgIGdQcm9wZXJ0
eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENvbG9yKENT
U1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZUNvbG9yLCAmUmVuZGVyU3R5bGU6OmNvbHVtblJ1bGVD
b2xvciwgJlJlbmRlclN0eWxlOjpzZXRDb2x1bW5SdWxlQ29sb3IpKTsKKyAgICAgICAgZ1Byb3Bl
cnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyTWF5YmVJbnZhbGlkQ29sb3Io
Q1NTUHJvcGVydHlXZWJraXRUZXh0U3Ryb2tlQ29sb3IsICZSZW5kZXJTdHlsZTo6dGV4dFN0cm9r
ZUNvbG9yLCAmUmVuZGVyU3R5bGU6OnNldFRleHRTdHJva2VDb2xvcikpOworICAgICAgICBnUHJv
cGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXJNYXliZUludmFsaWRDb2xv
cihDU1NQcm9wZXJ0eVdlYmtpdFRleHRGaWxsQ29sb3IsICZSZW5kZXJTdHlsZTo6dGV4dEZpbGxD
b2xvciwgJlJlbmRlclN0eWxlOjpzZXRUZXh0RmlsbENvbG9yKSk7CisgICAgICAgIGdQcm9wZXJ0
eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENvbG9yKENT
U1Byb3BlcnR5Qm9yZGVyTGVmdENvbG9yLCAmUmVuZGVyU3R5bGU6OmJvcmRlckxlZnRDb2xvciwg
JlJlbmRlclN0eWxlOjpzZXRCb3JkZXJMZWZ0Q29sb3IpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3Jh
cHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyTWF5YmVJbnZhbGlkQ29sb3IoQ1NTUHJv
cGVydHlCb3JkZXJSaWdodENvbG9yLCAmUmVuZGVyU3R5bGU6OmJvcmRlclJpZ2h0Q29sb3IsICZS
ZW5kZXJTdHlsZTo6c2V0Qm9yZGVyUmlnaHRDb2xvcikpOworICAgICAgICBnUHJvcGVydHlXcmFw
cGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXJNYXliZUludmFsaWRDb2xvcihDU1NQcm9w
ZXJ0eUJvcmRlclRvcENvbG9yLCAmUmVuZGVyU3R5bGU6OmJvcmRlclRvcENvbG9yLCAmUmVuZGVy
U3R5bGU6OnNldEJvcmRlclRvcENvbG9yKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5h
cHBlbmQobmV3IFByb3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENvbG9yKENTU1Byb3BlcnR5Qm9y
ZGVyQm90dG9tQ29sb3IsICZSZW5kZXJTdHlsZTo6Ym9yZGVyQm90dG9tQ29sb3IsICZSZW5kZXJT
dHlsZTo6c2V0Qm9yZGVyQm90dG9tQ29sb3IpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMt
PmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyTWF5YmVJbnZhbGlkQ29sb3IoQ1NTUHJvcGVydHlP
dXRsaW5lQ29sb3IsICZSZW5kZXJTdHlsZTo6b3V0bGluZUNvbG9yLCAmUmVuZGVyU3R5bGU6OnNl
dE91dGxpbmVDb2xvcikpOworICAgICAgICAKKyAgICAgICAgLy8gVGhlc2UgYXJlIGZvciBzaGFk
b3dzCisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBl
clNoYWRvdyhDU1NQcm9wZXJ0eVdlYmtpdEJveFNoYWRvdywgJlJlbmRlclN0eWxlOjpib3hTaGFk
b3csICZSZW5kZXJTdHlsZTo6c2V0Qm94U2hhZG93KSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBw
ZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlclNoYWRvdyhDU1NQcm9wZXJ0eVRleHRTaGFk
b3csICZSZW5kZXJTdHlsZTo6dGV4dFNoYWRvdywgJlJlbmRlclN0eWxlOjpzZXRUZXh0U2hhZG93
KSk7CisgICAgICAgIAorICAgICAgICAvLyBNYWtlIHN1cmUgdW51c2VkIHNsb3RzIGhhdmUgYSB2
YWx1ZQorICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQp
IG51bUNTU1Byb3BlcnRpZXM7ICsraSkKKyAgICAgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJNYXBb
aV0gPSBDU1NQcm9wZXJ0eUludmFsaWQ7CisgICAgICAgIAorICAgICAgICBzaXplX3QgbiA9IGdQ
cm9wZXJ0eVdyYXBwZXJzLT5zaXplKCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAw
OyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgICBBU1NFUlQoKCpnUHJvcGVydHlXcmFwcGVycylb
aV0tPnByb3BlcnR5KCkgLSBmaXJzdENTU1Byb3BlcnR5IDwgbnVtQ1NTUHJvcGVydGllcyk7Cisg
ICAgICAgICAgICBnUHJvcGVydHlXcmFwcGVyTWFwWygqZ1Byb3BlcnR5V3JhcHBlcnMpW2ldLT5w
cm9wZXJ0eSgpIC0gZmlyc3RDU1NQcm9wZXJ0eV0gPSBpOworICAgICAgICB9CisgICAgfQorfQor
CitBbmltYXRpb25CYXNlOjpBbmltYXRpb25CYXNlKGNvbnN0IEFuaW1hdGlvbiogdHJhbnNpdGlv
biwgUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgQ29tcG9zaXRlQW5pbWF0aW9uKiBjb21wQW5pbSkK
KzogbV9hbmltU3RhdGUoU1RBVEVfTkVXKQorLCBtX2l0ZXJhdGlvbigwKQorLCBtX2FuaW1hdGlu
ZyhmYWxzZSkKKywgbV93YWl0ZWRGb3JSZXNwb25zZShmYWxzZSkKKywgbV9zdGFydFRpbWUoMCkK
KywgbV9wYXVzZVRpbWUoLTEpCissIG1fb2JqZWN0KHJlbmRlcmVyKQorLCBtX2FuaW1hdGlvblRp
bWVyQ2FsbGJhY2soY29uc3RfY2FzdDxBbmltYXRpb25CYXNlKj4odGhpcykpCissIG1fYW5pbWF0
aW9uRXZlbnREaXNwYXRjaGVyKGNvbnN0X2Nhc3Q8QW5pbWF0aW9uQmFzZSo+KHRoaXMpKQorLCBt
X2FuaW1hdGlvbihjb25zdF9jYXN0PEFuaW1hdGlvbio+KHRyYW5zaXRpb24pKQorLCBtX2NvbXBB
bmltKGNvbXBBbmltKQorLCBtX3dhaXRpbmdGb3JFbmRFdmVudChmYWxzZSkKK3sKKyAgICBlbnN1
cmVQcm9wZXJ0eU1hcCgpOworfQorCitBbmltYXRpb25CYXNlOjp+QW5pbWF0aW9uQmFzZSgpCit7
CisgICAgaWYgKG1fYW5pbVN0YXRlID09IFNUQVRFX1NUQVJUX1dBSVRfU1RZTEVfQVZBSUxBQkxF
KQorICAgICAgICBtX2NvbXBBbmltLT5zZXRXYWl0aW5nRm9yU3R5bGVBdmFpbGFibGUoZmFsc2Up
OworfQorLy8gc3RhdGljCitib29sIEFuaW1hdGlvbkJhc2U6OnByb3BlcnRpZXNFcXVhbChpbnQg
cHJvcCwgY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJlbmRlclN0eWxlKiBiKQoreworICAg
IGlmIChwcm9wID09IGNBbmltYXRlQWxsKSB7CisgICAgICAgIHNpemVfdCBuID0gZ1Byb3BlcnR5
V3JhcHBlcnMtPnNpemUoKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBu
OyArK2kpIHsKKyAgICAgICAgICAgIGlmICghKCpnUHJvcGVydHlXcmFwcGVycylbaV0tPmVxdWFs
cyhhLCBiKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9
CisgICAgZWxzZSB7CisgICAgICAgIGludCBwcm9wSW5kZXggPSBwcm9wIC0gZmlyc3RDU1NQcm9w
ZXJ0eTsKKyAgICAgICAgCisgICAgICAgIGlmIChwcm9wSW5kZXggPj0gMCAmJiBwcm9wSW5kZXgg
PCBudW1DU1NQcm9wZXJ0aWVzKSB7CisgICAgICAgICAgICBpbnQgaSA9IGdQcm9wZXJ0eVdyYXBw
ZXJNYXBbcHJvcEluZGV4XTsKKyAgICAgICAgICAgIHJldHVybiAoaSA+PSAwKSA/ICgqZ1Byb3Bl
cnR5V3JhcHBlcnMpW2ldLT5lcXVhbHMoYSwgYikgOiB0cnVlOworICAgICAgICB9CisgICAgfQor
ICAgIHJldHVybiB0cnVlOworfQorCisvLyBzdGF0aWMKK2ludCBBbmltYXRpb25CYXNlOjpnZXRQ
cm9wZXJ0eUF0SW5kZXgoaW50IGkpCit7CisgICAgaWYgKGkgPCAwIHx8IGkgPj0gKGludCkgZ1By
b3BlcnR5V3JhcHBlcnMtPnNpemUoKSkKKyAgICAgICAgcmV0dXJuIENTU1Byb3BlcnR5SW52YWxp
ZDsKKyAgICAgICAgCisgICAgcmV0dXJuICgqZ1Byb3BlcnR5V3JhcHBlcnMpW2ldLT5wcm9wZXJ0
eSgpOworfQorCisvL3N0YXRpYworaW50IEFuaW1hdGlvbkJhc2U6OmdldE51bVByb3BlcnRpZXMo
KQoreworICAgIHJldHVybiBnUHJvcGVydHlXcmFwcGVycy0+c2l6ZSgpOworfQorCisgICAgCisv
LyBzdGF0aWMgLSByZXR1cm4gdHJ1ZSBpZiB3ZSBuZWVkIHRvIHN0YXJ0IHNvZnR3YXJlIGFuaW1h
dGlvbiB0aW1lcnMKK2Jvb2wgQW5pbWF0aW9uQmFzZTo6YmxlbmRQcm9wZXJ0aWVzKGludCBwcm9w
LCBSZW5kZXJTdHlsZSogZHN0LCBjb25zdCBSZW5kZXJTdHlsZSogYSwgY29uc3QgUmVuZGVyU3R5
bGUqIGIsIGRvdWJsZSBwcm9nKQoreworICAgIGlmIChwcm9wID09IGNBbmltYXRlQWxsKSB7Cisg
ICAgICAgIEFTU0VSVCgwKTsKKyAgICAgICAgYm9vbCBuZWVkc1RpbWVyID0gZmFsc2U7CisgICAg
CisgICAgICAgIHNpemVfdCBuID0gZ1Byb3BlcnR5V3JhcHBlcnMtPnNpemUoKTsKKyAgICAgICAg
Zm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgICAgIFByb3Bl
cnR5V3JhcHBlckJhc2UqIHdyYXBwZXIgPSAoKmdQcm9wZXJ0eVdyYXBwZXJzKVtpXTsKKyAgICAg
ICAgICAgIGlmICghd3JhcHBlci0+ZXF1YWxzKGEsIGIpKSB7CisgICAgICAgICAgICAgICAgd3Jh
cHBlci0+YmxlbmQoZHN0LCBhLCBiLCBwcm9nKTsKKyAgICAgICAgICAgICAgICBuZWVkc1RpbWVy
ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmVlZHNU
aW1lcjsKKyAgICB9CisgICAgCisgICAgaW50IHByb3BJbmRleCA9IHByb3AgLSBmaXJzdENTU1By
b3BlcnR5OworICAgIGlmIChwcm9wSW5kZXggPj0gMCAmJiBwcm9wSW5kZXggPCBudW1DU1NQcm9w
ZXJ0aWVzKSB7CisgICAgICAgIGludCBpID0gZ1Byb3BlcnR5V3JhcHBlck1hcFtwcm9wSW5kZXhd
OworICAgICAgICBpZiAoaSA+PSAwKSB7CisgICAgICAgICAgICBQcm9wZXJ0eVdyYXBwZXJCYXNl
KiB3cmFwcGVyID0gKCpnUHJvcGVydHlXcmFwcGVycylbaV07CisgICAgICAgICAgICB3cmFwcGVy
LT5ibGVuZChkc3QsIGEsIGIsIHByb2cpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEFuaW1hdGlv
bkJhc2U6OnNldENoYW5nZWQoTm9kZSogbm9kZSkKK3sKKyAgICBBU1NFUlQoIW5vZGUgfHwgKG5v
ZGUtPmRvY3VtZW50KCkgJiYgIW5vZGUtPmRvY3VtZW50KCktPmluUGFnZUNhY2hlKCkpKTsKKyAg
ICBub2RlLT5zZXRDaGFuZ2VkKEFuaW1hdGlvblN0eWxlQ2hhbmdlKTsKK30KKworZG91YmxlIEFu
aW1hdGlvbkJhc2U6OmR1cmF0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9hbmltYXRpb24t
PmR1cmF0aW9uKCk7Cit9CisKK2Jvb2wgQW5pbWF0aW9uQmFzZTo6cGxheVN0YXRlUGxheWluZygp
IGNvbnN0Cit7CisgICAgcmV0dXJuIG1fYW5pbWF0aW9uICYmIG1fYW5pbWF0aW9uLT5wbGF5U3Rh
dGUoKSA9PSBBbmltUGxheVN0YXRlUGxheWluZzsKK30KKworYm9vbCBBbmltYXRpb25CYXNlOjph
bmltYXRpb25zTWF0Y2goY29uc3QgQW5pbWF0aW9uKiBhbmltKSBjb25zdAoreworICAgIHJldHVy
biBtX2FuaW1hdGlvbi0+YW5pbWF0aW9uc01hdGNoKGFuaW0pOworfQorCitFbGVtZW50KiBBbmlt
YXRpb25CYXNlOjplbGVtZW50Rm9yRXZlbnREaXNwYXRjaCgpCit7CisgICAgaWYgKG1fb2JqZWN0
LT5ub2RlKCkgJiYgbV9vYmplY3QtPm5vZGUoKS0+aXNFbGVtZW50Tm9kZSgpKQorICAgICAgICBy
ZXR1cm4gc3RhdGljX2Nhc3Q8RWxlbWVudCo+KG1fb2JqZWN0LT5ub2RlKCkpOworICAgIHJldHVy
biAwOworfQorICAgIAordm9pZCBBbmltYXRpb25CYXNlOjp1cGRhdGVTdGF0ZU1hY2hpbmUoQW5p
bVN0YXRlSW5wdXQgaW5wdXQsIGRvdWJsZSBwYXJhbSkKK3sKKyAgICAvLyBJZiB3ZSBnZXQgYSBS
RVNUQVJUIHRoZW4gd2UgZm9yY2UgYSBuZXcgYW5pbWF0aW9uLCByZWdhcmRsZXNzIG9mIHN0YXRl
CisgICAgaWYgKGlucHV0ID09IFNUQVRFX0lOUFVUX01BS0VfTkVXKSB7CisgICAgICAgIGlmICht
X2FuaW1TdGF0ZSA9PSBTVEFURV9TVEFSVF9XQUlUX1NUWUxFX0FWQUlMQUJMRSkKKyAgICAgICAg
ICAgIG1fY29tcEFuaW0tPnNldFdhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZShmYWxzZSk7CisgICAg
ICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfTkVXOworICAgICAgICBtX3N0YXJ0VGltZSA9IDA7Cisg
ICAgICAgIG1fcGF1c2VUaW1lID0gLTE7CisgICAgICAgIG1fd2FpdGVkRm9yUmVzcG9uc2UgPSBm
YWxzZTsKKyAgICAgICAgZW5kQW5pbWF0aW9uKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKyAgICBlbHNlIGlmIChpbnB1dCA9PSBTVEFURV9JTlBVVF9SRVNUQVJUX0FOSU1BVElPTikg
eworICAgICAgICBjYW5jZWxUaW1lcnMoKTsKKyAgICAgICAgaWYgKG1fYW5pbVN0YXRlID09IFNU
QVRFX1NUQVJUX1dBSVRfU1RZTEVfQVZBSUxBQkxFKQorICAgICAgICAgICAgbV9jb21wQW5pbS0+
c2V0V2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKGZhbHNlKTsKKyAgICAgICAgbV9hbmltU3RhdGUg
PSBTVEFURV9ORVc7CisgICAgICAgIG1fc3RhcnRUaW1lID0gMDsKKyAgICAgICAgbV9wYXVzZVRp
bWUgPSAtMTsKKyAgICAgICAgZW5kQW5pbWF0aW9uKGZhbHNlKTsKKyAgICAgICAgCisgICAgICAg
IGlmICghcGF1c2VkKCkpCisgICAgICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUoU1RBVEVfSU5Q
VVRfU1RBUlRfQU5JTUFUSU9OLCAtMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxz
ZSBpZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfRU5EX0FOSU1BVElPTikgeworICAgICAgICBjYW5j
ZWxUaW1lcnMoKTsKKyAgICAgICAgaWYgKG1fYW5pbVN0YXRlID09IFNUQVRFX1NUQVJUX1dBSVRf
U1RZTEVfQVZBSUxBQkxFKQorICAgICAgICAgICAgbV9jb21wQW5pbS0+c2V0V2FpdGluZ0ZvclN0
eWxlQXZhaWxhYmxlKGZhbHNlKTsKKyAgICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9ET05FOwor
ICAgICAgICBlbmRBbmltYXRpb24odHJ1ZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAg
ZWxzZSBpZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfUEFVU0VfT1ZFUlJJREUpIHsKKyAgICAgICAg
aWYgKG1fYW5pbVN0YXRlID09IFNUQVRFX1NUQVJUX1dBSVRfUkVTUE9OU0UpIHsKKyAgICAgICAg
ICAgIC8vIElmIHdlIGFyZSBpbiB0aGUgV0FJVF9SRVNQT05TRSBzdGF0ZSwgdGhlIGFuaW1hdGlv
biB3aWxsIGdldCBjYW5jZWxlZCBiZWZvcmUgCisgICAgICAgICAgICAvLyB3ZSBnZXQgYSByZXNw
b25zZSwgc28gbW92ZSB0byB0aGUgbmV4dCBzdGF0ZQorICAgICAgICAgICAgZW5kQW5pbWF0aW9u
KGZhbHNlKTsKKyAgICAgICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFURV9JTlBVVF9TVEFS
VF9USU1FX1NFVCwgY3VycmVudFRpbWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKyAgICBlbHNlIGlmIChpbnB1dCA9PSBTVEFURV9JTlBVVF9SRVNVTUVfT1ZFUlJJREUp
IHsKKyAgICAgICAgaWYgKG1fYW5pbVN0YXRlID09IFNUQVRFX0xPT1BJTkcgfHwgbV9hbmltU3Rh
dGUgPT0gU1RBVEVfRU5ESU5HKSB7CisgICAgICAgICAgICAvLyBTdGFydCB0aGUgYW5pbWF0aW9u
CisgICAgICAgICAgICBzdGFydEFuaW1hdGlvbihtX3N0YXJ0VGltZSk7CisgICAgICAgIH0KKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICAvLyBFeGVjdXRlIHN0YXRlIG1hY2hpbmUK
KyAgICBzd2l0Y2gobV9hbmltU3RhdGUpIHsKKyAgICAgICAgY2FzZSBTVEFURV9ORVc6CisgICAg
ICAgICAgICBBU1NFUlQoaW5wdXQgPT0gU1RBVEVfSU5QVVRfU1RBUlRfQU5JTUFUSU9OIHx8IGlu
cHV0ID09IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUlVOTklORyB8fCBpbnB1dCA9PSBTVEFURV9J
TlBVVF9QTEFZX1NUQVRFX1BBVVNFRCk7CisgICAgICAgICAgICBpZiAoaW5wdXQgPT0gU1RBVEVf
SU5QVVRfU1RBUlRfQU5JTUFUSU9OIHx8IGlucHV0ID09IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVf
UlVOTklORykgeworICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgc3RhcnQgdGltZXIgdG8gdGhl
IGluaXRpYWwgZGVsYXkgKDAgaWYgbm8gZGVsYXkpCisgICAgICAgICAgICAgICAgbV93YWl0ZWRG
b3JSZXNwb25zZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVf
U1RBUlRfV0FJVF9USU1FUjsKKyAgICAgICAgICAgICAgICBtX2FuaW1hdGlvblRpbWVyQ2FsbGJh
Y2suc3RhcnRUaW1lcihtX2FuaW1hdGlvbi0+ZGVsYXkoKSwgRXZlbnROYW1lczo6d2Via2l0QW5p
bWF0aW9uU3RhcnRFdmVudCwgbV9hbmltYXRpb24tPmRlbGF5KCkpOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfU1RBUlRfV0FJVF9USU1FUjoK
KyAgICAgICAgICAgIEFTU0VSVChpbnB1dCA9PSBTVEFURV9JTlBVVF9TVEFSVF9USU1FUl9GSVJF
RCB8fCBpbnB1dCA9PSBTVEFURV9JTlBVVF9QTEFZX1NUQVRFX1BBVVNFRCk7CisgICAgICAgICAg
ICAKKyAgICAgICAgICAgIGlmIChpbnB1dCA9PSBTVEFURV9JTlBVVF9TVEFSVF9USU1FUl9GSVJF
RCkgeworICAgICAgICAgICAgICAgIEFTU0VSVChwYXJhbSA+PSAwKTsKKyAgICAgICAgICAgICAg
ICAvLyBTdGFydCB0aW1lciBoYXMgZmlyZWQsIHRlbGwgdGhlIGFuaW1hdGlvbiB0byBzdGFydCBh
bmQgd2FpdCBmb3IgaXQgdG8gcmVzcG9uZCB3aXRoIHN0YXJ0IHRpbWUKKyAgICAgICAgICAgICAg
ICBtX2FuaW1TdGF0ZSA9IFNUQVRFX1NUQVJUX1dBSVRfU1RZTEVfQVZBSUxBQkxFOworICAgICAg
ICAgICAgICAgIG1fY29tcEFuaW0tPnNldFdhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZSh0cnVlKTsK
KyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGEgcmVuZGVyIHNv
IHdlIGNhbiBzdGFydCB0aGUgYW5pbWF0aW9uCisgICAgICAgICAgICAgICAgc2V0Q2hhbmdlZCht
X29iamVjdC0+ZWxlbWVudCgpKTsKKyAgICAgICAgICAgICAgICBtX29iamVjdC0+YW5pbWF0aW9u
KCktPnN0YXJ0VXBkYXRlUmVuZGVyaW5nRGlzcGF0Y2hlcigpOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKHJ1bm5pbmcoKSk7CisgICAg
ICAgICAgICAgICAgLy8gV2UncmUgd2FpdGluZyBmb3IgdGhlIHN0YXJ0IHRpbWVyIHRvIGZpcmUg
YW5kIHdlIGdvdCBhIHBhdXNlLiBDYW5jZWwgdGhlIHRpbWVyLCBwYXVzZSBhbmQgd2FpdAorICAg
ICAgICAgICAgICAgIG1fcGF1c2VUaW1lID0gY3VycmVudFRpbWUoKTsKKyAgICAgICAgICAgICAg
ICBjYW5jZWxUaW1lcnMoKTsKKyAgICAgICAgICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX1BB
VVNFRF9XQUlUX1RJTUVSOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIGNhc2UgU1RBVEVfU1RBUlRfV0FJVF9TVFlMRV9BVkFJTEFCTEU6CisgICAgICAgICAgICBB
U1NFUlQoaW5wdXQgPT0gU1RBVEVfSU5QVVRfU1RZTEVfQVZBSUxBQkxFIHx8IGlucHV0ID09IFNU
QVRFX0lOUFVUX1BMQVlfU1RBVEVfUEFVU0VEKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAg
bV9jb21wQW5pbS0+c2V0V2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKGZhbHNlKTsKKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgaWYgKGlucHV0ID09IFNUQVRFX0lOUFVUX1NUWUxFX0FWQUlMQUJM
RSkgeworICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHRpbWVyIGhhcyBmaXJlZCwgdGVsbCB0aGUg
YW5pbWF0aW9uIHRvIHN0YXJ0IGFuZCB3YWl0IGZvciBpdCB0byByZXNwb25kIHdpdGggc3RhcnQg
dGltZQorICAgICAgICAgICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfU1RBUlRfV0FJVF9SRVNQ
T05TRTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBvdmVycmlkZUFuaW1hdGlv
bnMoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBTZW5kIHN0YXJ0IGV2
ZW50LCBpZiBuZWVkZWQKKyAgICAgICAgICAgICAgICBvbkFuaW1hdGlvblN0YXJ0KDAuMGYpOyAv
LyBUaGUgZWxhcHNlZFRpbWUgaXMgYWx3YXlzIDAgaGVyZQorICAgICAgICAgICAgICAgIAorICAg
ICAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBhbmltYXRpb24KKyAgICAgICAgICAgICAgICBpZiAo
b3ZlcnJpZGRlbigpIHx8ICFzdGFydEFuaW1hdGlvbigwKSkgeworICAgICAgICAgICAgICAgICAg
ICAvLyBXZSdyZSBub3QgZ29pbmcgdG8gZ2V0IGEgc3RhcnRUaW1lIGNhbGxiYWNrLCBzbyBmaXJl
IHRoZSBzdGFydCB0aW1lIGhlcmUKKyAgICAgICAgICAgICAgICAgICAgbV9hbmltU3RhdGUgPSBT
VEFURV9TVEFSVF9XQUlUX1JFU1BPTlNFOworICAgICAgICAgICAgICAgICAgICB1cGRhdGVTdGF0
ZU1hY2hpbmUoU1RBVEVfSU5QVVRfU1RBUlRfVElNRV9TRVQsIGN1cnJlbnRUaW1lKCkpOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAg
IG1fd2FpdGVkRm9yUmVzcG9uc2UgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
ZWxzZSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKHJ1bm5pbmcoKSk7CisgICAgICAgICAgICAg
ICAgLy8gV2UncmUgd2FpdGluZyBmb3IgdGhlIGEgbm90aWZpY2F0aW9uIHRoYXQgdGhlIHN0eWxl
IGhhcyBiZWVuIHNldHVwLiBJZiB3ZSdyZSBhc2tlZCB0byB3YWl0CisgICAgICAgICAgICAgICAg
Ly8gYXQgdGhpcyBwb2ludCwgdGhlIHN0eWxlIG11c3QgaGF2ZSBiZWVuIHByb2Nlc3NlZCwgc28g
d2UgY2FuIGRlYWwgd2l0aCB0aGlzIGxpa2Ugd2Ugd291bGQKKyAgICAgICAgICAgICAgICAvLyBm
b3IgV0FJVF9SRVNQT05TRSwgZXhjZXB0IHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbiBlbmRB
bmltYXRpb24oKS4KKyAgICAgICAgICAgICAgICBtX3BhdXNlVGltZSA9IDA7CisgICAgICAgICAg
ICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9TVEFSVF9XQUlUX1JFU1BPTlNFOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfU1RBUlRfV0FJVF9S
RVNQT05TRToKKyAgICAgICAgICAgIEFTU0VSVChpbnB1dCA9PSBTVEFURV9JTlBVVF9TVEFSVF9U
SU1FX1NFVCB8fCBpbnB1dCA9PSBTVEFURV9JTlBVVF9QTEFZX1NUQVRFX1BBVVNFRCk7CisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIGlmIChpbnB1dCA9PSBTVEFURV9JTlBVVF9TVEFSVF9USU1F
X1NFVCkgeworICAgICAgICAgICAgICAgIEFTU0VSVChwYXJhbSA+PSAwKTsKKyAgICAgICAgICAg
ICAgICAvLyBXZSBoYXZlIGEgc3RhcnQgdGltZSwgc2V0IGl0LCB1bmxlc3MgdGhlIHN0YXJ0VGlt
ZSBpcyBhbHJlYWR5IHNldAorICAgICAgICAgICAgICAgIGlmIChtX3N0YXJ0VGltZSA8PSAwKQor
ICAgICAgICAgICAgICAgICAgICBtX3N0YXJ0VGltZSA9IHBhcmFtOworICAgICAgICAgICAgICAg
IAorICAgICAgICAgICAgICAgIC8vIERlY2lkZSB3aGVuIHRoZSBlbmQgb3IgbG9vcCBldmVudCBu
ZWVkcyB0byBmaXJlCisgICAgICAgICAgICAgICAgcHJpbWVFdmVudFRpbWVycygpOworICAgICAg
ICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFRyaWdnZXIgYSByZW5kZXIgc28gd2UgY2Fu
IHN0YXJ0IHRoZSBhbmltYXRpb24KKyAgICAgICAgICAgICAgICBzZXRDaGFuZ2VkKG1fb2JqZWN0
LT5lbGVtZW50KCkpOworICAgICAgICAgICAgICAgIG1fb2JqZWN0LT5hbmltYXRpb24oKS0+c3Rh
cnRVcGRhdGVSZW5kZXJpbmdEaXNwYXRjaGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBhcmUgcGF1c2luZyB3aGlsZSB3YWl0aW5n
IGZvciBhIHN0YXJ0IHJlc3BvbnNlLiBDYW5jZWwgdGhlIGFuaW1hdGlvbiBhbmQgd2FpdC4gV2hl
biAKKyAgICAgICAgICAgICAgICAvLyB3ZSB1bnBhdXNlLCB3ZSB3aWxsIGFjdCBhcyB0aG91Z2gg
dGhlIHN0YXJ0IHRpbWVyIGp1c3QgZmlyZWQKKyAgICAgICAgICAgICAgICBtX3BhdXNlVGltZSA9
IDA7CisgICAgICAgICAgICAgICAgZW5kQW5pbWF0aW9uKGZhbHNlKTsKKyAgICAgICAgICAgICAg
ICBtX2FuaW1TdGF0ZSA9IFNUQVRFX1BBVVNFRF9XQUlUX1JFU1BPTlNFOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfTE9PUElORzoKKyAgICAg
ICAgICAgIEFTU0VSVChpbnB1dCA9PSBTVEFURV9JTlBVVF9MT09QX1RJTUVSX0ZJUkVEIHx8IGlu
cHV0ID09IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUEFVU0VEKTsKKyAgICAgICAgICAgIAorICAg
ICAgICAgICAgaWYgKGlucHV0ID09IFNUQVRFX0lOUFVUX0xPT1BfVElNRVJfRklSRUQpIHsKKyAg
ICAgICAgICAgICAgICBBU1NFUlQocGFyYW0gPj0gMCk7CisgICAgICAgICAgICAgICAgLy8gTG9v
cCB0aW1lciBmaXJlZCwgbG9vcCBhZ2FpbiBvciBlbmQuCisgICAgICAgICAgICAgICAgb25Bbmlt
YXRpb25JdGVyYXRpb24ocGFyYW0pOworICAgICAgICAgICAgICAgIHByaW1lRXZlbnRUaW1lcnMo
KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8v
IFdlIGFyZSBwYXVzaW5nIHdoaWxlIHJ1bm5pbmcuIENhbmNlbCB0aGUgYW5pbWF0aW9uIGFuZCB3
YWl0CisgICAgICAgICAgICAgICAgbV9wYXVzZVRpbWUgPSBjdXJyZW50VGltZSgpOworICAgICAg
ICAgICAgICAgIGNhbmNlbFRpbWVycygpOworICAgICAgICAgICAgICAgIGVuZEFuaW1hdGlvbihm
YWxzZSk7CisgICAgICAgICAgICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9QQVVTRURfUlVOOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfRU5E
SU5HOgorICAgICAgICAgICAgQVNTRVJUKGlucHV0ID09IFNUQVRFX0lOUFVUX0VORF9USU1FUl9G
SVJFRCB8fCBpbnB1dCA9PSBTVEFURV9JTlBVVF9QTEFZX1NUQVRFX1BBVVNFRCk7CisgICAgICAg
ICAgICAKKyAgICAgICAgICAgIGlmIChpbnB1dCA9PSBTVEFURV9JTlBVVF9FTkRfVElNRVJfRklS
RUQpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQocGFyYW0gPj0gMCk7CisgICAgICAgICAgICAg
ICAgLy8gRW5kIHRpbWVyIGZpcmVkLCBmaW5pc2ggdXAKKyAgICAgICAgICAgICAgICBvbkFuaW1h
dGlvbkVuZChwYXJhbSk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgcmVzdW1l
T3ZlcnJpZGRlbkFuaW1hdGlvbnMoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAg
ICAvLyBGaXJlIG9mZiBhbm90aGVyIHN0eWxlIGNoYW5nZSBzbyB3ZSBjYW4gc2V0IHRoZSBmaW5h
bCB2YWx1ZQorICAgICAgICAgICAgICAgIHNldENoYW5nZWQobV9vYmplY3QtPmVsZW1lbnQoKSk7
CisgICAgICAgICAgICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9ET05FOworICAgICAgICAgICAg
ICAgIG1fb2JqZWN0LT5hbmltYXRpb24oKS0+c3RhcnRVcGRhdGVSZW5kZXJpbmdEaXNwYXRjaGVy
KCk7CisgICAgICAgICAgICAgICAgLy8gfHRoaXN8IG1heSBiZSBkZWxldGVkIGhlcmUgd2hlbiB3
ZSd2ZSBiZWVuIGNhbGxlZCBmcm9tIHRpbWVyRmlyZWQoKQorICAgICAgICAgICAgfQorICAgICAg
ICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIHBhdXNpbmcgd2hpbGUgcnVu
bmluZy4gQ2FuY2VsIHRoZSBhbmltYXRpb24gYW5kIHdhaXQKKyAgICAgICAgICAgICAgICBtX3Bh
dXNlVGltZSA9IGN1cnJlbnRUaW1lKCk7CisgICAgICAgICAgICAgICAgY2FuY2VsVGltZXJzKCk7
CisgICAgICAgICAgICAgICAgZW5kQW5pbWF0aW9uKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBt
X2FuaW1TdGF0ZSA9IFNUQVRFX1BBVVNFRF9SVU47CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICAvLyB8dGhpc3wgbWF5IGJlIGRlbGV0ZWQgaGVyZQorICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIGNhc2UgU1RBVEVfUEFVU0VEX1dBSVRfVElNRVI6CisgICAgICAgICAgICBBU1NFUlQoaW5w
dXQgPT0gU1RBVEVfSU5QVVRfUExBWV9TVEFURV9SVU5OSU5HKTsKKyAgICAgICAgICAgIEFTU0VS
VCghcnVubmluZygpKTsKKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgdGltZXMKKyAgICAgICAg
ICAgIG1fc3RhcnRUaW1lICs9IGN1cnJlbnRUaW1lKCkgLSBtX3BhdXNlVGltZTsKKyAgICAgICAg
ICAgIG1fcGF1c2VUaW1lID0gLTE7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIHdlIHdl
cmUgd2FpdGluZyBmb3IgdGhlIHN0YXJ0IHRpbWVyIHRvIGZpcmUsIGdvIGJhY2sgYW5kIHdhaXQg
YWdhaW4KKyAgICAgICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfTkVXOworICAgICAgICAgICAg
dXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVUX1NUQVJUX0FOSU1BVElPTiwgMCk7CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9QQVVTRURfV0FJVF9SRVNQT05TRToK
KyAgICAgICAgY2FzZSBTVEFURV9QQVVTRURfUlVOOgorICAgICAgICAgICAgLy8gV2UgdHJlYXQg
dGhlc2UgdHdvIGNhc2VzIHRoZSBzYW1lLiBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHRoYXQsIHdo
ZW4gd2UgYXJlIGluIHRoZSBXQUlUX1JFU1BPTlNFCisgICAgICAgICAgICAvLyBzdGF0ZSwgd2Ug
ZG9uJ3QgeWV0IGhhdmUgYSB2YWxpZCBzdGFydFRpbWUsIHNvIHdlIHNlbmQgMCB0byBzdGFydEFu
aW1hdGlvbi4gV2hlbiB0aGUgU1RBUlRfVElNRQorICAgICAgICAgICAgLy8gZXZlbnQgY29tZXMg
aW4gcW5kIHdlIHdlcmUgaW4gdGhlIFJVTiBzdGF0ZSwgd2Ugd2lsbCBub3RpY2UgdGhhdCB3ZSBo
YXZlIGFscmVhZHkgc2V0IHRoZSAKKyAgICAgICAgICAgIC8vIHN0YXJ0VGltZSBhbmQgd2lsbCBp
Z25vcmUgaXQuCisgICAgICAgICAgICBBU1NFUlQoaW5wdXQgPT0gU1RBVEVfSU5QVVRfUExBWV9T
VEFURV9SVU5OSU5HKTsKKyAgICAgICAgICAgIEFTU0VSVCghcnVubmluZygpKTsKKyAgICAgICAg
ICAgIC8vIFVwZGF0ZSB0aGUgdGltZXMKKyAgICAgICAgICAgIGlmIChtX2FuaW1TdGF0ZSA9PSBT
VEFURV9QQVVTRURfUlVOKQorICAgICAgICAgICAgICAgIG1fc3RhcnRUaW1lICs9IGN1cnJlbnRU
aW1lKCkgLSBtX3BhdXNlVGltZTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBt
X3N0YXJ0VGltZSA9IDA7CisgICAgICAgICAgICBtX3BhdXNlVGltZSA9IC0xOworICAgICAgICAg
ICAgCisgICAgICAgICAgICAvLyBXZSB3ZXJlIHdhaXRpbmcgZm9yIGEgYmVnaW4gdGltZSByZXNw
b25zZSBmcm9tIHRoZSBhbmltYXRpb24sIGdvIGJhY2sgYW5kIHdhaXQgYWdhaW4KKyAgICAgICAg
ICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfU1RBUlRfV0FJVF9SRVNQT05TRTsKKyAgICAgICAgICAg
IAorICAgICAgICAgICAgLy8gU3RhcnQgdGhlIGFuaW1hdGlvbgorICAgICAgICAgICAgaWYgKG92
ZXJyaWRkZW4oKSB8fCAhc3RhcnRBbmltYXRpb24obV9zdGFydFRpbWUpKSB7CisgICAgICAgICAg
ICAgICAgLy8gV2UncmUgbm90IGdvaW5nIHRvIGdldCBhIHN0YXJ0VGltZSBjYWxsYmFjaywgc28g
ZmlyZSB0aGUgc3RhcnQgdGltZSBoZXJlCisgICAgICAgICAgICAgICAgdXBkYXRlU3RhdGVNYWNo
aW5lKFNUQVRFX0lOUFVUX1NUQVJUX1RJTUVfU0VULCBjdXJyZW50VGltZSgpKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBtX3dhaXRlZEZvclJlc3Bv
bnNlID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX0RPTkU6
CisgICAgICAgICAgICAvLyBXZSdyZSBkb25lLiBTdGF5IGluIHRoaXMgc3RhdGUgdW50aWwgd2Ug
YXJlIGRlbGV0ZWQKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyB8dGhpc3wgbWF5
IGJlIGRlbGV0ZWQgaGVyZSBpZiB3ZSBjYW1lIG91dCBvZiBTVEFURV9FTkRJTkcgd2hlbiB3ZSd2
ZSBiZWVuIGNhbGxlZCBmcm9tIHRpbWVyRmlyZWQoKQorfQorICAgIAordm9pZCBBbmltYXRpb25C
YXNlOjphbmltYXRpb25UaW1lckNhbGxiYWNrRmlyZWQoY29uc3QgQXRvbWljU3RyaW5nJiBldmVu
dFR5cGUsIGRvdWJsZSBlbGFwc2VkVGltZSkKK3sKKyAgICBBU1NFUlQobV9vYmplY3QtPmRvY3Vt
ZW50KCkgJiYgIW1fb2JqZWN0LT5kb2N1bWVudCgpLT5pblBhZ2VDYWNoZSgpKTsKKyAgICAKKyAg
ICAvLyBGSVhNRTogdXNlIGFuIGVudW0KKyAgICBpZiAoZXZlbnRUeXBlID09IEV2ZW50TmFtZXM6
OndlYmtpdEFuaW1hdGlvblN0YXJ0RXZlbnQpCisgICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShT
VEFURV9JTlBVVF9TVEFSVF9USU1FUl9GSVJFRCwgZWxhcHNlZFRpbWUpOworICAgIGVsc2UgaWYg
KGV2ZW50VHlwZSA9PSBFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRpb25JdGVyYXRpb25FdmVudCkK
KyAgICAgICAgdXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVUX0xPT1BfVElNRVJfRklSRUQs
IGVsYXBzZWRUaW1lKTsKKyAgICBlbHNlIGlmIChldmVudFR5cGUgPT0gRXZlbnROYW1lczo6d2Vi
a2l0QW5pbWF0aW9uRW5kRXZlbnQpIHsKKyAgICAgICAgdXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRF
X0lOUFVUX0VORF9USU1FUl9GSVJFRCwgZWxhcHNlZFRpbWUpOworICAgICAgICAvLyB8dGhpc3wg
bWF5IGJlIGRlbGV0ZWQgaGVyZQorICAgIH0KK30KKwordm9pZCBBbmltYXRpb25CYXNlOjphbmlt
YXRpb25FdmVudERpc3BhdGNoZXJGaXJlZChFbGVtZW50KiBlbGVtZW50LCBjb25zdCBBdG9taWNT
dHJpbmcmIG5hbWUsIGludCBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXNldCwgY29uc3QgQXRvbWljU3RyaW5nJiBldmVu
dFR5cGUsIGRvdWJsZSBlbGFwc2VkVGltZSkKK3sKKyAgICBtX3dhaXRpbmdGb3JFbmRFdmVudCA9
IGZhbHNlOworICAgIAorICAgIC8vIEtlZXAgYW4gYXRvbWljIHN0cmluZyBvbiB0aGUgc3RhY2sg
dG8ga2VlcCBpdCBhbGl2ZSB1bnRpbCB3ZSBleGl0IHRoaXMgbWV0aG9kCisgICAgLy8gKHNpbmNl
IGRpc3BhdGNoaW5nIHRoZSBldmVudCBtYXkgY2F1c2UgfHRoaXN8IHRvIGJlIGRlbGV0ZWQsIHRo
ZXJlZm9yZSByZW1vdmluZworICAgIC8vIHRoZSBsYXN0IHJlZiB0byB0aGUgYXRvbWljIHN0cmlu
ZykuCisgICAgQXRvbWljU3RyaW5nIGFuaW1OYW1lKG5hbWUpOworICAgIEF0b21pY1N0cmluZyBh
bmltRXZlbnRUeXBlKGV2ZW50VHlwZSk7CisgICAgLy8gTWFrZSBzdXJlIHRoZSBlbGVtZW50IHN0
aWNrcyBhcm91bmQgdG9vCisgICAgUmVmUHRyPEVsZW1lbnQ+IGVsZW1lbnRSZXRhaW5lcihlbGVt
ZW50KTsKKyAgICAKKyAgICBBU1NFUlQoIWVsZW1lbnQgfHwgKGVsZW1lbnQtPmRvY3VtZW50KCkg
JiYgIWVsZW1lbnQtPmRvY3VtZW50KCktPmluUGFnZUNhY2hlKCkpKTsKKyAgICBpZiAoIWVsZW1l
bnQpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChldmVudFR5cGUgPT0gRXZlbnROYW1lczo6
d2Via2l0VHJhbnNpdGlvbkVuZEV2ZW50KQorICAgICAgICBlbGVtZW50LT5kaXNwYXRjaFdlYktp
dFRyYW5zaXRpb25FdmVudChldmVudFR5cGUsIG5hbWUsIGVsYXBzZWRUaW1lKTsKKyAgICBlbHNl
CisgICAgICAgIGVsZW1lbnQtPmRpc3BhdGNoV2ViS2l0QW5pbWF0aW9uRXZlbnQoZXZlbnRUeXBl
LCBuYW1lLCBlbGFwc2VkVGltZSk7CisKKyAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCAodW5h
bmltYXRlZCkgc3R5bGUKKyAgICBpZiAoYW5pbUV2ZW50VHlwZSA9PSBFdmVudE5hbWVzOjp3ZWJr
aXRBbmltYXRpb25FbmRFdmVudCkKKyAgICAgICAgaWYgKGVsZW1lbnQtPnJlbmRlcmVyKCkpCisg
ICAgICAgICAgICBzZXRDaGFuZ2VkKGVsZW1lbnQtPnJlbmRlcmVyKCktPmVsZW1lbnQoKSk7Cit9
CisKK3ZvaWQgQW5pbWF0aW9uQmFzZTo6dXBkYXRlUGxheVN0YXRlKGJvb2wgcnVuKQoreworICAg
IGlmIChwYXVzZWQoKSA9PSBydW4gfHwgaXNOZXcoKSkKKyAgICAgICAgdXBkYXRlU3RhdGVNYWNo
aW5lKHJ1biA/IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUlVOTklORyA6IFNUQVRFX0lOUFVUX1BM
QVlfU1RBVEVfUEFVU0VELCAtMSk7Cit9CisKK2RvdWJsZSBBbmltYXRpb25CYXNlOjpwcm9ncmVz
cyhkb3VibGUgc2NhbGUsIGRvdWJsZSBvZmZzZXQpIGNvbnN0Cit7CisgICAgaWYgKHByZUFjdGl2
ZSgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICBkb3VibGUgZWxhcHNlZFRpbWUgPSBy
dW5uaW5nKCkgPyAoY3VycmVudFRpbWUoKSAtIG1fc3RhcnRUaW1lKSA6IChtX3BhdXNlVGltZSAt
IG1fc3RhcnRUaW1lKTsKKyAgICBpZiAocnVubmluZygpICYmIGVsYXBzZWRUaW1lIDwgMCkKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgZG91YmxlIGR1ciA9IG1fYW5pbWF0aW9uLT5kdXJh
dGlvbigpOworICAgIGlmIChtX2FuaW1hdGlvbi0+aXRlcmF0aW9uQ291bnQoKSA+IDApCisgICAg
ICAgIGR1ciAqPSBtX2FuaW1hdGlvbi0+aXRlcmF0aW9uQ291bnQoKTsKKyAgICAKKyAgICBpZiAo
cG9zdEFjdGl2ZSgpIHx8ICFtX2FuaW1hdGlvbi0+ZHVyYXRpb24oKSB8fCAobV9hbmltYXRpb24t
Pml0ZXJhdGlvbkNvdW50KCkgPiAwICYmIGVsYXBzZWRUaW1lID49IGR1cikpCisgICAgICAgIHJl
dHVybiAxLjA7CisgICAgCisgICAgLy8gQ29tcHV0ZSB0aGUgZnJhY3Rpb25hbCB0aW1lLCB0YWtp
bmcgaW50byBhY2NvdW50IGRpcmVjdGlvbi4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHdv
cnJ5IGFib3V0IGl0ZXJhdGlvbnMsIHdlIGFzc3VtZSB0aGF0IHdlIHdvdWxkIGhhdmUKKyAgICAv
LyBzaG9ydCBjaXJjdWl0ZWQgYWJvdmUgaWYgd2Ugd2VyZSBkb25lCisgICAgZG91YmxlIGZyYWN0
aW9uYWxUaW1lID0gZWxhcHNlZFRpbWUgLyBtX2FuaW1hdGlvbi0+ZHVyYXRpb24oKTsKKyAgICBp
bnQgaW50ZWdyYWxUaW1lID0gKGludCkgZnJhY3Rpb25hbFRpbWU7CisgICAgZnJhY3Rpb25hbFRp
bWUgLT0gaW50ZWdyYWxUaW1lOworICAgIAorICAgIGlmIChtX2FuaW1hdGlvbi0+ZGlyZWN0aW9u
KCkgJiYgKGludGVncmFsVGltZSAmIDEpKQorICAgICAgICBmcmFjdGlvbmFsVGltZSA9IDEgLSBm
cmFjdGlvbmFsVGltZTsKKyAgICAKKyAgICBpZiAoc2NhbGUgIT0gMSB8fCBvZmZzZXQgIT0gMCkK
KyAgICAgICAgZnJhY3Rpb25hbFRpbWUgPSAoZnJhY3Rpb25hbFRpbWUgLSBvZmZzZXQpICogc2Nh
bGU7CisgICAgCisgICAgaWYgKG1fYW5pbWF0aW9uLT50aW1pbmdGdW5jdGlvbigpLnR5cGUoKSA9
PSBMaW5lYXJUaW1pbmdGdW5jdGlvbikKKyAgICAgICAgcmV0dXJuIGZyYWN0aW9uYWxUaW1lOwor
ICAgIAorICAgIC8vIEN1YmljIGJlemllci4KKyAgICBkb3VibGUgcmVzdWx0ID0gc29sdmVDdWJp
Y0JlemllckZ1bmN0aW9uKG1fYW5pbWF0aW9uLT50aW1pbmdGdW5jdGlvbigpLngxKCksCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYW5pbWF0aW9uLT50aW1p
bmdGdW5jdGlvbigpLnkxKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIG1fYW5pbWF0aW9uLT50aW1pbmdGdW5jdGlvbigpLngyKCksCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fYW5pbWF0aW9uLT50aW1pbmdGdW5jdGlv
bigpLnkyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZy
YWN0aW9uYWxUaW1lLCBtX2FuaW1hdGlvbi0+ZHVyYXRpb24oKSk7CisgICAgcmV0dXJuIHJlc3Vs
dDsKK30KKwordm9pZCBBbmltYXRpb25CYXNlOjpwcmltZUV2ZW50VGltZXJzKCkKK3sKKyAgICAv
LyBEZWNpZGUgd2hlbiB0aGUgZW5kIG9yIGxvb3AgZXZlbnQgbmVlZHMgdG8gZmlyZQorICAgIGRv
dWJsZSBjdCA9IGN1cnJlbnRUaW1lKCk7CisgICAgY29uc3QgZG91YmxlIGVsYXBzZWREdXJhdGlv
biA9IGN0IC0gbV9zdGFydFRpbWU7CisgICAgQVNTRVJUKGVsYXBzZWREdXJhdGlvbiA+PSAwKTsK
KyAgICAKKyAgICBkb3VibGUgdG90YWxEdXJhdGlvbiA9IC0xOworICAgIGlmIChtX2FuaW1hdGlv
bi0+aXRlcmF0aW9uQ291bnQoKSA+IDApCisgICAgICAgIHRvdGFsRHVyYXRpb24gPSBtX2FuaW1h
dGlvbi0+ZHVyYXRpb24oKSAqIG1fYW5pbWF0aW9uLT5pdGVyYXRpb25Db3VudCgpOworCisgICAg
ZG91YmxlIGR1cmF0aW9uTGVmdCA9IDA7CisgICAgZG91YmxlIG5leHRJdGVyYXRpb25UaW1lID0g
dG90YWxEdXJhdGlvbjsKKyAgICBpZiAodG90YWxEdXJhdGlvbiA8IDAgfHwgZWxhcHNlZER1cmF0
aW9uIDwgdG90YWxEdXJhdGlvbikgeworICAgICAgICBkdXJhdGlvbkxlZnQgPSBtX2FuaW1hdGlv
bi0+ZHVyYXRpb24oKSAtIGZtb2QoZWxhcHNlZER1cmF0aW9uLCBtX2FuaW1hdGlvbi0+ZHVyYXRp
b24oKSk7CisgICAgICAgIG5leHRJdGVyYXRpb25UaW1lID0gZWxhcHNlZER1cmF0aW9uICsgZHVy
YXRpb25MZWZ0OworICAgIH0KKyAgICAKKyAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBtYXkgaGF2
ZSAwIGR1cmF0aW9uTGVmdCwgaWYgd2UndmUgZ290dGVuIHRoZSBldmVudCBsYXRlIGFuZCB3ZSBh
cmUgYWxyZWFkeQorICAgIC8vIHBhc3QgdG90YWxEdXJhdGlvbi4gSW4gdGhpcyBjYXNlIHdlIHN0
aWxsIGZpcmUgYW4gZW5kIHRpbWVyIGJlZm9yZSBwcm9jZXNzaW5nIHRoZSBlbmQuIAorICAgIC8v
IFRoaXMgZGVmZXJzIHRoZSBjYWxsIHRvIHNlbmRBbmltYXRpb25FdmVudHMgdG8gYXZvaWQgcmUt
ZW50cmFudCBjYWxscyB0aGF0IGRlc3Ryb3kKKyAgICAvLyB0aGUgUmVuZGVyT2JqZWN0LCBhbmQg
dGhlcmVmb3JlIHx0aGlzfCBiZWZvcmUgd2UncmUgZG9uZSB3aXRoIGl0LgorICAgIGlmICh0b3Rh
bER1cmF0aW9uIDwgMCB8fCBuZXh0SXRlcmF0aW9uVGltZSA8IHRvdGFsRHVyYXRpb24pIHsKKyAg
ICAgICAgLy8gV2UgYXJlIG5vdCBhdCB0aGUgZW5kIHlldCwgc2VuZCBhIGxvb3AgZXZlbnQKKyAg
ICAgICAgQVNTRVJUKG5leHRJdGVyYXRpb25UaW1lID4gMCk7CisgICAgICAgIG1fYW5pbVN0YXRl
ID0gU1RBVEVfTE9PUElORzsKKyAgICAgICAgbV9hbmltYXRpb25UaW1lckNhbGxiYWNrLnN0YXJ0
VGltZXIoZHVyYXRpb25MZWZ0LCBFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRpb25JdGVyYXRpb25F
dmVudCwgbmV4dEl0ZXJhdGlvblRpbWUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLy8g
V2UgYXJlIGF0IHRoZSBlbmQsIHNlbmQgYW4gZW5kIGV2ZW50CisgICAgICAgIG1fYW5pbVN0YXRl
ID0gU1RBVEVfRU5ESU5HOworICAgICAgICBtX2FuaW1hdGlvblRpbWVyQ2FsbGJhY2suc3RhcnRU
aW1lcihkdXJhdGlvbkxlZnQsIEV2ZW50TmFtZXM6OndlYmtpdEFuaW1hdGlvbkVuZEV2ZW50LCBu
ZXh0SXRlcmF0aW9uVGltZSk7CisgICAgfQorfQorICAKK30KSW5kZXg6IFdlYkNvcmUvcGFnZS9h
bmltYXRpb24vQW5pbWF0aW9uQmFzZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGFnZS9hbmlt
YXRpb24vQW5pbWF0aW9uQmFzZS5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wYWdlL2FuaW1h
dGlvbi9BbmltYXRpb25CYXNlLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjk0IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0
ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0
b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisg
KiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw
ZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFO
RCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAor
ICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
T1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04g
QU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisj
aWZuZGVmIEFuaW1hdGlvbkJhc2VfaAorI2RlZmluZSBBbmltYXRpb25CYXNlX2gKKworI2luY2x1
ZGUgIlRpbWVyLmgiCisjaW5jbHVkZSAid3RmL0hhc2hNYXAuaCIKKyNpbmNsdWRlICJBdG9taWNT
dHJpbmcuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBBbmltYXRpb25Db250cm9s
bGVyOworY2xhc3MgQW5pbWF0aW9uQmFzZTsKK2NsYXNzIEltcGxpY2l0QW5pbWF0aW9uOworY2xh
c3MgS2V5ZnJhbWVBbmltYXRpb247CitjbGFzcyBDb21wb3NpdGVBbmltYXRpb247CitjbGFzcyBS
ZW5kZXJPYmplY3Q7CitjbGFzcyBSZW5kZXJTdHlsZTsKK2NsYXNzIEF0b21pY1N0cmluZ0ltcGw7
CitjbGFzcyBBbmltYXRpb247CitjbGFzcyBFbGVtZW50OworY2xhc3MgTm9kZTsKKworY2xhc3Mg
QW5pbWF0aW9uVGltZXJCYXNlIHsKK3B1YmxpYzoKKyAgICBBbmltYXRpb25UaW1lckJhc2UoQW5p
bWF0aW9uQmFzZSogYW5pbSkKKyAgICA6IG1fdGltZXIodGhpcywgJkFuaW1hdGlvblRpbWVyQmFz
ZTo6dGltZXJGaXJlZCkKKyAgICAsIG1fYW5pbShhbmltKQorICAgIHsKKyAgICAgICAgbV90aW1l
ci5zdGFydE9uZVNob3QoMCk7CisgICAgfQorICAgIHZpcnR1YWwgfkFuaW1hdGlvblRpbWVyQmFz
ZSgpCisgICAgeworICAgIH0KKyAgICAKKyAgICB2b2lkIHN0YXJ0VGltZXIoZG91YmxlIHRpbWVv
dXQ9MCkKKyAgICB7CisgICAgICAgIG1fdGltZXIuc3RhcnRPbmVTaG90KHRpbWVvdXQpOworICAg
IH0KKyAgICAKKyAgICB2b2lkIGNhbmNlbFRpbWVyKCkKKyAgICB7CisgICAgICAgIG1fdGltZXIu
c3RvcCgpOworICAgIH0KKyAgICAKKyAgICB2aXJ0dWFsIHZvaWQgdGltZXJGaXJlZChUaW1lcjxB
bmltYXRpb25UaW1lckJhc2U+KikgPSAwOworICAgIAorcHJpdmF0ZToKKyAgICBUaW1lcjxBbmlt
YXRpb25UaW1lckJhc2U+IG1fdGltZXI7CisgICAgCitwcm90ZWN0ZWQ6CisgICAgQW5pbWF0aW9u
QmFzZSogbV9hbmltOworfTsKKworY2xhc3MgQW5pbWF0aW9uRXZlbnREaXNwYXRjaGVyIDogcHVi
bGljIEFuaW1hdGlvblRpbWVyQmFzZSB7CitwdWJsaWM6CisgICAgQW5pbWF0aW9uRXZlbnREaXNw
YXRjaGVyKEFuaW1hdGlvbkJhc2UqIGFuaW0pOyAgICAKKyAgICB2aXJ0dWFsIH5BbmltYXRpb25F
dmVudERpc3BhdGNoZXIoKQorICAgIHsKKyAgICB9CisgICAgCisgICAgdm9pZCBzdGFydFRpbWVy
KEVsZW1lbnQqIGVsZW1lbnQsIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSwgaW50IHByb3BlcnR5
LCBib29sIHJlc2V0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIGV2
ZW50VHlwZSwgZG91YmxlIGVsYXBzZWRUaW1lKQorICAgIHsKKyAgICAgICAgbV9lbGVtZW50ID0g
ZWxlbWVudDsKKyAgICAgICAgbV9uYW1lID0gbmFtZTsKKyAgICAgICAgbV9wcm9wZXJ0eSA9IHBy
b3BlcnR5OworICAgICAgICBtX3Jlc2V0ID0gcmVzZXQ7CisgICAgICAgIG1fZXZlbnRUeXBlID0g
ZXZlbnRUeXBlOworICAgICAgICBtX2VsYXBzZWRUaW1lID0gZWxhcHNlZFRpbWU7CisgICAgICAg
IEFuaW1hdGlvblRpbWVyQmFzZTo6c3RhcnRUaW1lcigpOworICAgIH0KKyAgICAKKyAgICB2aXJ0
dWFsIHZvaWQgdGltZXJGaXJlZChUaW1lcjxBbmltYXRpb25UaW1lckJhc2U+Kik7CisgICAgCitw
cml2YXRlOgorICAgIFJlZlB0cjxFbGVtZW50PiBtX2VsZW1lbnQ7CisgICAgQXRvbWljU3RyaW5n
IG1fbmFtZTsKKyAgICBpbnQgbV9wcm9wZXJ0eTsKKyAgICBib29sIG1fcmVzZXQ7CisgICAgQXRv
bWljU3RyaW5nIG1fZXZlbnRUeXBlOworICAgIGRvdWJsZSBtX2VsYXBzZWRUaW1lOworfTsKKwor
Y2xhc3MgQW5pbWF0aW9uVGltZXJDYWxsYmFjayA6IHB1YmxpYyBBbmltYXRpb25UaW1lckJhc2Ug
eworcHVibGljOgorICAgIEFuaW1hdGlvblRpbWVyQ2FsbGJhY2soQW5pbWF0aW9uQmFzZSogYW5p
bSkgCisgICAgOiBBbmltYXRpb25UaW1lckJhc2UoYW5pbSkKKyAgICAsIG1fZWxhcHNlZFRpbWUo
MCkKKyAgICB7IH0KKyAgICB2aXJ0dWFsIH5BbmltYXRpb25UaW1lckNhbGxiYWNrKCkgeyB9Cisg
ICAgCisgICAgdmlydHVhbCB2b2lkIHRpbWVyRmlyZWQoVGltZXI8QW5pbWF0aW9uVGltZXJCYXNl
PiopOworICAgIAorICAgIHZvaWQgc3RhcnRUaW1lcihkb3VibGUgdGltZW91dCwgY29uc3QgQXRv
bWljU3RyaW5nJiBldmVudFR5cGUsIGRvdWJsZSBlbGFwc2VkVGltZSkKKyAgICB7CisgICAgICAg
IG1fZXZlbnRUeXBlID0gZXZlbnRUeXBlOworICAgICAgICBtX2VsYXBzZWRUaW1lID0gZWxhcHNl
ZFRpbWU7CisgICAgICAgIEFuaW1hdGlvblRpbWVyQmFzZTo6c3RhcnRUaW1lcih0aW1lb3V0KTsK
KyAgICB9CisgICAgCitwcml2YXRlOgorICAgIEF0b21pY1N0cmluZyBtX2V2ZW50VHlwZTsKKyAg
ICBkb3VibGUgbV9lbGFwc2VkVGltZTsKK307CisKK2NsYXNzIEFuaW1hdGlvbkJhc2UgOiBwdWJs
aWMgTm9uY29weWFibGUgeworICAgIGZyaWVuZCBjbGFzcyBDb21wb3NpdGVBbmltYXRpb247Cisg
ICAgCitwdWJsaWM6CisgICAgQW5pbWF0aW9uQmFzZShjb25zdCBBbmltYXRpb24qIHRyYW5zaXRp
b24sIFJlbmRlck9iamVjdCogcmVuZGVyZXIsIENvbXBvc2l0ZUFuaW1hdGlvbiogY29tcEFuaW0p
OworICAgIHZpcnR1YWwgfkFuaW1hdGlvbkJhc2UoKTsKKyAgICAgICAgCisgICAgUmVuZGVyT2Jq
ZWN0KiByZW5kZXJlcigpIGNvbnN0IHsgcmV0dXJuIG1fb2JqZWN0OyB9CisgICAgZG91YmxlIHN0
YXJ0VGltZSgpIGNvbnN0IHsgcmV0dXJuIG1fc3RhcnRUaW1lOyB9CisgICAgZG91YmxlIGR1cmF0
aW9uKCkgY29uc3Q7CisgICAgCisgICAgdm9pZCBjYW5jZWxUaW1lcnMoKQorICAgIHsKKyAgICAg
ICAgbV9hbmltYXRpb25UaW1lckNhbGxiYWNrLmNhbmNlbFRpbWVyKCk7CisgICAgICAgIG1fYW5p
bWF0aW9uRXZlbnREaXNwYXRjaGVyLmNhbmNlbFRpbWVyKCk7CisgICAgfQorICAgIAorICAgIC8v
IEFuaW1hdGlvbnMgYW5kIFRyYW5zaXRpb25zIGdvIHRocm91Z2ggdGhlIHN0YXRlcyBiZWxvdy4g
V2hlbiBlbnRlcmluZyB0aGUgU1RBUlRFRCBzdGF0ZQorICAgIC8vIHRoZSBhbmltYXRpb24gaXMg
c3RhcnRlZC4gVGhpcyBtYXkgb3IgbWF5IG5vdCByZXF1aXJlIGRlZmVycmVkIHJlc3BvbnNlIGZy
b20gdGhlIGFuaW1hdG9yLgorICAgIC8vIElmIHNvLCB3ZSBzdGF5IGluIHRoaXMgc3RhdGUgdW50
aWwgdGhhdCByZXNwb25zZSBpcyByZWNlaXZlZCAoYW5kIGl0IHJldHVybnMgdGhlIHN0YXJ0IHRp
bWUpLgorICAgIC8vIE90aGVyd2lzZSwgd2UgdXNlIHRoZSBjdXJyZW50IHRpbWUgYXMgdGhlIHN0
YXJ0IHRpbWUgYW5kIGdvIGltbWVkaWF0ZWx5IHRvIHRoZSBMT09QSU5HIG9yCisgICAgLy8gRU5E
SU5HIHN0YXRlLgorICAgIGVudW0gQW5pbVN0YXRlIHsgCisgICAgICAgIFNUQVRFX05FVywgICAg
ICAgICAgICAgICAgICAgICAgLy8gYW5pbWF0aW9uIGp1c3QgY3JlYXRlZCwgYW5pbWF0aW9uIG5v
dCBydW5uaW5nIHlldAorICAgICAgICBTVEFURV9TVEFSVF9XQUlUX1RJTUVSLCAgICAgICAgIC8v
IHN0YXJ0IHRpbWVyIHJ1bm5pbmcsIHdhaXRpbmcgZm9yIGZpcmUKKyAgICAgICAgU1RBVEVfU1RB
UlRfV0FJVF9TVFlMRV9BVkFJTEFCTEUsICAgLy8gd2FpdGluZyBmb3Igc3R5bGUgc2V0dXAgc28g
d2UgY2FuIHN0YXJ0IGFuaW1hdGlvbnMKKyAgICAgICAgU1RBVEVfU1RBUlRfV0FJVF9SRVNQT05T
RSwgICAgICAvLyBhbmltYXRpb24gc3RhcnRlZCwgd2FpdGluZyBmb3IgcmVzcG9uc2UKKyAgICAg
ICAgU1RBVEVfTE9PUElORywgICAgICAgICAgICAgICAgICAvLyByZXNwb25zZSByZWNlaXZlZCwg
YW5pbWF0aW9uIHJ1bm5pbmcsIGxvb3AgdGltZXIgcnVubmluZywgd2FpdGluZyBmb3IgZmlyZQor
ICAgICAgICBTVEFURV9FTkRJTkcsICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIHJlY2Vp
dmVkLCBhbmltYXRpb24gcnVubmluZywgZW5kIHRpbWVyIHJ1bm5pbmcsIHdhaXRpbmcgZm9yIGZp
cmUKKyAgICAgICAgU1RBVEVfUEFVU0VEX1dBSVRfVElNRVIsICAgICAgICAvLyBhbmltYXRpb24g
aW4gcGF1c2UgbW9kZSB3aGVuIGFuaW1hdGlvbiBzdGFydGVkCisgICAgICAgIFNUQVRFX1BBVVNF
RF9XQUlUX1JFU1BPTlNFLCAgICAgLy8gYW5pbWF0aW9uIHBhdXNlZCB3aGVuIGluIFNUQVJUSU5H
IHN0YXRlCisgICAgICAgIFNUQVRFX1BBVVNFRF9SVU4sICAgICAgICAgICAgICAgLy8gYW5pbWF0
aW9uIHBhdXNlZCB3aGVuIGluIExPT1BJTkcgb3IgRU5ESU5HIHN0YXRlCisgICAgICAgIFNUQVRF
X0RPTkUgICAgICAgICAgICAgICAgICAgICAgLy8gZW5kIHRpbWVyIGZpcmVkLCBhbmltYXRpb24g
ZmluaXNoZWQgYW5kIHJlbW92ZWQKKyAgICB9OworICAgIAorICAgIGVudW0gQW5pbVN0YXRlSW5w
dXQgeworICAgICAgICBTVEFURV9JTlBVVF9NQUtFX05FVywgICAgICAgICAgIC8vIHJlc2V0IGJh
Y2sgdG8gbmV3IGZyb20gYW55IHN0YXRlCisgICAgICAgIFNUQVRFX0lOUFVUX1NUQVJUX0FOSU1B
VElPTiwgICAgLy8gYW5pbWF0aW9uIHJlcXVlc3RzIGEgc3RhcnQKKyAgICAgICAgU1RBVEVfSU5Q
VVRfUkVTVEFSVF9BTklNQVRJT04sICAvLyBmb3JjZSBhIHJlc3RhcnQgZnJvbSBhbnkgc3RhdGUK
KyAgICAgICAgU1RBVEVfSU5QVVRfU1RBUlRfVElNRVJfRklSRUQsICAvLyBzdGFydCB0aW1lciBm
aXJlZAorICAgICAgICBTVEFURV9JTlBVVF9TVFlMRV9BVkFJTEFCTEUsICAgICAgICAvLyBzdHls
ZSBpcyBzZXR1cCwgcmVhZHkgdG8gc3RhcnQgYW5pbWF0aW5nCisgICAgICAgIFNUQVRFX0lOUFVU
X1NUQVJUX1RJTUVfU0VULCAgICAgLy8gbV9zdGFydFRpbWUgd2FzIHNldAorICAgICAgICBTVEFU
RV9JTlBVVF9MT09QX1RJTUVSX0ZJUkVELCAgIC8vIGxvb3AgdGltZXIgZmlyZWQKKyAgICAgICAg
U1RBVEVfSU5QVVRfRU5EX1RJTUVSX0ZJUkVELCAgICAvLyBlbmQgdGltZXIgZmlyZWQKKyAgICAg
ICAgU1RBVEVfSU5QVVRfUEFVU0VfT1ZFUlJJREUsICAgICAvLyBwYXVzZSBhbiBhbmltYXRpb24g
ZHVlIHRvIG92ZXJyaWRlCisgICAgICAgIFNUQVRFX0lOUFVUX1JFU1VNRV9PVkVSUklERSwgICAg
Ly8gcmVzdW1lIGFuIG92ZXJyaWRkZW4gYW5pbWF0aW9uCisgICAgICAgIFNUQVRFX0lOUFVUX1BM
QVlfU1RBVEVfUlVOTklORywgLy8gcGxheSBzdGF0ZSBwYXVzZWQgLT4gcnVubmluZworICAgICAg
ICBTVEFURV9JTlBVVF9QTEFZX1NUQVRFX1BBVVNFRCwgIC8vIHBsYXkgc3RhdGUgcnVubmluZyAt
PiBwYXVzZWQKKyAgICAgICAgU1RBVEVfSU5QVVRfRU5EX0FOSU1BVElPTiAgICAgICAvLyBmb3Jj
ZSBhbiBlbmQgZnJvbSBhbnkgc3RhdGUKKyAgICB9OworICAgIAorICAgIC8vIENhbGxlZCB3aGVu
IGFuaW1hdGlvbiBpcyBpbiBORVcgc3RhdGUgdG8gc3RhcnQgYW5pbWF0aW9uCisgICAgdm9pZCB1
cGRhdGVTdGF0ZU1hY2hpbmUoQW5pbVN0YXRlSW5wdXQgaW5wdXQsIGRvdWJsZSBwYXJhbSk7Cisg
ICAgCisgICAgLy8gQW5pbWF0aW9uIGhhcyBhY3R1YWxseSBzdGFydGVkLCBhdCBwYXNzZWQgdGlt
ZQorICAgIHZvaWQgb25BbmltYXRpb25TdGFydFJlc3BvbnNlKGRvdWJsZSBzdGFydFRpbWUpOwor
ICAgIAorICAgIC8vIENhbGxlZCB0byBjaGFuZ2UgdG8gb3IgZnJvbSBwYXVzZWQgc3RhdGUKKyAg
ICB2b2lkIHVwZGF0ZVBsYXlTdGF0ZShib29sIHJ1bm5pbmcpOworICAgIGJvb2wgcGxheVN0YXRl
UGxheWluZygpIGNvbnN0OworICAgIAorICAgIGJvb2wgd2FpdGluZ1RvU3RhcnQoKSBjb25zdCB7
IHJldHVybiBtX2FuaW1TdGF0ZSA9PSBTVEFURV9ORVcgfHwgbV9hbmltU3RhdGUgPT0gU1RBVEVf
U1RBUlRfV0FJVF9USU1FUjsgfQorICAgIGJvb2wgcHJlQWN0aXZlKCkgY29uc3QKKyAgICB7IHJl
dHVybiBtX2FuaW1TdGF0ZSA9PSBTVEFURV9ORVcgfHwKKyAgICAgICAgICAgICBtX2FuaW1TdGF0
ZSA9PSBTVEFURV9TVEFSVF9XQUlUX1RJTUVSIHx8CisgICAgICAgICAgICAgbV9hbmltU3RhdGUg
PT0gU1RBVEVfU1RBUlRfV0FJVF9TVFlMRV9BVkFJTEFCTEUgfHwKKyAgICAgICAgICAgICBtX2Fu
aW1TdGF0ZSA9PSBTVEFURV9TVEFSVF9XQUlUX1JFU1BPTlNFOworICAgIH0KKyAgICBib29sIHBv
c3RBY3RpdmUoKSBjb25zdCB7IHJldHVybiBtX2FuaW1TdGF0ZSA9PSBTVEFURV9ET05FOyB9Cisg
ICAgYm9vbCBhY3RpdmUoKSBjb25zdCB7IHJldHVybiAhcG9zdEFjdGl2ZSgpICYmICFwcmVBY3Rp
dmUoKTsgfQorICAgIGJvb2wgcnVubmluZygpIGNvbnN0IHsgcmV0dXJuICFpc05ldygpICYmICFw
b3N0QWN0aXZlKCk7IH0KKyAgICBib29sIHBhdXNlZCgpIGNvbnN0IHsgcmV0dXJuIG1fcGF1c2VU
aW1lID49IDA7IH0KKyAgICBib29sIGlzTmV3KCkgY29uc3QgeyByZXR1cm4gbV9hbmltU3RhdGUg
PT0gU1RBVEVfTkVXOyB9CisgICAgYm9vbCB3YWl0aW5nRm9yU3RhcnRUaW1lKCkgY29uc3QgeyBy
ZXR1cm4gbV9hbmltU3RhdGUgPT0gU1RBVEVfU1RBUlRfV0FJVF9SRVNQT05TRTsgfQorICAgIGJv
b2wgd2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKCkgY29uc3QgeyByZXR1cm4gbV9hbmltU3RhdGUg
PT0gU1RBVEVfU1RBUlRfV0FJVF9TVFlMRV9BVkFJTEFCTEU7IH0KKyAgICBib29sIHdhaXRpbmdG
b3JFbmRFdmVudCgpIGNvbnN0ICB7IHJldHVybiBtX3dhaXRpbmdGb3JFbmRFdmVudDsgfQorICAg
IAorICAgIC8vICJhbmltYXRpbmciIG1lYW5zIHRoYXQgc29tZXRoaW5nIGlzIHJ1bm5pbmcgdGhh
dCByZXF1aXJlcyBhIHRpbWVyIHRvIGtlZXAgZmlyaW5nCisgICAgLy8gKGUuZy4gYSBzb2Z0d2Fy
ZSBhbmltYXRpb24pCisgICAgdm9pZCBzZXRBbmltYXRpbmcoYm9vbCBpbkFuaW1hdGluZyA9IHRy
dWUpIHsgbV9hbmltYXRpbmcgPSBpbkFuaW1hdGluZzsgfQorICAgIGJvb2wgYW5pbWF0aW5nKCkg
Y29uc3QgeyByZXR1cm4gbV9hbmltYXRpbmc7IH0KKyAgICAKKyAgICBkb3VibGUgcHJvZ3Jlc3Mo
ZG91YmxlIHNjYWxlLCBkb3VibGUgb2Zmc2V0KSBjb25zdDsKKyAgICAKKyAgICB2aXJ0dWFsIHZv
aWQgYW5pbWF0ZShDb21wb3NpdGVBbmltYXRpb24qLCBSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5k
ZXJTdHlsZSogY3VycmVudFN0eWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBS
ZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUsIFJlbmRlclN0eWxlKiYgYW5pbWF0ZWRTdHlsZSkgeyB9
CisgICAgdmlydHVhbCB2b2lkIHJlc2V0KFJlbmRlck9iamVjdCogcmVuZGVyZXIsIGNvbnN0IFJl
bmRlclN0eWxlKiBmcm9tID0gMCwgY29uc3QgUmVuZGVyU3R5bGUqIHRvID0gMCkgeyB9CisgICAg
CisgICAgdmlydHVhbCBib29sIHNob3VsZEZpcmVFdmVudHMoKSBjb25zdCB7IHJldHVybiBmYWxz
ZTsgfQorICAgIAorICAgIHZvaWQgYW5pbWF0aW9uVGltZXJDYWxsYmFja0ZpcmVkKGNvbnN0IEF0
b21pY1N0cmluZyYgZXZlbnRUeXBlLCBkb3VibGUgZWxhcHNlZFRpbWUpOworICAgIHZvaWQgYW5p
bWF0aW9uRXZlbnREaXNwYXRjaGVyRmlyZWQoRWxlbWVudCogZWxlbWVudCwgY29uc3QgQXRvbWlj
U3RyaW5nJiBuYW1lLCBpbnQgcHJvcGVydHksIGJvb2wgcmVzZXQsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdG9taWNTdHJpbmcmIGV2ZW50VHlwZSwgZG91
YmxlIGVsYXBzZWRUaW1lKTsKKyAgICAKKyAgICBib29sIGFuaW1hdGlvbnNNYXRjaChjb25zdCBB
bmltYXRpb24qIGFuaW0pIGNvbnN0OworICAgIAorICAgIHZvaWQgc2V0QW5pbWF0aW9uKGNvbnN0
IEFuaW1hdGlvbiogYW5pbSkgeyBtX2FuaW1hdGlvbiA9IGNvbnN0X2Nhc3Q8QW5pbWF0aW9uKj4o
YW5pbSk7IH0KKyAgICAKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGFuaW1hdGlvbiBpcyBv
dmVycmlkZGVuLiBUaGlzIHdpbGwgb25seSBiZSB0aGUgY2FzZSBmb3IKKyAgICAvLyBJbXBsaWNp
dEFuaW1hdGlvbnMgYW5kIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlIHNo
b3VsZCBmb3JjZQorICAgIC8vIHNldCB0aGUgc3RhcnQgdGltZS4gSWYgYW4gYW5pbWF0aW9uIGlz
IG92ZXJyaWRkZW4sIGl0IHdpbGwgcHJvYmFibHkgbm90IGdldAorICAgIC8vIGJhY2sgdGhlIFNU
QVJUX1RJTUUgZXZlbnQuCisgICAgdmlydHVhbCBib29sIG92ZXJyaWRkZW4oKSBjb25zdCB7IHJl
dHVybiBmYWxzZTsgfQorICAgIAorICAgIC8vIERvZXMgdGhpcyBhbmltYXRpb24vdHJhbnNpdGlv
biBpbnZvbHZlIHRoZSBnaXZlbiBwcm9wZXJ0eT8KKyAgICB2aXJ0dWFsIGJvb2wgYWZmZWN0c1By
b3BlcnR5KGludCBwcm9wZXJ0eSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBib29sIGlz
QW5pbWF0aW5nUHJvcGVydHkoaW50IHByb3BlcnR5LCBib29sIGlzUnVubmluZ05vdykgY29uc3QK
KyAgICB7CisgICAgICAgIGlmIChpc1J1bm5pbmdOb3cpCisgICAgICAgICAgICByZXR1cm4gKCF3
YWl0aW5nVG9TdGFydCgpICYmICFwb3N0QWN0aXZlKCkpICYmIGFmZmVjdHNQcm9wZXJ0eShwcm9w
ZXJ0eSk7CisKKyAgICAgICAgcmV0dXJuICFwb3N0QWN0aXZlKCkgJiYgYWZmZWN0c1Byb3BlcnR5
KHByb3BlcnR5KTsKKyAgICB9CisgICAgICAgIAorcHJvdGVjdGVkOgorICAgIEVsZW1lbnQqIGVs
ZW1lbnRGb3JFdmVudERpc3BhdGNoKCk7CisgICAgCisgICAgdmlydHVhbCB2b2lkIG92ZXJyaWRl
QW5pbWF0aW9ucygpIHsgfQorICAgIHZpcnR1YWwgdm9pZCByZXN1bWVPdmVycmlkZGVuQW5pbWF0
aW9ucygpIHsgfQorICAgIAorICAgIENvbXBvc2l0ZUFuaW1hdGlvbiogY29tcG9zaXRlQW5pbWF0
aW9uKCkgeyByZXR1cm4gbV9jb21wQW5pbTsgfQorICAgIAorICAgIC8vIFRoZXNlIGFyZSBjYWxs
ZWQgd2hlbiB0aGUgY29ycmVzcG9uZGluZyB0aW1lciBmaXJlcyBzbyBzdWJjbGFzc2VzIGNhbiBk
byBhbnkgZXh0cmEgd29yaworICAgIHZpcnR1YWwgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KGRvdWJs
ZSBlbGFwc2VkVGltZSkgeyB9CisgICAgdmlydHVhbCB2b2lkIG9uQW5pbWF0aW9uSXRlcmF0aW9u
KGRvdWJsZSBlbGFwc2VkVGltZSkgeyB9CisgICAgdmlydHVhbCB2b2lkIG9uQW5pbWF0aW9uRW5k
KGRvdWJsZSBlbGFwc2VkVGltZSkgeyB9CisgICAgdmlydHVhbCBib29sIHN0YXJ0QW5pbWF0aW9u
KGRvdWJsZSBiZWdpblRpbWUpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgdmlydHVhbCB2b2lkIGVu
ZEFuaW1hdGlvbihib29sIHJlc2V0KSB7IH0KKyAgICAKKyAgICB2b2lkIHByaW1lRXZlbnRUaW1l
cnMoKTsKKyAgICAKKyAgICBzdGF0aWMgYm9vbCBwcm9wZXJ0aWVzRXF1YWwoaW50IHByb3AsIGNv
bnN0IFJlbmRlclN0eWxlKiBhLCBjb25zdCBSZW5kZXJTdHlsZSogYik7CisgICAgc3RhdGljIGlu
dCBnZXRQcm9wZXJ0eUF0SW5kZXgoaW50IGkpOworICAgIHN0YXRpYyBpbnQgZ2V0TnVtUHJvcGVy
dGllcygpOworICAgIAorICAgIC8vIFJldHVybiB0cnVlIGlmIHdlIG5lZWQgdG8gc3RhcnQgc29m
dHdhcmUgYW5pbWF0aW9uIHRpbWVycworICAgIHN0YXRpYyBib29sIGJsZW5kUHJvcGVydGllcyhp
bnQgcHJvcCwgUmVuZGVyU3R5bGUqIGRzdCwgY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJl
bmRlclN0eWxlKiBiLCBkb3VibGUgcHJvZyk7CisgICAgCisgICAgc3RhdGljIHZvaWQgQW5pbWF0
aW9uQmFzZTo6c2V0Q2hhbmdlZChOb2RlKiBub2RlKTsKKyAgICAKK3Byb3RlY3RlZDoKKyAgICBB
bmltU3RhdGUgbV9hbmltU3RhdGU7CisgICAgaW50IG1faXRlcmF0aW9uOworICAgIAorICAgIGJv
b2wgbV9hbmltYXRpbmc7ICAgICAgIC8vIHRyYW5zaXRpb24vYW5pbWF0aW9uIHJlcXVpcmVzIGNv
bnRpbnVhbCB0aW1lciBmaXJpbmcKKyAgICBib29sIG1fd2FpdGVkRm9yUmVzcG9uc2U7CisgICAg
ZG91YmxlIG1fc3RhcnRUaW1lOworICAgIGRvdWJsZSBtX3BhdXNlVGltZTsKKyAgICBSZW5kZXJP
YmplY3QqIG1fb2JqZWN0OworICAgIAorICAgIEFuaW1hdGlvblRpbWVyQ2FsbGJhY2sgbV9hbmlt
YXRpb25UaW1lckNhbGxiYWNrOworICAgIEFuaW1hdGlvbkV2ZW50RGlzcGF0Y2hlciBtX2FuaW1h
dGlvbkV2ZW50RGlzcGF0Y2hlcjsKKyAgICBSZWZQdHI8QW5pbWF0aW9uPiBtX2FuaW1hdGlvbjsK
KyAgICBDb21wb3NpdGVBbmltYXRpb24qIG1fY29tcEFuaW07CisgICAgYm9vbCBtX3dhaXRpbmdG
b3JFbmRFdmVudDsKKworcHJpdmF0ZToKK307CisKK30KKworI2VuZGlmCkluZGV4OiBXZWJDb3Jl
L3BhZ2UvYW5pbWF0aW9uL0FuaW1hdGlvbkNvbnRyb2xsZXIuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YkNvcmUvcGFnZS9hbmltYXRpb24vQW5pbWF0aW9uQ29udHJvbGxlci5jcHAJKHJldmlzaW9uIDM1
OTk1KQkoZnJvbSBXZWJDb3JlL3BhZ2UvQW5pbWF0aW9uQ29udHJvbGxlci5jcHA6MzU5OTUpCisr
KyBXZWJDb3JlL3BhZ2UvYW5pbWF0aW9uL0FuaW1hdGlvbkNvbnRyb2xsZXIuY3BwCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsMjE3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBO
ZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhl
IG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNl
IG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3
aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMi
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIkFuaW1hdGlvbkNvbnRyb2xsZXIuaCIKKworI2luY2x1ZGUgIkNTU1Byb3BlcnR5TmFtZXMu
aCIKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRl
ICJFdmVudE5hbWVzLmgiCisjaW5jbHVkZSAiRmxvYXRDb252ZXJzaW9uLmgiCisjaW5jbHVkZSAi
RnJhbWUuaCIKKyNpbmNsdWRlICJSZW5kZXJPYmplY3QuaCIKKyNpbmNsdWRlICJSZW5kZXJTdHls
ZS5oIgorI2luY2x1ZGUgIlN5c3RlbVRpbWUuaCIKKyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1
ZGUgIlVuaXRCZXppZXIuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgY29uc3Qg
ZG91YmxlIGNBbmltYXRpb25UaW1lckRlbGF5ID0gMC4wMjU7CisKK3N0YXRpYyB2b2lkIHNldENo
YW5nZWQoTm9kZSogbm9kZSkKK3sKKyAgICBBU1NFUlQoIW5vZGUgfHwgKG5vZGUtPmRvY3VtZW50
KCkgJiYgIW5vZGUtPmRvY3VtZW50KCktPmluUGFnZUNhY2hlKCkpKTsKKyAgICBub2RlLT5zZXRD
aGFuZ2VkKEFuaW1hdGlvblN0eWxlQ2hhbmdlKTsKK30KKworLy8gVGhlIGVwc2lsb24gdmFsdWUg
d2UgcGFzcyB0byBVbml0QmV6aWVyOjpzb2x2ZSBnaXZlbiB0aGF0IHRoZSBhbmltYXRpb24gaXMg
Z29pbmcgdG8gcnVuIG92ZXIgfGR1cnwgc2Vjb25kcy4gVGhlIGxvbmdlciB0aGUKKy8vIGFuaW1h
dGlvbiwgdGhlIG1vcmUgcHJlY2lzaW9uIHdlIG5lZWQgaW4gdGhlIHRpbWluZyBmdW5jdGlvbiBy
ZXN1bHQgdG8gYXZvaWQgdWdseSBkaXNjb250aW51aXRpZXMuCitzdGF0aWMgaW5saW5lIGRvdWJs
ZSBzb2x2ZUVwc2lsb24oZG91YmxlIGR1cmF0aW9uKSB7IHJldHVybiAxLiAvICgyMDAuICogZHVy
YXRpb24pOyB9CisKK3N0YXRpYyBpbmxpbmUgZG91YmxlIHNvbHZlQ3ViaWNCZXppZXJGdW5jdGlv
bihkb3VibGUgcDF4LCBkb3VibGUgcDF5LCBkb3VibGUgcDJ4LCBkb3VibGUgcDJ5LCBkb3VibGUg
dCwgZG91YmxlIGR1cmF0aW9uKQoreworICAgIC8vIENvbnZlcnQgZnJvbSBpbnB1dCB0aW1lIHRv
IHBhcmFtZXRyaWMgdmFsdWUgaW4gY3VydmUsIHRoZW4gZnJvbQorICAgIC8vIHRoYXQgdG8gb3V0
cHV0IHRpbWUuCisgICAgVW5pdEJlemllciBiZXppZXIocDF4LCBwMXksIHAyeCwgcDJ5KTsKKyAg
ICByZXR1cm4gYmV6aWVyLnNvbHZlKHQsIHNvbHZlRXBzaWxvbihkdXJhdGlvbikpOworfQorCitj
bGFzcyBDb21wb3NpdGVBbmltYXRpb247CitjbGFzcyBBbmltYXRpb25CYXNlOworCitjbGFzcyBB
bmltYXRpb25UaW1lckJhc2UgeworcHVibGljOgorICAgIEFuaW1hdGlvblRpbWVyQmFzZShBbmlt
YXRpb25CYXNlKiBhbmltKQorICAgIDogbV90aW1lcih0aGlzLCAmQW5pbWF0aW9uVGltZXJCYXNl
Ojp0aW1lckZpcmVkKQorICAgICwgbV9hbmltKGFuaW0pCisgICAgeworICAgICAgICBtX3RpbWVy
LnN0YXJ0T25lU2hvdCgwKTsKKyAgICB9CisgICAgdmlydHVhbCB+QW5pbWF0aW9uVGltZXJCYXNl
KCkKKyAgICB7CisgICAgfQorICAgIAorICAgIHZvaWQgc3RhcnRUaW1lcihkb3VibGUgdGltZW91
dD0wKQorICAgIHsKKyAgICAgICAgbV90aW1lci5zdGFydE9uZVNob3QodGltZW91dCk7CisgICAg
fQorICAgIAorICAgIHZvaWQgY2FuY2VsVGltZXIoKQorICAgIHsKKyAgICAgICAgbV90aW1lci5z
dG9wKCk7CisgICAgfQorICAgIAorICAgIHZpcnR1YWwgdm9pZCB0aW1lckZpcmVkKFRpbWVyPEFu
aW1hdGlvblRpbWVyQmFzZT4qKSA9IDA7CisgICAgCitwcml2YXRlOgorICAgIFRpbWVyPEFuaW1h
dGlvblRpbWVyQmFzZT4gbV90aW1lcjsKKyAgICAKK3Byb3RlY3RlZDoKKyAgICBBbmltYXRpb25C
YXNlKiBtX2FuaW07Cit9OworCitjbGFzcyBBbmltYXRpb25FdmVudERpc3BhdGNoZXIgOiBwdWJs
aWMgQW5pbWF0aW9uVGltZXJCYXNlIHsKK3B1YmxpYzoKKyAgICBBbmltYXRpb25FdmVudERpc3Bh
dGNoZXIoQW5pbWF0aW9uQmFzZSogYW5pbSkgCisgICAgOiBBbmltYXRpb25UaW1lckJhc2UoYW5p
bSkKKyAgICAsIG1fcHJvcGVydHkoQ1NTUHJvcGVydHlJbnZhbGlkKQorICAgICwgbV9yZXNldChm
YWxzZSkKKyAgICAsIG1fZWxhcHNlZFRpbWUoLTEpCisgICAgeworICAgIH0KKyAgICAKKyAgICB2
aXJ0dWFsIH5BbmltYXRpb25FdmVudERpc3BhdGNoZXIoKQorICAgIHsKKyAgICB9CisgICAgCisg
ICAgdm9pZCBzdGFydFRpbWVyKEVsZW1lbnQqIGVsZW1lbnQsIGNvbnN0IEF0b21pY1N0cmluZyYg
bmFtZSwgaW50IHByb3BlcnR5LCBib29sIHJlc2V0LAorICAgICAgICAgICAgICAgICAgICBjb25z
dCBBdG9taWNTdHJpbmcmIGV2ZW50VHlwZSwgZG91YmxlIGVsYXBzZWRUaW1lKQorICAgIHsKKyAg
ICAgICAgbV9lbGVtZW50ID0gZWxlbWVudDsKKyAgICAgICAgbV9uYW1lID0gbmFtZTsKKyAgICAg
ICAgbV9wcm9wZXJ0eSA9IHByb3BlcnR5OworICAgICAgICBtX3Jlc2V0ID0gcmVzZXQ7CisgICAg
ICAgIG1fZXZlbnRUeXBlID0gZXZlbnRUeXBlOworICAgICAgICBtX2VsYXBzZWRUaW1lID0gZWxh
cHNlZFRpbWU7CisgICAgICAgIEFuaW1hdGlvblRpbWVyQmFzZTo6c3RhcnRUaW1lcigpOworICAg
IH0KKyAgICAKKyAgICB2aXJ0dWFsIHZvaWQgdGltZXJGaXJlZChUaW1lcjxBbmltYXRpb25UaW1l
ckJhc2U+Kik7CisgICAgCitwcml2YXRlOgorICAgIFJlZlB0cjxFbGVtZW50PiBtX2VsZW1lbnQ7
CisgICAgQXRvbWljU3RyaW5nIG1fbmFtZTsKKyAgICBpbnQgbV9wcm9wZXJ0eTsKKyAgICBib29s
IG1fcmVzZXQ7CisgICAgQXRvbWljU3RyaW5nIG1fZXZlbnRUeXBlOworICAgIGRvdWJsZSBtX2Vs
YXBzZWRUaW1lOworfTsKKworY2xhc3MgQW5pbWF0aW9uVGltZXJDYWxsYmFjayA6IHB1YmxpYyBB
bmltYXRpb25UaW1lckJhc2UgeworcHVibGljOgorICAgIEFuaW1hdGlvblRpbWVyQ2FsbGJhY2so
QW5pbWF0aW9uQmFzZSogYW5pbSkgCisgICAgOiBBbmltYXRpb25UaW1lckJhc2UoYW5pbSkKKyAg
ICAsIG1fZWxhcHNlZFRpbWUoMCkKKyAgICB7IH0KKyAgICB2aXJ0dWFsIH5BbmltYXRpb25UaW1l
ckNhbGxiYWNrKCkgeyB9CisgICAgCisgICAgdmlydHVhbCB2b2lkIHRpbWVyRmlyZWQoVGltZXI8
QW5pbWF0aW9uVGltZXJCYXNlPiopOworICAgIAorICAgIHZvaWQgc3RhcnRUaW1lcihkb3VibGUg
dGltZW91dCwgY29uc3QgQXRvbWljU3RyaW5nJiBldmVudFR5cGUsIGRvdWJsZSBlbGFwc2VkVGlt
ZSkKKyAgICB7CisgICAgICAgIG1fZXZlbnRUeXBlID0gZXZlbnRUeXBlOworICAgICAgICBtX2Vs
YXBzZWRUaW1lID0gZWxhcHNlZFRpbWU7CisgICAgICAgIEFuaW1hdGlvblRpbWVyQmFzZTo6c3Rh
cnRUaW1lcih0aW1lb3V0KTsKKyAgICB9CisgICAgCitwcml2YXRlOgorICAgIEF0b21pY1N0cmlu
ZyBtX2V2ZW50VHlwZTsKKyAgICBkb3VibGUgbV9lbGFwc2VkVGltZTsKK307CisKK2NsYXNzIElt
cGxpY2l0QW5pbWF0aW9uOworY2xhc3MgS2V5ZnJhbWVBbmltYXRpb247CitjbGFzcyBBbmltYXRp
b25Db250cm9sbGVyUHJpdmF0ZTsKKworLy8gQSBDb21wb3NpdGVBbmltYXRpb24gcmVwcmVzZW50
cyBhIGNvbGxlY3Rpb24gb2YgYW5pbWF0aW9ucyB0aGF0IGFyZSBydW5uaW5nCisvLyBvbiBhIHNp
bmdsZSBSZW5kZXJPYmplY3QsIHN1Y2ggYXMgYSBudW1iZXIgb2YgcHJvcGVydGllcyB0cmFuc2l0
aW9uaW5nIGF0IG9uY2UuCitjbGFzcyBDb21wb3NpdGVBbmltYXRpb24gOiBwdWJsaWMgTm9uY29w
eWFibGUgeworcHVibGljOgorICAgIENvbXBvc2l0ZUFuaW1hdGlvbihBbmltYXRpb25Db250cm9s
bGVyUHJpdmF0ZSogYW5pbWF0aW9uQ29udHJvbGxlcikKKyAgICA6IG1fc3VzcGVuZGVkKGZhbHNl
KQorICAgICwgbV9hbmltYXRpb25Db250cm9sbGVyKGFuaW1hdGlvbkNvbnRyb2xsZXIpCisgICAg
LCBtX251bVN0eWxlQXZhaWxhYmxlV2FpdGVycygwKQorICAgIHsgfQorICAgIAorICAgIH5Db21w
b3NpdGVBbmltYXRpb24oKQorICAgIHsKKyAgICAgICAgZGVsZXRlQWxsVmFsdWVzKG1fdHJhbnNp
dGlvbnMpOworICAgICAgICBkZWxldGVBbGxWYWx1ZXMobV9rZXlmcmFtZUFuaW1hdGlvbnMpOwor
ICAgIH0KKyAgICAKKyAgICBSZW5kZXJTdHlsZSogYW5pbWF0ZShSZW5kZXJPYmplY3QqLCBjb25z
dCBSZW5kZXJTdHlsZSogY3VycmVudFN0eWxlLCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUpOwor
ICAgIAorICAgIHZvaWQgc2V0QW5pbWF0aW5nKGJvb2wgaW5BbmltYXRpbmcpOworICAgIGJvb2wg
YW5pbWF0aW5nKCk7CisgICAgCisgICAgYm9vbCBoYXNBbmltYXRpb25Gb3JQcm9wZXJ0eShpbnQg
cHJvcCkgY29uc3QgeyByZXR1cm4gbV90cmFuc2l0aW9ucy5jb250YWlucyhwcm9wKTsgfQorICAg
IAorICAgIHZvaWQgcmVzZXRUcmFuc2l0aW9ucyhSZW5kZXJPYmplY3QqKTsKKyAgICB2b2lkIHJl
c2V0QW5pbWF0aW9ucyhSZW5kZXJPYmplY3QqKTsKKyAgICAKKyAgICB2b2lkIGNsZWFudXBGaW5p
c2hlZEFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0Kik7CisKKyAgICB2b2lkIHNldEFuaW1hdGlvblN0
YXJ0VGltZShkb3VibGUgdCk7CisgICAgdm9pZCBzZXRUcmFuc2l0aW9uU3RhcnRUaW1lKGludCBw
cm9wZXJ0eSwgZG91YmxlIHQpOworICAgIAorICAgIHZvaWQgc3VzcGVuZEFuaW1hdGlvbnMoKTsK
KyAgICB2b2lkIHJlc3VtZUFuaW1hdGlvbnMoKTsKKyAgICBib29sIHN1c3BlbmRlZCgpIGNvbnN0
IHsgcmV0dXJuIG1fc3VzcGVuZGVkOyB9CisgICAgCisgICAgdm9pZCBvdmVycmlkZUltcGxpY2l0
QW5pbWF0aW9ucyhpbnQgcHJvcGVydHkpOworICAgIHZvaWQgcmVzdW1lT3ZlcnJpZGRlbkltcGxp
Y2l0QW5pbWF0aW9ucyhpbnQgcHJvcGVydHkpOworICAgIAorICAgIHZvaWQgc3R5bGVBdmFpbGFi
bGUoKTsKKyAgICAKKyAgICBib29sIGlzQW5pbWF0aW5nUHJvcGVydHkoaW50IHByb3BlcnR5LCBi
b29sIGlzUnVubmluZ05vdykgY29uc3Q7CisgICAgCisgICAgdm9pZCBzZXRXYWl0aW5nRm9yU3R5
bGVBdmFpbGFibGUoYm9vbCB3YWl0aW5nKTsKKworcHJvdGVjdGVkOgorICAgIHZvaWQgdXBkYXRl
VHJhbnNpdGlvbnMoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5bGUqIGN1
cnJlbnRTdHlsZSwgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlKTsKKyAgICB2b2lkIHVwZGF0ZUtl
eWZyYW1lQW5pbWF0aW9ucyhSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBjb25zdCBSZW5kZXJTdHls
ZSogY3VycmVudFN0eWxlLCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUpOworCisgICAgS2V5ZnJh
bWVBbmltYXRpb24qIGZpbmRLZXlmcmFtZUFuaW1hdGlvbihjb25zdCBBdG9taWNTdHJpbmcmIG5h
bWUpOworICAgIAorcHJpdmF0ZToKKyAgICB0eXBlZGVmIEhhc2hNYXA8aW50LCBJbXBsaWNpdEFu
aW1hdGlvbio+IENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA7CisgICAgdHlwZWRlZiBIYXNoTWFw
PEF0b21pY1N0cmluZ0ltcGwqLCBLZXlmcmFtZUFuaW1hdGlvbio+ICBBbmltYXRpb25OYW1lTWFw
OworICAgIAorICAgIENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXAgICBtX3RyYW5zaXRpb25zOwor
ICAgIEFuaW1hdGlvbk5hbWVNYXAgICAgICAgICAgICBtX2tleWZyYW1lQW5pbWF0aW9uczsKKyAg
ICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbV9zdXNwZW5kZWQ7CisgICAgQW5pbWF0aW9u
Q29udHJvbGxlclByaXZhdGUqIG1fYW5pbWF0aW9uQ29udHJvbGxlcjsKKyAgICB1aW50MzJfdCAg
ICAgICAgICAgICAgICAgICAgbV9udW1TdHlsZUF2YWlsYWJsZVdhaXRlcnM7Cit9OworCitjbGFz
cyBBbmltYXRpb25CYXNlIDogcHVibGljIE5vbmNvcHlhYmxlIHsKK3B1YmxpYzoKKyAgICBBbmlt
YXRpb25CYXNlKGNvbnN0IEFuaW1hdGlvbiogdHJhbnNpdGlvbiwgUmVuZGVyT2JqZWN0KiByZW5k
ZXJlciwgQ29tcG9zaXRlQW5pbWF0aW9uKiBjb21wQW5pbSk7CisgICAgdmlydHVhbCB+QW5pbWF0
aW9uQmFzZSgpCisgICAgeworICAgICAgICBpZiAobV9hbmltU3RhdGUgPT0gU1RBVEVfU1RBUlRf
V0FJVF9TVFlMRV9BVkFJTEFCTEUpCisgICAgICAgICAgICBtX2NvbXBBbmltLT5zZXRXYWl0aW5n
Rm9yU3R5bGVBdmFpbGFibGUoZmFsc2UpOworICAgIH0KKyAgICAKKyAgICBSZW5kZXJPYmplY3Qq
IHJlbmRlcmVyKCkgY29uc3QgeyByZXR1cm4gbV9vYmplY3Q7IH0KKyAgICBkb3VibGUgc3RhcnRU
aW1lKCkgY29uc3QgeyByZXR1cm4gbV9zdGFydFRpbWU7IH0KKyAgICBkb3VibGUgZHVyYXRpb24o
KSBjb25zdCAgeyByZXR1cm4gbV9hbmltYXRpb24tPmR1cmF0aW9uKCk7IH0KKyAgICAKKyAgICB2
b2lkIGNhbmNlbFRpbWVycygpCisgICAgeworICAgICAgICBtX2FuaW1hdGlvblRpbWVyQ2FsbGJh
Y2suY2FuY2VsVGltZXIoKTsKKyAgICAgICAgbV9hbmltYXRpb25FdmVudERpc3BhdGNoZXIuY2Fu
Y2VsVGltZXIoKTsKKyAgICB9CisgICAgCisgICAgLy8gQW5pbWF0aW9ucyBhbmQgVHJhbnNpdGlv
bnMgZ28gdGhyb3VnaCB0aGUgc3RhdGVzIGJlbG93LiBXaGVuIGVudGVyaW5nIHRoZSBTVEFSVEVE
IHN0YXRlCisgICAgLy8gdGhlIGFuaW1hdGlvbiBpcyBzdGFydGVkLiBUaGlzIG1heSBvciBtYXkg
bm90IHJlcXVpcmUgZGVmZXJyZWQgcmVzcG9uc2UgZnJvbSB0aGUgYW5pbWF0b3IuCisgICAgLy8g
SWYgc28sIHdlIHN0YXkgaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGF0IHJlc3BvbnNlIGlzIHJlY2Vp
dmVkIChhbmQgaXQgcmV0dXJucyB0aGUgc3RhcnQgdGltZSkuCisgICAgLy8gT3RoZXJ3aXNlLCB3
ZSB1c2UgdGhlIGN1cnJlbnQgdGltZSBhcyB0aGUgc3RhcnQgdGltZSBhbmQgZ28gaW1tZWRpYXRl
bHkgdG8gdGhlIExPT1BJTkcgb3IKKyAgICAvLyBFTkRJTkcgc3RhdGUuCisgICAgZW51bSBBbmlt
U3RhdGUgeyAKKyAgICAgICAgU1RBVEVfTkVXLCAgICAgICAgICAgICAgICAgICAgICAvLyBhbmlt
YXRpb24ganVzdCBjcmVhdGVkLCBhbmltYXRpb24gbm90IHJ1bm5pbmcgeWV0CisgICAgICAgIFNU
QVRFX1NUQVJUX1dBSVRfVElNRVIsICAgICAgICAgLy8gc3RhcnQgdGltZXIgcnVubmluZywgd2Fp
dGluZyBmb3IgZmlyZQorICAgICAgICBTVEFURV9TVEFSVF9XQUlUX1NUWUxFX0FWQUlMQUJMRSwg
ICAvLyB3YWl0aW5nIGZvciBzdHlsZSBzZXR1cCBzbyB3ZSBjYW4gc3RhcnQgYW5pbWF0aW9ucwor
ICAgICAgICBTVEFURV9TVEFSVF9XQUlUX1JFU1BPTlNFLCAgICAgIC8vIGFuaW1hdGlvbiBzdGFy
dGVkLCB3YWl0aW5nIGZvciByZXNwb25zZQorICAgICAgICBTVEFURV9MT09QSU5HLCAgICAgICAg
ICAgICAgICAgIC8vIHJlc3BvbnNlIHJlY2VpdmVkLCBhbmltYXRpb24gcnVubmluZywgbG9vcCB0
aW1lciBydW5uaW5nLCB3YWl0aW5nIGZvciBmaXJlCisgICAgICAgIFNUQVRFX0VORElORywgICAg
ICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgcmVjZWl2ZWQsIGFuaW1hdGlvbiBydW5uaW5nLCBl
bmQgdGltZXIgcnVubmluZywgd2FpdGluZyBmb3IgZmlyZQorICAgICAgICBTVEFURV9QQVVTRURf
V0FJVF9USU1FUiwgICAgICAgIC8vIGFuaW1hdGlvbiBpbiBwYXVzZSBtb2RlIHdoZW4gYW5pbWF0
aW9uIHN0YXJ0ZWQKKyAgICAgICAgU1RBVEVfUEFVU0VEX1dBSVRfUkVTUE9OU0UsICAgICAvLyBh
bmltYXRpb24gcGF1c2VkIHdoZW4gaW4gU1RBUlRJTkcgc3RhdGUKKyAgICAgICAgU1RBVEVfUEFV
U0VEX1JVTiwgICAgICAgICAgICAgICAvLyBhbmltYXRpb24gcGF1c2VkIHdoZW4gaW4gTE9PUElO
RyBvciBFTkRJTkcgc3RhdGUKKyAgICAgICAgU1RBVEVfRE9ORSAgICAgICAgICAgICAgICAgICAg
ICAvLyBlbmQgdGltZXIgZmlyZWQsIGFuaW1hdGlvbiBmaW5pc2hlZCBhbmQgcmVtb3ZlZAorICAg
IH07CisgICAgCisgICAgZW51bSBBbmltU3RhdGVJbnB1dCB7CisgICAgICAgIFNUQVRFX0lOUFVU
X01BS0VfTkVXLCAgICAgICAgICAgLy8gcmVzZXQgYmFjayB0byBuZXcgZnJvbSBhbnkgc3RhdGUK
KyAgICAgICAgU1RBVEVfSU5QVVRfU1RBUlRfQU5JTUFUSU9OLCAgICAvLyBhbmltYXRpb24gcmVx
dWVzdHMgYSBzdGFydAorICAgICAgICBTVEFURV9JTlBVVF9SRVNUQVJUX0FOSU1BVElPTiwgIC8v
IGZvcmNlIGEgcmVzdGFydCBmcm9tIGFueSBzdGF0ZQorICAgICAgICBTVEFURV9JTlBVVF9TVEFS
VF9USU1FUl9GSVJFRCwgIC8vIHN0YXJ0IHRpbWVyIGZpcmVkCisgICAgICAgIFNUQVRFX0lOUFVU
X1NUWUxFX0FWQUlMQUJMRSwgICAgICAgIC8vIHN0eWxlIGlzIHNldHVwLCByZWFkeSB0byBzdGFy
dCBhbmltYXRpbmcKKyAgICAgICAgU1RBVEVfSU5QVVRfU1RBUlRfVElNRV9TRVQsICAgICAvLyBt
X3N0YXJ0VGltZSB3YXMgc2V0CisgICAgICAgIFNUQVRFX0lOUFVUX0xPT1BfVElNRVJfRklSRUQs
ICAgLy8gbG9vcCB0aW1lciBmaXJlZAorICAgICAgICBTVEFURV9JTlBVVF9FTkRfVElNRVJfRklS
RUQsICAgIC8vIGVuZCB0aW1lciBmaXJlZAorICAgICAgICBTVEFURV9JTlBVVF9QQVVTRV9PVkVS
UklERSwgICAgIC8vIHBhdXNlIGFuIGFuaW1hdGlvbiBkdWUgdG8gb3ZlcnJpZGUKKyAgICAgICAg
U1RBVEVfSU5QVVRfUkVTVU1FX09WRVJSSURFLCAgICAvLyByZXN1bWUgYW4gb3ZlcnJpZGRlbiBh
bmltYXRpb24KKyAgICAgICAgU1RBVEVfSU5QVVRfUExBWV9TVEFURV9SVU5OSU5HLCAvLyBwbGF5
IHN0YXRlIHBhdXNlZCAtPiBydW5uaW5nCisgICAgICAgIFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVf
UEFVU0VELCAgLy8gcGxheSBzdGF0ZSBydW5uaW5nIC0+IHBhdXNlZAorICAgICAgICBTVEFURV9J
TlBVVF9FTkRfQU5JTUFUSU9OICAgICAgIC8vIGZvcmNlIGFuIGVuZCBmcm9tIGFueSBzdGF0ZQor
ICAgIH07CisgICAgCisgICAgLy8gQ2FsbGVkIHdoZW4gYW5pbWF0aW9uIGlzIGluIE5FVyBzdGF0
ZSB0byBzdGFydCBhbmltYXRpb24KKyAgICB2b2lkIHVwZGF0ZVN0YXRlTWFjaGluZShBbmltU3Rh
dGVJbnB1dCBpbnB1dCwgZG91YmxlIHBhcmFtKTsKKyAgICAKKyAgICAvLyBBbmltYXRpb24gaGFz
IGFjdHVhbGx5IHN0YXJ0ZWQsIGF0IHBhc3NlZCB0aW1lCisgICAgdm9pZCBvbkFuaW1hdGlvblN0
YXJ0UmVzcG9uc2UoZG91YmxlIHN0YXJ0VGltZSk7CisgICAgCisgICAgLy8gQ2FsbGVkIHRvIGNo
YW5nZSB0byBvciBmcm9tIHBhdXNlZCBzdGF0ZQorICAgIHZvaWQgdXBkYXRlUGxheVN0YXRlKGJv
b2wgcnVubmluZyk7CisgICAgYm9vbCBwbGF5U3RhdGVQbGF5aW5nKCkgY29uc3QgeyByZXR1cm4g
bV9hbmltYXRpb24gJiYgbV9hbmltYXRpb24tPnBsYXlTdGF0ZSgpID09IEFuaW1QbGF5U3RhdGVQ
bGF5aW5nOyB9CisgICAgCisgICAgYm9vbCB3YWl0aW5nVG9TdGFydCgpIGNvbnN0IHsgcmV0dXJu
IG1fYW5pbVN0YXRlID09IFNUQVRFX05FVyB8fCBtX2FuaW1TdGF0ZSA9PSBTVEFURV9TVEFSVF9X
QUlUX1RJTUVSOyB9CisgICAgYm9vbCBwcmVhY3RpdmUoKSBjb25zdAorICAgIHsgcmV0dXJuIG1f
YW5pbVN0YXRlID09IFNUQVRFX05FVyB8fAorICAgICAgICAgICAgIG1fYW5pbVN0YXRlID09IFNU
QVRFX1NUQVJUX1dBSVRfVElNRVIgfHwKKyAgICAgICAgICAgICBtX2FuaW1TdGF0ZSA9PSBTVEFU
RV9TVEFSVF9XQUlUX1NUWUxFX0FWQUlMQUJMRSB8fAorICAgICAgICAgICAgIG1fYW5pbVN0YXRl
ID09IFNUQVRFX1NUQVJUX1dBSVRfUkVTUE9OU0U7CisgICAgfQorICAgIGJvb2wgcG9zdGFjdGl2
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYW5pbVN0YXRlID09IFNUQVRFX0RPTkU7IH0KKyAgICBib29s
IGFjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuICFwb3N0YWN0aXZlKCkgJiYgIXByZWFjdGl2ZSgpOyB9
CisgICAgYm9vbCBydW5uaW5nKCkgY29uc3QgeyByZXR1cm4gIWlzbmV3KCkgJiYgIXBvc3RhY3Rp
dmUoKTsgfQorICAgIGJvb2wgcGF1c2VkKCkgY29uc3QgeyByZXR1cm4gbV9wYXVzZVRpbWUgPj0g
MDsgfQorICAgIGJvb2wgaXNuZXcoKSBjb25zdCB7IHJldHVybiBtX2FuaW1TdGF0ZSA9PSBTVEFU
RV9ORVc7IH0KKyAgICBib29sIHdhaXRpbmdGb3JTdGFydFRpbWUoKSBjb25zdCB7IHJldHVybiBt
X2FuaW1TdGF0ZSA9PSBTVEFURV9TVEFSVF9XQUlUX1JFU1BPTlNFOyB9CisgICAgYm9vbCB3YWl0
aW5nRm9yU3R5bGVBdmFpbGFibGUoKSBjb25zdCB7IHJldHVybiBtX2FuaW1TdGF0ZSA9PSBTVEFU
RV9TVEFSVF9XQUlUX1NUWUxFX0FWQUlMQUJMRTsgfQorICAgIGJvb2wgd2FpdGluZ0ZvckVuZEV2
ZW50KCkgY29uc3QgIHsgcmV0dXJuIG1fd2FpdGluZ0ZvckVuZEV2ZW50OyB9CisgICAgCisgICAg
Ly8gImFuaW1hdGluZyIgbWVhbnMgdGhhdCBzb21ldGhpbmcgaXMgcnVubmluZyB0aGF0IHJlcXVp
cmVzIGEgdGltZXIgdG8ga2VlcCBmaXJpbmcKKyAgICAvLyAoZS5nLiBhIHNvZnR3YXJlIGFuaW1h
dGlvbikKKyAgICB2b2lkIHNldEFuaW1hdGluZyhib29sIGluQW5pbWF0aW5nID0gdHJ1ZSkgeyBt
X2FuaW1hdGluZyA9IGluQW5pbWF0aW5nOyB9CisgICAgYm9vbCBhbmltYXRpbmcoKSBjb25zdCB7
IHJldHVybiBtX2FuaW1hdGluZzsgfQorICAgIAorICAgIGRvdWJsZSBwcm9ncmVzcyhkb3VibGUg
c2NhbGUsIGRvdWJsZSBvZmZzZXQpIGNvbnN0OworICAgIAorICAgIHZpcnR1YWwgdm9pZCBhbmlt
YXRlKENvbXBvc2l0ZUFuaW1hdGlvbiosIFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlclN0eWxl
KiBjdXJyZW50U3R5bGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRlclN0
eWxlKiB0YXJnZXRTdHlsZSwgUmVuZGVyU3R5bGUqJiBhbmltYXRlZFN0eWxlKSB7IH0KKyAgICB2
aXJ0dWFsIHZvaWQgcmVzZXQoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5
bGUqIGZyb20gPSAwLCBjb25zdCBSZW5kZXJTdHlsZSogdG8gPSAwKSB7IH0KKyAgICAKKyAgICB2
aXJ0dWFsIGJvb2wgc2hvdWxkRmlyZUV2ZW50cygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Cisg
ICAgCisgICAgdm9pZCBhbmltYXRpb25UaW1lckNhbGxiYWNrRmlyZWQoY29uc3QgQXRvbWljU3Ry
aW5nJiBldmVudFR5cGUsIGRvdWJsZSBlbGFwc2VkVGltZSk7CisgICAgdm9pZCBhbmltYXRpb25F
dmVudERpc3BhdGNoZXJGaXJlZChFbGVtZW50KiBlbGVtZW50LCBjb25zdCBBdG9taWNTdHJpbmcm
IG5hbWUsIGludCBwcm9wZXJ0eSwgYm9vbCByZXNldCwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgZXZlbnRUeXBlLCBkb3VibGUgZWxh
cHNlZFRpbWUpOworICAgIAorICAgIGJvb2wgYW5pbWF0aW9uc01hdGNoKGNvbnN0IEFuaW1hdGlv
biogYW5pbSkgY29uc3QgeyByZXR1cm4gbV9hbmltYXRpb24tPmFuaW1hdGlvbnNNYXRjaChhbmlt
KTsgfQorICAgIAorICAgIHZvaWQgc2V0QW5pbWF0aW9uKGNvbnN0IEFuaW1hdGlvbiogYW5pbSkg
eyBtX2FuaW1hdGlvbiA9IGNvbnN0X2Nhc3Q8QW5pbWF0aW9uKj4oYW5pbSk7IH0KKyAgICAKKyAg
ICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGFuaW1hdGlvbiBpcyBvdmVycmlkZGVuLiBUaGlzIHdp
bGwgb25seSBiZSB0aGUgY2FzZSBmb3IKKyAgICAvLyBJbXBsaWNpdEFuaW1hdGlvbnMgYW5kIGlz
IHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBmb3JjZQorICAgIC8v
IHNldCB0aGUgc3RhcnQgdGltZS4gSWYgYW4gYW5pbWF0aW9uIGlzIG92ZXJyaWRkZW4sIGl0IHdp
bGwgcHJvYmFibHkgbm90IGdldAorICAgIC8vIGJhY2sgdGhlIFNUQVJUX1RJTUUgZXZlbnQuCisg
ICAgdmlydHVhbCBib29sIG92ZXJyaWRkZW4oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAg
IAorICAgIC8vIERvZXMgdGhpcyBhbmltYXRpb24vdHJhbnNpdGlvbiBpbnZvbHZlIHRoZSBnaXZl
biBwcm9wZXJ0eT8KKyAgICB2aXJ0dWFsIGJvb2wgYWZmZWN0c1Byb3BlcnR5KGludCBwcm9wZXJ0
eSkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICBib29sIGlzQW5pbWF0aW5nUHJvcGVydHko
aW50IHByb3BlcnR5LCBib29sIGlzUnVubmluZ05vdykgY29uc3QKKyAgICB7CisgICAgICAgIGlm
IChpc1J1bm5pbmdOb3cpCisgICAgICAgICAgICByZXR1cm4gKCF3YWl0aW5nVG9TdGFydCgpICYm
ICFwb3N0YWN0aXZlKCkpICYmIGFmZmVjdHNQcm9wZXJ0eShwcm9wZXJ0eSk7CisKKyAgICAgICAg
cmV0dXJuICFwb3N0YWN0aXZlKCkgJiYgYWZmZWN0c1Byb3BlcnR5KHByb3BlcnR5KTsKKyAgICB9
CisgICAgICAgIAorcHJvdGVjdGVkOgorICAgIEVsZW1lbnQqIGVsZW1lbnRGb3JFdmVudERpc3Bh
dGNoKCkKKyAgICB7CisgICAgICAgIGlmIChtX29iamVjdC0+bm9kZSgpICYmIG1fb2JqZWN0LT5u
b2RlKCktPmlzRWxlbWVudE5vZGUoKSkKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxF
bGVtZW50Kj4obV9vYmplY3QtPm5vZGUoKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAg
ICAKKyAgICB2aXJ0dWFsIHZvaWQgb3ZlcnJpZGVBbmltYXRpb25zKCkgeyB9CisgICAgdmlydHVh
bCB2b2lkIHJlc3VtZU92ZXJyaWRkZW5BbmltYXRpb25zKCkgeyB9CisgICAgCisgICAgQ29tcG9z
aXRlQW5pbWF0aW9uKiBjb21wb3NpdGVBbmltYXRpb24oKSB7IHJldHVybiBtX2NvbXBBbmltOyB9
CisgICAgCisgICAgLy8gVGhlc2UgYXJlIGNhbGxlZCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIHRp
bWVyIGZpcmVzIHNvIHN1YmNsYXNzZXMgY2FuIGRvIGFueSBleHRyYSB3b3JrCisgICAgdmlydHVh
bCB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoZG91YmxlIGVsYXBzZWRUaW1lKSB7IH0KKyAgICB2aXJ0
dWFsIHZvaWQgb25BbmltYXRpb25JdGVyYXRpb24oZG91YmxlIGVsYXBzZWRUaW1lKSB7IH0KKyAg
ICB2aXJ0dWFsIHZvaWQgb25BbmltYXRpb25FbmQoZG91YmxlIGVsYXBzZWRUaW1lKSB7IH0KKyAg
ICB2aXJ0dWFsIGJvb2wgc3RhcnRBbmltYXRpb24oZG91YmxlIGJlZ2luVGltZSkgeyByZXR1cm4g
ZmFsc2U7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZW5kQW5pbWF0aW9uKGJvb2wgcmVzZXQpIHsgfQor
ICAgIAorICAgIHZvaWQgcHJpbWVFdmVudFRpbWVycygpOworICAgIAorcHJvdGVjdGVkOgorICAg
IEFuaW1TdGF0ZSBtX2FuaW1TdGF0ZTsKKyAgICBpbnQgbV9pdGVyYXRpb247CisgICAgCisgICAg
Ym9vbCBtX2FuaW1hdGluZzsgICAgICAgLy8gdHJhbnNpdGlvbi9hbmltYXRpb24gcmVxdWlyZXMg
Y29udGludWFsIHRpbWVyIGZpcmluZworICAgIGJvb2wgbV93YWl0ZWRGb3JSZXNwb25zZTsKKyAg
ICBkb3VibGUgbV9zdGFydFRpbWU7CisgICAgZG91YmxlIG1fcGF1c2VUaW1lOworICAgIFJlbmRl
ck9iamVjdCogbV9vYmplY3Q7CisgICAgCisgICAgQW5pbWF0aW9uVGltZXJDYWxsYmFjayBtX2Fu
aW1hdGlvblRpbWVyQ2FsbGJhY2s7CisgICAgQW5pbWF0aW9uRXZlbnREaXNwYXRjaGVyIG1fYW5p
bWF0aW9uRXZlbnREaXNwYXRjaGVyOworICAgIFJlZlB0cjxBbmltYXRpb24+IG1fYW5pbWF0aW9u
OworICAgIENvbXBvc2l0ZUFuaW1hdGlvbiogbV9jb21wQW5pbTsKKyAgICBib29sIG1fd2FpdGlu
Z0ZvckVuZEV2ZW50OworfTsKKworLy8gQW4gSW1wbGljaXRBbmltYXRpb24gdHJhY2tzIHRoZSBz
dGF0ZSBvZiBhIHRyYW5zaXRpb24gb2YgYSBzcGVjaWZpYyBDU1MgcHJvcGVydHkKKy8vIGZvciBh
IHNpbmdsZSBSZW5kZXJPYmplY3QuCitjbGFzcyBJbXBsaWNpdEFuaW1hdGlvbiA6IHB1YmxpYyBB
bmltYXRpb25CYXNlIHsKK3B1YmxpYzoKKyAgICBJbXBsaWNpdEFuaW1hdGlvbihjb25zdCBBbmlt
YXRpb24qIHRyYW5zaXRpb24sIGludCBhbmltYXRpbmdQcm9wZXJ0eSwgUmVuZGVyT2JqZWN0KiBy
ZW5kZXJlciwgQ29tcG9zaXRlQW5pbWF0aW9uKiBjb21wQW5pbSkKKyAgICA6IEFuaW1hdGlvbkJh
c2UodHJhbnNpdGlvbiwgcmVuZGVyZXIsIGNvbXBBbmltKQorICAgICwgbV90cmFuc2l0aW9uUHJv
cGVydHkodHJhbnNpdGlvbi0+cHJvcGVydHkoKSkKKyAgICAsIG1fYW5pbWF0aW5nUHJvcGVydHko
YW5pbWF0aW5nUHJvcGVydHkpCisgICAgLCBtX292ZXJyaWRkZW4oZmFsc2UpCisgICAgLCBtX2Zy
b21TdHlsZSgwKQorICAgICwgbV90b1N0eWxlKDApCisgICAgeworICAgICAgICBBU1NFUlQoYW5p
bWF0aW5nUHJvcGVydHkgIT0gY0FuaW1hdGVBbGwpOworICAgIH0KKyAgICAKKyAgICB2aXJ0dWFs
IH5JbXBsaWNpdEFuaW1hdGlvbigpCisgICAgeworICAgICAgICBBU1NFUlQoIW1fZnJvbVN0eWxl
ICYmICFtX3RvU3R5bGUpOworICAgICAgICAKKyAgICAgICAgLy8gSWYgd2Ugd2VyZSB3YWl0aW5n
IGZvciBhbiBlbmQgZXZlbnQsIHdlIG5lZWQgdG8gZmluaXNoIHRoZSBhbmltYXRpb24gdG8gbWFr
ZSBzdXJlIG5vIG9sZAorICAgICAgICAvLyBhbmltYXRpb25zIHN0aWNrIGFyb3VuZCBpbiB0aGUg
bG93ZXIgbGV2ZWxzCisgICAgICAgIGlmICh3YWl0aW5nRm9yRW5kRXZlbnQoKSAmJiBtX29iamVj
dCkKKyAgICAgICAgICAgIEFTU0VSVCgwKTsKKyAgICAgICAgCisgICAgICAgIC8vIERvIHRoZSBj
bGVhbnVwIGhlcmUgaW5zdGVhZCBvZiBpbiB0aGUgYmFzZSBjbGFzcyBzbyB0aGUgc3BlY2lhbGl6
ZWQgbWV0aG9kcyBnZXQgY2FsbGVkCisgICAgICAgIGlmICghcG9zdGFjdGl2ZSgpKQorICAgICAg
ICAgICAgdXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVUX0VORF9BTklNQVRJT04sIC0xKTsg
ICAgIAorICAgIH0KKyAgICAKKyAgICBpbnQgdHJhbnNpdGlvblByb3BlcnR5KCkgY29uc3QgeyBy
ZXR1cm4gbV90cmFuc2l0aW9uUHJvcGVydHk7IH0KKyAgICBpbnQgYW5pbWF0aW5nUHJvcGVydHko
KSBjb25zdCB7IHJldHVybiBtX2FuaW1hdGluZ1Byb3BlcnR5OyB9CisgICAgCisgICAgdmlydHVh
bCB2b2lkIG9uQW5pbWF0aW9uRW5kKGRvdWJsZSBpbkVsYXBzZWRUaW1lKTsKKyAgICAKKyAgICB2
aXJ0dWFsIHZvaWQgYW5pbWF0ZShDb21wb3NpdGVBbmltYXRpb24qLCBSZW5kZXJPYmplY3QqLCBj
b25zdCBSZW5kZXJTdHlsZSogY3VycmVudFN0eWxlLCAKKyAgICAgICAgICAgICAgICAgICAgICAg
ICBjb25zdCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUsIFJlbmRlclN0eWxlKiYgYW5pbWF0ZWRT
dHlsZSk7CisgICAgdmlydHVhbCB2b2lkIHJlc2V0KFJlbmRlck9iamVjdCogcmVuZGVyZXIsIGNv
bnN0IFJlbmRlclN0eWxlKiBmcm9tID0gMCwgY29uc3QgUmVuZGVyU3R5bGUqIHRvID0gMCk7Cisg
ICAgCisgICAgdm9pZCBzZXRPdmVycmlkZGVuKGJvb2wgYik7CisgICAgdmlydHVhbCBib29sIG92
ZXJyaWRkZW4oKSBjb25zdCB7IHJldHVybiBtX292ZXJyaWRkZW47IH0KKyAgICAKKyAgICB2aXJ0
dWFsIGJvb2wgc2hvdWxkRmlyZUV2ZW50cygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgICAK
KyAgICB2aXJ0dWFsIGJvb2wgYWZmZWN0c1Byb3BlcnR5KGludCBwcm9wZXJ0eSkgY29uc3Q7Cisg
ICAgCisgICAgYm9vbCBoYXNTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fZnJvbVN0eWxlICYmIG1f
dG9TdHlsZTsgfQorICAgIAorICAgIGJvb2wgaXNUYXJnZXRQcm9wZXJ0eUVxdWFsKGludCBwcm9w
LCBjb25zdCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUpOworCisgICAgdm9pZCBibGVuZFByb3Bl
cnR5VmFsdWVJblN0eWxlKGludCBwcm9wLCBSZW5kZXJTdHlsZSogY3VycmVudFN0eWxlKTsKKyAg
ICAKK3Byb3RlY3RlZDoKKyAgICBib29sIHNob3VsZFNlbmRFdmVudEZvckxpc3RlbmVyKERvY3Vt
ZW50OjpMaXN0ZW5lclR5cGUgaW5MaXN0ZW5lclR5cGUpCisgICAgeworICAgICAgICByZXR1cm4g
bV9vYmplY3QtPmRvY3VtZW50KCktPmhhc0xpc3RlbmVyVHlwZShpbkxpc3RlbmVyVHlwZSk7Cisg
ICAgfQorICAgIAorICAgIGJvb2wgc2VuZFRyYW5zaXRpb25FdmVudChjb25zdCBBdG9taWNTdHJp
bmcmIGluRXZlbnRUeXBlLCBkb3VibGUgaW5FbGFwc2VkVGltZSk7CisgICAgCitwcml2YXRlOgor
ICAgIGludCBtX3RyYW5zaXRpb25Qcm9wZXJ0eTsgICAvLyBUcmFuc2l0aW9uIHByb3BlcnR5IGFz
IHNwZWNpZmllZCBpbiB0aGUgUmVuZGVyU3R5bGUuIE1heSBiZSBjQW5pbWF0ZUFsbAorICAgIGlu
dCBtX2FuaW1hdGluZ1Byb3BlcnR5OyAgICAvLyBTcGVjaWZpYyBwcm9wZXJ0eSBmb3IgdGhpcyBJ
bXBsaWNpdEFuaW1hdGlvbgorICAgIGJvb2wgbV9vdmVycmlkZGVuOyAgICAgICAgICAvLyB0cnVl
IHdoZW4gdGhlcmUgaXMgYSBrZXlmcmFtZSBhbmltYXRpb24gdGhhdCBvdmVycmlkZXMgdGhlIHRy
YW5zaXRpb25pbmcgcHJvcGVydHkKKyAgICAKKyAgICAvLyBUaGUgdHdvIHN0eWxlcyB0aGF0IHdl
IGFyZSBibGVuZGluZy4KKyAgICBSZW5kZXJTdHlsZSogbV9mcm9tU3R5bGU7CisgICAgUmVuZGVy
U3R5bGUqIG1fdG9TdHlsZTsKK307CisKK3ZvaWQgQW5pbWF0aW9uVGltZXJDYWxsYmFjazo6dGlt
ZXJGaXJlZChUaW1lcjxBbmltYXRpb25UaW1lckJhc2U+KikKK3sKKyAgICBtX2FuaW0tPmFuaW1h
dGlvblRpbWVyQ2FsbGJhY2tGaXJlZChtX2V2ZW50VHlwZSwgbV9lbGFwc2VkVGltZSk7Cit9CisK
K3ZvaWQgQW5pbWF0aW9uRXZlbnREaXNwYXRjaGVyOjp0aW1lckZpcmVkKFRpbWVyPEFuaW1hdGlv
blRpbWVyQmFzZT4qKQoreworICAgIG1fYW5pbS0+YW5pbWF0aW9uRXZlbnREaXNwYXRjaGVyRmly
ZWQobV9lbGVtZW50LmdldCgpLCBtX25hbWUsIG1fcHJvcGVydHksIG1fcmVzZXQsIG1fZXZlbnRU
eXBlLCBtX2VsYXBzZWRUaW1lKTsKK30KKworLy8gQW4gS2V5ZnJhbWVBbmltYXRpb24gdHJhY2tz
IHRoZSBzdGF0ZSBvZiBhbiBleHBsaWNpdCBhbmltYXRpb24KKy8vIGZvciBhIHNpbmdsZSBSZW5k
ZXJPYmplY3QuCitjbGFzcyBLZXlmcmFtZUFuaW1hdGlvbiA6IHB1YmxpYyBBbmltYXRpb25CYXNl
IHsKK3B1YmxpYzoKKyAgICBLZXlmcmFtZUFuaW1hdGlvbihjb25zdCBBbmltYXRpb24qIGFuaW1h
dGlvbiwgUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgaW50IGluZGV4LCBDb21wb3NpdGVBbmltYXRp
b24qIGNvbXBBbmltKQorICAgIDogQW5pbWF0aW9uQmFzZShhbmltYXRpb24sIHJlbmRlcmVyLCBj
b21wQW5pbSkKKyAgICAsIG1fa2V5ZnJhbWVzKGFuaW1hdGlvbi0+a2V5ZnJhbWVMaXN0KCkpCisg
ICAgLCBtX25hbWUoYW5pbWF0aW9uLT5uYW1lKCkpCisgICAgLCBtX2luZGV4KGluZGV4KQorICAg
IHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5LZXlmcmFtZUFuaW1hdGlvbigpCisgICAgeworICAg
ICAgICAvLyBEbyB0aGUgY2xlYW51cCBoZXJlIGluc3RlYWQgb2YgaW4gdGhlIGJhc2UgY2xhc3Mg
c28gdGhlIHNwZWNpYWxpemVkIG1ldGhvZHMgZ2V0IGNhbGxlZAorICAgICAgICBpZiAoIXBvc3Rh
Y3RpdmUoKSkKKyAgICAgICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFURV9JTlBVVF9FTkRf
QU5JTUFUSU9OLCAtMSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGFuaW1hdGUoQ29tcG9z
aXRlQW5pbWF0aW9uKiwgUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyU3R5bGUqIGN1cnJlbnRT
dHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSogdGFyZ2V0
U3R5bGUsIFJlbmRlclN0eWxlKiYgYW5pbWF0ZWRTdHlsZSk7CisKKyAgICB2b2lkIHNldE5hbWUo
Y29uc3QgU3RyaW5nJiBzKSB7IG1fbmFtZSA9IHM7IH0KKyAgICBjb25zdCBBdG9taWNTdHJpbmcm
IG5hbWUoKSBjb25zdCB7IHJldHVybiBtX25hbWU7IH0KKyAgICBpbnQgaW5kZXgoKSBjb25zdCB7
IHJldHVybiBtX2luZGV4OyB9CisKKyAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkRmlyZUV2ZW50cygp
IGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBv
bkFuaW1hdGlvblN0YXJ0KGRvdWJsZSBpbkVsYXBzZWRUaW1lKTsKKyAgICB2aXJ0dWFsIHZvaWQg
b25BbmltYXRpb25JdGVyYXRpb24oZG91YmxlIGluRWxhcHNlZFRpbWUpOworICAgIHZpcnR1YWwg
dm9pZCBvbkFuaW1hdGlvbkVuZChkb3VibGUgaW5FbGFwc2VkVGltZSk7CisgICAgdmlydHVhbCB2
b2lkIGVuZEFuaW1hdGlvbihib29sIHJlc2V0KTsKKworICAgIHZpcnR1YWwgdm9pZCBvdmVycmlk
ZUFuaW1hdGlvbnMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVzdW1lT3ZlcnJpZGRlbkFuaW1hdGlv
bnMoKTsKKyAgICAKKyAgICBib29sIHNob3VsZFNlbmRFdmVudEZvckxpc3RlbmVyKERvY3VtZW50
OjpMaXN0ZW5lclR5cGUgaW5MaXN0ZW5lclR5cGUpCisgICAgeworICAgICAgICByZXR1cm4gbV9v
YmplY3QtPmRvY3VtZW50KCktPmhhc0xpc3RlbmVyVHlwZShpbkxpc3RlbmVyVHlwZSk7CisgICAg
fQorICAgIAorICAgIGJvb2wgc2VuZEFuaW1hdGlvbkV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyYg
aW5FdmVudFR5cGUsIGRvdWJsZSBpbkVsYXBzZWRUaW1lKTsKKyAgICAKKyAgICB2aXJ0dWFsIGJv
b2wgYWZmZWN0c1Byb3BlcnR5KGludCBwcm9wZXJ0eSkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAg
Ly8gVGhlIGtleWZyYW1lcyB0aGF0IHdlIGFyZSBibGVuZGluZy4KKyAgICBSZWZQdHI8S2V5ZnJh
bWVMaXN0PiBtX2tleWZyYW1lczsKKyAgICBBdG9taWNTdHJpbmcgbV9uYW1lOworICAgIC8vIFRo
ZSBvcmRlciBpbiB3aGljaCB0aGlzIGFuaW1hdGlvbiBhcHBlYXJzIGluIHRoZSBhbmltYXRpb24t
bmFtZSBzdHlsZS4KKyAgICBpbnQgbV9pbmRleDsKK307CisKK0FuaW1hdGlvbkJhc2U6OkFuaW1h
dGlvbkJhc2UoY29uc3QgQW5pbWF0aW9uKiB0cmFuc2l0aW9uLCBSZW5kZXJPYmplY3QqIHJlbmRl
cmVyLCBDb21wb3NpdGVBbmltYXRpb24qIGNvbXBBbmltKQorOiBtX2FuaW1TdGF0ZShTVEFURV9O
RVcpCissIG1faXRlcmF0aW9uKDApCissIG1fYW5pbWF0aW5nKGZhbHNlKQorLCBtX3dhaXRlZEZv
clJlc3BvbnNlKGZhbHNlKQorLCBtX3N0YXJ0VGltZSgwKQorLCBtX3BhdXNlVGltZSgtMSkKKywg
bV9vYmplY3QocmVuZGVyZXIpCissIG1fYW5pbWF0aW9uVGltZXJDYWxsYmFjayhjb25zdF9jYXN0
PEFuaW1hdGlvbkJhc2UqPih0aGlzKSkKKywgbV9hbmltYXRpb25FdmVudERpc3BhdGNoZXIoY29u
c3RfY2FzdDxBbmltYXRpb25CYXNlKj4odGhpcykpCissIG1fYW5pbWF0aW9uKGNvbnN0X2Nhc3Q8
QW5pbWF0aW9uKj4odHJhbnNpdGlvbikpCissIG1fY29tcEFuaW0oY29tcEFuaW0pCissIG1fd2Fp
dGluZ0ZvckVuZEV2ZW50KGZhbHNlKQoreworfQorCit2b2lkIEFuaW1hdGlvbkJhc2U6OnVwZGF0
ZVN0YXRlTWFjaGluZShBbmltU3RhdGVJbnB1dCBpbnB1dCwgZG91YmxlIHBhcmFtKQoreworICAg
IC8vIElmIHdlIGdldCBhIFJFU1RBUlQgdGhlbiB3ZSBmb3JjZSBhIG5ldyBhbmltYXRpb24sIHJl
Z2FyZGxlc3Mgb2Ygc3RhdGUKKyAgICBpZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfTUFLRV9ORVcp
IHsKKyAgICAgICAgaWYgKG1fYW5pbVN0YXRlID09IFNUQVRFX1NUQVJUX1dBSVRfU1RZTEVfQVZB
SUxBQkxFKQorICAgICAgICAgICAgbV9jb21wQW5pbS0+c2V0V2FpdGluZ0ZvclN0eWxlQXZhaWxh
YmxlKGZhbHNlKTsKKyAgICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9ORVc7CisgICAgICAgIG1f
c3RhcnRUaW1lID0gMDsKKyAgICAgICAgbV9wYXVzZVRpbWUgPSAtMTsKKyAgICAgICAgbV93YWl0
ZWRGb3JSZXNwb25zZSA9IGZhbHNlOworICAgICAgICBlbmRBbmltYXRpb24oZmFsc2UpOworICAg
ICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYgKGlucHV0ID09IFNUQVRFX0lOUFVUX1JF
U1RBUlRfQU5JTUFUSU9OKSB7CisgICAgICAgIGNhbmNlbFRpbWVycygpOworICAgICAgICBpZiAo
bV9hbmltU3RhdGUgPT0gU1RBVEVfU1RBUlRfV0FJVF9TVFlMRV9BVkFJTEFCTEUpCisgICAgICAg
ICAgICBtX2NvbXBBbmltLT5zZXRXYWl0aW5nRm9yU3R5bGVBdmFpbGFibGUoZmFsc2UpOworICAg
ICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX05FVzsKKyAgICAgICAgbV9zdGFydFRpbWUgPSAwOwor
ICAgICAgICBtX3BhdXNlVGltZSA9IC0xOworICAgICAgICBlbmRBbmltYXRpb24oZmFsc2UpOwor
ICAgICAgICAKKyAgICAgICAgaWYgKCFwYXVzZWQoKSkKKyAgICAgICAgICAgIHVwZGF0ZVN0YXRl
TWFjaGluZShTVEFURV9JTlBVVF9TVEFSVF9BTklNQVRJT04sIC0xKTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKyAgICBlbHNlIGlmIChpbnB1dCA9PSBTVEFURV9JTlBVVF9FTkRfQU5JTUFUSU9O
KSB7CisgICAgICAgIGNhbmNlbFRpbWVycygpOworICAgICAgICBpZiAobV9hbmltU3RhdGUgPT0g
U1RBVEVfU1RBUlRfV0FJVF9TVFlMRV9BVkFJTEFCTEUpCisgICAgICAgICAgICBtX2NvbXBBbmlt
LT5zZXRXYWl0aW5nRm9yU3R5bGVBdmFpbGFibGUoZmFsc2UpOworICAgICAgICBtX2FuaW1TdGF0
ZSA9IFNUQVRFX0RPTkU7CisgICAgICAgIGVuZEFuaW1hdGlvbih0cnVlKTsKKyAgICAgICAgcmV0
dXJuOworICAgIH0KKyAgICBlbHNlIGlmIChpbnB1dCA9PSBTVEFURV9JTlBVVF9QQVVTRV9PVkVS
UklERSkgeworICAgICAgICBpZiAobV9hbmltU3RhdGUgPT0gU1RBVEVfU1RBUlRfV0FJVF9SRVNQ
T05TRSkgeworICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGluIHRoZSBXQUlUX1JFU1BPTlNFIHN0
YXRlLCB0aGUgYW5pbWF0aW9uIHdpbGwgZ2V0IGNhbmNlbGVkIGJlZm9yZSAKKyAgICAgICAgICAg
IC8vIHdlIGdldCBhIHJlc3BvbnNlLCBzbyBtb3ZlIHRvIHRoZSBuZXh0IHN0YXRlCisgICAgICAg
ICAgICBlbmRBbmltYXRpb24oZmFsc2UpOworICAgICAgICAgICAgdXBkYXRlU3RhdGVNYWNoaW5l
KFNUQVRFX0lOUFVUX1NUQVJUX1RJTUVfU0VULCBjdXJyZW50VGltZSgpKTsKKyAgICAgICAgfQor
ICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYgKGlucHV0ID09IFNUQVRFX0lOUFVU
X1JFU1VNRV9PVkVSUklERSkgeworICAgICAgICBpZiAobV9hbmltU3RhdGUgPT0gU1RBVEVfTE9P
UElORyB8fCBtX2FuaW1TdGF0ZSA9PSBTVEFURV9FTkRJTkcpIHsKKyAgICAgICAgICAgIC8vIFN0
YXJ0IHRoZSBhbmltYXRpb24KKyAgICAgICAgICAgIHN0YXJ0QW5pbWF0aW9uKG1fc3RhcnRUaW1l
KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIC8vIEV4ZWN1
dGUgc3RhdGUgbWFjaGluZQorICAgIHN3aXRjaChtX2FuaW1TdGF0ZSkgeworICAgICAgICBjYXNl
IFNUQVRFX05FVzoKKyAgICAgICAgICAgIEFTU0VSVChpbnB1dCA9PSBTVEFURV9JTlBVVF9TVEFS
VF9BTklNQVRJT04gfHwgaW5wdXQgPT0gU1RBVEVfSU5QVVRfUExBWV9TVEFURV9SVU5OSU5HIHx8
IGlucHV0ID09IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUEFVU0VEKTsKKyAgICAgICAgICAgIGlm
IChpbnB1dCA9PSBTVEFURV9JTlBVVF9TVEFSVF9BTklNQVRJT04gfHwgaW5wdXQgPT0gU1RBVEVf
SU5QVVRfUExBWV9TVEFURV9SVU5OSU5HKSB7CisgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBz
dGFydCB0aW1lciB0byB0aGUgaW5pdGlhbCBkZWxheSAoMCBpZiBubyBkZWxheSkKKyAgICAgICAg
ICAgICAgICBtX3dhaXRlZEZvclJlc3BvbnNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbV9h
bmltU3RhdGUgPSBTVEFURV9TVEFSVF9XQUlUX1RJTUVSOworICAgICAgICAgICAgICAgIG1fYW5p
bWF0aW9uVGltZXJDYWxsYmFjay5zdGFydFRpbWVyKG1fYW5pbWF0aW9uLT5kZWxheSgpLCBFdmVu
dE5hbWVzOjp3ZWJraXRBbmltYXRpb25TdGFydEV2ZW50LCBtX2FuaW1hdGlvbi0+ZGVsYXkoKSk7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9T
VEFSVF9XQUlUX1RJTUVSOgorICAgICAgICAgICAgQVNTRVJUKGlucHV0ID09IFNUQVRFX0lOUFVU
X1NUQVJUX1RJTUVSX0ZJUkVEIHx8IGlucHV0ID09IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUEFV
U0VEKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGlucHV0ID09IFNUQVRFX0lOUFVU
X1NUQVJUX1RJTUVSX0ZJUkVEKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKHBhcmFtID49IDAp
OworICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHRpbWVyIGhhcyBmaXJlZCwgdGVsbCB0aGUgYW5p
bWF0aW9uIHRvIHN0YXJ0IGFuZCB3YWl0IGZvciBpdCB0byByZXNwb25kIHdpdGggc3RhcnQgdGlt
ZQorICAgICAgICAgICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfU1RBUlRfV0FJVF9TVFlMRV9B
VkFJTEFCTEU7CisgICAgICAgICAgICAgICAgbV9jb21wQW5pbS0+c2V0V2FpdGluZ0ZvclN0eWxl
QXZhaWxhYmxlKHRydWUpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIFRy
aWdnZXIgYSByZW5kZXIgc28gd2UgY2FuIHN0YXJ0IHRoZSBhbmltYXRpb24KKyAgICAgICAgICAg
ICAgICBzZXRDaGFuZ2VkKG1fb2JqZWN0LT5lbGVtZW50KCkpOworICAgICAgICAgICAgICAgIG1f
b2JqZWN0LT5hbmltYXRpb24oKS0+c3RhcnRVcGRhdGVSZW5kZXJpbmdEaXNwYXRjaGVyKCk7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQo
cnVubmluZygpKTsKKyAgICAgICAgICAgICAgICAvLyBXZSdyZSB3YWl0aW5nIGZvciB0aGUgc3Rh
cnQgdGltZXIgdG8gZmlyZSBhbmQgd2UgZ290IGEgcGF1c2UuIENhbmNlbCB0aGUgdGltZXIsIHBh
dXNlIGFuZCB3YWl0CisgICAgICAgICAgICAgICAgbV9wYXVzZVRpbWUgPSBjdXJyZW50VGltZSgp
OworICAgICAgICAgICAgICAgIGNhbmNlbFRpbWVycygpOworICAgICAgICAgICAgICAgIG1fYW5p
bVN0YXRlID0gU1RBVEVfUEFVU0VEX1dBSVRfVElNRVI7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9TVEFSVF9XQUlUX1NUWUxFX0FWQUlMQUJM
RToKKyAgICAgICAgICAgIEFTU0VSVChpbnB1dCA9PSBTVEFURV9JTlBVVF9TVFlMRV9BVkFJTEFC
TEUgfHwgaW5wdXQgPT0gU1RBVEVfSU5QVVRfUExBWV9TVEFURV9QQVVTRUQpOworICAgICAgICAg
ICAgCisgICAgICAgICAgICBtX2NvbXBBbmltLT5zZXRXYWl0aW5nRm9yU3R5bGVBdmFpbGFibGUo
ZmFsc2UpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaW5wdXQgPT0gU1RBVEVfSU5Q
VVRfU1RZTEVfQVZBSUxBQkxFKSB7CisgICAgICAgICAgICAgICAgLy8gU3RhcnQgdGltZXIgaGFz
IGZpcmVkLCB0ZWxsIHRoZSBhbmltYXRpb24gdG8gc3RhcnQgYW5kIHdhaXQgZm9yIGl0IHRvIHJl
c3BvbmQgd2l0aCBzdGFydCB0aW1lCisgICAgICAgICAgICAgICAgbV9hbmltU3RhdGUgPSBTVEFU
RV9TVEFSVF9XQUlUX1JFU1BPTlNFOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAg
IG92ZXJyaWRlQW5pbWF0aW9ucygpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAg
IC8vIFNlbmQgc3RhcnQgZXZlbnQsIGlmIG5lZWRlZAorICAgICAgICAgICAgICAgIG9uQW5pbWF0
aW9uU3RhcnQoMC4wZik7IC8vIFRoZSBlbGFwc2VkVGltZSBpcyBhbHdheXMgMCBoZXJlCisgICAg
ICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gU3RhcnQgdGhlIGFuaW1hdGlvbgorICAg
ICAgICAgICAgICAgIGlmIChvdmVycmlkZGVuKCkgfHwgIXN0YXJ0QW5pbWF0aW9uKDApKSB7Cisg
ICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBnb2luZyB0byBnZXQgYSBzdGFydFRpbWUg
Y2FsbGJhY2ssIHNvIGZpcmUgdGhlIHN0YXJ0IHRpbWUgaGVyZQorICAgICAgICAgICAgICAgICAg
ICBtX2FuaW1TdGF0ZSA9IFNUQVRFX1NUQVJUX1dBSVRfUkVTUE9OU0U7CisgICAgICAgICAgICAg
ICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFURV9JTlBVVF9TVEFSVF9USU1FX1NFVCwgY3Vy
cmVudFRpbWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgICAgICAgICAgbV93YWl0ZWRGb3JSZXNwb25zZSA9IHRydWU7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQocnVubmluZygp
KTsKKyAgICAgICAgICAgICAgICAvLyBXZSdyZSB3YWl0aW5nIGZvciB0aGUgYSBub3RpZmljYXRp
b24gdGhhdCB0aGUgc3R5bGUgaGFzIGJlZW4gc2V0dXAuIElmIHdlJ3JlIGFza2VkIHRvIHdhaXQK
KyAgICAgICAgICAgICAgICAvLyBhdCB0aGlzIHBvaW50LCB0aGUgc3R5bGUgbXVzdCBoYXZlIGJl
ZW4gcHJvY2Vzc2VkLCBzbyB3ZSBjYW4gZGVhbCB3aXRoIHRoaXMgbGlrZSB3ZSB3b3VsZAorICAg
ICAgICAgICAgICAgIC8vIGZvciBXQUlUX1JFU1BPTlNFLCBleGNlcHQgdGhhdCB3ZSBkb24ndCBu
ZWVkIHRvIGRvIGFuIGVuZEFuaW1hdGlvbigpLgorICAgICAgICAgICAgICAgIG1fcGF1c2VUaW1l
ID0gMDsKKyAgICAgICAgICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX1NUQVJUX1dBSVRfUkVT
UE9OU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBT
VEFURV9TVEFSVF9XQUlUX1JFU1BPTlNFOgorICAgICAgICAgICAgQVNTRVJUKGlucHV0ID09IFNU
QVRFX0lOUFVUX1NUQVJUX1RJTUVfU0VUIHx8IGlucHV0ID09IFNUQVRFX0lOUFVUX1BMQVlfU1RB
VEVfUEFVU0VEKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGlucHV0ID09IFNUQVRF
X0lOUFVUX1NUQVJUX1RJTUVfU0VUKSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKHBhcmFtID49
IDApOworICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBzdGFydCB0aW1lLCBzZXQgaXQsIHVu
bGVzcyB0aGUgc3RhcnRUaW1lIGlzIGFscmVhZHkgc2V0CisgICAgICAgICAgICAgICAgaWYgKG1f
c3RhcnRUaW1lIDw9IDApCisgICAgICAgICAgICAgICAgICAgIG1fc3RhcnRUaW1lID0gcGFyYW07
CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gRGVjaWRlIHdoZW4gdGhlIGVu
ZCBvciBsb29wIGV2ZW50IG5lZWRzIHRvIGZpcmUKKyAgICAgICAgICAgICAgICBwcmltZUV2ZW50
VGltZXJzKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBh
IHJlbmRlciBzbyB3ZSBjYW4gc3RhcnQgdGhlIGFuaW1hdGlvbgorICAgICAgICAgICAgICAgIHNl
dENoYW5nZWQobV9vYmplY3QtPmVsZW1lbnQoKSk7CisgICAgICAgICAgICAgICAgbV9vYmplY3Qt
PmFuaW1hdGlvbigpLT5zdGFydFVwZGF0ZVJlbmRlcmluZ0Rpc3BhdGNoZXIoKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBwYXVz
aW5nIHdoaWxlIHdhaXRpbmcgZm9yIGEgc3RhcnQgcmVzcG9uc2UuIENhbmNlbCB0aGUgYW5pbWF0
aW9uIGFuZCB3YWl0LiBXaGVuIAorICAgICAgICAgICAgICAgIC8vIHdlIHVucGF1c2UsIHdlIHdp
bGwgYWN0IGFzIHRob3VnaCB0aGUgc3RhcnQgdGltZXIganVzdCBmaXJlZAorICAgICAgICAgICAg
ICAgIG1fcGF1c2VUaW1lID0gMDsKKyAgICAgICAgICAgICAgICBlbmRBbmltYXRpb24oZmFsc2Up
OworICAgICAgICAgICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfUEFVU0VEX1dBSVRfUkVTUE9O
U0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVEFU
RV9MT09QSU5HOgorICAgICAgICAgICAgQVNTRVJUKGlucHV0ID09IFNUQVRFX0lOUFVUX0xPT1Bf
VElNRVJfRklSRUQgfHwgaW5wdXQgPT0gU1RBVEVfSU5QVVRfUExBWV9TVEFURV9QQVVTRUQpOwor
ICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfTE9PUF9U
SU1FUl9GSVJFRCkgeworICAgICAgICAgICAgICAgIEFTU0VSVChwYXJhbSA+PSAwKTsKKyAgICAg
ICAgICAgICAgICAvLyBMb29wIHRpbWVyIGZpcmVkLCBsb29wIGFnYWluIG9yIGVuZC4KKyAgICAg
ICAgICAgICAgICBvbkFuaW1hdGlvbkl0ZXJhdGlvbihwYXJhbSk7CisgICAgICAgICAgICAgICAg
cHJpbWVFdmVudFRpbWVycygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7Cisg
ICAgICAgICAgICAgICAgLy8gV2UgYXJlIHBhdXNpbmcgd2hpbGUgcnVubmluZy4gQ2FuY2VsIHRo
ZSBhbmltYXRpb24gYW5kIHdhaXQKKyAgICAgICAgICAgICAgICBtX3BhdXNlVGltZSA9IGN1cnJl
bnRUaW1lKCk7CisgICAgICAgICAgICAgICAgY2FuY2VsVGltZXJzKCk7CisgICAgICAgICAgICAg
ICAgZW5kQW5pbWF0aW9uKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtX2FuaW1TdGF0ZSA9IFNU
QVRFX1BBVVNFRF9SVU47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgY2FzZSBTVEFURV9FTkRJTkc6CisgICAgICAgICAgICBBU1NFUlQoaW5wdXQgPT0gU1RBVEVf
SU5QVVRfRU5EX1RJTUVSX0ZJUkVEIHx8IGlucHV0ID09IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVf
UEFVU0VEKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGlucHV0ID09IFNUQVRFX0lO
UFVUX0VORF9USU1FUl9GSVJFRCkgeworICAgICAgICAgICAgICAgIEFTU0VSVChwYXJhbSA+PSAw
KTsKKyAgICAgICAgICAgICAgICAvLyBFbmQgdGltZXIgZmlyZWQsIGZpbmlzaCB1cAorICAgICAg
ICAgICAgICAgIG9uQW5pbWF0aW9uRW5kKHBhcmFtKTsKKyAgICAgICAgICAgICAgICAKKyAgICAg
ICAgICAgICAgICByZXN1bWVPdmVycmlkZGVuQW5pbWF0aW9ucygpOworICAgICAgICAgICAgICAg
IAorICAgICAgICAgICAgICAgIC8vIEZpcmUgb2ZmIGFub3RoZXIgc3R5bGUgY2hhbmdlIHNvIHdl
IGNhbiBzZXQgdGhlIGZpbmFsIHZhbHVlCisgICAgICAgICAgICAgICAgc2V0Q2hhbmdlZChtX29i
amVjdC0+ZWxlbWVudCgpKTsKKyAgICAgICAgICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX0RP
TkU7CisgICAgICAgICAgICAgICAgbV9vYmplY3QtPmFuaW1hdGlvbigpLT5zdGFydFVwZGF0ZVJl
bmRlcmluZ0Rpc3BhdGNoZXIoKTsKKyAgICAgICAgICAgICAgICAvLyB8dGhpc3wgbWF5IGJlIGRl
bGV0ZWQgaGVyZSB3aGVuIHdlJ3ZlIGJlZW4gY2FsbGVkIGZyb20gdGltZXJGaXJlZCgpCisgICAg
ICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBhcmUg
cGF1c2luZyB3aGlsZSBydW5uaW5nLiBDYW5jZWwgdGhlIGFuaW1hdGlvbiBhbmQgd2FpdAorICAg
ICAgICAgICAgICAgIG1fcGF1c2VUaW1lID0gY3VycmVudFRpbWUoKTsKKyAgICAgICAgICAgICAg
ICBjYW5jZWxUaW1lcnMoKTsKKyAgICAgICAgICAgICAgICBlbmRBbmltYXRpb24oZmFsc2UpOwor
ICAgICAgICAgICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfUEFVU0VEX1JVTjsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIC8vIHx0aGlzfCBtYXkgYmUgZGVsZXRlZCBoZXJlCisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9QQVVTRURfV0FJVF9USU1FUjoKKyAgICAg
ICAgICAgIEFTU0VSVChpbnB1dCA9PSBTVEFURV9JTlBVVF9QTEFZX1NUQVRFX1JVTk5JTkcpOwor
ICAgICAgICAgICAgQVNTRVJUKCFydW5uaW5nKCkpOworICAgICAgICAgICAgLy8gVXBkYXRlIHRo
ZSB0aW1lcworICAgICAgICAgICAgbV9zdGFydFRpbWUgKz0gY3VycmVudFRpbWUoKSAtIG1fcGF1
c2VUaW1lOworICAgICAgICAgICAgbV9wYXVzZVRpbWUgPSAtMTsKKyAgICAgICAgICAgIAorICAg
ICAgICAgICAgLy8gd2Ugd2VyZSB3YWl0aW5nIGZvciB0aGUgc3RhcnQgdGltZXIgdG8gZmlyZSwg
Z28gYmFjayBhbmQgd2FpdCBhZ2FpbgorICAgICAgICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9O
RVc7CisgICAgICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUoU1RBVEVfSU5QVVRfU1RBUlRfQU5J
TUFUSU9OLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1BBVVNF
RF9XQUlUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRF9SVU46CisgICAgICAg
ICAgICAvLyBXZSB0cmVhdCB0aGVzZSB0d28gY2FzZXMgdGhlIHNhbWUuIFRoZSBvbmx5IGRpZmZl
cmVuY2UgaXMgdGhhdCwgd2hlbiB3ZSBhcmUgaW4gdGhlIFdBSVRfUkVTUE9OU0UKKyAgICAgICAg
ICAgIC8vIHN0YXRlLCB3ZSBkb24ndCB5ZXQgaGF2ZSBhIHZhbGlkIHN0YXJ0VGltZSwgc28gd2Ug
c2VuZCAwIHRvIHN0YXJ0QW5pbWF0aW9uLiBXaGVuIHRoZSBTVEFSVF9USU1FCisgICAgICAgICAg
ICAvLyBldmVudCBjb21lcyBpbiBxbmQgd2Ugd2VyZSBpbiB0aGUgUlVOIHN0YXRlLCB3ZSB3aWxs
IG5vdGljZSB0aGF0IHdlIGhhdmUgYWxyZWFkeSBzZXQgdGhlIAorICAgICAgICAgICAgLy8gc3Rh
cnRUaW1lIGFuZCB3aWxsIGlnbm9yZSBpdC4KKyAgICAgICAgICAgIEFTU0VSVChpbnB1dCA9PSBT
VEFURV9JTlBVVF9QTEFZX1NUQVRFX1JVTk5JTkcpOworICAgICAgICAgICAgQVNTRVJUKCFydW5u
aW5nKCkpOworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB0aW1lcworICAgICAgICAgICAgaWYg
KG1fYW5pbVN0YXRlID09IFNUQVRFX1BBVVNFRF9SVU4pCisgICAgICAgICAgICAgICAgbV9zdGFy
dFRpbWUgKz0gY3VycmVudFRpbWUoKSAtIG1fcGF1c2VUaW1lOworICAgICAgICAgICAgZWxzZQor
ICAgICAgICAgICAgICAgIG1fc3RhcnRUaW1lID0gMDsKKyAgICAgICAgICAgIG1fcGF1c2VUaW1l
ID0gLTE7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFdlIHdlcmUgd2FpdGluZyBmb3Ig
YSBiZWdpbiB0aW1lIHJlc3BvbnNlIGZyb20gdGhlIGFuaW1hdGlvbiwgZ28gYmFjayBhbmQgd2Fp
dCBhZ2FpbgorICAgICAgICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9TVEFSVF9XQUlUX1JFU1BP
TlNFOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBTdGFydCB0aGUgYW5pbWF0aW9uCisg
ICAgICAgICAgICBpZiAob3ZlcnJpZGRlbigpIHx8ICFzdGFydEFuaW1hdGlvbihtX3N0YXJ0VGlt
ZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgZ29pbmcgdG8gZ2V0IGEgc3RhcnRU
aW1lIGNhbGxiYWNrLCBzbyBmaXJlIHRoZSBzdGFydCB0aW1lIGhlcmUKKyAgICAgICAgICAgICAg
ICB1cGRhdGVTdGF0ZU1hY2hpbmUoU1RBVEVfSU5QVVRfU1RBUlRfVElNRV9TRVQsIGN1cnJlbnRU
aW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAg
IG1fd2FpdGVkRm9yUmVzcG9uc2UgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IGNhc2UgU1RBVEVfRE9ORToKKyAgICAgICAgICAgIC8vIFdlJ3JlIGRvbmUuIFN0YXkgaW4gdGhp
cyBzdGF0ZSB1bnRpbCB3ZSBhcmUgZGVsZXRlZAorICAgICAgICAgICAgYnJlYWs7CisgICAgfQor
ICAgIC8vIHx0aGlzfCBtYXkgYmUgZGVsZXRlZCBoZXJlIGlmIHdlIGNhbWUgb3V0IG9mIFNUQVRF
X0VORElORyB3aGVuIHdlJ3ZlIGJlZW4gY2FsbGVkIGZyb20gdGltZXJGaXJlZCgpCit9CisgICAg
Cit2b2lkIEFuaW1hdGlvbkJhc2U6OmFuaW1hdGlvblRpbWVyQ2FsbGJhY2tGaXJlZChjb25zdCBB
dG9taWNTdHJpbmcmIGV2ZW50VHlwZSwgZG91YmxlIGVsYXBzZWRUaW1lKQoreworICAgIEFTU0VS
VChtX29iamVjdC0+ZG9jdW1lbnQoKSAmJiAhbV9vYmplY3QtPmRvY3VtZW50KCktPmluUGFnZUNh
Y2hlKCkpOworICAgIAorICAgIC8vIEZJWE1FOiB1c2UgYW4gZW51bQorICAgIGlmIChldmVudFR5
cGUgPT0gRXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uU3RhcnRFdmVudCkKKyAgICAgICAgdXBk
YXRlU3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVUX1NUQVJUX1RJTUVSX0ZJUkVELCBlbGFwc2VkVGlt
ZSk7CisgICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IEV2ZW50TmFtZXM6OndlYmtpdEFuaW1hdGlv
bkl0ZXJhdGlvbkV2ZW50KQorICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUoU1RBVEVfSU5QVVRf
TE9PUF9USU1FUl9GSVJFRCwgZWxhcHNlZFRpbWUpOworICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9
PSBFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRpb25FbmRFdmVudCkgeworICAgICAgICB1cGRhdGVT
dGF0ZU1hY2hpbmUoU1RBVEVfSU5QVVRfRU5EX1RJTUVSX0ZJUkVELCBlbGFwc2VkVGltZSk7Cisg
ICAgICAgIC8vIHx0aGlzfCBtYXkgYmUgZGVsZXRlZCBoZXJlCisgICAgfQorfQorCit2b2lkIEFu
aW1hdGlvbkJhc2U6OmFuaW1hdGlvbkV2ZW50RGlzcGF0Y2hlckZpcmVkKEVsZW1lbnQqIGVsZW1l
bnQsIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSwgaW50IHByb3BlcnR5LAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlc2V0LCBjb25zdCBB
dG9taWNTdHJpbmcmIGV2ZW50VHlwZSwgZG91YmxlIGVsYXBzZWRUaW1lKQoreworICAgIG1fd2Fp
dGluZ0ZvckVuZEV2ZW50ID0gZmFsc2U7CisgICAgCisgICAgLy8gS2VlcCBhbiBhdG9taWMgc3Ry
aW5nIG9uIHRoZSBzdGFjayB0byBrZWVwIGl0IGFsaXZlIHVudGlsIHdlIGV4aXQgdGhpcyBtZXRo
b2QKKyAgICAvLyAoc2luY2UgZGlzcGF0Y2hpbmcgdGhlIGV2ZW50IG1heSBjYXVzZSB8dGhpc3wg
dG8gYmUgZGVsZXRlZCwgdGhlcmVmb3JlIHJlbW92aW5nCisgICAgLy8gdGhlIGxhc3QgcmVmIHRv
IHRoZSBhdG9taWMgc3RyaW5nKS4KKyAgICBBdG9taWNTdHJpbmcgYW5pbU5hbWUobmFtZSk7Cisg
ICAgQXRvbWljU3RyaW5nIGFuaW1FdmVudFR5cGUoZXZlbnRUeXBlKTsKKyAgICAvLyBNYWtlIHN1
cmUgdGhlIGVsZW1lbnQgc3RpY2tzIGFyb3VuZCB0b28KKyAgICBSZWZQdHI8RWxlbWVudD4gZWxl
bWVudFJldGFpbmVyKGVsZW1lbnQpOworICAgIAorICAgIEFTU0VSVCghZWxlbWVudCB8fCAoZWxl
bWVudC0+ZG9jdW1lbnQoKSAmJiAhZWxlbWVudC0+ZG9jdW1lbnQoKS0+aW5QYWdlQ2FjaGUoKSkp
OworICAgIGlmICghZWxlbWVudCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKGV2ZW50VHlw
ZSA9PSBFdmVudE5hbWVzOjp3ZWJraXRUcmFuc2l0aW9uRW5kRXZlbnQpCisgICAgICAgIGVsZW1l
bnQtPmRpc3BhdGNoV2ViS2l0VHJhbnNpdGlvbkV2ZW50KGV2ZW50VHlwZSwgbmFtZSwgZWxhcHNl
ZFRpbWUpOworICAgIGVsc2UKKyAgICAgICAgZWxlbWVudC0+ZGlzcGF0Y2hXZWJLaXRBbmltYXRp
b25FdmVudChldmVudFR5cGUsIG5hbWUsIGVsYXBzZWRUaW1lKTsKKworICAgIC8vIFJlc3RvcmUg
dGhlIG9yaWdpbmFsICh1bmFuaW1hdGVkKSBzdHlsZQorICAgIGlmIChhbmltRXZlbnRUeXBlID09
IEV2ZW50TmFtZXM6OndlYmtpdEFuaW1hdGlvbkVuZEV2ZW50KQorICAgICAgICBpZiAoZWxlbWVu
dC0+cmVuZGVyZXIoKSkKKyAgICAgICAgICAgIHNldENoYW5nZWQoZWxlbWVudC0+cmVuZGVyZXIo
KS0+ZWxlbWVudCgpKTsKK30KKwordm9pZCBBbmltYXRpb25CYXNlOjp1cGRhdGVQbGF5U3RhdGUo
Ym9vbCBydW4pCit7CisgICAgaWYgKHBhdXNlZCgpID09IHJ1biB8fCBpc25ldygpKQorICAgICAg
ICB1cGRhdGVTdGF0ZU1hY2hpbmUocnVuID8gU1RBVEVfSU5QVVRfUExBWV9TVEFURV9SVU5OSU5H
IDogU1RBVEVfSU5QVVRfUExBWV9TVEFURV9QQVVTRUQsIC0xKTsKK30KKworZG91YmxlIEFuaW1h
dGlvbkJhc2U6OnByb2dyZXNzKGRvdWJsZSBzY2FsZSwgZG91YmxlIG9mZnNldCkgY29uc3QKK3sK
KyAgICBpZiAocHJlYWN0aXZlKCkpCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIGRvdWJs
ZSBlbGFwc2VkVGltZSA9IHJ1bm5pbmcoKSA/IChjdXJyZW50VGltZSgpIC0gbV9zdGFydFRpbWUp
IDogKG1fcGF1c2VUaW1lIC0gbV9zdGFydFRpbWUpOworICAgIGlmIChydW5uaW5nKCkgJiYgZWxh
cHNlZFRpbWUgPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICBkb3VibGUgZHVyID0g
bV9hbmltYXRpb24tPmR1cmF0aW9uKCk7CisgICAgaWYgKG1fYW5pbWF0aW9uLT5pdGVyYXRpb25D
b3VudCgpID4gMCkKKyAgICAgICAgZHVyICo9IG1fYW5pbWF0aW9uLT5pdGVyYXRpb25Db3VudCgp
OworICAgIAorICAgIGlmIChwb3N0YWN0aXZlKCkgfHwgIW1fYW5pbWF0aW9uLT5kdXJhdGlvbigp
IHx8IChtX2FuaW1hdGlvbi0+aXRlcmF0aW9uQ291bnQoKSA+IDAgJiYgZWxhcHNlZFRpbWUgPj0g
ZHVyKSkKKyAgICAgICAgcmV0dXJuIDEuMDsKKyAgICAKKyAgICAvLyBDb21wdXRlIHRoZSBmcmFj
dGlvbmFsIHRpbWUsIHRha2luZyBpbnRvIGFjY291bnQgZGlyZWN0aW9uLgorICAgIC8vIFRoZXJl
IGlzIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgaXRlcmF0aW9ucywgd2UgYXNzdW1lIHRoYXQgd2Ug
d291bGQgaGF2ZQorICAgIC8vIHNob3J0IGNpcmN1aXRlZCBhYm92ZSBpZiB3ZSB3ZXJlIGRvbmUK
KyAgICBkb3VibGUgZnJhY3Rpb25hbFRpbWUgPSBlbGFwc2VkVGltZSAvIG1fYW5pbWF0aW9uLT5k
dXJhdGlvbigpOworICAgIGludCBpbnRlZ3JhbFRpbWUgPSAoaW50KSBmcmFjdGlvbmFsVGltZTsK
KyAgICBmcmFjdGlvbmFsVGltZSAtPSBpbnRlZ3JhbFRpbWU7CisgICAgCisgICAgaWYgKG1fYW5p
bWF0aW9uLT5kaXJlY3Rpb24oKSAmJiAoaW50ZWdyYWxUaW1lICYgMSkpCisgICAgICAgIGZyYWN0
aW9uYWxUaW1lID0gMSAtIGZyYWN0aW9uYWxUaW1lOworICAgIAorICAgIGlmIChzY2FsZSAhPSAx
IHx8IG9mZnNldCAhPSAwKQorICAgICAgICBmcmFjdGlvbmFsVGltZSA9IChmcmFjdGlvbmFsVGlt
ZSAtIG9mZnNldCkgKiBzY2FsZTsKKyAgICAKKyAgICBpZiAobV9hbmltYXRpb24tPnRpbWluZ0Z1
bmN0aW9uKCkudHlwZSgpID09IExpbmVhclRpbWluZ0Z1bmN0aW9uKQorICAgICAgICByZXR1cm4g
ZnJhY3Rpb25hbFRpbWU7CisgICAgCisgICAgLy8gQ3ViaWMgYmV6aWVyLgorICAgIGRvdWJsZSBy
ZXN1bHQgPSBzb2x2ZUN1YmljQmV6aWVyRnVuY3Rpb24obV9hbmltYXRpb24tPnRpbWluZ0Z1bmN0
aW9uKCkueDEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
bV9hbmltYXRpb24tPnRpbWluZ0Z1bmN0aW9uKCkueTEoKSwKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgbV9hbmltYXRpb24tPnRpbWluZ0Z1bmN0aW9uKCkueDIo
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hbmltYXRp
b24tPnRpbWluZ0Z1bmN0aW9uKCkueTIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZnJhY3Rpb25hbFRpbWUsIG1fYW5pbWF0aW9uLT5kdXJhdGlvbigpKTsK
KyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIEFuaW1hdGlvbkJhc2U6OnByaW1lRXZlbnRU
aW1lcnMoKQoreworICAgIC8vIERlY2lkZSB3aGVuIHRoZSBlbmQgb3IgbG9vcCBldmVudCBuZWVk
cyB0byBmaXJlCisgICAgZG91YmxlIGN0ID0gY3VycmVudFRpbWUoKTsKKyAgICBjb25zdCBkb3Vi
bGUgZWxhcHNlZER1cmF0aW9uID0gY3QgLSBtX3N0YXJ0VGltZTsKKyAgICBBU1NFUlQoZWxhcHNl
ZER1cmF0aW9uID49IDApOworICAgIAorICAgIGRvdWJsZSB0b3RhbER1cmF0aW9uID0gLTE7Cisg
ICAgaWYgKG1fYW5pbWF0aW9uLT5pdGVyYXRpb25Db3VudCgpID4gMCkKKyAgICAgICAgdG90YWxE
dXJhdGlvbiA9IG1fYW5pbWF0aW9uLT5kdXJhdGlvbigpICogbV9hbmltYXRpb24tPml0ZXJhdGlv
bkNvdW50KCk7CisKKyAgICBkb3VibGUgZHVyYXRpb25MZWZ0ID0gMDsKKyAgICBkb3VibGUgbmV4
dEl0ZXJhdGlvblRpbWUgPSB0b3RhbER1cmF0aW9uOworICAgIGlmICh0b3RhbER1cmF0aW9uIDwg
MCB8fCBlbGFwc2VkRHVyYXRpb24gPCB0b3RhbER1cmF0aW9uKSB7CisgICAgICAgIGR1cmF0aW9u
TGVmdCA9IG1fYW5pbWF0aW9uLT5kdXJhdGlvbigpIC0gZm1vZChlbGFwc2VkRHVyYXRpb24sIG1f
YW5pbWF0aW9uLT5kdXJhdGlvbigpKTsKKyAgICAgICAgbmV4dEl0ZXJhdGlvblRpbWUgPSBlbGFw
c2VkRHVyYXRpb24gKyBkdXJhdGlvbkxlZnQ7CisgICAgfQorICAgIAorICAgIC8vIEF0IHRoaXMg
cG9pbnQsIHdlIG1heSBoYXZlIDAgZHVyYXRpb25MZWZ0LCBpZiB3ZSd2ZSBnb3R0ZW4gdGhlIGV2
ZW50IGxhdGUgYW5kIHdlIGFyZSBhbHJlYWR5CisgICAgLy8gcGFzdCB0b3RhbER1cmF0aW9uLiBJ
biB0aGlzIGNhc2Ugd2Ugc3RpbGwgZmlyZSBhbiBlbmQgdGltZXIgYmVmb3JlIHByb2Nlc3Npbmcg
dGhlIGVuZC4gCisgICAgLy8gVGhpcyBkZWZlcnMgdGhlIGNhbGwgdG8gc2VuZEFuaW1hdGlvbkV2
ZW50cyB0byBhdm9pZCByZS1lbnRyYW50IGNhbGxzIHRoYXQgZGVzdHJveQorICAgIC8vIHRoZSBS
ZW5kZXJPYmplY3QsIGFuZCB0aGVyZWZvcmUgfHRoaXN8IGJlZm9yZSB3ZSdyZSBkb25lIHdpdGgg
aXQuCisgICAgaWYgKHRvdGFsRHVyYXRpb24gPCAwIHx8IG5leHRJdGVyYXRpb25UaW1lIDwgdG90
YWxEdXJhdGlvbikgeworICAgICAgICAvLyBXZSBhcmUgbm90IGF0IHRoZSBlbmQgeWV0LCBzZW5k
IGEgbG9vcCBldmVudAorICAgICAgICBBU1NFUlQobmV4dEl0ZXJhdGlvblRpbWUgPiAwKTsKKyAg
ICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9MT09QSU5HOworICAgICAgICBtX2FuaW1hdGlvblRp
bWVyQ2FsbGJhY2suc3RhcnRUaW1lcihkdXJhdGlvbkxlZnQsIEV2ZW50TmFtZXM6OndlYmtpdEFu
aW1hdGlvbkl0ZXJhdGlvbkV2ZW50LCBuZXh0SXRlcmF0aW9uVGltZSk7CisgICAgfQorICAgIGVs
c2UgeworICAgICAgICAvLyBXZSBhcmUgYXQgdGhlIGVuZCwgc2VuZCBhbiBlbmQgZXZlbnQKKyAg
ICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9FTkRJTkc7CisgICAgICAgIG1fYW5pbWF0aW9uVGlt
ZXJDYWxsYmFjay5zdGFydFRpbWVyKGR1cmF0aW9uTGVmdCwgRXZlbnROYW1lczo6d2Via2l0QW5p
bWF0aW9uRW5kRXZlbnQsIG5leHRJdGVyYXRpb25UaW1lKTsKKyAgICB9Cit9CisKK3N0YXRpYyBp
bmxpbmUgaW50IGJsZW5kRnVuYyhpbnQgZnJvbSwgaW50IHRvLCBkb3VibGUgcHJvZ3Jlc3MpCit7
ICAKKyAgICByZXR1cm4gaW50KGZyb20gKyAodG8gLSBmcm9tKSAqIHByb2dyZXNzKTsKK30KKwor
c3RhdGljIGlubGluZSBkb3VibGUgYmxlbmRGdW5jKGRvdWJsZSBmcm9tLCBkb3VibGUgdG8sIGRv
dWJsZSBwcm9ncmVzcykKK3sgIAorICAgIHJldHVybiBmcm9tICsgKHRvIC0gZnJvbSkgKiBwcm9n
cmVzczsKK30KKworc3RhdGljIGlubGluZSBmbG9hdCBibGVuZEZ1bmMoZmxvYXQgZnJvbSwgZmxv
YXQgdG8sIGRvdWJsZSBwcm9ncmVzcykKK3sgIAorICAgIHJldHVybiBuYXJyb3dQcmVjaXNpb25U
b0Zsb2F0KGZyb20gKyAodG8gLSBmcm9tKSAqIHByb2dyZXNzKTsKK30KKworc3RhdGljIGlubGlu
ZSBDb2xvciBibGVuZEZ1bmMoY29uc3QgQ29sb3ImIGZyb20sIGNvbnN0IENvbG9yJiB0bywgZG91
YmxlIHByb2dyZXNzKQoreyAgCisgICAgcmV0dXJuIENvbG9yKGJsZW5kRnVuYyhmcm9tLnJlZCgp
LCB0by5yZWQoKSwgcHJvZ3Jlc3MpLAorICAgICAgICAgICAgICAgICBibGVuZEZ1bmMoZnJvbS5n
cmVlbigpLCB0by5ncmVlbigpLCBwcm9ncmVzcyksCisgICAgICAgICAgICAgICAgIGJsZW5kRnVu
Yyhmcm9tLmJsdWUoKSwgdG8uYmx1ZSgpLCBwcm9ncmVzcyksCisgICAgICAgICAgICAgICAgIGJs
ZW5kRnVuYyhmcm9tLmFscGhhKCksIHRvLmFscGhhKCksIHByb2dyZXNzKSk7Cit9CisKK3N0YXRp
YyBpbmxpbmUgTGVuZ3RoIGJsZW5kRnVuYyhjb25zdCBMZW5ndGgmIGZyb20sIGNvbnN0IExlbmd0
aCYgdG8sIGRvdWJsZSBwcm9ncmVzcykKK3sgIAorICAgIHJldHVybiB0by5ibGVuZChmcm9tLCBw
cm9ncmVzcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgSW50U2l6ZSBibGVuZEZ1bmMoY29uc3QgSW50
U2l6ZSYgZnJvbSwgY29uc3QgSW50U2l6ZSYgdG8sIGRvdWJsZSBwcm9ncmVzcykKK3sgIAorICAg
IHJldHVybiBJbnRTaXplKGJsZW5kRnVuYyhmcm9tLndpZHRoKCksIHRvLndpZHRoKCksIHByb2dy
ZXNzKSwKKyAgICAgICAgICAgICAgICAgICBibGVuZEZ1bmMoZnJvbS5oZWlnaHQoKSwgdG8uaGVp
Z2h0KCksIHByb2dyZXNzKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgU2hhZG93RGF0YSogYmxlbmRG
dW5jKGNvbnN0IFNoYWRvd0RhdGEqIGZyb20sIGNvbnN0IFNoYWRvd0RhdGEqIHRvLCBkb3VibGUg
cHJvZ3Jlc3MpCit7ICAKKyAgICBBU1NFUlQoZnJvbSAmJiB0byk7CisgICAgcmV0dXJuIG5ldyBT
aGFkb3dEYXRhKGJsZW5kRnVuYyhmcm9tLT54LCB0by0+eCwgcHJvZ3Jlc3MpLCBibGVuZEZ1bmMo
ZnJvbS0+eSwgdG8tPnksIHByb2dyZXNzKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJs
ZW5kRnVuYyhmcm9tLT5ibHVyLCB0by0+Ymx1ciwgcHJvZ3Jlc3MpLCBibGVuZEZ1bmMoZnJvbS0+
Y29sb3IsIHRvLT5jb2xvciwgcHJvZ3Jlc3MpKTsKK30KKworc3RhdGljIGlubGluZSBUcmFuc2Zv
cm1PcGVyYXRpb25zIGJsZW5kRnVuYyhjb25zdCBUcmFuc2Zvcm1PcGVyYXRpb25zJiBmcm9tLCBj
b25zdCBUcmFuc2Zvcm1PcGVyYXRpb25zJiB0bywgZG91YmxlIHByb2dyZXNzKQoreyAgICAKKyAg
ICAvLyBCbGVuZCBhbnkgb3BlcmF0aW9ucyB3aG9zZSB0eXBlcyBhY3R1YWxseSBtYXRjaCB1cC4g
IE90aGVyd2lzZSBkb24ndCBib3RoZXIuCisgICAgdW5zaWduZWQgZnJvbVNpemUgPSBmcm9tLnNp
emUoKTsKKyAgICB1bnNpZ25lZCB0b1NpemUgPSB0by5zaXplKCk7CisgICAgdW5zaWduZWQgc2l6
ZSA9IG1heChmcm9tU2l6ZSwgdG9TaXplKTsKKyAgICBUcmFuc2Zvcm1PcGVyYXRpb25zIHJlc3Vs
dDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIFJl
ZlB0cjxUcmFuc2Zvcm1PcGVyYXRpb24+IGZyb21PcCA9IGkgPCBmcm9tU2l6ZSA/IGZyb21baV0g
OiAwOworICAgICAgICBSZWZQdHI8VHJhbnNmb3JtT3BlcmF0aW9uPiB0b09wID0gaSA8IHRvU2l6
ZSA/IHRvW2ldIDogMDsKKyAgICAgICAgUmVmUHRyPFRyYW5zZm9ybU9wZXJhdGlvbj4gYmxlbmRl
ZE9wID0gdG9PcCA/IHRvT3AtPmJsZW5kKGZyb21PcC5nZXQoKSwgcHJvZ3Jlc3MpIDogZnJvbU9w
LT5ibGVuZCgwLCBwcm9ncmVzcywgdHJ1ZSk7CisgICAgICAgIGlmIChibGVuZGVkT3ApCisgICAg
ICAgICAgICByZXN1bHQuYXBwZW5kKGJsZW5kZWRPcCk7CisgICAgfQorICAgIHJldHVybiByZXN1
bHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgRVZpc2liaWxpdHkgYmxlbmRGdW5jKEVWaXNpYmlsaXR5
IGZyb20sIEVWaXNpYmlsaXR5IHRvLCBkb3VibGUgcHJvZ3Jlc3MpCit7CisgICAgLy8gQW55IG5v
bi16ZXJvIHJlc3VsdCBtZWFucyB3ZSBjb25zaWRlciB0aGUgb2JqZWN0IHRvIGJlIHZpc2libGUu
ICBPbmx5IGF0IDAgZG8gd2UgY29uc2lkZXIgdGhlIG9iamVjdCB0byBiZQorICAgIC8vIGludmlz
aWJsZS4gICBUaGUgaW52aXNpYmxlIHZhbHVlIHdlIHVzZSAoSElEREVOIHZzLiBDT0xMQVBTRSkg
ZGVwZW5kcyBvbiB0aGUgc3BlY2lmaWVkIGZyb20vdG8gdmFsdWVzLgorICAgIGRvdWJsZSBmcm9t
VmFsID0gZnJvbSA9PSBWSVNJQkxFID8gMS4gOiAwLjsKKyAgICBkb3VibGUgdG9WYWwgPSB0byA9
PSBWSVNJQkxFID8gMS4gOiAwLjsKKyAgICBpZiAoZnJvbVZhbCA9PSB0b1ZhbCkKKyAgICAgICAg
cmV0dXJuIHRvOworICAgIGRvdWJsZSByZXN1bHQgPSBibGVuZEZ1bmMoZnJvbVZhbCwgdG9WYWws
IHByb2dyZXNzKTsKKyAgICByZXR1cm4gcmVzdWx0ID4gMC4gPyBWSVNJQkxFIDogKHRvICE9IFZJ
U0lCTEUgPyB0byA6IGZyb20pOworfQorCitjbGFzcyBQcm9wZXJ0eVdyYXBwZXJCYXNlIHsKK3B1
YmxpYzoKKyAgICBQcm9wZXJ0eVdyYXBwZXJCYXNlKGludCBwcm9wKQorICAgIDogbV9wcm9wKHBy
b3ApCisgICAgeyB9CisgICAgdmlydHVhbCB+UHJvcGVydHlXcmFwcGVyQmFzZSgpIHsgfQorICAg
IHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJlbmRlclN0
eWxlKiBiKSBjb25zdD0wOworICAgIHZpcnR1YWwgdm9pZCBibGVuZChSZW5kZXJTdHlsZSogZHN0
LCBjb25zdCBSZW5kZXJTdHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUqIGIsIGRvdWJsZSBwcm9n
KSBjb25zdD0wOworICAgIAorICAgIGludCBwcm9wZXJ0eSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJv
cDsgfQorICAgIAorcHJpdmF0ZToKKyAgICBpbnQgbV9wcm9wOworfTsKKwordGVtcGxhdGUgPHR5
cGVuYW1lIFQ+CitjbGFzcyBQcm9wZXJ0eVdyYXBwZXJHZXR0ZXIgOiBwdWJsaWMgUHJvcGVydHlX
cmFwcGVyQmFzZSB7CitwdWJsaWM6CisgICAgUHJvcGVydHlXcmFwcGVyR2V0dGVyKGludCBwcm9w
LCBUIChSZW5kZXJTdHlsZTo6KmdldHRlcikoKSBjb25zdCkKKyAgICA6IFByb3BlcnR5V3JhcHBl
ckJhc2UocHJvcCkKKyAgICAsIG1fZ2V0dGVyKGdldHRlcikKKyAgICB7IH0KKyAgICAKKyAgICB2
aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IFJlbmRlclN0eWxlKiBhLCBjb25zdCBSZW5kZXJTdHls
ZSogYikgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAoYS0+Km1fZ2V0dGVyKSgpID09IChi
LT4qbV9nZXR0ZXIpKCk7CisgICAgfQorICAgIAorcHJvdGVjdGVkOgorICAgIFQgKFJlbmRlclN0
eWxlOjoqbV9nZXR0ZXIpKCkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Ns
YXNzIFByb3BlcnR5V3JhcHBlciA6IHB1YmxpYyBQcm9wZXJ0eVdyYXBwZXJHZXR0ZXI8VD4gewor
cHVibGljOgorICAgIFByb3BlcnR5V3JhcHBlcihpbnQgcHJvcCwgVCAoUmVuZGVyU3R5bGU6Oipn
ZXR0ZXIpKCkgY29uc3QsIHZvaWQgKFJlbmRlclN0eWxlOjoqc2V0dGVyKShUKSkKKyAgICA6IFBy
b3BlcnR5V3JhcHBlckdldHRlcjxUPihwcm9wLCBnZXR0ZXIpCisgICAgLCBtX3NldHRlcihzZXR0
ZXIpCisgICAgeyB9CisgICAgCisgICAgdmlydHVhbCB2b2lkIGJsZW5kKFJlbmRlclN0eWxlKiBk
c3QsIGNvbnN0IFJlbmRlclN0eWxlKiBhLCBjb25zdCBSZW5kZXJTdHlsZSogYiwgZG91YmxlIHBy
b2cpIGNvbnN0CisgICAgeworICAgICAgICAoZHN0LT4qbV9zZXR0ZXIpKGJsZW5kRnVuYygoYS0+
KlByb3BlcnR5V3JhcHBlckdldHRlcjxUPjo6bV9nZXR0ZXIpKCksIChiLT4qUHJvcGVydHlXcmFw
cGVyR2V0dGVyPFQ+OjptX2dldHRlcikoKSwgcHJvZykpOworICAgIH0KKyAgICAKK3Byb3RlY3Rl
ZDoKKyAgICB2b2lkIChSZW5kZXJTdHlsZTo6Km1fc2V0dGVyKShUKTsKK307CisKK2NsYXNzIFBy
b3BlcnR5V3JhcHBlclNoYWRvdyA6IHB1YmxpYyBQcm9wZXJ0eVdyYXBwZXJHZXR0ZXI8U2hhZG93
RGF0YSo+IHsKK3B1YmxpYzoKKyAgICBQcm9wZXJ0eVdyYXBwZXJTaGFkb3coaW50IHByb3AsIFNo
YWRvd0RhdGEqIChSZW5kZXJTdHlsZTo6KmdldHRlcikoKSBjb25zdCwgdm9pZCAoUmVuZGVyU3R5
bGU6OipzZXR0ZXIpKFNoYWRvd0RhdGEqLCBib29sKSkKKyAgICA6IFByb3BlcnR5V3JhcHBlckdl
dHRlcjxTaGFkb3dEYXRhKj4ocHJvcCwgZ2V0dGVyKQorICAgICwgbV9zZXR0ZXIoc2V0dGVyKQor
ICAgIHsgfQorICAgIAorICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3QgUmVuZGVyU3R5bGUq
IGEsIGNvbnN0IFJlbmRlclN0eWxlKiBiKSBjb25zdAorICAgIHsKKyAgICAgICAgU2hhZG93RGF0
YSogc2hhZG93YSA9IChhLT4qbV9nZXR0ZXIpKCk7CisgICAgICAgIFNoYWRvd0RhdGEqIHNoYWRv
d2IgPSAoYi0+Km1fZ2V0dGVyKSgpOworICAgICAgICAKKyAgICAgICAgaWYgKCFzaGFkb3dhICYm
IHNoYWRvd2IgfHwgc2hhZG93YSAmJiAhc2hhZG93YikKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgaWYgKHNoYWRvd2EgJiYgc2hhZG93YiAmJiAoKnNoYWRvd2EgIT0gKnNoYWRv
d2IpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9CisgICAgCisgICAgdmlydHVhbCB2b2lkIGJsZW5kKFJlbmRlclN0eWxlKiBkc3QsIGNvbnN0
IFJlbmRlclN0eWxlKiBhLCBjb25zdCBSZW5kZXJTdHlsZSogYiwgZG91YmxlIHByb2cpIGNvbnN0
CisgICAgeworICAgICAgICBTaGFkb3dEYXRhKiBzaGFkb3dhID0gKGEtPiptX2dldHRlcikoKTsK
KyAgICAgICAgU2hhZG93RGF0YSogc2hhZG93YiA9IChiLT4qbV9nZXR0ZXIpKCk7CisgICAgICAg
IFNoYWRvd0RhdGEgZGVmYXVsdFNoYWRvd0RhdGEoMCwgMCwgMCwgQ29sb3I6OnRyYW5zcGFyZW50
KTsKKyAgICAgICAgCisgICAgICAgIGlmICghc2hhZG93YSkKKyAgICAgICAgICAgIHNoYWRvd2Eg
PSAmZGVmYXVsdFNoYWRvd0RhdGE7CisgICAgICAgIGlmICghc2hhZG93YikKKyAgICAgICAgICAg
IHNoYWRvd2IgPSAmZGVmYXVsdFNoYWRvd0RhdGE7CisgICAgICAgIAorICAgICAgICAoZHN0LT4q
bV9zZXR0ZXIpKGJsZW5kRnVuYyhzaGFkb3dhLCBzaGFkb3diLCBwcm9nKSwgZmFsc2UpOworICAg
IH0KKyAgICAKK3ByaXZhdGU6CisgICAgdm9pZCAoUmVuZGVyU3R5bGU6OiptX3NldHRlcikoU2hh
ZG93RGF0YSosIGJvb2wpOworfTsKKworY2xhc3MgUHJvcGVydHlXcmFwcGVyTWF5YmVJbnZhbGlk
Q29sb3IgOiBwdWJsaWMgUHJvcGVydHlXcmFwcGVyQmFzZSB7CitwdWJsaWM6CisgICAgUHJvcGVy
dHlXcmFwcGVyTWF5YmVJbnZhbGlkQ29sb3IoaW50IHByb3AsIGNvbnN0IENvbG9yJiAoUmVuZGVy
U3R5bGU6OipnZXR0ZXIpKCkgY29uc3QsIHZvaWQgKFJlbmRlclN0eWxlOjoqc2V0dGVyKShjb25z
dCBDb2xvciYpKQorICAgIDogUHJvcGVydHlXcmFwcGVyQmFzZShwcm9wKQorICAgICwgbV9nZXR0
ZXIoZ2V0dGVyKQorICAgICwgbV9zZXR0ZXIoc2V0dGVyKQorICAgIHsgfQorICAgIAorICAgIHZp
cnR1YWwgYm9vbCBlcXVhbHMoY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJlbmRlclN0eWxl
KiBiKSBjb25zdAorICAgIHsKKyAgICAgICAgQ29sb3IgZnJvbUNvbG9yID0gKGEtPiptX2dldHRl
cikoKTsKKyAgICAgICAgQ29sb3IgdG9Db2xvciA9IChiLT4qbV9nZXR0ZXIpKCk7CisgICAgICAg
IGlmICghZnJvbUNvbG9yLmlzVmFsaWQoKSkKKyAgICAgICAgICAgIGZyb21Db2xvciA9IGEtPmNv
bG9yKCk7CisgICAgICAgIGlmICghdG9Db2xvci5pc1ZhbGlkKCkpCisgICAgICAgICAgICB0b0Nv
bG9yID0gYi0+Y29sb3IoKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBmcm9tQ29sb3IgPT0g
dG9Db2xvcjsKKyAgICB9CisgICAgCisgICAgdmlydHVhbCB2b2lkIGJsZW5kKFJlbmRlclN0eWxl
KiBkc3QsIGNvbnN0IFJlbmRlclN0eWxlKiBhLCBjb25zdCBSZW5kZXJTdHlsZSogYiwgZG91Ymxl
IHByb2cpIGNvbnN0CisgICAgeworICAgICAgICBDb2xvciBmcm9tQ29sb3IgPSAoYS0+Km1fZ2V0
dGVyKSgpOworICAgICAgICBDb2xvciB0b0NvbG9yID0gKGItPiptX2dldHRlcikoKTsKKyAgICAg
ICAgaWYgKCFmcm9tQ29sb3IuaXNWYWxpZCgpKQorICAgICAgICAgICAgZnJvbUNvbG9yID0gYS0+
Y29sb3IoKTsKKyAgICAgICAgaWYgKCF0b0NvbG9yLmlzVmFsaWQoKSkKKyAgICAgICAgICAgIHRv
Q29sb3IgPSBiLT5jb2xvcigpOworICAgICAgICAoZHN0LT4qbV9zZXR0ZXIpKGJsZW5kRnVuYyhm
cm9tQ29sb3IsIHRvQ29sb3IsIHByb2cpKTsKKyAgICB9CisgICAgCitwcml2YXRlOgorICAgIGNv
bnN0IENvbG9yJiAoUmVuZGVyU3R5bGU6OiptX2dldHRlcikoKSBjb25zdDsKKyAgICB2b2lkIChS
ZW5kZXJTdHlsZTo6Km1fc2V0dGVyKShjb25zdCBDb2xvciYpOworfTsKKworY2xhc3MgQW5pbWF0
aW9uQ29udHJvbGxlclByaXZhdGUgeworcHVibGljOgorICAgIEFuaW1hdGlvbkNvbnRyb2xsZXJQ
cml2YXRlKEZyYW1lKik7CisgICAgfkFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlKCk7CisgICAg
CisgICAgQ29tcG9zaXRlQW5pbWF0aW9uKiBhY2Nlc3NDb21wb3NpdGVBbmltYXRpb24oUmVuZGVy
T2JqZWN0Kik7CisgICAgYm9vbCBjbGVhcihSZW5kZXJPYmplY3QqKTsKKyAgICAKKyAgICB2b2lk
IGFuaW1hdGlvblRpbWVyRmlyZWQoVGltZXI8QW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU+Kik7
CisgICAgdm9pZCB1cGRhdGVBbmltYXRpb25UaW1lcigpOworICAgIAorICAgIHZvaWQgdXBkYXRl
UmVuZGVyaW5nRGlzcGF0Y2hlckZpcmVkKFRpbWVyPEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRl
PiopOworICAgIHZvaWQgc3RhcnRVcGRhdGVSZW5kZXJpbmdEaXNwYXRjaGVyKCk7CisgICAgCisg
ICAgYm9vbCBoYXNBbmltYXRpb25zKCkgY29uc3QgeyByZXR1cm4gIW1fY29tcG9zaXRlQW5pbWF0
aW9ucy5pc0VtcHR5KCk7IH0KKyAgICAKKyAgICB2b2lkIHN1c3BlbmRBbmltYXRpb25zKERvY3Vt
ZW50KiBkb2N1bWVudCk7CisgICAgdm9pZCByZXN1bWVBbmltYXRpb25zKERvY3VtZW50KiBkb2N1
bWVudCk7CisgICAgCisgICAgdm9pZCBzdHlsZUF2YWlsYWJsZSgpOworICAgIAorICAgIGJvb2wg
aXNBbmltYXRpbmdQcm9wZXJ0eU9uUmVuZGVyZXIoUmVuZGVyT2JqZWN0KiBvYmosIGludCBwcm9w
ZXJ0eSwgYm9vbCBpc1J1bm5pbmdOb3cpIGNvbnN0OworICAgIAorICAgIHN0YXRpYyBib29sIHBy
b3BlcnRpZXNFcXVhbChpbnQgcHJvcCwgY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJlbmRl
clN0eWxlKiBiKTsKKyAgICBzdGF0aWMgaW50IGdldFByb3BlcnR5QXRJbmRleChpbnQgaSk7Cisg
ICAgc3RhdGljIGludCBnZXROdW1Qcm9wZXJ0aWVzKCkgeyByZXR1cm4gZ1Byb3BlcnR5V3JhcHBl
cnMtPnNpemUoKTsgfQorICAgIAorICAgIC8vIFJldHVybiB0cnVlIGlmIHdlIG5lZWQgdG8gc3Rh
cnQgc29mdHdhcmUgYW5pbWF0aW9uIHRpbWVycworICAgIHN0YXRpYyBib29sIGJsZW5kUHJvcGVy
dGllcyhpbnQgcHJvcCwgUmVuZGVyU3R5bGUqIGRzdCwgY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNv
bnN0IFJlbmRlclN0eWxlKiBiLCBkb3VibGUgcHJvZyk7CisgICAgCisgICAgdm9pZCBzZXRXYWl0
aW5nRm9yU3R5bGVBdmFpbGFibGUoYm9vbCB3YWl0aW5nKSB7IGlmICh3YWl0aW5nKSBtX251bVN0
eWxlQXZhaWxhYmxlV2FpdGVycysrOyBlbHNlIG1fbnVtU3R5bGVBdmFpbGFibGVXYWl0ZXJzLS07
IH0KKyAgICAKK3ByaXZhdGU6CisgICAgc3RhdGljIHZvaWQgZW5zdXJlUHJvcGVydHlNYXAoKTsK
KyAgICAKKyAgICB0eXBlZGVmIEhhc2hNYXA8UmVuZGVyT2JqZWN0KiwgQ29tcG9zaXRlQW5pbWF0
aW9uKj4gUmVuZGVyT2JqZWN0QW5pbWF0aW9uTWFwOworICAgIAorICAgIFJlbmRlck9iamVjdEFu
aW1hdGlvbk1hcCBtX2NvbXBvc2l0ZUFuaW1hdGlvbnM7CisgICAgVGltZXI8QW5pbWF0aW9uQ29u
dHJvbGxlclByaXZhdGU+IG1fYW5pbWF0aW9uVGltZXI7CisgICAgVGltZXI8QW5pbWF0aW9uQ29u
dHJvbGxlclByaXZhdGU+IG1fdXBkYXRlUmVuZGVyaW5nRGlzcGF0Y2hlcjsKKyAgICBGcmFtZSog
bV9mcmFtZTsKKyAgICB1aW50MzJfdCBtX251bVN0eWxlQXZhaWxhYmxlV2FpdGVyczsKKyAgICAK
KyAgICBzdGF0aWMgVmVjdG9yPFByb3BlcnR5V3JhcHBlckJhc2UqPiogZ1Byb3BlcnR5V3JhcHBl
cnM7CisgICAgc3RhdGljIGludCBnUHJvcGVydHlXcmFwcGVyTWFwW251bUNTU1Byb3BlcnRpZXNd
OworfTsKKworVmVjdG9yPFByb3BlcnR5V3JhcHBlckJhc2UqPiogQW5pbWF0aW9uQ29udHJvbGxl
clByaXZhdGU6OmdQcm9wZXJ0eVdyYXBwZXJzID0gMDsKK2ludCBBbmltYXRpb25Db250cm9sbGVy
UHJpdmF0ZTo6Z1Byb3BlcnR5V3JhcHBlck1hcFtdOworCitBbmltYXRpb25Db250cm9sbGVyUHJp
dmF0ZTo6QW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGUoRnJhbWUqIGZyYW1lKQorOiBtX2FuaW1h
dGlvblRpbWVyKHRoaXMsICZBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6YW5pbWF0aW9uVGlt
ZXJGaXJlZCkKKywgbV91cGRhdGVSZW5kZXJpbmdEaXNwYXRjaGVyKHRoaXMsICZBbmltYXRpb25D
b250cm9sbGVyUHJpdmF0ZTo6dXBkYXRlUmVuZGVyaW5nRGlzcGF0Y2hlckZpcmVkKQorLCBtX2Zy
YW1lKGZyYW1lKQorLCBtX251bVN0eWxlQXZhaWxhYmxlV2FpdGVycygwKQoreworICAgIGVuc3Vy
ZVByb3BlcnR5TWFwKCk7Cit9CisKK0FuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjp+QW5pbWF0
aW9uQ29udHJvbGxlclByaXZhdGUoKQoreworICAgIGRlbGV0ZUFsbFZhbHVlcyhtX2NvbXBvc2l0
ZUFuaW1hdGlvbnMpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQW5pbWF0aW9uQ29udHJvbGxlclBy
aXZhdGU6OmVuc3VyZVByb3BlcnR5TWFwKCkKK3sKKyAgICAvLyBGSVhNRTogVGhpcyBkYXRhIGlz
IG5ldmVyIGRlc3Ryb3llZC4gTWF5YmUgd2Ugc2hvdWxkIHJlZiBjb3VudCBpdCBhbmQgdG9zcyBp
dCB3aGVuIHRoZSBsYXN0IEFuaW1hdGlvbkNvbnRyb2xsZXIgaXMgZGVzdHJveWVkPworICAgIGlm
IChnUHJvcGVydHlXcmFwcGVycyA9PSAwKSB7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzID0g
bmV3IFZlY3RvcjxQcm9wZXJ0eVdyYXBwZXJCYXNlKj4oKTsKKyAgICAgICAgCisgICAgICAgIC8v
IGJ1aWxkIHRoZSBsaXN0IG9mIHByb3BlcnR5IHdyYXBwZXJzIHRvIGRvIHRoZSBjb21wYXJpc29u
cyBhbmQgYmxlbmRzCisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3Bl
cnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5TGVmdCwgJlJlbmRlclN0eWxlOjpsZWZ0LCAm
UmVuZGVyU3R5bGU6OnNldExlZnQpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVu
ZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlSaWdodCwgJlJlbmRlclN0
eWxlOjpyaWdodCwgJlJlbmRlclN0eWxlOjpzZXRSaWdodCkpOworICAgICAgICBnUHJvcGVydHlX
cmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eVRv
cCwgJlJlbmRlclN0eWxlOjp0b3AsICZSZW5kZXJTdHlsZTo6c2V0VG9wKSk7CisgICAgICAgIGdQ
cm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1By
b3BlcnR5Qm90dG9tLCAmUmVuZGVyU3R5bGU6OmJvdHRvbSwgJlJlbmRlclN0eWxlOjpzZXRCb3R0
b20pKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFw
cGVyPExlbmd0aD4oQ1NTUHJvcGVydHlXaWR0aCwgJlJlbmRlclN0eWxlOjp3aWR0aCwgJlJlbmRl
clN0eWxlOjpzZXRXaWR0aCkpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5l
dyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eUhlaWdodCwgJlJlbmRlclN0eWxl
OjpoZWlnaHQsICZSZW5kZXJTdHlsZTo6c2V0SGVpZ2h0KSk7CisgICAgICAgIGdQcm9wZXJ0eVdy
YXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjx1bnNpZ25lZCBzaG9ydD4oQ1NTUHJv
cGVydHlCb3JkZXJMZWZ0V2lkdGgsICZSZW5kZXJTdHlsZTo6Ym9yZGVyTGVmdFdpZHRoLCAmUmVu
ZGVyU3R5bGU6OnNldEJvcmRlckxlZnRXaWR0aCkpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVy
cy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8dW5zaWduZWQgc2hvcnQ+KENTU1Byb3BlcnR5
Qm9yZGVyUmlnaHRXaWR0aCwgJlJlbmRlclN0eWxlOjpib3JkZXJSaWdodFdpZHRoLCAmUmVuZGVy
U3R5bGU6OnNldEJvcmRlclJpZ2h0V2lkdGgpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMt
PmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPHVuc2lnbmVkIHNob3J0PihDU1NQcm9wZXJ0eUJv
cmRlclRvcFdpZHRoLCAmUmVuZGVyU3R5bGU6OmJvcmRlclRvcFdpZHRoLCAmUmVuZGVyU3R5bGU6
OnNldEJvcmRlclRvcFdpZHRoKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQo
bmV3IFByb3BlcnR5V3JhcHBlcjx1bnNpZ25lZCBzaG9ydD4oQ1NTUHJvcGVydHlCb3JkZXJCb3R0
b21XaWR0aCwgJlJlbmRlclN0eWxlOjpib3JkZXJCb3R0b21XaWR0aCwgJlJlbmRlclN0eWxlOjpz
ZXRCb3JkZXJCb3R0b21XaWR0aCkpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5k
KG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eU1hcmdpbkxlZnQsICZSZW5k
ZXJTdHlsZTo6bWFyZ2luTGVmdCwgJlJlbmRlclN0eWxlOjpzZXRNYXJnaW5MZWZ0KSk7CisgICAg
ICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+
KENTU1Byb3BlcnR5TWFyZ2luUmlnaHQsICZSZW5kZXJTdHlsZTo6bWFyZ2luUmlnaHQsICZSZW5k
ZXJTdHlsZTo6c2V0TWFyZ2luUmlnaHQpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFw
cGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlNYXJnaW5Ub3AsICZS
ZW5kZXJTdHlsZTo6bWFyZ2luVG9wLCAmUmVuZGVyU3R5bGU6OnNldE1hcmdpblRvcCkpOworICAg
ICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3Ro
PihDU1NQcm9wZXJ0eU1hcmdpbkJvdHRvbSwgJlJlbmRlclN0eWxlOjptYXJnaW5Cb3R0b20sICZS
ZW5kZXJTdHlsZTo6c2V0TWFyZ2luQm90dG9tKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJz
LT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5UGFkZGluZ0xl
ZnQsICZSZW5kZXJTdHlsZTo6cGFkZGluZ0xlZnQsICZSZW5kZXJTdHlsZTo6c2V0UGFkZGluZ0xl
ZnQpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFw
cGVyPExlbmd0aD4oQ1NTUHJvcGVydHlQYWRkaW5nUmlnaHQsICZSZW5kZXJTdHlsZTo6cGFkZGlu
Z1JpZ2h0LCAmUmVuZGVyU3R5bGU6OnNldFBhZGRpbmdSaWdodCkpOworICAgICAgICBnUHJvcGVy
dHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0
eVBhZGRpbmdUb3AsICZSZW5kZXJTdHlsZTo6cGFkZGluZ1RvcCwgJlJlbmRlclN0eWxlOjpzZXRQ
YWRkaW5nVG9wKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3Bl
cnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5UGFkZGluZ0JvdHRvbSwgJlJlbmRlclN0eWxl
OjpwYWRkaW5nQm90dG9tLCAmUmVuZGVyU3R5bGU6OnNldFBhZGRpbmdCb3R0b20pKTsKKyAgICAg
ICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPGZsb2F0PihD
U1NQcm9wZXJ0eU9wYWNpdHksICZSZW5kZXJTdHlsZTo6b3BhY2l0eSwgJlJlbmRlclN0eWxlOjpz
ZXRPcGFjaXR5KSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3Bl
cnR5V3JhcHBlcjxjb25zdCBDb2xvciY+KENTU1Byb3BlcnR5Q29sb3IsICZSZW5kZXJTdHlsZTo6
Y29sb3IsICZSZW5kZXJTdHlsZTo6c2V0Q29sb3IpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBl
cnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPGNvbnN0IENvbG9yJj4oQ1NTUHJvcGVydHlC
YWNrZ3JvdW5kQ29sb3IsICZSZW5kZXJTdHlsZTo6YmFja2dyb3VuZENvbG9yLCAmUmVuZGVyU3R5
bGU6OnNldEJhY2tncm91bmRDb2xvcikpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBw
ZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8aW50PihDU1NQcm9wZXJ0eUZvbnRTaXplLCAmUmVuZGVy
U3R5bGU6OmZvbnRTaXplLCAmUmVuZGVyU3R5bGU6OnNldEJsZW5kZWRGb250U2l6ZSkpOworICAg
ICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8dW5zaWdu
ZWQgc2hvcnQ+KENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZVdpZHRoLCAmUmVuZGVyU3R5bGU6
OmNvbHVtblJ1bGVXaWR0aCwgJlJlbmRlclN0eWxlOjpzZXRDb2x1bW5SdWxlV2lkdGgpKTsKKyAg
ICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPGZsb2F0
PihDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbkdhcCwgJlJlbmRlclN0eWxlOjpjb2x1bW5HYXAsICZS
ZW5kZXJTdHlsZTo6c2V0Q29sdW1uR2FwKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5h
cHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjx1bnNpZ25lZCBzaG9ydD4oQ1NTUHJvcGVydHlXZWJr
aXRDb2x1bW5Db3VudCwgJlJlbmRlclN0eWxlOjpjb2x1bW5Db3VudCwgJlJlbmRlclN0eWxlOjpz
ZXRDb2x1bW5Db3VudCkpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQ
cm9wZXJ0eVdyYXBwZXI8ZmxvYXQ+KENTU1Byb3BlcnR5V2Via2l0Q29sdW1uV2lkdGgsICZSZW5k
ZXJTdHlsZTo6Y29sdW1uV2lkdGgsICZSZW5kZXJTdHlsZTo6c2V0Q29sdW1uV2lkdGgpKTsKKyAg
ICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPHNob3J0
PihDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckhvcml6b250YWxTcGFjaW5nLCAmUmVuZGVyU3R5bGU6
Omhvcml6b250YWxCb3JkZXJTcGFjaW5nLCAmUmVuZGVyU3R5bGU6OnNldEhvcml6b250YWxCb3Jk
ZXJTcGFjaW5nKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3Bl
cnR5V3JhcHBlcjxzaG9ydD4oQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJWZXJ0aWNhbFNwYWNpbmcs
ICZSZW5kZXJTdHlsZTo6dmVydGljYWxCb3JkZXJTcGFjaW5nLCAmUmVuZGVyU3R5bGU6OnNldFZl
cnRpY2FsQm9yZGVyU3BhY2luZykpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5k
KG5ldyBQcm9wZXJ0eVdyYXBwZXI8aW50PihDU1NQcm9wZXJ0eVpJbmRleCwgJlJlbmRlclN0eWxl
Ojp6SW5kZXgsICZSZW5kZXJTdHlsZTo6c2V0WkluZGV4KSk7CisgICAgICAgIGdQcm9wZXJ0eVdy
YXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5TGlu
ZUhlaWdodCwgJlJlbmRlclN0eWxlOjpsaW5lSGVpZ2h0LCAmUmVuZGVyU3R5bGU6OnNldExpbmVI
ZWlnaHQpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlX
cmFwcGVyPGludD4oQ1NTUHJvcGVydHlPdXRsaW5lT2Zmc2V0LCAmUmVuZGVyU3R5bGU6Om91dGxp
bmVPZmZzZXQsICZSZW5kZXJTdHlsZTo6c2V0T3V0bGluZU9mZnNldCkpOworICAgICAgICBnUHJv
cGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8dW5zaWduZWQgc2hvcnQ+
KENTU1Byb3BlcnR5T3V0bGluZVdpZHRoLCAmUmVuZGVyU3R5bGU6Om91dGxpbmVXaWR0aCwgJlJl
bmRlclN0eWxlOjpzZXRPdXRsaW5lV2lkdGgpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMt
PmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPGludD4oQ1NTUHJvcGVydHlMZXR0ZXJTcGFjaW5n
LCAmUmVuZGVyU3R5bGU6OmxldHRlclNwYWNpbmcsICZSZW5kZXJTdHlsZTo6c2V0TGV0dGVyU3Bh
Y2luZykpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdy
YXBwZXI8aW50PihDU1NQcm9wZXJ0eVdvcmRTcGFjaW5nLCAmUmVuZGVyU3R5bGU6OndvcmRTcGFj
aW5nLCAmUmVuZGVyU3R5bGU6OnNldFdvcmRTcGFjaW5nKSk7CisgICAgICAgIGdQcm9wZXJ0eVdy
YXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxjb25zdCBUcmFuc2Zvcm1PcGVyYXRp
b25zJj4oQ1NTUHJvcGVydHlXZWJraXRUcmFuc2Zvcm0sICZSZW5kZXJTdHlsZTo6dHJhbnNmb3Jt
LCAmUmVuZGVyU3R5bGU6OnNldFRyYW5zZm9ybSkpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVy
cy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eVdlYmtpdFRy
YW5zZm9ybU9yaWdpblgsICZSZW5kZXJTdHlsZTo6dHJhbnNmb3JtT3JpZ2luWCwgJlJlbmRlclN0
eWxlOjpzZXRUcmFuc2Zvcm1PcmlnaW5YKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5h
cHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5V2Via2l0VHJhbnNm
b3JtT3JpZ2luWSwgJlJlbmRlclN0eWxlOjp0cmFuc2Zvcm1PcmlnaW5ZLCAmUmVuZGVyU3R5bGU6
OnNldFRyYW5zZm9ybU9yaWdpblkpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVu
ZChuZXcgUHJvcGVydHlXcmFwcGVyPGNvbnN0IEludFNpemUmPihDU1NQcm9wZXJ0eVdlYmtpdEJv
cmRlclRvcExlZnRSYWRpdXMsICZSZW5kZXJTdHlsZTo6Ym9yZGVyVG9wTGVmdFJhZGl1cywgJlJl
bmRlclN0eWxlOjpzZXRCb3JkZXJUb3BMZWZ0UmFkaXVzKSk7CisgICAgICAgIGdQcm9wZXJ0eVdy
YXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxjb25zdCBJbnRTaXplJj4oQ1NTUHJv
cGVydHlXZWJraXRCb3JkZXJUb3BSaWdodFJhZGl1cywgJlJlbmRlclN0eWxlOjpib3JkZXJUb3BS
aWdodFJhZGl1cywgJlJlbmRlclN0eWxlOjpzZXRCb3JkZXJUb3BSaWdodFJhZGl1cykpOworICAg
ICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8Y29uc3Qg
SW50U2l6ZSY+KENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQm90dG9tTGVmdFJhZGl1cywgJlJlbmRl
clN0eWxlOjpib3JkZXJCb3R0b21MZWZ0UmFkaXVzLCAmUmVuZGVyU3R5bGU6OnNldEJvcmRlckJv
dHRvbUxlZnRSYWRpdXMpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcg
UHJvcGVydHlXcmFwcGVyPGNvbnN0IEludFNpemUmPihDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckJv
dHRvbVJpZ2h0UmFkaXVzLCAmUmVuZGVyU3R5bGU6OmJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzLCAm
UmVuZGVyU3R5bGU6OnNldEJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzKSk7CisgICAgICAgIGdQcm9w
ZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxFVmlzaWJpbGl0eT4oQ1NT
UHJvcGVydHlWaXNpYmlsaXR5LCAmUmVuZGVyU3R5bGU6OnZpc2liaWxpdHksICZSZW5kZXJTdHls
ZTo6c2V0VmlzaWJpbGl0eSkpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5l
dyBQcm9wZXJ0eVdyYXBwZXI8ZmxvYXQ+KENTU1Byb3BlcnR5Wm9vbSwgJlJlbmRlclN0eWxlOjp6
b29tLCAmUmVuZGVyU3R5bGU6OnNldFpvb20pKTsKKyAgICAgICAgCisgICAgICAgIC8vIEZJWE1F
OiB0aGVzZSBtaWdodCBiZSBpbnZhbGlkIGNvbG9ycywgbmVlZCB0byBjaGVjayBmb3IgdGhhdAor
ICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXJNYXli
ZUludmFsaWRDb2xvcihDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGVDb2xvciwgJlJlbmRlclN0
eWxlOjpjb2x1bW5SdWxlQ29sb3IsICZSZW5kZXJTdHlsZTo6c2V0Q29sdW1uUnVsZUNvbG9yKSk7
CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlck1h
eWJlSW52YWxpZENvbG9yKENTU1Byb3BlcnR5V2Via2l0VGV4dFN0cm9rZUNvbG9yLCAmUmVuZGVy
U3R5bGU6OnRleHRTdHJva2VDb2xvciwgJlJlbmRlclN0eWxlOjpzZXRUZXh0U3Ryb2tlQ29sb3Ip
KTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVy
TWF5YmVJbnZhbGlkQ29sb3IoQ1NTUHJvcGVydHlXZWJraXRUZXh0RmlsbENvbG9yLCAmUmVuZGVy
U3R5bGU6OnRleHRGaWxsQ29sb3IsICZSZW5kZXJTdHlsZTo6c2V0VGV4dEZpbGxDb2xvcikpOwor
ICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXJNYXli
ZUludmFsaWRDb2xvcihDU1NQcm9wZXJ0eUJvcmRlckxlZnRDb2xvciwgJlJlbmRlclN0eWxlOjpi
b3JkZXJMZWZ0Q29sb3IsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyTGVmdENvbG9yKSk7CisgICAg
ICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlck1heWJlSW52
YWxpZENvbG9yKENTU1Byb3BlcnR5Qm9yZGVyUmlnaHRDb2xvciwgJlJlbmRlclN0eWxlOjpib3Jk
ZXJSaWdodENvbG9yLCAmUmVuZGVyU3R5bGU6OnNldEJvcmRlclJpZ2h0Q29sb3IpKTsKKyAgICAg
ICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyTWF5YmVJbnZh
bGlkQ29sb3IoQ1NTUHJvcGVydHlCb3JkZXJUb3BDb2xvciwgJlJlbmRlclN0eWxlOjpib3JkZXJU
b3BDb2xvciwgJlJlbmRlclN0eWxlOjpzZXRCb3JkZXJUb3BDb2xvcikpOworICAgICAgICBnUHJv
cGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXJNYXliZUludmFsaWRDb2xv
cihDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbUNvbG9yLCAmUmVuZGVyU3R5bGU6OmJvcmRlckJvdHRv
bUNvbG9yLCAmUmVuZGVyU3R5bGU6OnNldEJvcmRlckJvdHRvbUNvbG9yKSk7CisgICAgICAgIGdQ
cm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENv
bG9yKENTU1Byb3BlcnR5T3V0bGluZUNvbG9yLCAmUmVuZGVyU3R5bGU6Om91dGxpbmVDb2xvciwg
JlJlbmRlclN0eWxlOjpzZXRPdXRsaW5lQ29sb3IpKTsKKyAgICAgICAgCisgICAgICAgIC8vIFRo
ZXNlIGFyZSBmb3Igc2hhZG93cworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5l
dyBQcm9wZXJ0eVdyYXBwZXJTaGFkb3coQ1NTUHJvcGVydHlXZWJraXRCb3hTaGFkb3csICZSZW5k
ZXJTdHlsZTo6Ym94U2hhZG93LCAmUmVuZGVyU3R5bGU6OnNldEJveFNoYWRvdykpOworICAgICAg
ICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXJTaGFkb3coQ1NT
UHJvcGVydHlUZXh0U2hhZG93LCAmUmVuZGVyU3R5bGU6OnRleHRTaGFkb3csICZSZW5kZXJTdHls
ZTo6c2V0VGV4dFNoYWRvdykpOworICAgICAgICAKKyAgICAgICAgLy8gTWFrZSBzdXJlIHVudXNl
ZCBzbG90cyBoYXZlIGEgdmFsdWUKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkg
PCAodW5zaWduZWQgaW50KSBudW1DU1NQcm9wZXJ0aWVzOyArK2kpCisgICAgICAgICAgICBnUHJv
cGVydHlXcmFwcGVyTWFwW2ldID0gQ1NTUHJvcGVydHlJbnZhbGlkOworICAgICAgICAKKyAgICAg
ICAgc2l6ZV90IG4gPSBnUHJvcGVydHlXcmFwcGVycy0+c2l6ZSgpOworICAgICAgICBmb3IgKHVu
c2lnbmVkIGludCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICAgICAgQVNTRVJUKCgqZ1By
b3BlcnR5V3JhcHBlcnMpW2ldLT5wcm9wZXJ0eSgpIC0gZmlyc3RDU1NQcm9wZXJ0eSA8IG51bUNT
U1Byb3BlcnRpZXMpOworICAgICAgICAgICAgZ1Byb3BlcnR5V3JhcHBlck1hcFsoKmdQcm9wZXJ0
eVdyYXBwZXJzKVtpXS0+cHJvcGVydHkoKSAtIGZpcnN0Q1NTUHJvcGVydHldID0gaTsKKyAgICAg
ICAgfQorICAgIH0KK30KKworLy8gc3RhdGljCitib29sIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2
YXRlOjpwcm9wZXJ0aWVzRXF1YWwoaW50IHByb3AsIGNvbnN0IFJlbmRlclN0eWxlKiBhLCBjb25z
dCBSZW5kZXJTdHlsZSogYikKK3sKKyAgICBpZiAocHJvcCA9PSBjQW5pbWF0ZUFsbCkgeworICAg
ICAgICBzaXplX3QgbiA9IGdQcm9wZXJ0eVdyYXBwZXJzLT5zaXplKCk7CisgICAgICAgIGZvciAo
dW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgICBpZiAoISgqZ1By
b3BlcnR5V3JhcHBlcnMpW2ldLT5lcXVhbHMoYSwgYikpCisgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpbnQgcHJvcElu
ZGV4ID0gcHJvcCAtIGZpcnN0Q1NTUHJvcGVydHk7CisgICAgICAgIAorICAgICAgICBpZiAocHJv
cEluZGV4ID49IDAgJiYgcHJvcEluZGV4IDwgbnVtQ1NTUHJvcGVydGllcykgeworICAgICAgICAg
ICAgaW50IGkgPSBnUHJvcGVydHlXcmFwcGVyTWFwW3Byb3BJbmRleF07CisgICAgICAgICAgICBy
ZXR1cm4gKGkgPj0gMCkgPyAoKmdQcm9wZXJ0eVdyYXBwZXJzKVtpXS0+ZXF1YWxzKGEsIGIpIDog
dHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gc3RhdGlj
CitpbnQgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OmdldFByb3BlcnR5QXRJbmRleChpbnQg
aSkKK3sKKyAgICBpZiAoaSA8IDAgfHwgaSA+PSAoaW50KSBnUHJvcGVydHlXcmFwcGVycy0+c2l6
ZSgpKQorICAgICAgICByZXR1cm4gQ1NTUHJvcGVydHlJbnZhbGlkOworICAgICAgICAKKyAgICBy
ZXR1cm4gKCpnUHJvcGVydHlXcmFwcGVycylbaV0tPnByb3BlcnR5KCk7Cit9CisgICAgCisvLyBz
dGF0aWMgLSByZXR1cm4gdHJ1ZSBpZiB3ZSBuZWVkIHRvIHN0YXJ0IHNvZnR3YXJlIGFuaW1hdGlv
biB0aW1lcnMKK2Jvb2wgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OmJsZW5kUHJvcGVydGll
cyhpbnQgcHJvcCwgUmVuZGVyU3R5bGUqIGRzdCwgY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0
IFJlbmRlclN0eWxlKiBiLCBkb3VibGUgcHJvZykKK3sKKyAgICBpZiAocHJvcCA9PSBjQW5pbWF0
ZUFsbCkgeworICAgICAgICBBU1NFUlQoMCk7CisgICAgICAgIGJvb2wgbmVlZHNUaW1lciA9IGZh
bHNlOworICAgIAorICAgICAgICBzaXplX3QgbiA9IGdQcm9wZXJ0eVdyYXBwZXJzLT5zaXplKCk7
CisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAg
ICAgICBQcm9wZXJ0eVdyYXBwZXJCYXNlKiB3cmFwcGVyID0gKCpnUHJvcGVydHlXcmFwcGVycylb
aV07CisgICAgICAgICAgICBpZiAoIXdyYXBwZXItPmVxdWFscyhhLCBiKSkgeworICAgICAgICAg
ICAgICAgIHdyYXBwZXItPmJsZW5kKGRzdCwgYSwgYiwgcHJvZyk7CisgICAgICAgICAgICAgICAg
bmVlZHNUaW1lciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0
dXJuIG5lZWRzVGltZXI7CisgICAgfQorICAgIAorICAgIGludCBwcm9wSW5kZXggPSBwcm9wIC0g
Zmlyc3RDU1NQcm9wZXJ0eTsKKyAgICBpZiAocHJvcEluZGV4ID49IDAgJiYgcHJvcEluZGV4IDwg
bnVtQ1NTUHJvcGVydGllcykgeworICAgICAgICBpbnQgaSA9IGdQcm9wZXJ0eVdyYXBwZXJNYXBb
cHJvcEluZGV4XTsKKyAgICAgICAgaWYgKGkgPj0gMCkgeworICAgICAgICAgICAgUHJvcGVydHlX
cmFwcGVyQmFzZSogd3JhcHBlciA9ICgqZ1Byb3BlcnR5V3JhcHBlcnMpW2ldOworICAgICAgICAg
ICAgd3JhcHBlci0+YmxlbmQoZHN0LCBhLCBiLCBwcm9nKTsKKyAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHJldHVybiBmYWxzZTsKK30KKworQ29t
cG9zaXRlQW5pbWF0aW9uKiBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6YWNjZXNzQ29tcG9z
aXRlQW5pbWF0aW9uKFJlbmRlck9iamVjdCogcmVuZGVyZXIpCit7CisgICAgQ29tcG9zaXRlQW5p
bWF0aW9uKiBhbmltYXRpb24gPSBtX2NvbXBvc2l0ZUFuaW1hdGlvbnMuZ2V0KHJlbmRlcmVyKTsK
KyAgICBpZiAoIWFuaW1hdGlvbikgeworICAgICAgICBhbmltYXRpb24gPSBuZXcgQ29tcG9zaXRl
QW5pbWF0aW9uKHRoaXMpOworICAgICAgICBtX2NvbXBvc2l0ZUFuaW1hdGlvbnMuc2V0KHJlbmRl
cmVyLCBhbmltYXRpb24pOworICAgIH0KKyAgICByZXR1cm4gYW5pbWF0aW9uOworfQorCitib29s
IEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpjbGVhcihSZW5kZXJPYmplY3QqIHJlbmRlcmVy
KQoreworICAgIC8vIFJldHVybiBmYWxzZSBpZiB3ZSBkaWRuJ3QgZG8gYW55dGhpbmcgT1Igd2Ug
YXJlIHN1c3BlbmRlZCAoc28gd2UgZG9uJ3QgdHJ5IHRvCisgICAgLy8gZG8gYSBzZXRDaGFuZ2Vk
KCkgd2hlbiBzdXNwZW5kZWQKKyAgICBDb21wb3NpdGVBbmltYXRpb24qIGFuaW1hdGlvbiA9IG1f
Y29tcG9zaXRlQW5pbWF0aW9ucy50YWtlKHJlbmRlcmVyKTsKKyAgICBpZiAoIWFuaW1hdGlvbikK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGFuaW1hdGlvbi0+cmVzZXRUcmFuc2l0aW9ucyhy
ZW5kZXJlcik7CisgICAgYm9vbCB3YXNTdXNwZW5kZWQgPSBhbmltYXRpb24tPnN1c3BlbmRlZCgp
OworICAgIGRlbGV0ZSBhbmltYXRpb247CisgICAgcmV0dXJuICF3YXNTdXNwZW5kZWQ7Cit9CisK
K3ZvaWQgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OnN0eWxlQXZhaWxhYmxlKCkKK3sKKyAg
ICBpZiAobV9udW1TdHlsZUF2YWlsYWJsZVdhaXRlcnMgPT0gMCkKKyAgICAgICAgcmV0dXJuOwor
ICAgIAorICAgIFJlbmRlck9iamVjdEFuaW1hdGlvbk1hcDo6Y29uc3RfaXRlcmF0b3IgYW5pbWF0
aW9uc0VuZCA9IG1fY29tcG9zaXRlQW5pbWF0aW9ucy5lbmQoKTsKKyAgICBmb3IgKFJlbmRlck9i
amVjdEFuaW1hdGlvbk1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2NvbXBvc2l0ZUFuaW1hdGlv
bnMuYmVnaW4oKTsgCisgICAgICAgICBpdCAhPSBhbmltYXRpb25zRW5kOyArK2l0KSB7CisgICAg
ICAgIGl0LT5zZWNvbmQtPnN0eWxlQXZhaWxhYmxlKCk7CisgICAgfQorfQorCit2b2lkIEFuaW1h
dGlvbkNvbnRyb2xsZXJQcml2YXRlOjp1cGRhdGVBbmltYXRpb25UaW1lcigpCit7CisgICAgYm9v
bCBhbmltYXRpbmcgPSBmYWxzZTsKKyAgICAKKyAgICBSZW5kZXJPYmplY3RBbmltYXRpb25NYXA6
OmNvbnN0X2l0ZXJhdG9yIGFuaW1hdGlvbnNFbmQgPSBtX2NvbXBvc2l0ZUFuaW1hdGlvbnMuZW5k
KCk7CisgICAgZm9yIChSZW5kZXJPYmplY3RBbmltYXRpb25NYXA6OmNvbnN0X2l0ZXJhdG9yIGl0
ID0gbV9jb21wb3NpdGVBbmltYXRpb25zLmJlZ2luKCk7IAorICAgICAgICAgaXQgIT0gYW5pbWF0
aW9uc0VuZDsgKytpdCkgeworICAgICAgICBDb21wb3NpdGVBbmltYXRpb24qIGNvbXBBbmltID0g
aXQtPnNlY29uZDsKKyAgICAgICAgaWYgKCFjb21wQW5pbS0+c3VzcGVuZGVkKCkgJiYgY29tcEFu
aW0tPmFuaW1hdGluZygpKSB7CisgICAgICAgICAgICBhbmltYXRpbmcgPSB0cnVlOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKGFuaW1hdGluZykg
eworICAgICAgICBpZiAoIW1fYW5pbWF0aW9uVGltZXIuaXNBY3RpdmUoKSkKKyAgICAgICAgICAg
IG1fYW5pbWF0aW9uVGltZXIuc3RhcnRSZXBlYXRpbmcoY0FuaW1hdGlvblRpbWVyRGVsYXkpOwor
ICAgIH0gZWxzZSBpZiAobV9hbmltYXRpb25UaW1lci5pc0FjdGl2ZSgpKQorICAgICAgICBtX2Fu
aW1hdGlvblRpbWVyLnN0b3AoKTsKK30KKwordm9pZCBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0
ZTo6dXBkYXRlUmVuZGVyaW5nRGlzcGF0Y2hlckZpcmVkKFRpbWVyPEFuaW1hdGlvbkNvbnRyb2xs
ZXJQcml2YXRlPiopCit7CisgICAgaWYgKG1fZnJhbWUgJiYgbV9mcmFtZS0+ZG9jdW1lbnQoKSkg
eworICAgICAgICBtX2ZyYW1lLT5kb2N1bWVudCgpLT51cGRhdGVSZW5kZXJpbmcoKTsKKyAgICB9
Cit9CisKK3ZvaWQgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OnN0YXJ0VXBkYXRlUmVuZGVy
aW5nRGlzcGF0Y2hlcigpCit7CisgICAgaWYgKCFtX3VwZGF0ZVJlbmRlcmluZ0Rpc3BhdGNoZXIu
aXNBY3RpdmUoKSkgeworICAgICAgICBtX3VwZGF0ZVJlbmRlcmluZ0Rpc3BhdGNoZXIuc3RhcnRP
bmVTaG90KDApOworICAgIH0KK30KKwordm9pZCBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6
YW5pbWF0aW9uVGltZXJGaXJlZChUaW1lcjxBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZT4qIHRp
bWVyKQoreworICAgIC8vIFdoZW4gdGhlIHRpbWVyIGZpcmVzLCBhbGwgd2UgZG8gaXMgY2FsbCBz
ZXRDaGFuZ2VkIG9uIGFsbCBET00gbm9kZXMgd2l0aCBydW5uaW5nIGFuaW1hdGlvbnMgYW5kIHRo
ZW4gZG8gYW4gaW1tZWRpYXRlCisgICAgLy8gdXBkYXRlUmVuZGVyaW5nLiAgSXQgd2lsbCB0aGVu
IGNhbGwgYmFjayB0byB1cyB3aXRoIG5ldyBpbmZvcm1hdGlvbi4KKyAgICBib29sIGFuaW1hdGlu
ZyA9IGZhbHNlOworICAgIFJlbmRlck9iamVjdEFuaW1hdGlvbk1hcDo6Y29uc3RfaXRlcmF0b3Ig
YW5pbWF0aW9uc0VuZCA9IG1fY29tcG9zaXRlQW5pbWF0aW9ucy5lbmQoKTsKKyAgICBmb3IgKFJl
bmRlck9iamVjdEFuaW1hdGlvbk1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2NvbXBvc2l0ZUFu
aW1hdGlvbnMuYmVnaW4oKTsgCisgICAgICAgICBpdCAhPSBhbmltYXRpb25zRW5kOyArK2l0KSB7
CisgICAgICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBpdC0+Zmlyc3Q7CisgICAgICAgIENv
bXBvc2l0ZUFuaW1hdGlvbiogY29tcEFuaW0gPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoIWNv
bXBBbmltLT5zdXNwZW5kZWQoKSAmJiBjb21wQW5pbS0+YW5pbWF0aW5nKCkpIHsKKyAgICAgICAg
ICAgIGFuaW1hdGluZyA9IHRydWU7CisgICAgICAgICAgICBjb21wQW5pbS0+c2V0QW5pbWF0aW5n
KGZhbHNlKTsKKyAgICAgICAgICAgIHNldENoYW5nZWQocmVuZGVyZXItPmVsZW1lbnQoKSk7Cisg
ICAgICAgIH0KKyAgICB9CisgICAgCisgICAgbV9mcmFtZS0+ZG9jdW1lbnQoKS0+dXBkYXRlUmVu
ZGVyaW5nKCk7CisgICAgCisgICAgdXBkYXRlQW5pbWF0aW9uVGltZXIoKTsKK30KKworYm9vbCBB
bmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6aXNBbmltYXRpbmdQcm9wZXJ0eU9uUmVuZGVyZXIo
UmVuZGVyT2JqZWN0KiBvYmosIGludCBwcm9wZXJ0eSwgYm9vbCBpc1J1bm5pbmdOb3cpIGNvbnN0
Cit7CisgICAgQ29tcG9zaXRlQW5pbWF0aW9uKiBhbmltYXRpb24gPSBtX2NvbXBvc2l0ZUFuaW1h
dGlvbnMuZ2V0KG9iaik7CisgICAgaWYgKCFhbmltYXRpb24pIHJldHVybiBmYWxzZTsKKworICAg
IHJldHVybiBhbmltYXRpb24tPmlzQW5pbWF0aW5nUHJvcGVydHkocHJvcGVydHksIGlzUnVubmlu
Z05vdyk7Cit9CisKK3ZvaWQgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OnN1c3BlbmRBbmlt
YXRpb25zKERvY3VtZW50KiBkb2N1bWVudCkKK3sKKyAgICBSZW5kZXJPYmplY3RBbmltYXRpb25N
YXA6OmNvbnN0X2l0ZXJhdG9yIGFuaW1hdGlvbnNFbmQgPSBtX2NvbXBvc2l0ZUFuaW1hdGlvbnMu
ZW5kKCk7CisgICAgZm9yIChSZW5kZXJPYmplY3RBbmltYXRpb25NYXA6OmNvbnN0X2l0ZXJhdG9y
IGl0ID0gbV9jb21wb3NpdGVBbmltYXRpb25zLmJlZ2luKCk7IAorICAgICAgICAgaXQgIT0gYW5p
bWF0aW9uc0VuZDsgKytpdCkgeworICAgICAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gaXQt
PmZpcnN0OworICAgICAgICBDb21wb3NpdGVBbmltYXRpb24qIGNvbXBBbmltID0gaXQtPnNlY29u
ZDsKKyAgICAgICAgaWYgKHJlbmRlcmVyLT5kb2N1bWVudCgpID09IGRvY3VtZW50KQorICAgICAg
ICAgICAgY29tcEFuaW0tPnN1c3BlbmRBbmltYXRpb25zKCk7CisgICAgfQorICAgIAorICAgIHVw
ZGF0ZUFuaW1hdGlvblRpbWVyKCk7Cit9CisKK3ZvaWQgQW5pbWF0aW9uQ29udHJvbGxlclByaXZh
dGU6OnJlc3VtZUFuaW1hdGlvbnMoRG9jdW1lbnQqIGRvY3VtZW50KQoreworICAgIFJlbmRlck9i
amVjdEFuaW1hdGlvbk1hcDo6Y29uc3RfaXRlcmF0b3IgYW5pbWF0aW9uc0VuZCA9IG1fY29tcG9z
aXRlQW5pbWF0aW9ucy5lbmQoKTsKKyAgICBmb3IgKFJlbmRlck9iamVjdEFuaW1hdGlvbk1hcDo6
Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2NvbXBvc2l0ZUFuaW1hdGlvbnMuYmVnaW4oKTsgCisgICAg
ICAgICBpdCAhPSBhbmltYXRpb25zRW5kOyArK2l0KSB7CisgICAgICAgIFJlbmRlck9iamVjdCog
cmVuZGVyZXIgPSBpdC0+Zmlyc3Q7CisgICAgICAgIENvbXBvc2l0ZUFuaW1hdGlvbiogY29tcEFu
aW0gPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAocmVuZGVyZXItPmRvY3VtZW50KCkgPT0gZG9j
dW1lbnQpCisgICAgICAgICAgICBjb21wQW5pbS0+cmVzdW1lQW5pbWF0aW9ucygpOworICAgIH0K
KyAgICAKKyAgICB1cGRhdGVBbmltYXRpb25UaW1lcigpOworfQorCit2b2lkIENvbXBvc2l0ZUFu
aW1hdGlvbjo6dXBkYXRlVHJhbnNpdGlvbnMoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3Qg
UmVuZGVyU3R5bGUqIGN1cnJlbnRTdHlsZSwgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlKQorewor
ICAgIC8vIElmIGN1cnJlbnRTdHlsZSBpcyBudWxsLCB3ZSBkb24ndCBkbyB0cmFuc2l0aW9ucwor
ICAgIGlmICghY3VycmVudFN0eWxlIHx8ICF0YXJnZXRTdHlsZS0+dHJhbnNpdGlvbnMoKSkKKyAg
ICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0
byB1cGRhdGUgdGhlIGFjdGl2ZSB0cmFuc2l0aW9ucworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgdGFyZ2V0U3R5bGUtPnRyYW5zaXRpb25zKCktPnNpemUoKTsgKytpKSB7CisgICAgICAgIGNv
bnN0IEFuaW1hdGlvbiogYW5pbSA9ICgqdGFyZ2V0U3R5bGUtPnRyYW5zaXRpb25zKCkpW2ldLmdl
dCgpOworICAgICAgICBkb3VibGUgZHVyYXRpb24gPSBhbmltLT5kdXJhdGlvbigpOworICAgICAg
ICBkb3VibGUgZGVsYXkgPSBhbmltLT5kZWxheSgpOworCisgICAgICAgIC8vIElmIHRoaXMgaXMg
YW4gZW1wdHkgdHJhbnNpdGlvbiwgc2tpcCBpdAorICAgICAgICBpZiAoZHVyYXRpb24gPT0gMCAm
JiBkZWxheSA8PSAwKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAKKyAgICAgICAg
aW50IHByb3AgPSBhbmltLT5wcm9wZXJ0eSgpOworICAgICAgICBib29sIGFsbCA9IHByb3AgPT0g
Y0FuaW1hdGVBbGw7CisgICAgICAgIAorICAgICAgICAvLyBIYW5kbGUgYm90aCB0aGUgJ2FsbCcg
YW5kIHNpbmdsZSBwcm9wZXJ0eSBjYXNlcy4gRm9yIHRoZSBzaW5nbGUgcHJvcCBjYXNlLCB3ZSBt
YWtlIG9ubHkgb25lIHBhc3MKKyAgICAgICAgLy8gdGhyb3VnaCB0aGUgbG9vcAorICAgICAgICBm
b3IgKGludCBwcm9wZXJ0eUluZGV4ID0gMDsgOyArK3Byb3BlcnR5SW5kZXgpIHsKKyAgICAgICAg
ICAgIGlmIChhbGwpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlJbmRleCA+PSBBbmlt
YXRpb25Db250cm9sbGVyUHJpdmF0ZTo6Z2V0TnVtUHJvcGVydGllcygpKQorICAgICAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIG5leHQgcHJvcAorICAg
ICAgICAgICAgICAgIHByb3AgPSBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6Z2V0UHJvcGVy
dHlBdEluZGV4KHByb3BlcnR5SW5kZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAv
LyBJbXBsaWNpdEFuaW1hdGlvbnMgYXJlIGFsd2F5cyBoYXNoZWQgYnkgYWN0dWFsIHByb3BlcnRp
ZXMsIG5ldmVyIGNBbmltYXRlQWxsCisgICAgICAgICAgICBBU1NFUlQocHJvcCA+IGZpcnN0Q1NT
UHJvcGVydHkgJiYgcHJvcCA8IChmaXJzdENTU1Byb3BlcnR5ICsgbnVtQ1NTUHJvcGVydGllcykp
OworCisgICAgICAgICAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYSBjdXJyZW50IHRyYW5zaXRpb24g
Zm9yIHRoaXMgcHJvcAorICAgICAgICAgICAgSW1wbGljaXRBbmltYXRpb24qIGltcGxBbmltID0g
bV90cmFuc2l0aW9ucy5nZXQocHJvcCk7CisgICAgICAgICAgICBib29sIGVxdWFsID0gdHJ1ZTsK
KyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGltcGxBbmltKSB7CisgICAgICAgICAgICAg
ICAgLy8gVGhlcmUgaXMgb25lLCBoYXMgb3VyIHRhcmdldCBjaGFuZ2VkPworICAgICAgICAgICAg
ICAgIGlmICghaW1wbEFuaW0tPmlzVGFyZ2V0UHJvcGVydHlFcXVhbChwcm9wLCB0YXJnZXRTdHls
ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW1wbEFuaW0tPnJlc2V0KHJlbmRlcmVyKTsKKyAg
ICAgICAgICAgICAgICAgICAgZGVsZXRlIGltcGxBbmltOworICAgICAgICAgICAgICAgICAgICBt
X3RyYW5zaXRpb25zLnJlbW92ZShwcm9wKTsKKyAgICAgICAgICAgICAgICAgICAgZXF1YWwgPSBm
YWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgICAgIC8vIFNlZSBpZiB3ZSBuZWVkIHRvIHN0YXJ0IGEgbmV3IHRyYW5zaXRpb24KKyAgICAg
ICAgICAgICAgICBlcXVhbCA9IEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpwcm9wZXJ0aWVz
RXF1YWwocHJvcCwgY3VycmVudFN0eWxlLCB0YXJnZXRTdHlsZSk7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICghZXF1YWwpIHsKKyAgICAgICAgICAgICAgICAv
LyBBZGQgdGhlIG5ldyB0cmFuc2l0aW9uCisgICAgICAgICAgICAgICAgSW1wbGljaXRBbmltYXRp
b24qIGFuaW1hdGlvbiA9IG5ldyBJbXBsaWNpdEFuaW1hdGlvbihjb25zdF9jYXN0PEFuaW1hdGlv
bio+KGFuaW0pLCBwcm9wLCByZW5kZXJlciwgdGhpcyk7CisgICAgICAgICAgICAgICAgbV90cmFu
c2l0aW9ucy5zZXQocHJvcCwgYW5pbWF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IAorICAgICAgICAgICAgLy8gV2Ugb25seSBuZWVkIG9uZSBwYXNzIGZvciB0aGUgc2luZ2xlIHBy
b3AgY2FzZQorICAgICAgICAgICAgaWYgKCFhbGwpCisgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjp1cGRhdGVLZXlm
cmFtZUFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5bGUq
IGN1cnJlbnRTdHlsZSwgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlKQoreworICAgIC8vIE5vdGhp
bmcgdG8gZG8gaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgYW5pbWF0aW9ucywgYW5kIGRpZG4ndCBoYXZl
IGFueSBiZWZvcmUKKyAgICBpZiAobV9rZXlmcmFtZUFuaW1hdGlvbnMuaXNFbXB0eSgpICYmICF0
YXJnZXRTdHlsZS0+aGFzQW5pbWF0aW9ucygpKQorICAgICAgICByZXR1cm47CisgICAgCisgICAg
Ly8gTm90aGluZyB0byBkbyBpZiB0aGUgY3VycmVudCBhbmQgdGFyZ2V0IGFuaW1hdGlvbnMgYXJl
IHRoZSBzYW1lCisgICAgaWYgKGN1cnJlbnRTdHlsZSAmJiBjdXJyZW50U3R5bGUtPmhhc0FuaW1h
dGlvbnMoKSAmJiB0YXJnZXRTdHlsZS0+aGFzQW5pbWF0aW9ucygpICYmICooY3VycmVudFN0eWxl
LT5hbmltYXRpb25zKCkpID09ICoodGFyZ2V0U3R5bGUtPmFuaW1hdGlvbnMoKSkpCisgICAgICAg
IHJldHVybjsKKyAgICAgICAgCisgICAgaW50IG51bUFuaW1zID0gMDsKKyAgICBib29sIGFuaW1z
Q2hhbmdlZCA9IGZhbHNlOworICAgIAorICAgIC8vIHNlZSBpZiB0aGUgbGlzdHMgbWF0Y2gKKyAg
ICBpZiAodGFyZ2V0U3R5bGUtPmFuaW1hdGlvbnMoKSkgeworICAgICAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IHRhcmdldFN0eWxlLT5hbmltYXRpb25zKCktPnNpemUoKTsgKytpKSB7CisgICAg
ICAgICAgICBjb25zdCBBbmltYXRpb24qIGFuaW0gPSAoKnRhcmdldFN0eWxlLT5hbmltYXRpb25z
KCkpW2ldLmdldCgpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIWFuaW0tPmlzVmFs
aWRBbmltYXRpb24oKSkKKyAgICAgICAgICAgICAgICBhbmltc0NoYW5nZWQgPSB0cnVlOworICAg
ICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgQXRvbWljU3RyaW5nIG5hbWUoYW5pbS0+
bmFtZSgpKTsKKyAgICAgICAgICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbioga2ZBbmltID0gbV9r
ZXlmcmFtZUFuaW1hdGlvbnMuZ2V0KG5hbWUuaW1wbCgpKTsKKyAgICAgICAgICAgICAgICBpZiAo
IWtmQW5pbSB8fCAha2ZBbmltLT5hbmltYXRpb25zTWF0Y2goYW5pbSkpCisgICAgICAgICAgICAg
ICAgICAgIGFuaW1zQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAg
ICAgICAgICAgICAgICBpZiAoYW5pbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5p
bWF0aW9ucyBtYXRjaCwgYnV0IHBsYXkgc3RhdGVzIG1heSBkaWZmZXIuIHVwZGF0ZSBpZiBuZWVk
ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGtmQW5pbS0+dXBkYXRlUGxheVN0YXRlKGFuaW0t
PnBsYXlTdGF0ZSgpID09IEFuaW1QbGF5U3RhdGVQbGF5aW5nKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBzYXZlZCBhbmltYXRp
b24gdG8gdGhpcyBuZXcgb25lLCBqdXN0IGluIGNhc2UgdGhlIHBsYXkgc3RhdGUgaGFzIGNoYW5n
ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGtmQW5pbS0+c2V0QW5pbWF0aW9uKGFuaW0pOwor
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK251bUFu
aW1zOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGlmICghYW5pbXNDaGFuZ2VkICYmIG1f
a2V5ZnJhbWVBbmltYXRpb25zLnNpemUoKSAhPSBudW1BbmltcykKKyAgICAgICAgYW5pbXNDaGFu
Z2VkID0gdHJ1ZTsKKworICAgIGlmICghYW5pbXNDaGFuZ2VkKQorICAgICAgICByZXR1cm47CisK
KyAgICAvLyBhbmltYXRpb25zIGhhdmUgY2hhbmdlZCwgdXBkYXRlIHRoZSBsaXN0CisgICAgcmVz
ZXRBbmltYXRpb25zKHJlbmRlcmVyKTsKKworICAgIGlmICghdGFyZ2V0U3R5bGUtPmFuaW1hdGlv
bnMoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gYWRkIGFsbCB0aGUgbmV3IGFuaW1hdGlv
bnMKKyAgICBpbnQgaW5kZXggPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGFyZ2V0
U3R5bGUtPmFuaW1hdGlvbnMoKS0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgQW5pbWF0
aW9uKiBhbmltID0gKCp0YXJnZXRTdHlsZS0+YW5pbWF0aW9ucygpKVtpXS5nZXQoKTsKKworICAg
ICAgICBpZiAoIWFuaW0tPmlzVmFsaWRBbmltYXRpb24oKSkKKyAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICAgICAgCisgICAgICAgIC8vIGRvbid0IGJvdGhlciBhZGRpbmcgdGhlIGFuaW1h
dGlvbiBpZiBpdCBoYXMgbm8ga2V5ZnJhbWVzIG9yIHdvbid0IGFuaW1hdGUKKyAgICAgICAgaWYg
KChhbmltLT5kdXJhdGlvbigpIHx8IGFuaW0tPmRlbGF5KCkpICYmIGFuaW0tPml0ZXJhdGlvbkNv
dW50KCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5p
bS0+a2V5ZnJhbWVMaXN0KCkuZ2V0KCkgJiYgIWFuaW0tPmtleWZyYW1lTGlzdCgpLT5pc0VtcHR5
KCkpIHsKKyAgICAgICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBrZmFuaW0gPSBuZXcgS2V5ZnJh
bWVBbmltYXRpb24oY29uc3RfY2FzdDxBbmltYXRpb24qPihhbmltKSwgcmVuZGVyZXIsIGluZGV4
KyssIHRoaXMpOworICAgICAgICAgICAgbV9rZXlmcmFtZUFuaW1hdGlvbnMuc2V0KGtmYW5pbS0+
bmFtZSgpLmltcGwoKSwga2ZhbmltKTsKKyAgICAgICAgfQorICAgIH0KK30KKworS2V5ZnJhbWVB
bmltYXRpb24qIENvbXBvc2l0ZUFuaW1hdGlvbjo6ZmluZEtleWZyYW1lQW5pbWF0aW9uKGNvbnN0
IEF0b21pY1N0cmluZyYgbmFtZSkKK3sKKyAgICByZXR1cm4gbV9rZXlmcmFtZUFuaW1hdGlvbnMu
Z2V0KG5hbWUuaW1wbCgpKTsKK30KKworUmVuZGVyU3R5bGUqIENvbXBvc2l0ZUFuaW1hdGlvbjo6
YW5pbWF0ZShSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBjb25zdCBSZW5kZXJTdHlsZSogY3VycmVu
dFN0eWxlLCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUpCit7CisgICAgUmVuZGVyU3R5bGUqIHJl
c3VsdFN0eWxlID0gMDsKKyAgICAKKyAgICAvLyBXZSBkb24ndCBkbyBhbnkgdHJhbnNpdGlvbnMg
aWYgd2UgZG9uJ3QgaGF2ZSBhIGN1cnJlbnRTdHlsZSAob24gc3RhcnR1cCkKKyAgICB1cGRhdGVU
cmFuc2l0aW9ucyhyZW5kZXJlciwgY3VycmVudFN0eWxlLCB0YXJnZXRTdHlsZSk7CisgICAgCisg
ICAgaWYgKGN1cnJlbnRTdHlsZSkgeworICAgICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIHRyYW5z
aXRpb24gb2JqZWN0cyByZWFkeSwgbGV0IHRoZW0ga25vdyBhYm91dCB0aGUgbmV3IGdvYWwgc3Rh
dGUuICBXZSB3YW50IHRoZW0KKyAgICAgICAgLy8gdG8gZmlsbCBpbiBhIFJlbmRlclN0eWxlKiYg
b25seSBpZiBuZWVkZWQuCisgICAgICAgIENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0
X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7CisgICAgICAgIGZvciAoQ1NTUHJv
cGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJl
Z2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICAgICAgSW1wbGljaXRBbmltYXRpb24q
ICBhbmltID0gaXQtPnNlY29uZDsKKyAgICAgICAgICAgIGlmIChhbmltKSB7CisgICAgICAgICAg
ICAgICAgYW5pbS0+YW5pbWF0ZSh0aGlzLCByZW5kZXJlciwgY3VycmVudFN0eWxlLCB0YXJnZXRT
dHlsZSwgcmVzdWx0U3R5bGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisg
ICAgdXBkYXRlS2V5ZnJhbWVBbmltYXRpb25zKHJlbmRlcmVyLCBjdXJyZW50U3R5bGUsIHRhcmdl
dFN0eWxlKTsKKworICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYW5pbWF0aW9uIG9iamVjdHMgcmVh
ZHksIGxldCB0aGVtIGtub3cgYWJvdXQgdGhlIG5ldyBnb2FsIHN0YXRlLiAgV2Ugd2FudCB0aGVt
CisgICAgLy8gdG8gZmlsbCBpbiBhIFJlbmRlclN0eWxlKiYgb25seSBpZiBuZWVkZWQuCisgICAg
aWYgKHRhcmdldFN0eWxlLT5oYXNBbmltYXRpb25zKCkpIHsKKyAgICAgICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCB0YXJnZXRTdHlsZS0+YW5pbWF0aW9ucygpLT5zaXplKCk7ICsraSkgeworICAg
ICAgICAgICAgY29uc3QgQW5pbWF0aW9uKiBhbmltID0gKCp0YXJnZXRTdHlsZS0+YW5pbWF0aW9u
cygpKVtpXS5nZXQoKTsKKworICAgICAgICAgICAgaWYgKGFuaW0tPmlzVmFsaWRBbmltYXRpb24o
KSkgeworICAgICAgICAgICAgICAgIEF0b21pY1N0cmluZyBuYW1lKGFuaW0tPm5hbWUoKSk7Cisg
ICAgICAgICAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGtleWZyYW1lQW5pbSA9IG1fa2V5ZnJh
bWVBbmltYXRpb25zLmdldChuYW1lLmltcGwoKSk7CisgICAgICAgICAgICAgICAgaWYgKGtleWZy
YW1lQW5pbSkKKyAgICAgICAgICAgICAgICAgICAga2V5ZnJhbWVBbmltLT5hbmltYXRlKHRoaXMs
IHJlbmRlcmVyLCBjdXJyZW50U3R5bGUsIHRhcmdldFN0eWxlLCByZXN1bHRTdHlsZSk7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgY2xlYW51cEZpbmlzaGVkQW5p
bWF0aW9ucyhyZW5kZXJlcik7CisKKyAgICByZXR1cm4gcmVzdWx0U3R5bGUgPyByZXN1bHRTdHls
ZSA6IHRhcmdldFN0eWxlOworfQorCisvLyAiYW5pbWF0aW5nIiBtZWFucyB0aGF0IHNvbWV0aGlu
ZyBpcyBydW5uaW5nIHRoYXQgcmVxdWlyZXMgdGhlIHRpbWVyIHRvIGtlZXAgZmlyaW5nCisvLyAo
ZS5nLiBhIHRyYW5zaXRpb24pCit2b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6c2V0QW5pbWF0aW5n
KGJvb2wgaW5BbmltYXRpbmcpCit7CisgICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29u
c3RfaXRlcmF0b3IgZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKKyAgICBmb3IgKENTU1Byb3Bl
cnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5iZWdp
bigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgSW1wbGljaXRBbmltYXRpb24qICB0cmFu
c2l0aW9uID0gaXQtPnNlY29uZDsKKyAgICAgICAgdHJhbnNpdGlvbi0+c2V0QW5pbWF0aW5nKGlu
QW5pbWF0aW5nKTsKKyAgICB9CisKKyAgICBBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRv
ciBrZmVuZCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmVuZCgpOworICAgIGZvciAoQW5pbWF0aW9u
TmFtZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5iZWdpbigp
OyBpdCAhPSBrZmVuZDsgKytpdCkgeworICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbiogYW5pbSA9
IGl0LT5zZWNvbmQ7CisgICAgICAgIGFuaW0tPnNldEFuaW1hdGluZyhpbkFuaW1hdGluZyk7Cisg
ICAgfQorfQorCitib29sIENvbXBvc2l0ZUFuaW1hdGlvbjo6YW5pbWF0aW5nKCkKK3sKKyAgICBD
U1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3RyYW5zaXRp
b25zLmVuZCgpOworICAgIGZvciAoQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRl
cmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAg
ICAgICBJbXBsaWNpdEFuaW1hdGlvbiogIHRyYW5zaXRpb24gPSBpdC0+c2Vjb25kOworICAgICAg
ICBpZiAodHJhbnNpdGlvbiAmJiB0cmFuc2l0aW9uLT5hbmltYXRpbmcoKSAmJiB0cmFuc2l0aW9u
LT5ydW5uaW5nKCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAg
QW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0
aW9ucy5lbmQoKTsKKyAgICBmb3IgKEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0
ID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0ga2ZlbmQ7ICsraXQpIHsKKyAg
ICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAo
YW5pbSAmJiAhYW5pbS0+cGF1c2VkKCkgJiYgYW5pbS0+YW5pbWF0aW5nKCkgJiYgYW5pbS0+YWN0
aXZlKCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFs
c2U7Cit9CisKK3ZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpyZXNldFRyYW5zaXRpb25zKFJlbmRl
ck9iamVjdCogcmVuZGVyZXIpCit7CisgICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29u
c3RfaXRlcmF0b3IgZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKKyAgICBmb3IgKENTU1Byb3Bl
cnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5iZWdp
bigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgSW1wbGljaXRBbmltYXRpb24qICB0cmFu
c2l0aW9uID0gaXQtPnNlY29uZDsKKyAgICAgICAgdHJhbnNpdGlvbi0+cmVzZXQocmVuZGVyZXIp
OworICAgICAgICBkZWxldGUgdHJhbnNpdGlvbjsKKyAgICB9CisgICAgbV90cmFuc2l0aW9ucy5j
bGVhcigpOworfQorCit2b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6cmVzZXRBbmltYXRpb25zKFJl
bmRlck9iamVjdCogcmVuZGVyZXIpCit7CisgICAgZGVsZXRlQWxsVmFsdWVzKG1fa2V5ZnJhbWVB
bmltYXRpb25zKTsKKyAgICBtX2tleWZyYW1lQW5pbWF0aW9ucy5jbGVhcigpOworfQorCit2b2lk
IENvbXBvc2l0ZUFuaW1hdGlvbjo6Y2xlYW51cEZpbmlzaGVkQW5pbWF0aW9ucyhSZW5kZXJPYmpl
Y3QqIHJlbmRlcmVyKQoreworICAgIGlmIChzdXNwZW5kZWQoKSkKKyAgICAgICAgcmV0dXJuOwor
ICAgIAorICAgIC8vIE1ha2UgYSBsaXN0IG9mIHRyYW5zaXRpb25zIHRvIGJlIGRlbGV0ZWQKKyAg
ICBWZWN0b3I8aW50PiBmaW5pc2hlZFRyYW5zaXRpb25zOworICAgIENTU1Byb3BlcnR5VHJhbnNp
dGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7CisKKyAg
ICBmb3IgKENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90
cmFuc2l0aW9ucy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgSW1wbGljaXRB
bmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoIWFuaW0pCisgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGFuaW0tPnBvc3RhY3RpdmUoKSAmJiAhYW5pbS0+
d2FpdGluZ0ZvckVuZEV2ZW50KCkpCisgICAgICAgICAgICBmaW5pc2hlZFRyYW5zaXRpb25zLmFw
cGVuZChhbmltLT5hbmltYXRpbmdQcm9wZXJ0eSgpKTsKKyAgICB9CisgICAgCisgICAgLy8gRGVs
ZXRlIHRoZW0KKyAgICBmb3IgKFZlY3RvcjxpbnQ+OjppdGVyYXRvciBpdCA9IGZpbmlzaGVkVHJh
bnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZmluaXNoZWRUcmFuc2l0aW9ucy5lbmQoKTsgKytpdCkg
eworICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogYW5pbSA9IG1fdHJhbnNpdGlvbnMuZ2V0KCpp
dCk7CisgICAgICAgIGlmIChhbmltKSB7CisgICAgICAgICAgICBhbmltLT5yZXNldChyZW5kZXJl
cik7CisgICAgICAgICAgICBkZWxldGUgYW5pbTsKKyAgICAgICAgfQorICAgICAgICBtX3RyYW5z
aXRpb25zLnJlbW92ZSgqaXQpOworICAgIH0KKworICAgIC8vIE1ha2UgYSBsaXN0IG9mIGFuaW1h
dGlvbnMgdG8gYmUgZGVsZXRlZAorICAgIFZlY3RvcjxBdG9taWNTdHJpbmdJbXBsKj4gZmluaXNo
ZWRBbmltYXRpb25zOworICAgIEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGtmZW5k
ID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuZW5kKCk7CisKKyAgICBmb3IgKEFuaW1hdGlvbk5hbWVN
YXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuYmVnaW4oKTsgaXQg
IT0ga2ZlbmQ7ICsraXQpIHsKKyAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGFuaW0gPSBpdC0+
c2Vjb25kOworICAgICAgICBpZiAoIWFuaW0pCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgaWYgKGFuaW0tPnBvc3RhY3RpdmUoKSAmJiAhYW5pbS0+d2FpdGluZ0ZvckVuZEV2ZW50KCkp
CisgICAgICAgICAgICBmaW5pc2hlZEFuaW1hdGlvbnMuYXBwZW5kKGFuaW0tPm5hbWUoKS5pbXBs
KCkpOworICAgIH0KKyAgICAKKyAgICAvLyBkZWxldGUgdGhlbQorICAgIGZvciAoVmVjdG9yPEF0
b21pY1N0cmluZ0ltcGwqPjo6aXRlcmF0b3IgaXQgPSBmaW5pc2hlZEFuaW1hdGlvbnMuYmVnaW4o
KTsgaXQgIT0gZmluaXNoZWRBbmltYXRpb25zLmVuZCgpOyArK2l0KSB7CisgICAgICAgIEtleWZy
YW1lQW5pbWF0aW9uKiBrZmFuaW0gPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5nZXQoKml0KTsKKyAg
ICAgICAgaWYgKGtmYW5pbSkgeworICAgICAgICAgICAga2ZhbmltLT5yZXNldChyZW5kZXJlcik7
CisgICAgICAgICAgICBkZWxldGUga2ZhbmltOworICAgICAgICB9CisgICAgICAgIG1fa2V5ZnJh
bWVBbmltYXRpb25zLnJlbW92ZSgqaXQpOworICAgIH0KK30KKwordm9pZCBDb21wb3NpdGVBbmlt
YXRpb246OnNldEFuaW1hdGlvblN0YXJ0VGltZShkb3VibGUgdCkKK3sKKyAgICAvLyBzZXQgc3Rh
cnQgdGltZSBvbiBhbGwgYW5pbWF0aW9ucyB3YWl0aW5nIGZvciBpdAorICAgIEFuaW1hdGlvbk5h
bWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuZW5kKCk7
CisgICAgZm9yIChBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJh
bWVBbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IGtmZW5kOyArK2l0KSB7CisgICAgICAgIEtleWZy
YW1lQW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKKyAgICAgICAgaWYgKGFuaW0gJiYgYW5p
bS0+d2FpdGluZ0ZvclN0YXJ0VGltZSgpKQorICAgICAgICAgICAgYW5pbS0+dXBkYXRlU3RhdGVN
YWNoaW5lKEFuaW1hdGlvbkJhc2U6OlNUQVRFX0lOUFVUX1NUQVJUX1RJTUVfU0VULCB0KTsKKyAg
ICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpzZXRUcmFuc2l0aW9uU3RhcnRUaW1l
KGludCBwcm9wZXJ0eSwgZG91YmxlIHQpCit7CisgICAgLy8gU2V0IHRoZSBzdGFydCB0aW1lIGZv
ciBnaXZlbiBwcm9wZXJ0eSB0cmFuc2l0aW9uCisgICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01h
cDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKKyAgICBmb3IgKENT
U1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9u
cy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgSW1wbGljaXRBbmltYXRpb24q
IGFuaW0gPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT53YWl0aW5nRm9y
U3RhcnRUaW1lKCkgJiYgYW5pbS0+YW5pbWF0aW5nUHJvcGVydHkoKSA9PSBwcm9wZXJ0eSkKKyAg
ICAgICAgICAgIGFuaW0tPnVwZGF0ZVN0YXRlTWFjaGluZShBbmltYXRpb25CYXNlOjpTVEFURV9J
TlBVVF9TVEFSVF9USU1FX1NFVCwgdCk7CisgICAgfQorfQorCit2b2lkIENvbXBvc2l0ZUFuaW1h
dGlvbjo6c3VzcGVuZEFuaW1hdGlvbnMoKQoreworICAgIGlmIChtX3N1c3BlbmRlZCkKKyAgICAg
ICAgcmV0dXJuOworICAgIAorICAgIG1fc3VzcGVuZGVkID0gdHJ1ZTsKKworICAgIEFuaW1hdGlv
bk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuZW5k
KCk7CisgICAgZm9yIChBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5
ZnJhbWVBbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IGtmZW5kOyArK2l0KSB7CisgICAgICAgIEtl
eWZyYW1lQW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKKyAgICAgICAgaWYgKGFuaW0pCisg
ICAgICAgICAgICBhbmltLT51cGRhdGVQbGF5U3RhdGUoZmFsc2UpOworICAgIH0KKworICAgIENT
U1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlv
bnMuZW5kKCk7CisgICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVy
YXRvciBpdCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAg
ICAgIEltcGxpY2l0QW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKKyAgICAgICAgaWYgKGFu
aW0gJiYgYW5pbS0+aGFzU3R5bGUoKSkKKyAgICAgICAgICAgIGFuaW0tPnVwZGF0ZVBsYXlTdGF0
ZShmYWxzZSk7CisgICAgfQorfQorCit2b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6cmVzdW1lQW5p
bWF0aW9ucygpCit7CisgICAgaWYgKCFtX3N1c3BlbmRlZCkKKyAgICAgICAgcmV0dXJuOworICAg
IAorICAgIG1fc3VzcGVuZGVkID0gZmFsc2U7CisgICAgCisgICAgQW5pbWF0aW9uTmFtZU1hcDo6
Y29uc3RfaXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5lbmQoKTsKKyAgICBm
b3IgKEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZUFuaW1h
dGlvbnMuYmVnaW4oKTsgaXQgIT0ga2ZlbmQ7ICsraXQpIHsKKyAgICAgICAgS2V5ZnJhbWVBbmlt
YXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT5wbGF5
U3RhdGVQbGF5aW5nKCkpCisgICAgICAgICAgICBhbmltLT51cGRhdGVQbGF5U3RhdGUodHJ1ZSk7
CisgICAgfQorICAgIAorICAgIENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJh
dG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7CisgICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5z
aXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQg
IT0gZW5kOyArK2l0KSB7CisgICAgICAgIEltcGxpY2l0QW5pbWF0aW9uKiBhbmltID0gaXQtPnNl
Y29uZDsKKyAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+aGFzU3R5bGUoKSkKKyAgICAgICAgICAg
IGFuaW0tPnVwZGF0ZVBsYXlTdGF0ZSh0cnVlKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRl
QW5pbWF0aW9uOjpvdmVycmlkZUltcGxpY2l0QW5pbWF0aW9ucyhpbnQgcHJvcGVydHkpCit7Cisg
ICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV90cmFu
c2l0aW9ucy5lbmQoKTsKKyAgICBmb3IgKENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0
X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsK
KyAgICAgICAgSW1wbGljaXRBbmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOworICAgICAgICBp
ZiAoYW5pbSAmJiBhbmltLT5hbmltYXRpbmdQcm9wZXJ0eSgpID09IHByb3BlcnR5KQorICAgICAg
ICAgICAgYW5pbS0+c2V0T3ZlcnJpZGRlbih0cnVlKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29tcG9z
aXRlQW5pbWF0aW9uOjpyZXN1bWVPdmVycmlkZGVuSW1wbGljaXRBbmltYXRpb25zKGludCBwcm9w
ZXJ0eSkKK3sKKyAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBl
bmQgPSBtX3RyYW5zaXRpb25zLmVuZCgpOworICAgIGZvciAoQ1NTUHJvcGVydHlUcmFuc2l0aW9u
c01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9IGVu
ZDsgKytpdCkgeworICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7
CisgICAgICAgIGlmIChhbmltICYmIGFuaW0tPmFuaW1hdGluZ1Byb3BlcnR5KCkgPT0gcHJvcGVy
dHkpCisgICAgICAgICAgICBhbmltLT5zZXRPdmVycmlkZGVuKGZhbHNlKTsKKyAgICB9Cit9CisK
K3N0YXRpYyBpbmxpbmUgYm9vbCBjb21wYXJlQW5pbWF0aW9uSW5kaWNlcyhjb25zdCBLZXlmcmFt
ZUFuaW1hdGlvbiogYSwgY29uc3QgS2V5ZnJhbWVBbmltYXRpb24qIGIpCit7CisgICAgcmV0dXJu
IGEtPmluZGV4KCkgPCBiLT5pbmRleCgpOworfQorCit2b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6
c3R5bGVBdmFpbGFibGUoKQoreworICAgIGlmIChtX251bVN0eWxlQXZhaWxhYmxlV2FpdGVycyA9
PSAwKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgLy8gV2UgaGF2ZSB0byBnbyB0aHJvdWdo
IGFuaW1hdGlvbnMgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluCisgICAgLy8g
dGhlIHN0eWxlLCBiZWNhdXNlIG9yZGVyIG1hdHRlcnMgZm9yIGFkZGl0aXZpdHkuCisgICAgVmVj
dG9yPEtleWZyYW1lQW5pbWF0aW9uKj4gYW5pbWF0aW9ucyhtX2tleWZyYW1lQW5pbWF0aW9ucy5z
aXplKCkpOworICAgIEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0gbV9r
ZXlmcmFtZUFuaW1hdGlvbnMuZW5kKCk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoQW5p
bWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5i
ZWdpbigpOyBpdCAhPSBrZmVuZDsgKytpdCkgeworICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbiog
YW5pbSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIC8vIFdlIGNhbid0IGp1c3QgaW5zZXJ0IGJhc2Vk
IG9uIGFuaW0tPmluZGV4KCkgYmVjYXVzZSBpbnZhbGlkIGFuaW1hdGlvbnMgZG9uJ3QKKyAgICAg
ICAgLy8gbWFrZSBpdCBpbnRvIHRoZSBoYXNoLgorICAgICAgICBhbmltYXRpb25zW2krK10gPSBh
bmltOworICAgIH0KKworICAgIGlmIChhbmltYXRpb25zLnNpemUoKSA+IDEpCisgICAgICAgIHN0
ZDo6c3RhYmxlX3NvcnQoYW5pbWF0aW9ucy5iZWdpbigpLCBhbmltYXRpb25zLmVuZCgpLCBjb21w
YXJlQW5pbWF0aW9uSW5kaWNlcyk7CisgICAgCisgICAgZm9yIChpID0gMDsgaSA8IGFuaW1hdGlv
bnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGFuaW0gPSBhbmlt
YXRpb25zW2ldOworICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT53YWl0aW5nRm9yU3R5bGVBdmFp
bGFibGUoKSkKKyAgICAgICAgICAgIGFuaW0tPnVwZGF0ZVN0YXRlTWFjaGluZShBbmltYXRpb25C
YXNlOjpTVEFURV9JTlBVVF9TVFlMRV9BVkFJTEFCTEUsIC0xKTsKKyAgICB9CisgICAgCisgICAg
Q1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV90cmFuc2l0
aW9ucy5lbmQoKTsKKyAgICBmb3IgKENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0
ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAg
ICAgICAgSW1wbGljaXRBbmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAo
YW5pbSAmJiBhbmltLT53YWl0aW5nRm9yU3R5bGVBdmFpbGFibGUoKSkKKyAgICAgICAgICAgIGFu
aW0tPnVwZGF0ZVN0YXRlTWFjaGluZShBbmltYXRpb25CYXNlOjpTVEFURV9JTlBVVF9TVFlMRV9B
VkFJTEFCTEUsIC0xKTsKKyAgICB9Cit9CisKK2Jvb2wgQ29tcG9zaXRlQW5pbWF0aW9uOjppc0Fu
aW1hdGluZ1Byb3BlcnR5KGludCBwcm9wZXJ0eSwgYm9vbCBpc1J1bm5pbmdOb3cpIGNvbnN0Cit7
CisgICAgQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1l
QW5pbWF0aW9ucy5lbmQoKTsKKyAgICBmb3IgKEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJh
dG9yIGl0ID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0ga2ZlbmQ7ICsraXQp
IHsKKyAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOworICAgICAg
ICBpZiAoYW5pbSAmJiBhbmltLT5pc0FuaW1hdGluZ1Byb3BlcnR5KHByb3BlcnR5LCBpc1J1bm5p
bmdOb3cpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIENTU1By
b3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMu
ZW5kKCk7CisgICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRv
ciBpdCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAg
IEltcGxpY2l0QW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKKyAgICAgICAgaWYgKGFuaW0g
JiYgYW5pbS0+aXNBbmltYXRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgaXNSdW5uaW5nTm93KSkKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3Zv
aWQgSW1wbGljaXRBbmltYXRpb246OmFuaW1hdGUoQ29tcG9zaXRlQW5pbWF0aW9uKiBhbmltYXRp
b24sIFJlbmRlck9iamVjdCogcmVuZGVyZXIsIGNvbnN0IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5
bGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSog
dGFyZ2V0U3R5bGUsIFJlbmRlclN0eWxlKiYgYW5pbWF0ZWRTdHlsZSkKK3sKKyAgICBpZiAocGF1
c2VkKCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICAvLyBJZiB3ZSBnZXQgdGhpcyBmYXIg
YW5kIHRoZSBhbmltYXRpb24gaXMgZG9uZSwgaXQgbWVhbnMgd2UgYXJlIGNsZWFuaW5nIHVwIGEg
anVzdCBmaW5pc2hlZCBhbmltYXRpb24uCisgICAgLy8gU28ganVzdCByZXR1cm4uIEV2ZXJ5dGhp
bmcgaXMgYWxyZWFkeSBhbGwgY2xlYW5lZCB1cAorICAgIGlmIChwb3N0YWN0aXZlKCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIC8vIFJlc2V0IHRvIHN0YXJ0IHRoZSB0cmFuc2l0aW9uIGlmIHdl
IGFyZSBuZXcKKyAgICBpZiAoaXNuZXcoKSkKKyAgICAgICAgcmVzZXQocmVuZGVyZXIsIGN1cnJl
bnRTdHlsZSwgdGFyZ2V0U3R5bGUpOworICAgIAorICAgIC8vIFJ1biBhIGN5Y2xlIG9mIGFuaW1h
dGlvbi4KKyAgICAvLyBXZSBrbm93IHdlIHdpbGwgbmVlZCBhIG5ldyByZW5kZXIgc3R5bGUsIHNv
IG1ha2Ugb25lIGlmIG5lZWRlZAorICAgIGlmICghYW5pbWF0ZWRTdHlsZSkKKyAgICAgICAgYW5p
bWF0ZWRTdHlsZSA9IG5ldyAocmVuZGVyZXItPnJlbmRlckFyZW5hKCkpIFJlbmRlclN0eWxlKCp0
YXJnZXRTdHlsZSk7CisgICAgCisgICAgZG91YmxlIHByb2cgPSBwcm9ncmVzcygxLCAwKTsKKyAg
ICBib29sIG5lZWRzQW5pbSA9IEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpibGVuZFByb3Bl
cnRpZXMobV9hbmltYXRpbmdQcm9wZXJ0eSwgYW5pbWF0ZWRTdHlsZSwgbV9mcm9tU3R5bGUsIG1f
dG9TdHlsZSwgcHJvZyk7CisgICAgaWYgKG5lZWRzQW5pbSkKKyAgICAgICAgc2V0QW5pbWF0aW5n
KCk7Cit9CisKK3ZvaWQgSW1wbGljaXRBbmltYXRpb246Om9uQW5pbWF0aW9uRW5kKGRvdWJsZSBp
bkVsYXBzZWRUaW1lKQoreworICAgIGlmICghc2VuZFRyYW5zaXRpb25FdmVudChFdmVudE5hbWVz
Ojp3ZWJraXRUcmFuc2l0aW9uRW5kRXZlbnQsIGluRWxhcHNlZFRpbWUpKSB7CisgICAgICAgIC8v
IFdlIGRpZG4ndCBkaXNwYXRjaCBhbiBldmVudCwgd2hpY2ggd291bGQgY2FsbCBlbmRBbmltYXRp
b24oKSwgc28gd2UnbGwganVzdCBjYWxsIGl0IGhlcmUuCisgICAgICAgIGVuZEFuaW1hdGlvbih0
cnVlKTsKKyAgICB9Cit9CisKK2Jvb2wgSW1wbGljaXRBbmltYXRpb246OnNlbmRUcmFuc2l0aW9u
RXZlbnQoY29uc3QgQXRvbWljU3RyaW5nJiBpbkV2ZW50VHlwZSwgZG91YmxlIGluRWxhcHNlZFRp
bWUpCit7CisgICAgaWYgKGluRXZlbnRUeXBlID09IEV2ZW50TmFtZXM6OndlYmtpdFRyYW5zaXRp
b25FbmRFdmVudCkgeworICAgICAgICBEb2N1bWVudDo6TGlzdGVuZXJUeXBlIGxpc3RlbmVyVHlw
ZSA9IERvY3VtZW50OjpUUkFOU0lUSU9ORU5EX0xJU1RFTkVSOworICAgICAgICAKKyAgICAgICAg
aWYgKHNob3VsZFNlbmRFdmVudEZvckxpc3RlbmVyKGxpc3RlbmVyVHlwZSkpIHsKKyAgICAgICAg
ICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBlbGVtZW50Rm9yRXZlbnREaXNwYXRjaCgpOworICAgICAg
ICAgICAgaWYgKGVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1l
OworICAgICAgICAgICAgICAgIGlmIChtX3RyYW5zaXRpb25Qcm9wZXJ0eSAhPSBjQW5pbWF0ZUFs
bCkKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gU3RyaW5nKGdldFByb3BlcnR5
TmFtZSgoQ1NTUHJvcGVydHlJRCltX3RyYW5zaXRpb25Qcm9wZXJ0eSkpOworICAgICAgICAgICAg
ICAgIG1fd2FpdGluZ0ZvckVuZEV2ZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtX2FuaW1h
dGlvbkV2ZW50RGlzcGF0Y2hlci5zdGFydFRpbWVyKGVsZW1lbnQsIHByb3BlcnR5TmFtZSwgbV90
cmFuc2l0aW9uUHJvcGVydHksIHRydWUsIGluRXZlbnRUeXBlLCBpbkVsYXBzZWRUaW1lKTsKKyAg
ICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gRGlkIGRpc3BhdGNoIGFuIGV2ZW50CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIGZhbHNlOyAvLyBE
aWRuJ3QgZGlzcGF0Y2ggYW4gZXZlbnQKK30KKwordm9pZCBJbXBsaWNpdEFuaW1hdGlvbjo6cmVz
ZXQoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5bGUqIGZyb20gLyogPSAw
ICovLCBjb25zdCBSZW5kZXJTdHlsZSogdG8gLyogPSAwICovKQoreworICAgIEFTU0VSVCgoIW1f
dG9TdHlsZSAmJiAhdG8pIHx8IG1fdG9TdHlsZSAhPSB0byk7CisgICAgQVNTRVJUKCghbV9mcm9t
U3R5bGUgJiYgIWZyb20pIHx8IG1fZnJvbVN0eWxlICE9IGZyb20pOworICAgIGlmIChtX2Zyb21T
dHlsZSkKKyAgICAgICAgbV9mcm9tU3R5bGUtPmRlcmVmKHJlbmRlcmVyLT5yZW5kZXJBcmVuYSgp
KTsKKyAgICBpZiAobV90b1N0eWxlKQorICAgICAgICBtX3RvU3R5bGUtPmRlcmVmKHJlbmRlcmVy
LT5yZW5kZXJBcmVuYSgpKTsKKyAgICAKKyAgICBtX2Zyb21TdHlsZSA9IGNvbnN0X2Nhc3Q8UmVu
ZGVyU3R5bGUqPihmcm9tKTsgICAvLyBpdCBpcyByZWFkLW9ubHksIG90aGVyIHRoYW4gdGhlIHJl
ZgorICAgIGlmIChtX2Zyb21TdHlsZSkKKyAgICAgICAgbV9mcm9tU3R5bGUtPnJlZigpOworICAg
IAorICAgIG1fdG9TdHlsZSA9IGNvbnN0X2Nhc3Q8UmVuZGVyU3R5bGUqPih0byk7ICAgICAgIC8v
IGl0IGlzIHJlYWQtb25seSwgb3RoZXIgdGhhbiB0aGUgcmVmCisgICAgaWYgKG1fdG9TdHlsZSkK
KyAgICAgICAgbV90b1N0eWxlLT5yZWYoKTsKKyAgICAKKyAgICAvLyByZXN0YXJ0IHRoZSB0cmFu
c2l0aW9uCisgICAgaWYgKGZyb20gJiYgdG8pCisgICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShT
VEFURV9JTlBVVF9SRVNUQVJUX0FOSU1BVElPTiwgLTEpOworfQorCit2b2lkIEltcGxpY2l0QW5p
bWF0aW9uOjpzZXRPdmVycmlkZGVuKGJvb2wgYikKK3sKKyAgICBpZiAoYiAhPSBtX292ZXJyaWRk
ZW4pIHsKKyAgICAgICAgbV9vdmVycmlkZGVuID0gYjsKKyAgICAgICAgdXBkYXRlU3RhdGVNYWNo
aW5lKG1fb3ZlcnJpZGRlbiA/IFNUQVRFX0lOUFVUX1BBVVNFX09WRVJSSURFIDogU1RBVEVfSU5Q
VVRfUkVTVU1FX09WRVJSSURFLCAtMSk7CisgICAgfQorfQorCitib29sIEltcGxpY2l0QW5pbWF0
aW9uOjphZmZlY3RzUHJvcGVydHkoaW50IHByb3BlcnR5KSBjb25zdAoreworICAgIHJldHVybiAo
bV9hbmltYXRpbmdQcm9wZXJ0eSA9PSBwcm9wZXJ0eSk7Cit9CisKK2Jvb2wgSW1wbGljaXRBbmlt
YXRpb246OmlzVGFyZ2V0UHJvcGVydHlFcXVhbChpbnQgcHJvcCwgY29uc3QgUmVuZGVyU3R5bGUq
IHRhcmdldFN0eWxlKQoreworICAgIHJldHVybiBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6
cHJvcGVydGllc0VxdWFsKHByb3AsIG1fdG9TdHlsZSwgdGFyZ2V0U3R5bGUpOworfQorCit2b2lk
IEltcGxpY2l0QW5pbWF0aW9uOjpibGVuZFByb3BlcnR5VmFsdWVJblN0eWxlKGludCBwcm9wLCBS
ZW5kZXJTdHlsZSogY3VycmVudFN0eWxlKQoreworICAgIGRvdWJsZSBwcm9nID0gcHJvZ3Jlc3Mo
MSwgMCk7CisgICAgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OmJsZW5kUHJvcGVydGllcyhw
cm9wLCBjdXJyZW50U3R5bGUsIG1fZnJvbVN0eWxlLCBtX3RvU3R5bGUsIHByb2cpOworfSAgICAK
Kwordm9pZCBLZXlmcmFtZUFuaW1hdGlvbjo6YW5pbWF0ZShDb21wb3NpdGVBbmltYXRpb24qIGFu
aW1hdGlvbiwgUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5bGUqIGN1cnJl
bnRTdHlsZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZW5k
ZXJTdHlsZSogdGFyZ2V0U3R5bGUsIFJlbmRlclN0eWxlKiYgYW5pbWF0ZWRTdHlsZSkKK3sKKyAg
ICAvLyBpZiB3ZSBoYXZlIG5vdCB5ZXQgc3RhcnRlZCwgd2Ugd2lsbCBub3QgaGF2ZSBhIHZhbGlk
IHN0YXJ0IHRpbWUsIHNvIGp1c3Qgc3RhcnQgdGhlIGFuaW1hdGlvbiBpZiBuZWVkZWQKKyAgICBp
ZiAoaXNuZXcoKSAmJiBtX2FuaW1hdGlvbi0+cGxheVN0YXRlKCkgPT0gQW5pbVBsYXlTdGF0ZVBs
YXlpbmcpCisgICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFURV9JTlBVVF9TVEFSVF9BTklN
QVRJT04sIC0xKTsKKyAgICAKKyAgICAvLyBJZiB3ZSBnZXQgdGhpcyBmYXIgYW5kIHRoZSBhbmlt
YXRpb24gaXMgZG9uZSwgaXQgbWVhbnMgd2UgYXJlIGNsZWFuaW5nIHVwIGEganVzdCBmaW5pc2hl
ZCBhbmltYXRpb24uCisgICAgLy8gSWYgc28sIHdlIG5lZWQgdG8gc2VuZCBiYWNrIHRoZSB0YXJn
ZXRTdHlsZQorICAgIGlmIChwb3N0YWN0aXZlKCkpIHsKKyAgICAgICAgaWYgKCFhbmltYXRlZFN0
eWxlKQorICAgICAgICAgICAgYW5pbWF0ZWRTdHlsZSA9IGNvbnN0X2Nhc3Q8UmVuZGVyU3R5bGUq
Pih0YXJnZXRTdHlsZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBpZiB3ZSBh
cmUgd2FpdGluZyBmb3IgdGhlIHN0YXJ0IHRpbWVyLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSB0
aGUgc3R5bGUgeWV0CisgICAgLy8gU3BlY2lhbCBjYXNlIC0gaWYgdGhlIGRlbGF5IHRpbWUgaXMg
MCwgdGhlbiB3ZSBkbyB3YW50IHRvIHNldCB0aGUgZmlyc3QgZnJhbWUgb2YgdGhlCisgICAgLy8g
YW5pbWF0aW9uIHJpZ2h0IGF3YXkuIFRoaXMgYXZvaWRzIGEgZmxhc2ggd2hlbiB0aGUgYW5pbWF0
aW9uIHN0YXJ0cworICAgIGlmICh3YWl0aW5nVG9TdGFydCgpICYmIG1fYW5pbWF0aW9uLT5kZWxh
eSgpID4gMCkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIC8vIEZJWE1FOiB3ZSBuZWVkIHRv
IGJlIG1vcmUgZWZmaWNpZW50IGFib3V0IGRldGVybWluaW5nIHdoaWNoIGtleWZyYW1lcyB3ZSBh
cmUgYW5pbWF0aW5nIGJldHdlZW4uCisgICAgLy8gV2Ugc2hvdWxkIGNhY2hlIHRoZSBsYXN0IHBh
aXIgb3Igc29tZXRoaW5nCisgICAgCisgICAgLy8gZmluZCB0aGUgZmlyc3Qga2V5CisgICAgZG91
YmxlIGVsYXBzZWRUaW1lID0gKG1fc3RhcnRUaW1lID4gMCkgPyAoKCFwYXVzZWQoKSA/IGN1cnJl
bnRUaW1lKCkgOiBtX3BhdXNlVGltZSkgLSBtX3N0YXJ0VGltZSkgOiAwLjA7CisgICAgaWYgKGVs
YXBzZWRUaW1lIDwgMC4wKQorICAgICAgICBlbGFwc2VkVGltZSA9IDAuMDsKKyAgICAgICAgCisg
ICAgZG91YmxlIHQgPSBtX2FuaW1hdGlvbi0+ZHVyYXRpb24oKSA/IChlbGFwc2VkVGltZSAvIG1f
YW5pbWF0aW9uLT5kdXJhdGlvbigpKSA6IDEuMDsKKyAgICBpbnQgaSA9IChpbnQpIHQ7CisgICAg
dCAtPSBpOworICAgIGlmIChtX2FuaW1hdGlvbi0+ZGlyZWN0aW9uKCkgJiYgKGkgJiAxKSkKKyAg
ICAgICAgdCA9IDEgLSB0OworCisgICAgUmVuZGVyU3R5bGUqIGZyb21TdHlsZSA9IDA7CisgICAg
UmVuZGVyU3R5bGUqIHRvU3R5bGUgPSAwOworICAgIGRvdWJsZSBzY2FsZSA9IDEuMDsKKyAgICBk
b3VibGUgb2Zmc2V0ID0gMC4wOworICAgIGlmIChtX2tleWZyYW1lcy5nZXQoKSkgeworICAgICAg
ICBWZWN0b3I8S2V5ZnJhbWVWYWx1ZT46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fa2V5ZnJhbWVz
LT5lbmRLZXlmcmFtZXMoKTsKKyAgICAgICAgZm9yIChWZWN0b3I8S2V5ZnJhbWVWYWx1ZT46OmNv
bnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZXMtPmJlZ2luS2V5ZnJhbWVzKCk7IGl0ICE9IGVu
ZDsgKytpdCkgeworICAgICAgICAgICAgaWYgKHQgPCBpdC0+a2V5KSB7CisgICAgICAgICAgICAg
ICAgLy8gVGhlIGZpcnN0IGtleSBzaG91bGQgYWx3YXlzIGJlIDAsIHNvIHdlIHNob3VsZCBuZXZl
ciBzdWNjZWVkIG9uIHRoZSBmaXJzdCBrZXkKKyAgICAgICAgICAgICAgICBpZiAoIWZyb21TdHls
ZSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgc2NhbGUgPSAx
LjAgLyAoaXQtPmtleSAtIG9mZnNldCk7CisgICAgICAgICAgICAgICAgdG9TdHlsZSA9IGNvbnN0
X2Nhc3Q8UmVuZGVyU3R5bGUqPigmKGl0LT5zdHlsZSkpOworICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBvZmZzZXQgPSBpdC0+
a2V5OworICAgICAgICAgICAgZnJvbVN0eWxlID0gY29uc3RfY2FzdDxSZW5kZXJTdHlsZSo+KCYo
aXQtPnN0eWxlKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8gaWYgZWl0aGVyIHN0
eWxlIGlzIDAgd2UgaGF2ZSBhbiBpbnZhbGlkIGNhc2UsIGp1c3Qgc3RvcCB0aGUgYW5pbWF0aW9u
CisgICAgaWYgKCFmcm9tU3R5bGUgfHwgIXRvU3R5bGUpIHsKKyAgICAgICAgdXBkYXRlU3RhdGVN
YWNoaW5lKFNUQVRFX0lOUFVUX0VORF9BTklNQVRJT04sIC0xKTsKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKyAgICAKKyAgICAvLyBydW4gYSBjeWNsZSBvZiBhbmltYXRpb24uCisgICAgLy8gV2Ug
a25vdyB3ZSB3aWxsIG5lZWQgYSBuZXcgcmVuZGVyIHN0eWxlLCBzbyBtYWtlIG9uZSBpZiBuZWVk
ZWQKKyAgICBpZiAoIWFuaW1hdGVkU3R5bGUpCisgICAgICAgIGFuaW1hdGVkU3R5bGUgPSBuZXcg
KHJlbmRlcmVyLT5yZW5kZXJBcmVuYSgpKSBSZW5kZXJTdHlsZSgqdGFyZ2V0U3R5bGUpOworICAg
IAorICAgIGRvdWJsZSBwcm9nID0gcHJvZ3Jlc3Moc2NhbGUsIG9mZnNldCk7CisKKyAgICBIYXNo
U2V0PGludD46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fa2V5ZnJhbWVzLT5lbmRQcm9wZXJ0aWVz
KCk7CisgICAgZm9yIChIYXNoU2V0PGludD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFt
ZXMtPmJlZ2luUHJvcGVydGllcygpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgaWYgKEFu
aW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpibGVuZFByb3BlcnRpZXMoKml0LCBhbmltYXRlZFN0
eWxlLCBmcm9tU3R5bGUsIHRvU3R5bGUsIHByb2cpKQorICAgICAgICAgICAgc2V0QW5pbWF0aW5n
KCk7CisgICAgfQorfQorCit2b2lkIEtleWZyYW1lQW5pbWF0aW9uOjplbmRBbmltYXRpb24oYm9v
bCByZXNldCkKK3sKKyAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCAodW5hbmltYXRlZCkgc3R5
bGUKKyAgICBpZiAobV9vYmplY3QpCisgICAgICAgIHNldENoYW5nZWQobV9vYmplY3QtPmVsZW1l
bnQoKSk7Cit9CisKK3ZvaWQgS2V5ZnJhbWVBbmltYXRpb246Om9uQW5pbWF0aW9uU3RhcnQoZG91
YmxlIGluRWxhcHNlZFRpbWUpCit7CisgICAgc2VuZEFuaW1hdGlvbkV2ZW50KEV2ZW50TmFtZXM6
OndlYmtpdEFuaW1hdGlvblN0YXJ0RXZlbnQsIGluRWxhcHNlZFRpbWUpOworfQorCit2b2lkIEtl
eWZyYW1lQW5pbWF0aW9uOjpvbkFuaW1hdGlvbkl0ZXJhdGlvbihkb3VibGUgaW5FbGFwc2VkVGlt
ZSkKK3sKKyAgICBzZW5kQW5pbWF0aW9uRXZlbnQoRXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9u
SXRlcmF0aW9uRXZlbnQsIGluRWxhcHNlZFRpbWUpOworfQorCit2b2lkIEtleWZyYW1lQW5pbWF0
aW9uOjpvbkFuaW1hdGlvbkVuZChkb3VibGUgaW5FbGFwc2VkVGltZSkKK3sKKyAgICBpZiAoIXNl
bmRBbmltYXRpb25FdmVudChFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRpb25FbmRFdmVudCwgaW5F
bGFwc2VkVGltZSkpIHsKKyAgICAgICAgLy8gV2UgZGlkbid0IGRpc3BhdGNoIGFuIGV2ZW50LCB3
aGljaCB3b3VsZCBjYWxsIGVuZEFuaW1hdGlvbigpLCBzbyB3ZSdsbCBqdXN0IGNhbGwgaXQgaGVy
ZS4KKyAgICAgICAgZW5kQW5pbWF0aW9uKHRydWUpOworICAgIH0KK30KKworYm9vbCBLZXlmcmFt
ZUFuaW1hdGlvbjo6c2VuZEFuaW1hdGlvbkV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyYgaW5FdmVu
dFR5cGUsIGRvdWJsZSBpbkVsYXBzZWRUaW1lKQoreworICAgIERvY3VtZW50OjpMaXN0ZW5lclR5
cGUgbGlzdGVuZXJUeXBlOworICAgIGlmIChpbkV2ZW50VHlwZSA9PSBFdmVudE5hbWVzOjp3ZWJr
aXRBbmltYXRpb25JdGVyYXRpb25FdmVudCkKKyAgICAgICAgbGlzdGVuZXJUeXBlID0gRG9jdW1l
bnQ6OkFOSU1BVElPTklURVJBVElPTl9MSVNURU5FUjsKKyAgICBlbHNlIGlmIChpbkV2ZW50VHlw
ZSA9PSBFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRpb25FbmRFdmVudCkKKyAgICAgICAgbGlzdGVu
ZXJUeXBlID0gRG9jdW1lbnQ6OkFOSU1BVElPTkVORF9MSVNURU5FUjsKKyAgICBlbHNlCisgICAg
ICAgIGxpc3RlbmVyVHlwZSA9IERvY3VtZW50OjpBTklNQVRJT05TVEFSVF9MSVNURU5FUjsKKyAg
ICAKKyAgICBpZiAoc2hvdWxkU2VuZEV2ZW50Rm9yTGlzdGVuZXIobGlzdGVuZXJUeXBlKSkgewor
ICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gZWxlbWVudEZvckV2ZW50RGlzcGF0Y2goKTsKKyAg
ICAgICAgaWYgKGVsZW1lbnQpIHsKKyAgICAgICAgICAgIG1fd2FpdGluZ0ZvckVuZEV2ZW50ID0g
dHJ1ZTsKKyAgICAgICAgICAgIG1fYW5pbWF0aW9uRXZlbnREaXNwYXRjaGVyLnN0YXJ0VGltZXIo
ZWxlbWVudCwgbV9uYW1lLCAtMSwgdHJ1ZSwgaW5FdmVudFR5cGUsIGluRWxhcHNlZFRpbWUpOwor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIERpZCBkaXNwYXRjaCBhbiBldmVudAorICAgICAg
ICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOyAvLyBEaWQgbm90IGRpc3BhdGNoIGFuIGV2
ZW50Cit9CisKK3ZvaWQgS2V5ZnJhbWVBbmltYXRpb246Om92ZXJyaWRlQW5pbWF0aW9ucygpCit7
CisgICAgLy8gVGhpcyB3aWxsIG92ZXJyaWRlIGltcGxpY2l0IGFuaW1hdGlvbnMgdGhhdCBtYXRj
aCB0aGUgcHJvcGVydGllcyBpbiB0aGUga2V5ZnJhbWUgYW5pbWF0aW9uCisgICAgSGFzaFNldDxp
bnQ+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX2tleWZyYW1lcy0+ZW5kUHJvcGVydGllcygpOwor
ICAgIGZvciAoSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVzLT5i
ZWdpblByb3BlcnRpZXMoKTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICBjb21wb3NpdGVBbmlt
YXRpb24oKS0+b3ZlcnJpZGVJbXBsaWNpdEFuaW1hdGlvbnMoKml0KTsKK30KKwordm9pZCBLZXlm
cmFtZUFuaW1hdGlvbjo6cmVzdW1lT3ZlcnJpZGRlbkFuaW1hdGlvbnMoKQoreworICAgIC8vIFRo
aXMgd2lsbCByZXN1bWUgb3ZlcnJpZGRlbiBpbXBsaWNpdCBhbmltYXRpb25zCisgICAgSGFzaFNl
dDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX2tleWZyYW1lcy0+ZW5kUHJvcGVydGllcygp
OworICAgIGZvciAoSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVz
LT5iZWdpblByb3BlcnRpZXMoKTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICBjb21wb3NpdGVB
bmltYXRpb24oKS0+cmVzdW1lT3ZlcnJpZGRlbkltcGxpY2l0QW5pbWF0aW9ucygqaXQpOworfQor
Citib29sIEtleWZyYW1lQW5pbWF0aW9uOjphZmZlY3RzUHJvcGVydHkoaW50IHByb3BlcnR5KSBj
b25zdAoreworICAgIEhhc2hTZXQ8aW50Pjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9rZXlmcmFt
ZXMtPmVuZFByb3BlcnRpZXMoKTsKKyAgICBmb3IgKEhhc2hTZXQ8aW50Pjo6Y29uc3RfaXRlcmF0
b3IgaXQgPSBtX2tleWZyYW1lcy0+YmVnaW5Qcm9wZXJ0aWVzKCk7IGl0ICE9IGVuZDsgKytpdCkg
eworICAgICAgICBpZiAoKCppdCkgPT0gcHJvcGVydHkpCisgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitBbmltYXRpb25Db250cm9sbGVyOjpB
bmltYXRpb25Db250cm9sbGVyKEZyYW1lKiBmcmFtZSkKKzogbV9kYXRhKG5ldyBBbmltYXRpb25D
b250cm9sbGVyUHJpdmF0ZShmcmFtZSkpCit7CisgICAgCit9CisKK0FuaW1hdGlvbkNvbnRyb2xs
ZXI6On5BbmltYXRpb25Db250cm9sbGVyKCkKK3sKKyAgICBkZWxldGUgbV9kYXRhOworfQorCit2
b2lkIEFuaW1hdGlvbkNvbnRyb2xsZXI6OmNhbmNlbEFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0KiBy
ZW5kZXJlcikKK3sKKyAgICBpZiAoIW1fZGF0YS0+aGFzQW5pbWF0aW9ucygpKQorICAgICAgICBy
ZXR1cm47CisgICAgCisgICAgaWYgKG1fZGF0YS0+Y2xlYXIocmVuZGVyZXIpKQorICAgICAgICBz
ZXRDaGFuZ2VkKHJlbmRlcmVyLT5lbGVtZW50KCkpOworfQorCitSZW5kZXJTdHlsZSogQW5pbWF0
aW9uQ29udHJvbGxlcjo6dXBkYXRlQW5pbWF0aW9ucyhSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBS
ZW5kZXJTdHlsZSogbmV3U3R5bGUpCit7ICAgIAorICAgIC8vIGRvbid0IGRvIGFueXRoaW5nIGlm
IHdlJ3JlIGluIHRoZSBjYWNoZQorICAgIGlmICghcmVuZGVyZXItPmRvY3VtZW50KCkgfHwgcmVu
ZGVyZXItPmRvY3VtZW50KCktPmluUGFnZUNhY2hlKCkpCisgICAgICAgIHJldHVybiBuZXdTdHls
ZTsKKyAgICAKKyAgICBSZW5kZXJTdHlsZSogb2xkU3R5bGUgPSByZW5kZXJlci0+c3R5bGUoKTsK
KyAgICAKKyAgICBpZiAoKCFvbGRTdHlsZSB8fCAoIW9sZFN0eWxlLT5hbmltYXRpb25zKCkgJiYg
IW9sZFN0eWxlLT50cmFuc2l0aW9ucygpKSkgJiYgCisgICAgICAgICAgICAgICAgICAgICAgICAo
IW5ld1N0eWxlLT5hbmltYXRpb25zKCkgJiYgIW5ld1N0eWxlLT50cmFuc2l0aW9ucygpKSkKKyAg
ICAgICAgcmV0dXJuIG5ld1N0eWxlOworICAgIAorICAgIFJlbmRlclN0eWxlKiBibGVuZGVkU3R5
bGUgPSBuZXdTdHlsZTsKKyAgICAKKyAgICAvLyBGZXRjaCBvdXIgY3VycmVudCBzZXQgb2YgaW1w
bGljaXQgYW5pbWF0aW9ucyBmcm9tIGEgaGFzaHRhYmxlLiAgV2UgdGhlbiBjb21wYXJlIHRoZW0K
KyAgICAvLyBhZ2FpbnN0IHRoZSBhbmltYXRpb25zIGluIHRoZSBzdHlsZSBhbmQgbWFrZSBzdXJl
IHdlJ3JlIGluIHN5bmMuICBJZiBkZXN0aW5hdGlvbiB2YWx1ZXMKKyAgICAvLyBoYXZlIGNoYW5n
ZWQsIHdlIHJlc2V0IHRoZSBhbmltYXRpb24uICBXZSB0aGVuIGRvIGEgYmxlbmQgdG8gZ2V0IG5l
dyB2YWx1ZXMgYW5kIHdlIHJldHVybgorICAgIC8vIGEgbmV3IHN0eWxlLgorICAgIEFTU0VSVChy
ZW5kZXJlci0+ZWxlbWVudCgpKTsgLy8gRklYTUU6IFdlIGRvIG5vdCBhbmltYXRlIGdlbmVyYXRl
ZCBjb250ZW50IHlldC4KKyAgICAKKyAgICBDb21wb3NpdGVBbmltYXRpb24qIHJlbmRlcmVyQW5p
bWF0aW9ucyA9IG1fZGF0YS0+YWNjZXNzQ29tcG9zaXRlQW5pbWF0aW9uKHJlbmRlcmVyKTsKKyAg
ICBibGVuZGVkU3R5bGUgPSByZW5kZXJlckFuaW1hdGlvbnMtPmFuaW1hdGUocmVuZGVyZXIsIG9s
ZFN0eWxlLCBuZXdTdHlsZSk7CisgICAgCisgICAgbV9kYXRhLT51cGRhdGVBbmltYXRpb25UaW1l
cigpOworICAgIAorICAgIGlmIChibGVuZGVkU3R5bGUgIT0gbmV3U3R5bGUpIHsKKyAgICAgICAg
Ly8gSWYgdGhlIGFuaW1hdGlvbnMvdHJhbnNpdGlvbnMgY2hhbmdlIG9wYWNpdHkgb3IgdHJhbnNm
b3JtLCB3ZSBuZWVlZCB0byB1cGRhdGUKKyAgICAgICAgLy8gdGhlIHN0eWxlIHRvIGltcG9zZSB0
aGUgc3RhY2tpbmcgcnVsZXMuIE5vdGUgdGhhdCB0aGlzIGlzIGFsc28KKyAgICAgICAgLy8gZG9u
ZSBpbiBDU1NTdHlsZVNlbGVjdG9yOjphZGp1c3RSZW5kZXJTdHlsZSgpLgorICAgICAgICBpZiAo
YmxlbmRlZFN0eWxlLT5oYXNBdXRvWkluZGV4KCkgJiYgKGJsZW5kZWRTdHlsZS0+b3BhY2l0eSgp
IDwgMS4wZiB8fCBibGVuZGVkU3R5bGUtPmhhc1RyYW5zZm9ybSgpKSkKKyAgICAgICAgICAgIGJs
ZW5kZWRTdHlsZS0+c2V0WkluZGV4KDApOworICAgIH0KKyAgICByZXR1cm4gYmxlbmRlZFN0eWxl
OworfQorCit2b2lkIEFuaW1hdGlvbkNvbnRyb2xsZXI6OnNldEFuaW1hdGlvblN0YXJ0VGltZShS
ZW5kZXJPYmplY3QqIG9iaiwgZG91YmxlIHQpCit7CisgICAgQ29tcG9zaXRlQW5pbWF0aW9uKiBy
ZW5kZXJlckFuaW1hdGlvbnMgPSBtX2RhdGEtPmFjY2Vzc0NvbXBvc2l0ZUFuaW1hdGlvbihvYmop
OworICAgIHJlbmRlcmVyQW5pbWF0aW9ucy0+c2V0QW5pbWF0aW9uU3RhcnRUaW1lKHQpOworfQor
Cit2b2lkIEFuaW1hdGlvbkNvbnRyb2xsZXI6OnNldFRyYW5zaXRpb25TdGFydFRpbWUoUmVuZGVy
T2JqZWN0KiBvYmosIGludCBwcm9wZXJ0eSwgZG91YmxlIHQpCit7CisgICAgQ29tcG9zaXRlQW5p
bWF0aW9uKiByZW5kZXJlckFuaW1hdGlvbnMgPSBtX2RhdGEtPmFjY2Vzc0NvbXBvc2l0ZUFuaW1h
dGlvbihvYmopOworICAgIHJlbmRlcmVyQW5pbWF0aW9ucy0+c2V0VHJhbnNpdGlvblN0YXJ0VGlt
ZShwcm9wZXJ0eSwgdCk7Cit9CisKK2Jvb2wgQW5pbWF0aW9uQ29udHJvbGxlcjo6aXNBbmltYXRp
bmdQcm9wZXJ0eU9uUmVuZGVyZXIoUmVuZGVyT2JqZWN0KiBvYmosIGludCBwcm9wZXJ0eSwgYm9v
bCBpc1J1bm5pbmdOb3cpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZGF0YS0+aXNBbmltYXRpbmdQ
cm9wZXJ0eU9uUmVuZGVyZXIob2JqLCBwcm9wZXJ0eSwgaXNSdW5uaW5nTm93KTsKK30KKwordm9p
ZCBBbmltYXRpb25Db250cm9sbGVyOjpzdXNwZW5kQW5pbWF0aW9ucyhEb2N1bWVudCogZG9jdW1l
bnQpCit7CisgICAgbV9kYXRhLT5zdXNwZW5kQW5pbWF0aW9ucyhkb2N1bWVudCk7Cit9CisKK3Zv
aWQgQW5pbWF0aW9uQ29udHJvbGxlcjo6cmVzdW1lQW5pbWF0aW9ucyhEb2N1bWVudCogZG9jdW1l
bnQpCit7CisgICAgbV9kYXRhLT5yZXN1bWVBbmltYXRpb25zKGRvY3VtZW50KTsKK30KKwordm9p
ZCBBbmltYXRpb25Db250cm9sbGVyOjpzdGFydFVwZGF0ZVJlbmRlcmluZ0Rpc3BhdGNoZXIoKQor
eworICAgIG1fZGF0YS0+c3RhcnRVcGRhdGVSZW5kZXJpbmdEaXNwYXRjaGVyKCk7Cit9CisKK3Zv
aWQgQW5pbWF0aW9uQ29udHJvbGxlcjo6c3R5bGVBdmFpbGFibGUoKQoreworICAgIG1fZGF0YS0+
c3R5bGVBdmFpbGFibGUoKTsKK30KKwordm9pZCBDb21wb3NpdGVBbmltYXRpb246OnNldFdhaXRp
bmdGb3JTdHlsZUF2YWlsYWJsZShib29sIHdhaXRpbmcpCit7CisgICAgaWYgKHdhaXRpbmcpCisg
ICAgICAgIG1fbnVtU3R5bGVBdmFpbGFibGVXYWl0ZXJzKys7CisgICAgZWxzZQorICAgICAgICBt
X251bVN0eWxlQXZhaWxhYmxlV2FpdGVycy0tOworICAgIG1fYW5pbWF0aW9uQ29udHJvbGxlci0+
c2V0V2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKHdhaXRpbmcpOworfQorICAgIAorfQpJbmRleDog
V2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9BbmltYXRpb25Db250cm9sbGVyLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3BhZ2UvYW5pbWF0aW9uL0FuaW1hdGlvbkNvbnRyb2xsZXIuY3BwCShyZXZp
c2lvbiAwKQorKysgV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9BbmltYXRpb25Db250cm9sbGVyLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtMjgsMTA0NSArMjgsMTUgQEAKIAogI2luY2x1ZGUgImNvbmZp
Zy5oIgogI2luY2x1ZGUgIkFuaW1hdGlvbkNvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJDb21wb3Np
dGVBbmltYXRpb24uaCIKIAotI2luY2x1ZGUgIkNTU1Byb3BlcnR5TmFtZXMuaCIKLSNpbmNsdWRl
ICJDU3RyaW5nLmgiCi0jaW5jbHVkZSAiRG9jdW1lbnQuaCIKLSNpbmNsdWRlICJFdmVudE5hbWVz
LmgiCi0jaW5jbHVkZSAiRmxvYXRDb252ZXJzaW9uLmgiCiAjaW5jbHVkZSAiRnJhbWUuaCIKLSNp
bmNsdWRlICJSZW5kZXJPYmplY3QuaCIKLSNpbmNsdWRlICJSZW5kZXJTdHlsZS5oIgotI2luY2x1
ZGUgIlN5c3RlbVRpbWUuaCIKICNpbmNsdWRlICJUaW1lci5oIgotI2luY2x1ZGUgIlVuaXRCZXpp
ZXIuaCIKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBzdGF0aWMgY29uc3QgZG91YmxlIGNBbmlt
YXRpb25UaW1lckRlbGF5ID0gMC4wMjU7CiAKLXN0YXRpYyB2b2lkIHNldENoYW5nZWQoTm9kZSog
bm9kZSkKLXsKLSAgICBBU1NFUlQoIW5vZGUgfHwgKG5vZGUtPmRvY3VtZW50KCkgJiYgIW5vZGUt
PmRvY3VtZW50KCktPmluUGFnZUNhY2hlKCkpKTsKLSAgICBub2RlLT5zZXRDaGFuZ2VkKEFuaW1h
dGlvblN0eWxlQ2hhbmdlKTsKLX0KLQotLy8gVGhlIGVwc2lsb24gdmFsdWUgd2UgcGFzcyB0byBV
bml0QmV6aWVyOjpzb2x2ZSBnaXZlbiB0aGF0IHRoZSBhbmltYXRpb24gaXMgZ29pbmcgdG8gcnVu
IG92ZXIgfGR1cnwgc2Vjb25kcy4gVGhlIGxvbmdlciB0aGUKLS8vIGFuaW1hdGlvbiwgdGhlIG1v
cmUgcHJlY2lzaW9uIHdlIG5lZWQgaW4gdGhlIHRpbWluZyBmdW5jdGlvbiByZXN1bHQgdG8gYXZv
aWQgdWdseSBkaXNjb250aW51aXRpZXMuCi1zdGF0aWMgaW5saW5lIGRvdWJsZSBzb2x2ZUVwc2ls
b24oZG91YmxlIGR1cmF0aW9uKSB7IHJldHVybiAxLiAvICgyMDAuICogZHVyYXRpb24pOyB9Ci0K
LXN0YXRpYyBpbmxpbmUgZG91YmxlIHNvbHZlQ3ViaWNCZXppZXJGdW5jdGlvbihkb3VibGUgcDF4
LCBkb3VibGUgcDF5LCBkb3VibGUgcDJ4LCBkb3VibGUgcDJ5LCBkb3VibGUgdCwgZG91YmxlIGR1
cmF0aW9uKQotewotICAgIC8vIENvbnZlcnQgZnJvbSBpbnB1dCB0aW1lIHRvIHBhcmFtZXRyaWMg
dmFsdWUgaW4gY3VydmUsIHRoZW4gZnJvbQotICAgIC8vIHRoYXQgdG8gb3V0cHV0IHRpbWUuCi0g
ICAgVW5pdEJlemllciBiZXppZXIocDF4LCBwMXksIHAyeCwgcDJ5KTsKLSAgICByZXR1cm4gYmV6
aWVyLnNvbHZlKHQsIHNvbHZlRXBzaWxvbihkdXJhdGlvbikpOwotfQotCi1jbGFzcyBDb21wb3Np
dGVBbmltYXRpb247Ci1jbGFzcyBBbmltYXRpb25CYXNlOwotCi1jbGFzcyBBbmltYXRpb25UaW1l
ckJhc2UgewotcHVibGljOgotICAgIEFuaW1hdGlvblRpbWVyQmFzZShBbmltYXRpb25CYXNlKiBh
bmltKQotICAgIDogbV90aW1lcih0aGlzLCAmQW5pbWF0aW9uVGltZXJCYXNlOjp0aW1lckZpcmVk
KQotICAgICwgbV9hbmltKGFuaW0pCi0gICAgewotICAgICAgICBtX3RpbWVyLnN0YXJ0T25lU2hv
dCgwKTsKLSAgICB9Ci0gICAgdmlydHVhbCB+QW5pbWF0aW9uVGltZXJCYXNlKCkKLSAgICB7Ci0g
ICAgfQotICAgIAotICAgIHZvaWQgc3RhcnRUaW1lcihkb3VibGUgdGltZW91dD0wKQotICAgIHsK
LSAgICAgICAgbV90aW1lci5zdGFydE9uZVNob3QodGltZW91dCk7Ci0gICAgfQotICAgIAotICAg
IHZvaWQgY2FuY2VsVGltZXIoKQotICAgIHsKLSAgICAgICAgbV90aW1lci5zdG9wKCk7Ci0gICAg
fQotICAgIAotICAgIHZpcnR1YWwgdm9pZCB0aW1lckZpcmVkKFRpbWVyPEFuaW1hdGlvblRpbWVy
QmFzZT4qKSA9IDA7Ci0gICAgCi1wcml2YXRlOgotICAgIFRpbWVyPEFuaW1hdGlvblRpbWVyQmFz
ZT4gbV90aW1lcjsKLSAgICAKLXByb3RlY3RlZDoKLSAgICBBbmltYXRpb25CYXNlKiBtX2FuaW07
Ci19OwotCi1jbGFzcyBBbmltYXRpb25FdmVudERpc3BhdGNoZXIgOiBwdWJsaWMgQW5pbWF0aW9u
VGltZXJCYXNlIHsKLXB1YmxpYzoKLSAgICBBbmltYXRpb25FdmVudERpc3BhdGNoZXIoQW5pbWF0
aW9uQmFzZSogYW5pbSkgCi0gICAgOiBBbmltYXRpb25UaW1lckJhc2UoYW5pbSkKLSAgICAsIG1f
cHJvcGVydHkoQ1NTUHJvcGVydHlJbnZhbGlkKQotICAgICwgbV9yZXNldChmYWxzZSkKLSAgICAs
IG1fZWxhcHNlZFRpbWUoLTEpCi0gICAgewotICAgIH0KLSAgICAKLSAgICB2aXJ0dWFsIH5Bbmlt
YXRpb25FdmVudERpc3BhdGNoZXIoKQotICAgIHsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzdGFy
dFRpbWVyKEVsZW1lbnQqIGVsZW1lbnQsIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSwgaW50IHBy
b3BlcnR5LCBib29sIHJlc2V0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBBdG9taWNTdHJp
bmcmIGV2ZW50VHlwZSwgZG91YmxlIGVsYXBzZWRUaW1lKQotICAgIHsKLSAgICAgICAgbV9lbGVt
ZW50ID0gZWxlbWVudDsKLSAgICAgICAgbV9uYW1lID0gbmFtZTsKLSAgICAgICAgbV9wcm9wZXJ0
eSA9IHByb3BlcnR5OwotICAgICAgICBtX3Jlc2V0ID0gcmVzZXQ7Ci0gICAgICAgIG1fZXZlbnRU
eXBlID0gZXZlbnRUeXBlOwotICAgICAgICBtX2VsYXBzZWRUaW1lID0gZWxhcHNlZFRpbWU7Ci0g
ICAgICAgIEFuaW1hdGlvblRpbWVyQmFzZTo6c3RhcnRUaW1lcigpOwotICAgIH0KLSAgICAKLSAg
ICB2aXJ0dWFsIHZvaWQgdGltZXJGaXJlZChUaW1lcjxBbmltYXRpb25UaW1lckJhc2U+Kik7Ci0g
ICAgCi1wcml2YXRlOgotICAgIFJlZlB0cjxFbGVtZW50PiBtX2VsZW1lbnQ7Ci0gICAgQXRvbWlj
U3RyaW5nIG1fbmFtZTsKLSAgICBpbnQgbV9wcm9wZXJ0eTsKLSAgICBib29sIG1fcmVzZXQ7Ci0g
ICAgQXRvbWljU3RyaW5nIG1fZXZlbnRUeXBlOwotICAgIGRvdWJsZSBtX2VsYXBzZWRUaW1lOwot
fTsKLQotY2xhc3MgQW5pbWF0aW9uVGltZXJDYWxsYmFjayA6IHB1YmxpYyBBbmltYXRpb25UaW1l
ckJhc2UgewotcHVibGljOgotICAgIEFuaW1hdGlvblRpbWVyQ2FsbGJhY2soQW5pbWF0aW9uQmFz
ZSogYW5pbSkgCi0gICAgOiBBbmltYXRpb25UaW1lckJhc2UoYW5pbSkKLSAgICAsIG1fZWxhcHNl
ZFRpbWUoMCkKLSAgICB7IH0KLSAgICB2aXJ0dWFsIH5BbmltYXRpb25UaW1lckNhbGxiYWNrKCkg
eyB9Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkIHRpbWVyRmlyZWQoVGltZXI8QW5pbWF0aW9uVGlt
ZXJCYXNlPiopOwotICAgIAotICAgIHZvaWQgc3RhcnRUaW1lcihkb3VibGUgdGltZW91dCwgY29u
c3QgQXRvbWljU3RyaW5nJiBldmVudFR5cGUsIGRvdWJsZSBlbGFwc2VkVGltZSkKLSAgICB7Ci0g
ICAgICAgIG1fZXZlbnRUeXBlID0gZXZlbnRUeXBlOwotICAgICAgICBtX2VsYXBzZWRUaW1lID0g
ZWxhcHNlZFRpbWU7Ci0gICAgICAgIEFuaW1hdGlvblRpbWVyQmFzZTo6c3RhcnRUaW1lcih0aW1l
b3V0KTsKLSAgICB9Ci0gICAgCi1wcml2YXRlOgotICAgIEF0b21pY1N0cmluZyBtX2V2ZW50VHlw
ZTsKLSAgICBkb3VibGUgbV9lbGFwc2VkVGltZTsKLX07Ci0KLWNsYXNzIEltcGxpY2l0QW5pbWF0
aW9uOwotY2xhc3MgS2V5ZnJhbWVBbmltYXRpb247Ci1jbGFzcyBBbmltYXRpb25Db250cm9sbGVy
UHJpdmF0ZTsKLQotLy8gQSBDb21wb3NpdGVBbmltYXRpb24gcmVwcmVzZW50cyBhIGNvbGxlY3Rp
b24gb2YgYW5pbWF0aW9ucyB0aGF0IGFyZSBydW5uaW5nCi0vLyBvbiBhIHNpbmdsZSBSZW5kZXJP
YmplY3QsIHN1Y2ggYXMgYSBudW1iZXIgb2YgcHJvcGVydGllcyB0cmFuc2l0aW9uaW5nIGF0IG9u
Y2UuCi1jbGFzcyBDb21wb3NpdGVBbmltYXRpb24gOiBwdWJsaWMgTm9uY29weWFibGUgewotcHVi
bGljOgotICAgIENvbXBvc2l0ZUFuaW1hdGlvbihBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZSog
YW5pbWF0aW9uQ29udHJvbGxlcikKLSAgICA6IG1fc3VzcGVuZGVkKGZhbHNlKQotICAgICwgbV9h
bmltYXRpb25Db250cm9sbGVyKGFuaW1hdGlvbkNvbnRyb2xsZXIpCi0gICAgLCBtX251bVN0eWxl
QXZhaWxhYmxlV2FpdGVycygwKQotICAgIHsgfQotICAgIAotICAgIH5Db21wb3NpdGVBbmltYXRp
b24oKQotICAgIHsKLSAgICAgICAgZGVsZXRlQWxsVmFsdWVzKG1fdHJhbnNpdGlvbnMpOwotICAg
ICAgICBkZWxldGVBbGxWYWx1ZXMobV9rZXlmcmFtZUFuaW1hdGlvbnMpOwotICAgIH0KLSAgICAK
LSAgICBSZW5kZXJTdHlsZSogYW5pbWF0ZShSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJTdHls
ZSogY3VycmVudFN0eWxlLCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUpOwotICAgIAotICAgIHZv
aWQgc2V0QW5pbWF0aW5nKGJvb2wgaW5BbmltYXRpbmcpOwotICAgIGJvb2wgYW5pbWF0aW5nKCk7
Ci0gICAgCi0gICAgYm9vbCBoYXNBbmltYXRpb25Gb3JQcm9wZXJ0eShpbnQgcHJvcCkgY29uc3Qg
eyByZXR1cm4gbV90cmFuc2l0aW9ucy5jb250YWlucyhwcm9wKTsgfQotICAgIAotICAgIHZvaWQg
cmVzZXRUcmFuc2l0aW9ucyhSZW5kZXJPYmplY3QqKTsKLSAgICB2b2lkIHJlc2V0QW5pbWF0aW9u
cyhSZW5kZXJPYmplY3QqKTsKLSAgICAKLSAgICB2b2lkIGNsZWFudXBGaW5pc2hlZEFuaW1hdGlv
bnMoUmVuZGVyT2JqZWN0Kik7Ci0KLSAgICB2b2lkIHNldEFuaW1hdGlvblN0YXJ0VGltZShkb3Vi
bGUgdCk7Ci0gICAgdm9pZCBzZXRUcmFuc2l0aW9uU3RhcnRUaW1lKGludCBwcm9wZXJ0eSwgZG91
YmxlIHQpOwotICAgIAotICAgIHZvaWQgc3VzcGVuZEFuaW1hdGlvbnMoKTsKLSAgICB2b2lkIHJl
c3VtZUFuaW1hdGlvbnMoKTsKLSAgICBib29sIHN1c3BlbmRlZCgpIGNvbnN0IHsgcmV0dXJuIG1f
c3VzcGVuZGVkOyB9Ci0gICAgCi0gICAgdm9pZCBvdmVycmlkZUltcGxpY2l0QW5pbWF0aW9ucyhp
bnQgcHJvcGVydHkpOwotICAgIHZvaWQgcmVzdW1lT3ZlcnJpZGRlbkltcGxpY2l0QW5pbWF0aW9u
cyhpbnQgcHJvcGVydHkpOwotICAgIAotICAgIHZvaWQgc3R5bGVBdmFpbGFibGUoKTsKLSAgICAK
LSAgICBib29sIGlzQW5pbWF0aW5nUHJvcGVydHkoaW50IHByb3BlcnR5LCBib29sIGlzUnVubmlu
Z05vdykgY29uc3Q7Ci0gICAgCi0gICAgdm9pZCBzZXRXYWl0aW5nRm9yU3R5bGVBdmFpbGFibGUo
Ym9vbCB3YWl0aW5nKTsKLQotcHJvdGVjdGVkOgotICAgIHZvaWQgdXBkYXRlVHJhbnNpdGlvbnMo
UmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5bGUqIGN1cnJlbnRTdHlsZSwg
UmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlKTsKLSAgICB2b2lkIHVwZGF0ZUtleWZyYW1lQW5pbWF0
aW9ucyhSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBjb25zdCBSZW5kZXJTdHlsZSogY3VycmVudFN0
eWxlLCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUpOwotCi0gICAgS2V5ZnJhbWVBbmltYXRpb24q
IGZpbmRLZXlmcmFtZUFuaW1hdGlvbihjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUpOwotICAgIAot
cHJpdmF0ZToKLSAgICB0eXBlZGVmIEhhc2hNYXA8aW50LCBJbXBsaWNpdEFuaW1hdGlvbio+IENT
U1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA7Ci0gICAgdHlwZWRlZiBIYXNoTWFwPEF0b21pY1N0cmlu
Z0ltcGwqLCBLZXlmcmFtZUFuaW1hdGlvbio+ICBBbmltYXRpb25OYW1lTWFwOwotICAgIAotICAg
IENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXAgICBtX3RyYW5zaXRpb25zOwotICAgIEFuaW1hdGlv
bk5hbWVNYXAgICAgICAgICAgICBtX2tleWZyYW1lQW5pbWF0aW9uczsKLSAgICBib29sICAgICAg
ICAgICAgICAgICAgICAgICAgbV9zdXNwZW5kZWQ7Ci0gICAgQW5pbWF0aW9uQ29udHJvbGxlclBy
aXZhdGUqIG1fYW5pbWF0aW9uQ29udHJvbGxlcjsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAg
ICAgICAgbV9udW1TdHlsZUF2YWlsYWJsZVdhaXRlcnM7Ci19OwotCi1jbGFzcyBBbmltYXRpb25C
YXNlIDogcHVibGljIE5vbmNvcHlhYmxlIHsKLXB1YmxpYzoKLSAgICBBbmltYXRpb25CYXNlKGNv
bnN0IEFuaW1hdGlvbiogdHJhbnNpdGlvbiwgUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgQ29tcG9z
aXRlQW5pbWF0aW9uKiBjb21wQW5pbSk7Ci0gICAgdmlydHVhbCB+QW5pbWF0aW9uQmFzZSgpCi0g
ICAgewotICAgICAgICBpZiAobV9hbmltU3RhdGUgPT0gU1RBVEVfU1RBUlRfV0FJVF9TVFlMRV9B
VkFJTEFCTEUpCi0gICAgICAgICAgICBtX2NvbXBBbmltLT5zZXRXYWl0aW5nRm9yU3R5bGVBdmFp
bGFibGUoZmFsc2UpOwotICAgIH0KLSAgICAKLSAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyKCkg
Y29uc3QgeyByZXR1cm4gbV9vYmplY3Q7IH0KLSAgICBkb3VibGUgc3RhcnRUaW1lKCkgY29uc3Qg
eyByZXR1cm4gbV9zdGFydFRpbWU7IH0KLSAgICBkb3VibGUgZHVyYXRpb24oKSBjb25zdCAgeyBy
ZXR1cm4gbV9hbmltYXRpb24tPmR1cmF0aW9uKCk7IH0KLSAgICAKLSAgICB2b2lkIGNhbmNlbFRp
bWVycygpCi0gICAgewotICAgICAgICBtX2FuaW1hdGlvblRpbWVyQ2FsbGJhY2suY2FuY2VsVGlt
ZXIoKTsKLSAgICAgICAgbV9hbmltYXRpb25FdmVudERpc3BhdGNoZXIuY2FuY2VsVGltZXIoKTsK
LSAgICB9Ci0gICAgCi0gICAgLy8gQW5pbWF0aW9ucyBhbmQgVHJhbnNpdGlvbnMgZ28gdGhyb3Vn
aCB0aGUgc3RhdGVzIGJlbG93LiBXaGVuIGVudGVyaW5nIHRoZSBTVEFSVEVEIHN0YXRlCi0gICAg
Ly8gdGhlIGFuaW1hdGlvbiBpcyBzdGFydGVkLiBUaGlzIG1heSBvciBtYXkgbm90IHJlcXVpcmUg
ZGVmZXJyZWQgcmVzcG9uc2UgZnJvbSB0aGUgYW5pbWF0b3IuCi0gICAgLy8gSWYgc28sIHdlIHN0
YXkgaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGF0IHJlc3BvbnNlIGlzIHJlY2VpdmVkIChhbmQgaXQg
cmV0dXJucyB0aGUgc3RhcnQgdGltZSkuCi0gICAgLy8gT3RoZXJ3aXNlLCB3ZSB1c2UgdGhlIGN1
cnJlbnQgdGltZSBhcyB0aGUgc3RhcnQgdGltZSBhbmQgZ28gaW1tZWRpYXRlbHkgdG8gdGhlIExP
T1BJTkcgb3IKLSAgICAvLyBFTkRJTkcgc3RhdGUuCi0gICAgZW51bSBBbmltU3RhdGUgeyAKLSAg
ICAgICAgU1RBVEVfTkVXLCAgICAgICAgICAgICAgICAgICAgICAvLyBhbmltYXRpb24ganVzdCBj
cmVhdGVkLCBhbmltYXRpb24gbm90IHJ1bm5pbmcgeWV0Ci0gICAgICAgIFNUQVRFX1NUQVJUX1dB
SVRfVElNRVIsICAgICAgICAgLy8gc3RhcnQgdGltZXIgcnVubmluZywgd2FpdGluZyBmb3IgZmly
ZQotICAgICAgICBTVEFURV9TVEFSVF9XQUlUX1NUWUxFX0FWQUlMQUJMRSwgICAvLyB3YWl0aW5n
IGZvciBzdHlsZSBzZXR1cCBzbyB3ZSBjYW4gc3RhcnQgYW5pbWF0aW9ucwotICAgICAgICBTVEFU
RV9TVEFSVF9XQUlUX1JFU1BPTlNFLCAgICAgIC8vIGFuaW1hdGlvbiBzdGFydGVkLCB3YWl0aW5n
IGZvciByZXNwb25zZQotICAgICAgICBTVEFURV9MT09QSU5HLCAgICAgICAgICAgICAgICAgIC8v
IHJlc3BvbnNlIHJlY2VpdmVkLCBhbmltYXRpb24gcnVubmluZywgbG9vcCB0aW1lciBydW5uaW5n
LCB3YWl0aW5nIGZvciBmaXJlCi0gICAgICAgIFNUQVRFX0VORElORywgICAgICAgICAgICAgICAg
ICAgLy8gcmVzcG9uc2UgcmVjZWl2ZWQsIGFuaW1hdGlvbiBydW5uaW5nLCBlbmQgdGltZXIgcnVu
bmluZywgd2FpdGluZyBmb3IgZmlyZQotICAgICAgICBTVEFURV9QQVVTRURfV0FJVF9USU1FUiwg
ICAgICAgIC8vIGFuaW1hdGlvbiBpbiBwYXVzZSBtb2RlIHdoZW4gYW5pbWF0aW9uIHN0YXJ0ZWQK
LSAgICAgICAgU1RBVEVfUEFVU0VEX1dBSVRfUkVTUE9OU0UsICAgICAvLyBhbmltYXRpb24gcGF1
c2VkIHdoZW4gaW4gU1RBUlRJTkcgc3RhdGUKLSAgICAgICAgU1RBVEVfUEFVU0VEX1JVTiwgICAg
ICAgICAgICAgICAvLyBhbmltYXRpb24gcGF1c2VkIHdoZW4gaW4gTE9PUElORyBvciBFTkRJTkcg
c3RhdGUKLSAgICAgICAgU1RBVEVfRE9ORSAgICAgICAgICAgICAgICAgICAgICAvLyBlbmQgdGlt
ZXIgZmlyZWQsIGFuaW1hdGlvbiBmaW5pc2hlZCBhbmQgcmVtb3ZlZAotICAgIH07Ci0gICAgCi0g
ICAgZW51bSBBbmltU3RhdGVJbnB1dCB7Ci0gICAgICAgIFNUQVRFX0lOUFVUX01BS0VfTkVXLCAg
ICAgICAgICAgLy8gcmVzZXQgYmFjayB0byBuZXcgZnJvbSBhbnkgc3RhdGUKLSAgICAgICAgU1RB
VEVfSU5QVVRfU1RBUlRfQU5JTUFUSU9OLCAgICAvLyBhbmltYXRpb24gcmVxdWVzdHMgYSBzdGFy
dAotICAgICAgICBTVEFURV9JTlBVVF9SRVNUQVJUX0FOSU1BVElPTiwgIC8vIGZvcmNlIGEgcmVz
dGFydCBmcm9tIGFueSBzdGF0ZQotICAgICAgICBTVEFURV9JTlBVVF9TVEFSVF9USU1FUl9GSVJF
RCwgIC8vIHN0YXJ0IHRpbWVyIGZpcmVkCi0gICAgICAgIFNUQVRFX0lOUFVUX1NUWUxFX0FWQUlM
QUJMRSwgICAgICAgIC8vIHN0eWxlIGlzIHNldHVwLCByZWFkeSB0byBzdGFydCBhbmltYXRpbmcK
LSAgICAgICAgU1RBVEVfSU5QVVRfU1RBUlRfVElNRV9TRVQsICAgICAvLyBtX3N0YXJ0VGltZSB3
YXMgc2V0Ci0gICAgICAgIFNUQVRFX0lOUFVUX0xPT1BfVElNRVJfRklSRUQsICAgLy8gbG9vcCB0
aW1lciBmaXJlZAotICAgICAgICBTVEFURV9JTlBVVF9FTkRfVElNRVJfRklSRUQsICAgIC8vIGVu
ZCB0aW1lciBmaXJlZAotICAgICAgICBTVEFURV9JTlBVVF9QQVVTRV9PVkVSUklERSwgICAgIC8v
IHBhdXNlIGFuIGFuaW1hdGlvbiBkdWUgdG8gb3ZlcnJpZGUKLSAgICAgICAgU1RBVEVfSU5QVVRf
UkVTVU1FX09WRVJSSURFLCAgICAvLyByZXN1bWUgYW4gb3ZlcnJpZGRlbiBhbmltYXRpb24KLSAg
ICAgICAgU1RBVEVfSU5QVVRfUExBWV9TVEFURV9SVU5OSU5HLCAvLyBwbGF5IHN0YXRlIHBhdXNl
ZCAtPiBydW5uaW5nCi0gICAgICAgIFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUEFVU0VELCAgLy8g
cGxheSBzdGF0ZSBydW5uaW5nIC0+IHBhdXNlZAotICAgICAgICBTVEFURV9JTlBVVF9FTkRfQU5J
TUFUSU9OICAgICAgIC8vIGZvcmNlIGFuIGVuZCBmcm9tIGFueSBzdGF0ZQotICAgIH07Ci0gICAg
Ci0gICAgLy8gQ2FsbGVkIHdoZW4gYW5pbWF0aW9uIGlzIGluIE5FVyBzdGF0ZSB0byBzdGFydCBh
bmltYXRpb24KLSAgICB2b2lkIHVwZGF0ZVN0YXRlTWFjaGluZShBbmltU3RhdGVJbnB1dCBpbnB1
dCwgZG91YmxlIHBhcmFtKTsKLSAgICAKLSAgICAvLyBBbmltYXRpb24gaGFzIGFjdHVhbGx5IHN0
YXJ0ZWQsIGF0IHBhc3NlZCB0aW1lCi0gICAgdm9pZCBvbkFuaW1hdGlvblN0YXJ0UmVzcG9uc2Uo
ZG91YmxlIHN0YXJ0VGltZSk7Ci0gICAgCi0gICAgLy8gQ2FsbGVkIHRvIGNoYW5nZSB0byBvciBm
cm9tIHBhdXNlZCBzdGF0ZQotICAgIHZvaWQgdXBkYXRlUGxheVN0YXRlKGJvb2wgcnVubmluZyk7
Ci0gICAgYm9vbCBwbGF5U3RhdGVQbGF5aW5nKCkgY29uc3QgeyByZXR1cm4gbV9hbmltYXRpb24g
JiYgbV9hbmltYXRpb24tPnBsYXlTdGF0ZSgpID09IEFuaW1QbGF5U3RhdGVQbGF5aW5nOyB9Ci0g
ICAgCi0gICAgYm9vbCB3YWl0aW5nVG9TdGFydCgpIGNvbnN0IHsgcmV0dXJuIG1fYW5pbVN0YXRl
ID09IFNUQVRFX05FVyB8fCBtX2FuaW1TdGF0ZSA9PSBTVEFURV9TVEFSVF9XQUlUX1RJTUVSOyB9
Ci0gICAgYm9vbCBwcmVhY3RpdmUoKSBjb25zdAotICAgIHsgcmV0dXJuIG1fYW5pbVN0YXRlID09
IFNUQVRFX05FVyB8fAotICAgICAgICAgICAgIG1fYW5pbVN0YXRlID09IFNUQVRFX1NUQVJUX1dB
SVRfVElNRVIgfHwKLSAgICAgICAgICAgICBtX2FuaW1TdGF0ZSA9PSBTVEFURV9TVEFSVF9XQUlU
X1NUWUxFX0FWQUlMQUJMRSB8fAotICAgICAgICAgICAgIG1fYW5pbVN0YXRlID09IFNUQVRFX1NU
QVJUX1dBSVRfUkVTUE9OU0U7Ci0gICAgfQotICAgIGJvb2wgcG9zdGFjdGl2ZSgpIGNvbnN0IHsg
cmV0dXJuIG1fYW5pbVN0YXRlID09IFNUQVRFX0RPTkU7IH0KLSAgICBib29sIGFjdGl2ZSgpIGNv
bnN0IHsgcmV0dXJuICFwb3N0YWN0aXZlKCkgJiYgIXByZWFjdGl2ZSgpOyB9Ci0gICAgYm9vbCBy
dW5uaW5nKCkgY29uc3QgeyByZXR1cm4gIWlzbmV3KCkgJiYgIXBvc3RhY3RpdmUoKTsgfQotICAg
IGJvb2wgcGF1c2VkKCkgY29uc3QgeyByZXR1cm4gbV9wYXVzZVRpbWUgPj0gMDsgfQotICAgIGJv
b2wgaXNuZXcoKSBjb25zdCB7IHJldHVybiBtX2FuaW1TdGF0ZSA9PSBTVEFURV9ORVc7IH0KLSAg
ICBib29sIHdhaXRpbmdGb3JTdGFydFRpbWUoKSBjb25zdCB7IHJldHVybiBtX2FuaW1TdGF0ZSA9
PSBTVEFURV9TVEFSVF9XQUlUX1JFU1BPTlNFOyB9Ci0gICAgYm9vbCB3YWl0aW5nRm9yU3R5bGVB
dmFpbGFibGUoKSBjb25zdCB7IHJldHVybiBtX2FuaW1TdGF0ZSA9PSBTVEFURV9TVEFSVF9XQUlU
X1NUWUxFX0FWQUlMQUJMRTsgfQotICAgIGJvb2wgd2FpdGluZ0ZvckVuZEV2ZW50KCkgY29uc3Qg
IHsgcmV0dXJuIG1fd2FpdGluZ0ZvckVuZEV2ZW50OyB9Ci0gICAgCi0gICAgLy8gImFuaW1hdGlu
ZyIgbWVhbnMgdGhhdCBzb21ldGhpbmcgaXMgcnVubmluZyB0aGF0IHJlcXVpcmVzIGEgdGltZXIg
dG8ga2VlcCBmaXJpbmcKLSAgICAvLyAoZS5nLiBhIHNvZnR3YXJlIGFuaW1hdGlvbikKLSAgICB2
b2lkIHNldEFuaW1hdGluZyhib29sIGluQW5pbWF0aW5nID0gdHJ1ZSkgeyBtX2FuaW1hdGluZyA9
IGluQW5pbWF0aW5nOyB9Ci0gICAgYm9vbCBhbmltYXRpbmcoKSBjb25zdCB7IHJldHVybiBtX2Fu
aW1hdGluZzsgfQotICAgIAotICAgIGRvdWJsZSBwcm9ncmVzcyhkb3VibGUgc2NhbGUsIGRvdWJs
ZSBvZmZzZXQpIGNvbnN0OwotICAgIAotICAgIHZpcnR1YWwgdm9pZCBhbmltYXRlKENvbXBvc2l0
ZUFuaW1hdGlvbiosIFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5
bGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRlclN0eWxlKiB0YXJnZXRT
dHlsZSwgUmVuZGVyU3R5bGUqJiBhbmltYXRlZFN0eWxlKSB7IH0KLSAgICB2aXJ0dWFsIHZvaWQg
cmVzZXQoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5bGUqIGZyb20gPSAw
LCBjb25zdCBSZW5kZXJTdHlsZSogdG8gPSAwKSB7IH0KLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wg
c2hvdWxkRmlyZUV2ZW50cygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgCi0gICAgdm9p
ZCBhbmltYXRpb25UaW1lckNhbGxiYWNrRmlyZWQoY29uc3QgQXRvbWljU3RyaW5nJiBldmVudFR5
cGUsIGRvdWJsZSBlbGFwc2VkVGltZSk7Ci0gICAgdm9pZCBhbmltYXRpb25FdmVudERpc3BhdGNo
ZXJGaXJlZChFbGVtZW50KiBlbGVtZW50LCBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUsIGludCBw
cm9wZXJ0eSwgYm9vbCByZXNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnN0IEF0b21pY1N0cmluZyYgZXZlbnRUeXBlLCBkb3VibGUgZWxhcHNlZFRpbWUpOwot
ICAgIAotICAgIGJvb2wgYW5pbWF0aW9uc01hdGNoKGNvbnN0IEFuaW1hdGlvbiogYW5pbSkgY29u
c3QgeyByZXR1cm4gbV9hbmltYXRpb24tPmFuaW1hdGlvbnNNYXRjaChhbmltKTsgfQotICAgIAot
ICAgIHZvaWQgc2V0QW5pbWF0aW9uKGNvbnN0IEFuaW1hdGlvbiogYW5pbSkgeyBtX2FuaW1hdGlv
biA9IGNvbnN0X2Nhc3Q8QW5pbWF0aW9uKj4oYW5pbSk7IH0KLSAgICAKLSAgICAvLyBSZXR1cm4g
dHJ1ZSBpZiB0aGlzIGFuaW1hdGlvbiBpcyBvdmVycmlkZGVuLiBUaGlzIHdpbGwgb25seSBiZSB0
aGUgY2FzZSBmb3IKLSAgICAvLyBJbXBsaWNpdEFuaW1hdGlvbnMgYW5kIGlzIHVzZWQgdG8gZGV0
ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBmb3JjZQotICAgIC8vIHNldCB0aGUgc3Rh
cnQgdGltZS4gSWYgYW4gYW5pbWF0aW9uIGlzIG92ZXJyaWRkZW4sIGl0IHdpbGwgcHJvYmFibHkg
bm90IGdldAotICAgIC8vIGJhY2sgdGhlIFNUQVJUX1RJTUUgZXZlbnQuCi0gICAgdmlydHVhbCBi
b29sIG92ZXJyaWRkZW4oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIAotICAgIC8vIERv
ZXMgdGhpcyBhbmltYXRpb24vdHJhbnNpdGlvbiBpbnZvbHZlIHRoZSBnaXZlbiBwcm9wZXJ0eT8K
LSAgICB2aXJ0dWFsIGJvb2wgYWZmZWN0c1Byb3BlcnR5KGludCBwcm9wZXJ0eSkgY29uc3QgeyBy
ZXR1cm4gZmFsc2U7IH0KLSAgICBib29sIGlzQW5pbWF0aW5nUHJvcGVydHkoaW50IHByb3BlcnR5
LCBib29sIGlzUnVubmluZ05vdykgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChpc1J1bm5pbmdO
b3cpCi0gICAgICAgICAgICByZXR1cm4gKCF3YWl0aW5nVG9TdGFydCgpICYmICFwb3N0YWN0aXZl
KCkpICYmIGFmZmVjdHNQcm9wZXJ0eShwcm9wZXJ0eSk7Ci0KLSAgICAgICAgcmV0dXJuICFwb3N0
YWN0aXZlKCkgJiYgYWZmZWN0c1Byb3BlcnR5KHByb3BlcnR5KTsKLSAgICB9Ci0gICAgICAgIAot
cHJvdGVjdGVkOgotICAgIEVsZW1lbnQqIGVsZW1lbnRGb3JFdmVudERpc3BhdGNoKCkKLSAgICB7
Ci0gICAgICAgIGlmIChtX29iamVjdC0+bm9kZSgpICYmIG1fb2JqZWN0LT5ub2RlKCktPmlzRWxl
bWVudE5vZGUoKSkKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obV9v
YmplY3QtPm5vZGUoKSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICB2aXJ0
dWFsIHZvaWQgb3ZlcnJpZGVBbmltYXRpb25zKCkgeyB9Ci0gICAgdmlydHVhbCB2b2lkIHJlc3Vt
ZU92ZXJyaWRkZW5BbmltYXRpb25zKCkgeyB9Ci0gICAgCi0gICAgQ29tcG9zaXRlQW5pbWF0aW9u
KiBjb21wb3NpdGVBbmltYXRpb24oKSB7IHJldHVybiBtX2NvbXBBbmltOyB9Ci0gICAgCi0gICAg
Ly8gVGhlc2UgYXJlIGNhbGxlZCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIHRpbWVyIGZpcmVzIHNv
IHN1YmNsYXNzZXMgY2FuIGRvIGFueSBleHRyYSB3b3JrCi0gICAgdmlydHVhbCB2b2lkIG9uQW5p
bWF0aW9uU3RhcnQoZG91YmxlIGVsYXBzZWRUaW1lKSB7IH0KLSAgICB2aXJ0dWFsIHZvaWQgb25B
bmltYXRpb25JdGVyYXRpb24oZG91YmxlIGVsYXBzZWRUaW1lKSB7IH0KLSAgICB2aXJ0dWFsIHZv
aWQgb25BbmltYXRpb25FbmQoZG91YmxlIGVsYXBzZWRUaW1lKSB7IH0KLSAgICB2aXJ0dWFsIGJv
b2wgc3RhcnRBbmltYXRpb24oZG91YmxlIGJlZ2luVGltZSkgeyByZXR1cm4gZmFsc2U7IH0KLSAg
ICB2aXJ0dWFsIHZvaWQgZW5kQW5pbWF0aW9uKGJvb2wgcmVzZXQpIHsgfQotICAgIAotICAgIHZv
aWQgcHJpbWVFdmVudFRpbWVycygpOwotICAgIAotcHJvdGVjdGVkOgotICAgIEFuaW1TdGF0ZSBt
X2FuaW1TdGF0ZTsKLSAgICBpbnQgbV9pdGVyYXRpb247Ci0gICAgCi0gICAgYm9vbCBtX2FuaW1h
dGluZzsgICAgICAgLy8gdHJhbnNpdGlvbi9hbmltYXRpb24gcmVxdWlyZXMgY29udGludWFsIHRp
bWVyIGZpcmluZwotICAgIGJvb2wgbV93YWl0ZWRGb3JSZXNwb25zZTsKLSAgICBkb3VibGUgbV9z
dGFydFRpbWU7Ci0gICAgZG91YmxlIG1fcGF1c2VUaW1lOwotICAgIFJlbmRlck9iamVjdCogbV9v
YmplY3Q7Ci0gICAgCi0gICAgQW5pbWF0aW9uVGltZXJDYWxsYmFjayBtX2FuaW1hdGlvblRpbWVy
Q2FsbGJhY2s7Ci0gICAgQW5pbWF0aW9uRXZlbnREaXNwYXRjaGVyIG1fYW5pbWF0aW9uRXZlbnRE
aXNwYXRjaGVyOwotICAgIFJlZlB0cjxBbmltYXRpb24+IG1fYW5pbWF0aW9uOwotICAgIENvbXBv
c2l0ZUFuaW1hdGlvbiogbV9jb21wQW5pbTsKLSAgICBib29sIG1fd2FpdGluZ0ZvckVuZEV2ZW50
OwotfTsKLQotLy8gQW4gSW1wbGljaXRBbmltYXRpb24gdHJhY2tzIHRoZSBzdGF0ZSBvZiBhIHRy
YW5zaXRpb24gb2YgYSBzcGVjaWZpYyBDU1MgcHJvcGVydHkKLS8vIGZvciBhIHNpbmdsZSBSZW5k
ZXJPYmplY3QuCi1jbGFzcyBJbXBsaWNpdEFuaW1hdGlvbiA6IHB1YmxpYyBBbmltYXRpb25CYXNl
IHsKLXB1YmxpYzoKLSAgICBJbXBsaWNpdEFuaW1hdGlvbihjb25zdCBBbmltYXRpb24qIHRyYW5z
aXRpb24sIGludCBhbmltYXRpbmdQcm9wZXJ0eSwgUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgQ29t
cG9zaXRlQW5pbWF0aW9uKiBjb21wQW5pbSkKLSAgICA6IEFuaW1hdGlvbkJhc2UodHJhbnNpdGlv
biwgcmVuZGVyZXIsIGNvbXBBbmltKQotICAgICwgbV90cmFuc2l0aW9uUHJvcGVydHkodHJhbnNp
dGlvbi0+cHJvcGVydHkoKSkKLSAgICAsIG1fYW5pbWF0aW5nUHJvcGVydHkoYW5pbWF0aW5nUHJv
cGVydHkpCi0gICAgLCBtX292ZXJyaWRkZW4oZmFsc2UpCi0gICAgLCBtX2Zyb21TdHlsZSgwKQot
ICAgICwgbV90b1N0eWxlKDApCi0gICAgewotICAgICAgICBBU1NFUlQoYW5pbWF0aW5nUHJvcGVy
dHkgIT0gY0FuaW1hdGVBbGwpOwotICAgIH0KLSAgICAKLSAgICB2aXJ0dWFsIH5JbXBsaWNpdEFu
aW1hdGlvbigpCi0gICAgewotICAgICAgICBBU1NFUlQoIW1fZnJvbVN0eWxlICYmICFtX3RvU3R5
bGUpOwotICAgICAgICAKLSAgICAgICAgLy8gSWYgd2Ugd2VyZSB3YWl0aW5nIGZvciBhbiBlbmQg
ZXZlbnQsIHdlIG5lZWQgdG8gZmluaXNoIHRoZSBhbmltYXRpb24gdG8gbWFrZSBzdXJlIG5vIG9s
ZAotICAgICAgICAvLyBhbmltYXRpb25zIHN0aWNrIGFyb3VuZCBpbiB0aGUgbG93ZXIgbGV2ZWxz
Ci0gICAgICAgIGlmICh3YWl0aW5nRm9yRW5kRXZlbnQoKSAmJiBtX29iamVjdCkKLSAgICAgICAg
ICAgIEFTU0VSVCgwKTsKLSAgICAgICAgCi0gICAgICAgIC8vIERvIHRoZSBjbGVhbnVwIGhlcmUg
aW5zdGVhZCBvZiBpbiB0aGUgYmFzZSBjbGFzcyBzbyB0aGUgc3BlY2lhbGl6ZWQgbWV0aG9kcyBn
ZXQgY2FsbGVkCi0gICAgICAgIGlmICghcG9zdGFjdGl2ZSgpKQotICAgICAgICAgICAgdXBkYXRl
U3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVUX0VORF9BTklNQVRJT04sIC0xKTsgICAgIAotICAgIH0K
LSAgICAKLSAgICBpbnQgdHJhbnNpdGlvblByb3BlcnR5KCkgY29uc3QgeyByZXR1cm4gbV90cmFu
c2l0aW9uUHJvcGVydHk7IH0KLSAgICBpbnQgYW5pbWF0aW5nUHJvcGVydHkoKSBjb25zdCB7IHJl
dHVybiBtX2FuaW1hdGluZ1Byb3BlcnR5OyB9Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkIG9uQW5p
bWF0aW9uRW5kKGRvdWJsZSBpbkVsYXBzZWRUaW1lKTsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQg
YW5pbWF0ZShDb21wb3NpdGVBbmltYXRpb24qLCBSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJT
dHlsZSogY3VycmVudFN0eWxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZW5k
ZXJTdHlsZSogdGFyZ2V0U3R5bGUsIFJlbmRlclN0eWxlKiYgYW5pbWF0ZWRTdHlsZSk7Ci0gICAg
dmlydHVhbCB2b2lkIHJlc2V0KFJlbmRlck9iamVjdCogcmVuZGVyZXIsIGNvbnN0IFJlbmRlclN0
eWxlKiBmcm9tID0gMCwgY29uc3QgUmVuZGVyU3R5bGUqIHRvID0gMCk7Ci0gICAgCi0gICAgdm9p
ZCBzZXRPdmVycmlkZGVuKGJvb2wgYik7Ci0gICAgdmlydHVhbCBib29sIG92ZXJyaWRkZW4oKSBj
b25zdCB7IHJldHVybiBtX292ZXJyaWRkZW47IH0KLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wgc2hv
dWxkRmlyZUV2ZW50cygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICAKLSAgICB2aXJ0dWFs
IGJvb2wgYWZmZWN0c1Byb3BlcnR5KGludCBwcm9wZXJ0eSkgY29uc3Q7Ci0gICAgCi0gICAgYm9v
bCBoYXNTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fZnJvbVN0eWxlICYmIG1fdG9TdHlsZTsgfQot
ICAgIAotICAgIGJvb2wgaXNUYXJnZXRQcm9wZXJ0eUVxdWFsKGludCBwcm9wLCBjb25zdCBSZW5k
ZXJTdHlsZSogdGFyZ2V0U3R5bGUpOwotCi0gICAgdm9pZCBibGVuZFByb3BlcnR5VmFsdWVJblN0
eWxlKGludCBwcm9wLCBSZW5kZXJTdHlsZSogY3VycmVudFN0eWxlKTsKLSAgICAKLXByb3RlY3Rl
ZDoKLSAgICBib29sIHNob3VsZFNlbmRFdmVudEZvckxpc3RlbmVyKERvY3VtZW50OjpMaXN0ZW5l
clR5cGUgaW5MaXN0ZW5lclR5cGUpCi0gICAgewotICAgICAgICByZXR1cm4gbV9vYmplY3QtPmRv
Y3VtZW50KCktPmhhc0xpc3RlbmVyVHlwZShpbkxpc3RlbmVyVHlwZSk7Ci0gICAgfQotICAgIAot
ICAgIGJvb2wgc2VuZFRyYW5zaXRpb25FdmVudChjb25zdCBBdG9taWNTdHJpbmcmIGluRXZlbnRU
eXBlLCBkb3VibGUgaW5FbGFwc2VkVGltZSk7Ci0gICAgCi1wcml2YXRlOgotICAgIGludCBtX3Ry
YW5zaXRpb25Qcm9wZXJ0eTsgICAvLyBUcmFuc2l0aW9uIHByb3BlcnR5IGFzIHNwZWNpZmllZCBp
biB0aGUgUmVuZGVyU3R5bGUuIE1heSBiZSBjQW5pbWF0ZUFsbAotICAgIGludCBtX2FuaW1hdGlu
Z1Byb3BlcnR5OyAgICAvLyBTcGVjaWZpYyBwcm9wZXJ0eSBmb3IgdGhpcyBJbXBsaWNpdEFuaW1h
dGlvbgotICAgIGJvb2wgbV9vdmVycmlkZGVuOyAgICAgICAgICAvLyB0cnVlIHdoZW4gdGhlcmUg
aXMgYSBrZXlmcmFtZSBhbmltYXRpb24gdGhhdCBvdmVycmlkZXMgdGhlIHRyYW5zaXRpb25pbmcg
cHJvcGVydHkKLSAgICAKLSAgICAvLyBUaGUgdHdvIHN0eWxlcyB0aGF0IHdlIGFyZSBibGVuZGlu
Zy4KLSAgICBSZW5kZXJTdHlsZSogbV9mcm9tU3R5bGU7Ci0gICAgUmVuZGVyU3R5bGUqIG1fdG9T
dHlsZTsKLX07Ci0KLXZvaWQgQW5pbWF0aW9uVGltZXJDYWxsYmFjazo6dGltZXJGaXJlZChUaW1l
cjxBbmltYXRpb25UaW1lckJhc2U+KikKLXsKLSAgICBtX2FuaW0tPmFuaW1hdGlvblRpbWVyQ2Fs
bGJhY2tGaXJlZChtX2V2ZW50VHlwZSwgbV9lbGFwc2VkVGltZSk7Ci19Ci0KLXZvaWQgQW5pbWF0
aW9uRXZlbnREaXNwYXRjaGVyOjp0aW1lckZpcmVkKFRpbWVyPEFuaW1hdGlvblRpbWVyQmFzZT4q
KQotewotICAgIG1fYW5pbS0+YW5pbWF0aW9uRXZlbnREaXNwYXRjaGVyRmlyZWQobV9lbGVtZW50
LmdldCgpLCBtX25hbWUsIG1fcHJvcGVydHksIG1fcmVzZXQsIG1fZXZlbnRUeXBlLCBtX2VsYXBz
ZWRUaW1lKTsKLX0KLQotLy8gQW4gS2V5ZnJhbWVBbmltYXRpb24gdHJhY2tzIHRoZSBzdGF0ZSBv
ZiBhbiBleHBsaWNpdCBhbmltYXRpb24KLS8vIGZvciBhIHNpbmdsZSBSZW5kZXJPYmplY3QuCi1j
bGFzcyBLZXlmcmFtZUFuaW1hdGlvbiA6IHB1YmxpYyBBbmltYXRpb25CYXNlIHsKLXB1YmxpYzoK
LSAgICBLZXlmcmFtZUFuaW1hdGlvbihjb25zdCBBbmltYXRpb24qIGFuaW1hdGlvbiwgUmVuZGVy
T2JqZWN0KiByZW5kZXJlciwgaW50IGluZGV4LCBDb21wb3NpdGVBbmltYXRpb24qIGNvbXBBbmlt
KQotICAgIDogQW5pbWF0aW9uQmFzZShhbmltYXRpb24sIHJlbmRlcmVyLCBjb21wQW5pbSkKLSAg
ICAsIG1fa2V5ZnJhbWVzKGFuaW1hdGlvbi0+a2V5ZnJhbWVMaXN0KCkpCi0gICAgLCBtX25hbWUo
YW5pbWF0aW9uLT5uYW1lKCkpCi0gICAgLCBtX2luZGV4KGluZGV4KQotICAgIHsKLSAgICB9Ci0K
LSAgICB2aXJ0dWFsIH5LZXlmcmFtZUFuaW1hdGlvbigpCi0gICAgewotICAgICAgICAvLyBEbyB0
aGUgY2xlYW51cCBoZXJlIGluc3RlYWQgb2YgaW4gdGhlIGJhc2UgY2xhc3Mgc28gdGhlIHNwZWNp
YWxpemVkIG1ldGhvZHMgZ2V0IGNhbGxlZAotICAgICAgICBpZiAoIXBvc3RhY3RpdmUoKSkKLSAg
ICAgICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFURV9JTlBVVF9FTkRfQU5JTUFUSU9OLCAt
MSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIGFuaW1hdGUoQ29tcG9zaXRlQW5pbWF0aW9u
KiwgUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyU3R5bGUqIGN1cnJlbnRTdHlsZSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUsIFJlbmRl
clN0eWxlKiYgYW5pbWF0ZWRTdHlsZSk7Ci0KLSAgICB2b2lkIHNldE5hbWUoY29uc3QgU3RyaW5n
JiBzKSB7IG1fbmFtZSA9IHM7IH0KLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUoKSBjb25z
dCB7IHJldHVybiBtX25hbWU7IH0KLSAgICBpbnQgaW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2lu
ZGV4OyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkRmlyZUV2ZW50cygpIGNvbnN0IHsgcmV0
dXJuIHRydWU7IH0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBvbkFuaW1hdGlvblN0
YXJ0KGRvdWJsZSBpbkVsYXBzZWRUaW1lKTsKLSAgICB2aXJ0dWFsIHZvaWQgb25BbmltYXRpb25J
dGVyYXRpb24oZG91YmxlIGluRWxhcHNlZFRpbWUpOwotICAgIHZpcnR1YWwgdm9pZCBvbkFuaW1h
dGlvbkVuZChkb3VibGUgaW5FbGFwc2VkVGltZSk7Ci0gICAgdmlydHVhbCB2b2lkIGVuZEFuaW1h
dGlvbihib29sIHJlc2V0KTsKLQotICAgIHZpcnR1YWwgdm9pZCBvdmVycmlkZUFuaW1hdGlvbnMo
KTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVzdW1lT3ZlcnJpZGRlbkFuaW1hdGlvbnMoKTsKLSAgICAK
LSAgICBib29sIHNob3VsZFNlbmRFdmVudEZvckxpc3RlbmVyKERvY3VtZW50OjpMaXN0ZW5lclR5
cGUgaW5MaXN0ZW5lclR5cGUpCi0gICAgewotICAgICAgICByZXR1cm4gbV9vYmplY3QtPmRvY3Vt
ZW50KCktPmhhc0xpc3RlbmVyVHlwZShpbkxpc3RlbmVyVHlwZSk7Ci0gICAgfQotICAgIAotICAg
IGJvb2wgc2VuZEFuaW1hdGlvbkV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyYgaW5FdmVudFR5cGUs
IGRvdWJsZSBpbkVsYXBzZWRUaW1lKTsKLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wgYWZmZWN0c1By
b3BlcnR5KGludCBwcm9wZXJ0eSkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgLy8gVGhlIGtleWZy
YW1lcyB0aGF0IHdlIGFyZSBibGVuZGluZy4KLSAgICBSZWZQdHI8S2V5ZnJhbWVMaXN0PiBtX2tl
eWZyYW1lczsKLSAgICBBdG9taWNTdHJpbmcgbV9uYW1lOwotICAgIC8vIFRoZSBvcmRlciBpbiB3
aGljaCB0aGlzIGFuaW1hdGlvbiBhcHBlYXJzIGluIHRoZSBhbmltYXRpb24tbmFtZSBzdHlsZS4K
LSAgICBpbnQgbV9pbmRleDsKLX07Ci0KLUFuaW1hdGlvbkJhc2U6OkFuaW1hdGlvbkJhc2UoY29u
c3QgQW5pbWF0aW9uKiB0cmFuc2l0aW9uLCBSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBDb21wb3Np
dGVBbmltYXRpb24qIGNvbXBBbmltKQotOiBtX2FuaW1TdGF0ZShTVEFURV9ORVcpCi0sIG1faXRl
cmF0aW9uKDApCi0sIG1fYW5pbWF0aW5nKGZhbHNlKQotLCBtX3dhaXRlZEZvclJlc3BvbnNlKGZh
bHNlKQotLCBtX3N0YXJ0VGltZSgwKQotLCBtX3BhdXNlVGltZSgtMSkKLSwgbV9vYmplY3QocmVu
ZGVyZXIpCi0sIG1fYW5pbWF0aW9uVGltZXJDYWxsYmFjayhjb25zdF9jYXN0PEFuaW1hdGlvbkJh
c2UqPih0aGlzKSkKLSwgbV9hbmltYXRpb25FdmVudERpc3BhdGNoZXIoY29uc3RfY2FzdDxBbmlt
YXRpb25CYXNlKj4odGhpcykpCi0sIG1fYW5pbWF0aW9uKGNvbnN0X2Nhc3Q8QW5pbWF0aW9uKj4o
dHJhbnNpdGlvbikpCi0sIG1fY29tcEFuaW0oY29tcEFuaW0pCi0sIG1fd2FpdGluZ0ZvckVuZEV2
ZW50KGZhbHNlKQotewotfQotCi12b2lkIEFuaW1hdGlvbkJhc2U6OnVwZGF0ZVN0YXRlTWFjaGlu
ZShBbmltU3RhdGVJbnB1dCBpbnB1dCwgZG91YmxlIHBhcmFtKQotewotICAgIC8vIElmIHdlIGdl
dCBhIFJFU1RBUlQgdGhlbiB3ZSBmb3JjZSBhIG5ldyBhbmltYXRpb24sIHJlZ2FyZGxlc3Mgb2Yg
c3RhdGUKLSAgICBpZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfTUFLRV9ORVcpIHsKLSAgICAgICAg
aWYgKG1fYW5pbVN0YXRlID09IFNUQVRFX1NUQVJUX1dBSVRfU1RZTEVfQVZBSUxBQkxFKQotICAg
ICAgICAgICAgbV9jb21wQW5pbS0+c2V0V2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKGZhbHNlKTsK
LSAgICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9ORVc7Ci0gICAgICAgIG1fc3RhcnRUaW1lID0g
MDsKLSAgICAgICAgbV9wYXVzZVRpbWUgPSAtMTsKLSAgICAgICAgbV93YWl0ZWRGb3JSZXNwb25z
ZSA9IGZhbHNlOwotICAgICAgICBlbmRBbmltYXRpb24oZmFsc2UpOwotICAgICAgICByZXR1cm47
Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0ID09IFNUQVRFX0lOUFVUX1JFU1RBUlRfQU5JTUFU
SU9OKSB7Ci0gICAgICAgIGNhbmNlbFRpbWVycygpOwotICAgICAgICBpZiAobV9hbmltU3RhdGUg
PT0gU1RBVEVfU1RBUlRfV0FJVF9TVFlMRV9BVkFJTEFCTEUpCi0gICAgICAgICAgICBtX2NvbXBB
bmltLT5zZXRXYWl0aW5nRm9yU3R5bGVBdmFpbGFibGUoZmFsc2UpOwotICAgICAgICBtX2FuaW1T
dGF0ZSA9IFNUQVRFX05FVzsKLSAgICAgICAgbV9zdGFydFRpbWUgPSAwOwotICAgICAgICBtX3Bh
dXNlVGltZSA9IC0xOwotICAgICAgICBlbmRBbmltYXRpb24oZmFsc2UpOwotICAgICAgICAKLSAg
ICAgICAgaWYgKCFwYXVzZWQoKSkKLSAgICAgICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFU
RV9JTlBVVF9TVEFSVF9BTklNQVRJT04sIC0xKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAg
ICBlbHNlIGlmIChpbnB1dCA9PSBTVEFURV9JTlBVVF9FTkRfQU5JTUFUSU9OKSB7Ci0gICAgICAg
IGNhbmNlbFRpbWVycygpOwotICAgICAgICBpZiAobV9hbmltU3RhdGUgPT0gU1RBVEVfU1RBUlRf
V0FJVF9TVFlMRV9BVkFJTEFCTEUpCi0gICAgICAgICAgICBtX2NvbXBBbmltLT5zZXRXYWl0aW5n
Rm9yU3R5bGVBdmFpbGFibGUoZmFsc2UpOwotICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX0RP
TkU7Ci0gICAgICAgIGVuZEFuaW1hdGlvbih0cnVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0K
LSAgICBlbHNlIGlmIChpbnB1dCA9PSBTVEFURV9JTlBVVF9QQVVTRV9PVkVSUklERSkgewotICAg
ICAgICBpZiAobV9hbmltU3RhdGUgPT0gU1RBVEVfU1RBUlRfV0FJVF9SRVNQT05TRSkgewotICAg
ICAgICAgICAgLy8gSWYgd2UgYXJlIGluIHRoZSBXQUlUX1JFU1BPTlNFIHN0YXRlLCB0aGUgYW5p
bWF0aW9uIHdpbGwgZ2V0IGNhbmNlbGVkIGJlZm9yZSAKLSAgICAgICAgICAgIC8vIHdlIGdldCBh
IHJlc3BvbnNlLCBzbyBtb3ZlIHRvIHRoZSBuZXh0IHN0YXRlCi0gICAgICAgICAgICBlbmRBbmlt
YXRpb24oZmFsc2UpOwotICAgICAgICAgICAgdXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVU
X1NUQVJUX1RJTUVfU0VULCBjdXJyZW50VGltZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1
cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0ID09IFNUQVRFX0lOUFVUX1JFU1VNRV9PVkVS
UklERSkgewotICAgICAgICBpZiAobV9hbmltU3RhdGUgPT0gU1RBVEVfTE9PUElORyB8fCBtX2Fu
aW1TdGF0ZSA9PSBTVEFURV9FTkRJTkcpIHsKLSAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBhbmlt
YXRpb24KLSAgICAgICAgICAgIHN0YXJ0QW5pbWF0aW9uKG1fc3RhcnRUaW1lKTsKLSAgICAgICAg
fQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIC8vIEV4ZWN1dGUgc3RhdGUgbWFj
aGluZQotICAgIHN3aXRjaChtX2FuaW1TdGF0ZSkgewotICAgICAgICBjYXNlIFNUQVRFX05FVzoK
LSAgICAgICAgICAgIEFTU0VSVChpbnB1dCA9PSBTVEFURV9JTlBVVF9TVEFSVF9BTklNQVRJT04g
fHwgaW5wdXQgPT0gU1RBVEVfSU5QVVRfUExBWV9TVEFURV9SVU5OSU5HIHx8IGlucHV0ID09IFNU
QVRFX0lOUFVUX1BMQVlfU1RBVEVfUEFVU0VEKTsKLSAgICAgICAgICAgIGlmIChpbnB1dCA9PSBT
VEFURV9JTlBVVF9TVEFSVF9BTklNQVRJT04gfHwgaW5wdXQgPT0gU1RBVEVfSU5QVVRfUExBWV9T
VEFURV9SVU5OSU5HKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBzdGFydCB0aW1lciB0
byB0aGUgaW5pdGlhbCBkZWxheSAoMCBpZiBubyBkZWxheSkKLSAgICAgICAgICAgICAgICBtX3dh
aXRlZEZvclJlc3BvbnNlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbV9hbmltU3RhdGUgPSBT
VEFURV9TVEFSVF9XQUlUX1RJTUVSOwotICAgICAgICAgICAgICAgIG1fYW5pbWF0aW9uVGltZXJD
YWxsYmFjay5zdGFydFRpbWVyKG1fYW5pbWF0aW9uLT5kZWxheSgpLCBFdmVudE5hbWVzOjp3ZWJr
aXRBbmltYXRpb25TdGFydEV2ZW50LCBtX2FuaW1hdGlvbi0+ZGVsYXkoKSk7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVEFURV9TVEFSVF9XQUlUX1RJ
TUVSOgotICAgICAgICAgICAgQVNTRVJUKGlucHV0ID09IFNUQVRFX0lOUFVUX1NUQVJUX1RJTUVS
X0ZJUkVEIHx8IGlucHV0ID09IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUEFVU0VEKTsKLSAgICAg
ICAgICAgIAotICAgICAgICAgICAgaWYgKGlucHV0ID09IFNUQVRFX0lOUFVUX1NUQVJUX1RJTUVS
X0ZJUkVEKSB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHBhcmFtID49IDApOwotICAgICAgICAg
ICAgICAgIC8vIFN0YXJ0IHRpbWVyIGhhcyBmaXJlZCwgdGVsbCB0aGUgYW5pbWF0aW9uIHRvIHN0
YXJ0IGFuZCB3YWl0IGZvciBpdCB0byByZXNwb25kIHdpdGggc3RhcnQgdGltZQotICAgICAgICAg
ICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfU1RBUlRfV0FJVF9TVFlMRV9BVkFJTEFCTEU7Ci0g
ICAgICAgICAgICAgICAgbV9jb21wQW5pbS0+c2V0V2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKHRy
dWUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIFRyaWdnZXIgYSByZW5k
ZXIgc28gd2UgY2FuIHN0YXJ0IHRoZSBhbmltYXRpb24KLSAgICAgICAgICAgICAgICBzZXRDaGFu
Z2VkKG1fb2JqZWN0LT5lbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIG1fb2JqZWN0LT5hbmlt
YXRpb24oKS0+c3RhcnRVcGRhdGVSZW5kZXJpbmdEaXNwYXRjaGVyKCk7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQocnVubmluZygpKTsK
LSAgICAgICAgICAgICAgICAvLyBXZSdyZSB3YWl0aW5nIGZvciB0aGUgc3RhcnQgdGltZXIgdG8g
ZmlyZSBhbmQgd2UgZ290IGEgcGF1c2UuIENhbmNlbCB0aGUgdGltZXIsIHBhdXNlIGFuZCB3YWl0
Ci0gICAgICAgICAgICAgICAgbV9wYXVzZVRpbWUgPSBjdXJyZW50VGltZSgpOwotICAgICAgICAg
ICAgICAgIGNhbmNlbFRpbWVycygpOwotICAgICAgICAgICAgICAgIG1fYW5pbVN0YXRlID0gU1RB
VEVfUEFVU0VEX1dBSVRfVElNRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgY2FzZSBTVEFURV9TVEFSVF9XQUlUX1NUWUxFX0FWQUlMQUJMRToKLSAgICAgICAg
ICAgIEFTU0VSVChpbnB1dCA9PSBTVEFURV9JTlBVVF9TVFlMRV9BVkFJTEFCTEUgfHwgaW5wdXQg
PT0gU1RBVEVfSU5QVVRfUExBWV9TVEFURV9QQVVTRUQpOwotICAgICAgICAgICAgCi0gICAgICAg
ICAgICBtX2NvbXBBbmltLT5zZXRXYWl0aW5nRm9yU3R5bGVBdmFpbGFibGUoZmFsc2UpOwotICAg
ICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfU1RZTEVfQVZB
SUxBQkxFKSB7Ci0gICAgICAgICAgICAgICAgLy8gU3RhcnQgdGltZXIgaGFzIGZpcmVkLCB0ZWxs
IHRoZSBhbmltYXRpb24gdG8gc3RhcnQgYW5kIHdhaXQgZm9yIGl0IHRvIHJlc3BvbmQgd2l0aCBz
dGFydCB0aW1lCi0gICAgICAgICAgICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9TVEFSVF9XQUlU
X1JFU1BPTlNFOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG92ZXJyaWRlQW5p
bWF0aW9ucygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIFNlbmQgc3Rh
cnQgZXZlbnQsIGlmIG5lZWRlZAotICAgICAgICAgICAgICAgIG9uQW5pbWF0aW9uU3RhcnQoMC4w
Zik7IC8vIFRoZSBlbGFwc2VkVGltZSBpcyBhbHdheXMgMCBoZXJlCi0gICAgICAgICAgICAgICAg
Ci0gICAgICAgICAgICAgICAgLy8gU3RhcnQgdGhlIGFuaW1hdGlvbgotICAgICAgICAgICAgICAg
IGlmIChvdmVycmlkZGVuKCkgfHwgIXN0YXJ0QW5pbWF0aW9uKDApKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIC8vIFdlJ3JlIG5vdCBnb2luZyB0byBnZXQgYSBzdGFydFRpbWUgY2FsbGJhY2ssIHNv
IGZpcmUgdGhlIHN0YXJ0IHRpbWUgaGVyZQotICAgICAgICAgICAgICAgICAgICBtX2FuaW1TdGF0
ZSA9IFNUQVRFX1NUQVJUX1dBSVRfUkVTUE9OU0U7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0
ZVN0YXRlTWFjaGluZShTVEFURV9JTlBVVF9TVEFSVF9USU1FX1NFVCwgY3VycmVudFRpbWUoKSk7
Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAg
ICAgICAgbV93YWl0ZWRGb3JSZXNwb25zZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
ICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQocnVubmluZygpKTsKLSAgICAgICAg
ICAgICAgICAvLyBXZSdyZSB3YWl0aW5nIGZvciB0aGUgYSBub3RpZmljYXRpb24gdGhhdCB0aGUg
c3R5bGUgaGFzIGJlZW4gc2V0dXAuIElmIHdlJ3JlIGFza2VkIHRvIHdhaXQKLSAgICAgICAgICAg
ICAgICAvLyBhdCB0aGlzIHBvaW50LCB0aGUgc3R5bGUgbXVzdCBoYXZlIGJlZW4gcHJvY2Vzc2Vk
LCBzbyB3ZSBjYW4gZGVhbCB3aXRoIHRoaXMgbGlrZSB3ZSB3b3VsZAotICAgICAgICAgICAgICAg
IC8vIGZvciBXQUlUX1JFU1BPTlNFLCBleGNlcHQgdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFu
IGVuZEFuaW1hdGlvbigpLgotICAgICAgICAgICAgICAgIG1fcGF1c2VUaW1lID0gMDsKLSAgICAg
ICAgICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX1NUQVJUX1dBSVRfUkVTUE9OU0U7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVEFURV9TVEFSVF9X
QUlUX1JFU1BPTlNFOgotICAgICAgICAgICAgQVNTRVJUKGlucHV0ID09IFNUQVRFX0lOUFVUX1NU
QVJUX1RJTUVfU0VUIHx8IGlucHV0ID09IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUEFVU0VEKTsK
LSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGlucHV0ID09IFNUQVRFX0lOUFVUX1NUQVJU
X1RJTUVfU0VUKSB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHBhcmFtID49IDApOwotICAgICAg
ICAgICAgICAgIC8vIFdlIGhhdmUgYSBzdGFydCB0aW1lLCBzZXQgaXQsIHVubGVzcyB0aGUgc3Rh
cnRUaW1lIGlzIGFscmVhZHkgc2V0Ci0gICAgICAgICAgICAgICAgaWYgKG1fc3RhcnRUaW1lIDw9
IDApCi0gICAgICAgICAgICAgICAgICAgIG1fc3RhcnRUaW1lID0gcGFyYW07Ci0gICAgICAgICAg
ICAgICAgCi0gICAgICAgICAgICAgICAgLy8gRGVjaWRlIHdoZW4gdGhlIGVuZCBvciBsb29wIGV2
ZW50IG5lZWRzIHRvIGZpcmUKLSAgICAgICAgICAgICAgICBwcmltZUV2ZW50VGltZXJzKCk7Ci0g
ICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBhIHJlbmRlciBzbyB3
ZSBjYW4gc3RhcnQgdGhlIGFuaW1hdGlvbgotICAgICAgICAgICAgICAgIHNldENoYW5nZWQobV9v
YmplY3QtPmVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgbV9vYmplY3QtPmFuaW1hdGlvbigp
LT5zdGFydFVwZGF0ZVJlbmRlcmluZ0Rpc3BhdGNoZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBwYXVzaW5nIHdoaWxlIHdh
aXRpbmcgZm9yIGEgc3RhcnQgcmVzcG9uc2UuIENhbmNlbCB0aGUgYW5pbWF0aW9uIGFuZCB3YWl0
LiBXaGVuIAotICAgICAgICAgICAgICAgIC8vIHdlIHVucGF1c2UsIHdlIHdpbGwgYWN0IGFzIHRo
b3VnaCB0aGUgc3RhcnQgdGltZXIganVzdCBmaXJlZAotICAgICAgICAgICAgICAgIG1fcGF1c2VU
aW1lID0gMDsKLSAgICAgICAgICAgICAgICBlbmRBbmltYXRpb24oZmFsc2UpOwotICAgICAgICAg
ICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfUEFVU0VEX1dBSVRfUkVTUE9OU0U7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVEFURV9MT09QSU5HOgot
ICAgICAgICAgICAgQVNTRVJUKGlucHV0ID09IFNUQVRFX0lOUFVUX0xPT1BfVElNRVJfRklSRUQg
fHwgaW5wdXQgPT0gU1RBVEVfSU5QVVRfUExBWV9TVEFURV9QQVVTRUQpOwotICAgICAgICAgICAg
Ci0gICAgICAgICAgICBpZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfTE9PUF9USU1FUl9GSVJFRCkg
ewotICAgICAgICAgICAgICAgIEFTU0VSVChwYXJhbSA+PSAwKTsKLSAgICAgICAgICAgICAgICAv
LyBMb29wIHRpbWVyIGZpcmVkLCBsb29wIGFnYWluIG9yIGVuZC4KLSAgICAgICAgICAgICAgICBv
bkFuaW1hdGlvbkl0ZXJhdGlvbihwYXJhbSk7Ci0gICAgICAgICAgICAgICAgcHJpbWVFdmVudFRp
bWVycygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAg
ICAgLy8gV2UgYXJlIHBhdXNpbmcgd2hpbGUgcnVubmluZy4gQ2FuY2VsIHRoZSBhbmltYXRpb24g
YW5kIHdhaXQKLSAgICAgICAgICAgICAgICBtX3BhdXNlVGltZSA9IGN1cnJlbnRUaW1lKCk7Ci0g
ICAgICAgICAgICAgICAgY2FuY2VsVGltZXJzKCk7Ci0gICAgICAgICAgICAgICAgZW5kQW5pbWF0
aW9uKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX1BBVVNFRF9S
VU47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVEFU
RV9FTkRJTkc6Ci0gICAgICAgICAgICBBU1NFUlQoaW5wdXQgPT0gU1RBVEVfSU5QVVRfRU5EX1RJ
TUVSX0ZJUkVEIHx8IGlucHV0ID09IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUEFVU0VEKTsKLSAg
ICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGlucHV0ID09IFNUQVRFX0lOUFVUX0VORF9USU1F
Ul9GSVJFRCkgewotICAgICAgICAgICAgICAgIEFTU0VSVChwYXJhbSA+PSAwKTsKLSAgICAgICAg
ICAgICAgICAvLyBFbmQgdGltZXIgZmlyZWQsIGZpbmlzaCB1cAotICAgICAgICAgICAgICAgIG9u
QW5pbWF0aW9uRW5kKHBhcmFtKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBy
ZXN1bWVPdmVycmlkZGVuQW5pbWF0aW9ucygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAg
ICAgICAgIC8vIEZpcmUgb2ZmIGFub3RoZXIgc3R5bGUgY2hhbmdlIHNvIHdlIGNhbiBzZXQgdGhl
IGZpbmFsIHZhbHVlCi0gICAgICAgICAgICAgICAgc2V0Q2hhbmdlZChtX29iamVjdC0+ZWxlbWVu
dCgpKTsKLSAgICAgICAgICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX0RPTkU7Ci0gICAgICAg
ICAgICAgICAgbV9vYmplY3QtPmFuaW1hdGlvbigpLT5zdGFydFVwZGF0ZVJlbmRlcmluZ0Rpc3Bh
dGNoZXIoKTsKLSAgICAgICAgICAgICAgICAvLyB8dGhpc3wgbWF5IGJlIGRlbGV0ZWQgaGVyZSB3
aGVuIHdlJ3ZlIGJlZW4gY2FsbGVkIGZyb20gdGltZXJGaXJlZCgpCi0gICAgICAgICAgICB9Ci0g
ICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBhcmUgcGF1c2luZyB3aGls
ZSBydW5uaW5nLiBDYW5jZWwgdGhlIGFuaW1hdGlvbiBhbmQgd2FpdAotICAgICAgICAgICAgICAg
IG1fcGF1c2VUaW1lID0gY3VycmVudFRpbWUoKTsKLSAgICAgICAgICAgICAgICBjYW5jZWxUaW1l
cnMoKTsKLSAgICAgICAgICAgICAgICBlbmRBbmltYXRpb24oZmFsc2UpOwotICAgICAgICAgICAg
ICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfUEFVU0VEX1JVTjsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIC8vIHx0aGlzfCBtYXkgYmUgZGVsZXRlZCBoZXJlCi0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgY2FzZSBTVEFURV9QQVVTRURfV0FJVF9USU1FUjoKLSAgICAgICAgICAgIEFTU0VS
VChpbnB1dCA9PSBTVEFURV9JTlBVVF9QTEFZX1NUQVRFX1JVTk5JTkcpOwotICAgICAgICAgICAg
QVNTRVJUKCFydW5uaW5nKCkpOwotICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB0aW1lcwotICAg
ICAgICAgICAgbV9zdGFydFRpbWUgKz0gY3VycmVudFRpbWUoKSAtIG1fcGF1c2VUaW1lOwotICAg
ICAgICAgICAgbV9wYXVzZVRpbWUgPSAtMTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8g
d2Ugd2VyZSB3YWl0aW5nIGZvciB0aGUgc3RhcnQgdGltZXIgdG8gZmlyZSwgZ28gYmFjayBhbmQg
d2FpdCBhZ2FpbgotICAgICAgICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9ORVc7Ci0gICAgICAg
ICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUoU1RBVEVfSU5QVVRfU1RBUlRfQU5JTUFUSU9OLCAwKTsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRF9XQUlUX1JFU1BP
TlNFOgotICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRF9SVU46Ci0gICAgICAgICAgICAvLyBXZSB0
cmVhdCB0aGVzZSB0d28gY2FzZXMgdGhlIHNhbWUuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhh
dCwgd2hlbiB3ZSBhcmUgaW4gdGhlIFdBSVRfUkVTUE9OU0UKLSAgICAgICAgICAgIC8vIHN0YXRl
LCB3ZSBkb24ndCB5ZXQgaGF2ZSBhIHZhbGlkIHN0YXJ0VGltZSwgc28gd2Ugc2VuZCAwIHRvIHN0
YXJ0QW5pbWF0aW9uLiBXaGVuIHRoZSBTVEFSVF9USU1FCi0gICAgICAgICAgICAvLyBldmVudCBj
b21lcyBpbiBxbmQgd2Ugd2VyZSBpbiB0aGUgUlVOIHN0YXRlLCB3ZSB3aWxsIG5vdGljZSB0aGF0
IHdlIGhhdmUgYWxyZWFkeSBzZXQgdGhlIAotICAgICAgICAgICAgLy8gc3RhcnRUaW1lIGFuZCB3
aWxsIGlnbm9yZSBpdC4KLSAgICAgICAgICAgIEFTU0VSVChpbnB1dCA9PSBTVEFURV9JTlBVVF9Q
TEFZX1NUQVRFX1JVTk5JTkcpOwotICAgICAgICAgICAgQVNTRVJUKCFydW5uaW5nKCkpOwotICAg
ICAgICAgICAgLy8gVXBkYXRlIHRoZSB0aW1lcwotICAgICAgICAgICAgaWYgKG1fYW5pbVN0YXRl
ID09IFNUQVRFX1BBVVNFRF9SVU4pCi0gICAgICAgICAgICAgICAgbV9zdGFydFRpbWUgKz0gY3Vy
cmVudFRpbWUoKSAtIG1fcGF1c2VUaW1lOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAg
ICAgIG1fc3RhcnRUaW1lID0gMDsKLSAgICAgICAgICAgIG1fcGF1c2VUaW1lID0gLTE7Ci0gICAg
ICAgICAgICAKLSAgICAgICAgICAgIC8vIFdlIHdlcmUgd2FpdGluZyBmb3IgYSBiZWdpbiB0aW1l
IHJlc3BvbnNlIGZyb20gdGhlIGFuaW1hdGlvbiwgZ28gYmFjayBhbmQgd2FpdCBhZ2FpbgotICAg
ICAgICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9TVEFSVF9XQUlUX1JFU1BPTlNFOwotICAgICAg
ICAgICAgCi0gICAgICAgICAgICAvLyBTdGFydCB0aGUgYW5pbWF0aW9uCi0gICAgICAgICAgICBp
ZiAob3ZlcnJpZGRlbigpIHx8ICFzdGFydEFuaW1hdGlvbihtX3N0YXJ0VGltZSkpIHsKLSAgICAg
ICAgICAgICAgICAvLyBXZSdyZSBub3QgZ29pbmcgdG8gZ2V0IGEgc3RhcnRUaW1lIGNhbGxiYWNr
LCBzbyBmaXJlIHRoZSBzdGFydCB0aW1lIGhlcmUKLSAgICAgICAgICAgICAgICB1cGRhdGVTdGF0
ZU1hY2hpbmUoU1RBVEVfSU5QVVRfU1RBUlRfVElNRV9TRVQsIGN1cnJlbnRUaW1lKCkpOwotICAg
ICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1fd2FpdGVkRm9y
UmVzcG9uc2UgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RBVEVf
RE9ORToKLSAgICAgICAgICAgIC8vIFdlJ3JlIGRvbmUuIFN0YXkgaW4gdGhpcyBzdGF0ZSB1bnRp
bCB3ZSBhcmUgZGVsZXRlZAotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIC8vIHx0aGlz
fCBtYXkgYmUgZGVsZXRlZCBoZXJlIGlmIHdlIGNhbWUgb3V0IG9mIFNUQVRFX0VORElORyB3aGVu
IHdlJ3ZlIGJlZW4gY2FsbGVkIGZyb20gdGltZXJGaXJlZCgpCi19Ci0gICAgCi12b2lkIEFuaW1h
dGlvbkJhc2U6OmFuaW1hdGlvblRpbWVyQ2FsbGJhY2tGaXJlZChjb25zdCBBdG9taWNTdHJpbmcm
IGV2ZW50VHlwZSwgZG91YmxlIGVsYXBzZWRUaW1lKQotewotICAgIEFTU0VSVChtX29iamVjdC0+
ZG9jdW1lbnQoKSAmJiAhbV9vYmplY3QtPmRvY3VtZW50KCktPmluUGFnZUNhY2hlKCkpOwotICAg
IAotICAgIC8vIEZJWE1FOiB1c2UgYW4gZW51bQotICAgIGlmIChldmVudFR5cGUgPT0gRXZlbnRO
YW1lczo6d2Via2l0QW5pbWF0aW9uU3RhcnRFdmVudCkKLSAgICAgICAgdXBkYXRlU3RhdGVNYWNo
aW5lKFNUQVRFX0lOUFVUX1NUQVJUX1RJTUVSX0ZJUkVELCBlbGFwc2VkVGltZSk7Ci0gICAgZWxz
ZSBpZiAoZXZlbnRUeXBlID09IEV2ZW50TmFtZXM6OndlYmtpdEFuaW1hdGlvbkl0ZXJhdGlvbkV2
ZW50KQotICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUoU1RBVEVfSU5QVVRfTE9PUF9USU1FUl9G
SVJFRCwgZWxhcHNlZFRpbWUpOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBFdmVudE5hbWVz
Ojp3ZWJraXRBbmltYXRpb25FbmRFdmVudCkgewotICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUo
U1RBVEVfSU5QVVRfRU5EX1RJTUVSX0ZJUkVELCBlbGFwc2VkVGltZSk7Ci0gICAgICAgIC8vIHx0
aGlzfCBtYXkgYmUgZGVsZXRlZCBoZXJlCi0gICAgfQotfQotCi12b2lkIEFuaW1hdGlvbkJhc2U6
OmFuaW1hdGlvbkV2ZW50RGlzcGF0Y2hlckZpcmVkKEVsZW1lbnQqIGVsZW1lbnQsIGNvbnN0IEF0
b21pY1N0cmluZyYgbmFtZSwgaW50IHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlc2V0LCBjb25zdCBBdG9taWNTdHJpbmcm
IGV2ZW50VHlwZSwgZG91YmxlIGVsYXBzZWRUaW1lKQotewotICAgIG1fd2FpdGluZ0ZvckVuZEV2
ZW50ID0gZmFsc2U7Ci0gICAgCi0gICAgLy8gS2VlcCBhbiBhdG9taWMgc3RyaW5nIG9uIHRoZSBz
dGFjayB0byBrZWVwIGl0IGFsaXZlIHVudGlsIHdlIGV4aXQgdGhpcyBtZXRob2QKLSAgICAvLyAo
c2luY2UgZGlzcGF0Y2hpbmcgdGhlIGV2ZW50IG1heSBjYXVzZSB8dGhpc3wgdG8gYmUgZGVsZXRl
ZCwgdGhlcmVmb3JlIHJlbW92aW5nCi0gICAgLy8gdGhlIGxhc3QgcmVmIHRvIHRoZSBhdG9taWMg
c3RyaW5nKS4KLSAgICBBdG9taWNTdHJpbmcgYW5pbU5hbWUobmFtZSk7Ci0gICAgQXRvbWljU3Ry
aW5nIGFuaW1FdmVudFR5cGUoZXZlbnRUeXBlKTsKLSAgICAvLyBNYWtlIHN1cmUgdGhlIGVsZW1l
bnQgc3RpY2tzIGFyb3VuZCB0b28KLSAgICBSZWZQdHI8RWxlbWVudD4gZWxlbWVudFJldGFpbmVy
KGVsZW1lbnQpOwotICAgIAotICAgIEFTU0VSVCghZWxlbWVudCB8fCAoZWxlbWVudC0+ZG9jdW1l
bnQoKSAmJiAhZWxlbWVudC0+ZG9jdW1lbnQoKS0+aW5QYWdlQ2FjaGUoKSkpOwotICAgIGlmICgh
ZWxlbWVudCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKGV2ZW50VHlwZSA9PSBFdmVudE5h
bWVzOjp3ZWJraXRUcmFuc2l0aW9uRW5kRXZlbnQpCi0gICAgICAgIGVsZW1lbnQtPmRpc3BhdGNo
V2ViS2l0VHJhbnNpdGlvbkV2ZW50KGV2ZW50VHlwZSwgbmFtZSwgZWxhcHNlZFRpbWUpOwotICAg
IGVsc2UKLSAgICAgICAgZWxlbWVudC0+ZGlzcGF0Y2hXZWJLaXRBbmltYXRpb25FdmVudChldmVu
dFR5cGUsIG5hbWUsIGVsYXBzZWRUaW1lKTsKLQotICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFs
ICh1bmFuaW1hdGVkKSBzdHlsZQotICAgIGlmIChhbmltRXZlbnRUeXBlID09IEV2ZW50TmFtZXM6
OndlYmtpdEFuaW1hdGlvbkVuZEV2ZW50KQotICAgICAgICBpZiAoZWxlbWVudC0+cmVuZGVyZXIo
KSkKLSAgICAgICAgICAgIHNldENoYW5nZWQoZWxlbWVudC0+cmVuZGVyZXIoKS0+ZWxlbWVudCgp
KTsKLX0KLQotdm9pZCBBbmltYXRpb25CYXNlOjp1cGRhdGVQbGF5U3RhdGUoYm9vbCBydW4pCi17
Ci0gICAgaWYgKHBhdXNlZCgpID09IHJ1biB8fCBpc25ldygpKQotICAgICAgICB1cGRhdGVTdGF0
ZU1hY2hpbmUocnVuID8gU1RBVEVfSU5QVVRfUExBWV9TVEFURV9SVU5OSU5HIDogU1RBVEVfSU5Q
VVRfUExBWV9TVEFURV9QQVVTRUQsIC0xKTsKLX0KLQotZG91YmxlIEFuaW1hdGlvbkJhc2U6OnBy
b2dyZXNzKGRvdWJsZSBzY2FsZSwgZG91YmxlIG9mZnNldCkgY29uc3QKLXsKLSAgICBpZiAocHJl
YWN0aXZlKCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIGRvdWJsZSBlbGFwc2VkVGlt
ZSA9IHJ1bm5pbmcoKSA/IChjdXJyZW50VGltZSgpIC0gbV9zdGFydFRpbWUpIDogKG1fcGF1c2VU
aW1lIC0gbV9zdGFydFRpbWUpOwotICAgIGlmIChydW5uaW5nKCkgJiYgZWxhcHNlZFRpbWUgPCAw
KQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICBkb3VibGUgZHVyID0gbV9hbmltYXRpb24t
PmR1cmF0aW9uKCk7Ci0gICAgaWYgKG1fYW5pbWF0aW9uLT5pdGVyYXRpb25Db3VudCgpID4gMCkK
LSAgICAgICAgZHVyICo9IG1fYW5pbWF0aW9uLT5pdGVyYXRpb25Db3VudCgpOwotICAgIAotICAg
IGlmIChwb3N0YWN0aXZlKCkgfHwgIW1fYW5pbWF0aW9uLT5kdXJhdGlvbigpIHx8IChtX2FuaW1h
dGlvbi0+aXRlcmF0aW9uQ291bnQoKSA+IDAgJiYgZWxhcHNlZFRpbWUgPj0gZHVyKSkKLSAgICAg
ICAgcmV0dXJuIDEuMDsKLSAgICAKLSAgICAvLyBDb21wdXRlIHRoZSBmcmFjdGlvbmFsIHRpbWUs
IHRha2luZyBpbnRvIGFjY291bnQgZGlyZWN0aW9uLgotICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQg
dG8gd29ycnkgYWJvdXQgaXRlcmF0aW9ucywgd2UgYXNzdW1lIHRoYXQgd2Ugd291bGQgaGF2ZQot
ICAgIC8vIHNob3J0IGNpcmN1aXRlZCBhYm92ZSBpZiB3ZSB3ZXJlIGRvbmUKLSAgICBkb3VibGUg
ZnJhY3Rpb25hbFRpbWUgPSBlbGFwc2VkVGltZSAvIG1fYW5pbWF0aW9uLT5kdXJhdGlvbigpOwot
ICAgIGludCBpbnRlZ3JhbFRpbWUgPSAoaW50KSBmcmFjdGlvbmFsVGltZTsKLSAgICBmcmFjdGlv
bmFsVGltZSAtPSBpbnRlZ3JhbFRpbWU7Ci0gICAgCi0gICAgaWYgKG1fYW5pbWF0aW9uLT5kaXJl
Y3Rpb24oKSAmJiAoaW50ZWdyYWxUaW1lICYgMSkpCi0gICAgICAgIGZyYWN0aW9uYWxUaW1lID0g
MSAtIGZyYWN0aW9uYWxUaW1lOwotICAgIAotICAgIGlmIChzY2FsZSAhPSAxIHx8IG9mZnNldCAh
PSAwKQotICAgICAgICBmcmFjdGlvbmFsVGltZSA9IChmcmFjdGlvbmFsVGltZSAtIG9mZnNldCkg
KiBzY2FsZTsKLSAgICAKLSAgICBpZiAobV9hbmltYXRpb24tPnRpbWluZ0Z1bmN0aW9uKCkudHlw
ZSgpID09IExpbmVhclRpbWluZ0Z1bmN0aW9uKQotICAgICAgICByZXR1cm4gZnJhY3Rpb25hbFRp
bWU7Ci0gICAgCi0gICAgLy8gQ3ViaWMgYmV6aWVyLgotICAgIGRvdWJsZSByZXN1bHQgPSBzb2x2
ZUN1YmljQmV6aWVyRnVuY3Rpb24obV9hbmltYXRpb24tPnRpbWluZ0Z1bmN0aW9uKCkueDEoKSwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hbmltYXRpb24t
PnRpbWluZ0Z1bmN0aW9uKCkueTEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbV9hbmltYXRpb24tPnRpbWluZ0Z1bmN0aW9uKCkueDIoKSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hbmltYXRpb24tPnRpbWluZ0Z1
bmN0aW9uKCkueTIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZnJhY3Rpb25hbFRpbWUsIG1fYW5pbWF0aW9uLT5kdXJhdGlvbigpKTsKLSAgICByZXR1cm4g
cmVzdWx0OwotfQotCi12b2lkIEFuaW1hdGlvbkJhc2U6OnByaW1lRXZlbnRUaW1lcnMoKQotewot
ICAgIC8vIERlY2lkZSB3aGVuIHRoZSBlbmQgb3IgbG9vcCBldmVudCBuZWVkcyB0byBmaXJlCi0g
ICAgZG91YmxlIGN0ID0gY3VycmVudFRpbWUoKTsKLSAgICBjb25zdCBkb3VibGUgZWxhcHNlZER1
cmF0aW9uID0gY3QgLSBtX3N0YXJ0VGltZTsKLSAgICBBU1NFUlQoZWxhcHNlZER1cmF0aW9uID49
IDApOwotICAgIAotICAgIGRvdWJsZSB0b3RhbER1cmF0aW9uID0gLTE7Ci0gICAgaWYgKG1fYW5p
bWF0aW9uLT5pdGVyYXRpb25Db3VudCgpID4gMCkKLSAgICAgICAgdG90YWxEdXJhdGlvbiA9IG1f
YW5pbWF0aW9uLT5kdXJhdGlvbigpICogbV9hbmltYXRpb24tPml0ZXJhdGlvbkNvdW50KCk7Ci0K
LSAgICBkb3VibGUgZHVyYXRpb25MZWZ0ID0gMDsKLSAgICBkb3VibGUgbmV4dEl0ZXJhdGlvblRp
bWUgPSB0b3RhbER1cmF0aW9uOwotICAgIGlmICh0b3RhbER1cmF0aW9uIDwgMCB8fCBlbGFwc2Vk
RHVyYXRpb24gPCB0b3RhbER1cmF0aW9uKSB7Ci0gICAgICAgIGR1cmF0aW9uTGVmdCA9IG1fYW5p
bWF0aW9uLT5kdXJhdGlvbigpIC0gZm1vZChlbGFwc2VkRHVyYXRpb24sIG1fYW5pbWF0aW9uLT5k
dXJhdGlvbigpKTsKLSAgICAgICAgbmV4dEl0ZXJhdGlvblRpbWUgPSBlbGFwc2VkRHVyYXRpb24g
KyBkdXJhdGlvbkxlZnQ7Ci0gICAgfQotICAgIAotICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIG1h
eSBoYXZlIDAgZHVyYXRpb25MZWZ0LCBpZiB3ZSd2ZSBnb3R0ZW4gdGhlIGV2ZW50IGxhdGUgYW5k
IHdlIGFyZSBhbHJlYWR5Ci0gICAgLy8gcGFzdCB0b3RhbER1cmF0aW9uLiBJbiB0aGlzIGNhc2Ug
d2Ugc3RpbGwgZmlyZSBhbiBlbmQgdGltZXIgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIGVuZC4gCi0g
ICAgLy8gVGhpcyBkZWZlcnMgdGhlIGNhbGwgdG8gc2VuZEFuaW1hdGlvbkV2ZW50cyB0byBhdm9p
ZCByZS1lbnRyYW50IGNhbGxzIHRoYXQgZGVzdHJveQotICAgIC8vIHRoZSBSZW5kZXJPYmplY3Qs
IGFuZCB0aGVyZWZvcmUgfHRoaXN8IGJlZm9yZSB3ZSdyZSBkb25lIHdpdGggaXQuCi0gICAgaWYg
KHRvdGFsRHVyYXRpb24gPCAwIHx8IG5leHRJdGVyYXRpb25UaW1lIDwgdG90YWxEdXJhdGlvbikg
ewotICAgICAgICAvLyBXZSBhcmUgbm90IGF0IHRoZSBlbmQgeWV0LCBzZW5kIGEgbG9vcCBldmVu
dAotICAgICAgICBBU1NFUlQobmV4dEl0ZXJhdGlvblRpbWUgPiAwKTsKLSAgICAgICAgbV9hbmlt
U3RhdGUgPSBTVEFURV9MT09QSU5HOwotICAgICAgICBtX2FuaW1hdGlvblRpbWVyQ2FsbGJhY2su
c3RhcnRUaW1lcihkdXJhdGlvbkxlZnQsIEV2ZW50TmFtZXM6OndlYmtpdEFuaW1hdGlvbkl0ZXJh
dGlvbkV2ZW50LCBuZXh0SXRlcmF0aW9uVGltZSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAg
ICAvLyBXZSBhcmUgYXQgdGhlIGVuZCwgc2VuZCBhbiBlbmQgZXZlbnQKLSAgICAgICAgbV9hbmlt
U3RhdGUgPSBTVEFURV9FTkRJTkc7Ci0gICAgICAgIG1fYW5pbWF0aW9uVGltZXJDYWxsYmFjay5z
dGFydFRpbWVyKGR1cmF0aW9uTGVmdCwgRXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uRW5kRXZl
bnQsIG5leHRJdGVyYXRpb25UaW1lKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJs
ZW5kRnVuYyhpbnQgZnJvbSwgaW50IHRvLCBkb3VibGUgcHJvZ3Jlc3MpCi17ICAKLSAgICByZXR1
cm4gaW50KGZyb20gKyAodG8gLSBmcm9tKSAqIHByb2dyZXNzKTsKLX0KLQotc3RhdGljIGlubGlu
ZSBkb3VibGUgYmxlbmRGdW5jKGRvdWJsZSBmcm9tLCBkb3VibGUgdG8sIGRvdWJsZSBwcm9ncmVz
cykKLXsgIAotICAgIHJldHVybiBmcm9tICsgKHRvIC0gZnJvbSkgKiBwcm9ncmVzczsKLX0KLQot
c3RhdGljIGlubGluZSBmbG9hdCBibGVuZEZ1bmMoZmxvYXQgZnJvbSwgZmxvYXQgdG8sIGRvdWJs
ZSBwcm9ncmVzcykKLXsgIAotICAgIHJldHVybiBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0KGZyb20g
KyAodG8gLSBmcm9tKSAqIHByb2dyZXNzKTsKLX0KLQotc3RhdGljIGlubGluZSBDb2xvciBibGVu
ZEZ1bmMoY29uc3QgQ29sb3ImIGZyb20sIGNvbnN0IENvbG9yJiB0bywgZG91YmxlIHByb2dyZXNz
KQoteyAgCi0gICAgcmV0dXJuIENvbG9yKGJsZW5kRnVuYyhmcm9tLnJlZCgpLCB0by5yZWQoKSwg
cHJvZ3Jlc3MpLAotICAgICAgICAgICAgICAgICBibGVuZEZ1bmMoZnJvbS5ncmVlbigpLCB0by5n
cmVlbigpLCBwcm9ncmVzcyksCi0gICAgICAgICAgICAgICAgIGJsZW5kRnVuYyhmcm9tLmJsdWUo
KSwgdG8uYmx1ZSgpLCBwcm9ncmVzcyksCi0gICAgICAgICAgICAgICAgIGJsZW5kRnVuYyhmcm9t
LmFscGhhKCksIHRvLmFscGhhKCksIHByb2dyZXNzKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgTGVu
Z3RoIGJsZW5kRnVuYyhjb25zdCBMZW5ndGgmIGZyb20sIGNvbnN0IExlbmd0aCYgdG8sIGRvdWJs
ZSBwcm9ncmVzcykKLXsgIAotICAgIHJldHVybiB0by5ibGVuZChmcm9tLCBwcm9ncmVzcyk7Ci19
Ci0KLXN0YXRpYyBpbmxpbmUgSW50U2l6ZSBibGVuZEZ1bmMoY29uc3QgSW50U2l6ZSYgZnJvbSwg
Y29uc3QgSW50U2l6ZSYgdG8sIGRvdWJsZSBwcm9ncmVzcykKLXsgIAotICAgIHJldHVybiBJbnRT
aXplKGJsZW5kRnVuYyhmcm9tLndpZHRoKCksIHRvLndpZHRoKCksIHByb2dyZXNzKSwKLSAgICAg
ICAgICAgICAgICAgICBibGVuZEZ1bmMoZnJvbS5oZWlnaHQoKSwgdG8uaGVpZ2h0KCksIHByb2dy
ZXNzKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgU2hhZG93RGF0YSogYmxlbmRGdW5jKGNvbnN0IFNo
YWRvd0RhdGEqIGZyb20sIGNvbnN0IFNoYWRvd0RhdGEqIHRvLCBkb3VibGUgcHJvZ3Jlc3MpCi17
ICAKLSAgICBBU1NFUlQoZnJvbSAmJiB0byk7Ci0gICAgcmV0dXJuIG5ldyBTaGFkb3dEYXRhKGJs
ZW5kRnVuYyhmcm9tLT54LCB0by0+eCwgcHJvZ3Jlc3MpLCBibGVuZEZ1bmMoZnJvbS0+eSwgdG8t
PnksIHByb2dyZXNzKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kRnVuYyhmcm9t
LT5ibHVyLCB0by0+Ymx1ciwgcHJvZ3Jlc3MpLCBibGVuZEZ1bmMoZnJvbS0+Y29sb3IsIHRvLT5j
b2xvciwgcHJvZ3Jlc3MpKTsKLX0KLQotc3RhdGljIGlubGluZSBUcmFuc2Zvcm1PcGVyYXRpb25z
IGJsZW5kRnVuYyhjb25zdCBUcmFuc2Zvcm1PcGVyYXRpb25zJiBmcm9tLCBjb25zdCBUcmFuc2Zv
cm1PcGVyYXRpb25zJiB0bywgZG91YmxlIHByb2dyZXNzKQoteyAgICAKLSAgICAvLyBCbGVuZCBh
bnkgb3BlcmF0aW9ucyB3aG9zZSB0eXBlcyBhY3R1YWxseSBtYXRjaCB1cC4gIE90aGVyd2lzZSBk
b24ndCBib3RoZXIuCi0gICAgdW5zaWduZWQgZnJvbVNpemUgPSBmcm9tLnNpemUoKTsKLSAgICB1
bnNpZ25lZCB0b1NpemUgPSB0by5zaXplKCk7Ci0gICAgdW5zaWduZWQgc2l6ZSA9IG1heChmcm9t
U2l6ZSwgdG9TaXplKTsKLSAgICBUcmFuc2Zvcm1PcGVyYXRpb25zIHJlc3VsdDsKLSAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIFJlZlB0cjxUcmFuc2Zv
cm1PcGVyYXRpb24+IGZyb21PcCA9IGkgPCBmcm9tU2l6ZSA/IGZyb21baV0gOiAwOwotICAgICAg
ICBSZWZQdHI8VHJhbnNmb3JtT3BlcmF0aW9uPiB0b09wID0gaSA8IHRvU2l6ZSA/IHRvW2ldIDog
MDsKLSAgICAgICAgUmVmUHRyPFRyYW5zZm9ybU9wZXJhdGlvbj4gYmxlbmRlZE9wID0gdG9PcCA/
IHRvT3AtPmJsZW5kKGZyb21PcC5nZXQoKSwgcHJvZ3Jlc3MpIDogZnJvbU9wLT5ibGVuZCgwLCBw
cm9ncmVzcywgdHJ1ZSk7Ci0gICAgICAgIGlmIChibGVuZGVkT3ApCi0gICAgICAgICAgICByZXN1
bHQuYXBwZW5kKGJsZW5kZWRPcCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0
YXRpYyBpbmxpbmUgRVZpc2liaWxpdHkgYmxlbmRGdW5jKEVWaXNpYmlsaXR5IGZyb20sIEVWaXNp
YmlsaXR5IHRvLCBkb3VibGUgcHJvZ3Jlc3MpCi17Ci0gICAgLy8gQW55IG5vbi16ZXJvIHJlc3Vs
dCBtZWFucyB3ZSBjb25zaWRlciB0aGUgb2JqZWN0IHRvIGJlIHZpc2libGUuICBPbmx5IGF0IDAg
ZG8gd2UgY29uc2lkZXIgdGhlIG9iamVjdCB0byBiZQotICAgIC8vIGludmlzaWJsZS4gICBUaGUg
aW52aXNpYmxlIHZhbHVlIHdlIHVzZSAoSElEREVOIHZzLiBDT0xMQVBTRSkgZGVwZW5kcyBvbiB0
aGUgc3BlY2lmaWVkIGZyb20vdG8gdmFsdWVzLgotICAgIGRvdWJsZSBmcm9tVmFsID0gZnJvbSA9
PSBWSVNJQkxFID8gMS4gOiAwLjsKLSAgICBkb3VibGUgdG9WYWwgPSB0byA9PSBWSVNJQkxFID8g
MS4gOiAwLjsKLSAgICBpZiAoZnJvbVZhbCA9PSB0b1ZhbCkKLSAgICAgICAgcmV0dXJuIHRvOwot
ICAgIGRvdWJsZSByZXN1bHQgPSBibGVuZEZ1bmMoZnJvbVZhbCwgdG9WYWwsIHByb2dyZXNzKTsK
LSAgICByZXR1cm4gcmVzdWx0ID4gMC4gPyBWSVNJQkxFIDogKHRvICE9IFZJU0lCTEUgPyB0byA6
IGZyb20pOwotfQotCi1jbGFzcyBQcm9wZXJ0eVdyYXBwZXJCYXNlIHsKLXB1YmxpYzoKLSAgICBQ
cm9wZXJ0eVdyYXBwZXJCYXNlKGludCBwcm9wKQotICAgIDogbV9wcm9wKHByb3ApCi0gICAgeyB9
Ci0gICAgdmlydHVhbCB+UHJvcGVydHlXcmFwcGVyQmFzZSgpIHsgfQotICAgIHZpcnR1YWwgYm9v
bCBlcXVhbHMoY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJlbmRlclN0eWxlKiBiKSBjb25z
dD0wOwotICAgIHZpcnR1YWwgdm9pZCBibGVuZChSZW5kZXJTdHlsZSogZHN0LCBjb25zdCBSZW5k
ZXJTdHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUqIGIsIGRvdWJsZSBwcm9nKSBjb25zdD0wOwot
ICAgIAotICAgIGludCBwcm9wZXJ0eSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJvcDsgfQotICAgIAot
cHJpdmF0ZToKLSAgICBpbnQgbV9wcm9wOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1j
bGFzcyBQcm9wZXJ0eVdyYXBwZXJHZXR0ZXIgOiBwdWJsaWMgUHJvcGVydHlXcmFwcGVyQmFzZSB7
Ci1wdWJsaWM6Ci0gICAgUHJvcGVydHlXcmFwcGVyR2V0dGVyKGludCBwcm9wLCBUIChSZW5kZXJT
dHlsZTo6KmdldHRlcikoKSBjb25zdCkKLSAgICA6IFByb3BlcnR5V3JhcHBlckJhc2UocHJvcCkK
LSAgICAsIG1fZ2V0dGVyKGdldHRlcikKLSAgICB7IH0KLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wg
ZXF1YWxzKGNvbnN0IFJlbmRlclN0eWxlKiBhLCBjb25zdCBSZW5kZXJTdHlsZSogYikgY29uc3QK
LSAgICB7Ci0gICAgICAgIHJldHVybiAoYS0+Km1fZ2V0dGVyKSgpID09IChiLT4qbV9nZXR0ZXIp
KCk7Ci0gICAgfQotICAgIAotcHJvdGVjdGVkOgotICAgIFQgKFJlbmRlclN0eWxlOjoqbV9nZXR0
ZXIpKCkgY29uc3Q7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFByb3BlcnR5
V3JhcHBlciA6IHB1YmxpYyBQcm9wZXJ0eVdyYXBwZXJHZXR0ZXI8VD4gewotcHVibGljOgotICAg
IFByb3BlcnR5V3JhcHBlcihpbnQgcHJvcCwgVCAoUmVuZGVyU3R5bGU6OipnZXR0ZXIpKCkgY29u
c3QsIHZvaWQgKFJlbmRlclN0eWxlOjoqc2V0dGVyKShUKSkKLSAgICA6IFByb3BlcnR5V3JhcHBl
ckdldHRlcjxUPihwcm9wLCBnZXR0ZXIpCi0gICAgLCBtX3NldHRlcihzZXR0ZXIpCi0gICAgeyB9
Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkIGJsZW5kKFJlbmRlclN0eWxlKiBkc3QsIGNvbnN0IFJl
bmRlclN0eWxlKiBhLCBjb25zdCBSZW5kZXJTdHlsZSogYiwgZG91YmxlIHByb2cpIGNvbnN0Ci0g
ICAgewotICAgICAgICAoZHN0LT4qbV9zZXR0ZXIpKGJsZW5kRnVuYygoYS0+KlByb3BlcnR5V3Jh
cHBlckdldHRlcjxUPjo6bV9nZXR0ZXIpKCksIChiLT4qUHJvcGVydHlXcmFwcGVyR2V0dGVyPFQ+
OjptX2dldHRlcikoKSwgcHJvZykpOwotICAgIH0KLSAgICAKLXByb3RlY3RlZDoKLSAgICB2b2lk
IChSZW5kZXJTdHlsZTo6Km1fc2V0dGVyKShUKTsKLX07Ci0KLWNsYXNzIFByb3BlcnR5V3JhcHBl
clNoYWRvdyA6IHB1YmxpYyBQcm9wZXJ0eVdyYXBwZXJHZXR0ZXI8U2hhZG93RGF0YSo+IHsKLXB1
YmxpYzoKLSAgICBQcm9wZXJ0eVdyYXBwZXJTaGFkb3coaW50IHByb3AsIFNoYWRvd0RhdGEqIChS
ZW5kZXJTdHlsZTo6KmdldHRlcikoKSBjb25zdCwgdm9pZCAoUmVuZGVyU3R5bGU6OipzZXR0ZXIp
KFNoYWRvd0RhdGEqLCBib29sKSkKLSAgICA6IFByb3BlcnR5V3JhcHBlckdldHRlcjxTaGFkb3dE
YXRhKj4ocHJvcCwgZ2V0dGVyKQotICAgICwgbV9zZXR0ZXIoc2V0dGVyKQotICAgIHsgfQotICAg
IAotICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJl
bmRlclN0eWxlKiBiKSBjb25zdAotICAgIHsKLSAgICAgICAgU2hhZG93RGF0YSogc2hhZG93YSA9
IChhLT4qbV9nZXR0ZXIpKCk7Ci0gICAgICAgIFNoYWRvd0RhdGEqIHNoYWRvd2IgPSAoYi0+Km1f
Z2V0dGVyKSgpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFzaGFkb3dhICYmIHNoYWRvd2IgfHwg
c2hhZG93YSAmJiAhc2hhZG93YikKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAg
aWYgKHNoYWRvd2EgJiYgc2hhZG93YiAmJiAoKnNoYWRvd2EgIT0gKnNoYWRvd2IpKQotICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0g
ICAgdmlydHVhbCB2b2lkIGJsZW5kKFJlbmRlclN0eWxlKiBkc3QsIGNvbnN0IFJlbmRlclN0eWxl
KiBhLCBjb25zdCBSZW5kZXJTdHlsZSogYiwgZG91YmxlIHByb2cpIGNvbnN0Ci0gICAgewotICAg
ICAgICBTaGFkb3dEYXRhKiBzaGFkb3dhID0gKGEtPiptX2dldHRlcikoKTsKLSAgICAgICAgU2hh
ZG93RGF0YSogc2hhZG93YiA9IChiLT4qbV9nZXR0ZXIpKCk7Ci0gICAgICAgIFNoYWRvd0RhdGEg
ZGVmYXVsdFNoYWRvd0RhdGEoMCwgMCwgMCwgQ29sb3I6OnRyYW5zcGFyZW50KTsKLSAgICAgICAg
Ci0gICAgICAgIGlmICghc2hhZG93YSkKLSAgICAgICAgICAgIHNoYWRvd2EgPSAmZGVmYXVsdFNo
YWRvd0RhdGE7Ci0gICAgICAgIGlmICghc2hhZG93YikKLSAgICAgICAgICAgIHNoYWRvd2IgPSAm
ZGVmYXVsdFNoYWRvd0RhdGE7Ci0gICAgICAgIAotICAgICAgICAoZHN0LT4qbV9zZXR0ZXIpKGJs
ZW5kRnVuYyhzaGFkb3dhLCBzaGFkb3diLCBwcm9nKSwgZmFsc2UpOwotICAgIH0KLSAgICAKLXBy
aXZhdGU6Ci0gICAgdm9pZCAoUmVuZGVyU3R5bGU6OiptX3NldHRlcikoU2hhZG93RGF0YSosIGJv
b2wpOwotfTsKLQotY2xhc3MgUHJvcGVydHlXcmFwcGVyTWF5YmVJbnZhbGlkQ29sb3IgOiBwdWJs
aWMgUHJvcGVydHlXcmFwcGVyQmFzZSB7Ci1wdWJsaWM6Ci0gICAgUHJvcGVydHlXcmFwcGVyTWF5
YmVJbnZhbGlkQ29sb3IoaW50IHByb3AsIGNvbnN0IENvbG9yJiAoUmVuZGVyU3R5bGU6OipnZXR0
ZXIpKCkgY29uc3QsIHZvaWQgKFJlbmRlclN0eWxlOjoqc2V0dGVyKShjb25zdCBDb2xvciYpKQot
ICAgIDogUHJvcGVydHlXcmFwcGVyQmFzZShwcm9wKQotICAgICwgbV9nZXR0ZXIoZ2V0dGVyKQot
ICAgICwgbV9zZXR0ZXIoc2V0dGVyKQotICAgIHsgfQotICAgIAotICAgIHZpcnR1YWwgYm9vbCBl
cXVhbHMoY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJlbmRlclN0eWxlKiBiKSBjb25zdAot
ICAgIHsKLSAgICAgICAgQ29sb3IgZnJvbUNvbG9yID0gKGEtPiptX2dldHRlcikoKTsKLSAgICAg
ICAgQ29sb3IgdG9Db2xvciA9IChiLT4qbV9nZXR0ZXIpKCk7Ci0gICAgICAgIGlmICghZnJvbUNv
bG9yLmlzVmFsaWQoKSkKLSAgICAgICAgICAgIGZyb21Db2xvciA9IGEtPmNvbG9yKCk7Ci0gICAg
ICAgIGlmICghdG9Db2xvci5pc1ZhbGlkKCkpCi0gICAgICAgICAgICB0b0NvbG9yID0gYi0+Y29s
b3IoKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmcm9tQ29sb3IgPT0gdG9Db2xvcjsKLSAg
ICB9Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkIGJsZW5kKFJlbmRlclN0eWxlKiBkc3QsIGNvbnN0
IFJlbmRlclN0eWxlKiBhLCBjb25zdCBSZW5kZXJTdHlsZSogYiwgZG91YmxlIHByb2cpIGNvbnN0
Ci0gICAgewotICAgICAgICBDb2xvciBmcm9tQ29sb3IgPSAoYS0+Km1fZ2V0dGVyKSgpOwotICAg
ICAgICBDb2xvciB0b0NvbG9yID0gKGItPiptX2dldHRlcikoKTsKLSAgICAgICAgaWYgKCFmcm9t
Q29sb3IuaXNWYWxpZCgpKQotICAgICAgICAgICAgZnJvbUNvbG9yID0gYS0+Y29sb3IoKTsKLSAg
ICAgICAgaWYgKCF0b0NvbG9yLmlzVmFsaWQoKSkKLSAgICAgICAgICAgIHRvQ29sb3IgPSBiLT5j
b2xvcigpOwotICAgICAgICAoZHN0LT4qbV9zZXR0ZXIpKGJsZW5kRnVuYyhmcm9tQ29sb3IsIHRv
Q29sb3IsIHByb2cpKTsKLSAgICB9Ci0gICAgCi1wcml2YXRlOgotICAgIGNvbnN0IENvbG9yJiAo
UmVuZGVyU3R5bGU6OiptX2dldHRlcikoKSBjb25zdDsKLSAgICB2b2lkIChSZW5kZXJTdHlsZTo6
Km1fc2V0dGVyKShjb25zdCBDb2xvciYpOwotfTsKLQogY2xhc3MgQW5pbWF0aW9uQ29udHJvbGxl
clByaXZhdGUgewogcHVibGljOgogICAgIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlKEZyYW1l
Kik7CkBAIC0xMDkwLDQwICs2MCwyMCBAQCBwdWJsaWM6CiAgICAgCiAgICAgYm9vbCBpc0FuaW1h
dGluZ1Byb3BlcnR5T25SZW5kZXJlcihSZW5kZXJPYmplY3QqIG9iaiwgaW50IHByb3BlcnR5LCBi
b29sIGlzUnVubmluZ05vdykgY29uc3Q7CiAgICAgCi0gICAgc3RhdGljIGJvb2wgcHJvcGVydGll
c0VxdWFsKGludCBwcm9wLCBjb25zdCBSZW5kZXJTdHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUq
IGIpOwotICAgIHN0YXRpYyBpbnQgZ2V0UHJvcGVydHlBdEluZGV4KGludCBpKTsKLSAgICBzdGF0
aWMgaW50IGdldE51bVByb3BlcnRpZXMoKSB7IHJldHVybiBnUHJvcGVydHlXcmFwcGVycy0+c2l6
ZSgpOyB9Ci0gICAgCi0gICAgLy8gUmV0dXJuIHRydWUgaWYgd2UgbmVlZCB0byBzdGFydCBzb2Z0
d2FyZSBhbmltYXRpb24gdGltZXJzCi0gICAgc3RhdGljIGJvb2wgYmxlbmRQcm9wZXJ0aWVzKGlu
dCBwcm9wLCBSZW5kZXJTdHlsZSogZHN0LCBjb25zdCBSZW5kZXJTdHlsZSogYSwgY29uc3QgUmVu
ZGVyU3R5bGUqIGIsIGRvdWJsZSBwcm9nKTsKLSAgICAKLSAgICB2b2lkIHNldFdhaXRpbmdGb3JT
dHlsZUF2YWlsYWJsZShib29sIHdhaXRpbmcpIHsgaWYgKHdhaXRpbmcpIG1fbnVtU3R5bGVBdmFp
bGFibGVXYWl0ZXJzKys7IGVsc2UgbV9udW1TdHlsZUF2YWlsYWJsZVdhaXRlcnMtLTsgfQotICAg
IAogcHJpdmF0ZToKLSAgICBzdGF0aWMgdm9pZCBlbnN1cmVQcm9wZXJ0eU1hcCgpOwotICAgIAog
ICAgIHR5cGVkZWYgSGFzaE1hcDxSZW5kZXJPYmplY3QqLCBDb21wb3NpdGVBbmltYXRpb24qPiBS
ZW5kZXJPYmplY3RBbmltYXRpb25NYXA7CiAgICAgCiAgICAgUmVuZGVyT2JqZWN0QW5pbWF0aW9u
TWFwIG1fY29tcG9zaXRlQW5pbWF0aW9uczsKICAgICBUaW1lcjxBbmltYXRpb25Db250cm9sbGVy
UHJpdmF0ZT4gbV9hbmltYXRpb25UaW1lcjsKICAgICBUaW1lcjxBbmltYXRpb25Db250cm9sbGVy
UHJpdmF0ZT4gbV91cGRhdGVSZW5kZXJpbmdEaXNwYXRjaGVyOwogICAgIEZyYW1lKiBtX2ZyYW1l
OwotICAgIHVpbnQzMl90IG1fbnVtU3R5bGVBdmFpbGFibGVXYWl0ZXJzOwotICAgIAotICAgIHN0
YXRpYyBWZWN0b3I8UHJvcGVydHlXcmFwcGVyQmFzZSo+KiBnUHJvcGVydHlXcmFwcGVyczsKLSAg
ICBzdGF0aWMgaW50IGdQcm9wZXJ0eVdyYXBwZXJNYXBbbnVtQ1NTUHJvcGVydGllc107CiB9Owog
Ci1WZWN0b3I8UHJvcGVydHlXcmFwcGVyQmFzZSo+KiBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0
ZTo6Z1Byb3BlcnR5V3JhcHBlcnMgPSAwOwotaW50IEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRl
OjpnUHJvcGVydHlXcmFwcGVyTWFwW107Ci0KIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpB
bmltYXRpb25Db250cm9sbGVyUHJpdmF0ZShGcmFtZSogZnJhbWUpCiA6IG1fYW5pbWF0aW9uVGlt
ZXIodGhpcywgJkFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjphbmltYXRpb25UaW1lckZpcmVk
KQogLCBtX3VwZGF0ZVJlbmRlcmluZ0Rpc3BhdGNoZXIodGhpcywgJkFuaW1hdGlvbkNvbnRyb2xs
ZXJQcml2YXRlOjp1cGRhdGVSZW5kZXJpbmdEaXNwYXRjaGVyRmlyZWQpCiAsIG1fZnJhbWUoZnJh
bWUpCi0sIG1fbnVtU3R5bGVBdmFpbGFibGVXYWl0ZXJzKDApCiB7Ci0gICAgZW5zdXJlUHJvcGVy
dHlNYXAoKTsKIH0KIAogQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6On5BbmltYXRpb25Db250
cm9sbGVyUHJpdmF0ZSgpCkBAIC0xMTMxLDE1MCArODEsMTEgQEAgQW5pbWF0aW9uQ29udHJvbGxl
clByaXZhdGU6On5BbmltYXRpb25DbwogICAgIGRlbGV0ZUFsbFZhbHVlcyhtX2NvbXBvc2l0ZUFu
aW1hdGlvbnMpOwogfQogCi0vLyBzdGF0aWMKLXZvaWQgQW5pbWF0aW9uQ29udHJvbGxlclByaXZh
dGU6OmVuc3VyZVByb3BlcnR5TWFwKCkKLXsKLSAgICAvLyBGSVhNRTogVGhpcyBkYXRhIGlzIG5l
dmVyIGRlc3Ryb3llZC4gTWF5YmUgd2Ugc2hvdWxkIHJlZiBjb3VudCBpdCBhbmQgdG9zcyBpdCB3
aGVuIHRoZSBsYXN0IEFuaW1hdGlvbkNvbnRyb2xsZXIgaXMgZGVzdHJveWVkPwotICAgIGlmIChn
UHJvcGVydHlXcmFwcGVycyA9PSAwKSB7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzID0gbmV3
IFZlY3RvcjxQcm9wZXJ0eVdyYXBwZXJCYXNlKj4oKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGJ1
aWxkIHRoZSBsaXN0IG9mIHByb3BlcnR5IHdyYXBwZXJzIHRvIGRvIHRoZSBjb21wYXJpc29ucyBh
bmQgYmxlbmRzCi0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5
V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5TGVmdCwgJlJlbmRlclN0eWxlOjpsZWZ0LCAmUmVu
ZGVyU3R5bGU6OnNldExlZnQpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChu
ZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlSaWdodCwgJlJlbmRlclN0eWxl
OjpyaWdodCwgJlJlbmRlclN0eWxlOjpzZXRSaWdodCkpOwotICAgICAgICBnUHJvcGVydHlXcmFw
cGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eVRvcCwg
JlJlbmRlclN0eWxlOjp0b3AsICZSZW5kZXJTdHlsZTo6c2V0VG9wKSk7Ci0gICAgICAgIGdQcm9w
ZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3Bl
cnR5Qm90dG9tLCAmUmVuZGVyU3R5bGU6OmJvdHRvbSwgJlJlbmRlclN0eWxlOjpzZXRCb3R0b20p
KTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVy
PExlbmd0aD4oQ1NTUHJvcGVydHlXaWR0aCwgJlJlbmRlclN0eWxlOjp3aWR0aCwgJlJlbmRlclN0
eWxlOjpzZXRXaWR0aCkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQ
cm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eUhlaWdodCwgJlJlbmRlclN0eWxlOjpo
ZWlnaHQsICZSZW5kZXJTdHlsZTo6c2V0SGVpZ2h0KSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBw
ZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjx1bnNpZ25lZCBzaG9ydD4oQ1NTUHJvcGVy
dHlCb3JkZXJMZWZ0V2lkdGgsICZSZW5kZXJTdHlsZTo6Ym9yZGVyTGVmdFdpZHRoLCAmUmVuZGVy
U3R5bGU6OnNldEJvcmRlckxlZnRXaWR0aCkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+
YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8dW5zaWduZWQgc2hvcnQ+KENTU1Byb3BlcnR5Qm9y
ZGVyUmlnaHRXaWR0aCwgJlJlbmRlclN0eWxlOjpib3JkZXJSaWdodFdpZHRoLCAmUmVuZGVyU3R5
bGU6OnNldEJvcmRlclJpZ2h0V2lkdGgpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFw
cGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPHVuc2lnbmVkIHNob3J0PihDU1NQcm9wZXJ0eUJvcmRl
clRvcFdpZHRoLCAmUmVuZGVyU3R5bGU6OmJvcmRlclRvcFdpZHRoLCAmUmVuZGVyU3R5bGU6OnNl
dEJvcmRlclRvcFdpZHRoKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3
IFByb3BlcnR5V3JhcHBlcjx1bnNpZ25lZCBzaG9ydD4oQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21X
aWR0aCwgJlJlbmRlclN0eWxlOjpib3JkZXJCb3R0b21XaWR0aCwgJlJlbmRlclN0eWxlOjpzZXRC
b3JkZXJCb3R0b21XaWR0aCkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5l
dyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eU1hcmdpbkxlZnQsICZSZW5kZXJT
dHlsZTo6bWFyZ2luTGVmdCwgJlJlbmRlclN0eWxlOjpzZXRNYXJnaW5MZWZ0KSk7Ci0gICAgICAg
IGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENT
U1Byb3BlcnR5TWFyZ2luUmlnaHQsICZSZW5kZXJTdHlsZTo6bWFyZ2luUmlnaHQsICZSZW5kZXJT
dHlsZTo6c2V0TWFyZ2luUmlnaHQpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVu
ZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlNYXJnaW5Ub3AsICZSZW5k
ZXJTdHlsZTo6bWFyZ2luVG9wLCAmUmVuZGVyU3R5bGU6OnNldE1hcmdpblRvcCkpOwotICAgICAg
ICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihD
U1NQcm9wZXJ0eU1hcmdpbkJvdHRvbSwgJlJlbmRlclN0eWxlOjptYXJnaW5Cb3R0b20sICZSZW5k
ZXJTdHlsZTo6c2V0TWFyZ2luQm90dG9tKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5h
cHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5UGFkZGluZ0xlZnQs
ICZSZW5kZXJTdHlsZTo6cGFkZGluZ0xlZnQsICZSZW5kZXJTdHlsZTo6c2V0UGFkZGluZ0xlZnQp
KTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVy
PExlbmd0aD4oQ1NTUHJvcGVydHlQYWRkaW5nUmlnaHQsICZSZW5kZXJTdHlsZTo6cGFkZGluZ1Jp
Z2h0LCAmUmVuZGVyU3R5bGU6OnNldFBhZGRpbmdSaWdodCkpOwotICAgICAgICBnUHJvcGVydHlX
cmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eVBh
ZGRpbmdUb3AsICZSZW5kZXJTdHlsZTo6cGFkZGluZ1RvcCwgJlJlbmRlclN0eWxlOjpzZXRQYWRk
aW5nVG9wKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5
V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5UGFkZGluZ0JvdHRvbSwgJlJlbmRlclN0eWxlOjpw
YWRkaW5nQm90dG9tLCAmUmVuZGVyU3R5bGU6OnNldFBhZGRpbmdCb3R0b20pKTsKLSAgICAgICAg
Z1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPGZsb2F0PihDU1NQ
cm9wZXJ0eU9wYWNpdHksICZSZW5kZXJTdHlsZTo6b3BhY2l0eSwgJlJlbmRlclN0eWxlOjpzZXRP
cGFjaXR5KSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5
V3JhcHBlcjxjb25zdCBDb2xvciY+KENTU1Byb3BlcnR5Q29sb3IsICZSZW5kZXJTdHlsZTo6Y29s
b3IsICZSZW5kZXJTdHlsZTo6c2V0Q29sb3IpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMt
PmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPGNvbnN0IENvbG9yJj4oQ1NTUHJvcGVydHlCYWNr
Z3JvdW5kQ29sb3IsICZSZW5kZXJTdHlsZTo6YmFja2dyb3VuZENvbG9yLCAmUmVuZGVyU3R5bGU6
OnNldEJhY2tncm91bmRDb2xvcikpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5k
KG5ldyBQcm9wZXJ0eVdyYXBwZXI8aW50PihDU1NQcm9wZXJ0eUZvbnRTaXplLCAmUmVuZGVyU3R5
bGU6OmZvbnRTaXplLCAmUmVuZGVyU3R5bGU6OnNldEJsZW5kZWRGb250U2l6ZSkpOwotICAgICAg
ICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8dW5zaWduZWQg
c2hvcnQ+KENTU1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZVdpZHRoLCAmUmVuZGVyU3R5bGU6OmNv
bHVtblJ1bGVXaWR0aCwgJlJlbmRlclN0eWxlOjpzZXRDb2x1bW5SdWxlV2lkdGgpKTsKLSAgICAg
ICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPGZsb2F0PihD
U1NQcm9wZXJ0eVdlYmtpdENvbHVtbkdhcCwgJlJlbmRlclN0eWxlOjpjb2x1bW5HYXAsICZSZW5k
ZXJTdHlsZTo6c2V0Q29sdW1uR2FwKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBl
bmQobmV3IFByb3BlcnR5V3JhcHBlcjx1bnNpZ25lZCBzaG9ydD4oQ1NTUHJvcGVydHlXZWJraXRD
b2x1bW5Db3VudCwgJlJlbmRlclN0eWxlOjpjb2x1bW5Db3VudCwgJlJlbmRlclN0eWxlOjpzZXRD
b2x1bW5Db3VudCkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9w
ZXJ0eVdyYXBwZXI8ZmxvYXQ+KENTU1Byb3BlcnR5V2Via2l0Q29sdW1uV2lkdGgsICZSZW5kZXJT
dHlsZTo6Y29sdW1uV2lkdGgsICZSZW5kZXJTdHlsZTo6c2V0Q29sdW1uV2lkdGgpKTsKLSAgICAg
ICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPHNob3J0PihD
U1NQcm9wZXJ0eVdlYmtpdEJvcmRlckhvcml6b250YWxTcGFjaW5nLCAmUmVuZGVyU3R5bGU6Omhv
cml6b250YWxCb3JkZXJTcGFjaW5nLCAmUmVuZGVyU3R5bGU6OnNldEhvcml6b250YWxCb3JkZXJT
cGFjaW5nKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5
V3JhcHBlcjxzaG9ydD4oQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJWZXJ0aWNhbFNwYWNpbmcsICZS
ZW5kZXJTdHlsZTo6dmVydGljYWxCb3JkZXJTcGFjaW5nLCAmUmVuZGVyU3R5bGU6OnNldFZlcnRp
Y2FsQm9yZGVyU3BhY2luZykpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5l
dyBQcm9wZXJ0eVdyYXBwZXI8aW50PihDU1NQcm9wZXJ0eVpJbmRleCwgJlJlbmRlclN0eWxlOjp6
SW5kZXgsICZSZW5kZXJTdHlsZTo6c2V0WkluZGV4KSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBw
ZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5TGluZUhl
aWdodCwgJlJlbmRlclN0eWxlOjpsaW5lSGVpZ2h0LCAmUmVuZGVyU3R5bGU6OnNldExpbmVIZWln
aHQpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFw
cGVyPGludD4oQ1NTUHJvcGVydHlPdXRsaW5lT2Zmc2V0LCAmUmVuZGVyU3R5bGU6Om91dGxpbmVP
ZmZzZXQsICZSZW5kZXJTdHlsZTo6c2V0T3V0bGluZU9mZnNldCkpOwotICAgICAgICBnUHJvcGVy
dHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8dW5zaWduZWQgc2hvcnQ+KENT
U1Byb3BlcnR5T3V0bGluZVdpZHRoLCAmUmVuZGVyU3R5bGU6Om91dGxpbmVXaWR0aCwgJlJlbmRl
clN0eWxlOjpzZXRPdXRsaW5lV2lkdGgpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFw
cGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPGludD4oQ1NTUHJvcGVydHlMZXR0ZXJTcGFjaW5nLCAm
UmVuZGVyU3R5bGU6OmxldHRlclNwYWNpbmcsICZSZW5kZXJTdHlsZTo6c2V0TGV0dGVyU3BhY2lu
ZykpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBw
ZXI8aW50PihDU1NQcm9wZXJ0eVdvcmRTcGFjaW5nLCAmUmVuZGVyU3R5bGU6OndvcmRTcGFjaW5n
LCAmUmVuZGVyU3R5bGU6OnNldFdvcmRTcGFjaW5nKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBw
ZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxjb25zdCBUcmFuc2Zvcm1PcGVyYXRpb25z
Jj4oQ1NTUHJvcGVydHlXZWJraXRUcmFuc2Zvcm0sICZSZW5kZXJTdHlsZTo6dHJhbnNmb3JtLCAm
UmVuZGVyU3R5bGU6OnNldFRyYW5zZm9ybSkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+
YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eVdlYmtpdFRyYW5z
Zm9ybU9yaWdpblgsICZSZW5kZXJTdHlsZTo6dHJhbnNmb3JtT3JpZ2luWCwgJlJlbmRlclN0eWxl
OjpzZXRUcmFuc2Zvcm1PcmlnaW5YKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBl
bmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3Jt
T3JpZ2luWSwgJlJlbmRlclN0eWxlOjp0cmFuc2Zvcm1PcmlnaW5ZLCAmUmVuZGVyU3R5bGU6OnNl
dFRyYW5zZm9ybU9yaWdpblkpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChu
ZXcgUHJvcGVydHlXcmFwcGVyPGNvbnN0IEludFNpemUmPihDU1NQcm9wZXJ0eVdlYmtpdEJvcmRl
clRvcExlZnRSYWRpdXMsICZSZW5kZXJTdHlsZTo6Ym9yZGVyVG9wTGVmdFJhZGl1cywgJlJlbmRl
clN0eWxlOjpzZXRCb3JkZXJUb3BMZWZ0UmFkaXVzKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBw
ZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxjb25zdCBJbnRTaXplJj4oQ1NTUHJvcGVy
dHlXZWJraXRCb3JkZXJUb3BSaWdodFJhZGl1cywgJlJlbmRlclN0eWxlOjpib3JkZXJUb3BSaWdo
dFJhZGl1cywgJlJlbmRlclN0eWxlOjpzZXRCb3JkZXJUb3BSaWdodFJhZGl1cykpOwotICAgICAg
ICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8Y29uc3QgSW50
U2l6ZSY+KENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQm90dG9tTGVmdFJhZGl1cywgJlJlbmRlclN0
eWxlOjpib3JkZXJCb3R0b21MZWZ0UmFkaXVzLCAmUmVuZGVyU3R5bGU6OnNldEJvcmRlckJvdHRv
bUxlZnRSYWRpdXMpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJv
cGVydHlXcmFwcGVyPGNvbnN0IEludFNpemUmPihDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckJvdHRv
bVJpZ2h0UmFkaXVzLCAmUmVuZGVyU3R5bGU6OmJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzLCAmUmVu
ZGVyU3R5bGU6OnNldEJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzKSk7Ci0gICAgICAgIGdQcm9wZXJ0
eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxFVmlzaWJpbGl0eT4oQ1NTUHJv
cGVydHlWaXNpYmlsaXR5LCAmUmVuZGVyU3R5bGU6OnZpc2liaWxpdHksICZSZW5kZXJTdHlsZTo6
c2V0VmlzaWJpbGl0eSkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQ
cm9wZXJ0eVdyYXBwZXI8ZmxvYXQ+KENTU1Byb3BlcnR5Wm9vbSwgJlJlbmRlclN0eWxlOjp6b29t
LCAmUmVuZGVyU3R5bGU6OnNldFpvb20pKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEZJWE1FOiB0
aGVzZSBtaWdodCBiZSBpbnZhbGlkIGNvbG9ycywgbmVlZCB0byBjaGVjayBmb3IgdGhhdAotICAg
ICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXJNYXliZUlu
dmFsaWRDb2xvcihDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGVDb2xvciwgJlJlbmRlclN0eWxl
Ojpjb2x1bW5SdWxlQ29sb3IsICZSZW5kZXJTdHlsZTo6c2V0Q29sdW1uUnVsZUNvbG9yKSk7Ci0g
ICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlck1heWJl
SW52YWxpZENvbG9yKENTU1Byb3BlcnR5V2Via2l0VGV4dFN0cm9rZUNvbG9yLCAmUmVuZGVyU3R5
bGU6OnRleHRTdHJva2VDb2xvciwgJlJlbmRlclN0eWxlOjpzZXRUZXh0U3Ryb2tlQ29sb3IpKTsK
LSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyTWF5
YmVJbnZhbGlkQ29sb3IoQ1NTUHJvcGVydHlXZWJraXRUZXh0RmlsbENvbG9yLCAmUmVuZGVyU3R5
bGU6OnRleHRGaWxsQ29sb3IsICZSZW5kZXJTdHlsZTo6c2V0VGV4dEZpbGxDb2xvcikpOwotICAg
ICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXJNYXliZUlu
dmFsaWRDb2xvcihDU1NQcm9wZXJ0eUJvcmRlckxlZnRDb2xvciwgJlJlbmRlclN0eWxlOjpib3Jk
ZXJMZWZ0Q29sb3IsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyTGVmdENvbG9yKSk7Ci0gICAgICAg
IGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlck1heWJlSW52YWxp
ZENvbG9yKENTU1Byb3BlcnR5Qm9yZGVyUmlnaHRDb2xvciwgJlJlbmRlclN0eWxlOjpib3JkZXJS
aWdodENvbG9yLCAmUmVuZGVyU3R5bGU6OnNldEJvcmRlclJpZ2h0Q29sb3IpKTsKLSAgICAgICAg
Z1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyTWF5YmVJbnZhbGlk
Q29sb3IoQ1NTUHJvcGVydHlCb3JkZXJUb3BDb2xvciwgJlJlbmRlclN0eWxlOjpib3JkZXJUb3BD
b2xvciwgJlJlbmRlclN0eWxlOjpzZXRCb3JkZXJUb3BDb2xvcikpOwotICAgICAgICBnUHJvcGVy
dHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXJNYXliZUludmFsaWRDb2xvcihD
U1NQcm9wZXJ0eUJvcmRlckJvdHRvbUNvbG9yLCAmUmVuZGVyU3R5bGU6OmJvcmRlckJvdHRvbUNv
bG9yLCAmUmVuZGVyU3R5bGU6OnNldEJvcmRlckJvdHRvbUNvbG9yKSk7Ci0gICAgICAgIGdQcm9w
ZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENvbG9y
KENTU1Byb3BlcnR5T3V0bGluZUNvbG9yLCAmUmVuZGVyU3R5bGU6Om91dGxpbmVDb2xvciwgJlJl
bmRlclN0eWxlOjpzZXRPdXRsaW5lQ29sb3IpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoZXNl
IGFyZSBmb3Igc2hhZG93cwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQ
cm9wZXJ0eVdyYXBwZXJTaGFkb3coQ1NTUHJvcGVydHlXZWJraXRCb3hTaGFkb3csICZSZW5kZXJT
dHlsZTo6Ym94U2hhZG93LCAmUmVuZGVyU3R5bGU6OnNldEJveFNoYWRvdykpOwotICAgICAgICBn
UHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXJTaGFkb3coQ1NTUHJv
cGVydHlUZXh0U2hhZG93LCAmUmVuZGVyU3R5bGU6OnRleHRTaGFkb3csICZSZW5kZXJTdHlsZTo6
c2V0VGV4dFNoYWRvdykpOwotICAgICAgICAKLSAgICAgICAgLy8gTWFrZSBzdXJlIHVudXNlZCBz
bG90cyBoYXZlIGEgdmFsdWUKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCAo
dW5zaWduZWQgaW50KSBudW1DU1NQcm9wZXJ0aWVzOyArK2kpCi0gICAgICAgICAgICBnUHJvcGVy
dHlXcmFwcGVyTWFwW2ldID0gQ1NTUHJvcGVydHlJbnZhbGlkOwotICAgICAgICAKLSAgICAgICAg
c2l6ZV90IG4gPSBnUHJvcGVydHlXcmFwcGVycy0+c2l6ZSgpOwotICAgICAgICBmb3IgKHVuc2ln
bmVkIGludCBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgQVNTRVJUKCgqZ1Byb3Bl
cnR5V3JhcHBlcnMpW2ldLT5wcm9wZXJ0eSgpIC0gZmlyc3RDU1NQcm9wZXJ0eSA8IG51bUNTU1By
b3BlcnRpZXMpOwotICAgICAgICAgICAgZ1Byb3BlcnR5V3JhcHBlck1hcFsoKmdQcm9wZXJ0eVdy
YXBwZXJzKVtpXS0+cHJvcGVydHkoKSAtIGZpcnN0Q1NTUHJvcGVydHldID0gaTsKLSAgICAgICAg
fQotICAgIH0KLX0KLQotLy8gc3RhdGljCi1ib29sIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRl
Ojpwcm9wZXJ0aWVzRXF1YWwoaW50IHByb3AsIGNvbnN0IFJlbmRlclN0eWxlKiBhLCBjb25zdCBS
ZW5kZXJTdHlsZSogYikKLXsKLSAgICBpZiAocHJvcCA9PSBjQW5pbWF0ZUFsbCkgewotICAgICAg
ICBzaXplX3QgbiA9IGdQcm9wZXJ0eVdyYXBwZXJzLT5zaXplKCk7Ci0gICAgICAgIGZvciAodW5z
aWduZWQgaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoISgqZ1Byb3Bl
cnR5V3JhcHBlcnMpW2ldLT5lcXVhbHMoYSwgYikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBpbnQgcHJvcEluZGV4
ID0gcHJvcCAtIGZpcnN0Q1NTUHJvcGVydHk7Ci0gICAgICAgIAotICAgICAgICBpZiAocHJvcElu
ZGV4ID49IDAgJiYgcHJvcEluZGV4IDwgbnVtQ1NTUHJvcGVydGllcykgewotICAgICAgICAgICAg
aW50IGkgPSBnUHJvcGVydHlXcmFwcGVyTWFwW3Byb3BJbmRleF07Ci0gICAgICAgICAgICByZXR1
cm4gKGkgPj0gMCkgPyAoKmdQcm9wZXJ0eVdyYXBwZXJzKVtpXS0+ZXF1YWxzKGEsIGIpIDogdHJ1
ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gc3RhdGljCi1p
bnQgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OmdldFByb3BlcnR5QXRJbmRleChpbnQgaSkK
LXsKLSAgICBpZiAoaSA8IDAgfHwgaSA+PSAoaW50KSBnUHJvcGVydHlXcmFwcGVycy0+c2l6ZSgp
KQotICAgICAgICByZXR1cm4gQ1NTUHJvcGVydHlJbnZhbGlkOwotICAgICAgICAKLSAgICByZXR1
cm4gKCpnUHJvcGVydHlXcmFwcGVycylbaV0tPnByb3BlcnR5KCk7Ci19Ci0gICAgCi0vLyBzdGF0
aWMgLSByZXR1cm4gdHJ1ZSBpZiB3ZSBuZWVkIHRvIHN0YXJ0IHNvZnR3YXJlIGFuaW1hdGlvbiB0
aW1lcnMKLWJvb2wgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OmJsZW5kUHJvcGVydGllcyhp
bnQgcHJvcCwgUmVuZGVyU3R5bGUqIGRzdCwgY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJl
bmRlclN0eWxlKiBiLCBkb3VibGUgcHJvZykKLXsKLSAgICBpZiAocHJvcCA9PSBjQW5pbWF0ZUFs
bCkgewotICAgICAgICBBU1NFUlQoMCk7Ci0gICAgICAgIGJvb2wgbmVlZHNUaW1lciA9IGZhbHNl
OwotICAgIAotICAgICAgICBzaXplX3QgbiA9IGdQcm9wZXJ0eVdyYXBwZXJzLT5zaXplKCk7Ci0g
ICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgICAg
ICBQcm9wZXJ0eVdyYXBwZXJCYXNlKiB3cmFwcGVyID0gKCpnUHJvcGVydHlXcmFwcGVycylbaV07
Ci0gICAgICAgICAgICBpZiAoIXdyYXBwZXItPmVxdWFscyhhLCBiKSkgewotICAgICAgICAgICAg
ICAgIHdyYXBwZXItPmJsZW5kKGRzdCwgYSwgYiwgcHJvZyk7Ci0gICAgICAgICAgICAgICAgbmVl
ZHNUaW1lciA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJu
IG5lZWRzVGltZXI7Ci0gICAgfQotICAgIAotICAgIGludCBwcm9wSW5kZXggPSBwcm9wIC0gZmly
c3RDU1NQcm9wZXJ0eTsKLSAgICBpZiAocHJvcEluZGV4ID49IDAgJiYgcHJvcEluZGV4IDwgbnVt
Q1NTUHJvcGVydGllcykgewotICAgICAgICBpbnQgaSA9IGdQcm9wZXJ0eVdyYXBwZXJNYXBbcHJv
cEluZGV4XTsKLSAgICAgICAgaWYgKGkgPj0gMCkgewotICAgICAgICAgICAgUHJvcGVydHlXcmFw
cGVyQmFzZSogd3JhcHBlciA9ICgqZ1Byb3BlcnR5V3JhcHBlcnMpW2ldOwotICAgICAgICAgICAg
d3JhcHBlci0+YmxlbmQoZHN0LCBhLCBiLCBwcm9nKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVl
OwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBmYWxzZTsKLX0KLQogQ29tcG9z
aXRlQW5pbWF0aW9uKiBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6YWNjZXNzQ29tcG9zaXRl
QW5pbWF0aW9uKFJlbmRlck9iamVjdCogcmVuZGVyZXIpCiB7CiAgICAgQ29tcG9zaXRlQW5pbWF0
aW9uKiBhbmltYXRpb24gPSBtX2NvbXBvc2l0ZUFuaW1hdGlvbnMuZ2V0KHJlbmRlcmVyKTsKICAg
ICBpZiAoIWFuaW1hdGlvbikgewotICAgICAgICBhbmltYXRpb24gPSBuZXcgQ29tcG9zaXRlQW5p
bWF0aW9uKHRoaXMpOworICAgICAgICBhbmltYXRpb24gPSBuZXcgQ29tcG9zaXRlQW5pbWF0aW9u
KG1fZnJhbWUtPmFuaW1hdGlvbigpKTsKICAgICAgICAgbV9jb21wb3NpdGVBbmltYXRpb25zLnNl
dChyZW5kZXJlciwgYW5pbWF0aW9uKTsKICAgICB9CiAgICAgcmV0dXJuIGFuaW1hdGlvbjsKQEAg
LTEyOTUsOSArMTA2LDYgQEAgYm9vbCBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6Y2xlYXIo
UgogCiB2b2lkIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpzdHlsZUF2YWlsYWJsZSgpCiB7
Ci0gICAgaWYgKG1fbnVtU3R5bGVBdmFpbGFibGVXYWl0ZXJzID09IDApCi0gICAgICAgIHJldHVy
bjsKLSAgICAKICAgICBSZW5kZXJPYmplY3RBbmltYXRpb25NYXA6OmNvbnN0X2l0ZXJhdG9yIGFu
aW1hdGlvbnNFbmQgPSBtX2NvbXBvc2l0ZUFuaW1hdGlvbnMuZW5kKCk7CiAgICAgZm9yIChSZW5k
ZXJPYmplY3RBbmltYXRpb25NYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9jb21wb3NpdGVBbmlt
YXRpb25zLmJlZ2luKCk7IAogICAgICAgICAgaXQgIT0gYW5pbWF0aW9uc0VuZDsgKytpdCkgewpA
QCAtMTM1Myw3ICsxNjEsMTAgQEAgdm9pZCBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6YW5p
bWF0aQogICAgICAgICBpZiAoIWNvbXBBbmltLT5zdXNwZW5kZWQoKSAmJiBjb21wQW5pbS0+YW5p
bWF0aW5nKCkpIHsKICAgICAgICAgICAgIGFuaW1hdGluZyA9IHRydWU7CiAgICAgICAgICAgICBj
b21wQW5pbS0+c2V0QW5pbWF0aW5nKGZhbHNlKTsKLSAgICAgICAgICAgIHNldENoYW5nZWQocmVu
ZGVyZXItPmVsZW1lbnQoKSk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIE5vZGUqIG5vZGUg
PSByZW5kZXJlci0+ZWxlbWVudCgpOworICAgICAgICAgICAgQVNTRVJUKCFub2RlIHx8IChub2Rl
LT5kb2N1bWVudCgpICYmICFub2RlLT5kb2N1bWVudCgpLT5pblBhZ2VDYWNoZSgpKSk7CisgICAg
ICAgICAgICBub2RlLT5zZXRDaGFuZ2VkKEFuaW1hdGlvblN0eWxlQ2hhbmdlKTsKICAgICAgICAg
fQogICAgIH0KICAgICAKQEAgLTEzOTgsNjc5ICsyMDksOSBAQCB2b2lkIEFuaW1hdGlvbkNvbnRy
b2xsZXJQcml2YXRlOjpyZXN1bWVBCiAgICAgdXBkYXRlQW5pbWF0aW9uVGltZXIoKTsKIH0KIAot
dm9pZCBDb21wb3NpdGVBbmltYXRpb246OnVwZGF0ZVRyYW5zaXRpb25zKFJlbmRlck9iamVjdCog
cmVuZGVyZXIsIGNvbnN0IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUsIFJlbmRlclN0eWxlKiB0
YXJnZXRTdHlsZSkKLXsKLSAgICAvLyBJZiBjdXJyZW50U3R5bGUgaXMgbnVsbCwgd2UgZG9uJ3Qg
ZG8gdHJhbnNpdGlvbnMKLSAgICBpZiAoIWN1cnJlbnRTdHlsZSB8fCAhdGFyZ2V0U3R5bGUtPnRy
YW5zaXRpb25zKCkpCi0gICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgLy8gQ2hlY2sgdG8g
c2VlIGlmIHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBhY3RpdmUgdHJhbnNpdGlvbnMKLSAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IHRhcmdldFN0eWxlLT50cmFuc2l0aW9ucygpLT5zaXplKCk7ICsr
aSkgewotICAgICAgICBjb25zdCBBbmltYXRpb24qIGFuaW0gPSAoKnRhcmdldFN0eWxlLT50cmFu
c2l0aW9ucygpKVtpXS5nZXQoKTsKLSAgICAgICAgZG91YmxlIGR1cmF0aW9uID0gYW5pbS0+ZHVy
YXRpb24oKTsKLSAgICAgICAgZG91YmxlIGRlbGF5ID0gYW5pbS0+ZGVsYXkoKTsKLQotICAgICAg
ICAvLyBJZiB0aGlzIGlzIGFuIGVtcHR5IHRyYW5zaXRpb24sIHNraXAgaXQKLSAgICAgICAgaWYg
KGR1cmF0aW9uID09IDAgJiYgZGVsYXkgPD0gMCkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAg
ICAgICAgCi0gICAgICAgIGludCBwcm9wID0gYW5pbS0+cHJvcGVydHkoKTsKLSAgICAgICAgYm9v
bCBhbGwgPSBwcm9wID09IGNBbmltYXRlQWxsOwotICAgICAgICAKLSAgICAgICAgLy8gSGFuZGxl
IGJvdGggdGhlICdhbGwnIGFuZCBzaW5nbGUgcHJvcGVydHkgY2FzZXMuIEZvciB0aGUgc2luZ2xl
IHByb3AgY2FzZSwgd2UgbWFrZSBvbmx5IG9uZSBwYXNzCi0gICAgICAgIC8vIHRocm91Z2ggdGhl
IGxvb3AKLSAgICAgICAgZm9yIChpbnQgcHJvcGVydHlJbmRleCA9IDA7IDsgKytwcm9wZXJ0eUlu
ZGV4KSB7Ci0gICAgICAgICAgICBpZiAoYWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3Bl
cnR5SW5kZXggPj0gQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OmdldE51bVByb3BlcnRpZXMo
KSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHRo
ZSBuZXh0IHByb3AKLSAgICAgICAgICAgICAgICBwcm9wID0gQW5pbWF0aW9uQ29udHJvbGxlclBy
aXZhdGU6OmdldFByb3BlcnR5QXRJbmRleChwcm9wZXJ0eUluZGV4KTsKLSAgICAgICAgICAgIH0K
LQotICAgICAgICAgICAgLy8gSW1wbGljaXRBbmltYXRpb25zIGFyZSBhbHdheXMgaGFzaGVkIGJ5
IGFjdHVhbCBwcm9wZXJ0aWVzLCBuZXZlciBjQW5pbWF0ZUFsbAotICAgICAgICAgICAgQVNTRVJU
KHByb3AgPiBmaXJzdENTU1Byb3BlcnR5ICYmIHByb3AgPCAoZmlyc3RDU1NQcm9wZXJ0eSArIG51
bUNTU1Byb3BlcnRpZXMpKTsKLQotICAgICAgICAgICAgLy8gU2VlIGlmIHRoZXJlIGlzIGEgY3Vy
cmVudCB0cmFuc2l0aW9uIGZvciB0aGlzIHByb3AKLSAgICAgICAgICAgIEltcGxpY2l0QW5pbWF0
aW9uKiBpbXBsQW5pbSA9IG1fdHJhbnNpdGlvbnMuZ2V0KHByb3ApOwotICAgICAgICAgICAgYm9v
bCBlcXVhbCA9IHRydWU7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChpbXBsQW5pbSkg
ewotICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG9uZSwgaGFzIG91ciB0YXJnZXQgY2hhbmdl
ZD8KLSAgICAgICAgICAgICAgICBpZiAoIWltcGxBbmltLT5pc1RhcmdldFByb3BlcnR5RXF1YWwo
cHJvcCwgdGFyZ2V0U3R5bGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGltcGxBbmltLT5yZXNl
dChyZW5kZXJlcik7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpbXBsQW5pbTsKLSAgICAg
ICAgICAgICAgICAgICAgbV90cmFuc2l0aW9ucy5yZW1vdmUocHJvcCk7Ci0gICAgICAgICAgICAg
ICAgICAgIGVxdWFsID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBl
bHNlIHsKLSAgICAgICAgICAgICAgICAvLyBTZWUgaWYgd2UgbmVlZCB0byBzdGFydCBhIG5ldyB0
cmFuc2l0aW9uCi0gICAgICAgICAgICAgICAgZXF1YWwgPSBBbmltYXRpb25Db250cm9sbGVyUHJp
dmF0ZTo6cHJvcGVydGllc0VxdWFsKHByb3AsIGN1cnJlbnRTdHlsZSwgdGFyZ2V0U3R5bGUpOwot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIWVxdWFsKSB7Ci0g
ICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBuZXcgdHJhbnNpdGlvbgotICAgICAgICAgICAgICAg
IEltcGxpY2l0QW5pbWF0aW9uKiBhbmltYXRpb24gPSBuZXcgSW1wbGljaXRBbmltYXRpb24oY29u
c3RfY2FzdDxBbmltYXRpb24qPihhbmltKSwgcHJvcCwgcmVuZGVyZXIsIHRoaXMpOwotICAgICAg
ICAgICAgICAgIG1fdHJhbnNpdGlvbnMuc2V0KHByb3AsIGFuaW1hdGlvbik7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFdlIG9ubHkgbmVlZCBvbmUgcGFzcyBm
b3IgdGhlIHNpbmdsZSBwcm9wIGNhc2UKLSAgICAgICAgICAgIGlmICghYWxsKQotICAgICAgICAg
ICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIENvbXBvc2l0ZUFuaW1h
dGlvbjo6dXBkYXRlS2V5ZnJhbWVBbmltYXRpb25zKFJlbmRlck9iamVjdCogcmVuZGVyZXIsIGNv
bnN0IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUsIFJlbmRlclN0eWxlKiB0YXJnZXRTdHlsZSkK
LXsKLSAgICAvLyBOb3RoaW5nIHRvIGRvIGlmIHdlIGRvbid0IGhhdmUgYW55IGFuaW1hdGlvbnMs
IGFuZCBkaWRuJ3QgaGF2ZSBhbnkgYmVmb3JlCi0gICAgaWYgKG1fa2V5ZnJhbWVBbmltYXRpb25z
LmlzRW1wdHkoKSAmJiAhdGFyZ2V0U3R5bGUtPmhhc0FuaW1hdGlvbnMoKSkKLSAgICAgICAgcmV0
dXJuOwotICAgIAotICAgIC8vIE5vdGhpbmcgdG8gZG8gaWYgdGhlIGN1cnJlbnQgYW5kIHRhcmdl
dCBhbmltYXRpb25zIGFyZSB0aGUgc2FtZQotICAgIGlmIChjdXJyZW50U3R5bGUgJiYgY3VycmVu
dFN0eWxlLT5oYXNBbmltYXRpb25zKCkgJiYgdGFyZ2V0U3R5bGUtPmhhc0FuaW1hdGlvbnMoKSAm
JiAqKGN1cnJlbnRTdHlsZS0+YW5pbWF0aW9ucygpKSA9PSAqKHRhcmdldFN0eWxlLT5hbmltYXRp
b25zKCkpKQotICAgICAgICByZXR1cm47Ci0gICAgICAgIAotICAgIGludCBudW1BbmltcyA9IDA7
Ci0gICAgYm9vbCBhbmltc0NoYW5nZWQgPSBmYWxzZTsKLSAgICAKLSAgICAvLyBzZWUgaWYgdGhl
IGxpc3RzIG1hdGNoCi0gICAgaWYgKHRhcmdldFN0eWxlLT5hbmltYXRpb25zKCkpIHsKLSAgICAg
ICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YXJnZXRTdHlsZS0+YW5pbWF0aW9ucygpLT5zaXpl
KCk7ICsraSkgewotICAgICAgICAgICAgY29uc3QgQW5pbWF0aW9uKiBhbmltID0gKCp0YXJnZXRT
dHlsZS0+YW5pbWF0aW9ucygpKVtpXS5nZXQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAg
aWYgKCFhbmltLT5pc1ZhbGlkQW5pbWF0aW9uKCkpCi0gICAgICAgICAgICAgICAgYW5pbXNDaGFu
Z2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIEF0b21pY1N0
cmluZyBuYW1lKGFuaW0tPm5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgS2V5ZnJhbWVBbmltYXRp
b24qIGtmQW5pbSA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmdldChuYW1lLmltcGwoKSk7Ci0gICAg
ICAgICAgICAgICAgaWYgKCFrZkFuaW0gfHwgIWtmQW5pbS0+YW5pbWF0aW9uc01hdGNoKGFuaW0p
KQotICAgICAgICAgICAgICAgICAgICBhbmltc0NoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAg
ICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW0pIHsKLSAgICAgICAgICAgICAg
ICAgICAgICAgIC8vIGFuaW1hdGlvbnMgbWF0Y2gsIGJ1dCBwbGF5IHN0YXRlcyBtYXkgZGlmZmVy
LiB1cGRhdGUgaWYgbmVlZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICBrZkFuaW0tPnVwZGF0
ZVBsYXlTdGF0ZShhbmltLT5wbGF5U3RhdGUoKSA9PSBBbmltUGxheVN0YXRlUGxheWluZyk7Ci0g
ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCB0
aGUgc2F2ZWQgYW5pbWF0aW9uIHRvIHRoaXMgbmV3IG9uZSwganVzdCBpbiBjYXNlIHRoZSBwbGF5
IHN0YXRlIGhhcyBjaGFuZ2VkCi0gICAgICAgICAgICAgICAgICAgICAgICBrZkFuaW0tPnNldEFu
aW1hdGlvbihhbmltKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAg
ICAgICAgICAgKytudW1BbmltczsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZiAoIWFu
aW1zQ2hhbmdlZCAmJiBtX2tleWZyYW1lQW5pbWF0aW9ucy5zaXplKCkgIT0gbnVtQW5pbXMpCi0g
ICAgICAgIGFuaW1zQ2hhbmdlZCA9IHRydWU7Ci0KLSAgICBpZiAoIWFuaW1zQ2hhbmdlZCkKLSAg
ICAgICAgcmV0dXJuOwotCi0gICAgLy8gYW5pbWF0aW9ucyBoYXZlIGNoYW5nZWQsIHVwZGF0ZSB0
aGUgbGlzdAotICAgIHJlc2V0QW5pbWF0aW9ucyhyZW5kZXJlcik7Ci0KLSAgICBpZiAoIXRhcmdl
dFN0eWxlLT5hbmltYXRpb25zKCkpCi0gICAgICAgIHJldHVybjsKLQotICAgIC8vIGFkZCBhbGwg
dGhlIG5ldyBhbmltYXRpb25zCi0gICAgaW50IGluZGV4ID0gMDsKLSAgICBmb3IgKHNpemVfdCBp
ID0gMDsgaSA8IHRhcmdldFN0eWxlLT5hbmltYXRpb25zKCktPnNpemUoKTsgKytpKSB7Ci0gICAg
ICAgIGNvbnN0IEFuaW1hdGlvbiogYW5pbSA9ICgqdGFyZ2V0U3R5bGUtPmFuaW1hdGlvbnMoKSlb
aV0uZ2V0KCk7Ci0KLSAgICAgICAgaWYgKCFhbmltLT5pc1ZhbGlkQW5pbWF0aW9uKCkpCi0gICAg
ICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIAotICAgICAgICAvLyBkb24ndCBib3RoZXIg
YWRkaW5nIHRoZSBhbmltYXRpb24gaWYgaXQgaGFzIG5vIGtleWZyYW1lcyBvciB3b24ndCBhbmlt
YXRlCi0gICAgICAgIGlmICgoYW5pbS0+ZHVyYXRpb24oKSB8fCBhbmltLT5kZWxheSgpKSAmJiBh
bmltLT5pdGVyYXRpb25Db3VudCgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGFuaW0tPmtleWZyYW1lTGlzdCgpLmdldCgpICYmICFhbmltLT5rZXlmcmFt
ZUxpc3QoKS0+aXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbioga2Zh
bmltID0gbmV3IEtleWZyYW1lQW5pbWF0aW9uKGNvbnN0X2Nhc3Q8QW5pbWF0aW9uKj4oYW5pbSks
IHJlbmRlcmVyLCBpbmRleCsrLCB0aGlzKTsKLSAgICAgICAgICAgIG1fa2V5ZnJhbWVBbmltYXRp
b25zLnNldChrZmFuaW0tPm5hbWUoKS5pbXBsKCksIGtmYW5pbSk7Ci0gICAgICAgIH0KLSAgICB9
Ci19Ci0KLUtleWZyYW1lQW5pbWF0aW9uKiBDb21wb3NpdGVBbmltYXRpb246OmZpbmRLZXlmcmFt
ZUFuaW1hdGlvbihjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUpCi17Ci0gICAgcmV0dXJuIG1fa2V5
ZnJhbWVBbmltYXRpb25zLmdldChuYW1lLmltcGwoKSk7Ci19Ci0KLVJlbmRlclN0eWxlKiBDb21w
b3NpdGVBbmltYXRpb246OmFuaW1hdGUoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVu
ZGVyU3R5bGUqIGN1cnJlbnRTdHlsZSwgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlKQotewotICAg
IFJlbmRlclN0eWxlKiByZXN1bHRTdHlsZSA9IDA7Ci0gICAgCi0gICAgLy8gV2UgZG9uJ3QgZG8g
YW55IHRyYW5zaXRpb25zIGlmIHdlIGRvbid0IGhhdmUgYSBjdXJyZW50U3R5bGUgKG9uIHN0YXJ0
dXApCi0gICAgdXBkYXRlVHJhbnNpdGlvbnMocmVuZGVyZXIsIGN1cnJlbnRTdHlsZSwgdGFyZ2V0
U3R5bGUpOwotICAgIAotICAgIGlmIChjdXJyZW50U3R5bGUpIHsKLSAgICAgICAgLy8gTm93IHRo
YXQgd2UgaGF2ZSB0cmFuc2l0aW9uIG9iamVjdHMgcmVhZHksIGxldCB0aGVtIGtub3cgYWJvdXQg
dGhlIG5ldyBnb2FsIHN0YXRlLiAgV2Ugd2FudCB0aGVtCi0gICAgICAgIC8vIHRvIGZpbGwgaW4g
YSBSZW5kZXJTdHlsZSomIG9ubHkgaWYgbmVlZGVkLgotICAgICAgICBDU1NQcm9wZXJ0eVRyYW5z
aXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3RyYW5zaXRpb25zLmVuZCgpOwotICAg
ICAgICBmb3IgKENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0g
bV90cmFuc2l0aW9ucy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgICAgIElt
cGxpY2l0QW5pbWF0aW9uKiAgYW5pbSA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgICAgICBpZiAoYW5p
bSkgewotICAgICAgICAgICAgICAgIGFuaW0tPmFuaW1hdGUodGhpcywgcmVuZGVyZXIsIGN1cnJl
bnRTdHlsZSwgdGFyZ2V0U3R5bGUsIHJlc3VsdFN0eWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgfQotICAgIH0KLQotICAgIHVwZGF0ZUtleWZyYW1lQW5pbWF0aW9ucyhyZW5kZXJlciwgY3Vy
cmVudFN0eWxlLCB0YXJnZXRTdHlsZSk7Ci0KLSAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGFuaW1h
dGlvbiBvYmplY3RzIHJlYWR5LCBsZXQgdGhlbSBrbm93IGFib3V0IHRoZSBuZXcgZ29hbCBzdGF0
ZS4gIFdlIHdhbnQgdGhlbQotICAgIC8vIHRvIGZpbGwgaW4gYSBSZW5kZXJTdHlsZSomIG9ubHkg
aWYgbmVlZGVkLgotICAgIGlmICh0YXJnZXRTdHlsZS0+aGFzQW5pbWF0aW9ucygpKSB7Ci0gICAg
ICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGFyZ2V0U3R5bGUtPmFuaW1hdGlvbnMoKS0+c2l6
ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGNvbnN0IEFuaW1hdGlvbiogYW5pbSA9ICgqdGFyZ2V0
U3R5bGUtPmFuaW1hdGlvbnMoKSlbaV0uZ2V0KCk7Ci0KLSAgICAgICAgICAgIGlmIChhbmltLT5p
c1ZhbGlkQW5pbWF0aW9uKCkpIHsKLSAgICAgICAgICAgICAgICBBdG9taWNTdHJpbmcgbmFtZShh
bmltLT5uYW1lKCkpOwotICAgICAgICAgICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBrZXlmcmFt
ZUFuaW0gPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5nZXQobmFtZS5pbXBsKCkpOwotICAgICAgICAg
ICAgICAgIGlmIChrZXlmcmFtZUFuaW0pCi0gICAgICAgICAgICAgICAgICAgIGtleWZyYW1lQW5p
bS0+YW5pbWF0ZSh0aGlzLCByZW5kZXJlciwgY3VycmVudFN0eWxlLCB0YXJnZXRTdHlsZSwgcmVz
dWx0U3R5bGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIGNs
ZWFudXBGaW5pc2hlZEFuaW1hdGlvbnMocmVuZGVyZXIpOwotCi0gICAgcmV0dXJuIHJlc3VsdFN0
eWxlID8gcmVzdWx0U3R5bGUgOiB0YXJnZXRTdHlsZTsKLX0KLQotLy8gImFuaW1hdGluZyIgbWVh
bnMgdGhhdCBzb21ldGhpbmcgaXMgcnVubmluZyB0aGF0IHJlcXVpcmVzIHRoZSB0aW1lciB0byBr
ZWVwIGZpcmluZwotLy8gKGUuZy4gYSB0cmFuc2l0aW9uKQotdm9pZCBDb21wb3NpdGVBbmltYXRp
b246OnNldEFuaW1hdGluZyhib29sIGluQW5pbWF0aW5nKQotewotICAgIENTU1Byb3BlcnR5VHJh
bnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7Ci0g
ICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1f
dHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIEltcGxpY2l0
QW5pbWF0aW9uKiAgdHJhbnNpdGlvbiA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIHRyYW5zaXRpb24t
PnNldEFuaW1hdGluZyhpbkFuaW1hdGluZyk7Ci0gICAgfQotCi0gICAgQW5pbWF0aW9uTmFtZU1h
cDo6Y29uc3RfaXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5lbmQoKTsKLSAg
ICBmb3IgKEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZUFu
aW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0ga2ZlbmQ7ICsraXQpIHsKLSAgICAgICAgS2V5ZnJhbWVB
bmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOwotICAgICAgICBhbmltLT5zZXRBbmltYXRpbmco
aW5BbmltYXRpbmcpOwotICAgIH0KLX0KLQotYm9vbCBDb21wb3NpdGVBbmltYXRpb246OmFuaW1h
dGluZygpCi17Ci0gICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3Ig
ZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKLSAgICBmb3IgKENTU1Byb3BlcnR5VHJhbnNpdGlv
bnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5iZWdpbigpOyBpdCAhPSBl
bmQ7ICsraXQpIHsKLSAgICAgICAgSW1wbGljaXRBbmltYXRpb24qICB0cmFuc2l0aW9uID0gaXQt
PnNlY29uZDsKLSAgICAgICAgaWYgKHRyYW5zaXRpb24gJiYgdHJhbnNpdGlvbi0+YW5pbWF0aW5n
KCkgJiYgdHJhbnNpdGlvbi0+cnVubmluZygpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0g
ICAgfQotICAgIAotICAgIEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0g
bV9rZXlmcmFtZUFuaW1hdGlvbnMuZW5kKCk7Ci0gICAgZm9yIChBbmltYXRpb25OYW1lTWFwOjpj
b25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IGtm
ZW5kOyArK2l0KSB7Ci0gICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29u
ZDsKLSAgICAgICAgaWYgKGFuaW0gJiYgIWFuaW0tPnBhdXNlZCgpICYmIGFuaW0tPmFuaW1hdGlu
ZygpICYmIGFuaW0tPmFjdGl2ZSgpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQot
Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6cmVzZXRU
cmFuc2l0aW9ucyhSZW5kZXJPYmplY3QqIHJlbmRlcmVyKQotewotICAgIENTU1Byb3BlcnR5VHJh
bnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7Ci0g
ICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1f
dHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIEltcGxpY2l0
QW5pbWF0aW9uKiAgdHJhbnNpdGlvbiA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIHRyYW5zaXRpb24t
PnJlc2V0KHJlbmRlcmVyKTsKLSAgICAgICAgZGVsZXRlIHRyYW5zaXRpb247Ci0gICAgfQotICAg
IG1fdHJhbnNpdGlvbnMuY2xlYXIoKTsKLX0KLQotdm9pZCBDb21wb3NpdGVBbmltYXRpb246OnJl
c2V0QW5pbWF0aW9ucyhSZW5kZXJPYmplY3QqIHJlbmRlcmVyKQotewotICAgIGRlbGV0ZUFsbFZh
bHVlcyhtX2tleWZyYW1lQW5pbWF0aW9ucyk7Ci0gICAgbV9rZXlmcmFtZUFuaW1hdGlvbnMuY2xl
YXIoKTsKLX0KLQotdm9pZCBDb21wb3NpdGVBbmltYXRpb246OmNsZWFudXBGaW5pc2hlZEFuaW1h
dGlvbnMoUmVuZGVyT2JqZWN0KiByZW5kZXJlcikKLXsKLSAgICBpZiAoc3VzcGVuZGVkKCkpCi0g
ICAgICAgIHJldHVybjsKLSAgICAKLSAgICAvLyBNYWtlIGEgbGlzdCBvZiB0cmFuc2l0aW9ucyB0
byBiZSBkZWxldGVkCi0gICAgVmVjdG9yPGludD4gZmluaXNoZWRUcmFuc2l0aW9uczsKLSAgICBD
U1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3RyYW5zaXRp
b25zLmVuZCgpOwotCi0gICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9p
dGVyYXRvciBpdCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0g
ICAgICAgIEltcGxpY2l0QW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKLSAgICAgICAgaWYg
KCFhbmltKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGlmIChhbmltLT5wb3N0YWN0
aXZlKCkgJiYgIWFuaW0tPndhaXRpbmdGb3JFbmRFdmVudCgpKQotICAgICAgICAgICAgZmluaXNo
ZWRUcmFuc2l0aW9ucy5hcHBlbmQoYW5pbS0+YW5pbWF0aW5nUHJvcGVydHkoKSk7Ci0gICAgfQot
ICAgIAotICAgIC8vIERlbGV0ZSB0aGVtCi0gICAgZm9yIChWZWN0b3I8aW50Pjo6aXRlcmF0b3Ig
aXQgPSBmaW5pc2hlZFRyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9IGZpbmlzaGVkVHJhbnNpdGlv
bnMuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgSW1wbGljaXRBbmltYXRpb24qIGFuaW0gPSBtX3Ry
YW5zaXRpb25zLmdldCgqaXQpOwotICAgICAgICBpZiAoYW5pbSkgewotICAgICAgICAgICAgYW5p
bS0+cmVzZXQocmVuZGVyZXIpOwotICAgICAgICAgICAgZGVsZXRlIGFuaW07Ci0gICAgICAgIH0K
LSAgICAgICAgbV90cmFuc2l0aW9ucy5yZW1vdmUoKml0KTsKLSAgICB9Ci0KLSAgICAvLyBNYWtl
IGEgbGlzdCBvZiBhbmltYXRpb25zIHRvIGJlIGRlbGV0ZWQKLSAgICBWZWN0b3I8QXRvbWljU3Ry
aW5nSW1wbCo+IGZpbmlzaGVkQW5pbWF0aW9uczsKLSAgICBBbmltYXRpb25OYW1lTWFwOjpjb25z
dF9pdGVyYXRvciBrZmVuZCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmVuZCgpOwotCi0gICAgZm9y
IChBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVBbmltYXRp
b25zLmJlZ2luKCk7IGl0ICE9IGtmZW5kOyArK2l0KSB7Ci0gICAgICAgIEtleWZyYW1lQW5pbWF0
aW9uKiBhbmltID0gaXQtPnNlY29uZDsKLSAgICAgICAgaWYgKCFhbmltKQotICAgICAgICAgICAg
Y29udGludWU7Ci0gICAgICAgIGlmIChhbmltLT5wb3N0YWN0aXZlKCkgJiYgIWFuaW0tPndhaXRp
bmdGb3JFbmRFdmVudCgpKQotICAgICAgICAgICAgZmluaXNoZWRBbmltYXRpb25zLmFwcGVuZChh
bmltLT5uYW1lKCkuaW1wbCgpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gZGVsZXRlIHRoZW0KLSAg
ICBmb3IgKFZlY3RvcjxBdG9taWNTdHJpbmdJbXBsKj46Oml0ZXJhdG9yIGl0ID0gZmluaXNoZWRB
bmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IGZpbmlzaGVkQW5pbWF0aW9ucy5lbmQoKTsgKytpdCkg
ewotICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbioga2ZhbmltID0gbV9rZXlmcmFtZUFuaW1hdGlv
bnMuZ2V0KCppdCk7Ci0gICAgICAgIGlmIChrZmFuaW0pIHsKLSAgICAgICAgICAgIGtmYW5pbS0+
cmVzZXQocmVuZGVyZXIpOwotICAgICAgICAgICAgZGVsZXRlIGtmYW5pbTsKLSAgICAgICAgfQot
ICAgICAgICBtX2tleWZyYW1lQW5pbWF0aW9ucy5yZW1vdmUoKml0KTsKLSAgICB9Ci19Ci0KLXZv
aWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpzZXRBbmltYXRpb25TdGFydFRpbWUoZG91YmxlIHQpCi17
Ci0gICAgLy8gc2V0IHN0YXJ0IHRpbWUgb24gYWxsIGFuaW1hdGlvbnMgd2FpdGluZyBmb3IgaXQK
LSAgICBBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBrZmVuZCA9IG1fa2V5ZnJhbWVB
bmltYXRpb25zLmVuZCgpOwotICAgIGZvciAoQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0
b3IgaXQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBrZmVuZDsgKytpdCkg
ewotICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7Ci0gICAgICAg
IGlmIChhbmltICYmIGFuaW0tPndhaXRpbmdGb3JTdGFydFRpbWUoKSkKLSAgICAgICAgICAgIGFu
aW0tPnVwZGF0ZVN0YXRlTWFjaGluZShBbmltYXRpb25CYXNlOjpTVEFURV9JTlBVVF9TVEFSVF9U
SU1FX1NFVCwgdCk7Ci0gICAgfQotfQotCi12b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6c2V0VHJh
bnNpdGlvblN0YXJ0VGltZShpbnQgcHJvcGVydHksIGRvdWJsZSB0KQotewotICAgIC8vIFNldCB0
aGUgc3RhcnQgdGltZSBmb3IgZ2l2ZW4gcHJvcGVydHkgdHJhbnNpdGlvbgotICAgIENTU1Byb3Bl
cnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5k
KCk7Ci0gICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBp
dCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIElt
cGxpY2l0QW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKLSAgICAgICAgaWYgKGFuaW0gJiYg
YW5pbS0+d2FpdGluZ0ZvclN0YXJ0VGltZSgpICYmIGFuaW0tPmFuaW1hdGluZ1Byb3BlcnR5KCkg
PT0gcHJvcGVydHkpCi0gICAgICAgICAgICBhbmltLT51cGRhdGVTdGF0ZU1hY2hpbmUoQW5pbWF0
aW9uQmFzZTo6U1RBVEVfSU5QVVRfU1RBUlRfVElNRV9TRVQsIHQpOwotICAgIH0KLX0KLQotdm9p
ZCBDb21wb3NpdGVBbmltYXRpb246OnN1c3BlbmRBbmltYXRpb25zKCkKLXsKLSAgICBpZiAobV9z
dXNwZW5kZWQpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICBtX3N1c3BlbmRlZCA9IHRydWU7
Ci0KLSAgICBBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBrZmVuZCA9IG1fa2V5ZnJh
bWVBbmltYXRpb25zLmVuZCgpOwotICAgIGZvciAoQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRl
cmF0b3IgaXQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBrZmVuZDsgKytp
dCkgewotICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7Ci0gICAg
ICAgIGlmIChhbmltKQotICAgICAgICAgICAgYW5pbS0+dXBkYXRlUGxheVN0YXRlKGZhbHNlKTsK
LSAgICB9Ci0KLSAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBl
bmQgPSBtX3RyYW5zaXRpb25zLmVuZCgpOwotICAgIGZvciAoQ1NTUHJvcGVydHlUcmFuc2l0aW9u
c01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9IGVu
ZDsgKytpdCkgewotICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7
Ci0gICAgICAgIGlmIChhbmltICYmIGFuaW0tPmhhc1N0eWxlKCkpCi0gICAgICAgICAgICBhbmlt
LT51cGRhdGVQbGF5U3RhdGUoZmFsc2UpOwotICAgIH0KLX0KLQotdm9pZCBDb21wb3NpdGVBbmlt
YXRpb246OnJlc3VtZUFuaW1hdGlvbnMoKQotewotICAgIGlmICghbV9zdXNwZW5kZWQpCi0gICAg
ICAgIHJldHVybjsKLSAgICAKLSAgICBtX3N1c3BlbmRlZCA9IGZhbHNlOwotICAgIAotICAgIEFu
aW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlmcmFtZUFuaW1hdGlv
bnMuZW5kKCk7Ci0gICAgZm9yIChBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9
IG1fa2V5ZnJhbWVBbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IGtmZW5kOyArK2l0KSB7Ci0gICAg
ICAgIEtleWZyYW1lQW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKLSAgICAgICAgaWYgKGFu
aW0gJiYgYW5pbS0+cGxheVN0YXRlUGxheWluZygpKQotICAgICAgICAgICAgYW5pbS0+dXBkYXRl
UGxheVN0YXRlKHRydWUpOwotICAgIH0KLSAgICAKLSAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25z
TWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3RyYW5zaXRpb25zLmVuZCgpOwotICAgIGZvciAo
Q1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRp
b25zLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBJbXBsaWNpdEFuaW1hdGlv
biogYW5pbSA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIGlmIChhbmltICYmIGFuaW0tPmhhc1N0eWxl
KCkpCi0gICAgICAgICAgICBhbmltLT51cGRhdGVQbGF5U3RhdGUodHJ1ZSk7Ci0gICAgfQotfQot
Ci12b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6b3ZlcnJpZGVJbXBsaWNpdEFuaW1hdGlvbnMoaW50
IHByb3BlcnR5KQotewotICAgIENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJh
dG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7Ci0gICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5z
aXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQg
IT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIEltcGxpY2l0QW5pbWF0aW9uKiBhbmltID0gaXQtPnNl
Y29uZDsKLSAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+YW5pbWF0aW5nUHJvcGVydHkoKSA9PSBw
cm9wZXJ0eSkKLSAgICAgICAgICAgIGFuaW0tPnNldE92ZXJyaWRkZW4odHJ1ZSk7Ci0gICAgfQot
fQotCi12b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6cmVzdW1lT3ZlcnJpZGRlbkltcGxpY2l0QW5p
bWF0aW9ucyhpbnQgcHJvcGVydHkpCi17Ci0gICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6
Y29uc3RfaXRlcmF0b3IgZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKLSAgICBmb3IgKENTU1By
b3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5i
ZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgSW1wbGljaXRBbmltYXRpb24qIGFu
aW0gPSBpdC0+c2Vjb25kOwotICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT5hbmltYXRpbmdQcm9w
ZXJ0eSgpID09IHByb3BlcnR5KQotICAgICAgICAgICAgYW5pbS0+c2V0T3ZlcnJpZGRlbihmYWxz
ZSk7Ci0gICAgfQotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgY29tcGFyZUFuaW1hdGlvbkluZGlj
ZXMoY29uc3QgS2V5ZnJhbWVBbmltYXRpb24qIGEsIGNvbnN0IEtleWZyYW1lQW5pbWF0aW9uKiBi
KQotewotICAgIHJldHVybiBhLT5pbmRleCgpIDwgYi0+aW5kZXgoKTsKLX0KLQotdm9pZCBDb21w
b3NpdGVBbmltYXRpb246OnN0eWxlQXZhaWxhYmxlKCkKLXsKLSAgICBpZiAobV9udW1TdHlsZUF2
YWlsYWJsZVdhaXRlcnMgPT0gMCkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIC8vIFdlIGhh
dmUgdG8gZ28gdGhyb3VnaCBhbmltYXRpb25zIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFw
cGVhciBpbgotICAgIC8vIHRoZSBzdHlsZSwgYmVjYXVzZSBvcmRlciBtYXR0ZXJzIGZvciBhZGRp
dGl2aXR5LgotICAgIFZlY3RvcjxLZXlmcmFtZUFuaW1hdGlvbio+IGFuaW1hdGlvbnMobV9rZXlm
cmFtZUFuaW1hdGlvbnMuc2l6ZSgpKTsKLSAgICBBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVy
YXRvciBrZmVuZCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmVuZCgpOwotICAgIHNpemVfdCBpID0g
MDsKLSAgICBmb3IgKEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlm
cmFtZUFuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0ga2ZlbmQ7ICsraXQpIHsKLSAgICAgICAgS2V5
ZnJhbWVBbmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOwotICAgICAgICAvLyBXZSBjYW4ndCBq
dXN0IGluc2VydCBiYXNlZCBvbiBhbmltLT5pbmRleCgpIGJlY2F1c2UgaW52YWxpZCBhbmltYXRp
b25zIGRvbid0Ci0gICAgICAgIC8vIG1ha2UgaXQgaW50byB0aGUgaGFzaC4KLSAgICAgICAgYW5p
bWF0aW9uc1tpKytdID0gYW5pbTsKLSAgICB9Ci0KLSAgICBpZiAoYW5pbWF0aW9ucy5zaXplKCkg
PiAxKQotICAgICAgICBzdGQ6OnN0YWJsZV9zb3J0KGFuaW1hdGlvbnMuYmVnaW4oKSwgYW5pbWF0
aW9ucy5lbmQoKSwgY29tcGFyZUFuaW1hdGlvbkluZGljZXMpOwotICAgIAotICAgIGZvciAoaSA9
IDA7IGkgPCBhbmltYXRpb25zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIEtleWZyYW1lQW5pbWF0
aW9uKiBhbmltID0gYW5pbWF0aW9uc1tpXTsKLSAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+d2Fp
dGluZ0ZvclN0eWxlQXZhaWxhYmxlKCkpCi0gICAgICAgICAgICBhbmltLT51cGRhdGVTdGF0ZU1h
Y2hpbmUoQW5pbWF0aW9uQmFzZTo6U1RBVEVfSU5QVVRfU1RZTEVfQVZBSUxBQkxFLCAtMSk7Ci0g
ICAgfQotICAgIAotICAgIENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9y
IGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7Ci0gICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRp
b25zTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0g
ZW5kOyArK2l0KSB7Ci0gICAgICAgIEltcGxpY2l0QW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29u
ZDsKLSAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+d2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKCkp
Ci0gICAgICAgICAgICBhbmltLT51cGRhdGVTdGF0ZU1hY2hpbmUoQW5pbWF0aW9uQmFzZTo6U1RB
VEVfSU5QVVRfU1RZTEVfQVZBSUxBQkxFLCAtMSk7Ci0gICAgfQotfQotCi1ib29sIENvbXBvc2l0
ZUFuaW1hdGlvbjo6aXNBbmltYXRpbmdQcm9wZXJ0eShpbnQgcHJvcGVydHksIGJvb2wgaXNSdW5u
aW5nTm93KSBjb25zdAotewotICAgIEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGtm
ZW5kID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuZW5kKCk7Ci0gICAgZm9yIChBbmltYXRpb25OYW1l
TWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmJlZ2luKCk7IGl0
ICE9IGtmZW5kOyArK2l0KSB7Ci0gICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBhbmltID0gaXQt
PnNlY29uZDsKLSAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+aXNBbmltYXRpbmdQcm9wZXJ0eShw
cm9wZXJ0eSwgaXNSdW5uaW5nTm93KSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0K
LSAgICAKLSAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBlbmQg
PSBtX3RyYW5zaXRpb25zLmVuZCgpOwotICAgIGZvciAoQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01h
cDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9IGVuZDsg
KytpdCkgewotICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7Ci0g
ICAgICAgIGlmIChhbmltICYmIGFuaW0tPmlzQW5pbWF0aW5nUHJvcGVydHkocHJvcGVydHksIGlz
UnVubmluZ05vdykpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJu
IGZhbHNlOwotfQotCi12b2lkIEltcGxpY2l0QW5pbWF0aW9uOjphbmltYXRlKENvbXBvc2l0ZUFu
aW1hdGlvbiogYW5pbWF0aW9uLCBSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBjb25zdCBSZW5kZXJT
dHlsZSogY3VycmVudFN0eWxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29u
c3QgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlLCBSZW5kZXJTdHlsZSomIGFuaW1hdGVkU3R5bGUp
Ci17Ci0gICAgaWYgKHBhdXNlZCgpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgLy8gSWYg
d2UgZ2V0IHRoaXMgZmFyIGFuZCB0aGUgYW5pbWF0aW9uIGlzIGRvbmUsIGl0IG1lYW5zIHdlIGFy
ZSBjbGVhbmluZyB1cCBhIGp1c3QgZmluaXNoZWQgYW5pbWF0aW9uLgotICAgIC8vIFNvIGp1c3Qg
cmV0dXJuLiBFdmVyeXRoaW5nIGlzIGFscmVhZHkgYWxsIGNsZWFuZWQgdXAKLSAgICBpZiAocG9z
dGFjdGl2ZSgpKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBSZXNldCB0byBzdGFydCB0aGUg
dHJhbnNpdGlvbiBpZiB3ZSBhcmUgbmV3Ci0gICAgaWYgKGlzbmV3KCkpCi0gICAgICAgIHJlc2V0
KHJlbmRlcmVyLCBjdXJyZW50U3R5bGUsIHRhcmdldFN0eWxlKTsKLSAgICAKLSAgICAvLyBSdW4g
YSBjeWNsZSBvZiBhbmltYXRpb24uCi0gICAgLy8gV2Uga25vdyB3ZSB3aWxsIG5lZWQgYSBuZXcg
cmVuZGVyIHN0eWxlLCBzbyBtYWtlIG9uZSBpZiBuZWVkZWQKLSAgICBpZiAoIWFuaW1hdGVkU3R5
bGUpCi0gICAgICAgIGFuaW1hdGVkU3R5bGUgPSBuZXcgKHJlbmRlcmVyLT5yZW5kZXJBcmVuYSgp
KSBSZW5kZXJTdHlsZSgqdGFyZ2V0U3R5bGUpOwotICAgIAotICAgIGRvdWJsZSBwcm9nID0gcHJv
Z3Jlc3MoMSwgMCk7Ci0gICAgYm9vbCBuZWVkc0FuaW0gPSBBbmltYXRpb25Db250cm9sbGVyUHJp
dmF0ZTo6YmxlbmRQcm9wZXJ0aWVzKG1fYW5pbWF0aW5nUHJvcGVydHksIGFuaW1hdGVkU3R5bGUs
IG1fZnJvbVN0eWxlLCBtX3RvU3R5bGUsIHByb2cpOwotICAgIGlmIChuZWVkc0FuaW0pCi0gICAg
ICAgIHNldEFuaW1hdGluZygpOwotfQotCi12b2lkIEltcGxpY2l0QW5pbWF0aW9uOjpvbkFuaW1h
dGlvbkVuZChkb3VibGUgaW5FbGFwc2VkVGltZSkKLXsKLSAgICBpZiAoIXNlbmRUcmFuc2l0aW9u
RXZlbnQoRXZlbnROYW1lczo6d2Via2l0VHJhbnNpdGlvbkVuZEV2ZW50LCBpbkVsYXBzZWRUaW1l
KSkgewotICAgICAgICAvLyBXZSBkaWRuJ3QgZGlzcGF0Y2ggYW4gZXZlbnQsIHdoaWNoIHdvdWxk
IGNhbGwgZW5kQW5pbWF0aW9uKCksIHNvIHdlJ2xsIGp1c3QgY2FsbCBpdCBoZXJlLgotICAgICAg
ICBlbmRBbmltYXRpb24odHJ1ZSk7Ci0gICAgfQotfQotCi1ib29sIEltcGxpY2l0QW5pbWF0aW9u
OjpzZW5kVHJhbnNpdGlvbkV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyYgaW5FdmVudFR5cGUsIGRv
dWJsZSBpbkVsYXBzZWRUaW1lKQotewotICAgIGlmIChpbkV2ZW50VHlwZSA9PSBFdmVudE5hbWVz
Ojp3ZWJraXRUcmFuc2l0aW9uRW5kRXZlbnQpIHsKLSAgICAgICAgRG9jdW1lbnQ6Okxpc3RlbmVy
VHlwZSBsaXN0ZW5lclR5cGUgPSBEb2N1bWVudDo6VFJBTlNJVElPTkVORF9MSVNURU5FUjsKLSAg
ICAgICAgCi0gICAgICAgIGlmIChzaG91bGRTZW5kRXZlbnRGb3JMaXN0ZW5lcihsaXN0ZW5lclR5
cGUpKSB7Ci0gICAgICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gZWxlbWVudEZvckV2ZW50RGlz
cGF0Y2goKTsKLSAgICAgICAgICAgIGlmIChlbGVtZW50KSB7Ci0gICAgICAgICAgICAgICAgU3Ry
aW5nIHByb3BlcnR5TmFtZTsKLSAgICAgICAgICAgICAgICBpZiAobV90cmFuc2l0aW9uUHJvcGVy
dHkgIT0gY0FuaW1hdGVBbGwpCi0gICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZSA9IFN0
cmluZyhnZXRQcm9wZXJ0eU5hbWUoKENTU1Byb3BlcnR5SUQpbV90cmFuc2l0aW9uUHJvcGVydHkp
KTsKLSAgICAgICAgICAgICAgICBtX3dhaXRpbmdGb3JFbmRFdmVudCA9IHRydWU7Ci0gICAgICAg
ICAgICAgICAgbV9hbmltYXRpb25FdmVudERpc3BhdGNoZXIuc3RhcnRUaW1lcihlbGVtZW50LCBw
cm9wZXJ0eU5hbWUsIG1fdHJhbnNpdGlvblByb3BlcnR5LCB0cnVlLCBpbkV2ZW50VHlwZSwgaW5F
bGFwc2VkVGltZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIERpZCBkaXNwYXRj
aCBhbiBldmVudAotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIHJl
dHVybiBmYWxzZTsgLy8gRGlkbid0IGRpc3BhdGNoIGFuIGV2ZW50Ci19Ci0KLXZvaWQgSW1wbGlj
aXRBbmltYXRpb246OnJlc2V0KFJlbmRlck9iamVjdCogcmVuZGVyZXIsIGNvbnN0IFJlbmRlclN0
eWxlKiBmcm9tIC8qID0gMCAqLywgY29uc3QgUmVuZGVyU3R5bGUqIHRvIC8qID0gMCAqLykKLXsK
LSAgICBBU1NFUlQoKCFtX3RvU3R5bGUgJiYgIXRvKSB8fCBtX3RvU3R5bGUgIT0gdG8pOwotICAg
IEFTU0VSVCgoIW1fZnJvbVN0eWxlICYmICFmcm9tKSB8fCBtX2Zyb21TdHlsZSAhPSBmcm9tKTsK
LSAgICBpZiAobV9mcm9tU3R5bGUpCi0gICAgICAgIG1fZnJvbVN0eWxlLT5kZXJlZihyZW5kZXJl
ci0+cmVuZGVyQXJlbmEoKSk7Ci0gICAgaWYgKG1fdG9TdHlsZSkKLSAgICAgICAgbV90b1N0eWxl
LT5kZXJlZihyZW5kZXJlci0+cmVuZGVyQXJlbmEoKSk7Ci0gICAgCi0gICAgbV9mcm9tU3R5bGUg
PSBjb25zdF9jYXN0PFJlbmRlclN0eWxlKj4oZnJvbSk7ICAgLy8gaXQgaXMgcmVhZC1vbmx5LCBv
dGhlciB0aGFuIHRoZSByZWYKLSAgICBpZiAobV9mcm9tU3R5bGUpCi0gICAgICAgIG1fZnJvbVN0
eWxlLT5yZWYoKTsKLSAgICAKLSAgICBtX3RvU3R5bGUgPSBjb25zdF9jYXN0PFJlbmRlclN0eWxl
Kj4odG8pOyAgICAgICAvLyBpdCBpcyByZWFkLW9ubHksIG90aGVyIHRoYW4gdGhlIHJlZgotICAg
IGlmIChtX3RvU3R5bGUpCi0gICAgICAgIG1fdG9TdHlsZS0+cmVmKCk7Ci0gICAgCi0gICAgLy8g
cmVzdGFydCB0aGUgdHJhbnNpdGlvbgotICAgIGlmIChmcm9tICYmIHRvKQotICAgICAgICB1cGRh
dGVTdGF0ZU1hY2hpbmUoU1RBVEVfSU5QVVRfUkVTVEFSVF9BTklNQVRJT04sIC0xKTsKLX0KLQot
dm9pZCBJbXBsaWNpdEFuaW1hdGlvbjo6c2V0T3ZlcnJpZGRlbihib29sIGIpCi17Ci0gICAgaWYg
KGIgIT0gbV9vdmVycmlkZGVuKSB7Ci0gICAgICAgIG1fb3ZlcnJpZGRlbiA9IGI7Ci0gICAgICAg
IHVwZGF0ZVN0YXRlTWFjaGluZShtX292ZXJyaWRkZW4gPyBTVEFURV9JTlBVVF9QQVVTRV9PVkVS
UklERSA6IFNUQVRFX0lOUFVUX1JFU1VNRV9PVkVSUklERSwgLTEpOwotICAgIH0KLX0KLQotYm9v
bCBJbXBsaWNpdEFuaW1hdGlvbjo6YWZmZWN0c1Byb3BlcnR5KGludCBwcm9wZXJ0eSkgY29uc3QK
LXsKLSAgICByZXR1cm4gKG1fYW5pbWF0aW5nUHJvcGVydHkgPT0gcHJvcGVydHkpOwotfQotCi1i
b29sIEltcGxpY2l0QW5pbWF0aW9uOjppc1RhcmdldFByb3BlcnR5RXF1YWwoaW50IHByb3AsIGNv
bnN0IFJlbmRlclN0eWxlKiB0YXJnZXRTdHlsZSkKLXsKLSAgICByZXR1cm4gQW5pbWF0aW9uQ29u
dHJvbGxlclByaXZhdGU6OnByb3BlcnRpZXNFcXVhbChwcm9wLCBtX3RvU3R5bGUsIHRhcmdldFN0
eWxlKTsKLX0KLQotdm9pZCBJbXBsaWNpdEFuaW1hdGlvbjo6YmxlbmRQcm9wZXJ0eVZhbHVlSW5T
dHlsZShpbnQgcHJvcCwgUmVuZGVyU3R5bGUqIGN1cnJlbnRTdHlsZSkKLXsKLSAgICBkb3VibGUg
cHJvZyA9IHByb2dyZXNzKDEsIDApOwotICAgIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpi
bGVuZFByb3BlcnRpZXMocHJvcCwgY3VycmVudFN0eWxlLCBtX2Zyb21TdHlsZSwgbV90b1N0eWxl
LCBwcm9nKTsKLX0gICAgCi0KLXZvaWQgS2V5ZnJhbWVBbmltYXRpb246OmFuaW1hdGUoQ29tcG9z
aXRlQW5pbWF0aW9uKiBhbmltYXRpb24sIFJlbmRlck9iamVjdCogcmVuZGVyZXIsIGNvbnN0IFJl
bmRlclN0eWxlKiBjdXJyZW50U3R5bGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY29uc3QgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlLCBSZW5kZXJTdHlsZSomIGFuaW1h
dGVkU3R5bGUpCi17Ci0gICAgLy8gaWYgd2UgaGF2ZSBub3QgeWV0IHN0YXJ0ZWQsIHdlIHdpbGwg
bm90IGhhdmUgYSB2YWxpZCBzdGFydCB0aW1lLCBzbyBqdXN0IHN0YXJ0IHRoZSBhbmltYXRpb24g
aWYgbmVlZGVkCi0gICAgaWYgKGlzbmV3KCkgJiYgbV9hbmltYXRpb24tPnBsYXlTdGF0ZSgpID09
IEFuaW1QbGF5U3RhdGVQbGF5aW5nKQotICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUoU1RBVEVf
SU5QVVRfU1RBUlRfQU5JTUFUSU9OLCAtMSk7Ci0gICAgCi0gICAgLy8gSWYgd2UgZ2V0IHRoaXMg
ZmFyIGFuZCB0aGUgYW5pbWF0aW9uIGlzIGRvbmUsIGl0IG1lYW5zIHdlIGFyZSBjbGVhbmluZyB1
cCBhIGp1c3QgZmluaXNoZWQgYW5pbWF0aW9uLgotICAgIC8vIElmIHNvLCB3ZSBuZWVkIHRvIHNl
bmQgYmFjayB0aGUgdGFyZ2V0U3R5bGUKLSAgICBpZiAocG9zdGFjdGl2ZSgpKSB7Ci0gICAgICAg
IGlmICghYW5pbWF0ZWRTdHlsZSkKLSAgICAgICAgICAgIGFuaW1hdGVkU3R5bGUgPSBjb25zdF9j
YXN0PFJlbmRlclN0eWxlKj4odGFyZ2V0U3R5bGUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQot
Ci0gICAgLy8gaWYgd2UgYXJlIHdhaXRpbmcgZm9yIHRoZSBzdGFydCB0aW1lciwgd2UgZG9uJ3Qg
d2FudCB0byBjaGFuZ2UgdGhlIHN0eWxlIHlldAotICAgIC8vIFNwZWNpYWwgY2FzZSAtIGlmIHRo
ZSBkZWxheSB0aW1lIGlzIDAsIHRoZW4gd2UgZG8gd2FudCB0byBzZXQgdGhlIGZpcnN0IGZyYW1l
IG9mIHRoZQotICAgIC8vIGFuaW1hdGlvbiByaWdodCBhd2F5LiBUaGlzIGF2b2lkcyBhIGZsYXNo
IHdoZW4gdGhlIGFuaW1hdGlvbiBzdGFydHMKLSAgICBpZiAod2FpdGluZ1RvU3RhcnQoKSAmJiBt
X2FuaW1hdGlvbi0+ZGVsYXkoKSA+IDApCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICAvLyBG
SVhNRTogd2UgbmVlZCB0byBiZSBtb3JlIGVmZmljaWVudCBhYm91dCBkZXRlcm1pbmluZyB3aGlj
aCBrZXlmcmFtZXMgd2UgYXJlIGFuaW1hdGluZyBiZXR3ZWVuLgotICAgIC8vIFdlIHNob3VsZCBj
YWNoZSB0aGUgbGFzdCBwYWlyIG9yIHNvbWV0aGluZwotICAgIAotICAgIC8vIGZpbmQgdGhlIGZp
cnN0IGtleQotICAgIGRvdWJsZSBlbGFwc2VkVGltZSA9IChtX3N0YXJ0VGltZSA+IDApID8gKCgh
cGF1c2VkKCkgPyBjdXJyZW50VGltZSgpIDogbV9wYXVzZVRpbWUpIC0gbV9zdGFydFRpbWUpIDog
MC4wOwotICAgIGlmIChlbGFwc2VkVGltZSA8IDAuMCkKLSAgICAgICAgZWxhcHNlZFRpbWUgPSAw
LjA7Ci0gICAgICAgIAotICAgIGRvdWJsZSB0ID0gbV9hbmltYXRpb24tPmR1cmF0aW9uKCkgPyAo
ZWxhcHNlZFRpbWUgLyBtX2FuaW1hdGlvbi0+ZHVyYXRpb24oKSkgOiAxLjA7Ci0gICAgaW50IGkg
PSAoaW50KSB0OwotICAgIHQgLT0gaTsKLSAgICBpZiAobV9hbmltYXRpb24tPmRpcmVjdGlvbigp
ICYmIChpICYgMSkpCi0gICAgICAgIHQgPSAxIC0gdDsKLQotICAgIFJlbmRlclN0eWxlKiBmcm9t
U3R5bGUgPSAwOwotICAgIFJlbmRlclN0eWxlKiB0b1N0eWxlID0gMDsKLSAgICBkb3VibGUgc2Nh
bGUgPSAxLjA7Ci0gICAgZG91YmxlIG9mZnNldCA9IDAuMDsKLSAgICBpZiAobV9rZXlmcmFtZXMu
Z2V0KCkpIHsKLSAgICAgICAgVmVjdG9yPEtleWZyYW1lVmFsdWU+Ojpjb25zdF9pdGVyYXRvciBl
bmQgPSBtX2tleWZyYW1lcy0+ZW5kS2V5ZnJhbWVzKCk7Ci0gICAgICAgIGZvciAoVmVjdG9yPEtl
eWZyYW1lVmFsdWU+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVzLT5iZWdpbktleWZy
YW1lcygpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgICAgIGlmICh0IDwgaXQtPmtleSkg
ewotICAgICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBrZXkgc2hvdWxkIGFsd2F5cyBiZSAwLCBz
byB3ZSBzaG91bGQgbmV2ZXIgc3VjY2VlZCBvbiB0aGUgZmlyc3Qga2V5Ci0gICAgICAgICAgICAg
ICAgaWYgKCFmcm9tU3R5bGUpCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgICAgIHNjYWxlID0gMS4wIC8gKGl0LT5rZXkgLSBvZmZzZXQpOwotICAgICAgICAgICAgICAg
IHRvU3R5bGUgPSBjb25zdF9jYXN0PFJlbmRlclN0eWxlKj4oJihpdC0+c3R5bGUpKTsKLSAgICAg
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAg
ICAgb2Zmc2V0ID0gaXQtPmtleTsKLSAgICAgICAgICAgIGZyb21TdHlsZSA9IGNvbnN0X2Nhc3Q8
UmVuZGVyU3R5bGUqPigmKGl0LT5zdHlsZSkpOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAg
IC8vIGlmIGVpdGhlciBzdHlsZSBpcyAwIHdlIGhhdmUgYW4gaW52YWxpZCBjYXNlLCBqdXN0IHN0
b3AgdGhlIGFuaW1hdGlvbgotICAgIGlmICghZnJvbVN0eWxlIHx8ICF0b1N0eWxlKSB7Ci0gICAg
ICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFURV9JTlBVVF9FTkRfQU5JTUFUSU9OLCAtMSk7Ci0g
ICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgCi0gICAgLy8gcnVuIGEgY3ljbGUgb2YgYW5pbWF0
aW9uLgotICAgIC8vIFdlIGtub3cgd2Ugd2lsbCBuZWVkIGEgbmV3IHJlbmRlciBzdHlsZSwgc28g
bWFrZSBvbmUgaWYgbmVlZGVkCi0gICAgaWYgKCFhbmltYXRlZFN0eWxlKQotICAgICAgICBhbmlt
YXRlZFN0eWxlID0gbmV3IChyZW5kZXJlci0+cmVuZGVyQXJlbmEoKSkgUmVuZGVyU3R5bGUoKnRh
cmdldFN0eWxlKTsKLSAgICAKLSAgICBkb3VibGUgcHJvZyA9IHByb2dyZXNzKHNjYWxlLCBvZmZz
ZXQpOwotCi0gICAgSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX2tleWZyYW1l
cy0+ZW5kUHJvcGVydGllcygpOwotICAgIGZvciAoSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRv
ciBpdCA9IG1fa2V5ZnJhbWVzLT5iZWdpblByb3BlcnRpZXMoKTsgaXQgIT0gZW5kOyArK2l0KSB7
Ci0gICAgICAgIGlmIChBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6YmxlbmRQcm9wZXJ0aWVz
KCppdCwgYW5pbWF0ZWRTdHlsZSwgZnJvbVN0eWxlLCB0b1N0eWxlLCBwcm9nKSkKLSAgICAgICAg
ICAgIHNldEFuaW1hdGluZygpOwotICAgIH0KLX0KLQotdm9pZCBLZXlmcmFtZUFuaW1hdGlvbjo6
ZW5kQW5pbWF0aW9uKGJvb2wgcmVzZXQpCi17Ci0gICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwg
KHVuYW5pbWF0ZWQpIHN0eWxlCi0gICAgaWYgKG1fb2JqZWN0KQotICAgICAgICBzZXRDaGFuZ2Vk
KG1fb2JqZWN0LT5lbGVtZW50KCkpOwotfQotCi12b2lkIEtleWZyYW1lQW5pbWF0aW9uOjpvbkFu
aW1hdGlvblN0YXJ0KGRvdWJsZSBpbkVsYXBzZWRUaW1lKQotewotICAgIHNlbmRBbmltYXRpb25F
dmVudChFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRpb25TdGFydEV2ZW50LCBpbkVsYXBzZWRUaW1l
KTsKLX0KLQotdm9pZCBLZXlmcmFtZUFuaW1hdGlvbjo6b25BbmltYXRpb25JdGVyYXRpb24oZG91
YmxlIGluRWxhcHNlZFRpbWUpCi17Ci0gICAgc2VuZEFuaW1hdGlvbkV2ZW50KEV2ZW50TmFtZXM6
OndlYmtpdEFuaW1hdGlvbkl0ZXJhdGlvbkV2ZW50LCBpbkVsYXBzZWRUaW1lKTsKLX0KLQotdm9p
ZCBLZXlmcmFtZUFuaW1hdGlvbjo6b25BbmltYXRpb25FbmQoZG91YmxlIGluRWxhcHNlZFRpbWUp
Ci17Ci0gICAgaWYgKCFzZW5kQW5pbWF0aW9uRXZlbnQoRXZlbnROYW1lczo6d2Via2l0QW5pbWF0
aW9uRW5kRXZlbnQsIGluRWxhcHNlZFRpbWUpKSB7Ci0gICAgICAgIC8vIFdlIGRpZG4ndCBkaXNw
YXRjaCBhbiBldmVudCwgd2hpY2ggd291bGQgY2FsbCBlbmRBbmltYXRpb24oKSwgc28gd2UnbGwg
anVzdCBjYWxsIGl0IGhlcmUuCi0gICAgICAgIGVuZEFuaW1hdGlvbih0cnVlKTsKLSAgICB9Ci19
Ci0KLWJvb2wgS2V5ZnJhbWVBbmltYXRpb246OnNlbmRBbmltYXRpb25FdmVudChjb25zdCBBdG9t
aWNTdHJpbmcmIGluRXZlbnRUeXBlLCBkb3VibGUgaW5FbGFwc2VkVGltZSkKLXsKLSAgICBEb2N1
bWVudDo6TGlzdGVuZXJUeXBlIGxpc3RlbmVyVHlwZTsKLSAgICBpZiAoaW5FdmVudFR5cGUgPT0g
RXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uSXRlcmF0aW9uRXZlbnQpCi0gICAgICAgIGxpc3Rl
bmVyVHlwZSA9IERvY3VtZW50OjpBTklNQVRJT05JVEVSQVRJT05fTElTVEVORVI7Ci0gICAgZWxz
ZSBpZiAoaW5FdmVudFR5cGUgPT0gRXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uRW5kRXZlbnQp
Ci0gICAgICAgIGxpc3RlbmVyVHlwZSA9IERvY3VtZW50OjpBTklNQVRJT05FTkRfTElTVEVORVI7
Ci0gICAgZWxzZQotICAgICAgICBsaXN0ZW5lclR5cGUgPSBEb2N1bWVudDo6QU5JTUFUSU9OU1RB
UlRfTElTVEVORVI7Ci0gICAgCi0gICAgaWYgKHNob3VsZFNlbmRFdmVudEZvckxpc3RlbmVyKGxp
c3RlbmVyVHlwZSkpIHsKLSAgICAgICAgRWxlbWVudCogZWxlbWVudCA9IGVsZW1lbnRGb3JFdmVu
dERpc3BhdGNoKCk7Ci0gICAgICAgIGlmIChlbGVtZW50KSB7Ci0gICAgICAgICAgICBtX3dhaXRp
bmdGb3JFbmRFdmVudCA9IHRydWU7Ci0gICAgICAgICAgICBtX2FuaW1hdGlvbkV2ZW50RGlzcGF0
Y2hlci5zdGFydFRpbWVyKGVsZW1lbnQsIG1fbmFtZSwgLTEsIHRydWUsIGluRXZlbnRUeXBlLCBp
bkVsYXBzZWRUaW1lKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyBEaWQgZGlzcGF0Y2gg
YW4gZXZlbnQKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBmYWxzZTsgLy8gRGlkIG5v
dCBkaXNwYXRjaCBhbiBldmVudAotfQotCi12b2lkIEtleWZyYW1lQW5pbWF0aW9uOjpvdmVycmlk
ZUFuaW1hdGlvbnMoKQotewotICAgIC8vIFRoaXMgd2lsbCBvdmVycmlkZSBpbXBsaWNpdCBhbmlt
YXRpb25zIHRoYXQgbWF0Y2ggdGhlIHByb3BlcnRpZXMgaW4gdGhlIGtleWZyYW1lIGFuaW1hdGlv
bgotICAgIEhhc2hTZXQ8aW50Pjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9rZXlmcmFtZXMtPmVu
ZFByb3BlcnRpZXMoKTsKLSAgICBmb3IgKEhhc2hTZXQ8aW50Pjo6Y29uc3RfaXRlcmF0b3IgaXQg
PSBtX2tleWZyYW1lcy0+YmVnaW5Qcm9wZXJ0aWVzKCk7IGl0ICE9IGVuZDsgKytpdCkKLSAgICAg
ICAgY29tcG9zaXRlQW5pbWF0aW9uKCktPm92ZXJyaWRlSW1wbGljaXRBbmltYXRpb25zKCppdCk7
Ci19Ci0KLXZvaWQgS2V5ZnJhbWVBbmltYXRpb246OnJlc3VtZU92ZXJyaWRkZW5BbmltYXRpb25z
KCkKLXsKLSAgICAvLyBUaGlzIHdpbGwgcmVzdW1lIG92ZXJyaWRkZW4gaW1wbGljaXQgYW5pbWF0
aW9ucwotICAgIEhhc2hTZXQ8aW50Pjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9rZXlmcmFtZXMt
PmVuZFByb3BlcnRpZXMoKTsKLSAgICBmb3IgKEhhc2hTZXQ8aW50Pjo6Y29uc3RfaXRlcmF0b3Ig
aXQgPSBtX2tleWZyYW1lcy0+YmVnaW5Qcm9wZXJ0aWVzKCk7IGl0ICE9IGVuZDsgKytpdCkKLSAg
ICAgICAgY29tcG9zaXRlQW5pbWF0aW9uKCktPnJlc3VtZU92ZXJyaWRkZW5JbXBsaWNpdEFuaW1h
dGlvbnMoKml0KTsKLX0KLQotYm9vbCBLZXlmcmFtZUFuaW1hdGlvbjo6YWZmZWN0c1Byb3BlcnR5
KGludCBwcm9wZXJ0eSkgY29uc3QKLXsKLSAgICBIYXNoU2V0PGludD46OmNvbnN0X2l0ZXJhdG9y
IGVuZCA9IG1fa2V5ZnJhbWVzLT5lbmRQcm9wZXJ0aWVzKCk7Ci0gICAgZm9yIChIYXNoU2V0PGlu
dD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZXMtPmJlZ2luUHJvcGVydGllcygpOyBp
dCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgaWYgKCgqaXQpID09IHByb3BlcnR5KQotICAgICAg
ICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQogQW5pbWF0
aW9uQ29udHJvbGxlcjo6QW5pbWF0aW9uQ29udHJvbGxlcihGcmFtZSogZnJhbWUpCiA6IG1fZGF0
YShuZXcgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGUoZnJhbWUpKQorLCBtX251bVN0eWxlQXZh
aWxhYmxlV2FpdGVycygwKQogewogICAgIAogfQpAQCAtMjA4NSw4ICsyMjYsMTEgQEAgdm9pZCBB
bmltYXRpb25Db250cm9sbGVyOjpjYW5jZWxBbmltYXRpbwogICAgIGlmICghbV9kYXRhLT5oYXNB
bmltYXRpb25zKCkpCiAgICAgICAgIHJldHVybjsKICAgICAKLSAgICBpZiAobV9kYXRhLT5jbGVh
cihyZW5kZXJlcikpCi0gICAgICAgIHNldENoYW5nZWQocmVuZGVyZXItPmVsZW1lbnQoKSk7Cisg
ICAgaWYgKG1fZGF0YS0+Y2xlYXIocmVuZGVyZXIpKSB7CisgICAgICAgIE5vZGUqIG5vZGUgPSBy
ZW5kZXJlci0+ZWxlbWVudCgpOworICAgICAgICBBU1NFUlQoIW5vZGUgfHwgKG5vZGUtPmRvY3Vt
ZW50KCkgJiYgIW5vZGUtPmRvY3VtZW50KCktPmluUGFnZUNhY2hlKCkpKTsKKyAgICAgICAgbm9k
ZS0+c2V0Q2hhbmdlZChBbmltYXRpb25TdHlsZUNoYW5nZSk7CisgICAgfQogfQogCiBSZW5kZXJT
dHlsZSogQW5pbWF0aW9uQ29udHJvbGxlcjo6dXBkYXRlQW5pbWF0aW9ucyhSZW5kZXJPYmplY3Qq
IHJlbmRlcmVyLCBSZW5kZXJTdHlsZSogbmV3U3R5bGUpCkBAIC0yMTU4LDE2ICszMDIsMTAgQEAg
dm9pZCBBbmltYXRpb25Db250cm9sbGVyOjpzdGFydFVwZGF0ZVJlbgogCiB2b2lkIEFuaW1hdGlv
bkNvbnRyb2xsZXI6OnN0eWxlQXZhaWxhYmxlKCkKIHsKKyAgICBpZiAobV9udW1TdHlsZUF2YWls
YWJsZVdhaXRlcnMgPT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIAogICAgIG1fZGF0YS0+c3R5
bGVBdmFpbGFibGUoKTsKIH0KIAotdm9pZCBDb21wb3NpdGVBbmltYXRpb246OnNldFdhaXRpbmdG
b3JTdHlsZUF2YWlsYWJsZShib29sIHdhaXRpbmcpCi17Ci0gICAgaWYgKHdhaXRpbmcpCi0gICAg
ICAgIG1fbnVtU3R5bGVBdmFpbGFibGVXYWl0ZXJzKys7Ci0gICAgZWxzZQotICAgICAgICBtX251
bVN0eWxlQXZhaWxhYmxlV2FpdGVycy0tOwotICAgIG1fYW5pbWF0aW9uQ29udHJvbGxlci0+c2V0
V2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKHdhaXRpbmcpOwotfQotICAgIAogfQpJbmRleDogV2Vi
Q29yZS9wYWdlL2FuaW1hdGlvbi9BbmltYXRpb25Db250cm9sbGVyLmgKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9BbmltYXRpb25Db250cm9sbGVyLmgJKHJldmlzaW9uIDM1
OTk1KQkoZnJvbSBXZWJDb3JlL3BhZ2UvQW5pbWF0aW9uQ29udHJvbGxlci5oOjM1OTk1KQorKysg
V2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9BbmltYXRpb25Db250cm9sbGVyLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVy
IHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVz
IG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHBy
b21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0
IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBM
T1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0Ug
T0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBBbmltYXRpb25Db250cm9sbGVyX2gKKyNk
ZWZpbmUgQW5pbWF0aW9uQ29udHJvbGxlcl9oCisKKyNpbmNsdWRlICJDU1NQcm9wZXJ0eU5hbWVz
LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgQW5pbWF0aW9uQ29udHJvbGxlclBy
aXZhdGU7CitjbGFzcyBEb2N1bWVudDsKK2NsYXNzIEZyYW1lOworY2xhc3MgUmVuZGVyT2JqZWN0
OworY2xhc3MgUmVuZGVyU3R5bGU7CisKK2NsYXNzIEFuaW1hdGlvbkNvbnRyb2xsZXIKK3sKK3B1
YmxpYzoKKyAgICBBbmltYXRpb25Db250cm9sbGVyKEZyYW1lKik7CisgICAgfkFuaW1hdGlvbkNv
bnRyb2xsZXIoKTsKKyAgICAKKyAgICB2b2lkIGNhbmNlbEFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0
Kik7CisgICAgUmVuZGVyU3R5bGUqIHVwZGF0ZUFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0KiwgUmVu
ZGVyU3R5bGUqIG5ld1N0eWxlKTsKKyAgICAKKyAgICB2b2lkIHNldEFuaW1hdGlvblN0YXJ0VGlt
ZShSZW5kZXJPYmplY3QqIG9iaiwgZG91YmxlIHQpOworICAgIHZvaWQgc2V0VHJhbnNpdGlvblN0
YXJ0VGltZShSZW5kZXJPYmplY3QqIG9iaiwgaW50IHByb3BlcnR5LCBkb3VibGUgdCk7CisgICAg
CisgICAgYm9vbCBpc0FuaW1hdGluZ1Byb3BlcnR5T25SZW5kZXJlcihSZW5kZXJPYmplY3QqIG9i
aiwgaW50IHByb3BlcnR5LCBib29sIGlzUnVubmluZ05vdykgY29uc3Q7CisgICAgCisgICAgdm9p
ZCBzdXNwZW5kQW5pbWF0aW9ucyhEb2N1bWVudCogZG9jdW1lbnQpOworICAgIHZvaWQgcmVzdW1l
QW5pbWF0aW9ucyhEb2N1bWVudCogZG9jdW1lbnQpOworICAgIHZvaWQgdXBkYXRlQW5pbWF0aW9u
VGltZXIoKTsKKyAgICAKKyAgICB2b2lkIHN0YXJ0VXBkYXRlUmVuZGVyaW5nRGlzcGF0Y2hlcigp
OworICAgIAorICAgIHZvaWQgc3R5bGVBdmFpbGFibGUoKTsKKyAgICAKK3ByaXZhdGU6CisgICAg
QW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGUqIG1fZGF0YTsKKyAgICAKK307CisKK30KKworI2Vu
ZGlmCkluZGV4OiBXZWJDb3JlL3BhZ2UvYW5pbWF0aW9uL0FuaW1hdGlvbkNvbnRyb2xsZXIuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBXZWJDb3JlL3BhZ2UvYW5pbWF0aW9uL0FuaW1hdGlvbkNvbnRyb2xsZXIu
aAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGFnZS9hbmltYXRpb24vQW5pbWF0aW9uQ29udHJv
bGxlci5oCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw4ICsyOSw2IEBACiAjaWZuZGVmIEFuaW1hdGlv
bkNvbnRyb2xsZXJfaAogI2RlZmluZSBBbmltYXRpb25Db250cm9sbGVyX2gKIAotI2luY2x1ZGUg
IkNTU1Byb3BlcnR5TmFtZXMuaCIKLQogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBBbmlt
YXRpb25Db250cm9sbGVyUHJpdmF0ZTsKQEAgLTYxLDkgKzU5LDExIEBAIHB1YmxpYzoKICAgICAK
ICAgICB2b2lkIHN0eWxlQXZhaWxhYmxlKCk7CiAgICAgCisgICAgdm9pZCBzZXRXYWl0aW5nRm9y
U3R5bGVBdmFpbGFibGUoYm9vbCB3YWl0aW5nKSB7IGlmICh3YWl0aW5nKSBtX251bVN0eWxlQXZh
aWxhYmxlV2FpdGVycysrOyBlbHNlIG1fbnVtU3R5bGVBdmFpbGFibGVXYWl0ZXJzLS07IH0KKyAg
ICAKIHByaXZhdGU6CiAgICAgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGUqIG1fZGF0YTsKLSAg
ICAKKyAgICB1aW50MzJfdCBtX251bVN0eWxlQXZhaWxhYmxlV2FpdGVyczsgICAgCiB9OwogCiB9
CkluZGV4OiBXZWJDb3JlL3BhZ2UvYW5pbWF0aW9uL0NvbXBvc2l0ZUFuaW1hdGlvbi5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9Db21wb3NpdGVBbmltYXRpb24uY3Bw
CShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9Db21wb3NpdGVBbmltYXRp
b24uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDQ3NSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBw
bGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhp
cyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJV
VE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB
UkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkNvbXBvc2l0ZUFuaW1hdGlvbi5oIgorI2luY2x1ZGUgIkFuaW1hdGlv
bkNvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJJbXBsaWNpdEFuaW1hdGlvbi5oIgorI2luY2x1ZGUg
IktleWZyYW1lQW5pbWF0aW9uLmgiCisjaW5jbHVkZSAiUmVuZGVyU3R5bGUuaCIKKyNpbmNsdWRl
ICJDU1NQcm9wZXJ0eU5hbWVzLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworQ29tcG9zaXRl
QW5pbWF0aW9uOjp+Q29tcG9zaXRlQW5pbWF0aW9uKCkKK3sKKyAgICBkZWxldGVBbGxWYWx1ZXMo
bV90cmFuc2l0aW9ucyk7CisgICAgZGVsZXRlQWxsVmFsdWVzKG1fa2V5ZnJhbWVBbmltYXRpb25z
KTsKK30KKyAgICAKK3ZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjp1cGRhdGVUcmFuc2l0aW9ucyhS
ZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBjb25zdCBSZW5kZXJTdHlsZSogY3VycmVudFN0eWxlLCBS
ZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUpCit7CisgICAgLy8gSWYgY3VycmVudFN0eWxlIGlzIG51
bGwsIHdlIGRvbid0IGRvIHRyYW5zaXRpb25zCisgICAgaWYgKCFjdXJyZW50U3R5bGUgfHwgIXRh
cmdldFN0eWxlLT50cmFuc2l0aW9ucygpKQorICAgICAgICByZXR1cm47CisgICAgICAgIAorICAg
IC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgYWN0aXZlIHRyYW5zaXRp
b25zCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YXJnZXRTdHlsZS0+dHJhbnNpdGlvbnMo
KS0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgQW5pbWF0aW9uKiBhbmltID0gKCp0YXJn
ZXRTdHlsZS0+dHJhbnNpdGlvbnMoKSlbaV0uZ2V0KCk7CisgICAgICAgIGRvdWJsZSBkdXJhdGlv
biA9IGFuaW0tPmR1cmF0aW9uKCk7CisgICAgICAgIGRvdWJsZSBkZWxheSA9IGFuaW0tPmRlbGF5
KCk7CisKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBlbXB0eSB0cmFuc2l0aW9uLCBza2lwIGl0
CisgICAgICAgIGlmIChkdXJhdGlvbiA9PSAwICYmIGRlbGF5IDw9IDApCisgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgIAorICAgICAgICBpbnQgcHJvcCA9IGFuaW0tPnByb3BlcnR5KCk7
CisgICAgICAgIGJvb2wgYWxsID0gcHJvcCA9PSBjQW5pbWF0ZUFsbDsKKyAgICAgICAgCisgICAg
ICAgIC8vIEhhbmRsZSBib3RoIHRoZSAnYWxsJyBhbmQgc2luZ2xlIHByb3BlcnR5IGNhc2VzLiBG
b3IgdGhlIHNpbmdsZSBwcm9wIGNhc2UsIHdlIG1ha2Ugb25seSBvbmUgcGFzcworICAgICAgICAv
LyB0aHJvdWdoIHRoZSBsb29wCisgICAgICAgIGZvciAoaW50IHByb3BlcnR5SW5kZXggPSAwOyA7
ICsrcHJvcGVydHlJbmRleCkgeworICAgICAgICAgICAgaWYgKGFsbCkgeworICAgICAgICAgICAg
ICAgIGlmIChwcm9wZXJ0eUluZGV4ID49IEFuaW1hdGlvbkJhc2U6OmdldE51bVByb3BlcnRpZXMo
KSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLy8gZ2V0IHRo
ZSBuZXh0IHByb3AKKyAgICAgICAgICAgICAgICBwcm9wID0gQW5pbWF0aW9uQmFzZTo6Z2V0UHJv
cGVydHlBdEluZGV4KHByb3BlcnR5SW5kZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAg
ICAvLyBJbXBsaWNpdEFuaW1hdGlvbnMgYXJlIGFsd2F5cyBoYXNoZWQgYnkgYWN0dWFsIHByb3Bl
cnRpZXMsIG5ldmVyIGNBbmltYXRlQWxsCisgICAgICAgICAgICBBU1NFUlQocHJvcCA+IGZpcnN0
Q1NTUHJvcGVydHkgJiYgcHJvcCA8IChmaXJzdENTU1Byb3BlcnR5ICsgbnVtQ1NTUHJvcGVydGll
cykpOworCisgICAgICAgICAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYSBjdXJyZW50IHRyYW5zaXRp
b24gZm9yIHRoaXMgcHJvcAorICAgICAgICAgICAgSW1wbGljaXRBbmltYXRpb24qIGltcGxBbmlt
ID0gbV90cmFuc2l0aW9ucy5nZXQocHJvcCk7CisgICAgICAgICAgICBib29sIGVxdWFsID0gdHJ1
ZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKGltcGxBbmltKSB7CisgICAgICAgICAg
ICAgICAgLy8gVGhlcmUgaXMgb25lLCBoYXMgb3VyIHRhcmdldCBjaGFuZ2VkPworICAgICAgICAg
ICAgICAgIGlmICghaW1wbEFuaW0tPmlzVGFyZ2V0UHJvcGVydHlFcXVhbChwcm9wLCB0YXJnZXRT
dHlsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW1wbEFuaW0tPnJlc2V0KHJlbmRlcmVyKTsK
KyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGltcGxBbmltOworICAgICAgICAgICAgICAgICAg
ICBtX3RyYW5zaXRpb25zLnJlbW92ZShwcm9wKTsKKyAgICAgICAgICAgICAgICAgICAgZXF1YWwg
PSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgICAgIC8vIFNlZSBpZiB3ZSBuZWVkIHRvIHN0YXJ0IGEgbmV3IHRyYW5zaXRpb24KKyAg
ICAgICAgICAgICAgICBlcXVhbCA9IEFuaW1hdGlvbkJhc2U6OnByb3BlcnRpZXNFcXVhbChwcm9w
LCBjdXJyZW50U3R5bGUsIHRhcmdldFN0eWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IAorICAgICAgICAgICAgaWYgKCFlcXVhbCkgeworICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUg
bmV3IHRyYW5zaXRpb24KKyAgICAgICAgICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogYW5pbWF0
aW9uID0gbmV3IEltcGxpY2l0QW5pbWF0aW9uKGNvbnN0X2Nhc3Q8QW5pbWF0aW9uKj4oYW5pbSks
IHByb3AsIHJlbmRlcmVyLCB0aGlzKTsKKyAgICAgICAgICAgICAgICBtX3RyYW5zaXRpb25zLnNl
dChwcm9wLCBhbmltYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAg
ICAgICAvLyBXZSBvbmx5IG5lZWQgb25lIHBhc3MgZm9yIHRoZSBzaW5nbGUgcHJvcCBjYXNlCisg
ICAgICAgICAgICBpZiAoIWFsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQor
ICAgIH0KK30KKwordm9pZCBDb21wb3NpdGVBbmltYXRpb246OnVwZGF0ZUtleWZyYW1lQW5pbWF0
aW9ucyhSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBjb25zdCBSZW5kZXJTdHlsZSogY3VycmVudFN0
eWxlLCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUpCit7CisgICAgLy8gTm90aGluZyB0byBkbyBp
ZiB3ZSBkb24ndCBoYXZlIGFueSBhbmltYXRpb25zLCBhbmQgZGlkbid0IGhhdmUgYW55IGJlZm9y
ZQorICAgIGlmIChtX2tleWZyYW1lQW5pbWF0aW9ucy5pc0VtcHR5KCkgJiYgIXRhcmdldFN0eWxl
LT5oYXNBbmltYXRpb25zKCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICAvLyBOb3RoaW5n
IHRvIGRvIGlmIHRoZSBjdXJyZW50IGFuZCB0YXJnZXQgYW5pbWF0aW9ucyBhcmUgdGhlIHNhbWUK
KyAgICBpZiAoY3VycmVudFN0eWxlICYmIGN1cnJlbnRTdHlsZS0+aGFzQW5pbWF0aW9ucygpICYm
IHRhcmdldFN0eWxlLT5oYXNBbmltYXRpb25zKCkgJiYgKihjdXJyZW50U3R5bGUtPmFuaW1hdGlv
bnMoKSkgPT0gKih0YXJnZXRTdHlsZS0+YW5pbWF0aW9ucygpKSkKKyAgICAgICAgcmV0dXJuOwor
ICAgICAgICAKKyAgICBpbnQgbnVtQW5pbXMgPSAwOworICAgIGJvb2wgYW5pbXNDaGFuZ2VkID0g
ZmFsc2U7CisgICAgCisgICAgLy8gc2VlIGlmIHRoZSBsaXN0cyBtYXRjaAorICAgIGlmICh0YXJn
ZXRTdHlsZS0+YW5pbWF0aW9ucygpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
dGFyZ2V0U3R5bGUtPmFuaW1hdGlvbnMoKS0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGNv
bnN0IEFuaW1hdGlvbiogYW5pbSA9ICgqdGFyZ2V0U3R5bGUtPmFuaW1hdGlvbnMoKSlbaV0uZ2V0
KCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICghYW5pbS0+aXNWYWxpZEFuaW1hdGlv
bigpKQorICAgICAgICAgICAgICAgIGFuaW1zQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICBl
bHNlIHsKKyAgICAgICAgICAgICAgICBBdG9taWNTdHJpbmcgbmFtZShhbmltLT5uYW1lKCkpOwor
ICAgICAgICAgICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBrZkFuaW0gPSBtX2tleWZyYW1lQW5p
bWF0aW9ucy5nZXQobmFtZS5pbXBsKCkpOworICAgICAgICAgICAgICAgIGlmICgha2ZBbmltIHx8
ICFrZkFuaW0tPmFuaW1hdGlvbnNNYXRjaChhbmltKSkKKyAgICAgICAgICAgICAgICAgICAgYW5p
bXNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAg
ICAgIGlmIChhbmltKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmltYXRpb25zIG1h
dGNoLCBidXQgcGxheSBzdGF0ZXMgbWF5IGRpZmZlci4gdXBkYXRlIGlmIG5lZWRlZAorICAgICAg
ICAgICAgICAgICAgICAgICAga2ZBbmltLT51cGRhdGVQbGF5U3RhdGUoYW5pbS0+cGxheVN0YXRl
KCkgPT0gQW5pbVBsYXlTdGF0ZVBsYXlpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgCisg
ICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIHNhdmVkIGFuaW1hdGlvbiB0byB0aGlz
IG5ldyBvbmUsIGp1c3QgaW4gY2FzZSB0aGUgcGxheSBzdGF0ZSBoYXMgY2hhbmdlZAorICAgICAg
ICAgICAgICAgICAgICAgICAga2ZBbmltLT5zZXRBbmltYXRpb24oYW5pbSk7CisgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrbnVtQW5pbXM7CisgICAg
ICAgIH0KKyAgICB9CisgICAgCisgICAgaWYgKCFhbmltc0NoYW5nZWQgJiYgbV9rZXlmcmFtZUFu
aW1hdGlvbnMuc2l6ZSgpICE9IG51bUFuaW1zKQorICAgICAgICBhbmltc0NoYW5nZWQgPSB0cnVl
OworCisgICAgaWYgKCFhbmltc0NoYW5nZWQpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIGFu
aW1hdGlvbnMgaGF2ZSBjaGFuZ2VkLCB1cGRhdGUgdGhlIGxpc3QKKyAgICByZXNldEFuaW1hdGlv
bnMocmVuZGVyZXIpOworCisgICAgaWYgKCF0YXJnZXRTdHlsZS0+YW5pbWF0aW9ucygpKQorICAg
ICAgICByZXR1cm47CisKKyAgICAvLyBhZGQgYWxsIHRoZSBuZXcgYW5pbWF0aW9ucworICAgIGlu
dCBpbmRleCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YXJnZXRTdHlsZS0+YW5p
bWF0aW9ucygpLT5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBBbmltYXRpb24qIGFuaW0g
PSAoKnRhcmdldFN0eWxlLT5hbmltYXRpb25zKCkpW2ldLmdldCgpOworCisgICAgICAgIGlmICgh
YW5pbS0+aXNWYWxpZEFuaW1hdGlvbigpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICAKKyAgICAgICAgLy8gZG9uJ3QgYm90aGVyIGFkZGluZyB0aGUgYW5pbWF0aW9uIGlmIGl0
IGhhcyBubyBrZXlmcmFtZXMgb3Igd29uJ3QgYW5pbWF0ZQorICAgICAgICBpZiAoKGFuaW0tPmR1
cmF0aW9uKCkgfHwgYW5pbS0+ZGVsYXkoKSkgJiYgYW5pbS0+aXRlcmF0aW9uQ291bnQoKSAmJgor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltLT5rZXlmcmFt
ZUxpc3QoKS5nZXQoKSAmJiAhYW5pbS0+a2V5ZnJhbWVMaXN0KCktPmlzRW1wdHkoKSkgeworICAg
ICAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGtmYW5pbSA9IG5ldyBLZXlmcmFtZUFuaW1hdGlv
bihjb25zdF9jYXN0PEFuaW1hdGlvbio+KGFuaW0pLCByZW5kZXJlciwgaW5kZXgrKywgdGhpcyk7
CisgICAgICAgICAgICBtX2tleWZyYW1lQW5pbWF0aW9ucy5zZXQoa2ZhbmltLT5uYW1lKCkuaW1w
bCgpLCBrZmFuaW0pOworICAgICAgICB9CisgICAgfQorfQorCitLZXlmcmFtZUFuaW1hdGlvbiog
Q29tcG9zaXRlQW5pbWF0aW9uOjpmaW5kS2V5ZnJhbWVBbmltYXRpb24oY29uc3QgQXRvbWljU3Ry
aW5nJiBuYW1lKQoreworICAgIHJldHVybiBtX2tleWZyYW1lQW5pbWF0aW9ucy5nZXQobmFtZS5p
bXBsKCkpOworfQorCitSZW5kZXJTdHlsZSogQ29tcG9zaXRlQW5pbWF0aW9uOjphbmltYXRlKFJl
bmRlck9iamVjdCogcmVuZGVyZXIsIGNvbnN0IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUsIFJl
bmRlclN0eWxlKiB0YXJnZXRTdHlsZSkKK3sKKyAgICBSZW5kZXJTdHlsZSogcmVzdWx0U3R5bGUg
PSAwOworICAgIAorICAgIC8vIFdlIGRvbid0IGRvIGFueSB0cmFuc2l0aW9ucyBpZiB3ZSBkb24n
dCBoYXZlIGEgY3VycmVudFN0eWxlIChvbiBzdGFydHVwKQorICAgIHVwZGF0ZVRyYW5zaXRpb25z
KHJlbmRlcmVyLCBjdXJyZW50U3R5bGUsIHRhcmdldFN0eWxlKTsKKyAgICAKKyAgICBpZiAoY3Vy
cmVudFN0eWxlKSB7CisgICAgICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgdHJhbnNpdGlvbiBvYmpl
Y3RzIHJlYWR5LCBsZXQgdGhlbSBrbm93IGFib3V0IHRoZSBuZXcgZ29hbCBzdGF0ZS4gIFdlIHdh
bnQgdGhlbQorICAgICAgICAvLyB0byBmaWxsIGluIGEgUmVuZGVyU3R5bGUqJiBvbmx5IGlmIG5l
ZWRlZC4KKyAgICAgICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3Ig
ZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKKyAgICAgICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5z
aXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQg
IT0gZW5kOyArK2l0KSB7CisgICAgICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogIGFuaW0gPSBp
dC0+c2Vjb25kOworICAgICAgICAgICAgaWYgKGFuaW0pIHsKKyAgICAgICAgICAgICAgICBhbmlt
LT5hbmltYXRlKHRoaXMsIHJlbmRlcmVyLCBjdXJyZW50U3R5bGUsIHRhcmdldFN0eWxlLCByZXN1
bHRTdHlsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1cGRhdGVL
ZXlmcmFtZUFuaW1hdGlvbnMocmVuZGVyZXIsIGN1cnJlbnRTdHlsZSwgdGFyZ2V0U3R5bGUpOwor
CisgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhbmltYXRpb24gb2JqZWN0cyByZWFkeSwgbGV0IHRo
ZW0ga25vdyBhYm91dCB0aGUgbmV3IGdvYWwgc3RhdGUuICBXZSB3YW50IHRoZW0KKyAgICAvLyB0
byBmaWxsIGluIGEgUmVuZGVyU3R5bGUqJiBvbmx5IGlmIG5lZWRlZC4KKyAgICBpZiAodGFyZ2V0
U3R5bGUtPmhhc0FuaW1hdGlvbnMoKSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8
IHRhcmdldFN0eWxlLT5hbmltYXRpb25zKCktPnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBj
b25zdCBBbmltYXRpb24qIGFuaW0gPSAoKnRhcmdldFN0eWxlLT5hbmltYXRpb25zKCkpW2ldLmdl
dCgpOworCisgICAgICAgICAgICBpZiAoYW5pbS0+aXNWYWxpZEFuaW1hdGlvbigpKSB7CisgICAg
ICAgICAgICAgICAgQXRvbWljU3RyaW5nIG5hbWUoYW5pbS0+bmFtZSgpKTsKKyAgICAgICAgICAg
ICAgICBLZXlmcmFtZUFuaW1hdGlvbioga2V5ZnJhbWVBbmltID0gbV9rZXlmcmFtZUFuaW1hdGlv
bnMuZ2V0KG5hbWUuaW1wbCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoa2V5ZnJhbWVBbmltKQor
ICAgICAgICAgICAgICAgICAgICBrZXlmcmFtZUFuaW0tPmFuaW1hdGUodGhpcywgcmVuZGVyZXIs
IGN1cnJlbnRTdHlsZSwgdGFyZ2V0U3R5bGUsIHJlc3VsdFN0eWxlKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBjbGVhbnVwRmluaXNoZWRBbmltYXRpb25zKHJl
bmRlcmVyKTsKKworICAgIHJldHVybiByZXN1bHRTdHlsZSA/IHJlc3VsdFN0eWxlIDogdGFyZ2V0
U3R5bGU7Cit9CisKKy8vICJhbmltYXRpbmciIG1lYW5zIHRoYXQgc29tZXRoaW5nIGlzIHJ1bm5p
bmcgdGhhdCByZXF1aXJlcyB0aGUgdGltZXIgdG8ga2VlcCBmaXJpbmcKKy8vIChlLmcuIGEgdHJh
bnNpdGlvbikKK3ZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpzZXRBbmltYXRpbmcoYm9vbCBpbkFu
aW1hdGluZykKK3sKKyAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRv
ciBlbmQgPSBtX3RyYW5zaXRpb25zLmVuZCgpOworICAgIGZvciAoQ1NTUHJvcGVydHlUcmFuc2l0
aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9
IGVuZDsgKytpdCkgeworICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogIHRyYW5zaXRpb24gPSBp
dC0+c2Vjb25kOworICAgICAgICB0cmFuc2l0aW9uLT5zZXRBbmltYXRpbmcoaW5BbmltYXRpbmcp
OworICAgIH0KKworICAgIEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0g
bV9rZXlmcmFtZUFuaW1hdGlvbnMuZW5kKCk7CisgICAgZm9yIChBbmltYXRpb25OYW1lTWFwOjpj
b25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IGtm
ZW5kOyArK2l0KSB7CisgICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29u
ZDsKKyAgICAgICAgYW5pbS0+c2V0QW5pbWF0aW5nKGluQW5pbWF0aW5nKTsKKyAgICB9Cit9CisK
K2Jvb2wgQ29tcG9zaXRlQW5pbWF0aW9uOjphbmltYXRpbmcoKQoreworICAgIENTU1Byb3BlcnR5
VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7
CisgICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9
IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIEltcGxp
Y2l0QW5pbWF0aW9uKiAgdHJhbnNpdGlvbiA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmICh0cmFu
c2l0aW9uICYmIHRyYW5zaXRpb24tPmFuaW1hdGluZygpICYmIHRyYW5zaXRpb24tPnJ1bm5pbmco
KSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICBBbmltYXRpb25O
YW1lTWFwOjpjb25zdF9pdGVyYXRvciBrZmVuZCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmVuZCgp
OworICAgIGZvciAoQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZy
YW1lQW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBrZmVuZDsgKytpdCkgeworICAgICAgICBLZXlm
cmFtZUFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmIChhbmltICYmICFh
bmltLT5wYXVzZWQoKSAmJiBhbmltLT5hbmltYXRpbmcoKSAmJiBhbmltLT5hY3RpdmUoKSkKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwor
dm9pZCBDb21wb3NpdGVBbmltYXRpb246OnJlc2V0VHJhbnNpdGlvbnMoUmVuZGVyT2JqZWN0KiBy
ZW5kZXJlcikKK3sKKyAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRv
ciBlbmQgPSBtX3RyYW5zaXRpb25zLmVuZCgpOworICAgIGZvciAoQ1NTUHJvcGVydHlUcmFuc2l0
aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9
IGVuZDsgKytpdCkgeworICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogIHRyYW5zaXRpb24gPSBp
dC0+c2Vjb25kOworICAgICAgICB0cmFuc2l0aW9uLT5yZXNldChyZW5kZXJlcik7CisgICAgICAg
IGRlbGV0ZSB0cmFuc2l0aW9uOworICAgIH0KKyAgICBtX3RyYW5zaXRpb25zLmNsZWFyKCk7Cit9
CisKK3ZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpyZXNldEFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0
KiByZW5kZXJlcikKK3sKKyAgICBkZWxldGVBbGxWYWx1ZXMobV9rZXlmcmFtZUFuaW1hdGlvbnMp
OworICAgIG1fa2V5ZnJhbWVBbmltYXRpb25zLmNsZWFyKCk7Cit9CisKK3ZvaWQgQ29tcG9zaXRl
QW5pbWF0aW9uOjpjbGVhbnVwRmluaXNoZWRBbmltYXRpb25zKFJlbmRlck9iamVjdCogcmVuZGVy
ZXIpCit7CisgICAgaWYgKHN1c3BlbmRlZCgpKQorICAgICAgICByZXR1cm47CisgICAgCisgICAg
Ly8gTWFrZSBhIGxpc3Qgb2YgdHJhbnNpdGlvbnMgdG8gYmUgZGVsZXRlZAorICAgIFZlY3Rvcjxp
bnQ+IGZpbmlzaGVkVHJhbnNpdGlvbnM7CisgICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6
Y29uc3RfaXRlcmF0b3IgZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKKworICAgIGZvciAoQ1NT
UHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25z
LmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiog
YW5pbSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmICghYW5pbSkKKyAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICBpZiAoYW5pbS0+cG9zdEFjdGl2ZSgpICYmICFhbmltLT53YWl0aW5nRm9y
RW5kRXZlbnQoKSkKKyAgICAgICAgICAgIGZpbmlzaGVkVHJhbnNpdGlvbnMuYXBwZW5kKGFuaW0t
PmFuaW1hdGluZ1Byb3BlcnR5KCkpOworICAgIH0KKyAgICAKKyAgICAvLyBEZWxldGUgdGhlbQor
ICAgIGZvciAoVmVjdG9yPGludD46Oml0ZXJhdG9yIGl0ID0gZmluaXNoZWRUcmFuc2l0aW9ucy5i
ZWdpbigpOyBpdCAhPSBmaW5pc2hlZFRyYW5zaXRpb25zLmVuZCgpOyArK2l0KSB7CisgICAgICAg
IEltcGxpY2l0QW5pbWF0aW9uKiBhbmltID0gbV90cmFuc2l0aW9ucy5nZXQoKml0KTsKKyAgICAg
ICAgaWYgKGFuaW0pIHsKKyAgICAgICAgICAgIGFuaW0tPnJlc2V0KHJlbmRlcmVyKTsKKyAgICAg
ICAgICAgIGRlbGV0ZSBhbmltOworICAgICAgICB9CisgICAgICAgIG1fdHJhbnNpdGlvbnMucmVt
b3ZlKCppdCk7CisgICAgfQorCisgICAgLy8gTWFrZSBhIGxpc3Qgb2YgYW5pbWF0aW9ucyB0byBi
ZSBkZWxldGVkCisgICAgVmVjdG9yPEF0b21pY1N0cmluZ0ltcGwqPiBmaW5pc2hlZEFuaW1hdGlv
bnM7CisgICAgQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZy
YW1lQW5pbWF0aW9ucy5lbmQoKTsKKworICAgIGZvciAoQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3Rf
aXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBrZmVuZDsg
KytpdCkgeworICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7Cisg
ICAgICAgIGlmICghYW5pbSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoYW5p
bS0+cG9zdEFjdGl2ZSgpICYmICFhbmltLT53YWl0aW5nRm9yRW5kRXZlbnQoKSkKKyAgICAgICAg
ICAgIGZpbmlzaGVkQW5pbWF0aW9ucy5hcHBlbmQoYW5pbS0+bmFtZSgpLmltcGwoKSk7CisgICAg
fQorICAgIAorICAgIC8vIGRlbGV0ZSB0aGVtCisgICAgZm9yIChWZWN0b3I8QXRvbWljU3RyaW5n
SW1wbCo+OjppdGVyYXRvciBpdCA9IGZpbmlzaGVkQW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBm
aW5pc2hlZEFuaW1hdGlvbnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgS2V5ZnJhbWVBbmltYXRp
b24qIGtmYW5pbSA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmdldCgqaXQpOworICAgICAgICBpZiAo
a2ZhbmltKSB7CisgICAgICAgICAgICBrZmFuaW0tPnJlc2V0KHJlbmRlcmVyKTsKKyAgICAgICAg
ICAgIGRlbGV0ZSBrZmFuaW07CisgICAgICAgIH0KKyAgICAgICAgbV9rZXlmcmFtZUFuaW1hdGlv
bnMucmVtb3ZlKCppdCk7CisgICAgfQorfQorCit2b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6c2V0
QW5pbWF0aW9uU3RhcnRUaW1lKGRvdWJsZSB0KQoreworICAgIC8vIHNldCBzdGFydCB0aW1lIG9u
IGFsbCBhbmltYXRpb25zIHdhaXRpbmcgZm9yIGl0CisgICAgQW5pbWF0aW9uTmFtZU1hcDo6Y29u
c3RfaXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5lbmQoKTsKKyAgICBmb3Ig
KEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZUFuaW1hdGlv
bnMuYmVnaW4oKTsgaXQgIT0ga2ZlbmQ7ICsraXQpIHsKKyAgICAgICAgS2V5ZnJhbWVBbmltYXRp
b24qIGFuaW0gPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT53YWl0aW5n
Rm9yU3RhcnRUaW1lKCkpCisgICAgICAgICAgICBhbmltLT51cGRhdGVTdGF0ZU1hY2hpbmUoQW5p
bWF0aW9uQmFzZTo6U1RBVEVfSU5QVVRfU1RBUlRfVElNRV9TRVQsIHQpOworICAgIH0KK30KKwor
dm9pZCBDb21wb3NpdGVBbmltYXRpb246OnNldFRyYW5zaXRpb25TdGFydFRpbWUoaW50IHByb3Bl
cnR5LCBkb3VibGUgdCkKK3sKKyAgICAvLyBTZXQgdGhlIHN0YXJ0IHRpbWUgZm9yIGdpdmVuIHBy
b3BlcnR5IHRyYW5zaXRpb24KKyAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9p
dGVyYXRvciBlbmQgPSBtX3RyYW5zaXRpb25zLmVuZCgpOworICAgIGZvciAoQ1NTUHJvcGVydHlU
cmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7
IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogYW5pbSA9IGl0
LT5zZWNvbmQ7CisgICAgICAgIGlmIChhbmltICYmIGFuaW0tPndhaXRpbmdGb3JTdGFydFRpbWUo
KSAmJiBhbmltLT5hbmltYXRpbmdQcm9wZXJ0eSgpID09IHByb3BlcnR5KQorICAgICAgICAgICAg
YW5pbS0+dXBkYXRlU3RhdGVNYWNoaW5lKEFuaW1hdGlvbkJhc2U6OlNUQVRFX0lOUFVUX1NUQVJU
X1RJTUVfU0VULCB0KTsKKyAgICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpzdXNw
ZW5kQW5pbWF0aW9ucygpCit7CisgICAgaWYgKG1fc3VzcGVuZGVkKQorICAgICAgICByZXR1cm47
CisgICAgCisgICAgbV9zdXNwZW5kZWQgPSB0cnVlOworCisgICAgQW5pbWF0aW9uTmFtZU1hcDo6
Y29uc3RfaXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5lbmQoKTsKKyAgICBm
b3IgKEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZUFuaW1h
dGlvbnMuYmVnaW4oKTsgaXQgIT0ga2ZlbmQ7ICsraXQpIHsKKyAgICAgICAgS2V5ZnJhbWVBbmlt
YXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoYW5pbSkKKyAgICAgICAgICAg
IGFuaW0tPnVwZGF0ZVBsYXlTdGF0ZShmYWxzZSk7CisgICAgfQorCisgICAgQ1NTUHJvcGVydHlU
cmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsK
KyAgICBmb3IgKENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0g
bV90cmFuc2l0aW9ucy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgSW1wbGlj
aXRBbmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoYW5pbSAmJiBhbmlt
LT5oYXNTdHlsZSgpKQorICAgICAgICAgICAgYW5pbS0+dXBkYXRlUGxheVN0YXRlKGZhbHNlKTsK
KyAgICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpyZXN1bWVBbmltYXRpb25zKCkK
K3sKKyAgICBpZiAoIW1fc3VzcGVuZGVkKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgbV9z
dXNwZW5kZWQgPSBmYWxzZTsKKyAgICAKKyAgICBBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVy
YXRvciBrZmVuZCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmVuZCgpOworICAgIGZvciAoQW5pbWF0
aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5iZWdp
bigpOyBpdCAhPSBrZmVuZDsgKytpdCkgeworICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbiogYW5p
bSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmIChhbmltICYmIGFuaW0tPnBsYXlTdGF0ZVBsYXlp
bmcoKSkKKyAgICAgICAgICAgIGFuaW0tPnVwZGF0ZVBsYXlTdGF0ZSh0cnVlKTsKKyAgICB9Cisg
ICAgCisgICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0g
bV90cmFuc2l0aW9ucy5lbmQoKTsKKyAgICBmb3IgKENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6
OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsr
aXQpIHsKKyAgICAgICAgSW1wbGljaXRBbmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOworICAg
ICAgICBpZiAoYW5pbSAmJiBhbmltLT5oYXNTdHlsZSgpKQorICAgICAgICAgICAgYW5pbS0+dXBk
YXRlUGxheVN0YXRlKHRydWUpOworICAgIH0KK30KKwordm9pZCBDb21wb3NpdGVBbmltYXRpb246
Om92ZXJyaWRlSW1wbGljaXRBbmltYXRpb25zKGludCBwcm9wZXJ0eSkKK3sKKyAgICBDU1NQcm9w
ZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3RyYW5zaXRpb25zLmVu
ZCgpOworICAgIGZvciAoQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3Ig
aXQgPSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBJ
bXBsaWNpdEFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmIChhbmltICYm
IGFuaW0tPmFuaW1hdGluZ1Byb3BlcnR5KCkgPT0gcHJvcGVydHkpCisgICAgICAgICAgICBhbmlt
LT5zZXRPdmVycmlkZGVuKHRydWUpOworICAgIH0KK30KKwordm9pZCBDb21wb3NpdGVBbmltYXRp
b246OnJlc3VtZU92ZXJyaWRkZW5JbXBsaWNpdEFuaW1hdGlvbnMoaW50IHByb3BlcnR5KQorewor
ICAgIENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJh
bnNpdGlvbnMuZW5kKCk7CisgICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25z
dF9pdGVyYXRvciBpdCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7
CisgICAgICAgIEltcGxpY2l0QW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKKyAgICAgICAg
aWYgKGFuaW0gJiYgYW5pbS0+YW5pbWF0aW5nUHJvcGVydHkoKSA9PSBwcm9wZXJ0eSkKKyAgICAg
ICAgICAgIGFuaW0tPnNldE92ZXJyaWRkZW4oZmFsc2UpOworICAgIH0KK30KKworc3RhdGljIGlu
bGluZSBib29sIGNvbXBhcmVBbmltYXRpb25JbmRpY2VzKGNvbnN0IEtleWZyYW1lQW5pbWF0aW9u
KiBhLCBjb25zdCBLZXlmcmFtZUFuaW1hdGlvbiogYikKK3sKKyAgICByZXR1cm4gYS0+aW5kZXgo
KSA8IGItPmluZGV4KCk7Cit9CisKK3ZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpzdHlsZUF2YWls
YWJsZSgpCit7CisgICAgaWYgKG1fbnVtU3R5bGVBdmFpbGFibGVXYWl0ZXJzID09IDApCisgICAg
ICAgIHJldHVybjsKKyAgICAKKyAgICAvLyBXZSBoYXZlIHRvIGdvIHRocm91Z2ggYW5pbWF0aW9u
cyBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgaW4KKyAgICAvLyB0aGUgc3R5bGUs
IGJlY2F1c2Ugb3JkZXIgbWF0dGVycyBmb3IgYWRkaXRpdml0eS4KKyAgICBWZWN0b3I8S2V5ZnJh
bWVBbmltYXRpb24qPiBhbmltYXRpb25zKG1fa2V5ZnJhbWVBbmltYXRpb25zLnNpemUoKSk7Cisg
ICAgQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5p
bWF0aW9ucy5lbmQoKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChBbmltYXRpb25OYW1l
TWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmJlZ2luKCk7IGl0
ICE9IGtmZW5kOyArK2l0KSB7CisgICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBhbmltID0gaXQt
PnNlY29uZDsKKyAgICAgICAgLy8gV2UgY2FuJ3QganVzdCBpbnNlcnQgYmFzZWQgb24gYW5pbS0+
aW5kZXgoKSBiZWNhdXNlIGludmFsaWQgYW5pbWF0aW9ucyBkb24ndAorICAgICAgICAvLyBtYWtl
IGl0IGludG8gdGhlIGhhc2guCisgICAgICAgIGFuaW1hdGlvbnNbaSsrXSA9IGFuaW07CisgICAg
fQorCisgICAgaWYgKGFuaW1hdGlvbnMuc2l6ZSgpID4gMSkKKyAgICAgICAgc3RkOjpzdGFibGVf
c29ydChhbmltYXRpb25zLmJlZ2luKCksIGFuaW1hdGlvbnMuZW5kKCksIGNvbXBhcmVBbmltYXRp
b25JbmRpY2VzKTsKKyAgICAKKyAgICBmb3IgKGkgPSAwOyBpIDwgYW5pbWF0aW9ucy5zaXplKCk7
ICsraSkgeworICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbiogYW5pbSA9IGFuaW1hdGlvbnNbaV07
CisgICAgICAgIGlmIChhbmltICYmIGFuaW0tPndhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZSgpKQor
ICAgICAgICAgICAgYW5pbS0+dXBkYXRlU3RhdGVNYWNoaW5lKEFuaW1hdGlvbkJhc2U6OlNUQVRF
X0lOUFVUX1NUWUxFX0FWQUlMQUJMRSwgLTEpOworICAgIH0KKyAgICAKKyAgICBDU1NQcm9wZXJ0
eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3RyYW5zaXRpb25zLmVuZCgp
OworICAgIGZvciAoQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgaXQg
PSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBJbXBs
aWNpdEFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmIChhbmltICYmIGFu
aW0tPndhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZSgpKQorICAgICAgICAgICAgYW5pbS0+dXBkYXRl
U3RhdGVNYWNoaW5lKEFuaW1hdGlvbkJhc2U6OlNUQVRFX0lOUFVUX1NUWUxFX0FWQUlMQUJMRSwg
LTEpOworICAgIH0KK30KKworYm9vbCBDb21wb3NpdGVBbmltYXRpb246OmlzQW5pbWF0aW5nUHJv
cGVydHkoaW50IHByb3BlcnR5LCBib29sIGlzUnVubmluZ05vdykgY29uc3QKK3sKKyAgICBBbmlt
YXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBrZmVuZCA9IG1fa2V5ZnJhbWVBbmltYXRpb25z
LmVuZCgpOworICAgIGZvciAoQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBt
X2tleWZyYW1lQW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBrZmVuZDsgKytpdCkgeworICAgICAg
ICBLZXlmcmFtZUFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmIChhbmlt
ICYmIGFuaW0tPmlzQW5pbWF0aW5nUHJvcGVydHkocHJvcGVydHksIGlzUnVubmluZ05vdykpCisg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgQ1NTUHJvcGVydHlUcmFu
c2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKKyAg
ICBmb3IgKENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90
cmFuc2l0aW9ucy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgSW1wbGljaXRB
bmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT5p
c0FuaW1hdGluZ1Byb3BlcnR5KHByb3BlcnR5LCBpc1J1bm5pbmdOb3cpKQorICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKyAgICAKK3ZvaWQgQ29t
cG9zaXRlQW5pbWF0aW9uOjpzZXRXYWl0aW5nRm9yU3R5bGVBdmFpbGFibGUoYm9vbCB3YWl0aW5n
KQoreworICAgIGlmICh3YWl0aW5nKQorICAgICAgICBtX251bVN0eWxlQXZhaWxhYmxlV2FpdGVy
cysrOworICAgIGVsc2UKKyAgICAgICAgbV9udW1TdHlsZUF2YWlsYWJsZVdhaXRlcnMtLTsKKyAg
ICBtX2FuaW1hdGlvbkNvbnRyb2xsZXItPnNldFdhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZSh3YWl0
aW5nKTsKK30KKyAgICAKK30KSW5kZXg6IFdlYkNvcmUvcGFnZS9hbmltYXRpb24vQ29tcG9zaXRl
QW5pbWF0aW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9Db21wb3Np
dGVBbmltYXRpb24uaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGFnZS9hbmltYXRpb24vQ29t
cG9zaXRlQW5pbWF0aW9uLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIs
IEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3Jz
IG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAg
ICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJt
aXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJ
VFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICog
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1Ig
SVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMK
KyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZu
ZGVmIENvbXBvc2l0ZUFuaW1hdGlvbl9oCisjZGVmaW5lIENvbXBvc2l0ZUFuaW1hdGlvbl9oCisK
KyNpbmNsdWRlICJ3dGYvTm9uY29weWFibGUuaCIKKyNpbmNsdWRlICJBdG9taWNTdHJpbmcuaCIK
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBBbmltYXRpb25Db250cm9sbGVyOworY2xh
c3MgUmVuZGVyU3R5bGU7CitjbGFzcyBSZW5kZXJPYmplY3Q7CitjbGFzcyBLZXlmcmFtZUFuaW1h
dGlvbjsKK2NsYXNzIEltcGxpY2l0QW5pbWF0aW9uOworCisvLyBBIENvbXBvc2l0ZUFuaW1hdGlv
biByZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBhbmltYXRpb25zIHRoYXQgYXJlIHJ1bm5pbmcK
Ky8vIG9uIGEgc2luZ2xlIFJlbmRlck9iamVjdCwgc3VjaCBhcyBhIG51bWJlciBvZiBwcm9wZXJ0
aWVzIHRyYW5zaXRpb25pbmcgYXQgb25jZS4KK2NsYXNzIENvbXBvc2l0ZUFuaW1hdGlvbiA6IHB1
YmxpYyBOb25jb3B5YWJsZSB7CitwdWJsaWM6CisgICAgQ29tcG9zaXRlQW5pbWF0aW9uKEFuaW1h
dGlvbkNvbnRyb2xsZXIqIGFuaW1hdGlvbkNvbnRyb2xsZXIpCisgICAgOiBtX3N1c3BlbmRlZChm
YWxzZSkKKyAgICAsIG1fYW5pbWF0aW9uQ29udHJvbGxlcihhbmltYXRpb25Db250cm9sbGVyKQor
ICAgICwgbV9udW1TdHlsZUF2YWlsYWJsZVdhaXRlcnMoMCkKKyAgICB7IH0KKyAgICAKKyAgICB+
Q29tcG9zaXRlQW5pbWF0aW9uKCk7CisgICAgICAgIAorICAgIFJlbmRlclN0eWxlKiBhbmltYXRl
KFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUsIFJlbmRlclN0
eWxlKiB0YXJnZXRTdHlsZSk7CisgICAgCisgICAgdm9pZCBzZXRBbmltYXRpbmcoYm9vbCBpbkFu
aW1hdGluZyk7CisgICAgYm9vbCBhbmltYXRpbmcoKTsKKyAgICAKKyAgICBib29sIGhhc0FuaW1h
dGlvbkZvclByb3BlcnR5KGludCBwcm9wKSBjb25zdCB7IHJldHVybiBtX3RyYW5zaXRpb25zLmNv
bnRhaW5zKHByb3ApOyB9CisgICAgCisgICAgdm9pZCByZXNldFRyYW5zaXRpb25zKFJlbmRlck9i
amVjdCopOworICAgIHZvaWQgcmVzZXRBbmltYXRpb25zKFJlbmRlck9iamVjdCopOworICAgIAor
ICAgIHZvaWQgY2xlYW51cEZpbmlzaGVkQW5pbWF0aW9ucyhSZW5kZXJPYmplY3QqKTsKKworICAg
IHZvaWQgc2V0QW5pbWF0aW9uU3RhcnRUaW1lKGRvdWJsZSB0KTsKKyAgICB2b2lkIHNldFRyYW5z
aXRpb25TdGFydFRpbWUoaW50IHByb3BlcnR5LCBkb3VibGUgdCk7CisgICAgCisgICAgdm9pZCBz
dXNwZW5kQW5pbWF0aW9ucygpOworICAgIHZvaWQgcmVzdW1lQW5pbWF0aW9ucygpOworICAgIGJv
b2wgc3VzcGVuZGVkKCkgY29uc3QgeyByZXR1cm4gbV9zdXNwZW5kZWQ7IH0KKyAgICAKKyAgICB2
b2lkIG92ZXJyaWRlSW1wbGljaXRBbmltYXRpb25zKGludCBwcm9wZXJ0eSk7CisgICAgdm9pZCBy
ZXN1bWVPdmVycmlkZGVuSW1wbGljaXRBbmltYXRpb25zKGludCBwcm9wZXJ0eSk7CisgICAgCisg
ICAgdm9pZCBzdHlsZUF2YWlsYWJsZSgpOworICAgIAorICAgIGJvb2wgaXNBbmltYXRpbmdQcm9w
ZXJ0eShpbnQgcHJvcGVydHksIGJvb2wgaXNSdW5uaW5nTm93KSBjb25zdDsKKyAgICAKKyAgICB2
b2lkIHNldFdhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZShib29sIHdhaXRpbmcpOworCitwcm90ZWN0
ZWQ6CisgICAgdm9pZCB1cGRhdGVUcmFuc2l0aW9ucyhSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBj
b25zdCBSZW5kZXJTdHlsZSogY3VycmVudFN0eWxlLCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUp
OworICAgIHZvaWQgdXBkYXRlS2V5ZnJhbWVBbmltYXRpb25zKFJlbmRlck9iamVjdCogcmVuZGVy
ZXIsIGNvbnN0IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUsIFJlbmRlclN0eWxlKiB0YXJnZXRT
dHlsZSk7CisKKyAgICBLZXlmcmFtZUFuaW1hdGlvbiogZmluZEtleWZyYW1lQW5pbWF0aW9uKGNv
bnN0IEF0b21pY1N0cmluZyYgbmFtZSk7CisgICAgCitwcml2YXRlOgorICAgIHR5cGVkZWYgSGFz
aE1hcDxpbnQsIEltcGxpY2l0QW5pbWF0aW9uKj4gQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDsK
KyAgICB0eXBlZGVmIEhhc2hNYXA8QXRvbWljU3RyaW5nSW1wbCosIEtleWZyYW1lQW5pbWF0aW9u
Kj4gIEFuaW1hdGlvbk5hbWVNYXA7CisgICAgCisgICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01h
cCAgIG1fdHJhbnNpdGlvbnM7CisgICAgQW5pbWF0aW9uTmFtZU1hcCAgICAgICAgICAgIG1fa2V5
ZnJhbWVBbmltYXRpb25zOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtX3N1c3Bl
bmRlZDsKKyAgICBBbmltYXRpb25Db250cm9sbGVyKiAgICAgICAgbV9hbmltYXRpb25Db250cm9s
bGVyOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtX251bVN0eWxlQXZhaWxhYmxl
V2FpdGVyczsKK307CisKK30KKworI2VuZGlmCkluZGV4OiBXZWJDb3JlL3BhZ2UvYW5pbWF0aW9u
L0ltcGxpY2l0QW5pbWF0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BhZ2UvYW5pbWF0
aW9uL0ltcGxpY2l0QW5pbWF0aW9uLmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGFnZS9h
bmltYXRpb24vSW1wbGljaXRBbmltYXRpb24uY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE1
NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgor
ICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFw
cGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRz
IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMg
ZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9y
IHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
IElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkltcGxpY2l0QW5pbWF0aW9u
LmgiCisjaW5jbHVkZSAiUmVuZGVyT2JqZWN0LmgiCisjaW5jbHVkZSAiRXZlbnROYW1lcy5oIgor
I2luY2x1ZGUgIkNTU1Byb3BlcnR5TmFtZXMuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitJ
bXBsaWNpdEFuaW1hdGlvbjo6SW1wbGljaXRBbmltYXRpb24oY29uc3QgQW5pbWF0aW9uKiB0cmFu
c2l0aW9uLCBpbnQgYW5pbWF0aW5nUHJvcGVydHksIFJlbmRlck9iamVjdCogcmVuZGVyZXIsIENv
bXBvc2l0ZUFuaW1hdGlvbiogY29tcEFuaW0pCis6IEFuaW1hdGlvbkJhc2UodHJhbnNpdGlvbiwg
cmVuZGVyZXIsIGNvbXBBbmltKQorLCBtX3RyYW5zaXRpb25Qcm9wZXJ0eSh0cmFuc2l0aW9uLT5w
cm9wZXJ0eSgpKQorLCBtX2FuaW1hdGluZ1Byb3BlcnR5KGFuaW1hdGluZ1Byb3BlcnR5KQorLCBt
X292ZXJyaWRkZW4oZmFsc2UpCissIG1fZnJvbVN0eWxlKDApCissIG1fdG9TdHlsZSgwKQorewor
ICAgIEFTU0VSVChhbmltYXRpbmdQcm9wZXJ0eSAhPSBjQW5pbWF0ZUFsbCk7Cit9CisgICAgCiti
b29sIEltcGxpY2l0QW5pbWF0aW9uOjpzaG91bGRTZW5kRXZlbnRGb3JMaXN0ZW5lcihEb2N1bWVu
dDo6TGlzdGVuZXJUeXBlIGluTGlzdGVuZXJUeXBlKQoreworICAgIHJldHVybiBtX29iamVjdC0+
ZG9jdW1lbnQoKS0+aGFzTGlzdGVuZXJUeXBlKGluTGlzdGVuZXJUeXBlKTsKK30KKwordm9pZCBJ
bXBsaWNpdEFuaW1hdGlvbjo6YW5pbWF0ZShDb21wb3NpdGVBbmltYXRpb24qIGFuaW1hdGlvbiwg
UmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5bGUqIGN1cnJlbnRTdHlsZSwg
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRlclN0eWxlKiB0YXJn
ZXRTdHlsZSwgUmVuZGVyU3R5bGUqJiBhbmltYXRlZFN0eWxlKQoreworICAgIGlmIChwYXVzZWQo
KSkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIC8vIElmIHdlIGdldCB0aGlzIGZhciBhbmQg
dGhlIGFuaW1hdGlvbiBpcyBkb25lLCBpdCBtZWFucyB3ZSBhcmUgY2xlYW5pbmcgdXAgYSBqdXN0
IGZpbmlzaGVkIGFuaW1hdGlvbi4KKyAgICAvLyBTbyBqdXN0IHJldHVybi4gRXZlcnl0aGluZyBp
cyBhbHJlYWR5IGFsbCBjbGVhbmVkIHVwCisgICAgaWYgKHBvc3RBY3RpdmUoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgLy8gUmVzZXQgdG8gc3RhcnQgdGhlIHRyYW5zaXRpb24gaWYgd2UgYXJl
IG5ldworICAgIGlmIChpc05ldygpKQorICAgICAgICByZXNldChyZW5kZXJlciwgY3VycmVudFN0
eWxlLCB0YXJnZXRTdHlsZSk7CisgICAgCisgICAgLy8gUnVuIGEgY3ljbGUgb2YgYW5pbWF0aW9u
LgorICAgIC8vIFdlIGtub3cgd2Ugd2lsbCBuZWVkIGEgbmV3IHJlbmRlciBzdHlsZSwgc28gbWFr
ZSBvbmUgaWYgbmVlZGVkCisgICAgaWYgKCFhbmltYXRlZFN0eWxlKQorICAgICAgICBhbmltYXRl
ZFN0eWxlID0gbmV3IChyZW5kZXJlci0+cmVuZGVyQXJlbmEoKSkgUmVuZGVyU3R5bGUoKnRhcmdl
dFN0eWxlKTsKKyAgICAKKyAgICBkb3VibGUgcHJvZyA9IHByb2dyZXNzKDEsIDApOworICAgIGJv
b2wgbmVlZHNBbmltID0gYmxlbmRQcm9wZXJ0aWVzKG1fYW5pbWF0aW5nUHJvcGVydHksIGFuaW1h
dGVkU3R5bGUsIG1fZnJvbVN0eWxlLCBtX3RvU3R5bGUsIHByb2cpOworICAgIGlmIChuZWVkc0Fu
aW0pCisgICAgICAgIHNldEFuaW1hdGluZygpOworfQorCit2b2lkIEltcGxpY2l0QW5pbWF0aW9u
OjpvbkFuaW1hdGlvbkVuZChkb3VibGUgaW5FbGFwc2VkVGltZSkKK3sKKyAgICBpZiAoIXNlbmRU
cmFuc2l0aW9uRXZlbnQoRXZlbnROYW1lczo6d2Via2l0VHJhbnNpdGlvbkVuZEV2ZW50LCBpbkVs
YXBzZWRUaW1lKSkgeworICAgICAgICAvLyBXZSBkaWRuJ3QgZGlzcGF0Y2ggYW4gZXZlbnQsIHdo
aWNoIHdvdWxkIGNhbGwgZW5kQW5pbWF0aW9uKCksIHNvIHdlJ2xsIGp1c3QgY2FsbCBpdCBoZXJl
LgorICAgICAgICBlbmRBbmltYXRpb24odHJ1ZSk7CisgICAgfQorfQorCitib29sIEltcGxpY2l0
QW5pbWF0aW9uOjpzZW5kVHJhbnNpdGlvbkV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyYgaW5FdmVu
dFR5cGUsIGRvdWJsZSBpbkVsYXBzZWRUaW1lKQoreworICAgIGlmIChpbkV2ZW50VHlwZSA9PSBF
dmVudE5hbWVzOjp3ZWJraXRUcmFuc2l0aW9uRW5kRXZlbnQpIHsKKyAgICAgICAgRG9jdW1lbnQ6
Okxpc3RlbmVyVHlwZSBsaXN0ZW5lclR5cGUgPSBEb2N1bWVudDo6VFJBTlNJVElPTkVORF9MSVNU
RU5FUjsKKyAgICAgICAgCisgICAgICAgIGlmIChzaG91bGRTZW5kRXZlbnRGb3JMaXN0ZW5lcihs
aXN0ZW5lclR5cGUpKSB7CisgICAgICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gZWxlbWVudEZv
ckV2ZW50RGlzcGF0Y2goKTsKKyAgICAgICAgICAgIGlmIChlbGVtZW50KSB7CisgICAgICAgICAg
ICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZTsKKyAgICAgICAgICAgICAgICBpZiAobV90cmFuc2l0
aW9uUHJvcGVydHkgIT0gY0FuaW1hdGVBbGwpCisgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5
TmFtZSA9IFN0cmluZyhnZXRQcm9wZXJ0eU5hbWUoKENTU1Byb3BlcnR5SUQpbV90cmFuc2l0aW9u
UHJvcGVydHkpKTsKKyAgICAgICAgICAgICAgICBtX3dhaXRpbmdGb3JFbmRFdmVudCA9IHRydWU7
CisgICAgICAgICAgICAgICAgbV9hbmltYXRpb25FdmVudERpc3BhdGNoZXIuc3RhcnRUaW1lcihl
bGVtZW50LCBwcm9wZXJ0eU5hbWUsIG1fdHJhbnNpdGlvblByb3BlcnR5LCB0cnVlLCBpbkV2ZW50
VHlwZSwgaW5FbGFwc2VkVGltZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIERp
ZCBkaXNwYXRjaCBhbiBldmVudAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAg
IAorICAgIHJldHVybiBmYWxzZTsgLy8gRGlkbid0IGRpc3BhdGNoIGFuIGV2ZW50Cit9CisKK3Zv
aWQgSW1wbGljaXRBbmltYXRpb246OnJlc2V0KFJlbmRlck9iamVjdCogcmVuZGVyZXIsIGNvbnN0
IFJlbmRlclN0eWxlKiBmcm9tIC8qID0gMCAqLywgY29uc3QgUmVuZGVyU3R5bGUqIHRvIC8qID0g
MCAqLykKK3sKKyAgICBBU1NFUlQoKCFtX3RvU3R5bGUgJiYgIXRvKSB8fCBtX3RvU3R5bGUgIT0g
dG8pOworICAgIEFTU0VSVCgoIW1fZnJvbVN0eWxlICYmICFmcm9tKSB8fCBtX2Zyb21TdHlsZSAh
PSBmcm9tKTsKKyAgICBpZiAobV9mcm9tU3R5bGUpCisgICAgICAgIG1fZnJvbVN0eWxlLT5kZXJl
ZihyZW5kZXJlci0+cmVuZGVyQXJlbmEoKSk7CisgICAgaWYgKG1fdG9TdHlsZSkKKyAgICAgICAg
bV90b1N0eWxlLT5kZXJlZihyZW5kZXJlci0+cmVuZGVyQXJlbmEoKSk7CisgICAgCisgICAgbV9m
cm9tU3R5bGUgPSBjb25zdF9jYXN0PFJlbmRlclN0eWxlKj4oZnJvbSk7ICAgLy8gaXQgaXMgcmVh
ZC1vbmx5LCBvdGhlciB0aGFuIHRoZSByZWYKKyAgICBpZiAobV9mcm9tU3R5bGUpCisgICAgICAg
IG1fZnJvbVN0eWxlLT5yZWYoKTsKKyAgICAKKyAgICBtX3RvU3R5bGUgPSBjb25zdF9jYXN0PFJl
bmRlclN0eWxlKj4odG8pOyAgICAgICAvLyBpdCBpcyByZWFkLW9ubHksIG90aGVyIHRoYW4gdGhl
IHJlZgorICAgIGlmIChtX3RvU3R5bGUpCisgICAgICAgIG1fdG9TdHlsZS0+cmVmKCk7CisgICAg
CisgICAgLy8gcmVzdGFydCB0aGUgdHJhbnNpdGlvbgorICAgIGlmIChmcm9tICYmIHRvKQorICAg
ICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUoU1RBVEVfSU5QVVRfUkVTVEFSVF9BTklNQVRJT04sIC0x
KTsKK30KKwordm9pZCBJbXBsaWNpdEFuaW1hdGlvbjo6c2V0T3ZlcnJpZGRlbihib29sIGIpCit7
CisgICAgaWYgKGIgIT0gbV9vdmVycmlkZGVuKSB7CisgICAgICAgIG1fb3ZlcnJpZGRlbiA9IGI7
CisgICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShtX292ZXJyaWRkZW4gPyBTVEFURV9JTlBVVF9Q
QVVTRV9PVkVSUklERSA6IFNUQVRFX0lOUFVUX1JFU1VNRV9PVkVSUklERSwgLTEpOworICAgIH0K
K30KKworYm9vbCBJbXBsaWNpdEFuaW1hdGlvbjo6YWZmZWN0c1Byb3BlcnR5KGludCBwcm9wZXJ0
eSkgY29uc3QKK3sKKyAgICByZXR1cm4gKG1fYW5pbWF0aW5nUHJvcGVydHkgPT0gcHJvcGVydHkp
OworfQorCitib29sIEltcGxpY2l0QW5pbWF0aW9uOjppc1RhcmdldFByb3BlcnR5RXF1YWwoaW50
IHByb3AsIGNvbnN0IFJlbmRlclN0eWxlKiB0YXJnZXRTdHlsZSkKK3sKKyAgICByZXR1cm4gcHJv
cGVydGllc0VxdWFsKHByb3AsIG1fdG9TdHlsZSwgdGFyZ2V0U3R5bGUpOworfQorCit2b2lkIElt
cGxpY2l0QW5pbWF0aW9uOjpibGVuZFByb3BlcnR5VmFsdWVJblN0eWxlKGludCBwcm9wLCBSZW5k
ZXJTdHlsZSogY3VycmVudFN0eWxlKQoreworICAgIGRvdWJsZSBwcm9nID0gcHJvZ3Jlc3MoMSwg
MCk7CisgICAgYmxlbmRQcm9wZXJ0aWVzKHByb3AsIGN1cnJlbnRTdHlsZSwgbV9mcm9tU3R5bGUs
IG1fdG9TdHlsZSwgcHJvZyk7Cit9ICAgIAorICAgIAorfQpJbmRleDogV2ViQ29yZS9wYWdlL2Fu
aW1hdGlvbi9JbXBsaWNpdEFuaW1hdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGFnZS9h
bmltYXRpb24vSW1wbGljaXRBbmltYXRpb24uaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGFn
ZS9hbmltYXRpb24vSW1wbGljaXRBbmltYXRpb24uaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw5
NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgor
ICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFw
cGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRz
IGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMg
ZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9y
IHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
IElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFU
QSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
CisgKi8KKworI2lmbmRlZiBJbXBsaWNpdEFuaW1hdGlvbl9oCisjZGVmaW5lIEltcGxpY2l0QW5p
bWF0aW9uX2gKKworI2luY2x1ZGUgIkFuaW1hdGlvbkJhc2UuaCIKKyNpbmNsdWRlICJEb2N1bWVu
dC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIEFuIEltcGxpY2l0QW5pbWF0aW9uIHRy
YWNrcyB0aGUgc3RhdGUgb2YgYSB0cmFuc2l0aW9uIG9mIGEgc3BlY2lmaWMgQ1NTIHByb3BlcnR5
CisvLyBmb3IgYSBzaW5nbGUgUmVuZGVyT2JqZWN0LgorY2xhc3MgSW1wbGljaXRBbmltYXRpb24g
OiBwdWJsaWMgQW5pbWF0aW9uQmFzZSB7CitwdWJsaWM6CisgICAgSW1wbGljaXRBbmltYXRpb24o
Y29uc3QgQW5pbWF0aW9uKiB0cmFuc2l0aW9uLCBpbnQgYW5pbWF0aW5nUHJvcGVydHksIFJlbmRl
ck9iamVjdCogcmVuZGVyZXIsIENvbXBvc2l0ZUFuaW1hdGlvbiogY29tcEFuaW0pOyAgICAKKyAg
ICB2aXJ0dWFsIH5JbXBsaWNpdEFuaW1hdGlvbigpCisgICAgeworICAgICAgICBBU1NFUlQoIW1f
ZnJvbVN0eWxlICYmICFtX3RvU3R5bGUpOworICAgICAgICAKKyAgICAgICAgLy8gSWYgd2Ugd2Vy
ZSB3YWl0aW5nIGZvciBhbiBlbmQgZXZlbnQsIHdlIG5lZWQgdG8gZmluaXNoIHRoZSBhbmltYXRp
b24gdG8gbWFrZSBzdXJlIG5vIG9sZAorICAgICAgICAvLyBhbmltYXRpb25zIHN0aWNrIGFyb3Vu
ZCBpbiB0aGUgbG93ZXIgbGV2ZWxzCisgICAgICAgIGlmICh3YWl0aW5nRm9yRW5kRXZlbnQoKSAm
JiBtX29iamVjdCkKKyAgICAgICAgICAgIEFTU0VSVCgwKTsKKyAgICAgICAgCisgICAgICAgIC8v
IERvIHRoZSBjbGVhbnVwIGhlcmUgaW5zdGVhZCBvZiBpbiB0aGUgYmFzZSBjbGFzcyBzbyB0aGUg
c3BlY2lhbGl6ZWQgbWV0aG9kcyBnZXQgY2FsbGVkCisgICAgICAgIGlmICghcG9zdEFjdGl2ZSgp
KQorICAgICAgICAgICAgdXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVUX0VORF9BTklNQVRJ
T04sIC0xKTsgICAgIAorICAgIH0KKyAgICAKKyAgICBpbnQgdHJhbnNpdGlvblByb3BlcnR5KCkg
Y29uc3QgeyByZXR1cm4gbV90cmFuc2l0aW9uUHJvcGVydHk7IH0KKyAgICBpbnQgYW5pbWF0aW5n
UHJvcGVydHkoKSBjb25zdCB7IHJldHVybiBtX2FuaW1hdGluZ1Byb3BlcnR5OyB9CisgICAgCisg
ICAgdmlydHVhbCB2b2lkIG9uQW5pbWF0aW9uRW5kKGRvdWJsZSBpbkVsYXBzZWRUaW1lKTsKKyAg
ICAKKyAgICB2aXJ0dWFsIHZvaWQgYW5pbWF0ZShDb21wb3NpdGVBbmltYXRpb24qLCBSZW5kZXJP
YmplY3QqLCBjb25zdCBSZW5kZXJTdHlsZSogY3VycmVudFN0eWxlLCAKKyAgICAgICAgICAgICAg
ICAgICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUsIFJlbmRlclN0eWxlKiYg
YW5pbWF0ZWRTdHlsZSk7CisgICAgdmlydHVhbCB2b2lkIHJlc2V0KFJlbmRlck9iamVjdCogcmVu
ZGVyZXIsIGNvbnN0IFJlbmRlclN0eWxlKiBmcm9tID0gMCwgY29uc3QgUmVuZGVyU3R5bGUqIHRv
ID0gMCk7CisgICAgCisgICAgdm9pZCBzZXRPdmVycmlkZGVuKGJvb2wgYik7CisgICAgdmlydHVh
bCBib29sIG92ZXJyaWRkZW4oKSBjb25zdCB7IHJldHVybiBtX292ZXJyaWRkZW47IH0KKyAgICAK
KyAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkRmlyZUV2ZW50cygpIGNvbnN0IHsgcmV0dXJuIHRydWU7
IH0KKyAgICAKKyAgICB2aXJ0dWFsIGJvb2wgYWZmZWN0c1Byb3BlcnR5KGludCBwcm9wZXJ0eSkg
Y29uc3Q7CisgICAgCisgICAgYm9vbCBoYXNTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fZnJvbVN0
eWxlICYmIG1fdG9TdHlsZTsgfQorICAgIAorICAgIGJvb2wgaXNUYXJnZXRQcm9wZXJ0eUVxdWFs
KGludCBwcm9wLCBjb25zdCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUpOworCisgICAgdm9pZCBi
bGVuZFByb3BlcnR5VmFsdWVJblN0eWxlKGludCBwcm9wLCBSZW5kZXJTdHlsZSogY3VycmVudFN0
eWxlKTsKKyAgICAKK3Byb3RlY3RlZDoKKyAgICBib29sIHNob3VsZFNlbmRFdmVudEZvckxpc3Rl
bmVyKERvY3VtZW50OjpMaXN0ZW5lclR5cGUgaW5MaXN0ZW5lclR5cGUpOyAgICAKKyAgICBib29s
IHNlbmRUcmFuc2l0aW9uRXZlbnQoY29uc3QgQXRvbWljU3RyaW5nJiBpbkV2ZW50VHlwZSwgZG91
YmxlIGluRWxhcHNlZFRpbWUpOworICAgIAorcHJpdmF0ZToKKyAgICBpbnQgbV90cmFuc2l0aW9u
UHJvcGVydHk7ICAgLy8gVHJhbnNpdGlvbiBwcm9wZXJ0eSBhcyBzcGVjaWZpZWQgaW4gdGhlIFJl
bmRlclN0eWxlLiBNYXkgYmUgY0FuaW1hdGVBbGwKKyAgICBpbnQgbV9hbmltYXRpbmdQcm9wZXJ0
eTsgICAgLy8gU3BlY2lmaWMgcHJvcGVydHkgZm9yIHRoaXMgSW1wbGljaXRBbmltYXRpb24KKyAg
ICBib29sIG1fb3ZlcnJpZGRlbjsgICAgICAgICAgLy8gdHJ1ZSB3aGVuIHRoZXJlIGlzIGEga2V5
ZnJhbWUgYW5pbWF0aW9uIHRoYXQgb3ZlcnJpZGVzIHRoZSB0cmFuc2l0aW9uaW5nIHByb3BlcnR5
CisgICAgCisgICAgLy8gVGhlIHR3byBzdHlsZXMgdGhhdCB3ZSBhcmUgYmxlbmRpbmcuCisgICAg
UmVuZGVyU3R5bGUqIG1fZnJvbVN0eWxlOworICAgIFJlbmRlclN0eWxlKiBtX3RvU3R5bGU7Cit9
OworCit9CisKKyNlbmRpZgpJbmRleDogV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9LZXlmcmFtZUFu
aW1hdGlvbi5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9LZXlmcmFt
ZUFuaW1hdGlvbi5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BhZ2UvYW5pbWF0aW9uL0tl
eWZyYW1lQW5pbWF0aW9uLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxOTIgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4gCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4gCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRl
ciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRv
cnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAq
ICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBl
cm1pc3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5E
IElUUyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisg
KiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBP
UiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UworICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBB
TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJLZXlmcmFtZUFuaW1hdGlvbi5oIgorI2luY2x1
ZGUgIkNvbXBvc2l0ZUFuaW1hdGlvbi5oIgorI2luY2x1ZGUgIlN5c3RlbVRpbWUuaCIKKyNpbmNs
dWRlICJSZW5kZXJPYmplY3QuaCIKKyNpbmNsdWRlICJFdmVudE5hbWVzLmgiCisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKwordm9pZCBLZXlmcmFtZUFuaW1hdGlvbjo6YW5pbWF0ZShDb21wb3NpdGVB
bmltYXRpb24qIGFuaW1hdGlvbiwgUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVy
U3R5bGUqIGN1cnJlbnRTdHlsZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjb25zdCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUsIFJlbmRlclN0eWxlKiYgYW5pbWF0ZWRT
dHlsZSkKK3sKKyAgICAvLyBpZiB3ZSBoYXZlIG5vdCB5ZXQgc3RhcnRlZCwgd2Ugd2lsbCBub3Qg
aGF2ZSBhIHZhbGlkIHN0YXJ0IHRpbWUsIHNvIGp1c3Qgc3RhcnQgdGhlIGFuaW1hdGlvbiBpZiBu
ZWVkZWQKKyAgICBpZiAoaXNOZXcoKSAmJiBtX2FuaW1hdGlvbi0+cGxheVN0YXRlKCkgPT0gQW5p
bVBsYXlTdGF0ZVBsYXlpbmcpCisgICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFURV9JTlBV
VF9TVEFSVF9BTklNQVRJT04sIC0xKTsKKyAgICAKKyAgICAvLyBJZiB3ZSBnZXQgdGhpcyBmYXIg
YW5kIHRoZSBhbmltYXRpb24gaXMgZG9uZSwgaXQgbWVhbnMgd2UgYXJlIGNsZWFuaW5nIHVwIGEg
anVzdCBmaW5pc2hlZCBhbmltYXRpb24uCisgICAgLy8gSWYgc28sIHdlIG5lZWQgdG8gc2VuZCBi
YWNrIHRoZSB0YXJnZXRTdHlsZQorICAgIGlmIChwb3N0QWN0aXZlKCkpIHsKKyAgICAgICAgaWYg
KCFhbmltYXRlZFN0eWxlKQorICAgICAgICAgICAgYW5pbWF0ZWRTdHlsZSA9IGNvbnN0X2Nhc3Q8
UmVuZGVyU3R5bGUqPih0YXJnZXRTdHlsZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICAvLyBpZiB3ZSBhcmUgd2FpdGluZyBmb3IgdGhlIHN0YXJ0IHRpbWVyLCB3ZSBkb24ndCB3YW50
IHRvIGNoYW5nZSB0aGUgc3R5bGUgeWV0CisgICAgLy8gU3BlY2lhbCBjYXNlIC0gaWYgdGhlIGRl
bGF5IHRpbWUgaXMgMCwgdGhlbiB3ZSBkbyB3YW50IHRvIHNldCB0aGUgZmlyc3QgZnJhbWUgb2Yg
dGhlCisgICAgLy8gYW5pbWF0aW9uIHJpZ2h0IGF3YXkuIFRoaXMgYXZvaWRzIGEgZmxhc2ggd2hl
biB0aGUgYW5pbWF0aW9uIHN0YXJ0cworICAgIGlmICh3YWl0aW5nVG9TdGFydCgpICYmIG1fYW5p
bWF0aW9uLT5kZWxheSgpID4gMCkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIC8vIEZJWE1F
OiB3ZSBuZWVkIHRvIGJlIG1vcmUgZWZmaWNpZW50IGFib3V0IGRldGVybWluaW5nIHdoaWNoIGtl
eWZyYW1lcyB3ZSBhcmUgYW5pbWF0aW5nIGJldHdlZW4uCisgICAgLy8gV2Ugc2hvdWxkIGNhY2hl
IHRoZSBsYXN0IHBhaXIgb3Igc29tZXRoaW5nCisgICAgCisgICAgLy8gZmluZCB0aGUgZmlyc3Qg
a2V5CisgICAgZG91YmxlIGVsYXBzZWRUaW1lID0gKG1fc3RhcnRUaW1lID4gMCkgPyAoKCFwYXVz
ZWQoKSA/IGN1cnJlbnRUaW1lKCkgOiBtX3BhdXNlVGltZSkgLSBtX3N0YXJ0VGltZSkgOiAwLjA7
CisgICAgaWYgKGVsYXBzZWRUaW1lIDwgMC4wKQorICAgICAgICBlbGFwc2VkVGltZSA9IDAuMDsK
KyAgICAgICAgCisgICAgZG91YmxlIHQgPSBtX2FuaW1hdGlvbi0+ZHVyYXRpb24oKSA/IChlbGFw
c2VkVGltZSAvIG1fYW5pbWF0aW9uLT5kdXJhdGlvbigpKSA6IDEuMDsKKyAgICBpbnQgaSA9IChp
bnQpIHQ7CisgICAgdCAtPSBpOworICAgIGlmIChtX2FuaW1hdGlvbi0+ZGlyZWN0aW9uKCkgJiYg
KGkgJiAxKSkKKyAgICAgICAgdCA9IDEgLSB0OworCisgICAgUmVuZGVyU3R5bGUqIGZyb21TdHls
ZSA9IDA7CisgICAgUmVuZGVyU3R5bGUqIHRvU3R5bGUgPSAwOworICAgIGRvdWJsZSBzY2FsZSA9
IDEuMDsKKyAgICBkb3VibGUgb2Zmc2V0ID0gMC4wOworICAgIGlmIChtX2tleWZyYW1lcy5nZXQo
KSkgeworICAgICAgICBWZWN0b3I8S2V5ZnJhbWVWYWx1ZT46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9
IG1fa2V5ZnJhbWVzLT5lbmRLZXlmcmFtZXMoKTsKKyAgICAgICAgZm9yIChWZWN0b3I8S2V5ZnJh
bWVWYWx1ZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZXMtPmJlZ2luS2V5ZnJhbWVz
KCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICAgICAgaWYgKHQgPCBpdC0+a2V5KSB7Cisg
ICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IGtleSBzaG91bGQgYWx3YXlzIGJlIDAsIHNvIHdl
IHNob3VsZCBuZXZlciBzdWNjZWVkIG9uIHRoZSBmaXJzdCBrZXkKKyAgICAgICAgICAgICAgICBp
ZiAoIWZyb21TdHlsZSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAg
ICAgc2NhbGUgPSAxLjAgLyAoaXQtPmtleSAtIG9mZnNldCk7CisgICAgICAgICAgICAgICAgdG9T
dHlsZSA9IGNvbnN0X2Nhc3Q8UmVuZGVyU3R5bGUqPigmKGl0LT5zdHlsZSkpOworICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBv
ZmZzZXQgPSBpdC0+a2V5OworICAgICAgICAgICAgZnJvbVN0eWxlID0gY29uc3RfY2FzdDxSZW5k
ZXJTdHlsZSo+KCYoaXQtPnN0eWxlKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLy8g
aWYgZWl0aGVyIHN0eWxlIGlzIDAgd2UgaGF2ZSBhbiBpbnZhbGlkIGNhc2UsIGp1c3Qgc3RvcCB0
aGUgYW5pbWF0aW9uCisgICAgaWYgKCFmcm9tU3R5bGUgfHwgIXRvU3R5bGUpIHsKKyAgICAgICAg
dXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVUX0VORF9BTklNQVRJT04sIC0xKTsKKyAgICAg
ICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICAvLyBydW4gYSBjeWNsZSBvZiBhbmltYXRpb24u
CisgICAgLy8gV2Uga25vdyB3ZSB3aWxsIG5lZWQgYSBuZXcgcmVuZGVyIHN0eWxlLCBzbyBtYWtl
IG9uZSBpZiBuZWVkZWQKKyAgICBpZiAoIWFuaW1hdGVkU3R5bGUpCisgICAgICAgIGFuaW1hdGVk
U3R5bGUgPSBuZXcgKHJlbmRlcmVyLT5yZW5kZXJBcmVuYSgpKSBSZW5kZXJTdHlsZSgqdGFyZ2V0
U3R5bGUpOworICAgIAorICAgIGRvdWJsZSBwcm9nID0gcHJvZ3Jlc3Moc2NhbGUsIG9mZnNldCk7
CisKKyAgICBIYXNoU2V0PGludD46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fa2V5ZnJhbWVzLT5l
bmRQcm9wZXJ0aWVzKCk7CisgICAgZm9yIChIYXNoU2V0PGludD46OmNvbnN0X2l0ZXJhdG9yIGl0
ID0gbV9rZXlmcmFtZXMtPmJlZ2luUHJvcGVydGllcygpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAg
ICAgICAgaWYgKGJsZW5kUHJvcGVydGllcygqaXQsIGFuaW1hdGVkU3R5bGUsIGZyb21TdHlsZSwg
dG9TdHlsZSwgcHJvZykpCisgICAgICAgICAgICBzZXRBbmltYXRpbmcoKTsKKyAgICB9Cit9CisK
K3ZvaWQgS2V5ZnJhbWVBbmltYXRpb246OmVuZEFuaW1hdGlvbihib29sIHJlc2V0KQoreworICAg
IC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsICh1bmFuaW1hdGVkKSBzdHlsZQorICAgIGlmIChtX29i
amVjdCkKKyAgICAgICAgc2V0Q2hhbmdlZChtX29iamVjdC0+ZWxlbWVudCgpKTsKK30KKworYm9v
bCBLZXlmcmFtZUFuaW1hdGlvbjo6c2hvdWxkU2VuZEV2ZW50Rm9yTGlzdGVuZXIoRG9jdW1lbnQ6
Okxpc3RlbmVyVHlwZSBpbkxpc3RlbmVyVHlwZSkKK3sKKyAgICByZXR1cm4gbV9vYmplY3QtPmRv
Y3VtZW50KCktPmhhc0xpc3RlbmVyVHlwZShpbkxpc3RlbmVyVHlwZSk7Cit9CisgICAgCit2b2lk
IEtleWZyYW1lQW5pbWF0aW9uOjpvbkFuaW1hdGlvblN0YXJ0KGRvdWJsZSBpbkVsYXBzZWRUaW1l
KQoreworICAgIHNlbmRBbmltYXRpb25FdmVudChFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRpb25T
dGFydEV2ZW50LCBpbkVsYXBzZWRUaW1lKTsKK30KKwordm9pZCBLZXlmcmFtZUFuaW1hdGlvbjo6
b25BbmltYXRpb25JdGVyYXRpb24oZG91YmxlIGluRWxhcHNlZFRpbWUpCit7CisgICAgc2VuZEFu
aW1hdGlvbkV2ZW50KEV2ZW50TmFtZXM6OndlYmtpdEFuaW1hdGlvbkl0ZXJhdGlvbkV2ZW50LCBp
bkVsYXBzZWRUaW1lKTsKK30KKwordm9pZCBLZXlmcmFtZUFuaW1hdGlvbjo6b25BbmltYXRpb25F
bmQoZG91YmxlIGluRWxhcHNlZFRpbWUpCit7CisgICAgaWYgKCFzZW5kQW5pbWF0aW9uRXZlbnQo
RXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uRW5kRXZlbnQsIGluRWxhcHNlZFRpbWUpKSB7Cisg
ICAgICAgIC8vIFdlIGRpZG4ndCBkaXNwYXRjaCBhbiBldmVudCwgd2hpY2ggd291bGQgY2FsbCBl
bmRBbmltYXRpb24oKSwgc28gd2UnbGwganVzdCBjYWxsIGl0IGhlcmUuCisgICAgICAgIGVuZEFu
aW1hdGlvbih0cnVlKTsKKyAgICB9Cit9CisKK2Jvb2wgS2V5ZnJhbWVBbmltYXRpb246OnNlbmRB
bmltYXRpb25FdmVudChjb25zdCBBdG9taWNTdHJpbmcmIGluRXZlbnRUeXBlLCBkb3VibGUgaW5F
bGFwc2VkVGltZSkKK3sKKyAgICBEb2N1bWVudDo6TGlzdGVuZXJUeXBlIGxpc3RlbmVyVHlwZTsK
KyAgICBpZiAoaW5FdmVudFR5cGUgPT0gRXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uSXRlcmF0
aW9uRXZlbnQpCisgICAgICAgIGxpc3RlbmVyVHlwZSA9IERvY3VtZW50OjpBTklNQVRJT05JVEVS
QVRJT05fTElTVEVORVI7CisgICAgZWxzZSBpZiAoaW5FdmVudFR5cGUgPT0gRXZlbnROYW1lczo6
d2Via2l0QW5pbWF0aW9uRW5kRXZlbnQpCisgICAgICAgIGxpc3RlbmVyVHlwZSA9IERvY3VtZW50
OjpBTklNQVRJT05FTkRfTElTVEVORVI7CisgICAgZWxzZQorICAgICAgICBsaXN0ZW5lclR5cGUg
PSBEb2N1bWVudDo6QU5JTUFUSU9OU1RBUlRfTElTVEVORVI7CisgICAgCisgICAgaWYgKHNob3Vs
ZFNlbmRFdmVudEZvckxpc3RlbmVyKGxpc3RlbmVyVHlwZSkpIHsKKyAgICAgICAgRWxlbWVudCog
ZWxlbWVudCA9IGVsZW1lbnRGb3JFdmVudERpc3BhdGNoKCk7CisgICAgICAgIGlmIChlbGVtZW50
KSB7CisgICAgICAgICAgICBtX3dhaXRpbmdGb3JFbmRFdmVudCA9IHRydWU7CisgICAgICAgICAg
ICBtX2FuaW1hdGlvbkV2ZW50RGlzcGF0Y2hlci5zdGFydFRpbWVyKGVsZW1lbnQsIG1fbmFtZSwg
LTEsIHRydWUsIGluRXZlbnRUeXBlLCBpbkVsYXBzZWRUaW1lKTsKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOyAvLyBEaWQgZGlzcGF0Y2ggYW4gZXZlbnQKKyAgICAgICAgfQorICAgIH0KKworICAg
IHJldHVybiBmYWxzZTsgLy8gRGlkIG5vdCBkaXNwYXRjaCBhbiBldmVudAorfQorCit2b2lkIEtl
eWZyYW1lQW5pbWF0aW9uOjpvdmVycmlkZUFuaW1hdGlvbnMoKQoreworICAgIC8vIFRoaXMgd2ls
bCBvdmVycmlkZSBpbXBsaWNpdCBhbmltYXRpb25zIHRoYXQgbWF0Y2ggdGhlIHByb3BlcnRpZXMg
aW4gdGhlIGtleWZyYW1lIGFuaW1hdGlvbgorICAgIEhhc2hTZXQ8aW50Pjo6Y29uc3RfaXRlcmF0
b3IgZW5kID0gbV9rZXlmcmFtZXMtPmVuZFByb3BlcnRpZXMoKTsKKyAgICBmb3IgKEhhc2hTZXQ8
aW50Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lcy0+YmVnaW5Qcm9wZXJ0aWVzKCk7
IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgY29tcG9zaXRlQW5pbWF0aW9uKCktPm92ZXJyaWRl
SW1wbGljaXRBbmltYXRpb25zKCppdCk7Cit9CisKK3ZvaWQgS2V5ZnJhbWVBbmltYXRpb246OnJl
c3VtZU92ZXJyaWRkZW5BbmltYXRpb25zKCkKK3sKKyAgICAvLyBUaGlzIHdpbGwgcmVzdW1lIG92
ZXJyaWRkZW4gaW1wbGljaXQgYW5pbWF0aW9ucworICAgIEhhc2hTZXQ8aW50Pjo6Y29uc3RfaXRl
cmF0b3IgZW5kID0gbV9rZXlmcmFtZXMtPmVuZFByb3BlcnRpZXMoKTsKKyAgICBmb3IgKEhhc2hT
ZXQ8aW50Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lcy0+YmVnaW5Qcm9wZXJ0aWVz
KCk7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgY29tcG9zaXRlQW5pbWF0aW9uKCktPnJlc3Vt
ZU92ZXJyaWRkZW5JbXBsaWNpdEFuaW1hdGlvbnMoKml0KTsKK30KKworYm9vbCBLZXlmcmFtZUFu
aW1hdGlvbjo6YWZmZWN0c1Byb3BlcnR5KGludCBwcm9wZXJ0eSkgY29uc3QKK3sKKyAgICBIYXNo
U2V0PGludD46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fa2V5ZnJhbWVzLT5lbmRQcm9wZXJ0aWVz
KCk7CisgICAgZm9yIChIYXNoU2V0PGludD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFt
ZXMtPmJlZ2luUHJvcGVydGllcygpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgaWYgKCgq
aXQpID09IHByb3BlcnR5KQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJl
dHVybiBmYWxzZTsKK30KKworfQpJbmRleDogV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9LZXlmcmFt
ZUFuaW1hdGlvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGFnZS9hbmltYXRpb24vS2V5ZnJh
bWVBbmltYXRpb24uaAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGFnZS9hbmltYXRpb24vS2V5
ZnJhbWVBbmltYXRpb24uaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJ
bmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBt
YXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAg
IGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRT
IENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElU
UyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisg
KiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRl
ZiBLZXlmcmFtZUFuaW1hdGlvbl9oCisjZGVmaW5lIEtleWZyYW1lQW5pbWF0aW9uX2gKKworI2lu
Y2x1ZGUgIkFuaW1hdGlvbkJhc2UuaCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUg
IlJlbmRlclN0eWxlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gQSBLZXlmcmFtZUFu
aW1hdGlvbiB0cmFja3MgdGhlIHN0YXRlIG9mIGFuIGV4cGxpY2l0IGFuaW1hdGlvbgorLy8gZm9y
IGEgc2luZ2xlIFJlbmRlck9iamVjdC4KK2NsYXNzIEtleWZyYW1lQW5pbWF0aW9uIDogcHVibGlj
IEFuaW1hdGlvbkJhc2UgeworcHVibGljOgorICAgIEtleWZyYW1lQW5pbWF0aW9uKGNvbnN0IEFu
aW1hdGlvbiogYW5pbWF0aW9uLCBSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBpbnQgaW5kZXgsIENv
bXBvc2l0ZUFuaW1hdGlvbiogY29tcEFuaW0pCisgICAgOiBBbmltYXRpb25CYXNlKGFuaW1hdGlv
biwgcmVuZGVyZXIsIGNvbXBBbmltKQorICAgICwgbV9rZXlmcmFtZXMoYW5pbWF0aW9uLT5rZXlm
cmFtZUxpc3QoKSkKKyAgICAsIG1fbmFtZShhbmltYXRpb24tPm5hbWUoKSkKKyAgICAsIG1faW5k
ZXgoaW5kZXgpCisgICAgeworICAgIH0KKworICAgIHZpcnR1YWwgfktleWZyYW1lQW5pbWF0aW9u
KCkKKyAgICB7CisgICAgICAgIC8vIERvIHRoZSBjbGVhbnVwIGhlcmUgaW5zdGVhZCBvZiBpbiB0
aGUgYmFzZSBjbGFzcyBzbyB0aGUgc3BlY2lhbGl6ZWQgbWV0aG9kcyBnZXQgY2FsbGVkCisgICAg
ICAgIGlmICghcG9zdEFjdGl2ZSgpKQorICAgICAgICAgICAgdXBkYXRlU3RhdGVNYWNoaW5lKFNU
QVRFX0lOUFVUX0VORF9BTklNQVRJT04sIC0xKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQg
YW5pbWF0ZShDb21wb3NpdGVBbmltYXRpb24qLCBSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJT
dHlsZSogY3VycmVudFN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRl
clN0eWxlKiB0YXJnZXRTdHlsZSwgUmVuZGVyU3R5bGUqJiBhbmltYXRlZFN0eWxlKTsKKworICAg
IHZvaWQgc2V0TmFtZShjb25zdCBTdHJpbmcmIHMpIHsgbV9uYW1lID0gczsgfQorICAgIGNvbnN0
IEF0b21pY1N0cmluZyYgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsgfQorICAgIGludCBp
bmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXg7IH0KKworICAgIHZpcnR1YWwgYm9vbCBzaG91
bGRGaXJlRXZlbnRzKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCitwcm90ZWN0ZWQ6CisgICAg
dmlydHVhbCB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoZG91YmxlIGluRWxhcHNlZFRpbWUpOworICAg
IHZpcnR1YWwgdm9pZCBvbkFuaW1hdGlvbkl0ZXJhdGlvbihkb3VibGUgaW5FbGFwc2VkVGltZSk7
CisgICAgdmlydHVhbCB2b2lkIG9uQW5pbWF0aW9uRW5kKGRvdWJsZSBpbkVsYXBzZWRUaW1lKTsK
KyAgICB2aXJ0dWFsIHZvaWQgZW5kQW5pbWF0aW9uKGJvb2wgcmVzZXQpOworCisgICAgdmlydHVh
bCB2b2lkIG92ZXJyaWRlQW5pbWF0aW9ucygpOworICAgIHZpcnR1YWwgdm9pZCByZXN1bWVPdmVy
cmlkZGVuQW5pbWF0aW9ucygpOworICAgIAorICAgIGJvb2wgc2hvdWxkU2VuZEV2ZW50Rm9yTGlz
dGVuZXIoRG9jdW1lbnQ6Okxpc3RlbmVyVHlwZSBpbkxpc3RlbmVyVHlwZSk7ICAgIAorICAgIGJv
b2wgc2VuZEFuaW1hdGlvbkV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyYgaW5FdmVudFR5cGUsIGRv
dWJsZSBpbkVsYXBzZWRUaW1lKTsKKyAgICAKKyAgICB2aXJ0dWFsIGJvb2wgYWZmZWN0c1Byb3Bl
cnR5KGludCBwcm9wZXJ0eSkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgLy8gVGhlIGtleWZyYW1l
cyB0aGF0IHdlIGFyZSBibGVuZGluZy4KKyAgICBSZWZQdHI8S2V5ZnJhbWVMaXN0PiBtX2tleWZy
YW1lczsKKyAgICBBdG9taWNTdHJpbmcgbV9uYW1lOworICAgIC8vIFRoZSBvcmRlciBpbiB3aGlj
aCB0aGlzIGFuaW1hdGlvbiBhcHBlYXJzIGluIHRoZSBhbmltYXRpb24tbmFtZSBzdHlsZS4KKyAg
ICBpbnQgbV9pbmRleDsKK307CisKK30KKworI2VuZGlmCg==
</data>
<flag name="review"
          id="10288"
          type_id="1"
          status="-"
          setter="hyatt"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>23129</attachid>
            <date>2008-09-02 15:26:55 -0700</date>
            <delta_ts>2008-09-02 15:35:20 -0700</delta_ts>
            <desc>Second attempt at patch to fix issues in WebCore.vcproj</desc>
            <filename>20604.patch</filename>
            <type>text/plain</type>
            <size>397590</size>
            <attacher name="Chris Marrin">cmarrin</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAzNjAyNSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTcyIEBACisyMDA4LTA5LTAyICBDaHJpcyBNYXJyaW4gIDxzZXQgRU1BSUxfQURE
UkVTUyBlbnZpcm9ubWVudCB2YXJpYWJsZT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBBbmltYXRpb25Db250cm9sbGVyLmNwcCBzaG91bGQgYmUgc3Bs
aXQgaW50byBzZXBhcmF0ZSBmaWxlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MjA2MDQKKyAgICAgICAgCisgICAgICAgIE5vdGU6IEFsbCBtYWtlZmls
ZXMsIGV4Y2VwdCBXZWJDb3JlLnhjb2RlcHJvaiBoYXZlIGJlZW4gY2hhbmdlZCB3aXRob3V0IHRl
c3RpbmcsIHVwb24KKyAgICAgICAgcmVjb21tZW5kYXRpb24gb2YgRGF2ZSBIeWF0dC4KKworICAg
ICAgICAqIEdOVW1ha2VmaWxlLmFtOgorICAgICAgICAqIFdlYkNvcmUucHJvOgorICAgICAgICAq
IFdlYkNvcmUudmNwcm9qL1dlYkNvcmUudmNwcm9qOgorICAgICAgICAqIFdlYkNvcmUueGNvZGVw
cm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAgKiBXZWJDb3JlU291cmNlcy5ia2w6CisgICAg
ICAgICogcGFnZS9BbmltYXRpb25Db250cm9sbGVyLmNwcDogUmVtb3ZlZC4KKyAgICAgICAgKiBw
YWdlL0FuaW1hdGlvbkNvbnRyb2xsZXIuaDogUmVtb3ZlZC4KKyAgICAgICAgKiBwYWdlL2FuaW1h
dGlvbjogQWRkZWQuCisgICAgICAgICogcGFnZS9hbmltYXRpb24vQW5pbWF0aW9uQmFzZS5jcHA6
IEFkZGVkLgorICAgICAgICAoV2ViQ29yZTo6c29sdmVFcHNpbG9uKToKKyAgICAgICAgKFdlYkNv
cmU6OnNvbHZlQ3ViaWNCZXppZXJGdW5jdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpBbmltYXRp
b25UaW1lckNhbGxiYWNrOjp0aW1lckZpcmVkKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlv
bkV2ZW50RGlzcGF0Y2hlcjo6QW5pbWF0aW9uRXZlbnREaXNwYXRjaGVyKToKKyAgICAgICAgKFdl
YkNvcmU6OkFuaW1hdGlvbkV2ZW50RGlzcGF0Y2hlcjo6dGltZXJGaXJlZCk6CisgICAgICAgIChX
ZWJDb3JlOjpibGVuZEZ1bmMpOgorICAgICAgICAoV2ViQ29yZTo6UHJvcGVydHlXcmFwcGVyQmFz
ZTo6UHJvcGVydHlXcmFwcGVyQmFzZSk6CisgICAgICAgIChXZWJDb3JlOjpQcm9wZXJ0eVdyYXBw
ZXJCYXNlOjp+UHJvcGVydHlXcmFwcGVyQmFzZSk6CisgICAgICAgIChXZWJDb3JlOjpQcm9wZXJ0
eVdyYXBwZXJCYXNlOjpwcm9wZXJ0eSk6CisgICAgICAgIChXZWJDb3JlOjpQcm9wZXJ0eVdyYXBw
ZXJHZXR0ZXI6OlByb3BlcnR5V3JhcHBlckdldHRlcik6CisgICAgICAgIChXZWJDb3JlOjpQcm9w
ZXJ0eVdyYXBwZXJHZXR0ZXI6OmVxdWFscyk6CisgICAgICAgIChXZWJDb3JlOjpQcm9wZXJ0eVdy
YXBwZXI6OlByb3BlcnR5V3JhcHBlcik6CisgICAgICAgIChXZWJDb3JlOjpQcm9wZXJ0eVdyYXBw
ZXI6OmJsZW5kKToKKyAgICAgICAgKFdlYkNvcmU6OlByb3BlcnR5V3JhcHBlclNoYWRvdzo6UHJv
cGVydHlXcmFwcGVyU2hhZG93KToKKyAgICAgICAgKFdlYkNvcmU6OlByb3BlcnR5V3JhcHBlclNo
YWRvdzo6ZXF1YWxzKToKKyAgICAgICAgKFdlYkNvcmU6OlByb3BlcnR5V3JhcHBlclNoYWRvdzo6
YmxlbmQpOgorICAgICAgICAoV2ViQ29yZTo6UHJvcGVydHlXcmFwcGVyTWF5YmVJbnZhbGlkQ29s
b3I6OlByb3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENvbG9yKToKKyAgICAgICAgKFdlYkNvcmU6
OlByb3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENvbG9yOjplcXVhbHMpOgorICAgICAgICAoV2Vi
Q29yZTo6UHJvcGVydHlXcmFwcGVyTWF5YmVJbnZhbGlkQ29sb3I6OmJsZW5kKToKKyAgICAgICAg
KFdlYkNvcmU6OmVuc3VyZVByb3BlcnR5TWFwKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlv
bkJhc2U6OkFuaW1hdGlvbkJhc2UpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6
fkFuaW1hdGlvbkJhc2UpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6cHJvcGVy
dGllc0VxdWFsKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvbkJhc2U6OmdldFByb3BlcnR5
QXRJbmRleCk6CisgICAgICAgIChXZWJDb3JlOjpBbmltYXRpb25CYXNlOjpnZXROdW1Qcm9wZXJ0
aWVzKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvbkJhc2U6OmJsZW5kUHJvcGVydGllcyk6
CisgICAgICAgIChXZWJDb3JlOjpBbmltYXRpb25CYXNlOjpzZXRDaGFuZ2VkKToKKyAgICAgICAg
KFdlYkNvcmU6OkFuaW1hdGlvbkJhc2U6OmR1cmF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkFu
aW1hdGlvbkJhc2U6OnBsYXlTdGF0ZVBsYXlpbmcpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0
aW9uQmFzZTo6YW5pbWF0aW9uc01hdGNoKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvbkJh
c2U6OmVsZW1lbnRGb3JFdmVudERpc3BhdGNoKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlv
bkJhc2U6OnVwZGF0ZVN0YXRlTWFjaGluZSk6CisgICAgICAgIChXZWJDb3JlOjpBbmltYXRpb25C
YXNlOjphbmltYXRpb25UaW1lckNhbGxiYWNrRmlyZWQpOgorICAgICAgICAoV2ViQ29yZTo6QW5p
bWF0aW9uQmFzZTo6YW5pbWF0aW9uRXZlbnREaXNwYXRjaGVyRmlyZWQpOgorICAgICAgICAoV2Vi
Q29yZTo6QW5pbWF0aW9uQmFzZTo6dXBkYXRlUGxheVN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6
OkFuaW1hdGlvbkJhc2U6OnByb2dyZXNzKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvbkJh
c2U6OnByaW1lRXZlbnRUaW1lcnMpOgorICAgICAgICAqIHBhZ2UvYW5pbWF0aW9uL0FuaW1hdGlv
bkJhc2UuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpBbmltYXRpb25UaW1lckJhc2U6OkFu
aW1hdGlvblRpbWVyQmFzZSk6CisgICAgICAgIChXZWJDb3JlOjpBbmltYXRpb25UaW1lckJhc2U6
On5BbmltYXRpb25UaW1lckJhc2UpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uVGltZXJC
YXNlOjpzdGFydFRpbWVyKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvblRpbWVyQmFzZTo6
Y2FuY2VsVGltZXIpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uRXZlbnREaXNwYXRjaGVy
Ojp+QW5pbWF0aW9uRXZlbnREaXNwYXRjaGVyKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlv
bkV2ZW50RGlzcGF0Y2hlcjo6c3RhcnRUaW1lcik6CisgICAgICAgIChXZWJDb3JlOjpBbmltYXRp
b25UaW1lckNhbGxiYWNrOjpBbmltYXRpb25UaW1lckNhbGxiYWNrKToKKyAgICAgICAgKFdlYkNv
cmU6OkFuaW1hdGlvblRpbWVyQ2FsbGJhY2s6On5BbmltYXRpb25UaW1lckNhbGxiYWNrKToKKyAg
ICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvblRpbWVyQ2FsbGJhY2s6OnN0YXJ0VGltZXIpOgorICAg
ICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6cmVuZGVyZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6QW5pbWF0aW9uQmFzZTo6c3RhcnRUaW1lKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlv
bkJhc2U6OmNhbmNlbFRpbWVycyk6CisgICAgICAgIChXZWJDb3JlOjpBbmltYXRpb25CYXNlOjop
OgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6d2FpdGluZ1RvU3RhcnQpOgorICAg
ICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6cHJlQWN0aXZlKToKKyAgICAgICAgKFdlYkNv
cmU6OkFuaW1hdGlvbkJhc2U6OnBvc3RBY3RpdmUpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0
aW9uQmFzZTo6YWN0aXZlKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvbkJhc2U6OnJ1bm5p
bmcpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6cGF1c2VkKToKKyAgICAgICAg
KFdlYkNvcmU6OkFuaW1hdGlvbkJhc2U6OmlzTmV3KToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1h
dGlvbkJhc2U6OndhaXRpbmdGb3JTdGFydFRpbWUpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0
aW9uQmFzZTo6d2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKToKKyAgICAgICAgKFdlYkNvcmU6OkFu
aW1hdGlvbkJhc2U6OndhaXRpbmdGb3JFbmRFdmVudCk6CisgICAgICAgIChXZWJDb3JlOjpBbmlt
YXRpb25CYXNlOjpzZXRBbmltYXRpbmcpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFz
ZTo6YW5pbWF0aW5nKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvbkJhc2U6OmFuaW1hdGUp
OgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6cmVzZXQpOgorICAgICAgICAoV2Vi
Q29yZTo6QW5pbWF0aW9uQmFzZTo6c2hvdWxkRmlyZUV2ZW50cyk6CisgICAgICAgIChXZWJDb3Jl
OjpBbmltYXRpb25CYXNlOjpzZXRBbmltYXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0
aW9uQmFzZTo6b3ZlcnJpZGRlbik6CisgICAgICAgIChXZWJDb3JlOjpBbmltYXRpb25CYXNlOjph
ZmZlY3RzUHJvcGVydHkpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6aXNBbmlt
YXRpbmdQcm9wZXJ0eSk6CisgICAgICAgIChXZWJDb3JlOjpBbmltYXRpb25CYXNlOjpvdmVycmlk
ZUFuaW1hdGlvbnMpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6cmVzdW1lT3Zl
cnJpZGRlbkFuaW1hdGlvbnMpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6Y29t
cG9zaXRlQW5pbWF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvbkJhc2U6Om9uQW5p
bWF0aW9uU3RhcnQpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6b25BbmltYXRp
b25JdGVyYXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6b25BbmltYXRp
b25FbmQpOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6c3RhcnRBbmltYXRpb24p
OgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQmFzZTo6ZW5kQW5pbWF0aW9uKToKKyAgICAg
ICAgKiBwYWdlL2FuaW1hdGlvbi9BbmltYXRpb25Db250cm9sbGVyLmNwcDogQ29waWVkIGZyb20g
V2ViQ29yZS9wYWdlL0FuaW1hdGlvbkNvbnRyb2xsZXIuY3BwLgorICAgICAgICAoV2ViQ29yZTo6
QW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OkFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlKToK
KyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjphY2Nlc3NDb21w
b3NpdGVBbmltYXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQ29udHJvbGxlclBy
aXZhdGU6OnN0eWxlQXZhaWxhYmxlKToKKyAgICAgICAgKFdlYkNvcmU6OkFuaW1hdGlvbkNvbnRy
b2xsZXJQcml2YXRlOjphbmltYXRpb25UaW1lckZpcmVkKToKKyAgICAgICAgKFdlYkNvcmU6OkFu
aW1hdGlvbkNvbnRyb2xsZXI6OkFuaW1hdGlvbkNvbnRyb2xsZXIpOgorICAgICAgICAoV2ViQ29y
ZTo6QW5pbWF0aW9uQ29udHJvbGxlcjo6Y2FuY2VsQW5pbWF0aW9ucyk6CisgICAgICAgIChXZWJD
b3JlOjpBbmltYXRpb25Db250cm9sbGVyOjpzdHlsZUF2YWlsYWJsZSk6CisgICAgICAgICogcGFn
ZS9hbmltYXRpb24vQW5pbWF0aW9uQ29udHJvbGxlci5oOiBDb3BpZWQgZnJvbSBXZWJDb3JlL3Bh
Z2UvQW5pbWF0aW9uQ29udHJvbGxlci5oLgorICAgICAgICAoV2ViQ29yZTo6QW5pbWF0aW9uQ29u
dHJvbGxlcjo6c2V0V2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKToKKyAgICAgICAgKiBwYWdlL2Fu
aW1hdGlvbi9Db21wb3NpdGVBbmltYXRpb24uY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6
OkNvbXBvc2l0ZUFuaW1hdGlvbjo6fkNvbXBvc2l0ZUFuaW1hdGlvbik6CisgICAgICAgIChXZWJD
b3JlOjpDb21wb3NpdGVBbmltYXRpb246OnVwZGF0ZVRyYW5zaXRpb25zKToKKyAgICAgICAgKFdl
YkNvcmU6OkNvbXBvc2l0ZUFuaW1hdGlvbjo6dXBkYXRlS2V5ZnJhbWVBbmltYXRpb25zKToKKyAg
ICAgICAgKFdlYkNvcmU6OkNvbXBvc2l0ZUFuaW1hdGlvbjo6ZmluZEtleWZyYW1lQW5pbWF0aW9u
KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBvc2l0ZUFuaW1hdGlvbjo6YW5pbWF0ZSk6CisgICAg
ICAgIChXZWJDb3JlOjpDb21wb3NpdGVBbmltYXRpb246OnNldEFuaW1hdGluZyk6CisgICAgICAg
IChXZWJDb3JlOjpDb21wb3NpdGVBbmltYXRpb246OmFuaW1hdGluZyk6CisgICAgICAgIChXZWJD
b3JlOjpDb21wb3NpdGVBbmltYXRpb246OnJlc2V0VHJhbnNpdGlvbnMpOgorICAgICAgICAoV2Vi
Q29yZTo6Q29tcG9zaXRlQW5pbWF0aW9uOjpyZXNldEFuaW1hdGlvbnMpOgorICAgICAgICAoV2Vi
Q29yZTo6Q29tcG9zaXRlQW5pbWF0aW9uOjpjbGVhbnVwRmluaXNoZWRBbmltYXRpb25zKToKKyAg
ICAgICAgKFdlYkNvcmU6OkNvbXBvc2l0ZUFuaW1hdGlvbjo6c2V0QW5pbWF0aW9uU3RhcnRUaW1l
KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBvc2l0ZUFuaW1hdGlvbjo6c2V0VHJhbnNpdGlvblN0
YXJ0VGltZSk6CisgICAgICAgIChXZWJDb3JlOjpDb21wb3NpdGVBbmltYXRpb246OnN1c3BlbmRB
bmltYXRpb25zKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBvc2l0ZUFuaW1hdGlvbjo6cmVzdW1l
QW5pbWF0aW9ucyk6CisgICAgICAgIChXZWJDb3JlOjpDb21wb3NpdGVBbmltYXRpb246Om92ZXJy
aWRlSW1wbGljaXRBbmltYXRpb25zKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBvc2l0ZUFuaW1h
dGlvbjo6cmVzdW1lT3ZlcnJpZGRlbkltcGxpY2l0QW5pbWF0aW9ucyk6CisgICAgICAgIChXZWJD
b3JlOjpjb21wYXJlQW5pbWF0aW9uSW5kaWNlcyk6CisgICAgICAgIChXZWJDb3JlOjpDb21wb3Np
dGVBbmltYXRpb246OnN0eWxlQXZhaWxhYmxlKToKKyAgICAgICAgKFdlYkNvcmU6OkNvbXBvc2l0
ZUFuaW1hdGlvbjo6aXNBbmltYXRpbmdQcm9wZXJ0eSk6CisgICAgICAgIChXZWJDb3JlOjpDb21w
b3NpdGVBbmltYXRpb246OnNldFdhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZSk6CisgICAgICAgICog
cGFnZS9hbmltYXRpb24vQ29tcG9zaXRlQW5pbWF0aW9uLmg6IEFkZGVkLgorICAgICAgICAoV2Vi
Q29yZTo6Q29tcG9zaXRlQW5pbWF0aW9uOjpDb21wb3NpdGVBbmltYXRpb24pOgorICAgICAgICAo
V2ViQ29yZTo6Q29tcG9zaXRlQW5pbWF0aW9uOjpoYXNBbmltYXRpb25Gb3JQcm9wZXJ0eSk6Cisg
ICAgICAgIChXZWJDb3JlOjpDb21wb3NpdGVBbmltYXRpb246OnN1c3BlbmRlZCk6CisgICAgICAg
ICogcGFnZS9hbmltYXRpb24vSW1wbGljaXRBbmltYXRpb24uY3BwOiBBZGRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OkltcGxpY2l0QW5pbWF0aW9uOjpJbXBsaWNpdEFuaW1hdGlvbik6CisgICAgICAg
IChXZWJDb3JlOjpJbXBsaWNpdEFuaW1hdGlvbjo6c2hvdWxkU2VuZEV2ZW50Rm9yTGlzdGVuZXIp
OgorICAgICAgICAoV2ViQ29yZTo6SW1wbGljaXRBbmltYXRpb246OmFuaW1hdGUpOgorICAgICAg
ICAoV2ViQ29yZTo6SW1wbGljaXRBbmltYXRpb246Om9uQW5pbWF0aW9uRW5kKToKKyAgICAgICAg
KFdlYkNvcmU6OkltcGxpY2l0QW5pbWF0aW9uOjpzZW5kVHJhbnNpdGlvbkV2ZW50KToKKyAgICAg
ICAgKFdlYkNvcmU6OkltcGxpY2l0QW5pbWF0aW9uOjpyZXNldCk6CisgICAgICAgIChXZWJDb3Jl
OjpJbXBsaWNpdEFuaW1hdGlvbjo6c2V0T3ZlcnJpZGRlbik6CisgICAgICAgIChXZWJDb3JlOjpJ
bXBsaWNpdEFuaW1hdGlvbjo6YWZmZWN0c1Byb3BlcnR5KToKKyAgICAgICAgKFdlYkNvcmU6Oklt
cGxpY2l0QW5pbWF0aW9uOjppc1RhcmdldFByb3BlcnR5RXF1YWwpOgorICAgICAgICAoV2ViQ29y
ZTo6SW1wbGljaXRBbmltYXRpb246OmJsZW5kUHJvcGVydHlWYWx1ZUluU3R5bGUpOgorICAgICAg
ICAqIHBhZ2UvYW5pbWF0aW9uL0ltcGxpY2l0QW5pbWF0aW9uLmg6IEFkZGVkLgorICAgICAgICAo
V2ViQ29yZTo6SW1wbGljaXRBbmltYXRpb246On5JbXBsaWNpdEFuaW1hdGlvbik6CisgICAgICAg
IChXZWJDb3JlOjpJbXBsaWNpdEFuaW1hdGlvbjo6dHJhbnNpdGlvblByb3BlcnR5KToKKyAgICAg
ICAgKFdlYkNvcmU6OkltcGxpY2l0QW5pbWF0aW9uOjphbmltYXRpbmdQcm9wZXJ0eSk6CisgICAg
ICAgIChXZWJDb3JlOjpJbXBsaWNpdEFuaW1hdGlvbjo6b3ZlcnJpZGRlbik6CisgICAgICAgIChX
ZWJDb3JlOjpJbXBsaWNpdEFuaW1hdGlvbjo6c2hvdWxkRmlyZUV2ZW50cyk6CisgICAgICAgIChX
ZWJDb3JlOjpJbXBsaWNpdEFuaW1hdGlvbjo6aGFzU3R5bGUpOgorICAgICAgICAqIHBhZ2UvYW5p
bWF0aW9uL0tleWZyYW1lQW5pbWF0aW9uLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpL
ZXlmcmFtZUFuaW1hdGlvbjo6YW5pbWF0ZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlmcmFtZUFu
aW1hdGlvbjo6ZW5kQW5pbWF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OktleWZyYW1lQW5pbWF0
aW9uOjpzaG91bGRTZW5kRXZlbnRGb3JMaXN0ZW5lcik6CisgICAgICAgIChXZWJDb3JlOjpLZXlm
cmFtZUFuaW1hdGlvbjo6b25BbmltYXRpb25TdGFydCk6CisgICAgICAgIChXZWJDb3JlOjpLZXlm
cmFtZUFuaW1hdGlvbjo6b25BbmltYXRpb25JdGVyYXRpb24pOgorICAgICAgICAoV2ViQ29yZTo6
S2V5ZnJhbWVBbmltYXRpb246Om9uQW5pbWF0aW9uRW5kKToKKyAgICAgICAgKFdlYkNvcmU6Oktl
eWZyYW1lQW5pbWF0aW9uOjpzZW5kQW5pbWF0aW9uRXZlbnQpOgorICAgICAgICAoV2ViQ29yZTo6
S2V5ZnJhbWVBbmltYXRpb246Om92ZXJyaWRlQW5pbWF0aW9ucyk6CisgICAgICAgIChXZWJDb3Jl
OjpLZXlmcmFtZUFuaW1hdGlvbjo6cmVzdW1lT3ZlcnJpZGRlbkFuaW1hdGlvbnMpOgorICAgICAg
ICAoV2ViQ29yZTo6S2V5ZnJhbWVBbmltYXRpb246OmFmZmVjdHNQcm9wZXJ0eSk6CisgICAgICAg
ICogcGFnZS9hbmltYXRpb24vS2V5ZnJhbWVBbmltYXRpb24uaDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpLZXlmcmFtZUFuaW1hdGlvbjo6S2V5ZnJhbWVBbmltYXRpb24pOgorICAgICAgICAo
V2ViQ29yZTo6S2V5ZnJhbWVBbmltYXRpb246On5LZXlmcmFtZUFuaW1hdGlvbik6CisgICAgICAg
IChXZWJDb3JlOjpLZXlmcmFtZUFuaW1hdGlvbjo6c2V0TmFtZSk6CisgICAgICAgIChXZWJDb3Jl
OjpLZXlmcmFtZUFuaW1hdGlvbjo6bmFtZSk6CisgICAgICAgIChXZWJDb3JlOjpLZXlmcmFtZUFu
aW1hdGlvbjo6aW5kZXgpOgorICAgICAgICAoV2ViQ29yZTo6S2V5ZnJhbWVBbmltYXRpb246OnNo
b3VsZEZpcmVFdmVudHMpOgorCiAyMDA4LTA5LTAyICBBbGV4ZXkgUHJvc2t1cnlha292ICA8YXBA
d2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZpZXdlZCBieSBBZGFtIFJvYmVuLgpJbmRleDogV2Vi
Q29yZS9HTlVtYWtlZmlsZS5hbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL0dOVW1ha2VmaWxlLmFt
CShyZXZpc2lvbiAzNTk5NSkKKysrIFdlYkNvcmUvR05VbWFrZWZpbGUuYW0JKHdvcmtpbmcgY29w
eSkKQEAgLTE0MDUsOCArMTQwNSwxNiBAQCB3ZWJjb3JlX3NvdXJjZXMgKz0gXAogCVdlYkNvcmUv
cGFnZS9BY2Nlc3NpYmlsaXR5VGFibGVIZWFkZXJDb250YWluZXIuaCBcCiAJV2ViQ29yZS9wYWdl
L0FjY2Vzc2liaWxpdHlUYWJsZVJvdy5jcHAgXAogCVdlYkNvcmUvcGFnZS9BY2Nlc3NpYmlsaXR5
VGFibGVSb3cuaCBcCi0JV2ViQ29yZS9wYWdlL0FuaW1hdGlvbkNvbnRyb2xsZXIuY3BwIFwKLQlX
ZWJDb3JlL3BhZ2UvQW5pbWF0aW9uQ29udHJvbGxlci5oIFwKKwlXZWJDb3JlL3BhZ2UvYW5pbWF0
aW9uL0FuaW1hdGlvbkJhc2UuY3BwIFwKKwlXZWJDb3JlL3BhZ2UvYW5pbWF0aW9uL0FuaW1hdGlv
bkJhc2UuaCBcCisJV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9BbmltYXRpb25Db250cm9sbGVyLmNw
cCBcCisJV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9BbmltYXRpb25Db250cm9sbGVyLmggXAorCVdl
YkNvcmUvcGFnZS9hbmltYXRpb24vQ29tcG9zaXRlQW5pbWF0aW9uLmNwcCBcCisJV2ViQ29yZS9w
YWdlL2FuaW1hdGlvbi9Db21wb3NpdGVBbmltYXRpb24uaCBcCisJV2ViQ29yZS9wYWdlL2FuaW1h
dGlvbi9JbXBsaWNpdEFuaW1hdGlvbi5jcHAgXAorCVdlYkNvcmUvcGFnZS9hbmltYXRpb24vSW1w
bGljaXRBbmltYXRpb24uaCBcCisJV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9LZXlmcmFtZUFuaW1h
dGlvbi5jcHAgXAorCVdlYkNvcmUvcGFnZS9hbmltYXRpb24vS2V5ZnJhbWVBbmltYXRpb24uaCBc
CiAJV2ViQ29yZS9wYWdlL0JhckluZm8uY3BwIFwKIAlXZWJDb3JlL3BhZ2UvQmFySW5mby5oIFwK
IAlXZWJDb3JlL3BhZ2UvQ2hyb21lLmNwcCBcCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUucHJvCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS5wcm8JKHJldmlzaW9uIDM1OTk1KQorKysgV2Vi
Q29yZS9XZWJDb3JlLnBybwkod29ya2luZyBjb3B5KQpAQCAtNzMwLDcgKzczMCwxMSBAQCBTT1VS
Q0VTICs9IFwKICAgICBwYWdlL0FjY2Vzc2liaWxpdHlUYWJsZUNvbHVtbi5jcHAgXCAgICAKICAg
ICBwYWdlL0FjY2Vzc2liaWxpdHlUYWJsZUhlYWRlckNvbnRhaW5lci5jcHAgXCAgICAKICAgICBw
YWdlL0FjY2Vzc2liaWxpdHlUYWJsZVJvdy5jcHAgXCAgICAKLSAgICBwYWdlL0FuaW1hdGlvbkNv
bnRyb2xsZXIuY3BwIFwgICAgCisgICAgcGFnZS9hbmltYXRpb24vQW5pbWF0aW9uQmFzZS5jcHAg
XAorICAgIHBhZ2UvYW5pbWF0aW9uL0FuaW1hdGlvbkNvbnRyb2xsZXIuY3BwIFwKKyAgICBwYWdl
L2FuaW1hdGlvbi9Db21wb3NpdGVBbmltYXRpb24uY3BwIFwKKyAgICBwYWdlL2FuaW1hdGlvbi9J
bXBsaWNpdEFuaW1hdGlvbi5jcHAgXAorICAgIHBhZ2UvYW5pbWF0aW9uL0tleWZyYW1lQW5pbWF0
aW9uLmNwcCBcCiAgICAgcGFnZS9BWE9iamVjdENhY2hlLmNwcCBcCiAgICAgcGFnZS9CYXJJbmZv
LmNwcCBcCiAgICAgcGFnZS9DaHJvbWUuY3BwIFwKSW5kZXg6IFdlYkNvcmUvV2ViQ29yZVNvdXJj
ZXMuYmtsCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZVNvdXJjZXMuYmtsCShyZXZpc2lv
biAzNTk5NSkKKysrIFdlYkNvcmUvV2ViQ29yZVNvdXJjZXMuYmtsCSh3b3JraW5nIGNvcHkpCkBA
IC02MjcsNyArNjI3LDExIEBAIFRoaXMgZmlsZSBjb250YWlucyB0aGUgbGlzdCBvZiBmaWxlcyBu
ZWUKICAgICAgICAgcGFnZS9BY2Nlc3NpYmlsaXR5VGFibGVDb2x1bW4uY3BwCiAgICAgICAgIHBh
Z2UvQWNjZXNzaWJpbGl0eVRhYmxlSGVhZGVyQ29udGFpbmVyLmNwcAogICAgICAgICBwYWdlL0Fj
Y2Vzc2liaWxpdHlUYWJsZVJvdy5jcHAKLSAgICAgICAgcGFnZS9BbmltYXRpb25Db250cm9sbGVy
LmNwcAorICAgICAgICBwYWdlL2FuaW1hdGlvbi9BbmltYXRpb25CYXNlLmNwcAorICAgICAgICBw
YWdlL2FuaW1hdGlvbi9BbmltYXRpb25Db250cm9sbGVyLmNwcAorICAgICAgICBwYWdlL2FuaW1h
dGlvbi9Db21wb3NpdGVBbmltYXRpb24uY3BwCisgICAgICAgIHBhZ2UvYW5pbWF0aW9uL0ltcGxp
Y2l0QW5pbWF0aW9uLmNwcAorICAgICAgICBwYWdlL2FuaW1hdGlvbi9LZXlmcmFtZUFuaW1hdGlv
bi5jcHAKICAgICAgICAgcGFnZS9BWE9iamVjdENhY2hlLmNwcAogICAgICAgICBwYWdlL0Jhcklu
Zm8uY3BwCiAgICAgICAgIHBhZ2UvQ2hyb21lLmNwcApJbmRleDogV2ViQ29yZS9XZWJDb3JlLnZj
cHJvai9XZWJDb3JlLnZjcHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUudmNwcm9q
L1dlYkNvcmUudmNwcm9qCShyZXZpc2lvbiAzNTk5NSkKKysrIFdlYkNvcmUvV2ViQ29yZS52Y3By
b2ovV2ViQ29yZS52Y3Byb2oJKHdvcmtpbmcgY29weSkKQEAgLTE5MDQsNyArMTkwNCw3IEBACiAJ
CQkJPg0KIAkJCTwvRmlsZT4NCiAJCQk8RmlsZQ0KLQkJCQlSZWxhdGl2ZVBhdGg9Ii4uXHBhZ2Vc
QW5pbWF0aW9uQ29udHJvbGxlci5jcHAiDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGFnZVxhbmlt
YXRpb25cQW5pbWF0aW9uQmFzZS5jcHAiDQogCQkJCT4NCiAJCQkJPEZpbGVDb25maWd1cmF0aW9u
DQogCQkJCQlOYW1lPSJSZWxlYXNlX1BHT3xXaW4zMiINCkBAIC0xOTE2LDcgKzE5MTYsNzEgQEAK
IAkJCQk8L0ZpbGVDb25maWd1cmF0aW9uPg0KIAkJCTwvRmlsZT4NCiAJCQk8RmlsZQ0KLQkJCQlS
ZWxhdGl2ZVBhdGg9Ii4uXHBhZ2VcQW5pbWF0aW9uQ29udHJvbGxlci5oIg0KKwkJCQlSZWxhdGl2
ZVBhdGg9Ii4uXHBhZ2VcYW5pbWF0aW9uXEFuaW1hdGlvbkNvbnRyb2xsZXIuY3BwIg0KKwkJCQk+
DQorCQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZV9QR098V2luMzIi
DQorCQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQor
CQkJCQkJV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPSJ0cnVlIg0KKwkJCQkJLz4NCisJCQkJPC9G
aWxlQ29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQ
YXRoPSIuLlxwYWdlXGFuaW1hdGlvblxDb21wb3NpdGVBbmltYXRpb24uY3BwIg0KKwkJCQk+DQor
CQkJCTxGaWxlQ29uZmlndXJhdGlvbg0KKwkJCQkJTmFtZT0iUmVsZWFzZV9QR098V2luMzIiDQor
CQkJCQk+DQorCQkJCQk8VG9vbA0KKwkJCQkJCU5hbWU9IlZDQ0xDb21waWxlclRvb2wiDQorCQkJ
CQkJV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPSJ0cnVlIg0KKwkJCQkJLz4NCisJCQkJPC9GaWxl
Q29uZmlndXJhdGlvbj4NCisJCQk8L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRo
PSIuLlxwYWdlXGFuaW1hdGlvblxJbXBsaWNpdEFuaW1hdGlvbi5jcHAiDQorCQkJCT4NCisJCQkJ
PEZpbGVDb25maWd1cmF0aW9uDQorCQkJCQlOYW1lPSJSZWxlYXNlX1BHT3xXaW4zMiINCisJCQkJ
CT4NCisJCQkJCTxUb29sDQorCQkJCQkJTmFtZT0iVkNDTENvbXBpbGVyVG9vbCINCisJCQkJCQlX
aG9sZVByb2dyYW1PcHRpbWl6YXRpb249InRydWUiDQorCQkJCQkvPg0KKwkJCQk8L0ZpbGVDb25m
aWd1cmF0aW9uPg0KKwkJCTwvRmlsZT4NCisJCQk8RmlsZQ0KKwkJCQlSZWxhdGl2ZVBhdGg9Ii4u
XHBhZ2VcYW5pbWF0aW9uXEtleWZyYW1lQW5pbWF0aW9uLmNwcCINCisJCQkJPg0KKwkJCQk8Rmls
ZUNvbmZpZ3VyYXRpb24NCisJCQkJCU5hbWU9IlJlbGVhc2VfUEdPfFdpbjMyIg0KKwkJCQkJPg0K
KwkJCQkJPFRvb2wNCisJCQkJCQlOYW1lPSJWQ0NMQ29tcGlsZXJUb29sIg0KKwkJCQkJCVdob2xl
UHJvZ3JhbU9wdGltaXphdGlvbj0idHJ1ZSINCisJCQkJCS8+DQorCQkJCTwvRmlsZUNvbmZpZ3Vy
YXRpb24+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGFn
ZVxhbmltYXRpb25cQW5pbWF0aW9uQmFzZS5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxG
aWxlDQorCQkJCVJlbGF0aXZlUGF0aD0iLi5ccGFnZVxhbmltYXRpb25cQW5pbWF0aW9uQ29udHJv
bGxlci5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJCVJlbGF0aXZlUGF0
aD0iLi5ccGFnZVxhbmltYXRpb25cQ29tcG9zaXRlQW5pbWF0aW9uLmgiDQorCQkJCT4NCisJCQk8
L0ZpbGU+DQorCQkJPEZpbGUNCisJCQkJUmVsYXRpdmVQYXRoPSIuLlxwYWdlXGFuaW1hdGlvblxJ
bXBsaWNpdEFuaW1hdGlvbi5oIg0KKwkJCQk+DQorCQkJPC9GaWxlPg0KKwkJCTxGaWxlDQorCQkJ
CVJlbGF0aXZlUGF0aD0iLi5ccGFnZVxhbmltYXRpb25cS2V5ZnJhbWVBbmltYXRpb24uaCINCiAJ
CQkJPg0KIAkJCTwvRmlsZT4NCiAJCQk8RmlsZQ0KSW5kZXg6IFdlYkNvcmUvV2ViQ29yZS54Y29k
ZXByb2ovcHJvamVjdC5wYnhwcm9qCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvV2ViQ29yZS54Y29k
ZXByb2ovcHJvamVjdC5wYnhwcm9qCShyZXZpc2lvbiAzNTk5NSkKKysrIFdlYkNvcmUvV2ViQ29y
ZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCSh3b3JraW5nIGNvcHkpCkBAIC00NzIsNiArNDcy
LDE2IEBACiAJCTQ2RjlENUREMEIwRDYwMTcwMDI4RUUzNiAvKiBhbGlhc0N1cnNvci5wbmcgaW4g
UmVzb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ2RjlENURBMEIw
RDYwMTcwMDI4RUUzNiAvKiBhbGlhc0N1cnNvci5wbmcgKi87IH07CiAJCTQ2RjlENURFMEIwRDYw
MTcwMDI4RUUzNiAvKiBub0Ryb3BDdXJzb3IucG5nIGluIFJlc291cmNlcyAqLyA9IHtpc2EgPSBQ
QlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0NkY5RDVEQjBCMEQ2MDE3MDAyOEVFMzYgLyogbm9Ecm9w
Q3Vyc29yLnBuZyAqLzsgfTsKIAkJNDZGOUQ1REYwQjBENjAxNzAwMjhFRTM2IC8qIHByb2dyZXNz
Q3Vyc29yLnBuZyBpbiBSZXNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVm
ID0gNDZGOUQ1REMwQjBENjAxNzAwMjhFRTM2IC8qIHByb2dyZXNzQ3Vyc29yLnBuZyAqLzsgfTsK
KwkJNDlCRDU5NUIwRTY4QTI3ODAwOTQ3MDZDIC8qIEFuaW1hdGlvbkNvbnRyb2xsZXIuY3BwIGlu
IFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDlCRDU5NTkwRTY4
QTI3ODAwOTQ3MDZDIC8qIEFuaW1hdGlvbkNvbnRyb2xsZXIuY3BwICovOyB9OworCQk0OUJENTk1
QzBFNjhBMjc4MDA5NDcwNkMgLyogQW5pbWF0aW9uQ29udHJvbGxlci5oIGluIEhlYWRlcnMgKi8g
PSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDlCRDU5NUEwRTY4QTI3ODAwOTQ3MDZD
IC8qIEFuaW1hdGlvbkNvbnRyb2xsZXIuaCAqLzsgfTsKKwkJNDlCRDU5OTAwRTY4Qjg0RTAwOTQ3
MDZDIC8qIEFuaW1hdGlvbkJhc2UuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmls
ZTsgZmlsZVJlZiA9IDQ5QkQ1OThFMEU2OEI4NEUwMDk0NzA2QyAvKiBBbmltYXRpb25CYXNlLmgg
Ki87IH07CisJCTQ5QkQ1OTkxMEU2OEI4NEUwMDk0NzA2QyAvKiBBbmltYXRpb25CYXNlLmNwcCBp
biBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDQ5QkQ1OThGMEU2
OEI4NEUwMDk0NzA2QyAvKiBBbmltYXRpb25CYXNlLmNwcCAqLzsgfTsKKwkJNDlCRDU5QzgwRTY4
QzYxNDAwOTQ3MDZDIC8qIEtleWZyYW1lQW5pbWF0aW9uLmggaW4gSGVhZGVycyAqLyA9IHtpc2Eg
PSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0OUJENTlDNDBFNjhDNjE0MDA5NDcwNkMgLyogS2V5
ZnJhbWVBbmltYXRpb24uaCAqLzsgfTsKKwkJNDlCRDU5QzkwRTY4QzYxNDAwOTQ3MDZDIC8qIEtl
eWZyYW1lQW5pbWF0aW9uLmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IDQ5QkQ1OUM1MEU2OEM2MTQwMDk0NzA2QyAvKiBLZXlmcmFtZUFuaW1hdGlvbi5j
cHAgKi87IH07CisJCTQ5QkQ1OUNBMEU2OEM2MTQwMDk0NzA2QyAvKiBJbXBsaWNpdEFuaW1hdGlv
bi5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNDlCRDU5
QzYwRTY4QzYxNDAwOTQ3MDZDIC8qIEltcGxpY2l0QW5pbWF0aW9uLmggKi87IH07CisJCTQ5QkQ1
OUNCMEU2OEM2MTQwMDk0NzA2QyAvKiBJbXBsaWNpdEFuaW1hdGlvbi5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0OUJENTlDNzBFNjhDNjE0MDA5NDcw
NkMgLyogSW1wbGljaXRBbmltYXRpb24uY3BwICovOyB9OworCQk0OUJENUEyNzBFNjhDOUJCMDA5
NDcwNkMgLyogQ29tcG9zaXRlQW5pbWF0aW9uLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhC
dWlsZEZpbGU7IGZpbGVSZWYgPSA0OUJENUEyNTBFNjhDOUJCMDA5NDcwNkMgLyogQ29tcG9zaXRl
QW5pbWF0aW9uLmggKi87IH07CisJCTQ5QkQ1QTI4MEU2OEM5QkIwMDk0NzA2QyAvKiBDb21wb3Np
dGVBbmltYXRpb24uY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxl
UmVmID0gNDlCRDVBMjYwRTY4QzlCQjAwOTQ3MDZDIC8qIENvbXBvc2l0ZUFuaW1hdGlvbi5jcHAg
Ki87IH07CiAJCTRBOEM5NkVCMEJFNjkwMzIwMDRFRUZGMCAvKiBTZWxlY3Rpb25Db250cm9sbGVy
TWFjLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gNEE4
Qzk2RUEwQkU2OTAzMjAwNEVFRkYwIC8qIFNlbGVjdGlvbkNvbnRyb2xsZXJNYWMubW0gKi87IH07
CiAJCTRCMTdDQkM5MEQ5NDVCMzcwMDUzRjE4MyAvKiBBY2Nlc3NpYmlsaXR5T2JqZWN0LmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA0QjE3Q0JDODBEOTQ1
QjM3MDA1M0YxODMgLyogQWNjZXNzaWJpbGl0eU9iamVjdC5oICovOyBzZXR0aW5ncyA9IHtBVFRS
SUJVVEVTID0gKFByaXZhdGUsICk7IH07IH07CiAJCTRCMTdDQkNDMEQ5NDVCOTEwMDUzRjE4MyAv
KiBBY2Nlc3NpYmlsaXR5T2JqZWN0V3JhcHBlci5tbSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBC
WEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDRCMTdDQkNBMEQ5NDVCOTEwMDUzRjE4MyAvKiBBY2Nlc3Np
YmlsaXR5T2JqZWN0V3JhcHBlci5tbSAqLzsgfTsKQEAgLTM3ODIsOCArMzc5Miw2IEBACiAJCUJD
N0ZBNjgyMEQxRjE2NzkwMERCMjJBOSAvKiBTZWxlY3Rvck5vZGVMaXN0LmNwcCBpbiBTb3VyY2Vz
ICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDN0ZBNjgwMEQxRjE2NzkwMERC
MjJBOSAvKiBTZWxlY3Rvck5vZGVMaXN0LmNwcCAqLzsgfTsKIAkJQkM4MEM5ODcwQ0QyOTRFRTAw
QTBCN0IzIC8qIENTU1RpbWluZ0Z1bmN0aW9uVmFsdWUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkM4MEM5ODUwQ0QyOTRFRTAwQTBCN0IzIC8qIENT
U1RpbWluZ0Z1bmN0aW9uVmFsdWUuY3BwICovOyB9OwogCQlCQzgwQzk4ODBDRDI5NEVFMDBBMEI3
QjMgLyogQ1NTVGltaW5nRnVuY3Rpb25WYWx1ZS5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJY
QnVpbGRGaWxlOyBmaWxlUmVmID0gQkM4MEM5ODYwQ0QyOTRFRTAwQTBCN0IzIC8qIENTU1RpbWlu
Z0Z1bmN0aW9uVmFsdWUuaCAqLzsgfTsKLQkJQkM4MEM5OEIwQ0QyOTUwNTAwQTBCN0IzIC8qIEFu
aW1hdGlvbkNvbnRyb2xsZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gQkM4MEM5ODkwQ0QyOTUwNTAwQTBCN0IzIC8qIEFuaW1hdGlvbkNvbnRyb2xs
ZXIuY3BwICovOyB9OwotCQlCQzgwQzk4QzBDRDI5NTA1MDBBMEI3QjMgLyogQW5pbWF0aW9uQ29u
dHJvbGxlci5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0g
QkM4MEM5OEEwQ0QyOTUwNTAwQTBCN0IzIC8qIEFuaW1hdGlvbkNvbnRyb2xsZXIuaCAqLzsgfTsK
IAkJQkM4MjQzMjkwRDBDRThBMjAwNDYwQzhGIC8qIEpTU1FMRXJyb3IuaCBpbiBIZWFkZXJzICov
ID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IEJDODI0MzI1MEQwQ0U4QTIwMDQ2MEM4
RiAvKiBKU1NRTEVycm9yLmggKi87IH07CiAJCUJDODI0MzJBMEQwQ0U4QTIwMDQ2MEM4RiAvKiBK
U1NRTFRyYW5zYWN0aW9uLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZp
bGVSZWYgPSBCQzgyNDMyNjBEMENFOEEyMDA0NjBDOEYgLyogSlNTUUxUcmFuc2FjdGlvbi5oICov
OyB9OwogCQlCQzgyNDMyQjBEMENFOEEyMDA0NjBDOEYgLyogSlNWb2lkQ2FsbGJhY2suY3BwIGlu
IFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gQkM4MjQzMjcwRDBD
RThBMjAwNDYwQzhGIC8qIEpTVm9pZENhbGxiYWNrLmNwcCAqLzsgfTsKQEAgLTUwNDIsNiArNTA1
MCwxNiBAQAogCQk0NkY5RDVEQTBCMEQ2MDE3MDAyOEVFMzYgLyogYWxpYXNDdXJzb3IucG5nICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGxhc3RLbm93bkZpbGVUeXBlID0gaW1hZ2UucG5n
OyBwYXRoID0gYWxpYXNDdXJzb3IucG5nOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk0
NkY5RDVEQjBCMEQ2MDE3MDAyOEVFMzYgLyogbm9Ecm9wQ3Vyc29yLnBuZyAqLyA9IHtpc2EgPSBQ
QlhGaWxlUmVmZXJlbmNlOyBsYXN0S25vd25GaWxlVHlwZSA9IGltYWdlLnBuZzsgcGF0aCA9IG5v
RHJvcEN1cnNvci5wbmc7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTQ2RjlENURDMEIw
RDYwMTcwMDI4RUUzNiAvKiBwcm9ncmVzc0N1cnNvci5wbmcgKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgbGFzdEtub3duRmlsZVR5cGUgPSBpbWFnZS5wbmc7IHBhdGggPSBwcm9ncmVzc0N1
cnNvci5wbmc7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTQ5QkQ1OTU5MEU2OEEyNzgw
MDk0NzA2QyAvKiBBbmltYXRpb25Db250cm9sbGVyLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Y3BwLmNwcDsgbmFtZSA9IEFuaW1hdGlvbkNvbnRyb2xsZXIuY3BwOyBwYXRoID0gYW5pbWF0aW9u
L0FuaW1hdGlvbkNvbnRyb2xsZXIuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0
OUJENTk1QTBFNjhBMjc4MDA5NDcwNkMgLyogQW5pbWF0aW9uQ29udHJvbGxlci5oICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBbmltYXRpb25Db250cm9sbGVyLmg7IHBhdGggPSBh
bmltYXRpb24vQW5pbWF0aW9uQ29udHJvbGxlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9
OworCQk0OUJENTk4RTBFNjhCODRFMDA5NDcwNkMgLyogQW5pbWF0aW9uQmFzZS5oICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBBbmltYXRpb25CYXNlLmg7IHBhdGggPSBhbmltYXRp
b24vQW5pbWF0aW9uQmFzZS5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OworCQk0OUJENTk4
RjBFNjhCODRFMDA5NDcwNkMgLyogQW5pbWF0aW9uQmFzZS5jcHAgKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmNwcC5jcHA7IG5hbWUgPSBBbmltYXRpb25CYXNlLmNwcDsgcGF0aCA9IGFuaW1hdGlvbi9B
bmltYXRpb25CYXNlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDlCRDU5QzQw
RTY4QzYxNDAwOTQ3MDZDIC8qIEtleWZyYW1lQW5pbWF0aW9uLmggKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmMuaDsgbmFtZSA9IEtleWZyYW1lQW5pbWF0aW9uLmg7IHBhdGggPSBhbmltYXRpb24vS2V5
ZnJhbWVBbmltYXRpb24uaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKKwkJNDlCRDU5QzUw
RTY4QzYxNDAwOTQ3MDZDIC8qIEtleWZyYW1lQW5pbWF0aW9uLmNwcCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuY3BwLmNwcDsgbmFtZSA9IEtleWZyYW1lQW5pbWF0aW9uLmNwcDsgcGF0aCA9IGFuaW1h
dGlvbi9LZXlmcmFtZUFuaW1hdGlvbi5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJ
CTQ5QkQ1OUM2MEU2OEM2MTQwMDk0NzA2QyAvKiBJbXBsaWNpdEFuaW1hdGlvbi5oICovID0ge2lz
YSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBl
ID0gc291cmNlY29kZS5jLmg7IG5hbWUgPSBJbXBsaWNpdEFuaW1hdGlvbi5oOyBwYXRoID0gYW5p
bWF0aW9uL0ltcGxpY2l0QW5pbWF0aW9uLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJ
CTQ5QkQ1OUM3MEU2OEM2MTQwMDk0NzA2QyAvKiBJbXBsaWNpdEFuaW1hdGlvbi5jcHAgKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IG5hbWUgPSBJbXBsaWNpdEFuaW1hdGlvbi5jcHA7IHBh
dGggPSBhbmltYXRpb24vSW1wbGljaXRBbmltYXRpb24uY3BwOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OworCQk0OUJENUEyNTBFNjhDOUJCMDA5NDcwNkMgLyogQ29tcG9zaXRlQW5pbWF0aW9u
LmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtu
b3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgbmFtZSA9IENvbXBvc2l0ZUFuaW1hdGlvbi5o
OyBwYXRoID0gYW5pbWF0aW9uL0NvbXBvc2l0ZUFuaW1hdGlvbi5oOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OworCQk0OUJENUEyNjBFNjhDOUJCMDA5NDcwNkMgLyogQ29tcG9zaXRlQW5pbWF0
aW9uLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBs
YXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgbmFtZSA9IENvbXBvc2l0ZUFu
aW1hdGlvbi5jcHA7IHBhdGggPSBhbmltYXRpb24vQ29tcG9zaXRlQW5pbWF0aW9uLmNwcDsgc291
cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJNEE4Qzk2RUEwQkU2OTAzMjAwNEVFRkYwIC8qIFNl
bGVjdGlvbkNvbnRyb2xsZXJNYWMubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmls
ZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAub2JqY3Bw
OyBuYW1lID0gU2VsZWN0aW9uQ29udHJvbGxlck1hYy5tbTsgcGF0aCA9IG1hYy9TZWxlY3Rpb25D
b250cm9sbGVyTWFjLm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwogCQk0QjE3Q0JDODBE
OTQ1QjM3MDA1M0YxODMgLyogQWNjZXNzaWJpbGl0eU9iamVjdC5oICovID0ge2lzYSA9IFBCWEZp
bGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jLmg7IHBhdGggPSBBY2Nlc3NpYmlsaXR5T2JqZWN0Lmg7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CiAJCTRCMTdDQkNBMEQ5NDVCOTEwMDUzRjE4MyAvKiBBY2Nlc3NpYmlsaXR5T2Jq
ZWN0V3JhcHBlci5tbSAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLm9iamNwcDsgcGF0aCA9IEFj
Y2Vzc2liaWxpdHlPYmplY3RXcmFwcGVyLm1tOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpA
QCAtODE5OCw4ICs4MjE2LDYgQEAKIAkJQkM3RkE2ODAwRDFGMTY3OTAwREIyMkE5IC8qIFNlbGVj
dG9yTm9kZUxpc3QuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGlu
ZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gU2Vs
ZWN0b3JOb2RlTGlzdC5jcHA7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCUJDODBDOTg1
MENEMjk0RUUwMEEwQjdCMyAvKiBDU1NUaW1pbmdGdW5jdGlvblZhbHVlLmNwcCAqLyA9IHtpc2Eg
PSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUg
PSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBDU1NUaW1pbmdGdW5jdGlvblZhbHVlLmNwcDsg
c291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQkM4MEM5ODYwQ0QyOTRFRTAwQTBCN0IzIC8q
IENTU1RpbWluZ0Z1bmN0aW9uVmFsdWUuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBm
aWxlRW5jb2RpbmcgPSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0
aCA9IENTU1RpbWluZ0Z1bmN0aW9uVmFsdWUuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsK
LQkJQkM4MEM5ODkwQ0QyOTUwNTAwQTBCN0IzIC8qIEFuaW1hdGlvbkNvbnRyb2xsZXIuY3BwICov
ID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25G
aWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEFuaW1hdGlvbkNvbnRyb2xsZXIu
Y3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwotCQlCQzgwQzk4QTBDRDI5NTA1MDBBMEI3
QjMgLyogQW5pbWF0aW9uQ29udHJvbGxlci5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7
IGZpbGVFbmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBw
YXRoID0gQW5pbWF0aW9uQ29udHJvbGxlci5oOyBzb3VyY2VUcmVlID0gIjxncm91cD4iOyB9Owog
CQlCQzgyNDMyNTBEMENFOEEyMDA0NjBDOEYgLyogSlNTUUxFcnJvci5oICovID0ge2lzYSA9IFBC
WEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291
cmNlY29kZS5jLmg7IHBhdGggPSBKU1NRTEVycm9yLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7
IH07CiAJCUJDODI0MzI2MEQwQ0U4QTIwMDQ2MEM4RiAvKiBKU1NRTFRyYW5zYWN0aW9uLmggKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IEpTU1FMVHJhbnNhY3Rpb24uaDsgc291cmNl
VHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJQkM4MjQzMjcwRDBDRThBMjAwNDYwQzhGIC8qIEpTVm9p
ZENhbGxiYWNrLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3BwLmNwcDsgcGF0aCA9IEpTVm9p
ZENhbGxiYWNrLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKQEAgLTg5NDMsNiArODk1
OSwyMyBAQAogCQkJdGFiV2lkdGggPSA0OwogCQkJdXNlc1RhYnMgPSAwOwogCQl9OworCQk0OUJE
NTk1ODBFNjhBMjUzMDA5NDcwNkMgLyogYW5pbWF0aW9uICovID0geworCQkJaXNhID0gUEJYR3Jv
dXA7CisJCQljaGlsZHJlbiA9ICgKKwkJCQk0OUJENTk1OTBFNjhBMjc4MDA5NDcwNkMgLyogQW5p
bWF0aW9uQ29udHJvbGxlci5jcHAgKi8sCisJCQkJNDlCRDU5NUEwRTY4QTI3ODAwOTQ3MDZDIC8q
IEFuaW1hdGlvbkNvbnRyb2xsZXIuaCAqLywKKwkJCQk0OUJENTk4RTBFNjhCODRFMDA5NDcwNkMg
LyogQW5pbWF0aW9uQmFzZS5oICovLAorCQkJCTQ5QkQ1OThGMEU2OEI4NEUwMDk0NzA2QyAvKiBB
bmltYXRpb25CYXNlLmNwcCAqLywKKwkJCQk0OUJENTlDNDBFNjhDNjE0MDA5NDcwNkMgLyogS2V5
ZnJhbWVBbmltYXRpb24uaCAqLywKKwkJCQk0OUJENTlDNTBFNjhDNjE0MDA5NDcwNkMgLyogS2V5
ZnJhbWVBbmltYXRpb24uY3BwICovLAorCQkJCTQ5QkQ1OUM2MEU2OEM2MTQwMDk0NzA2QyAvKiBJ
bXBsaWNpdEFuaW1hdGlvbi5oICovLAorCQkJCTQ5QkQ1OUM3MEU2OEM2MTQwMDk0NzA2QyAvKiBJ
bXBsaWNpdEFuaW1hdGlvbi5jcHAgKi8sCisJCQkJNDlCRDVBMjUwRTY4QzlCQjAwOTQ3MDZDIC8q
IENvbXBvc2l0ZUFuaW1hdGlvbi5oICovLAorCQkJCTQ5QkQ1QTI2MEU2OEM5QkIwMDk0NzA2QyAv
KiBDb21wb3NpdGVBbmltYXRpb24uY3BwICovLAorCQkJKTsKKwkJCW5hbWUgPSBhbmltYXRpb247
CisJCQlzb3VyY2VUcmVlID0gIjxncm91cD4iOworCQl9OwogCQk1MTI2RTZCNjBBMkUzQUVGMDA1
QzI5RkEgLyogaWNvbiAqLyA9IHsKIAkJCWlzYSA9IFBCWEdyb3VwOwogCQkJY2hpbGRyZW4gPSAo
CkBAIC05MjA4LDYgKzkyNDEsNyBAQAogCQk2NUJGMDIxODA5NzQ4MDYzMDBDNDMxOTYgLyogcGFn
ZSAqLyA9IHsKIAkJCWlzYSA9IFBCWEdyb3VwOwogCQkJY2hpbGRyZW4gPSAoCisJCQkJNDlCRDU5
NTgwRTY4QTI1MzAwOTQ3MDZDIC8qIGFuaW1hdGlvbiAqLywKIAkJCQk5M0MwOUE4MjBCMDY0RjA1
MDA1QUJENEQgLyogbWFjICovLAogCQkJCTA2NjkzRjQ1MEJGQkM5MTYwMDIxNjA3MiAvKiBpbnNw
ZWN0b3IgKi8sCiAJCQkJODUzOEYwMDAwQUQ3MTc3MDAwNkE4MUQxIC8qIEFic3RyYWN0Vmlldy5p
ZGwgKi8sCkBAIC05MjMxLDggKzkyNjUsNiBAQAogCQkJCTI5QUFDNTFEMEU1Mzk2M0IwMDhGOUIz
QiAvKiBBY2Nlc3NpYmlsaXR5VGFibGVIZWFkZXJDb250YWluZXIuaCAqLywKIAkJCQkyOTgwMEM5
NDBFNTI0QzhCMDAwMjU1MzYgLyogQWNjZXNzaWJpbGl0eVRhYmxlUm93LmNwcCAqLywKIAkJCQky
OTgwMEM5MzBFNTI0QzhCMDAwMjU1MzYgLyogQWNjZXNzaWJpbGl0eVRhYmxlUm93LmggKi8sCi0J
CQkJQkM4MEM5ODkwQ0QyOTUwNTAwQTBCN0IzIC8qIEFuaW1hdGlvbkNvbnRyb2xsZXIuY3BwICov
LAotCQkJCUJDODBDOThBMENEMjk1MDUwMEEwQjdCMyAvKiBBbmltYXRpb25Db250cm9sbGVyLmgg
Ki8sCiAJCQkJNEIyNEY5QTcwREE3MDUwQjAwMjY5RTU4IC8qIEFYT2JqZWN0Q2FjaGUuY3BwICov
LAogCQkJCTFBRjMyNjc2MEQ3OEI5NDQwMDY4RjBDNCAvKiBBWE9iamVjdENhY2hlLmggKi8sCiAJ
CQkJQkMxMjRFRTQwQzI2NDFDRDAwOUUyMzQ5IC8qIEJhckluZm8uY3BwICovLApAQCAtMTM0NDYs
NyArMTM0NzgsNiBAQAogCQkJYnVpbGRBY3Rpb25NYXNrID0gMjE0NzQ4MzY0NzsKIAkJCWZpbGVz
ID0gKAogCQkJCUIyNzUzNTU3MEIwNTM4MTQwMDJDRTY0RiAvKiBBZmZpbmVUcmFuc2Zvcm0uaCBp
biBIZWFkZXJzICovLAotCQkJCUJDODBDOThDMENEMjk1MDUwMEEwQjdCMyAvKiBBbmltYXRpb25D
b250cm9sbGVyLmggaW4gSGVhZGVycyAqLywKIAkJCQk5MzMwOURENzA5OUU2NDkyMDA1NkU1ODEg
LyogQXBwZW5kTm9kZUNvbW1hbmQuaCBpbiBIZWFkZXJzICovLAogCQkJCTkzMzA5REQ5MDk5RTY0
OTIwMDU2RTU4MSAvKiBBcHBseVN0eWxlQ29tbWFuZC5oIGluIEhlYWRlcnMgKi8sCiAJCQkJQkNG
QjJGNzcwOTdBMkUxQTAwQkE3MDNEIC8qIEFyZW5hLmggaW4gSGVhZGVycyAqLywKQEAgLTE1NDY5
LDYgKzE1NTAwLDExIEBACiAJCQkJQkNFRjQ0NEEwRTY3NDVFMDAwMUMxMjg3IC8qIFN0eWxlR2Vu
ZXJhdGVkSW1hZ2UuaCBpbiBIZWFkZXJzICovLAogCQkJCUJDRUY0NDREMEU2NzQ2MjgwMDFDMTI4
NyAvKiBTdHlsZUNhY2hlZEltYWdlLmggaW4gSGVhZGVycyAqLywKIAkJCQlBODhGRTMzNDBFNUVF
RTg3MDA4RDhDMEYgLyogR3JhcGhpY3NDb250ZXh0UHJpdmF0ZS5oIGluIEhlYWRlcnMgKi8sCisJ
CQkJNDlCRDU5NUMwRTY4QTI3ODAwOTQ3MDZDIC8qIEFuaW1hdGlvbkNvbnRyb2xsZXIuaCBpbiBI
ZWFkZXJzICovLAorCQkJCTQ5QkQ1OTkwMEU2OEI4NEUwMDk0NzA2QyAvKiBBbmltYXRpb25CYXNl
LmggaW4gSGVhZGVycyAqLywKKwkJCQk0OUJENTlDODBFNjhDNjE0MDA5NDcwNkMgLyogS2V5ZnJh
bWVBbmltYXRpb24uaCBpbiBIZWFkZXJzICovLAorCQkJCTQ5QkQ1OUNBMEU2OEM2MTQwMDk0NzA2
QyAvKiBJbXBsaWNpdEFuaW1hdGlvbi5oIGluIEhlYWRlcnMgKi8sCisJCQkJNDlCRDVBMjcwRTY4
QzlCQjAwOTQ3MDZDIC8qIENvbXBvc2l0ZUFuaW1hdGlvbi5oIGluIEhlYWRlcnMgKi8sCiAJCQkp
OwogCQkJcnVuT25seUZvckRlcGxveW1lbnRQb3N0cHJvY2Vzc2luZyA9IDA7CiAJCX07CkBAIC0x
NTcxMSw3ICsxNTc0Nyw2IEBACiAJCQlmaWxlcyA9ICgKIAkJCQlCMjc1MzU1NjBCMDUzODE0MDAy
Q0U2NEYgLyogQWZmaW5lVHJhbnNmb3JtLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUIyNzUzNTU4
MEIwNTM4MTQwMDJDRTY0RiAvKiBBZmZpbmVUcmFuc2Zvcm1DRy5jcHAgaW4gU291cmNlcyAqLywK
LQkJCQlCQzgwQzk4QjBDRDI5NTA1MDBBMEI3QjMgLyogQW5pbWF0aW9uQ29udHJvbGxlci5jcHAg
aW4gU291cmNlcyAqLywKIAkJCQk5MzMwOURENjA5OUU2NDkyMDA1NkU1ODEgLyogQXBwZW5kTm9k
ZUNvbW1hbmQuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJOTMzMDlERDgwOTlFNjQ5MjAwNTZFNTgx
IC8qIEFwcGx5U3R5bGVDb21tYW5kLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUJDRkIyRjc2MDk3
QTJFMUEwMEJBNzAzRCAvKiBBcmVuYS5jcHAgaW4gU291cmNlcyAqLywKQEAgLTE3MjY0LDYgKzE3
Mjk5LDExIEBACiAJCQkJQkNFRjQzRTAwRTY3NDExMDAwMUMxMjg3IC8qIE5pbmVQaWVjZUltYWdl
LmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUJDRUY0NDdBMEU2NzQ3RDAwMDFDMTI4NyAvKiBTdHls
ZUNhY2hlZEltYWdlLmNwcCBpbiBTb3VyY2VzICovLAogCQkJCUJDRUY0NDdEMEU2NzQ4MDYwMDFD
MTI4NyAvKiBTdHlsZUdlbmVyYXRlZEltYWdlLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTQ5QkQ1
OTVCMEU2OEEyNzgwMDk0NzA2QyAvKiBBbmltYXRpb25Db250cm9sbGVyLmNwcCBpbiBTb3VyY2Vz
ICovLAorCQkJCTQ5QkQ1OTkxMEU2OEI4NEUwMDk0NzA2QyAvKiBBbmltYXRpb25CYXNlLmNwcCBp
biBTb3VyY2VzICovLAorCQkJCTQ5QkQ1OUM5MEU2OEM2MTQwMDk0NzA2QyAvKiBLZXlmcmFtZUFu
aW1hdGlvbi5jcHAgaW4gU291cmNlcyAqLywKKwkJCQk0OUJENTlDQjBFNjhDNjE0MDA5NDcwNkMg
LyogSW1wbGljaXRBbmltYXRpb24uY3BwIGluIFNvdXJjZXMgKi8sCisJCQkJNDlCRDVBMjgwRTY4
QzlCQjAwOTQ3MDZDIC8qIENvbXBvc2l0ZUFuaW1hdGlvbi5jcHAgaW4gU291cmNlcyAqLywKIAkJ
CSk7CiAJCQlydW5Pbmx5Rm9yRGVwbG95bWVudFBvc3Rwcm9jZXNzaW5nID0gMDsKIAkJfTsKSW5k
ZXg6IFdlYkNvcmUvcGFnZS9BbmltYXRpb25Db250cm9sbGVyLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BhZ2UvQW5pbWF0aW9uQ29udHJvbGxlci5jcHAJKHJldmlzaW9uIDM1OTk1KQorKysg
V2ViQ29yZS9wYWdlL0FuaW1hdGlvbkNvbnRyb2xsZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0x
LDIxNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBt
ZXQ6Ci0gKgotICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKLSAqIDIuICBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICog
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKLSAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKLSAqIDMuICBOZWl0aGVyIHRoZSBu
YW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCi0g
KiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUg
cHJvZHVjdHMgZGVyaXZlZAotICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNp
ZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKLSAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFIElNUExJRUQKLSAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkK
LSAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTCi0gKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9G
IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAq
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCi0gKi8KLQotI2luY2x1ZGUgImNvbmZpZy5oIgotI2luY2x1ZGUgIkFuaW1hdGlv
bkNvbnRyb2xsZXIuaCIKLQotI2luY2x1ZGUgIkNTU1Byb3BlcnR5TmFtZXMuaCIKLSNpbmNsdWRl
ICJDU3RyaW5nLmgiCi0jaW5jbHVkZSAiRG9jdW1lbnQuaCIKLSNpbmNsdWRlICJFdmVudE5hbWVz
LmgiCi0jaW5jbHVkZSAiRmxvYXRDb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiRnJhbWUuaCIKLSNp
bmNsdWRlICJSZW5kZXJPYmplY3QuaCIKLSNpbmNsdWRlICJSZW5kZXJTdHlsZS5oIgotI2luY2x1
ZGUgIlN5c3RlbVRpbWUuaCIKLSNpbmNsdWRlICJUaW1lci5oIgotI2luY2x1ZGUgIlVuaXRCZXpp
ZXIuaCIKLQotbmFtZXNwYWNlIFdlYkNvcmUgewotCi1zdGF0aWMgY29uc3QgZG91YmxlIGNBbmlt
YXRpb25UaW1lckRlbGF5ID0gMC4wMjU7Ci0KLXN0YXRpYyB2b2lkIHNldENoYW5nZWQoTm9kZSog
bm9kZSkKLXsKLSAgICBBU1NFUlQoIW5vZGUgfHwgKG5vZGUtPmRvY3VtZW50KCkgJiYgIW5vZGUt
PmRvY3VtZW50KCktPmluUGFnZUNhY2hlKCkpKTsKLSAgICBub2RlLT5zZXRDaGFuZ2VkKEFuaW1h
dGlvblN0eWxlQ2hhbmdlKTsKLX0KLQotLy8gVGhlIGVwc2lsb24gdmFsdWUgd2UgcGFzcyB0byBV
bml0QmV6aWVyOjpzb2x2ZSBnaXZlbiB0aGF0IHRoZSBhbmltYXRpb24gaXMgZ29pbmcgdG8gcnVu
IG92ZXIgfGR1cnwgc2Vjb25kcy4gVGhlIGxvbmdlciB0aGUKLS8vIGFuaW1hdGlvbiwgdGhlIG1v
cmUgcHJlY2lzaW9uIHdlIG5lZWQgaW4gdGhlIHRpbWluZyBmdW5jdGlvbiByZXN1bHQgdG8gYXZv
aWQgdWdseSBkaXNjb250aW51aXRpZXMuCi1zdGF0aWMgaW5saW5lIGRvdWJsZSBzb2x2ZUVwc2ls
b24oZG91YmxlIGR1cmF0aW9uKSB7IHJldHVybiAxLiAvICgyMDAuICogZHVyYXRpb24pOyB9Ci0K
LXN0YXRpYyBpbmxpbmUgZG91YmxlIHNvbHZlQ3ViaWNCZXppZXJGdW5jdGlvbihkb3VibGUgcDF4
LCBkb3VibGUgcDF5LCBkb3VibGUgcDJ4LCBkb3VibGUgcDJ5LCBkb3VibGUgdCwgZG91YmxlIGR1
cmF0aW9uKQotewotICAgIC8vIENvbnZlcnQgZnJvbSBpbnB1dCB0aW1lIHRvIHBhcmFtZXRyaWMg
dmFsdWUgaW4gY3VydmUsIHRoZW4gZnJvbQotICAgIC8vIHRoYXQgdG8gb3V0cHV0IHRpbWUuCi0g
ICAgVW5pdEJlemllciBiZXppZXIocDF4LCBwMXksIHAyeCwgcDJ5KTsKLSAgICByZXR1cm4gYmV6
aWVyLnNvbHZlKHQsIHNvbHZlRXBzaWxvbihkdXJhdGlvbikpOwotfQotCi1jbGFzcyBDb21wb3Np
dGVBbmltYXRpb247Ci1jbGFzcyBBbmltYXRpb25CYXNlOwotCi1jbGFzcyBBbmltYXRpb25UaW1l
ckJhc2UgewotcHVibGljOgotICAgIEFuaW1hdGlvblRpbWVyQmFzZShBbmltYXRpb25CYXNlKiBh
bmltKQotICAgIDogbV90aW1lcih0aGlzLCAmQW5pbWF0aW9uVGltZXJCYXNlOjp0aW1lckZpcmVk
KQotICAgICwgbV9hbmltKGFuaW0pCi0gICAgewotICAgICAgICBtX3RpbWVyLnN0YXJ0T25lU2hv
dCgwKTsKLSAgICB9Ci0gICAgdmlydHVhbCB+QW5pbWF0aW9uVGltZXJCYXNlKCkKLSAgICB7Ci0g
ICAgfQotICAgIAotICAgIHZvaWQgc3RhcnRUaW1lcihkb3VibGUgdGltZW91dD0wKQotICAgIHsK
LSAgICAgICAgbV90aW1lci5zdGFydE9uZVNob3QodGltZW91dCk7Ci0gICAgfQotICAgIAotICAg
IHZvaWQgY2FuY2VsVGltZXIoKQotICAgIHsKLSAgICAgICAgbV90aW1lci5zdG9wKCk7Ci0gICAg
fQotICAgIAotICAgIHZpcnR1YWwgdm9pZCB0aW1lckZpcmVkKFRpbWVyPEFuaW1hdGlvblRpbWVy
QmFzZT4qKSA9IDA7Ci0gICAgCi1wcml2YXRlOgotICAgIFRpbWVyPEFuaW1hdGlvblRpbWVyQmFz
ZT4gbV90aW1lcjsKLSAgICAKLXByb3RlY3RlZDoKLSAgICBBbmltYXRpb25CYXNlKiBtX2FuaW07
Ci19OwotCi1jbGFzcyBBbmltYXRpb25FdmVudERpc3BhdGNoZXIgOiBwdWJsaWMgQW5pbWF0aW9u
VGltZXJCYXNlIHsKLXB1YmxpYzoKLSAgICBBbmltYXRpb25FdmVudERpc3BhdGNoZXIoQW5pbWF0
aW9uQmFzZSogYW5pbSkgCi0gICAgOiBBbmltYXRpb25UaW1lckJhc2UoYW5pbSkKLSAgICAsIG1f
cHJvcGVydHkoQ1NTUHJvcGVydHlJbnZhbGlkKQotICAgICwgbV9yZXNldChmYWxzZSkKLSAgICAs
IG1fZWxhcHNlZFRpbWUoLTEpCi0gICAgewotICAgIH0KLSAgICAKLSAgICB2aXJ0dWFsIH5Bbmlt
YXRpb25FdmVudERpc3BhdGNoZXIoKQotICAgIHsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBzdGFy
dFRpbWVyKEVsZW1lbnQqIGVsZW1lbnQsIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSwgaW50IHBy
b3BlcnR5LCBib29sIHJlc2V0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBBdG9taWNTdHJp
bmcmIGV2ZW50VHlwZSwgZG91YmxlIGVsYXBzZWRUaW1lKQotICAgIHsKLSAgICAgICAgbV9lbGVt
ZW50ID0gZWxlbWVudDsKLSAgICAgICAgbV9uYW1lID0gbmFtZTsKLSAgICAgICAgbV9wcm9wZXJ0
eSA9IHByb3BlcnR5OwotICAgICAgICBtX3Jlc2V0ID0gcmVzZXQ7Ci0gICAgICAgIG1fZXZlbnRU
eXBlID0gZXZlbnRUeXBlOwotICAgICAgICBtX2VsYXBzZWRUaW1lID0gZWxhcHNlZFRpbWU7Ci0g
ICAgICAgIEFuaW1hdGlvblRpbWVyQmFzZTo6c3RhcnRUaW1lcigpOwotICAgIH0KLSAgICAKLSAg
ICB2aXJ0dWFsIHZvaWQgdGltZXJGaXJlZChUaW1lcjxBbmltYXRpb25UaW1lckJhc2U+Kik7Ci0g
ICAgCi1wcml2YXRlOgotICAgIFJlZlB0cjxFbGVtZW50PiBtX2VsZW1lbnQ7Ci0gICAgQXRvbWlj
U3RyaW5nIG1fbmFtZTsKLSAgICBpbnQgbV9wcm9wZXJ0eTsKLSAgICBib29sIG1fcmVzZXQ7Ci0g
ICAgQXRvbWljU3RyaW5nIG1fZXZlbnRUeXBlOwotICAgIGRvdWJsZSBtX2VsYXBzZWRUaW1lOwot
fTsKLQotY2xhc3MgQW5pbWF0aW9uVGltZXJDYWxsYmFjayA6IHB1YmxpYyBBbmltYXRpb25UaW1l
ckJhc2UgewotcHVibGljOgotICAgIEFuaW1hdGlvblRpbWVyQ2FsbGJhY2soQW5pbWF0aW9uQmFz
ZSogYW5pbSkgCi0gICAgOiBBbmltYXRpb25UaW1lckJhc2UoYW5pbSkKLSAgICAsIG1fZWxhcHNl
ZFRpbWUoMCkKLSAgICB7IH0KLSAgICB2aXJ0dWFsIH5BbmltYXRpb25UaW1lckNhbGxiYWNrKCkg
eyB9Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkIHRpbWVyRmlyZWQoVGltZXI8QW5pbWF0aW9uVGlt
ZXJCYXNlPiopOwotICAgIAotICAgIHZvaWQgc3RhcnRUaW1lcihkb3VibGUgdGltZW91dCwgY29u
c3QgQXRvbWljU3RyaW5nJiBldmVudFR5cGUsIGRvdWJsZSBlbGFwc2VkVGltZSkKLSAgICB7Ci0g
ICAgICAgIG1fZXZlbnRUeXBlID0gZXZlbnRUeXBlOwotICAgICAgICBtX2VsYXBzZWRUaW1lID0g
ZWxhcHNlZFRpbWU7Ci0gICAgICAgIEFuaW1hdGlvblRpbWVyQmFzZTo6c3RhcnRUaW1lcih0aW1l
b3V0KTsKLSAgICB9Ci0gICAgCi1wcml2YXRlOgotICAgIEF0b21pY1N0cmluZyBtX2V2ZW50VHlw
ZTsKLSAgICBkb3VibGUgbV9lbGFwc2VkVGltZTsKLX07Ci0KLWNsYXNzIEltcGxpY2l0QW5pbWF0
aW9uOwotY2xhc3MgS2V5ZnJhbWVBbmltYXRpb247Ci1jbGFzcyBBbmltYXRpb25Db250cm9sbGVy
UHJpdmF0ZTsKLQotLy8gQSBDb21wb3NpdGVBbmltYXRpb24gcmVwcmVzZW50cyBhIGNvbGxlY3Rp
b24gb2YgYW5pbWF0aW9ucyB0aGF0IGFyZSBydW5uaW5nCi0vLyBvbiBhIHNpbmdsZSBSZW5kZXJP
YmplY3QsIHN1Y2ggYXMgYSBudW1iZXIgb2YgcHJvcGVydGllcyB0cmFuc2l0aW9uaW5nIGF0IG9u
Y2UuCi1jbGFzcyBDb21wb3NpdGVBbmltYXRpb24gOiBwdWJsaWMgTm9uY29weWFibGUgewotcHVi
bGljOgotICAgIENvbXBvc2l0ZUFuaW1hdGlvbihBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZSog
YW5pbWF0aW9uQ29udHJvbGxlcikKLSAgICA6IG1fc3VzcGVuZGVkKGZhbHNlKQotICAgICwgbV9h
bmltYXRpb25Db250cm9sbGVyKGFuaW1hdGlvbkNvbnRyb2xsZXIpCi0gICAgLCBtX251bVN0eWxl
QXZhaWxhYmxlV2FpdGVycygwKQotICAgIHsgfQotICAgIAotICAgIH5Db21wb3NpdGVBbmltYXRp
b24oKQotICAgIHsKLSAgICAgICAgZGVsZXRlQWxsVmFsdWVzKG1fdHJhbnNpdGlvbnMpOwotICAg
ICAgICBkZWxldGVBbGxWYWx1ZXMobV9rZXlmcmFtZUFuaW1hdGlvbnMpOwotICAgIH0KLSAgICAK
LSAgICBSZW5kZXJTdHlsZSogYW5pbWF0ZShSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJTdHls
ZSogY3VycmVudFN0eWxlLCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUpOwotICAgIAotICAgIHZv
aWQgc2V0QW5pbWF0aW5nKGJvb2wgaW5BbmltYXRpbmcpOwotICAgIGJvb2wgYW5pbWF0aW5nKCk7
Ci0gICAgCi0gICAgYm9vbCBoYXNBbmltYXRpb25Gb3JQcm9wZXJ0eShpbnQgcHJvcCkgY29uc3Qg
eyByZXR1cm4gbV90cmFuc2l0aW9ucy5jb250YWlucyhwcm9wKTsgfQotICAgIAotICAgIHZvaWQg
cmVzZXRUcmFuc2l0aW9ucyhSZW5kZXJPYmplY3QqKTsKLSAgICB2b2lkIHJlc2V0QW5pbWF0aW9u
cyhSZW5kZXJPYmplY3QqKTsKLSAgICAKLSAgICB2b2lkIGNsZWFudXBGaW5pc2hlZEFuaW1hdGlv
bnMoUmVuZGVyT2JqZWN0Kik7Ci0KLSAgICB2b2lkIHNldEFuaW1hdGlvblN0YXJ0VGltZShkb3Vi
bGUgdCk7Ci0gICAgdm9pZCBzZXRUcmFuc2l0aW9uU3RhcnRUaW1lKGludCBwcm9wZXJ0eSwgZG91
YmxlIHQpOwotICAgIAotICAgIHZvaWQgc3VzcGVuZEFuaW1hdGlvbnMoKTsKLSAgICB2b2lkIHJl
c3VtZUFuaW1hdGlvbnMoKTsKLSAgICBib29sIHN1c3BlbmRlZCgpIGNvbnN0IHsgcmV0dXJuIG1f
c3VzcGVuZGVkOyB9Ci0gICAgCi0gICAgdm9pZCBvdmVycmlkZUltcGxpY2l0QW5pbWF0aW9ucyhp
bnQgcHJvcGVydHkpOwotICAgIHZvaWQgcmVzdW1lT3ZlcnJpZGRlbkltcGxpY2l0QW5pbWF0aW9u
cyhpbnQgcHJvcGVydHkpOwotICAgIAotICAgIHZvaWQgc3R5bGVBdmFpbGFibGUoKTsKLSAgICAK
LSAgICBib29sIGlzQW5pbWF0aW5nUHJvcGVydHkoaW50IHByb3BlcnR5LCBib29sIGlzUnVubmlu
Z05vdykgY29uc3Q7Ci0gICAgCi0gICAgdm9pZCBzZXRXYWl0aW5nRm9yU3R5bGVBdmFpbGFibGUo
Ym9vbCB3YWl0aW5nKTsKLQotcHJvdGVjdGVkOgotICAgIHZvaWQgdXBkYXRlVHJhbnNpdGlvbnMo
UmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5bGUqIGN1cnJlbnRTdHlsZSwg
UmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlKTsKLSAgICB2b2lkIHVwZGF0ZUtleWZyYW1lQW5pbWF0
aW9ucyhSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBjb25zdCBSZW5kZXJTdHlsZSogY3VycmVudFN0
eWxlLCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUpOwotCi0gICAgS2V5ZnJhbWVBbmltYXRpb24q
IGZpbmRLZXlmcmFtZUFuaW1hdGlvbihjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUpOwotICAgIAot
cHJpdmF0ZToKLSAgICB0eXBlZGVmIEhhc2hNYXA8aW50LCBJbXBsaWNpdEFuaW1hdGlvbio+IENT
U1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA7Ci0gICAgdHlwZWRlZiBIYXNoTWFwPEF0b21pY1N0cmlu
Z0ltcGwqLCBLZXlmcmFtZUFuaW1hdGlvbio+ICBBbmltYXRpb25OYW1lTWFwOwotICAgIAotICAg
IENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXAgICBtX3RyYW5zaXRpb25zOwotICAgIEFuaW1hdGlv
bk5hbWVNYXAgICAgICAgICAgICBtX2tleWZyYW1lQW5pbWF0aW9uczsKLSAgICBib29sICAgICAg
ICAgICAgICAgICAgICAgICAgbV9zdXNwZW5kZWQ7Ci0gICAgQW5pbWF0aW9uQ29udHJvbGxlclBy
aXZhdGUqIG1fYW5pbWF0aW9uQ29udHJvbGxlcjsKLSAgICB1aW50MzJfdCAgICAgICAgICAgICAg
ICAgICAgbV9udW1TdHlsZUF2YWlsYWJsZVdhaXRlcnM7Ci19OwotCi1jbGFzcyBBbmltYXRpb25C
YXNlIDogcHVibGljIE5vbmNvcHlhYmxlIHsKLXB1YmxpYzoKLSAgICBBbmltYXRpb25CYXNlKGNv
bnN0IEFuaW1hdGlvbiogdHJhbnNpdGlvbiwgUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgQ29tcG9z
aXRlQW5pbWF0aW9uKiBjb21wQW5pbSk7Ci0gICAgdmlydHVhbCB+QW5pbWF0aW9uQmFzZSgpCi0g
ICAgewotICAgICAgICBpZiAobV9hbmltU3RhdGUgPT0gU1RBVEVfU1RBUlRfV0FJVF9TVFlMRV9B
VkFJTEFCTEUpCi0gICAgICAgICAgICBtX2NvbXBBbmltLT5zZXRXYWl0aW5nRm9yU3R5bGVBdmFp
bGFibGUoZmFsc2UpOwotICAgIH0KLSAgICAKLSAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyKCkg
Y29uc3QgeyByZXR1cm4gbV9vYmplY3Q7IH0KLSAgICBkb3VibGUgc3RhcnRUaW1lKCkgY29uc3Qg
eyByZXR1cm4gbV9zdGFydFRpbWU7IH0KLSAgICBkb3VibGUgZHVyYXRpb24oKSBjb25zdCAgeyBy
ZXR1cm4gbV9hbmltYXRpb24tPmR1cmF0aW9uKCk7IH0KLSAgICAKLSAgICB2b2lkIGNhbmNlbFRp
bWVycygpCi0gICAgewotICAgICAgICBtX2FuaW1hdGlvblRpbWVyQ2FsbGJhY2suY2FuY2VsVGlt
ZXIoKTsKLSAgICAgICAgbV9hbmltYXRpb25FdmVudERpc3BhdGNoZXIuY2FuY2VsVGltZXIoKTsK
LSAgICB9Ci0gICAgCi0gICAgLy8gQW5pbWF0aW9ucyBhbmQgVHJhbnNpdGlvbnMgZ28gdGhyb3Vn
aCB0aGUgc3RhdGVzIGJlbG93LiBXaGVuIGVudGVyaW5nIHRoZSBTVEFSVEVEIHN0YXRlCi0gICAg
Ly8gdGhlIGFuaW1hdGlvbiBpcyBzdGFydGVkLiBUaGlzIG1heSBvciBtYXkgbm90IHJlcXVpcmUg
ZGVmZXJyZWQgcmVzcG9uc2UgZnJvbSB0aGUgYW5pbWF0b3IuCi0gICAgLy8gSWYgc28sIHdlIHN0
YXkgaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGF0IHJlc3BvbnNlIGlzIHJlY2VpdmVkIChhbmQgaXQg
cmV0dXJucyB0aGUgc3RhcnQgdGltZSkuCi0gICAgLy8gT3RoZXJ3aXNlLCB3ZSB1c2UgdGhlIGN1
cnJlbnQgdGltZSBhcyB0aGUgc3RhcnQgdGltZSBhbmQgZ28gaW1tZWRpYXRlbHkgdG8gdGhlIExP
T1BJTkcgb3IKLSAgICAvLyBFTkRJTkcgc3RhdGUuCi0gICAgZW51bSBBbmltU3RhdGUgeyAKLSAg
ICAgICAgU1RBVEVfTkVXLCAgICAgICAgICAgICAgICAgICAgICAvLyBhbmltYXRpb24ganVzdCBj
cmVhdGVkLCBhbmltYXRpb24gbm90IHJ1bm5pbmcgeWV0Ci0gICAgICAgIFNUQVRFX1NUQVJUX1dB
SVRfVElNRVIsICAgICAgICAgLy8gc3RhcnQgdGltZXIgcnVubmluZywgd2FpdGluZyBmb3IgZmly
ZQotICAgICAgICBTVEFURV9TVEFSVF9XQUlUX1NUWUxFX0FWQUlMQUJMRSwgICAvLyB3YWl0aW5n
IGZvciBzdHlsZSBzZXR1cCBzbyB3ZSBjYW4gc3RhcnQgYW5pbWF0aW9ucwotICAgICAgICBTVEFU
RV9TVEFSVF9XQUlUX1JFU1BPTlNFLCAgICAgIC8vIGFuaW1hdGlvbiBzdGFydGVkLCB3YWl0aW5n
IGZvciByZXNwb25zZQotICAgICAgICBTVEFURV9MT09QSU5HLCAgICAgICAgICAgICAgICAgIC8v
IHJlc3BvbnNlIHJlY2VpdmVkLCBhbmltYXRpb24gcnVubmluZywgbG9vcCB0aW1lciBydW5uaW5n
LCB3YWl0aW5nIGZvciBmaXJlCi0gICAgICAgIFNUQVRFX0VORElORywgICAgICAgICAgICAgICAg
ICAgLy8gcmVzcG9uc2UgcmVjZWl2ZWQsIGFuaW1hdGlvbiBydW5uaW5nLCBlbmQgdGltZXIgcnVu
bmluZywgd2FpdGluZyBmb3IgZmlyZQotICAgICAgICBTVEFURV9QQVVTRURfV0FJVF9USU1FUiwg
ICAgICAgIC8vIGFuaW1hdGlvbiBpbiBwYXVzZSBtb2RlIHdoZW4gYW5pbWF0aW9uIHN0YXJ0ZWQK
LSAgICAgICAgU1RBVEVfUEFVU0VEX1dBSVRfUkVTUE9OU0UsICAgICAvLyBhbmltYXRpb24gcGF1
c2VkIHdoZW4gaW4gU1RBUlRJTkcgc3RhdGUKLSAgICAgICAgU1RBVEVfUEFVU0VEX1JVTiwgICAg
ICAgICAgICAgICAvLyBhbmltYXRpb24gcGF1c2VkIHdoZW4gaW4gTE9PUElORyBvciBFTkRJTkcg
c3RhdGUKLSAgICAgICAgU1RBVEVfRE9ORSAgICAgICAgICAgICAgICAgICAgICAvLyBlbmQgdGlt
ZXIgZmlyZWQsIGFuaW1hdGlvbiBmaW5pc2hlZCBhbmQgcmVtb3ZlZAotICAgIH07Ci0gICAgCi0g
ICAgZW51bSBBbmltU3RhdGVJbnB1dCB7Ci0gICAgICAgIFNUQVRFX0lOUFVUX01BS0VfTkVXLCAg
ICAgICAgICAgLy8gcmVzZXQgYmFjayB0byBuZXcgZnJvbSBhbnkgc3RhdGUKLSAgICAgICAgU1RB
VEVfSU5QVVRfU1RBUlRfQU5JTUFUSU9OLCAgICAvLyBhbmltYXRpb24gcmVxdWVzdHMgYSBzdGFy
dAotICAgICAgICBTVEFURV9JTlBVVF9SRVNUQVJUX0FOSU1BVElPTiwgIC8vIGZvcmNlIGEgcmVz
dGFydCBmcm9tIGFueSBzdGF0ZQotICAgICAgICBTVEFURV9JTlBVVF9TVEFSVF9USU1FUl9GSVJF
RCwgIC8vIHN0YXJ0IHRpbWVyIGZpcmVkCi0gICAgICAgIFNUQVRFX0lOUFVUX1NUWUxFX0FWQUlM
QUJMRSwgICAgICAgIC8vIHN0eWxlIGlzIHNldHVwLCByZWFkeSB0byBzdGFydCBhbmltYXRpbmcK
LSAgICAgICAgU1RBVEVfSU5QVVRfU1RBUlRfVElNRV9TRVQsICAgICAvLyBtX3N0YXJ0VGltZSB3
YXMgc2V0Ci0gICAgICAgIFNUQVRFX0lOUFVUX0xPT1BfVElNRVJfRklSRUQsICAgLy8gbG9vcCB0
aW1lciBmaXJlZAotICAgICAgICBTVEFURV9JTlBVVF9FTkRfVElNRVJfRklSRUQsICAgIC8vIGVu
ZCB0aW1lciBmaXJlZAotICAgICAgICBTVEFURV9JTlBVVF9QQVVTRV9PVkVSUklERSwgICAgIC8v
IHBhdXNlIGFuIGFuaW1hdGlvbiBkdWUgdG8gb3ZlcnJpZGUKLSAgICAgICAgU1RBVEVfSU5QVVRf
UkVTVU1FX09WRVJSSURFLCAgICAvLyByZXN1bWUgYW4gb3ZlcnJpZGRlbiBhbmltYXRpb24KLSAg
ICAgICAgU1RBVEVfSU5QVVRfUExBWV9TVEFURV9SVU5OSU5HLCAvLyBwbGF5IHN0YXRlIHBhdXNl
ZCAtPiBydW5uaW5nCi0gICAgICAgIFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUEFVU0VELCAgLy8g
cGxheSBzdGF0ZSBydW5uaW5nIC0+IHBhdXNlZAotICAgICAgICBTVEFURV9JTlBVVF9FTkRfQU5J
TUFUSU9OICAgICAgIC8vIGZvcmNlIGFuIGVuZCBmcm9tIGFueSBzdGF0ZQotICAgIH07Ci0gICAg
Ci0gICAgLy8gQ2FsbGVkIHdoZW4gYW5pbWF0aW9uIGlzIGluIE5FVyBzdGF0ZSB0byBzdGFydCBh
bmltYXRpb24KLSAgICB2b2lkIHVwZGF0ZVN0YXRlTWFjaGluZShBbmltU3RhdGVJbnB1dCBpbnB1
dCwgZG91YmxlIHBhcmFtKTsKLSAgICAKLSAgICAvLyBBbmltYXRpb24gaGFzIGFjdHVhbGx5IHN0
YXJ0ZWQsIGF0IHBhc3NlZCB0aW1lCi0gICAgdm9pZCBvbkFuaW1hdGlvblN0YXJ0UmVzcG9uc2Uo
ZG91YmxlIHN0YXJ0VGltZSk7Ci0gICAgCi0gICAgLy8gQ2FsbGVkIHRvIGNoYW5nZSB0byBvciBm
cm9tIHBhdXNlZCBzdGF0ZQotICAgIHZvaWQgdXBkYXRlUGxheVN0YXRlKGJvb2wgcnVubmluZyk7
Ci0gICAgYm9vbCBwbGF5U3RhdGVQbGF5aW5nKCkgY29uc3QgeyByZXR1cm4gbV9hbmltYXRpb24g
JiYgbV9hbmltYXRpb24tPnBsYXlTdGF0ZSgpID09IEFuaW1QbGF5U3RhdGVQbGF5aW5nOyB9Ci0g
ICAgCi0gICAgYm9vbCB3YWl0aW5nVG9TdGFydCgpIGNvbnN0IHsgcmV0dXJuIG1fYW5pbVN0YXRl
ID09IFNUQVRFX05FVyB8fCBtX2FuaW1TdGF0ZSA9PSBTVEFURV9TVEFSVF9XQUlUX1RJTUVSOyB9
Ci0gICAgYm9vbCBwcmVhY3RpdmUoKSBjb25zdAotICAgIHsgcmV0dXJuIG1fYW5pbVN0YXRlID09
IFNUQVRFX05FVyB8fAotICAgICAgICAgICAgIG1fYW5pbVN0YXRlID09IFNUQVRFX1NUQVJUX1dB
SVRfVElNRVIgfHwKLSAgICAgICAgICAgICBtX2FuaW1TdGF0ZSA9PSBTVEFURV9TVEFSVF9XQUlU
X1NUWUxFX0FWQUlMQUJMRSB8fAotICAgICAgICAgICAgIG1fYW5pbVN0YXRlID09IFNUQVRFX1NU
QVJUX1dBSVRfUkVTUE9OU0U7Ci0gICAgfQotICAgIGJvb2wgcG9zdGFjdGl2ZSgpIGNvbnN0IHsg
cmV0dXJuIG1fYW5pbVN0YXRlID09IFNUQVRFX0RPTkU7IH0KLSAgICBib29sIGFjdGl2ZSgpIGNv
bnN0IHsgcmV0dXJuICFwb3N0YWN0aXZlKCkgJiYgIXByZWFjdGl2ZSgpOyB9Ci0gICAgYm9vbCBy
dW5uaW5nKCkgY29uc3QgeyByZXR1cm4gIWlzbmV3KCkgJiYgIXBvc3RhY3RpdmUoKTsgfQotICAg
IGJvb2wgcGF1c2VkKCkgY29uc3QgeyByZXR1cm4gbV9wYXVzZVRpbWUgPj0gMDsgfQotICAgIGJv
b2wgaXNuZXcoKSBjb25zdCB7IHJldHVybiBtX2FuaW1TdGF0ZSA9PSBTVEFURV9ORVc7IH0KLSAg
ICBib29sIHdhaXRpbmdGb3JTdGFydFRpbWUoKSBjb25zdCB7IHJldHVybiBtX2FuaW1TdGF0ZSA9
PSBTVEFURV9TVEFSVF9XQUlUX1JFU1BPTlNFOyB9Ci0gICAgYm9vbCB3YWl0aW5nRm9yU3R5bGVB
dmFpbGFibGUoKSBjb25zdCB7IHJldHVybiBtX2FuaW1TdGF0ZSA9PSBTVEFURV9TVEFSVF9XQUlU
X1NUWUxFX0FWQUlMQUJMRTsgfQotICAgIGJvb2wgd2FpdGluZ0ZvckVuZEV2ZW50KCkgY29uc3Qg
IHsgcmV0dXJuIG1fd2FpdGluZ0ZvckVuZEV2ZW50OyB9Ci0gICAgCi0gICAgLy8gImFuaW1hdGlu
ZyIgbWVhbnMgdGhhdCBzb21ldGhpbmcgaXMgcnVubmluZyB0aGF0IHJlcXVpcmVzIGEgdGltZXIg
dG8ga2VlcCBmaXJpbmcKLSAgICAvLyAoZS5nLiBhIHNvZnR3YXJlIGFuaW1hdGlvbikKLSAgICB2
b2lkIHNldEFuaW1hdGluZyhib29sIGluQW5pbWF0aW5nID0gdHJ1ZSkgeyBtX2FuaW1hdGluZyA9
IGluQW5pbWF0aW5nOyB9Ci0gICAgYm9vbCBhbmltYXRpbmcoKSBjb25zdCB7IHJldHVybiBtX2Fu
aW1hdGluZzsgfQotICAgIAotICAgIGRvdWJsZSBwcm9ncmVzcyhkb3VibGUgc2NhbGUsIGRvdWJs
ZSBvZmZzZXQpIGNvbnN0OwotICAgIAotICAgIHZpcnR1YWwgdm9pZCBhbmltYXRlKENvbXBvc2l0
ZUFuaW1hdGlvbiosIFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5
bGUsIAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRlclN0eWxlKiB0YXJnZXRT
dHlsZSwgUmVuZGVyU3R5bGUqJiBhbmltYXRlZFN0eWxlKSB7IH0KLSAgICB2aXJ0dWFsIHZvaWQg
cmVzZXQoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5bGUqIGZyb20gPSAw
LCBjb25zdCBSZW5kZXJTdHlsZSogdG8gPSAwKSB7IH0KLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wg
c2hvdWxkRmlyZUV2ZW50cygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgCi0gICAgdm9p
ZCBhbmltYXRpb25UaW1lckNhbGxiYWNrRmlyZWQoY29uc3QgQXRvbWljU3RyaW5nJiBldmVudFR5
cGUsIGRvdWJsZSBlbGFwc2VkVGltZSk7Ci0gICAgdm9pZCBhbmltYXRpb25FdmVudERpc3BhdGNo
ZXJGaXJlZChFbGVtZW50KiBlbGVtZW50LCBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUsIGludCBw
cm9wZXJ0eSwgYm9vbCByZXNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnN0IEF0b21pY1N0cmluZyYgZXZlbnRUeXBlLCBkb3VibGUgZWxhcHNlZFRpbWUpOwot
ICAgIAotICAgIGJvb2wgYW5pbWF0aW9uc01hdGNoKGNvbnN0IEFuaW1hdGlvbiogYW5pbSkgY29u
c3QgeyByZXR1cm4gbV9hbmltYXRpb24tPmFuaW1hdGlvbnNNYXRjaChhbmltKTsgfQotICAgIAot
ICAgIHZvaWQgc2V0QW5pbWF0aW9uKGNvbnN0IEFuaW1hdGlvbiogYW5pbSkgeyBtX2FuaW1hdGlv
biA9IGNvbnN0X2Nhc3Q8QW5pbWF0aW9uKj4oYW5pbSk7IH0KLSAgICAKLSAgICAvLyBSZXR1cm4g
dHJ1ZSBpZiB0aGlzIGFuaW1hdGlvbiBpcyBvdmVycmlkZGVuLiBUaGlzIHdpbGwgb25seSBiZSB0
aGUgY2FzZSBmb3IKLSAgICAvLyBJbXBsaWNpdEFuaW1hdGlvbnMgYW5kIGlzIHVzZWQgdG8gZGV0
ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBmb3JjZQotICAgIC8vIHNldCB0aGUgc3Rh
cnQgdGltZS4gSWYgYW4gYW5pbWF0aW9uIGlzIG92ZXJyaWRkZW4sIGl0IHdpbGwgcHJvYmFibHkg
bm90IGdldAotICAgIC8vIGJhY2sgdGhlIFNUQVJUX1RJTUUgZXZlbnQuCi0gICAgdmlydHVhbCBi
b29sIG92ZXJyaWRkZW4oKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAgIAotICAgIC8vIERv
ZXMgdGhpcyBhbmltYXRpb24vdHJhbnNpdGlvbiBpbnZvbHZlIHRoZSBnaXZlbiBwcm9wZXJ0eT8K
LSAgICB2aXJ0dWFsIGJvb2wgYWZmZWN0c1Byb3BlcnR5KGludCBwcm9wZXJ0eSkgY29uc3QgeyBy
ZXR1cm4gZmFsc2U7IH0KLSAgICBib29sIGlzQW5pbWF0aW5nUHJvcGVydHkoaW50IHByb3BlcnR5
LCBib29sIGlzUnVubmluZ05vdykgY29uc3QKLSAgICB7Ci0gICAgICAgIGlmIChpc1J1bm5pbmdO
b3cpCi0gICAgICAgICAgICByZXR1cm4gKCF3YWl0aW5nVG9TdGFydCgpICYmICFwb3N0YWN0aXZl
KCkpICYmIGFmZmVjdHNQcm9wZXJ0eShwcm9wZXJ0eSk7Ci0KLSAgICAgICAgcmV0dXJuICFwb3N0
YWN0aXZlKCkgJiYgYWZmZWN0c1Byb3BlcnR5KHByb3BlcnR5KTsKLSAgICB9Ci0gICAgICAgIAot
cHJvdGVjdGVkOgotICAgIEVsZW1lbnQqIGVsZW1lbnRGb3JFdmVudERpc3BhdGNoKCkKLSAgICB7
Ci0gICAgICAgIGlmIChtX29iamVjdC0+bm9kZSgpICYmIG1fb2JqZWN0LT5ub2RlKCktPmlzRWxl
bWVudE5vZGUoKSkKLSAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxFbGVtZW50Kj4obV9v
YmplY3QtPm5vZGUoKSk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICB2aXJ0
dWFsIHZvaWQgb3ZlcnJpZGVBbmltYXRpb25zKCkgeyB9Ci0gICAgdmlydHVhbCB2b2lkIHJlc3Vt
ZU92ZXJyaWRkZW5BbmltYXRpb25zKCkgeyB9Ci0gICAgCi0gICAgQ29tcG9zaXRlQW5pbWF0aW9u
KiBjb21wb3NpdGVBbmltYXRpb24oKSB7IHJldHVybiBtX2NvbXBBbmltOyB9Ci0gICAgCi0gICAg
Ly8gVGhlc2UgYXJlIGNhbGxlZCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIHRpbWVyIGZpcmVzIHNv
IHN1YmNsYXNzZXMgY2FuIGRvIGFueSBleHRyYSB3b3JrCi0gICAgdmlydHVhbCB2b2lkIG9uQW5p
bWF0aW9uU3RhcnQoZG91YmxlIGVsYXBzZWRUaW1lKSB7IH0KLSAgICB2aXJ0dWFsIHZvaWQgb25B
bmltYXRpb25JdGVyYXRpb24oZG91YmxlIGVsYXBzZWRUaW1lKSB7IH0KLSAgICB2aXJ0dWFsIHZv
aWQgb25BbmltYXRpb25FbmQoZG91YmxlIGVsYXBzZWRUaW1lKSB7IH0KLSAgICB2aXJ0dWFsIGJv
b2wgc3RhcnRBbmltYXRpb24oZG91YmxlIGJlZ2luVGltZSkgeyByZXR1cm4gZmFsc2U7IH0KLSAg
ICB2aXJ0dWFsIHZvaWQgZW5kQW5pbWF0aW9uKGJvb2wgcmVzZXQpIHsgfQotICAgIAotICAgIHZv
aWQgcHJpbWVFdmVudFRpbWVycygpOwotICAgIAotcHJvdGVjdGVkOgotICAgIEFuaW1TdGF0ZSBt
X2FuaW1TdGF0ZTsKLSAgICBpbnQgbV9pdGVyYXRpb247Ci0gICAgCi0gICAgYm9vbCBtX2FuaW1h
dGluZzsgICAgICAgLy8gdHJhbnNpdGlvbi9hbmltYXRpb24gcmVxdWlyZXMgY29udGludWFsIHRp
bWVyIGZpcmluZwotICAgIGJvb2wgbV93YWl0ZWRGb3JSZXNwb25zZTsKLSAgICBkb3VibGUgbV9z
dGFydFRpbWU7Ci0gICAgZG91YmxlIG1fcGF1c2VUaW1lOwotICAgIFJlbmRlck9iamVjdCogbV9v
YmplY3Q7Ci0gICAgCi0gICAgQW5pbWF0aW9uVGltZXJDYWxsYmFjayBtX2FuaW1hdGlvblRpbWVy
Q2FsbGJhY2s7Ci0gICAgQW5pbWF0aW9uRXZlbnREaXNwYXRjaGVyIG1fYW5pbWF0aW9uRXZlbnRE
aXNwYXRjaGVyOwotICAgIFJlZlB0cjxBbmltYXRpb24+IG1fYW5pbWF0aW9uOwotICAgIENvbXBv
c2l0ZUFuaW1hdGlvbiogbV9jb21wQW5pbTsKLSAgICBib29sIG1fd2FpdGluZ0ZvckVuZEV2ZW50
OwotfTsKLQotLy8gQW4gSW1wbGljaXRBbmltYXRpb24gdHJhY2tzIHRoZSBzdGF0ZSBvZiBhIHRy
YW5zaXRpb24gb2YgYSBzcGVjaWZpYyBDU1MgcHJvcGVydHkKLS8vIGZvciBhIHNpbmdsZSBSZW5k
ZXJPYmplY3QuCi1jbGFzcyBJbXBsaWNpdEFuaW1hdGlvbiA6IHB1YmxpYyBBbmltYXRpb25CYXNl
IHsKLXB1YmxpYzoKLSAgICBJbXBsaWNpdEFuaW1hdGlvbihjb25zdCBBbmltYXRpb24qIHRyYW5z
aXRpb24sIGludCBhbmltYXRpbmdQcm9wZXJ0eSwgUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgQ29t
cG9zaXRlQW5pbWF0aW9uKiBjb21wQW5pbSkKLSAgICA6IEFuaW1hdGlvbkJhc2UodHJhbnNpdGlv
biwgcmVuZGVyZXIsIGNvbXBBbmltKQotICAgICwgbV90cmFuc2l0aW9uUHJvcGVydHkodHJhbnNp
dGlvbi0+cHJvcGVydHkoKSkKLSAgICAsIG1fYW5pbWF0aW5nUHJvcGVydHkoYW5pbWF0aW5nUHJv
cGVydHkpCi0gICAgLCBtX292ZXJyaWRkZW4oZmFsc2UpCi0gICAgLCBtX2Zyb21TdHlsZSgwKQot
ICAgICwgbV90b1N0eWxlKDApCi0gICAgewotICAgICAgICBBU1NFUlQoYW5pbWF0aW5nUHJvcGVy
dHkgIT0gY0FuaW1hdGVBbGwpOwotICAgIH0KLSAgICAKLSAgICB2aXJ0dWFsIH5JbXBsaWNpdEFu
aW1hdGlvbigpCi0gICAgewotICAgICAgICBBU1NFUlQoIW1fZnJvbVN0eWxlICYmICFtX3RvU3R5
bGUpOwotICAgICAgICAKLSAgICAgICAgLy8gSWYgd2Ugd2VyZSB3YWl0aW5nIGZvciBhbiBlbmQg
ZXZlbnQsIHdlIG5lZWQgdG8gZmluaXNoIHRoZSBhbmltYXRpb24gdG8gbWFrZSBzdXJlIG5vIG9s
ZAotICAgICAgICAvLyBhbmltYXRpb25zIHN0aWNrIGFyb3VuZCBpbiB0aGUgbG93ZXIgbGV2ZWxz
Ci0gICAgICAgIGlmICh3YWl0aW5nRm9yRW5kRXZlbnQoKSAmJiBtX29iamVjdCkKLSAgICAgICAg
ICAgIEFTU0VSVCgwKTsKLSAgICAgICAgCi0gICAgICAgIC8vIERvIHRoZSBjbGVhbnVwIGhlcmUg
aW5zdGVhZCBvZiBpbiB0aGUgYmFzZSBjbGFzcyBzbyB0aGUgc3BlY2lhbGl6ZWQgbWV0aG9kcyBn
ZXQgY2FsbGVkCi0gICAgICAgIGlmICghcG9zdGFjdGl2ZSgpKQotICAgICAgICAgICAgdXBkYXRl
U3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVUX0VORF9BTklNQVRJT04sIC0xKTsgICAgIAotICAgIH0K
LSAgICAKLSAgICBpbnQgdHJhbnNpdGlvblByb3BlcnR5KCkgY29uc3QgeyByZXR1cm4gbV90cmFu
c2l0aW9uUHJvcGVydHk7IH0KLSAgICBpbnQgYW5pbWF0aW5nUHJvcGVydHkoKSBjb25zdCB7IHJl
dHVybiBtX2FuaW1hdGluZ1Byb3BlcnR5OyB9Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkIG9uQW5p
bWF0aW9uRW5kKGRvdWJsZSBpbkVsYXBzZWRUaW1lKTsKLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQg
YW5pbWF0ZShDb21wb3NpdGVBbmltYXRpb24qLCBSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJT
dHlsZSogY3VycmVudFN0eWxlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZW5k
ZXJTdHlsZSogdGFyZ2V0U3R5bGUsIFJlbmRlclN0eWxlKiYgYW5pbWF0ZWRTdHlsZSk7Ci0gICAg
dmlydHVhbCB2b2lkIHJlc2V0KFJlbmRlck9iamVjdCogcmVuZGVyZXIsIGNvbnN0IFJlbmRlclN0
eWxlKiBmcm9tID0gMCwgY29uc3QgUmVuZGVyU3R5bGUqIHRvID0gMCk7Ci0gICAgCi0gICAgdm9p
ZCBzZXRPdmVycmlkZGVuKGJvb2wgYik7Ci0gICAgdmlydHVhbCBib29sIG92ZXJyaWRkZW4oKSBj
b25zdCB7IHJldHVybiBtX292ZXJyaWRkZW47IH0KLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wgc2hv
dWxkRmlyZUV2ZW50cygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgICAKLSAgICB2aXJ0dWFs
IGJvb2wgYWZmZWN0c1Byb3BlcnR5KGludCBwcm9wZXJ0eSkgY29uc3Q7Ci0gICAgCi0gICAgYm9v
bCBoYXNTdHlsZSgpIGNvbnN0IHsgcmV0dXJuIG1fZnJvbVN0eWxlICYmIG1fdG9TdHlsZTsgfQot
ICAgIAotICAgIGJvb2wgaXNUYXJnZXRQcm9wZXJ0eUVxdWFsKGludCBwcm9wLCBjb25zdCBSZW5k
ZXJTdHlsZSogdGFyZ2V0U3R5bGUpOwotCi0gICAgdm9pZCBibGVuZFByb3BlcnR5VmFsdWVJblN0
eWxlKGludCBwcm9wLCBSZW5kZXJTdHlsZSogY3VycmVudFN0eWxlKTsKLSAgICAKLXByb3RlY3Rl
ZDoKLSAgICBib29sIHNob3VsZFNlbmRFdmVudEZvckxpc3RlbmVyKERvY3VtZW50OjpMaXN0ZW5l
clR5cGUgaW5MaXN0ZW5lclR5cGUpCi0gICAgewotICAgICAgICByZXR1cm4gbV9vYmplY3QtPmRv
Y3VtZW50KCktPmhhc0xpc3RlbmVyVHlwZShpbkxpc3RlbmVyVHlwZSk7Ci0gICAgfQotICAgIAot
ICAgIGJvb2wgc2VuZFRyYW5zaXRpb25FdmVudChjb25zdCBBdG9taWNTdHJpbmcmIGluRXZlbnRU
eXBlLCBkb3VibGUgaW5FbGFwc2VkVGltZSk7Ci0gICAgCi1wcml2YXRlOgotICAgIGludCBtX3Ry
YW5zaXRpb25Qcm9wZXJ0eTsgICAvLyBUcmFuc2l0aW9uIHByb3BlcnR5IGFzIHNwZWNpZmllZCBp
biB0aGUgUmVuZGVyU3R5bGUuIE1heSBiZSBjQW5pbWF0ZUFsbAotICAgIGludCBtX2FuaW1hdGlu
Z1Byb3BlcnR5OyAgICAvLyBTcGVjaWZpYyBwcm9wZXJ0eSBmb3IgdGhpcyBJbXBsaWNpdEFuaW1h
dGlvbgotICAgIGJvb2wgbV9vdmVycmlkZGVuOyAgICAgICAgICAvLyB0cnVlIHdoZW4gdGhlcmUg
aXMgYSBrZXlmcmFtZSBhbmltYXRpb24gdGhhdCBvdmVycmlkZXMgdGhlIHRyYW5zaXRpb25pbmcg
cHJvcGVydHkKLSAgICAKLSAgICAvLyBUaGUgdHdvIHN0eWxlcyB0aGF0IHdlIGFyZSBibGVuZGlu
Zy4KLSAgICBSZW5kZXJTdHlsZSogbV9mcm9tU3R5bGU7Ci0gICAgUmVuZGVyU3R5bGUqIG1fdG9T
dHlsZTsKLX07Ci0KLXZvaWQgQW5pbWF0aW9uVGltZXJDYWxsYmFjazo6dGltZXJGaXJlZChUaW1l
cjxBbmltYXRpb25UaW1lckJhc2U+KikKLXsKLSAgICBtX2FuaW0tPmFuaW1hdGlvblRpbWVyQ2Fs
bGJhY2tGaXJlZChtX2V2ZW50VHlwZSwgbV9lbGFwc2VkVGltZSk7Ci19Ci0KLXZvaWQgQW5pbWF0
aW9uRXZlbnREaXNwYXRjaGVyOjp0aW1lckZpcmVkKFRpbWVyPEFuaW1hdGlvblRpbWVyQmFzZT4q
KQotewotICAgIG1fYW5pbS0+YW5pbWF0aW9uRXZlbnREaXNwYXRjaGVyRmlyZWQobV9lbGVtZW50
LmdldCgpLCBtX25hbWUsIG1fcHJvcGVydHksIG1fcmVzZXQsIG1fZXZlbnRUeXBlLCBtX2VsYXBz
ZWRUaW1lKTsKLX0KLQotLy8gQW4gS2V5ZnJhbWVBbmltYXRpb24gdHJhY2tzIHRoZSBzdGF0ZSBv
ZiBhbiBleHBsaWNpdCBhbmltYXRpb24KLS8vIGZvciBhIHNpbmdsZSBSZW5kZXJPYmplY3QuCi1j
bGFzcyBLZXlmcmFtZUFuaW1hdGlvbiA6IHB1YmxpYyBBbmltYXRpb25CYXNlIHsKLXB1YmxpYzoK
LSAgICBLZXlmcmFtZUFuaW1hdGlvbihjb25zdCBBbmltYXRpb24qIGFuaW1hdGlvbiwgUmVuZGVy
T2JqZWN0KiByZW5kZXJlciwgaW50IGluZGV4LCBDb21wb3NpdGVBbmltYXRpb24qIGNvbXBBbmlt
KQotICAgIDogQW5pbWF0aW9uQmFzZShhbmltYXRpb24sIHJlbmRlcmVyLCBjb21wQW5pbSkKLSAg
ICAsIG1fa2V5ZnJhbWVzKGFuaW1hdGlvbi0+a2V5ZnJhbWVMaXN0KCkpCi0gICAgLCBtX25hbWUo
YW5pbWF0aW9uLT5uYW1lKCkpCi0gICAgLCBtX2luZGV4KGluZGV4KQotICAgIHsKLSAgICB9Ci0K
LSAgICB2aXJ0dWFsIH5LZXlmcmFtZUFuaW1hdGlvbigpCi0gICAgewotICAgICAgICAvLyBEbyB0
aGUgY2xlYW51cCBoZXJlIGluc3RlYWQgb2YgaW4gdGhlIGJhc2UgY2xhc3Mgc28gdGhlIHNwZWNp
YWxpemVkIG1ldGhvZHMgZ2V0IGNhbGxlZAotICAgICAgICBpZiAoIXBvc3RhY3RpdmUoKSkKLSAg
ICAgICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFURV9JTlBVVF9FTkRfQU5JTUFUSU9OLCAt
MSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIGFuaW1hdGUoQ29tcG9zaXRlQW5pbWF0aW9u
KiwgUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyU3R5bGUqIGN1cnJlbnRTdHlsZSwKLSAgICAg
ICAgICAgICAgICAgICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUsIFJlbmRl
clN0eWxlKiYgYW5pbWF0ZWRTdHlsZSk7Ci0KLSAgICB2b2lkIHNldE5hbWUoY29uc3QgU3RyaW5n
JiBzKSB7IG1fbmFtZSA9IHM7IH0KLSAgICBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUoKSBjb25z
dCB7IHJldHVybiBtX25hbWU7IH0KLSAgICBpbnQgaW5kZXgoKSBjb25zdCB7IHJldHVybiBtX2lu
ZGV4OyB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkRmlyZUV2ZW50cygpIGNvbnN0IHsgcmV0
dXJuIHRydWU7IH0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBvbkFuaW1hdGlvblN0
YXJ0KGRvdWJsZSBpbkVsYXBzZWRUaW1lKTsKLSAgICB2aXJ0dWFsIHZvaWQgb25BbmltYXRpb25J
dGVyYXRpb24oZG91YmxlIGluRWxhcHNlZFRpbWUpOwotICAgIHZpcnR1YWwgdm9pZCBvbkFuaW1h
dGlvbkVuZChkb3VibGUgaW5FbGFwc2VkVGltZSk7Ci0gICAgdmlydHVhbCB2b2lkIGVuZEFuaW1h
dGlvbihib29sIHJlc2V0KTsKLQotICAgIHZpcnR1YWwgdm9pZCBvdmVycmlkZUFuaW1hdGlvbnMo
KTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVzdW1lT3ZlcnJpZGRlbkFuaW1hdGlvbnMoKTsKLSAgICAK
LSAgICBib29sIHNob3VsZFNlbmRFdmVudEZvckxpc3RlbmVyKERvY3VtZW50OjpMaXN0ZW5lclR5
cGUgaW5MaXN0ZW5lclR5cGUpCi0gICAgewotICAgICAgICByZXR1cm4gbV9vYmplY3QtPmRvY3Vt
ZW50KCktPmhhc0xpc3RlbmVyVHlwZShpbkxpc3RlbmVyVHlwZSk7Ci0gICAgfQotICAgIAotICAg
IGJvb2wgc2VuZEFuaW1hdGlvbkV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyYgaW5FdmVudFR5cGUs
IGRvdWJsZSBpbkVsYXBzZWRUaW1lKTsKLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wgYWZmZWN0c1By
b3BlcnR5KGludCBwcm9wZXJ0eSkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgLy8gVGhlIGtleWZy
YW1lcyB0aGF0IHdlIGFyZSBibGVuZGluZy4KLSAgICBSZWZQdHI8S2V5ZnJhbWVMaXN0PiBtX2tl
eWZyYW1lczsKLSAgICBBdG9taWNTdHJpbmcgbV9uYW1lOwotICAgIC8vIFRoZSBvcmRlciBpbiB3
aGljaCB0aGlzIGFuaW1hdGlvbiBhcHBlYXJzIGluIHRoZSBhbmltYXRpb24tbmFtZSBzdHlsZS4K
LSAgICBpbnQgbV9pbmRleDsKLX07Ci0KLUFuaW1hdGlvbkJhc2U6OkFuaW1hdGlvbkJhc2UoY29u
c3QgQW5pbWF0aW9uKiB0cmFuc2l0aW9uLCBSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBDb21wb3Np
dGVBbmltYXRpb24qIGNvbXBBbmltKQotOiBtX2FuaW1TdGF0ZShTVEFURV9ORVcpCi0sIG1faXRl
cmF0aW9uKDApCi0sIG1fYW5pbWF0aW5nKGZhbHNlKQotLCBtX3dhaXRlZEZvclJlc3BvbnNlKGZh
bHNlKQotLCBtX3N0YXJ0VGltZSgwKQotLCBtX3BhdXNlVGltZSgtMSkKLSwgbV9vYmplY3QocmVu
ZGVyZXIpCi0sIG1fYW5pbWF0aW9uVGltZXJDYWxsYmFjayhjb25zdF9jYXN0PEFuaW1hdGlvbkJh
c2UqPih0aGlzKSkKLSwgbV9hbmltYXRpb25FdmVudERpc3BhdGNoZXIoY29uc3RfY2FzdDxBbmlt
YXRpb25CYXNlKj4odGhpcykpCi0sIG1fYW5pbWF0aW9uKGNvbnN0X2Nhc3Q8QW5pbWF0aW9uKj4o
dHJhbnNpdGlvbikpCi0sIG1fY29tcEFuaW0oY29tcEFuaW0pCi0sIG1fd2FpdGluZ0ZvckVuZEV2
ZW50KGZhbHNlKQotewotfQotCi12b2lkIEFuaW1hdGlvbkJhc2U6OnVwZGF0ZVN0YXRlTWFjaGlu
ZShBbmltU3RhdGVJbnB1dCBpbnB1dCwgZG91YmxlIHBhcmFtKQotewotICAgIC8vIElmIHdlIGdl
dCBhIFJFU1RBUlQgdGhlbiB3ZSBmb3JjZSBhIG5ldyBhbmltYXRpb24sIHJlZ2FyZGxlc3Mgb2Yg
c3RhdGUKLSAgICBpZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfTUFLRV9ORVcpIHsKLSAgICAgICAg
aWYgKG1fYW5pbVN0YXRlID09IFNUQVRFX1NUQVJUX1dBSVRfU1RZTEVfQVZBSUxBQkxFKQotICAg
ICAgICAgICAgbV9jb21wQW5pbS0+c2V0V2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKGZhbHNlKTsK
LSAgICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9ORVc7Ci0gICAgICAgIG1fc3RhcnRUaW1lID0g
MDsKLSAgICAgICAgbV9wYXVzZVRpbWUgPSAtMTsKLSAgICAgICAgbV93YWl0ZWRGb3JSZXNwb25z
ZSA9IGZhbHNlOwotICAgICAgICBlbmRBbmltYXRpb24oZmFsc2UpOwotICAgICAgICByZXR1cm47
Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0ID09IFNUQVRFX0lOUFVUX1JFU1RBUlRfQU5JTUFU
SU9OKSB7Ci0gICAgICAgIGNhbmNlbFRpbWVycygpOwotICAgICAgICBpZiAobV9hbmltU3RhdGUg
PT0gU1RBVEVfU1RBUlRfV0FJVF9TVFlMRV9BVkFJTEFCTEUpCi0gICAgICAgICAgICBtX2NvbXBB
bmltLT5zZXRXYWl0aW5nRm9yU3R5bGVBdmFpbGFibGUoZmFsc2UpOwotICAgICAgICBtX2FuaW1T
dGF0ZSA9IFNUQVRFX05FVzsKLSAgICAgICAgbV9zdGFydFRpbWUgPSAwOwotICAgICAgICBtX3Bh
dXNlVGltZSA9IC0xOwotICAgICAgICBlbmRBbmltYXRpb24oZmFsc2UpOwotICAgICAgICAKLSAg
ICAgICAgaWYgKCFwYXVzZWQoKSkKLSAgICAgICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFU
RV9JTlBVVF9TVEFSVF9BTklNQVRJT04sIC0xKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAg
ICBlbHNlIGlmIChpbnB1dCA9PSBTVEFURV9JTlBVVF9FTkRfQU5JTUFUSU9OKSB7Ci0gICAgICAg
IGNhbmNlbFRpbWVycygpOwotICAgICAgICBpZiAobV9hbmltU3RhdGUgPT0gU1RBVEVfU1RBUlRf
V0FJVF9TVFlMRV9BVkFJTEFCTEUpCi0gICAgICAgICAgICBtX2NvbXBBbmltLT5zZXRXYWl0aW5n
Rm9yU3R5bGVBdmFpbGFibGUoZmFsc2UpOwotICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX0RP
TkU7Ci0gICAgICAgIGVuZEFuaW1hdGlvbih0cnVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0K
LSAgICBlbHNlIGlmIChpbnB1dCA9PSBTVEFURV9JTlBVVF9QQVVTRV9PVkVSUklERSkgewotICAg
ICAgICBpZiAobV9hbmltU3RhdGUgPT0gU1RBVEVfU1RBUlRfV0FJVF9SRVNQT05TRSkgewotICAg
ICAgICAgICAgLy8gSWYgd2UgYXJlIGluIHRoZSBXQUlUX1JFU1BPTlNFIHN0YXRlLCB0aGUgYW5p
bWF0aW9uIHdpbGwgZ2V0IGNhbmNlbGVkIGJlZm9yZSAKLSAgICAgICAgICAgIC8vIHdlIGdldCBh
IHJlc3BvbnNlLCBzbyBtb3ZlIHRvIHRoZSBuZXh0IHN0YXRlCi0gICAgICAgICAgICBlbmRBbmlt
YXRpb24oZmFsc2UpOwotICAgICAgICAgICAgdXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVU
X1NUQVJUX1RJTUVfU0VULCBjdXJyZW50VGltZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1
cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0ID09IFNUQVRFX0lOUFVUX1JFU1VNRV9PVkVS
UklERSkgewotICAgICAgICBpZiAobV9hbmltU3RhdGUgPT0gU1RBVEVfTE9PUElORyB8fCBtX2Fu
aW1TdGF0ZSA9PSBTVEFURV9FTkRJTkcpIHsKLSAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBhbmlt
YXRpb24KLSAgICAgICAgICAgIHN0YXJ0QW5pbWF0aW9uKG1fc3RhcnRUaW1lKTsKLSAgICAgICAg
fQotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIAotICAgIC8vIEV4ZWN1dGUgc3RhdGUgbWFj
aGluZQotICAgIHN3aXRjaChtX2FuaW1TdGF0ZSkgewotICAgICAgICBjYXNlIFNUQVRFX05FVzoK
LSAgICAgICAgICAgIEFTU0VSVChpbnB1dCA9PSBTVEFURV9JTlBVVF9TVEFSVF9BTklNQVRJT04g
fHwgaW5wdXQgPT0gU1RBVEVfSU5QVVRfUExBWV9TVEFURV9SVU5OSU5HIHx8IGlucHV0ID09IFNU
QVRFX0lOUFVUX1BMQVlfU1RBVEVfUEFVU0VEKTsKLSAgICAgICAgICAgIGlmIChpbnB1dCA9PSBT
VEFURV9JTlBVVF9TVEFSVF9BTklNQVRJT04gfHwgaW5wdXQgPT0gU1RBVEVfSU5QVVRfUExBWV9T
VEFURV9SVU5OSU5HKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBzdGFydCB0aW1lciB0
byB0aGUgaW5pdGlhbCBkZWxheSAoMCBpZiBubyBkZWxheSkKLSAgICAgICAgICAgICAgICBtX3dh
aXRlZEZvclJlc3BvbnNlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbV9hbmltU3RhdGUgPSBT
VEFURV9TVEFSVF9XQUlUX1RJTUVSOwotICAgICAgICAgICAgICAgIG1fYW5pbWF0aW9uVGltZXJD
YWxsYmFjay5zdGFydFRpbWVyKG1fYW5pbWF0aW9uLT5kZWxheSgpLCBFdmVudE5hbWVzOjp3ZWJr
aXRBbmltYXRpb25TdGFydEV2ZW50LCBtX2FuaW1hdGlvbi0+ZGVsYXkoKSk7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVEFURV9TVEFSVF9XQUlUX1RJ
TUVSOgotICAgICAgICAgICAgQVNTRVJUKGlucHV0ID09IFNUQVRFX0lOUFVUX1NUQVJUX1RJTUVS
X0ZJUkVEIHx8IGlucHV0ID09IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUEFVU0VEKTsKLSAgICAg
ICAgICAgIAotICAgICAgICAgICAgaWYgKGlucHV0ID09IFNUQVRFX0lOUFVUX1NUQVJUX1RJTUVS
X0ZJUkVEKSB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHBhcmFtID49IDApOwotICAgICAgICAg
ICAgICAgIC8vIFN0YXJ0IHRpbWVyIGhhcyBmaXJlZCwgdGVsbCB0aGUgYW5pbWF0aW9uIHRvIHN0
YXJ0IGFuZCB3YWl0IGZvciBpdCB0byByZXNwb25kIHdpdGggc3RhcnQgdGltZQotICAgICAgICAg
ICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfU1RBUlRfV0FJVF9TVFlMRV9BVkFJTEFCTEU7Ci0g
ICAgICAgICAgICAgICAgbV9jb21wQW5pbS0+c2V0V2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKHRy
dWUpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIFRyaWdnZXIgYSByZW5k
ZXIgc28gd2UgY2FuIHN0YXJ0IHRoZSBhbmltYXRpb24KLSAgICAgICAgICAgICAgICBzZXRDaGFu
Z2VkKG1fb2JqZWN0LT5lbGVtZW50KCkpOwotICAgICAgICAgICAgICAgIG1fb2JqZWN0LT5hbmlt
YXRpb24oKS0+c3RhcnRVcGRhdGVSZW5kZXJpbmdEaXNwYXRjaGVyKCk7Ci0gICAgICAgICAgICB9
Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQocnVubmluZygpKTsK
LSAgICAgICAgICAgICAgICAvLyBXZSdyZSB3YWl0aW5nIGZvciB0aGUgc3RhcnQgdGltZXIgdG8g
ZmlyZSBhbmQgd2UgZ290IGEgcGF1c2UuIENhbmNlbCB0aGUgdGltZXIsIHBhdXNlIGFuZCB3YWl0
Ci0gICAgICAgICAgICAgICAgbV9wYXVzZVRpbWUgPSBjdXJyZW50VGltZSgpOwotICAgICAgICAg
ICAgICAgIGNhbmNlbFRpbWVycygpOwotICAgICAgICAgICAgICAgIG1fYW5pbVN0YXRlID0gU1RB
VEVfUEFVU0VEX1dBSVRfVElNRVI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgY2FzZSBTVEFURV9TVEFSVF9XQUlUX1NUWUxFX0FWQUlMQUJMRToKLSAgICAgICAg
ICAgIEFTU0VSVChpbnB1dCA9PSBTVEFURV9JTlBVVF9TVFlMRV9BVkFJTEFCTEUgfHwgaW5wdXQg
PT0gU1RBVEVfSU5QVVRfUExBWV9TVEFURV9QQVVTRUQpOwotICAgICAgICAgICAgCi0gICAgICAg
ICAgICBtX2NvbXBBbmltLT5zZXRXYWl0aW5nRm9yU3R5bGVBdmFpbGFibGUoZmFsc2UpOwotICAg
ICAgICAgICAgCi0gICAgICAgICAgICBpZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfU1RZTEVfQVZB
SUxBQkxFKSB7Ci0gICAgICAgICAgICAgICAgLy8gU3RhcnQgdGltZXIgaGFzIGZpcmVkLCB0ZWxs
IHRoZSBhbmltYXRpb24gdG8gc3RhcnQgYW5kIHdhaXQgZm9yIGl0IHRvIHJlc3BvbmQgd2l0aCBz
dGFydCB0aW1lCi0gICAgICAgICAgICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9TVEFSVF9XQUlU
X1JFU1BPTlNFOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIG92ZXJyaWRlQW5p
bWF0aW9ucygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIC8vIFNlbmQgc3Rh
cnQgZXZlbnQsIGlmIG5lZWRlZAotICAgICAgICAgICAgICAgIG9uQW5pbWF0aW9uU3RhcnQoMC4w
Zik7IC8vIFRoZSBlbGFwc2VkVGltZSBpcyBhbHdheXMgMCBoZXJlCi0gICAgICAgICAgICAgICAg
Ci0gICAgICAgICAgICAgICAgLy8gU3RhcnQgdGhlIGFuaW1hdGlvbgotICAgICAgICAgICAgICAg
IGlmIChvdmVycmlkZGVuKCkgfHwgIXN0YXJ0QW5pbWF0aW9uKDApKSB7Ci0gICAgICAgICAgICAg
ICAgICAgIC8vIFdlJ3JlIG5vdCBnb2luZyB0byBnZXQgYSBzdGFydFRpbWUgY2FsbGJhY2ssIHNv
IGZpcmUgdGhlIHN0YXJ0IHRpbWUgaGVyZQotICAgICAgICAgICAgICAgICAgICBtX2FuaW1TdGF0
ZSA9IFNUQVRFX1NUQVJUX1dBSVRfUkVTUE9OU0U7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0
ZVN0YXRlTWFjaGluZShTVEFURV9JTlBVVF9TVEFSVF9USU1FX1NFVCwgY3VycmVudFRpbWUoKSk7
Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAg
ICAgICAgbV93YWl0ZWRGb3JSZXNwb25zZSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
ICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBBU1NFUlQocnVubmluZygpKTsKLSAgICAgICAg
ICAgICAgICAvLyBXZSdyZSB3YWl0aW5nIGZvciB0aGUgYSBub3RpZmljYXRpb24gdGhhdCB0aGUg
c3R5bGUgaGFzIGJlZW4gc2V0dXAuIElmIHdlJ3JlIGFza2VkIHRvIHdhaXQKLSAgICAgICAgICAg
ICAgICAvLyBhdCB0aGlzIHBvaW50LCB0aGUgc3R5bGUgbXVzdCBoYXZlIGJlZW4gcHJvY2Vzc2Vk
LCBzbyB3ZSBjYW4gZGVhbCB3aXRoIHRoaXMgbGlrZSB3ZSB3b3VsZAotICAgICAgICAgICAgICAg
IC8vIGZvciBXQUlUX1JFU1BPTlNFLCBleGNlcHQgdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFu
IGVuZEFuaW1hdGlvbigpLgotICAgICAgICAgICAgICAgIG1fcGF1c2VUaW1lID0gMDsKLSAgICAg
ICAgICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX1NUQVJUX1dBSVRfUkVTUE9OU0U7Ci0gICAg
ICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVEFURV9TVEFSVF9X
QUlUX1JFU1BPTlNFOgotICAgICAgICAgICAgQVNTRVJUKGlucHV0ID09IFNUQVRFX0lOUFVUX1NU
QVJUX1RJTUVfU0VUIHx8IGlucHV0ID09IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUEFVU0VEKTsK
LSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGlucHV0ID09IFNUQVRFX0lOUFVUX1NUQVJU
X1RJTUVfU0VUKSB7Ci0gICAgICAgICAgICAgICAgQVNTRVJUKHBhcmFtID49IDApOwotICAgICAg
ICAgICAgICAgIC8vIFdlIGhhdmUgYSBzdGFydCB0aW1lLCBzZXQgaXQsIHVubGVzcyB0aGUgc3Rh
cnRUaW1lIGlzIGFscmVhZHkgc2V0Ci0gICAgICAgICAgICAgICAgaWYgKG1fc3RhcnRUaW1lIDw9
IDApCi0gICAgICAgICAgICAgICAgICAgIG1fc3RhcnRUaW1lID0gcGFyYW07Ci0gICAgICAgICAg
ICAgICAgCi0gICAgICAgICAgICAgICAgLy8gRGVjaWRlIHdoZW4gdGhlIGVuZCBvciBsb29wIGV2
ZW50IG5lZWRzIHRvIGZpcmUKLSAgICAgICAgICAgICAgICBwcmltZUV2ZW50VGltZXJzKCk7Ci0g
ICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBhIHJlbmRlciBzbyB3
ZSBjYW4gc3RhcnQgdGhlIGFuaW1hdGlvbgotICAgICAgICAgICAgICAgIHNldENoYW5nZWQobV9v
YmplY3QtPmVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgbV9vYmplY3QtPmFuaW1hdGlvbigp
LT5zdGFydFVwZGF0ZVJlbmRlcmluZ0Rpc3BhdGNoZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBwYXVzaW5nIHdoaWxlIHdh
aXRpbmcgZm9yIGEgc3RhcnQgcmVzcG9uc2UuIENhbmNlbCB0aGUgYW5pbWF0aW9uIGFuZCB3YWl0
LiBXaGVuIAotICAgICAgICAgICAgICAgIC8vIHdlIHVucGF1c2UsIHdlIHdpbGwgYWN0IGFzIHRo
b3VnaCB0aGUgc3RhcnQgdGltZXIganVzdCBmaXJlZAotICAgICAgICAgICAgICAgIG1fcGF1c2VU
aW1lID0gMDsKLSAgICAgICAgICAgICAgICBlbmRBbmltYXRpb24oZmFsc2UpOwotICAgICAgICAg
ICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfUEFVU0VEX1dBSVRfUkVTUE9OU0U7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVEFURV9MT09QSU5HOgot
ICAgICAgICAgICAgQVNTRVJUKGlucHV0ID09IFNUQVRFX0lOUFVUX0xPT1BfVElNRVJfRklSRUQg
fHwgaW5wdXQgPT0gU1RBVEVfSU5QVVRfUExBWV9TVEFURV9QQVVTRUQpOwotICAgICAgICAgICAg
Ci0gICAgICAgICAgICBpZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfTE9PUF9USU1FUl9GSVJFRCkg
ewotICAgICAgICAgICAgICAgIEFTU0VSVChwYXJhbSA+PSAwKTsKLSAgICAgICAgICAgICAgICAv
LyBMb29wIHRpbWVyIGZpcmVkLCBsb29wIGFnYWluIG9yIGVuZC4KLSAgICAgICAgICAgICAgICBv
bkFuaW1hdGlvbkl0ZXJhdGlvbihwYXJhbSk7Ci0gICAgICAgICAgICAgICAgcHJpbWVFdmVudFRp
bWVycygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAg
ICAgLy8gV2UgYXJlIHBhdXNpbmcgd2hpbGUgcnVubmluZy4gQ2FuY2VsIHRoZSBhbmltYXRpb24g
YW5kIHdhaXQKLSAgICAgICAgICAgICAgICBtX3BhdXNlVGltZSA9IGN1cnJlbnRUaW1lKCk7Ci0g
ICAgICAgICAgICAgICAgY2FuY2VsVGltZXJzKCk7Ci0gICAgICAgICAgICAgICAgZW5kQW5pbWF0
aW9uKGZhbHNlKTsKLSAgICAgICAgICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX1BBVVNFRF9S
VU47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVEFU
RV9FTkRJTkc6Ci0gICAgICAgICAgICBBU1NFUlQoaW5wdXQgPT0gU1RBVEVfSU5QVVRfRU5EX1RJ
TUVSX0ZJUkVEIHx8IGlucHV0ID09IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUEFVU0VEKTsKLSAg
ICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGlucHV0ID09IFNUQVRFX0lOUFVUX0VORF9USU1F
Ul9GSVJFRCkgewotICAgICAgICAgICAgICAgIEFTU0VSVChwYXJhbSA+PSAwKTsKLSAgICAgICAg
ICAgICAgICAvLyBFbmQgdGltZXIgZmlyZWQsIGZpbmlzaCB1cAotICAgICAgICAgICAgICAgIG9u
QW5pbWF0aW9uRW5kKHBhcmFtKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBy
ZXN1bWVPdmVycmlkZGVuQW5pbWF0aW9ucygpOwotICAgICAgICAgICAgICAgIAotICAgICAgICAg
ICAgICAgIC8vIEZpcmUgb2ZmIGFub3RoZXIgc3R5bGUgY2hhbmdlIHNvIHdlIGNhbiBzZXQgdGhl
IGZpbmFsIHZhbHVlCi0gICAgICAgICAgICAgICAgc2V0Q2hhbmdlZChtX29iamVjdC0+ZWxlbWVu
dCgpKTsKLSAgICAgICAgICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX0RPTkU7Ci0gICAgICAg
ICAgICAgICAgbV9vYmplY3QtPmFuaW1hdGlvbigpLT5zdGFydFVwZGF0ZVJlbmRlcmluZ0Rpc3Bh
dGNoZXIoKTsKLSAgICAgICAgICAgICAgICAvLyB8dGhpc3wgbWF5IGJlIGRlbGV0ZWQgaGVyZSB3
aGVuIHdlJ3ZlIGJlZW4gY2FsbGVkIGZyb20gdGltZXJGaXJlZCgpCi0gICAgICAgICAgICB9Ci0g
ICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBhcmUgcGF1c2luZyB3aGls
ZSBydW5uaW5nLiBDYW5jZWwgdGhlIGFuaW1hdGlvbiBhbmQgd2FpdAotICAgICAgICAgICAgICAg
IG1fcGF1c2VUaW1lID0gY3VycmVudFRpbWUoKTsKLSAgICAgICAgICAgICAgICBjYW5jZWxUaW1l
cnMoKTsKLSAgICAgICAgICAgICAgICBlbmRBbmltYXRpb24oZmFsc2UpOwotICAgICAgICAgICAg
ICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfUEFVU0VEX1JVTjsKLSAgICAgICAgICAgIH0KLSAgICAg
ICAgICAgIC8vIHx0aGlzfCBtYXkgYmUgZGVsZXRlZCBoZXJlCi0gICAgICAgICAgICBicmVhazsK
LSAgICAgICAgY2FzZSBTVEFURV9QQVVTRURfV0FJVF9USU1FUjoKLSAgICAgICAgICAgIEFTU0VS
VChpbnB1dCA9PSBTVEFURV9JTlBVVF9QTEFZX1NUQVRFX1JVTk5JTkcpOwotICAgICAgICAgICAg
QVNTRVJUKCFydW5uaW5nKCkpOwotICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB0aW1lcwotICAg
ICAgICAgICAgbV9zdGFydFRpbWUgKz0gY3VycmVudFRpbWUoKSAtIG1fcGF1c2VUaW1lOwotICAg
ICAgICAgICAgbV9wYXVzZVRpbWUgPSAtMTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8g
d2Ugd2VyZSB3YWl0aW5nIGZvciB0aGUgc3RhcnQgdGltZXIgdG8gZmlyZSwgZ28gYmFjayBhbmQg
d2FpdCBhZ2FpbgotICAgICAgICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9ORVc7Ci0gICAgICAg
ICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUoU1RBVEVfSU5QVVRfU1RBUlRfQU5JTUFUSU9OLCAwKTsK
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRF9XQUlUX1JFU1BP
TlNFOgotICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRF9SVU46Ci0gICAgICAgICAgICAvLyBXZSB0
cmVhdCB0aGVzZSB0d28gY2FzZXMgdGhlIHNhbWUuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhh
dCwgd2hlbiB3ZSBhcmUgaW4gdGhlIFdBSVRfUkVTUE9OU0UKLSAgICAgICAgICAgIC8vIHN0YXRl
LCB3ZSBkb24ndCB5ZXQgaGF2ZSBhIHZhbGlkIHN0YXJ0VGltZSwgc28gd2Ugc2VuZCAwIHRvIHN0
YXJ0QW5pbWF0aW9uLiBXaGVuIHRoZSBTVEFSVF9USU1FCi0gICAgICAgICAgICAvLyBldmVudCBj
b21lcyBpbiBxbmQgd2Ugd2VyZSBpbiB0aGUgUlVOIHN0YXRlLCB3ZSB3aWxsIG5vdGljZSB0aGF0
IHdlIGhhdmUgYWxyZWFkeSBzZXQgdGhlIAotICAgICAgICAgICAgLy8gc3RhcnRUaW1lIGFuZCB3
aWxsIGlnbm9yZSBpdC4KLSAgICAgICAgICAgIEFTU0VSVChpbnB1dCA9PSBTVEFURV9JTlBVVF9Q
TEFZX1NUQVRFX1JVTk5JTkcpOwotICAgICAgICAgICAgQVNTRVJUKCFydW5uaW5nKCkpOwotICAg
ICAgICAgICAgLy8gVXBkYXRlIHRoZSB0aW1lcwotICAgICAgICAgICAgaWYgKG1fYW5pbVN0YXRl
ID09IFNUQVRFX1BBVVNFRF9SVU4pCi0gICAgICAgICAgICAgICAgbV9zdGFydFRpbWUgKz0gY3Vy
cmVudFRpbWUoKSAtIG1fcGF1c2VUaW1lOwotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAg
ICAgIG1fc3RhcnRUaW1lID0gMDsKLSAgICAgICAgICAgIG1fcGF1c2VUaW1lID0gLTE7Ci0gICAg
ICAgICAgICAKLSAgICAgICAgICAgIC8vIFdlIHdlcmUgd2FpdGluZyBmb3IgYSBiZWdpbiB0aW1l
IHJlc3BvbnNlIGZyb20gdGhlIGFuaW1hdGlvbiwgZ28gYmFjayBhbmQgd2FpdCBhZ2FpbgotICAg
ICAgICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9TVEFSVF9XQUlUX1JFU1BPTlNFOwotICAgICAg
ICAgICAgCi0gICAgICAgICAgICAvLyBTdGFydCB0aGUgYW5pbWF0aW9uCi0gICAgICAgICAgICBp
ZiAob3ZlcnJpZGRlbigpIHx8ICFzdGFydEFuaW1hdGlvbihtX3N0YXJ0VGltZSkpIHsKLSAgICAg
ICAgICAgICAgICAvLyBXZSdyZSBub3QgZ29pbmcgdG8gZ2V0IGEgc3RhcnRUaW1lIGNhbGxiYWNr
LCBzbyBmaXJlIHRoZSBzdGFydCB0aW1lIGhlcmUKLSAgICAgICAgICAgICAgICB1cGRhdGVTdGF0
ZU1hY2hpbmUoU1RBVEVfSU5QVVRfU1RBUlRfVElNRV9TRVQsIGN1cnJlbnRUaW1lKCkpOwotICAg
ICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIG1fd2FpdGVkRm9y
UmVzcG9uc2UgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RBVEVf
RE9ORToKLSAgICAgICAgICAgIC8vIFdlJ3JlIGRvbmUuIFN0YXkgaW4gdGhpcyBzdGF0ZSB1bnRp
bCB3ZSBhcmUgZGVsZXRlZAotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIC8vIHx0aGlz
fCBtYXkgYmUgZGVsZXRlZCBoZXJlIGlmIHdlIGNhbWUgb3V0IG9mIFNUQVRFX0VORElORyB3aGVu
IHdlJ3ZlIGJlZW4gY2FsbGVkIGZyb20gdGltZXJGaXJlZCgpCi19Ci0gICAgCi12b2lkIEFuaW1h
dGlvbkJhc2U6OmFuaW1hdGlvblRpbWVyQ2FsbGJhY2tGaXJlZChjb25zdCBBdG9taWNTdHJpbmcm
IGV2ZW50VHlwZSwgZG91YmxlIGVsYXBzZWRUaW1lKQotewotICAgIEFTU0VSVChtX29iamVjdC0+
ZG9jdW1lbnQoKSAmJiAhbV9vYmplY3QtPmRvY3VtZW50KCktPmluUGFnZUNhY2hlKCkpOwotICAg
IAotICAgIC8vIEZJWE1FOiB1c2UgYW4gZW51bQotICAgIGlmIChldmVudFR5cGUgPT0gRXZlbnRO
YW1lczo6d2Via2l0QW5pbWF0aW9uU3RhcnRFdmVudCkKLSAgICAgICAgdXBkYXRlU3RhdGVNYWNo
aW5lKFNUQVRFX0lOUFVUX1NUQVJUX1RJTUVSX0ZJUkVELCBlbGFwc2VkVGltZSk7Ci0gICAgZWxz
ZSBpZiAoZXZlbnRUeXBlID09IEV2ZW50TmFtZXM6OndlYmtpdEFuaW1hdGlvbkl0ZXJhdGlvbkV2
ZW50KQotICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUoU1RBVEVfSU5QVVRfTE9PUF9USU1FUl9G
SVJFRCwgZWxhcHNlZFRpbWUpOwotICAgIGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBFdmVudE5hbWVz
Ojp3ZWJraXRBbmltYXRpb25FbmRFdmVudCkgewotICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUo
U1RBVEVfSU5QVVRfRU5EX1RJTUVSX0ZJUkVELCBlbGFwc2VkVGltZSk7Ci0gICAgICAgIC8vIHx0
aGlzfCBtYXkgYmUgZGVsZXRlZCBoZXJlCi0gICAgfQotfQotCi12b2lkIEFuaW1hdGlvbkJhc2U6
OmFuaW1hdGlvbkV2ZW50RGlzcGF0Y2hlckZpcmVkKEVsZW1lbnQqIGVsZW1lbnQsIGNvbnN0IEF0
b21pY1N0cmluZyYgbmFtZSwgaW50IHByb3BlcnR5LAotICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlc2V0LCBjb25zdCBBdG9taWNTdHJpbmcm
IGV2ZW50VHlwZSwgZG91YmxlIGVsYXBzZWRUaW1lKQotewotICAgIG1fd2FpdGluZ0ZvckVuZEV2
ZW50ID0gZmFsc2U7Ci0gICAgCi0gICAgLy8gS2VlcCBhbiBhdG9taWMgc3RyaW5nIG9uIHRoZSBz
dGFjayB0byBrZWVwIGl0IGFsaXZlIHVudGlsIHdlIGV4aXQgdGhpcyBtZXRob2QKLSAgICAvLyAo
c2luY2UgZGlzcGF0Y2hpbmcgdGhlIGV2ZW50IG1heSBjYXVzZSB8dGhpc3wgdG8gYmUgZGVsZXRl
ZCwgdGhlcmVmb3JlIHJlbW92aW5nCi0gICAgLy8gdGhlIGxhc3QgcmVmIHRvIHRoZSBhdG9taWMg
c3RyaW5nKS4KLSAgICBBdG9taWNTdHJpbmcgYW5pbU5hbWUobmFtZSk7Ci0gICAgQXRvbWljU3Ry
aW5nIGFuaW1FdmVudFR5cGUoZXZlbnRUeXBlKTsKLSAgICAvLyBNYWtlIHN1cmUgdGhlIGVsZW1l
bnQgc3RpY2tzIGFyb3VuZCB0b28KLSAgICBSZWZQdHI8RWxlbWVudD4gZWxlbWVudFJldGFpbmVy
KGVsZW1lbnQpOwotICAgIAotICAgIEFTU0VSVCghZWxlbWVudCB8fCAoZWxlbWVudC0+ZG9jdW1l
bnQoKSAmJiAhZWxlbWVudC0+ZG9jdW1lbnQoKS0+aW5QYWdlQ2FjaGUoKSkpOwotICAgIGlmICgh
ZWxlbWVudCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgaWYgKGV2ZW50VHlwZSA9PSBFdmVudE5h
bWVzOjp3ZWJraXRUcmFuc2l0aW9uRW5kRXZlbnQpCi0gICAgICAgIGVsZW1lbnQtPmRpc3BhdGNo
V2ViS2l0VHJhbnNpdGlvbkV2ZW50KGV2ZW50VHlwZSwgbmFtZSwgZWxhcHNlZFRpbWUpOwotICAg
IGVsc2UKLSAgICAgICAgZWxlbWVudC0+ZGlzcGF0Y2hXZWJLaXRBbmltYXRpb25FdmVudChldmVu
dFR5cGUsIG5hbWUsIGVsYXBzZWRUaW1lKTsKLQotICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFs
ICh1bmFuaW1hdGVkKSBzdHlsZQotICAgIGlmIChhbmltRXZlbnRUeXBlID09IEV2ZW50TmFtZXM6
OndlYmtpdEFuaW1hdGlvbkVuZEV2ZW50KQotICAgICAgICBpZiAoZWxlbWVudC0+cmVuZGVyZXIo
KSkKLSAgICAgICAgICAgIHNldENoYW5nZWQoZWxlbWVudC0+cmVuZGVyZXIoKS0+ZWxlbWVudCgp
KTsKLX0KLQotdm9pZCBBbmltYXRpb25CYXNlOjp1cGRhdGVQbGF5U3RhdGUoYm9vbCBydW4pCi17
Ci0gICAgaWYgKHBhdXNlZCgpID09IHJ1biB8fCBpc25ldygpKQotICAgICAgICB1cGRhdGVTdGF0
ZU1hY2hpbmUocnVuID8gU1RBVEVfSU5QVVRfUExBWV9TVEFURV9SVU5OSU5HIDogU1RBVEVfSU5Q
VVRfUExBWV9TVEFURV9QQVVTRUQsIC0xKTsKLX0KLQotZG91YmxlIEFuaW1hdGlvbkJhc2U6OnBy
b2dyZXNzKGRvdWJsZSBzY2FsZSwgZG91YmxlIG9mZnNldCkgY29uc3QKLXsKLSAgICBpZiAocHJl
YWN0aXZlKCkpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIGRvdWJsZSBlbGFwc2VkVGlt
ZSA9IHJ1bm5pbmcoKSA/IChjdXJyZW50VGltZSgpIC0gbV9zdGFydFRpbWUpIDogKG1fcGF1c2VU
aW1lIC0gbV9zdGFydFRpbWUpOwotICAgIGlmIChydW5uaW5nKCkgJiYgZWxhcHNlZFRpbWUgPCAw
KQotICAgICAgICByZXR1cm4gMDsKLSAgICAKLSAgICBkb3VibGUgZHVyID0gbV9hbmltYXRpb24t
PmR1cmF0aW9uKCk7Ci0gICAgaWYgKG1fYW5pbWF0aW9uLT5pdGVyYXRpb25Db3VudCgpID4gMCkK
LSAgICAgICAgZHVyICo9IG1fYW5pbWF0aW9uLT5pdGVyYXRpb25Db3VudCgpOwotICAgIAotICAg
IGlmIChwb3N0YWN0aXZlKCkgfHwgIW1fYW5pbWF0aW9uLT5kdXJhdGlvbigpIHx8IChtX2FuaW1h
dGlvbi0+aXRlcmF0aW9uQ291bnQoKSA+IDAgJiYgZWxhcHNlZFRpbWUgPj0gZHVyKSkKLSAgICAg
ICAgcmV0dXJuIDEuMDsKLSAgICAKLSAgICAvLyBDb21wdXRlIHRoZSBmcmFjdGlvbmFsIHRpbWUs
IHRha2luZyBpbnRvIGFjY291bnQgZGlyZWN0aW9uLgotICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQg
dG8gd29ycnkgYWJvdXQgaXRlcmF0aW9ucywgd2UgYXNzdW1lIHRoYXQgd2Ugd291bGQgaGF2ZQot
ICAgIC8vIHNob3J0IGNpcmN1aXRlZCBhYm92ZSBpZiB3ZSB3ZXJlIGRvbmUKLSAgICBkb3VibGUg
ZnJhY3Rpb25hbFRpbWUgPSBlbGFwc2VkVGltZSAvIG1fYW5pbWF0aW9uLT5kdXJhdGlvbigpOwot
ICAgIGludCBpbnRlZ3JhbFRpbWUgPSAoaW50KSBmcmFjdGlvbmFsVGltZTsKLSAgICBmcmFjdGlv
bmFsVGltZSAtPSBpbnRlZ3JhbFRpbWU7Ci0gICAgCi0gICAgaWYgKG1fYW5pbWF0aW9uLT5kaXJl
Y3Rpb24oKSAmJiAoaW50ZWdyYWxUaW1lICYgMSkpCi0gICAgICAgIGZyYWN0aW9uYWxUaW1lID0g
MSAtIGZyYWN0aW9uYWxUaW1lOwotICAgIAotICAgIGlmIChzY2FsZSAhPSAxIHx8IG9mZnNldCAh
PSAwKQotICAgICAgICBmcmFjdGlvbmFsVGltZSA9IChmcmFjdGlvbmFsVGltZSAtIG9mZnNldCkg
KiBzY2FsZTsKLSAgICAKLSAgICBpZiAobV9hbmltYXRpb24tPnRpbWluZ0Z1bmN0aW9uKCkudHlw
ZSgpID09IExpbmVhclRpbWluZ0Z1bmN0aW9uKQotICAgICAgICByZXR1cm4gZnJhY3Rpb25hbFRp
bWU7Ci0gICAgCi0gICAgLy8gQ3ViaWMgYmV6aWVyLgotICAgIGRvdWJsZSByZXN1bHQgPSBzb2x2
ZUN1YmljQmV6aWVyRnVuY3Rpb24obV9hbmltYXRpb24tPnRpbWluZ0Z1bmN0aW9uKCkueDEoKSwK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hbmltYXRpb24t
PnRpbWluZ0Z1bmN0aW9uKCkueTEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbV9hbmltYXRpb24tPnRpbWluZ0Z1bmN0aW9uKCkueDIoKSwKLSAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hbmltYXRpb24tPnRpbWluZ0Z1
bmN0aW9uKCkueTIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgZnJhY3Rpb25hbFRpbWUsIG1fYW5pbWF0aW9uLT5kdXJhdGlvbigpKTsKLSAgICByZXR1cm4g
cmVzdWx0OwotfQotCi12b2lkIEFuaW1hdGlvbkJhc2U6OnByaW1lRXZlbnRUaW1lcnMoKQotewot
ICAgIC8vIERlY2lkZSB3aGVuIHRoZSBlbmQgb3IgbG9vcCBldmVudCBuZWVkcyB0byBmaXJlCi0g
ICAgZG91YmxlIGN0ID0gY3VycmVudFRpbWUoKTsKLSAgICBjb25zdCBkb3VibGUgZWxhcHNlZER1
cmF0aW9uID0gY3QgLSBtX3N0YXJ0VGltZTsKLSAgICBBU1NFUlQoZWxhcHNlZER1cmF0aW9uID49
IDApOwotICAgIAotICAgIGRvdWJsZSB0b3RhbER1cmF0aW9uID0gLTE7Ci0gICAgaWYgKG1fYW5p
bWF0aW9uLT5pdGVyYXRpb25Db3VudCgpID4gMCkKLSAgICAgICAgdG90YWxEdXJhdGlvbiA9IG1f
YW5pbWF0aW9uLT5kdXJhdGlvbigpICogbV9hbmltYXRpb24tPml0ZXJhdGlvbkNvdW50KCk7Ci0K
LSAgICBkb3VibGUgZHVyYXRpb25MZWZ0ID0gMDsKLSAgICBkb3VibGUgbmV4dEl0ZXJhdGlvblRp
bWUgPSB0b3RhbER1cmF0aW9uOwotICAgIGlmICh0b3RhbER1cmF0aW9uIDwgMCB8fCBlbGFwc2Vk
RHVyYXRpb24gPCB0b3RhbER1cmF0aW9uKSB7Ci0gICAgICAgIGR1cmF0aW9uTGVmdCA9IG1fYW5p
bWF0aW9uLT5kdXJhdGlvbigpIC0gZm1vZChlbGFwc2VkRHVyYXRpb24sIG1fYW5pbWF0aW9uLT5k
dXJhdGlvbigpKTsKLSAgICAgICAgbmV4dEl0ZXJhdGlvblRpbWUgPSBlbGFwc2VkRHVyYXRpb24g
KyBkdXJhdGlvbkxlZnQ7Ci0gICAgfQotICAgIAotICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIG1h
eSBoYXZlIDAgZHVyYXRpb25MZWZ0LCBpZiB3ZSd2ZSBnb3R0ZW4gdGhlIGV2ZW50IGxhdGUgYW5k
IHdlIGFyZSBhbHJlYWR5Ci0gICAgLy8gcGFzdCB0b3RhbER1cmF0aW9uLiBJbiB0aGlzIGNhc2Ug
d2Ugc3RpbGwgZmlyZSBhbiBlbmQgdGltZXIgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIGVuZC4gCi0g
ICAgLy8gVGhpcyBkZWZlcnMgdGhlIGNhbGwgdG8gc2VuZEFuaW1hdGlvbkV2ZW50cyB0byBhdm9p
ZCByZS1lbnRyYW50IGNhbGxzIHRoYXQgZGVzdHJveQotICAgIC8vIHRoZSBSZW5kZXJPYmplY3Qs
IGFuZCB0aGVyZWZvcmUgfHRoaXN8IGJlZm9yZSB3ZSdyZSBkb25lIHdpdGggaXQuCi0gICAgaWYg
KHRvdGFsRHVyYXRpb24gPCAwIHx8IG5leHRJdGVyYXRpb25UaW1lIDwgdG90YWxEdXJhdGlvbikg
ewotICAgICAgICAvLyBXZSBhcmUgbm90IGF0IHRoZSBlbmQgeWV0LCBzZW5kIGEgbG9vcCBldmVu
dAotICAgICAgICBBU1NFUlQobmV4dEl0ZXJhdGlvblRpbWUgPiAwKTsKLSAgICAgICAgbV9hbmlt
U3RhdGUgPSBTVEFURV9MT09QSU5HOwotICAgICAgICBtX2FuaW1hdGlvblRpbWVyQ2FsbGJhY2su
c3RhcnRUaW1lcihkdXJhdGlvbkxlZnQsIEV2ZW50TmFtZXM6OndlYmtpdEFuaW1hdGlvbkl0ZXJh
dGlvbkV2ZW50LCBuZXh0SXRlcmF0aW9uVGltZSk7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAg
ICAvLyBXZSBhcmUgYXQgdGhlIGVuZCwgc2VuZCBhbiBlbmQgZXZlbnQKLSAgICAgICAgbV9hbmlt
U3RhdGUgPSBTVEFURV9FTkRJTkc7Ci0gICAgICAgIG1fYW5pbWF0aW9uVGltZXJDYWxsYmFjay5z
dGFydFRpbWVyKGR1cmF0aW9uTGVmdCwgRXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uRW5kRXZl
bnQsIG5leHRJdGVyYXRpb25UaW1lKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGJs
ZW5kRnVuYyhpbnQgZnJvbSwgaW50IHRvLCBkb3VibGUgcHJvZ3Jlc3MpCi17ICAKLSAgICByZXR1
cm4gaW50KGZyb20gKyAodG8gLSBmcm9tKSAqIHByb2dyZXNzKTsKLX0KLQotc3RhdGljIGlubGlu
ZSBkb3VibGUgYmxlbmRGdW5jKGRvdWJsZSBmcm9tLCBkb3VibGUgdG8sIGRvdWJsZSBwcm9ncmVz
cykKLXsgIAotICAgIHJldHVybiBmcm9tICsgKHRvIC0gZnJvbSkgKiBwcm9ncmVzczsKLX0KLQot
c3RhdGljIGlubGluZSBmbG9hdCBibGVuZEZ1bmMoZmxvYXQgZnJvbSwgZmxvYXQgdG8sIGRvdWJs
ZSBwcm9ncmVzcykKLXsgIAotICAgIHJldHVybiBuYXJyb3dQcmVjaXNpb25Ub0Zsb2F0KGZyb20g
KyAodG8gLSBmcm9tKSAqIHByb2dyZXNzKTsKLX0KLQotc3RhdGljIGlubGluZSBDb2xvciBibGVu
ZEZ1bmMoY29uc3QgQ29sb3ImIGZyb20sIGNvbnN0IENvbG9yJiB0bywgZG91YmxlIHByb2dyZXNz
KQoteyAgCi0gICAgcmV0dXJuIENvbG9yKGJsZW5kRnVuYyhmcm9tLnJlZCgpLCB0by5yZWQoKSwg
cHJvZ3Jlc3MpLAotICAgICAgICAgICAgICAgICBibGVuZEZ1bmMoZnJvbS5ncmVlbigpLCB0by5n
cmVlbigpLCBwcm9ncmVzcyksCi0gICAgICAgICAgICAgICAgIGJsZW5kRnVuYyhmcm9tLmJsdWUo
KSwgdG8uYmx1ZSgpLCBwcm9ncmVzcyksCi0gICAgICAgICAgICAgICAgIGJsZW5kRnVuYyhmcm9t
LmFscGhhKCksIHRvLmFscGhhKCksIHByb2dyZXNzKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgTGVu
Z3RoIGJsZW5kRnVuYyhjb25zdCBMZW5ndGgmIGZyb20sIGNvbnN0IExlbmd0aCYgdG8sIGRvdWJs
ZSBwcm9ncmVzcykKLXsgIAotICAgIHJldHVybiB0by5ibGVuZChmcm9tLCBwcm9ncmVzcyk7Ci19
Ci0KLXN0YXRpYyBpbmxpbmUgSW50U2l6ZSBibGVuZEZ1bmMoY29uc3QgSW50U2l6ZSYgZnJvbSwg
Y29uc3QgSW50U2l6ZSYgdG8sIGRvdWJsZSBwcm9ncmVzcykKLXsgIAotICAgIHJldHVybiBJbnRT
aXplKGJsZW5kRnVuYyhmcm9tLndpZHRoKCksIHRvLndpZHRoKCksIHByb2dyZXNzKSwKLSAgICAg
ICAgICAgICAgICAgICBibGVuZEZ1bmMoZnJvbS5oZWlnaHQoKSwgdG8uaGVpZ2h0KCksIHByb2dy
ZXNzKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgU2hhZG93RGF0YSogYmxlbmRGdW5jKGNvbnN0IFNo
YWRvd0RhdGEqIGZyb20sIGNvbnN0IFNoYWRvd0RhdGEqIHRvLCBkb3VibGUgcHJvZ3Jlc3MpCi17
ICAKLSAgICBBU1NFUlQoZnJvbSAmJiB0byk7Ci0gICAgcmV0dXJuIG5ldyBTaGFkb3dEYXRhKGJs
ZW5kRnVuYyhmcm9tLT54LCB0by0+eCwgcHJvZ3Jlc3MpLCBibGVuZEZ1bmMoZnJvbS0+eSwgdG8t
PnksIHByb2dyZXNzKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGJsZW5kRnVuYyhmcm9t
LT5ibHVyLCB0by0+Ymx1ciwgcHJvZ3Jlc3MpLCBibGVuZEZ1bmMoZnJvbS0+Y29sb3IsIHRvLT5j
b2xvciwgcHJvZ3Jlc3MpKTsKLX0KLQotc3RhdGljIGlubGluZSBUcmFuc2Zvcm1PcGVyYXRpb25z
IGJsZW5kRnVuYyhjb25zdCBUcmFuc2Zvcm1PcGVyYXRpb25zJiBmcm9tLCBjb25zdCBUcmFuc2Zv
cm1PcGVyYXRpb25zJiB0bywgZG91YmxlIHByb2dyZXNzKQoteyAgICAKLSAgICAvLyBCbGVuZCBh
bnkgb3BlcmF0aW9ucyB3aG9zZSB0eXBlcyBhY3R1YWxseSBtYXRjaCB1cC4gIE90aGVyd2lzZSBk
b24ndCBib3RoZXIuCi0gICAgdW5zaWduZWQgZnJvbVNpemUgPSBmcm9tLnNpemUoKTsKLSAgICB1
bnNpZ25lZCB0b1NpemUgPSB0by5zaXplKCk7Ci0gICAgdW5zaWduZWQgc2l6ZSA9IG1heChmcm9t
U2l6ZSwgdG9TaXplKTsKLSAgICBUcmFuc2Zvcm1PcGVyYXRpb25zIHJlc3VsdDsKLSAgICBmb3Ig
KHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIFJlZlB0cjxUcmFuc2Zv
cm1PcGVyYXRpb24+IGZyb21PcCA9IGkgPCBmcm9tU2l6ZSA/IGZyb21baV0gOiAwOwotICAgICAg
ICBSZWZQdHI8VHJhbnNmb3JtT3BlcmF0aW9uPiB0b09wID0gaSA8IHRvU2l6ZSA/IHRvW2ldIDog
MDsKLSAgICAgICAgUmVmUHRyPFRyYW5zZm9ybU9wZXJhdGlvbj4gYmxlbmRlZE9wID0gdG9PcCA/
IHRvT3AtPmJsZW5kKGZyb21PcC5nZXQoKSwgcHJvZ3Jlc3MpIDogZnJvbU9wLT5ibGVuZCgwLCBw
cm9ncmVzcywgdHJ1ZSk7Ci0gICAgICAgIGlmIChibGVuZGVkT3ApCi0gICAgICAgICAgICByZXN1
bHQuYXBwZW5kKGJsZW5kZWRPcCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0
YXRpYyBpbmxpbmUgRVZpc2liaWxpdHkgYmxlbmRGdW5jKEVWaXNpYmlsaXR5IGZyb20sIEVWaXNp
YmlsaXR5IHRvLCBkb3VibGUgcHJvZ3Jlc3MpCi17Ci0gICAgLy8gQW55IG5vbi16ZXJvIHJlc3Vs
dCBtZWFucyB3ZSBjb25zaWRlciB0aGUgb2JqZWN0IHRvIGJlIHZpc2libGUuICBPbmx5IGF0IDAg
ZG8gd2UgY29uc2lkZXIgdGhlIG9iamVjdCB0byBiZQotICAgIC8vIGludmlzaWJsZS4gICBUaGUg
aW52aXNpYmxlIHZhbHVlIHdlIHVzZSAoSElEREVOIHZzLiBDT0xMQVBTRSkgZGVwZW5kcyBvbiB0
aGUgc3BlY2lmaWVkIGZyb20vdG8gdmFsdWVzLgotICAgIGRvdWJsZSBmcm9tVmFsID0gZnJvbSA9
PSBWSVNJQkxFID8gMS4gOiAwLjsKLSAgICBkb3VibGUgdG9WYWwgPSB0byA9PSBWSVNJQkxFID8g
MS4gOiAwLjsKLSAgICBpZiAoZnJvbVZhbCA9PSB0b1ZhbCkKLSAgICAgICAgcmV0dXJuIHRvOwot
ICAgIGRvdWJsZSByZXN1bHQgPSBibGVuZEZ1bmMoZnJvbVZhbCwgdG9WYWwsIHByb2dyZXNzKTsK
LSAgICByZXR1cm4gcmVzdWx0ID4gMC4gPyBWSVNJQkxFIDogKHRvICE9IFZJU0lCTEUgPyB0byA6
IGZyb20pOwotfQotCi1jbGFzcyBQcm9wZXJ0eVdyYXBwZXJCYXNlIHsKLXB1YmxpYzoKLSAgICBQ
cm9wZXJ0eVdyYXBwZXJCYXNlKGludCBwcm9wKQotICAgIDogbV9wcm9wKHByb3ApCi0gICAgeyB9
Ci0gICAgdmlydHVhbCB+UHJvcGVydHlXcmFwcGVyQmFzZSgpIHsgfQotICAgIHZpcnR1YWwgYm9v
bCBlcXVhbHMoY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJlbmRlclN0eWxlKiBiKSBjb25z
dD0wOwotICAgIHZpcnR1YWwgdm9pZCBibGVuZChSZW5kZXJTdHlsZSogZHN0LCBjb25zdCBSZW5k
ZXJTdHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUqIGIsIGRvdWJsZSBwcm9nKSBjb25zdD0wOwot
ICAgIAotICAgIGludCBwcm9wZXJ0eSgpIGNvbnN0IHsgcmV0dXJuIG1fcHJvcDsgfQotICAgIAot
cHJpdmF0ZToKLSAgICBpbnQgbV9wcm9wOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1j
bGFzcyBQcm9wZXJ0eVdyYXBwZXJHZXR0ZXIgOiBwdWJsaWMgUHJvcGVydHlXcmFwcGVyQmFzZSB7
Ci1wdWJsaWM6Ci0gICAgUHJvcGVydHlXcmFwcGVyR2V0dGVyKGludCBwcm9wLCBUIChSZW5kZXJT
dHlsZTo6KmdldHRlcikoKSBjb25zdCkKLSAgICA6IFByb3BlcnR5V3JhcHBlckJhc2UocHJvcCkK
LSAgICAsIG1fZ2V0dGVyKGdldHRlcikKLSAgICB7IH0KLSAgICAKLSAgICB2aXJ0dWFsIGJvb2wg
ZXF1YWxzKGNvbnN0IFJlbmRlclN0eWxlKiBhLCBjb25zdCBSZW5kZXJTdHlsZSogYikgY29uc3QK
LSAgICB7Ci0gICAgICAgIHJldHVybiAoYS0+Km1fZ2V0dGVyKSgpID09IChiLT4qbV9nZXR0ZXIp
KCk7Ci0gICAgfQotICAgIAotcHJvdGVjdGVkOgotICAgIFQgKFJlbmRlclN0eWxlOjoqbV9nZXR0
ZXIpKCkgY29uc3Q7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFByb3BlcnR5
V3JhcHBlciA6IHB1YmxpYyBQcm9wZXJ0eVdyYXBwZXJHZXR0ZXI8VD4gewotcHVibGljOgotICAg
IFByb3BlcnR5V3JhcHBlcihpbnQgcHJvcCwgVCAoUmVuZGVyU3R5bGU6OipnZXR0ZXIpKCkgY29u
c3QsIHZvaWQgKFJlbmRlclN0eWxlOjoqc2V0dGVyKShUKSkKLSAgICA6IFByb3BlcnR5V3JhcHBl
ckdldHRlcjxUPihwcm9wLCBnZXR0ZXIpCi0gICAgLCBtX3NldHRlcihzZXR0ZXIpCi0gICAgeyB9
Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkIGJsZW5kKFJlbmRlclN0eWxlKiBkc3QsIGNvbnN0IFJl
bmRlclN0eWxlKiBhLCBjb25zdCBSZW5kZXJTdHlsZSogYiwgZG91YmxlIHByb2cpIGNvbnN0Ci0g
ICAgewotICAgICAgICAoZHN0LT4qbV9zZXR0ZXIpKGJsZW5kRnVuYygoYS0+KlByb3BlcnR5V3Jh
cHBlckdldHRlcjxUPjo6bV9nZXR0ZXIpKCksIChiLT4qUHJvcGVydHlXcmFwcGVyR2V0dGVyPFQ+
OjptX2dldHRlcikoKSwgcHJvZykpOwotICAgIH0KLSAgICAKLXByb3RlY3RlZDoKLSAgICB2b2lk
IChSZW5kZXJTdHlsZTo6Km1fc2V0dGVyKShUKTsKLX07Ci0KLWNsYXNzIFByb3BlcnR5V3JhcHBl
clNoYWRvdyA6IHB1YmxpYyBQcm9wZXJ0eVdyYXBwZXJHZXR0ZXI8U2hhZG93RGF0YSo+IHsKLXB1
YmxpYzoKLSAgICBQcm9wZXJ0eVdyYXBwZXJTaGFkb3coaW50IHByb3AsIFNoYWRvd0RhdGEqIChS
ZW5kZXJTdHlsZTo6KmdldHRlcikoKSBjb25zdCwgdm9pZCAoUmVuZGVyU3R5bGU6OipzZXR0ZXIp
KFNoYWRvd0RhdGEqLCBib29sKSkKLSAgICA6IFByb3BlcnR5V3JhcHBlckdldHRlcjxTaGFkb3dE
YXRhKj4ocHJvcCwgZ2V0dGVyKQotICAgICwgbV9zZXR0ZXIoc2V0dGVyKQotICAgIHsgfQotICAg
IAotICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJl
bmRlclN0eWxlKiBiKSBjb25zdAotICAgIHsKLSAgICAgICAgU2hhZG93RGF0YSogc2hhZG93YSA9
IChhLT4qbV9nZXR0ZXIpKCk7Ci0gICAgICAgIFNoYWRvd0RhdGEqIHNoYWRvd2IgPSAoYi0+Km1f
Z2V0dGVyKSgpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFzaGFkb3dhICYmIHNoYWRvd2IgfHwg
c2hhZG93YSAmJiAhc2hhZG93YikKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAg
aWYgKHNoYWRvd2EgJiYgc2hhZG93YiAmJiAoKnNoYWRvd2EgIT0gKnNoYWRvd2IpKQotICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0g
ICAgdmlydHVhbCB2b2lkIGJsZW5kKFJlbmRlclN0eWxlKiBkc3QsIGNvbnN0IFJlbmRlclN0eWxl
KiBhLCBjb25zdCBSZW5kZXJTdHlsZSogYiwgZG91YmxlIHByb2cpIGNvbnN0Ci0gICAgewotICAg
ICAgICBTaGFkb3dEYXRhKiBzaGFkb3dhID0gKGEtPiptX2dldHRlcikoKTsKLSAgICAgICAgU2hh
ZG93RGF0YSogc2hhZG93YiA9IChiLT4qbV9nZXR0ZXIpKCk7Ci0gICAgICAgIFNoYWRvd0RhdGEg
ZGVmYXVsdFNoYWRvd0RhdGEoMCwgMCwgMCwgQ29sb3I6OnRyYW5zcGFyZW50KTsKLSAgICAgICAg
Ci0gICAgICAgIGlmICghc2hhZG93YSkKLSAgICAgICAgICAgIHNoYWRvd2EgPSAmZGVmYXVsdFNo
YWRvd0RhdGE7Ci0gICAgICAgIGlmICghc2hhZG93YikKLSAgICAgICAgICAgIHNoYWRvd2IgPSAm
ZGVmYXVsdFNoYWRvd0RhdGE7Ci0gICAgICAgIAotICAgICAgICAoZHN0LT4qbV9zZXR0ZXIpKGJs
ZW5kRnVuYyhzaGFkb3dhLCBzaGFkb3diLCBwcm9nKSwgZmFsc2UpOwotICAgIH0KLSAgICAKLXBy
aXZhdGU6Ci0gICAgdm9pZCAoUmVuZGVyU3R5bGU6OiptX3NldHRlcikoU2hhZG93RGF0YSosIGJv
b2wpOwotfTsKLQotY2xhc3MgUHJvcGVydHlXcmFwcGVyTWF5YmVJbnZhbGlkQ29sb3IgOiBwdWJs
aWMgUHJvcGVydHlXcmFwcGVyQmFzZSB7Ci1wdWJsaWM6Ci0gICAgUHJvcGVydHlXcmFwcGVyTWF5
YmVJbnZhbGlkQ29sb3IoaW50IHByb3AsIGNvbnN0IENvbG9yJiAoUmVuZGVyU3R5bGU6OipnZXR0
ZXIpKCkgY29uc3QsIHZvaWQgKFJlbmRlclN0eWxlOjoqc2V0dGVyKShjb25zdCBDb2xvciYpKQot
ICAgIDogUHJvcGVydHlXcmFwcGVyQmFzZShwcm9wKQotICAgICwgbV9nZXR0ZXIoZ2V0dGVyKQot
ICAgICwgbV9zZXR0ZXIoc2V0dGVyKQotICAgIHsgfQotICAgIAotICAgIHZpcnR1YWwgYm9vbCBl
cXVhbHMoY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJlbmRlclN0eWxlKiBiKSBjb25zdAot
ICAgIHsKLSAgICAgICAgQ29sb3IgZnJvbUNvbG9yID0gKGEtPiptX2dldHRlcikoKTsKLSAgICAg
ICAgQ29sb3IgdG9Db2xvciA9IChiLT4qbV9nZXR0ZXIpKCk7Ci0gICAgICAgIGlmICghZnJvbUNv
bG9yLmlzVmFsaWQoKSkKLSAgICAgICAgICAgIGZyb21Db2xvciA9IGEtPmNvbG9yKCk7Ci0gICAg
ICAgIGlmICghdG9Db2xvci5pc1ZhbGlkKCkpCi0gICAgICAgICAgICB0b0NvbG9yID0gYi0+Y29s
b3IoKTsKLSAgICAgICAgCi0gICAgICAgIHJldHVybiBmcm9tQ29sb3IgPT0gdG9Db2xvcjsKLSAg
ICB9Ci0gICAgCi0gICAgdmlydHVhbCB2b2lkIGJsZW5kKFJlbmRlclN0eWxlKiBkc3QsIGNvbnN0
IFJlbmRlclN0eWxlKiBhLCBjb25zdCBSZW5kZXJTdHlsZSogYiwgZG91YmxlIHByb2cpIGNvbnN0
Ci0gICAgewotICAgICAgICBDb2xvciBmcm9tQ29sb3IgPSAoYS0+Km1fZ2V0dGVyKSgpOwotICAg
ICAgICBDb2xvciB0b0NvbG9yID0gKGItPiptX2dldHRlcikoKTsKLSAgICAgICAgaWYgKCFmcm9t
Q29sb3IuaXNWYWxpZCgpKQotICAgICAgICAgICAgZnJvbUNvbG9yID0gYS0+Y29sb3IoKTsKLSAg
ICAgICAgaWYgKCF0b0NvbG9yLmlzVmFsaWQoKSkKLSAgICAgICAgICAgIHRvQ29sb3IgPSBiLT5j
b2xvcigpOwotICAgICAgICAoZHN0LT4qbV9zZXR0ZXIpKGJsZW5kRnVuYyhmcm9tQ29sb3IsIHRv
Q29sb3IsIHByb2cpKTsKLSAgICB9Ci0gICAgCi1wcml2YXRlOgotICAgIGNvbnN0IENvbG9yJiAo
UmVuZGVyU3R5bGU6OiptX2dldHRlcikoKSBjb25zdDsKLSAgICB2b2lkIChSZW5kZXJTdHlsZTo6
Km1fc2V0dGVyKShjb25zdCBDb2xvciYpOwotfTsKLQotY2xhc3MgQW5pbWF0aW9uQ29udHJvbGxl
clByaXZhdGUgewotcHVibGljOgotICAgIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlKEZyYW1l
Kik7Ci0gICAgfkFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlKCk7Ci0gICAgCi0gICAgQ29tcG9z
aXRlQW5pbWF0aW9uKiBhY2Nlc3NDb21wb3NpdGVBbmltYXRpb24oUmVuZGVyT2JqZWN0Kik7Ci0g
ICAgYm9vbCBjbGVhcihSZW5kZXJPYmplY3QqKTsKLSAgICAKLSAgICB2b2lkIGFuaW1hdGlvblRp
bWVyRmlyZWQoVGltZXI8QW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU+Kik7Ci0gICAgdm9pZCB1
cGRhdGVBbmltYXRpb25UaW1lcigpOwotICAgIAotICAgIHZvaWQgdXBkYXRlUmVuZGVyaW5nRGlz
cGF0Y2hlckZpcmVkKFRpbWVyPEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlPiopOwotICAgIHZv
aWQgc3RhcnRVcGRhdGVSZW5kZXJpbmdEaXNwYXRjaGVyKCk7Ci0gICAgCi0gICAgYm9vbCBoYXNB
bmltYXRpb25zKCkgY29uc3QgeyByZXR1cm4gIW1fY29tcG9zaXRlQW5pbWF0aW9ucy5pc0VtcHR5
KCk7IH0KLSAgICAKLSAgICB2b2lkIHN1c3BlbmRBbmltYXRpb25zKERvY3VtZW50KiBkb2N1bWVu
dCk7Ci0gICAgdm9pZCByZXN1bWVBbmltYXRpb25zKERvY3VtZW50KiBkb2N1bWVudCk7Ci0gICAg
Ci0gICAgdm9pZCBzdHlsZUF2YWlsYWJsZSgpOwotICAgIAotICAgIGJvb2wgaXNBbmltYXRpbmdQ
cm9wZXJ0eU9uUmVuZGVyZXIoUmVuZGVyT2JqZWN0KiBvYmosIGludCBwcm9wZXJ0eSwgYm9vbCBp
c1J1bm5pbmdOb3cpIGNvbnN0OwotICAgIAotICAgIHN0YXRpYyBib29sIHByb3BlcnRpZXNFcXVh
bChpbnQgcHJvcCwgY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJlbmRlclN0eWxlKiBiKTsK
LSAgICBzdGF0aWMgaW50IGdldFByb3BlcnR5QXRJbmRleChpbnQgaSk7Ci0gICAgc3RhdGljIGlu
dCBnZXROdW1Qcm9wZXJ0aWVzKCkgeyByZXR1cm4gZ1Byb3BlcnR5V3JhcHBlcnMtPnNpemUoKTsg
fQotICAgIAotICAgIC8vIFJldHVybiB0cnVlIGlmIHdlIG5lZWQgdG8gc3RhcnQgc29mdHdhcmUg
YW5pbWF0aW9uIHRpbWVycwotICAgIHN0YXRpYyBib29sIGJsZW5kUHJvcGVydGllcyhpbnQgcHJv
cCwgUmVuZGVyU3R5bGUqIGRzdCwgY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJlbmRlclN0
eWxlKiBiLCBkb3VibGUgcHJvZyk7Ci0gICAgCi0gICAgdm9pZCBzZXRXYWl0aW5nRm9yU3R5bGVB
dmFpbGFibGUoYm9vbCB3YWl0aW5nKSB7IGlmICh3YWl0aW5nKSBtX251bVN0eWxlQXZhaWxhYmxl
V2FpdGVycysrOyBlbHNlIG1fbnVtU3R5bGVBdmFpbGFibGVXYWl0ZXJzLS07IH0KLSAgICAKLXBy
aXZhdGU6Ci0gICAgc3RhdGljIHZvaWQgZW5zdXJlUHJvcGVydHlNYXAoKTsKLSAgICAKLSAgICB0
eXBlZGVmIEhhc2hNYXA8UmVuZGVyT2JqZWN0KiwgQ29tcG9zaXRlQW5pbWF0aW9uKj4gUmVuZGVy
T2JqZWN0QW5pbWF0aW9uTWFwOwotICAgIAotICAgIFJlbmRlck9iamVjdEFuaW1hdGlvbk1hcCBt
X2NvbXBvc2l0ZUFuaW1hdGlvbnM7Ci0gICAgVGltZXI8QW5pbWF0aW9uQ29udHJvbGxlclByaXZh
dGU+IG1fYW5pbWF0aW9uVGltZXI7Ci0gICAgVGltZXI8QW5pbWF0aW9uQ29udHJvbGxlclByaXZh
dGU+IG1fdXBkYXRlUmVuZGVyaW5nRGlzcGF0Y2hlcjsKLSAgICBGcmFtZSogbV9mcmFtZTsKLSAg
ICB1aW50MzJfdCBtX251bVN0eWxlQXZhaWxhYmxlV2FpdGVyczsKLSAgICAKLSAgICBzdGF0aWMg
VmVjdG9yPFByb3BlcnR5V3JhcHBlckJhc2UqPiogZ1Byb3BlcnR5V3JhcHBlcnM7Ci0gICAgc3Rh
dGljIGludCBnUHJvcGVydHlXcmFwcGVyTWFwW251bUNTU1Byb3BlcnRpZXNdOwotfTsKLQotVmVj
dG9yPFByb3BlcnR5V3JhcHBlckJhc2UqPiogQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OmdQ
cm9wZXJ0eVdyYXBwZXJzID0gMDsKLWludCBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6Z1By
b3BlcnR5V3JhcHBlck1hcFtdOwotCi1BbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6QW5pbWF0
aW9uQ29udHJvbGxlclByaXZhdGUoRnJhbWUqIGZyYW1lKQotOiBtX2FuaW1hdGlvblRpbWVyKHRo
aXMsICZBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6YW5pbWF0aW9uVGltZXJGaXJlZCkKLSwg
bV91cGRhdGVSZW5kZXJpbmdEaXNwYXRjaGVyKHRoaXMsICZBbmltYXRpb25Db250cm9sbGVyUHJp
dmF0ZTo6dXBkYXRlUmVuZGVyaW5nRGlzcGF0Y2hlckZpcmVkKQotLCBtX2ZyYW1lKGZyYW1lKQot
LCBtX251bVN0eWxlQXZhaWxhYmxlV2FpdGVycygwKQotewotICAgIGVuc3VyZVByb3BlcnR5TWFw
KCk7Ci19Ci0KLUFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjp+QW5pbWF0aW9uQ29udHJvbGxl
clByaXZhdGUoKQotewotICAgIGRlbGV0ZUFsbFZhbHVlcyhtX2NvbXBvc2l0ZUFuaW1hdGlvbnMp
OwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OmVuc3Vy
ZVByb3BlcnR5TWFwKCkKLXsKLSAgICAvLyBGSVhNRTogVGhpcyBkYXRhIGlzIG5ldmVyIGRlc3Ry
b3llZC4gTWF5YmUgd2Ugc2hvdWxkIHJlZiBjb3VudCBpdCBhbmQgdG9zcyBpdCB3aGVuIHRoZSBs
YXN0IEFuaW1hdGlvbkNvbnRyb2xsZXIgaXMgZGVzdHJveWVkPwotICAgIGlmIChnUHJvcGVydHlX
cmFwcGVycyA9PSAwKSB7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzID0gbmV3IFZlY3RvcjxQ
cm9wZXJ0eVdyYXBwZXJCYXNlKj4oKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGJ1aWxkIHRoZSBs
aXN0IG9mIHByb3BlcnR5IHdyYXBwZXJzIHRvIGRvIHRoZSBjb21wYXJpc29ucyBhbmQgYmxlbmRz
Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxM
ZW5ndGg+KENTU1Byb3BlcnR5TGVmdCwgJlJlbmRlclN0eWxlOjpsZWZ0LCAmUmVuZGVyU3R5bGU6
OnNldExlZnQpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVy
dHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlSaWdodCwgJlJlbmRlclN0eWxlOjpyaWdodCwg
JlJlbmRlclN0eWxlOjpzZXRSaWdodCkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBw
ZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eVRvcCwgJlJlbmRlclN0
eWxlOjp0b3AsICZSZW5kZXJTdHlsZTo6c2V0VG9wKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBw
ZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5Qm90dG9t
LCAmUmVuZGVyU3R5bGU6OmJvdHRvbSwgJlJlbmRlclN0eWxlOjpzZXRCb3R0b20pKTsKLSAgICAg
ICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4o
Q1NTUHJvcGVydHlXaWR0aCwgJlJlbmRlclN0eWxlOjp3aWR0aCwgJlJlbmRlclN0eWxlOjpzZXRX
aWR0aCkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdy
YXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eUhlaWdodCwgJlJlbmRlclN0eWxlOjpoZWlnaHQsICZS
ZW5kZXJTdHlsZTo6c2V0SGVpZ2h0KSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBl
bmQobmV3IFByb3BlcnR5V3JhcHBlcjx1bnNpZ25lZCBzaG9ydD4oQ1NTUHJvcGVydHlCb3JkZXJM
ZWZ0V2lkdGgsICZSZW5kZXJTdHlsZTo6Ym9yZGVyTGVmdFdpZHRoLCAmUmVuZGVyU3R5bGU6OnNl
dEJvcmRlckxlZnRXaWR0aCkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5l
dyBQcm9wZXJ0eVdyYXBwZXI8dW5zaWduZWQgc2hvcnQ+KENTU1Byb3BlcnR5Qm9yZGVyUmlnaHRX
aWR0aCwgJlJlbmRlclN0eWxlOjpib3JkZXJSaWdodFdpZHRoLCAmUmVuZGVyU3R5bGU6OnNldEJv
cmRlclJpZ2h0V2lkdGgpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcg
UHJvcGVydHlXcmFwcGVyPHVuc2lnbmVkIHNob3J0PihDU1NQcm9wZXJ0eUJvcmRlclRvcFdpZHRo
LCAmUmVuZGVyU3R5bGU6OmJvcmRlclRvcFdpZHRoLCAmUmVuZGVyU3R5bGU6OnNldEJvcmRlclRv
cFdpZHRoKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5
V3JhcHBlcjx1bnNpZ25lZCBzaG9ydD4oQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21XaWR0aCwgJlJl
bmRlclN0eWxlOjpib3JkZXJCb3R0b21XaWR0aCwgJlJlbmRlclN0eWxlOjpzZXRCb3JkZXJCb3R0
b21XaWR0aCkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0
eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eU1hcmdpbkxlZnQsICZSZW5kZXJTdHlsZTo6bWFy
Z2luTGVmdCwgJlJlbmRlclN0eWxlOjpzZXRNYXJnaW5MZWZ0KSk7Ci0gICAgICAgIGdQcm9wZXJ0
eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5
TWFyZ2luUmlnaHQsICZSZW5kZXJTdHlsZTo6bWFyZ2luUmlnaHQsICZSZW5kZXJTdHlsZTo6c2V0
TWFyZ2luUmlnaHQpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJv
cGVydHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlNYXJnaW5Ub3AsICZSZW5kZXJTdHlsZTo6
bWFyZ2luVG9wLCAmUmVuZGVyU3R5bGU6OnNldE1hcmdpblRvcCkpOwotICAgICAgICBnUHJvcGVy
dHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0
eU1hcmdpbkJvdHRvbSwgJlJlbmRlclN0eWxlOjptYXJnaW5Cb3R0b20sICZSZW5kZXJTdHlsZTo6
c2V0TWFyZ2luQm90dG9tKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3
IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5UGFkZGluZ0xlZnQsICZSZW5kZXJT
dHlsZTo6cGFkZGluZ0xlZnQsICZSZW5kZXJTdHlsZTo6c2V0UGFkZGluZ0xlZnQpKTsKLSAgICAg
ICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4o
Q1NTUHJvcGVydHlQYWRkaW5nUmlnaHQsICZSZW5kZXJTdHlsZTo6cGFkZGluZ1JpZ2h0LCAmUmVu
ZGVyU3R5bGU6OnNldFBhZGRpbmdSaWdodCkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+
YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eVBhZGRpbmdUb3As
ICZSZW5kZXJTdHlsZTo6cGFkZGluZ1RvcCwgJlJlbmRlclN0eWxlOjpzZXRQYWRkaW5nVG9wKSk7
Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxM
ZW5ndGg+KENTU1Byb3BlcnR5UGFkZGluZ0JvdHRvbSwgJlJlbmRlclN0eWxlOjpwYWRkaW5nQm90
dG9tLCAmUmVuZGVyU3R5bGU6OnNldFBhZGRpbmdCb3R0b20pKTsKLSAgICAgICAgZ1Byb3BlcnR5
V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPGZsb2F0PihDU1NQcm9wZXJ0eU9w
YWNpdHksICZSZW5kZXJTdHlsZTo6b3BhY2l0eSwgJlJlbmRlclN0eWxlOjpzZXRPcGFjaXR5KSk7
Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxj
b25zdCBDb2xvciY+KENTU1Byb3BlcnR5Q29sb3IsICZSZW5kZXJTdHlsZTo6Y29sb3IsICZSZW5k
ZXJTdHlsZTo6c2V0Q29sb3IpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChu
ZXcgUHJvcGVydHlXcmFwcGVyPGNvbnN0IENvbG9yJj4oQ1NTUHJvcGVydHlCYWNrZ3JvdW5kQ29s
b3IsICZSZW5kZXJTdHlsZTo6YmFja2dyb3VuZENvbG9yLCAmUmVuZGVyU3R5bGU6OnNldEJhY2tn
cm91bmRDb2xvcikpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9w
ZXJ0eVdyYXBwZXI8aW50PihDU1NQcm9wZXJ0eUZvbnRTaXplLCAmUmVuZGVyU3R5bGU6OmZvbnRT
aXplLCAmUmVuZGVyU3R5bGU6OnNldEJsZW5kZWRGb250U2l6ZSkpOwotICAgICAgICBnUHJvcGVy
dHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8dW5zaWduZWQgc2hvcnQ+KENT
U1Byb3BlcnR5V2Via2l0Q29sdW1uUnVsZVdpZHRoLCAmUmVuZGVyU3R5bGU6OmNvbHVtblJ1bGVX
aWR0aCwgJlJlbmRlclN0eWxlOjpzZXRDb2x1bW5SdWxlV2lkdGgpKTsKLSAgICAgICAgZ1Byb3Bl
cnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPGZsb2F0PihDU1NQcm9wZXJ0
eVdlYmtpdENvbHVtbkdhcCwgJlJlbmRlclN0eWxlOjpjb2x1bW5HYXAsICZSZW5kZXJTdHlsZTo6
c2V0Q29sdW1uR2FwKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFBy
b3BlcnR5V3JhcHBlcjx1bnNpZ25lZCBzaG9ydD4oQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5Db3Vu
dCwgJlJlbmRlclN0eWxlOjpjb2x1bW5Db3VudCwgJlJlbmRlclN0eWxlOjpzZXRDb2x1bW5Db3Vu
dCkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBw
ZXI8ZmxvYXQ+KENTU1Byb3BlcnR5V2Via2l0Q29sdW1uV2lkdGgsICZSZW5kZXJTdHlsZTo6Y29s
dW1uV2lkdGgsICZSZW5kZXJTdHlsZTo6c2V0Q29sdW1uV2lkdGgpKTsKLSAgICAgICAgZ1Byb3Bl
cnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPHNob3J0PihDU1NQcm9wZXJ0
eVdlYmtpdEJvcmRlckhvcml6b250YWxTcGFjaW5nLCAmUmVuZGVyU3R5bGU6Omhvcml6b250YWxC
b3JkZXJTcGFjaW5nLCAmUmVuZGVyU3R5bGU6OnNldEhvcml6b250YWxCb3JkZXJTcGFjaW5nKSk7
Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxz
aG9ydD4oQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJWZXJ0aWNhbFNwYWNpbmcsICZSZW5kZXJTdHls
ZTo6dmVydGljYWxCb3JkZXJTcGFjaW5nLCAmUmVuZGVyU3R5bGU6OnNldFZlcnRpY2FsQm9yZGVy
U3BhY2luZykpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0
eVdyYXBwZXI8aW50PihDU1NQcm9wZXJ0eVpJbmRleCwgJlJlbmRlclN0eWxlOjp6SW5kZXgsICZS
ZW5kZXJTdHlsZTo6c2V0WkluZGV4KSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBl
bmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5TGluZUhlaWdodCwgJlJl
bmRlclN0eWxlOjpsaW5lSGVpZ2h0LCAmUmVuZGVyU3R5bGU6OnNldExpbmVIZWlnaHQpKTsKLSAg
ICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPGludD4o
Q1NTUHJvcGVydHlPdXRsaW5lT2Zmc2V0LCAmUmVuZGVyU3R5bGU6Om91dGxpbmVPZmZzZXQsICZS
ZW5kZXJTdHlsZTo6c2V0T3V0bGluZU9mZnNldCkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVy
cy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8dW5zaWduZWQgc2hvcnQ+KENTU1Byb3BlcnR5
T3V0bGluZVdpZHRoLCAmUmVuZGVyU3R5bGU6Om91dGxpbmVXaWR0aCwgJlJlbmRlclN0eWxlOjpz
ZXRPdXRsaW5lV2lkdGgpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcg
UHJvcGVydHlXcmFwcGVyPGludD4oQ1NTUHJvcGVydHlMZXR0ZXJTcGFjaW5nLCAmUmVuZGVyU3R5
bGU6OmxldHRlclNwYWNpbmcsICZSZW5kZXJTdHlsZTo6c2V0TGV0dGVyU3BhY2luZykpOwotICAg
ICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8aW50PihD
U1NQcm9wZXJ0eVdvcmRTcGFjaW5nLCAmUmVuZGVyU3R5bGU6OndvcmRTcGFjaW5nLCAmUmVuZGVy
U3R5bGU6OnNldFdvcmRTcGFjaW5nKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBl
bmQobmV3IFByb3BlcnR5V3JhcHBlcjxjb25zdCBUcmFuc2Zvcm1PcGVyYXRpb25zJj4oQ1NTUHJv
cGVydHlXZWJraXRUcmFuc2Zvcm0sICZSZW5kZXJTdHlsZTo6dHJhbnNmb3JtLCAmUmVuZGVyU3R5
bGU6OnNldFRyYW5zZm9ybSkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5l
dyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybU9yaWdp
blgsICZSZW5kZXJTdHlsZTo6dHJhbnNmb3JtT3JpZ2luWCwgJlJlbmRlclN0eWxlOjpzZXRUcmFu
c2Zvcm1PcmlnaW5YKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFBy
b3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luWSwg
JlJlbmRlclN0eWxlOjp0cmFuc2Zvcm1PcmlnaW5ZLCAmUmVuZGVyU3R5bGU6OnNldFRyYW5zZm9y
bU9yaWdpblkpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVy
dHlXcmFwcGVyPGNvbnN0IEludFNpemUmPihDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclRvcExlZnRS
YWRpdXMsICZSZW5kZXJTdHlsZTo6Ym9yZGVyVG9wTGVmdFJhZGl1cywgJlJlbmRlclN0eWxlOjpz
ZXRCb3JkZXJUb3BMZWZ0UmFkaXVzKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBl
bmQobmV3IFByb3BlcnR5V3JhcHBlcjxjb25zdCBJbnRTaXplJj4oQ1NTUHJvcGVydHlXZWJraXRC
b3JkZXJUb3BSaWdodFJhZGl1cywgJlJlbmRlclN0eWxlOjpib3JkZXJUb3BSaWdodFJhZGl1cywg
JlJlbmRlclN0eWxlOjpzZXRCb3JkZXJUb3BSaWdodFJhZGl1cykpOwotICAgICAgICBnUHJvcGVy
dHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8Y29uc3QgSW50U2l6ZSY+KENT
U1Byb3BlcnR5V2Via2l0Qm9yZGVyQm90dG9tTGVmdFJhZGl1cywgJlJlbmRlclN0eWxlOjpib3Jk
ZXJCb3R0b21MZWZ0UmFkaXVzLCAmUmVuZGVyU3R5bGU6OnNldEJvcmRlckJvdHRvbUxlZnRSYWRp
dXMpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFw
cGVyPGNvbnN0IEludFNpemUmPihDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckJvdHRvbVJpZ2h0UmFk
aXVzLCAmUmVuZGVyU3R5bGU6OmJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzLCAmUmVuZGVyU3R5bGU6
OnNldEJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJz
LT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxFVmlzaWJpbGl0eT4oQ1NTUHJvcGVydHlWaXNp
YmlsaXR5LCAmUmVuZGVyU3R5bGU6OnZpc2liaWxpdHksICZSZW5kZXJTdHlsZTo6c2V0VmlzaWJp
bGl0eSkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdy
YXBwZXI8ZmxvYXQ+KENTU1Byb3BlcnR5Wm9vbSwgJlJlbmRlclN0eWxlOjp6b29tLCAmUmVuZGVy
U3R5bGU6OnNldFpvb20pKTsKLSAgICAgICAgCi0gICAgICAgIC8vIEZJWE1FOiB0aGVzZSBtaWdo
dCBiZSBpbnZhbGlkIGNvbG9ycywgbmVlZCB0byBjaGVjayBmb3IgdGhhdAotICAgICAgICBnUHJv
cGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXJNYXliZUludmFsaWRDb2xv
cihDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1bGVDb2xvciwgJlJlbmRlclN0eWxlOjpjb2x1bW5S
dWxlQ29sb3IsICZSZW5kZXJTdHlsZTo6c2V0Q29sdW1uUnVsZUNvbG9yKSk7Ci0gICAgICAgIGdQ
cm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENv
bG9yKENTU1Byb3BlcnR5V2Via2l0VGV4dFN0cm9rZUNvbG9yLCAmUmVuZGVyU3R5bGU6OnRleHRT
dHJva2VDb2xvciwgJlJlbmRlclN0eWxlOjpzZXRUZXh0U3Ryb2tlQ29sb3IpKTsKLSAgICAgICAg
Z1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyTWF5YmVJbnZhbGlk
Q29sb3IoQ1NTUHJvcGVydHlXZWJraXRUZXh0RmlsbENvbG9yLCAmUmVuZGVyU3R5bGU6OnRleHRG
aWxsQ29sb3IsICZSZW5kZXJTdHlsZTo6c2V0VGV4dEZpbGxDb2xvcikpOwotICAgICAgICBnUHJv
cGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXJNYXliZUludmFsaWRDb2xv
cihDU1NQcm9wZXJ0eUJvcmRlckxlZnRDb2xvciwgJlJlbmRlclN0eWxlOjpib3JkZXJMZWZ0Q29s
b3IsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyTGVmdENvbG9yKSk7Ci0gICAgICAgIGdQcm9wZXJ0
eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENvbG9yKENT
U1Byb3BlcnR5Qm9yZGVyUmlnaHRDb2xvciwgJlJlbmRlclN0eWxlOjpib3JkZXJSaWdodENvbG9y
LCAmUmVuZGVyU3R5bGU6OnNldEJvcmRlclJpZ2h0Q29sb3IpKTsKLSAgICAgICAgZ1Byb3BlcnR5
V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyTWF5YmVJbnZhbGlkQ29sb3IoQ1NT
UHJvcGVydHlCb3JkZXJUb3BDb2xvciwgJlJlbmRlclN0eWxlOjpib3JkZXJUb3BDb2xvciwgJlJl
bmRlclN0eWxlOjpzZXRCb3JkZXJUb3BDb2xvcikpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVy
cy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXJNYXliZUludmFsaWRDb2xvcihDU1NQcm9wZXJ0
eUJvcmRlckJvdHRvbUNvbG9yLCAmUmVuZGVyU3R5bGU6OmJvcmRlckJvdHRvbUNvbG9yLCAmUmVu
ZGVyU3R5bGU6OnNldEJvcmRlckJvdHRvbUNvbG9yKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBw
ZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENvbG9yKENTU1Byb3Bl
cnR5T3V0bGluZUNvbG9yLCAmUmVuZGVyU3R5bGU6Om91dGxpbmVDb2xvciwgJlJlbmRlclN0eWxl
OjpzZXRPdXRsaW5lQ29sb3IpKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoZXNlIGFyZSBmb3Ig
c2hhZG93cwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdy
YXBwZXJTaGFkb3coQ1NTUHJvcGVydHlXZWJraXRCb3hTaGFkb3csICZSZW5kZXJTdHlsZTo6Ym94
U2hhZG93LCAmUmVuZGVyU3R5bGU6OnNldEJveFNoYWRvdykpOwotICAgICAgICBnUHJvcGVydHlX
cmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXJTaGFkb3coQ1NTUHJvcGVydHlUZXh0
U2hhZG93LCAmUmVuZGVyU3R5bGU6OnRleHRTaGFkb3csICZSZW5kZXJTdHlsZTo6c2V0VGV4dFNo
YWRvdykpOwotICAgICAgICAKLSAgICAgICAgLy8gTWFrZSBzdXJlIHVudXNlZCBzbG90cyBoYXZl
IGEgdmFsdWUKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCAodW5zaWduZWQg
aW50KSBudW1DU1NQcm9wZXJ0aWVzOyArK2kpCi0gICAgICAgICAgICBnUHJvcGVydHlXcmFwcGVy
TWFwW2ldID0gQ1NTUHJvcGVydHlJbnZhbGlkOwotICAgICAgICAKLSAgICAgICAgc2l6ZV90IG4g
PSBnUHJvcGVydHlXcmFwcGVycy0+c2l6ZSgpOwotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBp
ID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgQVNTRVJUKCgqZ1Byb3BlcnR5V3JhcHBl
cnMpW2ldLT5wcm9wZXJ0eSgpIC0gZmlyc3RDU1NQcm9wZXJ0eSA8IG51bUNTU1Byb3BlcnRpZXMp
OwotICAgICAgICAgICAgZ1Byb3BlcnR5V3JhcHBlck1hcFsoKmdQcm9wZXJ0eVdyYXBwZXJzKVtp
XS0+cHJvcGVydHkoKSAtIGZpcnN0Q1NTUHJvcGVydHldID0gaTsKLSAgICAgICAgfQotICAgIH0K
LX0KLQotLy8gc3RhdGljCi1ib29sIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpwcm9wZXJ0
aWVzRXF1YWwoaW50IHByb3AsIGNvbnN0IFJlbmRlclN0eWxlKiBhLCBjb25zdCBSZW5kZXJTdHls
ZSogYikKLXsKLSAgICBpZiAocHJvcCA9PSBjQW5pbWF0ZUFsbCkgewotICAgICAgICBzaXplX3Qg
biA9IGdQcm9wZXJ0eVdyYXBwZXJzLT5zaXplKCk7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaW50
IGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoISgqZ1Byb3BlcnR5V3JhcHBl
cnMpW2ldLT5lcXVhbHMoYSwgYikpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAg
ICAgICB9Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgICBpbnQgcHJvcEluZGV4ID0gcHJvcCAt
IGZpcnN0Q1NTUHJvcGVydHk7Ci0gICAgICAgIAotICAgICAgICBpZiAocHJvcEluZGV4ID49IDAg
JiYgcHJvcEluZGV4IDwgbnVtQ1NTUHJvcGVydGllcykgewotICAgICAgICAgICAgaW50IGkgPSBn
UHJvcGVydHlXcmFwcGVyTWFwW3Byb3BJbmRleF07Ci0gICAgICAgICAgICByZXR1cm4gKGkgPj0g
MCkgPyAoKmdQcm9wZXJ0eVdyYXBwZXJzKVtpXS0+ZXF1YWxzKGEsIGIpIDogdHJ1ZTsKLSAgICAg
ICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gc3RhdGljCi1pbnQgQW5pbWF0
aW9uQ29udHJvbGxlclByaXZhdGU6OmdldFByb3BlcnR5QXRJbmRleChpbnQgaSkKLXsKLSAgICBp
ZiAoaSA8IDAgfHwgaSA+PSAoaW50KSBnUHJvcGVydHlXcmFwcGVycy0+c2l6ZSgpKQotICAgICAg
ICByZXR1cm4gQ1NTUHJvcGVydHlJbnZhbGlkOwotICAgICAgICAKLSAgICByZXR1cm4gKCpnUHJv
cGVydHlXcmFwcGVycylbaV0tPnByb3BlcnR5KCk7Ci19Ci0gICAgCi0vLyBzdGF0aWMgLSByZXR1
cm4gdHJ1ZSBpZiB3ZSBuZWVkIHRvIHN0YXJ0IHNvZnR3YXJlIGFuaW1hdGlvbiB0aW1lcnMKLWJv
b2wgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OmJsZW5kUHJvcGVydGllcyhpbnQgcHJvcCwg
UmVuZGVyU3R5bGUqIGRzdCwgY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJlbmRlclN0eWxl
KiBiLCBkb3VibGUgcHJvZykKLXsKLSAgICBpZiAocHJvcCA9PSBjQW5pbWF0ZUFsbCkgewotICAg
ICAgICBBU1NFUlQoMCk7Ci0gICAgICAgIGJvb2wgbmVlZHNUaW1lciA9IGZhbHNlOwotICAgIAot
ICAgICAgICBzaXplX3QgbiA9IGdQcm9wZXJ0eVdyYXBwZXJzLT5zaXplKCk7Ci0gICAgICAgIGZv
ciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0
eVdyYXBwZXJCYXNlKiB3cmFwcGVyID0gKCpnUHJvcGVydHlXcmFwcGVycylbaV07Ci0gICAgICAg
ICAgICBpZiAoIXdyYXBwZXItPmVxdWFscyhhLCBiKSkgewotICAgICAgICAgICAgICAgIHdyYXBw
ZXItPmJsZW5kKGRzdCwgYSwgYiwgcHJvZyk7Ci0gICAgICAgICAgICAgICAgbmVlZHNUaW1lciA9
IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5lZWRzVGlt
ZXI7Ci0gICAgfQotICAgIAotICAgIGludCBwcm9wSW5kZXggPSBwcm9wIC0gZmlyc3RDU1NQcm9w
ZXJ0eTsKLSAgICBpZiAocHJvcEluZGV4ID49IDAgJiYgcHJvcEluZGV4IDwgbnVtQ1NTUHJvcGVy
dGllcykgewotICAgICAgICBpbnQgaSA9IGdQcm9wZXJ0eVdyYXBwZXJNYXBbcHJvcEluZGV4XTsK
LSAgICAgICAgaWYgKGkgPj0gMCkgewotICAgICAgICAgICAgUHJvcGVydHlXcmFwcGVyQmFzZSog
d3JhcHBlciA9ICgqZ1Byb3BlcnR5V3JhcHBlcnMpW2ldOwotICAgICAgICAgICAgd3JhcHBlci0+
YmxlbmQoZHN0LCBhLCBiLCBwcm9nKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAg
ICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiBmYWxzZTsKLX0KLQotQ29tcG9zaXRlQW5pbWF0
aW9uKiBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6YWNjZXNzQ29tcG9zaXRlQW5pbWF0aW9u
KFJlbmRlck9iamVjdCogcmVuZGVyZXIpCi17Ci0gICAgQ29tcG9zaXRlQW5pbWF0aW9uKiBhbmlt
YXRpb24gPSBtX2NvbXBvc2l0ZUFuaW1hdGlvbnMuZ2V0KHJlbmRlcmVyKTsKLSAgICBpZiAoIWFu
aW1hdGlvbikgewotICAgICAgICBhbmltYXRpb24gPSBuZXcgQ29tcG9zaXRlQW5pbWF0aW9uKHRo
aXMpOwotICAgICAgICBtX2NvbXBvc2l0ZUFuaW1hdGlvbnMuc2V0KHJlbmRlcmVyLCBhbmltYXRp
b24pOwotICAgIH0KLSAgICByZXR1cm4gYW5pbWF0aW9uOwotfQotCi1ib29sIEFuaW1hdGlvbkNv
bnRyb2xsZXJQcml2YXRlOjpjbGVhcihSZW5kZXJPYmplY3QqIHJlbmRlcmVyKQotewotICAgIC8v
IFJldHVybiBmYWxzZSBpZiB3ZSBkaWRuJ3QgZG8gYW55dGhpbmcgT1Igd2UgYXJlIHN1c3BlbmRl
ZCAoc28gd2UgZG9uJ3QgdHJ5IHRvCi0gICAgLy8gZG8gYSBzZXRDaGFuZ2VkKCkgd2hlbiBzdXNw
ZW5kZWQKLSAgICBDb21wb3NpdGVBbmltYXRpb24qIGFuaW1hdGlvbiA9IG1fY29tcG9zaXRlQW5p
bWF0aW9ucy50YWtlKHJlbmRlcmVyKTsKLSAgICBpZiAoIWFuaW1hdGlvbikKLSAgICAgICAgcmV0
dXJuIGZhbHNlOwotICAgIGFuaW1hdGlvbi0+cmVzZXRUcmFuc2l0aW9ucyhyZW5kZXJlcik7Ci0g
ICAgYm9vbCB3YXNTdXNwZW5kZWQgPSBhbmltYXRpb24tPnN1c3BlbmRlZCgpOwotICAgIGRlbGV0
ZSBhbmltYXRpb247Ci0gICAgcmV0dXJuICF3YXNTdXNwZW5kZWQ7Ci19Ci0KLXZvaWQgQW5pbWF0
aW9uQ29udHJvbGxlclByaXZhdGU6OnN0eWxlQXZhaWxhYmxlKCkKLXsKLSAgICBpZiAobV9udW1T
dHlsZUF2YWlsYWJsZVdhaXRlcnMgPT0gMCkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIFJl
bmRlck9iamVjdEFuaW1hdGlvbk1hcDo6Y29uc3RfaXRlcmF0b3IgYW5pbWF0aW9uc0VuZCA9IG1f
Y29tcG9zaXRlQW5pbWF0aW9ucy5lbmQoKTsKLSAgICBmb3IgKFJlbmRlck9iamVjdEFuaW1hdGlv
bk1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2NvbXBvc2l0ZUFuaW1hdGlvbnMuYmVnaW4oKTsg
Ci0gICAgICAgICBpdCAhPSBhbmltYXRpb25zRW5kOyArK2l0KSB7Ci0gICAgICAgIGl0LT5zZWNv
bmQtPnN0eWxlQXZhaWxhYmxlKCk7Ci0gICAgfQotfQotCi12b2lkIEFuaW1hdGlvbkNvbnRyb2xs
ZXJQcml2YXRlOjp1cGRhdGVBbmltYXRpb25UaW1lcigpCi17Ci0gICAgYm9vbCBhbmltYXRpbmcg
PSBmYWxzZTsKLSAgICAKLSAgICBSZW5kZXJPYmplY3RBbmltYXRpb25NYXA6OmNvbnN0X2l0ZXJh
dG9yIGFuaW1hdGlvbnNFbmQgPSBtX2NvbXBvc2l0ZUFuaW1hdGlvbnMuZW5kKCk7Ci0gICAgZm9y
IChSZW5kZXJPYmplY3RBbmltYXRpb25NYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9jb21wb3Np
dGVBbmltYXRpb25zLmJlZ2luKCk7IAotICAgICAgICAgaXQgIT0gYW5pbWF0aW9uc0VuZDsgKytp
dCkgewotICAgICAgICBDb21wb3NpdGVBbmltYXRpb24qIGNvbXBBbmltID0gaXQtPnNlY29uZDsK
LSAgICAgICAgaWYgKCFjb21wQW5pbS0+c3VzcGVuZGVkKCkgJiYgY29tcEFuaW0tPmFuaW1hdGlu
ZygpKSB7Ci0gICAgICAgICAgICBhbmltYXRpbmcgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKGFuaW1hdGluZykgewotICAgICAgICBp
ZiAoIW1fYW5pbWF0aW9uVGltZXIuaXNBY3RpdmUoKSkKLSAgICAgICAgICAgIG1fYW5pbWF0aW9u
VGltZXIuc3RhcnRSZXBlYXRpbmcoY0FuaW1hdGlvblRpbWVyRGVsYXkpOwotICAgIH0gZWxzZSBp
ZiAobV9hbmltYXRpb25UaW1lci5pc0FjdGl2ZSgpKQotICAgICAgICBtX2FuaW1hdGlvblRpbWVy
LnN0b3AoKTsKLX0KLQotdm9pZCBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6dXBkYXRlUmVu
ZGVyaW5nRGlzcGF0Y2hlckZpcmVkKFRpbWVyPEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlPiop
Ci17Ci0gICAgaWYgKG1fZnJhbWUgJiYgbV9mcmFtZS0+ZG9jdW1lbnQoKSkgewotICAgICAgICBt
X2ZyYW1lLT5kb2N1bWVudCgpLT51cGRhdGVSZW5kZXJpbmcoKTsKLSAgICB9Ci19Ci0KLXZvaWQg
QW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OnN0YXJ0VXBkYXRlUmVuZGVyaW5nRGlzcGF0Y2hl
cigpCi17Ci0gICAgaWYgKCFtX3VwZGF0ZVJlbmRlcmluZ0Rpc3BhdGNoZXIuaXNBY3RpdmUoKSkg
ewotICAgICAgICBtX3VwZGF0ZVJlbmRlcmluZ0Rpc3BhdGNoZXIuc3RhcnRPbmVTaG90KDApOwot
ICAgIH0KLX0KLQotdm9pZCBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6YW5pbWF0aW9uVGlt
ZXJGaXJlZChUaW1lcjxBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZT4qIHRpbWVyKQotewotICAg
IC8vIFdoZW4gdGhlIHRpbWVyIGZpcmVzLCBhbGwgd2UgZG8gaXMgY2FsbCBzZXRDaGFuZ2VkIG9u
IGFsbCBET00gbm9kZXMgd2l0aCBydW5uaW5nIGFuaW1hdGlvbnMgYW5kIHRoZW4gZG8gYW4gaW1t
ZWRpYXRlCi0gICAgLy8gdXBkYXRlUmVuZGVyaW5nLiAgSXQgd2lsbCB0aGVuIGNhbGwgYmFjayB0
byB1cyB3aXRoIG5ldyBpbmZvcm1hdGlvbi4KLSAgICBib29sIGFuaW1hdGluZyA9IGZhbHNlOwot
ICAgIFJlbmRlck9iamVjdEFuaW1hdGlvbk1hcDo6Y29uc3RfaXRlcmF0b3IgYW5pbWF0aW9uc0Vu
ZCA9IG1fY29tcG9zaXRlQW5pbWF0aW9ucy5lbmQoKTsKLSAgICBmb3IgKFJlbmRlck9iamVjdEFu
aW1hdGlvbk1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2NvbXBvc2l0ZUFuaW1hdGlvbnMuYmVn
aW4oKTsgCi0gICAgICAgICBpdCAhPSBhbmltYXRpb25zRW5kOyArK2l0KSB7Ci0gICAgICAgIFJl
bmRlck9iamVjdCogcmVuZGVyZXIgPSBpdC0+Zmlyc3Q7Ci0gICAgICAgIENvbXBvc2l0ZUFuaW1h
dGlvbiogY29tcEFuaW0gPSBpdC0+c2Vjb25kOwotICAgICAgICBpZiAoIWNvbXBBbmltLT5zdXNw
ZW5kZWQoKSAmJiBjb21wQW5pbS0+YW5pbWF0aW5nKCkpIHsKLSAgICAgICAgICAgIGFuaW1hdGlu
ZyA9IHRydWU7Ci0gICAgICAgICAgICBjb21wQW5pbS0+c2V0QW5pbWF0aW5nKGZhbHNlKTsKLSAg
ICAgICAgICAgIHNldENoYW5nZWQocmVuZGVyZXItPmVsZW1lbnQoKSk7Ci0gICAgICAgIH0KLSAg
ICB9Ci0gICAgCi0gICAgbV9mcmFtZS0+ZG9jdW1lbnQoKS0+dXBkYXRlUmVuZGVyaW5nKCk7Ci0g
ICAgCi0gICAgdXBkYXRlQW5pbWF0aW9uVGltZXIoKTsKLX0KLQotYm9vbCBBbmltYXRpb25Db250
cm9sbGVyUHJpdmF0ZTo6aXNBbmltYXRpbmdQcm9wZXJ0eU9uUmVuZGVyZXIoUmVuZGVyT2JqZWN0
KiBvYmosIGludCBwcm9wZXJ0eSwgYm9vbCBpc1J1bm5pbmdOb3cpIGNvbnN0Ci17Ci0gICAgQ29t
cG9zaXRlQW5pbWF0aW9uKiBhbmltYXRpb24gPSBtX2NvbXBvc2l0ZUFuaW1hdGlvbnMuZ2V0KG9i
aik7Ci0gICAgaWYgKCFhbmltYXRpb24pIHJldHVybiBmYWxzZTsKLQotICAgIHJldHVybiBhbmlt
YXRpb24tPmlzQW5pbWF0aW5nUHJvcGVydHkocHJvcGVydHksIGlzUnVubmluZ05vdyk7Ci19Ci0K
LXZvaWQgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OnN1c3BlbmRBbmltYXRpb25zKERvY3Vt
ZW50KiBkb2N1bWVudCkKLXsKLSAgICBSZW5kZXJPYmplY3RBbmltYXRpb25NYXA6OmNvbnN0X2l0
ZXJhdG9yIGFuaW1hdGlvbnNFbmQgPSBtX2NvbXBvc2l0ZUFuaW1hdGlvbnMuZW5kKCk7Ci0gICAg
Zm9yIChSZW5kZXJPYmplY3RBbmltYXRpb25NYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9jb21w
b3NpdGVBbmltYXRpb25zLmJlZ2luKCk7IAotICAgICAgICAgaXQgIT0gYW5pbWF0aW9uc0VuZDsg
KytpdCkgewotICAgICAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gaXQtPmZpcnN0OwotICAg
ICAgICBDb21wb3NpdGVBbmltYXRpb24qIGNvbXBBbmltID0gaXQtPnNlY29uZDsKLSAgICAgICAg
aWYgKHJlbmRlcmVyLT5kb2N1bWVudCgpID09IGRvY3VtZW50KQotICAgICAgICAgICAgY29tcEFu
aW0tPnN1c3BlbmRBbmltYXRpb25zKCk7Ci0gICAgfQotICAgIAotICAgIHVwZGF0ZUFuaW1hdGlv
blRpbWVyKCk7Ci19Ci0KLXZvaWQgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OnJlc3VtZUFu
aW1hdGlvbnMoRG9jdW1lbnQqIGRvY3VtZW50KQotewotICAgIFJlbmRlck9iamVjdEFuaW1hdGlv
bk1hcDo6Y29uc3RfaXRlcmF0b3IgYW5pbWF0aW9uc0VuZCA9IG1fY29tcG9zaXRlQW5pbWF0aW9u
cy5lbmQoKTsKLSAgICBmb3IgKFJlbmRlck9iamVjdEFuaW1hdGlvbk1hcDo6Y29uc3RfaXRlcmF0
b3IgaXQgPSBtX2NvbXBvc2l0ZUFuaW1hdGlvbnMuYmVnaW4oKTsgCi0gICAgICAgICBpdCAhPSBh
bmltYXRpb25zRW5kOyArK2l0KSB7Ci0gICAgICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBp
dC0+Zmlyc3Q7Ci0gICAgICAgIENvbXBvc2l0ZUFuaW1hdGlvbiogY29tcEFuaW0gPSBpdC0+c2Vj
b25kOwotICAgICAgICBpZiAocmVuZGVyZXItPmRvY3VtZW50KCkgPT0gZG9jdW1lbnQpCi0gICAg
ICAgICAgICBjb21wQW5pbS0+cmVzdW1lQW5pbWF0aW9ucygpOwotICAgIH0KLSAgICAKLSAgICB1
cGRhdGVBbmltYXRpb25UaW1lcigpOwotfQotCi12b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6dXBk
YXRlVHJhbnNpdGlvbnMoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5bGUq
IGN1cnJlbnRTdHlsZSwgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlKQotewotICAgIC8vIElmIGN1
cnJlbnRTdHlsZSBpcyBudWxsLCB3ZSBkb24ndCBkbyB0cmFuc2l0aW9ucwotICAgIGlmICghY3Vy
cmVudFN0eWxlIHx8ICF0YXJnZXRTdHlsZS0+dHJhbnNpdGlvbnMoKSkKLSAgICAgICAgcmV0dXJu
OwotICAgICAgICAKLSAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byB1cGRhdGUgdGhl
IGFjdGl2ZSB0cmFuc2l0aW9ucwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGFyZ2V0U3R5
bGUtPnRyYW5zaXRpb25zKCktPnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IEFuaW1hdGlv
biogYW5pbSA9ICgqdGFyZ2V0U3R5bGUtPnRyYW5zaXRpb25zKCkpW2ldLmdldCgpOwotICAgICAg
ICBkb3VibGUgZHVyYXRpb24gPSBhbmltLT5kdXJhdGlvbigpOwotICAgICAgICBkb3VibGUgZGVs
YXkgPSBhbmltLT5kZWxheSgpOwotCi0gICAgICAgIC8vIElmIHRoaXMgaXMgYW4gZW1wdHkgdHJh
bnNpdGlvbiwgc2tpcCBpdAotICAgICAgICBpZiAoZHVyYXRpb24gPT0gMCAmJiBkZWxheSA8PSAw
KQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAKLSAgICAgICAgaW50IHByb3AgPSBh
bmltLT5wcm9wZXJ0eSgpOwotICAgICAgICBib29sIGFsbCA9IHByb3AgPT0gY0FuaW1hdGVBbGw7
Ci0gICAgICAgIAotICAgICAgICAvLyBIYW5kbGUgYm90aCB0aGUgJ2FsbCcgYW5kIHNpbmdsZSBw
cm9wZXJ0eSBjYXNlcy4gRm9yIHRoZSBzaW5nbGUgcHJvcCBjYXNlLCB3ZSBtYWtlIG9ubHkgb25l
IHBhc3MKLSAgICAgICAgLy8gdGhyb3VnaCB0aGUgbG9vcAotICAgICAgICBmb3IgKGludCBwcm9w
ZXJ0eUluZGV4ID0gMDsgOyArK3Byb3BlcnR5SW5kZXgpIHsKLSAgICAgICAgICAgIGlmIChhbGwp
IHsKLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlJbmRleCA+PSBBbmltYXRpb25Db250cm9s
bGVyUHJpdmF0ZTo6Z2V0TnVtUHJvcGVydGllcygpKQotICAgICAgICAgICAgICAgICAgICBicmVh
azsKLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIG5leHQgcHJvcAotICAgICAgICAgICAgICAg
IHByb3AgPSBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6Z2V0UHJvcGVydHlBdEluZGV4KHBy
b3BlcnR5SW5kZXgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJbXBsaWNpdEFu
aW1hdGlvbnMgYXJlIGFsd2F5cyBoYXNoZWQgYnkgYWN0dWFsIHByb3BlcnRpZXMsIG5ldmVyIGNB
bmltYXRlQWxsCi0gICAgICAgICAgICBBU1NFUlQocHJvcCA+IGZpcnN0Q1NTUHJvcGVydHkgJiYg
cHJvcCA8IChmaXJzdENTU1Byb3BlcnR5ICsgbnVtQ1NTUHJvcGVydGllcykpOwotCi0gICAgICAg
ICAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYSBjdXJyZW50IHRyYW5zaXRpb24gZm9yIHRoaXMgcHJv
cAotICAgICAgICAgICAgSW1wbGljaXRBbmltYXRpb24qIGltcGxBbmltID0gbV90cmFuc2l0aW9u
cy5nZXQocHJvcCk7Ci0gICAgICAgICAgICBib29sIGVxdWFsID0gdHJ1ZTsKLSAgICAgICAgICAg
IAotICAgICAgICAgICAgaWYgKGltcGxBbmltKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlcmUg
aXMgb25lLCBoYXMgb3VyIHRhcmdldCBjaGFuZ2VkPwotICAgICAgICAgICAgICAgIGlmICghaW1w
bEFuaW0tPmlzVGFyZ2V0UHJvcGVydHlFcXVhbChwcm9wLCB0YXJnZXRTdHlsZSkpIHsKLSAgICAg
ICAgICAgICAgICAgICAgaW1wbEFuaW0tPnJlc2V0KHJlbmRlcmVyKTsKLSAgICAgICAgICAgICAg
ICAgICAgZGVsZXRlIGltcGxBbmltOwotICAgICAgICAgICAgICAgICAgICBtX3RyYW5zaXRpb25z
LnJlbW92ZShwcm9wKTsKLSAgICAgICAgICAgICAgICAgICAgZXF1YWwgPSBmYWxzZTsKLSAgICAg
ICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFNl
ZSBpZiB3ZSBuZWVkIHRvIHN0YXJ0IGEgbmV3IHRyYW5zaXRpb24KLSAgICAgICAgICAgICAgICBl
cXVhbCA9IEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpwcm9wZXJ0aWVzRXF1YWwocHJvcCwg
Y3VycmVudFN0eWxlLCB0YXJnZXRTdHlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAK
LSAgICAgICAgICAgIGlmICghZXF1YWwpIHsKLSAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5l
dyB0cmFuc2l0aW9uCi0gICAgICAgICAgICAgICAgSW1wbGljaXRBbmltYXRpb24qIGFuaW1hdGlv
biA9IG5ldyBJbXBsaWNpdEFuaW1hdGlvbihjb25zdF9jYXN0PEFuaW1hdGlvbio+KGFuaW0pLCBw
cm9wLCByZW5kZXJlciwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgbV90cmFuc2l0aW9ucy5zZXQo
cHJvcCwgYW5pbWF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAg
ICAgLy8gV2Ugb25seSBuZWVkIG9uZSBwYXNzIGZvciB0aGUgc2luZ2xlIHByb3AgY2FzZQotICAg
ICAgICAgICAgaWYgKCFhbGwpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAg
ICB9Ci19Ci0KLXZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjp1cGRhdGVLZXlmcmFtZUFuaW1hdGlv
bnMoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5bGUqIGN1cnJlbnRTdHls
ZSwgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlKQotewotICAgIC8vIE5vdGhpbmcgdG8gZG8gaWYg
d2UgZG9uJ3QgaGF2ZSBhbnkgYW5pbWF0aW9ucywgYW5kIGRpZG4ndCBoYXZlIGFueSBiZWZvcmUK
LSAgICBpZiAobV9rZXlmcmFtZUFuaW1hdGlvbnMuaXNFbXB0eSgpICYmICF0YXJnZXRTdHlsZS0+
aGFzQW5pbWF0aW9ucygpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgLy8gTm90aGluZyB0
byBkbyBpZiB0aGUgY3VycmVudCBhbmQgdGFyZ2V0IGFuaW1hdGlvbnMgYXJlIHRoZSBzYW1lCi0g
ICAgaWYgKGN1cnJlbnRTdHlsZSAmJiBjdXJyZW50U3R5bGUtPmhhc0FuaW1hdGlvbnMoKSAmJiB0
YXJnZXRTdHlsZS0+aGFzQW5pbWF0aW9ucygpICYmICooY3VycmVudFN0eWxlLT5hbmltYXRpb25z
KCkpID09ICoodGFyZ2V0U3R5bGUtPmFuaW1hdGlvbnMoKSkpCi0gICAgICAgIHJldHVybjsKLSAg
ICAgICAgCi0gICAgaW50IG51bUFuaW1zID0gMDsKLSAgICBib29sIGFuaW1zQ2hhbmdlZCA9IGZh
bHNlOwotICAgIAotICAgIC8vIHNlZSBpZiB0aGUgbGlzdHMgbWF0Y2gKLSAgICBpZiAodGFyZ2V0
U3R5bGUtPmFuaW1hdGlvbnMoKSkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRh
cmdldFN0eWxlLT5hbmltYXRpb25zKCktPnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBjb25z
dCBBbmltYXRpb24qIGFuaW0gPSAoKnRhcmdldFN0eWxlLT5hbmltYXRpb25zKCkpW2ldLmdldCgp
OwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIWFuaW0tPmlzVmFsaWRBbmltYXRpb24o
KSkKLSAgICAgICAgICAgICAgICBhbmltc0NoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgZWxz
ZSB7Ci0gICAgICAgICAgICAgICAgQXRvbWljU3RyaW5nIG5hbWUoYW5pbS0+bmFtZSgpKTsKLSAg
ICAgICAgICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbioga2ZBbmltID0gbV9rZXlmcmFtZUFuaW1h
dGlvbnMuZ2V0KG5hbWUuaW1wbCgpKTsKLSAgICAgICAgICAgICAgICBpZiAoIWtmQW5pbSB8fCAh
a2ZBbmltLT5hbmltYXRpb25zTWF0Y2goYW5pbSkpCi0gICAgICAgICAgICAgICAgICAgIGFuaW1z
Q2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAg
ICBpZiAoYW5pbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5pbWF0aW9ucyBtYXRj
aCwgYnV0IHBsYXkgc3RhdGVzIG1heSBkaWZmZXIuIHVwZGF0ZSBpZiBuZWVkZWQKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGtmQW5pbS0+dXBkYXRlUGxheVN0YXRlKGFuaW0tPnBsYXlTdGF0ZSgp
ID09IEFuaW1QbGF5U3RhdGVQbGF5aW5nKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIAotICAg
ICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBzYXZlZCBhbmltYXRpb24gdG8gdGhpcyBu
ZXcgb25lLCBqdXN0IGluIGNhc2UgdGhlIHBsYXkgc3RhdGUgaGFzIGNoYW5nZWQKLSAgICAgICAg
ICAgICAgICAgICAgICAgIGtmQW5pbS0+c2V0QW5pbWF0aW9uKGFuaW0pOwotICAgICAgICAgICAg
ICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICArK251bUFuaW1zOwotICAgICAg
ICB9Ci0gICAgfQotICAgIAotICAgIGlmICghYW5pbXNDaGFuZ2VkICYmIG1fa2V5ZnJhbWVBbmlt
YXRpb25zLnNpemUoKSAhPSBudW1BbmltcykKLSAgICAgICAgYW5pbXNDaGFuZ2VkID0gdHJ1ZTsK
LQotICAgIGlmICghYW5pbXNDaGFuZ2VkKQotICAgICAgICByZXR1cm47Ci0KLSAgICAvLyBhbmlt
YXRpb25zIGhhdmUgY2hhbmdlZCwgdXBkYXRlIHRoZSBsaXN0Ci0gICAgcmVzZXRBbmltYXRpb25z
KHJlbmRlcmVyKTsKLQotICAgIGlmICghdGFyZ2V0U3R5bGUtPmFuaW1hdGlvbnMoKSkKLSAgICAg
ICAgcmV0dXJuOwotCi0gICAgLy8gYWRkIGFsbCB0aGUgbmV3IGFuaW1hdGlvbnMKLSAgICBpbnQg
aW5kZXggPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGFyZ2V0U3R5bGUtPmFuaW1h
dGlvbnMoKS0+c2l6ZSgpOyArK2kpIHsKLSAgICAgICAgY29uc3QgQW5pbWF0aW9uKiBhbmltID0g
KCp0YXJnZXRTdHlsZS0+YW5pbWF0aW9ucygpKVtpXS5nZXQoKTsKLQotICAgICAgICBpZiAoIWFu
aW0tPmlzVmFsaWRBbmltYXRpb24oKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAg
ICAgCi0gICAgICAgIC8vIGRvbid0IGJvdGhlciBhZGRpbmcgdGhlIGFuaW1hdGlvbiBpZiBpdCBo
YXMgbm8ga2V5ZnJhbWVzIG9yIHdvbid0IGFuaW1hdGUKLSAgICAgICAgaWYgKChhbmltLT5kdXJh
dGlvbigpIHx8IGFuaW0tPmRlbGF5KCkpICYmIGFuaW0tPml0ZXJhdGlvbkNvdW50KCkgJiYKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS0+a2V5ZnJhbWVM
aXN0KCkuZ2V0KCkgJiYgIWFuaW0tPmtleWZyYW1lTGlzdCgpLT5pc0VtcHR5KCkpIHsKLSAgICAg
ICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBrZmFuaW0gPSBuZXcgS2V5ZnJhbWVBbmltYXRpb24o
Y29uc3RfY2FzdDxBbmltYXRpb24qPihhbmltKSwgcmVuZGVyZXIsIGluZGV4KyssIHRoaXMpOwot
ICAgICAgICAgICAgbV9rZXlmcmFtZUFuaW1hdGlvbnMuc2V0KGtmYW5pbS0+bmFtZSgpLmltcGwo
KSwga2ZhbmltKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotS2V5ZnJhbWVBbmltYXRpb24qIENv
bXBvc2l0ZUFuaW1hdGlvbjo6ZmluZEtleWZyYW1lQW5pbWF0aW9uKGNvbnN0IEF0b21pY1N0cmlu
ZyYgbmFtZSkKLXsKLSAgICByZXR1cm4gbV9rZXlmcmFtZUFuaW1hdGlvbnMuZ2V0KG5hbWUuaW1w
bCgpKTsKLX0KLQotUmVuZGVyU3R5bGUqIENvbXBvc2l0ZUFuaW1hdGlvbjo6YW5pbWF0ZShSZW5k
ZXJPYmplY3QqIHJlbmRlcmVyLCBjb25zdCBSZW5kZXJTdHlsZSogY3VycmVudFN0eWxlLCBSZW5k
ZXJTdHlsZSogdGFyZ2V0U3R5bGUpCi17Ci0gICAgUmVuZGVyU3R5bGUqIHJlc3VsdFN0eWxlID0g
MDsKLSAgICAKLSAgICAvLyBXZSBkb24ndCBkbyBhbnkgdHJhbnNpdGlvbnMgaWYgd2UgZG9uJ3Qg
aGF2ZSBhIGN1cnJlbnRTdHlsZSAob24gc3RhcnR1cCkKLSAgICB1cGRhdGVUcmFuc2l0aW9ucyhy
ZW5kZXJlciwgY3VycmVudFN0eWxlLCB0YXJnZXRTdHlsZSk7Ci0gICAgCi0gICAgaWYgKGN1cnJl
bnRTdHlsZSkgewotICAgICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIHRyYW5zaXRpb24gb2JqZWN0
cyByZWFkeSwgbGV0IHRoZW0ga25vdyBhYm91dCB0aGUgbmV3IGdvYWwgc3RhdGUuICBXZSB3YW50
IHRoZW0KLSAgICAgICAgLy8gdG8gZmlsbCBpbiBhIFJlbmRlclN0eWxlKiYgb25seSBpZiBuZWVk
ZWQuCi0gICAgICAgIENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVu
ZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7Ci0gICAgICAgIGZvciAoQ1NTUHJvcGVydHlUcmFuc2l0
aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9
IGVuZDsgKytpdCkgewotICAgICAgICAgICAgSW1wbGljaXRBbmltYXRpb24qICBhbmltID0gaXQt
PnNlY29uZDsKLSAgICAgICAgICAgIGlmIChhbmltKSB7Ci0gICAgICAgICAgICAgICAgYW5pbS0+
YW5pbWF0ZSh0aGlzLCByZW5kZXJlciwgY3VycmVudFN0eWxlLCB0YXJnZXRTdHlsZSwgcmVzdWx0
U3R5bGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdXBkYXRlS2V5
ZnJhbWVBbmltYXRpb25zKHJlbmRlcmVyLCBjdXJyZW50U3R5bGUsIHRhcmdldFN0eWxlKTsKLQot
ICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYW5pbWF0aW9uIG9iamVjdHMgcmVhZHksIGxldCB0aGVt
IGtub3cgYWJvdXQgdGhlIG5ldyBnb2FsIHN0YXRlLiAgV2Ugd2FudCB0aGVtCi0gICAgLy8gdG8g
ZmlsbCBpbiBhIFJlbmRlclN0eWxlKiYgb25seSBpZiBuZWVkZWQuCi0gICAgaWYgKHRhcmdldFN0
eWxlLT5oYXNBbmltYXRpb25zKCkpIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0
YXJnZXRTdHlsZS0+YW5pbWF0aW9ucygpLT5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgY29u
c3QgQW5pbWF0aW9uKiBhbmltID0gKCp0YXJnZXRTdHlsZS0+YW5pbWF0aW9ucygpKVtpXS5nZXQo
KTsKLQotICAgICAgICAgICAgaWYgKGFuaW0tPmlzVmFsaWRBbmltYXRpb24oKSkgewotICAgICAg
ICAgICAgICAgIEF0b21pY1N0cmluZyBuYW1lKGFuaW0tPm5hbWUoKSk7Ci0gICAgICAgICAgICAg
ICAgS2V5ZnJhbWVBbmltYXRpb24qIGtleWZyYW1lQW5pbSA9IG1fa2V5ZnJhbWVBbmltYXRpb25z
LmdldChuYW1lLmltcGwoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGtleWZyYW1lQW5pbSkKLSAg
ICAgICAgICAgICAgICAgICAga2V5ZnJhbWVBbmltLT5hbmltYXRlKHRoaXMsIHJlbmRlcmVyLCBj
dXJyZW50U3R5bGUsIHRhcmdldFN0eWxlLCByZXN1bHRTdHlsZSk7Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgY2xlYW51cEZpbmlzaGVkQW5pbWF0aW9ucyhyZW5k
ZXJlcik7Ci0KLSAgICByZXR1cm4gcmVzdWx0U3R5bGUgPyByZXN1bHRTdHlsZSA6IHRhcmdldFN0
eWxlOwotfQotCi0vLyAiYW5pbWF0aW5nIiBtZWFucyB0aGF0IHNvbWV0aGluZyBpcyBydW5uaW5n
IHRoYXQgcmVxdWlyZXMgdGhlIHRpbWVyIHRvIGtlZXAgZmlyaW5nCi0vLyAoZS5nLiBhIHRyYW5z
aXRpb24pCi12b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6c2V0QW5pbWF0aW5nKGJvb2wgaW5Bbmlt
YXRpbmcpCi17Ci0gICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3Ig
ZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKLSAgICBmb3IgKENTU1Byb3BlcnR5VHJhbnNpdGlv
bnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5iZWdpbigpOyBpdCAhPSBl
bmQ7ICsraXQpIHsKLSAgICAgICAgSW1wbGljaXRBbmltYXRpb24qICB0cmFuc2l0aW9uID0gaXQt
PnNlY29uZDsKLSAgICAgICAgdHJhbnNpdGlvbi0+c2V0QW5pbWF0aW5nKGluQW5pbWF0aW5nKTsK
LSAgICB9Ci0KLSAgICBBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBrZmVuZCA9IG1f
a2V5ZnJhbWVBbmltYXRpb25zLmVuZCgpOwotICAgIGZvciAoQW5pbWF0aW9uTmFtZU1hcDo6Y29u
c3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBrZmVu
ZDsgKytpdCkgewotICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7
Ci0gICAgICAgIGFuaW0tPnNldEFuaW1hdGluZyhpbkFuaW1hdGluZyk7Ci0gICAgfQotfQotCi1i
b29sIENvbXBvc2l0ZUFuaW1hdGlvbjo6YW5pbWF0aW5nKCkKLXsKLSAgICBDU1NQcm9wZXJ0eVRy
YW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3RyYW5zaXRpb25zLmVuZCgpOwot
ICAgIGZvciAoQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBt
X3RyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBJbXBsaWNp
dEFuaW1hdGlvbiogIHRyYW5zaXRpb24gPSBpdC0+c2Vjb25kOwotICAgICAgICBpZiAodHJhbnNp
dGlvbiAmJiB0cmFuc2l0aW9uLT5hbmltYXRpbmcoKSAmJiB0cmFuc2l0aW9uLT5ydW5uaW5nKCkp
Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgQW5pbWF0aW9uTmFt
ZU1hcDo6Y29uc3RfaXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5lbmQoKTsK
LSAgICBmb3IgKEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFt
ZUFuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0ga2ZlbmQ7ICsraXQpIHsKLSAgICAgICAgS2V5ZnJh
bWVBbmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOwotICAgICAgICBpZiAoYW5pbSAmJiAhYW5p
bS0+cGF1c2VkKCkgJiYgYW5pbS0+YW5pbWF0aW5nKCkgJiYgYW5pbS0+YWN0aXZlKCkpCi0gICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZv
aWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpyZXNldFRyYW5zaXRpb25zKFJlbmRlck9iamVjdCogcmVu
ZGVyZXIpCi17Ci0gICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3Ig
ZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKLSAgICBmb3IgKENTU1Byb3BlcnR5VHJhbnNpdGlv
bnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5iZWdpbigpOyBpdCAhPSBl
bmQ7ICsraXQpIHsKLSAgICAgICAgSW1wbGljaXRBbmltYXRpb24qICB0cmFuc2l0aW9uID0gaXQt
PnNlY29uZDsKLSAgICAgICAgdHJhbnNpdGlvbi0+cmVzZXQocmVuZGVyZXIpOwotICAgICAgICBk
ZWxldGUgdHJhbnNpdGlvbjsKLSAgICB9Ci0gICAgbV90cmFuc2l0aW9ucy5jbGVhcigpOwotfQot
Ci12b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6cmVzZXRBbmltYXRpb25zKFJlbmRlck9iamVjdCog
cmVuZGVyZXIpCi17Ci0gICAgZGVsZXRlQWxsVmFsdWVzKG1fa2V5ZnJhbWVBbmltYXRpb25zKTsK
LSAgICBtX2tleWZyYW1lQW5pbWF0aW9ucy5jbGVhcigpOwotfQotCi12b2lkIENvbXBvc2l0ZUFu
aW1hdGlvbjo6Y2xlYW51cEZpbmlzaGVkQW5pbWF0aW9ucyhSZW5kZXJPYmplY3QqIHJlbmRlcmVy
KQotewotICAgIGlmIChzdXNwZW5kZWQoKSkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIC8v
IE1ha2UgYSBsaXN0IG9mIHRyYW5zaXRpb25zIHRvIGJlIGRlbGV0ZWQKLSAgICBWZWN0b3I8aW50
PiBmaW5pc2hlZFRyYW5zaXRpb25zOwotICAgIENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNv
bnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7Ci0KLSAgICBmb3IgKENTU1By
b3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5i
ZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgSW1wbGljaXRBbmltYXRpb24qIGFu
aW0gPSBpdC0+c2Vjb25kOwotICAgICAgICBpZiAoIWFuaW0pCi0gICAgICAgICAgICBjb250aW51
ZTsKLSAgICAgICAgaWYgKGFuaW0tPnBvc3RhY3RpdmUoKSAmJiAhYW5pbS0+d2FpdGluZ0ZvckVu
ZEV2ZW50KCkpCi0gICAgICAgICAgICBmaW5pc2hlZFRyYW5zaXRpb25zLmFwcGVuZChhbmltLT5h
bmltYXRpbmdQcm9wZXJ0eSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gRGVsZXRlIHRoZW0KLSAg
ICBmb3IgKFZlY3RvcjxpbnQ+OjppdGVyYXRvciBpdCA9IGZpbmlzaGVkVHJhbnNpdGlvbnMuYmVn
aW4oKTsgaXQgIT0gZmluaXNoZWRUcmFuc2l0aW9ucy5lbmQoKTsgKytpdCkgewotICAgICAgICBJ
bXBsaWNpdEFuaW1hdGlvbiogYW5pbSA9IG1fdHJhbnNpdGlvbnMuZ2V0KCppdCk7Ci0gICAgICAg
IGlmIChhbmltKSB7Ci0gICAgICAgICAgICBhbmltLT5yZXNldChyZW5kZXJlcik7Ci0gICAgICAg
ICAgICBkZWxldGUgYW5pbTsKLSAgICAgICAgfQotICAgICAgICBtX3RyYW5zaXRpb25zLnJlbW92
ZSgqaXQpOwotICAgIH0KLQotICAgIC8vIE1ha2UgYSBsaXN0IG9mIGFuaW1hdGlvbnMgdG8gYmUg
ZGVsZXRlZAotICAgIFZlY3RvcjxBdG9taWNTdHJpbmdJbXBsKj4gZmluaXNoZWRBbmltYXRpb25z
OwotICAgIEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlmcmFt
ZUFuaW1hdGlvbnMuZW5kKCk7Ci0KLSAgICBmb3IgKEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0
ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0ga2ZlbmQ7ICsr
aXQpIHsKLSAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOwotICAg
ICAgICBpZiAoIWFuaW0pCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgaWYgKGFuaW0t
PnBvc3RhY3RpdmUoKSAmJiAhYW5pbS0+d2FpdGluZ0ZvckVuZEV2ZW50KCkpCi0gICAgICAgICAg
ICBmaW5pc2hlZEFuaW1hdGlvbnMuYXBwZW5kKGFuaW0tPm5hbWUoKS5pbXBsKCkpOwotICAgIH0K
LSAgICAKLSAgICAvLyBkZWxldGUgdGhlbQotICAgIGZvciAoVmVjdG9yPEF0b21pY1N0cmluZ0lt
cGwqPjo6aXRlcmF0b3IgaXQgPSBmaW5pc2hlZEFuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0gZmlu
aXNoZWRBbmltYXRpb25zLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIEtleWZyYW1lQW5pbWF0aW9u
KiBrZmFuaW0gPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5nZXQoKml0KTsKLSAgICAgICAgaWYgKGtm
YW5pbSkgewotICAgICAgICAgICAga2ZhbmltLT5yZXNldChyZW5kZXJlcik7Ci0gICAgICAgICAg
ICBkZWxldGUga2ZhbmltOwotICAgICAgICB9Ci0gICAgICAgIG1fa2V5ZnJhbWVBbmltYXRpb25z
LnJlbW92ZSgqaXQpOwotICAgIH0KLX0KLQotdm9pZCBDb21wb3NpdGVBbmltYXRpb246OnNldEFu
aW1hdGlvblN0YXJ0VGltZShkb3VibGUgdCkKLXsKLSAgICAvLyBzZXQgc3RhcnQgdGltZSBvbiBh
bGwgYW5pbWF0aW9ucyB3YWl0aW5nIGZvciBpdAotICAgIEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0
X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuZW5kKCk7Ci0gICAgZm9yIChB
bmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVBbmltYXRpb25z
LmJlZ2luKCk7IGl0ICE9IGtmZW5kOyArK2l0KSB7Ci0gICAgICAgIEtleWZyYW1lQW5pbWF0aW9u
KiBhbmltID0gaXQtPnNlY29uZDsKLSAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+d2FpdGluZ0Zv
clN0YXJ0VGltZSgpKQotICAgICAgICAgICAgYW5pbS0+dXBkYXRlU3RhdGVNYWNoaW5lKEFuaW1h
dGlvbkJhc2U6OlNUQVRFX0lOUFVUX1NUQVJUX1RJTUVfU0VULCB0KTsKLSAgICB9Ci19Ci0KLXZv
aWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpzZXRUcmFuc2l0aW9uU3RhcnRUaW1lKGludCBwcm9wZXJ0
eSwgZG91YmxlIHQpCi17Ci0gICAgLy8gU2V0IHRoZSBzdGFydCB0aW1lIGZvciBnaXZlbiBwcm9w
ZXJ0eSB0cmFuc2l0aW9uCi0gICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRl
cmF0b3IgZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKLSAgICBmb3IgKENTU1Byb3BlcnR5VHJh
bnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5iZWdpbigpOyBp
dCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgSW1wbGljaXRBbmltYXRpb24qIGFuaW0gPSBpdC0+
c2Vjb25kOwotICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT53YWl0aW5nRm9yU3RhcnRUaW1lKCkg
JiYgYW5pbS0+YW5pbWF0aW5nUHJvcGVydHkoKSA9PSBwcm9wZXJ0eSkKLSAgICAgICAgICAgIGFu
aW0tPnVwZGF0ZVN0YXRlTWFjaGluZShBbmltYXRpb25CYXNlOjpTVEFURV9JTlBVVF9TVEFSVF9U
SU1FX1NFVCwgdCk7Ci0gICAgfQotfQotCi12b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6c3VzcGVu
ZEFuaW1hdGlvbnMoKQotewotICAgIGlmIChtX3N1c3BlbmRlZCkKLSAgICAgICAgcmV0dXJuOwot
ICAgIAotICAgIG1fc3VzcGVuZGVkID0gdHJ1ZTsKLQotICAgIEFuaW1hdGlvbk5hbWVNYXA6OmNv
bnN0X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuZW5kKCk7Ci0gICAgZm9y
IChBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVBbmltYXRp
b25zLmJlZ2luKCk7IGl0ICE9IGtmZW5kOyArK2l0KSB7Ci0gICAgICAgIEtleWZyYW1lQW5pbWF0
aW9uKiBhbmltID0gaXQtPnNlY29uZDsKLSAgICAgICAgaWYgKGFuaW0pCi0gICAgICAgICAgICBh
bmltLT51cGRhdGVQbGF5U3RhdGUoZmFsc2UpOwotICAgIH0KLQotICAgIENTU1Byb3BlcnR5VHJh
bnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7Ci0g
ICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1f
dHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIEltcGxpY2l0
QW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKLSAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+
aGFzU3R5bGUoKSkKLSAgICAgICAgICAgIGFuaW0tPnVwZGF0ZVBsYXlTdGF0ZShmYWxzZSk7Ci0g
ICAgfQotfQotCi12b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6cmVzdW1lQW5pbWF0aW9ucygpCi17
Ci0gICAgaWYgKCFtX3N1c3BlbmRlZCkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIG1fc3Vz
cGVuZGVkID0gZmFsc2U7Ci0gICAgCi0gICAgQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0
b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5lbmQoKTsKLSAgICBmb3IgKEFuaW1hdGlv
bk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuYmVnaW4o
KTsgaXQgIT0ga2ZlbmQ7ICsraXQpIHsKLSAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGFuaW0g
PSBpdC0+c2Vjb25kOwotICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT5wbGF5U3RhdGVQbGF5aW5n
KCkpCi0gICAgICAgICAgICBhbmltLT51cGRhdGVQbGF5U3RhdGUodHJ1ZSk7Ci0gICAgfQotICAg
IAotICAgIENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1f
dHJhbnNpdGlvbnMuZW5kKCk7Ci0gICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpj
b25zdF9pdGVyYXRvciBpdCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0
KSB7Ci0gICAgICAgIEltcGxpY2l0QW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKLSAgICAg
ICAgaWYgKGFuaW0gJiYgYW5pbS0+aGFzU3R5bGUoKSkKLSAgICAgICAgICAgIGFuaW0tPnVwZGF0
ZVBsYXlTdGF0ZSh0cnVlKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpv
dmVycmlkZUltcGxpY2l0QW5pbWF0aW9ucyhpbnQgcHJvcGVydHkpCi17Ci0gICAgQ1NTUHJvcGVy
dHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV90cmFuc2l0aW9ucy5lbmQo
KTsKLSAgICBmb3IgKENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0
ID0gbV90cmFuc2l0aW9ucy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgSW1w
bGljaXRBbmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOwotICAgICAgICBpZiAoYW5pbSAmJiBh
bmltLT5hbmltYXRpbmdQcm9wZXJ0eSgpID09IHByb3BlcnR5KQotICAgICAgICAgICAgYW5pbS0+
c2V0T3ZlcnJpZGRlbih0cnVlKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ29tcG9zaXRlQW5pbWF0aW9u
OjpyZXN1bWVPdmVycmlkZGVuSW1wbGljaXRBbmltYXRpb25zKGludCBwcm9wZXJ0eSkKLXsKLSAg
ICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3RyYW5z
aXRpb25zLmVuZCgpOwotICAgIGZvciAoQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3Rf
aXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewot
ICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIGlm
IChhbmltICYmIGFuaW0tPmFuaW1hdGluZ1Byb3BlcnR5KCkgPT0gcHJvcGVydHkpCi0gICAgICAg
ICAgICBhbmltLT5zZXRPdmVycmlkZGVuKGZhbHNlKTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBpbmxp
bmUgYm9vbCBjb21wYXJlQW5pbWF0aW9uSW5kaWNlcyhjb25zdCBLZXlmcmFtZUFuaW1hdGlvbiog
YSwgY29uc3QgS2V5ZnJhbWVBbmltYXRpb24qIGIpCi17Ci0gICAgcmV0dXJuIGEtPmluZGV4KCkg
PCBiLT5pbmRleCgpOwotfQotCi12b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6c3R5bGVBdmFpbGFi
bGUoKQotewotICAgIGlmIChtX251bVN0eWxlQXZhaWxhYmxlV2FpdGVycyA9PSAwKQotICAgICAg
ICByZXR1cm47Ci0gICAgCi0gICAgLy8gV2UgaGF2ZSB0byBnbyB0aHJvdWdoIGFuaW1hdGlvbnMg
aW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluCi0gICAgLy8gdGhlIHN0eWxlLCBi
ZWNhdXNlIG9yZGVyIG1hdHRlcnMgZm9yIGFkZGl0aXZpdHkuCi0gICAgVmVjdG9yPEtleWZyYW1l
QW5pbWF0aW9uKj4gYW5pbWF0aW9ucyhtX2tleWZyYW1lQW5pbWF0aW9ucy5zaXplKCkpOwotICAg
IEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlmcmFtZUFuaW1h
dGlvbnMuZW5kKCk7Ci0gICAgc2l6ZV90IGkgPSAwOwotICAgIGZvciAoQW5pbWF0aW9uTmFtZU1h
cDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5iZWdpbigpOyBpdCAh
PSBrZmVuZDsgKytpdCkgewotICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbiogYW5pbSA9IGl0LT5z
ZWNvbmQ7Ci0gICAgICAgIC8vIFdlIGNhbid0IGp1c3QgaW5zZXJ0IGJhc2VkIG9uIGFuaW0tPmlu
ZGV4KCkgYmVjYXVzZSBpbnZhbGlkIGFuaW1hdGlvbnMgZG9uJ3QKLSAgICAgICAgLy8gbWFrZSBp
dCBpbnRvIHRoZSBoYXNoLgotICAgICAgICBhbmltYXRpb25zW2krK10gPSBhbmltOwotICAgIH0K
LQotICAgIGlmIChhbmltYXRpb25zLnNpemUoKSA+IDEpCi0gICAgICAgIHN0ZDo6c3RhYmxlX3Nv
cnQoYW5pbWF0aW9ucy5iZWdpbigpLCBhbmltYXRpb25zLmVuZCgpLCBjb21wYXJlQW5pbWF0aW9u
SW5kaWNlcyk7Ci0gICAgCi0gICAgZm9yIChpID0gMDsgaSA8IGFuaW1hdGlvbnMuc2l6ZSgpOyAr
K2kpIHsKLSAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGFuaW0gPSBhbmltYXRpb25zW2ldOwot
ICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT53YWl0aW5nRm9yU3R5bGVBdmFpbGFibGUoKSkKLSAg
ICAgICAgICAgIGFuaW0tPnVwZGF0ZVN0YXRlTWFjaGluZShBbmltYXRpb25CYXNlOjpTVEFURV9J
TlBVVF9TVFlMRV9BVkFJTEFCTEUsIC0xKTsKLSAgICB9Ci0gICAgCi0gICAgQ1NTUHJvcGVydHlU
cmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsK
LSAgICBmb3IgKENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0g
bV90cmFuc2l0aW9ucy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgSW1wbGlj
aXRBbmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOwotICAgICAgICBpZiAoYW5pbSAmJiBhbmlt
LT53YWl0aW5nRm9yU3R5bGVBdmFpbGFibGUoKSkKLSAgICAgICAgICAgIGFuaW0tPnVwZGF0ZVN0
YXRlTWFjaGluZShBbmltYXRpb25CYXNlOjpTVEFURV9JTlBVVF9TVFlMRV9BVkFJTEFCTEUsIC0x
KTsKLSAgICB9Ci19Ci0KLWJvb2wgQ29tcG9zaXRlQW5pbWF0aW9uOjppc0FuaW1hdGluZ1Byb3Bl
cnR5KGludCBwcm9wZXJ0eSwgYm9vbCBpc1J1bm5pbmdOb3cpIGNvbnN0Ci17Ci0gICAgQW5pbWF0
aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5l
bmQoKTsKLSAgICBmb3IgKEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9r
ZXlmcmFtZUFuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0ga2ZlbmQ7ICsraXQpIHsKLSAgICAgICAg
S2V5ZnJhbWVBbmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOwotICAgICAgICBpZiAoYW5pbSAm
JiBhbmltLT5pc0FuaW1hdGluZ1Byb3BlcnR5KHByb3BlcnR5LCBpc1J1bm5pbmdOb3cpKQotICAg
ICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIENTU1Byb3BlcnR5VHJhbnNp
dGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7Ci0gICAg
Zm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fdHJh
bnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIEltcGxpY2l0QW5p
bWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKLSAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+aXNB
bmltYXRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgaXNSdW5uaW5nTm93KSkKLSAgICAgICAgICAgIHJl
dHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgSW1wbGljaXRB
bmltYXRpb246OmFuaW1hdGUoQ29tcG9zaXRlQW5pbWF0aW9uKiBhbmltYXRpb24sIFJlbmRlck9i
amVjdCogcmVuZGVyZXIsIGNvbnN0IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUsIAotICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUs
IFJlbmRlclN0eWxlKiYgYW5pbWF0ZWRTdHlsZSkKLXsKLSAgICBpZiAocGF1c2VkKCkpCi0gICAg
ICAgIHJldHVybjsKLSAgICAKLSAgICAvLyBJZiB3ZSBnZXQgdGhpcyBmYXIgYW5kIHRoZSBhbmlt
YXRpb24gaXMgZG9uZSwgaXQgbWVhbnMgd2UgYXJlIGNsZWFuaW5nIHVwIGEganVzdCBmaW5pc2hl
ZCBhbmltYXRpb24uCi0gICAgLy8gU28ganVzdCByZXR1cm4uIEV2ZXJ5dGhpbmcgaXMgYWxyZWFk
eSBhbGwgY2xlYW5lZCB1cAotICAgIGlmIChwb3N0YWN0aXZlKCkpCi0gICAgICAgIHJldHVybjsK
LQotICAgIC8vIFJlc2V0IHRvIHN0YXJ0IHRoZSB0cmFuc2l0aW9uIGlmIHdlIGFyZSBuZXcKLSAg
ICBpZiAoaXNuZXcoKSkKLSAgICAgICAgcmVzZXQocmVuZGVyZXIsIGN1cnJlbnRTdHlsZSwgdGFy
Z2V0U3R5bGUpOwotICAgIAotICAgIC8vIFJ1biBhIGN5Y2xlIG9mIGFuaW1hdGlvbi4KLSAgICAv
LyBXZSBrbm93IHdlIHdpbGwgbmVlZCBhIG5ldyByZW5kZXIgc3R5bGUsIHNvIG1ha2Ugb25lIGlm
IG5lZWRlZAotICAgIGlmICghYW5pbWF0ZWRTdHlsZSkKLSAgICAgICAgYW5pbWF0ZWRTdHlsZSA9
IG5ldyAocmVuZGVyZXItPnJlbmRlckFyZW5hKCkpIFJlbmRlclN0eWxlKCp0YXJnZXRTdHlsZSk7
Ci0gICAgCi0gICAgZG91YmxlIHByb2cgPSBwcm9ncmVzcygxLCAwKTsKLSAgICBib29sIG5lZWRz
QW5pbSA9IEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpibGVuZFByb3BlcnRpZXMobV9hbmlt
YXRpbmdQcm9wZXJ0eSwgYW5pbWF0ZWRTdHlsZSwgbV9mcm9tU3R5bGUsIG1fdG9TdHlsZSwgcHJv
Zyk7Ci0gICAgaWYgKG5lZWRzQW5pbSkKLSAgICAgICAgc2V0QW5pbWF0aW5nKCk7Ci19Ci0KLXZv
aWQgSW1wbGljaXRBbmltYXRpb246Om9uQW5pbWF0aW9uRW5kKGRvdWJsZSBpbkVsYXBzZWRUaW1l
KQotewotICAgIGlmICghc2VuZFRyYW5zaXRpb25FdmVudChFdmVudE5hbWVzOjp3ZWJraXRUcmFu
c2l0aW9uRW5kRXZlbnQsIGluRWxhcHNlZFRpbWUpKSB7Ci0gICAgICAgIC8vIFdlIGRpZG4ndCBk
aXNwYXRjaCBhbiBldmVudCwgd2hpY2ggd291bGQgY2FsbCBlbmRBbmltYXRpb24oKSwgc28gd2Un
bGwganVzdCBjYWxsIGl0IGhlcmUuCi0gICAgICAgIGVuZEFuaW1hdGlvbih0cnVlKTsKLSAgICB9
Ci19Ci0KLWJvb2wgSW1wbGljaXRBbmltYXRpb246OnNlbmRUcmFuc2l0aW9uRXZlbnQoY29uc3Qg
QXRvbWljU3RyaW5nJiBpbkV2ZW50VHlwZSwgZG91YmxlIGluRWxhcHNlZFRpbWUpCi17Ci0gICAg
aWYgKGluRXZlbnRUeXBlID09IEV2ZW50TmFtZXM6OndlYmtpdFRyYW5zaXRpb25FbmRFdmVudCkg
ewotICAgICAgICBEb2N1bWVudDo6TGlzdGVuZXJUeXBlIGxpc3RlbmVyVHlwZSA9IERvY3VtZW50
OjpUUkFOU0lUSU9ORU5EX0xJU1RFTkVSOwotICAgICAgICAKLSAgICAgICAgaWYgKHNob3VsZFNl
bmRFdmVudEZvckxpc3RlbmVyKGxpc3RlbmVyVHlwZSkpIHsKLSAgICAgICAgICAgIEVsZW1lbnQq
IGVsZW1lbnQgPSBlbGVtZW50Rm9yRXZlbnREaXNwYXRjaCgpOwotICAgICAgICAgICAgaWYgKGVs
ZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lOwotICAgICAgICAg
ICAgICAgIGlmIChtX3RyYW5zaXRpb25Qcm9wZXJ0eSAhPSBjQW5pbWF0ZUFsbCkKLSAgICAgICAg
ICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gU3RyaW5nKGdldFByb3BlcnR5TmFtZSgoQ1NTUHJv
cGVydHlJRCltX3RyYW5zaXRpb25Qcm9wZXJ0eSkpOwotICAgICAgICAgICAgICAgIG1fd2FpdGlu
Z0ZvckVuZEV2ZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtX2FuaW1hdGlvbkV2ZW50RGlz
cGF0Y2hlci5zdGFydFRpbWVyKGVsZW1lbnQsIHByb3BlcnR5TmFtZSwgbV90cmFuc2l0aW9uUHJv
cGVydHksIHRydWUsIGluRXZlbnRUeXBlLCBpbkVsYXBzZWRUaW1lKTsKLSAgICAgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsgLy8gRGlkIGRpc3BhdGNoIGFuIGV2ZW50Ci0gICAgICAgICAgICB9Ci0g
ICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOyAvLyBEaWRuJ3QgZGlzcGF0
Y2ggYW4gZXZlbnQKLX0KLQotdm9pZCBJbXBsaWNpdEFuaW1hdGlvbjo6cmVzZXQoUmVuZGVyT2Jq
ZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5bGUqIGZyb20gLyogPSAwICovLCBjb25zdCBS
ZW5kZXJTdHlsZSogdG8gLyogPSAwICovKQotewotICAgIEFTU0VSVCgoIW1fdG9TdHlsZSAmJiAh
dG8pIHx8IG1fdG9TdHlsZSAhPSB0byk7Ci0gICAgQVNTRVJUKCghbV9mcm9tU3R5bGUgJiYgIWZy
b20pIHx8IG1fZnJvbVN0eWxlICE9IGZyb20pOwotICAgIGlmIChtX2Zyb21TdHlsZSkKLSAgICAg
ICAgbV9mcm9tU3R5bGUtPmRlcmVmKHJlbmRlcmVyLT5yZW5kZXJBcmVuYSgpKTsKLSAgICBpZiAo
bV90b1N0eWxlKQotICAgICAgICBtX3RvU3R5bGUtPmRlcmVmKHJlbmRlcmVyLT5yZW5kZXJBcmVu
YSgpKTsKLSAgICAKLSAgICBtX2Zyb21TdHlsZSA9IGNvbnN0X2Nhc3Q8UmVuZGVyU3R5bGUqPihm
cm9tKTsgICAvLyBpdCBpcyByZWFkLW9ubHksIG90aGVyIHRoYW4gdGhlIHJlZgotICAgIGlmICht
X2Zyb21TdHlsZSkKLSAgICAgICAgbV9mcm9tU3R5bGUtPnJlZigpOwotICAgIAotICAgIG1fdG9T
dHlsZSA9IGNvbnN0X2Nhc3Q8UmVuZGVyU3R5bGUqPih0byk7ICAgICAgIC8vIGl0IGlzIHJlYWQt
b25seSwgb3RoZXIgdGhhbiB0aGUgcmVmCi0gICAgaWYgKG1fdG9TdHlsZSkKLSAgICAgICAgbV90
b1N0eWxlLT5yZWYoKTsKLSAgICAKLSAgICAvLyByZXN0YXJ0IHRoZSB0cmFuc2l0aW9uCi0gICAg
aWYgKGZyb20gJiYgdG8pCi0gICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFURV9JTlBVVF9S
RVNUQVJUX0FOSU1BVElPTiwgLTEpOwotfQotCi12b2lkIEltcGxpY2l0QW5pbWF0aW9uOjpzZXRP
dmVycmlkZGVuKGJvb2wgYikKLXsKLSAgICBpZiAoYiAhPSBtX292ZXJyaWRkZW4pIHsKLSAgICAg
ICAgbV9vdmVycmlkZGVuID0gYjsKLSAgICAgICAgdXBkYXRlU3RhdGVNYWNoaW5lKG1fb3ZlcnJp
ZGRlbiA/IFNUQVRFX0lOUFVUX1BBVVNFX09WRVJSSURFIDogU1RBVEVfSU5QVVRfUkVTVU1FX09W
RVJSSURFLCAtMSk7Ci0gICAgfQotfQotCi1ib29sIEltcGxpY2l0QW5pbWF0aW9uOjphZmZlY3Rz
UHJvcGVydHkoaW50IHByb3BlcnR5KSBjb25zdAotewotICAgIHJldHVybiAobV9hbmltYXRpbmdQ
cm9wZXJ0eSA9PSBwcm9wZXJ0eSk7Ci19Ci0KLWJvb2wgSW1wbGljaXRBbmltYXRpb246OmlzVGFy
Z2V0UHJvcGVydHlFcXVhbChpbnQgcHJvcCwgY29uc3QgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxl
KQotewotICAgIHJldHVybiBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6cHJvcGVydGllc0Vx
dWFsKHByb3AsIG1fdG9TdHlsZSwgdGFyZ2V0U3R5bGUpOwotfQotCi12b2lkIEltcGxpY2l0QW5p
bWF0aW9uOjpibGVuZFByb3BlcnR5VmFsdWVJblN0eWxlKGludCBwcm9wLCBSZW5kZXJTdHlsZSog
Y3VycmVudFN0eWxlKQotewotICAgIGRvdWJsZSBwcm9nID0gcHJvZ3Jlc3MoMSwgMCk7Ci0gICAg
QW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OmJsZW5kUHJvcGVydGllcyhwcm9wLCBjdXJyZW50
U3R5bGUsIG1fZnJvbVN0eWxlLCBtX3RvU3R5bGUsIHByb2cpOwotfSAgICAKLQotdm9pZCBLZXlm
cmFtZUFuaW1hdGlvbjo6YW5pbWF0ZShDb21wb3NpdGVBbmltYXRpb24qIGFuaW1hdGlvbiwgUmVu
ZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5bGUqIGN1cnJlbnRTdHlsZSwgCi0g
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSogdGFy
Z2V0U3R5bGUsIFJlbmRlclN0eWxlKiYgYW5pbWF0ZWRTdHlsZSkKLXsKLSAgICAvLyBpZiB3ZSBo
YXZlIG5vdCB5ZXQgc3RhcnRlZCwgd2Ugd2lsbCBub3QgaGF2ZSBhIHZhbGlkIHN0YXJ0IHRpbWUs
IHNvIGp1c3Qgc3RhcnQgdGhlIGFuaW1hdGlvbiBpZiBuZWVkZWQKLSAgICBpZiAoaXNuZXcoKSAm
JiBtX2FuaW1hdGlvbi0+cGxheVN0YXRlKCkgPT0gQW5pbVBsYXlTdGF0ZVBsYXlpbmcpCi0gICAg
ICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFURV9JTlBVVF9TVEFSVF9BTklNQVRJT04sIC0xKTsK
LSAgICAKLSAgICAvLyBJZiB3ZSBnZXQgdGhpcyBmYXIgYW5kIHRoZSBhbmltYXRpb24gaXMgZG9u
ZSwgaXQgbWVhbnMgd2UgYXJlIGNsZWFuaW5nIHVwIGEganVzdCBmaW5pc2hlZCBhbmltYXRpb24u
Ci0gICAgLy8gSWYgc28sIHdlIG5lZWQgdG8gc2VuZCBiYWNrIHRoZSB0YXJnZXRTdHlsZQotICAg
IGlmIChwb3N0YWN0aXZlKCkpIHsKLSAgICAgICAgaWYgKCFhbmltYXRlZFN0eWxlKQotICAgICAg
ICAgICAgYW5pbWF0ZWRTdHlsZSA9IGNvbnN0X2Nhc3Q8UmVuZGVyU3R5bGUqPih0YXJnZXRTdHls
ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBpZiB3ZSBhcmUgd2FpdGluZyBm
b3IgdGhlIHN0YXJ0IHRpbWVyLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGUgc3R5bGUgeWV0
Ci0gICAgLy8gU3BlY2lhbCBjYXNlIC0gaWYgdGhlIGRlbGF5IHRpbWUgaXMgMCwgdGhlbiB3ZSBk
byB3YW50IHRvIHNldCB0aGUgZmlyc3QgZnJhbWUgb2YgdGhlCi0gICAgLy8gYW5pbWF0aW9uIHJp
Z2h0IGF3YXkuIFRoaXMgYXZvaWRzIGEgZmxhc2ggd2hlbiB0aGUgYW5pbWF0aW9uIHN0YXJ0cwot
ICAgIGlmICh3YWl0aW5nVG9TdGFydCgpICYmIG1fYW5pbWF0aW9uLT5kZWxheSgpID4gMCkKLSAg
ICAgICAgcmV0dXJuOwotICAgIAotICAgIC8vIEZJWE1FOiB3ZSBuZWVkIHRvIGJlIG1vcmUgZWZm
aWNpZW50IGFib3V0IGRldGVybWluaW5nIHdoaWNoIGtleWZyYW1lcyB3ZSBhcmUgYW5pbWF0aW5n
IGJldHdlZW4uCi0gICAgLy8gV2Ugc2hvdWxkIGNhY2hlIHRoZSBsYXN0IHBhaXIgb3Igc29tZXRo
aW5nCi0gICAgCi0gICAgLy8gZmluZCB0aGUgZmlyc3Qga2V5Ci0gICAgZG91YmxlIGVsYXBzZWRU
aW1lID0gKG1fc3RhcnRUaW1lID4gMCkgPyAoKCFwYXVzZWQoKSA/IGN1cnJlbnRUaW1lKCkgOiBt
X3BhdXNlVGltZSkgLSBtX3N0YXJ0VGltZSkgOiAwLjA7Ci0gICAgaWYgKGVsYXBzZWRUaW1lIDwg
MC4wKQotICAgICAgICBlbGFwc2VkVGltZSA9IDAuMDsKLSAgICAgICAgCi0gICAgZG91YmxlIHQg
PSBtX2FuaW1hdGlvbi0+ZHVyYXRpb24oKSA/IChlbGFwc2VkVGltZSAvIG1fYW5pbWF0aW9uLT5k
dXJhdGlvbigpKSA6IDEuMDsKLSAgICBpbnQgaSA9IChpbnQpIHQ7Ci0gICAgdCAtPSBpOwotICAg
IGlmIChtX2FuaW1hdGlvbi0+ZGlyZWN0aW9uKCkgJiYgKGkgJiAxKSkKLSAgICAgICAgdCA9IDEg
LSB0OwotCi0gICAgUmVuZGVyU3R5bGUqIGZyb21TdHlsZSA9IDA7Ci0gICAgUmVuZGVyU3R5bGUq
IHRvU3R5bGUgPSAwOwotICAgIGRvdWJsZSBzY2FsZSA9IDEuMDsKLSAgICBkb3VibGUgb2Zmc2V0
ID0gMC4wOwotICAgIGlmIChtX2tleWZyYW1lcy5nZXQoKSkgewotICAgICAgICBWZWN0b3I8S2V5
ZnJhbWVWYWx1ZT46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fa2V5ZnJhbWVzLT5lbmRLZXlmcmFt
ZXMoKTsKLSAgICAgICAgZm9yIChWZWN0b3I8S2V5ZnJhbWVWYWx1ZT46OmNvbnN0X2l0ZXJhdG9y
IGl0ID0gbV9rZXlmcmFtZXMtPmJlZ2luS2V5ZnJhbWVzKCk7IGl0ICE9IGVuZDsgKytpdCkgewot
ICAgICAgICAgICAgaWYgKHQgPCBpdC0+a2V5KSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGZp
cnN0IGtleSBzaG91bGQgYWx3YXlzIGJlIDAsIHNvIHdlIHNob3VsZCBuZXZlciBzdWNjZWVkIG9u
IHRoZSBmaXJzdCBrZXkKLSAgICAgICAgICAgICAgICBpZiAoIWZyb21TdHlsZSkKLSAgICAgICAg
ICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgc2NhbGUgPSAxLjAgLyAoaXQtPmtl
eSAtIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgdG9TdHlsZSA9IGNvbnN0X2Nhc3Q8UmVuZGVy
U3R5bGUqPigmKGl0LT5zdHlsZSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAg
ICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBvZmZzZXQgPSBpdC0+a2V5OwotICAgICAg
ICAgICAgZnJvbVN0eWxlID0gY29uc3RfY2FzdDxSZW5kZXJTdHlsZSo+KCYoaXQtPnN0eWxlKSk7
Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gaWYgZWl0aGVyIHN0eWxlIGlzIDAgd2Ug
aGF2ZSBhbiBpbnZhbGlkIGNhc2UsIGp1c3Qgc3RvcCB0aGUgYW5pbWF0aW9uCi0gICAgaWYgKCFm
cm9tU3R5bGUgfHwgIXRvU3R5bGUpIHsKLSAgICAgICAgdXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRF
X0lOUFVUX0VORF9BTklNQVRJT04sIC0xKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAK
LSAgICAvLyBydW4gYSBjeWNsZSBvZiBhbmltYXRpb24uCi0gICAgLy8gV2Uga25vdyB3ZSB3aWxs
IG5lZWQgYSBuZXcgcmVuZGVyIHN0eWxlLCBzbyBtYWtlIG9uZSBpZiBuZWVkZWQKLSAgICBpZiAo
IWFuaW1hdGVkU3R5bGUpCi0gICAgICAgIGFuaW1hdGVkU3R5bGUgPSBuZXcgKHJlbmRlcmVyLT5y
ZW5kZXJBcmVuYSgpKSBSZW5kZXJTdHlsZSgqdGFyZ2V0U3R5bGUpOwotICAgIAotICAgIGRvdWJs
ZSBwcm9nID0gcHJvZ3Jlc3Moc2NhbGUsIG9mZnNldCk7Ci0KLSAgICBIYXNoU2V0PGludD46OmNv
bnN0X2l0ZXJhdG9yIGVuZCA9IG1fa2V5ZnJhbWVzLT5lbmRQcm9wZXJ0aWVzKCk7Ci0gICAgZm9y
IChIYXNoU2V0PGludD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZXMtPmJlZ2luUHJv
cGVydGllcygpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgaWYgKEFuaW1hdGlvbkNvbnRy
b2xsZXJQcml2YXRlOjpibGVuZFByb3BlcnRpZXMoKml0LCBhbmltYXRlZFN0eWxlLCBmcm9tU3R5
bGUsIHRvU3R5bGUsIHByb2cpKQotICAgICAgICAgICAgc2V0QW5pbWF0aW5nKCk7Ci0gICAgfQot
fQotCi12b2lkIEtleWZyYW1lQW5pbWF0aW9uOjplbmRBbmltYXRpb24oYm9vbCByZXNldCkKLXsK
LSAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCAodW5hbmltYXRlZCkgc3R5bGUKLSAgICBpZiAo
bV9vYmplY3QpCi0gICAgICAgIHNldENoYW5nZWQobV9vYmplY3QtPmVsZW1lbnQoKSk7Ci19Ci0K
LXZvaWQgS2V5ZnJhbWVBbmltYXRpb246Om9uQW5pbWF0aW9uU3RhcnQoZG91YmxlIGluRWxhcHNl
ZFRpbWUpCi17Ci0gICAgc2VuZEFuaW1hdGlvbkV2ZW50KEV2ZW50TmFtZXM6OndlYmtpdEFuaW1h
dGlvblN0YXJ0RXZlbnQsIGluRWxhcHNlZFRpbWUpOwotfQotCi12b2lkIEtleWZyYW1lQW5pbWF0
aW9uOjpvbkFuaW1hdGlvbkl0ZXJhdGlvbihkb3VibGUgaW5FbGFwc2VkVGltZSkKLXsKLSAgICBz
ZW5kQW5pbWF0aW9uRXZlbnQoRXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uSXRlcmF0aW9uRXZl
bnQsIGluRWxhcHNlZFRpbWUpOwotfQotCi12b2lkIEtleWZyYW1lQW5pbWF0aW9uOjpvbkFuaW1h
dGlvbkVuZChkb3VibGUgaW5FbGFwc2VkVGltZSkKLXsKLSAgICBpZiAoIXNlbmRBbmltYXRpb25F
dmVudChFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRpb25FbmRFdmVudCwgaW5FbGFwc2VkVGltZSkp
IHsKLSAgICAgICAgLy8gV2UgZGlkbid0IGRpc3BhdGNoIGFuIGV2ZW50LCB3aGljaCB3b3VsZCBj
YWxsIGVuZEFuaW1hdGlvbigpLCBzbyB3ZSdsbCBqdXN0IGNhbGwgaXQgaGVyZS4KLSAgICAgICAg
ZW5kQW5pbWF0aW9uKHRydWUpOwotICAgIH0KLX0KLQotYm9vbCBLZXlmcmFtZUFuaW1hdGlvbjo6
c2VuZEFuaW1hdGlvbkV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyYgaW5FdmVudFR5cGUsIGRvdWJs
ZSBpbkVsYXBzZWRUaW1lKQotewotICAgIERvY3VtZW50OjpMaXN0ZW5lclR5cGUgbGlzdGVuZXJU
eXBlOwotICAgIGlmIChpbkV2ZW50VHlwZSA9PSBFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRpb25J
dGVyYXRpb25FdmVudCkKLSAgICAgICAgbGlzdGVuZXJUeXBlID0gRG9jdW1lbnQ6OkFOSU1BVElP
TklURVJBVElPTl9MSVNURU5FUjsKLSAgICBlbHNlIGlmIChpbkV2ZW50VHlwZSA9PSBFdmVudE5h
bWVzOjp3ZWJraXRBbmltYXRpb25FbmRFdmVudCkKLSAgICAgICAgbGlzdGVuZXJUeXBlID0gRG9j
dW1lbnQ6OkFOSU1BVElPTkVORF9MSVNURU5FUjsKLSAgICBlbHNlCi0gICAgICAgIGxpc3RlbmVy
VHlwZSA9IERvY3VtZW50OjpBTklNQVRJT05TVEFSVF9MSVNURU5FUjsKLSAgICAKLSAgICBpZiAo
c2hvdWxkU2VuZEV2ZW50Rm9yTGlzdGVuZXIobGlzdGVuZXJUeXBlKSkgewotICAgICAgICBFbGVt
ZW50KiBlbGVtZW50ID0gZWxlbWVudEZvckV2ZW50RGlzcGF0Y2goKTsKLSAgICAgICAgaWYgKGVs
ZW1lbnQpIHsKLSAgICAgICAgICAgIG1fd2FpdGluZ0ZvckVuZEV2ZW50ID0gdHJ1ZTsKLSAgICAg
ICAgICAgIG1fYW5pbWF0aW9uRXZlbnREaXNwYXRjaGVyLnN0YXJ0VGltZXIoZWxlbWVudCwgbV9u
YW1lLCAtMSwgdHJ1ZSwgaW5FdmVudFR5cGUsIGluRWxhcHNlZFRpbWUpOwotICAgICAgICAgICAg
cmV0dXJuIHRydWU7IC8vIERpZCBkaXNwYXRjaCBhbiBldmVudAotICAgICAgICB9Ci0gICAgfQot
Ci0gICAgcmV0dXJuIGZhbHNlOyAvLyBEaWQgbm90IGRpc3BhdGNoIGFuIGV2ZW50Ci19Ci0KLXZv
aWQgS2V5ZnJhbWVBbmltYXRpb246Om92ZXJyaWRlQW5pbWF0aW9ucygpCi17Ci0gICAgLy8gVGhp
cyB3aWxsIG92ZXJyaWRlIGltcGxpY2l0IGFuaW1hdGlvbnMgdGhhdCBtYXRjaCB0aGUgcHJvcGVy
dGllcyBpbiB0aGUga2V5ZnJhbWUgYW5pbWF0aW9uCi0gICAgSGFzaFNldDxpbnQ+Ojpjb25zdF9p
dGVyYXRvciBlbmQgPSBtX2tleWZyYW1lcy0+ZW5kUHJvcGVydGllcygpOwotICAgIGZvciAoSGFz
aFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVzLT5iZWdpblByb3BlcnRp
ZXMoKTsgaXQgIT0gZW5kOyArK2l0KQotICAgICAgICBjb21wb3NpdGVBbmltYXRpb24oKS0+b3Zl
cnJpZGVJbXBsaWNpdEFuaW1hdGlvbnMoKml0KTsKLX0KLQotdm9pZCBLZXlmcmFtZUFuaW1hdGlv
bjo6cmVzdW1lT3ZlcnJpZGRlbkFuaW1hdGlvbnMoKQotewotICAgIC8vIFRoaXMgd2lsbCByZXN1
bWUgb3ZlcnJpZGRlbiBpbXBsaWNpdCBhbmltYXRpb25zCi0gICAgSGFzaFNldDxpbnQ+Ojpjb25z
dF9pdGVyYXRvciBlbmQgPSBtX2tleWZyYW1lcy0+ZW5kUHJvcGVydGllcygpOwotICAgIGZvciAo
SGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVzLT5iZWdpblByb3Bl
cnRpZXMoKTsgaXQgIT0gZW5kOyArK2l0KQotICAgICAgICBjb21wb3NpdGVBbmltYXRpb24oKS0+
cmVzdW1lT3ZlcnJpZGRlbkltcGxpY2l0QW5pbWF0aW9ucygqaXQpOwotfQotCi1ib29sIEtleWZy
YW1lQW5pbWF0aW9uOjphZmZlY3RzUHJvcGVydHkoaW50IHByb3BlcnR5KSBjb25zdAotewotICAg
IEhhc2hTZXQ8aW50Pjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9rZXlmcmFtZXMtPmVuZFByb3Bl
cnRpZXMoKTsKLSAgICBmb3IgKEhhc2hTZXQ8aW50Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tl
eWZyYW1lcy0+YmVnaW5Qcm9wZXJ0aWVzKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICBp
ZiAoKCppdCkgPT0gcHJvcGVydHkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0g
ICAgcmV0dXJuIGZhbHNlOwotfQotCi1BbmltYXRpb25Db250cm9sbGVyOjpBbmltYXRpb25Db250
cm9sbGVyKEZyYW1lKiBmcmFtZSkKLTogbV9kYXRhKG5ldyBBbmltYXRpb25Db250cm9sbGVyUHJp
dmF0ZShmcmFtZSkpCi17Ci0gICAgCi19Ci0KLUFuaW1hdGlvbkNvbnRyb2xsZXI6On5BbmltYXRp
b25Db250cm9sbGVyKCkKLXsKLSAgICBkZWxldGUgbV9kYXRhOwotfQotCi12b2lkIEFuaW1hdGlv
bkNvbnRyb2xsZXI6OmNhbmNlbEFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0KiByZW5kZXJlcikKLXsK
LSAgICBpZiAoIW1fZGF0YS0+aGFzQW5pbWF0aW9ucygpKQotICAgICAgICByZXR1cm47Ci0gICAg
Ci0gICAgaWYgKG1fZGF0YS0+Y2xlYXIocmVuZGVyZXIpKQotICAgICAgICBzZXRDaGFuZ2VkKHJl
bmRlcmVyLT5lbGVtZW50KCkpOwotfQotCi1SZW5kZXJTdHlsZSogQW5pbWF0aW9uQ29udHJvbGxl
cjo6dXBkYXRlQW5pbWF0aW9ucyhSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBSZW5kZXJTdHlsZSog
bmV3U3R5bGUpCi17ICAgIAotICAgIC8vIGRvbid0IGRvIGFueXRoaW5nIGlmIHdlJ3JlIGluIHRo
ZSBjYWNoZQotICAgIGlmICghcmVuZGVyZXItPmRvY3VtZW50KCkgfHwgcmVuZGVyZXItPmRvY3Vt
ZW50KCktPmluUGFnZUNhY2hlKCkpCi0gICAgICAgIHJldHVybiBuZXdTdHlsZTsKLSAgICAKLSAg
ICBSZW5kZXJTdHlsZSogb2xkU3R5bGUgPSByZW5kZXJlci0+c3R5bGUoKTsKLSAgICAKLSAgICBp
ZiAoKCFvbGRTdHlsZSB8fCAoIW9sZFN0eWxlLT5hbmltYXRpb25zKCkgJiYgIW9sZFN0eWxlLT50
cmFuc2l0aW9ucygpKSkgJiYgCi0gICAgICAgICAgICAgICAgICAgICAgICAoIW5ld1N0eWxlLT5h
bmltYXRpb25zKCkgJiYgIW5ld1N0eWxlLT50cmFuc2l0aW9ucygpKSkKLSAgICAgICAgcmV0dXJu
IG5ld1N0eWxlOwotICAgIAotICAgIFJlbmRlclN0eWxlKiBibGVuZGVkU3R5bGUgPSBuZXdTdHls
ZTsKLSAgICAKLSAgICAvLyBGZXRjaCBvdXIgY3VycmVudCBzZXQgb2YgaW1wbGljaXQgYW5pbWF0
aW9ucyBmcm9tIGEgaGFzaHRhYmxlLiAgV2UgdGhlbiBjb21wYXJlIHRoZW0KLSAgICAvLyBhZ2Fp
bnN0IHRoZSBhbmltYXRpb25zIGluIHRoZSBzdHlsZSBhbmQgbWFrZSBzdXJlIHdlJ3JlIGluIHN5
bmMuICBJZiBkZXN0aW5hdGlvbiB2YWx1ZXMKLSAgICAvLyBoYXZlIGNoYW5nZWQsIHdlIHJlc2V0
IHRoZSBhbmltYXRpb24uICBXZSB0aGVuIGRvIGEgYmxlbmQgdG8gZ2V0IG5ldyB2YWx1ZXMgYW5k
IHdlIHJldHVybgotICAgIC8vIGEgbmV3IHN0eWxlLgotICAgIEFTU0VSVChyZW5kZXJlci0+ZWxl
bWVudCgpKTsgLy8gRklYTUU6IFdlIGRvIG5vdCBhbmltYXRlIGdlbmVyYXRlZCBjb250ZW50IHll
dC4KLSAgICAKLSAgICBDb21wb3NpdGVBbmltYXRpb24qIHJlbmRlcmVyQW5pbWF0aW9ucyA9IG1f
ZGF0YS0+YWNjZXNzQ29tcG9zaXRlQW5pbWF0aW9uKHJlbmRlcmVyKTsKLSAgICBibGVuZGVkU3R5
bGUgPSByZW5kZXJlckFuaW1hdGlvbnMtPmFuaW1hdGUocmVuZGVyZXIsIG9sZFN0eWxlLCBuZXdT
dHlsZSk7Ci0gICAgCi0gICAgbV9kYXRhLT51cGRhdGVBbmltYXRpb25UaW1lcigpOwotICAgIAot
ICAgIGlmIChibGVuZGVkU3R5bGUgIT0gbmV3U3R5bGUpIHsKLSAgICAgICAgLy8gSWYgdGhlIGFu
aW1hdGlvbnMvdHJhbnNpdGlvbnMgY2hhbmdlIG9wYWNpdHkgb3IgdHJhbnNmb3JtLCB3ZSBuZWVl
ZCB0byB1cGRhdGUKLSAgICAgICAgLy8gdGhlIHN0eWxlIHRvIGltcG9zZSB0aGUgc3RhY2tpbmcg
cnVsZXMuIE5vdGUgdGhhdCB0aGlzIGlzIGFsc28KLSAgICAgICAgLy8gZG9uZSBpbiBDU1NTdHls
ZVNlbGVjdG9yOjphZGp1c3RSZW5kZXJTdHlsZSgpLgotICAgICAgICBpZiAoYmxlbmRlZFN0eWxl
LT5oYXNBdXRvWkluZGV4KCkgJiYgKGJsZW5kZWRTdHlsZS0+b3BhY2l0eSgpIDwgMS4wZiB8fCBi
bGVuZGVkU3R5bGUtPmhhc1RyYW5zZm9ybSgpKSkKLSAgICAgICAgICAgIGJsZW5kZWRTdHlsZS0+
c2V0WkluZGV4KDApOwotICAgIH0KLSAgICByZXR1cm4gYmxlbmRlZFN0eWxlOwotfQotCi12b2lk
IEFuaW1hdGlvbkNvbnRyb2xsZXI6OnNldEFuaW1hdGlvblN0YXJ0VGltZShSZW5kZXJPYmplY3Qq
IG9iaiwgZG91YmxlIHQpCi17Ci0gICAgQ29tcG9zaXRlQW5pbWF0aW9uKiByZW5kZXJlckFuaW1h
dGlvbnMgPSBtX2RhdGEtPmFjY2Vzc0NvbXBvc2l0ZUFuaW1hdGlvbihvYmopOwotICAgIHJlbmRl
cmVyQW5pbWF0aW9ucy0+c2V0QW5pbWF0aW9uU3RhcnRUaW1lKHQpOwotfQotCi12b2lkIEFuaW1h
dGlvbkNvbnRyb2xsZXI6OnNldFRyYW5zaXRpb25TdGFydFRpbWUoUmVuZGVyT2JqZWN0KiBvYmos
IGludCBwcm9wZXJ0eSwgZG91YmxlIHQpCi17Ci0gICAgQ29tcG9zaXRlQW5pbWF0aW9uKiByZW5k
ZXJlckFuaW1hdGlvbnMgPSBtX2RhdGEtPmFjY2Vzc0NvbXBvc2l0ZUFuaW1hdGlvbihvYmopOwot
ICAgIHJlbmRlcmVyQW5pbWF0aW9ucy0+c2V0VHJhbnNpdGlvblN0YXJ0VGltZShwcm9wZXJ0eSwg
dCk7Ci19Ci0KLWJvb2wgQW5pbWF0aW9uQ29udHJvbGxlcjo6aXNBbmltYXRpbmdQcm9wZXJ0eU9u
UmVuZGVyZXIoUmVuZGVyT2JqZWN0KiBvYmosIGludCBwcm9wZXJ0eSwgYm9vbCBpc1J1bm5pbmdO
b3cpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fZGF0YS0+aXNBbmltYXRpbmdQcm9wZXJ0eU9uUmVu
ZGVyZXIob2JqLCBwcm9wZXJ0eSwgaXNSdW5uaW5nTm93KTsKLX0KLQotdm9pZCBBbmltYXRpb25D
b250cm9sbGVyOjpzdXNwZW5kQW5pbWF0aW9ucyhEb2N1bWVudCogZG9jdW1lbnQpCi17Ci0gICAg
bV9kYXRhLT5zdXNwZW5kQW5pbWF0aW9ucyhkb2N1bWVudCk7Ci19Ci0KLXZvaWQgQW5pbWF0aW9u
Q29udHJvbGxlcjo6cmVzdW1lQW5pbWF0aW9ucyhEb2N1bWVudCogZG9jdW1lbnQpCi17Ci0gICAg
bV9kYXRhLT5yZXN1bWVBbmltYXRpb25zKGRvY3VtZW50KTsKLX0KLQotdm9pZCBBbmltYXRpb25D
b250cm9sbGVyOjpzdGFydFVwZGF0ZVJlbmRlcmluZ0Rpc3BhdGNoZXIoKQotewotICAgIG1fZGF0
YS0+c3RhcnRVcGRhdGVSZW5kZXJpbmdEaXNwYXRjaGVyKCk7Ci19Ci0KLXZvaWQgQW5pbWF0aW9u
Q29udHJvbGxlcjo6c3R5bGVBdmFpbGFibGUoKQotewotICAgIG1fZGF0YS0+c3R5bGVBdmFpbGFi
bGUoKTsKLX0KLQotdm9pZCBDb21wb3NpdGVBbmltYXRpb246OnNldFdhaXRpbmdGb3JTdHlsZUF2
YWlsYWJsZShib29sIHdhaXRpbmcpCi17Ci0gICAgaWYgKHdhaXRpbmcpCi0gICAgICAgIG1fbnVt
U3R5bGVBdmFpbGFibGVXYWl0ZXJzKys7Ci0gICAgZWxzZQotICAgICAgICBtX251bVN0eWxlQXZh
aWxhYmxlV2FpdGVycy0tOwotICAgIG1fYW5pbWF0aW9uQ29udHJvbGxlci0+c2V0V2FpdGluZ0Zv
clN0eWxlQXZhaWxhYmxlKHdhaXRpbmcpOwotfQotICAgIAotfQpJbmRleDogV2ViQ29yZS9wYWdl
L0FuaW1hdGlvbkNvbnRyb2xsZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BhZ2UvQW5pbWF0
aW9uQ29udHJvbGxlci5oCShyZXZpc2lvbiAzNTk5NSkKKysrIFdlYkNvcmUvcGFnZS9BbmltYXRp
b25Db250cm9sbGVyLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENv
cHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKgotICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0g
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLiAKLSAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKLSAqICAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLiAKLSAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJ
bmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCi0gKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBt
YXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAotICogICAg
IGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4gCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRT
IENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKLSAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSAqIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElU
UyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKLSAqIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0g
KiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBU
SEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKLSAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotI2lmbmRl
ZiBBbmltYXRpb25Db250cm9sbGVyX2gKLSNkZWZpbmUgQW5pbWF0aW9uQ29udHJvbGxlcl9oCi0K
LSNpbmNsdWRlICJDU1NQcm9wZXJ0eU5hbWVzLmgiCi0KLW5hbWVzcGFjZSBXZWJDb3JlIHsKLQot
Y2xhc3MgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU7Ci1jbGFzcyBEb2N1bWVudDsKLWNsYXNz
IEZyYW1lOwotY2xhc3MgUmVuZGVyT2JqZWN0OwotY2xhc3MgUmVuZGVyU3R5bGU7Ci0KLWNsYXNz
IEFuaW1hdGlvbkNvbnRyb2xsZXIKLXsKLXB1YmxpYzoKLSAgICBBbmltYXRpb25Db250cm9sbGVy
KEZyYW1lKik7Ci0gICAgfkFuaW1hdGlvbkNvbnRyb2xsZXIoKTsKLSAgICAKLSAgICB2b2lkIGNh
bmNlbEFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0Kik7Ci0gICAgUmVuZGVyU3R5bGUqIHVwZGF0ZUFu
aW1hdGlvbnMoUmVuZGVyT2JqZWN0KiwgUmVuZGVyU3R5bGUqIG5ld1N0eWxlKTsKLSAgICAKLSAg
ICB2b2lkIHNldEFuaW1hdGlvblN0YXJ0VGltZShSZW5kZXJPYmplY3QqIG9iaiwgZG91YmxlIHQp
OwotICAgIHZvaWQgc2V0VHJhbnNpdGlvblN0YXJ0VGltZShSZW5kZXJPYmplY3QqIG9iaiwgaW50
IHByb3BlcnR5LCBkb3VibGUgdCk7Ci0gICAgCi0gICAgYm9vbCBpc0FuaW1hdGluZ1Byb3BlcnR5
T25SZW5kZXJlcihSZW5kZXJPYmplY3QqIG9iaiwgaW50IHByb3BlcnR5LCBib29sIGlzUnVubmlu
Z05vdykgY29uc3Q7Ci0gICAgCi0gICAgdm9pZCBzdXNwZW5kQW5pbWF0aW9ucyhEb2N1bWVudCog
ZG9jdW1lbnQpOwotICAgIHZvaWQgcmVzdW1lQW5pbWF0aW9ucyhEb2N1bWVudCogZG9jdW1lbnQp
OwotICAgIHZvaWQgdXBkYXRlQW5pbWF0aW9uVGltZXIoKTsKLSAgICAKLSAgICB2b2lkIHN0YXJ0
VXBkYXRlUmVuZGVyaW5nRGlzcGF0Y2hlcigpOwotICAgIAotICAgIHZvaWQgc3R5bGVBdmFpbGFi
bGUoKTsKLSAgICAKLXByaXZhdGU6Ci0gICAgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGUqIG1f
ZGF0YTsKLSAgICAKLX07Ci0KLX0KLQotI2VuZGlmCkluZGV4OiBXZWJDb3JlL3BhZ2UvYW5pbWF0
aW9uL0FuaW1hdGlvbkJhc2UuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGFnZS9hbmltYXRp
b24vQW5pbWF0aW9uQmFzZS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BhZ2UvYW5pbWF0
aW9uL0FuaW1hdGlvbkJhc2UuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDgyMSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1
dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1
dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAor
ICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4g
cGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBB
TkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQK
KyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkFuaW1hdGlvbkJhc2UuaCIKKyNpbmNsdWRl
ICJBbmltYXRpb25Db250cm9sbGVyLmgiCisjaW5jbHVkZSAiS2V5ZnJhbWVBbmltYXRpb24uaCIK
KyNpbmNsdWRlICJJbXBsaWNpdEFuaW1hdGlvbi5oIgorI2luY2x1ZGUgIkNvbXBvc2l0ZUFuaW1h
dGlvbi5oIgorCisjaW5jbHVkZSAiQ1NTUHJvcGVydHlOYW1lcy5oIgorI2luY2x1ZGUgIkNTdHJp
bmcuaCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIKKyNp
bmNsdWRlICJGbG9hdENvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUg
IlJlbmRlck9iamVjdC5oIgorI2luY2x1ZGUgIlJlbmRlclN0eWxlLmgiCisjaW5jbHVkZSAiU3lz
dGVtVGltZS5oIgorI2luY2x1ZGUgIlVuaXRCZXppZXIuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitzdGF0aWMgY29uc3QgZG91YmxlIGNBbmltYXRpb25UaW1lckRlbGF5ID0gMC4wMjU7CisK
Ky8vIFRoZSBlcHNpbG9uIHZhbHVlIHdlIHBhc3MgdG8gVW5pdEJlemllcjo6c29sdmUgZ2l2ZW4g
dGhhdCB0aGUgYW5pbWF0aW9uIGlzIGdvaW5nIHRvIHJ1biBvdmVyIHxkdXJ8IHNlY29uZHMuIFRo
ZSBsb25nZXIgdGhlCisvLyBhbmltYXRpb24sIHRoZSBtb3JlIHByZWNpc2lvbiB3ZSBuZWVkIGlu
IHRoZSB0aW1pbmcgZnVuY3Rpb24gcmVzdWx0IHRvIGF2b2lkIHVnbHkgZGlzY29udGludWl0aWVz
Lgorc3RhdGljIGlubGluZSBkb3VibGUgc29sdmVFcHNpbG9uKGRvdWJsZSBkdXJhdGlvbikgeyBy
ZXR1cm4gMS4gLyAoMjAwLiAqIGR1cmF0aW9uKTsgfQorCitzdGF0aWMgaW5saW5lIGRvdWJsZSBz
b2x2ZUN1YmljQmV6aWVyRnVuY3Rpb24oZG91YmxlIHAxeCwgZG91YmxlIHAxeSwgZG91YmxlIHAy
eCwgZG91YmxlIHAyeSwgZG91YmxlIHQsIGRvdWJsZSBkdXJhdGlvbikKK3sKKyAgICAvLyBDb252
ZXJ0IGZyb20gaW5wdXQgdGltZSB0byBwYXJhbWV0cmljIHZhbHVlIGluIGN1cnZlLCB0aGVuIGZy
b20KKyAgICAvLyB0aGF0IHRvIG91dHB1dCB0aW1lLgorICAgIFVuaXRCZXppZXIgYmV6aWVyKHAx
eCwgcDF5LCBwMngsIHAyeSk7CisgICAgcmV0dXJuIGJlemllci5zb2x2ZSh0LCBzb2x2ZUVwc2ls
b24oZHVyYXRpb24pKTsKK30KKwordm9pZCBBbmltYXRpb25UaW1lckNhbGxiYWNrOjp0aW1lckZp
cmVkKFRpbWVyPEFuaW1hdGlvblRpbWVyQmFzZT4qKQoreworICAgIG1fYW5pbS0+YW5pbWF0aW9u
VGltZXJDYWxsYmFja0ZpcmVkKG1fZXZlbnRUeXBlLCBtX2VsYXBzZWRUaW1lKTsKK30KKworQW5p
bWF0aW9uRXZlbnREaXNwYXRjaGVyOjpBbmltYXRpb25FdmVudERpc3BhdGNoZXIoQW5pbWF0aW9u
QmFzZSogYW5pbSkgCis6IEFuaW1hdGlvblRpbWVyQmFzZShhbmltKQorLCBtX3Byb3BlcnR5KENT
U1Byb3BlcnR5SW52YWxpZCkKKywgbV9yZXNldChmYWxzZSkKKywgbV9lbGFwc2VkVGltZSgtMSkK
K3sKK30KKwordm9pZCBBbmltYXRpb25FdmVudERpc3BhdGNoZXI6OnRpbWVyRmlyZWQoVGltZXI8
QW5pbWF0aW9uVGltZXJCYXNlPiopCit7CisgICAgbV9hbmltLT5hbmltYXRpb25FdmVudERpc3Bh
dGNoZXJGaXJlZChtX2VsZW1lbnQuZ2V0KCksIG1fbmFtZSwgbV9wcm9wZXJ0eSwgbV9yZXNldCwg
bV9ldmVudFR5cGUsIG1fZWxhcHNlZFRpbWUpOworfQorCitzdGF0aWMgaW5saW5lIGludCBibGVu
ZEZ1bmMoaW50IGZyb20sIGludCB0bywgZG91YmxlIHByb2dyZXNzKQoreyAgCisgICAgcmV0dXJu
IGludChmcm9tICsgKHRvIC0gZnJvbSkgKiBwcm9ncmVzcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUg
ZG91YmxlIGJsZW5kRnVuYyhkb3VibGUgZnJvbSwgZG91YmxlIHRvLCBkb3VibGUgcHJvZ3Jlc3Mp
Cit7ICAKKyAgICByZXR1cm4gZnJvbSArICh0byAtIGZyb20pICogcHJvZ3Jlc3M7Cit9CisKK3N0
YXRpYyBpbmxpbmUgZmxvYXQgYmxlbmRGdW5jKGZsb2F0IGZyb20sIGZsb2F0IHRvLCBkb3VibGUg
cHJvZ3Jlc3MpCit7ICAKKyAgICByZXR1cm4gbmFycm93UHJlY2lzaW9uVG9GbG9hdChmcm9tICsg
KHRvIC0gZnJvbSkgKiBwcm9ncmVzcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgQ29sb3IgYmxlbmRG
dW5jKGNvbnN0IENvbG9yJiBmcm9tLCBjb25zdCBDb2xvciYgdG8sIGRvdWJsZSBwcm9ncmVzcykK
K3sgIAorICAgIHJldHVybiBDb2xvcihibGVuZEZ1bmMoZnJvbS5yZWQoKSwgdG8ucmVkKCksIHBy
b2dyZXNzKSwKKyAgICAgICAgICAgICAgICAgYmxlbmRGdW5jKGZyb20uZ3JlZW4oKSwgdG8uZ3Jl
ZW4oKSwgcHJvZ3Jlc3MpLAorICAgICAgICAgICAgICAgICBibGVuZEZ1bmMoZnJvbS5ibHVlKCks
IHRvLmJsdWUoKSwgcHJvZ3Jlc3MpLAorICAgICAgICAgICAgICAgICBibGVuZEZ1bmMoZnJvbS5h
bHBoYSgpLCB0by5hbHBoYSgpLCBwcm9ncmVzcykpOworfQorCitzdGF0aWMgaW5saW5lIExlbmd0
aCBibGVuZEZ1bmMoY29uc3QgTGVuZ3RoJiBmcm9tLCBjb25zdCBMZW5ndGgmIHRvLCBkb3VibGUg
cHJvZ3Jlc3MpCit7ICAKKyAgICByZXR1cm4gdG8uYmxlbmQoZnJvbSwgcHJvZ3Jlc3MpOworfQor
CitzdGF0aWMgaW5saW5lIEludFNpemUgYmxlbmRGdW5jKGNvbnN0IEludFNpemUmIGZyb20sIGNv
bnN0IEludFNpemUmIHRvLCBkb3VibGUgcHJvZ3Jlc3MpCit7ICAKKyAgICByZXR1cm4gSW50U2l6
ZShibGVuZEZ1bmMoZnJvbS53aWR0aCgpLCB0by53aWR0aCgpLCBwcm9ncmVzcyksCisgICAgICAg
ICAgICAgICAgICAgYmxlbmRGdW5jKGZyb20uaGVpZ2h0KCksIHRvLmhlaWdodCgpLCBwcm9ncmVz
cykpOworfQorCitzdGF0aWMgaW5saW5lIFNoYWRvd0RhdGEqIGJsZW5kRnVuYyhjb25zdCBTaGFk
b3dEYXRhKiBmcm9tLCBjb25zdCBTaGFkb3dEYXRhKiB0bywgZG91YmxlIHByb2dyZXNzKQoreyAg
CisgICAgQVNTRVJUKGZyb20gJiYgdG8pOworICAgIHJldHVybiBuZXcgU2hhZG93RGF0YShibGVu
ZEZ1bmMoZnJvbS0+eCwgdG8tPngsIHByb2dyZXNzKSwgYmxlbmRGdW5jKGZyb20tPnksIHRvLT55
LCBwcm9ncmVzcyksIAorICAgICAgICAgICAgICAgICAgICAgICAgICBibGVuZEZ1bmMoZnJvbS0+
Ymx1ciwgdG8tPmJsdXIsIHByb2dyZXNzKSwgYmxlbmRGdW5jKGZyb20tPmNvbG9yLCB0by0+Y29s
b3IsIHByb2dyZXNzKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgVHJhbnNmb3JtT3BlcmF0aW9ucyBi
bGVuZEZ1bmMoY29uc3QgVHJhbnNmb3JtT3BlcmF0aW9ucyYgZnJvbSwgY29uc3QgVHJhbnNmb3Jt
T3BlcmF0aW9ucyYgdG8sIGRvdWJsZSBwcm9ncmVzcykKK3sgICAgCisgICAgLy8gQmxlbmQgYW55
IG9wZXJhdGlvbnMgd2hvc2UgdHlwZXMgYWN0dWFsbHkgbWF0Y2ggdXAuICBPdGhlcndpc2UgZG9u
J3QgYm90aGVyLgorICAgIHVuc2lnbmVkIGZyb21TaXplID0gZnJvbS5zaXplKCk7CisgICAgdW5z
aWduZWQgdG9TaXplID0gdG8uc2l6ZSgpOworICAgIHVuc2lnbmVkIHNpemUgPSBtYXgoZnJvbVNp
emUsIHRvU2l6ZSk7CisgICAgVHJhbnNmb3JtT3BlcmF0aW9ucyByZXN1bHQ7CisgICAgZm9yICh1
bnNpZ25lZCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBSZWZQdHI8VHJhbnNmb3Jt
T3BlcmF0aW9uPiBmcm9tT3AgPSBpIDwgZnJvbVNpemUgPyBmcm9tW2ldIDogMDsKKyAgICAgICAg
UmVmUHRyPFRyYW5zZm9ybU9wZXJhdGlvbj4gdG9PcCA9IGkgPCB0b1NpemUgPyB0b1tpXSA6IDA7
CisgICAgICAgIFJlZlB0cjxUcmFuc2Zvcm1PcGVyYXRpb24+IGJsZW5kZWRPcCA9IHRvT3AgPyB0
b09wLT5ibGVuZChmcm9tT3AuZ2V0KCksIHByb2dyZXNzKSA6IGZyb21PcC0+YmxlbmQoMCwgcHJv
Z3Jlc3MsIHRydWUpOworICAgICAgICBpZiAoYmxlbmRlZE9wKQorICAgICAgICAgICAgcmVzdWx0
LmFwcGVuZChibGVuZGVkT3ApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0
aWMgaW5saW5lIEVWaXNpYmlsaXR5IGJsZW5kRnVuYyhFVmlzaWJpbGl0eSBmcm9tLCBFVmlzaWJp
bGl0eSB0bywgZG91YmxlIHByb2dyZXNzKQoreworICAgIC8vIEFueSBub24temVybyByZXN1bHQg
bWVhbnMgd2UgY29uc2lkZXIgdGhlIG9iamVjdCB0byBiZSB2aXNpYmxlLiAgT25seSBhdCAwIGRv
IHdlIGNvbnNpZGVyIHRoZSBvYmplY3QgdG8gYmUKKyAgICAvLyBpbnZpc2libGUuICAgVGhlIGlu
dmlzaWJsZSB2YWx1ZSB3ZSB1c2UgKEhJRERFTiB2cy4gQ09MTEFQU0UpIGRlcGVuZHMgb24gdGhl
IHNwZWNpZmllZCBmcm9tL3RvIHZhbHVlcy4KKyAgICBkb3VibGUgZnJvbVZhbCA9IGZyb20gPT0g
VklTSUJMRSA/IDEuIDogMC47CisgICAgZG91YmxlIHRvVmFsID0gdG8gPT0gVklTSUJMRSA/IDEu
IDogMC47CisgICAgaWYgKGZyb21WYWwgPT0gdG9WYWwpCisgICAgICAgIHJldHVybiB0bzsKKyAg
ICBkb3VibGUgcmVzdWx0ID0gYmxlbmRGdW5jKGZyb21WYWwsIHRvVmFsLCBwcm9ncmVzcyk7Cisg
ICAgcmV0dXJuIHJlc3VsdCA+IDAuID8gVklTSUJMRSA6ICh0byAhPSBWSVNJQkxFID8gdG8gOiBm
cm9tKTsKK30KKworY2xhc3MgUHJvcGVydHlXcmFwcGVyQmFzZSB7CitwdWJsaWM6CisgICAgUHJv
cGVydHlXcmFwcGVyQmFzZShpbnQgcHJvcCkKKyAgICA6IG1fcHJvcChwcm9wKQorICAgIHsgfQor
ICAgIHZpcnR1YWwgflByb3BlcnR5V3JhcHBlckJhc2UoKSB7IH0KKyAgICB2aXJ0dWFsIGJvb2wg
ZXF1YWxzKGNvbnN0IFJlbmRlclN0eWxlKiBhLCBjb25zdCBSZW5kZXJTdHlsZSogYikgY29uc3Q9
MDsKKyAgICB2aXJ0dWFsIHZvaWQgYmxlbmQoUmVuZGVyU3R5bGUqIGRzdCwgY29uc3QgUmVuZGVy
U3R5bGUqIGEsIGNvbnN0IFJlbmRlclN0eWxlKiBiLCBkb3VibGUgcHJvZykgY29uc3Q9MDsKKyAg
ICAKKyAgICBpbnQgcHJvcGVydHkoKSBjb25zdCB7IHJldHVybiBtX3Byb3A7IH0KKyAgICAKK3By
aXZhdGU6CisgICAgaW50IG1fcHJvcDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xh
c3MgUHJvcGVydHlXcmFwcGVyR2V0dGVyIDogcHVibGljIFByb3BlcnR5V3JhcHBlckJhc2Ugewor
cHVibGljOgorICAgIFByb3BlcnR5V3JhcHBlckdldHRlcihpbnQgcHJvcCwgVCAoUmVuZGVyU3R5
bGU6OipnZXR0ZXIpKCkgY29uc3QpCisgICAgOiBQcm9wZXJ0eVdyYXBwZXJCYXNlKHByb3ApCisg
ICAgLCBtX2dldHRlcihnZXR0ZXIpCisgICAgeyB9CisgICAgCisgICAgdmlydHVhbCBib29sIGVx
dWFscyhjb25zdCBSZW5kZXJTdHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUqIGIpIGNvbnN0Cisg
ICAgeworICAgICAgICByZXR1cm4gKGEtPiptX2dldHRlcikoKSA9PSAoYi0+Km1fZ2V0dGVyKSgp
OworICAgIH0KKyAgICAKK3Byb3RlY3RlZDoKKyAgICBUIChSZW5kZXJTdHlsZTo6Km1fZ2V0dGVy
KSgpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBQcm9wZXJ0eVdy
YXBwZXIgOiBwdWJsaWMgUHJvcGVydHlXcmFwcGVyR2V0dGVyPFQ+IHsKK3B1YmxpYzoKKyAgICBQ
cm9wZXJ0eVdyYXBwZXIoaW50IHByb3AsIFQgKFJlbmRlclN0eWxlOjoqZ2V0dGVyKSgpIGNvbnN0
LCB2b2lkIChSZW5kZXJTdHlsZTo6KnNldHRlcikoVCkpCisgICAgOiBQcm9wZXJ0eVdyYXBwZXJH
ZXR0ZXI8VD4ocHJvcCwgZ2V0dGVyKQorICAgICwgbV9zZXR0ZXIoc2V0dGVyKQorICAgIHsgfQor
ICAgIAorICAgIHZpcnR1YWwgdm9pZCBibGVuZChSZW5kZXJTdHlsZSogZHN0LCBjb25zdCBSZW5k
ZXJTdHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUqIGIsIGRvdWJsZSBwcm9nKSBjb25zdAorICAg
IHsKKyAgICAgICAgKGRzdC0+Km1fc2V0dGVyKShibGVuZEZ1bmMoKGEtPipQcm9wZXJ0eVdyYXBw
ZXJHZXR0ZXI8VD46Om1fZ2V0dGVyKSgpLCAoYi0+KlByb3BlcnR5V3JhcHBlckdldHRlcjxUPjo6
bV9nZXR0ZXIpKCksIHByb2cpKTsKKyAgICB9CisgICAgCitwcm90ZWN0ZWQ6CisgICAgdm9pZCAo
UmVuZGVyU3R5bGU6OiptX3NldHRlcikoVCk7Cit9OworCitjbGFzcyBQcm9wZXJ0eVdyYXBwZXJT
aGFkb3cgOiBwdWJsaWMgUHJvcGVydHlXcmFwcGVyR2V0dGVyPFNoYWRvd0RhdGEqPiB7CitwdWJs
aWM6CisgICAgUHJvcGVydHlXcmFwcGVyU2hhZG93KGludCBwcm9wLCBTaGFkb3dEYXRhKiAoUmVu
ZGVyU3R5bGU6OipnZXR0ZXIpKCkgY29uc3QsIHZvaWQgKFJlbmRlclN0eWxlOjoqc2V0dGVyKShT
aGFkb3dEYXRhKiwgYm9vbCkpCisgICAgOiBQcm9wZXJ0eVdyYXBwZXJHZXR0ZXI8U2hhZG93RGF0
YSo+KHByb3AsIGdldHRlcikKKyAgICAsIG1fc2V0dGVyKHNldHRlcikKKyAgICB7IH0KKyAgICAK
KyAgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IFJlbmRlclN0eWxlKiBhLCBjb25zdCBSZW5k
ZXJTdHlsZSogYikgY29uc3QKKyAgICB7CisgICAgICAgIFNoYWRvd0RhdGEqIHNoYWRvd2EgPSAo
YS0+Km1fZ2V0dGVyKSgpOworICAgICAgICBTaGFkb3dEYXRhKiBzaGFkb3diID0gKGItPiptX2dl
dHRlcikoKTsKKyAgICAgICAgCisgICAgICAgIGlmICghc2hhZG93YSAmJiBzaGFkb3diIHx8IHNo
YWRvd2EgJiYgIXNoYWRvd2IpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlm
IChzaGFkb3dhICYmIHNoYWRvd2IgJiYgKCpzaGFkb3dhICE9ICpzaGFkb3diKSkKKyAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAg
IHZpcnR1YWwgdm9pZCBibGVuZChSZW5kZXJTdHlsZSogZHN0LCBjb25zdCBSZW5kZXJTdHlsZSog
YSwgY29uc3QgUmVuZGVyU3R5bGUqIGIsIGRvdWJsZSBwcm9nKSBjb25zdAorICAgIHsKKyAgICAg
ICAgU2hhZG93RGF0YSogc2hhZG93YSA9IChhLT4qbV9nZXR0ZXIpKCk7CisgICAgICAgIFNoYWRv
d0RhdGEqIHNoYWRvd2IgPSAoYi0+Km1fZ2V0dGVyKSgpOworICAgICAgICBTaGFkb3dEYXRhIGRl
ZmF1bHRTaGFkb3dEYXRhKDAsIDAsIDAsIENvbG9yOjp0cmFuc3BhcmVudCk7CisgICAgICAgIAor
ICAgICAgICBpZiAoIXNoYWRvd2EpCisgICAgICAgICAgICBzaGFkb3dhID0gJmRlZmF1bHRTaGFk
b3dEYXRhOworICAgICAgICBpZiAoIXNoYWRvd2IpCisgICAgICAgICAgICBzaGFkb3diID0gJmRl
ZmF1bHRTaGFkb3dEYXRhOworICAgICAgICAKKyAgICAgICAgKGRzdC0+Km1fc2V0dGVyKShibGVu
ZEZ1bmMoc2hhZG93YSwgc2hhZG93YiwgcHJvZyksIGZhbHNlKTsKKyAgICB9CisgICAgCitwcml2
YXRlOgorICAgIHZvaWQgKFJlbmRlclN0eWxlOjoqbV9zZXR0ZXIpKFNoYWRvd0RhdGEqLCBib29s
KTsKK307CisKK2NsYXNzIFByb3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENvbG9yIDogcHVibGlj
IFByb3BlcnR5V3JhcHBlckJhc2UgeworcHVibGljOgorICAgIFByb3BlcnR5V3JhcHBlck1heWJl
SW52YWxpZENvbG9yKGludCBwcm9wLCBjb25zdCBDb2xvciYgKFJlbmRlclN0eWxlOjoqZ2V0dGVy
KSgpIGNvbnN0LCB2b2lkIChSZW5kZXJTdHlsZTo6KnNldHRlcikoY29uc3QgQ29sb3ImKSkKKyAg
ICA6IFByb3BlcnR5V3JhcHBlckJhc2UocHJvcCkKKyAgICAsIG1fZ2V0dGVyKGdldHRlcikKKyAg
ICAsIG1fc2V0dGVyKHNldHRlcikKKyAgICB7IH0KKyAgICAKKyAgICB2aXJ0dWFsIGJvb2wgZXF1
YWxzKGNvbnN0IFJlbmRlclN0eWxlKiBhLCBjb25zdCBSZW5kZXJTdHlsZSogYikgY29uc3QKKyAg
ICB7CisgICAgICAgIENvbG9yIGZyb21Db2xvciA9IChhLT4qbV9nZXR0ZXIpKCk7CisgICAgICAg
IENvbG9yIHRvQ29sb3IgPSAoYi0+Km1fZ2V0dGVyKSgpOworICAgICAgICBpZiAoIWZyb21Db2xv
ci5pc1ZhbGlkKCkpCisgICAgICAgICAgICBmcm9tQ29sb3IgPSBhLT5jb2xvcigpOworICAgICAg
ICBpZiAoIXRvQ29sb3IuaXNWYWxpZCgpKQorICAgICAgICAgICAgdG9Db2xvciA9IGItPmNvbG9y
KCk7CisgICAgICAgIAorICAgICAgICByZXR1cm4gZnJvbUNvbG9yID09IHRvQ29sb3I7CisgICAg
fQorICAgIAorICAgIHZpcnR1YWwgdm9pZCBibGVuZChSZW5kZXJTdHlsZSogZHN0LCBjb25zdCBS
ZW5kZXJTdHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUqIGIsIGRvdWJsZSBwcm9nKSBjb25zdAor
ICAgIHsKKyAgICAgICAgQ29sb3IgZnJvbUNvbG9yID0gKGEtPiptX2dldHRlcikoKTsKKyAgICAg
ICAgQ29sb3IgdG9Db2xvciA9IChiLT4qbV9nZXR0ZXIpKCk7CisgICAgICAgIGlmICghZnJvbUNv
bG9yLmlzVmFsaWQoKSkKKyAgICAgICAgICAgIGZyb21Db2xvciA9IGEtPmNvbG9yKCk7CisgICAg
ICAgIGlmICghdG9Db2xvci5pc1ZhbGlkKCkpCisgICAgICAgICAgICB0b0NvbG9yID0gYi0+Y29s
b3IoKTsKKyAgICAgICAgKGRzdC0+Km1fc2V0dGVyKShibGVuZEZ1bmMoZnJvbUNvbG9yLCB0b0Nv
bG9yLCBwcm9nKSk7CisgICAgfQorICAgIAorcHJpdmF0ZToKKyAgICBjb25zdCBDb2xvciYgKFJl
bmRlclN0eWxlOjoqbV9nZXR0ZXIpKCkgY29uc3Q7CisgICAgdm9pZCAoUmVuZGVyU3R5bGU6Oipt
X3NldHRlcikoY29uc3QgQ29sb3ImKTsKK307CisKK1ZlY3RvcjxQcm9wZXJ0eVdyYXBwZXJCYXNl
Kj4qIGdQcm9wZXJ0eVdyYXBwZXJzID0gMDsKK2ludCBnUHJvcGVydHlXcmFwcGVyTWFwW251bUNT
U1Byb3BlcnRpZXNdOworCitzdGF0aWMgdm9pZCBlbnN1cmVQcm9wZXJ0eU1hcCgpCit7CisgICAg
Ly8gRklYTUU6IFRoaXMgZGF0YSBpcyBuZXZlciBkZXN0cm95ZWQuIE1heWJlIHdlIHNob3VsZCBy
ZWYgY291bnQgaXQgYW5kIHRvc3MgaXQgd2hlbiB0aGUgbGFzdCBBbmltYXRpb25Db250cm9sbGVy
IGlzIGRlc3Ryb3llZD8KKyAgICBpZiAoZ1Byb3BlcnR5V3JhcHBlcnMgPT0gMCkgeworICAgICAg
ICBnUHJvcGVydHlXcmFwcGVycyA9IG5ldyBWZWN0b3I8UHJvcGVydHlXcmFwcGVyQmFzZSo+KCk7
CisgICAgICAgIAorICAgICAgICAvLyBidWlsZCB0aGUgbGlzdCBvZiBwcm9wZXJ0eSB3cmFwcGVy
cyB0byBkbyB0aGUgY29tcGFyaXNvbnMgYW5kIGJsZW5kcworICAgICAgICBnUHJvcGVydHlXcmFw
cGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eUxlZnQs
ICZSZW5kZXJTdHlsZTo6bGVmdCwgJlJlbmRlclN0eWxlOjpzZXRMZWZ0KSk7CisgICAgICAgIGdQ
cm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1By
b3BlcnR5UmlnaHQsICZSZW5kZXJTdHlsZTo6cmlnaHQsICZSZW5kZXJTdHlsZTo6c2V0UmlnaHQp
KTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVy
PExlbmd0aD4oQ1NTUHJvcGVydHlUb3AsICZSZW5kZXJTdHlsZTo6dG9wLCAmUmVuZGVyU3R5bGU6
OnNldFRvcCkpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0
eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eUJvdHRvbSwgJlJlbmRlclN0eWxlOjpib3R0b20s
ICZSZW5kZXJTdHlsZTo6c2V0Qm90dG9tKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5h
cHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5V2lkdGgsICZSZW5k
ZXJTdHlsZTo6d2lkdGgsICZSZW5kZXJTdHlsZTo6c2V0V2lkdGgpKTsKKyAgICAgICAgZ1Byb3Bl
cnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVy
dHlIZWlnaHQsICZSZW5kZXJTdHlsZTo6aGVpZ2h0LCAmUmVuZGVyU3R5bGU6OnNldEhlaWdodCkp
OworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8
dW5zaWduZWQgc2hvcnQ+KENTU1Byb3BlcnR5Qm9yZGVyTGVmdFdpZHRoLCAmUmVuZGVyU3R5bGU6
OmJvcmRlckxlZnRXaWR0aCwgJlJlbmRlclN0eWxlOjpzZXRCb3JkZXJMZWZ0V2lkdGgpKTsKKyAg
ICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPHVuc2ln
bmVkIHNob3J0PihDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0V2lkdGgsICZSZW5kZXJTdHlsZTo6Ym9y
ZGVyUmlnaHRXaWR0aCwgJlJlbmRlclN0eWxlOjpzZXRCb3JkZXJSaWdodFdpZHRoKSk7CisgICAg
ICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjx1bnNpZ25l
ZCBzaG9ydD4oQ1NTUHJvcGVydHlCb3JkZXJUb3BXaWR0aCwgJlJlbmRlclN0eWxlOjpib3JkZXJU
b3BXaWR0aCwgJlJlbmRlclN0eWxlOjpzZXRCb3JkZXJUb3BXaWR0aCkpOworICAgICAgICBnUHJv
cGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8dW5zaWduZWQgc2hvcnQ+
KENTU1Byb3BlcnR5Qm9yZGVyQm90dG9tV2lkdGgsICZSZW5kZXJTdHlsZTo6Ym9yZGVyQm90dG9t
V2lkdGgsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyQm90dG9tV2lkdGgpKTsKKyAgICAgICAgZ1By
b3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJv
cGVydHlNYXJnaW5MZWZ0LCAmUmVuZGVyU3R5bGU6Om1hcmdpbkxlZnQsICZSZW5kZXJTdHlsZTo6
c2V0TWFyZ2luTGVmdCkpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQ
cm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eU1hcmdpblJpZ2h0LCAmUmVuZGVyU3R5
bGU6Om1hcmdpblJpZ2h0LCAmUmVuZGVyU3R5bGU6OnNldE1hcmdpblJpZ2h0KSk7CisgICAgICAg
IGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENT
U1Byb3BlcnR5TWFyZ2luVG9wLCAmUmVuZGVyU3R5bGU6Om1hcmdpblRvcCwgJlJlbmRlclN0eWxl
OjpzZXRNYXJnaW5Ub3ApKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcg
UHJvcGVydHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlNYXJnaW5Cb3R0b20sICZSZW5kZXJT
dHlsZTo6bWFyZ2luQm90dG9tLCAmUmVuZGVyU3R5bGU6OnNldE1hcmdpbkJvdHRvbSkpOworICAg
ICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3Ro
PihDU1NQcm9wZXJ0eVBhZGRpbmdMZWZ0LCAmUmVuZGVyU3R5bGU6OnBhZGRpbmdMZWZ0LCAmUmVu
ZGVyU3R5bGU6OnNldFBhZGRpbmdMZWZ0KSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5h
cHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5UGFkZGluZ1JpZ2h0
LCAmUmVuZGVyU3R5bGU6OnBhZGRpbmdSaWdodCwgJlJlbmRlclN0eWxlOjpzZXRQYWRkaW5nUmln
aHQpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFw
cGVyPExlbmd0aD4oQ1NTUHJvcGVydHlQYWRkaW5nVG9wLCAmUmVuZGVyU3R5bGU6OnBhZGRpbmdU
b3AsICZSZW5kZXJTdHlsZTo6c2V0UGFkZGluZ1RvcCkpOworICAgICAgICBnUHJvcGVydHlXcmFw
cGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eVBhZGRp
bmdCb3R0b20sICZSZW5kZXJTdHlsZTo6cGFkZGluZ0JvdHRvbSwgJlJlbmRlclN0eWxlOjpzZXRQ
YWRkaW5nQm90dG9tKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFBy
b3BlcnR5V3JhcHBlcjxmbG9hdD4oQ1NTUHJvcGVydHlPcGFjaXR5LCAmUmVuZGVyU3R5bGU6Om9w
YWNpdHksICZSZW5kZXJTdHlsZTo6c2V0T3BhY2l0eSkpOworICAgICAgICBnUHJvcGVydHlXcmFw
cGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8Y29uc3QgQ29sb3ImPihDU1NQcm9wZXJ0
eUNvbG9yLCAmUmVuZGVyU3R5bGU6OmNvbG9yLCAmUmVuZGVyU3R5bGU6OnNldENvbG9yKSk7Cisg
ICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxjb25z
dCBDb2xvciY+KENTU1Byb3BlcnR5QmFja2dyb3VuZENvbG9yLCAmUmVuZGVyU3R5bGU6OmJhY2tn
cm91bmRDb2xvciwgJlJlbmRlclN0eWxlOjpzZXRCYWNrZ3JvdW5kQ29sb3IpKTsKKyAgICAgICAg
Z1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPGludD4oQ1NTUHJv
cGVydHlGb250U2l6ZSwgJlJlbmRlclN0eWxlOjpmb250U2l6ZSwgJlJlbmRlclN0eWxlOjpzZXRC
bGVuZGVkRm9udFNpemUpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcg
UHJvcGVydHlXcmFwcGVyPHVuc2lnbmVkIHNob3J0PihDU1NQcm9wZXJ0eVdlYmtpdENvbHVtblJ1
bGVXaWR0aCwgJlJlbmRlclN0eWxlOjpjb2x1bW5SdWxlV2lkdGgsICZSZW5kZXJTdHlsZTo6c2V0
Q29sdW1uUnVsZVdpZHRoKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3
IFByb3BlcnR5V3JhcHBlcjxmbG9hdD4oQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5HYXAsICZSZW5k
ZXJTdHlsZTo6Y29sdW1uR2FwLCAmUmVuZGVyU3R5bGU6OnNldENvbHVtbkdhcCkpOworICAgICAg
ICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8dW5zaWduZWQg
c2hvcnQ+KENTU1Byb3BlcnR5V2Via2l0Q29sdW1uQ291bnQsICZSZW5kZXJTdHlsZTo6Y29sdW1u
Q291bnQsICZSZW5kZXJTdHlsZTo6c2V0Q29sdW1uQ291bnQpKTsKKyAgICAgICAgZ1Byb3BlcnR5
V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPGZsb2F0PihDU1NQcm9wZXJ0eVdl
YmtpdENvbHVtbldpZHRoLCAmUmVuZGVyU3R5bGU6OmNvbHVtbldpZHRoLCAmUmVuZGVyU3R5bGU6
OnNldENvbHVtbldpZHRoKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3
IFByb3BlcnR5V3JhcHBlcjxzaG9ydD4oQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJIb3Jpem9udGFs
U3BhY2luZywgJlJlbmRlclN0eWxlOjpob3Jpem9udGFsQm9yZGVyU3BhY2luZywgJlJlbmRlclN0
eWxlOjpzZXRIb3Jpem9udGFsQm9yZGVyU3BhY2luZykpOworICAgICAgICBnUHJvcGVydHlXcmFw
cGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8c2hvcnQ+KENTU1Byb3BlcnR5V2Via2l0
Qm9yZGVyVmVydGljYWxTcGFjaW5nLCAmUmVuZGVyU3R5bGU6OnZlcnRpY2FsQm9yZGVyU3BhY2lu
ZywgJlJlbmRlclN0eWxlOjpzZXRWZXJ0aWNhbEJvcmRlclNwYWNpbmcpKTsKKyAgICAgICAgZ1By
b3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPGludD4oQ1NTUHJvcGVy
dHlaSW5kZXgsICZSZW5kZXJTdHlsZTo6ekluZGV4LCAmUmVuZGVyU3R5bGU6OnNldFpJbmRleCkp
OworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8
TGVuZ3RoPihDU1NQcm9wZXJ0eUxpbmVIZWlnaHQsICZSZW5kZXJTdHlsZTo6bGluZUhlaWdodCwg
JlJlbmRlclN0eWxlOjpzZXRMaW5lSGVpZ2h0KSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJz
LT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxpbnQ+KENTU1Byb3BlcnR5T3V0bGluZU9mZnNl
dCwgJlJlbmRlclN0eWxlOjpvdXRsaW5lT2Zmc2V0LCAmUmVuZGVyU3R5bGU6OnNldE91dGxpbmVP
ZmZzZXQpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlX
cmFwcGVyPHVuc2lnbmVkIHNob3J0PihDU1NQcm9wZXJ0eU91dGxpbmVXaWR0aCwgJlJlbmRlclN0
eWxlOjpvdXRsaW5lV2lkdGgsICZSZW5kZXJTdHlsZTo6c2V0T3V0bGluZVdpZHRoKSk7CisgICAg
ICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxpbnQ+KENT
U1Byb3BlcnR5TGV0dGVyU3BhY2luZywgJlJlbmRlclN0eWxlOjpsZXR0ZXJTcGFjaW5nLCAmUmVu
ZGVyU3R5bGU6OnNldExldHRlclNwYWNpbmcpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMt
PmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPGludD4oQ1NTUHJvcGVydHlXb3JkU3BhY2luZywg
JlJlbmRlclN0eWxlOjp3b3JkU3BhY2luZywgJlJlbmRlclN0eWxlOjpzZXRXb3JkU3BhY2luZykp
OworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8
Y29uc3QgVHJhbnNmb3JtT3BlcmF0aW9ucyY+KENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtLCAm
UmVuZGVyU3R5bGU6OnRyYW5zZm9ybSwgJlJlbmRlclN0eWxlOjpzZXRUcmFuc2Zvcm0pKTsKKyAg
ICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0
aD4oQ1NTUHJvcGVydHlXZWJraXRUcmFuc2Zvcm1PcmlnaW5YLCAmUmVuZGVyU3R5bGU6OnRyYW5z
Zm9ybU9yaWdpblgsICZSZW5kZXJTdHlsZTo6c2V0VHJhbnNmb3JtT3JpZ2luWCkpOworICAgICAg
ICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihD
U1NQcm9wZXJ0eVdlYmtpdFRyYW5zZm9ybU9yaWdpblksICZSZW5kZXJTdHlsZTo6dHJhbnNmb3Jt
T3JpZ2luWSwgJlJlbmRlclN0eWxlOjpzZXRUcmFuc2Zvcm1PcmlnaW5ZKSk7CisgICAgICAgIGdQ
cm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxjb25zdCBJbnRTaXpl
Jj4oQ1NTUHJvcGVydHlXZWJraXRCb3JkZXJUb3BMZWZ0UmFkaXVzLCAmUmVuZGVyU3R5bGU6OmJv
cmRlclRvcExlZnRSYWRpdXMsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyVG9wTGVmdFJhZGl1cykp
OworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8
Y29uc3QgSW50U2l6ZSY+KENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyVG9wUmlnaHRSYWRpdXMsICZS
ZW5kZXJTdHlsZTo6Ym9yZGVyVG9wUmlnaHRSYWRpdXMsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVy
VG9wUmlnaHRSYWRpdXMpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcg
UHJvcGVydHlXcmFwcGVyPGNvbnN0IEludFNpemUmPihDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlckJv
dHRvbUxlZnRSYWRpdXMsICZSZW5kZXJTdHlsZTo6Ym9yZGVyQm90dG9tTGVmdFJhZGl1cywgJlJl
bmRlclN0eWxlOjpzZXRCb3JkZXJCb3R0b21MZWZ0UmFkaXVzKSk7CisgICAgICAgIGdQcm9wZXJ0
eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxjb25zdCBJbnRTaXplJj4oQ1NT
UHJvcGVydHlXZWJraXRCb3JkZXJCb3R0b21SaWdodFJhZGl1cywgJlJlbmRlclN0eWxlOjpib3Jk
ZXJCb3R0b21SaWdodFJhZGl1cywgJlJlbmRlclN0eWxlOjpzZXRCb3JkZXJCb3R0b21SaWdodFJh
ZGl1cykpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdy
YXBwZXI8RVZpc2liaWxpdHk+KENTU1Byb3BlcnR5VmlzaWJpbGl0eSwgJlJlbmRlclN0eWxlOjp2
aXNpYmlsaXR5LCAmUmVuZGVyU3R5bGU6OnNldFZpc2liaWxpdHkpKTsKKyAgICAgICAgZ1Byb3Bl
cnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPGZsb2F0PihDU1NQcm9wZXJ0
eVpvb20sICZSZW5kZXJTdHlsZTo6em9vbSwgJlJlbmRlclN0eWxlOjpzZXRab29tKSk7CisgICAg
ICAgIAorICAgICAgICAvLyBGSVhNRTogdGhlc2UgbWlnaHQgYmUgaW52YWxpZCBjb2xvcnMsIG5l
ZWQgdG8gY2hlY2sgZm9yIHRoYXQKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChu
ZXcgUHJvcGVydHlXcmFwcGVyTWF5YmVJbnZhbGlkQ29sb3IoQ1NTUHJvcGVydHlXZWJraXRDb2x1
bW5SdWxlQ29sb3IsICZSZW5kZXJTdHlsZTo6Y29sdW1uUnVsZUNvbG9yLCAmUmVuZGVyU3R5bGU6
OnNldENvbHVtblJ1bGVDb2xvcikpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5k
KG5ldyBQcm9wZXJ0eVdyYXBwZXJNYXliZUludmFsaWRDb2xvcihDU1NQcm9wZXJ0eVdlYmtpdFRl
eHRTdHJva2VDb2xvciwgJlJlbmRlclN0eWxlOjp0ZXh0U3Ryb2tlQ29sb3IsICZSZW5kZXJTdHls
ZTo6c2V0VGV4dFN0cm9rZUNvbG9yKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBl
bmQobmV3IFByb3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENvbG9yKENTU1Byb3BlcnR5V2Via2l0
VGV4dEZpbGxDb2xvciwgJlJlbmRlclN0eWxlOjp0ZXh0RmlsbENvbG9yLCAmUmVuZGVyU3R5bGU6
OnNldFRleHRGaWxsQ29sb3IpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChu
ZXcgUHJvcGVydHlXcmFwcGVyTWF5YmVJbnZhbGlkQ29sb3IoQ1NTUHJvcGVydHlCb3JkZXJMZWZ0
Q29sb3IsICZSZW5kZXJTdHlsZTo6Ym9yZGVyTGVmdENvbG9yLCAmUmVuZGVyU3R5bGU6OnNldEJv
cmRlckxlZnRDb2xvcikpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQ
cm9wZXJ0eVdyYXBwZXJNYXliZUludmFsaWRDb2xvcihDU1NQcm9wZXJ0eUJvcmRlclJpZ2h0Q29s
b3IsICZSZW5kZXJTdHlsZTo6Ym9yZGVyUmlnaHRDb2xvciwgJlJlbmRlclN0eWxlOjpzZXRCb3Jk
ZXJSaWdodENvbG9yKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFBy
b3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENvbG9yKENTU1Byb3BlcnR5Qm9yZGVyVG9wQ29sb3Is
ICZSZW5kZXJTdHlsZTo6Ym9yZGVyVG9wQ29sb3IsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyVG9w
Q29sb3IpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlX
cmFwcGVyTWF5YmVJbnZhbGlkQ29sb3IoQ1NTUHJvcGVydHlCb3JkZXJCb3R0b21Db2xvciwgJlJl
bmRlclN0eWxlOjpib3JkZXJCb3R0b21Db2xvciwgJlJlbmRlclN0eWxlOjpzZXRCb3JkZXJCb3R0
b21Db2xvcikpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0
eVdyYXBwZXJNYXliZUludmFsaWRDb2xvcihDU1NQcm9wZXJ0eU91dGxpbmVDb2xvciwgJlJlbmRl
clN0eWxlOjpvdXRsaW5lQ29sb3IsICZSZW5kZXJTdHlsZTo6c2V0T3V0bGluZUNvbG9yKSk7Cisg
ICAgICAgIAorICAgICAgICAvLyBUaGVzZSBhcmUgZm9yIHNoYWRvd3MKKyAgICAgICAgZ1Byb3Bl
cnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyU2hhZG93KENTU1Byb3BlcnR5
V2Via2l0Qm94U2hhZG93LCAmUmVuZGVyU3R5bGU6OmJveFNoYWRvdywgJlJlbmRlclN0eWxlOjpz
ZXRCb3hTaGFkb3cpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJv
cGVydHlXcmFwcGVyU2hhZG93KENTU1Byb3BlcnR5VGV4dFNoYWRvdywgJlJlbmRlclN0eWxlOjp0
ZXh0U2hhZG93LCAmUmVuZGVyU3R5bGU6OnNldFRleHRTaGFkb3cpKTsKKyAgICAgICAgCisgICAg
ICAgIC8vIE1ha2Ugc3VyZSB1bnVzZWQgc2xvdHMgaGF2ZSBhIHZhbHVlCisgICAgICAgIGZvciAo
dW5zaWduZWQgaW50IGkgPSAwOyBpIDwgKHVuc2lnbmVkIGludCkgbnVtQ1NTUHJvcGVydGllczsg
KytpKQorICAgICAgICAgICAgZ1Byb3BlcnR5V3JhcHBlck1hcFtpXSA9IENTU1Byb3BlcnR5SW52
YWxpZDsKKyAgICAgICAgCisgICAgICAgIHNpemVfdCBuID0gZ1Byb3BlcnR5V3JhcHBlcnMtPnNp
emUoKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAg
ICAgICAgICAgIEFTU0VSVCgoKmdQcm9wZXJ0eVdyYXBwZXJzKVtpXS0+cHJvcGVydHkoKSAtIGZp
cnN0Q1NTUHJvcGVydHkgPCBudW1DU1NQcm9wZXJ0aWVzKTsKKyAgICAgICAgICAgIGdQcm9wZXJ0
eVdyYXBwZXJNYXBbKCpnUHJvcGVydHlXcmFwcGVycylbaV0tPnByb3BlcnR5KCkgLSBmaXJzdENT
U1Byb3BlcnR5XSA9IGk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0FuaW1hdGlvbkJhc2U6OkFu
aW1hdGlvbkJhc2UoY29uc3QgQW5pbWF0aW9uKiB0cmFuc2l0aW9uLCBSZW5kZXJPYmplY3QqIHJl
bmRlcmVyLCBDb21wb3NpdGVBbmltYXRpb24qIGNvbXBBbmltKQorOiBtX2FuaW1TdGF0ZShTVEFU
RV9ORVcpCissIG1faXRlcmF0aW9uKDApCissIG1fYW5pbWF0aW5nKGZhbHNlKQorLCBtX3dhaXRl
ZEZvclJlc3BvbnNlKGZhbHNlKQorLCBtX3N0YXJ0VGltZSgwKQorLCBtX3BhdXNlVGltZSgtMSkK
KywgbV9vYmplY3QocmVuZGVyZXIpCissIG1fYW5pbWF0aW9uVGltZXJDYWxsYmFjayhjb25zdF9j
YXN0PEFuaW1hdGlvbkJhc2UqPih0aGlzKSkKKywgbV9hbmltYXRpb25FdmVudERpc3BhdGNoZXIo
Y29uc3RfY2FzdDxBbmltYXRpb25CYXNlKj4odGhpcykpCissIG1fYW5pbWF0aW9uKGNvbnN0X2Nh
c3Q8QW5pbWF0aW9uKj4odHJhbnNpdGlvbikpCissIG1fY29tcEFuaW0oY29tcEFuaW0pCissIG1f
d2FpdGluZ0ZvckVuZEV2ZW50KGZhbHNlKQoreworICAgIGVuc3VyZVByb3BlcnR5TWFwKCk7Cit9
CisKK0FuaW1hdGlvbkJhc2U6On5BbmltYXRpb25CYXNlKCkKK3sKKyAgICBpZiAobV9hbmltU3Rh
dGUgPT0gU1RBVEVfU1RBUlRfV0FJVF9TVFlMRV9BVkFJTEFCTEUpCisgICAgICAgIG1fY29tcEFu
aW0tPnNldFdhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZShmYWxzZSk7Cit9CisvLyBzdGF0aWMKK2Jv
b2wgQW5pbWF0aW9uQmFzZTo6cHJvcGVydGllc0VxdWFsKGludCBwcm9wLCBjb25zdCBSZW5kZXJT
dHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUqIGIpCit7CisgICAgaWYgKHByb3AgPT0gY0FuaW1h
dGVBbGwpIHsKKyAgICAgICAgc2l6ZV90IG4gPSBnUHJvcGVydHlXcmFwcGVycy0+c2l6ZSgpOwor
ICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICAg
ICAgaWYgKCEoKmdQcm9wZXJ0eVdyYXBwZXJzKVtpXS0+ZXF1YWxzKGEsIGIpKQorICAgICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAg
ICAgaW50IHByb3BJbmRleCA9IHByb3AgLSBmaXJzdENTU1Byb3BlcnR5OworICAgICAgICAKKyAg
ICAgICAgaWYgKHByb3BJbmRleCA+PSAwICYmIHByb3BJbmRleCA8IG51bUNTU1Byb3BlcnRpZXMp
IHsKKyAgICAgICAgICAgIGludCBpID0gZ1Byb3BlcnR5V3JhcHBlck1hcFtwcm9wSW5kZXhdOwor
ICAgICAgICAgICAgcmV0dXJuIChpID49IDApID8gKCpnUHJvcGVydHlXcmFwcGVycylbaV0tPmVx
dWFscyhhLCBiKSA6IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9
CisKKy8vIHN0YXRpYworaW50IEFuaW1hdGlvbkJhc2U6OmdldFByb3BlcnR5QXRJbmRleChpbnQg
aSkKK3sKKyAgICBpZiAoaSA8IDAgfHwgaSA+PSAoaW50KSBnUHJvcGVydHlXcmFwcGVycy0+c2l6
ZSgpKQorICAgICAgICByZXR1cm4gQ1NTUHJvcGVydHlJbnZhbGlkOworICAgICAgICAKKyAgICBy
ZXR1cm4gKCpnUHJvcGVydHlXcmFwcGVycylbaV0tPnByb3BlcnR5KCk7Cit9CisKKy8vc3RhdGlj
CitpbnQgQW5pbWF0aW9uQmFzZTo6Z2V0TnVtUHJvcGVydGllcygpCit7CisgICAgcmV0dXJuIGdQ
cm9wZXJ0eVdyYXBwZXJzLT5zaXplKCk7Cit9CisKKyAgICAKKy8vIHN0YXRpYyAtIHJldHVybiB0
cnVlIGlmIHdlIG5lZWQgdG8gc3RhcnQgc29mdHdhcmUgYW5pbWF0aW9uIHRpbWVycworYm9vbCBB
bmltYXRpb25CYXNlOjpibGVuZFByb3BlcnRpZXMoaW50IHByb3AsIFJlbmRlclN0eWxlKiBkc3Qs
IGNvbnN0IFJlbmRlclN0eWxlKiBhLCBjb25zdCBSZW5kZXJTdHlsZSogYiwgZG91YmxlIHByb2cp
Cit7CisgICAgaWYgKHByb3AgPT0gY0FuaW1hdGVBbGwpIHsKKyAgICAgICAgQVNTRVJUKDApOwor
ICAgICAgICBib29sIG5lZWRzVGltZXIgPSBmYWxzZTsKKyAgICAKKyAgICAgICAgc2l6ZV90IG4g
PSBnUHJvcGVydHlXcmFwcGVycy0+c2l6ZSgpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBp
ID0gMDsgaSA8IG47ICsraSkgeworICAgICAgICAgICAgUHJvcGVydHlXcmFwcGVyQmFzZSogd3Jh
cHBlciA9ICgqZ1Byb3BlcnR5V3JhcHBlcnMpW2ldOworICAgICAgICAgICAgaWYgKCF3cmFwcGVy
LT5lcXVhbHMoYSwgYikpIHsKKyAgICAgICAgICAgICAgICB3cmFwcGVyLT5ibGVuZChkc3QsIGEs
IGIsIHByb2cpOworICAgICAgICAgICAgICAgIG5lZWRzVGltZXIgPSB0cnVlOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZWVkc1RpbWVyOworICAgIH0KKyAgICAK
KyAgICBpbnQgcHJvcEluZGV4ID0gcHJvcCAtIGZpcnN0Q1NTUHJvcGVydHk7CisgICAgaWYgKHBy
b3BJbmRleCA+PSAwICYmIHByb3BJbmRleCA8IG51bUNTU1Byb3BlcnRpZXMpIHsKKyAgICAgICAg
aW50IGkgPSBnUHJvcGVydHlXcmFwcGVyTWFwW3Byb3BJbmRleF07CisgICAgICAgIGlmIChpID49
IDApIHsKKyAgICAgICAgICAgIFByb3BlcnR5V3JhcHBlckJhc2UqIHdyYXBwZXIgPSAoKmdQcm9w
ZXJ0eVdyYXBwZXJzKVtpXTsKKyAgICAgICAgICAgIHdyYXBwZXItPmJsZW5kKGRzdCwgYSwgYiwg
cHJvZyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAK
KyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQW5pbWF0aW9uQmFzZTo6c2V0Q2hhbmdlZChO
b2RlKiBub2RlKQoreworICAgIEFTU0VSVCghbm9kZSB8fCAobm9kZS0+ZG9jdW1lbnQoKSAmJiAh
bm9kZS0+ZG9jdW1lbnQoKS0+aW5QYWdlQ2FjaGUoKSkpOworICAgIG5vZGUtPnNldENoYW5nZWQo
QW5pbWF0aW9uU3R5bGVDaGFuZ2UpOworfQorCitkb3VibGUgQW5pbWF0aW9uQmFzZTo6ZHVyYXRp
b24oKSBjb25zdAoreworICAgIHJldHVybiBtX2FuaW1hdGlvbi0+ZHVyYXRpb24oKTsKK30KKwor
Ym9vbCBBbmltYXRpb25CYXNlOjpwbGF5U3RhdGVQbGF5aW5nKCkgY29uc3QKK3sKKyAgICByZXR1
cm4gbV9hbmltYXRpb24gJiYgbV9hbmltYXRpb24tPnBsYXlTdGF0ZSgpID09IEFuaW1QbGF5U3Rh
dGVQbGF5aW5nOworfQorCitib29sIEFuaW1hdGlvbkJhc2U6OmFuaW1hdGlvbnNNYXRjaChjb25z
dCBBbmltYXRpb24qIGFuaW0pIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fYW5pbWF0aW9uLT5hbmlt
YXRpb25zTWF0Y2goYW5pbSk7Cit9CisKK0VsZW1lbnQqIEFuaW1hdGlvbkJhc2U6OmVsZW1lbnRG
b3JFdmVudERpc3BhdGNoKCkKK3sKKyAgICBpZiAobV9vYmplY3QtPm5vZGUoKSAmJiBtX29iamVj
dC0+bm9kZSgpLT5pc0VsZW1lbnROb2RlKCkpCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxF
bGVtZW50Kj4obV9vYmplY3QtPm5vZGUoKSk7CisgICAgcmV0dXJuIDA7Cit9CisgICAgCit2b2lk
IEFuaW1hdGlvbkJhc2U6OnVwZGF0ZVN0YXRlTWFjaGluZShBbmltU3RhdGVJbnB1dCBpbnB1dCwg
ZG91YmxlIHBhcmFtKQoreworICAgIC8vIElmIHdlIGdldCBhIFJFU1RBUlQgdGhlbiB3ZSBmb3Jj
ZSBhIG5ldyBhbmltYXRpb24sIHJlZ2FyZGxlc3Mgb2Ygc3RhdGUKKyAgICBpZiAoaW5wdXQgPT0g
U1RBVEVfSU5QVVRfTUFLRV9ORVcpIHsKKyAgICAgICAgaWYgKG1fYW5pbVN0YXRlID09IFNUQVRF
X1NUQVJUX1dBSVRfU1RZTEVfQVZBSUxBQkxFKQorICAgICAgICAgICAgbV9jb21wQW5pbS0+c2V0
V2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKGZhbHNlKTsKKyAgICAgICAgbV9hbmltU3RhdGUgPSBT
VEFURV9ORVc7CisgICAgICAgIG1fc3RhcnRUaW1lID0gMDsKKyAgICAgICAgbV9wYXVzZVRpbWUg
PSAtMTsKKyAgICAgICAgbV93YWl0ZWRGb3JSZXNwb25zZSA9IGZhbHNlOworICAgICAgICBlbmRB
bmltYXRpb24oZmFsc2UpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYgKGlu
cHV0ID09IFNUQVRFX0lOUFVUX1JFU1RBUlRfQU5JTUFUSU9OKSB7CisgICAgICAgIGNhbmNlbFRp
bWVycygpOworICAgICAgICBpZiAobV9hbmltU3RhdGUgPT0gU1RBVEVfU1RBUlRfV0FJVF9TVFlM
RV9BVkFJTEFCTEUpCisgICAgICAgICAgICBtX2NvbXBBbmltLT5zZXRXYWl0aW5nRm9yU3R5bGVB
dmFpbGFibGUoZmFsc2UpOworICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX05FVzsKKyAgICAg
ICAgbV9zdGFydFRpbWUgPSAwOworICAgICAgICBtX3BhdXNlVGltZSA9IC0xOworICAgICAgICBl
bmRBbmltYXRpb24oZmFsc2UpOworICAgICAgICAKKyAgICAgICAgaWYgKCFwYXVzZWQoKSkKKyAg
ICAgICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFURV9JTlBVVF9TVEFSVF9BTklNQVRJT04s
IC0xKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIGlmIChpbnB1dCA9PSBTVEFU
RV9JTlBVVF9FTkRfQU5JTUFUSU9OKSB7CisgICAgICAgIGNhbmNlbFRpbWVycygpOworICAgICAg
ICBpZiAobV9hbmltU3RhdGUgPT0gU1RBVEVfU1RBUlRfV0FJVF9TVFlMRV9BVkFJTEFCTEUpCisg
ICAgICAgICAgICBtX2NvbXBBbmltLT5zZXRXYWl0aW5nRm9yU3R5bGVBdmFpbGFibGUoZmFsc2Up
OworICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX0RPTkU7CisgICAgICAgIGVuZEFuaW1hdGlv
bih0cnVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIGlmIChpbnB1dCA9PSBT
VEFURV9JTlBVVF9QQVVTRV9PVkVSUklERSkgeworICAgICAgICBpZiAobV9hbmltU3RhdGUgPT0g
U1RBVEVfU1RBUlRfV0FJVF9SRVNQT05TRSkgeworICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGlu
IHRoZSBXQUlUX1JFU1BPTlNFIHN0YXRlLCB0aGUgYW5pbWF0aW9uIHdpbGwgZ2V0IGNhbmNlbGVk
IGJlZm9yZSAKKyAgICAgICAgICAgIC8vIHdlIGdldCBhIHJlc3BvbnNlLCBzbyBtb3ZlIHRvIHRo
ZSBuZXh0IHN0YXRlCisgICAgICAgICAgICBlbmRBbmltYXRpb24oZmFsc2UpOworICAgICAgICAg
ICAgdXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVUX1NUQVJUX1RJTUVfU0VULCBjdXJyZW50
VGltZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2UgaWYg
KGlucHV0ID09IFNUQVRFX0lOUFVUX1JFU1VNRV9PVkVSUklERSkgeworICAgICAgICBpZiAobV9h
bmltU3RhdGUgPT0gU1RBVEVfTE9PUElORyB8fCBtX2FuaW1TdGF0ZSA9PSBTVEFURV9FTkRJTkcp
IHsKKyAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBhbmltYXRpb24KKyAgICAgICAgICAgIHN0YXJ0
QW5pbWF0aW9uKG1fc3RhcnRUaW1lKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAg
fQorICAgIAorICAgIC8vIEV4ZWN1dGUgc3RhdGUgbWFjaGluZQorICAgIHN3aXRjaChtX2FuaW1T
dGF0ZSkgeworICAgICAgICBjYXNlIFNUQVRFX05FVzoKKyAgICAgICAgICAgIEFTU0VSVChpbnB1
dCA9PSBTVEFURV9JTlBVVF9TVEFSVF9BTklNQVRJT04gfHwgaW5wdXQgPT0gU1RBVEVfSU5QVVRf
UExBWV9TVEFURV9SVU5OSU5HIHx8IGlucHV0ID09IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUEFV
U0VEKTsKKyAgICAgICAgICAgIGlmIChpbnB1dCA9PSBTVEFURV9JTlBVVF9TVEFSVF9BTklNQVRJ
T04gfHwgaW5wdXQgPT0gU1RBVEVfSU5QVVRfUExBWV9TVEFURV9SVU5OSU5HKSB7CisgICAgICAg
ICAgICAgICAgLy8gU2V0IHRoZSBzdGFydCB0aW1lciB0byB0aGUgaW5pdGlhbCBkZWxheSAoMCBp
ZiBubyBkZWxheSkKKyAgICAgICAgICAgICAgICBtX3dhaXRlZEZvclJlc3BvbnNlID0gZmFsc2U7
CisgICAgICAgICAgICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9TVEFSVF9XQUlUX1RJTUVSOwor
ICAgICAgICAgICAgICAgIG1fYW5pbWF0aW9uVGltZXJDYWxsYmFjay5zdGFydFRpbWVyKG1fYW5p
bWF0aW9uLT5kZWxheSgpLCBFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRpb25TdGFydEV2ZW50LCBt
X2FuaW1hdGlvbi0+ZGVsYXkoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgY2FzZSBTVEFURV9TVEFSVF9XQUlUX1RJTUVSOgorICAgICAgICAgICAgQVNTRVJU
KGlucHV0ID09IFNUQVRFX0lOUFVUX1NUQVJUX1RJTUVSX0ZJUkVEIHx8IGlucHV0ID09IFNUQVRF
X0lOUFVUX1BMQVlfU1RBVEVfUEFVU0VEKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYg
KGlucHV0ID09IFNUQVRFX0lOUFVUX1NUQVJUX1RJTUVSX0ZJUkVEKSB7CisgICAgICAgICAgICAg
ICAgQVNTRVJUKHBhcmFtID49IDApOworICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHRpbWVyIGhh
cyBmaXJlZCwgdGVsbCB0aGUgYW5pbWF0aW9uIHRvIHN0YXJ0IGFuZCB3YWl0IGZvciBpdCB0byBy
ZXNwb25kIHdpdGggc3RhcnQgdGltZQorICAgICAgICAgICAgICAgIG1fYW5pbVN0YXRlID0gU1RB
VEVfU1RBUlRfV0FJVF9TVFlMRV9BVkFJTEFCTEU7CisgICAgICAgICAgICAgICAgbV9jb21wQW5p
bS0+c2V0V2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKHRydWUpOworICAgICAgICAgICAgICAgIAor
ICAgICAgICAgICAgICAgIC8vIFRyaWdnZXIgYSByZW5kZXIgc28gd2UgY2FuIHN0YXJ0IHRoZSBh
bmltYXRpb24KKyAgICAgICAgICAgICAgICBzZXRDaGFuZ2VkKG1fb2JqZWN0LT5lbGVtZW50KCkp
OworICAgICAgICAgICAgICAgIG1fb2JqZWN0LT5hbmltYXRpb24oKS0+c3RhcnRVcGRhdGVSZW5k
ZXJpbmdEaXNwYXRjaGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAg
ICAgICAgICAgICAgICBBU1NFUlQocnVubmluZygpKTsKKyAgICAgICAgICAgICAgICAvLyBXZSdy
ZSB3YWl0aW5nIGZvciB0aGUgc3RhcnQgdGltZXIgdG8gZmlyZSBhbmQgd2UgZ290IGEgcGF1c2Uu
IENhbmNlbCB0aGUgdGltZXIsIHBhdXNlIGFuZCB3YWl0CisgICAgICAgICAgICAgICAgbV9wYXVz
ZVRpbWUgPSBjdXJyZW50VGltZSgpOworICAgICAgICAgICAgICAgIGNhbmNlbFRpbWVycygpOwor
ICAgICAgICAgICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfUEFVU0VEX1dBSVRfVElNRVI7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9TVEFS
VF9XQUlUX1NUWUxFX0FWQUlMQUJMRToKKyAgICAgICAgICAgIEFTU0VSVChpbnB1dCA9PSBTVEFU
RV9JTlBVVF9TVFlMRV9BVkFJTEFCTEUgfHwgaW5wdXQgPT0gU1RBVEVfSU5QVVRfUExBWV9TVEFU
RV9QQVVTRUQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBtX2NvbXBBbmltLT5zZXRXYWl0
aW5nRm9yU3R5bGVBdmFpbGFibGUoZmFsc2UpOworICAgICAgICAgICAgCisgICAgICAgICAgICBp
ZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfU1RZTEVfQVZBSUxBQkxFKSB7CisgICAgICAgICAgICAg
ICAgLy8gU3RhcnQgdGltZXIgaGFzIGZpcmVkLCB0ZWxsIHRoZSBhbmltYXRpb24gdG8gc3RhcnQg
YW5kIHdhaXQgZm9yIGl0IHRvIHJlc3BvbmQgd2l0aCBzdGFydCB0aW1lCisgICAgICAgICAgICAg
ICAgbV9hbmltU3RhdGUgPSBTVEFURV9TVEFSVF9XQUlUX1JFU1BPTlNFOworICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgICAgIG92ZXJyaWRlQW5pbWF0aW9ucygpOworICAgICAgICAgICAg
ICAgIAorICAgICAgICAgICAgICAgIC8vIFNlbmQgc3RhcnQgZXZlbnQsIGlmIG5lZWRlZAorICAg
ICAgICAgICAgICAgIG9uQW5pbWF0aW9uU3RhcnQoMC4wZik7IC8vIFRoZSBlbGFwc2VkVGltZSBp
cyBhbHdheXMgMCBoZXJlCisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gU3Rh
cnQgdGhlIGFuaW1hdGlvbgorICAgICAgICAgICAgICAgIGlmIChvdmVycmlkZGVuKCkgfHwgIXN0
YXJ0QW5pbWF0aW9uKDApKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIG5vdCBnb2lu
ZyB0byBnZXQgYSBzdGFydFRpbWUgY2FsbGJhY2ssIHNvIGZpcmUgdGhlIHN0YXJ0IHRpbWUgaGVy
ZQorICAgICAgICAgICAgICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX1NUQVJUX1dBSVRfUkVT
UE9OU0U7CisgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFURV9JTlBV
VF9TVEFSVF9USU1FX1NFVCwgY3VycmVudFRpbWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbV93YWl0ZWRGb3JSZXNwb25z
ZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAg
ICAgICBBU1NFUlQocnVubmluZygpKTsKKyAgICAgICAgICAgICAgICAvLyBXZSdyZSB3YWl0aW5n
IGZvciB0aGUgYSBub3RpZmljYXRpb24gdGhhdCB0aGUgc3R5bGUgaGFzIGJlZW4gc2V0dXAuIElm
IHdlJ3JlIGFza2VkIHRvIHdhaXQKKyAgICAgICAgICAgICAgICAvLyBhdCB0aGlzIHBvaW50LCB0
aGUgc3R5bGUgbXVzdCBoYXZlIGJlZW4gcHJvY2Vzc2VkLCBzbyB3ZSBjYW4gZGVhbCB3aXRoIHRo
aXMgbGlrZSB3ZSB3b3VsZAorICAgICAgICAgICAgICAgIC8vIGZvciBXQUlUX1JFU1BPTlNFLCBl
eGNlcHQgdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGRvIGFuIGVuZEFuaW1hdGlvbigpLgorICAgICAg
ICAgICAgICAgIG1fcGF1c2VUaW1lID0gMDsKKyAgICAgICAgICAgICAgICBtX2FuaW1TdGF0ZSA9
IFNUQVRFX1NUQVJUX1dBSVRfUkVTUE9OU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9TVEFSVF9XQUlUX1JFU1BPTlNFOgorICAgICAgICAg
ICAgQVNTRVJUKGlucHV0ID09IFNUQVRFX0lOUFVUX1NUQVJUX1RJTUVfU0VUIHx8IGlucHV0ID09
IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUEFVU0VEKTsKKyAgICAgICAgICAgIAorICAgICAgICAg
ICAgaWYgKGlucHV0ID09IFNUQVRFX0lOUFVUX1NUQVJUX1RJTUVfU0VUKSB7CisgICAgICAgICAg
ICAgICAgQVNTRVJUKHBhcmFtID49IDApOworICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBz
dGFydCB0aW1lLCBzZXQgaXQsIHVubGVzcyB0aGUgc3RhcnRUaW1lIGlzIGFscmVhZHkgc2V0Cisg
ICAgICAgICAgICAgICAgaWYgKG1fc3RhcnRUaW1lIDw9IDApCisgICAgICAgICAgICAgICAgICAg
IG1fc3RhcnRUaW1lID0gcGFyYW07CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAg
Ly8gRGVjaWRlIHdoZW4gdGhlIGVuZCBvciBsb29wIGV2ZW50IG5lZWRzIHRvIGZpcmUKKyAgICAg
ICAgICAgICAgICBwcmltZUV2ZW50VGltZXJzKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAg
ICAgICAgICAgLy8gVHJpZ2dlciBhIHJlbmRlciBzbyB3ZSBjYW4gc3RhcnQgdGhlIGFuaW1hdGlv
bgorICAgICAgICAgICAgICAgIHNldENoYW5nZWQobV9vYmplY3QtPmVsZW1lbnQoKSk7CisgICAg
ICAgICAgICAgICAgbV9vYmplY3QtPmFuaW1hdGlvbigpLT5zdGFydFVwZGF0ZVJlbmRlcmluZ0Rp
c3BhdGNoZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAg
ICAgICAgIC8vIFdlIGFyZSBwYXVzaW5nIHdoaWxlIHdhaXRpbmcgZm9yIGEgc3RhcnQgcmVzcG9u
c2UuIENhbmNlbCB0aGUgYW5pbWF0aW9uIGFuZCB3YWl0LiBXaGVuIAorICAgICAgICAgICAgICAg
IC8vIHdlIHVucGF1c2UsIHdlIHdpbGwgYWN0IGFzIHRob3VnaCB0aGUgc3RhcnQgdGltZXIganVz
dCBmaXJlZAorICAgICAgICAgICAgICAgIG1fcGF1c2VUaW1lID0gMDsKKyAgICAgICAgICAgICAg
ICBlbmRBbmltYXRpb24oZmFsc2UpOworICAgICAgICAgICAgICAgIG1fYW5pbVN0YXRlID0gU1RB
VEVfUEFVU0VEX1dBSVRfUkVTUE9OU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgY2FzZSBTVEFURV9MT09QSU5HOgorICAgICAgICAgICAgQVNTRVJUKGlucHV0
ID09IFNUQVRFX0lOUFVUX0xPT1BfVElNRVJfRklSRUQgfHwgaW5wdXQgPT0gU1RBVEVfSU5QVVRf
UExBWV9TVEFURV9QQVVTRUQpOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoaW5wdXQg
PT0gU1RBVEVfSU5QVVRfTE9PUF9USU1FUl9GSVJFRCkgeworICAgICAgICAgICAgICAgIEFTU0VS
VChwYXJhbSA+PSAwKTsKKyAgICAgICAgICAgICAgICAvLyBMb29wIHRpbWVyIGZpcmVkLCBsb29w
IGFnYWluIG9yIGVuZC4KKyAgICAgICAgICAgICAgICBvbkFuaW1hdGlvbkl0ZXJhdGlvbihwYXJh
bSk7CisgICAgICAgICAgICAgICAgcHJpbWVFdmVudFRpbWVycygpOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIHBhdXNpbmcgd2hp
bGUgcnVubmluZy4gQ2FuY2VsIHRoZSBhbmltYXRpb24gYW5kIHdhaXQKKyAgICAgICAgICAgICAg
ICBtX3BhdXNlVGltZSA9IGN1cnJlbnRUaW1lKCk7CisgICAgICAgICAgICAgICAgY2FuY2VsVGlt
ZXJzKCk7CisgICAgICAgICAgICAgICAgZW5kQW5pbWF0aW9uKGZhbHNlKTsKKyAgICAgICAgICAg
ICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX1BBVVNFRF9SVU47CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9FTkRJTkc6CisgICAgICAgICAgICBB
U1NFUlQoaW5wdXQgPT0gU1RBVEVfSU5QVVRfRU5EX1RJTUVSX0ZJUkVEIHx8IGlucHV0ID09IFNU
QVRFX0lOUFVUX1BMQVlfU1RBVEVfUEFVU0VEKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAg
aWYgKGlucHV0ID09IFNUQVRFX0lOUFVUX0VORF9USU1FUl9GSVJFRCkgeworICAgICAgICAgICAg
ICAgIEFTU0VSVChwYXJhbSA+PSAwKTsKKyAgICAgICAgICAgICAgICAvLyBFbmQgdGltZXIgZmly
ZWQsIGZpbmlzaCB1cAorICAgICAgICAgICAgICAgIG9uQW5pbWF0aW9uRW5kKHBhcmFtKTsKKyAg
ICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICByZXN1bWVPdmVycmlkZGVuQW5pbWF0aW9u
cygpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIC8vIEZpcmUgb2ZmIGFub3Ro
ZXIgc3R5bGUgY2hhbmdlIHNvIHdlIGNhbiBzZXQgdGhlIGZpbmFsIHZhbHVlCisgICAgICAgICAg
ICAgICAgc2V0Q2hhbmdlZChtX29iamVjdC0+ZWxlbWVudCgpKTsKKyAgICAgICAgICAgICAgICBt
X2FuaW1TdGF0ZSA9IFNUQVRFX0RPTkU7CisgICAgICAgICAgICAgICAgbV9vYmplY3QtPmFuaW1h
dGlvbigpLT5zdGFydFVwZGF0ZVJlbmRlcmluZ0Rpc3BhdGNoZXIoKTsKKyAgICAgICAgICAgICAg
ICAvLyB8dGhpc3wgbWF5IGJlIGRlbGV0ZWQgaGVyZSB3aGVuIHdlJ3ZlIGJlZW4gY2FsbGVkIGZy
b20gdGltZXJGaXJlZCgpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAg
ICAgICAgICAgICAvLyBXZSBhcmUgcGF1c2luZyB3aGlsZSBydW5uaW5nLiBDYW5jZWwgdGhlIGFu
aW1hdGlvbiBhbmQgd2FpdAorICAgICAgICAgICAgICAgIG1fcGF1c2VUaW1lID0gY3VycmVudFRp
bWUoKTsKKyAgICAgICAgICAgICAgICBjYW5jZWxUaW1lcnMoKTsKKyAgICAgICAgICAgICAgICBl
bmRBbmltYXRpb24oZmFsc2UpOworICAgICAgICAgICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVf
UEFVU0VEX1JVTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHx0aGlzfCBtYXkgYmUg
ZGVsZXRlZCBoZXJlCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9QQVVT
RURfV0FJVF9USU1FUjoKKyAgICAgICAgICAgIEFTU0VSVChpbnB1dCA9PSBTVEFURV9JTlBVVF9Q
TEFZX1NUQVRFX1JVTk5JTkcpOworICAgICAgICAgICAgQVNTRVJUKCFydW5uaW5nKCkpOworICAg
ICAgICAgICAgLy8gVXBkYXRlIHRoZSB0aW1lcworICAgICAgICAgICAgbV9zdGFydFRpbWUgKz0g
Y3VycmVudFRpbWUoKSAtIG1fcGF1c2VUaW1lOworICAgICAgICAgICAgbV9wYXVzZVRpbWUgPSAt
MTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gd2Ugd2VyZSB3YWl0aW5nIGZvciB0aGUg
c3RhcnQgdGltZXIgdG8gZmlyZSwgZ28gYmFjayBhbmQgd2FpdCBhZ2FpbgorICAgICAgICAgICAg
bV9hbmltU3RhdGUgPSBTVEFURV9ORVc7CisgICAgICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUo
U1RBVEVfSU5QVVRfU1RBUlRfQU5JTUFUSU9OLCAwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIFNUQVRFX1BBVVNFRF9XQUlUX1JFU1BPTlNFOgorICAgICAgICBjYXNlIFNUQVRF
X1BBVVNFRF9SVU46CisgICAgICAgICAgICAvLyBXZSB0cmVhdCB0aGVzZSB0d28gY2FzZXMgdGhl
IHNhbWUuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhhdCwgd2hlbiB3ZSBhcmUgaW4gdGhlIFdB
SVRfUkVTUE9OU0UKKyAgICAgICAgICAgIC8vIHN0YXRlLCB3ZSBkb24ndCB5ZXQgaGF2ZSBhIHZh
bGlkIHN0YXJ0VGltZSwgc28gd2Ugc2VuZCAwIHRvIHN0YXJ0QW5pbWF0aW9uLiBXaGVuIHRoZSBT
VEFSVF9USU1FCisgICAgICAgICAgICAvLyBldmVudCBjb21lcyBpbiBxbmQgd2Ugd2VyZSBpbiB0
aGUgUlVOIHN0YXRlLCB3ZSB3aWxsIG5vdGljZSB0aGF0IHdlIGhhdmUgYWxyZWFkeSBzZXQgdGhl
IAorICAgICAgICAgICAgLy8gc3RhcnRUaW1lIGFuZCB3aWxsIGlnbm9yZSBpdC4KKyAgICAgICAg
ICAgIEFTU0VSVChpbnB1dCA9PSBTVEFURV9JTlBVVF9QTEFZX1NUQVRFX1JVTk5JTkcpOworICAg
ICAgICAgICAgQVNTRVJUKCFydW5uaW5nKCkpOworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB0
aW1lcworICAgICAgICAgICAgaWYgKG1fYW5pbVN0YXRlID09IFNUQVRFX1BBVVNFRF9SVU4pCisg
ICAgICAgICAgICAgICAgbV9zdGFydFRpbWUgKz0gY3VycmVudFRpbWUoKSAtIG1fcGF1c2VUaW1l
OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1fc3RhcnRUaW1lID0gMDsKKyAg
ICAgICAgICAgIG1fcGF1c2VUaW1lID0gLTE7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8v
IFdlIHdlcmUgd2FpdGluZyBmb3IgYSBiZWdpbiB0aW1lIHJlc3BvbnNlIGZyb20gdGhlIGFuaW1h
dGlvbiwgZ28gYmFjayBhbmQgd2FpdCBhZ2FpbgorICAgICAgICAgICAgbV9hbmltU3RhdGUgPSBT
VEFURV9TVEFSVF9XQUlUX1JFU1BPTlNFOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBT
dGFydCB0aGUgYW5pbWF0aW9uCisgICAgICAgICAgICBpZiAob3ZlcnJpZGRlbigpIHx8ICFzdGFy
dEFuaW1hdGlvbihtX3N0YXJ0VGltZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3Qg
Z29pbmcgdG8gZ2V0IGEgc3RhcnRUaW1lIGNhbGxiYWNrLCBzbyBmaXJlIHRoZSBzdGFydCB0aW1l
IGhlcmUKKyAgICAgICAgICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUoU1RBVEVfSU5QVVRfU1RB
UlRfVElNRV9TRVQsIGN1cnJlbnRUaW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
ZWxzZQorICAgICAgICAgICAgICAgIG1fd2FpdGVkRm9yUmVzcG9uc2UgPSB0cnVlOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfRE9ORToKKyAgICAgICAgICAgIC8vIFdl
J3JlIGRvbmUuIFN0YXkgaW4gdGhpcyBzdGF0ZSB1bnRpbCB3ZSBhcmUgZGVsZXRlZAorICAgICAg
ICAgICAgYnJlYWs7CisgICAgfQorICAgIC8vIHx0aGlzfCBtYXkgYmUgZGVsZXRlZCBoZXJlIGlm
IHdlIGNhbWUgb3V0IG9mIFNUQVRFX0VORElORyB3aGVuIHdlJ3ZlIGJlZW4gY2FsbGVkIGZyb20g
dGltZXJGaXJlZCgpCit9CisgICAgCit2b2lkIEFuaW1hdGlvbkJhc2U6OmFuaW1hdGlvblRpbWVy
Q2FsbGJhY2tGaXJlZChjb25zdCBBdG9taWNTdHJpbmcmIGV2ZW50VHlwZSwgZG91YmxlIGVsYXBz
ZWRUaW1lKQoreworICAgIEFTU0VSVChtX29iamVjdC0+ZG9jdW1lbnQoKSAmJiAhbV9vYmplY3Qt
PmRvY3VtZW50KCktPmluUGFnZUNhY2hlKCkpOworICAgIAorICAgIC8vIEZJWE1FOiB1c2UgYW4g
ZW51bQorICAgIGlmIChldmVudFR5cGUgPT0gRXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uU3Rh
cnRFdmVudCkKKyAgICAgICAgdXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVUX1NUQVJUX1RJ
TUVSX0ZJUkVELCBlbGFwc2VkVGltZSk7CisgICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IEV2ZW50
TmFtZXM6OndlYmtpdEFuaW1hdGlvbkl0ZXJhdGlvbkV2ZW50KQorICAgICAgICB1cGRhdGVTdGF0
ZU1hY2hpbmUoU1RBVEVfSU5QVVRfTE9PUF9USU1FUl9GSVJFRCwgZWxhcHNlZFRpbWUpOworICAg
IGVsc2UgaWYgKGV2ZW50VHlwZSA9PSBFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRpb25FbmRFdmVu
dCkgeworICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUoU1RBVEVfSU5QVVRfRU5EX1RJTUVSX0ZJ
UkVELCBlbGFwc2VkVGltZSk7CisgICAgICAgIC8vIHx0aGlzfCBtYXkgYmUgZGVsZXRlZCBoZXJl
CisgICAgfQorfQorCit2b2lkIEFuaW1hdGlvbkJhc2U6OmFuaW1hdGlvbkV2ZW50RGlzcGF0Y2hl
ckZpcmVkKEVsZW1lbnQqIGVsZW1lbnQsIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSwgaW50IHBy
b3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBib29sIHJlc2V0LCBjb25zdCBBdG9taWNTdHJpbmcmIGV2ZW50VHlwZSwgZG91YmxlIGVsYXBz
ZWRUaW1lKQoreworICAgIG1fd2FpdGluZ0ZvckVuZEV2ZW50ID0gZmFsc2U7CisgICAgCisgICAg
Ly8gS2VlcCBhbiBhdG9taWMgc3RyaW5nIG9uIHRoZSBzdGFjayB0byBrZWVwIGl0IGFsaXZlIHVu
dGlsIHdlIGV4aXQgdGhpcyBtZXRob2QKKyAgICAvLyAoc2luY2UgZGlzcGF0Y2hpbmcgdGhlIGV2
ZW50IG1heSBjYXVzZSB8dGhpc3wgdG8gYmUgZGVsZXRlZCwgdGhlcmVmb3JlIHJlbW92aW5nCisg
ICAgLy8gdGhlIGxhc3QgcmVmIHRvIHRoZSBhdG9taWMgc3RyaW5nKS4KKyAgICBBdG9taWNTdHJp
bmcgYW5pbU5hbWUobmFtZSk7CisgICAgQXRvbWljU3RyaW5nIGFuaW1FdmVudFR5cGUoZXZlbnRU
eXBlKTsKKyAgICAvLyBNYWtlIHN1cmUgdGhlIGVsZW1lbnQgc3RpY2tzIGFyb3VuZCB0b28KKyAg
ICBSZWZQdHI8RWxlbWVudD4gZWxlbWVudFJldGFpbmVyKGVsZW1lbnQpOworICAgIAorICAgIEFT
U0VSVCghZWxlbWVudCB8fCAoZWxlbWVudC0+ZG9jdW1lbnQoKSAmJiAhZWxlbWVudC0+ZG9jdW1l
bnQoKS0+aW5QYWdlQ2FjaGUoKSkpOworICAgIGlmICghZWxlbWVudCkKKyAgICAgICAgcmV0dXJu
OworCisgICAgaWYgKGV2ZW50VHlwZSA9PSBFdmVudE5hbWVzOjp3ZWJraXRUcmFuc2l0aW9uRW5k
RXZlbnQpCisgICAgICAgIGVsZW1lbnQtPmRpc3BhdGNoV2ViS2l0VHJhbnNpdGlvbkV2ZW50KGV2
ZW50VHlwZSwgbmFtZSwgZWxhcHNlZFRpbWUpOworICAgIGVsc2UKKyAgICAgICAgZWxlbWVudC0+
ZGlzcGF0Y2hXZWJLaXRBbmltYXRpb25FdmVudChldmVudFR5cGUsIG5hbWUsIGVsYXBzZWRUaW1l
KTsKKworICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsICh1bmFuaW1hdGVkKSBzdHlsZQorICAg
IGlmIChhbmltRXZlbnRUeXBlID09IEV2ZW50TmFtZXM6OndlYmtpdEFuaW1hdGlvbkVuZEV2ZW50
KQorICAgICAgICBpZiAoZWxlbWVudC0+cmVuZGVyZXIoKSkKKyAgICAgICAgICAgIHNldENoYW5n
ZWQoZWxlbWVudC0+cmVuZGVyZXIoKS0+ZWxlbWVudCgpKTsKK30KKwordm9pZCBBbmltYXRpb25C
YXNlOjp1cGRhdGVQbGF5U3RhdGUoYm9vbCBydW4pCit7CisgICAgaWYgKHBhdXNlZCgpID09IHJ1
biB8fCBpc05ldygpKQorICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUocnVuID8gU1RBVEVfSU5Q
VVRfUExBWV9TVEFURV9SVU5OSU5HIDogU1RBVEVfSU5QVVRfUExBWV9TVEFURV9QQVVTRUQsIC0x
KTsKK30KKworZG91YmxlIEFuaW1hdGlvbkJhc2U6OnByb2dyZXNzKGRvdWJsZSBzY2FsZSwgZG91
YmxlIG9mZnNldCkgY29uc3QKK3sKKyAgICBpZiAocHJlQWN0aXZlKCkpCisgICAgICAgIHJldHVy
biAwOworICAgIAorICAgIGRvdWJsZSBlbGFwc2VkVGltZSA9IHJ1bm5pbmcoKSA/IChjdXJyZW50
VGltZSgpIC0gbV9zdGFydFRpbWUpIDogKG1fcGF1c2VUaW1lIC0gbV9zdGFydFRpbWUpOworICAg
IGlmIChydW5uaW5nKCkgJiYgZWxhcHNlZFRpbWUgPCAwKQorICAgICAgICByZXR1cm4gMDsKKyAg
ICAKKyAgICBkb3VibGUgZHVyID0gbV9hbmltYXRpb24tPmR1cmF0aW9uKCk7CisgICAgaWYgKG1f
YW5pbWF0aW9uLT5pdGVyYXRpb25Db3VudCgpID4gMCkKKyAgICAgICAgZHVyICo9IG1fYW5pbWF0
aW9uLT5pdGVyYXRpb25Db3VudCgpOworICAgIAorICAgIGlmIChwb3N0QWN0aXZlKCkgfHwgIW1f
YW5pbWF0aW9uLT5kdXJhdGlvbigpIHx8IChtX2FuaW1hdGlvbi0+aXRlcmF0aW9uQ291bnQoKSA+
IDAgJiYgZWxhcHNlZFRpbWUgPj0gZHVyKSkKKyAgICAgICAgcmV0dXJuIDEuMDsKKyAgICAKKyAg
ICAvLyBDb21wdXRlIHRoZSBmcmFjdGlvbmFsIHRpbWUsIHRha2luZyBpbnRvIGFjY291bnQgZGly
ZWN0aW9uLgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgaXRlcmF0aW9u
cywgd2UgYXNzdW1lIHRoYXQgd2Ugd291bGQgaGF2ZQorICAgIC8vIHNob3J0IGNpcmN1aXRlZCBh
Ym92ZSBpZiB3ZSB3ZXJlIGRvbmUKKyAgICBkb3VibGUgZnJhY3Rpb25hbFRpbWUgPSBlbGFwc2Vk
VGltZSAvIG1fYW5pbWF0aW9uLT5kdXJhdGlvbigpOworICAgIGludCBpbnRlZ3JhbFRpbWUgPSAo
aW50KSBmcmFjdGlvbmFsVGltZTsKKyAgICBmcmFjdGlvbmFsVGltZSAtPSBpbnRlZ3JhbFRpbWU7
CisgICAgCisgICAgaWYgKG1fYW5pbWF0aW9uLT5kaXJlY3Rpb24oKSAmJiAoaW50ZWdyYWxUaW1l
ICYgMSkpCisgICAgICAgIGZyYWN0aW9uYWxUaW1lID0gMSAtIGZyYWN0aW9uYWxUaW1lOworICAg
IAorICAgIGlmIChzY2FsZSAhPSAxIHx8IG9mZnNldCAhPSAwKQorICAgICAgICBmcmFjdGlvbmFs
VGltZSA9IChmcmFjdGlvbmFsVGltZSAtIG9mZnNldCkgKiBzY2FsZTsKKyAgICAKKyAgICBpZiAo
bV9hbmltYXRpb24tPnRpbWluZ0Z1bmN0aW9uKCkudHlwZSgpID09IExpbmVhclRpbWluZ0Z1bmN0
aW9uKQorICAgICAgICByZXR1cm4gZnJhY3Rpb25hbFRpbWU7CisgICAgCisgICAgLy8gQ3ViaWMg
YmV6aWVyLgorICAgIGRvdWJsZSByZXN1bHQgPSBzb2x2ZUN1YmljQmV6aWVyRnVuY3Rpb24obV9h
bmltYXRpb24tPnRpbWluZ0Z1bmN0aW9uKCkueDEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgbV9hbmltYXRpb24tPnRpbWluZ0Z1bmN0aW9uKCkueTEoKSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9hbmltYXRpb24t
PnRpbWluZ0Z1bmN0aW9uKCkueDIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgbV9hbmltYXRpb24tPnRpbWluZ0Z1bmN0aW9uKCkueTIoKSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb25hbFRpbWUsIG1fYW5p
bWF0aW9uLT5kdXJhdGlvbigpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIEFuaW1h
dGlvbkJhc2U6OnByaW1lRXZlbnRUaW1lcnMoKQoreworICAgIC8vIERlY2lkZSB3aGVuIHRoZSBl
bmQgb3IgbG9vcCBldmVudCBuZWVkcyB0byBmaXJlCisgICAgZG91YmxlIGN0ID0gY3VycmVudFRp
bWUoKTsKKyAgICBjb25zdCBkb3VibGUgZWxhcHNlZER1cmF0aW9uID0gY3QgLSBtX3N0YXJ0VGlt
ZTsKKyAgICBBU1NFUlQoZWxhcHNlZER1cmF0aW9uID49IDApOworICAgIAorICAgIGRvdWJsZSB0
b3RhbER1cmF0aW9uID0gLTE7CisgICAgaWYgKG1fYW5pbWF0aW9uLT5pdGVyYXRpb25Db3VudCgp
ID4gMCkKKyAgICAgICAgdG90YWxEdXJhdGlvbiA9IG1fYW5pbWF0aW9uLT5kdXJhdGlvbigpICog
bV9hbmltYXRpb24tPml0ZXJhdGlvbkNvdW50KCk7CisKKyAgICBkb3VibGUgZHVyYXRpb25MZWZ0
ID0gMDsKKyAgICBkb3VibGUgbmV4dEl0ZXJhdGlvblRpbWUgPSB0b3RhbER1cmF0aW9uOworICAg
IGlmICh0b3RhbER1cmF0aW9uIDwgMCB8fCBlbGFwc2VkRHVyYXRpb24gPCB0b3RhbER1cmF0aW9u
KSB7CisgICAgICAgIGR1cmF0aW9uTGVmdCA9IG1fYW5pbWF0aW9uLT5kdXJhdGlvbigpIC0gZm1v
ZChlbGFwc2VkRHVyYXRpb24sIG1fYW5pbWF0aW9uLT5kdXJhdGlvbigpKTsKKyAgICAgICAgbmV4
dEl0ZXJhdGlvblRpbWUgPSBlbGFwc2VkRHVyYXRpb24gKyBkdXJhdGlvbkxlZnQ7CisgICAgfQor
ICAgIAorICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIG1heSBoYXZlIDAgZHVyYXRpb25MZWZ0LCBp
ZiB3ZSd2ZSBnb3R0ZW4gdGhlIGV2ZW50IGxhdGUgYW5kIHdlIGFyZSBhbHJlYWR5CisgICAgLy8g
cGFzdCB0b3RhbER1cmF0aW9uLiBJbiB0aGlzIGNhc2Ugd2Ugc3RpbGwgZmlyZSBhbiBlbmQgdGlt
ZXIgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIGVuZC4gCisgICAgLy8gVGhpcyBkZWZlcnMgdGhlIGNh
bGwgdG8gc2VuZEFuaW1hdGlvbkV2ZW50cyB0byBhdm9pZCByZS1lbnRyYW50IGNhbGxzIHRoYXQg
ZGVzdHJveQorICAgIC8vIHRoZSBSZW5kZXJPYmplY3QsIGFuZCB0aGVyZWZvcmUgfHRoaXN8IGJl
Zm9yZSB3ZSdyZSBkb25lIHdpdGggaXQuCisgICAgaWYgKHRvdGFsRHVyYXRpb24gPCAwIHx8IG5l
eHRJdGVyYXRpb25UaW1lIDwgdG90YWxEdXJhdGlvbikgeworICAgICAgICAvLyBXZSBhcmUgbm90
IGF0IHRoZSBlbmQgeWV0LCBzZW5kIGEgbG9vcCBldmVudAorICAgICAgICBBU1NFUlQobmV4dEl0
ZXJhdGlvblRpbWUgPiAwKTsKKyAgICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9MT09QSU5HOwor
ICAgICAgICBtX2FuaW1hdGlvblRpbWVyQ2FsbGJhY2suc3RhcnRUaW1lcihkdXJhdGlvbkxlZnQs
IEV2ZW50TmFtZXM6OndlYmtpdEFuaW1hdGlvbkl0ZXJhdGlvbkV2ZW50LCBuZXh0SXRlcmF0aW9u
VGltZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLyBXZSBhcmUgYXQgdGhlIGVuZCwg
c2VuZCBhbiBlbmQgZXZlbnQKKyAgICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9FTkRJTkc7Cisg
ICAgICAgIG1fYW5pbWF0aW9uVGltZXJDYWxsYmFjay5zdGFydFRpbWVyKGR1cmF0aW9uTGVmdCwg
RXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uRW5kRXZlbnQsIG5leHRJdGVyYXRpb25UaW1lKTsK
KyAgICB9Cit9CisgIAorfQpJbmRleDogV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9BbmltYXRpb25C
YXNlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9BbmltYXRpb25CYXNl
LmgJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BhZ2UvYW5pbWF0aW9uL0FuaW1hdGlvbkJhc2Uu
aAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisg
KiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisg
KiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikg
bm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8g
ZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29m
dHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMg
IkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisg
KiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgQW5pbWF0aW9uQmFz
ZV9oCisjZGVmaW5lIEFuaW1hdGlvbkJhc2VfaAorCisjaW5jbHVkZSAiVGltZXIuaCIKKyNpbmNs
dWRlICJ3dGYvSGFzaE1hcC5oIgorI2luY2x1ZGUgIkF0b21pY1N0cmluZy5oIgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKK2NsYXNzIEFuaW1hdGlvbkNvbnRyb2xsZXI7CitjbGFzcyBBbmltYXRp
b25CYXNlOworY2xhc3MgSW1wbGljaXRBbmltYXRpb247CitjbGFzcyBLZXlmcmFtZUFuaW1hdGlv
bjsKK2NsYXNzIENvbXBvc2l0ZUFuaW1hdGlvbjsKK2NsYXNzIFJlbmRlck9iamVjdDsKK2NsYXNz
IFJlbmRlclN0eWxlOworY2xhc3MgQXRvbWljU3RyaW5nSW1wbDsKK2NsYXNzIEFuaW1hdGlvbjsK
K2NsYXNzIEVsZW1lbnQ7CitjbGFzcyBOb2RlOworCitjbGFzcyBBbmltYXRpb25UaW1lckJhc2Ug
eworcHVibGljOgorICAgIEFuaW1hdGlvblRpbWVyQmFzZShBbmltYXRpb25CYXNlKiBhbmltKQor
ICAgIDogbV90aW1lcih0aGlzLCAmQW5pbWF0aW9uVGltZXJCYXNlOjp0aW1lckZpcmVkKQorICAg
ICwgbV9hbmltKGFuaW0pCisgICAgeworICAgICAgICBtX3RpbWVyLnN0YXJ0T25lU2hvdCgwKTsK
KyAgICB9CisgICAgdmlydHVhbCB+QW5pbWF0aW9uVGltZXJCYXNlKCkKKyAgICB7CisgICAgfQor
ICAgIAorICAgIHZvaWQgc3RhcnRUaW1lcihkb3VibGUgdGltZW91dD0wKQorICAgIHsKKyAgICAg
ICAgbV90aW1lci5zdGFydE9uZVNob3QodGltZW91dCk7CisgICAgfQorICAgIAorICAgIHZvaWQg
Y2FuY2VsVGltZXIoKQorICAgIHsKKyAgICAgICAgbV90aW1lci5zdG9wKCk7CisgICAgfQorICAg
IAorICAgIHZpcnR1YWwgdm9pZCB0aW1lckZpcmVkKFRpbWVyPEFuaW1hdGlvblRpbWVyQmFzZT4q
KSA9IDA7CisgICAgCitwcml2YXRlOgorICAgIFRpbWVyPEFuaW1hdGlvblRpbWVyQmFzZT4gbV90
aW1lcjsKKyAgICAKK3Byb3RlY3RlZDoKKyAgICBBbmltYXRpb25CYXNlKiBtX2FuaW07Cit9Owor
CitjbGFzcyBBbmltYXRpb25FdmVudERpc3BhdGNoZXIgOiBwdWJsaWMgQW5pbWF0aW9uVGltZXJC
YXNlIHsKK3B1YmxpYzoKKyAgICBBbmltYXRpb25FdmVudERpc3BhdGNoZXIoQW5pbWF0aW9uQmFz
ZSogYW5pbSk7ICAgIAorICAgIHZpcnR1YWwgfkFuaW1hdGlvbkV2ZW50RGlzcGF0Y2hlcigpCisg
ICAgeworICAgIH0KKyAgICAKKyAgICB2b2lkIHN0YXJ0VGltZXIoRWxlbWVudCogZWxlbWVudCwg
Y29uc3QgQXRvbWljU3RyaW5nJiBuYW1lLCBpbnQgcHJvcGVydHksIGJvb2wgcmVzZXQsCisgICAg
ICAgICAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgZXZlbnRUeXBlLCBkb3VibGUgZWxh
cHNlZFRpbWUpCisgICAgeworICAgICAgICBtX2VsZW1lbnQgPSBlbGVtZW50OworICAgICAgICBt
X25hbWUgPSBuYW1lOworICAgICAgICBtX3Byb3BlcnR5ID0gcHJvcGVydHk7CisgICAgICAgIG1f
cmVzZXQgPSByZXNldDsKKyAgICAgICAgbV9ldmVudFR5cGUgPSBldmVudFR5cGU7CisgICAgICAg
IG1fZWxhcHNlZFRpbWUgPSBlbGFwc2VkVGltZTsKKyAgICAgICAgQW5pbWF0aW9uVGltZXJCYXNl
OjpzdGFydFRpbWVyKCk7CisgICAgfQorICAgIAorICAgIHZpcnR1YWwgdm9pZCB0aW1lckZpcmVk
KFRpbWVyPEFuaW1hdGlvblRpbWVyQmFzZT4qKTsKKyAgICAKK3ByaXZhdGU6CisgICAgUmVmUHRy
PEVsZW1lbnQ+IG1fZWxlbWVudDsKKyAgICBBdG9taWNTdHJpbmcgbV9uYW1lOworICAgIGludCBt
X3Byb3BlcnR5OworICAgIGJvb2wgbV9yZXNldDsKKyAgICBBdG9taWNTdHJpbmcgbV9ldmVudFR5
cGU7CisgICAgZG91YmxlIG1fZWxhcHNlZFRpbWU7Cit9OworCitjbGFzcyBBbmltYXRpb25UaW1l
ckNhbGxiYWNrIDogcHVibGljIEFuaW1hdGlvblRpbWVyQmFzZSB7CitwdWJsaWM6CisgICAgQW5p
bWF0aW9uVGltZXJDYWxsYmFjayhBbmltYXRpb25CYXNlKiBhbmltKSAKKyAgICA6IEFuaW1hdGlv
blRpbWVyQmFzZShhbmltKQorICAgICwgbV9lbGFwc2VkVGltZSgwKQorICAgIHsgfQorICAgIHZp
cnR1YWwgfkFuaW1hdGlvblRpbWVyQ2FsbGJhY2soKSB7IH0KKyAgICAKKyAgICB2aXJ0dWFsIHZv
aWQgdGltZXJGaXJlZChUaW1lcjxBbmltYXRpb25UaW1lckJhc2U+Kik7CisgICAgCisgICAgdm9p
ZCBzdGFydFRpbWVyKGRvdWJsZSB0aW1lb3V0LCBjb25zdCBBdG9taWNTdHJpbmcmIGV2ZW50VHlw
ZSwgZG91YmxlIGVsYXBzZWRUaW1lKQorICAgIHsKKyAgICAgICAgbV9ldmVudFR5cGUgPSBldmVu
dFR5cGU7CisgICAgICAgIG1fZWxhcHNlZFRpbWUgPSBlbGFwc2VkVGltZTsKKyAgICAgICAgQW5p
bWF0aW9uVGltZXJCYXNlOjpzdGFydFRpbWVyKHRpbWVvdXQpOworICAgIH0KKyAgICAKK3ByaXZh
dGU6CisgICAgQXRvbWljU3RyaW5nIG1fZXZlbnRUeXBlOworICAgIGRvdWJsZSBtX2VsYXBzZWRU
aW1lOworfTsKKworY2xhc3MgQW5pbWF0aW9uQmFzZSA6IHB1YmxpYyBOb25jb3B5YWJsZSB7Cisg
ICAgZnJpZW5kIGNsYXNzIENvbXBvc2l0ZUFuaW1hdGlvbjsKKyAgICAKK3B1YmxpYzoKKyAgICBB
bmltYXRpb25CYXNlKGNvbnN0IEFuaW1hdGlvbiogdHJhbnNpdGlvbiwgUmVuZGVyT2JqZWN0KiBy
ZW5kZXJlciwgQ29tcG9zaXRlQW5pbWF0aW9uKiBjb21wQW5pbSk7CisgICAgdmlydHVhbCB+QW5p
bWF0aW9uQmFzZSgpOworICAgICAgICAKKyAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyKCkgY29u
c3QgeyByZXR1cm4gbV9vYmplY3Q7IH0KKyAgICBkb3VibGUgc3RhcnRUaW1lKCkgY29uc3QgeyBy
ZXR1cm4gbV9zdGFydFRpbWU7IH0KKyAgICBkb3VibGUgZHVyYXRpb24oKSBjb25zdDsKKyAgICAK
KyAgICB2b2lkIGNhbmNlbFRpbWVycygpCisgICAgeworICAgICAgICBtX2FuaW1hdGlvblRpbWVy
Q2FsbGJhY2suY2FuY2VsVGltZXIoKTsKKyAgICAgICAgbV9hbmltYXRpb25FdmVudERpc3BhdGNo
ZXIuY2FuY2VsVGltZXIoKTsKKyAgICB9CisgICAgCisgICAgLy8gQW5pbWF0aW9ucyBhbmQgVHJh
bnNpdGlvbnMgZ28gdGhyb3VnaCB0aGUgc3RhdGVzIGJlbG93LiBXaGVuIGVudGVyaW5nIHRoZSBT
VEFSVEVEIHN0YXRlCisgICAgLy8gdGhlIGFuaW1hdGlvbiBpcyBzdGFydGVkLiBUaGlzIG1heSBv
ciBtYXkgbm90IHJlcXVpcmUgZGVmZXJyZWQgcmVzcG9uc2UgZnJvbSB0aGUgYW5pbWF0b3IuCisg
ICAgLy8gSWYgc28sIHdlIHN0YXkgaW4gdGhpcyBzdGF0ZSB1bnRpbCB0aGF0IHJlc3BvbnNlIGlz
IHJlY2VpdmVkIChhbmQgaXQgcmV0dXJucyB0aGUgc3RhcnQgdGltZSkuCisgICAgLy8gT3RoZXJ3
aXNlLCB3ZSB1c2UgdGhlIGN1cnJlbnQgdGltZSBhcyB0aGUgc3RhcnQgdGltZSBhbmQgZ28gaW1t
ZWRpYXRlbHkgdG8gdGhlIExPT1BJTkcgb3IKKyAgICAvLyBFTkRJTkcgc3RhdGUuCisgICAgZW51
bSBBbmltU3RhdGUgeyAKKyAgICAgICAgU1RBVEVfTkVXLCAgICAgICAgICAgICAgICAgICAgICAv
LyBhbmltYXRpb24ganVzdCBjcmVhdGVkLCBhbmltYXRpb24gbm90IHJ1bm5pbmcgeWV0CisgICAg
ICAgIFNUQVRFX1NUQVJUX1dBSVRfVElNRVIsICAgICAgICAgLy8gc3RhcnQgdGltZXIgcnVubmlu
Zywgd2FpdGluZyBmb3IgZmlyZQorICAgICAgICBTVEFURV9TVEFSVF9XQUlUX1NUWUxFX0FWQUlM
QUJMRSwgICAvLyB3YWl0aW5nIGZvciBzdHlsZSBzZXR1cCBzbyB3ZSBjYW4gc3RhcnQgYW5pbWF0
aW9ucworICAgICAgICBTVEFURV9TVEFSVF9XQUlUX1JFU1BPTlNFLCAgICAgIC8vIGFuaW1hdGlv
biBzdGFydGVkLCB3YWl0aW5nIGZvciByZXNwb25zZQorICAgICAgICBTVEFURV9MT09QSU5HLCAg
ICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIHJlY2VpdmVkLCBhbmltYXRpb24gcnVubmluZywg
bG9vcCB0aW1lciBydW5uaW5nLCB3YWl0aW5nIGZvciBmaXJlCisgICAgICAgIFNUQVRFX0VORElO
RywgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgcmVjZWl2ZWQsIGFuaW1hdGlvbiBydW5u
aW5nLCBlbmQgdGltZXIgcnVubmluZywgd2FpdGluZyBmb3IgZmlyZQorICAgICAgICBTVEFURV9Q
QVVTRURfV0FJVF9USU1FUiwgICAgICAgIC8vIGFuaW1hdGlvbiBpbiBwYXVzZSBtb2RlIHdoZW4g
YW5pbWF0aW9uIHN0YXJ0ZWQKKyAgICAgICAgU1RBVEVfUEFVU0VEX1dBSVRfUkVTUE9OU0UsICAg
ICAvLyBhbmltYXRpb24gcGF1c2VkIHdoZW4gaW4gU1RBUlRJTkcgc3RhdGUKKyAgICAgICAgU1RB
VEVfUEFVU0VEX1JVTiwgICAgICAgICAgICAgICAvLyBhbmltYXRpb24gcGF1c2VkIHdoZW4gaW4g
TE9PUElORyBvciBFTkRJTkcgc3RhdGUKKyAgICAgICAgU1RBVEVfRE9ORSAgICAgICAgICAgICAg
ICAgICAgICAvLyBlbmQgdGltZXIgZmlyZWQsIGFuaW1hdGlvbiBmaW5pc2hlZCBhbmQgcmVtb3Zl
ZAorICAgIH07CisgICAgCisgICAgZW51bSBBbmltU3RhdGVJbnB1dCB7CisgICAgICAgIFNUQVRF
X0lOUFVUX01BS0VfTkVXLCAgICAgICAgICAgLy8gcmVzZXQgYmFjayB0byBuZXcgZnJvbSBhbnkg
c3RhdGUKKyAgICAgICAgU1RBVEVfSU5QVVRfU1RBUlRfQU5JTUFUSU9OLCAgICAvLyBhbmltYXRp
b24gcmVxdWVzdHMgYSBzdGFydAorICAgICAgICBTVEFURV9JTlBVVF9SRVNUQVJUX0FOSU1BVElP
TiwgIC8vIGZvcmNlIGEgcmVzdGFydCBmcm9tIGFueSBzdGF0ZQorICAgICAgICBTVEFURV9JTlBV
VF9TVEFSVF9USU1FUl9GSVJFRCwgIC8vIHN0YXJ0IHRpbWVyIGZpcmVkCisgICAgICAgIFNUQVRF
X0lOUFVUX1NUWUxFX0FWQUlMQUJMRSwgICAgICAgIC8vIHN0eWxlIGlzIHNldHVwLCByZWFkeSB0
byBzdGFydCBhbmltYXRpbmcKKyAgICAgICAgU1RBVEVfSU5QVVRfU1RBUlRfVElNRV9TRVQsICAg
ICAvLyBtX3N0YXJ0VGltZSB3YXMgc2V0CisgICAgICAgIFNUQVRFX0lOUFVUX0xPT1BfVElNRVJf
RklSRUQsICAgLy8gbG9vcCB0aW1lciBmaXJlZAorICAgICAgICBTVEFURV9JTlBVVF9FTkRfVElN
RVJfRklSRUQsICAgIC8vIGVuZCB0aW1lciBmaXJlZAorICAgICAgICBTVEFURV9JTlBVVF9QQVVT
RV9PVkVSUklERSwgICAgIC8vIHBhdXNlIGFuIGFuaW1hdGlvbiBkdWUgdG8gb3ZlcnJpZGUKKyAg
ICAgICAgU1RBVEVfSU5QVVRfUkVTVU1FX09WRVJSSURFLCAgICAvLyByZXN1bWUgYW4gb3ZlcnJp
ZGRlbiBhbmltYXRpb24KKyAgICAgICAgU1RBVEVfSU5QVVRfUExBWV9TVEFURV9SVU5OSU5HLCAv
LyBwbGF5IHN0YXRlIHBhdXNlZCAtPiBydW5uaW5nCisgICAgICAgIFNUQVRFX0lOUFVUX1BMQVlf
U1RBVEVfUEFVU0VELCAgLy8gcGxheSBzdGF0ZSBydW5uaW5nIC0+IHBhdXNlZAorICAgICAgICBT
VEFURV9JTlBVVF9FTkRfQU5JTUFUSU9OICAgICAgIC8vIGZvcmNlIGFuIGVuZCBmcm9tIGFueSBz
dGF0ZQorICAgIH07CisgICAgCisgICAgLy8gQ2FsbGVkIHdoZW4gYW5pbWF0aW9uIGlzIGluIE5F
VyBzdGF0ZSB0byBzdGFydCBhbmltYXRpb24KKyAgICB2b2lkIHVwZGF0ZVN0YXRlTWFjaGluZShB
bmltU3RhdGVJbnB1dCBpbnB1dCwgZG91YmxlIHBhcmFtKTsKKyAgICAKKyAgICAvLyBBbmltYXRp
b24gaGFzIGFjdHVhbGx5IHN0YXJ0ZWQsIGF0IHBhc3NlZCB0aW1lCisgICAgdm9pZCBvbkFuaW1h
dGlvblN0YXJ0UmVzcG9uc2UoZG91YmxlIHN0YXJ0VGltZSk7CisgICAgCisgICAgLy8gQ2FsbGVk
IHRvIGNoYW5nZSB0byBvciBmcm9tIHBhdXNlZCBzdGF0ZQorICAgIHZvaWQgdXBkYXRlUGxheVN0
YXRlKGJvb2wgcnVubmluZyk7CisgICAgYm9vbCBwbGF5U3RhdGVQbGF5aW5nKCkgY29uc3Q7Cisg
ICAgCisgICAgYm9vbCB3YWl0aW5nVG9TdGFydCgpIGNvbnN0IHsgcmV0dXJuIG1fYW5pbVN0YXRl
ID09IFNUQVRFX05FVyB8fCBtX2FuaW1TdGF0ZSA9PSBTVEFURV9TVEFSVF9XQUlUX1RJTUVSOyB9
CisgICAgYm9vbCBwcmVBY3RpdmUoKSBjb25zdAorICAgIHsgcmV0dXJuIG1fYW5pbVN0YXRlID09
IFNUQVRFX05FVyB8fAorICAgICAgICAgICAgIG1fYW5pbVN0YXRlID09IFNUQVRFX1NUQVJUX1dB
SVRfVElNRVIgfHwKKyAgICAgICAgICAgICBtX2FuaW1TdGF0ZSA9PSBTVEFURV9TVEFSVF9XQUlU
X1NUWUxFX0FWQUlMQUJMRSB8fAorICAgICAgICAgICAgIG1fYW5pbVN0YXRlID09IFNUQVRFX1NU
QVJUX1dBSVRfUkVTUE9OU0U7CisgICAgfQorICAgIGJvb2wgcG9zdEFjdGl2ZSgpIGNvbnN0IHsg
cmV0dXJuIG1fYW5pbVN0YXRlID09IFNUQVRFX0RPTkU7IH0KKyAgICBib29sIGFjdGl2ZSgpIGNv
bnN0IHsgcmV0dXJuICFwb3N0QWN0aXZlKCkgJiYgIXByZUFjdGl2ZSgpOyB9CisgICAgYm9vbCBy
dW5uaW5nKCkgY29uc3QgeyByZXR1cm4gIWlzTmV3KCkgJiYgIXBvc3RBY3RpdmUoKTsgfQorICAg
IGJvb2wgcGF1c2VkKCkgY29uc3QgeyByZXR1cm4gbV9wYXVzZVRpbWUgPj0gMDsgfQorICAgIGJv
b2wgaXNOZXcoKSBjb25zdCB7IHJldHVybiBtX2FuaW1TdGF0ZSA9PSBTVEFURV9ORVc7IH0KKyAg
ICBib29sIHdhaXRpbmdGb3JTdGFydFRpbWUoKSBjb25zdCB7IHJldHVybiBtX2FuaW1TdGF0ZSA9
PSBTVEFURV9TVEFSVF9XQUlUX1JFU1BPTlNFOyB9CisgICAgYm9vbCB3YWl0aW5nRm9yU3R5bGVB
dmFpbGFibGUoKSBjb25zdCB7IHJldHVybiBtX2FuaW1TdGF0ZSA9PSBTVEFURV9TVEFSVF9XQUlU
X1NUWUxFX0FWQUlMQUJMRTsgfQorICAgIGJvb2wgd2FpdGluZ0ZvckVuZEV2ZW50KCkgY29uc3Qg
IHsgcmV0dXJuIG1fd2FpdGluZ0ZvckVuZEV2ZW50OyB9CisgICAgCisgICAgLy8gImFuaW1hdGlu
ZyIgbWVhbnMgdGhhdCBzb21ldGhpbmcgaXMgcnVubmluZyB0aGF0IHJlcXVpcmVzIGEgdGltZXIg
dG8ga2VlcCBmaXJpbmcKKyAgICAvLyAoZS5nLiBhIHNvZnR3YXJlIGFuaW1hdGlvbikKKyAgICB2
b2lkIHNldEFuaW1hdGluZyhib29sIGluQW5pbWF0aW5nID0gdHJ1ZSkgeyBtX2FuaW1hdGluZyA9
IGluQW5pbWF0aW5nOyB9CisgICAgYm9vbCBhbmltYXRpbmcoKSBjb25zdCB7IHJldHVybiBtX2Fu
aW1hdGluZzsgfQorICAgIAorICAgIGRvdWJsZSBwcm9ncmVzcyhkb3VibGUgc2NhbGUsIGRvdWJs
ZSBvZmZzZXQpIGNvbnN0OworICAgIAorICAgIHZpcnR1YWwgdm9pZCBhbmltYXRlKENvbXBvc2l0
ZUFuaW1hdGlvbiosIFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5
bGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRlclN0eWxlKiB0YXJnZXRT
dHlsZSwgUmVuZGVyU3R5bGUqJiBhbmltYXRlZFN0eWxlKSB7IH0KKyAgICB2aXJ0dWFsIHZvaWQg
cmVzZXQoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5bGUqIGZyb20gPSAw
LCBjb25zdCBSZW5kZXJTdHlsZSogdG8gPSAwKSB7IH0KKyAgICAKKyAgICB2aXJ0dWFsIGJvb2wg
c2hvdWxkRmlyZUV2ZW50cygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgCisgICAgdm9p
ZCBhbmltYXRpb25UaW1lckNhbGxiYWNrRmlyZWQoY29uc3QgQXRvbWljU3RyaW5nJiBldmVudFR5
cGUsIGRvdWJsZSBlbGFwc2VkVGltZSk7CisgICAgdm9pZCBhbmltYXRpb25FdmVudERpc3BhdGNo
ZXJGaXJlZChFbGVtZW50KiBlbGVtZW50LCBjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUsIGludCBw
cm9wZXJ0eSwgYm9vbCByZXNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIGNvbnN0IEF0b21pY1N0cmluZyYgZXZlbnRUeXBlLCBkb3VibGUgZWxhcHNlZFRpbWUpOwor
ICAgIAorICAgIGJvb2wgYW5pbWF0aW9uc01hdGNoKGNvbnN0IEFuaW1hdGlvbiogYW5pbSkgY29u
c3Q7CisgICAgCisgICAgdm9pZCBzZXRBbmltYXRpb24oY29uc3QgQW5pbWF0aW9uKiBhbmltKSB7
IG1fYW5pbWF0aW9uID0gY29uc3RfY2FzdDxBbmltYXRpb24qPihhbmltKTsgfQorICAgIAorICAg
IC8vIFJldHVybiB0cnVlIGlmIHRoaXMgYW5pbWF0aW9uIGlzIG92ZXJyaWRkZW4uIFRoaXMgd2ls
bCBvbmx5IGJlIHRoZSBjYXNlIGZvcgorICAgIC8vIEltcGxpY2l0QW5pbWF0aW9ucyBhbmQgaXMg
dXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIGZvcmNlCisgICAgLy8g
c2V0IHRoZSBzdGFydCB0aW1lLiBJZiBhbiBhbmltYXRpb24gaXMgb3ZlcnJpZGRlbiwgaXQgd2ls
bCBwcm9iYWJseSBub3QgZ2V0CisgICAgLy8gYmFjayB0aGUgU1RBUlRfVElNRSBldmVudC4KKyAg
ICB2aXJ0dWFsIGJvb2wgb3ZlcnJpZGRlbigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAg
CisgICAgLy8gRG9lcyB0aGlzIGFuaW1hdGlvbi90cmFuc2l0aW9uIGludm9sdmUgdGhlIGdpdmVu
IHByb3BlcnR5PworICAgIHZpcnR1YWwgYm9vbCBhZmZlY3RzUHJvcGVydHkoaW50IHByb3BlcnR5
KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgIGJvb2wgaXNBbmltYXRpbmdQcm9wZXJ0eShp
bnQgcHJvcGVydHksIGJvb2wgaXNSdW5uaW5nTm93KSBjb25zdAorICAgIHsKKyAgICAgICAgaWYg
KGlzUnVubmluZ05vdykKKyAgICAgICAgICAgIHJldHVybiAoIXdhaXRpbmdUb1N0YXJ0KCkgJiYg
IXBvc3RBY3RpdmUoKSkgJiYgYWZmZWN0c1Byb3BlcnR5KHByb3BlcnR5KTsKKworICAgICAgICBy
ZXR1cm4gIXBvc3RBY3RpdmUoKSAmJiBhZmZlY3RzUHJvcGVydHkocHJvcGVydHkpOworICAgIH0K
KyAgICAgICAgCitwcm90ZWN0ZWQ6CisgICAgRWxlbWVudCogZWxlbWVudEZvckV2ZW50RGlzcGF0
Y2goKTsKKyAgICAKKyAgICB2aXJ0dWFsIHZvaWQgb3ZlcnJpZGVBbmltYXRpb25zKCkgeyB9Cisg
ICAgdmlydHVhbCB2b2lkIHJlc3VtZU92ZXJyaWRkZW5BbmltYXRpb25zKCkgeyB9CisgICAgCisg
ICAgQ29tcG9zaXRlQW5pbWF0aW9uKiBjb21wb3NpdGVBbmltYXRpb24oKSB7IHJldHVybiBtX2Nv
bXBBbmltOyB9CisgICAgCisgICAgLy8gVGhlc2UgYXJlIGNhbGxlZCB3aGVuIHRoZSBjb3JyZXNw
b25kaW5nIHRpbWVyIGZpcmVzIHNvIHN1YmNsYXNzZXMgY2FuIGRvIGFueSBleHRyYSB3b3JrCisg
ICAgdmlydHVhbCB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoZG91YmxlIGVsYXBzZWRUaW1lKSB7IH0K
KyAgICB2aXJ0dWFsIHZvaWQgb25BbmltYXRpb25JdGVyYXRpb24oZG91YmxlIGVsYXBzZWRUaW1l
KSB7IH0KKyAgICB2aXJ0dWFsIHZvaWQgb25BbmltYXRpb25FbmQoZG91YmxlIGVsYXBzZWRUaW1l
KSB7IH0KKyAgICB2aXJ0dWFsIGJvb2wgc3RhcnRBbmltYXRpb24oZG91YmxlIGJlZ2luVGltZSkg
eyByZXR1cm4gZmFsc2U7IH0KKyAgICB2aXJ0dWFsIHZvaWQgZW5kQW5pbWF0aW9uKGJvb2wgcmVz
ZXQpIHsgfQorICAgIAorICAgIHZvaWQgcHJpbWVFdmVudFRpbWVycygpOworICAgIAorICAgIHN0
YXRpYyBib29sIHByb3BlcnRpZXNFcXVhbChpbnQgcHJvcCwgY29uc3QgUmVuZGVyU3R5bGUqIGEs
IGNvbnN0IFJlbmRlclN0eWxlKiBiKTsKKyAgICBzdGF0aWMgaW50IGdldFByb3BlcnR5QXRJbmRl
eChpbnQgaSk7CisgICAgc3RhdGljIGludCBnZXROdW1Qcm9wZXJ0aWVzKCk7CisgICAgCisgICAg
Ly8gUmV0dXJuIHRydWUgaWYgd2UgbmVlZCB0byBzdGFydCBzb2Z0d2FyZSBhbmltYXRpb24gdGlt
ZXJzCisgICAgc3RhdGljIGJvb2wgYmxlbmRQcm9wZXJ0aWVzKGludCBwcm9wLCBSZW5kZXJTdHls
ZSogZHN0LCBjb25zdCBSZW5kZXJTdHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUqIGIsIGRvdWJs
ZSBwcm9nKTsKKyAgICAKKyAgICBzdGF0aWMgdm9pZCBBbmltYXRpb25CYXNlOjpzZXRDaGFuZ2Vk
KE5vZGUqIG5vZGUpOworICAgIAorcHJvdGVjdGVkOgorICAgIEFuaW1TdGF0ZSBtX2FuaW1TdGF0
ZTsKKyAgICBpbnQgbV9pdGVyYXRpb247CisgICAgCisgICAgYm9vbCBtX2FuaW1hdGluZzsgICAg
ICAgLy8gdHJhbnNpdGlvbi9hbmltYXRpb24gcmVxdWlyZXMgY29udGludWFsIHRpbWVyIGZpcmlu
ZworICAgIGJvb2wgbV93YWl0ZWRGb3JSZXNwb25zZTsKKyAgICBkb3VibGUgbV9zdGFydFRpbWU7
CisgICAgZG91YmxlIG1fcGF1c2VUaW1lOworICAgIFJlbmRlck9iamVjdCogbV9vYmplY3Q7Cisg
ICAgCisgICAgQW5pbWF0aW9uVGltZXJDYWxsYmFjayBtX2FuaW1hdGlvblRpbWVyQ2FsbGJhY2s7
CisgICAgQW5pbWF0aW9uRXZlbnREaXNwYXRjaGVyIG1fYW5pbWF0aW9uRXZlbnREaXNwYXRjaGVy
OworICAgIFJlZlB0cjxBbmltYXRpb24+IG1fYW5pbWF0aW9uOworICAgIENvbXBvc2l0ZUFuaW1h
dGlvbiogbV9jb21wQW5pbTsKKyAgICBib29sIG1fd2FpdGluZ0ZvckVuZEV2ZW50OworCitwcml2
YXRlOgorfTsKKworfQorCisjZW5kaWYKSW5kZXg6IFdlYkNvcmUvcGFnZS9hbmltYXRpb24vQW5p
bWF0aW9uQ29udHJvbGxlci5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wYWdlL2FuaW1hdGlv
bi9BbmltYXRpb25Db250cm9sbGVyLmNwcAkocmV2aXNpb24gMzU5OTUpCShmcm9tIFdlYkNvcmUv
cGFnZS9BbmltYXRpb25Db250cm9sbGVyLmNwcDozNTk5NSkKKysrIFdlYkNvcmUvcGFnZS9hbmlt
YXRpb24vQW5pbWF0aW9uQ29udHJvbGxlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwy
MTczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2Yg
QXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBp
dHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0
cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJp
b3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQW5pbWF0aW9uQ29udHJv
bGxlci5oIgorCisjaW5jbHVkZSAiQ1NTUHJvcGVydHlOYW1lcy5oIgorI2luY2x1ZGUgIkNTdHJp
bmcuaCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIKKyNp
bmNsdWRlICJGbG9hdENvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUg
IlJlbmRlck9iamVjdC5oIgorI2luY2x1ZGUgIlJlbmRlclN0eWxlLmgiCisjaW5jbHVkZSAiU3lz
dGVtVGltZS5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisjaW5jbHVkZSAiVW5pdEJlemllci5oIgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBjb25zdCBkb3VibGUgY0FuaW1hdGlvblRp
bWVyRGVsYXkgPSAwLjAyNTsKKworc3RhdGljIHZvaWQgc2V0Q2hhbmdlZChOb2RlKiBub2RlKQor
eworICAgIEFTU0VSVCghbm9kZSB8fCAobm9kZS0+ZG9jdW1lbnQoKSAmJiAhbm9kZS0+ZG9jdW1l
bnQoKS0+aW5QYWdlQ2FjaGUoKSkpOworICAgIG5vZGUtPnNldENoYW5nZWQoQW5pbWF0aW9uU3R5
bGVDaGFuZ2UpOworfQorCisvLyBUaGUgZXBzaWxvbiB2YWx1ZSB3ZSBwYXNzIHRvIFVuaXRCZXpp
ZXI6OnNvbHZlIGdpdmVuIHRoYXQgdGhlIGFuaW1hdGlvbiBpcyBnb2luZyB0byBydW4gb3ZlciB8
ZHVyfCBzZWNvbmRzLiBUaGUgbG9uZ2VyIHRoZQorLy8gYW5pbWF0aW9uLCB0aGUgbW9yZSBwcmVj
aXNpb24gd2UgbmVlZCBpbiB0aGUgdGltaW5nIGZ1bmN0aW9uIHJlc3VsdCB0byBhdm9pZCB1Z2x5
IGRpc2NvbnRpbnVpdGllcy4KK3N0YXRpYyBpbmxpbmUgZG91YmxlIHNvbHZlRXBzaWxvbihkb3Vi
bGUgZHVyYXRpb24pIHsgcmV0dXJuIDEuIC8gKDIwMC4gKiBkdXJhdGlvbik7IH0KKworc3RhdGlj
IGlubGluZSBkb3VibGUgc29sdmVDdWJpY0JlemllckZ1bmN0aW9uKGRvdWJsZSBwMXgsIGRvdWJs
ZSBwMXksIGRvdWJsZSBwMngsIGRvdWJsZSBwMnksIGRvdWJsZSB0LCBkb3VibGUgZHVyYXRpb24p
Cit7CisgICAgLy8gQ29udmVydCBmcm9tIGlucHV0IHRpbWUgdG8gcGFyYW1ldHJpYyB2YWx1ZSBp
biBjdXJ2ZSwgdGhlbiBmcm9tCisgICAgLy8gdGhhdCB0byBvdXRwdXQgdGltZS4KKyAgICBVbml0
QmV6aWVyIGJlemllcihwMXgsIHAxeSwgcDJ4LCBwMnkpOworICAgIHJldHVybiBiZXppZXIuc29s
dmUodCwgc29sdmVFcHNpbG9uKGR1cmF0aW9uKSk7Cit9CisKK2NsYXNzIENvbXBvc2l0ZUFuaW1h
dGlvbjsKK2NsYXNzIEFuaW1hdGlvbkJhc2U7CisKK2NsYXNzIEFuaW1hdGlvblRpbWVyQmFzZSB7
CitwdWJsaWM6CisgICAgQW5pbWF0aW9uVGltZXJCYXNlKEFuaW1hdGlvbkJhc2UqIGFuaW0pCisg
ICAgOiBtX3RpbWVyKHRoaXMsICZBbmltYXRpb25UaW1lckJhc2U6OnRpbWVyRmlyZWQpCisgICAg
LCBtX2FuaW0oYW5pbSkKKyAgICB7CisgICAgICAgIG1fdGltZXIuc3RhcnRPbmVTaG90KDApOwor
ICAgIH0KKyAgICB2aXJ0dWFsIH5BbmltYXRpb25UaW1lckJhc2UoKQorICAgIHsKKyAgICB9Cisg
ICAgCisgICAgdm9pZCBzdGFydFRpbWVyKGRvdWJsZSB0aW1lb3V0PTApCisgICAgeworICAgICAg
ICBtX3RpbWVyLnN0YXJ0T25lU2hvdCh0aW1lb3V0KTsKKyAgICB9CisgICAgCisgICAgdm9pZCBj
YW5jZWxUaW1lcigpCisgICAgeworICAgICAgICBtX3RpbWVyLnN0b3AoKTsKKyAgICB9CisgICAg
CisgICAgdmlydHVhbCB2b2lkIHRpbWVyRmlyZWQoVGltZXI8QW5pbWF0aW9uVGltZXJCYXNlPiop
ID0gMDsKKyAgICAKK3ByaXZhdGU6CisgICAgVGltZXI8QW5pbWF0aW9uVGltZXJCYXNlPiBtX3Rp
bWVyOworICAgIAorcHJvdGVjdGVkOgorICAgIEFuaW1hdGlvbkJhc2UqIG1fYW5pbTsKK307CisK
K2NsYXNzIEFuaW1hdGlvbkV2ZW50RGlzcGF0Y2hlciA6IHB1YmxpYyBBbmltYXRpb25UaW1lckJh
c2UgeworcHVibGljOgorICAgIEFuaW1hdGlvbkV2ZW50RGlzcGF0Y2hlcihBbmltYXRpb25CYXNl
KiBhbmltKSAKKyAgICA6IEFuaW1hdGlvblRpbWVyQmFzZShhbmltKQorICAgICwgbV9wcm9wZXJ0
eShDU1NQcm9wZXJ0eUludmFsaWQpCisgICAgLCBtX3Jlc2V0KGZhbHNlKQorICAgICwgbV9lbGFw
c2VkVGltZSgtMSkKKyAgICB7CisgICAgfQorICAgIAorICAgIHZpcnR1YWwgfkFuaW1hdGlvbkV2
ZW50RGlzcGF0Y2hlcigpCisgICAgeworICAgIH0KKyAgICAKKyAgICB2b2lkIHN0YXJ0VGltZXIo
RWxlbWVudCogZWxlbWVudCwgY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lLCBpbnQgcHJvcGVydHks
IGJvb2wgcmVzZXQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgZXZl
bnRUeXBlLCBkb3VibGUgZWxhcHNlZFRpbWUpCisgICAgeworICAgICAgICBtX2VsZW1lbnQgPSBl
bGVtZW50OworICAgICAgICBtX25hbWUgPSBuYW1lOworICAgICAgICBtX3Byb3BlcnR5ID0gcHJv
cGVydHk7CisgICAgICAgIG1fcmVzZXQgPSByZXNldDsKKyAgICAgICAgbV9ldmVudFR5cGUgPSBl
dmVudFR5cGU7CisgICAgICAgIG1fZWxhcHNlZFRpbWUgPSBlbGFwc2VkVGltZTsKKyAgICAgICAg
QW5pbWF0aW9uVGltZXJCYXNlOjpzdGFydFRpbWVyKCk7CisgICAgfQorICAgIAorICAgIHZpcnR1
YWwgdm9pZCB0aW1lckZpcmVkKFRpbWVyPEFuaW1hdGlvblRpbWVyQmFzZT4qKTsKKyAgICAKK3By
aXZhdGU6CisgICAgUmVmUHRyPEVsZW1lbnQ+IG1fZWxlbWVudDsKKyAgICBBdG9taWNTdHJpbmcg
bV9uYW1lOworICAgIGludCBtX3Byb3BlcnR5OworICAgIGJvb2wgbV9yZXNldDsKKyAgICBBdG9t
aWNTdHJpbmcgbV9ldmVudFR5cGU7CisgICAgZG91YmxlIG1fZWxhcHNlZFRpbWU7Cit9OworCitj
bGFzcyBBbmltYXRpb25UaW1lckNhbGxiYWNrIDogcHVibGljIEFuaW1hdGlvblRpbWVyQmFzZSB7
CitwdWJsaWM6CisgICAgQW5pbWF0aW9uVGltZXJDYWxsYmFjayhBbmltYXRpb25CYXNlKiBhbmlt
KSAKKyAgICA6IEFuaW1hdGlvblRpbWVyQmFzZShhbmltKQorICAgICwgbV9lbGFwc2VkVGltZSgw
KQorICAgIHsgfQorICAgIHZpcnR1YWwgfkFuaW1hdGlvblRpbWVyQ2FsbGJhY2soKSB7IH0KKyAg
ICAKKyAgICB2aXJ0dWFsIHZvaWQgdGltZXJGaXJlZChUaW1lcjxBbmltYXRpb25UaW1lckJhc2U+
Kik7CisgICAgCisgICAgdm9pZCBzdGFydFRpbWVyKGRvdWJsZSB0aW1lb3V0LCBjb25zdCBBdG9t
aWNTdHJpbmcmIGV2ZW50VHlwZSwgZG91YmxlIGVsYXBzZWRUaW1lKQorICAgIHsKKyAgICAgICAg
bV9ldmVudFR5cGUgPSBldmVudFR5cGU7CisgICAgICAgIG1fZWxhcHNlZFRpbWUgPSBlbGFwc2Vk
VGltZTsKKyAgICAgICAgQW5pbWF0aW9uVGltZXJCYXNlOjpzdGFydFRpbWVyKHRpbWVvdXQpOwor
ICAgIH0KKyAgICAKK3ByaXZhdGU6CisgICAgQXRvbWljU3RyaW5nIG1fZXZlbnRUeXBlOworICAg
IGRvdWJsZSBtX2VsYXBzZWRUaW1lOworfTsKKworY2xhc3MgSW1wbGljaXRBbmltYXRpb247Citj
bGFzcyBLZXlmcmFtZUFuaW1hdGlvbjsKK2NsYXNzIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRl
OworCisvLyBBIENvbXBvc2l0ZUFuaW1hdGlvbiByZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBh
bmltYXRpb25zIHRoYXQgYXJlIHJ1bm5pbmcKKy8vIG9uIGEgc2luZ2xlIFJlbmRlck9iamVjdCwg
c3VjaCBhcyBhIG51bWJlciBvZiBwcm9wZXJ0aWVzIHRyYW5zaXRpb25pbmcgYXQgb25jZS4KK2Ns
YXNzIENvbXBvc2l0ZUFuaW1hdGlvbiA6IHB1YmxpYyBOb25jb3B5YWJsZSB7CitwdWJsaWM6Cisg
ICAgQ29tcG9zaXRlQW5pbWF0aW9uKEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlKiBhbmltYXRp
b25Db250cm9sbGVyKQorICAgIDogbV9zdXNwZW5kZWQoZmFsc2UpCisgICAgLCBtX2FuaW1hdGlv
bkNvbnRyb2xsZXIoYW5pbWF0aW9uQ29udHJvbGxlcikKKyAgICAsIG1fbnVtU3R5bGVBdmFpbGFi
bGVXYWl0ZXJzKDApCisgICAgeyB9CisgICAgCisgICAgfkNvbXBvc2l0ZUFuaW1hdGlvbigpCisg
ICAgeworICAgICAgICBkZWxldGVBbGxWYWx1ZXMobV90cmFuc2l0aW9ucyk7CisgICAgICAgIGRl
bGV0ZUFsbFZhbHVlcyhtX2tleWZyYW1lQW5pbWF0aW9ucyk7CisgICAgfQorICAgIAorICAgIFJl
bmRlclN0eWxlKiBhbmltYXRlKFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlclN0eWxlKiBjdXJy
ZW50U3R5bGUsIFJlbmRlclN0eWxlKiB0YXJnZXRTdHlsZSk7CisgICAgCisgICAgdm9pZCBzZXRB
bmltYXRpbmcoYm9vbCBpbkFuaW1hdGluZyk7CisgICAgYm9vbCBhbmltYXRpbmcoKTsKKyAgICAK
KyAgICBib29sIGhhc0FuaW1hdGlvbkZvclByb3BlcnR5KGludCBwcm9wKSBjb25zdCB7IHJldHVy
biBtX3RyYW5zaXRpb25zLmNvbnRhaW5zKHByb3ApOyB9CisgICAgCisgICAgdm9pZCByZXNldFRy
YW5zaXRpb25zKFJlbmRlck9iamVjdCopOworICAgIHZvaWQgcmVzZXRBbmltYXRpb25zKFJlbmRl
ck9iamVjdCopOworICAgIAorICAgIHZvaWQgY2xlYW51cEZpbmlzaGVkQW5pbWF0aW9ucyhSZW5k
ZXJPYmplY3QqKTsKKworICAgIHZvaWQgc2V0QW5pbWF0aW9uU3RhcnRUaW1lKGRvdWJsZSB0KTsK
KyAgICB2b2lkIHNldFRyYW5zaXRpb25TdGFydFRpbWUoaW50IHByb3BlcnR5LCBkb3VibGUgdCk7
CisgICAgCisgICAgdm9pZCBzdXNwZW5kQW5pbWF0aW9ucygpOworICAgIHZvaWQgcmVzdW1lQW5p
bWF0aW9ucygpOworICAgIGJvb2wgc3VzcGVuZGVkKCkgY29uc3QgeyByZXR1cm4gbV9zdXNwZW5k
ZWQ7IH0KKyAgICAKKyAgICB2b2lkIG92ZXJyaWRlSW1wbGljaXRBbmltYXRpb25zKGludCBwcm9w
ZXJ0eSk7CisgICAgdm9pZCByZXN1bWVPdmVycmlkZGVuSW1wbGljaXRBbmltYXRpb25zKGludCBw
cm9wZXJ0eSk7CisgICAgCisgICAgdm9pZCBzdHlsZUF2YWlsYWJsZSgpOworICAgIAorICAgIGJv
b2wgaXNBbmltYXRpbmdQcm9wZXJ0eShpbnQgcHJvcGVydHksIGJvb2wgaXNSdW5uaW5nTm93KSBj
b25zdDsKKyAgICAKKyAgICB2b2lkIHNldFdhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZShib29sIHdh
aXRpbmcpOworCitwcm90ZWN0ZWQ6CisgICAgdm9pZCB1cGRhdGVUcmFuc2l0aW9ucyhSZW5kZXJP
YmplY3QqIHJlbmRlcmVyLCBjb25zdCBSZW5kZXJTdHlsZSogY3VycmVudFN0eWxlLCBSZW5kZXJT
dHlsZSogdGFyZ2V0U3R5bGUpOworICAgIHZvaWQgdXBkYXRlS2V5ZnJhbWVBbmltYXRpb25zKFJl
bmRlck9iamVjdCogcmVuZGVyZXIsIGNvbnN0IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUsIFJl
bmRlclN0eWxlKiB0YXJnZXRTdHlsZSk7CisKKyAgICBLZXlmcmFtZUFuaW1hdGlvbiogZmluZEtl
eWZyYW1lQW5pbWF0aW9uKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSk7CisgICAgCitwcml2YXRl
OgorICAgIHR5cGVkZWYgSGFzaE1hcDxpbnQsIEltcGxpY2l0QW5pbWF0aW9uKj4gQ1NTUHJvcGVy
dHlUcmFuc2l0aW9uc01hcDsKKyAgICB0eXBlZGVmIEhhc2hNYXA8QXRvbWljU3RyaW5nSW1wbCos
IEtleWZyYW1lQW5pbWF0aW9uKj4gIEFuaW1hdGlvbk5hbWVNYXA7CisgICAgCisgICAgQ1NTUHJv
cGVydHlUcmFuc2l0aW9uc01hcCAgIG1fdHJhbnNpdGlvbnM7CisgICAgQW5pbWF0aW9uTmFtZU1h
cCAgICAgICAgICAgIG1fa2V5ZnJhbWVBbmltYXRpb25zOworICAgIGJvb2wgICAgICAgICAgICAg
ICAgICAgICAgICBtX3N1c3BlbmRlZDsKKyAgICBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZSog
bV9hbmltYXRpb25Db250cm9sbGVyOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBt
X251bVN0eWxlQXZhaWxhYmxlV2FpdGVyczsKK307CisKK2NsYXNzIEFuaW1hdGlvbkJhc2UgOiBw
dWJsaWMgTm9uY29weWFibGUgeworcHVibGljOgorICAgIEFuaW1hdGlvbkJhc2UoY29uc3QgQW5p
bWF0aW9uKiB0cmFuc2l0aW9uLCBSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBDb21wb3NpdGVBbmlt
YXRpb24qIGNvbXBBbmltKTsKKyAgICB2aXJ0dWFsIH5BbmltYXRpb25CYXNlKCkKKyAgICB7Cisg
ICAgICAgIGlmIChtX2FuaW1TdGF0ZSA9PSBTVEFURV9TVEFSVF9XQUlUX1NUWUxFX0FWQUlMQUJM
RSkKKyAgICAgICAgICAgIG1fY29tcEFuaW0tPnNldFdhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZShm
YWxzZSk7CisgICAgfQorICAgIAorICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIoKSBjb25zdCB7
IHJldHVybiBtX29iamVjdDsgfQorICAgIGRvdWJsZSBzdGFydFRpbWUoKSBjb25zdCB7IHJldHVy
biBtX3N0YXJ0VGltZTsgfQorICAgIGRvdWJsZSBkdXJhdGlvbigpIGNvbnN0ICB7IHJldHVybiBt
X2FuaW1hdGlvbi0+ZHVyYXRpb24oKTsgfQorICAgIAorICAgIHZvaWQgY2FuY2VsVGltZXJzKCkK
KyAgICB7CisgICAgICAgIG1fYW5pbWF0aW9uVGltZXJDYWxsYmFjay5jYW5jZWxUaW1lcigpOwor
ICAgICAgICBtX2FuaW1hdGlvbkV2ZW50RGlzcGF0Y2hlci5jYW5jZWxUaW1lcigpOworICAgIH0K
KyAgICAKKyAgICAvLyBBbmltYXRpb25zIGFuZCBUcmFuc2l0aW9ucyBnbyB0aHJvdWdoIHRoZSBz
dGF0ZXMgYmVsb3cuIFdoZW4gZW50ZXJpbmcgdGhlIFNUQVJURUQgc3RhdGUKKyAgICAvLyB0aGUg
YW5pbWF0aW9uIGlzIHN0YXJ0ZWQuIFRoaXMgbWF5IG9yIG1heSBub3QgcmVxdWlyZSBkZWZlcnJl
ZCByZXNwb25zZSBmcm9tIHRoZSBhbmltYXRvci4KKyAgICAvLyBJZiBzbywgd2Ugc3RheSBpbiB0
aGlzIHN0YXRlIHVudGlsIHRoYXQgcmVzcG9uc2UgaXMgcmVjZWl2ZWQgKGFuZCBpdCByZXR1cm5z
IHRoZSBzdGFydCB0aW1lKS4KKyAgICAvLyBPdGhlcndpc2UsIHdlIHVzZSB0aGUgY3VycmVudCB0
aW1lIGFzIHRoZSBzdGFydCB0aW1lIGFuZCBnbyBpbW1lZGlhdGVseSB0byB0aGUgTE9PUElORyBv
cgorICAgIC8vIEVORElORyBzdGF0ZS4KKyAgICBlbnVtIEFuaW1TdGF0ZSB7IAorICAgICAgICBT
VEFURV9ORVcsICAgICAgICAgICAgICAgICAgICAgIC8vIGFuaW1hdGlvbiBqdXN0IGNyZWF0ZWQs
IGFuaW1hdGlvbiBub3QgcnVubmluZyB5ZXQKKyAgICAgICAgU1RBVEVfU1RBUlRfV0FJVF9USU1F
UiwgICAgICAgICAvLyBzdGFydCB0aW1lciBydW5uaW5nLCB3YWl0aW5nIGZvciBmaXJlCisgICAg
ICAgIFNUQVRFX1NUQVJUX1dBSVRfU1RZTEVfQVZBSUxBQkxFLCAgIC8vIHdhaXRpbmcgZm9yIHN0
eWxlIHNldHVwIHNvIHdlIGNhbiBzdGFydCBhbmltYXRpb25zCisgICAgICAgIFNUQVRFX1NUQVJU
X1dBSVRfUkVTUE9OU0UsICAgICAgLy8gYW5pbWF0aW9uIHN0YXJ0ZWQsIHdhaXRpbmcgZm9yIHJl
c3BvbnNlCisgICAgICAgIFNUQVRFX0xPT1BJTkcsICAgICAgICAgICAgICAgICAgLy8gcmVzcG9u
c2UgcmVjZWl2ZWQsIGFuaW1hdGlvbiBydW5uaW5nLCBsb29wIHRpbWVyIHJ1bm5pbmcsIHdhaXRp
bmcgZm9yIGZpcmUKKyAgICAgICAgU1RBVEVfRU5ESU5HLCAgICAgICAgICAgICAgICAgICAvLyBy
ZXNwb25zZSByZWNlaXZlZCwgYW5pbWF0aW9uIHJ1bm5pbmcsIGVuZCB0aW1lciBydW5uaW5nLCB3
YWl0aW5nIGZvciBmaXJlCisgICAgICAgIFNUQVRFX1BBVVNFRF9XQUlUX1RJTUVSLCAgICAgICAg
Ly8gYW5pbWF0aW9uIGluIHBhdXNlIG1vZGUgd2hlbiBhbmltYXRpb24gc3RhcnRlZAorICAgICAg
ICBTVEFURV9QQVVTRURfV0FJVF9SRVNQT05TRSwgICAgIC8vIGFuaW1hdGlvbiBwYXVzZWQgd2hl
biBpbiBTVEFSVElORyBzdGF0ZQorICAgICAgICBTVEFURV9QQVVTRURfUlVOLCAgICAgICAgICAg
ICAgIC8vIGFuaW1hdGlvbiBwYXVzZWQgd2hlbiBpbiBMT09QSU5HIG9yIEVORElORyBzdGF0ZQor
ICAgICAgICBTVEFURV9ET05FICAgICAgICAgICAgICAgICAgICAgIC8vIGVuZCB0aW1lciBmaXJl
ZCwgYW5pbWF0aW9uIGZpbmlzaGVkIGFuZCByZW1vdmVkCisgICAgfTsKKyAgICAKKyAgICBlbnVt
IEFuaW1TdGF0ZUlucHV0IHsKKyAgICAgICAgU1RBVEVfSU5QVVRfTUFLRV9ORVcsICAgICAgICAg
ICAvLyByZXNldCBiYWNrIHRvIG5ldyBmcm9tIGFueSBzdGF0ZQorICAgICAgICBTVEFURV9JTlBV
VF9TVEFSVF9BTklNQVRJT04sICAgIC8vIGFuaW1hdGlvbiByZXF1ZXN0cyBhIHN0YXJ0CisgICAg
ICAgIFNUQVRFX0lOUFVUX1JFU1RBUlRfQU5JTUFUSU9OLCAgLy8gZm9yY2UgYSByZXN0YXJ0IGZy
b20gYW55IHN0YXRlCisgICAgICAgIFNUQVRFX0lOUFVUX1NUQVJUX1RJTUVSX0ZJUkVELCAgLy8g
c3RhcnQgdGltZXIgZmlyZWQKKyAgICAgICAgU1RBVEVfSU5QVVRfU1RZTEVfQVZBSUxBQkxFLCAg
ICAgICAgLy8gc3R5bGUgaXMgc2V0dXAsIHJlYWR5IHRvIHN0YXJ0IGFuaW1hdGluZworICAgICAg
ICBTVEFURV9JTlBVVF9TVEFSVF9USU1FX1NFVCwgICAgIC8vIG1fc3RhcnRUaW1lIHdhcyBzZXQK
KyAgICAgICAgU1RBVEVfSU5QVVRfTE9PUF9USU1FUl9GSVJFRCwgICAvLyBsb29wIHRpbWVyIGZp
cmVkCisgICAgICAgIFNUQVRFX0lOUFVUX0VORF9USU1FUl9GSVJFRCwgICAgLy8gZW5kIHRpbWVy
IGZpcmVkCisgICAgICAgIFNUQVRFX0lOUFVUX1BBVVNFX09WRVJSSURFLCAgICAgLy8gcGF1c2Ug
YW4gYW5pbWF0aW9uIGR1ZSB0byBvdmVycmlkZQorICAgICAgICBTVEFURV9JTlBVVF9SRVNVTUVf
T1ZFUlJJREUsICAgIC8vIHJlc3VtZSBhbiBvdmVycmlkZGVuIGFuaW1hdGlvbgorICAgICAgICBT
VEFURV9JTlBVVF9QTEFZX1NUQVRFX1JVTk5JTkcsIC8vIHBsYXkgc3RhdGUgcGF1c2VkIC0+IHJ1
bm5pbmcKKyAgICAgICAgU1RBVEVfSU5QVVRfUExBWV9TVEFURV9QQVVTRUQsICAvLyBwbGF5IHN0
YXRlIHJ1bm5pbmcgLT4gcGF1c2VkCisgICAgICAgIFNUQVRFX0lOUFVUX0VORF9BTklNQVRJT04g
ICAgICAgLy8gZm9yY2UgYW4gZW5kIGZyb20gYW55IHN0YXRlCisgICAgfTsKKyAgICAKKyAgICAv
LyBDYWxsZWQgd2hlbiBhbmltYXRpb24gaXMgaW4gTkVXIHN0YXRlIHRvIHN0YXJ0IGFuaW1hdGlv
bgorICAgIHZvaWQgdXBkYXRlU3RhdGVNYWNoaW5lKEFuaW1TdGF0ZUlucHV0IGlucHV0LCBkb3Vi
bGUgcGFyYW0pOworICAgIAorICAgIC8vIEFuaW1hdGlvbiBoYXMgYWN0dWFsbHkgc3RhcnRlZCwg
YXQgcGFzc2VkIHRpbWUKKyAgICB2b2lkIG9uQW5pbWF0aW9uU3RhcnRSZXNwb25zZShkb3VibGUg
c3RhcnRUaW1lKTsKKyAgICAKKyAgICAvLyBDYWxsZWQgdG8gY2hhbmdlIHRvIG9yIGZyb20gcGF1
c2VkIHN0YXRlCisgICAgdm9pZCB1cGRhdGVQbGF5U3RhdGUoYm9vbCBydW5uaW5nKTsKKyAgICBi
b29sIHBsYXlTdGF0ZVBsYXlpbmcoKSBjb25zdCB7IHJldHVybiBtX2FuaW1hdGlvbiAmJiBtX2Fu
aW1hdGlvbi0+cGxheVN0YXRlKCkgPT0gQW5pbVBsYXlTdGF0ZVBsYXlpbmc7IH0KKyAgICAKKyAg
ICBib29sIHdhaXRpbmdUb1N0YXJ0KCkgY29uc3QgeyByZXR1cm4gbV9hbmltU3RhdGUgPT0gU1RB
VEVfTkVXIHx8IG1fYW5pbVN0YXRlID09IFNUQVRFX1NUQVJUX1dBSVRfVElNRVI7IH0KKyAgICBi
b29sIHByZWFjdGl2ZSgpIGNvbnN0CisgICAgeyByZXR1cm4gbV9hbmltU3RhdGUgPT0gU1RBVEVf
TkVXIHx8CisgICAgICAgICAgICAgbV9hbmltU3RhdGUgPT0gU1RBVEVfU1RBUlRfV0FJVF9USU1F
UiB8fAorICAgICAgICAgICAgIG1fYW5pbVN0YXRlID09IFNUQVRFX1NUQVJUX1dBSVRfU1RZTEVf
QVZBSUxBQkxFIHx8CisgICAgICAgICAgICAgbV9hbmltU3RhdGUgPT0gU1RBVEVfU1RBUlRfV0FJ
VF9SRVNQT05TRTsKKyAgICB9CisgICAgYm9vbCBwb3N0YWN0aXZlKCkgY29uc3QgeyByZXR1cm4g
bV9hbmltU3RhdGUgPT0gU1RBVEVfRE9ORTsgfQorICAgIGJvb2wgYWN0aXZlKCkgY29uc3QgeyBy
ZXR1cm4gIXBvc3RhY3RpdmUoKSAmJiAhcHJlYWN0aXZlKCk7IH0KKyAgICBib29sIHJ1bm5pbmco
KSBjb25zdCB7IHJldHVybiAhaXNuZXcoKSAmJiAhcG9zdGFjdGl2ZSgpOyB9CisgICAgYm9vbCBw
YXVzZWQoKSBjb25zdCB7IHJldHVybiBtX3BhdXNlVGltZSA+PSAwOyB9CisgICAgYm9vbCBpc25l
dygpIGNvbnN0IHsgcmV0dXJuIG1fYW5pbVN0YXRlID09IFNUQVRFX05FVzsgfQorICAgIGJvb2wg
d2FpdGluZ0ZvclN0YXJ0VGltZSgpIGNvbnN0IHsgcmV0dXJuIG1fYW5pbVN0YXRlID09IFNUQVRF
X1NUQVJUX1dBSVRfUkVTUE9OU0U7IH0KKyAgICBib29sIHdhaXRpbmdGb3JTdHlsZUF2YWlsYWJs
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fYW5pbVN0YXRlID09IFNUQVRFX1NUQVJUX1dBSVRfU1RZTEVf
QVZBSUxBQkxFOyB9CisgICAgYm9vbCB3YWl0aW5nRm9yRW5kRXZlbnQoKSBjb25zdCAgeyByZXR1
cm4gbV93YWl0aW5nRm9yRW5kRXZlbnQ7IH0KKyAgICAKKyAgICAvLyAiYW5pbWF0aW5nIiBtZWFu
cyB0aGF0IHNvbWV0aGluZyBpcyBydW5uaW5nIHRoYXQgcmVxdWlyZXMgYSB0aW1lciB0byBrZWVw
IGZpcmluZworICAgIC8vIChlLmcuIGEgc29mdHdhcmUgYW5pbWF0aW9uKQorICAgIHZvaWQgc2V0
QW5pbWF0aW5nKGJvb2wgaW5BbmltYXRpbmcgPSB0cnVlKSB7IG1fYW5pbWF0aW5nID0gaW5Bbmlt
YXRpbmc7IH0KKyAgICBib29sIGFuaW1hdGluZygpIGNvbnN0IHsgcmV0dXJuIG1fYW5pbWF0aW5n
OyB9CisgICAgCisgICAgZG91YmxlIHByb2dyZXNzKGRvdWJsZSBzY2FsZSwgZG91YmxlIG9mZnNl
dCkgY29uc3Q7CisgICAgCisgICAgdmlydHVhbCB2b2lkIGFuaW1hdGUoQ29tcG9zaXRlQW5pbWF0
aW9uKiwgUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyU3R5bGUqIGN1cnJlbnRTdHlsZSwgCisg
ICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlLCBS
ZW5kZXJTdHlsZSomIGFuaW1hdGVkU3R5bGUpIHsgfQorICAgIHZpcnR1YWwgdm9pZCByZXNldChS
ZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBjb25zdCBSZW5kZXJTdHlsZSogZnJvbSA9IDAsIGNvbnN0
IFJlbmRlclN0eWxlKiB0byA9IDApIHsgfQorICAgIAorICAgIHZpcnR1YWwgYm9vbCBzaG91bGRG
aXJlRXZlbnRzKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAKKyAgICB2b2lkIGFuaW1h
dGlvblRpbWVyQ2FsbGJhY2tGaXJlZChjb25zdCBBdG9taWNTdHJpbmcmIGV2ZW50VHlwZSwgZG91
YmxlIGVsYXBzZWRUaW1lKTsKKyAgICB2b2lkIGFuaW1hdGlvbkV2ZW50RGlzcGF0Y2hlckZpcmVk
KEVsZW1lbnQqIGVsZW1lbnQsIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSwgaW50IHByb3BlcnR5
LCBib29sIHJlc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29u
c3QgQXRvbWljU3RyaW5nJiBldmVudFR5cGUsIGRvdWJsZSBlbGFwc2VkVGltZSk7CisgICAgCisg
ICAgYm9vbCBhbmltYXRpb25zTWF0Y2goY29uc3QgQW5pbWF0aW9uKiBhbmltKSBjb25zdCB7IHJl
dHVybiBtX2FuaW1hdGlvbi0+YW5pbWF0aW9uc01hdGNoKGFuaW0pOyB9CisgICAgCisgICAgdm9p
ZCBzZXRBbmltYXRpb24oY29uc3QgQW5pbWF0aW9uKiBhbmltKSB7IG1fYW5pbWF0aW9uID0gY29u
c3RfY2FzdDxBbmltYXRpb24qPihhbmltKTsgfQorICAgIAorICAgIC8vIFJldHVybiB0cnVlIGlm
IHRoaXMgYW5pbWF0aW9uIGlzIG92ZXJyaWRkZW4uIFRoaXMgd2lsbCBvbmx5IGJlIHRoZSBjYXNl
IGZvcgorICAgIC8vIEltcGxpY2l0QW5pbWF0aW9ucyBhbmQgaXMgdXNlZCB0byBkZXRlcm1pbmUg
d2hldGhlciBvciBub3Qgd2Ugc2hvdWxkIGZvcmNlCisgICAgLy8gc2V0IHRoZSBzdGFydCB0aW1l
LiBJZiBhbiBhbmltYXRpb24gaXMgb3ZlcnJpZGRlbiwgaXQgd2lsbCBwcm9iYWJseSBub3QgZ2V0
CisgICAgLy8gYmFjayB0aGUgU1RBUlRfVElNRSBldmVudC4KKyAgICB2aXJ0dWFsIGJvb2wgb3Zl
cnJpZGRlbigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisgICAgCisgICAgLy8gRG9lcyB0aGlz
IGFuaW1hdGlvbi90cmFuc2l0aW9uIGludm9sdmUgdGhlIGdpdmVuIHByb3BlcnR5PworICAgIHZp
cnR1YWwgYm9vbCBhZmZlY3RzUHJvcGVydHkoaW50IHByb3BlcnR5KSBjb25zdCB7IHJldHVybiBm
YWxzZTsgfQorICAgIGJvb2wgaXNBbmltYXRpbmdQcm9wZXJ0eShpbnQgcHJvcGVydHksIGJvb2wg
aXNSdW5uaW5nTm93KSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKGlzUnVubmluZ05vdykKKyAg
ICAgICAgICAgIHJldHVybiAoIXdhaXRpbmdUb1N0YXJ0KCkgJiYgIXBvc3RhY3RpdmUoKSkgJiYg
YWZmZWN0c1Byb3BlcnR5KHByb3BlcnR5KTsKKworICAgICAgICByZXR1cm4gIXBvc3RhY3RpdmUo
KSAmJiBhZmZlY3RzUHJvcGVydHkocHJvcGVydHkpOworICAgIH0KKyAgICAgICAgCitwcm90ZWN0
ZWQ6CisgICAgRWxlbWVudCogZWxlbWVudEZvckV2ZW50RGlzcGF0Y2goKQorICAgIHsKKyAgICAg
ICAgaWYgKG1fb2JqZWN0LT5ub2RlKCkgJiYgbV9vYmplY3QtPm5vZGUoKS0+aXNFbGVtZW50Tm9k
ZSgpKQorICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEVsZW1lbnQqPihtX29iamVjdC0+
bm9kZSgpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIHZpcnR1YWwgdm9p
ZCBvdmVycmlkZUFuaW1hdGlvbnMoKSB7IH0KKyAgICB2aXJ0dWFsIHZvaWQgcmVzdW1lT3ZlcnJp
ZGRlbkFuaW1hdGlvbnMoKSB7IH0KKyAgICAKKyAgICBDb21wb3NpdGVBbmltYXRpb24qIGNvbXBv
c2l0ZUFuaW1hdGlvbigpIHsgcmV0dXJuIG1fY29tcEFuaW07IH0KKyAgICAKKyAgICAvLyBUaGVz
ZSBhcmUgY2FsbGVkIHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgdGltZXIgZmlyZXMgc28gc3ViY2xh
c3NlcyBjYW4gZG8gYW55IGV4dHJhIHdvcmsKKyAgICB2aXJ0dWFsIHZvaWQgb25BbmltYXRpb25T
dGFydChkb3VibGUgZWxhcHNlZFRpbWUpIHsgfQorICAgIHZpcnR1YWwgdm9pZCBvbkFuaW1hdGlv
bkl0ZXJhdGlvbihkb3VibGUgZWxhcHNlZFRpbWUpIHsgfQorICAgIHZpcnR1YWwgdm9pZCBvbkFu
aW1hdGlvbkVuZChkb3VibGUgZWxhcHNlZFRpbWUpIHsgfQorICAgIHZpcnR1YWwgYm9vbCBzdGFy
dEFuaW1hdGlvbihkb3VibGUgYmVnaW5UaW1lKSB7IHJldHVybiBmYWxzZTsgfQorICAgIHZpcnR1
YWwgdm9pZCBlbmRBbmltYXRpb24oYm9vbCByZXNldCkgeyB9CisgICAgCisgICAgdm9pZCBwcmlt
ZUV2ZW50VGltZXJzKCk7CisgICAgCitwcm90ZWN0ZWQ6CisgICAgQW5pbVN0YXRlIG1fYW5pbVN0
YXRlOworICAgIGludCBtX2l0ZXJhdGlvbjsKKyAgICAKKyAgICBib29sIG1fYW5pbWF0aW5nOyAg
ICAgICAvLyB0cmFuc2l0aW9uL2FuaW1hdGlvbiByZXF1aXJlcyBjb250aW51YWwgdGltZXIgZmly
aW5nCisgICAgYm9vbCBtX3dhaXRlZEZvclJlc3BvbnNlOworICAgIGRvdWJsZSBtX3N0YXJ0VGlt
ZTsKKyAgICBkb3VibGUgbV9wYXVzZVRpbWU7CisgICAgUmVuZGVyT2JqZWN0KiBtX29iamVjdDsK
KyAgICAKKyAgICBBbmltYXRpb25UaW1lckNhbGxiYWNrIG1fYW5pbWF0aW9uVGltZXJDYWxsYmFj
azsKKyAgICBBbmltYXRpb25FdmVudERpc3BhdGNoZXIgbV9hbmltYXRpb25FdmVudERpc3BhdGNo
ZXI7CisgICAgUmVmUHRyPEFuaW1hdGlvbj4gbV9hbmltYXRpb247CisgICAgQ29tcG9zaXRlQW5p
bWF0aW9uKiBtX2NvbXBBbmltOworICAgIGJvb2wgbV93YWl0aW5nRm9yRW5kRXZlbnQ7Cit9Owor
CisvLyBBbiBJbXBsaWNpdEFuaW1hdGlvbiB0cmFja3MgdGhlIHN0YXRlIG9mIGEgdHJhbnNpdGlv
biBvZiBhIHNwZWNpZmljIENTUyBwcm9wZXJ0eQorLy8gZm9yIGEgc2luZ2xlIFJlbmRlck9iamVj
dC4KK2NsYXNzIEltcGxpY2l0QW5pbWF0aW9uIDogcHVibGljIEFuaW1hdGlvbkJhc2UgeworcHVi
bGljOgorICAgIEltcGxpY2l0QW5pbWF0aW9uKGNvbnN0IEFuaW1hdGlvbiogdHJhbnNpdGlvbiwg
aW50IGFuaW1hdGluZ1Byb3BlcnR5LCBSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBDb21wb3NpdGVB
bmltYXRpb24qIGNvbXBBbmltKQorICAgIDogQW5pbWF0aW9uQmFzZSh0cmFuc2l0aW9uLCByZW5k
ZXJlciwgY29tcEFuaW0pCisgICAgLCBtX3RyYW5zaXRpb25Qcm9wZXJ0eSh0cmFuc2l0aW9uLT5w
cm9wZXJ0eSgpKQorICAgICwgbV9hbmltYXRpbmdQcm9wZXJ0eShhbmltYXRpbmdQcm9wZXJ0eSkK
KyAgICAsIG1fb3ZlcnJpZGRlbihmYWxzZSkKKyAgICAsIG1fZnJvbVN0eWxlKDApCisgICAgLCBt
X3RvU3R5bGUoMCkKKyAgICB7CisgICAgICAgIEFTU0VSVChhbmltYXRpbmdQcm9wZXJ0eSAhPSBj
QW5pbWF0ZUFsbCk7CisgICAgfQorICAgIAorICAgIHZpcnR1YWwgfkltcGxpY2l0QW5pbWF0aW9u
KCkKKyAgICB7CisgICAgICAgIEFTU0VSVCghbV9mcm9tU3R5bGUgJiYgIW1fdG9TdHlsZSk7Cisg
ICAgICAgIAorICAgICAgICAvLyBJZiB3ZSB3ZXJlIHdhaXRpbmcgZm9yIGFuIGVuZCBldmVudCwg
d2UgbmVlZCB0byBmaW5pc2ggdGhlIGFuaW1hdGlvbiB0byBtYWtlIHN1cmUgbm8gb2xkCisgICAg
ICAgIC8vIGFuaW1hdGlvbnMgc3RpY2sgYXJvdW5kIGluIHRoZSBsb3dlciBsZXZlbHMKKyAgICAg
ICAgaWYgKHdhaXRpbmdGb3JFbmRFdmVudCgpICYmIG1fb2JqZWN0KQorICAgICAgICAgICAgQVNT
RVJUKDApOworICAgICAgICAKKyAgICAgICAgLy8gRG8gdGhlIGNsZWFudXAgaGVyZSBpbnN0ZWFk
IG9mIGluIHRoZSBiYXNlIGNsYXNzIHNvIHRoZSBzcGVjaWFsaXplZCBtZXRob2RzIGdldCBjYWxs
ZWQKKyAgICAgICAgaWYgKCFwb3N0YWN0aXZlKCkpCisgICAgICAgICAgICB1cGRhdGVTdGF0ZU1h
Y2hpbmUoU1RBVEVfSU5QVVRfRU5EX0FOSU1BVElPTiwgLTEpOyAgICAgCisgICAgfQorICAgIAor
ICAgIGludCB0cmFuc2l0aW9uUHJvcGVydHkoKSBjb25zdCB7IHJldHVybiBtX3RyYW5zaXRpb25Q
cm9wZXJ0eTsgfQorICAgIGludCBhbmltYXRpbmdQcm9wZXJ0eSgpIGNvbnN0IHsgcmV0dXJuIG1f
YW5pbWF0aW5nUHJvcGVydHk7IH0KKyAgICAKKyAgICB2aXJ0dWFsIHZvaWQgb25BbmltYXRpb25F
bmQoZG91YmxlIGluRWxhcHNlZFRpbWUpOworICAgIAorICAgIHZpcnR1YWwgdm9pZCBhbmltYXRl
KENvbXBvc2l0ZUFuaW1hdGlvbiosIFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlclN0eWxlKiBj
dXJyZW50U3R5bGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRlclN0eWxl
KiB0YXJnZXRTdHlsZSwgUmVuZGVyU3R5bGUqJiBhbmltYXRlZFN0eWxlKTsKKyAgICB2aXJ0dWFs
IHZvaWQgcmVzZXQoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5bGUqIGZy
b20gPSAwLCBjb25zdCBSZW5kZXJTdHlsZSogdG8gPSAwKTsKKyAgICAKKyAgICB2b2lkIHNldE92
ZXJyaWRkZW4oYm9vbCBiKTsKKyAgICB2aXJ0dWFsIGJvb2wgb3ZlcnJpZGRlbigpIGNvbnN0IHsg
cmV0dXJuIG1fb3ZlcnJpZGRlbjsgfQorICAgIAorICAgIHZpcnR1YWwgYm9vbCBzaG91bGRGaXJl
RXZlbnRzKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICAgIAorICAgIHZpcnR1YWwgYm9vbCBh
ZmZlY3RzUHJvcGVydHkoaW50IHByb3BlcnR5KSBjb25zdDsKKyAgICAKKyAgICBib29sIGhhc1N0
eWxlKCkgY29uc3QgeyByZXR1cm4gbV9mcm9tU3R5bGUgJiYgbV90b1N0eWxlOyB9CisgICAgCisg
ICAgYm9vbCBpc1RhcmdldFByb3BlcnR5RXF1YWwoaW50IHByb3AsIGNvbnN0IFJlbmRlclN0eWxl
KiB0YXJnZXRTdHlsZSk7CisKKyAgICB2b2lkIGJsZW5kUHJvcGVydHlWYWx1ZUluU3R5bGUoaW50
IHByb3AsIFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUpOworICAgIAorcHJvdGVjdGVkOgorICAg
IGJvb2wgc2hvdWxkU2VuZEV2ZW50Rm9yTGlzdGVuZXIoRG9jdW1lbnQ6Okxpc3RlbmVyVHlwZSBp
bkxpc3RlbmVyVHlwZSkKKyAgICB7CisgICAgICAgIHJldHVybiBtX29iamVjdC0+ZG9jdW1lbnQo
KS0+aGFzTGlzdGVuZXJUeXBlKGluTGlzdGVuZXJUeXBlKTsKKyAgICB9CisgICAgCisgICAgYm9v
bCBzZW5kVHJhbnNpdGlvbkV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyYgaW5FdmVudFR5cGUsIGRv
dWJsZSBpbkVsYXBzZWRUaW1lKTsKKyAgICAKK3ByaXZhdGU6CisgICAgaW50IG1fdHJhbnNpdGlv
blByb3BlcnR5OyAgIC8vIFRyYW5zaXRpb24gcHJvcGVydHkgYXMgc3BlY2lmaWVkIGluIHRoZSBS
ZW5kZXJTdHlsZS4gTWF5IGJlIGNBbmltYXRlQWxsCisgICAgaW50IG1fYW5pbWF0aW5nUHJvcGVy
dHk7ICAgIC8vIFNwZWNpZmljIHByb3BlcnR5IGZvciB0aGlzIEltcGxpY2l0QW5pbWF0aW9uCisg
ICAgYm9vbCBtX292ZXJyaWRkZW47ICAgICAgICAgIC8vIHRydWUgd2hlbiB0aGVyZSBpcyBhIGtl
eWZyYW1lIGFuaW1hdGlvbiB0aGF0IG92ZXJyaWRlcyB0aGUgdHJhbnNpdGlvbmluZyBwcm9wZXJ0
eQorICAgIAorICAgIC8vIFRoZSB0d28gc3R5bGVzIHRoYXQgd2UgYXJlIGJsZW5kaW5nLgorICAg
IFJlbmRlclN0eWxlKiBtX2Zyb21TdHlsZTsKKyAgICBSZW5kZXJTdHlsZSogbV90b1N0eWxlOwor
fTsKKwordm9pZCBBbmltYXRpb25UaW1lckNhbGxiYWNrOjp0aW1lckZpcmVkKFRpbWVyPEFuaW1h
dGlvblRpbWVyQmFzZT4qKQoreworICAgIG1fYW5pbS0+YW5pbWF0aW9uVGltZXJDYWxsYmFja0Zp
cmVkKG1fZXZlbnRUeXBlLCBtX2VsYXBzZWRUaW1lKTsKK30KKwordm9pZCBBbmltYXRpb25FdmVu
dERpc3BhdGNoZXI6OnRpbWVyRmlyZWQoVGltZXI8QW5pbWF0aW9uVGltZXJCYXNlPiopCit7Cisg
ICAgbV9hbmltLT5hbmltYXRpb25FdmVudERpc3BhdGNoZXJGaXJlZChtX2VsZW1lbnQuZ2V0KCks
IG1fbmFtZSwgbV9wcm9wZXJ0eSwgbV9yZXNldCwgbV9ldmVudFR5cGUsIG1fZWxhcHNlZFRpbWUp
OworfQorCisvLyBBbiBLZXlmcmFtZUFuaW1hdGlvbiB0cmFja3MgdGhlIHN0YXRlIG9mIGFuIGV4
cGxpY2l0IGFuaW1hdGlvbgorLy8gZm9yIGEgc2luZ2xlIFJlbmRlck9iamVjdC4KK2NsYXNzIEtl
eWZyYW1lQW5pbWF0aW9uIDogcHVibGljIEFuaW1hdGlvbkJhc2UgeworcHVibGljOgorICAgIEtl
eWZyYW1lQW5pbWF0aW9uKGNvbnN0IEFuaW1hdGlvbiogYW5pbWF0aW9uLCBSZW5kZXJPYmplY3Qq
IHJlbmRlcmVyLCBpbnQgaW5kZXgsIENvbXBvc2l0ZUFuaW1hdGlvbiogY29tcEFuaW0pCisgICAg
OiBBbmltYXRpb25CYXNlKGFuaW1hdGlvbiwgcmVuZGVyZXIsIGNvbXBBbmltKQorICAgICwgbV9r
ZXlmcmFtZXMoYW5pbWF0aW9uLT5rZXlmcmFtZUxpc3QoKSkKKyAgICAsIG1fbmFtZShhbmltYXRp
b24tPm5hbWUoKSkKKyAgICAsIG1faW5kZXgoaW5kZXgpCisgICAgeworICAgIH0KKworICAgIHZp
cnR1YWwgfktleWZyYW1lQW5pbWF0aW9uKCkKKyAgICB7CisgICAgICAgIC8vIERvIHRoZSBjbGVh
bnVwIGhlcmUgaW5zdGVhZCBvZiBpbiB0aGUgYmFzZSBjbGFzcyBzbyB0aGUgc3BlY2lhbGl6ZWQg
bWV0aG9kcyBnZXQgY2FsbGVkCisgICAgICAgIGlmICghcG9zdGFjdGl2ZSgpKQorICAgICAgICAg
ICAgdXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVUX0VORF9BTklNQVRJT04sIC0xKTsKKyAg
ICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgYW5pbWF0ZShDb21wb3NpdGVBbmltYXRpb24qLCBSZW5k
ZXJPYmplY3QqLCBjb25zdCBSZW5kZXJTdHlsZSogY3VycmVudFN0eWxlLAorICAgICAgICAgICAg
ICAgICAgICAgICAgIGNvbnN0IFJlbmRlclN0eWxlKiB0YXJnZXRTdHlsZSwgUmVuZGVyU3R5bGUq
JiBhbmltYXRlZFN0eWxlKTsKKworICAgIHZvaWQgc2V0TmFtZShjb25zdCBTdHJpbmcmIHMpIHsg
bV9uYW1lID0gczsgfQorICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSgpIGNvbnN0IHsgcmV0
dXJuIG1fbmFtZTsgfQorICAgIGludCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXg7IH0K
KworICAgIHZpcnR1YWwgYm9vbCBzaG91bGRGaXJlRXZlbnRzKCkgY29uc3QgeyByZXR1cm4gdHJ1
ZTsgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoZG91
YmxlIGluRWxhcHNlZFRpbWUpOworICAgIHZpcnR1YWwgdm9pZCBvbkFuaW1hdGlvbkl0ZXJhdGlv
bihkb3VibGUgaW5FbGFwc2VkVGltZSk7CisgICAgdmlydHVhbCB2b2lkIG9uQW5pbWF0aW9uRW5k
KGRvdWJsZSBpbkVsYXBzZWRUaW1lKTsKKyAgICB2aXJ0dWFsIHZvaWQgZW5kQW5pbWF0aW9uKGJv
b2wgcmVzZXQpOworCisgICAgdmlydHVhbCB2b2lkIG92ZXJyaWRlQW5pbWF0aW9ucygpOworICAg
IHZpcnR1YWwgdm9pZCByZXN1bWVPdmVycmlkZGVuQW5pbWF0aW9ucygpOworICAgIAorICAgIGJv
b2wgc2hvdWxkU2VuZEV2ZW50Rm9yTGlzdGVuZXIoRG9jdW1lbnQ6Okxpc3RlbmVyVHlwZSBpbkxp
c3RlbmVyVHlwZSkKKyAgICB7CisgICAgICAgIHJldHVybiBtX29iamVjdC0+ZG9jdW1lbnQoKS0+
aGFzTGlzdGVuZXJUeXBlKGluTGlzdGVuZXJUeXBlKTsKKyAgICB9CisgICAgCisgICAgYm9vbCBz
ZW5kQW5pbWF0aW9uRXZlbnQoY29uc3QgQXRvbWljU3RyaW5nJiBpbkV2ZW50VHlwZSwgZG91Ymxl
IGluRWxhcHNlZFRpbWUpOworICAgIAorICAgIHZpcnR1YWwgYm9vbCBhZmZlY3RzUHJvcGVydHko
aW50IHByb3BlcnR5KSBjb25zdDsKKworcHJpdmF0ZToKKyAgICAvLyBUaGUga2V5ZnJhbWVzIHRo
YXQgd2UgYXJlIGJsZW5kaW5nLgorICAgIFJlZlB0cjxLZXlmcmFtZUxpc3Q+IG1fa2V5ZnJhbWVz
OworICAgIEF0b21pY1N0cmluZyBtX25hbWU7CisgICAgLy8gVGhlIG9yZGVyIGluIHdoaWNoIHRo
aXMgYW5pbWF0aW9uIGFwcGVhcnMgaW4gdGhlIGFuaW1hdGlvbi1uYW1lIHN0eWxlLgorICAgIGlu
dCBtX2luZGV4OworfTsKKworQW5pbWF0aW9uQmFzZTo6QW5pbWF0aW9uQmFzZShjb25zdCBBbmlt
YXRpb24qIHRyYW5zaXRpb24sIFJlbmRlck9iamVjdCogcmVuZGVyZXIsIENvbXBvc2l0ZUFuaW1h
dGlvbiogY29tcEFuaW0pCis6IG1fYW5pbVN0YXRlKFNUQVRFX05FVykKKywgbV9pdGVyYXRpb24o
MCkKKywgbV9hbmltYXRpbmcoZmFsc2UpCissIG1fd2FpdGVkRm9yUmVzcG9uc2UoZmFsc2UpCiss
IG1fc3RhcnRUaW1lKDApCissIG1fcGF1c2VUaW1lKC0xKQorLCBtX29iamVjdChyZW5kZXJlcikK
KywgbV9hbmltYXRpb25UaW1lckNhbGxiYWNrKGNvbnN0X2Nhc3Q8QW5pbWF0aW9uQmFzZSo+KHRo
aXMpKQorLCBtX2FuaW1hdGlvbkV2ZW50RGlzcGF0Y2hlcihjb25zdF9jYXN0PEFuaW1hdGlvbkJh
c2UqPih0aGlzKSkKKywgbV9hbmltYXRpb24oY29uc3RfY2FzdDxBbmltYXRpb24qPih0cmFuc2l0
aW9uKSkKKywgbV9jb21wQW5pbShjb21wQW5pbSkKKywgbV93YWl0aW5nRm9yRW5kRXZlbnQoZmFs
c2UpCit7Cit9CisKK3ZvaWQgQW5pbWF0aW9uQmFzZTo6dXBkYXRlU3RhdGVNYWNoaW5lKEFuaW1T
dGF0ZUlucHV0IGlucHV0LCBkb3VibGUgcGFyYW0pCit7CisgICAgLy8gSWYgd2UgZ2V0IGEgUkVT
VEFSVCB0aGVuIHdlIGZvcmNlIGEgbmV3IGFuaW1hdGlvbiwgcmVnYXJkbGVzcyBvZiBzdGF0ZQor
ICAgIGlmIChpbnB1dCA9PSBTVEFURV9JTlBVVF9NQUtFX05FVykgeworICAgICAgICBpZiAobV9h
bmltU3RhdGUgPT0gU1RBVEVfU1RBUlRfV0FJVF9TVFlMRV9BVkFJTEFCTEUpCisgICAgICAgICAg
ICBtX2NvbXBBbmltLT5zZXRXYWl0aW5nRm9yU3R5bGVBdmFpbGFibGUoZmFsc2UpOworICAgICAg
ICBtX2FuaW1TdGF0ZSA9IFNUQVRFX05FVzsKKyAgICAgICAgbV9zdGFydFRpbWUgPSAwOworICAg
ICAgICBtX3BhdXNlVGltZSA9IC0xOworICAgICAgICBtX3dhaXRlZEZvclJlc3BvbnNlID0gZmFs
c2U7CisgICAgICAgIGVuZEFuaW1hdGlvbihmYWxzZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisgICAgZWxzZSBpZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfUkVTVEFSVF9BTklNQVRJT04pIHsK
KyAgICAgICAgY2FuY2VsVGltZXJzKCk7CisgICAgICAgIGlmIChtX2FuaW1TdGF0ZSA9PSBTVEFU
RV9TVEFSVF9XQUlUX1NUWUxFX0FWQUlMQUJMRSkKKyAgICAgICAgICAgIG1fY29tcEFuaW0tPnNl
dFdhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZShmYWxzZSk7CisgICAgICAgIG1fYW5pbVN0YXRlID0g
U1RBVEVfTkVXOworICAgICAgICBtX3N0YXJ0VGltZSA9IDA7CisgICAgICAgIG1fcGF1c2VUaW1l
ID0gLTE7CisgICAgICAgIGVuZEFuaW1hdGlvbihmYWxzZSk7CisgICAgICAgIAorICAgICAgICBp
ZiAoIXBhdXNlZCgpKQorICAgICAgICAgICAgdXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVU
X1NUQVJUX0FOSU1BVElPTiwgLTEpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVsc2Ug
aWYgKGlucHV0ID09IFNUQVRFX0lOUFVUX0VORF9BTklNQVRJT04pIHsKKyAgICAgICAgY2FuY2Vs
VGltZXJzKCk7CisgICAgICAgIGlmIChtX2FuaW1TdGF0ZSA9PSBTVEFURV9TVEFSVF9XQUlUX1NU
WUxFX0FWQUlMQUJMRSkKKyAgICAgICAgICAgIG1fY29tcEFuaW0tPnNldFdhaXRpbmdGb3JTdHls
ZUF2YWlsYWJsZShmYWxzZSk7CisgICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfRE9ORTsKKyAg
ICAgICAgZW5kQW5pbWF0aW9uKHRydWUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVs
c2UgaWYgKGlucHV0ID09IFNUQVRFX0lOUFVUX1BBVVNFX09WRVJSSURFKSB7CisgICAgICAgIGlm
IChtX2FuaW1TdGF0ZSA9PSBTVEFURV9TVEFSVF9XQUlUX1JFU1BPTlNFKSB7CisgICAgICAgICAg
ICAvLyBJZiB3ZSBhcmUgaW4gdGhlIFdBSVRfUkVTUE9OU0Ugc3RhdGUsIHRoZSBhbmltYXRpb24g
d2lsbCBnZXQgY2FuY2VsZWQgYmVmb3JlIAorICAgICAgICAgICAgLy8gd2UgZ2V0IGEgcmVzcG9u
c2UsIHNvIG1vdmUgdG8gdGhlIG5leHQgc3RhdGUKKyAgICAgICAgICAgIGVuZEFuaW1hdGlvbihm
YWxzZSk7CisgICAgICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUoU1RBVEVfSU5QVVRfU1RBUlRf
VElNRV9TRVQsIGN1cnJlbnRUaW1lKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAg
ICB9CisgICAgZWxzZSBpZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfUkVTVU1FX09WRVJSSURFKSB7
CisgICAgICAgIGlmIChtX2FuaW1TdGF0ZSA9PSBTVEFURV9MT09QSU5HIHx8IG1fYW5pbVN0YXRl
ID09IFNUQVRFX0VORElORykgeworICAgICAgICAgICAgLy8gU3RhcnQgdGhlIGFuaW1hdGlvbgor
ICAgICAgICAgICAgc3RhcnRBbmltYXRpb24obV9zdGFydFRpbWUpOworICAgICAgICB9CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisgICAgCisgICAgLy8gRXhlY3V0ZSBzdGF0ZSBtYWNoaW5lCisg
ICAgc3dpdGNoKG1fYW5pbVN0YXRlKSB7CisgICAgICAgIGNhc2UgU1RBVEVfTkVXOgorICAgICAg
ICAgICAgQVNTRVJUKGlucHV0ID09IFNUQVRFX0lOUFVUX1NUQVJUX0FOSU1BVElPTiB8fCBpbnB1
dCA9PSBTVEFURV9JTlBVVF9QTEFZX1NUQVRFX1JVTk5JTkcgfHwgaW5wdXQgPT0gU1RBVEVfSU5Q
VVRfUExBWV9TVEFURV9QQVVTRUQpOworICAgICAgICAgICAgaWYgKGlucHV0ID09IFNUQVRFX0lO
UFVUX1NUQVJUX0FOSU1BVElPTiB8fCBpbnB1dCA9PSBTVEFURV9JTlBVVF9QTEFZX1NUQVRFX1JV
Tk5JTkcpIHsKKyAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHN0YXJ0IHRpbWVyIHRvIHRoZSBp
bml0aWFsIGRlbGF5ICgwIGlmIG5vIGRlbGF5KQorICAgICAgICAgICAgICAgIG1fd2FpdGVkRm9y
UmVzcG9uc2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX1NU
QVJUX1dBSVRfVElNRVI7CisgICAgICAgICAgICAgICAgbV9hbmltYXRpb25UaW1lckNhbGxiYWNr
LnN0YXJ0VGltZXIobV9hbmltYXRpb24tPmRlbGF5KCksIEV2ZW50TmFtZXM6OndlYmtpdEFuaW1h
dGlvblN0YXJ0RXZlbnQsIG1fYW5pbWF0aW9uLT5kZWxheSgpKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1NUQVJUX1dBSVRfVElNRVI6Cisg
ICAgICAgICAgICBBU1NFUlQoaW5wdXQgPT0gU1RBVEVfSU5QVVRfU1RBUlRfVElNRVJfRklSRUQg
fHwgaW5wdXQgPT0gU1RBVEVfSU5QVVRfUExBWV9TVEFURV9QQVVTRUQpOworICAgICAgICAgICAg
CisgICAgICAgICAgICBpZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfU1RBUlRfVElNRVJfRklSRUQp
IHsKKyAgICAgICAgICAgICAgICBBU1NFUlQocGFyYW0gPj0gMCk7CisgICAgICAgICAgICAgICAg
Ly8gU3RhcnQgdGltZXIgaGFzIGZpcmVkLCB0ZWxsIHRoZSBhbmltYXRpb24gdG8gc3RhcnQgYW5k
IHdhaXQgZm9yIGl0IHRvIHJlc3BvbmQgd2l0aCBzdGFydCB0aW1lCisgICAgICAgICAgICAgICAg
bV9hbmltU3RhdGUgPSBTVEFURV9TVEFSVF9XQUlUX1NUWUxFX0FWQUlMQUJMRTsKKyAgICAgICAg
ICAgICAgICBtX2NvbXBBbmltLT5zZXRXYWl0aW5nRm9yU3R5bGVBdmFpbGFibGUodHJ1ZSk7Cisg
ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBhIHJlbmRlciBzbyB3
ZSBjYW4gc3RhcnQgdGhlIGFuaW1hdGlvbgorICAgICAgICAgICAgICAgIHNldENoYW5nZWQobV9v
YmplY3QtPmVsZW1lbnQoKSk7CisgICAgICAgICAgICAgICAgbV9vYmplY3QtPmFuaW1hdGlvbigp
LT5zdGFydFVwZGF0ZVJlbmRlcmluZ0Rpc3BhdGNoZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEFTU0VSVChydW5uaW5nKCkpOworICAgICAg
ICAgICAgICAgIC8vIFdlJ3JlIHdhaXRpbmcgZm9yIHRoZSBzdGFydCB0aW1lciB0byBmaXJlIGFu
ZCB3ZSBnb3QgYSBwYXVzZS4gQ2FuY2VsIHRoZSB0aW1lciwgcGF1c2UgYW5kIHdhaXQKKyAgICAg
ICAgICAgICAgICBtX3BhdXNlVGltZSA9IGN1cnJlbnRUaW1lKCk7CisgICAgICAgICAgICAgICAg
Y2FuY2VsVGltZXJzKCk7CisgICAgICAgICAgICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9QQVVT
RURfV0FJVF9USU1FUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICBjYXNlIFNUQVRFX1NUQVJUX1dBSVRfU1RZTEVfQVZBSUxBQkxFOgorICAgICAgICAgICAgQVNT
RVJUKGlucHV0ID09IFNUQVRFX0lOUFVUX1NUWUxFX0FWQUlMQUJMRSB8fCBpbnB1dCA9PSBTVEFU
RV9JTlBVVF9QTEFZX1NUQVRFX1BBVVNFRCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG1f
Y29tcEFuaW0tPnNldFdhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZShmYWxzZSk7CisgICAgICAgICAg
ICAKKyAgICAgICAgICAgIGlmIChpbnB1dCA9PSBTVEFURV9JTlBVVF9TVFlMRV9BVkFJTEFCTEUp
IHsKKyAgICAgICAgICAgICAgICAvLyBTdGFydCB0aW1lciBoYXMgZmlyZWQsIHRlbGwgdGhlIGFu
aW1hdGlvbiB0byBzdGFydCBhbmQgd2FpdCBmb3IgaXQgdG8gcmVzcG9uZCB3aXRoIHN0YXJ0IHRp
bWUKKyAgICAgICAgICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX1NUQVJUX1dBSVRfUkVTUE9O
U0U7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgb3ZlcnJpZGVBbmltYXRpb25z
KCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgLy8gU2VuZCBzdGFydCBldmVu
dCwgaWYgbmVlZGVkCisgICAgICAgICAgICAgICAgb25BbmltYXRpb25TdGFydCgwLjBmKTsgLy8g
VGhlIGVsYXBzZWRUaW1lIGlzIGFsd2F5cyAwIGhlcmUKKyAgICAgICAgICAgICAgICAKKyAgICAg
ICAgICAgICAgICAvLyBTdGFydCB0aGUgYW5pbWF0aW9uCisgICAgICAgICAgICAgICAgaWYgKG92
ZXJyaWRkZW4oKSB8fCAhc3RhcnRBbmltYXRpb24oMCkpIHsKKyAgICAgICAgICAgICAgICAgICAg
Ly8gV2UncmUgbm90IGdvaW5nIHRvIGdldCBhIHN0YXJ0VGltZSBjYWxsYmFjaywgc28gZmlyZSB0
aGUgc3RhcnQgdGltZSBoZXJlCisgICAgICAgICAgICAgICAgICAgIG1fYW5pbVN0YXRlID0gU1RB
VEVfU1RBUlRfV0FJVF9SRVNQT05TRTsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3RhdGVN
YWNoaW5lKFNUQVRFX0lOUFVUX1NUQVJUX1RJTUVfU0VULCBjdXJyZW50VGltZSgpKTsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBt
X3dhaXRlZEZvclJlc3BvbnNlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVs
c2UgeworICAgICAgICAgICAgICAgIEFTU0VSVChydW5uaW5nKCkpOworICAgICAgICAgICAgICAg
IC8vIFdlJ3JlIHdhaXRpbmcgZm9yIHRoZSBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzdHlsZSBo
YXMgYmVlbiBzZXR1cC4gSWYgd2UncmUgYXNrZWQgdG8gd2FpdAorICAgICAgICAgICAgICAgIC8v
IGF0IHRoaXMgcG9pbnQsIHRoZSBzdHlsZSBtdXN0IGhhdmUgYmVlbiBwcm9jZXNzZWQsIHNvIHdl
IGNhbiBkZWFsIHdpdGggdGhpcyBsaWtlIHdlIHdvdWxkCisgICAgICAgICAgICAgICAgLy8gZm9y
IFdBSVRfUkVTUE9OU0UsIGV4Y2VwdCB0aGF0IHdlIGRvbid0IG5lZWQgdG8gZG8gYW4gZW5kQW5p
bWF0aW9uKCkuCisgICAgICAgICAgICAgICAgbV9wYXVzZVRpbWUgPSAwOworICAgICAgICAgICAg
ICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfU1RBUlRfV0FJVF9SRVNQT05TRTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX1NUQVJUX1dBSVRfUkVT
UE9OU0U6CisgICAgICAgICAgICBBU1NFUlQoaW5wdXQgPT0gU1RBVEVfSU5QVVRfU1RBUlRfVElN
RV9TRVQgfHwgaW5wdXQgPT0gU1RBVEVfSU5QVVRfUExBWV9TVEFURV9QQVVTRUQpOworICAgICAg
ICAgICAgCisgICAgICAgICAgICBpZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfU1RBUlRfVElNRV9T
RVQpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlQocGFyYW0gPj0gMCk7CisgICAgICAgICAgICAg
ICAgLy8gV2UgaGF2ZSBhIHN0YXJ0IHRpbWUsIHNldCBpdCwgdW5sZXNzIHRoZSBzdGFydFRpbWUg
aXMgYWxyZWFkeSBzZXQKKyAgICAgICAgICAgICAgICBpZiAobV9zdGFydFRpbWUgPD0gMCkKKyAg
ICAgICAgICAgICAgICAgICAgbV9zdGFydFRpbWUgPSBwYXJhbTsKKyAgICAgICAgICAgICAgICAK
KyAgICAgICAgICAgICAgICAvLyBEZWNpZGUgd2hlbiB0aGUgZW5kIG9yIGxvb3AgZXZlbnQgbmVl
ZHMgdG8gZmlyZQorICAgICAgICAgICAgICAgIHByaW1lRXZlbnRUaW1lcnMoKTsKKyAgICAgICAg
ICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGEgcmVuZGVyIHNvIHdlIGNhbiBz
dGFydCB0aGUgYW5pbWF0aW9uCisgICAgICAgICAgICAgICAgc2V0Q2hhbmdlZChtX29iamVjdC0+
ZWxlbWVudCgpKTsKKyAgICAgICAgICAgICAgICBtX29iamVjdC0+YW5pbWF0aW9uKCktPnN0YXJ0
VXBkYXRlUmVuZGVyaW5nRGlzcGF0Y2hlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
ZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIHBhdXNpbmcgd2hpbGUgd2FpdGluZyBm
b3IgYSBzdGFydCByZXNwb25zZS4gQ2FuY2VsIHRoZSBhbmltYXRpb24gYW5kIHdhaXQuIFdoZW4g
CisgICAgICAgICAgICAgICAgLy8gd2UgdW5wYXVzZSwgd2Ugd2lsbCBhY3QgYXMgdGhvdWdoIHRo
ZSBzdGFydCB0aW1lciBqdXN0IGZpcmVkCisgICAgICAgICAgICAgICAgbV9wYXVzZVRpbWUgPSAw
OworICAgICAgICAgICAgICAgIGVuZEFuaW1hdGlvbihmYWxzZSk7CisgICAgICAgICAgICAgICAg
bV9hbmltU3RhdGUgPSBTVEFURV9QQVVTRURfV0FJVF9SRVNQT05TRTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX0xPT1BJTkc6CisgICAgICAg
ICAgICBBU1NFUlQoaW5wdXQgPT0gU1RBVEVfSU5QVVRfTE9PUF9USU1FUl9GSVJFRCB8fCBpbnB1
dCA9PSBTVEFURV9JTlBVVF9QTEFZX1NUQVRFX1BBVVNFRCk7CisgICAgICAgICAgICAKKyAgICAg
ICAgICAgIGlmIChpbnB1dCA9PSBTVEFURV9JTlBVVF9MT09QX1RJTUVSX0ZJUkVEKSB7CisgICAg
ICAgICAgICAgICAgQVNTRVJUKHBhcmFtID49IDApOworICAgICAgICAgICAgICAgIC8vIExvb3Ag
dGltZXIgZmlyZWQsIGxvb3AgYWdhaW4gb3IgZW5kLgorICAgICAgICAgICAgICAgIG9uQW5pbWF0
aW9uSXRlcmF0aW9uKHBhcmFtKTsKKyAgICAgICAgICAgICAgICBwcmltZUV2ZW50VGltZXJzKCk7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBX
ZSBhcmUgcGF1c2luZyB3aGlsZSBydW5uaW5nLiBDYW5jZWwgdGhlIGFuaW1hdGlvbiBhbmQgd2Fp
dAorICAgICAgICAgICAgICAgIG1fcGF1c2VUaW1lID0gY3VycmVudFRpbWUoKTsKKyAgICAgICAg
ICAgICAgICBjYW5jZWxUaW1lcnMoKTsKKyAgICAgICAgICAgICAgICBlbmRBbmltYXRpb24oZmFs
c2UpOworICAgICAgICAgICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfUEFVU0VEX1JVTjsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUQVRFX0VORElO
RzoKKyAgICAgICAgICAgIEFTU0VSVChpbnB1dCA9PSBTVEFURV9JTlBVVF9FTkRfVElNRVJfRklS
RUQgfHwgaW5wdXQgPT0gU1RBVEVfSU5QVVRfUExBWV9TVEFURV9QQVVTRUQpOworICAgICAgICAg
ICAgCisgICAgICAgICAgICBpZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfRU5EX1RJTUVSX0ZJUkVE
KSB7CisgICAgICAgICAgICAgICAgQVNTRVJUKHBhcmFtID49IDApOworICAgICAgICAgICAgICAg
IC8vIEVuZCB0aW1lciBmaXJlZCwgZmluaXNoIHVwCisgICAgICAgICAgICAgICAgb25BbmltYXRp
b25FbmQocGFyYW0pOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHJlc3VtZU92
ZXJyaWRkZW5BbmltYXRpb25zKCk7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAg
Ly8gRmlyZSBvZmYgYW5vdGhlciBzdHlsZSBjaGFuZ2Ugc28gd2UgY2FuIHNldCB0aGUgZmluYWwg
dmFsdWUKKyAgICAgICAgICAgICAgICBzZXRDaGFuZ2VkKG1fb2JqZWN0LT5lbGVtZW50KCkpOwor
ICAgICAgICAgICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfRE9ORTsKKyAgICAgICAgICAgICAg
ICBtX29iamVjdC0+YW5pbWF0aW9uKCktPnN0YXJ0VXBkYXRlUmVuZGVyaW5nRGlzcGF0Y2hlcigp
OworICAgICAgICAgICAgICAgIC8vIHx0aGlzfCBtYXkgYmUgZGVsZXRlZCBoZXJlIHdoZW4gd2Un
dmUgYmVlbiBjYWxsZWQgZnJvbSB0aW1lckZpcmVkKCkKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBwYXVzaW5nIHdoaWxlIHJ1bm5p
bmcuIENhbmNlbCB0aGUgYW5pbWF0aW9uIGFuZCB3YWl0CisgICAgICAgICAgICAgICAgbV9wYXVz
ZVRpbWUgPSBjdXJyZW50VGltZSgpOworICAgICAgICAgICAgICAgIGNhbmNlbFRpbWVycygpOwor
ICAgICAgICAgICAgICAgIGVuZEFuaW1hdGlvbihmYWxzZSk7CisgICAgICAgICAgICAgICAgbV9h
bmltU3RhdGUgPSBTVEFURV9QQVVTRURfUlVOOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
Ly8gfHRoaXN8IG1heSBiZSBkZWxldGVkIGhlcmUKKyAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICBjYXNlIFNUQVRFX1BBVVNFRF9XQUlUX1RJTUVSOgorICAgICAgICAgICAgQVNTRVJUKGlucHV0
ID09IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUlVOTklORyk7CisgICAgICAgICAgICBBU1NFUlQo
IXJ1bm5pbmcoKSk7CisgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHRpbWVzCisgICAgICAgICAg
ICBtX3N0YXJ0VGltZSArPSBjdXJyZW50VGltZSgpIC0gbV9wYXVzZVRpbWU7CisgICAgICAgICAg
ICBtX3BhdXNlVGltZSA9IC0xOworICAgICAgICAgICAgCisgICAgICAgICAgICAvLyB3ZSB3ZXJl
IHdhaXRpbmcgZm9yIHRoZSBzdGFydCB0aW1lciB0byBmaXJlLCBnbyBiYWNrIGFuZCB3YWl0IGFn
YWluCisgICAgICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX05FVzsKKyAgICAgICAgICAgIHVw
ZGF0ZVN0YXRlTWFjaGluZShTVEFURV9JTlBVVF9TVEFSVF9BTklNQVRJT04sIDApOworICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEX1dBSVRfUkVTUE9OU0U6Cisg
ICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEX1JVTjoKKyAgICAgICAgICAgIC8vIFdlIHRyZWF0IHRo
ZXNlIHR3byBjYXNlcyB0aGUgc2FtZS4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0LCB3aGVu
IHdlIGFyZSBpbiB0aGUgV0FJVF9SRVNQT05TRQorICAgICAgICAgICAgLy8gc3RhdGUsIHdlIGRv
bid0IHlldCBoYXZlIGEgdmFsaWQgc3RhcnRUaW1lLCBzbyB3ZSBzZW5kIDAgdG8gc3RhcnRBbmlt
YXRpb24uIFdoZW4gdGhlIFNUQVJUX1RJTUUKKyAgICAgICAgICAgIC8vIGV2ZW50IGNvbWVzIGlu
IHFuZCB3ZSB3ZXJlIGluIHRoZSBSVU4gc3RhdGUsIHdlIHdpbGwgbm90aWNlIHRoYXQgd2UgaGF2
ZSBhbHJlYWR5IHNldCB0aGUgCisgICAgICAgICAgICAvLyBzdGFydFRpbWUgYW5kIHdpbGwgaWdu
b3JlIGl0LgorICAgICAgICAgICAgQVNTRVJUKGlucHV0ID09IFNUQVRFX0lOUFVUX1BMQVlfU1RB
VEVfUlVOTklORyk7CisgICAgICAgICAgICBBU1NFUlQoIXJ1bm5pbmcoKSk7CisgICAgICAgICAg
ICAvLyBVcGRhdGUgdGhlIHRpbWVzCisgICAgICAgICAgICBpZiAobV9hbmltU3RhdGUgPT0gU1RB
VEVfUEFVU0VEX1JVTikKKyAgICAgICAgICAgICAgICBtX3N0YXJ0VGltZSArPSBjdXJyZW50VGlt
ZSgpIC0gbV9wYXVzZVRpbWU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV9z
dGFydFRpbWUgPSAwOworICAgICAgICAgICAgbV9wYXVzZVRpbWUgPSAtMTsKKyAgICAgICAgICAg
IAorICAgICAgICAgICAgLy8gV2Ugd2VyZSB3YWl0aW5nIGZvciBhIGJlZ2luIHRpbWUgcmVzcG9u
c2UgZnJvbSB0aGUgYW5pbWF0aW9uLCBnbyBiYWNrIGFuZCB3YWl0IGFnYWluCisgICAgICAgICAg
ICBtX2FuaW1TdGF0ZSA9IFNUQVRFX1NUQVJUX1dBSVRfUkVTUE9OU0U7CisgICAgICAgICAgICAK
KyAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBhbmltYXRpb24KKyAgICAgICAgICAgIGlmIChvdmVy
cmlkZGVuKCkgfHwgIXN0YXJ0QW5pbWF0aW9uKG1fc3RhcnRUaW1lKSkgeworICAgICAgICAgICAg
ICAgIC8vIFdlJ3JlIG5vdCBnb2luZyB0byBnZXQgYSBzdGFydFRpbWUgY2FsbGJhY2ssIHNvIGZp
cmUgdGhlIHN0YXJ0IHRpbWUgaGVyZQorICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXRlTWFjaGlu
ZShTVEFURV9JTlBVVF9TVEFSVF9USU1FX1NFVCwgY3VycmVudFRpbWUoKSk7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbV93YWl0ZWRGb3JSZXNwb25z
ZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVEFURV9ET05FOgor
ICAgICAgICAgICAgLy8gV2UncmUgZG9uZS4gU3RheSBpbiB0aGlzIHN0YXRlIHVudGlsIHdlIGFy
ZSBkZWxldGVkCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgLy8gfHRoaXN8IG1heSBi
ZSBkZWxldGVkIGhlcmUgaWYgd2UgY2FtZSBvdXQgb2YgU1RBVEVfRU5ESU5HIHdoZW4gd2UndmUg
YmVlbiBjYWxsZWQgZnJvbSB0aW1lckZpcmVkKCkKK30KKyAgICAKK3ZvaWQgQW5pbWF0aW9uQmFz
ZTo6YW5pbWF0aW9uVGltZXJDYWxsYmFja0ZpcmVkKGNvbnN0IEF0b21pY1N0cmluZyYgZXZlbnRU
eXBlLCBkb3VibGUgZWxhcHNlZFRpbWUpCit7CisgICAgQVNTRVJUKG1fb2JqZWN0LT5kb2N1bWVu
dCgpICYmICFtX29iamVjdC0+ZG9jdW1lbnQoKS0+aW5QYWdlQ2FjaGUoKSk7CisgICAgCisgICAg
Ly8gRklYTUU6IHVzZSBhbiBlbnVtCisgICAgaWYgKGV2ZW50VHlwZSA9PSBFdmVudE5hbWVzOjp3
ZWJraXRBbmltYXRpb25TdGFydEV2ZW50KQorICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUoU1RB
VEVfSU5QVVRfU1RBUlRfVElNRVJfRklSRUQsIGVsYXBzZWRUaW1lKTsKKyAgICBlbHNlIGlmIChl
dmVudFR5cGUgPT0gRXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uSXRlcmF0aW9uRXZlbnQpCisg
ICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFURV9JTlBVVF9MT09QX1RJTUVSX0ZJUkVELCBl
bGFwc2VkVGltZSk7CisgICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IEV2ZW50TmFtZXM6OndlYmtp
dEFuaW1hdGlvbkVuZEV2ZW50KSB7CisgICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFURV9J
TlBVVF9FTkRfVElNRVJfRklSRUQsIGVsYXBzZWRUaW1lKTsKKyAgICAgICAgLy8gfHRoaXN8IG1h
eSBiZSBkZWxldGVkIGhlcmUKKyAgICB9Cit9CisKK3ZvaWQgQW5pbWF0aW9uQmFzZTo6YW5pbWF0
aW9uRXZlbnREaXNwYXRjaGVyRmlyZWQoRWxlbWVudCogZWxlbWVudCwgY29uc3QgQXRvbWljU3Ry
aW5nJiBuYW1lLCBpbnQgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGJvb2wgcmVzZXQsIGNvbnN0IEF0b21pY1N0cmluZyYgZXZlbnRU
eXBlLCBkb3VibGUgZWxhcHNlZFRpbWUpCit7CisgICAgbV93YWl0aW5nRm9yRW5kRXZlbnQgPSBm
YWxzZTsKKyAgICAKKyAgICAvLyBLZWVwIGFuIGF0b21pYyBzdHJpbmcgb24gdGhlIHN0YWNrIHRv
IGtlZXAgaXQgYWxpdmUgdW50aWwgd2UgZXhpdCB0aGlzIG1ldGhvZAorICAgIC8vIChzaW5jZSBk
aXNwYXRjaGluZyB0aGUgZXZlbnQgbWF5IGNhdXNlIHx0aGlzfCB0byBiZSBkZWxldGVkLCB0aGVy
ZWZvcmUgcmVtb3ZpbmcKKyAgICAvLyB0aGUgbGFzdCByZWYgdG8gdGhlIGF0b21pYyBzdHJpbmcp
LgorICAgIEF0b21pY1N0cmluZyBhbmltTmFtZShuYW1lKTsKKyAgICBBdG9taWNTdHJpbmcgYW5p
bUV2ZW50VHlwZShldmVudFR5cGUpOworICAgIC8vIE1ha2Ugc3VyZSB0aGUgZWxlbWVudCBzdGlj
a3MgYXJvdW5kIHRvbworICAgIFJlZlB0cjxFbGVtZW50PiBlbGVtZW50UmV0YWluZXIoZWxlbWVu
dCk7CisgICAgCisgICAgQVNTRVJUKCFlbGVtZW50IHx8IChlbGVtZW50LT5kb2N1bWVudCgpICYm
ICFlbGVtZW50LT5kb2N1bWVudCgpLT5pblBhZ2VDYWNoZSgpKSk7CisgICAgaWYgKCFlbGVtZW50
KQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoZXZlbnRUeXBlID09IEV2ZW50TmFtZXM6Ondl
YmtpdFRyYW5zaXRpb25FbmRFdmVudCkKKyAgICAgICAgZWxlbWVudC0+ZGlzcGF0Y2hXZWJLaXRU
cmFuc2l0aW9uRXZlbnQoZXZlbnRUeXBlLCBuYW1lLCBlbGFwc2VkVGltZSk7CisgICAgZWxzZQor
ICAgICAgICBlbGVtZW50LT5kaXNwYXRjaFdlYktpdEFuaW1hdGlvbkV2ZW50KGV2ZW50VHlwZSwg
bmFtZSwgZWxhcHNlZFRpbWUpOworCisgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgKHVuYW5p
bWF0ZWQpIHN0eWxlCisgICAgaWYgKGFuaW1FdmVudFR5cGUgPT0gRXZlbnROYW1lczo6d2Via2l0
QW5pbWF0aW9uRW5kRXZlbnQpCisgICAgICAgIGlmIChlbGVtZW50LT5yZW5kZXJlcigpKQorICAg
ICAgICAgICAgc2V0Q2hhbmdlZChlbGVtZW50LT5yZW5kZXJlcigpLT5lbGVtZW50KCkpOworfQor
Cit2b2lkIEFuaW1hdGlvbkJhc2U6OnVwZGF0ZVBsYXlTdGF0ZShib29sIHJ1bikKK3sKKyAgICBp
ZiAocGF1c2VkKCkgPT0gcnVuIHx8IGlzbmV3KCkpCisgICAgICAgIHVwZGF0ZVN0YXRlTWFjaGlu
ZShydW4gPyBTVEFURV9JTlBVVF9QTEFZX1NUQVRFX1JVTk5JTkcgOiBTVEFURV9JTlBVVF9QTEFZ
X1NUQVRFX1BBVVNFRCwgLTEpOworfQorCitkb3VibGUgQW5pbWF0aW9uQmFzZTo6cHJvZ3Jlc3Mo
ZG91YmxlIHNjYWxlLCBkb3VibGUgb2Zmc2V0KSBjb25zdAoreworICAgIGlmIChwcmVhY3RpdmUo
KSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgZG91YmxlIGVsYXBzZWRUaW1lID0gcnVu
bmluZygpID8gKGN1cnJlbnRUaW1lKCkgLSBtX3N0YXJ0VGltZSkgOiAobV9wYXVzZVRpbWUgLSBt
X3N0YXJ0VGltZSk7CisgICAgaWYgKHJ1bm5pbmcoKSAmJiBlbGFwc2VkVGltZSA8IDApCisgICAg
ICAgIHJldHVybiAwOworICAgIAorICAgIGRvdWJsZSBkdXIgPSBtX2FuaW1hdGlvbi0+ZHVyYXRp
b24oKTsKKyAgICBpZiAobV9hbmltYXRpb24tPml0ZXJhdGlvbkNvdW50KCkgPiAwKQorICAgICAg
ICBkdXIgKj0gbV9hbmltYXRpb24tPml0ZXJhdGlvbkNvdW50KCk7CisgICAgCisgICAgaWYgKHBv
c3RhY3RpdmUoKSB8fCAhbV9hbmltYXRpb24tPmR1cmF0aW9uKCkgfHwgKG1fYW5pbWF0aW9uLT5p
dGVyYXRpb25Db3VudCgpID4gMCAmJiBlbGFwc2VkVGltZSA+PSBkdXIpKQorICAgICAgICByZXR1
cm4gMS4wOworICAgIAorICAgIC8vIENvbXB1dGUgdGhlIGZyYWN0aW9uYWwgdGltZSwgdGFraW5n
IGludG8gYWNjb3VudCBkaXJlY3Rpb24uCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byB3b3Jy
eSBhYm91dCBpdGVyYXRpb25zLCB3ZSBhc3N1bWUgdGhhdCB3ZSB3b3VsZCBoYXZlCisgICAgLy8g
c2hvcnQgY2lyY3VpdGVkIGFib3ZlIGlmIHdlIHdlcmUgZG9uZQorICAgIGRvdWJsZSBmcmFjdGlv
bmFsVGltZSA9IGVsYXBzZWRUaW1lIC8gbV9hbmltYXRpb24tPmR1cmF0aW9uKCk7CisgICAgaW50
IGludGVncmFsVGltZSA9IChpbnQpIGZyYWN0aW9uYWxUaW1lOworICAgIGZyYWN0aW9uYWxUaW1l
IC09IGludGVncmFsVGltZTsKKyAgICAKKyAgICBpZiAobV9hbmltYXRpb24tPmRpcmVjdGlvbigp
ICYmIChpbnRlZ3JhbFRpbWUgJiAxKSkKKyAgICAgICAgZnJhY3Rpb25hbFRpbWUgPSAxIC0gZnJh
Y3Rpb25hbFRpbWU7CisgICAgCisgICAgaWYgKHNjYWxlICE9IDEgfHwgb2Zmc2V0ICE9IDApCisg
ICAgICAgIGZyYWN0aW9uYWxUaW1lID0gKGZyYWN0aW9uYWxUaW1lIC0gb2Zmc2V0KSAqIHNjYWxl
OworICAgIAorICAgIGlmIChtX2FuaW1hdGlvbi0+dGltaW5nRnVuY3Rpb24oKS50eXBlKCkgPT0g
TGluZWFyVGltaW5nRnVuY3Rpb24pCisgICAgICAgIHJldHVybiBmcmFjdGlvbmFsVGltZTsKKyAg
ICAKKyAgICAvLyBDdWJpYyBiZXppZXIuCisgICAgZG91YmxlIHJlc3VsdCA9IHNvbHZlQ3ViaWNC
ZXppZXJGdW5jdGlvbihtX2FuaW1hdGlvbi0+dGltaW5nRnVuY3Rpb24oKS54MSgpLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2FuaW1hdGlvbi0+dGltaW5n
RnVuY3Rpb24oKS55MSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBtX2FuaW1hdGlvbi0+dGltaW5nRnVuY3Rpb24oKS54MigpLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2FuaW1hdGlvbi0+dGltaW5nRnVuY3Rpb24o
KS55MigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFj
dGlvbmFsVGltZSwgbV9hbmltYXRpb24tPmR1cmF0aW9uKCkpOworICAgIHJldHVybiByZXN1bHQ7
Cit9CisKK3ZvaWQgQW5pbWF0aW9uQmFzZTo6cHJpbWVFdmVudFRpbWVycygpCit7CisgICAgLy8g
RGVjaWRlIHdoZW4gdGhlIGVuZCBvciBsb29wIGV2ZW50IG5lZWRzIHRvIGZpcmUKKyAgICBkb3Vi
bGUgY3QgPSBjdXJyZW50VGltZSgpOworICAgIGNvbnN0IGRvdWJsZSBlbGFwc2VkRHVyYXRpb24g
PSBjdCAtIG1fc3RhcnRUaW1lOworICAgIEFTU0VSVChlbGFwc2VkRHVyYXRpb24gPj0gMCk7Cisg
ICAgCisgICAgZG91YmxlIHRvdGFsRHVyYXRpb24gPSAtMTsKKyAgICBpZiAobV9hbmltYXRpb24t
Pml0ZXJhdGlvbkNvdW50KCkgPiAwKQorICAgICAgICB0b3RhbER1cmF0aW9uID0gbV9hbmltYXRp
b24tPmR1cmF0aW9uKCkgKiBtX2FuaW1hdGlvbi0+aXRlcmF0aW9uQ291bnQoKTsKKworICAgIGRv
dWJsZSBkdXJhdGlvbkxlZnQgPSAwOworICAgIGRvdWJsZSBuZXh0SXRlcmF0aW9uVGltZSA9IHRv
dGFsRHVyYXRpb247CisgICAgaWYgKHRvdGFsRHVyYXRpb24gPCAwIHx8IGVsYXBzZWREdXJhdGlv
biA8IHRvdGFsRHVyYXRpb24pIHsKKyAgICAgICAgZHVyYXRpb25MZWZ0ID0gbV9hbmltYXRpb24t
PmR1cmF0aW9uKCkgLSBmbW9kKGVsYXBzZWREdXJhdGlvbiwgbV9hbmltYXRpb24tPmR1cmF0aW9u
KCkpOworICAgICAgICBuZXh0SXRlcmF0aW9uVGltZSA9IGVsYXBzZWREdXJhdGlvbiArIGR1cmF0
aW9uTGVmdDsKKyAgICB9CisgICAgCisgICAgLy8gQXQgdGhpcyBwb2ludCwgd2UgbWF5IGhhdmUg
MCBkdXJhdGlvbkxlZnQsIGlmIHdlJ3ZlIGdvdHRlbiB0aGUgZXZlbnQgbGF0ZSBhbmQgd2UgYXJl
IGFscmVhZHkKKyAgICAvLyBwYXN0IHRvdGFsRHVyYXRpb24uIEluIHRoaXMgY2FzZSB3ZSBzdGls
bCBmaXJlIGFuIGVuZCB0aW1lciBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgZW5kLiAKKyAgICAvLyBU
aGlzIGRlZmVycyB0aGUgY2FsbCB0byBzZW5kQW5pbWF0aW9uRXZlbnRzIHRvIGF2b2lkIHJlLWVu
dHJhbnQgY2FsbHMgdGhhdCBkZXN0cm95CisgICAgLy8gdGhlIFJlbmRlck9iamVjdCwgYW5kIHRo
ZXJlZm9yZSB8dGhpc3wgYmVmb3JlIHdlJ3JlIGRvbmUgd2l0aCBpdC4KKyAgICBpZiAodG90YWxE
dXJhdGlvbiA8IDAgfHwgbmV4dEl0ZXJhdGlvblRpbWUgPCB0b3RhbER1cmF0aW9uKSB7CisgICAg
ICAgIC8vIFdlIGFyZSBub3QgYXQgdGhlIGVuZCB5ZXQsIHNlbmQgYSBsb29wIGV2ZW50CisgICAg
ICAgIEFTU0VSVChuZXh0SXRlcmF0aW9uVGltZSA+IDApOworICAgICAgICBtX2FuaW1TdGF0ZSA9
IFNUQVRFX0xPT1BJTkc7CisgICAgICAgIG1fYW5pbWF0aW9uVGltZXJDYWxsYmFjay5zdGFydFRp
bWVyKGR1cmF0aW9uTGVmdCwgRXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uSXRlcmF0aW9uRXZl
bnQsIG5leHRJdGVyYXRpb25UaW1lKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vIFdl
IGFyZSBhdCB0aGUgZW5kLCBzZW5kIGFuIGVuZCBldmVudAorICAgICAgICBtX2FuaW1TdGF0ZSA9
IFNUQVRFX0VORElORzsKKyAgICAgICAgbV9hbmltYXRpb25UaW1lckNhbGxiYWNrLnN0YXJ0VGlt
ZXIoZHVyYXRpb25MZWZ0LCBFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRpb25FbmRFdmVudCwgbmV4
dEl0ZXJhdGlvblRpbWUpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBpbnQgYmxlbmRGdW5j
KGludCBmcm9tLCBpbnQgdG8sIGRvdWJsZSBwcm9ncmVzcykKK3sgIAorICAgIHJldHVybiBpbnQo
ZnJvbSArICh0byAtIGZyb20pICogcHJvZ3Jlc3MpOworfQorCitzdGF0aWMgaW5saW5lIGRvdWJs
ZSBibGVuZEZ1bmMoZG91YmxlIGZyb20sIGRvdWJsZSB0bywgZG91YmxlIHByb2dyZXNzKQoreyAg
CisgICAgcmV0dXJuIGZyb20gKyAodG8gLSBmcm9tKSAqIHByb2dyZXNzOworfQorCitzdGF0aWMg
aW5saW5lIGZsb2F0IGJsZW5kRnVuYyhmbG9hdCBmcm9tLCBmbG9hdCB0bywgZG91YmxlIHByb2dy
ZXNzKQoreyAgCisgICAgcmV0dXJuIG5hcnJvd1ByZWNpc2lvblRvRmxvYXQoZnJvbSArICh0byAt
IGZyb20pICogcHJvZ3Jlc3MpOworfQorCitzdGF0aWMgaW5saW5lIENvbG9yIGJsZW5kRnVuYyhj
b25zdCBDb2xvciYgZnJvbSwgY29uc3QgQ29sb3ImIHRvLCBkb3VibGUgcHJvZ3Jlc3MpCit7ICAK
KyAgICByZXR1cm4gQ29sb3IoYmxlbmRGdW5jKGZyb20ucmVkKCksIHRvLnJlZCgpLCBwcm9ncmVz
cyksCisgICAgICAgICAgICAgICAgIGJsZW5kRnVuYyhmcm9tLmdyZWVuKCksIHRvLmdyZWVuKCks
IHByb2dyZXNzKSwKKyAgICAgICAgICAgICAgICAgYmxlbmRGdW5jKGZyb20uYmx1ZSgpLCB0by5i
bHVlKCksIHByb2dyZXNzKSwKKyAgICAgICAgICAgICAgICAgYmxlbmRGdW5jKGZyb20uYWxwaGEo
KSwgdG8uYWxwaGEoKSwgcHJvZ3Jlc3MpKTsKK30KKworc3RhdGljIGlubGluZSBMZW5ndGggYmxl
bmRGdW5jKGNvbnN0IExlbmd0aCYgZnJvbSwgY29uc3QgTGVuZ3RoJiB0bywgZG91YmxlIHByb2dy
ZXNzKQoreyAgCisgICAgcmV0dXJuIHRvLmJsZW5kKGZyb20sIHByb2dyZXNzKTsKK30KKworc3Rh
dGljIGlubGluZSBJbnRTaXplIGJsZW5kRnVuYyhjb25zdCBJbnRTaXplJiBmcm9tLCBjb25zdCBJ
bnRTaXplJiB0bywgZG91YmxlIHByb2dyZXNzKQoreyAgCisgICAgcmV0dXJuIEludFNpemUoYmxl
bmRGdW5jKGZyb20ud2lkdGgoKSwgdG8ud2lkdGgoKSwgcHJvZ3Jlc3MpLAorICAgICAgICAgICAg
ICAgICAgIGJsZW5kRnVuYyhmcm9tLmhlaWdodCgpLCB0by5oZWlnaHQoKSwgcHJvZ3Jlc3MpKTsK
K30KKworc3RhdGljIGlubGluZSBTaGFkb3dEYXRhKiBibGVuZEZ1bmMoY29uc3QgU2hhZG93RGF0
YSogZnJvbSwgY29uc3QgU2hhZG93RGF0YSogdG8sIGRvdWJsZSBwcm9ncmVzcykKK3sgIAorICAg
IEFTU0VSVChmcm9tICYmIHRvKTsKKyAgICByZXR1cm4gbmV3IFNoYWRvd0RhdGEoYmxlbmRGdW5j
KGZyb20tPngsIHRvLT54LCBwcm9ncmVzcyksIGJsZW5kRnVuYyhmcm9tLT55LCB0by0+eSwgcHJv
Z3Jlc3MpLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRGdW5jKGZyb20tPmJsdXIs
IHRvLT5ibHVyLCBwcm9ncmVzcyksIGJsZW5kRnVuYyhmcm9tLT5jb2xvciwgdG8tPmNvbG9yLCBw
cm9ncmVzcykpOworfQorCitzdGF0aWMgaW5saW5lIFRyYW5zZm9ybU9wZXJhdGlvbnMgYmxlbmRG
dW5jKGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMmIGZyb20sIGNvbnN0IFRyYW5zZm9ybU9wZXJh
dGlvbnMmIHRvLCBkb3VibGUgcHJvZ3Jlc3MpCit7ICAgIAorICAgIC8vIEJsZW5kIGFueSBvcGVy
YXRpb25zIHdob3NlIHR5cGVzIGFjdHVhbGx5IG1hdGNoIHVwLiAgT3RoZXJ3aXNlIGRvbid0IGJv
dGhlci4KKyAgICB1bnNpZ25lZCBmcm9tU2l6ZSA9IGZyb20uc2l6ZSgpOworICAgIHVuc2lnbmVk
IHRvU2l6ZSA9IHRvLnNpemUoKTsKKyAgICB1bnNpZ25lZCBzaXplID0gbWF4KGZyb21TaXplLCB0
b1NpemUpOworICAgIFRyYW5zZm9ybU9wZXJhdGlvbnMgcmVzdWx0OworICAgIGZvciAodW5zaWdu
ZWQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgUmVmUHRyPFRyYW5zZm9ybU9wZXJh
dGlvbj4gZnJvbU9wID0gaSA8IGZyb21TaXplID8gZnJvbVtpXSA6IDA7CisgICAgICAgIFJlZlB0
cjxUcmFuc2Zvcm1PcGVyYXRpb24+IHRvT3AgPSBpIDwgdG9TaXplID8gdG9baV0gOiAwOworICAg
ICAgICBSZWZQdHI8VHJhbnNmb3JtT3BlcmF0aW9uPiBibGVuZGVkT3AgPSB0b09wID8gdG9PcC0+
YmxlbmQoZnJvbU9wLmdldCgpLCBwcm9ncmVzcykgOiBmcm9tT3AtPmJsZW5kKDAsIHByb2dyZXNz
LCB0cnVlKTsKKyAgICAgICAgaWYgKGJsZW5kZWRPcCkKKyAgICAgICAgICAgIHJlc3VsdC5hcHBl
bmQoYmxlbmRlZE9wKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlu
bGluZSBFVmlzaWJpbGl0eSBibGVuZEZ1bmMoRVZpc2liaWxpdHkgZnJvbSwgRVZpc2liaWxpdHkg
dG8sIGRvdWJsZSBwcm9ncmVzcykKK3sKKyAgICAvLyBBbnkgbm9uLXplcm8gcmVzdWx0IG1lYW5z
IHdlIGNvbnNpZGVyIHRoZSBvYmplY3QgdG8gYmUgdmlzaWJsZS4gIE9ubHkgYXQgMCBkbyB3ZSBj
b25zaWRlciB0aGUgb2JqZWN0IHRvIGJlCisgICAgLy8gaW52aXNpYmxlLiAgIFRoZSBpbnZpc2li
bGUgdmFsdWUgd2UgdXNlIChISURERU4gdnMuIENPTExBUFNFKSBkZXBlbmRzIG9uIHRoZSBzcGVj
aWZpZWQgZnJvbS90byB2YWx1ZXMuCisgICAgZG91YmxlIGZyb21WYWwgPSBmcm9tID09IFZJU0lC
TEUgPyAxLiA6IDAuOworICAgIGRvdWJsZSB0b1ZhbCA9IHRvID09IFZJU0lCTEUgPyAxLiA6IDAu
OworICAgIGlmIChmcm9tVmFsID09IHRvVmFsKQorICAgICAgICByZXR1cm4gdG87CisgICAgZG91
YmxlIHJlc3VsdCA9IGJsZW5kRnVuYyhmcm9tVmFsLCB0b1ZhbCwgcHJvZ3Jlc3MpOworICAgIHJl
dHVybiByZXN1bHQgPiAwLiA/IFZJU0lCTEUgOiAodG8gIT0gVklTSUJMRSA/IHRvIDogZnJvbSk7
Cit9CisKK2NsYXNzIFByb3BlcnR5V3JhcHBlckJhc2UgeworcHVibGljOgorICAgIFByb3BlcnR5
V3JhcHBlckJhc2UoaW50IHByb3ApCisgICAgOiBtX3Byb3AocHJvcCkKKyAgICB7IH0KKyAgICB2
aXJ0dWFsIH5Qcm9wZXJ0eVdyYXBwZXJCYXNlKCkgeyB9CisgICAgdmlydHVhbCBib29sIGVxdWFs
cyhjb25zdCBSZW5kZXJTdHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUqIGIpIGNvbnN0PTA7Cisg
ICAgdmlydHVhbCB2b2lkIGJsZW5kKFJlbmRlclN0eWxlKiBkc3QsIGNvbnN0IFJlbmRlclN0eWxl
KiBhLCBjb25zdCBSZW5kZXJTdHlsZSogYiwgZG91YmxlIHByb2cpIGNvbnN0PTA7CisgICAgCisg
ICAgaW50IHByb3BlcnR5KCkgY29uc3QgeyByZXR1cm4gbV9wcm9wOyB9CisgICAgCitwcml2YXRl
OgorICAgIGludCBtX3Byb3A7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFBy
b3BlcnR5V3JhcHBlckdldHRlciA6IHB1YmxpYyBQcm9wZXJ0eVdyYXBwZXJCYXNlIHsKK3B1Ymxp
YzoKKyAgICBQcm9wZXJ0eVdyYXBwZXJHZXR0ZXIoaW50IHByb3AsIFQgKFJlbmRlclN0eWxlOjoq
Z2V0dGVyKSgpIGNvbnN0KQorICAgIDogUHJvcGVydHlXcmFwcGVyQmFzZShwcm9wKQorICAgICwg
bV9nZXR0ZXIoZ2V0dGVyKQorICAgIHsgfQorICAgIAorICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMo
Y29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJlbmRlclN0eWxlKiBiKSBjb25zdAorICAgIHsK
KyAgICAgICAgcmV0dXJuIChhLT4qbV9nZXR0ZXIpKCkgPT0gKGItPiptX2dldHRlcikoKTsKKyAg
ICB9CisgICAgCitwcm90ZWN0ZWQ6CisgICAgVCAoUmVuZGVyU3R5bGU6OiptX2dldHRlcikoKSBj
b25zdDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUHJvcGVydHlXcmFwcGVy
IDogcHVibGljIFByb3BlcnR5V3JhcHBlckdldHRlcjxUPiB7CitwdWJsaWM6CisgICAgUHJvcGVy
dHlXcmFwcGVyKGludCBwcm9wLCBUIChSZW5kZXJTdHlsZTo6KmdldHRlcikoKSBjb25zdCwgdm9p
ZCAoUmVuZGVyU3R5bGU6OipzZXR0ZXIpKFQpKQorICAgIDogUHJvcGVydHlXcmFwcGVyR2V0dGVy
PFQ+KHByb3AsIGdldHRlcikKKyAgICAsIG1fc2V0dGVyKHNldHRlcikKKyAgICB7IH0KKyAgICAK
KyAgICB2aXJ0dWFsIHZvaWQgYmxlbmQoUmVuZGVyU3R5bGUqIGRzdCwgY29uc3QgUmVuZGVyU3R5
bGUqIGEsIGNvbnN0IFJlbmRlclN0eWxlKiBiLCBkb3VibGUgcHJvZykgY29uc3QKKyAgICB7Cisg
ICAgICAgIChkc3QtPiptX3NldHRlcikoYmxlbmRGdW5jKChhLT4qUHJvcGVydHlXcmFwcGVyR2V0
dGVyPFQ+OjptX2dldHRlcikoKSwgKGItPipQcm9wZXJ0eVdyYXBwZXJHZXR0ZXI8VD46Om1fZ2V0
dGVyKSgpLCBwcm9nKSk7CisgICAgfQorICAgIAorcHJvdGVjdGVkOgorICAgIHZvaWQgKFJlbmRl
clN0eWxlOjoqbV9zZXR0ZXIpKFQpOworfTsKKworY2xhc3MgUHJvcGVydHlXcmFwcGVyU2hhZG93
IDogcHVibGljIFByb3BlcnR5V3JhcHBlckdldHRlcjxTaGFkb3dEYXRhKj4geworcHVibGljOgor
ICAgIFByb3BlcnR5V3JhcHBlclNoYWRvdyhpbnQgcHJvcCwgU2hhZG93RGF0YSogKFJlbmRlclN0
eWxlOjoqZ2V0dGVyKSgpIGNvbnN0LCB2b2lkIChSZW5kZXJTdHlsZTo6KnNldHRlcikoU2hhZG93
RGF0YSosIGJvb2wpKQorICAgIDogUHJvcGVydHlXcmFwcGVyR2V0dGVyPFNoYWRvd0RhdGEqPihw
cm9wLCBnZXR0ZXIpCisgICAgLCBtX3NldHRlcihzZXR0ZXIpCisgICAgeyB9CisgICAgCisgICAg
dmlydHVhbCBib29sIGVxdWFscyhjb25zdCBSZW5kZXJTdHlsZSogYSwgY29uc3QgUmVuZGVyU3R5
bGUqIGIpIGNvbnN0CisgICAgeworICAgICAgICBTaGFkb3dEYXRhKiBzaGFkb3dhID0gKGEtPipt
X2dldHRlcikoKTsKKyAgICAgICAgU2hhZG93RGF0YSogc2hhZG93YiA9IChiLT4qbV9nZXR0ZXIp
KCk7CisgICAgICAgIAorICAgICAgICBpZiAoIXNoYWRvd2EgJiYgc2hhZG93YiB8fCBzaGFkb3dh
ICYmICFzaGFkb3diKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoc2hh
ZG93YSAmJiBzaGFkb3diICYmICgqc2hhZG93YSAhPSAqc2hhZG93YikpCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICB2aXJ0
dWFsIHZvaWQgYmxlbmQoUmVuZGVyU3R5bGUqIGRzdCwgY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNv
bnN0IFJlbmRlclN0eWxlKiBiLCBkb3VibGUgcHJvZykgY29uc3QKKyAgICB7CisgICAgICAgIFNo
YWRvd0RhdGEqIHNoYWRvd2EgPSAoYS0+Km1fZ2V0dGVyKSgpOworICAgICAgICBTaGFkb3dEYXRh
KiBzaGFkb3diID0gKGItPiptX2dldHRlcikoKTsKKyAgICAgICAgU2hhZG93RGF0YSBkZWZhdWx0
U2hhZG93RGF0YSgwLCAwLCAwLCBDb2xvcjo6dHJhbnNwYXJlbnQpOworICAgICAgICAKKyAgICAg
ICAgaWYgKCFzaGFkb3dhKQorICAgICAgICAgICAgc2hhZG93YSA9ICZkZWZhdWx0U2hhZG93RGF0
YTsKKyAgICAgICAgaWYgKCFzaGFkb3diKQorICAgICAgICAgICAgc2hhZG93YiA9ICZkZWZhdWx0
U2hhZG93RGF0YTsKKyAgICAgICAgCisgICAgICAgIChkc3QtPiptX3NldHRlcikoYmxlbmRGdW5j
KHNoYWRvd2EsIHNoYWRvd2IsIHByb2cpLCBmYWxzZSk7CisgICAgfQorICAgIAorcHJpdmF0ZToK
KyAgICB2b2lkIChSZW5kZXJTdHlsZTo6Km1fc2V0dGVyKShTaGFkb3dEYXRhKiwgYm9vbCk7Cit9
OworCitjbGFzcyBQcm9wZXJ0eVdyYXBwZXJNYXliZUludmFsaWRDb2xvciA6IHB1YmxpYyBQcm9w
ZXJ0eVdyYXBwZXJCYXNlIHsKK3B1YmxpYzoKKyAgICBQcm9wZXJ0eVdyYXBwZXJNYXliZUludmFs
aWRDb2xvcihpbnQgcHJvcCwgY29uc3QgQ29sb3ImIChSZW5kZXJTdHlsZTo6KmdldHRlcikoKSBj
b25zdCwgdm9pZCAoUmVuZGVyU3R5bGU6OipzZXR0ZXIpKGNvbnN0IENvbG9yJikpCisgICAgOiBQ
cm9wZXJ0eVdyYXBwZXJCYXNlKHByb3ApCisgICAgLCBtX2dldHRlcihnZXR0ZXIpCisgICAgLCBt
X3NldHRlcihzZXR0ZXIpCisgICAgeyB9CisgICAgCisgICAgdmlydHVhbCBib29sIGVxdWFscyhj
b25zdCBSZW5kZXJTdHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUqIGIpIGNvbnN0CisgICAgewor
ICAgICAgICBDb2xvciBmcm9tQ29sb3IgPSAoYS0+Km1fZ2V0dGVyKSgpOworICAgICAgICBDb2xv
ciB0b0NvbG9yID0gKGItPiptX2dldHRlcikoKTsKKyAgICAgICAgaWYgKCFmcm9tQ29sb3IuaXNW
YWxpZCgpKQorICAgICAgICAgICAgZnJvbUNvbG9yID0gYS0+Y29sb3IoKTsKKyAgICAgICAgaWYg
KCF0b0NvbG9yLmlzVmFsaWQoKSkKKyAgICAgICAgICAgIHRvQ29sb3IgPSBiLT5jb2xvcigpOwor
ICAgICAgICAKKyAgICAgICAgcmV0dXJuIGZyb21Db2xvciA9PSB0b0NvbG9yOworICAgIH0KKyAg
ICAKKyAgICB2aXJ0dWFsIHZvaWQgYmxlbmQoUmVuZGVyU3R5bGUqIGRzdCwgY29uc3QgUmVuZGVy
U3R5bGUqIGEsIGNvbnN0IFJlbmRlclN0eWxlKiBiLCBkb3VibGUgcHJvZykgY29uc3QKKyAgICB7
CisgICAgICAgIENvbG9yIGZyb21Db2xvciA9IChhLT4qbV9nZXR0ZXIpKCk7CisgICAgICAgIENv
bG9yIHRvQ29sb3IgPSAoYi0+Km1fZ2V0dGVyKSgpOworICAgICAgICBpZiAoIWZyb21Db2xvci5p
c1ZhbGlkKCkpCisgICAgICAgICAgICBmcm9tQ29sb3IgPSBhLT5jb2xvcigpOworICAgICAgICBp
ZiAoIXRvQ29sb3IuaXNWYWxpZCgpKQorICAgICAgICAgICAgdG9Db2xvciA9IGItPmNvbG9yKCk7
CisgICAgICAgIChkc3QtPiptX3NldHRlcikoYmxlbmRGdW5jKGZyb21Db2xvciwgdG9Db2xvciwg
cHJvZykpOworICAgIH0KKyAgICAKK3ByaXZhdGU6CisgICAgY29uc3QgQ29sb3ImIChSZW5kZXJT
dHlsZTo6Km1fZ2V0dGVyKSgpIGNvbnN0OworICAgIHZvaWQgKFJlbmRlclN0eWxlOjoqbV9zZXR0
ZXIpKGNvbnN0IENvbG9yJik7Cit9OworCitjbGFzcyBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0
ZSB7CitwdWJsaWM6CisgICAgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGUoRnJhbWUqKTsKKyAg
ICB+QW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGUoKTsKKyAgICAKKyAgICBDb21wb3NpdGVBbmlt
YXRpb24qIGFjY2Vzc0NvbXBvc2l0ZUFuaW1hdGlvbihSZW5kZXJPYmplY3QqKTsKKyAgICBib29s
IGNsZWFyKFJlbmRlck9iamVjdCopOworICAgIAorICAgIHZvaWQgYW5pbWF0aW9uVGltZXJGaXJl
ZChUaW1lcjxBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZT4qKTsKKyAgICB2b2lkIHVwZGF0ZUFu
aW1hdGlvblRpbWVyKCk7CisgICAgCisgICAgdm9pZCB1cGRhdGVSZW5kZXJpbmdEaXNwYXRjaGVy
RmlyZWQoVGltZXI8QW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU+Kik7CisgICAgdm9pZCBzdGFy
dFVwZGF0ZVJlbmRlcmluZ0Rpc3BhdGNoZXIoKTsKKyAgICAKKyAgICBib29sIGhhc0FuaW1hdGlv
bnMoKSBjb25zdCB7IHJldHVybiAhbV9jb21wb3NpdGVBbmltYXRpb25zLmlzRW1wdHkoKTsgfQor
ICAgIAorICAgIHZvaWQgc3VzcGVuZEFuaW1hdGlvbnMoRG9jdW1lbnQqIGRvY3VtZW50KTsKKyAg
ICB2b2lkIHJlc3VtZUFuaW1hdGlvbnMoRG9jdW1lbnQqIGRvY3VtZW50KTsKKyAgICAKKyAgICB2
b2lkIHN0eWxlQXZhaWxhYmxlKCk7CisgICAgCisgICAgYm9vbCBpc0FuaW1hdGluZ1Byb3BlcnR5
T25SZW5kZXJlcihSZW5kZXJPYmplY3QqIG9iaiwgaW50IHByb3BlcnR5LCBib29sIGlzUnVubmlu
Z05vdykgY29uc3Q7CisgICAgCisgICAgc3RhdGljIGJvb2wgcHJvcGVydGllc0VxdWFsKGludCBw
cm9wLCBjb25zdCBSZW5kZXJTdHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUqIGIpOworICAgIHN0
YXRpYyBpbnQgZ2V0UHJvcGVydHlBdEluZGV4KGludCBpKTsKKyAgICBzdGF0aWMgaW50IGdldE51
bVByb3BlcnRpZXMoKSB7IHJldHVybiBnUHJvcGVydHlXcmFwcGVycy0+c2l6ZSgpOyB9CisgICAg
CisgICAgLy8gUmV0dXJuIHRydWUgaWYgd2UgbmVlZCB0byBzdGFydCBzb2Z0d2FyZSBhbmltYXRp
b24gdGltZXJzCisgICAgc3RhdGljIGJvb2wgYmxlbmRQcm9wZXJ0aWVzKGludCBwcm9wLCBSZW5k
ZXJTdHlsZSogZHN0LCBjb25zdCBSZW5kZXJTdHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUqIGIs
IGRvdWJsZSBwcm9nKTsKKyAgICAKKyAgICB2b2lkIHNldFdhaXRpbmdGb3JTdHlsZUF2YWlsYWJs
ZShib29sIHdhaXRpbmcpIHsgaWYgKHdhaXRpbmcpIG1fbnVtU3R5bGVBdmFpbGFibGVXYWl0ZXJz
Kys7IGVsc2UgbV9udW1TdHlsZUF2YWlsYWJsZVdhaXRlcnMtLTsgfQorICAgIAorcHJpdmF0ZToK
KyAgICBzdGF0aWMgdm9pZCBlbnN1cmVQcm9wZXJ0eU1hcCgpOworICAgIAorICAgIHR5cGVkZWYg
SGFzaE1hcDxSZW5kZXJPYmplY3QqLCBDb21wb3NpdGVBbmltYXRpb24qPiBSZW5kZXJPYmplY3RB
bmltYXRpb25NYXA7CisgICAgCisgICAgUmVuZGVyT2JqZWN0QW5pbWF0aW9uTWFwIG1fY29tcG9z
aXRlQW5pbWF0aW9uczsKKyAgICBUaW1lcjxBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZT4gbV9h
bmltYXRpb25UaW1lcjsKKyAgICBUaW1lcjxBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZT4gbV91
cGRhdGVSZW5kZXJpbmdEaXNwYXRjaGVyOworICAgIEZyYW1lKiBtX2ZyYW1lOworICAgIHVpbnQz
Ml90IG1fbnVtU3R5bGVBdmFpbGFibGVXYWl0ZXJzOworICAgIAorICAgIHN0YXRpYyBWZWN0b3I8
UHJvcGVydHlXcmFwcGVyQmFzZSo+KiBnUHJvcGVydHlXcmFwcGVyczsKKyAgICBzdGF0aWMgaW50
IGdQcm9wZXJ0eVdyYXBwZXJNYXBbbnVtQ1NTUHJvcGVydGllc107Cit9OworCitWZWN0b3I8UHJv
cGVydHlXcmFwcGVyQmFzZSo+KiBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6Z1Byb3BlcnR5
V3JhcHBlcnMgPSAwOworaW50IEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpnUHJvcGVydHlX
cmFwcGVyTWFwW107CisKK0FuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpBbmltYXRpb25Db250
cm9sbGVyUHJpdmF0ZShGcmFtZSogZnJhbWUpCis6IG1fYW5pbWF0aW9uVGltZXIodGhpcywgJkFu
aW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjphbmltYXRpb25UaW1lckZpcmVkKQorLCBtX3VwZGF0
ZVJlbmRlcmluZ0Rpc3BhdGNoZXIodGhpcywgJkFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjp1
cGRhdGVSZW5kZXJpbmdEaXNwYXRjaGVyRmlyZWQpCissIG1fZnJhbWUoZnJhbWUpCissIG1fbnVt
U3R5bGVBdmFpbGFibGVXYWl0ZXJzKDApCit7CisgICAgZW5zdXJlUHJvcGVydHlNYXAoKTsKK30K
KworQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6On5BbmltYXRpb25Db250cm9sbGVyUHJpdmF0
ZSgpCit7CisgICAgZGVsZXRlQWxsVmFsdWVzKG1fY29tcG9zaXRlQW5pbWF0aW9ucyk7Cit9CisK
Ky8vIHN0YXRpYwordm9pZCBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6ZW5zdXJlUHJvcGVy
dHlNYXAoKQoreworICAgIC8vIEZJWE1FOiBUaGlzIGRhdGEgaXMgbmV2ZXIgZGVzdHJveWVkLiBN
YXliZSB3ZSBzaG91bGQgcmVmIGNvdW50IGl0IGFuZCB0b3NzIGl0IHdoZW4gdGhlIGxhc3QgQW5p
bWF0aW9uQ29udHJvbGxlciBpcyBkZXN0cm95ZWQ/CisgICAgaWYgKGdQcm9wZXJ0eVdyYXBwZXJz
ID09IDApIHsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMgPSBuZXcgVmVjdG9yPFByb3BlcnR5
V3JhcHBlckJhc2UqPigpOworICAgICAgICAKKyAgICAgICAgLy8gYnVpbGQgdGhlIGxpc3Qgb2Yg
cHJvcGVydHkgd3JhcHBlcnMgdG8gZG8gdGhlIGNvbXBhcmlzb25zIGFuZCBibGVuZHMKKyAgICAg
ICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4o
Q1NTUHJvcGVydHlMZWZ0LCAmUmVuZGVyU3R5bGU6OmxlZnQsICZSZW5kZXJTdHlsZTo6c2V0TGVm
dCkpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBw
ZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eVJpZ2h0LCAmUmVuZGVyU3R5bGU6OnJpZ2h0LCAmUmVuZGVy
U3R5bGU6OnNldFJpZ2h0KSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3
IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5VG9wLCAmUmVuZGVyU3R5bGU6OnRv
cCwgJlJlbmRlclN0eWxlOjpzZXRUb3ApKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFw
cGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlCb3R0b20sICZSZW5k
ZXJTdHlsZTo6Ym90dG9tLCAmUmVuZGVyU3R5bGU6OnNldEJvdHRvbSkpOworICAgICAgICBnUHJv
cGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9w
ZXJ0eVdpZHRoLCAmUmVuZGVyU3R5bGU6OndpZHRoLCAmUmVuZGVyU3R5bGU6OnNldFdpZHRoKSk7
CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxM
ZW5ndGg+KENTU1Byb3BlcnR5SGVpZ2h0LCAmUmVuZGVyU3R5bGU6OmhlaWdodCwgJlJlbmRlclN0
eWxlOjpzZXRIZWlnaHQpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcg
UHJvcGVydHlXcmFwcGVyPHVuc2lnbmVkIHNob3J0PihDU1NQcm9wZXJ0eUJvcmRlckxlZnRXaWR0
aCwgJlJlbmRlclN0eWxlOjpib3JkZXJMZWZ0V2lkdGgsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVy
TGVmdFdpZHRoKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3Bl
cnR5V3JhcHBlcjx1bnNpZ25lZCBzaG9ydD4oQ1NTUHJvcGVydHlCb3JkZXJSaWdodFdpZHRoLCAm
UmVuZGVyU3R5bGU6OmJvcmRlclJpZ2h0V2lkdGgsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyUmln
aHRXaWR0aCkpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0
eVdyYXBwZXI8dW5zaWduZWQgc2hvcnQ+KENTU1Byb3BlcnR5Qm9yZGVyVG9wV2lkdGgsICZSZW5k
ZXJTdHlsZTo6Ym9yZGVyVG9wV2lkdGgsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyVG9wV2lkdGgp
KTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVy
PHVuc2lnbmVkIHNob3J0PihDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbVdpZHRoLCAmUmVuZGVyU3R5
bGU6OmJvcmRlckJvdHRvbVdpZHRoLCAmUmVuZGVyU3R5bGU6OnNldEJvcmRlckJvdHRvbVdpZHRo
KSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBl
cjxMZW5ndGg+KENTU1Byb3BlcnR5TWFyZ2luTGVmdCwgJlJlbmRlclN0eWxlOjptYXJnaW5MZWZ0
LCAmUmVuZGVyU3R5bGU6OnNldE1hcmdpbkxlZnQpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBl
cnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlNYXJnaW5S
aWdodCwgJlJlbmRlclN0eWxlOjptYXJnaW5SaWdodCwgJlJlbmRlclN0eWxlOjpzZXRNYXJnaW5S
aWdodCkpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdy
YXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eU1hcmdpblRvcCwgJlJlbmRlclN0eWxlOjptYXJnaW5U
b3AsICZSZW5kZXJTdHlsZTo6c2V0TWFyZ2luVG9wKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBw
ZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5TWFyZ2lu
Qm90dG9tLCAmUmVuZGVyU3R5bGU6Om1hcmdpbkJvdHRvbSwgJlJlbmRlclN0eWxlOjpzZXRNYXJn
aW5Cb3R0b20pKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVy
dHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlQYWRkaW5nTGVmdCwgJlJlbmRlclN0eWxlOjpw
YWRkaW5nTGVmdCwgJlJlbmRlclN0eWxlOjpzZXRQYWRkaW5nTGVmdCkpOworICAgICAgICBnUHJv
cGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9w
ZXJ0eVBhZGRpbmdSaWdodCwgJlJlbmRlclN0eWxlOjpwYWRkaW5nUmlnaHQsICZSZW5kZXJTdHls
ZTo6c2V0UGFkZGluZ1JpZ2h0KSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQo
bmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5UGFkZGluZ1RvcCwgJlJlbmRl
clN0eWxlOjpwYWRkaW5nVG9wLCAmUmVuZGVyU3R5bGU6OnNldFBhZGRpbmdUb3ApKTsKKyAgICAg
ICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4o
Q1NTUHJvcGVydHlQYWRkaW5nQm90dG9tLCAmUmVuZGVyU3R5bGU6OnBhZGRpbmdCb3R0b20sICZS
ZW5kZXJTdHlsZTo6c2V0UGFkZGluZ0JvdHRvbSkpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVy
cy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8ZmxvYXQ+KENTU1Byb3BlcnR5T3BhY2l0eSwg
JlJlbmRlclN0eWxlOjpvcGFjaXR5LCAmUmVuZGVyU3R5bGU6OnNldE9wYWNpdHkpKTsKKyAgICAg
ICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPGNvbnN0IENv
bG9yJj4oQ1NTUHJvcGVydHlDb2xvciwgJlJlbmRlclN0eWxlOjpjb2xvciwgJlJlbmRlclN0eWxl
OjpzZXRDb2xvcikpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9w
ZXJ0eVdyYXBwZXI8Y29uc3QgQ29sb3ImPihDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvciwgJlJl
bmRlclN0eWxlOjpiYWNrZ3JvdW5kQ29sb3IsICZSZW5kZXJTdHlsZTo6c2V0QmFja2dyb3VuZENv
bG9yKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3Jh
cHBlcjxpbnQ+KENTU1Byb3BlcnR5Rm9udFNpemUsICZSZW5kZXJTdHlsZTo6Zm9udFNpemUsICZS
ZW5kZXJTdHlsZTo6c2V0QmxlbmRlZEZvbnRTaXplKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBw
ZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjx1bnNpZ25lZCBzaG9ydD4oQ1NTUHJvcGVy
dHlXZWJraXRDb2x1bW5SdWxlV2lkdGgsICZSZW5kZXJTdHlsZTo6Y29sdW1uUnVsZVdpZHRoLCAm
UmVuZGVyU3R5bGU6OnNldENvbHVtblJ1bGVXaWR0aCkpOworICAgICAgICBnUHJvcGVydHlXcmFw
cGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8ZmxvYXQ+KENTU1Byb3BlcnR5V2Via2l0
Q29sdW1uR2FwLCAmUmVuZGVyU3R5bGU6OmNvbHVtbkdhcCwgJlJlbmRlclN0eWxlOjpzZXRDb2x1
bW5HYXApKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlX
cmFwcGVyPHVuc2lnbmVkIHNob3J0PihDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbkNvdW50LCAmUmVu
ZGVyU3R5bGU6OmNvbHVtbkNvdW50LCAmUmVuZGVyU3R5bGU6OnNldENvbHVtbkNvdW50KSk7Cisg
ICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxmbG9h
dD4oQ1NTUHJvcGVydHlXZWJraXRDb2x1bW5XaWR0aCwgJlJlbmRlclN0eWxlOjpjb2x1bW5XaWR0
aCwgJlJlbmRlclN0eWxlOjpzZXRDb2x1bW5XaWR0aCkpOworICAgICAgICBnUHJvcGVydHlXcmFw
cGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8c2hvcnQ+KENTU1Byb3BlcnR5V2Via2l0
Qm9yZGVySG9yaXpvbnRhbFNwYWNpbmcsICZSZW5kZXJTdHlsZTo6aG9yaXpvbnRhbEJvcmRlclNw
YWNpbmcsICZSZW5kZXJTdHlsZTo6c2V0SG9yaXpvbnRhbEJvcmRlclNwYWNpbmcpKTsKKyAgICAg
ICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPHNob3J0PihD
U1NQcm9wZXJ0eVdlYmtpdEJvcmRlclZlcnRpY2FsU3BhY2luZywgJlJlbmRlclN0eWxlOjp2ZXJ0
aWNhbEJvcmRlclNwYWNpbmcsICZSZW5kZXJTdHlsZTo6c2V0VmVydGljYWxCb3JkZXJTcGFjaW5n
KSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBl
cjxpbnQ+KENTU1Byb3BlcnR5WkluZGV4LCAmUmVuZGVyU3R5bGU6OnpJbmRleCwgJlJlbmRlclN0
eWxlOjpzZXRaSW5kZXgpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcg
UHJvcGVydHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlMaW5lSGVpZ2h0LCAmUmVuZGVyU3R5
bGU6OmxpbmVIZWlnaHQsICZSZW5kZXJTdHlsZTo6c2V0TGluZUhlaWdodCkpOworICAgICAgICBn
UHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8aW50PihDU1NQcm9w
ZXJ0eU91dGxpbmVPZmZzZXQsICZSZW5kZXJTdHlsZTo6b3V0bGluZU9mZnNldCwgJlJlbmRlclN0
eWxlOjpzZXRPdXRsaW5lT2Zmc2V0KSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBl
bmQobmV3IFByb3BlcnR5V3JhcHBlcjx1bnNpZ25lZCBzaG9ydD4oQ1NTUHJvcGVydHlPdXRsaW5l
V2lkdGgsICZSZW5kZXJTdHlsZTo6b3V0bGluZVdpZHRoLCAmUmVuZGVyU3R5bGU6OnNldE91dGxp
bmVXaWR0aCkpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0
eVdyYXBwZXI8aW50PihDU1NQcm9wZXJ0eUxldHRlclNwYWNpbmcsICZSZW5kZXJTdHlsZTo6bGV0
dGVyU3BhY2luZywgJlJlbmRlclN0eWxlOjpzZXRMZXR0ZXJTcGFjaW5nKSk7CisgICAgICAgIGdQ
cm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxpbnQ+KENTU1Byb3Bl
cnR5V29yZFNwYWNpbmcsICZSZW5kZXJTdHlsZTo6d29yZFNwYWNpbmcsICZSZW5kZXJTdHlsZTo6
c2V0V29yZFNwYWNpbmcpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcg
UHJvcGVydHlXcmFwcGVyPGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMmPihDU1NQcm9wZXJ0eVdl
YmtpdFRyYW5zZm9ybSwgJlJlbmRlclN0eWxlOjp0cmFuc2Zvcm0sICZSZW5kZXJTdHlsZTo6c2V0
VHJhbnNmb3JtKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3Bl
cnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luWCwgJlJl
bmRlclN0eWxlOjp0cmFuc2Zvcm1PcmlnaW5YLCAmUmVuZGVyU3R5bGU6OnNldFRyYW5zZm9ybU9y
aWdpblgpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlX
cmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlXZWJraXRUcmFuc2Zvcm1PcmlnaW5ZLCAmUmVuZGVy
U3R5bGU6OnRyYW5zZm9ybU9yaWdpblksICZSZW5kZXJTdHlsZTo6c2V0VHJhbnNmb3JtT3JpZ2lu
WSkpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBw
ZXI8Y29uc3QgSW50U2l6ZSY+KENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyVG9wTGVmdFJhZGl1cywg
JlJlbmRlclN0eWxlOjpib3JkZXJUb3BMZWZ0UmFkaXVzLCAmUmVuZGVyU3R5bGU6OnNldEJvcmRl
clRvcExlZnRSYWRpdXMpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcg
UHJvcGVydHlXcmFwcGVyPGNvbnN0IEludFNpemUmPihDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclRv
cFJpZ2h0UmFkaXVzLCAmUmVuZGVyU3R5bGU6OmJvcmRlclRvcFJpZ2h0UmFkaXVzLCAmUmVuZGVy
U3R5bGU6OnNldEJvcmRlclRvcFJpZ2h0UmFkaXVzKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBw
ZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxjb25zdCBJbnRTaXplJj4oQ1NTUHJvcGVy
dHlXZWJraXRCb3JkZXJCb3R0b21MZWZ0UmFkaXVzLCAmUmVuZGVyU3R5bGU6OmJvcmRlckJvdHRv
bUxlZnRSYWRpdXMsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyQm90dG9tTGVmdFJhZGl1cykpOwor
ICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8Y29u
c3QgSW50U2l6ZSY+KENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQm90dG9tUmlnaHRSYWRpdXMsICZS
ZW5kZXJTdHlsZTo6Ym9yZGVyQm90dG9tUmlnaHRSYWRpdXMsICZSZW5kZXJTdHlsZTo6c2V0Qm9y
ZGVyQm90dG9tUmlnaHRSYWRpdXMpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVu
ZChuZXcgUHJvcGVydHlXcmFwcGVyPEVWaXNpYmlsaXR5PihDU1NQcm9wZXJ0eVZpc2liaWxpdHks
ICZSZW5kZXJTdHlsZTo6dmlzaWJpbGl0eSwgJlJlbmRlclN0eWxlOjpzZXRWaXNpYmlsaXR5KSk7
CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxm
bG9hdD4oQ1NTUHJvcGVydHlab29tLCAmUmVuZGVyU3R5bGU6Onpvb20sICZSZW5kZXJTdHlsZTo6
c2V0Wm9vbSkpOworICAgICAgICAKKyAgICAgICAgLy8gRklYTUU6IHRoZXNlIG1pZ2h0IGJlIGlu
dmFsaWQgY29sb3JzLCBuZWVkIHRvIGNoZWNrIGZvciB0aGF0CisgICAgICAgIGdQcm9wZXJ0eVdy
YXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENvbG9yKENTU1By
b3BlcnR5V2Via2l0Q29sdW1uUnVsZUNvbG9yLCAmUmVuZGVyU3R5bGU6OmNvbHVtblJ1bGVDb2xv
ciwgJlJlbmRlclN0eWxlOjpzZXRDb2x1bW5SdWxlQ29sb3IpKTsKKyAgICAgICAgZ1Byb3BlcnR5
V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyTWF5YmVJbnZhbGlkQ29sb3IoQ1NT
UHJvcGVydHlXZWJraXRUZXh0U3Ryb2tlQ29sb3IsICZSZW5kZXJTdHlsZTo6dGV4dFN0cm9rZUNv
bG9yLCAmUmVuZGVyU3R5bGU6OnNldFRleHRTdHJva2VDb2xvcikpOworICAgICAgICBnUHJvcGVy
dHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXJNYXliZUludmFsaWRDb2xvcihD
U1NQcm9wZXJ0eVdlYmtpdFRleHRGaWxsQ29sb3IsICZSZW5kZXJTdHlsZTo6dGV4dEZpbGxDb2xv
ciwgJlJlbmRlclN0eWxlOjpzZXRUZXh0RmlsbENvbG9yKSk7CisgICAgICAgIGdQcm9wZXJ0eVdy
YXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENvbG9yKENTU1By
b3BlcnR5Qm9yZGVyTGVmdENvbG9yLCAmUmVuZGVyU3R5bGU6OmJvcmRlckxlZnRDb2xvciwgJlJl
bmRlclN0eWxlOjpzZXRCb3JkZXJMZWZ0Q29sb3IpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBl
cnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyTWF5YmVJbnZhbGlkQ29sb3IoQ1NTUHJvcGVy
dHlCb3JkZXJSaWdodENvbG9yLCAmUmVuZGVyU3R5bGU6OmJvcmRlclJpZ2h0Q29sb3IsICZSZW5k
ZXJTdHlsZTo6c2V0Qm9yZGVyUmlnaHRDb2xvcikpOworICAgICAgICBnUHJvcGVydHlXcmFwcGVy
cy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXJNYXliZUludmFsaWRDb2xvcihDU1NQcm9wZXJ0
eUJvcmRlclRvcENvbG9yLCAmUmVuZGVyU3R5bGU6OmJvcmRlclRvcENvbG9yLCAmUmVuZGVyU3R5
bGU6OnNldEJvcmRlclRvcENvbG9yKSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBl
bmQobmV3IFByb3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENvbG9yKENTU1Byb3BlcnR5Qm9yZGVy
Qm90dG9tQ29sb3IsICZSZW5kZXJTdHlsZTo6Ym9yZGVyQm90dG9tQ29sb3IsICZSZW5kZXJTdHls
ZTo6c2V0Qm9yZGVyQm90dG9tQ29sb3IpKTsKKyAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFw
cGVuZChuZXcgUHJvcGVydHlXcmFwcGVyTWF5YmVJbnZhbGlkQ29sb3IoQ1NTUHJvcGVydHlPdXRs
aW5lQ29sb3IsICZSZW5kZXJTdHlsZTo6b3V0bGluZUNvbG9yLCAmUmVuZGVyU3R5bGU6OnNldE91
dGxpbmVDb2xvcikpOworICAgICAgICAKKyAgICAgICAgLy8gVGhlc2UgYXJlIGZvciBzaGFkb3dz
CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlclNo
YWRvdyhDU1NQcm9wZXJ0eVdlYmtpdEJveFNoYWRvdywgJlJlbmRlclN0eWxlOjpib3hTaGFkb3cs
ICZSZW5kZXJTdHlsZTo6c2V0Qm94U2hhZG93KSk7CisgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJz
LT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlclNoYWRvdyhDU1NQcm9wZXJ0eVRleHRTaGFkb3cs
ICZSZW5kZXJTdHlsZTo6dGV4dFNoYWRvdywgJlJlbmRlclN0eWxlOjpzZXRUZXh0U2hhZG93KSk7
CisgICAgICAgIAorICAgICAgICAvLyBNYWtlIHN1cmUgdW51c2VkIHNsb3RzIGhhdmUgYSB2YWx1
ZQorICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpIG51
bUNTU1Byb3BlcnRpZXM7ICsraSkKKyAgICAgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJNYXBbaV0g
PSBDU1NQcm9wZXJ0eUludmFsaWQ7CisgICAgICAgIAorICAgICAgICBzaXplX3QgbiA9IGdQcm9w
ZXJ0eVdyYXBwZXJzLT5zaXplKCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBp
IDwgbjsgKytpKSB7CisgICAgICAgICAgICBBU1NFUlQoKCpnUHJvcGVydHlXcmFwcGVycylbaV0t
PnByb3BlcnR5KCkgLSBmaXJzdENTU1Byb3BlcnR5IDwgbnVtQ1NTUHJvcGVydGllcyk7CisgICAg
ICAgICAgICBnUHJvcGVydHlXcmFwcGVyTWFwWygqZ1Byb3BlcnR5V3JhcHBlcnMpW2ldLT5wcm9w
ZXJ0eSgpIC0gZmlyc3RDU1NQcm9wZXJ0eV0gPSBpOworICAgICAgICB9CisgICAgfQorfQorCisv
LyBzdGF0aWMKK2Jvb2wgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OnByb3BlcnRpZXNFcXVh
bChpbnQgcHJvcCwgY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJlbmRlclN0eWxlKiBiKQor
eworICAgIGlmIChwcm9wID09IGNBbmltYXRlQWxsKSB7CisgICAgICAgIHNpemVfdCBuID0gZ1By
b3BlcnR5V3JhcHBlcnMtPnNpemUoKTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7
IGkgPCBuOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghKCpnUHJvcGVydHlXcmFwcGVycylbaV0t
PmVxdWFscyhhLCBiKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0K
KyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGludCBwcm9wSW5kZXggPSBwcm9wIC0gZmlyc3RD
U1NQcm9wZXJ0eTsKKyAgICAgICAgCisgICAgICAgIGlmIChwcm9wSW5kZXggPj0gMCAmJiBwcm9w
SW5kZXggPCBudW1DU1NQcm9wZXJ0aWVzKSB7CisgICAgICAgICAgICBpbnQgaSA9IGdQcm9wZXJ0
eVdyYXBwZXJNYXBbcHJvcEluZGV4XTsKKyAgICAgICAgICAgIHJldHVybiAoaSA+PSAwKSA/ICgq
Z1Byb3BlcnR5V3JhcHBlcnMpW2ldLT5lcXVhbHMoYSwgYikgOiB0cnVlOworICAgICAgICB9Cisg
ICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBzdGF0aWMKK2ludCBBbmltYXRpb25Db250
cm9sbGVyUHJpdmF0ZTo6Z2V0UHJvcGVydHlBdEluZGV4KGludCBpKQoreworICAgIGlmIChpIDwg
MCB8fCBpID49IChpbnQpIGdQcm9wZXJ0eVdyYXBwZXJzLT5zaXplKCkpCisgICAgICAgIHJldHVy
biBDU1NQcm9wZXJ0eUludmFsaWQ7CisgICAgICAgIAorICAgIHJldHVybiAoKmdQcm9wZXJ0eVdy
YXBwZXJzKVtpXS0+cHJvcGVydHkoKTsKK30KKyAgICAKKy8vIHN0YXRpYyAtIHJldHVybiB0cnVl
IGlmIHdlIG5lZWQgdG8gc3RhcnQgc29mdHdhcmUgYW5pbWF0aW9uIHRpbWVycworYm9vbCBBbmlt
YXRpb25Db250cm9sbGVyUHJpdmF0ZTo6YmxlbmRQcm9wZXJ0aWVzKGludCBwcm9wLCBSZW5kZXJT
dHlsZSogZHN0LCBjb25zdCBSZW5kZXJTdHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUqIGIsIGRv
dWJsZSBwcm9nKQoreworICAgIGlmIChwcm9wID09IGNBbmltYXRlQWxsKSB7CisgICAgICAgIEFT
U0VSVCgwKTsKKyAgICAgICAgYm9vbCBuZWVkc1RpbWVyID0gZmFsc2U7CisgICAgCisgICAgICAg
IHNpemVfdCBuID0gZ1Byb3BlcnR5V3JhcHBlcnMtPnNpemUoKTsKKyAgICAgICAgZm9yICh1bnNp
Z25lZCBpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgICAgIFByb3BlcnR5V3JhcHBl
ckJhc2UqIHdyYXBwZXIgPSAoKmdQcm9wZXJ0eVdyYXBwZXJzKVtpXTsKKyAgICAgICAgICAgIGlm
ICghd3JhcHBlci0+ZXF1YWxzKGEsIGIpKSB7CisgICAgICAgICAgICAgICAgd3JhcHBlci0+Ymxl
bmQoZHN0LCBhLCBiLCBwcm9nKTsKKyAgICAgICAgICAgICAgICBuZWVkc1RpbWVyID0gdHJ1ZTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmVlZHNUaW1lcjsKKyAg
ICB9CisgICAgCisgICAgaW50IHByb3BJbmRleCA9IHByb3AgLSBmaXJzdENTU1Byb3BlcnR5Owor
ICAgIGlmIChwcm9wSW5kZXggPj0gMCAmJiBwcm9wSW5kZXggPCBudW1DU1NQcm9wZXJ0aWVzKSB7
CisgICAgICAgIGludCBpID0gZ1Byb3BlcnR5V3JhcHBlck1hcFtwcm9wSW5kZXhdOworICAgICAg
ICBpZiAoaSA+PSAwKSB7CisgICAgICAgICAgICBQcm9wZXJ0eVdyYXBwZXJCYXNlKiB3cmFwcGVy
ID0gKCpnUHJvcGVydHlXcmFwcGVycylbaV07CisgICAgICAgICAgICB3cmFwcGVyLT5ibGVuZChk
c3QsIGEsIGIsIHByb2cpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAg
ICB9CisgICAgCisgICAgcmV0dXJuIGZhbHNlOworfQorCitDb21wb3NpdGVBbmltYXRpb24qIEFu
aW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjphY2Nlc3NDb21wb3NpdGVBbmltYXRpb24oUmVuZGVy
T2JqZWN0KiByZW5kZXJlcikKK3sKKyAgICBDb21wb3NpdGVBbmltYXRpb24qIGFuaW1hdGlvbiA9
IG1fY29tcG9zaXRlQW5pbWF0aW9ucy5nZXQocmVuZGVyZXIpOworICAgIGlmICghYW5pbWF0aW9u
KSB7CisgICAgICAgIGFuaW1hdGlvbiA9IG5ldyBDb21wb3NpdGVBbmltYXRpb24odGhpcyk7Cisg
ICAgICAgIG1fY29tcG9zaXRlQW5pbWF0aW9ucy5zZXQocmVuZGVyZXIsIGFuaW1hdGlvbik7Cisg
ICAgfQorICAgIHJldHVybiBhbmltYXRpb247Cit9CisKK2Jvb2wgQW5pbWF0aW9uQ29udHJvbGxl
clByaXZhdGU6OmNsZWFyKFJlbmRlck9iamVjdCogcmVuZGVyZXIpCit7CisgICAgLy8gUmV0dXJu
IGZhbHNlIGlmIHdlIGRpZG4ndCBkbyBhbnl0aGluZyBPUiB3ZSBhcmUgc3VzcGVuZGVkIChzbyB3
ZSBkb24ndCB0cnkgdG8KKyAgICAvLyBkbyBhIHNldENoYW5nZWQoKSB3aGVuIHN1c3BlbmRlZAor
ICAgIENvbXBvc2l0ZUFuaW1hdGlvbiogYW5pbWF0aW9uID0gbV9jb21wb3NpdGVBbmltYXRpb25z
LnRha2UocmVuZGVyZXIpOworICAgIGlmICghYW5pbWF0aW9uKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgYW5pbWF0aW9uLT5yZXNldFRyYW5zaXRpb25zKHJlbmRlcmVyKTsKKyAgICBib29s
IHdhc1N1c3BlbmRlZCA9IGFuaW1hdGlvbi0+c3VzcGVuZGVkKCk7CisgICAgZGVsZXRlIGFuaW1h
dGlvbjsKKyAgICByZXR1cm4gIXdhc1N1c3BlbmRlZDsKK30KKwordm9pZCBBbmltYXRpb25Db250
cm9sbGVyUHJpdmF0ZTo6c3R5bGVBdmFpbGFibGUoKQoreworICAgIGlmIChtX251bVN0eWxlQXZh
aWxhYmxlV2FpdGVycyA9PSAwKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgUmVuZGVyT2Jq
ZWN0QW5pbWF0aW9uTWFwOjpjb25zdF9pdGVyYXRvciBhbmltYXRpb25zRW5kID0gbV9jb21wb3Np
dGVBbmltYXRpb25zLmVuZCgpOworICAgIGZvciAoUmVuZGVyT2JqZWN0QW5pbWF0aW9uTWFwOjpj
b25zdF9pdGVyYXRvciBpdCA9IG1fY29tcG9zaXRlQW5pbWF0aW9ucy5iZWdpbigpOyAKKyAgICAg
ICAgIGl0ICE9IGFuaW1hdGlvbnNFbmQ7ICsraXQpIHsKKyAgICAgICAgaXQtPnNlY29uZC0+c3R5
bGVBdmFpbGFibGUoKTsKKyAgICB9Cit9CisKK3ZvaWQgQW5pbWF0aW9uQ29udHJvbGxlclByaXZh
dGU6OnVwZGF0ZUFuaW1hdGlvblRpbWVyKCkKK3sKKyAgICBib29sIGFuaW1hdGluZyA9IGZhbHNl
OworICAgIAorICAgIFJlbmRlck9iamVjdEFuaW1hdGlvbk1hcDo6Y29uc3RfaXRlcmF0b3IgYW5p
bWF0aW9uc0VuZCA9IG1fY29tcG9zaXRlQW5pbWF0aW9ucy5lbmQoKTsKKyAgICBmb3IgKFJlbmRl
ck9iamVjdEFuaW1hdGlvbk1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2NvbXBvc2l0ZUFuaW1h
dGlvbnMuYmVnaW4oKTsgCisgICAgICAgICBpdCAhPSBhbmltYXRpb25zRW5kOyArK2l0KSB7Cisg
ICAgICAgIENvbXBvc2l0ZUFuaW1hdGlvbiogY29tcEFuaW0gPSBpdC0+c2Vjb25kOworICAgICAg
ICBpZiAoIWNvbXBBbmltLT5zdXNwZW5kZWQoKSAmJiBjb21wQW5pbS0+YW5pbWF0aW5nKCkpIHsK
KyAgICAgICAgICAgIGFuaW1hdGluZyA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgfQorICAgIH0KKyAgICAKKyAgICBpZiAoYW5pbWF0aW5nKSB7CisgICAgICAgIGlmICghbV9h
bmltYXRpb25UaW1lci5pc0FjdGl2ZSgpKQorICAgICAgICAgICAgbV9hbmltYXRpb25UaW1lci5z
dGFydFJlcGVhdGluZyhjQW5pbWF0aW9uVGltZXJEZWxheSk7CisgICAgfSBlbHNlIGlmIChtX2Fu
aW1hdGlvblRpbWVyLmlzQWN0aXZlKCkpCisgICAgICAgIG1fYW5pbWF0aW9uVGltZXIuc3RvcCgp
OworfQorCit2b2lkIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjp1cGRhdGVSZW5kZXJpbmdE
aXNwYXRjaGVyRmlyZWQoVGltZXI8QW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU+KikKK3sKKyAg
ICBpZiAobV9mcmFtZSAmJiBtX2ZyYW1lLT5kb2N1bWVudCgpKSB7CisgICAgICAgIG1fZnJhbWUt
PmRvY3VtZW50KCktPnVwZGF0ZVJlbmRlcmluZygpOworICAgIH0KK30KKwordm9pZCBBbmltYXRp
b25Db250cm9sbGVyUHJpdmF0ZTo6c3RhcnRVcGRhdGVSZW5kZXJpbmdEaXNwYXRjaGVyKCkKK3sK
KyAgICBpZiAoIW1fdXBkYXRlUmVuZGVyaW5nRGlzcGF0Y2hlci5pc0FjdGl2ZSgpKSB7CisgICAg
ICAgIG1fdXBkYXRlUmVuZGVyaW5nRGlzcGF0Y2hlci5zdGFydE9uZVNob3QoMCk7CisgICAgfQor
fQorCit2b2lkIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjphbmltYXRpb25UaW1lckZpcmVk
KFRpbWVyPEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlPiogdGltZXIpCit7CisgICAgLy8gV2hl
biB0aGUgdGltZXIgZmlyZXMsIGFsbCB3ZSBkbyBpcyBjYWxsIHNldENoYW5nZWQgb24gYWxsIERP
TSBub2RlcyB3aXRoIHJ1bm5pbmcgYW5pbWF0aW9ucyBhbmQgdGhlbiBkbyBhbiBpbW1lZGlhdGUK
KyAgICAvLyB1cGRhdGVSZW5kZXJpbmcuICBJdCB3aWxsIHRoZW4gY2FsbCBiYWNrIHRvIHVzIHdp
dGggbmV3IGluZm9ybWF0aW9uLgorICAgIGJvb2wgYW5pbWF0aW5nID0gZmFsc2U7CisgICAgUmVu
ZGVyT2JqZWN0QW5pbWF0aW9uTWFwOjpjb25zdF9pdGVyYXRvciBhbmltYXRpb25zRW5kID0gbV9j
b21wb3NpdGVBbmltYXRpb25zLmVuZCgpOworICAgIGZvciAoUmVuZGVyT2JqZWN0QW5pbWF0aW9u
TWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fY29tcG9zaXRlQW5pbWF0aW9ucy5iZWdpbigpOyAK
KyAgICAgICAgIGl0ICE9IGFuaW1hdGlvbnNFbmQ7ICsraXQpIHsKKyAgICAgICAgUmVuZGVyT2Jq
ZWN0KiByZW5kZXJlciA9IGl0LT5maXJzdDsKKyAgICAgICAgQ29tcG9zaXRlQW5pbWF0aW9uKiBj
b21wQW5pbSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmICghY29tcEFuaW0tPnN1c3BlbmRlZCgp
ICYmIGNvbXBBbmltLT5hbmltYXRpbmcoKSkgeworICAgICAgICAgICAgYW5pbWF0aW5nID0gdHJ1
ZTsKKyAgICAgICAgICAgIGNvbXBBbmltLT5zZXRBbmltYXRpbmcoZmFsc2UpOworICAgICAgICAg
ICAgc2V0Q2hhbmdlZChyZW5kZXJlci0+ZWxlbWVudCgpKTsKKyAgICAgICAgfQorICAgIH0KKyAg
ICAKKyAgICBtX2ZyYW1lLT5kb2N1bWVudCgpLT51cGRhdGVSZW5kZXJpbmcoKTsKKyAgICAKKyAg
ICB1cGRhdGVBbmltYXRpb25UaW1lcigpOworfQorCitib29sIEFuaW1hdGlvbkNvbnRyb2xsZXJQ
cml2YXRlOjppc0FuaW1hdGluZ1Byb3BlcnR5T25SZW5kZXJlcihSZW5kZXJPYmplY3QqIG9iaiwg
aW50IHByb3BlcnR5LCBib29sIGlzUnVubmluZ05vdykgY29uc3QKK3sKKyAgICBDb21wb3NpdGVB
bmltYXRpb24qIGFuaW1hdGlvbiA9IG1fY29tcG9zaXRlQW5pbWF0aW9ucy5nZXQob2JqKTsKKyAg
ICBpZiAoIWFuaW1hdGlvbikgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIGFuaW1hdGlvbi0+
aXNBbmltYXRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgaXNSdW5uaW5nTm93KTsKK30KKwordm9pZCBB
bmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6c3VzcGVuZEFuaW1hdGlvbnMoRG9jdW1lbnQqIGRv
Y3VtZW50KQoreworICAgIFJlbmRlck9iamVjdEFuaW1hdGlvbk1hcDo6Y29uc3RfaXRlcmF0b3Ig
YW5pbWF0aW9uc0VuZCA9IG1fY29tcG9zaXRlQW5pbWF0aW9ucy5lbmQoKTsKKyAgICBmb3IgKFJl
bmRlck9iamVjdEFuaW1hdGlvbk1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2NvbXBvc2l0ZUFu
aW1hdGlvbnMuYmVnaW4oKTsgCisgICAgICAgICBpdCAhPSBhbmltYXRpb25zRW5kOyArK2l0KSB7
CisgICAgICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBpdC0+Zmlyc3Q7CisgICAgICAgIENv
bXBvc2l0ZUFuaW1hdGlvbiogY29tcEFuaW0gPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAocmVu
ZGVyZXItPmRvY3VtZW50KCkgPT0gZG9jdW1lbnQpCisgICAgICAgICAgICBjb21wQW5pbS0+c3Vz
cGVuZEFuaW1hdGlvbnMoKTsKKyAgICB9CisgICAgCisgICAgdXBkYXRlQW5pbWF0aW9uVGltZXIo
KTsKK30KKwordm9pZCBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6cmVzdW1lQW5pbWF0aW9u
cyhEb2N1bWVudCogZG9jdW1lbnQpCit7CisgICAgUmVuZGVyT2JqZWN0QW5pbWF0aW9uTWFwOjpj
b25zdF9pdGVyYXRvciBhbmltYXRpb25zRW5kID0gbV9jb21wb3NpdGVBbmltYXRpb25zLmVuZCgp
OworICAgIGZvciAoUmVuZGVyT2JqZWN0QW5pbWF0aW9uTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9
IG1fY29tcG9zaXRlQW5pbWF0aW9ucy5iZWdpbigpOyAKKyAgICAgICAgIGl0ICE9IGFuaW1hdGlv
bnNFbmQ7ICsraXQpIHsKKyAgICAgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IGl0LT5maXJz
dDsKKyAgICAgICAgQ29tcG9zaXRlQW5pbWF0aW9uKiBjb21wQW5pbSA9IGl0LT5zZWNvbmQ7Cisg
ICAgICAgIGlmIChyZW5kZXJlci0+ZG9jdW1lbnQoKSA9PSBkb2N1bWVudCkKKyAgICAgICAgICAg
IGNvbXBBbmltLT5yZXN1bWVBbmltYXRpb25zKCk7CisgICAgfQorICAgIAorICAgIHVwZGF0ZUFu
aW1hdGlvblRpbWVyKCk7Cit9CisKK3ZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjp1cGRhdGVUcmFu
c2l0aW9ucyhSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBjb25zdCBSZW5kZXJTdHlsZSogY3VycmVu
dFN0eWxlLCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUpCit7CisgICAgLy8gSWYgY3VycmVudFN0
eWxlIGlzIG51bGwsIHdlIGRvbid0IGRvIHRyYW5zaXRpb25zCisgICAgaWYgKCFjdXJyZW50U3R5
bGUgfHwgIXRhcmdldFN0eWxlLT50cmFuc2l0aW9ucygpKQorICAgICAgICByZXR1cm47CisgICAg
ICAgIAorICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgYWN0aXZl
IHRyYW5zaXRpb25zCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YXJnZXRTdHlsZS0+dHJh
bnNpdGlvbnMoKS0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgQW5pbWF0aW9uKiBhbmlt
ID0gKCp0YXJnZXRTdHlsZS0+dHJhbnNpdGlvbnMoKSlbaV0uZ2V0KCk7CisgICAgICAgIGRvdWJs
ZSBkdXJhdGlvbiA9IGFuaW0tPmR1cmF0aW9uKCk7CisgICAgICAgIGRvdWJsZSBkZWxheSA9IGFu
aW0tPmRlbGF5KCk7CisKKyAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBlbXB0eSB0cmFuc2l0aW9u
LCBza2lwIGl0CisgICAgICAgIGlmIChkdXJhdGlvbiA9PSAwICYmIGRlbGF5IDw9IDApCisgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgIAorICAgICAgICBpbnQgcHJvcCA9IGFuaW0tPnBy
b3BlcnR5KCk7CisgICAgICAgIGJvb2wgYWxsID0gcHJvcCA9PSBjQW5pbWF0ZUFsbDsKKyAgICAg
ICAgCisgICAgICAgIC8vIEhhbmRsZSBib3RoIHRoZSAnYWxsJyBhbmQgc2luZ2xlIHByb3BlcnR5
IGNhc2VzLiBGb3IgdGhlIHNpbmdsZSBwcm9wIGNhc2UsIHdlIG1ha2Ugb25seSBvbmUgcGFzcwor
ICAgICAgICAvLyB0aHJvdWdoIHRoZSBsb29wCisgICAgICAgIGZvciAoaW50IHByb3BlcnR5SW5k
ZXggPSAwOyA7ICsrcHJvcGVydHlJbmRleCkgeworICAgICAgICAgICAgaWYgKGFsbCkgeworICAg
ICAgICAgICAgICAgIGlmIChwcm9wZXJ0eUluZGV4ID49IEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2
YXRlOjpnZXROdW1Qcm9wZXJ0aWVzKCkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgICAgIC8vIGdldCB0aGUgbmV4dCBwcm9wCisgICAgICAgICAgICAgICAgcHJvcCA9
IEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpnZXRQcm9wZXJ0eUF0SW5kZXgocHJvcGVydHlJ
bmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEltcGxpY2l0QW5pbWF0aW9u
cyBhcmUgYWx3YXlzIGhhc2hlZCBieSBhY3R1YWwgcHJvcGVydGllcywgbmV2ZXIgY0FuaW1hdGVB
bGwKKyAgICAgICAgICAgIEFTU0VSVChwcm9wID4gZmlyc3RDU1NQcm9wZXJ0eSAmJiBwcm9wIDwg
KGZpcnN0Q1NTUHJvcGVydHkgKyBudW1DU1NQcm9wZXJ0aWVzKSk7CisKKyAgICAgICAgICAgIC8v
IFNlZSBpZiB0aGVyZSBpcyBhIGN1cnJlbnQgdHJhbnNpdGlvbiBmb3IgdGhpcyBwcm9wCisgICAg
ICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogaW1wbEFuaW0gPSBtX3RyYW5zaXRpb25zLmdldChw
cm9wKTsKKyAgICAgICAgICAgIGJvb2wgZXF1YWwgPSB0cnVlOworICAgICAgICAgICAgCisgICAg
ICAgICAgICBpZiAoaW1wbEFuaW0pIHsKKyAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBvbmUs
IGhhcyBvdXIgdGFyZ2V0IGNoYW5nZWQ/CisgICAgICAgICAgICAgICAgaWYgKCFpbXBsQW5pbS0+
aXNUYXJnZXRQcm9wZXJ0eUVxdWFsKHByb3AsIHRhcmdldFN0eWxlKSkgeworICAgICAgICAgICAg
ICAgICAgICBpbXBsQW5pbS0+cmVzZXQocmVuZGVyZXIpOworICAgICAgICAgICAgICAgICAgICBk
ZWxldGUgaW1wbEFuaW07CisgICAgICAgICAgICAgICAgICAgIG1fdHJhbnNpdGlvbnMucmVtb3Zl
KHByb3ApOworICAgICAgICAgICAgICAgICAgICBlcXVhbCA9IGZhbHNlOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gU2VlIGlmIHdl
IG5lZWQgdG8gc3RhcnQgYSBuZXcgdHJhbnNpdGlvbgorICAgICAgICAgICAgICAgIGVxdWFsID0g
QW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OnByb3BlcnRpZXNFcXVhbChwcm9wLCBjdXJyZW50
U3R5bGUsIHRhcmdldFN0eWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAg
ICAgICAgaWYgKCFlcXVhbCkgeworICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbmV3IHRyYW5z
aXRpb24KKyAgICAgICAgICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogYW5pbWF0aW9uID0gbmV3
IEltcGxpY2l0QW5pbWF0aW9uKGNvbnN0X2Nhc3Q8QW5pbWF0aW9uKj4oYW5pbSksIHByb3AsIHJl
bmRlcmVyLCB0aGlzKTsKKyAgICAgICAgICAgICAgICBtX3RyYW5zaXRpb25zLnNldChwcm9wLCBh
bmltYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICAvLyBX
ZSBvbmx5IG5lZWQgb25lIHBhc3MgZm9yIHRoZSBzaW5nbGUgcHJvcCBjYXNlCisgICAgICAgICAg
ICBpZiAoIWFsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30K
Kwordm9pZCBDb21wb3NpdGVBbmltYXRpb246OnVwZGF0ZUtleWZyYW1lQW5pbWF0aW9ucyhSZW5k
ZXJPYmplY3QqIHJlbmRlcmVyLCBjb25zdCBSZW5kZXJTdHlsZSogY3VycmVudFN0eWxlLCBSZW5k
ZXJTdHlsZSogdGFyZ2V0U3R5bGUpCit7CisgICAgLy8gTm90aGluZyB0byBkbyBpZiB3ZSBkb24n
dCBoYXZlIGFueSBhbmltYXRpb25zLCBhbmQgZGlkbid0IGhhdmUgYW55IGJlZm9yZQorICAgIGlm
IChtX2tleWZyYW1lQW5pbWF0aW9ucy5pc0VtcHR5KCkgJiYgIXRhcmdldFN0eWxlLT5oYXNBbmlt
YXRpb25zKCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICAvLyBOb3RoaW5nIHRvIGRvIGlm
IHRoZSBjdXJyZW50IGFuZCB0YXJnZXQgYW5pbWF0aW9ucyBhcmUgdGhlIHNhbWUKKyAgICBpZiAo
Y3VycmVudFN0eWxlICYmIGN1cnJlbnRTdHlsZS0+aGFzQW5pbWF0aW9ucygpICYmIHRhcmdldFN0
eWxlLT5oYXNBbmltYXRpb25zKCkgJiYgKihjdXJyZW50U3R5bGUtPmFuaW1hdGlvbnMoKSkgPT0g
Kih0YXJnZXRTdHlsZS0+YW5pbWF0aW9ucygpKSkKKyAgICAgICAgcmV0dXJuOworICAgICAgICAK
KyAgICBpbnQgbnVtQW5pbXMgPSAwOworICAgIGJvb2wgYW5pbXNDaGFuZ2VkID0gZmFsc2U7Cisg
ICAgCisgICAgLy8gc2VlIGlmIHRoZSBsaXN0cyBtYXRjaAorICAgIGlmICh0YXJnZXRTdHlsZS0+
YW5pbWF0aW9ucygpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGFyZ2V0U3R5
bGUtPmFuaW1hdGlvbnMoKS0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IEFuaW1h
dGlvbiogYW5pbSA9ICgqdGFyZ2V0U3R5bGUtPmFuaW1hdGlvbnMoKSlbaV0uZ2V0KCk7CisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIGlmICghYW5pbS0+aXNWYWxpZEFuaW1hdGlvbigpKQorICAg
ICAgICAgICAgICAgIGFuaW1zQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICBlbHNlIHsKKyAg
ICAgICAgICAgICAgICBBdG9taWNTdHJpbmcgbmFtZShhbmltLT5uYW1lKCkpOworICAgICAgICAg
ICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBrZkFuaW0gPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5n
ZXQobmFtZS5pbXBsKCkpOworICAgICAgICAgICAgICAgIGlmICgha2ZBbmltIHx8ICFrZkFuaW0t
PmFuaW1hdGlvbnNNYXRjaChhbmltKSkKKyAgICAgICAgICAgICAgICAgICAgYW5pbXNDaGFuZ2Vk
ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGlmIChh
bmltKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmltYXRpb25zIG1hdGNoLCBidXQg
cGxheSBzdGF0ZXMgbWF5IGRpZmZlci4gdXBkYXRlIGlmIG5lZWRlZAorICAgICAgICAgICAgICAg
ICAgICAgICAga2ZBbmltLT51cGRhdGVQbGF5U3RhdGUoYW5pbS0+cGxheVN0YXRlKCkgPT0gQW5p
bVBsYXlTdGF0ZVBsYXlpbmcpOworICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAg
ICAgICAgICAgICAgICAvLyBzZXQgdGhlIHNhdmVkIGFuaW1hdGlvbiB0byB0aGlzIG5ldyBvbmUs
IGp1c3QgaW4gY2FzZSB0aGUgcGxheSBzdGF0ZSBoYXMgY2hhbmdlZAorICAgICAgICAgICAgICAg
ICAgICAgICAga2ZBbmltLT5zZXRBbmltYXRpb24oYW5pbSk7CisgICAgICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrbnVtQW5pbXM7CisgICAgICAgIH0KKyAg
ICB9CisgICAgCisgICAgaWYgKCFhbmltc0NoYW5nZWQgJiYgbV9rZXlmcmFtZUFuaW1hdGlvbnMu
c2l6ZSgpICE9IG51bUFuaW1zKQorICAgICAgICBhbmltc0NoYW5nZWQgPSB0cnVlOworCisgICAg
aWYgKCFhbmltc0NoYW5nZWQpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIGFuaW1hdGlvbnMg
aGF2ZSBjaGFuZ2VkLCB1cGRhdGUgdGhlIGxpc3QKKyAgICByZXNldEFuaW1hdGlvbnMocmVuZGVy
ZXIpOworCisgICAgaWYgKCF0YXJnZXRTdHlsZS0+YW5pbWF0aW9ucygpKQorICAgICAgICByZXR1
cm47CisKKyAgICAvLyBhZGQgYWxsIHRoZSBuZXcgYW5pbWF0aW9ucworICAgIGludCBpbmRleCA9
IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YXJnZXRTdHlsZS0+YW5pbWF0aW9ucygp
LT5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBBbmltYXRpb24qIGFuaW0gPSAoKnRhcmdl
dFN0eWxlLT5hbmltYXRpb25zKCkpW2ldLmdldCgpOworCisgICAgICAgIGlmICghYW5pbS0+aXNW
YWxpZEFuaW1hdGlvbigpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAKKyAg
ICAgICAgLy8gZG9uJ3QgYm90aGVyIGFkZGluZyB0aGUgYW5pbWF0aW9uIGlmIGl0IGhhcyBubyBr
ZXlmcmFtZXMgb3Igd29uJ3QgYW5pbWF0ZQorICAgICAgICBpZiAoKGFuaW0tPmR1cmF0aW9uKCkg
fHwgYW5pbS0+ZGVsYXkoKSkgJiYgYW5pbS0+aXRlcmF0aW9uQ291bnQoKSAmJgorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmltLT5rZXlmcmFtZUxpc3QoKS5n
ZXQoKSAmJiAhYW5pbS0+a2V5ZnJhbWVMaXN0KCktPmlzRW1wdHkoKSkgeworICAgICAgICAgICAg
S2V5ZnJhbWVBbmltYXRpb24qIGtmYW5pbSA9IG5ldyBLZXlmcmFtZUFuaW1hdGlvbihjb25zdF9j
YXN0PEFuaW1hdGlvbio+KGFuaW0pLCByZW5kZXJlciwgaW5kZXgrKywgdGhpcyk7CisgICAgICAg
ICAgICBtX2tleWZyYW1lQW5pbWF0aW9ucy5zZXQoa2ZhbmltLT5uYW1lKCkuaW1wbCgpLCBrZmFu
aW0pOworICAgICAgICB9CisgICAgfQorfQorCitLZXlmcmFtZUFuaW1hdGlvbiogQ29tcG9zaXRl
QW5pbWF0aW9uOjpmaW5kS2V5ZnJhbWVBbmltYXRpb24oY29uc3QgQXRvbWljU3RyaW5nJiBuYW1l
KQoreworICAgIHJldHVybiBtX2tleWZyYW1lQW5pbWF0aW9ucy5nZXQobmFtZS5pbXBsKCkpOwor
fQorCitSZW5kZXJTdHlsZSogQ29tcG9zaXRlQW5pbWF0aW9uOjphbmltYXRlKFJlbmRlck9iamVj
dCogcmVuZGVyZXIsIGNvbnN0IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUsIFJlbmRlclN0eWxl
KiB0YXJnZXRTdHlsZSkKK3sKKyAgICBSZW5kZXJTdHlsZSogcmVzdWx0U3R5bGUgPSAwOworICAg
IAorICAgIC8vIFdlIGRvbid0IGRvIGFueSB0cmFuc2l0aW9ucyBpZiB3ZSBkb24ndCBoYXZlIGEg
Y3VycmVudFN0eWxlIChvbiBzdGFydHVwKQorICAgIHVwZGF0ZVRyYW5zaXRpb25zKHJlbmRlcmVy
LCBjdXJyZW50U3R5bGUsIHRhcmdldFN0eWxlKTsKKyAgICAKKyAgICBpZiAoY3VycmVudFN0eWxl
KSB7CisgICAgICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgdHJhbnNpdGlvbiBvYmplY3RzIHJlYWR5
LCBsZXQgdGhlbSBrbm93IGFib3V0IHRoZSBuZXcgZ29hbCBzdGF0ZS4gIFdlIHdhbnQgdGhlbQor
ICAgICAgICAvLyB0byBmaWxsIGluIGEgUmVuZGVyU3R5bGUqJiBvbmx5IGlmIG5lZWRlZC4KKyAg
ICAgICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV90
cmFuc2l0aW9ucy5lbmQoKTsKKyAgICAgICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFw
Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyAr
K2l0KSB7CisgICAgICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogIGFuaW0gPSBpdC0+c2Vjb25k
OworICAgICAgICAgICAgaWYgKGFuaW0pIHsKKyAgICAgICAgICAgICAgICBhbmltLT5hbmltYXRl
KHRoaXMsIHJlbmRlcmVyLCBjdXJyZW50U3R5bGUsIHRhcmdldFN0eWxlLCByZXN1bHRTdHlsZSk7
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1cGRhdGVLZXlmcmFtZUFu
aW1hdGlvbnMocmVuZGVyZXIsIGN1cnJlbnRTdHlsZSwgdGFyZ2V0U3R5bGUpOworCisgICAgLy8g
Tm93IHRoYXQgd2UgaGF2ZSBhbmltYXRpb24gb2JqZWN0cyByZWFkeSwgbGV0IHRoZW0ga25vdyBh
Ym91dCB0aGUgbmV3IGdvYWwgc3RhdGUuICBXZSB3YW50IHRoZW0KKyAgICAvLyB0byBmaWxsIGlu
IGEgUmVuZGVyU3R5bGUqJiBvbmx5IGlmIG5lZWRlZC4KKyAgICBpZiAodGFyZ2V0U3R5bGUtPmhh
c0FuaW1hdGlvbnMoKSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRhcmdldFN0
eWxlLT5hbmltYXRpb25zKCktPnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBBbmlt
YXRpb24qIGFuaW0gPSAoKnRhcmdldFN0eWxlLT5hbmltYXRpb25zKCkpW2ldLmdldCgpOworCisg
ICAgICAgICAgICBpZiAoYW5pbS0+aXNWYWxpZEFuaW1hdGlvbigpKSB7CisgICAgICAgICAgICAg
ICAgQXRvbWljU3RyaW5nIG5hbWUoYW5pbS0+bmFtZSgpKTsKKyAgICAgICAgICAgICAgICBLZXlm
cmFtZUFuaW1hdGlvbioga2V5ZnJhbWVBbmltID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuZ2V0KG5h
bWUuaW1wbCgpKTsKKyAgICAgICAgICAgICAgICBpZiAoa2V5ZnJhbWVBbmltKQorICAgICAgICAg
ICAgICAgICAgICBrZXlmcmFtZUFuaW0tPmFuaW1hdGUodGhpcywgcmVuZGVyZXIsIGN1cnJlbnRT
dHlsZSwgdGFyZ2V0U3R5bGUsIHJlc3VsdFN0eWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgIH0KKyAgICAKKyAgICBjbGVhbnVwRmluaXNoZWRBbmltYXRpb25zKHJlbmRlcmVyKTsK
KworICAgIHJldHVybiByZXN1bHRTdHlsZSA/IHJlc3VsdFN0eWxlIDogdGFyZ2V0U3R5bGU7Cit9
CisKKy8vICJhbmltYXRpbmciIG1lYW5zIHRoYXQgc29tZXRoaW5nIGlzIHJ1bm5pbmcgdGhhdCBy
ZXF1aXJlcyB0aGUgdGltZXIgdG8ga2VlcCBmaXJpbmcKKy8vIChlLmcuIGEgdHJhbnNpdGlvbikK
K3ZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpzZXRBbmltYXRpbmcoYm9vbCBpbkFuaW1hdGluZykK
K3sKKyAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBt
X3RyYW5zaXRpb25zLmVuZCgpOworICAgIGZvciAoQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6
Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytp
dCkgeworICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogIHRyYW5zaXRpb24gPSBpdC0+c2Vjb25k
OworICAgICAgICB0cmFuc2l0aW9uLT5zZXRBbmltYXRpbmcoaW5BbmltYXRpbmcpOworICAgIH0K
KworICAgIEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlmcmFt
ZUFuaW1hdGlvbnMuZW5kKCk7CisgICAgZm9yIChBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVy
YXRvciBpdCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IGtmZW5kOyArK2l0
KSB7CisgICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKKyAgICAg
ICAgYW5pbS0+c2V0QW5pbWF0aW5nKGluQW5pbWF0aW5nKTsKKyAgICB9Cit9CisKK2Jvb2wgQ29t
cG9zaXRlQW5pbWF0aW9uOjphbmltYXRpbmcoKQoreworICAgIENTU1Byb3BlcnR5VHJhbnNpdGlv
bnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7CisgICAgZm9y
IChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fdHJhbnNp
dGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIEltcGxpY2l0QW5pbWF0
aW9uKiAgdHJhbnNpdGlvbiA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmICh0cmFuc2l0aW9uICYm
IHRyYW5zaXRpb24tPmFuaW1hdGluZygpICYmIHRyYW5zaXRpb24tPnJ1bm5pbmcoKSkKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICBBbmltYXRpb25OYW1lTWFwOjpj
b25zdF9pdGVyYXRvciBrZmVuZCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmVuZCgpOworICAgIGZv
ciAoQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lQW5pbWF0
aW9ucy5iZWdpbigpOyBpdCAhPSBrZmVuZDsgKytpdCkgeworICAgICAgICBLZXlmcmFtZUFuaW1h
dGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmIChhbmltICYmICFhbmltLT5wYXVz
ZWQoKSAmJiBhbmltLT5hbmltYXRpbmcoKSAmJiBhbmltLT5hY3RpdmUoKSkKKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBDb21w
b3NpdGVBbmltYXRpb246OnJlc2V0VHJhbnNpdGlvbnMoUmVuZGVyT2JqZWN0KiByZW5kZXJlcikK
K3sKKyAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBt
X3RyYW5zaXRpb25zLmVuZCgpOworICAgIGZvciAoQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6
Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytp
dCkgeworICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogIHRyYW5zaXRpb24gPSBpdC0+c2Vjb25k
OworICAgICAgICB0cmFuc2l0aW9uLT5yZXNldChyZW5kZXJlcik7CisgICAgICAgIGRlbGV0ZSB0
cmFuc2l0aW9uOworICAgIH0KKyAgICBtX3RyYW5zaXRpb25zLmNsZWFyKCk7Cit9CisKK3ZvaWQg
Q29tcG9zaXRlQW5pbWF0aW9uOjpyZXNldEFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0KiByZW5kZXJl
cikKK3sKKyAgICBkZWxldGVBbGxWYWx1ZXMobV9rZXlmcmFtZUFuaW1hdGlvbnMpOworICAgIG1f
a2V5ZnJhbWVBbmltYXRpb25zLmNsZWFyKCk7Cit9CisKK3ZvaWQgQ29tcG9zaXRlQW5pbWF0aW9u
OjpjbGVhbnVwRmluaXNoZWRBbmltYXRpb25zKFJlbmRlck9iamVjdCogcmVuZGVyZXIpCit7Cisg
ICAgaWYgKHN1c3BlbmRlZCgpKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgLy8gTWFrZSBh
IGxpc3Qgb2YgdHJhbnNpdGlvbnMgdG8gYmUgZGVsZXRlZAorICAgIFZlY3RvcjxpbnQ+IGZpbmlz
aGVkVHJhbnNpdGlvbnM7CisgICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRl
cmF0b3IgZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKKworICAgIGZvciAoQ1NTUHJvcGVydHlU
cmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7
IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogYW5pbSA9IGl0
LT5zZWNvbmQ7CisgICAgICAgIGlmICghYW5pbSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAg
ICAgICBpZiAoYW5pbS0+cG9zdGFjdGl2ZSgpICYmICFhbmltLT53YWl0aW5nRm9yRW5kRXZlbnQo
KSkKKyAgICAgICAgICAgIGZpbmlzaGVkVHJhbnNpdGlvbnMuYXBwZW5kKGFuaW0tPmFuaW1hdGlu
Z1Byb3BlcnR5KCkpOworICAgIH0KKyAgICAKKyAgICAvLyBEZWxldGUgdGhlbQorICAgIGZvciAo
VmVjdG9yPGludD46Oml0ZXJhdG9yIGl0ID0gZmluaXNoZWRUcmFuc2l0aW9ucy5iZWdpbigpOyBp
dCAhPSBmaW5pc2hlZFRyYW5zaXRpb25zLmVuZCgpOyArK2l0KSB7CisgICAgICAgIEltcGxpY2l0
QW5pbWF0aW9uKiBhbmltID0gbV90cmFuc2l0aW9ucy5nZXQoKml0KTsKKyAgICAgICAgaWYgKGFu
aW0pIHsKKyAgICAgICAgICAgIGFuaW0tPnJlc2V0KHJlbmRlcmVyKTsKKyAgICAgICAgICAgIGRl
bGV0ZSBhbmltOworICAgICAgICB9CisgICAgICAgIG1fdHJhbnNpdGlvbnMucmVtb3ZlKCppdCk7
CisgICAgfQorCisgICAgLy8gTWFrZSBhIGxpc3Qgb2YgYW5pbWF0aW9ucyB0byBiZSBkZWxldGVk
CisgICAgVmVjdG9yPEF0b21pY1N0cmluZ0ltcGwqPiBmaW5pc2hlZEFuaW1hdGlvbnM7CisgICAg
QW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0
aW9ucy5lbmQoKTsKKworICAgIGZvciAoQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3Ig
aXQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBrZmVuZDsgKytpdCkgewor
ICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlm
ICghYW5pbSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoYW5pbS0+cG9zdGFj
dGl2ZSgpICYmICFhbmltLT53YWl0aW5nRm9yRW5kRXZlbnQoKSkKKyAgICAgICAgICAgIGZpbmlz
aGVkQW5pbWF0aW9ucy5hcHBlbmQoYW5pbS0+bmFtZSgpLmltcGwoKSk7CisgICAgfQorICAgIAor
ICAgIC8vIGRlbGV0ZSB0aGVtCisgICAgZm9yIChWZWN0b3I8QXRvbWljU3RyaW5nSW1wbCo+Ojpp
dGVyYXRvciBpdCA9IGZpbmlzaGVkQW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBmaW5pc2hlZEFu
aW1hdGlvbnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGtmYW5p
bSA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmdldCgqaXQpOworICAgICAgICBpZiAoa2ZhbmltKSB7
CisgICAgICAgICAgICBrZmFuaW0tPnJlc2V0KHJlbmRlcmVyKTsKKyAgICAgICAgICAgIGRlbGV0
ZSBrZmFuaW07CisgICAgICAgIH0KKyAgICAgICAgbV9rZXlmcmFtZUFuaW1hdGlvbnMucmVtb3Zl
KCppdCk7CisgICAgfQorfQorCit2b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6c2V0QW5pbWF0aW9u
U3RhcnRUaW1lKGRvdWJsZSB0KQoreworICAgIC8vIHNldCBzdGFydCB0aW1lIG9uIGFsbCBhbmlt
YXRpb25zIHdhaXRpbmcgZm9yIGl0CisgICAgQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0
b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5lbmQoKTsKKyAgICBmb3IgKEFuaW1hdGlv
bk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuYmVnaW4o
KTsgaXQgIT0ga2ZlbmQ7ICsraXQpIHsKKyAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGFuaW0g
PSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT53YWl0aW5nRm9yU3RhcnRU
aW1lKCkpCisgICAgICAgICAgICBhbmltLT51cGRhdGVTdGF0ZU1hY2hpbmUoQW5pbWF0aW9uQmFz
ZTo6U1RBVEVfSU5QVVRfU1RBUlRfVElNRV9TRVQsIHQpOworICAgIH0KK30KKwordm9pZCBDb21w
b3NpdGVBbmltYXRpb246OnNldFRyYW5zaXRpb25TdGFydFRpbWUoaW50IHByb3BlcnR5LCBkb3Vi
bGUgdCkKK3sKKyAgICAvLyBTZXQgdGhlIHN0YXJ0IHRpbWUgZm9yIGdpdmVuIHByb3BlcnR5IHRy
YW5zaXRpb24KKyAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBl
bmQgPSBtX3RyYW5zaXRpb25zLmVuZCgpOworICAgIGZvciAoQ1NTUHJvcGVydHlUcmFuc2l0aW9u
c01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9IGVu
ZDsgKytpdCkgeworICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7
CisgICAgICAgIGlmIChhbmltICYmIGFuaW0tPndhaXRpbmdGb3JTdGFydFRpbWUoKSAmJiBhbmlt
LT5hbmltYXRpbmdQcm9wZXJ0eSgpID09IHByb3BlcnR5KQorICAgICAgICAgICAgYW5pbS0+dXBk
YXRlU3RhdGVNYWNoaW5lKEFuaW1hdGlvbkJhc2U6OlNUQVRFX0lOUFVUX1NUQVJUX1RJTUVfU0VU
LCB0KTsKKyAgICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpzdXNwZW5kQW5pbWF0
aW9ucygpCit7CisgICAgaWYgKG1fc3VzcGVuZGVkKQorICAgICAgICByZXR1cm47CisgICAgCisg
ICAgbV9zdXNwZW5kZWQgPSB0cnVlOworCisgICAgQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRl
cmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5lbmQoKTsKKyAgICBmb3IgKEFuaW1h
dGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuYmVn
aW4oKTsgaXQgIT0ga2ZlbmQ7ICsraXQpIHsKKyAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGFu
aW0gPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoYW5pbSkKKyAgICAgICAgICAgIGFuaW0tPnVw
ZGF0ZVBsYXlTdGF0ZShmYWxzZSk7CisgICAgfQorCisgICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9u
c01hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKKyAgICBmb3Ig
KENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0
aW9ucy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgSW1wbGljaXRBbmltYXRp
b24qIGFuaW0gPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT5oYXNTdHls
ZSgpKQorICAgICAgICAgICAgYW5pbS0+dXBkYXRlUGxheVN0YXRlKGZhbHNlKTsKKyAgICB9Cit9
CisKK3ZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpyZXN1bWVBbmltYXRpb25zKCkKK3sKKyAgICBp
ZiAoIW1fc3VzcGVuZGVkKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgbV9zdXNwZW5kZWQg
PSBmYWxzZTsKKyAgICAKKyAgICBBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBrZmVu
ZCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmVuZCgpOworICAgIGZvciAoQW5pbWF0aW9uTmFtZU1h
cDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5iZWdpbigpOyBpdCAh
PSBrZmVuZDsgKytpdCkgeworICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbiogYW5pbSA9IGl0LT5z
ZWNvbmQ7CisgICAgICAgIGlmIChhbmltICYmIGFuaW0tPnBsYXlTdGF0ZVBsYXlpbmcoKSkKKyAg
ICAgICAgICAgIGFuaW0tPnVwZGF0ZVBsYXlTdGF0ZSh0cnVlKTsKKyAgICB9CisgICAgCisgICAg
Q1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV90cmFuc2l0
aW9ucy5lbmQoKTsKKyAgICBmb3IgKENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0
ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAg
ICAgICAgSW1wbGljaXRBbmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAo
YW5pbSAmJiBhbmltLT5oYXNTdHlsZSgpKQorICAgICAgICAgICAgYW5pbS0+dXBkYXRlUGxheVN0
YXRlKHRydWUpOworICAgIH0KK30KKwordm9pZCBDb21wb3NpdGVBbmltYXRpb246Om92ZXJyaWRl
SW1wbGljaXRBbmltYXRpb25zKGludCBwcm9wZXJ0eSkKK3sKKyAgICBDU1NQcm9wZXJ0eVRyYW5z
aXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3RyYW5zaXRpb25zLmVuZCgpOworICAg
IGZvciAoQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3Ry
YW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBJbXBsaWNpdEFu
aW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmIChhbmltICYmIGFuaW0tPmFu
aW1hdGluZ1Byb3BlcnR5KCkgPT0gcHJvcGVydHkpCisgICAgICAgICAgICBhbmltLT5zZXRPdmVy
cmlkZGVuKHRydWUpOworICAgIH0KK30KKwordm9pZCBDb21wb3NpdGVBbmltYXRpb246OnJlc3Vt
ZU92ZXJyaWRkZW5JbXBsaWNpdEFuaW1hdGlvbnMoaW50IHByb3BlcnR5KQoreworICAgIENTU1By
b3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMu
ZW5kKCk7CisgICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRv
ciBpdCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAg
IEltcGxpY2l0QW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKKyAgICAgICAgaWYgKGFuaW0g
JiYgYW5pbS0+YW5pbWF0aW5nUHJvcGVydHkoKSA9PSBwcm9wZXJ0eSkKKyAgICAgICAgICAgIGFu
aW0tPnNldE92ZXJyaWRkZW4oZmFsc2UpOworICAgIH0KK30KKworc3RhdGljIGlubGluZSBib29s
IGNvbXBhcmVBbmltYXRpb25JbmRpY2VzKGNvbnN0IEtleWZyYW1lQW5pbWF0aW9uKiBhLCBjb25z
dCBLZXlmcmFtZUFuaW1hdGlvbiogYikKK3sKKyAgICByZXR1cm4gYS0+aW5kZXgoKSA8IGItPmlu
ZGV4KCk7Cit9CisKK3ZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpzdHlsZUF2YWlsYWJsZSgpCit7
CisgICAgaWYgKG1fbnVtU3R5bGVBdmFpbGFibGVXYWl0ZXJzID09IDApCisgICAgICAgIHJldHVy
bjsKKyAgICAKKyAgICAvLyBXZSBoYXZlIHRvIGdvIHRocm91Z2ggYW5pbWF0aW9ucyBpbiB0aGUg
b3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgaW4KKyAgICAvLyB0aGUgc3R5bGUsIGJlY2F1c2Ug
b3JkZXIgbWF0dGVycyBmb3IgYWRkaXRpdml0eS4KKyAgICBWZWN0b3I8S2V5ZnJhbWVBbmltYXRp
b24qPiBhbmltYXRpb25zKG1fa2V5ZnJhbWVBbmltYXRpb25zLnNpemUoKSk7CisgICAgQW5pbWF0
aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5l
bmQoKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChBbmltYXRpb25OYW1lTWFwOjpjb25z
dF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IGtmZW5k
OyArK2l0KSB7CisgICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsK
KyAgICAgICAgLy8gV2UgY2FuJ3QganVzdCBpbnNlcnQgYmFzZWQgb24gYW5pbS0+aW5kZXgoKSBi
ZWNhdXNlIGludmFsaWQgYW5pbWF0aW9ucyBkb24ndAorICAgICAgICAvLyBtYWtlIGl0IGludG8g
dGhlIGhhc2guCisgICAgICAgIGFuaW1hdGlvbnNbaSsrXSA9IGFuaW07CisgICAgfQorCisgICAg
aWYgKGFuaW1hdGlvbnMuc2l6ZSgpID4gMSkKKyAgICAgICAgc3RkOjpzdGFibGVfc29ydChhbmlt
YXRpb25zLmJlZ2luKCksIGFuaW1hdGlvbnMuZW5kKCksIGNvbXBhcmVBbmltYXRpb25JbmRpY2Vz
KTsKKyAgICAKKyAgICBmb3IgKGkgPSAwOyBpIDwgYW5pbWF0aW9ucy5zaXplKCk7ICsraSkgewor
ICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbiogYW5pbSA9IGFuaW1hdGlvbnNbaV07CisgICAgICAg
IGlmIChhbmltICYmIGFuaW0tPndhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZSgpKQorICAgICAgICAg
ICAgYW5pbS0+dXBkYXRlU3RhdGVNYWNoaW5lKEFuaW1hdGlvbkJhc2U6OlNUQVRFX0lOUFVUX1NU
WUxFX0FWQUlMQUJMRSwgLTEpOworICAgIH0KKyAgICAKKyAgICBDU1NQcm9wZXJ0eVRyYW5zaXRp
b25zTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3RyYW5zaXRpb25zLmVuZCgpOworICAgIGZv
ciAoQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5z
aXRpb25zLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBJbXBsaWNpdEFuaW1h
dGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmIChhbmltICYmIGFuaW0tPndhaXRp
bmdGb3JTdHlsZUF2YWlsYWJsZSgpKQorICAgICAgICAgICAgYW5pbS0+dXBkYXRlU3RhdGVNYWNo
aW5lKEFuaW1hdGlvbkJhc2U6OlNUQVRFX0lOUFVUX1NUWUxFX0FWQUlMQUJMRSwgLTEpOworICAg
IH0KK30KKworYm9vbCBDb21wb3NpdGVBbmltYXRpb246OmlzQW5pbWF0aW5nUHJvcGVydHkoaW50
IHByb3BlcnR5LCBib29sIGlzUnVubmluZ05vdykgY29uc3QKK3sKKyAgICBBbmltYXRpb25OYW1l
TWFwOjpjb25zdF9pdGVyYXRvciBrZmVuZCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmVuZCgpOwor
ICAgIGZvciAoQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1l
QW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBrZmVuZDsgKytpdCkgeworICAgICAgICBLZXlmcmFt
ZUFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmIChhbmltICYmIGFuaW0t
PmlzQW5pbWF0aW5nUHJvcGVydHkocHJvcGVydHksIGlzUnVubmluZ05vdykpCisgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01h
cDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKKyAgICBmb3IgKENT
U1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9u
cy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgSW1wbGljaXRBbmltYXRpb24q
IGFuaW0gPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT5pc0FuaW1hdGlu
Z1Byb3BlcnR5KHByb3BlcnR5LCBpc1J1bm5pbmdOb3cpKQorICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBJbXBsaWNpdEFuaW1hdGlv
bjo6YW5pbWF0ZShDb21wb3NpdGVBbmltYXRpb24qIGFuaW1hdGlvbiwgUmVuZGVyT2JqZWN0KiBy
ZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5bGUqIGN1cnJlbnRTdHlsZSwgCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRlclN0eWxlKiB0YXJnZXRTdHlsZSwgUmVuZGVy
U3R5bGUqJiBhbmltYXRlZFN0eWxlKQoreworICAgIGlmIChwYXVzZWQoKSkKKyAgICAgICAgcmV0
dXJuOworICAgIAorICAgIC8vIElmIHdlIGdldCB0aGlzIGZhciBhbmQgdGhlIGFuaW1hdGlvbiBp
cyBkb25lLCBpdCBtZWFucyB3ZSBhcmUgY2xlYW5pbmcgdXAgYSBqdXN0IGZpbmlzaGVkIGFuaW1h
dGlvbi4KKyAgICAvLyBTbyBqdXN0IHJldHVybi4gRXZlcnl0aGluZyBpcyBhbHJlYWR5IGFsbCBj
bGVhbmVkIHVwCisgICAgaWYgKHBvc3RhY3RpdmUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
Ly8gUmVzZXQgdG8gc3RhcnQgdGhlIHRyYW5zaXRpb24gaWYgd2UgYXJlIG5ldworICAgIGlmIChp
c25ldygpKQorICAgICAgICByZXNldChyZW5kZXJlciwgY3VycmVudFN0eWxlLCB0YXJnZXRTdHls
ZSk7CisgICAgCisgICAgLy8gUnVuIGEgY3ljbGUgb2YgYW5pbWF0aW9uLgorICAgIC8vIFdlIGtu
b3cgd2Ugd2lsbCBuZWVkIGEgbmV3IHJlbmRlciBzdHlsZSwgc28gbWFrZSBvbmUgaWYgbmVlZGVk
CisgICAgaWYgKCFhbmltYXRlZFN0eWxlKQorICAgICAgICBhbmltYXRlZFN0eWxlID0gbmV3IChy
ZW5kZXJlci0+cmVuZGVyQXJlbmEoKSkgUmVuZGVyU3R5bGUoKnRhcmdldFN0eWxlKTsKKyAgICAK
KyAgICBkb3VibGUgcHJvZyA9IHByb2dyZXNzKDEsIDApOworICAgIGJvb2wgbmVlZHNBbmltID0g
QW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OmJsZW5kUHJvcGVydGllcyhtX2FuaW1hdGluZ1By
b3BlcnR5LCBhbmltYXRlZFN0eWxlLCBtX2Zyb21TdHlsZSwgbV90b1N0eWxlLCBwcm9nKTsKKyAg
ICBpZiAobmVlZHNBbmltKQorICAgICAgICBzZXRBbmltYXRpbmcoKTsKK30KKwordm9pZCBJbXBs
aWNpdEFuaW1hdGlvbjo6b25BbmltYXRpb25FbmQoZG91YmxlIGluRWxhcHNlZFRpbWUpCit7Cisg
ICAgaWYgKCFzZW5kVHJhbnNpdGlvbkV2ZW50KEV2ZW50TmFtZXM6OndlYmtpdFRyYW5zaXRpb25F
bmRFdmVudCwgaW5FbGFwc2VkVGltZSkpIHsKKyAgICAgICAgLy8gV2UgZGlkbid0IGRpc3BhdGNo
IGFuIGV2ZW50LCB3aGljaCB3b3VsZCBjYWxsIGVuZEFuaW1hdGlvbigpLCBzbyB3ZSdsbCBqdXN0
IGNhbGwgaXQgaGVyZS4KKyAgICAgICAgZW5kQW5pbWF0aW9uKHRydWUpOworICAgIH0KK30KKwor
Ym9vbCBJbXBsaWNpdEFuaW1hdGlvbjo6c2VuZFRyYW5zaXRpb25FdmVudChjb25zdCBBdG9taWNT
dHJpbmcmIGluRXZlbnRUeXBlLCBkb3VibGUgaW5FbGFwc2VkVGltZSkKK3sKKyAgICBpZiAoaW5F
dmVudFR5cGUgPT0gRXZlbnROYW1lczo6d2Via2l0VHJhbnNpdGlvbkVuZEV2ZW50KSB7CisgICAg
ICAgIERvY3VtZW50OjpMaXN0ZW5lclR5cGUgbGlzdGVuZXJUeXBlID0gRG9jdW1lbnQ6OlRSQU5T
SVRJT05FTkRfTElTVEVORVI7CisgICAgICAgIAorICAgICAgICBpZiAoc2hvdWxkU2VuZEV2ZW50
Rm9yTGlzdGVuZXIobGlzdGVuZXJUeXBlKSkgeworICAgICAgICAgICAgRWxlbWVudCogZWxlbWVu
dCA9IGVsZW1lbnRGb3JFdmVudERpc3BhdGNoKCk7CisgICAgICAgICAgICBpZiAoZWxlbWVudCkg
eworICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU5hbWU7CisgICAgICAgICAgICAgICAg
aWYgKG1fdHJhbnNpdGlvblByb3BlcnR5ICE9IGNBbmltYXRlQWxsKQorICAgICAgICAgICAgICAg
ICAgICBwcm9wZXJ0eU5hbWUgPSBTdHJpbmcoZ2V0UHJvcGVydHlOYW1lKChDU1NQcm9wZXJ0eUlE
KW1fdHJhbnNpdGlvblByb3BlcnR5KSk7CisgICAgICAgICAgICAgICAgbV93YWl0aW5nRm9yRW5k
RXZlbnQgPSB0cnVlOworICAgICAgICAgICAgICAgIG1fYW5pbWF0aW9uRXZlbnREaXNwYXRjaGVy
LnN0YXJ0VGltZXIoZWxlbWVudCwgcHJvcGVydHlOYW1lLCBtX3RyYW5zaXRpb25Qcm9wZXJ0eSwg
dHJ1ZSwgaW5FdmVudFR5cGUsIGluRWxhcHNlZFRpbWUpOworICAgICAgICAgICAgICAgIHJldHVy
biB0cnVlOyAvLyBEaWQgZGlzcGF0Y2ggYW4gZXZlbnQKKyAgICAgICAgICAgIH0KKyAgICAgICAg
fQorICAgIH0KKyAgICAKKyAgICByZXR1cm4gZmFsc2U7IC8vIERpZG4ndCBkaXNwYXRjaCBhbiBl
dmVudAorfQorCit2b2lkIEltcGxpY2l0QW5pbWF0aW9uOjpyZXNldChSZW5kZXJPYmplY3QqIHJl
bmRlcmVyLCBjb25zdCBSZW5kZXJTdHlsZSogZnJvbSAvKiA9IDAgKi8sIGNvbnN0IFJlbmRlclN0
eWxlKiB0byAvKiA9IDAgKi8pCit7CisgICAgQVNTRVJUKCghbV90b1N0eWxlICYmICF0bykgfHwg
bV90b1N0eWxlICE9IHRvKTsKKyAgICBBU1NFUlQoKCFtX2Zyb21TdHlsZSAmJiAhZnJvbSkgfHwg
bV9mcm9tU3R5bGUgIT0gZnJvbSk7CisgICAgaWYgKG1fZnJvbVN0eWxlKQorICAgICAgICBtX2Zy
b21TdHlsZS0+ZGVyZWYocmVuZGVyZXItPnJlbmRlckFyZW5hKCkpOworICAgIGlmIChtX3RvU3R5
bGUpCisgICAgICAgIG1fdG9TdHlsZS0+ZGVyZWYocmVuZGVyZXItPnJlbmRlckFyZW5hKCkpOwor
ICAgIAorICAgIG1fZnJvbVN0eWxlID0gY29uc3RfY2FzdDxSZW5kZXJTdHlsZSo+KGZyb20pOyAg
IC8vIGl0IGlzIHJlYWQtb25seSwgb3RoZXIgdGhhbiB0aGUgcmVmCisgICAgaWYgKG1fZnJvbVN0
eWxlKQorICAgICAgICBtX2Zyb21TdHlsZS0+cmVmKCk7CisgICAgCisgICAgbV90b1N0eWxlID0g
Y29uc3RfY2FzdDxSZW5kZXJTdHlsZSo+KHRvKTsgICAgICAgLy8gaXQgaXMgcmVhZC1vbmx5LCBv
dGhlciB0aGFuIHRoZSByZWYKKyAgICBpZiAobV90b1N0eWxlKQorICAgICAgICBtX3RvU3R5bGUt
PnJlZigpOworICAgIAorICAgIC8vIHJlc3RhcnQgdGhlIHRyYW5zaXRpb24KKyAgICBpZiAoZnJv
bSAmJiB0bykKKyAgICAgICAgdXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVUX1JFU1RBUlRf
QU5JTUFUSU9OLCAtMSk7Cit9CisKK3ZvaWQgSW1wbGljaXRBbmltYXRpb246OnNldE92ZXJyaWRk
ZW4oYm9vbCBiKQoreworICAgIGlmIChiICE9IG1fb3ZlcnJpZGRlbikgeworICAgICAgICBtX292
ZXJyaWRkZW4gPSBiOworICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUobV9vdmVycmlkZGVuID8g
U1RBVEVfSU5QVVRfUEFVU0VfT1ZFUlJJREUgOiBTVEFURV9JTlBVVF9SRVNVTUVfT1ZFUlJJREUs
IC0xKTsKKyAgICB9Cit9CisKK2Jvb2wgSW1wbGljaXRBbmltYXRpb246OmFmZmVjdHNQcm9wZXJ0
eShpbnQgcHJvcGVydHkpIGNvbnN0Cit7CisgICAgcmV0dXJuIChtX2FuaW1hdGluZ1Byb3BlcnR5
ID09IHByb3BlcnR5KTsKK30KKworYm9vbCBJbXBsaWNpdEFuaW1hdGlvbjo6aXNUYXJnZXRQcm9w
ZXJ0eUVxdWFsKGludCBwcm9wLCBjb25zdCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUpCit7Cisg
ICAgcmV0dXJuIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpwcm9wZXJ0aWVzRXF1YWwocHJv
cCwgbV90b1N0eWxlLCB0YXJnZXRTdHlsZSk7Cit9CisKK3ZvaWQgSW1wbGljaXRBbmltYXRpb246
OmJsZW5kUHJvcGVydHlWYWx1ZUluU3R5bGUoaW50IHByb3AsIFJlbmRlclN0eWxlKiBjdXJyZW50
U3R5bGUpCit7CisgICAgZG91YmxlIHByb2cgPSBwcm9ncmVzcygxLCAwKTsKKyAgICBBbmltYXRp
b25Db250cm9sbGVyUHJpdmF0ZTo6YmxlbmRQcm9wZXJ0aWVzKHByb3AsIGN1cnJlbnRTdHlsZSwg
bV9mcm9tU3R5bGUsIG1fdG9TdHlsZSwgcHJvZyk7Cit9ICAgIAorCit2b2lkIEtleWZyYW1lQW5p
bWF0aW9uOjphbmltYXRlKENvbXBvc2l0ZUFuaW1hdGlvbiogYW5pbWF0aW9uLCBSZW5kZXJPYmpl
Y3QqIHJlbmRlcmVyLCBjb25zdCBSZW5kZXJTdHlsZSogY3VycmVudFN0eWxlLCAKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRlclN0eWxlKiB0YXJnZXRTdHls
ZSwgUmVuZGVyU3R5bGUqJiBhbmltYXRlZFN0eWxlKQoreworICAgIC8vIGlmIHdlIGhhdmUgbm90
IHlldCBzdGFydGVkLCB3ZSB3aWxsIG5vdCBoYXZlIGEgdmFsaWQgc3RhcnQgdGltZSwgc28ganVz
dCBzdGFydCB0aGUgYW5pbWF0aW9uIGlmIG5lZWRlZAorICAgIGlmIChpc25ldygpICYmIG1fYW5p
bWF0aW9uLT5wbGF5U3RhdGUoKSA9PSBBbmltUGxheVN0YXRlUGxheWluZykKKyAgICAgICAgdXBk
YXRlU3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVUX1NUQVJUX0FOSU1BVElPTiwgLTEpOworICAgIAor
ICAgIC8vIElmIHdlIGdldCB0aGlzIGZhciBhbmQgdGhlIGFuaW1hdGlvbiBpcyBkb25lLCBpdCBt
ZWFucyB3ZSBhcmUgY2xlYW5pbmcgdXAgYSBqdXN0IGZpbmlzaGVkIGFuaW1hdGlvbi4KKyAgICAv
LyBJZiBzbywgd2UgbmVlZCB0byBzZW5kIGJhY2sgdGhlIHRhcmdldFN0eWxlCisgICAgaWYgKHBv
c3RhY3RpdmUoKSkgeworICAgICAgICBpZiAoIWFuaW1hdGVkU3R5bGUpCisgICAgICAgICAgICBh
bmltYXRlZFN0eWxlID0gY29uc3RfY2FzdDxSZW5kZXJTdHlsZSo+KHRhcmdldFN0eWxlKTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGlmIHdlIGFyZSB3YWl0aW5nIGZvciB0aGUg
c3RhcnQgdGltZXIsIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBzdHlsZSB5ZXQKKyAgICAv
LyBTcGVjaWFsIGNhc2UgLSBpZiB0aGUgZGVsYXkgdGltZSBpcyAwLCB0aGVuIHdlIGRvIHdhbnQg
dG8gc2V0IHRoZSBmaXJzdCBmcmFtZSBvZiB0aGUKKyAgICAvLyBhbmltYXRpb24gcmlnaHQgYXdh
eS4gVGhpcyBhdm9pZHMgYSBmbGFzaCB3aGVuIHRoZSBhbmltYXRpb24gc3RhcnRzCisgICAgaWYg
KHdhaXRpbmdUb1N0YXJ0KCkgJiYgbV9hbmltYXRpb24tPmRlbGF5KCkgPiAwKQorICAgICAgICBy
ZXR1cm47CisgICAgCisgICAgLy8gRklYTUU6IHdlIG5lZWQgdG8gYmUgbW9yZSBlZmZpY2llbnQg
YWJvdXQgZGV0ZXJtaW5pbmcgd2hpY2gga2V5ZnJhbWVzIHdlIGFyZSBhbmltYXRpbmcgYmV0d2Vl
bi4KKyAgICAvLyBXZSBzaG91bGQgY2FjaGUgdGhlIGxhc3QgcGFpciBvciBzb21ldGhpbmcKKyAg
ICAKKyAgICAvLyBmaW5kIHRoZSBmaXJzdCBrZXkKKyAgICBkb3VibGUgZWxhcHNlZFRpbWUgPSAo
bV9zdGFydFRpbWUgPiAwKSA/ICgoIXBhdXNlZCgpID8gY3VycmVudFRpbWUoKSA6IG1fcGF1c2VU
aW1lKSAtIG1fc3RhcnRUaW1lKSA6IDAuMDsKKyAgICBpZiAoZWxhcHNlZFRpbWUgPCAwLjApCisg
ICAgICAgIGVsYXBzZWRUaW1lID0gMC4wOworICAgICAgICAKKyAgICBkb3VibGUgdCA9IG1fYW5p
bWF0aW9uLT5kdXJhdGlvbigpID8gKGVsYXBzZWRUaW1lIC8gbV9hbmltYXRpb24tPmR1cmF0aW9u
KCkpIDogMS4wOworICAgIGludCBpID0gKGludCkgdDsKKyAgICB0IC09IGk7CisgICAgaWYgKG1f
YW5pbWF0aW9uLT5kaXJlY3Rpb24oKSAmJiAoaSAmIDEpKQorICAgICAgICB0ID0gMSAtIHQ7CisK
KyAgICBSZW5kZXJTdHlsZSogZnJvbVN0eWxlID0gMDsKKyAgICBSZW5kZXJTdHlsZSogdG9TdHls
ZSA9IDA7CisgICAgZG91YmxlIHNjYWxlID0gMS4wOworICAgIGRvdWJsZSBvZmZzZXQgPSAwLjA7
CisgICAgaWYgKG1fa2V5ZnJhbWVzLmdldCgpKSB7CisgICAgICAgIFZlY3RvcjxLZXlmcmFtZVZh
bHVlPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9rZXlmcmFtZXMtPmVuZEtleWZyYW1lcygpOwor
ICAgICAgICBmb3IgKFZlY3RvcjxLZXlmcmFtZVZhbHVlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBt
X2tleWZyYW1lcy0+YmVnaW5LZXlmcmFtZXMoKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAg
ICAgICBpZiAodCA8IGl0LT5rZXkpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgZmlyc3Qga2V5
IHNob3VsZCBhbHdheXMgYmUgMCwgc28gd2Ugc2hvdWxkIG5ldmVyIHN1Y2NlZWQgb24gdGhlIGZp
cnN0IGtleQorICAgICAgICAgICAgICAgIGlmICghZnJvbVN0eWxlKQorICAgICAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBzY2FsZSA9IDEuMCAvIChpdC0+a2V5IC0gb2Zm
c2V0KTsKKyAgICAgICAgICAgICAgICB0b1N0eWxlID0gY29uc3RfY2FzdDxSZW5kZXJTdHlsZSo+
KCYoaXQtPnN0eWxlKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAKKyAgICAgICAgICAgIG9mZnNldCA9IGl0LT5rZXk7CisgICAgICAgICAgICBm
cm9tU3R5bGUgPSBjb25zdF9jYXN0PFJlbmRlclN0eWxlKj4oJihpdC0+c3R5bGUpKTsKKyAgICAg
ICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBpZiBlaXRoZXIgc3R5bGUgaXMgMCB3ZSBoYXZlIGFu
IGludmFsaWQgY2FzZSwganVzdCBzdG9wIHRoZSBhbmltYXRpb24KKyAgICBpZiAoIWZyb21TdHls
ZSB8fCAhdG9TdHlsZSkgeworICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUoU1RBVEVfSU5QVVRf
RU5EX0FOSU1BVElPTiwgLTEpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIC8v
IHJ1biBhIGN5Y2xlIG9mIGFuaW1hdGlvbi4KKyAgICAvLyBXZSBrbm93IHdlIHdpbGwgbmVlZCBh
IG5ldyByZW5kZXIgc3R5bGUsIHNvIG1ha2Ugb25lIGlmIG5lZWRlZAorICAgIGlmICghYW5pbWF0
ZWRTdHlsZSkKKyAgICAgICAgYW5pbWF0ZWRTdHlsZSA9IG5ldyAocmVuZGVyZXItPnJlbmRlckFy
ZW5hKCkpIFJlbmRlclN0eWxlKCp0YXJnZXRTdHlsZSk7CisgICAgCisgICAgZG91YmxlIHByb2cg
PSBwcm9ncmVzcyhzY2FsZSwgb2Zmc2V0KTsKKworICAgIEhhc2hTZXQ8aW50Pjo6Y29uc3RfaXRl
cmF0b3IgZW5kID0gbV9rZXlmcmFtZXMtPmVuZFByb3BlcnRpZXMoKTsKKyAgICBmb3IgKEhhc2hT
ZXQ8aW50Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lcy0+YmVnaW5Qcm9wZXJ0aWVz
KCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBpZiAoQW5pbWF0aW9uQ29udHJvbGxlclBy
aXZhdGU6OmJsZW5kUHJvcGVydGllcygqaXQsIGFuaW1hdGVkU3R5bGUsIGZyb21TdHlsZSwgdG9T
dHlsZSwgcHJvZykpCisgICAgICAgICAgICBzZXRBbmltYXRpbmcoKTsKKyAgICB9Cit9CisKK3Zv
aWQgS2V5ZnJhbWVBbmltYXRpb246OmVuZEFuaW1hdGlvbihib29sIHJlc2V0KQoreworICAgIC8v
IFJlc3RvcmUgdGhlIG9yaWdpbmFsICh1bmFuaW1hdGVkKSBzdHlsZQorICAgIGlmIChtX29iamVj
dCkKKyAgICAgICAgc2V0Q2hhbmdlZChtX29iamVjdC0+ZWxlbWVudCgpKTsKK30KKwordm9pZCBL
ZXlmcmFtZUFuaW1hdGlvbjo6b25BbmltYXRpb25TdGFydChkb3VibGUgaW5FbGFwc2VkVGltZSkK
K3sKKyAgICBzZW5kQW5pbWF0aW9uRXZlbnQoRXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uU3Rh
cnRFdmVudCwgaW5FbGFwc2VkVGltZSk7Cit9CisKK3ZvaWQgS2V5ZnJhbWVBbmltYXRpb246Om9u
QW5pbWF0aW9uSXRlcmF0aW9uKGRvdWJsZSBpbkVsYXBzZWRUaW1lKQoreworICAgIHNlbmRBbmlt
YXRpb25FdmVudChFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRpb25JdGVyYXRpb25FdmVudCwgaW5F
bGFwc2VkVGltZSk7Cit9CisKK3ZvaWQgS2V5ZnJhbWVBbmltYXRpb246Om9uQW5pbWF0aW9uRW5k
KGRvdWJsZSBpbkVsYXBzZWRUaW1lKQoreworICAgIGlmICghc2VuZEFuaW1hdGlvbkV2ZW50KEV2
ZW50TmFtZXM6OndlYmtpdEFuaW1hdGlvbkVuZEV2ZW50LCBpbkVsYXBzZWRUaW1lKSkgeworICAg
ICAgICAvLyBXZSBkaWRuJ3QgZGlzcGF0Y2ggYW4gZXZlbnQsIHdoaWNoIHdvdWxkIGNhbGwgZW5k
QW5pbWF0aW9uKCksIHNvIHdlJ2xsIGp1c3QgY2FsbCBpdCBoZXJlLgorICAgICAgICBlbmRBbmlt
YXRpb24odHJ1ZSk7CisgICAgfQorfQorCitib29sIEtleWZyYW1lQW5pbWF0aW9uOjpzZW5kQW5p
bWF0aW9uRXZlbnQoY29uc3QgQXRvbWljU3RyaW5nJiBpbkV2ZW50VHlwZSwgZG91YmxlIGluRWxh
cHNlZFRpbWUpCit7CisgICAgRG9jdW1lbnQ6Okxpc3RlbmVyVHlwZSBsaXN0ZW5lclR5cGU7Cisg
ICAgaWYgKGluRXZlbnRUeXBlID09IEV2ZW50TmFtZXM6OndlYmtpdEFuaW1hdGlvbkl0ZXJhdGlv
bkV2ZW50KQorICAgICAgICBsaXN0ZW5lclR5cGUgPSBEb2N1bWVudDo6QU5JTUFUSU9OSVRFUkFU
SU9OX0xJU1RFTkVSOworICAgIGVsc2UgaWYgKGluRXZlbnRUeXBlID09IEV2ZW50TmFtZXM6Ondl
YmtpdEFuaW1hdGlvbkVuZEV2ZW50KQorICAgICAgICBsaXN0ZW5lclR5cGUgPSBEb2N1bWVudDo6
QU5JTUFUSU9ORU5EX0xJU1RFTkVSOworICAgIGVsc2UKKyAgICAgICAgbGlzdGVuZXJUeXBlID0g
RG9jdW1lbnQ6OkFOSU1BVElPTlNUQVJUX0xJU1RFTkVSOworICAgIAorICAgIGlmIChzaG91bGRT
ZW5kRXZlbnRGb3JMaXN0ZW5lcihsaXN0ZW5lclR5cGUpKSB7CisgICAgICAgIEVsZW1lbnQqIGVs
ZW1lbnQgPSBlbGVtZW50Rm9yRXZlbnREaXNwYXRjaCgpOworICAgICAgICBpZiAoZWxlbWVudCkg
eworICAgICAgICAgICAgbV93YWl0aW5nRm9yRW5kRXZlbnQgPSB0cnVlOworICAgICAgICAgICAg
bV9hbmltYXRpb25FdmVudERpc3BhdGNoZXIuc3RhcnRUaW1lcihlbGVtZW50LCBtX25hbWUsIC0x
LCB0cnVlLCBpbkV2ZW50VHlwZSwgaW5FbGFwc2VkVGltZSk7CisgICAgICAgICAgICByZXR1cm4g
dHJ1ZTsgLy8gRGlkIGRpc3BhdGNoIGFuIGV2ZW50CisgICAgICAgIH0KKyAgICB9CisKKyAgICBy
ZXR1cm4gZmFsc2U7IC8vIERpZCBub3QgZGlzcGF0Y2ggYW4gZXZlbnQKK30KKwordm9pZCBLZXlm
cmFtZUFuaW1hdGlvbjo6b3ZlcnJpZGVBbmltYXRpb25zKCkKK3sKKyAgICAvLyBUaGlzIHdpbGwg
b3ZlcnJpZGUgaW1wbGljaXQgYW5pbWF0aW9ucyB0aGF0IG1hdGNoIHRoZSBwcm9wZXJ0aWVzIGlu
IHRoZSBrZXlmcmFtZSBhbmltYXRpb24KKyAgICBIYXNoU2V0PGludD46OmNvbnN0X2l0ZXJhdG9y
IGVuZCA9IG1fa2V5ZnJhbWVzLT5lbmRQcm9wZXJ0aWVzKCk7CisgICAgZm9yIChIYXNoU2V0PGlu
dD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZXMtPmJlZ2luUHJvcGVydGllcygpOyBp
dCAhPSBlbmQ7ICsraXQpCisgICAgICAgIGNvbXBvc2l0ZUFuaW1hdGlvbigpLT5vdmVycmlkZUlt
cGxpY2l0QW5pbWF0aW9ucygqaXQpOworfQorCit2b2lkIEtleWZyYW1lQW5pbWF0aW9uOjpyZXN1
bWVPdmVycmlkZGVuQW5pbWF0aW9ucygpCit7CisgICAgLy8gVGhpcyB3aWxsIHJlc3VtZSBvdmVy
cmlkZGVuIGltcGxpY2l0IGFuaW1hdGlvbnMKKyAgICBIYXNoU2V0PGludD46OmNvbnN0X2l0ZXJh
dG9yIGVuZCA9IG1fa2V5ZnJhbWVzLT5lbmRQcm9wZXJ0aWVzKCk7CisgICAgZm9yIChIYXNoU2V0
PGludD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZXMtPmJlZ2luUHJvcGVydGllcygp
OyBpdCAhPSBlbmQ7ICsraXQpCisgICAgICAgIGNvbXBvc2l0ZUFuaW1hdGlvbigpLT5yZXN1bWVP
dmVycmlkZGVuSW1wbGljaXRBbmltYXRpb25zKCppdCk7Cit9CisKK2Jvb2wgS2V5ZnJhbWVBbmlt
YXRpb246OmFmZmVjdHNQcm9wZXJ0eShpbnQgcHJvcGVydHkpIGNvbnN0Cit7CisgICAgSGFzaFNl
dDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX2tleWZyYW1lcy0+ZW5kUHJvcGVydGllcygp
OworICAgIGZvciAoSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVz
LT5iZWdpblByb3BlcnRpZXMoKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIGlmICgoKml0
KSA9PSBwcm9wZXJ0eSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKK0FuaW1hdGlvbkNvbnRyb2xsZXI6OkFuaW1hdGlvbkNvbnRyb2xsZXIo
RnJhbWUqIGZyYW1lKQorOiBtX2RhdGEobmV3IEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlKGZy
YW1lKSkKK3sKKyAgICAKK30KKworQW5pbWF0aW9uQ29udHJvbGxlcjo6fkFuaW1hdGlvbkNvbnRy
b2xsZXIoKQoreworICAgIGRlbGV0ZSBtX2RhdGE7Cit9CisKK3ZvaWQgQW5pbWF0aW9uQ29udHJv
bGxlcjo6Y2FuY2VsQW5pbWF0aW9ucyhSZW5kZXJPYmplY3QqIHJlbmRlcmVyKQoreworICAgIGlm
ICghbV9kYXRhLT5oYXNBbmltYXRpb25zKCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBp
ZiAobV9kYXRhLT5jbGVhcihyZW5kZXJlcikpCisgICAgICAgIHNldENoYW5nZWQocmVuZGVyZXIt
PmVsZW1lbnQoKSk7Cit9CisKK1JlbmRlclN0eWxlKiBBbmltYXRpb25Db250cm9sbGVyOjp1cGRh
dGVBbmltYXRpb25zKFJlbmRlck9iamVjdCogcmVuZGVyZXIsIFJlbmRlclN0eWxlKiBuZXdTdHls
ZSkKK3sgICAgCisgICAgLy8gZG9uJ3QgZG8gYW55dGhpbmcgaWYgd2UncmUgaW4gdGhlIGNhY2hl
CisgICAgaWYgKCFyZW5kZXJlci0+ZG9jdW1lbnQoKSB8fCByZW5kZXJlci0+ZG9jdW1lbnQoKS0+
aW5QYWdlQ2FjaGUoKSkKKyAgICAgICAgcmV0dXJuIG5ld1N0eWxlOworICAgIAorICAgIFJlbmRl
clN0eWxlKiBvbGRTdHlsZSA9IHJlbmRlcmVyLT5zdHlsZSgpOworICAgIAorICAgIGlmICgoIW9s
ZFN0eWxlIHx8ICghb2xkU3R5bGUtPmFuaW1hdGlvbnMoKSAmJiAhb2xkU3R5bGUtPnRyYW5zaXRp
b25zKCkpKSAmJiAKKyAgICAgICAgICAgICAgICAgICAgICAgICghbmV3U3R5bGUtPmFuaW1hdGlv
bnMoKSAmJiAhbmV3U3R5bGUtPnRyYW5zaXRpb25zKCkpKQorICAgICAgICByZXR1cm4gbmV3U3R5
bGU7CisgICAgCisgICAgUmVuZGVyU3R5bGUqIGJsZW5kZWRTdHlsZSA9IG5ld1N0eWxlOworICAg
IAorICAgIC8vIEZldGNoIG91ciBjdXJyZW50IHNldCBvZiBpbXBsaWNpdCBhbmltYXRpb25zIGZy
b20gYSBoYXNodGFibGUuICBXZSB0aGVuIGNvbXBhcmUgdGhlbQorICAgIC8vIGFnYWluc3QgdGhl
IGFuaW1hdGlvbnMgaW4gdGhlIHN0eWxlIGFuZCBtYWtlIHN1cmUgd2UncmUgaW4gc3luYy4gIElm
IGRlc3RpbmF0aW9uIHZhbHVlcworICAgIC8vIGhhdmUgY2hhbmdlZCwgd2UgcmVzZXQgdGhlIGFu
aW1hdGlvbi4gIFdlIHRoZW4gZG8gYSBibGVuZCB0byBnZXQgbmV3IHZhbHVlcyBhbmQgd2UgcmV0
dXJuCisgICAgLy8gYSBuZXcgc3R5bGUuCisgICAgQVNTRVJUKHJlbmRlcmVyLT5lbGVtZW50KCkp
OyAvLyBGSVhNRTogV2UgZG8gbm90IGFuaW1hdGUgZ2VuZXJhdGVkIGNvbnRlbnQgeWV0LgorICAg
IAorICAgIENvbXBvc2l0ZUFuaW1hdGlvbiogcmVuZGVyZXJBbmltYXRpb25zID0gbV9kYXRhLT5h
Y2Nlc3NDb21wb3NpdGVBbmltYXRpb24ocmVuZGVyZXIpOworICAgIGJsZW5kZWRTdHlsZSA9IHJl
bmRlcmVyQW5pbWF0aW9ucy0+YW5pbWF0ZShyZW5kZXJlciwgb2xkU3R5bGUsIG5ld1N0eWxlKTsK
KyAgICAKKyAgICBtX2RhdGEtPnVwZGF0ZUFuaW1hdGlvblRpbWVyKCk7CisgICAgCisgICAgaWYg
KGJsZW5kZWRTdHlsZSAhPSBuZXdTdHlsZSkgeworICAgICAgICAvLyBJZiB0aGUgYW5pbWF0aW9u
cy90cmFuc2l0aW9ucyBjaGFuZ2Ugb3BhY2l0eSBvciB0cmFuc2Zvcm0sIHdlIG5lZWVkIHRvIHVw
ZGF0ZQorICAgICAgICAvLyB0aGUgc3R5bGUgdG8gaW1wb3NlIHRoZSBzdGFja2luZyBydWxlcy4g
Tm90ZSB0aGF0IHRoaXMgaXMgYWxzbworICAgICAgICAvLyBkb25lIGluIENTU1N0eWxlU2VsZWN0
b3I6OmFkanVzdFJlbmRlclN0eWxlKCkuCisgICAgICAgIGlmIChibGVuZGVkU3R5bGUtPmhhc0F1
dG9aSW5kZXgoKSAmJiAoYmxlbmRlZFN0eWxlLT5vcGFjaXR5KCkgPCAxLjBmIHx8IGJsZW5kZWRT
dHlsZS0+aGFzVHJhbnNmb3JtKCkpKQorICAgICAgICAgICAgYmxlbmRlZFN0eWxlLT5zZXRaSW5k
ZXgoMCk7CisgICAgfQorICAgIHJldHVybiBibGVuZGVkU3R5bGU7Cit9CisKK3ZvaWQgQW5pbWF0
aW9uQ29udHJvbGxlcjo6c2V0QW5pbWF0aW9uU3RhcnRUaW1lKFJlbmRlck9iamVjdCogb2JqLCBk
b3VibGUgdCkKK3sKKyAgICBDb21wb3NpdGVBbmltYXRpb24qIHJlbmRlcmVyQW5pbWF0aW9ucyA9
IG1fZGF0YS0+YWNjZXNzQ29tcG9zaXRlQW5pbWF0aW9uKG9iaik7CisgICAgcmVuZGVyZXJBbmlt
YXRpb25zLT5zZXRBbmltYXRpb25TdGFydFRpbWUodCk7Cit9CisKK3ZvaWQgQW5pbWF0aW9uQ29u
dHJvbGxlcjo6c2V0VHJhbnNpdGlvblN0YXJ0VGltZShSZW5kZXJPYmplY3QqIG9iaiwgaW50IHBy
b3BlcnR5LCBkb3VibGUgdCkKK3sKKyAgICBDb21wb3NpdGVBbmltYXRpb24qIHJlbmRlcmVyQW5p
bWF0aW9ucyA9IG1fZGF0YS0+YWNjZXNzQ29tcG9zaXRlQW5pbWF0aW9uKG9iaik7CisgICAgcmVu
ZGVyZXJBbmltYXRpb25zLT5zZXRUcmFuc2l0aW9uU3RhcnRUaW1lKHByb3BlcnR5LCB0KTsKK30K
KworYm9vbCBBbmltYXRpb25Db250cm9sbGVyOjppc0FuaW1hdGluZ1Byb3BlcnR5T25SZW5kZXJl
cihSZW5kZXJPYmplY3QqIG9iaiwgaW50IHByb3BlcnR5LCBib29sIGlzUnVubmluZ05vdykgY29u
c3QKK3sKKyAgICByZXR1cm4gbV9kYXRhLT5pc0FuaW1hdGluZ1Byb3BlcnR5T25SZW5kZXJlcihv
YmosIHByb3BlcnR5LCBpc1J1bm5pbmdOb3cpOworfQorCit2b2lkIEFuaW1hdGlvbkNvbnRyb2xs
ZXI6OnN1c3BlbmRBbmltYXRpb25zKERvY3VtZW50KiBkb2N1bWVudCkKK3sKKyAgICBtX2RhdGEt
PnN1c3BlbmRBbmltYXRpb25zKGRvY3VtZW50KTsKK30KKwordm9pZCBBbmltYXRpb25Db250cm9s
bGVyOjpyZXN1bWVBbmltYXRpb25zKERvY3VtZW50KiBkb2N1bWVudCkKK3sKKyAgICBtX2RhdGEt
PnJlc3VtZUFuaW1hdGlvbnMoZG9jdW1lbnQpOworfQorCit2b2lkIEFuaW1hdGlvbkNvbnRyb2xs
ZXI6OnN0YXJ0VXBkYXRlUmVuZGVyaW5nRGlzcGF0Y2hlcigpCit7CisgICAgbV9kYXRhLT5zdGFy
dFVwZGF0ZVJlbmRlcmluZ0Rpc3BhdGNoZXIoKTsKK30KKwordm9pZCBBbmltYXRpb25Db250cm9s
bGVyOjpzdHlsZUF2YWlsYWJsZSgpCit7CisgICAgbV9kYXRhLT5zdHlsZUF2YWlsYWJsZSgpOwor
fQorCit2b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6c2V0V2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxl
KGJvb2wgd2FpdGluZykKK3sKKyAgICBpZiAod2FpdGluZykKKyAgICAgICAgbV9udW1TdHlsZUF2
YWlsYWJsZVdhaXRlcnMrKzsKKyAgICBlbHNlCisgICAgICAgIG1fbnVtU3R5bGVBdmFpbGFibGVX
YWl0ZXJzLS07CisgICAgbV9hbmltYXRpb25Db250cm9sbGVyLT5zZXRXYWl0aW5nRm9yU3R5bGVB
dmFpbGFibGUod2FpdGluZyk7Cit9CisgICAgCit9CkluZGV4OiBXZWJDb3JlL3BhZ2UvYW5pbWF0
aW9uL0FuaW1hdGlvbkNvbnRyb2xsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGFnZS9h
bmltYXRpb24vQW5pbWF0aW9uQ29udHJvbGxlci5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3Jl
L3BhZ2UvYW5pbWF0aW9uL0FuaW1hdGlvbkNvbnRyb2xsZXIuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0yOCwxMDQ1ICsyOCwxNSBAQAogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiQW5p
bWF0aW9uQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkNvbXBvc2l0ZUFuaW1hdGlvbi5oIgogCi0j
aW5jbHVkZSAiQ1NTUHJvcGVydHlOYW1lcy5oIgotI2luY2x1ZGUgIkNTdHJpbmcuaCIKLSNpbmNs
dWRlICJEb2N1bWVudC5oIgotI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIKLSNpbmNsdWRlICJGbG9h
dENvbnZlcnNpb24uaCIKICNpbmNsdWRlICJGcmFtZS5oIgotI2luY2x1ZGUgIlJlbmRlck9iamVj
dC5oIgotI2luY2x1ZGUgIlJlbmRlclN0eWxlLmgiCi0jaW5jbHVkZSAiU3lzdGVtVGltZS5oIgog
I2luY2x1ZGUgIlRpbWVyLmgiCi0jaW5jbHVkZSAiVW5pdEJlemllci5oIgogCiBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAKIHN0YXRpYyBjb25zdCBkb3VibGUgY0FuaW1hdGlvblRpbWVyRGVsYXkgPSAw
LjAyNTsKIAotc3RhdGljIHZvaWQgc2V0Q2hhbmdlZChOb2RlKiBub2RlKQotewotICAgIEFTU0VS
VCghbm9kZSB8fCAobm9kZS0+ZG9jdW1lbnQoKSAmJiAhbm9kZS0+ZG9jdW1lbnQoKS0+aW5QYWdl
Q2FjaGUoKSkpOwotICAgIG5vZGUtPnNldENoYW5nZWQoQW5pbWF0aW9uU3R5bGVDaGFuZ2UpOwot
fQotCi0vLyBUaGUgZXBzaWxvbiB2YWx1ZSB3ZSBwYXNzIHRvIFVuaXRCZXppZXI6OnNvbHZlIGdp
dmVuIHRoYXQgdGhlIGFuaW1hdGlvbiBpcyBnb2luZyB0byBydW4gb3ZlciB8ZHVyfCBzZWNvbmRz
LiBUaGUgbG9uZ2VyIHRoZQotLy8gYW5pbWF0aW9uLCB0aGUgbW9yZSBwcmVjaXNpb24gd2UgbmVl
ZCBpbiB0aGUgdGltaW5nIGZ1bmN0aW9uIHJlc3VsdCB0byBhdm9pZCB1Z2x5IGRpc2NvbnRpbnVp
dGllcy4KLXN0YXRpYyBpbmxpbmUgZG91YmxlIHNvbHZlRXBzaWxvbihkb3VibGUgZHVyYXRpb24p
IHsgcmV0dXJuIDEuIC8gKDIwMC4gKiBkdXJhdGlvbik7IH0KLQotc3RhdGljIGlubGluZSBkb3Vi
bGUgc29sdmVDdWJpY0JlemllckZ1bmN0aW9uKGRvdWJsZSBwMXgsIGRvdWJsZSBwMXksIGRvdWJs
ZSBwMngsIGRvdWJsZSBwMnksIGRvdWJsZSB0LCBkb3VibGUgZHVyYXRpb24pCi17Ci0gICAgLy8g
Q29udmVydCBmcm9tIGlucHV0IHRpbWUgdG8gcGFyYW1ldHJpYyB2YWx1ZSBpbiBjdXJ2ZSwgdGhl
biBmcm9tCi0gICAgLy8gdGhhdCB0byBvdXRwdXQgdGltZS4KLSAgICBVbml0QmV6aWVyIGJlemll
cihwMXgsIHAxeSwgcDJ4LCBwMnkpOwotICAgIHJldHVybiBiZXppZXIuc29sdmUodCwgc29sdmVF
cHNpbG9uKGR1cmF0aW9uKSk7Ci19Ci0KLWNsYXNzIENvbXBvc2l0ZUFuaW1hdGlvbjsKLWNsYXNz
IEFuaW1hdGlvbkJhc2U7Ci0KLWNsYXNzIEFuaW1hdGlvblRpbWVyQmFzZSB7Ci1wdWJsaWM6Ci0g
ICAgQW5pbWF0aW9uVGltZXJCYXNlKEFuaW1hdGlvbkJhc2UqIGFuaW0pCi0gICAgOiBtX3RpbWVy
KHRoaXMsICZBbmltYXRpb25UaW1lckJhc2U6OnRpbWVyRmlyZWQpCi0gICAgLCBtX2FuaW0oYW5p
bSkKLSAgICB7Ci0gICAgICAgIG1fdGltZXIuc3RhcnRPbmVTaG90KDApOwotICAgIH0KLSAgICB2
aXJ0dWFsIH5BbmltYXRpb25UaW1lckJhc2UoKQotICAgIHsKLSAgICB9Ci0gICAgCi0gICAgdm9p
ZCBzdGFydFRpbWVyKGRvdWJsZSB0aW1lb3V0PTApCi0gICAgewotICAgICAgICBtX3RpbWVyLnN0
YXJ0T25lU2hvdCh0aW1lb3V0KTsKLSAgICB9Ci0gICAgCi0gICAgdm9pZCBjYW5jZWxUaW1lcigp
Ci0gICAgewotICAgICAgICBtX3RpbWVyLnN0b3AoKTsKLSAgICB9Ci0gICAgCi0gICAgdmlydHVh
bCB2b2lkIHRpbWVyRmlyZWQoVGltZXI8QW5pbWF0aW9uVGltZXJCYXNlPiopID0gMDsKLSAgICAK
LXByaXZhdGU6Ci0gICAgVGltZXI8QW5pbWF0aW9uVGltZXJCYXNlPiBtX3RpbWVyOwotICAgIAot
cHJvdGVjdGVkOgotICAgIEFuaW1hdGlvbkJhc2UqIG1fYW5pbTsKLX07Ci0KLWNsYXNzIEFuaW1h
dGlvbkV2ZW50RGlzcGF0Y2hlciA6IHB1YmxpYyBBbmltYXRpb25UaW1lckJhc2UgewotcHVibGlj
OgotICAgIEFuaW1hdGlvbkV2ZW50RGlzcGF0Y2hlcihBbmltYXRpb25CYXNlKiBhbmltKSAKLSAg
ICA6IEFuaW1hdGlvblRpbWVyQmFzZShhbmltKQotICAgICwgbV9wcm9wZXJ0eShDU1NQcm9wZXJ0
eUludmFsaWQpCi0gICAgLCBtX3Jlc2V0KGZhbHNlKQotICAgICwgbV9lbGFwc2VkVGltZSgtMSkK
LSAgICB7Ci0gICAgfQotICAgIAotICAgIHZpcnR1YWwgfkFuaW1hdGlvbkV2ZW50RGlzcGF0Y2hl
cigpCi0gICAgewotICAgIH0KLSAgICAKLSAgICB2b2lkIHN0YXJ0VGltZXIoRWxlbWVudCogZWxl
bWVudCwgY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lLCBpbnQgcHJvcGVydHksIGJvb2wgcmVzZXQs
Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0b21pY1N0cmluZyYgZXZlbnRUeXBlLCBkb3Vi
bGUgZWxhcHNlZFRpbWUpCi0gICAgewotICAgICAgICBtX2VsZW1lbnQgPSBlbGVtZW50OwotICAg
ICAgICBtX25hbWUgPSBuYW1lOwotICAgICAgICBtX3Byb3BlcnR5ID0gcHJvcGVydHk7Ci0gICAg
ICAgIG1fcmVzZXQgPSByZXNldDsKLSAgICAgICAgbV9ldmVudFR5cGUgPSBldmVudFR5cGU7Ci0g
ICAgICAgIG1fZWxhcHNlZFRpbWUgPSBlbGFwc2VkVGltZTsKLSAgICAgICAgQW5pbWF0aW9uVGlt
ZXJCYXNlOjpzdGFydFRpbWVyKCk7Ci0gICAgfQotICAgIAotICAgIHZpcnR1YWwgdm9pZCB0aW1l
ckZpcmVkKFRpbWVyPEFuaW1hdGlvblRpbWVyQmFzZT4qKTsKLSAgICAKLXByaXZhdGU6Ci0gICAg
UmVmUHRyPEVsZW1lbnQ+IG1fZWxlbWVudDsKLSAgICBBdG9taWNTdHJpbmcgbV9uYW1lOwotICAg
IGludCBtX3Byb3BlcnR5OwotICAgIGJvb2wgbV9yZXNldDsKLSAgICBBdG9taWNTdHJpbmcgbV9l
dmVudFR5cGU7Ci0gICAgZG91YmxlIG1fZWxhcHNlZFRpbWU7Ci19OwotCi1jbGFzcyBBbmltYXRp
b25UaW1lckNhbGxiYWNrIDogcHVibGljIEFuaW1hdGlvblRpbWVyQmFzZSB7Ci1wdWJsaWM6Ci0g
ICAgQW5pbWF0aW9uVGltZXJDYWxsYmFjayhBbmltYXRpb25CYXNlKiBhbmltKSAKLSAgICA6IEFu
aW1hdGlvblRpbWVyQmFzZShhbmltKQotICAgICwgbV9lbGFwc2VkVGltZSgwKQotICAgIHsgfQot
ICAgIHZpcnR1YWwgfkFuaW1hdGlvblRpbWVyQ2FsbGJhY2soKSB7IH0KLSAgICAKLSAgICB2aXJ0
dWFsIHZvaWQgdGltZXJGaXJlZChUaW1lcjxBbmltYXRpb25UaW1lckJhc2U+Kik7Ci0gICAgCi0g
ICAgdm9pZCBzdGFydFRpbWVyKGRvdWJsZSB0aW1lb3V0LCBjb25zdCBBdG9taWNTdHJpbmcmIGV2
ZW50VHlwZSwgZG91YmxlIGVsYXBzZWRUaW1lKQotICAgIHsKLSAgICAgICAgbV9ldmVudFR5cGUg
PSBldmVudFR5cGU7Ci0gICAgICAgIG1fZWxhcHNlZFRpbWUgPSBlbGFwc2VkVGltZTsKLSAgICAg
ICAgQW5pbWF0aW9uVGltZXJCYXNlOjpzdGFydFRpbWVyKHRpbWVvdXQpOwotICAgIH0KLSAgICAK
LXByaXZhdGU6Ci0gICAgQXRvbWljU3RyaW5nIG1fZXZlbnRUeXBlOwotICAgIGRvdWJsZSBtX2Vs
YXBzZWRUaW1lOwotfTsKLQotY2xhc3MgSW1wbGljaXRBbmltYXRpb247Ci1jbGFzcyBLZXlmcmFt
ZUFuaW1hdGlvbjsKLWNsYXNzIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOwotCi0vLyBBIENv
bXBvc2l0ZUFuaW1hdGlvbiByZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBhbmltYXRpb25zIHRo
YXQgYXJlIHJ1bm5pbmcKLS8vIG9uIGEgc2luZ2xlIFJlbmRlck9iamVjdCwgc3VjaCBhcyBhIG51
bWJlciBvZiBwcm9wZXJ0aWVzIHRyYW5zaXRpb25pbmcgYXQgb25jZS4KLWNsYXNzIENvbXBvc2l0
ZUFuaW1hdGlvbiA6IHB1YmxpYyBOb25jb3B5YWJsZSB7Ci1wdWJsaWM6Ci0gICAgQ29tcG9zaXRl
QW5pbWF0aW9uKEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlKiBhbmltYXRpb25Db250cm9sbGVy
KQotICAgIDogbV9zdXNwZW5kZWQoZmFsc2UpCi0gICAgLCBtX2FuaW1hdGlvbkNvbnRyb2xsZXIo
YW5pbWF0aW9uQ29udHJvbGxlcikKLSAgICAsIG1fbnVtU3R5bGVBdmFpbGFibGVXYWl0ZXJzKDAp
Ci0gICAgeyB9Ci0gICAgCi0gICAgfkNvbXBvc2l0ZUFuaW1hdGlvbigpCi0gICAgewotICAgICAg
ICBkZWxldGVBbGxWYWx1ZXMobV90cmFuc2l0aW9ucyk7Ci0gICAgICAgIGRlbGV0ZUFsbFZhbHVl
cyhtX2tleWZyYW1lQW5pbWF0aW9ucyk7Ci0gICAgfQotICAgIAotICAgIFJlbmRlclN0eWxlKiBh
bmltYXRlKFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUsIFJl
bmRlclN0eWxlKiB0YXJnZXRTdHlsZSk7Ci0gICAgCi0gICAgdm9pZCBzZXRBbmltYXRpbmcoYm9v
bCBpbkFuaW1hdGluZyk7Ci0gICAgYm9vbCBhbmltYXRpbmcoKTsKLSAgICAKLSAgICBib29sIGhh
c0FuaW1hdGlvbkZvclByb3BlcnR5KGludCBwcm9wKSBjb25zdCB7IHJldHVybiBtX3RyYW5zaXRp
b25zLmNvbnRhaW5zKHByb3ApOyB9Ci0gICAgCi0gICAgdm9pZCByZXNldFRyYW5zaXRpb25zKFJl
bmRlck9iamVjdCopOwotICAgIHZvaWQgcmVzZXRBbmltYXRpb25zKFJlbmRlck9iamVjdCopOwot
ICAgIAotICAgIHZvaWQgY2xlYW51cEZpbmlzaGVkQW5pbWF0aW9ucyhSZW5kZXJPYmplY3QqKTsK
LQotICAgIHZvaWQgc2V0QW5pbWF0aW9uU3RhcnRUaW1lKGRvdWJsZSB0KTsKLSAgICB2b2lkIHNl
dFRyYW5zaXRpb25TdGFydFRpbWUoaW50IHByb3BlcnR5LCBkb3VibGUgdCk7Ci0gICAgCi0gICAg
dm9pZCBzdXNwZW5kQW5pbWF0aW9ucygpOwotICAgIHZvaWQgcmVzdW1lQW5pbWF0aW9ucygpOwot
ICAgIGJvb2wgc3VzcGVuZGVkKCkgY29uc3QgeyByZXR1cm4gbV9zdXNwZW5kZWQ7IH0KLSAgICAK
LSAgICB2b2lkIG92ZXJyaWRlSW1wbGljaXRBbmltYXRpb25zKGludCBwcm9wZXJ0eSk7Ci0gICAg
dm9pZCByZXN1bWVPdmVycmlkZGVuSW1wbGljaXRBbmltYXRpb25zKGludCBwcm9wZXJ0eSk7Ci0g
ICAgCi0gICAgdm9pZCBzdHlsZUF2YWlsYWJsZSgpOwotICAgIAotICAgIGJvb2wgaXNBbmltYXRp
bmdQcm9wZXJ0eShpbnQgcHJvcGVydHksIGJvb2wgaXNSdW5uaW5nTm93KSBjb25zdDsKLSAgICAK
LSAgICB2b2lkIHNldFdhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZShib29sIHdhaXRpbmcpOwotCi1w
cm90ZWN0ZWQ6Ci0gICAgdm9pZCB1cGRhdGVUcmFuc2l0aW9ucyhSZW5kZXJPYmplY3QqIHJlbmRl
cmVyLCBjb25zdCBSZW5kZXJTdHlsZSogY3VycmVudFN0eWxlLCBSZW5kZXJTdHlsZSogdGFyZ2V0
U3R5bGUpOwotICAgIHZvaWQgdXBkYXRlS2V5ZnJhbWVBbmltYXRpb25zKFJlbmRlck9iamVjdCog
cmVuZGVyZXIsIGNvbnN0IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUsIFJlbmRlclN0eWxlKiB0
YXJnZXRTdHlsZSk7Ci0KLSAgICBLZXlmcmFtZUFuaW1hdGlvbiogZmluZEtleWZyYW1lQW5pbWF0
aW9uKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSk7Ci0gICAgCi1wcml2YXRlOgotICAgIHR5cGVk
ZWYgSGFzaE1hcDxpbnQsIEltcGxpY2l0QW5pbWF0aW9uKj4gQ1NTUHJvcGVydHlUcmFuc2l0aW9u
c01hcDsKLSAgICB0eXBlZGVmIEhhc2hNYXA8QXRvbWljU3RyaW5nSW1wbCosIEtleWZyYW1lQW5p
bWF0aW9uKj4gIEFuaW1hdGlvbk5hbWVNYXA7Ci0gICAgCi0gICAgQ1NTUHJvcGVydHlUcmFuc2l0
aW9uc01hcCAgIG1fdHJhbnNpdGlvbnM7Ci0gICAgQW5pbWF0aW9uTmFtZU1hcCAgICAgICAgICAg
IG1fa2V5ZnJhbWVBbmltYXRpb25zOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBt
X3N1c3BlbmRlZDsKLSAgICBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZSogbV9hbmltYXRpb25D
b250cm9sbGVyOwotICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtX251bVN0eWxlQXZh
aWxhYmxlV2FpdGVyczsKLX07Ci0KLWNsYXNzIEFuaW1hdGlvbkJhc2UgOiBwdWJsaWMgTm9uY29w
eWFibGUgewotcHVibGljOgotICAgIEFuaW1hdGlvbkJhc2UoY29uc3QgQW5pbWF0aW9uKiB0cmFu
c2l0aW9uLCBSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBDb21wb3NpdGVBbmltYXRpb24qIGNvbXBB
bmltKTsKLSAgICB2aXJ0dWFsIH5BbmltYXRpb25CYXNlKCkKLSAgICB7Ci0gICAgICAgIGlmICht
X2FuaW1TdGF0ZSA9PSBTVEFURV9TVEFSVF9XQUlUX1NUWUxFX0FWQUlMQUJMRSkKLSAgICAgICAg
ICAgIG1fY29tcEFuaW0tPnNldFdhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZShmYWxzZSk7Ci0gICAg
fQotICAgIAotICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIoKSBjb25zdCB7IHJldHVybiBtX29i
amVjdDsgfQotICAgIGRvdWJsZSBzdGFydFRpbWUoKSBjb25zdCB7IHJldHVybiBtX3N0YXJ0VGlt
ZTsgfQotICAgIGRvdWJsZSBkdXJhdGlvbigpIGNvbnN0ICB7IHJldHVybiBtX2FuaW1hdGlvbi0+
ZHVyYXRpb24oKTsgfQotICAgIAotICAgIHZvaWQgY2FuY2VsVGltZXJzKCkKLSAgICB7Ci0gICAg
ICAgIG1fYW5pbWF0aW9uVGltZXJDYWxsYmFjay5jYW5jZWxUaW1lcigpOwotICAgICAgICBtX2Fu
aW1hdGlvbkV2ZW50RGlzcGF0Y2hlci5jYW5jZWxUaW1lcigpOwotICAgIH0KLSAgICAKLSAgICAv
LyBBbmltYXRpb25zIGFuZCBUcmFuc2l0aW9ucyBnbyB0aHJvdWdoIHRoZSBzdGF0ZXMgYmVsb3cu
IFdoZW4gZW50ZXJpbmcgdGhlIFNUQVJURUQgc3RhdGUKLSAgICAvLyB0aGUgYW5pbWF0aW9uIGlz
IHN0YXJ0ZWQuIFRoaXMgbWF5IG9yIG1heSBub3QgcmVxdWlyZSBkZWZlcnJlZCByZXNwb25zZSBm
cm9tIHRoZSBhbmltYXRvci4KLSAgICAvLyBJZiBzbywgd2Ugc3RheSBpbiB0aGlzIHN0YXRlIHVu
dGlsIHRoYXQgcmVzcG9uc2UgaXMgcmVjZWl2ZWQgKGFuZCBpdCByZXR1cm5zIHRoZSBzdGFydCB0
aW1lKS4KLSAgICAvLyBPdGhlcndpc2UsIHdlIHVzZSB0aGUgY3VycmVudCB0aW1lIGFzIHRoZSBz
dGFydCB0aW1lIGFuZCBnbyBpbW1lZGlhdGVseSB0byB0aGUgTE9PUElORyBvcgotICAgIC8vIEVO
RElORyBzdGF0ZS4KLSAgICBlbnVtIEFuaW1TdGF0ZSB7IAotICAgICAgICBTVEFURV9ORVcsICAg
ICAgICAgICAgICAgICAgICAgIC8vIGFuaW1hdGlvbiBqdXN0IGNyZWF0ZWQsIGFuaW1hdGlvbiBu
b3QgcnVubmluZyB5ZXQKLSAgICAgICAgU1RBVEVfU1RBUlRfV0FJVF9USU1FUiwgICAgICAgICAv
LyBzdGFydCB0aW1lciBydW5uaW5nLCB3YWl0aW5nIGZvciBmaXJlCi0gICAgICAgIFNUQVRFX1NU
QVJUX1dBSVRfU1RZTEVfQVZBSUxBQkxFLCAgIC8vIHdhaXRpbmcgZm9yIHN0eWxlIHNldHVwIHNv
IHdlIGNhbiBzdGFydCBhbmltYXRpb25zCi0gICAgICAgIFNUQVRFX1NUQVJUX1dBSVRfUkVTUE9O
U0UsICAgICAgLy8gYW5pbWF0aW9uIHN0YXJ0ZWQsIHdhaXRpbmcgZm9yIHJlc3BvbnNlCi0gICAg
ICAgIFNUQVRFX0xPT1BJTkcsICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgcmVjZWl2ZWQs
IGFuaW1hdGlvbiBydW5uaW5nLCBsb29wIHRpbWVyIHJ1bm5pbmcsIHdhaXRpbmcgZm9yIGZpcmUK
LSAgICAgICAgU1RBVEVfRU5ESU5HLCAgICAgICAgICAgICAgICAgICAvLyByZXNwb25zZSByZWNl
aXZlZCwgYW5pbWF0aW9uIHJ1bm5pbmcsIGVuZCB0aW1lciBydW5uaW5nLCB3YWl0aW5nIGZvciBm
aXJlCi0gICAgICAgIFNUQVRFX1BBVVNFRF9XQUlUX1RJTUVSLCAgICAgICAgLy8gYW5pbWF0aW9u
IGluIHBhdXNlIG1vZGUgd2hlbiBhbmltYXRpb24gc3RhcnRlZAotICAgICAgICBTVEFURV9QQVVT
RURfV0FJVF9SRVNQT05TRSwgICAgIC8vIGFuaW1hdGlvbiBwYXVzZWQgd2hlbiBpbiBTVEFSVElO
RyBzdGF0ZQotICAgICAgICBTVEFURV9QQVVTRURfUlVOLCAgICAgICAgICAgICAgIC8vIGFuaW1h
dGlvbiBwYXVzZWQgd2hlbiBpbiBMT09QSU5HIG9yIEVORElORyBzdGF0ZQotICAgICAgICBTVEFU
RV9ET05FICAgICAgICAgICAgICAgICAgICAgIC8vIGVuZCB0aW1lciBmaXJlZCwgYW5pbWF0aW9u
IGZpbmlzaGVkIGFuZCByZW1vdmVkCi0gICAgfTsKLSAgICAKLSAgICBlbnVtIEFuaW1TdGF0ZUlu
cHV0IHsKLSAgICAgICAgU1RBVEVfSU5QVVRfTUFLRV9ORVcsICAgICAgICAgICAvLyByZXNldCBi
YWNrIHRvIG5ldyBmcm9tIGFueSBzdGF0ZQotICAgICAgICBTVEFURV9JTlBVVF9TVEFSVF9BTklN
QVRJT04sICAgIC8vIGFuaW1hdGlvbiByZXF1ZXN0cyBhIHN0YXJ0Ci0gICAgICAgIFNUQVRFX0lO
UFVUX1JFU1RBUlRfQU5JTUFUSU9OLCAgLy8gZm9yY2UgYSByZXN0YXJ0IGZyb20gYW55IHN0YXRl
Ci0gICAgICAgIFNUQVRFX0lOUFVUX1NUQVJUX1RJTUVSX0ZJUkVELCAgLy8gc3RhcnQgdGltZXIg
ZmlyZWQKLSAgICAgICAgU1RBVEVfSU5QVVRfU1RZTEVfQVZBSUxBQkxFLCAgICAgICAgLy8gc3R5
bGUgaXMgc2V0dXAsIHJlYWR5IHRvIHN0YXJ0IGFuaW1hdGluZwotICAgICAgICBTVEFURV9JTlBV
VF9TVEFSVF9USU1FX1NFVCwgICAgIC8vIG1fc3RhcnRUaW1lIHdhcyBzZXQKLSAgICAgICAgU1RB
VEVfSU5QVVRfTE9PUF9USU1FUl9GSVJFRCwgICAvLyBsb29wIHRpbWVyIGZpcmVkCi0gICAgICAg
IFNUQVRFX0lOUFVUX0VORF9USU1FUl9GSVJFRCwgICAgLy8gZW5kIHRpbWVyIGZpcmVkCi0gICAg
ICAgIFNUQVRFX0lOUFVUX1BBVVNFX09WRVJSSURFLCAgICAgLy8gcGF1c2UgYW4gYW5pbWF0aW9u
IGR1ZSB0byBvdmVycmlkZQotICAgICAgICBTVEFURV9JTlBVVF9SRVNVTUVfT1ZFUlJJREUsICAg
IC8vIHJlc3VtZSBhbiBvdmVycmlkZGVuIGFuaW1hdGlvbgotICAgICAgICBTVEFURV9JTlBVVF9Q
TEFZX1NUQVRFX1JVTk5JTkcsIC8vIHBsYXkgc3RhdGUgcGF1c2VkIC0+IHJ1bm5pbmcKLSAgICAg
ICAgU1RBVEVfSU5QVVRfUExBWV9TVEFURV9QQVVTRUQsICAvLyBwbGF5IHN0YXRlIHJ1bm5pbmcg
LT4gcGF1c2VkCi0gICAgICAgIFNUQVRFX0lOUFVUX0VORF9BTklNQVRJT04gICAgICAgLy8gZm9y
Y2UgYW4gZW5kIGZyb20gYW55IHN0YXRlCi0gICAgfTsKLSAgICAKLSAgICAvLyBDYWxsZWQgd2hl
biBhbmltYXRpb24gaXMgaW4gTkVXIHN0YXRlIHRvIHN0YXJ0IGFuaW1hdGlvbgotICAgIHZvaWQg
dXBkYXRlU3RhdGVNYWNoaW5lKEFuaW1TdGF0ZUlucHV0IGlucHV0LCBkb3VibGUgcGFyYW0pOwot
ICAgIAotICAgIC8vIEFuaW1hdGlvbiBoYXMgYWN0dWFsbHkgc3RhcnRlZCwgYXQgcGFzc2VkIHRp
bWUKLSAgICB2b2lkIG9uQW5pbWF0aW9uU3RhcnRSZXNwb25zZShkb3VibGUgc3RhcnRUaW1lKTsK
LSAgICAKLSAgICAvLyBDYWxsZWQgdG8gY2hhbmdlIHRvIG9yIGZyb20gcGF1c2VkIHN0YXRlCi0g
ICAgdm9pZCB1cGRhdGVQbGF5U3RhdGUoYm9vbCBydW5uaW5nKTsKLSAgICBib29sIHBsYXlTdGF0
ZVBsYXlpbmcoKSBjb25zdCB7IHJldHVybiBtX2FuaW1hdGlvbiAmJiBtX2FuaW1hdGlvbi0+cGxh
eVN0YXRlKCkgPT0gQW5pbVBsYXlTdGF0ZVBsYXlpbmc7IH0KLSAgICAKLSAgICBib29sIHdhaXRp
bmdUb1N0YXJ0KCkgY29uc3QgeyByZXR1cm4gbV9hbmltU3RhdGUgPT0gU1RBVEVfTkVXIHx8IG1f
YW5pbVN0YXRlID09IFNUQVRFX1NUQVJUX1dBSVRfVElNRVI7IH0KLSAgICBib29sIHByZWFjdGl2
ZSgpIGNvbnN0Ci0gICAgeyByZXR1cm4gbV9hbmltU3RhdGUgPT0gU1RBVEVfTkVXIHx8Ci0gICAg
ICAgICAgICAgbV9hbmltU3RhdGUgPT0gU1RBVEVfU1RBUlRfV0FJVF9USU1FUiB8fAotICAgICAg
ICAgICAgIG1fYW5pbVN0YXRlID09IFNUQVRFX1NUQVJUX1dBSVRfU1RZTEVfQVZBSUxBQkxFIHx8
Ci0gICAgICAgICAgICAgbV9hbmltU3RhdGUgPT0gU1RBVEVfU1RBUlRfV0FJVF9SRVNQT05TRTsK
LSAgICB9Ci0gICAgYm9vbCBwb3N0YWN0aXZlKCkgY29uc3QgeyByZXR1cm4gbV9hbmltU3RhdGUg
PT0gU1RBVEVfRE9ORTsgfQotICAgIGJvb2wgYWN0aXZlKCkgY29uc3QgeyByZXR1cm4gIXBvc3Rh
Y3RpdmUoKSAmJiAhcHJlYWN0aXZlKCk7IH0KLSAgICBib29sIHJ1bm5pbmcoKSBjb25zdCB7IHJl
dHVybiAhaXNuZXcoKSAmJiAhcG9zdGFjdGl2ZSgpOyB9Ci0gICAgYm9vbCBwYXVzZWQoKSBjb25z
dCB7IHJldHVybiBtX3BhdXNlVGltZSA+PSAwOyB9Ci0gICAgYm9vbCBpc25ldygpIGNvbnN0IHsg
cmV0dXJuIG1fYW5pbVN0YXRlID09IFNUQVRFX05FVzsgfQotICAgIGJvb2wgd2FpdGluZ0ZvclN0
YXJ0VGltZSgpIGNvbnN0IHsgcmV0dXJuIG1fYW5pbVN0YXRlID09IFNUQVRFX1NUQVJUX1dBSVRf
UkVTUE9OU0U7IH0KLSAgICBib29sIHdhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZSgpIGNvbnN0IHsg
cmV0dXJuIG1fYW5pbVN0YXRlID09IFNUQVRFX1NUQVJUX1dBSVRfU1RZTEVfQVZBSUxBQkxFOyB9
Ci0gICAgYm9vbCB3YWl0aW5nRm9yRW5kRXZlbnQoKSBjb25zdCAgeyByZXR1cm4gbV93YWl0aW5n
Rm9yRW5kRXZlbnQ7IH0KLSAgICAKLSAgICAvLyAiYW5pbWF0aW5nIiBtZWFucyB0aGF0IHNvbWV0
aGluZyBpcyBydW5uaW5nIHRoYXQgcmVxdWlyZXMgYSB0aW1lciB0byBrZWVwIGZpcmluZwotICAg
IC8vIChlLmcuIGEgc29mdHdhcmUgYW5pbWF0aW9uKQotICAgIHZvaWQgc2V0QW5pbWF0aW5nKGJv
b2wgaW5BbmltYXRpbmcgPSB0cnVlKSB7IG1fYW5pbWF0aW5nID0gaW5BbmltYXRpbmc7IH0KLSAg
ICBib29sIGFuaW1hdGluZygpIGNvbnN0IHsgcmV0dXJuIG1fYW5pbWF0aW5nOyB9Ci0gICAgCi0g
ICAgZG91YmxlIHByb2dyZXNzKGRvdWJsZSBzY2FsZSwgZG91YmxlIG9mZnNldCkgY29uc3Q7Ci0g
ICAgCi0gICAgdmlydHVhbCB2b2lkIGFuaW1hdGUoQ29tcG9zaXRlQW5pbWF0aW9uKiwgUmVuZGVy
T2JqZWN0KiwgY29uc3QgUmVuZGVyU3R5bGUqIGN1cnJlbnRTdHlsZSwgCi0gICAgICAgICAgICAg
ICAgICAgICAgICAgY29uc3QgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlLCBSZW5kZXJTdHlsZSom
IGFuaW1hdGVkU3R5bGUpIHsgfQotICAgIHZpcnR1YWwgdm9pZCByZXNldChSZW5kZXJPYmplY3Qq
IHJlbmRlcmVyLCBjb25zdCBSZW5kZXJTdHlsZSogZnJvbSA9IDAsIGNvbnN0IFJlbmRlclN0eWxl
KiB0byA9IDApIHsgfQotICAgIAotICAgIHZpcnR1YWwgYm9vbCBzaG91bGRGaXJlRXZlbnRzKCkg
Y29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLSAgICAKLSAgICB2b2lkIGFuaW1hdGlvblRpbWVyQ2Fs
bGJhY2tGaXJlZChjb25zdCBBdG9taWNTdHJpbmcmIGV2ZW50VHlwZSwgZG91YmxlIGVsYXBzZWRU
aW1lKTsKLSAgICB2b2lkIGFuaW1hdGlvbkV2ZW50RGlzcGF0Y2hlckZpcmVkKEVsZW1lbnQqIGVs
ZW1lbnQsIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSwgaW50IHByb3BlcnR5LCBib29sIHJlc2V0
LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXRvbWljU3Ry
aW5nJiBldmVudFR5cGUsIGRvdWJsZSBlbGFwc2VkVGltZSk7Ci0gICAgCi0gICAgYm9vbCBhbmlt
YXRpb25zTWF0Y2goY29uc3QgQW5pbWF0aW9uKiBhbmltKSBjb25zdCB7IHJldHVybiBtX2FuaW1h
dGlvbi0+YW5pbWF0aW9uc01hdGNoKGFuaW0pOyB9Ci0gICAgCi0gICAgdm9pZCBzZXRBbmltYXRp
b24oY29uc3QgQW5pbWF0aW9uKiBhbmltKSB7IG1fYW5pbWF0aW9uID0gY29uc3RfY2FzdDxBbmlt
YXRpb24qPihhbmltKTsgfQotICAgIAotICAgIC8vIFJldHVybiB0cnVlIGlmIHRoaXMgYW5pbWF0
aW9uIGlzIG92ZXJyaWRkZW4uIFRoaXMgd2lsbCBvbmx5IGJlIHRoZSBjYXNlIGZvcgotICAgIC8v
IEltcGxpY2l0QW5pbWF0aW9ucyBhbmQgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBvciBu
b3Qgd2Ugc2hvdWxkIGZvcmNlCi0gICAgLy8gc2V0IHRoZSBzdGFydCB0aW1lLiBJZiBhbiBhbmlt
YXRpb24gaXMgb3ZlcnJpZGRlbiwgaXQgd2lsbCBwcm9iYWJseSBub3QgZ2V0Ci0gICAgLy8gYmFj
ayB0aGUgU1RBUlRfVElNRSBldmVudC4KLSAgICB2aXJ0dWFsIGJvb2wgb3ZlcnJpZGRlbigpIGNv
bnN0IHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgCi0gICAgLy8gRG9lcyB0aGlzIGFuaW1hdGlvbi90
cmFuc2l0aW9uIGludm9sdmUgdGhlIGdpdmVuIHByb3BlcnR5PwotICAgIHZpcnR1YWwgYm9vbCBh
ZmZlY3RzUHJvcGVydHkoaW50IHByb3BlcnR5KSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotICAg
IGJvb2wgaXNBbmltYXRpbmdQcm9wZXJ0eShpbnQgcHJvcGVydHksIGJvb2wgaXNSdW5uaW5nTm93
KSBjb25zdAotICAgIHsKLSAgICAgICAgaWYgKGlzUnVubmluZ05vdykKLSAgICAgICAgICAgIHJl
dHVybiAoIXdhaXRpbmdUb1N0YXJ0KCkgJiYgIXBvc3RhY3RpdmUoKSkgJiYgYWZmZWN0c1Byb3Bl
cnR5KHByb3BlcnR5KTsKLQotICAgICAgICByZXR1cm4gIXBvc3RhY3RpdmUoKSAmJiBhZmZlY3Rz
UHJvcGVydHkocHJvcGVydHkpOwotICAgIH0KLSAgICAgICAgCi1wcm90ZWN0ZWQ6Ci0gICAgRWxl
bWVudCogZWxlbWVudEZvckV2ZW50RGlzcGF0Y2goKQotICAgIHsKLSAgICAgICAgaWYgKG1fb2Jq
ZWN0LT5ub2RlKCkgJiYgbV9vYmplY3QtPm5vZGUoKS0+aXNFbGVtZW50Tm9kZSgpKQotICAgICAg
ICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEVsZW1lbnQqPihtX29iamVjdC0+bm9kZSgpKTsKLSAg
ICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIHZpcnR1YWwgdm9pZCBvdmVycmlkZUFu
aW1hdGlvbnMoKSB7IH0KLSAgICB2aXJ0dWFsIHZvaWQgcmVzdW1lT3ZlcnJpZGRlbkFuaW1hdGlv
bnMoKSB7IH0KLSAgICAKLSAgICBDb21wb3NpdGVBbmltYXRpb24qIGNvbXBvc2l0ZUFuaW1hdGlv
bigpIHsgcmV0dXJuIG1fY29tcEFuaW07IH0KLSAgICAKLSAgICAvLyBUaGVzZSBhcmUgY2FsbGVk
IHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgdGltZXIgZmlyZXMgc28gc3ViY2xhc3NlcyBjYW4gZG8g
YW55IGV4dHJhIHdvcmsKLSAgICB2aXJ0dWFsIHZvaWQgb25BbmltYXRpb25TdGFydChkb3VibGUg
ZWxhcHNlZFRpbWUpIHsgfQotICAgIHZpcnR1YWwgdm9pZCBvbkFuaW1hdGlvbkl0ZXJhdGlvbihk
b3VibGUgZWxhcHNlZFRpbWUpIHsgfQotICAgIHZpcnR1YWwgdm9pZCBvbkFuaW1hdGlvbkVuZChk
b3VibGUgZWxhcHNlZFRpbWUpIHsgfQotICAgIHZpcnR1YWwgYm9vbCBzdGFydEFuaW1hdGlvbihk
b3VibGUgYmVnaW5UaW1lKSB7IHJldHVybiBmYWxzZTsgfQotICAgIHZpcnR1YWwgdm9pZCBlbmRB
bmltYXRpb24oYm9vbCByZXNldCkgeyB9Ci0gICAgCi0gICAgdm9pZCBwcmltZUV2ZW50VGltZXJz
KCk7Ci0gICAgCi1wcm90ZWN0ZWQ6Ci0gICAgQW5pbVN0YXRlIG1fYW5pbVN0YXRlOwotICAgIGlu
dCBtX2l0ZXJhdGlvbjsKLSAgICAKLSAgICBib29sIG1fYW5pbWF0aW5nOyAgICAgICAvLyB0cmFu
c2l0aW9uL2FuaW1hdGlvbiByZXF1aXJlcyBjb250aW51YWwgdGltZXIgZmlyaW5nCi0gICAgYm9v
bCBtX3dhaXRlZEZvclJlc3BvbnNlOwotICAgIGRvdWJsZSBtX3N0YXJ0VGltZTsKLSAgICBkb3Vi
bGUgbV9wYXVzZVRpbWU7Ci0gICAgUmVuZGVyT2JqZWN0KiBtX29iamVjdDsKLSAgICAKLSAgICBB
bmltYXRpb25UaW1lckNhbGxiYWNrIG1fYW5pbWF0aW9uVGltZXJDYWxsYmFjazsKLSAgICBBbmlt
YXRpb25FdmVudERpc3BhdGNoZXIgbV9hbmltYXRpb25FdmVudERpc3BhdGNoZXI7Ci0gICAgUmVm
UHRyPEFuaW1hdGlvbj4gbV9hbmltYXRpb247Ci0gICAgQ29tcG9zaXRlQW5pbWF0aW9uKiBtX2Nv
bXBBbmltOwotICAgIGJvb2wgbV93YWl0aW5nRm9yRW5kRXZlbnQ7Ci19OwotCi0vLyBBbiBJbXBs
aWNpdEFuaW1hdGlvbiB0cmFja3MgdGhlIHN0YXRlIG9mIGEgdHJhbnNpdGlvbiBvZiBhIHNwZWNp
ZmljIENTUyBwcm9wZXJ0eQotLy8gZm9yIGEgc2luZ2xlIFJlbmRlck9iamVjdC4KLWNsYXNzIElt
cGxpY2l0QW5pbWF0aW9uIDogcHVibGljIEFuaW1hdGlvbkJhc2UgewotcHVibGljOgotICAgIElt
cGxpY2l0QW5pbWF0aW9uKGNvbnN0IEFuaW1hdGlvbiogdHJhbnNpdGlvbiwgaW50IGFuaW1hdGlu
Z1Byb3BlcnR5LCBSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBDb21wb3NpdGVBbmltYXRpb24qIGNv
bXBBbmltKQotICAgIDogQW5pbWF0aW9uQmFzZSh0cmFuc2l0aW9uLCByZW5kZXJlciwgY29tcEFu
aW0pCi0gICAgLCBtX3RyYW5zaXRpb25Qcm9wZXJ0eSh0cmFuc2l0aW9uLT5wcm9wZXJ0eSgpKQot
ICAgICwgbV9hbmltYXRpbmdQcm9wZXJ0eShhbmltYXRpbmdQcm9wZXJ0eSkKLSAgICAsIG1fb3Zl
cnJpZGRlbihmYWxzZSkKLSAgICAsIG1fZnJvbVN0eWxlKDApCi0gICAgLCBtX3RvU3R5bGUoMCkK
LSAgICB7Ci0gICAgICAgIEFTU0VSVChhbmltYXRpbmdQcm9wZXJ0eSAhPSBjQW5pbWF0ZUFsbCk7
Ci0gICAgfQotICAgIAotICAgIHZpcnR1YWwgfkltcGxpY2l0QW5pbWF0aW9uKCkKLSAgICB7Ci0g
ICAgICAgIEFTU0VSVCghbV9mcm9tU3R5bGUgJiYgIW1fdG9TdHlsZSk7Ci0gICAgICAgIAotICAg
ICAgICAvLyBJZiB3ZSB3ZXJlIHdhaXRpbmcgZm9yIGFuIGVuZCBldmVudCwgd2UgbmVlZCB0byBm
aW5pc2ggdGhlIGFuaW1hdGlvbiB0byBtYWtlIHN1cmUgbm8gb2xkCi0gICAgICAgIC8vIGFuaW1h
dGlvbnMgc3RpY2sgYXJvdW5kIGluIHRoZSBsb3dlciBsZXZlbHMKLSAgICAgICAgaWYgKHdhaXRp
bmdGb3JFbmRFdmVudCgpICYmIG1fb2JqZWN0KQotICAgICAgICAgICAgQVNTRVJUKDApOwotICAg
ICAgICAKLSAgICAgICAgLy8gRG8gdGhlIGNsZWFudXAgaGVyZSBpbnN0ZWFkIG9mIGluIHRoZSBi
YXNlIGNsYXNzIHNvIHRoZSBzcGVjaWFsaXplZCBtZXRob2RzIGdldCBjYWxsZWQKLSAgICAgICAg
aWYgKCFwb3N0YWN0aXZlKCkpCi0gICAgICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUoU1RBVEVf
SU5QVVRfRU5EX0FOSU1BVElPTiwgLTEpOyAgICAgCi0gICAgfQotICAgIAotICAgIGludCB0cmFu
c2l0aW9uUHJvcGVydHkoKSBjb25zdCB7IHJldHVybiBtX3RyYW5zaXRpb25Qcm9wZXJ0eTsgfQot
ICAgIGludCBhbmltYXRpbmdQcm9wZXJ0eSgpIGNvbnN0IHsgcmV0dXJuIG1fYW5pbWF0aW5nUHJv
cGVydHk7IH0KLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgb25BbmltYXRpb25FbmQoZG91YmxlIGlu
RWxhcHNlZFRpbWUpOwotICAgIAotICAgIHZpcnR1YWwgdm9pZCBhbmltYXRlKENvbXBvc2l0ZUFu
aW1hdGlvbiosIFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUs
IAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRlclN0eWxlKiB0YXJnZXRTdHls
ZSwgUmVuZGVyU3R5bGUqJiBhbmltYXRlZFN0eWxlKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVzZXQo
UmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5bGUqIGZyb20gPSAwLCBjb25z
dCBSZW5kZXJTdHlsZSogdG8gPSAwKTsKLSAgICAKLSAgICB2b2lkIHNldE92ZXJyaWRkZW4oYm9v
bCBiKTsKLSAgICB2aXJ0dWFsIGJvb2wgb3ZlcnJpZGRlbigpIGNvbnN0IHsgcmV0dXJuIG1fb3Zl
cnJpZGRlbjsgfQotICAgIAotICAgIHZpcnR1YWwgYm9vbCBzaG91bGRGaXJlRXZlbnRzKCkgY29u
c3QgeyByZXR1cm4gdHJ1ZTsgfQotICAgIAotICAgIHZpcnR1YWwgYm9vbCBhZmZlY3RzUHJvcGVy
dHkoaW50IHByb3BlcnR5KSBjb25zdDsKLSAgICAKLSAgICBib29sIGhhc1N0eWxlKCkgY29uc3Qg
eyByZXR1cm4gbV9mcm9tU3R5bGUgJiYgbV90b1N0eWxlOyB9Ci0gICAgCi0gICAgYm9vbCBpc1Rh
cmdldFByb3BlcnR5RXF1YWwoaW50IHByb3AsIGNvbnN0IFJlbmRlclN0eWxlKiB0YXJnZXRTdHls
ZSk7Ci0KLSAgICB2b2lkIGJsZW5kUHJvcGVydHlWYWx1ZUluU3R5bGUoaW50IHByb3AsIFJlbmRl
clN0eWxlKiBjdXJyZW50U3R5bGUpOwotICAgIAotcHJvdGVjdGVkOgotICAgIGJvb2wgc2hvdWxk
U2VuZEV2ZW50Rm9yTGlzdGVuZXIoRG9jdW1lbnQ6Okxpc3RlbmVyVHlwZSBpbkxpc3RlbmVyVHlw
ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtX29iamVjdC0+ZG9jdW1lbnQoKS0+aGFzTGlzdGVu
ZXJUeXBlKGluTGlzdGVuZXJUeXBlKTsKLSAgICB9Ci0gICAgCi0gICAgYm9vbCBzZW5kVHJhbnNp
dGlvbkV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyYgaW5FdmVudFR5cGUsIGRvdWJsZSBpbkVsYXBz
ZWRUaW1lKTsKLSAgICAKLXByaXZhdGU6Ci0gICAgaW50IG1fdHJhbnNpdGlvblByb3BlcnR5OyAg
IC8vIFRyYW5zaXRpb24gcHJvcGVydHkgYXMgc3BlY2lmaWVkIGluIHRoZSBSZW5kZXJTdHlsZS4g
TWF5IGJlIGNBbmltYXRlQWxsCi0gICAgaW50IG1fYW5pbWF0aW5nUHJvcGVydHk7ICAgIC8vIFNw
ZWNpZmljIHByb3BlcnR5IGZvciB0aGlzIEltcGxpY2l0QW5pbWF0aW9uCi0gICAgYm9vbCBtX292
ZXJyaWRkZW47ICAgICAgICAgIC8vIHRydWUgd2hlbiB0aGVyZSBpcyBhIGtleWZyYW1lIGFuaW1h
dGlvbiB0aGF0IG92ZXJyaWRlcyB0aGUgdHJhbnNpdGlvbmluZyBwcm9wZXJ0eQotICAgIAotICAg
IC8vIFRoZSB0d28gc3R5bGVzIHRoYXQgd2UgYXJlIGJsZW5kaW5nLgotICAgIFJlbmRlclN0eWxl
KiBtX2Zyb21TdHlsZTsKLSAgICBSZW5kZXJTdHlsZSogbV90b1N0eWxlOwotfTsKLQotdm9pZCBB
bmltYXRpb25UaW1lckNhbGxiYWNrOjp0aW1lckZpcmVkKFRpbWVyPEFuaW1hdGlvblRpbWVyQmFz
ZT4qKQotewotICAgIG1fYW5pbS0+YW5pbWF0aW9uVGltZXJDYWxsYmFja0ZpcmVkKG1fZXZlbnRU
eXBlLCBtX2VsYXBzZWRUaW1lKTsKLX0KLQotdm9pZCBBbmltYXRpb25FdmVudERpc3BhdGNoZXI6
OnRpbWVyRmlyZWQoVGltZXI8QW5pbWF0aW9uVGltZXJCYXNlPiopCi17Ci0gICAgbV9hbmltLT5h
bmltYXRpb25FdmVudERpc3BhdGNoZXJGaXJlZChtX2VsZW1lbnQuZ2V0KCksIG1fbmFtZSwgbV9w
cm9wZXJ0eSwgbV9yZXNldCwgbV9ldmVudFR5cGUsIG1fZWxhcHNlZFRpbWUpOwotfQotCi0vLyBB
biBLZXlmcmFtZUFuaW1hdGlvbiB0cmFja3MgdGhlIHN0YXRlIG9mIGFuIGV4cGxpY2l0IGFuaW1h
dGlvbgotLy8gZm9yIGEgc2luZ2xlIFJlbmRlck9iamVjdC4KLWNsYXNzIEtleWZyYW1lQW5pbWF0
aW9uIDogcHVibGljIEFuaW1hdGlvbkJhc2UgewotcHVibGljOgotICAgIEtleWZyYW1lQW5pbWF0
aW9uKGNvbnN0IEFuaW1hdGlvbiogYW5pbWF0aW9uLCBSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBp
bnQgaW5kZXgsIENvbXBvc2l0ZUFuaW1hdGlvbiogY29tcEFuaW0pCi0gICAgOiBBbmltYXRpb25C
YXNlKGFuaW1hdGlvbiwgcmVuZGVyZXIsIGNvbXBBbmltKQotICAgICwgbV9rZXlmcmFtZXMoYW5p
bWF0aW9uLT5rZXlmcmFtZUxpc3QoKSkKLSAgICAsIG1fbmFtZShhbmltYXRpb24tPm5hbWUoKSkK
LSAgICAsIG1faW5kZXgoaW5kZXgpCi0gICAgewotICAgIH0KLQotICAgIHZpcnR1YWwgfktleWZy
YW1lQW5pbWF0aW9uKCkKLSAgICB7Ci0gICAgICAgIC8vIERvIHRoZSBjbGVhbnVwIGhlcmUgaW5z
dGVhZCBvZiBpbiB0aGUgYmFzZSBjbGFzcyBzbyB0aGUgc3BlY2lhbGl6ZWQgbWV0aG9kcyBnZXQg
Y2FsbGVkCi0gICAgICAgIGlmICghcG9zdGFjdGl2ZSgpKQotICAgICAgICAgICAgdXBkYXRlU3Rh
dGVNYWNoaW5lKFNUQVRFX0lOUFVUX0VORF9BTklNQVRJT04sIC0xKTsKLSAgICB9Ci0KLSAgICB2
aXJ0dWFsIHZvaWQgYW5pbWF0ZShDb21wb3NpdGVBbmltYXRpb24qLCBSZW5kZXJPYmplY3QqLCBj
b25zdCBSZW5kZXJTdHlsZSogY3VycmVudFN0eWxlLAotICAgICAgICAgICAgICAgICAgICAgICAg
IGNvbnN0IFJlbmRlclN0eWxlKiB0YXJnZXRTdHlsZSwgUmVuZGVyU3R5bGUqJiBhbmltYXRlZFN0
eWxlKTsKLQotICAgIHZvaWQgc2V0TmFtZShjb25zdCBTdHJpbmcmIHMpIHsgbV9uYW1lID0gczsg
fQotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fbmFtZTsg
fQotICAgIGludCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXg7IH0KLQotICAgIHZpcnR1
YWwgYm9vbCBzaG91bGRGaXJlRXZlbnRzKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQotCi1wcm90
ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoZG91YmxlIGluRWxhcHNl
ZFRpbWUpOwotICAgIHZpcnR1YWwgdm9pZCBvbkFuaW1hdGlvbkl0ZXJhdGlvbihkb3VibGUgaW5F
bGFwc2VkVGltZSk7Ci0gICAgdmlydHVhbCB2b2lkIG9uQW5pbWF0aW9uRW5kKGRvdWJsZSBpbkVs
YXBzZWRUaW1lKTsKLSAgICB2aXJ0dWFsIHZvaWQgZW5kQW5pbWF0aW9uKGJvb2wgcmVzZXQpOwot
Ci0gICAgdmlydHVhbCB2b2lkIG92ZXJyaWRlQW5pbWF0aW9ucygpOwotICAgIHZpcnR1YWwgdm9p
ZCByZXN1bWVPdmVycmlkZGVuQW5pbWF0aW9ucygpOwotICAgIAotICAgIGJvb2wgc2hvdWxkU2Vu
ZEV2ZW50Rm9yTGlzdGVuZXIoRG9jdW1lbnQ6Okxpc3RlbmVyVHlwZSBpbkxpc3RlbmVyVHlwZSkK
LSAgICB7Ci0gICAgICAgIHJldHVybiBtX29iamVjdC0+ZG9jdW1lbnQoKS0+aGFzTGlzdGVuZXJU
eXBlKGluTGlzdGVuZXJUeXBlKTsKLSAgICB9Ci0gICAgCi0gICAgYm9vbCBzZW5kQW5pbWF0aW9u
RXZlbnQoY29uc3QgQXRvbWljU3RyaW5nJiBpbkV2ZW50VHlwZSwgZG91YmxlIGluRWxhcHNlZFRp
bWUpOwotICAgIAotICAgIHZpcnR1YWwgYm9vbCBhZmZlY3RzUHJvcGVydHkoaW50IHByb3BlcnR5
KSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICAvLyBUaGUga2V5ZnJhbWVzIHRoYXQgd2UgYXJlIGJs
ZW5kaW5nLgotICAgIFJlZlB0cjxLZXlmcmFtZUxpc3Q+IG1fa2V5ZnJhbWVzOwotICAgIEF0b21p
Y1N0cmluZyBtX25hbWU7Ci0gICAgLy8gVGhlIG9yZGVyIGluIHdoaWNoIHRoaXMgYW5pbWF0aW9u
IGFwcGVhcnMgaW4gdGhlIGFuaW1hdGlvbi1uYW1lIHN0eWxlLgotICAgIGludCBtX2luZGV4Owot
fTsKLQotQW5pbWF0aW9uQmFzZTo6QW5pbWF0aW9uQmFzZShjb25zdCBBbmltYXRpb24qIHRyYW5z
aXRpb24sIFJlbmRlck9iamVjdCogcmVuZGVyZXIsIENvbXBvc2l0ZUFuaW1hdGlvbiogY29tcEFu
aW0pCi06IG1fYW5pbVN0YXRlKFNUQVRFX05FVykKLSwgbV9pdGVyYXRpb24oMCkKLSwgbV9hbmlt
YXRpbmcoZmFsc2UpCi0sIG1fd2FpdGVkRm9yUmVzcG9uc2UoZmFsc2UpCi0sIG1fc3RhcnRUaW1l
KDApCi0sIG1fcGF1c2VUaW1lKC0xKQotLCBtX29iamVjdChyZW5kZXJlcikKLSwgbV9hbmltYXRp
b25UaW1lckNhbGxiYWNrKGNvbnN0X2Nhc3Q8QW5pbWF0aW9uQmFzZSo+KHRoaXMpKQotLCBtX2Fu
aW1hdGlvbkV2ZW50RGlzcGF0Y2hlcihjb25zdF9jYXN0PEFuaW1hdGlvbkJhc2UqPih0aGlzKSkK
LSwgbV9hbmltYXRpb24oY29uc3RfY2FzdDxBbmltYXRpb24qPih0cmFuc2l0aW9uKSkKLSwgbV9j
b21wQW5pbShjb21wQW5pbSkKLSwgbV93YWl0aW5nRm9yRW5kRXZlbnQoZmFsc2UpCi17Ci19Ci0K
LXZvaWQgQW5pbWF0aW9uQmFzZTo6dXBkYXRlU3RhdGVNYWNoaW5lKEFuaW1TdGF0ZUlucHV0IGlu
cHV0LCBkb3VibGUgcGFyYW0pCi17Ci0gICAgLy8gSWYgd2UgZ2V0IGEgUkVTVEFSVCB0aGVuIHdl
IGZvcmNlIGEgbmV3IGFuaW1hdGlvbiwgcmVnYXJkbGVzcyBvZiBzdGF0ZQotICAgIGlmIChpbnB1
dCA9PSBTVEFURV9JTlBVVF9NQUtFX05FVykgewotICAgICAgICBpZiAobV9hbmltU3RhdGUgPT0g
U1RBVEVfU1RBUlRfV0FJVF9TVFlMRV9BVkFJTEFCTEUpCi0gICAgICAgICAgICBtX2NvbXBBbmlt
LT5zZXRXYWl0aW5nRm9yU3R5bGVBdmFpbGFibGUoZmFsc2UpOwotICAgICAgICBtX2FuaW1TdGF0
ZSA9IFNUQVRFX05FVzsKLSAgICAgICAgbV9zdGFydFRpbWUgPSAwOwotICAgICAgICBtX3BhdXNl
VGltZSA9IC0xOwotICAgICAgICBtX3dhaXRlZEZvclJlc3BvbnNlID0gZmFsc2U7Ci0gICAgICAg
IGVuZEFuaW1hdGlvbihmYWxzZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxzZSBp
ZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfUkVTVEFSVF9BTklNQVRJT04pIHsKLSAgICAgICAgY2Fu
Y2VsVGltZXJzKCk7Ci0gICAgICAgIGlmIChtX2FuaW1TdGF0ZSA9PSBTVEFURV9TVEFSVF9XQUlU
X1NUWUxFX0FWQUlMQUJMRSkKLSAgICAgICAgICAgIG1fY29tcEFuaW0tPnNldFdhaXRpbmdGb3JT
dHlsZUF2YWlsYWJsZShmYWxzZSk7Ci0gICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfTkVXOwot
ICAgICAgICBtX3N0YXJ0VGltZSA9IDA7Ci0gICAgICAgIG1fcGF1c2VUaW1lID0gLTE7Ci0gICAg
ICAgIGVuZEFuaW1hdGlvbihmYWxzZSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoIXBhdXNlZCgp
KQotICAgICAgICAgICAgdXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVUX1NUQVJUX0FOSU1B
VElPTiwgLTEpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0ID09
IFNUQVRFX0lOUFVUX0VORF9BTklNQVRJT04pIHsKLSAgICAgICAgY2FuY2VsVGltZXJzKCk7Ci0g
ICAgICAgIGlmIChtX2FuaW1TdGF0ZSA9PSBTVEFURV9TVEFSVF9XQUlUX1NUWUxFX0FWQUlMQUJM
RSkKLSAgICAgICAgICAgIG1fY29tcEFuaW0tPnNldFdhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZShm
YWxzZSk7Ci0gICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfRE9ORTsKLSAgICAgICAgZW5kQW5p
bWF0aW9uKHRydWUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGVsc2UgaWYgKGlucHV0
ID09IFNUQVRFX0lOUFVUX1BBVVNFX09WRVJSSURFKSB7Ci0gICAgICAgIGlmIChtX2FuaW1TdGF0
ZSA9PSBTVEFURV9TVEFSVF9XQUlUX1JFU1BPTlNFKSB7Ci0gICAgICAgICAgICAvLyBJZiB3ZSBh
cmUgaW4gdGhlIFdBSVRfUkVTUE9OU0Ugc3RhdGUsIHRoZSBhbmltYXRpb24gd2lsbCBnZXQgY2Fu
Y2VsZWQgYmVmb3JlIAotICAgICAgICAgICAgLy8gd2UgZ2V0IGEgcmVzcG9uc2UsIHNvIG1vdmUg
dG8gdGhlIG5leHQgc3RhdGUKLSAgICAgICAgICAgIGVuZEFuaW1hdGlvbihmYWxzZSk7Ci0gICAg
ICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUoU1RBVEVfSU5QVVRfU1RBUlRfVElNRV9TRVQsIGN1
cnJlbnRUaW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZWxz
ZSBpZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfUkVTVU1FX09WRVJSSURFKSB7Ci0gICAgICAgIGlm
IChtX2FuaW1TdGF0ZSA9PSBTVEFURV9MT09QSU5HIHx8IG1fYW5pbVN0YXRlID09IFNUQVRFX0VO
RElORykgewotICAgICAgICAgICAgLy8gU3RhcnQgdGhlIGFuaW1hdGlvbgotICAgICAgICAgICAg
c3RhcnRBbmltYXRpb24obV9zdGFydFRpbWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsK
LSAgICB9Ci0gICAgCi0gICAgLy8gRXhlY3V0ZSBzdGF0ZSBtYWNoaW5lCi0gICAgc3dpdGNoKG1f
YW5pbVN0YXRlKSB7Ci0gICAgICAgIGNhc2UgU1RBVEVfTkVXOgotICAgICAgICAgICAgQVNTRVJU
KGlucHV0ID09IFNUQVRFX0lOUFVUX1NUQVJUX0FOSU1BVElPTiB8fCBpbnB1dCA9PSBTVEFURV9J
TlBVVF9QTEFZX1NUQVRFX1JVTk5JTkcgfHwgaW5wdXQgPT0gU1RBVEVfSU5QVVRfUExBWV9TVEFU
RV9QQVVTRUQpOwotICAgICAgICAgICAgaWYgKGlucHV0ID09IFNUQVRFX0lOUFVUX1NUQVJUX0FO
SU1BVElPTiB8fCBpbnB1dCA9PSBTVEFURV9JTlBVVF9QTEFZX1NUQVRFX1JVTk5JTkcpIHsKLSAg
ICAgICAgICAgICAgICAvLyBTZXQgdGhlIHN0YXJ0IHRpbWVyIHRvIHRoZSBpbml0aWFsIGRlbGF5
ICgwIGlmIG5vIGRlbGF5KQotICAgICAgICAgICAgICAgIG1fd2FpdGVkRm9yUmVzcG9uc2UgPSBm
YWxzZTsKLSAgICAgICAgICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX1NUQVJUX1dBSVRfVElN
RVI7Ci0gICAgICAgICAgICAgICAgbV9hbmltYXRpb25UaW1lckNhbGxiYWNrLnN0YXJ0VGltZXIo
bV9hbmltYXRpb24tPmRlbGF5KCksIEV2ZW50TmFtZXM6OndlYmtpdEFuaW1hdGlvblN0YXJ0RXZl
bnQsIG1fYW5pbWF0aW9uLT5kZWxheSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJy
ZWFrOwotICAgICAgICBjYXNlIFNUQVRFX1NUQVJUX1dBSVRfVElNRVI6Ci0gICAgICAgICAgICBB
U1NFUlQoaW5wdXQgPT0gU1RBVEVfSU5QVVRfU1RBUlRfVElNRVJfRklSRUQgfHwgaW5wdXQgPT0g
U1RBVEVfSU5QVVRfUExBWV9TVEFURV9QQVVTRUQpOwotICAgICAgICAgICAgCi0gICAgICAgICAg
ICBpZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfU1RBUlRfVElNRVJfRklSRUQpIHsKLSAgICAgICAg
ICAgICAgICBBU1NFUlQocGFyYW0gPj0gMCk7Ci0gICAgICAgICAgICAgICAgLy8gU3RhcnQgdGlt
ZXIgaGFzIGZpcmVkLCB0ZWxsIHRoZSBhbmltYXRpb24gdG8gc3RhcnQgYW5kIHdhaXQgZm9yIGl0
IHRvIHJlc3BvbmQgd2l0aCBzdGFydCB0aW1lCi0gICAgICAgICAgICAgICAgbV9hbmltU3RhdGUg
PSBTVEFURV9TVEFSVF9XQUlUX1NUWUxFX0FWQUlMQUJMRTsKLSAgICAgICAgICAgICAgICBtX2Nv
bXBBbmltLT5zZXRXYWl0aW5nRm9yU3R5bGVBdmFpbGFibGUodHJ1ZSk7Ci0gICAgICAgICAgICAg
ICAgCi0gICAgICAgICAgICAgICAgLy8gVHJpZ2dlciBhIHJlbmRlciBzbyB3ZSBjYW4gc3RhcnQg
dGhlIGFuaW1hdGlvbgotICAgICAgICAgICAgICAgIHNldENoYW5nZWQobV9vYmplY3QtPmVsZW1l
bnQoKSk7Ci0gICAgICAgICAgICAgICAgbV9vYmplY3QtPmFuaW1hdGlvbigpLT5zdGFydFVwZGF0
ZVJlbmRlcmluZ0Rpc3BhdGNoZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2Ug
ewotICAgICAgICAgICAgICAgIEFTU0VSVChydW5uaW5nKCkpOwotICAgICAgICAgICAgICAgIC8v
IFdlJ3JlIHdhaXRpbmcgZm9yIHRoZSBzdGFydCB0aW1lciB0byBmaXJlIGFuZCB3ZSBnb3QgYSBw
YXVzZS4gQ2FuY2VsIHRoZSB0aW1lciwgcGF1c2UgYW5kIHdhaXQKLSAgICAgICAgICAgICAgICBt
X3BhdXNlVGltZSA9IGN1cnJlbnRUaW1lKCk7Ci0gICAgICAgICAgICAgICAgY2FuY2VsVGltZXJz
KCk7Ci0gICAgICAgICAgICAgICAgbV9hbmltU3RhdGUgPSBTVEFURV9QQVVTRURfV0FJVF9USU1F
UjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUQVRF
X1NUQVJUX1dBSVRfU1RZTEVfQVZBSUxBQkxFOgotICAgICAgICAgICAgQVNTRVJUKGlucHV0ID09
IFNUQVRFX0lOUFVUX1NUWUxFX0FWQUlMQUJMRSB8fCBpbnB1dCA9PSBTVEFURV9JTlBVVF9QTEFZ
X1NUQVRFX1BBVVNFRCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG1fY29tcEFuaW0tPnNl
dFdhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZShmYWxzZSk7Ci0gICAgICAgICAgICAKLSAgICAgICAg
ICAgIGlmIChpbnB1dCA9PSBTVEFURV9JTlBVVF9TVFlMRV9BVkFJTEFCTEUpIHsKLSAgICAgICAg
ICAgICAgICAvLyBTdGFydCB0aW1lciBoYXMgZmlyZWQsIHRlbGwgdGhlIGFuaW1hdGlvbiB0byBz
dGFydCBhbmQgd2FpdCBmb3IgaXQgdG8gcmVzcG9uZCB3aXRoIHN0YXJ0IHRpbWUKLSAgICAgICAg
ICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX1NUQVJUX1dBSVRfUkVTUE9OU0U7Ci0gICAgICAg
ICAgICAgICAgCi0gICAgICAgICAgICAgICAgb3ZlcnJpZGVBbmltYXRpb25zKCk7Ci0gICAgICAg
ICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gU2VuZCBzdGFydCBldmVudCwgaWYgbmVlZGVk
Ci0gICAgICAgICAgICAgICAgb25BbmltYXRpb25TdGFydCgwLjBmKTsgLy8gVGhlIGVsYXBzZWRU
aW1lIGlzIGFsd2F5cyAwIGhlcmUKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAv
LyBTdGFydCB0aGUgYW5pbWF0aW9uCi0gICAgICAgICAgICAgICAgaWYgKG92ZXJyaWRkZW4oKSB8
fCAhc3RhcnRBbmltYXRpb24oMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgbm90
IGdvaW5nIHRvIGdldCBhIHN0YXJ0VGltZSBjYWxsYmFjaywgc28gZmlyZSB0aGUgc3RhcnQgdGlt
ZSBoZXJlCi0gICAgICAgICAgICAgICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfU1RBUlRfV0FJ
VF9SRVNQT05TRTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRF
X0lOUFVUX1NUQVJUX1RJTUVfU0VULCBjdXJyZW50VGltZSgpKTsKLSAgICAgICAgICAgICAgICB9
Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICBtX3dhaXRlZEZvclJl
c3BvbnNlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAg
ICAgICAgICAgIEFTU0VSVChydW5uaW5nKCkpOwotICAgICAgICAgICAgICAgIC8vIFdlJ3JlIHdh
aXRpbmcgZm9yIHRoZSBhIG5vdGlmaWNhdGlvbiB0aGF0IHRoZSBzdHlsZSBoYXMgYmVlbiBzZXR1
cC4gSWYgd2UncmUgYXNrZWQgdG8gd2FpdAotICAgICAgICAgICAgICAgIC8vIGF0IHRoaXMgcG9p
bnQsIHRoZSBzdHlsZSBtdXN0IGhhdmUgYmVlbiBwcm9jZXNzZWQsIHNvIHdlIGNhbiBkZWFsIHdp
dGggdGhpcyBsaWtlIHdlIHdvdWxkCi0gICAgICAgICAgICAgICAgLy8gZm9yIFdBSVRfUkVTUE9O
U0UsIGV4Y2VwdCB0aGF0IHdlIGRvbid0IG5lZWQgdG8gZG8gYW4gZW5kQW5pbWF0aW9uKCkuCi0g
ICAgICAgICAgICAgICAgbV9wYXVzZVRpbWUgPSAwOwotICAgICAgICAgICAgICAgIG1fYW5pbVN0
YXRlID0gU1RBVEVfU1RBUlRfV0FJVF9SRVNQT05TRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAg
ICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUQVRFX1NUQVJUX1dBSVRfUkVTUE9OU0U6Ci0gICAg
ICAgICAgICBBU1NFUlQoaW5wdXQgPT0gU1RBVEVfSU5QVVRfU1RBUlRfVElNRV9TRVQgfHwgaW5w
dXQgPT0gU1RBVEVfSU5QVVRfUExBWV9TVEFURV9QQVVTRUQpOwotICAgICAgICAgICAgCi0gICAg
ICAgICAgICBpZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfU1RBUlRfVElNRV9TRVQpIHsKLSAgICAg
ICAgICAgICAgICBBU1NFUlQocGFyYW0gPj0gMCk7Ci0gICAgICAgICAgICAgICAgLy8gV2UgaGF2
ZSBhIHN0YXJ0IHRpbWUsIHNldCBpdCwgdW5sZXNzIHRoZSBzdGFydFRpbWUgaXMgYWxyZWFkeSBz
ZXQKLSAgICAgICAgICAgICAgICBpZiAobV9zdGFydFRpbWUgPD0gMCkKLSAgICAgICAgICAgICAg
ICAgICAgbV9zdGFydFRpbWUgPSBwYXJhbTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAg
ICAgICAvLyBEZWNpZGUgd2hlbiB0aGUgZW5kIG9yIGxvb3AgZXZlbnQgbmVlZHMgdG8gZmlyZQot
ICAgICAgICAgICAgICAgIHByaW1lRXZlbnRUaW1lcnMoKTsKLSAgICAgICAgICAgICAgICAKLSAg
ICAgICAgICAgICAgICAvLyBUcmlnZ2VyIGEgcmVuZGVyIHNvIHdlIGNhbiBzdGFydCB0aGUgYW5p
bWF0aW9uCi0gICAgICAgICAgICAgICAgc2V0Q2hhbmdlZChtX29iamVjdC0+ZWxlbWVudCgpKTsK
LSAgICAgICAgICAgICAgICBtX29iamVjdC0+YW5pbWF0aW9uKCktPnN0YXJ0VXBkYXRlUmVuZGVy
aW5nRGlzcGF0Y2hlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAg
ICAgICAgICAgICAgLy8gV2UgYXJlIHBhdXNpbmcgd2hpbGUgd2FpdGluZyBmb3IgYSBzdGFydCBy
ZXNwb25zZS4gQ2FuY2VsIHRoZSBhbmltYXRpb24gYW5kIHdhaXQuIFdoZW4gCi0gICAgICAgICAg
ICAgICAgLy8gd2UgdW5wYXVzZSwgd2Ugd2lsbCBhY3QgYXMgdGhvdWdoIHRoZSBzdGFydCB0aW1l
ciBqdXN0IGZpcmVkCi0gICAgICAgICAgICAgICAgbV9wYXVzZVRpbWUgPSAwOwotICAgICAgICAg
ICAgICAgIGVuZEFuaW1hdGlvbihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbV9hbmltU3RhdGUg
PSBTVEFURV9QQVVTRURfV0FJVF9SRVNQT05TRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAg
IGJyZWFrOwotICAgICAgICBjYXNlIFNUQVRFX0xPT1BJTkc6Ci0gICAgICAgICAgICBBU1NFUlQo
aW5wdXQgPT0gU1RBVEVfSU5QVVRfTE9PUF9USU1FUl9GSVJFRCB8fCBpbnB1dCA9PSBTVEFURV9J
TlBVVF9QTEFZX1NUQVRFX1BBVVNFRCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGlmIChp
bnB1dCA9PSBTVEFURV9JTlBVVF9MT09QX1RJTUVSX0ZJUkVEKSB7Ci0gICAgICAgICAgICAgICAg
QVNTRVJUKHBhcmFtID49IDApOwotICAgICAgICAgICAgICAgIC8vIExvb3AgdGltZXIgZmlyZWQs
IGxvb3AgYWdhaW4gb3IgZW5kLgotICAgICAgICAgICAgICAgIG9uQW5pbWF0aW9uSXRlcmF0aW9u
KHBhcmFtKTsKLSAgICAgICAgICAgICAgICBwcmltZUV2ZW50VGltZXJzKCk7Ci0gICAgICAgICAg
ICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBhcmUgcGF1c2lu
ZyB3aGlsZSBydW5uaW5nLiBDYW5jZWwgdGhlIGFuaW1hdGlvbiBhbmQgd2FpdAotICAgICAgICAg
ICAgICAgIG1fcGF1c2VUaW1lID0gY3VycmVudFRpbWUoKTsKLSAgICAgICAgICAgICAgICBjYW5j
ZWxUaW1lcnMoKTsKLSAgICAgICAgICAgICAgICBlbmRBbmltYXRpb24oZmFsc2UpOwotICAgICAg
ICAgICAgICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfUEFVU0VEX1JVTjsKLSAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUQVRFX0VORElORzoKLSAgICAgICAg
ICAgIEFTU0VSVChpbnB1dCA9PSBTVEFURV9JTlBVVF9FTkRfVElNRVJfRklSRUQgfHwgaW5wdXQg
PT0gU1RBVEVfSU5QVVRfUExBWV9TVEFURV9QQVVTRUQpOwotICAgICAgICAgICAgCi0gICAgICAg
ICAgICBpZiAoaW5wdXQgPT0gU1RBVEVfSU5QVVRfRU5EX1RJTUVSX0ZJUkVEKSB7Ci0gICAgICAg
ICAgICAgICAgQVNTRVJUKHBhcmFtID49IDApOwotICAgICAgICAgICAgICAgIC8vIEVuZCB0aW1l
ciBmaXJlZCwgZmluaXNoIHVwCi0gICAgICAgICAgICAgICAgb25BbmltYXRpb25FbmQocGFyYW0p
OwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIHJlc3VtZU92ZXJyaWRkZW5Bbmlt
YXRpb25zKCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gRmlyZSBvZmYg
YW5vdGhlciBzdHlsZSBjaGFuZ2Ugc28gd2UgY2FuIHNldCB0aGUgZmluYWwgdmFsdWUKLSAgICAg
ICAgICAgICAgICBzZXRDaGFuZ2VkKG1fb2JqZWN0LT5lbGVtZW50KCkpOwotICAgICAgICAgICAg
ICAgIG1fYW5pbVN0YXRlID0gU1RBVEVfRE9ORTsKLSAgICAgICAgICAgICAgICBtX29iamVjdC0+
YW5pbWF0aW9uKCktPnN0YXJ0VXBkYXRlUmVuZGVyaW5nRGlzcGF0Y2hlcigpOwotICAgICAgICAg
ICAgICAgIC8vIHx0aGlzfCBtYXkgYmUgZGVsZXRlZCBoZXJlIHdoZW4gd2UndmUgYmVlbiBjYWxs
ZWQgZnJvbSB0aW1lckZpcmVkKCkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2Ugewot
ICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBwYXVzaW5nIHdoaWxlIHJ1bm5pbmcuIENhbmNlbCB0
aGUgYW5pbWF0aW9uIGFuZCB3YWl0Ci0gICAgICAgICAgICAgICAgbV9wYXVzZVRpbWUgPSBjdXJy
ZW50VGltZSgpOwotICAgICAgICAgICAgICAgIGNhbmNlbFRpbWVycygpOwotICAgICAgICAgICAg
ICAgIGVuZEFuaW1hdGlvbihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbV9hbmltU3RhdGUgPSBT
VEFURV9QQVVTRURfUlVOOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gfHRoaXN8IG1h
eSBiZSBkZWxldGVkIGhlcmUKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUQVRF
X1BBVVNFRF9XQUlUX1RJTUVSOgotICAgICAgICAgICAgQVNTRVJUKGlucHV0ID09IFNUQVRFX0lO
UFVUX1BMQVlfU1RBVEVfUlVOTklORyk7Ci0gICAgICAgICAgICBBU1NFUlQoIXJ1bm5pbmcoKSk7
Ci0gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHRpbWVzCi0gICAgICAgICAgICBtX3N0YXJ0VGlt
ZSArPSBjdXJyZW50VGltZSgpIC0gbV9wYXVzZVRpbWU7Ci0gICAgICAgICAgICBtX3BhdXNlVGlt
ZSA9IC0xOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyB3ZSB3ZXJlIHdhaXRpbmcgZm9y
IHRoZSBzdGFydCB0aW1lciB0byBmaXJlLCBnbyBiYWNrIGFuZCB3YWl0IGFnYWluCi0gICAgICAg
ICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX05FVzsKLSAgICAgICAgICAgIHVwZGF0ZVN0YXRlTWFj
aGluZShTVEFURV9JTlBVVF9TVEFSVF9BTklNQVRJT04sIDApOwotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEX1dBSVRfUkVTUE9OU0U6Ci0gICAgICAgIGNhc2Ug
U1RBVEVfUEFVU0VEX1JVTjoKLSAgICAgICAgICAgIC8vIFdlIHRyZWF0IHRoZXNlIHR3byBjYXNl
cyB0aGUgc2FtZS4gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0LCB3aGVuIHdlIGFyZSBpbiB0
aGUgV0FJVF9SRVNQT05TRQotICAgICAgICAgICAgLy8gc3RhdGUsIHdlIGRvbid0IHlldCBoYXZl
IGEgdmFsaWQgc3RhcnRUaW1lLCBzbyB3ZSBzZW5kIDAgdG8gc3RhcnRBbmltYXRpb24uIFdoZW4g
dGhlIFNUQVJUX1RJTUUKLSAgICAgICAgICAgIC8vIGV2ZW50IGNvbWVzIGluIHFuZCB3ZSB3ZXJl
IGluIHRoZSBSVU4gc3RhdGUsIHdlIHdpbGwgbm90aWNlIHRoYXQgd2UgaGF2ZSBhbHJlYWR5IHNl
dCB0aGUgCi0gICAgICAgICAgICAvLyBzdGFydFRpbWUgYW5kIHdpbGwgaWdub3JlIGl0LgotICAg
ICAgICAgICAgQVNTRVJUKGlucHV0ID09IFNUQVRFX0lOUFVUX1BMQVlfU1RBVEVfUlVOTklORyk7
Ci0gICAgICAgICAgICBBU1NFUlQoIXJ1bm5pbmcoKSk7Ci0gICAgICAgICAgICAvLyBVcGRhdGUg
dGhlIHRpbWVzCi0gICAgICAgICAgICBpZiAobV9hbmltU3RhdGUgPT0gU1RBVEVfUEFVU0VEX1JV
TikKLSAgICAgICAgICAgICAgICBtX3N0YXJ0VGltZSArPSBjdXJyZW50VGltZSgpIC0gbV9wYXVz
ZVRpbWU7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbV9zdGFydFRpbWUgPSAw
OwotICAgICAgICAgICAgbV9wYXVzZVRpbWUgPSAtMTsKLSAgICAgICAgICAgIAotICAgICAgICAg
ICAgLy8gV2Ugd2VyZSB3YWl0aW5nIGZvciBhIGJlZ2luIHRpbWUgcmVzcG9uc2UgZnJvbSB0aGUg
YW5pbWF0aW9uLCBnbyBiYWNrIGFuZCB3YWl0IGFnYWluCi0gICAgICAgICAgICBtX2FuaW1TdGF0
ZSA9IFNUQVRFX1NUQVJUX1dBSVRfUkVTUE9OU0U7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAg
IC8vIFN0YXJ0IHRoZSBhbmltYXRpb24KLSAgICAgICAgICAgIGlmIChvdmVycmlkZGVuKCkgfHwg
IXN0YXJ0QW5pbWF0aW9uKG1fc3RhcnRUaW1lKSkgewotICAgICAgICAgICAgICAgIC8vIFdlJ3Jl
IG5vdCBnb2luZyB0byBnZXQgYSBzdGFydFRpbWUgY2FsbGJhY2ssIHNvIGZpcmUgdGhlIHN0YXJ0
IHRpbWUgaGVyZQotICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFURV9JTlBV
VF9TVEFSVF9USU1FX1NFVCwgY3VycmVudFRpbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAg
ICAgICBlbHNlCi0gICAgICAgICAgICAgICAgbV93YWl0ZWRGb3JSZXNwb25zZSA9IHRydWU7Ci0g
ICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVEFURV9ET05FOgotICAgICAgICAgICAg
Ly8gV2UncmUgZG9uZS4gU3RheSBpbiB0aGlzIHN0YXRlIHVudGlsIHdlIGFyZSBkZWxldGVkCi0g
ICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgLy8gfHRoaXN8IG1heSBiZSBkZWxldGVkIGhl
cmUgaWYgd2UgY2FtZSBvdXQgb2YgU1RBVEVfRU5ESU5HIHdoZW4gd2UndmUgYmVlbiBjYWxsZWQg
ZnJvbSB0aW1lckZpcmVkKCkKLX0KLSAgICAKLXZvaWQgQW5pbWF0aW9uQmFzZTo6YW5pbWF0aW9u
VGltZXJDYWxsYmFja0ZpcmVkKGNvbnN0IEF0b21pY1N0cmluZyYgZXZlbnRUeXBlLCBkb3VibGUg
ZWxhcHNlZFRpbWUpCi17Ci0gICAgQVNTRVJUKG1fb2JqZWN0LT5kb2N1bWVudCgpICYmICFtX29i
amVjdC0+ZG9jdW1lbnQoKS0+aW5QYWdlQ2FjaGUoKSk7Ci0gICAgCi0gICAgLy8gRklYTUU6IHVz
ZSBhbiBlbnVtCi0gICAgaWYgKGV2ZW50VHlwZSA9PSBFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRp
b25TdGFydEV2ZW50KQotICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUoU1RBVEVfSU5QVVRfU1RB
UlRfVElNRVJfRklSRUQsIGVsYXBzZWRUaW1lKTsKLSAgICBlbHNlIGlmIChldmVudFR5cGUgPT0g
RXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uSXRlcmF0aW9uRXZlbnQpCi0gICAgICAgIHVwZGF0
ZVN0YXRlTWFjaGluZShTVEFURV9JTlBVVF9MT09QX1RJTUVSX0ZJUkVELCBlbGFwc2VkVGltZSk7
Ci0gICAgZWxzZSBpZiAoZXZlbnRUeXBlID09IEV2ZW50TmFtZXM6OndlYmtpdEFuaW1hdGlvbkVu
ZEV2ZW50KSB7Ci0gICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFURV9JTlBVVF9FTkRfVElN
RVJfRklSRUQsIGVsYXBzZWRUaW1lKTsKLSAgICAgICAgLy8gfHRoaXN8IG1heSBiZSBkZWxldGVk
IGhlcmUKLSAgICB9Ci19Ci0KLXZvaWQgQW5pbWF0aW9uQmFzZTo6YW5pbWF0aW9uRXZlbnREaXNw
YXRjaGVyRmlyZWQoRWxlbWVudCogZWxlbWVudCwgY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lLCBp
bnQgcHJvcGVydHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIGJvb2wgcmVzZXQsIGNvbnN0IEF0b21pY1N0cmluZyYgZXZlbnRUeXBlLCBkb3VibGUg
ZWxhcHNlZFRpbWUpCi17Ci0gICAgbV93YWl0aW5nRm9yRW5kRXZlbnQgPSBmYWxzZTsKLSAgICAK
LSAgICAvLyBLZWVwIGFuIGF0b21pYyBzdHJpbmcgb24gdGhlIHN0YWNrIHRvIGtlZXAgaXQgYWxp
dmUgdW50aWwgd2UgZXhpdCB0aGlzIG1ldGhvZAotICAgIC8vIChzaW5jZSBkaXNwYXRjaGluZyB0
aGUgZXZlbnQgbWF5IGNhdXNlIHx0aGlzfCB0byBiZSBkZWxldGVkLCB0aGVyZWZvcmUgcmVtb3Zp
bmcKLSAgICAvLyB0aGUgbGFzdCByZWYgdG8gdGhlIGF0b21pYyBzdHJpbmcpLgotICAgIEF0b21p
Y1N0cmluZyBhbmltTmFtZShuYW1lKTsKLSAgICBBdG9taWNTdHJpbmcgYW5pbUV2ZW50VHlwZShl
dmVudFR5cGUpOwotICAgIC8vIE1ha2Ugc3VyZSB0aGUgZWxlbWVudCBzdGlja3MgYXJvdW5kIHRv
bwotICAgIFJlZlB0cjxFbGVtZW50PiBlbGVtZW50UmV0YWluZXIoZWxlbWVudCk7Ci0gICAgCi0g
ICAgQVNTRVJUKCFlbGVtZW50IHx8IChlbGVtZW50LT5kb2N1bWVudCgpICYmICFlbGVtZW50LT5k
b2N1bWVudCgpLT5pblBhZ2VDYWNoZSgpKSk7Ci0gICAgaWYgKCFlbGVtZW50KQotICAgICAgICBy
ZXR1cm47Ci0KLSAgICBpZiAoZXZlbnRUeXBlID09IEV2ZW50TmFtZXM6OndlYmtpdFRyYW5zaXRp
b25FbmRFdmVudCkKLSAgICAgICAgZWxlbWVudC0+ZGlzcGF0Y2hXZWJLaXRUcmFuc2l0aW9uRXZl
bnQoZXZlbnRUeXBlLCBuYW1lLCBlbGFwc2VkVGltZSk7Ci0gICAgZWxzZQotICAgICAgICBlbGVt
ZW50LT5kaXNwYXRjaFdlYktpdEFuaW1hdGlvbkV2ZW50KGV2ZW50VHlwZSwgbmFtZSwgZWxhcHNl
ZFRpbWUpOwotCi0gICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgKHVuYW5pbWF0ZWQpIHN0eWxl
Ci0gICAgaWYgKGFuaW1FdmVudFR5cGUgPT0gRXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uRW5k
RXZlbnQpCi0gICAgICAgIGlmIChlbGVtZW50LT5yZW5kZXJlcigpKQotICAgICAgICAgICAgc2V0
Q2hhbmdlZChlbGVtZW50LT5yZW5kZXJlcigpLT5lbGVtZW50KCkpOwotfQotCi12b2lkIEFuaW1h
dGlvbkJhc2U6OnVwZGF0ZVBsYXlTdGF0ZShib29sIHJ1bikKLXsKLSAgICBpZiAocGF1c2VkKCkg
PT0gcnVuIHx8IGlzbmV3KCkpCi0gICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShydW4gPyBTVEFU
RV9JTlBVVF9QTEFZX1NUQVRFX1JVTk5JTkcgOiBTVEFURV9JTlBVVF9QTEFZX1NUQVRFX1BBVVNF
RCwgLTEpOwotfQotCi1kb3VibGUgQW5pbWF0aW9uQmFzZTo6cHJvZ3Jlc3MoZG91YmxlIHNjYWxl
LCBkb3VibGUgb2Zmc2V0KSBjb25zdAotewotICAgIGlmIChwcmVhY3RpdmUoKSkKLSAgICAgICAg
cmV0dXJuIDA7Ci0gICAgCi0gICAgZG91YmxlIGVsYXBzZWRUaW1lID0gcnVubmluZygpID8gKGN1
cnJlbnRUaW1lKCkgLSBtX3N0YXJ0VGltZSkgOiAobV9wYXVzZVRpbWUgLSBtX3N0YXJ0VGltZSk7
Ci0gICAgaWYgKHJ1bm5pbmcoKSAmJiBlbGFwc2VkVGltZSA8IDApCi0gICAgICAgIHJldHVybiAw
OwotICAgIAotICAgIGRvdWJsZSBkdXIgPSBtX2FuaW1hdGlvbi0+ZHVyYXRpb24oKTsKLSAgICBp
ZiAobV9hbmltYXRpb24tPml0ZXJhdGlvbkNvdW50KCkgPiAwKQotICAgICAgICBkdXIgKj0gbV9h
bmltYXRpb24tPml0ZXJhdGlvbkNvdW50KCk7Ci0gICAgCi0gICAgaWYgKHBvc3RhY3RpdmUoKSB8
fCAhbV9hbmltYXRpb24tPmR1cmF0aW9uKCkgfHwgKG1fYW5pbWF0aW9uLT5pdGVyYXRpb25Db3Vu
dCgpID4gMCAmJiBlbGFwc2VkVGltZSA+PSBkdXIpKQotICAgICAgICByZXR1cm4gMS4wOwotICAg
IAotICAgIC8vIENvbXB1dGUgdGhlIGZyYWN0aW9uYWwgdGltZSwgdGFraW5nIGludG8gYWNjb3Vu
dCBkaXJlY3Rpb24uCi0gICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byB3b3JyeSBhYm91dCBpdGVy
YXRpb25zLCB3ZSBhc3N1bWUgdGhhdCB3ZSB3b3VsZCBoYXZlCi0gICAgLy8gc2hvcnQgY2lyY3Vp
dGVkIGFib3ZlIGlmIHdlIHdlcmUgZG9uZQotICAgIGRvdWJsZSBmcmFjdGlvbmFsVGltZSA9IGVs
YXBzZWRUaW1lIC8gbV9hbmltYXRpb24tPmR1cmF0aW9uKCk7Ci0gICAgaW50IGludGVncmFsVGlt
ZSA9IChpbnQpIGZyYWN0aW9uYWxUaW1lOwotICAgIGZyYWN0aW9uYWxUaW1lIC09IGludGVncmFs
VGltZTsKLSAgICAKLSAgICBpZiAobV9hbmltYXRpb24tPmRpcmVjdGlvbigpICYmIChpbnRlZ3Jh
bFRpbWUgJiAxKSkKLSAgICAgICAgZnJhY3Rpb25hbFRpbWUgPSAxIC0gZnJhY3Rpb25hbFRpbWU7
Ci0gICAgCi0gICAgaWYgKHNjYWxlICE9IDEgfHwgb2Zmc2V0ICE9IDApCi0gICAgICAgIGZyYWN0
aW9uYWxUaW1lID0gKGZyYWN0aW9uYWxUaW1lIC0gb2Zmc2V0KSAqIHNjYWxlOwotICAgIAotICAg
IGlmIChtX2FuaW1hdGlvbi0+dGltaW5nRnVuY3Rpb24oKS50eXBlKCkgPT0gTGluZWFyVGltaW5n
RnVuY3Rpb24pCi0gICAgICAgIHJldHVybiBmcmFjdGlvbmFsVGltZTsKLSAgICAKLSAgICAvLyBD
dWJpYyBiZXppZXIuCi0gICAgZG91YmxlIHJlc3VsdCA9IHNvbHZlQ3ViaWNCZXppZXJGdW5jdGlv
bihtX2FuaW1hdGlvbi0+dGltaW5nRnVuY3Rpb24oKS54MSgpLAotICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBtX2FuaW1hdGlvbi0+dGltaW5nRnVuY3Rpb24oKS55
MSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2FuaW1h
dGlvbi0+dGltaW5nRnVuY3Rpb24oKS54MigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBtX2FuaW1hdGlvbi0+dGltaW5nRnVuY3Rpb24oKS55MigpLAotICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFjdGlvbmFsVGltZSwg
bV9hbmltYXRpb24tPmR1cmF0aW9uKCkpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQg
QW5pbWF0aW9uQmFzZTo6cHJpbWVFdmVudFRpbWVycygpCi17Ci0gICAgLy8gRGVjaWRlIHdoZW4g
dGhlIGVuZCBvciBsb29wIGV2ZW50IG5lZWRzIHRvIGZpcmUKLSAgICBkb3VibGUgY3QgPSBjdXJy
ZW50VGltZSgpOwotICAgIGNvbnN0IGRvdWJsZSBlbGFwc2VkRHVyYXRpb24gPSBjdCAtIG1fc3Rh
cnRUaW1lOwotICAgIEFTU0VSVChlbGFwc2VkRHVyYXRpb24gPj0gMCk7Ci0gICAgCi0gICAgZG91
YmxlIHRvdGFsRHVyYXRpb24gPSAtMTsKLSAgICBpZiAobV9hbmltYXRpb24tPml0ZXJhdGlvbkNv
dW50KCkgPiAwKQotICAgICAgICB0b3RhbER1cmF0aW9uID0gbV9hbmltYXRpb24tPmR1cmF0aW9u
KCkgKiBtX2FuaW1hdGlvbi0+aXRlcmF0aW9uQ291bnQoKTsKLQotICAgIGRvdWJsZSBkdXJhdGlv
bkxlZnQgPSAwOwotICAgIGRvdWJsZSBuZXh0SXRlcmF0aW9uVGltZSA9IHRvdGFsRHVyYXRpb247
Ci0gICAgaWYgKHRvdGFsRHVyYXRpb24gPCAwIHx8IGVsYXBzZWREdXJhdGlvbiA8IHRvdGFsRHVy
YXRpb24pIHsKLSAgICAgICAgZHVyYXRpb25MZWZ0ID0gbV9hbmltYXRpb24tPmR1cmF0aW9uKCkg
LSBmbW9kKGVsYXBzZWREdXJhdGlvbiwgbV9hbmltYXRpb24tPmR1cmF0aW9uKCkpOwotICAgICAg
ICBuZXh0SXRlcmF0aW9uVGltZSA9IGVsYXBzZWREdXJhdGlvbiArIGR1cmF0aW9uTGVmdDsKLSAg
ICB9Ci0gICAgCi0gICAgLy8gQXQgdGhpcyBwb2ludCwgd2UgbWF5IGhhdmUgMCBkdXJhdGlvbkxl
ZnQsIGlmIHdlJ3ZlIGdvdHRlbiB0aGUgZXZlbnQgbGF0ZSBhbmQgd2UgYXJlIGFscmVhZHkKLSAg
ICAvLyBwYXN0IHRvdGFsRHVyYXRpb24uIEluIHRoaXMgY2FzZSB3ZSBzdGlsbCBmaXJlIGFuIGVu
ZCB0aW1lciBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgZW5kLiAKLSAgICAvLyBUaGlzIGRlZmVycyB0
aGUgY2FsbCB0byBzZW5kQW5pbWF0aW9uRXZlbnRzIHRvIGF2b2lkIHJlLWVudHJhbnQgY2FsbHMg
dGhhdCBkZXN0cm95Ci0gICAgLy8gdGhlIFJlbmRlck9iamVjdCwgYW5kIHRoZXJlZm9yZSB8dGhp
c3wgYmVmb3JlIHdlJ3JlIGRvbmUgd2l0aCBpdC4KLSAgICBpZiAodG90YWxEdXJhdGlvbiA8IDAg
fHwgbmV4dEl0ZXJhdGlvblRpbWUgPCB0b3RhbER1cmF0aW9uKSB7Ci0gICAgICAgIC8vIFdlIGFy
ZSBub3QgYXQgdGhlIGVuZCB5ZXQsIHNlbmQgYSBsb29wIGV2ZW50Ci0gICAgICAgIEFTU0VSVChu
ZXh0SXRlcmF0aW9uVGltZSA+IDApOwotICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX0xPT1BJ
Tkc7Ci0gICAgICAgIG1fYW5pbWF0aW9uVGltZXJDYWxsYmFjay5zdGFydFRpbWVyKGR1cmF0aW9u
TGVmdCwgRXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uSXRlcmF0aW9uRXZlbnQsIG5leHRJdGVy
YXRpb25UaW1lKTsKLSAgICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIC8vIFdlIGFyZSBhdCB0aGUg
ZW5kLCBzZW5kIGFuIGVuZCBldmVudAotICAgICAgICBtX2FuaW1TdGF0ZSA9IFNUQVRFX0VORElO
RzsKLSAgICAgICAgbV9hbmltYXRpb25UaW1lckNhbGxiYWNrLnN0YXJ0VGltZXIoZHVyYXRpb25M
ZWZ0LCBFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRpb25FbmRFdmVudCwgbmV4dEl0ZXJhdGlvblRp
bWUpOwotICAgIH0KLX0KLQotc3RhdGljIGlubGluZSBpbnQgYmxlbmRGdW5jKGludCBmcm9tLCBp
bnQgdG8sIGRvdWJsZSBwcm9ncmVzcykKLXsgIAotICAgIHJldHVybiBpbnQoZnJvbSArICh0byAt
IGZyb20pICogcHJvZ3Jlc3MpOwotfQotCi1zdGF0aWMgaW5saW5lIGRvdWJsZSBibGVuZEZ1bmMo
ZG91YmxlIGZyb20sIGRvdWJsZSB0bywgZG91YmxlIHByb2dyZXNzKQoteyAgCi0gICAgcmV0dXJu
IGZyb20gKyAodG8gLSBmcm9tKSAqIHByb2dyZXNzOwotfQotCi1zdGF0aWMgaW5saW5lIGZsb2F0
IGJsZW5kRnVuYyhmbG9hdCBmcm9tLCBmbG9hdCB0bywgZG91YmxlIHByb2dyZXNzKQoteyAgCi0g
ICAgcmV0dXJuIG5hcnJvd1ByZWNpc2lvblRvRmxvYXQoZnJvbSArICh0byAtIGZyb20pICogcHJv
Z3Jlc3MpOwotfQotCi1zdGF0aWMgaW5saW5lIENvbG9yIGJsZW5kRnVuYyhjb25zdCBDb2xvciYg
ZnJvbSwgY29uc3QgQ29sb3ImIHRvLCBkb3VibGUgcHJvZ3Jlc3MpCi17ICAKLSAgICByZXR1cm4g
Q29sb3IoYmxlbmRGdW5jKGZyb20ucmVkKCksIHRvLnJlZCgpLCBwcm9ncmVzcyksCi0gICAgICAg
ICAgICAgICAgIGJsZW5kRnVuYyhmcm9tLmdyZWVuKCksIHRvLmdyZWVuKCksIHByb2dyZXNzKSwK
LSAgICAgICAgICAgICAgICAgYmxlbmRGdW5jKGZyb20uYmx1ZSgpLCB0by5ibHVlKCksIHByb2dy
ZXNzKSwKLSAgICAgICAgICAgICAgICAgYmxlbmRGdW5jKGZyb20uYWxwaGEoKSwgdG8uYWxwaGEo
KSwgcHJvZ3Jlc3MpKTsKLX0KLQotc3RhdGljIGlubGluZSBMZW5ndGggYmxlbmRGdW5jKGNvbnN0
IExlbmd0aCYgZnJvbSwgY29uc3QgTGVuZ3RoJiB0bywgZG91YmxlIHByb2dyZXNzKQoteyAgCi0g
ICAgcmV0dXJuIHRvLmJsZW5kKGZyb20sIHByb2dyZXNzKTsKLX0KLQotc3RhdGljIGlubGluZSBJ
bnRTaXplIGJsZW5kRnVuYyhjb25zdCBJbnRTaXplJiBmcm9tLCBjb25zdCBJbnRTaXplJiB0bywg
ZG91YmxlIHByb2dyZXNzKQoteyAgCi0gICAgcmV0dXJuIEludFNpemUoYmxlbmRGdW5jKGZyb20u
d2lkdGgoKSwgdG8ud2lkdGgoKSwgcHJvZ3Jlc3MpLAotICAgICAgICAgICAgICAgICAgIGJsZW5k
RnVuYyhmcm9tLmhlaWdodCgpLCB0by5oZWlnaHQoKSwgcHJvZ3Jlc3MpKTsKLX0KLQotc3RhdGlj
IGlubGluZSBTaGFkb3dEYXRhKiBibGVuZEZ1bmMoY29uc3QgU2hhZG93RGF0YSogZnJvbSwgY29u
c3QgU2hhZG93RGF0YSogdG8sIGRvdWJsZSBwcm9ncmVzcykKLXsgIAotICAgIEFTU0VSVChmcm9t
ICYmIHRvKTsKLSAgICByZXR1cm4gbmV3IFNoYWRvd0RhdGEoYmxlbmRGdW5jKGZyb20tPngsIHRv
LT54LCBwcm9ncmVzcyksIGJsZW5kRnVuYyhmcm9tLT55LCB0by0+eSwgcHJvZ3Jlc3MpLCAKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRGdW5jKGZyb20tPmJsdXIsIHRvLT5ibHVyLCBw
cm9ncmVzcyksIGJsZW5kRnVuYyhmcm9tLT5jb2xvciwgdG8tPmNvbG9yLCBwcm9ncmVzcykpOwot
fQotCi1zdGF0aWMgaW5saW5lIFRyYW5zZm9ybU9wZXJhdGlvbnMgYmxlbmRGdW5jKGNvbnN0IFRy
YW5zZm9ybU9wZXJhdGlvbnMmIGZyb20sIGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMmIHRvLCBk
b3VibGUgcHJvZ3Jlc3MpCi17ICAgIAotICAgIC8vIEJsZW5kIGFueSBvcGVyYXRpb25zIHdob3Nl
IHR5cGVzIGFjdHVhbGx5IG1hdGNoIHVwLiAgT3RoZXJ3aXNlIGRvbid0IGJvdGhlci4KLSAgICB1
bnNpZ25lZCBmcm9tU2l6ZSA9IGZyb20uc2l6ZSgpOwotICAgIHVuc2lnbmVkIHRvU2l6ZSA9IHRv
LnNpemUoKTsKLSAgICB1bnNpZ25lZCBzaXplID0gbWF4KGZyb21TaXplLCB0b1NpemUpOwotICAg
IFRyYW5zZm9ybU9wZXJhdGlvbnMgcmVzdWx0OwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBzaXplOyBpKyspIHsKLSAgICAgICAgUmVmUHRyPFRyYW5zZm9ybU9wZXJhdGlvbj4gZnJvbU9w
ID0gaSA8IGZyb21TaXplID8gZnJvbVtpXSA6IDA7Ci0gICAgICAgIFJlZlB0cjxUcmFuc2Zvcm1P
cGVyYXRpb24+IHRvT3AgPSBpIDwgdG9TaXplID8gdG9baV0gOiAwOwotICAgICAgICBSZWZQdHI8
VHJhbnNmb3JtT3BlcmF0aW9uPiBibGVuZGVkT3AgPSB0b09wID8gdG9PcC0+YmxlbmQoZnJvbU9w
LmdldCgpLCBwcm9ncmVzcykgOiBmcm9tT3AtPmJsZW5kKDAsIHByb2dyZXNzLCB0cnVlKTsKLSAg
ICAgICAgaWYgKGJsZW5kZWRPcCkKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYmxlbmRlZE9w
KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGlubGluZSBFVmlzaWJp
bGl0eSBibGVuZEZ1bmMoRVZpc2liaWxpdHkgZnJvbSwgRVZpc2liaWxpdHkgdG8sIGRvdWJsZSBw
cm9ncmVzcykKLXsKLSAgICAvLyBBbnkgbm9uLXplcm8gcmVzdWx0IG1lYW5zIHdlIGNvbnNpZGVy
IHRoZSBvYmplY3QgdG8gYmUgdmlzaWJsZS4gIE9ubHkgYXQgMCBkbyB3ZSBjb25zaWRlciB0aGUg
b2JqZWN0IHRvIGJlCi0gICAgLy8gaW52aXNpYmxlLiAgIFRoZSBpbnZpc2libGUgdmFsdWUgd2Ug
dXNlIChISURERU4gdnMuIENPTExBUFNFKSBkZXBlbmRzIG9uIHRoZSBzcGVjaWZpZWQgZnJvbS90
byB2YWx1ZXMuCi0gICAgZG91YmxlIGZyb21WYWwgPSBmcm9tID09IFZJU0lCTEUgPyAxLiA6IDAu
OwotICAgIGRvdWJsZSB0b1ZhbCA9IHRvID09IFZJU0lCTEUgPyAxLiA6IDAuOwotICAgIGlmIChm
cm9tVmFsID09IHRvVmFsKQotICAgICAgICByZXR1cm4gdG87Ci0gICAgZG91YmxlIHJlc3VsdCA9
IGJsZW5kRnVuYyhmcm9tVmFsLCB0b1ZhbCwgcHJvZ3Jlc3MpOwotICAgIHJldHVybiByZXN1bHQg
PiAwLiA/IFZJU0lCTEUgOiAodG8gIT0gVklTSUJMRSA/IHRvIDogZnJvbSk7Ci19Ci0KLWNsYXNz
IFByb3BlcnR5V3JhcHBlckJhc2UgewotcHVibGljOgotICAgIFByb3BlcnR5V3JhcHBlckJhc2Uo
aW50IHByb3ApCi0gICAgOiBtX3Byb3AocHJvcCkKLSAgICB7IH0KLSAgICB2aXJ0dWFsIH5Qcm9w
ZXJ0eVdyYXBwZXJCYXNlKCkgeyB9Ci0gICAgdmlydHVhbCBib29sIGVxdWFscyhjb25zdCBSZW5k
ZXJTdHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUqIGIpIGNvbnN0PTA7Ci0gICAgdmlydHVhbCB2
b2lkIGJsZW5kKFJlbmRlclN0eWxlKiBkc3QsIGNvbnN0IFJlbmRlclN0eWxlKiBhLCBjb25zdCBS
ZW5kZXJTdHlsZSogYiwgZG91YmxlIHByb2cpIGNvbnN0PTA7Ci0gICAgCi0gICAgaW50IHByb3Bl
cnR5KCkgY29uc3QgeyByZXR1cm4gbV9wcm9wOyB9Ci0gICAgCi1wcml2YXRlOgotICAgIGludCBt
X3Byb3A7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIFByb3BlcnR5V3JhcHBl
ckdldHRlciA6IHB1YmxpYyBQcm9wZXJ0eVdyYXBwZXJCYXNlIHsKLXB1YmxpYzoKLSAgICBQcm9w
ZXJ0eVdyYXBwZXJHZXR0ZXIoaW50IHByb3AsIFQgKFJlbmRlclN0eWxlOjoqZ2V0dGVyKSgpIGNv
bnN0KQotICAgIDogUHJvcGVydHlXcmFwcGVyQmFzZShwcm9wKQotICAgICwgbV9nZXR0ZXIoZ2V0
dGVyKQotICAgIHsgfQotICAgIAotICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3QgUmVuZGVy
U3R5bGUqIGEsIGNvbnN0IFJlbmRlclN0eWxlKiBiKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0
dXJuIChhLT4qbV9nZXR0ZXIpKCkgPT0gKGItPiptX2dldHRlcikoKTsKLSAgICB9Ci0gICAgCi1w
cm90ZWN0ZWQ6Ci0gICAgVCAoUmVuZGVyU3R5bGU6OiptX2dldHRlcikoKSBjb25zdDsKLX07Ci0K
LXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotY2xhc3MgUHJvcGVydHlXcmFwcGVyIDogcHVibGljIFBy
b3BlcnR5V3JhcHBlckdldHRlcjxUPiB7Ci1wdWJsaWM6Ci0gICAgUHJvcGVydHlXcmFwcGVyKGlu
dCBwcm9wLCBUIChSZW5kZXJTdHlsZTo6KmdldHRlcikoKSBjb25zdCwgdm9pZCAoUmVuZGVyU3R5
bGU6OipzZXR0ZXIpKFQpKQotICAgIDogUHJvcGVydHlXcmFwcGVyR2V0dGVyPFQ+KHByb3AsIGdl
dHRlcikKLSAgICAsIG1fc2V0dGVyKHNldHRlcikKLSAgICB7IH0KLSAgICAKLSAgICB2aXJ0dWFs
IHZvaWQgYmxlbmQoUmVuZGVyU3R5bGUqIGRzdCwgY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0
IFJlbmRlclN0eWxlKiBiLCBkb3VibGUgcHJvZykgY29uc3QKLSAgICB7Ci0gICAgICAgIChkc3Qt
PiptX3NldHRlcikoYmxlbmRGdW5jKChhLT4qUHJvcGVydHlXcmFwcGVyR2V0dGVyPFQ+OjptX2dl
dHRlcikoKSwgKGItPipQcm9wZXJ0eVdyYXBwZXJHZXR0ZXI8VD46Om1fZ2V0dGVyKSgpLCBwcm9n
KSk7Ci0gICAgfQotICAgIAotcHJvdGVjdGVkOgotICAgIHZvaWQgKFJlbmRlclN0eWxlOjoqbV9z
ZXR0ZXIpKFQpOwotfTsKLQotY2xhc3MgUHJvcGVydHlXcmFwcGVyU2hhZG93IDogcHVibGljIFBy
b3BlcnR5V3JhcHBlckdldHRlcjxTaGFkb3dEYXRhKj4gewotcHVibGljOgotICAgIFByb3BlcnR5
V3JhcHBlclNoYWRvdyhpbnQgcHJvcCwgU2hhZG93RGF0YSogKFJlbmRlclN0eWxlOjoqZ2V0dGVy
KSgpIGNvbnN0LCB2b2lkIChSZW5kZXJTdHlsZTo6KnNldHRlcikoU2hhZG93RGF0YSosIGJvb2wp
KQotICAgIDogUHJvcGVydHlXcmFwcGVyR2V0dGVyPFNoYWRvd0RhdGEqPihwcm9wLCBnZXR0ZXIp
Ci0gICAgLCBtX3NldHRlcihzZXR0ZXIpCi0gICAgeyB9Ci0gICAgCi0gICAgdmlydHVhbCBib29s
IGVxdWFscyhjb25zdCBSZW5kZXJTdHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUqIGIpIGNvbnN0
Ci0gICAgewotICAgICAgICBTaGFkb3dEYXRhKiBzaGFkb3dhID0gKGEtPiptX2dldHRlcikoKTsK
LSAgICAgICAgU2hhZG93RGF0YSogc2hhZG93YiA9IChiLT4qbV9nZXR0ZXIpKCk7Ci0gICAgICAg
IAotICAgICAgICBpZiAoIXNoYWRvd2EgJiYgc2hhZG93YiB8fCBzaGFkb3dhICYmICFzaGFkb3di
KQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoc2hhZG93YSAmJiBzaGFk
b3diICYmICgqc2hhZG93YSAhPSAqc2hhZG93YikpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7
Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICB2aXJ0dWFsIHZvaWQgYmxl
bmQoUmVuZGVyU3R5bGUqIGRzdCwgY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJlbmRlclN0
eWxlKiBiLCBkb3VibGUgcHJvZykgY29uc3QKLSAgICB7Ci0gICAgICAgIFNoYWRvd0RhdGEqIHNo
YWRvd2EgPSAoYS0+Km1fZ2V0dGVyKSgpOwotICAgICAgICBTaGFkb3dEYXRhKiBzaGFkb3diID0g
KGItPiptX2dldHRlcikoKTsKLSAgICAgICAgU2hhZG93RGF0YSBkZWZhdWx0U2hhZG93RGF0YSgw
LCAwLCAwLCBDb2xvcjo6dHJhbnNwYXJlbnQpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFzaGFk
b3dhKQotICAgICAgICAgICAgc2hhZG93YSA9ICZkZWZhdWx0U2hhZG93RGF0YTsKLSAgICAgICAg
aWYgKCFzaGFkb3diKQotICAgICAgICAgICAgc2hhZG93YiA9ICZkZWZhdWx0U2hhZG93RGF0YTsK
LSAgICAgICAgCi0gICAgICAgIChkc3QtPiptX3NldHRlcikoYmxlbmRGdW5jKHNoYWRvd2EsIHNo
YWRvd2IsIHByb2cpLCBmYWxzZSk7Ci0gICAgfQotICAgIAotcHJpdmF0ZToKLSAgICB2b2lkIChS
ZW5kZXJTdHlsZTo6Km1fc2V0dGVyKShTaGFkb3dEYXRhKiwgYm9vbCk7Ci19OwotCi1jbGFzcyBQ
cm9wZXJ0eVdyYXBwZXJNYXliZUludmFsaWRDb2xvciA6IHB1YmxpYyBQcm9wZXJ0eVdyYXBwZXJC
YXNlIHsKLXB1YmxpYzoKLSAgICBQcm9wZXJ0eVdyYXBwZXJNYXliZUludmFsaWRDb2xvcihpbnQg
cHJvcCwgY29uc3QgQ29sb3ImIChSZW5kZXJTdHlsZTo6KmdldHRlcikoKSBjb25zdCwgdm9pZCAo
UmVuZGVyU3R5bGU6OipzZXR0ZXIpKGNvbnN0IENvbG9yJikpCi0gICAgOiBQcm9wZXJ0eVdyYXBw
ZXJCYXNlKHByb3ApCi0gICAgLCBtX2dldHRlcihnZXR0ZXIpCi0gICAgLCBtX3NldHRlcihzZXR0
ZXIpCi0gICAgeyB9Ci0gICAgCi0gICAgdmlydHVhbCBib29sIGVxdWFscyhjb25zdCBSZW5kZXJT
dHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUqIGIpIGNvbnN0Ci0gICAgewotICAgICAgICBDb2xv
ciBmcm9tQ29sb3IgPSAoYS0+Km1fZ2V0dGVyKSgpOwotICAgICAgICBDb2xvciB0b0NvbG9yID0g
KGItPiptX2dldHRlcikoKTsKLSAgICAgICAgaWYgKCFmcm9tQ29sb3IuaXNWYWxpZCgpKQotICAg
ICAgICAgICAgZnJvbUNvbG9yID0gYS0+Y29sb3IoKTsKLSAgICAgICAgaWYgKCF0b0NvbG9yLmlz
VmFsaWQoKSkKLSAgICAgICAgICAgIHRvQ29sb3IgPSBiLT5jb2xvcigpOwotICAgICAgICAKLSAg
ICAgICAgcmV0dXJuIGZyb21Db2xvciA9PSB0b0NvbG9yOwotICAgIH0KLSAgICAKLSAgICB2aXJ0
dWFsIHZvaWQgYmxlbmQoUmVuZGVyU3R5bGUqIGRzdCwgY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNv
bnN0IFJlbmRlclN0eWxlKiBiLCBkb3VibGUgcHJvZykgY29uc3QKLSAgICB7Ci0gICAgICAgIENv
bG9yIGZyb21Db2xvciA9IChhLT4qbV9nZXR0ZXIpKCk7Ci0gICAgICAgIENvbG9yIHRvQ29sb3Ig
PSAoYi0+Km1fZ2V0dGVyKSgpOwotICAgICAgICBpZiAoIWZyb21Db2xvci5pc1ZhbGlkKCkpCi0g
ICAgICAgICAgICBmcm9tQ29sb3IgPSBhLT5jb2xvcigpOwotICAgICAgICBpZiAoIXRvQ29sb3Iu
aXNWYWxpZCgpKQotICAgICAgICAgICAgdG9Db2xvciA9IGItPmNvbG9yKCk7Ci0gICAgICAgIChk
c3QtPiptX3NldHRlcikoYmxlbmRGdW5jKGZyb21Db2xvciwgdG9Db2xvciwgcHJvZykpOwotICAg
IH0KLSAgICAKLXByaXZhdGU6Ci0gICAgY29uc3QgQ29sb3ImIChSZW5kZXJTdHlsZTo6Km1fZ2V0
dGVyKSgpIGNvbnN0OwotICAgIHZvaWQgKFJlbmRlclN0eWxlOjoqbV9zZXR0ZXIpKGNvbnN0IENv
bG9yJik7Ci19OwotCiBjbGFzcyBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZSB7CiBwdWJsaWM6
CiAgICAgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGUoRnJhbWUqKTsKQEAgLTEwOTAsNDAgKzYw
LDIwIEBAIHB1YmxpYzoKICAgICAKICAgICBib29sIGlzQW5pbWF0aW5nUHJvcGVydHlPblJlbmRl
cmVyKFJlbmRlck9iamVjdCogb2JqLCBpbnQgcHJvcGVydHksIGJvb2wgaXNSdW5uaW5nTm93KSBj
b25zdDsKICAgICAKLSAgICBzdGF0aWMgYm9vbCBwcm9wZXJ0aWVzRXF1YWwoaW50IHByb3AsIGNv
bnN0IFJlbmRlclN0eWxlKiBhLCBjb25zdCBSZW5kZXJTdHlsZSogYik7Ci0gICAgc3RhdGljIGlu
dCBnZXRQcm9wZXJ0eUF0SW5kZXgoaW50IGkpOwotICAgIHN0YXRpYyBpbnQgZ2V0TnVtUHJvcGVy
dGllcygpIHsgcmV0dXJuIGdQcm9wZXJ0eVdyYXBwZXJzLT5zaXplKCk7IH0KLSAgICAKLSAgICAv
LyBSZXR1cm4gdHJ1ZSBpZiB3ZSBuZWVkIHRvIHN0YXJ0IHNvZnR3YXJlIGFuaW1hdGlvbiB0aW1l
cnMKLSAgICBzdGF0aWMgYm9vbCBibGVuZFByb3BlcnRpZXMoaW50IHByb3AsIFJlbmRlclN0eWxl
KiBkc3QsIGNvbnN0IFJlbmRlclN0eWxlKiBhLCBjb25zdCBSZW5kZXJTdHlsZSogYiwgZG91Ymxl
IHByb2cpOwotICAgIAotICAgIHZvaWQgc2V0V2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKGJvb2wg
d2FpdGluZykgeyBpZiAod2FpdGluZykgbV9udW1TdHlsZUF2YWlsYWJsZVdhaXRlcnMrKzsgZWxz
ZSBtX251bVN0eWxlQXZhaWxhYmxlV2FpdGVycy0tOyB9Ci0gICAgCiBwcml2YXRlOgotICAgIHN0
YXRpYyB2b2lkIGVuc3VyZVByb3BlcnR5TWFwKCk7Ci0gICAgCiAgICAgdHlwZWRlZiBIYXNoTWFw
PFJlbmRlck9iamVjdCosIENvbXBvc2l0ZUFuaW1hdGlvbio+IFJlbmRlck9iamVjdEFuaW1hdGlv
bk1hcDsKICAgICAKICAgICBSZW5kZXJPYmplY3RBbmltYXRpb25NYXAgbV9jb21wb3NpdGVBbmlt
YXRpb25zOwogICAgIFRpbWVyPEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlPiBtX2FuaW1hdGlv
blRpbWVyOwogICAgIFRpbWVyPEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlPiBtX3VwZGF0ZVJl
bmRlcmluZ0Rpc3BhdGNoZXI7CiAgICAgRnJhbWUqIG1fZnJhbWU7Ci0gICAgdWludDMyX3QgbV9u
dW1TdHlsZUF2YWlsYWJsZVdhaXRlcnM7Ci0gICAgCi0gICAgc3RhdGljIFZlY3RvcjxQcm9wZXJ0
eVdyYXBwZXJCYXNlKj4qIGdQcm9wZXJ0eVdyYXBwZXJzOwotICAgIHN0YXRpYyBpbnQgZ1Byb3Bl
cnR5V3JhcHBlck1hcFtudW1DU1NQcm9wZXJ0aWVzXTsKIH07CiAKLVZlY3RvcjxQcm9wZXJ0eVdy
YXBwZXJCYXNlKj4qIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpnUHJvcGVydHlXcmFwcGVy
cyA9IDA7Ci1pbnQgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OmdQcm9wZXJ0eVdyYXBwZXJN
YXBbXTsKLQogQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OkFuaW1hdGlvbkNvbnRyb2xsZXJQ
cml2YXRlKEZyYW1lKiBmcmFtZSkKIDogbV9hbmltYXRpb25UaW1lcih0aGlzLCAmQW5pbWF0aW9u
Q29udHJvbGxlclByaXZhdGU6OmFuaW1hdGlvblRpbWVyRmlyZWQpCiAsIG1fdXBkYXRlUmVuZGVy
aW5nRGlzcGF0Y2hlcih0aGlzLCAmQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OnVwZGF0ZVJl
bmRlcmluZ0Rpc3BhdGNoZXJGaXJlZCkKICwgbV9mcmFtZShmcmFtZSkKLSwgbV9udW1TdHlsZUF2
YWlsYWJsZVdhaXRlcnMoMCkKIHsKLSAgICBlbnN1cmVQcm9wZXJ0eU1hcCgpOwogfQogCiBBbmlt
YXRpb25Db250cm9sbGVyUHJpdmF0ZTo6fkFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlKCkKQEAg
LTExMzEsMTUwICs4MSwxMSBAQCBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6fkFuaW1hdGlv
bkNvCiAgICAgZGVsZXRlQWxsVmFsdWVzKG1fY29tcG9zaXRlQW5pbWF0aW9ucyk7CiB9CiAKLS8v
IHN0YXRpYwotdm9pZCBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6ZW5zdXJlUHJvcGVydHlN
YXAoKQotewotICAgIC8vIEZJWE1FOiBUaGlzIGRhdGEgaXMgbmV2ZXIgZGVzdHJveWVkLiBNYXli
ZSB3ZSBzaG91bGQgcmVmIGNvdW50IGl0IGFuZCB0b3NzIGl0IHdoZW4gdGhlIGxhc3QgQW5pbWF0
aW9uQ29udHJvbGxlciBpcyBkZXN0cm95ZWQ/Ci0gICAgaWYgKGdQcm9wZXJ0eVdyYXBwZXJzID09
IDApIHsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMgPSBuZXcgVmVjdG9yPFByb3BlcnR5V3Jh
cHBlckJhc2UqPigpOwotICAgICAgICAKLSAgICAgICAgLy8gYnVpbGQgdGhlIGxpc3Qgb2YgcHJv
cGVydHkgd3JhcHBlcnMgdG8gZG8gdGhlIGNvbXBhcmlzb25zIGFuZCBibGVuZHMKLSAgICAgICAg
Z1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4oQ1NT
UHJvcGVydHlMZWZ0LCAmUmVuZGVyU3R5bGU6OmxlZnQsICZSZW5kZXJTdHlsZTo6c2V0TGVmdCkp
OwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8
TGVuZ3RoPihDU1NQcm9wZXJ0eVJpZ2h0LCAmUmVuZGVyU3R5bGU6OnJpZ2h0LCAmUmVuZGVyU3R5
bGU6OnNldFJpZ2h0KSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFBy
b3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5VG9wLCAmUmVuZGVyU3R5bGU6OnRvcCwg
JlJlbmRlclN0eWxlOjpzZXRUb3ApKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVu
ZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlCb3R0b20sICZSZW5kZXJT
dHlsZTo6Ym90dG9tLCAmUmVuZGVyU3R5bGU6OnNldEJvdHRvbSkpOwotICAgICAgICBnUHJvcGVy
dHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0
eVdpZHRoLCAmUmVuZGVyU3R5bGU6OndpZHRoLCAmUmVuZGVyU3R5bGU6OnNldFdpZHRoKSk7Ci0g
ICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5n
dGg+KENTU1Byb3BlcnR5SGVpZ2h0LCAmUmVuZGVyU3R5bGU6OmhlaWdodCwgJlJlbmRlclN0eWxl
OjpzZXRIZWlnaHQpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJv
cGVydHlXcmFwcGVyPHVuc2lnbmVkIHNob3J0PihDU1NQcm9wZXJ0eUJvcmRlckxlZnRXaWR0aCwg
JlJlbmRlclN0eWxlOjpib3JkZXJMZWZ0V2lkdGgsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyTGVm
dFdpZHRoKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5
V3JhcHBlcjx1bnNpZ25lZCBzaG9ydD4oQ1NTUHJvcGVydHlCb3JkZXJSaWdodFdpZHRoLCAmUmVu
ZGVyU3R5bGU6OmJvcmRlclJpZ2h0V2lkdGgsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyUmlnaHRX
aWR0aCkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdy
YXBwZXI8dW5zaWduZWQgc2hvcnQ+KENTU1Byb3BlcnR5Qm9yZGVyVG9wV2lkdGgsICZSZW5kZXJT
dHlsZTo6Ym9yZGVyVG9wV2lkdGgsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyVG9wV2lkdGgpKTsK
LSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPHVu
c2lnbmVkIHNob3J0PihDU1NQcm9wZXJ0eUJvcmRlckJvdHRvbVdpZHRoLCAmUmVuZGVyU3R5bGU6
OmJvcmRlckJvdHRvbVdpZHRoLCAmUmVuZGVyU3R5bGU6OnNldEJvcmRlckJvdHRvbVdpZHRoKSk7
Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxM
ZW5ndGg+KENTU1Byb3BlcnR5TWFyZ2luTGVmdCwgJlJlbmRlclN0eWxlOjptYXJnaW5MZWZ0LCAm
UmVuZGVyU3R5bGU6OnNldE1hcmdpbkxlZnQpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMt
PmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlNYXJnaW5SaWdo
dCwgJlJlbmRlclN0eWxlOjptYXJnaW5SaWdodCwgJlJlbmRlclN0eWxlOjpzZXRNYXJnaW5SaWdo
dCkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBw
ZXI8TGVuZ3RoPihDU1NQcm9wZXJ0eU1hcmdpblRvcCwgJlJlbmRlclN0eWxlOjptYXJnaW5Ub3As
ICZSZW5kZXJTdHlsZTo6c2V0TWFyZ2luVG9wKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJz
LT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5TWFyZ2luQm90
dG9tLCAmUmVuZGVyU3R5bGU6Om1hcmdpbkJvdHRvbSwgJlJlbmRlclN0eWxlOjpzZXRNYXJnaW5C
b3R0b20pKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlX
cmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlQYWRkaW5nTGVmdCwgJlJlbmRlclN0eWxlOjpwYWRk
aW5nTGVmdCwgJlJlbmRlclN0eWxlOjpzZXRQYWRkaW5nTGVmdCkpOwotICAgICAgICBnUHJvcGVy
dHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8TGVuZ3RoPihDU1NQcm9wZXJ0
eVBhZGRpbmdSaWdodCwgJlJlbmRlclN0eWxlOjpwYWRkaW5nUmlnaHQsICZSZW5kZXJTdHlsZTo6
c2V0UGFkZGluZ1JpZ2h0KSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3
IFByb3BlcnR5V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5UGFkZGluZ1RvcCwgJlJlbmRlclN0
eWxlOjpwYWRkaW5nVG9wLCAmUmVuZGVyU3R5bGU6OnNldFBhZGRpbmdUb3ApKTsKLSAgICAgICAg
Z1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPExlbmd0aD4oQ1NT
UHJvcGVydHlQYWRkaW5nQm90dG9tLCAmUmVuZGVyU3R5bGU6OnBhZGRpbmdCb3R0b20sICZSZW5k
ZXJTdHlsZTo6c2V0UGFkZGluZ0JvdHRvbSkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+
YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8ZmxvYXQ+KENTU1Byb3BlcnR5T3BhY2l0eSwgJlJl
bmRlclN0eWxlOjpvcGFjaXR5LCAmUmVuZGVyU3R5bGU6OnNldE9wYWNpdHkpKTsKLSAgICAgICAg
Z1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPGNvbnN0IENvbG9y
Jj4oQ1NTUHJvcGVydHlDb2xvciwgJlJlbmRlclN0eWxlOjpjb2xvciwgJlJlbmRlclN0eWxlOjpz
ZXRDb2xvcikpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0
eVdyYXBwZXI8Y29uc3QgQ29sb3ImPihDU1NQcm9wZXJ0eUJhY2tncm91bmRDb2xvciwgJlJlbmRl
clN0eWxlOjpiYWNrZ3JvdW5kQ29sb3IsICZSZW5kZXJTdHlsZTo6c2V0QmFja2dyb3VuZENvbG9y
KSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBl
cjxpbnQ+KENTU1Byb3BlcnR5Rm9udFNpemUsICZSZW5kZXJTdHlsZTo6Zm9udFNpemUsICZSZW5k
ZXJTdHlsZTo6c2V0QmxlbmRlZEZvbnRTaXplKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJz
LT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjx1bnNpZ25lZCBzaG9ydD4oQ1NTUHJvcGVydHlX
ZWJraXRDb2x1bW5SdWxlV2lkdGgsICZSZW5kZXJTdHlsZTo6Y29sdW1uUnVsZVdpZHRoLCAmUmVu
ZGVyU3R5bGU6OnNldENvbHVtblJ1bGVXaWR0aCkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVy
cy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8ZmxvYXQ+KENTU1Byb3BlcnR5V2Via2l0Q29s
dW1uR2FwLCAmUmVuZGVyU3R5bGU6OmNvbHVtbkdhcCwgJlJlbmRlclN0eWxlOjpzZXRDb2x1bW5H
YXApKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFw
cGVyPHVuc2lnbmVkIHNob3J0PihDU1NQcm9wZXJ0eVdlYmtpdENvbHVtbkNvdW50LCAmUmVuZGVy
U3R5bGU6OmNvbHVtbkNvdW50LCAmUmVuZGVyU3R5bGU6OnNldENvbHVtbkNvdW50KSk7Ci0gICAg
ICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxmbG9hdD4o
Q1NTUHJvcGVydHlXZWJraXRDb2x1bW5XaWR0aCwgJlJlbmRlclN0eWxlOjpjb2x1bW5XaWR0aCwg
JlJlbmRlclN0eWxlOjpzZXRDb2x1bW5XaWR0aCkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVy
cy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8c2hvcnQ+KENTU1Byb3BlcnR5V2Via2l0Qm9y
ZGVySG9yaXpvbnRhbFNwYWNpbmcsICZSZW5kZXJTdHlsZTo6aG9yaXpvbnRhbEJvcmRlclNwYWNp
bmcsICZSZW5kZXJTdHlsZTo6c2V0SG9yaXpvbnRhbEJvcmRlclNwYWNpbmcpKTsKLSAgICAgICAg
Z1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyPHNob3J0PihDU1NQ
cm9wZXJ0eVdlYmtpdEJvcmRlclZlcnRpY2FsU3BhY2luZywgJlJlbmRlclN0eWxlOjp2ZXJ0aWNh
bEJvcmRlclNwYWNpbmcsICZSZW5kZXJTdHlsZTo6c2V0VmVydGljYWxCb3JkZXJTcGFjaW5nKSk7
Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxp
bnQ+KENTU1Byb3BlcnR5WkluZGV4LCAmUmVuZGVyU3R5bGU6OnpJbmRleCwgJlJlbmRlclN0eWxl
OjpzZXRaSW5kZXgpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJv
cGVydHlXcmFwcGVyPExlbmd0aD4oQ1NTUHJvcGVydHlMaW5lSGVpZ2h0LCAmUmVuZGVyU3R5bGU6
OmxpbmVIZWlnaHQsICZSZW5kZXJTdHlsZTo6c2V0TGluZUhlaWdodCkpOwotICAgICAgICBnUHJv
cGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8aW50PihDU1NQcm9wZXJ0
eU91dGxpbmVPZmZzZXQsICZSZW5kZXJTdHlsZTo6b3V0bGluZU9mZnNldCwgJlJlbmRlclN0eWxl
OjpzZXRPdXRsaW5lT2Zmc2V0KSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQo
bmV3IFByb3BlcnR5V3JhcHBlcjx1bnNpZ25lZCBzaG9ydD4oQ1NTUHJvcGVydHlPdXRsaW5lV2lk
dGgsICZSZW5kZXJTdHlsZTo6b3V0bGluZVdpZHRoLCAmUmVuZGVyU3R5bGU6OnNldE91dGxpbmVX
aWR0aCkpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdy
YXBwZXI8aW50PihDU1NQcm9wZXJ0eUxldHRlclNwYWNpbmcsICZSZW5kZXJTdHlsZTo6bGV0dGVy
U3BhY2luZywgJlJlbmRlclN0eWxlOjpzZXRMZXR0ZXJTcGFjaW5nKSk7Ci0gICAgICAgIGdQcm9w
ZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxpbnQ+KENTU1Byb3BlcnR5
V29yZFNwYWNpbmcsICZSZW5kZXJTdHlsZTo6d29yZFNwYWNpbmcsICZSZW5kZXJTdHlsZTo6c2V0
V29yZFNwYWNpbmcpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJv
cGVydHlXcmFwcGVyPGNvbnN0IFRyYW5zZm9ybU9wZXJhdGlvbnMmPihDU1NQcm9wZXJ0eVdlYmtp
dFRyYW5zZm9ybSwgJlJlbmRlclN0eWxlOjp0cmFuc2Zvcm0sICZSZW5kZXJTdHlsZTo6c2V0VHJh
bnNmb3JtKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5
V3JhcHBlcjxMZW5ndGg+KENTU1Byb3BlcnR5V2Via2l0VHJhbnNmb3JtT3JpZ2luWCwgJlJlbmRl
clN0eWxlOjp0cmFuc2Zvcm1PcmlnaW5YLCAmUmVuZGVyU3R5bGU6OnNldFRyYW5zZm9ybU9yaWdp
blgpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFw
cGVyPExlbmd0aD4oQ1NTUHJvcGVydHlXZWJraXRUcmFuc2Zvcm1PcmlnaW5ZLCAmUmVuZGVyU3R5
bGU6OnRyYW5zZm9ybU9yaWdpblksICZSZW5kZXJTdHlsZTo6c2V0VHJhbnNmb3JtT3JpZ2luWSkp
OwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8
Y29uc3QgSW50U2l6ZSY+KENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyVG9wTGVmdFJhZGl1cywgJlJl
bmRlclN0eWxlOjpib3JkZXJUb3BMZWZ0UmFkaXVzLCAmUmVuZGVyU3R5bGU6OnNldEJvcmRlclRv
cExlZnRSYWRpdXMpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChuZXcgUHJv
cGVydHlXcmFwcGVyPGNvbnN0IEludFNpemUmPihDU1NQcm9wZXJ0eVdlYmtpdEJvcmRlclRvcFJp
Z2h0UmFkaXVzLCAmUmVuZGVyU3R5bGU6OmJvcmRlclRvcFJpZ2h0UmFkaXVzLCAmUmVuZGVyU3R5
bGU6OnNldEJvcmRlclRvcFJpZ2h0UmFkaXVzKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJz
LT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxjb25zdCBJbnRTaXplJj4oQ1NTUHJvcGVydHlX
ZWJraXRCb3JkZXJCb3R0b21MZWZ0UmFkaXVzLCAmUmVuZGVyU3R5bGU6OmJvcmRlckJvdHRvbUxl
ZnRSYWRpdXMsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVyQm90dG9tTGVmdFJhZGl1cykpOwotICAg
ICAgICBnUHJvcGVydHlXcmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXI8Y29uc3Qg
SW50U2l6ZSY+KENTU1Byb3BlcnR5V2Via2l0Qm9yZGVyQm90dG9tUmlnaHRSYWRpdXMsICZSZW5k
ZXJTdHlsZTo6Ym9yZGVyQm90dG9tUmlnaHRSYWRpdXMsICZSZW5kZXJTdHlsZTo6c2V0Qm9yZGVy
Qm90dG9tUmlnaHRSYWRpdXMpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVuZChu
ZXcgUHJvcGVydHlXcmFwcGVyPEVWaXNpYmlsaXR5PihDU1NQcm9wZXJ0eVZpc2liaWxpdHksICZS
ZW5kZXJTdHlsZTo6dmlzaWJpbGl0eSwgJlJlbmRlclN0eWxlOjpzZXRWaXNpYmlsaXR5KSk7Ci0g
ICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlcjxmbG9h
dD4oQ1NTUHJvcGVydHlab29tLCAmUmVuZGVyU3R5bGU6Onpvb20sICZSZW5kZXJTdHlsZTo6c2V0
Wm9vbSkpOwotICAgICAgICAKLSAgICAgICAgLy8gRklYTUU6IHRoZXNlIG1pZ2h0IGJlIGludmFs
aWQgY29sb3JzLCBuZWVkIHRvIGNoZWNrIGZvciB0aGF0Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBw
ZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENvbG9yKENTU1Byb3Bl
cnR5V2Via2l0Q29sdW1uUnVsZUNvbG9yLCAmUmVuZGVyU3R5bGU6OmNvbHVtblJ1bGVDb2xvciwg
JlJlbmRlclN0eWxlOjpzZXRDb2x1bW5SdWxlQ29sb3IpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3Jh
cHBlcnMtPmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyTWF5YmVJbnZhbGlkQ29sb3IoQ1NTUHJv
cGVydHlXZWJraXRUZXh0U3Ryb2tlQ29sb3IsICZSZW5kZXJTdHlsZTo6dGV4dFN0cm9rZUNvbG9y
LCAmUmVuZGVyU3R5bGU6OnNldFRleHRTdHJva2VDb2xvcikpOwotICAgICAgICBnUHJvcGVydHlX
cmFwcGVycy0+YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXJNYXliZUludmFsaWRDb2xvcihDU1NQ
cm9wZXJ0eVdlYmtpdFRleHRGaWxsQ29sb3IsICZSZW5kZXJTdHlsZTo6dGV4dEZpbGxDb2xvciwg
JlJlbmRlclN0eWxlOjpzZXRUZXh0RmlsbENvbG9yKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBw
ZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENvbG9yKENTU1Byb3Bl
cnR5Qm9yZGVyTGVmdENvbG9yLCAmUmVuZGVyU3R5bGU6OmJvcmRlckxlZnRDb2xvciwgJlJlbmRl
clN0eWxlOjpzZXRCb3JkZXJMZWZ0Q29sb3IpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMt
PmFwcGVuZChuZXcgUHJvcGVydHlXcmFwcGVyTWF5YmVJbnZhbGlkQ29sb3IoQ1NTUHJvcGVydHlC
b3JkZXJSaWdodENvbG9yLCAmUmVuZGVyU3R5bGU6OmJvcmRlclJpZ2h0Q29sb3IsICZSZW5kZXJT
dHlsZTo6c2V0Qm9yZGVyUmlnaHRDb2xvcikpOwotICAgICAgICBnUHJvcGVydHlXcmFwcGVycy0+
YXBwZW5kKG5ldyBQcm9wZXJ0eVdyYXBwZXJNYXliZUludmFsaWRDb2xvcihDU1NQcm9wZXJ0eUJv
cmRlclRvcENvbG9yLCAmUmVuZGVyU3R5bGU6OmJvcmRlclRvcENvbG9yLCAmUmVuZGVyU3R5bGU6
OnNldEJvcmRlclRvcENvbG9yKSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQo
bmV3IFByb3BlcnR5V3JhcHBlck1heWJlSW52YWxpZENvbG9yKENTU1Byb3BlcnR5Qm9yZGVyQm90
dG9tQ29sb3IsICZSZW5kZXJTdHlsZTo6Ym9yZGVyQm90dG9tQ29sb3IsICZSZW5kZXJTdHlsZTo6
c2V0Qm9yZGVyQm90dG9tQ29sb3IpKTsKLSAgICAgICAgZ1Byb3BlcnR5V3JhcHBlcnMtPmFwcGVu
ZChuZXcgUHJvcGVydHlXcmFwcGVyTWF5YmVJbnZhbGlkQ29sb3IoQ1NTUHJvcGVydHlPdXRsaW5l
Q29sb3IsICZSZW5kZXJTdHlsZTo6b3V0bGluZUNvbG9yLCAmUmVuZGVyU3R5bGU6OnNldE91dGxp
bmVDb2xvcikpOwotICAgICAgICAKLSAgICAgICAgLy8gVGhlc2UgYXJlIGZvciBzaGFkb3dzCi0g
ICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5hcHBlbmQobmV3IFByb3BlcnR5V3JhcHBlclNoYWRv
dyhDU1NQcm9wZXJ0eVdlYmtpdEJveFNoYWRvdywgJlJlbmRlclN0eWxlOjpib3hTaGFkb3csICZS
ZW5kZXJTdHlsZTo6c2V0Qm94U2hhZG93KSk7Ci0gICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJzLT5h
cHBlbmQobmV3IFByb3BlcnR5V3JhcHBlclNoYWRvdyhDU1NQcm9wZXJ0eVRleHRTaGFkb3csICZS
ZW5kZXJTdHlsZTo6dGV4dFNoYWRvdywgJlJlbmRlclN0eWxlOjpzZXRUZXh0U2hhZG93KSk7Ci0g
ICAgICAgIAotICAgICAgICAvLyBNYWtlIHN1cmUgdW51c2VkIHNsb3RzIGhhdmUgYSB2YWx1ZQot
ICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8ICh1bnNpZ25lZCBpbnQpIG51bUNT
U1Byb3BlcnRpZXM7ICsraSkKLSAgICAgICAgICAgIGdQcm9wZXJ0eVdyYXBwZXJNYXBbaV0gPSBD
U1NQcm9wZXJ0eUludmFsaWQ7Ci0gICAgICAgIAotICAgICAgICBzaXplX3QgbiA9IGdQcm9wZXJ0
eVdyYXBwZXJzLT5zaXplKCk7Ci0gICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwg
bjsgKytpKSB7Ci0gICAgICAgICAgICBBU1NFUlQoKCpnUHJvcGVydHlXcmFwcGVycylbaV0tPnBy
b3BlcnR5KCkgLSBmaXJzdENTU1Byb3BlcnR5IDwgbnVtQ1NTUHJvcGVydGllcyk7Ci0gICAgICAg
ICAgICBnUHJvcGVydHlXcmFwcGVyTWFwWygqZ1Byb3BlcnR5V3JhcHBlcnMpW2ldLT5wcm9wZXJ0
eSgpIC0gZmlyc3RDU1NQcm9wZXJ0eV0gPSBpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBz
dGF0aWMKLWJvb2wgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OnByb3BlcnRpZXNFcXVhbChp
bnQgcHJvcCwgY29uc3QgUmVuZGVyU3R5bGUqIGEsIGNvbnN0IFJlbmRlclN0eWxlKiBiKQotewot
ICAgIGlmIChwcm9wID09IGNBbmltYXRlQWxsKSB7Ci0gICAgICAgIHNpemVfdCBuID0gZ1Byb3Bl
cnR5V3JhcHBlcnMtPnNpemUoKTsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkg
PCBuOyArK2kpIHsKLSAgICAgICAgICAgIGlmICghKCpnUHJvcGVydHlXcmFwcGVycylbaV0tPmVx
dWFscyhhLCBiKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAg
ICB9Ci0gICAgZWxzZSB7Ci0gICAgICAgIGludCBwcm9wSW5kZXggPSBwcm9wIC0gZmlyc3RDU1NQ
cm9wZXJ0eTsKLSAgICAgICAgCi0gICAgICAgIGlmIChwcm9wSW5kZXggPj0gMCAmJiBwcm9wSW5k
ZXggPCBudW1DU1NQcm9wZXJ0aWVzKSB7Ci0gICAgICAgICAgICBpbnQgaSA9IGdQcm9wZXJ0eVdy
YXBwZXJNYXBbcHJvcEluZGV4XTsKLSAgICAgICAgICAgIHJldHVybiAoaSA+PSAwKSA/ICgqZ1By
b3BlcnR5V3JhcHBlcnMpW2ldLT5lcXVhbHMoYSwgYikgOiB0cnVlOwotICAgICAgICB9Ci0gICAg
fQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBzdGF0aWMKLWludCBBbmltYXRpb25Db250cm9s
bGVyUHJpdmF0ZTo6Z2V0UHJvcGVydHlBdEluZGV4KGludCBpKQotewotICAgIGlmIChpIDwgMCB8
fCBpID49IChpbnQpIGdQcm9wZXJ0eVdyYXBwZXJzLT5zaXplKCkpCi0gICAgICAgIHJldHVybiBD
U1NQcm9wZXJ0eUludmFsaWQ7Ci0gICAgICAgIAotICAgIHJldHVybiAoKmdQcm9wZXJ0eVdyYXBw
ZXJzKVtpXS0+cHJvcGVydHkoKTsKLX0KLSAgICAKLS8vIHN0YXRpYyAtIHJldHVybiB0cnVlIGlm
IHdlIG5lZWQgdG8gc3RhcnQgc29mdHdhcmUgYW5pbWF0aW9uIHRpbWVycwotYm9vbCBBbmltYXRp
b25Db250cm9sbGVyUHJpdmF0ZTo6YmxlbmRQcm9wZXJ0aWVzKGludCBwcm9wLCBSZW5kZXJTdHls
ZSogZHN0LCBjb25zdCBSZW5kZXJTdHlsZSogYSwgY29uc3QgUmVuZGVyU3R5bGUqIGIsIGRvdWJs
ZSBwcm9nKQotewotICAgIGlmIChwcm9wID09IGNBbmltYXRlQWxsKSB7Ci0gICAgICAgIEFTU0VS
VCgwKTsKLSAgICAgICAgYm9vbCBuZWVkc1RpbWVyID0gZmFsc2U7Ci0gICAgCi0gICAgICAgIHNp
emVfdCBuID0gZ1Byb3BlcnR5V3JhcHBlcnMtPnNpemUoKTsKLSAgICAgICAgZm9yICh1bnNpZ25l
ZCBpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgIFByb3BlcnR5V3JhcHBlckJh
c2UqIHdyYXBwZXIgPSAoKmdQcm9wZXJ0eVdyYXBwZXJzKVtpXTsKLSAgICAgICAgICAgIGlmICgh
d3JhcHBlci0+ZXF1YWxzKGEsIGIpKSB7Ci0gICAgICAgICAgICAgICAgd3JhcHBlci0+YmxlbmQo
ZHN0LCBhLCBiLCBwcm9nKTsKLSAgICAgICAgICAgICAgICBuZWVkc1RpbWVyID0gdHJ1ZTsKLSAg
ICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmVlZHNUaW1lcjsKLSAgICB9
Ci0gICAgCi0gICAgaW50IHByb3BJbmRleCA9IHByb3AgLSBmaXJzdENTU1Byb3BlcnR5OwotICAg
IGlmIChwcm9wSW5kZXggPj0gMCAmJiBwcm9wSW5kZXggPCBudW1DU1NQcm9wZXJ0aWVzKSB7Ci0g
ICAgICAgIGludCBpID0gZ1Byb3BlcnR5V3JhcHBlck1hcFtwcm9wSW5kZXhdOwotICAgICAgICBp
ZiAoaSA+PSAwKSB7Ci0gICAgICAgICAgICBQcm9wZXJ0eVdyYXBwZXJCYXNlKiB3cmFwcGVyID0g
KCpnUHJvcGVydHlXcmFwcGVycylbaV07Ci0gICAgICAgICAgICB3cmFwcGVyLT5ibGVuZChkc3Qs
IGEsIGIsIHByb2cpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9
Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCiBDb21wb3NpdGVBbmltYXRpb24qIEFuaW1h
dGlvbkNvbnRyb2xsZXJQcml2YXRlOjphY2Nlc3NDb21wb3NpdGVBbmltYXRpb24oUmVuZGVyT2Jq
ZWN0KiByZW5kZXJlcikKIHsKICAgICBDb21wb3NpdGVBbmltYXRpb24qIGFuaW1hdGlvbiA9IG1f
Y29tcG9zaXRlQW5pbWF0aW9ucy5nZXQocmVuZGVyZXIpOwogICAgIGlmICghYW5pbWF0aW9uKSB7
Ci0gICAgICAgIGFuaW1hdGlvbiA9IG5ldyBDb21wb3NpdGVBbmltYXRpb24odGhpcyk7CisgICAg
ICAgIGFuaW1hdGlvbiA9IG5ldyBDb21wb3NpdGVBbmltYXRpb24obV9mcmFtZS0+YW5pbWF0aW9u
KCkpOwogICAgICAgICBtX2NvbXBvc2l0ZUFuaW1hdGlvbnMuc2V0KHJlbmRlcmVyLCBhbmltYXRp
b24pOwogICAgIH0KICAgICByZXR1cm4gYW5pbWF0aW9uOwpAQCAtMTI5NSw5ICsxMDYsNiBAQCBi
b29sIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpjbGVhcihSCiAKIHZvaWQgQW5pbWF0aW9u
Q29udHJvbGxlclByaXZhdGU6OnN0eWxlQXZhaWxhYmxlKCkKIHsKLSAgICBpZiAobV9udW1TdHls
ZUF2YWlsYWJsZVdhaXRlcnMgPT0gMCkKLSAgICAgICAgcmV0dXJuOwotICAgIAogICAgIFJlbmRl
ck9iamVjdEFuaW1hdGlvbk1hcDo6Y29uc3RfaXRlcmF0b3IgYW5pbWF0aW9uc0VuZCA9IG1fY29t
cG9zaXRlQW5pbWF0aW9ucy5lbmQoKTsKICAgICBmb3IgKFJlbmRlck9iamVjdEFuaW1hdGlvbk1h
cDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2NvbXBvc2l0ZUFuaW1hdGlvbnMuYmVnaW4oKTsgCiAg
ICAgICAgICBpdCAhPSBhbmltYXRpb25zRW5kOyArK2l0KSB7CkBAIC0xMzUzLDcgKzE2MSwxMCBA
QCB2b2lkIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjphbmltYXRpCiAgICAgICAgIGlmICgh
Y29tcEFuaW0tPnN1c3BlbmRlZCgpICYmIGNvbXBBbmltLT5hbmltYXRpbmcoKSkgewogICAgICAg
ICAgICAgYW5pbWF0aW5nID0gdHJ1ZTsKICAgICAgICAgICAgIGNvbXBBbmltLT5zZXRBbmltYXRp
bmcoZmFsc2UpOwotICAgICAgICAgICAgc2V0Q2hhbmdlZChyZW5kZXJlci0+ZWxlbWVudCgpKTsK
KyAgICAgICAgICAgIAorICAgICAgICAgICAgTm9kZSogbm9kZSA9IHJlbmRlcmVyLT5lbGVtZW50
KCk7CisgICAgICAgICAgICBBU1NFUlQoIW5vZGUgfHwgKG5vZGUtPmRvY3VtZW50KCkgJiYgIW5v
ZGUtPmRvY3VtZW50KCktPmluUGFnZUNhY2hlKCkpKTsKKyAgICAgICAgICAgIG5vZGUtPnNldENo
YW5nZWQoQW5pbWF0aW9uU3R5bGVDaGFuZ2UpOwogICAgICAgICB9CiAgICAgfQogICAgIApAQCAt
MTM5OCw2NzkgKzIwOSw5IEBAIHZvaWQgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OnJlc3Vt
ZUEKICAgICB1cGRhdGVBbmltYXRpb25UaW1lcigpOwogfQogCi12b2lkIENvbXBvc2l0ZUFuaW1h
dGlvbjo6dXBkYXRlVHJhbnNpdGlvbnMoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVu
ZGVyU3R5bGUqIGN1cnJlbnRTdHlsZSwgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlKQotewotICAg
IC8vIElmIGN1cnJlbnRTdHlsZSBpcyBudWxsLCB3ZSBkb24ndCBkbyB0cmFuc2l0aW9ucwotICAg
IGlmICghY3VycmVudFN0eWxlIHx8ICF0YXJnZXRTdHlsZS0+dHJhbnNpdGlvbnMoKSkKLSAgICAg
ICAgcmV0dXJuOwotICAgICAgICAKLSAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byB1
cGRhdGUgdGhlIGFjdGl2ZSB0cmFuc2l0aW9ucwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwg
dGFyZ2V0U3R5bGUtPnRyYW5zaXRpb25zKCktPnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0
IEFuaW1hdGlvbiogYW5pbSA9ICgqdGFyZ2V0U3R5bGUtPnRyYW5zaXRpb25zKCkpW2ldLmdldCgp
OwotICAgICAgICBkb3VibGUgZHVyYXRpb24gPSBhbmltLT5kdXJhdGlvbigpOwotICAgICAgICBk
b3VibGUgZGVsYXkgPSBhbmltLT5kZWxheSgpOwotCi0gICAgICAgIC8vIElmIHRoaXMgaXMgYW4g
ZW1wdHkgdHJhbnNpdGlvbiwgc2tpcCBpdAotICAgICAgICBpZiAoZHVyYXRpb24gPT0gMCAmJiBk
ZWxheSA8PSAwKQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAKLSAgICAgICAgaW50
IHByb3AgPSBhbmltLT5wcm9wZXJ0eSgpOwotICAgICAgICBib29sIGFsbCA9IHByb3AgPT0gY0Fu
aW1hdGVBbGw7Ci0gICAgICAgIAotICAgICAgICAvLyBIYW5kbGUgYm90aCB0aGUgJ2FsbCcgYW5k
IHNpbmdsZSBwcm9wZXJ0eSBjYXNlcy4gRm9yIHRoZSBzaW5nbGUgcHJvcCBjYXNlLCB3ZSBtYWtl
IG9ubHkgb25lIHBhc3MKLSAgICAgICAgLy8gdGhyb3VnaCB0aGUgbG9vcAotICAgICAgICBmb3Ig
KGludCBwcm9wZXJ0eUluZGV4ID0gMDsgOyArK3Byb3BlcnR5SW5kZXgpIHsKLSAgICAgICAgICAg
IGlmIChhbGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlJbmRleCA+PSBBbmltYXRp
b25Db250cm9sbGVyUHJpdmF0ZTo6Z2V0TnVtUHJvcGVydGllcygpKQotICAgICAgICAgICAgICAg
ICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIG5leHQgcHJvcAotICAgICAg
ICAgICAgICAgIHByb3AgPSBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6Z2V0UHJvcGVydHlB
dEluZGV4KHByb3BlcnR5SW5kZXgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJ
bXBsaWNpdEFuaW1hdGlvbnMgYXJlIGFsd2F5cyBoYXNoZWQgYnkgYWN0dWFsIHByb3BlcnRpZXMs
IG5ldmVyIGNBbmltYXRlQWxsCi0gICAgICAgICAgICBBU1NFUlQocHJvcCA+IGZpcnN0Q1NTUHJv
cGVydHkgJiYgcHJvcCA8IChmaXJzdENTU1Byb3BlcnR5ICsgbnVtQ1NTUHJvcGVydGllcykpOwot
Ci0gICAgICAgICAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYSBjdXJyZW50IHRyYW5zaXRpb24gZm9y
IHRoaXMgcHJvcAotICAgICAgICAgICAgSW1wbGljaXRBbmltYXRpb24qIGltcGxBbmltID0gbV90
cmFuc2l0aW9ucy5nZXQocHJvcCk7Ci0gICAgICAgICAgICBib29sIGVxdWFsID0gdHJ1ZTsKLSAg
ICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGltcGxBbmltKSB7Ci0gICAgICAgICAgICAgICAg
Ly8gVGhlcmUgaXMgb25lLCBoYXMgb3VyIHRhcmdldCBjaGFuZ2VkPwotICAgICAgICAgICAgICAg
IGlmICghaW1wbEFuaW0tPmlzVGFyZ2V0UHJvcGVydHlFcXVhbChwcm9wLCB0YXJnZXRTdHlsZSkp
IHsKLSAgICAgICAgICAgICAgICAgICAgaW1wbEFuaW0tPnJlc2V0KHJlbmRlcmVyKTsKLSAgICAg
ICAgICAgICAgICAgICAgZGVsZXRlIGltcGxBbmltOwotICAgICAgICAgICAgICAgICAgICBtX3Ry
YW5zaXRpb25zLnJlbW92ZShwcm9wKTsKLSAgICAgICAgICAgICAgICAgICAgZXF1YWwgPSBmYWxz
ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAg
ICAgIC8vIFNlZSBpZiB3ZSBuZWVkIHRvIHN0YXJ0IGEgbmV3IHRyYW5zaXRpb24KLSAgICAgICAg
ICAgICAgICBlcXVhbCA9IEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpwcm9wZXJ0aWVzRXF1
YWwocHJvcCwgY3VycmVudFN0eWxlLCB0YXJnZXRTdHlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAg
ICAgICAgICAKLSAgICAgICAgICAgIGlmICghZXF1YWwpIHsKLSAgICAgICAgICAgICAgICAvLyBB
ZGQgdGhlIG5ldyB0cmFuc2l0aW9uCi0gICAgICAgICAgICAgICAgSW1wbGljaXRBbmltYXRpb24q
IGFuaW1hdGlvbiA9IG5ldyBJbXBsaWNpdEFuaW1hdGlvbihjb25zdF9jYXN0PEFuaW1hdGlvbio+
KGFuaW0pLCBwcm9wLCByZW5kZXJlciwgdGhpcyk7Ci0gICAgICAgICAgICAgICAgbV90cmFuc2l0
aW9ucy5zZXQocHJvcCwgYW5pbWF0aW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAot
ICAgICAgICAgICAgLy8gV2Ugb25seSBuZWVkIG9uZSBwYXNzIGZvciB0aGUgc2luZ2xlIHByb3Ag
Y2FzZQotICAgICAgICAgICAgaWYgKCFhbGwpCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjp1cGRhdGVLZXlmcmFt
ZUFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5bGUqIGN1
cnJlbnRTdHlsZSwgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlKQotewotICAgIC8vIE5vdGhpbmcg
dG8gZG8gaWYgd2UgZG9uJ3QgaGF2ZSBhbnkgYW5pbWF0aW9ucywgYW5kIGRpZG4ndCBoYXZlIGFu
eSBiZWZvcmUKLSAgICBpZiAobV9rZXlmcmFtZUFuaW1hdGlvbnMuaXNFbXB0eSgpICYmICF0YXJn
ZXRTdHlsZS0+aGFzQW5pbWF0aW9ucygpKQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgLy8g
Tm90aGluZyB0byBkbyBpZiB0aGUgY3VycmVudCBhbmQgdGFyZ2V0IGFuaW1hdGlvbnMgYXJlIHRo
ZSBzYW1lCi0gICAgaWYgKGN1cnJlbnRTdHlsZSAmJiBjdXJyZW50U3R5bGUtPmhhc0FuaW1hdGlv
bnMoKSAmJiB0YXJnZXRTdHlsZS0+aGFzQW5pbWF0aW9ucygpICYmICooY3VycmVudFN0eWxlLT5h
bmltYXRpb25zKCkpID09ICoodGFyZ2V0U3R5bGUtPmFuaW1hdGlvbnMoKSkpCi0gICAgICAgIHJl
dHVybjsKLSAgICAgICAgCi0gICAgaW50IG51bUFuaW1zID0gMDsKLSAgICBib29sIGFuaW1zQ2hh
bmdlZCA9IGZhbHNlOwotICAgIAotICAgIC8vIHNlZSBpZiB0aGUgbGlzdHMgbWF0Y2gKLSAgICBp
ZiAodGFyZ2V0U3R5bGUtPmFuaW1hdGlvbnMoKSkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0g
MDsgaSA8IHRhcmdldFN0eWxlLT5hbmltYXRpb25zKCktPnNpemUoKTsgKytpKSB7Ci0gICAgICAg
ICAgICBjb25zdCBBbmltYXRpb24qIGFuaW0gPSAoKnRhcmdldFN0eWxlLT5hbmltYXRpb25zKCkp
W2ldLmdldCgpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIWFuaW0tPmlzVmFsaWRB
bmltYXRpb24oKSkKLSAgICAgICAgICAgICAgICBhbmltc0NoYW5nZWQgPSB0cnVlOwotICAgICAg
ICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgQXRvbWljU3RyaW5nIG5hbWUoYW5pbS0+bmFt
ZSgpKTsKLSAgICAgICAgICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbioga2ZBbmltID0gbV9rZXlm
cmFtZUFuaW1hdGlvbnMuZ2V0KG5hbWUuaW1wbCgpKTsKLSAgICAgICAgICAgICAgICBpZiAoIWtm
QW5pbSB8fCAha2ZBbmltLT5hbmltYXRpb25zTWF0Y2goYW5pbSkpCi0gICAgICAgICAgICAgICAg
ICAgIGFuaW1zQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAg
ICAgICAgICAgICBpZiAoYW5pbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5pbWF0
aW9ucyBtYXRjaCwgYnV0IHBsYXkgc3RhdGVzIG1heSBkaWZmZXIuIHVwZGF0ZSBpZiBuZWVkZWQK
LSAgICAgICAgICAgICAgICAgICAgICAgIGtmQW5pbS0+dXBkYXRlUGxheVN0YXRlKGFuaW0tPnBs
YXlTdGF0ZSgpID09IEFuaW1QbGF5U3RhdGVQbGF5aW5nKTsKLSAgICAgICAgICAgICAgICAgICAg
ICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSBzYXZlZCBhbmltYXRpb24g
dG8gdGhpcyBuZXcgb25lLCBqdXN0IGluIGNhc2UgdGhlIHBsYXkgc3RhdGUgaGFzIGNoYW5nZWQK
LSAgICAgICAgICAgICAgICAgICAgICAgIGtmQW5pbS0+c2V0QW5pbWF0aW9uKGFuaW0pOwotICAg
ICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICArK251bUFuaW1z
OwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmICghYW5pbXNDaGFuZ2VkICYmIG1fa2V5
ZnJhbWVBbmltYXRpb25zLnNpemUoKSAhPSBudW1BbmltcykKLSAgICAgICAgYW5pbXNDaGFuZ2Vk
ID0gdHJ1ZTsKLQotICAgIGlmICghYW5pbXNDaGFuZ2VkKQotICAgICAgICByZXR1cm47Ci0KLSAg
ICAvLyBhbmltYXRpb25zIGhhdmUgY2hhbmdlZCwgdXBkYXRlIHRoZSBsaXN0Ci0gICAgcmVzZXRB
bmltYXRpb25zKHJlbmRlcmVyKTsKLQotICAgIGlmICghdGFyZ2V0U3R5bGUtPmFuaW1hdGlvbnMo
KSkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgLy8gYWRkIGFsbCB0aGUgbmV3IGFuaW1hdGlvbnMK
LSAgICBpbnQgaW5kZXggPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGFyZ2V0U3R5
bGUtPmFuaW1hdGlvbnMoKS0+c2l6ZSgpOyArK2kpIHsKLSAgICAgICAgY29uc3QgQW5pbWF0aW9u
KiBhbmltID0gKCp0YXJnZXRTdHlsZS0+YW5pbWF0aW9ucygpKVtpXS5nZXQoKTsKLQotICAgICAg
ICBpZiAoIWFuaW0tPmlzVmFsaWRBbmltYXRpb24oKSkKLSAgICAgICAgICAgIGNvbnRpbnVlOwot
ICAgICAgICAgICAgCi0gICAgICAgIC8vIGRvbid0IGJvdGhlciBhZGRpbmcgdGhlIGFuaW1hdGlv
biBpZiBpdCBoYXMgbm8ga2V5ZnJhbWVzIG9yIHdvbid0IGFuaW1hdGUKLSAgICAgICAgaWYgKChh
bmltLT5kdXJhdGlvbigpIHx8IGFuaW0tPmRlbGF5KCkpICYmIGFuaW0tPml0ZXJhdGlvbkNvdW50
KCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbS0+
a2V5ZnJhbWVMaXN0KCkuZ2V0KCkgJiYgIWFuaW0tPmtleWZyYW1lTGlzdCgpLT5pc0VtcHR5KCkp
IHsKLSAgICAgICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBrZmFuaW0gPSBuZXcgS2V5ZnJhbWVB
bmltYXRpb24oY29uc3RfY2FzdDxBbmltYXRpb24qPihhbmltKSwgcmVuZGVyZXIsIGluZGV4Kyss
IHRoaXMpOwotICAgICAgICAgICAgbV9rZXlmcmFtZUFuaW1hdGlvbnMuc2V0KGtmYW5pbS0+bmFt
ZSgpLmltcGwoKSwga2ZhbmltKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotS2V5ZnJhbWVBbmlt
YXRpb24qIENvbXBvc2l0ZUFuaW1hdGlvbjo6ZmluZEtleWZyYW1lQW5pbWF0aW9uKGNvbnN0IEF0
b21pY1N0cmluZyYgbmFtZSkKLXsKLSAgICByZXR1cm4gbV9rZXlmcmFtZUFuaW1hdGlvbnMuZ2V0
KG5hbWUuaW1wbCgpKTsKLX0KLQotUmVuZGVyU3R5bGUqIENvbXBvc2l0ZUFuaW1hdGlvbjo6YW5p
bWF0ZShSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBjb25zdCBSZW5kZXJTdHlsZSogY3VycmVudFN0
eWxlLCBSZW5kZXJTdHlsZSogdGFyZ2V0U3R5bGUpCi17Ci0gICAgUmVuZGVyU3R5bGUqIHJlc3Vs
dFN0eWxlID0gMDsKLSAgICAKLSAgICAvLyBXZSBkb24ndCBkbyBhbnkgdHJhbnNpdGlvbnMgaWYg
d2UgZG9uJ3QgaGF2ZSBhIGN1cnJlbnRTdHlsZSAob24gc3RhcnR1cCkKLSAgICB1cGRhdGVUcmFu
c2l0aW9ucyhyZW5kZXJlciwgY3VycmVudFN0eWxlLCB0YXJnZXRTdHlsZSk7Ci0gICAgCi0gICAg
aWYgKGN1cnJlbnRTdHlsZSkgewotICAgICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIHRyYW5zaXRp
b24gb2JqZWN0cyByZWFkeSwgbGV0IHRoZW0ga25vdyBhYm91dCB0aGUgbmV3IGdvYWwgc3RhdGUu
ICBXZSB3YW50IHRoZW0KLSAgICAgICAgLy8gdG8gZmlsbCBpbiBhIFJlbmRlclN0eWxlKiYgb25s
eSBpZiBuZWVkZWQuCi0gICAgICAgIENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0
ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7Ci0gICAgICAgIGZvciAoQ1NTUHJvcGVy
dHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2lu
KCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgICAgICAgSW1wbGljaXRBbmltYXRpb24qICBh
bmltID0gaXQtPnNlY29uZDsKLSAgICAgICAgICAgIGlmIChhbmltKSB7Ci0gICAgICAgICAgICAg
ICAgYW5pbS0+YW5pbWF0ZSh0aGlzLCByZW5kZXJlciwgY3VycmVudFN0eWxlLCB0YXJnZXRTdHls
ZSwgcmVzdWx0U3R5bGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAg
dXBkYXRlS2V5ZnJhbWVBbmltYXRpb25zKHJlbmRlcmVyLCBjdXJyZW50U3R5bGUsIHRhcmdldFN0
eWxlKTsKLQotICAgIC8vIE5vdyB0aGF0IHdlIGhhdmUgYW5pbWF0aW9uIG9iamVjdHMgcmVhZHks
IGxldCB0aGVtIGtub3cgYWJvdXQgdGhlIG5ldyBnb2FsIHN0YXRlLiAgV2Ugd2FudCB0aGVtCi0g
ICAgLy8gdG8gZmlsbCBpbiBhIFJlbmRlclN0eWxlKiYgb25seSBpZiBuZWVkZWQuCi0gICAgaWYg
KHRhcmdldFN0eWxlLT5oYXNBbmltYXRpb25zKCkpIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9
IDA7IGkgPCB0YXJnZXRTdHlsZS0+YW5pbWF0aW9ucygpLT5zaXplKCk7ICsraSkgewotICAgICAg
ICAgICAgY29uc3QgQW5pbWF0aW9uKiBhbmltID0gKCp0YXJnZXRTdHlsZS0+YW5pbWF0aW9ucygp
KVtpXS5nZXQoKTsKLQotICAgICAgICAgICAgaWYgKGFuaW0tPmlzVmFsaWRBbmltYXRpb24oKSkg
ewotICAgICAgICAgICAgICAgIEF0b21pY1N0cmluZyBuYW1lKGFuaW0tPm5hbWUoKSk7Ci0gICAg
ICAgICAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGtleWZyYW1lQW5pbSA9IG1fa2V5ZnJhbWVB
bmltYXRpb25zLmdldChuYW1lLmltcGwoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGtleWZyYW1l
QW5pbSkKLSAgICAgICAgICAgICAgICAgICAga2V5ZnJhbWVBbmltLT5hbmltYXRlKHRoaXMsIHJl
bmRlcmVyLCBjdXJyZW50U3R5bGUsIHRhcmdldFN0eWxlLCByZXN1bHRTdHlsZSk7Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgY2xlYW51cEZpbmlzaGVkQW5pbWF0
aW9ucyhyZW5kZXJlcik7Ci0KLSAgICByZXR1cm4gcmVzdWx0U3R5bGUgPyByZXN1bHRTdHlsZSA6
IHRhcmdldFN0eWxlOwotfQotCi0vLyAiYW5pbWF0aW5nIiBtZWFucyB0aGF0IHNvbWV0aGluZyBp
cyBydW5uaW5nIHRoYXQgcmVxdWlyZXMgdGhlIHRpbWVyIHRvIGtlZXAgZmlyaW5nCi0vLyAoZS5n
LiBhIHRyYW5zaXRpb24pCi12b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6c2V0QW5pbWF0aW5nKGJv
b2wgaW5BbmltYXRpbmcpCi17Ci0gICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3Rf
aXRlcmF0b3IgZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKLSAgICBmb3IgKENTU1Byb3BlcnR5
VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5iZWdpbigp
OyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgSW1wbGljaXRBbmltYXRpb24qICB0cmFuc2l0
aW9uID0gaXQtPnNlY29uZDsKLSAgICAgICAgdHJhbnNpdGlvbi0+c2V0QW5pbWF0aW5nKGluQW5p
bWF0aW5nKTsKLSAgICB9Ci0KLSAgICBBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBr
ZmVuZCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmVuZCgpOwotICAgIGZvciAoQW5pbWF0aW9uTmFt
ZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5iZWdpbigpOyBp
dCAhPSBrZmVuZDsgKytpdCkgewotICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbiogYW5pbSA9IGl0
LT5zZWNvbmQ7Ci0gICAgICAgIGFuaW0tPnNldEFuaW1hdGluZyhpbkFuaW1hdGluZyk7Ci0gICAg
fQotfQotCi1ib29sIENvbXBvc2l0ZUFuaW1hdGlvbjo6YW5pbWF0aW5nKCkKLXsKLSAgICBDU1NQ
cm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3RyYW5zaXRpb25z
LmVuZCgpOwotICAgIGZvciAoQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0
b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgewotICAgICAg
ICBJbXBsaWNpdEFuaW1hdGlvbiogIHRyYW5zaXRpb24gPSBpdC0+c2Vjb25kOwotICAgICAgICBp
ZiAodHJhbnNpdGlvbiAmJiB0cmFuc2l0aW9uLT5hbmltYXRpbmcoKSAmJiB0cmFuc2l0aW9uLT5y
dW5uaW5nKCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgQW5p
bWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0aW9u
cy5lbmQoKTsKLSAgICBmb3IgKEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0g
bV9rZXlmcmFtZUFuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0ga2ZlbmQ7ICsraXQpIHsKLSAgICAg
ICAgS2V5ZnJhbWVBbmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOwotICAgICAgICBpZiAoYW5p
bSAmJiAhYW5pbS0+cGF1c2VkKCkgJiYgYW5pbS0+YW5pbWF0aW5nKCkgJiYgYW5pbS0+YWN0aXZl
KCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7
Ci19Ci0KLXZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpyZXNldFRyYW5zaXRpb25zKFJlbmRlck9i
amVjdCogcmVuZGVyZXIpCi17Ci0gICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3Rf
aXRlcmF0b3IgZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKLSAgICBmb3IgKENTU1Byb3BlcnR5
VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5iZWdpbigp
OyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgSW1wbGljaXRBbmltYXRpb24qICB0cmFuc2l0
aW9uID0gaXQtPnNlY29uZDsKLSAgICAgICAgdHJhbnNpdGlvbi0+cmVzZXQocmVuZGVyZXIpOwot
ICAgICAgICBkZWxldGUgdHJhbnNpdGlvbjsKLSAgICB9Ci0gICAgbV90cmFuc2l0aW9ucy5jbGVh
cigpOwotfQotCi12b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6cmVzZXRBbmltYXRpb25zKFJlbmRl
ck9iamVjdCogcmVuZGVyZXIpCi17Ci0gICAgZGVsZXRlQWxsVmFsdWVzKG1fa2V5ZnJhbWVBbmlt
YXRpb25zKTsKLSAgICBtX2tleWZyYW1lQW5pbWF0aW9ucy5jbGVhcigpOwotfQotCi12b2lkIENv
bXBvc2l0ZUFuaW1hdGlvbjo6Y2xlYW51cEZpbmlzaGVkQW5pbWF0aW9ucyhSZW5kZXJPYmplY3Qq
IHJlbmRlcmVyKQotewotICAgIGlmIChzdXNwZW5kZWQoKSkKLSAgICAgICAgcmV0dXJuOwotICAg
IAotICAgIC8vIE1ha2UgYSBsaXN0IG9mIHRyYW5zaXRpb25zIHRvIGJlIGRlbGV0ZWQKLSAgICBW
ZWN0b3I8aW50PiBmaW5pc2hlZFRyYW5zaXRpb25zOwotICAgIENTU1Byb3BlcnR5VHJhbnNpdGlv
bnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7Ci0KLSAgICBm
b3IgKENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFu
c2l0aW9ucy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgSW1wbGljaXRBbmlt
YXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOwotICAgICAgICBpZiAoIWFuaW0pCi0gICAgICAgICAg
ICBjb250aW51ZTsKLSAgICAgICAgaWYgKGFuaW0tPnBvc3RhY3RpdmUoKSAmJiAhYW5pbS0+d2Fp
dGluZ0ZvckVuZEV2ZW50KCkpCi0gICAgICAgICAgICBmaW5pc2hlZFRyYW5zaXRpb25zLmFwcGVu
ZChhbmltLT5hbmltYXRpbmdQcm9wZXJ0eSgpKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gRGVsZXRl
IHRoZW0KLSAgICBmb3IgKFZlY3RvcjxpbnQ+OjppdGVyYXRvciBpdCA9IGZpbmlzaGVkVHJhbnNp
dGlvbnMuYmVnaW4oKTsgaXQgIT0gZmluaXNoZWRUcmFuc2l0aW9ucy5lbmQoKTsgKytpdCkgewot
ICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogYW5pbSA9IG1fdHJhbnNpdGlvbnMuZ2V0KCppdCk7
Ci0gICAgICAgIGlmIChhbmltKSB7Ci0gICAgICAgICAgICBhbmltLT5yZXNldChyZW5kZXJlcik7
Ci0gICAgICAgICAgICBkZWxldGUgYW5pbTsKLSAgICAgICAgfQotICAgICAgICBtX3RyYW5zaXRp
b25zLnJlbW92ZSgqaXQpOwotICAgIH0KLQotICAgIC8vIE1ha2UgYSBsaXN0IG9mIGFuaW1hdGlv
bnMgdG8gYmUgZGVsZXRlZAotICAgIFZlY3RvcjxBdG9taWNTdHJpbmdJbXBsKj4gZmluaXNoZWRB
bmltYXRpb25zOwotICAgIEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0g
bV9rZXlmcmFtZUFuaW1hdGlvbnMuZW5kKCk7Ci0KLSAgICBmb3IgKEFuaW1hdGlvbk5hbWVNYXA6
OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0g
a2ZlbmQ7ICsraXQpIHsKLSAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGFuaW0gPSBpdC0+c2Vj
b25kOwotICAgICAgICBpZiAoIWFuaW0pCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAg
aWYgKGFuaW0tPnBvc3RhY3RpdmUoKSAmJiAhYW5pbS0+d2FpdGluZ0ZvckVuZEV2ZW50KCkpCi0g
ICAgICAgICAgICBmaW5pc2hlZEFuaW1hdGlvbnMuYXBwZW5kKGFuaW0tPm5hbWUoKS5pbXBsKCkp
OwotICAgIH0KLSAgICAKLSAgICAvLyBkZWxldGUgdGhlbQotICAgIGZvciAoVmVjdG9yPEF0b21p
Y1N0cmluZ0ltcGwqPjo6aXRlcmF0b3IgaXQgPSBmaW5pc2hlZEFuaW1hdGlvbnMuYmVnaW4oKTsg
aXQgIT0gZmluaXNoZWRBbmltYXRpb25zLmVuZCgpOyArK2l0KSB7Ci0gICAgICAgIEtleWZyYW1l
QW5pbWF0aW9uKiBrZmFuaW0gPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5nZXQoKml0KTsKLSAgICAg
ICAgaWYgKGtmYW5pbSkgewotICAgICAgICAgICAga2ZhbmltLT5yZXNldChyZW5kZXJlcik7Ci0g
ICAgICAgICAgICBkZWxldGUga2ZhbmltOwotICAgICAgICB9Ci0gICAgICAgIG1fa2V5ZnJhbWVB
bmltYXRpb25zLnJlbW92ZSgqaXQpOwotICAgIH0KLX0KLQotdm9pZCBDb21wb3NpdGVBbmltYXRp
b246OnNldEFuaW1hdGlvblN0YXJ0VGltZShkb3VibGUgdCkKLXsKLSAgICAvLyBzZXQgc3RhcnQg
dGltZSBvbiBhbGwgYW5pbWF0aW9ucyB3YWl0aW5nIGZvciBpdAotICAgIEFuaW1hdGlvbk5hbWVN
YXA6OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuZW5kKCk7Ci0g
ICAgZm9yIChBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVB
bmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IGtmZW5kOyArK2l0KSB7Ci0gICAgICAgIEtleWZyYW1l
QW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKLSAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+
d2FpdGluZ0ZvclN0YXJ0VGltZSgpKQotICAgICAgICAgICAgYW5pbS0+dXBkYXRlU3RhdGVNYWNo
aW5lKEFuaW1hdGlvbkJhc2U6OlNUQVRFX0lOUFVUX1NUQVJUX1RJTUVfU0VULCB0KTsKLSAgICB9
Ci19Ci0KLXZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpzZXRUcmFuc2l0aW9uU3RhcnRUaW1lKGlu
dCBwcm9wZXJ0eSwgZG91YmxlIHQpCi17Ci0gICAgLy8gU2V0IHRoZSBzdGFydCB0aW1lIGZvciBn
aXZlbiBwcm9wZXJ0eSB0cmFuc2l0aW9uCi0gICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6
Y29uc3RfaXRlcmF0b3IgZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKLSAgICBmb3IgKENTU1By
b3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5i
ZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgSW1wbGljaXRBbmltYXRpb24qIGFu
aW0gPSBpdC0+c2Vjb25kOwotICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT53YWl0aW5nRm9yU3Rh
cnRUaW1lKCkgJiYgYW5pbS0+YW5pbWF0aW5nUHJvcGVydHkoKSA9PSBwcm9wZXJ0eSkKLSAgICAg
ICAgICAgIGFuaW0tPnVwZGF0ZVN0YXRlTWFjaGluZShBbmltYXRpb25CYXNlOjpTVEFURV9JTlBV
VF9TVEFSVF9USU1FX1NFVCwgdCk7Ci0gICAgfQotfQotCi12b2lkIENvbXBvc2l0ZUFuaW1hdGlv
bjo6c3VzcGVuZEFuaW1hdGlvbnMoKQotewotICAgIGlmIChtX3N1c3BlbmRlZCkKLSAgICAgICAg
cmV0dXJuOwotICAgIAotICAgIG1fc3VzcGVuZGVkID0gdHJ1ZTsKLQotICAgIEFuaW1hdGlvbk5h
bWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuZW5kKCk7
Ci0gICAgZm9yIChBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJh
bWVBbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IGtmZW5kOyArK2l0KSB7Ci0gICAgICAgIEtleWZy
YW1lQW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKLSAgICAgICAgaWYgKGFuaW0pCi0gICAg
ICAgICAgICBhbmltLT51cGRhdGVQbGF5U3RhdGUoZmFsc2UpOwotICAgIH0KLQotICAgIENTU1By
b3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMu
ZW5kKCk7Ci0gICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRv
ciBpdCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAg
IEltcGxpY2l0QW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKLSAgICAgICAgaWYgKGFuaW0g
JiYgYW5pbS0+aGFzU3R5bGUoKSkKLSAgICAgICAgICAgIGFuaW0tPnVwZGF0ZVBsYXlTdGF0ZShm
YWxzZSk7Ci0gICAgfQotfQotCi12b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6cmVzdW1lQW5pbWF0
aW9ucygpCi17Ci0gICAgaWYgKCFtX3N1c3BlbmRlZCkKLSAgICAgICAgcmV0dXJuOwotICAgIAot
ICAgIG1fc3VzcGVuZGVkID0gZmFsc2U7Ci0gICAgCi0gICAgQW5pbWF0aW9uTmFtZU1hcDo6Y29u
c3RfaXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5lbmQoKTsKLSAgICBmb3Ig
KEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZUFuaW1hdGlv
bnMuYmVnaW4oKTsgaXQgIT0ga2ZlbmQ7ICsraXQpIHsKLSAgICAgICAgS2V5ZnJhbWVBbmltYXRp
b24qIGFuaW0gPSBpdC0+c2Vjb25kOwotICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT5wbGF5U3Rh
dGVQbGF5aW5nKCkpCi0gICAgICAgICAgICBhbmltLT51cGRhdGVQbGF5U3RhdGUodHJ1ZSk7Ci0g
ICAgfQotICAgIAotICAgIENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9y
IGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7Ci0gICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRp
b25zTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0g
ZW5kOyArK2l0KSB7Ci0gICAgICAgIEltcGxpY2l0QW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29u
ZDsKLSAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+aGFzU3R5bGUoKSkKLSAgICAgICAgICAgIGFu
aW0tPnVwZGF0ZVBsYXlTdGF0ZSh0cnVlKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ29tcG9zaXRlQW5p
bWF0aW9uOjpvdmVycmlkZUltcGxpY2l0QW5pbWF0aW9ucyhpbnQgcHJvcGVydHkpCi17Ci0gICAg
Q1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV90cmFuc2l0
aW9ucy5lbmQoKTsKLSAgICBmb3IgKENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0
ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAg
ICAgICAgSW1wbGljaXRBbmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOwotICAgICAgICBpZiAo
YW5pbSAmJiBhbmltLT5hbmltYXRpbmdQcm9wZXJ0eSgpID09IHByb3BlcnR5KQotICAgICAgICAg
ICAgYW5pbS0+c2V0T3ZlcnJpZGRlbih0cnVlKTsKLSAgICB9Ci19Ci0KLXZvaWQgQ29tcG9zaXRl
QW5pbWF0aW9uOjpyZXN1bWVPdmVycmlkZGVuSW1wbGljaXRBbmltYXRpb25zKGludCBwcm9wZXJ0
eSkKLXsKLSAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBlbmQg
PSBtX3RyYW5zaXRpb25zLmVuZCgpOwotICAgIGZvciAoQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01h
cDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9IGVuZDsg
KytpdCkgewotICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7Ci0g
ICAgICAgIGlmIChhbmltICYmIGFuaW0tPmFuaW1hdGluZ1Byb3BlcnR5KCkgPT0gcHJvcGVydHkp
Ci0gICAgICAgICAgICBhbmltLT5zZXRPdmVycmlkZGVuKGZhbHNlKTsKLSAgICB9Ci19Ci0KLXN0
YXRpYyBpbmxpbmUgYm9vbCBjb21wYXJlQW5pbWF0aW9uSW5kaWNlcyhjb25zdCBLZXlmcmFtZUFu
aW1hdGlvbiogYSwgY29uc3QgS2V5ZnJhbWVBbmltYXRpb24qIGIpCi17Ci0gICAgcmV0dXJuIGEt
PmluZGV4KCkgPCBiLT5pbmRleCgpOwotfQotCi12b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6c3R5
bGVBdmFpbGFibGUoKQotewotICAgIGlmIChtX251bVN0eWxlQXZhaWxhYmxlV2FpdGVycyA9PSAw
KQotICAgICAgICByZXR1cm47Ci0gICAgCi0gICAgLy8gV2UgaGF2ZSB0byBnbyB0aHJvdWdoIGFu
aW1hdGlvbnMgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIGluCi0gICAgLy8gdGhl
IHN0eWxlLCBiZWNhdXNlIG9yZGVyIG1hdHRlcnMgZm9yIGFkZGl0aXZpdHkuCi0gICAgVmVjdG9y
PEtleWZyYW1lQW5pbWF0aW9uKj4gYW5pbWF0aW9ucyhtX2tleWZyYW1lQW5pbWF0aW9ucy5zaXpl
KCkpOwotICAgIEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlm
cmFtZUFuaW1hdGlvbnMuZW5kKCk7Ci0gICAgc2l6ZV90IGkgPSAwOwotICAgIGZvciAoQW5pbWF0
aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5iZWdp
bigpOyBpdCAhPSBrZmVuZDsgKytpdCkgewotICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbiogYW5p
bSA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIC8vIFdlIGNhbid0IGp1c3QgaW5zZXJ0IGJhc2VkIG9u
IGFuaW0tPmluZGV4KCkgYmVjYXVzZSBpbnZhbGlkIGFuaW1hdGlvbnMgZG9uJ3QKLSAgICAgICAg
Ly8gbWFrZSBpdCBpbnRvIHRoZSBoYXNoLgotICAgICAgICBhbmltYXRpb25zW2krK10gPSBhbmlt
OwotICAgIH0KLQotICAgIGlmIChhbmltYXRpb25zLnNpemUoKSA+IDEpCi0gICAgICAgIHN0ZDo6
c3RhYmxlX3NvcnQoYW5pbWF0aW9ucy5iZWdpbigpLCBhbmltYXRpb25zLmVuZCgpLCBjb21wYXJl
QW5pbWF0aW9uSW5kaWNlcyk7Ci0gICAgCi0gICAgZm9yIChpID0gMDsgaSA8IGFuaW1hdGlvbnMu
c2l6ZSgpOyArK2kpIHsKLSAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGFuaW0gPSBhbmltYXRp
b25zW2ldOwotICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT53YWl0aW5nRm9yU3R5bGVBdmFpbGFi
bGUoKSkKLSAgICAgICAgICAgIGFuaW0tPnVwZGF0ZVN0YXRlTWFjaGluZShBbmltYXRpb25CYXNl
OjpTVEFURV9JTlBVVF9TVFlMRV9BVkFJTEFCTEUsIC0xKTsKLSAgICB9Ci0gICAgCi0gICAgQ1NT
UHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV90cmFuc2l0aW9u
cy5lbmQoKTsKLSAgICBmb3IgKENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJh
dG9yIGl0ID0gbV90cmFuc2l0aW9ucy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAg
ICAgSW1wbGljaXRBbmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOwotICAgICAgICBpZiAoYW5p
bSAmJiBhbmltLT53YWl0aW5nRm9yU3R5bGVBdmFpbGFibGUoKSkKLSAgICAgICAgICAgIGFuaW0t
PnVwZGF0ZVN0YXRlTWFjaGluZShBbmltYXRpb25CYXNlOjpTVEFURV9JTlBVVF9TVFlMRV9BVkFJ
TEFCTEUsIC0xKTsKLSAgICB9Ci19Ci0KLWJvb2wgQ29tcG9zaXRlQW5pbWF0aW9uOjppc0FuaW1h
dGluZ1Byb3BlcnR5KGludCBwcm9wZXJ0eSwgYm9vbCBpc1J1bm5pbmdOb3cpIGNvbnN0Ci17Ci0g
ICAgQW5pbWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5p
bWF0aW9ucy5lbmQoKTsKLSAgICBmb3IgKEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9y
IGl0ID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0ga2ZlbmQ7ICsraXQpIHsK
LSAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOwotICAgICAgICBp
ZiAoYW5pbSAmJiBhbmltLT5pc0FuaW1hdGluZ1Byb3BlcnR5KHByb3BlcnR5LCBpc1J1bm5pbmdO
b3cpKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIENTU1Byb3Bl
cnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5k
KCk7Ci0gICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBp
dCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICAgIElt
cGxpY2l0QW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKLSAgICAgICAgaWYgKGFuaW0gJiYg
YW5pbS0+aXNBbmltYXRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgaXNSdW5uaW5nTm93KSkKLSAgICAg
ICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQg
SW1wbGljaXRBbmltYXRpb246OmFuaW1hdGUoQ29tcG9zaXRlQW5pbWF0aW9uKiBhbmltYXRpb24s
IFJlbmRlck9iamVjdCogcmVuZGVyZXIsIGNvbnN0IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUs
IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZW5kZXJTdHlsZSogdGFy
Z2V0U3R5bGUsIFJlbmRlclN0eWxlKiYgYW5pbWF0ZWRTdHlsZSkKLXsKLSAgICBpZiAocGF1c2Vk
KCkpCi0gICAgICAgIHJldHVybjsKLSAgICAKLSAgICAvLyBJZiB3ZSBnZXQgdGhpcyBmYXIgYW5k
IHRoZSBhbmltYXRpb24gaXMgZG9uZSwgaXQgbWVhbnMgd2UgYXJlIGNsZWFuaW5nIHVwIGEganVz
dCBmaW5pc2hlZCBhbmltYXRpb24uCi0gICAgLy8gU28ganVzdCByZXR1cm4uIEV2ZXJ5dGhpbmcg
aXMgYWxyZWFkeSBhbGwgY2xlYW5lZCB1cAotICAgIGlmIChwb3N0YWN0aXZlKCkpCi0gICAgICAg
IHJldHVybjsKLQotICAgIC8vIFJlc2V0IHRvIHN0YXJ0IHRoZSB0cmFuc2l0aW9uIGlmIHdlIGFy
ZSBuZXcKLSAgICBpZiAoaXNuZXcoKSkKLSAgICAgICAgcmVzZXQocmVuZGVyZXIsIGN1cnJlbnRT
dHlsZSwgdGFyZ2V0U3R5bGUpOwotICAgIAotICAgIC8vIFJ1biBhIGN5Y2xlIG9mIGFuaW1hdGlv
bi4KLSAgICAvLyBXZSBrbm93IHdlIHdpbGwgbmVlZCBhIG5ldyByZW5kZXIgc3R5bGUsIHNvIG1h
a2Ugb25lIGlmIG5lZWRlZAotICAgIGlmICghYW5pbWF0ZWRTdHlsZSkKLSAgICAgICAgYW5pbWF0
ZWRTdHlsZSA9IG5ldyAocmVuZGVyZXItPnJlbmRlckFyZW5hKCkpIFJlbmRlclN0eWxlKCp0YXJn
ZXRTdHlsZSk7Ci0gICAgCi0gICAgZG91YmxlIHByb2cgPSBwcm9ncmVzcygxLCAwKTsKLSAgICBi
b29sIG5lZWRzQW5pbSA9IEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2YXRlOjpibGVuZFByb3BlcnRp
ZXMobV9hbmltYXRpbmdQcm9wZXJ0eSwgYW5pbWF0ZWRTdHlsZSwgbV9mcm9tU3R5bGUsIG1fdG9T
dHlsZSwgcHJvZyk7Ci0gICAgaWYgKG5lZWRzQW5pbSkKLSAgICAgICAgc2V0QW5pbWF0aW5nKCk7
Ci19Ci0KLXZvaWQgSW1wbGljaXRBbmltYXRpb246Om9uQW5pbWF0aW9uRW5kKGRvdWJsZSBpbkVs
YXBzZWRUaW1lKQotewotICAgIGlmICghc2VuZFRyYW5zaXRpb25FdmVudChFdmVudE5hbWVzOjp3
ZWJraXRUcmFuc2l0aW9uRW5kRXZlbnQsIGluRWxhcHNlZFRpbWUpKSB7Ci0gICAgICAgIC8vIFdl
IGRpZG4ndCBkaXNwYXRjaCBhbiBldmVudCwgd2hpY2ggd291bGQgY2FsbCBlbmRBbmltYXRpb24o
KSwgc28gd2UnbGwganVzdCBjYWxsIGl0IGhlcmUuCi0gICAgICAgIGVuZEFuaW1hdGlvbih0cnVl
KTsKLSAgICB9Ci19Ci0KLWJvb2wgSW1wbGljaXRBbmltYXRpb246OnNlbmRUcmFuc2l0aW9uRXZl
bnQoY29uc3QgQXRvbWljU3RyaW5nJiBpbkV2ZW50VHlwZSwgZG91YmxlIGluRWxhcHNlZFRpbWUp
Ci17Ci0gICAgaWYgKGluRXZlbnRUeXBlID09IEV2ZW50TmFtZXM6OndlYmtpdFRyYW5zaXRpb25F
bmRFdmVudCkgewotICAgICAgICBEb2N1bWVudDo6TGlzdGVuZXJUeXBlIGxpc3RlbmVyVHlwZSA9
IERvY3VtZW50OjpUUkFOU0lUSU9ORU5EX0xJU1RFTkVSOwotICAgICAgICAKLSAgICAgICAgaWYg
KHNob3VsZFNlbmRFdmVudEZvckxpc3RlbmVyKGxpc3RlbmVyVHlwZSkpIHsKLSAgICAgICAgICAg
IEVsZW1lbnQqIGVsZW1lbnQgPSBlbGVtZW50Rm9yRXZlbnREaXNwYXRjaCgpOwotICAgICAgICAg
ICAgaWYgKGVsZW1lbnQpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVydHlOYW1lOwot
ICAgICAgICAgICAgICAgIGlmIChtX3RyYW5zaXRpb25Qcm9wZXJ0eSAhPSBjQW5pbWF0ZUFsbCkK
LSAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gU3RyaW5nKGdldFByb3BlcnR5TmFt
ZSgoQ1NTUHJvcGVydHlJRCltX3RyYW5zaXRpb25Qcm9wZXJ0eSkpOwotICAgICAgICAgICAgICAg
IG1fd2FpdGluZ0ZvckVuZEV2ZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtX2FuaW1hdGlv
bkV2ZW50RGlzcGF0Y2hlci5zdGFydFRpbWVyKGVsZW1lbnQsIHByb3BlcnR5TmFtZSwgbV90cmFu
c2l0aW9uUHJvcGVydHksIHRydWUsIGluRXZlbnRUeXBlLCBpbkVsYXBzZWRUaW1lKTsKLSAgICAg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gRGlkIGRpc3BhdGNoIGFuIGV2ZW50Ci0gICAgICAg
ICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOyAvLyBEaWRu
J3QgZGlzcGF0Y2ggYW4gZXZlbnQKLX0KLQotdm9pZCBJbXBsaWNpdEFuaW1hdGlvbjo6cmVzZXQo
UmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5bGUqIGZyb20gLyogPSAwICov
LCBjb25zdCBSZW5kZXJTdHlsZSogdG8gLyogPSAwICovKQotewotICAgIEFTU0VSVCgoIW1fdG9T
dHlsZSAmJiAhdG8pIHx8IG1fdG9TdHlsZSAhPSB0byk7Ci0gICAgQVNTRVJUKCghbV9mcm9tU3R5
bGUgJiYgIWZyb20pIHx8IG1fZnJvbVN0eWxlICE9IGZyb20pOwotICAgIGlmIChtX2Zyb21TdHls
ZSkKLSAgICAgICAgbV9mcm9tU3R5bGUtPmRlcmVmKHJlbmRlcmVyLT5yZW5kZXJBcmVuYSgpKTsK
LSAgICBpZiAobV90b1N0eWxlKQotICAgICAgICBtX3RvU3R5bGUtPmRlcmVmKHJlbmRlcmVyLT5y
ZW5kZXJBcmVuYSgpKTsKLSAgICAKLSAgICBtX2Zyb21TdHlsZSA9IGNvbnN0X2Nhc3Q8UmVuZGVy
U3R5bGUqPihmcm9tKTsgICAvLyBpdCBpcyByZWFkLW9ubHksIG90aGVyIHRoYW4gdGhlIHJlZgot
ICAgIGlmIChtX2Zyb21TdHlsZSkKLSAgICAgICAgbV9mcm9tU3R5bGUtPnJlZigpOwotICAgIAot
ICAgIG1fdG9TdHlsZSA9IGNvbnN0X2Nhc3Q8UmVuZGVyU3R5bGUqPih0byk7ICAgICAgIC8vIGl0
IGlzIHJlYWQtb25seSwgb3RoZXIgdGhhbiB0aGUgcmVmCi0gICAgaWYgKG1fdG9TdHlsZSkKLSAg
ICAgICAgbV90b1N0eWxlLT5yZWYoKTsKLSAgICAKLSAgICAvLyByZXN0YXJ0IHRoZSB0cmFuc2l0
aW9uCi0gICAgaWYgKGZyb20gJiYgdG8pCi0gICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFU
RV9JTlBVVF9SRVNUQVJUX0FOSU1BVElPTiwgLTEpOwotfQotCi12b2lkIEltcGxpY2l0QW5pbWF0
aW9uOjpzZXRPdmVycmlkZGVuKGJvb2wgYikKLXsKLSAgICBpZiAoYiAhPSBtX292ZXJyaWRkZW4p
IHsKLSAgICAgICAgbV9vdmVycmlkZGVuID0gYjsKLSAgICAgICAgdXBkYXRlU3RhdGVNYWNoaW5l
KG1fb3ZlcnJpZGRlbiA/IFNUQVRFX0lOUFVUX1BBVVNFX09WRVJSSURFIDogU1RBVEVfSU5QVVRf
UkVTVU1FX09WRVJSSURFLCAtMSk7Ci0gICAgfQotfQotCi1ib29sIEltcGxpY2l0QW5pbWF0aW9u
OjphZmZlY3RzUHJvcGVydHkoaW50IHByb3BlcnR5KSBjb25zdAotewotICAgIHJldHVybiAobV9h
bmltYXRpbmdQcm9wZXJ0eSA9PSBwcm9wZXJ0eSk7Ci19Ci0KLWJvb2wgSW1wbGljaXRBbmltYXRp
b246OmlzVGFyZ2V0UHJvcGVydHlFcXVhbChpbnQgcHJvcCwgY29uc3QgUmVuZGVyU3R5bGUqIHRh
cmdldFN0eWxlKQotewotICAgIHJldHVybiBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTo6cHJv
cGVydGllc0VxdWFsKHByb3AsIG1fdG9TdHlsZSwgdGFyZ2V0U3R5bGUpOwotfQotCi12b2lkIElt
cGxpY2l0QW5pbWF0aW9uOjpibGVuZFByb3BlcnR5VmFsdWVJblN0eWxlKGludCBwcm9wLCBSZW5k
ZXJTdHlsZSogY3VycmVudFN0eWxlKQotewotICAgIGRvdWJsZSBwcm9nID0gcHJvZ3Jlc3MoMSwg
MCk7Ci0gICAgQW5pbWF0aW9uQ29udHJvbGxlclByaXZhdGU6OmJsZW5kUHJvcGVydGllcyhwcm9w
LCBjdXJyZW50U3R5bGUsIG1fZnJvbVN0eWxlLCBtX3RvU3R5bGUsIHByb2cpOwotfSAgICAKLQot
dm9pZCBLZXlmcmFtZUFuaW1hdGlvbjo6YW5pbWF0ZShDb21wb3NpdGVBbmltYXRpb24qIGFuaW1h
dGlvbiwgUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5bGUqIGN1cnJlbnRT
dHlsZSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZW5kZXJT
dHlsZSogdGFyZ2V0U3R5bGUsIFJlbmRlclN0eWxlKiYgYW5pbWF0ZWRTdHlsZSkKLXsKLSAgICAv
LyBpZiB3ZSBoYXZlIG5vdCB5ZXQgc3RhcnRlZCwgd2Ugd2lsbCBub3QgaGF2ZSBhIHZhbGlkIHN0
YXJ0IHRpbWUsIHNvIGp1c3Qgc3RhcnQgdGhlIGFuaW1hdGlvbiBpZiBuZWVkZWQKLSAgICBpZiAo
aXNuZXcoKSAmJiBtX2FuaW1hdGlvbi0+cGxheVN0YXRlKCkgPT0gQW5pbVBsYXlTdGF0ZVBsYXlp
bmcpCi0gICAgICAgIHVwZGF0ZVN0YXRlTWFjaGluZShTVEFURV9JTlBVVF9TVEFSVF9BTklNQVRJ
T04sIC0xKTsKLSAgICAKLSAgICAvLyBJZiB3ZSBnZXQgdGhpcyBmYXIgYW5kIHRoZSBhbmltYXRp
b24gaXMgZG9uZSwgaXQgbWVhbnMgd2UgYXJlIGNsZWFuaW5nIHVwIGEganVzdCBmaW5pc2hlZCBh
bmltYXRpb24uCi0gICAgLy8gSWYgc28sIHdlIG5lZWQgdG8gc2VuZCBiYWNrIHRoZSB0YXJnZXRT
dHlsZQotICAgIGlmIChwb3N0YWN0aXZlKCkpIHsKLSAgICAgICAgaWYgKCFhbmltYXRlZFN0eWxl
KQotICAgICAgICAgICAgYW5pbWF0ZWRTdHlsZSA9IGNvbnN0X2Nhc3Q8UmVuZGVyU3R5bGUqPih0
YXJnZXRTdHlsZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBpZiB3ZSBhcmUg
d2FpdGluZyBmb3IgdGhlIHN0YXJ0IHRpbWVyLCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGUg
c3R5bGUgeWV0Ci0gICAgLy8gU3BlY2lhbCBjYXNlIC0gaWYgdGhlIGRlbGF5IHRpbWUgaXMgMCwg
dGhlbiB3ZSBkbyB3YW50IHRvIHNldCB0aGUgZmlyc3QgZnJhbWUgb2YgdGhlCi0gICAgLy8gYW5p
bWF0aW9uIHJpZ2h0IGF3YXkuIFRoaXMgYXZvaWRzIGEgZmxhc2ggd2hlbiB0aGUgYW5pbWF0aW9u
IHN0YXJ0cwotICAgIGlmICh3YWl0aW5nVG9TdGFydCgpICYmIG1fYW5pbWF0aW9uLT5kZWxheSgp
ID4gMCkKLSAgICAgICAgcmV0dXJuOwotICAgIAotICAgIC8vIEZJWE1FOiB3ZSBuZWVkIHRvIGJl
IG1vcmUgZWZmaWNpZW50IGFib3V0IGRldGVybWluaW5nIHdoaWNoIGtleWZyYW1lcyB3ZSBhcmUg
YW5pbWF0aW5nIGJldHdlZW4uCi0gICAgLy8gV2Ugc2hvdWxkIGNhY2hlIHRoZSBsYXN0IHBhaXIg
b3Igc29tZXRoaW5nCi0gICAgCi0gICAgLy8gZmluZCB0aGUgZmlyc3Qga2V5Ci0gICAgZG91Ymxl
IGVsYXBzZWRUaW1lID0gKG1fc3RhcnRUaW1lID4gMCkgPyAoKCFwYXVzZWQoKSA/IGN1cnJlbnRU
aW1lKCkgOiBtX3BhdXNlVGltZSkgLSBtX3N0YXJ0VGltZSkgOiAwLjA7Ci0gICAgaWYgKGVsYXBz
ZWRUaW1lIDwgMC4wKQotICAgICAgICBlbGFwc2VkVGltZSA9IDAuMDsKLSAgICAgICAgCi0gICAg
ZG91YmxlIHQgPSBtX2FuaW1hdGlvbi0+ZHVyYXRpb24oKSA/IChlbGFwc2VkVGltZSAvIG1fYW5p
bWF0aW9uLT5kdXJhdGlvbigpKSA6IDEuMDsKLSAgICBpbnQgaSA9IChpbnQpIHQ7Ci0gICAgdCAt
PSBpOwotICAgIGlmIChtX2FuaW1hdGlvbi0+ZGlyZWN0aW9uKCkgJiYgKGkgJiAxKSkKLSAgICAg
ICAgdCA9IDEgLSB0OwotCi0gICAgUmVuZGVyU3R5bGUqIGZyb21TdHlsZSA9IDA7Ci0gICAgUmVu
ZGVyU3R5bGUqIHRvU3R5bGUgPSAwOwotICAgIGRvdWJsZSBzY2FsZSA9IDEuMDsKLSAgICBkb3Vi
bGUgb2Zmc2V0ID0gMC4wOwotICAgIGlmIChtX2tleWZyYW1lcy5nZXQoKSkgewotICAgICAgICBW
ZWN0b3I8S2V5ZnJhbWVWYWx1ZT46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fa2V5ZnJhbWVzLT5l
bmRLZXlmcmFtZXMoKTsKLSAgICAgICAgZm9yIChWZWN0b3I8S2V5ZnJhbWVWYWx1ZT46OmNvbnN0
X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZXMtPmJlZ2luS2V5ZnJhbWVzKCk7IGl0ICE9IGVuZDsg
KytpdCkgewotICAgICAgICAgICAgaWYgKHQgPCBpdC0+a2V5KSB7Ci0gICAgICAgICAgICAgICAg
Ly8gVGhlIGZpcnN0IGtleSBzaG91bGQgYWx3YXlzIGJlIDAsIHNvIHdlIHNob3VsZCBuZXZlciBz
dWNjZWVkIG9uIHRoZSBmaXJzdCBrZXkKLSAgICAgICAgICAgICAgICBpZiAoIWZyb21TdHlsZSkK
LSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgc2NhbGUgPSAxLjAg
LyAoaXQtPmtleSAtIG9mZnNldCk7Ci0gICAgICAgICAgICAgICAgdG9TdHlsZSA9IGNvbnN0X2Nh
c3Q8UmVuZGVyU3R5bGUqPigmKGl0LT5zdHlsZSkpOwotICAgICAgICAgICAgICAgIGJyZWFrOwot
ICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBvZmZzZXQgPSBpdC0+a2V5
OwotICAgICAgICAgICAgZnJvbVN0eWxlID0gY29uc3RfY2FzdDxSZW5kZXJTdHlsZSo+KCYoaXQt
PnN0eWxlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLy8gaWYgZWl0aGVyIHN0eWxl
IGlzIDAgd2UgaGF2ZSBhbiBpbnZhbGlkIGNhc2UsIGp1c3Qgc3RvcCB0aGUgYW5pbWF0aW9uCi0g
ICAgaWYgKCFmcm9tU3R5bGUgfHwgIXRvU3R5bGUpIHsKLSAgICAgICAgdXBkYXRlU3RhdGVNYWNo
aW5lKFNUQVRFX0lOUFVUX0VORF9BTklNQVRJT04sIC0xKTsKLSAgICAgICAgcmV0dXJuOwotICAg
IH0KLSAgICAKLSAgICAvLyBydW4gYSBjeWNsZSBvZiBhbmltYXRpb24uCi0gICAgLy8gV2Uga25v
dyB3ZSB3aWxsIG5lZWQgYSBuZXcgcmVuZGVyIHN0eWxlLCBzbyBtYWtlIG9uZSBpZiBuZWVkZWQK
LSAgICBpZiAoIWFuaW1hdGVkU3R5bGUpCi0gICAgICAgIGFuaW1hdGVkU3R5bGUgPSBuZXcgKHJl
bmRlcmVyLT5yZW5kZXJBcmVuYSgpKSBSZW5kZXJTdHlsZSgqdGFyZ2V0U3R5bGUpOwotICAgIAot
ICAgIGRvdWJsZSBwcm9nID0gcHJvZ3Jlc3Moc2NhbGUsIG9mZnNldCk7Ci0KLSAgICBIYXNoU2V0
PGludD46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fa2V5ZnJhbWVzLT5lbmRQcm9wZXJ0aWVzKCk7
Ci0gICAgZm9yIChIYXNoU2V0PGludD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV9rZXlmcmFtZXMt
PmJlZ2luUHJvcGVydGllcygpOyBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgICAgaWYgKEFuaW1h
dGlvbkNvbnRyb2xsZXJQcml2YXRlOjpibGVuZFByb3BlcnRpZXMoKml0LCBhbmltYXRlZFN0eWxl
LCBmcm9tU3R5bGUsIHRvU3R5bGUsIHByb2cpKQotICAgICAgICAgICAgc2V0QW5pbWF0aW5nKCk7
Ci0gICAgfQotfQotCi12b2lkIEtleWZyYW1lQW5pbWF0aW9uOjplbmRBbmltYXRpb24oYm9vbCBy
ZXNldCkKLXsKLSAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCAodW5hbmltYXRlZCkgc3R5bGUK
LSAgICBpZiAobV9vYmplY3QpCi0gICAgICAgIHNldENoYW5nZWQobV9vYmplY3QtPmVsZW1lbnQo
KSk7Ci19Ci0KLXZvaWQgS2V5ZnJhbWVBbmltYXRpb246Om9uQW5pbWF0aW9uU3RhcnQoZG91Ymxl
IGluRWxhcHNlZFRpbWUpCi17Ci0gICAgc2VuZEFuaW1hdGlvbkV2ZW50KEV2ZW50TmFtZXM6Ondl
YmtpdEFuaW1hdGlvblN0YXJ0RXZlbnQsIGluRWxhcHNlZFRpbWUpOwotfQotCi12b2lkIEtleWZy
YW1lQW5pbWF0aW9uOjpvbkFuaW1hdGlvbkl0ZXJhdGlvbihkb3VibGUgaW5FbGFwc2VkVGltZSkK
LXsKLSAgICBzZW5kQW5pbWF0aW9uRXZlbnQoRXZlbnROYW1lczo6d2Via2l0QW5pbWF0aW9uSXRl
cmF0aW9uRXZlbnQsIGluRWxhcHNlZFRpbWUpOwotfQotCi12b2lkIEtleWZyYW1lQW5pbWF0aW9u
OjpvbkFuaW1hdGlvbkVuZChkb3VibGUgaW5FbGFwc2VkVGltZSkKLXsKLSAgICBpZiAoIXNlbmRB
bmltYXRpb25FdmVudChFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRpb25FbmRFdmVudCwgaW5FbGFw
c2VkVGltZSkpIHsKLSAgICAgICAgLy8gV2UgZGlkbid0IGRpc3BhdGNoIGFuIGV2ZW50LCB3aGlj
aCB3b3VsZCBjYWxsIGVuZEFuaW1hdGlvbigpLCBzbyB3ZSdsbCBqdXN0IGNhbGwgaXQgaGVyZS4K
LSAgICAgICAgZW5kQW5pbWF0aW9uKHRydWUpOwotICAgIH0KLX0KLQotYm9vbCBLZXlmcmFtZUFu
aW1hdGlvbjo6c2VuZEFuaW1hdGlvbkV2ZW50KGNvbnN0IEF0b21pY1N0cmluZyYgaW5FdmVudFR5
cGUsIGRvdWJsZSBpbkVsYXBzZWRUaW1lKQotewotICAgIERvY3VtZW50OjpMaXN0ZW5lclR5cGUg
bGlzdGVuZXJUeXBlOwotICAgIGlmIChpbkV2ZW50VHlwZSA9PSBFdmVudE5hbWVzOjp3ZWJraXRB
bmltYXRpb25JdGVyYXRpb25FdmVudCkKLSAgICAgICAgbGlzdGVuZXJUeXBlID0gRG9jdW1lbnQ6
OkFOSU1BVElPTklURVJBVElPTl9MSVNURU5FUjsKLSAgICBlbHNlIGlmIChpbkV2ZW50VHlwZSA9
PSBFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRpb25FbmRFdmVudCkKLSAgICAgICAgbGlzdGVuZXJU
eXBlID0gRG9jdW1lbnQ6OkFOSU1BVElPTkVORF9MSVNURU5FUjsKLSAgICBlbHNlCi0gICAgICAg
IGxpc3RlbmVyVHlwZSA9IERvY3VtZW50OjpBTklNQVRJT05TVEFSVF9MSVNURU5FUjsKLSAgICAK
LSAgICBpZiAoc2hvdWxkU2VuZEV2ZW50Rm9yTGlzdGVuZXIobGlzdGVuZXJUeXBlKSkgewotICAg
ICAgICBFbGVtZW50KiBlbGVtZW50ID0gZWxlbWVudEZvckV2ZW50RGlzcGF0Y2goKTsKLSAgICAg
ICAgaWYgKGVsZW1lbnQpIHsKLSAgICAgICAgICAgIG1fd2FpdGluZ0ZvckVuZEV2ZW50ID0gdHJ1
ZTsKLSAgICAgICAgICAgIG1fYW5pbWF0aW9uRXZlbnREaXNwYXRjaGVyLnN0YXJ0VGltZXIoZWxl
bWVudCwgbV9uYW1lLCAtMSwgdHJ1ZSwgaW5FdmVudFR5cGUsIGluRWxhcHNlZFRpbWUpOwotICAg
ICAgICAgICAgcmV0dXJuIHRydWU7IC8vIERpZCBkaXNwYXRjaCBhbiBldmVudAotICAgICAgICB9
Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOyAvLyBEaWQgbm90IGRpc3BhdGNoIGFuIGV2ZW50
Ci19Ci0KLXZvaWQgS2V5ZnJhbWVBbmltYXRpb246Om92ZXJyaWRlQW5pbWF0aW9ucygpCi17Ci0g
ICAgLy8gVGhpcyB3aWxsIG92ZXJyaWRlIGltcGxpY2l0IGFuaW1hdGlvbnMgdGhhdCBtYXRjaCB0
aGUgcHJvcGVydGllcyBpbiB0aGUga2V5ZnJhbWUgYW5pbWF0aW9uCi0gICAgSGFzaFNldDxpbnQ+
Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX2tleWZyYW1lcy0+ZW5kUHJvcGVydGllcygpOwotICAg
IGZvciAoSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVzLT5iZWdp
blByb3BlcnRpZXMoKTsgaXQgIT0gZW5kOyArK2l0KQotICAgICAgICBjb21wb3NpdGVBbmltYXRp
b24oKS0+b3ZlcnJpZGVJbXBsaWNpdEFuaW1hdGlvbnMoKml0KTsKLX0KLQotdm9pZCBLZXlmcmFt
ZUFuaW1hdGlvbjo6cmVzdW1lT3ZlcnJpZGRlbkFuaW1hdGlvbnMoKQotewotICAgIC8vIFRoaXMg
d2lsbCByZXN1bWUgb3ZlcnJpZGRlbiBpbXBsaWNpdCBhbmltYXRpb25zCi0gICAgSGFzaFNldDxp
bnQ+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX2tleWZyYW1lcy0+ZW5kUHJvcGVydGllcygpOwot
ICAgIGZvciAoSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVzLT5i
ZWdpblByb3BlcnRpZXMoKTsgaXQgIT0gZW5kOyArK2l0KQotICAgICAgICBjb21wb3NpdGVBbmlt
YXRpb24oKS0+cmVzdW1lT3ZlcnJpZGRlbkltcGxpY2l0QW5pbWF0aW9ucygqaXQpOwotfQotCi1i
b29sIEtleWZyYW1lQW5pbWF0aW9uOjphZmZlY3RzUHJvcGVydHkoaW50IHByb3BlcnR5KSBjb25z
dAotewotICAgIEhhc2hTZXQ8aW50Pjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9rZXlmcmFtZXMt
PmVuZFByb3BlcnRpZXMoKTsKLSAgICBmb3IgKEhhc2hTZXQ8aW50Pjo6Y29uc3RfaXRlcmF0b3Ig
aXQgPSBtX2tleWZyYW1lcy0+YmVnaW5Qcm9wZXJ0aWVzKCk7IGl0ICE9IGVuZDsgKytpdCkgewot
ICAgICAgICBpZiAoKCppdCkgPT0gcHJvcGVydHkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
LSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCiBBbmltYXRpb25Db250cm9sbGVyOjpBbmlt
YXRpb25Db250cm9sbGVyKEZyYW1lKiBmcmFtZSkKIDogbV9kYXRhKG5ldyBBbmltYXRpb25Db250
cm9sbGVyUHJpdmF0ZShmcmFtZSkpCissIG1fbnVtU3R5bGVBdmFpbGFibGVXYWl0ZXJzKDApCiB7
CiAgICAgCiB9CkBAIC0yMDg1LDggKzIyNiwxMSBAQCB2b2lkIEFuaW1hdGlvbkNvbnRyb2xsZXI6
OmNhbmNlbEFuaW1hdGlvCiAgICAgaWYgKCFtX2RhdGEtPmhhc0FuaW1hdGlvbnMoKSkKICAgICAg
ICAgcmV0dXJuOwogICAgIAotICAgIGlmIChtX2RhdGEtPmNsZWFyKHJlbmRlcmVyKSkKLSAgICAg
ICAgc2V0Q2hhbmdlZChyZW5kZXJlci0+ZWxlbWVudCgpKTsKKyAgICBpZiAobV9kYXRhLT5jbGVh
cihyZW5kZXJlcikpIHsKKyAgICAgICAgTm9kZSogbm9kZSA9IHJlbmRlcmVyLT5lbGVtZW50KCk7
CisgICAgICAgIEFTU0VSVCghbm9kZSB8fCAobm9kZS0+ZG9jdW1lbnQoKSAmJiAhbm9kZS0+ZG9j
dW1lbnQoKS0+aW5QYWdlQ2FjaGUoKSkpOworICAgICAgICBub2RlLT5zZXRDaGFuZ2VkKEFuaW1h
dGlvblN0eWxlQ2hhbmdlKTsKKyAgICB9CiB9CiAKIFJlbmRlclN0eWxlKiBBbmltYXRpb25Db250
cm9sbGVyOjp1cGRhdGVBbmltYXRpb25zKFJlbmRlck9iamVjdCogcmVuZGVyZXIsIFJlbmRlclN0
eWxlKiBuZXdTdHlsZSkKQEAgLTIxNTgsMTYgKzMwMiwxMCBAQCB2b2lkIEFuaW1hdGlvbkNvbnRy
b2xsZXI6OnN0YXJ0VXBkYXRlUmVuCiAKIHZvaWQgQW5pbWF0aW9uQ29udHJvbGxlcjo6c3R5bGVB
dmFpbGFibGUoKQogeworICAgIGlmIChtX251bVN0eWxlQXZhaWxhYmxlV2FpdGVycyA9PSAwKQor
ICAgICAgICByZXR1cm47CisgICAgCiAgICAgbV9kYXRhLT5zdHlsZUF2YWlsYWJsZSgpOwogfQog
Ci12b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6c2V0V2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKGJv
b2wgd2FpdGluZykKLXsKLSAgICBpZiAod2FpdGluZykKLSAgICAgICAgbV9udW1TdHlsZUF2YWls
YWJsZVdhaXRlcnMrKzsKLSAgICBlbHNlCi0gICAgICAgIG1fbnVtU3R5bGVBdmFpbGFibGVXYWl0
ZXJzLS07Ci0gICAgbV9hbmltYXRpb25Db250cm9sbGVyLT5zZXRXYWl0aW5nRm9yU3R5bGVBdmFp
bGFibGUod2FpdGluZyk7Ci19Ci0gICAgCiB9CkluZGV4OiBXZWJDb3JlL3BhZ2UvYW5pbWF0aW9u
L0FuaW1hdGlvbkNvbnRyb2xsZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BhZ2UvYW5pbWF0
aW9uL0FuaW1hdGlvbkNvbnRyb2xsZXIuaAkocmV2aXNpb24gMzU5OTUpCShmcm9tIFdlYkNvcmUv
cGFnZS9BbmltYXRpb25Db250cm9sbGVyLmg6MzU5OTUpCisrKyBXZWJDb3JlL3BhZ2UvYW5pbWF0
aW9uL0FuaW1hdGlvbkNvbnRyb2xsZXIuaAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDcxIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAx
LiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUg
Q29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29u
dHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJp
dmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3Jp
dHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1Q
TElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAor
ICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaWZuZGVmIEFuaW1hdGlvbkNvbnRyb2xsZXJfaAorI2RlZmluZSBBbmltYXRpb25Db250
cm9sbGVyX2gKKworI2luY2x1ZGUgIkNTU1Byb3BlcnR5TmFtZXMuaCIKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitjbGFzcyBBbmltYXRpb25Db250cm9sbGVyUHJpdmF0ZTsKK2NsYXNzIERvY3Vt
ZW50OworY2xhc3MgRnJhbWU7CitjbGFzcyBSZW5kZXJPYmplY3Q7CitjbGFzcyBSZW5kZXJTdHls
ZTsKKworY2xhc3MgQW5pbWF0aW9uQ29udHJvbGxlcgoreworcHVibGljOgorICAgIEFuaW1hdGlv
bkNvbnRyb2xsZXIoRnJhbWUqKTsKKyAgICB+QW5pbWF0aW9uQ29udHJvbGxlcigpOworICAgIAor
ICAgIHZvaWQgY2FuY2VsQW5pbWF0aW9ucyhSZW5kZXJPYmplY3QqKTsKKyAgICBSZW5kZXJTdHls
ZSogdXBkYXRlQW5pbWF0aW9ucyhSZW5kZXJPYmplY3QqLCBSZW5kZXJTdHlsZSogbmV3U3R5bGUp
OworICAgIAorICAgIHZvaWQgc2V0QW5pbWF0aW9uU3RhcnRUaW1lKFJlbmRlck9iamVjdCogb2Jq
LCBkb3VibGUgdCk7CisgICAgdm9pZCBzZXRUcmFuc2l0aW9uU3RhcnRUaW1lKFJlbmRlck9iamVj
dCogb2JqLCBpbnQgcHJvcGVydHksIGRvdWJsZSB0KTsKKyAgICAKKyAgICBib29sIGlzQW5pbWF0
aW5nUHJvcGVydHlPblJlbmRlcmVyKFJlbmRlck9iamVjdCogb2JqLCBpbnQgcHJvcGVydHksIGJv
b2wgaXNSdW5uaW5nTm93KSBjb25zdDsKKyAgICAKKyAgICB2b2lkIHN1c3BlbmRBbmltYXRpb25z
KERvY3VtZW50KiBkb2N1bWVudCk7CisgICAgdm9pZCByZXN1bWVBbmltYXRpb25zKERvY3VtZW50
KiBkb2N1bWVudCk7CisgICAgdm9pZCB1cGRhdGVBbmltYXRpb25UaW1lcigpOworICAgIAorICAg
IHZvaWQgc3RhcnRVcGRhdGVSZW5kZXJpbmdEaXNwYXRjaGVyKCk7CisgICAgCisgICAgdm9pZCBz
dHlsZUF2YWlsYWJsZSgpOworICAgIAorcHJpdmF0ZToKKyAgICBBbmltYXRpb25Db250cm9sbGVy
UHJpdmF0ZSogbV9kYXRhOworICAgIAorfTsKKworfQorCisjZW5kaWYKSW5kZXg6IFdlYkNvcmUv
cGFnZS9hbmltYXRpb24vQW5pbWF0aW9uQ29udHJvbGxlci5oCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvcGFnZS9hbmltYXRpb24vQW5pbWF0aW9uQ29udHJvbGxlci5oCShyZXZpc2lvbiAwKQorKysg
V2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9BbmltYXRpb25Db250cm9sbGVyLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTI5LDggKzI5LDYgQEAKICNpZm5kZWYgQW5pbWF0aW9uQ29udHJvbGxlcl9oCiAjZGVm
aW5lIEFuaW1hdGlvbkNvbnRyb2xsZXJfaAogCi0jaW5jbHVkZSAiQ1NTUHJvcGVydHlOYW1lcy5o
IgotCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKIGNsYXNzIEFuaW1hdGlvbkNvbnRyb2xsZXJQcml2
YXRlOwpAQCAtNjEsOSArNTksMTEgQEAgcHVibGljOgogICAgIAogICAgIHZvaWQgc3R5bGVBdmFp
bGFibGUoKTsKICAgICAKKyAgICB2b2lkIHNldFdhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZShib29s
IHdhaXRpbmcpIHsgaWYgKHdhaXRpbmcpIG1fbnVtU3R5bGVBdmFpbGFibGVXYWl0ZXJzKys7IGVs
c2UgbV9udW1TdHlsZUF2YWlsYWJsZVdhaXRlcnMtLTsgfQorICAgIAogcHJpdmF0ZToKICAgICBB
bmltYXRpb25Db250cm9sbGVyUHJpdmF0ZSogbV9kYXRhOwotICAgIAorICAgIHVpbnQzMl90IG1f
bnVtU3R5bGVBdmFpbGFibGVXYWl0ZXJzOyAgICAKIH07CiAKIH0KSW5kZXg6IFdlYkNvcmUvcGFn
ZS9hbmltYXRpb24vQ29tcG9zaXRlQW5pbWF0aW9uLmNwcAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BhZ2UvYW5pbWF0aW9uL0NvbXBvc2l0ZUFuaW1hdGlvbi5jcHAJKHJldmlzaW9uIDApCisrKyBX
ZWJDb3JlL3BhZ2UvYW5pbWF0aW9uL0NvbXBvc2l0ZUFuaW1hdGlvbi5jcHAJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsNDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4gIE5laXRoZXIg
dGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMg
b2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExP
U1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBP
RgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ29t
cG9zaXRlQW5pbWF0aW9uLmgiCisjaW5jbHVkZSAiQW5pbWF0aW9uQ29udHJvbGxlci5oIgorI2lu
Y2x1ZGUgIkltcGxpY2l0QW5pbWF0aW9uLmgiCisjaW5jbHVkZSAiS2V5ZnJhbWVBbmltYXRpb24u
aCIKKyNpbmNsdWRlICJSZW5kZXJTdHlsZS5oIgorI2luY2x1ZGUgIkNTU1Byb3BlcnR5TmFtZXMu
aCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitDb21wb3NpdGVBbmltYXRpb246On5Db21wb3Np
dGVBbmltYXRpb24oKQoreworICAgIGRlbGV0ZUFsbFZhbHVlcyhtX3RyYW5zaXRpb25zKTsKKyAg
ICBkZWxldGVBbGxWYWx1ZXMobV9rZXlmcmFtZUFuaW1hdGlvbnMpOworfQorICAgIAordm9pZCBD
b21wb3NpdGVBbmltYXRpb246OnVwZGF0ZVRyYW5zaXRpb25zKFJlbmRlck9iamVjdCogcmVuZGVy
ZXIsIGNvbnN0IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUsIFJlbmRlclN0eWxlKiB0YXJnZXRT
dHlsZSkKK3sKKyAgICAvLyBJZiBjdXJyZW50U3R5bGUgaXMgbnVsbCwgd2UgZG9uJ3QgZG8gdHJh
bnNpdGlvbnMKKyAgICBpZiAoIWN1cnJlbnRTdHlsZSB8fCAhdGFyZ2V0U3R5bGUtPnRyYW5zaXRp
b25zKCkpCisgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlm
IHdlIG5lZWQgdG8gdXBkYXRlIHRoZSBhY3RpdmUgdHJhbnNpdGlvbnMKKyAgICBmb3IgKHNpemVf
dCBpID0gMDsgaSA8IHRhcmdldFN0eWxlLT50cmFuc2l0aW9ucygpLT5zaXplKCk7ICsraSkgewor
ICAgICAgICBjb25zdCBBbmltYXRpb24qIGFuaW0gPSAoKnRhcmdldFN0eWxlLT50cmFuc2l0aW9u
cygpKVtpXS5nZXQoKTsKKyAgICAgICAgZG91YmxlIGR1cmF0aW9uID0gYW5pbS0+ZHVyYXRpb24o
KTsKKyAgICAgICAgZG91YmxlIGRlbGF5ID0gYW5pbS0+ZGVsYXkoKTsKKworICAgICAgICAvLyBJ
ZiB0aGlzIGlzIGFuIGVtcHR5IHRyYW5zaXRpb24sIHNraXAgaXQKKyAgICAgICAgaWYgKGR1cmF0
aW9uID09IDAgJiYgZGVsYXkgPD0gMCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAg
CisgICAgICAgIGludCBwcm9wID0gYW5pbS0+cHJvcGVydHkoKTsKKyAgICAgICAgYm9vbCBhbGwg
PSBwcm9wID09IGNBbmltYXRlQWxsOworICAgICAgICAKKyAgICAgICAgLy8gSGFuZGxlIGJvdGgg
dGhlICdhbGwnIGFuZCBzaW5nbGUgcHJvcGVydHkgY2FzZXMuIEZvciB0aGUgc2luZ2xlIHByb3Ag
Y2FzZSwgd2UgbWFrZSBvbmx5IG9uZSBwYXNzCisgICAgICAgIC8vIHRocm91Z2ggdGhlIGxvb3AK
KyAgICAgICAgZm9yIChpbnQgcHJvcGVydHlJbmRleCA9IDA7IDsgKytwcm9wZXJ0eUluZGV4KSB7
CisgICAgICAgICAgICBpZiAoYWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5SW5k
ZXggPj0gQW5pbWF0aW9uQmFzZTo6Z2V0TnVtUHJvcGVydGllcygpKQorICAgICAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIG5leHQgcHJvcAorICAgICAg
ICAgICAgICAgIHByb3AgPSBBbmltYXRpb25CYXNlOjpnZXRQcm9wZXJ0eUF0SW5kZXgocHJvcGVy
dHlJbmRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEltcGxpY2l0QW5pbWF0
aW9ucyBhcmUgYWx3YXlzIGhhc2hlZCBieSBhY3R1YWwgcHJvcGVydGllcywgbmV2ZXIgY0FuaW1h
dGVBbGwKKyAgICAgICAgICAgIEFTU0VSVChwcm9wID4gZmlyc3RDU1NQcm9wZXJ0eSAmJiBwcm9w
IDwgKGZpcnN0Q1NTUHJvcGVydHkgKyBudW1DU1NQcm9wZXJ0aWVzKSk7CisKKyAgICAgICAgICAg
IC8vIFNlZSBpZiB0aGVyZSBpcyBhIGN1cnJlbnQgdHJhbnNpdGlvbiBmb3IgdGhpcyBwcm9wCisg
ICAgICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogaW1wbEFuaW0gPSBtX3RyYW5zaXRpb25zLmdl
dChwcm9wKTsKKyAgICAgICAgICAgIGJvb2wgZXF1YWwgPSB0cnVlOworICAgICAgICAgICAgCisg
ICAgICAgICAgICBpZiAoaW1wbEFuaW0pIHsKKyAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBv
bmUsIGhhcyBvdXIgdGFyZ2V0IGNoYW5nZWQ/CisgICAgICAgICAgICAgICAgaWYgKCFpbXBsQW5p
bS0+aXNUYXJnZXRQcm9wZXJ0eUVxdWFsKHByb3AsIHRhcmdldFN0eWxlKSkgeworICAgICAgICAg
ICAgICAgICAgICBpbXBsQW5pbS0+cmVzZXQocmVuZGVyZXIpOworICAgICAgICAgICAgICAgICAg
ICBkZWxldGUgaW1wbEFuaW07CisgICAgICAgICAgICAgICAgICAgIG1fdHJhbnNpdGlvbnMucmVt
b3ZlKHByb3ApOworICAgICAgICAgICAgICAgICAgICBlcXVhbCA9IGZhbHNlOworICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gU2VlIGlm
IHdlIG5lZWQgdG8gc3RhcnQgYSBuZXcgdHJhbnNpdGlvbgorICAgICAgICAgICAgICAgIGVxdWFs
ID0gQW5pbWF0aW9uQmFzZTo6cHJvcGVydGllc0VxdWFsKHByb3AsIGN1cnJlbnRTdHlsZSwgdGFy
Z2V0U3R5bGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAo
IWVxdWFsKSB7CisgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBuZXcgdHJhbnNpdGlvbgorICAg
ICAgICAgICAgICAgIEltcGxpY2l0QW5pbWF0aW9uKiBhbmltYXRpb24gPSBuZXcgSW1wbGljaXRB
bmltYXRpb24oY29uc3RfY2FzdDxBbmltYXRpb24qPihhbmltKSwgcHJvcCwgcmVuZGVyZXIsIHRo
aXMpOworICAgICAgICAgICAgICAgIG1fdHJhbnNpdGlvbnMuc2V0KHByb3AsIGFuaW1hdGlvbik7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFdlIG9ubHkgbmVl
ZCBvbmUgcGFzcyBmb3IgdGhlIHNpbmdsZSBwcm9wIGNhc2UKKyAgICAgICAgICAgIGlmICghYWxs
KQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENv
bXBvc2l0ZUFuaW1hdGlvbjo6dXBkYXRlS2V5ZnJhbWVBbmltYXRpb25zKFJlbmRlck9iamVjdCog
cmVuZGVyZXIsIGNvbnN0IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUsIFJlbmRlclN0eWxlKiB0
YXJnZXRTdHlsZSkKK3sKKyAgICAvLyBOb3RoaW5nIHRvIGRvIGlmIHdlIGRvbid0IGhhdmUgYW55
IGFuaW1hdGlvbnMsIGFuZCBkaWRuJ3QgaGF2ZSBhbnkgYmVmb3JlCisgICAgaWYgKG1fa2V5ZnJh
bWVBbmltYXRpb25zLmlzRW1wdHkoKSAmJiAhdGFyZ2V0U3R5bGUtPmhhc0FuaW1hdGlvbnMoKSkK
KyAgICAgICAgcmV0dXJuOworICAgIAorICAgIC8vIE5vdGhpbmcgdG8gZG8gaWYgdGhlIGN1cnJl
bnQgYW5kIHRhcmdldCBhbmltYXRpb25zIGFyZSB0aGUgc2FtZQorICAgIGlmIChjdXJyZW50U3R5
bGUgJiYgY3VycmVudFN0eWxlLT5oYXNBbmltYXRpb25zKCkgJiYgdGFyZ2V0U3R5bGUtPmhhc0Fu
aW1hdGlvbnMoKSAmJiAqKGN1cnJlbnRTdHlsZS0+YW5pbWF0aW9ucygpKSA9PSAqKHRhcmdldFN0
eWxlLT5hbmltYXRpb25zKCkpKQorICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgIGludCBu
dW1BbmltcyA9IDA7CisgICAgYm9vbCBhbmltc0NoYW5nZWQgPSBmYWxzZTsKKyAgICAKKyAgICAv
LyBzZWUgaWYgdGhlIGxpc3RzIG1hdGNoCisgICAgaWYgKHRhcmdldFN0eWxlLT5hbmltYXRpb25z
KCkpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YXJnZXRTdHlsZS0+YW5pbWF0
aW9ucygpLT5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgY29uc3QgQW5pbWF0aW9uKiBhbmlt
ID0gKCp0YXJnZXRTdHlsZS0+YW5pbWF0aW9ucygpKVtpXS5nZXQoKTsKKyAgICAgICAgICAgIAor
ICAgICAgICAgICAgaWYgKCFhbmltLT5pc1ZhbGlkQW5pbWF0aW9uKCkpCisgICAgICAgICAgICAg
ICAgYW5pbXNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAg
ICAgIEF0b21pY1N0cmluZyBuYW1lKGFuaW0tPm5hbWUoKSk7CisgICAgICAgICAgICAgICAgS2V5
ZnJhbWVBbmltYXRpb24qIGtmQW5pbSA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmdldChuYW1lLmlt
cGwoKSk7CisgICAgICAgICAgICAgICAgaWYgKCFrZkFuaW0gfHwgIWtmQW5pbS0+YW5pbWF0aW9u
c01hdGNoKGFuaW0pKQorICAgICAgICAgICAgICAgICAgICBhbmltc0NoYW5nZWQgPSB0cnVlOwor
ICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW0pIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIC8vIGFuaW1hdGlvbnMgbWF0Y2gsIGJ1dCBwbGF5IHN0YXRl
cyBtYXkgZGlmZmVyLiB1cGRhdGUgaWYgbmVlZGVkCisgICAgICAgICAgICAgICAgICAgICAgICBr
ZkFuaW0tPnVwZGF0ZVBsYXlTdGF0ZShhbmltLT5wbGF5U3RhdGUoKSA9PSBBbmltUGxheVN0YXRl
UGxheWluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAg
ICAgIC8vIHNldCB0aGUgc2F2ZWQgYW5pbWF0aW9uIHRvIHRoaXMgbmV3IG9uZSwganVzdCBpbiBj
YXNlIHRoZSBwbGF5IHN0YXRlIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICBr
ZkFuaW0tPnNldEFuaW1hdGlvbihhbmltKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgfQorICAgICAgICAgICAgKytudW1BbmltczsKKyAgICAgICAgfQorICAgIH0KKyAgICAK
KyAgICBpZiAoIWFuaW1zQ2hhbmdlZCAmJiBtX2tleWZyYW1lQW5pbWF0aW9ucy5zaXplKCkgIT0g
bnVtQW5pbXMpCisgICAgICAgIGFuaW1zQ2hhbmdlZCA9IHRydWU7CisKKyAgICBpZiAoIWFuaW1z
Q2hhbmdlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gYW5pbWF0aW9ucyBoYXZlIGNoYW5n
ZWQsIHVwZGF0ZSB0aGUgbGlzdAorICAgIHJlc2V0QW5pbWF0aW9ucyhyZW5kZXJlcik7CisKKyAg
ICBpZiAoIXRhcmdldFN0eWxlLT5hbmltYXRpb25zKCkpCisgICAgICAgIHJldHVybjsKKworICAg
IC8vIGFkZCBhbGwgdGhlIG5ldyBhbmltYXRpb25zCisgICAgaW50IGluZGV4ID0gMDsKKyAgICBm
b3IgKHNpemVfdCBpID0gMDsgaSA8IHRhcmdldFN0eWxlLT5hbmltYXRpb25zKCktPnNpemUoKTsg
KytpKSB7CisgICAgICAgIGNvbnN0IEFuaW1hdGlvbiogYW5pbSA9ICgqdGFyZ2V0U3R5bGUtPmFu
aW1hdGlvbnMoKSlbaV0uZ2V0KCk7CisKKyAgICAgICAgaWYgKCFhbmltLT5pc1ZhbGlkQW5pbWF0
aW9uKCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIAorICAgICAgICAvLyBk
b24ndCBib3RoZXIgYWRkaW5nIHRoZSBhbmltYXRpb24gaWYgaXQgaGFzIG5vIGtleWZyYW1lcyBv
ciB3b24ndCBhbmltYXRlCisgICAgICAgIGlmICgoYW5pbS0+ZHVyYXRpb24oKSB8fCBhbmltLT5k
ZWxheSgpKSAmJiBhbmltLT5pdGVyYXRpb25Db3VudCgpICYmCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIGFuaW0tPmtleWZyYW1lTGlzdCgpLmdldCgpICYmICFh
bmltLT5rZXlmcmFtZUxpc3QoKS0+aXNFbXB0eSgpKSB7CisgICAgICAgICAgICBLZXlmcmFtZUFu
aW1hdGlvbioga2ZhbmltID0gbmV3IEtleWZyYW1lQW5pbWF0aW9uKGNvbnN0X2Nhc3Q8QW5pbWF0
aW9uKj4oYW5pbSksIHJlbmRlcmVyLCBpbmRleCsrLCB0aGlzKTsKKyAgICAgICAgICAgIG1fa2V5
ZnJhbWVBbmltYXRpb25zLnNldChrZmFuaW0tPm5hbWUoKS5pbXBsKCksIGtmYW5pbSk7CisgICAg
ICAgIH0KKyAgICB9Cit9CisKK0tleWZyYW1lQW5pbWF0aW9uKiBDb21wb3NpdGVBbmltYXRpb246
OmZpbmRLZXlmcmFtZUFuaW1hdGlvbihjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUpCit7CisgICAg
cmV0dXJuIG1fa2V5ZnJhbWVBbmltYXRpb25zLmdldChuYW1lLmltcGwoKSk7Cit9CisKK1JlbmRl
clN0eWxlKiBDb21wb3NpdGVBbmltYXRpb246OmFuaW1hdGUoUmVuZGVyT2JqZWN0KiByZW5kZXJl
ciwgY29uc3QgUmVuZGVyU3R5bGUqIGN1cnJlbnRTdHlsZSwgUmVuZGVyU3R5bGUqIHRhcmdldFN0
eWxlKQoreworICAgIFJlbmRlclN0eWxlKiByZXN1bHRTdHlsZSA9IDA7CisgICAgCisgICAgLy8g
V2UgZG9uJ3QgZG8gYW55IHRyYW5zaXRpb25zIGlmIHdlIGRvbid0IGhhdmUgYSBjdXJyZW50U3R5
bGUgKG9uIHN0YXJ0dXApCisgICAgdXBkYXRlVHJhbnNpdGlvbnMocmVuZGVyZXIsIGN1cnJlbnRT
dHlsZSwgdGFyZ2V0U3R5bGUpOworICAgIAorICAgIGlmIChjdXJyZW50U3R5bGUpIHsKKyAgICAg
ICAgLy8gTm93IHRoYXQgd2UgaGF2ZSB0cmFuc2l0aW9uIG9iamVjdHMgcmVhZHksIGxldCB0aGVt
IGtub3cgYWJvdXQgdGhlIG5ldyBnb2FsIHN0YXRlLiAgV2Ugd2FudCB0aGVtCisgICAgICAgIC8v
IHRvIGZpbGwgaW4gYSBSZW5kZXJTdHlsZSomIG9ubHkgaWYgbmVlZGVkLgorICAgICAgICBDU1NQ
cm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3RyYW5zaXRpb25z
LmVuZCgpOworICAgICAgICBmb3IgKENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0
ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAg
ICAgICAgICAgIEltcGxpY2l0QW5pbWF0aW9uKiAgYW5pbSA9IGl0LT5zZWNvbmQ7CisgICAgICAg
ICAgICBpZiAoYW5pbSkgeworICAgICAgICAgICAgICAgIGFuaW0tPmFuaW1hdGUodGhpcywgcmVu
ZGVyZXIsIGN1cnJlbnRTdHlsZSwgdGFyZ2V0U3R5bGUsIHJlc3VsdFN0eWxlKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHVwZGF0ZUtleWZyYW1lQW5pbWF0aW9ucyhy
ZW5kZXJlciwgY3VycmVudFN0eWxlLCB0YXJnZXRTdHlsZSk7CisKKyAgICAvLyBOb3cgdGhhdCB3
ZSBoYXZlIGFuaW1hdGlvbiBvYmplY3RzIHJlYWR5LCBsZXQgdGhlbSBrbm93IGFib3V0IHRoZSBu
ZXcgZ29hbCBzdGF0ZS4gIFdlIHdhbnQgdGhlbQorICAgIC8vIHRvIGZpbGwgaW4gYSBSZW5kZXJT
dHlsZSomIG9ubHkgaWYgbmVlZGVkLgorICAgIGlmICh0YXJnZXRTdHlsZS0+aGFzQW5pbWF0aW9u
cygpKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGFyZ2V0U3R5bGUtPmFuaW1h
dGlvbnMoKS0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IEFuaW1hdGlvbiogYW5p
bSA9ICgqdGFyZ2V0U3R5bGUtPmFuaW1hdGlvbnMoKSlbaV0uZ2V0KCk7CisKKyAgICAgICAgICAg
IGlmIChhbmltLT5pc1ZhbGlkQW5pbWF0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICBBdG9taWNT
dHJpbmcgbmFtZShhbmltLT5uYW1lKCkpOworICAgICAgICAgICAgICAgIEtleWZyYW1lQW5pbWF0
aW9uKiBrZXlmcmFtZUFuaW0gPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5nZXQobmFtZS5pbXBsKCkp
OworICAgICAgICAgICAgICAgIGlmIChrZXlmcmFtZUFuaW0pCisgICAgICAgICAgICAgICAgICAg
IGtleWZyYW1lQW5pbS0+YW5pbWF0ZSh0aGlzLCByZW5kZXJlciwgY3VycmVudFN0eWxlLCB0YXJn
ZXRTdHlsZSwgcmVzdWx0U3R5bGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQor
ICAgIAorICAgIGNsZWFudXBGaW5pc2hlZEFuaW1hdGlvbnMocmVuZGVyZXIpOworCisgICAgcmV0
dXJuIHJlc3VsdFN0eWxlID8gcmVzdWx0U3R5bGUgOiB0YXJnZXRTdHlsZTsKK30KKworLy8gImFu
aW1hdGluZyIgbWVhbnMgdGhhdCBzb21ldGhpbmcgaXMgcnVubmluZyB0aGF0IHJlcXVpcmVzIHRo
ZSB0aW1lciB0byBrZWVwIGZpcmluZworLy8gKGUuZy4gYSB0cmFuc2l0aW9uKQordm9pZCBDb21w
b3NpdGVBbmltYXRpb246OnNldEFuaW1hdGluZyhib29sIGluQW5pbWF0aW5nKQoreworICAgIENT
U1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlv
bnMuZW5kKCk7CisgICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVy
YXRvciBpdCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAg
ICAgIEltcGxpY2l0QW5pbWF0aW9uKiAgdHJhbnNpdGlvbiA9IGl0LT5zZWNvbmQ7CisgICAgICAg
IHRyYW5zaXRpb24tPnNldEFuaW1hdGluZyhpbkFuaW1hdGluZyk7CisgICAgfQorCisgICAgQW5p
bWF0aW9uTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3Iga2ZlbmQgPSBtX2tleWZyYW1lQW5pbWF0aW9u
cy5lbmQoKTsKKyAgICBmb3IgKEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0g
bV9rZXlmcmFtZUFuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0ga2ZlbmQ7ICsraXQpIHsKKyAgICAg
ICAgS2V5ZnJhbWVBbmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOworICAgICAgICBhbmltLT5z
ZXRBbmltYXRpbmcoaW5BbmltYXRpbmcpOworICAgIH0KK30KKworYm9vbCBDb21wb3NpdGVBbmlt
YXRpb246OmFuaW1hdGluZygpCit7CisgICAgQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29u
c3RfaXRlcmF0b3IgZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKKyAgICBmb3IgKENTU1Byb3Bl
cnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90cmFuc2l0aW9ucy5iZWdp
bigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgSW1wbGljaXRBbmltYXRpb24qICB0cmFu
c2l0aW9uID0gaXQtPnNlY29uZDsKKyAgICAgICAgaWYgKHRyYW5zaXRpb24gJiYgdHJhbnNpdGlv
bi0+YW5pbWF0aW5nKCkgJiYgdHJhbnNpdGlvbi0+cnVubmluZygpKQorICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJh
dG9yIGtmZW5kID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuZW5kKCk7CisgICAgZm9yIChBbmltYXRp
b25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmJlZ2lu
KCk7IGl0ICE9IGtmZW5kOyArK2l0KSB7CisgICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBhbmlt
ID0gaXQtPnNlY29uZDsKKyAgICAgICAgaWYgKGFuaW0gJiYgIWFuaW0tPnBhdXNlZCgpICYmIGFu
aW0tPmFuaW1hdGluZygpICYmIGFuaW0tPmFjdGl2ZSgpKQorICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIENvbXBvc2l0ZUFuaW1h
dGlvbjo6cmVzZXRUcmFuc2l0aW9ucyhSZW5kZXJPYmplY3QqIHJlbmRlcmVyKQoreworICAgIENT
U1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlv
bnMuZW5kKCk7CisgICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVy
YXRvciBpdCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAg
ICAgIEltcGxpY2l0QW5pbWF0aW9uKiAgdHJhbnNpdGlvbiA9IGl0LT5zZWNvbmQ7CisgICAgICAg
IHRyYW5zaXRpb24tPnJlc2V0KHJlbmRlcmVyKTsKKyAgICAgICAgZGVsZXRlIHRyYW5zaXRpb247
CisgICAgfQorICAgIG1fdHJhbnNpdGlvbnMuY2xlYXIoKTsKK30KKwordm9pZCBDb21wb3NpdGVB
bmltYXRpb246OnJlc2V0QW5pbWF0aW9ucyhSZW5kZXJPYmplY3QqIHJlbmRlcmVyKQoreworICAg
IGRlbGV0ZUFsbFZhbHVlcyhtX2tleWZyYW1lQW5pbWF0aW9ucyk7CisgICAgbV9rZXlmcmFtZUFu
aW1hdGlvbnMuY2xlYXIoKTsKK30KKwordm9pZCBDb21wb3NpdGVBbmltYXRpb246OmNsZWFudXBG
aW5pc2hlZEFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0KiByZW5kZXJlcikKK3sKKyAgICBpZiAoc3Vz
cGVuZGVkKCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICAvLyBNYWtlIGEgbGlzdCBvZiB0
cmFuc2l0aW9ucyB0byBiZSBkZWxldGVkCisgICAgVmVjdG9yPGludD4gZmluaXNoZWRUcmFuc2l0
aW9uczsKKyAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBlbmQg
PSBtX3RyYW5zaXRpb25zLmVuZCgpOworCisgICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25z
TWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5k
OyArK2l0KSB7CisgICAgICAgIEltcGxpY2l0QW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsK
KyAgICAgICAgaWYgKCFhbmltKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChh
bmltLT5wb3N0QWN0aXZlKCkgJiYgIWFuaW0tPndhaXRpbmdGb3JFbmRFdmVudCgpKQorICAgICAg
ICAgICAgZmluaXNoZWRUcmFuc2l0aW9ucy5hcHBlbmQoYW5pbS0+YW5pbWF0aW5nUHJvcGVydHko
KSk7CisgICAgfQorICAgIAorICAgIC8vIERlbGV0ZSB0aGVtCisgICAgZm9yIChWZWN0b3I8aW50
Pjo6aXRlcmF0b3IgaXQgPSBmaW5pc2hlZFRyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9IGZpbmlz
aGVkVHJhbnNpdGlvbnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgSW1wbGljaXRBbmltYXRpb24q
IGFuaW0gPSBtX3RyYW5zaXRpb25zLmdldCgqaXQpOworICAgICAgICBpZiAoYW5pbSkgeworICAg
ICAgICAgICAgYW5pbS0+cmVzZXQocmVuZGVyZXIpOworICAgICAgICAgICAgZGVsZXRlIGFuaW07
CisgICAgICAgIH0KKyAgICAgICAgbV90cmFuc2l0aW9ucy5yZW1vdmUoKml0KTsKKyAgICB9CisK
KyAgICAvLyBNYWtlIGEgbGlzdCBvZiBhbmltYXRpb25zIHRvIGJlIGRlbGV0ZWQKKyAgICBWZWN0
b3I8QXRvbWljU3RyaW5nSW1wbCo+IGZpbmlzaGVkQW5pbWF0aW9uczsKKyAgICBBbmltYXRpb25O
YW1lTWFwOjpjb25zdF9pdGVyYXRvciBrZmVuZCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmVuZCgp
OworCisgICAgZm9yIChBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5
ZnJhbWVBbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IGtmZW5kOyArK2l0KSB7CisgICAgICAgIEtl
eWZyYW1lQW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKKyAgICAgICAgaWYgKCFhbmltKQor
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChhbmltLT5wb3N0QWN0aXZlKCkgJiYg
IWFuaW0tPndhaXRpbmdGb3JFbmRFdmVudCgpKQorICAgICAgICAgICAgZmluaXNoZWRBbmltYXRp
b25zLmFwcGVuZChhbmltLT5uYW1lKCkuaW1wbCgpKTsKKyAgICB9CisgICAgCisgICAgLy8gZGVs
ZXRlIHRoZW0KKyAgICBmb3IgKFZlY3RvcjxBdG9taWNTdHJpbmdJbXBsKj46Oml0ZXJhdG9yIGl0
ID0gZmluaXNoZWRBbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IGZpbmlzaGVkQW5pbWF0aW9ucy5l
bmQoKTsgKytpdCkgeworICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbioga2ZhbmltID0gbV9rZXlm
cmFtZUFuaW1hdGlvbnMuZ2V0KCppdCk7CisgICAgICAgIGlmIChrZmFuaW0pIHsKKyAgICAgICAg
ICAgIGtmYW5pbS0+cmVzZXQocmVuZGVyZXIpOworICAgICAgICAgICAgZGVsZXRlIGtmYW5pbTsK
KyAgICAgICAgfQorICAgICAgICBtX2tleWZyYW1lQW5pbWF0aW9ucy5yZW1vdmUoKml0KTsKKyAg
ICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlQW5pbWF0aW9uOjpzZXRBbmltYXRpb25TdGFydFRpbWUo
ZG91YmxlIHQpCit7CisgICAgLy8gc2V0IHN0YXJ0IHRpbWUgb24gYWxsIGFuaW1hdGlvbnMgd2Fp
dGluZyBmb3IgaXQKKyAgICBBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBrZmVuZCA9
IG1fa2V5ZnJhbWVBbmltYXRpb25zLmVuZCgpOworICAgIGZvciAoQW5pbWF0aW9uTmFtZU1hcDo6
Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5iZWdpbigpOyBpdCAhPSBr
ZmVuZDsgKytpdCkgeworICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNv
bmQ7CisgICAgICAgIGlmIChhbmltICYmIGFuaW0tPndhaXRpbmdGb3JTdGFydFRpbWUoKSkKKyAg
ICAgICAgICAgIGFuaW0tPnVwZGF0ZVN0YXRlTWFjaGluZShBbmltYXRpb25CYXNlOjpTVEFURV9J
TlBVVF9TVEFSVF9USU1FX1NFVCwgdCk7CisgICAgfQorfQorCit2b2lkIENvbXBvc2l0ZUFuaW1h
dGlvbjo6c2V0VHJhbnNpdGlvblN0YXJ0VGltZShpbnQgcHJvcGVydHksIGRvdWJsZSB0KQorewor
ICAgIC8vIFNldCB0aGUgc3RhcnQgdGltZSBmb3IgZ2l2ZW4gcHJvcGVydHkgdHJhbnNpdGlvbgor
ICAgIENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJh
bnNpdGlvbnMuZW5kKCk7CisgICAgZm9yIChDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25z
dF9pdGVyYXRvciBpdCA9IG1fdHJhbnNpdGlvbnMuYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7
CisgICAgICAgIEltcGxpY2l0QW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKKyAgICAgICAg
aWYgKGFuaW0gJiYgYW5pbS0+d2FpdGluZ0ZvclN0YXJ0VGltZSgpICYmIGFuaW0tPmFuaW1hdGlu
Z1Byb3BlcnR5KCkgPT0gcHJvcGVydHkpCisgICAgICAgICAgICBhbmltLT51cGRhdGVTdGF0ZU1h
Y2hpbmUoQW5pbWF0aW9uQmFzZTo6U1RBVEVfSU5QVVRfU1RBUlRfVElNRV9TRVQsIHQpOworICAg
IH0KK30KKwordm9pZCBDb21wb3NpdGVBbmltYXRpb246OnN1c3BlbmRBbmltYXRpb25zKCkKK3sK
KyAgICBpZiAobV9zdXNwZW5kZWQpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBtX3N1c3Bl
bmRlZCA9IHRydWU7CisKKyAgICBBbmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBrZmVu
ZCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmVuZCgpOworICAgIGZvciAoQW5pbWF0aW9uTmFtZU1h
cDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lQW5pbWF0aW9ucy5iZWdpbigpOyBpdCAh
PSBrZmVuZDsgKytpdCkgeworICAgICAgICBLZXlmcmFtZUFuaW1hdGlvbiogYW5pbSA9IGl0LT5z
ZWNvbmQ7CisgICAgICAgIGlmIChhbmltKQorICAgICAgICAgICAgYW5pbS0+dXBkYXRlUGxheVN0
YXRlKGZhbHNlKTsKKyAgICB9CisKKyAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25z
dF9pdGVyYXRvciBlbmQgPSBtX3RyYW5zaXRpb25zLmVuZCgpOworICAgIGZvciAoQ1NTUHJvcGVy
dHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2lu
KCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogYW5pbSA9
IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmIChhbmltICYmIGFuaW0tPmhhc1N0eWxlKCkpCisgICAg
ICAgICAgICBhbmltLT51cGRhdGVQbGF5U3RhdGUoZmFsc2UpOworICAgIH0KK30KKwordm9pZCBD
b21wb3NpdGVBbmltYXRpb246OnJlc3VtZUFuaW1hdGlvbnMoKQoreworICAgIGlmICghbV9zdXNw
ZW5kZWQpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICBtX3N1c3BlbmRlZCA9IGZhbHNlOwor
ICAgIAorICAgIEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlm
cmFtZUFuaW1hdGlvbnMuZW5kKCk7CisgICAgZm9yIChBbmltYXRpb25OYW1lTWFwOjpjb25zdF9p
dGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmJlZ2luKCk7IGl0ICE9IGtmZW5kOyAr
K2l0KSB7CisgICAgICAgIEtleWZyYW1lQW5pbWF0aW9uKiBhbmltID0gaXQtPnNlY29uZDsKKyAg
ICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+cGxheVN0YXRlUGxheWluZygpKQorICAgICAgICAgICAg
YW5pbS0+dXBkYXRlUGxheVN0YXRlKHRydWUpOworICAgIH0KKyAgICAKKyAgICBDU1NQcm9wZXJ0
eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBlbmQgPSBtX3RyYW5zaXRpb25zLmVuZCgp
OworICAgIGZvciAoQ1NTUHJvcGVydHlUcmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgaXQg
PSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBJbXBs
aWNpdEFuaW1hdGlvbiogYW5pbSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmIChhbmltICYmIGFu
aW0tPmhhc1N0eWxlKCkpCisgICAgICAgICAgICBhbmltLT51cGRhdGVQbGF5U3RhdGUodHJ1ZSk7
CisgICAgfQorfQorCit2b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6b3ZlcnJpZGVJbXBsaWNpdEFu
aW1hdGlvbnMoaW50IHByb3BlcnR5KQoreworICAgIENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6
OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7CisgICAgZm9yIChDU1NQ
cm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fdHJhbnNpdGlvbnMu
YmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIEltcGxpY2l0QW5pbWF0aW9uKiBh
bmltID0gaXQtPnNlY29uZDsKKyAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+YW5pbWF0aW5nUHJv
cGVydHkoKSA9PSBwcm9wZXJ0eSkKKyAgICAgICAgICAgIGFuaW0tPnNldE92ZXJyaWRkZW4odHJ1
ZSk7CisgICAgfQorfQorCit2b2lkIENvbXBvc2l0ZUFuaW1hdGlvbjo6cmVzdW1lT3ZlcnJpZGRl
bkltcGxpY2l0QW5pbWF0aW9ucyhpbnQgcHJvcGVydHkpCit7CisgICAgQ1NTUHJvcGVydHlUcmFu
c2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV90cmFuc2l0aW9ucy5lbmQoKTsKKyAg
ICBmb3IgKENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gbV90
cmFuc2l0aW9ucy5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgICAgSW1wbGljaXRB
bmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAoYW5pbSAmJiBhbmltLT5h
bmltYXRpbmdQcm9wZXJ0eSgpID09IHByb3BlcnR5KQorICAgICAgICAgICAgYW5pbS0+c2V0T3Zl
cnJpZGRlbihmYWxzZSk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIGJvb2wgY29tcGFyZUFu
aW1hdGlvbkluZGljZXMoY29uc3QgS2V5ZnJhbWVBbmltYXRpb24qIGEsIGNvbnN0IEtleWZyYW1l
QW5pbWF0aW9uKiBiKQoreworICAgIHJldHVybiBhLT5pbmRleCgpIDwgYi0+aW5kZXgoKTsKK30K
Kwordm9pZCBDb21wb3NpdGVBbmltYXRpb246OnN0eWxlQXZhaWxhYmxlKCkKK3sKKyAgICBpZiAo
bV9udW1TdHlsZUF2YWlsYWJsZVdhaXRlcnMgPT0gMCkKKyAgICAgICAgcmV0dXJuOworICAgIAor
ICAgIC8vIFdlIGhhdmUgdG8gZ28gdGhyb3VnaCBhbmltYXRpb25zIGluIHRoZSBvcmRlciBpbiB3
aGljaCB0aGV5IGFwcGVhciBpbgorICAgIC8vIHRoZSBzdHlsZSwgYmVjYXVzZSBvcmRlciBtYXR0
ZXJzIGZvciBhZGRpdGl2aXR5LgorICAgIFZlY3RvcjxLZXlmcmFtZUFuaW1hdGlvbio+IGFuaW1h
dGlvbnMobV9rZXlmcmFtZUFuaW1hdGlvbnMuc2l6ZSgpKTsKKyAgICBBbmltYXRpb25OYW1lTWFw
Ojpjb25zdF9pdGVyYXRvciBrZmVuZCA9IG1fa2V5ZnJhbWVBbmltYXRpb25zLmVuZCgpOworICAg
IHNpemVfdCBpID0gMDsKKyAgICBmb3IgKEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0X2l0ZXJhdG9y
IGl0ID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuYmVnaW4oKTsgaXQgIT0ga2ZlbmQ7ICsraXQpIHsK
KyAgICAgICAgS2V5ZnJhbWVBbmltYXRpb24qIGFuaW0gPSBpdC0+c2Vjb25kOworICAgICAgICAv
LyBXZSBjYW4ndCBqdXN0IGluc2VydCBiYXNlZCBvbiBhbmltLT5pbmRleCgpIGJlY2F1c2UgaW52
YWxpZCBhbmltYXRpb25zIGRvbid0CisgICAgICAgIC8vIG1ha2UgaXQgaW50byB0aGUgaGFzaC4K
KyAgICAgICAgYW5pbWF0aW9uc1tpKytdID0gYW5pbTsKKyAgICB9CisKKyAgICBpZiAoYW5pbWF0
aW9ucy5zaXplKCkgPiAxKQorICAgICAgICBzdGQ6OnN0YWJsZV9zb3J0KGFuaW1hdGlvbnMuYmVn
aW4oKSwgYW5pbWF0aW9ucy5lbmQoKSwgY29tcGFyZUFuaW1hdGlvbkluZGljZXMpOworICAgIAor
ICAgIGZvciAoaSA9IDA7IGkgPCBhbmltYXRpb25zLnNpemUoKTsgKytpKSB7CisgICAgICAgIEtl
eWZyYW1lQW5pbWF0aW9uKiBhbmltID0gYW5pbWF0aW9uc1tpXTsKKyAgICAgICAgaWYgKGFuaW0g
JiYgYW5pbS0+d2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKCkpCisgICAgICAgICAgICBhbmltLT51
cGRhdGVTdGF0ZU1hY2hpbmUoQW5pbWF0aW9uQmFzZTo6U1RBVEVfSU5QVVRfU1RZTEVfQVZBSUxB
QkxFLCAtMSk7CisgICAgfQorICAgIAorICAgIENTU1Byb3BlcnR5VHJhbnNpdGlvbnNNYXA6OmNv
bnN0X2l0ZXJhdG9yIGVuZCA9IG1fdHJhbnNpdGlvbnMuZW5kKCk7CisgICAgZm9yIChDU1NQcm9w
ZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fdHJhbnNpdGlvbnMuYmVn
aW4oKTsgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICAgIEltcGxpY2l0QW5pbWF0aW9uKiBhbmlt
ID0gaXQtPnNlY29uZDsKKyAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+d2FpdGluZ0ZvclN0eWxl
QXZhaWxhYmxlKCkpCisgICAgICAgICAgICBhbmltLT51cGRhdGVTdGF0ZU1hY2hpbmUoQW5pbWF0
aW9uQmFzZTo6U1RBVEVfSU5QVVRfU1RZTEVfQVZBSUxBQkxFLCAtMSk7CisgICAgfQorfQorCiti
b29sIENvbXBvc2l0ZUFuaW1hdGlvbjo6aXNBbmltYXRpbmdQcm9wZXJ0eShpbnQgcHJvcGVydHks
IGJvb2wgaXNSdW5uaW5nTm93KSBjb25zdAoreworICAgIEFuaW1hdGlvbk5hbWVNYXA6OmNvbnN0
X2l0ZXJhdG9yIGtmZW5kID0gbV9rZXlmcmFtZUFuaW1hdGlvbnMuZW5kKCk7CisgICAgZm9yIChB
bmltYXRpb25OYW1lTWFwOjpjb25zdF9pdGVyYXRvciBpdCA9IG1fa2V5ZnJhbWVBbmltYXRpb25z
LmJlZ2luKCk7IGl0ICE9IGtmZW5kOyArK2l0KSB7CisgICAgICAgIEtleWZyYW1lQW5pbWF0aW9u
KiBhbmltID0gaXQtPnNlY29uZDsKKyAgICAgICAgaWYgKGFuaW0gJiYgYW5pbS0+aXNBbmltYXRp
bmdQcm9wZXJ0eShwcm9wZXJ0eSwgaXNSdW5uaW5nTm93KSkKKyAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgIH0KKyAgICAKKyAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOjpjb25zdF9p
dGVyYXRvciBlbmQgPSBtX3RyYW5zaXRpb25zLmVuZCgpOworICAgIGZvciAoQ1NTUHJvcGVydHlU
cmFuc2l0aW9uc01hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX3RyYW5zaXRpb25zLmJlZ2luKCk7
IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBJbXBsaWNpdEFuaW1hdGlvbiogYW5pbSA9IGl0
LT5zZWNvbmQ7CisgICAgICAgIGlmIChhbmltICYmIGFuaW0tPmlzQW5pbWF0aW5nUHJvcGVydHko
cHJvcGVydHksIGlzUnVubmluZ05vdykpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
CisgICAgcmV0dXJuIGZhbHNlOworfQorICAgIAordm9pZCBDb21wb3NpdGVBbmltYXRpb246OnNl
dFdhaXRpbmdGb3JTdHlsZUF2YWlsYWJsZShib29sIHdhaXRpbmcpCit7CisgICAgaWYgKHdhaXRp
bmcpCisgICAgICAgIG1fbnVtU3R5bGVBdmFpbGFibGVXYWl0ZXJzKys7CisgICAgZWxzZQorICAg
ICAgICBtX251bVN0eWxlQXZhaWxhYmxlV2FpdGVycy0tOworICAgIG1fYW5pbWF0aW9uQ29udHJv
bGxlci0+c2V0V2FpdGluZ0ZvclN0eWxlQXZhaWxhYmxlKHdhaXRpbmcpOworfQorICAgIAorfQpJ
bmRleDogV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9Db21wb3NpdGVBbmltYXRpb24uaAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3BhZ2UvYW5pbWF0aW9uL0NvbXBvc2l0ZUFuaW1hdGlvbi5oCShyZXZp
c2lvbiAwKQorKysgV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9Db21wb3NpdGVBbmltYXRpb24uaAko
cmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAy
LiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAz
LiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9y
IHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5k
b3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdh
cmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFT
IElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgQ29tcG9zaXRlQW5pbWF0
aW9uX2gKKyNkZWZpbmUgQ29tcG9zaXRlQW5pbWF0aW9uX2gKKworI2luY2x1ZGUgInd0Zi9Ob25j
b3B5YWJsZS5oIgorI2luY2x1ZGUgIkF0b21pY1N0cmluZy5oIgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK2NsYXNzIEFuaW1hdGlvbkNvbnRyb2xsZXI7CitjbGFzcyBSZW5kZXJTdHlsZTsKK2Ns
YXNzIFJlbmRlck9iamVjdDsKK2NsYXNzIEtleWZyYW1lQW5pbWF0aW9uOworY2xhc3MgSW1wbGlj
aXRBbmltYXRpb247CisKKy8vIEEgQ29tcG9zaXRlQW5pbWF0aW9uIHJlcHJlc2VudHMgYSBjb2xs
ZWN0aW9uIG9mIGFuaW1hdGlvbnMgdGhhdCBhcmUgcnVubmluZworLy8gb24gYSBzaW5nbGUgUmVu
ZGVyT2JqZWN0LCBzdWNoIGFzIGEgbnVtYmVyIG9mIHByb3BlcnRpZXMgdHJhbnNpdGlvbmluZyBh
dCBvbmNlLgorY2xhc3MgQ29tcG9zaXRlQW5pbWF0aW9uIDogcHVibGljIE5vbmNvcHlhYmxlIHsK
K3B1YmxpYzoKKyAgICBDb21wb3NpdGVBbmltYXRpb24oQW5pbWF0aW9uQ29udHJvbGxlciogYW5p
bWF0aW9uQ29udHJvbGxlcikKKyAgICA6IG1fc3VzcGVuZGVkKGZhbHNlKQorICAgICwgbV9hbmlt
YXRpb25Db250cm9sbGVyKGFuaW1hdGlvbkNvbnRyb2xsZXIpCisgICAgLCBtX251bVN0eWxlQXZh
aWxhYmxlV2FpdGVycygwKQorICAgIHsgfQorICAgIAorICAgIH5Db21wb3NpdGVBbmltYXRpb24o
KTsKKyAgICAgICAgCisgICAgUmVuZGVyU3R5bGUqIGFuaW1hdGUoUmVuZGVyT2JqZWN0KiwgY29u
c3QgUmVuZGVyU3R5bGUqIGN1cnJlbnRTdHlsZSwgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlKTsK
KyAgICAKKyAgICB2b2lkIHNldEFuaW1hdGluZyhib29sIGluQW5pbWF0aW5nKTsKKyAgICBib29s
IGFuaW1hdGluZygpOworICAgIAorICAgIGJvb2wgaGFzQW5pbWF0aW9uRm9yUHJvcGVydHkoaW50
IHByb3ApIGNvbnN0IHsgcmV0dXJuIG1fdHJhbnNpdGlvbnMuY29udGFpbnMocHJvcCk7IH0KKyAg
ICAKKyAgICB2b2lkIHJlc2V0VHJhbnNpdGlvbnMoUmVuZGVyT2JqZWN0Kik7CisgICAgdm9pZCBy
ZXNldEFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0Kik7CisgICAgCisgICAgdm9pZCBjbGVhbnVwRmlu
aXNoZWRBbmltYXRpb25zKFJlbmRlck9iamVjdCopOworCisgICAgdm9pZCBzZXRBbmltYXRpb25T
dGFydFRpbWUoZG91YmxlIHQpOworICAgIHZvaWQgc2V0VHJhbnNpdGlvblN0YXJ0VGltZShpbnQg
cHJvcGVydHksIGRvdWJsZSB0KTsKKyAgICAKKyAgICB2b2lkIHN1c3BlbmRBbmltYXRpb25zKCk7
CisgICAgdm9pZCByZXN1bWVBbmltYXRpb25zKCk7CisgICAgYm9vbCBzdXNwZW5kZWQoKSBjb25z
dCB7IHJldHVybiBtX3N1c3BlbmRlZDsgfQorICAgIAorICAgIHZvaWQgb3ZlcnJpZGVJbXBsaWNp
dEFuaW1hdGlvbnMoaW50IHByb3BlcnR5KTsKKyAgICB2b2lkIHJlc3VtZU92ZXJyaWRkZW5JbXBs
aWNpdEFuaW1hdGlvbnMoaW50IHByb3BlcnR5KTsKKyAgICAKKyAgICB2b2lkIHN0eWxlQXZhaWxh
YmxlKCk7CisgICAgCisgICAgYm9vbCBpc0FuaW1hdGluZ1Byb3BlcnR5KGludCBwcm9wZXJ0eSwg
Ym9vbCBpc1J1bm5pbmdOb3cpIGNvbnN0OworICAgIAorICAgIHZvaWQgc2V0V2FpdGluZ0ZvclN0
eWxlQXZhaWxhYmxlKGJvb2wgd2FpdGluZyk7CisKK3Byb3RlY3RlZDoKKyAgICB2b2lkIHVwZGF0
ZVRyYW5zaXRpb25zKFJlbmRlck9iamVjdCogcmVuZGVyZXIsIGNvbnN0IFJlbmRlclN0eWxlKiBj
dXJyZW50U3R5bGUsIFJlbmRlclN0eWxlKiB0YXJnZXRTdHlsZSk7CisgICAgdm9pZCB1cGRhdGVL
ZXlmcmFtZUFuaW1hdGlvbnMoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5
bGUqIGN1cnJlbnRTdHlsZSwgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlKTsKKworICAgIEtleWZy
YW1lQW5pbWF0aW9uKiBmaW5kS2V5ZnJhbWVBbmltYXRpb24oY29uc3QgQXRvbWljU3RyaW5nJiBu
YW1lKTsKKyAgICAKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBIYXNoTWFwPGludCwgSW1wbGljaXRB
bmltYXRpb24qPiBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwOworICAgIHR5cGVkZWYgSGFzaE1h
cDxBdG9taWNTdHJpbmdJbXBsKiwgS2V5ZnJhbWVBbmltYXRpb24qPiAgQW5pbWF0aW9uTmFtZU1h
cDsKKyAgICAKKyAgICBDU1NQcm9wZXJ0eVRyYW5zaXRpb25zTWFwICAgbV90cmFuc2l0aW9uczsK
KyAgICBBbmltYXRpb25OYW1lTWFwICAgICAgICAgICAgbV9rZXlmcmFtZUFuaW1hdGlvbnM7Cisg
ICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1fc3VzcGVuZGVkOworICAgIEFuaW1hdGlv
bkNvbnRyb2xsZXIqICAgICAgICBtX2FuaW1hdGlvbkNvbnRyb2xsZXI7CisgICAgdWludDMyX3Qg
ICAgICAgICAgICAgICAgICAgIG1fbnVtU3R5bGVBdmFpbGFibGVXYWl0ZXJzOworfTsKKworfQor
CisjZW5kaWYKSW5kZXg6IFdlYkNvcmUvcGFnZS9hbmltYXRpb24vSW1wbGljaXRBbmltYXRpb24u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGFnZS9hbmltYXRpb24vSW1wbGljaXRBbmltYXRp
b24uY3BwCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9JbXBsaWNpdEFu
aW1hdGlvbi5jcHAJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4g
KCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBi
ZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJv
bSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9u
LiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09O
VFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiSW1wbGljaXRBbmltYXRpb24uaCIKKyNpbmNsdWRlICJSZW5k
ZXJPYmplY3QuaCIKKyNpbmNsdWRlICJFdmVudE5hbWVzLmgiCisjaW5jbHVkZSAiQ1NTUHJvcGVy
dHlOYW1lcy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0ltcGxpY2l0QW5pbWF0aW9uOjpJ
bXBsaWNpdEFuaW1hdGlvbihjb25zdCBBbmltYXRpb24qIHRyYW5zaXRpb24sIGludCBhbmltYXRp
bmdQcm9wZXJ0eSwgUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgQ29tcG9zaXRlQW5pbWF0aW9uKiBj
b21wQW5pbSkKKzogQW5pbWF0aW9uQmFzZSh0cmFuc2l0aW9uLCByZW5kZXJlciwgY29tcEFuaW0p
CissIG1fdHJhbnNpdGlvblByb3BlcnR5KHRyYW5zaXRpb24tPnByb3BlcnR5KCkpCissIG1fYW5p
bWF0aW5nUHJvcGVydHkoYW5pbWF0aW5nUHJvcGVydHkpCissIG1fb3ZlcnJpZGRlbihmYWxzZSkK
KywgbV9mcm9tU3R5bGUoMCkKKywgbV90b1N0eWxlKDApCit7CisgICAgQVNTRVJUKGFuaW1hdGlu
Z1Byb3BlcnR5ICE9IGNBbmltYXRlQWxsKTsKK30KKyAgICAKK2Jvb2wgSW1wbGljaXRBbmltYXRp
b246OnNob3VsZFNlbmRFdmVudEZvckxpc3RlbmVyKERvY3VtZW50OjpMaXN0ZW5lclR5cGUgaW5M
aXN0ZW5lclR5cGUpCit7CisgICAgcmV0dXJuIG1fb2JqZWN0LT5kb2N1bWVudCgpLT5oYXNMaXN0
ZW5lclR5cGUoaW5MaXN0ZW5lclR5cGUpOworfQorCit2b2lkIEltcGxpY2l0QW5pbWF0aW9uOjph
bmltYXRlKENvbXBvc2l0ZUFuaW1hdGlvbiogYW5pbWF0aW9uLCBSZW5kZXJPYmplY3QqIHJlbmRl
cmVyLCBjb25zdCBSZW5kZXJTdHlsZSogY3VycmVudFN0eWxlLCAKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgY29uc3QgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxlLCBSZW5kZXJTdHls
ZSomIGFuaW1hdGVkU3R5bGUpCit7CisgICAgaWYgKHBhdXNlZCgpKQorICAgICAgICByZXR1cm47
CisgICAgCisgICAgLy8gSWYgd2UgZ2V0IHRoaXMgZmFyIGFuZCB0aGUgYW5pbWF0aW9uIGlzIGRv
bmUsIGl0IG1lYW5zIHdlIGFyZSBjbGVhbmluZyB1cCBhIGp1c3QgZmluaXNoZWQgYW5pbWF0aW9u
LgorICAgIC8vIFNvIGp1c3QgcmV0dXJuLiBFdmVyeXRoaW5nIGlzIGFscmVhZHkgYWxsIGNsZWFu
ZWQgdXAKKyAgICBpZiAocG9zdEFjdGl2ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBS
ZXNldCB0byBzdGFydCB0aGUgdHJhbnNpdGlvbiBpZiB3ZSBhcmUgbmV3CisgICAgaWYgKGlzTmV3
KCkpCisgICAgICAgIHJlc2V0KHJlbmRlcmVyLCBjdXJyZW50U3R5bGUsIHRhcmdldFN0eWxlKTsK
KyAgICAKKyAgICAvLyBSdW4gYSBjeWNsZSBvZiBhbmltYXRpb24uCisgICAgLy8gV2Uga25vdyB3
ZSB3aWxsIG5lZWQgYSBuZXcgcmVuZGVyIHN0eWxlLCBzbyBtYWtlIG9uZSBpZiBuZWVkZWQKKyAg
ICBpZiAoIWFuaW1hdGVkU3R5bGUpCisgICAgICAgIGFuaW1hdGVkU3R5bGUgPSBuZXcgKHJlbmRl
cmVyLT5yZW5kZXJBcmVuYSgpKSBSZW5kZXJTdHlsZSgqdGFyZ2V0U3R5bGUpOworICAgIAorICAg
IGRvdWJsZSBwcm9nID0gcHJvZ3Jlc3MoMSwgMCk7CisgICAgYm9vbCBuZWVkc0FuaW0gPSBibGVu
ZFByb3BlcnRpZXMobV9hbmltYXRpbmdQcm9wZXJ0eSwgYW5pbWF0ZWRTdHlsZSwgbV9mcm9tU3R5
bGUsIG1fdG9TdHlsZSwgcHJvZyk7CisgICAgaWYgKG5lZWRzQW5pbSkKKyAgICAgICAgc2V0QW5p
bWF0aW5nKCk7Cit9CisKK3ZvaWQgSW1wbGljaXRBbmltYXRpb246Om9uQW5pbWF0aW9uRW5kKGRv
dWJsZSBpbkVsYXBzZWRUaW1lKQoreworICAgIGlmICghc2VuZFRyYW5zaXRpb25FdmVudChFdmVu
dE5hbWVzOjp3ZWJraXRUcmFuc2l0aW9uRW5kRXZlbnQsIGluRWxhcHNlZFRpbWUpKSB7CisgICAg
ICAgIC8vIFdlIGRpZG4ndCBkaXNwYXRjaCBhbiBldmVudCwgd2hpY2ggd291bGQgY2FsbCBlbmRB
bmltYXRpb24oKSwgc28gd2UnbGwganVzdCBjYWxsIGl0IGhlcmUuCisgICAgICAgIGVuZEFuaW1h
dGlvbih0cnVlKTsKKyAgICB9Cit9CisKK2Jvb2wgSW1wbGljaXRBbmltYXRpb246OnNlbmRUcmFu
c2l0aW9uRXZlbnQoY29uc3QgQXRvbWljU3RyaW5nJiBpbkV2ZW50VHlwZSwgZG91YmxlIGluRWxh
cHNlZFRpbWUpCit7CisgICAgaWYgKGluRXZlbnRUeXBlID09IEV2ZW50TmFtZXM6OndlYmtpdFRy
YW5zaXRpb25FbmRFdmVudCkgeworICAgICAgICBEb2N1bWVudDo6TGlzdGVuZXJUeXBlIGxpc3Rl
bmVyVHlwZSA9IERvY3VtZW50OjpUUkFOU0lUSU9ORU5EX0xJU1RFTkVSOworICAgICAgICAKKyAg
ICAgICAgaWYgKHNob3VsZFNlbmRFdmVudEZvckxpc3RlbmVyKGxpc3RlbmVyVHlwZSkpIHsKKyAg
ICAgICAgICAgIEVsZW1lbnQqIGVsZW1lbnQgPSBlbGVtZW50Rm9yRXZlbnREaXNwYXRjaCgpOwor
ICAgICAgICAgICAgaWYgKGVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcHJvcGVy
dHlOYW1lOworICAgICAgICAgICAgICAgIGlmIChtX3RyYW5zaXRpb25Qcm9wZXJ0eSAhPSBjQW5p
bWF0ZUFsbCkKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lID0gU3RyaW5nKGdldFBy
b3BlcnR5TmFtZSgoQ1NTUHJvcGVydHlJRCltX3RyYW5zaXRpb25Qcm9wZXJ0eSkpOworICAgICAg
ICAgICAgICAgIG1fd2FpdGluZ0ZvckVuZEV2ZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBt
X2FuaW1hdGlvbkV2ZW50RGlzcGF0Y2hlci5zdGFydFRpbWVyKGVsZW1lbnQsIHByb3BlcnR5TmFt
ZSwgbV90cmFuc2l0aW9uUHJvcGVydHksIHRydWUsIGluRXZlbnRUeXBlLCBpbkVsYXBzZWRUaW1l
KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gRGlkIGRpc3BhdGNoIGFuIGV2ZW50
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgcmV0dXJuIGZhbHNl
OyAvLyBEaWRuJ3QgZGlzcGF0Y2ggYW4gZXZlbnQKK30KKwordm9pZCBJbXBsaWNpdEFuaW1hdGlv
bjo6cmVzZXQoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVyU3R5bGUqIGZyb20g
LyogPSAwICovLCBjb25zdCBSZW5kZXJTdHlsZSogdG8gLyogPSAwICovKQoreworICAgIEFTU0VS
VCgoIW1fdG9TdHlsZSAmJiAhdG8pIHx8IG1fdG9TdHlsZSAhPSB0byk7CisgICAgQVNTRVJUKCgh
bV9mcm9tU3R5bGUgJiYgIWZyb20pIHx8IG1fZnJvbVN0eWxlICE9IGZyb20pOworICAgIGlmICht
X2Zyb21TdHlsZSkKKyAgICAgICAgbV9mcm9tU3R5bGUtPmRlcmVmKHJlbmRlcmVyLT5yZW5kZXJB
cmVuYSgpKTsKKyAgICBpZiAobV90b1N0eWxlKQorICAgICAgICBtX3RvU3R5bGUtPmRlcmVmKHJl
bmRlcmVyLT5yZW5kZXJBcmVuYSgpKTsKKyAgICAKKyAgICBtX2Zyb21TdHlsZSA9IGNvbnN0X2Nh
c3Q8UmVuZGVyU3R5bGUqPihmcm9tKTsgICAvLyBpdCBpcyByZWFkLW9ubHksIG90aGVyIHRoYW4g
dGhlIHJlZgorICAgIGlmIChtX2Zyb21TdHlsZSkKKyAgICAgICAgbV9mcm9tU3R5bGUtPnJlZigp
OworICAgIAorICAgIG1fdG9TdHlsZSA9IGNvbnN0X2Nhc3Q8UmVuZGVyU3R5bGUqPih0byk7ICAg
ICAgIC8vIGl0IGlzIHJlYWQtb25seSwgb3RoZXIgdGhhbiB0aGUgcmVmCisgICAgaWYgKG1fdG9T
dHlsZSkKKyAgICAgICAgbV90b1N0eWxlLT5yZWYoKTsKKyAgICAKKyAgICAvLyByZXN0YXJ0IHRo
ZSB0cmFuc2l0aW9uCisgICAgaWYgKGZyb20gJiYgdG8pCisgICAgICAgIHVwZGF0ZVN0YXRlTWFj
aGluZShTVEFURV9JTlBVVF9SRVNUQVJUX0FOSU1BVElPTiwgLTEpOworfQorCit2b2lkIEltcGxp
Y2l0QW5pbWF0aW9uOjpzZXRPdmVycmlkZGVuKGJvb2wgYikKK3sKKyAgICBpZiAoYiAhPSBtX292
ZXJyaWRkZW4pIHsKKyAgICAgICAgbV9vdmVycmlkZGVuID0gYjsKKyAgICAgICAgdXBkYXRlU3Rh
dGVNYWNoaW5lKG1fb3ZlcnJpZGRlbiA/IFNUQVRFX0lOUFVUX1BBVVNFX09WRVJSSURFIDogU1RB
VEVfSU5QVVRfUkVTVU1FX09WRVJSSURFLCAtMSk7CisgICAgfQorfQorCitib29sIEltcGxpY2l0
QW5pbWF0aW9uOjphZmZlY3RzUHJvcGVydHkoaW50IHByb3BlcnR5KSBjb25zdAoreworICAgIHJl
dHVybiAobV9hbmltYXRpbmdQcm9wZXJ0eSA9PSBwcm9wZXJ0eSk7Cit9CisKK2Jvb2wgSW1wbGlj
aXRBbmltYXRpb246OmlzVGFyZ2V0UHJvcGVydHlFcXVhbChpbnQgcHJvcCwgY29uc3QgUmVuZGVy
U3R5bGUqIHRhcmdldFN0eWxlKQoreworICAgIHJldHVybiBwcm9wZXJ0aWVzRXF1YWwocHJvcCwg
bV90b1N0eWxlLCB0YXJnZXRTdHlsZSk7Cit9CisKK3ZvaWQgSW1wbGljaXRBbmltYXRpb246OmJs
ZW5kUHJvcGVydHlWYWx1ZUluU3R5bGUoaW50IHByb3AsIFJlbmRlclN0eWxlKiBjdXJyZW50U3R5
bGUpCit7CisgICAgZG91YmxlIHByb2cgPSBwcm9ncmVzcygxLCAwKTsKKyAgICBibGVuZFByb3Bl
cnRpZXMocHJvcCwgY3VycmVudFN0eWxlLCBtX2Zyb21TdHlsZSwgbV90b1N0eWxlLCBwcm9nKTsK
K30gICAgCisgICAgCit9CkluZGV4OiBXZWJDb3JlL3BhZ2UvYW5pbWF0aW9uL0ltcGxpY2l0QW5p
bWF0aW9uLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9JbXBsaWNpdEFu
aW1hdGlvbi5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9JbXBsaWNp
dEFuaW1hdGlvbi5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4g
KCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBi
ZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJv
bSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9u
LiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09O
VFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIElt
cGxpY2l0QW5pbWF0aW9uX2gKKyNkZWZpbmUgSW1wbGljaXRBbmltYXRpb25faAorCisjaW5jbHVk
ZSAiQW5pbWF0aW9uQmFzZS5oIgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworLy8gQW4gSW1wbGljaXRBbmltYXRpb24gdHJhY2tzIHRoZSBzdGF0ZSBvZiBh
IHRyYW5zaXRpb24gb2YgYSBzcGVjaWZpYyBDU1MgcHJvcGVydHkKKy8vIGZvciBhIHNpbmdsZSBS
ZW5kZXJPYmplY3QuCitjbGFzcyBJbXBsaWNpdEFuaW1hdGlvbiA6IHB1YmxpYyBBbmltYXRpb25C
YXNlIHsKK3B1YmxpYzoKKyAgICBJbXBsaWNpdEFuaW1hdGlvbihjb25zdCBBbmltYXRpb24qIHRy
YW5zaXRpb24sIGludCBhbmltYXRpbmdQcm9wZXJ0eSwgUmVuZGVyT2JqZWN0KiByZW5kZXJlciwg
Q29tcG9zaXRlQW5pbWF0aW9uKiBjb21wQW5pbSk7ICAgIAorICAgIHZpcnR1YWwgfkltcGxpY2l0
QW5pbWF0aW9uKCkKKyAgICB7CisgICAgICAgIEFTU0VSVCghbV9mcm9tU3R5bGUgJiYgIW1fdG9T
dHlsZSk7CisgICAgICAgIAorICAgICAgICAvLyBJZiB3ZSB3ZXJlIHdhaXRpbmcgZm9yIGFuIGVu
ZCBldmVudCwgd2UgbmVlZCB0byBmaW5pc2ggdGhlIGFuaW1hdGlvbiB0byBtYWtlIHN1cmUgbm8g
b2xkCisgICAgICAgIC8vIGFuaW1hdGlvbnMgc3RpY2sgYXJvdW5kIGluIHRoZSBsb3dlciBsZXZl
bHMKKyAgICAgICAgaWYgKHdhaXRpbmdGb3JFbmRFdmVudCgpICYmIG1fb2JqZWN0KQorICAgICAg
ICAgICAgQVNTRVJUKDApOworICAgICAgICAKKyAgICAgICAgLy8gRG8gdGhlIGNsZWFudXAgaGVy
ZSBpbnN0ZWFkIG9mIGluIHRoZSBiYXNlIGNsYXNzIHNvIHRoZSBzcGVjaWFsaXplZCBtZXRob2Rz
IGdldCBjYWxsZWQKKyAgICAgICAgaWYgKCFwb3N0QWN0aXZlKCkpCisgICAgICAgICAgICB1cGRh
dGVTdGF0ZU1hY2hpbmUoU1RBVEVfSU5QVVRfRU5EX0FOSU1BVElPTiwgLTEpOyAgICAgCisgICAg
fQorICAgIAorICAgIGludCB0cmFuc2l0aW9uUHJvcGVydHkoKSBjb25zdCB7IHJldHVybiBtX3Ry
YW5zaXRpb25Qcm9wZXJ0eTsgfQorICAgIGludCBhbmltYXRpbmdQcm9wZXJ0eSgpIGNvbnN0IHsg
cmV0dXJuIG1fYW5pbWF0aW5nUHJvcGVydHk7IH0KKyAgICAKKyAgICB2aXJ0dWFsIHZvaWQgb25B
bmltYXRpb25FbmQoZG91YmxlIGluRWxhcHNlZFRpbWUpOworICAgIAorICAgIHZpcnR1YWwgdm9p
ZCBhbmltYXRlKENvbXBvc2l0ZUFuaW1hdGlvbiosIFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRl
clN0eWxlKiBjdXJyZW50U3R5bGUsIAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJl
bmRlclN0eWxlKiB0YXJnZXRTdHlsZSwgUmVuZGVyU3R5bGUqJiBhbmltYXRlZFN0eWxlKTsKKyAg
ICB2aXJ0dWFsIHZvaWQgcmVzZXQoUmVuZGVyT2JqZWN0KiByZW5kZXJlciwgY29uc3QgUmVuZGVy
U3R5bGUqIGZyb20gPSAwLCBjb25zdCBSZW5kZXJTdHlsZSogdG8gPSAwKTsKKyAgICAKKyAgICB2
b2lkIHNldE92ZXJyaWRkZW4oYm9vbCBiKTsKKyAgICB2aXJ0dWFsIGJvb2wgb3ZlcnJpZGRlbigp
IGNvbnN0IHsgcmV0dXJuIG1fb3ZlcnJpZGRlbjsgfQorICAgIAorICAgIHZpcnR1YWwgYm9vbCBz
aG91bGRGaXJlRXZlbnRzKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICAgIAorICAgIHZpcnR1
YWwgYm9vbCBhZmZlY3RzUHJvcGVydHkoaW50IHByb3BlcnR5KSBjb25zdDsKKyAgICAKKyAgICBi
b29sIGhhc1N0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9mcm9tU3R5bGUgJiYgbV90b1N0eWxlOyB9
CisgICAgCisgICAgYm9vbCBpc1RhcmdldFByb3BlcnR5RXF1YWwoaW50IHByb3AsIGNvbnN0IFJl
bmRlclN0eWxlKiB0YXJnZXRTdHlsZSk7CisKKyAgICB2b2lkIGJsZW5kUHJvcGVydHlWYWx1ZUlu
U3R5bGUoaW50IHByb3AsIFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUpOworICAgIAorcHJvdGVj
dGVkOgorICAgIGJvb2wgc2hvdWxkU2VuZEV2ZW50Rm9yTGlzdGVuZXIoRG9jdW1lbnQ6Okxpc3Rl
bmVyVHlwZSBpbkxpc3RlbmVyVHlwZSk7ICAgIAorICAgIGJvb2wgc2VuZFRyYW5zaXRpb25FdmVu
dChjb25zdCBBdG9taWNTdHJpbmcmIGluRXZlbnRUeXBlLCBkb3VibGUgaW5FbGFwc2VkVGltZSk7
CisgICAgCitwcml2YXRlOgorICAgIGludCBtX3RyYW5zaXRpb25Qcm9wZXJ0eTsgICAvLyBUcmFu
c2l0aW9uIHByb3BlcnR5IGFzIHNwZWNpZmllZCBpbiB0aGUgUmVuZGVyU3R5bGUuIE1heSBiZSBj
QW5pbWF0ZUFsbAorICAgIGludCBtX2FuaW1hdGluZ1Byb3BlcnR5OyAgICAvLyBTcGVjaWZpYyBw
cm9wZXJ0eSBmb3IgdGhpcyBJbXBsaWNpdEFuaW1hdGlvbgorICAgIGJvb2wgbV9vdmVycmlkZGVu
OyAgICAgICAgICAvLyB0cnVlIHdoZW4gdGhlcmUgaXMgYSBrZXlmcmFtZSBhbmltYXRpb24gdGhh
dCBvdmVycmlkZXMgdGhlIHRyYW5zaXRpb25pbmcgcHJvcGVydHkKKyAgICAKKyAgICAvLyBUaGUg
dHdvIHN0eWxlcyB0aGF0IHdlIGFyZSBibGVuZGluZy4KKyAgICBSZW5kZXJTdHlsZSogbV9mcm9t
U3R5bGU7CisgICAgUmVuZGVyU3R5bGUqIG1fdG9TdHlsZTsKK307CisKK30KKworI2VuZGlmCklu
ZGV4OiBXZWJDb3JlL3BhZ2UvYW5pbWF0aW9uL0tleWZyYW1lQW5pbWF0aW9uLmNwcAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBXZWJDb3JlL3BhZ2UvYW5pbWF0aW9uL0tleWZyYW1lQW5pbWF0aW9uLmNwcAkocmV2
aXNpb24gMCkKKysrIFdlYkNvcmUvcGFnZS9hbmltYXRpb24vS2V5ZnJhbWVBbmltYXRpb24uY3Bw
CShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKKyAq
IDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAq
IDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBu
b3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBl
bmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAi
QVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAq
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIktleWZyYW1lQW5pbWF0aW9uLmgiCisjaW5jbHVkZSAiQ29tcG9zaXRlQW5pbWF0
aW9uLmgiCisjaW5jbHVkZSAiU3lzdGVtVGltZS5oIgorI2luY2x1ZGUgIlJlbmRlck9iamVjdC5o
IgorI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCit2b2lk
IEtleWZyYW1lQW5pbWF0aW9uOjphbmltYXRlKENvbXBvc2l0ZUFuaW1hdGlvbiogYW5pbWF0aW9u
LCBSZW5kZXJPYmplY3QqIHJlbmRlcmVyLCBjb25zdCBSZW5kZXJTdHlsZSogY3VycmVudFN0eWxl
LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRlclN0eWxl
KiB0YXJnZXRTdHlsZSwgUmVuZGVyU3R5bGUqJiBhbmltYXRlZFN0eWxlKQoreworICAgIC8vIGlm
IHdlIGhhdmUgbm90IHlldCBzdGFydGVkLCB3ZSB3aWxsIG5vdCBoYXZlIGEgdmFsaWQgc3RhcnQg
dGltZSwgc28ganVzdCBzdGFydCB0aGUgYW5pbWF0aW9uIGlmIG5lZWRlZAorICAgIGlmIChpc05l
dygpICYmIG1fYW5pbWF0aW9uLT5wbGF5U3RhdGUoKSA9PSBBbmltUGxheVN0YXRlUGxheWluZykK
KyAgICAgICAgdXBkYXRlU3RhdGVNYWNoaW5lKFNUQVRFX0lOUFVUX1NUQVJUX0FOSU1BVElPTiwg
LTEpOworICAgIAorICAgIC8vIElmIHdlIGdldCB0aGlzIGZhciBhbmQgdGhlIGFuaW1hdGlvbiBp
cyBkb25lLCBpdCBtZWFucyB3ZSBhcmUgY2xlYW5pbmcgdXAgYSBqdXN0IGZpbmlzaGVkIGFuaW1h
dGlvbi4KKyAgICAvLyBJZiBzbywgd2UgbmVlZCB0byBzZW5kIGJhY2sgdGhlIHRhcmdldFN0eWxl
CisgICAgaWYgKHBvc3RBY3RpdmUoKSkgeworICAgICAgICBpZiAoIWFuaW1hdGVkU3R5bGUpCisg
ICAgICAgICAgICBhbmltYXRlZFN0eWxlID0gY29uc3RfY2FzdDxSZW5kZXJTdHlsZSo+KHRhcmdl
dFN0eWxlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGlmIHdlIGFyZSB3YWl0
aW5nIGZvciB0aGUgc3RhcnQgdGltZXIsIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBzdHls
ZSB5ZXQKKyAgICAvLyBTcGVjaWFsIGNhc2UgLSBpZiB0aGUgZGVsYXkgdGltZSBpcyAwLCB0aGVu
IHdlIGRvIHdhbnQgdG8gc2V0IHRoZSBmaXJzdCBmcmFtZSBvZiB0aGUKKyAgICAvLyBhbmltYXRp
b24gcmlnaHQgYXdheS4gVGhpcyBhdm9pZHMgYSBmbGFzaCB3aGVuIHRoZSBhbmltYXRpb24gc3Rh
cnRzCisgICAgaWYgKHdhaXRpbmdUb1N0YXJ0KCkgJiYgbV9hbmltYXRpb24tPmRlbGF5KCkgPiAw
KQorICAgICAgICByZXR1cm47CisgICAgCisgICAgLy8gRklYTUU6IHdlIG5lZWQgdG8gYmUgbW9y
ZSBlZmZpY2llbnQgYWJvdXQgZGV0ZXJtaW5pbmcgd2hpY2gga2V5ZnJhbWVzIHdlIGFyZSBhbmlt
YXRpbmcgYmV0d2Vlbi4KKyAgICAvLyBXZSBzaG91bGQgY2FjaGUgdGhlIGxhc3QgcGFpciBvciBz
b21ldGhpbmcKKyAgICAKKyAgICAvLyBmaW5kIHRoZSBmaXJzdCBrZXkKKyAgICBkb3VibGUgZWxh
cHNlZFRpbWUgPSAobV9zdGFydFRpbWUgPiAwKSA/ICgoIXBhdXNlZCgpID8gY3VycmVudFRpbWUo
KSA6IG1fcGF1c2VUaW1lKSAtIG1fc3RhcnRUaW1lKSA6IDAuMDsKKyAgICBpZiAoZWxhcHNlZFRp
bWUgPCAwLjApCisgICAgICAgIGVsYXBzZWRUaW1lID0gMC4wOworICAgICAgICAKKyAgICBkb3Vi
bGUgdCA9IG1fYW5pbWF0aW9uLT5kdXJhdGlvbigpID8gKGVsYXBzZWRUaW1lIC8gbV9hbmltYXRp
b24tPmR1cmF0aW9uKCkpIDogMS4wOworICAgIGludCBpID0gKGludCkgdDsKKyAgICB0IC09IGk7
CisgICAgaWYgKG1fYW5pbWF0aW9uLT5kaXJlY3Rpb24oKSAmJiAoaSAmIDEpKQorICAgICAgICB0
ID0gMSAtIHQ7CisKKyAgICBSZW5kZXJTdHlsZSogZnJvbVN0eWxlID0gMDsKKyAgICBSZW5kZXJT
dHlsZSogdG9TdHlsZSA9IDA7CisgICAgZG91YmxlIHNjYWxlID0gMS4wOworICAgIGRvdWJsZSBv
ZmZzZXQgPSAwLjA7CisgICAgaWYgKG1fa2V5ZnJhbWVzLmdldCgpKSB7CisgICAgICAgIFZlY3Rv
cjxLZXlmcmFtZVZhbHVlPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9rZXlmcmFtZXMtPmVuZEtl
eWZyYW1lcygpOworICAgICAgICBmb3IgKFZlY3RvcjxLZXlmcmFtZVZhbHVlPjo6Y29uc3RfaXRl
cmF0b3IgaXQgPSBtX2tleWZyYW1lcy0+YmVnaW5LZXlmcmFtZXMoKTsgaXQgIT0gZW5kOyArK2l0
KSB7CisgICAgICAgICAgICBpZiAodCA8IGl0LT5rZXkpIHsKKyAgICAgICAgICAgICAgICAvLyBU
aGUgZmlyc3Qga2V5IHNob3VsZCBhbHdheXMgYmUgMCwgc28gd2Ugc2hvdWxkIG5ldmVyIHN1Y2Nl
ZWQgb24gdGhlIGZpcnN0IGtleQorICAgICAgICAgICAgICAgIGlmICghZnJvbVN0eWxlKQorICAg
ICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBzY2FsZSA9IDEuMCAvIChp
dC0+a2V5IC0gb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICB0b1N0eWxlID0gY29uc3RfY2FzdDxS
ZW5kZXJTdHlsZSo+KCYoaXQtPnN0eWxlKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG9mZnNldCA9IGl0LT5rZXk7Cisg
ICAgICAgICAgICBmcm9tU3R5bGUgPSBjb25zdF9jYXN0PFJlbmRlclN0eWxlKj4oJihpdC0+c3R5
bGUpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICAvLyBpZiBlaXRoZXIgc3R5bGUgaXMg
MCB3ZSBoYXZlIGFuIGludmFsaWQgY2FzZSwganVzdCBzdG9wIHRoZSBhbmltYXRpb24KKyAgICBp
ZiAoIWZyb21TdHlsZSB8fCAhdG9TdHlsZSkgeworICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUo
U1RBVEVfSU5QVVRfRU5EX0FOSU1BVElPTiwgLTEpOworICAgICAgICByZXR1cm47CisgICAgfQor
ICAgIAorICAgIC8vIHJ1biBhIGN5Y2xlIG9mIGFuaW1hdGlvbi4KKyAgICAvLyBXZSBrbm93IHdl
IHdpbGwgbmVlZCBhIG5ldyByZW5kZXIgc3R5bGUsIHNvIG1ha2Ugb25lIGlmIG5lZWRlZAorICAg
IGlmICghYW5pbWF0ZWRTdHlsZSkKKyAgICAgICAgYW5pbWF0ZWRTdHlsZSA9IG5ldyAocmVuZGVy
ZXItPnJlbmRlckFyZW5hKCkpIFJlbmRlclN0eWxlKCp0YXJnZXRTdHlsZSk7CisgICAgCisgICAg
ZG91YmxlIHByb2cgPSBwcm9ncmVzcyhzY2FsZSwgb2Zmc2V0KTsKKworICAgIEhhc2hTZXQ8aW50
Pjo6Y29uc3RfaXRlcmF0b3IgZW5kID0gbV9rZXlmcmFtZXMtPmVuZFByb3BlcnRpZXMoKTsKKyAg
ICBmb3IgKEhhc2hTZXQ8aW50Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lcy0+YmVn
aW5Qcm9wZXJ0aWVzKCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBpZiAoYmxlbmRQcm9w
ZXJ0aWVzKCppdCwgYW5pbWF0ZWRTdHlsZSwgZnJvbVN0eWxlLCB0b1N0eWxlLCBwcm9nKSkKKyAg
ICAgICAgICAgIHNldEFuaW1hdGluZygpOworICAgIH0KK30KKwordm9pZCBLZXlmcmFtZUFuaW1h
dGlvbjo6ZW5kQW5pbWF0aW9uKGJvb2wgcmVzZXQpCit7CisgICAgLy8gUmVzdG9yZSB0aGUgb3Jp
Z2luYWwgKHVuYW5pbWF0ZWQpIHN0eWxlCisgICAgaWYgKG1fb2JqZWN0KQorICAgICAgICBzZXRD
aGFuZ2VkKG1fb2JqZWN0LT5lbGVtZW50KCkpOworfQorCitib29sIEtleWZyYW1lQW5pbWF0aW9u
OjpzaG91bGRTZW5kRXZlbnRGb3JMaXN0ZW5lcihEb2N1bWVudDo6TGlzdGVuZXJUeXBlIGluTGlz
dGVuZXJUeXBlKQoreworICAgIHJldHVybiBtX29iamVjdC0+ZG9jdW1lbnQoKS0+aGFzTGlzdGVu
ZXJUeXBlKGluTGlzdGVuZXJUeXBlKTsKK30KKyAgICAKK3ZvaWQgS2V5ZnJhbWVBbmltYXRpb246
Om9uQW5pbWF0aW9uU3RhcnQoZG91YmxlIGluRWxhcHNlZFRpbWUpCit7CisgICAgc2VuZEFuaW1h
dGlvbkV2ZW50KEV2ZW50TmFtZXM6OndlYmtpdEFuaW1hdGlvblN0YXJ0RXZlbnQsIGluRWxhcHNl
ZFRpbWUpOworfQorCit2b2lkIEtleWZyYW1lQW5pbWF0aW9uOjpvbkFuaW1hdGlvbkl0ZXJhdGlv
bihkb3VibGUgaW5FbGFwc2VkVGltZSkKK3sKKyAgICBzZW5kQW5pbWF0aW9uRXZlbnQoRXZlbnRO
YW1lczo6d2Via2l0QW5pbWF0aW9uSXRlcmF0aW9uRXZlbnQsIGluRWxhcHNlZFRpbWUpOworfQor
Cit2b2lkIEtleWZyYW1lQW5pbWF0aW9uOjpvbkFuaW1hdGlvbkVuZChkb3VibGUgaW5FbGFwc2Vk
VGltZSkKK3sKKyAgICBpZiAoIXNlbmRBbmltYXRpb25FdmVudChFdmVudE5hbWVzOjp3ZWJraXRB
bmltYXRpb25FbmRFdmVudCwgaW5FbGFwc2VkVGltZSkpIHsKKyAgICAgICAgLy8gV2UgZGlkbid0
IGRpc3BhdGNoIGFuIGV2ZW50LCB3aGljaCB3b3VsZCBjYWxsIGVuZEFuaW1hdGlvbigpLCBzbyB3
ZSdsbCBqdXN0IGNhbGwgaXQgaGVyZS4KKyAgICAgICAgZW5kQW5pbWF0aW9uKHRydWUpOworICAg
IH0KK30KKworYm9vbCBLZXlmcmFtZUFuaW1hdGlvbjo6c2VuZEFuaW1hdGlvbkV2ZW50KGNvbnN0
IEF0b21pY1N0cmluZyYgaW5FdmVudFR5cGUsIGRvdWJsZSBpbkVsYXBzZWRUaW1lKQoreworICAg
IERvY3VtZW50OjpMaXN0ZW5lclR5cGUgbGlzdGVuZXJUeXBlOworICAgIGlmIChpbkV2ZW50VHlw
ZSA9PSBFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRpb25JdGVyYXRpb25FdmVudCkKKyAgICAgICAg
bGlzdGVuZXJUeXBlID0gRG9jdW1lbnQ6OkFOSU1BVElPTklURVJBVElPTl9MSVNURU5FUjsKKyAg
ICBlbHNlIGlmIChpbkV2ZW50VHlwZSA9PSBFdmVudE5hbWVzOjp3ZWJraXRBbmltYXRpb25FbmRF
dmVudCkKKyAgICAgICAgbGlzdGVuZXJUeXBlID0gRG9jdW1lbnQ6OkFOSU1BVElPTkVORF9MSVNU
RU5FUjsKKyAgICBlbHNlCisgICAgICAgIGxpc3RlbmVyVHlwZSA9IERvY3VtZW50OjpBTklNQVRJ
T05TVEFSVF9MSVNURU5FUjsKKyAgICAKKyAgICBpZiAoc2hvdWxkU2VuZEV2ZW50Rm9yTGlzdGVu
ZXIobGlzdGVuZXJUeXBlKSkgeworICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gZWxlbWVudEZv
ckV2ZW50RGlzcGF0Y2goKTsKKyAgICAgICAgaWYgKGVsZW1lbnQpIHsKKyAgICAgICAgICAgIG1f
d2FpdGluZ0ZvckVuZEV2ZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgIG1fYW5pbWF0aW9uRXZlbnRE
aXNwYXRjaGVyLnN0YXJ0VGltZXIoZWxlbWVudCwgbV9uYW1lLCAtMSwgdHJ1ZSwgaW5FdmVudFR5
cGUsIGluRWxhcHNlZFRpbWUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIERpZCBkaXNw
YXRjaCBhbiBldmVudAorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOyAvLyBE
aWQgbm90IGRpc3BhdGNoIGFuIGV2ZW50Cit9CisKK3ZvaWQgS2V5ZnJhbWVBbmltYXRpb246Om92
ZXJyaWRlQW5pbWF0aW9ucygpCit7CisgICAgLy8gVGhpcyB3aWxsIG92ZXJyaWRlIGltcGxpY2l0
IGFuaW1hdGlvbnMgdGhhdCBtYXRjaCB0aGUgcHJvcGVydGllcyBpbiB0aGUga2V5ZnJhbWUgYW5p
bWF0aW9uCisgICAgSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX2tleWZyYW1l
cy0+ZW5kUHJvcGVydGllcygpOworICAgIGZvciAoSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRv
ciBpdCA9IG1fa2V5ZnJhbWVzLT5iZWdpblByb3BlcnRpZXMoKTsgaXQgIT0gZW5kOyArK2l0KQor
ICAgICAgICBjb21wb3NpdGVBbmltYXRpb24oKS0+b3ZlcnJpZGVJbXBsaWNpdEFuaW1hdGlvbnMo
Kml0KTsKK30KKwordm9pZCBLZXlmcmFtZUFuaW1hdGlvbjo6cmVzdW1lT3ZlcnJpZGRlbkFuaW1h
dGlvbnMoKQoreworICAgIC8vIFRoaXMgd2lsbCByZXN1bWUgb3ZlcnJpZGRlbiBpbXBsaWNpdCBh
bmltYXRpb25zCisgICAgSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVyYXRvciBlbmQgPSBtX2tleWZy
YW1lcy0+ZW5kUHJvcGVydGllcygpOworICAgIGZvciAoSGFzaFNldDxpbnQ+Ojpjb25zdF9pdGVy
YXRvciBpdCA9IG1fa2V5ZnJhbWVzLT5iZWdpblByb3BlcnRpZXMoKTsgaXQgIT0gZW5kOyArK2l0
KQorICAgICAgICBjb21wb3NpdGVBbmltYXRpb24oKS0+cmVzdW1lT3ZlcnJpZGRlbkltcGxpY2l0
QW5pbWF0aW9ucygqaXQpOworfQorCitib29sIEtleWZyYW1lQW5pbWF0aW9uOjphZmZlY3RzUHJv
cGVydHkoaW50IHByb3BlcnR5KSBjb25zdAoreworICAgIEhhc2hTZXQ8aW50Pjo6Y29uc3RfaXRl
cmF0b3IgZW5kID0gbV9rZXlmcmFtZXMtPmVuZFByb3BlcnRpZXMoKTsKKyAgICBmb3IgKEhhc2hT
ZXQ8aW50Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBtX2tleWZyYW1lcy0+YmVnaW5Qcm9wZXJ0aWVz
KCk7IGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgICBpZiAoKCppdCkgPT0gcHJvcGVydHkpCisg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9
CkluZGV4OiBXZWJDb3JlL3BhZ2UvYW5pbWF0aW9uL0tleWZyYW1lQW5pbWF0aW9uLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9LZXlmcmFtZUFuaW1hdGlvbi5oCShyZXZp
c2lvbiAwKQorKysgV2ViQ29yZS9wYWdlL2FuaW1hdGlvbi9LZXlmcmFtZUFuaW1hdGlvbi5oCShy
ZXZpc2lvbiAwKQpAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4g
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4g
IE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0
aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9y
c2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJl
IHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJ
UyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIEtleWZyYW1lQW5pbWF0aW9u
X2gKKyNkZWZpbmUgS2V5ZnJhbWVBbmltYXRpb25faAorCisjaW5jbHVkZSAiQW5pbWF0aW9uQmFz
ZS5oIgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiUmVuZGVyU3R5bGUuaCIKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBBIEtleWZyYW1lQW5pbWF0aW9uIHRyYWNrcyB0aGUg
c3RhdGUgb2YgYW4gZXhwbGljaXQgYW5pbWF0aW9uCisvLyBmb3IgYSBzaW5nbGUgUmVuZGVyT2Jq
ZWN0LgorY2xhc3MgS2V5ZnJhbWVBbmltYXRpb24gOiBwdWJsaWMgQW5pbWF0aW9uQmFzZSB7Citw
dWJsaWM6CisgICAgS2V5ZnJhbWVBbmltYXRpb24oY29uc3QgQW5pbWF0aW9uKiBhbmltYXRpb24s
IFJlbmRlck9iamVjdCogcmVuZGVyZXIsIGludCBpbmRleCwgQ29tcG9zaXRlQW5pbWF0aW9uKiBj
b21wQW5pbSkKKyAgICA6IEFuaW1hdGlvbkJhc2UoYW5pbWF0aW9uLCByZW5kZXJlciwgY29tcEFu
aW0pCisgICAgLCBtX2tleWZyYW1lcyhhbmltYXRpb24tPmtleWZyYW1lTGlzdCgpKQorICAgICwg
bV9uYW1lKGFuaW1hdGlvbi0+bmFtZSgpKQorICAgICwgbV9pbmRleChpbmRleCkKKyAgICB7Cisg
ICAgfQorCisgICAgdmlydHVhbCB+S2V5ZnJhbWVBbmltYXRpb24oKQorICAgIHsKKyAgICAgICAg
Ly8gRG8gdGhlIGNsZWFudXAgaGVyZSBpbnN0ZWFkIG9mIGluIHRoZSBiYXNlIGNsYXNzIHNvIHRo
ZSBzcGVjaWFsaXplZCBtZXRob2RzIGdldCBjYWxsZWQKKyAgICAgICAgaWYgKCFwb3N0QWN0aXZl
KCkpCisgICAgICAgICAgICB1cGRhdGVTdGF0ZU1hY2hpbmUoU1RBVEVfSU5QVVRfRU5EX0FOSU1B
VElPTiwgLTEpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBhbmltYXRlKENvbXBvc2l0ZUFu
aW1hdGlvbiosIFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlclN0eWxlKiBjdXJyZW50U3R5bGUs
CisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVuZGVyU3R5bGUqIHRhcmdldFN0eWxl
LCBSZW5kZXJTdHlsZSomIGFuaW1hdGVkU3R5bGUpOworCisgICAgdm9pZCBzZXROYW1lKGNvbnN0
IFN0cmluZyYgcykgeyBtX25hbWUgPSBzOyB9CisgICAgY29uc3QgQXRvbWljU3RyaW5nJiBuYW1l
KCkgY29uc3QgeyByZXR1cm4gbV9uYW1lOyB9CisgICAgaW50IGluZGV4KCkgY29uc3QgeyByZXR1
cm4gbV9pbmRleDsgfQorCisgICAgdmlydHVhbCBib29sIHNob3VsZEZpcmVFdmVudHMoKSBjb25z
dCB7IHJldHVybiB0cnVlOyB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgb25Bbmlt
YXRpb25TdGFydChkb3VibGUgaW5FbGFwc2VkVGltZSk7CisgICAgdmlydHVhbCB2b2lkIG9uQW5p
bWF0aW9uSXRlcmF0aW9uKGRvdWJsZSBpbkVsYXBzZWRUaW1lKTsKKyAgICB2aXJ0dWFsIHZvaWQg
b25BbmltYXRpb25FbmQoZG91YmxlIGluRWxhcHNlZFRpbWUpOworICAgIHZpcnR1YWwgdm9pZCBl
bmRBbmltYXRpb24oYm9vbCByZXNldCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgb3ZlcnJpZGVBbmlt
YXRpb25zKCk7CisgICAgdmlydHVhbCB2b2lkIHJlc3VtZU92ZXJyaWRkZW5BbmltYXRpb25zKCk7
CisgICAgCisgICAgYm9vbCBzaG91bGRTZW5kRXZlbnRGb3JMaXN0ZW5lcihEb2N1bWVudDo6TGlz
dGVuZXJUeXBlIGluTGlzdGVuZXJUeXBlKTsgICAgCisgICAgYm9vbCBzZW5kQW5pbWF0aW9uRXZl
bnQoY29uc3QgQXRvbWljU3RyaW5nJiBpbkV2ZW50VHlwZSwgZG91YmxlIGluRWxhcHNlZFRpbWUp
OworICAgIAorICAgIHZpcnR1YWwgYm9vbCBhZmZlY3RzUHJvcGVydHkoaW50IHByb3BlcnR5KSBj
b25zdDsKKworcHJpdmF0ZToKKyAgICAvLyBUaGUga2V5ZnJhbWVzIHRoYXQgd2UgYXJlIGJsZW5k
aW5nLgorICAgIFJlZlB0cjxLZXlmcmFtZUxpc3Q+IG1fa2V5ZnJhbWVzOworICAgIEF0b21pY1N0
cmluZyBtX25hbWU7CisgICAgLy8gVGhlIG9yZGVyIGluIHdoaWNoIHRoaXMgYW5pbWF0aW9uIGFw
cGVhcnMgaW4gdGhlIGFuaW1hdGlvbi1uYW1lIHN0eWxlLgorICAgIGludCBtX2luZGV4OworfTsK
KworfQorCisjZW5kaWYK
</data>
<flag name="review"
          id="10291"
          type_id="1"
          status="+"
          setter="hyatt"
    />
          </attachment>
      

    </bug>

</bugzilla>