2025-11-28 09:53:40,069 DEBUG [IncreaseHikariCP housekeeper]
com.zaxxer.hikari.pool.HikariPool: IncreaseHikariCP - Pool stats (total=10, active=0, idle=10, waiting=0)
2025-11-28 09:53:40,069 DEBUG [IncreaseHikariCP housekeeper]
com.zaxxer.hikari.pool.HikariPool: IncreaseHikariCP - Fill pool skipped, pool is at sufficient level.
2025-11-28 09:53:42,507 DEBUG [cbsHikariCP housekeeper]
com.zaxxer.hikari.pool.HikariPool: cbsHikariCP - Pool stats (total=10, active=0, idle=10, waiting=0)
2025-11-28 09:53:42,507 DEBUG [cbsHikariCP housekeeper]
com.zaxxer.hikari.pool.HikariPool: cbsHikariCP - Fill pool skipped, pool is at sufficient level.
2025-11-28 09:53:49,349 DEBUG [poolScheduler6]
org.apache.http.impl.conn.PoolingHttpClientConnectionManager: Closing expired connections
2025-11-28 09:53:49,349 DEBUG [poolScheduler6]
org.apache.http.impl.conn.PoolingHttpClientConnectionManager: Closing connections idle longer than 30 SECONDS
2025-11-28 09:53:59,365 DEBUG [poolScheduler12]
org.apache.http.impl.conn.PoolingHttpClientConnectionManager: Closing expired connections
2025-11-28 09:53:59,366 DEBUG [poolScheduler12]
org.apache.http.impl.conn.PoolingHttpClientConnectionManager: Closing connections idle longer than 30 SECONDS
2025-11-28 09:54:09,379 DEBUG [poolScheduler2]
package com.taiwanlife.recruit.rest.vo.res;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import com.taiwanlife.recruit.enums.StatusType;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@SuppressWarnings("serial")
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Schema(description = "準增員完整資料")
public class UserAuditDataResVO extends BaseResVO {
@Schema(description = "準增員主要資料")
private UserResVO user;
@Schema(description = "準增員詳細資料")
private UserDetailResVO userDetail;
@Schema(description = "準增員工作經歷資料")
private List<UserWorkResVO> userWorks;
@Schema(description = "準增員其他工作經歷資料")
private List<UserWorkOtherResVO> userWorkOthers;
@Schema(description = "準增員其他工作經歷資料")
private UserBackgroundResVO userBackground;
@Schema(description = "準增員上傳文件")
private List<UserUploadDefineResVO> userUploadDefines;
@Schema(description = "準增員基本資料資料檢查結果")
private FlowRecordResVO basicFlowRecord;
@Schema(description = "準增員背景聲明檢查結果")
private FlowRecordResVO backgroundFlowRecord;
@Schema(description = "準增員學經歷檢查結果")
private FlowRecordResVO eduFlowRecord;
@Schema(description = "準增員公會懲處紀錄檢查結果")
private FlowRecordResVO liaFlowRecord;
@Schema(description = "準增員洗錢防制調查結果檢查結果")
private FlowRecordResVO lauFlowRecord;
@Schema(description = "審核人員(助理)上傳補充資料文件")
private List<UserUploadDefineResVO> assistantUploadDefines;
@Schema(description = "審核人員(經辦)上傳補充資料文件")
private List<UserUploadDefineResVO> managerUploadDefines;
@Schema(description = "層級調整")
private List<JobListResVO> JobList;
@Schema(description = "審核者")
private String approver;
@Schema(description = "文件審查階段")
private List<StatusHistoryChartResVO> checkCharts;
@Schema(description = "報聘簽核階段")
private List<StatusHistoryChartResVO> auditCharts;
public Boolean isUserUploadAlerted() {
if (userUploadDefines == null || userUploadDefines.size() == 0) {
return Boolean.TRUE;
}
Boolean result = Boolean.TRUE;
for (UserUploadDefineResVO userUploadDefineResVO : userUploadDefines) {
if (userUploadDefineResVO.getAlertMark() != null && userUploadDefineResVO.getAlertMark() == 1) {
result = Boolean.FALSE;
break;
}
}
return result;
}
public Boolean isBasicPassed() {
if (basicFlowRecord == null) {
return Boolean.TRUE;
}
return basicFlowRecord.isProcessResultY();
}
public Boolean isEduPassed() {
if (eduFlowRecord == null) {
return Boolean.TRUE;
}
return eduFlowRecord.isProcessResultY();
}
public Boolean isBackgroundPassed() {
if (backgroundFlowRecord == null) {
return Boolean.TRUE;
}
return backgroundFlowRecord.isProcessResultY();
}
public Boolean isLiaAndLauPassed() {
if (liaFlowRecord == null && lauFlowRecord == null) {
return Boolean.TRUE;
}
return !liaFlowRecord.isProcessResultY() && !lauFlowRecord.isProcessResultY();
}
public Boolean isNotD03() {
return user.getStatus() != StatusType.D03;
}
/*準增員狀態目前不是D04
* ture=不是D04
* false=是D04
* */
public Boolean isNotD04() {
return user.getStatus() != StatusType.D04;
}
public Boolean isHeadStatus() {
String jobId = user.getJobId();
Boolean result = Boolean.FALSE;
if (user.getStatus() == StatusType.D10) {
if ("SR".equals(jobId) || "CA".equals(jobId) || "SS".equals(jobId) || "SSS".equals(jobId) || "SM".equals(jobId) || "ASB".equals(jobId) || "AS".equals(jobId) || "ASS".equals(jobId)) {
result = Boolean.TRUE;
}
} else if (user.getStatus() == StatusType.D11) {
if ("UMM".equals(jobId) || "UMB".equals(jobId) || "UM".equals(jobId) || "USM".equals(jobId) || "UEM".equals(jobId)) {
result = Boolean.TRUE;
}
} else if (user.getStatus() == StatusType.D12) {
if ("AM".equals(jobId) || "ASM".equals(jobId) || "AD".equals(jobId) || "ASD".equals(jobId) || "AVP".equals(jobId)) {
result = Boolean.TRUE;
}
// 1140200477-00_調整報聘文件檢查流程及上傳功能權限-第一階段
} else if (user.getStatus() == StatusType.D03 || user.getStatus() == StatusType.D05
|| user.getStatus() == StatusType.D06) {
result = Boolean.TRUE;
}
return result;
}
public String getUserUploadDefineFileTypes() {
String result = "";
for (UserUploadDefineResVO userUploadDefine : userUploadDefines) {
result += userUploadDefine.getFileType() + "," + userUploadDefine.getFileHead() + ";";
}
if (StringUtils.isBlank(result))
return "";
return result.substring(0, result.length() - 1);
}
public String getNextStatus() {
List<StatusHistoryChartResVO> charts = new ArrayList<StatusHistoryChartResVO>();
charts.addAll(this.checkCharts);
charts.addAll(this.auditCharts);
String result = null;
for (StatusHistoryChartResVO statusHistoryChartResVO : charts) {
if (statusHistoryChartResVO.getModifyTime() == null) {
result = statusHistoryChartResVO.getStatusCode();
break;
}
}
return result;
}
}
MjAyNS0xMS0yOCAwOTo1Mzo0MCwwNjkgREVCVUcgW0luY3JlYXNlSGlrYXJpQ1AgaG91c2VrZWVwZXJdCgkJCQljb20uemF4eGVyLmhpa2FyaS5wb29sLkhpa2FyaVBvb2w6IEluY3JlYXNlSGlrYXJpQ1AgLSBQb29sIHN0YXRzICh0b3RhbD0xMCwgYWN0aXZlPTAsIGlkbGU9MTAsIHdhaXRpbmc9MCkKMjAyNS0xMS0yOCAwOTo1Mzo0MCwwNjkgREVCVUcgW0luY3JlYXNlSGlrYXJpQ1AgaG91c2VrZWVwZXJdCgkJCQljb20uemF4eGVyLmhpa2FyaS5wb29sLkhpa2FyaVBvb2w6IEluY3JlYXNlSGlrYXJpQ1AgLSBGaWxsIHBvb2wgc2tpcHBlZCwgcG9vbCBpcyBhdCBzdWZmaWNpZW50IGxldmVsLgoyMDI1LTExLTI4IDA5OjUzOjQyLDUwNyBERUJVRyBbY2JzSGlrYXJpQ1AgaG91c2VrZWVwZXJdCgkJCQljb20uemF4eGVyLmhpa2FyaS5wb29sLkhpa2FyaVBvb2w6IGNic0hpa2FyaUNQIC0gUG9vbCBzdGF0cyAodG90YWw9MTAsIGFjdGl2ZT0wLCBpZGxlPTEwLCB3YWl0aW5nPTApCjIwMjUtMTEtMjggMDk6NTM6NDIsNTA3IERFQlVHIFtjYnNIaWthcmlDUCBob3VzZWtlZXBlcl0KCQkJCWNvbS56YXh4ZXIuaGlrYXJpLnBvb2wuSGlrYXJpUG9vbDogY2JzSGlrYXJpQ1AgLSBGaWxsIHBvb2wgc2tpcHBlZCwgcG9vbCBpcyBhdCBzdWZmaWNpZW50IGxldmVsLgoyMDI1LTExLTI4IDA5OjUzOjQ5LDM0OSBERUJVRyBbcG9vbFNjaGVkdWxlcjZdCgkJCQlvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLlBvb2xpbmdIdHRwQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXI6IENsb3NpbmcgZXhwaXJlZCBjb25uZWN0aW9ucwoyMDI1LTExLTI4IDA5OjUzOjQ5LDM0OSBERUJVRyBbcG9vbFNjaGVkdWxlcjZdCgkJCQlvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLlBvb2xpbmdIdHRwQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXI6IENsb3NpbmcgY29ubmVjdGlvbnMgaWRsZSBsb25nZXIgdGhhbiAzMCBTRUNPTkRTCjIwMjUtMTEtMjggMDk6NTM6NTksMzY1IERFQlVHIFtwb29sU2NoZWR1bGVyMTJdCgkJCQlvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLlBvb2xpbmdIdHRwQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXI6IENsb3NpbmcgZXhwaXJlZCBjb25uZWN0aW9ucwoyMDI1LTExLTI4IDA5OjUzOjU5LDM2NiBERUJVRyBbcG9vbFNjaGVkdWxlcjEyXQoJCQkJb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi5Qb29saW5nSHR0cENsaWVudENvbm5lY3Rpb25NYW5hZ2VyOiBDbG9zaW5nIGNvbm5lY3Rpb25zIGlkbGUgbG9uZ2VyIHRoYW4gMzAgU0VDT05EUwoyMDI1LTExLTI4IDA5OjU0OjA5LDM3OSBERUJVRyBbcG9vbFNjaGVkdWxlcjJdCgpwYWNrYWdlIGNvbS50YWl3YW5saWZlLnJlY3J1aXQucmVzdC52by5yZXM7CgppbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKaW1wb3J0IGphdmEudXRpbC5MaXN0OwoKaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlsczsKCmltcG9ydCBjb20udGFpd2FubGlmZS5yZWNydWl0LmVudW1zLlN0YXR1c1R5cGU7CgppbXBvcnQgaW8uc3dhZ2dlci52My5vYXMuYW5ub3RhdGlvbnMubWVkaWEuU2NoZW1hOwppbXBvcnQgbG9tYm9rLkFsbEFyZ3NDb25zdHJ1Y3RvcjsKaW1wb3J0IGxvbWJvay5CdWlsZGVyOwppbXBvcnQgbG9tYm9rLkRhdGE7CmltcG9ydCBsb21ib2suTm9BcmdzQ29uc3RydWN0b3I7CgpAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKQERhdGEKQE5vQXJnc0NvbnN0cnVjdG9yCkBBbGxBcmdzQ29uc3RydWN0b3IKQEJ1aWxkZXIKQFNjaGVtYShkZXNjcmlwdGlvbiA9ICLmupblop7lk6HlrozmlbTos4fmlpkiKQpwdWJsaWMgY2xhc3MgVXNlckF1ZGl0RGF0YVJlc1ZPIGV4dGVuZHMgQmFzZVJlc1ZPIHsKCglAU2NoZW1hKGRlc2NyaXB0aW9uID0gIua6luWinuWToeS4u+imgeizh+aWmSIpCglwcml2YXRlIFVzZXJSZXNWTyB1c2VyOwoKCUBTY2hlbWEoZGVzY3JpcHRpb24gPSAi5rqW5aKe5ZOh6Kmz57Sw6LOH5paZIikKCXByaXZhdGUgVXNlckRldGFpbFJlc1ZPIHVzZXJEZXRhaWw7CgoJQFNjaGVtYShkZXNjcmlwdGlvbiA9ICLmupblop7lk6Hlt6XkvZzntpPmrbfos4fmlpkiKQoJcHJpdmF0ZSBMaXN0PFVzZXJXb3JrUmVzVk8+IHVzZXJXb3JrczsKCglAU2NoZW1hKGRlc2NyaXB0aW9uID0gIua6luWinuWToeWFtuS7luW3peS9nOe2k+att+izh+aWmSIpCglwcml2YXRlIExpc3Q8VXNlcldvcmtPdGhlclJlc1ZPPiB1c2VyV29ya090aGVyczsKCglAU2NoZW1hKGRlc2NyaXB0aW9uID0gIua6luWinuWToeWFtuS7luW3peS9nOe2k+att+izh+aWmSIpCglwcml2YXRlIFVzZXJCYWNrZ3JvdW5kUmVzVk8gdXNlckJhY2tncm91bmQ7CgoJQFNjaGVtYShkZXNjcmlwdGlvbiA9ICLmupblop7lk6HkuIrlgrPmlofku7YiKQoJcHJpdmF0ZSBMaXN0PFVzZXJVcGxvYWREZWZpbmVSZXNWTz4gdXNlclVwbG9hZERlZmluZXM7CgoJQFNjaGVtYShkZXNjcmlwdGlvbiA9ICLmupblop7lk6Hln7rmnKzos4fmlpnos4fmlpnmqqLmn6XntZDmnpwiKQoJcHJpdmF0ZSBGbG93UmVjb3JkUmVzVk8gYmFzaWNGbG93UmVjb3JkOwoKCUBTY2hlbWEoZGVzY3JpcHRpb24gPSAi5rqW5aKe5ZOh6IOM5pmv6IGy5piO5qqi5p+l57WQ5p6cIikKCXByaXZhdGUgRmxvd1JlY29yZFJlc1ZPIGJhY2tncm91bmRGbG93UmVjb3JkOwoKCUBTY2hlbWEoZGVzY3JpcHRpb24gPSAi5rqW5aKe5ZOh5a2457aT5q235qqi5p+l57WQ5p6cIikKCXByaXZhdGUgRmxvd1JlY29yZFJlc1ZPIGVkdUZsb3dSZWNvcmQ7CgoJQFNjaGVtYShkZXNjcmlwdGlvbiA9ICLmupblop7lk6HlhazmnIPmh7LomZXntIDpjITmqqLmn6XntZDmnpwiKQoJcHJpdmF0ZSBGbG93UmVjb3JkUmVzVk8gbGlhRmxvd1JlY29yZDsKCglAU2NoZW1hKGRlc2NyaXB0aW9uID0gIua6luWinuWToea0l+mMoumYsuWItuiqv+afpee1kOaenOaqouafpee1kOaenCIpCglwcml2YXRlIEZsb3dSZWNvcmRSZXNWTyBsYXVGbG93UmVjb3JkOwoKCUBTY2hlbWEoZGVzY3JpcHRpb24gPSAi5a+p5qC45Lq65ZOhKOWKqeeQhinkuIrlgrPoo5zlhYXos4fmlpnmlofku7YiKQoJcHJpdmF0ZSBMaXN0PFVzZXJVcGxvYWREZWZpbmVSZXNWTz4gYXNzaXN0YW50VXBsb2FkRGVmaW5lczsKCglAU2NoZW1hKGRlc2NyaXB0aW9uID0gIuWvqeaguOS6uuWToSjntpPovqYp5LiK5YKz6KOc5YWF6LOH5paZ5paH5Lu2IikKCXByaXZhdGUgTGlzdDxVc2VyVXBsb2FkRGVmaW5lUmVzVk8+IG1hbmFnZXJVcGxvYWREZWZpbmVzOwoKCUBTY2hlbWEoZGVzY3JpcHRpb24gPSAi5bGk57Sa6Kq/5pW0IikKCXByaXZhdGUgTGlzdDxKb2JMaXN0UmVzVk8+IEpvYkxpc3Q7CgoJQFNjaGVtYShkZXNjcmlwdGlvbiA9ICLlr6nmoLjogIUiKQoJcHJpdmF0ZSBTdHJpbmcgYXBwcm92ZXI7CgoJQFNjaGVtYShkZXNjcmlwdGlvbiA9ICLmlofku7blr6nmn6Xpmo7mrrUiKQoJcHJpdmF0ZSBMaXN0PFN0YXR1c0hpc3RvcnlDaGFydFJlc1ZPPiBjaGVja0NoYXJ0czsKCglAU2NoZW1hKGRlc2NyaXB0aW9uID0gIuWgseiBmOewveaguOmajuautSIpCglwcml2YXRlIExpc3Q8U3RhdHVzSGlzdG9yeUNoYXJ0UmVzVk8+IGF1ZGl0Q2hhcnRzOwoKCXB1YmxpYyBCb29sZWFuIGlzVXNlclVwbG9hZEFsZXJ0ZWQoKSB7CgkJaWYgKHVzZXJVcGxvYWREZWZpbmVzID09IG51bGwgfHwgdXNlclVwbG9hZERlZmluZXMuc2l6ZSgpID09IDApIHsKCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKCQl9CgkJQm9vbGVhbiByZXN1bHQgPSBCb29sZWFuLlRSVUU7CgkJZm9yIChVc2VyVXBsb2FkRGVmaW5lUmVzVk8gdXNlclVwbG9hZERlZmluZVJlc1ZPIDogdXNlclVwbG9hZERlZmluZXMpIHsKCQkJaWYgKHVzZXJVcGxvYWREZWZpbmVSZXNWTy5nZXRBbGVydE1hcmsoKSAhPSBudWxsICYmIHVzZXJVcGxvYWREZWZpbmVSZXNWTy5nZXRBbGVydE1hcmsoKSA9PSAxKSB7CgkJCQlyZXN1bHQgPSBCb29sZWFuLkZBTFNFOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJcmV0dXJuIHJlc3VsdDsKCX0KCglwdWJsaWMgQm9vbGVhbiBpc0Jhc2ljUGFzc2VkKCkgewoJCWlmIChiYXNpY0Zsb3dSZWNvcmQgPT0gbnVsbCkgewoJCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwoJCX0KCQlyZXR1cm4gYmFzaWNGbG93UmVjb3JkLmlzUHJvY2Vzc1Jlc3VsdFkoKTsKCX0KCglwdWJsaWMgQm9vbGVhbiBpc0VkdVBhc3NlZCgpIHsKCQlpZiAoZWR1Rmxvd1JlY29yZCA9PSBudWxsKSB7CgkJCXJldHVybiBCb29sZWFuLlRSVUU7CgkJfQoJCXJldHVybiBlZHVGbG93UmVjb3JkLmlzUHJvY2Vzc1Jlc3VsdFkoKTsKCX0KCglwdWJsaWMgQm9vbGVhbiBpc0JhY2tncm91bmRQYXNzZWQoKSB7CgkJaWYgKGJhY2tncm91bmRGbG93UmVjb3JkID09IG51bGwpIHsKCQkJcmV0dXJuIEJvb2xlYW4uVFJVRTsKCQl9CgkJcmV0dXJuIGJhY2tncm91bmRGbG93UmVjb3JkLmlzUHJvY2Vzc1Jlc3VsdFkoKTsKCX0KCglwdWJsaWMgQm9vbGVhbiBpc0xpYUFuZExhdVBhc3NlZCgpIHsKCQlpZiAobGlhRmxvd1JlY29yZCA9PSBudWxsICYmIGxhdUZsb3dSZWNvcmQgPT0gbnVsbCkgewoJCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwoJCX0KCQlyZXR1cm4gIWxpYUZsb3dSZWNvcmQuaXNQcm9jZXNzUmVzdWx0WSgpICYmICFsYXVGbG93UmVjb3JkLmlzUHJvY2Vzc1Jlc3VsdFkoKTsKCX0KCglwdWJsaWMgQm9vbGVhbiBpc05vdEQwMygpIHsKCQlyZXR1cm4gdXNlci5nZXRTdGF0dXMoKSAhPSBTdGF0dXNUeXBlLkQwMzsKCX0KCgkvKua6luWinuWToeeLgOaFi+ebruWJjeS4jeaYr0QwNAoJICogdHVyZT3kuI3mmK9EMDQKCSAqIGZhbHNlPeaYr0QwNAoJICogKi8KCXB1YmxpYyBCb29sZWFuIGlzTm90RDA0KCkgewoJCXJldHVybiB1c2VyLmdldFN0YXR1cygpICE9IFN0YXR1c1R5cGUuRDA0OwoJfQoKCXB1YmxpYyBCb29sZWFuIGlzSGVhZFN0YXR1cygpIHsKCQlTdHJpbmcgam9iSWQgPSB1c2VyLmdldEpvYklkKCk7CgkJQm9vbGVhbiByZXN1bHQgPSBCb29sZWFuLkZBTFNFOwoJCWlmICh1c2VyLmdldFN0YXR1cygpID09IFN0YXR1c1R5cGUuRDEwKSB7CgkJCWlmICgiU1IiLmVxdWFscyhqb2JJZCkgfHwgIkNBIi5lcXVhbHMoam9iSWQpIHx8ICJTUyIuZXF1YWxzKGpvYklkKSB8fCAiU1NTIi5lcXVhbHMoam9iSWQpIHx8ICJTTSIuZXF1YWxzKGpvYklkKSB8fCAiQVNCIi5lcXVhbHMoam9iSWQpIHx8ICJBUyIuZXF1YWxzKGpvYklkKSB8fCAiQVNTIi5lcXVhbHMoam9iSWQpKSB7CgkJCQlyZXN1bHQgPSBCb29sZWFuLlRSVUU7CgkJCX0KCQl9IGVsc2UgaWYgKHVzZXIuZ2V0U3RhdHVzKCkgPT0gU3RhdHVzVHlwZS5EMTEpIHsKCQkJaWYgKCJVTU0iLmVxdWFscyhqb2JJZCkgfHwgIlVNQiIuZXF1YWxzKGpvYklkKSB8fCAiVU0iLmVxdWFscyhqb2JJZCkgfHwgIlVTTSIuZXF1YWxzKGpvYklkKSB8fCAiVUVNIi5lcXVhbHMoam9iSWQpKSB7CgkJCQlyZXN1bHQgPSBCb29sZWFuLlRSVUU7CgkJCX0KCQl9IGVsc2UgaWYgKHVzZXIuZ2V0U3RhdHVzKCkgPT0gU3RhdHVzVHlwZS5EMTIpIHsKCQkJaWYgKCJBTSIuZXF1YWxzKGpvYklkKSB8fCAiQVNNIi5lcXVhbHMoam9iSWQpIHx8ICJBRCIuZXF1YWxzKGpvYklkKSB8fCAiQVNEIi5lcXVhbHMoam9iSWQpIHx8ICJBVlAiLmVxdWFscyhqb2JJZCkpIHsKCQkJCXJlc3VsdCA9IEJvb2xlYW4uVFJVRTsKCQkJfQoJCS8vIDExNDAyMDA0NzctMDBf6Kq/5pW05aCx6IGY5paH5Lu25qqi5p+l5rWB56iL5Y+K5LiK5YKz5Yqf6IO95qyK6ZmQLeesrOS4gOmajuautQoJCX0gZWxzZSBpZiAodXNlci5nZXRTdGF0dXMoKSA9PSBTdGF0dXNUeXBlLkQwMyB8fCB1c2VyLmdldFN0YXR1cygpID09IFN0YXR1c1R5cGUuRDA1CgkJCQl8fCB1c2VyLmdldFN0YXR1cygpID09IFN0YXR1c1R5cGUuRDA2KSB7CgkJCXJlc3VsdCA9IEJvb2xlYW4uVFJVRTsKCQl9CgkJcmV0dXJuIHJlc3VsdDsKCX0KCglwdWJsaWMgU3RyaW5nIGdldFVzZXJVcGxvYWREZWZpbmVGaWxlVHlwZXMoKSB7CgkJU3RyaW5nIHJlc3VsdCA9ICIiOwoJCWZvciAoVXNlclVwbG9hZERlZmluZVJlc1ZPIHVzZXJVcGxvYWREZWZpbmUgOiB1c2VyVXBsb2FkRGVmaW5lcykgewoJCQlyZXN1bHQgKz0gdXNlclVwbG9hZERlZmluZS5nZXRGaWxlVHlwZSgpICsgIiwiICsgdXNlclVwbG9hZERlZmluZS5nZXRGaWxlSGVhZCgpICsgIjsiOwoJCX0KCQlpZiAoU3RyaW5nVXRpbHMuaXNCbGFuayhyZXN1bHQpKQoJCQlyZXR1cm4gIiI7CgkJcmV0dXJuIHJlc3VsdC5zdWJzdHJpbmcoMCwgcmVzdWx0Lmxlbmd0aCgpIC0gMSk7Cgl9CgoJcHVibGljIFN0cmluZyBnZXROZXh0U3RhdHVzKCkgewoJCUxpc3Q8U3RhdHVzSGlzdG9yeUNoYXJ0UmVzVk8+IGNoYXJ0cyA9IG5ldyBBcnJheUxpc3Q8U3RhdHVzSGlzdG9yeUNoYXJ0UmVzVk8+KCk7CgkJY2hhcnRzLmFkZEFsbCh0aGlzLmNoZWNrQ2hhcnRzKTsKCQljaGFydHMuYWRkQWxsKHRoaXMuYXVkaXRDaGFydHMpOwoJCVN0cmluZyByZXN1bHQgPSBudWxsOwoJCWZvciAoU3RhdHVzSGlzdG9yeUNoYXJ0UmVzVk8gc3RhdHVzSGlzdG9yeUNoYXJ0UmVzVk8gOiBjaGFydHMpIHsKCQkJaWYgKHN0YXR1c0hpc3RvcnlDaGFydFJlc1ZPLmdldE1vZGlmeVRpbWUoKSA9PSBudWxsKSB7CgkJCQlyZXN1bHQgPSBzdGF0dXNIaXN0b3J5Q2hhcnRSZXNWTy5nZXRTdGF0dXNDb2RlKCk7CgkJCQlicmVhazsKCQkJfQoJCX0KCQlyZXR1cm4gcmVzdWx0OwoJfQoKfQo=