[Ovirt-devel] [PATCH] reload content area when something in the tree is clicked, and update the links w/in the tabs. Rough, early cut.

Jason Guiditta jguiditt at redhat.com
Tue May 27 22:35:31 UTC 2008


Signed-off-by: Jason Guiditta <jguiditt at redhat.com>
---
 wui/src/app/controllers/hardware_controller.rb     |    3 ++
 .../jquery-treeview/jquery.treeview.async.js       |   26 ++++++++++++++++++++
 2 files changed, 29 insertions(+), 0 deletions(-)

diff --git a/wui/src/app/controllers/hardware_controller.rb b/wui/src/app/controllers/hardware_controller.rb
index 0eaf76f..97e8207 100644
--- a/wui/src/app/controllers/hardware_controller.rb
+++ b/wui/src/app/controllers/hardware_controller.rb
@@ -35,6 +35,9 @@ class HardwareController < ApplicationController
       flash[:notice] = 'You do not have permission to view this hardware pool: redirecting to top level'
       redirect_to :controller => "dashboard"
     end
+    if params[:ajax]
+      render :layout => false #:template => 'hardware/show.html.erb'
+    end
   end
   
   def json_view_tree
diff --git a/wui/src/public/javascripts/jquery-treeview/jquery.treeview.async.js b/wui/src/public/javascripts/jquery-treeview/jquery.treeview.async.js
index 8161bd1..d277a32 100644
--- a/wui/src/public/javascripts/jquery-treeview/jquery.treeview.async.js
+++ b/wui/src/public/javascripts/jquery-treeview/jquery.treeview.async.js
@@ -49,6 +49,32 @@ function load(settings, params, child, container) {
                         } else {
                           current.html("<span class=\"" + settings.span_class + "\"" + span_onclick + ">" + link_open + this.text + link_close + "</span>")
                             .appendTo(parent);
+                          $('li #' + this.id + ' span > a')
+                            .bind('click', function() {            
+//                              $.ajax({
+//                                url: this.href,
+//                                type: 'GET',
+//                                data: {ajax:true},
+//                                dataType: 'html',
+//                                success: function(data) { alert(data);},
+//                                error: function(xhr) {alert(xhr.status + ' ' + xhr.statusText);}
+//                              })
+                              $('#content-area').load(this.href,{ajax:true});
+                              var new_id = $(this).parent().parent().get(0).id;
+                              $('ul[class=tab_nav] a').each(function(){
+                                this.href = this.href.slice(0,this.href.lastIndexOf('/'+1)) + new_id;
+                              });
+                              $('ul[class=tab_nav] li').each(function(){
+                                $(this).removeClass('current');
+                              });
+                              $('#nav_summary').addClass('current');
+                              //var current_e = $('span[class^=current_]');
+                              //current_e.removeClass(current_e.attr('class'));
+                              //$(this).addClass('current_folder');
+                              //var my_container = $(container);
+                              return false;
+                            });
+
                         }
 			if (this.classes) {
 				current.children("span").addClass(this.classes);
-- 
1.5.4.1


--=-FeeZJ3ybHM80BpIC4CGc
Content-Disposition: attachment; filename=0002-make-the-tree-links-ajax-calls-that-refresh-t.patch
Content-Type: application/mbox; name=0002-make-the-tree-links-ajax-calls-that-refresh-t.patch
Content-Transfer-Encoding: base64

RnJvbSA0MjEwY2JkMDdhZGFlOGY3YTYxNDBjMDhhNTdjYzNmYjA4ZThjNThlIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBKYXNvbiBHdWlkaXR0YSA8amd1aWRpdHRAcmVkaGF0LmNvbT4K
RGF0ZTogRnJpLCAzMCBNYXkgMjAwOCAxNTowMDoxOSAtMDQwMApTdWJqZWN0OiBbUEFUQ0hdICAg
ICAqICBtYWtlIHRoZSB0cmVlIGxpbmtzIGFqYXggY2FsbHMgdGhhdCByZWZyZXNoIHRoZSBtYWlu
IGNvbnRlbnQgcGFuZWwKICAgICAqIHJlZmFjdG9yIHRhYiBuYXYgdG8gYmUgaW4gYSBzZXBhcmF0
ZWx5IGNhbGxhYmxlIGxheW91dAogICAgICogdXBkYXRlIGFueXRoaW5nIG9uIHRoZSB0cmVlIHBh
bmVsIHRoYXQgbWFrZXMgdXNlIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBhbmQgY2hhbmdlIHRo
ZSBuZXcvZGVsZXRlIGxpbmtzIGFwcHJvcHJpYXRlbHkgRG9uZQogICAgICogY2hhbmdlIHRyZWUg
d2lkZ2V0IHRvIHN1cHBvcnQgc2hvd2luZyBzZWxlY3RlZCBub2RlIHcvbyBwYWdlIHJlZnJlc2gK
ICAgICAqIG1ha2UgdGhlIHRhYnMgb24gdGhlIG1haW4gcGFuZWwgaW50byBhamF4IGNhbGxzIHRo
YXQgdXBkYXRlIHRoZSBtYWluIGNvbnRlbnQgcGFuZWwgdG8gc2hvdyBhIGRpZmZlcmVudCB0YWIu
IFJldiAxIG1ha2VzIGEgbmV3IGNhbGwgd2l0aCBlYWNoIGNsaWNrCgoKU2lnbmVkLW9mZi1ieTog
SmFzb24gR3VpZGl0dGEgPGpndWlkaXR0QHJlZGhhdC5jb20+Ci0tLQogd3VpL3NyYy9hcHAvY29u
dHJvbGxlcnMvZGFzaGJvYXJkX2NvbnRyb2xsZXIucmIgICAgfCAgICA0ICstCiB3dWkvc3JjL2Fw
cC9jb250cm9sbGVycy9oYXJkd2FyZV9jb250cm9sbGVyLnJiICAgICB8ICAgIDIgKy0KIHd1aS9z
cmMvYXBwL2NvbnRyb2xsZXJzL3Jlc291cmNlc19jb250cm9sbGVyLnJiICAgIHwgICAgMyArCiB3
dWkvc3JjL2FwcC92aWV3cy9sYXlvdXRzL19zaWRlX3Rvb2xiYXIucmh0bWwgICAgICB8ICAgIDIg
Ky0KIHd1aS9zcmMvYXBwL3ZpZXdzL2xheW91dHMvcmVkdXgucmh0bWwgICAgICAgICAgICAgIHwg
ICA3NSArLQogd3VpL3NyYy9hcHAvdmlld3MvbGF5b3V0cy90YWJzLWFuZC1jb250ZW50LnJodG1s
ICAgfCAgIDExICsKIHd1aS9zcmMvcHVibGljL2phdmFzY3JpcHRzL2pxdWVyeS0xLjIuNi5qcyAg
ICAgICAgIHwgMzU0OSArKysrKysrKysrKysrKysrKysrKwogd3VpL3NyYy9wdWJsaWMvamF2YXNj
cmlwdHMvanF1ZXJ5LTEuMi42Lm1pbi5qcyAgICAgfCAgIDMyICsKIC4uLi9qcXVlcnktdHJlZXZp
ZXcvanF1ZXJ5LnRyZWV2aWV3LmFzeW5jLmpzICAgICAgIHwgICAyNCArLQogLi4uL2phdmFzY3Jp
cHRzL2pxdWVyeS10cmVldmlldy9vdmlydC50cmVldmlldy5jc3MgfCAgICA4ICstCiB3dWkvc3Jj
L3B1YmxpYy9qYXZhc2NyaXB0cy9qcXVlcnkubGl2ZXF1ZXJ5LmpzICAgICB8ICAgIDIgKy0KIHd1
aS9zcmMvcHVibGljL2phdmFzY3JpcHRzL2pxdWVyeS5saXZlcXVlcnkubWluLmpzIHwgICAxMSAr
CiAuLi4vcHVibGljL2phdmFzY3JpcHRzL2pxdWVyeS5saXZlcXVlcnkucGFjay5qcyAgICB8ICAg
IDkgKwogMTMgZmlsZXMgY2hhbmdlZCwgMzY5NyBpbnNlcnRpb25zKCspLCAzNSBkZWxldGlvbnMo
LSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCB3dWkvc3JjL2FwcC92aWV3cy9sYXlvdXRzL3RhYnMtYW5k
LWNvbnRlbnQucmh0bWwKIGNyZWF0ZSBtb2RlIDEwMDY0NCB3dWkvc3JjL3B1YmxpYy9qYXZhc2Ny
aXB0cy9qcXVlcnktMS4yLjYuanMKIGNyZWF0ZSBtb2RlIDEwMDY0NCB3dWkvc3JjL3B1YmxpYy9q
YXZhc2NyaXB0cy9qcXVlcnktMS4yLjYubWluLmpzCiBjcmVhdGUgbW9kZSAxMDA2NDQgd3VpL3Ny
Yy9wdWJsaWMvamF2YXNjcmlwdHMvanF1ZXJ5LmxpdmVxdWVyeS5taW4uanMKIGNyZWF0ZSBtb2Rl
IDEwMDY0NCB3dWkvc3JjL3B1YmxpYy9qYXZhc2NyaXB0cy9qcXVlcnkubGl2ZXF1ZXJ5LnBhY2su
anMKCmRpZmYgLS1naXQgYS93dWkvc3JjL2FwcC9jb250cm9sbGVycy9kYXNoYm9hcmRfY29udHJv
bGxlci5yYiBiL3d1aS9zcmMvYXBwL2NvbnRyb2xsZXJzL2Rhc2hib2FyZF9jb250cm9sbGVyLnJi
CmluZGV4IDNmZmFlYmMuLmM0ODMwZGYgMTAwNjQ0Ci0tLSBhL3d1aS9zcmMvYXBwL2NvbnRyb2xs
ZXJzL2Rhc2hib2FyZF9jb250cm9sbGVyLnJiCisrKyBiL3d1aS9zcmMvYXBwL2NvbnRyb2xsZXJz
L2Rhc2hib2FyZF9jb250cm9sbGVyLnJiCkBAIC0xOCw3ICsxOCw2IEBACiAjIGFsc28gYXZhaWxh
YmxlIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9jb3B5bGVmdC9ncGwuaHRtbC4KIAogY2xhc3MgRGFz
aGJvYXJkQ29udHJvbGxlciA8IEFwcGxpY2F0aW9uQ29udHJvbGxlcgotCiAgIGRlZiBpbmRleAog
ICAgIEBkZWZhdWx0X3Bvb2wgPSBIYXJkd2FyZVBvb2wuZ2V0X2RlZmF1bHRfcG9vbAogICAgIHNl
dF9wZXJtcyhAZGVmYXVsdF9wb29sKQpAQCAtMzAsNSArMjksOCBAQCBjbGFzcyBEYXNoYm9hcmRD
b250cm9sbGVyIDwgQXBwbGljYXRpb25Db250cm9sbGVyCiAgICAgQGhvc3RzID0gSG9zdC5maW5k
KDphbGwpCiAgICAgQHN0b3JhZ2Vfdm9sdW1lcyA9IFN0b3JhZ2VWb2x1bWUuZmluZCg6YWxsKQog
ICAgIEB2bXMgPSBWbS5maW5kKDphbGwpCisgICAgaWYgcGFyYW1zWzphamF4XQorICAgICAgcmVu
ZGVyIDpsYXlvdXQgPT4gJ3RhYnMtYW5kLWNvbnRlbnQnICM6dGVtcGxhdGUgPT4gJ2hhcmR3YXJl
L3Nob3cuaHRtbC5lcmInCisgICAgZW5kCiAgIGVuZAogZW5kCmRpZmYgLS1naXQgYS93dWkvc3Jj
L2FwcC9jb250cm9sbGVycy9oYXJkd2FyZV9jb250cm9sbGVyLnJiIGIvd3VpL3NyYy9hcHAvY29u
dHJvbGxlcnMvaGFyZHdhcmVfY29udHJvbGxlci5yYgppbmRleCA5N2U4MjA3Li5iODZkOTI5IDEw
MDY0NAotLS0gYS93dWkvc3JjL2FwcC9jb250cm9sbGVycy9oYXJkd2FyZV9jb250cm9sbGVyLnJi
CisrKyBiL3d1aS9zcmMvYXBwL2NvbnRyb2xsZXJzL2hhcmR3YXJlX2NvbnRyb2xsZXIucmIKQEAg
LTM2LDcgKzM2LDcgQEAgY2xhc3MgSGFyZHdhcmVDb250cm9sbGVyIDwgQXBwbGljYXRpb25Db250
cm9sbGVyCiAgICAgICByZWRpcmVjdF90byA6Y29udHJvbGxlciA9PiAiZGFzaGJvYXJkIgogICAg
IGVuZAogICAgIGlmIHBhcmFtc1s6YWpheF0KLSAgICAgIHJlbmRlciA6bGF5b3V0ID0+IGZhbHNl
ICM6dGVtcGxhdGUgPT4gJ2hhcmR3YXJlL3Nob3cuaHRtbC5lcmInCisgICAgICByZW5kZXIgOmxh
eW91dCA9PiAndGFicy1hbmQtY29udGVudCcKICAgICBlbmQKICAgZW5kCiAgIApkaWZmIC0tZ2l0
IGEvd3VpL3NyYy9hcHAvY29udHJvbGxlcnMvcmVzb3VyY2VzX2NvbnRyb2xsZXIucmIgYi93dWkv
c3JjL2FwcC9jb250cm9sbGVycy9yZXNvdXJjZXNfY29udHJvbGxlci5yYgppbmRleCBjODkxNDQ3
Li5lOWEwY2JhIDEwMDY0NAotLS0gYS93dWkvc3JjL2FwcC9jb250cm9sbGVycy9yZXNvdXJjZXNf
Y29udHJvbGxlci5yYgorKysgYi93dWkvc3JjL2FwcC9jb250cm9sbGVycy9yZXNvdXJjZXNfY29u
dHJvbGxlci5yYgpAQCAtNTQsNiArNTQsOSBAQCBjbGFzcyBSZXNvdXJjZXNDb250cm9sbGVyIDwg
QXBwbGljYXRpb25Db250cm9sbGVyCiAgICAgICBmbGFzaFs6bm90aWNlXSA9ICdZb3UgZG8gbm90
IGhhdmUgcGVybWlzc2lvbiB0byB2aWV3IHRoaXMgVk0gUmVzb3VyY2UgUG9vbDogcmVkaXJlY3Rp
bmcgdG8gdG9wIGxldmVsJwogICAgICAgcmVkaXJlY3RfdG8gOmFjdGlvbiA9PiAnbGlzdCcKICAg
ICBlbmQKKyAgICBpZiBwYXJhbXNbOmFqYXhdCisgICAgICByZW5kZXIgOmxheW91dCA9PiAndGFi
cy1hbmQtY29udGVudCcgIzp0ZW1wbGF0ZSA9PiAnaGFyZHdhcmUvc2hvdy5odG1sLmVyYicKKyAg
ICBlbmQKICAgZW5kCiAKICAgZGVmIHF1aWNrX3N1bW1hcnkKZGlmZiAtLWdpdCBhL3d1aS9zcmMv
YXBwL3ZpZXdzL2xheW91dHMvX3NpZGVfdG9vbGJhci5yaHRtbCBiL3d1aS9zcmMvYXBwL3ZpZXdz
L2xheW91dHMvX3NpZGVfdG9vbGJhci5yaHRtbAppbmRleCA4NzhjODI3Li5kOTFlNGFiIDEwMDY0
NAotLS0gYS93dWkvc3JjL2FwcC92aWV3cy9sYXlvdXRzL19zaWRlX3Rvb2xiYXIucmh0bWwKKysr
IGIvd3VpL3NyYy9hcHAvdmlld3MvbGF5b3V0cy9fc2lkZV90b29sYmFyLnJodG1sCkBAIC0xMyw3
ICsxMyw3IEBACiA8L2Rpdj4KIDwlIGVuZCAtJT4KIDxkaXYgY2xhc3M9InRvb2xiYXIiIHN0eWxl
PSJmbG9hdDpsZWZ0OyI+Ci0gICA8JT0gbGlua190byBpbWFnZV90YWcgKCJpY29uX2RlbGV0ZS5n
aWYiLCA6dGl0bGU9PiJEZWxldGUgU2VsZWN0ZWQgUG9vbCIpLCAKKyAgIDwlPSBsaW5rX3RvIGlt
YWdlX3RhZygiaWNvbl9kZWxldGUuZ2lmIiwgOnRpdGxlPT4iRGVsZXRlIFNlbGVjdGVkIFBvb2wi
KSwgCiAgICAgICAgeyA6YWN0aW9uID0+ICdkZXN0cm95JywgOmlkID0+IHBvb2wgfSwgCiAgICAg
ICAgeyA6bWV0aG9kID0+IDpwb3N0LCA6Y29uZmlybSA9PiAnQXJlIHlvdSBzdXJlIHlvdSB3YW50
IHRvIGRlbGV0ZSAtICVzPycgJSBwb29sLm5hbWV9ICU+CiA8L2Rpdj4KZGlmZiAtLWdpdCBhL3d1
aS9zcmMvYXBwL3ZpZXdzL2xheW91dHMvcmVkdXgucmh0bWwgYi93dWkvc3JjL2FwcC92aWV3cy9s
YXlvdXRzL3JlZHV4LnJodG1sCmluZGV4IGE0MGNiMWYuLjliOTA2ZjAgMTAwNjQ0Ci0tLSBhL3d1
aS9zcmMvYXBwL3ZpZXdzL2xheW91dHMvcmVkdXgucmh0bWwKKysrIGIvd3VpL3NyYy9hcHAvdmll
d3MvbGF5b3V0cy9yZWR1eC5yaHRtbApAQCAtMTUsNyArMTUsOCBAQAogICA8JT0gc3R5bGVzaGVl
dF9saW5rX3RhZyAnL2phdmFzY3JpcHRzL2pxdWVyeS10cmVldmlldy9vdmlydC50cmVldmlldy5j
c3MnICU+CiAgIDwlPSBzdHlsZXNoZWV0X2xpbmtfdGFnICdmbGV4aWdyaWQvZmxleGlncmlkLmNz
cycgJT4KICAgPCU9IHN0eWxlc2hlZXRfbGlua190YWcgJ2ZhY2Vib3gnICU+Ci0gIDwlPSBqYXZh
c2NyaXB0X2luY2x1ZGVfdGFnICJqcXVlcnkucGFjay5qcyIgLSU+CisgIDwhLS0lPSBzdHlsZXNo
ZWV0X2xpbmtfdGFnICdqcXVlcnkudWktMS41YjQvdGhlbWVzL2Zsb3JhL2Zsb3JhLnRhYnMuY3Nz
JyAlLS0+CisgIDwlPSBqYXZhc2NyaXB0X2luY2x1ZGVfdGFnICJqcXVlcnktMS4yLjYubWluLmpz
IiAtJT4KICAgPCU9IGphdmFzY3JpcHRfaW5jbHVkZV90YWcgImpxdWVyeS10cmVldmlldy9qcXVl
cnkudHJlZXZpZXcuanMiIC0lPgogICA8JT0gamF2YXNjcmlwdF9pbmNsdWRlX3RhZyAianF1ZXJ5
LXRyZWV2aWV3L2pxdWVyeS50cmVldmlldy5hc3luYy5qcyIgLSU+CiAgIDwlPSBqYXZhc2NyaXB0
X2luY2x1ZGVfdGFnICJmbGV4aWdyaWQuanMiIC0lPgpAQCAtMjMsMTIgKzI0LDEzIEBACiAgIDwl
PSBqYXZhc2NyaXB0X2luY2x1ZGVfdGFnICJqcXVlcnktc3ZnL2pxdWVyeS5zdmcucGFjay5qcyIg
LSU+CiAgIDwhLS0lPSBqYXZhc2NyaXB0X2luY2x1ZGVfdGFnICJqcXVlcnktc3ZnL2pxdWVyeS5z
dmdmaWx0ZXIuanMiIC0lLS0+CiAgIDwlPSBqYXZhc2NyaXB0X2luY2x1ZGVfdGFnICJqcXVlcnkt
c3ZnL2pxdWVyeS5zdmdncmFwaC5qcyIgLSU+Ci0gIDwlPSBqYXZhc2NyaXB0X2luY2x1ZGVfdGFn
ICJ1aS5jb3JlLmpzIiAtJT4KLSAgPCU9IGphdmFzY3JpcHRfaW5jbHVkZV90YWcgInVpLnNsaWRl
ci5qcyIgLSU+CisgIDwhLS0lPSBqYXZhc2NyaXB0X2luY2x1ZGVfdGFnICJqcXVlcnkudWktMS41
YjQvdWkuY29yZS5qcyIgLSU+CisgIDwgJT0gamF2YXNjcmlwdF9pbmNsdWRlX3RhZyAianF1ZXJ5
LnVpLTEuNWI0L3VpLnRhYnMuanMiIC0lLS0+CiAgIDwlPSBqYXZhc2NyaXB0X2luY2x1ZGVfdGFn
ICJqcXVlcnkuY29va2llLmpzIiAtJT4KKyAgPCU9IGphdmFzY3JpcHRfaW5jbHVkZV90YWcgImpx
dWVyeS5saXZlcXVlcnkucGFjay5qcyIgLSU+CiAgIDwlPSBqYXZhc2NyaXB0X2luY2x1ZGVfdGFn
ICJqcXVlcnkuZm9ybS5qcyIgLSU+CiAKLSAgPCEtLSBvdmlydC1zcGVjaWZpYyBmdW5jdGlvbnMg
ZGVmaW5lZCBoZXJlCisgIDwhLS0gb3ZpcnQtc3BlY2lmaWMgZnVuY3Rpb25zIGRlZmluZWQgaGVy
ZSAtLT4KICAgPCU9IGphdmFzY3JpcHRfaW5jbHVkZV90YWcgIm92aXJ0LmpzIiAtJT4KICAgICA8
c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAgICAkKGRvY3VtZW50KS5yZWFkeShm
dW5jdGlvbigpeyAgICAgICAgIApAQCAtNDEsMTAgKzQzLDUzIEBACiAgICAgICAgICAgICByZXNv
dXJjZV91cmw6ICI8JT0gIHVybF9mb3IgOmNvbnRyb2xsZXIgPT4nL3Jlc291cmNlcycsIDphY3Rp
b24gPT4gJ3Nob3cnICU+IiwKICAgICAgICAgICAgIGFjdGlvbl90eXBlOiAiaHlwZXJsaW5rIgog
CSAgICB9KQotCX0pOyAKLSAgICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCl7ICAgICAg
ICAgCisgICAgICAgICAgICAkKCdhW3JlbCo9ZmFjZWJveF0nKS5saXZlcXVlcnkoZnVuY3Rpb24o
KXskKHRoaXMpLmZhY2Vib3goKTt9LGZ1bmN0aW9uKCl7fSk7CisgICAgICAgICAgICAkKCdhW3Jl
bCo9Y2xvc2VdJykudHJpZ2dlcignY2xvc2UuZmFjZWJveCcpOworICAgICAgICAgICAgJCgnI3Np
ZGUgYScpLmxpdmVxdWVyeShmdW5jdGlvbigpeworICAgICAgICAgICAgICAgICQodGhpcykuYmlu
ZCgnY2xpY2snLCBmdW5jdGlvbigpeyAKKyAgICAgICAgICAgICAgICAgICAgJCgnI3NpZGUgc3Bh
bicpLmVhY2goZnVuY3Rpb24oKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhciBub2RlVHlw
ZSA9ICQodGhpcykuYXR0cignY2xhc3MnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChu
b2RlVHlwZS5pbmRleE9mKCdfJykgIT0gLTEpeworICAgICAgICAgICAgICAgICAgICAgICAgICAg
IG5vZGVUeXBlID0gbm9kZVR5cGUuc3Vic3RyKG5vZGVUeXBlLmluZGV4T2YoJ18nKSArMSk7Cisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCdjbGFzcycsIG5vZGVUeXBl
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAKKyAg
ICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIHZhciBub2RlVHlwZSA9
ICQodGhpcykucGFyZW50KCkuYXR0cignY2xhc3MnKTsKKyAgICAgICAgICAgICAgICAgICAgJCh0
aGlzKS5wYXJlbnQoKS5hdHRyKCdjbGFzcycsICdjdXJyZW50XycgKyBub2RlVHlwZSk7CisgICAg
ICAgICAgICAgICAgICAgICQuYWpheCh7CisgICAgICAgICAgICAgICAgICAgICAgICB1cmw6ICQo
dGhpcykuYXR0cignaHJlZicpLAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0dFVCcs
CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiB7YWpheDp0cnVlfSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGRhdGFUeXBlOiAnaHRtbCcsCisgICAgICAgICAgICAgICAgICAgICAgICBz
dWNjZXNzOiBmdW5jdGlvbihkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNz
aWRlLXRvb2xiYXInKS5odG1sKCQoZGF0YSkuZmluZCgnZGl2LnRvb2xiYXInKSk7CisgICAgICAg
ICAgICAgICAgICAgICAgICAgICQoJyN0YWJzLWFuZC1jb250ZW50LWNvbnRhaW5lcicpLmh0bWwo
JChkYXRhKS5ub3QoJ2RpdiNzaWRlLXRvb2xiYXInKSk7CisgICAgICAgICAgICAgICAgICAgICAg
ICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKHhocikge2FsZXJ0
KHhoci5zdGF0dXMgKyAnICcgKyB4aHIuc3RhdHVzVGV4dCk7fQorICAgICAgICAgICAgICAgICAg
ICB9KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO30pfSxmdW5jdGlvbigpe30p
OworICAgICAgICAgICAgJCgnLnRhYl9uYXYgYScpLmxpdmVxdWVyeShmdW5jdGlvbigpeworICAg
ICAgICAgICAgICAgICQodGhpcykuYmluZCgnY2xpY2snLCBmdW5jdGlvbigpeworICAgICAgICAg
ICAgICAgICAgICAkKCcudGFiX25hdiBsaScpLnJlbW92ZUNsYXNzKCdjdXJyZW50Jyk7CisgICAg
ICAgICAgICAgICAgICAgICQodGhpcykucGFyZW50KCkuYWRkQ2xhc3MoJ2N1cnJlbnQnKTsKKyAg
ICAgICAgICAgICAgICAgICAgJC5hamF4KHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVybDog
JCh0aGlzKS5hdHRyKCdocmVmJyksCisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnR0VU
JywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHthamF4OnRydWV9LAorICAgICAgICAg
ICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdodG1sJywKKyAgICAgICAgICAgICAgICAgICAgICAg
IHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHsgCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZh
ciB3cmFwcGVkX2RhdGEgPSAkKGRhdGEpLmZpbmQoJ2RpdicpLmZpbHRlcignW2lkPWNvbnRlbnQt
YXJlYV0nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG15X3BhcmVudCA9ICQodGhp
cykucGFyZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyNjb250ZW50LWFyZWEn
KS5odG1sKCQoZGF0YSkuZmluZCgnZGl2JykuZmlsdGVyKCdbaWQ9Y29udGVudC1hcmVhXScpKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBlcnJv
cjogZnVuY3Rpb24oeGhyKSB7YWxlcnQoeGhyLnN0YXR1cyArICcgJyArIHhoci5zdGF0dXNUZXh0
KTt9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7fSl9LGZ1bmN0aW9uKCl7fSk7CisgICAgICAgICAgICAKKwl9KTsKKyAgICAgIC8qJChk
b2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKXsgICAgICAgICAKICAgICAgICAgcmVmcmVzaF9mYWNl
Ym94KCkKLSAgICAgIH0pCisgICAgICB9KSovCiAgICAgICA8L3NjcmlwdD4KICAgIDwlPSB5aWVs
ZCA6c2NyaXB0cyAtJT4KICA8L2hlYWQ+CkBAIC02MywxMyArMTA4LDE1IEBACiAgICAgIDwlPSBy
ZW5kZXIgOnBhcnRpYWwgPT4gJy9sYXlvdXRzL3NpZGVfdG9vbGJhcicgJT4KICAgIDwvZGl2Pgog
Ci0gICA8ZGl2IGlkPSJuYXZpZ2F0aW9uLXRhYnMiIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsg
dG9wOjQwcHg7IGxlZnQ6MjMxcHg7Ij4KLSAgICAgPCU9IHJlbmRlciA6cGFydGlhbCA9PiAnL2xh
eW91dHMvbmF2aWdhdGlvbl90YWJzJyAlPgotICAgPC9kaXY+IAotICAgPGRpdiBpZD0ibWFpbiI+
Ci0gICAgICA8ZGl2IGlkPSJjb250ZW50LWFyZWEiPgotICAgICAgICA8JT0geWllbGQgICU+IDwl
IyB0aGUgcmVzdCBvZiB0aGUgY2VudGVyIGFuZCByaWdodCBoYW5kIHNpZGUgJT4KLSAgICAgIDwv
ZGl2PgorICAgPGRpdiBpZD0idGFicy1hbmQtY29udGVudC1jb250YWluZXIiPgorICAgICA8ZGl2
IGlkPSJuYXZpZ2F0aW9uLXRhYnMiIHN0eWxlPSJwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOjQwcHg7
IGxlZnQ6MjMxcHg7Ij4KKyAgICAgICA8JT0gcmVuZGVyIDpwYXJ0aWFsID0+ICcvbGF5b3V0cy9u
YXZpZ2F0aW9uX3RhYnMnICU+CisgICAgIDwvZGl2PiAKKyAgICAgPGRpdiBpZD0ibWFpbiI+Cisg
ICAgICAgIDxkaXYgaWQ9ImNvbnRlbnQtYXJlYSI+CisgICAgICAgICAgPCU9IHlpZWxkICAlPiA8
JSMgdGhlIHJlc3Qgb2YgdGhlIGNlbnRlciBhbmQgcmlnaHQgaGFuZCBzaWRlICU+CisgICAgICAg
IDwvZGl2PgorICAgICA8L2Rpdj4KICAgIDwvZGl2PgogCiAgPC9ib2R5PgpkaWZmIC0tZ2l0IGEv
d3VpL3NyYy9hcHAvdmlld3MvbGF5b3V0cy90YWJzLWFuZC1jb250ZW50LnJodG1sIGIvd3VpL3Ny
Yy9hcHAvdmlld3MvbGF5b3V0cy90YWJzLWFuZC1jb250ZW50LnJodG1sCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2OWM2NTMKLS0tIC9kZXYvbnVsbAorKysgYi93dWkvc3Jj
L2FwcC92aWV3cy9sYXlvdXRzL3RhYnMtYW5kLWNvbnRlbnQucmh0bWwKQEAgLTAsMCArMSwxMSBA
QAorPGRpdiBpZD0ic2lkZS10b29sYmFyIiBjbGFzcz0iaGVhZGVyX21lbnVfd3JhcHBlciI+Cisg
IDwlPSByZW5kZXIgOnBhcnRpYWwgPT4gJy9sYXlvdXRzL3NpZGVfdG9vbGJhcicgJT4KKzwvZGl2
PgorPGRpdiBpZD0ibmF2aWdhdGlvbi10YWJzIiBzdHlsZT0icG9zaXRpb246YWJzb2x1dGU7IHRv
cDo0MHB4OyBsZWZ0OjIzMXB4OyI+CisgPCU9IHJlbmRlciA6cGFydGlhbCA9PiAnL2xheW91dHMv
bmF2aWdhdGlvbl90YWJzJyAlPgorPC9kaXY+IAorPGRpdiBpZD0ibWFpbiI+CisgIDxkaXYgaWQ9
ImNvbnRlbnQtYXJlYSI+CisgICAgPCU9IHlpZWxkICAlPiA8JSMgdGhlIHJlc3Qgb2YgdGhlIGNl
bnRlciBhbmQgcmlnaHQgaGFuZCBzaWRlICU+CisgIDwvZGl2PgorPC9kaXY+ClwgTm8gbmV3bGlu
ZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvd3VpL3NyYy9wdWJsaWMvamF2YXNjcmlwdHMv
anF1ZXJ5LTEuMi42LmpzIGIvd3VpL3NyYy9wdWJsaWMvamF2YXNjcmlwdHMvanF1ZXJ5LTEuMi42
LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZTY2MWUKLS0tIC9kZXYv
bnVsbAorKysgYi93dWkvc3JjL3B1YmxpYy9qYXZhc2NyaXB0cy9qcXVlcnktMS4yLjYuanMKQEAg
LTAsMCArMSwzNTQ5IEBACisoZnVuY3Rpb24oKXsKKy8qCisgKiBqUXVlcnkgMS4yLjYgLSBOZXcg
V2F2ZSBKYXZhc2NyaXB0CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IEpvaG4gUmVzaWcgKGpx
dWVyeS5jb20pCisgKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgKE1JVC1MSUNFTlNFLnR4
dCkKKyAqIGFuZCBHUEwgKEdQTC1MSUNFTlNFLnR4dCkgbGljZW5zZXMuCisgKgorICogJERhdGU6
IDIwMDgtMDUtMjQgMTQ6MjI6MTcgLTA0MDAgKFNhdCwgMjQgTWF5IDIwMDgpICQKKyAqICRSZXY6
IDU2ODUgJAorICovCisKKy8vIE1hcCBvdmVyIGpRdWVyeSBpbiBjYXNlIG9mIG92ZXJ3cml0ZQor
dmFyIF9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LAorLy8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBv
ZiBvdmVyd3JpdGUKKwlfJCA9IHdpbmRvdy4kOworCit2YXIgalF1ZXJ5ID0gd2luZG93LmpRdWVy
eSA9IHdpbmRvdy4kID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0ICkgeworCS8vIFRoZSBq
UXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFu
Y2VkJworCXJldHVybiBuZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7Cit9
OworCisvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5ncyBvciBJRCBzdHJp
bmdzCisvLyAoYm90aCBvZiB3aGljaCB3ZSBvcHRpbWl6ZSBmb3IpCit2YXIgcXVpY2tFeHByID0g
L15bXjxdKig8KC58XHMpKz4pW14+XSokfF4jKFx3KykkLywKKworLy8gSXMgaXQgYSBzaW1wbGUg
c2VsZWN0b3IKKwlpc1NpbXBsZSA9IC9eLlteOiNcW1wuXSokLywKKworLy8gV2lsbCBzcGVlZCB1
cCByZWZlcmVuY2VzIHRvIHVuZGVmaW5lZCwgYW5kIGFsbG93cyBtdW5naW5nIGl0cyBuYW1lLgor
CXVuZGVmaW5lZDsKKworalF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHsKKwlpbml0OiBm
dW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7CisJCS8vIE1ha2Ugc3VyZSB0aGF0IGEgc2Vs
ZWN0aW9uIHdhcyBwcm92aWRlZAorCQlzZWxlY3RvciA9IHNlbGVjdG9yIHx8IGRvY3VtZW50Owor
CisJCS8vIEhhbmRsZSAkKERPTUVsZW1lbnQpCisJCWlmICggc2VsZWN0b3Iubm9kZVR5cGUgKSB7
CisJCQl0aGlzWzBdID0gc2VsZWN0b3I7CisJCQl0aGlzLmxlbmd0aCA9IDE7CisJCQlyZXR1cm4g
dGhpczsKKwkJfQorCQkvLyBIYW5kbGUgSFRNTCBzdHJpbmdzCisJCWlmICggdHlwZW9mIHNlbGVj
dG9yID09ICJzdHJpbmciICkgeworCQkJLy8gQXJlIHdlIGRlYWxpbmcgd2l0aCBIVE1MIHN0cmlu
ZyBvciBhbiBJRD8KKwkJCXZhciBtYXRjaCA9IHF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApOwor
CisJCQkvLyBWZXJpZnkgYSBtYXRjaCwgYW5kIHRoYXQgbm8gY29udGV4dCB3YXMgc3BlY2lmaWVk
IGZvciAjaWQKKwkJCWlmICggbWF0Y2ggJiYgKG1hdGNoWzFdIHx8ICFjb250ZXh0KSApIHsKKwor
CQkJCS8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KQorCQkJCWlmICggbWF0Y2hbMV0gKQor
CQkJCQlzZWxlY3RvciA9IGpRdWVyeS5jbGVhbiggWyBtYXRjaFsxXSBdLCBjb250ZXh0ICk7CisK
KwkJCQkvLyBIQU5ETEU6ICQoIiNpZCIpCisJCQkJZWxzZSB7CisJCQkJCXZhciBlbGVtID0gZG9j
dW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWzNdICk7CisKKwkJCQkJLy8gTWFrZSBzdXJlIGFu
IGVsZW1lbnQgd2FzIGxvY2F0ZWQKKwkJCQkJaWYgKCBlbGVtICl7CisJCQkJCQkvLyBIYW5kbGUg
dGhlIGNhc2Ugd2hlcmUgSUUgYW5kIE9wZXJhIHJldHVybiBpdGVtcworCQkJCQkJLy8gYnkgbmFt
ZSBpbnN0ZWFkIG9mIElECisJCQkJCQlpZiAoIGVsZW0uaWQgIT0gbWF0Y2hbM10gKQorCQkJCQkJ
CXJldHVybiBqUXVlcnkoKS5maW5kKCBzZWxlY3RvciApOworCisJCQkJCQkvLyBPdGhlcndpc2Us
IHdlIGluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0CisJ
CQkJCQlyZXR1cm4galF1ZXJ5KCBlbGVtICk7CisJCQkJCX0KKwkJCQkJc2VsZWN0b3IgPSBbXTsK
KwkJCQl9CisKKwkJCS8vIEhBTkRMRTogJChleHByLCBbY29udGV4dF0pCisJCQkvLyAod2hpY2gg
aXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRlbnQpLmZpbmQoZXhwcikKKwkJCX0gZWxzZQor
CQkJCXJldHVybiBqUXVlcnkoIGNvbnRleHQgKS5maW5kKCBzZWxlY3RvciApOworCisJCS8vIEhB
TkRMRTogJChmdW5jdGlvbikKKwkJLy8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5CisJCX0g
ZWxzZSBpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBzZWxlY3RvciApICkKKwkJCXJldHVybiBqUXVl
cnkoIGRvY3VtZW50IClbIGpRdWVyeS5mbi5yZWFkeSA/ICJyZWFkeSIgOiAibG9hZCIgXSggc2Vs
ZWN0b3IgKTsKKworCQlyZXR1cm4gdGhpcy5zZXRBcnJheShqUXVlcnkubWFrZUFycmF5KHNlbGVj
dG9yKSk7CisJfSwKKworCS8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVz
ZWQKKwlqcXVlcnk6ICIxLjIuNiIsCisKKwkvLyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnRh
aW5lZCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldAorCXNpemU6IGZ1bmN0aW9uKCkgeworCQly
ZXR1cm4gdGhpcy5sZW5ndGg7CisJfSwKKworCS8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgY29u
dGFpbmVkIGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0CisJbGVuZ3RoOiAwLAorCisJLy8gR2V0
IHRoZSBOdGggZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBlbGVtZW50IHNldCBPUgorCS8vIEdldCB0
aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5CisJZ2V0OiBmdW5j
dGlvbiggbnVtICkgeworCQlyZXR1cm4gbnVtID09IHVuZGVmaW5lZCA/CisKKwkJCS8vIFJldHVy
biBhICdjbGVhbicgYXJyYXkKKwkJCWpRdWVyeS5tYWtlQXJyYXkoIHRoaXMgKSA6CisKKwkJCS8v
IFJldHVybiBqdXN0IHRoZSBvYmplY3QKKwkJCXRoaXNbIG51bSBdOworCX0sCisKKwkvLyBUYWtl
IGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrCisJLy8gKHJl
dHVybmluZyB0aGUgbmV3IG1hdGNoZWQgZWxlbWVudCBzZXQpCisJcHVzaFN0YWNrOiBmdW5jdGlv
biggZWxlbXMgKSB7CisJCS8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0
CisJCXZhciByZXQgPSBqUXVlcnkoIGVsZW1zICk7CisKKwkJLy8gQWRkIHRoZSBvbGQgb2JqZWN0
IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSkKKwkJcmV0LnByZXZPYmplY3QgPSB0aGlz
OworCisJCS8vIFJldHVybiB0aGUgbmV3bHktZm9ybWVkIGVsZW1lbnQgc2V0CisJCXJldHVybiBy
ZXQ7CisJfSwKKworCS8vIEZvcmNlIHRoZSBjdXJyZW50IG1hdGNoZWQgc2V0IG9mIGVsZW1lbnRz
IHRvIGJlY29tZQorCS8vIHRoZSBzcGVjaWZpZWQgYXJyYXkgb2YgZWxlbWVudHMgKGRlc3Ryb3lp
bmcgdGhlIHN0YWNrIGluIHRoZSBwcm9jZXNzKQorCS8vIFlvdSBzaG91bGQgdXNlIHB1c2hTdGFj
aygpIGluIG9yZGVyIHRvIGRvIHRoaXMsIGJ1dCBtYWludGFpbiB0aGUgc3RhY2sKKwlzZXRBcnJh
eTogZnVuY3Rpb24oIGVsZW1zICkgeworCQkvLyBSZXNldHRpbmcgdGhlIGxlbmd0aCB0byAwLCB0
aGVuIHVzaW5nIHRoZSBuYXRpdmUgQXJyYXkgcHVzaAorCQkvLyBpcyBhIHN1cGVyLWZhc3Qgd2F5
IHRvIHBvcHVsYXRlIGFuIG9iamVjdCB3aXRoIGFycmF5LWxpa2UgcHJvcGVydGllcworCQl0aGlz
Lmxlbmd0aCA9IDA7CisJCUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KCB0aGlzLCBlbGVtcyAp
OworCisJCXJldHVybiB0aGlzOworCX0sCisKKwkvLyBFeGVjdXRlIGEgY2FsbGJhY2sgZm9yIGV2
ZXJ5IGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgc2V0LgorCS8vIChZb3UgY2FuIHNlZWQgdGhlIGFy
Z3VtZW50cyB3aXRoIGFuIGFycmF5IG9mIGFyZ3MsIGJ1dCB0aGlzIGlzCisJLy8gb25seSB1c2Vk
IGludGVybmFsbHkuKQorCWVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjaywgYXJncyApIHsKKwkJcmV0
dXJuIGpRdWVyeS5lYWNoKCB0aGlzLCBjYWxsYmFjaywgYXJncyApOworCX0sCisKKwkvLyBEZXRl
cm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluCisJLy8gdGhlIG1hdGNoZWQg
c2V0IG9mIGVsZW1lbnRzCisJaW5kZXg6IGZ1bmN0aW9uKCBlbGVtICkgeworCQl2YXIgcmV0ID0g
LTE7CisKKwkJLy8gTG9jYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZGVzaXJlZCBlbGVtZW50CisJ
CXJldHVybiBqUXVlcnkuaW5BcnJheSgKKwkJCS8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9i
amVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZAorCQkJZWxlbSAmJiBlbGVtLmpxdWVyeSA/
IGVsZW1bMF0gOiBlbGVtCisJCSwgdGhpcyApOworCX0sCisKKwlhdHRyOiBmdW5jdGlvbiggbmFt
ZSwgdmFsdWUsIHR5cGUgKSB7CisJCXZhciBvcHRpb25zID0gbmFtZTsKKworCQkvLyBMb29rIGZv
ciB0aGUgY2FzZSB3aGVyZSB3ZSdyZSBhY2Nlc3NpbmcgYSBzdHlsZSB2YWx1ZQorCQlpZiAoIG5h
bWUuY29uc3RydWN0b3IgPT0gU3RyaW5nICkKKwkJCWlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAp
CisJCQkJcmV0dXJuIHRoaXNbMF0gJiYgalF1ZXJ5WyB0eXBlIHx8ICJhdHRyIiBdKCB0aGlzWzBd
LCBuYW1lICk7CisKKwkJCWVsc2UgeworCQkJCW9wdGlvbnMgPSB7fTsKKwkJCQlvcHRpb25zWyBu
YW1lIF0gPSB2YWx1ZTsKKwkJCX0KKworCQkvLyBDaGVjayB0byBzZWUgaWYgd2UncmUgc2V0dGlu
ZyBzdHlsZSB2YWx1ZXMKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihpKXsKKwkJCS8vIFNl
dCBhbGwgdGhlIHN0eWxlcworCQkJZm9yICggbmFtZSBpbiBvcHRpb25zICkKKwkJCQlqUXVlcnku
YXR0cigKKwkJCQkJdHlwZSA/CisJCQkJCQl0aGlzLnN0eWxlIDoKKwkJCQkJCXRoaXMsCisJCQkJ
CW5hbWUsIGpRdWVyeS5wcm9wKCB0aGlzLCBvcHRpb25zWyBuYW1lIF0sIHR5cGUsIGksIG5hbWUg
KQorCQkJCSk7CisJCX0pOworCX0sCisKKwljc3M6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkgewor
CQkvLyBpZ25vcmUgbmVnYXRpdmUgd2lkdGggYW5kIGhlaWdodCB2YWx1ZXMKKwkJaWYgKCAoa2V5
ID09ICd3aWR0aCcgfHwga2V5ID09ICdoZWlnaHQnKSAmJiBwYXJzZUZsb2F0KHZhbHVlKSA8IDAg
KQorCQkJdmFsdWUgPSB1bmRlZmluZWQ7CisJCXJldHVybiB0aGlzLmF0dHIoIGtleSwgdmFsdWUs
ICJjdXJDU1MiICk7CisJfSwKKworCXRleHQ6IGZ1bmN0aW9uKCB0ZXh0ICkgeworCQlpZiAoIHR5
cGVvZiB0ZXh0ICE9ICJvYmplY3QiICYmIHRleHQgIT0gbnVsbCApCisJCQlyZXR1cm4gdGhpcy5l
bXB0eSgpLmFwcGVuZCggKHRoaXNbMF0gJiYgdGhpc1swXS5vd25lckRvY3VtZW50IHx8IGRvY3Vt
ZW50KS5jcmVhdGVUZXh0Tm9kZSggdGV4dCApICk7CisKKwkJdmFyIHJldCA9ICIiOworCisJCWpR
dWVyeS5lYWNoKCB0ZXh0IHx8IHRoaXMsIGZ1bmN0aW9uKCl7CisJCQlqUXVlcnkuZWFjaCggdGhp
cy5jaGlsZE5vZGVzLCBmdW5jdGlvbigpeworCQkJCWlmICggdGhpcy5ub2RlVHlwZSAhPSA4ICkK
KwkJCQkJcmV0ICs9IHRoaXMubm9kZVR5cGUgIT0gMSA/CisJCQkJCQl0aGlzLm5vZGVWYWx1ZSA6
CisJCQkJCQlqUXVlcnkuZm4udGV4dCggWyB0aGlzIF0gKTsKKwkJCX0pOworCQl9KTsKKworCQly
ZXR1cm4gcmV0OworCX0sCisKKwl3cmFwQWxsOiBmdW5jdGlvbiggaHRtbCApIHsKKwkJaWYgKCB0
aGlzWzBdICkKKwkJCS8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kCisJ
CQlqUXVlcnkoIGh0bWwsIHRoaXNbMF0ub3duZXJEb2N1bWVudCApCisJCQkJLmNsb25lKCkKKwkJ
CQkuaW5zZXJ0QmVmb3JlKCB0aGlzWzBdICkKKwkJCQkubWFwKGZ1bmN0aW9uKCl7CisJCQkJCXZh
ciBlbGVtID0gdGhpczsKKworCQkJCQl3aGlsZSAoIGVsZW0uZmlyc3RDaGlsZCApCisJCQkJCQll
bGVtID0gZWxlbS5maXJzdENoaWxkOworCisJCQkJCXJldHVybiBlbGVtOworCQkJCX0pCisJCQkJ
LmFwcGVuZCh0aGlzKTsKKworCQlyZXR1cm4gdGhpczsKKwl9LAorCisJd3JhcElubmVyOiBmdW5j
dGlvbiggaHRtbCApIHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeworCQkJalF1ZXJ5
KCB0aGlzICkuY29udGVudHMoKS53cmFwQWxsKCBodG1sICk7CisJCX0pOworCX0sCisKKwl3cmFw
OiBmdW5jdGlvbiggaHRtbCApIHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeworCQkJ
alF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaHRtbCApOworCQl9KTsKKwl9LAorCisJYXBwZW5kOiBm
dW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLCB0cnVlLCBmYWxz
ZSwgZnVuY3Rpb24oZWxlbSl7CisJCQlpZiAodGhpcy5ub2RlVHlwZSA9PSAxKQorCQkJCXRoaXMu
YXBwZW5kQ2hpbGQoIGVsZW0gKTsKKwkJfSk7CisJfSwKKworCXByZXBlbmQ6IGZ1bmN0aW9uKCkg
eworCQlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIHRydWUsIHRydWUsIGZ1bmN0aW9u
KGVsZW0peworCQkJaWYgKHRoaXMubm9kZVR5cGUgPT0gMSkKKwkJCQl0aGlzLmluc2VydEJlZm9y
ZSggZWxlbSwgdGhpcy5maXJzdENoaWxkICk7CisJCX0pOworCX0sCisKKwliZWZvcmU6IGZ1bmN0
aW9uKCkgeworCQlyZXR1cm4gdGhpcy5kb21NYW5pcChhcmd1bWVudHMsIGZhbHNlLCBmYWxzZSwg
ZnVuY3Rpb24oZWxlbSl7CisJCQl0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0
aGlzICk7CisJCX0pOworCX0sCisKKwlhZnRlcjogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0aGlz
LmRvbU1hbmlwKGFyZ3VtZW50cywgZmFsc2UsIHRydWUsIGZ1bmN0aW9uKGVsZW0peworCQkJdGhp
cy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcy5uZXh0U2libGluZyApOworCQl9
KTsKKwl9LAorCisJZW5kOiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMucHJldk9iamVjdCB8
fCBqUXVlcnkoIFtdICk7CisJfSwKKworCWZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJ
dmFyIGVsZW1zID0galF1ZXJ5Lm1hcCh0aGlzLCBmdW5jdGlvbihlbGVtKXsKKwkJCXJldHVybiBq
UXVlcnkuZmluZCggc2VsZWN0b3IsIGVsZW0gKTsKKwkJfSk7CisKKwkJcmV0dXJuIHRoaXMucHVz
aFN0YWNrKCAvW14rPl0gW14rPl0vLnRlc3QoIHNlbGVjdG9yICkgfHwgc2VsZWN0b3IuaW5kZXhP
ZigiLi4iKSA+IC0xID8KKwkJCWpRdWVyeS51bmlxdWUoIGVsZW1zICkgOgorCQkJZWxlbXMgKTsK
Kwl9LAorCisJY2xvbmU6IGZ1bmN0aW9uKCBldmVudHMgKSB7CisJCS8vIERvIHRoZSBjbG9uZQor
CQl2YXIgcmV0ID0gdGhpcy5tYXAoZnVuY3Rpb24oKXsKKwkJCWlmICggalF1ZXJ5LmJyb3dzZXIu
bXNpZSAmJiAhalF1ZXJ5LmlzWE1MRG9jKHRoaXMpICkgeworCQkJCS8vIElFIGNvcGllcyBldmVu
dHMgYm91bmQgdmlhIGF0dGFjaEV2ZW50IHdoZW4KKwkJCQkvLyB1c2luZyBjbG9uZU5vZGUuIENh
bGxpbmcgZGV0YWNoRXZlbnQgb24gdGhlCisJCQkJLy8gY2xvbmUgd2lsbCBhbHNvIHJlbW92ZSB0
aGUgZXZlbnRzIGZyb20gdGhlIG9yaWduYWwKKwkJCQkvLyBJbiBvcmRlciB0byBnZXQgYXJvdW5k
IHRoaXMsIHdlIHVzZSBpbm5lckhUTUwuCisJCQkJLy8gVW5mb3J0dW5hdGVseSwgdGhpcyBtZWFu
cyBzb21lIG1vZGlmaWNhdGlvbnMgdG8KKwkJCQkvLyBhdHRyaWJ1dGVzIGluIElFIHRoYXQgYXJl
IGFjdHVhbGx5IG9ubHkgc3RvcmVkCisJCQkJLy8gYXMgcHJvcGVydGllcyB3aWxsIG5vdCBiZSBj
b3BpZWQgKHN1Y2ggYXMgdGhlCisJCQkJLy8gdGhlIG5hbWUgYXR0cmlidXRlIG9uIGFuIGlucHV0
KS4KKwkJCQl2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZSh0cnVlKSwKKwkJCQkJY29udGFpbmVy
ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CisJCQkJY29udGFpbmVyLmFwcGVuZENo
aWxkKGNsb25lKTsKKwkJCQlyZXR1cm4galF1ZXJ5LmNsZWFuKFtjb250YWluZXIuaW5uZXJIVE1M
XSlbMF07CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gdGhpcy5jbG9uZU5vZGUodHJ1ZSk7CisJCX0p
OworCisJCS8vIE5lZWQgdG8gc2V0IHRoZSBleHBhbmRvIHRvIG51bGwgb24gdGhlIGNsb25lZCBz
ZXQgaWYgaXQgZXhpc3RzCisJCS8vIHJlbW92ZURhdGEgZG9lc24ndCB3b3JrIGhlcmUsIElFIHJl
bW92ZXMgaXQgZnJvbSB0aGUgb3JpZ2luYWwgYXMgd2VsbAorCQkvLyB0aGlzIGlzIHByaW1hcmls
eSBmb3IgSUUgYnV0IHRoZSBkYXRhIGV4cGFuZG8gc2hvdWxkbid0IGJlIGNvcGllZCBvdmVyIGlu
IGFueSBicm93c2VyCisJCXZhciBjbG9uZSA9IHJldC5maW5kKCIqIikuYW5kU2VsZigpLmVhY2go
ZnVuY3Rpb24oKXsKKwkJCWlmICggdGhpc1sgZXhwYW5kbyBdICE9IHVuZGVmaW5lZCApCisJCQkJ
dGhpc1sgZXhwYW5kbyBdID0gbnVsbDsKKwkJfSk7CisKKwkJLy8gQ29weSB0aGUgZXZlbnRzIGZy
b20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZQorCQlpZiAoIGV2ZW50cyA9PT0gdHJ1ZSApCisJ
CQl0aGlzLmZpbmQoIioiKS5hbmRTZWxmKCkuZWFjaChmdW5jdGlvbihpKXsKKwkJCQlpZiAodGhp
cy5ub2RlVHlwZSA9PSAzKQorCQkJCQlyZXR1cm47CisJCQkJdmFyIGV2ZW50cyA9IGpRdWVyeS5k
YXRhKCB0aGlzLCAiZXZlbnRzIiApOworCisJCQkJZm9yICggdmFyIHR5cGUgaW4gZXZlbnRzICkK
KwkJCQkJZm9yICggdmFyIGhhbmRsZXIgaW4gZXZlbnRzWyB0eXBlIF0gKQorCQkJCQkJalF1ZXJ5
LmV2ZW50LmFkZCggY2xvbmVbIGkgXSwgdHlwZSwgZXZlbnRzWyB0eXBlIF1bIGhhbmRsZXIgXSwg
ZXZlbnRzWyB0eXBlIF1bIGhhbmRsZXIgXS5kYXRhICk7CisJCQl9KTsKKworCQkvLyBSZXR1cm4g
dGhlIGNsb25lZCBzZXQKKwkJcmV0dXJuIHJldDsKKwl9LAorCisJZmlsdGVyOiBmdW5jdGlvbigg
c2VsZWN0b3IgKSB7CisJCXJldHVybiB0aGlzLnB1c2hTdGFjaygKKwkJCWpRdWVyeS5pc0Z1bmN0
aW9uKCBzZWxlY3RvciApICYmCisJCQlqUXVlcnkuZ3JlcCh0aGlzLCBmdW5jdGlvbihlbGVtLCBp
KXsKKwkJCQlyZXR1cm4gc2VsZWN0b3IuY2FsbCggZWxlbSwgaSApOworCQkJfSkgfHwKKworCQkJ
alF1ZXJ5Lm11bHRpRmlsdGVyKCBzZWxlY3RvciwgdGhpcyApICk7CisJfSwKKworCW5vdDogZnVu
Y3Rpb24oIHNlbGVjdG9yICkgeworCQlpZiAoIHNlbGVjdG9yLmNvbnN0cnVjdG9yID09IFN0cmlu
ZyApCisJCQkvLyB0ZXN0IHNwZWNpYWwgY2FzZSB3aGVyZSBqdXN0IG9uZSBzZWxlY3RvciBpcyBw
YXNzZWQgaW4KKwkJCWlmICggaXNTaW1wbGUudGVzdCggc2VsZWN0b3IgKSApCisJCQkJcmV0dXJu
IHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCB0aGlzLCB0cnVl
ICkgKTsKKwkJCWVsc2UKKwkJCQlzZWxlY3RvciA9IGpRdWVyeS5tdWx0aUZpbHRlciggc2VsZWN0
b3IsIHRoaXMgKTsKKworCQl2YXIgaXNBcnJheUxpa2UgPSBzZWxlY3Rvci5sZW5ndGggJiYgc2Vs
ZWN0b3Jbc2VsZWN0b3IubGVuZ3RoIC0gMV0gIT09IHVuZGVmaW5lZCAmJiAhc2VsZWN0b3Iubm9k
ZVR5cGU7CisJCXJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpIHsKKwkJCXJldHVybiBpc0Fy
cmF5TGlrZSA/IGpRdWVyeS5pbkFycmF5KCB0aGlzLCBzZWxlY3RvciApIDwgMCA6IHRoaXMgIT0g
c2VsZWN0b3I7CisJCX0pOworCX0sCisKKwlhZGQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJ
cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkudW5pcXVlKCBqUXVlcnkubWVyZ2UoCisJCQl0
aGlzLmdldCgpLAorCQkJdHlwZW9mIHNlbGVjdG9yID09ICdzdHJpbmcnID8KKwkJCQlqUXVlcnko
IHNlbGVjdG9yICkgOgorCQkJCWpRdWVyeS5tYWtlQXJyYXkoIHNlbGVjdG9yICkKKwkJKSkpOwor
CX0sCisKKwlpczogZnVuY3Rpb24oIHNlbGVjdG9yICkgeworCQlyZXR1cm4gISFzZWxlY3RvciAm
JiBqUXVlcnkubXVsdGlGaWx0ZXIoIHNlbGVjdG9yLCB0aGlzICkubGVuZ3RoID4gMDsKKwl9LAor
CisJaGFzQ2xhc3M6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHsKKwkJcmV0dXJuIHRoaXMuaXMoICIu
IiArIHNlbGVjdG9yICk7CisJfSwKKworCXZhbDogZnVuY3Rpb24oIHZhbHVlICkgeworCQlpZiAo
IHZhbHVlID09IHVuZGVmaW5lZCApIHsKKworCQkJaWYgKCB0aGlzLmxlbmd0aCApIHsKKwkJCQl2
YXIgZWxlbSA9IHRoaXNbMF07CisKKwkJCQkvLyBXZSBuZWVkIHRvIGhhbmRsZSBzZWxlY3QgYm94
ZXMgc3BlY2lhbAorCQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCBlbGVtLCAic2VsZWN0IiApICkg
eworCQkJCQl2YXIgaW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsCisJCQkJCQl2YWx1ZXMgPSBb
XSwKKwkJCQkJCW9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsCisJCQkJCQlvbmUgPSBlbGVtLnR5cGUg
PT0gInNlbGVjdC1vbmUiOworCisJCQkJCS8vIE5vdGhpbmcgd2FzIHNlbGVjdGVkCisJCQkJCWlm
ICggaW5kZXggPCAwICkKKwkJCQkJCXJldHVybiBudWxsOworCisJCQkJCS8vIExvb3AgdGhyb3Vn
aCBhbGwgdGhlIHNlbGVjdGVkIG9wdGlvbnMKKwkJCQkJZm9yICggdmFyIGkgPSBvbmUgPyBpbmRl
eCA6IDAsIG1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoOyBpIDwgbWF4OyBp
KysgKSB7CisJCQkJCQl2YXIgb3B0aW9uID0gb3B0aW9uc1sgaSBdOworCisJCQkJCQlpZiAoIG9w
dGlvbi5zZWxlY3RlZCApIHsKKwkJCQkJCQkvLyBHZXQgdGhlIHNwZWNpZmMgdmFsdWUgZm9yIHRo
ZSBvcHRpb24KKwkJCQkJCQl2YWx1ZSA9IGpRdWVyeS5icm93c2VyLm1zaWUgJiYgIW9wdGlvbi5h
dHRyaWJ1dGVzLnZhbHVlLnNwZWNpZmllZCA/IG9wdGlvbi50ZXh0IDogb3B0aW9uLnZhbHVlOwor
CisJCQkJCQkJLy8gV2UgZG9uJ3QgbmVlZCBhbiBhcnJheSBmb3Igb25lIHNlbGVjdHMKKwkJCQkJ
CQlpZiAoIG9uZSApCisJCQkJCQkJCXJldHVybiB2YWx1ZTsKKworCQkJCQkJCS8vIE11bHRpLVNl
bGVjdHMgcmV0dXJuIGFuIGFycmF5CisJCQkJCQkJdmFsdWVzLnB1c2goIHZhbHVlICk7CisJCQkJ
CQl9CisJCQkJCX0KKworCQkJCQlyZXR1cm4gdmFsdWVzOworCisJCQkJLy8gRXZlcnl0aGluZyBl
bHNlLCB3ZSBqdXN0IGdyYWIgdGhlIHZhbHVlCisJCQkJfSBlbHNlCisJCQkJCXJldHVybiAodGhp
c1swXS52YWx1ZSB8fCAiIikucmVwbGFjZSgvXHIvZywgIiIpOworCisJCQl9CisKKwkJCXJldHVy
biB1bmRlZmluZWQ7CisJCX0KKworCQlpZiggdmFsdWUuY29uc3RydWN0b3IgPT0gTnVtYmVyICkK
KwkJCXZhbHVlICs9ICcnOworCisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJCWlm
ICggdGhpcy5ub2RlVHlwZSAhPSAxICkKKwkJCQlyZXR1cm47CisKKwkJCWlmICggdmFsdWUuY29u
c3RydWN0b3IgPT0gQXJyYXkgJiYgL3JhZGlvfGNoZWNrYm94Ly50ZXN0KCB0aGlzLnR5cGUgKSAp
CisJCQkJdGhpcy5jaGVja2VkID0gKGpRdWVyeS5pbkFycmF5KHRoaXMudmFsdWUsIHZhbHVlKSA+
PSAwIHx8CisJCQkJCWpRdWVyeS5pbkFycmF5KHRoaXMubmFtZSwgdmFsdWUpID49IDApOworCisJ
CQllbHNlIGlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAic2VsZWN0IiApICkgeworCQkJCXZh
ciB2YWx1ZXMgPSBqUXVlcnkubWFrZUFycmF5KHZhbHVlKTsKKworCQkJCWpRdWVyeSggIm9wdGlv
biIsIHRoaXMgKS5lYWNoKGZ1bmN0aW9uKCl7CisJCQkJCXRoaXMuc2VsZWN0ZWQgPSAoalF1ZXJ5
LmluQXJyYXkoIHRoaXMudmFsdWUsIHZhbHVlcyApID49IDAgfHwKKwkJCQkJCWpRdWVyeS5pbkFy
cmF5KCB0aGlzLnRleHQsIHZhbHVlcyApID49IDApOworCQkJCX0pOworCisJCQkJaWYgKCAhdmFs
dWVzLmxlbmd0aCApCisJCQkJCXRoaXMuc2VsZWN0ZWRJbmRleCA9IC0xOworCisJCQl9IGVsc2UK
KwkJCQl0aGlzLnZhbHVlID0gdmFsdWU7CisJCX0pOworCX0sCisKKwlodG1sOiBmdW5jdGlvbigg
dmFsdWUgKSB7CisJCXJldHVybiB2YWx1ZSA9PSB1bmRlZmluZWQgPworCQkJKHRoaXNbMF0gPwor
CQkJCXRoaXNbMF0uaW5uZXJIVE1MIDoKKwkJCQludWxsKSA6CisJCQl0aGlzLmVtcHR5KCkuYXBw
ZW5kKCB2YWx1ZSApOworCX0sCisKKwlyZXBsYWNlV2l0aDogZnVuY3Rpb24oIHZhbHVlICkgewor
CQlyZXR1cm4gdGhpcy5hZnRlciggdmFsdWUgKS5yZW1vdmUoKTsKKwl9LAorCisJZXE6IGZ1bmN0
aW9uKCBpICkgeworCQlyZXR1cm4gdGhpcy5zbGljZSggaSwgaSArIDEgKTsKKwl9LAorCisJc2xp
Y2U6IGZ1bmN0aW9uKCkgeworCQlyZXR1cm4gdGhpcy5wdXNoU3RhY2soIEFycmF5LnByb3RvdHlw
ZS5zbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgKTsKKwl9LAorCisJbWFwOiBmdW5jdGlv
biggY2FsbGJhY2sgKSB7CisJCXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5Lm1hcCh0aGlz
LCBmdW5jdGlvbihlbGVtLCBpKXsKKwkJCXJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBl
bGVtICk7CisJCX0pKTsKKwl9LAorCisJYW5kU2VsZjogZnVuY3Rpb24oKSB7CisJCXJldHVybiB0
aGlzLmFkZCggdGhpcy5wcmV2T2JqZWN0ICk7CisJfSwKKworCWRhdGE6IGZ1bmN0aW9uKCBrZXks
IHZhbHVlICl7CisJCXZhciBwYXJ0cyA9IGtleS5zcGxpdCgiLiIpOworCQlwYXJ0c1sxXSA9IHBh
cnRzWzFdID8gIi4iICsgcGFydHNbMV0gOiAiIjsKKworCQlpZiAoIHZhbHVlID09PSB1bmRlZmlu
ZWQgKSB7CisJCQl2YXIgZGF0YSA9IHRoaXMudHJpZ2dlckhhbmRsZXIoImdldERhdGEiICsgcGFy
dHNbMV0gKyAiISIsIFtwYXJ0c1swXV0pOworCisJCQlpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAm
JiB0aGlzLmxlbmd0aCApCisJCQkJZGF0YSA9IGpRdWVyeS5kYXRhKCB0aGlzWzBdLCBrZXkgKTsK
KworCQkJcmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBwYXJ0c1sxXSA/CisJCQkJdGhpcy5k
YXRhKCBwYXJ0c1swXSApIDoKKwkJCQlkYXRhOworCQl9IGVsc2UKKwkJCXJldHVybiB0aGlzLnRy
aWdnZXIoInNldERhdGEiICsgcGFydHNbMV0gKyAiISIsIFtwYXJ0c1swXSwgdmFsdWVdKS5lYWNo
KGZ1bmN0aW9uKCl7CisJCQkJalF1ZXJ5LmRhdGEoIHRoaXMsIGtleSwgdmFsdWUgKTsKKwkJCX0p
OworCX0sCisKKwlyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICl7CisJCXJldHVybiB0aGlzLmVh
Y2goZnVuY3Rpb24oKXsKKwkJCWpRdWVyeS5yZW1vdmVEYXRhKCB0aGlzLCBrZXkgKTsKKwkJfSk7
CisJfSwKKworCWRvbU1hbmlwOiBmdW5jdGlvbiggYXJncywgdGFibGUsIHJldmVyc2UsIGNhbGxi
YWNrICkgeworCQl2YXIgY2xvbmUgPSB0aGlzLmxlbmd0aCA+IDEsIGVsZW1zOworCisJCXJldHVy
biB0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJCWlmICggIWVsZW1zICkgeworCQkJCWVsZW1zID0g
alF1ZXJ5LmNsZWFuKCBhcmdzLCB0aGlzLm93bmVyRG9jdW1lbnQgKTsKKworCQkJCWlmICggcmV2
ZXJzZSApCisJCQkJCWVsZW1zLnJldmVyc2UoKTsKKwkJCX0KKworCQkJdmFyIG9iaiA9IHRoaXM7
CisKKwkJCWlmICggdGFibGUgJiYgalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCAidGFibGUiICkgJiYg
alF1ZXJ5Lm5vZGVOYW1lKCBlbGVtc1swXSwgInRyIiApICkKKwkJCQlvYmogPSB0aGlzLmdldEVs
ZW1lbnRzQnlUYWdOYW1lKCJ0Ym9keSIpWzBdIHx8IHRoaXMuYXBwZW5kQ2hpbGQoIHRoaXMub3du
ZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0Ym9keSIpICk7CisKKwkJCXZhciBzY3JpcHRzID0g
alF1ZXJ5KCBbXSApOworCisJCQlqUXVlcnkuZWFjaChlbGVtcywgZnVuY3Rpb24oKXsKKwkJCQl2
YXIgZWxlbSA9IGNsb25lID8KKwkJCQkJalF1ZXJ5KCB0aGlzICkuY2xvbmUoIHRydWUgKVswXSA6
CisJCQkJCXRoaXM7CisKKwkJCQkvLyBleGVjdXRlIGFsbCBzY3JpcHRzIGFmdGVyIHRoZSBlbGVt
ZW50cyBoYXZlIGJlZW4gaW5qZWN0ZWQKKwkJCQlpZiAoIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwg
InNjcmlwdCIgKSApCisJCQkJCXNjcmlwdHMgPSBzY3JpcHRzLmFkZCggZWxlbSApOworCQkJCWVs
c2UgeworCQkJCQkvLyBSZW1vdmUgYW55IGlubmVyIHNjcmlwdHMgZm9yIGxhdGVyIGV2YWx1YXRp
b24KKwkJCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09IDEgKQorCQkJCQkJc2NyaXB0cyA9IHNjcmlw
dHMuYWRkKCBqUXVlcnkoICJzY3JpcHQiLCBlbGVtICkucmVtb3ZlKCkgKTsKKworCQkJCQkvLyBJ
bmplY3QgdGhlIGVsZW1lbnRzIGludG8gdGhlIGRvY3VtZW50CisJCQkJCWNhbGxiYWNrLmNhbGwo
IG9iaiwgZWxlbSApOworCQkJCX0KKwkJCX0pOworCisJCQlzY3JpcHRzLmVhY2goIGV2YWxTY3Jp
cHQgKTsKKwkJfSk7CisJfQorfTsKKworLy8gR2l2ZSB0aGUgaW5pdCBmdW5jdGlvbiB0aGUgalF1
ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvbgoralF1ZXJ5LmZuLmluaXQucHJv
dG90eXBlID0galF1ZXJ5LmZuOworCitmdW5jdGlvbiBldmFsU2NyaXB0KCBpLCBlbGVtICkgewor
CWlmICggZWxlbS5zcmMgKQorCQlqUXVlcnkuYWpheCh7CisJCQl1cmw6IGVsZW0uc3JjLAorCQkJ
YXN5bmM6IGZhbHNlLAorCQkJZGF0YVR5cGU6ICJzY3JpcHQiCisJCX0pOworCisJZWxzZQorCQlq
UXVlcnkuZ2xvYmFsRXZhbCggZWxlbS50ZXh0IHx8IGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5p
bm5lckhUTUwgfHwgIiIgKTsKKworCWlmICggZWxlbS5wYXJlbnROb2RlICkKKwkJZWxlbS5wYXJl
bnROb2RlLnJlbW92ZUNoaWxkKCBlbGVtICk7Cit9CisKK2Z1bmN0aW9uIG5vdygpeworCXJldHVy
biArbmV3IERhdGU7Cit9CisKK2pRdWVyeS5leHRlbmQgPSBqUXVlcnkuZm4uZXh0ZW5kID0gZnVu
Y3Rpb24oKSB7CisJLy8gY29weSByZWZlcmVuY2UgdG8gdGFyZ2V0IG9iamVjdAorCXZhciB0YXJn
ZXQgPSBhcmd1bWVudHNbMF0gfHwge30sIGkgPSAxLCBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3Ro
LCBkZWVwID0gZmFsc2UsIG9wdGlvbnM7CisKKwkvLyBIYW5kbGUgYSBkZWVwIGNvcHkgc2l0dWF0
aW9uCisJaWYgKCB0YXJnZXQuY29uc3RydWN0b3IgPT0gQm9vbGVhbiApIHsKKwkJZGVlcCA9IHRh
cmdldDsKKwkJdGFyZ2V0ID0gYXJndW1lbnRzWzFdIHx8IHt9OworCQkvLyBza2lwIHRoZSBib29s
ZWFuIGFuZCB0aGUgdGFyZ2V0CisJCWkgPSAyOworCX0KKworCS8vIEhhbmRsZSBjYXNlIHdoZW4g
dGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KQor
CWlmICggdHlwZW9mIHRhcmdldCAhPSAib2JqZWN0IiAmJiB0eXBlb2YgdGFyZ2V0ICE9ICJmdW5j
dGlvbiIgKQorCQl0YXJnZXQgPSB7fTsKKworCS8vIGV4dGVuZCBqUXVlcnkgaXRzZWxmIGlmIG9u
bHkgb25lIGFyZ3VtZW50IGlzIHBhc3NlZAorCWlmICggbGVuZ3RoID09IGkgKSB7CisJCXRhcmdl
dCA9IHRoaXM7CisJCS0taTsKKwl9CisKKwlmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApCisJCS8v
IE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXMKKwkJaWYgKCAob3B0aW9u
cyA9IGFyZ3VtZW50c1sgaSBdKSAhPSBudWxsICkKKwkJCS8vIEV4dGVuZCB0aGUgYmFzZSBvYmpl
Y3QKKwkJCWZvciAoIHZhciBuYW1lIGluIG9wdGlvbnMgKSB7CisJCQkJdmFyIHNyYyA9IHRhcmdl
dFsgbmFtZSBdLCBjb3B5ID0gb3B0aW9uc1sgbmFtZSBdOworCisJCQkJLy8gUHJldmVudCBuZXZl
ci1lbmRpbmcgbG9vcAorCQkJCWlmICggdGFyZ2V0ID09PSBjb3B5ICkKKwkJCQkJY29udGludWU7
CisKKwkJCQkvLyBSZWN1cnNlIGlmIHdlJ3JlIG1lcmdpbmcgb2JqZWN0IHZhbHVlcworCQkJCWlm
ICggZGVlcCAmJiBjb3B5ICYmIHR5cGVvZiBjb3B5ID09ICJvYmplY3QiICYmICFjb3B5Lm5vZGVU
eXBlICkKKwkJCQkJdGFyZ2V0WyBuYW1lIF0gPSBqUXVlcnkuZXh0ZW5kKCBkZWVwLCAKKwkJCQkJ
CS8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbQorCQkJCQkJc3JjIHx8
ICggY29weS5sZW5ndGggIT0gbnVsbCA/IFsgXSA6IHsgfSApCisJCQkJCSwgY29weSApOworCisJ
CQkJLy8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlcworCQkJCWVsc2UgaWYgKCBjb3B5
ICE9PSB1bmRlZmluZWQgKQorCQkJCQl0YXJnZXRbIG5hbWUgXSA9IGNvcHk7CisKKwkJCX0KKwor
CS8vIFJldHVybiB0aGUgbW9kaWZpZWQgb2JqZWN0CisJcmV0dXJuIHRhcmdldDsKK307CisKK3Zh
ciBleHBhbmRvID0gImpRdWVyeSIgKyBub3coKSwgdXVpZCA9IDAsIHdpbmRvd0RhdGEgPSB7fSwK
KwkvLyBleGNsdWRlIHRoZSBmb2xsb3dpbmcgY3NzIHByb3BlcnRpZXMgdG8gYWRkIHB4CisJZXhj
bHVkZSA9IC96LT9pbmRleHxmb250LT93ZWlnaHR8b3BhY2l0eXx6b29tfGxpbmUtP2hlaWdodC9p
LAorCS8vIGNhY2hlIGRlZmF1bHRWaWV3CisJZGVmYXVsdFZpZXcgPSBkb2N1bWVudC5kZWZhdWx0
VmlldyB8fCB7fTsKKworalF1ZXJ5LmV4dGVuZCh7CisJbm9Db25mbGljdDogZnVuY3Rpb24oIGRl
ZXAgKSB7CisJCXdpbmRvdy4kID0gXyQ7CisKKwkJaWYgKCBkZWVwICkKKwkJCXdpbmRvdy5qUXVl
cnkgPSBfalF1ZXJ5OworCisJCXJldHVybiBqUXVlcnk7CisJfSwKKworCS8vIFNlZSB0ZXN0L3Vu
aXQvY29yZS5qcyBmb3IgZGV0YWlscyBjb25jZXJuaW5nIHRoaXMgZnVuY3Rpb24uCisJaXNGdW5j
dGlvbjogZnVuY3Rpb24oIGZuICkgeworCQlyZXR1cm4gISFmbiAmJiB0eXBlb2YgZm4gIT0gInN0
cmluZyIgJiYgIWZuLm5vZGVOYW1lICYmCisJCQlmbi5jb25zdHJ1Y3RvciAhPSBBcnJheSAmJiAv
Xltcc1tdP2Z1bmN0aW9uLy50ZXN0KCBmbiArICIiICk7CisJfSwKKworCS8vIGNoZWNrIGlmIGFu
IGVsZW1lbnQgaXMgaW4gYSAob3IgaXMgYW4pIFhNTCBkb2N1bWVudAorCWlzWE1MRG9jOiBmdW5j
dGlvbiggZWxlbSApIHsKKwkJcmV0dXJuIGVsZW0uZG9jdW1lbnRFbGVtZW50ICYmICFlbGVtLmJv
ZHkgfHwKKwkJCWVsZW0udGFnTmFtZSAmJiBlbGVtLm93bmVyRG9jdW1lbnQgJiYgIWVsZW0ub3du
ZXJEb2N1bWVudC5ib2R5OworCX0sCisKKwkvLyBFdmFsdWxhdGVzIGEgc2NyaXB0IGluIGEgZ2xv
YmFsIGNvbnRleHQKKwlnbG9iYWxFdmFsOiBmdW5jdGlvbiggZGF0YSApIHsKKwkJZGF0YSA9IGpR
dWVyeS50cmltKCBkYXRhICk7CisKKwkJaWYgKCBkYXRhICkgeworCQkJLy8gSW5zcGlyZWQgYnkg
Y29kZSBieSBBbmRyZWEgR2lhbW1hcmNoaQorCQkJLy8gaHR0cDovL3dlYnJlZmxlY3Rpb24uYmxv
Z3Nwb3QuY29tLzIwMDcvMDgvZ2xvYmFsLXNjb3BlLWV2YWx1YXRpb24tYW5kLWRvbS5odG1sCisJ
CQl2YXIgaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0gfHwg
ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LAorCQkJCXNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVs
ZW1lbnQoInNjcmlwdCIpOworCisJCQlzY3JpcHQudHlwZSA9ICJ0ZXh0L2phdmFzY3JpcHQiOwor
CQkJaWYgKCBqUXVlcnkuYnJvd3Nlci5tc2llICkKKwkJCQlzY3JpcHQudGV4dCA9IGRhdGE7CisJ
CQllbHNlCisJCQkJc2NyaXB0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgg
ZGF0YSApICk7CisKKwkJCS8vIFVzZSBpbnNlcnRCZWZvcmUgaW5zdGVhZCBvZiBhcHBlbmRDaGls
ZCAgdG8gY2lyY3VtdmVudCBhbiBJRTYgYnVnLgorCQkJLy8gVGhpcyBhcmlzZXMgd2hlbiBhIGJh
c2Ugbm9kZSBpcyB1c2VkICgjMjcwOSkuCisJCQloZWFkLmluc2VydEJlZm9yZSggc2NyaXB0LCBo
ZWFkLmZpcnN0Q2hpbGQgKTsKKwkJCWhlYWQucmVtb3ZlQ2hpbGQoIHNjcmlwdCApOworCQl9CisJ
fSwKKworCW5vZGVOYW1lOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHsKKwkJcmV0dXJuIGVsZW0u
bm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09IG5hbWUudG9VcHBlckNh
c2UoKTsKKwl9LAorCisJY2FjaGU6IHt9LAorCisJZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUs
IGRhdGEgKSB7CisJCWVsZW0gPSBlbGVtID09IHdpbmRvdyA/CisJCQl3aW5kb3dEYXRhIDoKKwkJ
CWVsZW07CisKKwkJdmFyIGlkID0gZWxlbVsgZXhwYW5kbyBdOworCisJCS8vIENvbXB1dGUgYSB1
bmlxdWUgSUQgZm9yIHRoZSBlbGVtZW50CisJCWlmICggIWlkICkKKwkJCWlkID0gZWxlbVsgZXhw
YW5kbyBdID0gKyt1dWlkOworCisJCS8vIE9ubHkgZ2VuZXJhdGUgdGhlIGRhdGEgY2FjaGUgaWYg
d2UncmUKKwkJLy8gdHJ5aW5nIHRvIGFjY2VzcyBvciBtYW5pcHVsYXRlIGl0CisJCWlmICggbmFt
ZSAmJiAhalF1ZXJ5LmNhY2hlWyBpZCBdICkKKwkJCWpRdWVyeS5jYWNoZVsgaWQgXSA9IHt9Owor
CisJCS8vIFByZXZlbnQgb3ZlcnJpZGluZyB0aGUgbmFtZWQgY2FjaGUgd2l0aCB1bmRlZmluZWQg
dmFsdWVzCisJCWlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkKKwkJCWpRdWVyeS5jYWNoZVsgaWQg
XVsgbmFtZSBdID0gZGF0YTsKKworCQkvLyBSZXR1cm4gdGhlIG5hbWVkIGNhY2hlIGRhdGEsIG9y
IHRoZSBJRCBmb3IgdGhlIGVsZW1lbnQKKwkJcmV0dXJuIG5hbWUgPworCQkJalF1ZXJ5LmNhY2hl
WyBpZCBdWyBuYW1lIF0gOgorCQkJaWQ7CisJfSwKKworCXJlbW92ZURhdGE6IGZ1bmN0aW9uKCBl
bGVtLCBuYW1lICkgeworCQllbGVtID0gZWxlbSA9PSB3aW5kb3cgPworCQkJd2luZG93RGF0YSA6
CisJCQllbGVtOworCisJCXZhciBpZCA9IGVsZW1bIGV4cGFuZG8gXTsKKworCQkvLyBJZiB3ZSB3
YW50IHRvIHJlbW92ZSBhIHNwZWNpZmljIHNlY3Rpb24gb2YgdGhlIGVsZW1lbnQncyBkYXRhCisJ
CWlmICggbmFtZSApIHsKKwkJCWlmICggalF1ZXJ5LmNhY2hlWyBpZCBdICkgeworCQkJCS8vIFJl
bW92ZSB0aGUgc2VjdGlvbiBvZiBjYWNoZSBkYXRhCisJCQkJZGVsZXRlIGpRdWVyeS5jYWNoZVsg
aWQgXVsgbmFtZSBdOworCisJCQkJLy8gSWYgd2UndmUgcmVtb3ZlZCBhbGwgdGhlIGRhdGEsIHJl
bW92ZSB0aGUgZWxlbWVudCdzIGNhY2hlCisJCQkJbmFtZSA9ICIiOworCisJCQkJZm9yICggbmFt
ZSBpbiBqUXVlcnkuY2FjaGVbIGlkIF0gKQorCQkJCQlicmVhazsKKworCQkJCWlmICggIW5hbWUg
KQorCQkJCQlqUXVlcnkucmVtb3ZlRGF0YSggZWxlbSApOworCQkJfQorCisJCS8vIE90aGVyd2lz
ZSwgd2Ugd2FudCB0byByZW1vdmUgYWxsIG9mIHRoZSBlbGVtZW50J3MgZGF0YQorCQl9IGVsc2Ug
eworCQkJLy8gQ2xlYW4gdXAgdGhlIGVsZW1lbnQgZXhwYW5kbworCQkJdHJ5IHsKKwkJCQlkZWxl
dGUgZWxlbVsgZXhwYW5kbyBdOworCQkJfSBjYXRjaChlKXsKKwkJCQkvLyBJRSBoYXMgdHJvdWJs
ZSBkaXJlY3RseSByZW1vdmluZyB0aGUgZXhwYW5kbworCQkJCS8vIGJ1dCBpdCdzIG9rIHdpdGgg
dXNpbmcgcmVtb3ZlQXR0cmlidXRlCisJCQkJaWYgKCBlbGVtLnJlbW92ZUF0dHJpYnV0ZSApCisJ
CQkJCWVsZW0ucmVtb3ZlQXR0cmlidXRlKCBleHBhbmRvICk7CisJCQl9CisKKwkJCS8vIENvbXBs
ZXRlbHkgcmVtb3ZlIHRoZSBkYXRhIGNhY2hlCisJCQlkZWxldGUgalF1ZXJ5LmNhY2hlWyBpZCBd
OworCQl9CisJfSwKKworCS8vIGFyZ3MgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHkKKwllYWNo
OiBmdW5jdGlvbiggb2JqZWN0LCBjYWxsYmFjaywgYXJncyApIHsKKwkJdmFyIG5hbWUsIGkgPSAw
LCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOworCisJCWlmICggYXJncyApIHsKKwkJCWlmICggbGVu
Z3RoID09IHVuZGVmaW5lZCApIHsKKwkJCQlmb3IgKCBuYW1lIGluIG9iamVjdCApCisJCQkJCWlm
ICggY2FsbGJhY2suYXBwbHkoIG9iamVjdFsgbmFtZSBdLCBhcmdzICkgPT09IGZhbHNlICkKKwkJ
CQkJCWJyZWFrOworCQkJfSBlbHNlCisJCQkJZm9yICggOyBpIDwgbGVuZ3RoOyApCisJCQkJCWlm
ICggY2FsbGJhY2suYXBwbHkoIG9iamVjdFsgaSsrIF0sIGFyZ3MgKSA9PT0gZmFsc2UgKQorCQkJ
CQkJYnJlYWs7CisKKwkJLy8gQSBzcGVjaWFsLCBmYXN0LCBjYXNlIGZvciB0aGUgbW9zdCBjb21t
b24gdXNlIG9mIGVhY2gKKwkJfSBlbHNlIHsKKwkJCWlmICggbGVuZ3RoID09IHVuZGVmaW5lZCAp
IHsKKwkJCQlmb3IgKCBuYW1lIGluIG9iamVjdCApCisJCQkJCWlmICggY2FsbGJhY2suY2FsbCgg
b2JqZWN0WyBuYW1lIF0sIG5hbWUsIG9iamVjdFsgbmFtZSBdICkgPT09IGZhbHNlICkKKwkJCQkJ
CWJyZWFrOworCQkJfSBlbHNlCisJCQkJZm9yICggdmFyIHZhbHVlID0gb2JqZWN0WzBdOworCQkJ
CQlpIDwgbGVuZ3RoICYmIGNhbGxiYWNrLmNhbGwoIHZhbHVlLCBpLCB2YWx1ZSApICE9PSBmYWxz
ZTsgdmFsdWUgPSBvYmplY3RbKytpXSApe30KKwkJfQorCisJCXJldHVybiBvYmplY3Q7CisJfSwK
KworCXByb3A6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgdHlwZSwgaSwgbmFtZSApIHsKKwkJLy8g
SGFuZGxlIGV4ZWN1dGFibGUgZnVuY3Rpb25zCisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZh
bHVlICkgKQorCQkJdmFsdWUgPSB2YWx1ZS5jYWxsKCBlbGVtLCBpICk7CisKKwkJLy8gSGFuZGxl
IHBhc3NpbmcgaW4gYSBudW1iZXIgdG8gYSBDU1MgcHJvcGVydHkKKwkJcmV0dXJuIHZhbHVlICYm
IHZhbHVlLmNvbnN0cnVjdG9yID09IE51bWJlciAmJiB0eXBlID09ICJjdXJDU1MiICYmICFleGNs
dWRlLnRlc3QoIG5hbWUgKSA/CisJCQl2YWx1ZSArICJweCIgOgorCQkJdmFsdWU7CisJfSwKKwor
CWNsYXNzTmFtZTogeworCQkvLyBpbnRlcm5hbCBvbmx5LCB1c2UgYWRkQ2xhc3MoImNsYXNzIikK
KwkJYWRkOiBmdW5jdGlvbiggZWxlbSwgY2xhc3NOYW1lcyApIHsKKwkJCWpRdWVyeS5lYWNoKChj
bGFzc05hbWVzIHx8ICIiKS5zcGxpdCgvXHMrLyksIGZ1bmN0aW9uKGksIGNsYXNzTmFtZSl7CisJ
CQkJaWYgKCBlbGVtLm5vZGVUeXBlID09IDEgJiYgIWpRdWVyeS5jbGFzc05hbWUuaGFzKCBlbGVt
LmNsYXNzTmFtZSwgY2xhc3NOYW1lICkgKQorCQkJCQllbGVtLmNsYXNzTmFtZSArPSAoZWxlbS5j
bGFzc05hbWUgPyAiICIgOiAiIikgKyBjbGFzc05hbWU7CisJCQl9KTsKKwkJfSwKKworCQkvLyBp
bnRlcm5hbCBvbmx5LCB1c2UgcmVtb3ZlQ2xhc3MoImNsYXNzIikKKwkJcmVtb3ZlOiBmdW5jdGlv
biggZWxlbSwgY2xhc3NOYW1lcyApIHsKKwkJCWlmIChlbGVtLm5vZGVUeXBlID09IDEpCisJCQkJ
ZWxlbS5jbGFzc05hbWUgPSBjbGFzc05hbWVzICE9IHVuZGVmaW5lZCA/CisJCQkJCWpRdWVyeS5n
cmVwKGVsZW0uY2xhc3NOYW1lLnNwbGl0KC9ccysvKSwgZnVuY3Rpb24oY2xhc3NOYW1lKXsKKwkJ
CQkJCXJldHVybiAhalF1ZXJ5LmNsYXNzTmFtZS5oYXMoIGNsYXNzTmFtZXMsIGNsYXNzTmFtZSAp
OworCQkJCQl9KS5qb2luKCIgIikgOgorCQkJCQkiIjsKKwkJfSwKKworCQkvLyBpbnRlcm5hbCBv
bmx5LCB1c2UgaGFzQ2xhc3MoImNsYXNzIikKKwkJaGFzOiBmdW5jdGlvbiggZWxlbSwgY2xhc3NO
YW1lICkgeworCQkJcmV0dXJuIGpRdWVyeS5pbkFycmF5KCBjbGFzc05hbWUsIChlbGVtLmNsYXNz
TmFtZSB8fCBlbGVtKS50b1N0cmluZygpLnNwbGl0KC9ccysvKSApID4gLTE7CisJCX0KKwl9LAor
CisJLy8gQSBtZXRob2QgZm9yIHF1aWNrbHkgc3dhcHBpbmcgaW4vb3V0IENTUyBwcm9wZXJ0aWVz
IHRvIGdldCBjb3JyZWN0IGNhbGN1bGF0aW9ucworCXN3YXA6IGZ1bmN0aW9uKCBlbGVtLCBvcHRp
b25zLCBjYWxsYmFjayApIHsKKwkJdmFyIG9sZCA9IHt9OworCQkvLyBSZW1lbWJlciB0aGUgb2xk
IHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXMKKwkJZm9yICggdmFyIG5hbWUgaW4gb3B0
aW9ucyApIHsKKwkJCW9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdOworCQkJZWxlbS5z
dHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdOworCQl9CisKKwkJY2FsbGJhY2suY2FsbCgg
ZWxlbSApOworCisJCS8vIFJldmVydCB0aGUgb2xkIHZhbHVlcworCQlmb3IgKCB2YXIgbmFtZSBp
biBvcHRpb25zICkKKwkJCWVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdOworCX0sCisK
Kwljc3M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBmb3JjZSApIHsKKwkJaWYgKCBuYW1lID09ICJ3
aWR0aCIgfHwgbmFtZSA9PSAiaGVpZ2h0IiApIHsKKwkJCXZhciB2YWwsIHByb3BzID0geyBwb3Np
dGlvbjogImFic29sdXRlIiwgdmlzaWJpbGl0eTogImhpZGRlbiIsIGRpc3BsYXk6ImJsb2NrIiB9
LCB3aGljaCA9IG5hbWUgPT0gIndpZHRoIiA/IFsgIkxlZnQiLCAiUmlnaHQiIF0gOiBbICJUb3Ai
LCAiQm90dG9tIiBdOworCisJCQlmdW5jdGlvbiBnZXRXSCgpIHsKKwkJCQl2YWwgPSBuYW1lID09
ICJ3aWR0aCIgPyBlbGVtLm9mZnNldFdpZHRoIDogZWxlbS5vZmZzZXRIZWlnaHQ7CisJCQkJdmFy
IHBhZGRpbmcgPSAwLCBib3JkZXIgPSAwOworCQkJCWpRdWVyeS5lYWNoKCB3aGljaCwgZnVuY3Rp
b24oKSB7CisJCQkJCXBhZGRpbmcgKz0gcGFyc2VGbG9hdChqUXVlcnkuY3VyQ1NTKCBlbGVtLCAi
cGFkZGluZyIgKyB0aGlzLCB0cnVlKSkgfHwgMDsKKwkJCQkJYm9yZGVyICs9IHBhcnNlRmxvYXQo
alF1ZXJ5LmN1ckNTUyggZWxlbSwgImJvcmRlciIgKyB0aGlzICsgIldpZHRoIiwgdHJ1ZSkpIHx8
IDA7CisJCQkJfSk7CisJCQkJdmFsIC09IE1hdGgucm91bmQocGFkZGluZyArIGJvcmRlcik7CisJ
CQl9CisKKwkJCWlmICggalF1ZXJ5KGVsZW0pLmlzKCI6dmlzaWJsZSIpICkKKwkJCQlnZXRXSCgp
OworCQkJZWxzZQorCQkJCWpRdWVyeS5zd2FwKCBlbGVtLCBwcm9wcywgZ2V0V0ggKTsKKworCQkJ
cmV0dXJuIE1hdGgubWF4KDAsIHZhbCk7CisJCX0KKworCQlyZXR1cm4galF1ZXJ5LmN1ckNTUygg
ZWxlbSwgbmFtZSwgZm9yY2UgKTsKKwl9LAorCisJY3VyQ1NTOiBmdW5jdGlvbiggZWxlbSwgbmFt
ZSwgZm9yY2UgKSB7CisJCXZhciByZXQsIHN0eWxlID0gZWxlbS5zdHlsZTsKKworCQkvLyBBIGhl
bHBlciBtZXRob2QgZm9yIGRldGVybWluaW5nIGlmIGFuIGVsZW1lbnQncyB2YWx1ZXMgYXJlIGJy
b2tlbgorCQlmdW5jdGlvbiBjb2xvciggZWxlbSApIHsKKwkJCWlmICggIWpRdWVyeS5icm93c2Vy
LnNhZmFyaSApCisJCQkJcmV0dXJuIGZhbHNlOworCisJCQkvLyBkZWZhdWx0VmlldyBpcyBjYWNo
ZWQKKwkJCXZhciByZXQgPSBkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtLCBudWxs
ICk7CisJCQlyZXR1cm4gIXJldCB8fCByZXQuZ2V0UHJvcGVydHlWYWx1ZSgiY29sb3IiKSA9PSAi
IjsKKwkJfQorCisJCS8vIFdlIG5lZWQgdG8gaGFuZGxlIG9wYWNpdHkgc3BlY2lhbCBpbiBJRQor
CQlpZiAoIG5hbWUgPT0gIm9wYWNpdHkiICYmIGpRdWVyeS5icm93c2VyLm1zaWUgKSB7CisJCQly
ZXQgPSBqUXVlcnkuYXR0ciggc3R5bGUsICJvcGFjaXR5IiApOworCisJCQlyZXR1cm4gcmV0ID09
ICIiID8KKwkJCQkiMSIgOgorCQkJCXJldDsKKwkJfQorCQkvLyBPcGVyYSBzb21ldGltZXMgd2ls
bCBnaXZlIHRoZSB3cm9uZyBkaXNwbGF5IGFuc3dlciwgdGhpcyBmaXhlcyBpdCwgc2VlICMyMDM3
CisJCWlmICggalF1ZXJ5LmJyb3dzZXIub3BlcmEgJiYgbmFtZSA9PSAiZGlzcGxheSIgKSB7CisJ
CQl2YXIgc2F2ZSA9IHN0eWxlLm91dGxpbmU7CisJCQlzdHlsZS5vdXRsaW5lID0gIjAgc29saWQg
YmxhY2siOworCQkJc3R5bGUub3V0bGluZSA9IHNhdmU7CisJCX0KKworCQkvLyBNYWtlIHN1cmUg
d2UncmUgdXNpbmcgdGhlIHJpZ2h0IG5hbWUgZm9yIGdldHRpbmcgdGhlIGZsb2F0IHZhbHVlCisJ
CWlmICggbmFtZS5tYXRjaCggL2Zsb2F0L2kgKSApCisJCQluYW1lID0gc3R5bGVGbG9hdDsKKwor
CQlpZiAoICFmb3JjZSAmJiBzdHlsZSAmJiBzdHlsZVsgbmFtZSBdICkKKwkJCXJldCA9IHN0eWxl
WyBuYW1lIF07CisKKwkJZWxzZSBpZiAoIGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUgKSB7
CisKKwkJCS8vIE9ubHkgImZsb2F0IiBpcyBuZWVkZWQgaGVyZQorCQkJaWYgKCBuYW1lLm1hdGNo
KCAvZmxvYXQvaSApICkKKwkJCQluYW1lID0gImZsb2F0IjsKKworCQkJbmFtZSA9IG5hbWUucmVw
bGFjZSggLyhbQS1aXSkvZywgIi0kMSIgKS50b0xvd2VyQ2FzZSgpOworCisJCQl2YXIgY29tcHV0
ZWRTdHlsZSA9IGRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoIGVsZW0sIG51bGwgKTsKKwor
CQkJaWYgKCBjb21wdXRlZFN0eWxlICYmICFjb2xvciggZWxlbSApICkKKwkJCQlyZXQgPSBjb21w
dXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKTsKKworCQkJLy8gSWYgdGhlIGVsZW1l
bnQgaXNuJ3QgcmVwb3J0aW5nIGl0cyB2YWx1ZXMgcHJvcGVybHkgaW4gU2FmYXJpCisJCQkvLyB0
aGVuIHNvbWUgZGlzcGxheTogbm9uZSBlbGVtZW50cyBhcmUgaW52b2x2ZWQKKwkJCWVsc2Ugewor
CQkJCXZhciBzd2FwID0gW10sIHN0YWNrID0gW10sIGEgPSBlbGVtLCBpID0gMDsKKworCQkJCS8v
IExvY2F0ZSBhbGwgb2YgdGhlIHBhcmVudCBkaXNwbGF5OiBub25lIGVsZW1lbnRzCisJCQkJZm9y
ICggOyBhICYmIGNvbG9yKGEpOyBhID0gYS5wYXJlbnROb2RlICkKKwkJCQkJc3RhY2sudW5zaGlm
dChhKTsKKworCQkJCS8vIEdvIHRocm91Z2ggYW5kIG1ha2UgdGhlbSB2aXNpYmxlLCBidXQgaW4g
cmV2ZXJzZQorCQkJCS8vIChJdCB3b3VsZCBiZSBiZXR0ZXIgaWYgd2Uga25ldyB0aGUgZXhhY3Qg
ZGlzcGxheSB0eXBlIHRoYXQgdGhleSBoYWQpCisJCQkJZm9yICggOyBpIDwgc3RhY2subGVuZ3Ro
OyBpKysgKQorCQkJCQlpZiAoIGNvbG9yKCBzdGFja1sgaSBdICkgKSB7CisJCQkJCQlzd2FwWyBp
IF0gPSBzdGFja1sgaSBdLnN0eWxlLmRpc3BsYXk7CisJCQkJCQlzdGFja1sgaSBdLnN0eWxlLmRp
c3BsYXkgPSAiYmxvY2siOworCQkJCQl9CisKKwkJCQkvLyBTaW5jZSB3ZSBmbGlwIHRoZSBkaXNw
bGF5IHN0eWxlLCB3ZSBoYXZlIHRvIGhhbmRsZSB0aGF0CisJCQkJLy8gb25lIHNwZWNpYWwsIG90
aGVyd2lzZSBnZXQgdGhlIHZhbHVlCisJCQkJcmV0ID0gbmFtZSA9PSAiZGlzcGxheSIgJiYgc3dh
cFsgc3RhY2subGVuZ3RoIC0gMSBdICE9IG51bGwgPworCQkJCQkibm9uZSIgOgorCQkJCQkoIGNv
bXB1dGVkU3R5bGUgJiYgY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCBuYW1lICkgKSB8
fCAiIjsKKworCQkJCS8vIEZpbmFsbHksIHJldmVydCB0aGUgZGlzcGxheSBzdHlsZXMgYmFjawor
CQkJCWZvciAoIGkgPSAwOyBpIDwgc3dhcC5sZW5ndGg7IGkrKyApCisJCQkJCWlmICggc3dhcFsg
aSBdICE9IG51bGwgKQorCQkJCQkJc3RhY2tbIGkgXS5zdHlsZS5kaXNwbGF5ID0gc3dhcFsgaSBd
OworCQkJfQorCisJCQkvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20g
b3BhY2l0eQorCQkJaWYgKCBuYW1lID09ICJvcGFjaXR5IiAmJiByZXQgPT0gIiIgKQorCQkJCXJl
dCA9ICIxIjsKKworCQl9IGVsc2UgaWYgKCBlbGVtLmN1cnJlbnRTdHlsZSApIHsKKwkJCXZhciBj
YW1lbENhc2UgPSBuYW1lLnJlcGxhY2UoL1wtKFx3KS9nLCBmdW5jdGlvbihhbGwsIGxldHRlcil7
CisJCQkJcmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpOworCQkJfSk7CisKKwkJCXJldCA9IGVs
ZW0uY3VycmVudFN0eWxlWyBuYW1lIF0gfHwgZWxlbS5jdXJyZW50U3R5bGVbIGNhbWVsQ2FzZSBd
OworCisJCQkvLyBGcm9tIHRoZSBhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzCisJCQkvLyBo
dHRwOi8vZXJpay5lYWUubmV0L2FyY2hpdmVzLzIwMDcvMDcvMjcvMTguNTQuMTUvI2NvbW1lbnQt
MTAyMjkxCisKKwkJCS8vIElmIHdlJ3JlIG5vdCBkZWFsaW5nIHdpdGggYSByZWd1bGFyIHBpeGVs
IG51bWJlcgorCQkJLy8gYnV0IGEgbnVtYmVyIHRoYXQgaGFzIGEgd2VpcmQgZW5kaW5nLCB3ZSBu
ZWVkIHRvIGNvbnZlcnQgaXQgdG8gcGl4ZWxzCisJCQlpZiAoICEvXlxkKyhweCk/JC9pLnRlc3Qo
IHJldCApICYmIC9eXGQvLnRlc3QoIHJldCApICkgeworCQkJCS8vIFJlbWVtYmVyIHRoZSBvcmln
aW5hbCB2YWx1ZXMKKwkJCQl2YXIgbGVmdCA9IHN0eWxlLmxlZnQsIHJzTGVmdCA9IGVsZW0ucnVu
dGltZVN0eWxlLmxlZnQ7CisKKwkJCQkvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEg
Y29tcHV0ZWQgdmFsdWUgb3V0CisJCQkJZWxlbS5ydW50aW1lU3R5bGUubGVmdCA9IGVsZW0uY3Vy
cmVudFN0eWxlLmxlZnQ7CisJCQkJc3R5bGUubGVmdCA9IHJldCB8fCAwOworCQkJCXJldCA9IHN0
eWxlLnBpeGVsTGVmdCArICJweCI7CisKKwkJCQkvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVz
CisJCQkJc3R5bGUubGVmdCA9IGxlZnQ7CisJCQkJZWxlbS5ydW50aW1lU3R5bGUubGVmdCA9IHJz
TGVmdDsKKwkJCX0KKwkJfQorCisJCXJldHVybiByZXQ7CisJfSwKKworCWNsZWFuOiBmdW5jdGlv
biggZWxlbXMsIGNvbnRleHQgKSB7CisJCXZhciByZXQgPSBbXTsKKwkJY29udGV4dCA9IGNvbnRl
eHQgfHwgZG9jdW1lbnQ7CisJCS8vICFjb250ZXh0LmNyZWF0ZUVsZW1lbnQgZmFpbHMgaW4gSUUg
d2l0aCBhbiBlcnJvciBidXQgcmV0dXJucyB0eXBlb2YgJ29iamVjdCcKKwkJaWYgKHR5cGVvZiBj
b250ZXh0LmNyZWF0ZUVsZW1lbnQgPT0gJ3VuZGVmaW5lZCcpCisJCQljb250ZXh0ID0gY29udGV4
dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHRbMF0gJiYgY29udGV4dFswXS5vd25lckRvY3VtZW50
IHx8IGRvY3VtZW50OworCisJCWpRdWVyeS5lYWNoKGVsZW1zLCBmdW5jdGlvbihpLCBlbGVtKXsK
KwkJCWlmICggIWVsZW0gKQorCQkJCXJldHVybjsKKworCQkJaWYgKCBlbGVtLmNvbnN0cnVjdG9y
ID09IE51bWJlciApCisJCQkJZWxlbSArPSAnJzsKKworCQkJLy8gQ29udmVydCBodG1sIHN0cmlu
ZyBpbnRvIERPTSBub2RlcworCQkJaWYgKCB0eXBlb2YgZWxlbSA9PSAic3RyaW5nIiApIHsKKwkJ
CQkvLyBGaXggIlhIVE1MIi1zdHlsZSB0YWdzIGluIGFsbCBicm93c2VycworCQkJCWVsZW0gPSBl
bGVtLnJlcGxhY2UoLyg8KFx3KylbXj5dKj8pXC8+L2csIGZ1bmN0aW9uKGFsbCwgZnJvbnQsIHRh
Zyl7CisJCQkJCXJldHVybiB0YWcubWF0Y2goL14oYWJicnxicnxjb2x8aW1nfGlucHV0fGxpbmt8
bWV0YXxwYXJhbXxocnxhcmVhfGVtYmVkKSQvaSkgPworCQkJCQkJYWxsIDoKKwkJCQkJCWZyb250
ICsgIj48LyIgKyB0YWcgKyAiPiI7CisJCQkJfSk7CisKKwkJCQkvLyBUcmltIHdoaXRlc3BhY2Us
IG90aGVyd2lzZSBpbmRleE9mIHdvbid0IHdvcmsgYXMgZXhwZWN0ZWQKKwkJCQl2YXIgdGFncyA9
IGpRdWVyeS50cmltKCBlbGVtICkudG9Mb3dlckNhc2UoKSwgZGl2ID0gY29udGV4dC5jcmVhdGVF
bGVtZW50KCJkaXYiKTsKKworCQkJCXZhciB3cmFwID0KKwkJCQkJLy8gb3B0aW9uIG9yIG9wdGdy
b3VwCisJCQkJCSF0YWdzLmluZGV4T2YoIjxvcHQiKSAmJgorCQkJCQlbIDEsICI8c2VsZWN0IG11
bHRpcGxlPSdtdWx0aXBsZSc+IiwgIjwvc2VsZWN0PiIgXSB8fAorCisJCQkJCSF0YWdzLmluZGV4
T2YoIjxsZWciKSAmJgorCQkJCQlbIDEsICI8ZmllbGRzZXQ+IiwgIjwvZmllbGRzZXQ+IiBdIHx8
CisKKwkJCQkJdGFncy5tYXRjaCgvXjwodGhlYWR8dGJvZHl8dGZvb3R8Y29sZ3xjYXApLykgJiYK
KwkJCQkJWyAxLCAiPHRhYmxlPiIsICI8L3RhYmxlPiIgXSB8fAorCisJCQkJCSF0YWdzLmluZGV4
T2YoIjx0ciIpICYmCisJCQkJCVsgMiwgIjx0YWJsZT48dGJvZHk+IiwgIjwvdGJvZHk+PC90YWJs
ZT4iIF0gfHwKKworCQkJCSAJLy8gPHRoZWFkPiBtYXRjaGVkIGFib3ZlCisJCQkJCSghdGFncy5p
bmRleE9mKCI8dGQiKSB8fCAhdGFncy5pbmRleE9mKCI8dGgiKSkgJiYKKwkJCQkJWyAzLCAiPHRh
YmxlPjx0Ym9keT48dHI+IiwgIjwvdHI+PC90Ym9keT48L3RhYmxlPiIgXSB8fAorCisJCQkJCSF0
YWdzLmluZGV4T2YoIjxjb2wiKSAmJgorCQkJCQlbIDIsICI8dGFibGU+PHRib2R5PjwvdGJvZHk+
PGNvbGdyb3VwPiIsICI8L2NvbGdyb3VwPjwvdGFibGU+IiBdIHx8CisKKwkJCQkJLy8gSUUgY2Fu
J3Qgc2VyaWFsaXplIDxsaW5rPiBhbmQgPHNjcmlwdD4gdGFncyBub3JtYWxseQorCQkJCQlqUXVl
cnkuYnJvd3Nlci5tc2llICYmCisJCQkJCVsgMSwgImRpdjxkaXY+IiwgIjwvZGl2PiIgXSB8fAor
CisJCQkJCVsgMCwgIiIsICIiIF07CisKKwkJCQkvLyBHbyB0byBodG1sIGFuZCBiYWNrLCB0aGVu
IHBlZWwgb2ZmIGV4dHJhIHdyYXBwZXJzCisJCQkJZGl2LmlubmVySFRNTCA9IHdyYXBbMV0gKyBl
bGVtICsgd3JhcFsyXTsKKworCQkJCS8vIE1vdmUgdG8gdGhlIHJpZ2h0IGRlcHRoCisJCQkJd2hp
bGUgKCB3cmFwWzBdLS0gKQorCQkJCQlkaXYgPSBkaXYubGFzdENoaWxkOworCisJCQkJLy8gUmVt
b3ZlIElFJ3MgYXV0b2luc2VydGVkIDx0Ym9keT4gZnJvbSB0YWJsZSBmcmFnbWVudHMKKwkJCQlp
ZiAoIGpRdWVyeS5icm93c2VyLm1zaWUgKSB7CisKKwkJCQkJLy8gU3RyaW5nIHdhcyBhIDx0YWJs
ZT4sICptYXkqIGhhdmUgc3B1cmlvdXMgPHRib2R5PgorCQkJCQl2YXIgdGJvZHkgPSAhdGFncy5p
bmRleE9mKCI8dGFibGUiKSAmJiB0YWdzLmluZGV4T2YoIjx0Ym9keSIpIDwgMCA/CisJCQkJCQlk
aXYuZmlyc3RDaGlsZCAmJiBkaXYuZmlyc3RDaGlsZC5jaGlsZE5vZGVzIDoKKworCQkJCQkJLy8g
U3RyaW5nIHdhcyBhIGJhcmUgPHRoZWFkPiBvciA8dGZvb3Q+CisJCQkJCQl3cmFwWzFdID09ICI8
dGFibGU+IiAmJiB0YWdzLmluZGV4T2YoIjx0Ym9keSIpIDwgMCA/CisJCQkJCQkJZGl2LmNoaWxk
Tm9kZXMgOgorCQkJCQkJCVtdOworCisJCQkJCWZvciAoIHZhciBqID0gdGJvZHkubGVuZ3RoIC0g
MTsgaiA+PSAwIDsgLS1qICkKKwkJCQkJCWlmICggalF1ZXJ5Lm5vZGVOYW1lKCB0Ym9keVsgaiBd
LCAidGJvZHkiICkgJiYgIXRib2R5WyBqIF0uY2hpbGROb2Rlcy5sZW5ndGggKQorCQkJCQkJCXRi
b2R5WyBqIF0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGJvZHlbIGogXSApOworCisJCQkJCS8v
IElFIGNvbXBsZXRlbHkga2lsbHMgbGVhZGluZyB3aGl0ZXNwYWNlIHdoZW4gaW5uZXJIVE1MIGlz
IHVzZWQKKwkJCQkJaWYgKCAvXlxzLy50ZXN0KCBlbGVtICkgKQorCQkJCQkJZGl2Lmluc2VydEJl
Zm9yZSggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbS5tYXRjaCgvXlxzKi8pWzBdICksIGRp
di5maXJzdENoaWxkICk7CisKKwkJCQl9CisKKwkJCQllbGVtID0galF1ZXJ5Lm1ha2VBcnJheSgg
ZGl2LmNoaWxkTm9kZXMgKTsKKwkJCX0KKworCQkJaWYgKCBlbGVtLmxlbmd0aCA9PT0gMCAmJiAo
IWpRdWVyeS5ub2RlTmFtZSggZWxlbSwgImZvcm0iICkgJiYgIWpRdWVyeS5ub2RlTmFtZSggZWxl
bSwgInNlbGVjdCIgKSkgKQorCQkJCXJldHVybjsKKworCQkJaWYgKCBlbGVtWzBdID09IHVuZGVm
aW5lZCB8fCBqUXVlcnkubm9kZU5hbWUoIGVsZW0sICJmb3JtIiApIHx8IGVsZW0ub3B0aW9ucyAp
CisJCQkJcmV0LnB1c2goIGVsZW0gKTsKKworCQkJZWxzZQorCQkJCXJldCA9IGpRdWVyeS5tZXJn
ZSggcmV0LCBlbGVtICk7CisKKwkJfSk7CisKKwkJcmV0dXJuIHJldDsKKwl9LAorCisJYXR0cjog
ZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkgeworCQkvLyBkb24ndCBzZXQgYXR0cmlidXRl
cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzCisJCWlmICghZWxlbSB8fCBlbGVtLm5vZGVUeXBl
ID09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PSA4KQorCQkJcmV0dXJuIHVuZGVmaW5lZDsKKworCQl2
YXIgbm90eG1sID0gIWpRdWVyeS5pc1hNTERvYyggZWxlbSApLAorCQkJLy8gV2hldGhlciB3ZSBh
cmUgc2V0dGluZyAob3IgZ2V0dGluZykKKwkJCXNldCA9IHZhbHVlICE9PSB1bmRlZmluZWQsCisJ
CQltc2llID0galF1ZXJ5LmJyb3dzZXIubXNpZTsKKworCQkvLyBUcnkgdG8gbm9ybWFsaXplL2Zp
eCB0aGUgbmFtZQorCQluYW1lID0gbm90eG1sICYmIGpRdWVyeS5wcm9wc1sgbmFtZSBdIHx8IG5h
bWU7CisKKwkJLy8gT25seSBkbyBhbGwgdGhlIGZvbGxvd2luZyBpZiB0aGlzIGlzIGEgbm9kZSAo
ZmFzdGVyIGZvciBzdHlsZSkKKwkJLy8gSUUgZWxlbS5nZXRBdHRyaWJ1dGUgcGFzc2VzIGV2ZW4g
Zm9yIHN0eWxlCisJCWlmICggZWxlbS50YWdOYW1lICkgeworCisJCQkvLyBUaGVzZSBhdHRyaWJ1
dGVzIHJlcXVpcmUgc3BlY2lhbCB0cmVhdG1lbnQKKwkJCXZhciBzcGVjaWFsID0gL2hyZWZ8c3Jj
fHN0eWxlLy50ZXN0KCBuYW1lICk7CisKKwkJCS8vIFNhZmFyaSBtaXMtcmVwb3J0cyB0aGUgZGVm
YXVsdCBzZWxlY3RlZCBwcm9wZXJ0eSBvZiBhIGhpZGRlbiBvcHRpb24KKwkJCS8vIEFjY2Vzc2lu
ZyB0aGUgcGFyZW50J3Mgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eSBmaXhlcyBpdAorCQkJaWYgKCBu
YW1lID09ICJzZWxlY3RlZCIgJiYgalF1ZXJ5LmJyb3dzZXIuc2FmYXJpICkKKwkJCQllbGVtLnBh
cmVudE5vZGUuc2VsZWN0ZWRJbmRleDsKKworCQkJLy8gSWYgYXBwbGljYWJsZSwgYWNjZXNzIHRo
ZSBhdHRyaWJ1dGUgdmlhIHRoZSBET00gMCB3YXkKKwkJCWlmICggbmFtZSBpbiBlbGVtICYmIG5v
dHhtbCAmJiAhc3BlY2lhbCApIHsKKwkJCQlpZiAoIHNldCApeworCQkJCQkvLyBXZSBjYW4ndCBh
bGxvdyB0aGUgdHlwZSBwcm9wZXJ0eSB0byBiZSBjaGFuZ2VkIChzaW5jZSBpdCBjYXVzZXMgcHJv
YmxlbXMgaW4gSUUpCisJCQkJCWlmICggbmFtZSA9PSAidHlwZSIgJiYgalF1ZXJ5Lm5vZGVOYW1l
KCBlbGVtLCAiaW5wdXQiICkgJiYgZWxlbS5wYXJlbnROb2RlICkKKwkJCQkJCXRocm93ICJ0eXBl
IHByb3BlcnR5IGNhbid0IGJlIGNoYW5nZWQiOworCisJCQkJCWVsZW1bIG5hbWUgXSA9IHZhbHVl
OworCQkJCX0KKworCQkJCS8vIGJyb3dzZXJzIGluZGV4IGVsZW1lbnRzIGJ5IGlkL25hbWUgb24g
Zm9ybXMsIGdpdmUgcHJpb3JpdHkgdG8gYXR0cmlidXRlcy4KKwkJCQlpZiggalF1ZXJ5Lm5vZGVO
YW1lKCBlbGVtLCAiZm9ybSIgKSAmJiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkgKQorCQkJ
CQlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkubm9kZVZhbHVlOworCisJCQkJ
cmV0dXJuIGVsZW1bIG5hbWUgXTsKKwkJCX0KKworCQkJaWYgKCBtc2llICYmIG5vdHhtbCAmJiAg
bmFtZSA9PSAic3R5bGUiICkKKwkJCQlyZXR1cm4galF1ZXJ5LmF0dHIoIGVsZW0uc3R5bGUsICJj
c3NUZXh0IiwgdmFsdWUgKTsKKworCQkJaWYgKCBzZXQgKQorCQkJCS8vIGNvbnZlcnQgdGhlIHZh
bHVlIHRvIGEgc3RyaW5nIChhbGwgYnJvd3NlcnMgZG8gdGhpcyBidXQgSUUpIHNlZSAjMTA3MAor
CQkJCWVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCAiIiArIHZhbHVlICk7CisKKwkJCXZhciBhdHRy
ID0gbXNpZSAmJiBub3R4bWwgJiYgc3BlY2lhbAorCQkJCQkvLyBTb21lIGF0dHJpYnV0ZXMgcmVx
dWlyZSBhIHNwZWNpYWwgY2FsbCBvbiBJRQorCQkJCQk/IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1l
LCAyICkKKwkJCQkJOiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApOworCisJCQkvLyBOb24tZXhp
c3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVuZGVmaW5lZAor
CQkJcmV0dXJuIGF0dHIgPT09IG51bGwgPyB1bmRlZmluZWQgOiBhdHRyOworCQl9CisKKwkJLy8g
ZWxlbSBpcyBhY3R1YWxseSBlbGVtLnN0eWxlIC4uLiBzZXQgdGhlIHN0eWxlCisKKwkJLy8gSUUg
dXNlcyBmaWx0ZXJzIGZvciBvcGFjaXR5CisJCWlmICggbXNpZSAmJiBuYW1lID09ICJvcGFjaXR5
IiApIHsKKwkJCWlmICggc2V0ICkgeworCQkJCS8vIElFIGhhcyB0cm91YmxlIHdpdGggb3BhY2l0
eSBpZiBpdCBkb2VzIG5vdCBoYXZlIGxheW91dAorCQkJCS8vIEZvcmNlIGl0IGJ5IHNldHRpbmcg
dGhlIHpvb20gbGV2ZWwKKwkJCQllbGVtLnpvb20gPSAxOworCisJCQkJLy8gU2V0IHRoZSBhbHBo
YSBmaWx0ZXIgdG8gc2V0IHRoZSBvcGFjaXR5CisJCQkJZWxlbS5maWx0ZXIgPSAoZWxlbS5maWx0
ZXIgfHwgIiIpLnJlcGxhY2UoIC9hbHBoYVwoW14pXSpcKS8sICIiICkgKworCQkJCQkocGFyc2VJ
bnQoIHZhbHVlICkgKyAnJyA9PSAiTmFOIiA/ICIiIDogImFscGhhKG9wYWNpdHk9IiArIHZhbHVl
ICogMTAwICsgIikiKTsKKwkJCX0KKworCQkJcmV0dXJuIGVsZW0uZmlsdGVyICYmIGVsZW0uZmls
dGVyLmluZGV4T2YoIm9wYWNpdHk9IikgPj0gMCA/CisJCQkJKHBhcnNlRmxvYXQoIGVsZW0uZmls
dGVyLm1hdGNoKC9vcGFjaXR5PShbXildKikvKVsxXSApIC8gMTAwKSArICcnOgorCQkJCSIiOwor
CQl9CisKKwkJbmFtZSA9IG5hbWUucmVwbGFjZSgvLShbYS16XSkvaWcsIGZ1bmN0aW9uKGFsbCwg
bGV0dGVyKXsKKwkJCXJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTsKKwkJfSk7CisKKwkJaWYg
KCBzZXQgKQorCQkJZWxlbVsgbmFtZSBdID0gdmFsdWU7CisKKwkJcmV0dXJuIGVsZW1bIG5hbWUg
XTsKKwl9LAorCisJdHJpbTogZnVuY3Rpb24oIHRleHQgKSB7CisJCXJldHVybiAodGV4dCB8fCAi
IikucmVwbGFjZSggL15ccyt8XHMrJC9nLCAiIiApOworCX0sCisKKwltYWtlQXJyYXk6IGZ1bmN0
aW9uKCBhcnJheSApIHsKKwkJdmFyIHJldCA9IFtdOworCisJCWlmKCBhcnJheSAhPSBudWxsICl7
CisJCQl2YXIgaSA9IGFycmF5Lmxlbmd0aDsKKwkJCS8vdGhlIHdpbmRvdywgc3RyaW5ncyBhbmQg
ZnVuY3Rpb25zIGFsc28gaGF2ZSAnbGVuZ3RoJworCQkJaWYoIGkgPT0gbnVsbCB8fCBhcnJheS5z
cGxpdCB8fCBhcnJheS5zZXRJbnRlcnZhbCB8fCBhcnJheS5jYWxsICkKKwkJCQlyZXRbMF0gPSBh
cnJheTsKKwkJCWVsc2UKKwkJCQl3aGlsZSggaSApCisJCQkJCXJldFstLWldID0gYXJyYXlbaV07
CisJCX0KKworCQlyZXR1cm4gcmV0OworCX0sCisKKwlpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwg
YXJyYXkgKSB7CisJCWZvciAoIHZhciBpID0gMCwgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOyBpIDwg
bGVuZ3RoOyBpKysgKQorCQkvLyBVc2UgPT09IGJlY2F1c2Ugb24gSUUsIHdpbmRvdyA9PSBkb2N1
bWVudAorCQkJaWYgKCBhcnJheVsgaSBdID09PSBlbGVtICkKKwkJCQlyZXR1cm4gaTsKKworCQly
ZXR1cm4gLTE7CisJfSwKKworCW1lcmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCApIHsKKwkJ
Ly8gV2UgaGF2ZSB0byBsb29wIHRoaXMgd2F5IGJlY2F1c2UgSUUgJiBPcGVyYSBvdmVyd3JpdGUg
dGhlIGxlbmd0aAorCQkvLyBleHBhbmRvIG9mIGdldEVsZW1lbnRzQnlUYWdOYW1lCisJCXZhciBp
ID0gMCwgZWxlbSwgcG9zID0gZmlyc3QubGVuZ3RoOworCQkvLyBBbHNvLCB3ZSBuZWVkIHRvIG1h
a2Ugc3VyZSB0aGF0IHRoZSBjb3JyZWN0IGVsZW1lbnRzIGFyZSBiZWluZyByZXR1cm5lZAorCQkv
LyAoSUUgcmV0dXJucyBjb21tZW50IG5vZGVzIGluIGEgJyonIHF1ZXJ5KQorCQlpZiAoIGpRdWVy
eS5icm93c2VyLm1zaWUgKSB7CisJCQl3aGlsZSAoIGVsZW0gPSBzZWNvbmRbIGkrKyBdICkKKwkJ
CQlpZiAoIGVsZW0ubm9kZVR5cGUgIT0gOCApCisJCQkJCWZpcnN0WyBwb3MrKyBdID0gZWxlbTsK
KworCQl9IGVsc2UKKwkJCXdoaWxlICggZWxlbSA9IHNlY29uZFsgaSsrIF0gKQorCQkJCWZpcnN0
WyBwb3MrKyBdID0gZWxlbTsKKworCQlyZXR1cm4gZmlyc3Q7CisJfSwKKworCXVuaXF1ZTogZnVu
Y3Rpb24oIGFycmF5ICkgeworCQl2YXIgcmV0ID0gW10sIGRvbmUgPSB7fTsKKworCQl0cnkgewor
CisJCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbmd0aDsg
aSsrICkgeworCQkJCXZhciBpZCA9IGpRdWVyeS5kYXRhKCBhcnJheVsgaSBdICk7CisKKwkJCQlp
ZiAoICFkb25lWyBpZCBdICkgeworCQkJCQlkb25lWyBpZCBdID0gdHJ1ZTsKKwkJCQkJcmV0LnB1
c2goIGFycmF5WyBpIF0gKTsKKwkJCQl9CisJCQl9CisKKwkJfSBjYXRjaCggZSApIHsKKwkJCXJl
dCA9IGFycmF5OworCQl9CisKKwkJcmV0dXJuIHJldDsKKwl9LAorCisJZ3JlcDogZnVuY3Rpb24o
IGVsZW1zLCBjYWxsYmFjaywgaW52ICkgeworCQl2YXIgcmV0ID0gW107CisKKwkJLy8gR28gdGhy
b3VnaCB0aGUgYXJyYXksIG9ubHkgc2F2aW5nIHRoZSBpdGVtcworCQkvLyB0aGF0IHBhc3MgdGhl
IHZhbGlkYXRvciBmdW5jdGlvbgorCQlmb3IgKCB2YXIgaSA9IDAsIGxlbmd0aCA9IGVsZW1zLmxl
bmd0aDsgaSA8IGxlbmd0aDsgaSsrICkKKwkJCWlmICggIWludiAhPSAhY2FsbGJhY2soIGVsZW1z
WyBpIF0sIGkgKSApCisJCQkJcmV0LnB1c2goIGVsZW1zWyBpIF0gKTsKKworCQlyZXR1cm4gcmV0
OworCX0sCisKKwltYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2sgKSB7CisJCXZhciByZXQg
PSBbXTsKKworCQkvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0
aGUgaXRlbXMgdG8gdGhlaXIKKwkJLy8gbmV3IHZhbHVlIChvciB2YWx1ZXMpLgorCQlmb3IgKCB2
YXIgaSA9IDAsIGxlbmd0aCA9IGVsZW1zLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkgeworCQkJ
dmFyIHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGkgKTsKKworCQkJaWYgKCB2YWx1ZSAh
PSBudWxsICkKKwkJCQlyZXRbIHJldC5sZW5ndGggXSA9IHZhbHVlOworCQl9CisKKwkJcmV0dXJu
IHJldC5jb25jYXQuYXBwbHkoIFtdLCByZXQgKTsKKwl9Cit9KTsKKwordmFyIHVzZXJBZ2VudCA9
IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsKKworLy8gRmlndXJlIG91dCB3aGF0
IGJyb3dzZXIgaXMgYmVpbmcgdXNlZAoralF1ZXJ5LmJyb3dzZXIgPSB7CisJdmVyc2lvbjogKHVz
ZXJBZ2VudC5tYXRjaCggLy4rKD86cnZ8aXR8cmF8aWUpW1wvOiBdKFtcZC5dKykvICkgfHwgW10p
WzFdLAorCXNhZmFyaTogL3dlYmtpdC8udGVzdCggdXNlckFnZW50ICksCisJb3BlcmE6IC9vcGVy
YS8udGVzdCggdXNlckFnZW50ICksCisJbXNpZTogL21zaWUvLnRlc3QoIHVzZXJBZ2VudCApICYm
ICEvb3BlcmEvLnRlc3QoIHVzZXJBZ2VudCApLAorCW1vemlsbGE6IC9tb3ppbGxhLy50ZXN0KCB1
c2VyQWdlbnQgKSAmJiAhLyhjb21wYXRpYmxlfHdlYmtpdCkvLnRlc3QoIHVzZXJBZ2VudCApCit9
OworCit2YXIgc3R5bGVGbG9hdCA9IGpRdWVyeS5icm93c2VyLm1zaWUgPworCSJzdHlsZUZsb2F0
IiA6CisJImNzc0Zsb2F0IjsKKworalF1ZXJ5LmV4dGVuZCh7CisJLy8gQ2hlY2sgdG8gc2VlIGlm
IHRoZSBXM0MgYm94IG1vZGVsIGlzIGJlaW5nIHVzZWQKKwlib3hNb2RlbDogIWpRdWVyeS5icm93
c2VyLm1zaWUgfHwgZG9jdW1lbnQuY29tcGF0TW9kZSA9PSAiQ1NTMUNvbXBhdCIsCisKKwlwcm9w
czogeworCQkiZm9yIjogImh0bWxGb3IiLAorCQkiY2xhc3MiOiAiY2xhc3NOYW1lIiwKKwkJImZs
b2F0Ijogc3R5bGVGbG9hdCwKKwkJY3NzRmxvYXQ6IHN0eWxlRmxvYXQsCisJCXN0eWxlRmxvYXQ6
IHN0eWxlRmxvYXQsCisJCXJlYWRvbmx5OiAicmVhZE9ubHkiLAorCQltYXhsZW5ndGg6ICJtYXhM
ZW5ndGgiLAorCQljZWxsc3BhY2luZzogImNlbGxTcGFjaW5nIgorCX0KK30pOworCitqUXVlcnku
ZWFjaCh7CisJcGFyZW50OiBmdW5jdGlvbihlbGVtKXtyZXR1cm4gZWxlbS5wYXJlbnROb2RlO30s
CisJcGFyZW50czogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5kaXIoZWxlbSwicGFyZW50
Tm9kZSIpO30sCisJbmV4dDogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5udGgoZWxlbSwy
LCJuZXh0U2libGluZyIpO30sCisJcHJldjogZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5u
dGgoZWxlbSwyLCJwcmV2aW91c1NpYmxpbmciKTt9LAorCW5leHRBbGw6IGZ1bmN0aW9uKGVsZW0p
e3JldHVybiBqUXVlcnkuZGlyKGVsZW0sIm5leHRTaWJsaW5nIik7fSwKKwlwcmV2QWxsOiBmdW5j
dGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LmRpcihlbGVtLCJwcmV2aW91c1NpYmxpbmciKTt9LAor
CXNpYmxpbmdzOiBmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5LnNpYmxpbmcoZWxlbS5wYXJl
bnROb2RlLmZpcnN0Q2hpbGQsZWxlbSk7fSwKKwljaGlsZHJlbjogZnVuY3Rpb24oZWxlbSl7cmV0
dXJuIGpRdWVyeS5zaWJsaW5nKGVsZW0uZmlyc3RDaGlsZCk7fSwKKwljb250ZW50czogZnVuY3Rp
b24oZWxlbSl7cmV0dXJuIGpRdWVyeS5ub2RlTmFtZShlbGVtLCJpZnJhbWUiKT9lbGVtLmNvbnRl
bnREb2N1bWVudHx8ZWxlbS5jb250ZW50V2luZG93LmRvY3VtZW50OmpRdWVyeS5tYWtlQXJyYXko
ZWxlbS5jaGlsZE5vZGVzKTt9Cit9LCBmdW5jdGlvbihuYW1lLCBmbil7CisJalF1ZXJ5LmZuWyBu
YW1lIF0gPSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJCXZhciByZXQgPSBqUXVlcnkubWFwKCB0
aGlzLCBmbiApOworCisJCWlmICggc2VsZWN0b3IgJiYgdHlwZW9mIHNlbGVjdG9yID09ICJzdHJp
bmciICkKKwkJCXJldCA9IGpRdWVyeS5tdWx0aUZpbHRlciggc2VsZWN0b3IsIHJldCApOworCisJ
CXJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5LnVuaXF1ZSggcmV0ICkgKTsKKwl9OworfSk7
CisKK2pRdWVyeS5lYWNoKHsKKwlhcHBlbmRUbzogImFwcGVuZCIsCisJcHJlcGVuZFRvOiAicHJl
cGVuZCIsCisJaW5zZXJ0QmVmb3JlOiAiYmVmb3JlIiwKKwlpbnNlcnRBZnRlcjogImFmdGVyIiwK
KwlyZXBsYWNlQWxsOiAicmVwbGFjZVdpdGgiCit9LCBmdW5jdGlvbihuYW1lLCBvcmlnaW5hbCl7
CisJalF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbigpIHsKKwkJdmFyIGFyZ3MgPSBhcmd1bWVu
dHM7CisKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeworCQkJZm9yICggdmFyIGkgPSAw
LCBsZW5ndGggPSBhcmdzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrICkKKwkJCQlqUXVlcnkoIGFy
Z3NbIGkgXSApWyBvcmlnaW5hbCBdKCB0aGlzICk7CisJCX0pOworCX07Cit9KTsKKworalF1ZXJ5
LmVhY2goeworCXJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkgeworCQlqUXVlcnkuYXR0cigg
dGhpcywgbmFtZSwgIiIgKTsKKwkJaWYgKHRoaXMubm9kZVR5cGUgPT0gMSkKKwkJCXRoaXMucmVt
b3ZlQXR0cmlidXRlKCBuYW1lICk7CisJfSwKKworCWFkZENsYXNzOiBmdW5jdGlvbiggY2xhc3NO
YW1lcyApIHsKKwkJalF1ZXJ5LmNsYXNzTmFtZS5hZGQoIHRoaXMsIGNsYXNzTmFtZXMgKTsKKwl9
LAorCisJcmVtb3ZlQ2xhc3M6IGZ1bmN0aW9uKCBjbGFzc05hbWVzICkgeworCQlqUXVlcnkuY2xh
c3NOYW1lLnJlbW92ZSggdGhpcywgY2xhc3NOYW1lcyApOworCX0sCisKKwl0b2dnbGVDbGFzczog
ZnVuY3Rpb24oIGNsYXNzTmFtZXMgKSB7CisJCWpRdWVyeS5jbGFzc05hbWVbIGpRdWVyeS5jbGFz
c05hbWUuaGFzKCB0aGlzLCBjbGFzc05hbWVzICkgPyAicmVtb3ZlIiA6ICJhZGQiIF0oIHRoaXMs
IGNsYXNzTmFtZXMgKTsKKwl9LAorCisJcmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7CisJ
CWlmICggIXNlbGVjdG9yIHx8IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCBbIHRoaXMgXSApLnIu
bGVuZ3RoICkgeworCQkJLy8gUHJldmVudCBtZW1vcnkgbGVha3MKKwkJCWpRdWVyeSggIioiLCB0
aGlzICkuYWRkKHRoaXMpLmVhY2goZnVuY3Rpb24oKXsKKwkJCQlqUXVlcnkuZXZlbnQucmVtb3Zl
KHRoaXMpOworCQkJCWpRdWVyeS5yZW1vdmVEYXRhKHRoaXMpOworCQkJfSk7CisJCQlpZiAodGhp
cy5wYXJlbnROb2RlKQorCQkJCXRoaXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggdGhpcyApOwor
CQl9CisJfSwKKworCWVtcHR5OiBmdW5jdGlvbigpIHsKKwkJLy8gUmVtb3ZlIGVsZW1lbnQgbm9k
ZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzCisJCWpRdWVyeSggIj4qIiwgdGhpcyApLnJlbW92
ZSgpOworCisJCS8vIFJlbW92ZSBhbnkgcmVtYWluaW5nIG5vZGVzCisJCXdoaWxlICggdGhpcy5m
aXJzdENoaWxkICkKKwkJCXRoaXMucmVtb3ZlQ2hpbGQoIHRoaXMuZmlyc3RDaGlsZCApOworCX0K
K30sIGZ1bmN0aW9uKG5hbWUsIGZuKXsKKwlqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCl7
CisJCXJldHVybiB0aGlzLmVhY2goIGZuLCBhcmd1bWVudHMgKTsKKwl9OworfSk7CisKK2pRdWVy
eS5lYWNoKFsgIkhlaWdodCIsICJXaWR0aCIgXSwgZnVuY3Rpb24oaSwgbmFtZSl7CisJdmFyIHR5
cGUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisKKwlqUXVlcnkuZm5bIHR5cGUgXSA9IGZ1bmN0aW9u
KCBzaXplICkgeworCQkvLyBHZXQgd2luZG93IHdpZHRoIG9yIGhlaWdodAorCQlyZXR1cm4gdGhp
c1swXSA9PSB3aW5kb3cgPworCQkJLy8gT3BlcmEgcmVwb3J0cyBkb2N1bWVudC5ib2R5LmNsaWVu
dFtXaWR0aC9IZWlnaHRdIHByb3Blcmx5IGluIGJvdGggcXVpcmtzIGFuZCBzdGFuZGFyZHMKKwkJ
CWpRdWVyeS5icm93c2VyLm9wZXJhICYmIGRvY3VtZW50LmJvZHlbICJjbGllbnQiICsgbmFtZSBd
IHx8CisKKwkJCS8vIFNhZmFyaSByZXBvcnRzIGlubmVyW1dpZHRoL0hlaWdodF0ganVzdCBmaW5l
IChNb3ppbGxhIGFuZCBPcGVyYSBpbmNsdWRlIHNjcm9sbCBiYXIgd2lkdGhzKQorCQkJalF1ZXJ5
LmJyb3dzZXIuc2FmYXJpICYmIHdpbmRvd1sgImlubmVyIiArIG5hbWUgXSB8fAorCisJCQkvLyBF
dmVyeW9uZSBlbHNlIHVzZSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgb3IgZG9jdW1lbnQuYm9k
eSBkZXBlbmRpbmcgb24gUXVpcmtzIHZzIFN0YW5kYXJkcyBtb2RlCisJCQlkb2N1bWVudC5jb21w
YXRNb2RlID09ICJDU1MxQ29tcGF0IiAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbICJjbGll
bnQiICsgbmFtZSBdIHx8IGRvY3VtZW50LmJvZHlbICJjbGllbnQiICsgbmFtZSBdIDoKKworCQkJ
Ly8gR2V0IGRvY3VtZW50IHdpZHRoIG9yIGhlaWdodAorCQkJdGhpc1swXSA9PSBkb2N1bWVudCA/
CisJCQkJLy8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWln
aHRdLCB3aGljaGV2ZXIgaXMgZ3JlYXRlcgorCQkJCU1hdGgubWF4KAorCQkJCQlNYXRoLm1heChk
b2N1bWVudC5ib2R5WyJzY3JvbGwiICsgbmFtZV0sIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsi
c2Nyb2xsIiArIG5hbWVdKSwKKwkJCQkJTWF0aC5tYXgoZG9jdW1lbnQuYm9keVsib2Zmc2V0IiAr
IG5hbWVdLCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIm9mZnNldCIgKyBuYW1lXSkKKwkJCQkp
IDoKKworCQkJCS8vIEdldCBvciBzZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRoZSBlbGVtZW50CisJ
CQkJc2l6ZSA9PSB1bmRlZmluZWQgPworCQkJCQkvLyBHZXQgd2lkdGggb3IgaGVpZ2h0IG9uIHRo
ZSBlbGVtZW50CisJCQkJCSh0aGlzLmxlbmd0aCA/IGpRdWVyeS5jc3MoIHRoaXNbMF0sIHR5cGUg
KSA6IG51bGwpIDoKKworCQkJCQkvLyBTZXQgdGhlIHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxl
bWVudCAoZGVmYXVsdCB0byBwaXhlbHMgaWYgdmFsdWUgaXMgdW5pdGxlc3MpCisJCQkJCXRoaXMu
Y3NzKCB0eXBlLCBzaXplLmNvbnN0cnVjdG9yID09IFN0cmluZyA/IHNpemUgOiBzaXplICsgInB4
IiApOworCX07Cit9KTsKKworLy8gSGVscGVyIGZ1bmN0aW9uIHVzZWQgYnkgdGhlIGRpbWVuc2lv
bnMgYW5kIG9mZnNldCBtb2R1bGVzCitmdW5jdGlvbiBudW0oZWxlbSwgcHJvcCkgeworCXJldHVy
biBlbGVtWzBdICYmIHBhcnNlSW50KCBqUXVlcnkuY3VyQ1NTKGVsZW1bMF0sIHByb3AsIHRydWUp
LCAxMCApIHx8IDA7Cit9dmFyIGNoYXJzID0galF1ZXJ5LmJyb3dzZXIuc2FmYXJpICYmIHBhcnNl
SW50KGpRdWVyeS5icm93c2VyLnZlcnNpb24pIDwgNDE3ID8KKwkJIig/OltcXHcqXy1dfFxcXFwu
KSIgOgorCQkiKD86W1xcd1x1MDEyOC1cdUZGRkYqXy1dfFxcXFwuKSIsCisJcXVpY2tDaGlsZCA9
IG5ldyBSZWdFeHAoIl4+XFxzKigiICsgY2hhcnMgKyAiKykiKSwKKwlxdWlja0lEID0gbmV3IFJl
Z0V4cCgiXigiICsgY2hhcnMgKyAiKykoIykoIiArIGNoYXJzICsgIispIiksCisJcXVpY2tDbGFz
cyA9IG5ldyBSZWdFeHAoIl4oWyMuXT8pKCIgKyBjaGFycyArICIqKSIpOworCitqUXVlcnkuZXh0
ZW5kKHsKKwlleHByOiB7CisJCSIiOiBmdW5jdGlvbihhLGksbSl7cmV0dXJuIG1bMl09PSIqInx8
alF1ZXJ5Lm5vZGVOYW1lKGEsbVsyXSk7fSwKKwkJIiMiOiBmdW5jdGlvbihhLGksbSl7cmV0dXJu
IGEuZ2V0QXR0cmlidXRlKCJpZCIpPT1tWzJdO30sCisJCSI6IjogeworCQkJLy8gUG9zaXRpb24g
Q2hlY2tzCisJCQlsdDogZnVuY3Rpb24oYSxpLG0pe3JldHVybiBpPG1bM10tMDt9LAorCQkJZ3Q6
IGZ1bmN0aW9uKGEsaSxtKXtyZXR1cm4gaT5tWzNdLTA7fSwKKwkJCW50aDogZnVuY3Rpb24oYSxp
LG0pe3JldHVybiBtWzNdLTA9PWk7fSwKKwkJCWVxOiBmdW5jdGlvbihhLGksbSl7cmV0dXJuIG1b
M10tMD09aTt9LAorCQkJZmlyc3Q6IGZ1bmN0aW9uKGEsaSl7cmV0dXJuIGk9PTA7fSwKKwkJCWxh
c3Q6IGZ1bmN0aW9uKGEsaSxtLHIpe3JldHVybiBpPT1yLmxlbmd0aC0xO30sCisJCQlldmVuOiBm
dW5jdGlvbihhLGkpe3JldHVybiBpJTI9PTA7fSwKKwkJCW9kZDogZnVuY3Rpb24oYSxpKXtyZXR1
cm4gaSUyO30sCisKKwkJCS8vIENoaWxkIENoZWNrcworCQkJImZpcnN0LWNoaWxkIjogZnVuY3Rp
b24oYSl7cmV0dXJuIGEucGFyZW50Tm9kZS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiKiIpWzBdPT1h
O30sCisJCQkibGFzdC1jaGlsZCI6IGZ1bmN0aW9uKGEpe3JldHVybiBqUXVlcnkubnRoKGEucGFy
ZW50Tm9kZS5sYXN0Q2hpbGQsMSwicHJldmlvdXNTaWJsaW5nIik9PWE7fSwKKwkJCSJvbmx5LWNo
aWxkIjogZnVuY3Rpb24oYSl7cmV0dXJuICFqUXVlcnkubnRoKGEucGFyZW50Tm9kZS5sYXN0Q2hp
bGQsMiwicHJldmlvdXNTaWJsaW5nIik7fSwKKworCQkJLy8gUGFyZW50IENoZWNrcworCQkJcGFy
ZW50OiBmdW5jdGlvbihhKXtyZXR1cm4gYS5maXJzdENoaWxkO30sCisJCQllbXB0eTogZnVuY3Rp
b24oYSl7cmV0dXJuICFhLmZpcnN0Q2hpbGQ7fSwKKworCQkJLy8gVGV4dCBDaGVjaworCQkJY29u
dGFpbnM6IGZ1bmN0aW9uKGEsaSxtKXtyZXR1cm4gKGEudGV4dENvbnRlbnR8fGEuaW5uZXJUZXh0
fHxqUXVlcnkoYSkudGV4dCgpfHwiIikuaW5kZXhPZihtWzNdKT49MDt9LAorCisJCQkvLyBWaXNp
YmlsaXR5CisJCQl2aXNpYmxlOiBmdW5jdGlvbihhKXtyZXR1cm4gImhpZGRlbiIhPWEudHlwZSYm
alF1ZXJ5LmNzcyhhLCJkaXNwbGF5IikhPSJub25lIiYmalF1ZXJ5LmNzcyhhLCJ2aXNpYmlsaXR5
IikhPSJoaWRkZW4iO30sCisJCQloaWRkZW46IGZ1bmN0aW9uKGEpe3JldHVybiAiaGlkZGVuIj09
YS50eXBlfHxqUXVlcnkuY3NzKGEsImRpc3BsYXkiKT09Im5vbmUifHxqUXVlcnkuY3NzKGEsInZp
c2liaWxpdHkiKT09ImhpZGRlbiI7fSwKKworCQkJLy8gRm9ybSBhdHRyaWJ1dGVzCisJCQllbmFi
bGVkOiBmdW5jdGlvbihhKXtyZXR1cm4gIWEuZGlzYWJsZWQ7fSwKKwkJCWRpc2FibGVkOiBmdW5j
dGlvbihhKXtyZXR1cm4gYS5kaXNhYmxlZDt9LAorCQkJY2hlY2tlZDogZnVuY3Rpb24oYSl7cmV0
dXJuIGEuY2hlY2tlZDt9LAorCQkJc2VsZWN0ZWQ6IGZ1bmN0aW9uKGEpe3JldHVybiBhLnNlbGVj
dGVkfHxqUXVlcnkuYXR0cihhLCJzZWxlY3RlZCIpO30sCisKKwkJCS8vIEZvcm0gZWxlbWVudHMK
KwkJCXRleHQ6IGZ1bmN0aW9uKGEpe3JldHVybiAidGV4dCI9PWEudHlwZTt9LAorCQkJcmFkaW86
IGZ1bmN0aW9uKGEpe3JldHVybiAicmFkaW8iPT1hLnR5cGU7fSwKKwkJCWNoZWNrYm94OiBmdW5j
dGlvbihhKXtyZXR1cm4gImNoZWNrYm94Ij09YS50eXBlO30sCisJCQlmaWxlOiBmdW5jdGlvbihh
KXtyZXR1cm4gImZpbGUiPT1hLnR5cGU7fSwKKwkJCXBhc3N3b3JkOiBmdW5jdGlvbihhKXtyZXR1
cm4gInBhc3N3b3JkIj09YS50eXBlO30sCisJCQlzdWJtaXQ6IGZ1bmN0aW9uKGEpe3JldHVybiAi
c3VibWl0Ij09YS50eXBlO30sCisJCQlpbWFnZTogZnVuY3Rpb24oYSl7cmV0dXJuICJpbWFnZSI9
PWEudHlwZTt9LAorCQkJcmVzZXQ6IGZ1bmN0aW9uKGEpe3JldHVybiAicmVzZXQiPT1hLnR5cGU7
fSwKKwkJCWJ1dHRvbjogZnVuY3Rpb24oYSl7cmV0dXJuICJidXR0b24iPT1hLnR5cGV8fGpRdWVy
eS5ub2RlTmFtZShhLCJidXR0b24iKTt9LAorCQkJaW5wdXQ6IGZ1bmN0aW9uKGEpe3JldHVybiAv
aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbi9pLnRlc3QoYS5ub2RlTmFtZSk7fSwKKworCQkJ
Ly8gOmhhcygpCisJCQloYXM6IGZ1bmN0aW9uKGEsaSxtKXtyZXR1cm4galF1ZXJ5LmZpbmQobVsz
XSxhKS5sZW5ndGg7fSwKKworCQkJLy8gOmhlYWRlcgorCQkJaGVhZGVyOiBmdW5jdGlvbihhKXty
ZXR1cm4gL2hcZC9pLnRlc3QoYS5ub2RlTmFtZSk7fSwKKworCQkJLy8gOmFuaW1hdGVkCisJCQlh
bmltYXRlZDogZnVuY3Rpb24oYSl7cmV0dXJuIGpRdWVyeS5ncmVwKGpRdWVyeS50aW1lcnMsZnVu
Y3Rpb24oZm4pe3JldHVybiBhPT1mbi5lbGVtO30pLmxlbmd0aDt9CisJCX0KKwl9LAorCisJLy8g
VGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgdGhhdCBwb3dlciB0aGUgcGFyc2luZyBlbmdpbmUKKwlw
YXJzZTogWworCQkvLyBNYXRjaDogW0B2YWx1ZT0ndGVzdCddLCBbQGZvb10KKwkJL14oXFspICpA
PyhbXHctXSspICooWyEqJF5+PV0qKSAqKCc/Ij8pKC4qPylcNCAqXF0vLAorCisJCS8vIE1hdGNo
OiA6Y29udGFpbnMoJ2ZvbycpCisJCS9eKDopKFtcdy1dKylcKCI/Jz8oLio/KFwoLio/XCkpP1te
KF0qPykiPyc/XCkvLAorCisJCS8vIE1hdGNoOiA6ZXZlbiwgOmxhc3QtY2hpbGQsICNpZCwgLmNs
YXNzCisJCW5ldyBSZWdFeHAoIl4oWzouI10qKSgiICsgY2hhcnMgKyAiKykiKQorCV0sCisKKwlt
dWx0aUZpbHRlcjogZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7CisJCXZhciBvbGQsIGN1
ciA9IFtdOworCisJCXdoaWxlICggZXhwciAmJiBleHByICE9IG9sZCApIHsKKwkJCW9sZCA9IGV4
cHI7CisJCQl2YXIgZiA9IGpRdWVyeS5maWx0ZXIoIGV4cHIsIGVsZW1zLCBub3QgKTsKKwkJCWV4
cHIgPSBmLnQucmVwbGFjZSgvXlxzKixccyovLCAiIiApOworCQkJY3VyID0gbm90ID8gZWxlbXMg
PSBmLnIgOiBqUXVlcnkubWVyZ2UoIGN1ciwgZi5yICk7CisJCX0KKworCQlyZXR1cm4gY3VyOwor
CX0sCisKKwlmaW5kOiBmdW5jdGlvbiggdCwgY29udGV4dCApIHsKKwkJLy8gUXVpY2tseSBoYW5k
bGUgbm9uLXN0cmluZyBleHByZXNzaW9ucworCQlpZiAoIHR5cGVvZiB0ICE9ICJzdHJpbmciICkK
KwkJCXJldHVybiBbIHQgXTsKKworCQkvLyBjaGVjayB0byBtYWtlIHN1cmUgY29udGV4dCBpcyBh
IERPTSBlbGVtZW50IG9yIGEgZG9jdW1lbnQKKwkJaWYgKCBjb250ZXh0ICYmIGNvbnRleHQubm9k
ZVR5cGUgIT0gMSAmJiBjb250ZXh0Lm5vZGVUeXBlICE9IDkpCisJCQlyZXR1cm4gWyBdOworCisJ
CS8vIFNldCB0aGUgY29ycmVjdCBjb250ZXh0IChpZiBub25lIGlzIHByb3ZpZGVkKQorCQljb250
ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDsKKworCQkvLyBJbml0aWFsaXplIHRoZSBzZWFyY2gK
KwkJdmFyIHJldCA9IFtjb250ZXh0XSwgZG9uZSA9IFtdLCBsYXN0LCBub2RlTmFtZTsKKworCQkv
LyBDb250aW51ZSB3aGlsZSBhIHNlbGVjdG9yIGV4cHJlc3Npb24gZXhpc3RzLCBhbmQgd2hpbGUK
KwkJLy8gd2UncmUgbm8gbG9uZ2VyIGxvb3BpbmcgdXBvbiBvdXJzZWx2ZXMKKwkJd2hpbGUgKCB0
ICYmIGxhc3QgIT0gdCApIHsKKwkJCXZhciByID0gW107CisJCQlsYXN0ID0gdDsKKworCQkJdCA9
IGpRdWVyeS50cmltKHQpOworCisJCQl2YXIgZm91bmRUb2tlbiA9IGZhbHNlLAorCisJCQkvLyBB
biBhdHRlbXB0IGF0IHNwZWVkaW5nIHVwIGNoaWxkIHNlbGVjdG9ycyB0aGF0CisJCQkvLyBwb2lu
dCB0byBhIHNwZWNpZmljIGVsZW1lbnQgdGFnCisJCQkJcmUgPSBxdWlja0NoaWxkLAorCisJCQkJ
bSA9IHJlLmV4ZWModCk7CisKKwkJCWlmICggbSApIHsKKwkJCQlub2RlTmFtZSA9IG1bMV0udG9V
cHBlckNhc2UoKTsKKworCQkJCS8vIFBlcmZvcm0gb3VyIG93biBpdGVyYXRpb24gYW5kIGZpbHRl
cgorCQkJCWZvciAoIHZhciBpID0gMDsgcmV0W2ldOyBpKysgKQorCQkJCQlmb3IgKCB2YXIgYyA9
IHJldFtpXS5maXJzdENoaWxkOyBjOyBjID0gYy5uZXh0U2libGluZyApCisJCQkJCQlpZiAoIGMu
bm9kZVR5cGUgPT0gMSAmJiAobm9kZU5hbWUgPT0gIioiIHx8IGMubm9kZU5hbWUudG9VcHBlckNh
c2UoKSA9PSBub2RlTmFtZSkgKQorCQkJCQkJCXIucHVzaCggYyApOworCisJCQkJcmV0ID0gcjsK
KwkJCQl0ID0gdC5yZXBsYWNlKCByZSwgIiIgKTsKKwkJCQlpZiAoIHQuaW5kZXhPZigiICIpID09
IDAgKSBjb250aW51ZTsKKwkJCQlmb3VuZFRva2VuID0gdHJ1ZTsKKwkJCX0gZWxzZSB7CisJCQkJ
cmUgPSAvXihbPit+XSlccyooXHcqKS9pOworCisJCQkJaWYgKCAobSA9IHJlLmV4ZWModCkpICE9
IG51bGwgKSB7CisJCQkJCXIgPSBbXTsKKworCQkJCQl2YXIgbWVyZ2UgPSB7fTsKKwkJCQkJbm9k
ZU5hbWUgPSBtWzJdLnRvVXBwZXJDYXNlKCk7CisJCQkJCW0gPSBtWzFdOworCisJCQkJCWZvciAo
IHZhciBqID0gMCwgcmwgPSByZXQubGVuZ3RoOyBqIDwgcmw7IGorKyApIHsKKwkJCQkJCXZhciBu
ID0gbSA9PSAifiIgfHwgbSA9PSAiKyIgPyByZXRbal0ubmV4dFNpYmxpbmcgOiByZXRbal0uZmly
c3RDaGlsZDsKKwkJCQkJCWZvciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKQorCQkJCQkJCWlm
ICggbi5ub2RlVHlwZSA9PSAxICkgeworCQkJCQkJCQl2YXIgaWQgPSBqUXVlcnkuZGF0YShuKTsK
KworCQkJCQkJCQlpZiAoIG0gPT0gIn4iICYmIG1lcmdlW2lkXSApIGJyZWFrOworCisJCQkJCQkJ
CWlmICghbm9kZU5hbWUgfHwgbi5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09IG5vZGVOYW1lICkg
eworCQkJCQkJCQkJaWYgKCBtID09ICJ+IiApIG1lcmdlW2lkXSA9IHRydWU7CisJCQkJCQkJCQly
LnB1c2goIG4gKTsKKwkJCQkJCQkJfQorCisJCQkJCQkJCWlmICggbSA9PSAiKyIgKSBicmVhazsK
KwkJCQkJCQl9CisJCQkJCX0KKworCQkJCQlyZXQgPSByOworCisJCQkJCS8vIEFuZCByZW1vdmUg
dGhlIHRva2VuCisJCQkJCXQgPSBqUXVlcnkudHJpbSggdC5yZXBsYWNlKCByZSwgIiIgKSApOwor
CQkJCQlmb3VuZFRva2VuID0gdHJ1ZTsKKwkJCQl9CisJCQl9CisKKwkJCS8vIFNlZSBpZiB0aGVy
ZSdzIHN0aWxsIGFuIGV4cHJlc3Npb24sIGFuZCB0aGF0IHdlIGhhdmVuJ3QgYWxyZWFkeQorCQkJ
Ly8gbWF0Y2hlZCBhIHRva2VuCisJCQlpZiAoIHQgJiYgIWZvdW5kVG9rZW4gKSB7CisJCQkJLy8g
SGFuZGxlIG11bHRpcGxlIGV4cHJlc3Npb25zCisJCQkJaWYgKCAhdC5pbmRleE9mKCIsIikgKSB7
CisJCQkJCS8vIENsZWFuIHRoZSByZXN1bHQgc2V0CisJCQkJCWlmICggY29udGV4dCA9PSByZXRb
MF0gKSByZXQuc2hpZnQoKTsKKworCQkJCQkvLyBNZXJnZSB0aGUgcmVzdWx0IHNldHMKKwkJCQkJ
ZG9uZSA9IGpRdWVyeS5tZXJnZSggZG9uZSwgcmV0ICk7CisKKwkJCQkJLy8gUmVzZXQgdGhlIGNv
bnRleHQKKwkJCQkJciA9IHJldCA9IFtjb250ZXh0XTsKKworCQkJCQkvLyBUb3VjaCB1cCB0aGUg
c2VsZWN0b3Igc3RyaW5nCisJCQkJCXQgPSAiICIgKyB0LnN1YnN0cigxLHQubGVuZ3RoKTsKKwor
CQkJCX0gZWxzZSB7CisJCQkJCS8vIE9wdGltaXplIGZvciB0aGUgY2FzZSBub2RlTmFtZSNpZE5h
bWUKKwkJCQkJdmFyIHJlMiA9IHF1aWNrSUQ7CisJCQkJCXZhciBtID0gcmUyLmV4ZWModCk7CisK
KwkJCQkJLy8gUmUtb3JnYW5pemUgdGhlIHJlc3VsdHMsIHNvIHRoYXQgdGhleSdyZSBjb25zaXN0
ZW50CisJCQkJCWlmICggbSApIHsKKwkJCQkJCW0gPSBbIDAsIG1bMl0sIG1bM10sIG1bMV0gXTsK
KworCQkJCQl9IGVsc2UgeworCQkJCQkJLy8gT3RoZXJ3aXNlLCBkbyBhIHRyYWRpdGlvbmFsIGZp
bHRlciBjaGVjayBmb3IKKwkJCQkJCS8vIElELCBjbGFzcywgYW5kIGVsZW1lbnQgc2VsZWN0b3Jz
CisJCQkJCQlyZTIgPSBxdWlja0NsYXNzOworCQkJCQkJbSA9IHJlMi5leGVjKHQpOworCQkJCQl9
CisKKwkJCQkJbVsyXSA9IG1bMl0ucmVwbGFjZSgvXFwvZywgIiIpOworCisJCQkJCXZhciBlbGVt
ID0gcmV0W3JldC5sZW5ndGgtMV07CisKKwkJCQkJLy8gVHJ5IHRvIGRvIGEgZ2xvYmFsIHNlYXJj
aCBieSBJRCwgd2hlcmUgd2UgY2FuCisJCQkJCWlmICggbVsxXSA9PSAiIyIgJiYgZWxlbSAmJiBl
bGVtLmdldEVsZW1lbnRCeUlkICYmICFqUXVlcnkuaXNYTUxEb2MoZWxlbSkgKSB7CisJCQkJCQkv
LyBPcHRpbWl6YXRpb24gZm9yIEhUTUwgZG9jdW1lbnQgY2FzZQorCQkJCQkJdmFyIG9pZCA9IGVs
ZW0uZ2V0RWxlbWVudEJ5SWQobVsyXSk7CisKKwkJCQkJCS8vIERvIGEgcXVpY2sgY2hlY2sgZm9y
IHRoZSBleGlzdGVuY2Ugb2YgdGhlIGFjdHVhbCBJRCBhdHRyaWJ1dGUKKwkJCQkJCS8vIHRvIGF2
b2lkIHNlbGVjdGluZyBieSB0aGUgbmFtZSBhdHRyaWJ1dGUgaW4gSUUKKwkJCQkJCS8vIGFsc28g
Y2hlY2sgdG8gaW5zdXJlIGlkIGlzIGEgc3RyaW5nIHRvIGF2b2lkIHNlbGVjdGluZyBhbiBlbGVt
ZW50IHdpdGggdGhlIG5hbWUgb2YgJ2lkJyBpbnNpZGUgYSBmb3JtCisJCQkJCQlpZiAoIChqUXVl
cnkuYnJvd3Nlci5tc2llfHxqUXVlcnkuYnJvd3Nlci5vcGVyYSkgJiYgb2lkICYmIHR5cGVvZiBv
aWQuaWQgPT0gInN0cmluZyIgJiYgb2lkLmlkICE9IG1bMl0gKQorCQkJCQkJCW9pZCA9IGpRdWVy
eSgnW0BpZD0iJyttWzJdKyciXScsIGVsZW0pWzBdOworCisJCQkJCQkvLyBEbyBhIHF1aWNrIGNo
ZWNrIGZvciBub2RlIG5hbWUgKHdoZXJlIGFwcGxpY2FibGUpIHNvCisJCQkJCQkvLyB0aGF0IGRp
diNmb28gc2VhcmNoZXMgd2lsbCBiZSByZWFsbHkgZmFzdAorCQkJCQkJcmV0ID0gciA9IG9pZCAm
JiAoIW1bM10gfHwgalF1ZXJ5Lm5vZGVOYW1lKG9pZCwgbVszXSkpID8gW29pZF0gOiBbXTsKKwkJ
CQkJfSBlbHNlIHsKKwkJCQkJCS8vIFdlIG5lZWQgdG8gZmluZCBhbGwgZGVzY2VuZGFudCBlbGVt
ZW50cworCQkJCQkJZm9yICggdmFyIGkgPSAwOyByZXRbaV07IGkrKyApIHsKKwkJCQkJCQkvLyBH
cmFiIHRoZSB0YWcgbmFtZSBiZWluZyBzZWFyY2hlZCBmb3IKKwkJCQkJCQl2YXIgdGFnID0gbVsx
XSA9PSAiIyIgJiYgbVszXSA/IG1bM10gOiBtWzFdICE9ICIiIHx8IG1bMF0gPT0gIiIgPyAiKiIg
OiBtWzJdOworCisJCQkJCQkJLy8gSGFuZGxlIElFNyBiZWluZyByZWFsbHkgZHVtYiBhYm91dCA8
b2JqZWN0PnMKKwkJCQkJCQlpZiAoIHRhZyA9PSAiKiIgJiYgcmV0W2ldLm5vZGVOYW1lLnRvTG93
ZXJDYXNlKCkgPT0gIm9iamVjdCIgKQorCQkJCQkJCQl0YWcgPSAicGFyYW0iOworCisJCQkJCQkJ
ciA9IGpRdWVyeS5tZXJnZSggciwgcmV0W2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKSk7
CisJCQkJCQl9CisKKwkJCQkJCS8vIEl0J3MgZmFzdGVyIHRvIGZpbHRlciBieSBjbGFzcyBhbmQg
YmUgZG9uZSB3aXRoIGl0CisJCQkJCQlpZiAoIG1bMV0gPT0gIi4iICkKKwkJCQkJCQlyID0galF1
ZXJ5LmNsYXNzRmlsdGVyKCByLCBtWzJdICk7CisKKwkJCQkJCS8vIFNhbWUgd2l0aCBJRCBmaWx0
ZXJpbmcKKwkJCQkJCWlmICggbVsxXSA9PSAiIyIgKSB7CisJCQkJCQkJdmFyIHRtcCA9IFtdOwor
CisJCQkJCQkJLy8gVHJ5IHRvIGZpbmQgdGhlIGVsZW1lbnQgd2l0aCB0aGUgSUQKKwkJCQkJCQlm
b3IgKCB2YXIgaSA9IDA7IHJbaV07IGkrKyApCisJCQkJCQkJCWlmICggcltpXS5nZXRBdHRyaWJ1
dGUoImlkIikgPT0gbVsyXSApIHsKKwkJCQkJCQkJCXRtcCA9IFsgcltpXSBdOworCQkJCQkJCQkJ
YnJlYWs7CisJCQkJCQkJCX0KKworCQkJCQkJCXIgPSB0bXA7CisJCQkJCQl9CisKKwkJCQkJCXJl
dCA9IHI7CisJCQkJCX0KKworCQkJCQl0ID0gdC5yZXBsYWNlKCByZTIsICIiICk7CisJCQkJfQor
CisJCQl9CisKKwkJCS8vIElmIGEgc2VsZWN0b3Igc3RyaW5nIHN0aWxsIGV4aXN0cworCQkJaWYg
KCB0ICkgeworCQkJCS8vIEF0dGVtcHQgdG8gZmlsdGVyIGl0CisJCQkJdmFyIHZhbCA9IGpRdWVy
eS5maWx0ZXIodCxyKTsKKwkJCQlyZXQgPSByID0gdmFsLnI7CisJCQkJdCA9IGpRdWVyeS50cmlt
KHZhbC50KTsKKwkJCX0KKwkJfQorCisJCS8vIEFuIGVycm9yIG9jY3VycmVkIHdpdGggdGhlIHNl
bGVjdG9yOworCQkvLyBqdXN0IHJldHVybiBhbiBlbXB0eSBzZXQgaW5zdGVhZAorCQlpZiAoIHQg
KQorCQkJcmV0ID0gW107CisKKwkJLy8gUmVtb3ZlIHRoZSByb290IGNvbnRleHQKKwkJaWYgKCBy
ZXQgJiYgY29udGV4dCA9PSByZXRbMF0gKQorCQkJcmV0LnNoaWZ0KCk7CisKKwkJLy8gQW5kIGNv
bWJpbmUgdGhlIHJlc3VsdHMKKwkJZG9uZSA9IGpRdWVyeS5tZXJnZSggZG9uZSwgcmV0ICk7CisK
KwkJcmV0dXJuIGRvbmU7CisJfSwKKworCWNsYXNzRmlsdGVyOiBmdW5jdGlvbihyLG0sbm90KXsK
KwkJbSA9ICIgIiArIG0gKyAiICI7CisJCXZhciB0bXAgPSBbXTsKKwkJZm9yICggdmFyIGkgPSAw
OyByW2ldOyBpKysgKSB7CisJCQl2YXIgcGFzcyA9ICgiICIgKyByW2ldLmNsYXNzTmFtZSArICIg
IikuaW5kZXhPZiggbSApID49IDA7CisJCQlpZiAoICFub3QgJiYgcGFzcyB8fCBub3QgJiYgIXBh
c3MgKQorCQkJCXRtcC5wdXNoKCByW2ldICk7CisJCX0KKwkJcmV0dXJuIHRtcDsKKwl9LAorCisJ
ZmlsdGVyOiBmdW5jdGlvbih0LHIsbm90KSB7CisJCXZhciBsYXN0OworCisJCS8vIExvb2sgZm9y
IGNvbW1vbiBmaWx0ZXIgZXhwcmVzc2lvbnMKKwkJd2hpbGUgKCB0ICYmIHQgIT0gbGFzdCApIHsK
KwkJCWxhc3QgPSB0OworCisJCQl2YXIgcCA9IGpRdWVyeS5wYXJzZSwgbTsKKworCQkJZm9yICgg
dmFyIGkgPSAwOyBwW2ldOyBpKysgKSB7CisJCQkJbSA9IHBbaV0uZXhlYyggdCApOworCisJCQkJ
aWYgKCBtICkgeworCQkJCQkvLyBSZW1vdmUgd2hhdCB3ZSBqdXN0IG1hdGNoZWQKKwkJCQkJdCA9
IHQuc3Vic3RyaW5nKCBtWzBdLmxlbmd0aCApOworCisJCQkJCW1bMl0gPSBtWzJdLnJlcGxhY2Uo
L1xcL2csICIiKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCisJCQlpZiAoICFtICkKKwkJ
CQlicmVhazsKKworCQkJLy8gOm5vdCgpIGlzIGEgc3BlY2lhbCBjYXNlIHRoYXQgY2FuIGJlIG9w
dGltaXplZCBieQorCQkJLy8ga2VlcGluZyBpdCBvdXQgb2YgdGhlIGV4cHJlc3Npb24gbGlzdAor
CQkJaWYgKCBtWzFdID09ICI6IiAmJiBtWzJdID09ICJub3QiICkKKwkJCQkvLyBvcHRpbWl6ZSBp
ZiBvbmx5IG9uZSBzZWxlY3RvciBmb3VuZCAobW9zdCBjb21tb24gY2FzZSkKKwkJCQlyID0gaXNT
aW1wbGUudGVzdCggbVszXSApID8KKwkJCQkJalF1ZXJ5LmZpbHRlcihtWzNdLCByLCB0cnVlKS5y
IDoKKwkJCQkJalF1ZXJ5KCByICkubm90KCBtWzNdICk7CisKKwkJCS8vIFdlIGNhbiBnZXQgYSBi
aWcgc3BlZWQgYm9vc3QgYnkgZmlsdGVyaW5nIGJ5IGNsYXNzIGhlcmUKKwkJCWVsc2UgaWYgKCBt
WzFdID09ICIuIiApCisJCQkJciA9IGpRdWVyeS5jbGFzc0ZpbHRlcihyLCBtWzJdLCBub3QpOwor
CisJCQllbHNlIGlmICggbVsxXSA9PSAiWyIgKSB7CisJCQkJdmFyIHRtcCA9IFtdLCB0eXBlID0g
bVszXTsKKworCQkJCWZvciAoIHZhciBpID0gMCwgcmwgPSByLmxlbmd0aDsgaSA8IHJsOyBpKysg
KSB7CisJCQkJCXZhciBhID0gcltpXSwgeiA9IGFbIGpRdWVyeS5wcm9wc1ttWzJdXSB8fCBtWzJd
IF07CisKKwkJCQkJaWYgKCB6ID09IG51bGwgfHwgL2hyZWZ8c3JjfHNlbGVjdGVkLy50ZXN0KG1b
Ml0pICkKKwkJCQkJCXogPSBqUXVlcnkuYXR0cihhLG1bMl0pIHx8ICcnOworCisJCQkJCWlmICgg
KHR5cGUgPT0gIiIgJiYgISF6IHx8CisJCQkJCQkgdHlwZSA9PSAiPSIgJiYgeiA9PSBtWzVdIHx8
CisJCQkJCQkgdHlwZSA9PSAiIT0iICYmIHogIT0gbVs1XSB8fAorCQkJCQkJIHR5cGUgPT0gIl49
IiAmJiB6ICYmICF6LmluZGV4T2YobVs1XSkgfHwKKwkJCQkJCSB0eXBlID09ICIkPSIgJiYgei5z
dWJzdHIoei5sZW5ndGggLSBtWzVdLmxlbmd0aCkgPT0gbVs1XSB8fAorCQkJCQkJICh0eXBlID09
ICIqPSIgfHwgdHlwZSA9PSAifj0iKSAmJiB6LmluZGV4T2YobVs1XSkgPj0gMCkgXiBub3QgKQor
CQkJCQkJCXRtcC5wdXNoKCBhICk7CisJCQkJfQorCisJCQkJciA9IHRtcDsKKworCQkJLy8gV2Ug
Y2FuIGdldCBhIHNwZWVkIGJvb3N0IGJ5IGhhbmRsaW5nIG50aC1jaGlsZCBoZXJlCisJCQl9IGVs
c2UgaWYgKCBtWzFdID09ICI6IiAmJiBtWzJdID09ICJudGgtY2hpbGQiICkgeworCQkJCXZhciBt
ZXJnZSA9IHt9LCB0bXAgPSBbXSwKKwkJCQkJLy8gcGFyc2UgZXF1YXRpb25zIGxpa2UgJ2V2ZW4n
LCAnb2RkJywgJzUnLCAnMm4nLCAnM24rMicsICc0bi0xJywgJy1uKzYnCisJCQkJCXRlc3QgPSAv
KC0/KShcZCopbigoPzpcK3wtKT9cZCopLy5leGVjKAorCQkJCQkJbVszXSA9PSAiZXZlbiIgJiYg
IjJuIiB8fCBtWzNdID09ICJvZGQiICYmICIybisxIiB8fAorCQkJCQkJIS9cRC8udGVzdChtWzNd
KSAmJiAiMG4rIiArIG1bM10gfHwgbVszXSksCisJCQkJCS8vIGNhbGN1bGF0ZSB0aGUgbnVtYmVy
cyAoZmlyc3QpbisobGFzdCkgaW5jbHVkaW5nIGlmIHRoZXkgYXJlIG5lZ2F0aXZlCisJCQkJCWZp
cnN0ID0gKHRlc3RbMV0gKyAodGVzdFsyXSB8fCAxKSkgLSAwLCBsYXN0ID0gdGVzdFszXSAtIDA7
CisKKwkJCQkvLyBsb29wIHRocm91Z2ggYWxsIHRoZSBlbGVtZW50cyBsZWZ0IGluIHRoZSBqUXVl
cnkgb2JqZWN0CisJCQkJZm9yICggdmFyIGkgPSAwLCBybCA9IHIubGVuZ3RoOyBpIDwgcmw7IGkr
KyApIHsKKwkJCQkJdmFyIG5vZGUgPSByW2ldLCBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnROb2Rl
LCBpZCA9IGpRdWVyeS5kYXRhKHBhcmVudE5vZGUpOworCisJCQkJCWlmICggIW1lcmdlW2lkXSAp
IHsKKwkJCQkJCXZhciBjID0gMTsKKworCQkJCQkJZm9yICggdmFyIG4gPSBwYXJlbnROb2RlLmZp
cnN0Q2hpbGQ7IG47IG4gPSBuLm5leHRTaWJsaW5nICkKKwkJCQkJCQlpZiAoIG4ubm9kZVR5cGUg
PT0gMSApCisJCQkJCQkJCW4ubm9kZUluZGV4ID0gYysrOworCisJCQkJCQltZXJnZVtpZF0gPSB0
cnVlOworCQkJCQl9CisKKwkJCQkJdmFyIGFkZCA9IGZhbHNlOworCisJCQkJCWlmICggZmlyc3Qg
PT0gMCApIHsKKwkJCQkJCWlmICggbm9kZS5ub2RlSW5kZXggPT0gbGFzdCApCisJCQkJCQkJYWRk
ID0gdHJ1ZTsKKwkJCQkJfSBlbHNlIGlmICggKG5vZGUubm9kZUluZGV4IC0gbGFzdCkgJSBmaXJz
dCA9PSAwICYmIChub2RlLm5vZGVJbmRleCAtIGxhc3QpIC8gZmlyc3QgPj0gMCApCisJCQkJCQlh
ZGQgPSB0cnVlOworCisJCQkJCWlmICggYWRkIF4gbm90ICkKKwkJCQkJCXRtcC5wdXNoKCBub2Rl
ICk7CisJCQkJfQorCisJCQkJciA9IHRtcDsKKworCQkJLy8gT3RoZXJ3aXNlLCBmaW5kIHRoZSBl
eHByZXNzaW9uIHRvIGV4ZWN1dGUKKwkJCX0gZWxzZSB7CisJCQkJdmFyIGZuID0galF1ZXJ5LmV4
cHJbIG1bMV0gXTsKKwkJCQlpZiAoIHR5cGVvZiBmbiA9PSAib2JqZWN0IiApCisJCQkJCWZuID0g
Zm5bIG1bMl0gXTsKKworCQkJCWlmICggdHlwZW9mIGZuID09ICJzdHJpbmciICkKKwkJCQkJZm4g
PSBldmFsKCJmYWxzZXx8ZnVuY3Rpb24oYSxpKXtyZXR1cm4gIiArIGZuICsgIjt9Iik7CisKKwkJ
CQkvLyBFeGVjdXRlIGl0IGFnYWluc3QgdGhlIGN1cnJlbnQgZmlsdGVyCisJCQkJciA9IGpRdWVy
eS5ncmVwKCByLCBmdW5jdGlvbihlbGVtLCBpKXsKKwkJCQkJcmV0dXJuIGZuKGVsZW0sIGksIG0s
IHIpOworCQkJCX0sIG5vdCApOworCQkJfQorCQl9CisKKwkJLy8gUmV0dXJuIGFuIGFycmF5IG9m
IGZpbHRlcmVkIGVsZW1lbnRzIChyKQorCQkvLyBhbmQgdGhlIG1vZGlmaWVkIGV4cHJlc3Npb24g
c3RyaW5nICh0KQorCQlyZXR1cm4geyByOiByLCB0OiB0IH07CisJfSwKKworCWRpcjogZnVuY3Rp
b24oIGVsZW0sIGRpciApeworCQl2YXIgbWF0Y2hlZCA9IFtdLAorCQkJY3VyID0gZWxlbVtkaXJd
OworCQl3aGlsZSAoIGN1ciAmJiBjdXIgIT0gZG9jdW1lbnQgKSB7CisJCQlpZiAoIGN1ci5ub2Rl
VHlwZSA9PSAxICkKKwkJCQltYXRjaGVkLnB1c2goIGN1ciApOworCQkJY3VyID0gY3VyW2Rpcl07
CisJCX0KKwkJcmV0dXJuIG1hdGNoZWQ7CisJfSwKKworCW50aDogZnVuY3Rpb24oY3VyLHJlc3Vs
dCxkaXIsZWxlbSl7CisJCXJlc3VsdCA9IHJlc3VsdCB8fCAxOworCQl2YXIgbnVtID0gMDsKKwor
CQlmb3IgKCA7IGN1cjsgY3VyID0gY3VyW2Rpcl0gKQorCQkJaWYgKCBjdXIubm9kZVR5cGUgPT0g
MSAmJiArK251bSA9PSByZXN1bHQgKQorCQkJCWJyZWFrOworCisJCXJldHVybiBjdXI7CisJfSwK
KworCXNpYmxpbmc6IGZ1bmN0aW9uKCBuLCBlbGVtICkgeworCQl2YXIgciA9IFtdOworCisJCWZv
ciAoIDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcgKSB7CisJCQlpZiAoIG4ubm9kZVR5cGUgPT0gMSAm
JiBuICE9IGVsZW0gKQorCQkJCXIucHVzaCggbiApOworCQl9CisKKwkJcmV0dXJuIHI7CisJfQor
fSk7CisvKgorICogQSBudW1iZXIgb2YgaGVscGVyIGZ1bmN0aW9ucyB1c2VkIGZvciBtYW5hZ2lu
ZyBldmVudHMuCisgKiBNYW55IG9mIHRoZSBpZGVhcyBiZWhpbmQgdGhpcyBjb2RlIG9yaWduYXRl
ZCBmcm9tCisgKiBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkuCisgKi8KK2pRdWVyeS5l
dmVudCA9IHsKKworCS8vIEJpbmQgYW4gZXZlbnQgdG8gYW4gZWxlbWVudAorCS8vIE9yaWdpbmFs
IGJ5IERlYW4gRWR3YXJkcworCWFkZDogZnVuY3Rpb24oZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRh
dGEpIHsKKwkJaWYgKCBlbGVtLm5vZGVUeXBlID09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PSA4ICkK
KwkJCXJldHVybjsKKworCQkvLyBGb3Igd2hhdGV2ZXIgcmVhc29uLCBJRSBoYXMgdHJvdWJsZSBw
YXNzaW5nIHRoZSB3aW5kb3cgb2JqZWN0CisJCS8vIGFyb3VuZCwgY2F1c2luZyBpdCB0byBiZSBj
bG9uZWQgaW4gdGhlIHByb2Nlc3MKKwkJaWYgKCBqUXVlcnkuYnJvd3Nlci5tc2llICYmIGVsZW0u
c2V0SW50ZXJ2YWwgKQorCQkJZWxlbSA9IHdpbmRvdzsKKworCQkvLyBNYWtlIHN1cmUgdGhhdCB0
aGUgZnVuY3Rpb24gYmVpbmcgZXhlY3V0ZWQgaGFzIGEgdW5pcXVlIElECisJCWlmICggIWhhbmRs
ZXIuZ3VpZCApCisJCQloYW5kbGVyLmd1aWQgPSB0aGlzLmd1aWQrKzsKKworCQkvLyBpZiBkYXRh
IGlzIHBhc3NlZCwgYmluZCB0byBoYW5kbGVyCisJCWlmKCBkYXRhICE9IHVuZGVmaW5lZCApIHsK
KwkJCS8vIENyZWF0ZSB0ZW1wb3JhcnkgZnVuY3Rpb24gcG9pbnRlciB0byBvcmlnaW5hbCBoYW5k
bGVyCisJCQl2YXIgZm4gPSBoYW5kbGVyOworCisJCQkvLyBDcmVhdGUgdW5pcXVlIGhhbmRsZXIg
ZnVuY3Rpb24sIHdyYXBwZWQgYXJvdW5kIG9yaWdpbmFsIGhhbmRsZXIKKwkJCWhhbmRsZXIgPSB0
aGlzLnByb3h5KCBmbiwgZnVuY3Rpb24oKSB7CisJCQkJLy8gUGFzcyBhcmd1bWVudHMgYW5kIGNv
bnRleHQgdG8gb3JpZ2luYWwgaGFuZGxlcgorCQkJCXJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1
bWVudHMpOworCQkJfSk7CisKKwkJCS8vIFN0b3JlIGRhdGEgaW4gdW5pcXVlIGhhbmRsZXIKKwkJ
CWhhbmRsZXIuZGF0YSA9IGRhdGE7CisJCX0KKworCQkvLyBJbml0IHRoZSBlbGVtZW50J3MgZXZl
bnQgc3RydWN0dXJlCisJCXZhciBldmVudHMgPSBqUXVlcnkuZGF0YShlbGVtLCAiZXZlbnRzIikg
fHwgalF1ZXJ5LmRhdGEoZWxlbSwgImV2ZW50cyIsIHt9KSwKKwkJCWhhbmRsZSA9IGpRdWVyeS5k
YXRhKGVsZW0sICJoYW5kbGUiKSB8fCBqUXVlcnkuZGF0YShlbGVtLCAiaGFuZGxlIiwgZnVuY3Rp
b24oKXsKKwkJCQkvLyBIYW5kbGUgdGhlIHNlY29uZCBldmVudCBvZiBhIHRyaWdnZXIgYW5kIHdo
ZW4KKwkJCQkvLyBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZAor
CQkJCWlmICggdHlwZW9mIGpRdWVyeSAhPSAidW5kZWZpbmVkIiAmJiAhalF1ZXJ5LmV2ZW50LnRy
aWdnZXJlZCApCisJCQkJCXJldHVybiBqUXVlcnkuZXZlbnQuaGFuZGxlLmFwcGx5KGFyZ3VtZW50
cy5jYWxsZWUuZWxlbSwgYXJndW1lbnRzKTsKKwkJCX0pOworCQkvLyBBZGQgZWxlbSBhcyBhIHBy
b3BlcnR5IG9mIHRoZSBoYW5kbGUgZnVuY3Rpb24KKwkJLy8gVGhpcyBpcyB0byBwcmV2ZW50IGEg
bWVtb3J5IGxlYWsgd2l0aCBub24tbmF0aXZlCisJCS8vIGV2ZW50IGluIElFLgorCQloYW5kbGUu
ZWxlbSA9IGVsZW07CisKKwkJLy8gSGFuZGxlIG11bHRpcGxlIGV2ZW50cyBzZXBhcmF0ZWQgYnkg
YSBzcGFjZQorCQkvLyBqUXVlcnkoLi4uKS5iaW5kKCJtb3VzZW92ZXIgbW91c2VvdXQiLCBmbik7
CisJCWpRdWVyeS5lYWNoKHR5cGVzLnNwbGl0KC9ccysvKSwgZnVuY3Rpb24oaW5kZXgsIHR5cGUp
IHsKKwkJCS8vIE5hbWVzcGFjZWQgZXZlbnQgaGFuZGxlcnMKKwkJCXZhciBwYXJ0cyA9IHR5cGUu
c3BsaXQoIi4iKTsKKwkJCXR5cGUgPSBwYXJ0c1swXTsKKwkJCWhhbmRsZXIudHlwZSA9IHBhcnRz
WzFdOworCisJCQkvLyBHZXQgdGhlIGN1cnJlbnQgbGlzdCBvZiBmdW5jdGlvbnMgYm91bmQgdG8g
dGhpcyBldmVudAorCQkJdmFyIGhhbmRsZXJzID0gZXZlbnRzW3R5cGVdOworCisJCQkvLyBJbml0
IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlCisJCQlpZiAoIWhhbmRsZXJzKSB7CisJCQkJaGFuZGxl
cnMgPSBldmVudHNbdHlwZV0gPSB7fTsKKworCQkJCS8vIENoZWNrIGZvciBhIHNwZWNpYWwgZXZl
bnQgaGFuZGxlcgorCQkJCS8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIvYXR0YWNoRXZlbnQg
aWYgdGhlIHNwZWNpYWwKKwkJCQkvLyBldmVudHMgaGFuZGxlciByZXR1cm5zIGZhbHNlCisJCQkJ
aWYgKCAhalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0gfHwgalF1ZXJ5LmV2ZW50LnNwZWNpYWxb
dHlwZV0uc2V0dXAuY2FsbChlbGVtKSA9PT0gZmFsc2UgKSB7CisJCQkJCS8vIEJpbmQgdGhlIGds
b2JhbCBldmVudCBoYW5kbGVyIHRvIHRoZSBlbGVtZW50CisJCQkJCWlmIChlbGVtLmFkZEV2ZW50
TGlzdGVuZXIpCisJCQkJCQllbGVtLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgaGFuZGxlLCBmYWxz
ZSk7CisJCQkJCWVsc2UgaWYgKGVsZW0uYXR0YWNoRXZlbnQpCisJCQkJCQllbGVtLmF0dGFjaEV2
ZW50KCJvbiIgKyB0eXBlLCBoYW5kbGUpOworCQkJCX0KKwkJCX0KKworCQkJLy8gQWRkIHRoZSBm
dW5jdGlvbiB0byB0aGUgZWxlbWVudCdzIGhhbmRsZXIgbGlzdAorCQkJaGFuZGxlcnNbaGFuZGxl
ci5ndWlkXSA9IGhhbmRsZXI7CisKKwkJCS8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhh
dmUgYmVlbiB1c2VkLCBmb3IgZ2xvYmFsIHRyaWdnZXJpbmcKKwkJCWpRdWVyeS5ldmVudC5nbG9i
YWxbdHlwZV0gPSB0cnVlOworCQl9KTsKKworCQkvLyBOdWxsaWZ5IGVsZW0gdG8gcHJldmVudCBt
ZW1vcnkgbGVha3MgaW4gSUUKKwkJZWxlbSA9IG51bGw7CisJfSwKKworCWd1aWQ6IDEsCisJZ2xv
YmFsOiB7fSwKKworCS8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4g
ZWxlbWVudAorCXJlbW92ZTogZnVuY3Rpb24oZWxlbSwgdHlwZXMsIGhhbmRsZXIpIHsKKwkJLy8g
ZG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXMKKwkJaWYgKCBlbGVtLm5v
ZGVUeXBlID09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PSA4ICkKKwkJCXJldHVybjsKKworCQl2YXIg
ZXZlbnRzID0galF1ZXJ5LmRhdGEoZWxlbSwgImV2ZW50cyIpLCByZXQsIGluZGV4OworCisJCWlm
ICggZXZlbnRzICkgeworCQkJLy8gVW5iaW5kIGFsbCBldmVudHMgZm9yIHRoZSBlbGVtZW50CisJ
CQlpZiAoIHR5cGVzID09IHVuZGVmaW5lZCB8fCAodHlwZW9mIHR5cGVzID09ICJzdHJpbmciICYm
IHR5cGVzLmNoYXJBdCgwKSA9PSAiLiIpICkKKwkJCQlmb3IgKCB2YXIgdHlwZSBpbiBldmVudHMg
KQorCQkJCQl0aGlzLnJlbW92ZSggZWxlbSwgdHlwZSArICh0eXBlcyB8fCAiIikgKTsKKwkJCWVs
c2UgeworCQkJCS8vIHR5cGVzIGlzIGFjdHVhbGx5IGFuIGV2ZW50IG9iamVjdCBoZXJlCisJCQkJ
aWYgKCB0eXBlcy50eXBlICkgeworCQkJCQloYW5kbGVyID0gdHlwZXMuaGFuZGxlcjsKKwkJCQkJ
dHlwZXMgPSB0eXBlcy50eXBlOworCQkJCX0KKworCQkJCS8vIEhhbmRsZSBtdWx0aXBsZSBldmVu
dHMgc2VwZXJhdGVkIGJ5IGEgc3BhY2UKKwkJCQkvLyBqUXVlcnkoLi4uKS51bmJpbmQoIm1vdXNl
b3ZlciBtb3VzZW91dCIsIGZuKTsKKwkJCQlqUXVlcnkuZWFjaCh0eXBlcy5zcGxpdCgvXHMrLyks
IGZ1bmN0aW9uKGluZGV4LCB0eXBlKXsKKwkJCQkJLy8gTmFtZXNwYWNlZCBldmVudCBoYW5kbGVy
cworCQkJCQl2YXIgcGFydHMgPSB0eXBlLnNwbGl0KCIuIik7CisJCQkJCXR5cGUgPSBwYXJ0c1sw
XTsKKworCQkJCQlpZiAoIGV2ZW50c1t0eXBlXSApIHsKKwkJCQkJCS8vIHJlbW92ZSB0aGUgZ2l2
ZW4gaGFuZGxlciBmb3IgdGhlIGdpdmVuIHR5cGUKKwkJCQkJCWlmICggaGFuZGxlciApCisJCQkJ
CQkJZGVsZXRlIGV2ZW50c1t0eXBlXVtoYW5kbGVyLmd1aWRdOworCisJCQkJCQkvLyByZW1vdmUg
YWxsIGhhbmRsZXJzIGZvciB0aGUgZ2l2ZW4gdHlwZQorCQkJCQkJZWxzZQorCQkJCQkJCWZvciAo
IGhhbmRsZXIgaW4gZXZlbnRzW3R5cGVdICkKKwkJCQkJCQkJLy8gSGFuZGxlIHRoZSByZW1vdmFs
IG9mIG5hbWVzcGFjZWQgZXZlbnRzCisJCQkJCQkJCWlmICggIXBhcnRzWzFdIHx8IGV2ZW50c1t0
eXBlXVtoYW5kbGVyXS50eXBlID09IHBhcnRzWzFdICkKKwkJCQkJCQkJCWRlbGV0ZSBldmVudHNb
dHlwZV1baGFuZGxlcl07CisKKwkJCQkJCS8vIHJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIg
aWYgbm8gbW9yZSBoYW5kbGVycyBleGlzdAorCQkJCQkJZm9yICggcmV0IGluIGV2ZW50c1t0eXBl
XSApIGJyZWFrOworCQkJCQkJaWYgKCAhcmV0ICkgeworCQkJCQkJCWlmICggIWpRdWVyeS5ldmVu
dC5zcGVjaWFsW3R5cGVdIHx8IGpRdWVyeS5ldmVudC5zcGVjaWFsW3R5cGVdLnRlYXJkb3duLmNh
bGwoZWxlbSkgPT09IGZhbHNlICkgeworCQkJCQkJCQlpZiAoZWxlbS5yZW1vdmVFdmVudExpc3Rl
bmVyKQorCQkJCQkJCQkJZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGpRdWVyeS5kYXRh
KGVsZW0sICJoYW5kbGUiKSwgZmFsc2UpOworCQkJCQkJCQllbHNlIGlmIChlbGVtLmRldGFjaEV2
ZW50KQorCQkJCQkJCQkJZWxlbS5kZXRhY2hFdmVudCgib24iICsgdHlwZSwgalF1ZXJ5LmRhdGEo
ZWxlbSwgImhhbmRsZSIpKTsKKwkJCQkJCQl9CisJCQkJCQkJcmV0ID0gbnVsbDsKKwkJCQkJCQlk
ZWxldGUgZXZlbnRzW3R5cGVdOworCQkJCQkJfQorCQkJCQl9CisJCQkJfSk7CisJCQl9CisKKwkJ
CS8vIFJlbW92ZSB0aGUgZXhwYW5kbyBpZiBpdCdzIG5vIGxvbmdlciB1c2VkCisJCQlmb3IgKCBy
ZXQgaW4gZXZlbnRzICkgYnJlYWs7CisJCQlpZiAoICFyZXQgKSB7CisJCQkJdmFyIGhhbmRsZSA9
IGpRdWVyeS5kYXRhKCBlbGVtLCAiaGFuZGxlIiApOworCQkJCWlmICggaGFuZGxlICkgaGFuZGxl
LmVsZW0gPSBudWxsOworCQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCAiZXZlbnRzIiApOwor
CQkJCWpRdWVyeS5yZW1vdmVEYXRhKCBlbGVtLCAiaGFuZGxlIiApOworCQkJfQorCQl9CisJfSwK
KworCXRyaWdnZXI6IGZ1bmN0aW9uKHR5cGUsIGRhdGEsIGVsZW0sIGRvbmF0aXZlLCBleHRyYSkg
eworCQkvLyBDbG9uZSB0aGUgaW5jb21pbmcgZGF0YSwgaWYgYW55CisJCWRhdGEgPSBqUXVlcnku
bWFrZUFycmF5KGRhdGEpOworCisJCWlmICggdHlwZS5pbmRleE9mKCIhIikgPj0gMCApIHsKKwkJ
CXR5cGUgPSB0eXBlLnNsaWNlKDAsIC0xKTsKKwkJCXZhciBleGNsdXNpdmUgPSB0cnVlOworCQl9
CisKKwkJLy8gSGFuZGxlIGEgZ2xvYmFsIHRyaWdnZXIKKwkJaWYgKCAhZWxlbSApIHsKKwkJCS8v
IE9ubHkgdHJpZ2dlciBpZiB3ZSd2ZSBldmVyIGJvdW5kIGFuIGV2ZW50IGZvciBpdAorCQkJaWYg
KCB0aGlzLmdsb2JhbFt0eXBlXSApCisJCQkJalF1ZXJ5KCIqIikuYWRkKFt3aW5kb3csIGRvY3Vt
ZW50XSkudHJpZ2dlcih0eXBlLCBkYXRhKTsKKworCQkvLyBIYW5kbGUgdHJpZ2dlcmluZyBhIHNp
bmdsZSBlbGVtZW50CisJCX0gZWxzZSB7CisJCQkvLyBkb24ndCBkbyBldmVudHMgb24gdGV4dCBh
bmQgY29tbWVudCBub2RlcworCQkJaWYgKCBlbGVtLm5vZGVUeXBlID09IDMgfHwgZWxlbS5ub2Rl
VHlwZSA9PSA4ICkKKwkJCQlyZXR1cm4gdW5kZWZpbmVkOworCisJCQl2YXIgdmFsLCByZXQsIGZu
ID0galF1ZXJ5LmlzRnVuY3Rpb24oIGVsZW1bIHR5cGUgXSB8fCBudWxsICksCisJCQkJLy8gQ2hl
Y2sgdG8gc2VlIGlmIHdlIG5lZWQgdG8gcHJvdmlkZSBhIGZha2UgZXZlbnQsIG9yIG5vdAorCQkJ
CWV2ZW50ID0gIWRhdGFbMF0gfHwgIWRhdGFbMF0ucHJldmVudERlZmF1bHQ7CisKKwkJCS8vIFBh
c3MgYWxvbmcgYSBmYWtlIGV2ZW50CisJCQlpZiAoIGV2ZW50ICkgeworCQkJCWRhdGEudW5zaGlm
dCh7CisJCQkJCXR5cGU6IHR5cGUsCisJCQkJCXRhcmdldDogZWxlbSwKKwkJCQkJcHJldmVudERl
ZmF1bHQ6IGZ1bmN0aW9uKCl7fSwKKwkJCQkJc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpe30s
CisJCQkJCXRpbWVTdGFtcDogbm93KCkKKwkJCQl9KTsKKwkJCQlkYXRhWzBdW2V4cGFuZG9dID0g
dHJ1ZTsgLy8gbm8gbmVlZCB0byBmaXggZmFrZSBldmVudAorCQkJfQorCisJCQkvLyBFbmZvcmNl
IHRoZSByaWdodCB0cmlnZ2VyIHR5cGUKKwkJCWRhdGFbMF0udHlwZSA9IHR5cGU7CisJCQlpZiAo
IGV4Y2x1c2l2ZSApCisJCQkJZGF0YVswXS5leGNsdXNpdmUgPSB0cnVlOworCisJCQkvLyBUcmln
Z2VyIHRoZSBldmVudCwgaXQgaXMgYXNzdW1lZCB0aGF0ICJoYW5kbGUiIGlzIGEgZnVuY3Rpb24K
KwkJCXZhciBoYW5kbGUgPSBqUXVlcnkuZGF0YShlbGVtLCAiaGFuZGxlIik7CisJCQlpZiAoIGhh
bmRsZSApCisJCQkJdmFsID0gaGFuZGxlLmFwcGx5KCBlbGVtLCBkYXRhICk7CisKKwkJCS8vIEhh
bmRsZSB0cmlnZ2VyaW5nIG5hdGl2ZSAub25mb28gaGFuZGxlcnMgKGFuZCBvbiBsaW5rcyBzaW5j
ZSB3ZSBkb24ndCBjYWxsIC5jbGljaygpIGZvciBsaW5rcykKKwkJCWlmICggKCFmbiB8fCAoalF1
ZXJ5Lm5vZGVOYW1lKGVsZW0sICdhJykgJiYgdHlwZSA9PSAiY2xpY2siKSkgJiYgZWxlbVsib24i
K3R5cGVdICYmIGVsZW1bIm9uIit0eXBlXS5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSAp
CisJCQkJdmFsID0gZmFsc2U7CisKKwkJCS8vIEV4dHJhIGZ1bmN0aW9ucyBkb24ndCBnZXQgdGhl
IGN1c3RvbSBldmVudCBvYmplY3QKKwkJCWlmICggZXZlbnQgKQorCQkJCWRhdGEuc2hpZnQoKTsK
KworCQkJLy8gSGFuZGxlIHRyaWdnZXJpbmcgb2YgZXh0cmEgZnVuY3Rpb24KKwkJCWlmICggZXh0
cmEgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIGV4dHJhICkgKSB7CisJCQkJLy8gY2FsbCB0aGUgZXh0
cmEgZnVuY3Rpb24gYW5kIHRhY2sgdGhlIGN1cnJlbnQgcmV0dXJuIHZhbHVlIG9uIHRoZSBlbmQg
Zm9yIHBvc3NpYmxlIGluc3BlY3Rpb24KKwkJCQlyZXQgPSBleHRyYS5hcHBseSggZWxlbSwgdmFs
ID09IG51bGwgPyBkYXRhIDogZGF0YS5jb25jYXQoIHZhbCApICk7CisJCQkJLy8gaWYgYW55dGhp
bmcgaXMgcmV0dXJuZWQsIGdpdmUgaXQgcHJlY2VkZW5jZSBhbmQgaGF2ZSBpdCBvdmVyd3JpdGUg
dGhlIHByZXZpb3VzIHZhbHVlCisJCQkJaWYgKHJldCAhPT0gdW5kZWZpbmVkKQorCQkJCQl2YWwg
PSByZXQ7CisJCQl9CisKKwkJCS8vIFRyaWdnZXIgdGhlIG5hdGl2ZSBldmVudHMgKGV4Y2VwdCBm
b3IgY2xpY2tzIG9uIGxpbmtzKQorCQkJaWYgKCBmbiAmJiBkb25hdGl2ZSAhPT0gZmFsc2UgJiYg
dmFsICE9PSBmYWxzZSAmJiAhKGpRdWVyeS5ub2RlTmFtZShlbGVtLCAnYScpICYmIHR5cGUgPT0g
ImNsaWNrIikgKSB7CisJCQkJdGhpcy50cmlnZ2VyZWQgPSB0cnVlOworCQkJCXRyeSB7CisJCQkJ
CWVsZW1bIHR5cGUgXSgpOworCQkJCS8vIHByZXZlbnQgSUUgZnJvbSB0aHJvd2luZyBhbiBlcnJv
ciBmb3Igc29tZSBoaWRkZW4gZWxlbWVudHMKKwkJCQl9IGNhdGNoIChlKSB7fQorCQkJfQorCisJ
CQl0aGlzLnRyaWdnZXJlZCA9IGZhbHNlOworCQl9CisKKwkJcmV0dXJuIHZhbDsKKwl9LAorCisJ
aGFuZGxlOiBmdW5jdGlvbihldmVudCkgeworCQkvLyByZXR1cm5lZCB1bmRlZmluZWQgb3IgZmFs
c2UKKwkJdmFyIHZhbCwgcmV0LCBuYW1lc3BhY2UsIGFsbCwgaGFuZGxlcnM7CisKKwkJZXZlbnQg
PSBhcmd1bWVudHNbMF0gPSBqUXVlcnkuZXZlbnQuZml4KCBldmVudCB8fCB3aW5kb3cuZXZlbnQg
KTsKKworCQkvLyBOYW1lc3BhY2VkIGV2ZW50IGhhbmRsZXJzCisJCW5hbWVzcGFjZSA9IGV2ZW50
LnR5cGUuc3BsaXQoIi4iKTsKKwkJZXZlbnQudHlwZSA9IG5hbWVzcGFjZVswXTsKKwkJbmFtZXNw
YWNlID0gbmFtZXNwYWNlWzFdOworCQkvLyBDYWNoZSB0aGlzIG5vdywgYWxsID0gdHJ1ZSBtZWFu
cywgYW55IGhhbmRsZXIKKwkJYWxsID0gIW5hbWVzcGFjZSAmJiAhZXZlbnQuZXhjbHVzaXZlOwor
CisJCWhhbmRsZXJzID0gKCBqUXVlcnkuZGF0YSh0aGlzLCAiZXZlbnRzIikgfHwge30gKVtldmVu
dC50eXBlXTsKKworCQlmb3IgKCB2YXIgaiBpbiBoYW5kbGVycyApIHsKKwkJCXZhciBoYW5kbGVy
ID0gaGFuZGxlcnNbal07CisKKwkJCS8vIEZpbHRlciB0aGUgZnVuY3Rpb25zIGJ5IGNsYXNzCisJ
CQlpZiAoIGFsbCB8fCBoYW5kbGVyLnR5cGUgPT0gbmFtZXNwYWNlICkgeworCQkJCS8vIFBhc3Mg
aW4gYSByZWZlcmVuY2UgdG8gdGhlIGhhbmRsZXIgZnVuY3Rpb24gaXRzZWxmCisJCQkJLy8gU28g
dGhhdCB3ZSBjYW4gbGF0ZXIgcmVtb3ZlIGl0CisJCQkJZXZlbnQuaGFuZGxlciA9IGhhbmRsZXI7
CisJCQkJZXZlbnQuZGF0YSA9IGhhbmRsZXIuZGF0YTsKKworCQkJCXJldCA9IGhhbmRsZXIuYXBw
bHkoIHRoaXMsIGFyZ3VtZW50cyApOworCisJCQkJaWYgKCB2YWwgIT09IGZhbHNlICkKKwkJCQkJ
dmFsID0gcmV0OworCisJCQkJaWYgKCByZXQgPT09IGZhbHNlICkgeworCQkJCQlldmVudC5wcmV2
ZW50RGVmYXVsdCgpOworCQkJCQlldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKKwkJCQl9CisJCQl9
CisJCX0KKworCQlyZXR1cm4gdmFsOworCX0sCisKKwlmaXg6IGZ1bmN0aW9uKGV2ZW50KSB7CisJ
CWlmICggZXZlbnRbZXhwYW5kb10gPT0gdHJ1ZSApCisJCQlyZXR1cm4gZXZlbnQ7CisKKwkJLy8g
c3RvcmUgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBldmVudCBvYmplY3QKKwkJLy8gYW5kICJjbG9u
ZSIgdG8gc2V0IHJlYWQtb25seSBwcm9wZXJ0aWVzCisJCXZhciBvcmlnaW5hbEV2ZW50ID0gZXZl
bnQ7CisJCWV2ZW50ID0geyBvcmlnaW5hbEV2ZW50OiBvcmlnaW5hbEV2ZW50IH07CisJCXZhciBw
cm9wcyA9ICJhbHRLZXkgYXR0ckNoYW5nZSBhdHRyTmFtZSBidWJibGVzIGJ1dHRvbiBjYW5jZWxh
YmxlIGNoYXJDb2RlIGNsaWVudFggY2xpZW50WSBjdHJsS2V5IGN1cnJlbnRUYXJnZXQgZGF0YSBk
ZXRhaWwgZXZlbnRQaGFzZSBmcm9tRWxlbWVudCBoYW5kbGVyIGtleUNvZGUgbWV0YUtleSBuZXdW
YWx1ZSBvcmlnaW5hbFRhcmdldCBwYWdlWCBwYWdlWSBwcmV2VmFsdWUgcmVsYXRlZE5vZGUgcmVs
YXRlZFRhcmdldCBzY3JlZW5YIHNjcmVlblkgc2hpZnRLZXkgc3JjRWxlbWVudCB0YXJnZXQgdGlt
ZVN0YW1wIHRvRWxlbWVudCB0eXBlIHZpZXcgd2hlZWxEZWx0YSB3aGljaCIuc3BsaXQoIiAiKTsK
KwkJZm9yICggdmFyIGk9cHJvcHMubGVuZ3RoOyBpOyBpLS0gKQorCQkJZXZlbnRbIHByb3BzW2ld
IF0gPSBvcmlnaW5hbEV2ZW50WyBwcm9wc1tpXSBdOworCisJCS8vIE1hcmsgaXQgYXMgZml4ZWQK
KwkJZXZlbnRbZXhwYW5kb10gPSB0cnVlOworCisJCS8vIGFkZCBwcmV2ZW50RGVmYXVsdCBhbmQg
c3RvcFByb3BhZ2F0aW9uIHNpbmNlCisJCS8vIHRoZXkgd2lsbCBub3Qgd29yayBvbiB0aGUgY2xv
bmUKKwkJZXZlbnQucHJldmVudERlZmF1bHQgPSBmdW5jdGlvbigpIHsKKwkJCS8vIGlmIHByZXZl
bnREZWZhdWx0IGV4aXN0cyBydW4gaXQgb24gdGhlIG9yaWdpbmFsIGV2ZW50CisJCQlpZiAob3Jp
Z2luYWxFdmVudC5wcmV2ZW50RGVmYXVsdCkKKwkJCQlvcmlnaW5hbEV2ZW50LnByZXZlbnREZWZh
dWx0KCk7CisJCQkvLyBvdGhlcndpc2Ugc2V0IHRoZSByZXR1cm5WYWx1ZSBwcm9wZXJ0eSBvZiB0
aGUgb3JpZ2luYWwgZXZlbnQgdG8gZmFsc2UgKElFKQorCQkJb3JpZ2luYWxFdmVudC5yZXR1cm5W
YWx1ZSA9IGZhbHNlOworCQl9OworCQlldmVudC5zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbigp
IHsKKwkJCS8vIGlmIHN0b3BQcm9wYWdhdGlvbiBleGlzdHMgcnVuIGl0IG9uIHRoZSBvcmlnaW5h
bCBldmVudAorCQkJaWYgKG9yaWdpbmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKQorCQkJCW9yaWdp
bmFsRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CisJCQkvLyBvdGhlcndpc2Ugc2V0IHRoZSBjYW5j
ZWxCdWJibGUgcHJvcGVydHkgb2YgdGhlIG9yaWdpbmFsIGV2ZW50IHRvIHRydWUgKElFKQorCQkJ
b3JpZ2luYWxFdmVudC5jYW5jZWxCdWJibGUgPSB0cnVlOworCQl9OworCisJCS8vIEZpeCB0aW1l
U3RhbXAKKwkJZXZlbnQudGltZVN0YW1wID0gZXZlbnQudGltZVN0YW1wIHx8IG5vdygpOworCisJ
CS8vIEZpeCB0YXJnZXQgcHJvcGVydHksIGlmIG5lY2Vzc2FyeQorCQlpZiAoICFldmVudC50YXJn
ZXQgKQorCQkJZXZlbnQudGFyZ2V0ID0gZXZlbnQuc3JjRWxlbWVudCB8fCBkb2N1bWVudDsgLy8g
Rml4ZXMgIzE5MjUgd2hlcmUgc3JjRWxlbWVudCBtaWdodCBub3QgYmUgZGVmaW5lZCBlaXRoZXIK
KworCQkvLyBjaGVjayBpZiB0YXJnZXQgaXMgYSB0ZXh0bm9kZSAoc2FmYXJpKQorCQlpZiAoIGV2
ZW50LnRhcmdldC5ub2RlVHlwZSA9PSAzICkKKwkJCWV2ZW50LnRhcmdldCA9IGV2ZW50LnRhcmdl
dC5wYXJlbnROb2RlOworCisJCS8vIEFkZCByZWxhdGVkVGFyZ2V0LCBpZiBuZWNlc3NhcnkKKwkJ
aWYgKCAhZXZlbnQucmVsYXRlZFRhcmdldCAmJiBldmVudC5mcm9tRWxlbWVudCApCisJCQlldmVu
dC5yZWxhdGVkVGFyZ2V0ID0gZXZlbnQuZnJvbUVsZW1lbnQgPT0gZXZlbnQudGFyZ2V0ID8gZXZl
bnQudG9FbGVtZW50IDogZXZlbnQuZnJvbUVsZW1lbnQ7CisKKwkJLy8gQ2FsY3VsYXRlIHBhZ2VY
L1kgaWYgbWlzc2luZyBhbmQgY2xpZW50WC9ZIGF2YWlsYWJsZQorCQlpZiAoIGV2ZW50LnBhZ2VY
ID09IG51bGwgJiYgZXZlbnQuY2xpZW50WCAhPSBudWxsICkgeworCQkJdmFyIGRvYyA9IGRvY3Vt
ZW50LmRvY3VtZW50RWxlbWVudCwgYm9keSA9IGRvY3VtZW50LmJvZHk7CisJCQlldmVudC5wYWdl
WCA9IGV2ZW50LmNsaWVudFggKyAoZG9jICYmIGRvYy5zY3JvbGxMZWZ0IHx8IGJvZHkgJiYgYm9k
eS5zY3JvbGxMZWZ0IHx8IDApIC0gKGRvYy5jbGllbnRMZWZ0IHx8IDApOworCQkJZXZlbnQucGFn
ZVkgPSBldmVudC5jbGllbnRZICsgKGRvYyAmJiBkb2Muc2Nyb2xsVG9wIHx8IGJvZHkgJiYgYm9k
eS5zY3JvbGxUb3AgfHwgMCkgLSAoZG9jLmNsaWVudFRvcCB8fCAwKTsKKwkJfQorCisJCS8vIEFk
ZCB3aGljaCBmb3Iga2V5IGV2ZW50cworCQlpZiAoICFldmVudC53aGljaCAmJiAoKGV2ZW50LmNo
YXJDb2RlIHx8IGV2ZW50LmNoYXJDb2RlID09PSAwKSA/IGV2ZW50LmNoYXJDb2RlIDogZXZlbnQu
a2V5Q29kZSkgKQorCQkJZXZlbnQud2hpY2ggPSBldmVudC5jaGFyQ29kZSB8fCBldmVudC5rZXlD
b2RlOworCisJCS8vIEFkZCBtZXRhS2V5IHRvIG5vbi1NYWMgYnJvd3NlcnMgKHVzZSBjdHJsIGZv
ciBQQydzIGFuZCBNZXRhIGZvciBNYWNzKQorCQlpZiAoICFldmVudC5tZXRhS2V5ICYmIGV2ZW50
LmN0cmxLZXkgKQorCQkJZXZlbnQubWV0YUtleSA9IGV2ZW50LmN0cmxLZXk7CisKKwkJLy8gQWRk
IHdoaWNoIGZvciBjbGljazogMSA9PSBsZWZ0OyAyID09IG1pZGRsZTsgMyA9PSByaWdodAorCQkv
LyBOb3RlOiBidXR0b24gaXMgbm90IG5vcm1hbGl6ZWQsIHNvIGRvbid0IHVzZSBpdAorCQlpZiAo
ICFldmVudC53aGljaCAmJiBldmVudC5idXR0b24gKQorCQkJZXZlbnQud2hpY2ggPSAoZXZlbnQu
YnV0dG9uICYgMSA/IDEgOiAoIGV2ZW50LmJ1dHRvbiAmIDIgPyAzIDogKCBldmVudC5idXR0b24g
JiA0ID8gMiA6IDAgKSApKTsKKworCQlyZXR1cm4gZXZlbnQ7CisJfSwKKworCXByb3h5OiBmdW5j
dGlvbiggZm4sIHByb3h5ICl7CisJCS8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0
byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZAorCQlw
cm94eS5ndWlkID0gZm4uZ3VpZCA9IGZuLmd1aWQgfHwgcHJveHkuZ3VpZCB8fCB0aGlzLmd1aWQr
KzsKKwkJLy8gU28gcHJveHkgY2FuIGJlIGRlY2xhcmVkIGFzIGFuIGFyZ3VtZW50CisJCXJldHVy
biBwcm94eTsKKwl9LAorCisJc3BlY2lhbDogeworCQlyZWFkeTogeworCQkJc2V0dXA6IGZ1bmN0
aW9uKCkgeworCQkJCS8vIE1ha2Ugc3VyZSB0aGUgcmVhZHkgZXZlbnQgaXMgc2V0dXAKKwkJCQli
aW5kUmVhZHkoKTsKKwkJCQlyZXR1cm47CisJCQl9LAorCisJCQl0ZWFyZG93bjogZnVuY3Rpb24o
KSB7IHJldHVybjsgfQorCQl9LAorCisJCW1vdXNlZW50ZXI6IHsKKwkJCXNldHVwOiBmdW5jdGlv
bigpIHsKKwkJCQlpZiAoIGpRdWVyeS5icm93c2VyLm1zaWUgKSByZXR1cm4gZmFsc2U7CisJCQkJ
alF1ZXJ5KHRoaXMpLmJpbmQoIm1vdXNlb3ZlciIsIGpRdWVyeS5ldmVudC5zcGVjaWFsLm1vdXNl
ZW50ZXIuaGFuZGxlcik7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9LAorCisJCQl0ZWFyZG93bjog
ZnVuY3Rpb24oKSB7CisJCQkJaWYgKCBqUXVlcnkuYnJvd3Nlci5tc2llICkgcmV0dXJuIGZhbHNl
OworCQkJCWpRdWVyeSh0aGlzKS51bmJpbmQoIm1vdXNlb3ZlciIsIGpRdWVyeS5ldmVudC5zcGVj
aWFsLm1vdXNlZW50ZXIuaGFuZGxlcik7CisJCQkJcmV0dXJuIHRydWU7CisJCQl9LAorCisJCQlo
YW5kbGVyOiBmdW5jdGlvbihldmVudCkgeworCQkJCS8vIElmIHdlIGFjdHVhbGx5IGp1c3QgbW91
c2VkIG9uIHRvIGEgc3ViLWVsZW1lbnQsIGlnbm9yZSBpdAorCQkJCWlmICggd2l0aGluRWxlbWVu
dChldmVudCwgdGhpcykgKSByZXR1cm4gdHJ1ZTsKKwkJCQkvLyBFeGVjdXRlIHRoZSByaWdodCBo
YW5kbGVycyBieSBzZXR0aW5nIHRoZSBldmVudCB0eXBlIHRvIG1vdXNlZW50ZXIKKwkJCQlldmVu
dC50eXBlID0gIm1vdXNlZW50ZXIiOworCQkJCXJldHVybiBqUXVlcnkuZXZlbnQuaGFuZGxlLmFw
cGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCQl9CisJCX0sCisKKwkJbW91c2VsZWF2ZTogeworCQkJ
c2V0dXA6IGZ1bmN0aW9uKCkgeworCQkJCWlmICggalF1ZXJ5LmJyb3dzZXIubXNpZSApIHJldHVy
biBmYWxzZTsKKwkJCQlqUXVlcnkodGhpcykuYmluZCgibW91c2VvdXQiLCBqUXVlcnkuZXZlbnQu
c3BlY2lhbC5tb3VzZWxlYXZlLmhhbmRsZXIpOworCQkJCXJldHVybiB0cnVlOworCQkJfSwKKwor
CQkJdGVhcmRvd246IGZ1bmN0aW9uKCkgeworCQkJCWlmICggalF1ZXJ5LmJyb3dzZXIubXNpZSAp
IHJldHVybiBmYWxzZTsKKwkJCQlqUXVlcnkodGhpcykudW5iaW5kKCJtb3VzZW91dCIsIGpRdWVy
eS5ldmVudC5zcGVjaWFsLm1vdXNlbGVhdmUuaGFuZGxlcik7CisJCQkJcmV0dXJuIHRydWU7CisJ
CQl9LAorCisJCQloYW5kbGVyOiBmdW5jdGlvbihldmVudCkgeworCQkJCS8vIElmIHdlIGFjdHVh
bGx5IGp1c3QgbW91c2VkIG9uIHRvIGEgc3ViLWVsZW1lbnQsIGlnbm9yZSBpdAorCQkJCWlmICgg
d2l0aGluRWxlbWVudChldmVudCwgdGhpcykgKSByZXR1cm4gdHJ1ZTsKKwkJCQkvLyBFeGVjdXRl
IHRoZSByaWdodCBoYW5kbGVycyBieSBzZXR0aW5nIHRoZSBldmVudCB0eXBlIHRvIG1vdXNlbGVh
dmUKKwkJCQlldmVudC50eXBlID0gIm1vdXNlbGVhdmUiOworCQkJCXJldHVybiBqUXVlcnkuZXZl
bnQuaGFuZGxlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CisJCQl9CisJCX0KKwl9Cit9OworCitq
UXVlcnkuZm4uZXh0ZW5kKHsKKwliaW5kOiBmdW5jdGlvbiggdHlwZSwgZGF0YSwgZm4gKSB7CisJ
CXJldHVybiB0eXBlID09ICJ1bmxvYWQiID8gdGhpcy5vbmUodHlwZSwgZGF0YSwgZm4pIDogdGhp
cy5lYWNoKGZ1bmN0aW9uKCl7CisJCQlqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlLCBmbiB8
fCBkYXRhLCBmbiAmJiBkYXRhICk7CisJCX0pOworCX0sCisKKwlvbmU6IGZ1bmN0aW9uKCB0eXBl
LCBkYXRhLCBmbiApIHsKKwkJdmFyIG9uZSA9IGpRdWVyeS5ldmVudC5wcm94eSggZm4gfHwgZGF0
YSwgZnVuY3Rpb24oZXZlbnQpIHsKKwkJCWpRdWVyeSh0aGlzKS51bmJpbmQoZXZlbnQsIG9uZSk7
CisJCQlyZXR1cm4gKGZuIHx8IGRhdGEpLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTsKKwkJfSk7
CisJCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJCWpRdWVyeS5ldmVudC5hZGQoIHRo
aXMsIHR5cGUsIG9uZSwgZm4gJiYgZGF0YSk7CisJCX0pOworCX0sCisKKwl1bmJpbmQ6IGZ1bmN0
aW9uKCB0eXBlLCBmbiApIHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeworCQkJalF1
ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgdHlwZSwgZm4gKTsKKwkJfSk7CisJfSwKKworCXRyaWdn
ZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhLCBmbiApIHsKKwkJcmV0dXJuIHRoaXMuZWFjaChmdW5j
dGlvbigpeworCQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIHRoaXMsIHRydWUs
IGZuICk7CisJCX0pOworCX0sCisKKwl0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRh
dGEsIGZuICkgeworCQlyZXR1cm4gdGhpc1swXSAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlw
ZSwgZGF0YSwgdGhpc1swXSwgZmFsc2UsIGZuICk7CisJfSwKKworCXRvZ2dsZTogZnVuY3Rpb24o
IGZuICkgeworCQkvLyBTYXZlIHJlZmVyZW5jZSB0byBhcmd1bWVudHMgZm9yIGFjY2VzcyBpbiBj
bG9zdXJlCisJCXZhciBhcmdzID0gYXJndW1lbnRzLCBpID0gMTsKKworCQkvLyBsaW5rIGFsbCB0
aGUgZnVuY3Rpb25zLCBzbyBhbnkgb2YgdGhlbSBjYW4gdW5iaW5kIHRoaXMgY2xpY2sgaGFuZGxl
cgorCQl3aGlsZSggaSA8IGFyZ3MubGVuZ3RoICkKKwkJCWpRdWVyeS5ldmVudC5wcm94eSggZm4s
IGFyZ3NbaSsrXSApOworCisJCXJldHVybiB0aGlzLmNsaWNrKCBqUXVlcnkuZXZlbnQucHJveHko
IGZuLCBmdW5jdGlvbihldmVudCkgeworCQkJLy8gRmlndXJlIG91dCB3aGljaCBmdW5jdGlvbiB0
byBleGVjdXRlCisJCQl0aGlzLmxhc3RUb2dnbGUgPSAoIHRoaXMubGFzdFRvZ2dsZSB8fCAwICkg
JSBpOworCisJCQkvLyBNYWtlIHN1cmUgdGhhdCBjbGlja3Mgc3RvcAorCQkJZXZlbnQucHJldmVu
dERlZmF1bHQoKTsKKworCQkJLy8gYW5kIGV4ZWN1dGUgdGhlIGZ1bmN0aW9uCisJCQlyZXR1cm4g
YXJnc1sgdGhpcy5sYXN0VG9nZ2xlKysgXS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgfHwgZmFs
c2U7CisJCX0pKTsKKwl9LAorCisJaG92ZXI6IGZ1bmN0aW9uKGZuT3ZlciwgZm5PdXQpIHsKKwkJ
cmV0dXJuIHRoaXMuYmluZCgnbW91c2VlbnRlcicsIGZuT3ZlcikuYmluZCgnbW91c2VsZWF2ZScs
IGZuT3V0KTsKKwl9LAorCisJcmVhZHk6IGZ1bmN0aW9uKGZuKSB7CisJCS8vIEF0dGFjaCB0aGUg
bGlzdGVuZXJzCisJCWJpbmRSZWFkeSgpOworCisJCS8vIElmIHRoZSBET00gaXMgYWxyZWFkeSBy
ZWFkeQorCQlpZiAoIGpRdWVyeS5pc1JlYWR5ICkKKwkJCS8vIEV4ZWN1dGUgdGhlIGZ1bmN0aW9u
IGltbWVkaWF0ZWx5CisJCQlmbi5jYWxsKCBkb2N1bWVudCwgalF1ZXJ5ICk7CisKKwkJLy8gT3Ro
ZXJ3aXNlLCByZW1lbWJlciB0aGUgZnVuY3Rpb24gZm9yIGxhdGVyCisJCWVsc2UKKwkJCS8vIEFk
ZCB0aGUgZnVuY3Rpb24gdG8gdGhlIHdhaXQgbGlzdAorCQkJalF1ZXJ5LnJlYWR5TGlzdC5wdXNo
KCBmdW5jdGlvbigpIHsgcmV0dXJuIGZuLmNhbGwodGhpcywgalF1ZXJ5KTsgfSApOworCisJCXJl
dHVybiB0aGlzOworCX0KK30pOworCitqUXVlcnkuZXh0ZW5kKHsKKwlpc1JlYWR5OiBmYWxzZSwK
KwlyZWFkeUxpc3Q6IFtdLAorCS8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHkKKwlyZWFk
eTogZnVuY3Rpb24oKSB7CisJCS8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBET00gaXMgbm90IGFscmVh
ZHkgbG9hZGVkCisJCWlmICggIWpRdWVyeS5pc1JlYWR5ICkgeworCQkJLy8gUmVtZW1iZXIgdGhh
dCB0aGUgRE9NIGlzIHJlYWR5CisJCQlqUXVlcnkuaXNSZWFkeSA9IHRydWU7CisKKwkJCS8vIElm
IHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQsIHRvIGV4ZWN1dGUKKwkJCWlmICggalF1ZXJ5LnJl
YWR5TGlzdCApIHsKKwkJCQkvLyBFeGVjdXRlIGFsbCBvZiB0aGVtCisJCQkJalF1ZXJ5LmVhY2go
IGpRdWVyeS5yZWFkeUxpc3QsIGZ1bmN0aW9uKCl7CisJCQkJCXRoaXMuY2FsbCggZG9jdW1lbnQg
KTsKKwkJCQl9KTsKKworCQkJCS8vIFJlc2V0IHRoZSBsaXN0IG9mIGZ1bmN0aW9ucworCQkJCWpR
dWVyeS5yZWFkeUxpc3QgPSBudWxsOworCQkJfQorCisJCQkvLyBUcmlnZ2VyIGFueSBib3VuZCBy
ZWFkeSBldmVudHMKKwkJCWpRdWVyeShkb2N1bWVudCkudHJpZ2dlckhhbmRsZXIoInJlYWR5Iik7
CisJCX0KKwl9Cit9KTsKKwordmFyIHJlYWR5Qm91bmQgPSBmYWxzZTsKKworZnVuY3Rpb24gYmlu
ZFJlYWR5KCl7CisJaWYgKCByZWFkeUJvdW5kICkgcmV0dXJuOworCXJlYWR5Qm91bmQgPSB0cnVl
OworCisJLy8gTW96aWxsYSwgT3BlcmEgKHNlZSBmdXJ0aGVyIGJlbG93IGZvciBpdCkgYW5kIHdl
YmtpdCBuaWdodGxpZXMgY3VycmVudGx5IHN1cHBvcnQgdGhpcyBldmVudAorCWlmICggZG9jdW1l
bnQuYWRkRXZlbnRMaXN0ZW5lciAmJiAhalF1ZXJ5LmJyb3dzZXIub3BlcmEpCisJCS8vIFVzZSB0
aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2sKKwkJZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggIkRP
TUNvbnRlbnRMb2FkZWQiLCBqUXVlcnkucmVhZHksIGZhbHNlICk7CisKKwkvLyBJZiBJRSBpcyB1
c2VkIGFuZCBpcyBub3QgaW4gYSBmcmFtZQorCS8vIENvbnRpbnVhbGx5IGNoZWNrIHRvIHNlZSBp
ZiB0aGUgZG9jdW1lbnQgaXMgcmVhZHkKKwlpZiAoIGpRdWVyeS5icm93c2VyLm1zaWUgJiYgd2lu
ZG93ID09IHRvcCApIChmdW5jdGlvbigpeworCQlpZiAoalF1ZXJ5LmlzUmVhZHkpIHJldHVybjsK
KwkJdHJ5IHsKKwkJCS8vIElmIElFIGlzIHVzZWQsIHVzZSB0aGUgdHJpY2sgYnkgRGllZ28gUGVy
aW5pCisJCQkvLyBodHRwOi8vamF2YXNjcmlwdC5ud2JveC5jb20vSUVDb250ZW50TG9hZGVkLwor
CQkJZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xsKCJsZWZ0Iik7CisJCX0gY2F0Y2go
IGVycm9yICkgeworCQkJc2V0VGltZW91dCggYXJndW1lbnRzLmNhbGxlZSwgMCApOworCQkJcmV0
dXJuOworCQl9CisJCS8vIGFuZCBleGVjdXRlIGFueSB3YWl0aW5nIGZ1bmN0aW9ucworCQlqUXVl
cnkucmVhZHkoKTsKKwl9KSgpOworCisJaWYgKCBqUXVlcnkuYnJvd3Nlci5vcGVyYSApCisJCWRv
Y3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICJET01Db250ZW50TG9hZGVkIiwgZnVuY3Rpb24gKCkg
eworCQkJaWYgKGpRdWVyeS5pc1JlYWR5KSByZXR1cm47CisJCQlmb3IgKHZhciBpID0gMDsgaSA8
IGRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgaSsrKQorCQkJCWlmIChkb2N1bWVudC5zdHls
ZVNoZWV0c1tpXS5kaXNhYmxlZCkgeworCQkJCQlzZXRUaW1lb3V0KCBhcmd1bWVudHMuY2FsbGVl
LCAwICk7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQkvLyBhbmQgZXhlY3V0ZSBhbnkgd2FpdGlu
ZyBmdW5jdGlvbnMKKwkJCWpRdWVyeS5yZWFkeSgpOworCQl9LCBmYWxzZSk7CisKKwlpZiAoIGpR
dWVyeS5icm93c2VyLnNhZmFyaSApIHsKKwkJdmFyIG51bVN0eWxlczsKKwkJKGZ1bmN0aW9uKCl7
CisJCQlpZiAoalF1ZXJ5LmlzUmVhZHkpIHJldHVybjsKKwkJCWlmICggZG9jdW1lbnQucmVhZHlT
dGF0ZSAhPSAibG9hZGVkIiAmJiBkb2N1bWVudC5yZWFkeVN0YXRlICE9ICJjb21wbGV0ZSIgKSB7
CisJCQkJc2V0VGltZW91dCggYXJndW1lbnRzLmNhbGxlZSwgMCApOworCQkJCXJldHVybjsKKwkJ
CX0KKwkJCWlmICggbnVtU3R5bGVzID09PSB1bmRlZmluZWQgKQorCQkJCW51bVN0eWxlcyA9IGpR
dWVyeSgic3R5bGUsIGxpbmtbcmVsPXN0eWxlc2hlZXRdIikubGVuZ3RoOworCQkJaWYgKCBkb2N1
bWVudC5zdHlsZVNoZWV0cy5sZW5ndGggIT0gbnVtU3R5bGVzICkgeworCQkJCXNldFRpbWVvdXQo
IGFyZ3VtZW50cy5jYWxsZWUsIDAgKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkvLyBhbmQgZXhl
Y3V0ZSBhbnkgd2FpdGluZyBmdW5jdGlvbnMKKwkJCWpRdWVyeS5yZWFkeSgpOworCQl9KSgpOwor
CX0KKworCS8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3
b3JrCisJalF1ZXJ5LmV2ZW50LmFkZCggd2luZG93LCAibG9hZCIsIGpRdWVyeS5yZWFkeSApOwor
fQorCitqUXVlcnkuZWFjaCggKCJibHVyLGZvY3VzLGxvYWQscmVzaXplLHNjcm9sbCx1bmxvYWQs
Y2xpY2ssZGJsY2xpY2ssIiArCisJIm1vdXNlZG93bixtb3VzZXVwLG1vdXNlbW92ZSxtb3VzZW92
ZXIsbW91c2VvdXQsY2hhbmdlLHNlbGVjdCwiICsKKwkic3VibWl0LGtleWRvd24sa2V5cHJlc3Ms
a2V5dXAsZXJyb3IiKS5zcGxpdCgiLCIpLCBmdW5jdGlvbihpLCBuYW1lKXsKKworCS8vIEhhbmRs
ZSBldmVudCBiaW5kaW5nCisJalF1ZXJ5LmZuW25hbWVdID0gZnVuY3Rpb24oZm4peworCQlyZXR1
cm4gZm4gPyB0aGlzLmJpbmQobmFtZSwgZm4pIDogdGhpcy50cmlnZ2VyKG5hbWUpOworCX07Cit9
KTsKKworLy8gQ2hlY2tzIGlmIGFuIGV2ZW50IGhhcHBlbmVkIG9uIGFuIGVsZW1lbnQgd2l0aGlu
IGFub3RoZXIgZWxlbWVudAorLy8gVXNlZCBpbiBqUXVlcnkuZXZlbnQuc3BlY2lhbC5tb3VzZWVu
dGVyIGFuZCBtb3VzZWxlYXZlIGhhbmRsZXJzCit2YXIgd2l0aGluRWxlbWVudCA9IGZ1bmN0aW9u
KGV2ZW50LCBlbGVtKSB7CisJLy8gQ2hlY2sgaWYgbW91c2Uob3ZlcnxvdXQpIGFyZSBzdGlsbCB3
aXRoaW4gdGhlIHNhbWUgcGFyZW50IGVsZW1lbnQKKwl2YXIgcGFyZW50ID0gZXZlbnQucmVsYXRl
ZFRhcmdldDsKKwkvLyBUcmF2ZXJzZSB1cCB0aGUgdHJlZQorCXdoaWxlICggcGFyZW50ICYmIHBh
cmVudCAhPSBlbGVtICkgdHJ5IHsgcGFyZW50ID0gcGFyZW50LnBhcmVudE5vZGU7IH0gY2F0Y2go
ZXJyb3IpIHsgcGFyZW50ID0gZWxlbTsgfQorCS8vIFJldHVybiB0cnVlIGlmIHdlIGFjdHVhbGx5
IGp1c3QgbW91c2VkIG9uIHRvIGEgc3ViLWVsZW1lbnQKKwlyZXR1cm4gcGFyZW50ID09IGVsZW07
Cit9OworCisvLyBQcmV2ZW50IG1lbW9yeSBsZWFrcyBpbiBJRQorLy8gQW5kIHByZXZlbnQgZXJy
b3JzIG9uIHJlZnJlc2ggd2l0aCBldmVudHMgbGlrZSBtb3VzZW92ZXIgaW4gb3RoZXIgYnJvd3Nl
cnMKKy8vIFdpbmRvdyBpc24ndCBpbmNsdWRlZCBzbyBhcyBub3QgdG8gdW5iaW5kIGV4aXN0aW5n
IHVubG9hZCBldmVudHMKK2pRdWVyeSh3aW5kb3cpLmJpbmQoInVubG9hZCIsIGZ1bmN0aW9uKCkg
eworCWpRdWVyeSgiKiIpLmFkZChkb2N1bWVudCkudW5iaW5kKCk7Cit9KTsKK2pRdWVyeS5mbi5l
eHRlbmQoeworCS8vIEtlZXAgYSBjb3B5IG9mIHRoZSBvbGQgbG9hZAorCV9sb2FkOiBqUXVlcnku
Zm4ubG9hZCwKKworCWxvYWQ6IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7CisJ
CWlmICggdHlwZW9mIHVybCAhPSAnc3RyaW5nJyApCisJCQlyZXR1cm4gdGhpcy5fbG9hZCggdXJs
ICk7CisKKwkJdmFyIG9mZiA9IHVybC5pbmRleE9mKCIgIik7CisJCWlmICggb2ZmID49IDAgKSB7
CisJCQl2YXIgc2VsZWN0b3IgPSB1cmwuc2xpY2Uob2ZmLCB1cmwubGVuZ3RoKTsKKwkJCXVybCA9
IHVybC5zbGljZSgwLCBvZmYpOworCQl9CisKKwkJY2FsbGJhY2sgPSBjYWxsYmFjayB8fCBmdW5j
dGlvbigpe307CisKKwkJLy8gRGVmYXVsdCB0byBhIEdFVCByZXF1ZXN0CisJCXZhciB0eXBlID0g
IkdFVCI7CisKKwkJLy8gSWYgdGhlIHNlY29uZCBwYXJhbWV0ZXIgd2FzIHByb3ZpZGVkCisJCWlm
ICggcGFyYW1zICkKKwkJCS8vIElmIGl0J3MgYSBmdW5jdGlvbgorCQkJaWYgKCBqUXVlcnkuaXNG
dW5jdGlvbiggcGFyYW1zICkgKSB7CisJCQkJLy8gV2UgYXNzdW1lIHRoYXQgaXQncyB0aGUgY2Fs
bGJhY2sKKwkJCQljYWxsYmFjayA9IHBhcmFtczsKKwkJCQlwYXJhbXMgPSBudWxsOworCisJCQkv
LyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nCisJCQl9IGVsc2UgeworCQkJCXBhcmFt
cyA9IGpRdWVyeS5wYXJhbSggcGFyYW1zICk7CisJCQkJdHlwZSA9ICJQT1NUIjsKKwkJCX0KKwor
CQl2YXIgc2VsZiA9IHRoaXM7CisKKwkJLy8gUmVxdWVzdCB0aGUgcmVtb3RlIGRvY3VtZW50CisJ
CWpRdWVyeS5hamF4KHsKKwkJCXVybDogdXJsLAorCQkJdHlwZTogdHlwZSwKKwkJCWRhdGFUeXBl
OiAiaHRtbCIsCisJCQlkYXRhOiBwYXJhbXMsCisJCQljb21wbGV0ZTogZnVuY3Rpb24ocmVzLCBz
dGF0dXMpeworCQkJCS8vIElmIHN1Y2Nlc3NmdWwsIGluamVjdCB0aGUgSFRNTCBpbnRvIGFsbCB0
aGUgbWF0Y2hlZCBlbGVtZW50cworCQkJCWlmICggc3RhdHVzID09ICJzdWNjZXNzIiB8fCBzdGF0
dXMgPT0gIm5vdG1vZGlmaWVkIiApCisJCQkJCS8vIFNlZSBpZiBhIHNlbGVjdG9yIHdhcyBzcGVj
aWZpZWQKKwkJCQkJc2VsZi5odG1sKCBzZWxlY3RvciA/CisJCQkJCQkvLyBDcmVhdGUgYSBkdW1t
eSBkaXYgdG8gaG9sZCB0aGUgcmVzdWx0cworCQkJCQkJalF1ZXJ5KCI8ZGl2Lz4iKQorCQkJCQkJ
CS8vIGluamVjdCB0aGUgY29udGVudHMgb2YgdGhlIGRvY3VtZW50IGluLCByZW1vdmluZyB0aGUg
c2NyaXB0cworCQkJCQkJCS8vIHRvIGF2b2lkIGFueSAnUGVybWlzc2lvbiBEZW5pZWQnIGVycm9y
cyBpbiBJRQorCQkJCQkJCS5hcHBlbmQocmVzLnJlc3BvbnNlVGV4dC5yZXBsYWNlKC88c2NyaXB0
KC58XHMpKj9cL3NjcmlwdD4vZywgIiIpKQorCisJCQkJCQkJLy8gTG9jYXRlIHRoZSBzcGVjaWZp
ZWQgZWxlbWVudHMKKwkJCQkJCQkuZmluZChzZWxlY3RvcikgOgorCisJCQkJCQkvLyBJZiBub3Qs
IGp1c3QgaW5qZWN0IHRoZSBmdWxsIHJlc3VsdAorCQkJCQkJcmVzLnJlc3BvbnNlVGV4dCApOwor
CisJCQkJc2VsZi5lYWNoKCBjYWxsYmFjaywgW3Jlcy5yZXNwb25zZVRleHQsIHN0YXR1cywgcmVz
XSApOworCQkJfQorCQl9KTsKKwkJcmV0dXJuIHRoaXM7CisJfSwKKworCXNlcmlhbGl6ZTogZnVu
Y3Rpb24oKSB7CisJCXJldHVybiBqUXVlcnkucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKTsK
Kwl9LAorCXNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbigpIHsKKwkJcmV0dXJuIHRoaXMubWFwKGZ1
bmN0aW9uKCl7CisJCQlyZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKHRoaXMsICJmb3JtIikgPworCQkJ
CWpRdWVyeS5tYWtlQXJyYXkodGhpcy5lbGVtZW50cykgOiB0aGlzOworCQl9KQorCQkuZmlsdGVy
KGZ1bmN0aW9uKCl7CisJCQlyZXR1cm4gdGhpcy5uYW1lICYmICF0aGlzLmRpc2FibGVkICYmCisJ
CQkJKHRoaXMuY2hlY2tlZCB8fCAvc2VsZWN0fHRleHRhcmVhL2kudGVzdCh0aGlzLm5vZGVOYW1l
KSB8fAorCQkJCQkvdGV4dHxoaWRkZW58cGFzc3dvcmQvaS50ZXN0KHRoaXMudHlwZSkpOworCQl9
KQorCQkubWFwKGZ1bmN0aW9uKGksIGVsZW0peworCQkJdmFyIHZhbCA9IGpRdWVyeSh0aGlzKS52
YWwoKTsKKwkJCXJldHVybiB2YWwgPT0gbnVsbCA/IG51bGwgOgorCQkJCXZhbC5jb25zdHJ1Y3Rv
ciA9PSBBcnJheSA/CisJCQkJCWpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24odmFsLCBpKXsKKwkJ
CQkJCXJldHVybiB7bmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsfTsKKwkJCQkJfSkgOgorCQkJ
CQl7bmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsfTsKKwkJfSkuZ2V0KCk7CisJfQorfSk7CisK
Ky8vIEF0dGFjaCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgY29tbW9uIEFKQVgg
ZXZlbnRzCitqUXVlcnkuZWFjaCggImFqYXhTdGFydCxhamF4U3RvcCxhamF4Q29tcGxldGUsYWph
eEVycm9yLGFqYXhTdWNjZXNzLGFqYXhTZW5kIi5zcGxpdCgiLCIpLCBmdW5jdGlvbihpLG8pewor
CWpRdWVyeS5mbltvXSA9IGZ1bmN0aW9uKGYpeworCQlyZXR1cm4gdGhpcy5iaW5kKG8sIGYpOwor
CX07Cit9KTsKKwordmFyIGpzYyA9IG5vdygpOworCitqUXVlcnkuZXh0ZW5kKHsKKwlnZXQ6IGZ1
bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkgeworCQkvLyBzaGlmdCBhcmd1bWVu
dHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21taXRlZAorCQlpZiAoIGpRdWVyeS5pc0Z1bmN0aW9u
KCBkYXRhICkgKSB7CisJCQljYWxsYmFjayA9IGRhdGE7CisJCQlkYXRhID0gbnVsbDsKKwkJfQor
CisJCXJldHVybiBqUXVlcnkuYWpheCh7CisJCQl0eXBlOiAiR0VUIiwKKwkJCXVybDogdXJsLAor
CQkJZGF0YTogZGF0YSwKKwkJCXN1Y2Nlc3M6IGNhbGxiYWNrLAorCQkJZGF0YVR5cGU6IHR5cGUK
KwkJfSk7CisJfSwKKworCWdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7CisJ
CXJldHVybiBqUXVlcnkuZ2V0KHVybCwgbnVsbCwgY2FsbGJhY2ssICJzY3JpcHQiKTsKKwl9LAor
CisJZ2V0SlNPTjogZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2sgKSB7CisJCXJldHVybiBq
UXVlcnkuZ2V0KHVybCwgZGF0YSwgY2FsbGJhY2ssICJqc29uIik7CisJfSwKKworCXBvc3Q6IGZ1
bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrLCB0eXBlICkgeworCQlpZiAoIGpRdWVyeS5pc0Z1
bmN0aW9uKCBkYXRhICkgKSB7CisJCQljYWxsYmFjayA9IGRhdGE7CisJCQlkYXRhID0ge307CisJ
CX0KKworCQlyZXR1cm4galF1ZXJ5LmFqYXgoeworCQkJdHlwZTogIlBPU1QiLAorCQkJdXJsOiB1
cmwsCisJCQlkYXRhOiBkYXRhLAorCQkJc3VjY2VzczogY2FsbGJhY2ssCisJCQlkYXRhVHlwZTog
dHlwZQorCQl9KTsKKwl9LAorCisJYWpheFNldHVwOiBmdW5jdGlvbiggc2V0dGluZ3MgKSB7CisJ
CWpRdWVyeS5leHRlbmQoIGpRdWVyeS5hamF4U2V0dGluZ3MsIHNldHRpbmdzICk7CisJfSwKKwor
CWFqYXhTZXR0aW5nczogeworCQl1cmw6IGxvY2F0aW9uLmhyZWYsCisJCWdsb2JhbDogdHJ1ZSwK
KwkJdHlwZTogIkdFVCIsCisJCXRpbWVvdXQ6IDAsCisJCWNvbnRlbnRUeXBlOiAiYXBwbGljYXRp
b24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwKKwkJcHJvY2Vzc0RhdGE6IHRydWUsCisJCWFzeW5j
OiB0cnVlLAorCQlkYXRhOiBudWxsLAorCQl1c2VybmFtZTogbnVsbCwKKwkJcGFzc3dvcmQ6IG51
bGwsCisJCWFjY2VwdHM6IHsKKwkJCXhtbDogImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLAor
CQkJaHRtbDogInRleHQvaHRtbCIsCisJCQlzY3JpcHQ6ICJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxp
Y2F0aW9uL2phdmFzY3JpcHQiLAorCQkJanNvbjogImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2
YXNjcmlwdCIsCisJCQl0ZXh0OiAidGV4dC9wbGFpbiIsCisJCQlfZGVmYXVsdDogIiovKiIKKwkJ
fQorCX0sCisKKwkvLyBMYXN0LU1vZGlmaWVkIGhlYWRlciBjYWNoZSBmb3IgbmV4dCByZXF1ZXN0
CisJbGFzdE1vZGlmaWVkOiB7fSwKKworCWFqYXg6IGZ1bmN0aW9uKCBzICkgeworCQkvLyBFeHRl
bmQgdGhlIHNldHRpbmdzLCBidXQgcmUtZXh0ZW5kICdzJyBzbyB0aGF0IGl0IGNhbiBiZQorCQkv
LyBjaGVja2VkIGFnYWluIGxhdGVyIChpbiB0aGUgdGVzdCBzdWl0ZSwgc3BlY2lmaWNhbGx5KQor
CQlzID0galF1ZXJ5LmV4dGVuZCh0cnVlLCBzLCBqUXVlcnkuZXh0ZW5kKHRydWUsIHt9LCBqUXVl
cnkuYWpheFNldHRpbmdzLCBzKSk7CisKKwkJdmFyIGpzb25wLCBqc3JlID0gLz1cPygmfCQpL2cs
IHN0YXR1cywgZGF0YSwKKwkJCXR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTsKKworCQkvLyBj
b252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmcKKwkJaWYgKCBzLmRhdGEgJiYgcy5w
cm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9ICJzdHJpbmciICkKKwkJCXMuZGF0YSA9IGpR
dWVyeS5wYXJhbShzLmRhdGEpOworCisJCS8vIEhhbmRsZSBKU09OUCBQYXJhbWV0ZXIgQ2FsbGJh
Y2tzCisJCWlmICggcy5kYXRhVHlwZSA9PSAianNvbnAiICkgeworCQkJaWYgKCB0eXBlID09ICJH
RVQiICkgeworCQkJCWlmICggIXMudXJsLm1hdGNoKGpzcmUpICkKKwkJCQkJcy51cmwgKz0gKHMu
dXJsLm1hdGNoKC9cPy8pID8gIiYiIDogIj8iKSArIChzLmpzb25wIHx8ICJjYWxsYmFjayIpICsg
Ij0/IjsKKwkJCX0gZWxzZSBpZiAoICFzLmRhdGEgfHwgIXMuZGF0YS5tYXRjaChqc3JlKSApCisJ
CQkJcy5kYXRhID0gKHMuZGF0YSA/IHMuZGF0YSArICImIiA6ICIiKSArIChzLmpzb25wIHx8ICJj
YWxsYmFjayIpICsgIj0/IjsKKwkJCXMuZGF0YVR5cGUgPSAianNvbiI7CisJCX0KKworCQkvLyBC
dWlsZCB0ZW1wb3JhcnkgSlNPTlAgZnVuY3Rpb24KKwkJaWYgKCBzLmRhdGFUeXBlID09ICJqc29u
IiAmJiAocy5kYXRhICYmIHMuZGF0YS5tYXRjaChqc3JlKSB8fCBzLnVybC5tYXRjaChqc3JlKSkg
KSB7CisJCQlqc29ucCA9ICJqc29ucCIgKyBqc2MrKzsKKworCQkJLy8gUmVwbGFjZSB0aGUgPT8g
c2VxdWVuY2UgYm90aCBpbiB0aGUgcXVlcnkgc3RyaW5nIGFuZCB0aGUgZGF0YQorCQkJaWYgKCBz
LmRhdGEgKQorCQkJCXMuZGF0YSA9IChzLmRhdGEgKyAiIikucmVwbGFjZShqc3JlLCAiPSIgKyBq
c29ucCArICIkMSIpOworCQkJcy51cmwgPSBzLnVybC5yZXBsYWNlKGpzcmUsICI9IiArIGpzb25w
ICsgIiQxIik7CisKKwkJCS8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlCisJCQkvLyB0aGF0IGEgSlNP
TlAgc3R5bGUgcmVzcG9uc2UgaXMgZXhlY3V0ZWQgcHJvcGVybHkKKwkJCXMuZGF0YVR5cGUgPSAi
c2NyaXB0IjsKKworCQkJLy8gSGFuZGxlIEpTT05QLXN0eWxlIGxvYWRpbmcKKwkJCXdpbmRvd1sg
anNvbnAgXSA9IGZ1bmN0aW9uKHRtcCl7CisJCQkJZGF0YSA9IHRtcDsKKwkJCQlzdWNjZXNzKCk7
CisJCQkJY29tcGxldGUoKTsKKwkJCQkvLyBHYXJiYWdlIGNvbGxlY3QKKwkJCQl3aW5kb3dbIGpz
b25wIF0gPSB1bmRlZmluZWQ7CisJCQkJdHJ5eyBkZWxldGUgd2luZG93WyBqc29ucCBdOyB9IGNh
dGNoKGUpe30KKwkJCQlpZiAoIGhlYWQgKQorCQkJCQloZWFkLnJlbW92ZUNoaWxkKCBzY3JpcHQg
KTsKKwkJCX07CisJCX0KKworCQlpZiAoIHMuZGF0YVR5cGUgPT0gInNjcmlwdCIgJiYgcy5jYWNo
ZSA9PSBudWxsICkKKwkJCXMuY2FjaGUgPSBmYWxzZTsKKworCQlpZiAoIHMuY2FjaGUgPT09IGZh
bHNlICYmIHR5cGUgPT0gIkdFVCIgKSB7CisJCQl2YXIgdHMgPSBub3coKTsKKwkJCS8vIHRyeSBy
ZXBsYWNpbmcgXz0gaWYgaXQgaXMgdGhlcmUKKwkJCXZhciByZXQgPSBzLnVybC5yZXBsYWNlKC8o
XD98JilfPS4qPygmfCQpLywgIiQxXz0iICsgdHMgKyAiJDIiKTsKKwkJCS8vIGlmIG5vdGhpbmcg
d2FzIHJlcGxhY2VkLCBhZGQgdGltZXN0YW1wIHRvIHRoZSBlbmQKKwkJCXMudXJsID0gcmV0ICsg
KChyZXQgPT0gcy51cmwpID8gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDogIj8iKSArICJfPSIg
KyB0cyA6ICIiKTsKKwkJfQorCisJCS8vIElmIGRhdGEgaXMgYXZhaWxhYmxlLCBhcHBlbmQgZGF0
YSB0byB1cmwgZm9yIGdldCByZXF1ZXN0cworCQlpZiAoIHMuZGF0YSAmJiB0eXBlID09ICJHRVQi
ICkgeworCQkJcy51cmwgKz0gKHMudXJsLm1hdGNoKC9cPy8pID8gIiYiIDogIj8iKSArIHMuZGF0
YTsKKworCQkJLy8gSUUgbGlrZXMgdG8gc2VuZCBib3RoIGdldCBhbmQgcG9zdCBkYXRhLCBwcmV2
ZW50IHRoaXMKKwkJCXMuZGF0YSA9IG51bGw7CisJCX0KKworCQkvLyBXYXRjaCBmb3IgYSBuZXcg
c2V0IG9mIHJlcXVlc3RzCisJCWlmICggcy5nbG9iYWwgJiYgISBqUXVlcnkuYWN0aXZlKysgKQor
CQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3RhcnQiICk7CisKKwkJLy8gTWF0Y2hlcyBh
biBhYnNvbHV0ZSBVUkwsIGFuZCBzYXZlcyB0aGUgZG9tYWluCisJCXZhciByZW1vdGUgPSAvXig/
Olx3KzopP1wvXC8oW15cLz8jXSspLzsKKworCQkvLyBJZiB3ZSdyZSByZXF1ZXN0aW5nIGEgcmVt
b3RlIGRvY3VtZW50CisJCS8vIGFuZCB0cnlpbmcgdG8gbG9hZCBKU09OIG9yIFNjcmlwdCB3aXRo
IGEgR0VUCisJCWlmICggcy5kYXRhVHlwZSA9PSAic2NyaXB0IiAmJiB0eXBlID09ICJHRVQiCisJ
CQkJJiYgcmVtb3RlLnRlc3Qocy51cmwpICYmIHJlbW90ZS5leGVjKHMudXJsKVsxXSAhPSBsb2Nh
dGlvbi5ob3N0ICl7CisJCQl2YXIgaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1l
KCJoZWFkIilbMF07CisJCQl2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2Ny
aXB0Iik7CisJCQlzY3JpcHQuc3JjID0gcy51cmw7CisJCQlpZiAocy5zY3JpcHRDaGFyc2V0KQor
CQkJCXNjcmlwdC5jaGFyc2V0ID0gcy5zY3JpcHRDaGFyc2V0OworCisJCQkvLyBIYW5kbGUgU2Ny
aXB0IGxvYWRpbmcKKwkJCWlmICggIWpzb25wICkgeworCQkJCXZhciBkb25lID0gZmFsc2U7CisK
KwkJCQkvLyBBdHRhY2ggaGFuZGxlcnMgZm9yIGFsbCBicm93c2VycworCQkJCXNjcmlwdC5vbmxv
YWQgPSBzY3JpcHQub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKXsKKwkJCQkJaWYgKCAh
ZG9uZSAmJiAoIXRoaXMucmVhZHlTdGF0ZSB8fAorCQkJCQkJCXRoaXMucmVhZHlTdGF0ZSA9PSAi
bG9hZGVkIiB8fCB0aGlzLnJlYWR5U3RhdGUgPT0gImNvbXBsZXRlIikgKSB7CisJCQkJCQlkb25l
ID0gdHJ1ZTsKKwkJCQkJCXN1Y2Nlc3MoKTsKKwkJCQkJCWNvbXBsZXRlKCk7CisJCQkJCQloZWFk
LnJlbW92ZUNoaWxkKCBzY3JpcHQgKTsKKwkJCQkJfQorCQkJCX07CisJCQl9CisKKwkJCWhlYWQu
YXBwZW5kQ2hpbGQoc2NyaXB0KTsKKworCQkJLy8gV2UgaGFuZGxlIGV2ZXJ5dGhpbmcgdXNpbmcg
dGhlIHNjcmlwdCBlbGVtZW50IGluamVjdGlvbgorCQkJcmV0dXJuIHVuZGVmaW5lZDsKKwkJfQor
CisJCXZhciByZXF1ZXN0RG9uZSA9IGZhbHNlOworCisJCS8vIENyZWF0ZSB0aGUgcmVxdWVzdCBv
YmplY3Q7IE1pY3Jvc29mdCBmYWlsZWQgdG8gcHJvcGVybHkKKwkJLy8gaW1wbGVtZW50IHRoZSBY
TUxIdHRwUmVxdWVzdCBpbiBJRTcsIHNvIHdlIHVzZSB0aGUgQWN0aXZlWE9iamVjdCB3aGVuIGl0
IGlzIGF2YWlsYWJsZQorCQl2YXIgeGhyID0gd2luZG93LkFjdGl2ZVhPYmplY3QgPyBuZXcgQWN0
aXZlWE9iamVjdCgiTWljcm9zb2Z0LlhNTEhUVFAiKSA6IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwor
CisJCS8vIE9wZW4gdGhlIHNvY2tldAorCQkvLyBQYXNzaW5nIG51bGwgdXNlcm5hbWUsIGdlbmVy
YXRlcyBhIGxvZ2luIHBvcHVwIG9uIE9wZXJhICgjMjg2NSkKKwkJaWYoIHMudXNlcm5hbWUgKQor
CQkJeGhyLm9wZW4odHlwZSwgcy51cmwsIHMuYXN5bmMsIHMudXNlcm5hbWUsIHMucGFzc3dvcmQp
OworCQllbHNlCisJCQl4aHIub3Blbih0eXBlLCBzLnVybCwgcy5hc3luYyk7CisKKwkJLy8gTmVl
ZCBhbiBleHRyYSB0cnkvY2F0Y2ggZm9yIGNyb3NzIGRvbWFpbiByZXF1ZXN0cyBpbiBGaXJlZm94
IDMKKwkJdHJ5IHsKKwkJCS8vIFNldCB0aGUgY29ycmVjdCBoZWFkZXIsIGlmIGRhdGEgaXMgYmVp
bmcgc2VudAorCQkJaWYgKCBzLmRhdGEgKQorCQkJCXhoci5zZXRSZXF1ZXN0SGVhZGVyKCJDb250
ZW50LVR5cGUiLCBzLmNvbnRlbnRUeXBlKTsKKworCQkJLy8gU2V0IHRoZSBJZi1Nb2RpZmllZC1T
aW5jZSBoZWFkZXIsIGlmIGlmTW9kaWZpZWQgbW9kZS4KKwkJCWlmICggcy5pZk1vZGlmaWVkICkK
KwkJCQl4aHIuc2V0UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLAorCQkJCQlqUXVl
cnkubGFzdE1vZGlmaWVkW3MudXJsXSB8fCAiVGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBHTVQi
ICk7CisKKwkJCS8vIFNldCBoZWFkZXIgc28gdGhlIGNhbGxlZCBzY3JpcHQga25vd3MgdGhhdCBp
dCdzIGFuIFhNTEh0dHBSZXF1ZXN0CisJCQl4aHIuc2V0UmVxdWVzdEhlYWRlcigiWC1SZXF1ZXN0
ZWQtV2l0aCIsICJYTUxIdHRwUmVxdWVzdCIpOworCisJCQkvLyBTZXQgdGhlIEFjY2VwdHMgaGVh
ZGVyIGZvciB0aGUgc2VydmVyLCBkZXBlbmRpbmcgb24gdGhlIGRhdGFUeXBlCisJCQl4aHIuc2V0
UmVxdWVzdEhlYWRlcigiQWNjZXB0Iiwgcy5kYXRhVHlwZSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5
cGUgXSA/CisJCQkJcy5hY2NlcHRzWyBzLmRhdGFUeXBlIF0gKyAiLCAqLyoiIDoKKwkJCQlzLmFj
Y2VwdHMuX2RlZmF1bHQgKTsKKwkJfSBjYXRjaChlKXt9CisKKwkJLy8gQWxsb3cgY3VzdG9tIGhl
YWRlcnMvbWltZXR5cGVzCisJCWlmICggcy5iZWZvcmVTZW5kICYmIHMuYmVmb3JlU2VuZCh4aHIs
IHMpID09PSBmYWxzZSApIHsKKwkJCS8vIGNsZWFudXAgYWN0aXZlIHJlcXVlc3QgY291bnRlcgor
CQkJcy5nbG9iYWwgJiYgalF1ZXJ5LmFjdGl2ZS0tOworCQkJLy8gY2xvc2Ugb3BlbmRlZCBzb2Nr
ZXQKKwkJCXhoci5hYm9ydCgpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJaWYgKCBzLmds
b2JhbCApCisJCQlqUXVlcnkuZXZlbnQudHJpZ2dlcigiYWpheFNlbmQiLCBbeGhyLCBzXSk7CisK
KwkJLy8gV2FpdCBmb3IgYSByZXNwb25zZSB0byBjb21lIGJhY2sKKwkJdmFyIG9ucmVhZHlzdGF0
ZWNoYW5nZSA9IGZ1bmN0aW9uKGlzVGltZW91dCl7CisJCQkvLyBUaGUgdHJhbnNmZXIgaXMgY29t
cGxldGUgYW5kIHRoZSBkYXRhIGlzIGF2YWlsYWJsZSwgb3IgdGhlIHJlcXVlc3QgdGltZWQgb3V0
CisJCQlpZiAoICFyZXF1ZXN0RG9uZSAmJiB4aHIgJiYgKHhoci5yZWFkeVN0YXRlID09IDQgfHwg
aXNUaW1lb3V0ID09ICJ0aW1lb3V0IikgKSB7CisJCQkJcmVxdWVzdERvbmUgPSB0cnVlOworCisJ
CQkJLy8gY2xlYXIgcG9sbCBpbnRlcnZhbAorCQkJCWlmIChpdmFsKSB7CisJCQkJCWNsZWFySW50
ZXJ2YWwoaXZhbCk7CisJCQkJCWl2YWwgPSBudWxsOworCQkJCX0KKworCQkJCXN0YXR1cyA9IGlz
VGltZW91dCA9PSAidGltZW91dCIgJiYgInRpbWVvdXQiIHx8CisJCQkJCSFqUXVlcnkuaHR0cFN1
Y2Nlc3MoIHhociApICYmICJlcnJvciIgfHwKKwkJCQkJcy5pZk1vZGlmaWVkICYmIGpRdWVyeS5o
dHRwTm90TW9kaWZpZWQoIHhociwgcy51cmwgKSAmJiAibm90bW9kaWZpZWQiIHx8CisJCQkJCSJz
dWNjZXNzIjsKKworCQkJCWlmICggc3RhdHVzID09ICJzdWNjZXNzIiApIHsKKwkJCQkJLy8gV2F0
Y2ggZm9yLCBhbmQgY2F0Y2gsIFhNTCBkb2N1bWVudCBwYXJzZSBlcnJvcnMKKwkJCQkJdHJ5IHsK
KwkJCQkJCS8vIHByb2Nlc3MgdGhlIGRhdGEgKHJ1bnMgdGhlIHhtbCB0aHJvdWdoIGh0dHBEYXRh
IHJlZ2FyZGxlc3Mgb2YgY2FsbGJhY2spCisJCQkJCQlkYXRhID0galF1ZXJ5Lmh0dHBEYXRhKCB4
aHIsIHMuZGF0YVR5cGUsIHMuZGF0YUZpbHRlciApOworCQkJCQl9IGNhdGNoKGUpIHsKKwkJCQkJ
CXN0YXR1cyA9ICJwYXJzZXJlcnJvciI7CisJCQkJCX0KKwkJCQl9CisKKwkJCQkvLyBNYWtlIHN1
cmUgdGhhdCB0aGUgcmVxdWVzdCB3YXMgc3VjY2Vzc2Z1bCBvciBub3Rtb2RpZmllZAorCQkJCWlm
ICggc3RhdHVzID09ICJzdWNjZXNzIiApIHsKKwkJCQkJLy8gQ2FjaGUgTGFzdC1Nb2RpZmllZCBo
ZWFkZXIsIGlmIGlmTW9kaWZpZWQgbW9kZS4KKwkJCQkJdmFyIG1vZFJlczsKKwkJCQkJdHJ5IHsK
KwkJCQkJCW1vZFJlcyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2RpZmllZCIpOwor
CQkJCQl9IGNhdGNoKGUpIHt9IC8vIHN3YWxsb3cgZXhjZXB0aW9uIHRocm93biBieSBGRiBpZiBo
ZWFkZXIgaXMgbm90IGF2YWlsYWJsZQorCisJCQkJCWlmICggcy5pZk1vZGlmaWVkICYmIG1vZFJl
cyApCisJCQkJCQlqUXVlcnkubGFzdE1vZGlmaWVkW3MudXJsXSA9IG1vZFJlczsKKworCQkJCQkv
LyBKU09OUCBoYW5kbGVzIGl0cyBvd24gc3VjY2VzcyBjYWxsYmFjaworCQkJCQlpZiAoICFqc29u
cCApCisJCQkJCQlzdWNjZXNzKCk7CisJCQkJfSBlbHNlCisJCQkJCWpRdWVyeS5oYW5kbGVFcnJv
cihzLCB4aHIsIHN0YXR1cyk7CisKKwkJCQkvLyBGaXJlIHRoZSBjb21wbGV0ZSBoYW5kbGVycwor
CQkJCWNvbXBsZXRlKCk7CisKKwkJCQkvLyBTdG9wIG1lbW9yeSBsZWFrcworCQkJCWlmICggcy5h
c3luYyApCisJCQkJCXhociA9IG51bGw7CisJCQl9CisJCX07CisKKwkJaWYgKCBzLmFzeW5jICkg
eworCQkJLy8gZG9uJ3QgYXR0YWNoIHRoZSBoYW5kbGVyIHRvIHRoZSByZXF1ZXN0LCBqdXN0IHBv
bGwgaXQgaW5zdGVhZAorCQkJdmFyIGl2YWwgPSBzZXRJbnRlcnZhbChvbnJlYWR5c3RhdGVjaGFu
Z2UsIDEzKTsKKworCQkJLy8gVGltZW91dCBjaGVja2VyCisJCQlpZiAoIHMudGltZW91dCA+IDAg
KQorCQkJCXNldFRpbWVvdXQoZnVuY3Rpb24oKXsKKwkJCQkJLy8gQ2hlY2sgdG8gc2VlIGlmIHRo
ZSByZXF1ZXN0IGlzIHN0aWxsIGhhcHBlbmluZworCQkJCQlpZiAoIHhociApIHsKKwkJCQkJCS8v
IENhbmNlbCB0aGUgcmVxdWVzdAorCQkJCQkJeGhyLmFib3J0KCk7CisKKwkJCQkJCWlmKCAhcmVx
dWVzdERvbmUgKQorCQkJCQkJCW9ucmVhZHlzdGF0ZWNoYW5nZSggInRpbWVvdXQiICk7CisJCQkJ
CX0KKwkJCQl9LCBzLnRpbWVvdXQpOworCQl9CisKKwkJLy8gU2VuZCB0aGUgZGF0YQorCQl0cnkg
eworCQkJeGhyLnNlbmQocy5kYXRhKTsKKwkJfSBjYXRjaChlKSB7CisJCQlqUXVlcnkuaGFuZGxl
RXJyb3IocywgeGhyLCBudWxsLCBlKTsKKwkJfQorCisJCS8vIGZpcmVmb3ggMS41IGRvZXNuJ3Qg
ZmlyZSBzdGF0ZWNoYW5nZSBmb3Igc3luYyByZXF1ZXN0cworCQlpZiAoICFzLmFzeW5jICkKKwkJ
CW9ucmVhZHlzdGF0ZWNoYW5nZSgpOworCisJCWZ1bmN0aW9uIHN1Y2Nlc3MoKXsKKwkJCS8vIElm
IGEgbG9jYWwgY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgZmlyZSBpdCBhbmQgcGFzcyBpdCB0aGUg
ZGF0YQorCQkJaWYgKCBzLnN1Y2Nlc3MgKQorCQkJCXMuc3VjY2VzcyggZGF0YSwgc3RhdHVzICk7
CisKKwkJCS8vIEZpcmUgdGhlIGdsb2JhbCBjYWxsYmFjaworCQkJaWYgKCBzLmdsb2JhbCApCisJ
CQkJalF1ZXJ5LmV2ZW50LnRyaWdnZXIoICJhamF4U3VjY2VzcyIsIFt4aHIsIHNdICk7CisJCX0K
KworCQlmdW5jdGlvbiBjb21wbGV0ZSgpeworCQkJLy8gUHJvY2VzcyByZXN1bHQKKwkJCWlmICgg
cy5jb21wbGV0ZSApCisJCQkJcy5jb21wbGV0ZSh4aHIsIHN0YXR1cyk7CisKKwkJCS8vIFRoZSBy
ZXF1ZXN0IHdhcyBjb21wbGV0ZWQKKwkJCWlmICggcy5nbG9iYWwgKQorCQkJCWpRdWVyeS5ldmVu
dC50cmlnZ2VyKCAiYWpheENvbXBsZXRlIiwgW3hociwgc10gKTsKKworCQkJLy8gSGFuZGxlIHRo
ZSBnbG9iYWwgQUpBWCBjb3VudGVyCisJCQlpZiAoIHMuZ2xvYmFsICYmICEgLS1qUXVlcnkuYWN0
aXZlICkKKwkJCQlqUXVlcnkuZXZlbnQudHJpZ2dlciggImFqYXhTdG9wIiApOworCQl9CisKKwkJ
Ly8gcmV0dXJuIFhNTEh0dHBSZXF1ZXN0IHRvIGFsbG93IGFib3J0aW5nIHRoZSByZXF1ZXN0IGV0
Yy4KKwkJcmV0dXJuIHhocjsKKwl9LAorCisJaGFuZGxlRXJyb3I6IGZ1bmN0aW9uKCBzLCB4aHIs
IHN0YXR1cywgZSApIHsKKwkJLy8gSWYgYSBsb2NhbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCBm
aXJlIGl0CisJCWlmICggcy5lcnJvciApIHMuZXJyb3IoIHhociwgc3RhdHVzLCBlICk7CisKKwkJ
Ly8gRmlyZSB0aGUgZ2xvYmFsIGNhbGxiYWNrCisJCWlmICggcy5nbG9iYWwgKQorCQkJalF1ZXJ5
LmV2ZW50LnRyaWdnZXIoICJhamF4RXJyb3IiLCBbeGhyLCBzLCBlXSApOworCX0sCisKKwkvLyBD
b3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXMKKwlhY3RpdmU6
IDAsCisKKwkvLyBEZXRlcm1pbmVzIGlmIGFuIFhNTEh0dHBSZXF1ZXN0IHdhcyBzdWNjZXNzZnVs
IG9yIG5vdAorCWh0dHBTdWNjZXNzOiBmdW5jdGlvbiggeGhyICkgeworCQl0cnkgeworCQkJLy8g
SUUgZXJyb3Igc29tZXRpbWVzIHJldHVybnMgMTIyMyB3aGVuIGl0IHNob3VsZCBiZSAyMDQgc28g
dHJlYXQgaXQgYXMgc3VjY2Vzcywgc2VlICMxNDUwCisJCQlyZXR1cm4gIXhoci5zdGF0dXMgJiYg
bG9jYXRpb24ucHJvdG9jb2wgPT0gImZpbGU6IiB8fAorCQkJCSggeGhyLnN0YXR1cyA+PSAyMDAg
JiYgeGhyLnN0YXR1cyA8IDMwMCApIHx8IHhoci5zdGF0dXMgPT0gMzA0IHx8IHhoci5zdGF0dXMg
PT0gMTIyMyB8fAorCQkJCWpRdWVyeS5icm93c2VyLnNhZmFyaSAmJiB4aHIuc3RhdHVzID09IHVu
ZGVmaW5lZDsKKwkJfSBjYXRjaChlKXt9CisJCXJldHVybiBmYWxzZTsKKwl9LAorCisJLy8gRGV0
ZXJtaW5lcyBpZiBhbiBYTUxIdHRwUmVxdWVzdCByZXR1cm5zIE5vdE1vZGlmaWVkCisJaHR0cE5v
dE1vZGlmaWVkOiBmdW5jdGlvbiggeGhyLCB1cmwgKSB7CisJCXRyeSB7CisJCQl2YXIgeGhyUmVz
ID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIik7CisKKwkJCS8vIEZpcmVm
b3ggYWx3YXlzIHJldHVybnMgMjAwLiBjaGVjayBMYXN0LU1vZGlmaWVkIGRhdGUKKwkJCXJldHVy
biB4aHIuc3RhdHVzID09IDMwNCB8fCB4aHJSZXMgPT0galF1ZXJ5Lmxhc3RNb2RpZmllZFt1cmxd
IHx8CisJCQkJalF1ZXJ5LmJyb3dzZXIuc2FmYXJpICYmIHhoci5zdGF0dXMgPT0gdW5kZWZpbmVk
OworCQl9IGNhdGNoKGUpe30KKwkJcmV0dXJuIGZhbHNlOworCX0sCisKKwlodHRwRGF0YTogZnVu
Y3Rpb24oIHhociwgdHlwZSwgZmlsdGVyICkgeworCQl2YXIgY3QgPSB4aHIuZ2V0UmVzcG9uc2VI
ZWFkZXIoImNvbnRlbnQtdHlwZSIpLAorCQkJeG1sID0gdHlwZSA9PSAieG1sIiB8fCAhdHlwZSAm
JiBjdCAmJiBjdC5pbmRleE9mKCJ4bWwiKSA+PSAwLAorCQkJZGF0YSA9IHhtbCA/IHhoci5yZXNw
b25zZVhNTCA6IHhoci5yZXNwb25zZVRleHQ7CisKKwkJaWYgKCB4bWwgJiYgZGF0YS5kb2N1bWVu
dEVsZW1lbnQudGFnTmFtZSA9PSAicGFyc2VyZXJyb3IiICkKKwkJCXRocm93ICJwYXJzZXJlcnJv
ciI7CisJCQkKKwkJLy8gQWxsb3cgYSBwcmUtZmlsdGVyaW5nIGZ1bmN0aW9uIHRvIHNhbml0aXpl
IHRoZSByZXNwb25zZQorCQlpZiggZmlsdGVyICkKKwkJCWRhdGEgPSBmaWx0ZXIoIGRhdGEsIHR5
cGUgKTsKKworCQkvLyBJZiB0aGUgdHlwZSBpcyAic2NyaXB0IiwgZXZhbCBpdCBpbiBnbG9iYWwg
Y29udGV4dAorCQlpZiAoIHR5cGUgPT0gInNjcmlwdCIgKQorCQkJalF1ZXJ5Lmdsb2JhbEV2YWwo
IGRhdGEgKTsKKworCQkvLyBHZXQgdGhlIEphdmFTY3JpcHQgb2JqZWN0LCBpZiBKU09OIGlzIHVz
ZWQuCisJCWlmICggdHlwZSA9PSAianNvbiIgKQorCQkJZGF0YSA9IGV2YWwoIigiICsgZGF0YSAr
ICIpIik7CisKKwkJcmV0dXJuIGRhdGE7CisJfSwKKworCS8vIFNlcmlhbGl6ZSBhbiBhcnJheSBv
ZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mCisJLy8ga2V5L3ZhbHVlcyBpbnRvIGEgcXVlcnkg
c3RyaW5nCisJcGFyYW06IGZ1bmN0aW9uKCBhICkgeworCQl2YXIgcyA9IFtdOworCisJCS8vIElm
IGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5CisJCS8v
IG9mIGZvcm0gZWxlbWVudHMKKwkJaWYgKCBhLmNvbnN0cnVjdG9yID09IEFycmF5IHx8IGEuanF1
ZXJ5ICkKKwkJCS8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50cworCQkJalF1ZXJ5LmVhY2go
IGEsIGZ1bmN0aW9uKCl7CisJCQkJcy5wdXNoKCBlbmNvZGVVUklDb21wb25lbnQodGhpcy5uYW1l
KSArICI9IiArIGVuY29kZVVSSUNvbXBvbmVudCggdGhpcy52YWx1ZSApICk7CisJCQl9KTsKKwor
CQkvLyBPdGhlcndpc2UsIGFzc3VtZSB0aGF0IGl0J3MgYW4gb2JqZWN0IG9mIGtleS92YWx1ZSBw
YWlycworCQllbHNlCisJCQkvLyBTZXJpYWxpemUgdGhlIGtleS92YWx1ZXMKKwkJCWZvciAoIHZh
ciBqIGluIGEgKQorCQkJCS8vIElmIHRoZSB2YWx1ZSBpcyBhbiBhcnJheSB0aGVuIHRoZSBrZXkg
bmFtZXMgbmVlZCB0byBiZSByZXBlYXRlZAorCQkJCWlmICggYVtqXSAmJiBhW2pdLmNvbnN0cnVj
dG9yID09IEFycmF5ICkKKwkJCQkJalF1ZXJ5LmVhY2goIGFbal0sIGZ1bmN0aW9uKCl7CisJCQkJ
CQlzLnB1c2goIGVuY29kZVVSSUNvbXBvbmVudChqKSArICI9IiArIGVuY29kZVVSSUNvbXBvbmVu
dCggdGhpcyApICk7CisJCQkJCX0pOworCQkJCWVsc2UKKwkJCQkJcy5wdXNoKCBlbmNvZGVVUklD
b21wb25lbnQoaikgKyAiPSIgKyBlbmNvZGVVUklDb21wb25lbnQoIGpRdWVyeS5pc0Z1bmN0aW9u
KGFbal0pID8gYVtqXSgpIDogYVtqXSApICk7CisKKwkJLy8gUmV0dXJuIHRoZSByZXN1bHRpbmcg
c2VyaWFsaXphdGlvbgorCQlyZXR1cm4gcy5qb2luKCImIikucmVwbGFjZSgvJTIwL2csICIrIik7
CisJfQorCit9KTsKK2pRdWVyeS5mbi5leHRlbmQoeworCXNob3c6IGZ1bmN0aW9uKHNwZWVkLGNh
bGxiYWNrKXsKKwkJcmV0dXJuIHNwZWVkID8KKwkJCXRoaXMuYW5pbWF0ZSh7CisJCQkJaGVpZ2h0
OiAic2hvdyIsIHdpZHRoOiAic2hvdyIsIG9wYWNpdHk6ICJzaG93IgorCQkJfSwgc3BlZWQsIGNh
bGxiYWNrKSA6CisKKwkJCXRoaXMuZmlsdGVyKCI6aGlkZGVuIikuZWFjaChmdW5jdGlvbigpewor
CQkJCXRoaXMuc3R5bGUuZGlzcGxheSA9IHRoaXMub2xkYmxvY2sgfHwgIiI7CisJCQkJaWYgKCBq
UXVlcnkuY3NzKHRoaXMsImRpc3BsYXkiKSA9PSAibm9uZSIgKSB7CisJCQkJCXZhciBlbGVtID0g
alF1ZXJ5KCI8IiArIHRoaXMudGFnTmFtZSArICIgLz4iKS5hcHBlbmRUbygiYm9keSIpOworCQkJ
CQl0aGlzLnN0eWxlLmRpc3BsYXkgPSBlbGVtLmNzcygiZGlzcGxheSIpOworCQkJCQkvLyBoYW5k
bGUgYW4gZWRnZSBjb25kaXRpb24gd2hlcmUgY3NzIGlzIC0gZGl2IHsgZGlzcGxheTpub25lOyB9
IG9yIHNpbWlsYXIKKwkJCQkJaWYgKHRoaXMuc3R5bGUuZGlzcGxheSA9PSAibm9uZSIpCisJCQkJ
CQl0aGlzLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siOworCQkJCQllbGVtLnJlbW92ZSgpOworCQkJ
CX0KKwkJCX0pLmVuZCgpOworCX0sCisKKwloaWRlOiBmdW5jdGlvbihzcGVlZCxjYWxsYmFjayl7
CisJCXJldHVybiBzcGVlZCA/CisJCQl0aGlzLmFuaW1hdGUoeworCQkJCWhlaWdodDogImhpZGUi
LCB3aWR0aDogImhpZGUiLCBvcGFjaXR5OiAiaGlkZSIKKwkJCX0sIHNwZWVkLCBjYWxsYmFjaykg
OgorCisJCQl0aGlzLmZpbHRlcigiOnZpc2libGUiKS5lYWNoKGZ1bmN0aW9uKCl7CisJCQkJdGhp
cy5vbGRibG9jayA9IHRoaXMub2xkYmxvY2sgfHwgalF1ZXJ5LmNzcyh0aGlzLCJkaXNwbGF5Iik7
CisJCQkJdGhpcy5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCQkJfSkuZW5kKCk7CisJfSwKKwor
CS8vIFNhdmUgdGhlIG9sZCB0b2dnbGUgZnVuY3Rpb24KKwlfdG9nZ2xlOiBqUXVlcnkuZm4udG9n
Z2xlLAorCisJdG9nZ2xlOiBmdW5jdGlvbiggZm4sIGZuMiApeworCQlyZXR1cm4galF1ZXJ5Lmlz
RnVuY3Rpb24oZm4pICYmIGpRdWVyeS5pc0Z1bmN0aW9uKGZuMikgPworCQkJdGhpcy5fdG9nZ2xl
LmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSA6CisJCQlmbiA/CisJCQkJdGhpcy5hbmltYXRlKHsK
KwkJCQkJaGVpZ2h0OiAidG9nZ2xlIiwgd2lkdGg6ICJ0b2dnbGUiLCBvcGFjaXR5OiAidG9nZ2xl
IgorCQkJCX0sIGZuLCBmbjIpIDoKKwkJCQl0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJCQkJalF1
ZXJ5KHRoaXMpWyBqUXVlcnkodGhpcykuaXMoIjpoaWRkZW4iKSA/ICJzaG93IiA6ICJoaWRlIiBd
KCk7CisJCQkJfSk7CisJfSwKKworCXNsaWRlRG93bjogZnVuY3Rpb24oc3BlZWQsY2FsbGJhY2sp
eworCQlyZXR1cm4gdGhpcy5hbmltYXRlKHtoZWlnaHQ6ICJzaG93In0sIHNwZWVkLCBjYWxsYmFj
ayk7CisJfSwKKworCXNsaWRlVXA6IGZ1bmN0aW9uKHNwZWVkLGNhbGxiYWNrKXsKKwkJcmV0dXJu
IHRoaXMuYW5pbWF0ZSh7aGVpZ2h0OiAiaGlkZSJ9LCBzcGVlZCwgY2FsbGJhY2spOworCX0sCisK
KwlzbGlkZVRvZ2dsZTogZnVuY3Rpb24oc3BlZWQsIGNhbGxiYWNrKXsKKwkJcmV0dXJuIHRoaXMu
YW5pbWF0ZSh7aGVpZ2h0OiAidG9nZ2xlIn0sIHNwZWVkLCBjYWxsYmFjayk7CisJfSwKKworCWZh
ZGVJbjogZnVuY3Rpb24oc3BlZWQsIGNhbGxiYWNrKXsKKwkJcmV0dXJuIHRoaXMuYW5pbWF0ZSh7
b3BhY2l0eTogInNob3cifSwgc3BlZWQsIGNhbGxiYWNrKTsKKwl9LAorCisJZmFkZU91dDogZnVu
Y3Rpb24oc3BlZWQsIGNhbGxiYWNrKXsKKwkJcmV0dXJuIHRoaXMuYW5pbWF0ZSh7b3BhY2l0eTog
ImhpZGUifSwgc3BlZWQsIGNhbGxiYWNrKTsKKwl9LAorCisJZmFkZVRvOiBmdW5jdGlvbihzcGVl
ZCx0byxjYWxsYmFjayl7CisJCXJldHVybiB0aGlzLmFuaW1hdGUoe29wYWNpdHk6IHRvfSwgc3Bl
ZWQsIGNhbGxiYWNrKTsKKwl9LAorCisJYW5pbWF0ZTogZnVuY3Rpb24oIHByb3AsIHNwZWVkLCBl
YXNpbmcsIGNhbGxiYWNrICkgeworCQl2YXIgb3B0YWxsID0galF1ZXJ5LnNwZWVkKHNwZWVkLCBl
YXNpbmcsIGNhbGxiYWNrKTsKKworCQlyZXR1cm4gdGhpc1sgb3B0YWxsLnF1ZXVlID09PSBmYWxz
ZSA/ICJlYWNoIiA6ICJxdWV1ZSIgXShmdW5jdGlvbigpeworCQkJaWYgKCB0aGlzLm5vZGVUeXBl
ICE9IDEpCisJCQkJcmV0dXJuIGZhbHNlOworCisJCQl2YXIgb3B0ID0galF1ZXJ5LmV4dGVuZCh7
fSwgb3B0YWxsKSwgcCwKKwkJCQloaWRkZW4gPSBqUXVlcnkodGhpcykuaXMoIjpoaWRkZW4iKSwg
c2VsZiA9IHRoaXM7CisKKwkJCWZvciAoIHAgaW4gcHJvcCApIHsKKwkJCQlpZiAoIHByb3BbcF0g
PT0gImhpZGUiICYmIGhpZGRlbiB8fCBwcm9wW3BdID09ICJzaG93IiAmJiAhaGlkZGVuICkKKwkJ
CQkJcmV0dXJuIG9wdC5jb21wbGV0ZS5jYWxsKHRoaXMpOworCisJCQkJaWYgKCBwID09ICJoZWln
aHQiIHx8IHAgPT0gIndpZHRoIiApIHsKKwkJCQkJLy8gU3RvcmUgZGlzcGxheSBwcm9wZXJ0eQor
CQkJCQlvcHQuZGlzcGxheSA9IGpRdWVyeS5jc3ModGhpcywgImRpc3BsYXkiKTsKKworCQkJCQkv
LyBNYWtlIHN1cmUgdGhhdCBub3RoaW5nIHNuZWFrcyBvdXQKKwkJCQkJb3B0Lm92ZXJmbG93ID0g
dGhpcy5zdHlsZS5vdmVyZmxvdzsKKwkJCQl9CisJCQl9CisKKwkJCWlmICggb3B0Lm92ZXJmbG93
ICE9IG51bGwgKQorCQkJCXRoaXMuc3R5bGUub3ZlcmZsb3cgPSAiaGlkZGVuIjsKKworCQkJb3B0
LmN1ckFuaW0gPSBqUXVlcnkuZXh0ZW5kKHt9LCBwcm9wKTsKKworCQkJalF1ZXJ5LmVhY2goIHBy
b3AsIGZ1bmN0aW9uKG5hbWUsIHZhbCl7CisJCQkJdmFyIGUgPSBuZXcgalF1ZXJ5LmZ4KCBzZWxm
LCBvcHQsIG5hbWUgKTsKKworCQkJCWlmICggL3RvZ2dsZXxzaG93fGhpZGUvLnRlc3QodmFsKSAp
CisJCQkJCWVbIHZhbCA9PSAidG9nZ2xlIiA/IGhpZGRlbiA/ICJzaG93IiA6ICJoaWRlIiA6IHZh
bCBdKCBwcm9wICk7CisJCQkJZWxzZSB7CisJCQkJCXZhciBwYXJ0cyA9IHZhbC50b1N0cmluZygp
Lm1hdGNoKC9eKFsrLV09KT8oW1xkKy0uXSspKC4qKSQvKSwKKwkJCQkJCXN0YXJ0ID0gZS5jdXIo
dHJ1ZSkgfHwgMDsKKworCQkJCQlpZiAoIHBhcnRzICkgeworCQkJCQkJdmFyIGVuZCA9IHBhcnNl
RmxvYXQocGFydHNbMl0pLAorCQkJCQkJCXVuaXQgPSBwYXJ0c1szXSB8fCAicHgiOworCisJCQkJ
CQkvLyBXZSBuZWVkIHRvIGNvbXB1dGUgc3RhcnRpbmcgdmFsdWUKKwkJCQkJCWlmICggdW5pdCAh
PSAicHgiICkgeworCQkJCQkJCXNlbGYuc3R5bGVbIG5hbWUgXSA9IChlbmQgfHwgMSkgKyB1bml0
OworCQkJCQkJCXN0YXJ0ID0gKChlbmQgfHwgMSkgLyBlLmN1cih0cnVlKSkgKiBzdGFydDsKKwkJ
CQkJCQlzZWxmLnN0eWxlWyBuYW1lIF0gPSBzdGFydCArIHVuaXQ7CisJCQkJCQl9CisKKwkJCQkJ
CS8vIElmIGEgKz0vLT0gdG9rZW4gd2FzIHByb3ZpZGVkLCB3ZSdyZSBkb2luZyBhIHJlbGF0aXZl
IGFuaW1hdGlvbgorCQkJCQkJaWYgKCBwYXJ0c1sxXSApCisJCQkJCQkJZW5kID0gKChwYXJ0c1sx
XSA9PSAiLT0iID8gLTEgOiAxKSAqIGVuZCkgKyBzdGFydDsKKworCQkJCQkJZS5jdXN0b20oIHN0
YXJ0LCBlbmQsIHVuaXQgKTsKKwkJCQkJfSBlbHNlCisJCQkJCQllLmN1c3RvbSggc3RhcnQsIHZh
bCwgIiIgKTsKKwkJCQl9CisJCQl9KTsKKworCQkJLy8gRm9yIEpTIHN0cmljdCBjb21wbGlhbmNl
CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSk7CisJfSwKKworCXF1ZXVlOiBmdW5jdGlvbih0eXBlLCBm
bil7CisJCWlmICggalF1ZXJ5LmlzRnVuY3Rpb24odHlwZSkgfHwgKCB0eXBlICYmIHR5cGUuY29u
c3RydWN0b3IgPT0gQXJyYXkgKSkgeworCQkJZm4gPSB0eXBlOworCQkJdHlwZSA9ICJmeCI7CisJ
CX0KKworCQlpZiAoICF0eXBlIHx8ICh0eXBlb2YgdHlwZSA9PSAic3RyaW5nIiAmJiAhZm4pICkK
KwkJCXJldHVybiBxdWV1ZSggdGhpc1swXSwgdHlwZSApOworCisJCXJldHVybiB0aGlzLmVhY2go
ZnVuY3Rpb24oKXsKKwkJCWlmICggZm4uY29uc3RydWN0b3IgPT0gQXJyYXkgKQorCQkJCXF1ZXVl
KHRoaXMsIHR5cGUsIGZuKTsKKwkJCWVsc2UgeworCQkJCXF1ZXVlKHRoaXMsIHR5cGUpLnB1c2go
IGZuICk7CisKKwkJCQlpZiAoIHF1ZXVlKHRoaXMsIHR5cGUpLmxlbmd0aCA9PSAxICkKKwkJCQkJ
Zm4uY2FsbCh0aGlzKTsKKwkJCX0KKwkJfSk7CisJfSwKKworCXN0b3A6IGZ1bmN0aW9uKGNsZWFy
UXVldWUsIGdvdG9FbmQpeworCQl2YXIgdGltZXJzID0galF1ZXJ5LnRpbWVyczsKKworCQlpZiAo
Y2xlYXJRdWV1ZSkKKwkJCXRoaXMucXVldWUoW10pOworCisJCXRoaXMuZWFjaChmdW5jdGlvbigp
eworCQkJLy8gZ28gaW4gcmV2ZXJzZSBvcmRlciBzbyBhbnl0aGluZyBhZGRlZCB0byB0aGUgcXVl
dWUgZHVyaW5nIHRoZSBsb29wIGlzIGlnbm9yZWQKKwkJCWZvciAoIHZhciBpID0gdGltZXJzLmxl
bmd0aCAtIDE7IGkgPj0gMDsgaS0tICkKKwkJCQlpZiAoIHRpbWVyc1tpXS5lbGVtID09IHRoaXMg
KSB7CisJCQkJCWlmIChnb3RvRW5kKQorCQkJCQkJLy8gZm9yY2UgdGhlIG5leHQgc3RlcCB0byBi
ZSB0aGUgbGFzdAorCQkJCQkJdGltZXJzW2ldKHRydWUpOworCQkJCQl0aW1lcnMuc3BsaWNlKGks
IDEpOworCQkJCX0KKwkJfSk7CisKKwkJLy8gc3RhcnQgdGhlIG5leHQgaW4gdGhlIHF1ZXVlIGlm
IHRoZSBsYXN0IHN0ZXAgd2Fzbid0IGZvcmNlZAorCQlpZiAoIWdvdG9FbmQpCisJCQl0aGlzLmRl
cXVldWUoKTsKKworCQlyZXR1cm4gdGhpczsKKwl9CisKK30pOworCit2YXIgcXVldWUgPSBmdW5j
dGlvbiggZWxlbSwgdHlwZSwgYXJyYXkgKSB7CisJaWYgKCBlbGVtICl7CisKKwkJdHlwZSA9IHR5
cGUgfHwgImZ4IjsKKworCQl2YXIgcSA9IGpRdWVyeS5kYXRhKCBlbGVtLCB0eXBlICsgInF1ZXVl
IiApOworCisJCWlmICggIXEgfHwgYXJyYXkgKQorCQkJcSA9IGpRdWVyeS5kYXRhKCBlbGVtLCB0
eXBlICsgInF1ZXVlIiwgalF1ZXJ5Lm1ha2VBcnJheShhcnJheSkgKTsKKworCX0KKwlyZXR1cm4g
cTsKK307CisKK2pRdWVyeS5mbi5kZXF1ZXVlID0gZnVuY3Rpb24odHlwZSl7CisJdHlwZSA9IHR5
cGUgfHwgImZ4IjsKKworCXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXsKKwkJdmFyIHEgPSBx
dWV1ZSh0aGlzLCB0eXBlKTsKKworCQlxLnNoaWZ0KCk7CisKKwkJaWYgKCBxLmxlbmd0aCApCisJ
CQlxWzBdLmNhbGwoIHRoaXMgKTsKKwl9KTsKK307CisKK2pRdWVyeS5leHRlbmQoeworCisJc3Bl
ZWQ6IGZ1bmN0aW9uKHNwZWVkLCBlYXNpbmcsIGZuKSB7CisJCXZhciBvcHQgPSBzcGVlZCAmJiBz
cGVlZC5jb25zdHJ1Y3RvciA9PSBPYmplY3QgPyBzcGVlZCA6IHsKKwkJCWNvbXBsZXRlOiBmbiB8
fCAhZm4gJiYgZWFzaW5nIHx8CisJCQkJalF1ZXJ5LmlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3Bl
ZWQsCisJCQlkdXJhdGlvbjogc3BlZWQsCisJCQllYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNp
bmcgJiYgZWFzaW5nLmNvbnN0cnVjdG9yICE9IEZ1bmN0aW9uICYmIGVhc2luZworCQl9OworCisJ
CW9wdC5kdXJhdGlvbiA9IChvcHQuZHVyYXRpb24gJiYgb3B0LmR1cmF0aW9uLmNvbnN0cnVjdG9y
ID09IE51bWJlciA/CisJCQlvcHQuZHVyYXRpb24gOgorCQkJalF1ZXJ5LmZ4LnNwZWVkc1tvcHQu
ZHVyYXRpb25dKSB8fCBqUXVlcnkuZnguc3BlZWRzLmRlZjsKKworCQkvLyBRdWV1ZWluZworCQlv
cHQub2xkID0gb3B0LmNvbXBsZXRlOworCQlvcHQuY29tcGxldGUgPSBmdW5jdGlvbigpeworCQkJ
aWYgKCBvcHQucXVldWUgIT09IGZhbHNlICkKKwkJCQlqUXVlcnkodGhpcykuZGVxdWV1ZSgpOwor
CQkJaWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0Lm9sZCApICkKKwkJCQlvcHQub2xkLmNhbGwo
IHRoaXMgKTsKKwkJfTsKKworCQlyZXR1cm4gb3B0OworCX0sCisKKwllYXNpbmc6IHsKKwkJbGlu
ZWFyOiBmdW5jdGlvbiggcCwgbiwgZmlyc3ROdW0sIGRpZmYgKSB7CisJCQlyZXR1cm4gZmlyc3RO
dW0gKyBkaWZmICogcDsKKwkJfSwKKwkJc3dpbmc6IGZ1bmN0aW9uKCBwLCBuLCBmaXJzdE51bSwg
ZGlmZiApIHsKKwkJCXJldHVybiAoKC1NYXRoLmNvcyhwKk1hdGguUEkpLzIpICsgMC41KSAqIGRp
ZmYgKyBmaXJzdE51bTsKKwkJfQorCX0sCisKKwl0aW1lcnM6IFtdLAorCXRpbWVySWQ6IG51bGws
CisKKwlmeDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AgKXsKKwkJdGhpcy5vcHRpb25z
ID0gb3B0aW9uczsKKwkJdGhpcy5lbGVtID0gZWxlbTsKKwkJdGhpcy5wcm9wID0gcHJvcDsKKwor
CQlpZiAoICFvcHRpb25zLm9yaWcgKQorCQkJb3B0aW9ucy5vcmlnID0ge307CisJfQorCit9KTsK
KworalF1ZXJ5LmZ4LnByb3RvdHlwZSA9IHsKKworCS8vIFNpbXBsZSBmdW5jdGlvbiBmb3Igc2V0
dGluZyBhIHN0eWxlIHZhbHVlCisJdXBkYXRlOiBmdW5jdGlvbigpeworCQlpZiAoIHRoaXMub3B0
aW9ucy5zdGVwICkKKwkJCXRoaXMub3B0aW9ucy5zdGVwLmNhbGwoIHRoaXMuZWxlbSwgdGhpcy5u
b3csIHRoaXMgKTsKKworCQkoalF1ZXJ5LmZ4LnN0ZXBbdGhpcy5wcm9wXSB8fCBqUXVlcnkuZngu
c3RlcC5fZGVmYXVsdCkoIHRoaXMgKTsKKworCQkvLyBTZXQgZGlzcGxheSBwcm9wZXJ0eSB0byBi
bG9jayBmb3IgaGVpZ2h0L3dpZHRoIGFuaW1hdGlvbnMKKwkJaWYgKCB0aGlzLnByb3AgPT0gImhl
aWdodCIgfHwgdGhpcy5wcm9wID09ICJ3aWR0aCIgKQorCQkJdGhpcy5lbGVtLnN0eWxlLmRpc3Bs
YXkgPSAiYmxvY2siOworCX0sCisKKwkvLyBHZXQgdGhlIGN1cnJlbnQgc2l6ZQorCWN1cjogZnVu
Y3Rpb24oZm9yY2UpeworCQlpZiAoIHRoaXMuZWxlbVt0aGlzLnByb3BdICE9IG51bGwgJiYgdGhp
cy5lbGVtLnN0eWxlW3RoaXMucHJvcF0gPT0gbnVsbCApCisJCQlyZXR1cm4gdGhpcy5lbGVtWyB0
aGlzLnByb3AgXTsKKworCQl2YXIgciA9IHBhcnNlRmxvYXQoalF1ZXJ5LmNzcyh0aGlzLmVsZW0s
IHRoaXMucHJvcCwgZm9yY2UpKTsKKwkJcmV0dXJuIHIgJiYgciA+IC0xMDAwMCA/IHIgOiBwYXJz
ZUZsb2F0KGpRdWVyeS5jdXJDU1ModGhpcy5lbGVtLCB0aGlzLnByb3ApKSB8fCAwOworCX0sCisK
KwkvLyBTdGFydCBhbiBhbmltYXRpb24gZnJvbSBvbmUgbnVtYmVyIHRvIGFub3RoZXIKKwljdXN0
b206IGZ1bmN0aW9uKGZyb20sIHRvLCB1bml0KXsKKwkJdGhpcy5zdGFydFRpbWUgPSBub3coKTsK
KwkJdGhpcy5zdGFydCA9IGZyb207CisJCXRoaXMuZW5kID0gdG87CisJCXRoaXMudW5pdCA9IHVu
aXQgfHwgdGhpcy51bml0IHx8ICJweCI7CisJCXRoaXMubm93ID0gdGhpcy5zdGFydDsKKwkJdGhp
cy5wb3MgPSB0aGlzLnN0YXRlID0gMDsKKwkJdGhpcy51cGRhdGUoKTsKKworCQl2YXIgc2VsZiA9
IHRoaXM7CisJCWZ1bmN0aW9uIHQoZ290b0VuZCl7CisJCQlyZXR1cm4gc2VsZi5zdGVwKGdvdG9F
bmQpOworCQl9CisKKwkJdC5lbGVtID0gdGhpcy5lbGVtOworCisJCWpRdWVyeS50aW1lcnMucHVz
aCh0KTsKKworCQlpZiAoIGpRdWVyeS50aW1lcklkID09IG51bGwgKSB7CisJCQlqUXVlcnkudGlt
ZXJJZCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCl7CisJCQkJdmFyIHRpbWVycyA9IGpRdWVyeS50
aW1lcnM7CisKKwkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKQor
CQkJCQlpZiAoICF0aW1lcnNbaV0oKSApCisJCQkJCQl0aW1lcnMuc3BsaWNlKGktLSwgMSk7CisK
KwkJCQlpZiAoICF0aW1lcnMubGVuZ3RoICkgeworCQkJCQljbGVhckludGVydmFsKCBqUXVlcnku
dGltZXJJZCApOworCQkJCQlqUXVlcnkudGltZXJJZCA9IG51bGw7CisJCQkJfQorCQkJfSwgMTMp
OworCQl9CisJfSwKKworCS8vIFNpbXBsZSAnc2hvdycgZnVuY3Rpb24KKwlzaG93OiBmdW5jdGlv
bigpeworCQkvLyBSZW1lbWJlciB3aGVyZSB3ZSBzdGFydGVkLCBzbyB0aGF0IHdlIGNhbiBnbyBi
YWNrIHRvIGl0IGxhdGVyCisJCXRoaXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF0gPSBqUXVlcnku
YXR0ciggdGhpcy5lbGVtLnN0eWxlLCB0aGlzLnByb3AgKTsKKwkJdGhpcy5vcHRpb25zLnNob3cg
PSB0cnVlOworCisJCS8vIEJlZ2luIHRoZSBhbmltYXRpb24KKwkJdGhpcy5jdXN0b20oMCwgdGhp
cy5jdXIoKSk7CisKKwkJLy8gTWFrZSBzdXJlIHRoYXQgd2Ugc3RhcnQgYXQgYSBzbWFsbCB3aWR0
aC9oZWlnaHQgdG8gYXZvaWQgYW55CisJCS8vIGZsYXNoIG9mIGNvbnRlbnQKKwkJaWYgKCB0aGlz
LnByb3AgPT0gIndpZHRoIiB8fCB0aGlzLnByb3AgPT0gImhlaWdodCIgKQorCQkJdGhpcy5lbGVt
LnN0eWxlW3RoaXMucHJvcF0gPSAiMXB4IjsKKworCQkvLyBTdGFydCBieSBzaG93aW5nIHRoZSBl
bGVtZW50CisJCWpRdWVyeSh0aGlzLmVsZW0pLnNob3coKTsKKwl9LAorCisJLy8gU2ltcGxlICdo
aWRlJyBmdW5jdGlvbgorCWhpZGU6IGZ1bmN0aW9uKCl7CisJCS8vIFJlbWVtYmVyIHdoZXJlIHdl
IHN0YXJ0ZWQsIHNvIHRoYXQgd2UgY2FuIGdvIGJhY2sgdG8gaXQgbGF0ZXIKKwkJdGhpcy5vcHRp
b25zLm9yaWdbdGhpcy5wcm9wXSA9IGpRdWVyeS5hdHRyKCB0aGlzLmVsZW0uc3R5bGUsIHRoaXMu
cHJvcCApOworCQl0aGlzLm9wdGlvbnMuaGlkZSA9IHRydWU7CisKKwkJLy8gQmVnaW4gdGhlIGFu
aW1hdGlvbgorCQl0aGlzLmN1c3RvbSh0aGlzLmN1cigpLCAwKTsKKwl9LAorCisJLy8gRWFjaCBz
dGVwIG9mIGFuIGFuaW1hdGlvbgorCXN0ZXA6IGZ1bmN0aW9uKGdvdG9FbmQpeworCQl2YXIgdCA9
IG5vdygpOworCisJCWlmICggZ290b0VuZCB8fCB0ID4gdGhpcy5vcHRpb25zLmR1cmF0aW9uICsg
dGhpcy5zdGFydFRpbWUgKSB7CisJCQl0aGlzLm5vdyA9IHRoaXMuZW5kOworCQkJdGhpcy5wb3Mg
PSB0aGlzLnN0YXRlID0gMTsKKwkJCXRoaXMudXBkYXRlKCk7CisKKwkJCXRoaXMub3B0aW9ucy5j
dXJBbmltWyB0aGlzLnByb3AgXSA9IHRydWU7CisKKwkJCXZhciBkb25lID0gdHJ1ZTsKKwkJCWZv
ciAoIHZhciBpIGluIHRoaXMub3B0aW9ucy5jdXJBbmltICkKKwkJCQlpZiAoIHRoaXMub3B0aW9u
cy5jdXJBbmltW2ldICE9PSB0cnVlICkKKwkJCQkJZG9uZSA9IGZhbHNlOworCisJCQlpZiAoIGRv
bmUgKSB7CisJCQkJaWYgKCB0aGlzLm9wdGlvbnMuZGlzcGxheSAhPSBudWxsICkgeworCQkJCQkv
LyBSZXNldCB0aGUgb3ZlcmZsb3cKKwkJCQkJdGhpcy5lbGVtLnN0eWxlLm92ZXJmbG93ID0gdGhp
cy5vcHRpb25zLm92ZXJmbG93OworCisJCQkJCS8vIFJlc2V0IHRoZSBkaXNwbGF5CisJCQkJCXRo
aXMuZWxlbS5zdHlsZS5kaXNwbGF5ID0gdGhpcy5vcHRpb25zLmRpc3BsYXk7CisJCQkJCWlmICgg
alF1ZXJ5LmNzcyh0aGlzLmVsZW0sICJkaXNwbGF5IikgPT0gIm5vbmUiICkKKwkJCQkJCXRoaXMu
ZWxlbS5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKKwkJCQl9CisKKwkJCQkvLyBIaWRlIHRoZSBl
bGVtZW50IGlmIHRoZSAiaGlkZSIgb3BlcmF0aW9uIHdhcyBkb25lCisJCQkJaWYgKCB0aGlzLm9w
dGlvbnMuaGlkZSApCisJCQkJCXRoaXMuZWxlbS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOworCisJ
CQkJLy8gUmVzZXQgdGhlIHByb3BlcnRpZXMsIGlmIHRoZSBpdGVtIGhhcyBiZWVuIGhpZGRlbiBv
ciBzaG93bgorCQkJCWlmICggdGhpcy5vcHRpb25zLmhpZGUgfHwgdGhpcy5vcHRpb25zLnNob3cg
KQorCQkJCQlmb3IgKCB2YXIgcCBpbiB0aGlzLm9wdGlvbnMuY3VyQW5pbSApCisJCQkJCQlqUXVl
cnkuYXR0cih0aGlzLmVsZW0uc3R5bGUsIHAsIHRoaXMub3B0aW9ucy5vcmlnW3BdKTsKKwkJCX0K
KworCQkJaWYgKCBkb25lICkKKwkJCQkvLyBFeGVjdXRlIHRoZSBjb21wbGV0ZSBmdW5jdGlvbgor
CQkJCXRoaXMub3B0aW9ucy5jb21wbGV0ZS5jYWxsKCB0aGlzLmVsZW0gKTsKKworCQkJcmV0dXJu
IGZhbHNlOworCQl9IGVsc2UgeworCQkJdmFyIG4gPSB0IC0gdGhpcy5zdGFydFRpbWU7CisJCQl0
aGlzLnN0YXRlID0gbiAvIHRoaXMub3B0aW9ucy5kdXJhdGlvbjsKKworCQkJLy8gUGVyZm9ybSB0
aGUgZWFzaW5nIGZ1bmN0aW9uLCBkZWZhdWx0cyB0byBzd2luZworCQkJdGhpcy5wb3MgPSBqUXVl
cnkuZWFzaW5nW3RoaXMub3B0aW9ucy5lYXNpbmcgfHwgKGpRdWVyeS5lYXNpbmcuc3dpbmcgPyAi
c3dpbmciIDogImxpbmVhciIpXSh0aGlzLnN0YXRlLCBuLCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVy
YXRpb24pOworCQkJdGhpcy5ub3cgPSB0aGlzLnN0YXJ0ICsgKCh0aGlzLmVuZCAtIHRoaXMuc3Rh
cnQpICogdGhpcy5wb3MpOworCisJCQkvLyBQZXJmb3JtIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGFu
aW1hdGlvbgorCQkJdGhpcy51cGRhdGUoKTsKKwkJfQorCisJCXJldHVybiB0cnVlOworCX0KKwor
fTsKKworalF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmZ4LCB7CisJc3BlZWRzOnsKKwkJc2xvdzogNjAw
LAorIAkJZmFzdDogMjAwLAorIAkJLy8gRGVmYXVsdCBzcGVlZAorIAkJZGVmOiA0MDAKKwl9LAor
CXN0ZXA6IHsKKwkJc2Nyb2xsTGVmdDogZnVuY3Rpb24oZngpeworCQkJZnguZWxlbS5zY3JvbGxM
ZWZ0ID0gZngubm93OworCQl9LAorCisJCXNjcm9sbFRvcDogZnVuY3Rpb24oZngpeworCQkJZngu
ZWxlbS5zY3JvbGxUb3AgPSBmeC5ub3c7CisJCX0sCisKKwkJb3BhY2l0eTogZnVuY3Rpb24oZngp
eworCQkJalF1ZXJ5LmF0dHIoZnguZWxlbS5zdHlsZSwgIm9wYWNpdHkiLCBmeC5ub3cpOworCQl9
LAorCisJCV9kZWZhdWx0OiBmdW5jdGlvbihmeCl7CisJCQlmeC5lbGVtLnN0eWxlWyBmeC5wcm9w
IF0gPSBmeC5ub3cgKyBmeC51bml0OworCQl9CisJfQorfSk7CisvLyBUaGUgT2Zmc2V0IE1ldGhv
ZAorLy8gT3JpZ2luYWxseSBCeSBCcmFuZG9uIEFhcm9uLCBwYXJ0IG9mIHRoZSBEaW1lbnNpb24g
UGx1Z2luCisvLyBodHRwOi8vanF1ZXJ5LmNvbS9wbHVnaW5zL3Byb2plY3QvZGltZW5zaW9ucwor
alF1ZXJ5LmZuLm9mZnNldCA9IGZ1bmN0aW9uKCkgeworCXZhciBsZWZ0ID0gMCwgdG9wID0gMCwg
ZWxlbSA9IHRoaXNbMF0sIHJlc3VsdHM7CisKKwlpZiAoIGVsZW0gKSB3aXRoICggalF1ZXJ5LmJy
b3dzZXIgKSB7CisJCXZhciBwYXJlbnQgICAgICAgPSBlbGVtLnBhcmVudE5vZGUsCisJCSAgICBv
ZmZzZXRDaGlsZCAgPSBlbGVtLAorCQkgICAgb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJl
bnQsCisJCSAgICBkb2MgICAgICAgICAgPSBlbGVtLm93bmVyRG9jdW1lbnQsCisJCSAgICBzYWZh
cmkyICAgICAgPSBzYWZhcmkgJiYgcGFyc2VJbnQodmVyc2lvbikgPCA1MjIgJiYgIS9hZG9iZWFp
ci9pLnRlc3QodXNlckFnZW50KSwKKwkJICAgIGNzcyAgICAgICAgICA9IGpRdWVyeS5jdXJDU1Ms
CisJCSAgICBmaXhlZCAgICAgICAgPSBjc3MoZWxlbSwgInBvc2l0aW9uIikgPT0gImZpeGVkIjsK
KworCQkvLyBVc2UgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGlmIGF2YWlsYWJsZQorCQlpZiAoIGVs
ZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0ICkgeworCQkJdmFyIGJveCA9IGVsZW0uZ2V0Qm91bmRp
bmdDbGllbnRSZWN0KCk7CisKKwkJCS8vIEFkZCB0aGUgZG9jdW1lbnQgc2Nyb2xsIG9mZnNldHMK
KwkJCWFkZChib3gubGVmdCArIE1hdGgubWF4KGRvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVm
dCwgZG9jLmJvZHkuc2Nyb2xsTGVmdCksCisJCQkJYm94LnRvcCAgKyBNYXRoLm1heChkb2MuZG9j
dW1lbnRFbGVtZW50LnNjcm9sbFRvcCwgIGRvYy5ib2R5LnNjcm9sbFRvcCkpOworCisJCQkvLyBJ
RSBhZGRzIHRoZSBIVE1MIGVsZW1lbnQncyBib3JkZXIsIGJ5IGRlZmF1bHQgaXQgaXMgbWVkaXVt
IHdoaWNoIGlzIDJweAorCQkJLy8gSUUgNiBhbmQgNyBxdWlya3MgbW9kZSB0aGUgYm9yZGVyIHdp
ZHRoIGlzIG92ZXJ3cml0YWJsZSBieSB0aGUgZm9sbG93aW5nIGNzcyBodG1sIHsgYm9yZGVyOiAw
OyB9CisJCQkvLyBJRSA3IHN0YW5kYXJkcyBtb2RlLCB0aGUgYm9yZGVyIGlzIGFsd2F5cyAycHgK
KwkJCS8vIFRoaXMgYm9yZGVyL29mZnNldCBpcyB0eXBpY2FsbHkgcmVwcmVzZW50ZWQgYnkgdGhl
IGNsaWVudExlZnQgYW5kIGNsaWVudFRvcCBwcm9wZXJ0aWVzCisJCQkvLyBIb3dldmVyLCBpbiBJ
RTYgYW5kIDcgcXVpcmtzIG1vZGUgdGhlIGNsaWVudExlZnQgYW5kIGNsaWVudFRvcCBwcm9wZXJ0
aWVzIGFyZSBub3QgdXBkYXRlZCB3aGVuIG92ZXJ3cml0aW5nIGl0IHZpYSBDU1MKKwkJCS8vIFRo
ZXJlZm9yZSB0aGlzIG1ldGhvZCB3aWxsIGJlIG9mZiBieSAycHggaW4gSUUgd2hpbGUgaW4gcXVp
cmtzbW9kZQorCQkJYWRkKCAtZG9jLmRvY3VtZW50RWxlbWVudC5jbGllbnRMZWZ0LCAtZG9jLmRv
Y3VtZW50RWxlbWVudC5jbGllbnRUb3AgKTsKKworCQkvLyBPdGhlcndpc2UgbG9vcCB0aHJvdWdo
IHRoZSBvZmZzZXRQYXJlbnRzIGFuZCBwYXJlbnROb2RlcworCQl9IGVsc2UgeworCisJCQkvLyBJ
bml0aWFsIGVsZW1lbnQgb2Zmc2V0cworCQkJYWRkKCBlbGVtLm9mZnNldExlZnQsIGVsZW0ub2Zm
c2V0VG9wICk7CisKKwkJCS8vIEdldCBwYXJlbnQgb2Zmc2V0cworCQkJd2hpbGUgKCBvZmZzZXRQ
YXJlbnQgKSB7CisJCQkJLy8gQWRkIG9mZnNldFBhcmVudCBvZmZzZXRzCisJCQkJYWRkKCBvZmZz
ZXRQYXJlbnQub2Zmc2V0TGVmdCwgb2Zmc2V0UGFyZW50Lm9mZnNldFRvcCApOworCisJCQkJLy8g
TW96aWxsYSBhbmQgU2FmYXJpID4gMiBkb2VzIG5vdCBpbmNsdWRlIHRoZSBib3JkZXIgb24gb2Zm
c2V0IHBhcmVudHMKKwkJCQkvLyBIb3dldmVyIE1vemlsbGEgYWRkcyB0aGUgYm9yZGVyIGZvciB0
YWJsZSBvciB0YWJsZSBjZWxscworCQkJCWlmICggbW96aWxsYSAmJiAhL150KGFibGV8ZHxoKSQv
aS50ZXN0KG9mZnNldFBhcmVudC50YWdOYW1lKSB8fCBzYWZhcmkgJiYgIXNhZmFyaTIgKQorCQkJ
CQlib3JkZXIoIG9mZnNldFBhcmVudCApOworCisJCQkJLy8gQWRkIHRoZSBkb2N1bWVudCBzY3Jv
bGwgb2Zmc2V0cyBpZiBwb3NpdGlvbiBpcyBmaXhlZCBvbiBhbnkgb2Zmc2V0UGFyZW50CisJCQkJ
aWYgKCAhZml4ZWQgJiYgY3NzKG9mZnNldFBhcmVudCwgInBvc2l0aW9uIikgPT0gImZpeGVkIiAp
CisJCQkJCWZpeGVkID0gdHJ1ZTsKKworCQkJCS8vIFNldCBvZmZzZXRDaGlsZCB0byBwcmV2aW91
cyBvZmZzZXRQYXJlbnQgdW5sZXNzIGl0IGlzIHRoZSBib2R5IGVsZW1lbnQKKwkJCQlvZmZzZXRD
aGlsZCAgPSAvXmJvZHkkL2kudGVzdChvZmZzZXRQYXJlbnQudGFnTmFtZSkgPyBvZmZzZXRDaGls
ZCA6IG9mZnNldFBhcmVudDsKKwkJCQkvLyBHZXQgbmV4dCBvZmZzZXRQYXJlbnQKKwkJCQlvZmZz
ZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50OworCQkJfQorCisJCQkvLyBHZXQg
cGFyZW50IHNjcm9sbCBvZmZzZXRzCisJCQl3aGlsZSAoIHBhcmVudCAmJiBwYXJlbnQudGFnTmFt
ZSAmJiAhL15ib2R5fGh0bWwkL2kudGVzdChwYXJlbnQudGFnTmFtZSkgKSB7CisJCQkJLy8gUmVt
b3ZlIHBhcmVudCBzY3JvbGwgVU5MRVNTIHRoYXQgcGFyZW50IGlzIGlubGluZSBvciBhIHRhYmxl
IHRvIHdvcmsgYXJvdW5kIE9wZXJhIGlubGluZS90YWJsZSBzY3JvbGxMZWZ0L1RvcCBidWcKKwkJ
CQlpZiAoICEvXmlubGluZXx0YWJsZS4qJC9pLnRlc3QoY3NzKHBhcmVudCwgImRpc3BsYXkiKSkg
KQorCQkJCQkvLyBTdWJ0cmFjdCBwYXJlbnQgc2Nyb2xsIG9mZnNldHMKKwkJCQkJYWRkKCAtcGFy
ZW50LnNjcm9sbExlZnQsIC1wYXJlbnQuc2Nyb2xsVG9wICk7CisKKwkJCQkvLyBNb3ppbGxhIGRv
ZXMgbm90IGFkZCB0aGUgYm9yZGVyIGZvciBhIHBhcmVudCB0aGF0IGhhcyBvdmVyZmxvdyAhPSB2
aXNpYmxlCisJCQkJaWYgKCBtb3ppbGxhICYmIGNzcyhwYXJlbnQsICJvdmVyZmxvdyIpICE9ICJ2
aXNpYmxlIiApCisJCQkJCWJvcmRlciggcGFyZW50ICk7CisKKwkJCQkvLyBHZXQgbmV4dCBwYXJl
bnQKKwkJCQlwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZTsKKwkJCX0KKworCQkJLy8gU2FmYXJp
IDw9IDIgZG91YmxlcyBib2R5IG9mZnNldHMgd2l0aCBhIGZpeGVkIHBvc2l0aW9uIGVsZW1lbnQv
b2Zmc2V0UGFyZW50IG9yIGFic29sdXRlbHkgcG9zaXRpb25lZCBvZmZzZXRDaGlsZAorCQkJLy8g
TW96aWxsYSBkb3VibGVzIGJvZHkgb2Zmc2V0cyB3aXRoIGEgbm9uLWFic29sdXRlbHkgcG9zaXRp
b25lZCBvZmZzZXRDaGlsZAorCQkJaWYgKCAoc2FmYXJpMiAmJiAoZml4ZWQgfHwgY3NzKG9mZnNl
dENoaWxkLCAicG9zaXRpb24iKSA9PSAiYWJzb2x1dGUiKSkgfHwKKwkJCQkobW96aWxsYSAmJiBj
c3Mob2Zmc2V0Q2hpbGQsICJwb3NpdGlvbiIpICE9ICJhYnNvbHV0ZSIpICkKKwkJCQkJYWRkKCAt
ZG9jLmJvZHkub2Zmc2V0TGVmdCwgLWRvYy5ib2R5Lm9mZnNldFRvcCApOworCisJCQkvLyBBZGQg
dGhlIGRvY3VtZW50IHNjcm9sbCBvZmZzZXRzIGlmIHBvc2l0aW9uIGlzIGZpeGVkCisJCQlpZiAo
IGZpeGVkICkKKwkJCQlhZGQoTWF0aC5tYXgoZG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0
LCBkb2MuYm9keS5zY3JvbGxMZWZ0KSwKKwkJCQkJTWF0aC5tYXgoZG9jLmRvY3VtZW50RWxlbWVu
dC5zY3JvbGxUb3AsICBkb2MuYm9keS5zY3JvbGxUb3ApKTsKKwkJfQorCisJCS8vIFJldHVybiBh
biBvYmplY3Qgd2l0aCB0b3AgYW5kIGxlZnQgcHJvcGVydGllcworCQlyZXN1bHRzID0geyB0b3A6
IHRvcCwgbGVmdDogbGVmdCB9OworCX0KKworCWZ1bmN0aW9uIGJvcmRlcihlbGVtKSB7CisJCWFk
ZCggalF1ZXJ5LmN1ckNTUyhlbGVtLCAiYm9yZGVyTGVmdFdpZHRoIiwgdHJ1ZSksIGpRdWVyeS5j
dXJDU1MoZWxlbSwgImJvcmRlclRvcFdpZHRoIiwgdHJ1ZSkgKTsKKwl9CisKKwlmdW5jdGlvbiBh
ZGQobCwgdCkgeworCQlsZWZ0ICs9IHBhcnNlSW50KGwsIDEwKSB8fCAwOworCQl0b3AgKz0gcGFy
c2VJbnQodCwgMTApIHx8IDA7CisJfQorCisJcmV0dXJuIHJlc3VsdHM7Cit9OworCisKK2pRdWVy
eS5mbi5leHRlbmQoeworCXBvc2l0aW9uOiBmdW5jdGlvbigpIHsKKwkJdmFyIGxlZnQgPSAwLCB0
b3AgPSAwLCByZXN1bHRzOworCisJCWlmICggdGhpc1swXSApIHsKKwkJCS8vIEdldCAqcmVhbCog
b2Zmc2V0UGFyZW50CisJCQl2YXIgb2Zmc2V0UGFyZW50ID0gdGhpcy5vZmZzZXRQYXJlbnQoKSwK
KworCQkJLy8gR2V0IGNvcnJlY3Qgb2Zmc2V0cworCQkJb2Zmc2V0ICAgICAgID0gdGhpcy5vZmZz
ZXQoKSwKKwkJCXBhcmVudE9mZnNldCA9IC9eYm9keXxodG1sJC9pLnRlc3Qob2Zmc2V0UGFyZW50
WzBdLnRhZ05hbWUpID8geyB0b3A6IDAsIGxlZnQ6IDAgfSA6IG9mZnNldFBhcmVudC5vZmZzZXQo
KTsKKworCQkJLy8gU3VidHJhY3QgZWxlbWVudCBtYXJnaW5zCisJCQkvLyBub3RlOiB3aGVuIGFu
IGVsZW1lbnQgaGFzIG1hcmdpbjogYXV0byB0aGUgb2Zmc2V0TGVmdCBhbmQgbWFyZ2luTGVmdCAK
KwkJCS8vIGFyZSB0aGUgc2FtZSBpbiBTYWZhcmkgY2F1c2luZyBvZmZzZXQubGVmdCB0byBpbmNv
cnJlY3RseSBiZSAwCisJCQlvZmZzZXQudG9wICAtPSBudW0oIHRoaXMsICdtYXJnaW5Ub3AnICk7
CisJCQlvZmZzZXQubGVmdCAtPSBudW0oIHRoaXMsICdtYXJnaW5MZWZ0JyApOworCisJCQkvLyBB
ZGQgb2Zmc2V0UGFyZW50IGJvcmRlcnMKKwkJCXBhcmVudE9mZnNldC50b3AgICs9IG51bSggb2Zm
c2V0UGFyZW50LCAnYm9yZGVyVG9wV2lkdGgnICk7CisJCQlwYXJlbnRPZmZzZXQubGVmdCArPSBu
dW0oIG9mZnNldFBhcmVudCwgJ2JvcmRlckxlZnRXaWR0aCcgKTsKKworCQkJLy8gU3VidHJhY3Qg
dGhlIHR3byBvZmZzZXRzCisJCQlyZXN1bHRzID0geworCQkJCXRvcDogIG9mZnNldC50b3AgIC0g
cGFyZW50T2Zmc2V0LnRvcCwKKwkJCQlsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5s
ZWZ0CisJCQl9OworCQl9CisKKwkJcmV0dXJuIHJlc3VsdHM7CisJfSwKKworCW9mZnNldFBhcmVu
dDogZnVuY3Rpb24oKSB7CisJCXZhciBvZmZzZXRQYXJlbnQgPSB0aGlzWzBdLm9mZnNldFBhcmVu
dDsKKwkJd2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgKCEvXmJvZHl8aHRtbCQvaS50ZXN0KG9mZnNl
dFBhcmVudC50YWdOYW1lKSAmJiBqUXVlcnkuY3NzKG9mZnNldFBhcmVudCwgJ3Bvc2l0aW9uJykg
PT0gJ3N0YXRpYycpICkKKwkJCW9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5vZmZzZXRQYXJl
bnQ7CisJCXJldHVybiBqUXVlcnkob2Zmc2V0UGFyZW50KTsKKwl9Cit9KTsKKworCisvLyBDcmVh
dGUgc2Nyb2xsTGVmdCBhbmQgc2Nyb2xsVG9wIG1ldGhvZHMKK2pRdWVyeS5lYWNoKCBbJ0xlZnQn
LCAnVG9wJ10sIGZ1bmN0aW9uKGksIG5hbWUpIHsKKwl2YXIgbWV0aG9kID0gJ3Njcm9sbCcgKyBu
YW1lOworCQorCWpRdWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbih2YWwpIHsKKwkJaWYgKCF0
aGlzWzBdKSByZXR1cm47CisKKwkJcmV0dXJuIHZhbCAhPSB1bmRlZmluZWQgPworCisJCQkvLyBT
ZXQgdGhlIHNjcm9sbCBvZmZzZXQKKwkJCXRoaXMuZWFjaChmdW5jdGlvbigpIHsKKwkJCQl0aGlz
ID09IHdpbmRvdyB8fCB0aGlzID09IGRvY3VtZW50ID8KKwkJCQkJd2luZG93LnNjcm9sbFRvKAor
CQkJCQkJIWkgPyB2YWwgOiBqUXVlcnkod2luZG93KS5zY3JvbGxMZWZ0KCksCisJCQkJCQkgaSA/
IHZhbCA6IGpRdWVyeSh3aW5kb3cpLnNjcm9sbFRvcCgpCisJCQkJCSkgOgorCQkJCQl0aGlzWyBt
ZXRob2QgXSA9IHZhbDsKKwkJCX0pIDoKKworCQkJLy8gUmV0dXJuIHRoZSBzY3JvbGwgb2Zmc2V0
CisJCQl0aGlzWzBdID09IHdpbmRvdyB8fCB0aGlzWzBdID09IGRvY3VtZW50ID8KKwkJCQlzZWxm
WyBpID8gJ3BhZ2VZT2Zmc2V0JyA6ICdwYWdlWE9mZnNldCcgXSB8fAorCQkJCQlqUXVlcnkuYm94
TW9kZWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyBtZXRob2QgXSB8fAorCQkJCQlkb2N1
bWVudC5ib2R5WyBtZXRob2QgXSA6CisJCQkJdGhpc1swXVsgbWV0aG9kIF07CisJfTsKK30pOwor
Ly8gQ3JlYXRlIGlubmVySGVpZ2h0LCBpbm5lcldpZHRoLCBvdXRlckhlaWdodCBhbmQgb3V0ZXJX
aWR0aCBtZXRob2RzCitqUXVlcnkuZWFjaChbICJIZWlnaHQiLCAiV2lkdGgiIF0sIGZ1bmN0aW9u
KGksIG5hbWUpeworCisJdmFyIHRsID0gaSA/ICJMZWZ0IiAgOiAiVG9wIiwgIC8vIHRvcCBvciBs
ZWZ0CisJCWJyID0gaSA/ICJSaWdodCIgOiAiQm90dG9tIjsgLy8gYm90dG9tIG9yIHJpZ2h0CisK
KwkvLyBpbm5lckhlaWdodCBhbmQgaW5uZXJXaWR0aAorCWpRdWVyeS5mblsiaW5uZXIiICsgbmFt
ZV0gPSBmdW5jdGlvbigpeworCQlyZXR1cm4gdGhpc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0oKSAr
CisJCQludW0odGhpcywgInBhZGRpbmciICsgdGwpICsKKwkJCW51bSh0aGlzLCAicGFkZGluZyIg
KyBicik7CisJfTsKKworCS8vIG91dGVySGVpZ2h0IGFuZCBvdXRlcldpZHRoCisJalF1ZXJ5LmZu
WyJvdXRlciIgKyBuYW1lXSA9IGZ1bmN0aW9uKG1hcmdpbikgeworCQlyZXR1cm4gdGhpc1siaW5u
ZXIiICsgbmFtZV0oKSArCisJCQludW0odGhpcywgImJvcmRlciIgKyB0bCArICJXaWR0aCIpICsK
KwkJCW51bSh0aGlzLCAiYm9yZGVyIiArIGJyICsgIldpZHRoIikgKworCQkJKG1hcmdpbiA/CisJ
CQkJbnVtKHRoaXMsICJtYXJnaW4iICsgdGwpICsgbnVtKHRoaXMsICJtYXJnaW4iICsgYnIpIDog
MCk7CisJfTsKKworfSk7fSkoKTsKZGlmZiAtLWdpdCBhL3d1aS9zcmMvcHVibGljL2phdmFzY3Jp
cHRzL2pxdWVyeS0xLjIuNi5taW4uanMgYi93dWkvc3JjL3B1YmxpYy9qYXZhc2NyaXB0cy9qcXVl
cnktMS4yLjYubWluLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYjk4
ZTEKLS0tIC9kZXYvbnVsbAorKysgYi93dWkvc3JjL3B1YmxpYy9qYXZhc2NyaXB0cy9qcXVlcnkt
MS4yLjYubWluLmpzCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBqUXVlcnkgMS4yLjYgLSBOZXcg
V2F2ZSBKYXZhc2NyaXB0CisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IEpvaG4gUmVzaWcgKGpx
dWVyeS5jb20pCisgKiBEdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgKE1JVC1MSUNFTlNFLnR4
dCkKKyAqIGFuZCBHUEwgKEdQTC1MSUNFTlNFLnR4dCkgbGljZW5zZXMuCisgKgorICogJERhdGU6
IDIwMDgtMDUtMjQgMTQ6MjI6MTcgLTA0MDAgKFNhdCwgMjQgTWF5IDIwMDgpICQKKyAqICRSZXY6
IDU2ODUgJAorICovCisoZnVuY3Rpb24oKXt2YXIgX2pRdWVyeT13aW5kb3cualF1ZXJ5LF8kPXdp
bmRvdy4kO3ZhciBqUXVlcnk9d2luZG93LmpRdWVyeT13aW5kb3cuJD1mdW5jdGlvbihzZWxlY3Rv
cixjb250ZXh0KXtyZXR1cm4gbmV3IGpRdWVyeS5mbi5pbml0KHNlbGVjdG9yLGNvbnRleHQpO307
dmFyIHF1aWNrRXhwcj0vXltePF0qKDwoLnxccykrPilbXj5dKiR8XiMoXHcrKSQvLGlzU2ltcGxl
PS9eLlteOiNcW1wuXSokLyx1bmRlZmluZWQ7alF1ZXJ5LmZuPWpRdWVyeS5wcm90b3R5cGU9e2lu
aXQ6ZnVuY3Rpb24oc2VsZWN0b3IsY29udGV4dCl7c2VsZWN0b3I9c2VsZWN0b3J8fGRvY3VtZW50
O2lmKHNlbGVjdG9yLm5vZGVUeXBlKXt0aGlzWzBdPXNlbGVjdG9yO3RoaXMubGVuZ3RoPTE7cmV0
dXJuIHRoaXM7fWlmKHR5cGVvZiBzZWxlY3Rvcj09InN0cmluZyIpe3ZhciBtYXRjaD1xdWlja0V4
cHIuZXhlYyhzZWxlY3Rvcik7aWYobWF0Y2gmJihtYXRjaFsxXXx8IWNvbnRleHQpKXtpZihtYXRj
aFsxXSlzZWxlY3Rvcj1qUXVlcnkuY2xlYW4oW21hdGNoWzFdXSxjb250ZXh0KTtlbHNle3ZhciBl
bGVtPWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG1hdGNoWzNdKTtpZihlbGVtKXtpZihlbGVtLmlk
IT1tYXRjaFszXSlyZXR1cm4galF1ZXJ5KCkuZmluZChzZWxlY3Rvcik7cmV0dXJuIGpRdWVyeShl
bGVtKTt9c2VsZWN0b3I9W107fX1lbHNlCityZXR1cm4galF1ZXJ5KGNvbnRleHQpLmZpbmQoc2Vs
ZWN0b3IpO31lbHNlIGlmKGpRdWVyeS5pc0Z1bmN0aW9uKHNlbGVjdG9yKSlyZXR1cm4galF1ZXJ5
KGRvY3VtZW50KVtqUXVlcnkuZm4ucmVhZHk/InJlYWR5IjoibG9hZCJdKHNlbGVjdG9yKTtyZXR1
cm4gdGhpcy5zZXRBcnJheShqUXVlcnkubWFrZUFycmF5KHNlbGVjdG9yKSk7fSxqcXVlcnk6IjEu
Mi42IixzaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVuZ3RoO30sbGVuZ3RoOjAsZ2V0OmZ1
bmN0aW9uKG51bSl7cmV0dXJuIG51bT09dW5kZWZpbmVkP2pRdWVyeS5tYWtlQXJyYXkodGhpcyk6
dGhpc1tudW1dO30scHVzaFN0YWNrOmZ1bmN0aW9uKGVsZW1zKXt2YXIgcmV0PWpRdWVyeShlbGVt
cyk7cmV0LnByZXZPYmplY3Q9dGhpcztyZXR1cm4gcmV0O30sc2V0QXJyYXk6ZnVuY3Rpb24oZWxl
bXMpe3RoaXMubGVuZ3RoPTA7QXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkodGhpcyxlbGVtcyk7
cmV0dXJuIHRoaXM7fSxlYWNoOmZ1bmN0aW9uKGNhbGxiYWNrLGFyZ3Mpe3JldHVybiBqUXVlcnku
ZWFjaCh0aGlzLGNhbGxiYWNrLGFyZ3MpO30saW5kZXg6ZnVuY3Rpb24oZWxlbSl7dmFyIHJldD0t
MTtyZXR1cm4galF1ZXJ5LmluQXJyYXkoZWxlbSYmZWxlbS5qcXVlcnk/ZWxlbVswXTplbGVtLHRo
aXMpO30sYXR0cjpmdW5jdGlvbihuYW1lLHZhbHVlLHR5cGUpe3ZhciBvcHRpb25zPW5hbWU7aWYo
bmFtZS5jb25zdHJ1Y3Rvcj09U3RyaW5nKWlmKHZhbHVlPT09dW5kZWZpbmVkKXJldHVybiB0aGlz
WzBdJiZqUXVlcnlbdHlwZXx8ImF0dHIiXSh0aGlzWzBdLG5hbWUpO2Vsc2V7b3B0aW9ucz17fTtv
cHRpb25zW25hbWVdPXZhbHVlO31yZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKGkpe2ZvcihuYW1l
IGluIG9wdGlvbnMpalF1ZXJ5LmF0dHIodHlwZT90aGlzLnN0eWxlOnRoaXMsbmFtZSxqUXVlcnku
cHJvcCh0aGlzLG9wdGlvbnNbbmFtZV0sdHlwZSxpLG5hbWUpKTt9KTt9LGNzczpmdW5jdGlvbihr
ZXksdmFsdWUpe2lmKChrZXk9PSd3aWR0aCd8fGtleT09J2hlaWdodCcpJiZwYXJzZUZsb2F0KHZh
bHVlKTwwKXZhbHVlPXVuZGVmaW5lZDtyZXR1cm4gdGhpcy5hdHRyKGtleSx2YWx1ZSwiY3VyQ1NT
Iik7fSx0ZXh0OmZ1bmN0aW9uKHRleHQpe2lmKHR5cGVvZiB0ZXh0IT0ib2JqZWN0IiYmdGV4dCE9
bnVsbClyZXR1cm4gdGhpcy5lbXB0eSgpLmFwcGVuZCgodGhpc1swXSYmdGhpc1swXS5vd25lckRv
Y3VtZW50fHxkb2N1bWVudCkuY3JlYXRlVGV4dE5vZGUodGV4dCkpO3ZhciByZXQ9IiI7alF1ZXJ5
LmVhY2godGV4dHx8dGhpcyxmdW5jdGlvbigpe2pRdWVyeS5lYWNoKHRoaXMuY2hpbGROb2Rlcyxm
dW5jdGlvbigpe2lmKHRoaXMubm9kZVR5cGUhPTgpcmV0Kz10aGlzLm5vZGVUeXBlIT0xP3RoaXMu
bm9kZVZhbHVlOmpRdWVyeS5mbi50ZXh0KFt0aGlzXSk7fSk7fSk7cmV0dXJuIHJldDt9LHdyYXBB
bGw6ZnVuY3Rpb24oaHRtbCl7aWYodGhpc1swXSlqUXVlcnkoaHRtbCx0aGlzWzBdLm93bmVyRG9j
dW1lbnQpLmNsb25lKCkuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLm1hcChmdW5jdGlvbigpe3ZhciBl
bGVtPXRoaXM7d2hpbGUoZWxlbS5maXJzdENoaWxkKWVsZW09ZWxlbS5maXJzdENoaWxkO3JldHVy
biBlbGVtO30pLmFwcGVuZCh0aGlzKTtyZXR1cm4gdGhpczt9LHdyYXBJbm5lcjpmdW5jdGlvbiho
dG1sKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7alF1ZXJ5KHRoaXMpLmNvbnRlbnRzKCku
d3JhcEFsbChodG1sKTt9KTt9LHdyYXA6ZnVuY3Rpb24oaHRtbCl7cmV0dXJuIHRoaXMuZWFjaChm
dW5jdGlvbigpe2pRdWVyeSh0aGlzKS53cmFwQWxsKGh0bWwpO30pO30sYXBwZW5kOmZ1bmN0aW9u
KCl7cmV0dXJuIHRoaXMuZG9tTWFuaXAoYXJndW1lbnRzLHRydWUsZmFsc2UsZnVuY3Rpb24oZWxl
bSl7aWYodGhpcy5ub2RlVHlwZT09MSl0aGlzLmFwcGVuZENoaWxkKGVsZW0pO30pO30scHJlcGVu
ZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbU1hbmlwKGFyZ3VtZW50cyx0cnVlLHRydWUsZnVu
Y3Rpb24oZWxlbSl7aWYodGhpcy5ub2RlVHlwZT09MSl0aGlzLmluc2VydEJlZm9yZShlbGVtLHRo
aXMuZmlyc3RDaGlsZCk7fSk7fSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21NYW5p
cChhcmd1bWVudHMsZmFsc2UsZmFsc2UsZnVuY3Rpb24oZWxlbSl7dGhpcy5wYXJlbnROb2RlLmlu
c2VydEJlZm9yZShlbGVtLHRoaXMpO30pO30sYWZ0ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5k
b21NYW5pcChhcmd1bWVudHMsZmFsc2UsdHJ1ZSxmdW5jdGlvbihlbGVtKXt0aGlzLnBhcmVudE5v
ZGUuaW5zZXJ0QmVmb3JlKGVsZW0sdGhpcy5uZXh0U2libGluZyk7fSk7fSxlbmQ6ZnVuY3Rpb24o
KXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHxqUXVlcnkoW10pO30sZmluZDpmdW5jdGlvbihzZWxl
Y3Rvcil7dmFyIGVsZW1zPWpRdWVyeS5tYXAodGhpcyxmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1
ZXJ5LmZpbmQoc2VsZWN0b3IsZWxlbSk7fSk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKC9bXis+XSBb
Xis+XS8udGVzdChzZWxlY3Rvcil8fHNlbGVjdG9yLmluZGV4T2YoIi4uIik+LTE/alF1ZXJ5LnVu
aXF1ZShlbGVtcyk6ZWxlbXMpO30sY2xvbmU6ZnVuY3Rpb24oZXZlbnRzKXt2YXIgcmV0PXRoaXMu
bWFwKGZ1bmN0aW9uKCl7aWYoalF1ZXJ5LmJyb3dzZXIubXNpZSYmIWpRdWVyeS5pc1hNTERvYyh0
aGlzKSl7dmFyIGNsb25lPXRoaXMuY2xvbmVOb2RlKHRydWUpLGNvbnRhaW5lcj1kb2N1bWVudC5j
cmVhdGVFbGVtZW50KCJkaXYiKTtjb250YWluZXIuYXBwZW5kQ2hpbGQoY2xvbmUpO3JldHVybiBq
UXVlcnkuY2xlYW4oW2NvbnRhaW5lci5pbm5lckhUTUxdKVswXTt9ZWxzZQorcmV0dXJuIHRoaXMu
Y2xvbmVOb2RlKHRydWUpO30pO3ZhciBjbG9uZT1yZXQuZmluZCgiKiIpLmFuZFNlbGYoKS5lYWNo
KGZ1bmN0aW9uKCl7aWYodGhpc1tleHBhbmRvXSE9dW5kZWZpbmVkKXRoaXNbZXhwYW5kb109bnVs
bDt9KTtpZihldmVudHM9PT10cnVlKXRoaXMuZmluZCgiKiIpLmFuZFNlbGYoKS5lYWNoKGZ1bmN0
aW9uKGkpe2lmKHRoaXMubm9kZVR5cGU9PTMpcmV0dXJuO3ZhciBldmVudHM9alF1ZXJ5LmRhdGEo
dGhpcywiZXZlbnRzIik7Zm9yKHZhciB0eXBlIGluIGV2ZW50cylmb3IodmFyIGhhbmRsZXIgaW4g
ZXZlbnRzW3R5cGVdKWpRdWVyeS5ldmVudC5hZGQoY2xvbmVbaV0sdHlwZSxldmVudHNbdHlwZV1b
aGFuZGxlcl0sZXZlbnRzW3R5cGVdW2hhbmRsZXJdLmRhdGEpO30pO3JldHVybiByZXQ7fSxmaWx0
ZXI6ZnVuY3Rpb24oc2VsZWN0b3Ipe3JldHVybiB0aGlzLnB1c2hTdGFjayhqUXVlcnkuaXNGdW5j
dGlvbihzZWxlY3RvcikmJmpRdWVyeS5ncmVwKHRoaXMsZnVuY3Rpb24oZWxlbSxpKXtyZXR1cm4g
c2VsZWN0b3IuY2FsbChlbGVtLGkpO30pfHxqUXVlcnkubXVsdGlGaWx0ZXIoc2VsZWN0b3IsdGhp
cykpO30sbm90OmZ1bmN0aW9uKHNlbGVjdG9yKXtpZihzZWxlY3Rvci5jb25zdHJ1Y3Rvcj09U3Ry
aW5nKWlmKGlzU2ltcGxlLnRlc3Qoc2VsZWN0b3IpKXJldHVybiB0aGlzLnB1c2hTdGFjayhqUXVl
cnkubXVsdGlGaWx0ZXIoc2VsZWN0b3IsdGhpcyx0cnVlKSk7ZWxzZQorc2VsZWN0b3I9alF1ZXJ5
Lm11bHRpRmlsdGVyKHNlbGVjdG9yLHRoaXMpO3ZhciBpc0FycmF5TGlrZT1zZWxlY3Rvci5sZW5n
dGgmJnNlbGVjdG9yW3NlbGVjdG9yLmxlbmd0aC0xXSE9PXVuZGVmaW5lZCYmIXNlbGVjdG9yLm5v
ZGVUeXBlO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiBpc0FycmF5TGlrZT9q
UXVlcnkuaW5BcnJheSh0aGlzLHNlbGVjdG9yKTwwOnRoaXMhPXNlbGVjdG9yO30pO30sYWRkOmZ1
bmN0aW9uKHNlbGVjdG9yKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soalF1ZXJ5LnVuaXF1ZShqUXVl
cnkubWVyZ2UodGhpcy5nZXQoKSx0eXBlb2Ygc2VsZWN0b3I9PSdzdHJpbmcnP2pRdWVyeShzZWxl
Y3Rvcik6alF1ZXJ5Lm1ha2VBcnJheShzZWxlY3RvcikpKSk7fSxpczpmdW5jdGlvbihzZWxlY3Rv
cil7cmV0dXJuISFzZWxlY3RvciYmalF1ZXJ5Lm11bHRpRmlsdGVyKHNlbGVjdG9yLHRoaXMpLmxl
bmd0aD4wO30saGFzQ2xhc3M6ZnVuY3Rpb24oc2VsZWN0b3Ipe3JldHVybiB0aGlzLmlzKCIuIitz
ZWxlY3Rvcik7fSx2YWw6ZnVuY3Rpb24odmFsdWUpe2lmKHZhbHVlPT11bmRlZmluZWQpe2lmKHRo
aXMubGVuZ3RoKXt2YXIgZWxlbT10aGlzWzBdO2lmKGpRdWVyeS5ub2RlTmFtZShlbGVtLCJzZWxl
Y3QiKSl7dmFyIGluZGV4PWVsZW0uc2VsZWN0ZWRJbmRleCx2YWx1ZXM9W10sb3B0aW9ucz1lbGVt
Lm9wdGlvbnMsb25lPWVsZW0udHlwZT09InNlbGVjdC1vbmUiO2lmKGluZGV4PDApcmV0dXJuIG51
bGw7Zm9yKHZhciBpPW9uZT9pbmRleDowLG1heD1vbmU/aW5kZXgrMTpvcHRpb25zLmxlbmd0aDtp
PG1heDtpKyspe3ZhciBvcHRpb249b3B0aW9uc1tpXTtpZihvcHRpb24uc2VsZWN0ZWQpe3ZhbHVl
PWpRdWVyeS5icm93c2VyLm1zaWUmJiFvcHRpb24uYXR0cmlidXRlcy52YWx1ZS5zcGVjaWZpZWQ/
b3B0aW9uLnRleHQ6b3B0aW9uLnZhbHVlO2lmKG9uZSlyZXR1cm4gdmFsdWU7dmFsdWVzLnB1c2go
dmFsdWUpO319cmV0dXJuIHZhbHVlczt9ZWxzZQorcmV0dXJuKHRoaXNbMF0udmFsdWV8fCIiKS5y
ZXBsYWNlKC9cci9nLCIiKTt9cmV0dXJuIHVuZGVmaW5lZDt9aWYodmFsdWUuY29uc3RydWN0b3I9
PU51bWJlcil2YWx1ZSs9Jyc7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKHRoaXMubm9k
ZVR5cGUhPTEpcmV0dXJuO2lmKHZhbHVlLmNvbnN0cnVjdG9yPT1BcnJheSYmL3JhZGlvfGNoZWNr
Ym94Ly50ZXN0KHRoaXMudHlwZSkpdGhpcy5jaGVja2VkPShqUXVlcnkuaW5BcnJheSh0aGlzLnZh
bHVlLHZhbHVlKT49MHx8alF1ZXJ5LmluQXJyYXkodGhpcy5uYW1lLHZhbHVlKT49MCk7ZWxzZSBp
ZihqUXVlcnkubm9kZU5hbWUodGhpcywic2VsZWN0Iikpe3ZhciB2YWx1ZXM9alF1ZXJ5Lm1ha2VB
cnJheSh2YWx1ZSk7alF1ZXJ5KCJvcHRpb24iLHRoaXMpLmVhY2goZnVuY3Rpb24oKXt0aGlzLnNl
bGVjdGVkPShqUXVlcnkuaW5BcnJheSh0aGlzLnZhbHVlLHZhbHVlcyk+PTB8fGpRdWVyeS5pbkFy
cmF5KHRoaXMudGV4dCx2YWx1ZXMpPj0wKTt9KTtpZighdmFsdWVzLmxlbmd0aCl0aGlzLnNlbGVj
dGVkSW5kZXg9LTE7fWVsc2UKK3RoaXMudmFsdWU9dmFsdWU7fSk7fSxodG1sOmZ1bmN0aW9uKHZh
bHVlKXtyZXR1cm4gdmFsdWU9PXVuZGVmaW5lZD8odGhpc1swXT90aGlzWzBdLmlubmVySFRNTDpu
dWxsKTp0aGlzLmVtcHR5KCkuYXBwZW5kKHZhbHVlKTt9LHJlcGxhY2VXaXRoOmZ1bmN0aW9uKHZh
bHVlKXtyZXR1cm4gdGhpcy5hZnRlcih2YWx1ZSkucmVtb3ZlKCk7fSxlcTpmdW5jdGlvbihpKXty
ZXR1cm4gdGhpcy5zbGljZShpLGkrMSk7fSxzbGljZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnB1
c2hTdGFjayhBcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkodGhpcyxhcmd1bWVudHMpKTt9LG1h
cDpmdW5jdGlvbihjYWxsYmFjayl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGpRdWVyeS5tYXAodGhp
cyxmdW5jdGlvbihlbGVtLGkpe3JldHVybiBjYWxsYmFjay5jYWxsKGVsZW0saSxlbGVtKTt9KSk7
fSxhbmRTZWxmOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWRkKHRoaXMucHJldk9iamVjdCk7fSxk
YXRhOmZ1bmN0aW9uKGtleSx2YWx1ZSl7dmFyIHBhcnRzPWtleS5zcGxpdCgiLiIpO3BhcnRzWzFd
PXBhcnRzWzFdPyIuIitwYXJ0c1sxXToiIjtpZih2YWx1ZT09PXVuZGVmaW5lZCl7dmFyIGRhdGE9
dGhpcy50cmlnZ2VySGFuZGxlcigiZ2V0RGF0YSIrcGFydHNbMV0rIiEiLFtwYXJ0c1swXV0pO2lm
KGRhdGE9PT11bmRlZmluZWQmJnRoaXMubGVuZ3RoKWRhdGE9alF1ZXJ5LmRhdGEodGhpc1swXSxr
ZXkpO3JldHVybiBkYXRhPT09dW5kZWZpbmVkJiZwYXJ0c1sxXT90aGlzLmRhdGEocGFydHNbMF0p
OmRhdGE7fWVsc2UKK3JldHVybiB0aGlzLnRyaWdnZXIoInNldERhdGEiK3BhcnRzWzFdKyIhIixb
cGFydHNbMF0sdmFsdWVdKS5lYWNoKGZ1bmN0aW9uKCl7alF1ZXJ5LmRhdGEodGhpcyxrZXksdmFs
dWUpO30pO30scmVtb3ZlRGF0YTpmdW5jdGlvbihrZXkpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rp
b24oKXtqUXVlcnkucmVtb3ZlRGF0YSh0aGlzLGtleSk7fSk7fSxkb21NYW5pcDpmdW5jdGlvbihh
cmdzLHRhYmxlLHJldmVyc2UsY2FsbGJhY2spe3ZhciBjbG9uZT10aGlzLmxlbmd0aD4xLGVsZW1z
O3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtpZighZWxlbXMpe2VsZW1zPWpRdWVyeS5jbGVh
bihhcmdzLHRoaXMub3duZXJEb2N1bWVudCk7aWYocmV2ZXJzZSllbGVtcy5yZXZlcnNlKCk7fXZh
ciBvYmo9dGhpcztpZih0YWJsZSYmalF1ZXJ5Lm5vZGVOYW1lKHRoaXMsInRhYmxlIikmJmpRdWVy
eS5ub2RlTmFtZShlbGVtc1swXSwidHIiKSlvYmo9dGhpcy5nZXRFbGVtZW50c0J5VGFnTmFtZSgi
dGJvZHkiKVswXXx8dGhpcy5hcHBlbmRDaGlsZCh0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxl
bWVudCgidGJvZHkiKSk7dmFyIHNjcmlwdHM9alF1ZXJ5KFtdKTtqUXVlcnkuZWFjaChlbGVtcyxm
dW5jdGlvbigpe3ZhciBlbGVtPWNsb25lP2pRdWVyeSh0aGlzKS5jbG9uZSh0cnVlKVswXTp0aGlz
O2lmKGpRdWVyeS5ub2RlTmFtZShlbGVtLCJzY3JpcHQiKSlzY3JpcHRzPXNjcmlwdHMuYWRkKGVs
ZW0pO2Vsc2V7aWYoZWxlbS5ub2RlVHlwZT09MSlzY3JpcHRzPXNjcmlwdHMuYWRkKGpRdWVyeSgi
c2NyaXB0IixlbGVtKS5yZW1vdmUoKSk7Y2FsbGJhY2suY2FsbChvYmosZWxlbSk7fX0pO3Njcmlw
dHMuZWFjaChldmFsU2NyaXB0KTt9KTt9fTtqUXVlcnkuZm4uaW5pdC5wcm90b3R5cGU9alF1ZXJ5
LmZuO2Z1bmN0aW9uIGV2YWxTY3JpcHQoaSxlbGVtKXtpZihlbGVtLnNyYylqUXVlcnkuYWpheCh7
dXJsOmVsZW0uc3JjLGFzeW5jOmZhbHNlLGRhdGFUeXBlOiJzY3JpcHQifSk7ZWxzZQoralF1ZXJ5
Lmdsb2JhbEV2YWwoZWxlbS50ZXh0fHxlbGVtLnRleHRDb250ZW50fHxlbGVtLmlubmVySFRNTHx8
IiIpO2lmKGVsZW0ucGFyZW50Tm9kZSllbGVtLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZWxlbSk7
fWZ1bmN0aW9uIG5vdygpe3JldHVybituZXcgRGF0ZTt9alF1ZXJ5LmV4dGVuZD1qUXVlcnkuZm4u
ZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIHRhcmdldD1hcmd1bWVudHNbMF18fHt9LGk9MSxsZW5ndGg9
YXJndW1lbnRzLmxlbmd0aCxkZWVwPWZhbHNlLG9wdGlvbnM7aWYodGFyZ2V0LmNvbnN0cnVjdG9y
PT1Cb29sZWFuKXtkZWVwPXRhcmdldDt0YXJnZXQ9YXJndW1lbnRzWzFdfHx7fTtpPTI7fWlmKHR5
cGVvZiB0YXJnZXQhPSJvYmplY3QiJiZ0eXBlb2YgdGFyZ2V0IT0iZnVuY3Rpb24iKXRhcmdldD17
fTtpZihsZW5ndGg9PWkpe3RhcmdldD10aGlzOy0taTt9Zm9yKDtpPGxlbmd0aDtpKyspaWYoKG9w
dGlvbnM9YXJndW1lbnRzW2ldKSE9bnVsbClmb3IodmFyIG5hbWUgaW4gb3B0aW9ucyl7dmFyIHNy
Yz10YXJnZXRbbmFtZV0sY29weT1vcHRpb25zW25hbWVdO2lmKHRhcmdldD09PWNvcHkpY29udGlu
dWU7aWYoZGVlcCYmY29weSYmdHlwZW9mIGNvcHk9PSJvYmplY3QiJiYhY29weS5ub2RlVHlwZSl0
YXJnZXRbbmFtZV09alF1ZXJ5LmV4dGVuZChkZWVwLHNyY3x8KGNvcHkubGVuZ3RoIT1udWxsP1td
Ont9KSxjb3B5KTtlbHNlIGlmKGNvcHkhPT11bmRlZmluZWQpdGFyZ2V0W25hbWVdPWNvcHk7fXJl
dHVybiB0YXJnZXQ7fTt2YXIgZXhwYW5kbz0ialF1ZXJ5Iitub3coKSx1dWlkPTAsd2luZG93RGF0
YT17fSxleGNsdWRlPS96LT9pbmRleHxmb250LT93ZWlnaHR8b3BhY2l0eXx6b29tfGxpbmUtP2hl
aWdodC9pLGRlZmF1bHRWaWV3PWRvY3VtZW50LmRlZmF1bHRWaWV3fHx7fTtqUXVlcnkuZXh0ZW5k
KHtub0NvbmZsaWN0OmZ1bmN0aW9uKGRlZXApe3dpbmRvdy4kPV8kO2lmKGRlZXApd2luZG93LmpR
dWVyeT1falF1ZXJ5O3JldHVybiBqUXVlcnk7fSxpc0Z1bmN0aW9uOmZ1bmN0aW9uKGZuKXtyZXR1
cm4hIWZuJiZ0eXBlb2YgZm4hPSJzdHJpbmciJiYhZm4ubm9kZU5hbWUmJmZuLmNvbnN0cnVjdG9y
IT1BcnJheSYmL15bXHNbXT9mdW5jdGlvbi8udGVzdChmbisiIik7fSxpc1hNTERvYzpmdW5jdGlv
bihlbGVtKXtyZXR1cm4gZWxlbS5kb2N1bWVudEVsZW1lbnQmJiFlbGVtLmJvZHl8fGVsZW0udGFn
TmFtZSYmZWxlbS5vd25lckRvY3VtZW50JiYhZWxlbS5vd25lckRvY3VtZW50LmJvZHk7fSxnbG9i
YWxFdmFsOmZ1bmN0aW9uKGRhdGEpe2RhdGE9alF1ZXJ5LnRyaW0oZGF0YSk7aWYoZGF0YSl7dmFy
IGhlYWQ9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXXx8ZG9jdW1lbnQu
ZG9jdW1lbnRFbGVtZW50LHNjcmlwdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtz
Y3JpcHQudHlwZT0idGV4dC9qYXZhc2NyaXB0IjtpZihqUXVlcnkuYnJvd3Nlci5tc2llKXNjcmlw
dC50ZXh0PWRhdGE7ZWxzZQorc2NyaXB0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHRO
b2RlKGRhdGEpKTtoZWFkLmluc2VydEJlZm9yZShzY3JpcHQsaGVhZC5maXJzdENoaWxkKTtoZWFk
LnJlbW92ZUNoaWxkKHNjcmlwdCk7fX0sbm9kZU5hbWU6ZnVuY3Rpb24oZWxlbSxuYW1lKXtyZXR1
cm4gZWxlbS5ub2RlTmFtZSYmZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPT1uYW1lLnRvVXBw
ZXJDYXNlKCk7fSxjYWNoZTp7fSxkYXRhOmZ1bmN0aW9uKGVsZW0sbmFtZSxkYXRhKXtlbGVtPWVs
ZW09PXdpbmRvdz93aW5kb3dEYXRhOmVsZW07dmFyIGlkPWVsZW1bZXhwYW5kb107aWYoIWlkKWlk
PWVsZW1bZXhwYW5kb109Kyt1dWlkO2lmKG5hbWUmJiFqUXVlcnkuY2FjaGVbaWRdKWpRdWVyeS5j
YWNoZVtpZF09e307aWYoZGF0YSE9PXVuZGVmaW5lZClqUXVlcnkuY2FjaGVbaWRdW25hbWVdPWRh
dGE7cmV0dXJuIG5hbWU/alF1ZXJ5LmNhY2hlW2lkXVtuYW1lXTppZDt9LHJlbW92ZURhdGE6ZnVu
Y3Rpb24oZWxlbSxuYW1lKXtlbGVtPWVsZW09PXdpbmRvdz93aW5kb3dEYXRhOmVsZW07dmFyIGlk
PWVsZW1bZXhwYW5kb107aWYobmFtZSl7aWYoalF1ZXJ5LmNhY2hlW2lkXSl7ZGVsZXRlIGpRdWVy
eS5jYWNoZVtpZF1bbmFtZV07bmFtZT0iIjtmb3IobmFtZSBpbiBqUXVlcnkuY2FjaGVbaWRdKWJy
ZWFrO2lmKCFuYW1lKWpRdWVyeS5yZW1vdmVEYXRhKGVsZW0pO319ZWxzZXt0cnl7ZGVsZXRlIGVs
ZW1bZXhwYW5kb107fWNhdGNoKGUpe2lmKGVsZW0ucmVtb3ZlQXR0cmlidXRlKWVsZW0ucmVtb3Zl
QXR0cmlidXRlKGV4cGFuZG8pO31kZWxldGUgalF1ZXJ5LmNhY2hlW2lkXTt9fSxlYWNoOmZ1bmN0
aW9uKG9iamVjdCxjYWxsYmFjayxhcmdzKXt2YXIgbmFtZSxpPTAsbGVuZ3RoPW9iamVjdC5sZW5n
dGg7aWYoYXJncyl7aWYobGVuZ3RoPT11bmRlZmluZWQpe2ZvcihuYW1lIGluIG9iamVjdClpZihj
YWxsYmFjay5hcHBseShvYmplY3RbbmFtZV0sYXJncyk9PT1mYWxzZSlicmVhazt9ZWxzZQorZm9y
KDtpPGxlbmd0aDspaWYoY2FsbGJhY2suYXBwbHkob2JqZWN0W2krK10sYXJncyk9PT1mYWxzZSli
cmVhazt9ZWxzZXtpZihsZW5ndGg9PXVuZGVmaW5lZCl7Zm9yKG5hbWUgaW4gb2JqZWN0KWlmKGNh
bGxiYWNrLmNhbGwob2JqZWN0W25hbWVdLG5hbWUsb2JqZWN0W25hbWVdKT09PWZhbHNlKWJyZWFr
O31lbHNlCitmb3IodmFyIHZhbHVlPW9iamVjdFswXTtpPGxlbmd0aCYmY2FsbGJhY2suY2FsbCh2
YWx1ZSxpLHZhbHVlKSE9PWZhbHNlO3ZhbHVlPW9iamVjdFsrK2ldKXt9fXJldHVybiBvYmplY3Q7
fSxwcm9wOmZ1bmN0aW9uKGVsZW0sdmFsdWUsdHlwZSxpLG5hbWUpe2lmKGpRdWVyeS5pc0Z1bmN0
aW9uKHZhbHVlKSl2YWx1ZT12YWx1ZS5jYWxsKGVsZW0saSk7cmV0dXJuIHZhbHVlJiZ2YWx1ZS5j
b25zdHJ1Y3Rvcj09TnVtYmVyJiZ0eXBlPT0iY3VyQ1NTIiYmIWV4Y2x1ZGUudGVzdChuYW1lKT92
YWx1ZSsicHgiOnZhbHVlO30sY2xhc3NOYW1lOnthZGQ6ZnVuY3Rpb24oZWxlbSxjbGFzc05hbWVz
KXtqUXVlcnkuZWFjaCgoY2xhc3NOYW1lc3x8IiIpLnNwbGl0KC9ccysvKSxmdW5jdGlvbihpLGNs
YXNzTmFtZSl7aWYoZWxlbS5ub2RlVHlwZT09MSYmIWpRdWVyeS5jbGFzc05hbWUuaGFzKGVsZW0u
Y2xhc3NOYW1lLGNsYXNzTmFtZSkpZWxlbS5jbGFzc05hbWUrPShlbGVtLmNsYXNzTmFtZT8iICI6
IiIpK2NsYXNzTmFtZTt9KTt9LHJlbW92ZTpmdW5jdGlvbihlbGVtLGNsYXNzTmFtZXMpe2lmKGVs
ZW0ubm9kZVR5cGU9PTEpZWxlbS5jbGFzc05hbWU9Y2xhc3NOYW1lcyE9dW5kZWZpbmVkP2pRdWVy
eS5ncmVwKGVsZW0uY2xhc3NOYW1lLnNwbGl0KC9ccysvKSxmdW5jdGlvbihjbGFzc05hbWUpe3Jl
dHVybiFqUXVlcnkuY2xhc3NOYW1lLmhhcyhjbGFzc05hbWVzLGNsYXNzTmFtZSk7fSkuam9pbigi
ICIpOiIiO30saGFzOmZ1bmN0aW9uKGVsZW0sY2xhc3NOYW1lKXtyZXR1cm4galF1ZXJ5LmluQXJy
YXkoY2xhc3NOYW1lLChlbGVtLmNsYXNzTmFtZXx8ZWxlbSkudG9TdHJpbmcoKS5zcGxpdCgvXHMr
LykpPi0xO319LHN3YXA6ZnVuY3Rpb24oZWxlbSxvcHRpb25zLGNhbGxiYWNrKXt2YXIgb2xkPXt9
O2Zvcih2YXIgbmFtZSBpbiBvcHRpb25zKXtvbGRbbmFtZV09ZWxlbS5zdHlsZVtuYW1lXTtlbGVt
LnN0eWxlW25hbWVdPW9wdGlvbnNbbmFtZV07fWNhbGxiYWNrLmNhbGwoZWxlbSk7Zm9yKHZhciBu
YW1lIGluIG9wdGlvbnMpZWxlbS5zdHlsZVtuYW1lXT1vbGRbbmFtZV07fSxjc3M6ZnVuY3Rpb24o
ZWxlbSxuYW1lLGZvcmNlKXtpZihuYW1lPT0id2lkdGgifHxuYW1lPT0iaGVpZ2h0Iil7dmFyIHZh
bCxwcm9wcz17cG9zaXRpb246ImFic29sdXRlIix2aXNpYmlsaXR5OiJoaWRkZW4iLGRpc3BsYXk6
ImJsb2NrIn0sd2hpY2g9bmFtZT09IndpZHRoIj9bIkxlZnQiLCJSaWdodCJdOlsiVG9wIiwiQm90
dG9tIl07ZnVuY3Rpb24gZ2V0V0goKXt2YWw9bmFtZT09IndpZHRoIj9lbGVtLm9mZnNldFdpZHRo
OmVsZW0ub2Zmc2V0SGVpZ2h0O3ZhciBwYWRkaW5nPTAsYm9yZGVyPTA7alF1ZXJ5LmVhY2god2hp
Y2gsZnVuY3Rpb24oKXtwYWRkaW5nKz1wYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1MoZWxlbSwicGFk
ZGluZyIrdGhpcyx0cnVlKSl8fDA7Ym9yZGVyKz1wYXJzZUZsb2F0KGpRdWVyeS5jdXJDU1MoZWxl
bSwiYm9yZGVyIit0aGlzKyJXaWR0aCIsdHJ1ZSkpfHwwO30pO3ZhbC09TWF0aC5yb3VuZChwYWRk
aW5nK2JvcmRlcik7fWlmKGpRdWVyeShlbGVtKS5pcygiOnZpc2libGUiKSlnZXRXSCgpO2Vsc2UK
K2pRdWVyeS5zd2FwKGVsZW0scHJvcHMsZ2V0V0gpO3JldHVybiBNYXRoLm1heCgwLHZhbCk7fXJl
dHVybiBqUXVlcnkuY3VyQ1NTKGVsZW0sbmFtZSxmb3JjZSk7fSxjdXJDU1M6ZnVuY3Rpb24oZWxl
bSxuYW1lLGZvcmNlKXt2YXIgcmV0LHN0eWxlPWVsZW0uc3R5bGU7ZnVuY3Rpb24gY29sb3IoZWxl
bSl7aWYoIWpRdWVyeS5icm93c2VyLnNhZmFyaSlyZXR1cm4gZmFsc2U7dmFyIHJldD1kZWZhdWx0
Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sbnVsbCk7cmV0dXJuIXJldHx8cmV0LmdldFByb3Bl
cnR5VmFsdWUoImNvbG9yIik9PSIiO31pZihuYW1lPT0ib3BhY2l0eSImJmpRdWVyeS5icm93c2Vy
Lm1zaWUpe3JldD1qUXVlcnkuYXR0cihzdHlsZSwib3BhY2l0eSIpO3JldHVybiByZXQ9PSIiPyIx
IjpyZXQ7fWlmKGpRdWVyeS5icm93c2VyLm9wZXJhJiZuYW1lPT0iZGlzcGxheSIpe3ZhciBzYXZl
PXN0eWxlLm91dGxpbmU7c3R5bGUub3V0bGluZT0iMCBzb2xpZCBibGFjayI7c3R5bGUub3V0bGlu
ZT1zYXZlO31pZihuYW1lLm1hdGNoKC9mbG9hdC9pKSluYW1lPXN0eWxlRmxvYXQ7aWYoIWZvcmNl
JiZzdHlsZSYmc3R5bGVbbmFtZV0pcmV0PXN0eWxlW25hbWVdO2Vsc2UgaWYoZGVmYXVsdFZpZXcu
Z2V0Q29tcHV0ZWRTdHlsZSl7aWYobmFtZS5tYXRjaCgvZmxvYXQvaSkpbmFtZT0iZmxvYXQiO25h
bWU9bmFtZS5yZXBsYWNlKC8oW0EtWl0pL2csIi0kMSIpLnRvTG93ZXJDYXNlKCk7dmFyIGNvbXB1
dGVkU3R5bGU9ZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLG51bGwpO2lmKGNvbXB1
dGVkU3R5bGUmJiFjb2xvcihlbGVtKSlyZXQ9Y29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVl
KG5hbWUpO2Vsc2V7dmFyIHN3YXA9W10sc3RhY2s9W10sYT1lbGVtLGk9MDtmb3IoO2EmJmNvbG9y
KGEpO2E9YS5wYXJlbnROb2RlKXN0YWNrLnVuc2hpZnQoYSk7Zm9yKDtpPHN0YWNrLmxlbmd0aDtp
KyspaWYoY29sb3Ioc3RhY2tbaV0pKXtzd2FwW2ldPXN0YWNrW2ldLnN0eWxlLmRpc3BsYXk7c3Rh
Y2tbaV0uc3R5bGUuZGlzcGxheT0iYmxvY2siO31yZXQ9bmFtZT09ImRpc3BsYXkiJiZzd2FwW3N0
YWNrLmxlbmd0aC0xXSE9bnVsbD8ibm9uZSI6KGNvbXB1dGVkU3R5bGUmJmNvbXB1dGVkU3R5bGUu
Z2V0UHJvcGVydHlWYWx1ZShuYW1lKSl8fCIiO2ZvcihpPTA7aTxzd2FwLmxlbmd0aDtpKyspaWYo
c3dhcFtpXSE9bnVsbClzdGFja1tpXS5zdHlsZS5kaXNwbGF5PXN3YXBbaV07fWlmKG5hbWU9PSJv
cGFjaXR5IiYmcmV0PT0iIilyZXQ9IjEiO31lbHNlIGlmKGVsZW0uY3VycmVudFN0eWxlKXt2YXIg
Y2FtZWxDYXNlPW5hbWUucmVwbGFjZSgvXC0oXHcpL2csZnVuY3Rpb24oYWxsLGxldHRlcil7cmV0
dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO30pO3JldD1lbGVtLmN1cnJlbnRTdHlsZVtuYW1lXXx8
ZWxlbS5jdXJyZW50U3R5bGVbY2FtZWxDYXNlXTtpZighL15cZCsocHgpPyQvaS50ZXN0KHJldCkm
Ji9eXGQvLnRlc3QocmV0KSl7dmFyIGxlZnQ9c3R5bGUubGVmdCxyc0xlZnQ9ZWxlbS5ydW50aW1l
U3R5bGUubGVmdDtlbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0PWVsZW0uY3VycmVudFN0eWxlLmxlZnQ7
c3R5bGUubGVmdD1yZXR8fDA7cmV0PXN0eWxlLnBpeGVsTGVmdCsicHgiO3N0eWxlLmxlZnQ9bGVm
dDtlbGVtLnJ1bnRpbWVTdHlsZS5sZWZ0PXJzTGVmdDt9fXJldHVybiByZXQ7fSxjbGVhbjpmdW5j
dGlvbihlbGVtcyxjb250ZXh0KXt2YXIgcmV0PVtdO2NvbnRleHQ9Y29udGV4dHx8ZG9jdW1lbnQ7
aWYodHlwZW9mIGNvbnRleHQuY3JlYXRlRWxlbWVudD09J3VuZGVmaW5lZCcpY29udGV4dD1jb250
ZXh0Lm93bmVyRG9jdW1lbnR8fGNvbnRleHRbMF0mJmNvbnRleHRbMF0ub3duZXJEb2N1bWVudHx8
ZG9jdW1lbnQ7alF1ZXJ5LmVhY2goZWxlbXMsZnVuY3Rpb24oaSxlbGVtKXtpZighZWxlbSlyZXR1
cm47aWYoZWxlbS5jb25zdHJ1Y3Rvcj09TnVtYmVyKWVsZW0rPScnO2lmKHR5cGVvZiBlbGVtPT0i
c3RyaW5nIil7ZWxlbT1lbGVtLnJlcGxhY2UoLyg8KFx3KylbXj5dKj8pXC8+L2csZnVuY3Rpb24o
YWxsLGZyb250LHRhZyl7cmV0dXJuIHRhZy5tYXRjaCgvXihhYmJyfGJyfGNvbHxpbWd8aW5wdXR8
bGlua3xtZXRhfHBhcmFtfGhyfGFyZWF8ZW1iZWQpJC9pKT9hbGw6ZnJvbnQrIj48LyIrdGFnKyI+
Ijt9KTt2YXIgdGFncz1qUXVlcnkudHJpbShlbGVtKS50b0xvd2VyQ2FzZSgpLGRpdj1jb250ZXh0
LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3ZhciB3cmFwPSF0YWdzLmluZGV4T2YoIjxvcHQiKSYmWzEs
IjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXXx8IXRhZ3MuaW5kZXhP
ZigiPGxlZyIpJiZbMSwiPGZpZWxkc2V0PiIsIjwvZmllbGRzZXQ+Il18fHRhZ3MubWF0Y2goL148
KHRoZWFkfHRib2R5fHRmb290fGNvbGd8Y2FwKS8pJiZbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il18
fCF0YWdzLmluZGV4T2YoIjx0ciIpJiZbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFi
bGU+Il18fCghdGFncy5pbmRleE9mKCI8dGQiKXx8IXRhZ3MuaW5kZXhPZigiPHRoIikpJiZbMywi
PHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il18fCF0YWdzLmluZGV4
T2YoIjxjb2wiKSYmWzIsIjx0YWJsZT48dGJvZHk+PC90Ym9keT48Y29sZ3JvdXA+IiwiPC9jb2xn
cm91cD48L3RhYmxlPiJdfHxqUXVlcnkuYnJvd3Nlci5tc2llJiZbMSwiZGl2PGRpdj4iLCI8L2Rp
dj4iXXx8WzAsIiIsIiJdO2Rpdi5pbm5lckhUTUw9d3JhcFsxXStlbGVtK3dyYXBbMl07d2hpbGUo
d3JhcFswXS0tKWRpdj1kaXYubGFzdENoaWxkO2lmKGpRdWVyeS5icm93c2VyLm1zaWUpe3ZhciB0
Ym9keT0hdGFncy5pbmRleE9mKCI8dGFibGUiKSYmdGFncy5pbmRleE9mKCI8dGJvZHkiKTwwP2Rp
di5maXJzdENoaWxkJiZkaXYuZmlyc3RDaGlsZC5jaGlsZE5vZGVzOndyYXBbMV09PSI8dGFibGU+
IiYmdGFncy5pbmRleE9mKCI8dGJvZHkiKTwwP2Rpdi5jaGlsZE5vZGVzOltdO2Zvcih2YXIgaj10
Ym9keS5sZW5ndGgtMTtqPj0wOy0tailpZihqUXVlcnkubm9kZU5hbWUodGJvZHlbal0sInRib2R5
IikmJiF0Ym9keVtqXS5jaGlsZE5vZGVzLmxlbmd0aCl0Ym9keVtqXS5wYXJlbnROb2RlLnJlbW92
ZUNoaWxkKHRib2R5W2pdKTtpZigvXlxzLy50ZXN0KGVsZW0pKWRpdi5pbnNlcnRCZWZvcmUoY29u
dGV4dC5jcmVhdGVUZXh0Tm9kZShlbGVtLm1hdGNoKC9eXHMqLylbMF0pLGRpdi5maXJzdENoaWxk
KTt9ZWxlbT1qUXVlcnkubWFrZUFycmF5KGRpdi5jaGlsZE5vZGVzKTt9aWYoZWxlbS5sZW5ndGg9
PT0wJiYoIWpRdWVyeS5ub2RlTmFtZShlbGVtLCJmb3JtIikmJiFqUXVlcnkubm9kZU5hbWUoZWxl
bSwic2VsZWN0IikpKXJldHVybjtpZihlbGVtWzBdPT11bmRlZmluZWR8fGpRdWVyeS5ub2RlTmFt
ZShlbGVtLCJmb3JtIil8fGVsZW0ub3B0aW9ucylyZXQucHVzaChlbGVtKTtlbHNlCityZXQ9alF1
ZXJ5Lm1lcmdlKHJldCxlbGVtKTt9KTtyZXR1cm4gcmV0O30sYXR0cjpmdW5jdGlvbihlbGVtLG5h
bWUsdmFsdWUpe2lmKCFlbGVtfHxlbGVtLm5vZGVUeXBlPT0zfHxlbGVtLm5vZGVUeXBlPT04KXJl
dHVybiB1bmRlZmluZWQ7dmFyIG5vdHhtbD0halF1ZXJ5LmlzWE1MRG9jKGVsZW0pLHNldD12YWx1
ZSE9PXVuZGVmaW5lZCxtc2llPWpRdWVyeS5icm93c2VyLm1zaWU7bmFtZT1ub3R4bWwmJmpRdWVy
eS5wcm9wc1tuYW1lXXx8bmFtZTtpZihlbGVtLnRhZ05hbWUpe3ZhciBzcGVjaWFsPS9ocmVmfHNy
Y3xzdHlsZS8udGVzdChuYW1lKTtpZihuYW1lPT0ic2VsZWN0ZWQiJiZqUXVlcnkuYnJvd3Nlci5z
YWZhcmkpZWxlbS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7aWYobmFtZSBpbiBlbGVtJiZub3R4
bWwmJiFzcGVjaWFsKXtpZihzZXQpe2lmKG5hbWU9PSJ0eXBlIiYmalF1ZXJ5Lm5vZGVOYW1lKGVs
ZW0sImlucHV0IikmJmVsZW0ucGFyZW50Tm9kZSl0aHJvdyJ0eXBlIHByb3BlcnR5IGNhbid0IGJl
IGNoYW5nZWQiO2VsZW1bbmFtZV09dmFsdWU7fWlmKGpRdWVyeS5ub2RlTmFtZShlbGVtLCJmb3Jt
IikmJmVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSlyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGVO
b2RlKG5hbWUpLm5vZGVWYWx1ZTtyZXR1cm4gZWxlbVtuYW1lXTt9aWYobXNpZSYmbm90eG1sJiZu
YW1lPT0ic3R5bGUiKXJldHVybiBqUXVlcnkuYXR0cihlbGVtLnN0eWxlLCJjc3NUZXh0Iix2YWx1
ZSk7aWYoc2V0KWVsZW0uc2V0QXR0cmlidXRlKG5hbWUsIiIrdmFsdWUpO3ZhciBhdHRyPW1zaWUm
Jm5vdHhtbCYmc3BlY2lhbD9lbGVtLmdldEF0dHJpYnV0ZShuYW1lLDIpOmVsZW0uZ2V0QXR0cmli
dXRlKG5hbWUpO3JldHVybiBhdHRyPT09bnVsbD91bmRlZmluZWQ6YXR0cjt9aWYobXNpZSYmbmFt
ZT09Im9wYWNpdHkiKXtpZihzZXQpe2VsZW0uem9vbT0xO2VsZW0uZmlsdGVyPShlbGVtLmZpbHRl
cnx8IiIpLnJlcGxhY2UoL2FscGhhXChbXildKlwpLywiIikrKHBhcnNlSW50KHZhbHVlKSsnJz09
Ik5hTiI/IiI6ImFscGhhKG9wYWNpdHk9Iit2YWx1ZSoxMDArIikiKTt9cmV0dXJuIGVsZW0uZmls
dGVyJiZlbGVtLmZpbHRlci5pbmRleE9mKCJvcGFjaXR5PSIpPj0wPyhwYXJzZUZsb2F0KGVsZW0u
ZmlsdGVyLm1hdGNoKC9vcGFjaXR5PShbXildKikvKVsxXSkvMTAwKSsnJzoiIjt9bmFtZT1uYW1l
LnJlcGxhY2UoLy0oW2Etel0pL2lnLGZ1bmN0aW9uKGFsbCxsZXR0ZXIpe3JldHVybiBsZXR0ZXIu
dG9VcHBlckNhc2UoKTt9KTtpZihzZXQpZWxlbVtuYW1lXT12YWx1ZTtyZXR1cm4gZWxlbVtuYW1l
XTt9LHRyaW06ZnVuY3Rpb24odGV4dCl7cmV0dXJuKHRleHR8fCIiKS5yZXBsYWNlKC9eXHMrfFxz
KyQvZywiIik7fSxtYWtlQXJyYXk6ZnVuY3Rpb24oYXJyYXkpe3ZhciByZXQ9W107aWYoYXJyYXkh
PW51bGwpe3ZhciBpPWFycmF5Lmxlbmd0aDtpZihpPT1udWxsfHxhcnJheS5zcGxpdHx8YXJyYXku
c2V0SW50ZXJ2YWx8fGFycmF5LmNhbGwpcmV0WzBdPWFycmF5O2Vsc2UKK3doaWxlKGkpcmV0Wy0t
aV09YXJyYXlbaV07fXJldHVybiByZXQ7fSxpbkFycmF5OmZ1bmN0aW9uKGVsZW0sYXJyYXkpe2Zv
cih2YXIgaT0wLGxlbmd0aD1hcnJheS5sZW5ndGg7aTxsZW5ndGg7aSsrKWlmKGFycmF5W2ldPT09
ZWxlbSlyZXR1cm4gaTtyZXR1cm4tMTt9LG1lcmdlOmZ1bmN0aW9uKGZpcnN0LHNlY29uZCl7dmFy
IGk9MCxlbGVtLHBvcz1maXJzdC5sZW5ndGg7aWYoalF1ZXJ5LmJyb3dzZXIubXNpZSl7d2hpbGUo
ZWxlbT1zZWNvbmRbaSsrXSlpZihlbGVtLm5vZGVUeXBlIT04KWZpcnN0W3BvcysrXT1lbGVtO31l
bHNlCit3aGlsZShlbGVtPXNlY29uZFtpKytdKWZpcnN0W3BvcysrXT1lbGVtO3JldHVybiBmaXJz
dDt9LHVuaXF1ZTpmdW5jdGlvbihhcnJheSl7dmFyIHJldD1bXSxkb25lPXt9O3RyeXtmb3IodmFy
IGk9MCxsZW5ndGg9YXJyYXkubGVuZ3RoO2k8bGVuZ3RoO2krKyl7dmFyIGlkPWpRdWVyeS5kYXRh
KGFycmF5W2ldKTtpZighZG9uZVtpZF0pe2RvbmVbaWRdPXRydWU7cmV0LnB1c2goYXJyYXlbaV0p
O319fWNhdGNoKGUpe3JldD1hcnJheTt9cmV0dXJuIHJldDt9LGdyZXA6ZnVuY3Rpb24oZWxlbXMs
Y2FsbGJhY2ssaW52KXt2YXIgcmV0PVtdO2Zvcih2YXIgaT0wLGxlbmd0aD1lbGVtcy5sZW5ndGg7
aTxsZW5ndGg7aSsrKWlmKCFpbnYhPSFjYWxsYmFjayhlbGVtc1tpXSxpKSlyZXQucHVzaChlbGVt
c1tpXSk7cmV0dXJuIHJldDt9LG1hcDpmdW5jdGlvbihlbGVtcyxjYWxsYmFjayl7dmFyIHJldD1b
XTtmb3IodmFyIGk9MCxsZW5ndGg9ZWxlbXMubGVuZ3RoO2k8bGVuZ3RoO2krKyl7dmFyIHZhbHVl
PWNhbGxiYWNrKGVsZW1zW2ldLGkpO2lmKHZhbHVlIT1udWxsKXJldFtyZXQubGVuZ3RoXT12YWx1
ZTt9cmV0dXJuIHJldC5jb25jYXQuYXBwbHkoW10scmV0KTt9fSk7dmFyIHVzZXJBZ2VudD1uYXZp
Z2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCk7alF1ZXJ5LmJyb3dzZXI9e3ZlcnNpb246KHVz
ZXJBZ2VudC5tYXRjaCgvLisoPzpydnxpdHxyYXxpZSlbXC86IF0oW1xkLl0rKS8pfHxbXSlbMV0s
c2FmYXJpOi93ZWJraXQvLnRlc3QodXNlckFnZW50KSxvcGVyYTovb3BlcmEvLnRlc3QodXNlckFn
ZW50KSxtc2llOi9tc2llLy50ZXN0KHVzZXJBZ2VudCkmJiEvb3BlcmEvLnRlc3QodXNlckFnZW50
KSxtb3ppbGxhOi9tb3ppbGxhLy50ZXN0KHVzZXJBZ2VudCkmJiEvKGNvbXBhdGlibGV8d2Via2l0
KS8udGVzdCh1c2VyQWdlbnQpfTt2YXIgc3R5bGVGbG9hdD1qUXVlcnkuYnJvd3Nlci5tc2llPyJz
dHlsZUZsb2F0IjoiY3NzRmxvYXQiO2pRdWVyeS5leHRlbmQoe2JveE1vZGVsOiFqUXVlcnkuYnJv
d3Nlci5tc2llfHxkb2N1bWVudC5jb21wYXRNb2RlPT0iQ1NTMUNvbXBhdCIscHJvcHM6eyJmb3Ii
OiJodG1sRm9yIiwiY2xhc3MiOiJjbGFzc05hbWUiLCJmbG9hdCI6c3R5bGVGbG9hdCxjc3NGbG9h
dDpzdHlsZUZsb2F0LHN0eWxlRmxvYXQ6c3R5bGVGbG9hdCxyZWFkb25seToicmVhZE9ubHkiLG1h
eGxlbmd0aDoibWF4TGVuZ3RoIixjZWxsc3BhY2luZzoiY2VsbFNwYWNpbmcifX0pO2pRdWVyeS5l
YWNoKHtwYXJlbnQ6ZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGVsZW0ucGFyZW50Tm9kZTt9LHBhcmVu
dHM6ZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5kaXIoZWxlbSwicGFyZW50Tm9kZSIpO30s
bmV4dDpmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5Lm50aChlbGVtLDIsIm5leHRTaWJsaW5n
Iik7fSxwcmV2OmZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkubnRoKGVsZW0sMiwicHJldmlv
dXNTaWJsaW5nIik7fSxuZXh0QWxsOmZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnkuZGlyKGVs
ZW0sIm5leHRTaWJsaW5nIik7fSxwcmV2QWxsOmZ1bmN0aW9uKGVsZW0pe3JldHVybiBqUXVlcnku
ZGlyKGVsZW0sInByZXZpb3VzU2libGluZyIpO30sc2libGluZ3M6ZnVuY3Rpb24oZWxlbSl7cmV0
dXJuIGpRdWVyeS5zaWJsaW5nKGVsZW0ucGFyZW50Tm9kZS5maXJzdENoaWxkLGVsZW0pO30sY2hp
bGRyZW46ZnVuY3Rpb24oZWxlbSl7cmV0dXJuIGpRdWVyeS5zaWJsaW5nKGVsZW0uZmlyc3RDaGls
ZCk7fSxjb250ZW50czpmdW5jdGlvbihlbGVtKXtyZXR1cm4galF1ZXJ5Lm5vZGVOYW1lKGVsZW0s
ImlmcmFtZSIpP2VsZW0uY29udGVudERvY3VtZW50fHxlbGVtLmNvbnRlbnRXaW5kb3cuZG9jdW1l
bnQ6alF1ZXJ5Lm1ha2VBcnJheShlbGVtLmNoaWxkTm9kZXMpO319LGZ1bmN0aW9uKG5hbWUsZm4p
e2pRdWVyeS5mbltuYW1lXT1mdW5jdGlvbihzZWxlY3Rvcil7dmFyIHJldD1qUXVlcnkubWFwKHRo
aXMsZm4pO2lmKHNlbGVjdG9yJiZ0eXBlb2Ygc2VsZWN0b3I9PSJzdHJpbmciKXJldD1qUXVlcnku
bXVsdGlGaWx0ZXIoc2VsZWN0b3IscmV0KTtyZXR1cm4gdGhpcy5wdXNoU3RhY2soalF1ZXJ5LnVu
aXF1ZShyZXQpKTt9O30pO2pRdWVyeS5lYWNoKHthcHBlbmRUbzoiYXBwZW5kIixwcmVwZW5kVG86
InByZXBlbmQiLGluc2VydEJlZm9yZToiYmVmb3JlIixpbnNlcnRBZnRlcjoiYWZ0ZXIiLHJlcGxh
Y2VBbGw6InJlcGxhY2VXaXRoIn0sZnVuY3Rpb24obmFtZSxvcmlnaW5hbCl7alF1ZXJ5LmZuW25h
bWVdPWZ1bmN0aW9uKCl7dmFyIGFyZ3M9YXJndW1lbnRzO3JldHVybiB0aGlzLmVhY2goZnVuY3Rp
b24oKXtmb3IodmFyIGk9MCxsZW5ndGg9YXJncy5sZW5ndGg7aTxsZW5ndGg7aSsrKWpRdWVyeShh
cmdzW2ldKVtvcmlnaW5hbF0odGhpcyk7fSk7fTt9KTtqUXVlcnkuZWFjaCh7cmVtb3ZlQXR0cjpm
dW5jdGlvbihuYW1lKXtqUXVlcnkuYXR0cih0aGlzLG5hbWUsIiIpO2lmKHRoaXMubm9kZVR5cGU9
PTEpdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7fSxhZGRDbGFzczpmdW5jdGlvbihjbGFzc05h
bWVzKXtqUXVlcnkuY2xhc3NOYW1lLmFkZCh0aGlzLGNsYXNzTmFtZXMpO30scmVtb3ZlQ2xhc3M6
ZnVuY3Rpb24oY2xhc3NOYW1lcyl7alF1ZXJ5LmNsYXNzTmFtZS5yZW1vdmUodGhpcyxjbGFzc05h
bWVzKTt9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGNsYXNzTmFtZXMpe2pRdWVyeS5jbGFzc05hbWVb
alF1ZXJ5LmNsYXNzTmFtZS5oYXModGhpcyxjbGFzc05hbWVzKT8icmVtb3ZlIjoiYWRkIl0odGhp
cyxjbGFzc05hbWVzKTt9LHJlbW92ZTpmdW5jdGlvbihzZWxlY3Rvcil7aWYoIXNlbGVjdG9yfHxq
UXVlcnkuZmlsdGVyKHNlbGVjdG9yLFt0aGlzXSkuci5sZW5ndGgpe2pRdWVyeSgiKiIsdGhpcyku
YWRkKHRoaXMpLmVhY2goZnVuY3Rpb24oKXtqUXVlcnkuZXZlbnQucmVtb3ZlKHRoaXMpO2pRdWVy
eS5yZW1vdmVEYXRhKHRoaXMpO30pO2lmKHRoaXMucGFyZW50Tm9kZSl0aGlzLnBhcmVudE5vZGUu
cmVtb3ZlQ2hpbGQodGhpcyk7fX0sZW1wdHk6ZnVuY3Rpb24oKXtqUXVlcnkoIj4qIix0aGlzKS5y
ZW1vdmUoKTt3aGlsZSh0aGlzLmZpcnN0Q2hpbGQpdGhpcy5yZW1vdmVDaGlsZCh0aGlzLmZpcnN0
Q2hpbGQpO319LGZ1bmN0aW9uKG5hbWUsZm4pe2pRdWVyeS5mbltuYW1lXT1mdW5jdGlvbigpe3Jl
dHVybiB0aGlzLmVhY2goZm4sYXJndW1lbnRzKTt9O30pO2pRdWVyeS5lYWNoKFsiSGVpZ2h0Iiwi
V2lkdGgiXSxmdW5jdGlvbihpLG5hbWUpe3ZhciB0eXBlPW5hbWUudG9Mb3dlckNhc2UoKTtqUXVl
cnkuZm5bdHlwZV09ZnVuY3Rpb24oc2l6ZSl7cmV0dXJuIHRoaXNbMF09PXdpbmRvdz9qUXVlcnku
YnJvd3Nlci5vcGVyYSYmZG9jdW1lbnQuYm9keVsiY2xpZW50IituYW1lXXx8alF1ZXJ5LmJyb3dz
ZXIuc2FmYXJpJiZ3aW5kb3dbImlubmVyIituYW1lXXx8ZG9jdW1lbnQuY29tcGF0TW9kZT09IkNT
UzFDb21wYXQiJiZkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrbmFtZV18fGRvY3Vt
ZW50LmJvZHlbImNsaWVudCIrbmFtZV06dGhpc1swXT09ZG9jdW1lbnQ/TWF0aC5tYXgoTWF0aC5t
YXgoZG9jdW1lbnQuYm9keVsic2Nyb2xsIituYW1lXSxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRb
InNjcm9sbCIrbmFtZV0pLE1hdGgubWF4KGRvY3VtZW50LmJvZHlbIm9mZnNldCIrbmFtZV0sZG9j
dW1lbnQuZG9jdW1lbnRFbGVtZW50WyJvZmZzZXQiK25hbWVdKSk6c2l6ZT09dW5kZWZpbmVkPyh0
aGlzLmxlbmd0aD9qUXVlcnkuY3NzKHRoaXNbMF0sdHlwZSk6bnVsbCk6dGhpcy5jc3ModHlwZSxz
aXplLmNvbnN0cnVjdG9yPT1TdHJpbmc/c2l6ZTpzaXplKyJweCIpO307fSk7ZnVuY3Rpb24gbnVt
KGVsZW0scHJvcCl7cmV0dXJuIGVsZW1bMF0mJnBhcnNlSW50KGpRdWVyeS5jdXJDU1MoZWxlbVsw
XSxwcm9wLHRydWUpLDEwKXx8MDt9dmFyIGNoYXJzPWpRdWVyeS5icm93c2VyLnNhZmFyaSYmcGFy
c2VJbnQoalF1ZXJ5LmJyb3dzZXIudmVyc2lvbik8NDE3PyIoPzpbXFx3Kl8tXXxcXFxcLikiOiIo
PzpbXFx3XHUwMTI4LVx1RkZGRipfLV18XFxcXC4pIixxdWlja0NoaWxkPW5ldyBSZWdFeHAoIl4+
XFxzKigiK2NoYXJzKyIrKSIpLHF1aWNrSUQ9bmV3IFJlZ0V4cCgiXigiK2NoYXJzKyIrKSgjKSgi
K2NoYXJzKyIrKSIpLHF1aWNrQ2xhc3M9bmV3IFJlZ0V4cCgiXihbIy5dPykoIitjaGFycysiKiki
KTtqUXVlcnkuZXh0ZW5kKHtleHByOnsiIjpmdW5jdGlvbihhLGksbSl7cmV0dXJuIG1bMl09PSIq
Inx8alF1ZXJ5Lm5vZGVOYW1lKGEsbVsyXSk7fSwiIyI6ZnVuY3Rpb24oYSxpLG0pe3JldHVybiBh
LmdldEF0dHJpYnV0ZSgiaWQiKT09bVsyXTt9LCI6Ijp7bHQ6ZnVuY3Rpb24oYSxpLG0pe3JldHVy
biBpPG1bM10tMDt9LGd0OmZ1bmN0aW9uKGEsaSxtKXtyZXR1cm4gaT5tWzNdLTA7fSxudGg6ZnVu
Y3Rpb24oYSxpLG0pe3JldHVybiBtWzNdLTA9PWk7fSxlcTpmdW5jdGlvbihhLGksbSl7cmV0dXJu
IG1bM10tMD09aTt9LGZpcnN0OmZ1bmN0aW9uKGEsaSl7cmV0dXJuIGk9PTA7fSxsYXN0OmZ1bmN0
aW9uKGEsaSxtLHIpe3JldHVybiBpPT1yLmxlbmd0aC0xO30sZXZlbjpmdW5jdGlvbihhLGkpe3Jl
dHVybiBpJTI9PTA7fSxvZGQ6ZnVuY3Rpb24oYSxpKXtyZXR1cm4gaSUyO30sImZpcnN0LWNoaWxk
IjpmdW5jdGlvbihhKXtyZXR1cm4gYS5wYXJlbnROb2RlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIq
IilbMF09PWE7fSwibGFzdC1jaGlsZCI6ZnVuY3Rpb24oYSl7cmV0dXJuIGpRdWVyeS5udGgoYS5w
YXJlbnROb2RlLmxhc3RDaGlsZCwxLCJwcmV2aW91c1NpYmxpbmciKT09YTt9LCJvbmx5LWNoaWxk
IjpmdW5jdGlvbihhKXtyZXR1cm4halF1ZXJ5Lm50aChhLnBhcmVudE5vZGUubGFzdENoaWxkLDIs
InByZXZpb3VzU2libGluZyIpO30scGFyZW50OmZ1bmN0aW9uKGEpe3JldHVybiBhLmZpcnN0Q2hp
bGQ7fSxlbXB0eTpmdW5jdGlvbihhKXtyZXR1cm4hYS5maXJzdENoaWxkO30sY29udGFpbnM6ZnVu
Y3Rpb24oYSxpLG0pe3JldHVybihhLnRleHRDb250ZW50fHxhLmlubmVyVGV4dHx8alF1ZXJ5KGEp
LnRleHQoKXx8IiIpLmluZGV4T2YobVszXSk+PTA7fSx2aXNpYmxlOmZ1bmN0aW9uKGEpe3JldHVy
biJoaWRkZW4iIT1hLnR5cGUmJmpRdWVyeS5jc3MoYSwiZGlzcGxheSIpIT0ibm9uZSImJmpRdWVy
eS5jc3MoYSwidmlzaWJpbGl0eSIpIT0iaGlkZGVuIjt9LGhpZGRlbjpmdW5jdGlvbihhKXtyZXR1
cm4iaGlkZGVuIj09YS50eXBlfHxqUXVlcnkuY3NzKGEsImRpc3BsYXkiKT09Im5vbmUifHxqUXVl
cnkuY3NzKGEsInZpc2liaWxpdHkiKT09ImhpZGRlbiI7fSxlbmFibGVkOmZ1bmN0aW9uKGEpe3Jl
dHVybiFhLmRpc2FibGVkO30sZGlzYWJsZWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzYWJsZWQ7
fSxjaGVja2VkOmZ1bmN0aW9uKGEpe3JldHVybiBhLmNoZWNrZWQ7fSxzZWxlY3RlZDpmdW5jdGlv
bihhKXtyZXR1cm4gYS5zZWxlY3RlZHx8alF1ZXJ5LmF0dHIoYSwic2VsZWN0ZWQiKTt9LHRleHQ6
ZnVuY3Rpb24oYSl7cmV0dXJuInRleHQiPT1hLnR5cGU7fSxyYWRpbzpmdW5jdGlvbihhKXtyZXR1
cm4icmFkaW8iPT1hLnR5cGU7fSxjaGVja2JveDpmdW5jdGlvbihhKXtyZXR1cm4iY2hlY2tib3gi
PT1hLnR5cGU7fSxmaWxlOmZ1bmN0aW9uKGEpe3JldHVybiJmaWxlIj09YS50eXBlO30scGFzc3dv
cmQ6ZnVuY3Rpb24oYSl7cmV0dXJuInBhc3N3b3JkIj09YS50eXBlO30sc3VibWl0OmZ1bmN0aW9u
KGEpe3JldHVybiJzdWJtaXQiPT1hLnR5cGU7fSxpbWFnZTpmdW5jdGlvbihhKXtyZXR1cm4iaW1h
Z2UiPT1hLnR5cGU7fSxyZXNldDpmdW5jdGlvbihhKXtyZXR1cm4icmVzZXQiPT1hLnR5cGU7fSxi
dXR0b246ZnVuY3Rpb24oYSl7cmV0dXJuImJ1dHRvbiI9PWEudHlwZXx8alF1ZXJ5Lm5vZGVOYW1l
KGEsImJ1dHRvbiIpO30saW5wdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuL2lucHV0fHNlbGVjdHx0ZXh0
YXJlYXxidXR0b24vaS50ZXN0KGEubm9kZU5hbWUpO30saGFzOmZ1bmN0aW9uKGEsaSxtKXtyZXR1
cm4galF1ZXJ5LmZpbmQobVszXSxhKS5sZW5ndGg7fSxoZWFkZXI6ZnVuY3Rpb24oYSl7cmV0dXJu
L2hcZC9pLnRlc3QoYS5ub2RlTmFtZSk7fSxhbmltYXRlZDpmdW5jdGlvbihhKXtyZXR1cm4galF1
ZXJ5LmdyZXAoalF1ZXJ5LnRpbWVycyxmdW5jdGlvbihmbil7cmV0dXJuIGE9PWZuLmVsZW07fSku
bGVuZ3RoO319fSxwYXJzZTpbL14oXFspICpAPyhbXHctXSspICooWyEqJF5+PV0qKSAqKCc/Ij8p
KC4qPylcNCAqXF0vLC9eKDopKFtcdy1dKylcKCI/Jz8oLio/KFwoLio/XCkpP1teKF0qPykiPyc/
XCkvLG5ldyBSZWdFeHAoIl4oWzouI10qKSgiK2NoYXJzKyIrKSIpXSxtdWx0aUZpbHRlcjpmdW5j
dGlvbihleHByLGVsZW1zLG5vdCl7dmFyIG9sZCxjdXI9W107d2hpbGUoZXhwciYmZXhwciE9b2xk
KXtvbGQ9ZXhwcjt2YXIgZj1qUXVlcnkuZmlsdGVyKGV4cHIsZWxlbXMsbm90KTtleHByPWYudC5y
ZXBsYWNlKC9eXHMqLFxzKi8sIiIpO2N1cj1ub3Q/ZWxlbXM9Zi5yOmpRdWVyeS5tZXJnZShjdXIs
Zi5yKTt9cmV0dXJuIGN1cjt9LGZpbmQ6ZnVuY3Rpb24odCxjb250ZXh0KXtpZih0eXBlb2YgdCE9
InN0cmluZyIpcmV0dXJuW3RdO2lmKGNvbnRleHQmJmNvbnRleHQubm9kZVR5cGUhPTEmJmNvbnRl
eHQubm9kZVR5cGUhPTkpcmV0dXJuW107Y29udGV4dD1jb250ZXh0fHxkb2N1bWVudDt2YXIgcmV0
PVtjb250ZXh0XSxkb25lPVtdLGxhc3Qsbm9kZU5hbWU7d2hpbGUodCYmbGFzdCE9dCl7dmFyIHI9
W107bGFzdD10O3Q9alF1ZXJ5LnRyaW0odCk7dmFyIGZvdW5kVG9rZW49ZmFsc2UscmU9cXVpY2tD
aGlsZCxtPXJlLmV4ZWModCk7aWYobSl7bm9kZU5hbWU9bVsxXS50b1VwcGVyQ2FzZSgpO2Zvcih2
YXIgaT0wO3JldFtpXTtpKyspZm9yKHZhciBjPXJldFtpXS5maXJzdENoaWxkO2M7Yz1jLm5leHRT
aWJsaW5nKWlmKGMubm9kZVR5cGU9PTEmJihub2RlTmFtZT09IioifHxjLm5vZGVOYW1lLnRvVXBw
ZXJDYXNlKCk9PW5vZGVOYW1lKSlyLnB1c2goYyk7cmV0PXI7dD10LnJlcGxhY2UocmUsIiIpO2lm
KHQuaW5kZXhPZigiICIpPT0wKWNvbnRpbnVlO2ZvdW5kVG9rZW49dHJ1ZTt9ZWxzZXtyZT0vXihb
Pit+XSlccyooXHcqKS9pO2lmKChtPXJlLmV4ZWModCkpIT1udWxsKXtyPVtdO3ZhciBtZXJnZT17
fTtub2RlTmFtZT1tWzJdLnRvVXBwZXJDYXNlKCk7bT1tWzFdO2Zvcih2YXIgaj0wLHJsPXJldC5s
ZW5ndGg7ajxybDtqKyspe3ZhciBuPW09PSJ+Inx8bT09IisiP3JldFtqXS5uZXh0U2libGluZzpy
ZXRbal0uZmlyc3RDaGlsZDtmb3IoO247bj1uLm5leHRTaWJsaW5nKWlmKG4ubm9kZVR5cGU9PTEp
e3ZhciBpZD1qUXVlcnkuZGF0YShuKTtpZihtPT0ifiImJm1lcmdlW2lkXSlicmVhaztpZighbm9k
ZU5hbWV8fG4ubm9kZU5hbWUudG9VcHBlckNhc2UoKT09bm9kZU5hbWUpe2lmKG09PSJ+IiltZXJn
ZVtpZF09dHJ1ZTtyLnB1c2gobik7fWlmKG09PSIrIilicmVhazt9fXJldD1yO3Q9alF1ZXJ5LnRy
aW0odC5yZXBsYWNlKHJlLCIiKSk7Zm91bmRUb2tlbj10cnVlO319aWYodCYmIWZvdW5kVG9rZW4p
e2lmKCF0LmluZGV4T2YoIiwiKSl7aWYoY29udGV4dD09cmV0WzBdKXJldC5zaGlmdCgpO2RvbmU9
alF1ZXJ5Lm1lcmdlKGRvbmUscmV0KTtyPXJldD1bY29udGV4dF07dD0iICIrdC5zdWJzdHIoMSx0
Lmxlbmd0aCk7fWVsc2V7dmFyIHJlMj1xdWlja0lEO3ZhciBtPXJlMi5leGVjKHQpO2lmKG0pe209
WzAsbVsyXSxtWzNdLG1bMV1dO31lbHNle3JlMj1xdWlja0NsYXNzO209cmUyLmV4ZWModCk7fW1b
Ml09bVsyXS5yZXBsYWNlKC9cXC9nLCIiKTt2YXIgZWxlbT1yZXRbcmV0Lmxlbmd0aC0xXTtpZiht
WzFdPT0iIyImJmVsZW0mJmVsZW0uZ2V0RWxlbWVudEJ5SWQmJiFqUXVlcnkuaXNYTUxEb2MoZWxl
bSkpe3ZhciBvaWQ9ZWxlbS5nZXRFbGVtZW50QnlJZChtWzJdKTtpZigoalF1ZXJ5LmJyb3dzZXIu
bXNpZXx8alF1ZXJ5LmJyb3dzZXIub3BlcmEpJiZvaWQmJnR5cGVvZiBvaWQuaWQ9PSJzdHJpbmci
JiZvaWQuaWQhPW1bMl0pb2lkPWpRdWVyeSgnW0BpZD0iJyttWzJdKyciXScsZWxlbSlbMF07cmV0
PXI9b2lkJiYoIW1bM118fGpRdWVyeS5ub2RlTmFtZShvaWQsbVszXSkpP1tvaWRdOltdO31lbHNl
e2Zvcih2YXIgaT0wO3JldFtpXTtpKyspe3ZhciB0YWc9bVsxXT09IiMiJiZtWzNdP21bM106bVsx
XSE9IiJ8fG1bMF09PSIiPyIqIjptWzJdO2lmKHRhZz09IioiJiZyZXRbaV0ubm9kZU5hbWUudG9M
b3dlckNhc2UoKT09Im9iamVjdCIpdGFnPSJwYXJhbSI7cj1qUXVlcnkubWVyZ2UocixyZXRbaV0u
Z2V0RWxlbWVudHNCeVRhZ05hbWUodGFnKSk7fWlmKG1bMV09PSIuIilyPWpRdWVyeS5jbGFzc0Zp
bHRlcihyLG1bMl0pO2lmKG1bMV09PSIjIil7dmFyIHRtcD1bXTtmb3IodmFyIGk9MDtyW2ldO2kr
KylpZihyW2ldLmdldEF0dHJpYnV0ZSgiaWQiKT09bVsyXSl7dG1wPVtyW2ldXTticmVhazt9cj10
bXA7fXJldD1yO310PXQucmVwbGFjZShyZTIsIiIpO319aWYodCl7dmFyIHZhbD1qUXVlcnkuZmls
dGVyKHQscik7cmV0PXI9dmFsLnI7dD1qUXVlcnkudHJpbSh2YWwudCk7fX1pZih0KXJldD1bXTtp
ZihyZXQmJmNvbnRleHQ9PXJldFswXSlyZXQuc2hpZnQoKTtkb25lPWpRdWVyeS5tZXJnZShkb25l
LHJldCk7cmV0dXJuIGRvbmU7fSxjbGFzc0ZpbHRlcjpmdW5jdGlvbihyLG0sbm90KXttPSIgIitt
KyIgIjt2YXIgdG1wPVtdO2Zvcih2YXIgaT0wO3JbaV07aSsrKXt2YXIgcGFzcz0oIiAiK3JbaV0u
Y2xhc3NOYW1lKyIgIikuaW5kZXhPZihtKT49MDtpZighbm90JiZwYXNzfHxub3QmJiFwYXNzKXRt
cC5wdXNoKHJbaV0pO31yZXR1cm4gdG1wO30sZmlsdGVyOmZ1bmN0aW9uKHQscixub3Qpe3ZhciBs
YXN0O3doaWxlKHQmJnQhPWxhc3Qpe2xhc3Q9dDt2YXIgcD1qUXVlcnkucGFyc2UsbTtmb3IodmFy
IGk9MDtwW2ldO2krKyl7bT1wW2ldLmV4ZWModCk7aWYobSl7dD10LnN1YnN0cmluZyhtWzBdLmxl
bmd0aCk7bVsyXT1tWzJdLnJlcGxhY2UoL1xcL2csIiIpO2JyZWFrO319aWYoIW0pYnJlYWs7aWYo
bVsxXT09IjoiJiZtWzJdPT0ibm90IilyPWlzU2ltcGxlLnRlc3QobVszXSk/alF1ZXJ5LmZpbHRl
cihtWzNdLHIsdHJ1ZSkucjpqUXVlcnkocikubm90KG1bM10pO2Vsc2UgaWYobVsxXT09Ii4iKXI9
alF1ZXJ5LmNsYXNzRmlsdGVyKHIsbVsyXSxub3QpO2Vsc2UgaWYobVsxXT09IlsiKXt2YXIgdG1w
PVtdLHR5cGU9bVszXTtmb3IodmFyIGk9MCxybD1yLmxlbmd0aDtpPHJsO2krKyl7dmFyIGE9cltp
XSx6PWFbalF1ZXJ5LnByb3BzW21bMl1dfHxtWzJdXTtpZih6PT1udWxsfHwvaHJlZnxzcmN8c2Vs
ZWN0ZWQvLnRlc3QobVsyXSkpej1qUXVlcnkuYXR0cihhLG1bMl0pfHwnJztpZigodHlwZT09IiIm
JiEhenx8dHlwZT09Ij0iJiZ6PT1tWzVdfHx0eXBlPT0iIT0iJiZ6IT1tWzVdfHx0eXBlPT0iXj0i
JiZ6JiYhei5pbmRleE9mKG1bNV0pfHx0eXBlPT0iJD0iJiZ6LnN1YnN0cih6Lmxlbmd0aC1tWzVd
Lmxlbmd0aCk9PW1bNV18fCh0eXBlPT0iKj0ifHx0eXBlPT0ifj0iKSYmei5pbmRleE9mKG1bNV0p
Pj0wKV5ub3QpdG1wLnB1c2goYSk7fXI9dG1wO31lbHNlIGlmKG1bMV09PSI6IiYmbVsyXT09Im50
aC1jaGlsZCIpe3ZhciBtZXJnZT17fSx0bXA9W10sdGVzdD0vKC0/KShcZCopbigoPzpcK3wtKT9c
ZCopLy5leGVjKG1bM109PSJldmVuIiYmIjJuInx8bVszXT09Im9kZCImJiIybisxInx8IS9cRC8u
dGVzdChtWzNdKSYmIjBuKyIrbVszXXx8bVszXSksZmlyc3Q9KHRlc3RbMV0rKHRlc3RbMl18fDEp
KS0wLGxhc3Q9dGVzdFszXS0wO2Zvcih2YXIgaT0wLHJsPXIubGVuZ3RoO2k8cmw7aSsrKXt2YXIg
bm9kZT1yW2ldLHBhcmVudE5vZGU9bm9kZS5wYXJlbnROb2RlLGlkPWpRdWVyeS5kYXRhKHBhcmVu
dE5vZGUpO2lmKCFtZXJnZVtpZF0pe3ZhciBjPTE7Zm9yKHZhciBuPXBhcmVudE5vZGUuZmlyc3RD
aGlsZDtuO249bi5uZXh0U2libGluZylpZihuLm5vZGVUeXBlPT0xKW4ubm9kZUluZGV4PWMrKztt
ZXJnZVtpZF09dHJ1ZTt9dmFyIGFkZD1mYWxzZTtpZihmaXJzdD09MCl7aWYobm9kZS5ub2RlSW5k
ZXg9PWxhc3QpYWRkPXRydWU7fWVsc2UgaWYoKG5vZGUubm9kZUluZGV4LWxhc3QpJWZpcnN0PT0w
JiYobm9kZS5ub2RlSW5kZXgtbGFzdCkvZmlyc3Q+PTApYWRkPXRydWU7aWYoYWRkXm5vdCl0bXAu
cHVzaChub2RlKTt9cj10bXA7fWVsc2V7dmFyIGZuPWpRdWVyeS5leHByW21bMV1dO2lmKHR5cGVv
ZiBmbj09Im9iamVjdCIpZm49Zm5bbVsyXV07aWYodHlwZW9mIGZuPT0ic3RyaW5nIilmbj1ldmFs
KCJmYWxzZXx8ZnVuY3Rpb24oYSxpKXtyZXR1cm4gIitmbisiO30iKTtyPWpRdWVyeS5ncmVwKHIs
ZnVuY3Rpb24oZWxlbSxpKXtyZXR1cm4gZm4oZWxlbSxpLG0scik7fSxub3QpO319cmV0dXJue3I6
cix0OnR9O30sZGlyOmZ1bmN0aW9uKGVsZW0sZGlyKXt2YXIgbWF0Y2hlZD1bXSxjdXI9ZWxlbVtk
aXJdO3doaWxlKGN1ciYmY3VyIT1kb2N1bWVudCl7aWYoY3VyLm5vZGVUeXBlPT0xKW1hdGNoZWQu
cHVzaChjdXIpO2N1cj1jdXJbZGlyXTt9cmV0dXJuIG1hdGNoZWQ7fSxudGg6ZnVuY3Rpb24oY3Vy
LHJlc3VsdCxkaXIsZWxlbSl7cmVzdWx0PXJlc3VsdHx8MTt2YXIgbnVtPTA7Zm9yKDtjdXI7Y3Vy
PWN1cltkaXJdKWlmKGN1ci5ub2RlVHlwZT09MSYmKytudW09PXJlc3VsdClicmVhaztyZXR1cm4g
Y3VyO30sc2libGluZzpmdW5jdGlvbihuLGVsZW0pe3ZhciByPVtdO2Zvcig7bjtuPW4ubmV4dFNp
Ymxpbmcpe2lmKG4ubm9kZVR5cGU9PTEmJm4hPWVsZW0pci5wdXNoKG4pO31yZXR1cm4gcjt9fSk7
alF1ZXJ5LmV2ZW50PXthZGQ6ZnVuY3Rpb24oZWxlbSx0eXBlcyxoYW5kbGVyLGRhdGEpe2lmKGVs
ZW0ubm9kZVR5cGU9PTN8fGVsZW0ubm9kZVR5cGU9PTgpcmV0dXJuO2lmKGpRdWVyeS5icm93c2Vy
Lm1zaWUmJmVsZW0uc2V0SW50ZXJ2YWwpZWxlbT13aW5kb3c7aWYoIWhhbmRsZXIuZ3VpZCloYW5k
bGVyLmd1aWQ9dGhpcy5ndWlkKys7aWYoZGF0YSE9dW5kZWZpbmVkKXt2YXIgZm49aGFuZGxlcjto
YW5kbGVyPXRoaXMucHJveHkoZm4sZnVuY3Rpb24oKXtyZXR1cm4gZm4uYXBwbHkodGhpcyxhcmd1
bWVudHMpO30pO2hhbmRsZXIuZGF0YT1kYXRhO312YXIgZXZlbnRzPWpRdWVyeS5kYXRhKGVsZW0s
ImV2ZW50cyIpfHxqUXVlcnkuZGF0YShlbGVtLCJldmVudHMiLHt9KSxoYW5kbGU9alF1ZXJ5LmRh
dGEoZWxlbSwiaGFuZGxlIil8fGpRdWVyeS5kYXRhKGVsZW0sImhhbmRsZSIsZnVuY3Rpb24oKXtp
Zih0eXBlb2YgalF1ZXJ5IT0idW5kZWZpbmVkIiYmIWpRdWVyeS5ldmVudC50cmlnZ2VyZWQpcmV0
dXJuIGpRdWVyeS5ldmVudC5oYW5kbGUuYXBwbHkoYXJndW1lbnRzLmNhbGxlZS5lbGVtLGFyZ3Vt
ZW50cyk7fSk7aGFuZGxlLmVsZW09ZWxlbTtqUXVlcnkuZWFjaCh0eXBlcy5zcGxpdCgvXHMrLyks
ZnVuY3Rpb24oaW5kZXgsdHlwZSl7dmFyIHBhcnRzPXR5cGUuc3BsaXQoIi4iKTt0eXBlPXBhcnRz
WzBdO2hhbmRsZXIudHlwZT1wYXJ0c1sxXTt2YXIgaGFuZGxlcnM9ZXZlbnRzW3R5cGVdO2lmKCFo
YW5kbGVycyl7aGFuZGxlcnM9ZXZlbnRzW3R5cGVdPXt9O2lmKCFqUXVlcnkuZXZlbnQuc3BlY2lh
bFt0eXBlXXx8alF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV0uc2V0dXAuY2FsbChlbGVtKT09PWZh
bHNlKXtpZihlbGVtLmFkZEV2ZW50TGlzdGVuZXIpZWxlbS5hZGRFdmVudExpc3RlbmVyKHR5cGUs
aGFuZGxlLGZhbHNlKTtlbHNlIGlmKGVsZW0uYXR0YWNoRXZlbnQpZWxlbS5hdHRhY2hFdmVudCgi
b24iK3R5cGUsaGFuZGxlKTt9fWhhbmRsZXJzW2hhbmRsZXIuZ3VpZF09aGFuZGxlcjtqUXVlcnku
ZXZlbnQuZ2xvYmFsW3R5cGVdPXRydWU7fSk7ZWxlbT1udWxsO30sZ3VpZDoxLGdsb2JhbDp7fSxy
ZW1vdmU6ZnVuY3Rpb24oZWxlbSx0eXBlcyxoYW5kbGVyKXtpZihlbGVtLm5vZGVUeXBlPT0zfHxl
bGVtLm5vZGVUeXBlPT04KXJldHVybjt2YXIgZXZlbnRzPWpRdWVyeS5kYXRhKGVsZW0sImV2ZW50
cyIpLHJldCxpbmRleDtpZihldmVudHMpe2lmKHR5cGVzPT11bmRlZmluZWR8fCh0eXBlb2YgdHlw
ZXM9PSJzdHJpbmciJiZ0eXBlcy5jaGFyQXQoMCk9PSIuIikpZm9yKHZhciB0eXBlIGluIGV2ZW50
cyl0aGlzLnJlbW92ZShlbGVtLHR5cGUrKHR5cGVzfHwiIikpO2Vsc2V7aWYodHlwZXMudHlwZSl7
aGFuZGxlcj10eXBlcy5oYW5kbGVyO3R5cGVzPXR5cGVzLnR5cGU7fWpRdWVyeS5lYWNoKHR5cGVz
LnNwbGl0KC9ccysvKSxmdW5jdGlvbihpbmRleCx0eXBlKXt2YXIgcGFydHM9dHlwZS5zcGxpdCgi
LiIpO3R5cGU9cGFydHNbMF07aWYoZXZlbnRzW3R5cGVdKXtpZihoYW5kbGVyKWRlbGV0ZSBldmVu
dHNbdHlwZV1baGFuZGxlci5ndWlkXTtlbHNlCitmb3IoaGFuZGxlciBpbiBldmVudHNbdHlwZV0p
aWYoIXBhcnRzWzFdfHxldmVudHNbdHlwZV1baGFuZGxlcl0udHlwZT09cGFydHNbMV0pZGVsZXRl
IGV2ZW50c1t0eXBlXVtoYW5kbGVyXTtmb3IocmV0IGluIGV2ZW50c1t0eXBlXSlicmVhaztpZigh
cmV0KXtpZighalF1ZXJ5LmV2ZW50LnNwZWNpYWxbdHlwZV18fGpRdWVyeS5ldmVudC5zcGVjaWFs
W3R5cGVdLnRlYXJkb3duLmNhbGwoZWxlbSk9PT1mYWxzZSl7aWYoZWxlbS5yZW1vdmVFdmVudExp
c3RlbmVyKWVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlLGpRdWVyeS5kYXRhKGVsZW0sImhh
bmRsZSIpLGZhbHNlKTtlbHNlIGlmKGVsZW0uZGV0YWNoRXZlbnQpZWxlbS5kZXRhY2hFdmVudCgi
b24iK3R5cGUsalF1ZXJ5LmRhdGEoZWxlbSwiaGFuZGxlIikpO31yZXQ9bnVsbDtkZWxldGUgZXZl
bnRzW3R5cGVdO319fSk7fWZvcihyZXQgaW4gZXZlbnRzKWJyZWFrO2lmKCFyZXQpe3ZhciBoYW5k
bGU9alF1ZXJ5LmRhdGEoZWxlbSwiaGFuZGxlIik7aWYoaGFuZGxlKWhhbmRsZS5lbGVtPW51bGw7
alF1ZXJ5LnJlbW92ZURhdGEoZWxlbSwiZXZlbnRzIik7alF1ZXJ5LnJlbW92ZURhdGEoZWxlbSwi
aGFuZGxlIik7fX19LHRyaWdnZXI6ZnVuY3Rpb24odHlwZSxkYXRhLGVsZW0sZG9uYXRpdmUsZXh0
cmEpe2RhdGE9alF1ZXJ5Lm1ha2VBcnJheShkYXRhKTtpZih0eXBlLmluZGV4T2YoIiEiKT49MCl7
dHlwZT10eXBlLnNsaWNlKDAsLTEpO3ZhciBleGNsdXNpdmU9dHJ1ZTt9aWYoIWVsZW0pe2lmKHRo
aXMuZ2xvYmFsW3R5cGVdKWpRdWVyeSgiKiIpLmFkZChbd2luZG93LGRvY3VtZW50XSkudHJpZ2dl
cih0eXBlLGRhdGEpO31lbHNle2lmKGVsZW0ubm9kZVR5cGU9PTN8fGVsZW0ubm9kZVR5cGU9PTgp
cmV0dXJuIHVuZGVmaW5lZDt2YXIgdmFsLHJldCxmbj1qUXVlcnkuaXNGdW5jdGlvbihlbGVtW3R5
cGVdfHxudWxsKSxldmVudD0hZGF0YVswXXx8IWRhdGFbMF0ucHJldmVudERlZmF1bHQ7aWYoZXZl
bnQpe2RhdGEudW5zaGlmdCh7dHlwZTp0eXBlLHRhcmdldDplbGVtLHByZXZlbnREZWZhdWx0OmZ1
bmN0aW9uKCl7fSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt9LHRpbWVTdGFtcDpub3coKX0p
O2RhdGFbMF1bZXhwYW5kb109dHJ1ZTt9ZGF0YVswXS50eXBlPXR5cGU7aWYoZXhjbHVzaXZlKWRh
dGFbMF0uZXhjbHVzaXZlPXRydWU7dmFyIGhhbmRsZT1qUXVlcnkuZGF0YShlbGVtLCJoYW5kbGUi
KTtpZihoYW5kbGUpdmFsPWhhbmRsZS5hcHBseShlbGVtLGRhdGEpO2lmKCghZm58fChqUXVlcnku
bm9kZU5hbWUoZWxlbSwnYScpJiZ0eXBlPT0iY2xpY2siKSkmJmVsZW1bIm9uIit0eXBlXSYmZWxl
bVsib24iK3R5cGVdLmFwcGx5KGVsZW0sZGF0YSk9PT1mYWxzZSl2YWw9ZmFsc2U7aWYoZXZlbnQp
ZGF0YS5zaGlmdCgpO2lmKGV4dHJhJiZqUXVlcnkuaXNGdW5jdGlvbihleHRyYSkpe3JldD1leHRy
YS5hcHBseShlbGVtLHZhbD09bnVsbD9kYXRhOmRhdGEuY29uY2F0KHZhbCkpO2lmKHJldCE9PXVu
ZGVmaW5lZCl2YWw9cmV0O31pZihmbiYmZG9uYXRpdmUhPT1mYWxzZSYmdmFsIT09ZmFsc2UmJiEo
alF1ZXJ5Lm5vZGVOYW1lKGVsZW0sJ2EnKSYmdHlwZT09ImNsaWNrIikpe3RoaXMudHJpZ2dlcmVk
PXRydWU7dHJ5e2VsZW1bdHlwZV0oKTt9Y2F0Y2goZSl7fX10aGlzLnRyaWdnZXJlZD1mYWxzZTt9
cmV0dXJuIHZhbDt9LGhhbmRsZTpmdW5jdGlvbihldmVudCl7dmFyIHZhbCxyZXQsbmFtZXNwYWNl
LGFsbCxoYW5kbGVycztldmVudD1hcmd1bWVudHNbMF09alF1ZXJ5LmV2ZW50LmZpeChldmVudHx8
d2luZG93LmV2ZW50KTtuYW1lc3BhY2U9ZXZlbnQudHlwZS5zcGxpdCgiLiIpO2V2ZW50LnR5cGU9
bmFtZXNwYWNlWzBdO25hbWVzcGFjZT1uYW1lc3BhY2VbMV07YWxsPSFuYW1lc3BhY2UmJiFldmVu
dC5leGNsdXNpdmU7aGFuZGxlcnM9KGpRdWVyeS5kYXRhKHRoaXMsImV2ZW50cyIpfHx7fSlbZXZl
bnQudHlwZV07Zm9yKHZhciBqIGluIGhhbmRsZXJzKXt2YXIgaGFuZGxlcj1oYW5kbGVyc1tqXTtp
ZihhbGx8fGhhbmRsZXIudHlwZT09bmFtZXNwYWNlKXtldmVudC5oYW5kbGVyPWhhbmRsZXI7ZXZl
bnQuZGF0YT1oYW5kbGVyLmRhdGE7cmV0PWhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lm
KHZhbCE9PWZhbHNlKXZhbD1yZXQ7aWYocmV0PT09ZmFsc2Upe2V2ZW50LnByZXZlbnREZWZhdWx0
KCk7ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7fX19cmV0dXJuIHZhbDt9LGZpeDpmdW5jdGlvbihl
dmVudCl7aWYoZXZlbnRbZXhwYW5kb109PXRydWUpcmV0dXJuIGV2ZW50O3ZhciBvcmlnaW5hbEV2
ZW50PWV2ZW50O2V2ZW50PXtvcmlnaW5hbEV2ZW50Om9yaWdpbmFsRXZlbnR9O3ZhciBwcm9wcz0i
YWx0S2V5IGF0dHJDaGFuZ2UgYXR0ck5hbWUgYnViYmxlcyBidXR0b24gY2FuY2VsYWJsZSBjaGFy
Q29kZSBjbGllbnRYIGNsaWVudFkgY3RybEtleSBjdXJyZW50VGFyZ2V0IGRhdGEgZGV0YWlsIGV2
ZW50UGhhc2UgZnJvbUVsZW1lbnQgaGFuZGxlciBrZXlDb2RlIG1ldGFLZXkgbmV3VmFsdWUgb3Jp
Z2luYWxUYXJnZXQgcGFnZVggcGFnZVkgcHJldlZhbHVlIHJlbGF0ZWROb2RlIHJlbGF0ZWRUYXJn
ZXQgc2NyZWVuWCBzY3JlZW5ZIHNoaWZ0S2V5IHNyY0VsZW1lbnQgdGFyZ2V0IHRpbWVTdGFtcCB0
b0VsZW1lbnQgdHlwZSB2aWV3IHdoZWVsRGVsdGEgd2hpY2giLnNwbGl0KCIgIik7Zm9yKHZhciBp
PXByb3BzLmxlbmd0aDtpO2ktLSlldmVudFtwcm9wc1tpXV09b3JpZ2luYWxFdmVudFtwcm9wc1tp
XV07ZXZlbnRbZXhwYW5kb109dHJ1ZTtldmVudC5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbigpe2lm
KG9yaWdpbmFsRXZlbnQucHJldmVudERlZmF1bHQpb3JpZ2luYWxFdmVudC5wcmV2ZW50RGVmYXVs
dCgpO29yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9ZmFsc2U7fTtldmVudC5zdG9wUHJvcGFnYXRp
b249ZnVuY3Rpb24oKXtpZihvcmlnaW5hbEV2ZW50LnN0b3BQcm9wYWdhdGlvbilvcmlnaW5hbEV2
ZW50LnN0b3BQcm9wYWdhdGlvbigpO29yaWdpbmFsRXZlbnQuY2FuY2VsQnViYmxlPXRydWU7fTtl
dmVudC50aW1lU3RhbXA9ZXZlbnQudGltZVN0YW1wfHxub3coKTtpZighZXZlbnQudGFyZ2V0KWV2
ZW50LnRhcmdldD1ldmVudC5zcmNFbGVtZW50fHxkb2N1bWVudDtpZihldmVudC50YXJnZXQubm9k
ZVR5cGU9PTMpZXZlbnQudGFyZ2V0PWV2ZW50LnRhcmdldC5wYXJlbnROb2RlO2lmKCFldmVudC5y
ZWxhdGVkVGFyZ2V0JiZldmVudC5mcm9tRWxlbWVudClldmVudC5yZWxhdGVkVGFyZ2V0PWV2ZW50
LmZyb21FbGVtZW50PT1ldmVudC50YXJnZXQ/ZXZlbnQudG9FbGVtZW50OmV2ZW50LmZyb21FbGVt
ZW50O2lmKGV2ZW50LnBhZ2VYPT1udWxsJiZldmVudC5jbGllbnRYIT1udWxsKXt2YXIgZG9jPWRv
Y3VtZW50LmRvY3VtZW50RWxlbWVudCxib2R5PWRvY3VtZW50LmJvZHk7ZXZlbnQucGFnZVg9ZXZl
bnQuY2xpZW50WCsoZG9jJiZkb2Muc2Nyb2xsTGVmdHx8Ym9keSYmYm9keS5zY3JvbGxMZWZ0fHww
KS0oZG9jLmNsaWVudExlZnR8fDApO2V2ZW50LnBhZ2VZPWV2ZW50LmNsaWVudFkrKGRvYyYmZG9j
LnNjcm9sbFRvcHx8Ym9keSYmYm9keS5zY3JvbGxUb3B8fDApLShkb2MuY2xpZW50VG9wfHwwKTt9
aWYoIWV2ZW50LndoaWNoJiYoKGV2ZW50LmNoYXJDb2RlfHxldmVudC5jaGFyQ29kZT09PTApP2V2
ZW50LmNoYXJDb2RlOmV2ZW50LmtleUNvZGUpKWV2ZW50LndoaWNoPWV2ZW50LmNoYXJDb2RlfHxl
dmVudC5rZXlDb2RlO2lmKCFldmVudC5tZXRhS2V5JiZldmVudC5jdHJsS2V5KWV2ZW50Lm1ldGFL
ZXk9ZXZlbnQuY3RybEtleTtpZighZXZlbnQud2hpY2gmJmV2ZW50LmJ1dHRvbilldmVudC53aGlj
aD0oZXZlbnQuYnV0dG9uJjE/MTooZXZlbnQuYnV0dG9uJjI/MzooZXZlbnQuYnV0dG9uJjQ/Mjow
KSkpO3JldHVybiBldmVudDt9LHByb3h5OmZ1bmN0aW9uKGZuLHByb3h5KXtwcm94eS5ndWlkPWZu
Lmd1aWQ9Zm4uZ3VpZHx8cHJveHkuZ3VpZHx8dGhpcy5ndWlkKys7cmV0dXJuIHByb3h5O30sc3Bl
Y2lhbDp7cmVhZHk6e3NldHVwOmZ1bmN0aW9uKCl7YmluZFJlYWR5KCk7cmV0dXJuO30sdGVhcmRv
d246ZnVuY3Rpb24oKXtyZXR1cm47fX0sbW91c2VlbnRlcjp7c2V0dXA6ZnVuY3Rpb24oKXtpZihq
UXVlcnkuYnJvd3Nlci5tc2llKXJldHVybiBmYWxzZTtqUXVlcnkodGhpcykuYmluZCgibW91c2Vv
dmVyIixqUXVlcnkuZXZlbnQuc3BlY2lhbC5tb3VzZWVudGVyLmhhbmRsZXIpO3JldHVybiB0cnVl
O30sdGVhcmRvd246ZnVuY3Rpb24oKXtpZihqUXVlcnkuYnJvd3Nlci5tc2llKXJldHVybiBmYWxz
ZTtqUXVlcnkodGhpcykudW5iaW5kKCJtb3VzZW92ZXIiLGpRdWVyeS5ldmVudC5zcGVjaWFsLm1v
dXNlZW50ZXIuaGFuZGxlcik7cmV0dXJuIHRydWU7fSxoYW5kbGVyOmZ1bmN0aW9uKGV2ZW50KXtp
Zih3aXRoaW5FbGVtZW50KGV2ZW50LHRoaXMpKXJldHVybiB0cnVlO2V2ZW50LnR5cGU9Im1vdXNl
ZW50ZXIiO3JldHVybiBqUXVlcnkuZXZlbnQuaGFuZGxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9
fSxtb3VzZWxlYXZlOntzZXR1cDpmdW5jdGlvbigpe2lmKGpRdWVyeS5icm93c2VyLm1zaWUpcmV0
dXJuIGZhbHNlO2pRdWVyeSh0aGlzKS5iaW5kKCJtb3VzZW91dCIsalF1ZXJ5LmV2ZW50LnNwZWNp
YWwubW91c2VsZWF2ZS5oYW5kbGVyKTtyZXR1cm4gdHJ1ZTt9LHRlYXJkb3duOmZ1bmN0aW9uKCl7
aWYoalF1ZXJ5LmJyb3dzZXIubXNpZSlyZXR1cm4gZmFsc2U7alF1ZXJ5KHRoaXMpLnVuYmluZCgi
bW91c2VvdXQiLGpRdWVyeS5ldmVudC5zcGVjaWFsLm1vdXNlbGVhdmUuaGFuZGxlcik7cmV0dXJu
IHRydWU7fSxoYW5kbGVyOmZ1bmN0aW9uKGV2ZW50KXtpZih3aXRoaW5FbGVtZW50KGV2ZW50LHRo
aXMpKXJldHVybiB0cnVlO2V2ZW50LnR5cGU9Im1vdXNlbGVhdmUiO3JldHVybiBqUXVlcnkuZXZl
bnQuaGFuZGxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt9fX19O2pRdWVyeS5mbi5leHRlbmQoe2Jp
bmQ6ZnVuY3Rpb24odHlwZSxkYXRhLGZuKXtyZXR1cm4gdHlwZT09InVubG9hZCI/dGhpcy5vbmUo
dHlwZSxkYXRhLGZuKTp0aGlzLmVhY2goZnVuY3Rpb24oKXtqUXVlcnkuZXZlbnQuYWRkKHRoaXMs
dHlwZSxmbnx8ZGF0YSxmbiYmZGF0YSk7fSk7fSxvbmU6ZnVuY3Rpb24odHlwZSxkYXRhLGZuKXt2
YXIgb25lPWpRdWVyeS5ldmVudC5wcm94eShmbnx8ZGF0YSxmdW5jdGlvbihldmVudCl7alF1ZXJ5
KHRoaXMpLnVuYmluZChldmVudCxvbmUpO3JldHVybihmbnx8ZGF0YSkuYXBwbHkodGhpcyxhcmd1
bWVudHMpO30pO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtqUXVlcnkuZXZlbnQuYWRkKHRo
aXMsdHlwZSxvbmUsZm4mJmRhdGEpO30pO30sdW5iaW5kOmZ1bmN0aW9uKHR5cGUsZm4pe3JldHVy
biB0aGlzLmVhY2goZnVuY3Rpb24oKXtqUXVlcnkuZXZlbnQucmVtb3ZlKHRoaXMsdHlwZSxmbik7
fSk7fSx0cmlnZ2VyOmZ1bmN0aW9uKHR5cGUsZGF0YSxmbil7cmV0dXJuIHRoaXMuZWFjaChmdW5j
dGlvbigpe2pRdWVyeS5ldmVudC50cmlnZ2VyKHR5cGUsZGF0YSx0aGlzLHRydWUsZm4pO30pO30s
dHJpZ2dlckhhbmRsZXI6ZnVuY3Rpb24odHlwZSxkYXRhLGZuKXtyZXR1cm4gdGhpc1swXSYmalF1
ZXJ5LmV2ZW50LnRyaWdnZXIodHlwZSxkYXRhLHRoaXNbMF0sZmFsc2UsZm4pO30sdG9nZ2xlOmZ1
bmN0aW9uKGZuKXt2YXIgYXJncz1hcmd1bWVudHMsaT0xO3doaWxlKGk8YXJncy5sZW5ndGgpalF1
ZXJ5LmV2ZW50LnByb3h5KGZuLGFyZ3NbaSsrXSk7cmV0dXJuIHRoaXMuY2xpY2soalF1ZXJ5LmV2
ZW50LnByb3h5KGZuLGZ1bmN0aW9uKGV2ZW50KXt0aGlzLmxhc3RUb2dnbGU9KHRoaXMubGFzdFRv
Z2dsZXx8MCklaTtldmVudC5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBhcmdzW3RoaXMubGFzdFRv
Z2dsZSsrXS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fGZhbHNlO30pKTt9LGhvdmVyOmZ1bmN0aW9u
KGZuT3Zlcixmbk91dCl7cmV0dXJuIHRoaXMuYmluZCgnbW91c2VlbnRlcicsZm5PdmVyKS5iaW5k
KCdtb3VzZWxlYXZlJyxmbk91dCk7fSxyZWFkeTpmdW5jdGlvbihmbil7YmluZFJlYWR5KCk7aWYo
alF1ZXJ5LmlzUmVhZHkpZm4uY2FsbChkb2N1bWVudCxqUXVlcnkpO2Vsc2UKK2pRdWVyeS5yZWFk
eUxpc3QucHVzaChmdW5jdGlvbigpe3JldHVybiBmbi5jYWxsKHRoaXMsalF1ZXJ5KTt9KTtyZXR1
cm4gdGhpczt9fSk7alF1ZXJ5LmV4dGVuZCh7aXNSZWFkeTpmYWxzZSxyZWFkeUxpc3Q6W10scmVh
ZHk6ZnVuY3Rpb24oKXtpZighalF1ZXJ5LmlzUmVhZHkpe2pRdWVyeS5pc1JlYWR5PXRydWU7aWYo
alF1ZXJ5LnJlYWR5TGlzdCl7alF1ZXJ5LmVhY2goalF1ZXJ5LnJlYWR5TGlzdCxmdW5jdGlvbigp
e3RoaXMuY2FsbChkb2N1bWVudCk7fSk7alF1ZXJ5LnJlYWR5TGlzdD1udWxsO31qUXVlcnkoZG9j
dW1lbnQpLnRyaWdnZXJIYW5kbGVyKCJyZWFkeSIpO319fSk7dmFyIHJlYWR5Qm91bmQ9ZmFsc2U7
ZnVuY3Rpb24gYmluZFJlYWR5KCl7aWYocmVhZHlCb3VuZClyZXR1cm47cmVhZHlCb3VuZD10cnVl
O2lmKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXImJiFqUXVlcnkuYnJvd3Nlci5vcGVyYSlkb2N1
bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixqUXVlcnkucmVhZHksZmFs
c2UpO2lmKGpRdWVyeS5icm93c2VyLm1zaWUmJndpbmRvdz09dG9wKShmdW5jdGlvbigpe2lmKGpR
dWVyeS5pc1JlYWR5KXJldHVybjt0cnl7ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRvU2Nyb2xs
KCJsZWZ0Iik7fWNhdGNoKGVycm9yKXtzZXRUaW1lb3V0KGFyZ3VtZW50cy5jYWxsZWUsMCk7cmV0
dXJuO31qUXVlcnkucmVhZHkoKTt9KSgpO2lmKGpRdWVyeS5icm93c2VyLm9wZXJhKWRvY3VtZW50
LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLGZ1bmN0aW9uKCl7aWYoalF1ZXJ5
LmlzUmVhZHkpcmV0dXJuO2Zvcih2YXIgaT0wO2k8ZG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3Ro
O2krKylpZihkb2N1bWVudC5zdHlsZVNoZWV0c1tpXS5kaXNhYmxlZCl7c2V0VGltZW91dChhcmd1
bWVudHMuY2FsbGVlLDApO3JldHVybjt9alF1ZXJ5LnJlYWR5KCk7fSxmYWxzZSk7aWYoalF1ZXJ5
LmJyb3dzZXIuc2FmYXJpKXt2YXIgbnVtU3R5bGVzOyhmdW5jdGlvbigpe2lmKGpRdWVyeS5pc1Jl
YWR5KXJldHVybjtpZihkb2N1bWVudC5yZWFkeVN0YXRlIT0ibG9hZGVkIiYmZG9jdW1lbnQucmVh
ZHlTdGF0ZSE9ImNvbXBsZXRlIil7c2V0VGltZW91dChhcmd1bWVudHMuY2FsbGVlLDApO3JldHVy
bjt9aWYobnVtU3R5bGVzPT09dW5kZWZpbmVkKW51bVN0eWxlcz1qUXVlcnkoInN0eWxlLCBsaW5r
W3JlbD1zdHlsZXNoZWV0XSIpLmxlbmd0aDtpZihkb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGgh
PW51bVN0eWxlcyl7c2V0VGltZW91dChhcmd1bWVudHMuY2FsbGVlLDApO3JldHVybjt9alF1ZXJ5
LnJlYWR5KCk7fSkoKTt9alF1ZXJ5LmV2ZW50LmFkZCh3aW5kb3csImxvYWQiLGpRdWVyeS5yZWFk
eSk7fWpRdWVyeS5lYWNoKCgiYmx1cixmb2N1cyxsb2FkLHJlc2l6ZSxzY3JvbGwsdW5sb2FkLGNs
aWNrLGRibGNsaWNrLCIrIm1vdXNlZG93bixtb3VzZXVwLG1vdXNlbW92ZSxtb3VzZW92ZXIsbW91
c2VvdXQsY2hhbmdlLHNlbGVjdCwiKyJzdWJtaXQsa2V5ZG93bixrZXlwcmVzcyxrZXl1cCxlcnJv
ciIpLnNwbGl0KCIsIiksZnVuY3Rpb24oaSxuYW1lKXtqUXVlcnkuZm5bbmFtZV09ZnVuY3Rpb24o
Zm4pe3JldHVybiBmbj90aGlzLmJpbmQobmFtZSxmbik6dGhpcy50cmlnZ2VyKG5hbWUpO307fSk7
dmFyIHdpdGhpbkVsZW1lbnQ9ZnVuY3Rpb24oZXZlbnQsZWxlbSl7dmFyIHBhcmVudD1ldmVudC5y
ZWxhdGVkVGFyZ2V0O3doaWxlKHBhcmVudCYmcGFyZW50IT1lbGVtKXRyeXtwYXJlbnQ9cGFyZW50
LnBhcmVudE5vZGU7fWNhdGNoKGVycm9yKXtwYXJlbnQ9ZWxlbTt9cmV0dXJuIHBhcmVudD09ZWxl
bTt9O2pRdWVyeSh3aW5kb3cpLmJpbmQoInVubG9hZCIsZnVuY3Rpb24oKXtqUXVlcnkoIioiKS5h
ZGQoZG9jdW1lbnQpLnVuYmluZCgpO30pO2pRdWVyeS5mbi5leHRlbmQoe19sb2FkOmpRdWVyeS5m
bi5sb2FkLGxvYWQ6ZnVuY3Rpb24odXJsLHBhcmFtcyxjYWxsYmFjayl7aWYodHlwZW9mIHVybCE9
J3N0cmluZycpcmV0dXJuIHRoaXMuX2xvYWQodXJsKTt2YXIgb2ZmPXVybC5pbmRleE9mKCIgIik7
aWYob2ZmPj0wKXt2YXIgc2VsZWN0b3I9dXJsLnNsaWNlKG9mZix1cmwubGVuZ3RoKTt1cmw9dXJs
LnNsaWNlKDAsb2ZmKTt9Y2FsbGJhY2s9Y2FsbGJhY2t8fGZ1bmN0aW9uKCl7fTt2YXIgdHlwZT0i
R0VUIjtpZihwYXJhbXMpaWYoalF1ZXJ5LmlzRnVuY3Rpb24ocGFyYW1zKSl7Y2FsbGJhY2s9cGFy
YW1zO3BhcmFtcz1udWxsO31lbHNle3BhcmFtcz1qUXVlcnkucGFyYW0ocGFyYW1zKTt0eXBlPSJQ
T1NUIjt9dmFyIHNlbGY9dGhpcztqUXVlcnkuYWpheCh7dXJsOnVybCx0eXBlOnR5cGUsZGF0YVR5
cGU6Imh0bWwiLGRhdGE6cGFyYW1zLGNvbXBsZXRlOmZ1bmN0aW9uKHJlcyxzdGF0dXMpe2lmKHN0
YXR1cz09InN1Y2Nlc3MifHxzdGF0dXM9PSJub3Rtb2RpZmllZCIpc2VsZi5odG1sKHNlbGVjdG9y
P2pRdWVyeSgiPGRpdi8+IikuYXBwZW5kKHJlcy5yZXNwb25zZVRleHQucmVwbGFjZSgvPHNjcmlw
dCgufFxzKSo/XC9zY3JpcHQ+L2csIiIpKS5maW5kKHNlbGVjdG9yKTpyZXMucmVzcG9uc2VUZXh0
KTtzZWxmLmVhY2goY2FsbGJhY2ssW3Jlcy5yZXNwb25zZVRleHQsc3RhdHVzLHJlc10pO319KTty
ZXR1cm4gdGhpczt9LHNlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBqUXVlcnkucGFyYW0odGhp
cy5zZXJpYWxpemVBcnJheSgpKTt9LHNlcmlhbGl6ZUFycmF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRo
aXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIGpRdWVyeS5ub2RlTmFtZSh0aGlzLCJmb3JtIik/alF1
ZXJ5Lm1ha2VBcnJheSh0aGlzLmVsZW1lbnRzKTp0aGlzO30pLmZpbHRlcihmdW5jdGlvbigpe3Jl
dHVybiB0aGlzLm5hbWUmJiF0aGlzLmRpc2FibGVkJiYodGhpcy5jaGVja2VkfHwvc2VsZWN0fHRl
eHRhcmVhL2kudGVzdCh0aGlzLm5vZGVOYW1lKXx8L3RleHR8aGlkZGVufHBhc3N3b3JkL2kudGVz
dCh0aGlzLnR5cGUpKTt9KS5tYXAoZnVuY3Rpb24oaSxlbGVtKXt2YXIgdmFsPWpRdWVyeSh0aGlz
KS52YWwoKTtyZXR1cm4gdmFsPT1udWxsP251bGw6dmFsLmNvbnN0cnVjdG9yPT1BcnJheT9qUXVl
cnkubWFwKHZhbCxmdW5jdGlvbih2YWwsaSl7cmV0dXJue25hbWU6ZWxlbS5uYW1lLHZhbHVlOnZh
bH07fSk6e25hbWU6ZWxlbS5uYW1lLHZhbHVlOnZhbH07fSkuZ2V0KCk7fX0pO2pRdWVyeS5lYWNo
KCJhamF4U3RhcnQsYWpheFN0b3AsYWpheENvbXBsZXRlLGFqYXhFcnJvcixhamF4U3VjY2Vzcyxh
amF4U2VuZCIuc3BsaXQoIiwiKSxmdW5jdGlvbihpLG8pe2pRdWVyeS5mbltvXT1mdW5jdGlvbihm
KXtyZXR1cm4gdGhpcy5iaW5kKG8sZik7fTt9KTt2YXIganNjPW5vdygpO2pRdWVyeS5leHRlbmQo
e2dldDpmdW5jdGlvbih1cmwsZGF0YSxjYWxsYmFjayx0eXBlKXtpZihqUXVlcnkuaXNGdW5jdGlv
bihkYXRhKSl7Y2FsbGJhY2s9ZGF0YTtkYXRhPW51bGw7fXJldHVybiBqUXVlcnkuYWpheCh7dHlw
ZToiR0VUIix1cmw6dXJsLGRhdGE6ZGF0YSxzdWNjZXNzOmNhbGxiYWNrLGRhdGFUeXBlOnR5cGV9
KTt9LGdldFNjcmlwdDpmdW5jdGlvbih1cmwsY2FsbGJhY2spe3JldHVybiBqUXVlcnkuZ2V0KHVy
bCxudWxsLGNhbGxiYWNrLCJzY3JpcHQiKTt9LGdldEpTT046ZnVuY3Rpb24odXJsLGRhdGEsY2Fs
bGJhY2spe3JldHVybiBqUXVlcnkuZ2V0KHVybCxkYXRhLGNhbGxiYWNrLCJqc29uIik7fSxwb3N0
OmZ1bmN0aW9uKHVybCxkYXRhLGNhbGxiYWNrLHR5cGUpe2lmKGpRdWVyeS5pc0Z1bmN0aW9uKGRh
dGEpKXtjYWxsYmFjaz1kYXRhO2RhdGE9e307fXJldHVybiBqUXVlcnkuYWpheCh7dHlwZToiUE9T
VCIsdXJsOnVybCxkYXRhOmRhdGEsc3VjY2VzczpjYWxsYmFjayxkYXRhVHlwZTp0eXBlfSk7fSxh
amF4U2V0dXA6ZnVuY3Rpb24oc2V0dGluZ3Mpe2pRdWVyeS5leHRlbmQoalF1ZXJ5LmFqYXhTZXR0
aW5ncyxzZXR0aW5ncyk7fSxhamF4U2V0dGluZ3M6e3VybDpsb2NhdGlvbi5ocmVmLGdsb2JhbDp0
cnVlLHR5cGU6IkdFVCIsdGltZW91dDowLGNvbnRlbnRUeXBlOiJhcHBsaWNhdGlvbi94LXd3dy1m
b3JtLXVybGVuY29kZWQiLHByb2Nlc3NEYXRhOnRydWUsYXN5bmM6dHJ1ZSxkYXRhOm51bGwsdXNl
cm5hbWU6bnVsbCxwYXNzd29yZDpudWxsLGFjY2VwdHM6e3htbDoiYXBwbGljYXRpb24veG1sLCB0
ZXh0L3htbCIsaHRtbDoidGV4dC9odG1sIixzY3JpcHQ6InRleHQvamF2YXNjcmlwdCwgYXBwbGlj
YXRpb24vamF2YXNjcmlwdCIsanNvbjoiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0
Iix0ZXh0OiJ0ZXh0L3BsYWluIixfZGVmYXVsdDoiKi8qIn19LGxhc3RNb2RpZmllZDp7fSxhamF4
OmZ1bmN0aW9uKHMpe3M9alF1ZXJ5LmV4dGVuZCh0cnVlLHMsalF1ZXJ5LmV4dGVuZCh0cnVlLHt9
LGpRdWVyeS5hamF4U2V0dGluZ3MscykpO3ZhciBqc29ucCxqc3JlPS89XD8oJnwkKS9nLHN0YXR1
cyxkYXRhLHR5cGU9cy50eXBlLnRvVXBwZXJDYXNlKCk7aWYocy5kYXRhJiZzLnByb2Nlc3NEYXRh
JiZ0eXBlb2Ygcy5kYXRhIT0ic3RyaW5nIilzLmRhdGE9alF1ZXJ5LnBhcmFtKHMuZGF0YSk7aWYo
cy5kYXRhVHlwZT09Impzb25wIil7aWYodHlwZT09IkdFVCIpe2lmKCFzLnVybC5tYXRjaChqc3Jl
KSlzLnVybCs9KHMudXJsLm1hdGNoKC9cPy8pPyImIjoiPyIpKyhzLmpzb25wfHwiY2FsbGJhY2si
KSsiPT8iO31lbHNlIGlmKCFzLmRhdGF8fCFzLmRhdGEubWF0Y2goanNyZSkpcy5kYXRhPShzLmRh
dGE/cy5kYXRhKyImIjoiIikrKHMuanNvbnB8fCJjYWxsYmFjayIpKyI9PyI7cy5kYXRhVHlwZT0i
anNvbiI7fWlmKHMuZGF0YVR5cGU9PSJqc29uIiYmKHMuZGF0YSYmcy5kYXRhLm1hdGNoKGpzcmUp
fHxzLnVybC5tYXRjaChqc3JlKSkpe2pzb25wPSJqc29ucCIranNjKys7aWYocy5kYXRhKXMuZGF0
YT0ocy5kYXRhKyIiKS5yZXBsYWNlKGpzcmUsIj0iK2pzb25wKyIkMSIpO3MudXJsPXMudXJsLnJl
cGxhY2UoanNyZSwiPSIranNvbnArIiQxIik7cy5kYXRhVHlwZT0ic2NyaXB0Ijt3aW5kb3dbanNv
bnBdPWZ1bmN0aW9uKHRtcCl7ZGF0YT10bXA7c3VjY2VzcygpO2NvbXBsZXRlKCk7d2luZG93W2pz
b25wXT11bmRlZmluZWQ7dHJ5e2RlbGV0ZSB3aW5kb3dbanNvbnBdO31jYXRjaChlKXt9aWYoaGVh
ZCloZWFkLnJlbW92ZUNoaWxkKHNjcmlwdCk7fTt9aWYocy5kYXRhVHlwZT09InNjcmlwdCImJnMu
Y2FjaGU9PW51bGwpcy5jYWNoZT1mYWxzZTtpZihzLmNhY2hlPT09ZmFsc2UmJnR5cGU9PSJHRVQi
KXt2YXIgdHM9bm93KCk7dmFyIHJldD1zLnVybC5yZXBsYWNlKC8oXD98JilfPS4qPygmfCQpLywi
JDFfPSIrdHMrIiQyIik7cy51cmw9cmV0KygocmV0PT1zLnVybCk/KHMudXJsLm1hdGNoKC9cPy8p
PyImIjoiPyIpKyJfPSIrdHM6IiIpO31pZihzLmRhdGEmJnR5cGU9PSJHRVQiKXtzLnVybCs9KHMu
dXJsLm1hdGNoKC9cPy8pPyImIjoiPyIpK3MuZGF0YTtzLmRhdGE9bnVsbDt9aWYocy5nbG9iYWwm
JiFqUXVlcnkuYWN0aXZlKyspalF1ZXJ5LmV2ZW50LnRyaWdnZXIoImFqYXhTdGFydCIpO3ZhciBy
ZW1vdGU9L14oPzpcdys6KT9cL1wvKFteXC8/I10rKS87aWYocy5kYXRhVHlwZT09InNjcmlwdCIm
JnR5cGU9PSJHRVQiJiZyZW1vdGUudGVzdChzLnVybCkmJnJlbW90ZS5leGVjKHMudXJsKVsxXSE9
bG9jYXRpb24uaG9zdCl7dmFyIGhlYWQ9ZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhl
YWQiKVswXTt2YXIgc2NyaXB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3Njcmlw
dC5zcmM9cy51cmw7aWYocy5zY3JpcHRDaGFyc2V0KXNjcmlwdC5jaGFyc2V0PXMuc2NyaXB0Q2hh
cnNldDtpZighanNvbnApe3ZhciBkb25lPWZhbHNlO3NjcmlwdC5vbmxvYWQ9c2NyaXB0Lm9ucmVh
ZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2lmKCFkb25lJiYoIXRoaXMucmVhZHlTdGF0ZXx8dGhp
cy5yZWFkeVN0YXRlPT0ibG9hZGVkInx8dGhpcy5yZWFkeVN0YXRlPT0iY29tcGxldGUiKSl7ZG9u
ZT10cnVlO3N1Y2Nlc3MoKTtjb21wbGV0ZSgpO2hlYWQucmVtb3ZlQ2hpbGQoc2NyaXB0KTt9fTt9
aGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO3JldHVybiB1bmRlZmluZWQ7fXZhciByZXF1ZXN0RG9u
ZT1mYWxzZTt2YXIgeGhyPXdpbmRvdy5BY3RpdmVYT2JqZWN0P25ldyBBY3RpdmVYT2JqZWN0KCJN
aWNyb3NvZnQuWE1MSFRUUCIpOm5ldyBYTUxIdHRwUmVxdWVzdCgpO2lmKHMudXNlcm5hbWUpeGhy
Lm9wZW4odHlwZSxzLnVybCxzLmFzeW5jLHMudXNlcm5hbWUscy5wYXNzd29yZCk7ZWxzZQoreGhy
Lm9wZW4odHlwZSxzLnVybCxzLmFzeW5jKTt0cnl7aWYocy5kYXRhKXhoci5zZXRSZXF1ZXN0SGVh
ZGVyKCJDb250ZW50LVR5cGUiLHMuY29udGVudFR5cGUpO2lmKHMuaWZNb2RpZmllZCl4aHIuc2V0
UmVxdWVzdEhlYWRlcigiSWYtTW9kaWZpZWQtU2luY2UiLGpRdWVyeS5sYXN0TW9kaWZpZWRbcy51
cmxdfHwiVGh1LCAwMSBKYW4gMTk3MCAwMDowMDowMCBHTVQiKTt4aHIuc2V0UmVxdWVzdEhlYWRl
cigiWC1SZXF1ZXN0ZWQtV2l0aCIsIlhNTEh0dHBSZXF1ZXN0Iik7eGhyLnNldFJlcXVlc3RIZWFk
ZXIoIkFjY2VwdCIscy5kYXRhVHlwZSYmcy5hY2NlcHRzW3MuZGF0YVR5cGVdP3MuYWNjZXB0c1tz
LmRhdGFUeXBlXSsiLCAqLyoiOnMuYWNjZXB0cy5fZGVmYXVsdCk7fWNhdGNoKGUpe31pZihzLmJl
Zm9yZVNlbmQmJnMuYmVmb3JlU2VuZCh4aHIscyk9PT1mYWxzZSl7cy5nbG9iYWwmJmpRdWVyeS5h
Y3RpdmUtLTt4aHIuYWJvcnQoKTtyZXR1cm4gZmFsc2U7fWlmKHMuZ2xvYmFsKWpRdWVyeS5ldmVu
dC50cmlnZ2VyKCJhamF4U2VuZCIsW3hocixzXSk7dmFyIG9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5j
dGlvbihpc1RpbWVvdXQpe2lmKCFyZXF1ZXN0RG9uZSYmeGhyJiYoeGhyLnJlYWR5U3RhdGU9PTR8
fGlzVGltZW91dD09InRpbWVvdXQiKSl7cmVxdWVzdERvbmU9dHJ1ZTtpZihpdmFsKXtjbGVhcklu
dGVydmFsKGl2YWwpO2l2YWw9bnVsbDt9c3RhdHVzPWlzVGltZW91dD09InRpbWVvdXQiJiYidGlt
ZW91dCJ8fCFqUXVlcnkuaHR0cFN1Y2Nlc3MoeGhyKSYmImVycm9yInx8cy5pZk1vZGlmaWVkJiZq
UXVlcnkuaHR0cE5vdE1vZGlmaWVkKHhocixzLnVybCkmJiJub3Rtb2RpZmllZCJ8fCJzdWNjZXNz
IjtpZihzdGF0dXM9PSJzdWNjZXNzIil7dHJ5e2RhdGE9alF1ZXJ5Lmh0dHBEYXRhKHhocixzLmRh
dGFUeXBlLHMuZGF0YUZpbHRlcik7fWNhdGNoKGUpe3N0YXR1cz0icGFyc2VyZXJyb3IiO319aWYo
c3RhdHVzPT0ic3VjY2VzcyIpe3ZhciBtb2RSZXM7dHJ5e21vZFJlcz14aHIuZ2V0UmVzcG9uc2VI
ZWFkZXIoIkxhc3QtTW9kaWZpZWQiKTt9Y2F0Y2goZSl7fWlmKHMuaWZNb2RpZmllZCYmbW9kUmVz
KWpRdWVyeS5sYXN0TW9kaWZpZWRbcy51cmxdPW1vZFJlcztpZighanNvbnApc3VjY2VzcygpO31l
bHNlCitqUXVlcnkuaGFuZGxlRXJyb3Iocyx4aHIsc3RhdHVzKTtjb21wbGV0ZSgpO2lmKHMuYXN5
bmMpeGhyPW51bGw7fX07aWYocy5hc3luYyl7dmFyIGl2YWw9c2V0SW50ZXJ2YWwob25yZWFkeXN0
YXRlY2hhbmdlLDEzKTtpZihzLnRpbWVvdXQ+MClzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aWYoeGhy
KXt4aHIuYWJvcnQoKTtpZighcmVxdWVzdERvbmUpb25yZWFkeXN0YXRlY2hhbmdlKCJ0aW1lb3V0
Iik7fX0scy50aW1lb3V0KTt9dHJ5e3hoci5zZW5kKHMuZGF0YSk7fWNhdGNoKGUpe2pRdWVyeS5o
YW5kbGVFcnJvcihzLHhocixudWxsLGUpO31pZighcy5hc3luYylvbnJlYWR5c3RhdGVjaGFuZ2Uo
KTtmdW5jdGlvbiBzdWNjZXNzKCl7aWYocy5zdWNjZXNzKXMuc3VjY2VzcyhkYXRhLHN0YXR1cyk7
aWYocy5nbG9iYWwpalF1ZXJ5LmV2ZW50LnRyaWdnZXIoImFqYXhTdWNjZXNzIixbeGhyLHNdKTt9
ZnVuY3Rpb24gY29tcGxldGUoKXtpZihzLmNvbXBsZXRlKXMuY29tcGxldGUoeGhyLHN0YXR1cyk7
aWYocy5nbG9iYWwpalF1ZXJ5LmV2ZW50LnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW3hocixzXSk7
aWYocy5nbG9iYWwmJiEtLWpRdWVyeS5hY3RpdmUpalF1ZXJ5LmV2ZW50LnRyaWdnZXIoImFqYXhT
dG9wIik7fXJldHVybiB4aHI7fSxoYW5kbGVFcnJvcjpmdW5jdGlvbihzLHhocixzdGF0dXMsZSl7
aWYocy5lcnJvcilzLmVycm9yKHhocixzdGF0dXMsZSk7aWYocy5nbG9iYWwpalF1ZXJ5LmV2ZW50
LnRyaWdnZXIoImFqYXhFcnJvciIsW3hocixzLGVdKTt9LGFjdGl2ZTowLGh0dHBTdWNjZXNzOmZ1
bmN0aW9uKHhocil7dHJ5e3JldHVybiF4aHIuc3RhdHVzJiZsb2NhdGlvbi5wcm90b2NvbD09ImZp
bGU6Inx8KHhoci5zdGF0dXM+PTIwMCYmeGhyLnN0YXR1czwzMDApfHx4aHIuc3RhdHVzPT0zMDR8
fHhoci5zdGF0dXM9PTEyMjN8fGpRdWVyeS5icm93c2VyLnNhZmFyaSYmeGhyLnN0YXR1cz09dW5k
ZWZpbmVkO31jYXRjaChlKXt9cmV0dXJuIGZhbHNlO30saHR0cE5vdE1vZGlmaWVkOmZ1bmN0aW9u
KHhocix1cmwpe3RyeXt2YXIgeGhyUmVzPXhoci5nZXRSZXNwb25zZUhlYWRlcigiTGFzdC1Nb2Rp
ZmllZCIpO3JldHVybiB4aHIuc3RhdHVzPT0zMDR8fHhoclJlcz09alF1ZXJ5Lmxhc3RNb2RpZmll
ZFt1cmxdfHxqUXVlcnkuYnJvd3Nlci5zYWZhcmkmJnhoci5zdGF0dXM9PXVuZGVmaW5lZDt9Y2F0
Y2goZSl7fXJldHVybiBmYWxzZTt9LGh0dHBEYXRhOmZ1bmN0aW9uKHhocix0eXBlLGZpbHRlcil7
dmFyIGN0PXhoci5nZXRSZXNwb25zZUhlYWRlcigiY29udGVudC10eXBlIikseG1sPXR5cGU9PSJ4
bWwifHwhdHlwZSYmY3QmJmN0LmluZGV4T2YoInhtbCIpPj0wLGRhdGE9eG1sP3hoci5yZXNwb25z
ZVhNTDp4aHIucmVzcG9uc2VUZXh0O2lmKHhtbCYmZGF0YS5kb2N1bWVudEVsZW1lbnQudGFnTmFt
ZT09InBhcnNlcmVycm9yIil0aHJvdyJwYXJzZXJlcnJvciI7aWYoZmlsdGVyKWRhdGE9ZmlsdGVy
KGRhdGEsdHlwZSk7aWYodHlwZT09InNjcmlwdCIpalF1ZXJ5Lmdsb2JhbEV2YWwoZGF0YSk7aWYo
dHlwZT09Impzb24iKWRhdGE9ZXZhbCgiKCIrZGF0YSsiKSIpO3JldHVybiBkYXRhO30scGFyYW06
ZnVuY3Rpb24oYSl7dmFyIHM9W107aWYoYS5jb25zdHJ1Y3Rvcj09QXJyYXl8fGEuanF1ZXJ5KWpR
dWVyeS5lYWNoKGEsZnVuY3Rpb24oKXtzLnB1c2goZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMubmFt
ZSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0aGlzLnZhbHVlKSk7fSk7ZWxzZQorZm9yKHZhciBq
IGluIGEpaWYoYVtqXSYmYVtqXS5jb25zdHJ1Y3Rvcj09QXJyYXkpalF1ZXJ5LmVhY2goYVtqXSxm
dW5jdGlvbigpe3MucHVzaChlbmNvZGVVUklDb21wb25lbnQoaikrIj0iK2VuY29kZVVSSUNvbXBv
bmVudCh0aGlzKSk7fSk7ZWxzZQorcy5wdXNoKGVuY29kZVVSSUNvbXBvbmVudChqKSsiPSIrZW5j
b2RlVVJJQ29tcG9uZW50KGpRdWVyeS5pc0Z1bmN0aW9uKGFbal0pP2Fbal0oKTphW2pdKSk7cmV0
dXJuIHMuam9pbigiJiIpLnJlcGxhY2UoLyUyMC9nLCIrIik7fX0pO2pRdWVyeS5mbi5leHRlbmQo
e3Nob3c6ZnVuY3Rpb24oc3BlZWQsY2FsbGJhY2spe3JldHVybiBzcGVlZD90aGlzLmFuaW1hdGUo
e2hlaWdodDoic2hvdyIsd2lkdGg6InNob3ciLG9wYWNpdHk6InNob3cifSxzcGVlZCxjYWxsYmFj
ayk6dGhpcy5maWx0ZXIoIjpoaWRkZW4iKS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5kaXNw
bGF5PXRoaXMub2xkYmxvY2t8fCIiO2lmKGpRdWVyeS5jc3ModGhpcywiZGlzcGxheSIpPT0ibm9u
ZSIpe3ZhciBlbGVtPWpRdWVyeSgiPCIrdGhpcy50YWdOYW1lKyIgLz4iKS5hcHBlbmRUbygiYm9k
eSIpO3RoaXMuc3R5bGUuZGlzcGxheT1lbGVtLmNzcygiZGlzcGxheSIpO2lmKHRoaXMuc3R5bGUu
ZGlzcGxheT09Im5vbmUiKXRoaXMuc3R5bGUuZGlzcGxheT0iYmxvY2siO2VsZW0ucmVtb3ZlKCk7
fX0pLmVuZCgpO30saGlkZTpmdW5jdGlvbihzcGVlZCxjYWxsYmFjayl7cmV0dXJuIHNwZWVkP3Ro
aXMuYW5pbWF0ZSh7aGVpZ2h0OiJoaWRlIix3aWR0aDoiaGlkZSIsb3BhY2l0eToiaGlkZSJ9LHNw
ZWVkLGNhbGxiYWNrKTp0aGlzLmZpbHRlcigiOnZpc2libGUiKS5lYWNoKGZ1bmN0aW9uKCl7dGhp
cy5vbGRibG9jaz10aGlzLm9sZGJsb2NrfHxqUXVlcnkuY3NzKHRoaXMsImRpc3BsYXkiKTt0aGlz
LnN0eWxlLmRpc3BsYXk9Im5vbmUiO30pLmVuZCgpO30sX3RvZ2dsZTpqUXVlcnkuZm4udG9nZ2xl
LHRvZ2dsZTpmdW5jdGlvbihmbixmbjIpe3JldHVybiBqUXVlcnkuaXNGdW5jdGlvbihmbikmJmpR
dWVyeS5pc0Z1bmN0aW9uKGZuMik/dGhpcy5fdG9nZ2xlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpm
bj90aGlzLmFuaW1hdGUoe2hlaWdodDoidG9nZ2xlIix3aWR0aDoidG9nZ2xlIixvcGFjaXR5OiJ0
b2dnbGUifSxmbixmbjIpOnRoaXMuZWFjaChmdW5jdGlvbigpe2pRdWVyeSh0aGlzKVtqUXVlcnko
dGhpcykuaXMoIjpoaWRkZW4iKT8ic2hvdyI6ImhpZGUiXSgpO30pO30sc2xpZGVEb3duOmZ1bmN0
aW9uKHNwZWVkLGNhbGxiYWNrKXtyZXR1cm4gdGhpcy5hbmltYXRlKHtoZWlnaHQ6InNob3cifSxz
cGVlZCxjYWxsYmFjayk7fSxzbGlkZVVwOmZ1bmN0aW9uKHNwZWVkLGNhbGxiYWNrKXtyZXR1cm4g
dGhpcy5hbmltYXRlKHtoZWlnaHQ6ImhpZGUifSxzcGVlZCxjYWxsYmFjayk7fSxzbGlkZVRvZ2ds
ZTpmdW5jdGlvbihzcGVlZCxjYWxsYmFjayl7cmV0dXJuIHRoaXMuYW5pbWF0ZSh7aGVpZ2h0OiJ0
b2dnbGUifSxzcGVlZCxjYWxsYmFjayk7fSxmYWRlSW46ZnVuY3Rpb24oc3BlZWQsY2FsbGJhY2sp
e3JldHVybiB0aGlzLmFuaW1hdGUoe29wYWNpdHk6InNob3cifSxzcGVlZCxjYWxsYmFjayk7fSxm
YWRlT3V0OmZ1bmN0aW9uKHNwZWVkLGNhbGxiYWNrKXtyZXR1cm4gdGhpcy5hbmltYXRlKHtvcGFj
aXR5OiJoaWRlIn0sc3BlZWQsY2FsbGJhY2spO30sZmFkZVRvOmZ1bmN0aW9uKHNwZWVkLHRvLGNh
bGxiYWNrKXtyZXR1cm4gdGhpcy5hbmltYXRlKHtvcGFjaXR5OnRvfSxzcGVlZCxjYWxsYmFjayk7
fSxhbmltYXRlOmZ1bmN0aW9uKHByb3Asc3BlZWQsZWFzaW5nLGNhbGxiYWNrKXt2YXIgb3B0YWxs
PWpRdWVyeS5zcGVlZChzcGVlZCxlYXNpbmcsY2FsbGJhY2spO3JldHVybiB0aGlzW29wdGFsbC5x
dWV1ZT09PWZhbHNlPyJlYWNoIjoicXVldWUiXShmdW5jdGlvbigpe2lmKHRoaXMubm9kZVR5cGUh
PTEpcmV0dXJuIGZhbHNlO3ZhciBvcHQ9alF1ZXJ5LmV4dGVuZCh7fSxvcHRhbGwpLHAsaGlkZGVu
PWpRdWVyeSh0aGlzKS5pcygiOmhpZGRlbiIpLHNlbGY9dGhpcztmb3IocCBpbiBwcm9wKXtpZihw
cm9wW3BdPT0iaGlkZSImJmhpZGRlbnx8cHJvcFtwXT09InNob3ciJiYhaGlkZGVuKXJldHVybiBv
cHQuY29tcGxldGUuY2FsbCh0aGlzKTtpZihwPT0iaGVpZ2h0Inx8cD09IndpZHRoIil7b3B0LmRp
c3BsYXk9alF1ZXJ5LmNzcyh0aGlzLCJkaXNwbGF5Iik7b3B0Lm92ZXJmbG93PXRoaXMuc3R5bGUu
b3ZlcmZsb3c7fX1pZihvcHQub3ZlcmZsb3chPW51bGwpdGhpcy5zdHlsZS5vdmVyZmxvdz0iaGlk
ZGVuIjtvcHQuY3VyQW5pbT1qUXVlcnkuZXh0ZW5kKHt9LHByb3ApO2pRdWVyeS5lYWNoKHByb3As
ZnVuY3Rpb24obmFtZSx2YWwpe3ZhciBlPW5ldyBqUXVlcnkuZngoc2VsZixvcHQsbmFtZSk7aWYo
L3RvZ2dsZXxzaG93fGhpZGUvLnRlc3QodmFsKSllW3ZhbD09InRvZ2dsZSI/aGlkZGVuPyJzaG93
IjoiaGlkZSI6dmFsXShwcm9wKTtlbHNle3ZhciBwYXJ0cz12YWwudG9TdHJpbmcoKS5tYXRjaCgv
XihbKy1dPSk/KFtcZCstLl0rKSguKikkLyksc3RhcnQ9ZS5jdXIodHJ1ZSl8fDA7aWYocGFydHMp
e3ZhciBlbmQ9cGFyc2VGbG9hdChwYXJ0c1syXSksdW5pdD1wYXJ0c1szXXx8InB4IjtpZih1bml0
IT0icHgiKXtzZWxmLnN0eWxlW25hbWVdPShlbmR8fDEpK3VuaXQ7c3RhcnQ9KChlbmR8fDEpL2Uu
Y3VyKHRydWUpKSpzdGFydDtzZWxmLnN0eWxlW25hbWVdPXN0YXJ0K3VuaXQ7fWlmKHBhcnRzWzFd
KWVuZD0oKHBhcnRzWzFdPT0iLT0iPy0xOjEpKmVuZCkrc3RhcnQ7ZS5jdXN0b20oc3RhcnQsZW5k
LHVuaXQpO31lbHNlCitlLmN1c3RvbShzdGFydCx2YWwsIiIpO319KTtyZXR1cm4gdHJ1ZTt9KTt9
LHF1ZXVlOmZ1bmN0aW9uKHR5cGUsZm4pe2lmKGpRdWVyeS5pc0Z1bmN0aW9uKHR5cGUpfHwodHlw
ZSYmdHlwZS5jb25zdHJ1Y3Rvcj09QXJyYXkpKXtmbj10eXBlO3R5cGU9ImZ4Ijt9aWYoIXR5cGV8
fCh0eXBlb2YgdHlwZT09InN0cmluZyImJiFmbikpcmV0dXJuIHF1ZXVlKHRoaXNbMF0sdHlwZSk7
cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2lmKGZuLmNvbnN0cnVjdG9yPT1BcnJheSlxdWV1
ZSh0aGlzLHR5cGUsZm4pO2Vsc2V7cXVldWUodGhpcyx0eXBlKS5wdXNoKGZuKTtpZihxdWV1ZSh0
aGlzLHR5cGUpLmxlbmd0aD09MSlmbi5jYWxsKHRoaXMpO319KTt9LHN0b3A6ZnVuY3Rpb24oY2xl
YXJRdWV1ZSxnb3RvRW5kKXt2YXIgdGltZXJzPWpRdWVyeS50aW1lcnM7aWYoY2xlYXJRdWV1ZSl0
aGlzLnF1ZXVlKFtdKTt0aGlzLmVhY2goZnVuY3Rpb24oKXtmb3IodmFyIGk9dGltZXJzLmxlbmd0
aC0xO2k+PTA7aS0tKWlmKHRpbWVyc1tpXS5lbGVtPT10aGlzKXtpZihnb3RvRW5kKXRpbWVyc1tp
XSh0cnVlKTt0aW1lcnMuc3BsaWNlKGksMSk7fX0pO2lmKCFnb3RvRW5kKXRoaXMuZGVxdWV1ZSgp
O3JldHVybiB0aGlzO319KTt2YXIgcXVldWU9ZnVuY3Rpb24oZWxlbSx0eXBlLGFycmF5KXtpZihl
bGVtKXt0eXBlPXR5cGV8fCJmeCI7dmFyIHE9alF1ZXJ5LmRhdGEoZWxlbSx0eXBlKyJxdWV1ZSIp
O2lmKCFxfHxhcnJheSlxPWpRdWVyeS5kYXRhKGVsZW0sdHlwZSsicXVldWUiLGpRdWVyeS5tYWtl
QXJyYXkoYXJyYXkpKTt9cmV0dXJuIHE7fTtqUXVlcnkuZm4uZGVxdWV1ZT1mdW5jdGlvbih0eXBl
KXt0eXBlPXR5cGV8fCJmeCI7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBxPXF1ZXVl
KHRoaXMsdHlwZSk7cS5zaGlmdCgpO2lmKHEubGVuZ3RoKXFbMF0uY2FsbCh0aGlzKTt9KTt9O2pR
dWVyeS5leHRlbmQoe3NwZWVkOmZ1bmN0aW9uKHNwZWVkLGVhc2luZyxmbil7dmFyIG9wdD1zcGVl
ZCYmc3BlZWQuY29uc3RydWN0b3I9PU9iamVjdD9zcGVlZDp7Y29tcGxldGU6Zm58fCFmbiYmZWFz
aW5nfHxqUXVlcnkuaXNGdW5jdGlvbihzcGVlZCkmJnNwZWVkLGR1cmF0aW9uOnNwZWVkLGVhc2lu
ZzpmbiYmZWFzaW5nfHxlYXNpbmcmJmVhc2luZy5jb25zdHJ1Y3RvciE9RnVuY3Rpb24mJmVhc2lu
Z307b3B0LmR1cmF0aW9uPShvcHQuZHVyYXRpb24mJm9wdC5kdXJhdGlvbi5jb25zdHJ1Y3Rvcj09
TnVtYmVyP29wdC5kdXJhdGlvbjpqUXVlcnkuZnguc3BlZWRzW29wdC5kdXJhdGlvbl0pfHxqUXVl
cnkuZnguc3BlZWRzLmRlZjtvcHQub2xkPW9wdC5jb21wbGV0ZTtvcHQuY29tcGxldGU9ZnVuY3Rp
b24oKXtpZihvcHQucXVldWUhPT1mYWxzZSlqUXVlcnkodGhpcykuZGVxdWV1ZSgpO2lmKGpRdWVy
eS5pc0Z1bmN0aW9uKG9wdC5vbGQpKW9wdC5vbGQuY2FsbCh0aGlzKTt9O3JldHVybiBvcHQ7fSxl
YXNpbmc6e2xpbmVhcjpmdW5jdGlvbihwLG4sZmlyc3ROdW0sZGlmZil7cmV0dXJuIGZpcnN0TnVt
K2RpZmYqcDt9LHN3aW5nOmZ1bmN0aW9uKHAsbixmaXJzdE51bSxkaWZmKXtyZXR1cm4oKC1NYXRo
LmNvcyhwKk1hdGguUEkpLzIpKzAuNSkqZGlmZitmaXJzdE51bTt9fSx0aW1lcnM6W10sdGltZXJJ
ZDpudWxsLGZ4OmZ1bmN0aW9uKGVsZW0sb3B0aW9ucyxwcm9wKXt0aGlzLm9wdGlvbnM9b3B0aW9u
czt0aGlzLmVsZW09ZWxlbTt0aGlzLnByb3A9cHJvcDtpZighb3B0aW9ucy5vcmlnKW9wdGlvbnMu
b3JpZz17fTt9fSk7alF1ZXJ5LmZ4LnByb3RvdHlwZT17dXBkYXRlOmZ1bmN0aW9uKCl7aWYodGhp
cy5vcHRpb25zLnN0ZXApdGhpcy5vcHRpb25zLnN0ZXAuY2FsbCh0aGlzLmVsZW0sdGhpcy5ub3cs
dGhpcyk7KGpRdWVyeS5meC5zdGVwW3RoaXMucHJvcF18fGpRdWVyeS5meC5zdGVwLl9kZWZhdWx0
KSh0aGlzKTtpZih0aGlzLnByb3A9PSJoZWlnaHQifHx0aGlzLnByb3A9PSJ3aWR0aCIpdGhpcy5l
bGVtLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjt9LGN1cjpmdW5jdGlvbihmb3JjZSl7aWYodGhpcy5l
bGVtW3RoaXMucHJvcF0hPW51bGwmJnRoaXMuZWxlbS5zdHlsZVt0aGlzLnByb3BdPT1udWxsKXJl
dHVybiB0aGlzLmVsZW1bdGhpcy5wcm9wXTt2YXIgcj1wYXJzZUZsb2F0KGpRdWVyeS5jc3ModGhp
cy5lbGVtLHRoaXMucHJvcCxmb3JjZSkpO3JldHVybiByJiZyPi0xMDAwMD9yOnBhcnNlRmxvYXQo
alF1ZXJ5LmN1ckNTUyh0aGlzLmVsZW0sdGhpcy5wcm9wKSl8fDA7fSxjdXN0b206ZnVuY3Rpb24o
ZnJvbSx0byx1bml0KXt0aGlzLnN0YXJ0VGltZT1ub3coKTt0aGlzLnN0YXJ0PWZyb207dGhpcy5l
bmQ9dG87dGhpcy51bml0PXVuaXR8fHRoaXMudW5pdHx8InB4Ijt0aGlzLm5vdz10aGlzLnN0YXJ0
O3RoaXMucG9zPXRoaXMuc3RhdGU9MDt0aGlzLnVwZGF0ZSgpO3ZhciBzZWxmPXRoaXM7ZnVuY3Rp
b24gdChnb3RvRW5kKXtyZXR1cm4gc2VsZi5zdGVwKGdvdG9FbmQpO310LmVsZW09dGhpcy5lbGVt
O2pRdWVyeS50aW1lcnMucHVzaCh0KTtpZihqUXVlcnkudGltZXJJZD09bnVsbCl7alF1ZXJ5LnRp
bWVySWQ9c2V0SW50ZXJ2YWwoZnVuY3Rpb24oKXt2YXIgdGltZXJzPWpRdWVyeS50aW1lcnM7Zm9y
KHZhciBpPTA7aTx0aW1lcnMubGVuZ3RoO2krKylpZighdGltZXJzW2ldKCkpdGltZXJzLnNwbGlj
ZShpLS0sMSk7aWYoIXRpbWVycy5sZW5ndGgpe2NsZWFySW50ZXJ2YWwoalF1ZXJ5LnRpbWVySWQp
O2pRdWVyeS50aW1lcklkPW51bGw7fX0sMTMpO319LHNob3c6ZnVuY3Rpb24oKXt0aGlzLm9wdGlv
bnMub3JpZ1t0aGlzLnByb3BdPWpRdWVyeS5hdHRyKHRoaXMuZWxlbS5zdHlsZSx0aGlzLnByb3Ap
O3RoaXMub3B0aW9ucy5zaG93PXRydWU7dGhpcy5jdXN0b20oMCx0aGlzLmN1cigpKTtpZih0aGlz
LnByb3A9PSJ3aWR0aCJ8fHRoaXMucHJvcD09ImhlaWdodCIpdGhpcy5lbGVtLnN0eWxlW3RoaXMu
cHJvcF09IjFweCI7alF1ZXJ5KHRoaXMuZWxlbSkuc2hvdygpO30saGlkZTpmdW5jdGlvbigpe3Ro
aXMub3B0aW9ucy5vcmlnW3RoaXMucHJvcF09alF1ZXJ5LmF0dHIodGhpcy5lbGVtLnN0eWxlLHRo
aXMucHJvcCk7dGhpcy5vcHRpb25zLmhpZGU9dHJ1ZTt0aGlzLmN1c3RvbSh0aGlzLmN1cigpLDAp
O30sc3RlcDpmdW5jdGlvbihnb3RvRW5kKXt2YXIgdD1ub3coKTtpZihnb3RvRW5kfHx0PnRoaXMu
b3B0aW9ucy5kdXJhdGlvbit0aGlzLnN0YXJ0VGltZSl7dGhpcy5ub3c9dGhpcy5lbmQ7dGhpcy5w
b3M9dGhpcy5zdGF0ZT0xO3RoaXMudXBkYXRlKCk7dGhpcy5vcHRpb25zLmN1ckFuaW1bdGhpcy5w
cm9wXT10cnVlO3ZhciBkb25lPXRydWU7Zm9yKHZhciBpIGluIHRoaXMub3B0aW9ucy5jdXJBbmlt
KWlmKHRoaXMub3B0aW9ucy5jdXJBbmltW2ldIT09dHJ1ZSlkb25lPWZhbHNlO2lmKGRvbmUpe2lm
KHRoaXMub3B0aW9ucy5kaXNwbGF5IT1udWxsKXt0aGlzLmVsZW0uc3R5bGUub3ZlcmZsb3c9dGhp
cy5vcHRpb25zLm92ZXJmbG93O3RoaXMuZWxlbS5zdHlsZS5kaXNwbGF5PXRoaXMub3B0aW9ucy5k
aXNwbGF5O2lmKGpRdWVyeS5jc3ModGhpcy5lbGVtLCJkaXNwbGF5Iik9PSJub25lIil0aGlzLmVs
ZW0uc3R5bGUuZGlzcGxheT0iYmxvY2siO31pZih0aGlzLm9wdGlvbnMuaGlkZSl0aGlzLmVsZW0u
c3R5bGUuZGlzcGxheT0ibm9uZSI7aWYodGhpcy5vcHRpb25zLmhpZGV8fHRoaXMub3B0aW9ucy5z
aG93KWZvcih2YXIgcCBpbiB0aGlzLm9wdGlvbnMuY3VyQW5pbSlqUXVlcnkuYXR0cih0aGlzLmVs
ZW0uc3R5bGUscCx0aGlzLm9wdGlvbnMub3JpZ1twXSk7fWlmKGRvbmUpdGhpcy5vcHRpb25zLmNv
bXBsZXRlLmNhbGwodGhpcy5lbGVtKTtyZXR1cm4gZmFsc2U7fWVsc2V7dmFyIG49dC10aGlzLnN0
YXJ0VGltZTt0aGlzLnN0YXRlPW4vdGhpcy5vcHRpb25zLmR1cmF0aW9uO3RoaXMucG9zPWpRdWVy
eS5lYXNpbmdbdGhpcy5vcHRpb25zLmVhc2luZ3x8KGpRdWVyeS5lYXNpbmcuc3dpbmc/InN3aW5n
IjoibGluZWFyIildKHRoaXMuc3RhdGUsbiwwLDEsdGhpcy5vcHRpb25zLmR1cmF0aW9uKTt0aGlz
Lm5vdz10aGlzLnN0YXJ0KygodGhpcy5lbmQtdGhpcy5zdGFydCkqdGhpcy5wb3MpO3RoaXMudXBk
YXRlKCk7fXJldHVybiB0cnVlO319O2pRdWVyeS5leHRlbmQoalF1ZXJ5LmZ4LHtzcGVlZHM6e3Ns
b3c6NjAwLGZhc3Q6MjAwLGRlZjo0MDB9LHN0ZXA6e3Njcm9sbExlZnQ6ZnVuY3Rpb24oZngpe2Z4
LmVsZW0uc2Nyb2xsTGVmdD1meC5ub3c7fSxzY3JvbGxUb3A6ZnVuY3Rpb24oZngpe2Z4LmVsZW0u
c2Nyb2xsVG9wPWZ4Lm5vdzt9LG9wYWNpdHk6ZnVuY3Rpb24oZngpe2pRdWVyeS5hdHRyKGZ4LmVs
ZW0uc3R5bGUsIm9wYWNpdHkiLGZ4Lm5vdyk7fSxfZGVmYXVsdDpmdW5jdGlvbihmeCl7ZnguZWxl
bS5zdHlsZVtmeC5wcm9wXT1meC5ub3crZngudW5pdDt9fX0pO2pRdWVyeS5mbi5vZmZzZXQ9ZnVu
Y3Rpb24oKXt2YXIgbGVmdD0wLHRvcD0wLGVsZW09dGhpc1swXSxyZXN1bHRzO2lmKGVsZW0pd2l0
aChqUXVlcnkuYnJvd3Nlcil7dmFyIHBhcmVudD1lbGVtLnBhcmVudE5vZGUsb2Zmc2V0Q2hpbGQ9
ZWxlbSxvZmZzZXRQYXJlbnQ9ZWxlbS5vZmZzZXRQYXJlbnQsZG9jPWVsZW0ub3duZXJEb2N1bWVu
dCxzYWZhcmkyPXNhZmFyaSYmcGFyc2VJbnQodmVyc2lvbik8NTIyJiYhL2Fkb2JlYWlyL2kudGVz
dCh1c2VyQWdlbnQpLGNzcz1qUXVlcnkuY3VyQ1NTLGZpeGVkPWNzcyhlbGVtLCJwb3NpdGlvbiIp
PT0iZml4ZWQiO2lmKGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXt2YXIgYm94PWVsZW0uZ2V0
Qm91bmRpbmdDbGllbnRSZWN0KCk7YWRkKGJveC5sZWZ0K01hdGgubWF4KGRvYy5kb2N1bWVudEVs
ZW1lbnQuc2Nyb2xsTGVmdCxkb2MuYm9keS5zY3JvbGxMZWZ0KSxib3gudG9wK01hdGgubWF4KGRv
Yy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wLGRvYy5ib2R5LnNjcm9sbFRvcCkpO2FkZCgtZG9j
LmRvY3VtZW50RWxlbWVudC5jbGllbnRMZWZ0LC1kb2MuZG9jdW1lbnRFbGVtZW50LmNsaWVudFRv
cCk7fWVsc2V7YWRkKGVsZW0ub2Zmc2V0TGVmdCxlbGVtLm9mZnNldFRvcCk7d2hpbGUob2Zmc2V0
UGFyZW50KXthZGQob2Zmc2V0UGFyZW50Lm9mZnNldExlZnQsb2Zmc2V0UGFyZW50Lm9mZnNldFRv
cCk7aWYobW96aWxsYSYmIS9edChhYmxlfGR8aCkkL2kudGVzdChvZmZzZXRQYXJlbnQudGFnTmFt
ZSl8fHNhZmFyaSYmIXNhZmFyaTIpYm9yZGVyKG9mZnNldFBhcmVudCk7aWYoIWZpeGVkJiZjc3Mo
b2Zmc2V0UGFyZW50LCJwb3NpdGlvbiIpPT0iZml4ZWQiKWZpeGVkPXRydWU7b2Zmc2V0Q2hpbGQ9
L15ib2R5JC9pLnRlc3Qob2Zmc2V0UGFyZW50LnRhZ05hbWUpP29mZnNldENoaWxkOm9mZnNldFBh
cmVudDtvZmZzZXRQYXJlbnQ9b2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDt9d2hpbGUocGFyZW50
JiZwYXJlbnQudGFnTmFtZSYmIS9eYm9keXxodG1sJC9pLnRlc3QocGFyZW50LnRhZ05hbWUpKXtp
ZighL15pbmxpbmV8dGFibGUuKiQvaS50ZXN0KGNzcyhwYXJlbnQsImRpc3BsYXkiKSkpYWRkKC1w
YXJlbnQuc2Nyb2xsTGVmdCwtcGFyZW50LnNjcm9sbFRvcCk7aWYobW96aWxsYSYmY3NzKHBhcmVu
dCwib3ZlcmZsb3ciKSE9InZpc2libGUiKWJvcmRlcihwYXJlbnQpO3BhcmVudD1wYXJlbnQucGFy
ZW50Tm9kZTt9aWYoKHNhZmFyaTImJihmaXhlZHx8Y3NzKG9mZnNldENoaWxkLCJwb3NpdGlvbiIp
PT0iYWJzb2x1dGUiKSl8fChtb3ppbGxhJiZjc3Mob2Zmc2V0Q2hpbGQsInBvc2l0aW9uIikhPSJh
YnNvbHV0ZSIpKWFkZCgtZG9jLmJvZHkub2Zmc2V0TGVmdCwtZG9jLmJvZHkub2Zmc2V0VG9wKTtp
ZihmaXhlZClhZGQoTWF0aC5tYXgoZG9jLmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LGRvYy5i
b2R5LnNjcm9sbExlZnQpLE1hdGgubWF4KGRvYy5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wLGRv
Yy5ib2R5LnNjcm9sbFRvcCkpO31yZXN1bHRzPXt0b3A6dG9wLGxlZnQ6bGVmdH07fWZ1bmN0aW9u
IGJvcmRlcihlbGVtKXthZGQoalF1ZXJ5LmN1ckNTUyhlbGVtLCJib3JkZXJMZWZ0V2lkdGgiLHRy
dWUpLGpRdWVyeS5jdXJDU1MoZWxlbSwiYm9yZGVyVG9wV2lkdGgiLHRydWUpKTt9ZnVuY3Rpb24g
YWRkKGwsdCl7bGVmdCs9cGFyc2VJbnQobCwxMCl8fDA7dG9wKz1wYXJzZUludCh0LDEwKXx8MDt9
cmV0dXJuIHJlc3VsdHM7fTtqUXVlcnkuZm4uZXh0ZW5kKHtwb3NpdGlvbjpmdW5jdGlvbigpe3Zh
ciBsZWZ0PTAsdG9wPTAscmVzdWx0cztpZih0aGlzWzBdKXt2YXIgb2Zmc2V0UGFyZW50PXRoaXMu
b2Zmc2V0UGFyZW50KCksb2Zmc2V0PXRoaXMub2Zmc2V0KCkscGFyZW50T2Zmc2V0PS9eYm9keXxo
dG1sJC9pLnRlc3Qob2Zmc2V0UGFyZW50WzBdLnRhZ05hbWUpP3t0b3A6MCxsZWZ0OjB9Om9mZnNl
dFBhcmVudC5vZmZzZXQoKTtvZmZzZXQudG9wLT1udW0odGhpcywnbWFyZ2luVG9wJyk7b2Zmc2V0
LmxlZnQtPW51bSh0aGlzLCdtYXJnaW5MZWZ0Jyk7cGFyZW50T2Zmc2V0LnRvcCs9bnVtKG9mZnNl
dFBhcmVudCwnYm9yZGVyVG9wV2lkdGgnKTtwYXJlbnRPZmZzZXQubGVmdCs9bnVtKG9mZnNldFBh
cmVudCwnYm9yZGVyTGVmdFdpZHRoJyk7cmVzdWx0cz17dG9wOm9mZnNldC50b3AtcGFyZW50T2Zm
c2V0LnRvcCxsZWZ0Om9mZnNldC5sZWZ0LXBhcmVudE9mZnNldC5sZWZ0fTt9cmV0dXJuIHJlc3Vs
dHM7fSxvZmZzZXRQYXJlbnQ6ZnVuY3Rpb24oKXt2YXIgb2Zmc2V0UGFyZW50PXRoaXNbMF0ub2Zm
c2V0UGFyZW50O3doaWxlKG9mZnNldFBhcmVudCYmKCEvXmJvZHl8aHRtbCQvaS50ZXN0KG9mZnNl
dFBhcmVudC50YWdOYW1lKSYmalF1ZXJ5LmNzcyhvZmZzZXRQYXJlbnQsJ3Bvc2l0aW9uJyk9PSdz
dGF0aWMnKSlvZmZzZXRQYXJlbnQ9b2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDtyZXR1cm4galF1
ZXJ5KG9mZnNldFBhcmVudCk7fX0pO2pRdWVyeS5lYWNoKFsnTGVmdCcsJ1RvcCddLGZ1bmN0aW9u
KGksbmFtZSl7dmFyIG1ldGhvZD0nc2Nyb2xsJytuYW1lO2pRdWVyeS5mblttZXRob2RdPWZ1bmN0
aW9uKHZhbCl7aWYoIXRoaXNbMF0pcmV0dXJuO3JldHVybiB2YWwhPXVuZGVmaW5lZD90aGlzLmVh
Y2goZnVuY3Rpb24oKXt0aGlzPT13aW5kb3d8fHRoaXM9PWRvY3VtZW50P3dpbmRvdy5zY3JvbGxU
byghaT92YWw6alF1ZXJ5KHdpbmRvdykuc2Nyb2xsTGVmdCgpLGk/dmFsOmpRdWVyeSh3aW5kb3cp
LnNjcm9sbFRvcCgpKTp0aGlzW21ldGhvZF09dmFsO30pOnRoaXNbMF09PXdpbmRvd3x8dGhpc1sw
XT09ZG9jdW1lbnQ/c2VsZltpPydwYWdlWU9mZnNldCc6J3BhZ2VYT2Zmc2V0J118fGpRdWVyeS5i
b3hNb2RlbCYmZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50W21ldGhvZF18fGRvY3VtZW50LmJvZHlb
bWV0aG9kXTp0aGlzWzBdW21ldGhvZF07fTt9KTtqUXVlcnkuZWFjaChbIkhlaWdodCIsIldpZHRo
Il0sZnVuY3Rpb24oaSxuYW1lKXt2YXIgdGw9aT8iTGVmdCI6IlRvcCIsYnI9aT8iUmlnaHQiOiJC
b3R0b20iO2pRdWVyeS5mblsiaW5uZXIiK25hbWVdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbbmFt
ZS50b0xvd2VyQ2FzZSgpXSgpK251bSh0aGlzLCJwYWRkaW5nIit0bCkrbnVtKHRoaXMsInBhZGRp
bmciK2JyKTt9O2pRdWVyeS5mblsib3V0ZXIiK25hbWVdPWZ1bmN0aW9uKG1hcmdpbil7cmV0dXJu
IHRoaXNbImlubmVyIituYW1lXSgpK251bSh0aGlzLCJib3JkZXIiK3RsKyJXaWR0aCIpK251bSh0
aGlzLCJib3JkZXIiK2JyKyJXaWR0aCIpKyhtYXJnaW4/bnVtKHRoaXMsIm1hcmdpbiIrdGwpK251
bSh0aGlzLCJtYXJnaW4iK2JyKTowKTt9O30pO30pKCk7ClwgTm8gbmV3bGluZSBhdCBlbmQgb2Yg
ZmlsZQpkaWZmIC0tZ2l0IGEvd3VpL3NyYy9wdWJsaWMvamF2YXNjcmlwdHMvanF1ZXJ5LXRyZWV2
aWV3L2pxdWVyeS50cmVldmlldy5hc3luYy5qcyBiL3d1aS9zcmMvcHVibGljL2phdmFzY3JpcHRz
L2pxdWVyeS10cmVldmlldy9qcXVlcnkudHJlZXZpZXcuYXN5bmMuanMKaW5kZXggZDI3N2EzMi4u
N2Q1ZWIyZiAxMDA2NDQKLS0tIGEvd3VpL3NyYy9wdWJsaWMvamF2YXNjcmlwdHMvanF1ZXJ5LXRy
ZWV2aWV3L2pxdWVyeS50cmVldmlldy5hc3luYy5qcworKysgYi93dWkvc3JjL3B1YmxpYy9qYXZh
c2NyaXB0cy9qcXVlcnktdHJlZXZpZXcvanF1ZXJ5LnRyZWV2aWV3LmFzeW5jLmpzCkBAIC00OSwz
MSArNDksMjcgQEAgZnVuY3Rpb24gbG9hZChzZXR0aW5ncywgcGFyYW1zLCBjaGlsZCwgY29udGFp
bmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAg
ICAgICAgICAgICBjdXJyZW50Lmh0bWwoIjxzcGFuIGNsYXNzPVwiIiArIHNldHRpbmdzLnNwYW5f
Y2xhc3MgKyAiXCIiICsgc3Bhbl9vbmNsaWNrICsgIj4iICsgbGlua19vcGVuICsgdGhpcy50ZXh0
ICsgbGlua19jbG9zZSArICI8L3NwYW4+IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAu
YXBwZW5kVG8ocGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnbGkgIycgKyB0
aGlzLmlkICsgJyBzcGFuID4gYScpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJpbmQo
J2NsaWNrJywgZnVuY3Rpb24oKSB7ICAgICAgICAgICAgCisvLyAgICAgICAgICAgICAgICAgICAg
ICAgICAgJCgnbGkgIycgKyB0aGlzLmlkICsgJyBzcGFuID4gYScpCisvLyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAuYmluZCgnY2xpY2snLCBmdW5jdGlvbigpIHsgCiAvLyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICQuYWpheCh7CiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgdXJsOiB0aGlzLmhyZWYsCiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
dHlwZTogJ0dFVCcsCiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YToge2Fq
YXg6dHJ1ZX0sCiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6ICdo
dG1sJywKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlv
bihkYXRhKSB7IGFsZXJ0KGRhdGEpO30sCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgc3VjY2VzczogZnVuY3Rpb24oZGF0YSkgeyAKKy8vICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHZhciB3cmFwcGVkX2RhdGEgPSAkKGRhdGEpLm5vdCgnZGl2I3NpZGUtdG9vbGJh
cicpOy8vLmZpbmQoJyNuYXZpZ2F0aW9uLXRhYnMnKTsKKy8vICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICQoJyNzaWRlLXRvb2xiYXInKS5odG1sKCQoZGF0YSkuZmluZCgnZGl2LnRv
b2xiYXInKSk7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcjdGFicy1h
bmQtY29udGVudC1jb250YWluZXInKS5odG1sKCQoZGF0YSkubm90KCdkaXYjc2lkZS10b29sYmFy
JykpOworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAvLyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uKHhocikge2FsZXJ0KHhoci5zdGF0
dXMgKyAnICcgKyB4aHIuc3RhdHVzVGV4dCk7fQogLy8gICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICB9KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnI2NvbnRlbnQtYXJlYScp
LmxvYWQodGhpcy5ocmVmLHthamF4OnRydWV9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHZhciBuZXdfaWQgPSAkKHRoaXMpLnBhcmVudCgpLnBhcmVudCgpLmdldCgwKS5pZDsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJ3VsW2NsYXNzPXRhYl9uYXZdIGEnKS5lYWNo
KGZ1bmN0aW9uKCl7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaHJlZiA9
IHRoaXMuaHJlZi5zbGljZSgwLHRoaXMuaHJlZi5sYXN0SW5kZXhPZignLycrMSkpICsgbmV3X2lk
OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAkKCd1bFtjbGFzcz10YWJfbmF2XSBsaScpLmVhY2goZnVuY3Rpb24oKXsKLSAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5yZW1vdmVDbGFzcygnY3VycmVu
dCcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAkKCcjbmF2X3N1bW1hcnknKS5hZGRDbGFzcygnY3VycmVudCcpOworICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy92YXIgbmV3X2lkID0gJCh0aGlzKS5wYXJlbnQo
KS5wYXJlbnQoKS5nZXQoMCkuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3Zh
ciBjdXJyZW50X2UgPSAkKCdzcGFuW2NsYXNzXj1jdXJyZW50X10nKTsKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC8vY3VycmVudF9lLnJlbW92ZUNsYXNzKGN1cnJlbnRfZS5hdHRyKCdj
bGFzcycpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vJCh0aGlzKS5hZGRDbGFz
cygnY3VycmVudF9mb2xkZXInKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdmFy
IG15X2NvbnRhaW5lciA9ICQoY29udGFpbmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKy8vICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworLy8gICAgICAgICAgICAg
ICAgICAgICAgICAgICAgfSk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAkJCWlmICh0
aGlzLmNsYXNzZXMpIHsKZGlmZiAtLWdpdCBhL3d1aS9zcmMvcHVibGljL2phdmFzY3JpcHRzL2px
dWVyeS10cmVldmlldy9vdmlydC50cmVldmlldy5jc3MgYi93dWkvc3JjL3B1YmxpYy9qYXZhc2Ny
aXB0cy9qcXVlcnktdHJlZXZpZXcvb3ZpcnQudHJlZXZpZXcuY3NzCmluZGV4IDJjNGQzODYuLjU4
YTc5MmUgMTAwNjQ0Ci0tLSBhL3d1aS9zcmMvcHVibGljL2phdmFzY3JpcHRzL2pxdWVyeS10cmVl
dmlldy9vdmlydC50cmVldmlldy5jc3MKKysrIGIvd3VpL3NyYy9wdWJsaWMvamF2YXNjcmlwdHMv
anF1ZXJ5LXRyZWV2aWV3L292aXJ0LnRyZWV2aWV3LmNzcwpAQCAtMzEsMTEgKzMxLDEzIEBACiAu
dHJlZXZpZXcgYS5zZWxlY3RlZCB7CiAJYmFja2dyb3VuZC1jb2xvcjogI0RFRTdFQjsKIH0KKy50
cmVldmlldyBhIHt0ZXh0LWRlY29yYXRpb246bm9uZTt9CiAKKy50cmVldmlldyBhOnZpc2l0ZWR7
Y29sb3I6IzAwMDBGRjt9CiAKICN0cmVlY29udHJvbCB7IG1hcmdpbjogMWVtIDA7IGRpc3BsYXk6
IG5vbmU7IH0KIAotLnRyZWV2aWV3IC5ob3ZlciB7IGJhY2tncm91bmQ6I0RFRTdFQjsgY3Vyc29y
OiBwb2ludGVyOyB9CisvKi50cmVldmlldyAuaG92ZXIgeyBiYWNrZ3JvdW5kOiNERUU3RUI7IGN1
cnNvcjogcG9pbnRlcjsgfSovCiAKIC50cmVldmlldyBsaSB7IGJhY2tncm91bmQ6IHVybChpbWFn
ZXMvdHJlZXZpZXctZGVmYXVsdC1saW5lLmdpZikgMCAwIG5vLXJlcGVhdDsgfQogLnRyZWV2aWV3
IGxpLmNvbGxhcHNhYmxlLCAudHJlZXZpZXcgbGkuZXhwYW5kYWJsZSB7IGJhY2tncm91bmQtcG9z
aXRpb246IDAgLTE3NnB4OyB9CkBAIC02NywxMCArNjksMTAgQEAKIC5maWxldHJlZSBzcGFuLmZp
bGUuaG92ZXIgeyBiYWNrZ3JvdW5kOiAjREVFN0VCIHVybChpbWFnZXMvaWNvbl92bXBvb2wucG5n
KSAwIDAgbm8tcmVwZWF0OyB9CiAKIC5jdXJyZW50X2ZvbGRlciwgLmN1cnJlbnRfZm9sZGVyLmhv
dmVyIHsgcGFkZGluZzogNnB4IDBwdCA1cHggMjhweDsgYmFja2dyb3VuZDojNjk4RkE2IHVybChp
bWFnZXMvaWNvbl9oZHdhcmVwb29sLnBuZykgNHB4IDJweCBuby1yZXBlYXQ7IGNvbG9yOiNGRkZG
RkY7IGRpc3BsYXk6YmxvY2s7IH0KLS5jdXJyZW50X2ZvbGRlciBhIHtjb2xvcjojRkZGRkZGOyB9
CisuY3VycmVudF9mb2xkZXIgYSwgLmN1cnJlbnRfZm9sZGVyIGE6dmlzaXRlZCB7Y29sb3I6I0ZG
RkZGRjsgfQogCiAuY3VycmVudF9maWxlLCAuY3VycmVudF9maWxlLmhvdmVyIHsgcGFkZGluZzog
NnB4IDBwdCA1cHggMjhweDsgYmFja2dyb3VuZDojNjk4RkE2IHVybChpbWFnZXMvaWNvbl92bXBv
b2wucG5nKSA0cHggMnB4IG5vLXJlcGVhdDsgY29sb3I6I0ZGRkZGRjsgZGlzcGxheTpibG9jazsg
fQotLmN1cnJlbnRfZmlsZSBhIHtjb2xvcjojRkZGRkZGO30KKy5jdXJyZW50X2ZpbGUgYSwgLmN1
cnJlbnRfZmlsZSBhOnZpc2l0ZWQge2NvbG9yOiNGRkZGRkY7fQogCiAuZGlzYWJsZWRfZm9sZGVy
LCAuZGlzYWJsZWRfZm9sZGVyLmhvdmVyIHsgCiAgICAgcGFkZGluZzogNHB4IDBwdCA1cHggMjRw
eDsgCmRpZmYgLS1naXQgYS93dWkvc3JjL3B1YmxpYy9qYXZhc2NyaXB0cy9qcXVlcnkubGl2ZXF1
ZXJ5LmpzIGIvd3VpL3NyYy9wdWJsaWMvamF2YXNjcmlwdHMvanF1ZXJ5LmxpdmVxdWVyeS5qcwpp
bmRleCBkZmVkOWZlLi5lZTdjNWYxIDEwMDY0NAotLS0gYS93dWkvc3JjL3B1YmxpYy9qYXZhc2Ny
aXB0cy9qcXVlcnkubGl2ZXF1ZXJ5LmpzCisrKyBiL3d1aS9zcmMvcHVibGljL2phdmFzY3JpcHRz
L2pxdWVyeS5saXZlcXVlcnkuanMKQEAgLTIsNyArMiw3IEBACiAgKiBEdWFsIGxpY2Vuc2VkIHVu
ZGVyIHRoZSBNSVQgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vu
c2UucGhwKSAKICAqIGFuZCBHUEwgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMv
Z3BsLWxpY2Vuc2UucGhwKSBsaWNlbnNlcy4KICAqCi0gKiBWZXJzaW9uOiBAVkVSU0lPTgorICog
VmVyc2lvbjogMS4wLjIKICAqIFJlcXVpcmVzIGpRdWVyeSAxLjEuMysKICAqIERvY3M6IGh0dHA6
Ly9kb2NzLmpxdWVyeS5jb20vUGx1Z2lucy9saXZlcXVlcnkKICAqLwpkaWZmIC0tZ2l0IGEvd3Vp
L3NyYy9wdWJsaWMvamF2YXNjcmlwdHMvanF1ZXJ5LmxpdmVxdWVyeS5taW4uanMgYi93dWkvc3Jj
L3B1YmxpYy9qYXZhc2NyaXB0cy9qcXVlcnkubGl2ZXF1ZXJ5Lm1pbi5qcwpuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTNiNGQzCi0tLSAvZGV2L251bGwKKysrIGIvd3VpL3Ny
Yy9wdWJsaWMvamF2YXNjcmlwdHMvanF1ZXJ5LmxpdmVxdWVyeS5taW4uanMKQEAgLTAsMCArMSwx
MSBAQAorLyogQ29weXJpZ2h0IChjKSAyMDA3IEJyYW5kb24gQWFyb24gKGJyYW5kb24uYWFyb25A
Z21haWwuY29tIHx8IGh0dHA6Ly9icmFuZG9uYWFyb24ubmV0KQorICogRHVhbCBsaWNlbnNlZCB1
bmRlciB0aGUgTUlUIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNl
bnNlLnBocCkgCisgKiBhbmQgR1BMIChodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2Vz
L2dwbC1saWNlbnNlLnBocCkgbGljZW5zZXMuCisgKgorICogVmVyc2lvbjogMS4wLjIKKyAqIFJl
cXVpcmVzIGpRdWVyeSAxLjEuMysKKyAqIERvY3M6IGh0dHA6Ly9kb2NzLmpxdWVyeS5jb20vUGx1
Z2lucy9saXZlcXVlcnkKKyAqLworKGZ1bmN0aW9uKCQpeyQuZXh0ZW5kKCQuZm4se2xpdmVxdWVy
eTpmdW5jdGlvbih0eXBlLGZuLGZuMil7dmFyIHNlbGY9dGhpcyxxO2lmKCQuaXNGdW5jdGlvbih0
eXBlKSlmbjI9Zm4sZm49dHlwZSx0eXBlPXVuZGVmaW5lZDskLmVhY2goJC5saXZlcXVlcnkucXVl
cmllcyxmdW5jdGlvbihpLHF1ZXJ5KXtpZihzZWxmLnNlbGVjdG9yPT1xdWVyeS5zZWxlY3RvciYm
c2VsZi5jb250ZXh0PT1xdWVyeS5jb250ZXh0JiZ0eXBlPT1xdWVyeS50eXBlJiYoIWZufHxmbi4k
bHFndWlkPT1xdWVyeS5mbi4kbHFndWlkKSYmKCFmbjJ8fGZuMi4kbHFndWlkPT1xdWVyeS5mbjIu
JGxxZ3VpZCkpcmV0dXJuKHE9cXVlcnkpJiZmYWxzZTt9KTtxPXF8fG5ldyAkLmxpdmVxdWVyeSh0
aGlzLnNlbGVjdG9yLHRoaXMuY29udGV4dCx0eXBlLGZuLGZuMik7cS5zdG9wcGVkPWZhbHNlOyQu
bGl2ZXF1ZXJ5LnJ1bihxLmlkKTtyZXR1cm4gdGhpczt9LGV4cGlyZTpmdW5jdGlvbih0eXBlLGZu
LGZuMil7dmFyIHNlbGY9dGhpcztpZigkLmlzRnVuY3Rpb24odHlwZSkpZm4yPWZuLGZuPXR5cGUs
dHlwZT11bmRlZmluZWQ7JC5lYWNoKCQubGl2ZXF1ZXJ5LnF1ZXJpZXMsZnVuY3Rpb24oaSxxdWVy
eSl7aWYoc2VsZi5zZWxlY3Rvcj09cXVlcnkuc2VsZWN0b3ImJnNlbGYuY29udGV4dD09cXVlcnku
Y29udGV4dCYmKCF0eXBlfHx0eXBlPT1xdWVyeS50eXBlKSYmKCFmbnx8Zm4uJGxxZ3VpZD09cXVl
cnkuZm4uJGxxZ3VpZCkmJighZm4yfHxmbjIuJGxxZ3VpZD09cXVlcnkuZm4yLiRscWd1aWQpJiYh
dGhpcy5zdG9wcGVkKSQubGl2ZXF1ZXJ5LnN0b3AocXVlcnkuaWQpO30pO3JldHVybiB0aGlzO319
KTskLmxpdmVxdWVyeT1mdW5jdGlvbihzZWxlY3Rvcixjb250ZXh0LHR5cGUsZm4sZm4yKXt0aGlz
LnNlbGVjdG9yPXNlbGVjdG9yO3RoaXMuY29udGV4dD1jb250ZXh0fHxkb2N1bWVudDt0aGlzLnR5
cGU9dHlwZTt0aGlzLmZuPWZuO3RoaXMuZm4yPWZuMjt0aGlzLmVsZW1lbnRzPVtdO3RoaXMuc3Rv
cHBlZD1mYWxzZTt0aGlzLmlkPSQubGl2ZXF1ZXJ5LnF1ZXJpZXMucHVzaCh0aGlzKS0xO2ZuLiRs
cWd1aWQ9Zm4uJGxxZ3VpZHx8JC5saXZlcXVlcnkuZ3VpZCsrO2lmKGZuMilmbjIuJGxxZ3VpZD1m
bjIuJGxxZ3VpZHx8JC5saXZlcXVlcnkuZ3VpZCsrO3JldHVybiB0aGlzO307JC5saXZlcXVlcnku
cHJvdG90eXBlPXtzdG9wOmZ1bmN0aW9uKCl7dmFyIHF1ZXJ5PXRoaXM7aWYodGhpcy50eXBlKXRo
aXMuZWxlbWVudHMudW5iaW5kKHRoaXMudHlwZSx0aGlzLmZuKTtlbHNlIGlmKHRoaXMuZm4yKXRo
aXMuZWxlbWVudHMuZWFjaChmdW5jdGlvbihpLGVsKXtxdWVyeS5mbjIuYXBwbHkoZWwpO30pO3Ro
aXMuZWxlbWVudHM9W107dGhpcy5zdG9wcGVkPXRydWU7fSxydW46ZnVuY3Rpb24oKXtpZih0aGlz
LnN0b3BwZWQpcmV0dXJuO3ZhciBxdWVyeT10aGlzO3ZhciBvRWxzPXRoaXMuZWxlbWVudHMsZWxz
PSQodGhpcy5zZWxlY3Rvcix0aGlzLmNvbnRleHQpLG5FbHM9ZWxzLm5vdChvRWxzKTt0aGlzLmVs
ZW1lbnRzPWVscztpZih0aGlzLnR5cGUpe25FbHMuYmluZCh0aGlzLnR5cGUsdGhpcy5mbik7aWYo
b0Vscy5sZW5ndGg+MCkkLmVhY2gob0VscyxmdW5jdGlvbihpLGVsKXtpZigkLmluQXJyYXkoZWws
ZWxzKTwwKSQuZXZlbnQucmVtb3ZlKGVsLHF1ZXJ5LnR5cGUscXVlcnkuZm4pO30pO31lbHNle25F
bHMuZWFjaChmdW5jdGlvbigpe3F1ZXJ5LmZuLmFwcGx5KHRoaXMpO30pO2lmKHRoaXMuZm4yJiZv
RWxzLmxlbmd0aD4wKSQuZWFjaChvRWxzLGZ1bmN0aW9uKGksZWwpe2lmKCQuaW5BcnJheShlbCxl
bHMpPDApcXVlcnkuZm4yLmFwcGx5KGVsKTt9KTt9fX07JC5leHRlbmQoJC5saXZlcXVlcnkse2d1
aWQ6MCxxdWVyaWVzOltdLHF1ZXVlOltdLHJ1bm5pbmc6ZmFsc2UsdGltZW91dDpudWxsLGNoZWNr
UXVldWU6ZnVuY3Rpb24oKXtpZigkLmxpdmVxdWVyeS5ydW5uaW5nJiYkLmxpdmVxdWVyeS5xdWV1
ZS5sZW5ndGgpe3ZhciBsZW5ndGg9JC5saXZlcXVlcnkucXVldWUubGVuZ3RoO3doaWxlKGxlbmd0
aC0tKSQubGl2ZXF1ZXJ5LnF1ZXJpZXNbJC5saXZlcXVlcnkucXVldWUuc2hpZnQoKV0ucnVuKCk7
fX0scGF1c2U6ZnVuY3Rpb24oKXskLmxpdmVxdWVyeS5ydW5uaW5nPWZhbHNlO30scGxheTpmdW5j
dGlvbigpeyQubGl2ZXF1ZXJ5LnJ1bm5pbmc9dHJ1ZTskLmxpdmVxdWVyeS5ydW4oKTt9LHJlZ2lz
dGVyUGx1Z2luOmZ1bmN0aW9uKCl7JC5lYWNoKGFyZ3VtZW50cyxmdW5jdGlvbihpLG4pe2lmKCEk
LmZuW25dKXJldHVybjt2YXIgb2xkPSQuZm5bbl07JC5mbltuXT1mdW5jdGlvbigpe3ZhciByPW9s
ZC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7JC5saXZlcXVlcnkucnVuKCk7cmV0dXJuIHI7fX0pO30s
cnVuOmZ1bmN0aW9uKGlkKXtpZihpZCE9dW5kZWZpbmVkKXtpZigkLmluQXJyYXkoaWQsJC5saXZl
cXVlcnkucXVldWUpPDApJC5saXZlcXVlcnkucXVldWUucHVzaChpZCk7fWVsc2UKKyQuZWFjaCgk
LmxpdmVxdWVyeS5xdWVyaWVzLGZ1bmN0aW9uKGlkKXtpZigkLmluQXJyYXkoaWQsJC5saXZlcXVl
cnkucXVldWUpPDApJC5saXZlcXVlcnkucXVldWUucHVzaChpZCk7fSk7aWYoJC5saXZlcXVlcnku
dGltZW91dCljbGVhclRpbWVvdXQoJC5saXZlcXVlcnkudGltZW91dCk7JC5saXZlcXVlcnkudGlt
ZW91dD1zZXRUaW1lb3V0KCQubGl2ZXF1ZXJ5LmNoZWNrUXVldWUsMjApO30sc3RvcDpmdW5jdGlv
bihpZCl7aWYoaWQhPXVuZGVmaW5lZCkkLmxpdmVxdWVyeS5xdWVyaWVzW2lkXS5zdG9wKCk7ZWxz
ZQorJC5lYWNoKCQubGl2ZXF1ZXJ5LnF1ZXJpZXMsZnVuY3Rpb24oaWQpeyQubGl2ZXF1ZXJ5LnF1
ZXJpZXNbaWRdLnN0b3AoKTt9KTt9fSk7JC5saXZlcXVlcnkucmVnaXN0ZXJQbHVnaW4oJ2FwcGVu
ZCcsJ3ByZXBlbmQnLCdhZnRlcicsJ2JlZm9yZScsJ3dyYXAnLCdhdHRyJywncmVtb3ZlQXR0cics
J2FkZENsYXNzJywncmVtb3ZlQ2xhc3MnLCd0b2dnbGVDbGFzcycsJ2VtcHR5JywncmVtb3ZlJyk7
JChmdW5jdGlvbigpeyQubGl2ZXF1ZXJ5LnBsYXkoKTt9KTt2YXIgaW5pdD0kLnByb3RvdHlwZS5p
bml0OyQucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oYSxjKXt2YXIgcj1pbml0LmFwcGx5KHRoaXMs
YXJndW1lbnRzKTtpZihhJiZhLnNlbGVjdG9yKXIuY29udGV4dD1hLmNvbnRleHQsci5zZWxlY3Rv
cj1hLnNlbGVjdG9yO2lmKHR5cGVvZiBhPT0nc3RyaW5nJylyLmNvbnRleHQ9Y3x8ZG9jdW1lbnQs
ci5zZWxlY3Rvcj1hO3JldHVybiByO307JC5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGU9JC5wcm90
b3R5cGU7fSkoalF1ZXJ5KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQg
YS93dWkvc3JjL3B1YmxpYy9qYXZhc2NyaXB0cy9qcXVlcnkubGl2ZXF1ZXJ5LnBhY2suanMgYi93
dWkvc3JjL3B1YmxpYy9qYXZhc2NyaXB0cy9qcXVlcnkubGl2ZXF1ZXJ5LnBhY2suanMKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ4NTY1NwotLS0gL2Rldi9udWxsCisrKyBi
L3d1aS9zcmMvcHVibGljL2phdmFzY3JpcHRzL2pxdWVyeS5saXZlcXVlcnkucGFjay5qcwpAQCAt
MCwwICsxLDkgQEAKKy8qIENvcHlyaWdodCAoYykgMjAwNyBCcmFuZG9uIEFhcm9uIChicmFuZG9u
LmFhcm9uQGdtYWlsLmNvbSB8fCBodHRwOi8vYnJhbmRvbmFhcm9uLm5ldCkKKyAqIER1YWwgbGlj
ZW5zZWQgdW5kZXIgdGhlIE1JVCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9t
aXQtbGljZW5zZS5waHApIAorICogYW5kIEdQTCAoaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9s
aWNlbnNlcy9ncGwtbGljZW5zZS5waHApIGxpY2Vuc2VzLgorICoKKyAqIFZlcnNpb246IDEuMC4y
CisgKiBSZXF1aXJlcyBqUXVlcnkgMS4xLjMrCisgKiBEb2NzOiBodHRwOi8vZG9jcy5qcXVlcnku
Y29tL1BsdWdpbnMvbGl2ZXF1ZXJ5CisgKi8KK2V2YWwoZnVuY3Rpb24ocCxhLGMsayxlLHIpe2U9
ZnVuY3Rpb24oYyl7cmV0dXJuKGM8YT8nJzplKHBhcnNlSW50KGMvYSkpKSsoKGM9YyVhKT4zNT9T
dHJpbmcuZnJvbUNoYXJDb2RlKGMrMjkpOmMudG9TdHJpbmcoMzYpKX07aWYoIScnLnJlcGxhY2Uo
L14vLFN0cmluZykpe3doaWxlKGMtLSlyW2UoYyldPWtbY118fGUoYyk7az1bZnVuY3Rpb24oZSl7
cmV0dXJuIHJbZV19XTtlPWZ1bmN0aW9uKCl7cmV0dXJuJ1xcdysnfTtjPTF9O3doaWxlKGMtLSlp
ZihrW2NdKXA9cC5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcYicrZShjKSsnXFxiJywnZycpLGtbY10p
O3JldHVybiBwfSgnKDQoJCl7JC5SKCQuNyx7Mzo0KGMsYixkKXs5IGU9MixxOzUoJC5PKGMpKWQ9
YixiPWMsYz16OyQuaCgkLjMuaiw0KGksYSl7NShlLjg9PWEuOCYmZS5nPT1hLmcmJmM9PWEubSYm
KCFifHxiLiQ2PT1hLjcuJDYpJiYoIWR8fGQuJDY9PWEuby4kNikpbChxPWEpJiZ2fSk7cT1xfHxZ
ICQuMygyLjgsMi5nLGMsYixkKTtxLnU9djskLjMucyhxLkYpO2wgMn0sVDo0KGMsYixkKXs5IGU9
Mjs1KCQuTyhjKSlkPWIsYj1jLGM9ejskLmgoJC4zLmosNChpLGEpezUoZS44PT1hLjgmJmUuZz09
YS5nJiYoIWN8fGM9PWEubSkmJighYnx8Yi4kNj09YS43LiQ2KSYmKCFkfHxkLiQ2PT1hLm8uJDYp
JiYhMi51KSQuMy55KGEuRil9KTtsIDJ9fSk7JC4zPTQoZSxjLGEsYixkKXsyLjg9ZTsyLmc9Y3x8
UzsyLm09YTsyLjc9YjsyLm89ZDsyLnQ9W107Mi51PXY7Mi5GPSQuMy5qLksoMiktMTtiLiQ2PWIu
JDZ8fCQuMy5JKys7NShkKWQuJDY9ZC4kNnx8JC4zLkkrKztsIDJ9OyQuMy5wPXt5OjQoKXs5IGI9
Mjs1KDIubSkyLnQuMTYoMi5tLDIuNyk7RSA1KDIubykyLnQuaCg0KGksYSl7Yi5vLngoYSl9KTsy
LnQ9W107Mi51PVF9LHM6NCgpezUoMi51KWw7OSBiPTI7OSBjPTIudCx3PSQoMi44LDIuZyksSD13
LjExKGMpOzIudD13OzUoMi5tKXtILjEwKDIubSwyLjcpOzUoYy5DPjApJC5oKGMsNChpLGEpezUo
JC5CKGEsdyk8MCkkLlouUChhLGIubSxiLjcpfSl9RXtILmgoNCgpe2IuNy54KDIpfSk7NSgyLm8m
JmMuQz4wKSQuaChjLDQoaSxhKXs1KCQuQihhLHcpPDApYi5vLngoYSl9KX19fTskLlIoJC4zLHtJ
OjAsajpbXSxrOltdLEE6dixEOlgsTjo0KCl7NSgkLjMuQSYmJC4zLmsuQyl7OSBhPSQuMy5rLkM7
VyhhLS0pJC4zLmpbJC4zLmsuVigpXS5zKCl9fSxVOjQoKXskLjMuQT12fSxNOjQoKXskLjMuQT1R
OyQuMy5zKCl9LEw6NCgpeyQuaChHLDQoaSxuKXs1KCEkLjdbbl0pbDs5IGE9JC43W25dOyQuN1tu
XT00KCl7OSByPWEueCgyLEcpOyQuMy5zKCk7bCByfX0pfSxzOjQoYil7NShiIT16KXs1KCQuQihi
LCQuMy5rKTwwKSQuMy5rLksoYil9RSAkLmgoJC4zLmosNChhKXs1KCQuQihhLCQuMy5rKTwwKSQu
My5rLksoYSl9KTs1KCQuMy5EKTFqKCQuMy5EKTskLjMuRD0xaSgkLjMuTiwxaCl9LHk6NChiKXs1
KGIhPXopJC4zLmpbYl0ueSgpO0UgJC5oKCQuMy5qLDQoYSl7JC4zLmpbYV0ueSgpfSl9fSk7JC4z
LkwoXCcxZ1wnLFwnMWZcJyxcJzFlXCcsXCcxYlwnLFwnMWFcJyxcJzE5XCcsXCcxOFwnLFwnMTdc
JyxcJzFjXCcsXCcxNVwnLFwnMWRcJyxcJ1BcJyk7JCg0KCl7JC4zLk0oKX0pOzkgZj0kLnAuSjsk
LnAuSj00KGEsYyl7OSByPWYueCgyLEcpOzUoYSYmYS44KXIuZz1hLmcsci44PWEuODs1KDE0IGE9
PVwnMTNcJylyLmc9Y3x8UyxyLjg9YTtsIHJ9OyQucC5KLnA9JC5wfSkoMTIpOycsNjIsODIsJ3x8
dGhpc3xsaXZlcXVlcnl8ZnVuY3Rpb258aWZ8bHFndWlkfGZufHNlbGVjdG9yfHZhcnx8fHx8fHxj
b250ZXh0fGVhY2h8fHF1ZXJpZXN8cXVldWV8cmV0dXJufHR5cGV8fGZuMnxwcm90b3R5cGV8fHxy
dW58ZWxlbWVudHN8c3RvcHBlZHxmYWxzZXxlbHN8YXBwbHl8c3RvcHx1bmRlZmluZWR8cnVubmlu
Z3xpbkFycmF5fGxlbmd0aHx0aW1lb3V0fGVsc2V8aWR8YXJndW1lbnRzfG5FbHN8Z3VpZHxpbml0
fHB1c2h8cmVnaXN0ZXJQbHVnaW58cGxheXxjaGVja1F1ZXVlfGlzRnVuY3Rpb258cmVtb3ZlfHRy
dWV8ZXh0ZW5kfGRvY3VtZW50fGV4cGlyZXxwYXVzZXxzaGlmdHx3aGlsZXxudWxsfG5ld3xldmVu
dHxiaW5kfG5vdHxqUXVlcnl8c3RyaW5nfHR5cGVvZnx0b2dnbGVDbGFzc3x1bmJpbmR8YWRkQ2xh
c3N8cmVtb3ZlQXR0cnxhdHRyfHdyYXB8YmVmb3JlfHJlbW92ZUNsYXNzfGVtcHR5fGFmdGVyfHBy
ZXBlbmR8YXBwZW5kfDIwfHNldFRpbWVvdXR8Y2xlYXJUaW1lb3V0Jy5zcGxpdCgnfCcpLDAse30p
KQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKLS0gCjEuNS40LjEKCi==


--=-FeeZJ3ybHM80BpIC4CGc
Content-Disposition: attachment; filename=0003-facebox.close-not-needed-anywhere.patch
Content-Type: application/mbox; name=0003-facebox.close-not-needed-anywhere.patch
Content-Transfer-Encoding: 7bit




More information about the ovirt-devel mailing list