Patch to Village (Oracle Clobs)

Scott Miller <[email protected]> Tue, 8 Apr 2003 22:03:54 -0400
Newsgroups gmane.comp.db.village.devel
Message-ID <[email protected]>
This message is in MIME format.

---MOQ104985383480af299144db9aa6c652b7f003a56238
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit

Hi,

I have been trying to use Torque as a database abstraction layer for an Oracle 
database containing CLOBs.  However, Village does not properly retrieve or set 
CLOB values with Oracle.  This is because Village uses the ResultSet.getString 
method to read the CLOB value from the database and the 
PreparedStatement.setString method to set the CLOB value.  This approach will 
work for many JDBC drivers because they support the handling of CLOBs as 
Strings.  However, the Oracle JDBC driver does not support this conversition.  
I have modified Value.java to properly handle Oracle clobs.  This file is 
attached to this email.  I am not sure of the proper avenue to submit a patch 
for Village, so I am hoping that someone can advise me on the best course of 
action.  The rest of this email is devoted to a brief explanation of the code 
change.

Because Oracle's JDBC driver does not support the CLOB to String conversion, 
you need to actually use the java.sql.Clob interface, which is implemented by 
oracle.sql.CLOB.  You can refer to the Clob object by the java.sql.Clob 
interface during data retrieval, because there is no need to instantiate an 
instance of the Class.  The constructor of the Value class was modified to 
handle retrieval by simply adding a Types.CLOB case to the switch statement.  

Unfortunately, you need to create an instance of the clob object when you want 
to set the CLOB data, so you must refer to the oracle.sql.CLOB class.  
However, in order to not rely on the Oracle JDBC driver at compile time, I 
have writted the code to use reflection to create an instance of 
oracle.sql.CLOB and set the value.  This code is located in the 
setPreparedStatementValue method of the Value class.

Any advice on how to submit this update would be appreciated.

Thanks,

Scott




---MOQ104985383480af299144db9aa6c652b7f003a56238
Content-Type: application/octet-stream; name="Value.java"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="Value.java"

LyoKICogVGhlIFdvcmtpbmctRG9ncy5jb20gTGljZW5zZSwgVmVyc2lvbiAxLjEKICoKICogQ29w
eXJpZ2h0IChjKSAxOTk5IFdvcmtpbmctRG9ncy5jb20uICBBbGwgcmlnaHRzIHJlc2VydmVkLgog
KgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqCiAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4gCiAqCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgogKiAgICB0aGUgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCiAqICAgIGRp
c3RyaWJ1dGlvbi4KICoKICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQg
d2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmCiAqICAgIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBm
b2xsb3dpbmcgYWNrbm93bGVnZW1lbnQ6ICAKICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRl
cyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIAogKiAgICAgICAgV29ya2luZy1Eb2dzLmNvbSA8
aHR0cDovL3d3dy5Xb3JraW5nLURvZ3MuY29tLz4uIgogKiAgICBBbHRlcm5hdGVseSwgdGhpcyBh
Y2tub3dsZWdlbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCiAqICAgIGlm
IGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZ2VtZW50cyBub3JtYWxseSBh
cHBlYXIuCiAqCiAqIDQuIFRoZSBuYW1lcyAiV29ya2luZy1Eb2dzLmNvbSIgYW5kICJWaWxsYWdl
IiBtdXN0IG5vdCBiZSB1c2VkIHRvIAogKiAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMg
ZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCAKICogICAgcHJpb3Igd3JpdHRlbiBw
ZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCAKICogICAg
am9uQGxhdGNoa2V5LmNvbS4KICoKICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29m
dHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgCiAqICAgICJXb3JraW5nLURvZ3MuY29tIiBub3IgbWF5
ICJWaWxsYWdlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZXMgCiAqICAgIHdpdGhvdXQgcHJpb3Igd3Jp
dHRlbiBwZXJtaXNzaW9uIG9mIFdvcmtpbmctRG9ncy5jb20uCiAqCiAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKICogV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMKICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUKICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUg
U09GVFdBUkUgRk9VTkRBVElPTiBPUgogKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgog
KiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5ECiAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAogKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKICogT0YgVEhFIFVTRSBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNV
Q0ggREFNQUdFLgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQogKgogKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9m
IHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQogKiBpbmRpdmlkdWFscyBvbiBi
ZWhhbGYgb2YgdGhlIFdvcmtpbmctRG9ncy5jb20uICBGb3IgbW9yZQogKiBpbmZvcm1hdGlvbiBv
biB0aGUgV29ya2luZy1Eb2dzLmNvbSwgcGxlYXNlIHNlZQogKiA8aHR0cDovL3d3dy5Xb3JraW5n
LURvZ3MuY29tLz4uCiAqLwoKcGFja2FnZSBjb20ud29ya2luZ2RvZ3MudmlsbGFnZTsKCmltcG9y
dCBqYXZhLmxhbmcuQ2xhc3M7CmltcG9ydCBqYXZhLmxhbmcuQ2xhc3NOb3RGb3VuZEV4Y2VwdGlv
bjsKaW1wb3J0IGphdmEubGFuZy5JbGxlZ2FsQWNjZXNzRXJyb3I7CmltcG9ydCBqYXZhLmxhbmcu
Tm9TdWNoRmllbGRFeGNlcHRpb247CmltcG9ydCBqYXZhLmxhbmcuTm9TdWNoTWV0aG9kRXhjZXB0
aW9uOwppbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CmltcG9ydCBqYXZhLmxhbmcucmVm
bGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwppbXBvcnQgamF2YS5sYW5nLnJlZmxlY3Qu
TWV0aG9kOwppbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CmltcG9ydCBqYXZhLmlvLklPRXhj
ZXB0aW9uOwppbXBvcnQgamF2YS5pby5Xcml0ZXI7CmltcG9ydCBqYXZhLnNxbC5DbG9iOwppbXBv
cnQgamF2YS5zcWwuUHJlcGFyZWRTdGF0ZW1lbnQ7CmltcG9ydCBqYXZhLnNxbC5SZXN1bHRTZXQ7
CmltcG9ydCBqYXZhLnNxbC5TUUxFeGNlcHRpb247CmltcG9ydCBqYXZhLnNxbC5UaW1lOwppbXBv
cnQgamF2YS5zcWwuVGltZXN0YW1wOwppbXBvcnQgamF2YS5zcWwuVHlwZXM7CmltcG9ydCBqYXZh
LnV0aWwuQ2FsZW5kYXI7CgovKioKQSBWYWx1ZSByZXByZXNlbnRzIGEgc2luZ2xlIGNlbGwgaW4g
YSBkYXRhYmFzZSB0YWJsZS4gSW4gb3RoZXIgd29yZHMsIGl0IGlzIHRoZSAKY3Jvc3MgYmV0d2Vl
biBhIHJvdyBhbmQgY29sdW1uIGFuZCBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gaGVsZCB0aGVy
ZS4KCkBhdXRob3IgSm9uIFMuIFN0ZXZlbnMgPEEgSFJFRj0ibWFpbHRvOmpvbkBsYXRjaGtleS5j
b20iPmpvbkBsYXRjaGtleS5jb208L0E+CkB2ZXJzaW9uICRSZXZpc2lvbjogMS4xOCAkCiovCnB1
YmxpYyBjbGFzcyBWYWx1ZQp7CiAgICAvKiogdGhlIG9iamVjdCB0aGF0IGlzIHN0b3JlZCBpbiB0
aGlzIG9iamVjdCAqLwogICAgcHJpdmF0ZSBPYmplY3QgdmFsdWVPYmplY3Q7CiAgICAvKiogdGhl
IGNvbHVtbiBudW1iZXIgdGhhdCB0aGlzIG9iamVjdCBjYW1lIGZyb20gKi8KICAgIHByaXZhdGUg
aW50IGNvbHVtbk51bWJlcjsKICAgIC8qKiB3aGF0IHNxbCB0eXBlIG9mIG9iamVjdCBpcyB0aGlz
PyAqLwogICAgcHJpdmF0ZSBpbnQgdHlwZTsKICAgIC8qKiBOYW1lIG9mIHRoZSBvcmFjbGUgZHJp
dmVyIC0tIHVzZWQgdG8gc3VwcG9ydCBPcmFjbGUgY2xvYnMgYXMgYSBzcGVjaWFsIGNhc2UgKi8K
ICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUkFDTEVfRFJJVkVSX05BTUUgPSAiT3Jh
Y2xlIEpEQkMgZHJpdmVyIjsKCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBuZXcgVmFsdWUgb2Jq
ZWN0IGJhc2VkIG9uIHRoZSBSZXN1bHRTZXQsIGNvbHVtbk51bWJlciBhbmQgdHlwZQogICAgICoK
ICAgICAqIEBwYXJhbSAgIHJzCiAgICAgKiBAcGFyYW0gICBjb2x1bW5OdW1iZXIKICAgICAqIEBw
YXJhbSAgIHR5cGUKICAgICAqIEBleGNlcHRpb24gICBTUUxFeGNlcHRpb24KICAgICAqLwogICAg
cHVibGljIFZhbHVlIChSZXN1bHRTZXQgcnMsIGludCBjb2x1bW5OdW1iZXIsIGludCB0eXBlKSAK
ICAgICAgICB0aHJvd3MgU1FMRXhjZXB0aW9uCiAgICB7CiAgICAgICAgdGhpcy5jb2x1bW5OdW1i
ZXIgPSBjb2x1bW5OdW1iZXI7CiAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICAgICB0aGlz
LnZhbHVlT2JqZWN0ID0gbnVsbDsKCiAgICAgICAgaWYgKHJzID09IG51bGwpCiAgICAgICAgICAg
IHJldHVybjsKCiAgICAgICAgc3dpdGNoICh0eXBlKCkpCiAgICAgICAgewogICAgICAgICAgICBj
YXNlIFR5cGVzLkJJVDoKICAgICAgICAgICAgICAgIFN0cmluZyB0bXAgPSBycy5nZXRTdHJpbmcg
KGNvbHVtbk51bWJlcik7CiAgICAgICAgICAgICAgICBpZiAodG1wID09IG51bGwpCiAgICAgICAg
ICAgICAgICAgICAgdmFsdWVPYmplY3QgPSBuZXcgQm9vbGVhbiAoZmFsc2UpOwogICAgICAgICAg
ICAgICAgZWxzZSBpZiAoaXNUcnVlKHRtcCkpCiAgICAgICAgICAgICAgICAgICAgdmFsdWVPYmpl
Y3QgPSBuZXcgQm9vbGVhbiAodHJ1ZSk7CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAg
ICAgICAgICAgdmFsdWVPYmplY3QgPSBuZXcgQm9vbGVhbiAoZmFsc2UpOwogICAgICAgICAgICAg
ICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGVzLlRJTllJTlQ6CiAgICAgICAgICAgICAg
ICB2YWx1ZU9iamVjdCA9IG5ldyBCeXRlIChycy5nZXRCeXRlIChjb2x1bW5OdW1iZXIpKTsKICAg
ICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBUeXBlcy5CSUdJTlQ6CiAgICAg
ICAgICAgICAgICB2YWx1ZU9iamVjdCA9IG5ldyBMb25nIChycy5nZXRMb25nIChjb2x1bW5OdW1i
ZXIpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBUeXBlcy5TTUFM
TElOVDoKICAgICAgICAgICAgICAgIHZhbHVlT2JqZWN0ID0gbmV3IFNob3J0IChycy5nZXRTaG9y
dCAoY29sdW1uTnVtYmVyKSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNh
c2UgVHlwZXMuSU5URUdFUjoKICAgICAgICAgICAgICAgIHZhbHVlT2JqZWN0ID0gbmV3IEludGVn
ZXIgKHJzLmdldEludCAoY29sdW1uTnVtYmVyKSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAg
ICAgICAgICAgIGNhc2UgVHlwZXMuUkVBTDoKICAgICAgICAgICAgICAgIHZhbHVlT2JqZWN0ID0g
bmV3IEZsb2F0IChycy5nZXRGbG9hdCAoY29sdW1uTnVtYmVyKSk7CiAgICAgICAgICAgICAgICBi
cmVhazsKCiAgICAgICAgICAgIGNhc2UgVHlwZXMuRkxPQVQ6CiAgICAgICAgICAgIGNhc2UgVHlw
ZXMuRE9VQkxFOgogICAgICAgICAgICAgICAgdmFsdWVPYmplY3QgPSBuZXcgRG91YmxlIChycy5n
ZXREb3VibGUgKGNvbHVtbk51bWJlcikpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAg
ICAgICBjYXNlIFR5cGVzLk5VTUVSSUM6CiAgICAgICAgICAgIGNhc2UgVHlwZXMuREVDSU1BTDoK
ICAgICAgICAgICAgICAgIFN0cmluZyBudW1iZXIgPSBycy5nZXRTdHJpbmcgKGNvbHVtbk51bWJl
cik7CiAgICAgICAgICAgICAgICBpZiAoIG51bWJlciA9PSBudWxsICkgCiAgICAgICAgICAgICAg
ICB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWVPYmplY3QgPSBudWxsOwogICAgICAgICAgICAg
ICAgfQogICAgICAgICAgICAgICAgZWxzZSAKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAg
ICAgICAgICB2YWx1ZU9iamVjdCA9IG5ldyBCaWdEZWNpbWFsIChudW1iZXIpOwogICAgICAgICAg
ICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGVzLkxP
TkdWQVJCSU5BUlk6CiAgICAgICAgICAgIGNhc2UgVHlwZXMuVkFSQklOQVJZOgogICAgICAgICAg
ICBjYXNlIFR5cGVzLkJJTkFSWToKICAgICAgICAgICAgY2FzZSBUeXBlcy5CTE9COgogICAgICAg
ICAgICAgICAgdmFsdWVPYmplY3QgPSBycy5nZXRCeXRlcyAoY29sdW1uTnVtYmVyKTsKICAgICAg
ICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGNhc2UgVHlwZXMu
Q0xPQjoKICAgICAgICAgICAgCS8vIHJlYWQgYW55IENMT0JzIGFzIHN0cmluZ3MKICAgICAgICAg
ICAgCUNsb2IgY2xvYiA9IHJzLmdldENsb2IoY29sdW1uTnVtYmVyKTsKICAgICAgICAgICAgCWlm
KCBjbG9iID09IG51bGwgKQogICAgICAgICAgICAJewogICAgICAgICAgICAJCXZhbHVlT2JqZWN0
ID0gbnVsbDsKICAgICAgICAgICAgCX0KICAgICAgICAgICAgCWVsc2UKICAgICAgICAgICAgCXsK
ICAgICAgICAgICAgCQlsb25nIHJlbWFpbmluZ0xlbmd0aCA9IGNsb2IubGVuZ3RoKCk7CiAgICAg
ICAgICAgIAkJbG9uZyBjdXJyZW50UG9zaXRpb24gPSAxOwogICAgICAgICAgICAJCQogICAgICAg
ICAgICAJCVN0cmluZyB2YWx1ZVN0cmluZyA9ICIiOwogICAgICAgICAgICAJCXdoaWxlKCByZW1h
aW5pbmdMZW5ndGggPiAwICkKICAgICAgICAgICAgCQl7CiAgICAgICAgICAgIAkJCWludCByZWFk
TGVuZ3RoID0gMDsKICAgICAgICAgICAgCQkJaWYoIHJlbWFpbmluZ0xlbmd0aCA+IEludGVnZXIu
TUFYX1ZBTFVFICkKICAgICAgICAgICAgCQkJewogICAgICAgICAgICAJCQkJLy8gdGhlcmUgd2ls
bCBiZSBtb3JlIGl0ZXJhdGlvbnMKICAgICAgICAgICAgCQkJCXJlYWRMZW5ndGggPSBJbnRlZ2Vy
Lk1BWF9WQUxVRTsKICAgICAgICAgICAgCQkJfQogICAgICAgICAgICAJCQllbHNlCiAgICAgICAg
ICAgIAkJCXsKICAgICAgICAgICAgCQkJCS8vIHRoaXMgaXMgdGhlIGxhc3QgaXRlcmF0aW9uCiAg
ICAgICAgICAgIAkJCQlyZWFkTGVuZ3RoID0gKGludClyZW1haW5pbmdMZW5ndGg7CiAgICAgICAg
ICAgIAkJCX0KICAgICAgICAgICAgCQkJCiAgICAgICAgICAgIAkJCXZhbHVlU3RyaW5nICs9IGNs
b2IuZ2V0U3ViU3RyaW5nKCBjdXJyZW50UG9zaXRpb24sIHJlYWRMZW5ndGggKTsKICAgICAgICAg
ICAgCQkJY3VycmVudFBvc2l0aW9uICs9IHJlYWRMZW5ndGg7CiAgICAgICAgICAgIAkJCXJlbWFp
bmluZ0xlbmd0aCAtPSByZWFkTGVuZ3RoOyAgICAgICAgICAgIAkJCQogICAgICAgICAgICAJCX0K
ICAgICAgICAgICAgCQl2YWx1ZU9iamVjdCA9IHZhbHVlU3RyaW5nOwogICAgICAgICAgICAJfQog
ICAgICAgICAgICAJYnJlYWs7CiAgICAgICAgICAgIAkKICAgICAgICAgICAgY2FzZSBUeXBlcy5M
T05HVkFSQ0hBUjoKICAgICAgICAgICAgY2FzZSBUeXBlcy5DSEFSOgogICAgICAgICAgICBjYXNl
IFR5cGVzLlZBUkNIQVI6CiAgICAgICAgICAgIGNhc2UgVHlwZXMuT1RIRVI6CiAgICAgICAgICAg
ICAgICB2YWx1ZU9iamVjdCA9IHJzLmdldFN0cmluZyAoY29sdW1uTnVtYmVyKTsKICAgICAgICAg
ICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBUeXBlcy5EQVRFOgogICAgICAgICAgICAg
ICAgdmFsdWVPYmplY3QgPSBycy5nZXREYXRlIChjb2x1bW5OdW1iZXIpOwogICAgICAgICAgICAg
ICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGVzLlRJTUU6CiAgICAgICAgICAgICAgICB2
YWx1ZU9iamVjdCA9IHJzLmdldFRpbWUgKGNvbHVtbk51bWJlcik7CiAgICAgICAgICAgICAgICBi
cmVhazsKCiAgICAgICAgICAgIGNhc2UgVHlwZXMuVElNRVNUQU1QOgogICAgICAgICAgICAgICAg
dmFsdWVPYmplY3QgPSBycy5nZXRUaW1lc3RhbXAgKGNvbHVtbk51bWJlcik7CiAgICAgICAgICAg
ICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgVHlwZXMuTlVMTDoKICAgICAgICAgICAgICAg
IHZhbHVlT2JqZWN0ID0gbnVsbDsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAg
ZGVmYXVsdDoKICAgICAgICAgICAgICAgIHZhbHVlT2JqZWN0ID0gcnMuZ2V0U3RyaW5nIChjb2x1
bW5OdW1iZXIpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZiAo
IHJzLndhc051bGwoKSApCiAgICAgICAgICAgIHZhbHVlT2JqZWN0ID0gbnVsbDsKICAgICAgICAg
ICAgCiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qKgogICAgICAqIFNldHMgdGhlIHZhbHVl
IG9mIHRoaXMgb2JqZWN0CiAgICAgICoKICAgICAgKiBAcGFyYW0gICB2YWx1ZQogICAgICAqLwog
ICAgdm9pZCBzZXRWYWx1ZSAoT2JqZWN0IHZhbHVlKQogICAgewogICAgICAgIHRoaXMudmFsdWVP
YmplY3QgPSB2YWx1ZTsKICAgIH0KCiAgICAvKioKICAgICAgKiBHZXRzIHRoZSBvYmplY3QgZnJv
bSB0aGlzIFZhbHVlCiAgICAgICoKICAgICAgKiBAcmV0dXJuICAgICB0aGUgb2JqZWN0IGZyb20g
dGhpcyBWYWx1ZQogICAgICAqLwogICAgT2JqZWN0IGdldFZhbHVlICgpCiAgICB7CiAgICAgICAg
cmV0dXJuIHRoaXMudmFsdWVPYmplY3Q7CiAgICB9CgogICAgLyoqCiAgICAgICogVGhpcyBpcyB1
c2VkIGluIFJlY29yZCBpbiBvcmRlciB0byBkbyBhIHNhdmVXaXRoSW5zZXJ0L1VwZGF0ZS9EZWxl
dGUKICAgICAgKgogICAgICAqIEBwYXJhbSAgIHN0bXQKICAgICAgKiBAcGFyYW0gICBzdG10TnVt
YmVyCiAgICAgICogQGV4Y2VwdGlvbiAgIERhdGFTZXRFeGNlcHRpb24KICAgICAgKiBAZXhjZXB0
aW9uICAgU1FMRXhjZXB0aW9uCiAgICAgICovCiAgICB2b2lkIHNldFByZXBhcmVkU3RhdGVtZW50
VmFsdWUgKFByZXBhcmVkU3RhdGVtZW50IHN0bXQsCiAgICAgICAgICAgIGludCBzdG10TnVtYmVy
KSB0aHJvd3MgRGF0YVNldEV4Y2VwdGlvbiwgU1FMRXhjZXB0aW9uCiAgICB7CiAgICAgICAgaWYg
KGlzTnVsbCAoKSkKICAgICAgICB7CiAgICAgICAgICAgIHN0bXQuc2V0TnVsbCAoc3RtdE51bWJl
ciwgdHlwZSAoKSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHN3aXRj
aCAodHlwZSgpKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSBUeXBlcy5CSVQ6CiAgICAgICAg
ICAgICAgICBzdG10LnNldEJvb2xlYW4gKHN0bXROdW1iZXIsIHRoaXMuYXNCb29sZWFuKCkpOwog
ICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGVzLlRJTllJTlQ6CiAg
ICAgICAgICAgICAgICBzdG10LnNldEJ5dGUgKHN0bXROdW1iZXIsIHRoaXMuYXNCeXRlKCkpOwog
ICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGVzLkJJR0lOVDoKICAg
ICAgICAgICAgICAgIHN0bXQuc2V0TG9uZyAoc3RtdE51bWJlciwgdGhpcy5hc0xvbmcoKSk7CiAg
ICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgVHlwZXMuU01BTExJTlQ6CiAg
ICAgICAgICAgICAgICBzdG10LnNldFNob3J0IChzdG10TnVtYmVyLCB0aGlzLmFzU2hvcnQoKSk7
CiAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgVHlwZXMuSU5URUdFUjoK
ICAgICAgICAgICAgICAgIHN0bXQuc2V0SW50IChzdG10TnVtYmVyLCB0aGlzLmFzSW50KCkpOwog
ICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGVzLlJFQUw6CiAgICAg
ICAgICAgICAgICBzdG10LnNldEZsb2F0IChzdG10TnVtYmVyLCB0aGlzLmFzRmxvYXQoKSk7CiAg
ICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIGNhc2UgVHlwZXMuRkxPQVQ6CiAgICAg
ICAgICAgIGNhc2UgVHlwZXMuRE9VQkxFOgogICAgICAgICAgICAgICAgc3RtdC5zZXREb3VibGUg
KHN0bXROdW1iZXIsIHRoaXMuYXNEb3VibGUoKSk7CiAgICAgICAgICAgICAgICBicmVhazsKCiAg
ICAgICAgICAgIGNhc2UgVHlwZXMuTlVNRVJJQzoKICAgICAgICAgICAgY2FzZSBUeXBlcy5ERUNJ
TUFMOgogICAgICAgICAgICAgICAgc3RtdC5zZXRCaWdEZWNpbWFsIChzdG10TnVtYmVyLCB0aGlz
LmFzQmlnRGVjaW1hbCgpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgY2Fz
ZSBUeXBlcy5MT05HVkFSQklOQVJZOgogICAgICAgICAgICBjYXNlIFR5cGVzLlZBUkJJTkFSWToK
ICAgICAgICAgICAgY2FzZSBUeXBlcy5CSU5BUlk6CiAgICAgICAgICAgIGNhc2UgVHlwZXMuQkxP
QjoKICAgICAgICAgICAgICAgIHN0bXQuc2V0Qnl0ZXMgKHN0bXROdW1iZXIsIHRoaXMuYXNCeXRl
cygpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwoKCQkJY2FzZSBUeXBlcy5DTE9COgoJCQkJaWYo
IE9SQUNMRV9EUklWRVJfTkFNRS5lcXVhbHMoIHN0bXQuZ2V0Q29ubmVjdGlvbigpLmdldE1ldGFE
YXRhKCkuZ2V0RHJpdmVyTmFtZSgpICkgKQoJCQkJewoJCQkJCXRyeQoJCQkJCXsKCQkJCQkJLy8g
c3VwcG9ydCBvcmFjbGUgY2xvYnMgd2l0aG91dCByZXF1aXJpbmcgb3JhY2xlIGxpYnJhcmllcwoJ
CQkJCQkvLyBhdCBjb21waWxlIHRpbWUKCQkJCQkJLy8gTm90ZSB0aGlzIGFzc3VtZXMgdGhhdCBp
ZiB5b3UgYXJlIHVzaW5nIHRoZSBPcmFjbGUgRHJpdmVyLgoJCQkJCQkvLyB0aGVuIHlvdSBoYXZl
IGFjY2VzcyB0byB0aGUgb3JhY2xlLnNxbC5DTE9CIGNsYXNzCgkJCQkJCQoJCQkJCQkvLyBGaXJz
dCBnZXQgdGhlIG9yYWNsZSBjbG9iIGNsYXNzCgkJCQkJCUNsYXNzIG9yYWNsZUNsb2JDbGFzcyA9
IENsYXNzLmZvck5hbWUoIm9yYWNsZS5zcWwuQ0xPQiIpOwoJCQkJCQkKCQkJCQkJLy8gbm93IGdl
dCB0aGUgc3RhdGljIGZhY3RvcnkgbWV0aG9kCgkJCQkJCUNsYXNzIHBhcnR5cGVzW10gPSBuZXcg
Q2xhc3NbM107CgkJCQkJCXBhcnR5cGVzWzBdID0gQ2xhc3MuZm9yTmFtZSgiamF2YS5zcWwuQ29u
bmVjdGlvbiIpOwoJCQkJCQlwYXJ0eXBlc1sxXSA9IEJvb2xlYW4uVFlQRTsKCQkJCQkJcGFydHlw
ZXNbMl0gPSBJbnRlZ2VyLlRZUEU7CQkJCQoJCQkJCQlNZXRob2QgY3JlYXRlVGVtcG9yYXJ5TWV0
aG9kID0gb3JhY2xlQ2xvYkNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCAiY3JlYXRlVGVtcG9yYXJ5
IiwgcGFydHlwZXMgKTsKCQkJCQkJCgkJCQkJCS8vIG5vdyBnZXQgcmVhZHkgdG8gY2FsbCB0aGUg
ZmFjdG9yeSBtZXRob2QKCQkJCQkJRmllbGQgZHVyYXRpb25TZXNzaW9uRmllbGQgPSBvcmFjbGVD
bG9iQ2xhc3MuZ2V0RmllbGQoICJEVVJBVElPTl9TRVNTSU9OIiApOwoJCQkJCQlPYmplY3QgYXJn
bGlzdFtdID0gbmV3IE9iamVjdFszXTsKCQkJCQkJYXJnbGlzdFswXSA9IHN0bXQuZ2V0Q29ubmVj
dGlvbigpOwoJCQkJCQlhcmdsaXN0WzFdID0gQm9vbGVhbi5UUlVFOwoJCQkJCQlhcmdsaXN0WzJd
ID0gZHVyYXRpb25TZXNzaW9uRmllbGQuZ2V0KG51bGwpOyAvL251bGwgaXMgdmFsaWQgYmVjYXVz
ZSBvZiBzdGF0aWMgZmllbGQKCQkJCQkJCgkJCQkJCS8vIENyZWF0ZSBvdXIgQ0xPQgoJCQkJCQlP
YmplY3QgdGVtcENsb2IgPSBjcmVhdGVUZW1wb3JhcnlNZXRob2QuaW52b2tlKCBudWxsLCBhcmds
aXN0ICk7IC8vbnVsbCBpcyB2YWxpZCBiZWNhdXNlIG9mIHN0YXRpYyBtZXRob2QKCQkJCQkJCgkJ
CQkJCS8vIGdldCB0aGUgb3BlbiBtZXRob2QKCQkJCQkJcGFydHlwZXMgPSBuZXcgQ2xhc3NbMV07
CgkJCQkJCXBhcnR5cGVzWzBdID0gSW50ZWdlci5UWVBFOwoJCQkJCQlNZXRob2Qgb3Blbk1ldGhv
ZCA9IG9yYWNsZUNsb2JDbGFzcy5nZXREZWNsYXJlZE1ldGhvZCggIm9wZW4iLCBwYXJ0eXBlcyAp
OwoJCQkJCQkJCQkJCQkKCQkJCQkJLy8gcHJlcGFyZSB0byBjYWxsIHRoZSBtZXRob2QKCQkJCQkJ
RmllbGQgbW9kZVJlYWRXcml0ZUZpZWxkID0gb3JhY2xlQ2xvYkNsYXNzLmdldEZpZWxkKCAiTU9E
RV9SRUFEV1JJVEUiICk7CgkJCQkJCWFyZ2xpc3QgPSBuZXcgT2JqZWN0WzFdOwoJCQkJCQlhcmds
aXN0WzBdID0gbW9kZVJlYWRXcml0ZUZpZWxkLmdldChudWxsKTsgLy9udWxsIGlzIHZhbGlkIGJl
Y2F1c2Ugb2Ygc3RhdGljIGZpZWxkCgkJCQkJCQoJCQkJCQkvLyBjYWxsIG9wZW4oQ0xPQi5NT0RF
X1JFQURXUklURSk7CgkJCQkJCW9wZW5NZXRob2QuaW52b2tlKCB0ZW1wQ2xvYiwgYXJnbGlzdCAp
OwoJCQkJCQkKCQkJCQkJLy8gZ2V0IHRoZSBnZXRDaGFyYWN0ZXJPdXRwdXRTdHJlYW0gbWV0aG9k
CgkJCQkJCU1ldGhvZCBnZXRDaGFyYWN0ZXJPdXRwdXRTdHJlYW1NZXRob2QgPSBvcmFjbGVDbG9i
Q2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoICJnZXRDaGFyYWN0ZXJPdXRwdXRTdHJlYW0iLCBudWxs
ICk7CgkJCQkJCQoJCQkJCQkvLyBjYWxsIHRoZSBnZXRDaGFyYWN0ZXJPdXRwaXRTdHJlYW0gbWV0
aG9kCgkJCQkJCVdyaXRlciB0ZW1wQ2xvYldyaXRlciA9IChXcml0ZXIpIGdldENoYXJhY3Rlck91
dHB1dFN0cmVhbU1ldGhvZC5pbnZva2UoIHRlbXBDbG9iLCBudWxsICk7CgkJCQkJCQoJCQkJCQkv
LyB3cml0ZSB0aGUgc3RyaW5nIHRvIHRoZSBjbG9iCgkJCQkJCXRlbXBDbG9iV3JpdGVyLndyaXRl
KHRoaXMuYXNTdHJpbmcoKSk7IAoJCQkJCQl0ZW1wQ2xvYldyaXRlci5mbHVzaCgpOwoJCQkJCQl0
ZW1wQ2xvYldyaXRlci5jbG9zZSgpOyAKCQkJCQkJCgkJCQkJCS8vIGdldCB0aGUgY2xvc2UgbWV0
aG9kCgkJCQkJCU1ldGhvZCBjbG9zZU1ldGhvZCA9IG9yYWNsZUNsb2JDbGFzcy5nZXREZWNsYXJl
ZE1ldGhvZCggImNsb3NlIiwgbnVsbCApOwoJCQkJCQkKCQkJCQkJLy8gY2FsbCB0aGUgY2xvc2Ug
bWV0aG9kCgkJCQkJCWNsb3NlTWV0aG9kLmludm9rZSggdGVtcENsb2IsIG51bGwgKTsKCQkJCQkJ
CgkJCQkJCS8vIGFkZCB0aGUgY2xvYiB0byB0aGUgc3RhdGVtZW50CgkJCQkJCXN0bXQuc2V0Q2xv
Yiggc3RtdE51bWJlciwgKENsb2IpdGVtcENsb2IgKTsKCQkJCQl9CgkJCQkJY2F0Y2goIENsYXNz
Tm90Rm91bmRFeGNlcHRpb24gZSApCgkJCQkJewoJCQkJCQkvLyBjb3VsZCBub3QgZmluZCB0aGUg
Y2xhc3Mgd2l0aCByZWZsZWN0aW9uCgkJCQkJCXRocm93IG5ldyBEYXRhU2V0RXhjZXB0aW9uKCJV
bmFibGUgdG8gZmluZCBhIHJlcXVpcmVkIGNsYXNzLlxuIiArIGUuZ2V0TWVzc2FnZSgpKTsKCQkJ
CQl9CgkJCQkJY2F0Y2goIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlICkKCQkJCQl7CgkJCQkJCS8v
IGNvdWxkIG5vdCBmaW5kIHRoZSBtZXRobyB3aXRoIHJlZmxlY3Rpb24KCQkJCQkJdGhyb3cgbmV3
IERhdGFTZXRFeGNlcHRpb24oIlVuYWJsZSB0byBmaW5kIGEgcmVxdWlyZWQgbWV0aG9kLlxuIiAr
IGUuZ2V0TWVzc2FnZSgpKTsKCQkJCQl9CgkJCQkJY2F0Y2goIE5vU3VjaEZpZWxkRXhjZXB0aW9u
IGUgKQoJCQkJCXsKCQkJCQkJLy8gY291bGQgbm90IGZpbmQgdGhlIGZpZWxkIHdpdGggcmVmbGVj
dGlvbgoJCQkJCQl0aHJvdyBuZXcgRGF0YVNldEV4Y2VwdGlvbigiVW5hYmxlIHRvIGZpbmQgYSBy
ZXF1aXJlZCBmaWVsZC5cbiIgKyBlLmdldE1lc3NhZ2UoKSk7CgkJCQkJfQoJCQkJCWNhdGNoKCBJ
bGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUgKQoJCQkJCXsKCQkJCQkJdGhyb3cgbmV3IERhdGFTZXRF
eGNlcHRpb24oIlVuYWJsZSB0byBhY2Nlc3MgYSByZXF1aXJlZCBtZXRob2Qgb3IgZmllbGQuXG4i
ICsgZS5nZXRNZXNzYWdlKCkpOwoJCQkJCX0KCQkJCQljYXRjaCggSW52b2NhdGlvblRhcmdldEV4
Y2VwdGlvbiBlICkKCQkJCQl7CgkJCQkJCXRocm93IG5ldyBEYXRhU2V0RXhjZXB0aW9uKGUuZ2V0
TWVzc2FnZSgpKTsKCQkJCQl9CgkJCQkJY2F0Y2goIElPRXhjZXB0aW9uIGUgKQoJCQkJCXsKCQkJ
CQkJdGhyb3cgbmV3IERhdGFTZXRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOyAKCQkJCQl9CgkJ
CQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJc3RtdC5zZXRTdHJpbmcoIHN0bXROdW1iZXIsIHRoaXMu
YXNTdHJpbmcoKSApOwoJCQkJfQoJCQkJCgkJCQlicmVhazsKCQkJCQogICAgICAgICAgICBjYXNl
IFR5cGVzLkxPTkdWQVJDSEFSOgogICAgICAgICAgICBjYXNlIFR5cGVzLkNIQVI6CiAgICAgICAg
ICAgIGNhc2UgVHlwZXMuVkFSQ0hBUjoKICAgICAgICAgICAgY2FzZSBUeXBlcy5PVEhFUjoKICAg
ICAgICAgICAgICAgIHN0bXQuc2V0U3RyaW5nIChzdG10TnVtYmVyLCB0aGlzLmFzU3RyaW5nKCkp
OwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGVzLkRBVEU6CiAg
ICAgICAgICAgICAgICBzdG10LnNldERhdGUgKHN0bXROdW1iZXIsIHRoaXMuYXNEYXRlKCkpOwog
ICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGVzLlRJTUU6CiAgICAg
ICAgICAgICAgICBzdG10LnNldFRpbWUgKHN0bXROdW1iZXIsIHRoaXMuYXNUaW1lKCkpOwogICAg
ICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGVzLlRJTUVTVEFNUDoKICAg
ICAgICAgICAgICAgIHN0bXQuc2V0VGltZXN0YW1wIChzdG10TnVtYmVyLCB0aGlzLmFzVGltZXN0
YW1wKCkpOwogICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFR5cGVzLk5V
TEw6CiAgICAgICAgICAgICAgICBzdG10LnNldE51bGwgKHN0bXROdW1iZXIsIDApOwogICAgICAg
ICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgc3Rt
dC5zZXRTdHJpbmcgKHN0bXROdW1iZXIsIHRoaXMuYXNTdHJpbmcoKSk7CiAgICAgICAgICAgICAg
ICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgc3Ry
aW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0CiAgICAgICoKICAgICAgKiBAcmV0dXJu
ICAgICBhIHN0cmluZwogICAgICAqLwogICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCiAgICB7
CiAgICAgICAgcmV0dXJuIHRoaXMuYXNTdHJpbmcoKTsKICAgIH0KCiAgICAvKioKICAgICAgKiBS
ZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QKICAgICAgKgog
ICAgICAqIEByZXR1cm4gICAgIGEgc3RyaW5nCiAgICAgICovCiAgICBwdWJsaWMgU3RyaW5nIGFz
U3RyaW5nKCkKICAgIHsKICAgICAgICBpZiAoaXNOdWxsKCkpCiAgICAgICAgICAgIHJldHVybiBu
dWxsOwogICAgICAgIGVsc2UgaWYgKGlzU3RyaW5nKCkpCiAgICAgICAgICAgIHJldHVybiAoU3Ry
aW5nKSB2YWx1ZU9iamVjdDsKICAgICAgICBlbHNlIGlmIChpc0J5dGVzKCkpCiAgICAgICAgICAg
IHJldHVybiBuZXcgU3RyaW5nICgoYnl0ZVtdKSB2YWx1ZU9iamVjdCk7CiAgICAgICAgZWxzZQog
ICAgICAgICAgICByZXR1cm4gdmFsdWVPYmplY3QudG9TdHJpbmcoKTsKICAgIH0KCiAgICAvKioK
ICAgICAgKiBHZXQgdGhlIHZhbHVlIGFzIGEgQmlnRGVjaW1hbAogICAgICAqCiAgICAgICogQHJl
dHVybiAgICAgYSBCaWdEZWNpbWFsCiAgICAgICogQGV4Y2VwdGlvbiAgIERhdGFTZXRFeGNlcHRp
b24KICAgICAgKi8KICAgIHB1YmxpYyBCaWdEZWNpbWFsIGFzQmlnRGVjaW1hbCgpIHRocm93cyBE
YXRhU2V0RXhjZXB0aW9uCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICBp
ZiAoaXNOdWxsKCkpCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgZWxz
ZSBpZiAoaXNCaWdEZWNpbWFsKCkpCiAgICAgICAgICAgICAgICByZXR1cm4gKEJpZ0RlY2ltYWwp
IHZhbHVlT2JqZWN0OwogICAgICAgICAgICBlbHNlIGlmIChpc1N0cmluZygpIHx8IGlzRG91Ymxl
KCkgfHwgaXNGbG9hdCgpIHx8IGlzSW50KCkgfHwKICAgICAgICAgICAgICAgICAgICBpc0xvbmco
KSB8fCBpc1Nob3J0KCkgfHwgaXNCeXRlKCkgKQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBC
aWdEZWNpbWFsIChhc1N0cmluZygpKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAg
cmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKICAgICAg
ICB7CiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhU2V0RXhjZXB0aW9uKCJJbGxlZ2FsIGNvbnZl
cnNpb246ICIgKwogICAgICAgICAgICAgICAgICAgIGUudG9TdHJpbmcoKSk7CiAgICAgICAgfQog
ICAgfQoKICAgIC8qKgogICAgICAqIEdldCB0aGUgdmFsdWUgYXMgYSBCaWdEZWNpbWFsCiAgICAg
ICoKICAgICAgKiBAcmV0dXJuICAgICBhIEJpZ0RlY2ltYWwKICAgICAgKiBAZXhjZXB0aW9uICAg
RGF0YVNldEV4Y2VwdGlvbgogICAgICAqLwogICAgcHVibGljIEJpZ0RlY2ltYWwgYXNCaWdEZWNp
bWFsKGludCBzY2FsZSkgdGhyb3dzIERhdGFTZXRFeGNlcHRpb24KICAgIHsKICAgICAgICB0cnkK
ICAgICAgICB7CiAgICAgICAgICAgIGlmIChpc051bGwoKSkKICAgICAgICAgICAgICAgIHJldHVy
biBudWxsOwogICAgICAgICAgICBlbHNlIGlmIChpc0JpZ0RlY2ltYWwoKSkKICAgICAgICAgICAg
ICAgIHJldHVybiAoKEJpZ0RlY2ltYWwpIHZhbHVlT2JqZWN0KS5zZXRTY2FsZSAoc2NhbGUpOwog
ICAgICAgICAgICBlbHNlIGlmIChpc1N0cmluZygpIHx8IGlzRG91YmxlKCkgfHwgaXNGbG9hdCgp
IHx8IGlzSW50KCkgfHwKICAgICAgICAgICAgICAgICAgICBpc0xvbmcoKSB8fCBpc1Nob3J0KCkg
fHwgaXNCeXRlKCkgKQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCaWdEZWNpbWFsIChhc1N0
cmluZygpKS5zZXRTY2FsZSAoc2NhbGUpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAg
ICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQogICAg
ICAgIHsKICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFTZXRFeGNlcHRpb24oIkJhZCBjb252ZXJz
aW9uOiAiICsgZS50b1N0cmluZygpKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgICog
R2V0IHRoZSB2YWx1ZSBhcyBhIGFzQm9vbGVhbgogICAgICAqCiAgICAgICogQHJldHVybiAgICAg
YSBib29sZWFuCiAgICAgICogQGV4Y2VwdGlvbiAgIERhdGFTZXRFeGNlcHRpb24KICAgICAgKi8K
ICAgIHB1YmxpYyBib29sZWFuIGFzQm9vbGVhbigpIHRocm93cyBEYXRhU2V0RXhjZXB0aW9uCiAg
ICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNOdWxsKCkpCiAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIGVsc2UgaWYgKGlzQm9vbGVhbigp
KQogICAgICAgICAgICAgICAgcmV0dXJuICgoQm9vbGVhbikgdmFsdWVPYmplY3QpLmJvb2xlYW5W
YWx1ZSgpOwoKICAgICAgICAgICAgU3RyaW5nIGNoZWNrID0gYXNTdHJpbmcoKTsKICAgICAgICAg
ICAgaWYgKGNoZWNrID09IG51bGwpCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAg
ICAgICAgIGVsc2UgaWYgKGlzVHJ1ZShjaGVjaykpCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAg
IH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCiAgICAgICAgewogICAgICAgICAgICB0aHJv
dyBuZXcgRGF0YVNldEV4Y2VwdGlvbigiQmFkIGNvbnZlcnNpb246ICIgKyBlLnRvU3RyaW5nKCkp
OwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAgKiBHZXQgdGhlIHZhbHVlIGFzIGEgQm9v
bGVhbiBvYmplY3QKICAgICAgKgogICAgICAqIEByZXR1cm4gICAgIGEgQm9vbGVhbgogICAgICAq
IEBleGNlcHRpb24gICBEYXRhU2V0RXhjZXB0aW9uCiAgICAgICovCiAgICBwdWJsaWMgQm9vbGVh
biBhc0Jvb2xlYW5PYmooKSB0aHJvd3MgRGF0YVNldEV4Y2VwdGlvbgogICAgewogICAgICAgIHRy
eQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGlzTnVsbCgpKQogICAgICAgICAgICAgICAgcmV0
dXJuIG51bGw7CiAgICAgICAgICAgIGVsc2UgaWYgKGlzQm9vbGVhbigpKQogICAgICAgICAgICAg
ICAgcmV0dXJuIChCb29sZWFuKXZhbHVlT2JqZWN0OwoKICAgICAgICAgICAgU3RyaW5nIGNoZWNr
ID0gYXNTdHJpbmcoKTsKICAgICAgICAgICAgaWYgKGNoZWNrID09IG51bGwpCiAgICAgICAgICAg
ICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgZWxzZSBpZiAoaXNUcnVlKGNoZWNrKSkKICAg
ICAgICAgICAgICAgIHJldHVybiBCb29sZWFuLlRSVUU7CiAgICAgICAgICAgIGVsc2UKICAgICAg
ICAgICAgICAgIHJldHVybiBCb29sZWFuLkZBTFNFOwogICAgICAgIH0KICAgICAgICBjYXRjaCAo
RXhjZXB0aW9uIGUpCiAgICAgICAgewogICAgICAgICAgICB0aHJvdyBuZXcgRGF0YVNldEV4Y2Vw
dGlvbigiQmFkIGNvbnZlcnNpb246ICIgKyBlLnRvU3RyaW5nKCkpOwogICAgICAgIH0KICAgIH0K
CgogICAgLyoqCiAgICAgICogR2V0IHRoZSB2YWx1ZSBhcyBhIGFzSW50CiAgICAgICoKICAgICAg
KiBAcmV0dXJuICAgICBhbiBpbnQKICAgICAgKiBAZXhjZXB0aW9uICAgRGF0YVNldEV4Y2VwdGlv
bgogICAgICAqLwogICAgcHVibGljIGludCBhc0ludCgpIHRocm93cyBEYXRhU2V0RXhjZXB0aW9u
CiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNOdWxsKCkpCiAg
ICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgZWxzZSBpZiAoaXNJbnQoKSkKICAg
ICAgICAgICAgICAgIHJldHVybiAoKEludGVnZXIpIHZhbHVlT2JqZWN0KS5pbnRWYWx1ZSgpOwog
ICAgICAgICAgICBlbHNlIGlmIChpc1N0cmluZygpKQogICAgICAgICAgICAgICAgcmV0dXJuIElu
dGVnZXIudmFsdWVPZigoU3RyaW5nKSB2YWx1ZU9iamVjdCkuaW50VmFsdWUoKTsKICAgICAgICAg
ICAgZWxzZSBpZiAoaXNMb25nKCkpCiAgICAgICAgICAgICAgICByZXR1cm4gKChMb25nKSB2YWx1
ZU9iamVjdCkuaW50VmFsdWUoKTsKICAgICAgICAgICAgZWxzZSBpZiAoaXNEb3VibGUoKSkKICAg
ICAgICAgICAgICAgIHJldHVybiAoKERvdWJsZSkgdmFsdWVPYmplY3QpLmludFZhbHVlKCk7CiAg
ICAgICAgICAgIGVsc2UgaWYgKGlzRmxvYXQoKSkKICAgICAgICAgICAgICAgIHJldHVybiAoKEZs
b2F0KSB2YWx1ZU9iamVjdCkuaW50VmFsdWUoKTsKICAgICAgICAgICAgZWxzZSBpZiAoaXNCaWdE
ZWNpbWFsKCkpCiAgICAgICAgICAgICAgICByZXR1cm4gKChCaWdEZWNpbWFsKSB2YWx1ZU9iamVj
dCkuaW50VmFsdWUoKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIElu
dGVnZXIudmFsdWVPZihhc1N0cmluZygpKS5pbnRWYWx1ZSgpOwogICAgICAgIH0KICAgICAgICBj
YXRjaCAoRXhjZXB0aW9uIGUpCiAgICAgICAgewogICAgICAgICAgICB0aHJvdyBuZXcgRGF0YVNl
dEV4Y2VwdGlvbigiQmFkIGNvbnZlcnNpb246ICIgKyBlLnRvU3RyaW5nKCkpOwogICAgICAgIH0K
ICAgIH0KCiAgICAvKioKICAgICAgKiBHZXQgdGhlIHZhbHVlIGFzIGEgSW50ZWdlciBPamJlY3QK
ICAgICAgKgogICAgICAqIEByZXR1cm4gICAgIGFuIEludGVnZXIKICAgICAgKiBAZXhjZXB0aW9u
ICAgRGF0YVNldEV4Y2VwdGlvbgogICAgICAqLwogICAgcHVibGljIEludGVnZXIgYXNJbnRlZ2Vy
T2JqKCkgdGhyb3dzIERhdGFTZXRFeGNlcHRpb24KICAgIHsKICAgICAgICB0cnkKICAgICAgICB7
CiAgICAgICAgICAgIGlmIChpc051bGwoKSkKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwog
ICAgICAgICAgICBlbHNlIGlmIChpc0ludCgpKQogICAgICAgICAgICAgICAgcmV0dXJuICgoSW50
ZWdlcikgdmFsdWVPYmplY3QpOwogICAgICAgICAgICBlbHNlIGlmIChpc1N0cmluZygpIHx8IGlz
RG91YmxlKCkgfHwgaXNGbG9hdCgpIHx8IGlzQmlnRGVjaW1hbCgpIHx8CiAgICAgICAgICAgICAg
ICAgICAgaXNMb25nKCkgfHwgaXNTaG9ydCgpIHx8IGlzQnl0ZSgpICkKICAgICAgICAgICAgICAg
IHJldHVybiBuZXcgSW50ZWdlciAoYXNTdHJpbmcoKSk7CiAgICAgICAgICAgIGVsc2UKICAgICAg
ICAgICAgICAgIHRocm93IG5ldyBEYXRhU2V0RXhjZXB0aW9uKCJJbnZhbGlkIHR5cGUgZm9yIElu
dGVnZXIiKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQogICAgICAgIHsK
ICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFTZXRFeGNlcHRpb24oIklsbGVnYWwgY29udmVyc2lv
bjogIiArCiAgICAgICAgICAgICAgICAgICAgZS50b1N0cmluZygpKTsKICAgICAgICB9CiAgICB9
CgogICAgLyoqCiAgICAgICogR2V0IHRoZSB2YWx1ZSBhcyBhIGFzQnl0ZQogICAgICAqCiAgICAg
ICogQHJldHVybiAgICAgYSBieXRlCiAgICAgICogQGV4Y2VwdGlvbiAgIERhdGFTZXRFeGNlcHRp
b24KICAgICAgKi8KICAgIHB1YmxpYyBieXRlIGFzQnl0ZSgpIHRocm93cyBEYXRhU2V0RXhjZXB0
aW9uCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNOdWxsKCkp
CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgZWxzZSBpZiAoaXNCeXRlKCkp
CiAgICAgICAgICAgICAgICByZXR1cm4gKChCeXRlKSB2YWx1ZU9iamVjdCkuYnl0ZVZhbHVlKCk7
CiAgICAgICAgICAgIGVsc2UgaWYgKGlzU3RyaW5nKCkpCiAgICAgICAgICAgICAgICByZXR1cm4g
SW50ZWdlci52YWx1ZU9mKChTdHJpbmcpIHZhbHVlT2JqZWN0KS5ieXRlVmFsdWUoKTsKICAgICAg
ICAgICAgZWxzZSBpZiAoaXNTaG9ydCgpKQogICAgICAgICAgICAgICAgcmV0dXJuICgoU2hvcnQp
IHZhbHVlT2JqZWN0KS5ieXRlVmFsdWUoKTsKICAgICAgICAgICAgZWxzZSBpZiAoaXNJbnQoKSkK
ICAgICAgICAgICAgICAgIHJldHVybiAoKEludGVnZXIpIHZhbHVlT2JqZWN0KS5ieXRlVmFsdWUo
KTsKICAgICAgICAgICAgZWxzZSBpZiAoaXNMb25nKCkpCiAgICAgICAgICAgICAgICByZXR1cm4g
KChMb25nKSB2YWx1ZU9iamVjdCkuYnl0ZVZhbHVlKCk7CiAgICAgICAgICAgIGVsc2UgaWYgKGlz
RG91YmxlKCkpCiAgICAgICAgICAgICAgICByZXR1cm4gKChEb3VibGUpIHZhbHVlT2JqZWN0KS5i
eXRlVmFsdWUoKTsKICAgICAgICAgICAgZWxzZSBpZiAoaXNGbG9hdCgpKQogICAgICAgICAgICAg
ICAgcmV0dXJuICgoRmxvYXQpIHZhbHVlT2JqZWN0KS5ieXRlVmFsdWUoKTsKICAgICAgICAgICAg
ZWxzZSBpZiAoaXNCaWdEZWNpbWFsKCkpCiAgICAgICAgICAgICAgICByZXR1cm4gKChCaWdEZWNp
bWFsKSB2YWx1ZU9iamVjdCkuYnl0ZVZhbHVlKCk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAg
ICAgICAgIHJldHVybiBJbnRlZ2VyLnZhbHVlT2YoYXNTdHJpbmcoKSkuYnl0ZVZhbHVlKCk7CiAg
ICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKICAgICAgICB7CiAgICAgICAgICAg
IHRocm93IG5ldyBEYXRhU2V0RXhjZXB0aW9uKCJCYWQgY29udmVyc2lvbjogIiArIGUudG9TdHJp
bmcoKSk7CiAgICAgICAgfQogICAgfQoKCiAgICAvKioKICAgICAgKiBHZXQgdGhlIHZhbHVlIGFz
IGEgQnl0ZSBPYmplY3QKICAgICAgKgogICAgICAqIEByZXR1cm4gICAgIGEgQnl0ZQogICAgICAq
IEBleGNlcHRpb24gICBEYXRhU2V0RXhjZXB0aW9uCiAgICAgICovCiAgICBwdWJsaWMgQnl0ZSBh
c0J5dGVPYmooKSB0aHJvd3MgRGF0YVNldEV4Y2VwdGlvbgogICAgewogICAgICAgIHRyeQogICAg
ICAgIHsKICAgICAgICAgICAgaWYgKGlzTnVsbCgpKQogICAgICAgICAgICAgICAgcmV0dXJuIG51
bGw7CiAgICAgICAgICAgIGVsc2UgaWYgKGlzQnl0ZSgpKQogICAgICAgICAgICAgICAgcmV0dXJu
ICgoQnl0ZSkgdmFsdWVPYmplY3QpOwogICAgICAgICAgICBlbHNlIGlmIChpc1N0cmluZygpIHx8
IGlzRG91YmxlKCkgfHwgaXNGbG9hdCgpIHx8IGlzSW50KCkgfHwKICAgICAgICAgICAgICAgICAg
ICBpc0xvbmcoKSB8fCBpc1Nob3J0KCkgfHwgaXNCaWdEZWNpbWFsKCkgKQogICAgICAgICAgICAg
ICAgcmV0dXJuIG5ldyBCeXRlKGFzU3RyaW5nKCkpOwogICAgICAgICAgICBlbHNlCiAgICAgICAg
ICAgICAgICB0aHJvdyBuZXcgRGF0YVNldEV4Y2VwdGlvbigiSW52YWxpZCB0eXBlIGZvciBCeXRl
Iik7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKICAgICAgICB7CiAgICAg
ICAgICAgIHRocm93IG5ldyBEYXRhU2V0RXhjZXB0aW9uKCJJbGxlZ2FsIGNvbnZlcnNpb246ICIg
KwogICAgICAgICAgICAgICAgICAgIGUudG9TdHJpbmcoKSk7CiAgICAgICAgfQogICAgfQoKCiAg
ICAvKioKICAgICAgKiBHZXQgdGhlIHZhbHVlIGFzIGEgYXNCeXRlcwogICAgICAqCiAgICAgICog
QHJldHVybiAgICAgYSBieXRlIGFycmF5CiAgICAgICogQGV4Y2VwdGlvbiAgIERhdGFTZXRFeGNl
cHRpb24KICAgICAgKi8KICAgIHB1YmxpYyBieXRlW10gYXNCeXRlcygpIHRocm93cyBEYXRhU2V0
RXhjZXB0aW9uCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNO
dWxsKCkpCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgZWxzZSBpZiAo
aXNCeXRlcygpKQogICAgICAgICAgICAgICAgcmV0dXJuIChieXRlW10pIHZhbHVlT2JqZWN0Owog
ICAgICAgICAgICBlbHNlIGlmIChpc1N0cmluZygpKQogICAgICAgICAgICAgICAgcmV0dXJuICgo
U3RyaW5nKSB2YWx1ZU9iamVjdCkuZ2V0Qnl0ZXMoKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2gg
KEV4Y2VwdGlvbiBlKQogICAgICAgIHsKICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFTZXRFeGNl
cHRpb24oIkJhZCBjb252ZXJzaW9uOiAiICsgZS50b1N0cmluZygpKTsKICAgICAgICB9CiAgICAg
ICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgICogR2V0IHRoZSB2YWx1ZSBhcyBh
IGFzU2hvcnQKICAgICAgKgogICAgICAqIEByZXR1cm4gICAgIGEgc2hvcnQKICAgICAgKiBAZXhj
ZXB0aW9uICAgRGF0YVNldEV4Y2VwdGlvbgogICAgICAqLwogICAgcHVibGljIHNob3J0IGFzU2hv
cnQoKSB0aHJvd3MgRGF0YVNldEV4Y2VwdGlvbgogICAgewogICAgICAgIHRyeQogICAgICAgIHsK
ICAgICAgICAgICAgaWYgKGlzTnVsbCgpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAg
ICAgICAgIGVsc2UgaWYgKGlzU2hvcnQoKSkKICAgICAgICAgICAgICAgIHJldHVybiAoKFNob3J0
KSB2YWx1ZU9iamVjdCkuc2hvcnRWYWx1ZSgpOwogICAgICAgICAgICBlbHNlIGlmIChpc1N0cmlu
ZygpKQogICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZigoU3RyaW5nKSB2YWx1
ZU9iamVjdCkuc2hvcnRWYWx1ZSgpOwogICAgICAgICAgICBlbHNlIGlmIChpc0ludCgpKQogICAg
ICAgICAgICAgICAgcmV0dXJuICgoSW50ZWdlcikgdmFsdWVPYmplY3QpLnNob3J0VmFsdWUoKTsK
ICAgICAgICAgICAgZWxzZSBpZiAoaXNMb25nKCkpCiAgICAgICAgICAgICAgICByZXR1cm4gKChM
b25nKSB2YWx1ZU9iamVjdCkuc2hvcnRWYWx1ZSgpOwogICAgICAgICAgICBlbHNlIGlmIChpc0Rv
dWJsZSgpKQogICAgICAgICAgICAgICAgcmV0dXJuICgoRG91YmxlKSB2YWx1ZU9iamVjdCkuc2hv
cnRWYWx1ZSgpOwogICAgICAgICAgICBlbHNlIGlmIChpc0Zsb2F0KCkpCiAgICAgICAgICAgICAg
ICByZXR1cm4gKChGbG9hdCkgdmFsdWVPYmplY3QpLnNob3J0VmFsdWUoKTsKICAgICAgICAgICAg
ZWxzZSBpZiAoaXNCaWdEZWNpbWFsKCkpCiAgICAgICAgICAgICAgICByZXR1cm4gKChCaWdEZWNp
bWFsKSB2YWx1ZU9iamVjdCkuc2hvcnRWYWx1ZSgpOwogICAgICAgICAgICBlbHNlCiAgICAgICAg
ICAgICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKGFzU3RyaW5nKCkpLnNob3J0VmFsdWUoKTsK
ICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQogICAgICAgIHsKICAgICAgICAg
ICAgdGhyb3cgbmV3IERhdGFTZXRFeGNlcHRpb24oIkJhZCBjb252ZXJzaW9uOiAiICsgZS50b1N0
cmluZygpKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgICogR2V0IHRoZSB2YWx1ZSBh
cyBhIFNob3J0IE9iamVjdAogICAgICAqCiAgICAgICogQHJldHVybiAgICAgYSBTaG9ydAogICAg
ICAqIEBleGNlcHRpb24gICBEYXRhU2V0RXhjZXB0aW9uCiAgICAgICovCiAgICBwdWJsaWMgU2hv
cnQgYXNTaG9ydE9iaigpIHRocm93cyBEYXRhU2V0RXhjZXB0aW9uCiAgICB7CiAgICAgICAgdHJ5
CiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNOdWxsKCkpCiAgICAgICAgICAgICAgICByZXR1
cm4gbnVsbDsKICAgICAgICAgICAgZWxzZSBpZiAoaXNTaG9ydCgpKQogICAgICAgICAgICAgICAg
cmV0dXJuICgoU2hvcnQpIHZhbHVlT2JqZWN0KTsKICAgICAgICAgICAgZWxzZSBpZiAoaXNTdHJp
bmcoKSB8fCBpc0RvdWJsZSgpIHx8IGlzRmxvYXQoKSB8fCBpc0ludCgpIHx8CiAgICAgICAgICAg
ICAgICAgICAgaXNMb25nKCkgfHwgaXNCaWdEZWNpbWFsKCkgfHwgaXNCeXRlKCkgKQogICAgICAg
ICAgICAgICAgcmV0dXJuIG5ldyBTaG9ydCAoYXNTdHJpbmcoKSk7CiAgICAgICAgICAgIGVsc2UK
ICAgICAgICAgICAgICAgIHRocm93IG5ldyBEYXRhU2V0RXhjZXB0aW9uKCJJbnZhbGlkIHR5cGUg
Zm9yIFNob3J0Iik7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKICAgICAg
ICB7CiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhU2V0RXhjZXB0aW9uKCJJbGxlZ2FsIGNvbnZl
cnNpb246ICIgKwogICAgICAgICAgICAgICAgICAgIGUudG9TdHJpbmcoKSk7CiAgICAgICAgfQog
ICAgfQoKICAgIC8qKgogICAgICAqIEdldCB0aGUgdmFsdWUgYXMgYSBhc0xvbmcKICAgICAgKgog
ICAgICAqIEByZXR1cm4gICAgIGEgbG9uZwogICAgICAqIEBleGNlcHRpb24gICBEYXRhU2V0RXhj
ZXB0aW9uCiAgICAgICovCiAgICBwdWJsaWMgbG9uZyBhc0xvbmcoKSB0aHJvd3MgRGF0YVNldEV4
Y2VwdGlvbgogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGlzTnVs
bCgpKQogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIGVsc2UgaWYgKGlzTG9u
ZygpKQogICAgICAgICAgICAgICAgcmV0dXJuICgoTG9uZykgdmFsdWVPYmplY3QpLmxvbmdWYWx1
ZSgpOwogICAgICAgICAgICBlbHNlIGlmIChpc1N0cmluZygpKQogICAgICAgICAgICAgICAgcmV0
dXJuIEludGVnZXIudmFsdWVPZigoU3RyaW5nKSB2YWx1ZU9iamVjdCkubG9uZ1ZhbHVlKCk7CiAg
ICAgICAgICAgIGVsc2UgaWYgKGlzU2hvcnQoKSkKICAgICAgICAgICAgICAgIHJldHVybiAoKFNo
b3J0KSB2YWx1ZU9iamVjdCkubG9uZ1ZhbHVlKCk7CiAgICAgICAgICAgIGVsc2UgaWYgKGlzSW50
KCkpCiAgICAgICAgICAgICAgICByZXR1cm4gKChJbnRlZ2VyKSB2YWx1ZU9iamVjdCkubG9uZ1Zh
bHVlKCk7CiAgICAgICAgICAgIGVsc2UgaWYgKGlzRG91YmxlKCkpCiAgICAgICAgICAgICAgICBy
ZXR1cm4gKChEb3VibGUpIHZhbHVlT2JqZWN0KS5sb25nVmFsdWUoKTsKICAgICAgICAgICAgZWxz
ZSBpZiAoaXNGbG9hdCgpKQogICAgICAgICAgICAgICAgcmV0dXJuICgoRmxvYXQpIHZhbHVlT2Jq
ZWN0KS5sb25nVmFsdWUoKTsKICAgICAgICAgICAgZWxzZSBpZiAoaXNCaWdEZWNpbWFsKCkpCiAg
ICAgICAgICAgICAgICByZXR1cm4gKChCaWdEZWNpbWFsKSB2YWx1ZU9iamVjdCkubG9uZ1ZhbHVl
KCk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnZhbHVl
T2YoYXNTdHJpbmcoKSkubG9uZ1ZhbHVlKCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNl
cHRpb24gZSkKICAgICAgICB7CiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhU2V0RXhjZXB0aW9u
KCJCYWQgY29udmVyc2lvbjogIiArIGUudG9TdHJpbmcoKSk7CiAgICAgICAgfQogICAgfQoKICAg
IC8qKgogICAgICAqIEdldCB0aGUgdmFsdWUgYXMgYSBMb25nIE9iamVjdAogICAgICAqCiAgICAg
ICogQHJldHVybiAgICAgYSBMb25nCiAgICAgICogQGV4Y2VwdGlvbiAgIERhdGFTZXRFeGNlcHRp
b24KICAgICAgKi8KICAgIHB1YmxpYyBMb25nIGFzTG9uZ09iaigpIHRocm93cyBEYXRhU2V0RXhj
ZXB0aW9uCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNOdWxs
KCkpCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgZWxzZSBpZiAoaXNM
b25nKCkpCiAgICAgICAgICAgICAgICByZXR1cm4gKChMb25nKSB2YWx1ZU9iamVjdCk7CiAgICAg
ICAgICAgIGVsc2UgaWYgKGlzU3RyaW5nKCkgfHwgaXNEb3VibGUoKSB8fCBpc0Zsb2F0KCkgfHwg
aXNJbnQoKSB8fAogICAgICAgICAgICAgICAgICAgIGlzQmlnRGVjaW1hbCgpIHx8IGlzU2hvcnQo
KSB8fCBpc0J5dGUoKSApCiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExvbmcgKGFzU3RyaW5n
KCkpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGF0YVNldEV4
Y2VwdGlvbigiSW52YWxpZCB0eXBlIGZvciBMb25nIik7CiAgICAgICAgfQogICAgICAgIGNhdGNo
IChFeGNlcHRpb24gZSkKICAgICAgICB7CiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhU2V0RXhj
ZXB0aW9uKCJJbGxlZ2FsIGNvbnZlcnNpb246ICIgKwogICAgICAgICAgICAgICAgICAgIGUudG9T
dHJpbmcoKSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICAqIEdldCB0aGUgdmFsdWUg
YXMgYSBhc0RvdWJsZQogICAgICAqCiAgICAgICogQHJldHVybiAgICAgYSBkb3VibGUKICAgICAg
KiBAZXhjZXB0aW9uICAgRGF0YVNldEV4Y2VwdGlvbgogICAgICAqLwogICAgcHVibGljIGRvdWJs
ZSBhc0RvdWJsZSgpIHRocm93cyBEYXRhU2V0RXhjZXB0aW9uCiAgICB7CiAgICAgICAgdHJ5CiAg
ICAgICAgewogICAgICAgICAgICBpZiAoaXNOdWxsKCkpCiAgICAgICAgICAgICAgICByZXR1cm4g
MC4wRDsKICAgICAgICAgICAgZWxzZSBpZiAoaXNEb3VibGUoKSkKICAgICAgICAgICAgICAgIHJl
dHVybiAoKERvdWJsZSkgdmFsdWVPYmplY3QpLmRvdWJsZVZhbHVlKCk7CiAgICAgICAgICAgIGVs
c2UgaWYgKGlzU3RyaW5nKCkpCiAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9m
KChTdHJpbmcpIHZhbHVlT2JqZWN0KS5kb3VibGVWYWx1ZSgpOwogICAgICAgICAgICBlbHNlIGlm
IChpc1Nob3J0KCkpCiAgICAgICAgICAgICAgICByZXR1cm4gKChTaG9ydCkgdmFsdWVPYmplY3Qp
LmRvdWJsZVZhbHVlKCk7CiAgICAgICAgICAgIGVsc2UgaWYgKGlzSW50KCkpCiAgICAgICAgICAg
ICAgICByZXR1cm4gKChJbnRlZ2VyKSB2YWx1ZU9iamVjdCkuZG91YmxlVmFsdWUoKTsKICAgICAg
ICAgICAgZWxzZSBpZiAoaXNMb25nKCkpCiAgICAgICAgICAgICAgICByZXR1cm4gKChMb25nKSB2
YWx1ZU9iamVjdCkuZG91YmxlVmFsdWUoKTsKICAgICAgICAgICAgZWxzZSBpZiAoaXNGbG9hdCgp
KQogICAgICAgICAgICAgICAgcmV0dXJuICgoRmxvYXQpIHZhbHVlT2JqZWN0KS5kb3VibGVWYWx1
ZSgpOwogICAgICAgICAgICBlbHNlIGlmIChpc0JpZ0RlY2ltYWwoKSkKICAgICAgICAgICAgICAg
IHJldHVybiAoKEJpZ0RlY2ltYWwpIHZhbHVlT2JqZWN0KS5kb3VibGVWYWx1ZSgpOwogICAgICAg
ICAgICBlbHNlCiAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKGFzU3RyaW5n
KCkpLmRvdWJsZVZhbHVlKCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkK
ICAgICAgICB7CiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhU2V0RXhjZXB0aW9uKCJCYWQgY29u
dmVyc2lvbjogIiArIGUudG9TdHJpbmcoKSk7CiAgICAgICAgfQogICAgfQoKCiAgICAvKioKICAg
ICAgKiBHZXQgdGhlIHZhbHVlIGFzIGEgRG91YmxlIE9iamVjdAogICAgICAqCiAgICAgICogQHJl
dHVybiAgICAgYSBEb3VibGUKICAgICAgKiBAZXhjZXB0aW9uICAgRGF0YVNldEV4Y2VwdGlvbgog
ICAgICAqLwogICAgcHVibGljIERvdWJsZSBhc0RvdWJsZU9iaigpIHRocm93cyBEYXRhU2V0RXhj
ZXB0aW9uCiAgICB7CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNOdWxs
KCkpCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgZWxzZSBpZiAoaXNE
b3VibGUoKSkKICAgICAgICAgICAgICAgIHJldHVybiAoKERvdWJsZSkgdmFsdWVPYmplY3QpOwog
ICAgICAgICAgICBlbHNlIGlmIChpc1N0cmluZygpIHx8IGlzQmlnRGVjaW1hbCgpIHx8IGlzRmxv
YXQoKSB8fCBpc0ludCgpIHx8CiAgICAgICAgICAgICAgICAgICAgaXNMb25nKCkgfHwgaXNTaG9y
dCgpIHx8IGlzQnl0ZSgpICkKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRG91YmxlIChhc1N0
cmluZygpKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFT
ZXRFeGNlcHRpb24oIkludmFsaWQgdHlwZSBmb3IgRG91YmxlIik7CiAgICAgICAgfQogICAgICAg
IGNhdGNoIChFeGNlcHRpb24gZSkKICAgICAgICB7CiAgICAgICAgICAgIHRocm93IG5ldyBEYXRh
U2V0RXhjZXB0aW9uKCJJbGxlZ2FsIGNvbnZlcnNpb246ICIgKwogICAgICAgICAgICAgICAgICAg
IGUudG9TdHJpbmcoKSk7CiAgICAgICAgfQogICAgfQoKCiAgICAvKioKICAgICAgKiBHZXQgdGhl
IHZhbHVlIGFzIGEgYXNGbG9hdAogICAgICAqCiAgICAgICogQHJldHVybiAgICAgYSBmbG9hdAog
ICAgICAqIEBleGNlcHRpb24gICBEYXRhU2V0RXhjZXB0aW9uCiAgICAgICovCiAgICBwdWJsaWMg
ZmxvYXQgYXNGbG9hdCgpIHRocm93cyBEYXRhU2V0RXhjZXB0aW9uCiAgICB7CiAgICAgICAgdHJ5
CiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNOdWxsKCkpCiAgICAgICAgICAgICAgICByZXR1
cm4gMC4wRjsKICAgICAgICAgICAgZWxzZSBpZiAoaXNGbG9hdCgpKQogICAgICAgICAgICAgICAg
cmV0dXJuICgoRmxvYXQpIHZhbHVlT2JqZWN0KS5mbG9hdFZhbHVlKCk7CiAgICAgICAgICAgIGVs
c2UgaWYgKGlzU3RyaW5nKCkpCiAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9m
KChTdHJpbmcpIHZhbHVlT2JqZWN0KS5mbG9hdFZhbHVlKCk7CiAgICAgICAgICAgIGVsc2UgaWYg
KGlzU2hvcnQoKSkKICAgICAgICAgICAgICAgIHJldHVybiAoKFNob3J0KSB2YWx1ZU9iamVjdCku
ZmxvYXRWYWx1ZSgpOwogICAgICAgICAgICBlbHNlIGlmIChpc0ludCgpKQogICAgICAgICAgICAg
ICAgcmV0dXJuICgoSW50ZWdlcikgdmFsdWVPYmplY3QpLmZsb2F0VmFsdWUoKTsKICAgICAgICAg
ICAgZWxzZSBpZiAoaXNMb25nKCkpCiAgICAgICAgICAgICAgICByZXR1cm4gKChMb25nKSB2YWx1
ZU9iamVjdCkuZmxvYXRWYWx1ZSgpOwogICAgICAgICAgICBlbHNlIGlmIChpc0RvdWJsZSgpKQog
ICAgICAgICAgICAgICAgcmV0dXJuICgoRG91YmxlKSB2YWx1ZU9iamVjdCkuZmxvYXRWYWx1ZSgp
OwogICAgICAgICAgICBlbHNlIGlmIChpc0JpZ0RlY2ltYWwoKSkKICAgICAgICAgICAgICAgIHJl
dHVybiAoKEJpZ0RlY2ltYWwpIHZhbHVlT2JqZWN0KS5mbG9hdFZhbHVlKCk7CiAgICAgICAgICAg
IGVsc2UKICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnZhbHVlT2YoYXNTdHJpbmcoKSku
ZmxvYXRWYWx1ZSgpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCiAgICAg
ICAgewogICAgICAgICAgICB0aHJvdyBuZXcgRGF0YVNldEV4Y2VwdGlvbigiQmFkIGNvbnZlcnNp
b246ICIgKyBlLnRvU3RyaW5nKCkpOwogICAgICAgIH0KICAgIH0KCgogICAgLyoqCiAgICAgICog
R2V0IHRoZSB2YWx1ZSBhcyBhIEZsb2F0IE9iagogICAgICAqCiAgICAgICogQHJldHVybiAgICAg
YSBGbG9hdAogICAgICAqIEBleGNlcHRpb24gICBEYXRhU2V0RXhjZXB0aW9uCiAgICAgICovCiAg
ICBwdWJsaWMgRmxvYXQgYXNGbG9hdE9iaigpIHRocm93cyBEYXRhU2V0RXhjZXB0aW9uCiAgICB7
CiAgICAgICAgdHJ5CiAgICAgICAgewogICAgICAgICAgICBpZiAoaXNOdWxsKCkpCiAgICAgICAg
ICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgZWxzZSBpZiAoaXNGbG9hdCgpKQogICAg
ICAgICAgICAgICAgcmV0dXJuICgoRmxvYXQpIHZhbHVlT2JqZWN0KTsKICAgICAgICAgICAgZWxz
ZSBpZiAoaXNTdHJpbmcoKSB8fCBpc0RvdWJsZSgpIHx8IGlzQmlnRGVjaW1hbCgpIHx8IGlzSW50
KCkgfHwKICAgICAgICAgICAgICAgICAgICBpc0xvbmcoKSB8fCBpc1Nob3J0KCkgfHwgaXNCeXRl
KCkgKQogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGbG9hdChhc1N0cmluZygpKTsKICAgICAg
ICAgICAgZWxzZQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFTZXRFeGNlcHRpb24oIklu
dmFsaWQgdHlwZSBmb3IgRmxvYXQiKTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlv
biBlKQogICAgICAgIHsKICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFTZXRFeGNlcHRpb24oIkls
bGVnYWwgY29udmVyc2lvbjogIiArCiAgICAgICAgICAgICAgICAgICAgZS50b1N0cmluZygpKTsK
ICAgICAgICB9CiAgICB9CgoKCiAgICAvKioKICAgICAgKiBHZXQgdGhlIHZhbHVlIGFzIGEgYXNU
aW1lCiAgICAgICoKICAgICAgKiBAcmV0dXJuICAgICBhIFRpbWUKICAgICAgKiBAZXhjZXB0aW9u
ICAgRGF0YVNldEV4Y2VwdGlvbgogICAgICAqLwogICAgcHVibGljIFRpbWUgYXNUaW1lKCkgdGhy
b3dzIERhdGFTZXRFeGNlcHRpb24KICAgIHsKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAg
ICAgIGlmIChpc051bGwoKSkKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAg
ICBlbHNlIGlmIChpc1RpbWUoKSkKICAgICAgICAgICAgICAgIHJldHVybiAoVGltZSkgdmFsdWVP
YmplY3Q7CgogICAgICAgICAgICBDYWxlbmRhciBjYWwgPSBDYWxlbmRhci5nZXRJbnN0YW5jZSgp
OwogICAgICAgICAgICBpZiAoaXNUaW1lc3RhbXAoKSkKICAgICAgICAgICAgewogICAgICAgICAg
ICAgICAgY2FsLnNldFRpbWUgKChUaW1lc3RhbXApIHZhbHVlT2JqZWN0KTsKICAgICAgICAgICAg
ICAgIHJldHVybiBuZXcgVGltZShjYWwuZ2V0VGltZSgpLmdldFRpbWUoKSk7CiAgICAgICAgICAg
IH0KICAgICAgICAgICAgZWxzZSBpZiAoaXNVdGlsRGF0ZSgpKQogICAgICAgICAgICB7CiAgICAg
ICAgICAgICAgICBjYWwuc2V0VGltZSAoKGphdmEudXRpbC5EYXRlKSB2YWx1ZU9iamVjdCk7CiAg
ICAgICAgICAgICAgICByZXR1cm4gbmV3IFRpbWUoY2FsLmdldFRpbWUoKS5nZXRUaW1lKCkpOwog
ICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGlzU3RyaW5nKCkpCiAgICAgICAgICAg
ICAgICByZXR1cm4gVGltZS52YWx1ZU9mKChTdHJpbmcpIHZhbHVlT2JqZWN0KTsKICAgICAgICAg
ICAgZWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIFRpbWUudmFsdWVPZihhc1N0cmluZygpKTsK
ICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBhKQogICAg
ICAgIHsKICAgICAgICAgICAgdGhyb3cgbmV3IERhdGFTZXRFeGNlcHRpb24oIkJhZCBkYXRlIHZh
bHVlIC0gSmF2YSBUaW1lIE9iamVjdHMgY2Fubm90IGJlIGVhcmxpZXIgdGhhbiAxLzEvNzAiKTsK
ICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBiKQogICAgICAgIHsKICAgICAgICAg
ICAgdGhyb3cgbmV3IERhdGFTZXRFeGNlcHRpb24oIkJhZCBjb252ZXJzaW9uOiAiICsgYi50b1N0
cmluZygpKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgICogR2V0IHRoZSB2YWx1ZSBh
cyBhIGFzVGltZXN0YW1wCiAgICAgICoKICAgICAgKiBAcmV0dXJuICAgICBhIFRpbWVzdGFtcAog
ICAgICAqIEBleGNlcHRpb24gICBEYXRhU2V0RXhjZXB0aW9uCiAgICAgICovCiAgICBwdWJsaWMg
VGltZXN0YW1wIGFzVGltZXN0YW1wKCkgdGhyb3dzIERhdGFTZXRFeGNlcHRpb24KICAgIHsKICAg
ICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChpc051bGwoKSkKICAgICAgICAgICAg
ICAgIHJldHVybiBudWxsOwogICAgICAgICAgICBlbHNlIGlmIChpc1RpbWVzdGFtcCgpKQogICAg
ICAgICAgICAgICAgcmV0dXJuIChUaW1lc3RhbXApIHZhbHVlT2JqZWN0OwoKICAgICAgICAgICAg
aWYgKGlzVGltZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDYWxlbmRhciBjYWwg
PSBDYWxlbmRhci5nZXRJbnN0YW5jZSgpOwogICAgICAgICAgICAgICAgY2FsLnNldFRpbWUgKChU
aW1lKSB2YWx1ZU9iamVjdCk7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRpbWVzdGFtcChj
YWwuZ2V0VGltZSgpLmdldFRpbWUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBp
ZiAoaXNVdGlsRGF0ZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3
IFRpbWVzdGFtcCgoKGphdmEudXRpbC5EYXRlKSB2YWx1ZU9iamVjdCkuZ2V0VGltZSgpKTsKICAg
ICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChpc1N0cmluZygpKQogICAgICAgICAgICAg
ICAgcmV0dXJuIFRpbWVzdGFtcC52YWx1ZU9mKChTdHJpbmcpIHZhbHVlT2JqZWN0KTsKICAgICAg
ICAgICAgZWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIFRpbWVzdGFtcC52YWx1ZU9mKGFzU3Ry
aW5nKCkpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9u
IGEpCiAgICAgICAgewogICAgICAgICAgICB0aHJvdyBuZXcgRGF0YVNldEV4Y2VwdGlvbigiQmFk
IGRhdGUgdmFsdWUgLSBKYXZhIFRpbWVzdGFtcCBPYmplY3RzIGNhbm5vdCBiZSBlYXJsaWVyIHRo
YW4gMS8xLzcwIik7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gYikKICAgICAg
ICB7CiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhU2V0RXhjZXB0aW9uKCJCYWQgY29udmVyc2lv
bjogIiArIGIudG9TdHJpbmcoKSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICAqIEdl
dCB0aGUgdmFsdWUgYXMgYSBhc0RhdGUKICAgICAgKgogICAgICAqIEByZXR1cm4gICAgIGEgamF2
YS5zcWwuRGF0ZQogICAgICAqIEBleGNlcHRpb24gICBEYXRhU2V0RXhjZXB0aW9uCiAgICAgICov
CiAgICBwdWJsaWMgamF2YS5zcWwuRGF0ZSBhc0RhdGUoKSB0aHJvd3MgRGF0YVNldEV4Y2VwdGlv
bgogICAgewogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGlzTnVsbCgpKQog
ICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIGVsc2UgaWYgKGlzRGF0ZSgp
KQogICAgICAgICAgICAgICAgcmV0dXJuIChqYXZhLnNxbC5EYXRlKSB2YWx1ZU9iamVjdDsKCiAg
ICAgICAgICAgIENhbGVuZGFyIGNhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CiAgICAgICAg
ICAgIGlmIChpc1RpbWVzdGFtcCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUaW1l
c3RhbXAgdHMgPSAoVGltZXN0YW1wKSB2YWx1ZU9iamVjdDsKICAgICAgICAgICAgICAgIGxvbmcg
ZGF0ZSA9IHRzLmdldFRpbWUoKTsKICAgICAgICAgICAgICAgIGludCBuYW5vcyA9IHRzLmdldE5h
bm9zKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGphdmEuc3FsLkRhdGUoZGF0ZSArIChu
YW5vcy8xMDAwMDAwKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoaXNUaW1l
KCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGNhbC5zZXRUaW1lICgoVGltZSkgdmFs
dWVPYmplY3QpOwogICAgICAgICAgICAgICAgcmV0dXJuIGphdmEuc3FsLkRhdGUudmFsdWVPZiAo
Y2FsLmdldChDYWxlbmRhci5ZRUFSKSArCiAgICAgICAgICAgICAgICAgICAgICAgICItIiArIChj
YWwuZ2V0KENhbGVuZGFyLk1PTlRIKSArIDEpICsgIi0iICsKICAgICAgICAgICAgICAgICAgICAg
ICAgY2FsLmdldChDYWxlbmRhci5EQVlfT0ZfTU9OVEgpKTsKICAgICAgICAgICAgfQogICAgICAg
ICAgICBlbHNlIGlmIChpc1V0aWxEYXRlKCkpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAg
IGNhbC5zZXRUaW1lICgoamF2YS51dGlsLkRhdGUpIHZhbHVlT2JqZWN0KTsKICAgICAgICAgICAg
ICAgIHJldHVybiBqYXZhLnNxbC5EYXRlLnZhbHVlT2YgKGNhbC5nZXQoQ2FsZW5kYXIuWUVBUikg
KwogICAgICAgICAgICAgICAgICAgICAgICAiLSIgKyAoY2FsLmdldChDYWxlbmRhci5NT05USCkg
KyAxKSArICItIiArCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbC5nZXQoQ2FsZW5kYXIuREFZ
X09GX01PTlRIKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoaXNTdHJpbmco
KSkKICAgICAgICAgICAgICAgIHJldHVybiBqYXZhLnNxbC5EYXRlLnZhbHVlT2YoKFN0cmluZykg
dmFsdWVPYmplY3QpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICByZXR1cm4gamF2
YS5zcWwuRGF0ZS52YWx1ZU9mKGFzU3RyaW5nKCkpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAo
SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGEpCiAgICAgICAgewogICAgICAgICAgICB0aHJvdyBu
ZXcgRGF0YVNldEV4Y2VwdGlvbigiQmFkIGRhdGUgdmFsdWUgLSBKYXZhIFRpbWVzdGFtcCBPYmpl
Y3RzIGNhbm5vdCBiZSBlYXJsaWVyIHRoYW4gMS8xLzcwIik7CiAgICAgICAgfQogICAgICAgIGNh
dGNoIChFeGNlcHRpb24gYikKICAgICAgICB7CiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhU2V0
RXhjZXB0aW9uKCJCYWQgY29udmVyc2lvbjogIiArIGIudG9TdHJpbmcoKSk7CiAgICAgICAgfQog
ICAgfQoKICAgIC8qKgogICAgICAqIEdldCB0aGUgdmFsdWUgYXMgYSBhc1V0aWxEYXRlCiAgICAg
ICoKICAgICAgKiBAcmV0dXJuICAgICBhIGphdmEudXRpbC5EYXRlCiAgICAgICogQGV4Y2VwdGlv
biAgIERhdGFTZXRFeGNlcHRpb24KICAgICAgKi8KICAgIHB1YmxpYyBqYXZhLnV0aWwuRGF0ZSBh
c1V0aWxEYXRlKCkgdGhyb3dzIERhdGFTZXRFeGNlcHRpb24KICAgIHsKICAgICAgICB0cnkKICAg
ICAgICB7CiAgICAgICAgICAgIGlmIChpc051bGwoKSkKICAgICAgICAgICAgICAgIHJldHVybiBu
dWxsOwogICAgICAgICAgICBlbHNlIGlmIChpc1V0aWxEYXRlKCkpCiAgICAgICAgICAgICAgICBy
ZXR1cm4gKGphdmEudXRpbC5EYXRlKSB2YWx1ZU9iamVjdDsKCiAgICAgICAgICAgIENhbGVuZGFy
IGNhbCA9IENhbGVuZGFyLmdldEluc3RhbmNlKCk7CiAgICAgICAgICAgIGlmIChpc1RpbWVzdGFt
cCgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBUaW1lc3RhbXAgdHMgPSAoVGltZXN0
YW1wKSB2YWx1ZU9iamVjdDsKICAgICAgICAgICAgICAgIGxvbmcgZGF0ZSA9IHRzLmdldFRpbWUo
KTsKICAgICAgICAgICAgICAgIGludCBuYW5vcyA9IHRzLmdldE5hbm9zKCk7CiAgICAgICAgICAg
ICAgICByZXR1cm4gbmV3IGphdmEudXRpbC5EYXRlKGRhdGUgKyAobmFub3MvMTAwMDAwMCkpOwog
ICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGlzVGltZSgpKQogICAgICAgICAgICB7
CiAgICAgICAgICAgICAgICBjYWwuc2V0VGltZSAoKFRpbWUpIHZhbHVlT2JqZWN0KTsKICAgICAg
ICAgICAgICAgIHJldHVybiBqYXZhLnNxbC5EYXRlLnZhbHVlT2YgKGNhbC5nZXQoQ2FsZW5kYXIu
WUVBUikgKwogICAgICAgICAgICAgICAgICAgICAgICAiLSIgKyAoY2FsLmdldChDYWxlbmRhci5N
T05USCkgKyAxKSArICItIiArCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbC5nZXQoQ2FsZW5k
YXIuREFZX09GX01PTlRIKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoaXNV
dGlsRGF0ZSgpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYWwuc2V0VGltZSAoKGph
dmEudXRpbC5EYXRlKSB2YWx1ZU9iamVjdCk7CiAgICAgICAgICAgICAgICByZXR1cm4gamF2YS5z
cWwuRGF0ZS52YWx1ZU9mIChjYWwuZ2V0KENhbGVuZGFyLllFQVIpICsKICAgICAgICAgICAgICAg
ICAgICAgICAgIi0iICsgKGNhbC5nZXQoQ2FsZW5kYXIuTU9OVEgpICsgMSkgKyAiLSIgKwogICAg
ICAgICAgICAgICAgICAgICAgICBjYWwuZ2V0KENhbGVuZGFyLkRBWV9PRl9NT05USCkpOwogICAg
ICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgewogICAgICAgICAgICAgICAg
cmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2F0Y2ggKElsbGVn
YWxBcmd1bWVudEV4Y2VwdGlvbiBhKQogICAgICAgIHsKICAgICAgICAgICAgdGhyb3cgbmV3IERh
dGFTZXRFeGNlcHRpb24oIkJhZCBkYXRlIHZhbHVlIC0gSmF2YSBqYXZhLnV0aWwuRGF0ZSBPYmpl
Y3RzIGNhbm5vdCBiZSBlYXJsaWVyIHRoYW4gMS8xLzcwIik7CiAgICAgICAgfQogICAgICAgIGNh
dGNoIChFeGNlcHRpb24gYikKICAgICAgICB7CiAgICAgICAgICAgIHRocm93IG5ldyBEYXRhU2V0
RXhjZXB0aW9uKCJCYWQgY29udmVyc2lvbjogIiArIGIudG9TdHJpbmcoKSk7CiAgICAgICAgfQog
ICAgfQoKICAgIC8qKgogICAgICAqIElzIHRoZSB2YWx1ZSBhIGlzQmlnRGVjaW1hbAogICAgICAq
CiAgICAgICogQHJldHVybiAgICAgdHJ1ZSBpZiBCaWdEZWNpbWFsCiAgICAgICovCiAgICBwdWJs
aWMgYm9vbGVhbiBpc0JpZ0RlY2ltYWwoKQogICAgewogICAgICAgIHJldHVybiB2YWx1ZU9iamVj
dCBpbnN0YW5jZW9mIEJpZ0RlY2ltYWw7CiAgICB9CgogICAgLyoqCiAgICAgICogSXMgdGhlIHZh
bHVlIGEgaXNCeXRlCiAgICAgICoKICAgICAgKiBAcmV0dXJuICAgICB0cnVlIGlmIGlzIEJ5dGUK
ICAgICAgKi8KICAgIHB1YmxpYyBib29sZWFuIGlzQnl0ZSgpCiAgICB7CiAgICAgICAgcmV0dXJu
IHZhbHVlT2JqZWN0IGluc3RhbmNlb2YgQnl0ZTsKICAgIH0KCiAgICAvKioKICAgICAgKiBJcyB0
aGUgdmFsdWUgYSBpc0J5dGVzCiAgICAgICoKICAgICAgKiBAcmV0dXJuICAgICB0cnVlIGlmIGlz
IGJ5dGVbXQogICAgICAqLwogICAgcHVibGljIGJvb2xlYW4gaXNCeXRlcygpCiAgICB7CiAgICAg
ICAgcmV0dXJuIHZhbHVlT2JqZWN0IGluc3RhbmNlb2YgYnl0ZVtdOwogICAgfQoKICAgIC8qKgog
ICAgICAqIElzIHRoZSB2YWx1ZSBhIGlzRGF0ZQogICAgICAqCiAgICAgICogQHJldHVybiAgICAg
dHJ1ZSBpZiBpcyBqYXZhLnNxbC5EYXRlCiAgICAgICovCiAgICBwdWJsaWMgYm9vbGVhbiBpc0Rh
dGUoKQogICAgewogICAgICAgIHJldHVybiB2YWx1ZU9iamVjdCBpbnN0YW5jZW9mIGphdmEuc3Fs
LkRhdGU7CiAgICB9CgogICAgLyoqCiAgICAgICogSXMgdGhlIHZhbHVlIGEgaXNTaG9ydAogICAg
ICAqCiAgICAgICogQHJldHVybiAgICAgdHJ1ZSBpZiBpcyBTaG9ydAogICAgICAqLwogICAgcHVi
bGljIGJvb2xlYW4gaXNTaG9ydCgpCiAgICB7CiAgICAgICAgcmV0dXJuIHZhbHVlT2JqZWN0IGlu
c3RhbmNlb2YgU2hvcnQ7CiAgICB9CgogICAgLyoqCiAgICAgICogSXMgdGhlIHZhbHVlIGEgaXNJ
bnQKICAgICAgKgogICAgICAqIEByZXR1cm4gICAgIHRydWUgaWYgaXMgSW50ZWdlcgogICAgICAq
LwogICAgcHVibGljIGJvb2xlYW4gaXNJbnQoKQogICAgewogICAgICAgIHJldHVybiB2YWx1ZU9i
amVjdCBpbnN0YW5jZW9mIEludGVnZXI7CiAgICB9CgogICAgLyoqCiAgICAgICogSXMgdGhlIHZh
bHVlIGEgaXNMb25nCiAgICAgICoKICAgICAgKiBAcmV0dXJuICAgICB0cnVlIGlmIGlzIExvbmcK
ICAgICAgKi8KICAgIHB1YmxpYyBib29sZWFuIGlzTG9uZygpCiAgICB7CiAgICAgICAgcmV0dXJu
IHZhbHVlT2JqZWN0IGluc3RhbmNlb2YgTG9uZzsKICAgIH0KCiAgICAvKioKICAgICAgKiBJcyB0
aGUgdmFsdWUgYSBpc0RvdWJsZQogICAgICAqCiAgICAgICogQHJldHVybiAgICAgdHJ1ZSBpZiBp
cyBEb3VibGUKICAgICAgKi8KICAgIHB1YmxpYyBib29sZWFuIGlzRG91YmxlKCkKICAgIHsKICAg
ICAgICByZXR1cm4gdmFsdWVPYmplY3QgaW5zdGFuY2VvZiBEb3VibGU7CiAgICB9CgogICAgLyoq
CiAgICAgICogSXMgdGhlIHZhbHVlIGEgaXNGbG9hdAogICAgICAqCiAgICAgICogQHJldHVybiAg
ICAgdHJ1ZSBpZiBpcyBGbG9hdAogICAgICAqLwogICAgcHVibGljIGJvb2xlYW4gaXNGbG9hdCgp
CiAgICB7CiAgICAgICAgcmV0dXJuIHZhbHVlT2JqZWN0IGluc3RhbmNlb2YgRmxvYXQ7CiAgICB9
CgogICAgLyoqCiAgICAgICogSXMgdGhlIHZhbHVlIGEgaXNCb29sZWFuCiAgICAgICoKICAgICAg
KiBAcmV0dXJuICAgICB0cnVlIGlmIGlzIEJvb2xlYW4KICAgICAgKi8KICAgIHB1YmxpYyBib29s
ZWFuIGlzQm9vbGVhbigpCiAgICB7CiAgICAgICAgcmV0dXJuIHZhbHVlT2JqZWN0IGluc3RhbmNl
b2YgQm9vbGVhbjsKICAgIH0KCiAgICAvKioKICAgICAgKiBJcyB0aGUgdmFsdWUgYSBpc051bGwK
ICAgICAgKgogICAgICAqIEByZXR1cm4gICAgIHRydWUgaWYgaXMgbnVsbAogICAgICAqLwogICAg
cHVibGljIGJvb2xlYW4gaXNOdWxsKCkKICAgIHsKICAgICAgICByZXR1cm4gdmFsdWVPYmplY3Qg
PT0gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAgKiBJcyB0aGUgdmFsdWUgYSBpc1N0cmluZwog
ICAgICAqCiAgICAgICogQHJldHVybiAgICAgdHJ1ZSBpZiBpcyBTdHJpbmcKICAgICAgKi8KICAg
IHB1YmxpYyBib29sZWFuIGlzU3RyaW5nKCkKICAgIHsKICAgICAgICByZXR1cm4gdmFsdWVPYmpl
Y3QgaW5zdGFuY2VvZiBTdHJpbmc7CiAgICB9CgogICAgLyoqCiAgICAgICogSXMgdGhlIHZhbHVl
IGEgaXNUaW1lCiAgICAgICoKICAgICAgKiBAcmV0dXJuICAgICB0cnVlIGlmIGlzIGphdmEuc3Fs
LlRpbWUKICAgICAgKi8KICAgIHB1YmxpYyBib29sZWFuIGlzVGltZSgpCiAgICB7CiAgICAgICAg
cmV0dXJuIHZhbHVlT2JqZWN0IGluc3RhbmNlb2YgamF2YS5zcWwuVGltZTsKICAgIH0KCiAgICAv
KioKICAgICAgKiBJcyB0aGUgdmFsdWUgYSBpc1RpbWVzdGFtcAogICAgICAqCiAgICAgICogQHJl
dHVybiAgICAgdHJ1ZSBpZiBpcyBqYXZhLnNxbC5UaW1lc3RhbXAKICAgICAgKi8KICAgIHB1Ymxp
YyBib29sZWFuIGlzVGltZXN0YW1wKCkKICAgIHsKICAgICAgICByZXR1cm4gdmFsdWVPYmplY3Qg
aW5zdGFuY2VvZiBqYXZhLnNxbC5UaW1lc3RhbXA7CiAgICB9CgogICAgLyoqCiAgICAgICogSXMg
dGhlIHZhbHVlIGEgaXNVdGlsRGF0ZQogICAgICAqCiAgICAgICogQHJldHVybiAgICAgdHJ1ZSBp
ZiBpcyBqYXZhLnV0aWwuRGF0ZQogICAgICAqLwogICAgcHVibGljIGJvb2xlYW4gaXNVdGlsRGF0
ZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIHZhbHVlT2JqZWN0IGluc3RhbmNlb2YgamF2YS51dGls
LkRhdGU7CiAgICB9CgogICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgdmFs
dWUKICAgICAgKgogICAgICAqIEByZXR1cm4gICAgIHRoZSB0eXBlIG9mIHRoaXMgdmFsdWUKICAg
ICAgKi8KICAgIHB1YmxpYyBpbnQgdHlwZSgpCiAgICB7CiAgICAgICAgcmV0dXJuIHRoaXMudHlw
ZTsKICAgIH0KCiAgICAvKioKICAgICAgKiBHZXRzIHRoZSBjb2x1bW5OdW1iZXIgd2hpY2ggdGhp
cyB2YWx1ZSByZXByZXNlbnRzLgogICAgICAqCiAgICAgICogQHJldHVybiAgICAgYW4gaW50CiAg
ICAgICovCiAgICBpbnQgY29sdW1uTnVtYmVyKCkKICAgIHsKICAgICAgICByZXR1cm4gdGhpcy5j
b2x1bW5OdW1iZXI7CiAgICB9CiAgICAKICAgIC8qKgogICAgICogQHJldHVybiB0cnVlIGlmICh0
cnVlIHx8IHQgfCB5ZXMgfCAxKQogICAgICovCiAgICBwcml2YXRlIGJvb2xlYW4gaXNUcnVlKFN0
cmluZyB2YWx1ZSkKICAgIHsKICAgICAgICByZXR1cm4gKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2Ug
KCJ0cnVlIikgfHwKICAgICAgICAgICAgICAgIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UgKCJ0Iikg
fHwKICAgICAgICAgICAgICAgIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UgKCJ5ZXMiKSB8fCAKICAg
ICAgICAgICAgICAgIHZhbHVlLmVxdWFscyAoIjEiKSk7CiAgICB9Cn0K

---MOQ104985383480af299144db9aa6c652b7f003a56238
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
Village-dev mailing list
[email protected]
http://share.whichever.com/mailman/listinfo/village-dev

---MOQ104985383480af299144db9aa6c652b7f003a56238--