目前格式:HTML/XML
```javascript
// Vue 實例初始化
var app = new Vue({
// 掛載到 <div id="app"> ...</div>
el: "#app",
// 資料模型
data: {
user: {
// 使用者 ID: 依 userType 決定要顯示 agentCode 或 userId
userId: [[*{T(com.taiwanlife.recruit.enums.UserType).AGENT == userType ? agentCode : userId}]],
// 業務員專屬註冊號
registerNo: [[*{T(com.taiwanlife.recruit.enums.UserType).AGENT == userType ? registerNo : ""}]],
// 使用者類型代碼
userType: [[*{T(com.taiwanlife.recruit.enums.UserType).valueOf(userType).code}]],
// 類型名稱
userTypeName: [[*{userType.name()}]],
// 業務員通路
agentChannel: [[*{T(com.taiwanlife.recruit.enums.UserType).AGENT == userType ? agentChannel : ""}]],
// 內勤角色類型
roleType: [[*{T(com.taiwanlife.recruit.enums.UserType).STAFF == userType ? roleType : ""}]],
},
// 下拉清單資料
areaCenters: [], // 區域中心
commUnits: [], // 通訊處
substituteList: [], // 代理人清單
// 時分陣列 (用於代理人時間選擇)
hour: [],
minute: [],
// 查詢條件
query: {
areaCenter: "",
commUnit: "",
recruitName: "",
recruitId: "",
startCreateDate: "",
endCreateDate: ""
},
// 代理人查詢條件
substituteQuery: {
centerCode: "",
agentCode: "",
userName: "",
substituteAgentCode: "",
substituteName: "",
startSubstituteDate: "",
startSubstituteHour: "",
startSubstituteMinute: "",
endSubstituteDate: "",
endSubstituteHour: "",
endSubstituteMinute: "",
// 預設 N,否則按鈕不顯示
substituteStatus: "N"
},
// 表格與列表資料
users: [],
table: {
// 定義欄位屬性: 可否排序、欄位 key、標題、排序方向
columns: [
{ sortable: true, field: "sysCode", title: "編號", direction: "" },
{ sortable: true, field: "createTime", title: "帳號申請日", direction: "", defaultSort: { direction: "desc" } },
{ sortable: true, field: "userName", title: "準增員", direction: "" },
{ sortable: true, field: "statusText", title: "目前進度", direction: "" },
{ sortable: true, field: "statusDocText", title: "報聘狀態", direction: "" },
{ sortable: true, field: "jobType", title: "類別", direction: "" },
{ sortable: true, field: "jobId", title: "擬任用職稱", direction: "" },
{ sortable: true, field: "commCode", title: "通訊處", direction: "" },
{ sortable: true, field: "dsRegisterId", title: "直屬主管", direction: "" },
{ sortable: true, field: "refRegisterId", title: "推薦人", direction: "" },
{ sortable: true, field: "buttonText", title: "待工作事項", direction: "" }
]
},
// 單筆流程資料,用於顯示進度
recruit: {
applyDocDate: "",
approveWindowCheckDate: "",
assistantCheckDate: "",
cbsAreaCenterManagerDate: "",
cbsBranchManagerDate: "",
cbsTestDate: "",
dsRegisterDate: "",
elearningStartaDate: "",
guildClassStatus: "",
guildExamStatus: "",
jobTypeDate: "",
preJobId: "",
preJobIdDate: "",
registerDate: "",
sysCode: "",
totalFinishDate: "",
userId: "",
userName: ""
},
// 步驟圖陣列,每步驟有狀態 status
charts: [
{ step: 1, title: "帳號申請", field: "registerDate", status: 0 },
{ step: 2, title: "直屬主管<br>帳號認證", field: "dsRegisterDate", status: 0 },
{ step: 3, title: "CBS<br>適性測驗", field: "cbsTestDate", status: 0 },
{ step: 4, title: "處經理<br>CBS面談", field: "cbsBranchManagerDate", status: 0 },
{ step: 5, title: "區域中心<br>CBS面談", field: "cbsAreaCenterManagerDate", status: 0,
subSteps: [
{ step: 1, title: "A. 公輔班 <br><span>(上課狀態)</span>", field: "guildClassStatus", status: 0 },
{ step: 2, title: "B. 公會考試<br><span>(報考狀態)</span>", field: "guildExamStatus", status: 0 }
]
},
{ step: 6, title: "處經理<br>職級初審", field: "jobTypeDate", status: 0 },
{ step: 7, title: "報聘文件<br>填寫", field: "applyDocDate", status: 0 },
{ step: 8, title: "處經理<br>職級複審", field: "preJobIdDate", status: 0 },
{ step: 9, title: "報聘文件<br>審核", field: "assistantCheckDate", status: 0 }
]
},
// 元件掛載前 (未用)
beforeMount() {},
// 掛載後呼叫 init
// 掛載後呼叫 init,此時 DOM 已準備好,可安全發起 AJAX 請求
mounted() {
// 在此階段呼叫 init(),開始第一次 AJAX 請求
this.init();
},
// 顯示用過濾器
filters: {
// 空值顯示「-」
formatEmpty(value, defaultValue) {
return value ? value : (defaultValue ? defaultValue : "-");
},
// 呼叫 ego.format.date 格式化
formatDate(value, delim) {
if (!value) return value;
return ego.format.date(value, delim);
},
// 按鈕文字
formatAction(buttonType) {
switch (buttonType) {
case 0: return "認證";
case 1: return "面談";
case 2: return "檢查";
case 3: return "簽核";
case 4: return "初審";
case 5: return "複審";
}
return "";
}
},
// 計算屬性
computed: {
// 取得預設排序欄
defaultColumn() {
var cols = this.table.columns.filter(c => c.defaultSort);
return cols.length ? cols[0] : this.table.columns[0];
},
// 目前排序欄位
sortedColumn() {
var col = this.table.columns.find(c => c.direction);
if (!col) {
col = this.defaultColumn;
col.direction = col.defaultSort.direction;
}
return col;
},
// 傳回排序後的 users
sortedUsers() {
var col = this.sortedColumn;
var data = this.users.concat().sort((a, b) => {
var v1 = a[col.field], v2 = b[col.field];
if (v1 == v2) return 0;
if (v1 == null) return 1;
if (v2 == null) return -1;
return v1 > v2 ? 1 : -1;
});
return col.direction === "desc" ? data.reverse() : data;
}
},
// 方法
methods: {
// 初始化:載入區域中心並搜尋
init() {
this.areaCenters = ego.ajax.getAreaCenters(this.user.agentChannel);
this.search();
},
// 區域中心變動時,重載通訊處
changeAreaCenter() {
this.query.commUnit = "";
if (this.query.areaCenter) {
this.commUnits = ego.ajax.getCommUnits(
this.query.areaCenter.agentChannel,
this.query.areaCenter.centerCode
);
} else {
this.commUnits = [];
}
},
// 處理日期選擇
handleDate(target, date) {
var id = $(target).attr("id");
this.query[id] = date;
// 同步限制前後日期
$(target).prev().datepicker("option", "maxDate", date);
$(target).next().datepicker("option", "minDate", date);
},
// 其他方法略...
// 主搜尋,並處理按鈕顯示邏輯
search() {
this.resetTable();
this.$nextTick(() => {
this.users = ego.ajax.queryDashBoard(this.getQueryModel());
// 依 buttonType/status 判斷 showButton, link, text
this.users.forEach((user, idx) => {
// ... 複雜邏輯,請參考原 code ...
});
});
},
// 重設表格
resetTable() {
this.users = [];
this.table.columns.forEach(c => c.direction = c.defaultSort ? c.defaultSort.direction : "");
}
// 其他 methods 可仿此添加註解
}
});
```
YGBgamF2YXNjcmlwdAoKLy8gVnVlIOWvpuS+i+WIneWni+WMlgoKdmFyIGFwcCA9IG5ldyBWdWUoewoKICAvLyDmjpvovInliLAgPGRpdiBpZD0iYXBwIj4gLi4uPC9kaXY+CgogIGVsOiAiI2FwcCIsCgoKCiAgLy8g6LOH5paZ5qih5Z6LCgogIGRhdGE6IHsKCiAgICB1c2VyOiB7CgogICAgICAvLyDkvb/nlKjogIUgSUQ6IOS+nSB1c2VyVHlwZSDmsbrlrpropoHpoa/npLogYWdlbnRDb2RlIOaIliB1c2VySWQKCiAgICAgIHVzZXJJZDogW1sqe1QoY29tLnRhaXdhbmxpZmUucmVjcnVpdC5lbnVtcy5Vc2VyVHlwZSkuQUdFTlQgPT0gdXNlclR5cGUgPyBhZ2VudENvZGUgOiB1c2VySWR9XV0sCgogICAgICAvLyDmpa3li5nlk6HlsIjlsazoqLvlhoromZ8KCiAgICAgIHJlZ2lzdGVyTm86IFtbKntUKGNvbS50YWl3YW5saWZlLnJlY3J1aXQuZW51bXMuVXNlclR5cGUpLkFHRU5UID09IHVzZXJUeXBlID8gcmVnaXN0ZXJObyA6ICIifV1dLAoKICAgICAgLy8g5L2/55So6ICF6aGe5Z6L5Luj56K8CgogICAgICB1c2VyVHlwZTogW1sqe1QoY29tLnRhaXdhbmxpZmUucmVjcnVpdC5lbnVtcy5Vc2VyVHlwZSkudmFsdWVPZih1c2VyVHlwZSkuY29kZX1dXSwKCiAgICAgIC8vIOmhnuWei+WQjeeosQoKICAgICAgdXNlclR5cGVOYW1lOiBbWyp7dXNlclR5cGUubmFtZSgpfV1dLAoKICAgICAgLy8g5qWt5YuZ5ZOh6YCa6LevCgogICAgICBhZ2VudENoYW5uZWw6IFtbKntUKGNvbS50YWl3YW5saWZlLnJlY3J1aXQuZW51bXMuVXNlclR5cGUpLkFHRU5UID09IHVzZXJUeXBlID8gYWdlbnRDaGFubmVsIDogIiJ9XV0sCgogICAgICAvLyDlhafli6Top5LoibLpoZ7lnosKCiAgICAgIHJvbGVUeXBlOiBbWyp7VChjb20udGFpd2FubGlmZS5yZWNydWl0LmVudW1zLlVzZXJUeXBlKS5TVEFGRiA9PSB1c2VyVHlwZSA/IHJvbGVUeXBlIDogIiJ9XV0sCgogICAgfSwKCgoKICAgIC8vIOS4i+aLiea4heWWruizh+aWmQoKICAgIGFyZWFDZW50ZXJzOiBbXSwgICAgICAgLy8g5Y2A5Z+f5Lit5b+DCgogICAgY29tbVVuaXRzOiBbXSwgICAgICAgICAvLyDpgJroqIromZUKCiAgICBzdWJzdGl0dXRlTGlzdDogW10sICAgIC8vIOS7o+eQhuS6uua4heWWrgoKCgogICAgLy8g5pmC5YiG6Zmj5YiXICjnlKjmlrzku6PnkIbkurrmmYLplpPpgbjmk4cpCgogICAgaG91cjogW10sCgogICAgbWludXRlOiBbXSwKCgoKICAgIC8vIOafpeipouaineS7tgoKICAgIHF1ZXJ5OiB7CgogICAgICBhcmVhQ2VudGVyOiAiIiwKCiAgICAgIGNvbW1Vbml0OiAiIiwKCiAgICAgIHJlY3J1aXROYW1lOiAiIiwKCiAgICAgIHJlY3J1aXRJZDogIiIsCgogICAgICBzdGFydENyZWF0ZURhdGU6ICIiLAoKICAgICAgZW5kQ3JlYXRlRGF0ZTogIiIKCiAgICB9LAoKCgogICAgLy8g5Luj55CG5Lq65p+l6Kmi5qKd5Lu2CgogICAgc3Vic3RpdHV0ZVF1ZXJ5OiB7CgogICAgICBjZW50ZXJDb2RlOiAiIiwKCiAgICAgIGFnZW50Q29kZTogIiIsCgogICAgICB1c2VyTmFtZTogIiIsCgogICAgICBzdWJzdGl0dXRlQWdlbnRDb2RlOiAiIiwKCiAgICAgIHN1YnN0aXR1dGVOYW1lOiAiIiwKCiAgICAgIHN0YXJ0U3Vic3RpdHV0ZURhdGU6ICIiLAoKICAgICAgc3RhcnRTdWJzdGl0dXRlSG91cjogIiIsCgogICAgICBzdGFydFN1YnN0aXR1dGVNaW51dGU6ICIiLAoKICAgICAgZW5kU3Vic3RpdHV0ZURhdGU6ICIiLAoKICAgICAgZW5kU3Vic3RpdHV0ZUhvdXI6ICIiLAoKICAgICAgZW5kU3Vic3RpdHV0ZU1pbnV0ZTogIiIsCgogICAgICAvLyDpoJDoqK0gTu+8jOWQpuWJh+aMiemIleS4jemhr+ekugoKICAgICAgc3Vic3RpdHV0ZVN0YXR1czogIk4iCgogICAgfSwKCgoKICAgIC8vIOihqOagvOiIh+WIl+ihqOizh+aWmQoKICAgIHVzZXJzOiBbXSwKCiAgICB0YWJsZTogewoKICAgICAgLy8g5a6a576p5qyE5L2N5bGs5oCnOiDlj6/lkKbmjpLluo/jgIHmrITkvY0ga2V544CB5qiZ6aGM44CB5o6S5bqP5pa55ZCRCgogICAgICBjb2x1bW5zOiBbCgogICAgICAgIHsgc29ydGFibGU6IHRydWUsIGZpZWxkOiAic3lzQ29kZSIsIHRpdGxlOiAi57eo6JmfIiwgZGlyZWN0aW9uOiAiIiB9LAoKICAgICAgICB7IHNvcnRhYmxlOiB0cnVlLCBmaWVsZDogImNyZWF0ZVRpbWUiLCB0aXRsZTogIuW4s+iZn+eUs+iri+aXpSIsIGRpcmVjdGlvbjogIiIsIGRlZmF1bHRTb3J0OiB7IGRpcmVjdGlvbjogImRlc2MiIH0gfSwKCiAgICAgICAgeyBzb3J0YWJsZTogdHJ1ZSwgZmllbGQ6ICJ1c2VyTmFtZSIsIHRpdGxlOiAi5rqW5aKe5ZOhIiwgZGlyZWN0aW9uOiAiIiB9LAoKICAgICAgICB7IHNvcnRhYmxlOiB0cnVlLCBmaWVsZDogInN0YXR1c1RleHQiLCB0aXRsZTogIuebruWJjemAsuW6piIsIGRpcmVjdGlvbjogIiIgfSwKCiAgICAgICAgeyBzb3J0YWJsZTogdHJ1ZSwgZmllbGQ6ICJzdGF0dXNEb2NUZXh0IiwgdGl0bGU6ICLloLHogZjni4DmhYsiLCBkaXJlY3Rpb246ICIiIH0sCgogICAgICAgIHsgc29ydGFibGU6IHRydWUsIGZpZWxkOiAiam9iVHlwZSIsIHRpdGxlOiAi6aGe5YilIiwgZGlyZWN0aW9uOiAiIiB9LAoKICAgICAgICB7IHNvcnRhYmxlOiB0cnVlLCBmaWVsZDogImpvYklkIiwgdGl0bGU6ICLmk6zku7vnlKjogbfnqLEiLCBkaXJlY3Rpb246ICIiIH0sCgogICAgICAgIHsgc29ydGFibGU6IHRydWUsIGZpZWxkOiAiY29tbUNvZGUiLCB0aXRsZTogIumAmuioiuiZlSIsIGRpcmVjdGlvbjogIiIgfSwKCiAgICAgICAgeyBzb3J0YWJsZTogdHJ1ZSwgZmllbGQ6ICJkc1JlZ2lzdGVySWQiLCB0aXRsZTogIuebtOWxrOS4u+euoSIsIGRpcmVjdGlvbjogIiIgfSwKCiAgICAgICAgeyBzb3J0YWJsZTogdHJ1ZSwgZmllbGQ6ICJyZWZSZWdpc3RlcklkIiwgdGl0bGU6ICLmjqjolqbkuroiLCBkaXJlY3Rpb246ICIiIH0sCgogICAgICAgIHsgc29ydGFibGU6IHRydWUsIGZpZWxkOiAiYnV0dG9uVGV4dCIsIHRpdGxlOiAi5b6F5bel5L2c5LqL6aCFIiwgZGlyZWN0aW9uOiAiIiB9CgogICAgICBdCgogICAgfSwKCgoKICAgIC8vIOWWruethua1geeoi+izh+aWme+8jOeUqOaWvOmhr+ekuumAsuW6pgoKICAgIHJlY3J1aXQ6IHsKCiAgICAgIGFwcGx5RG9jRGF0ZTogIiIsCgogICAgICBhcHByb3ZlV2luZG93Q2hlY2tEYXRlOiAiIiwKCiAgICAgIGFzc2lzdGFudENoZWNrRGF0ZTogIiIsCgogICAgICBjYnNBcmVhQ2VudGVyTWFuYWdlckRhdGU6ICIiLAoKICAgICAgY2JzQnJhbmNoTWFuYWdlckRhdGU6ICIiLAoKICAgICAgY2JzVGVzdERhdGU6ICIiLAoKICAgICAgZHNSZWdpc3RlckRhdGU6ICIiLAoKICAgICAgZWxlYXJuaW5nU3RhcnRhRGF0ZTogIiIsCgogICAgICBndWlsZENsYXNzU3RhdHVzOiAiIiwKCiAgICAgIGd1aWxkRXhhbVN0YXR1czogIiIsCgogICAgICBqb2JUeXBlRGF0ZTogIiIsCgogICAgICBwcmVKb2JJZDogIiIsCgogICAgICBwcmVKb2JJZERhdGU6ICIiLAoKICAgICAgcmVnaXN0ZXJEYXRlOiAiIiwKCiAgICAgIHN5c0NvZGU6ICIiLAoKICAgICAgdG90YWxGaW5pc2hEYXRlOiAiIiwKCiAgICAgIHVzZXJJZDogIiIsCgogICAgICB1c2VyTmFtZTogIiIKCiAgICB9LAoKCgogICAgLy8g5q2l6amf5ZyW6Zmj5YiX77yM5q+P5q2l6amf5pyJ54uA5oWLIHN0YXR1cwoKICAgIGNoYXJ0czogWwoKICAgICAgeyBzdGVwOiAxLCB0aXRsZTogIuW4s+iZn+eUs+iriyIsIGZpZWxkOiAicmVnaXN0ZXJEYXRlIiwgc3RhdHVzOiAwIH0sCgogICAgICB7IHN0ZXA6IDIsIHRpdGxlOiAi55u05bGs5Li7566hPGJyPuW4s+iZn+iqjeitiSIsIGZpZWxkOiAiZHNSZWdpc3RlckRhdGUiLCBzdGF0dXM6IDAgfSwKCiAgICAgIHsgc3RlcDogMywgdGl0bGU6ICJDQlM8YnI+6YGp5oCn5ris6amXIiwgZmllbGQ6ICJjYnNUZXN0RGF0ZSIsIHN0YXR1czogMCB9LAoKICAgICAgeyBzdGVwOiA0LCB0aXRsZTogIuiZlee2k+eQhjxicj5DQlPpnaLoq4ciLCBmaWVsZDogImNic0JyYW5jaE1hbmFnZXJEYXRlIiwgc3RhdHVzOiAwIH0sCgogICAgICB7IHN0ZXA6IDUsIHRpdGxlOiAi5Y2A5Z+f5Lit5b+DPGJyPkNCU+mdouirhyIsIGZpZWxkOiAiY2JzQXJlYUNlbnRlck1hbmFnZXJEYXRlIiwgc3RhdHVzOiAwLAoKICAgICAgICBzdWJTdGVwczogWwoKICAgICAgICAgIHsgc3RlcDogMSwgdGl0bGU6ICJBLiDlhazovJTnj60gPGJyPjxzcGFuPijkuIroqrLni4DmhYspPC9zcGFuPiIsIGZpZWxkOiAiZ3VpbGRDbGFzc1N0YXR1cyIsIHN0YXR1czogMCB9LAoKICAgICAgICAgIHsgc3RlcDogMiwgdGl0bGU6ICJCLiDlhazmnIPogIPoqaY8YnI+PHNwYW4+KOWgseiAg+eLgOaFiyk8L3NwYW4+IiwgZmllbGQ6ICJndWlsZEV4YW1TdGF0dXMiLCBzdGF0dXM6IDAgfQoKICAgICAgICBdCgogICAgICB9LAoKICAgICAgeyBzdGVwOiA2LCB0aXRsZTogIuiZlee2k+eQhjxicj7ogbfntJrliJ3lr6kiLCBmaWVsZDogImpvYlR5cGVEYXRlIiwgc3RhdHVzOiAwIH0sCgogICAgICB7IHN0ZXA6IDcsIHRpdGxlOiAi5aCx6IGY5paH5Lu2PGJyPuWhq+WvqyIsIGZpZWxkOiAiYXBwbHlEb2NEYXRlIiwgc3RhdHVzOiAwIH0sCgogICAgICB7IHN0ZXA6IDgsIHRpdGxlOiAi6JmV57aT55CGPGJyPuiBt+e0muikh+WvqSIsIGZpZWxkOiAicHJlSm9iSWREYXRlIiwgc3RhdHVzOiAwIH0sCgogICAgICB7IHN0ZXA6IDksIHRpdGxlOiAi5aCx6IGY5paH5Lu2PGJyPuWvqeaguCIsIGZpZWxkOiAiYXNzaXN0YW50Q2hlY2tEYXRlIiwgc3RhdHVzOiAwIH0KCiAgICBdCgogIH0sCgoKCiAgLy8g5YWD5Lu25o6b6LyJ5YmNICjmnKrnlKgpCgogIGJlZm9yZU1vdW50KCkge30sCgoKCiAgLy8g5o6b6LyJ5b6M5ZG85Y+rIGluaXQKCiAgICAvLyDmjpvovInlvozlkbzlj6sgaW5pdO+8jOatpOaZgiBET00g5bey5rqW5YKZ5aW977yM5Y+v5a6J5YWo55m86LW3IEFKQVgg6KuL5rGCCgogIG1vdW50ZWQoKSB7CgogICAgLy8g5Zyo5q2k6ZqO5q615ZG85Y+rIGluaXQoKe+8jOmWi+Wni+esrOS4gOasoSBBSkFYIOiri+axggoKICAgIHRoaXMuaW5pdCgpOwoKICB9LAoKCgoKCiAgLy8g6aGv56S655So6YGO5r++5ZmoCgogIGZpbHRlcnM6IHsKCiAgICAvLyDnqbrlgLzpoa/npLrjgIwt44CNCgogICAgZm9ybWF0RW1wdHkodmFsdWUsIGRlZmF1bHRWYWx1ZSkgewoKICAgICAgcmV0dXJuIHZhbHVlID8gdmFsdWUgOiAoZGVmYXVsdFZhbHVlID8gZGVmYXVsdFZhbHVlIDogIi0iKTsKCiAgICB9LAoKICAgIC8vIOWRvOWPqyBlZ28uZm9ybWF0LmRhdGUg5qC85byP5YyWCgogICAgZm9ybWF0RGF0ZSh2YWx1ZSwgZGVsaW0pIHsKCiAgICAgIGlmICghdmFsdWUpIHJldHVybiB2YWx1ZTsKCiAgICAgIHJldHVybiBlZ28uZm9ybWF0LmRhdGUodmFsdWUsIGRlbGltKTsKCiAgICB9LAoKICAgIC8vIOaMiemIleaWh+WtlwoKICAgIGZvcm1hdEFjdGlvbihidXR0b25UeXBlKSB7CgogICAgICBzd2l0Y2ggKGJ1dHRvblR5cGUpIHsKCiAgICAgICAgY2FzZSAwOiByZXR1cm4gIuiqjeitiSI7CgogICAgICAgIGNhc2UgMTogcmV0dXJuICLpnaLoq4ciOwoKICAgICAgICBjYXNlIDI6IHJldHVybiAi5qqi5p+lIjsKCiAgICAgICAgY2FzZSAzOiByZXR1cm4gIuewveaguCI7CgogICAgICAgIGNhc2UgNDogcmV0dXJuICLliJ3lr6kiOwoKICAgICAgICBjYXNlIDU6IHJldHVybiAi6KSH5a+pIjsKCiAgICAgIH0KCiAgICAgIHJldHVybiAiIjsKCiAgICB9CgogIH0sCgoKCiAgLy8g6KiI566X5bGs5oCnCgogIGNvbXB1dGVkOiB7CgogICAgLy8g5Y+W5b6X6aCQ6Kit5o6S5bqP5qyECgogICAgZGVmYXVsdENvbHVtbigpIHsKCiAgICAgIHZhciBjb2xzID0gdGhpcy50YWJsZS5jb2x1bW5zLmZpbHRlcihjID0+IGMuZGVmYXVsdFNvcnQpOwoKICAgICAgcmV0dXJuIGNvbHMubGVuZ3RoID8gY29sc1swXSA6IHRoaXMudGFibGUuY29sdW1uc1swXTsKCiAgICB9LAoKICAgIC8vIOebruWJjeaOkuW6j+ashOS9jQoKICAgIHNvcnRlZENvbHVtbigpIHsKCiAgICAgIHZhciBjb2wgPSB0aGlzLnRhYmxlLmNvbHVtbnMuZmluZChjID0+IGMuZGlyZWN0aW9uKTsKCiAgICAgIGlmICghY29sKSB7CgogICAgICAgIGNvbCA9IHRoaXMuZGVmYXVsdENvbHVtbjsKCiAgICAgICAgY29sLmRpcmVjdGlvbiA9IGNvbC5kZWZhdWx0U29ydC5kaXJlY3Rpb247CgogICAgICB9CgogICAgICByZXR1cm4gY29sOwoKICAgIH0sCgogICAgLy8g5YKz5Zue5o6S5bqP5b6M55qEIHVzZXJzCgogICAgc29ydGVkVXNlcnMoKSB7CgogICAgICB2YXIgY29sID0gdGhpcy5zb3J0ZWRDb2x1bW47CgogICAgICB2YXIgZGF0YSA9IHRoaXMudXNlcnMuY29uY2F0KCkuc29ydCgoYSwgYikgPT4gewoKICAgICAgICB2YXIgdjEgPSBhW2NvbC5maWVsZF0sIHYyID0gYltjb2wuZmllbGRdOwoKICAgICAgICBpZiAodjEgPT0gdjIpIHJldHVybiAwOwoKICAgICAgICBpZiAodjEgPT0gbnVsbCkgcmV0dXJuIDE7CgogICAgICAgIGlmICh2MiA9PSBudWxsKSByZXR1cm4gLTE7CgogICAgICAgIHJldHVybiB2MSA+IHYyID8gMSA6IC0xOwoKICAgICAgfSk7CgogICAgICByZXR1cm4gY29sLmRpcmVjdGlvbiA9PT0gImRlc2MiID8gZGF0YS5yZXZlcnNlKCkgOiBkYXRhOwoKICAgIH0KCiAgfSwKCgoKICAvLyDmlrnms5UKCiAgbWV0aG9kczogewoKICAgIC8vIOWIneWni+WMlu+8mui8ieWFpeWNgOWfn+S4reW/g+S4puaQnOWwiwoKICAgIGluaXQoKSB7CgogICAgICB0aGlzLmFyZWFDZW50ZXJzID0gZWdvLmFqYXguZ2V0QXJlYUNlbnRlcnModGhpcy51c2VyLmFnZW50Q2hhbm5lbCk7CgogICAgICB0aGlzLnNlYXJjaCgpOwoKICAgIH0sCgogICAgLy8g5Y2A5Z+f5Lit5b+D6K6K5YuV5pmC77yM6YeN6LyJ6YCa6KiK6JmVCgogICAgY2hhbmdlQXJlYUNlbnRlcigpIHsKCiAgICAgIHRoaXMucXVlcnkuY29tbVVuaXQgPSAiIjsKCiAgICAgIGlmICh0aGlzLnF1ZXJ5LmFyZWFDZW50ZXIpIHsKCiAgICAgICAgdGhpcy5jb21tVW5pdHMgPSBlZ28uYWpheC5nZXRDb21tVW5pdHMoCgogICAgICAgICAgdGhpcy5xdWVyeS5hcmVhQ2VudGVyLmFnZW50Q2hhbm5lbCwKCiAgICAgICAgICB0aGlzLnF1ZXJ5LmFyZWFDZW50ZXIuY2VudGVyQ29kZQoKICAgICAgICApOwoKICAgICAgfSBlbHNlIHsKCiAgICAgICAgdGhpcy5jb21tVW5pdHMgPSBbXTsKCiAgICAgIH0KCiAgICB9LAoKICAgIC8vIOiZleeQhuaXpeacn+mBuOaThwoKICAgIGhhbmRsZURhdGUodGFyZ2V0LCBkYXRlKSB7CgogICAgICB2YXIgaWQgPSAkKHRhcmdldCkuYXR0cigiaWQiKTsKCiAgICAgIHRoaXMucXVlcnlbaWRdID0gZGF0ZTsKCiAgICAgIC8vIOWQjOatpemZkOWItuWJjeW+jOaXpeacnwoKICAgICAgJCh0YXJnZXQpLnByZXYoKS5kYXRlcGlja2VyKCJvcHRpb24iLCAibWF4RGF0ZSIsIGRhdGUpOwoKICAgICAgJCh0YXJnZXQpLm5leHQoKS5kYXRlcGlja2VyKCJvcHRpb24iLCAibWluRGF0ZSIsIGRhdGUpOwoKICAgIH0sCgogICAgLy8g5YW25LuW5pa55rOV55WlLi4uCgoKCiAgICAvLyDkuLvmkJzlsIvvvIzkuKbomZXnkIbmjInpiJXpoa/npLrpgo/ovK8KCiAgICBzZWFyY2goKSB7CgogICAgICB0aGlzLnJlc2V0VGFibGUoKTsKCiAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHsKCiAgICAgICAgdGhpcy51c2VycyA9IGVnby5hamF4LnF1ZXJ5RGFzaEJvYXJkKHRoaXMuZ2V0UXVlcnlNb2RlbCgpKTsKCiAgICAgICAgLy8g5L6dIGJ1dHRvblR5cGUvc3RhdHVzIOWIpOaWtyBzaG93QnV0dG9uLCBsaW5rLCB0ZXh0CgogICAgICAgIHRoaXMudXNlcnMuZm9yRWFjaCgodXNlciwgaWR4KSA9PiB7CgogICAgICAgICAgLy8gLi4uIOikh+mbnOmCj+i8r++8jOiri+WPg+iAg+WOnyBjb2RlIC4uLgoKICAgICAgICB9KTsKCiAgICAgIH0pOwoKICAgIH0sCgogICAgLy8g6YeN6Kit6KGo5qC8CgogICAgcmVzZXRUYWJsZSgpIHsKCiAgICAgIHRoaXMudXNlcnMgPSBbXTsKCiAgICAgIHRoaXMudGFibGUuY29sdW1ucy5mb3JFYWNoKGMgPT4gYy5kaXJlY3Rpb24gPSBjLmRlZmF1bHRTb3J0ID8gYy5kZWZhdWx0U29ydC5kaXJlY3Rpb24gOiAiIik7CgogICAgfQoKICAgIC8vIOWFtuS7liBtZXRob2RzIOWPr+S7v+atpOa3u+WKoOiou+inowoKICB9Cgp9KTsKCmBgYAo=