cGFja2FnZSBjb20ubXMubWluaUNPT0wuYXV0aHNydjsNCg0KaW1wb3J0IGNv
bS5zdW4ueG1sLnRyZWUuKjsNCmltcG9ydCBvcmcudzNjLmRvbS4qOw0KDQpp
bXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsNCmltcG9ydCBqYXZhLnNxbC5S
ZXN1bHRTZXQ7DQppbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOw0KaW1w
b3J0IGphdmEuc3FsLlN0YXRlbWVudDsNCg0KcHVibGljIGNsYXNzIElzQWxs
b3dlZENhbGwgZXh0ZW5kcyBYbWxDYWxsIHsNCg0KICAgIFN0cmluZyB1c2Vy
SWQgPSBudWxsOw0KICAgIFN0cmluZyBhc3NldElkID0gbnVsbDsNCiAgICBT
dHJpbmcgcHJpdklkID0gbnVsbDsNCiAgICBTdHJpbmcgYWNjZXNzQ29kZSA9
IG51bGw7DQoNCiAgICBwcml2YXRlIHZvaWQgZnJvbVhNTChFbGVtZW50Tm9k
ZSBib2R5KSB0aHJvd3MgWG1sRnVuY0V4Y2VwdGlvbiB7DQoNCglpZiAoKGJv
ZHkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgJiYNCgkg
ICAgKGJvZHkuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoIk1DQm9keSIpKSkgew0K
CSAgICBmb3IgKE5vZGUgbiA9IGJvZHkuZ2V0Rmlyc3RDaGlsZCgpOw0KCQkg
biAhPSBudWxsOw0KCQkgbiA9IG4uZ2V0TmV4dFNpYmxpbmcgKCkpIHsNCgkJ
aWYgKG4uZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoInVzZXJJZCIpKSB7DQoJCSAg
ICB1c2VySWQgPSBuLmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVmFsdWUoKTsN
CgkJfSBlbHNlIGlmIChuLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJhc3NldElk
IikpIHsNCgkJICAgIGFzc2V0SWQgPSBuLmdldEZpcnN0Q2hpbGQoKS5nZXRO
b2RlVmFsdWUoKTsNCgkJfSBlbHNlIGlmIChuLmdldE5vZGVOYW1lKCkuZXF1
YWxzKCJwcml2aWxlZ2VJZCIpKSB7DQoJCSAgICBwcml2SWQgPSBuLmdldEZp
cnN0Q2hpbGQoKS5nZXROb2RlVmFsdWUoKTsNCgkJfSBlbHNlIHsNCgkJICAg
IC8vIERFQlVHDQoJCX0NCgkgICAgfQ0KCX0gZWxzZSB7DQoJICAgIHRocm93
IG5ldyBYbWxGdW5jRXhjZXB0aW9uKCJNQ0JvZHkgRWxlbWVudCBub3QgZm91
bmQhIik7DQoJfQ0KDQoJaWYgKCh1c2VySWQgPT0gbnVsbCkgfHwgKGFzc2V0
SWQgPT0gbnVsbCkgfHwgKHByaXZJZCA9PSBudWxsKSkgew0KCSAgICB0aHJv
dyBuZXcgWG1sRnVuY0V4Y2VwdGlvbigiTUNCb2R5IEVsZW1lbnQgaW5jb21w
bGV0ZSEiKTsNCgl9DQoJLy8gYXJlIHRoZSB2YWx1ZXMgaW4gdGhlIGNvcnJl
Y3QgcmFuZ2U/IGFyZSB0aGUgaWRzIGlkcz8NCiAgICB9DQoNCiAgICBwdWJs
aWMgTm9kZSB0b1hNTCgpIHsNCglFbGVtZW50Tm9kZSBib2R5ID0gbnVsbDsN
Cg0KCWJvZHkgPSAoRWxlbWVudE5vZGUpcmVwbHlEb2MuY3JlYXRlRWxlbWVu
dCgiTUNCb2R5Iik7DQoJYm9keS5hcHBlbmRDaGlsZChjcmVhdGVTaW1wbGVL
VlAoImlzQWxsb3dlZCIsIGFjY2Vzc0NvZGUpKTsNCglyZXR1cm4gYm9keTsN
CiAgICB9DQoNCiAgICBwdWJsaWMgWG1sRG9jdW1lbnQgY2FsbChYbWxEb2N1
bWVudCBkb2MpIHsNCglyZXF1ZXN0RG9jID0gZG9jOw0KDQoJQ29ubmVjdGlv
biBjb24gPSBudWxsOw0KCVN0YXRlbWVudCBzdG10ID0gbnVsbDsNCglSZXN1
bHRTZXQgcnMgPSBudWxsOw0KDQoJdHJ5IHsNCgkgICAgZnJvbVhNTChzdXBl
ci5mcm9tWE1MKCkpOw0KCSAgICBjb24gPSBYbWxScGNTZXJ2ZXIuZ2V0Q29u
bmVjdGlvbk1hbmFnZXIoKS5nZXRDb25uZWN0aW9uKCJtaW5pQ09PTCIsIDEw
MDAwKTsNCgkgICAgaWYgKGNvbiA9PSBudWxsKXsNCgkJdGhyb3cgbmV3IFht
bEZ1bmNFeGNlcHRpb24oImNvdWxkIG5vdCBnZXQgYSBjb25uZWN0aW9uIHRv
IGZ1bGxmaWwgcmVxdWVzdCIpOw0KCSAgICB9DQoJCQkNCgkgICAgdHJ5IHsN
CgkJc3RtdCA9IGNvbi5jcmVhdGVTdGF0ZW1lbnQoKTsNCgkgICAgfSBjYXRj
aCAoU1FMRXhjZXB0aW9uIGUpIHsNCgkJdGhyb3cgbmV3IFhtbEZ1bmNFeGNl
cHRpb24oImNvdWxkIG5vdCBjcmVhdGUgYSBzdGF0ZW1lbnQgZm9yIHF1ZXJ5
Iik7DQoJICAgIH0NCg0KCSAgICB0cnkgew0KCQlycyA9IHN0bXQuZXhlY3V0
ZVF1ZXJ5KCANCgkJICAgICAgICJzZWxlY3QgY291bnQoKikgZnJvbSBQZXJt
aXNzaW9ucywgQ2hhbm5lbHMsIEdyb3VwcywgUm9sZXMiICsNCgkJICAgICAg
ICIgd2hlcmUiICsNCgkJICAgICAgICIgIFBlcm1pc3Npb25zLmNoYW5uZWxJ
ZCA9IENoYW5uZWxzLmNoYW5uZWxJZCBhbmQiICsNCgkJICAgICAgICIgIFBl
cm1pc3Npb25zLmdyb3VwSWQgPSBHcm91cHMuZ3JvdXBJZCBhbmQiICsNCgkJ
ICAgICAgICIgIFBlcm1pc3Npb25zLnJvbGVJZCA9IFJvbGVzLnJvbGVJZCBh
bmQiICsNCgkJICAgICAgICIgIENoYW5uZWxzLmFzc2V0SWQgPSAiICsgYXNz
ZXRJZCArICIgYW5kIiArDQoJCSAgICAgICAiICBHcm91cHMudXNlcklkID0g
IiArIHVzZXJJZCArICIgYW5kIiArDQoJCSAgICAgICAiICBSb2xlcy5wcml2
aWxlZ2VJZCA9ICIgKyBwcml2SWQNCgkJICAgICAgICk7DQoNCgkgICAgfSBj
YXRjaCAoU1FMRXhjZXB0aW9uIGUpIHsNCgkJdGhyb3cgbmV3IFhtbEZ1bmNF
eGNlcHRpb24oImNvdWxkIG5vdCBleGVjdXRlIHF1ZXJ5Iik7DQoJICAgIH0N
Cg0KCSAgICB0cnkgew0KCQlycy5uZXh0KCk7CQkJCQkJDQoJCWludCB2YWx1
ZSA9IHJzLmdldEludCgxKTsNCgkJYWNjZXNzQ29kZSA9ICh2YWx1ZSA+IDAp
ID8gInRydWUiIDogImZhbHNlIjsNCgkJc3RtdC5jbG9zZSgpOw0KCQlycy5j
bG9zZSgpOw0KCSAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgew0KCQlh
Y2Nlc3NDb2RlID0gImZhbHNlIjsNCgkgICAgfQ0KCQkJDQoJICAgIHJlcGx5
RG9jID0gbmV3IFhtbERvY3VtZW50KCk7DQoJICAgIHJldHVybiBzdXBlci50
b1hNTCh0b1hNTCgpKTsNCg0KCX0gY2F0Y2ggKFhtbEZ1bmNFeGNlcHRpb24g
ZSkgew0KCSAgICBTeXN0ZW0uZXJyLnByaW50bG4oIlhtbEZ1bmNFeGNlcHRp
b246ICIgKyBlLmdldE1lc3NhZ2UoKSk7DQoJICAgIHJldHVybiBudWxsOw0K
CX0gZmluYWxseSB7DQoJICAgIGlmIChjb24gIT0gbnVsbCl7DQoJCVhtbFJw
Y1NlcnZlci5nZXRDb25uZWN0aW9uTWFuYWdlcigpLmZyZWVDb25uZWN0aW9u
KCJtaW5pQ09PTCIsIGNvbik7DQoJICAgIH0NCgl9DQogICAgfQ0KfQ0K

