<?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>35499</bug_id>
          
          <creation_ts>2010-02-28 11:54:22 -0800</creation_ts>
          <short_desc>webkitpy: Move webkitpy/mock.py into webkitpy/thirdparty</short_desc>
          <delta_ts>2010-03-13 17:01:51 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Tools / Tests</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Chris Jerdonek">cjerdonek</reporter>
          <assigned_to name="Chris Jerdonek">cjerdonek</assigned_to>
          <cc>abarth</cc>
    
    <cc>cjerdonek</cc>
    
    <cc>eric</cc>
    
    <cc>hamaji</cc>
    
    <cc>levin</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>194588</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-02-28 11:54:22 -0800</bug_when>
    <thetext>Move webkitpy/mock.py into webkitpy/thirdparty.

I discovered this was third-party while working on this--

https://bugs.webkit.org/show_bug.cgi?id=35465 (check-webkit-style should check license text)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>194590</commentid>
    <comment_count>1</comment_count>
      <attachid>49701</attachid>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-02-28 12:19:57 -0800</bug_when>
    <thetext>Created attachment 49701
Proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>194591</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-02-28 12:20:57 -0800</bug_when>
    <thetext>Attachment 49701 did not pass style-queue:

Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
Skipping input &apos;WebKitTools/Scripts/webkitpy/mock.py&apos;: Can&apos;t open for reading
WebKitTools/Scripts/webkitpy/thirdparty/mock.py:59:  whitespace before &apos;)&apos;  [pep8/E202] [5]
WebKitTools/Scripts/webkitpy/thirdparty/mock.py:64:  expected 2 blank lines, found 1  [pep8/E302] [5]
WebKitTools/Scripts/webkitpy/thirdparty/mock.py:84:  expected 2 blank lines, found 1  [pep8/E302] [5]
WebKitTools/Scripts/webkitpy/thirdparty/mock.py:88:  expected 2 blank lines, found 1  [pep8/E302] [5]
WebKitTools/Scripts/webkitpy/thirdparty/mock.py:91:  expected 2 blank lines, found 1  [pep8/E302] [5]
WebKitTools/Scripts/webkitpy/thirdparty/mock.py:115:  too many blank lines (2)  [pep8/E303] [5]
WebKitTools/Scripts/webkitpy/thirdparty/mock.py:127:  too many blank lines (2)  [pep8/E303] [5]
WebKitTools/Scripts/webkitpy/thirdparty/mock.py:138:  too many blank lines (2)  [pep8/E303] [5]
WebKitTools/Scripts/webkitpy/thirdparty/mock.py:171:  too many blank lines (2)  [pep8/E303] [5]
WebKitTools/Scripts/webkitpy/thirdparty/mock.py:174:  line too long (80 characters)  [pep8/E501] [5]
WebKitTools/Scripts/webkitpy/thirdparty/mock.py:187:  too many blank lines (2)  [pep8/E303] [5]
WebKitTools/Scripts/webkitpy/thirdparty/mock.py:188:  line too long (115 characters)  [pep8/E501] [5]
WebKitTools/Scripts/webkitpy/thirdparty/mock.py:220:  too many blank lines (2)  [pep8/E303] [5]
WebKitTools/Scripts/webkitpy/thirdparty/mock.py:246:  too many blank lines (2)  [pep8/E303] [5]
WebKitTools/Scripts/webkitpy/thirdparty/mock.py:259:  line too long (86 characters)  [pep8/E501] [5]
WebKitTools/Scripts/webkitpy/thirdparty/mock.py:263:  too many blank lines (2)  [pep8/E303] [5]
WebKitTools/Scripts/webkitpy/thirdparty/mock.py:282:  too many blank lines (2)  [pep8/E303] [5]
WebKitTools/Scripts/webkitpy/thirdparty/mock.py:298:  line too long (85 characters)  [pep8/E501] [5]
WebKitTools/Scripts/webkitpy/thirdparty/mock.py:304:  too many blank lines (3)  [pep8/E303] [5]
Total errors found: 19 in 20 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>194592</commentid>
    <comment_count>3</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-02-28 12:23:59 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; Attachment 49701 [details] did not pass style-queue:
&gt; 
&gt; Failed to run &quot;WebKitTools/Scripts/check-webkit-style&quot; exit_code: 1
&gt; Skipping input &apos;WebKitTools/Scripts/webkitpy/mock.py&apos;: Can&apos;t open for reading
&gt; WebKitTools/Scripts/webkitpy/thirdparty/mock.py:59:  whitespace before &apos;)&apos; 
&gt; [pep8/E202] [5]

I filed a report for this here (to exempt webkitpy/thirdparty from most pep8 checks):

https://bugs.webkit.org/show_bug.cgi?id=35497</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196719</commentid>
    <comment_count>4</comment_count>
      <attachid>49701</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2010-03-05 15:11:54 -0800</bug_when>
    <thetext>Comment on attachment 49701
Proposed patch

Why not just fix all the commands?
webkitpy/commands_references.py

Seems cleaner to just fix all the commands instead of using commands_references.  Otherwise this looks fine.

I think ..foo_references is actually quite hard to read.  And it&apos;s inconsistent throughout all our files.  I think we should just import these directly, no?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196846</commentid>
    <comment_count>5</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-03-05 19:11:53 -0800</bug_when>
    <thetext>(In reply to comment #4)

Thanks a lot for the review and comments, Eric!

&gt; (From update of attachment 49701 [details])
&gt; Why not just fix all the commands?
&gt; webkitpy/commands_references.py

I&apos;ve explained some of the reasons for this pattern to Adam in the past:

https://bugs.webkit.org/show_bug.cgi?id=33791#c3

I think this pattern is preferable because it helps prevent the number of intra-package references from getting out of control -- especially as webkitpy grows.  This makes it easier to move folders around in the repository since there are fewer files to touch:

Modules in a package don&apos;t have to know the location of every intra-package reference.  They just have to know the location of the package&apos;s associated reference file.  Similarly, if you want to move the location of a referenced package, you don&apos;t have to touch large numbers of files.  You just have to update the references file.

It also helps to understand what packages and functionality a nested package depends on, because the reference file collects them in one place.

&gt; I think ..foo_references is actually quite hard to read.  And it&apos;s inconsistent
&gt; throughout all our files.  I think we should just import these directly, no?

Yeah, I agree -- thanks.  (PEP8 does, too, I found out later.)  I actually went through the process of changing all those relative references when I was getting test-webkitpy working with Python 2.4 (since 2.4 doesn&apos;t support relative references).  Fortunately we don&apos;t have too many right now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>196852</commentid>
    <comment_count>6</comment_count>
      <attachid>50148</attachid>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-03-05 19:34:15 -0800</bug_when>
    <thetext>Created attachment 50148
Proposed patch 2

I replaced the relative references with absolute references (e.g. ..command_references with webkitpy.command_references) and left the references files alone after explaining their purpose.  We can continue discussing that though if you want.  Thanks for considering.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>199341</commentid>
    <comment_count>7</comment_count>
      <attachid>50148</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-03-13 02:05:42 -0800</bug_when>
    <thetext>Comment on attachment 50148
Proposed patch 2

Nice.  Eventually we need to move more stuff out of the webkitpy root directory.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>199389</commentid>
    <comment_count>8</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-03-13 12:58:08 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; (From update of attachment 50148 [details])
&gt; Nice.  Eventually we need to move more stuff out of the webkitpy root
&gt; directory.

Thanks, Adam!

I&apos;ll create a master bug for that mini-project so we can discuss how we&apos;d like to organize things and because the move may be spread over more than one patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>199391</commentid>
    <comment_count>9</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2010-03-13 13:04:50 -0800</bug_when>
    <thetext>In one of your other patches, you made a &quot;patch&quot; directory.  It might make sense to move webkit-patch specific files there.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>199404</commentid>
    <comment_count>10</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-03-13 13:31:44 -0800</bug_when>
    <thetext>Manually committed (via svn commit):

http://trac.webkit.org/changeset/55968</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>199405</commentid>
    <comment_count>11</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-03-13 13:35:55 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; In one of your other patches, you made a &quot;patch&quot; directory.  It might make
&gt; sense to move webkit-patch specific files there.

Sounds good.  I might need your help in determining which files and folders are webkit-patch specific.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>199431</commentid>
    <comment_count>12</comment_count>
    <who name="Chris Jerdonek">cjerdonek</who>
    <bug_when>2010-03-13 17:01:51 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; (In reply to comment #7)
&gt; &gt; (From update of attachment 50148 [details] [details])
&gt; &gt; Nice.  Eventually we need to move more stuff out of the webkitpy root
&gt; &gt; directory.
&gt; 
&gt; Thanks, Adam!
&gt; 
&gt; I&apos;ll create a master bug for that mini-project so we can discuss how we&apos;d like
&gt; to organize things and because the move may be spread over more than one patch.

I created the report here:

https://bugs.webkit.org/show_bug.cgi?id=36093</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>49701</attachid>
            <date>2010-02-28 12:19:57 -0800</date>
            <delta_ts>2010-03-05 19:34:15 -0800</delta_ts>
            <desc>Proposed patch</desc>
            <filename>_patch-35499-1.diff</filename>
            <type>text/plain</type>
            <size>57851</size>
            <attacher name="Chris Jerdonek">cjerdonek</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9D
aGFuZ2VMb2cJKHJldmlzaW9uIDU1MzU4KQorKysgV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDMgKzEsNDcgQEAKKzIwMTAtMDItMjggIENocmlzIEplcmRvbmVrICA8
Y2plcmRvbmVrQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BT
ISkuCisKKyAgICAgICAgTW92ZWQgd2Via2l0cHkvbW9jay5weSBpbnRvIHdlYmtpdHB5L3RoaXJk
cGFydHkgc2luY2UgaXQgaXMKKyAgICAgICAgdGhpcmQtcGFydHkgY29kZS4KKworICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzU0OTkKKworICAgICAgICBV
cGRhdGVkIHRoZSBpbXBvcnQgc3RhdGVtZW50IGluIGFsbCBvZiB0aGUgYmVsb3cgZXhjZXB0IHdo
ZXJlIG5vdGVkLgorCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9idWd6aWxsYV91bml0dGVz
dC5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1hbmRzL2NvbW1hbmR0ZXN0LnB5
OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbWFuZHMvZG93bmxvYWRfdW5pdHRlc3Qu
cHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tYW5kcy9lYXJseV93YXJuaW5nX3N5
c3RlbV91bml0dGVzdC5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1hbmRzL3F1
ZXJpZXNfdW5pdHRlc3QucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tYW5kcy9x
dWV1ZXNfdW5pdHRlc3QucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tYW5kcy9x
dWV1ZXN0ZXN0LnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbWFuZHMvdXBsb2Fk
LnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbWFuZHMvdXBsb2FkX3VuaXR0ZXN0
LnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbWFuZHNfcmVmZXJlbmNlcy5weTog
QWRkZWQuCisgICAgICAgICAgLSBBZGRlZCBhIGZpbGUgY29udGFpbmluZyBhbiBhYnNvbHV0ZSBp
bXBvcnQgb2YgTW9jayBzbyB0aGF0CisgICAgICAgICAgICB0aGUgaW1wb3J0cyBpbiB0aGUgY29t
bWFuZHMgZm9sZGVyIGNhbiBpbXBvcnQgZnJvbSB0aGlzIGZpbGUKKyAgICAgICAgICAgIChzaW1p
bGFyIHRvIHN0eWxlX3JlZmVyZW5jZXMucHkpLiAgVGhpcyBoZWxwcyBsaW1pdCB0aGUKKyAgICAg
ICAgICAgIG51bWJlciBvZiBhZmZlY3RlZCBmaWxlcyBpbiBmdXR1cmUgcmVmYWN0b3JpbmdzLgor
CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jcmVkZW50aWFsc191bml0dGVzdC5weToKKyAg
ICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L21vY2sucHk6IFJlbW92ZWQuCisgICAgICAgICAgLSBN
b3ZlZCB0byBTY3JpcHRzL3dlYmtpdHB5L3RoaXJkcGFydHkuCisKKyAgICAgICAgKiBTY3JpcHRz
L3dlYmtpdHB5L21vY2tfYnVnemlsbGF0b29sLnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0
cHkvcGF0Y2hjb2xsZWN0aW9uX3VuaXR0ZXN0LnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0
cHkvc3RlcHMvY2xvc2VidWdmb3JsYW5kZGlmZl91bml0dGVzdC5weToKKyAgICAgICAgKiBTY3Jp
cHRzL3dlYmtpdHB5L3N0ZXBzL3N0ZXBzX3VuaXR0ZXN0LnB5OgorICAgICAgICAqIFNjcmlwdHMv
d2Via2l0cHkvc3RlcHMvdXBkYXRlY2hhbmdlbG9nc3dpdGhyZXZpZXdfdW5pdHRlc3RzLnB5Ogor
ICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvc3RlcHNfcmVmZXJlbmNlcy5weTogQWRkZWQuCisg
ICAgICAgICAgLSBBZGRlZCBhIGZpbGUgY29udGFpbmluZyBhbiBhYnNvbHV0ZSBpbXBvcnQgb2Yg
TW9jayBzbyB0aGF0CisgICAgICAgICAgICB0aGUgaW1wb3J0cyBpbiB0aGUgc3RlcHMgZm9sZGVy
IGNhbiBpbXBvcnQgZnJvbSB0aGlzIGZpbGUKKyAgICAgICAgICAgIChzaW1pbGFyIHRvIHN0eWxl
X3JlZmVyZW5jZXMucHkpLiAgVGhpcyBoZWxwcyBsaW1pdCB0aGUKKyAgICAgICAgICAgIG51bWJl
ciBvZiBhZmZlY3RlZCBmaWxlcyBpbiBmdXR1cmUgcmVmYWN0b3JpbmdzLgorCisgICAgICAgICog
U2NyaXB0cy93ZWJraXRweS90aGlyZHBhcnR5L21vY2sucHk6IENvcGllZCBmcm9tIFdlYktpdFRv
b2xzL1NjcmlwdHMvd2Via2l0cHkvbW9jay5weS4KKyAgICAgICAgICAtIEFsc28gZWxpbWluYXRl
ZCB0cmFpbGluZyB3aGl0ZSBzcGFjZSBhbmQgY2FycmlhZ2UgcmV0dXJucy4KKwogMjAxMC0wMi0y
NyAgQ2hyaXMgSmVyZG9uZWsgIDxjamVyZG9uZWtAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBEYXZpZCBMZXZpbi4KSW5kZXg6IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkv
YnVnemlsbGFfdW5pdHRlc3QucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvU2NyaXB0cy93
ZWJraXRweS9idWd6aWxsYV91bml0dGVzdC5weQkocmV2aXNpb24gNTUzNTcpCisrKyBXZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L2J1Z3ppbGxhX3VuaXR0ZXN0LnB5CSh3b3JraW5nIGNvcHkp
CkBAIC0zMSw4ICszMSw3IEBAIGltcG9ydCB1bml0dGVzdAogZnJvbSB3ZWJraXRweS5jb21taXR0
ZXJzIGltcG9ydCBDb21taXR0ZXJMaXN0LCBSZXZpZXdlciwgQ29tbWl0dGVyCiBmcm9tIHdlYmtp
dHB5LmJ1Z3ppbGxhIGltcG9ydCBCdWd6aWxsYSwgQnVnemlsbGFRdWVyaWVzLCBwYXJzZV9idWdf
aWQsIENvbW1pdHRlclZhbGlkYXRvcgogZnJvbSB3ZWJraXRweS5vdXRwdXRjYXB0dXJlIGltcG9y
dCBPdXRwdXRDYXB0dXJlCi1mcm9tIHdlYmtpdHB5Lm1vY2sgaW1wb3J0IE1vY2sKLQorZnJvbSB3
ZWJraXRweS50aGlyZHBhcnR5Lm1vY2sgaW1wb3J0IE1vY2sKIGZyb20gd2Via2l0cHkudGhpcmRw
YXJ0eS5CZWF1dGlmdWxTb3VwIGltcG9ydCBCZWF1dGlmdWxTb3VwCiAKIApJbmRleDogV2ViS2l0
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tYW5kc19yZWZlcmVuY2VzLnB5Cj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbWFuZHNfcmVmZXJlbmNlcy5weQko
cmV2aXNpb24gMCkKKysrIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbWFuZHNfcmVm
ZXJlbmNlcy5weQkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyNSBAQAorIyBDb3B5cmlnaHQgKEMp
IDIwMTAgQ2hyaXMgSmVyZG9uZWsgKGNqZXJkb25la0B3ZWJraXQub3JnKQorIworIyBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAy
LiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUK
KyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IKKyMgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UgorIyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUgorIyBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorIyBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJDb250YWlucyBpbnRyYS1wYWNrYWdl
IHJlZmVyZW5jZXMgdXNlZCBieSB3ZWJraXRweS5jb21tYW5kcy4iIiIKKworZnJvbSB0aGlyZHBh
cnR5Lm1vY2sgaW1wb3J0IE1vY2sKSW5kZXg6IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkv
Y3JlZGVudGlhbHNfdW5pdHRlc3QucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvU2NyaXB0
cy93ZWJraXRweS9jcmVkZW50aWFsc191bml0dGVzdC5weQkocmV2aXNpb24gNTUzNTcpCisrKyBX
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NyZWRlbnRpYWxzX3VuaXR0ZXN0LnB5CSh3b3Jr
aW5nIGNvcHkpCkBAIC0zMiw3ICszMiw3IEBAIGltcG9ydCB1bml0dGVzdAogZnJvbSB3ZWJraXRw
eS5jcmVkZW50aWFscyBpbXBvcnQgQ3JlZGVudGlhbHMKIGZyb20gd2Via2l0cHkuZXhlY3V0aXZl
IGltcG9ydCBFeGVjdXRpdmUKIGZyb20gd2Via2l0cHkub3V0cHV0Y2FwdHVyZSBpbXBvcnQgT3V0
cHV0Q2FwdHVyZQotZnJvbSB3ZWJraXRweS5tb2NrIGltcG9ydCBNb2NrCitmcm9tIHdlYmtpdHB5
LnRoaXJkcGFydHkubW9jayBpbXBvcnQgTW9jawogCiBjbGFzcyBDcmVkZW50aWFsc1Rlc3QodW5p
dHRlc3QuVGVzdENhc2UpOgogICAgIGV4YW1wbGVfc2VjdXJpdHlfb3V0cHV0ID0gIiIia2V5Y2hh
aW46ICIvVXNlcnMvdGVzdC9MaWJyYXJ5L0tleWNoYWlucy9sb2dpbi5rZXljaGFpbiIKSW5kZXg6
IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbW9jay5weQo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJL
aXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L21vY2sucHkJKHJldmlzaW9uIDU1MzU3KQorKysgV2Vi
S2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9tb2NrLnB5CSh3b3JraW5nIGNvcHkpCkBAIC0xLDMw
OSArMCwwIEBACi0jIG1vY2sucHkNCi0jIFRlc3QgdG9vbHMgZm9yIG1vY2tpbmcgYW5kIHBhdGNo
aW5nLg0KLSMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgTWljaGFlbCBGb29yZA0KLSMgRS1tYWls
OiBmdXp6eW1hbiBBVCB2b2lkc3BhY2UgRE9UIG9yZyBET1QgdWsNCi0NCi0jIG1vY2sgMC42LjAN
Ci0jIGh0dHA6Ly93d3cudm9pZHNwYWNlLm9yZy51ay9weXRob24vbW9jay8NCi0NCi0jIFJlbGVh
c2VkIHN1YmplY3QgdG8gdGhlIEJTRCBMaWNlbnNlDQotIyBQbGVhc2Ugc2VlIGh0dHA6Ly93d3cu
dm9pZHNwYWNlLm9yZy51ay9weXRob24vbGljZW5zZS5zaHRtbA0KLQ0KLSMgMjAwOS0xMS0yNTog
TGljZW5jZSBkb3dubG9hZGVkIGZyb20gYWJvdmUgVVJMLg0KLSMgQkVHSU4gRE9XTkxPQURFRCBM
SUNFTlNFDQotIw0KLSMgQ29weXJpZ2h0IChjKSAyMDAzLTIwMDksIE1pY2hhZWwgRm9vcmQNCi0j
IEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotIyBFLW1haWwgOiBmdXp6eW1hbiBBVCB2b2lkc3BhY2Ug
RE9UIG9yZyBET1QgdWsNCi0jIA0KLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotIyBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotIyBt
ZXQ6DQotIyANCi0jIA0KLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0jICAgICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0jIA0KLSMgICAg
ICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZQ0KLSMgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcNCi0jICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZA0KLSMgICAgICAgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLg0KLSMgDQotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIE1pY2hhZWwgRm9vcmQg
bm9yIHRoZSBuYW1lIG9mIFZvaWRzcGFjZQ0KLSMgICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzDQotIyAgICAgICBzb2Z0d2Fy
ZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0jIA0KLSMgVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRS
SUJVVE9SUw0KLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QNCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLSMgQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCi0j
IE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLA0KLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQotIyBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkNCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQNCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KLSMgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0jDQot
IyBFTkQgRE9XTkxPQURFRCBMSUNFTlNFDQotDQotIyBTY3JpcHRzIG1haW50YWluZWQgYXQgaHR0
cDovL3d3dy52b2lkc3BhY2Uub3JnLnVrL3B5dGhvbi9pbmRleC5zaHRtbA0KLSMgQ29tbWVudHMs
IHN1Z2dlc3Rpb25zIGFuZCBidWcgcmVwb3J0cyB3ZWxjb21lLg0KLQ0KLQ0KLV9fYWxsX18gPSAo
DQotICAgICdNb2NrJywNCi0gICAgJ3BhdGNoJywNCi0gICAgJ3BhdGNoX29iamVjdCcsDQotICAg
ICdzZW50aW5lbCcsDQotICAgICdERUZBVUxUJw0KLSkNCi0NCi1fX3ZlcnNpb25fXyA9ICcwLjYu
MCcNCi0NCi1jbGFzcyBTZW50aW5lbE9iamVjdChvYmplY3QpOg0KLSAgICBkZWYgX19pbml0X18o
c2VsZiwgbmFtZSk6DQotICAgICAgICBzZWxmLm5hbWUgPSBuYW1lDQotICAgICAgICANCi0gICAg
ZGVmIF9fcmVwcl9fKHNlbGYpOg0KLSAgICAgICAgcmV0dXJuICc8U2VudGluZWxPYmplY3QgIiVz
Ij4nICUgc2VsZi5uYW1lDQotDQotDQotY2xhc3MgU2VudGluZWwob2JqZWN0KToNCi0gICAgZGVm
IF9faW5pdF9fKHNlbGYpOg0KLSAgICAgICAgc2VsZi5fc2VudGluZWxzID0ge30NCi0gICAgICAg
IA0KLSAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6DQotICAgICAgICByZXR1cm4gc2Vs
Zi5fc2VudGluZWxzLnNldGRlZmF1bHQobmFtZSwgU2VudGluZWxPYmplY3QobmFtZSkpDQotICAg
IA0KLSAgICANCi1zZW50aW5lbCA9IFNlbnRpbmVsKCkNCi0NCi1ERUZBVUxUID0gc2VudGluZWwu
REVGQVVMVA0KLQ0KLWNsYXNzIE9sZFN0eWxlQ2xhc3M6DQotICAgIHBhc3MNCi1DbGFzc1R5cGUg
PSB0eXBlKE9sZFN0eWxlQ2xhc3MpDQotDQotZGVmIF9pc19tYWdpYyhuYW1lKToNCi0gICAgcmV0
dXJuICdfXyVzX18nICUgbmFtZVsyOi0yXSA9PSBuYW1lDQotDQotZGVmIF9jb3B5KHZhbHVlKToN
Ci0gICAgaWYgdHlwZSh2YWx1ZSkgaW4gKGRpY3QsIGxpc3QsIHR1cGxlLCBzZXQpOg0KLSAgICAg
ICAgcmV0dXJuIHR5cGUodmFsdWUpKHZhbHVlKQ0KLSAgICByZXR1cm4gdmFsdWUNCi0NCi0NCi1j
bGFzcyBNb2NrKG9iamVjdCk6DQotDQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzcGVjPU5vbmUs
IHNpZGVfZWZmZWN0PU5vbmUsIHJldHVybl92YWx1ZT1ERUZBVUxULCANCi0gICAgICAgICAgICAg
ICAgIG5hbWU9Tm9uZSwgcGFyZW50PU5vbmUsIHdyYXBzPU5vbmUpOg0KLSAgICAgICAgc2VsZi5f
cGFyZW50ID0gcGFyZW50DQotICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQ0KLSAgICAgICAgaWYg
c3BlYyBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2Uoc3BlYywgbGlzdCk6DQotICAgICAg
ICAgICAgc3BlYyA9IFttZW1iZXIgZm9yIG1lbWJlciBpbiBkaXIoc3BlYykgaWYgbm90IF9pc19t
YWdpYyhtZW1iZXIpXQ0KLSAgICAgICAgDQotICAgICAgICBzZWxmLl9tZXRob2RzID0gc3BlYw0K
LSAgICAgICAgc2VsZi5fY2hpbGRyZW4gPSB7fQ0KLSAgICAgICAgc2VsZi5fcmV0dXJuX3ZhbHVl
ID0gcmV0dXJuX3ZhbHVlDQotICAgICAgICBzZWxmLnNpZGVfZWZmZWN0ID0gc2lkZV9lZmZlY3QN
Ci0gICAgICAgIHNlbGYuX3dyYXBzID0gd3JhcHMNCi0gICAgICAgIA0KLSAgICAgICAgc2VsZi5y
ZXNldF9tb2NrKCkNCi0gICAgICAgIA0KLQ0KLSAgICBkZWYgcmVzZXRfbW9jayhzZWxmKToNCi0g
ICAgICAgIHNlbGYuY2FsbGVkID0gRmFsc2UNCi0gICAgICAgIHNlbGYuY2FsbF9hcmdzID0gTm9u
ZQ0KLSAgICAgICAgc2VsZi5jYWxsX2NvdW50ID0gMA0KLSAgICAgICAgc2VsZi5jYWxsX2FyZ3Nf
bGlzdCA9IFtdDQotICAgICAgICBzZWxmLm1ldGhvZF9jYWxscyA9IFtdDQotICAgICAgICBmb3Ig
Y2hpbGQgaW4gc2VsZi5fY2hpbGRyZW4uaXRlcnZhbHVlcygpOg0KLSAgICAgICAgICAgIGNoaWxk
LnJlc2V0X21vY2soKQ0KLSAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLl9yZXR1cm5fdmFsdWUs
IE1vY2spOg0KLSAgICAgICAgICAgIHNlbGYuX3JldHVybl92YWx1ZS5yZXNldF9tb2NrKCkNCi0g
ICAgICAgIA0KLSAgICANCi0gICAgZGVmIF9fZ2V0X3JldHVybl92YWx1ZShzZWxmKToNCi0gICAg
ICAgIGlmIHNlbGYuX3JldHVybl92YWx1ZSBpcyBERUZBVUxUOg0KLSAgICAgICAgICAgIHNlbGYu
X3JldHVybl92YWx1ZSA9IE1vY2soKQ0KLSAgICAgICAgcmV0dXJuIHNlbGYuX3JldHVybl92YWx1
ZQ0KLSAgICANCi0gICAgZGVmIF9fc2V0X3JldHVybl92YWx1ZShzZWxmLCB2YWx1ZSk6DQotICAg
ICAgICBzZWxmLl9yZXR1cm5fdmFsdWUgPSB2YWx1ZQ0KLSAgICAgICAgDQotICAgIHJldHVybl92
YWx1ZSA9IHByb3BlcnR5KF9fZ2V0X3JldHVybl92YWx1ZSwgX19zZXRfcmV0dXJuX3ZhbHVlKQ0K
LQ0KLQ0KLSAgICBkZWYgX19jYWxsX18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToNCi0gICAgICAg
IHNlbGYuY2FsbGVkID0gVHJ1ZQ0KLSAgICAgICAgc2VsZi5jYWxsX2NvdW50ICs9IDENCi0gICAg
ICAgIHNlbGYuY2FsbF9hcmdzID0gKGFyZ3MsIGt3YXJncykNCi0gICAgICAgIHNlbGYuY2FsbF9h
cmdzX2xpc3QuYXBwZW5kKChhcmdzLCBrd2FyZ3MpKQ0KLSAgICAgICAgDQotICAgICAgICBwYXJl
bnQgPSBzZWxmLl9wYXJlbnQNCi0gICAgICAgIG5hbWUgPSBzZWxmLl9uYW1lDQotICAgICAgICB3
aGlsZSBwYXJlbnQgaXMgbm90IE5vbmU6DQotICAgICAgICAgICAgcGFyZW50Lm1ldGhvZF9jYWxs
cy5hcHBlbmQoKG5hbWUsIGFyZ3MsIGt3YXJncykpDQotICAgICAgICAgICAgaWYgcGFyZW50Ll9w
YXJlbnQgaXMgTm9uZToNCi0gICAgICAgICAgICAgICAgYnJlYWsNCi0gICAgICAgICAgICBuYW1l
ID0gcGFyZW50Ll9uYW1lICsgJy4nICsgbmFtZQ0KLSAgICAgICAgICAgIHBhcmVudCA9IHBhcmVu
dC5fcGFyZW50DQotICAgICAgICANCi0gICAgICAgIHJldF92YWwgPSBERUZBVUxUDQotICAgICAg
ICBpZiBzZWxmLnNpZGVfZWZmZWN0IGlzIG5vdCBOb25lOg0KLSAgICAgICAgICAgIGlmIChpc2lu
c3RhbmNlKHNlbGYuc2lkZV9lZmZlY3QsIEV4Y2VwdGlvbikgb3IgDQotICAgICAgICAgICAgICAg
IGlzaW5zdGFuY2Uoc2VsZi5zaWRlX2VmZmVjdCwgKHR5cGUsIENsYXNzVHlwZSkpIGFuZA0KLSAg
ICAgICAgICAgICAgICBpc3N1YmNsYXNzKHNlbGYuc2lkZV9lZmZlY3QsIEV4Y2VwdGlvbikpOg0K
LSAgICAgICAgICAgICAgICByYWlzZSBzZWxmLnNpZGVfZWZmZWN0DQotICAgICAgICAgICAgDQot
ICAgICAgICAgICAgcmV0X3ZhbCA9IHNlbGYuc2lkZV9lZmZlY3QoKmFyZ3MsICoqa3dhcmdzKQ0K
LSAgICAgICAgICAgIGlmIHJldF92YWwgaXMgREVGQVVMVDoNCi0gICAgICAgICAgICAgICAgcmV0
X3ZhbCA9IHNlbGYucmV0dXJuX3ZhbHVlDQotICAgICAgICANCi0gICAgICAgIGlmIHNlbGYuX3dy
YXBzIGlzIG5vdCBOb25lIGFuZCBzZWxmLl9yZXR1cm5fdmFsdWUgaXMgREVGQVVMVDoNCi0gICAg
ICAgICAgICByZXR1cm4gc2VsZi5fd3JhcHMoKmFyZ3MsICoqa3dhcmdzKQ0KLSAgICAgICAgaWYg
cmV0X3ZhbCBpcyBERUZBVUxUOg0KLSAgICAgICAgICAgIHJldF92YWwgPSBzZWxmLnJldHVybl92
YWx1ZQ0KLSAgICAgICAgcmV0dXJuIHJldF92YWwNCi0gICAgDQotICAgIA0KLSAgICBkZWYgX19n
ZXRhdHRyX18oc2VsZiwgbmFtZSk6DQotICAgICAgICBpZiBzZWxmLl9tZXRob2RzIGlzIG5vdCBO
b25lOg0KLSAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYuX21ldGhvZHM6DQotICAgICAg
ICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCJNb2NrIG9iamVjdCBoYXMgbm8gYXR0cmli
dXRlICclcyciICUgbmFtZSkNCi0gICAgICAgIGVsaWYgX2lzX21hZ2ljKG5hbWUpOg0KLSAgICAg
ICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKG5hbWUpDQotICAgICAgICANCi0gICAgICAgIGlm
IG5hbWUgbm90IGluIHNlbGYuX2NoaWxkcmVuOg0KLSAgICAgICAgICAgIHdyYXBzID0gTm9uZQ0K
LSAgICAgICAgICAgIGlmIHNlbGYuX3dyYXBzIGlzIG5vdCBOb25lOg0KLSAgICAgICAgICAgICAg
ICB3cmFwcyA9IGdldGF0dHIoc2VsZi5fd3JhcHMsIG5hbWUpDQotICAgICAgICAgICAgc2VsZi5f
Y2hpbGRyZW5bbmFtZV0gPSBNb2NrKHBhcmVudD1zZWxmLCBuYW1lPW5hbWUsIHdyYXBzPXdyYXBz
KQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkcmVuW25hbWVdDQot
ICAgIA0KLSAgICANCi0gICAgZGVmIGFzc2VydF9jYWxsZWRfd2l0aChzZWxmLCAqYXJncywgKipr
d2FyZ3MpOg0KLSAgICAgICAgYXNzZXJ0IHNlbGYuY2FsbF9hcmdzID09IChhcmdzLCBrd2FyZ3Mp
LCAnRXhwZWN0ZWQ6ICVzXG5DYWxsZWQgd2l0aDogJXMnICUgKChhcmdzLCBrd2FyZ3MpLCBzZWxm
LmNhbGxfYXJncykNCi0gICAgICAgIA0KLQ0KLWRlZiBfZG90X2xvb2t1cCh0aGluZywgY29tcCwg
aW1wb3J0X3BhdGgpOg0KLSAgICB0cnk6DQotICAgICAgICByZXR1cm4gZ2V0YXR0cih0aGluZywg
Y29tcCkNCi0gICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOg0KLSAgICAgICAgX19pbXBvcnRfXyhp
bXBvcnRfcGF0aCkNCi0gICAgICAgIHJldHVybiBnZXRhdHRyKHRoaW5nLCBjb21wKQ0KLQ0KLQ0K
LWRlZiBfaW1wb3J0ZXIodGFyZ2V0KToNCi0gICAgY29tcG9uZW50cyA9IHRhcmdldC5zcGxpdCgn
LicpDQotICAgIGltcG9ydF9wYXRoID0gY29tcG9uZW50cy5wb3AoMCkNCi0gICAgdGhpbmcgPSBf
X2ltcG9ydF9fKGltcG9ydF9wYXRoKQ0KLQ0KLSAgICBmb3IgY29tcCBpbiBjb21wb25lbnRzOg0K
LSAgICAgICAgaW1wb3J0X3BhdGggKz0gIi4lcyIgJSBjb21wDQotICAgICAgICB0aGluZyA9IF9k
b3RfbG9va3VwKHRoaW5nLCBjb21wLCBpbXBvcnRfcGF0aCkNCi0gICAgcmV0dXJuIHRoaW5nDQot
DQotDQotY2xhc3MgX3BhdGNoKG9iamVjdCk6DQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXJn
ZXQsIGF0dHJpYnV0ZSwgbmV3LCBzcGVjLCBjcmVhdGUpOg0KLSAgICAgICAgc2VsZi50YXJnZXQg
PSB0YXJnZXQNCi0gICAgICAgIHNlbGYuYXR0cmlidXRlID0gYXR0cmlidXRlDQotICAgICAgICBz
ZWxmLm5ldyA9IG5ldw0KLSAgICAgICAgc2VsZi5zcGVjID0gc3BlYw0KLSAgICAgICAgc2VsZi5j
cmVhdGUgPSBjcmVhdGUNCi0gICAgICAgIHNlbGYuaGFzX2xvY2FsID0gRmFsc2UNCi0NCi0NCi0g
ICAgZGVmIF9fY2FsbF9fKHNlbGYsIGZ1bmMpOg0KLSAgICAgICAgaWYgaGFzYXR0cihmdW5jLCAn
cGF0Y2hpbmdzJyk6DQotICAgICAgICAgICAgZnVuYy5wYXRjaGluZ3MuYXBwZW5kKHNlbGYpDQot
ICAgICAgICAgICAgcmV0dXJuIGZ1bmMNCi0NCi0gICAgICAgIGRlZiBwYXRjaGVkKCphcmdzLCAq
KmtleXdhcmdzKToNCi0gICAgICAgICAgICAjIGRvbid0IHVzZSBhIHdpdGggaGVyZSAoYmFja3dh
cmRzIGNvbXBhdGFiaWxpdHkgd2l0aCAyLjUpDQotICAgICAgICAgICAgZXh0cmFfYXJncyA9IFtd
DQotICAgICAgICAgICAgZm9yIHBhdGNoaW5nIGluIHBhdGNoZWQucGF0Y2hpbmdzOg0KLSAgICAg
ICAgICAgICAgICBhcmcgPSBwYXRjaGluZy5fX2VudGVyX18oKQ0KLSAgICAgICAgICAgICAgICBp
ZiBwYXRjaGluZy5uZXcgaXMgREVGQVVMVDoNCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhX2Fy
Z3MuYXBwZW5kKGFyZykNCi0gICAgICAgICAgICBhcmdzICs9IHR1cGxlKGV4dHJhX2FyZ3MpDQot
ICAgICAgICAgICAgdHJ5Og0KLSAgICAgICAgICAgICAgICByZXR1cm4gZnVuYygqYXJncywgKipr
ZXl3YXJncykNCi0gICAgICAgICAgICBmaW5hbGx5Og0KLSAgICAgICAgICAgICAgICBmb3IgcGF0
Y2hpbmcgaW4gZ2V0YXR0cihwYXRjaGVkLCAncGF0Y2hpbmdzJywgW10pOg0KLSAgICAgICAgICAg
ICAgICAgICAgcGF0Y2hpbmcuX19leGl0X18oKQ0KLQ0KLSAgICAgICAgcGF0Y2hlZC5wYXRjaGlu
Z3MgPSBbc2VsZl0NCi0gICAgICAgIHBhdGNoZWQuX19uYW1lX18gPSBmdW5jLl9fbmFtZV9fIA0K
LSAgICAgICAgcGF0Y2hlZC5jb21wYXRfY29fZmlyc3RsaW5lbm8gPSBnZXRhdHRyKGZ1bmMsICJj
b21wYXRfY29fZmlyc3RsaW5lbm8iLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBmdW5jLmZ1bmNfY29kZS5jb19maXJzdGxpbmVubykNCi0gICAgICAg
IHJldHVybiBwYXRjaGVkDQotDQotDQotICAgIGRlZiBnZXRfb3JpZ2luYWwoc2VsZik6DQotICAg
ICAgICB0YXJnZXQgPSBzZWxmLnRhcmdldA0KLSAgICAgICAgbmFtZSA9IHNlbGYuYXR0cmlidXRl
DQotICAgICAgICBjcmVhdGUgPSBzZWxmLmNyZWF0ZQ0KLSAgICAgICAgDQotICAgICAgICBvcmln
aW5hbCA9IERFRkFVTFQNCi0gICAgICAgIGlmIF9oYXNfbG9jYWxfYXR0cih0YXJnZXQsIG5hbWUp
Og0KLSAgICAgICAgICAgIHRyeToNCi0gICAgICAgICAgICAgICAgb3JpZ2luYWwgPSB0YXJnZXQu
X19kaWN0X19bbmFtZV0NCi0gICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6DQotICAg
ICAgICAgICAgICAgICMgZm9yIGluc3RhbmNlcyBvZiBjbGFzc2VzIHdpdGggc2xvdHMsIHRoZXkg
aGF2ZSBubyBfX2RpY3RfXw0KLSAgICAgICAgICAgICAgICBvcmlnaW5hbCA9IGdldGF0dHIodGFy
Z2V0LCBuYW1lKQ0KLSAgICAgICAgZWxpZiBub3QgY3JlYXRlIGFuZCBub3QgaGFzYXR0cih0YXJn
ZXQsIG5hbWUpOg0KLSAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCIlcyBkb2VzIG5v
dCBoYXZlIHRoZSBhdHRyaWJ1dGUgJXIiICUgKHRhcmdldCwgbmFtZSkpDQotICAgICAgICByZXR1
cm4gb3JpZ2luYWwNCi0NCi0gICAgDQotICAgIGRlZiBfX2VudGVyX18oc2VsZik6DQotICAgICAg
ICBuZXcsIHNwZWMsID0gc2VsZi5uZXcsIHNlbGYuc3BlYw0KLSAgICAgICAgb3JpZ2luYWwgPSBz
ZWxmLmdldF9vcmlnaW5hbCgpDQotICAgICAgICBpZiBuZXcgaXMgREVGQVVMVDoNCi0gICAgICAg
ICAgICAjIFhYWFggd2hhdCBpZiBvcmlnaW5hbCBpcyBERUZBVUxUIC0gc2hvdWxkbid0IHVzZSBp
dCBhcyBhIHNwZWMNCi0gICAgICAgICAgICBpbmhlcml0ID0gRmFsc2UNCi0gICAgICAgICAgICBp
ZiBzcGVjID09IFRydWU6DQotICAgICAgICAgICAgICAgICMgc2V0IHNwZWMgdG8gdGhlIG9iamVj
dCB3ZSBhcmUgcmVwbGFjaW5nDQotICAgICAgICAgICAgICAgIHNwZWMgPSBvcmlnaW5hbA0KLSAg
ICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNwZWMsICh0eXBlLCBDbGFzc1R5cGUpKToNCi0g
ICAgICAgICAgICAgICAgICAgIGluaGVyaXQgPSBUcnVlDQotICAgICAgICAgICAgbmV3ID0gTW9j
ayhzcGVjPXNwZWMpDQotICAgICAgICAgICAgaWYgaW5oZXJpdDoNCi0gICAgICAgICAgICAgICAg
bmV3LnJldHVybl92YWx1ZSA9IE1vY2soc3BlYz1zcGVjKQ0KLSAgICAgICAgc2VsZi50ZW1wX29y
aWdpbmFsID0gb3JpZ2luYWwNCi0gICAgICAgIHNldGF0dHIoc2VsZi50YXJnZXQsIHNlbGYuYXR0
cmlidXRlLCBuZXcpDQotICAgICAgICByZXR1cm4gbmV3DQotDQotDQotICAgIGRlZiBfX2V4aXRf
XyhzZWxmLCAqXyk6DQotICAgICAgICBpZiBzZWxmLnRlbXBfb3JpZ2luYWwgaXMgbm90IERFRkFV
TFQ6DQotICAgICAgICAgICAgc2V0YXR0cihzZWxmLnRhcmdldCwgc2VsZi5hdHRyaWJ1dGUsIHNl
bGYudGVtcF9vcmlnaW5hbCkNCi0gICAgICAgIGVsc2U6DQotICAgICAgICAgICAgZGVsYXR0cihz
ZWxmLnRhcmdldCwgc2VsZi5hdHRyaWJ1dGUpDQotICAgICAgICBkZWwgc2VsZi50ZW1wX29yaWdp
bmFsDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIA0KLWRlZiBwYXRjaF9vYmplY3Qo
dGFyZ2V0LCBhdHRyaWJ1dGUsIG5ldz1ERUZBVUxULCBzcGVjPU5vbmUsIGNyZWF0ZT1GYWxzZSk6
DQotICAgIHJldHVybiBfcGF0Y2godGFyZ2V0LCBhdHRyaWJ1dGUsIG5ldywgc3BlYywgY3JlYXRl
KQ0KLQ0KLQ0KLWRlZiBwYXRjaCh0YXJnZXQsIG5ldz1ERUZBVUxULCBzcGVjPU5vbmUsIGNyZWF0
ZT1GYWxzZSk6DQotICAgIHRyeToNCi0gICAgICAgIHRhcmdldCwgYXR0cmlidXRlID0gdGFyZ2V0
LnJzcGxpdCgnLicsIDEpICAgIA0KLSAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcik6
DQotICAgICAgICByYWlzZSBUeXBlRXJyb3IoIk5lZWQgYSB2YWxpZCB0YXJnZXQgdG8gcGF0Y2gu
IFlvdSBzdXBwbGllZDogJXIiICUgKHRhcmdldCwpKQ0KLSAgICB0YXJnZXQgPSBfaW1wb3J0ZXIo
dGFyZ2V0KQ0KLSAgICByZXR1cm4gX3BhdGNoKHRhcmdldCwgYXR0cmlidXRlLCBuZXcsIHNwZWMs
IGNyZWF0ZSkNCi0NCi0NCi0NCi1kZWYgX2hhc19sb2NhbF9hdHRyKG9iaiwgbmFtZSk6DQotICAg
IHRyeToNCi0gICAgICAgIHJldHVybiBuYW1lIGluIHZhcnMob2JqKQ0KLSAgICBleGNlcHQgVHlw
ZUVycm9yOg0KLSAgICAgICAgIyBvYmplY3RzIHdpdGhvdXQgYSBfX2RpY3RfXw0KLSAgICAgICAg
cmV0dXJuIGhhc2F0dHIob2JqLCBuYW1lKQ0KSW5kZXg6IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvbW9ja19idWd6aWxsYXRvb2wucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvU2Ny
aXB0cy93ZWJraXRweS9tb2NrX2J1Z3ppbGxhdG9vbC5weQkocmV2aXNpb24gNTUzNTcpCisrKyBX
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L21vY2tfYnVnemlsbGF0b29sLnB5CSh3b3JraW5n
IGNvcHkpCkBAIC0zMCw4ICszMCw4IEBAIGltcG9ydCBvcwogCiBmcm9tIHdlYmtpdHB5LmJ1Z3pp
bGxhIGltcG9ydCBCdWcsIEF0dGFjaG1lbnQKIGZyb20gd2Via2l0cHkuY29tbWl0dGVycyBpbXBv
cnQgQ29tbWl0dGVyTGlzdCwgUmV2aWV3ZXIKLWZyb20gd2Via2l0cHkubW9jayBpbXBvcnQgTW9j
awogZnJvbSB3ZWJraXRweS5zY20gaW1wb3J0IENvbW1pdE1lc3NhZ2UKK2Zyb20gd2Via2l0cHku
dGhpcmRwYXJ0eS5tb2NrIGltcG9ydCBNb2NrCiBmcm9tIHdlYmtpdHB5LndlYmtpdF9sb2dnaW5n
IGltcG9ydCBsb2cKIAogCkluZGV4OiBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3BhdGNo
Y29sbGVjdGlvbl91bml0dGVzdC5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9TY3JpcHRz
L3dlYmtpdHB5L3BhdGNoY29sbGVjdGlvbl91bml0dGVzdC5weQkocmV2aXNpb24gNTUzNTcpCisr
KyBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3BhdGNoY29sbGVjdGlvbl91bml0dGVzdC5w
eQkod29ya2luZyBjb3B5KQpAQCAtMjksNyArMjksNyBAQAogCiBpbXBvcnQgdW5pdHRlc3QKIAot
ZnJvbSB3ZWJraXRweS5tb2NrIGltcG9ydCBNb2NrCitmcm9tIHdlYmtpdHB5LnRoaXJkcGFydHku
bW9jayBpbXBvcnQgTW9jawogZnJvbSB3ZWJraXRweS5wYXRjaGNvbGxlY3Rpb24gaW1wb3J0IFBl
cnNpc3RlbnRQYXRjaENvbGxlY3Rpb24sIFBlcnNpc3RlbnRQYXRjaENvbGxlY3Rpb25EZWxlZ2F0
ZQogCiAKSW5kZXg6IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvc3RlcHNfcmVmZXJlbmNl
cy5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3N0ZXBzX3Jl
ZmVyZW5jZXMucHkJKHJldmlzaW9uIDApCisrKyBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5
L3N0ZXBzX3JlZmVyZW5jZXMucHkJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjUgQEAKKyMgQ29w
eXJpZ2h0IChDKSAyMDEwIENocmlzIEplcmRvbmVrIChjamVyZG9uZWtAd2Via2l0Lm9yZykKKyMK
KyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0OgorIyAxLiAgUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisjICAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBD
T05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorIyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorIyBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1Ig
SVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisjIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IKKyMgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyMgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwK
KyMgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworIiIiQ29udGFpbnMgaW50
cmEtcGFja2FnZSByZWZlcmVuY2VzIHVzZWQgYnkgd2Via2l0cHkuc3RlcHMuIiIiCisKK2Zyb20g
dGhpcmRwYXJ0eS5tb2NrIGltcG9ydCBNb2NrCkluZGV4OiBXZWJLaXRUb29scy9TY3JpcHRzL3dl
YmtpdHB5L2NvbW1hbmRzL2NvbW1hbmR0ZXN0LnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xz
L1NjcmlwdHMvd2Via2l0cHkvY29tbWFuZHMvY29tbWFuZHRlc3QucHkJKHJldmlzaW9uIDU1MzU3
KQorKysgV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tYW5kcy9jb21tYW5kdGVzdC5w
eQkod29ya2luZyBjb3B5KQpAQCAtMjgsNyArMjgsNyBAQAogCiBpbXBvcnQgdW5pdHRlc3QKIAot
ZnJvbSB3ZWJraXRweS5tb2NrIGltcG9ydCBNb2NrCitmcm9tIC4uY29tbWFuZHNfcmVmZXJlbmNl
cyBpbXBvcnQgTW9jawogZnJvbSB3ZWJraXRweS5tb2NrX2J1Z3ppbGxhdG9vbCBpbXBvcnQgTW9j
a0J1Z3ppbGxhVG9vbAogZnJvbSB3ZWJraXRweS5vdXRwdXRjYXB0dXJlIGltcG9ydCBPdXRwdXRD
YXB0dXJlCiAKSW5kZXg6IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbWFuZHMvZG93
bmxvYWRfdW5pdHRlc3QucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9jb21tYW5kcy9kb3dubG9hZF91bml0dGVzdC5weQkocmV2aXNpb24gNTUzNTcpCisrKyBX
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1hbmRzL2Rvd25sb2FkX3VuaXR0ZXN0LnB5
CSh3b3JraW5nIGNvcHkpCkBAIC0yNiw5ICsyNiwxMCBAQAogIyAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKICMgT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4KIAorZnJvbSAuLmNvbW1hbmRzX3JlZmVyZW5jZXMgaW1wb3J0IE1vY2sKIGZyb20g
d2Via2l0cHkuY29tbWFuZHMuY29tbWFuZHRlc3QgaW1wb3J0IENvbW1hbmRzVGVzdAogZnJvbSB3
ZWJraXRweS5jb21tYW5kcy5kb3dubG9hZCBpbXBvcnQgKgotZnJvbSB3ZWJraXRweS5tb2NrIGlt
cG9ydCBNb2NrCisKIAogY2xhc3MgRG93bmxvYWRDb21tYW5kc1Rlc3QoQ29tbWFuZHNUZXN0KToK
ICAgICBkZWYgX2RlZmF1bHRfb3B0aW9ucyhzZWxmKToKSW5kZXg6IFdlYktpdFRvb2xzL1Njcmlw
dHMvd2Via2l0cHkvY29tbWFuZHMvZWFybHlfd2FybmluZ19zeXN0ZW1fdW5pdHRlc3QucHkKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tYW5kcy9lYXJseV93
YXJuaW5nX3N5c3RlbV91bml0dGVzdC5weQkocmV2aXNpb24gNTUzNTcpCisrKyBXZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1hbmRzL2Vhcmx5X3dhcm5pbmdfc3lzdGVtX3VuaXR0ZXN0
LnB5CSh3b3JraW5nIGNvcHkpCkBAIC0yOCw5ICsyOCw5IEBACiAKIGltcG9ydCBvcwogCitmcm9t
IC4uY29tbWFuZHNfcmVmZXJlbmNlcyBpbXBvcnQgTW9jawogZnJvbSB3ZWJraXRweS5jb21tYW5k
cy5lYXJseV93YXJuaW5nX3N5c3RlbSBpbXBvcnQgKgogZnJvbSB3ZWJraXRweS5jb21tYW5kcy5x
dWV1ZXN0ZXN0IGltcG9ydCBRdWV1ZXNUZXN0Ci1mcm9tIHdlYmtpdHB5Lm1vY2sgaW1wb3J0IE1v
Y2sKIAogY2xhc3MgRWFybHlXYXJuaW5nU3l0ZW1UZXN0KFF1ZXVlc1Rlc3QpOgogICAgIGRlZiB0
ZXN0X2Nocm9taXVtX2V3cyhzZWxmKToKSW5kZXg6IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0
cHkvY29tbWFuZHMvcXVlcmllc191bml0dGVzdC5weQo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1hbmRzL3F1ZXJpZXNfdW5pdHRlc3QucHkJKHJldmlzaW9u
IDU1MzU3KQorKysgV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tYW5kcy9xdWVyaWVz
X3VuaXR0ZXN0LnB5CSh3b3JraW5nIGNvcHkpCkBAIC0yNiwxMCArMjYsMTAgQEAKICMgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCiAjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAKK2Zyb20gLi5jb21tYW5kc19yZWZlcmVuY2VzIGltcG9y
dCBNb2NrCiBmcm9tIHdlYmtpdHB5LmJ1Z3ppbGxhIGltcG9ydCBCdWd6aWxsYQogZnJvbSB3ZWJr
aXRweS5jb21tYW5kcy5jb21tYW5kdGVzdCBpbXBvcnQgQ29tbWFuZHNUZXN0CiBmcm9tIHdlYmtp
dHB5LmNvbW1hbmRzLnF1ZXJpZXMgaW1wb3J0ICoKLWZyb20gd2Via2l0cHkubW9jayBpbXBvcnQg
TW9jawogZnJvbSB3ZWJraXRweS5tb2NrX2J1Z3ppbGxhdG9vbCBpbXBvcnQgTW9ja0J1Z3ppbGxh
VG9vbAogCiBjbGFzcyBRdWVyeUNvbW1hbmRzVGVzdChDb21tYW5kc1Rlc3QpOgpJbmRleDogV2Vi
S2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tYW5kcy9xdWV1ZXNfdW5pdHRlc3QucHkKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tYW5kcy9xdWV1ZXNf
dW5pdHRlc3QucHkJKHJldmlzaW9uIDU1MzU3KQorKysgV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9jb21tYW5kcy9xdWV1ZXNfdW5pdHRlc3QucHkJKHdvcmtpbmcgY29weSkKQEAgLTI4LDEw
ICsyOCwxMCBAQAogCiBpbXBvcnQgb3MKIAorZnJvbSAuLmNvbW1hbmRzX3JlZmVyZW5jZXMgaW1w
b3J0IE1vY2sKIGZyb20gd2Via2l0cHkuY29tbWFuZHMuY29tbWFuZHRlc3QgaW1wb3J0IENvbW1h
bmRzVGVzdAogZnJvbSB3ZWJraXRweS5jb21tYW5kcy5xdWV1ZXMgaW1wb3J0ICoKIGZyb20gd2Vi
a2l0cHkuY29tbWFuZHMucXVldWVzdGVzdCBpbXBvcnQgUXVldWVzVGVzdAotZnJvbSB3ZWJraXRw
eS5tb2NrIGltcG9ydCBNb2NrCiBmcm9tIHdlYmtpdHB5Lm1vY2tfYnVnemlsbGF0b29sIGltcG9y
dCBNb2NrQnVnemlsbGFUb29sCiBmcm9tIHdlYmtpdHB5Lm91dHB1dGNhcHR1cmUgaW1wb3J0IE91
dHB1dENhcHR1cmUKIApJbmRleDogV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tYW5k
cy9xdWV1ZXN0ZXN0LnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0
cHkvY29tbWFuZHMvcXVldWVzdGVzdC5weQkocmV2aXNpb24gNTUzNTcpCisrKyBXZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1hbmRzL3F1ZXVlc3Rlc3QucHkJKHdvcmtpbmcgY29weSkK
QEAgLTI4LDggKzI4LDggQEAKIAogaW1wb3J0IHVuaXR0ZXN0CiAKK2Zyb20gLi5jb21tYW5kc19y
ZWZlcmVuY2VzIGltcG9ydCBNb2NrCiBmcm9tIHdlYmtpdHB5LmJ1Z3ppbGxhIGltcG9ydCBBdHRh
Y2htZW50Ci1mcm9tIHdlYmtpdHB5Lm1vY2sgaW1wb3J0IE1vY2sKIGZyb20gd2Via2l0cHkubW9j
a19idWd6aWxsYXRvb2wgaW1wb3J0IE1vY2tCdWd6aWxsYVRvb2wKIGZyb20gd2Via2l0cHkub3V0
cHV0Y2FwdHVyZSBpbXBvcnQgT3V0cHV0Q2FwdHVyZQogCkluZGV4OiBXZWJLaXRUb29scy9TY3Jp
cHRzL3dlYmtpdHB5L2NvbW1hbmRzL3VwbG9hZC5weQo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1hbmRzL3VwbG9hZC5weQkocmV2aXNpb24gNTUzNTcpCisr
KyBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1hbmRzL3VwbG9hZC5weQkod29ya2lu
ZyBjb3B5KQpAQCAtMzcsMTMgKzM3LDEzIEBAIGZyb20gb3B0cGFyc2UgaW1wb3J0IG1ha2Vfb3B0
aW9uCiAKIGltcG9ydCB3ZWJraXRweS5zdGVwcyBhcyBzdGVwcwogCitmcm9tIC4uY29tbWFuZHNf
cmVmZXJlbmNlcyBpbXBvcnQgTW9jawogZnJvbSB3ZWJraXRweS5idWd6aWxsYSBpbXBvcnQgcGFy
c2VfYnVnX2lkCiBmcm9tIHdlYmtpdHB5LmNvbW1hbmRzLmFic3RyYWN0c2VxdWVuY2VkY29tbWFu
ZCBpbXBvcnQgQWJzdHJhY3RTZXF1ZW5jZWRDb21tYW5kCiBmcm9tIHdlYmtpdHB5LmNvbW1lbnRz
IGltcG9ydCBidWdfY29tbWVudF9mcm9tX3N2bl9yZXZpc2lvbgogZnJvbSB3ZWJraXRweS5jb21t
aXR0ZXJzIGltcG9ydCBDb21taXR0ZXJMaXN0CiBmcm9tIHdlYmtpdHB5LmdyYW1tYXIgaW1wb3J0
IHBsdXJhbGl6ZSwgam9pbl93aXRoX3NlcGFyYXRvcnMKIGZyb20gd2Via2l0cHkud2Via2l0X2xv
Z2dpbmcgaW1wb3J0IGVycm9yLCBsb2cKLWZyb20gd2Via2l0cHkubW9jayBpbXBvcnQgTW9jawog
ZnJvbSB3ZWJraXRweS5tdWx0aWNvbW1hbmR0b29sIGltcG9ydCBBYnN0cmFjdERlY2xhcmF0aXZl
Q29tbWFuZAogZnJvbSB3ZWJraXRweS51c2VyIGltcG9ydCBVc2VyCiAKSW5kZXg6IFdlYktpdFRv
b2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbWFuZHMvdXBsb2FkX3VuaXR0ZXN0LnB5Cj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbWFuZHMvdXBsb2FkX3VuaXR0
ZXN0LnB5CShyZXZpc2lvbiA1NTM1NykKKysrIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkv
Y29tbWFuZHMvdXBsb2FkX3VuaXR0ZXN0LnB5CSh3b3JraW5nIGNvcHkpCkBAIC0yNiw5ICsyNiw5
IEBACiAjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQogIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogCitmcm9tIC4uY29tbWFuZHNfcmVm
ZXJlbmNlcyBpbXBvcnQgTW9jawogZnJvbSB3ZWJraXRweS5jb21tYW5kcy5jb21tYW5kdGVzdCBp
bXBvcnQgQ29tbWFuZHNUZXN0CiBmcm9tIHdlYmtpdHB5LmNvbW1hbmRzLnVwbG9hZCBpbXBvcnQg
KgotZnJvbSB3ZWJraXRweS5tb2NrIGltcG9ydCBNb2NrCiBmcm9tIHdlYmtpdHB5Lm1vY2tfYnVn
emlsbGF0b29sIGltcG9ydCBNb2NrQnVnemlsbGFUb29sCiAKIGNsYXNzIFVwbG9hZENvbW1hbmRz
VGVzdChDb21tYW5kc1Rlc3QpOgpJbmRleDogV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9z
dGVwcy9jbG9zZWJ1Z2ZvcmxhbmRkaWZmX3VuaXR0ZXN0LnB5Cj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktp
dFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvc3RlcHMvY2xvc2VidWdmb3JsYW5kZGlmZl91bml0dGVz
dC5weQkocmV2aXNpb24gNTUzNTcpCisrKyBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3N0
ZXBzL2Nsb3NlYnVnZm9ybGFuZGRpZmZfdW5pdHRlc3QucHkJKHdvcmtpbmcgY29weSkKQEAgLTI4
LDggKzI4LDggQEAKIAogaW1wb3J0IHVuaXR0ZXN0CiAKK2Zyb20gLi5zdGVwc19yZWZlcmVuY2Vz
IGltcG9ydCBNb2NrCiBmcm9tIHdlYmtpdHB5LnN0ZXBzLmNsb3NlYnVnZm9ybGFuZGRpZmYgaW1w
b3J0IENsb3NlQnVnRm9yTGFuZERpZmYKLWZyb20gd2Via2l0cHkubW9jayBpbXBvcnQgTW9jawog
ZnJvbSB3ZWJraXRweS5tb2NrX2J1Z3ppbGxhdG9vbCBpbXBvcnQgTW9ja0J1Z3ppbGxhVG9vbAog
ZnJvbSB3ZWJraXRweS5vdXRwdXRjYXB0dXJlIGltcG9ydCBPdXRwdXRDYXB0dXJlCiAKSW5kZXg6
IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvc3RlcHMvc3RlcHNfdW5pdHRlc3QucHkKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9zdGVwcy9zdGVwc191bml0
dGVzdC5weQkocmV2aXNpb24gNTUzNTcpCisrKyBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5
L3N0ZXBzL3N0ZXBzX3VuaXR0ZXN0LnB5CSh3b3JraW5nIGNvcHkpCkBAIC0yOCwxMSArMjgsMTEg
QEAKIAogaW1wb3J0IHVuaXR0ZXN0CiAKK2Zyb20gLi5zdGVwc19yZWZlcmVuY2VzIGltcG9ydCBN
b2NrCiBmcm9tIHdlYmtpdHB5LnN0ZXBzLnVwZGF0ZSBpbXBvcnQgVXBkYXRlCiBmcm9tIHdlYmtp
dHB5LnN0ZXBzLnByb21wdGZvcmJ1Z29ydGl0bGUgaW1wb3J0IFByb21wdEZvckJ1Z09yVGl0bGUK
IGZyb20gd2Via2l0cHkubW9ja19idWd6aWxsYXRvb2wgaW1wb3J0IE1vY2tCdWd6aWxsYVRvb2wK
IGZyb20gd2Via2l0cHkub3V0cHV0Y2FwdHVyZSBpbXBvcnQgT3V0cHV0Q2FwdHVyZQotZnJvbSB3
ZWJraXRweS5tb2NrIGltcG9ydCBNb2NrCiAKIAogY2xhc3MgU3RlcHNUZXN0KHVuaXR0ZXN0LlRl
c3RDYXNlKToKSW5kZXg6IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvc3RlcHMvdXBkYXRl
Y2hhbmdlbG9nc3dpdGhyZXZpZXdfdW5pdHRlc3RzLnB5Cj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRv
b2xzL1NjcmlwdHMvd2Via2l0cHkvc3RlcHMvdXBkYXRlY2hhbmdlbG9nc3dpdGhyZXZpZXdfdW5p
dHRlc3RzLnB5CShyZXZpc2lvbiA1NTM1NykKKysrIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0
cHkvc3RlcHMvdXBkYXRlY2hhbmdlbG9nc3dpdGhyZXZpZXdfdW5pdHRlc3RzLnB5CSh3b3JraW5n
IGNvcHkpCkBAIC0yOCw4ICsyOCw4IEBACiAKIGltcG9ydCB1bml0dGVzdAogCitmcm9tIC4uc3Rl
cHNfcmVmZXJlbmNlcyBpbXBvcnQgTW9jawogZnJvbSB3ZWJraXRweS5zdGVwcy51cGRhdGVjaGFu
Z2Vsb2dzd2l0aHJldmlld2VyIGltcG9ydCBVcGRhdGVDaGFuZ2VMb2dzV2l0aFJldmlld2VyCi1m
cm9tIHdlYmtpdHB5Lm1vY2sgaW1wb3J0IE1vY2sKIGZyb20gd2Via2l0cHkubW9ja19idWd6aWxs
YXRvb2wgaW1wb3J0IE1vY2tCdWd6aWxsYVRvb2wKIGZyb20gd2Via2l0cHkub3V0cHV0Y2FwdHVy
ZSBpbXBvcnQgT3V0cHV0Q2FwdHVyZQogCkluZGV4OiBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtp
dHB5L3RoaXJkcGFydHkvbW9jay5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9TY3JpcHRz
L3dlYmtpdHB5L3RoaXJkcGFydHkvbW9jay5weQkocmV2aXNpb24gNTUzNTcpCShmcm9tIFdlYktp
dFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbW9jay5weTo1NTM1NykKKysrIFdlYktpdFRvb2xzL1Nj
cmlwdHMvd2Via2l0cHkvdGhpcmRwYXJ0eS9tb2NrLnB5CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsMzA5IEBACisjIG1vY2sucHkNCisjIFRlc3QgdG9vbHMgZm9yIG1vY2tpbmcgYW5kIHBhdGNo
aW5nLg0KKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgTWljaGFlbCBGb29yZA0KKyMgRS1tYWls
OiBmdXp6eW1hbiBBVCB2b2lkc3BhY2UgRE9UIG9yZyBET1QgdWsNCisNCisjIG1vY2sgMC42LjAN
CisjIGh0dHA6Ly93d3cudm9pZHNwYWNlLm9yZy51ay9weXRob24vbW9jay8NCisNCisjIFJlbGVh
c2VkIHN1YmplY3QgdG8gdGhlIEJTRCBMaWNlbnNlDQorIyBQbGVhc2Ugc2VlIGh0dHA6Ly93d3cu
dm9pZHNwYWNlLm9yZy51ay9weXRob24vbGljZW5zZS5zaHRtbA0KKw0KKyMgMjAwOS0xMS0yNTog
TGljZW5jZSBkb3dubG9hZGVkIGZyb20gYWJvdmUgVVJMLg0KKyMgQkVHSU4gRE9XTkxPQURFRCBM
SUNFTlNFDQorIw0KKyMgQ29weXJpZ2h0IChjKSAyMDAzLTIwMDksIE1pY2hhZWwgRm9vcmQNCisj
IEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorIyBFLW1haWwgOiBmdXp6eW1hbiBBVCB2b2lkc3BhY2Ug
RE9UIG9yZyBET1QgdWsNCisjIA0KKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQorIyBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQorIyBt
ZXQ6DQorIyANCisjIA0KKyMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisjICAgICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCisjIA0KKyMgICAg
ICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZQ0KKyMgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcNCisjICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZA0KKyMgICAgICAgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLg0KKyMgDQorIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIE1pY2hhZWwgRm9vcmQg
bm9yIHRoZSBuYW1lIG9mIFZvaWRzcGFjZQ0KKyMgICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzDQorIyAgICAgICBzb2Z0d2Fy
ZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisjIA0KKyMgVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRS
SUJVVE9SUw0KKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QNCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KKyMgQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCisj
IE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLA0KKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQorIyBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkNCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQNCisjIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KKyMgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisjDQor
IyBFTkQgRE9XTkxPQURFRCBMSUNFTlNFDQorDQorIyBTY3JpcHRzIG1haW50YWluZWQgYXQgaHR0
cDovL3d3dy52b2lkc3BhY2Uub3JnLnVrL3B5dGhvbi9pbmRleC5zaHRtbA0KKyMgQ29tbWVudHMs
IHN1Z2dlc3Rpb25zIGFuZCBidWcgcmVwb3J0cyB3ZWxjb21lLg0KKw0KKw0KK19fYWxsX18gPSAo
DQorICAgICdNb2NrJywNCisgICAgJ3BhdGNoJywNCisgICAgJ3BhdGNoX29iamVjdCcsDQorICAg
ICdzZW50aW5lbCcsDQorICAgICdERUZBVUxUJw0KKykNCisNCitfX3ZlcnNpb25fXyA9ICcwLjYu
MCcNCisNCitjbGFzcyBTZW50aW5lbE9iamVjdChvYmplY3QpOg0KKyAgICBkZWYgX19pbml0X18o
c2VsZiwgbmFtZSk6DQorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lDQorICAgICAgICANCisgICAg
ZGVmIF9fcmVwcl9fKHNlbGYpOg0KKyAgICAgICAgcmV0dXJuICc8U2VudGluZWxPYmplY3QgIiVz
Ij4nICUgc2VsZi5uYW1lDQorDQorDQorY2xhc3MgU2VudGluZWwob2JqZWN0KToNCisgICAgZGVm
IF9faW5pdF9fKHNlbGYpOg0KKyAgICAgICAgc2VsZi5fc2VudGluZWxzID0ge30NCisgICAgICAg
IA0KKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6DQorICAgICAgICByZXR1cm4gc2Vs
Zi5fc2VudGluZWxzLnNldGRlZmF1bHQobmFtZSwgU2VudGluZWxPYmplY3QobmFtZSkpDQorICAg
IA0KKyAgICANCitzZW50aW5lbCA9IFNlbnRpbmVsKCkNCisNCitERUZBVUxUID0gc2VudGluZWwu
REVGQVVMVA0KKw0KK2NsYXNzIE9sZFN0eWxlQ2xhc3M6DQorICAgIHBhc3MNCitDbGFzc1R5cGUg
PSB0eXBlKE9sZFN0eWxlQ2xhc3MpDQorDQorZGVmIF9pc19tYWdpYyhuYW1lKToNCisgICAgcmV0
dXJuICdfXyVzX18nICUgbmFtZVsyOi0yXSA9PSBuYW1lDQorDQorZGVmIF9jb3B5KHZhbHVlKToN
CisgICAgaWYgdHlwZSh2YWx1ZSkgaW4gKGRpY3QsIGxpc3QsIHR1cGxlLCBzZXQpOg0KKyAgICAg
ICAgcmV0dXJuIHR5cGUodmFsdWUpKHZhbHVlKQ0KKyAgICByZXR1cm4gdmFsdWUNCisNCisNCitj
bGFzcyBNb2NrKG9iamVjdCk6DQorDQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzcGVjPU5vbmUs
IHNpZGVfZWZmZWN0PU5vbmUsIHJldHVybl92YWx1ZT1ERUZBVUxULCANCisgICAgICAgICAgICAg
ICAgIG5hbWU9Tm9uZSwgcGFyZW50PU5vbmUsIHdyYXBzPU5vbmUpOg0KKyAgICAgICAgc2VsZi5f
cGFyZW50ID0gcGFyZW50DQorICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQ0KKyAgICAgICAgaWYg
c3BlYyBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2Uoc3BlYywgbGlzdCk6DQorICAgICAg
ICAgICAgc3BlYyA9IFttZW1iZXIgZm9yIG1lbWJlciBpbiBkaXIoc3BlYykgaWYgbm90IF9pc19t
YWdpYyhtZW1iZXIpXQ0KKyAgICAgICAgDQorICAgICAgICBzZWxmLl9tZXRob2RzID0gc3BlYw0K
KyAgICAgICAgc2VsZi5fY2hpbGRyZW4gPSB7fQ0KKyAgICAgICAgc2VsZi5fcmV0dXJuX3ZhbHVl
ID0gcmV0dXJuX3ZhbHVlDQorICAgICAgICBzZWxmLnNpZGVfZWZmZWN0ID0gc2lkZV9lZmZlY3QN
CisgICAgICAgIHNlbGYuX3dyYXBzID0gd3JhcHMNCisgICAgICAgIA0KKyAgICAgICAgc2VsZi5y
ZXNldF9tb2NrKCkNCisgICAgICAgIA0KKw0KKyAgICBkZWYgcmVzZXRfbW9jayhzZWxmKToNCisg
ICAgICAgIHNlbGYuY2FsbGVkID0gRmFsc2UNCisgICAgICAgIHNlbGYuY2FsbF9hcmdzID0gTm9u
ZQ0KKyAgICAgICAgc2VsZi5jYWxsX2NvdW50ID0gMA0KKyAgICAgICAgc2VsZi5jYWxsX2FyZ3Nf
bGlzdCA9IFtdDQorICAgICAgICBzZWxmLm1ldGhvZF9jYWxscyA9IFtdDQorICAgICAgICBmb3Ig
Y2hpbGQgaW4gc2VsZi5fY2hpbGRyZW4uaXRlcnZhbHVlcygpOg0KKyAgICAgICAgICAgIGNoaWxk
LnJlc2V0X21vY2soKQ0KKyAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLl9yZXR1cm5fdmFsdWUs
IE1vY2spOg0KKyAgICAgICAgICAgIHNlbGYuX3JldHVybl92YWx1ZS5yZXNldF9tb2NrKCkNCisg
ICAgICAgIA0KKyAgICANCisgICAgZGVmIF9fZ2V0X3JldHVybl92YWx1ZShzZWxmKToNCisgICAg
ICAgIGlmIHNlbGYuX3JldHVybl92YWx1ZSBpcyBERUZBVUxUOg0KKyAgICAgICAgICAgIHNlbGYu
X3JldHVybl92YWx1ZSA9IE1vY2soKQ0KKyAgICAgICAgcmV0dXJuIHNlbGYuX3JldHVybl92YWx1
ZQ0KKyAgICANCisgICAgZGVmIF9fc2V0X3JldHVybl92YWx1ZShzZWxmLCB2YWx1ZSk6DQorICAg
ICAgICBzZWxmLl9yZXR1cm5fdmFsdWUgPSB2YWx1ZQ0KKyAgICAgICAgDQorICAgIHJldHVybl92
YWx1ZSA9IHByb3BlcnR5KF9fZ2V0X3JldHVybl92YWx1ZSwgX19zZXRfcmV0dXJuX3ZhbHVlKQ0K
Kw0KKw0KKyAgICBkZWYgX19jYWxsX18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToNCisgICAgICAg
IHNlbGYuY2FsbGVkID0gVHJ1ZQ0KKyAgICAgICAgc2VsZi5jYWxsX2NvdW50ICs9IDENCisgICAg
ICAgIHNlbGYuY2FsbF9hcmdzID0gKGFyZ3MsIGt3YXJncykNCisgICAgICAgIHNlbGYuY2FsbF9h
cmdzX2xpc3QuYXBwZW5kKChhcmdzLCBrd2FyZ3MpKQ0KKyAgICAgICAgDQorICAgICAgICBwYXJl
bnQgPSBzZWxmLl9wYXJlbnQNCisgICAgICAgIG5hbWUgPSBzZWxmLl9uYW1lDQorICAgICAgICB3
aGlsZSBwYXJlbnQgaXMgbm90IE5vbmU6DQorICAgICAgICAgICAgcGFyZW50Lm1ldGhvZF9jYWxs
cy5hcHBlbmQoKG5hbWUsIGFyZ3MsIGt3YXJncykpDQorICAgICAgICAgICAgaWYgcGFyZW50Ll9w
YXJlbnQgaXMgTm9uZToNCisgICAgICAgICAgICAgICAgYnJlYWsNCisgICAgICAgICAgICBuYW1l
ID0gcGFyZW50Ll9uYW1lICsgJy4nICsgbmFtZQ0KKyAgICAgICAgICAgIHBhcmVudCA9IHBhcmVu
dC5fcGFyZW50DQorICAgICAgICANCisgICAgICAgIHJldF92YWwgPSBERUZBVUxUDQorICAgICAg
ICBpZiBzZWxmLnNpZGVfZWZmZWN0IGlzIG5vdCBOb25lOg0KKyAgICAgICAgICAgIGlmIChpc2lu
c3RhbmNlKHNlbGYuc2lkZV9lZmZlY3QsIEV4Y2VwdGlvbikgb3IgDQorICAgICAgICAgICAgICAg
IGlzaW5zdGFuY2Uoc2VsZi5zaWRlX2VmZmVjdCwgKHR5cGUsIENsYXNzVHlwZSkpIGFuZA0KKyAg
ICAgICAgICAgICAgICBpc3N1YmNsYXNzKHNlbGYuc2lkZV9lZmZlY3QsIEV4Y2VwdGlvbikpOg0K
KyAgICAgICAgICAgICAgICByYWlzZSBzZWxmLnNpZGVfZWZmZWN0DQorICAgICAgICAgICAgDQor
ICAgICAgICAgICAgcmV0X3ZhbCA9IHNlbGYuc2lkZV9lZmZlY3QoKmFyZ3MsICoqa3dhcmdzKQ0K
KyAgICAgICAgICAgIGlmIHJldF92YWwgaXMgREVGQVVMVDoNCisgICAgICAgICAgICAgICAgcmV0
X3ZhbCA9IHNlbGYucmV0dXJuX3ZhbHVlDQorICAgICAgICANCisgICAgICAgIGlmIHNlbGYuX3dy
YXBzIGlzIG5vdCBOb25lIGFuZCBzZWxmLl9yZXR1cm5fdmFsdWUgaXMgREVGQVVMVDoNCisgICAg
ICAgICAgICByZXR1cm4gc2VsZi5fd3JhcHMoKmFyZ3MsICoqa3dhcmdzKQ0KKyAgICAgICAgaWYg
cmV0X3ZhbCBpcyBERUZBVUxUOg0KKyAgICAgICAgICAgIHJldF92YWwgPSBzZWxmLnJldHVybl92
YWx1ZQ0KKyAgICAgICAgcmV0dXJuIHJldF92YWwNCisgICAgDQorICAgIA0KKyAgICBkZWYgX19n
ZXRhdHRyX18oc2VsZiwgbmFtZSk6DQorICAgICAgICBpZiBzZWxmLl9tZXRob2RzIGlzIG5vdCBO
b25lOg0KKyAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYuX21ldGhvZHM6DQorICAgICAg
ICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCJNb2NrIG9iamVjdCBoYXMgbm8gYXR0cmli
dXRlICclcyciICUgbmFtZSkNCisgICAgICAgIGVsaWYgX2lzX21hZ2ljKG5hbWUpOg0KKyAgICAg
ICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKG5hbWUpDQorICAgICAgICANCisgICAgICAgIGlm
IG5hbWUgbm90IGluIHNlbGYuX2NoaWxkcmVuOg0KKyAgICAgICAgICAgIHdyYXBzID0gTm9uZQ0K
KyAgICAgICAgICAgIGlmIHNlbGYuX3dyYXBzIGlzIG5vdCBOb25lOg0KKyAgICAgICAgICAgICAg
ICB3cmFwcyA9IGdldGF0dHIoc2VsZi5fd3JhcHMsIG5hbWUpDQorICAgICAgICAgICAgc2VsZi5f
Y2hpbGRyZW5bbmFtZV0gPSBNb2NrKHBhcmVudD1zZWxmLCBuYW1lPW5hbWUsIHdyYXBzPXdyYXBz
KQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkcmVuW25hbWVdDQor
ICAgIA0KKyAgICANCisgICAgZGVmIGFzc2VydF9jYWxsZWRfd2l0aChzZWxmLCAqYXJncywgKipr
d2FyZ3MpOg0KKyAgICAgICAgYXNzZXJ0IHNlbGYuY2FsbF9hcmdzID09IChhcmdzLCBrd2FyZ3Mp
LCAnRXhwZWN0ZWQ6ICVzXG5DYWxsZWQgd2l0aDogJXMnICUgKChhcmdzLCBrd2FyZ3MpLCBzZWxm
LmNhbGxfYXJncykNCisgICAgICAgIA0KKw0KK2RlZiBfZG90X2xvb2t1cCh0aGluZywgY29tcCwg
aW1wb3J0X3BhdGgpOg0KKyAgICB0cnk6DQorICAgICAgICByZXR1cm4gZ2V0YXR0cih0aGluZywg
Y29tcCkNCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOg0KKyAgICAgICAgX19pbXBvcnRfXyhp
bXBvcnRfcGF0aCkNCisgICAgICAgIHJldHVybiBnZXRhdHRyKHRoaW5nLCBjb21wKQ0KKw0KKw0K
K2RlZiBfaW1wb3J0ZXIodGFyZ2V0KToNCisgICAgY29tcG9uZW50cyA9IHRhcmdldC5zcGxpdCgn
LicpDQorICAgIGltcG9ydF9wYXRoID0gY29tcG9uZW50cy5wb3AoMCkNCisgICAgdGhpbmcgPSBf
X2ltcG9ydF9fKGltcG9ydF9wYXRoKQ0KKw0KKyAgICBmb3IgY29tcCBpbiBjb21wb25lbnRzOg0K
KyAgICAgICAgaW1wb3J0X3BhdGggKz0gIi4lcyIgJSBjb21wDQorICAgICAgICB0aGluZyA9IF9k
b3RfbG9va3VwKHRoaW5nLCBjb21wLCBpbXBvcnRfcGF0aCkNCisgICAgcmV0dXJuIHRoaW5nDQor
DQorDQorY2xhc3MgX3BhdGNoKG9iamVjdCk6DQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXJn
ZXQsIGF0dHJpYnV0ZSwgbmV3LCBzcGVjLCBjcmVhdGUpOg0KKyAgICAgICAgc2VsZi50YXJnZXQg
PSB0YXJnZXQNCisgICAgICAgIHNlbGYuYXR0cmlidXRlID0gYXR0cmlidXRlDQorICAgICAgICBz
ZWxmLm5ldyA9IG5ldw0KKyAgICAgICAgc2VsZi5zcGVjID0gc3BlYw0KKyAgICAgICAgc2VsZi5j
cmVhdGUgPSBjcmVhdGUNCisgICAgICAgIHNlbGYuaGFzX2xvY2FsID0gRmFsc2UNCisNCisNCisg
ICAgZGVmIF9fY2FsbF9fKHNlbGYsIGZ1bmMpOg0KKyAgICAgICAgaWYgaGFzYXR0cihmdW5jLCAn
cGF0Y2hpbmdzJyk6DQorICAgICAgICAgICAgZnVuYy5wYXRjaGluZ3MuYXBwZW5kKHNlbGYpDQor
ICAgICAgICAgICAgcmV0dXJuIGZ1bmMNCisNCisgICAgICAgIGRlZiBwYXRjaGVkKCphcmdzLCAq
KmtleXdhcmdzKToNCisgICAgICAgICAgICAjIGRvbid0IHVzZSBhIHdpdGggaGVyZSAoYmFja3dh
cmRzIGNvbXBhdGFiaWxpdHkgd2l0aCAyLjUpDQorICAgICAgICAgICAgZXh0cmFfYXJncyA9IFtd
DQorICAgICAgICAgICAgZm9yIHBhdGNoaW5nIGluIHBhdGNoZWQucGF0Y2hpbmdzOg0KKyAgICAg
ICAgICAgICAgICBhcmcgPSBwYXRjaGluZy5fX2VudGVyX18oKQ0KKyAgICAgICAgICAgICAgICBp
ZiBwYXRjaGluZy5uZXcgaXMgREVGQVVMVDoNCisgICAgICAgICAgICAgICAgICAgIGV4dHJhX2Fy
Z3MuYXBwZW5kKGFyZykNCisgICAgICAgICAgICBhcmdzICs9IHR1cGxlKGV4dHJhX2FyZ3MpDQor
ICAgICAgICAgICAgdHJ5Og0KKyAgICAgICAgICAgICAgICByZXR1cm4gZnVuYygqYXJncywgKipr
ZXl3YXJncykNCisgICAgICAgICAgICBmaW5hbGx5Og0KKyAgICAgICAgICAgICAgICBmb3IgcGF0
Y2hpbmcgaW4gZ2V0YXR0cihwYXRjaGVkLCAncGF0Y2hpbmdzJywgW10pOg0KKyAgICAgICAgICAg
ICAgICAgICAgcGF0Y2hpbmcuX19leGl0X18oKQ0KKw0KKyAgICAgICAgcGF0Y2hlZC5wYXRjaGlu
Z3MgPSBbc2VsZl0NCisgICAgICAgIHBhdGNoZWQuX19uYW1lX18gPSBmdW5jLl9fbmFtZV9fIA0K
KyAgICAgICAgcGF0Y2hlZC5jb21wYXRfY29fZmlyc3RsaW5lbm8gPSBnZXRhdHRyKGZ1bmMsICJj
b21wYXRfY29fZmlyc3RsaW5lbm8iLCANCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBmdW5jLmZ1bmNfY29kZS5jb19maXJzdGxpbmVubykNCisgICAgICAg
IHJldHVybiBwYXRjaGVkDQorDQorDQorICAgIGRlZiBnZXRfb3JpZ2luYWwoc2VsZik6DQorICAg
ICAgICB0YXJnZXQgPSBzZWxmLnRhcmdldA0KKyAgICAgICAgbmFtZSA9IHNlbGYuYXR0cmlidXRl
DQorICAgICAgICBjcmVhdGUgPSBzZWxmLmNyZWF0ZQ0KKyAgICAgICAgDQorICAgICAgICBvcmln
aW5hbCA9IERFRkFVTFQNCisgICAgICAgIGlmIF9oYXNfbG9jYWxfYXR0cih0YXJnZXQsIG5hbWUp
Og0KKyAgICAgICAgICAgIHRyeToNCisgICAgICAgICAgICAgICAgb3JpZ2luYWwgPSB0YXJnZXQu
X19kaWN0X19bbmFtZV0NCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6DQorICAg
ICAgICAgICAgICAgICMgZm9yIGluc3RhbmNlcyBvZiBjbGFzc2VzIHdpdGggc2xvdHMsIHRoZXkg
aGF2ZSBubyBfX2RpY3RfXw0KKyAgICAgICAgICAgICAgICBvcmlnaW5hbCA9IGdldGF0dHIodGFy
Z2V0LCBuYW1lKQ0KKyAgICAgICAgZWxpZiBub3QgY3JlYXRlIGFuZCBub3QgaGFzYXR0cih0YXJn
ZXQsIG5hbWUpOg0KKyAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCIlcyBkb2VzIG5v
dCBoYXZlIHRoZSBhdHRyaWJ1dGUgJXIiICUgKHRhcmdldCwgbmFtZSkpDQorICAgICAgICByZXR1
cm4gb3JpZ2luYWwNCisNCisgICAgDQorICAgIGRlZiBfX2VudGVyX18oc2VsZik6DQorICAgICAg
ICBuZXcsIHNwZWMsID0gc2VsZi5uZXcsIHNlbGYuc3BlYw0KKyAgICAgICAgb3JpZ2luYWwgPSBz
ZWxmLmdldF9vcmlnaW5hbCgpDQorICAgICAgICBpZiBuZXcgaXMgREVGQVVMVDoNCisgICAgICAg
ICAgICAjIFhYWFggd2hhdCBpZiBvcmlnaW5hbCBpcyBERUZBVUxUIC0gc2hvdWxkbid0IHVzZSBp
dCBhcyBhIHNwZWMNCisgICAgICAgICAgICBpbmhlcml0ID0gRmFsc2UNCisgICAgICAgICAgICBp
ZiBzcGVjID09IFRydWU6DQorICAgICAgICAgICAgICAgICMgc2V0IHNwZWMgdG8gdGhlIG9iamVj
dCB3ZSBhcmUgcmVwbGFjaW5nDQorICAgICAgICAgICAgICAgIHNwZWMgPSBvcmlnaW5hbA0KKyAg
ICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNwZWMsICh0eXBlLCBDbGFzc1R5cGUpKToNCisg
ICAgICAgICAgICAgICAgICAgIGluaGVyaXQgPSBUcnVlDQorICAgICAgICAgICAgbmV3ID0gTW9j
ayhzcGVjPXNwZWMpDQorICAgICAgICAgICAgaWYgaW5oZXJpdDoNCisgICAgICAgICAgICAgICAg
bmV3LnJldHVybl92YWx1ZSA9IE1vY2soc3BlYz1zcGVjKQ0KKyAgICAgICAgc2VsZi50ZW1wX29y
aWdpbmFsID0gb3JpZ2luYWwNCisgICAgICAgIHNldGF0dHIoc2VsZi50YXJnZXQsIHNlbGYuYXR0
cmlidXRlLCBuZXcpDQorICAgICAgICByZXR1cm4gbmV3DQorDQorDQorICAgIGRlZiBfX2V4aXRf
XyhzZWxmLCAqXyk6DQorICAgICAgICBpZiBzZWxmLnRlbXBfb3JpZ2luYWwgaXMgbm90IERFRkFV
TFQ6DQorICAgICAgICAgICAgc2V0YXR0cihzZWxmLnRhcmdldCwgc2VsZi5hdHRyaWJ1dGUsIHNl
bGYudGVtcF9vcmlnaW5hbCkNCisgICAgICAgIGVsc2U6DQorICAgICAgICAgICAgZGVsYXR0cihz
ZWxmLnRhcmdldCwgc2VsZi5hdHRyaWJ1dGUpDQorICAgICAgICBkZWwgc2VsZi50ZW1wX29yaWdp
bmFsDQorICAgICAgICAgICAgDQorICAgICAgICAgICAgICAgIA0KK2RlZiBwYXRjaF9vYmplY3Qo
dGFyZ2V0LCBhdHRyaWJ1dGUsIG5ldz1ERUZBVUxULCBzcGVjPU5vbmUsIGNyZWF0ZT1GYWxzZSk6
DQorICAgIHJldHVybiBfcGF0Y2godGFyZ2V0LCBhdHRyaWJ1dGUsIG5ldywgc3BlYywgY3JlYXRl
KQ0KKw0KKw0KK2RlZiBwYXRjaCh0YXJnZXQsIG5ldz1ERUZBVUxULCBzcGVjPU5vbmUsIGNyZWF0
ZT1GYWxzZSk6DQorICAgIHRyeToNCisgICAgICAgIHRhcmdldCwgYXR0cmlidXRlID0gdGFyZ2V0
LnJzcGxpdCgnLicsIDEpICAgIA0KKyAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcik6
DQorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIk5lZWQgYSB2YWxpZCB0YXJnZXQgdG8gcGF0Y2gu
IFlvdSBzdXBwbGllZDogJXIiICUgKHRhcmdldCwpKQ0KKyAgICB0YXJnZXQgPSBfaW1wb3J0ZXIo
dGFyZ2V0KQ0KKyAgICByZXR1cm4gX3BhdGNoKHRhcmdldCwgYXR0cmlidXRlLCBuZXcsIHNwZWMs
IGNyZWF0ZSkNCisNCisNCisNCitkZWYgX2hhc19sb2NhbF9hdHRyKG9iaiwgbmFtZSk6DQorICAg
IHRyeToNCisgICAgICAgIHJldHVybiBuYW1lIGluIHZhcnMob2JqKQ0KKyAgICBleGNlcHQgVHlw
ZUVycm9yOg0KKyAgICAgICAgIyBvYmplY3RzIHdpdGhvdXQgYSBfX2RpY3RfXw0KKyAgICAgICAg
cmV0dXJuIGhhc2F0dHIob2JqLCBuYW1lKQ0KSW5kZXg6IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvdGhpcmRwYXJ0eS9tb2NrLnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1Njcmlw
dHMvd2Via2l0cHkvdGhpcmRwYXJ0eS9tb2NrLnB5CShyZXZpc2lvbiA1NTM1NykKKysrIFdlYktp
dFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdGhpcmRwYXJ0eS9tb2NrLnB5CSh3b3JraW5nIGNvcHkp
CkBAIC0xLDMwOSArMSwzMDkgQEAKLSMgbW9jay5weQ0KLSMgVGVzdCB0b29scyBmb3IgbW9ja2lu
ZyBhbmQgcGF0Y2hpbmcuDQotIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBNaWNoYWVsIEZvb3Jk
DQotIyBFLW1haWw6IGZ1enp5bWFuIEFUIHZvaWRzcGFjZSBET1Qgb3JnIERPVCB1aw0KLQ0KLSMg
bW9jayAwLjYuMA0KLSMgaHR0cDovL3d3dy52b2lkc3BhY2Uub3JnLnVrL3B5dGhvbi9tb2NrLw0K
LQ0KLSMgUmVsZWFzZWQgc3ViamVjdCB0byB0aGUgQlNEIExpY2Vuc2UNCi0jIFBsZWFzZSBzZWUg
aHR0cDovL3d3dy52b2lkc3BhY2Uub3JnLnVrL3B5dGhvbi9saWNlbnNlLnNodG1sDQotDQotIyAy
MDA5LTExLTI1OiBMaWNlbmNlIGRvd25sb2FkZWQgZnJvbSBhYm92ZSBVUkwuDQotIyBCRUdJTiBE
T1dOTE9BREVEIExJQ0VOU0UNCi0jDQotIyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOSwgTWljaGFl
bCBGb29yZA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4NCi0jIEUtbWFpbCA6IGZ1enp5bWFuIEFU
IHZvaWRzcGFjZSBET1Qgb3JnIERPVCB1aw0KLSMgDQotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCi0jIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cyBhcmUNCi0jIG1ldDoNCi0jIA0KLSMgDQotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodA0KLSMgICAgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0K
LSMgDQotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlDQotIyAgICAgICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZw0KLSMgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkDQotIyAgICAgICB3aXRo
IHRoZSBkaXN0cmlidXRpb24uDQotIyANCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgTWlj
aGFlbCBGb29yZCBub3IgdGhlIG5hbWUgb2YgVm9pZHNwYWNlDQotIyAgICAgICBtYXkgYmUgdXNl
ZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMNCi0jICAg
ICAgIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0K
LSMgDQotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVS
UyBBTkQgQ09OVFJJQlVUT1JTDQotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0KLSMgTElNSVRFRCBUTywgVEhFIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SDQotIyBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENP
UFlSSUdIVA0KLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQotIyBMSU1JVEVEIFRPLCBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0j
IERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWQ0KLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQotIyBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLg0KLSMNCi0jIEVORCBET1dOTE9BREVEIExJQ0VOU0UNCi0NCi0jIFNjcmlwdHMgbWFpbnRh
aW5lZCBhdCBodHRwOi8vd3d3LnZvaWRzcGFjZS5vcmcudWsvcHl0aG9uL2luZGV4LnNodG1sDQot
IyBDb21tZW50cywgc3VnZ2VzdGlvbnMgYW5kIGJ1ZyByZXBvcnRzIHdlbGNvbWUuDQotDQotDQot
X19hbGxfXyA9ICgNCi0gICAgJ01vY2snLA0KLSAgICAncGF0Y2gnLA0KLSAgICAncGF0Y2hfb2Jq
ZWN0JywNCi0gICAgJ3NlbnRpbmVsJywNCi0gICAgJ0RFRkFVTFQnDQotKQ0KLQ0KLV9fdmVyc2lv
bl9fID0gJzAuNi4wJw0KLQ0KLWNsYXNzIFNlbnRpbmVsT2JqZWN0KG9iamVjdCk6DQotICAgIGRl
ZiBfX2luaXRfXyhzZWxmLCBuYW1lKToNCi0gICAgICAgIHNlbGYubmFtZSA9IG5hbWUNCi0gICAg
ICAgIA0KLSAgICBkZWYgX19yZXByX18oc2VsZik6DQotICAgICAgICByZXR1cm4gJzxTZW50aW5l
bE9iamVjdCAiJXMiPicgJSBzZWxmLm5hbWUNCi0NCi0NCi1jbGFzcyBTZW50aW5lbChvYmplY3Qp
Og0KLSAgICBkZWYgX19pbml0X18oc2VsZik6DQotICAgICAgICBzZWxmLl9zZW50aW5lbHMgPSB7
fQ0KLSAgICAgICAgDQotICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToNCi0gICAgICAg
IHJldHVybiBzZWxmLl9zZW50aW5lbHMuc2V0ZGVmYXVsdChuYW1lLCBTZW50aW5lbE9iamVjdChu
YW1lKSkNCi0gICAgDQotICAgIA0KLXNlbnRpbmVsID0gU2VudGluZWwoKQ0KLQ0KLURFRkFVTFQg
PSBzZW50aW5lbC5ERUZBVUxUDQotDQotY2xhc3MgT2xkU3R5bGVDbGFzczoNCi0gICAgcGFzcw0K
LUNsYXNzVHlwZSA9IHR5cGUoT2xkU3R5bGVDbGFzcykNCi0NCi1kZWYgX2lzX21hZ2ljKG5hbWUp
Og0KLSAgICByZXR1cm4gJ19fJXNfXycgJSBuYW1lWzI6LTJdID09IG5hbWUNCi0NCi1kZWYgX2Nv
cHkodmFsdWUpOg0KLSAgICBpZiB0eXBlKHZhbHVlKSBpbiAoZGljdCwgbGlzdCwgdHVwbGUsIHNl
dCk6DQotICAgICAgICByZXR1cm4gdHlwZSh2YWx1ZSkodmFsdWUpDQotICAgIHJldHVybiB2YWx1
ZQ0KLQ0KLQ0KLWNsYXNzIE1vY2sob2JqZWN0KToNCi0NCi0gICAgZGVmIF9faW5pdF9fKHNlbGYs
IHNwZWM9Tm9uZSwgc2lkZV9lZmZlY3Q9Tm9uZSwgcmV0dXJuX3ZhbHVlPURFRkFVTFQsIA0KLSAg
ICAgICAgICAgICAgICAgbmFtZT1Ob25lLCBwYXJlbnQ9Tm9uZSwgd3JhcHM9Tm9uZSk6DQotICAg
ICAgICBzZWxmLl9wYXJlbnQgPSBwYXJlbnQNCi0gICAgICAgIHNlbGYuX25hbWUgPSBuYW1lDQot
ICAgICAgICBpZiBzcGVjIGlzIG5vdCBOb25lIGFuZCBub3QgaXNpbnN0YW5jZShzcGVjLCBsaXN0
KToNCi0gICAgICAgICAgICBzcGVjID0gW21lbWJlciBmb3IgbWVtYmVyIGluIGRpcihzcGVjKSBp
ZiBub3QgX2lzX21hZ2ljKG1lbWJlcildDQotICAgICAgICANCi0gICAgICAgIHNlbGYuX21ldGhv
ZHMgPSBzcGVjDQotICAgICAgICBzZWxmLl9jaGlsZHJlbiA9IHt9DQotICAgICAgICBzZWxmLl9y
ZXR1cm5fdmFsdWUgPSByZXR1cm5fdmFsdWUNCi0gICAgICAgIHNlbGYuc2lkZV9lZmZlY3QgPSBz
aWRlX2VmZmVjdA0KLSAgICAgICAgc2VsZi5fd3JhcHMgPSB3cmFwcw0KLSAgICAgICAgDQotICAg
ICAgICBzZWxmLnJlc2V0X21vY2soKQ0KLSAgICAgICAgDQotDQotICAgIGRlZiByZXNldF9tb2Nr
KHNlbGYpOg0KLSAgICAgICAgc2VsZi5jYWxsZWQgPSBGYWxzZQ0KLSAgICAgICAgc2VsZi5jYWxs
X2FyZ3MgPSBOb25lDQotICAgICAgICBzZWxmLmNhbGxfY291bnQgPSAwDQotICAgICAgICBzZWxm
LmNhbGxfYXJnc19saXN0ID0gW10NCi0gICAgICAgIHNlbGYubWV0aG9kX2NhbGxzID0gW10NCi0g
ICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLl9jaGlsZHJlbi5pdGVydmFsdWVzKCk6DQotICAgICAg
ICAgICAgY2hpbGQucmVzZXRfbW9jaygpDQotICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYuX3Jl
dHVybl92YWx1ZSwgTW9jayk6DQotICAgICAgICAgICAgc2VsZi5fcmV0dXJuX3ZhbHVlLnJlc2V0
X21vY2soKQ0KLSAgICAgICAgDQotICAgIA0KLSAgICBkZWYgX19nZXRfcmV0dXJuX3ZhbHVlKHNl
bGYpOg0KLSAgICAgICAgaWYgc2VsZi5fcmV0dXJuX3ZhbHVlIGlzIERFRkFVTFQ6DQotICAgICAg
ICAgICAgc2VsZi5fcmV0dXJuX3ZhbHVlID0gTW9jaygpDQotICAgICAgICByZXR1cm4gc2VsZi5f
cmV0dXJuX3ZhbHVlDQotICAgIA0KLSAgICBkZWYgX19zZXRfcmV0dXJuX3ZhbHVlKHNlbGYsIHZh
bHVlKToNCi0gICAgICAgIHNlbGYuX3JldHVybl92YWx1ZSA9IHZhbHVlDQotICAgICAgICANCi0g
ICAgcmV0dXJuX3ZhbHVlID0gcHJvcGVydHkoX19nZXRfcmV0dXJuX3ZhbHVlLCBfX3NldF9yZXR1
cm5fdmFsdWUpDQotDQotDQotICAgIGRlZiBfX2NhbGxfXyhzZWxmLCAqYXJncywgKiprd2FyZ3Mp
Og0KLSAgICAgICAgc2VsZi5jYWxsZWQgPSBUcnVlDQotICAgICAgICBzZWxmLmNhbGxfY291bnQg
Kz0gMQ0KLSAgICAgICAgc2VsZi5jYWxsX2FyZ3MgPSAoYXJncywga3dhcmdzKQ0KLSAgICAgICAg
c2VsZi5jYWxsX2FyZ3NfbGlzdC5hcHBlbmQoKGFyZ3MsIGt3YXJncykpDQotICAgICAgICANCi0g
ICAgICAgIHBhcmVudCA9IHNlbGYuX3BhcmVudA0KLSAgICAgICAgbmFtZSA9IHNlbGYuX25hbWUN
Ci0gICAgICAgIHdoaWxlIHBhcmVudCBpcyBub3QgTm9uZToNCi0gICAgICAgICAgICBwYXJlbnQu
bWV0aG9kX2NhbGxzLmFwcGVuZCgobmFtZSwgYXJncywga3dhcmdzKSkNCi0gICAgICAgICAgICBp
ZiBwYXJlbnQuX3BhcmVudCBpcyBOb25lOg0KLSAgICAgICAgICAgICAgICBicmVhaw0KLSAgICAg
ICAgICAgIG5hbWUgPSBwYXJlbnQuX25hbWUgKyAnLicgKyBuYW1lDQotICAgICAgICAgICAgcGFy
ZW50ID0gcGFyZW50Ll9wYXJlbnQNCi0gICAgICAgIA0KLSAgICAgICAgcmV0X3ZhbCA9IERFRkFV
TFQNCi0gICAgICAgIGlmIHNlbGYuc2lkZV9lZmZlY3QgaXMgbm90IE5vbmU6DQotICAgICAgICAg
ICAgaWYgKGlzaW5zdGFuY2Uoc2VsZi5zaWRlX2VmZmVjdCwgRXhjZXB0aW9uKSBvciANCi0gICAg
ICAgICAgICAgICAgaXNpbnN0YW5jZShzZWxmLnNpZGVfZWZmZWN0LCAodHlwZSwgQ2xhc3NUeXBl
KSkgYW5kDQotICAgICAgICAgICAgICAgIGlzc3ViY2xhc3Moc2VsZi5zaWRlX2VmZmVjdCwgRXhj
ZXB0aW9uKSk6DQotICAgICAgICAgICAgICAgIHJhaXNlIHNlbGYuc2lkZV9lZmZlY3QNCi0gICAg
ICAgICAgICANCi0gICAgICAgICAgICByZXRfdmFsID0gc2VsZi5zaWRlX2VmZmVjdCgqYXJncywg
Kiprd2FyZ3MpDQotICAgICAgICAgICAgaWYgcmV0X3ZhbCBpcyBERUZBVUxUOg0KLSAgICAgICAg
ICAgICAgICByZXRfdmFsID0gc2VsZi5yZXR1cm5fdmFsdWUNCi0gICAgICAgIA0KLSAgICAgICAg
aWYgc2VsZi5fd3JhcHMgaXMgbm90IE5vbmUgYW5kIHNlbGYuX3JldHVybl92YWx1ZSBpcyBERUZB
VUxUOg0KLSAgICAgICAgICAgIHJldHVybiBzZWxmLl93cmFwcygqYXJncywgKiprd2FyZ3MpDQot
ICAgICAgICBpZiByZXRfdmFsIGlzIERFRkFVTFQ6DQotICAgICAgICAgICAgcmV0X3ZhbCA9IHNl
bGYucmV0dXJuX3ZhbHVlDQotICAgICAgICByZXR1cm4gcmV0X3ZhbA0KLSAgICANCi0gICAgDQot
ICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToNCi0gICAgICAgIGlmIHNlbGYuX21ldGhv
ZHMgaXMgbm90IE5vbmU6DQotICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4gc2VsZi5fbWV0aG9k
czoNCi0gICAgICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoIk1vY2sgb2JqZWN0IGhh
cyBubyBhdHRyaWJ1dGUgJyVzJyIgJSBuYW1lKQ0KLSAgICAgICAgZWxpZiBfaXNfbWFnaWMobmFt
ZSk6DQotICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IobmFtZSkNCi0gICAgICAgIA0K
LSAgICAgICAgaWYgbmFtZSBub3QgaW4gc2VsZi5fY2hpbGRyZW46DQotICAgICAgICAgICAgd3Jh
cHMgPSBOb25lDQotICAgICAgICAgICAgaWYgc2VsZi5fd3JhcHMgaXMgbm90IE5vbmU6DQotICAg
ICAgICAgICAgICAgIHdyYXBzID0gZ2V0YXR0cihzZWxmLl93cmFwcywgbmFtZSkNCi0gICAgICAg
ICAgICBzZWxmLl9jaGlsZHJlbltuYW1lXSA9IE1vY2socGFyZW50PXNlbGYsIG5hbWU9bmFtZSwg
d3JhcHM9d3JhcHMpDQotICAgICAgICAgICAgDQotICAgICAgICByZXR1cm4gc2VsZi5fY2hpbGRy
ZW5bbmFtZV0NCi0gICAgDQotICAgIA0KLSAgICBkZWYgYXNzZXJ0X2NhbGxlZF93aXRoKHNlbGYs
ICphcmdzLCAqKmt3YXJncyk6DQotICAgICAgICBhc3NlcnQgc2VsZi5jYWxsX2FyZ3MgPT0gKGFy
Z3MsIGt3YXJncyksICdFeHBlY3RlZDogJXNcbkNhbGxlZCB3aXRoOiAlcycgJSAoKGFyZ3MsIGt3
YXJncyksIHNlbGYuY2FsbF9hcmdzKQ0KLSAgICAgICAgDQotDQotZGVmIF9kb3RfbG9va3VwKHRo
aW5nLCBjb21wLCBpbXBvcnRfcGF0aCk6DQotICAgIHRyeToNCi0gICAgICAgIHJldHVybiBnZXRh
dHRyKHRoaW5nLCBjb21wKQ0KLSAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6DQotICAgICAgICBf
X2ltcG9ydF9fKGltcG9ydF9wYXRoKQ0KLSAgICAgICAgcmV0dXJuIGdldGF0dHIodGhpbmcsIGNv
bXApDQotDQotDQotZGVmIF9pbXBvcnRlcih0YXJnZXQpOg0KLSAgICBjb21wb25lbnRzID0gdGFy
Z2V0LnNwbGl0KCcuJykNCi0gICAgaW1wb3J0X3BhdGggPSBjb21wb25lbnRzLnBvcCgwKQ0KLSAg
ICB0aGluZyA9IF9faW1wb3J0X18oaW1wb3J0X3BhdGgpDQotDQotICAgIGZvciBjb21wIGluIGNv
bXBvbmVudHM6DQotICAgICAgICBpbXBvcnRfcGF0aCArPSAiLiVzIiAlIGNvbXANCi0gICAgICAg
IHRoaW5nID0gX2RvdF9sb29rdXAodGhpbmcsIGNvbXAsIGltcG9ydF9wYXRoKQ0KLSAgICByZXR1
cm4gdGhpbmcNCi0NCi0NCi1jbGFzcyBfcGF0Y2gob2JqZWN0KToNCi0gICAgZGVmIF9faW5pdF9f
KHNlbGYsIHRhcmdldCwgYXR0cmlidXRlLCBuZXcsIHNwZWMsIGNyZWF0ZSk6DQotICAgICAgICBz
ZWxmLnRhcmdldCA9IHRhcmdldA0KLSAgICAgICAgc2VsZi5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGUN
Ci0gICAgICAgIHNlbGYubmV3ID0gbmV3DQotICAgICAgICBzZWxmLnNwZWMgPSBzcGVjDQotICAg
ICAgICBzZWxmLmNyZWF0ZSA9IGNyZWF0ZQ0KLSAgICAgICAgc2VsZi5oYXNfbG9jYWwgPSBGYWxz
ZQ0KLQ0KLQ0KLSAgICBkZWYgX19jYWxsX18oc2VsZiwgZnVuYyk6DQotICAgICAgICBpZiBoYXNh
dHRyKGZ1bmMsICdwYXRjaGluZ3MnKToNCi0gICAgICAgICAgICBmdW5jLnBhdGNoaW5ncy5hcHBl
bmQoc2VsZikNCi0gICAgICAgICAgICByZXR1cm4gZnVuYw0KLQ0KLSAgICAgICAgZGVmIHBhdGNo
ZWQoKmFyZ3MsICoqa2V5d2FyZ3MpOg0KLSAgICAgICAgICAgICMgZG9uJ3QgdXNlIGEgd2l0aCBo
ZXJlIChiYWNrd2FyZHMgY29tcGF0YWJpbGl0eSB3aXRoIDIuNSkNCi0gICAgICAgICAgICBleHRy
YV9hcmdzID0gW10NCi0gICAgICAgICAgICBmb3IgcGF0Y2hpbmcgaW4gcGF0Y2hlZC5wYXRjaGlu
Z3M6DQotICAgICAgICAgICAgICAgIGFyZyA9IHBhdGNoaW5nLl9fZW50ZXJfXygpDQotICAgICAg
ICAgICAgICAgIGlmIHBhdGNoaW5nLm5ldyBpcyBERUZBVUxUOg0KLSAgICAgICAgICAgICAgICAg
ICAgZXh0cmFfYXJncy5hcHBlbmQoYXJnKQ0KLSAgICAgICAgICAgIGFyZ3MgKz0gdHVwbGUoZXh0
cmFfYXJncykNCi0gICAgICAgICAgICB0cnk6DQotICAgICAgICAgICAgICAgIHJldHVybiBmdW5j
KCphcmdzLCAqKmtleXdhcmdzKQ0KLSAgICAgICAgICAgIGZpbmFsbHk6DQotICAgICAgICAgICAg
ICAgIGZvciBwYXRjaGluZyBpbiBnZXRhdHRyKHBhdGNoZWQsICdwYXRjaGluZ3MnLCBbXSk6DQot
ICAgICAgICAgICAgICAgICAgICBwYXRjaGluZy5fX2V4aXRfXygpDQotDQotICAgICAgICBwYXRj
aGVkLnBhdGNoaW5ncyA9IFtzZWxmXQ0KLSAgICAgICAgcGF0Y2hlZC5fX25hbWVfXyA9IGZ1bmMu
X19uYW1lX18gDQotICAgICAgICBwYXRjaGVkLmNvbXBhdF9jb19maXJzdGxpbmVubyA9IGdldGF0
dHIoZnVuYywgImNvbXBhdF9jb19maXJzdGxpbmVubyIsIA0KLSAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMuZnVuY19jb2RlLmNvX2ZpcnN0bGluZW5v
KQ0KLSAgICAgICAgcmV0dXJuIHBhdGNoZWQNCi0NCi0NCi0gICAgZGVmIGdldF9vcmlnaW5hbChz
ZWxmKToNCi0gICAgICAgIHRhcmdldCA9IHNlbGYudGFyZ2V0DQotICAgICAgICBuYW1lID0gc2Vs
Zi5hdHRyaWJ1dGUNCi0gICAgICAgIGNyZWF0ZSA9IHNlbGYuY3JlYXRlDQotICAgICAgICANCi0g
ICAgICAgIG9yaWdpbmFsID0gREVGQVVMVA0KLSAgICAgICAgaWYgX2hhc19sb2NhbF9hdHRyKHRh
cmdldCwgbmFtZSk6DQotICAgICAgICAgICAgdHJ5Og0KLSAgICAgICAgICAgICAgICBvcmlnaW5h
bCA9IHRhcmdldC5fX2RpY3RfX1tuYW1lXQ0KLSAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVF
cnJvcjoNCi0gICAgICAgICAgICAgICAgIyBmb3IgaW5zdGFuY2VzIG9mIGNsYXNzZXMgd2l0aCBz
bG90cywgdGhleSBoYXZlIG5vIF9fZGljdF9fDQotICAgICAgICAgICAgICAgIG9yaWdpbmFsID0g
Z2V0YXR0cih0YXJnZXQsIG5hbWUpDQotICAgICAgICBlbGlmIG5vdCBjcmVhdGUgYW5kIG5vdCBo
YXNhdHRyKHRhcmdldCwgbmFtZSk6DQotICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3Io
IiVzIGRvZXMgbm90IGhhdmUgdGhlIGF0dHJpYnV0ZSAlciIgJSAodGFyZ2V0LCBuYW1lKSkNCi0g
ICAgICAgIHJldHVybiBvcmlnaW5hbA0KLQ0KLSAgICANCi0gICAgZGVmIF9fZW50ZXJfXyhzZWxm
KToNCi0gICAgICAgIG5ldywgc3BlYywgPSBzZWxmLm5ldywgc2VsZi5zcGVjDQotICAgICAgICBv
cmlnaW5hbCA9IHNlbGYuZ2V0X29yaWdpbmFsKCkNCi0gICAgICAgIGlmIG5ldyBpcyBERUZBVUxU
Og0KLSAgICAgICAgICAgICMgWFhYWCB3aGF0IGlmIG9yaWdpbmFsIGlzIERFRkFVTFQgLSBzaG91
bGRuJ3QgdXNlIGl0IGFzIGEgc3BlYw0KLSAgICAgICAgICAgIGluaGVyaXQgPSBGYWxzZQ0KLSAg
ICAgICAgICAgIGlmIHNwZWMgPT0gVHJ1ZToNCi0gICAgICAgICAgICAgICAgIyBzZXQgc3BlYyB0
byB0aGUgb2JqZWN0IHdlIGFyZSByZXBsYWNpbmcNCi0gICAgICAgICAgICAgICAgc3BlYyA9IG9y
aWdpbmFsDQotICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc3BlYywgKHR5cGUsIENsYXNz
VHlwZSkpOg0KLSAgICAgICAgICAgICAgICAgICAgaW5oZXJpdCA9IFRydWUNCi0gICAgICAgICAg
ICBuZXcgPSBNb2NrKHNwZWM9c3BlYykNCi0gICAgICAgICAgICBpZiBpbmhlcml0Og0KLSAgICAg
ICAgICAgICAgICBuZXcucmV0dXJuX3ZhbHVlID0gTW9jayhzcGVjPXNwZWMpDQotICAgICAgICBz
ZWxmLnRlbXBfb3JpZ2luYWwgPSBvcmlnaW5hbA0KLSAgICAgICAgc2V0YXR0cihzZWxmLnRhcmdl
dCwgc2VsZi5hdHRyaWJ1dGUsIG5ldykNCi0gICAgICAgIHJldHVybiBuZXcNCi0NCi0NCi0gICAg
ZGVmIF9fZXhpdF9fKHNlbGYsICpfKToNCi0gICAgICAgIGlmIHNlbGYudGVtcF9vcmlnaW5hbCBp
cyBub3QgREVGQVVMVDoNCi0gICAgICAgICAgICBzZXRhdHRyKHNlbGYudGFyZ2V0LCBzZWxmLmF0
dHJpYnV0ZSwgc2VsZi50ZW1wX29yaWdpbmFsKQ0KLSAgICAgICAgZWxzZToNCi0gICAgICAgICAg
ICBkZWxhdHRyKHNlbGYudGFyZ2V0LCBzZWxmLmF0dHJpYnV0ZSkNCi0gICAgICAgIGRlbCBzZWxm
LnRlbXBfb3JpZ2luYWwNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgDQotZGVmIHBh
dGNoX29iamVjdCh0YXJnZXQsIGF0dHJpYnV0ZSwgbmV3PURFRkFVTFQsIHNwZWM9Tm9uZSwgY3Jl
YXRlPUZhbHNlKToNCi0gICAgcmV0dXJuIF9wYXRjaCh0YXJnZXQsIGF0dHJpYnV0ZSwgbmV3LCBz
cGVjLCBjcmVhdGUpDQotDQotDQotZGVmIHBhdGNoKHRhcmdldCwgbmV3PURFRkFVTFQsIHNwZWM9
Tm9uZSwgY3JlYXRlPUZhbHNlKToNCi0gICAgdHJ5Og0KLSAgICAgICAgdGFyZ2V0LCBhdHRyaWJ1
dGUgPSB0YXJnZXQucnNwbGl0KCcuJywgMSkgICAgDQotICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBW
YWx1ZUVycm9yKToNCi0gICAgICAgIHJhaXNlIFR5cGVFcnJvcigiTmVlZCBhIHZhbGlkIHRhcmdl
dCB0byBwYXRjaC4gWW91IHN1cHBsaWVkOiAlciIgJSAodGFyZ2V0LCkpDQotICAgIHRhcmdldCA9
IF9pbXBvcnRlcih0YXJnZXQpDQotICAgIHJldHVybiBfcGF0Y2godGFyZ2V0LCBhdHRyaWJ1dGUs
IG5ldywgc3BlYywgY3JlYXRlKQ0KLQ0KLQ0KLQ0KLWRlZiBfaGFzX2xvY2FsX2F0dHIob2JqLCBu
YW1lKToNCi0gICAgdHJ5Og0KLSAgICAgICAgcmV0dXJuIG5hbWUgaW4gdmFycyhvYmopDQotICAg
IGV4Y2VwdCBUeXBlRXJyb3I6DQotICAgICAgICAjIG9iamVjdHMgd2l0aG91dCBhIF9fZGljdF9f
DQotICAgICAgICByZXR1cm4gaGFzYXR0cihvYmosIG5hbWUpDQorIyBtb2NrLnB5CisjIFRlc3Qg
dG9vbHMgZm9yIG1vY2tpbmcgYW5kIHBhdGNoaW5nLgorIyBDb3B5cmlnaHQgKEMpIDIwMDctMjAw
OSBNaWNoYWVsIEZvb3JkCisjIEUtbWFpbDogZnV6enltYW4gQVQgdm9pZHNwYWNlIERPVCBvcmcg
RE9UIHVrCisKKyMgbW9jayAwLjYuMAorIyBodHRwOi8vd3d3LnZvaWRzcGFjZS5vcmcudWsvcHl0
aG9uL21vY2svCisKKyMgUmVsZWFzZWQgc3ViamVjdCB0byB0aGUgQlNEIExpY2Vuc2UKKyMgUGxl
YXNlIHNlZSBodHRwOi8vd3d3LnZvaWRzcGFjZS5vcmcudWsvcHl0aG9uL2xpY2Vuc2Uuc2h0bWwK
KworIyAyMDA5LTExLTI1OiBMaWNlbmNlIGRvd25sb2FkZWQgZnJvbSBhYm92ZSBVUkwuCisjIEJF
R0lOIERPV05MT0FERUQgTElDRU5TRQorIworIyBDb3B5cmlnaHQgKGMpIDIwMDMtMjAwOSwgTWlj
aGFlbCBGb29yZAorIyBBbGwgcmlnaHRzIHJlc2VydmVkLgorIyBFLW1haWwgOiBmdXp6eW1hbiBB
VCB2b2lkc3BhY2UgRE9UIG9yZyBET1QgdWsKKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBh
cmUKKyMgbWV0OgorIworIworIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjCisjICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUK
KyMgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcKKyMgICAgICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisjICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyMKKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBNaWNoYWVsIEZvb3JkIG5vciB0aGUg
bmFtZSBvZiBWb2lkc3BhY2UKKyMgICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9t
b3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisjICAgICAgIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorIworIyBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisjICJB
UyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorIyBPV05FUiBPUiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyMg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisjIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyMg
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisjCisjIEVORCBET1dOTE9BREVEIExJQ0VOU0UK
KworIyBTY3JpcHRzIG1haW50YWluZWQgYXQgaHR0cDovL3d3dy52b2lkc3BhY2Uub3JnLnVrL3B5
dGhvbi9pbmRleC5zaHRtbAorIyBDb21tZW50cywgc3VnZ2VzdGlvbnMgYW5kIGJ1ZyByZXBvcnRz
IHdlbGNvbWUuCisKKworX19hbGxfXyA9ICgKKyAgICAnTW9jaycsCisgICAgJ3BhdGNoJywKKyAg
ICAncGF0Y2hfb2JqZWN0JywKKyAgICAnc2VudGluZWwnLAorICAgICdERUZBVUxUJworKQorCitf
X3ZlcnNpb25fXyA9ICcwLjYuMCcKKworY2xhc3MgU2VudGluZWxPYmplY3Qob2JqZWN0KToKKyAg
ICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKwor
ICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuICc8U2VudGluZWxPYmplY3Qg
IiVzIj4nICUgc2VsZi5uYW1lCisKKworY2xhc3MgU2VudGluZWwob2JqZWN0KToKKyAgICBkZWYg
X19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX3NlbnRpbmVscyA9IHt9CisKKyAgICBkZWYg
X19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9zZW50aW5lbHMu
c2V0ZGVmYXVsdChuYW1lLCBTZW50aW5lbE9iamVjdChuYW1lKSkKKworCitzZW50aW5lbCA9IFNl
bnRpbmVsKCkKKworREVGQVVMVCA9IHNlbnRpbmVsLkRFRkFVTFQKKworY2xhc3MgT2xkU3R5bGVD
bGFzczoKKyAgICBwYXNzCitDbGFzc1R5cGUgPSB0eXBlKE9sZFN0eWxlQ2xhc3MpCisKK2RlZiBf
aXNfbWFnaWMobmFtZSk6CisgICAgcmV0dXJuICdfXyVzX18nICUgbmFtZVsyOi0yXSA9PSBuYW1l
CisKK2RlZiBfY29weSh2YWx1ZSk6CisgICAgaWYgdHlwZSh2YWx1ZSkgaW4gKGRpY3QsIGxpc3Qs
IHR1cGxlLCBzZXQpOgorICAgICAgICByZXR1cm4gdHlwZSh2YWx1ZSkodmFsdWUpCisgICAgcmV0
dXJuIHZhbHVlCisKKworY2xhc3MgTW9jayhvYmplY3QpOgorCisgICAgZGVmIF9faW5pdF9fKHNl
bGYsIHNwZWM9Tm9uZSwgc2lkZV9lZmZlY3Q9Tm9uZSwgcmV0dXJuX3ZhbHVlPURFRkFVTFQsCisg
ICAgICAgICAgICAgICAgIG5hbWU9Tm9uZSwgcGFyZW50PU5vbmUsIHdyYXBzPU5vbmUpOgorICAg
ICAgICBzZWxmLl9wYXJlbnQgPSBwYXJlbnQKKyAgICAgICAgc2VsZi5fbmFtZSA9IG5hbWUKKyAg
ICAgICAgaWYgc3BlYyBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2Uoc3BlYywgbGlzdCk6
CisgICAgICAgICAgICBzcGVjID0gW21lbWJlciBmb3IgbWVtYmVyIGluIGRpcihzcGVjKSBpZiBu
b3QgX2lzX21hZ2ljKG1lbWJlcildCisKKyAgICAgICAgc2VsZi5fbWV0aG9kcyA9IHNwZWMKKyAg
ICAgICAgc2VsZi5fY2hpbGRyZW4gPSB7fQorICAgICAgICBzZWxmLl9yZXR1cm5fdmFsdWUgPSBy
ZXR1cm5fdmFsdWUKKyAgICAgICAgc2VsZi5zaWRlX2VmZmVjdCA9IHNpZGVfZWZmZWN0CisgICAg
ICAgIHNlbGYuX3dyYXBzID0gd3JhcHMKKworICAgICAgICBzZWxmLnJlc2V0X21vY2soKQorCisK
KyAgICBkZWYgcmVzZXRfbW9jayhzZWxmKToKKyAgICAgICAgc2VsZi5jYWxsZWQgPSBGYWxzZQor
ICAgICAgICBzZWxmLmNhbGxfYXJncyA9IE5vbmUKKyAgICAgICAgc2VsZi5jYWxsX2NvdW50ID0g
MAorICAgICAgICBzZWxmLmNhbGxfYXJnc19saXN0ID0gW10KKyAgICAgICAgc2VsZi5tZXRob2Rf
Y2FsbHMgPSBbXQorICAgICAgICBmb3IgY2hpbGQgaW4gc2VsZi5fY2hpbGRyZW4uaXRlcnZhbHVl
cygpOgorICAgICAgICAgICAgY2hpbGQucmVzZXRfbW9jaygpCisgICAgICAgIGlmIGlzaW5zdGFu
Y2Uoc2VsZi5fcmV0dXJuX3ZhbHVlLCBNb2NrKToKKyAgICAgICAgICAgIHNlbGYuX3JldHVybl92
YWx1ZS5yZXNldF9tb2NrKCkKKworCisgICAgZGVmIF9fZ2V0X3JldHVybl92YWx1ZShzZWxmKToK
KyAgICAgICAgaWYgc2VsZi5fcmV0dXJuX3ZhbHVlIGlzIERFRkFVTFQ6CisgICAgICAgICAgICBz
ZWxmLl9yZXR1cm5fdmFsdWUgPSBNb2NrKCkKKyAgICAgICAgcmV0dXJuIHNlbGYuX3JldHVybl92
YWx1ZQorCisgICAgZGVmIF9fc2V0X3JldHVybl92YWx1ZShzZWxmLCB2YWx1ZSk6CisgICAgICAg
IHNlbGYuX3JldHVybl92YWx1ZSA9IHZhbHVlCisKKyAgICByZXR1cm5fdmFsdWUgPSBwcm9wZXJ0
eShfX2dldF9yZXR1cm5fdmFsdWUsIF9fc2V0X3JldHVybl92YWx1ZSkKKworCisgICAgZGVmIF9f
Y2FsbF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIHNlbGYuY2FsbGVkID0gVHJ1
ZQorICAgICAgICBzZWxmLmNhbGxfY291bnQgKz0gMQorICAgICAgICBzZWxmLmNhbGxfYXJncyA9
IChhcmdzLCBrd2FyZ3MpCisgICAgICAgIHNlbGYuY2FsbF9hcmdzX2xpc3QuYXBwZW5kKChhcmdz
LCBrd2FyZ3MpKQorCisgICAgICAgIHBhcmVudCA9IHNlbGYuX3BhcmVudAorICAgICAgICBuYW1l
ID0gc2VsZi5fbmFtZQorICAgICAgICB3aGlsZSBwYXJlbnQgaXMgbm90IE5vbmU6CisgICAgICAg
ICAgICBwYXJlbnQubWV0aG9kX2NhbGxzLmFwcGVuZCgobmFtZSwgYXJncywga3dhcmdzKSkKKyAg
ICAgICAgICAgIGlmIHBhcmVudC5fcGFyZW50IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgYnJl
YWsKKyAgICAgICAgICAgIG5hbWUgPSBwYXJlbnQuX25hbWUgKyAnLicgKyBuYW1lCisgICAgICAg
ICAgICBwYXJlbnQgPSBwYXJlbnQuX3BhcmVudAorCisgICAgICAgIHJldF92YWwgPSBERUZBVUxU
CisgICAgICAgIGlmIHNlbGYuc2lkZV9lZmZlY3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBp
ZiAoaXNpbnN0YW5jZShzZWxmLnNpZGVfZWZmZWN0LCBFeGNlcHRpb24pIG9yCisgICAgICAgICAg
ICAgICAgaXNpbnN0YW5jZShzZWxmLnNpZGVfZWZmZWN0LCAodHlwZSwgQ2xhc3NUeXBlKSkgYW5k
CisgICAgICAgICAgICAgICAgaXNzdWJjbGFzcyhzZWxmLnNpZGVfZWZmZWN0LCBFeGNlcHRpb24p
KToKKyAgICAgICAgICAgICAgICByYWlzZSBzZWxmLnNpZGVfZWZmZWN0CisKKyAgICAgICAgICAg
IHJldF92YWwgPSBzZWxmLnNpZGVfZWZmZWN0KCphcmdzLCAqKmt3YXJncykKKyAgICAgICAgICAg
IGlmIHJldF92YWwgaXMgREVGQVVMVDoKKyAgICAgICAgICAgICAgICByZXRfdmFsID0gc2VsZi5y
ZXR1cm5fdmFsdWUKKworICAgICAgICBpZiBzZWxmLl93cmFwcyBpcyBub3QgTm9uZSBhbmQgc2Vs
Zi5fcmV0dXJuX3ZhbHVlIGlzIERFRkFVTFQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fd3Jh
cHMoKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBpZiByZXRfdmFsIGlzIERFRkFVTFQ6CisgICAg
ICAgICAgICByZXRfdmFsID0gc2VsZi5yZXR1cm5fdmFsdWUKKyAgICAgICAgcmV0dXJuIHJldF92
YWwKKworCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIG5hbWUpOgorICAgICAgICBpZiBzZWxm
Ll9tZXRob2RzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbmFtZSBub3QgaW4gc2VsZi5f
bWV0aG9kczoKKyAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigiTW9jayBvYmpl
Y3QgaGFzIG5vIGF0dHJpYnV0ZSAnJXMnIiAlIG5hbWUpCisgICAgICAgIGVsaWYgX2lzX21hZ2lj
KG5hbWUpOgorICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IobmFtZSkKKworICAgICAg
ICBpZiBuYW1lIG5vdCBpbiBzZWxmLl9jaGlsZHJlbjoKKyAgICAgICAgICAgIHdyYXBzID0gTm9u
ZQorICAgICAgICAgICAgaWYgc2VsZi5fd3JhcHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAg
ICAgd3JhcHMgPSBnZXRhdHRyKHNlbGYuX3dyYXBzLCBuYW1lKQorICAgICAgICAgICAgc2VsZi5f
Y2hpbGRyZW5bbmFtZV0gPSBNb2NrKHBhcmVudD1zZWxmLCBuYW1lPW5hbWUsIHdyYXBzPXdyYXBz
KQorCisgICAgICAgIHJldHVybiBzZWxmLl9jaGlsZHJlbltuYW1lXQorCisKKyAgICBkZWYgYXNz
ZXJ0X2NhbGxlZF93aXRoKHNlbGYsICphcmdzLCAqKmt3YXJncyk6CisgICAgICAgIGFzc2VydCBz
ZWxmLmNhbGxfYXJncyA9PSAoYXJncywga3dhcmdzKSwgJ0V4cGVjdGVkOiAlc1xuQ2FsbGVkIHdp
dGg6ICVzJyAlICgoYXJncywga3dhcmdzKSwgc2VsZi5jYWxsX2FyZ3MpCisKKworZGVmIF9kb3Rf
bG9va3VwKHRoaW5nLCBjb21wLCBpbXBvcnRfcGF0aCk6CisgICAgdHJ5OgorICAgICAgICByZXR1
cm4gZ2V0YXR0cih0aGluZywgY29tcCkKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAg
ICAgIF9faW1wb3J0X18oaW1wb3J0X3BhdGgpCisgICAgICAgIHJldHVybiBnZXRhdHRyKHRoaW5n
LCBjb21wKQorCisKK2RlZiBfaW1wb3J0ZXIodGFyZ2V0KToKKyAgICBjb21wb25lbnRzID0gdGFy
Z2V0LnNwbGl0KCcuJykKKyAgICBpbXBvcnRfcGF0aCA9IGNvbXBvbmVudHMucG9wKDApCisgICAg
dGhpbmcgPSBfX2ltcG9ydF9fKGltcG9ydF9wYXRoKQorCisgICAgZm9yIGNvbXAgaW4gY29tcG9u
ZW50czoKKyAgICAgICAgaW1wb3J0X3BhdGggKz0gIi4lcyIgJSBjb21wCisgICAgICAgIHRoaW5n
ID0gX2RvdF9sb29rdXAodGhpbmcsIGNvbXAsIGltcG9ydF9wYXRoKQorICAgIHJldHVybiB0aGlu
ZworCisKK2NsYXNzIF9wYXRjaChvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXJn
ZXQsIGF0dHJpYnV0ZSwgbmV3LCBzcGVjLCBjcmVhdGUpOgorICAgICAgICBzZWxmLnRhcmdldCA9
IHRhcmdldAorICAgICAgICBzZWxmLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZQorICAgICAgICBzZWxm
Lm5ldyA9IG5ldworICAgICAgICBzZWxmLnNwZWMgPSBzcGVjCisgICAgICAgIHNlbGYuY3JlYXRl
ID0gY3JlYXRlCisgICAgICAgIHNlbGYuaGFzX2xvY2FsID0gRmFsc2UKKworCisgICAgZGVmIF9f
Y2FsbF9fKHNlbGYsIGZ1bmMpOgorICAgICAgICBpZiBoYXNhdHRyKGZ1bmMsICdwYXRjaGluZ3Mn
KToKKyAgICAgICAgICAgIGZ1bmMucGF0Y2hpbmdzLmFwcGVuZChzZWxmKQorICAgICAgICAgICAg
cmV0dXJuIGZ1bmMKKworICAgICAgICBkZWYgcGF0Y2hlZCgqYXJncywgKiprZXl3YXJncyk6Cisg
ICAgICAgICAgICAjIGRvbid0IHVzZSBhIHdpdGggaGVyZSAoYmFja3dhcmRzIGNvbXBhdGFiaWxp
dHkgd2l0aCAyLjUpCisgICAgICAgICAgICBleHRyYV9hcmdzID0gW10KKyAgICAgICAgICAgIGZv
ciBwYXRjaGluZyBpbiBwYXRjaGVkLnBhdGNoaW5nczoKKyAgICAgICAgICAgICAgICBhcmcgPSBw
YXRjaGluZy5fX2VudGVyX18oKQorICAgICAgICAgICAgICAgIGlmIHBhdGNoaW5nLm5ldyBpcyBE
RUZBVUxUOgorICAgICAgICAgICAgICAgICAgICBleHRyYV9hcmdzLmFwcGVuZChhcmcpCisgICAg
ICAgICAgICBhcmdzICs9IHR1cGxlKGV4dHJhX2FyZ3MpCisgICAgICAgICAgICB0cnk6CisgICAg
ICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKmFyZ3MsICoqa2V5d2FyZ3MpCisgICAgICAgICAgICBm
aW5hbGx5OgorICAgICAgICAgICAgICAgIGZvciBwYXRjaGluZyBpbiBnZXRhdHRyKHBhdGNoZWQs
ICdwYXRjaGluZ3MnLCBbXSk6CisgICAgICAgICAgICAgICAgICAgIHBhdGNoaW5nLl9fZXhpdF9f
KCkKKworICAgICAgICBwYXRjaGVkLnBhdGNoaW5ncyA9IFtzZWxmXQorICAgICAgICBwYXRjaGVk
Ll9fbmFtZV9fID0gZnVuYy5fX25hbWVfXworICAgICAgICBwYXRjaGVkLmNvbXBhdF9jb19maXJz
dGxpbmVubyA9IGdldGF0dHIoZnVuYywgImNvbXBhdF9jb19maXJzdGxpbmVubyIsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jLmZ1bmNfY29kZS5j
b19maXJzdGxpbmVubykKKyAgICAgICAgcmV0dXJuIHBhdGNoZWQKKworCisgICAgZGVmIGdldF9v
cmlnaW5hbChzZWxmKToKKyAgICAgICAgdGFyZ2V0ID0gc2VsZi50YXJnZXQKKyAgICAgICAgbmFt
ZSA9IHNlbGYuYXR0cmlidXRlCisgICAgICAgIGNyZWF0ZSA9IHNlbGYuY3JlYXRlCisKKyAgICAg
ICAgb3JpZ2luYWwgPSBERUZBVUxUCisgICAgICAgIGlmIF9oYXNfbG9jYWxfYXR0cih0YXJnZXQs
IG5hbWUpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9yaWdpbmFsID0gdGFy
Z2V0Ll9fZGljdF9fW25hbWVdCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Cisg
ICAgICAgICAgICAgICAgIyBmb3IgaW5zdGFuY2VzIG9mIGNsYXNzZXMgd2l0aCBzbG90cywgdGhl
eSBoYXZlIG5vIF9fZGljdF9fCisgICAgICAgICAgICAgICAgb3JpZ2luYWwgPSBnZXRhdHRyKHRh
cmdldCwgbmFtZSkKKyAgICAgICAgZWxpZiBub3QgY3JlYXRlIGFuZCBub3QgaGFzYXR0cih0YXJn
ZXQsIG5hbWUpOgorICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoIiVzIGRvZXMgbm90
IGhhdmUgdGhlIGF0dHJpYnV0ZSAlciIgJSAodGFyZ2V0LCBuYW1lKSkKKyAgICAgICAgcmV0dXJu
IG9yaWdpbmFsCisKKworICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgIG5ldywgc3Bl
YywgPSBzZWxmLm5ldywgc2VsZi5zcGVjCisgICAgICAgIG9yaWdpbmFsID0gc2VsZi5nZXRfb3Jp
Z2luYWwoKQorICAgICAgICBpZiBuZXcgaXMgREVGQVVMVDoKKyAgICAgICAgICAgICMgWFhYWCB3
aGF0IGlmIG9yaWdpbmFsIGlzIERFRkFVTFQgLSBzaG91bGRuJ3QgdXNlIGl0IGFzIGEgc3BlYwor
ICAgICAgICAgICAgaW5oZXJpdCA9IEZhbHNlCisgICAgICAgICAgICBpZiBzcGVjID09IFRydWU6
CisgICAgICAgICAgICAgICAgIyBzZXQgc3BlYyB0byB0aGUgb2JqZWN0IHdlIGFyZSByZXBsYWNp
bmcKKyAgICAgICAgICAgICAgICBzcGVjID0gb3JpZ2luYWwKKyAgICAgICAgICAgICAgICBpZiBp
c2luc3RhbmNlKHNwZWMsICh0eXBlLCBDbGFzc1R5cGUpKToKKyAgICAgICAgICAgICAgICAgICAg
aW5oZXJpdCA9IFRydWUKKyAgICAgICAgICAgIG5ldyA9IE1vY2soc3BlYz1zcGVjKQorICAgICAg
ICAgICAgaWYgaW5oZXJpdDoKKyAgICAgICAgICAgICAgICBuZXcucmV0dXJuX3ZhbHVlID0gTW9j
ayhzcGVjPXNwZWMpCisgICAgICAgIHNlbGYudGVtcF9vcmlnaW5hbCA9IG9yaWdpbmFsCisgICAg
ICAgIHNldGF0dHIoc2VsZi50YXJnZXQsIHNlbGYuYXR0cmlidXRlLCBuZXcpCisgICAgICAgIHJl
dHVybiBuZXcKKworCisgICAgZGVmIF9fZXhpdF9fKHNlbGYsICpfKToKKyAgICAgICAgaWYgc2Vs
Zi50ZW1wX29yaWdpbmFsIGlzIG5vdCBERUZBVUxUOgorICAgICAgICAgICAgc2V0YXR0cihzZWxm
LnRhcmdldCwgc2VsZi5hdHRyaWJ1dGUsIHNlbGYudGVtcF9vcmlnaW5hbCkKKyAgICAgICAgZWxz
ZToKKyAgICAgICAgICAgIGRlbGF0dHIoc2VsZi50YXJnZXQsIHNlbGYuYXR0cmlidXRlKQorICAg
ICAgICBkZWwgc2VsZi50ZW1wX29yaWdpbmFsCisKKworZGVmIHBhdGNoX29iamVjdCh0YXJnZXQs
IGF0dHJpYnV0ZSwgbmV3PURFRkFVTFQsIHNwZWM9Tm9uZSwgY3JlYXRlPUZhbHNlKToKKyAgICBy
ZXR1cm4gX3BhdGNoKHRhcmdldCwgYXR0cmlidXRlLCBuZXcsIHNwZWMsIGNyZWF0ZSkKKworCitk
ZWYgcGF0Y2godGFyZ2V0LCBuZXc9REVGQVVMVCwgc3BlYz1Ob25lLCBjcmVhdGU9RmFsc2UpOgor
ICAgIHRyeToKKyAgICAgICAgdGFyZ2V0LCBhdHRyaWJ1dGUgPSB0YXJnZXQucnNwbGl0KCcuJywg
MSkKKyAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgIHJhaXNlIFR5
cGVFcnJvcigiTmVlZCBhIHZhbGlkIHRhcmdldCB0byBwYXRjaC4gWW91IHN1cHBsaWVkOiAlciIg
JSAodGFyZ2V0LCkpCisgICAgdGFyZ2V0ID0gX2ltcG9ydGVyKHRhcmdldCkKKyAgICByZXR1cm4g
X3BhdGNoKHRhcmdldCwgYXR0cmlidXRlLCBuZXcsIHNwZWMsIGNyZWF0ZSkKKworCisKK2RlZiBf
aGFzX2xvY2FsX2F0dHIob2JqLCBuYW1lKToKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBuYW1l
IGluIHZhcnMob2JqKQorICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICMgb2JqZWN0cyB3
aXRob3V0IGEgX19kaWN0X18KKyAgICAgICAgcmV0dXJuIGhhc2F0dHIob2JqLCBuYW1lKQo=
</data>
<flag name="review"
          id="32640"
          type_id="1"
          status="-"
          setter="eric"
    />
    <flag name="commit-queue"
          id="32641"
          type_id="3"
          status="-"
          setter="cjerdonek"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>50148</attachid>
            <date>2010-03-05 19:34:15 -0800</date>
            <delta_ts>2010-03-13 02:05:42 -0800</delta_ts>
            <desc>Proposed patch 2</desc>
            <filename>_patch-35499-2.diff</filename>
            <type>text/plain</type>
            <size>57932</size>
            <attacher name="Chris Jerdonek">cjerdonek</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYktpdFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9D
aGFuZ2VMb2cJKHJldmlzaW9uIDU1NjA0KQorKysgV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCSh3b3Jr
aW5nIGNvcHkpCkBAIC0xLDMgKzEsNDcgQEAKKzIwMTAtMDItMjggIENocmlzIEplcmRvbmVrICA8
Y2plcmRvbmVrQHdlYmtpdC5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BT
ISkuCisKKyAgICAgICAgTW92ZWQgd2Via2l0cHkvbW9jay5weSBpbnRvIHdlYmtpdHB5L3RoaXJk
cGFydHkgc2luY2UgaXQgaXMKKyAgICAgICAgdGhpcmQtcGFydHkgY29kZS4KKworICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MzU0OTkKKworICAgICAgICBV
cGRhdGVkIHRoZSBpbXBvcnQgc3RhdGVtZW50IGluIGFsbCBvZiB0aGUgYmVsb3cgZXhjZXB0IHdo
ZXJlIG5vdGVkLgorCisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9idWd6aWxsYV91bml0dGVz
dC5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1hbmRzL2NvbW1hbmR0ZXN0LnB5
OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbWFuZHMvZG93bmxvYWRfdW5pdHRlc3Qu
cHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tYW5kcy9lYXJseV93YXJuaW5nX3N5
c3RlbV91bml0dGVzdC5weToKKyAgICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L2NvbW1hbmRzL3F1
ZXJpZXNfdW5pdHRlc3QucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tYW5kcy9x
dWV1ZXNfdW5pdHRlc3QucHk6CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jb21tYW5kcy9x
dWV1ZXN0ZXN0LnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbWFuZHMvdXBsb2Fk
LnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbWFuZHMvdXBsb2FkX3VuaXR0ZXN0
LnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvY29tbWFuZHNfcmVmZXJlbmNlcy5weTog
QWRkZWQuCisgICAgICAgICAgLSBBZGRlZCBhIGZpbGUgY29udGFpbmluZyBhbiBhYnNvbHV0ZSBp
bXBvcnQgb2YgTW9jayBzbyB0aGF0CisgICAgICAgICAgICB0aGUgaW1wb3J0cyBpbiB0aGUgY29t
bWFuZHMgZm9sZGVyIGNhbiBpbXBvcnQgZnJvbSB0aGlzIGZpbGUKKyAgICAgICAgICAgIChzaW1p
bGFyIHRvIHN0eWxlX3JlZmVyZW5jZXMucHkpLiAgVGhpcyBoZWxwcyBsaW1pdCB0aGUKKyAgICAg
ICAgICAgIG51bWJlciBvZiBhZmZlY3RlZCBmaWxlcyBpbiBmdXR1cmUgcmVmYWN0b3JpbmdzLgor
CisgICAgICAgICogU2NyaXB0cy93ZWJraXRweS9jcmVkZW50aWFsc191bml0dGVzdC5weToKKyAg
ICAgICAgKiBTY3JpcHRzL3dlYmtpdHB5L21vY2sucHk6IFJlbW92ZWQuCisgICAgICAgICAgLSBN
b3ZlZCB0byBTY3JpcHRzL3dlYmtpdHB5L3RoaXJkcGFydHkuCisKKyAgICAgICAgKiBTY3JpcHRz
L3dlYmtpdHB5L21vY2tfYnVnemlsbGF0b29sLnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0
cHkvcGF0Y2hjb2xsZWN0aW9uX3VuaXR0ZXN0LnB5OgorICAgICAgICAqIFNjcmlwdHMvd2Via2l0
cHkvc3RlcHMvY2xvc2VidWdmb3JsYW5kZGlmZl91bml0dGVzdC5weToKKyAgICAgICAgKiBTY3Jp
cHRzL3dlYmtpdHB5L3N0ZXBzL3N0ZXBzX3VuaXR0ZXN0LnB5OgorICAgICAgICAqIFNjcmlwdHMv
d2Via2l0cHkvc3RlcHMvdXBkYXRlY2hhbmdlbG9nc3dpdGhyZXZpZXdfdW5pdHRlc3RzLnB5Ogor
ICAgICAgICAqIFNjcmlwdHMvd2Via2l0cHkvc3RlcHNfcmVmZXJlbmNlcy5weTogQWRkZWQuCisg
ICAgICAgICAgLSBBZGRlZCBhIGZpbGUgY29udGFpbmluZyBhbiBhYnNvbHV0ZSBpbXBvcnQgb2Yg
TW9jayBzbyB0aGF0CisgICAgICAgICAgICB0aGUgaW1wb3J0cyBpbiB0aGUgc3RlcHMgZm9sZGVy
IGNhbiBpbXBvcnQgZnJvbSB0aGlzIGZpbGUKKyAgICAgICAgICAgIChzaW1pbGFyIHRvIHN0eWxl
X3JlZmVyZW5jZXMucHkpLiAgVGhpcyBoZWxwcyBsaW1pdCB0aGUKKyAgICAgICAgICAgIG51bWJl
ciBvZiBhZmZlY3RlZCBmaWxlcyBpbiBmdXR1cmUgcmVmYWN0b3JpbmdzLgorCisgICAgICAgICog
U2NyaXB0cy93ZWJraXRweS90aGlyZHBhcnR5L21vY2sucHk6IENvcGllZCBmcm9tIFdlYktpdFRv
b2xzL1NjcmlwdHMvd2Via2l0cHkvbW9jay5weS4KKyAgICAgICAgICAtIEFsc28gZWxpbWluYXRl
ZCB0cmFpbGluZyB3aGl0ZSBzcGFjZSBhbmQgY2FycmlhZ2UgcmV0dXJucy4KKwogMjAxMC0wMy0w
NSAgQ2hyaXMgSmVyZG9uZWsgIDxjamVyZG9uZWtAd2Via2l0Lm9yZz4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBFcmljIFNlaWRlbC4KSW5kZXg6IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkv
YnVnemlsbGFfdW5pdHRlc3QucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvU2NyaXB0cy93
ZWJraXRweS9idWd6aWxsYV91bml0dGVzdC5weQkocmV2aXNpb24gNTU2MDQpCisrKyBXZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L2J1Z3ppbGxhX3VuaXR0ZXN0LnB5CSh3b3JraW5nIGNvcHkp
CkBAIC0zMSw4ICszMSw3IEBAIGltcG9ydCB1bml0dGVzdAogZnJvbSB3ZWJraXRweS5jb21taXR0
ZXJzIGltcG9ydCBDb21taXR0ZXJMaXN0LCBSZXZpZXdlciwgQ29tbWl0dGVyCiBmcm9tIHdlYmtp
dHB5LmJ1Z3ppbGxhIGltcG9ydCBCdWd6aWxsYSwgQnVnemlsbGFRdWVyaWVzLCBwYXJzZV9idWdf
aWQsIENvbW1pdHRlclZhbGlkYXRvcgogZnJvbSB3ZWJraXRweS5vdXRwdXRjYXB0dXJlIGltcG9y
dCBPdXRwdXRDYXB0dXJlCi1mcm9tIHdlYmtpdHB5Lm1vY2sgaW1wb3J0IE1vY2sKLQorZnJvbSB3
ZWJraXRweS50aGlyZHBhcnR5Lm1vY2sgaW1wb3J0IE1vY2sKIGZyb20gd2Via2l0cHkudGhpcmRw
YXJ0eS5CZWF1dGlmdWxTb3VwIGltcG9ydCBCZWF1dGlmdWxTb3VwCiAKIApJbmRleDogV2ViS2l0
VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tYW5kc19yZWZlcmVuY2VzLnB5Cj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbWFuZHNfcmVmZXJlbmNlcy5weQko
cmV2aXNpb24gMCkKKysrIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbWFuZHNfcmVm
ZXJlbmNlcy5weQkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwyNSBAQAorIyBDb3B5cmlnaHQgKEMp
IDIwMTAgQ2hyaXMgSmVyZG9uZWsgKGNqZXJkb25la0B3ZWJraXQub3JnKQorIworIyBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAy
LiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMgICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRSSUJVVE9S
UyBgYEFTIElTJycgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisjIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUK
KyMgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJVFMgQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IKKyMgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorIyBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UgorIyBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUgorIyBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAorIyBPUiBUT1JU
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisiIiJDb250YWlucyBpbnRyYS1wYWNrYWdl
IHJlZmVyZW5jZXMgdXNlZCBieSB3ZWJraXRweS5jb21tYW5kcy4iIiIKKworZnJvbSB0aGlyZHBh
cnR5Lm1vY2sgaW1wb3J0IE1vY2sKSW5kZXg6IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkv
Y3JlZGVudGlhbHNfdW5pdHRlc3QucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvU2NyaXB0
cy93ZWJraXRweS9jcmVkZW50aWFsc191bml0dGVzdC5weQkocmV2aXNpb24gNTU2MDQpCisrKyBX
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NyZWRlbnRpYWxzX3VuaXR0ZXN0LnB5CSh3b3Jr
aW5nIGNvcHkpCkBAIC0zMiw3ICszMiw3IEBAIGltcG9ydCB1bml0dGVzdAogZnJvbSB3ZWJraXRw
eS5jcmVkZW50aWFscyBpbXBvcnQgQ3JlZGVudGlhbHMKIGZyb20gd2Via2l0cHkuZXhlY3V0aXZl
IGltcG9ydCBFeGVjdXRpdmUKIGZyb20gd2Via2l0cHkub3V0cHV0Y2FwdHVyZSBpbXBvcnQgT3V0
cHV0Q2FwdHVyZQotZnJvbSB3ZWJraXRweS5tb2NrIGltcG9ydCBNb2NrCitmcm9tIHdlYmtpdHB5
LnRoaXJkcGFydHkubW9jayBpbXBvcnQgTW9jawogCiBjbGFzcyBDcmVkZW50aWFsc1Rlc3QodW5p
dHRlc3QuVGVzdENhc2UpOgogICAgIGV4YW1wbGVfc2VjdXJpdHlfb3V0cHV0ID0gIiIia2V5Y2hh
aW46ICIvVXNlcnMvdGVzdC9MaWJyYXJ5L0tleWNoYWlucy9sb2dpbi5rZXljaGFpbiIKSW5kZXg6
IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbW9jay5weQo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJL
aXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L21vY2sucHkJKHJldmlzaW9uIDU1NjA0KQorKysgV2Vi
S2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9tb2NrLnB5CSh3b3JraW5nIGNvcHkpCkBAIC0xLDMw
OSArMCwwIEBACi0jIG1vY2sucHkNCi0jIFRlc3QgdG9vbHMgZm9yIG1vY2tpbmcgYW5kIHBhdGNo
aW5nLg0KLSMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgTWljaGFlbCBGb29yZA0KLSMgRS1tYWls
OiBmdXp6eW1hbiBBVCB2b2lkc3BhY2UgRE9UIG9yZyBET1QgdWsNCi0NCi0jIG1vY2sgMC42LjAN
Ci0jIGh0dHA6Ly93d3cudm9pZHNwYWNlLm9yZy51ay9weXRob24vbW9jay8NCi0NCi0jIFJlbGVh
c2VkIHN1YmplY3QgdG8gdGhlIEJTRCBMaWNlbnNlDQotIyBQbGVhc2Ugc2VlIGh0dHA6Ly93d3cu
dm9pZHNwYWNlLm9yZy51ay9weXRob24vbGljZW5zZS5zaHRtbA0KLQ0KLSMgMjAwOS0xMS0yNTog
TGljZW5jZSBkb3dubG9hZGVkIGZyb20gYWJvdmUgVVJMLg0KLSMgQkVHSU4gRE9XTkxPQURFRCBM
SUNFTlNFDQotIw0KLSMgQ29weXJpZ2h0IChjKSAyMDAzLTIwMDksIE1pY2hhZWwgRm9vcmQNCi0j
IEFsbCByaWdodHMgcmVzZXJ2ZWQuDQotIyBFLW1haWwgOiBmdXp6eW1hbiBBVCB2b2lkc3BhY2Ug
RE9UIG9yZyBET1QgdWsNCi0jIA0KLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0DQotIyBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlDQotIyBt
ZXQ6DQotIyANCi0jIA0KLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCi0jICAgICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCi0jIA0KLSMgICAg
ICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZQ0KLSMgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcNCi0jICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZA0KLSMgICAgICAgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLg0KLSMgDQotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIE1pY2hhZWwgRm9vcmQg
bm9yIHRoZSBuYW1lIG9mIFZvaWRzcGFjZQ0KLSMgICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzDQotIyAgICAgICBzb2Z0d2Fy
ZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCi0jIA0KLSMgVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRS
SUJVVE9SUw0KLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QNCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUg0KLSMgQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQNCi0j
IE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLA0KLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsDQotIyBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkNCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQNCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KLSMgT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCi0jDQot
IyBFTkQgRE9XTkxPQURFRCBMSUNFTlNFDQotDQotIyBTY3JpcHRzIG1haW50YWluZWQgYXQgaHR0
cDovL3d3dy52b2lkc3BhY2Uub3JnLnVrL3B5dGhvbi9pbmRleC5zaHRtbA0KLSMgQ29tbWVudHMs
IHN1Z2dlc3Rpb25zIGFuZCBidWcgcmVwb3J0cyB3ZWxjb21lLg0KLQ0KLQ0KLV9fYWxsX18gPSAo
DQotICAgICdNb2NrJywNCi0gICAgJ3BhdGNoJywNCi0gICAgJ3BhdGNoX29iamVjdCcsDQotICAg
ICdzZW50aW5lbCcsDQotICAgICdERUZBVUxUJw0KLSkNCi0NCi1fX3ZlcnNpb25fXyA9ICcwLjYu
MCcNCi0NCi1jbGFzcyBTZW50aW5lbE9iamVjdChvYmplY3QpOg0KLSAgICBkZWYgX19pbml0X18o
c2VsZiwgbmFtZSk6DQotICAgICAgICBzZWxmLm5hbWUgPSBuYW1lDQotICAgICAgICANCi0gICAg
ZGVmIF9fcmVwcl9fKHNlbGYpOg0KLSAgICAgICAgcmV0dXJuICc8U2VudGluZWxPYmplY3QgIiVz
Ij4nICUgc2VsZi5uYW1lDQotDQotDQotY2xhc3MgU2VudGluZWwob2JqZWN0KToNCi0gICAgZGVm
IF9faW5pdF9fKHNlbGYpOg0KLSAgICAgICAgc2VsZi5fc2VudGluZWxzID0ge30NCi0gICAgICAg
IA0KLSAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6DQotICAgICAgICByZXR1cm4gc2Vs
Zi5fc2VudGluZWxzLnNldGRlZmF1bHQobmFtZSwgU2VudGluZWxPYmplY3QobmFtZSkpDQotICAg
IA0KLSAgICANCi1zZW50aW5lbCA9IFNlbnRpbmVsKCkNCi0NCi1ERUZBVUxUID0gc2VudGluZWwu
REVGQVVMVA0KLQ0KLWNsYXNzIE9sZFN0eWxlQ2xhc3M6DQotICAgIHBhc3MNCi1DbGFzc1R5cGUg
PSB0eXBlKE9sZFN0eWxlQ2xhc3MpDQotDQotZGVmIF9pc19tYWdpYyhuYW1lKToNCi0gICAgcmV0
dXJuICdfXyVzX18nICUgbmFtZVsyOi0yXSA9PSBuYW1lDQotDQotZGVmIF9jb3B5KHZhbHVlKToN
Ci0gICAgaWYgdHlwZSh2YWx1ZSkgaW4gKGRpY3QsIGxpc3QsIHR1cGxlLCBzZXQpOg0KLSAgICAg
ICAgcmV0dXJuIHR5cGUodmFsdWUpKHZhbHVlKQ0KLSAgICByZXR1cm4gdmFsdWUNCi0NCi0NCi1j
bGFzcyBNb2NrKG9iamVjdCk6DQotDQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzcGVjPU5vbmUs
IHNpZGVfZWZmZWN0PU5vbmUsIHJldHVybl92YWx1ZT1ERUZBVUxULCANCi0gICAgICAgICAgICAg
ICAgIG5hbWU9Tm9uZSwgcGFyZW50PU5vbmUsIHdyYXBzPU5vbmUpOg0KLSAgICAgICAgc2VsZi5f
cGFyZW50ID0gcGFyZW50DQotICAgICAgICBzZWxmLl9uYW1lID0gbmFtZQ0KLSAgICAgICAgaWYg
c3BlYyBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFuY2Uoc3BlYywgbGlzdCk6DQotICAgICAg
ICAgICAgc3BlYyA9IFttZW1iZXIgZm9yIG1lbWJlciBpbiBkaXIoc3BlYykgaWYgbm90IF9pc19t
YWdpYyhtZW1iZXIpXQ0KLSAgICAgICAgDQotICAgICAgICBzZWxmLl9tZXRob2RzID0gc3BlYw0K
LSAgICAgICAgc2VsZi5fY2hpbGRyZW4gPSB7fQ0KLSAgICAgICAgc2VsZi5fcmV0dXJuX3ZhbHVl
ID0gcmV0dXJuX3ZhbHVlDQotICAgICAgICBzZWxmLnNpZGVfZWZmZWN0ID0gc2lkZV9lZmZlY3QN
Ci0gICAgICAgIHNlbGYuX3dyYXBzID0gd3JhcHMNCi0gICAgICAgIA0KLSAgICAgICAgc2VsZi5y
ZXNldF9tb2NrKCkNCi0gICAgICAgIA0KLQ0KLSAgICBkZWYgcmVzZXRfbW9jayhzZWxmKToNCi0g
ICAgICAgIHNlbGYuY2FsbGVkID0gRmFsc2UNCi0gICAgICAgIHNlbGYuY2FsbF9hcmdzID0gTm9u
ZQ0KLSAgICAgICAgc2VsZi5jYWxsX2NvdW50ID0gMA0KLSAgICAgICAgc2VsZi5jYWxsX2FyZ3Nf
bGlzdCA9IFtdDQotICAgICAgICBzZWxmLm1ldGhvZF9jYWxscyA9IFtdDQotICAgICAgICBmb3Ig
Y2hpbGQgaW4gc2VsZi5fY2hpbGRyZW4uaXRlcnZhbHVlcygpOg0KLSAgICAgICAgICAgIGNoaWxk
LnJlc2V0X21vY2soKQ0KLSAgICAgICAgaWYgaXNpbnN0YW5jZShzZWxmLl9yZXR1cm5fdmFsdWUs
IE1vY2spOg0KLSAgICAgICAgICAgIHNlbGYuX3JldHVybl92YWx1ZS5yZXNldF9tb2NrKCkNCi0g
ICAgICAgIA0KLSAgICANCi0gICAgZGVmIF9fZ2V0X3JldHVybl92YWx1ZShzZWxmKToNCi0gICAg
ICAgIGlmIHNlbGYuX3JldHVybl92YWx1ZSBpcyBERUZBVUxUOg0KLSAgICAgICAgICAgIHNlbGYu
X3JldHVybl92YWx1ZSA9IE1vY2soKQ0KLSAgICAgICAgcmV0dXJuIHNlbGYuX3JldHVybl92YWx1
ZQ0KLSAgICANCi0gICAgZGVmIF9fc2V0X3JldHVybl92YWx1ZShzZWxmLCB2YWx1ZSk6DQotICAg
ICAgICBzZWxmLl9yZXR1cm5fdmFsdWUgPSB2YWx1ZQ0KLSAgICAgICAgDQotICAgIHJldHVybl92
YWx1ZSA9IHByb3BlcnR5KF9fZ2V0X3JldHVybl92YWx1ZSwgX19zZXRfcmV0dXJuX3ZhbHVlKQ0K
LQ0KLQ0KLSAgICBkZWYgX19jYWxsX18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToNCi0gICAgICAg
IHNlbGYuY2FsbGVkID0gVHJ1ZQ0KLSAgICAgICAgc2VsZi5jYWxsX2NvdW50ICs9IDENCi0gICAg
ICAgIHNlbGYuY2FsbF9hcmdzID0gKGFyZ3MsIGt3YXJncykNCi0gICAgICAgIHNlbGYuY2FsbF9h
cmdzX2xpc3QuYXBwZW5kKChhcmdzLCBrd2FyZ3MpKQ0KLSAgICAgICAgDQotICAgICAgICBwYXJl
bnQgPSBzZWxmLl9wYXJlbnQNCi0gICAgICAgIG5hbWUgPSBzZWxmLl9uYW1lDQotICAgICAgICB3
aGlsZSBwYXJlbnQgaXMgbm90IE5vbmU6DQotICAgICAgICAgICAgcGFyZW50Lm1ldGhvZF9jYWxs
cy5hcHBlbmQoKG5hbWUsIGFyZ3MsIGt3YXJncykpDQotICAgICAgICAgICAgaWYgcGFyZW50Ll9w
YXJlbnQgaXMgTm9uZToNCi0gICAgICAgICAgICAgICAgYnJlYWsNCi0gICAgICAgICAgICBuYW1l
ID0gcGFyZW50Ll9uYW1lICsgJy4nICsgbmFtZQ0KLSAgICAgICAgICAgIHBhcmVudCA9IHBhcmVu
dC5fcGFyZW50DQotICAgICAgICANCi0gICAgICAgIHJldF92YWwgPSBERUZBVUxUDQotICAgICAg
ICBpZiBzZWxmLnNpZGVfZWZmZWN0IGlzIG5vdCBOb25lOg0KLSAgICAgICAgICAgIGlmIChpc2lu
c3RhbmNlKHNlbGYuc2lkZV9lZmZlY3QsIEV4Y2VwdGlvbikgb3IgDQotICAgICAgICAgICAgICAg
IGlzaW5zdGFuY2Uoc2VsZi5zaWRlX2VmZmVjdCwgKHR5cGUsIENsYXNzVHlwZSkpIGFuZA0KLSAg
ICAgICAgICAgICAgICBpc3N1YmNsYXNzKHNlbGYuc2lkZV9lZmZlY3QsIEV4Y2VwdGlvbikpOg0K
LSAgICAgICAgICAgICAgICByYWlzZSBzZWxmLnNpZGVfZWZmZWN0DQotICAgICAgICAgICAgDQot
ICAgICAgICAgICAgcmV0X3ZhbCA9IHNlbGYuc2lkZV9lZmZlY3QoKmFyZ3MsICoqa3dhcmdzKQ0K
LSAgICAgICAgICAgIGlmIHJldF92YWwgaXMgREVGQVVMVDoNCi0gICAgICAgICAgICAgICAgcmV0
X3ZhbCA9IHNlbGYucmV0dXJuX3ZhbHVlDQotICAgICAgICANCi0gICAgICAgIGlmIHNlbGYuX3dy
YXBzIGlzIG5vdCBOb25lIGFuZCBzZWxmLl9yZXR1cm5fdmFsdWUgaXMgREVGQVVMVDoNCi0gICAg
ICAgICAgICByZXR1cm4gc2VsZi5fd3JhcHMoKmFyZ3MsICoqa3dhcmdzKQ0KLSAgICAgICAgaWYg
cmV0X3ZhbCBpcyBERUZBVUxUOg0KLSAgICAgICAgICAgIHJldF92YWwgPSBzZWxmLnJldHVybl92
YWx1ZQ0KLSAgICAgICAgcmV0dXJuIHJldF92YWwNCi0gICAgDQotICAgIA0KLSAgICBkZWYgX19n
ZXRhdHRyX18oc2VsZiwgbmFtZSk6DQotICAgICAgICBpZiBzZWxmLl9tZXRob2RzIGlzIG5vdCBO
b25lOg0KLSAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYuX21ldGhvZHM6DQotICAgICAg
ICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCJNb2NrIG9iamVjdCBoYXMgbm8gYXR0cmli
dXRlICclcyciICUgbmFtZSkNCi0gICAgICAgIGVsaWYgX2lzX21hZ2ljKG5hbWUpOg0KLSAgICAg
ICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKG5hbWUpDQotICAgICAgICANCi0gICAgICAgIGlm
IG5hbWUgbm90IGluIHNlbGYuX2NoaWxkcmVuOg0KLSAgICAgICAgICAgIHdyYXBzID0gTm9uZQ0K
LSAgICAgICAgICAgIGlmIHNlbGYuX3dyYXBzIGlzIG5vdCBOb25lOg0KLSAgICAgICAgICAgICAg
ICB3cmFwcyA9IGdldGF0dHIoc2VsZi5fd3JhcHMsIG5hbWUpDQotICAgICAgICAgICAgc2VsZi5f
Y2hpbGRyZW5bbmFtZV0gPSBNb2NrKHBhcmVudD1zZWxmLCBuYW1lPW5hbWUsIHdyYXBzPXdyYXBz
KQ0KLSAgICAgICAgICAgIA0KLSAgICAgICAgcmV0dXJuIHNlbGYuX2NoaWxkcmVuW25hbWVdDQot
ICAgIA0KLSAgICANCi0gICAgZGVmIGFzc2VydF9jYWxsZWRfd2l0aChzZWxmLCAqYXJncywgKipr
d2FyZ3MpOg0KLSAgICAgICAgYXNzZXJ0IHNlbGYuY2FsbF9hcmdzID09IChhcmdzLCBrd2FyZ3Mp
LCAnRXhwZWN0ZWQ6ICVzXG5DYWxsZWQgd2l0aDogJXMnICUgKChhcmdzLCBrd2FyZ3MpLCBzZWxm
LmNhbGxfYXJncykNCi0gICAgICAgIA0KLQ0KLWRlZiBfZG90X2xvb2t1cCh0aGluZywgY29tcCwg
aW1wb3J0X3BhdGgpOg0KLSAgICB0cnk6DQotICAgICAgICByZXR1cm4gZ2V0YXR0cih0aGluZywg
Y29tcCkNCi0gICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOg0KLSAgICAgICAgX19pbXBvcnRfXyhp
bXBvcnRfcGF0aCkNCi0gICAgICAgIHJldHVybiBnZXRhdHRyKHRoaW5nLCBjb21wKQ0KLQ0KLQ0K
LWRlZiBfaW1wb3J0ZXIodGFyZ2V0KToNCi0gICAgY29tcG9uZW50cyA9IHRhcmdldC5zcGxpdCgn
LicpDQotICAgIGltcG9ydF9wYXRoID0gY29tcG9uZW50cy5wb3AoMCkNCi0gICAgdGhpbmcgPSBf
X2ltcG9ydF9fKGltcG9ydF9wYXRoKQ0KLQ0KLSAgICBmb3IgY29tcCBpbiBjb21wb25lbnRzOg0K
LSAgICAgICAgaW1wb3J0X3BhdGggKz0gIi4lcyIgJSBjb21wDQotICAgICAgICB0aGluZyA9IF9k
b3RfbG9va3VwKHRoaW5nLCBjb21wLCBpbXBvcnRfcGF0aCkNCi0gICAgcmV0dXJuIHRoaW5nDQot
DQotDQotY2xhc3MgX3BhdGNoKG9iamVjdCk6DQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCB0YXJn
ZXQsIGF0dHJpYnV0ZSwgbmV3LCBzcGVjLCBjcmVhdGUpOg0KLSAgICAgICAgc2VsZi50YXJnZXQg
PSB0YXJnZXQNCi0gICAgICAgIHNlbGYuYXR0cmlidXRlID0gYXR0cmlidXRlDQotICAgICAgICBz
ZWxmLm5ldyA9IG5ldw0KLSAgICAgICAgc2VsZi5zcGVjID0gc3BlYw0KLSAgICAgICAgc2VsZi5j
cmVhdGUgPSBjcmVhdGUNCi0gICAgICAgIHNlbGYuaGFzX2xvY2FsID0gRmFsc2UNCi0NCi0NCi0g
ICAgZGVmIF9fY2FsbF9fKHNlbGYsIGZ1bmMpOg0KLSAgICAgICAgaWYgaGFzYXR0cihmdW5jLCAn
cGF0Y2hpbmdzJyk6DQotICAgICAgICAgICAgZnVuYy5wYXRjaGluZ3MuYXBwZW5kKHNlbGYpDQot
ICAgICAgICAgICAgcmV0dXJuIGZ1bmMNCi0NCi0gICAgICAgIGRlZiBwYXRjaGVkKCphcmdzLCAq
KmtleXdhcmdzKToNCi0gICAgICAgICAgICAjIGRvbid0IHVzZSBhIHdpdGggaGVyZSAoYmFja3dh
cmRzIGNvbXBhdGFiaWxpdHkgd2l0aCAyLjUpDQotICAgICAgICAgICAgZXh0cmFfYXJncyA9IFtd
DQotICAgICAgICAgICAgZm9yIHBhdGNoaW5nIGluIHBhdGNoZWQucGF0Y2hpbmdzOg0KLSAgICAg
ICAgICAgICAgICBhcmcgPSBwYXRjaGluZy5fX2VudGVyX18oKQ0KLSAgICAgICAgICAgICAgICBp
ZiBwYXRjaGluZy5uZXcgaXMgREVGQVVMVDoNCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhX2Fy
Z3MuYXBwZW5kKGFyZykNCi0gICAgICAgICAgICBhcmdzICs9IHR1cGxlKGV4dHJhX2FyZ3MpDQot
ICAgICAgICAgICAgdHJ5Og0KLSAgICAgICAgICAgICAgICByZXR1cm4gZnVuYygqYXJncywgKipr
ZXl3YXJncykNCi0gICAgICAgICAgICBmaW5hbGx5Og0KLSAgICAgICAgICAgICAgICBmb3IgcGF0
Y2hpbmcgaW4gZ2V0YXR0cihwYXRjaGVkLCAncGF0Y2hpbmdzJywgW10pOg0KLSAgICAgICAgICAg
ICAgICAgICAgcGF0Y2hpbmcuX19leGl0X18oKQ0KLQ0KLSAgICAgICAgcGF0Y2hlZC5wYXRjaGlu
Z3MgPSBbc2VsZl0NCi0gICAgICAgIHBhdGNoZWQuX19uYW1lX18gPSBmdW5jLl9fbmFtZV9fIA0K
LSAgICAgICAgcGF0Y2hlZC5jb21wYXRfY29fZmlyc3RsaW5lbm8gPSBnZXRhdHRyKGZ1bmMsICJj
b21wYXRfY29fZmlyc3RsaW5lbm8iLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICBmdW5jLmZ1bmNfY29kZS5jb19maXJzdGxpbmVubykNCi0gICAgICAg
IHJldHVybiBwYXRjaGVkDQotDQotDQotICAgIGRlZiBnZXRfb3JpZ2luYWwoc2VsZik6DQotICAg
ICAgICB0YXJnZXQgPSBzZWxmLnRhcmdldA0KLSAgICAgICAgbmFtZSA9IHNlbGYuYXR0cmlidXRl
DQotICAgICAgICBjcmVhdGUgPSBzZWxmLmNyZWF0ZQ0KLSAgICAgICAgDQotICAgICAgICBvcmln
aW5hbCA9IERFRkFVTFQNCi0gICAgICAgIGlmIF9oYXNfbG9jYWxfYXR0cih0YXJnZXQsIG5hbWUp
Og0KLSAgICAgICAgICAgIHRyeToNCi0gICAgICAgICAgICAgICAgb3JpZ2luYWwgPSB0YXJnZXQu
X19kaWN0X19bbmFtZV0NCi0gICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6DQotICAg
ICAgICAgICAgICAgICMgZm9yIGluc3RhbmNlcyBvZiBjbGFzc2VzIHdpdGggc2xvdHMsIHRoZXkg
aGF2ZSBubyBfX2RpY3RfXw0KLSAgICAgICAgICAgICAgICBvcmlnaW5hbCA9IGdldGF0dHIodGFy
Z2V0LCBuYW1lKQ0KLSAgICAgICAgZWxpZiBub3QgY3JlYXRlIGFuZCBub3QgaGFzYXR0cih0YXJn
ZXQsIG5hbWUpOg0KLSAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCIlcyBkb2VzIG5v
dCBoYXZlIHRoZSBhdHRyaWJ1dGUgJXIiICUgKHRhcmdldCwgbmFtZSkpDQotICAgICAgICByZXR1
cm4gb3JpZ2luYWwNCi0NCi0gICAgDQotICAgIGRlZiBfX2VudGVyX18oc2VsZik6DQotICAgICAg
ICBuZXcsIHNwZWMsID0gc2VsZi5uZXcsIHNlbGYuc3BlYw0KLSAgICAgICAgb3JpZ2luYWwgPSBz
ZWxmLmdldF9vcmlnaW5hbCgpDQotICAgICAgICBpZiBuZXcgaXMgREVGQVVMVDoNCi0gICAgICAg
ICAgICAjIFhYWFggd2hhdCBpZiBvcmlnaW5hbCBpcyBERUZBVUxUIC0gc2hvdWxkbid0IHVzZSBp
dCBhcyBhIHNwZWMNCi0gICAgICAgICAgICBpbmhlcml0ID0gRmFsc2UNCi0gICAgICAgICAgICBp
ZiBzcGVjID09IFRydWU6DQotICAgICAgICAgICAgICAgICMgc2V0IHNwZWMgdG8gdGhlIG9iamVj
dCB3ZSBhcmUgcmVwbGFjaW5nDQotICAgICAgICAgICAgICAgIHNwZWMgPSBvcmlnaW5hbA0KLSAg
ICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNwZWMsICh0eXBlLCBDbGFzc1R5cGUpKToNCi0g
ICAgICAgICAgICAgICAgICAgIGluaGVyaXQgPSBUcnVlDQotICAgICAgICAgICAgbmV3ID0gTW9j
ayhzcGVjPXNwZWMpDQotICAgICAgICAgICAgaWYgaW5oZXJpdDoNCi0gICAgICAgICAgICAgICAg
bmV3LnJldHVybl92YWx1ZSA9IE1vY2soc3BlYz1zcGVjKQ0KLSAgICAgICAgc2VsZi50ZW1wX29y
aWdpbmFsID0gb3JpZ2luYWwNCi0gICAgICAgIHNldGF0dHIoc2VsZi50YXJnZXQsIHNlbGYuYXR0
cmlidXRlLCBuZXcpDQotICAgICAgICByZXR1cm4gbmV3DQotDQotDQotICAgIGRlZiBfX2V4aXRf
XyhzZWxmLCAqXyk6DQotICAgICAgICBpZiBzZWxmLnRlbXBfb3JpZ2luYWwgaXMgbm90IERFRkFV
TFQ6DQotICAgICAgICAgICAgc2V0YXR0cihzZWxmLnRhcmdldCwgc2VsZi5hdHRyaWJ1dGUsIHNl
bGYudGVtcF9vcmlnaW5hbCkNCi0gICAgICAgIGVsc2U6DQotICAgICAgICAgICAgZGVsYXR0cihz
ZWxmLnRhcmdldCwgc2VsZi5hdHRyaWJ1dGUpDQotICAgICAgICBkZWwgc2VsZi50ZW1wX29yaWdp
bmFsDQotICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIA0KLWRlZiBwYXRjaF9vYmplY3Qo
dGFyZ2V0LCBhdHRyaWJ1dGUsIG5ldz1ERUZBVUxULCBzcGVjPU5vbmUsIGNyZWF0ZT1GYWxzZSk6
DQotICAgIHJldHVybiBfcGF0Y2godGFyZ2V0LCBhdHRyaWJ1dGUsIG5ldywgc3BlYywgY3JlYXRl
KQ0KLQ0KLQ0KLWRlZiBwYXRjaCh0YXJnZXQsIG5ldz1ERUZBVUxULCBzcGVjPU5vbmUsIGNyZWF0
ZT1GYWxzZSk6DQotICAgIHRyeToNCi0gICAgICAgIHRhcmdldCwgYXR0cmlidXRlID0gdGFyZ2V0
LnJzcGxpdCgnLicsIDEpICAgIA0KLSAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVFcnJvcik6
DQotICAgICAgICByYWlzZSBUeXBlRXJyb3IoIk5lZWQgYSB2YWxpZCB0YXJnZXQgdG8gcGF0Y2gu
IFlvdSBzdXBwbGllZDogJXIiICUgKHRhcmdldCwpKQ0KLSAgICB0YXJnZXQgPSBfaW1wb3J0ZXIo
dGFyZ2V0KQ0KLSAgICByZXR1cm4gX3BhdGNoKHRhcmdldCwgYXR0cmlidXRlLCBuZXcsIHNwZWMs
IGNyZWF0ZSkNCi0NCi0NCi0NCi1kZWYgX2hhc19sb2NhbF9hdHRyKG9iaiwgbmFtZSk6DQotICAg
IHRyeToNCi0gICAgICAgIHJldHVybiBuYW1lIGluIHZhcnMob2JqKQ0KLSAgICBleGNlcHQgVHlw
ZUVycm9yOg0KLSAgICAgICAgIyBvYmplY3RzIHdpdGhvdXQgYSBfX2RpY3RfXw0KLSAgICAgICAg
cmV0dXJuIGhhc2F0dHIob2JqLCBuYW1lKQ0KSW5kZXg6IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvbW9ja19idWd6aWxsYXRvb2wucHkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvU2Ny
aXB0cy93ZWJraXRweS9tb2NrX2J1Z3ppbGxhdG9vbC5weQkocmV2aXNpb24gNTU2MDQpCisrKyBX
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L21vY2tfYnVnemlsbGF0b29sLnB5CSh3b3JraW5n
IGNvcHkpCkBAIC0zMCw4ICszMCw4IEBAIGltcG9ydCBvcwogCiBmcm9tIHdlYmtpdHB5LmJ1Z3pp
bGxhIGltcG9ydCBCdWcsIEF0dGFjaG1lbnQKIGZyb20gd2Via2l0cHkuY29tbWl0dGVycyBpbXBv
cnQgQ29tbWl0dGVyTGlzdCwgUmV2aWV3ZXIKLWZyb20gd2Via2l0cHkubW9jayBpbXBvcnQgTW9j
awogZnJvbSB3ZWJraXRweS5zY20gaW1wb3J0IENvbW1pdE1lc3NhZ2UKK2Zyb20gd2Via2l0cHku
dGhpcmRwYXJ0eS5tb2NrIGltcG9ydCBNb2NrCiBmcm9tIHdlYmtpdHB5LndlYmtpdF9sb2dnaW5n
IGltcG9ydCBsb2cKIAogCkluZGV4OiBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3BhdGNo
Y29sbGVjdGlvbl91bml0dGVzdC5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9TY3JpcHRz
L3dlYmtpdHB5L3BhdGNoY29sbGVjdGlvbl91bml0dGVzdC5weQkocmV2aXNpb24gNTU2MDQpCisr
KyBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3BhdGNoY29sbGVjdGlvbl91bml0dGVzdC5w
eQkod29ya2luZyBjb3B5KQpAQCAtMjksOCArMjksOCBAQAogCiBpbXBvcnQgdW5pdHRlc3QKIAot
ZnJvbSB3ZWJraXRweS5tb2NrIGltcG9ydCBNb2NrCiBmcm9tIHdlYmtpdHB5LnBhdGNoY29sbGVj
dGlvbiBpbXBvcnQgUGVyc2lzdGVudFBhdGNoQ29sbGVjdGlvbiwgUGVyc2lzdGVudFBhdGNoQ29s
bGVjdGlvbkRlbGVnYXRlCitmcm9tIHdlYmtpdHB5LnRoaXJkcGFydHkubW9jayBpbXBvcnQgTW9j
awogCiAKIGNsYXNzIFRlc3RQZXJzaXN0ZW50UGF0Y2hDb2xsZWN0aW9uRGVsZWdhdGUoUGVyc2lz
dGVudFBhdGNoQ29sbGVjdGlvbkRlbGVnYXRlKToKSW5kZXg6IFdlYktpdFRvb2xzL1NjcmlwdHMv
d2Via2l0cHkvc3RlcHNfcmVmZXJlbmNlcy5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9T
Y3JpcHRzL3dlYmtpdHB5L3N0ZXBzX3JlZmVyZW5jZXMucHkJKHJldmlzaW9uIDApCisrKyBXZWJL
aXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3N0ZXBzX3JlZmVyZW5jZXMucHkJKHJldmlzaW9uIDAp
CkBAIC0wLDAgKzEsMjUgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDEwIENocmlzIEplcmRvbmVrIChj
amVyZG9uZWtAd2Via2l0Lm9yZykKKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUg
bWV0OgorIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorIyBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisj
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyMgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIK
KyMgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyMgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKworIiIiQ29udGFpbnMgaW50cmEtcGFja2FnZSByZWZlcmVuY2VzIHVzZWQgYnkgd2Vi
a2l0cHkuc3RlcHMuIiIiCisKK2Zyb20gdGhpcmRwYXJ0eS5tb2NrIGltcG9ydCBNb2NrCkluZGV4
OiBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1hbmRzL2NvbW1hbmR0ZXN0LnB5Cj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbWFuZHMvY29tbWFu
ZHRlc3QucHkJKHJldmlzaW9uIDU1NjA0KQorKysgV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9jb21tYW5kcy9jb21tYW5kdGVzdC5weQkod29ya2luZyBjb3B5KQpAQCAtMjgsNyArMjgsNyBA
QAogCiBpbXBvcnQgdW5pdHRlc3QKIAotZnJvbSB3ZWJraXRweS5tb2NrIGltcG9ydCBNb2NrCitm
cm9tIHdlYmtpdHB5LmNvbW1hbmRzX3JlZmVyZW5jZXMgaW1wb3J0IE1vY2sKIGZyb20gd2Via2l0
cHkubW9ja19idWd6aWxsYXRvb2wgaW1wb3J0IE1vY2tCdWd6aWxsYVRvb2wKIGZyb20gd2Via2l0
cHkub3V0cHV0Y2FwdHVyZSBpbXBvcnQgT3V0cHV0Q2FwdHVyZQogCkluZGV4OiBXZWJLaXRUb29s
cy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1hbmRzL2Rvd25sb2FkX3VuaXR0ZXN0LnB5Cj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbWFuZHMvZG93bmxvYWRfdW5p
dHRlc3QucHkJKHJldmlzaW9uIDU1NjA0KQorKysgV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9jb21tYW5kcy9kb3dubG9hZF91bml0dGVzdC5weQkod29ya2luZyBjb3B5KQpAQCAtMjYsOSAr
MjYsMTAgQEAKICMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCiAjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAKK2Zyb20gd2Via2l0cHku
Y29tbWFuZHNfcmVmZXJlbmNlcyBpbXBvcnQgTW9jawogZnJvbSB3ZWJraXRweS5jb21tYW5kcy5j
b21tYW5kdGVzdCBpbXBvcnQgQ29tbWFuZHNUZXN0CiBmcm9tIHdlYmtpdHB5LmNvbW1hbmRzLmRv
d25sb2FkIGltcG9ydCAqCi1mcm9tIHdlYmtpdHB5Lm1vY2sgaW1wb3J0IE1vY2sKKwogCiBjbGFz
cyBEb3dubG9hZENvbW1hbmRzVGVzdChDb21tYW5kc1Rlc3QpOgogICAgIGRlZiBfZGVmYXVsdF9v
cHRpb25zKHNlbGYpOgpJbmRleDogV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tYW5k
cy9lYXJseV93YXJuaW5nX3N5c3RlbV91bml0dGVzdC5weQo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1hbmRzL2Vhcmx5X3dhcm5pbmdfc3lzdGVtX3VuaXR0
ZXN0LnB5CShyZXZpc2lvbiA1NTYwNCkKKysrIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkv
Y29tbWFuZHMvZWFybHlfd2FybmluZ19zeXN0ZW1fdW5pdHRlc3QucHkJKHdvcmtpbmcgY29weSkK
QEAgLTI4LDkgKzI4LDkgQEAKIAogaW1wb3J0IG9zCiAKK2Zyb20gd2Via2l0cHkuY29tbWFuZHNf
cmVmZXJlbmNlcyBpbXBvcnQgTW9jawogZnJvbSB3ZWJraXRweS5jb21tYW5kcy5lYXJseV93YXJu
aW5nX3N5c3RlbSBpbXBvcnQgKgogZnJvbSB3ZWJraXRweS5jb21tYW5kcy5xdWV1ZXN0ZXN0IGlt
cG9ydCBRdWV1ZXNUZXN0Ci1mcm9tIHdlYmtpdHB5Lm1vY2sgaW1wb3J0IE1vY2sKIAogY2xhc3Mg
RWFybHlXYXJuaW5nU3l0ZW1UZXN0KFF1ZXVlc1Rlc3QpOgogICAgIGRlZiB0ZXN0X2Nocm9taXVt
X2V3cyhzZWxmKToKSW5kZXg6IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbWFuZHMv
cXVlcmllc191bml0dGVzdC5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9TY3JpcHRzL3dl
YmtpdHB5L2NvbW1hbmRzL3F1ZXJpZXNfdW5pdHRlc3QucHkJKHJldmlzaW9uIDU1NjA0KQorKysg
V2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tYW5kcy9xdWVyaWVzX3VuaXR0ZXN0LnB5
CSh3b3JraW5nIGNvcHkpCkBAIC0yNyw5ICsyNyw5IEBACiAjIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAKIGZyb20g
d2Via2l0cHkuYnVnemlsbGEgaW1wb3J0IEJ1Z3ppbGxhCitmcm9tIHdlYmtpdHB5LmNvbW1hbmRz
X3JlZmVyZW5jZXMgaW1wb3J0IE1vY2sKIGZyb20gd2Via2l0cHkuY29tbWFuZHMuY29tbWFuZHRl
c3QgaW1wb3J0IENvbW1hbmRzVGVzdAogZnJvbSB3ZWJraXRweS5jb21tYW5kcy5xdWVyaWVzIGlt
cG9ydCAqCi1mcm9tIHdlYmtpdHB5Lm1vY2sgaW1wb3J0IE1vY2sKIGZyb20gd2Via2l0cHkubW9j
a19idWd6aWxsYXRvb2wgaW1wb3J0IE1vY2tCdWd6aWxsYVRvb2wKIAogY2xhc3MgUXVlcnlDb21t
YW5kc1Rlc3QoQ29tbWFuZHNUZXN0KToKSW5kZXg6IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0
cHkvY29tbWFuZHMvcXVldWVzX3VuaXR0ZXN0LnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xz
L1NjcmlwdHMvd2Via2l0cHkvY29tbWFuZHMvcXVldWVzX3VuaXR0ZXN0LnB5CShyZXZpc2lvbiA1
NTYwNCkKKysrIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvY29tbWFuZHMvcXVldWVzX3Vu
aXR0ZXN0LnB5CSh3b3JraW5nIGNvcHkpCkBAIC0yOCwxMCArMjgsMTAgQEAKIAogaW1wb3J0IG9z
CiAKK2Zyb20gd2Via2l0cHkuY29tbWFuZHNfcmVmZXJlbmNlcyBpbXBvcnQgTW9jawogZnJvbSB3
ZWJraXRweS5jb21tYW5kcy5jb21tYW5kdGVzdCBpbXBvcnQgQ29tbWFuZHNUZXN0CiBmcm9tIHdl
YmtpdHB5LmNvbW1hbmRzLnF1ZXVlcyBpbXBvcnQgKgogZnJvbSB3ZWJraXRweS5jb21tYW5kcy5x
dWV1ZXN0ZXN0IGltcG9ydCBRdWV1ZXNUZXN0Ci1mcm9tIHdlYmtpdHB5Lm1vY2sgaW1wb3J0IE1v
Y2sKIGZyb20gd2Via2l0cHkubW9ja19idWd6aWxsYXRvb2wgaW1wb3J0IE1vY2tCdWd6aWxsYVRv
b2wKIGZyb20gd2Via2l0cHkub3V0cHV0Y2FwdHVyZSBpbXBvcnQgT3V0cHV0Q2FwdHVyZQogCklu
ZGV4OiBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1hbmRzL3F1ZXVlc3Rlc3QucHkK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tYW5kcy9xdWV1
ZXN0ZXN0LnB5CShyZXZpc2lvbiA1NTYwNCkKKysrIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0
cHkvY29tbWFuZHMvcXVldWVzdGVzdC5weQkod29ya2luZyBjb3B5KQpAQCAtMjgsOCArMjgsOCBA
QAogCiBpbXBvcnQgdW5pdHRlc3QKIAorZnJvbSB3ZWJraXRweS5jb21tYW5kc19yZWZlcmVuY2Vz
IGltcG9ydCBNb2NrCiBmcm9tIHdlYmtpdHB5LmJ1Z3ppbGxhIGltcG9ydCBBdHRhY2htZW50Ci1m
cm9tIHdlYmtpdHB5Lm1vY2sgaW1wb3J0IE1vY2sKIGZyb20gd2Via2l0cHkubW9ja19idWd6aWxs
YXRvb2wgaW1wb3J0IE1vY2tCdWd6aWxsYVRvb2wKIGZyb20gd2Via2l0cHkub3V0cHV0Y2FwdHVy
ZSBpbXBvcnQgT3V0cHV0Q2FwdHVyZQogCkluZGV4OiBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtp
dHB5L2NvbW1hbmRzL3VwbG9hZC5weQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJLaXRUb29scy9TY3JpcHRz
L3dlYmtpdHB5L2NvbW1hbmRzL3VwbG9hZC5weQkocmV2aXNpb24gNTU2MDQpCisrKyBXZWJLaXRU
b29scy9TY3JpcHRzL3dlYmtpdHB5L2NvbW1hbmRzL3VwbG9hZC5weQkod29ya2luZyBjb3B5KQpA
QCAtMzgsMTIgKzM4LDEyIEBAIGZyb20gb3B0cGFyc2UgaW1wb3J0IG1ha2Vfb3B0aW9uCiBpbXBv
cnQgd2Via2l0cHkuc3RlcHMgYXMgc3RlcHMKIAogZnJvbSB3ZWJraXRweS5idWd6aWxsYSBpbXBv
cnQgcGFyc2VfYnVnX2lkCitmcm9tIHdlYmtpdHB5LmNvbW1hbmRzX3JlZmVyZW5jZXMgaW1wb3J0
IE1vY2sKIGZyb20gd2Via2l0cHkuY29tbWFuZHMuYWJzdHJhY3RzZXF1ZW5jZWRjb21tYW5kIGlt
cG9ydCBBYnN0cmFjdFNlcXVlbmNlZENvbW1hbmQKIGZyb20gd2Via2l0cHkuY29tbWVudHMgaW1w
b3J0IGJ1Z19jb21tZW50X2Zyb21fc3ZuX3JldmlzaW9uCiBmcm9tIHdlYmtpdHB5LmNvbW1pdHRl
cnMgaW1wb3J0IENvbW1pdHRlckxpc3QKIGZyb20gd2Via2l0cHkuZ3JhbW1hciBpbXBvcnQgcGx1
cmFsaXplLCBqb2luX3dpdGhfc2VwYXJhdG9ycwogZnJvbSB3ZWJraXRweS53ZWJraXRfbG9nZ2lu
ZyBpbXBvcnQgZXJyb3IsIGxvZwotZnJvbSB3ZWJraXRweS5tb2NrIGltcG9ydCBNb2NrCiBmcm9t
IHdlYmtpdHB5Lm11bHRpY29tbWFuZHRvb2wgaW1wb3J0IEFic3RyYWN0RGVjbGFyYXRpdmVDb21t
YW5kCiBmcm9tIHdlYmtpdHB5LnVzZXIgaW1wb3J0IFVzZXIKIApJbmRleDogV2ViS2l0VG9vbHMv
U2NyaXB0cy93ZWJraXRweS9jb21tYW5kcy91cGxvYWRfdW5pdHRlc3QucHkKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21tYW5kcy91cGxvYWRfdW5pdHRlc3Qu
cHkJKHJldmlzaW9uIDU1NjA0KQorKysgV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9jb21t
YW5kcy91cGxvYWRfdW5pdHRlc3QucHkJKHdvcmtpbmcgY29weSkKQEAgLTI2LDkgKzI2LDkgQEAK
ICMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCiAjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAKK2Zyb20gd2Via2l0cHkuY29tbWFuZHNf
cmVmZXJlbmNlcyBpbXBvcnQgTW9jawogZnJvbSB3ZWJraXRweS5jb21tYW5kcy5jb21tYW5kdGVz
dCBpbXBvcnQgQ29tbWFuZHNUZXN0CiBmcm9tIHdlYmtpdHB5LmNvbW1hbmRzLnVwbG9hZCBpbXBv
cnQgKgotZnJvbSB3ZWJraXRweS5tb2NrIGltcG9ydCBNb2NrCiBmcm9tIHdlYmtpdHB5Lm1vY2tf
YnVnemlsbGF0b29sIGltcG9ydCBNb2NrQnVnemlsbGFUb29sCiAKIGNsYXNzIFVwbG9hZENvbW1h
bmRzVGVzdChDb21tYW5kc1Rlc3QpOgpJbmRleDogV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRw
eS9zdGVwcy9jbG9zZWJ1Z2ZvcmxhbmRkaWZmX3VuaXR0ZXN0LnB5Cj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdl
YktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvc3RlcHMvY2xvc2VidWdmb3JsYW5kZGlmZl91bml0
dGVzdC5weQkocmV2aXNpb24gNTU2MDQpCisrKyBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5
L3N0ZXBzL2Nsb3NlYnVnZm9ybGFuZGRpZmZfdW5pdHRlc3QucHkJKHdvcmtpbmcgY29weSkKQEAg
LTI4LDggKzI4LDggQEAKIAogaW1wb3J0IHVuaXR0ZXN0CiAKK2Zyb20gd2Via2l0cHkuc3RlcHNf
cmVmZXJlbmNlcyBpbXBvcnQgTW9jawogZnJvbSB3ZWJraXRweS5zdGVwcy5jbG9zZWJ1Z2Zvcmxh
bmRkaWZmIGltcG9ydCBDbG9zZUJ1Z0ZvckxhbmREaWZmCi1mcm9tIHdlYmtpdHB5Lm1vY2sgaW1w
b3J0IE1vY2sKIGZyb20gd2Via2l0cHkubW9ja19idWd6aWxsYXRvb2wgaW1wb3J0IE1vY2tCdWd6
aWxsYVRvb2wKIGZyb20gd2Via2l0cHkub3V0cHV0Y2FwdHVyZSBpbXBvcnQgT3V0cHV0Q2FwdHVy
ZQogCkluZGV4OiBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3N0ZXBzL3N0ZXBzX3VuaXR0
ZXN0LnB5Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvc3RlcHMv
c3RlcHNfdW5pdHRlc3QucHkJKHJldmlzaW9uIDU1NjA0KQorKysgV2ViS2l0VG9vbHMvU2NyaXB0
cy93ZWJraXRweS9zdGVwcy9zdGVwc191bml0dGVzdC5weQkod29ya2luZyBjb3B5KQpAQCAtMjgs
MTEgKzI4LDExIEBACiAKIGltcG9ydCB1bml0dGVzdAogCitmcm9tIHdlYmtpdHB5LnN0ZXBzX3Jl
ZmVyZW5jZXMgaW1wb3J0IE1vY2sKIGZyb20gd2Via2l0cHkuc3RlcHMudXBkYXRlIGltcG9ydCBV
cGRhdGUKIGZyb20gd2Via2l0cHkuc3RlcHMucHJvbXB0Zm9yYnVnb3J0aXRsZSBpbXBvcnQgUHJv
bXB0Rm9yQnVnT3JUaXRsZQogZnJvbSB3ZWJraXRweS5tb2NrX2J1Z3ppbGxhdG9vbCBpbXBvcnQg
TW9ja0J1Z3ppbGxhVG9vbAogZnJvbSB3ZWJraXRweS5vdXRwdXRjYXB0dXJlIGltcG9ydCBPdXRw
dXRDYXB0dXJlCi1mcm9tIHdlYmtpdHB5Lm1vY2sgaW1wb3J0IE1vY2sKIAogCiBjbGFzcyBTdGVw
c1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpJbmRleDogV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJr
aXRweS9zdGVwcy91cGRhdGVjaGFuZ2Vsb2dzd2l0aHJldmlld191bml0dGVzdHMucHkKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViS2l0VG9vbHMvU2NyaXB0cy93ZWJraXRweS9zdGVwcy91cGRhdGVjaGFuZ2Vs
b2dzd2l0aHJldmlld191bml0dGVzdHMucHkJKHJldmlzaW9uIDU1NjA0KQorKysgV2ViS2l0VG9v
bHMvU2NyaXB0cy93ZWJraXRweS9zdGVwcy91cGRhdGVjaGFuZ2Vsb2dzd2l0aHJldmlld191bml0
dGVzdHMucHkJKHdvcmtpbmcgY29weSkKQEAgLTI4LDggKzI4LDggQEAKIAogaW1wb3J0IHVuaXR0
ZXN0CiAKK2Zyb20gd2Via2l0cHkuc3RlcHNfcmVmZXJlbmNlcyBpbXBvcnQgTW9jawogZnJvbSB3
ZWJraXRweS5zdGVwcy51cGRhdGVjaGFuZ2Vsb2dzd2l0aHJldmlld2VyIGltcG9ydCBVcGRhdGVD
aGFuZ2VMb2dzV2l0aFJldmlld2VyCi1mcm9tIHdlYmtpdHB5Lm1vY2sgaW1wb3J0IE1vY2sKIGZy
b20gd2Via2l0cHkubW9ja19idWd6aWxsYXRvb2wgaW1wb3J0IE1vY2tCdWd6aWxsYVRvb2wKIGZy
b20gd2Via2l0cHkub3V0cHV0Y2FwdHVyZSBpbXBvcnQgT3V0cHV0Q2FwdHVyZQogCkluZGV4OiBX
ZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3RoaXJkcGFydHkvbW9jay5weQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJLaXRUb29scy9TY3JpcHRzL3dlYmtpdHB5L3RoaXJkcGFydHkvbW9jay5weQkocmV2
aXNpb24gNTUzNTcpCShmcm9tIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvbW9jay5weTo1
NTM1NykKKysrIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdGhpcmRwYXJ0eS9tb2NrLnB5
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzA5IEBACisjIG1vY2sucHkNCisjIFRlc3QgdG9v
bHMgZm9yIG1vY2tpbmcgYW5kIHBhdGNoaW5nLg0KKyMgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkg
TWljaGFlbCBGb29yZA0KKyMgRS1tYWlsOiBmdXp6eW1hbiBBVCB2b2lkc3BhY2UgRE9UIG9yZyBE
T1QgdWsNCisNCisjIG1vY2sgMC42LjANCisjIGh0dHA6Ly93d3cudm9pZHNwYWNlLm9yZy51ay9w
eXRob24vbW9jay8NCisNCisjIFJlbGVhc2VkIHN1YmplY3QgdG8gdGhlIEJTRCBMaWNlbnNlDQor
IyBQbGVhc2Ugc2VlIGh0dHA6Ly93d3cudm9pZHNwYWNlLm9yZy51ay9weXRob24vbGljZW5zZS5z
aHRtbA0KKw0KKyMgMjAwOS0xMS0yNTogTGljZW5jZSBkb3dubG9hZGVkIGZyb20gYWJvdmUgVVJM
Lg0KKyMgQkVHSU4gRE9XTkxPQURFRCBMSUNFTlNFDQorIw0KKyMgQ29weXJpZ2h0IChjKSAyMDAz
LTIwMDksIE1pY2hhZWwgRm9vcmQNCisjIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorIyBFLW1haWwg
OiBmdXp6eW1hbiBBVCB2b2lkc3BhY2UgRE9UIG9yZyBET1QgdWsNCisjIA0KKyMgUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
DQorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMgYXJlDQorIyBtZXQ6DQorIyANCisjIA0KKyMgICAgICogUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisj
ICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4NCisjIA0KKyMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQ0KKyMgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcNCisjICAgICAgIGRpc2NsYWlt
ZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZA0K
KyMgICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLg0KKyMgDQorIyAgICAgKiBOZWl0aGVyIHRo
ZSBuYW1lIG9mIE1pY2hhZWwgRm9vcmQgbm9yIHRoZSBuYW1lIG9mIFZvaWRzcGFjZQ0KKyMgICAg
ICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJv
bSB0aGlzDQorIyAgICAgICBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4g
cGVybWlzc2lvbi4NCisjIA0KKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09Q
WVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUw0KKyMgIkFTIElTIiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QNCisjIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUg0KKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIFRIRSBDT1BZUklHSFQNCisjIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLA0KKyMgU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVA0KKyMgTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsDQorIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkNCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQNCisjIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQ0KKyMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4NCisjDQorIyBFTkQgRE9XTkxPQURFRCBMSUNFTlNFDQorDQorIyBT
Y3JpcHRzIG1haW50YWluZWQgYXQgaHR0cDovL3d3dy52b2lkc3BhY2Uub3JnLnVrL3B5dGhvbi9p
bmRleC5zaHRtbA0KKyMgQ29tbWVudHMsIHN1Z2dlc3Rpb25zIGFuZCBidWcgcmVwb3J0cyB3ZWxj
b21lLg0KKw0KKw0KK19fYWxsX18gPSAoDQorICAgICdNb2NrJywNCisgICAgJ3BhdGNoJywNCisg
ICAgJ3BhdGNoX29iamVjdCcsDQorICAgICdzZW50aW5lbCcsDQorICAgICdERUZBVUxUJw0KKykN
CisNCitfX3ZlcnNpb25fXyA9ICcwLjYuMCcNCisNCitjbGFzcyBTZW50aW5lbE9iamVjdChvYmpl
Y3QpOg0KKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6DQorICAgICAgICBzZWxmLm5hbWUg
PSBuYW1lDQorICAgICAgICANCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOg0KKyAgICAgICAgcmV0
dXJuICc8U2VudGluZWxPYmplY3QgIiVzIj4nICUgc2VsZi5uYW1lDQorDQorDQorY2xhc3MgU2Vu
dGluZWwob2JqZWN0KToNCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOg0KKyAgICAgICAgc2VsZi5f
c2VudGluZWxzID0ge30NCisgICAgICAgIA0KKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFt
ZSk6DQorICAgICAgICByZXR1cm4gc2VsZi5fc2VudGluZWxzLnNldGRlZmF1bHQobmFtZSwgU2Vu
dGluZWxPYmplY3QobmFtZSkpDQorICAgIA0KKyAgICANCitzZW50aW5lbCA9IFNlbnRpbmVsKCkN
CisNCitERUZBVUxUID0gc2VudGluZWwuREVGQVVMVA0KKw0KK2NsYXNzIE9sZFN0eWxlQ2xhc3M6
DQorICAgIHBhc3MNCitDbGFzc1R5cGUgPSB0eXBlKE9sZFN0eWxlQ2xhc3MpDQorDQorZGVmIF9p
c19tYWdpYyhuYW1lKToNCisgICAgcmV0dXJuICdfXyVzX18nICUgbmFtZVsyOi0yXSA9PSBuYW1l
DQorDQorZGVmIF9jb3B5KHZhbHVlKToNCisgICAgaWYgdHlwZSh2YWx1ZSkgaW4gKGRpY3QsIGxp
c3QsIHR1cGxlLCBzZXQpOg0KKyAgICAgICAgcmV0dXJuIHR5cGUodmFsdWUpKHZhbHVlKQ0KKyAg
ICByZXR1cm4gdmFsdWUNCisNCisNCitjbGFzcyBNb2NrKG9iamVjdCk6DQorDQorICAgIGRlZiBf
X2luaXRfXyhzZWxmLCBzcGVjPU5vbmUsIHNpZGVfZWZmZWN0PU5vbmUsIHJldHVybl92YWx1ZT1E
RUZBVUxULCANCisgICAgICAgICAgICAgICAgIG5hbWU9Tm9uZSwgcGFyZW50PU5vbmUsIHdyYXBz
PU5vbmUpOg0KKyAgICAgICAgc2VsZi5fcGFyZW50ID0gcGFyZW50DQorICAgICAgICBzZWxmLl9u
YW1lID0gbmFtZQ0KKyAgICAgICAgaWYgc3BlYyBpcyBub3QgTm9uZSBhbmQgbm90IGlzaW5zdGFu
Y2Uoc3BlYywgbGlzdCk6DQorICAgICAgICAgICAgc3BlYyA9IFttZW1iZXIgZm9yIG1lbWJlciBp
biBkaXIoc3BlYykgaWYgbm90IF9pc19tYWdpYyhtZW1iZXIpXQ0KKyAgICAgICAgDQorICAgICAg
ICBzZWxmLl9tZXRob2RzID0gc3BlYw0KKyAgICAgICAgc2VsZi5fY2hpbGRyZW4gPSB7fQ0KKyAg
ICAgICAgc2VsZi5fcmV0dXJuX3ZhbHVlID0gcmV0dXJuX3ZhbHVlDQorICAgICAgICBzZWxmLnNp
ZGVfZWZmZWN0ID0gc2lkZV9lZmZlY3QNCisgICAgICAgIHNlbGYuX3dyYXBzID0gd3JhcHMNCisg
ICAgICAgIA0KKyAgICAgICAgc2VsZi5yZXNldF9tb2NrKCkNCisgICAgICAgIA0KKw0KKyAgICBk
ZWYgcmVzZXRfbW9jayhzZWxmKToNCisgICAgICAgIHNlbGYuY2FsbGVkID0gRmFsc2UNCisgICAg
ICAgIHNlbGYuY2FsbF9hcmdzID0gTm9uZQ0KKyAgICAgICAgc2VsZi5jYWxsX2NvdW50ID0gMA0K
KyAgICAgICAgc2VsZi5jYWxsX2FyZ3NfbGlzdCA9IFtdDQorICAgICAgICBzZWxmLm1ldGhvZF9j
YWxscyA9IFtdDQorICAgICAgICBmb3IgY2hpbGQgaW4gc2VsZi5fY2hpbGRyZW4uaXRlcnZhbHVl
cygpOg0KKyAgICAgICAgICAgIGNoaWxkLnJlc2V0X21vY2soKQ0KKyAgICAgICAgaWYgaXNpbnN0
YW5jZShzZWxmLl9yZXR1cm5fdmFsdWUsIE1vY2spOg0KKyAgICAgICAgICAgIHNlbGYuX3JldHVy
bl92YWx1ZS5yZXNldF9tb2NrKCkNCisgICAgICAgIA0KKyAgICANCisgICAgZGVmIF9fZ2V0X3Jl
dHVybl92YWx1ZShzZWxmKToNCisgICAgICAgIGlmIHNlbGYuX3JldHVybl92YWx1ZSBpcyBERUZB
VUxUOg0KKyAgICAgICAgICAgIHNlbGYuX3JldHVybl92YWx1ZSA9IE1vY2soKQ0KKyAgICAgICAg
cmV0dXJuIHNlbGYuX3JldHVybl92YWx1ZQ0KKyAgICANCisgICAgZGVmIF9fc2V0X3JldHVybl92
YWx1ZShzZWxmLCB2YWx1ZSk6DQorICAgICAgICBzZWxmLl9yZXR1cm5fdmFsdWUgPSB2YWx1ZQ0K
KyAgICAgICAgDQorICAgIHJldHVybl92YWx1ZSA9IHByb3BlcnR5KF9fZ2V0X3JldHVybl92YWx1
ZSwgX19zZXRfcmV0dXJuX3ZhbHVlKQ0KKw0KKw0KKyAgICBkZWYgX19jYWxsX18oc2VsZiwgKmFy
Z3MsICoqa3dhcmdzKToNCisgICAgICAgIHNlbGYuY2FsbGVkID0gVHJ1ZQ0KKyAgICAgICAgc2Vs
Zi5jYWxsX2NvdW50ICs9IDENCisgICAgICAgIHNlbGYuY2FsbF9hcmdzID0gKGFyZ3MsIGt3YXJn
cykNCisgICAgICAgIHNlbGYuY2FsbF9hcmdzX2xpc3QuYXBwZW5kKChhcmdzLCBrd2FyZ3MpKQ0K
KyAgICAgICAgDQorICAgICAgICBwYXJlbnQgPSBzZWxmLl9wYXJlbnQNCisgICAgICAgIG5hbWUg
PSBzZWxmLl9uYW1lDQorICAgICAgICB3aGlsZSBwYXJlbnQgaXMgbm90IE5vbmU6DQorICAgICAg
ICAgICAgcGFyZW50Lm1ldGhvZF9jYWxscy5hcHBlbmQoKG5hbWUsIGFyZ3MsIGt3YXJncykpDQor
ICAgICAgICAgICAgaWYgcGFyZW50Ll9wYXJlbnQgaXMgTm9uZToNCisgICAgICAgICAgICAgICAg
YnJlYWsNCisgICAgICAgICAgICBuYW1lID0gcGFyZW50Ll9uYW1lICsgJy4nICsgbmFtZQ0KKyAg
ICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5fcGFyZW50DQorICAgICAgICANCisgICAgICAgIHJl
dF92YWwgPSBERUZBVUxUDQorICAgICAgICBpZiBzZWxmLnNpZGVfZWZmZWN0IGlzIG5vdCBOb25l
Og0KKyAgICAgICAgICAgIGlmIChpc2luc3RhbmNlKHNlbGYuc2lkZV9lZmZlY3QsIEV4Y2VwdGlv
bikgb3IgDQorICAgICAgICAgICAgICAgIGlzaW5zdGFuY2Uoc2VsZi5zaWRlX2VmZmVjdCwgKHR5
cGUsIENsYXNzVHlwZSkpIGFuZA0KKyAgICAgICAgICAgICAgICBpc3N1YmNsYXNzKHNlbGYuc2lk
ZV9lZmZlY3QsIEV4Y2VwdGlvbikpOg0KKyAgICAgICAgICAgICAgICByYWlzZSBzZWxmLnNpZGVf
ZWZmZWN0DQorICAgICAgICAgICAgDQorICAgICAgICAgICAgcmV0X3ZhbCA9IHNlbGYuc2lkZV9l
ZmZlY3QoKmFyZ3MsICoqa3dhcmdzKQ0KKyAgICAgICAgICAgIGlmIHJldF92YWwgaXMgREVGQVVM
VDoNCisgICAgICAgICAgICAgICAgcmV0X3ZhbCA9IHNlbGYucmV0dXJuX3ZhbHVlDQorICAgICAg
ICANCisgICAgICAgIGlmIHNlbGYuX3dyYXBzIGlzIG5vdCBOb25lIGFuZCBzZWxmLl9yZXR1cm5f
dmFsdWUgaXMgREVGQVVMVDoNCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fd3JhcHMoKmFyZ3Ms
ICoqa3dhcmdzKQ0KKyAgICAgICAgaWYgcmV0X3ZhbCBpcyBERUZBVUxUOg0KKyAgICAgICAgICAg
IHJldF92YWwgPSBzZWxmLnJldHVybl92YWx1ZQ0KKyAgICAgICAgcmV0dXJuIHJldF92YWwNCisg
ICAgDQorICAgIA0KKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6DQorICAgICAgICBp
ZiBzZWxmLl9tZXRob2RzIGlzIG5vdCBOb25lOg0KKyAgICAgICAgICAgIGlmIG5hbWUgbm90IGlu
IHNlbGYuX21ldGhvZHM6DQorICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCJN
b2NrIG9iamVjdCBoYXMgbm8gYXR0cmlidXRlICclcyciICUgbmFtZSkNCisgICAgICAgIGVsaWYg
X2lzX21hZ2ljKG5hbWUpOg0KKyAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKG5hbWUp
DQorICAgICAgICANCisgICAgICAgIGlmIG5hbWUgbm90IGluIHNlbGYuX2NoaWxkcmVuOg0KKyAg
ICAgICAgICAgIHdyYXBzID0gTm9uZQ0KKyAgICAgICAgICAgIGlmIHNlbGYuX3dyYXBzIGlzIG5v
dCBOb25lOg0KKyAgICAgICAgICAgICAgICB3cmFwcyA9IGdldGF0dHIoc2VsZi5fd3JhcHMsIG5h
bWUpDQorICAgICAgICAgICAgc2VsZi5fY2hpbGRyZW5bbmFtZV0gPSBNb2NrKHBhcmVudD1zZWxm
LCBuYW1lPW5hbWUsIHdyYXBzPXdyYXBzKQ0KKyAgICAgICAgICAgIA0KKyAgICAgICAgcmV0dXJu
IHNlbGYuX2NoaWxkcmVuW25hbWVdDQorICAgIA0KKyAgICANCisgICAgZGVmIGFzc2VydF9jYWxs
ZWRfd2l0aChzZWxmLCAqYXJncywgKiprd2FyZ3MpOg0KKyAgICAgICAgYXNzZXJ0IHNlbGYuY2Fs
bF9hcmdzID09IChhcmdzLCBrd2FyZ3MpLCAnRXhwZWN0ZWQ6ICVzXG5DYWxsZWQgd2l0aDogJXMn
ICUgKChhcmdzLCBrd2FyZ3MpLCBzZWxmLmNhbGxfYXJncykNCisgICAgICAgIA0KKw0KK2RlZiBf
ZG90X2xvb2t1cCh0aGluZywgY29tcCwgaW1wb3J0X3BhdGgpOg0KKyAgICB0cnk6DQorICAgICAg
ICByZXR1cm4gZ2V0YXR0cih0aGluZywgY29tcCkNCisgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9y
Og0KKyAgICAgICAgX19pbXBvcnRfXyhpbXBvcnRfcGF0aCkNCisgICAgICAgIHJldHVybiBnZXRh
dHRyKHRoaW5nLCBjb21wKQ0KKw0KKw0KK2RlZiBfaW1wb3J0ZXIodGFyZ2V0KToNCisgICAgY29t
cG9uZW50cyA9IHRhcmdldC5zcGxpdCgnLicpDQorICAgIGltcG9ydF9wYXRoID0gY29tcG9uZW50
cy5wb3AoMCkNCisgICAgdGhpbmcgPSBfX2ltcG9ydF9fKGltcG9ydF9wYXRoKQ0KKw0KKyAgICBm
b3IgY29tcCBpbiBjb21wb25lbnRzOg0KKyAgICAgICAgaW1wb3J0X3BhdGggKz0gIi4lcyIgJSBj
b21wDQorICAgICAgICB0aGluZyA9IF9kb3RfbG9va3VwKHRoaW5nLCBjb21wLCBpbXBvcnRfcGF0
aCkNCisgICAgcmV0dXJuIHRoaW5nDQorDQorDQorY2xhc3MgX3BhdGNoKG9iamVjdCk6DQorICAg
IGRlZiBfX2luaXRfXyhzZWxmLCB0YXJnZXQsIGF0dHJpYnV0ZSwgbmV3LCBzcGVjLCBjcmVhdGUp
Og0KKyAgICAgICAgc2VsZi50YXJnZXQgPSB0YXJnZXQNCisgICAgICAgIHNlbGYuYXR0cmlidXRl
ID0gYXR0cmlidXRlDQorICAgICAgICBzZWxmLm5ldyA9IG5ldw0KKyAgICAgICAgc2VsZi5zcGVj
ID0gc3BlYw0KKyAgICAgICAgc2VsZi5jcmVhdGUgPSBjcmVhdGUNCisgICAgICAgIHNlbGYuaGFz
X2xvY2FsID0gRmFsc2UNCisNCisNCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsIGZ1bmMpOg0KKyAg
ICAgICAgaWYgaGFzYXR0cihmdW5jLCAncGF0Y2hpbmdzJyk6DQorICAgICAgICAgICAgZnVuYy5w
YXRjaGluZ3MuYXBwZW5kKHNlbGYpDQorICAgICAgICAgICAgcmV0dXJuIGZ1bmMNCisNCisgICAg
ICAgIGRlZiBwYXRjaGVkKCphcmdzLCAqKmtleXdhcmdzKToNCisgICAgICAgICAgICAjIGRvbid0
IHVzZSBhIHdpdGggaGVyZSAoYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkgd2l0aCAyLjUpDQorICAg
ICAgICAgICAgZXh0cmFfYXJncyA9IFtdDQorICAgICAgICAgICAgZm9yIHBhdGNoaW5nIGluIHBh
dGNoZWQucGF0Y2hpbmdzOg0KKyAgICAgICAgICAgICAgICBhcmcgPSBwYXRjaGluZy5fX2VudGVy
X18oKQ0KKyAgICAgICAgICAgICAgICBpZiBwYXRjaGluZy5uZXcgaXMgREVGQVVMVDoNCisgICAg
ICAgICAgICAgICAgICAgIGV4dHJhX2FyZ3MuYXBwZW5kKGFyZykNCisgICAgICAgICAgICBhcmdz
ICs9IHR1cGxlKGV4dHJhX2FyZ3MpDQorICAgICAgICAgICAgdHJ5Og0KKyAgICAgICAgICAgICAg
ICByZXR1cm4gZnVuYygqYXJncywgKiprZXl3YXJncykNCisgICAgICAgICAgICBmaW5hbGx5Og0K
KyAgICAgICAgICAgICAgICBmb3IgcGF0Y2hpbmcgaW4gZ2V0YXR0cihwYXRjaGVkLCAncGF0Y2hp
bmdzJywgW10pOg0KKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hpbmcuX19leGl0X18oKQ0KKw0K
KyAgICAgICAgcGF0Y2hlZC5wYXRjaGluZ3MgPSBbc2VsZl0NCisgICAgICAgIHBhdGNoZWQuX19u
YW1lX18gPSBmdW5jLl9fbmFtZV9fIA0KKyAgICAgICAgcGF0Y2hlZC5jb21wYXRfY29fZmlyc3Rs
aW5lbm8gPSBnZXRhdHRyKGZ1bmMsICJjb21wYXRfY29fZmlyc3RsaW5lbm8iLCANCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jLmZ1bmNfY29kZS5j
b19maXJzdGxpbmVubykNCisgICAgICAgIHJldHVybiBwYXRjaGVkDQorDQorDQorICAgIGRlZiBn
ZXRfb3JpZ2luYWwoc2VsZik6DQorICAgICAgICB0YXJnZXQgPSBzZWxmLnRhcmdldA0KKyAgICAg
ICAgbmFtZSA9IHNlbGYuYXR0cmlidXRlDQorICAgICAgICBjcmVhdGUgPSBzZWxmLmNyZWF0ZQ0K
KyAgICAgICAgDQorICAgICAgICBvcmlnaW5hbCA9IERFRkFVTFQNCisgICAgICAgIGlmIF9oYXNf
bG9jYWxfYXR0cih0YXJnZXQsIG5hbWUpOg0KKyAgICAgICAgICAgIHRyeToNCisgICAgICAgICAg
ICAgICAgb3JpZ2luYWwgPSB0YXJnZXQuX19kaWN0X19bbmFtZV0NCisgICAgICAgICAgICBleGNl
cHQgQXR0cmlidXRlRXJyb3I6DQorICAgICAgICAgICAgICAgICMgZm9yIGluc3RhbmNlcyBvZiBj
bGFzc2VzIHdpdGggc2xvdHMsIHRoZXkgaGF2ZSBubyBfX2RpY3RfXw0KKyAgICAgICAgICAgICAg
ICBvcmlnaW5hbCA9IGdldGF0dHIodGFyZ2V0LCBuYW1lKQ0KKyAgICAgICAgZWxpZiBub3QgY3Jl
YXRlIGFuZCBub3QgaGFzYXR0cih0YXJnZXQsIG5hbWUpOg0KKyAgICAgICAgICAgIHJhaXNlIEF0
dHJpYnV0ZUVycm9yKCIlcyBkb2VzIG5vdCBoYXZlIHRoZSBhdHRyaWJ1dGUgJXIiICUgKHRhcmdl
dCwgbmFtZSkpDQorICAgICAgICByZXR1cm4gb3JpZ2luYWwNCisNCisgICAgDQorICAgIGRlZiBf
X2VudGVyX18oc2VsZik6DQorICAgICAgICBuZXcsIHNwZWMsID0gc2VsZi5uZXcsIHNlbGYuc3Bl
Yw0KKyAgICAgICAgb3JpZ2luYWwgPSBzZWxmLmdldF9vcmlnaW5hbCgpDQorICAgICAgICBpZiBu
ZXcgaXMgREVGQVVMVDoNCisgICAgICAgICAgICAjIFhYWFggd2hhdCBpZiBvcmlnaW5hbCBpcyBE
RUZBVUxUIC0gc2hvdWxkbid0IHVzZSBpdCBhcyBhIHNwZWMNCisgICAgICAgICAgICBpbmhlcml0
ID0gRmFsc2UNCisgICAgICAgICAgICBpZiBzcGVjID09IFRydWU6DQorICAgICAgICAgICAgICAg
ICMgc2V0IHNwZWMgdG8gdGhlIG9iamVjdCB3ZSBhcmUgcmVwbGFjaW5nDQorICAgICAgICAgICAg
ICAgIHNwZWMgPSBvcmlnaW5hbA0KKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNwZWMs
ICh0eXBlLCBDbGFzc1R5cGUpKToNCisgICAgICAgICAgICAgICAgICAgIGluaGVyaXQgPSBUcnVl
DQorICAgICAgICAgICAgbmV3ID0gTW9jayhzcGVjPXNwZWMpDQorICAgICAgICAgICAgaWYgaW5o
ZXJpdDoNCisgICAgICAgICAgICAgICAgbmV3LnJldHVybl92YWx1ZSA9IE1vY2soc3BlYz1zcGVj
KQ0KKyAgICAgICAgc2VsZi50ZW1wX29yaWdpbmFsID0gb3JpZ2luYWwNCisgICAgICAgIHNldGF0
dHIoc2VsZi50YXJnZXQsIHNlbGYuYXR0cmlidXRlLCBuZXcpDQorICAgICAgICByZXR1cm4gbmV3
DQorDQorDQorICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqXyk6DQorICAgICAgICBpZiBzZWxmLnRl
bXBfb3JpZ2luYWwgaXMgbm90IERFRkFVTFQ6DQorICAgICAgICAgICAgc2V0YXR0cihzZWxmLnRh
cmdldCwgc2VsZi5hdHRyaWJ1dGUsIHNlbGYudGVtcF9vcmlnaW5hbCkNCisgICAgICAgIGVsc2U6
DQorICAgICAgICAgICAgZGVsYXR0cihzZWxmLnRhcmdldCwgc2VsZi5hdHRyaWJ1dGUpDQorICAg
ICAgICBkZWwgc2VsZi50ZW1wX29yaWdpbmFsDQorICAgICAgICAgICAgDQorICAgICAgICAgICAg
ICAgIA0KK2RlZiBwYXRjaF9vYmplY3QodGFyZ2V0LCBhdHRyaWJ1dGUsIG5ldz1ERUZBVUxULCBz
cGVjPU5vbmUsIGNyZWF0ZT1GYWxzZSk6DQorICAgIHJldHVybiBfcGF0Y2godGFyZ2V0LCBhdHRy
aWJ1dGUsIG5ldywgc3BlYywgY3JlYXRlKQ0KKw0KKw0KK2RlZiBwYXRjaCh0YXJnZXQsIG5ldz1E
RUZBVUxULCBzcGVjPU5vbmUsIGNyZWF0ZT1GYWxzZSk6DQorICAgIHRyeToNCisgICAgICAgIHRh
cmdldCwgYXR0cmlidXRlID0gdGFyZ2V0LnJzcGxpdCgnLicsIDEpICAgIA0KKyAgICBleGNlcHQg
KFR5cGVFcnJvciwgVmFsdWVFcnJvcik6DQorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIk5lZWQg
YSB2YWxpZCB0YXJnZXQgdG8gcGF0Y2guIFlvdSBzdXBwbGllZDogJXIiICUgKHRhcmdldCwpKQ0K
KyAgICB0YXJnZXQgPSBfaW1wb3J0ZXIodGFyZ2V0KQ0KKyAgICByZXR1cm4gX3BhdGNoKHRhcmdl
dCwgYXR0cmlidXRlLCBuZXcsIHNwZWMsIGNyZWF0ZSkNCisNCisNCisNCitkZWYgX2hhc19sb2Nh
bF9hdHRyKG9iaiwgbmFtZSk6DQorICAgIHRyeToNCisgICAgICAgIHJldHVybiBuYW1lIGluIHZh
cnMob2JqKQ0KKyAgICBleGNlcHQgVHlwZUVycm9yOg0KKyAgICAgICAgIyBvYmplY3RzIHdpdGhv
dXQgYSBfX2RpY3RfXw0KKyAgICAgICAgcmV0dXJuIGhhc2F0dHIob2JqLCBuYW1lKQ0KSW5kZXg6
IFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdGhpcmRwYXJ0eS9tb2NrLnB5Cj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdGhpcmRwYXJ0eS9tb2NrLnB5CShy
ZXZpc2lvbiA1NTM1NykKKysrIFdlYktpdFRvb2xzL1NjcmlwdHMvd2Via2l0cHkvdGhpcmRwYXJ0
eS9tb2NrLnB5CSh3b3JraW5nIGNvcHkpCkBAIC0xLDMwOSArMSwzMDkgQEAKLSMgbW9jay5weQ0K
LSMgVGVzdCB0b29scyBmb3IgbW9ja2luZyBhbmQgcGF0Y2hpbmcuDQotIyBDb3B5cmlnaHQgKEMp
IDIwMDctMjAwOSBNaWNoYWVsIEZvb3JkDQotIyBFLW1haWw6IGZ1enp5bWFuIEFUIHZvaWRzcGFj
ZSBET1Qgb3JnIERPVCB1aw0KLQ0KLSMgbW9jayAwLjYuMA0KLSMgaHR0cDovL3d3dy52b2lkc3Bh
Y2Uub3JnLnVrL3B5dGhvbi9tb2NrLw0KLQ0KLSMgUmVsZWFzZWQgc3ViamVjdCB0byB0aGUgQlNE
IExpY2Vuc2UNCi0jIFBsZWFzZSBzZWUgaHR0cDovL3d3dy52b2lkc3BhY2Uub3JnLnVrL3B5dGhv
bi9saWNlbnNlLnNodG1sDQotDQotIyAyMDA5LTExLTI1OiBMaWNlbmNlIGRvd25sb2FkZWQgZnJv
bSBhYm92ZSBVUkwuDQotIyBCRUdJTiBET1dOTE9BREVEIExJQ0VOU0UNCi0jDQotIyBDb3B5cmln
aHQgKGMpIDIwMDMtMjAwOSwgTWljaGFlbCBGb29yZA0KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4N
Ci0jIEUtbWFpbCA6IGZ1enp5bWFuIEFUIHZvaWRzcGFjZSBET1Qgb3JnIERPVCB1aw0KLSMgDQot
IyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQNCi0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUNCi0jIG1ldDoNCi0jIA0KLSMgDQotIyAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodA0KLSMgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KLSMgDQotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlDQotIyAgICAgICBjb3B5cmlnaHQg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZw0KLSMgICAg
ICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkDQotIyAgICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uDQotIyANCi0jICAgICAq
IE5laXRoZXIgdGhlIG5hbWUgb2YgTWljaGFlbCBGb29yZCBub3IgdGhlIG5hbWUgb2YgVm9pZHNw
YWNlDQotIyAgICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMg
ZGVyaXZlZCBmcm9tIHRoaXMNCi0jICAgICAgIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJp
b3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KLSMgDQotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTDQotIyAiQVMgSVMiIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVA0K
LSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SDQotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVA0KLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsDQotIyBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UDQotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwNCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQ0KLSMgVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVA0KLSMg
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFDQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KLSMNCi0jIEVORCBET1dOTE9BREVEIExJQ0VO
U0UNCi0NCi0jIFNjcmlwdHMgbWFpbnRhaW5lZCBhdCBodHRwOi8vd3d3LnZvaWRzcGFjZS5vcmcu
dWsvcHl0aG9uL2luZGV4LnNodG1sDQotIyBDb21tZW50cywgc3VnZ2VzdGlvbnMgYW5kIGJ1ZyBy
ZXBvcnRzIHdlbGNvbWUuDQotDQotDQotX19hbGxfXyA9ICgNCi0gICAgJ01vY2snLA0KLSAgICAn
cGF0Y2gnLA0KLSAgICAncGF0Y2hfb2JqZWN0JywNCi0gICAgJ3NlbnRpbmVsJywNCi0gICAgJ0RF
RkFVTFQnDQotKQ0KLQ0KLV9fdmVyc2lvbl9fID0gJzAuNi4wJw0KLQ0KLWNsYXNzIFNlbnRpbmVs
T2JqZWN0KG9iamVjdCk6DQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lKToNCi0gICAgICAg
IHNlbGYubmFtZSA9IG5hbWUNCi0gICAgICAgIA0KLSAgICBkZWYgX19yZXByX18oc2VsZik6DQot
ICAgICAgICByZXR1cm4gJzxTZW50aW5lbE9iamVjdCAiJXMiPicgJSBzZWxmLm5hbWUNCi0NCi0N
Ci1jbGFzcyBTZW50aW5lbChvYmplY3QpOg0KLSAgICBkZWYgX19pbml0X18oc2VsZik6DQotICAg
ICAgICBzZWxmLl9zZW50aW5lbHMgPSB7fQ0KLSAgICAgICAgDQotICAgIGRlZiBfX2dldGF0dHJf
XyhzZWxmLCBuYW1lKToNCi0gICAgICAgIHJldHVybiBzZWxmLl9zZW50aW5lbHMuc2V0ZGVmYXVs
dChuYW1lLCBTZW50aW5lbE9iamVjdChuYW1lKSkNCi0gICAgDQotICAgIA0KLXNlbnRpbmVsID0g
U2VudGluZWwoKQ0KLQ0KLURFRkFVTFQgPSBzZW50aW5lbC5ERUZBVUxUDQotDQotY2xhc3MgT2xk
U3R5bGVDbGFzczoNCi0gICAgcGFzcw0KLUNsYXNzVHlwZSA9IHR5cGUoT2xkU3R5bGVDbGFzcykN
Ci0NCi1kZWYgX2lzX21hZ2ljKG5hbWUpOg0KLSAgICByZXR1cm4gJ19fJXNfXycgJSBuYW1lWzI6
LTJdID09IG5hbWUNCi0NCi1kZWYgX2NvcHkodmFsdWUpOg0KLSAgICBpZiB0eXBlKHZhbHVlKSBp
biAoZGljdCwgbGlzdCwgdHVwbGUsIHNldCk6DQotICAgICAgICByZXR1cm4gdHlwZSh2YWx1ZSko
dmFsdWUpDQotICAgIHJldHVybiB2YWx1ZQ0KLQ0KLQ0KLWNsYXNzIE1vY2sob2JqZWN0KToNCi0N
Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHNwZWM9Tm9uZSwgc2lkZV9lZmZlY3Q9Tm9uZSwgcmV0
dXJuX3ZhbHVlPURFRkFVTFQsIA0KLSAgICAgICAgICAgICAgICAgbmFtZT1Ob25lLCBwYXJlbnQ9
Tm9uZSwgd3JhcHM9Tm9uZSk6DQotICAgICAgICBzZWxmLl9wYXJlbnQgPSBwYXJlbnQNCi0gICAg
ICAgIHNlbGYuX25hbWUgPSBuYW1lDQotICAgICAgICBpZiBzcGVjIGlzIG5vdCBOb25lIGFuZCBu
b3QgaXNpbnN0YW5jZShzcGVjLCBsaXN0KToNCi0gICAgICAgICAgICBzcGVjID0gW21lbWJlciBm
b3IgbWVtYmVyIGluIGRpcihzcGVjKSBpZiBub3QgX2lzX21hZ2ljKG1lbWJlcildDQotICAgICAg
ICANCi0gICAgICAgIHNlbGYuX21ldGhvZHMgPSBzcGVjDQotICAgICAgICBzZWxmLl9jaGlsZHJl
biA9IHt9DQotICAgICAgICBzZWxmLl9yZXR1cm5fdmFsdWUgPSByZXR1cm5fdmFsdWUNCi0gICAg
ICAgIHNlbGYuc2lkZV9lZmZlY3QgPSBzaWRlX2VmZmVjdA0KLSAgICAgICAgc2VsZi5fd3JhcHMg
PSB3cmFwcw0KLSAgICAgICAgDQotICAgICAgICBzZWxmLnJlc2V0X21vY2soKQ0KLSAgICAgICAg
DQotDQotICAgIGRlZiByZXNldF9tb2NrKHNlbGYpOg0KLSAgICAgICAgc2VsZi5jYWxsZWQgPSBG
YWxzZQ0KLSAgICAgICAgc2VsZi5jYWxsX2FyZ3MgPSBOb25lDQotICAgICAgICBzZWxmLmNhbGxf
Y291bnQgPSAwDQotICAgICAgICBzZWxmLmNhbGxfYXJnc19saXN0ID0gW10NCi0gICAgICAgIHNl
bGYubWV0aG9kX2NhbGxzID0gW10NCi0gICAgICAgIGZvciBjaGlsZCBpbiBzZWxmLl9jaGlsZHJl
bi5pdGVydmFsdWVzKCk6DQotICAgICAgICAgICAgY2hpbGQucmVzZXRfbW9jaygpDQotICAgICAg
ICBpZiBpc2luc3RhbmNlKHNlbGYuX3JldHVybl92YWx1ZSwgTW9jayk6DQotICAgICAgICAgICAg
c2VsZi5fcmV0dXJuX3ZhbHVlLnJlc2V0X21vY2soKQ0KLSAgICAgICAgDQotICAgIA0KLSAgICBk
ZWYgX19nZXRfcmV0dXJuX3ZhbHVlKHNlbGYpOg0KLSAgICAgICAgaWYgc2VsZi5fcmV0dXJuX3Zh
bHVlIGlzIERFRkFVTFQ6DQotICAgICAgICAgICAgc2VsZi5fcmV0dXJuX3ZhbHVlID0gTW9jaygp
DQotICAgICAgICByZXR1cm4gc2VsZi5fcmV0dXJuX3ZhbHVlDQotICAgIA0KLSAgICBkZWYgX19z
ZXRfcmV0dXJuX3ZhbHVlKHNlbGYsIHZhbHVlKToNCi0gICAgICAgIHNlbGYuX3JldHVybl92YWx1
ZSA9IHZhbHVlDQotICAgICAgICANCi0gICAgcmV0dXJuX3ZhbHVlID0gcHJvcGVydHkoX19nZXRf
cmV0dXJuX3ZhbHVlLCBfX3NldF9yZXR1cm5fdmFsdWUpDQotDQotDQotICAgIGRlZiBfX2NhbGxf
XyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOg0KLSAgICAgICAgc2VsZi5jYWxsZWQgPSBUcnVlDQot
ICAgICAgICBzZWxmLmNhbGxfY291bnQgKz0gMQ0KLSAgICAgICAgc2VsZi5jYWxsX2FyZ3MgPSAo
YXJncywga3dhcmdzKQ0KLSAgICAgICAgc2VsZi5jYWxsX2FyZ3NfbGlzdC5hcHBlbmQoKGFyZ3Ms
IGt3YXJncykpDQotICAgICAgICANCi0gICAgICAgIHBhcmVudCA9IHNlbGYuX3BhcmVudA0KLSAg
ICAgICAgbmFtZSA9IHNlbGYuX25hbWUNCi0gICAgICAgIHdoaWxlIHBhcmVudCBpcyBub3QgTm9u
ZToNCi0gICAgICAgICAgICBwYXJlbnQubWV0aG9kX2NhbGxzLmFwcGVuZCgobmFtZSwgYXJncywg
a3dhcmdzKSkNCi0gICAgICAgICAgICBpZiBwYXJlbnQuX3BhcmVudCBpcyBOb25lOg0KLSAgICAg
ICAgICAgICAgICBicmVhaw0KLSAgICAgICAgICAgIG5hbWUgPSBwYXJlbnQuX25hbWUgKyAnLicg
KyBuYW1lDQotICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50Ll9wYXJlbnQNCi0gICAgICAgIA0K
LSAgICAgICAgcmV0X3ZhbCA9IERFRkFVTFQNCi0gICAgICAgIGlmIHNlbGYuc2lkZV9lZmZlY3Qg
aXMgbm90IE5vbmU6DQotICAgICAgICAgICAgaWYgKGlzaW5zdGFuY2Uoc2VsZi5zaWRlX2VmZmVj
dCwgRXhjZXB0aW9uKSBvciANCi0gICAgICAgICAgICAgICAgaXNpbnN0YW5jZShzZWxmLnNpZGVf
ZWZmZWN0LCAodHlwZSwgQ2xhc3NUeXBlKSkgYW5kDQotICAgICAgICAgICAgICAgIGlzc3ViY2xh
c3Moc2VsZi5zaWRlX2VmZmVjdCwgRXhjZXB0aW9uKSk6DQotICAgICAgICAgICAgICAgIHJhaXNl
IHNlbGYuc2lkZV9lZmZlY3QNCi0gICAgICAgICAgICANCi0gICAgICAgICAgICByZXRfdmFsID0g
c2VsZi5zaWRlX2VmZmVjdCgqYXJncywgKiprd2FyZ3MpDQotICAgICAgICAgICAgaWYgcmV0X3Zh
bCBpcyBERUZBVUxUOg0KLSAgICAgICAgICAgICAgICByZXRfdmFsID0gc2VsZi5yZXR1cm5fdmFs
dWUNCi0gICAgICAgIA0KLSAgICAgICAgaWYgc2VsZi5fd3JhcHMgaXMgbm90IE5vbmUgYW5kIHNl
bGYuX3JldHVybl92YWx1ZSBpcyBERUZBVUxUOg0KLSAgICAgICAgICAgIHJldHVybiBzZWxmLl93
cmFwcygqYXJncywgKiprd2FyZ3MpDQotICAgICAgICBpZiByZXRfdmFsIGlzIERFRkFVTFQ6DQot
ICAgICAgICAgICAgcmV0X3ZhbCA9IHNlbGYucmV0dXJuX3ZhbHVlDQotICAgICAgICByZXR1cm4g
cmV0X3ZhbA0KLSAgICANCi0gICAgDQotICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToN
Ci0gICAgICAgIGlmIHNlbGYuX21ldGhvZHMgaXMgbm90IE5vbmU6DQotICAgICAgICAgICAgaWYg
bmFtZSBub3QgaW4gc2VsZi5fbWV0aG9kczoNCi0gICAgICAgICAgICAgICAgcmFpc2UgQXR0cmli
dXRlRXJyb3IoIk1vY2sgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJyVzJyIgJSBuYW1lKQ0KLSAg
ICAgICAgZWxpZiBfaXNfbWFnaWMobmFtZSk6DQotICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRl
RXJyb3IobmFtZSkNCi0gICAgICAgIA0KLSAgICAgICAgaWYgbmFtZSBub3QgaW4gc2VsZi5fY2hp
bGRyZW46DQotICAgICAgICAgICAgd3JhcHMgPSBOb25lDQotICAgICAgICAgICAgaWYgc2VsZi5f
d3JhcHMgaXMgbm90IE5vbmU6DQotICAgICAgICAgICAgICAgIHdyYXBzID0gZ2V0YXR0cihzZWxm
Ll93cmFwcywgbmFtZSkNCi0gICAgICAgICAgICBzZWxmLl9jaGlsZHJlbltuYW1lXSA9IE1vY2so
cGFyZW50PXNlbGYsIG5hbWU9bmFtZSwgd3JhcHM9d3JhcHMpDQotICAgICAgICAgICAgDQotICAg
ICAgICByZXR1cm4gc2VsZi5fY2hpbGRyZW5bbmFtZV0NCi0gICAgDQotICAgIA0KLSAgICBkZWYg
YXNzZXJ0X2NhbGxlZF93aXRoKHNlbGYsICphcmdzLCAqKmt3YXJncyk6DQotICAgICAgICBhc3Nl
cnQgc2VsZi5jYWxsX2FyZ3MgPT0gKGFyZ3MsIGt3YXJncyksICdFeHBlY3RlZDogJXNcbkNhbGxl
ZCB3aXRoOiAlcycgJSAoKGFyZ3MsIGt3YXJncyksIHNlbGYuY2FsbF9hcmdzKQ0KLSAgICAgICAg
DQotDQotZGVmIF9kb3RfbG9va3VwKHRoaW5nLCBjb21wLCBpbXBvcnRfcGF0aCk6DQotICAgIHRy
eToNCi0gICAgICAgIHJldHVybiBnZXRhdHRyKHRoaW5nLCBjb21wKQ0KLSAgICBleGNlcHQgQXR0
cmlidXRlRXJyb3I6DQotICAgICAgICBfX2ltcG9ydF9fKGltcG9ydF9wYXRoKQ0KLSAgICAgICAg
cmV0dXJuIGdldGF0dHIodGhpbmcsIGNvbXApDQotDQotDQotZGVmIF9pbXBvcnRlcih0YXJnZXQp
Og0KLSAgICBjb21wb25lbnRzID0gdGFyZ2V0LnNwbGl0KCcuJykNCi0gICAgaW1wb3J0X3BhdGgg
PSBjb21wb25lbnRzLnBvcCgwKQ0KLSAgICB0aGluZyA9IF9faW1wb3J0X18oaW1wb3J0X3BhdGgp
DQotDQotICAgIGZvciBjb21wIGluIGNvbXBvbmVudHM6DQotICAgICAgICBpbXBvcnRfcGF0aCAr
PSAiLiVzIiAlIGNvbXANCi0gICAgICAgIHRoaW5nID0gX2RvdF9sb29rdXAodGhpbmcsIGNvbXAs
IGltcG9ydF9wYXRoKQ0KLSAgICByZXR1cm4gdGhpbmcNCi0NCi0NCi1jbGFzcyBfcGF0Y2gob2Jq
ZWN0KToNCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHRhcmdldCwgYXR0cmlidXRlLCBuZXcsIHNw
ZWMsIGNyZWF0ZSk6DQotICAgICAgICBzZWxmLnRhcmdldCA9IHRhcmdldA0KLSAgICAgICAgc2Vs
Zi5hdHRyaWJ1dGUgPSBhdHRyaWJ1dGUNCi0gICAgICAgIHNlbGYubmV3ID0gbmV3DQotICAgICAg
ICBzZWxmLnNwZWMgPSBzcGVjDQotICAgICAgICBzZWxmLmNyZWF0ZSA9IGNyZWF0ZQ0KLSAgICAg
ICAgc2VsZi5oYXNfbG9jYWwgPSBGYWxzZQ0KLQ0KLQ0KLSAgICBkZWYgX19jYWxsX18oc2VsZiwg
ZnVuYyk6DQotICAgICAgICBpZiBoYXNhdHRyKGZ1bmMsICdwYXRjaGluZ3MnKToNCi0gICAgICAg
ICAgICBmdW5jLnBhdGNoaW5ncy5hcHBlbmQoc2VsZikNCi0gICAgICAgICAgICByZXR1cm4gZnVu
Yw0KLQ0KLSAgICAgICAgZGVmIHBhdGNoZWQoKmFyZ3MsICoqa2V5d2FyZ3MpOg0KLSAgICAgICAg
ICAgICMgZG9uJ3QgdXNlIGEgd2l0aCBoZXJlIChiYWNrd2FyZHMgY29tcGF0YWJpbGl0eSB3aXRo
IDIuNSkNCi0gICAgICAgICAgICBleHRyYV9hcmdzID0gW10NCi0gICAgICAgICAgICBmb3IgcGF0
Y2hpbmcgaW4gcGF0Y2hlZC5wYXRjaGluZ3M6DQotICAgICAgICAgICAgICAgIGFyZyA9IHBhdGNo
aW5nLl9fZW50ZXJfXygpDQotICAgICAgICAgICAgICAgIGlmIHBhdGNoaW5nLm5ldyBpcyBERUZB
VUxUOg0KLSAgICAgICAgICAgICAgICAgICAgZXh0cmFfYXJncy5hcHBlbmQoYXJnKQ0KLSAgICAg
ICAgICAgIGFyZ3MgKz0gdHVwbGUoZXh0cmFfYXJncykNCi0gICAgICAgICAgICB0cnk6DQotICAg
ICAgICAgICAgICAgIHJldHVybiBmdW5jKCphcmdzLCAqKmtleXdhcmdzKQ0KLSAgICAgICAgICAg
IGZpbmFsbHk6DQotICAgICAgICAgICAgICAgIGZvciBwYXRjaGluZyBpbiBnZXRhdHRyKHBhdGNo
ZWQsICdwYXRjaGluZ3MnLCBbXSk6DQotICAgICAgICAgICAgICAgICAgICBwYXRjaGluZy5fX2V4
aXRfXygpDQotDQotICAgICAgICBwYXRjaGVkLnBhdGNoaW5ncyA9IFtzZWxmXQ0KLSAgICAgICAg
cGF0Y2hlZC5fX25hbWVfXyA9IGZ1bmMuX19uYW1lX18gDQotICAgICAgICBwYXRjaGVkLmNvbXBh
dF9jb19maXJzdGxpbmVubyA9IGdldGF0dHIoZnVuYywgImNvbXBhdF9jb19maXJzdGxpbmVubyIs
IA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMu
ZnVuY19jb2RlLmNvX2ZpcnN0bGluZW5vKQ0KLSAgICAgICAgcmV0dXJuIHBhdGNoZWQNCi0NCi0N
Ci0gICAgZGVmIGdldF9vcmlnaW5hbChzZWxmKToNCi0gICAgICAgIHRhcmdldCA9IHNlbGYudGFy
Z2V0DQotICAgICAgICBuYW1lID0gc2VsZi5hdHRyaWJ1dGUNCi0gICAgICAgIGNyZWF0ZSA9IHNl
bGYuY3JlYXRlDQotICAgICAgICANCi0gICAgICAgIG9yaWdpbmFsID0gREVGQVVMVA0KLSAgICAg
ICAgaWYgX2hhc19sb2NhbF9hdHRyKHRhcmdldCwgbmFtZSk6DQotICAgICAgICAgICAgdHJ5Og0K
LSAgICAgICAgICAgICAgICBvcmlnaW5hbCA9IHRhcmdldC5fX2RpY3RfX1tuYW1lXQ0KLSAgICAg
ICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoNCi0gICAgICAgICAgICAgICAgIyBmb3IgaW5z
dGFuY2VzIG9mIGNsYXNzZXMgd2l0aCBzbG90cywgdGhleSBoYXZlIG5vIF9fZGljdF9fDQotICAg
ICAgICAgICAgICAgIG9yaWdpbmFsID0gZ2V0YXR0cih0YXJnZXQsIG5hbWUpDQotICAgICAgICBl
bGlmIG5vdCBjcmVhdGUgYW5kIG5vdCBoYXNhdHRyKHRhcmdldCwgbmFtZSk6DQotICAgICAgICAg
ICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoIiVzIGRvZXMgbm90IGhhdmUgdGhlIGF0dHJpYnV0ZSAl
ciIgJSAodGFyZ2V0LCBuYW1lKSkNCi0gICAgICAgIHJldHVybiBvcmlnaW5hbA0KLQ0KLSAgICAN
Ci0gICAgZGVmIF9fZW50ZXJfXyhzZWxmKToNCi0gICAgICAgIG5ldywgc3BlYywgPSBzZWxmLm5l
dywgc2VsZi5zcGVjDQotICAgICAgICBvcmlnaW5hbCA9IHNlbGYuZ2V0X29yaWdpbmFsKCkNCi0g
ICAgICAgIGlmIG5ldyBpcyBERUZBVUxUOg0KLSAgICAgICAgICAgICMgWFhYWCB3aGF0IGlmIG9y
aWdpbmFsIGlzIERFRkFVTFQgLSBzaG91bGRuJ3QgdXNlIGl0IGFzIGEgc3BlYw0KLSAgICAgICAg
ICAgIGluaGVyaXQgPSBGYWxzZQ0KLSAgICAgICAgICAgIGlmIHNwZWMgPT0gVHJ1ZToNCi0gICAg
ICAgICAgICAgICAgIyBzZXQgc3BlYyB0byB0aGUgb2JqZWN0IHdlIGFyZSByZXBsYWNpbmcNCi0g
ICAgICAgICAgICAgICAgc3BlYyA9IG9yaWdpbmFsDQotICAgICAgICAgICAgICAgIGlmIGlzaW5z
dGFuY2Uoc3BlYywgKHR5cGUsIENsYXNzVHlwZSkpOg0KLSAgICAgICAgICAgICAgICAgICAgaW5o
ZXJpdCA9IFRydWUNCi0gICAgICAgICAgICBuZXcgPSBNb2NrKHNwZWM9c3BlYykNCi0gICAgICAg
ICAgICBpZiBpbmhlcml0Og0KLSAgICAgICAgICAgICAgICBuZXcucmV0dXJuX3ZhbHVlID0gTW9j
ayhzcGVjPXNwZWMpDQotICAgICAgICBzZWxmLnRlbXBfb3JpZ2luYWwgPSBvcmlnaW5hbA0KLSAg
ICAgICAgc2V0YXR0cihzZWxmLnRhcmdldCwgc2VsZi5hdHRyaWJ1dGUsIG5ldykNCi0gICAgICAg
IHJldHVybiBuZXcNCi0NCi0NCi0gICAgZGVmIF9fZXhpdF9fKHNlbGYsICpfKToNCi0gICAgICAg
IGlmIHNlbGYudGVtcF9vcmlnaW5hbCBpcyBub3QgREVGQVVMVDoNCi0gICAgICAgICAgICBzZXRh
dHRyKHNlbGYudGFyZ2V0LCBzZWxmLmF0dHJpYnV0ZSwgc2VsZi50ZW1wX29yaWdpbmFsKQ0KLSAg
ICAgICAgZWxzZToNCi0gICAgICAgICAgICBkZWxhdHRyKHNlbGYudGFyZ2V0LCBzZWxmLmF0dHJp
YnV0ZSkNCi0gICAgICAgIGRlbCBzZWxmLnRlbXBfb3JpZ2luYWwNCi0gICAgICAgICAgICANCi0g
ICAgICAgICAgICAgICAgDQotZGVmIHBhdGNoX29iamVjdCh0YXJnZXQsIGF0dHJpYnV0ZSwgbmV3
PURFRkFVTFQsIHNwZWM9Tm9uZSwgY3JlYXRlPUZhbHNlKToNCi0gICAgcmV0dXJuIF9wYXRjaCh0
YXJnZXQsIGF0dHJpYnV0ZSwgbmV3LCBzcGVjLCBjcmVhdGUpDQotDQotDQotZGVmIHBhdGNoKHRh
cmdldCwgbmV3PURFRkFVTFQsIHNwZWM9Tm9uZSwgY3JlYXRlPUZhbHNlKToNCi0gICAgdHJ5Og0K
LSAgICAgICAgdGFyZ2V0LCBhdHRyaWJ1dGUgPSB0YXJnZXQucnNwbGl0KCcuJywgMSkgICAgDQot
ICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yKToNCi0gICAgICAgIHJhaXNlIFR5cGVF
cnJvcigiTmVlZCBhIHZhbGlkIHRhcmdldCB0byBwYXRjaC4gWW91IHN1cHBsaWVkOiAlciIgJSAo
dGFyZ2V0LCkpDQotICAgIHRhcmdldCA9IF9pbXBvcnRlcih0YXJnZXQpDQotICAgIHJldHVybiBf
cGF0Y2godGFyZ2V0LCBhdHRyaWJ1dGUsIG5ldywgc3BlYywgY3JlYXRlKQ0KLQ0KLQ0KLQ0KLWRl
ZiBfaGFzX2xvY2FsX2F0dHIob2JqLCBuYW1lKToNCi0gICAgdHJ5Og0KLSAgICAgICAgcmV0dXJu
IG5hbWUgaW4gdmFycyhvYmopDQotICAgIGV4Y2VwdCBUeXBlRXJyb3I6DQotICAgICAgICAjIG9i
amVjdHMgd2l0aG91dCBhIF9fZGljdF9fDQotICAgICAgICByZXR1cm4gaGFzYXR0cihvYmosIG5h
bWUpDQorIyBtb2NrLnB5CisjIFRlc3QgdG9vbHMgZm9yIG1vY2tpbmcgYW5kIHBhdGNoaW5nLgor
IyBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBNaWNoYWVsIEZvb3JkCisjIEUtbWFpbDogZnV6enlt
YW4gQVQgdm9pZHNwYWNlIERPVCBvcmcgRE9UIHVrCisKKyMgbW9jayAwLjYuMAorIyBodHRwOi8v
d3d3LnZvaWRzcGFjZS5vcmcudWsvcHl0aG9uL21vY2svCisKKyMgUmVsZWFzZWQgc3ViamVjdCB0
byB0aGUgQlNEIExpY2Vuc2UKKyMgUGxlYXNlIHNlZSBodHRwOi8vd3d3LnZvaWRzcGFjZS5vcmcu
dWsvcHl0aG9uL2xpY2Vuc2Uuc2h0bWwKKworIyAyMDA5LTExLTI1OiBMaWNlbmNlIGRvd25sb2Fk
ZWQgZnJvbSBhYm92ZSBVUkwuCisjIEJFR0lOIERPV05MT0FERUQgTElDRU5TRQorIworIyBDb3B5
cmlnaHQgKGMpIDIwMDMtMjAwOSwgTWljaGFlbCBGb29yZAorIyBBbGwgcmlnaHRzIHJlc2VydmVk
LgorIyBFLW1haWwgOiBmdXp6eW1hbiBBVCB2b2lkc3BhY2UgRE9UIG9yZyBET1QgdWsKKyMKKyMg
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyMgbWV0OgorIworIworIyAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
IyAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisjCisjICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyMgICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKKyMgICAgICAgZGlzY2xhaW1lciBp
biB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCisjICAg
ICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgICAgICogTmVpdGhlciB0aGUgbmFtZSBv
ZiBNaWNoYWVsIEZvb3JkIG5vciB0aGUgbmFtZSBvZiBWb2lkc3BhY2UKKyMgICAgICAgbWF5IGJl
IHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCisj
ICAgICAgIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9u
LgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVS
UyBBTkQgQ09OVFJJQlVUT1JTCisjICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisjIExJTUlURUQgVE8sIFRIRSBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorIyBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlS
SUdIVAorIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwKKyMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyMgREFUQSwg
T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZCisjIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisjCisj
IEVORCBET1dOTE9BREVEIExJQ0VOU0UKKworIyBTY3JpcHRzIG1haW50YWluZWQgYXQgaHR0cDov
L3d3dy52b2lkc3BhY2Uub3JnLnVrL3B5dGhvbi9pbmRleC5zaHRtbAorIyBDb21tZW50cywgc3Vn
Z2VzdGlvbnMgYW5kIGJ1ZyByZXBvcnRzIHdlbGNvbWUuCisKKworX19hbGxfXyA9ICgKKyAgICAn
TW9jaycsCisgICAgJ3BhdGNoJywKKyAgICAncGF0Y2hfb2JqZWN0JywKKyAgICAnc2VudGluZWwn
LAorICAgICdERUZBVUxUJworKQorCitfX3ZlcnNpb25fXyA9ICcwLjYuMCcKKworY2xhc3MgU2Vu
dGluZWxPYmplY3Qob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6CisgICAg
ICAgIHNlbGYubmFtZSA9IG5hbWUKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAg
cmV0dXJuICc8U2VudGluZWxPYmplY3QgIiVzIj4nICUgc2VsZi5uYW1lCisKKworY2xhc3MgU2Vu
dGluZWwob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX3Nl
bnRpbmVscyA9IHt9CisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAg
IHJldHVybiBzZWxmLl9zZW50aW5lbHMuc2V0ZGVmYXVsdChuYW1lLCBTZW50aW5lbE9iamVjdChu
YW1lKSkKKworCitzZW50aW5lbCA9IFNlbnRpbmVsKCkKKworREVGQVVMVCA9IHNlbnRpbmVsLkRF
RkFVTFQKKworY2xhc3MgT2xkU3R5bGVDbGFzczoKKyAgICBwYXNzCitDbGFzc1R5cGUgPSB0eXBl
KE9sZFN0eWxlQ2xhc3MpCisKK2RlZiBfaXNfbWFnaWMobmFtZSk6CisgICAgcmV0dXJuICdfXyVz
X18nICUgbmFtZVsyOi0yXSA9PSBuYW1lCisKK2RlZiBfY29weSh2YWx1ZSk6CisgICAgaWYgdHlw
ZSh2YWx1ZSkgaW4gKGRpY3QsIGxpc3QsIHR1cGxlLCBzZXQpOgorICAgICAgICByZXR1cm4gdHlw
ZSh2YWx1ZSkodmFsdWUpCisgICAgcmV0dXJuIHZhbHVlCisKKworY2xhc3MgTW9jayhvYmplY3Qp
OgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNwZWM9Tm9uZSwgc2lkZV9lZmZlY3Q9Tm9uZSwg
cmV0dXJuX3ZhbHVlPURFRkFVTFQsCisgICAgICAgICAgICAgICAgIG5hbWU9Tm9uZSwgcGFyZW50
PU5vbmUsIHdyYXBzPU5vbmUpOgorICAgICAgICBzZWxmLl9wYXJlbnQgPSBwYXJlbnQKKyAgICAg
ICAgc2VsZi5fbmFtZSA9IG5hbWUKKyAgICAgICAgaWYgc3BlYyBpcyBub3QgTm9uZSBhbmQgbm90
IGlzaW5zdGFuY2Uoc3BlYywgbGlzdCk6CisgICAgICAgICAgICBzcGVjID0gW21lbWJlciBmb3Ig
bWVtYmVyIGluIGRpcihzcGVjKSBpZiBub3QgX2lzX21hZ2ljKG1lbWJlcildCisKKyAgICAgICAg
c2VsZi5fbWV0aG9kcyA9IHNwZWMKKyAgICAgICAgc2VsZi5fY2hpbGRyZW4gPSB7fQorICAgICAg
ICBzZWxmLl9yZXR1cm5fdmFsdWUgPSByZXR1cm5fdmFsdWUKKyAgICAgICAgc2VsZi5zaWRlX2Vm
ZmVjdCA9IHNpZGVfZWZmZWN0CisgICAgICAgIHNlbGYuX3dyYXBzID0gd3JhcHMKKworICAgICAg
ICBzZWxmLnJlc2V0X21vY2soKQorCisKKyAgICBkZWYgcmVzZXRfbW9jayhzZWxmKToKKyAgICAg
ICAgc2VsZi5jYWxsZWQgPSBGYWxzZQorICAgICAgICBzZWxmLmNhbGxfYXJncyA9IE5vbmUKKyAg
ICAgICAgc2VsZi5jYWxsX2NvdW50ID0gMAorICAgICAgICBzZWxmLmNhbGxfYXJnc19saXN0ID0g
W10KKyAgICAgICAgc2VsZi5tZXRob2RfY2FsbHMgPSBbXQorICAgICAgICBmb3IgY2hpbGQgaW4g
c2VsZi5fY2hpbGRyZW4uaXRlcnZhbHVlcygpOgorICAgICAgICAgICAgY2hpbGQucmVzZXRfbW9j
aygpCisgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5fcmV0dXJuX3ZhbHVlLCBNb2NrKToKKyAg
ICAgICAgICAgIHNlbGYuX3JldHVybl92YWx1ZS5yZXNldF9tb2NrKCkKKworCisgICAgZGVmIF9f
Z2V0X3JldHVybl92YWx1ZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fcmV0dXJuX3ZhbHVlIGlz
IERFRkFVTFQ6CisgICAgICAgICAgICBzZWxmLl9yZXR1cm5fdmFsdWUgPSBNb2NrKCkKKyAgICAg
ICAgcmV0dXJuIHNlbGYuX3JldHVybl92YWx1ZQorCisgICAgZGVmIF9fc2V0X3JldHVybl92YWx1
ZShzZWxmLCB2YWx1ZSk6CisgICAgICAgIHNlbGYuX3JldHVybl92YWx1ZSA9IHZhbHVlCisKKyAg
ICByZXR1cm5fdmFsdWUgPSBwcm9wZXJ0eShfX2dldF9yZXR1cm5fdmFsdWUsIF9fc2V0X3JldHVy
bl92YWx1ZSkKKworCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsICphcmdzLCAqKmt3YXJncyk6Cisg
ICAgICAgIHNlbGYuY2FsbGVkID0gVHJ1ZQorICAgICAgICBzZWxmLmNhbGxfY291bnQgKz0gMQor
ICAgICAgICBzZWxmLmNhbGxfYXJncyA9IChhcmdzLCBrd2FyZ3MpCisgICAgICAgIHNlbGYuY2Fs
bF9hcmdzX2xpc3QuYXBwZW5kKChhcmdzLCBrd2FyZ3MpKQorCisgICAgICAgIHBhcmVudCA9IHNl
bGYuX3BhcmVudAorICAgICAgICBuYW1lID0gc2VsZi5fbmFtZQorICAgICAgICB3aGlsZSBwYXJl
bnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBwYXJlbnQubWV0aG9kX2NhbGxzLmFwcGVuZCgo
bmFtZSwgYXJncywga3dhcmdzKSkKKyAgICAgICAgICAgIGlmIHBhcmVudC5fcGFyZW50IGlzIE5v
bmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIG5hbWUgPSBwYXJlbnQuX25h
bWUgKyAnLicgKyBuYW1lCisgICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuX3BhcmVudAorCisg
ICAgICAgIHJldF92YWwgPSBERUZBVUxUCisgICAgICAgIGlmIHNlbGYuc2lkZV9lZmZlY3QgaXMg
bm90IE5vbmU6CisgICAgICAgICAgICBpZiAoaXNpbnN0YW5jZShzZWxmLnNpZGVfZWZmZWN0LCBF
eGNlcHRpb24pIG9yCisgICAgICAgICAgICAgICAgaXNpbnN0YW5jZShzZWxmLnNpZGVfZWZmZWN0
LCAodHlwZSwgQ2xhc3NUeXBlKSkgYW5kCisgICAgICAgICAgICAgICAgaXNzdWJjbGFzcyhzZWxm
LnNpZGVfZWZmZWN0LCBFeGNlcHRpb24pKToKKyAgICAgICAgICAgICAgICByYWlzZSBzZWxmLnNp
ZGVfZWZmZWN0CisKKyAgICAgICAgICAgIHJldF92YWwgPSBzZWxmLnNpZGVfZWZmZWN0KCphcmdz
LCAqKmt3YXJncykKKyAgICAgICAgICAgIGlmIHJldF92YWwgaXMgREVGQVVMVDoKKyAgICAgICAg
ICAgICAgICByZXRfdmFsID0gc2VsZi5yZXR1cm5fdmFsdWUKKworICAgICAgICBpZiBzZWxmLl93
cmFwcyBpcyBub3QgTm9uZSBhbmQgc2VsZi5fcmV0dXJuX3ZhbHVlIGlzIERFRkFVTFQ6CisgICAg
ICAgICAgICByZXR1cm4gc2VsZi5fd3JhcHMoKmFyZ3MsICoqa3dhcmdzKQorICAgICAgICBpZiBy
ZXRfdmFsIGlzIERFRkFVTFQ6CisgICAgICAgICAgICByZXRfdmFsID0gc2VsZi5yZXR1cm5fdmFs
dWUKKyAgICAgICAgcmV0dXJuIHJldF92YWwKKworCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYs
IG5hbWUpOgorICAgICAgICBpZiBzZWxmLl9tZXRob2RzIGlzIG5vdCBOb25lOgorICAgICAgICAg
ICAgaWYgbmFtZSBub3QgaW4gc2VsZi5fbWV0aG9kczoKKyAgICAgICAgICAgICAgICByYWlzZSBB
dHRyaWJ1dGVFcnJvcigiTW9jayBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnJXMnIiAlIG5hbWUp
CisgICAgICAgIGVsaWYgX2lzX21hZ2ljKG5hbWUpOgorICAgICAgICAgICAgcmFpc2UgQXR0cmli
dXRlRXJyb3IobmFtZSkKKworICAgICAgICBpZiBuYW1lIG5vdCBpbiBzZWxmLl9jaGlsZHJlbjoK
KyAgICAgICAgICAgIHdyYXBzID0gTm9uZQorICAgICAgICAgICAgaWYgc2VsZi5fd3JhcHMgaXMg
bm90IE5vbmU6CisgICAgICAgICAgICAgICAgd3JhcHMgPSBnZXRhdHRyKHNlbGYuX3dyYXBzLCBu
YW1lKQorICAgICAgICAgICAgc2VsZi5fY2hpbGRyZW5bbmFtZV0gPSBNb2NrKHBhcmVudD1zZWxm
LCBuYW1lPW5hbWUsIHdyYXBzPXdyYXBzKQorCisgICAgICAgIHJldHVybiBzZWxmLl9jaGlsZHJl
bltuYW1lXQorCisKKyAgICBkZWYgYXNzZXJ0X2NhbGxlZF93aXRoKHNlbGYsICphcmdzLCAqKmt3
YXJncyk6CisgICAgICAgIGFzc2VydCBzZWxmLmNhbGxfYXJncyA9PSAoYXJncywga3dhcmdzKSwg
J0V4cGVjdGVkOiAlc1xuQ2FsbGVkIHdpdGg6ICVzJyAlICgoYXJncywga3dhcmdzKSwgc2VsZi5j
YWxsX2FyZ3MpCisKKworZGVmIF9kb3RfbG9va3VwKHRoaW5nLCBjb21wLCBpbXBvcnRfcGF0aCk6
CisgICAgdHJ5OgorICAgICAgICByZXR1cm4gZ2V0YXR0cih0aGluZywgY29tcCkKKyAgICBleGNl
cHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIF9faW1wb3J0X18oaW1wb3J0X3BhdGgpCisgICAg
ICAgIHJldHVybiBnZXRhdHRyKHRoaW5nLCBjb21wKQorCisKK2RlZiBfaW1wb3J0ZXIodGFyZ2V0
KToKKyAgICBjb21wb25lbnRzID0gdGFyZ2V0LnNwbGl0KCcuJykKKyAgICBpbXBvcnRfcGF0aCA9
IGNvbXBvbmVudHMucG9wKDApCisgICAgdGhpbmcgPSBfX2ltcG9ydF9fKGltcG9ydF9wYXRoKQor
CisgICAgZm9yIGNvbXAgaW4gY29tcG9uZW50czoKKyAgICAgICAgaW1wb3J0X3BhdGggKz0gIi4l
cyIgJSBjb21wCisgICAgICAgIHRoaW5nID0gX2RvdF9sb29rdXAodGhpbmcsIGNvbXAsIGltcG9y
dF9wYXRoKQorICAgIHJldHVybiB0aGluZworCisKK2NsYXNzIF9wYXRjaChvYmplY3QpOgorICAg
IGRlZiBfX2luaXRfXyhzZWxmLCB0YXJnZXQsIGF0dHJpYnV0ZSwgbmV3LCBzcGVjLCBjcmVhdGUp
OgorICAgICAgICBzZWxmLnRhcmdldCA9IHRhcmdldAorICAgICAgICBzZWxmLmF0dHJpYnV0ZSA9
IGF0dHJpYnV0ZQorICAgICAgICBzZWxmLm5ldyA9IG5ldworICAgICAgICBzZWxmLnNwZWMgPSBz
cGVjCisgICAgICAgIHNlbGYuY3JlYXRlID0gY3JlYXRlCisgICAgICAgIHNlbGYuaGFzX2xvY2Fs
ID0gRmFsc2UKKworCisgICAgZGVmIF9fY2FsbF9fKHNlbGYsIGZ1bmMpOgorICAgICAgICBpZiBo
YXNhdHRyKGZ1bmMsICdwYXRjaGluZ3MnKToKKyAgICAgICAgICAgIGZ1bmMucGF0Y2hpbmdzLmFw
cGVuZChzZWxmKQorICAgICAgICAgICAgcmV0dXJuIGZ1bmMKKworICAgICAgICBkZWYgcGF0Y2hl
ZCgqYXJncywgKiprZXl3YXJncyk6CisgICAgICAgICAgICAjIGRvbid0IHVzZSBhIHdpdGggaGVy
ZSAoYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkgd2l0aCAyLjUpCisgICAgICAgICAgICBleHRyYV9h
cmdzID0gW10KKyAgICAgICAgICAgIGZvciBwYXRjaGluZyBpbiBwYXRjaGVkLnBhdGNoaW5nczoK
KyAgICAgICAgICAgICAgICBhcmcgPSBwYXRjaGluZy5fX2VudGVyX18oKQorICAgICAgICAgICAg
ICAgIGlmIHBhdGNoaW5nLm5ldyBpcyBERUZBVUxUOgorICAgICAgICAgICAgICAgICAgICBleHRy
YV9hcmdzLmFwcGVuZChhcmcpCisgICAgICAgICAgICBhcmdzICs9IHR1cGxlKGV4dHJhX2FyZ3Mp
CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKmFyZ3MsICoq
a2V5d2FyZ3MpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIGZvciBwYXRj
aGluZyBpbiBnZXRhdHRyKHBhdGNoZWQsICdwYXRjaGluZ3MnLCBbXSk6CisgICAgICAgICAgICAg
ICAgICAgIHBhdGNoaW5nLl9fZXhpdF9fKCkKKworICAgICAgICBwYXRjaGVkLnBhdGNoaW5ncyA9
IFtzZWxmXQorICAgICAgICBwYXRjaGVkLl9fbmFtZV9fID0gZnVuYy5fX25hbWVfXworICAgICAg
ICBwYXRjaGVkLmNvbXBhdF9jb19maXJzdGxpbmVubyA9IGdldGF0dHIoZnVuYywgImNvbXBhdF9j
b19maXJzdGxpbmVubyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBmdW5jLmZ1bmNfY29kZS5jb19maXJzdGxpbmVubykKKyAgICAgICAgcmV0dXJuIHBh
dGNoZWQKKworCisgICAgZGVmIGdldF9vcmlnaW5hbChzZWxmKToKKyAgICAgICAgdGFyZ2V0ID0g
c2VsZi50YXJnZXQKKyAgICAgICAgbmFtZSA9IHNlbGYuYXR0cmlidXRlCisgICAgICAgIGNyZWF0
ZSA9IHNlbGYuY3JlYXRlCisKKyAgICAgICAgb3JpZ2luYWwgPSBERUZBVUxUCisgICAgICAgIGlm
IF9oYXNfbG9jYWxfYXR0cih0YXJnZXQsIG5hbWUpOgorICAgICAgICAgICAgdHJ5OgorICAgICAg
ICAgICAgICAgIG9yaWdpbmFsID0gdGFyZ2V0Ll9fZGljdF9fW25hbWVdCisgICAgICAgICAgICBl
eGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgIyBmb3IgaW5zdGFuY2VzIG9m
IGNsYXNzZXMgd2l0aCBzbG90cywgdGhleSBoYXZlIG5vIF9fZGljdF9fCisgICAgICAgICAgICAg
ICAgb3JpZ2luYWwgPSBnZXRhdHRyKHRhcmdldCwgbmFtZSkKKyAgICAgICAgZWxpZiBub3QgY3Jl
YXRlIGFuZCBub3QgaGFzYXR0cih0YXJnZXQsIG5hbWUpOgorICAgICAgICAgICAgcmFpc2UgQXR0
cmlidXRlRXJyb3IoIiVzIGRvZXMgbm90IGhhdmUgdGhlIGF0dHJpYnV0ZSAlciIgJSAodGFyZ2V0
LCBuYW1lKSkKKyAgICAgICAgcmV0dXJuIG9yaWdpbmFsCisKKworICAgIGRlZiBfX2VudGVyX18o
c2VsZik6CisgICAgICAgIG5ldywgc3BlYywgPSBzZWxmLm5ldywgc2VsZi5zcGVjCisgICAgICAg
IG9yaWdpbmFsID0gc2VsZi5nZXRfb3JpZ2luYWwoKQorICAgICAgICBpZiBuZXcgaXMgREVGQVVM
VDoKKyAgICAgICAgICAgICMgWFhYWCB3aGF0IGlmIG9yaWdpbmFsIGlzIERFRkFVTFQgLSBzaG91
bGRuJ3QgdXNlIGl0IGFzIGEgc3BlYworICAgICAgICAgICAgaW5oZXJpdCA9IEZhbHNlCisgICAg
ICAgICAgICBpZiBzcGVjID09IFRydWU6CisgICAgICAgICAgICAgICAgIyBzZXQgc3BlYyB0byB0
aGUgb2JqZWN0IHdlIGFyZSByZXBsYWNpbmcKKyAgICAgICAgICAgICAgICBzcGVjID0gb3JpZ2lu
YWwKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHNwZWMsICh0eXBlLCBDbGFzc1R5cGUp
KToKKyAgICAgICAgICAgICAgICAgICAgaW5oZXJpdCA9IFRydWUKKyAgICAgICAgICAgIG5ldyA9
IE1vY2soc3BlYz1zcGVjKQorICAgICAgICAgICAgaWYgaW5oZXJpdDoKKyAgICAgICAgICAgICAg
ICBuZXcucmV0dXJuX3ZhbHVlID0gTW9jayhzcGVjPXNwZWMpCisgICAgICAgIHNlbGYudGVtcF9v
cmlnaW5hbCA9IG9yaWdpbmFsCisgICAgICAgIHNldGF0dHIoc2VsZi50YXJnZXQsIHNlbGYuYXR0
cmlidXRlLCBuZXcpCisgICAgICAgIHJldHVybiBuZXcKKworCisgICAgZGVmIF9fZXhpdF9fKHNl
bGYsICpfKToKKyAgICAgICAgaWYgc2VsZi50ZW1wX29yaWdpbmFsIGlzIG5vdCBERUZBVUxUOgor
ICAgICAgICAgICAgc2V0YXR0cihzZWxmLnRhcmdldCwgc2VsZi5hdHRyaWJ1dGUsIHNlbGYudGVt
cF9vcmlnaW5hbCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRlbGF0dHIoc2VsZi50YXJn
ZXQsIHNlbGYuYXR0cmlidXRlKQorICAgICAgICBkZWwgc2VsZi50ZW1wX29yaWdpbmFsCisKKwor
ZGVmIHBhdGNoX29iamVjdCh0YXJnZXQsIGF0dHJpYnV0ZSwgbmV3PURFRkFVTFQsIHNwZWM9Tm9u
ZSwgY3JlYXRlPUZhbHNlKToKKyAgICByZXR1cm4gX3BhdGNoKHRhcmdldCwgYXR0cmlidXRlLCBu
ZXcsIHNwZWMsIGNyZWF0ZSkKKworCitkZWYgcGF0Y2godGFyZ2V0LCBuZXc9REVGQVVMVCwgc3Bl
Yz1Ob25lLCBjcmVhdGU9RmFsc2UpOgorICAgIHRyeToKKyAgICAgICAgdGFyZ2V0LCBhdHRyaWJ1
dGUgPSB0YXJnZXQucnNwbGl0KCcuJywgMSkKKyAgICBleGNlcHQgKFR5cGVFcnJvciwgVmFsdWVF
cnJvcik6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiTmVlZCBhIHZhbGlkIHRhcmdldCB0byBw
YXRjaC4gWW91IHN1cHBsaWVkOiAlciIgJSAodGFyZ2V0LCkpCisgICAgdGFyZ2V0ID0gX2ltcG9y
dGVyKHRhcmdldCkKKyAgICByZXR1cm4gX3BhdGNoKHRhcmdldCwgYXR0cmlidXRlLCBuZXcsIHNw
ZWMsIGNyZWF0ZSkKKworCisKK2RlZiBfaGFzX2xvY2FsX2F0dHIob2JqLCBuYW1lKToKKyAgICB0
cnk6CisgICAgICAgIHJldHVybiBuYW1lIGluIHZhcnMob2JqKQorICAgIGV4Y2VwdCBUeXBlRXJy
b3I6CisgICAgICAgICMgb2JqZWN0cyB3aXRob3V0IGEgX19kaWN0X18KKyAgICAgICAgcmV0dXJu
IGhhc2F0dHIob2JqLCBuYW1lKQo=
</data>
<flag name="review"
          id="33214"
          type_id="1"
          status="+"
          setter="abarth"
    />
    <flag name="commit-queue"
          id="33215"
          type_id="3"
          status="-"
          setter="cjerdonek"
    />
          </attachment>
      

    </bug>

</bugzilla>