<?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>195012</bug_id>
          
          <creation_ts>2019-02-25 12:11:20 -0800</creation_ts>
          <short_desc>Make JSC memory benchmark available on OpenSource</short_desc>
          <delta_ts>2019-09-03 03:56:24 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>JavaScriptCore</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Don Olmstead">don.olmstead</reporter>
          <assigned_to name="Michael Saboff">msaboff</assigned_to>
          <cc>basuke</cc>
    
    <cc>cdumez</cc>
    
    <cc>dean_johnson</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>msaboff</cc>
    
    <cc>pmatos</cc>
    
    <cc>rniwa</cc>
    
    <cc>ross.kirsling</cc>
    
    <cc>saam</cc>
    
    <cc>ticaiolima</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>ysuzuki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1509738</commentid>
    <comment_count>0</comment_count>
    <who name="Don Olmstead">don.olmstead</who>
    <bug_when>2019-02-25 12:11:20 -0800</bug_when>
    <thetext>It would be nice to be able to track memory usage over commits to check for regressions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1509799</commentid>
    <comment_count>1</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-02-25 15:11:29 -0800</bug_when>
    <thetext>Spoke with Michael and Yusuke today. They agree we should be able to open source our current memory benchmark that builds off of JetStream 2. Assigning to Michael since he said he&apos;s willing to make that change.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1509800</commentid>
    <comment_count>2</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-02-25 15:12:23 -0800</bug_when>
    <thetext>Don, to integrate this benchmark in the playstation port, you&apos;ll need to implement the &quot;struct MemoryFootprint&quot; inside jsc.cpp.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1558802</commentid>
    <comment_count>3</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2019-08-06 10:10:22 -0700</bug_when>
    <thetext>&lt;rdar://problem/53990898&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1558857</commentid>
    <comment_count>4</comment_count>
      <attachid>375637</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2019-08-06 11:53:11 -0700</bug_when>
    <thetext>Created attachment 375637
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1558872</commentid>
    <comment_count>5</comment_count>
      <attachid>375637</attachid>
    <who name="Dean Johnson">dean_johnson</who>
    <bug_when>2019-08-06 12:14:43 -0700</bug_when>
    <thetext>Comment on attachment 375637
Patch

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

Looks good overall; few minor nits on styling. Unofficial r+.

&gt; PerformanceTests/JetStream2/RAMification.py:56
&gt; +    sum = 0.0

Nit: The code below can be written a bit more succinctly:
return sum(values) / len(values)

&gt; PerformanceTests/JetStream2/RAMification.py:153
&gt; +        self.environmentVars[variable] = value

Would it be better to use os.environ here? You can set environment variables like so:
os.environ[variable] = value

&gt; PerformanceTests/JetStream2/RAMification.py:156
&gt; +        self.environmentVars.pop(variable, None)

Ditto.

&gt; PerformanceTests/JetStream2/RAMification.py:193
&gt; +            args.extend(extraOptions)

Nit: Might be good to add a newline here to help separate the distinct if blocks.

&gt; PerformanceTests/JetStream2/RAMification.py:218
&gt; +    main.hasFailedRuns = False

Might be better to use a different variable name for this since main() is the function this is within.

&gt; PerformanceTests/JetStream2/RAMification.py:245
&gt; +                testName = test[0]

Nit: Might be more clear to write this like so:

for testInfo in testList:
    if isinstance(test, tuple):
        testName, test, weight = testInfo
    else:
        testName, test, weight = testInfo, testInfo, 1

&gt; PerformanceTests/JetStream2/RAMification.py:261
&gt; +                    for count in range(0, weight):

Nit: The &quot;0&quot; passed to range() is unnecessary (unless you&apos;re going for explicitness, which would also be fine).

&gt; PerformanceTests/JetStream2/RAMification.py:265
&gt; +                    for count in range(0, weight):

Ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1558901</commentid>
    <comment_count>6</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2019-08-06 13:22:36 -0700</bug_when>
    <thetext>(In reply to Dean Johnson from comment #5)
&gt; Comment on attachment 375637 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=375637&amp;action=review
&gt; 
&gt; Looks good overall; few minor nits on styling. Unofficial r+.
&gt; 
&gt; &gt; PerformanceTests/JetStream2/RAMification.py:56
&gt; &gt; +    sum = 0.0

Fixed

&gt; Nit: The code below can be written a bit more succinctly:
&gt; return sum(values) / len(values)
&gt; 
&gt; &gt; PerformanceTests/JetStream2/RAMification.py:153
&gt; &gt; +        self.environmentVars[variable] = value
&gt; 
&gt; Would it be better to use os.environ here? You can set environment variables
&gt; like so:
&gt; os.environ[variable] = value
&gt; 
&gt; &gt; PerformanceTests/JetStream2/RAMification.py:156
&gt; &gt; +        self.environmentVars.pop(variable, None)
&gt; 
&gt; Ditto.

These environment variables are for the child process.  They are used differently for the LocalRunner and the device runner.  In both cases, the list of environment variables is used in runOneTest to setup the environment of each test before it starts.  It is quite possible that using the os.environ list to set up PATH or something similar environment variable would cause this script to fail to launch a subprocess.

&gt; &gt; PerformanceTests/JetStream2/RAMification.py:193
&gt; &gt; +            args.extend(extraOptions)
&gt; 
&gt; Nit: Might be good to add a newline here to help separate the distinct if
&gt; blocks.

Fixed.

&gt; &gt; PerformanceTests/JetStream2/RAMification.py:218
&gt; &gt; +    main.hasFailedRuns = False

Changed the name to simply hasFailedRuns.

&gt; Might be better to use a different variable name for this since main() is
&gt; the function this is within.
&gt; 
&gt; &gt; PerformanceTests/JetStream2/RAMification.py:245
&gt; &gt; +                testName = test[0]
&gt; 
&gt; Nit: Might be more clear to write this like so:
&gt; 
&gt; for testInfo in testList:
&gt;     if isinstance(test, tuple):
&gt;         testName, test, weight = testInfo
&gt;     else:
&gt;         testName, test, weight = testInfo, testInfo, 1

Made these changes.

&gt; &gt; PerformanceTests/JetStream2/RAMification.py:261
&gt; &gt; +                    for count in range(0, weight):
&gt; 
&gt; Nit: The &quot;0&quot; passed to range() is unnecessary (unless you&apos;re going for
&gt; explicitness, which would also be fine).
&gt; 
&gt; &gt; PerformanceTests/JetStream2/RAMification.py:265
&gt; &gt; +                    for count in range(0, weight):
&gt; 
&gt; Ditto.

I like the clarity of the 0 for the start of the range.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1558902</commentid>
    <comment_count>7</comment_count>
      <attachid>375647</attachid>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2019-08-06 13:23:07 -0700</bug_when>
    <thetext>Created attachment 375647
Updated patch responding to review comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1558919</commentid>
    <comment_count>8</comment_count>
    <who name="Dean Johnson">dean_johnson</who>
    <bug_when>2019-08-06 13:46:26 -0700</bug_when>
    <thetext>LGTM after updates. Unofficial r+.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1558926</commentid>
    <comment_count>9</comment_count>
    <who name="Caio Lima">ticaiolima</who>
    <bug_when>2019-08-06 14:31:26 -0700</bug_when>
    <thetext>(In reply to Saam Barati from comment #2)
&gt; Don, to integrate this benchmark in the playstation port, you&apos;ll need to
&gt; implement the &quot;struct MemoryFootprint&quot; inside jsc.cpp.

Just for the record, there is a bug to implement this on Linux-based ports here: https://bugs.webkit.org/show_bug.cgi?id=200391.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1558939</commentid>
    <comment_count>10</comment_count>
      <attachid>375647</attachid>
    <who name="Saam Barati">saam</who>
    <bug_when>2019-08-06 15:10:36 -0700</bug_when>
    <thetext>Comment on attachment 375647
Updated patch responding to review comments

r=me

Can we also make it so we stub out the system headers so open source builds can actually measure memory? It seems silly not to do this at this point.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1558979</commentid>
    <comment_count>11</comment_count>
    <who name="Michael Saboff">msaboff</who>
    <bug_when>2019-08-06 16:24:28 -0700</bug_when>
    <thetext>Committed r248326: &lt;https://trac.webkit.org/changeset/248326&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1567340</commentid>
    <comment_count>12</comment_count>
    <who name="Paulo Matos">pmatos</who>
    <bug_when>2019-09-03 03:56:24 -0700</bug_when>
    <thetext>Thank you for this. It is really useful.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>375637</attachid>
            <date>2019-08-06 11:53:11 -0700</date>
            <delta_ts>2019-08-06 13:23:07 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>195012.patch</filename>
            <type>text/plain</type>
            <size>39402</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1h
bmNlVGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiAyNDgzMDEpCisrKyBQZXJmb3JtYW5jZVRlc3Rz
L0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEwMyBAQAorMjAxOS0wOC0wNiAg
TWljaGFlbCBTYWJvZmYgIDxtc2Fib2ZmQGFwcGxlLmNvbT4KKworICAgICAgICBNYWtlIEpTQyBt
ZW1vcnkgYmVuY2htYXJrIGF2YWlsYWJsZSBvbiBPcGVuU291cmNlCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xOTUwMTIKKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUaGlzIHBhdGNoIHVwc3RyZWFtcyB0aGUg
UkFNaWZpY2F0aW9uIG1lbW9yeSBiZW5jaG1hcmsgdG8gb3BlbiBzb3VyY2UuCisKKyAgICAgICAg
VGhlIHByaW9yIFJBTWlmaWNhdGlvbi5weSBkcml2ZXIgc2NyaXB0IGluIHRoZSBJbnRlcm5hbCBk
aXJlY3RvcnkgaGFzIGJlZW4gbW92ZWQgaGVyZQorICAgICAgICB3aXRoIHRoZSBkZXZpY2UgZXhl
Y3V0aW9uIGNvZGUgc2VwZXJhdGVkIG91dCB0byBhIG5ldyBJbnRlcm5hbCBkcml2ZXIgc2NyaXB0
LgorICAgICAgICBBcyBhIHJlc3VsdCwgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHBhcnNpbmcgYXMg
d2VsbCBhcyBhY3Rpbmcgb24gdGhlIHJlc3VsdGluZyBhcmd1bWVudAorICAgICAgICB2YWx1ZXMg
aGFzIGNoYW5nZWQuICBUaGUgcmVtb3RlIGRldmljZSBSdW5uZXIgY3JlYXRlcyBhbiBBcmd1bWVu
dFBhcnNlciBvYmplY3QgdGhhdCBpcworICAgICAgICBwYXNzZWQgdGhyb3VnaCBtYWluKCkuICBJ
biBtYWluKCksIGlmIHdlIGhhdmUgYW4gQXJndW1lbnRQYXJzZXIsIHdlIHVzZSBpdCBvdGhlcndp
c2Ugd2UKKyAgICAgICAgY3JlYXRlIG9uZSBmb3IgYmVuY2htYXJraW5nIGxvY2FsbHkuICBUaGUg
YXJndW1lbnRzIG9iamVjdCByZXR1cm5lZCBmcm9tIGFyZ3VtZW50CisgICAgICAgIHBhcnNpbmcg
aXMgbm93IHBhc3NlZCB0byB0aGUgUnVubmVyIGNvbnN0cnVjdG9yIHNvIGl0IGNhbiBleHRyYWN0
IHRoZSBzZXR0aW5ncyBhcHByb3ByaWF0ZQorICAgICAgICBmb3IgdGhhdCBwYXJ0aWN1bGFyIHJ1
bm5lci4KKworICAgICAgICBBZGRlZCBzb21lIHNhbmUgYXJndW1lbnQgZGVmYXVsdCB2YWx1ZXMg
Zm9yIHRoZSBKU0MgY29tbWFuZCBwYXRjaCBhbmQgdGhlIEpldFN0cmVhbTIKKyAgICAgICAgc291
cmNlIGRpcmVjdG9yeS4KKworICAgICAgICBVcGRhdGVkIHRoZSBMdWEgdGVzdHMgdG8gZWxpbWlu
YXRlIHRoZSB0ZXN0aW5nIGhhcm5lc3MgYW5kIGl0cyBvdmVyaGVhZCwgbWF0Y2hpbmcgd2hhdCB3
YXMKKyAgICAgICAgZG9uZSBpbiB0aGUgSW50ZXJuYWwgdHJlZS4KKworICAgICAgICAqIEpldFN0
cmVhbTIvTHVhSlNGaWdodC9oZWxsb193b3JsZC5qczoKKyAgICAgICAgKEJlbmNobWFyay5wcm90
b3R5cGUucnVuSXRlcmF0aW9uKTogRGVsZXRlZC4KKyAgICAgICAgKEJlbmNobWFyayk6IERlbGV0
ZWQuCisgICAgICAgICogSmV0U3RyZWFtMi9MdWFKU0ZpZ2h0L2xpc3Rfc2VhcmNoLmpzOgorICAg
ICAgICAocnVuKTogRGVsZXRlZC4KKyAgICAgICAgKEJlbmNobWFyay5wcm90b3R5cGUucnVuSXRl
cmF0aW9uKTogRGVsZXRlZC4KKyAgICAgICAgKEJlbmNobWFyayk6IERlbGV0ZWQuCisgICAgICAg
ICogSmV0U3RyZWFtMi9MdWFKU0ZpZ2h0L2xpc3RzLmpzOgorICAgICAgICAoKTogRGVsZXRlZC4K
KyAgICAgICAgKEJlbmNobWFyay5wcm90b3R5cGUucnVuSXRlcmF0aW9uKTogRGVsZXRlZC4KKyAg
ICAgICAgKEJlbmNobWFyayk6IERlbGV0ZWQuCisgICAgICAgICogSmV0U3RyZWFtMi9MdWFKU0Zp
Z2h0L3JpY2hhcmRzLmpzOiBBZGRlZC4KKyAgICAgICAgKHJ1blJpY2hhcmRzKToKKyAgICAgICAg
KFNjaGVkdWxlcik6CisgICAgICAgIChTY2hlZHVsZXIucHJvdG90eXBlLmFkZElkbGVUYXNrKToK
KyAgICAgICAgKFNjaGVkdWxlci5wcm90b3R5cGUuYWRkV29ya2VyVGFzayk6CisgICAgICAgIChT
Y2hlZHVsZXIucHJvdG90eXBlLmFkZEhhbmRsZXJUYXNrKToKKyAgICAgICAgKFNjaGVkdWxlci5w
cm90b3R5cGUuYWRkRGV2aWNlVGFzayk6CisgICAgICAgIChTY2hlZHVsZXIucHJvdG90eXBlLmFk
ZFJ1bm5pbmdUYXNrKToKKyAgICAgICAgKFNjaGVkdWxlci5wcm90b3R5cGUuYWRkVGFzayk6Cisg
ICAgICAgIChTY2hlZHVsZXIucHJvdG90eXBlLnNjaGVkdWxlKToKKyAgICAgICAgKFNjaGVkdWxl
ci5wcm90b3R5cGUucmVsZWFzZSk6CisgICAgICAgIChTY2hlZHVsZXIucHJvdG90eXBlLmhvbGRD
dXJyZW50KToKKyAgICAgICAgKFNjaGVkdWxlci5wcm90b3R5cGUuc3VzcGVuZEN1cnJlbnQpOgor
ICAgICAgICAoU2NoZWR1bGVyLnByb3RvdHlwZS5xdWV1ZSk6CisgICAgICAgIChUYXNrQ29udHJv
bEJsb2NrKToKKyAgICAgICAgKFRhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLnNldFJ1bm5pbmcp
OgorICAgICAgICAoVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUubWFya0FzTm90SGVsZCk6Cisg
ICAgICAgIChUYXNrQ29udHJvbEJsb2NrLnByb3RvdHlwZS5tYXJrQXNIZWxkKToKKyAgICAgICAg
KFRhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLmlzSGVsZE9yU3VzcGVuZGVkKToKKyAgICAgICAg
KFRhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLm1hcmtBc1N1c3BlbmRlZCk6CisgICAgICAgIChU
YXNrQ29udHJvbEJsb2NrLnByb3RvdHlwZS5tYXJrQXNSdW5uYWJsZSk6CisgICAgICAgIChUYXNr
Q29udHJvbEJsb2NrLnByb3RvdHlwZS5ydW4pOgorICAgICAgICAoVGFza0NvbnRyb2xCbG9jay5w
cm90b3R5cGUuY2hlY2tQcmlvcml0eUFkZCk6CisgICAgICAgIChUYXNrQ29udHJvbEJsb2NrLnBy
b3RvdHlwZS50b1N0cmluZyk6CisgICAgICAgIChJZGxlVGFzayk6CisgICAgICAgIChJZGxlVGFz
ay5wcm90b3R5cGUucnVuKToKKyAgICAgICAgKElkbGVUYXNrLnByb3RvdHlwZS50b1N0cmluZyk6
CisgICAgICAgIChEZXZpY2VUYXNrKToKKyAgICAgICAgKERldmljZVRhc2sucHJvdG90eXBlLnJ1
bik6CisgICAgICAgIChEZXZpY2VUYXNrLnByb3RvdHlwZS50b1N0cmluZyk6CisgICAgICAgIChX
b3JrZXJUYXNrKToKKyAgICAgICAgKFdvcmtlclRhc2sucHJvdG90eXBlLnJ1bik6CisgICAgICAg
IChXb3JrZXJUYXNrLnByb3RvdHlwZS50b1N0cmluZyk6CisgICAgICAgIChIYW5kbGVyVGFzayk6
CisgICAgICAgIChIYW5kbGVyVGFzay5wcm90b3R5cGUucnVuKToKKyAgICAgICAgKEhhbmRsZXJU
YXNrLnByb3RvdHlwZS50b1N0cmluZyk6CisgICAgICAgIChQYWNrZXQpOgorICAgICAgICAoUGFj
a2V0LnByb3RvdHlwZS5hZGRUbyk6CisgICAgICAgIChQYWNrZXQucHJvdG90eXBlLnRvU3RyaW5n
KToKKyAgICAgICAgKiBKZXRTdHJlYW0yL0x1YUpTRmlnaHQvc3RyaW5nX2xpc3RzLmpzOgorICAg
ICAgICAoKTogRGVsZXRlZC4KKyAgICAgICAgKEJlbmNobWFyay5wcm90b3R5cGUucnVuSXRlcmF0
aW9uKTogRGVsZXRlZC4KKyAgICAgICAgKEJlbmNobWFyayk6IERlbGV0ZWQuCisgICAgICAgICog
SmV0U3RyZWFtMi9SQU1pZmljYXRpb24ucHk6IEFkZGVkLgorICAgICAgICAobWVhbik6CisgICAg
ICAgIChnZW9tZWFuKToKKyAgICAgICAgKGZyYW1ld29ya1BhdGhGcm9tRXhlY3V0YWJsZVBhdGgp
OgorICAgICAgICAocGFyc2VBcmdzKToKKyAgICAgICAgKHBhcnNlQXJncy5vcHRTdHJUb0Jvb2wp
OgorICAgICAgICAoQmFzZVJ1bm5lcik6CisgICAgICAgIChCYXNlUnVubmVyLl9faW5pdF9fKToK
KyAgICAgICAgKEJhc2VSdW5uZXIuc2V0dXApOgorICAgICAgICAoQmFzZVJ1bm5lci5zZXRFbnYp
OgorICAgICAgICAoQmFzZVJ1bm5lci51bnNldEVudik6CisgICAgICAgIChCYXNlUnVubmVyLnJl
c2V0Rm9yVGVzdCk6CisgICAgICAgIChCYXNlUnVubmVyLnByb2Nlc3NMaW5lKToKKyAgICAgICAg
KEJhc2VSdW5uZXIuc2V0UmV0dXJuQ29kZSk6CisgICAgICAgIChCYXNlUnVubmVyLmdldFJlc3Vs
dHMpOgorICAgICAgICAoTG9jYWxSdW5uZXIpOgorICAgICAgICAoTG9jYWxSdW5uZXIuX19pbml0
X18pOgorICAgICAgICAoTG9jYWxSdW5uZXIucnVuT25lVGVzdCk6CisgICAgICAgIChtYWluKToK
KyAgICAgICAgKG1haW4ucnVuVGVzdExpc3QpOgorICAgICAgICAqIEpldFN0cmVhbTIvX19pbml0
X18ucHk6IEFkZGVkLgorCiAyMDE5LTA3LTIzICBLZWl0aCBSb2xsaW4gIDxrcm9sbGluQGFwcGxl
LmNvbT4KIAogICAgICAgICBSZW1vdmUgcmVzdCBvZiBOYXZpZ2F0b3JDb250ZW50VXRpbHMgc3Vw
cG9ydApJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9KZXRTdHJlYW0yL1JBTWlmaWNhdGlvbi5weQo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL0pldFN0cmVhbTIvUkFNaWZpY2F0aW9uLnB5
CShub25leGlzdGVudCkKKysrIFBlcmZvcm1hbmNlVGVzdHMvSmV0U3RyZWFtMi9SQU1pZmljYXRp
b24ucHkJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzNTMgQEAKKyMgQ29weXJpZ2h0IChDKSAy
MDE4LTIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJ
UycnCisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwor
IyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SCisjIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworIyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTgorIyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisjIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgY29sbGVj
dGlvbnMKK2ltcG9ydCBqc29uCitpbXBvcnQgbWF0aAoraW1wb3J0IG9zCitpbXBvcnQgcmUKK2lt
cG9ydCBzdWJwcm9jZXNzCisKK2ppdFRlc3RzID0gWyIzZC1jdWJlLVNQIiwgIjNkLXJheXRyYWNl
LVNQIiwgImFjb3JuLXd0YiIsICJhaS1hc3RhciIsICJBaXIiLCAiYXN5bmMtZnMiLCAiQmFieWxv
biIsICJiYWJ5bG9uLXd0YiIsICJiYXNlNjQtU1AiLCAiQmFzaWMiLCAiQm94MkQiLCAiY2RqcyIs
ICJjaGFpLXd0YiIsICJjb2ZmZWVzY3JpcHQtd3RiIiwgImNyeXB0byIsICJjcnlwdG8tYWVzLVNQ
IiwgImNyeXB0by1tZDUtU1AiLCAiY3J5cHRvLXNoYTEtU1AiLCAiZGF0ZS1mb3JtYXQtdG9mdGUt
U1AiLCAiZGF0ZS1mb3JtYXQteHBhcmItU1AiLCAiZGVsdGEtYmx1ZSIsICJlYXJsZXktYm95ZXIi
LCAiZXNwcmVlLXd0YiIsICJmaXJzdC1pbnNwZWN0b3ItY29kZS1sb2FkIiwgIkZsaWdodFBsYW5u
ZXIiLCAiZmxvYXQtbW0uYyIsICJnYXVzc2lhbi1ibHVyIiwgImdiZW11IiwgImdjYy1sb29wcy13
YXNtIiwgImhhc2gtbWFwIiwgIkhhc2hTZXQtd2FzbSIsICJqc2hpbnQtd3RiIiwgImpzb24tcGFy
c2UtaW5zcGVjdG9yIiwgImpzb24tc3RyaW5naWZ5LWluc3BlY3RvciIsICJsZWJhYi13dGIiLCAi
bWFuZHJlZWwiLCAiTUwiLCAibXVsdGktaW5zcGVjdG9yLWNvZGUtbG9hZCIsICJuLWJvZHktU1Ai
LCAibmF2aWVyLXN0b2tlcyIsICJvY3RhbmUtY29kZS1sb2FkIiwgIm9jdGFuZS16bGliIiwgIk9m
ZmxpbmVBc3NlbWJsZXIiLCAicGRmanMiLCAicHJlcGFjay13dGIiLCAicXVpY2tzb3J0LXdhc20i
LCAicmF5dHJhY2UiLCAicmVnZXgtZG5hLVNQIiwgInJlZ2V4cCIsICJyaWNoYXJkcyIsICJyaWNo
YXJkcy13YXNtIiwgInNwbGF5IiwgInN0YW5mb3JkLWNyeXB0by1hZXMiLCAic3RhbmZvcmQtY3J5
cHRvLXBia2RmMiIsICJzdGFuZm9yZC1jcnlwdG8tc2hhMjU2IiwgInN0cmluZy11bnBhY2stY29k
ZS1TUCIsICJ0YWdjbG91ZC1TUCIsICJ0c2Ytd2FzbSIsICJ0eXBlc2NyaXB0IiwgInVnbGlmeS1q
cy13dGIiLCAiVW5pUG9rZXIiLCAiV1NMIl0KKworbm9uSklUVGVzdHMgPSBbIjNkLWN1YmUtU1Ai
LCAiM2QtcmF5dHJhY2UtU1AiLCAiYWNvcm4td3RiIiwgImFpLWFzdGFyIiwgIkFpciIsICJhc3lu
Yy1mcyIsICJCYWJ5bG9uIiwgImJhYnlsb24td3RiIiwgImJhc2U2NC1TUCIsICJCYXNpYyIsICJC
b3gyRCIsICJjZGpzIiwgImNoYWktd3RiIiwgImNvZmZlZXNjcmlwdC13dGIiLCAiY3J5cHRvLWFl
cy1TUCIsICJkZWx0YS1ibHVlIiwgImVhcmxleS1ib3llciIsICJlc3ByZWUtd3RiIiwgImZpcnN0
LWluc3BlY3Rvci1jb2RlLWxvYWQiLCAiZ2F1c3NpYW4tYmx1ciIsICJnYmVtdSIsICJoYXNoLW1h
cCIsICJqc2hpbnQtd3RiIiwgImpzb24tcGFyc2UtaW5zcGVjdG9yIiwgImpzb24tc3RyaW5naWZ5
LWluc3BlY3RvciIsICJsZWJhYi13dGIiLCAibWFuZHJlZWwiLCAiTUwiLCAibXVsdGktaW5zcGVj
dG9yLWNvZGUtbG9hZCIsICJvY3RhbmUtY29kZS1sb2FkIiwgIk9mZmxpbmVBc3NlbWJsZXIiLCAi
cGRmanMiLCAicHJlcGFjay13dGIiLCAicmF5dHJhY2UiLCAicmVnZXgtZG5hLVNQIiwgInJlZ2V4
cCIsICJzcGxheSIsICJzdGFuZm9yZC1jcnlwdG8tYWVzIiwgInN0cmluZy11bnBhY2stY29kZS1T
UCIsICJ0YWdjbG91ZC1TUCIsICJ0eXBlc2NyaXB0IiwgInVnbGlmeS1qcy13dGIiXQorCisjIFJ1
biB0d28gZ3JvdXBzIG9mIHRlc3RzIHdpdGggZWFjaCBncm91cCBpbiBhIHNpbmdsZSBKU0MgaW5z
dGFuY2UgdG8gc2VlIGhvdyB3ZWxsIG1lbW9yeSByZWNvdmVycyBiZXR3ZWVuIHRlc3RzLgorZ3Jv
dXBUZXN0cyA9IFsidHlwZXNjcmlwdCxhY29ybi13dGIsQWlyLHBkZmpzLGNyeXB0by1hZXMtU1Ai
LCAic3BsYXksRmxpZ2h0UGxhbm5lcixwcmVwYWNrLXd0YixvY3RhbmUtemxpYiwzZC1jdWJlLVNQ
Il0KKworbHVhVGVzdHMgPSBbKCJoZWxsb193b3JsZC1MSkYiLCAiTHVhSlNGaWdodC9oZWxsb193
b3JsZC5qcyIsIDUpLCAoImxpc3Rfc2VhcmNoLUxKRiIsICJMdWFKU0ZpZ2h0L2xpc3Rfc2VhcmNo
LmpzIiwgNSksICgibGlzdHMtTEpGIiwgIkx1YUpTRmlnaHQvbGlzdHMuanMiLCA1KSwgKCJzdHJp
bmdfbGlzdHMtTEpGIiwgIkx1YUpTRmlnaHQvc3RyaW5nX2xpc3RzLmpzIiwgNSksICgicmljaGFy
ZHMiLCAiTHVhSlNGaWdodC9yaWNoYXJkcy5qcyIsIDUpXQorCitvbmVNQiA9IGZsb2F0KDEwMjQg
KiAxMDI0KQorZm9vdHByaW50UkUgPSByZS5jb21waWxlKCJDdXJyZW50IEZvb3RwcmludDogKFxk
Kyg/Oi5cZCspPykiKQorcGVha0Zvb3RwcmludFJFID0gcmUuY29tcGlsZSgiUGVhayBGb290cHJp
bnQ6IChcZCsoPzouXGQrKT8pIikKKworVGVzdFJlc3VsdCA9IGNvbGxlY3Rpb25zLm5hbWVkdHVw
bGUoIlRlc3RSZXN1bHQiLCBbIm5hbWUiLCAicmV0dXJuQ29kZSIsICJmb290cHJpbnQiLCAicGVh
a0Zvb3RwcmludCJdKQorCityYW1pZmljYXRpb25fZGlyID0gb3MucGF0aC5hYnNwYXRoKG9zLnBh
dGguZGlybmFtZShvcy5wYXRoLnJlYWxwYXRoKF9fZmlsZV9fKSkpCisKK3JlbW90ZUhvb2tzID0g
e30KKworCitkZWYgbWVhbih2YWx1ZXMpOgorICAgIGlmIG5vdCBsZW4odmFsdWVzKToKKyAgICAg
ICAgcmV0dXJuIE5vbmUKKworICAgIHN1bSA9IDAuMAorICAgIGZvciB4IGluIHZhbHVlczoKKyAg
ICAgICAgc3VtICs9IHgKKworICAgIHJldHVybiBzdW0gLyBsZW4odmFsdWVzKQorCisKK2RlZiBn
ZW9tZWFuKHZhbHVlcyk6CisgICAgaWYgbm90IGxlbih2YWx1ZXMpOgorICAgICAgICByZXR1cm4g
Tm9uZQorCisgICAgcHJvZHVjdCA9IDEuMAorCisgICAgZm9yIHggaW4gdmFsdWVzOgorICAgICAg
ICBwcm9kdWN0ICo9IHgKKworICAgIHJldHVybiBtYXRoLnBvdyhwcm9kdWN0LCAoMS4wIC8gbGVu
KHZhbHVlcykpKQorCisKK2RlZiBmcmFtZXdvcmtQYXRoRnJvbUV4ZWN1dGFibGVQYXRoKGV4ZWNQ
YXRoKToKKyAgICBpZiBub3Qgb3MucGF0aC5hYnNwYXRoKGV4ZWNQYXRoKToKKyAgICAgICAgZXhl
Y1BhdGggPSBvcy5wYXRoLmlzYWJzKGV4ZWNQYXRoKQorCisgICAgcGF0aE1hdGNoID0gcmUubWF0
Y2goIiguKj8vV2ViS2l0QnVpbGQvKFJlbGVhc2V8RGVidWcpKykvKFthLXpBLVpdKykkIiwgZXhl
Y1BhdGgpCisgICAgaWYgcGF0aE1hdGNoOgorICAgICAgICByZXR1cm4gcGF0aE1hdGNoLmdyb3Vw
KDEpCisKKyAgICBwYXRoTWF0Y2ggPSByZS5tYXRjaCgiKC4qPykvSmF2YVNjcmlwdENvcmUuZnJh
bWV3b3JrL1Jlc291cmNlcy8oW2EtekEtWl0rKSQiLCBleGVjUGF0aCkKKyAgICBpZiBwYXRoTWF0
Y2g6CisgICAgICAgIHJldHVybiBwYXRoTWF0Y2guZ3JvdXAoMSkKKworICAgIHBhdGhNYXRjaCA9
IHJlLm1hdGNoKCIoLio/LyhSZWxlYXNlfERlYnVnKSspLyhbYS16QS1aXSspJCIsIGV4ZWNQYXRo
KQorICAgIGlmIHBhdGhNYXRjaDoKKyAgICAgICAgcmV0dXJuIHBhdGhNYXRjaC5ncm91cCgxKQor
CisgICAgcGF0aE1hdGNoID0gcmUubWF0Y2goIiguKj8pL0phdmFTY3JpcHRDb3JlLmZyYW1ld29y
ay8oLio/KS9SZXNvdXJjZXMvKFthLXpBLVpdKykkIiwgZXhlY1BhdGgpCisgICAgaWYgcGF0aE1h
dGNoOgorICAgICAgICByZXR1cm4gcGF0aE1hdGNoLmdyb3VwKDEpCisKKworZGVmIHBhcnNlQXJn
cyhwYXJzZXI9Tm9uZSk6CisgICAgZGVmIG9wdFN0clRvQm9vbChhcmcpOgorICAgICAgICBpZiBh
cmcubG93ZXIoKSBpbiAoInRydWUiLCAidCIsICJ5ZXMiLCAieSIpOgorICAgICAgICAgICAgcmV0
dXJuIFRydWUKKyAgICAgICAgaWYgYXJnLmxvd2VyKCkgaW4gKCJmYWxzZSIsICJmIiwgIm5vIiwg
Im4iKToKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgICAgIHJhaXNlIGFyZ3BhcnNl
LkFyZ3VtZW50VHlwZUVycm9yKCJCb29sZWFuIHZhbHVlIGV4cGVjdGVkIikKKworICAgIGlmIG5v
dCBwYXJzZXI6CisgICAgICAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2Ny
aXB0aW9uPSJSQU1pZmljYXRpb24gYmVuY2htYXJrIGRyaXZlciBzY3JpcHQiKQorICAgICAgICBw
YXJzZXIuc2V0X2RlZmF1bHRzKHJ1bm5lcj1Mb2NhbFJ1bm5lcikKKworICAgIHZlcmJvc2l0eUdy
b3VwID0gcGFyc2VyLmFkZF9tdXR1YWxseV9leGNsdXNpdmVfZ3JvdXAoKQorICAgIHZlcmJvc2l0
eUdyb3VwLmFkZF9hcmd1bWVudCgiLXEiLCAiLS1xdWlldCIsIGRlc3Q9InZlcmJvc2UiLCBhY3Rp
b249InN0b3JlX2ZhbHNlIiwgaGVscD0iUHJvdmlkZSBsZXNzIG91dHB1dCIpCisgICAgdmVyYm9z
aXR5R3JvdXAuYWRkX2FyZ3VtZW50KCItdiIsICItLXZlcmJvc2UiLCBkZXN0PSJ2ZXJib3NlIiwg
YWN0aW9uPSJzdG9yZV90cnVlIiwgZGVmYXVsdD1UcnVlLCBoZWxwPSJQcm92aWRlIG1vcmUgb3V0
cHV0IikKKworICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi1jIiwgIi0tanNjIiwgZGVzdD0ianNj
Q29tbWFuZCIsIHR5cGU9c3RyLCBkZWZhdWx0PSIvdXNyL2xvY2FsL2Jpbi9qc2MiLCBtZXRhdmFy
PSJwYXRoLXRvLWpzYyIsIGhlbHA9IlBhdGggdG8ganNjIGNvbW1hbmQiKQorICAgIHBhcnNlci5h
ZGRfYXJndW1lbnQoIi1kIiwgIi0tamV0c3RyZWFtMi1kaXIiLCBkZXN0PSJ0ZXN0RGlyIiwgdHlw
ZT1zdHIsIGRlZmF1bHQ9cmFtaWZpY2F0aW9uX2RpciwgbWV0YXZhcj0icGF0aC10by1KZXRTdHJl
YW0yLWZpbGVzIiwgaGVscD0iSmV0U3RyZWFtMiByb290IGRpcmVjdG9yeSIpCisgICAgcGFyc2Vy
LmFkZF9hcmd1bWVudCgiLWUiLCAiLS1lbnYtdmFyIiwgZGVzdD0iZXh0cmFFbnZWYXJzIiwgYWN0
aW9uPSJhcHBlbmQiLCBkZWZhdWx0PVtdLCBtZXRhdmFyPSJlbnYtdmFyPXZhbHVlIiwgaGVscD0i
U3BlY2lmeSBhZGRpdGlvbmFsIGVudmlyb25tZW50IHZhcmlhYmxlcyIpCisgICAgcGFyc2VyLmFk
ZF9hcmd1bWVudCgiLWYiLCAiLS1mb3JtYXQtanNvbiIsIGRlc3Q9ImZvcm1hdEpTT04iLCBhY3Rp
b249InN0b3JlX3RydWUiLCBkZWZhdWx0PUZhbHNlLCBoZWxwPSJGb3JtYXQgSlNPTiB3aXRoIHdo
aXRlc3BhY2UiKQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi1nIiwgIi0tcnVuLWdyb3VwZWQt
dGVzdHMiLCBkZXN0PSJydW5Hcm91cGVkVGVzdHMiLCBuYXJncz0iPyIsIGNvbnN0PVRydWUsIGRl
ZmF1bHQ9Tm9uZSwgdHlwZT1vcHRTdHJUb0Jvb2wsIG1ldGF2YXI9InRydWUgLyBmYWxzZSIsIGhl
bHA9IlJ1biBncm91cGVkIHRlc3RzIFtkZWZhdWx0XSIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVu
dCgiLWoiLCAiLS1ydW4taml0IiwgZGVzdD0icnVuSklUVGVzdHMiLCBuYXJncz0iPyIsIGNvbnN0
PVRydWUsIGRlZmF1bHQ9Tm9uZSwgdHlwZT1vcHRTdHJUb0Jvb2wsIG1ldGF2YXI9InRydWUgLyBm
YWxzZSIsIGhlbHA9IlJ1biBKSVQgdGVzdHMgW2RlZmF1bHRdIikKKyAgICBwYXJzZXIuYWRkX2Fy
Z3VtZW50KCItbCIsICItLWx1YSIsIGRlc3Q9InJ1bkx1YVRlc3RzIiwgbmFyZ3M9Ij8iLCBjb25z
dD1UcnVlLCBkZWZhdWx0PU5vbmUsIHR5cGU9b3B0U3RyVG9Cb29sLCBtZXRhdmFyPSJ0cnVlIC8g
ZmFsc2UiLCBoZWxwPSJSdW4gTHVhIGNvbXBhcmlzb24gdGVzdHMgW2RlZmF1bHRdIikKKyAgICBw
YXJzZXIuYWRkX2FyZ3VtZW50KCItbiIsICItLXJ1bi1uby1qaXQiLCBkZXN0PSJydW5Ob0pJVFRl
c3RzIiwgbmFyZ3M9Ij8iLCBjb25zdD1UcnVlLCBkZWZhdWx0PU5vbmUsIHR5cGU9b3B0U3RyVG9C
b29sLCBtZXRhdmFyPSJ0cnVlIC8gZmFsc2UiLCBoZWxwPSJSdW4gbm8gSklUIHRlc3RzIFtkZWZh
dWx0XSIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLW8iLCAiLS1vdXRwdXQiLCBkZXN0PSJq
c29uRmlsZW5hbWUiLCB0eXBlPXN0ciwgZGVmYXVsdD1Ob25lLCBtZXRhdmFyPSJKU09OLW91dHB1
dC1maWxlIiwgaGVscD0iUGF0aCB0byBKU09OIG91dHB1dCIpCisKKyAgICBhcmdzID0gcGFyc2Vy
LnBhcnNlX2FyZ3MoKQorCisgICAgc3VidGVzdEFyZ3MgPSBbYXJncy5ydW5Hcm91cGVkVGVzdHMs
IGFyZ3MucnVuSklUVGVzdHMsIGFyZ3MucnVuTHVhVGVzdHMsIGFyZ3MucnVuTm9KSVRUZXN0c10K
KyAgICBhbGxEZWZhdWx0ID0gYWxsKFthcmcgaXMgTm9uZSBmb3IgYXJnIGluIHN1YnRlc3RBcmdz
XSkKKyAgICBhbnlUcnVlID0gYW55KFthcmcgaXMgVHJ1ZSBmb3IgYXJnIGluIHN1YnRlc3RBcmdz
XSkKKyAgICBhbnlGYWxzZSA9IGFueShbYXJnIGlzIEZhbHNlIGZvciBhcmcgaW4gc3VidGVzdEFy
Z3NdKQorCisgICAgIyBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJ1biBhbGwgc3VidGVzdHMuCisg
ICAgIyBJZiBhIHRlc3QgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQgbm90IHRvIHJ1biwgc2tpcCB0
aGF0IHRlc3QgYW5kIHVzZSB0aGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgdGhlIHJlbWFpbmluZyB0
ZXN0cy4KKyAgICAjIElmIHRlc3RzIGFyZSBleHBsaWNpdGx5IHNwZWNpZmllZCB0byBydW4sIG9u
bHkgcnVuIHRob3NlIHRlc3RzLgorICAgICMgSWYgdGhlcmUgaXMgYSBtaXggb2YgdGVzdHMgc3Bl
Y2lmaWVkIHRvIHJ1biBhbmQgbm90IHRvIHJ1biwgYWxzbyBkbyBub3QgcnVuIGFueSB1bnNwZWNp
ZmllZCB0ZXN0cy4KKyAgICBnZXRBcmdWYWx1ZSA9IGxhbWJkYSBhcmc6IFRydWUgaWYgYWxsRGVm
YXVsdCBlbHNlIEZhbHNlIGlmIGFyZyBpcyBOb25lIGFuZCBhbnlUcnVlIGVsc2UgVHJ1ZSBpZiBh
cmcgaXMgTm9uZSBhbmQgYW55RmFsc2UgZWxzZSBhcmcKKworICAgIGFyZ3MucnVuSklUVGVzdHMg
PSBnZXRBcmdWYWx1ZShhcmdzLnJ1bkpJVFRlc3RzKQorICAgIGFyZ3MucnVuTm9KSVRUZXN0cyA9
IGdldEFyZ1ZhbHVlKGFyZ3MucnVuTm9KSVRUZXN0cykKKyAgICBhcmdzLnJ1bkx1YVRlc3RzID0g
Z2V0QXJnVmFsdWUoYXJncy5ydW5MdWFUZXN0cykKKyAgICBhcmdzLnJ1bkdyb3VwZWRUZXN0cyA9
IGdldEFyZ1ZhbHVlKGFyZ3MucnVuR3JvdXBlZFRlc3RzKQorCisgICAgcmV0dXJuIGFyZ3MKKwor
CitjbGFzcyBCYXNlUnVubmVyOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBhcmdzKToKKyAgICAg
ICAgc2VsZi5yb290RGlyID0gYXJncy50ZXN0RGlyCisgICAgICAgIHNlbGYuZW52aXJvbm1lbnRW
YXJzID0ge30KKworICAgIGRlZiBzZXR1cChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVm
IHNldEVudihzZWxmLCB2YXJpYWJsZSwgdmFsdWUpOgorICAgICAgICBzZWxmLmVudmlyb25tZW50
VmFyc1t2YXJpYWJsZV0gPSB2YWx1ZQorCisgICAgZGVmIHVuc2V0RW52KHNlbGYsIHZhcmlhYmxl
KToKKyAgICAgICAgc2VsZi5lbnZpcm9ubWVudFZhcnMucG9wKHZhcmlhYmxlLCBOb25lKQorCisg
ICAgZGVmIHJlc2V0Rm9yVGVzdChzZWxmLCB0ZXN0TmFtZSk6CisgICAgICAgIHNlbGYudGVzdE5h
bWUgPSB0ZXN0TmFtZQorICAgICAgICBzZWxmLmZvb3RwcmludCA9IE5vbmUKKyAgICAgICAgc2Vs
Zi5wZWFrRm9vdHByaW50ID0gTm9uZQorICAgICAgICBzZWxmLnJldHVybkNvZGUgPSAwCisKKyAg
ICBkZWYgcHJvY2Vzc0xpbmUoc2VsZiwgbGluZSk6CisgICAgICAgIGxpbmUgPSBsaW5lLnN0cmlw
KCkKKworICAgICAgICBmb290cHJpbnRNYXRjaCA9IHJlLm1hdGNoKGZvb3RwcmludFJFLCBsaW5l
KQorICAgICAgICBpZiBmb290cHJpbnRNYXRjaDoKKyAgICAgICAgICAgIHNlbGYuZm9vdHByaW50
ID0gaW50KGZvb3RwcmludE1hdGNoLmdyb3VwKDEpKQorICAgICAgICAgICAgcmV0dXJuCisKKyAg
ICAgICAgcGVha0Zvb3RwcmludE1hdGNoID0gcmUubWF0Y2gocGVha0Zvb3RwcmludFJFLCBsaW5l
KQorICAgICAgICBpZiBwZWFrRm9vdHByaW50TWF0Y2g6CisgICAgICAgICAgICBzZWxmLnBlYWtG
b290cHJpbnQgPSBpbnQocGVha0Zvb3RwcmludE1hdGNoLmdyb3VwKDEpKQorCisgICAgZGVmIHNl
dFJldHVybkNvZGUoc2VsZiwgcmV0dXJuQ29kZSk6CisgICAgICAgIHNlbGYucmV0dXJuQ29kZSA9
IHJldHVybkNvZGUKKworICAgIGRlZiBnZXRSZXN1bHRzKHNlbGYpOgorICAgICAgICByZXR1cm4g
VGVzdFJlc3VsdChuYW1lPXNlbGYudGVzdE5hbWUsIHJldHVybkNvZGU9c2VsZi5yZXR1cm5Db2Rl
LCBmb290cHJpbnQ9c2VsZi5mb290cHJpbnQsIHBlYWtGb290cHJpbnQ9c2VsZi5wZWFrRm9vdHBy
aW50KQorCisKK2NsYXNzIExvY2FsUnVubmVyKEJhc2VSdW5uZXIpOgorICAgIGRlZiBfX2luaXRf
XyhzZWxmLCBhcmdzKToKKyAgICAgICAgQmFzZVJ1bm5lci5fX2luaXRfXyhzZWxmLCBhcmdzKQor
ICAgICAgICBzZWxmLmpzY0NvbW1hbmQgPSBhcmdzLmpzY0NvbW1hbmQKKworICAgIGRlZiBydW5P
bmVUZXN0KHNlbGYsIHRlc3QsIGV4dHJhT3B0aW9ucz1Ob25lLCB1c2VKZXRTdHJlYW0ySGFybmVz
cz1UcnVlKToKKyAgICAgICAgc2VsZi5yZXNldEZvclRlc3QodGVzdCkKKworICAgICAgICBhcmdz
ID0gW3NlbGYuanNjQ29tbWFuZF0KKyAgICAgICAgaWYgZXh0cmFPcHRpb25zOgorICAgICAgICAg
ICAgYXJncy5leHRlbmQoZXh0cmFPcHRpb25zKQorICAgICAgICBpZiB1c2VKZXRTdHJlYW0ySGFy
bmVzczoKKyAgICAgICAgICAgIGFyZ3MuZXh0ZW5kKFsiLWUiLCAidGVzdExpc3Q9J3t0ZXN0fSc7
IHJ1bk1vZGU9J1JBTWlmaWNhdGlvbiciLmZvcm1hdCh0ZXN0PXRlc3QpLCAiY2xpLmpzIl0pCisg
ICAgICAgIGVsc2U6CisgICAgICAgICAgICBhcmdzLmV4dGVuZChbIi0tZm9vdHByaW50IiwgInt0
ZXN0fSIuZm9ybWF0KHRlc3Q9dGVzdCldKQorCisgICAgICAgIHNlbGYucmVzZXRGb3JUZXN0KHRl
c3QpCisKKyAgICAgICAgcHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oYXJncywgY3dkPXNlbGYucm9v
dERpciwgZW52PXNlbGYuZW52aXJvbm1lbnRWYXJzLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFLCBz
dGRlcnI9Tm9uZSwgc2hlbGw9RmFsc2UpCisgICAgICAgIHdoaWxlIFRydWU6CisgICAgICAgICAg
ICBsaW5lID0gcHJvYy5zdGRvdXQucmVhZGxpbmUoKQorICAgICAgICAgICAgc2VsZi5wcm9jZXNz
TGluZShsaW5lKQorCisgICAgICAgICAgICBpZiBsaW5lID09ICIiOgorICAgICAgICAgICAgICAg
IGJyZWFrCisKKyAgICAgICAgc2VsZi5zZXRSZXR1cm5Db2RlKHByb2Mud2FpdCgpKQorCisgICAg
ICAgIHJldHVybiBzZWxmLmdldFJlc3VsdHMoKQorCisKK2RlZiBtYWluKHBhcnNlcj1Ob25lKToK
KyAgICBmb290cHJpbnRWYWx1ZXMgPSBbXQorICAgIHBlYWtGb290cHJpbnRWYWx1ZXMgPSBbXQor
ICAgIHRlc3RSZXN1bHRzRGljdCA9IHt9CisgICAgbWFpbi5oYXNGYWlsZWRSdW5zID0gRmFsc2UK
KworICAgIGFyZ3MgPSBwYXJzZUFyZ3MocGFyc2VyPXBhcnNlcikKKworICAgIHRlc3RSdW5uZXIg
PSBhcmdzLnJ1bm5lcihhcmdzKQorCisgICAgZHlsZEZyYW1ld29ya1BhdGggPSBmcmFtZXdvcmtQ
YXRoRnJvbUV4ZWN1dGFibGVQYXRoKGFyZ3MuanNjQ29tbWFuZCkKKyAgICBpZiBkeWxkRnJhbWV3
b3JrUGF0aDoKKyAgICAgICAgdGVzdFJ1bm5lci5zZXRFbnYoIkRZTERfRlJBTUVXT1JLX1BBVEgi
LCBkeWxkRnJhbWV3b3JrUGF0aCkKKworICAgIGZvciBlbnZWYXIgaW4gYXJncy5leHRyYUVudlZh
cnM6CisgICAgICAgIGVudlZhclBhcnRzID0gZW52VmFyLnNwbGl0KCI9IikKKyAgICAgICAgaWYg
bGVuKGVudlZhclBhcnRzKSA9PSAxOgorICAgICAgICAgICAgZW52VmFyUGFydHNbMV0gPSAiMSIK
KyAgICAgICAgdGVzdFJ1bm5lci5zZXRFbnYoZW52VmFyUGFydHNbMF0sIGVudlZhclBhcnRzWzFd
KQorCisgICAgdGVzdFJ1bm5lci5zZXR1cCgpCisKKyAgICBkZWYgcnVuVGVzdExpc3QodGVzdExp
c3QsIGV4dHJhT3B0aW9ucz1Ob25lLCB1c2VKZXRTdHJlYW0ySGFybmVzcz1UcnVlKToKKyAgICAg
ICAgdGVzdFNjb3Jlc0RpY3QgPSB7fQorCisgICAgICAgIGZvciB0ZXN0IGluIHRlc3RMaXN0Ogor
ICAgICAgICAgICAgZm9vdHByaW50U2NvcmVzID0gW10KKyAgICAgICAgICAgIHBlYWtGb290cHJp
bnRTY29yZXMgPSBbXQorICAgICAgICAgICAgd2VpZ2h0ID0gMQorICAgICAgICAgICAgaWYgaXNp
bnN0YW5jZSh0ZXN0LCB0dXBsZSk6CisgICAgICAgICAgICAgICAgd2VpZ2h0ID0gdGVzdFsyXQor
ICAgICAgICAgICAgICAgIHRlc3ROYW1lID0gdGVzdFswXQorICAgICAgICAgICAgICAgIHRlc3Qg
PSB0ZXN0WzFdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRlc3ROYW1lID0g
dGVzdAorCisgICAgICAgICAgICBwcmludCAiUnVubmluZyB7fS4uLiIuZm9ybWF0KHRlc3ROYW1l
KSwKKyAgICAgICAgICAgIHRlc3RSZXN1bHQgPSB0ZXN0UnVubmVyLnJ1bk9uZVRlc3QodGVzdCwg
ZXh0cmFPcHRpb25zLCB1c2VKZXRTdHJlYW0ySGFybmVzcykKKworICAgICAgICAgICAgaWYgdGVz
dFJlc3VsdC5yZXR1cm5Db2RlID09IDAgYW5kIHRlc3RSZXN1bHQuZm9vdHByaW50IGFuZCB0ZXN0
UmVzdWx0LnBlYWtGb290cHJpbnQ6CisgICAgICAgICAgICAgICAgaWYgYXJncy52ZXJib3NlOgor
ICAgICAgICAgICAgICAgICAgICBwcmludCAiZm9vdHByaW50OiB7fSwgcGVhayBmb290cHJpbnQ6
IHt9Ii5mb3JtYXQodGVzdFJlc3VsdC5mb290cHJpbnQsIHRlc3RSZXN1bHQucGVha0Zvb3Rwcmlu
dCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwcmludAorCisg
ICAgICAgICAgICAgICAgaWYgdGVzdFJlc3VsdC5mb290cHJpbnQ6CisgICAgICAgICAgICAgICAg
ICAgIGZvb3RwcmludFNjb3Jlcy5hcHBlbmQoaW50KHRlc3RSZXN1bHQuZm9vdHByaW50KSkKKyAg
ICAgICAgICAgICAgICAgICAgZm9yIGNvdW50IGluIHJhbmdlKDAsIHdlaWdodCk6CisgICAgICAg
ICAgICAgICAgICAgICAgICBmb290cHJpbnRWYWx1ZXMuYXBwZW5kKHRlc3RSZXN1bHQuZm9vdHBy
aW50IC8gb25lTUIpCisgICAgICAgICAgICAgICAgaWYgdGVzdFJlc3VsdC5wZWFrRm9vdHByaW50
OgorICAgICAgICAgICAgICAgICAgICBwZWFrRm9vdHByaW50U2NvcmVzLmFwcGVuZChpbnQodGVz
dFJlc3VsdC5wZWFrRm9vdHByaW50KSkKKyAgICAgICAgICAgICAgICAgICAgZm9yIGNvdW50IGlu
IHJhbmdlKDAsIHdlaWdodCk6CisgICAgICAgICAgICAgICAgICAgICAgICBwZWFrRm9vdHByaW50
VmFsdWVzLmFwcGVuZCh0ZXN0UmVzdWx0LnBlYWtGb290cHJpbnQgLyBvbmVNQikKKyAgICAgICAg
ICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbWFpbi5oYXNGYWlsZWRSdW5zID0gVHJ1ZQorICAg
ICAgICAgICAgICAgIHByaW50ICJmYWlsZWQiLAorICAgICAgICAgICAgICAgIGlmIHRlc3RSZXN1
bHQucmV0dXJuQ29kZSAhPSAwOgorICAgICAgICAgICAgICAgICAgICBwcmludCAiIGV4aXQgY29k
ZSA9IHt9Ii5mb3JtYXQodGVzdFJlc3VsdC5yZXR1cm5Db2RlKSwKKyAgICAgICAgICAgICAgICBp
ZiBub3QgdGVzdFJlc3VsdC5mb290cHJpbnQ6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICIg
Zm9vdHByaW50ID0ge30iLmZvcm1hdCh0ZXN0UmVzdWx0LmZvb3RwcmludCksCisgICAgICAgICAg
ICAgICAgaWYgbm90IHRlc3RSZXN1bHQucGVha0Zvb3RwcmludDoKKyAgICAgICAgICAgICAgICAg
ICAgcHJpbnQgIiBwZWFrIGZvb3RwcmludCA9IHt9Ii5mb3JtYXQodGVzdFJlc3VsdC5wZWFrRm9v
dHByaW50KSwKKyAgICAgICAgICAgICAgICBwcmludAorCisgICAgICAgICAgICB0ZXN0U2NvcmVz
RGljdFt0ZXN0XSA9IHsibWV0cmljcyI6IHsiQWxsb2NhdGlvbnMiOiBbIkdlb21ldHJpYyJdfSwg
InRlc3RzIjogeyJlbmQiOiB7Im1ldHJpY3MiOiB7IkFsbG9jYXRpb25zIjogeyJjdXJyZW50Ijog
Zm9vdHByaW50U2NvcmVzfX19LCAicGVhayI6IHsibWV0cmljcyI6IHsiQWxsb2NhdGlvbnMiOiB7
ImN1cnJlbnQiOiBwZWFrRm9vdHByaW50U2NvcmVzfX19fX0KKworICAgICAgICByZXR1cm4gdGVz
dFNjb3Jlc0RpY3QKKworICAgIGN1cnJlbnRfcGF0aCA9IG9zLmdldGN3ZCgpCisgICAgb3MuY2hk
aXIocmFtaWZpY2F0aW9uX2RpcikgICMgVG8gYWxsb3cgSlMgbGlicmFyaWVzIHRvIGxvYWQKKwor
ICAgIGlmIGFyZ3MucnVuTHVhVGVzdHM6CisgICAgICAgIGlmIGFyZ3MudmVyYm9zZToKKyAgICAg
ICAgICAgIHByaW50ICI9PSBMdWFKU0ZpZ2h0IE5vIEpJVCB0ZXN0cyA9PSIKKworICAgICAgICAj
IFVzZSBzeXN0ZW0gbWFsbG9jIGZvciBMdWFKU0ZpZ2h0IHRlc3RzCisgICAgICAgIHRlc3RSdW5u
ZXIuc2V0RW52KCJNYWxsb2MiLCAiWCIpCisKKyAgICAgICAgc2NvcmVzRGljdCA9IHJ1blRlc3RM
aXN0KGx1YVRlc3RzLCBbIi0tdXNlSklUPWZhbHNlIiwgIi0tZm9yY2VNaW5pVk1Nb2RlPXRydWUi
XSwgdXNlSmV0U3RyZWFtMkhhcm5lc3M9RmFsc2UpCisKKyAgICAgICAgdGVzdFJlc3VsdHNEaWN0
WyJMdWFKU0ZpZ2h0IE5vIEpJVCBUZXN0cyJdID0geyJtZXRyaWNzIjogeyJBbGxvY2F0aW9ucyI6
IFsiR2VvbWV0cmljIl19LCAidGVzdHMiOiBzY29yZXNEaWN0fQorCisgICAgICAgIHRlc3RSdW5u
ZXIudW5zZXRFbnYoIk1hbGxvYyIpCisKKyAgICBpZiBhcmdzLnJ1bkdyb3VwZWRUZXN0czoKKyAg
ICAgICAgaWYgYXJncy52ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIj09IEdyb3VwZWQgdGVz
dHMgPT0iCisKKyAgICAgICAgc2NvcmVzRGljdCA9IHJ1blRlc3RMaXN0KGdyb3VwVGVzdHMpCisK
KyAgICAgICAgdGVzdFJlc3VsdHNEaWN0WyJHcm91cGVkIFRlc3RzIl0gPSB7Im1ldHJpY3MiOiB7
IkFsbG9jYXRpb25zIjogWyJHZW9tZXRyaWMiXX0sICJ0ZXN0cyI6IHNjb3Jlc0RpY3R9CisKKyAg
ICBpZiBhcmdzLnJ1bkpJVFRlc3RzOgorICAgICAgICBpZiBhcmdzLnZlcmJvc2U6CisgICAgICAg
ICAgICBwcmludCAiPT0gSklUIHRlc3RzID09IgorCisgICAgICAgIHNjb3Jlc0RpY3QgPSBydW5U
ZXN0TGlzdChqaXRUZXN0cykKKworICAgICAgICB0ZXN0UmVzdWx0c0RpY3RbIkpJVCBUZXN0cyJd
ID0geyJtZXRyaWNzIjogeyJBbGxvY2F0aW9ucyI6IFsiR2VvbWV0cmljIl19LCAidGVzdHMiOiBz
Y29yZXNEaWN0fQorCisgICAgaWYgYXJncy5ydW5Ob0pJVFRlc3RzOgorICAgICAgICBpZiBhcmdz
LnZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiPT0gTm8gSklUIHRlc3RzID09IgorCisgICAg
ICAgIHNjb3Jlc0RpY3QgPSBydW5UZXN0TGlzdChub25KSVRUZXN0cywgWyItLXVzZUpJVD1mYWxz
ZSIsICItZSIsICJ0ZXN0SXRlcmF0aW9uQ291bnQ9MSJdKQorCisgICAgICAgIHRlc3RSZXN1bHRz
RGljdFsiTm8gSklUIFRlc3RzIl0gPSB7Im1ldHJpY3MiOiB7IkFsbG9jYXRpb25zIjogWyJHZW9t
ZXRyaWMiXX0sICJ0ZXN0cyI6IHNjb3Jlc0RpY3R9CisKKyAgICBmb290cHJpbnRHZW9tZWFuID0g
aW50KGdlb21lYW4oZm9vdHByaW50VmFsdWVzKSAqIG9uZU1CKQorICAgIHBlYWtGb290cHJpbnRH
ZW9tZWFuID0gaW50KGdlb21lYW4ocGVha0Zvb3RwcmludFZhbHVlcykgKiBvbmVNQikKKyAgICB0
b3RhbFNjb3JlID0gaW50KGdlb21lYW4oW2Zvb3RwcmludEdlb21lYW4sIHBlYWtGb290cHJpbnRH
ZW9tZWFuXSkpCisKKyAgICBpZiBmb290cHJpbnRHZW9tZWFuOgorICAgICAgICBwcmludCAiRm9v
dHByaW50IGdlb21lYW46IHt9ICh7Oi4zZn0gTUIpIi5mb3JtYXQoZm9vdHByaW50R2VvbWVhbiwg
Zm9vdHByaW50R2VvbWVhbiAvIG9uZU1CKQorCisgICAgaWYgcGVha0Zvb3RwcmludEdlb21lYW46
CisgICAgICAgIHByaW50ICJQZWFrIEZvb3RwcmludCBnZW9tZWFuOiB7fSAoezouM2Z9IE1CKSIu
Zm9ybWF0KHBlYWtGb290cHJpbnRHZW9tZWFuLCBwZWFrRm9vdHByaW50R2VvbWVhbiAvIG9uZU1C
KQorCisgICAgaWYgZm9vdHByaW50R2VvbWVhbiBhbmQgcGVha0Zvb3RwcmludEdlb21lYW46Cisg
ICAgICAgIHByaW50ICJTY29yZToge30gKHs6LjNmfSBNQikiLmZvcm1hdCh0b3RhbFNjb3JlLCB0
b3RhbFNjb3JlIC8gb25lTUIpCisKKyAgICByZXN1bHRzRGljdCA9IHsiUkFNaWZpY2F0aW9uIjog
eyJtZXRyaWNzIjogeyJBbGxvY2F0aW9ucyI6IHsiY3VycmVudCI6IFt0b3RhbFNjb3JlXX19LCAi
dGVzdHMiOiB0ZXN0UmVzdWx0c0RpY3R9fQorCisgICAgb3MuY2hkaXIoY3VycmVudF9wYXRoKSAg
IyBSZXNldCB0aGUgcGF0aCBiYWNrIHRvIHdoYXQgaXQgd2FzIGJlZm9yZQorCisgICAgaWYgYXJn
cy5qc29uRmlsZW5hbWU6CisgICAgICAgIHdpdGggb3BlbihhcmdzLmpzb25GaWxlbmFtZSwgInci
KSBhcyBqc29uRmlsZToKKyAgICAgICAgICAgIGlmIGFyZ3MuZm9ybWF0SlNPTjoKKyAgICAgICAg
ICAgICAgICBqc29uLmR1bXAocmVzdWx0c0RpY3QsIGpzb25GaWxlLCBpbmRlbnQ9NCwgc2VwYXJh
dG9ycz0oJywnLCAnOiAnKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAganNv
bi5kdW1wKHJlc3VsdHNEaWN0LCBqc29uRmlsZSkKKworICAgIGlmIG1haW4uaGFzRmFpbGVkUnVu
czoKKyAgICAgICAgcHJpbnQgIkRldGVjdGVkIGZhaWxlZCBydW4ocyksIGV4aXRpbmcgd2l0aCBu
b24temVybyByZXR1cm4gY29kZSIKKworICAgIHJldHVybiBtYWluLmhhc0ZhaWxlZFJ1bnMKKwor
CitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIGV4aXQobWFpbigpKQpJbmRleDogUGVy
Zm9ybWFuY2VUZXN0cy9KZXRTdHJlYW0yL19faW5pdF9fLnB5Cj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KSW5kZXg6IFBl
cmZvcm1hbmNlVGVzdHMvSmV0U3RyZWFtMi9MdWFKU0ZpZ2h0L2hlbGxvX3dvcmxkLmpzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMvSmV0U3RyZWFtMi9MdWFKU0ZpZ2h0L2hlbGxvX3dv
cmxkLmpzCShyZXZpc2lvbiAyNDgzMDEpCisrKyBQZXJmb3JtYW5jZVRlc3RzL0pldFN0cmVhbTIv
THVhSlNGaWdodC9oZWxsb193b3JsZC5qcwkod29ya2luZyBjb3B5KQpAQCAtMSw1ICsxIEBACi1j
bGFzcyBCZW5jaG1hcmsgewotICAgIHJ1bkl0ZXJhdGlvbigpIHsKLSAgICAgICAgcHJpbnQoIkhl
bGxvIHdvcmxkISIpOwotICAgIH0KLX0KK3ByaW50KCJIZWxsbyB3b3JsZCEiKTsKSW5kZXg6IFBl
cmZvcm1hbmNlVGVzdHMvSmV0U3RyZWFtMi9MdWFKU0ZpZ2h0L2xpc3Rfc2VhcmNoLmpzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMvSmV0U3RyZWFtMi9MdWFKU0ZpZ2h0L2xpc3Rfc2Vh
cmNoLmpzCShyZXZpc2lvbiAyNDgzMDEpCisrKyBQZXJmb3JtYW5jZVRlc3RzL0pldFN0cmVhbTIv
THVhSlNGaWdodC9saXN0X3NlYXJjaC5qcwkod29ya2luZyBjb3B5KQpAQCAtOCwxNiArOCw1IEBA
IGZ1bmN0aW9uIGZpcnN0V2hlcmUobGlzdCwgZm4pIHsKIH0KIG51bXMgPSBbMSwgMiwgMywgNCwg
NSwgNiwgN107CiBmdW5jdGlvbiBpc0V2ZW4oeCkgeyByZXR1cm4gKHggJiAxKSA9PSAwOyB9Ci0K
LWZ1bmN0aW9uIHJ1bigpCi17Ci0gICAgZmlyc3RFdmVuID0gZmlyc3RXaGVyZShudW1zLCBpc0V2
ZW4pOwotICAgIHByaW50KCdGaXJzdCBldmVuOiAnICsgZmlyc3RFdmVuKQotfQotCi1jbGFzcyBC
ZW5jaG1hcmsgewotICAgIHJ1bkl0ZXJhdGlvbigpIHsKLSAgICAgICAgcnVuKCk7Ci0gICAgfQot
fQotCitmaXJzdEV2ZW4gPSBmaXJzdFdoZXJlKG51bXMsIGlzRXZlbik7CitwcmludCgnRmlyc3Qg
ZXZlbjogJyArIGZpcnN0RXZlbikKSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvSmV0U3RyZWFtMi9M
dWFKU0ZpZ2h0L2xpc3RzLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMvSmV0U3Ry
ZWFtMi9MdWFKU0ZpZ2h0L2xpc3RzLmpzCShyZXZpc2lvbiAyNDgzMDEpCisrKyBQZXJmb3JtYW5j
ZVRlc3RzL0pldFN0cmVhbTIvTHVhSlNGaWdodC9saXN0cy5qcwkod29ya2luZyBjb3B5KQpAQCAt
MiwxNyArMiw3IEBAIHZhciBuID0gNDAwMDA7CiB2YXIgaSA9IDA7CiB2YXIgaXRlbXMgPSBbXTsK
IAotZnVuY3Rpb24gcnVuKCkKLXsKLSAgICBpdGVtcyA9IFtdOwotICAgIHdoaWxlIChpIDwgbikg
ewotICAgICAgICBpdGVtcy5wdXNoKGkpOwotICAgICAgICBpID0gaSArIDE7Ci0gICAgfQotfQot
Ci1jbGFzcyBCZW5jaG1hcmsgewotICAgIHJ1bkl0ZXJhdGlvbigpIHsKLSAgICAgICAgcnVuKCk7
Ci0gICAgfQord2hpbGUgKGkgPCBuKSB7CisgICAgaXRlbXMucHVzaChpKTsKKyAgICBpID0gaSAr
IDE7CiB9CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL0pldFN0cmVhbTIvTHVhSlNGaWdodC9yaWNo
YXJkcy5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL0pldFN0cmVhbTIvTHVhSlNG
aWdodC9yaWNoYXJkcy5qcwkobm9uZXhpc3RlbnQpCisrKyBQZXJmb3JtYW5jZVRlc3RzL0pldFN0
cmVhbTIvTHVhSlNGaWdodC9yaWNoYXJkcy5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDUz
NyBAQAorLy8gQ29weXJpZ2h0IDIwMDYtMjAwOCB0aGUgVjggcHJvamVjdCBhdXRob3JzLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6
CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vICAgICAgIGNv
cHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
CisvLyAgICAgICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQKKy8vICAgICAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKy8vICAg
ICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMK
Ky8vICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUg
cHJvZHVjdHMgZGVyaXZlZAorLy8gICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJB
UyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwK
Ky8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKworLy8gVGhpcyBpcyBhIEph
dmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJpY2hhcmRzCisvLyBiZW5jaG1hcmsgZnJv
bToKKy8vCisvLyAgICBodHRwOi8vd3d3LmNsLmNhbS5hYy51ay9+bXIxMC9CZW5jaC5odG1sCisv
LworLy8gVGhlIGJlbmNobWFyayB3YXMgb3JpZ2luYWxseSBpbXBsZW1lbnRlZCBpbiBCQ1BMIGJ5
CisvLyBNYXJ0aW4gUmljaGFyZHMuCisKKworLyoqCisgKiBUaGUgUmljaGFyZHMgYmVuY2htYXJr
IHNpbXVsYXRlcyB0aGUgdGFzayBkaXNwYXRjaGVyIG9mIGFuCisgKiBvcGVyYXRpbmcgc3lzdGVt
LgorICoqLworZnVuY3Rpb24gcnVuUmljaGFyZHMoKSB7CisgIHZhciBzY2hlZHVsZXIgPSBuZXcg
U2NoZWR1bGVyKCk7CisgIHNjaGVkdWxlci5hZGRJZGxlVGFzayhJRF9JRExFLCAwLCBudWxsLCBD
T1VOVCk7CisKKyAgdmFyIHF1ZXVlID0gbmV3IFBhY2tldChudWxsLCBJRF9XT1JLRVIsIEtJTkRf
V09SSyk7CisgIHF1ZXVlID0gbmV3IFBhY2tldChxdWV1ZSwgIElEX1dPUktFUiwgS0lORF9XT1JL
KTsKKyAgc2NoZWR1bGVyLmFkZFdvcmtlclRhc2soSURfV09SS0VSLCAxMDAwLCBxdWV1ZSk7CisK
KyAgcXVldWUgPSBuZXcgUGFja2V0KG51bGwsIElEX0RFVklDRV9BLCBLSU5EX0RFVklDRSk7Cisg
IHF1ZXVlID0gbmV3IFBhY2tldChxdWV1ZSwgIElEX0RFVklDRV9BLCBLSU5EX0RFVklDRSk7Cisg
IHF1ZXVlID0gbmV3IFBhY2tldChxdWV1ZSwgIElEX0RFVklDRV9BLCBLSU5EX0RFVklDRSk7Cisg
IHNjaGVkdWxlci5hZGRIYW5kbGVyVGFzayhJRF9IQU5ETEVSX0EsIDIwMDAsIHF1ZXVlKTsKKwor
ICBxdWV1ZSA9IG5ldyBQYWNrZXQobnVsbCwgSURfREVWSUNFX0IsIEtJTkRfREVWSUNFKTsKKyAg
cXVldWUgPSBuZXcgUGFja2V0KHF1ZXVlLCAgSURfREVWSUNFX0IsIEtJTkRfREVWSUNFKTsKKyAg
cXVldWUgPSBuZXcgUGFja2V0KHF1ZXVlLCAgSURfREVWSUNFX0IsIEtJTkRfREVWSUNFKTsKKyAg
c2NoZWR1bGVyLmFkZEhhbmRsZXJUYXNrKElEX0hBTkRMRVJfQiwgMzAwMCwgcXVldWUpOworCisg
IHNjaGVkdWxlci5hZGREZXZpY2VUYXNrKElEX0RFVklDRV9BLCA0MDAwLCBudWxsKTsKKworICBz
Y2hlZHVsZXIuYWRkRGV2aWNlVGFzayhJRF9ERVZJQ0VfQiwgNTAwMCwgbnVsbCk7CisKKyAgc2No
ZWR1bGVyLnNjaGVkdWxlKCk7CisKKyAgaWYgKHNjaGVkdWxlci5xdWV1ZUNvdW50ICE9IEVYUEVD
VEVEX1FVRVVFX0NPVU5UIHx8CisgICAgICBzY2hlZHVsZXIuaG9sZENvdW50ICE9IEVYUEVDVEVE
X0hPTERfQ09VTlQpIHsKKyAgICB2YXIgbXNnID0KKyAgICAgICAgIkVycm9yIGR1cmluZyBleGVj
dXRpb246IHF1ZXVlQ291bnQgPSAiICsgc2NoZWR1bGVyLnF1ZXVlQ291bnQgKworICAgICAgICAi
LCBob2xkQ291bnQgPSAiICsgc2NoZWR1bGVyLmhvbGRDb3VudCArICIuIjsKKyAgICB0aHJvdyBu
ZXcgRXJyb3IobXNnKTsKKyAgfQorfQorCit2YXIgQ09VTlQgPSAxMDAwOworCisvKioKKyAqIFRo
ZXNlIHR3byBjb25zdGFudHMgc3BlY2lmeSBob3cgbWFueSB0aW1lcyBhIHBhY2tldCBpcyBxdWV1
ZWQgYW5kCisgKiBob3cgbWFueSB0aW1lcyBhIHRhc2sgaXMgcHV0IG9uIGhvbGQgaW4gYSBjb3Jy
ZWN0IHJ1biBvZiByaWNoYXJkcy4KKyAqIFRoZXkgZG9uJ3QgaGF2ZSBhbnkgbWVhbmluZyBhIHN1
Y2ggYnV0IGFyZSBjaGFyYWN0ZXJpc3RpYyBvZiBhCisgKiBjb3JyZWN0IHJ1biBzbyBpZiB0aGUg
YWN0dWFsIHF1ZXVlIG9yIGhvbGQgY291bnQgaXMgZGlmZmVyZW50IGZyb20KKyAqIHRoZSBleHBl
Y3RlZCB0aGVyZSBtdXN0IGJlIGEgYnVnIGluIHRoZSBpbXBsZW1lbnRhdGlvbi4KKyAqKi8KK3Zh
ciBFWFBFQ1RFRF9RVUVVRV9DT1VOVCA9IDIzMjI7Cit2YXIgRVhQRUNURURfSE9MRF9DT1VOVCA9
IDkyODsKKworCisvKioKKyAqIEEgc2NoZWR1bGVyIGNhbiBiZSB1c2VkIHRvIHNjaGVkdWxlIGEg
c2V0IG9mIHRhc2tzIGJhc2VkIG9uIHRoZWlyIHJlbGF0aXZlCisgKiBwcmlvcml0aWVzLiAgU2No
ZWR1bGluZyBpcyBkb25lIGJ5IG1haW50YWluaW5nIGEgbGlzdCBvZiB0YXNrIGNvbnRyb2wgYmxv
Y2tzCisgKiB3aGljaCBob2xkcyB0YXNrcyBhbmQgdGhlIGRhdGEgcXVldWUgdGhleSBhcmUgcHJv
Y2Vzc2luZy4KKyAqIEBjb25zdHJ1Y3RvcgorICovCitmdW5jdGlvbiBTY2hlZHVsZXIoKSB7Cisg
IHRoaXMucXVldWVDb3VudCA9IDA7CisgIHRoaXMuaG9sZENvdW50ID0gMDsKKyAgdGhpcy5ibG9j
a3MgPSBuZXcgQXJyYXkoTlVNQkVSX09GX0lEUyk7CisgIHRoaXMubGlzdCA9IG51bGw7CisgIHRo
aXMuY3VycmVudFRjYiA9IG51bGw7CisgIHRoaXMuY3VycmVudElkID0gbnVsbDsKK30KKwordmFy
IElEX0lETEUgICAgICAgPSAwOwordmFyIElEX1dPUktFUiAgICAgPSAxOwordmFyIElEX0hBTkRM
RVJfQSAgPSAyOwordmFyIElEX0hBTkRMRVJfQiAgPSAzOwordmFyIElEX0RFVklDRV9BICAgPSA0
OwordmFyIElEX0RFVklDRV9CICAgPSA1OwordmFyIE5VTUJFUl9PRl9JRFMgPSA2OworCit2YXIg
S0lORF9ERVZJQ0UgICA9IDA7Cit2YXIgS0lORF9XT1JLICAgICA9IDE7CisKKy8qKgorICogQWRk
IGFuIGlkbGUgdGFzayB0byB0aGlzIHNjaGVkdWxlci4KKyAqIEBwYXJhbSB7aW50fSBpZCB0aGUg
aWRlbnRpdHkgb2YgdGhlIHRhc2sKKyAqIEBwYXJhbSB7aW50fSBwcmlvcml0eSB0aGUgdGFzaydz
IHByaW9yaXR5CisgKiBAcGFyYW0ge1BhY2tldH0gcXVldWUgdGhlIHF1ZXVlIG9mIHdvcmsgdG8g
YmUgcHJvY2Vzc2VkIGJ5IHRoZSB0YXNrCisgKiBAcGFyYW0ge2ludH0gY291bnQgdGhlIG51bWJl
ciBvZiB0aW1lcyB0byBzY2hlZHVsZSB0aGUgdGFzaworICovCitTY2hlZHVsZXIucHJvdG90eXBl
LmFkZElkbGVUYXNrID0gZnVuY3Rpb24gKGlkLCBwcmlvcml0eSwgcXVldWUsIGNvdW50KSB7Cisg
IHRoaXMuYWRkUnVubmluZ1Rhc2soaWQsIHByaW9yaXR5LCBxdWV1ZSwgbmV3IElkbGVUYXNrKHRo
aXMsIDEsIGNvdW50KSk7Cit9OworCisvKioKKyAqIEFkZCBhIHdvcmsgdGFzayB0byB0aGlzIHNj
aGVkdWxlci4KKyAqIEBwYXJhbSB7aW50fSBpZCB0aGUgaWRlbnRpdHkgb2YgdGhlIHRhc2sKKyAq
IEBwYXJhbSB7aW50fSBwcmlvcml0eSB0aGUgdGFzaydzIHByaW9yaXR5CisgKiBAcGFyYW0ge1Bh
Y2tldH0gcXVldWUgdGhlIHF1ZXVlIG9mIHdvcmsgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSB0YXNr
CisgKi8KK1NjaGVkdWxlci5wcm90b3R5cGUuYWRkV29ya2VyVGFzayA9IGZ1bmN0aW9uIChpZCwg
cHJpb3JpdHksIHF1ZXVlKSB7CisgIHRoaXMuYWRkVGFzayhpZCwgcHJpb3JpdHksIHF1ZXVlLCBu
ZXcgV29ya2VyVGFzayh0aGlzLCBJRF9IQU5ETEVSX0EsIDApKTsKK307CisKKy8qKgorICogQWRk
IGEgaGFuZGxlciB0YXNrIHRvIHRoaXMgc2NoZWR1bGVyLgorICogQHBhcmFtIHtpbnR9IGlkIHRo
ZSBpZGVudGl0eSBvZiB0aGUgdGFzaworICogQHBhcmFtIHtpbnR9IHByaW9yaXR5IHRoZSB0YXNr
J3MgcHJpb3JpdHkKKyAqIEBwYXJhbSB7UGFja2V0fSBxdWV1ZSB0aGUgcXVldWUgb2Ygd29yayB0
byBiZSBwcm9jZXNzZWQgYnkgdGhlIHRhc2sKKyAqLworU2NoZWR1bGVyLnByb3RvdHlwZS5hZGRI
YW5kbGVyVGFzayA9IGZ1bmN0aW9uIChpZCwgcHJpb3JpdHksIHF1ZXVlKSB7CisgIHRoaXMuYWRk
VGFzayhpZCwgcHJpb3JpdHksIHF1ZXVlLCBuZXcgSGFuZGxlclRhc2sodGhpcykpOworfTsKKwor
LyoqCisgKiBBZGQgYSBoYW5kbGVyIHRhc2sgdG8gdGhpcyBzY2hlZHVsZXIuCisgKiBAcGFyYW0g
e2ludH0gaWQgdGhlIGlkZW50aXR5IG9mIHRoZSB0YXNrCisgKiBAcGFyYW0ge2ludH0gcHJpb3Jp
dHkgdGhlIHRhc2sncyBwcmlvcml0eQorICogQHBhcmFtIHtQYWNrZXR9IHF1ZXVlIHRoZSBxdWV1
ZSBvZiB3b3JrIHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgdGFzaworICovCitTY2hlZHVsZXIucHJv
dG90eXBlLmFkZERldmljZVRhc2sgPSBmdW5jdGlvbiAoaWQsIHByaW9yaXR5LCBxdWV1ZSkgewor
ICB0aGlzLmFkZFRhc2soaWQsIHByaW9yaXR5LCBxdWV1ZSwgbmV3IERldmljZVRhc2sodGhpcykp
Cit9OworCisvKioKKyAqIEFkZCB0aGUgc3BlY2lmaWVkIHRhc2sgYW5kIG1hcmsgaXQgYXMgcnVu
bmluZy4KKyAqIEBwYXJhbSB7aW50fSBpZCB0aGUgaWRlbnRpdHkgb2YgdGhlIHRhc2sKKyAqIEBw
YXJhbSB7aW50fSBwcmlvcml0eSB0aGUgdGFzaydzIHByaW9yaXR5CisgKiBAcGFyYW0ge1BhY2tl
dH0gcXVldWUgdGhlIHF1ZXVlIG9mIHdvcmsgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSB0YXNrCisg
KiBAcGFyYW0ge1Rhc2t9IHRhc2sgdGhlIHRhc2sgdG8gYWRkCisgKi8KK1NjaGVkdWxlci5wcm90
b3R5cGUuYWRkUnVubmluZ1Rhc2sgPSBmdW5jdGlvbiAoaWQsIHByaW9yaXR5LCBxdWV1ZSwgdGFz
aykgeworICB0aGlzLmFkZFRhc2soaWQsIHByaW9yaXR5LCBxdWV1ZSwgdGFzayk7CisgIHRoaXMu
Y3VycmVudFRjYi5zZXRSdW5uaW5nKCk7Cit9OworCisvKioKKyAqIEFkZCB0aGUgc3BlY2lmaWVk
IHRhc2sgdG8gdGhpcyBzY2hlZHVsZXIuCisgKiBAcGFyYW0ge2ludH0gaWQgdGhlIGlkZW50aXR5
IG9mIHRoZSB0YXNrCisgKiBAcGFyYW0ge2ludH0gcHJpb3JpdHkgdGhlIHRhc2sncyBwcmlvcml0
eQorICogQHBhcmFtIHtQYWNrZXR9IHF1ZXVlIHRoZSBxdWV1ZSBvZiB3b3JrIHRvIGJlIHByb2Nl
c3NlZCBieSB0aGUgdGFzaworICogQHBhcmFtIHtUYXNrfSB0YXNrIHRoZSB0YXNrIHRvIGFkZAor
ICovCitTY2hlZHVsZXIucHJvdG90eXBlLmFkZFRhc2sgPSBmdW5jdGlvbiAoaWQsIHByaW9yaXR5
LCBxdWV1ZSwgdGFzaykgeworICB0aGlzLmN1cnJlbnRUY2IgPSBuZXcgVGFza0NvbnRyb2xCbG9j
ayh0aGlzLmxpc3QsIGlkLCBwcmlvcml0eSwgcXVldWUsIHRhc2spOworICB0aGlzLmxpc3QgPSB0
aGlzLmN1cnJlbnRUY2I7CisgIHRoaXMuYmxvY2tzW2lkXSA9IHRoaXMuY3VycmVudFRjYjsKK307
CisKKy8qKgorICogRXhlY3V0ZSB0aGUgdGFza3MgbWFuYWdlZCBieSB0aGlzIHNjaGVkdWxlci4K
KyAqLworU2NoZWR1bGVyLnByb3RvdHlwZS5zY2hlZHVsZSA9IGZ1bmN0aW9uICgpIHsKKyAgdGhp
cy5jdXJyZW50VGNiID0gdGhpcy5saXN0OworICB3aGlsZSAodGhpcy5jdXJyZW50VGNiICE9IG51
bGwpIHsKKyAgICBpZiAodGhpcy5jdXJyZW50VGNiLmlzSGVsZE9yU3VzcGVuZGVkKCkpIHsKKyAg
ICAgIHRoaXMuY3VycmVudFRjYiA9IHRoaXMuY3VycmVudFRjYi5saW5rOworICAgIH0gZWxzZSB7
CisgICAgICB0aGlzLmN1cnJlbnRJZCA9IHRoaXMuY3VycmVudFRjYi5pZDsKKyAgICAgIHRoaXMu
Y3VycmVudFRjYiA9IHRoaXMuY3VycmVudFRjYi5ydW4oKTsKKyAgICB9CisgIH0KK307CisKKy8q
KgorICogUmVsZWFzZSBhIHRhc2sgdGhhdCBpcyBjdXJyZW50bHkgYmxvY2tlZCBhbmQgcmV0dXJu
IHRoZSBuZXh0IGJsb2NrIHRvIHJ1bi4KKyAqIEBwYXJhbSB7aW50fSBpZCB0aGUgaWQgb2YgdGhl
IHRhc2sgdG8gc3VzcGVuZAorICovCitTY2hlZHVsZXIucHJvdG90eXBlLnJlbGVhc2UgPSBmdW5j
dGlvbiAoaWQpIHsKKyAgdmFyIHRjYiA9IHRoaXMuYmxvY2tzW2lkXTsKKyAgaWYgKHRjYiA9PSBu
dWxsKSByZXR1cm4gdGNiOworICB0Y2IubWFya0FzTm90SGVsZCgpOworICBpZiAodGNiLnByaW9y
aXR5ID4gdGhpcy5jdXJyZW50VGNiLnByaW9yaXR5KSB7CisgICAgcmV0dXJuIHRjYjsKKyAgfSBl
bHNlIHsKKyAgICByZXR1cm4gdGhpcy5jdXJyZW50VGNiOworICB9Cit9OworCisvKioKKyAqIEJs
b2NrIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRhc2sgYW5kIHJldHVybiB0aGUgbmV4dCB0YXNr
IGNvbnRyb2wgYmxvY2sKKyAqIHRvIHJ1bi4gIFRoZSBibG9ja2VkIHRhc2sgd2lsbCBub3QgYmUg
bWFkZSBydW5uYWJsZSB1bnRpbCBpdCBpcyBleHBsaWNpdGx5CisgKiByZWxlYXNlZCwgZXZlbiBp
ZiBuZXcgd29yayBpcyBhZGRlZCB0byBpdC4KKyAqLworU2NoZWR1bGVyLnByb3RvdHlwZS5ob2xk
Q3VycmVudCA9IGZ1bmN0aW9uICgpIHsKKyAgdGhpcy5ob2xkQ291bnQrKzsKKyAgdGhpcy5jdXJy
ZW50VGNiLm1hcmtBc0hlbGQoKTsKKyAgcmV0dXJuIHRoaXMuY3VycmVudFRjYi5saW5rOworfTsK
KworLyoqCisgKiBTdXNwZW5kIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRhc2sgYW5kIHJldHVy
biB0aGUgbmV4dCB0YXNrIGNvbnRyb2wgYmxvY2sKKyAqIHRvIHJ1bi4gIElmIG5ldyB3b3JrIGlz
IGFkZGVkIHRvIHRoZSBzdXNwZW5kZWQgdGFzayBpdCB3aWxsIGJlIG1hZGUgcnVubmFibGUuCisg
Ki8KK1NjaGVkdWxlci5wcm90b3R5cGUuc3VzcGVuZEN1cnJlbnQgPSBmdW5jdGlvbiAoKSB7Cisg
IHRoaXMuY3VycmVudFRjYi5tYXJrQXNTdXNwZW5kZWQoKTsKKyAgcmV0dXJuIHRoaXMuY3VycmVu
dFRjYjsKK307CisKKy8qKgorICogQWRkIHRoZSBzcGVjaWZpZWQgcGFja2V0IHRvIHRoZSBlbmQg
b2YgdGhlIHdvcmtsaXN0IHVzZWQgYnkgdGhlIHRhc2sKKyAqIGFzc29jaWF0ZWQgd2l0aCB0aGUg
cGFja2V0IGFuZCBtYWtlIHRoZSB0YXNrIHJ1bm5hYmxlIGlmIGl0IGlzIGN1cnJlbnRseQorICog
c3VzcGVuZGVkLgorICogQHBhcmFtIHtQYWNrZXR9IHBhY2tldCB0aGUgcGFja2V0IHRvIGFkZAor
ICovCitTY2hlZHVsZXIucHJvdG90eXBlLnF1ZXVlID0gZnVuY3Rpb24gKHBhY2tldCkgeworICB2
YXIgdCA9IHRoaXMuYmxvY2tzW3BhY2tldC5pZF07CisgIGlmICh0ID09IG51bGwpIHJldHVybiB0
OworICB0aGlzLnF1ZXVlQ291bnQrKzsKKyAgcGFja2V0LmxpbmsgPSBudWxsOworICBwYWNrZXQu
aWQgPSB0aGlzLmN1cnJlbnRJZDsKKyAgcmV0dXJuIHQuY2hlY2tQcmlvcml0eUFkZCh0aGlzLmN1
cnJlbnRUY2IsIHBhY2tldCk7Cit9OworCisvKioKKyAqIEEgdGFzayBjb250cm9sIGJsb2NrIG1h
bmFnZXMgYSB0YXNrIGFuZCB0aGUgcXVldWUgb2Ygd29yayBwYWNrYWdlcyBhc3NvY2lhdGVkCisg
KiB3aXRoIGl0LgorICogQHBhcmFtIHtUYXNrQ29udHJvbEJsb2NrfSBsaW5rIHRoZSBwcmVjZWRp
bmcgYmxvY2sgaW4gdGhlIGxpbmtlZCBibG9jayBsaXN0CisgKiBAcGFyYW0ge2ludH0gaWQgdGhl
IGlkIG9mIHRoaXMgYmxvY2sKKyAqIEBwYXJhbSB7aW50fSBwcmlvcml0eSB0aGUgcHJpb3JpdHkg
b2YgdGhpcyBibG9jaworICogQHBhcmFtIHtQYWNrZXR9IHF1ZXVlIHRoZSBxdWV1ZSBvZiBwYWNr
YWdlcyB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIHRhc2sKKyAqIEBwYXJhbSB7VGFza30gdGFzayB0
aGUgdGFzaworICogQGNvbnN0cnVjdG9yCisgKi8KK2Z1bmN0aW9uIFRhc2tDb250cm9sQmxvY2so
bGluaywgaWQsIHByaW9yaXR5LCBxdWV1ZSwgdGFzaykgeworICB0aGlzLmxpbmsgPSBsaW5rOwor
ICB0aGlzLmlkID0gaWQ7CisgIHRoaXMucHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgdGhpcy5xdWV1
ZSA9IHF1ZXVlOworICB0aGlzLnRhc2sgPSB0YXNrOworICBpZiAocXVldWUgPT0gbnVsbCkgewor
ICAgIHRoaXMuc3RhdGUgPSBTVEFURV9TVVNQRU5ERUQ7CisgIH0gZWxzZSB7CisgICAgdGhpcy5z
dGF0ZSA9IFNUQVRFX1NVU1BFTkRFRF9SVU5OQUJMRTsKKyAgfQorfQorCisvKioKKyAqIFRoZSB0
YXNrIGlzIHJ1bm5pbmcgYW5kIGlzIGN1cnJlbnRseSBzY2hlZHVsZWQuCisgKi8KK3ZhciBTVEFU
RV9SVU5OSU5HID0gMDsKKworLyoqCisgKiBUaGUgdGFzayBoYXMgcGFja2V0cyBsZWZ0IHRvIHBy
b2Nlc3MuCisgKi8KK3ZhciBTVEFURV9SVU5OQUJMRSA9IDE7CisKKy8qKgorICogVGhlIHRhc2sg
aXMgbm90IGN1cnJlbnRseSBydW5uaW5nLiAgVGhlIHRhc2sgaXMgbm90IGJsb2NrZWQgYXMgc3Vj
aCBhbmQgbWF5CisqIGJlIHN0YXJ0ZWQgYnkgdGhlIHNjaGVkdWxlci4KKyAqLwordmFyIFNUQVRF
X1NVU1BFTkRFRCA9IDI7CisKKy8qKgorICogVGhlIHRhc2sgaXMgYmxvY2tlZCBhbmQgY2Fubm90
IGJlIHJ1biB1bnRpbCBpdCBpcyBleHBsaWNpdGx5IHJlbGVhc2VkLgorICovCit2YXIgU1RBVEVf
SEVMRCA9IDQ7CisKK3ZhciBTVEFURV9TVVNQRU5ERURfUlVOTkFCTEUgPSBTVEFURV9TVVNQRU5E
RUQgfCBTVEFURV9SVU5OQUJMRTsKK3ZhciBTVEFURV9OT1RfSEVMRCA9IH5TVEFURV9IRUxEOwor
CitUYXNrQ29udHJvbEJsb2NrLnByb3RvdHlwZS5zZXRSdW5uaW5nID0gZnVuY3Rpb24gKCkgewor
ICB0aGlzLnN0YXRlID0gU1RBVEVfUlVOTklORzsKK307CisKK1Rhc2tDb250cm9sQmxvY2sucHJv
dG90eXBlLm1hcmtBc05vdEhlbGQgPSBmdW5jdGlvbiAoKSB7CisgIHRoaXMuc3RhdGUgPSB0aGlz
LnN0YXRlICYgU1RBVEVfTk9UX0hFTEQ7Cit9OworCitUYXNrQ29udHJvbEJsb2NrLnByb3RvdHlw
ZS5tYXJrQXNIZWxkID0gZnVuY3Rpb24gKCkgeworICB0aGlzLnN0YXRlID0gdGhpcy5zdGF0ZSB8
IFNUQVRFX0hFTEQ7Cit9OworCitUYXNrQ29udHJvbEJsb2NrLnByb3RvdHlwZS5pc0hlbGRPclN1
c3BlbmRlZCA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuICh0aGlzLnN0YXRlICYgU1RBVEVfSEVM
RCkgIT0gMCB8fCAodGhpcy5zdGF0ZSA9PSBTVEFURV9TVVNQRU5ERUQpOworfTsKKworVGFza0Nv
bnRyb2xCbG9jay5wcm90b3R5cGUubWFya0FzU3VzcGVuZGVkID0gZnVuY3Rpb24gKCkgeworICB0
aGlzLnN0YXRlID0gdGhpcy5zdGF0ZSB8IFNUQVRFX1NVU1BFTkRFRDsKK307CisKK1Rhc2tDb250
cm9sQmxvY2sucHJvdG90eXBlLm1hcmtBc1J1bm5hYmxlID0gZnVuY3Rpb24gKCkgeworICB0aGlz
LnN0YXRlID0gdGhpcy5zdGF0ZSB8IFNUQVRFX1JVTk5BQkxFOworfTsKKworLyoqCisgKiBSdW5z
IHRoaXMgdGFzaywgaWYgaXQgaXMgcmVhZHkgdG8gYmUgcnVuLCBhbmQgcmV0dXJucyB0aGUgbmV4
dCB0YXNrIHRvIHJ1bi4KKyAqLworVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUucnVuID0gZnVu
Y3Rpb24gKCkgeworICB2YXIgcGFja2V0OworICBpZiAodGhpcy5zdGF0ZSA9PSBTVEFURV9TVVNQ
RU5ERURfUlVOTkFCTEUpIHsKKyAgICBwYWNrZXQgPSB0aGlzLnF1ZXVlOworICAgIHRoaXMucXVl
dWUgPSBwYWNrZXQubGluazsKKyAgICBpZiAodGhpcy5xdWV1ZSA9PSBudWxsKSB7CisgICAgICB0
aGlzLnN0YXRlID0gU1RBVEVfUlVOTklORzsKKyAgICB9IGVsc2UgeworICAgICAgdGhpcy5zdGF0
ZSA9IFNUQVRFX1JVTk5BQkxFOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBwYWNrZXQgPSBudWxs
OworICB9CisgIHJldHVybiB0aGlzLnRhc2sucnVuKHBhY2tldCk7Cit9OworCisvKioKKyAqIEFk
ZHMgYSBwYWNrZXQgdG8gdGhlIHdvcmtsaXN0IG9mIHRoaXMgYmxvY2sncyB0YXNrLCBtYXJrcyB0
aGlzIGFzIHJ1bm5hYmxlIGlmCisgKiBuZWNlc3NhcnksIGFuZCByZXR1cm5zIHRoZSBuZXh0IHJ1
bm5hYmxlIG9iamVjdCB0byBydW4gKHRoZSBvbmUKKyAqIHdpdGggdGhlIGhpZ2hlc3QgcHJpb3Jp
dHkpLgorICovCitUYXNrQ29udHJvbEJsb2NrLnByb3RvdHlwZS5jaGVja1ByaW9yaXR5QWRkID0g
ZnVuY3Rpb24gKHRhc2ssIHBhY2tldCkgeworICBpZiAodGhpcy5xdWV1ZSA9PSBudWxsKSB7Cisg
ICAgdGhpcy5xdWV1ZSA9IHBhY2tldDsKKyAgICB0aGlzLm1hcmtBc1J1bm5hYmxlKCk7CisgICAg
aWYgKHRoaXMucHJpb3JpdHkgPiB0YXNrLnByaW9yaXR5KSByZXR1cm4gdGhpczsKKyAgfSBlbHNl
IHsKKyAgICB0aGlzLnF1ZXVlID0gcGFja2V0LmFkZFRvKHRoaXMucXVldWUpOworICB9CisgIHJl
dHVybiB0YXNrOworfTsKKworVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUudG9TdHJpbmcgPSBm
dW5jdGlvbiAoKSB7CisgIHJldHVybiAidGNiIHsgIiArIHRoaXMudGFzayArICJAIiArIHRoaXMu
c3RhdGUgKyAiIH0iOworfTsKKworLyoqCisgKiBBbiBpZGxlIHRhc2sgZG9lc24ndCBkbyBhbnkg
d29yayBpdHNlbGYgYnV0IGN5Y2xlcyBjb250cm9sIGJldHdlZW4gdGhlIHR3bworICogZGV2aWNl
IHRhc2tzLgorICogQHBhcmFtIHtTY2hlZHVsZXJ9IHNjaGVkdWxlciB0aGUgc2NoZWR1bGVyIHRo
YXQgbWFuYWdlcyB0aGlzIHRhc2sKKyAqIEBwYXJhbSB7aW50fSB2MSBhIHNlZWQgdmFsdWUgdGhh
dCBjb250cm9scyBob3cgdGhlIGRldmljZSB0YXNrcyBhcmUgc2NoZWR1bGVkCisgKiBAcGFyYW0g
e2ludH0gY291bnQgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIHRhc2sgc2hvdWxkIGJlIHNjaGVk
dWxlZAorICogQGNvbnN0cnVjdG9yCisgKi8KK2Z1bmN0aW9uIElkbGVUYXNrKHNjaGVkdWxlciwg
djEsIGNvdW50KSB7CisgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyOworICB0aGlzLnYxID0g
djE7CisgIHRoaXMuY291bnQgPSBjb3VudDsKK30KKworSWRsZVRhc2sucHJvdG90eXBlLnJ1biA9
IGZ1bmN0aW9uIChwYWNrZXQpIHsKKyAgdGhpcy5jb3VudC0tOworICBpZiAodGhpcy5jb3VudCA9
PSAwKSByZXR1cm4gdGhpcy5zY2hlZHVsZXIuaG9sZEN1cnJlbnQoKTsKKyAgaWYgKCh0aGlzLnYx
ICYgMSkgPT0gMCkgeworICAgIHRoaXMudjEgPSB0aGlzLnYxID4+IDE7CisgICAgcmV0dXJuIHRo
aXMuc2NoZWR1bGVyLnJlbGVhc2UoSURfREVWSUNFX0EpOworICB9IGVsc2UgeworICAgIHRoaXMu
djEgPSAodGhpcy52MSA+PiAxKSBeIDB4RDAwODsKKyAgICByZXR1cm4gdGhpcy5zY2hlZHVsZXIu
cmVsZWFzZShJRF9ERVZJQ0VfQik7CisgIH0KK307CisKK0lkbGVUYXNrLnByb3RvdHlwZS50b1N0
cmluZyA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuICJJZGxlVGFzayIKK307CisKKy8qKgorICog
QSB0YXNrIHRoYXQgc3VzcGVuZHMgaXRzZWxmIGFmdGVyIGVhY2ggdGltZSBpdCBoYXMgYmVlbiBy
dW4gdG8gc2ltdWxhdGUKKyAqIHdhaXRpbmcgZm9yIGRhdGEgZnJvbSBhbiBleHRlcm5hbCBkZXZp
Y2UuCisgKiBAcGFyYW0ge1NjaGVkdWxlcn0gc2NoZWR1bGVyIHRoZSBzY2hlZHVsZXIgdGhhdCBt
YW5hZ2VzIHRoaXMgdGFzaworICogQGNvbnN0cnVjdG9yCisgKi8KK2Z1bmN0aW9uIERldmljZVRh
c2soc2NoZWR1bGVyKSB7CisgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyOworICB0aGlzLnYx
ID0gbnVsbDsKK30KKworRGV2aWNlVGFzay5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKHBhY2tl
dCkgeworICBpZiAocGFja2V0ID09IG51bGwpIHsKKyAgICBpZiAodGhpcy52MSA9PSBudWxsKSBy
ZXR1cm4gdGhpcy5zY2hlZHVsZXIuc3VzcGVuZEN1cnJlbnQoKTsKKyAgICB2YXIgdiA9IHRoaXMu
djE7CisgICAgdGhpcy52MSA9IG51bGw7CisgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVyLnF1ZXVl
KHYpOworICB9IGVsc2UgeworICAgIHRoaXMudjEgPSBwYWNrZXQ7CisgICAgcmV0dXJuIHRoaXMu
c2NoZWR1bGVyLmhvbGRDdXJyZW50KCk7CisgIH0KK307CisKK0RldmljZVRhc2sucHJvdG90eXBl
LnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gIkRldmljZVRhc2siOworfTsKKwor
LyoqCisgKiBBIHRhc2sgdGhhdCBtYW5pcHVsYXRlcyB3b3JrIHBhY2tldHMuCisgKiBAcGFyYW0g
e1NjaGVkdWxlcn0gc2NoZWR1bGVyIHRoZSBzY2hlZHVsZXIgdGhhdCBtYW5hZ2VzIHRoaXMgdGFz
aworICogQHBhcmFtIHtpbnR9IHYxIGEgc2VlZCB1c2VkIHRvIHNwZWNpZnkgaG93IHdvcmsgcGFj
a2V0cyBhcmUgbWFuaXB1bGF0ZWQKKyAqIEBwYXJhbSB7aW50fSB2MiBhbm90aGVyIHNlZWQgdXNl
ZCB0byBzcGVjaWZ5IGhvdyB3b3JrIHBhY2tldHMgYXJlIG1hbmlwdWxhdGVkCisgKiBAY29uc3Ry
dWN0b3IKKyAqLworZnVuY3Rpb24gV29ya2VyVGFzayhzY2hlZHVsZXIsIHYxLCB2MikgeworICB0
aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjsKKyAgdGhpcy52MSA9IHYxOworICB0aGlzLnYyID0g
djI7Cit9CisKK1dvcmtlclRhc2sucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIChwYWNrZXQpIHsK
KyAgaWYgKHBhY2tldCA9PSBudWxsKSB7CisgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVyLnN1c3Bl
bmRDdXJyZW50KCk7CisgIH0gZWxzZSB7CisgICAgaWYgKHRoaXMudjEgPT0gSURfSEFORExFUl9B
KSB7CisgICAgICB0aGlzLnYxID0gSURfSEFORExFUl9COworICAgIH0gZWxzZSB7CisgICAgICB0
aGlzLnYxID0gSURfSEFORExFUl9BOworICAgIH0KKyAgICBwYWNrZXQuaWQgPSB0aGlzLnYxOwor
ICAgIHBhY2tldC5hMSA9IDA7CisgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBEQVRBX1NJWkU7IGkr
KykgeworICAgICAgdGhpcy52MisrOworICAgICAgaWYgKHRoaXMudjIgPiAyNikgdGhpcy52MiA9
IDE7CisgICAgICBwYWNrZXQuYTJbaV0gPSB0aGlzLnYyOworICAgIH0KKyAgICByZXR1cm4gdGhp
cy5zY2hlZHVsZXIucXVldWUocGFja2V0KTsKKyAgfQorfTsKKworV29ya2VyVGFzay5wcm90b3R5
cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiAiV29ya2VyVGFzayI7Cit9Owor
CisvKioKKyAqIEEgdGFzayB0aGF0IG1hbmlwdWxhdGVzIHdvcmsgcGFja2V0cyBhbmQgdGhlbiBz
dXNwZW5kcyBpdHNlbGYuCisgKiBAcGFyYW0ge1NjaGVkdWxlcn0gc2NoZWR1bGVyIHRoZSBzY2hl
ZHVsZXIgdGhhdCBtYW5hZ2VzIHRoaXMgdGFzaworICogQGNvbnN0cnVjdG9yCisgKi8KK2Z1bmN0
aW9uIEhhbmRsZXJUYXNrKHNjaGVkdWxlcikgeworICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxl
cjsKKyAgdGhpcy52MSA9IG51bGw7CisgIHRoaXMudjIgPSBudWxsOworfQorCitIYW5kbGVyVGFz
ay5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24gKHBhY2tldCkgeworICBpZiAocGFja2V0ICE9IG51
bGwpIHsKKyAgICBpZiAocGFja2V0LmtpbmQgPT0gS0lORF9XT1JLKSB7CisgICAgICB0aGlzLnYx
ID0gcGFja2V0LmFkZFRvKHRoaXMudjEpOworICAgIH0gZWxzZSB7CisgICAgICB0aGlzLnYyID0g
cGFja2V0LmFkZFRvKHRoaXMudjIpOworICAgIH0KKyAgfQorICBpZiAodGhpcy52MSAhPSBudWxs
KSB7CisgICAgdmFyIGNvdW50ID0gdGhpcy52MS5hMTsKKyAgICB2YXIgdjsKKyAgICBpZiAoY291
bnQgPCBEQVRBX1NJWkUpIHsKKyAgICAgIGlmICh0aGlzLnYyICE9IG51bGwpIHsKKyAgICAgICAg
diA9IHRoaXMudjI7CisgICAgICAgIHRoaXMudjIgPSB0aGlzLnYyLmxpbms7CisgICAgICAgIHYu
YTEgPSB0aGlzLnYxLmEyW2NvdW50XTsKKyAgICAgICAgdGhpcy52MS5hMSA9IGNvdW50ICsgMTsK
KyAgICAgICAgcmV0dXJuIHRoaXMuc2NoZWR1bGVyLnF1ZXVlKHYpOworICAgICAgfQorICAgIH0g
ZWxzZSB7CisgICAgICB2ID0gdGhpcy52MTsKKyAgICAgIHRoaXMudjEgPSB0aGlzLnYxLmxpbms7
CisgICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZXIucXVldWUodik7CisgICAgfQorICB9CisgIHJl
dHVybiB0aGlzLnNjaGVkdWxlci5zdXNwZW5kQ3VycmVudCgpOworfTsKKworSGFuZGxlclRhc2su
cHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gIkhhbmRsZXJUYXNr
IjsKK307CisKKy8qIC0tLSAqCisgKiBQIGEgYyBrIGUgdAorICogLS0tICovCisKK3ZhciBEQVRB
X1NJWkUgPSA0OworCisvKioKKyAqIEEgc2ltcGxlIHBhY2thZ2Ugb2YgZGF0YSB0aGF0IGlzIG1h
bmlwdWxhdGVkIGJ5IHRoZSB0YXNrcy4gIFRoZSBleGFjdCBsYXlvdXQKKyAqIG9mIHRoZSBwYXls
b2FkIGRhdGEgY2FycmllZCBieSBhIHBhY2tldCBpcyBub3QgaW1wb3J0YWludCwgYW5kIG5laXRo
ZXIgaXMgdGhlCisgKiBuYXR1cmUgb2YgdGhlIHdvcmsgcGVyZm9ybWVkIG9uIHBhY2tldHMgYnkg
dGhlIHRhc2tzLgorICoKKyAqIEJlc2lkZXMgY2FycnlpbmcgZGF0YSwgcGFja2V0cyBmb3JtIGxp
bmtlZCBsaXN0cyBhbmQgYXJlIGhlbmNlIHVzZWQgYm90aCBhcworICogZGF0YSBhbmQgd29ya2xp
c3RzLgorICogQHBhcmFtIHtQYWNrZXR9IGxpbmsgdGhlIHRhaWwgb2YgdGhlIGxpbmtlZCBsaXN0
IG9mIHBhY2tldHMKKyAqIEBwYXJhbSB7aW50fSBpZCBhbiBJRCBmb3IgdGhpcyBwYWNrZXQKKyAq
IEBwYXJhbSB7aW50fSBraW5kIHRoZSB0eXBlIG9mIHRoaXMgcGFja2V0CisgKiBAY29uc3RydWN0
b3IKKyAqLworZnVuY3Rpb24gUGFja2V0KGxpbmssIGlkLCBraW5kKSB7CisgIHRoaXMubGluayA9
IGxpbms7CisgIHRoaXMuaWQgPSBpZDsKKyAgdGhpcy5raW5kID0ga2luZDsKKyAgdGhpcy5hMSA9
IDA7CisgIHRoaXMuYTIgPSBuZXcgQXJyYXkoREFUQV9TSVpFKTsKK30KKworLyoqCisgKiBBZGQg
dGhpcyBwYWNrZXQgdG8gdGhlIGVuZCBvZiBhIHdvcmtsaXN0LCBhbmQgcmV0dXJuIHRoZSB3b3Jr
bGlzdC4KKyAqIEBwYXJhbSB7UGFja2V0fSBxdWV1ZSB0aGUgd29ya2xpc3QgdG8gYWRkIHRoaXMg
cGFja2V0IHRvCisgKi8KK1BhY2tldC5wcm90b3R5cGUuYWRkVG8gPSBmdW5jdGlvbiAocXVldWUp
IHsKKyAgdGhpcy5saW5rID0gbnVsbDsKKyAgaWYgKHF1ZXVlID09IG51bGwpIHJldHVybiB0aGlz
OworICB2YXIgcGVlaywgbmV4dCA9IHF1ZXVlOworICB3aGlsZSAoKHBlZWsgPSBuZXh0Lmxpbmsp
ICE9IG51bGwpCisgICAgbmV4dCA9IHBlZWs7CisgIG5leHQubGluayA9IHRoaXM7CisgIHJldHVy
biBxdWV1ZTsKK307CisKK1BhY2tldC5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7
CisgIHJldHVybiAiUGFja2V0IjsKK307CisKKworcnVuUmljaGFyZHMoKTsKSW5kZXg6IFBlcmZv
cm1hbmNlVGVzdHMvSmV0U3RyZWFtMi9MdWFKU0ZpZ2h0L3N0cmluZ19saXN0cy5qcwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL0pldFN0cmVhbTIvTHVhSlNGaWdodC9zdHJpbmdfbGlz
dHMuanMJKHJldmlzaW9uIDI0ODMwMSkKKysrIFBlcmZvcm1hbmNlVGVzdHMvSmV0U3RyZWFtMi9M
dWFKU0ZpZ2h0L3N0cmluZ19saXN0cy5qcwkod29ya2luZyBjb3B5KQpAQCAtMiwxNyArMiw3IEBA
IHZhciBuID0gNDAwMDA7CiB2YXIgaSA9IDA7CiB2YXIgaXRlbXMgPSBbXTsKIAotZnVuY3Rpb24g
cnVuKCkKLXsKLSAgICBpdGVtcyA9IFtdOwotICAgIHdoaWxlIChpIDwgbikgewotICAgICAgICBp
dGVtcy5wdXNoKCJkaWdpdCIgKyBpKTsKLSAgICAgICAgaSA9IGkgKyAxOwotICAgIH0KLX0KLQot
Y2xhc3MgQmVuY2htYXJrIHsKLSAgICBydW5JdGVyYXRpb24oKSB7Ci0gICAgICAgIHJ1bigpOwot
ICAgIH0KK3doaWxlIChpIDwgbikgeworICAgIGl0ZW1zLnB1c2goImRpZ2l0IiArIGkpOworICAg
IGkgPSBpICsgMTsKIH0K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>375647</attachid>
            <date>2019-08-06 13:23:07 -0700</date>
            <delta_ts>2019-08-06 15:10:36 -0700</delta_ts>
            <desc>Updated patch responding to review comments</desc>
            <filename>195012-2.patch</filename>
            <type>text/plain</type>
            <size>39299</size>
            <attacher name="Michael Saboff">msaboff</attacher>
            
              <data encoding="base64">SW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1h
bmNlVGVzdHMvQ2hhbmdlTG9nCShyZXZpc2lvbiAyNDgzMDEpCisrKyBQZXJmb3JtYW5jZVRlc3Rz
L0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEwMyBAQAorMjAxOS0wOC0wNiAg
TWljaGFlbCBTYWJvZmYgIDxtc2Fib2ZmQGFwcGxlLmNvbT4KKworICAgICAgICBNYWtlIEpTQyBt
ZW1vcnkgYmVuY2htYXJrIGF2YWlsYWJsZSBvbiBPcGVuU291cmNlCisgICAgICAgIGh0dHBzOi8v
YnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xOTUwMTIKKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBUaGlzIHBhdGNoIHVwc3RyZWFtcyB0aGUg
UkFNaWZpY2F0aW9uIG1lbW9yeSBiZW5jaG1hcmsgdG8gb3BlbiBzb3VyY2UuCisKKyAgICAgICAg
VGhlIHByaW9yIFJBTWlmaWNhdGlvbi5weSBkcml2ZXIgc2NyaXB0IGluIHRoZSBJbnRlcm5hbCBk
aXJlY3RvcnkgaGFzIGJlZW4gbW92ZWQgaGVyZQorICAgICAgICB3aXRoIHRoZSBkZXZpY2UgZXhl
Y3V0aW9uIGNvZGUgc2VwZXJhdGVkIG91dCB0byBhIG5ldyBJbnRlcm5hbCBkcml2ZXIgc2NyaXB0
LgorICAgICAgICBBcyBhIHJlc3VsdCwgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHBhcnNpbmcgYXMg
d2VsbCBhcyBhY3Rpbmcgb24gdGhlIHJlc3VsdGluZyBhcmd1bWVudAorICAgICAgICB2YWx1ZXMg
aGFzIGNoYW5nZWQuICBUaGUgcmVtb3RlIGRldmljZSBSdW5uZXIgY3JlYXRlcyBhbiBBcmd1bWVu
dFBhcnNlciBvYmplY3QgdGhhdCBpcworICAgICAgICBwYXNzZWQgdGhyb3VnaCBtYWluKCkuICBJ
biBtYWluKCksIGlmIHdlIGhhdmUgYW4gQXJndW1lbnRQYXJzZXIsIHdlIHVzZSBpdCBvdGhlcndp
c2Ugd2UKKyAgICAgICAgY3JlYXRlIG9uZSBmb3IgYmVuY2htYXJraW5nIGxvY2FsbHkuICBUaGUg
YXJndW1lbnRzIG9iamVjdCByZXR1cm5lZCBmcm9tIGFyZ3VtZW50CisgICAgICAgIHBhcnNpbmcg
aXMgbm93IHBhc3NlZCB0byB0aGUgUnVubmVyIGNvbnN0cnVjdG9yIHNvIGl0IGNhbiBleHRyYWN0
IHRoZSBzZXR0aW5ncyBhcHByb3ByaWF0ZQorICAgICAgICBmb3IgdGhhdCBwYXJ0aWN1bGFyIHJ1
bm5lci4KKworICAgICAgICBBZGRlZCBzb21lIHNhbmUgYXJndW1lbnQgZGVmYXVsdCB2YWx1ZXMg
Zm9yIHRoZSBKU0MgY29tbWFuZCBwYXRjaCBhbmQgdGhlIEpldFN0cmVhbTIKKyAgICAgICAgc291
cmNlIGRpcmVjdG9yeS4KKworICAgICAgICBVcGRhdGVkIHRoZSBMdWEgdGVzdHMgdG8gZWxpbWlu
YXRlIHRoZSB0ZXN0aW5nIGhhcm5lc3MgYW5kIGl0cyBvdmVyaGVhZCwgbWF0Y2hpbmcgd2hhdCB3
YXMKKyAgICAgICAgZG9uZSBpbiB0aGUgSW50ZXJuYWwgdHJlZS4KKworICAgICAgICAqIEpldFN0
cmVhbTIvTHVhSlNGaWdodC9oZWxsb193b3JsZC5qczoKKyAgICAgICAgKEJlbmNobWFyay5wcm90
b3R5cGUucnVuSXRlcmF0aW9uKTogRGVsZXRlZC4KKyAgICAgICAgKEJlbmNobWFyayk6IERlbGV0
ZWQuCisgICAgICAgICogSmV0U3RyZWFtMi9MdWFKU0ZpZ2h0L2xpc3Rfc2VhcmNoLmpzOgorICAg
ICAgICAocnVuKTogRGVsZXRlZC4KKyAgICAgICAgKEJlbmNobWFyay5wcm90b3R5cGUucnVuSXRl
cmF0aW9uKTogRGVsZXRlZC4KKyAgICAgICAgKEJlbmNobWFyayk6IERlbGV0ZWQuCisgICAgICAg
ICogSmV0U3RyZWFtMi9MdWFKU0ZpZ2h0L2xpc3RzLmpzOgorICAgICAgICAoKTogRGVsZXRlZC4K
KyAgICAgICAgKEJlbmNobWFyay5wcm90b3R5cGUucnVuSXRlcmF0aW9uKTogRGVsZXRlZC4KKyAg
ICAgICAgKEJlbmNobWFyayk6IERlbGV0ZWQuCisgICAgICAgICogSmV0U3RyZWFtMi9MdWFKU0Zp
Z2h0L3JpY2hhcmRzLmpzOiBBZGRlZC4KKyAgICAgICAgKHJ1blJpY2hhcmRzKToKKyAgICAgICAg
KFNjaGVkdWxlcik6CisgICAgICAgIChTY2hlZHVsZXIucHJvdG90eXBlLmFkZElkbGVUYXNrKToK
KyAgICAgICAgKFNjaGVkdWxlci5wcm90b3R5cGUuYWRkV29ya2VyVGFzayk6CisgICAgICAgIChT
Y2hlZHVsZXIucHJvdG90eXBlLmFkZEhhbmRsZXJUYXNrKToKKyAgICAgICAgKFNjaGVkdWxlci5w
cm90b3R5cGUuYWRkRGV2aWNlVGFzayk6CisgICAgICAgIChTY2hlZHVsZXIucHJvdG90eXBlLmFk
ZFJ1bm5pbmdUYXNrKToKKyAgICAgICAgKFNjaGVkdWxlci5wcm90b3R5cGUuYWRkVGFzayk6Cisg
ICAgICAgIChTY2hlZHVsZXIucHJvdG90eXBlLnNjaGVkdWxlKToKKyAgICAgICAgKFNjaGVkdWxl
ci5wcm90b3R5cGUucmVsZWFzZSk6CisgICAgICAgIChTY2hlZHVsZXIucHJvdG90eXBlLmhvbGRD
dXJyZW50KToKKyAgICAgICAgKFNjaGVkdWxlci5wcm90b3R5cGUuc3VzcGVuZEN1cnJlbnQpOgor
ICAgICAgICAoU2NoZWR1bGVyLnByb3RvdHlwZS5xdWV1ZSk6CisgICAgICAgIChUYXNrQ29udHJv
bEJsb2NrKToKKyAgICAgICAgKFRhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLnNldFJ1bm5pbmcp
OgorICAgICAgICAoVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUubWFya0FzTm90SGVsZCk6Cisg
ICAgICAgIChUYXNrQ29udHJvbEJsb2NrLnByb3RvdHlwZS5tYXJrQXNIZWxkKToKKyAgICAgICAg
KFRhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLmlzSGVsZE9yU3VzcGVuZGVkKToKKyAgICAgICAg
KFRhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLm1hcmtBc1N1c3BlbmRlZCk6CisgICAgICAgIChU
YXNrQ29udHJvbEJsb2NrLnByb3RvdHlwZS5tYXJrQXNSdW5uYWJsZSk6CisgICAgICAgIChUYXNr
Q29udHJvbEJsb2NrLnByb3RvdHlwZS5ydW4pOgorICAgICAgICAoVGFza0NvbnRyb2xCbG9jay5w
cm90b3R5cGUuY2hlY2tQcmlvcml0eUFkZCk6CisgICAgICAgIChUYXNrQ29udHJvbEJsb2NrLnBy
b3RvdHlwZS50b1N0cmluZyk6CisgICAgICAgIChJZGxlVGFzayk6CisgICAgICAgIChJZGxlVGFz
ay5wcm90b3R5cGUucnVuKToKKyAgICAgICAgKElkbGVUYXNrLnByb3RvdHlwZS50b1N0cmluZyk6
CisgICAgICAgIChEZXZpY2VUYXNrKToKKyAgICAgICAgKERldmljZVRhc2sucHJvdG90eXBlLnJ1
bik6CisgICAgICAgIChEZXZpY2VUYXNrLnByb3RvdHlwZS50b1N0cmluZyk6CisgICAgICAgIChX
b3JrZXJUYXNrKToKKyAgICAgICAgKFdvcmtlclRhc2sucHJvdG90eXBlLnJ1bik6CisgICAgICAg
IChXb3JrZXJUYXNrLnByb3RvdHlwZS50b1N0cmluZyk6CisgICAgICAgIChIYW5kbGVyVGFzayk6
CisgICAgICAgIChIYW5kbGVyVGFzay5wcm90b3R5cGUucnVuKToKKyAgICAgICAgKEhhbmRsZXJU
YXNrLnByb3RvdHlwZS50b1N0cmluZyk6CisgICAgICAgIChQYWNrZXQpOgorICAgICAgICAoUGFj
a2V0LnByb3RvdHlwZS5hZGRUbyk6CisgICAgICAgIChQYWNrZXQucHJvdG90eXBlLnRvU3RyaW5n
KToKKyAgICAgICAgKiBKZXRTdHJlYW0yL0x1YUpTRmlnaHQvc3RyaW5nX2xpc3RzLmpzOgorICAg
ICAgICAoKTogRGVsZXRlZC4KKyAgICAgICAgKEJlbmNobWFyay5wcm90b3R5cGUucnVuSXRlcmF0
aW9uKTogRGVsZXRlZC4KKyAgICAgICAgKEJlbmNobWFyayk6IERlbGV0ZWQuCisgICAgICAgICog
SmV0U3RyZWFtMi9SQU1pZmljYXRpb24ucHk6IEFkZGVkLgorICAgICAgICAobWVhbik6CisgICAg
ICAgIChnZW9tZWFuKToKKyAgICAgICAgKGZyYW1ld29ya1BhdGhGcm9tRXhlY3V0YWJsZVBhdGgp
OgorICAgICAgICAocGFyc2VBcmdzKToKKyAgICAgICAgKHBhcnNlQXJncy5vcHRTdHJUb0Jvb2wp
OgorICAgICAgICAoQmFzZVJ1bm5lcik6CisgICAgICAgIChCYXNlUnVubmVyLl9faW5pdF9fKToK
KyAgICAgICAgKEJhc2VSdW5uZXIuc2V0dXApOgorICAgICAgICAoQmFzZVJ1bm5lci5zZXRFbnYp
OgorICAgICAgICAoQmFzZVJ1bm5lci51bnNldEVudik6CisgICAgICAgIChCYXNlUnVubmVyLnJl
c2V0Rm9yVGVzdCk6CisgICAgICAgIChCYXNlUnVubmVyLnByb2Nlc3NMaW5lKToKKyAgICAgICAg
KEJhc2VSdW5uZXIuc2V0UmV0dXJuQ29kZSk6CisgICAgICAgIChCYXNlUnVubmVyLmdldFJlc3Vs
dHMpOgorICAgICAgICAoTG9jYWxSdW5uZXIpOgorICAgICAgICAoTG9jYWxSdW5uZXIuX19pbml0
X18pOgorICAgICAgICAoTG9jYWxSdW5uZXIucnVuT25lVGVzdCk6CisgICAgICAgIChtYWluKToK
KyAgICAgICAgKG1haW4ucnVuVGVzdExpc3QpOgorICAgICAgICAqIEpldFN0cmVhbTIvX19pbml0
X18ucHk6IEFkZGVkLgorCiAyMDE5LTA3LTIzICBLZWl0aCBSb2xsaW4gIDxrcm9sbGluQGFwcGxl
LmNvbT4KIAogICAgICAgICBSZW1vdmUgcmVzdCBvZiBOYXZpZ2F0b3JDb250ZW50VXRpbHMgc3Vw
cG9ydApJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9KZXRTdHJlYW0yL1JBTWlmaWNhdGlvbi5weQo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBQZXJmb3JtYW5jZVRlc3RzL0pldFN0cmVhbTIvUkFNaWZpY2F0aW9uLnB5
CShub25leGlzdGVudCkKKysrIFBlcmZvcm1hbmNlVGVzdHMvSmV0U3RyZWFtMi9SQU1pZmljYXRp
b24ucHkJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzNDcgQEAKKyMgQ29weXJpZ2h0IChDKSAy
MDE4LTIwMTkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJ
UycnCisjIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorIyBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisjIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUwor
IyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SCisjIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisjIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworIyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTgorIyBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorIyBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisjIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgY29sbGVj
dGlvbnMKK2ltcG9ydCBqc29uCitpbXBvcnQgbWF0aAoraW1wb3J0IG9zCitpbXBvcnQgcmUKK2lt
cG9ydCBzdWJwcm9jZXNzCisKK2ppdFRlc3RzID0gWyIzZC1jdWJlLVNQIiwgIjNkLXJheXRyYWNl
LVNQIiwgImFjb3JuLXd0YiIsICJhaS1hc3RhciIsICJBaXIiLCAiYXN5bmMtZnMiLCAiQmFieWxv
biIsICJiYWJ5bG9uLXd0YiIsICJiYXNlNjQtU1AiLCAiQmFzaWMiLCAiQm94MkQiLCAiY2RqcyIs
ICJjaGFpLXd0YiIsICJjb2ZmZWVzY3JpcHQtd3RiIiwgImNyeXB0byIsICJjcnlwdG8tYWVzLVNQ
IiwgImNyeXB0by1tZDUtU1AiLCAiY3J5cHRvLXNoYTEtU1AiLCAiZGF0ZS1mb3JtYXQtdG9mdGUt
U1AiLCAiZGF0ZS1mb3JtYXQteHBhcmItU1AiLCAiZGVsdGEtYmx1ZSIsICJlYXJsZXktYm95ZXIi
LCAiZXNwcmVlLXd0YiIsICJmaXJzdC1pbnNwZWN0b3ItY29kZS1sb2FkIiwgIkZsaWdodFBsYW5u
ZXIiLCAiZmxvYXQtbW0uYyIsICJnYXVzc2lhbi1ibHVyIiwgImdiZW11IiwgImdjYy1sb29wcy13
YXNtIiwgImhhc2gtbWFwIiwgIkhhc2hTZXQtd2FzbSIsICJqc2hpbnQtd3RiIiwgImpzb24tcGFy
c2UtaW5zcGVjdG9yIiwgImpzb24tc3RyaW5naWZ5LWluc3BlY3RvciIsICJsZWJhYi13dGIiLCAi
bWFuZHJlZWwiLCAiTUwiLCAibXVsdGktaW5zcGVjdG9yLWNvZGUtbG9hZCIsICJuLWJvZHktU1Ai
LCAibmF2aWVyLXN0b2tlcyIsICJvY3RhbmUtY29kZS1sb2FkIiwgIm9jdGFuZS16bGliIiwgIk9m
ZmxpbmVBc3NlbWJsZXIiLCAicGRmanMiLCAicHJlcGFjay13dGIiLCAicXVpY2tzb3J0LXdhc20i
LCAicmF5dHJhY2UiLCAicmVnZXgtZG5hLVNQIiwgInJlZ2V4cCIsICJyaWNoYXJkcyIsICJyaWNo
YXJkcy13YXNtIiwgInNwbGF5IiwgInN0YW5mb3JkLWNyeXB0by1hZXMiLCAic3RhbmZvcmQtY3J5
cHRvLXBia2RmMiIsICJzdGFuZm9yZC1jcnlwdG8tc2hhMjU2IiwgInN0cmluZy11bnBhY2stY29k
ZS1TUCIsICJ0YWdjbG91ZC1TUCIsICJ0c2Ytd2FzbSIsICJ0eXBlc2NyaXB0IiwgInVnbGlmeS1q
cy13dGIiLCAiVW5pUG9rZXIiLCAiV1NMIl0KKworbm9uSklUVGVzdHMgPSBbIjNkLWN1YmUtU1Ai
LCAiM2QtcmF5dHJhY2UtU1AiLCAiYWNvcm4td3RiIiwgImFpLWFzdGFyIiwgIkFpciIsICJhc3lu
Yy1mcyIsICJCYWJ5bG9uIiwgImJhYnlsb24td3RiIiwgImJhc2U2NC1TUCIsICJCYXNpYyIsICJC
b3gyRCIsICJjZGpzIiwgImNoYWktd3RiIiwgImNvZmZlZXNjcmlwdC13dGIiLCAiY3J5cHRvLWFl
cy1TUCIsICJkZWx0YS1ibHVlIiwgImVhcmxleS1ib3llciIsICJlc3ByZWUtd3RiIiwgImZpcnN0
LWluc3BlY3Rvci1jb2RlLWxvYWQiLCAiZ2F1c3NpYW4tYmx1ciIsICJnYmVtdSIsICJoYXNoLW1h
cCIsICJqc2hpbnQtd3RiIiwgImpzb24tcGFyc2UtaW5zcGVjdG9yIiwgImpzb24tc3RyaW5naWZ5
LWluc3BlY3RvciIsICJsZWJhYi13dGIiLCAibWFuZHJlZWwiLCAiTUwiLCAibXVsdGktaW5zcGVj
dG9yLWNvZGUtbG9hZCIsICJvY3RhbmUtY29kZS1sb2FkIiwgIk9mZmxpbmVBc3NlbWJsZXIiLCAi
cGRmanMiLCAicHJlcGFjay13dGIiLCAicmF5dHJhY2UiLCAicmVnZXgtZG5hLVNQIiwgInJlZ2V4
cCIsICJzcGxheSIsICJzdGFuZm9yZC1jcnlwdG8tYWVzIiwgInN0cmluZy11bnBhY2stY29kZS1T
UCIsICJ0YWdjbG91ZC1TUCIsICJ0eXBlc2NyaXB0IiwgInVnbGlmeS1qcy13dGIiXQorCisjIFJ1
biB0d28gZ3JvdXBzIG9mIHRlc3RzIHdpdGggZWFjaCBncm91cCBpbiBhIHNpbmdsZSBKU0MgaW5z
dGFuY2UgdG8gc2VlIGhvdyB3ZWxsIG1lbW9yeSByZWNvdmVycyBiZXR3ZWVuIHRlc3RzLgorZ3Jv
dXBUZXN0cyA9IFsidHlwZXNjcmlwdCxhY29ybi13dGIsQWlyLHBkZmpzLGNyeXB0by1hZXMtU1Ai
LCAic3BsYXksRmxpZ2h0UGxhbm5lcixwcmVwYWNrLXd0YixvY3RhbmUtemxpYiwzZC1jdWJlLVNQ
Il0KKworbHVhVGVzdHMgPSBbKCJoZWxsb193b3JsZC1MSkYiLCAiTHVhSlNGaWdodC9oZWxsb193
b3JsZC5qcyIsIDUpLCAoImxpc3Rfc2VhcmNoLUxKRiIsICJMdWFKU0ZpZ2h0L2xpc3Rfc2VhcmNo
LmpzIiwgNSksICgibGlzdHMtTEpGIiwgIkx1YUpTRmlnaHQvbGlzdHMuanMiLCA1KSwgKCJzdHJp
bmdfbGlzdHMtTEpGIiwgIkx1YUpTRmlnaHQvc3RyaW5nX2xpc3RzLmpzIiwgNSksICgicmljaGFy
ZHMiLCAiTHVhSlNGaWdodC9yaWNoYXJkcy5qcyIsIDUpXQorCitvbmVNQiA9IGZsb2F0KDEwMjQg
KiAxMDI0KQorZm9vdHByaW50UkUgPSByZS5jb21waWxlKCJDdXJyZW50IEZvb3RwcmludDogKFxk
Kyg/Oi5cZCspPykiKQorcGVha0Zvb3RwcmludFJFID0gcmUuY29tcGlsZSgiUGVhayBGb290cHJp
bnQ6IChcZCsoPzouXGQrKT8pIikKKworVGVzdFJlc3VsdCA9IGNvbGxlY3Rpb25zLm5hbWVkdHVw
bGUoIlRlc3RSZXN1bHQiLCBbIm5hbWUiLCAicmV0dXJuQ29kZSIsICJmb290cHJpbnQiLCAicGVh
a0Zvb3RwcmludCJdKQorCityYW1pZmljYXRpb25fZGlyID0gb3MucGF0aC5hYnNwYXRoKG9zLnBh
dGguZGlybmFtZShvcy5wYXRoLnJlYWxwYXRoKF9fZmlsZV9fKSkpCisKK3JlbW90ZUhvb2tzID0g
e30KKworCitkZWYgbWVhbih2YWx1ZXMpOgorICAgIGlmIG5vdCBsZW4odmFsdWVzKToKKyAgICAg
ICAgcmV0dXJuIE5vbmUKKworICAgIHJldHVybiBzdW0odmFsdWVzKSAvIGxlbih2YWx1ZXMpCisK
KworZGVmIGdlb21lYW4odmFsdWVzKToKKyAgICBpZiBub3QgbGVuKHZhbHVlcyk6CisgICAgICAg
IHJldHVybiBOb25lCisKKyAgICBwcm9kdWN0ID0gMS4wCisKKyAgICBmb3IgeCBpbiB2YWx1ZXM6
CisgICAgICAgIHByb2R1Y3QgKj0geAorCisgICAgcmV0dXJuIG1hdGgucG93KHByb2R1Y3QsICgx
LjAgLyBsZW4odmFsdWVzKSkpCisKKworZGVmIGZyYW1ld29ya1BhdGhGcm9tRXhlY3V0YWJsZVBh
dGgoZXhlY1BhdGgpOgorICAgIGlmIG5vdCBvcy5wYXRoLmFic3BhdGgoZXhlY1BhdGgpOgorICAg
ICAgICBleGVjUGF0aCA9IG9zLnBhdGguaXNhYnMoZXhlY1BhdGgpCisKKyAgICBwYXRoTWF0Y2gg
PSByZS5tYXRjaCgiKC4qPy9XZWJLaXRCdWlsZC8oUmVsZWFzZXxEZWJ1ZykrKS8oW2EtekEtWl0r
KSQiLCBleGVjUGF0aCkKKyAgICBpZiBwYXRoTWF0Y2g6CisgICAgICAgIHJldHVybiBwYXRoTWF0
Y2guZ3JvdXAoMSkKKworICAgIHBhdGhNYXRjaCA9IHJlLm1hdGNoKCIoLio/KS9KYXZhU2NyaXB0
Q29yZS5mcmFtZXdvcmsvUmVzb3VyY2VzLyhbYS16QS1aXSspJCIsIGV4ZWNQYXRoKQorICAgIGlm
IHBhdGhNYXRjaDoKKyAgICAgICAgcmV0dXJuIHBhdGhNYXRjaC5ncm91cCgxKQorCisgICAgcGF0
aE1hdGNoID0gcmUubWF0Y2goIiguKj8vKFJlbGVhc2V8RGVidWcpKykvKFthLXpBLVpdKykkIiwg
ZXhlY1BhdGgpCisgICAgaWYgcGF0aE1hdGNoOgorICAgICAgICByZXR1cm4gcGF0aE1hdGNoLmdy
b3VwKDEpCisKKyAgICBwYXRoTWF0Y2ggPSByZS5tYXRjaCgiKC4qPykvSmF2YVNjcmlwdENvcmUu
ZnJhbWV3b3JrLyguKj8pL1Jlc291cmNlcy8oW2EtekEtWl0rKSQiLCBleGVjUGF0aCkKKyAgICBp
ZiBwYXRoTWF0Y2g6CisgICAgICAgIHJldHVybiBwYXRoTWF0Y2guZ3JvdXAoMSkKKworCitkZWYg
cGFyc2VBcmdzKHBhcnNlcj1Ob25lKToKKyAgICBkZWYgb3B0U3RyVG9Cb29sKGFyZyk6CisgICAg
ICAgIGlmIGFyZy5sb3dlcigpIGluICgidHJ1ZSIsICJ0IiwgInllcyIsICJ5Iik6CisgICAgICAg
ICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBpZiBhcmcubG93ZXIoKSBpbiAoImZhbHNlIiwgImYi
LCAibm8iLCAibiIpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgcmFpc2Ug
YXJncGFyc2UuQXJndW1lbnRUeXBlRXJyb3IoIkJvb2xlYW4gdmFsdWUgZXhwZWN0ZWQiKQorCisg
ICAgaWYgbm90IHBhcnNlcjoKKyAgICAgICAgcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJz
ZXIoZGVzY3JpcHRpb249IlJBTWlmaWNhdGlvbiBiZW5jaG1hcmsgZHJpdmVyIHNjcmlwdCIpCisg
ICAgICAgIHBhcnNlci5zZXRfZGVmYXVsdHMocnVubmVyPUxvY2FsUnVubmVyKQorCisgICAgdmVy
Ym9zaXR5R3JvdXAgPSBwYXJzZXIuYWRkX211dHVhbGx5X2V4Y2x1c2l2ZV9ncm91cCgpCisgICAg
dmVyYm9zaXR5R3JvdXAuYWRkX2FyZ3VtZW50KCItcSIsICItLXF1aWV0IiwgZGVzdD0idmVyYm9z
ZSIsIGFjdGlvbj0ic3RvcmVfZmFsc2UiLCBoZWxwPSJQcm92aWRlIGxlc3Mgb3V0cHV0IikKKyAg
ICB2ZXJib3NpdHlHcm91cC5hZGRfYXJndW1lbnQoIi12IiwgIi0tdmVyYm9zZSIsIGRlc3Q9InZl
cmJvc2UiLCBhY3Rpb249InN0b3JlX3RydWUiLCBkZWZhdWx0PVRydWUsIGhlbHA9IlByb3ZpZGUg
bW9yZSBvdXRwdXQiKQorCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLWMiLCAiLS1qc2MiLCBk
ZXN0PSJqc2NDb21tYW5kIiwgdHlwZT1zdHIsIGRlZmF1bHQ9Ii91c3IvbG9jYWwvYmluL2pzYyIs
IG1ldGF2YXI9InBhdGgtdG8tanNjIiwgaGVscD0iUGF0aCB0byBqc2MgY29tbWFuZCIpCisgICAg
cGFyc2VyLmFkZF9hcmd1bWVudCgiLWQiLCAiLS1qZXRzdHJlYW0yLWRpciIsIGRlc3Q9InRlc3RE
aXIiLCB0eXBlPXN0ciwgZGVmYXVsdD1yYW1pZmljYXRpb25fZGlyLCBtZXRhdmFyPSJwYXRoLXRv
LUpldFN0cmVhbTItZmlsZXMiLCBoZWxwPSJKZXRTdHJlYW0yIHJvb3QgZGlyZWN0b3J5IikKKyAg
ICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItZSIsICItLWVudi12YXIiLCBkZXN0PSJleHRyYUVudlZh
cnMiLCBhY3Rpb249ImFwcGVuZCIsIGRlZmF1bHQ9W10sIG1ldGF2YXI9ImVudi12YXI9dmFsdWUi
LCBoZWxwPSJTcGVjaWZ5IGFkZGl0aW9uYWwgZW52aXJvbm1lbnQgdmFyaWFibGVzIikKKyAgICBw
YXJzZXIuYWRkX2FyZ3VtZW50KCItZiIsICItLWZvcm1hdC1qc29uIiwgZGVzdD0iZm9ybWF0SlNP
TiIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsIGRlZmF1bHQ9RmFsc2UsIGhlbHA9IkZvcm1hdCBKU09O
IHdpdGggd2hpdGVzcGFjZSIpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgiLWciLCAiLS1ydW4t
Z3JvdXBlZC10ZXN0cyIsIGRlc3Q9InJ1bkdyb3VwZWRUZXN0cyIsIG5hcmdzPSI/IiwgY29uc3Q9
VHJ1ZSwgZGVmYXVsdD1Ob25lLCB0eXBlPW9wdFN0clRvQm9vbCwgbWV0YXZhcj0idHJ1ZSAvIGZh
bHNlIiwgaGVscD0iUnVuIGdyb3VwZWQgdGVzdHMgW2RlZmF1bHRdIikKKyAgICBwYXJzZXIuYWRk
X2FyZ3VtZW50KCItaiIsICItLXJ1bi1qaXQiLCBkZXN0PSJydW5KSVRUZXN0cyIsIG5hcmdzPSI/
IiwgY29uc3Q9VHJ1ZSwgZGVmYXVsdD1Ob25lLCB0eXBlPW9wdFN0clRvQm9vbCwgbWV0YXZhcj0i
dHJ1ZSAvIGZhbHNlIiwgaGVscD0iUnVuIEpJVCB0ZXN0cyBbZGVmYXVsdF0iKQorICAgIHBhcnNl
ci5hZGRfYXJndW1lbnQoIi1sIiwgIi0tbHVhIiwgZGVzdD0icnVuTHVhVGVzdHMiLCBuYXJncz0i
PyIsIGNvbnN0PVRydWUsIGRlZmF1bHQ9Tm9uZSwgdHlwZT1vcHRTdHJUb0Jvb2wsIG1ldGF2YXI9
InRydWUgLyBmYWxzZSIsIGhlbHA9IlJ1biBMdWEgY29tcGFyaXNvbiB0ZXN0cyBbZGVmYXVsdF0i
KQorICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi1uIiwgIi0tcnVuLW5vLWppdCIsIGRlc3Q9InJ1
bk5vSklUVGVzdHMiLCBuYXJncz0iPyIsIGNvbnN0PVRydWUsIGRlZmF1bHQ9Tm9uZSwgdHlwZT1v
cHRTdHJUb0Jvb2wsIG1ldGF2YXI9InRydWUgLyBmYWxzZSIsIGhlbHA9IlJ1biBubyBKSVQgdGVz
dHMgW2RlZmF1bHRdIikKKyAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCItbyIsICItLW91dHB1dCIs
IGRlc3Q9Impzb25GaWxlbmFtZSIsIHR5cGU9c3RyLCBkZWZhdWx0PU5vbmUsIG1ldGF2YXI9IkpT
T04tb3V0cHV0LWZpbGUiLCBoZWxwPSJQYXRoIHRvIEpTT04gb3V0cHV0IikKKworICAgIGFyZ3Mg
PSBwYXJzZXIucGFyc2VfYXJncygpCisKKyAgICBzdWJ0ZXN0QXJncyA9IFthcmdzLnJ1bkdyb3Vw
ZWRUZXN0cywgYXJncy5ydW5KSVRUZXN0cywgYXJncy5ydW5MdWFUZXN0cywgYXJncy5ydW5Ob0pJ
VFRlc3RzXQorICAgIGFsbERlZmF1bHQgPSBhbGwoW2FyZyBpcyBOb25lIGZvciBhcmcgaW4gc3Vi
dGVzdEFyZ3NdKQorICAgIGFueVRydWUgPSBhbnkoW2FyZyBpcyBUcnVlIGZvciBhcmcgaW4gc3Vi
dGVzdEFyZ3NdKQorICAgIGFueUZhbHNlID0gYW55KFthcmcgaXMgRmFsc2UgZm9yIGFyZyBpbiBz
dWJ0ZXN0QXJnc10pCisKKyAgICAjIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gcnVuIGFsbCBzdWJ0
ZXN0cy4KKyAgICAjIElmIGEgdGVzdCBpcyBleHBsaWNpdGx5IHNwZWNpZmllZCBub3QgdG8gcnVu
LCBza2lwIHRoYXQgdGVzdCBhbmQgdXNlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciB0aGUgcmVt
YWluaW5nIHRlc3RzLgorICAgICMgSWYgdGVzdHMgYXJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHRv
IHJ1biwgb25seSBydW4gdGhvc2UgdGVzdHMuCisgICAgIyBJZiB0aGVyZSBpcyBhIG1peCBvZiB0
ZXN0cyBzcGVjaWZpZWQgdG8gcnVuIGFuZCBub3QgdG8gcnVuLCBhbHNvIGRvIG5vdCBydW4gYW55
IHVuc3BlY2lmaWVkIHRlc3RzLgorICAgIGdldEFyZ1ZhbHVlID0gbGFtYmRhIGFyZzogVHJ1ZSBp
ZiBhbGxEZWZhdWx0IGVsc2UgRmFsc2UgaWYgYXJnIGlzIE5vbmUgYW5kIGFueVRydWUgZWxzZSBU
cnVlIGlmIGFyZyBpcyBOb25lIGFuZCBhbnlGYWxzZSBlbHNlIGFyZworCisgICAgYXJncy5ydW5K
SVRUZXN0cyA9IGdldEFyZ1ZhbHVlKGFyZ3MucnVuSklUVGVzdHMpCisgICAgYXJncy5ydW5Ob0pJ
VFRlc3RzID0gZ2V0QXJnVmFsdWUoYXJncy5ydW5Ob0pJVFRlc3RzKQorICAgIGFyZ3MucnVuTHVh
VGVzdHMgPSBnZXRBcmdWYWx1ZShhcmdzLnJ1bkx1YVRlc3RzKQorICAgIGFyZ3MucnVuR3JvdXBl
ZFRlc3RzID0gZ2V0QXJnVmFsdWUoYXJncy5ydW5Hcm91cGVkVGVzdHMpCisKKyAgICByZXR1cm4g
YXJncworCisKK2NsYXNzIEJhc2VSdW5uZXI6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZ3Mp
OgorICAgICAgICBzZWxmLnJvb3REaXIgPSBhcmdzLnRlc3REaXIKKyAgICAgICAgc2VsZi5lbnZp
cm9ubWVudFZhcnMgPSB7fQorCisgICAgZGVmIHNldHVwKHNlbGYpOgorICAgICAgICBwYXNzCisK
KyAgICBkZWYgc2V0RW52KHNlbGYsIHZhcmlhYmxlLCB2YWx1ZSk6CisgICAgICAgIHNlbGYuZW52
aXJvbm1lbnRWYXJzW3ZhcmlhYmxlXSA9IHZhbHVlCisKKyAgICBkZWYgdW5zZXRFbnYoc2VsZiwg
dmFyaWFibGUpOgorICAgICAgICBzZWxmLmVudmlyb25tZW50VmFycy5wb3AodmFyaWFibGUsIE5v
bmUpCisKKyAgICBkZWYgcmVzZXRGb3JUZXN0KHNlbGYsIHRlc3ROYW1lKToKKyAgICAgICAgc2Vs
Zi50ZXN0TmFtZSA9IHRlc3ROYW1lCisgICAgICAgIHNlbGYuZm9vdHByaW50ID0gTm9uZQorICAg
ICAgICBzZWxmLnBlYWtGb290cHJpbnQgPSBOb25lCisgICAgICAgIHNlbGYucmV0dXJuQ29kZSA9
IDAKKworICAgIGRlZiBwcm9jZXNzTGluZShzZWxmLCBsaW5lKToKKyAgICAgICAgbGluZSA9IGxp
bmUuc3RyaXAoKQorCisgICAgICAgIGZvb3RwcmludE1hdGNoID0gcmUubWF0Y2goZm9vdHByaW50
UkUsIGxpbmUpCisgICAgICAgIGlmIGZvb3RwcmludE1hdGNoOgorICAgICAgICAgICAgc2VsZi5m
b290cHJpbnQgPSBpbnQoZm9vdHByaW50TWF0Y2guZ3JvdXAoMSkpCisgICAgICAgICAgICByZXR1
cm4KKworICAgICAgICBwZWFrRm9vdHByaW50TWF0Y2ggPSByZS5tYXRjaChwZWFrRm9vdHByaW50
UkUsIGxpbmUpCisgICAgICAgIGlmIHBlYWtGb290cHJpbnRNYXRjaDoKKyAgICAgICAgICAgIHNl
bGYucGVha0Zvb3RwcmludCA9IGludChwZWFrRm9vdHByaW50TWF0Y2guZ3JvdXAoMSkpCisKKyAg
ICBkZWYgc2V0UmV0dXJuQ29kZShzZWxmLCByZXR1cm5Db2RlKToKKyAgICAgICAgc2VsZi5yZXR1
cm5Db2RlID0gcmV0dXJuQ29kZQorCisgICAgZGVmIGdldFJlc3VsdHMoc2VsZik6CisgICAgICAg
IHJldHVybiBUZXN0UmVzdWx0KG5hbWU9c2VsZi50ZXN0TmFtZSwgcmV0dXJuQ29kZT1zZWxmLnJl
dHVybkNvZGUsIGZvb3RwcmludD1zZWxmLmZvb3RwcmludCwgcGVha0Zvb3RwcmludD1zZWxmLnBl
YWtGb290cHJpbnQpCisKKworY2xhc3MgTG9jYWxSdW5uZXIoQmFzZVJ1bm5lcik6CisgICAgZGVm
IF9faW5pdF9fKHNlbGYsIGFyZ3MpOgorICAgICAgICBCYXNlUnVubmVyLl9faW5pdF9fKHNlbGYs
IGFyZ3MpCisgICAgICAgIHNlbGYuanNjQ29tbWFuZCA9IGFyZ3MuanNjQ29tbWFuZAorCisgICAg
ZGVmIHJ1bk9uZVRlc3Qoc2VsZiwgdGVzdCwgZXh0cmFPcHRpb25zPU5vbmUsIHVzZUpldFN0cmVh
bTJIYXJuZXNzPVRydWUpOgorICAgICAgICBzZWxmLnJlc2V0Rm9yVGVzdCh0ZXN0KQorCisgICAg
ICAgIGFyZ3MgPSBbc2VsZi5qc2NDb21tYW5kXQorICAgICAgICBpZiBleHRyYU9wdGlvbnM6Cisg
ICAgICAgICAgICBhcmdzLmV4dGVuZChleHRyYU9wdGlvbnMpCisKKyAgICAgICAgaWYgdXNlSmV0
U3RyZWFtMkhhcm5lc3M6CisgICAgICAgICAgICBhcmdzLmV4dGVuZChbIi1lIiwgInRlc3RMaXN0
PSd7dGVzdH0nOyBydW5Nb2RlPSdSQU1pZmljYXRpb24nIi5mb3JtYXQodGVzdD10ZXN0KSwgImNs
aS5qcyJdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXJncy5leHRlbmQoWyItLWZvb3Rw
cmludCIsICJ7dGVzdH0iLmZvcm1hdCh0ZXN0PXRlc3QpXSkKKworICAgICAgICBzZWxmLnJlc2V0
Rm9yVGVzdCh0ZXN0KQorCisgICAgICAgIHByb2MgPSBzdWJwcm9jZXNzLlBvcGVuKGFyZ3MsIGN3
ZD1zZWxmLnJvb3REaXIsIGVudj1zZWxmLmVudmlyb25tZW50VmFycywgc3Rkb3V0PXN1YnByb2Nl
c3MuUElQRSwgc3RkZXJyPU5vbmUsIHNoZWxsPUZhbHNlKQorICAgICAgICB3aGlsZSBUcnVlOgor
ICAgICAgICAgICAgbGluZSA9IHByb2Muc3Rkb3V0LnJlYWRsaW5lKCkKKyAgICAgICAgICAgIHNl
bGYucHJvY2Vzc0xpbmUobGluZSkKKworICAgICAgICAgICAgaWYgbGluZSA9PSAiIjoKKyAgICAg
ICAgICAgICAgICBicmVhaworCisgICAgICAgIHNlbGYuc2V0UmV0dXJuQ29kZShwcm9jLndhaXQo
KSkKKworICAgICAgICByZXR1cm4gc2VsZi5nZXRSZXN1bHRzKCkKKworCitkZWYgbWFpbihwYXJz
ZXI9Tm9uZSk6CisgICAgZm9vdHByaW50VmFsdWVzID0gW10KKyAgICBwZWFrRm9vdHByaW50VmFs
dWVzID0gW10KKyAgICB0ZXN0UmVzdWx0c0RpY3QgPSB7fQorICAgIGhhc0ZhaWxlZFJ1bnMgPSBG
YWxzZQorCisgICAgYXJncyA9IHBhcnNlQXJncyhwYXJzZXI9cGFyc2VyKQorCisgICAgdGVzdFJ1
bm5lciA9IGFyZ3MucnVubmVyKGFyZ3MpCisKKyAgICBkeWxkRnJhbWV3b3JrUGF0aCA9IGZyYW1l
d29ya1BhdGhGcm9tRXhlY3V0YWJsZVBhdGgoYXJncy5qc2NDb21tYW5kKQorICAgIGlmIGR5bGRG
cmFtZXdvcmtQYXRoOgorICAgICAgICB0ZXN0UnVubmVyLnNldEVudigiRFlMRF9GUkFNRVdPUktf
UEFUSCIsIGR5bGRGcmFtZXdvcmtQYXRoKQorCisgICAgZm9yIGVudlZhciBpbiBhcmdzLmV4dHJh
RW52VmFyczoKKyAgICAgICAgZW52VmFyUGFydHMgPSBlbnZWYXIuc3BsaXQoIj0iKQorICAgICAg
ICBpZiBsZW4oZW52VmFyUGFydHMpID09IDE6CisgICAgICAgICAgICBlbnZWYXJQYXJ0c1sxXSA9
ICIxIgorICAgICAgICB0ZXN0UnVubmVyLnNldEVudihlbnZWYXJQYXJ0c1swXSwgZW52VmFyUGFy
dHNbMV0pCisKKyAgICB0ZXN0UnVubmVyLnNldHVwKCkKKworICAgIGRlZiBydW5UZXN0TGlzdCh0
ZXN0TGlzdCwgZXh0cmFPcHRpb25zPU5vbmUsIHVzZUpldFN0cmVhbTJIYXJuZXNzPVRydWUpOgor
ICAgICAgICB0ZXN0U2NvcmVzRGljdCA9IHt9CisKKyAgICAgICAgZm9yIHRlc3RJbmZvIGluIHRl
c3RMaXN0OgorICAgICAgICAgICAgZm9vdHByaW50U2NvcmVzID0gW10KKyAgICAgICAgICAgIHBl
YWtGb290cHJpbnRTY29yZXMgPSBbXQorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh0ZXN0SW5m
bywgdHVwbGUpOgorICAgICAgICAgICAgICAgIHRlc3ROYW1lLCB0ZXN0LCB3ZWlnaHQgPSB0ZXN0
SW5mbworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB0ZXN0TmFtZSwgdGVzdCwg
d2VpZ2h0ID0gdGVzdEluZm8sIHRlc3RJbmZvLCAxCisKKyAgICAgICAgICAgIHByaW50ICJSdW5u
aW5nIHt9Li4uIi5mb3JtYXQodGVzdE5hbWUpLAorICAgICAgICAgICAgdGVzdFJlc3VsdCA9IHRl
c3RSdW5uZXIucnVuT25lVGVzdCh0ZXN0LCBleHRyYU9wdGlvbnMsIHVzZUpldFN0cmVhbTJIYXJu
ZXNzKQorCisgICAgICAgICAgICBpZiB0ZXN0UmVzdWx0LnJldHVybkNvZGUgPT0gMCBhbmQgdGVz
dFJlc3VsdC5mb290cHJpbnQgYW5kIHRlc3RSZXN1bHQucGVha0Zvb3RwcmludDoKKyAgICAgICAg
ICAgICAgICBpZiBhcmdzLnZlcmJvc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICJmb290
cHJpbnQ6IHt9LCBwZWFrIGZvb3RwcmludDoge30iLmZvcm1hdCh0ZXN0UmVzdWx0LmZvb3Rwcmlu
dCwgdGVzdFJlc3VsdC5wZWFrRm9vdHByaW50KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAg
ICAgICAgICAgICAgICAgIHByaW50CisKKyAgICAgICAgICAgICAgICBpZiB0ZXN0UmVzdWx0LmZv
b3RwcmludDoKKyAgICAgICAgICAgICAgICAgICAgZm9vdHByaW50U2NvcmVzLmFwcGVuZChpbnQo
dGVzdFJlc3VsdC5mb290cHJpbnQpKQorICAgICAgICAgICAgICAgICAgICBmb3IgY291bnQgaW4g
cmFuZ2UoMCwgd2VpZ2h0KToKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvb3RwcmludFZhbHVl
cy5hcHBlbmQodGVzdFJlc3VsdC5mb290cHJpbnQgLyBvbmVNQikKKyAgICAgICAgICAgICAgICBp
ZiB0ZXN0UmVzdWx0LnBlYWtGb290cHJpbnQ6CisgICAgICAgICAgICAgICAgICAgIHBlYWtGb290
cHJpbnRTY29yZXMuYXBwZW5kKGludCh0ZXN0UmVzdWx0LnBlYWtGb290cHJpbnQpKQorICAgICAg
ICAgICAgICAgICAgICBmb3IgY291bnQgaW4gcmFuZ2UoMCwgd2VpZ2h0KToKKyAgICAgICAgICAg
ICAgICAgICAgICAgIHBlYWtGb290cHJpbnRWYWx1ZXMuYXBwZW5kKHRlc3RSZXN1bHQucGVha0Zv
b3RwcmludCAvIG9uZU1CKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBoYXNG
YWlsZWRSdW5zID0gVHJ1ZQorICAgICAgICAgICAgICAgIHByaW50ICJmYWlsZWQiLAorICAgICAg
ICAgICAgICAgIGlmIHRlc3RSZXN1bHQucmV0dXJuQ29kZSAhPSAwOgorICAgICAgICAgICAgICAg
ICAgICBwcmludCAiIGV4aXQgY29kZSA9IHt9Ii5mb3JtYXQodGVzdFJlc3VsdC5yZXR1cm5Db2Rl
KSwKKyAgICAgICAgICAgICAgICBpZiBub3QgdGVzdFJlc3VsdC5mb290cHJpbnQ6CisgICAgICAg
ICAgICAgICAgICAgIHByaW50ICIgZm9vdHByaW50ID0ge30iLmZvcm1hdCh0ZXN0UmVzdWx0LmZv
b3RwcmludCksCisgICAgICAgICAgICAgICAgaWYgbm90IHRlc3RSZXN1bHQucGVha0Zvb3Rwcmlu
dDoKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiBwZWFrIGZvb3RwcmludCA9IHt9Ii5mb3Jt
YXQodGVzdFJlc3VsdC5wZWFrRm9vdHByaW50KSwKKyAgICAgICAgICAgICAgICBwcmludAorCisg
ICAgICAgICAgICB0ZXN0U2NvcmVzRGljdFt0ZXN0XSA9IHsibWV0cmljcyI6IHsiQWxsb2NhdGlv
bnMiOiBbIkdlb21ldHJpYyJdfSwgInRlc3RzIjogeyJlbmQiOiB7Im1ldHJpY3MiOiB7IkFsbG9j
YXRpb25zIjogeyJjdXJyZW50IjogZm9vdHByaW50U2NvcmVzfX19LCAicGVhayI6IHsibWV0cmlj
cyI6IHsiQWxsb2NhdGlvbnMiOiB7ImN1cnJlbnQiOiBwZWFrRm9vdHByaW50U2NvcmVzfX19fX0K
KworICAgICAgICByZXR1cm4gdGVzdFNjb3Jlc0RpY3QKKworICAgIGN1cnJlbnRfcGF0aCA9IG9z
LmdldGN3ZCgpCisgICAgb3MuY2hkaXIocmFtaWZpY2F0aW9uX2RpcikgICMgVG8gYWxsb3cgSlMg
bGlicmFyaWVzIHRvIGxvYWQKKworICAgIGlmIGFyZ3MucnVuTHVhVGVzdHM6CisgICAgICAgIGlm
IGFyZ3MudmVyYm9zZToKKyAgICAgICAgICAgIHByaW50ICI9PSBMdWFKU0ZpZ2h0IE5vIEpJVCB0
ZXN0cyA9PSIKKworICAgICAgICAjIFVzZSBzeXN0ZW0gbWFsbG9jIGZvciBMdWFKU0ZpZ2h0IHRl
c3RzCisgICAgICAgIHRlc3RSdW5uZXIuc2V0RW52KCJNYWxsb2MiLCAiWCIpCisKKyAgICAgICAg
c2NvcmVzRGljdCA9IHJ1blRlc3RMaXN0KGx1YVRlc3RzLCBbIi0tdXNlSklUPWZhbHNlIiwgIi0t
Zm9yY2VNaW5pVk1Nb2RlPXRydWUiXSwgdXNlSmV0U3RyZWFtMkhhcm5lc3M9RmFsc2UpCisKKyAg
ICAgICAgdGVzdFJlc3VsdHNEaWN0WyJMdWFKU0ZpZ2h0IE5vIEpJVCBUZXN0cyJdID0geyJtZXRy
aWNzIjogeyJBbGxvY2F0aW9ucyI6IFsiR2VvbWV0cmljIl19LCAidGVzdHMiOiBzY29yZXNEaWN0
fQorCisgICAgICAgIHRlc3RSdW5uZXIudW5zZXRFbnYoIk1hbGxvYyIpCisKKyAgICBpZiBhcmdz
LnJ1bkdyb3VwZWRUZXN0czoKKyAgICAgICAgaWYgYXJncy52ZXJib3NlOgorICAgICAgICAgICAg
cHJpbnQgIj09IEdyb3VwZWQgdGVzdHMgPT0iCisKKyAgICAgICAgc2NvcmVzRGljdCA9IHJ1blRl
c3RMaXN0KGdyb3VwVGVzdHMpCisKKyAgICAgICAgdGVzdFJlc3VsdHNEaWN0WyJHcm91cGVkIFRl
c3RzIl0gPSB7Im1ldHJpY3MiOiB7IkFsbG9jYXRpb25zIjogWyJHZW9tZXRyaWMiXX0sICJ0ZXN0
cyI6IHNjb3Jlc0RpY3R9CisKKyAgICBpZiBhcmdzLnJ1bkpJVFRlc3RzOgorICAgICAgICBpZiBh
cmdzLnZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiPT0gSklUIHRlc3RzID09IgorCisgICAg
ICAgIHNjb3Jlc0RpY3QgPSBydW5UZXN0TGlzdChqaXRUZXN0cykKKworICAgICAgICB0ZXN0UmVz
dWx0c0RpY3RbIkpJVCBUZXN0cyJdID0geyJtZXRyaWNzIjogeyJBbGxvY2F0aW9ucyI6IFsiR2Vv
bWV0cmljIl19LCAidGVzdHMiOiBzY29yZXNEaWN0fQorCisgICAgaWYgYXJncy5ydW5Ob0pJVFRl
c3RzOgorICAgICAgICBpZiBhcmdzLnZlcmJvc2U6CisgICAgICAgICAgICBwcmludCAiPT0gTm8g
SklUIHRlc3RzID09IgorCisgICAgICAgIHNjb3Jlc0RpY3QgPSBydW5UZXN0TGlzdChub25KSVRU
ZXN0cywgWyItLXVzZUpJVD1mYWxzZSIsICItZSIsICJ0ZXN0SXRlcmF0aW9uQ291bnQ9MSJdKQor
CisgICAgICAgIHRlc3RSZXN1bHRzRGljdFsiTm8gSklUIFRlc3RzIl0gPSB7Im1ldHJpY3MiOiB7
IkFsbG9jYXRpb25zIjogWyJHZW9tZXRyaWMiXX0sICJ0ZXN0cyI6IHNjb3Jlc0RpY3R9CisKKyAg
ICBmb290cHJpbnRHZW9tZWFuID0gaW50KGdlb21lYW4oZm9vdHByaW50VmFsdWVzKSAqIG9uZU1C
KQorICAgIHBlYWtGb290cHJpbnRHZW9tZWFuID0gaW50KGdlb21lYW4ocGVha0Zvb3RwcmludFZh
bHVlcykgKiBvbmVNQikKKyAgICB0b3RhbFNjb3JlID0gaW50KGdlb21lYW4oW2Zvb3RwcmludEdl
b21lYW4sIHBlYWtGb290cHJpbnRHZW9tZWFuXSkpCisKKyAgICBpZiBmb290cHJpbnRHZW9tZWFu
OgorICAgICAgICBwcmludCAiRm9vdHByaW50IGdlb21lYW46IHt9ICh7Oi4zZn0gTUIpIi5mb3Jt
YXQoZm9vdHByaW50R2VvbWVhbiwgZm9vdHByaW50R2VvbWVhbiAvIG9uZU1CKQorCisgICAgaWYg
cGVha0Zvb3RwcmludEdlb21lYW46CisgICAgICAgIHByaW50ICJQZWFrIEZvb3RwcmludCBnZW9t
ZWFuOiB7fSAoezouM2Z9IE1CKSIuZm9ybWF0KHBlYWtGb290cHJpbnRHZW9tZWFuLCBwZWFrRm9v
dHByaW50R2VvbWVhbiAvIG9uZU1CKQorCisgICAgaWYgZm9vdHByaW50R2VvbWVhbiBhbmQgcGVh
a0Zvb3RwcmludEdlb21lYW46CisgICAgICAgIHByaW50ICJTY29yZToge30gKHs6LjNmfSBNQiki
LmZvcm1hdCh0b3RhbFNjb3JlLCB0b3RhbFNjb3JlIC8gb25lTUIpCisKKyAgICByZXN1bHRzRGlj
dCA9IHsiUkFNaWZpY2F0aW9uIjogeyJtZXRyaWNzIjogeyJBbGxvY2F0aW9ucyI6IHsiY3VycmVu
dCI6IFt0b3RhbFNjb3JlXX19LCAidGVzdHMiOiB0ZXN0UmVzdWx0c0RpY3R9fQorCisgICAgb3Mu
Y2hkaXIoY3VycmVudF9wYXRoKSAgIyBSZXNldCB0aGUgcGF0aCBiYWNrIHRvIHdoYXQgaXQgd2Fz
IGJlZm9yZQorCisgICAgaWYgYXJncy5qc29uRmlsZW5hbWU6CisgICAgICAgIHdpdGggb3Blbihh
cmdzLmpzb25GaWxlbmFtZSwgInciKSBhcyBqc29uRmlsZToKKyAgICAgICAgICAgIGlmIGFyZ3Mu
Zm9ybWF0SlNPTjoKKyAgICAgICAgICAgICAgICBqc29uLmR1bXAocmVzdWx0c0RpY3QsIGpzb25G
aWxlLCBpbmRlbnQ9NCwgc2VwYXJhdG9ycz0oJywnLCAnOiAnKSkKKyAgICAgICAgICAgIGVsc2U6
CisgICAgICAgICAgICAgICAganNvbi5kdW1wKHJlc3VsdHNEaWN0LCBqc29uRmlsZSkKKworICAg
IGlmIGhhc0ZhaWxlZFJ1bnM6CisgICAgICAgIHByaW50ICJEZXRlY3RlZCBmYWlsZWQgcnVuKHMp
LCBleGl0aW5nIHdpdGggbm9uLXplcm8gcmV0dXJuIGNvZGUiCisKKyAgICByZXR1cm4gaGFzRmFp
bGVkUnVucworCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgZXhpdChtYWluKCkp
CkluZGV4OiBQZXJmb3JtYW5jZVRlc3RzL0pldFN0cmVhbTIvX19pbml0X18ucHkKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9KZXRTdHJlYW0yL0x1YUpTRmlnaHQvaGVsbG9fd29y
bGQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9KZXRTdHJlYW0yL0x1YUpTRmln
aHQvaGVsbG9fd29ybGQuanMJKHJldmlzaW9uIDI0ODMwMSkKKysrIFBlcmZvcm1hbmNlVGVzdHMv
SmV0U3RyZWFtMi9MdWFKU0ZpZ2h0L2hlbGxvX3dvcmxkLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0x
LDUgKzEgQEAKLWNsYXNzIEJlbmNobWFyayB7Ci0gICAgcnVuSXRlcmF0aW9uKCkgewotICAgICAg
ICBwcmludCgiSGVsbG8gd29ybGQhIik7Ci0gICAgfQotfQorcHJpbnQoIkhlbGxvIHdvcmxkISIp
OwpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9KZXRTdHJlYW0yL0x1YUpTRmlnaHQvbGlzdF9zZWFy
Y2guanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VUZXN0cy9KZXRTdHJlYW0yL0x1YUpTRmln
aHQvbGlzdF9zZWFyY2guanMJKHJldmlzaW9uIDI0ODMwMSkKKysrIFBlcmZvcm1hbmNlVGVzdHMv
SmV0U3RyZWFtMi9MdWFKU0ZpZ2h0L2xpc3Rfc2VhcmNoLmpzCSh3b3JraW5nIGNvcHkpCkBAIC04
LDE2ICs4LDUgQEAgZnVuY3Rpb24gZmlyc3RXaGVyZShsaXN0LCBmbikgewogfQogbnVtcyA9IFsx
LCAyLCAzLCA0LCA1LCA2LCA3XTsKIGZ1bmN0aW9uIGlzRXZlbih4KSB7IHJldHVybiAoeCAmIDEp
ID09IDA7IH0KLQotZnVuY3Rpb24gcnVuKCkKLXsKLSAgICBmaXJzdEV2ZW4gPSBmaXJzdFdoZXJl
KG51bXMsIGlzRXZlbik7Ci0gICAgcHJpbnQoJ0ZpcnN0IGV2ZW46ICcgKyBmaXJzdEV2ZW4pCi19
Ci0KLWNsYXNzIEJlbmNobWFyayB7Ci0gICAgcnVuSXRlcmF0aW9uKCkgewotICAgICAgICBydW4o
KTsKLSAgICB9Ci19Ci0KK2ZpcnN0RXZlbiA9IGZpcnN0V2hlcmUobnVtcywgaXNFdmVuKTsKK3By
aW50KCdGaXJzdCBldmVuOiAnICsgZmlyc3RFdmVuKQpJbmRleDogUGVyZm9ybWFuY2VUZXN0cy9K
ZXRTdHJlYW0yL0x1YUpTRmlnaHQvbGlzdHMuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gUGVyZm9ybWFuY2VU
ZXN0cy9KZXRTdHJlYW0yL0x1YUpTRmlnaHQvbGlzdHMuanMJKHJldmlzaW9uIDI0ODMwMSkKKysr
IFBlcmZvcm1hbmNlVGVzdHMvSmV0U3RyZWFtMi9MdWFKU0ZpZ2h0L2xpc3RzLmpzCSh3b3JraW5n
IGNvcHkpCkBAIC0yLDE3ICsyLDcgQEAgdmFyIG4gPSA0MDAwMDsKIHZhciBpID0gMDsKIHZhciBp
dGVtcyA9IFtdOwogCi1mdW5jdGlvbiBydW4oKQotewotICAgIGl0ZW1zID0gW107Ci0gICAgd2hp
bGUgKGkgPCBuKSB7Ci0gICAgICAgIGl0ZW1zLnB1c2goaSk7Ci0gICAgICAgIGkgPSBpICsgMTsK
LSAgICB9Ci19Ci0KLWNsYXNzIEJlbmNobWFyayB7Ci0gICAgcnVuSXRlcmF0aW9uKCkgewotICAg
ICAgICBydW4oKTsKLSAgICB9Cit3aGlsZSAoaSA8IG4pIHsKKyAgICBpdGVtcy5wdXNoKGkpOwor
ICAgIGkgPSBpICsgMTsKIH0KSW5kZXg6IFBlcmZvcm1hbmNlVGVzdHMvSmV0U3RyZWFtMi9MdWFK
U0ZpZ2h0L3JpY2hhcmRzLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMvSmV0U3Ry
ZWFtMi9MdWFKU0ZpZ2h0L3JpY2hhcmRzLmpzCShub25leGlzdGVudCkKKysrIFBlcmZvcm1hbmNl
VGVzdHMvSmV0U3RyZWFtMi9MdWFKU0ZpZ2h0L3JpY2hhcmRzLmpzCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNTM3IEBACisvLyBDb3B5cmlnaHQgMjAwNi0yMDA4IHRoZSBWOCBwcm9qZWN0IGF1
dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBh
cmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gICAgICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICog
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQor
Ly8gICAgICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcKKy8vICAgICAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorLy8gICAgICAgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5h
bWVzIG9mIGl0cworLy8gICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ug
b3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisvLyAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUg
d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJV
VE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9X
TkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkK
Ky8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworCisvLyBU
aGlzIGlzIGEgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUmljaGFyZHMKKy8vIGJl
bmNobWFyayBmcm9tOgorLy8KKy8vICAgIGh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35tcjEwL0Jl
bmNoLmh0bWwKKy8vCisvLyBUaGUgYmVuY2htYXJrIHdhcyBvcmlnaW5hbGx5IGltcGxlbWVudGVk
IGluIEJDUEwgYnkKKy8vIE1hcnRpbiBSaWNoYXJkcy4KKworCisvKioKKyAqIFRoZSBSaWNoYXJk
cyBiZW5jaG1hcmsgc2ltdWxhdGVzIHRoZSB0YXNrIGRpc3BhdGNoZXIgb2YgYW4KKyAqIG9wZXJh
dGluZyBzeXN0ZW0uCisgKiovCitmdW5jdGlvbiBydW5SaWNoYXJkcygpIHsKKyAgdmFyIHNjaGVk
dWxlciA9IG5ldyBTY2hlZHVsZXIoKTsKKyAgc2NoZWR1bGVyLmFkZElkbGVUYXNrKElEX0lETEUs
IDAsIG51bGwsIENPVU5UKTsKKworICB2YXIgcXVldWUgPSBuZXcgUGFja2V0KG51bGwsIElEX1dP
UktFUiwgS0lORF9XT1JLKTsKKyAgcXVldWUgPSBuZXcgUGFja2V0KHF1ZXVlLCAgSURfV09SS0VS
LCBLSU5EX1dPUkspOworICBzY2hlZHVsZXIuYWRkV29ya2VyVGFzayhJRF9XT1JLRVIsIDEwMDAs
IHF1ZXVlKTsKKworICBxdWV1ZSA9IG5ldyBQYWNrZXQobnVsbCwgSURfREVWSUNFX0EsIEtJTkRf
REVWSUNFKTsKKyAgcXVldWUgPSBuZXcgUGFja2V0KHF1ZXVlLCAgSURfREVWSUNFX0EsIEtJTkRf
REVWSUNFKTsKKyAgcXVldWUgPSBuZXcgUGFja2V0KHF1ZXVlLCAgSURfREVWSUNFX0EsIEtJTkRf
REVWSUNFKTsKKyAgc2NoZWR1bGVyLmFkZEhhbmRsZXJUYXNrKElEX0hBTkRMRVJfQSwgMjAwMCwg
cXVldWUpOworCisgIHF1ZXVlID0gbmV3IFBhY2tldChudWxsLCBJRF9ERVZJQ0VfQiwgS0lORF9E
RVZJQ0UpOworICBxdWV1ZSA9IG5ldyBQYWNrZXQocXVldWUsICBJRF9ERVZJQ0VfQiwgS0lORF9E
RVZJQ0UpOworICBxdWV1ZSA9IG5ldyBQYWNrZXQocXVldWUsICBJRF9ERVZJQ0VfQiwgS0lORF9E
RVZJQ0UpOworICBzY2hlZHVsZXIuYWRkSGFuZGxlclRhc2soSURfSEFORExFUl9CLCAzMDAwLCBx
dWV1ZSk7CisKKyAgc2NoZWR1bGVyLmFkZERldmljZVRhc2soSURfREVWSUNFX0EsIDQwMDAsIG51
bGwpOworCisgIHNjaGVkdWxlci5hZGREZXZpY2VUYXNrKElEX0RFVklDRV9CLCA1MDAwLCBudWxs
KTsKKworICBzY2hlZHVsZXIuc2NoZWR1bGUoKTsKKworICBpZiAoc2NoZWR1bGVyLnF1ZXVlQ291
bnQgIT0gRVhQRUNURURfUVVFVUVfQ09VTlQgfHwKKyAgICAgIHNjaGVkdWxlci5ob2xkQ291bnQg
IT0gRVhQRUNURURfSE9MRF9DT1VOVCkgeworICAgIHZhciBtc2cgPQorICAgICAgICAiRXJyb3Ig
ZHVyaW5nIGV4ZWN1dGlvbjogcXVldWVDb3VudCA9ICIgKyBzY2hlZHVsZXIucXVldWVDb3VudCAr
CisgICAgICAgICIsIGhvbGRDb3VudCA9ICIgKyBzY2hlZHVsZXIuaG9sZENvdW50ICsgIi4iOwor
ICAgIHRocm93IG5ldyBFcnJvcihtc2cpOworICB9Cit9CisKK3ZhciBDT1VOVCA9IDEwMDA7CisK
Ky8qKgorICogVGhlc2UgdHdvIGNvbnN0YW50cyBzcGVjaWZ5IGhvdyBtYW55IHRpbWVzIGEgcGFj
a2V0IGlzIHF1ZXVlZCBhbmQKKyAqIGhvdyBtYW55IHRpbWVzIGEgdGFzayBpcyBwdXQgb24gaG9s
ZCBpbiBhIGNvcnJlY3QgcnVuIG9mIHJpY2hhcmRzLgorICogVGhleSBkb24ndCBoYXZlIGFueSBt
ZWFuaW5nIGEgc3VjaCBidXQgYXJlIGNoYXJhY3RlcmlzdGljIG9mIGEKKyAqIGNvcnJlY3QgcnVu
IHNvIGlmIHRoZSBhY3R1YWwgcXVldWUgb3IgaG9sZCBjb3VudCBpcyBkaWZmZXJlbnQgZnJvbQor
ICogdGhlIGV4cGVjdGVkIHRoZXJlIG11c3QgYmUgYSBidWcgaW4gdGhlIGltcGxlbWVudGF0aW9u
LgorICoqLwordmFyIEVYUEVDVEVEX1FVRVVFX0NPVU5UID0gMjMyMjsKK3ZhciBFWFBFQ1RFRF9I
T0xEX0NPVU5UID0gOTI4OworCisKKy8qKgorICogQSBzY2hlZHVsZXIgY2FuIGJlIHVzZWQgdG8g
c2NoZWR1bGUgYSBzZXQgb2YgdGFza3MgYmFzZWQgb24gdGhlaXIgcmVsYXRpdmUKKyAqIHByaW9y
aXRpZXMuICBTY2hlZHVsaW5nIGlzIGRvbmUgYnkgbWFpbnRhaW5pbmcgYSBsaXN0IG9mIHRhc2sg
Y29udHJvbCBibG9ja3MKKyAqIHdoaWNoIGhvbGRzIHRhc2tzIGFuZCB0aGUgZGF0YSBxdWV1ZSB0
aGV5IGFyZSBwcm9jZXNzaW5nLgorICogQGNvbnN0cnVjdG9yCisgKi8KK2Z1bmN0aW9uIFNjaGVk
dWxlcigpIHsKKyAgdGhpcy5xdWV1ZUNvdW50ID0gMDsKKyAgdGhpcy5ob2xkQ291bnQgPSAwOwor
ICB0aGlzLmJsb2NrcyA9IG5ldyBBcnJheShOVU1CRVJfT0ZfSURTKTsKKyAgdGhpcy5saXN0ID0g
bnVsbDsKKyAgdGhpcy5jdXJyZW50VGNiID0gbnVsbDsKKyAgdGhpcy5jdXJyZW50SWQgPSBudWxs
OworfQorCit2YXIgSURfSURMRSAgICAgICA9IDA7Cit2YXIgSURfV09SS0VSICAgICA9IDE7Cit2
YXIgSURfSEFORExFUl9BICA9IDI7Cit2YXIgSURfSEFORExFUl9CICA9IDM7Cit2YXIgSURfREVW
SUNFX0EgICA9IDQ7Cit2YXIgSURfREVWSUNFX0IgICA9IDU7Cit2YXIgTlVNQkVSX09GX0lEUyA9
IDY7CisKK3ZhciBLSU5EX0RFVklDRSAgID0gMDsKK3ZhciBLSU5EX1dPUksgICAgID0gMTsKKwor
LyoqCisgKiBBZGQgYW4gaWRsZSB0YXNrIHRvIHRoaXMgc2NoZWR1bGVyLgorICogQHBhcmFtIHtp
bnR9IGlkIHRoZSBpZGVudGl0eSBvZiB0aGUgdGFzaworICogQHBhcmFtIHtpbnR9IHByaW9yaXR5
IHRoZSB0YXNrJ3MgcHJpb3JpdHkKKyAqIEBwYXJhbSB7UGFja2V0fSBxdWV1ZSB0aGUgcXVldWUg
b2Ygd29yayB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIHRhc2sKKyAqIEBwYXJhbSB7aW50fSBjb3Vu
dCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRvIHNjaGVkdWxlIHRoZSB0YXNrCisgKi8KK1NjaGVkdWxl
ci5wcm90b3R5cGUuYWRkSWRsZVRhc2sgPSBmdW5jdGlvbiAoaWQsIHByaW9yaXR5LCBxdWV1ZSwg
Y291bnQpIHsKKyAgdGhpcy5hZGRSdW5uaW5nVGFzayhpZCwgcHJpb3JpdHksIHF1ZXVlLCBuZXcg
SWRsZVRhc2sodGhpcywgMSwgY291bnQpKTsKK307CisKKy8qKgorICogQWRkIGEgd29yayB0YXNr
IHRvIHRoaXMgc2NoZWR1bGVyLgorICogQHBhcmFtIHtpbnR9IGlkIHRoZSBpZGVudGl0eSBvZiB0
aGUgdGFzaworICogQHBhcmFtIHtpbnR9IHByaW9yaXR5IHRoZSB0YXNrJ3MgcHJpb3JpdHkKKyAq
IEBwYXJhbSB7UGFja2V0fSBxdWV1ZSB0aGUgcXVldWUgb2Ygd29yayB0byBiZSBwcm9jZXNzZWQg
YnkgdGhlIHRhc2sKKyAqLworU2NoZWR1bGVyLnByb3RvdHlwZS5hZGRXb3JrZXJUYXNrID0gZnVu
Y3Rpb24gKGlkLCBwcmlvcml0eSwgcXVldWUpIHsKKyAgdGhpcy5hZGRUYXNrKGlkLCBwcmlvcml0
eSwgcXVldWUsIG5ldyBXb3JrZXJUYXNrKHRoaXMsIElEX0hBTkRMRVJfQSwgMCkpOworfTsKKwor
LyoqCisgKiBBZGQgYSBoYW5kbGVyIHRhc2sgdG8gdGhpcyBzY2hlZHVsZXIuCisgKiBAcGFyYW0g
e2ludH0gaWQgdGhlIGlkZW50aXR5IG9mIHRoZSB0YXNrCisgKiBAcGFyYW0ge2ludH0gcHJpb3Jp
dHkgdGhlIHRhc2sncyBwcmlvcml0eQorICogQHBhcmFtIHtQYWNrZXR9IHF1ZXVlIHRoZSBxdWV1
ZSBvZiB3b3JrIHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgdGFzaworICovCitTY2hlZHVsZXIucHJv
dG90eXBlLmFkZEhhbmRsZXJUYXNrID0gZnVuY3Rpb24gKGlkLCBwcmlvcml0eSwgcXVldWUpIHsK
KyAgdGhpcy5hZGRUYXNrKGlkLCBwcmlvcml0eSwgcXVldWUsIG5ldyBIYW5kbGVyVGFzayh0aGlz
KSk7Cit9OworCisvKioKKyAqIEFkZCBhIGhhbmRsZXIgdGFzayB0byB0aGlzIHNjaGVkdWxlci4K
KyAqIEBwYXJhbSB7aW50fSBpZCB0aGUgaWRlbnRpdHkgb2YgdGhlIHRhc2sKKyAqIEBwYXJhbSB7
aW50fSBwcmlvcml0eSB0aGUgdGFzaydzIHByaW9yaXR5CisgKiBAcGFyYW0ge1BhY2tldH0gcXVl
dWUgdGhlIHF1ZXVlIG9mIHdvcmsgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSB0YXNrCisgKi8KK1Nj
aGVkdWxlci5wcm90b3R5cGUuYWRkRGV2aWNlVGFzayA9IGZ1bmN0aW9uIChpZCwgcHJpb3JpdHks
IHF1ZXVlKSB7CisgIHRoaXMuYWRkVGFzayhpZCwgcHJpb3JpdHksIHF1ZXVlLCBuZXcgRGV2aWNl
VGFzayh0aGlzKSkKK307CisKKy8qKgorICogQWRkIHRoZSBzcGVjaWZpZWQgdGFzayBhbmQgbWFy
ayBpdCBhcyBydW5uaW5nLgorICogQHBhcmFtIHtpbnR9IGlkIHRoZSBpZGVudGl0eSBvZiB0aGUg
dGFzaworICogQHBhcmFtIHtpbnR9IHByaW9yaXR5IHRoZSB0YXNrJ3MgcHJpb3JpdHkKKyAqIEBw
YXJhbSB7UGFja2V0fSBxdWV1ZSB0aGUgcXVldWUgb2Ygd29yayB0byBiZSBwcm9jZXNzZWQgYnkg
dGhlIHRhc2sKKyAqIEBwYXJhbSB7VGFza30gdGFzayB0aGUgdGFzayB0byBhZGQKKyAqLworU2No
ZWR1bGVyLnByb3RvdHlwZS5hZGRSdW5uaW5nVGFzayA9IGZ1bmN0aW9uIChpZCwgcHJpb3JpdHks
IHF1ZXVlLCB0YXNrKSB7CisgIHRoaXMuYWRkVGFzayhpZCwgcHJpb3JpdHksIHF1ZXVlLCB0YXNr
KTsKKyAgdGhpcy5jdXJyZW50VGNiLnNldFJ1bm5pbmcoKTsKK307CisKKy8qKgorICogQWRkIHRo
ZSBzcGVjaWZpZWQgdGFzayB0byB0aGlzIHNjaGVkdWxlci4KKyAqIEBwYXJhbSB7aW50fSBpZCB0
aGUgaWRlbnRpdHkgb2YgdGhlIHRhc2sKKyAqIEBwYXJhbSB7aW50fSBwcmlvcml0eSB0aGUgdGFz
aydzIHByaW9yaXR5CisgKiBAcGFyYW0ge1BhY2tldH0gcXVldWUgdGhlIHF1ZXVlIG9mIHdvcmsg
dG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSB0YXNrCisgKiBAcGFyYW0ge1Rhc2t9IHRhc2sgdGhlIHRh
c2sgdG8gYWRkCisgKi8KK1NjaGVkdWxlci5wcm90b3R5cGUuYWRkVGFzayA9IGZ1bmN0aW9uIChp
ZCwgcHJpb3JpdHksIHF1ZXVlLCB0YXNrKSB7CisgIHRoaXMuY3VycmVudFRjYiA9IG5ldyBUYXNr
Q29udHJvbEJsb2NrKHRoaXMubGlzdCwgaWQsIHByaW9yaXR5LCBxdWV1ZSwgdGFzayk7CisgIHRo
aXMubGlzdCA9IHRoaXMuY3VycmVudFRjYjsKKyAgdGhpcy5ibG9ja3NbaWRdID0gdGhpcy5jdXJy
ZW50VGNiOworfTsKKworLyoqCisgKiBFeGVjdXRlIHRoZSB0YXNrcyBtYW5hZ2VkIGJ5IHRoaXMg
c2NoZWR1bGVyLgorICovCitTY2hlZHVsZXIucHJvdG90eXBlLnNjaGVkdWxlID0gZnVuY3Rpb24g
KCkgeworICB0aGlzLmN1cnJlbnRUY2IgPSB0aGlzLmxpc3Q7CisgIHdoaWxlICh0aGlzLmN1cnJl
bnRUY2IgIT0gbnVsbCkgeworICAgIGlmICh0aGlzLmN1cnJlbnRUY2IuaXNIZWxkT3JTdXNwZW5k
ZWQoKSkgeworICAgICAgdGhpcy5jdXJyZW50VGNiID0gdGhpcy5jdXJyZW50VGNiLmxpbms7Cisg
ICAgfSBlbHNlIHsKKyAgICAgIHRoaXMuY3VycmVudElkID0gdGhpcy5jdXJyZW50VGNiLmlkOwor
ICAgICAgdGhpcy5jdXJyZW50VGNiID0gdGhpcy5jdXJyZW50VGNiLnJ1bigpOworICAgIH0KKyAg
fQorfTsKKworLyoqCisgKiBSZWxlYXNlIGEgdGFzayB0aGF0IGlzIGN1cnJlbnRseSBibG9ja2Vk
IGFuZCByZXR1cm4gdGhlIG5leHQgYmxvY2sgdG8gcnVuLgorICogQHBhcmFtIHtpbnR9IGlkIHRo
ZSBpZCBvZiB0aGUgdGFzayB0byBzdXNwZW5kCisgKi8KK1NjaGVkdWxlci5wcm90b3R5cGUucmVs
ZWFzZSA9IGZ1bmN0aW9uIChpZCkgeworICB2YXIgdGNiID0gdGhpcy5ibG9ja3NbaWRdOworICBp
ZiAodGNiID09IG51bGwpIHJldHVybiB0Y2I7CisgIHRjYi5tYXJrQXNOb3RIZWxkKCk7CisgIGlm
ICh0Y2IucHJpb3JpdHkgPiB0aGlzLmN1cnJlbnRUY2IucHJpb3JpdHkpIHsKKyAgICByZXR1cm4g
dGNiOworICB9IGVsc2UgeworICAgIHJldHVybiB0aGlzLmN1cnJlbnRUY2I7CisgIH0KK307CisK
Ky8qKgorICogQmxvY2sgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdGFzayBhbmQgcmV0dXJuIHRo
ZSBuZXh0IHRhc2sgY29udHJvbCBibG9jaworICogdG8gcnVuLiAgVGhlIGJsb2NrZWQgdGFzayB3
aWxsIG5vdCBiZSBtYWRlIHJ1bm5hYmxlIHVudGlsIGl0IGlzIGV4cGxpY2l0bHkKKyAqIHJlbGVh
c2VkLCBldmVuIGlmIG5ldyB3b3JrIGlzIGFkZGVkIHRvIGl0LgorICovCitTY2hlZHVsZXIucHJv
dG90eXBlLmhvbGRDdXJyZW50ID0gZnVuY3Rpb24gKCkgeworICB0aGlzLmhvbGRDb3VudCsrOwor
ICB0aGlzLmN1cnJlbnRUY2IubWFya0FzSGVsZCgpOworICByZXR1cm4gdGhpcy5jdXJyZW50VGNi
Lmxpbms7Cit9OworCisvKioKKyAqIFN1c3BlbmQgdGhlIGN1cnJlbnRseSBleGVjdXRpbmcgdGFz
ayBhbmQgcmV0dXJuIHRoZSBuZXh0IHRhc2sgY29udHJvbCBibG9jaworICogdG8gcnVuLiAgSWYg
bmV3IHdvcmsgaXMgYWRkZWQgdG8gdGhlIHN1c3BlbmRlZCB0YXNrIGl0IHdpbGwgYmUgbWFkZSBy
dW5uYWJsZS4KKyAqLworU2NoZWR1bGVyLnByb3RvdHlwZS5zdXNwZW5kQ3VycmVudCA9IGZ1bmN0
aW9uICgpIHsKKyAgdGhpcy5jdXJyZW50VGNiLm1hcmtBc1N1c3BlbmRlZCgpOworICByZXR1cm4g
dGhpcy5jdXJyZW50VGNiOworfTsKKworLyoqCisgKiBBZGQgdGhlIHNwZWNpZmllZCBwYWNrZXQg
dG8gdGhlIGVuZCBvZiB0aGUgd29ya2xpc3QgdXNlZCBieSB0aGUgdGFzaworICogYXNzb2NpYXRl
ZCB3aXRoIHRoZSBwYWNrZXQgYW5kIG1ha2UgdGhlIHRhc2sgcnVubmFibGUgaWYgaXQgaXMgY3Vy
cmVudGx5CisgKiBzdXNwZW5kZWQuCisgKiBAcGFyYW0ge1BhY2tldH0gcGFja2V0IHRoZSBwYWNr
ZXQgdG8gYWRkCisgKi8KK1NjaGVkdWxlci5wcm90b3R5cGUucXVldWUgPSBmdW5jdGlvbiAocGFj
a2V0KSB7CisgIHZhciB0ID0gdGhpcy5ibG9ja3NbcGFja2V0LmlkXTsKKyAgaWYgKHQgPT0gbnVs
bCkgcmV0dXJuIHQ7CisgIHRoaXMucXVldWVDb3VudCsrOworICBwYWNrZXQubGluayA9IG51bGw7
CisgIHBhY2tldC5pZCA9IHRoaXMuY3VycmVudElkOworICByZXR1cm4gdC5jaGVja1ByaW9yaXR5
QWRkKHRoaXMuY3VycmVudFRjYiwgcGFja2V0KTsKK307CisKKy8qKgorICogQSB0YXNrIGNvbnRy
b2wgYmxvY2sgbWFuYWdlcyBhIHRhc2sgYW5kIHRoZSBxdWV1ZSBvZiB3b3JrIHBhY2thZ2VzIGFz
c29jaWF0ZWQKKyAqIHdpdGggaXQuCisgKiBAcGFyYW0ge1Rhc2tDb250cm9sQmxvY2t9IGxpbmsg
dGhlIHByZWNlZGluZyBibG9jayBpbiB0aGUgbGlua2VkIGJsb2NrIGxpc3QKKyAqIEBwYXJhbSB7
aW50fSBpZCB0aGUgaWQgb2YgdGhpcyBibG9jaworICogQHBhcmFtIHtpbnR9IHByaW9yaXR5IHRo
ZSBwcmlvcml0eSBvZiB0aGlzIGJsb2NrCisgKiBAcGFyYW0ge1BhY2tldH0gcXVldWUgdGhlIHF1
ZXVlIG9mIHBhY2thZ2VzIHRvIGJlIHByb2Nlc3NlZCBieSB0aGUgdGFzaworICogQHBhcmFtIHtU
YXNrfSB0YXNrIHRoZSB0YXNrCisgKiBAY29uc3RydWN0b3IKKyAqLworZnVuY3Rpb24gVGFza0Nv
bnRyb2xCbG9jayhsaW5rLCBpZCwgcHJpb3JpdHksIHF1ZXVlLCB0YXNrKSB7CisgIHRoaXMubGlu
ayA9IGxpbms7CisgIHRoaXMuaWQgPSBpZDsKKyAgdGhpcy5wcmlvcml0eSA9IHByaW9yaXR5Owor
ICB0aGlzLnF1ZXVlID0gcXVldWU7CisgIHRoaXMudGFzayA9IHRhc2s7CisgIGlmIChxdWV1ZSA9
PSBudWxsKSB7CisgICAgdGhpcy5zdGF0ZSA9IFNUQVRFX1NVU1BFTkRFRDsKKyAgfSBlbHNlIHsK
KyAgICB0aGlzLnN0YXRlID0gU1RBVEVfU1VTUEVOREVEX1JVTk5BQkxFOworICB9Cit9CisKKy8q
KgorICogVGhlIHRhc2sgaXMgcnVubmluZyBhbmQgaXMgY3VycmVudGx5IHNjaGVkdWxlZC4KKyAq
LwordmFyIFNUQVRFX1JVTk5JTkcgPSAwOworCisvKioKKyAqIFRoZSB0YXNrIGhhcyBwYWNrZXRz
IGxlZnQgdG8gcHJvY2Vzcy4KKyAqLwordmFyIFNUQVRFX1JVTk5BQkxFID0gMTsKKworLyoqCisg
KiBUaGUgdGFzayBpcyBub3QgY3VycmVudGx5IHJ1bm5pbmcuICBUaGUgdGFzayBpcyBub3QgYmxv
Y2tlZCBhcyBzdWNoIGFuZCBtYXkKKyogYmUgc3RhcnRlZCBieSB0aGUgc2NoZWR1bGVyLgorICov
Cit2YXIgU1RBVEVfU1VTUEVOREVEID0gMjsKKworLyoqCisgKiBUaGUgdGFzayBpcyBibG9ja2Vk
IGFuZCBjYW5ub3QgYmUgcnVuIHVudGlsIGl0IGlzIGV4cGxpY2l0bHkgcmVsZWFzZWQuCisgKi8K
K3ZhciBTVEFURV9IRUxEID0gNDsKKwordmFyIFNUQVRFX1NVU1BFTkRFRF9SVU5OQUJMRSA9IFNU
QVRFX1NVU1BFTkRFRCB8IFNUQVRFX1JVTk5BQkxFOwordmFyIFNUQVRFX05PVF9IRUxEID0gflNU
QVRFX0hFTEQ7CisKK1Rhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLnNldFJ1bm5pbmcgPSBmdW5j
dGlvbiAoKSB7CisgIHRoaXMuc3RhdGUgPSBTVEFURV9SVU5OSU5HOworfTsKKworVGFza0NvbnRy
b2xCbG9jay5wcm90b3R5cGUubWFya0FzTm90SGVsZCA9IGZ1bmN0aW9uICgpIHsKKyAgdGhpcy5z
dGF0ZSA9IHRoaXMuc3RhdGUgJiBTVEFURV9OT1RfSEVMRDsKK307CisKK1Rhc2tDb250cm9sQmxv
Y2sucHJvdG90eXBlLm1hcmtBc0hlbGQgPSBmdW5jdGlvbiAoKSB7CisgIHRoaXMuc3RhdGUgPSB0
aGlzLnN0YXRlIHwgU1RBVEVfSEVMRDsKK307CisKK1Rhc2tDb250cm9sQmxvY2sucHJvdG90eXBl
LmlzSGVsZE9yU3VzcGVuZGVkID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gKHRoaXMuc3RhdGUg
JiBTVEFURV9IRUxEKSAhPSAwIHx8ICh0aGlzLnN0YXRlID09IFNUQVRFX1NVU1BFTkRFRCk7Cit9
OworCitUYXNrQ29udHJvbEJsb2NrLnByb3RvdHlwZS5tYXJrQXNTdXNwZW5kZWQgPSBmdW5jdGlv
biAoKSB7CisgIHRoaXMuc3RhdGUgPSB0aGlzLnN0YXRlIHwgU1RBVEVfU1VTUEVOREVEOworfTsK
KworVGFza0NvbnRyb2xCbG9jay5wcm90b3R5cGUubWFya0FzUnVubmFibGUgPSBmdW5jdGlvbiAo
KSB7CisgIHRoaXMuc3RhdGUgPSB0aGlzLnN0YXRlIHwgU1RBVEVfUlVOTkFCTEU7Cit9OworCisv
KioKKyAqIFJ1bnMgdGhpcyB0YXNrLCBpZiBpdCBpcyByZWFkeSB0byBiZSBydW4sIGFuZCByZXR1
cm5zIHRoZSBuZXh0IHRhc2sgdG8gcnVuLgorICovCitUYXNrQ29udHJvbEJsb2NrLnByb3RvdHlw
ZS5ydW4gPSBmdW5jdGlvbiAoKSB7CisgIHZhciBwYWNrZXQ7CisgIGlmICh0aGlzLnN0YXRlID09
IFNUQVRFX1NVU1BFTkRFRF9SVU5OQUJMRSkgeworICAgIHBhY2tldCA9IHRoaXMucXVldWU7Cisg
ICAgdGhpcy5xdWV1ZSA9IHBhY2tldC5saW5rOworICAgIGlmICh0aGlzLnF1ZXVlID09IG51bGwp
IHsKKyAgICAgIHRoaXMuc3RhdGUgPSBTVEFURV9SVU5OSU5HOworICAgIH0gZWxzZSB7CisgICAg
ICB0aGlzLnN0YXRlID0gU1RBVEVfUlVOTkFCTEU7CisgICAgfQorICB9IGVsc2UgeworICAgIHBh
Y2tldCA9IG51bGw7CisgIH0KKyAgcmV0dXJuIHRoaXMudGFzay5ydW4ocGFja2V0KTsKK307CisK
Ky8qKgorICogQWRkcyBhIHBhY2tldCB0byB0aGUgd29ya2xpc3Qgb2YgdGhpcyBibG9jaydzIHRh
c2ssIG1hcmtzIHRoaXMgYXMgcnVubmFibGUgaWYKKyAqIG5lY2Vzc2FyeSwgYW5kIHJldHVybnMg
dGhlIG5leHQgcnVubmFibGUgb2JqZWN0IHRvIHJ1biAodGhlIG9uZQorICogd2l0aCB0aGUgaGln
aGVzdCBwcmlvcml0eSkuCisgKi8KK1Rhc2tDb250cm9sQmxvY2sucHJvdG90eXBlLmNoZWNrUHJp
b3JpdHlBZGQgPSBmdW5jdGlvbiAodGFzaywgcGFja2V0KSB7CisgIGlmICh0aGlzLnF1ZXVlID09
IG51bGwpIHsKKyAgICB0aGlzLnF1ZXVlID0gcGFja2V0OworICAgIHRoaXMubWFya0FzUnVubmFi
bGUoKTsKKyAgICBpZiAodGhpcy5wcmlvcml0eSA+IHRhc2sucHJpb3JpdHkpIHJldHVybiB0aGlz
OworICB9IGVsc2UgeworICAgIHRoaXMucXVldWUgPSBwYWNrZXQuYWRkVG8odGhpcy5xdWV1ZSk7
CisgIH0KKyAgcmV0dXJuIHRhc2s7Cit9OworCitUYXNrQ29udHJvbEJsb2NrLnByb3RvdHlwZS50
b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuICJ0Y2IgeyAiICsgdGhpcy50YXNrICsg
IkAiICsgdGhpcy5zdGF0ZSArICIgfSI7Cit9OworCisvKioKKyAqIEFuIGlkbGUgdGFzayBkb2Vz
bid0IGRvIGFueSB3b3JrIGl0c2VsZiBidXQgY3ljbGVzIGNvbnRyb2wgYmV0d2VlbiB0aGUgdHdv
CisgKiBkZXZpY2UgdGFza3MuCisgKiBAcGFyYW0ge1NjaGVkdWxlcn0gc2NoZWR1bGVyIHRoZSBz
Y2hlZHVsZXIgdGhhdCBtYW5hZ2VzIHRoaXMgdGFzaworICogQHBhcmFtIHtpbnR9IHYxIGEgc2Vl
ZCB2YWx1ZSB0aGF0IGNvbnRyb2xzIGhvdyB0aGUgZGV2aWNlIHRhc2tzIGFyZSBzY2hlZHVsZWQK
KyAqIEBwYXJhbSB7aW50fSBjb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgdGFzayBzaG91
bGQgYmUgc2NoZWR1bGVkCisgKiBAY29uc3RydWN0b3IKKyAqLworZnVuY3Rpb24gSWRsZVRhc2so
c2NoZWR1bGVyLCB2MSwgY291bnQpIHsKKyAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7Cisg
IHRoaXMudjEgPSB2MTsKKyAgdGhpcy5jb3VudCA9IGNvdW50OworfQorCitJZGxlVGFzay5wcm90
b3R5cGUucnVuID0gZnVuY3Rpb24gKHBhY2tldCkgeworICB0aGlzLmNvdW50LS07CisgIGlmICh0
aGlzLmNvdW50ID09IDApIHJldHVybiB0aGlzLnNjaGVkdWxlci5ob2xkQ3VycmVudCgpOworICBp
ZiAoKHRoaXMudjEgJiAxKSA9PSAwKSB7CisgICAgdGhpcy52MSA9IHRoaXMudjEgPj4gMTsKKyAg
ICByZXR1cm4gdGhpcy5zY2hlZHVsZXIucmVsZWFzZShJRF9ERVZJQ0VfQSk7CisgIH0gZWxzZSB7
CisgICAgdGhpcy52MSA9ICh0aGlzLnYxID4+IDEpIF4gMHhEMDA4OworICAgIHJldHVybiB0aGlz
LnNjaGVkdWxlci5yZWxlYXNlKElEX0RFVklDRV9CKTsKKyAgfQorfTsKKworSWRsZVRhc2sucHJv
dG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgeworICByZXR1cm4gIklkbGVUYXNrIgorfTsK
KworLyoqCisgKiBBIHRhc2sgdGhhdCBzdXNwZW5kcyBpdHNlbGYgYWZ0ZXIgZWFjaCB0aW1lIGl0
IGhhcyBiZWVuIHJ1biB0byBzaW11bGF0ZQorICogd2FpdGluZyBmb3IgZGF0YSBmcm9tIGFuIGV4
dGVybmFsIGRldmljZS4KKyAqIEBwYXJhbSB7U2NoZWR1bGVyfSBzY2hlZHVsZXIgdGhlIHNjaGVk
dWxlciB0aGF0IG1hbmFnZXMgdGhpcyB0YXNrCisgKiBAY29uc3RydWN0b3IKKyAqLworZnVuY3Rp
b24gRGV2aWNlVGFzayhzY2hlZHVsZXIpIHsKKyAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7
CisgIHRoaXMudjEgPSBudWxsOworfQorCitEZXZpY2VUYXNrLnByb3RvdHlwZS5ydW4gPSBmdW5j
dGlvbiAocGFja2V0KSB7CisgIGlmIChwYWNrZXQgPT0gbnVsbCkgeworICAgIGlmICh0aGlzLnYx
ID09IG51bGwpIHJldHVybiB0aGlzLnNjaGVkdWxlci5zdXNwZW5kQ3VycmVudCgpOworICAgIHZh
ciB2ID0gdGhpcy52MTsKKyAgICB0aGlzLnYxID0gbnVsbDsKKyAgICByZXR1cm4gdGhpcy5zY2hl
ZHVsZXIucXVldWUodik7CisgIH0gZWxzZSB7CisgICAgdGhpcy52MSA9IHBhY2tldDsKKyAgICBy
ZXR1cm4gdGhpcy5zY2hlZHVsZXIuaG9sZEN1cnJlbnQoKTsKKyAgfQorfTsKKworRGV2aWNlVGFz
ay5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiAiRGV2aWNlVGFz
ayI7Cit9OworCisvKioKKyAqIEEgdGFzayB0aGF0IG1hbmlwdWxhdGVzIHdvcmsgcGFja2V0cy4K
KyAqIEBwYXJhbSB7U2NoZWR1bGVyfSBzY2hlZHVsZXIgdGhlIHNjaGVkdWxlciB0aGF0IG1hbmFn
ZXMgdGhpcyB0YXNrCisgKiBAcGFyYW0ge2ludH0gdjEgYSBzZWVkIHVzZWQgdG8gc3BlY2lmeSBo
b3cgd29yayBwYWNrZXRzIGFyZSBtYW5pcHVsYXRlZAorICogQHBhcmFtIHtpbnR9IHYyIGFub3Ro
ZXIgc2VlZCB1c2VkIHRvIHNwZWNpZnkgaG93IHdvcmsgcGFja2V0cyBhcmUgbWFuaXB1bGF0ZWQK
KyAqIEBjb25zdHJ1Y3RvcgorICovCitmdW5jdGlvbiBXb3JrZXJUYXNrKHNjaGVkdWxlciwgdjEs
IHYyKSB7CisgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyOworICB0aGlzLnYxID0gdjE7Cisg
IHRoaXMudjIgPSB2MjsKK30KKworV29ya2VyVGFzay5wcm90b3R5cGUucnVuID0gZnVuY3Rpb24g
KHBhY2tldCkgeworICBpZiAocGFja2V0ID09IG51bGwpIHsKKyAgICByZXR1cm4gdGhpcy5zY2hl
ZHVsZXIuc3VzcGVuZEN1cnJlbnQoKTsKKyAgfSBlbHNlIHsKKyAgICBpZiAodGhpcy52MSA9PSBJ
RF9IQU5ETEVSX0EpIHsKKyAgICAgIHRoaXMudjEgPSBJRF9IQU5ETEVSX0I7CisgICAgfSBlbHNl
IHsKKyAgICAgIHRoaXMudjEgPSBJRF9IQU5ETEVSX0E7CisgICAgfQorICAgIHBhY2tldC5pZCA9
IHRoaXMudjE7CisgICAgcGFja2V0LmExID0gMDsKKyAgICBmb3IgKHZhciBpID0gMDsgaSA8IERB
VEFfU0laRTsgaSsrKSB7CisgICAgICB0aGlzLnYyKys7CisgICAgICBpZiAodGhpcy52MiA+IDI2
KSB0aGlzLnYyID0gMTsKKyAgICAgIHBhY2tldC5hMltpXSA9IHRoaXMudjI7CisgICAgfQorICAg
IHJldHVybiB0aGlzLnNjaGVkdWxlci5xdWV1ZShwYWNrZXQpOworICB9Cit9OworCitXb3JrZXJU
YXNrLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKKyAgcmV0dXJuICJXb3JrZXJU
YXNrIjsKK307CisKKy8qKgorICogQSB0YXNrIHRoYXQgbWFuaXB1bGF0ZXMgd29yayBwYWNrZXRz
IGFuZCB0aGVuIHN1c3BlbmRzIGl0c2VsZi4KKyAqIEBwYXJhbSB7U2NoZWR1bGVyfSBzY2hlZHVs
ZXIgdGhlIHNjaGVkdWxlciB0aGF0IG1hbmFnZXMgdGhpcyB0YXNrCisgKiBAY29uc3RydWN0b3IK
KyAqLworZnVuY3Rpb24gSGFuZGxlclRhc2soc2NoZWR1bGVyKSB7CisgIHRoaXMuc2NoZWR1bGVy
ID0gc2NoZWR1bGVyOworICB0aGlzLnYxID0gbnVsbDsKKyAgdGhpcy52MiA9IG51bGw7Cit9CisK
K0hhbmRsZXJUYXNrLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAocGFja2V0KSB7CisgIGlmIChw
YWNrZXQgIT0gbnVsbCkgeworICAgIGlmIChwYWNrZXQua2luZCA9PSBLSU5EX1dPUkspIHsKKyAg
ICAgIHRoaXMudjEgPSBwYWNrZXQuYWRkVG8odGhpcy52MSk7CisgICAgfSBlbHNlIHsKKyAgICAg
IHRoaXMudjIgPSBwYWNrZXQuYWRkVG8odGhpcy52Mik7CisgICAgfQorICB9CisgIGlmICh0aGlz
LnYxICE9IG51bGwpIHsKKyAgICB2YXIgY291bnQgPSB0aGlzLnYxLmExOworICAgIHZhciB2Owor
ICAgIGlmIChjb3VudCA8IERBVEFfU0laRSkgeworICAgICAgaWYgKHRoaXMudjIgIT0gbnVsbCkg
eworICAgICAgICB2ID0gdGhpcy52MjsKKyAgICAgICAgdGhpcy52MiA9IHRoaXMudjIubGluazsK
KyAgICAgICAgdi5hMSA9IHRoaXMudjEuYTJbY291bnRdOworICAgICAgICB0aGlzLnYxLmExID0g
Y291bnQgKyAxOworICAgICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZXIucXVldWUodik7CisgICAg
ICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHYgPSB0aGlzLnYxOworICAgICAgdGhpcy52MSA9IHRo
aXMudjEubGluazsKKyAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlci5xdWV1ZSh2KTsKKyAgICB9
CisgIH0KKyAgcmV0dXJuIHRoaXMuc2NoZWR1bGVyLnN1c3BlbmRDdXJyZW50KCk7Cit9OworCitI
YW5kbGVyVGFzay5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CisgIHJldHVybiAi
SGFuZGxlclRhc2siOworfTsKKworLyogLS0tICoKKyAqIFAgYSBjIGsgZSB0CisgKiAtLS0gKi8K
KwordmFyIERBVEFfU0laRSA9IDQ7CisKKy8qKgorICogQSBzaW1wbGUgcGFja2FnZSBvZiBkYXRh
IHRoYXQgaXMgbWFuaXB1bGF0ZWQgYnkgdGhlIHRhc2tzLiAgVGhlIGV4YWN0IGxheW91dAorICog
b2YgdGhlIHBheWxvYWQgZGF0YSBjYXJyaWVkIGJ5IGEgcGFja2V0IGlzIG5vdCBpbXBvcnRhaW50
LCBhbmQgbmVpdGhlciBpcyB0aGUKKyAqIG5hdHVyZSBvZiB0aGUgd29yayBwZXJmb3JtZWQgb24g
cGFja2V0cyBieSB0aGUgdGFza3MuCisgKgorICogQmVzaWRlcyBjYXJyeWluZyBkYXRhLCBwYWNr
ZXRzIGZvcm0gbGlua2VkIGxpc3RzIGFuZCBhcmUgaGVuY2UgdXNlZCBib3RoIGFzCisgKiBkYXRh
IGFuZCB3b3JrbGlzdHMuCisgKiBAcGFyYW0ge1BhY2tldH0gbGluayB0aGUgdGFpbCBvZiB0aGUg
bGlua2VkIGxpc3Qgb2YgcGFja2V0cworICogQHBhcmFtIHtpbnR9IGlkIGFuIElEIGZvciB0aGlz
IHBhY2tldAorICogQHBhcmFtIHtpbnR9IGtpbmQgdGhlIHR5cGUgb2YgdGhpcyBwYWNrZXQKKyAq
IEBjb25zdHJ1Y3RvcgorICovCitmdW5jdGlvbiBQYWNrZXQobGluaywgaWQsIGtpbmQpIHsKKyAg
dGhpcy5saW5rID0gbGluazsKKyAgdGhpcy5pZCA9IGlkOworICB0aGlzLmtpbmQgPSBraW5kOwor
ICB0aGlzLmExID0gMDsKKyAgdGhpcy5hMiA9IG5ldyBBcnJheShEQVRBX1NJWkUpOworfQorCisv
KioKKyAqIEFkZCB0aGlzIHBhY2tldCB0byB0aGUgZW5kIG9mIGEgd29ya2xpc3QsIGFuZCByZXR1
cm4gdGhlIHdvcmtsaXN0LgorICogQHBhcmFtIHtQYWNrZXR9IHF1ZXVlIHRoZSB3b3JrbGlzdCB0
byBhZGQgdGhpcyBwYWNrZXQgdG8KKyAqLworUGFja2V0LnByb3RvdHlwZS5hZGRUbyA9IGZ1bmN0
aW9uIChxdWV1ZSkgeworICB0aGlzLmxpbmsgPSBudWxsOworICBpZiAocXVldWUgPT0gbnVsbCkg
cmV0dXJuIHRoaXM7CisgIHZhciBwZWVrLCBuZXh0ID0gcXVldWU7CisgIHdoaWxlICgocGVlayA9
IG5leHQubGluaykgIT0gbnVsbCkKKyAgICBuZXh0ID0gcGVlazsKKyAgbmV4dC5saW5rID0gdGhp
czsKKyAgcmV0dXJuIHF1ZXVlOworfTsKKworUGFja2V0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1
bmN0aW9uICgpIHsKKyAgcmV0dXJuICJQYWNrZXQiOworfTsKKworCitydW5SaWNoYXJkcygpOwpJ
bmRleDogUGVyZm9ybWFuY2VUZXN0cy9KZXRTdHJlYW0yL0x1YUpTRmlnaHQvc3RyaW5nX2xpc3Rz
LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFBlcmZvcm1hbmNlVGVzdHMvSmV0U3RyZWFtMi9MdWFKU0ZpZ2h0
L3N0cmluZ19saXN0cy5qcwkocmV2aXNpb24gMjQ4MzAxKQorKysgUGVyZm9ybWFuY2VUZXN0cy9K
ZXRTdHJlYW0yL0x1YUpTRmlnaHQvc3RyaW5nX2xpc3RzLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0y
LDE3ICsyLDcgQEAgdmFyIG4gPSA0MDAwMDsKIHZhciBpID0gMDsKIHZhciBpdGVtcyA9IFtdOwog
Ci1mdW5jdGlvbiBydW4oKQotewotICAgIGl0ZW1zID0gW107Ci0gICAgd2hpbGUgKGkgPCBuKSB7
Ci0gICAgICAgIGl0ZW1zLnB1c2goImRpZ2l0IiArIGkpOwotICAgICAgICBpID0gaSArIDE7Ci0g
ICAgfQotfQotCi1jbGFzcyBCZW5jaG1hcmsgewotICAgIHJ1bkl0ZXJhdGlvbigpIHsKLSAgICAg
ICAgcnVuKCk7Ci0gICAgfQord2hpbGUgKGkgPCBuKSB7CisgICAgaXRlbXMucHVzaCgiZGlnaXQi
ICsgaSk7CisgICAgaSA9IGkgKyAxOwogfQo=
</data>
<flag name="review"
          id="391438"
          type_id="1"
          status="+"
          setter="saam"
    />
          </attachment>
      

    </bug>

</bugzilla>