Re: How to package java classes in an opencms module

Michael Emmerich via opencms-dev <[email protected]> Fri, 8 Aug 2025 14:30:00 +0200
Newsgroups gmane.comp.cms.opencms.devel
Message-ID <[email protected]>
TGF1cmVudCwKCmZyb20geW91IG1hbmlmZXN0LCBJIHNlZSB0aGF0IHlvdSBoYXZlIG5vdCBhc3Np
Z25lZCBhbnkgcmVzb3VyY2VzIHRvIAp5b3VyIG1vZHVsZS4gU28gbm8gcmVzb3VyY2VzIGFyZSBp
bXBvcnRlZCB3aGVuIHlvdSBpbXBvcnQgdGhlIG1vZHVsZSwgCnRoZXJlZm9yZSB0aGUgLmphciBh
bmQgLmNsYXNzZXMgYXJlIG1pc3NpbmcuwqAgSSBzZWUgdGhhdCB5b3UgaGF2ZSAKZGVmaW5lZCB0
aGUgZXhwb3J0IHBvaW50cywgYnV0IHdpdGhvdXQgdGhlIGltcG9ydGVkIGZpbGUsIHRoaXMgd2ls
bCBub3QgCndvcmsuCgpIb3dldmVyLCB3ZSB1c3VhbGx5IGRvIG5vdCBwdXQgLmphciBvciAuY2xh
c3MgZmlsZXMgaW4gb3VyIG1vZHVsZXMsIHdlIApkZXBsb3kgdGhlbSBzZXBhcmF0ZWx5IG9uIHRo
ZSBzZXJ2ZXIgYXMgeW8gaGF2ZSB0byByZXN0YXJ0IGl0IGFueXdheSAKYWZ0ZXIgZGVwbG95aW5n
IHNvbWUgLmphciBhbmQgLmNsYXNzIGZpbGVzLgoKCktpbmQgcmVnYXJkcywKCk1pY2hhZWwKCgoK
QW0gMDguMDguMjUgdW0gMTE6MjIgc2NocmllYiBsYXVyZW50LmRydWFydCB2aWEgb3BlbmNtcy1k
ZXY6Cj4gSGVsbG8sCj4KPiBJbiBhZGQtb24gdG8gbXkgcHJldmlvdXMgZS1tYWlsLCBoZXJlIGlz
IHRoZSBjb250ZW50L3N0cnVjdHVyZSBvZiBteSB6aXAgZmlsZXMgOgo+Cj4KPiBBbmQgdGhlIGNv
bnRlbnQgb2YgbXkgbWFuaWZlc3QueG1sIDoKPgo+IDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rp
bmc9IlVURi04Ij8+Cj4gPGV4cG9ydD4KPiAgICAgIDxpbmZvPgo+ICAgICAgICAgIDxjcmVhdG9y
Pk9wZW5DTVMgTW9kdWxlIEJ1aWxkZXI8L2NyZWF0b3I+Cj4gICAgICAgICAgPG9wZW5jbXNfdmVy
c2lvbj4xOS4wPC9vcGVuY21zX3ZlcnNpb24+Cj4gICAgICAgICAgPGNyZWF0ZWRhdGU+V2VkLCAw
NyBBdWcgMjAyNSAxMDowMDowMCBHTVQ8L2NyZWF0ZWRhdGU+Cj4gICAgICAgICAgPHByb2plY3Q+
T2ZmbGluZTwvcHJvamVjdD4KPiAgICAgICAgICA8ZXhwb3J0X3ZlcnNpb24+NzwvZXhwb3J0X3Zl
cnNpb24+Cj4gICAgICA8L2luZm8+Cj4KPiAgICAgIDxtb2R1bGU+Cj4gICAgICAgICAgPG5hbWU+
Y29tLm9wZW5jbXMubGlicmFyeTwvbmFtZT4KPiAgICAgICAgICA8bmljZW5hbWU+T3BlbkNNUyBT
cHJpbmcgRGF0YSBKREJDIExpYnJhcnk8L25pY2VuYW1lPgo+ICAgICAgICAgIDxncm91cD5DdXN0
b20gTGlicmFyaWVzPC9ncm91cD4KPiAgICAgICAgICA8Y2xhc3M+Y29tLm9wZW5jbXMubGlicmFy
eS5pbnRlZ3JhdGlvbi5MaWJyYXJ5SW5pdGlhbGl6ZXI8L2NsYXNzPgo+ICAgICAgICAgIDxkZXNj
cmlwdGlvbj5MaWJyYWlyaWUgU3ByaW5nIGNsYXNzaXF1ZSBwb3VyIE9wZW5DTVMgYXZlYyBhY2PD
qHMgYXV4IGRvbm7DqWVzIFBvc3RncmVTUUw8L2Rlc2NyaXB0aW9uPgo+ICAgICAgICAgIDx2ZXJz
aW9uPjEuMC4wPC92ZXJzaW9uPgo+ICAgICAgICAgIDxhdXRob3JuYW1lPkxhdXJlbnQgRHJ1YXJ0
PC9hdXRob3JuYW1lPgo+ICAgICAgICAgIDxhdXRob3JlbWFpbD5sYXVyZW50LmRydWFydEBsZGlj
dC5iZTwvYXV0aG9yZW1haWw+Cj4gICAgICAgICAgPGRhdGVjcmVhdGVkPldlZCwgMDcgQXVnIDIw
MjUgMTA6MDA6MDAgR01UPC9kYXRlY3JlYXRlZD4KPiAgICAgICAgICA8dXNlcmluc3RhbGxlZD5B
ZG1pbjwvdXNlcmluc3RhbGxlZD4KPiAgICAgICAgICA8ZGF0ZWluc3RhbGxlZD5XZWQsIDA3IEF1
ZyAyMDI1IDEwOjAwOjAwIEdNVDwvZGF0ZWluc3RhbGxlZD4KPgo+ICAgICAgICAgIDxkZXBlbmRl
bmNpZXMvPgo+Cj4gICAgICAgICAgPGV4cG9ydHBvaW50cz4KPiAgICAgICAgICAgICAgPGV4cG9y
dHBvaW50IHVyaT0iL3N5c3RlbS9tb2R1bGVzL2NvbS5vcGVuY21zLmxpYnJhcnkvY2xhc3Nlcy8i
IGRlc3RpbmF0aW9uPSJXRUItSU5GL2NsYXNzZXMvIi8+Cj4gICAgICAgICAgICAgIDxleHBvcnRw
b2ludCB1cmk9Ii9zeXN0ZW0vbW9kdWxlcy9jb20ub3BlbmNtcy5saWJyYXJ5L2xpYi8iIGRlc3Rp
bmF0aW9uPSJXRUItSU5GL2xpYi8iLz4KPiAgICAgICAgICA8L2V4cG9ydHBvaW50cz4KPiAgICAg
ICAgICA8cmVzb3VyY2VzLz4KPiAgICAgICAgICA8cGFyYW1ldGVycz4KPiAgICAgICAgICAgICAg
PHBhcmFtIG5hbWU9InNwcmluZy5hdXRvLmluaXQiPnRydWU8L3BhcmFtPgo+ICAgICAgICAgIDwv
cGFyYW1ldGVycz4KPiAgICAgIDwvbW9kdWxlPgo+Cj4gICAgICA8ZmlsZXMvPgo+IDwvZXhwb3J0
Pgo+Cj4gSSB0cmllZCB0byBpbXBvcnQgdGhlIHppcCBpbiB0aGUgbW9kdWxlcyBhcHAsIG1vZHVs
ZSBpcyBjcmVhdGVkIGJ1dCBjbGFzc2VzIGFuZCBsaWIgYXJlIG5vdCBjb3BpZWQgaW4gV0VCLUlO
RiBmb2xkZXJzIGFuZCBpbiB0aGUgZXhwbG9yZXIgYXBwIHRoZXJlIGFyZSBubyDCqyBjb20ub3Bl
bmNtcy5saWJyYXJ5IMK7IGVudHJpZXMgaW4gL3N5c3RlbS9tb2R1bGVzCj4KPiBUaGFua3MgZm9y
IHlvdXIgaGVscC4KPgo+IFJlZ2FyZHMsCj4KPiBMYXVyZW50Cj4KPj4gTGUgNyBhb8O7dCAyMDI1
IMOgIDE2OjQxLCBsYXVyZW50LmRydWFydCB2aWEgb3BlbmNtcy1kZXYgPG9wZW5jbXMtZGV2QG9w
ZW5jbXMub3JnPiBhIMOpY3JpdCA6Cj4+Cj4+IEhlbGxvLAo+Pgo+PiBJ4oCZbSBzdGlsbCB0ZXN0
aW5nIE9wZW5DTVMgYW5kIGkgd3JvdGUgYSB2ZXJ5IHNtYWxsIGxpYnJhcnksIGEgc3ByaW5nIGJh
c2VkIGxpYnJhcnkuIEkgd2FudCB0byB1c2UgdGhlIGJlYW5zIGluIG15IGpzcCBzbyBpIHdyb3Rl
IDIgY2xhc3NlczoKPj4KPj4gU3ByaW5nQmVhblV0aWxzIDoKPj4KPj4gcHVibGljIGNsYXNzIFNw
cmluZ0JlYW5VdGlscyB7Cj4+Cj4+ICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgTE9HID0g
Q21zTG9nLmdldExvZyhTcHJpbmdCZWFuVXRpbHMuY2xhc3MpOwo+Pgo+PiAgICAgLyoqCj4+ICAg
ICAgKiBSw6ljdXDDqHJlIGxlIHNlcnZpY2UgdXRpbGlzYXRldXIKPj4gICAgICAqIEV4ZW1wbGUg
ZCd1dGlsaXNhdGlvbiBkYW5zIHVuZSBwYWdlIEpTUCA6Cj4+ICAgICAgKiA8JQo+PiAgICAgICog
ICBVc2VyU2VydmljZSB1c2VyU2VydmljZSA9IFNwcmluZ0JlYW5VdGlscy5nZXRVc2VyU2Vydmlj
ZSgpOwo+PiAgICAgICogICBMaXN0PFVzZXI+IHVzZXJzID0gdXNlclNlcnZpY2UuZ2V0QWxsQWN0
aXZlVXNlcnMoKTsKPj4gICAgICAqICU+Cj4+ICAgICAgKi8KPj4gICAgIHB1YmxpYyBzdGF0aWMg
VXNlclNlcnZpY2UgZ2V0VXNlclNlcnZpY2UoKSB7Cj4+ICAgICAgICAgdHJ5IHsKPj4gICAgICAg
ICAgICAgcmV0dXJuIExpYnJhcnlJbml0aWFsaXplci5nZXRCZWFuKFVzZXJTZXJ2aWNlLmNsYXNz
KTsKPj4gICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewo+PiAgICAgICAgICAgICBMT0cu
ZXJyb3IoIkVycmV1ciBsb3JzIGRlIGxhIHLDqWN1cMOpcmF0aW9uIGR1IFVzZXJTZXJ2aWNlIiwg
ZSk7Cj4+ICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTZXJ2aWNlIHV0
aWxpc2F0ZXVyIG5vbiBkaXNwb25pYmxlIiwgZSk7Cj4+ICAgICAgICAgfQo+PiAgICAgfQo+Pgo+
PiAgICAgLyoqCj4+ICAgICAgKiBNw6l0aG9kZSBnw6luw6lyaXF1ZSBwb3VyIHLDqWN1cMOpcmVy
IG4naW1wb3J0ZSBxdWVsIHNlcnZpY2UKPj4gICAgICAqIEV4ZW1wbGUgOgo+PiAgICAgICogTXlT
ZXJ2aWNlIHNlcnZpY2UgPSBTcHJpbmdCZWFuVXRpbHMuZ2V0U2VydmljZShNeVNlcnZpY2UuY2xh
c3MpOwo+PiAgICAgICovCj4+ICAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGdldFNlcnZpY2UoQ2xh
c3M8VD4gc2VydmljZUNsYXNzKSB7Cj4+ICAgICAgICAgdHJ5IHsKPj4gICAgICAgICAgICAgcmV0
dXJuIExpYnJhcnlJbml0aWFsaXplci5nZXRCZWFuKHNlcnZpY2VDbGFzcyk7Cj4+ICAgICAgICAg
fSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKPj4gICAgICAgICAgICAgTE9HLmVycm9yKCJFcnJldXIg
bG9ycyBkZSBsYSByw6ljdXDDqXJhdGlvbiBkdSBzZXJ2aWNlOiAiICsgc2VydmljZUNsYXNzLmdl
dFNpbXBsZU5hbWUoKSwgZSk7Cj4+ICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0
aW9uKCJTZXJ2aWNlIG5vbiBkaXNwb25pYmxlOiAiICsgc2VydmljZUNsYXNzLmdldFNpbXBsZU5h
bWUoKSwgZSk7Cj4+ICAgICAgICAgfQo+PiAgICAgfQo+Pgo+PiAgICAgLyoqCj4+ICAgICAgKiBS
w6ljdXDDqHJlIHVuIGJlYW4gcGFyIHNvbiBub20KPj4gICAgICAqIEV4ZW1wbGUgOgo+PiAgICAg
ICogT2JqZWN0IGJlYW4gPSBTcHJpbmdCZWFuVXRpbHMuZ2V0QmVhbigidXNlclNlcnZpY2UiKTsK
Pj4gICAgICAqLwo+PiAgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0QmVhbihTdHJpbmcgYmVh
bk5hbWUpIHsKPj4gICAgICAgICB0cnkgewo+PiAgICAgICAgICAgICByZXR1cm4gTGlicmFyeUlu
aXRpYWxpemVyLmdldEJlYW4oYmVhbk5hbWUpOwo+PiAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlv
biBlKSB7Cj4+ICAgICAgICAgICAgIExPRy5lcnJvcigiRXJyZXVyIGxvcnMgZGUgbGEgcsOpY3Vw
w6lyYXRpb24gZHUgYmVhbjogIiArIGJlYW5OYW1lLCBlKTsKPj4gICAgICAgICAgICAgdGhyb3cg
bmV3IFJ1bnRpbWVFeGNlcHRpb24oIkJlYW4gbm9uIGRpc3BvbmlibGU6ICIgKyBiZWFuTmFtZSwg
ZSk7Cj4+ICAgICAgICAgfQo+PiAgICAgfQo+Pgo+PiAgICAgLyoqCj4+ICAgICAgKiBWw6lyaWZp
ZSBzaSBsZSBjb250ZXh0ZSBTcHJpbmcgZXN0IGRpc3BvbmlibGUKPj4gICAgICAqLwo+PiAgICAg
cHVibGljIHN0YXRpYyBib29sZWFuIGlzQXZhaWxhYmxlKCkgewo+PiAgICAgICAgIHJldHVybiBM
aWJyYXJ5SW5pdGlhbGl6ZXIuaXNTcHJpbmdDb250ZXh0QXZhaWxhYmxlKCk7Cj4+ICAgICB9Cj4+
Cj4+ICAgICAvKioKPj4gICAgICAqIE3DqXRob2RlIHV0aWxpdGFpcmUgcG91ciB2w6lyaWZpZXIg
bGEgZGlzcG9uaWJpbGl0w6kgYXZhbnQgdXRpbGlzYXRpb24KPj4gICAgICAqLwo+PiAgICAgcHVi
bGljIHN0YXRpYyB2b2lkIGVuc3VyZUF2YWlsYWJsZSgpIHsKPj4gICAgICAgICBpZiAoIWlzQXZh
aWxhYmxlKCkpIHsKPj4gICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlv
bigKPj4gICAgICAgICAgICAgICAgICAgICAiTGUgY29udGV4dGUgU3ByaW5nIG4nZXN0IHBhcyBk
aXNwb25pYmxlLiAiICsKPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWw6lyaWZpZXog
cXVlIGxlIG1vZHVsZSBlc3QgY29ycmVjdGVtZW50IGluaXRpYWxpc8OpLiIKPj4gICAgICAgICAg
ICAgKTsKPj4gICAgICAgICB9Cj4+ICAgICB9Cj4+IH0KPj4KPj4gd2l0aCBzdGF0aWMgbWV0aG9k
IGdldFVzZXJTZXJ2aWNlKCkgSSBjYW4gY2FsbCB0aGUgdXNlclNlcnZpY2UgYmVhbi4gTm8gcHJv
YmxlbSB3aXRoIGl0Lgo+Pgo+PiBBbmQgc2Vjb25kIGNsYXNzIExpYnJhcnlJbml0aWFsaXplciB3
aWNoIG11c3QgaW5pdGlhbGlzZSB0aGUgc3ByaW5nIGNvbnRleHQgYW5kIGNvbmZpZ3VyZSBpdDoK
Pj4KPj4gcHVibGljIGNsYXNzIExpYnJhcnlJbml0aWFsaXplciBleHRlbmRzIEFfQ21zTW9kdWxl
QWN0aW9uIGltcGxlbWVudHMgSV9DbXNFdmVudExpc3RlbmVyIHsKPj4KPj4gICAgIHByaXZhdGUg
c3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfTkFNRSA9ICJvcGVuY21zLXNwcmluZy1saWJyYXJ5
IjsKPj4gICAgIHByaXZhdGUgc3RhdGljIEFwcGxpY2F0aW9uQ29udGV4dCBzcHJpbmdDb250ZXh0
Owo+PiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcu
TG9nIExPRyA9IENtc0xvZy5nZXRMb2coTGlicmFyeUluaXRpYWxpemVyLmNsYXNzKTsKPj4KPj4g
ICAgIC8qKgo+PiAgICAgICogSW5pdGlhbGlzYXRpb24gZHUgbW9kdWxlCj4+ICAgICAgKi8KPj4g
ICAgIEBPdmVycmlkZQo+PiAgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShvcmcub3BlbmNtcy5m
aWxlLkNtc09iamVjdCBhZG1pbkNtcywKPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Jn
Lm9wZW5jbXMuY29uZmlndXJhdGlvbi5DbXNDb25maWd1cmF0aW9uTWFuYWdlciBjb25maWd1cmF0
aW9uTWFuYWdlciwKPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ21zTW9kdWxlIG1vZHVs
ZSkgewo+Pgo+PiAgICAgICAgIExPRy5pbmZvKCJJbml0aWFsaXNhdGlvbiBkZSBsYSBsaWJyYWly
aWUgU3ByaW5nIGNsYXNzaXF1ZSBwb3VyIE9wZW5DTVMiKTsKPj4KPj4gICAgICAgICB0cnkgewo+
PiAgICAgICAgICAgICAvLyBDb25maWd1cmF0aW9uIGRlcyBwcm9wcmnDqXTDqXMgc3lzdMOobWUK
Pj4gICAgICAgICAgICAgY29uZmlndXJlU3lzdGVtUHJvcGVydGllcygpOwo+Pgo+PiAgICAgICAg
ICAgICAvLyBDcsOpYXRpb24gZHUgY29udGV4dGUgU3ByaW5nIENMQVNTSVFVRQo+PiAgICAgICAg
ICAgICBBbm5vdGF0aW9uQ29uZmlnQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQgPSBuZXcgQW5u
b3RhdGlvbkNvbmZpZ0FwcGxpY2F0aW9uQ29udGV4dCgpOwo+PiAgICAgICAgICAgICBjb250ZXh0
LnJlZ2lzdGVyKGNvbS5vcGVuY21zLmxpYnJhcnkuY29uZmlnLkxpYnJhcnlDb25maWd1cmF0aW9u
LmNsYXNzKTsKPj4gICAgICAgICAgICAgY29udGV4dC5yZWZyZXNoKCk7Cj4+Cj4+ICAgICAgICAg
ICAgIHNwcmluZ0NvbnRleHQgPSBjb250ZXh0Owo+Pgo+PiAgICAgICAgICAgICAvLyBFbnJlZ2lz
dHJlbWVudCBkZXMgbGlzdGVuZXJzIE9wZW5DTVMKPj4gICAgICAgICAgICAgT3BlbkNtcy5hZGRD
bXNFdmVudExpc3RlbmVyKHRoaXMpOwo+Pgo+PiAgICAgICAgICAgICBMT0cuaW5mbygiTGlicmFp
cmllIFNwcmluZyBjbGFzc2lxdWUgaW5pdGlhbGlzw6llIGF2ZWMgc3VjY8OocyIpOwo+Pgo+PiAg
ICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Cj4+ICAgICAgICAgICAgIExPRy5lcnJvcigi
RXJyZXVyIGxvcnMgZGUgbCdpbml0aWFsaXNhdGlvbiBkZSBsYSBsaWJyYWlyaWUgU3ByaW5nIiwg
ZSk7Cj4+ICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJJbXBvc3NpYmxl
IGQnaW5pdGlhbGlzZXIgbGEgbGlicmFpcmllIFNwcmluZyIsIGUpOwo+PiAgICAgICAgIH0KPj4g
ICAgIH0KPj4KPj4gICAgIC8qKgo+PiAgICAgICogQXJyw6p0IGR1IG1vZHVsZQo+PiAgICAgICov
Cj4+ICAgICBAT3ZlcnJpZGUKPj4gICAgIHB1YmxpYyB2b2lkIHNodXREb3duKENtc01vZHVsZSBt
b2R1bGUpIHsKPj4gICAgICAgICBMT0cuaW5mbygiQXJyw6p0IGRlIGxhIGxpYnJhaXJpZSBTcHJp
bmcgY2xhc3NpcXVlIik7Cj4+Cj4+ICAgICAgICAgaWYgKHNwcmluZ0NvbnRleHQgIT0gbnVsbCkg
ewo+PiAgICAgICAgICAgICB0cnkgewo+PiAgICAgICAgICAgICAgICAgaWYgKHNwcmluZ0NvbnRl
eHQgaW5zdGFuY2VvZiBBbm5vdGF0aW9uQ29uZmlnQXBwbGljYXRpb25Db250ZXh0KSB7Cj4+ICAg
ICAgICAgICAgICAgICAgICAgKChBbm5vdGF0aW9uQ29uZmlnQXBwbGljYXRpb25Db250ZXh0KSBz
cHJpbmdDb250ZXh0KS5jbG9zZSgpOwo+PiAgICAgICAgICAgICAgICAgfQo+PiAgICAgICAgICAg
ICAgICAgTE9HLmluZm8oIkNvbnRleHRlIFNwcmluZyBmZXJtw6kgYXZlYyBzdWNjw6hzIik7Cj4+
ICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Cj4+ICAgICAgICAgICAgICAgICBM
T0cuZXJyb3IoIkVycmV1ciBsb3JzIGRlIGwnYXJyw6p0IGR1IGNvbnRleHRlIFNwcmluZyIsIGUp
Owo+PiAgICAgICAgICAgICB9IGZpbmFsbHkgewo+PiAgICAgICAgICAgICAgICAgc3ByaW5nQ29u
dGV4dCA9IG51bGw7Cj4+ICAgICAgICAgICAgIH0KPj4gICAgICAgICB9Cj4+ICAgICB9Cj4+Cj4+
ICAgICAvKioKPj4gICAgICAqIEdlc3Rpb24gZGVzIMOpdsOpbmVtZW50cyBPcGVuQ01TCj4+ICAg
ICAgKi8KPj4gICAgIEBPdmVycmlkZQo+PiAgICAgcHVibGljIHZvaWQgY21zRXZlbnQoQ21zRXZl
bnQgZXZlbnQpIHsKPj4gICAgICAgICBzd2l0Y2ggKGV2ZW50LmdldFR5cGUoKSkgewo+PiAgICAg
ICAgICAgICBjYXNlIElfQ21zRXZlbnRMaXN0ZW5lci5FVkVOVF9QVUJMSVNIX1BST0pFQ1Q6Cj4+
ICAgICAgICAgICAgICAgICBMT0cuZGVidWcoIsOJdsOpbmVtZW50IGRlIHB1YmxpY2F0aW9uIGTD
qXRlY3TDqSIpOwo+PiAgICAgICAgICAgICAgICAgYnJlYWs7Cj4+ICAgICAgICAgICAgIGNhc2Ug
SV9DbXNFdmVudExpc3RlbmVyLkVWRU5UX0NMRUFSX0NBQ0hFUzoKPj4gICAgICAgICAgICAgICAg
IExPRy5kZWJ1Zygiw4l2w6luZW1lbnQgZGUgbmV0dG95YWdlIGRlcyBjYWNoZXMgZMOpdGVjdMOp
Iik7Cj4+ICAgICAgICAgICAgICAgICBicmVhazsKPj4gICAgICAgICB9Cj4+ICAgICB9Cj4+Cj4+
ICAgICAvKioKPj4gICAgICAqIENvbmZpZ3VyYXRpb24gZGVzIHByb3ByacOpdMOpcyBzeXN0w6ht
ZQo+PiAgICAgICovCj4+ICAgICBwcml2YXRlIHZvaWQgY29uZmlndXJlU3lzdGVtUHJvcGVydGll
cygpIHsKPj4gICAgICAgICAvLyBDb25maWd1cmF0aW9uIGRlIGJhc2UgZGUgZG9ubsOpZXMgKHZh
bGV1cnMgcGFyIGTDqWZhdXQpCj4+ICAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9wZXJ0eSgic3By
aW5nLmRhdGFzb3VyY2UudXJsIikgPT0gbnVsbCkgewo+PiAgICAgICAgICAgICBTeXN0ZW0uc2V0
UHJvcGVydHkoInNwcmluZy5kYXRhc291cmNlLnVybCIsICJqZGJjOnBvc3RncmVzcWw6Ly9wb3N0
Z3Jlcy1kYjo1NDMyL2xpYmRiIik7Cj4+ICAgICAgICAgfQo+PiAgICAgICAgIGlmIChTeXN0ZW0u
Z2V0UHJvcGVydHkoInNwcmluZy5kYXRhc291cmNlLnVzZXJuYW1lIikgPT0gbnVsbCkgewo+PiAg
ICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInNwcmluZy5kYXRhc291cmNlLnVzZXJuYW1l
IiwgImFwcHVzZXIiKTsKPj4gICAgICAgICB9Cj4+ICAgICAgICAgaWYgKFN5c3RlbS5nZXRQcm9w
ZXJ0eSgic3ByaW5nLmRhdGFzb3VyY2UucGFzc3dvcmQiKSA9PSBudWxsKSB7Cj4+ICAgICAgICAg
ICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgic3ByaW5nLmRhdGFzb3VyY2UucGFzc3dvcmQiLCAiYXBw
cGFzc3dvcmQiKTsKPj4gICAgICAgICB9Cj4+Cj4+ICAgICAgICAgTE9HLmluZm8oIlByb3ByacOp
dMOpcyBzeXN0w6htZSBjb25maWd1csOpZXMiKTsKPj4gICAgIH0KPj4KPj4gICAgIC8qKgo+PiAg
ICAgICogQWNjw6hzIGF1eCBiZWFucyBTcHJpbmcKPj4gICAgICAqLwo+PiAgICAgcHVibGljIHN0
YXRpYyA8VD4gVCBnZXRCZWFuKENsYXNzPFQ+IGJlYW5DbGFzcykgewo+PiAgICAgICAgIGlmIChz
cHJpbmdDb250ZXh0ID09IG51bGwpIHsKPj4gICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxT
dGF0ZUV4Y2VwdGlvbigiTGUgY29udGV4dGUgU3ByaW5nIG4nZXN0IHBhcyBpbml0aWFsaXPDqSIp
Owo+PiAgICAgICAgIH0KPj4gICAgICAgICByZXR1cm4gc3ByaW5nQ29udGV4dC5nZXRCZWFuKGJl
YW5DbGFzcyk7Cj4+ICAgICB9Cj4+Cj4+ICAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRCZWFu
KFN0cmluZyBiZWFuTmFtZSkgewo+PiAgICAgICAgIGlmIChzcHJpbmdDb250ZXh0ID09IG51bGwp
IHsKPj4gICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTGUgY29u
dGV4dGUgU3ByaW5nIG4nZXN0IHBhcyBpbml0aWFsaXPDqSIpOwo+PiAgICAgICAgIH0KPj4gICAg
ICAgICByZXR1cm4gc3ByaW5nQ29udGV4dC5nZXRCZWFuKGJlYW5OYW1lKTsKPj4gICAgIH0KPj4K
Pj4gICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NwcmluZ0NvbnRleHRBdmFpbGFibGUoKSB7
Cj4+ICAgICAgICAgcmV0dXJuIHNwcmluZ0NvbnRleHQgIT0gbnVsbDsKPj4gICAgIH0KPj4gfQo+
Pgo+PiBJZiBpIGJ1aWxkIHRoaXMgbGliIGFzIGEgamFyIGFuZCBwdXQgaXQgaW4gV0VCLUlORi9s
aWIgaSBjYW4gYWNjZXNzIG15IGJlYW5zIGluIGpzcCBwYWdlcyBidXQgaSBtdXN0IGRvIHRoaXMg
Y2FsbCBmaXJzdDoKPj4KPj4gICAgICAgICAgICBjb20ub3BlbmNtcy5saWJyYXJ5LmludGVncmF0
aW9uLkxpYnJhcnlJbml0aWFsaXplciBpbml0aWFsaXplciA9Cj4+ICAgICAgICAgICAgICAgICBu
ZXcgY29tLm9wZW5jbXMubGlicmFyeS5pbnRlZ3JhdGlvbi5MaWJyYXJ5SW5pdGlhbGl6ZXIoKTsK
Pj4KPj4gICAgICAgICAgICAgLy8gQXBwZWwgZGlyZWN0IGRlIGluaXRpYWxpemUgYXZlYyBkZXMg
cGFyYW3DqHRyZXMgbnVsbHMgKG5vdHJlIHZlcnNpb24gc2ltcGxpZmnDqWUgbGVzIGfDqHJlKQo+
PiAgICAgICAgICAgICBpbml0aWFsaXplci5pbml0aWFsaXplKG51bGwsIG51bGwsIG51bGwpOwo+
PiBhZnRlciB0aGF0IG15IGNvbnRleHQgaXMgaW5pdGlhbGl6ZWQgYW5kIGNvbmZpZ3VyZWQgYW5k
IG15IGpzcCBhcmUgcnVubmluZyBmaW5lLiBCdXQgdGhlIHdheSB0byBhdXRvbWF0aWMgbG9hZGlu
ZyBvZiBteSBjb250ZXh0IHNlZW1zIHRvIGJlIGFuIG9wZW5jbXMgbW9kdWxlLgo+Pgo+PiBJIHRy
aWVkIHRvIGFkYXB0IG15IGxpYiB3aXRoIG9wZW5jbXMtbW9kdWxlLnhtbCwgbWFuaWZlc3QueG1s
LC4uLiBidXQgbm90aGluZyB3b3JrczogYXQgc3RhcnR1cCBjb20ub3BlbmNtcy5saWJyYXJ5Lmlu
dGVncmF0aW9uLkxpYnJhcnlJbml0aWFsaXplciBpcyBub3QgZm91bmQgYnkgb3BlbmNtcy4KPj4K
Pj4gQ2FuIHlvdSBoZWxwIG1lPwo+PiBEb2VzIGl0IGV4aXN0IGEgdHV0b3JpYWwgb3IgaG93LXRv
Pwo+Pgo+PiBBbSBpIHdyb25nIHdpdGggcHVibGljIGNsYXNzIExpYnJhcnlJbml0aWFsaXplciBl
eHRlbmRzIEFfQ21zTW9kdWxlQWN0aW9uIGltcGxlbWVudHMgSV9DbXNFdmVudExpc3RlbmVyID8K
Pj4KPj4gVGhhbmsgeW91Cj4+Cj4+IEtpbmQgcmVnYXJkcywKPj4KPj4gTGF1cmVudAo+Pgo+Pgo+
PiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwo+PiBUaGlz
IG1haWwgaXMgc2VudCB0byB5b3UgZnJvbSB0aGUgb3BlbmNtcy1kZXYgbWFpbGluZyBsaXN0Cj4+
IFRvIGNoYW5nZSB5b3VyIGxpc3Qgb3B0aW9ucywgb3IgdG8gdW5zdWJzY3JpYmUgZnJvbSB0aGUg
bGlzdCwgcGxlYXNlIHZpc2l0Cj4+IGh0dHBzOi8vbGlzdHMub3BlbmNtcy5vcmcvbWFpbG1hbi9s
aXN0aW5mby9vcGVuY21zLWRldgo+Pgo+Pgo+Pgo+Cj4gX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX18KPiBUaGlzIG1haWwgaXMgc2VudCB0byB5b3UgZnJvbSB0
aGUgb3BlbmNtcy1kZXYgbWFpbGluZyBsaXN0Cj4gVG8gY2hhbmdlIHlvdXIgbGlzdCBvcHRpb25z
LCBvciB0byB1bnN1YnNjcmliZSBmcm9tIHRoZSBsaXN0LCBwbGVhc2UgdmlzaXQKPiBodHRwczov
L2xpc3RzLm9wZW5jbXMub3JnL21haWxtYW4vbGlzdGluZm8vb3BlbmNtcy1kZXYKPgo+Cj4KLS0g
Ck1pY2hhZWwgRW1tZXJpY2gKICAKQWxrYWNvbiBTb2Z0d2FyZSBHbWJIICYgQ28uIEtHIC0gVGhl
IE9wZW5DbXMgRXhwZXJ0cwpodHRwOi8vd3d3LmFsa2Fjb24uY29tCmh0dHA6Ly93d3cub3BlbmNt
cy5vcmcKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fClRo
aXMgbWFpbCBpcyBzZW50IHRvIHlvdSBmcm9tIHRoZSBvcGVuY21zLWRldiBtYWlsaW5nIGxpc3QK
VG8gY2hhbmdlIHlvdXIgbGlzdCBvcHRpb25zLCBvciB0byB1bnN1YnNjcmliZSBmcm9tIHRoZSBs
aXN0LCBwbGVhc2UgdmlzaXQKaHR0cHM6Ly9saXN0cy5vcGVuY21zLm9yZy9tYWlsbWFuL2xpc3Rp
bmZvL29wZW5jbXMtZGV2CgoKCg==