contifier bug

Matthew Fluet fluet@CS.Cornell.EDU
Fri, 23 Feb 2001 11:54:38 -0500 (EST)


  This message is in MIME format.  The first part should be readable text,
  while the remaining parts are likely unreadable without MIME-aware tools.
  Send mail to mime@docserver.cac.washington.edu for more info.

---559023410-959030623-982947278=:24077
Content-Type: TEXT/PLAIN; charset=US-ASCII


> > The new contifier appears to have a bug (or two).  In trying to run it on the
> > kit benchmark, I get an unhandled Option exception during transform when using
> > the Dom contify strategy, and I get an apparently bogus expression when using
> > the CallCont contify strategy.  The latter I conclude because the shrinker
> > complains.
> 
> O.k.  I'll take a look at them.

The transformation code had a small bug in handling uncontifiable sccs;
it's fixed now.  Here are the results for kit (using G0 mlton, so the
times are a little high):

	 contify starting
	    initReachCallerCallees starting
	    initReachCallerCallees finished in 1.020
	    analyzeCall starting
	    analyzeCall finished in 0.150
	    analyzeCont starting
	    analyzeCont finished in 0.180
	    analyzeDom starting
	       buildGraph starting
	       buildGraph finished in 1.360
	       computeDominators starting
	       computeDominators finished in 2.860
	       compute ADom starting
	       compute ADom finished in 0.040
	    analyzeDom finished in 4.370
	    diagnostics starting
functions: 7692
  call_cont_dom: 2808  call_cont: 0
  call_dom: 548  cont_dom: 329
  call: 0  cont: 0  dom: 264
  rem_call_cont_dom: 3  rem_call_cont: 0
  rem_call_dom: 0  rem_cont_dom: 0
  rem_call: 0  rem_cont: 0  rem_dom: 0
	    diagnostics finished in 0.020
	    transform starting
	    transform finished in 27.140
	 contify finished in 33.260
	 num functions 3746
	 num local functions 73593
	 num primExps 147948

So, 7692 - (2808 + 548 + 329 + 264 + 3) = 3740, but there are 3746
functions after contification.  That means there is some group of mutually
recursive functions that couldn't be nested and, all told, they are
preventing 6 functions from being contified.  I didn't look at the cps or
the call graphs to see what is really going on.

	 contify starting
	    initReachCallerCallees starting
	    initReachCallerCallees finished in 0.570
	    analyzeCall starting
	    analyzeCall finished in 0.190
	    analyzeCont starting
	    analyzeCont finished in 0.150
	    analyzeDom starting
	       buildGraph starting
	       buildGraph finished in 1.030
	       computeDominators starting
	       computeDominators finished in 2.320
	       compute ADom starting
	       compute ADom finished in 0.010
	    analyzeDom finished in 3.450
	    diagnostics starting
functions: 3685
  call_cont_dom: 37  call_cont: 0
  call_dom: 3  cont_dom: 6
  call: 0  cont: 0  dom: 1
  rem_call_cont_dom: 0  rem_call_cont: 0
  rem_call_dom: 0  rem_cont_dom: 0
  rem_call: 0  rem_cont: 0  rem_dom: 0
	    diagnostics finished in 0.000
	    transform starting
	    transform finished in 17.460
	 contify finished in 22.080
	 num functions 3644
	 num local functions 57065
	 num primExps 97883

Here we have: 3685 - (37 + 3 + 6 + 1) = 3638, but there 3644 functions at
the end.  Again, 6 uncontifiable functions.

	 contify starting
	    initReachCallerCallees starting
	    initReachCallerCallees finished in 0.420
	    analyzeCall starting
	    analyzeCall finished in 0.150
	    analyzeCont starting
	    analyzeCont finished in 0.150
	    analyzeDom starting
	       buildGraph starting
	       buildGraph finished in 0.890
	       computeDominators starting
	       computeDominators finished in 3.480
	       compute ADom starting
	       compute ADom finished in 0.010
	    analyzeDom finished in 4.440
	    diagnostics starting
functions: 1620
  call_cont_dom: 0  call_cont: 0
  call_dom: 0  cont_dom: 5
  call: 0  cont: 0  dom: 0
  rem_call_cont_dom: 0  rem_call_cont: 0
  rem_call_dom: 0  rem_cont_dom: 0
  rem_call: 0  rem_cont: 0  rem_dom: 0
	    diagnostics finished in 0.000
	    transform starting
	    transform finished in 28.660
	 contify finished in 34.210
	 num functions 1620
	 num local functions 76116
	 num primExps 163200

Last pass the 5 cont_dom functions aren't contified.  My guess is that one
of the 6 functions was inlined in multiple locations.




---559023410-959030623-982947278=:24077
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="contify.fun"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.SOL.3.95.1010223115437.24077C@hoho.cs.cornell.edu>
Content-Description: 

KCogQ29weXJpZ2h0IChDKSAxOTk3LTE5OTkgTkVDIFJlc2VhcmNoIEluc3RpdHV0ZS4NCiAqIFBs
ZWFzZSBzZWUgdGhlIGZpbGUgTElDRU5TRSBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4NCiAqKQ0K
KCoNCiAqIFRoaXMgcGFzcyBjb21iaW5lcyB0d28gYW5hbHlzZXMgYW5kIHRyYW5zZm9ybWF0aW9u
cy4NCiAqDQogKiBUaGUgZmlyc3QgYW5hbHlzaXMsICJjYWxsIGJhc2VkIiBub3RpY2VzIGlmIGEg
dG9wbGV2ZWwgZnVuY3Rpb24gaXMgY2FsbGVkDQogKiAgICAgICAxLiBmcm9tIG9uZSBwbGFjZSBv
dXRzaWRlIGl0c2VsZg0KICogICBhbmQgMi4gYWxsIGNhbGxzIHRvIGl0c2VsZiB3aXRoaW4gaXRz
ZWxmIGFyZSB0YWlsDQogKiBJZiAoMSkgYW5kICgyKSBhcmUgdHJ1ZSwgdGhlbiB0aGF0IGZ1bmN0
aW9uIGNhbiBiZSBtYWRlIGxvY2FsIGF0IHRoZSBwb2ludA0KICogb2YgaXRzIG91dGVyIGNhbGwu
DQogKg0KICogVGhlIHNlY29uZCBhbmFseXNpcyBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHBh
cGVyLg0KICogICBMb2NhbCBDUFMgY29udmVyc2lvbiBpbiBhIGRpcmVjdC1zdHlsZSBjb21waWxl
ci4gIEpvaG4gUmVwcHkuDQogKiBJdCBkZXRlcm1pbmVzIHRoZSBzZXQgb2YgY29udGludWF0aW9u
cyB0aGF0IGEgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGguICBJZg0KICogdGhhdCBzZXQgaXMgYSBz
aW5nbGV0b24sIHRoZW4gdGhlIGZ1bmN0aW9uIGNhbiBiZSBwcmVmaXhlZCBvbnRvIHRoZQ0KICog
Y29udGludWF0aW9uIGl0IGlzIGNhbGxlZCB3aXRoLg0KICopDQoNCmZ1bmN0b3IgQ29udGlmeSAo
UzogQ09OVElGWV9TVFJVQ1RTKTogQ09OVElGWSA9IA0Kc3RydWN0DQoNCm9wZW4gUw0Kb3BlbiBE
ZWMgVHJhbnNmZXINCg0KKCogUmV0dXJuID0ge1VuY2FsbGVkLCBVbmtub3dufSBVIEp1bXAgVSBG
dW5jDQogKikNCnN0cnVjdHVyZSBSZXR1cm4gPQ0KICBzdHJ1Y3QNCiAgICBkYXRhdHlwZSB0DQog
ICAgICA9IFVuY2FsbGVkDQogICAgICB8IFVua25vd24NCiAgICAgIHwgSnVtcExhYmVsIG9mIEp1
bXAudA0KICAgICAgfCBGdW5jTGFiZWwgb2YgRnVuYy50DQoNCiAgICBmdW4gbGF5b3V0IHINCiAg
ICAgID0gbGV0IA0KCSAgb3BlbiBMYXlvdXQNCglpbg0KCSAgY2FzZSByDQoJICAgIG9mIFVuY2Fs
bGVkID0+IHN0ciAiVW5jYWxsZWQiDQoJICAgICB8IFVua25vd24gPT4gc3RyICJVbmtub3duIg0K
CSAgICAgfCBKdW1wTGFiZWwgaiA9PiBzZXEgW0p1bXAubGF5b3V0IGpdDQoJICAgICB8IEZ1bmNM
YWJlbCBmID0+IHNlcSBbRnVuYy5sYXlvdXQgZl0NCgllbmQNCiAgICB2YWwgdG9TdHJpbmcgPSBM
YXlvdXQudG9TdHJpbmcgbyBsYXlvdXQNCiAgICAgIA0KICAgIHZhbCBlcXVhbHMNCiAgICAgID0g
Zm4gKFVuY2FsbGVkLCBVbmNhbGxlZCkgPT4gdHJ1ZQ0KICAgICAgICAgfCAoVW5rbm93biwgVW5r
bm93bikgPT4gdHJ1ZQ0KCSB8IChKdW1wTGFiZWwgajEsIEp1bXBMYWJlbCBqMikgPT4gSnVtcC5l
cXVhbHMoajEsIGoyKQ0KCSB8IChGdW5jTGFiZWwgZjEsIEZ1bmNMYWJlbCBmMikgPT4gRnVuYy5l
cXVhbHMoZjEsIGYyKQ0KCSB8IF8gPT4gZmFsc2UNCg0KICAgIHZhbCBpc1VuY2FsbGVkIA0KICAg
ICAgPSBmbiBVbmNhbGxlZCA9PiB0cnVlDQogICAgICAgICB8IF8gPT4gZmFsc2UNCiAgICB2YWwg
aXNVbmtub3duDQogICAgICA9IGZuIFVua25vd24gPT4gdHJ1ZQ0KICAgICAgICAgfCBfID0+IGZh
bHNlDQogIGVuZA0KDQpkYXRhdHlwZSBzdGF0dXMgPSBUT0RPIHwgQ1VSUkVOVCB8IERPTkUNCg0K
c3RydWN0dXJlIEp1bXBEYXRhID0NCiAgc3RydWN0DQogICAgZGF0YXR5cGUgdCA9IFQgb2Yge25v
ZGU6IERpcmVjdGVkR3JhcGguTm9kZS50IG9wdGlvbiByZWYsDQoJCSAgICAgICByb290RWRnZTog
Ym9vbCByZWYsDQoJCSAgICAgICBzdGF0dXM6IHN0YXR1cyByZWYsDQoJCSAgICAgICBwcmVmaXhl
czogRnVuYy50IGxpc3QgcmVmfQ0KICAgICAgDQogICAgZnVuIG5ldyAoKSA9IFQge25vZGUgPSBy
ZWYgTk9ORSwNCgkJICAgIHJvb3RFZGdlID0gcmVmIGZhbHNlLA0KCQkgICAgc3RhdHVzID0gcmVm
IFRPRE8sDQoJCSAgICBwcmVmaXhlcyA9IHJlZiBbXX0NCg0KICAgIGxvY2FsDQogICAgICBmdW4g
bWFrZSBzID0gbGV0DQoJCSAgICAgZnVuIFMnIChUIHIpID0gcyByDQoJCSAgICAgdmFsIFMgPSAh
IG8gUycNCgkJICAgaW4NCgkJICAgICAoUycsIFMpDQoJCSAgIGVuZA0KICAgIGluDQogICAgICB2
YWwgKG5vZGUnLCBub2RlKSA9IG1ha2UgI25vZGUNCiAgICAgIHZhbCAocm9vdEVkZ2UnLCByb290
RWRnZSkgPSBtYWtlICNyb290RWRnZQ0KICAgICAgdmFsIChzdGF0dXMnLCBzdGF0dXMpID0gbWFr
ZSAjc3RhdHVzDQogICAgICB2YWwgKHByZWZpeGVzJywgcHJlZml4ZXMpID0gbWFrZSAjcHJlZml4
ZXMNCiAgICBlbmQNCiAgICBmdW4gbm9kZVJlc2V0IChUIHtub2RlLCAuLi59KSA9IG5vZGUgOj0g
Tk9ORQ0KICBlbmQNCg0Kc3RydWN0dXJlIEZ1bmNEYXRhID0NCiAgc3RydWN0DQogICAgZGF0YXR5
cGUgdCA9IFQgb2Yge25vZGU6IERpcmVjdGVkR3JhcGguTm9kZS50IG9wdGlvbiByZWYsDQoJCSAg
ICAgICByZWFjaDogYm9vbCByZWYsDQoJCSAgICAgICBjYWxsZXJzOiB7bm9udGFpbDogKEZ1bmMu
dCAqIEp1bXAudCkgbGlzdCByZWYsDQoJCQkJIHRhaWw6IEZ1bmMudCBsaXN0IHJlZn0sDQoJCSAg
ICAgICBjYWxsZWVzOiB7bm9udGFpbDogKEZ1bmMudCAqIEp1bXAudCkgbGlzdCByZWYsDQoJCQkJ
IHRhaWw6IEZ1bmMudCBsaXN0IHJlZn0sDQoJCSAgICAgICBBOiBSZXR1cm4udCByZWYsDQoJCSAg
ICAgICBBQ2FsbDogUmV0dXJuLnQgcmVmLA0KCQkgICAgICAgbGVzc1RoYW46IEZ1bmMudCBsaXN0
IHJlZiwNCgkJICAgICAgIEFDb250OiBSZXR1cm4udCByZWYsDQoJCSAgICAgICBBRG9tOiBSZXR1
cm4udCByZWYsDQoJCSAgICAgICBjb250aWZ5OiBib29sIHJlZiwNCgkJICAgICAgIHN0YXR1czog
c3RhdHVzIHJlZiwNCgkJICAgICAgIHByZWZpeGVzOiBGdW5jLnQgbGlzdCByZWYsDQoJCSAgICAg
ICByZXBsYWNlOiB7YXJnczogKFZhci50ICogVHlwZS50KSB2ZWN0b3IsDQoJCQkJIGJvZHk6IEV4
cC50LA0KCQkJCSBqdW1wOiBKdW1wLnR9IG9wdGlvbiByZWZ9DQogICAgICANCiAgICBmdW4gbmV3
ICgpID0gVCB7bm9kZSA9IHJlZiBOT05FLA0KCQkgICAgcmVhY2ggPSByZWYgZmFsc2UsDQoJCSAg
ICBjYWxsZXJzID0ge25vbnRhaWwgPSByZWYgW10sIHRhaWwgPSByZWYgW119LA0KCQkgICAgY2Fs
bGVlcyA9IHtub250YWlsID0gcmVmIFtdLCB0YWlsID0gcmVmIFtdfSwNCgkJICAgIEEgPSByZWYg
UmV0dXJuLlVuY2FsbGVkLA0KCQkgICAgQUNhbGwgPSByZWYgUmV0dXJuLlVuY2FsbGVkLA0KCQkg
ICAgbGVzc1RoYW4gPSByZWYgW10sDQoJCSAgICBBQ29udCA9IHJlZiBSZXR1cm4uVW5jYWxsZWQs
DQoJCSAgICBBRG9tID0gcmVmIFJldHVybi5VbmNhbGxlZCwNCgkJICAgIGNvbnRpZnkgPSByZWYg
dHJ1ZSwNCgkJICAgIHN0YXR1cyA9IHJlZiBUT0RPLA0KCQkgICAgcHJlZml4ZXMgPSByZWYgW10s
DQoJCSAgICByZXBsYWNlID0gcmVmIE5PTkV9DQogICAgICANCiAgICBsb2NhbA0KICAgICAgZnVu
IG1ha2UgcyA9IGxldA0KCQkgICAgIGZ1biBTJyAoVCByKSA9IHMgcg0KCQkgICAgIHZhbCBTID0g
ISBvIFMnDQoJCSAgIGluDQoJCSAgICAgKFMnLCBTKQ0KCQkgICBlbmQNCiAgICAgIGZ1biBtYWtl
JyBzID0gbGV0DQoJCSAgICAgIGZ1biBTJyAoVCByKSA9IHMgcg0KCQkgICAgaW4NCgkJICAgICAg
UycNCgkJICAgIGVuZA0KICAgIGluDQogICAgICB2YWwgKG5vZGUnLCBub2RlKSA9IG1ha2UgI25v
ZGUNCiAgICAgIHZhbCAocmVhY2gnLCByZWFjaCkgPSBtYWtlICNyZWFjaA0KICAgICAgdmFsIGNh
bGxlcnMnID0gbWFrZScgI2NhbGxlcnMNCiAgICAgIHZhbCBjYWxsZWVzJyA9IG1ha2UnICNjYWxs
ZWVzDQogICAgICB2YWwgKEEnLCBBKSA9IG1ha2UgI0ENCiAgICAgIHZhbCAoQUNhbGwnLCBBQ2Fs
bCkgPSBtYWtlICNBQ2FsbA0KICAgICAgdmFsIChsZXNzVGhhbicsIGxlc3NUaGFuKSA9IG1ha2Ug
I2xlc3NUaGFuDQogICAgICB2YWwgKEFDb250JywgQUNvbnQpID0gbWFrZSAjQUNvbnQNCiAgICAg
IHZhbCAoQURvbScsIEFEb20pID0gbWFrZSAjQURvbQ0KICAgICAgdmFsIChjb250aWZ5JywgY29u
dGlmeSkgPSBtYWtlICNjb250aWZ5DQogICAgICB2YWwgKHN0YXR1cycsIHN0YXR1cykgPSBtYWtl
ICNzdGF0dXMNCiAgICAgIHZhbCAocHJlZml4ZXMnLCBwcmVmaXhlcykgPSBtYWtlICNwcmVmaXhl
cw0KICAgICAgdmFsIChyZXBsYWNlJywgcmVwbGFjZSkgPSBtYWtlICNyZXBsYWNlDQogICAgZW5k
DQogICAgZnVuIG5vZGVSZXNldCAoVCB7bm9kZSwgLi4ufSkgPSBub2RlIDo9IE5PTkUNCiAgZW5k
DQoNCnN0cnVjdHVyZSBKdW1wRnVuY0dyYXBoID0NCiAgc3RydWN0DQogICAgc3RydWN0dXJlIEdy
YXBoID0gRGlyZWN0ZWRHcmFwaA0KICAgIHN0cnVjdHVyZSBOb2RlID0gR3JhcGguTm9kZQ0KICAg
IHN0cnVjdHVyZSBFZGdlID0gR3JhcGguRWRnZQ0KICAgIHN0cnVjdHVyZSBEZnNQYXJhbSA9IEdy
YXBoLkRmc1BhcmFtDQoNCiAgICBkYXRhdHlwZSB0ID0gSnVtcE5vZGUgb2YgSnVtcC50DQogICAg
ICAgICAgICAgICB8IEZ1bmNOb2RlIG9mIEZ1bmMudA0KICAgIGZ1biBuZXdKdW1wRnVuY0dyYXBo
IHtnZXRKdW1wRGF0YTogSnVtcC50IC0+IEp1bXBEYXRhLnQsDQoJCQkgIGdldEZ1bmNEYXRhOiBG
dW5jLnQgLT4gRnVuY0RhdGEudH0NCiAgICAgID0gbGV0DQoJICB2YWwgRyA9IEdyYXBoLm5ldyAo
KQ0KDQoJICBmdW4gYWRkRWRnZSBlZGdlDQoJICAgID0gKEdyYXBoLmFkZEVkZ2UgKEcsIGVkZ2Up
OyAoKSkNCg0KCSAgZnVuIGFkZEVkZ2UnIGVkZ2UNCgkgICAgPSBpZiBOb2RlLmhhc0VkZ2UgZWRn
ZQ0KCQl0aGVuICgpDQoJCWVsc2UgYWRkRWRnZSBlZGdlDQoNCgkgIHZhbCB7Z2V0ID0gZ2V0Tm9k
ZUluZm8gOiBOb2RlLnQgLT4gdCwgDQoJICAgICAgIHNldCA9IHNldE5vZGVJbmZvfQ0KCSAgICA9
IFByb3BlcnR5LmdldFNldE9uY2UNCgkgICAgICAoTm9kZS5wbGlzdCwNCgkgICAgICAgUHJvcGVy
dHkuaW5pdFJhaXNlICgibm9kZUluZm8iLCBOb2RlLmxheW91dCkpDQoNCgkgIGZ1biBnZXRGdW5j
Tm9kZSBmDQoJICAgID0gbGV0DQoJCXZhbCBub2RlID0gRnVuY0RhdGEubm9kZScgKGdldEZ1bmNE
YXRhIGYpDQoJICAgICAgaW4NCgkJY2FzZSAhbm9kZQ0KCQkgIG9mIFNPTUUgbiA9PiBuDQoJCSAg
IHwgTk9ORSA9PiBsZXQNCgkJCSAgICAgICB2YWwgbiA9IEdyYXBoLm5ld05vZGUgRw0KCQkJICAg
ICBpbg0KCQkJICAgICAgIHNldE5vZGVJbmZvIChuLCBGdW5jTm9kZSBmKTsNCgkJCSAgICAgICBu
b2RlIDo9IFNPTUUgbjsNCgkJCSAgICAgICBuDQoJCQkgICAgIGVuZA0KCSAgICAgIGVuZA0KDQoJ
ICBmdW4gZ2V0SnVtcE5vZGUgag0KCSAgICA9IGxldA0KCQl2YWwgbm9kZSA9IEp1bXBEYXRhLm5v
ZGUnIChnZXRKdW1wRGF0YSBqKQ0KCSAgICAgIGluDQoJCWNhc2UgIW5vZGUNCgkJICBvZiBTT01F
IG4gPT4gbg0KCQkgICB8IE5PTkUgPT4gbGV0DQoJCQkgICAgICAgdmFsIG4gPSBHcmFwaC5uZXdO
b2RlIEcNCgkJCSAgICAgaW4NCgkJCSAgICAgICBzZXROb2RlSW5mbyAobiwgSnVtcE5vZGUgaik7
DQoJCQkgICAgICAgbm9kZSA6PSBTT01FIG47DQoJCQkgICAgICAgbg0KCQkJICAgICBlbmQNCgkg
ICAgICBlbmQNCg0KCSAgZnVuIHJlc2V0IHANCgkgICAgPSBHcmFwaC5mb3JlYWNoTm9kZQ0KCSAg
ICAgIChHLA0KCSAgICAgICBmbiBuID0+IGlmIHAgbg0KCQkJIHRoZW4gY2FzZSBnZXROb2RlSW5m
byBuDQoJCQkJb2YgSnVtcE5vZGUgag0KCQkJCSA9PiBKdW1wRGF0YS5ub2RlUmVzZXQgKGdldEp1
bXBEYXRhIGopDQoJCSAgICAgICAgICAgICAgICAgfCBGdW5jTm9kZSBmIA0KCQkJICAgICAgICAg
PT4gRnVuY0RhdGEubm9kZVJlc2V0IChnZXRGdW5jRGF0YSBmKQ0KCQkJIGVsc2UgKCkpDQoJaW4N
CgkgIHtHID0gRywgDQoJICAgYWRkRWRnZSA9IGFkZEVkZ2UsIA0KCSAgIGFkZEVkZ2UnID0gYWRk
RWRnZScsDQoJICAgZ2V0Tm9kZUluZm8gPSBnZXROb2RlSW5mbywgDQoJICAgZ2V0SnVtcE5vZGUg
PSBnZXRKdW1wTm9kZSwgDQoJICAgZ2V0RnVuY05vZGUgPSBnZXRGdW5jTm9kZSwNCgkgICByZXNl
dCA9IHJlc2V0fQ0KCWVuZA0KDQogICAgZnVuIG5ld0Z1bmNHcmFwaCB7Z2V0RnVuY0RhdGE6IEZ1
bmMudCAtPiBGdW5jRGF0YS50fQ0KICAgICAgPSBsZXQNCgkgIHZhbCB7RywgYWRkRWRnZSwgYWRk
RWRnZScsDQoJICAgICAgIGdldE5vZGVJbmZvLCANCgkgICAgICAgZ2V0SnVtcE5vZGUsIGdldEZ1
bmNOb2RlLCANCgkgICAgICAgcmVzZXR9DQoJICAgID0gbmV3SnVtcEZ1bmNHcmFwaCB7Z2V0SnVt
cERhdGEgPSBmbiBfID0+IEVycm9yLmJ1ZyAibmV3RnVuY0dyYXBoIiwNCgkJCQlnZXRGdW5jRGF0
YSA9IGdldEZ1bmNEYXRhfQ0KCWluDQoJICB7RyA9IEcsDQoJICAgYWRkRWRnZSA9IGFkZEVkZ2Us
DQoJICAgYWRkRWRnZScgPSBhZGRFZGdlJywNCgkgICBnZXROb2RlSW5mbyA9IGZuIG4gPT4gY2Fz
ZSBnZXROb2RlSW5mbyBuDQoJCQkJICAgb2YgRnVuY05vZGUgZiA9PiBmDQoJCQkJICAgIHwgSnVt
cE5vZGUgaiA9PiBFcnJvci5idWcgIm5ld0Z1bmNHcmFwaCIsDQoJICAgZ2V0RnVuY05vZGUgPSBn
ZXRGdW5jTm9kZSwNCgkgICByZXNldCA9IHJlc2V0fQ0KCWVuZA0KICBlbmQNCg0Kc3RydWN0dXJl
IEluaXRSZWFjaENhbGxlcnNDYWxsZWVzID0NCiAgc3RydWN0DQogICAgc3RydWN0dXJlIEdyYXBo
ID0gRGlyZWN0ZWRHcmFwaA0KICAgIHN0cnVjdHVyZSBEZnNQYXJhbSA9IEdyYXBoLkRmc1BhcmFt
DQoNCiAgICAoKiBEZWZpbmUgUmVhY2g6IEZ1bmMgLT4gQm9vbCBhcyBmb2xsb3dzOg0KICAgICAq
ICBSZWFjaChmKSBpZmYgdGhlcmUgaXMgYSBwYXRoIG9mIGNhbGxzIGZyb20gZm0gdG8gZi4NCiAg
ICAgKg0KICAgICAqIERlZmluZSBOb250YWlsQ2FsbGVyczogRnVuYyAtPiBQKEZ1bmMgeCBKdW1w
KSBhcyBmb2xsb3dzOg0KICAgICAqICBOb250YWlsQ2FsbGVycyhmKSA9IHsoZywgaikgfCAoZywg
ZiwgSikgaW4gTn0NCiAgICAgKiBEZWZpbmUgVGFpbENhbGxlcnM6IEZ1bmMgLT4gUChGdW5jKSBh
cyBmb2xsb3dzOg0KICAgICAqICBDYWxsZXJzKGYpID0ge2cgfCAoZywgZikgaW4gVH0NCiAgICAg
KiBEZWZpbmUgTm9udGFpbENhbGxlZXM6IEZ1bmMgLT4gUChGdW5jIHggSnVtcCkgYXMgZm9sbG93
czoNCiAgICAgKiAgTm9udGFpbENhbGxlcnMoZikgPSB7KGcsIGopIHwgKGYsIGcsIEopIGluIE59
DQogICAgICogRGVmaW5lIFRhaWxDYWxsZWVzOiBGdW5jIC0+IFAoRnVuYykgYXMgZm9sbG93czoN
CiAgICAgKiAgQ2FsbGVycyhmKSA9IHtnIHwgKGYsIGcpIGluIFR9DQogICAgICoNCiAgICAgKiBQ
cmVjb25kaXRpb246IGZvcmFsbCBmIGluIEZ1bmMuIChGdW5jRGF0YS5ub2RlIG8gZ2V0RnVuY0Rh
dGEpIGYgPSBOT05FDQogICAgICogICAgICAgICAgICAgICBmb3JhbGwgZiBpbiBGdW5jLiAoSnVt
cERhdGEuY2FsbGVycyBvIGdldEZ1bmNEYXRhKSBmIA0KICAgICAqICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgPSB7bm9udGFpbCA9IFtdLCB0YWlsID0gW119DQogICAgICogICAgICAg
ICAgICAgICBmb3JhbGwgZiBpbiBGdW5jLiAoSnVtcERhdGEuY2FsbGVlcyBvIGdldEZ1bmNEYXRh
KSBmDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IHtub250YWlsID0g
W10sIHRhaWwgPSBbXX0NCiAgICAgKiBQb3N0Y29uZGl0aW9uOiBGdW5jRGF0YS5yZWFjaCBvIGdl
dEZ1bmNEYXRhID0gUmVhY2gNCiAgICAgKiAgICAgICAgICAgICAgICAjbm9udGFpbCAoRnVuY0Rh
dGEuY2FsbGVycyBvIGdldEZ1bmNEYXRhKQ0KICAgICAqICAgICAgICAgICAgICAgID0gTm9udGFp
bENhbGxlcnMNCiAgICAgKiAgICAgICAgICAgICAgICAjdGFpbCAoRnVuY0RhdGEuY2FsbGVycyBv
IGdldEZ1bmNEYXRhKQ0KICAgICAqICAgICAgICAgICAgICAgID0gVGFpbENhbGxlcnMNCiAgICAg
KiAgICAgICAgICAgICAgICAjbm9udGFpbCAoRnVuY0RhdGEuY2FsbGVlcyBvIGdldEZ1bmNEYXRh
KQ0KICAgICAqICAgICAgICAgICAgICAgID0gTm9udGFpbENhbGxlZXMNCiAgICAgKiAgICAgICAg
ICAgICAgICAjdGFpbCAoRnVuY0RhdGEuY2FsbGVlcyBvIGdldEZ1bmNEYXRhKQ0KICAgICAqICAg
ICAgICAgICAgICAgID0gVGFpbENhbGxlZXMNCiAgICAgKikNCiAgICBmdW4gaW5pdFJlYWNoQ2Fs
bGVyc0NhbGxlZXMgDQogICAgICAgIHtwcm9ncmFtIGFzIFByb2dyYW0uVCB7ZnVuY3Rpb25zLCBt
YWluID0gZm0sIC4uLn0sDQoJIGdldEZ1bmNEYXRhOiBGdW5jLnQgLT4gRnVuY0RhdGEudH0gOiB1
bml0DQogICAgICA9IGxldA0KCSAgdmFsIHtHLCBhZGRFZGdlLCBhZGRFZGdlJywNCgkgICAgICAg
Z2V0Tm9kZUluZm8sIGdldEZ1bmNOb2RlLCANCgkgICAgICAgcmVzZXR9DQoJICAgID0gSnVtcEZ1
bmNHcmFwaC5uZXdGdW5jR3JhcGgge2dldEZ1bmNEYXRhID0gZ2V0RnVuY0RhdGF9DQoNCgkgIHZh
bCBfIA0KCSAgICA9IFZlY3Rvci5mb3JlYWNoDQoJICAgICAgKGZ1bmN0aW9ucywgDQoJICAgICAg
IGZuIHtuYW1lID0gZiwgYm9keSA9IGZfYm9keSwgLi4ufQ0KCSAgICAgICAgPT4gbGV0DQoJCSAg
ICAgdmFsIGNhbGxlZXMgPSBGdW5jRGF0YS5jYWxsZWVzJyAoZ2V0RnVuY0RhdGEgZikNCgkJICAg
ICB2YWwgZl9ub2RlID0gZ2V0RnVuY05vZGUgZg0KCQkgICBpbg0KCQkgICAgIEV4cC5mb3JlYWNo
Q2FsbA0KCQkgICAgIChmX2JvZHksDQoJCSAgICAgIGZuIHtmdW5jID0gZywgY29udCwgLi4ufQ0K
CQkgICAgICAgPT4gbGV0DQoJCQkgICAgdmFsIGNhbGxlcnMgPSBGdW5jRGF0YS5jYWxsZXJzJyAo
Z2V0RnVuY0RhdGEgZykNCgkJCSAgICB2YWwgZ19ub2RlID0gZ2V0RnVuY05vZGUgZw0KCQkJICBp
bg0KCQkJICAgIGNhc2UgY29udA0KCQkJICAgICAgb2YgTk9ORSANCgkJCSAgICAgICA9PiAoTGlz
dC5wdXNoKCN0YWlsIGNhbGxlZXMsIGcpOw0KCQkJCSAgIExpc3QucHVzaCgjdGFpbCBjYWxsZXJz
LCBmKSkNCgkJCSAgICAgICB8IFNPTUUgaiANCgkJCSAgICAgICA9PiAoTGlzdC5wdXNoKCNub250
YWlsIGNhbGxlZXMsIChnLCBqKSk7DQoJCQkJICAgTGlzdC5wdXNoKCNub250YWlsIGNhbGxlcnMs
IChmLCBqKSkpOw0KCQkJICAgIGFkZEVkZ2Uge2Zyb20gPSBmX25vZGUsDQoJCQkJICAgICB0byA9
IGdfbm9kZX0NCgkJCSAgZW5kKQ0KCQkgICBlbmQpDQoJICAgICAgDQoJICB2YWwgZGZzX3BhcmFt
DQoJICAgID0gRGZzUGFyYW0uZmluaXNoTm9kZQ0KCSAgICAgIChmbiBuID0+IGxldA0KCQkJIHZh
bCByZWFjaCANCgkJCSAgID0gRnVuY0RhdGEucmVhY2gnIChnZXRGdW5jRGF0YSAoZ2V0Tm9kZUlu
Zm8gbikpDQoJCSAgICAgICBpbg0KCQkJIHJlYWNoIDo9IHRydWUNCgkJICAgICAgIGVuZCkNCgkg
IHZhbCBmbV9ub2RlID0gZ2V0RnVuY05vZGUgZm0NCglpbg0KCSAgR3JhcGguZGZzTm9kZXMgKEcs
IFtmbV9ub2RlXSwgZGZzX3BhcmFtKTsNCgkgIHJlc2V0IChmbiBfID0+IHRydWUpDQoJZW5kDQog
ICAgdmFsIGluaXRSZWFjaENhbGxlcnNDYWxsZWVzIA0KICAgICAgPSBDb250cm9sLnRyYWNlQ2Fs
bCAiaW5pdFJlYWNoQ2FsbGVyQ2FsbGVlcyIgaW5pdFJlYWNoQ2FsbGVyc0NhbGxlZXMgDQogIGVu
ZA0KDQpzdHJ1Y3R1cmUgQW5hbHl6ZUNhbGwgPQ0KICBzdHJ1Y3QNCiAgICBkYXRhdHlwZSB6ID0g
ZGF0YXR5cGUgUmV0dXJuLnQNCg0KICAgICgqDQogICAgICogUHJlY29uZGl0aW9uOiBmb3JhbGwg
ZiBpbiBGdW5jLiAoRnVuY0RhdGEuQUNhbGwgbyBnZXRGdW5jRGF0YSkgZiA9IFVuY2FsbGVkDQog
ICAgICogUG9zdGNvbmRpdGlvbjogRnVuY0RhdGEuQUNhbGwgbyBnZXRGdW5jRGF0YSA9IEFfQ2Fs
bA0KICAgICAqKQ0KICAgIGZ1biBhbmFseXplQ2FsbCB7cHJvZ3JhbSBhcyBQcm9ncmFtLlQge2Z1
bmN0aW9ucywgbWFpbiA9IGZtLCAuLi59LA0KCQkgICAgIGdldEZ1bmNEYXRhOiBGdW5jLnQgLT4g
RnVuY0RhdGEudH0gOiB1bml0DQogICAgICA9IGxldA0KCSAgdmFsIGZtX0FDYWxsID0gRnVuY0Rh
dGEuQUNhbGwnIChnZXRGdW5jRGF0YSBmbSkNCgkgIHZhbCBfID0gZm1fQUNhbGwgOj0gVW5rbm93
bg0KCWluDQoJICBWZWN0b3IuZm9yZWFjaA0KCSAgKGZ1bmN0aW9ucywNCgkgICBmbiB7bmFtZSA9
IGYsIGJvZHkgPSBmX2JvZHksIC4uLn0NCgkgICAgPT4gaWYgRnVuY0RhdGEucmVhY2ggKGdldEZ1
bmNEYXRhIGYpDQoJCSB0aGVuIEV4cC5mb3JlYWNoQ2FsbA0KCQkgICAgICAoZl9ib2R5LA0KCQkg
ICAgICAgZm4ge2Z1bmMgPSBnLCBjb250LCAuLi59IA0KCQkgICAgICAgID0+IGxldA0KCQkJICAg
ICB2YWwgQUNhbGwgPSBGdW5jRGF0YS5BQ2FsbCcgKGdldEZ1bmNEYXRhIGcpDQoJCQkgICBpbg0K
CQkJICAgICBpZiBGdW5jLmVxdWFscyAoZiwgZykNCgkJCSAgICAgICB0aGVuIGNhc2UgY29udA0K
CQkJCSAgICAgIG9mIE5PTkUgPT4gKCkNCgkJCQkgICAgICAgfCBTT01FIGogPT4gQUNhbGwgOj0g
VW5rbm93bg0KCQkJICAgICAgIGVsc2UgY2FzZSAhQUNhbGwNCgkJCQkgICAgICBvZiBVbmNhbGxl
ZCANCgkJCQkgICAgICAgPT4gKGNhc2UgY29udA0KCQkJCQkgICAgIG9mIE5PTkUgDQoJCQkJCSAg
ICAgID0+IEFDYWxsIDo9IEZ1bmNMYWJlbCBmDQoJCQkJCSAgICAgIHwgU09NRSBqIA0KCQkJCQkg
ICAgICA9PiBBQ2FsbCA6PSBKdW1wTGFiZWwgaikNCgkJCQkgICAgICAgfCBKdW1wTGFiZWwgXyA9
PiBBQ2FsbCA6PSBVbmtub3duDQoJCQkJICAgICAgIHwgRnVuY0xhYmVsIF8gPT4gQUNhbGwgOj0g
VW5rbm93bg0KCQkJCSAgICAgICB8IFVua25vd24gPT4gKCkNCgkJCSAgICAgZW5kKQ0KCQkgZWxz
ZSAoKSkNCgllbmQNCiAgICB2YWwgYW5hbHl6ZUNhbGwgDQogICAgICA9IENvbnRyb2wudHJhY2VD
YWxsICJhbmFseXplQ2FsbCIgYW5hbHl6ZUNhbGwNCiAgZW5kDQoNCnN0cnVjdHVyZSBBbmFseXpl
Q29udCA9DQogIHN0cnVjdA0KICAgIGRhdGF0eXBlIHogPSBkYXRhdHlwZSBSZXR1cm4udA0KDQog
ICAgKCoNCiAgICAgKiBQcmVjb25kaXRpb246IGZvcmFsbCBmIGluIEZ1bmMuIChGdW5jRGF0YS5B
Q29udCBvIGdldEZ1bmNEYXRhKSBmID0gVW5jYWxsZWQNCiAgICAgKiAgICAgICAgICAgICAgIGZv
cmFsbCBmIGluIEZ1bmMuIChGdW5jRGF0YS5sZXNzVGhhbiBvIGdldEZ1bmNEYXRhKSBmID0gW10N
CiAgICAgKiAgICAgICAgICAgICAgIA0KICAgICAqIFBvc3Rjb25kaXRpb246IEZ1bmNEYXRhLkFD
b250IG8gZ2V0RnVuY0RhdGEgPSBBX0NvbnQNCiAgICAgKikNCiAgICBmdW4gYW5hbHl6ZUNvbnQg
e3Byb2dyYW0gYXMgUHJvZ3JhbS5UIHtmdW5jdGlvbnMsIG1haW4gPSBmbSwgLi4ufSwNCgkJICAg
ICBnZXRGdW5jRGF0YTogRnVuYy50IC0+IEZ1bmNEYXRhLnR9IDogdW5pdA0KICAgICAgPSBsZXQN
CgkgIGZ1biB1cCAoZiwgcykNCgkgICAgPSBsZXQNCgkJdmFsIEZ1bmNEYXRhLlQge0FDb250LCBs
ZXNzVGhhbiwgLi4ufSA9IGdldEZ1bmNEYXRhIGYNCgkJZnVuIGRvaXQgcw0KCQkgID0gKEFDb250
IDo9IHM7DQoJCSAgICAgTGlzdC5mb3JlYWNoICghbGVzc1RoYW4sIGZuIGcgPT4gdXAgKGcsIHMp
KSkNCgkgICAgICBpbg0KCQljYXNlICghQUNvbnQsIHMpDQoJCSAgb2YgKF8sIFVuY2FsbGVkKSA9
PiAoKQ0KCQkgICB8IChVbmtub3duLCBfKSA9PiAoKQ0KCQkgICB8IChVbmNhbGxlZCwgXykgPT4g
ZG9pdCBzDQoJCSAgIHwgKEp1bXBMYWJlbCBqLCBKdW1wTGFiZWwgaicpDQoJCSAgID0+IGlmIEp1
bXAuZXF1YWxzIChqLCBqJykNCgkJCXRoZW4gKCkNCgkJCWVsc2UgZG9pdCBVbmtub3duDQoJCSAg
IHwgKEZ1bmNMYWJlbCBnLCBGdW5jTGFiZWwgZycpDQoJCSAgID0+IGlmIEZ1bmMuZXF1YWxzIChn
LCBnJykNCgkJCXRoZW4gKCkNCgkJCWVsc2UgZG9pdCBVbmtub3duDQoJCSAgIHwgXyA9PiBkb2l0
IFVua25vd24NCgkgICAgICBlbmQNCg0KCSAgZnVuIHRocnVGdW5jIChmLCBnKSANCgkgICAgPSBs
ZXQNCgkJdmFsIEZ1bmNEYXRhLlQge0FDb250LCBsZXNzVGhhbiwgLi4ufSA9IGdldEZ1bmNEYXRh
IGcNCgkgICAgICBpbg0KCQlMaXN0LnB1c2ggKGxlc3NUaGFuLCBmKTsNCgkJdXAgKGYsICFBQ29u
dCkNCgkgICAgICBlbmQNCgkgIGZ1biBhZGRKdW1wIChmLCBqKSA9IHVwIChmLCBKdW1wTGFiZWwg
aikNCgkgIGZ1biBtYWtlVG9wIGYgPSB1cCAoZiwgVW5rbm93bikNCg0KDQoJICB2YWwgXyA9IG1h
a2VUb3AgZm0NCglpbg0KCSAgVmVjdG9yLmZvcmVhY2gNCgkgIChmdW5jdGlvbnMsDQoJICAgZm4g
e25hbWUgPSBmLCBib2R5ID0gZl9ib2R5LCAuLi59DQoJICAgID0+IGlmIEZ1bmNEYXRhLnJlYWNo
IChnZXRGdW5jRGF0YSBmKQ0KCQkgdGhlbiBFeHAuZm9yZWFjaENhbGwNCgkJICAgICAgKGZfYm9k
eSwNCgkJICAgICAgIGZuIHtmdW5jID0gZywgY29udCwgLi4ufQ0KCQkgICAgICAgID0+IGlmIEZ1
bmMuZXF1YWxzIChmLCBnKQ0KCQkJICAgICB0aGVuIGNhc2UgY29udA0KCQkJCSAgICBvZiBOT05F
ID0+ICgpDQoJCQkJICAgICB8IFNPTUUgaiA9PiBtYWtlVG9wIGYNCgkJCSAgICAgZWxzZSBjYXNl
IGNvbnQNCgkJCQkgICAgb2YgTk9ORSA9PiB0aHJ1RnVuYyAoZywgZikNCgkJCQkgICAgIHwgU09N
RSBqID0+IGFkZEp1bXAgKGcsIGopKQ0KCQkgZWxzZSAoKSkNCgllbmQNCiAgICB2YWwgYW5hbHl6
ZUNvbnQgDQogICAgICA9IENvbnRyb2wudHJhY2VDYWxsICJhbmFseXplQ29udCIgYW5hbHl6ZUNv
bnQNCiAgZW5kDQoNCnN0cnVjdHVyZSBBbmFseXplRG9tID0NCiAgc3RydWN0DQogICAgc3RydWN0
dXJlIEdyYXBoID0gRGlyZWN0ZWRHcmFwaA0KICAgIHN0cnVjdHVyZSBOb2RlID0gR3JhcGguTm9k
ZQ0KDQogICAgKCogTm93IGRlZmluZSBhIGRpcmVjdGVkIGdyYXBoIEcgPSAoTm9kZSwgRWRnZSkg
d2hlcmUNCiAgICAgKiAgICAgIE5vZGUgPSBKdW1wIFUgRnVuIFUge1Jvb3R9DQogICAgICogICAg
ICBFZGdlID0geyhSb290LCBmbSl9DQogICAgICogICAgICAgICAgICAgVSB7KFJvb3QsIGopIHwg
aiBpbiBKdW1wfQ0KICAgICAqICAgICAgICAgICAgIFUgeyhSb290LCBmKSB8IG5vdChSZWFjaChm
KSl9DQogICAgICogICAgICAgICAgICAgVSB7KGYsIGcpIHwgKGYsIGcpIGluIFQgYW5kIFJlYWNo
KGYpfQ0KICAgICAqICAgICAgICAgICAgIFUgeyhqLCBnKSB8IChmLCBnLCBqKSBpbiBOIGFuZCBS
ZWFjaChmKX0NCiAgICAgKg0KICAgICAqIExldCBEIGJlIHRoZSBkb21pbmF0b3IgdHJlZSBvZiBH
IHJvb3RlZCBhdCBSb290Lg0KICAgICAqIEZvciBmIGluIEZ1biwgbGV0IGlkb20oZikgYmUgdGhl
IHBhcmVudCBvZiBmIGluIEQuDQogICAgICoNCiAgICAgKiBEZWZpbmUgYW4gYW5hbHlzaXMsIEFf
RG9tLCBiYXNlZCBvbiBEIGFzIGZvbGxvd3M6DQogICAgICogICAgICBBX0RvbShmKSA9IA0KICAg
ICAqICAgICAgICAgICBpZiBpZG9tKGYpID0gUm9vdA0KICAgICAqICAgICAgICAgICAgIHRoZW4g
aWYgUmVhY2goZikgdGhlbiBVbmtub3duIGVsc2UgVW5jYWxsZWQNCiAgICAgKiAgICAgICAgICAg
ICBlbHNlIHRoZSBhbmNlc3RvciBnIG9mIGYgaW4gRCBzdWNoIHRoYXQgaWRvbShnKSA9IFJvb3QN
CiAgICAgKg0KICAgICAqIFByZWNvbmRpdGlvbjogZm9yYWxsIGogaW4gSnVtcC4gKEp1bXBEYXRh
Lm5vZGUgbyBnZXRKdW1wRGF0YSkgaiA9IE5PTkUNCiAgICAgKiAgICAgICAgICAgICAgIGZvcmFs
bCBqIGluIEp1bXAuIChKdW1wRGF0YS5yb290RWRnZSBvIGdldEp1bXBEYXRhKSBqID0gZmFsc2UN
CiAgICAgKiAgICAgICAgICAgICAgIGZvcmFsbCBmIGluIEZ1bmMuIChGdW5jRGF0YS5ub2RlIG8g
Z2V0RnVuY0RhdGEpIGYgPSBOT05FDQogICAgICogICAgICAgICAgICAgICBmb3JhbGwgZiBpbiBG
dW5jLiAoRnVuY0RhdGEucmVhY2ggbyBnZXRGdW5jRGF0YSkgZiA9IFJlYWNoDQogICAgICogUG9z
dGNvbmRpdGlvbjogRnVuY0RhdGEuQURvbSBvIGdldEZ1bmNEYXRhID0gQV9Eb20NCiAgICAgKiAg
ICAgICAgICAgICAgICBmb3JhbGwgaiBpbiBKdW1wLiAoSnVtcERhdGEubm9kZSBvIGdldEp1bXBE
YXRhKSBqID0gTk9ORQ0KICAgICAqICAgICAgICAgICAgICAgIGZvcmFsbCBmIGluIEZ1bmMuIChG
dW5jRGF0YS5ub2RlIG8gZ2V0RnVuY0RhdGEpIGYgPSBOT05FDQogICAgICopDQogICAgZnVuIGFu
YWx5emVEb20ge3Byb2dyYW0gYXMgUHJvZ3JhbS5UIHtmdW5jdGlvbnMsIG1haW4gPSBmbSwgLi4u
fSwNCgkJICAgIGdldEZ1bmNEYXRhOiBGdW5jLnQgLT4gRnVuY0RhdGEudCwNCgkJICAgIGdldEp1
bXBEYXRhOiBKdW1wLnQgLT4gSnVtcERhdGEudH0gOiB1bml0DQogICAgICA9IGxldA0KCSAgZGF0
YXR5cGUgeiA9IGRhdGF0eXBlIFJldHVybi50DQoNCgkgIHZhbCB7RywgYWRkRWRnZSwgYWRkRWRn
ZScsDQoJICAgICAgIGdldE5vZGVJbmZvLCBnZXRGdW5jTm9kZSwgZ2V0SnVtcE5vZGUsIA0KCSAg
ICAgICByZXNldH0NCgkgICAgPSBKdW1wRnVuY0dyYXBoLm5ld0p1bXBGdW5jR3JhcGgge2dldEp1
bXBEYXRhID0gZ2V0SnVtcERhdGEsDQoJCQkJCSAgICAgIGdldEZ1bmNEYXRhID0gZ2V0RnVuY0Rh
dGF9DQoJICB2YWwgUm9vdCA9IERpcmVjdGVkR3JhcGgubmV3Tm9kZSBHDQoNCgkgIGZ1biBidWls
ZEdyYXBoICgpID0gbGV0DQoJICB2YWwgZm1fbm9kZSA9IGdldEZ1bmNOb2RlIGZtDQoJICAoKiB7
KFJvb3QsIGZtKX0gKikNCgkgIHZhbCBfID0gYWRkRWRnZSB7ZnJvbSA9IFJvb3QsIHRvID0gZm1f
bm9kZX0NCgkgICAgDQoJICB2YWwgXw0KCSAgICA9IFZlY3Rvci5mb3JlYWNoDQoJICAgICAgKGZ1
bmN0aW9ucywNCgkgICAgICAgZm4ge25hbWUgPSBmLCBib2R5ID0gZl9ib2R5LCAuLi59DQoJICAg
ICAgICA9PiBsZXQNCgkJICAgICB2YWwgZl9yZWFjaCA9IEZ1bmNEYXRhLnJlYWNoIChnZXRGdW5j
RGF0YSBmKQ0KCQkgICAgIHZhbCBmX25vZGUgPSBnZXRGdW5jTm9kZSBmDQoJCSAgIGluDQoJCSAg
ICAgaWYgZl9yZWFjaA0KCQkgICAgICAgdGhlbiBFeHAuZm9yZWFjaENhbGwNCgkJCSAgICAoZl9i
b2R5LA0KCQkJICAgICBmbiB7ZnVuYyA9IGcsIGNvbnQsIC4uLn0NCgkJCSAgICAgID0+IGlmIEZ1
bmNEYXRhLnJlYWNoIChnZXRGdW5jRGF0YSBnKQ0KCQkJCSAgIHRoZW4gbGV0DQoJCQkJCSAgdmFs
IGdfbm9kZSA9IGdldEZ1bmNOb2RlIGcNCgkJCQkJaW4NCgkJCQkJICBjYXNlIGNvbnQNCgkJCQkJ
ICAgIG9mIE5PTkUNCgkJCQkJICAgICA9PiAoKiB7KGYsIGcpIHwgKGYsIGcpIGluIFQgDQoJCQkJ
CQkgKiAgICAgICBhbmQgUmVhY2goZil9ICopDQoJCQkJCSAgICAgICAgYWRkRWRnZSB7ZnJvbSA9
IGZfbm9kZSwNCgkJCQkJCQkgdG8gPSBnX25vZGV9DQoJCQkJCSAgICAgfCBTT01FIGoNCgkJCQkJ
ICAgICA9PiBsZXQNCgkJCQkJCSAgdmFsIGpfbm9kZSA9IGdldEp1bXBOb2RlIGoNCgkJCQkJCSAg
dmFsIHJvb3RFZGdlIA0KCQkJCQkJICAgID0gSnVtcERhdGEucm9vdEVkZ2UnDQoJCQkJCQkgICAg
ICAoZ2V0SnVtcERhdGEgaikNCgkJCQkJCWluDQoJCQkJCQkgIGlmICFyb290RWRnZQ0KCQkJCQkJ
ICAgIHRoZW4gKCkNCgkJCQkJCSAgICBlbHNlICgoKiB7KFJvb3QsIGopIHwgaiBpbiBKdW1wfSAq
KQ0KCQkJCQkJICAgICAgICAgIGFkZEVkZ2Uge2Zyb20gPSBSb290LA0KCQkJCQkJCQkgICB0byA9
IGpfbm9kZX07DQoJCQkJCQkJICByb290RWRnZSA6PSB0cnVlKTsNCgkJCQkJCSAgKCogeyhqLCBn
KSB8IChmLCBnLCBqKSBpbiBODQoJCQkJCQkgICAqICAgICAgIGFuZCBSZWFjaChmKX0gKikNCgkJ
CQkJCSAgYWRkRWRnZSB7ZnJvbSA9IGpfbm9kZSwNCgkJCQkJCQkgICB0byA9IGdfbm9kZX0NCgkJ
CQkJCWVuZA0KCQkJCQllbmQNCgkJCQkgICBlbHNlICgpKQ0KCQkgICAgICAgZWxzZSAoKiB7KFJv
b3QsIGYpIHwgbm90KFJlYWNoKGYpKX0gKikNCgkJCSAgICBhZGRFZGdlIHtmcm9tID0gUm9vdCwN
CgkJCQkgICAgIHRvID0gZl9ub2RlfQ0KCQkgICBlbmQpDQogICAgICAgICAgaW4gKCkgZW5kDQoJ
ICB2YWwgYnVpbGRHcmFwaCANCgkgICAgPSBDb250cm9sLnRyYWNlQ2FsbCAiYnVpbGRHcmFwaCIg
YnVpbGRHcmFwaA0KCSAgdmFsIF8gPSBidWlsZEdyYXBoICgpDQoNCgkgIGZ1biBjb21wdXRlRG9t
aW5hdG9ycyAoKSA9IGxldA0KCSAgdmFsIHtpZG9tfSA9IEdyYXBoLmRvbWluYXRvcnMge2dyYXBo
ID0gRywgcm9vdCA9IFJvb3R9DQogICAgICAgICAgaW4gaWRvbSBlbmQNCgkgIHZhbCBjb21wdXRl
RG9taW5hdG9ycyANCgkgICAgPSBDb250cm9sLnRyYWNlQ2FsbCAiY29tcHV0ZURvbWluYXRvcnMi
IGNvbXB1dGVEb21pbmF0b3JzDQoJICB2YWwgaWRvbSA9IGNvbXB1dGVEb21pbmF0b3JzICgpDQoN
CgkgIGZ1biBjb21wdXRlQURvbSAoKSA9IGxldA0KCSAgZnVuIGFuY2VzdG9yIG5vZGUNCgkgICAg
PSBsZXQNCgkJdmFsIHBhcmVudCA9IGlkb20gbm9kZQ0KCSAgICAgIGluDQoJCWlmIE5vZGUuZXF1
YWxzKHBhcmVudCwgUm9vdCkNCgkJICB0aGVuIG5vZGUNCgkJICBlbHNlIGFuY2VzdG9yIHBhcmVu
dA0KCSAgICAgIGVuZA0KDQogICAgICAgICAgdmFsIF8NCgkgICAgPSBWZWN0b3IuZm9yZWFjaA0K
CSAgICAgIChmdW5jdGlvbnMsDQoJICAgICAgIGZuIHtuYW1lLCAuLi59DQoJICAgICAgICA9PiBs
ZXQNCgkJICAgICB2YWwgRnVuY0RhdGEuVCB7QURvbSwgcmVhY2gsIG5vZGUsIC4uLn0gPSBnZXRG
dW5jRGF0YSBuYW1lDQoJCSAgICAgdmFsIGZfQURvbSA9IEFEb20NCgkJICAgICB2YWwgZl9yZWFj
aCA9ICFyZWFjaA0KCQkgICAgIHZhbCBmX25vZGUgPSB2YWxPZiAoIW5vZGUpDQoJCSAgICAgZGF0
YXR5cGUgeiA9IGRhdGF0eXBlIEp1bXBGdW5jR3JhcGgudA0KCQkgICBpbg0KCQkgICAgIGlmIE5v
ZGUuZXF1YWxzKGlkb20gZl9ub2RlLCBSb290KQ0KCQkgICAgICAgdGhlbiBpZiBmX3JlYWNoDQoJ
CQkgICAgICB0aGVuIGZfQURvbSA6PSBVbmtub3duDQoJCQkgICAgICBlbHNlIGZfQURvbSA6PSBV
bmNhbGxlZA0KCQkgICAgICAgZWxzZSBsZXQNCgkJCSAgICAgICgqIFVzZSB0aGlzIGZvciB0aGUg
YW5jZXN0b3IgdmVyc2lvbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsIGxfbm9k
ZSA9IGFuY2VzdG9yIGZfbm9kZQ0KCQkJICAgICAgICopDQoJCQkgICAgICAoKiBVc2UgdGhpcyBm
b3IgdGhlIHBhcmVudCB2ZXJzaW9uICopDQoJCQkgICAgICB2YWwgbF9ub2RlID0gaWRvbSBmX25v
ZGUNCgkJCSAgICAgIHZhbCBsID0gZ2V0Tm9kZUluZm8gbF9ub2RlDQoJCQkgICAgaW4NCgkJCSAg
ICAgIGNhc2UgZ2V0Tm9kZUluZm8gbF9ub2RlDQoJCQkJb2YgRnVuY05vZGUgZyA9PiBmX0FEb20g
Oj0gRnVuY0xhYmVsIGcNCgkJCQkgfCBKdW1wTm9kZSBqID0+IGZfQURvbSA6PSBKdW1wTGFiZWwg
ag0KCQkJICAgIGVuZA0KCQkgICBlbmQpDQoJICBpbiAoKSBlbmQNCgkgIHZhbCBjb21wdXRlQURv
bSANCgkgICAgPSBDb250cm9sLnRyYWNlQ2FsbCAiY29tcHV0ZSBBRG9tIiBjb21wdXRlQURvbQ0K
CSAgdmFsIF8gPSBjb21wdXRlQURvbSAoKQ0KDQoJICB2YWwgXyA9IHJlc2V0IChmbiBuID0+IG5v
dCAoTm9kZS5lcXVhbHMobiwgUm9vdCkpKQ0KCWluDQoJICAoKQ0KCWVuZA0KICAgIHZhbCBhbmFs
eXplRG9tIA0KICAgICAgPSBDb250cm9sLnRyYWNlQ2FsbCAiYW5hbHl6ZURvbSIgYW5hbHl6ZURv
bQ0KZW5kDQoNCnN0cnVjdHVyZSBUcmFuc2Zvcm0gPQ0KICBzdHJ1Y3QNCg0KICAgIHN0cnVjdHVy
ZSBHcmFwaCA9IERpcmVjdGVkR3JhcGgNCiAgICBzdHJ1Y3R1cmUgTm9kZSA9IEdyYXBoLk5vZGUN
CiAgICBzdHJ1Y3R1cmUgRWRnZSA9IEdyYXBoLkVkZ2UNCiAgICBzdHJ1Y3R1cmUgRGZzUGFyYW0g
PSBHcmFwaC5EZnNQYXJhbQ0KDQogICAgKCoNCiAgICAgKiBQcmVjb25kaXRpb246IGZvcmFsbCBq
IGluIEp1bXAuIChKdW1wRGF0YS5ub2RlIG8gZ2V0SnVtcERhdGEpIGogPSBOT05FDQogICAgICog
ICAgICAgICAgICAgICBmb3JhbGwgaiBpbiBKdW1wLiAoSnVtcERhdGEuc3RhdHVzIG8gZ2V0SnVt
cERhdGEpIGogPSBUT0RPDQogICAgICogICAgICAgICAgICAgICBmb3JhbGwgaiBpbiBKdW1wLiAo
SnVtcERhdGEucHJlZml4ZXMgbyBnZXRKdW1wRGF0YSkgaiA9IFtdDQogICAgICogICAgICAgICAg
ICAgICBmb3JhbGwgZiBpbiBGdW5jLiAoRnVuY0RhdGEubm9kZSBvIGdldEZ1bmNEYXRhKSBmID0g
Tk9ORQ0KICAgICAqICAgICAgICAgICAgICAgRnVuY0RhdGEuQSBvIGdldEZ1bmNEYXRhID0gQQ0K
ICAgICAqICAgICAgICAgICAgICAgIHdoZXJlIEEgaXMgYSBzYWZlIGFuYWx5c2lzDQogICAgICog
ICAgICAgICAgICAgICBGdW5jRGF0YS5jYWxsZXJzIG8gZ2V0RnVuY0RhdGENCiAgICAgKiAgICAg
ICAgICAgICAgID0ge25vbnRhaWwgPSBOb250YWlsQ2FsbGVycywgdGFpbCA9IFRhaWxDYWxsZXJz
fQ0KICAgICAqICAgICAgICAgICAgICAgRnVuY0RhdGEuY2FsbGVlcyBvIGdldEZ1bmNEYXRhDQog
ICAgICogICAgICAgICAgICAgICA9IHtub250YWlsID0gTm9udGFpbENhbGxlZXMsIHRhaWwgPSBU
YWlsQ2FsbGVlc30NCiAgICAgKiAgICAgICAgICAgICAgIGZvcmFsbCBmIGluIEZ1bmMuIChKdW1w
RGF0YS5zdGF0dXMgbyBnZXRGdW5jRGF0YSkgZiA9IFRPRE8NCiAgICAgKiAgICAgICAgICAgICAg
IGZvcmFsbCBmIGluIEZ1bmMuIChKdW1wRGF0YS5wcmVmaXhlcyBvIGdldEZ1bmNEYXRhKSBmID0g
W10NCiAgICAgKiAgICAgICAgICAgICAgIGZvcmFsbCBmIGluIEZ1bmMuIChKdW1wRGF0YS5yZXBs
YWNlIG8gZ2V0RnVuY0RhdGEpIGYgPSBOT05FDQogICAgICogUG9zdGNvbmRpdGlvbjogZm9yYWxs
IGogaW4gSnVtcC4gKEp1bXBEYXRhLm5vZGUgbyBnZXRKdW1wRGF0YSkgaiA9IE5PTkUNCiAgICAg
KiAgICAgICAgICAgICAgICBmb3JhbGwgZiBpbiBGdW5jLiAoRnVuY0RhdGEubm9kZSBvIGdldEZ1
bmNEYXRhKSBmID0gTk9ORQ0KICAgICAqKQ0KICAgIGZ1biB0cmFuc2Zvcm0ge3Byb2dyYW0gYXMg
UHJvZ3JhbS5UIHtkYXRhdHlwZXMsIGdsb2JhbHMsIA0KCQkJCQkgZnVuY3Rpb25zLCBtYWlufSwN
CgkJICAgZ2V0RnVuY0RhdGE6IEZ1bmMudCAtPiBGdW5jRGF0YS50LA0KCQkgICBnZXRKdW1wRGF0
YTogSnVtcC50IC0+IEp1bXBEYXRhLnR9IDogUHJvZ3JhbS50DQogICAgICA9IGxldA0KCSAgZGF0
YXR5cGUgeiA9IGRhdGF0eXBlIFJldHVybi50DQoNCgkgIHZhbCB7RywgYWRkRWRnZSwgYWRkRWRn
ZScsDQoJICAgICAgIGdldE5vZGVJbmZvLCBnZXRKdW1wTm9kZSwgZ2V0RnVuY05vZGUsIA0KCSAg
ICAgICByZXNldH0NCgkgICAgPSBKdW1wRnVuY0dyYXBoLm5ld0p1bXBGdW5jR3JhcGgge2dldEZ1
bmNEYXRhID0gZ2V0RnVuY0RhdGEsDQoJCQkJCSAgICAgIGdldEp1bXBEYXRhID0gZ2V0SnVtcERh
dGF9DQoNCgkgIHZhbCByb290cyA9IHJlZiBbXQ0KCSAgdmFsIF8gDQoJICAgID0gVmVjdG9yLmZv
cmVhY2gNCgkgICAgICAoZnVuY3Rpb25zLA0KCSAgICAgICBmbiB7bmFtZSA9IGYsIC4uLn0NCgkg
ICAgICAgID0+IGxldA0KCQkgICAgIHZhbCBGdW5jRGF0YS5UIHtBLCBjb250aWZ5LCAuLi59IA0K
CQkgICAgICAgPSBnZXRGdW5jRGF0YSBmDQoJCSAgICAgdmFsIGZfbm9kZSA9IGdldEZ1bmNOb2Rl
IGYNCgkJICAgaW4NCgkJICAgICBjYXNlICFBDQoJCSAgICAgICBvZiBVbmNhbGxlZCA9PiAoTGlz
dC5wdXNoKHJvb3RzLCBmX25vZGUpOw0KCQkJCSAgICAgICBjb250aWZ5IDo9IGZhbHNlKQ0KCQkJ
fCBVbmtub3duID0+IChMaXN0LnB1c2gocm9vdHMsIGZfbm9kZSk7DQoJCQkJICAgICAgY29udGlm
eSA6PSBmYWxzZSkNCgkJICAgICAgICB8IEp1bXBMYWJlbCBqDQoJCQk9PiBsZXQNCgkJCSAgICAg
dmFsIGxfbm9kZSA9IGdldEp1bXBOb2RlIGoNCgkJCSAgIGluDQoJCQkgICAgIExpc3QucHVzaChy
b290cywgbF9ub2RlKTsNCgkJCSAgICAgY29udGlmeSA6PSB0cnVlOw0KCQkJICAgICBhZGRFZGdl
IHtmcm9tID0gbF9ub2RlLA0KCQkJCSAgICAgIHRvID0gZl9ub2RlfQ0KCQkJICAgZW5kDQoJCSAg
ICAgICAgfCBGdW5jTGFiZWwgZw0KCQkJPT4gbGV0DQoJCQkgICAgIHZhbCBsX25vZGUgPSBnZXRG
dW5jTm9kZSBnDQoJCQkgICBpbg0KCQkJICAgICBjb250aWZ5IDo9IHRydWU7DQoJCQkgICAgIGFk
ZEVkZ2Uge2Zyb20gPSBsX25vZGUsDQoJCQkJICAgICAgdG8gPSBmX25vZGV9DQoJCQkgICBlbmQN
CgkJICAgZW5kKQ0KCSAgdmFsIF8gPSByZXNldCAoZm4gXyA9PiB0cnVlKQ0KDQoJICBmdW4gY2Fz
Y2FkZSBmcw0KCSAgICA9IGxldA0KCQl2YWwge3llcyA9IGNvbnRpZmlhYmxlLCBubyA9IHVuY29u
dGlmaWFibGV9DQoJCSAgPSBMaXN0LnBhcnRpdGlvbg0KCQkgICAgKExpc3QucmV2IGZzLCBmbiBn
ID0+IEZ1bmNEYXRhLmNvbnRpZnkgKGdldEZ1bmNEYXRhIGcpKQ0KDQoJCWZ1biBkb2l0IGYNCgkJ
ICA9IGxldA0KCQkgICAgICB2YWwgRnVuY0RhdGEuVCB7Y2FsbGVlcywgcHJlZml4ZXMsIC4uLn0g
PSBnZXRGdW5jRGF0YSBmDQoJCSAgICBpbg0KCQkgICAgICBMaXN0LmZvcmVhY2gNCgkJICAgICAg
KCEoI3RhaWwgY2FsbGVlcyksDQoJCSAgICAgICBmbiBnID0+IGlmIChGdW5jRGF0YS5zdGF0dXMg
KGdldEZ1bmNEYXRhIGcpKSA8PiBET05FDQoJCQkJIHRoZW4gbGV0DQoJCQkJCXZhbCBjb250aWZ5
IA0KCQkJCQkgID0gRnVuY0RhdGEuY29udGlmeScgKGdldEZ1bmNEYXRhIGcpDQoJCQkJICAgICAg
aW4NCgkJCQkJY29udGlmeSA6PSBmYWxzZQ0KCQkJCSAgICAgIGVuZA0KCQkJCSBlbHNlICgpKTsN
CgkJICAgICAgTGlzdC5mb3JlYWNoKCFwcmVmaXhlcywgZG9pdCkNCgkJICAgIGVuZA0KCSAgICAg
IGluDQoJCWNhc2UgdW5jb250aWZpYWJsZQ0KCQkgIG9mIFtdIA0KCQkgICA9PiBjb250aWZpYWJs
ZQ0KCQkgICB8IF8gDQoJCSAgID0+IGxldA0KCQkJdmFsIF8gPSBMaXN0LmZvcmVhY2ggKHVuY29u
dGlmaWFibGUsIGRvaXQpDQoJCSAgICAgIGluDQoJCQljYXNjYWRlIGNvbnRpZmlhYmxlDQoJCSAg
ICAgIGVuZA0KCSAgICAgIGVuZA0KDQoJICAoKiBTdHJvbmdseSBjb25uZWN0ZWQgY29tcG9uZW50
cyBvZiBhIGdyb3VwIG9mIGZ1bmN0aW9ucy4gKikNCgkgIGZ1biBnZXRTQ0NTIChmczogRnVuYy50
IGxpc3QpIDogRnVuYy50IGxpc3QgbGlzdA0KCSAgICA9IGxldA0KCQl2YWwge0csIGFkZEVkZ2Us
IGFkZEVkZ2UnLA0KCQkgICAgIGdldE5vZGVJbmZvLCBnZXRGdW5jTm9kZSwgDQoJCSAgICAgcmVz
ZXR9DQoJCSAgPSBKdW1wRnVuY0dyYXBoLm5ld0Z1bmNHcmFwaCB7Z2V0RnVuY0RhdGEgPSBnZXRG
dW5jRGF0YX0NCg0KCQl2YWwgXyANCgkJICA9IExpc3QuZm9yZWFjaA0KCQkgICAgKGZzLA0KCQkg
ICAgIGZuIGYgPT4gbGV0DQoJCQkgICAgICAgdmFsIGNhbGxlcnMgPSBGdW5jRGF0YS5jYWxsZXJz
JyAoZ2V0RnVuY0RhdGEgZikNCgkJCSAgICAgICB2YWwgZl9ub2RlID0gZ2V0RnVuY05vZGUgZg0K
DQoJCQkgICAgICAgZnVuIGRvaXQgZw0KCQkJCSA9IGlmIExpc3QuY29udGFpbnMoZnMsIGcsIEZ1
bmMuZXF1YWxzKQ0KCQkJCSAgICAgdGhlbiBsZXQNCgkJCQkJICAgIHZhbCBnX25vZGUgPSBnZXRG
dW5jTm9kZSBnDQoJCQkJCSAgaW4NCgkJCQkJICAgIGFkZEVkZ2Uge2Zyb20gPSBmX25vZGUsDQoJ
CQkJCQkgICAgIHRvID0gZ19ub2RlfQ0KCQkJCQkgIGVuZA0KCQkJCSAgICAgZWxzZSAoKQ0KCQkJ
ICAgICBpbg0KCQkJICAgICAgIExpc3QuZm9yZWFjaA0KCQkJICAgICAgICghKCNub250YWlsIGNh
bGxlcnMpLCANCgkJCQlmbiAoZyxfKSA9PiBkb2l0IGcpOw0KCQkJICAgICAgIExpc3QuZm9yZWFj
aA0KCQkJICAgICAgICghKCN0YWlsIGNhbGxlcnMpLCANCgkJCQlmbiBnID0+IGRvaXQgZykNCgkJ
CSAgICAgZW5kKQ0KDQoJCXZhbCBzY2NzID0gR3JhcGguc3Ryb25nbHlDb25uZWN0ZWRDb21wb25l
bnRzIEcNCgkJdmFsIF8gPSByZXNldCAoZm4gXyA9PiB0cnVlKQ0KCSAgICAgIGluDQoJCUxpc3Qu
bWFwIChzY2NzLCBmbiBzY2MgPT4gTGlzdC5yZXZNYXAgKHNjYywgZ2V0Tm9kZUluZm8pKQ0KCSAg
ICAgIGVuZA0KDQoJICBleGNlcHRpb24gTm9wZQ0KCSAgZnVuIGdldFNDQ1NIZWFkcyAoZnMgOiBG
dW5jLnQgbGlzdCkgOiBGdW5jLnQgbGlzdA0KCSAgICA9IChjYXNjYWRlIG8gTGlzdC5jb25jYXRN
YXApDQoJICAgICAgKGdldFNDQ1MgZnMsDQoJICAgICAgIGZuIGZzDQoJICAgICAgICA9PiBsZXQN
CgkJICAgICB2YWwgb3V0c2lkZUNhbGxlZSA9IHJlZiBOT05FDQoJCSAgICAgdmFsIF8NCgkJICAg
ICAgID0gTGlzdC5mb3JlYWNoDQoJCSAgICAgICAgIChmcywNCgkJCSAgZm4gZiA9PiBsZXQNCgkJ
CQkgICAgdmFsIGNhbGxlcnMgDQoJCQkJICAgICAgPSBGdW5jRGF0YS5jYWxsZXJzJyAoZ2V0RnVu
Y0RhdGEgZikNCgkJCQkgICAgZnVuIGNoZWNrIGcNCgkJCQkgICAgICA9IG5vdCAoTGlzdC5jb250
YWlucyhmcywgZywgRnVuYy5lcXVhbHMpKQ0KCQkJCSAgaW4NCgkJCQkgICAgaWYgTGlzdC5leGlz
dHMNCgkJCQkgICAgICAgKCEoI25vbnRhaWwgY2FsbGVycyksDQoJCQkJCWZuIChnLF8pID0+IGNo
ZWNrIGcpDQoJCQkJICAgICAgIG9yZWxzZQ0KCQkJCSAgICAgICBMaXN0LmV4aXN0cw0KCQkJCSAg
ICAgICAoISgjdGFpbCBjYWxsZXJzKSwNCgkJCQkJZm4gZyA9PiBjaGVjayBnKQ0KCQkJCSAgICAg
IHRoZW4gY2FzZSAhb3V0c2lkZUNhbGxlZQ0KCQkJCQkgICAgIG9mIE5PTkUgPT4gb3V0c2lkZUNh
bGxlZSA6PSBTT01FIGYNCgkJCQkJICAgICAgfCBTT01FIF8gPT4gcmFpc2UgTm9wZQ0KCQkJCSAg
ICAgIGVsc2UgKCkNCgkJCQkgIGVuZCkNCgkJICAgaW4NCgkJICAgICBjYXNlICFvdXRzaWRlQ2Fs
bGVlDQoJCSAgICAgICBvZiBOT05FID0+IEVycm9yLmJ1ZyAiZ2V0U0NDSGVhZHMiDQoJCQl8IFNP
TUUgZiANCgkJCT0+IGxldA0KCQkJICAgICB2YWwgcHJlZml4ZXMgPSBGdW5jRGF0YS5wcmVmaXhl
cycgKGdldEZ1bmNEYXRhIGYpDQoJCQkgICAgIHZhbCByZXN0ID0gTGlzdC5yZW1vdmVGaXJzdCAN
CgkJCSAgICAgICAgICAgICAgICAoZnMsIGZuIGcgPT4gRnVuYy5lcXVhbHMgKGYsIGcpKQ0KCQkJ
ICAgICB2YWwgcHJlZml4ID0gZ2V0U0NDU0hlYWRzIHJlc3QNCgkJCSAgIGluDQoJCQkgICAgIHBy
ZWZpeGVzIDo9IHByZWZpeCBAICFwcmVmaXhlczsNCgkJCSAgICAgW2ZdDQoJCQkgICBlbmQNCgkJ
ICAgZW5kDQoJCSAgIGhhbmRsZSBOb3BlDQoJCSAgICA9PiAoTGlzdC5mb3JlYWNoDQoJCQkoZnMs
DQoJCQkgZm4gZiA9PiBsZXQNCgkJCQkgICB2YWwgY29udGlmeSANCgkJCQkgICAgID0gRnVuY0Rh
dGEuY29udGlmeScgKGdldEZ1bmNEYXRhIGYpDQoJCQkJIGluDQoJCQkJICAgY29udGlmeSA6PSBm
YWxzZQ0KCQkJCSBlbmQpOw0KCQkJZnMpKQ0KDQoJICBkYXRhdHlwZSB6ID0gZGF0YXR5cGUgSnVt
cEZ1bmNHcmFwaC50DQoJICBmdW4gcHJvY2Vzc05vZGUgbg0KCSAgICA9IGxldA0KCQl2YWwgc3Vj
Y3MgPSBMaXN0Lm1hcChOb2RlLnN1Y2Nlc3NvcnMgbiwgRWRnZS4gdG8pDQoJCXZhbCBfIA0KCQkg
ID0gQXNzZXJ0LmFzc2VydA0KCQkgICAgKCJUcmFuc2Zvcm0udHJhbnNmb3JtOiBwcm9jZXNzTm9k
ZSIsDQoJCSAgICAgZm4gKCkgDQoJCSAgICAgID0+IExpc3QuZm9yYWxsDQoJCSAgICAgICAgIChz
dWNjcywNCgkJCSAgZm4gbiANCgkJCSAgID0+IGNhc2UgZ2V0Tm9kZUluZm8gbg0KCQkJCW9mIEp1
bXBOb2RlIGoNCgkJCQkgPT4gSnVtcERhdGEuc3RhdHVzIChnZXRKdW1wRGF0YSBqKSA9IERPTkUN
CgkJCSAgICAgICAgIHwgRnVuY05vZGUgZg0KCQkJCSA9PiBGdW5jRGF0YS5zdGF0dXMgKGdldEZ1
bmNEYXRhIGYpID0gRE9ORSkpDQoNCgkJdmFsIHN1Y2NzID0gTGlzdC5rZWVwQWxsTWFwDQoJCSAg
ICAgICAgICAgIChzdWNjcywNCgkJCSAgICAgZm4gbiA9PiBjYXNlIGdldE5vZGVJbmZvIG4NCgkJ
CQkgICAgICAgb2YgSnVtcE5vZGUgaiA9PiBOT05FDQoJCQkJICAgICAgICB8IEZ1bmNOb2RlIGYg
PT4gU09NRSBmKQ0KDQoJCWZ1biBkb2l0IChwcmVmaXhlcywgc3RhdHVzKQ0KCQkgID0gKExpc3Qu
Zm9yZWFjaA0KCQkgICAgIChzdWNjcywNCgkJICAgICAgZm4gZiA9PiAoRnVuY0RhdGEuc3RhdHVz
JyAoZ2V0RnVuY0RhdGEgZikpIDo9IENVUlJFTlQpOw0KCQkgICAgIHByZWZpeGVzIDo9IChnZXRT
Q0NTSGVhZHMgc3VjY3MpIEAgIXByZWZpeGVzOw0KCQkgICAgIExpc3QuZm9yZWFjaA0KCQkgICAg
IChzdWNjcywNCgkJICAgICAgZm4gZiA9PiAoRnVuY0RhdGEuc3RhdHVzJyAoZ2V0RnVuY0RhdGEg
ZikpIDo9IERPTkUpOw0KCQkgICAgIHN0YXR1cyA6PSBET05FKQ0KCSAgICAgIGluIA0KCQljYXNl
IGdldE5vZGVJbmZvIG4NCgkJICBvZiBKdW1wTm9kZSBqIA0KCQkgICA9PiBsZXQNCgkJCXZhbCBw
cmVmaXhlcyA9IEp1bXBEYXRhLnByZWZpeGVzJyAoZ2V0SnVtcERhdGEgaikNCgkJCXZhbCBzdGF0
dXMgPSBKdW1wRGF0YS5zdGF0dXMnIChnZXRKdW1wRGF0YSBqKQ0KCQkgICAgICBpbiANCgkJCWRv
aXQgKHByZWZpeGVzLCBzdGF0dXMpDQoJCSAgICAgIGVuZCANCgkJICAgfCBGdW5jTm9kZSBmDQoJ
CSAgID0+IGxldA0KCQkJdmFsIHByZWZpeGVzID0gRnVuY0RhdGEucHJlZml4ZXMnIChnZXRGdW5j
RGF0YSBmKQ0KCQkJdmFsIHN0YXR1cyA9IEZ1bmNEYXRhLnN0YXR1cycgKGdldEZ1bmNEYXRhIGYp
DQoJCSAgICAgIGluIA0KCQkJZG9pdCAocHJlZml4ZXMsIHN0YXR1cykNCgkJICAgICAgZW5kDQoJ
ICAgICAgZW5kDQoNCgkgIHZhbCBkZnNfcGFyYW0gPSBEZnNQYXJhbS5maW5pc2hOb2RlIHByb2Nl
c3NOb2RlDQoJICB2YWwgXyA9IEdyYXBoLmRmc05vZGVzIChHLCAhcm9vdHMsIGRmc19wYXJhbSkN
Cg0KCSAgKCogRm9yIGZ1bmN0aW9ucyB0dXJuZWQgaW50byBjb250aW51YXRpb25zLA0KCSAgICog
IHJlY29yZCB0aGVpciBhcmdzLCBib2R5LCBhbmQgbmV3IG5hbWUuDQoJICAgKikNCgkgIHZhbCBf
IA0KCSAgICA9IFZlY3Rvci5mb3JlYWNoDQoJICAgICAgKGZ1bmN0aW9ucywNCgkgICAgICAgZm4g
e25hbWUgPSBmLCBhcmdzID0gZl9hcmdzLCBib2R5ID0gZl9ib2R5LCAuLi59IA0KCSAgICAgICAg
PT4gbGV0DQoJCSAgICAgdmFsIEZ1bmNEYXRhLlQge2NvbnRpZnksIHJlcGxhY2UsIC4uLn0gPSBn
ZXRGdW5jRGF0YSBmDQoJCSAgICAgdmFsIF8gDQoJCSAgICAgICA9IEFzc2VydC5hc3NlcnQNCgkJ
ICAgICAgICAgKCJUcmFuc2Zvcm0udHJhbnNmb3JtOiBET05FIiwNCgkJCSAgZm4gKCkgPT4gRnVu
Y0RhdGEuc3RhdHVzIChnZXRGdW5jRGF0YSBmKSA9IERPTkUpDQoJCSAgIGluDQoJCSAgICAgaWYg
IWNvbnRpZnkNCgkJICAgICAgIHRoZW4gbGV0DQoJCQkgICAgICB2YWwganVtcCA9IEp1bXAubmV3
U3RyaW5nIChGdW5jLm9yaWdpbmFsTmFtZSBmKQ0KCQkJICAgIGluIA0KCQkJICAgICAgcmVwbGFj
ZSA6PSBTT01FIHtqdW1wID0ganVtcCwNCgkJCQkJICAgICAgIGFyZ3MgPSBmX2FyZ3MsDQoJCQkJ
CSAgICAgICBib2R5ID0gZl9ib2R5fQ0KCQkJCQkgICAgICAgDQoJCQkgICAgZW5kDQoJCSAgICAg
ICBlbHNlICgpDQoJCSAgIGVuZCkNCg0KCSAgKCogV2FsayBvdmVyIGFsbCBmdW5jdGlvbnMsIHJl
bW92aW5nIHRob3NlIHRoYXQgYXJlbid0IHRvcCBsZXZlbCwNCgkgICAqICBhbmQgZGVzY2VuaW5n
IHRob3NlIHRoYXQgYXJlLCBpbnNlcnRpbmcgbG9jYWwgZnVuY3Rpb25zDQoJICAgKiAgd2hlcmUg
bmVjZXNzYXJ5Lg0KCSAgICogLSB0dXJuIHRhaWwgY2FsbHMgaW50byBub250YWlsIGNhbGxzDQoJ
ICAgKiAtIHR1cm4gcmV0dXJucyBpbnRvIGp1bXBzDQoJICAgKikNCgkgIGZ1biB3YWxrRXhwIChm
OiBGdW5jLnQsIGU6IEV4cC50LCBjOiBKdW1wLnQgb3B0aW9uKTogRXhwLnQgDQoJICAgID0gbGV0
DQoJCXZhbCB7ZGVjcywgdHJhbnNmZXJ9ID0gRXhwLmRlc3QgZQ0KCQl2YWwgZGVjcw0KCQkgID0g
TGlzdC5mb2xkDQoJCSAgICAoTGlzdC5yZXYgZGVjcywNCgkJICAgICBbXSwNCgkJICAgICBmbiAo
ZCwgZHMpDQoJCSAgICAgID0+IGNhc2UgZCANCgkJCSAgIG9mIEJpbmQgXyA9PiBkIDo6IGRzDQoJ
CQkgICAgfCBGdW4ge25hbWUgPSBqLCBhcmdzLCBib2R5fSANCgkJCSAgICA9PiBGdW4ge25hbWUg
PSBqLA0KCQkJCSAgICBhcmdzID0gYXJncywNCgkJCQkgICAgYm9keSA9IHdhbGtFeHAgKGYsIGJv
ZHksIGMpfSA6Og0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldA0KCQkJCSB2YWwg
cHJlZml4ZXMNCgkJCQkgICA9IEp1bXBEYXRhLnByZWZpeGVzIChnZXRKdW1wRGF0YSBqKQ0KCQkJ
ICAgICAgIGluDQoJCQkJIHByZWZpeF9kZWMgKHByZWZpeGVzLCBTT01FIGosIGRzKQ0KCQkJICAg
ICAgIGVuZA0KCQkJICAgIHwgSGFuZGxlclB1c2ggaCA9PiBIYW5kbGVyUHVzaCBoIDo6IGRzDQoJ
CQkgICAgfCBIYW5kbGVyUG9wID0+IEhhbmRsZXJQb3AgOjogZHMpDQoNCgkJZnVuIG1ha2UgdHJh
bnNmZXIgPSBFeHAubWFrZSB7ZGVjcyA9IGRlY3MsIHRyYW5zZmVyID0gdHJhbnNmZXJ9DQoJICAg
ICAgaW4NCgkJY2FzZSB0cmFuc2Zlcg0KCQkgIG9mIENhbGwge2Z1bmMsIGFyZ3MsIGNvbnR9IA0K
CQkgICA9PiBsZXQNCgkJCXZhbCByZXBsYWNlID0gRnVuY0RhdGEucmVwbGFjZSAoZ2V0RnVuY0Rh
dGEgZnVuYykNCgkJICAgICAgaW4NCgkJCWNhc2UgcmVwbGFjZQ0KCQkJICBvZiBOT05FID0+IG1h
a2UgKENhbGwge2Z1bmMgPSBmdW5jLA0KCQkJCQkJIGFyZ3MgPSBhcmdzLA0KCQkJCQkJIGNvbnQg
PSBjYXNlIGNvbnQNCgkJCQkJCQkgIG9mIE5PTkUgPT4gYw0KCQkJCQkJCSAgIHwgU09NRSBfID0+
IGNvbnR9KQ0KCQkJICAgfCBTT01FIHtqdW1wLCAuLi59DQoJCQkgICA9PiBtYWtlIChKdW1wIHtk
c3QgPSBqdW1wLCBhcmdzID0gYXJnc30pDQoJCSAgICAgIGVuZA0KCQkgICB8IFJldHVybiB4cw0K
CQkgICA9PiBtYWtlIChjYXNlIGMNCgkJCSAgICAgIG9mIE5PTkUgPT4gdHJhbnNmZXINCgkJCSAg
ICAgICB8IFNPTUUgYyA9PiBKdW1wIHtkc3QgPSBjLCBhcmdzID0geHN9KQ0KCQkgICB8IF8gPT4g
bWFrZSB0cmFuc2Zlcg0KCSAgICAgIGVuZA0KCSAgYW5kIHByZWZpeF9kZWMgKGZzOiBGdW5jLnQg
bGlzdCwgDQoJCQkgIGM6IEp1bXAudCBvcHRpb24sIA0KCQkJICBkczogRGVjLnQgbGlzdCkgOiBE
ZWMudCBsaXN0DQoJICAgID0gTGlzdC5mb2xkDQoJICAgICAgKExpc3QucmV2IGZzLA0KCSAgICAg
ICBkcywNCgkgICAgICAgZm4gKGYsIGRzKQ0KCSAgICAgICAgPT4gbGV0DQoJCSAgICAgdmFsIEZ1
bmNEYXRhLlQge3JlcGxhY2UsIHByZWZpeGVzLCAuLi59DQoJCSAgICAgICA9IGdldEZ1bmNEYXRh
IGYNCgkJICAgICB2YWwge2p1bXAsIGFyZ3MsIGJvZHl9ID0gdmFsT2YgKCFyZXBsYWNlKQ0KCQkg
ICAgIHZhbCBib2R5ID0gcHJlZml4X2V4cCAoIXByZWZpeGVzLCBjLCB3YWxrRXhwIChmLCBib2R5
LCBjKSkNCgkJICAgaW4NCgkJICAgICBGdW4ge25hbWUgPSBqdW1wLCBhcmdzID0gYXJncywgYm9k
eSA9IGJvZHl9IDo6IGRzDQoJCSAgIGVuZCkNCgkgIGFuZCBwcmVmaXhfZXhwIChmczogRnVuYy50
IGxpc3QsDQoJCQkgIGM6IEp1bXAudCBvcHRpb24sDQoJCQkgIGU6IEV4cC50KSA6IEV4cC50DQoJ
ICAgID0gbGV0DQoJCXZhbCB7ZGVjcywgdHJhbnNmZXJ9ID0gRXhwLmRlc3QgZQ0KCSAgICAgIGlu
DQoJCUV4cC5tYWtlIHtkZWNzID0gcHJlZml4X2RlYyAoZnMsIGMsIGRlY3MpLA0KCQkJICB0cmFu
c2ZlciA9IHRyYW5zZmVyfQ0KCSAgICAgIGVuZA0KDQoJICB2YWwgc2hyaW5rRXhwID0gc2hyaW5r
RXhwIGdsb2JhbHMNCgkgIHZhbCBmdW5jdGlvbnMgDQoJICAgID0gVmVjdG9yLmZyb21MaXN0DQoJ
ICAgICAgKFZlY3Rvci5mb2xkcg0KCSAgICAgICAoZnVuY3Rpb25zLCANCgkJW10sIA0KCSAgICAg
ICAgZm4gKHtuYW1lID0gZiwgYXJncyA9IGZfYXJncywgDQoJCSAgICAgYm9keSA9IGZfYm9keSwg
cmV0dXJucyA9IGZfcmV0dXJuc30sIA0KCQkgICAgZnVuY3Rpb25zKQ0KCSAgICAgICAgID0+IGxl
dA0KCQkgICAgICB2YWwgRnVuY0RhdGEuVCB7QSwgcmVwbGFjZSwgcHJlZml4ZXMsIC4uLn0gDQoJ
CQk9IGdldEZ1bmNEYXRhIGYNCgkJICAgIGluDQoJCSAgICAgIGNhc2UgIXJlcGxhY2UNCgkJCW9m
IE5PTkUNCgkJCSA9PiBpZiBSZXR1cm4uaXNVbmNhbGxlZCAoIUEpDQoJCQkgICAgICB0aGVuIGZ1
bmN0aW9ucw0KCQkJICAgICAgZWxzZSBsZXQNCgkJCQkgICAgIHZhbCBmX2JvZHkgDQoJCQkJICAg
ICAgID0gcHJlZml4X2V4cCAoIXByZWZpeGVzLCANCgkJCQkJCSAgICAgTk9ORSwgDQoJCQkJCQkg
ICAgIHdhbGtFeHAgKGYsIGZfYm9keSwgTk9ORSkpDQoJCQkJICAgICB2YWwgZl9ib2R5ID0gc2hy
aW5rRXhwIGZfYm9keQ0KCQkJCSAgIGluDQoJCQkJICAgICB7bmFtZSA9IGYsDQoJCQkJICAgICAg
YXJncyA9IGZfYXJncywNCgkJCQkgICAgICBib2R5ID0gZl9ib2R5LA0KCQkJCSAgICAgIHJldHVy
bnMgPSBmX3JldHVybnN9IDo6IGZ1bmN0aW9ucw0KCQkJCSAgIGVuZA0KCQkJIHwgXyA9PiBmdW5j
dGlvbnMNCgkJICAgIGVuZCkpDQoJICB2YWwgcHJvZ3JhbSANCgkgICAgPSBQcm9ncmFtLlQge2Rh
dGF0eXBlcyA9IGRhdGF0eXBlcywNCgkJCSBnbG9iYWxzID0gZ2xvYmFscywNCgkJCSBmdW5jdGlv
bnMgPSBmdW5jdGlvbnMsDQoJCQkgbWFpbiA9IG1haW59DQoJaW4NCgkgIHByb2dyYW0NCgllbmQN
CiAgICB2YWwgdHJhbnNmb3JtIA0KICAgICAgPSBDb250cm9sLnRyYWNlQ2FsbCAidHJhbnNmb3Jt
IiB0cmFuc2Zvcm0NCiAgZW5kDQoNCnN0cnVjdHVyZSBEaWFnbm9zdGljcyA9DQogIHN0cnVjdA0K
ICAgIGZ1biBkaWFnbm9zdGljcyB7cHJvZ3JhbSBhcyBQcm9ncmFtLlQge2Z1bmN0aW9ucywgLi4u
fSwNCgkJICAgICBnZXRGdW5jRGF0YTogRnVuYy50IC0+IEZ1bmNEYXRhLnR9DQogICAgICA9IGlm
ICFDb250cm9sLmNvbnRpZnlEaWFnDQoJICB0aGVuIGxldA0KCQkgZGF0YXR5cGUgeiA9IGRhdGF0
eXBlIFJldHVybi50DQoNCgkJICgqIHByaW50IG91dCBlbnRpcmUgY3BzIElMICopDQoJCSB2YWwg
Y3BzID0gZmFsc2UNCgkJICgqIHByaW50IG91dCB0aGUgUmV0dXJuIGZvciBlYWNoIGZ1bmN0aW9u
ICopDQoJCSB2YWwgYW5hbHlzaXMgPSBmYWxzZQ0KCQkgKCogcHJpbnQgb3V0IGFjdGlvbiAoY29u
dGlmaWFibGUsIHJlbW92ZWFibGUpICopDQoJCSB2YWwgYWN0aW9uID0gZmFsc2UNCgkJICgqIHBy
aW50IG91dCB0aGUgdG90YWxzICopDQoJCSB2YWwgdG90YWxzID0gdHJ1ZQ0KDQoJCSB2YWwgXw0K
CQkgICA9IGlmIGNwcw0KCQkgICAgICAgdGhlbiBQcm9ncmFtLmxheW91dHMNCgkJCSAgICAocHJv
Z3JhbSwgDQoJCQkgICAgIGZuIGwgPT4gKExheW91dC5vdXRwdXQgKGwsIE91dC5lcnJvcikNCgkJ
CQkgICAgICA7IE91dC5uZXdsaW5lIE91dC5lcnJvcikpDQoJCSAgICAgICBlbHNlICgpDQoNCgkJ
IHZhbCBjYWxsID0gcmVmIDANCgkJIHZhbCBjb250ID0gcmVmIDANCgkJIHZhbCBkb20gPSByZWYg
MA0KCQkgdmFsIGNhbGxfY29udCA9IHJlZiAwDQoJCSB2YWwgY2FsbF9kb20gPSByZWYgMA0KCQkg
dmFsIGNvbnRfZG9tID0gcmVmIDANCgkJIHZhbCBjYWxsX2NvbnRfZG9tID0gcmVmIDANCg0KCQkg
dmFsIHJlbV9jYWxsID0gcmVmIDANCgkJIHZhbCByZW1fY29udCA9IHJlZiAwDQoJCSB2YWwgcmVt
X2RvbSA9IHJlZiAwDQoJCSB2YWwgcmVtX2NhbGxfY29udCA9IHJlZiAwDQoJCSB2YWwgcmVtX2Nh
bGxfZG9tID0gcmVmIDANCgkJIHZhbCByZW1fY29udF9kb20gPSByZWYgMA0KCQkgdmFsIHJlbV9j
YWxsX2NvbnRfZG9tID0gcmVmIDANCgkgICAgICAgaW4gDQoJCSBWZWN0b3IuZm9yZWFjaA0KCQkg
KGZ1bmN0aW9ucywgZm4ge25hbWUsIC4uLn0gPT4NCgkJICBsZXQNCgkJICAgIHZhbCBGdW5jRGF0
YS5UIHtBQ2FsbCwgQUNvbnQsIEFEb20sIC4uLn0NCgkJICAgICAgPSBnZXRGdW5jRGF0YSBuYW1l
DQoJCSAgICAgIA0KCQkgICAgdmFsIF8gDQoJCSAgICAgID0gaWYgYW5hbHlzaXMNCgkJCSAgdGhl
biBwcmludCAoY29uY2F0IFtGdW5jLnRvU3RyaW5nIG5hbWUsDQoJCQkJCSAgICAgICI6OiIsDQoJ
CQkJCSAgICAgICIgQUNhbGw6ICIsDQoJCQkJCSAgICAgIFJldHVybi50b1N0cmluZyAoIUFDYWxs
KSwNCgkJCQkJICAgICAgIiBBQ29udDogIiwNCgkJCQkJICAgICAgUmV0dXJuLnRvU3RyaW5nICgh
QUNvbnQpLA0KCQkJCQkgICAgICAiIEFEb206ICIsDQoJCQkJCSAgICAgIFJldHVybi50b1N0cmlu
ZyAoIUFEb20pLA0KCQkJCQkgICAgICAiXG4iXSkNCgkJCSAgZWxzZSAoKQ0KCQkJICAgIA0KCQkg
ICAgZnVuIGRvaXQgKHIsIHMpIA0KCQkgICAgICA9IChJbnQuaW5jIHINCgkJCSA7IGlmIGFjdGlv
bg0KCQkJICAgICB0aGVuIHByaW50IChjb25jYXQgW3MsIA0KCQkJCQkJICIgIiwNCgkJCQkJCSBG
dW5jLnRvU3RyaW5nIG5hbWUsIA0KCQkJCQkJICJcbiJdKQ0KCQkJICAgICBlbHNlICgpKQ0KCQkg
ICAgICANCgkJICAgIGZ1biBjaGVjayBBID0gY2FzZSAhQQ0KCQkJCSAgICBvZiBVbmNhbGxlZCA9
PiAoZmFsc2UsIHRydWUpDQoJCQkJICAgICB8IEZ1bmNMYWJlbCBfID0+ICh0cnVlLCBmYWxzZSkN
CgkJCQkgICAgIHwgSnVtcExhYmVsIF8gPT4gKHRydWUsIGZhbHNlKQ0KCQkJCSAgICAgfCBVbmtu
b3duID0+IChmYWxzZSwgZmFsc2UpDQoJCQkJCQ0KCQkgICAgdmFsIChjYW5fY2FsbCwgY2FuX3Jl
bV9jYWxsKSA9IGNoZWNrIEFDYWxsDQoJCSAgICB2YWwgKGNhbl9jb250LCBjYW5fcmVtX2NvbnQp
ID0gY2hlY2sgQUNvbnQNCgkJICAgIHZhbCAoY2FuX2RvbSwgY2FuX3JlbV9kb20pID0gY2hlY2sg
QURvbQ0KCQkgIGluIA0KCQkgICAgY2FzZSAoY2FuX2NhbGwsIGNhbl9jb250LCBjYW5fZG9tKQ0K
CQkgICAgICBvZiAodHJ1ZSwgdHJ1ZSwgdHJ1ZSkNCgkJICAgICAgID0+IGRvaXQgKGNhbGxfY29u
dF9kb20sICJjYWxsX2NvbnRfZG9tIikNCgkJICAgICAgIHwgKHRydWUsIHRydWUsIGZhbHNlKQ0K
CQkgICAgICAgPT4gZG9pdCAoY2FsbF9jb250LCAiY2FsbF9jb250IikNCgkJICAgICAgIHwgKHRy
dWUsIGZhbHNlLCB0cnVlKQ0KCQkgICAgICAgPT4gZG9pdCAoY2FsbF9kb20sICJjYWxsX2RvbSIp
DQoJCSAgICAgICB8ICh0cnVlLCBmYWxzZSwgZmFsc2UpDQoJCSAgICAgICA9PiBkb2l0IChjYWxs
LCAiY2FsbCIpDQoJCSAgICAgICB8IChmYWxzZSwgdHJ1ZSwgdHJ1ZSkNCgkJICAgICAgID0+IGRv
aXQgKGNvbnRfZG9tLCAiY29udF9kb20iKQ0KCQkgICAgICAgfCAoZmFsc2UsIHRydWUsIGZhbHNl
KQ0KCQkgICAgICAgPT4gZG9pdCAoY29udCwgImNvbnQiKQ0KCQkgICAgICAgfCAoZmFsc2UsIGZh
bHNlLCB0cnVlKQ0KCQkgICAgICAgPT4gZG9pdCAoZG9tLCAiZG9tIikNCgkJICAgICAgIHwgKGZh
bHNlLCBmYWxzZSwgZmFsc2UpDQoJCSAgICAgICA9PiAoKTsNCgkJICAgIGNhc2UgKGNhbl9yZW1f
Y2FsbCwgY2FuX3JlbV9jb250LCBjYW5fcmVtX2RvbSkNCgkJICAgICAgb2YgKHRydWUsIHRydWUs
IHRydWUpDQoJCSAgICAgICA9PiBkb2l0IChyZW1fY2FsbF9jb250X2RvbSwgInJlbV9jYWxsX2Nv
bnRfZG9tIikNCgkJICAgICAgIHwgKHRydWUsIHRydWUsIGZhbHNlKQ0KCQkgICAgICAgPT4gZG9p
dCAocmVtX2NhbGxfY29udCwgInJlbV9jYWxsX2NvbnQiKQ0KCQkgICAgICAgfCAodHJ1ZSwgZmFs
c2UsIHRydWUpDQoJCSAgICAgICA9PiBkb2l0IChyZW1fY2FsbF9kb20sICJyZW1fY2FsbF9kb20i
KQ0KCQkgICAgICAgfCAodHJ1ZSwgZmFsc2UsIGZhbHNlKQ0KCQkgICAgICAgPT4gZG9pdCAocmVt
X2NhbGwsICJyZW1fY2FsbCIpDQoJCSAgICAgICB8IChmYWxzZSwgdHJ1ZSwgdHJ1ZSkNCgkJICAg
ICAgID0+IGRvaXQgKHJlbV9jb250X2RvbSwgInJlbV9jb250X2RvbSIpDQoJCSAgICAgICB8IChm
YWxzZSwgdHJ1ZSwgZmFsc2UpDQoJCSAgICAgICA9PiBkb2l0IChyZW1fY29udCwgInJlbV9jb250
IikNCgkJICAgICAgIHwgKGZhbHNlLCBmYWxzZSwgdHJ1ZSkNCgkJICAgICAgID0+IGRvaXQgKHJl
bV9kb20sICJyZW1fZG9tIikNCgkJICAgICAgIHwgKGZhbHNlLCBmYWxzZSwgZmFsc2UpDQoJCSAg
ICAgICA9PiAoKQ0KCQkgIGVuZCk7DQoJCSBpZiB0b3RhbHMNCgkJICAgdGhlbiBwcmludCAoY29u
Y2F0DQoJCQkgICAgICAgWyJmdW5jdGlvbnM6ICIsDQoJCQkJSW50LnRvU3RyaW5nIChWZWN0b3Iu
bGVuZ3RoIGZ1bmN0aW9ucyksDQoJCQkJIlxuIiwNCgkJCQkiICBjYWxsX2NvbnRfZG9tOiAiLA0K
CQkJCUludC50b1N0cmluZyAoIWNhbGxfY29udF9kb20pLA0KCQkJCSIgIGNhbGxfY29udDogIiwN
CgkJCQlJbnQudG9TdHJpbmcgKCFjYWxsX2NvbnQpLA0KCQkJCSJcbiIsDQoJCQkJIiAgY2FsbF9k
b206ICIsDQoJCQkJSW50LnRvU3RyaW5nICghY2FsbF9kb20pLA0KCQkJCSIgIGNvbnRfZG9tOiAi
LA0KCQkJCUludC50b1N0cmluZyAoIWNvbnRfZG9tKSwNCgkJCQkiXG4iLA0KCQkJCSIgIGNhbGw6
ICIsDQoJCQkJSW50LnRvU3RyaW5nICghY2FsbCksDQoJCQkJIiAgY29udDogIiwNCgkJCQlJbnQu
dG9TdHJpbmcgKCFjb250KSwNCgkJCQkiICBkb206ICIsDQoJCQkJSW50LnRvU3RyaW5nICghZG9t
KSwNCgkJCQkiXG4iLA0KCQkJCSIgIHJlbV9jYWxsX2NvbnRfZG9tOiAiLA0KCQkJCUludC50b1N0
cmluZyAoIXJlbV9jYWxsX2NvbnRfZG9tKSwNCgkJCQkiICByZW1fY2FsbF9jb250OiAiLA0KCQkJ
CUludC50b1N0cmluZyAoIXJlbV9jYWxsX2NvbnQpLA0KCQkJCSJcbiIsDQoJCQkJIiAgcmVtX2Nh
bGxfZG9tOiAiLA0KCQkJCUludC50b1N0cmluZyAoIXJlbV9jYWxsX2RvbSksDQoJCQkJIiAgcmVt
X2NvbnRfZG9tOiAiLA0KCQkJCUludC50b1N0cmluZyAoIXJlbV9jb250X2RvbSksDQoJCQkJIlxu
IiwNCgkJCQkiICByZW1fY2FsbDogIiwNCgkJCQlJbnQudG9TdHJpbmcgKCFyZW1fY2FsbCksDQoJ
CQkJIiAgcmVtX2NvbnQ6ICIsDQoJCQkJSW50LnRvU3RyaW5nICghcmVtX2NvbnQpLA0KCQkJCSIg
IHJlbV9kb206ICIsDQoJCQkJSW50LnRvU3RyaW5nICghcmVtX2RvbSksDQoJCQkJIlxuIl0pDQoJ
CSAgIGVsc2UgKCkNCgkgICAgICAgZW5kDQoJICBlbHNlICgpDQogICAgdmFsIGRpYWdub3N0aWNz
IA0KICAgICAgPSBDb250cm9sLnRyYWNlQ2FsbCAiZGlhZ25vc3RpY3MiIGRpYWdub3N0aWNzDQog
IGVuZA0KDQpmdW4gY29udGlmeSAocHJvZ3JhbSBhcyBQcm9ncmFtLlQge2Z1bmN0aW9ucywgLi4u
fSkNCiAgPSBsZXQNCiAgICAgIHZhbCB7Z2V0ID0gZ2V0RnVuY0RhdGEgOiBGdW5jLnQgLT4gRnVu
Y0RhdGEudH0NCgk9IFByb3BlcnR5LmdldCAoRnVuYy5wbGlzdCwNCgkJCVByb3BlcnR5LmluaXRG
dW4NCgkJCShmbiBfID0+IEZ1bmNEYXRhLm5ldyAoKSkpDQogICAgICB2YWwge2dldCA9IGdldEp1
bXBEYXRhIDogSnVtcC50IC0+IEp1bXBEYXRhLnR9DQoJPSBQcm9wZXJ0eS5nZXQgKEp1bXAucGxp
c3QsDQoJCQlQcm9wZXJ0eS5pbml0RnVuDQoJCQkoZm4gXyA9PiBKdW1wRGF0YS5uZXcgKCkpKQ0K
DQogICAgICB2YWwgXyA9IEluaXRSZWFjaENhbGxlcnNDYWxsZWVzLmluaXRSZWFjaENhbGxlcnND
YWxsZWVzIA0KCSAgICAgIHtwcm9ncmFtID0gcHJvZ3JhbSwNCgkgICAgICAgZ2V0RnVuY0RhdGEg
PSBnZXRGdW5jRGF0YX0NCiAgICAgIHZhbCBfID0gQW5hbHl6ZUNhbGwuYW5hbHl6ZUNhbGwNCgkg
ICAgICB7cHJvZ3JhbSA9IHByb2dyYW0sDQoJICAgICAgIGdldEZ1bmNEYXRhID0gZ2V0RnVuY0Rh
dGF9DQogICAgICB2YWwgXyA9IEFuYWx5emVDb250LmFuYWx5emVDb250DQoJICAgICAge3Byb2dy
YW0gPSBwcm9ncmFtLA0KCSAgICAgICBnZXRGdW5jRGF0YSA9IGdldEZ1bmNEYXRhfQ0KICAgICAg
dmFsIF8gPSBBbmFseXplRG9tLmFuYWx5emVEb20gDQoJICAgICAge3Byb2dyYW0gPSBwcm9ncmFt
LA0KCSAgICAgICBnZXRGdW5jRGF0YSA9IGdldEZ1bmNEYXRhLA0KCSAgICAgICBnZXRKdW1wRGF0
YSA9IGdldEp1bXBEYXRhfQ0KDQogICAgICB2YWwgXyA9IERpYWdub3N0aWNzLmRpYWdub3N0aWNz
IHtwcm9ncmFtID0gcHJvZ3JhbSwNCgkJCQkgICAgICAgZ2V0RnVuY0RhdGEgPSBnZXRGdW5jRGF0
YX0NCg0KICAgICAgZGF0YXR5cGUgeiA9IGRhdGF0eXBlIFJldHVybi50DQogICAgICB2YWwgXw0K
CT0gVmVjdG9yLmZvcmVhY2gNCgkgIChmdW5jdGlvbnMsDQoJICAgZm4ge25hbWUgPSBmLCAuLi59
DQoJICAgID0+IGxldA0KCQkgdmFsIEZ1bmNEYXRhLlQge0EsIEFDYWxsLCBBQ29udCwgQURvbSwg
Li4ufQ0KCQkgICA9IGdldEZ1bmNEYXRhIGYNCgkgICAgICAgaW4NCgkJIGNhc2UgIUNvbnRyb2wu
Y29udGlmeVN0cmF0ZWd5DQoJCSAgIG9mIENvbnRyb2wuTm9uZSA9PiBBIDo9IFVua25vd24NCgkJ
ICAgIHwgQ29udHJvbC5DYWxsID0+IEEgOj0gIUFDYWxsDQoJCSAgICB8IENvbnRyb2wuQ29udCA9
PiBBIDo9ICFBQ29udA0KCQkgICAgfCBDb250cm9sLkNhbGxDb250DQoJCSAgICA9PiAoY2FzZSAo
IUFDYWxsLCAhQUNvbnQpDQoJCQkgIG9mIChVbmNhbGxlZCwgXykgPT4gQSA6PSBVbmNhbGxlZA0K
CQkJICAgfCAoXywgVW5jYWxsZWQpID0+IEEgOj0gVW5jYWxsZWQNCgkJCSAgIHwgKFVua25vd24s
IHIpID0+IEEgOj0gcg0KCQkJICAgfCAociwgVW5rbm93bikgPT4gQSA6PSByDQoJCQkgICB8IChK
dW1wTGFiZWwgaiwgSnVtcExhYmVsIGonKQ0KCQkJICAgPT4gaWYgSnVtcC5lcXVhbHMgKGosIGon
KQ0KCQkJCXRoZW4gQSA6PSBKdW1wTGFiZWwgag0KCQkJCWVsc2UgRXJyb3IuYnVnICJDYWxsQ29u
dDogaW5jb21wYXRpYmxlIg0KCQkJICAgfCAoRnVuY0xhYmVsIGYsIEZ1bmNMYWJlbCBmJykNCgkJ
CSAgID0+IGlmIEZ1bmMuZXF1YWxzIChmLCBmJykNCgkJCQl0aGVuIEEgOj0gRnVuY0xhYmVsIGYN
CgkJCQllbHNlIEVycm9yLmJ1ZyAiQ2FsbENvbnQ6IGluY29tcGF0aWJsZSINCgkJCSAgIHwgKEp1
bXBMYWJlbCBqLCBGdW5jTGFiZWwgZikNCgkJCSAgID0+IEEgOj0gRnVuY0xhYmVsIGYNCgkJCSAg
IHwgKEZ1bmNMYWJlbCBmLCBKdW1wTGFiZWwgaikNCgkJCSAgID0+IEEgOj0gRnVuY0xhYmVsIGYp
DQoJCSAgICB8IENvbnRyb2wuRG9tID0+IEEgOj0gIUFEb20NCgkgICAgICAgZW5kKQ0KDQogICAg
ICB2YWwgcHJvZ3JhbSA9IFRyYW5zZm9ybS50cmFuc2Zvcm0ge3Byb2dyYW0gPSBwcm9ncmFtLA0K
CQkJCQkgZ2V0RnVuY0RhdGEgPSBnZXRGdW5jRGF0YSwNCgkJCQkJIGdldEp1bXBEYXRhID0gZ2V0
SnVtcERhdGF9DQoNCiAgICAgIHZhbCBfID0gUHJvZ3JhbS5jbGVhciBwcm9ncmFtDQogICAgaW4N
CiAgICAgIHByb2dyYW0NCiAgICBlbmQNCmVuZA0K

---559023410-959030623-982947278=:24077--