private static Element pickDiffgram(MessageElement[] anyArr) {
if (anyArr == null) return null;
for (MessageElement me : anyArr) {
String ln = me.getLocalName();
if ("diffgram".equalsIgnoreCase(ln)) return me;
}
return null;
}
private static String getChildText(Element parent, String tag) {
NodeList nl = parent.getElementsByTagName(tag);
if (nl == null || nl.getLength() == 0) return "";
return getNodeTextCompat(nl.item(0)).trim();
}
private static String getNodeTextCompat(Node node) {
if (node == null) return "";
StringBuilder sb = new StringBuilder();
NodeList cs = node.getChildNodes();
for (int i = 0; i < cs.getLength(); i++) {
Node c = cs.item(i);
short t = c.getNodeType();
if (t == Node.TEXT_NODE || t == Node.CDATA_SECTION_NODE) sb.append(c.getNodeValue());
}
return sb.toString();
}
private static Element firstChildElementByLocalName(Element parent, String local) {
if (parent == null) return null;
for (Node n = parent.getFirstChild(); n != null; n = n.getNextSibling()) {
if (n.getNodeType() == Node.ELEMENT_NODE) {
String ln = n.getLocalName();
String nn = n.getNodeName();
if (local.equals(nn) || local.equalsIgnoreCase(ln)) return (Element) n;
}
}
return null;
}
private static Integer parseIntOrNull(String s) {
if (s == null || s.isBlank()) return null;
try { return Integer.parseInt(s.trim()); } catch (NumberFormatException e) { return null; }
}
private static LocalDateTime parseDateTimeSafely(String s) {
if (s == null || s.isBlank()) return null;
try { return LocalDateTime.parse(s.trim(), FORMATTER); }
catch (DateTimeParseException e1) {
try { return LocalDateTime.parse(s.trim(), FMT_FALLBACK); }
catch (DateTimeParseException e2) { return null; }
}
}
cHJpdmF0ZSBzdGF0aWMgRWxlbWVudCBwaWNrRGlmZmdyYW0oTWVzc2FnZUVsZW1lbnRbXSBhbnlBcnIpIHsKCiAgICBpZiAoYW55QXJyID09IG51bGwpIHJldHVybiBudWxsOwoKICAgIGZvciAoTWVzc2FnZUVsZW1lbnQgbWUgOiBhbnlBcnIpIHsKCiAgICAgICAgU3RyaW5nIGxuID0gbWUuZ2V0TG9jYWxOYW1lKCk7CgogICAgICAgIGlmICgiZGlmZmdyYW0iLmVxdWFsc0lnbm9yZUNhc2UobG4pKSByZXR1cm4gbWU7CgogICAgfQoKICAgIHJldHVybiBudWxsOwoKfQoKCgpwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Q2hpbGRUZXh0KEVsZW1lbnQgcGFyZW50LCBTdHJpbmcgdGFnKSB7CgogICAgTm9kZUxpc3QgbmwgPSBwYXJlbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnKTsKCiAgICBpZiAobmwgPT0gbnVsbCB8fCBubC5nZXRMZW5ndGgoKSA9PSAwKSByZXR1cm4gIiI7CgogICAgcmV0dXJuIGdldE5vZGVUZXh0Q29tcGF0KG5sLml0ZW0oMCkpLnRyaW0oKTsKCn0KCgoKcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldE5vZGVUZXh0Q29tcGF0KE5vZGUgbm9kZSkgewoKICAgIGlmIChub2RlID09IG51bGwpIHJldHVybiAiIjsKCiAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKCiAgICBOb2RlTGlzdCBjcyA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY3MuZ2V0TGVuZ3RoKCk7IGkrKykgewoKICAgICAgICBOb2RlIGMgPSBjcy5pdGVtKGkpOwoKICAgICAgICBzaG9ydCB0ID0gYy5nZXROb2RlVHlwZSgpOwoKICAgICAgICBpZiAodCA9PSBOb2RlLlRFWFRfTk9ERSB8fCB0ID09IE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFKSBzYi5hcHBlbmQoYy5nZXROb2RlVmFsdWUoKSk7CgogICAgfQoKICAgIHJldHVybiBzYi50b1N0cmluZygpOwoKfQoKCgpwcml2YXRlIHN0YXRpYyBFbGVtZW50IGZpcnN0Q2hpbGRFbGVtZW50QnlMb2NhbE5hbWUoRWxlbWVudCBwYXJlbnQsIFN0cmluZyBsb2NhbCkgewoKICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7CgogICAgZm9yIChOb2RlIG4gPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBuICE9IG51bGw7IG4gPSBuLmdldE5leHRTaWJsaW5nKCkpIHsKCiAgICAgICAgaWYgKG4uZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewoKICAgICAgICAgICAgU3RyaW5nIGxuID0gbi5nZXRMb2NhbE5hbWUoKTsKCiAgICAgICAgICAgIFN0cmluZyBubiA9IG4uZ2V0Tm9kZU5hbWUoKTsKCiAgICAgICAgICAgIGlmIChsb2NhbC5lcXVhbHMobm4pIHx8IGxvY2FsLmVxdWFsc0lnbm9yZUNhc2UobG4pKSByZXR1cm4gKEVsZW1lbnQpIG47CgogICAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIG51bGw7Cgp9CgoKCnByaXZhdGUgc3RhdGljIEludGVnZXIgcGFyc2VJbnRPck51bGwoU3RyaW5nIHMpIHsKCiAgICBpZiAocyA9PSBudWxsIHx8IHMuaXNCbGFuaygpKSByZXR1cm4gbnVsbDsKCiAgICB0cnkgeyByZXR1cm4gSW50ZWdlci5wYXJzZUludChzLnRyaW0oKSk7IH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7IHJldHVybiBudWxsOyB9Cgp9CgoKCnByaXZhdGUgc3RhdGljIExvY2FsRGF0ZVRpbWUgcGFyc2VEYXRlVGltZVNhZmVseShTdHJpbmcgcykgewoKICAgIGlmIChzID09IG51bGwgfHwgcy5pc0JsYW5rKCkpIHJldHVybiBudWxsOwoKICAgIHRyeSB7IHJldHVybiBMb2NhbERhdGVUaW1lLnBhcnNlKHMudHJpbSgpLCBGT1JNQVRURVIpOyB9CgogICAgY2F0Y2ggKERhdGVUaW1lUGFyc2VFeGNlcHRpb24gZTEpIHsKCiAgICAgICAgdHJ5IHsgcmV0dXJuIExvY2FsRGF0ZVRpbWUucGFyc2Uocy50cmltKCksIEZNVF9GQUxMQkFDSyk7IH0KCiAgICAgICAgY2F0Y2ggKERhdGVUaW1lUGFyc2VFeGNlcHRpb24gZTIpIHsgcmV0dXJuIG51bGw7IH0KCiAgICB9Cgp9Cg==