cps & contification

Matthew Fluet fluet@CS.Cornell.EDU
Fri, 19 Jan 2001 18:22:23 -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-1804928587-979946543=:3409
Content-Type: TEXT/PLAIN; charset=US-ASCII


> Matthew, are you interested in doing the analysis implementation?  It shouldn't
> be too bad given that the dominators algorithm is already there.  If you do, it
> might be nice for you to catch up with the latest snapshot, which contains a new
> CPS IL, in which many of the lists have been changed to vectors.

Here's an updated contify.fun with the new analysis.  I checked into logic
a little more (tweaking checkDominators to run just before contify and
print out the call graph was useful, rather than tracing 47 functions by
hand), and it looks pretty clear that the mutual recursion can't be
moved into the local functions.




---559023410-1804928587-979946543=:3409
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="contify.new.fun"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.SOL.3.95.1010119182223.3409C@hoho.cs.cornell.edu>
Content-Description: 

KCogQ29weXJpZ2h0IChDKSAxOTk3LTE5OTkgTkVDIFJlc2VhcmNoIEluc3RpdHV0ZS4NCiAqIFBs
ZWFzZSBzZWUgdGhlIGZpbGUgTElDRU5TRSBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi4NCiAqKQ0K
KCoNCiAqIFRoaXMgcGFzcyBjb21iaW5lcyB0d28gYW5hbHlzZXMgYW5kIHRyYW5zZm9ybWF0aW9u
cy4NCiAqDQogKiBUaGUgZmlyc3QgYW5hbHlzaXMsICJjYWxsIGJhc2VkIiBub3RpY2VzIGlmIGEg
dG9wbGV2ZWwgZnVuY3Rpb24gaXMgY2FsbGVkDQogKiAgICAgICAxLiBmcm9tIG9uZSBwbGFjZSBv
dXRzaWRlIGl0c2VsZg0KICogICBhbmQgMi4gYWxsIGNhbGxzIHRvIGl0c2VsZiB3aXRoaW4gaXRz
ZWxmIGFyZSB0YWlsDQogKiBJZiAoMSkgYW5kICgyKSBhcmUgdHJ1ZSwgdGhlbiB0aGF0IGZ1bmN0
aW9uIGNhbiBiZSBtYWRlIGxvY2FsIGF0IHRoZSBwb2ludA0KICogb2YgaXRzIG91dGVyIGNhbGwu
DQogKg0KICogVGhlIHNlY29uZCBhbmFseXNpcyBpcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHBh
cGVyLg0KICogICBMb2NhbCBDUFMgY29udmVyc2lvbiBpbiBhIGRpcmVjdC1zdHlsZSBjb21waWxl
ci4gIEpvaG4gUmVwcHkuDQogKiBJdCBkZXRlcm1pbmVzIHRoZSBzZXQgb2YgY29udGludWF0aW9u
cyB0aGF0IGEgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGguICBJZg0KICogdGhhdCBzZXQgaXMgYSBz
aW5nbGV0b24sIHRoZW4gdGhlIGZ1bmN0aW9uIGNhbiBiZSBwcmVmaXhlZCBvbnRvIHRoZQ0KICog
Y29udGludWF0aW9uIGl0IGlzIGNhbGxlZCB3aXRoLg0KICopDQoNCmZ1bmN0b3IgQ29udGlmeSAo
UzogQ09OVElGWV9TVFJVQ1RTKTogQ09OVElGWSA9IA0Kc3RydWN0DQoNCm9wZW4gUw0Kb3BlbiBE
ZWMgVHJhbnNmZXINCg0Kc3RydWN0dXJlIFJDb250ID0NCiAgc3RydWN0DQoNCiAgICAoKiBSQ29u
dCA9IHtVbmNhbGxlZCwgVW5rbm93bn0gVSBGdW5jIFUgSnVtcA0KICAgICAqKQ0KICAgIGRhdGF0
eXBlIHJjb250DQogICAgICA9IFVuY2FsbGVkDQogICAgICB8IEZ1bmNMYWJlbCBvZiBGdW5jLnQN
CiAgICAgIHwgSnVtcExhYmVsIG9mIEp1bXAudA0KICAgICAgfCBVbmtub3duDQoNCiAgICBmdW4g
cmNvbnRfbGF5b3V0IHINCiAgICAgID0gbGV0IA0KCSAgb3BlbiBMYXlvdXQNCglpbg0KCSAgY2Fz
ZSByDQoJICAgIG9mIFVuY2FsbGVkID0+IHN0ciAiVW5jYWxsZWQiDQoJICAgICB8IEZ1bmNMYWJl
bCBmID0+IHNlcSBbRnVuYy5sYXlvdXQgZl0NCgkgICAgIHwgSnVtcExhYmVsIGogPT4gc2VxIFtK
dW1wLmxheW91dCBqXQ0KCSAgICAgfCBVbmtub3duID0+IHN0ciAiVW5rbm93biINCgllbmQNCg0K
ICAgIHZhbCByY29udF9lcXVhbHMNCiAgICAgID0gZm4gKFVuY2FsbGVkLCBVbmNhbGxlZCkgPT4g
dHJ1ZQ0KICAgICAgICAgfCAoRnVuY0xhYmVsIGYxLCBGdW5jTGFiZWwgZjIpID0+IEZ1bmMuZXF1
YWxzKGYxLCBmMikNCiAgICAgICAgIHwgKEp1bXBMYWJlbCBqMSwgSnVtcExhYmVsIGoyKSA9PiBK
dW1wLmVxdWFscyhqMSwgajIpDQogICAgICAgICB8IChVbmtub3duLCBVbmtub3duKSA9PiB0cnVl
DQogICAgICAgICB8IF8gPT4gZmFsc2UNCg0KICAgICgqIFR1cm4gUkNvbnQgaW50byBhIGxhdHRp
Y2Ugd2l0aCB0aGUgZm9sbG93aW5nIG9yZGVyDQogICAgICogICAgICAgICBVbmNhbGxlZCA8PSB4
DQogICAgICogICAgICAgICB4IDw9IHgNCiAgICAgKiAgICAgICAgIHggPD0gVW5rbm93bg0KICAg
ICAqIHdoZXJlIHggaXMgYW4gYXJiaXRyYXJ5IGVsZW1lbnQgb2YgRnVuYyBVIEp1bXAuDQogICAg
ICopDQogICAgdmFsIHJjb250X2x1Yg0KICAgICAgPSBmbiAoVW5jYWxsZWQsIHIpID0+IHINCiAg
ICAgICAgIHwgKHIsIFVuY2FsbGVkKSA9PiByDQogICAgICAgICB8IChGdW5jTGFiZWwgZjEsIEZ1
bmNMYWJlbCBmMikNCiAgICAgICAgID0+IGlmIEZ1bmMuZXF1YWxzKGYxLCBmMikNCgkgICAgICB0
aGVuIEZ1bmNMYWJlbCBmMQ0KCSAgICAgIGVsc2UgVW5rbm93bg0KICAgICAgICAgfCAoSnVtcExh
YmVsIGoxLCBKdW1wTGFiZWwgajIpDQogICAgICAgICA9PiBpZiBKdW1wLmVxdWFscyhqMSwgajIp
DQoJICAgICAgdGhlbiBKdW1wTGFiZWwgajENCgkgICAgICBlbHNlIFVua25vd24NCgkgfCBfID0+
IFVua25vd24NCg0KICAgIGRhdGF0eXBlIHQgPSBUIG9mIHtyY29udDogcmNvbnQgcmVmLA0KCQkg
ICAgICAgbm9udGFpbENhbGxlZTogKHQgKiBKdW1wLnQpIGxpc3QgcmVmLA0KCQkgICAgICAgdGFp
bENhbGxlZTogdCBsaXN0IHJlZiwNCgkJICAgICAgIG5vZGU6IERpcmVjdGVkR3JhcGguTm9kZS50
IG9wdGlvbiByZWZ9DQoNCiAgICBmdW4gcmNvbnQgKFQge3Jjb250LCAuLi59KSA9ICFyY29udA0K
DQogICAgdmFsIGxheW91dCA9IHJjb250X2xheW91dCBvIHJjb250DQogICAgdmFsIHRvU3RyaW5n
ID0gTGF5b3V0LnRvU3RyaW5nIG8gbGF5b3V0DQoNCiAgICBmdW4gaXNVbmNhbGxlZCAoVCB7cmNv
bnQsIC4uLn0pDQogICAgICA9IGNhc2UgIXJjb250DQoJICBvZiBVbmNhbGxlZCA9PiB0cnVlDQoJ
ICAgfCBfID0+IGZhbHNlDQoNCiAgICBmdW4gbmV3ICgpID0gVCB7cmNvbnQgPSByZWYgVW5jYWxs
ZWQsDQoJCSAgICBub250YWlsQ2FsbGVlID0gcmVmIFtdLA0KCQkgICAgdGFpbENhbGxlZSA9IHJl
ZiBbXSwNCgkJICAgIG5vZGUgPSByZWYgTk9ORX0NCg0KICAgIGxvY2FsDQogICAgICBmdW4gdXAg
KFQge3Jjb250LCBub250YWlsQ2FsbGVlLCB0YWlsQ2FsbGVlLCAuLi59LCBqb2luX3Jjb250KQ0K
CT0gbGV0DQoJICAgIGZ1biBkb2l0IG5ld19yY29udA0KCSAgICAgID0gKHJjb250IDo9IG5ld19y
Y29udDsNCgkJIExpc3QuZm9yZWFjaCghbm9udGFpbENhbGxlZSwNCgkJCSAgICAgIGZuICh0LCBq
KSA9PiB1cCAodCwgSnVtcExhYmVsIGopKTsNCgkJIExpc3QuZm9yZWFjaCghdGFpbENhbGxlZSwN
CgkJCSAgICAgIGZuIHQgPT4gdXAgKHQsIG5ld19yY29udCkpKQ0KDQoJICAgIHZhbCBuZXdfcmNv
bnQgPSByY29udF9sdWIoIXJjb250LCBqb2luX3Jjb250KQ0KCSAgaW4NCgkgICAgaWYgcmNvbnRf
ZXF1YWxzKCFyY29udCwgbmV3X3Jjb250KQ0KCSAgICAgIHRoZW4gKCkNCgkgICAgICBlbHNlIGRv
aXQgbmV3X3Jjb250DQoJICBlbmQNCg0KICAgICAgZnVuIG1ha2VVbmtub3duIHIgPSB1cChyLCBV
bmtub3duKQ0KDQogICAgICBmdW4gYWRkVGFpbChmciBhcyBUIHtyY29udCwgdGFpbENhbGxlZSwg
Li4ufSwgZ3IpDQoJPSAoTGlzdC5wdXNoKHRhaWxDYWxsZWUsIGdyKTsNCgkgICB1cCAoZ3IsICFy
Y29udCkpDQoNCiAgICAgIGZ1biBhZGROb250YWlsKGZyIGFzIFQge3Jjb250LCBub250YWlsQ2Fs
bGVlLCAuLi59LCBnciwgaikNCgk9IChMaXN0LnB1c2gobm9udGFpbENhbGxlZSwgKGdyLCBqKSk7
DQoJICAgaWYgcmNvbnRfZXF1YWxzKCFyY29udCwgVW5jYWxsZWQpDQoJICAgICB0aGVuICgpDQoJ
ICAgICBlbHNlIHVwIChnciwgSnVtcExhYmVsIGopKQ0KDQogICAgaW4NCiAgICAgICgqIERlZmlu
ZSB0aGUgZnVuY3Rpb24gQzogQW5hbHlzaXMgLT4gQW5hbHlzaXMgYnkNCiAgICAgICAqICAgICBD
KEEpKGcpID0NCiAgICAgICAqICAgICAgICAgIGlmIGcgPSBmbQ0KICAgICAgICogICAgICAgICAg
ICB0aGVuIFVua25vd24NCiAgICAgICAqICAgICAgICAgIGVsc2UgbHViICh7aiB8IChmLCBnLCBq
KSBpbiBOIGFuZCBBKGYpIDw+IFVuY2FsbGVkfQ0KICAgICAgICogICAgICAgICAgICAgICAgICAg
IFUge0EoZikgfCAoZiwgZykgaW4gVH0pDQogICAgICAgKg0KICAgICAgICogTGV0IEEnID0gbGZw
KEMpDQogICAgICAgKg0KICAgICAgICogUHJlY29uZGl0aW9uOiBmb3JhbGwgZiBpbiBGdW5jLiBn
ZXQoZikgPSBuZXcgKCkNCiAgICAgICAqIFBvc3Rjb25kaXRpb246IHJjb250IG8gZ2V0ID0gQScN
CiAgICAgICAqKQ0KICAgICAgZnVuIGFuYWx5emVfY29udCB7cHJvZ3JhbSBhcyBQcm9ncmFtLlQg
e2Z1bmN0aW9ucywgbWFpbiwgLi4ufSwNCgkJCWdldDogRnVuYy50IC0+IHR9IDogdW5pdA0KCT0g
KG1ha2VVbmtub3duIChnZXQgbWFpbik7DQoJICAgVmVjdG9yLmZvcmVhY2gNCgkgICAoZnVuY3Rp
b25zLA0KCSAgICBmbiB7bmFtZSwgYm9keSwgLi4ufQ0KCSAgICAgPT4gbGV0DQoJCSAgdmFsIGZy
ID0gZ2V0IG5hbWUNCgkJaW4NCgkJICBFeHAuZm9yZWFjaENhbGwNCgkJICAoYm9keSwNCgkJICAg
Zm4ge2Z1bmMsIGNvbnQsIC4uLn0NCgkJICAgID0+IGxldA0KCQkJIHZhbCBnciA9IGdldCBmdW5j
DQoJCSAgICAgICBpbiANCgkJCSBjYXNlIGNvbnQNCgkJCSAgIG9mIE5PTkUgPT4gYWRkVGFpbChm
ciwgZ3IpDQoJCQkgICAgfCBTT01FIGogPT4gYWRkTm9udGFpbChmciwgZ3IsIGopDQoJCSAgICAg
ICBlbmQpDQoJCWVuZCkpDQogICAgZW5kDQoNCiAgICBsb2NhbA0KICAgICAgc3RydWN0dXJlIEdy
YXBoID0gRGlyZWN0ZWRHcmFwaA0KICAgICAgc3RydWN0dXJlIE5vZGUgPSBHcmFwaC5Ob2RlDQog
ICAgaW4NCiAgICAgICgqIE5vdyBkZWZpbmUgYSBkaXJlY3RlZCBncmFwaCBHID0gKE5vZGUsIEVk
Z2UpIHdoZXJlIA0KICAgICAgICogICAgICBOb2RlID0gRnVuIFUge1Jvb3R9DQogICAgICAgKiAg
ICAgIEVkZ2UgPSB7KFJvb3QsIGZtKX0NCiAgICAgICAqICAgICAgICAgICAgIFUgeyhSb290LCBm
KSB8IEEnKGYpIDw+IFVua25vd259DQogICAgICAgKiAgICAgICAgICAgICBVIHsoZiwgZykgfCAo
ZiwgZykgaW4gVCBhbmQgQScoZikgPD4gVW5rbm93bg0KICAgICAgICogICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgYW5kIEEnKGcpID0gVW5rbm93bn0NCiAgICAgICAqICAgICAg
ICAgICAgIFUgeyhSb290LCBnKSB8IChmLCBnLCBqKSBpbiBOIGFuZCBBJyhmKSA8PiBVbmtub3du
DQogICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQg
QScoZykgPSBVbmtub3dufQ0KICAgICAgICogDQogICAgICAgKiBMZXQgRCBiZSB0aGUgZG9taW5h
dG9yIHRyZWUgb2YgRyByb290ZWQgYXQgUm9vdC4NCiAgICAgICAqIEZvciBmIGluIEZ1biwgbGV0
IGlkb20oZikgYmUgdGhlIHBhcmVudCBvZiBmIGluIEQuDQogICAgICAgKg0KICAgICAgICogRGVm
aW5lIGFuIGFuYWx5c2lzLCBBLCBiYXNlZCBvbiBBJyBhbmQgRCBhcyBmb2xsb3dzOg0KICAgICAg
ICogICAgICBBKGYpID0gDQogICAgICAgKiAgICAgICAgICAgaWYgaWRvbShmKSA9IFJvb3QNCiAg
ICAgICAqICAgICAgICAgICAgIHRoZW4gQScoZikNCiAgICAgICAqICAgICAgICAgICAgIGVsc2Ug
dGhlIGFuY2VzdG9yIGcgb2YgZiBpbiBEIHN1Y2ggdGhhdCBpZG9tKGcpID0gUm9vdA0KICAgICAg
ICoNCiAgICAgICAqIFByZWNvbmRpdGlvbjogcmNvbnQgbyBnZXQgPSBBJw0KICAgICAgICogUG9z
dGNvbmRpdGlvbjogcmNvbnQgbyBnZXQgPSBBDQogICAgICAgKikNCiAgICAgIGZ1biBhbmFseXpl
X2lkb20ge3Byb2dyYW0gYXMgUHJvZ3JhbS5UIHtmdW5jdGlvbnMsIG1haW4sIC4uLn0sDQoJCQln
ZXQ6IEZ1bmMudCAtPiB0fSA6IHVuaXQNCgk9IGxldA0KCSAgICB2YWwgRyA9IERpcmVjdGVkR3Jh
cGgubmV3ICgpDQoJICAgIHZhbCBSb290ID0gRGlyZWN0ZWRHcmFwaC5uZXdOb2RlIEcNCg0KCSAg
ICB2YWwge2dldCA9IGdldE5vZGVJbmZvIDogTm9kZS50IC0+IEZ1bmMudCwgDQoJCSBzZXQgPSBz
ZXROb2RlSW5mb30NCgkgICAgICA9IFByb3BlcnR5LmdldFNldE9uY2UNCgkgICAgICAgIChOb2Rl
LnBsaXN0LA0KCQkgUHJvcGVydHkuaW5pdFJhaXNlICgibm9kZUluZm8iLCBOb2RlLmxheW91dCkp
DQoJICAgIHZhbCBfIA0KCSAgICAgID0gVmVjdG9yLmZvcmVhY2gNCgkgICAgICAgIChmdW5jdGlv
bnMsDQoJCSBmbiB7bmFtZSwgLi4ufQ0KCQkgID0+IGxldA0KCQkgICAgICAgdmFsIG4gPSBHcmFw
aC5uZXdOb2RlIEcNCgkJICAgICAgIHZhbCBUIHtub2RlLCAuLi59ID0gZ2V0IG5hbWUNCgkJICAg
ICBpbg0KCQkgICAgICAgc2V0Tm9kZUluZm8gKG4sIG5hbWUpOw0KCQkgICAgICAgbm9kZSA6PSBT
T01FIG4NCgkJICAgICBlbmQpDQoNCgkgICAgZnVuIGdldFJDb250Tm9kZSBmDQoJICAgICAgPSBs
ZXQNCgkJICB2YWwgVCB7cmNvbnQsIG5vZGUsIC4uLn0gPSBnZXQgZg0KCQlpbg0KCQkgIChyY29u
dCwgdmFsT2YoIW5vZGUpKQ0KCQllbmQNCg0KCSAgICB2YWwgKF8sIGZtX25vZGUpID0gZ2V0UkNv
bnROb2RlIG1haW4NCgkgICAgKCogeyhSb290LCBmbSl9ICopDQoJICAgIHZhbCBfID0gR3JhcGgu
YWRkRWRnZShHLCB7ZnJvbSA9IFJvb3QsIA0KCQkJCSAgICAgIHRvID0gZm1fbm9kZX0pDQoNCgkg
ICAgdmFsIF8gDQoJICAgICAgPSBWZWN0b3IuZm9yZWFjaA0KCSAgICAgICAgKGZ1bmN0aW9ucywg
DQoJCSBmbiB7bmFtZSwgYm9keSwgLi4ufQ0KCQkgID0+IGxldA0KCQkgICAgICAgdmFsIChmX3Jj
b250LCBmX25vZGUpID0gZ2V0UkNvbnROb2RlIG5hbWUNCg0KCQkgICAgICAgKCogeyhSb290LCBm
KSB8IEEnKGYpIDw+IFVua25vd259ICopDQoJCSAgICAgICB2YWwgXyA9IGlmIHJjb250X2VxdWFs
cyghZl9yY29udCwgVW5rbm93bikNCgkJCQkgdGhlbiAoKQ0KCQkJCSBlbHNlIChHcmFwaC5hZGRF
ZGdlKEcsIHtmcm9tID0gUm9vdCwgDQoJCQkJCQkJIHRvID0gZl9ub2RlfSk7DQoJCQkJICAgICAg
ICgpKQ0KCQkgICAgIGluDQoJCSAgICAgICBpZiByY29udF9lcXVhbHMoIWZfcmNvbnQsIFVuY2Fs
bGVkKQ0KCQkJIHRoZW4gKCkNCgkJCSBlbHNlIEV4cC5mb3JlYWNoQ2FsbA0KCQkJICAgICAgKGJv
ZHksDQoJCQkgICAgICAgZm4ge2Z1bmMsIGNvbnQsIC4uLn0NCgkJCSAgICAgICAgPT4gbGV0DQoJ
CQkJICAgICB2YWwgKGdfcmNvbnQsIGdfbm9kZSkgPSBnZXRSQ29udE5vZGUgZnVuYw0KCQkJCSAg
IGluDQoJCQkJICAgICBjYXNlIGNvbnQNCgkJCQkgICAgICAgb2YgTk9ORQ0KCQkJCQk9PiAoKiB7
KGYsIGcpIHwgKGYsIGcpIGluIFQgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYW5kIEEnKGYpIDw+IFVuY2FsbGVkIA0KICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBBJyhnKSA9IFVua25vd259
ICopIA0KCQkJCQkgaWYgcmNvbnRfZXF1YWxzKCFnX3Jjb250LCBVbmtub3duKQ0KCQkJCQkgICB0
aGVuIChHcmFwaC5hZGRFZGdlDQoJCQkJCQkgKEcsIHtmcm9tID0gZl9ub2RlLA0KCQkJCQkJICAg
ICAgdG8gPSBnX25vZGV9KTsNCgkJCQkJCSAoKSkNCgkJCQkJICAgZWxzZSAoKQ0KCQkJCSAgICAg
ICAgfCBTT01FIGoNCgkJCQkJPT4gKCogeyhSb290LCBnKSB8IChmLCBnLCBqKSBpbiBOIA0KICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBB
JyhmKSA8PiBVbmNhbGxlZA0KCQkJCQkJICAgICAgIGFuZCBBJyhnKSA9IFVua25vd259ICopDQoJ
CQkJCSAgIGlmIHJjb250X2VxdWFscyghZ19yY29udCwgVW5rbm93bikNCgkJCQkJICAgICB0aGVu
IChHcmFwaC5hZGRFZGdlDQoJCQkJCQkgICAoRywge2Zyb20gPSBSb290LA0KCQkJCQkJCXRvID0g
Z19ub2RlfSk7DQoJCQkJCQkgICAoKSkNCgkJCQkJICAgICBlbHNlICgpDQoJCQkJICAgZW5kKQ0K
CQkgICAgIGVuZCkNCg0KCSAgICB2YWwge2lkb219ID0gR3JhcGguZG9taW5hdG9ycyB7Z3JhcGgg
PSBHLCByb290ID0gUm9vdH0NCgkgICAgZnVuIGFuY2VzdG9yIG5vZGUNCgkgICAgICA9IGxldA0K
CQkgIHZhbCBwYXJlbnQgPSBpZG9tIG5vZGUNCgkJaW4NCgkJICBpZiBOb2RlLmVxdWFscyhwYXJl
bnQsIFJvb3QpDQoJCSAgICB0aGVuIG5vZGUNCgkJICAgIGVsc2UgYW5jZXN0b3IgcGFyZW50DQoJ
CWVuZA0KCSAgaW4NCgkgICAgVmVjdG9yLmZvcmVhY2gNCgkgICAgKGZ1bmN0aW9ucywNCgkgICAg
IGZuIHtuYW1lLCAuLi59DQoJICAgICAgPT4gbGV0DQoJCSAgIHZhbCAoZl9yY29udCwgZl9ub2Rl
KSA9IGdldFJDb250Tm9kZSBuYW1lDQoJCSBpbg0KCQkgICBpZiBOb2RlLmVxdWFscyhpZG9tIGZf
bm9kZSwgUm9vdCkNCgkJICAgICB0aGVuICgpDQoJCSAgICAgZWxzZSBsZXQNCgkJCSAgICB2YWwg
Z19ub2RlID0gYW5jZXN0b3IgZl9ub2RlDQoJCQkgICAgdmFsIGcgPSBnZXROb2RlSW5mbyBnX25v
ZGUNCgkJCSAgaW4NCgkJCSAgICBmX3Jjb250IDo9IEZ1bmNMYWJlbCBnDQoJCQkgIGVuZA0KCQkg
ZW5kKQ0KCSAgZW5kDQogICAgZW5kDQoNCiAgICAoKiBQcmVjb25kaXRpb246IGZvcmFsbCBmIGlu
IEZ1bmMuIGdldChmKSA9IG5ldyAoKQ0KICAgICAqIFBvc3Rjb25kaXRpb246IHJjb250IG8gZ2V0
ID0gQQ0KICAgICAqKQ0KICAgIGZ1biBhbmFseXplIHtwcm9ncmFtIDogUHJvZ3JhbS50LA0KCQkg
Z2V0IDogRnVuYy50IC0+IHR9DQogICAgICA9IChhbmFseXplX2NvbnQge3Byb2dyYW0gPSBwcm9n
cmFtLCBnZXQgPSBnZXR9Ow0KCSBhbmFseXplX2lkb20ge3Byb2dyYW0gPSBwcm9ncmFtLCBnZXQg
PSBnZXR9KQ0KICBlbmQNCg0Kc3RydWN0dXJlIENvbnRTZXQgPQ0KICAgc3RydWN0DQogICAgICBk
YXRhdHlwZSBzZXQgPQ0KCSBFbXB0eQ0KICAgICAgIHwgTWFpbkNvbnQNCiAgICAgICB8IE9uZSBv
ZiBKdW1wLnQNCiAgICAgICB8IFJldHVybiBvZiBGdW5jLnQNCiAgICAgICB8IEFsbA0KDQogICAg
ICBmdW4gbGF5b3V0U2V0IHMgPQ0KCSBsZXQgb3BlbiBMYXlvdXQNCgkgaW4gY2FzZSBzIG9mDQoJ
ICAgIEVtcHR5ID0+IHN0ciAie30iDQoJICB8IE1haW5Db250ID0+IHN0ciAiTWFpbkNvbnQiDQoJ
ICB8IE9uZSBqID0+IHNlcSBbc3RyICJ7ICIsIEp1bXAubGF5b3V0IGosIHN0ciAiIH0iXQ0KCSAg
fCBSZXR1cm4gZiA9PiBzZXEgW3N0ciAieyAiLCBGdW5jLmxheW91dCBmLCBzdHIgIiB9Il0NCgkg
IHwgQWxsID0+IHN0ciAiQWxsIg0KCSBlbmQNCg0KICAgICAgZGF0YXR5cGUgdCA9IFQgb2Yge3Nl
dDogc2V0IHJlZiwNCgkJCSBsZXNzVGhhbjogdCBsaXN0IHJlZn0NCg0KICAgICAgZnVuIHNldCAo
VCB7c2V0LCAuLi59KSA9ICFzZXQNCg0KICAgICAgdmFsIGxheW91dCA9IGxheW91dFNldCBvIHNl
dA0KICAgICAgdmFsIHRvU3RyaW5nID0gTGF5b3V0LnRvU3RyaW5nIG8gbGF5b3V0DQoNCiAgICAg
IGZ1biBpc0VtcHR5IGMgPSAoY2FzZSBzZXQgYyBvZg0KCQkJICBFbXB0eSA9PiB0cnVlDQoJCQl8
IF8gPT4gZmFsc2UpDQoJIA0KICAgICAgZnVuIG5ldyAoKSA9IFQge3NldCA9IHJlZiBFbXB0eSwN
CgkJICAgICAgbGVzc1RoYW4gPSByZWYgW119DQoNCiAgICAgIGZ1biB1cCAoVCB7c2V0LCBsZXNz
VGhhbn0sIHMpID0NCgkgbGV0DQoJICAgIGZ1biBkb2l0IHMgPSAoc2V0IDo9IHM7IExpc3QuZm9y
ZWFjaCAoIWxlc3NUaGFuLCBmbiBjID0+IHVwIChjLCBzKSkpDQoJIGluIGNhc2UgKCFzZXQsIHMp
IG9mDQoJICAgIChfLCBFbXB0eSkgPT4gKCkNCgkgIHwgKEFsbCwgXykgPT4gKCkNCgkgIHwgKEVt
cHR5LCBrKSA9PiBkb2l0IGsNCgkgIHwgKE1haW5Db250LCBNYWluQ29udCkgPT4gKCkNCgkgIHwg
KE9uZSBqLCBPbmUgaicpID0+IGlmIEp1bXAuZXF1YWxzIChqLCBqJykgdGhlbiAoKSBlbHNlIGRv
aXQgQWxsDQoJICB8IChSZXR1cm4gZiwgUmV0dXJuIGYnKSA9PiBpZiBGdW5jLmVxdWFscyAoZiwg
ZicpIHRoZW4gKCkgZWxzZSBkb2l0IEFsbA0KCSAgfCBfID0+IGRvaXQgQWxsDQoJIGVuZA0KDQog
ICAgICB2YWwgdXAgPSBUcmFjZS50cmFjZTIgKCJ1cCIsIGxheW91dCwgbGF5b3V0U2V0LCBVbml0
LmxheW91dCkgdXANCg0KICAgICAgdmFsIG9wIDw9ID0NCgkgZm4gKFQge3NldCwgbGVzc1RoYW59
LCBjKSA9Pg0KCSAgICAgIChMaXN0LnB1c2ggKGxlc3NUaGFuLCBjKQ0KCSAgICAgICA7IHVwIChj
LCAhc2V0KSkNCgkgICAgICANCiAgICAgIGZ1biBhZGRSZXR1cm4gKGMsIGYpID0gdXAgKGMsIFJl
dHVybiBmKQ0KICAgICAgZnVuIGFkZEp1bXAgKGMsIGopID0gdXAgKGMsIE9uZSBqKQ0KICAgICAg
ZnVuIGFkZE1haW4gYyA9IHVwIChjLCBNYWluQ29udCkNCiAgICAgIGZ1biBtYWtlVG9wIGMgPSB1
cCAoYywgQWxsKQ0KICAgZW5kDQoJIA0Kc3RydWN0dXJlIENhbGxJbmZvID0NCiAgIHN0cnVjdA0K
ICAgICAgZGF0YXR5cGUgdCA9DQoJIE5vT3V0ZXJDYWxscw0KICAgICAgIHwgT25lT3V0ZXJDYWxs
DQogICAgICAgfCBOb3RDb250DQoNCiAgICAgIHZhbCB0b1N0cmluZyA9DQoJIGZuIE5vT3V0ZXJD
YWxscyA9PiAiTm9PdXRlckNhbGxzIg0KCSAgfCBPbmVPdXRlckNhbGwgPT4gIk9uZU91dGVyQ2Fs
bCINCgkgIHwgTm90Q29udCA9PiAiTm90Q29udCINCg0KICAgICAgdmFsIGxheW91dCA9IExheW91
dC5zdHIgbyB0b1N0cmluZw0KICAgZW5kDQogICANCnN0cnVjdHVyZSBHcmFwaCA9IERpcmVjdGVk
R3JhcGgNCnN0cnVjdHVyZSBOb2RlID0gR3JhcGguTm9kZQ0KICANCmZ1biBjb250aWZ5IChwcm9n
cmFtIGFzIFByb2dyYW0uVCB7ZGF0YXR5cGVzLCBnbG9iYWxzLCBmdW5jdGlvbnMsIG1haW59KSA9
DQogICBsZXQNCiAgICAgIHZhbCBzdHJhdGVneSA9ICFDb250cm9sLmNvbnRpZnlTdHJhdGVneQ0K
ICAgaW4gY2FzZSBzdHJhdGVneSBvZg0KICAgICAgQ29udHJvbC5Ob25lID0+IHByb2dyYW0NCiAg
ICB8IF8gPT4gDQoJIGxldA0KCSAgICBkYXRhdHlwZSAnYSByZXBsYWNlID0NCgkgICAgICAgTm9u
ZQ0KCSAgICAgfCBPbmVDYWxsIG9mICdhDQoJICAgICB8IE9uZUNvbnQgb2YgJ2ENCgkgICAgdmFs
IHtnZXQgPSBmdW5jSW5mbzoNCgkJIEZ1bmMudCAtPiB7DQoJCQkgICAgY2FsbGVyczogRnVuYy50
IGxpc3QgcmVmLA0KCQkJICAgIGNhbGxJbmZvOiBDYWxsSW5mby50IHJlZiwNCgkJCSAgICBjYW5Q
cmVmaXg6IGJvb2wgcmVmLA0KCQkJICAgIHJjb250OiBSQ29udC50LA0KCQkJICAgIGNvbnRTZXQ6
IENvbnRTZXQudCwNCgkJCSAgICBpc0xvY2FsOiBib29sIHJlZiwNCgkJCSAgICBuZXN0ZWQ6IEZ1
bmMudCBsaXN0IHJlZiwNCgkJCSAgICBub2RlOiBHcmFwaC5Ob2RlLnQgb3B0aW9uIHJlZiwNCgkJ
CSAgICBwb3NzaWJsZVByZWZpeGVzOiBGdW5jLnQgbGlzdCByZWYsDQoJCQkgICAgcHJlZml4ZXM6
IEZ1bmMudCBsaXN0IG9wdGlvbiByZWYsDQoJCQkgICAgcmVwbGFjZToge2FyZ3M6IChWYXIudCAq
IFR5cGUudCkgdmVjdG9yLA0KCQkJCSAgICAgIGJvZHk6IEV4cC50LA0KCQkJCSAgICAgIGp1bXA6
IEp1bXAudH0gb3B0aW9uIHJlZg0KCQkJICAgIH19ID0NCgkgICAgICAgUHJvcGVydHkuZ2V0IChG
dW5jLnBsaXN0LA0KCQkJICAgICBQcm9wZXJ0eS5pbml0RnVuDQoJCQkgICAgIChmbiBfID0+IHtj
YWxsZXJzID0gcmVmIFtdLA0KCQkJCSAgICAgICBjYWxsSW5mbyA9IHJlZiBDYWxsSW5mby5Ob091
dGVyQ2FsbHMsDQoJCQkJICAgICAgIGNhblByZWZpeCA9IHJlZiBmYWxzZSwNCgkJCQkgICAgICAg
cmNvbnQgPSBSQ29udC5uZXcgKCksDQoJCQkJICAgICAgIGNvbnRTZXQgPSBDb250U2V0Lm5ldyAo
KSwNCgkJCQkgICAgICAgaXNMb2NhbCA9IHJlZiBmYWxzZSwNCgkJCQkgICAgICAgbmVzdGVkID0g
cmVmIFtdLA0KCQkJCSAgICAgICBub2RlID0gcmVmIE5PTkUsDQoJCQkJICAgICAgIHBvc3NpYmxl
UHJlZml4ZXMgPSByZWYgW10sDQoJCQkJICAgICAgIHByZWZpeGVzID0gcmVmIE5PTkUsDQoJCQkJ
ICAgICAgIHJlcGxhY2UgPSByZWYgTk9ORX0pKQ0KDQooKiBmbHVldCArICopDQoJICAgIHZhbCBn
ZXRfcmNvbnQgPSAjcmNvbnQgbyBmdW5jSW5mbw0KCSAgICB2YWwgXyA9IFJDb250LmFuYWx5emUg
e3Byb2dyYW0gPSBwcm9ncmFtLA0KCQkJCSAgIGdldCA9IGdldF9yY29udH0NCg0KCSAgICAoKiBD
b21wdXRlIHRoZSBjb250U2V0IGFuZCBjYWxsSW5mbyBmb3IgZWFjaCBmdW5jdGlvbi4NCgkgICAg
ICogVGhlIGNvbnRTZXQgaXMgYW4gb3Zlci1hcHByb3hpbWF0aW9uIHRvIHRoZSBzZXQgb2YgY29u
dGludWF0aW9ucw0KCSAgICAgKiB3aXRoIHdoaWNoIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQuDQoJ
ICAgICAqIFRoZSBjYWxsSW5mbyB0ZWxscyBhdCBob3cgbWFueSBwbGFjZXMgb3V0c2lkZSBvZiBp
dHNlbGYgZWFjaA0KCSAgICAgKiBmdW5jdGlvbiBpcyBjYWxsZWQuDQoJICAgICAqKQ0KCSAgICB2
YWwgXyA9IENvbnRTZXQuYWRkTWFpbiAoI2NvbnRTZXQgKGZ1bmNJbmZvIG1haW4pKQ0KCSAgICB2
YWwgXyA9DQoJICAgICAgIFZlY3Rvci5mb3JlYWNoDQoJICAgICAgIChmdW5jdGlvbnMsIGZuIHtu
YW1lLCBib2R5LCAuLi59ID0+DQoJCWxldCB2YWwge2NhbGxJbmZvLCBjb250U2V0ID0gYywgLi4u
fSA9IGZ1bmNJbmZvIG5hbWUNCgkJaW4gRXhwLmZvcmVhY2hDYWxsDQoJCSAgIChib2R5LCBmbiB7
ZnVuYywgY29udCwgLi4ufSA9Pg0KCQkgICAgaWYgRnVuYy5lcXVhbHMobmFtZSwgZnVuYykNCgkJ
ICAgICAgIHRoZW4NCgkJCSAgY2FzZSBjb250IG9mDQoJCQkgICAgIE5PTkUgPT4gKCkNCgkJCSAg
IHwgU09NRSBfID0+IChjYWxsSW5mbyA6PSBDYWxsSW5mby5Ob3RDb250DQoJCQkJCTsgQ29udFNl
dC5tYWtlVG9wIGMpDQoJCSAgICBlbHNlDQoJCSAgICAgICBsZXQNCgkJCSAgdmFsIHtjYWxsZXJz
LCBjYWxsSW5mbyA9IGNhbGxJbmZvJywgY29udFNldCA9IGMnLCAuLi59ID0NCgkJCSAgICAgZnVu
Y0luZm8gZnVuYw0KCQkJICB2YWwgXyA9DQoJCQkgICAgIGxldA0KCQkJCWRhdGF0eXBlIHogPSBk
YXRhdHlwZSBDYWxsSW5mby50DQoJCQkgICAgIGluIGNhc2UgIWNhbGxJbmZvJyBvZg0KCQkJCU5v
T3V0ZXJDYWxscyA9PiBjYWxsSW5mbycgOj0gT25lT3V0ZXJDYWxsDQoJCQkgICAgICB8IE9uZU91
dGVyQ2FsbCA9PiBjYWxsSW5mbycgOj0gTm90Q29udA0KCQkJICAgICAgfCBOb3RDb250ID0+ICgp
DQoJCQkgICAgIGVuZA0KCQkJICB2YWwgXyA9IExpc3QucHVzaCAoY2FsbGVycywgbmFtZSkNCgkJ
ICAgICAgIGluIGNhc2UgY29udCBvZg0KCQkJICBOT05FID0+IENvbnRTZXQuPD0gKGMsIGMnKQ0K
CQkJKCogQ29udFNldC5hZGRSZXR1cm4gKGMsIG5hbWUpICopDQoJCQl8IFNPTUUgaiA9PiBDb250
U2V0LmFkZEp1bXAgKGMnLCBqKQ0KCQkgICAgICAgZW5kKQ0KCQllbmQpDQoJICAgICgqIFJlY29y
ZCBmb3IgZWFjaCBqdW1wIHRoZSBmdW5jdGlvbnMgdGhhdCBtaWdodCBiZSB0dXJuZWQgaW50bw0K
CSAgICAgKiBjb250aW51YXRpb25zIGFzIGl0cyBwcmVmaXhlcy4NCgkgICAgICogUmVjb3JkIGZv
ciBlYWNoIGZ1bmN0aW9uIHRoZSBmdW5jdGlvbnMgdGhhdCBtaWdodCBwcmVmaXggaXRzDQoJICAg
ICAqIHJldHVybi4NCgkgICAgICopDQoJICAgIHZhbCB7Z2V0ID0ganVtcEluZm86IEp1bXAudCAt
Pg0KCQkge3Bvc3NpYmxlUHJlZml4ZXM6IEZ1bmMudCBsaXN0IHJlZiwNCgkJICBwcmVmaXhlczog
RnVuYy50IGxpc3Qgb3B0aW9uIHJlZn19ID0NCgkgICAgICAgUHJvcGVydHkuZ2V0IChKdW1wLnBs
aXN0LA0KCQkJICAgICBQcm9wZXJ0eS5pbml0RnVuDQoJCQkgICAgIChmbiBfID0+IHtwb3NzaWJs
ZVByZWZpeGVzID0gcmVmIFtdLA0KCQkJCSAgICAgICBwcmVmaXhlcyA9IHJlZiBOT05FfSkpDQoJ
ICAgIHZhbCB0b2RvID0gcmVmIFtdDQoJICAgIHZhbCBfID0NCgkgICAgICAgVmVjdG9yLmZvcmVh
Y2gNCgkgICAgICAgKGZ1bmN0aW9ucywgZm4ge25hbWUsIC4uLn0gPT4NCgkJbGV0DQoJCSAgIHZh
bCB7Y29udFNldCwgLi4ufSA9IGZ1bmNJbmZvIG5hbWUNCgkJICAgZnVuIGRvaXQgKHBvc3NpYmxl
UHJlZml4ZXMsIHByZWZpeGVzKSA9DQoJCSAgICAgIGxldA0KCQkJIHZhbCBfID0NCgkJCSAgICBj
YXNlICFwb3NzaWJsZVByZWZpeGVzIG9mDQoJCQkgICAgICAgW10gPT4gTGlzdC5wdXNoICh0b2Rv
LA0KCQkJCQkJKHBvc3NpYmxlUHJlZml4ZXMsIHByZWZpeGVzKSkNCgkJCSAgICAgfCBfID0+ICgp
DQoJCSAgICAgIGluIExpc3QucHVzaCAocG9zc2libGVQcmVmaXhlcywgbmFtZSkNCgkJICAgICAg
ZW5kDQoNCigqIGZsdWV0ICsgKikNCgkJICAgZnVuIGRvaXRfbmV3ICgpDQoJCSAgICAgPSAoY2Fz
ZSBSQ29udC5yY29udCAoI3Jjb250KGZ1bmNJbmZvIG5hbWUpKQ0KCQkgICAgICAgICAgb2YgUkNv
bnQuRnVuY0xhYmVsIGYNCgkJICAgICAgICAgICA9PiBsZXQgDQoJCQkJdmFsIHtwb3NzaWJsZVBy
ZWZpeGVzLCBwcmVmaXhlcywgLi4ufSANCgkJCQkgID0gZnVuY0luZm8gZg0KCQkJICAgICAgaW4g
ZG9pdCAocG9zc2libGVQcmVmaXhlcywgcHJlZml4ZXMpDQoJCQkgICAgICBlbmQNCgkJICAgICAg
ICAgICB8IFJDb250Lkp1bXBMYWJlbCBqDQoJCQkgICA9PiBsZXQgDQoJCQkJdmFsIHtwb3NzaWJs
ZVByZWZpeGVzLCBwcmVmaXhlcywgLi4ufSANCgkJCQkgID0ganVtcEluZm8gag0KCQkJICAgICAg
aW4gZG9pdCAocG9zc2libGVQcmVmaXhlcywgcHJlZml4ZXMpDQoJCQkgICAgICBlbmQNCgkJCSAg
IHwgXyA9PiAoKSkNCg0KKCogZmx1ZXQgKyAqKQ0KCQkgICBmdW4gZG9pdF9jb250ICgpDQoJCSAg
ICAgPSAoY2FzZSBDb250U2V0LnNldCAoI2NvbnRTZXQoZnVuY0luZm8gbmFtZSkpIG9mDQoJCQlD
b250U2V0Lk9uZSBqID0+IA0KCQkJICAgbGV0IHZhbCB7cG9zc2libGVQcmVmaXhlcywgcHJlZml4
ZXMsIC4uLn0gDQoJCQkgICAgICAgICA9IGp1bXBJbmZvIGoNCgkJCSAgIGluIGRvaXQgKHBvc3Np
YmxlUHJlZml4ZXMsIHByZWZpeGVzKQ0KCQkJICAgZW5kDQoJCSAgICAgIHwgQ29udFNldC5SZXR1
cm4gZiA9Pg0KCQkJICAgbGV0IHZhbCB7cG9zc2libGVQcmVmaXhlcywgcHJlZml4ZXMsIC4uLn0g
DQoJCQkgICAgID0gZnVuY0luZm8gZg0KCQkJICAgaW4gZG9pdCAocG9zc2libGVQcmVmaXhlcywg
cHJlZml4ZXMpDQoJCQkgICBlbmQNCgkJICAgICAgfCBfID0+ICgpKQ0KDQooKiBmbHVldCArICop
DQoJCWluIGNhc2Ugc3RyYXRlZ3kgb2YgDQoJCSAgIENvbnRyb2wuQ29udCA9PiBkb2l0X2NvbnQg
KCkNCgkJIHwgQ29udHJvbC5Cb3RoID0+IGRvaXRfY29udCAoKQ0KCQkgfCBDb250cm9sLk5ldyA9
PiBkb2l0X25ldyAoKQ0KCQkgfCBfID0+ICgpDQoJCWVuZCkNCg0KKCogZmx1ZXQgLSAqKQ0KKCoN
CgkJICAgdmFsIHtjb250U2V0LCAuLi59ID0gZnVuY0luZm8gbmFtZQ0KCQlpbiBjYXNlIENvbnRT
ZXQuc2V0IGNvbnRTZXQgb2YNCgkJICAgQ29udFNldC5PbmUgaiA9PiANCgkJICAgICAgbGV0IHZh
bCB7cG9zc2libGVQcmVmaXhlcywgcHJlZml4ZXMsIC4uLn0gPSBqdW1wSW5mbyBqDQoJCSAgICAg
IGluIGRvaXQgKHBvc3NpYmxlUHJlZml4ZXMsIHByZWZpeGVzKQ0KCQkgICAgICBlbmQNCgkJIHwg
Q29udFNldC5SZXR1cm4gZiA9Pg0KCQkgICAgICBsZXQgdmFsIHtwb3NzaWJsZVByZWZpeGVzLCBw
cmVmaXhlcywgLi4ufSA9IGZ1bmNJbmZvIGYNCgkJCSAgdmFsIF8gPSBwcmludCAiQ29udFNldC5S
ZXR1cm4gZiINCgkJICAgICAgaW4gZG9pdCAocG9zc2libGVQcmVmaXhlcywgcHJlZml4ZXMpDQoJ
CSAgICAgIGVuZA0KCQkgfCBfID0+ICgpDQoJCWVuZCkNCiopDQoJICAgICgqIFN0cm9uZ2x5IGNv
bm5lY3RlZCBjb21wb25lbnRzIG9mIGEgZ3JvdXAgb2YgZnVuY3Rpb25zLiAqKQ0KCSAgICBmdW4g
c2NjcyAoZnM6IEZ1bmMudCBsaXN0KSA9DQoJICAgICAgIGxldA0KCQkgIHZhbCBnID0gR3JhcGgu
bmV3ICgpDQoJCSAgdmFsIHtnZXQgPSBub2RlRnVuYywgc2V0ID0gc2V0Tm9kZUZ1bmN9ID0NCgkJ
ICAgICBQcm9wZXJ0eS5nZXRTZXRPbmNlDQoJCSAgICAgKE5vZGUucGxpc3QsIFByb3BlcnR5Lmlu
aXRSYWlzZSAoImZ1bmMiLCBOb2RlLmxheW91dCkpDQoJCSAgIHZhbCBfID0NCgkJICAgICAgTGlz
dC5mb3JlYWNoIChmcywgZm4gZiA9Pg0KCQkJCSAgICBsZXQgdmFsIHtub2RlLCAuLi59ID0gZnVu
Y0luZm8gZg0KCQkJCSAgICAgICB2YWwgbiA9IEdyYXBoLm5ld05vZGUgZw0KCQkJCSAgICAgICB2
YWwgXyA9IHNldE5vZGVGdW5jIChuLCBmKQ0KCQkJCSAgICAgICB2YWwgXyA9IG5vZGUgOj0gU09N
RSBuDQoJCQkJICAgIGluICgpDQoJCQkJICAgIGVuZCkNCgkJICAgKCogQnVpbGQgdGhlIGNhbGwg
Z3JhcGguDQoJCSAgICAqIEVkZ2VzIGdvIGZyb20gbm9kZXMgdG8gdGhlIGNhbGxlcnMuDQoJCSAg
ICAqKQ0KCQkgICB2YWwgXyA9DQoJCSAgICAgIExpc3QuZm9yZWFjaA0KCQkgICAgICAoZnMsIGZu
IGYgPT4NCgkJICAgICAgIGxldCB2YWwge25vZGUsIGNhbGxlcnMsIC4uLn0gPSBmdW5jSW5mbyBm
DQoJCQkgIHZhbCBmcm9tID0gdmFsT2YgKCFub2RlKQ0KCQkgICAgICAgaW4gTGlzdC5mb3JlYWNo
DQoJCQkgICghY2FsbGVycywgZm4gZicgPT4NCgkJCSAgIGxldCB2YWwge25vZGUsIC4uLn0gPSBm
dW5jSW5mbyBmJw0KCQkJICAgaW4gY2FzZSAhbm9kZSBvZg0KCQkJICAgICAgTk9ORSA9PiAoKQ0K
CQkJICAgIHwgU09NRSB0byA9Pg0KCQkJCSAoR3JhcGguYWRkRWRnZSAoZywge2Zyb20gPSBmcm9t
LCB0byA9IHRvfSkNCgkJCQkgIDsgKCkpDQoJCQkgICBlbmQpDQoJCSAgICAgICBlbmQpDQoJCSAg
IHZhbCBfID0gTGlzdC5mb3JlYWNoIChmcywgZm4gZiA9PiAjbm9kZSAoZnVuY0luZm8gZikgOj0g
Tk9ORSkNCgkJICAgdmFsIG5zcyA9IEdyYXBoLnN0cm9uZ2x5Q29ubmVjdGVkQ29tcG9uZW50cyBn
DQoJICAgICAgIGluIExpc3QubWFwIChuc3MsIGZuIG5zID0+IExpc3QucmV2TWFwIChucywgbm9k
ZUZ1bmMpKQ0KCSAgICAgICBlbmQNCgkgICAgDQoJICAgICgqIEZvciBlYWNoIGNvbGxlY3Rpb24g
b2YgZnVuY3Rpb25zIHRoYXQgYXJlIGdvaW5nIHRvIHByZWZpeCBhIGNvbnQsDQoJICAgICAqIGRv
IGEgc3Ryb25nbHkgY29ubmVjdGVkIGNvbXBvbmVudHMgY29tcHV0YXRpb24uICBJbiBvcmRlciBm
b3IgdGhlDQoJICAgICAqIGZ1bmN0aW9ucyB0byBiZSBjb250aWZpZWQsIHRoZXJlIGNhbiBiZSBh
dCBtb3N0IG9uZSBmdW5jdGlvbiBpbg0KCSAgICAgKiBlYWNoIGNvbXBvbmVudCB0aGF0IGlzIGNh
bGxlZCBmcm9tIG91dHNpZGUuICBUaGlzIGlzIGR1ZSB0byB0aGUNCgkgICAgICogZmFjdCB0aGF0
IG11dHVhbGx5IHJlY3Vyc2l2ZSBjb250aW51YXRpb25zIGNhbm5vdCBiZSBkaXJlY3RseQ0KCSAg
ICAgKiBkZWNsYXJlZCBpbiBDUFMgLS0gdGhlIG9ubHkgd2F5IHRvIGRvIHNvIGlzIHRvIG5lc3Qg
b25lIHdpdGhpbiB0aGUNCgkgICAgICogb3RoZXIuICBUaHVzIG9ubHkgb25lIGNhbiBiZSAiZXhw
b3J0ZWQiLg0KCSAgICAgKikNCgkgICAgZXhjZXB0aW9uIE5vcGUNCgkgICAgKCogc2NjSGVhZHMg
cmV0dXJucyB0aGUgaGVhZCBmdW5jdGlvbiBmb3IgZWFjaCBzY2MgaW4gdGhlIGxpc3Qgb2YNCgkg
ICAgICogZnVuY3Rpb25zLiAgSXQgcmFpc2VzIE5vcGUgaWYgdGhlcmUgaXMgYW4gc2NjIHdpdGgg
bW9yZSB0aGFuIG9uZQ0KCSAgICAgKiBmdW5jdGlvbiBjYWxsZWQgZnJvbSBvdXRzaWRlIHRoZSBz
Y2MuDQoJICAgICAqKQ0KCSAgICBmdW4gc2NjSGVhZHMgKGZzOiBGdW5jLnQgbGlzdCk6IEZ1bmMu
dCBsaXN0ID0NCgkgICAgICAgTGlzdC5tYXANCgkgICAgICAgKHNjY3MgZnMsIGZuIGZzID0+DQoJ
CWxldA0KCQkgICBmdW4gc2V0TG9jYWwgYiA9DQoJCSAgICAgIExpc3QuZm9yZWFjaCAoZnMsIGZu
IGYgPT4gI2lzTG9jYWwgKGZ1bmNJbmZvIGYpIDo9IGIpDQoJCSAgIHZhbCBfID0gc2V0TG9jYWwg
dHJ1ZQ0KCQkgICB2YWwgb3V0c2lkZUNhbGxlciA9IHJlZiBOT05FDQoJCSAgIHZhbCBfID0NCgkJ
ICAgICAgTGlzdC5mb3JlYWNoDQoJCSAgICAgIChmcywgZm4gZiA9Pg0KCQkgICAgICAgbGV0IHZh
bCB7Y2FsbGVycywgLi4ufSA9IGZ1bmNJbmZvIGYNCgkJICAgICAgIGluIGlmIExpc3QuZXhpc3Rz
ICghY2FsbGVycywgZm4gZiA9Pg0KCQkJCQkgIG5vdCAoISgjaXNMb2NhbCAoZnVuY0luZm8gZikp
KSkNCgkJCSAgICAgdGhlbiAoY2FzZSAhb3V0c2lkZUNhbGxlciBvZg0KCQkJCSAgICAgIFNPTUUg
XyA9PiByYWlzZSBOb3BlDQoJCQkJICAgIHwgTk9ORSA9PiBvdXRzaWRlQ2FsbGVyIDo9IFNPTUUg
ZikNCgkJCSAgZWxzZSAoKQ0KCQkgICAgICAgZW5kKQ0KCQkgICB2YWwgXyA9IHNldExvY2FsIGZh
bHNlDQoJCWluIGNhc2UgIW91dHNpZGVDYWxsZXIgb2YNCgkJICAgTk9ORSA9PiBFcnJvci5idWcg
Im5vIG91dHNpZGUgY2FsbGVyIg0KCQkgfCBTT01FIGYgPT4NCgkJICAgICAgbGV0DQoJCQkgdmFs
IHtuZXN0ZWQsIC4uLn0gPSBmdW5jSW5mbyBmDQoJCQkgdmFsIHJlc3QgPSBMaXN0LnJlbW92ZUZp
cnN0IChmcywgZm4gZicgPT4NCgkJCQkJCSAgICAgIEZ1bmMuZXF1YWxzIChmLCBmJykpDQoJCQkg
dmFsIF8gPSBuZXN0ZWQgOj0gc2NjSGVhZHMgcmVzdA0KCQkgICAgICBpbiBmDQoJCSAgICAgIGVu
ZA0KCQllbmQpDQoJICAgIHZhbCBfID0NCgkgICAgICAgTGlzdC5mb3JlYWNoDQoJICAgICAgICgh
dG9kbywgZm4gKHBvc3NpYmxlUHJlZml4ZXMsIHByZWZpeGVzKSA9Pg0KCQlsZXQNCgkJICAgdmFs
IGZzID0gIXBvc3NpYmxlUHJlZml4ZXMNCgkJICAgdmFsIF8gPSBwcmVmaXhlcyA6PSBTT01FIChz
Y2NIZWFkcyBmcykNCgkJICAgdmFsIF8gPSBMaXN0LmZvcmVhY2ggKGZzLCBmbiBmID0+DQoJCQkJ
CSAjY2FuUHJlZml4IChmdW5jSW5mbyBmKSA6PSB0cnVlKQ0KCQlpbiAoKQ0KCQllbmQgaGFuZGxl
IE5vcGUgPT4gKCkpDQoJICAgICgqIERpYWdub3N0aWNzLiAqKQ0KCSAgICB2YWwgXyA9DQoJICAg
ICAgIGlmIGZhbHNlDQoJCSAgdGhlbiANCgkJICAgICBsZXQNCigqIGZsdWV0IC0gKikNCigqIE9M
RCBESUFHTk9TVElDUyAqKQ0KKCoNCgkJCXZhbCBfID0NCgkJCSAgIFByb2dyYW0ubGF5b3V0cw0K
CQkJICAgKHByb2dyYW0sIGZuIGwgPT4gDQoJCQkgICAgKExheW91dC5vdXRwdXQgKGwsIE91dC5l
cnJvcikNCgkJCSAgICAgOyBPdXQubmV3bGluZSBPdXQuZXJyb3IpKQ0KCQkJdmFsIG9sZCA9IHJl
ZiAwDQoJCQl2YWwgbmV3ID0gcmVmIDANCgkJCXZhbCBuZXdObyA9IHJlZiAwDQoJCQl2YWwgc2Ft
ZSA9IHJlZiAwDQoJCQl2YWwgc2FtZU5vID0gcmVmIDANCgkJICAgICBpbiBWZWN0b3IuZm9yZWFj
aA0KCQkJKGZ1bmN0aW9ucywgZm4ge25hbWUsIC4uLn0gPT4NCgkJCSBsZXQNCgkJCSAgICB2YWwg
e2NhbGxJbmZvLCBjYW5QcmVmaXgsIGNvbnRTZXQsIC4uLn0gPSBmdW5jSW5mbyBuYW1lDQoJCQkg
ICAgZnVuIGRvaXQgKHIsIHMpID0NCgkJCSAgICAgICAoSW50LmluYyByDQoJCQkJOyBpZiBmYWxz
ZQ0KCQkJCSAgICAgdGhlbiBwcmludCAoY29uY2F0IFtzLCAiICIsDQoJCQkJCQkJIEZ1bmMudG9T
dHJpbmcgbmFtZSwgIlxuIl0pDQoJCQkJICBlbHNlICgpKQ0KCQkJICAgIGRhdGF0eXBlIHogPSBk
YXRhdHlwZSBDYWxsSW5mby50DQoJCQkgICAgZGF0YXR5cGUgeiA9IGRhdGF0eXBlIENvbnRTZXQu
c2V0DQoJCQkgaW4gY2FzZSAoIWNhbGxJbmZvLCBDb250U2V0LnNldCBjb250U2V0KSBvZg0KCQkJ
ICAgIChPbmVPdXRlckNhbGwsIE9uZSBfKSA9Pg0KCQkJICAgICAgIGlmICFjYW5QcmVmaXgNCgkJ
CQkgIHRoZW4gZG9pdCAoc2FtZSwgInNhbWUiKQ0KCQkJICAgICAgIGVsc2UgZG9pdCAoc2FtZU5v
LCAic2FtZU5vIikNCgkJCSAgfCAoT25lT3V0ZXJDYWxsLCBfKSA9PiBkb2l0IChvbGQsICJvbGQi
KQ0KCQkJICB8IChfLCBPbmUgXykgPT4NCgkJCSAgICAgICBpZiAhY2FuUHJlZml4DQoJCQkJICB0
aGVuIGRvaXQgKG5ldywgIm5ldyIpDQoJCQkgICAgICAgZWxzZSBkb2l0IChuZXdObywgIm5ld05v
IikNCgkJCSAgfCBfID0+ICgpDQoJCQkgZW5kKQ0KCQkJOyBwcmludCAoY29uY2F0DQoJCQkJIFsi
bnVtIGZ1bmN0aW9ucyAiLA0KCQkJCSAgSW50LnRvU3RyaW5nIChWZWN0b3IubGVuZ3RoIGZ1bmN0
aW9ucyksDQoJCQkJICAiICBzYW1lICIsIEludC50b1N0cmluZyAoIXNhbWUpLA0KCQkJCSAgIiAg
c2FtZU5vICIsIEludC50b1N0cmluZyAoIXNhbWVObyksDQoJCQkJICAiICBudW0gbmV3ICIsIElu
dC50b1N0cmluZyAoIW5ldyksDQoJCQkJICAiICBudW0gbmV3Tm8gIiwgSW50LnRvU3RyaW5nICgh
bmV3Tm8pLA0KCQkJCSAgIiAgbnVtIG9sZCAiLCBJbnQudG9TdHJpbmcgKCFvbGQpLA0KCQkJCSAg
IlxuIl0pDQoJCSAgICAgZW5kDQoqKQ0KDQooKiBmbHVldCArICopDQooKiBORVcgRElBR05PU1RJ
Q1MgKikNCgkJICAgICAgICAoKiBwcmludCBvdXQgZW50aXJlIGNwcyBJTCAqKQ0KCQkgICAgICAg
IHZhbCBjcHMgPSB0cnVlDQoJCQkoKiBwcmludCBvdXQgdGhlIGNhbGxJbmZvIGZvciBlYWNoIGZ1
bmN0aW9uICopDQoJCQkoKiBwcmludCBvdXQgdGhlIHJjb250IGZvciBlYWNoIGZ1bmN0aW9uICop
DQoJCQkoKiBwcmludCBvdXQgdGhlIGNvbnQgc2V0IGZvciBlYWNoIGZ1bmN0aW9uICopDQoJCQl2
YWwgYW5hbHlzaXMgPSB0cnVlDQoJCQkoKiBwcmludCBvdXQgYWN0aW9uIChjb250aWZpYWJsZSwg
cmVtb3ZlYWJsZSkgKikNCgkJICAgICAgICB2YWwgYWN0aW9uID0gdHJ1ZQ0KDQoJCQl2YWwgXw0K
CQkJICA9IGlmIGNwcw0KCQkJICAgICAgdGhlbiBQcm9ncmFtLmxheW91dHMNCgkJCQkgICAocHJv
Z3JhbSwgDQoJCQkJICAgIGZuIGwgPT4gKExheW91dC5vdXRwdXQgKGwsIE91dC5lcnJvcikNCgkJ
CQkJICAgICA7IE91dC5uZXdsaW5lIE91dC5lcnJvcikpDQoJCQkgICAgICBlbHNlICgpDQoNCgkJ
CXZhbCBjYWxsX2NvbnRfbmV3ID0gcmVmIDANCgkJCXZhbCBjYWxsX2NvbnQgPSByZWYgMA0KCQkJ
dmFsIGNhbGxfbmV3ID0gcmVmIDANCgkJCXZhbCBjb250X25ldyA9IHJlZiAwDQoJCQl2YWwgY2Fs
bCA9IHJlZiAwDQoJCQl2YWwgY29udCA9IHJlZiAwDQoJCQl2YWwgbmV3ID0gcmVmIDANCgkJCXZh
bCByZW1fY29udF9uZXcgPSByZWYgMA0KCQkJdmFsIHJlbV9jb250ID0gcmVmIDANCgkJCXZhbCBy
ZW1fbmV3ID0gcmVmIDANCg0KCQkgICAgIGluIFZlY3Rvci5mb3JlYWNoDQoJCQkoZnVuY3Rpb25z
LCBmbiB7bmFtZSwgLi4ufSA9Pg0KCQkJIGxldA0KCQkJICAgIHZhbCB7Y2FsbEluZm8sIGNhblBy
ZWZpeCwgY29udFNldCwgcmNvbnQsIC4uLn0gDQoJCQkgICAgICA9IGZ1bmNJbmZvIG5hbWUNCg0K
CQkJICAgIHZhbCBfIA0KCQkJICAgICAgPSBpZiBhbmFseXNpcw0KCQkJCSAgdGhlbiBwcmludCAo
Y29uY2F0IFtGdW5jLnRvU3RyaW5nIG5hbWUsDQoJCQkJCQkgICAgICAiOjoiLA0KCQkJCQkJICAg
ICAgIiBjYWxsSW5mbzogIiwNCgkJCQkJCSAgICAgIENhbGxJbmZvLnRvU3RyaW5nDQoJCQkJCQkg
ICAgICAoIWNhbGxJbmZvKSwNCgkJCQkJCSAgICAgICIsIGNvbnRTZXQ6ICIsDQoJCQkJCQkgICAg
ICBDb250U2V0LnRvU3RyaW5nDQoJCQkJCQkgICAgICBjb250U2V0LA0KCQkJCQkJICAgICAgIiwg
cmNvbnQ6ICIsDQoJCQkJCQkgICAgICBSQ29udC50b1N0cmluZw0KCQkJCQkJICAgICAgcmNvbnQs
DQoJCQkJCQkgICAgICAiXG4iXSkNCgkJCQkgIGVsc2UgKCkNCg0KCQkJICAgIGZ1biBkb2l0IChy
LCBzKSA9DQoJCQkgICAgICAgKEludC5pbmMgcg0KCQkJCTsgaWYgYWN0aW9uDQoJCQkJICAgICB0
aGVuIHByaW50IChjb25jYXQgW3MsIA0KCQkJCQkJCSAiICIsDQoJCQkJCQkJIEZ1bmMudG9TdHJp
bmcgbmFtZSwgDQoJCQkJCQkJICJcbiJdKQ0KCQkJCSAgZWxzZSAoKSkNCg0KCQkJICAgIGRhdGF0
eXBlIHogPSBkYXRhdHlwZSBDYWxsSW5mby50DQoJCQkgICAgZGF0YXR5cGUgeiA9IGRhdGF0eXBl
IENvbnRTZXQuc2V0DQoJCQkgICAgZGF0YXR5cGUgeiA9IGRhdGF0eXBlIFJDb250LnJjb250IA0K
DQoJCQkgICAgdmFsIGNhbl9jYWxsID0gY2FzZSAhY2FsbEluZm8NCgkJCQkJICAgICBvZiBPbmVP
dXRlckNhbGwgPT4gdHJ1ZQ0KCQkJCQkgICAgICB8IF8gPT4gZmFsc2UNCgkJCSAgICB2YWwgY2Fu
X2NvbnQgPSBjYXNlIENvbnRTZXQuc2V0IGNvbnRTZXQNCgkJCQkJICAgICBvZiBPbmUgXyA9PiB0
cnVlDQoJCQkJCSAgICAgIHwgXyA9PiBmYWxzZSANCgkJCSAgICB2YWwgY2FuX3JlbV9jb250ID0g
Y2FzZSBDb250U2V0LnNldCBjb250U2V0DQoJCQkJCQkgb2YgRW1wdHkgPT4gdHJ1ZQ0KCQkJCQkJ
ICB8IF8gPT4gZmFsc2UNCgkJCSAgICB2YWwgY2FuX25ldyA9IGNhc2UgUkNvbnQucmNvbnQgcmNv
bnQNCgkJCQkJICAgIG9mIEZ1bmNMYWJlbCBfID0+IHRydWUNCgkJCQkJICAgICB8IEp1bXBMYWJl
bCBfID0+IHRydWUNCgkJCQkJICAgICB8IF8gPT4gZmFsc2UNCgkJCSAgICB2YWwgY2FuX3JlbV9u
ZXcgPSBjYXNlIFJDb250LnJjb250IHJjb250DQoJCQkJCQlvZiBVbmNhbGxlZCA9PiB0cnVlDQoJ
CQkJCQkgfCBfID0+IGZhbHNlDQoJCQkgaW4gY2FzZSAoY2FuX2NhbGwsIGNhbl9jb250LCBjYW5f
bmV3KQ0KCQkJICAgICAgb2YgKHRydWUsIHRydWUsIHRydWUpIA0KCQkJICAgICAgID0+IGRvaXQo
Y2FsbF9jb250X25ldywgImNhbGxfY29udF9uZXciKQ0KCQkJICAgICAgIHwgKHRydWUsIHRydWUs
IGZhbHNlKSANCgkJCSAgICAgICA9PiBkb2l0KGNhbGxfY29udCwgImNhbGxfY29udCIpDQoJCQkg
ICAgICAgfCAodHJ1ZSwgZmFsc2UsIHRydWUpIA0KCQkJICAgICAgID0+IGRvaXQoY2FsbF9uZXcs
ICJjYWxsX25ldyIpDQoJCQkgICAgICAgfCAodHJ1ZSwgZmFsc2UsIGZhbHNlKSANCgkJCSAgICAg
ICA9PiBkb2l0KGNhbGwsICJjYWxsIikNCgkJCSAgICAgICB8IChmYWxzZSwgdHJ1ZSwgdHJ1ZSkg
DQoJCQkgICAgICAgPT4gZG9pdChjb250X25ldywgImNvbnRfbmV3IikNCgkJCSAgICAgICB8IChm
YWxzZSwgdHJ1ZSwgZmFsc2UpIA0KCQkJICAgICAgID0+IGRvaXQoY29udCwgImNvbnQiKQ0KCQkJ
ICAgICAgIHwgKGZhbHNlLCBmYWxzZSwgdHJ1ZSkgDQoJCQkgICAgICAgPT4gZG9pdChuZXcsICJu
ZXciKQ0KCQkJICAgICAgIHwgKGZhbHNlLCBmYWxzZSwgZmFsc2UpID0+ICgpOw0KCQkJICAgIGNh
c2UgKGNhbl9yZW1fY29udCwgY2FuX3JlbV9uZXcpDQoJCQkgICAgICBvZiAodHJ1ZSwgdHJ1ZSkN
CgkJCSAgICAgICA9PiBkb2l0KHJlbV9jb250X25ldywgInJlbV9jb250X25ldyIpDQoJCQkgICAg
ICAgfCAodHJ1ZSwgZmFsc2UpDQoJCQkgICAgICAgPT4gZG9pdChyZW1fY29udCwgInJlbV9jb250
IikNCgkJCSAgICAgICB8IChmYWxzZSwgdHJ1ZSkNCgkJCSAgICAgICA9PiBkb2l0KHJlbV9uZXcs
ICJyZW1fbmV3IikNCgkJCSAgICAgICB8IChmYWxzZSwgZmFsc2UpID0+ICgpDQoJCQkgZW5kKQ0K
CQkJOyBwcmludCAoY29uY2F0DQoJCQkJIFsiZnVuY3Rpb25zOiAiLA0KCQkJCSAgSW50LnRvU3Ry
aW5nIChWZWN0b3IubGVuZ3RoIGZ1bmN0aW9ucyksDQoJCQkJICAiICBjYWxsX2NvbnRfbmV3OiAi
LCANCgkJCQkgIEludC50b1N0cmluZyAoIWNhbGxfY29udF9uZXcpLA0KCQkJCSAgIiAgY2FsbF9j
b250OiAiLCANCgkJCQkgIEludC50b1N0cmluZyAoIWNhbGxfY29udCksDQoJCQkJICAiICBjYWxs
X25ldzogIiwNCgkJCQkgIEludC50b1N0cmluZyAoIWNhbGxfbmV3KSwNCgkJCQkgICIgIGNvbnRf
bmV3OiAiLCANCgkJCQkgIEludC50b1N0cmluZyAoIWNvbnRfbmV3KSwNCgkJCQkgICIgIGNhbGw6
ICIsIA0KCQkJCSAgSW50LnRvU3RyaW5nICghY2FsbCksDQoJCQkJICAiICBjb250OiAiLCANCgkJ
CQkgIEludC50b1N0cmluZyAoIWNvbnQpLA0KCQkJCSAgIiAgbmV3OiAiLCANCgkJCQkgIEludC50
b1N0cmluZyAoIW5ldyksDQoJCQkJICAiICByZW1fY29udF9uZXc6ICIsDQoJCQkJICBJbnQudG9T
dHJpbmcgKCFyZW1fY29udF9uZXcpLA0KCQkJCSAgIiAgcmVtX2NvbnQ6ICIsIA0KCQkJCSAgSW50
LnRvU3RyaW5nICghcmVtX2NvbnQpLA0KCQkJCSAgIiAgcmVtX25ldzogIiwgDQoJCQkJICBJbnQu
dG9TdHJpbmcgKCFyZW1fbmV3KSwNCgkJCQkgICJcbiJdKQ0KCQkgICAgIGVuZA0KCSAgICAgICBl
bHNlICgpDQoJICAgICgqIEZvciBmdW5jdGlvbnMgdHVybmVkIGludG8gY29udGludWF0aW9ucywg
cmVjb3JkIHRoZWlyDQoJICAgICAqIGFyZ3MsIGJvZHksIGFuZCBuZXcgbmFtZS4NCgkgICAgICop
DQoJICAgIHZhbCBfID0NCgkgICAgICAgVmVjdG9yLmZvcmVhY2gNCgkgICAgICAgKGZ1bmN0aW9u
cywgZm4ge25hbWUsIGFyZ3MsIGJvZHksIC4uLn0gPT4NCgkJbGV0DQoJCSAgIHZhbCB7Y2FsbElu
Zm8sIGNhblByZWZpeCwgcmVwbGFjZSwgLi4ufSA9IGZ1bmNJbmZvIG5hbWUNCgkJICAgdmFsIG9u
ZUNhbGwgPQ0KCQkgICAgICBjYXNlICFjYWxsSW5mbyBvZg0KCQkJIENhbGxJbmZvLk9uZU91dGVy
Q2FsbCA9PiB0cnVlDQoJCSAgICAgICB8IF8gPT4gZmFsc2UNCgkJICAgdmFsIG9uZUNvbnQgPSAh
Y2FuUHJlZml4DQoJCWluIGlmIChjYXNlIHN0cmF0ZWd5IG9mDQoJCQkgIENvbnRyb2wuQm90aCA9
PiBvbmVDYWxsIG9yZWxzZSBvbmVDb250DQoJCQl8IENvbnRyb2wuQ2FsbCA9PiBvbmVDYWxsDQoJ
CQl8IENvbnRyb2wuQ29udCA9PiBvbmVDb250DQooKiBmbHVldCArICopDQoJCQl8IENvbnRyb2wu
TmV3ID0+IG9uZUNvbnQNCgkJCXwgQ29udHJvbC5Ob25lID0+IGZhbHNlKQ0KCQkgICAgICB0aGVu
DQoJCQkgcmVwbGFjZSA6PQ0KCQkJIFNPTUUge2FyZ3MgPSBhcmdzLA0KCQkJICAgICAgIGJvZHkg
PSBib2R5LA0KCQkJICAgICAgIGp1bXAgPSBKdW1wLm5ld1N0cmluZyAoRnVuYy5vcmlnaW5hbE5h
bWUgbmFtZSl9DQoJCSAgIGVsc2UgKCkNCgkJZW5kKQ0KCSAgICAoKiBXYWxrIG92ZXIgYWxsIGZ1
bmN0aW9ucywgcmVtb3ZpbmcgdGhvc2UgdGhhdCBhcmVuJ3QgdG9wbGV2ZWwsIGFuZA0KCSAgICAg
KiBkZXNjZW5kaW5nIHRob3NlIHRoYXQgYXJlLCBpbnNlcnRpbmcgbG9jYWwgZnVuY3Rpb25zDQoJ
ICAgICAqIHdoZXJlIG5lY2Vzc2FyeS4NCgkgICAgICogIC0gdHVybiB0YWlsIGNhbGxzIGludG8g
bm9udGFpbCBjYWxscw0KCSAgICAgKiAgLSB0dXJuIHJldHVybnMgaW50byBqdW1wcw0KCSAgICAg
KikNCgkgICAgZnVuIHdhbGtFeHAgKGY6IEZ1bmMudCwgZTogRXhwLnQsIGM6IEp1bXAudCBvcHRp
b24pOiBFeHAudCA9DQoJICAgICAgIGxldA0KCQkgIHZhbCB7ZGVjcywgdHJhbnNmZXJ9ID0gRXhw
LmRlc3QgZQ0KCQkgIHZhbCBkZWNzID0gDQoJCSAgICAgTGlzdC5mb2xkDQoJCSAgICAgKHJldiBk
ZWNzLCBbXSwgZm4gKGQsIGRzKSA9Pg0KCQkgICAgICBjYXNlIGQgb2YNCgkJCSBCaW5kIF8gPT4g
ZCA6OiBkcw0KCQkgICAgICAgfCBGdW4ge25hbWUsIGFyZ3MsIGJvZHl9ID0+DQoJCQkgICAgRnVu
IHtuYW1lID0gbmFtZSwNCgkJCQkgYXJncyA9IGFyZ3MsDQoJCQkJIGJvZHkgPSB3YWxrRXhwIChm
LCBib2R5LCBjKX0NCgkJCSAgICA6OiAoaWYgKGNhc2Ugc3RyYXRlZ3kgb2YNCgkJCQkgICAgICAg
Q29udHJvbC5Cb3RoID0+IHRydWUNCgkJCQkgICAgIHwgQ29udHJvbC5Db250ID0+IHRydWUNCigq
IGZsdWV0ICsgKikNCgkJCQkgICAgIHwgQ29udHJvbC5OZXcgPT4gdHJ1ZQ0KCQkJCSAgICAgfCBf
ID0+IGZhbHNlKQ0KCQkJCSAgIHRoZW4NCgkJCQkgICAgICBsZXQgdmFsIHtwcmVmaXhlcywgLi4u
fSA9IGp1bXBJbmZvIG5hbWUNCgkJCQkgICAgICBpbiBjYXNlICFwcmVmaXhlcyBvZg0KCQkJCQkg
Tk9ORSA9PiBkcw0KCQkJCSAgICAgICB8IFNPTUUgZnMgPT4gbmVzdCAoZnMsIFNPTUUgbmFtZSwg
ZHMpDQoJCQkJICAgICAgZW5kDQoJCQkJZWxzZSBkcykNCgkJICAgICAgIHwgSGFuZGxlclB1c2gg
aCA9PiBIYW5kbGVyUHVzaCBoIDo6IGRzDQoJCSAgICAgICB8IEhhbmRsZXJQb3AgPT4gSGFuZGxl
clBvcCA6OiBkcykNCgkJICBmdW4gbWFrZSB0cmFuc2ZlciA9IEV4cC5tYWtlIHtkZWNzID0gZGVj
cywNCgkJCQkJCXRyYW5zZmVyID0gdHJhbnNmZXJ9DQoJICAgICAgIGluDQoJCSAgY2FzZSB0cmFu
c2ZlciBvZg0KCQkgICAgIENhbGwge2Z1bmMsIGFyZ3MsIGNvbnR9ID0+DQoJCQlsZXQNCgkJCSAg
IHZhbCBuZXdDb250OiBKdW1wLnQgb3B0aW9uID0NCgkJCSAgICAgIGNhc2UgY29udCBvZg0KCQkJ
CSBOT05FID0+IGMNCgkJCSAgICAgICB8IFNPTUUgXyA9PiBjb250DQoJCQkgICB2YWwge2NhbGxJ
bmZvLCBjYW5QcmVmaXgsIHJlcGxhY2UsIC4uLn0gPQ0KCQkJICAgICAgZnVuY0luZm8gZnVuYw0K
CQkJaW4NCgkJCSAgIGNhc2UgIXJlcGxhY2Ugb2YNCgkJCSAgICAgIE5PTkUgPT4NCgkJCQkgbWFr
ZSAoQ2FsbCB7ZnVuYyA9IGZ1bmMsDQoJCQkJCSAgICAgYXJncyA9IGFyZ3MsDQoJCQkJCSAgICAg
Y29udCA9IG5ld0NvbnR9KQ0KCQkJICAgIHwgU09NRSB7anVtcCwgYXJncyA9IGZvcm1hbHMsIGJv
ZHl9ID0+DQoJCQkJIGxldA0KCQkJCSAgICB2YWwgZGVjcyA9DQoJCQkJICAgICAgIGlmICFjYWxs
SW5mbyA9IENhbGxJbmZvLk9uZU91dGVyQ2FsbA0KCQkJCQkgIGFuZGFsc28gbm90IChGdW5jLmVx
dWFscyAoZiwgZnVuYykpDQoJCQkJCSAgYW5kYWxzbyAoY2FzZSBzdHJhdGVneSBvZg0KCQkJCQkJ
ICAgICAgQ29udHJvbC5Cb3RoID0+DQoJCQkJCQkJIG5vdCAoIWNhblByZWZpeCkNCgkJCQkJCSAg
ICB8IENvbnRyb2wuQ2FsbCA9PiB0cnVlDQoJCQkJCQkgICAgfCBfID0+IGZhbHNlKQ0KCQkJCQkg
IHRoZW4NCgkJCQkJICAgICBkZWNzDQoJCQkJCSAgICAgQCBbRnVuIHtuYW1lID0ganVtcCwNCgkJ
CQkJCSAgICAgYXJncyA9IGZvcm1hbHMsDQoJCQkJCQkgICAgIGJvZHkgPSB3YWxrRXhwIChmdW5j
LCBib2R5LA0KCQkJCQkJCQkgICAgIG5ld0NvbnQpfV0NCgkJCQkJICAgICAgDQoJCQkJICAgICAg
IGVsc2UgZGVjcw0KCQkJCSBpbg0KCQkJCSAgICBFeHAubWFrZQ0KCQkJCSAgICB7ZGVjcyA9IGRl
Y3MsDQoJCQkJICAgICB0cmFuc2ZlciA9IEp1bXAge2RzdCA9IGp1bXAsIGFyZ3MgPSBhcmdzfX0N
CgkJCQkgZW5kDQoJCQllbmQNCgkJICAgfCBSZXR1cm4geHMgPT4NCgkJCW1ha2UgKGNhc2UgYyBv
Zg0KCQkJCSBOT05FID0+IHRyYW5zZmVyDQoJCQkgICAgICAgfCBTT01FIGMgPT4gSnVtcCB7ZHN0
ID0gYywgYXJncyA9IHhzfSkNCgkJICAgfCBfID0+IG1ha2UgdHJhbnNmZXINCgkgICAgICAgZW5k
DQoJICAgIGFuZCBuZXN0IChmczogRnVuYy50IGxpc3QsDQoJCSAgICAgIGNvbnQ6IEp1bXAudCBv
cHRpb24sDQoJCSAgICAgIGRzOiBEZWMudCBsaXN0KTogRGVjLnQgbGlzdCA9DQoJICAgICAgIExp
c3QuZm9sZA0KCSAgICAgICAocmV2IGZzLCBkcywgZm4gKGYsIGRzKSA9Pg0KCQlsZXQNCgkJICAg
dmFsIHtyZXBsYWNlLCBuZXN0ZWQsIHByZWZpeGVzLCAuLi59ID0gZnVuY0luZm8gZg0KCQkgICB2
YWwgZnMgPQ0KCQkgICAgICBjYXNlICFwcmVmaXhlcyBvZg0KCQkJIE5PTkUgPT4gIW5lc3RlZA0K
CQkgICAgICAgfCBTT01FIGZzID0+IExpc3QuYXBwZW5kUmV2IChmcywgIW5lc3RlZCkNCgkJICAg
dmFsIHtqdW1wLCBhcmdzLCBib2R5fSA9IHZhbE9mICghcmVwbGFjZSkNCgkJICAgdmFsIHtkZWNz
LCB0cmFuc2Zlcn0gPSBFeHAuZGVzdCAod2Fsa0V4cCAoZiwgYm9keSwgY29udCkpDQoJCSAgIHZh
bCBib2R5ID0gRXhwLm1ha2Uge2RlY3MgPSBuZXN0ICghbmVzdGVkLCBjb250LCBkZWNzKSwNCgkJ
CQkJdHJhbnNmZXIgPSB0cmFuc2Zlcn0NCgkJaW4gRnVuIHtuYW1lID0ganVtcCwgYXJncyA9IGFy
Z3MsIGJvZHkgPSBib2R5fSA6OiBkcw0KCQllbmQpDQoJICAgIHZhbCBzaHJpbmtFeHAgPSBzaHJp
bmtFeHAgZ2xvYmFscw0KCSAgICB2YWwgZnVuY3Rpb25zID0NCgkgICAgICAgVmVjdG9yLmZyb21M
aXN0DQoJICAgICAgIChWZWN0b3IuZm9sZHINCgkJKGZ1bmN0aW9ucywgW10sIGZuICh7bmFtZSwg
YXJncywgYm9keSwgcmV0dXJuc30sIGZ1bmN0aW9ucykgPT4NCgkJIGxldA0KCQkgICAgdmFsIHtj
b250U2V0LCByY29udCwgcHJlZml4ZXMsIHJlcGxhY2UsIC4uLn0gPSBmdW5jSW5mbyBuYW1lDQoJ
CSBpbiBjYXNlICFyZXBsYWNlIG9mDQoJCSAgICBOT05FID0+DQooKiBmbHVldCArICopDQoJCSAg
ICAgIGlmIChjYXNlIHN0cmF0ZWd5DQoJCQkgICAgb2YgQ29udHJvbC5Db250ID0+IENvbnRTZXQu
aXNFbXB0eSBjb250U2V0DQoJCQkgICAgIHwgQ29udHJvbC5Cb3RoID0+IENvbnRTZXQuaXNFbXB0
eSBjb250U2V0DQoJCQkgICAgIHwgQ29udHJvbC5OZXcgPT4gUkNvbnQuaXNVbmNhbGxlZCByY29u
dA0KCQkJICAgICB8IF8gPT4gZmFsc2UpDQooKiBmbHVldCAtICopDQooKg0KCQkgICAgICBpZiBD
b250U2V0LmlzRW1wdHkgY29udFNldA0KKikNCgkJCSAgdGhlbg0KCQkJICAgICAoKiBEb24ndCBp
bmNsdWRlIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYW4gZW1wdHkgY29udA0KCQkJICAgICAgKiBzZXQs
IGJlY2F1c2UgdGhleSBhcmVuJ3QgY2FsbGVkLg0KCQkJICAgICAgKikNCgkJCSAgICAgZnVuY3Rp
b25zDQoJCSAgICAgICBlbHNlDQoJCQkgIGxldA0KCQkJICAgICB2YWwgYm9keSA9IHdhbGtFeHAg
KG5hbWUsIGJvZHksIE5PTkUpDQoJCQkgICAgIHZhbCBib2R5ID0NCgkJCQljYXNlICFwcmVmaXhl
cyBvZg0KCQkJCSAgIE5PTkUgPT4gYm9keQ0KCQkJCSB8IFNPTUUgZnMgPT4NCgkJCQkgICAgICBs
ZXQgdmFsIHtkZWNzLCB0cmFuc2Zlcn0gPSBFeHAuZGVzdCBib2R5DQoJCQkJICAgICAgaW4gRXhw
Lm1ha2Uge2RlY3MgPSBuZXN0IChmcywgTk9ORSwgZGVjcyksDQoJCQkJCQkgICB0cmFuc2ZlciA9
IHRyYW5zZmVyfQ0KCQkJCSAgICAgIGVuZA0KCQkJICAgICB2YWwgYm9keSA9IHNocmlua0V4cCBi
b2R5DQoJCQkgIGluIHtuYW1lID0gbmFtZSwgYXJncyA9IGFyZ3MsIHJldHVybnMgPSByZXR1cm5z
LA0KCQkJICAgICAgYm9keSA9IGJvZHl9DQoJCQkgIGVuZCA6OiBmdW5jdGlvbnMNCgkJCQkgfCBf
ID0+IGZ1bmN0aW9ucw0KCQkgZW5kKSkNCgkgICAgdmFsIHByb2dyYW0gPQ0KCSAgICAgICBQcm9n
cmFtLlQge2RhdGF0eXBlcyA9IGRhdGF0eXBlcywNCgkJCSAgZ2xvYmFscyA9IGdsb2JhbHMsDQoJ
CQkgIGZ1bmN0aW9ucyA9IGZ1bmN0aW9ucywNCgkJCSAgbWFpbiA9IG1haW59DQoJICAgIHZhbCBf
ID0gUHJvZ3JhbS5jbGVhciBwcm9ncmFtDQoJIGluDQoJICAgIHByb2dyYW0NCgkgZW5kDQogICBl
bmQNCg0KZW5kDQo=

---559023410-1804928587-979946543=:3409--