cGFja2FnZSBjb20ubXMubWluaUNPT0wuYXV0aHNydjsNCg0KaW1wb3J0IGNv
bS5zdW4ueG1sLnRyZWUuKjsNCmltcG9ydCBvcmcudzNjLmRvbS4qOw0KDQpp
bXBvcnQgamF2YS5zcWwuQ29ubmVjdGlvbjsNCmltcG9ydCBqYXZhLnNxbC5S
ZXN1bHRTZXQ7DQppbXBvcnQgamF2YS5zcWwuU1FMRXhjZXB0aW9uOw0KaW1w
b3J0IGphdmEuc3FsLlN0YXRlbWVudDsNCg0KaW1wb3J0IGphdmEudXRpbC5F
bnVtZXJhdGlvbjsNCmltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOw0KDQpwdWJs
aWMgY2xhc3MgR2V0UHJpdnNDYWxsIGV4dGVuZHMgWG1sQ2FsbCB7DQoNCiAg
ICBTdHJpbmcgdXNlcklkID0gbnVsbDsNCiAgICBWZWN0b3IgcHJpdnMgPSBu
dWxsOw0KDQogICAgcHJpdmF0ZSB2b2lkIGZyb21YTUwoRWxlbWVudE5vZGUg
Ym9keSkgdGhyb3dzIFhtbEZ1bmNFeGNlcHRpb24gew0KCWlmICgoYm9keS5n
ZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSAmJg0KCSAgICAo
Ym9keS5nZXROb2RlTmFtZSgpLmVxdWFscygiTUNCb2R5IikpKSB7DQoJICAg
IGZvciAoTm9kZSBuID0gYm9keS5nZXRGaXJzdENoaWxkICgpOw0KCQkgbiAh
PSBudWxsOw0KCQkgbiA9IG4uZ2V0TmV4dFNpYmxpbmcgKCkpIHsNCgkJaWYg
KG4uZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoInVzZXJJZCIpKSB7DQoJCSAgICB1
c2VySWQgPSAgbi5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCk7DQoJ
CX0gZWxzZSB7DQoJCSAgICAvLyBERUJVRw0KCQl9DQoJICAgIH0NCgl9IGVs
c2Ugew0KCSAgICB0aHJvdyBuZXcgWG1sRnVuY0V4Y2VwdGlvbigiTUNCb2R5
IEVsZW1lbnQgbm90IGZvdW5kISIpOw0KCX0NCg0KCWlmICgodXNlcklkID09
IG51bGwpKSB7DQoJICAgIHRocm93IG5ldyBYbWxGdW5jRXhjZXB0aW9uKCJN
Q0JvZHkgRWxlbWVudCBpbmNvbXBsZXRlISIpOw0KCX0NCgkvLyBhcmUgdGhl
IHZhbHVlcyBpbiB0aGUgY29ycmVjdCByYW5nZT8gYXJlIHRoZSBpZHMgaWRz
Pw0KICAgIH0NCg0KICAgIHB1YmxpYyBOb2RlIHRvWE1MKCkgew0KCUVsZW1l
bnROb2RlIGJvZHkgPSBudWxsOw0KCUVsZW1lbnROb2RlIHNlcSA9IG51bGw7
DQoNCglib2R5ID0gKEVsZW1lbnROb2RlKXJlcGx5RG9jLmNyZWF0ZUVsZW1l
bnQoIk1DQm9keSIpOw0KCXNlcSAgPSAoRWxlbWVudE5vZGUpcmVwbHlEb2Mu
Y3JlYXRlRWxlbWVudCgic2VxIik7DQoJYm9keS5hcHBlbmRDaGlsZCggc2Vx
ICk7DQoJDQoJRW51bWVyYXRpb24gZW51bWVyYXRvciA9IHByaXZzLmVsZW1l
bnRzKCk7DQoJd2hpbGUoIGVudW1lcmF0b3IuaGFzTW9yZUVsZW1lbnRzKCkg
KXsNCgkgICAgc2VxLmFwcGVuZENoaWxkKGNyZWF0ZVNpbXBsZUtWUCgicHJp
dmlsZWdlSWQiLA0KCQkJCQkgICAgKFN0cmluZyllbnVtZXJhdG9yLm5leHRF
bGVtZW50KCkpKTsNCgl9DQoJcmV0dXJuIGJvZHk7DQogICAgfQ0KDQogICAg
cHVibGljIFhtbERvY3VtZW50IGNhbGwoWG1sRG9jdW1lbnQgZG9jKSB7DQoJ
cmVxdWVzdERvYyA9IGRvYzsNCg0KCUNvbm5lY3Rpb24gY29uID0gbnVsbDsN
CglTdGF0ZW1lbnQgc3RtdCA9IG51bGw7DQoJUmVzdWx0U2V0IHJzID0gbnVs
bDsNCg0KCXRyeSB7DQoJICAgIGZyb21YTUwoc3VwZXIuZnJvbVhNTCgpKTsN
CgkgICAgY29uID0gWG1sUnBjU2VydmVyLmdldENvbm5lY3Rpb25NYW5hZ2Vy
KCkuZ2V0Q29ubmVjdGlvbigibWluaUNPT0wiLCAxMDAwKTsNCgkgICAgaWYg
KGNvbiA9PSBudWxsKXsNCgkJU3lzdGVtLmVyci5wcmludGxuKCJHZXRQcml2
c0NhbGwgY291bGQgbm90IGdldCBhIGNvbm5lY3Rpb24iKTsNCgkJcmV0dXJu
IG51bGw7DQoJICAgIH0NCgkJCQ0KCSAgICB0cnkgew0KCQlzdG10ID0gY29u
LmNyZWF0ZVN0YXRlbWVudCgpOw0KCSAgICB9IGNhdGNoIChTUUxFeGNlcHRp
b24gZSkgew0KCQlTeXN0ZW0uZXJyLnByaW50bG4oIkdldFByaXZzQ2FsbCBj
b3VsZCBub3QgY3JlYXRlIGEgc3RhdGVtZW50Iik7DQoJCXJldHVybiBudWxs
Ow0KCSAgICB9DQoNCgkgICAgdHJ5IHsNCgkJcnMgPSBzdG10LmV4ZWN1dGVR
dWVyeSgNCgkJICAgICAgICJzZWxlY3QgZGlzdGluY3QgUm9sZXMucHJpdmls
ZWdlSWQgZnJvbSBSb2xlcywgUGVybWlzc2lvbnMiICsNCgkJICAgICAgICIg
d2hlcmUiICsNCgkJICAgICAgICIgIFBlcm1pc3Npb25zLnJvbGVJZCA9IFJv
bGVzLnJvbGVJZCBhbmQiICsNCgkJICAgICAgICIgIFBlcm1pc3Npb25zLnJv
bGVJZCBpbiIgKw0KCQkgICAgICAgIiAgKHNlbGVjdCBQZXJtaXNzaW9ucy5y
b2xlSWQgZnJvbSBQZXJtaXNzaW9ucywgR3JvdXBzIiArDQoJCSAgICAgICAi
ICAgd2hlcmUiICsNCgkJICAgICAgICIgICBQZXJtaXNzaW9ucy5ncm91cElk
ID0gR3JvdXBzLmdyb3VwSWQgYW5kIiArDQoJCSAgICAgICAiICAgR3JvdXBz
LnVzZXJJZCA9ICIgKyB1c2VySWQgKyAiKSINCgkJICAgICAgICk7DQoJICAg
IH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7DQoJCVN5c3RlbS5lcnIucHJp
bnRsbigiR2V0UHJpdnNDYWxsIGNvdWxkIG5vdCBleGVjdXRlIHF1ZXJ5Iik7
DQoJCXJldHVybiBudWxsOw0KCSAgICB9DQoNCgkgICAgdHJ5IHsNCg0KCQlw
cml2cyA9IG5ldyBWZWN0b3IoKTsNCgkJd2hpbGUgKHJzLm5leHQoKSkgew0K
CQkgICAgcHJpdnMuYWRkRWxlbWVudChycy5nZXRTdHJpbmcoMSkpOw0KCQl9
DQoJICAgIH0gY2F0Y2ggKFNRTEV4Y2VwdGlvbiBlKSB7DQoJCVN5c3RlbS5l
cnIucHJpbnRsbigiR2V0UHJpdnNDYWxsIGNvdWxkIG5vdCBjcmVhdGUgcHJp
dnMgdmVjdG9yIik7DQoJCXJldHVybiBudWxsOw0KCSAgICB9DQoJICAgIA0K
CSAgICB0cnkgewkNCgkJc3RtdC5jbG9zZSgpOw0KCQlycy5jbG9zZSgpOw0K
CSAgICB9IGNhdGNoIChTUUxFeGNlcHRpb24gZSkgew0KCQlTeXN0ZW0uZXJy
LnByaW50bG4oIkdldFByaXZzQ2FsbCBjb3VsZCBub3QgY2xvc2UgcmVzb3Vy
Y2VzIik7DQoJICAgIH0NCg0KCSAgICByZXBseURvYyA9IG5ldyBYbWxEb2N1
bWVudCgpOw0KCSAgICByZXR1cm4gIHN1cGVyLnRvWE1MKHRvWE1MKCkpOw0K
DQoJfSBjYXRjaCAoWG1sRnVuY0V4Y2VwdGlvbiBlKSB7DQoJICAgIFN5c3Rl
bS5lcnIucHJpbnRsbigiWG1sRnVuY0V4Y2VwdGlvbjogIiArIGUuZ2V0TWVz
c2FnZSgpKTsNCgkgICAgcmV0dXJuIG51bGw7DQoJfSBmaW5hbGx5IHsNCgkg
ICAgaWYgKGNvbiAhPSBudWxsKXsNCgkJWG1sUnBjU2VydmVyLmdldENvbm5l
Y3Rpb25NYW5hZ2VyKCkuZnJlZUNvbm5lY3Rpb24oIm1pbmlDT09MIiwgY29u
KTsNCgkgICAgfQ0KCX0NCiAgICB9DQp9DQo=
