@cartanova/qgrid-cli 2.6.1 → 2.6.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +2 -0
- package/README.md +2 -0
- package/bundle/dist/application/qgrid/oauth.js +21 -3
- package/bundle/dist/application/qgrid/qgrid.dispatcher.js +40 -6
- package/bundle/dist/application/qgrid/qgrid.frame.js +47 -19
- package/bundle/dist/application/qgrid/qgrid.types.js +13 -3
- package/bundle/dist/application/qgrid/token-death.js +77 -0
- package/bundle/dist/application/queries.generated.js +3 -2
- package/bundle/dist/application/request-log/request-log.model.js +105 -31
- package/bundle/dist/application/request-log-step/request-log-step.model.js +1 -1
- package/bundle/dist/application/sonamu.generated.js +60 -5
- package/bundle/dist/application/sonamu.generated.sso.js +18 -2
- package/bundle/dist/application/token/token.model.js +53 -2
- package/bundle/dist/i18n/en.js +3 -1
- package/bundle/dist/i18n/ko.js +3 -1
- package/bundle/dist/i18n/sd.generated.js +18 -1
- package/bundle/dist/migrations/20260807133553_manual__backfill_request_log_cost.js +49 -0
- package/bundle/dist/migrations/20260807145144_alter_request_logs_alter1.js +13 -0
- package/bundle/dist/migrations/20260807164057_alter_request_logs_alter1.js +13 -0
- package/bundle/dist/server-error-handler.js +5 -3
- package/bundle/dist/sonamu.config.js +5 -1
- package/bundle/dist/utils/providers/openai/openai-refresh.js +12 -1
- package/bundle/dist/utils/slack-notify.js +65 -0
- package/bundle/src/application/qgrid/oauth.ts +20 -1
- package/bundle/src/application/qgrid/qgrid-oauth-redirect.test.ts +15 -3
- package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +30 -2
- package/bundle/src/application/qgrid/qgrid.dispatcher.ts +44 -6
- package/bundle/src/application/qgrid/qgrid.frame.ts +67 -47
- package/bundle/src/application/qgrid/qgrid.types.ts +10 -0
- package/bundle/src/application/qgrid/token-death.test.ts +150 -0
- package/bundle/src/application/qgrid/token-death.ts +96 -0
- package/bundle/src/application/queries.generated.ts +5 -2
- package/bundle/src/application/request-log/request-log.entity.json +46 -7
- package/bundle/src/application/request-log/request-log.model.test.ts +153 -42
- package/bundle/src/application/request-log/request-log.model.ts +136 -50
- package/bundle/src/application/sonamu.generated.http +19 -1
- package/bundle/src/application/sonamu.generated.sso.ts +16 -0
- package/bundle/src/application/sonamu.generated.ts +58 -3
- package/bundle/src/application/token/token.model.test.ts +49 -0
- package/bundle/src/application/token/token.model.ts +75 -0
- package/bundle/src/i18n/en.ts +3 -0
- package/bundle/src/i18n/ko.ts +3 -0
- package/bundle/src/i18n/sd.generated.ts +17 -0
- package/bundle/src/migrations/20260807133553_manual__backfill_request_log_cost.ts +110 -0
- package/bundle/src/migrations/20260807145144_alter_request_logs_alter1.ts +13 -0
- package/bundle/src/migrations/20260807164057_alter_request_logs_alter1.ts +13 -0
- package/bundle/src/server-error-handler.test.ts +58 -0
- package/bundle/src/server-error-handler.ts +16 -5
- package/bundle/src/sonamu.config.ts +6 -0
- package/bundle/src/utils/providers/openai/openai-refresh.ts +17 -0
- package/bundle/src/utils/slack-notify.test.ts +97 -0
- package/bundle/src/utils/slack-notify.ts +74 -0
- package/bundle/web-dist/client/assets/index-BGQSGMcK.css +1 -0
- package/bundle/web-dist/client/assets/index-CnNT0mdq.js +78 -0
- package/bundle/web-dist/client/assets/logs-DCY81UWb.js +1 -0
- package/bundle/web-dist/client/assets/{monit-CyqMmy1G.js → monit-D5OoAday.js} +1 -1
- package/bundle/web-dist/client/assets/routes-B4D9C86u.js +5 -0
- package/bundle/web-dist/client/assets/{sd.generated-CjW3rfJ8.js → sd.generated-DYdwSB2I.js} +1 -1
- package/bundle/web-dist/client/assets/{services.generated-BuT6Gp8V.js → services.generated-BsAvotjG.js} +1 -1
- package/bundle/web-dist/client/assets/{show-C5WxfoAt.js → show-BSX8ii7Z.js} +3 -3
- package/bundle/web-dist/client/assets/tokens-Gapk41cz.js +1 -0
- package/bundle/web-dist/client/assets/{use-update-token-mutation-DBkxL29Y.js → use-update-token-mutation-DqEpK7It.js} +1 -1
- package/bundle/web-dist/client/index.html +3 -3
- package/bundle/web-dist/server/assets/{lazyRouteComponent-PRxXWW3t.js → lazyRouteComponent-BaZaveNc.js} +1 -1
- package/bundle/web-dist/server/assets/{logs-D0z1Ghj1.js → logs-DMOw3SjD.js} +91 -42
- package/bundle/web-dist/server/assets/{monit-dBXxnAyI.js → monit-UmcqHroX.js} +2 -2
- package/bundle/web-dist/server/assets/{routes-B3p7fuwk.js → routes-Sv_4FjtH.js} +52 -46
- package/bundle/web-dist/server/assets/{sd.generated-ek-tz-7H.js → sd.generated-B0xqnHEo.js} +21 -0
- package/bundle/web-dist/server/assets/{services.generated-BNuxWs7K.js → services.generated-DqAKskAS.js} +23 -8
- package/bundle/web-dist/server/assets/{show-0iNioJ2I.js → show-C-oSdzHX.js} +31 -25
- package/bundle/web-dist/server/assets/{tokens-CvytQ9Xy.js → tokens-h-2A3wfD.js} +292 -191
- package/bundle/web-dist/server/assets/{use-update-token-mutation-BBCC2GKM.js → use-update-token-mutation-DHCaa7Ku.js} +1 -1
- package/bundle/web-dist/server/entry-server.generated.js +70 -29
- package/package.json +1 -1
- package/skills/qgrid/references/cli-env-and-server-boot.md +8 -0
- package/skills/qgrid/references/token-auth-quota-lifecycle.md +11 -0
- package/bundle/web-dist/client/assets/index-BGGBFmzE.js +0 -78
- package/bundle/web-dist/client/assets/index-GA9b-zy4.css +0 -1
- package/bundle/web-dist/client/assets/logs-Dh19u6Tk.js +0 -1
- package/bundle/web-dist/client/assets/routes-Cy0gCq8c.js +0 -5
- package/bundle/web-dist/client/assets/tokens-Ciolqw4l.js +0 -1
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { getRefreshToken } from "../../utils/providers/common/credentials.js";
|
|
2
|
+
import { TokenModel } from "../token/token.model.js";
|
|
3
|
+
import { SLACK_COLOR, notifySlack } from "../../utils/slack-notify.js";
|
|
4
|
+
import { getLogger } from "@logtape/logtape";
|
|
5
|
+
//#region src/application/qgrid/token-death.ts
|
|
6
|
+
/**
|
|
7
|
+
* 세션 만료(auth-dead) 토큰의 라우팅 제외 지점.
|
|
8
|
+
*
|
|
9
|
+
* refresh 가 재로그인 외 복구 불가한 실패를 반환한 순간에만 호출된다. 비활성화는
|
|
10
|
+
* `active=true` 조건부 갱신 1회이고, 그 갱신을 이긴 프로세스만 Slack 알림을 보낸다 —
|
|
11
|
+
* 공유 DB 를 쓰는 인스턴스가 몇이든 사건당 알림은 1건이다.
|
|
12
|
+
*/
|
|
13
|
+
const logger = getLogger(["qgrid", "token-death"]);
|
|
14
|
+
/**
|
|
15
|
+
* @param usedRefreshToken 실패한 요청이 실제로 사용한 refresh token.
|
|
16
|
+
* refresh token 은 회전 저장되므로, 이미 회전된 옛 토큰으로 늦게 도착한 재시도가
|
|
17
|
+
* 400 을 받는 것은 정상 레이스다. DB 의 현재 값과 다르면 사망으로 보지 않는다.
|
|
18
|
+
* @param reasonCode `provider:code` 형태의 내부 코드. provider 응답 본문에는 계정 이메일이나
|
|
19
|
+
* 토큰 조각이 섞일 수 있어 raw 메시지를 그대로 알림에 싣지 않는다.
|
|
20
|
+
*/
|
|
21
|
+
async function deactivateAuthDeadToken(token, usedRefreshToken, reasonCode) {
|
|
22
|
+
const current = await TokenModel.findOne("A", { id: token.id });
|
|
23
|
+
if (!current) return false;
|
|
24
|
+
const currentRefreshToken = getRefreshToken(current.credentials);
|
|
25
|
+
if (currentRefreshToken && currentRefreshToken !== usedRefreshToken) {
|
|
26
|
+
logger.info(`skipping auth-death for ${token.name}(id=${token.id}): refresh token rotated since this attempt`);
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
const { deactivated, keptAsLastActive } = await TokenModel.deactivateIfActive(token.id);
|
|
30
|
+
if (!deactivated) {
|
|
31
|
+
if (keptAsLastActive) notifyLastActiveTokenDying(token, reasonCode);
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
logger.warn(`token deactivated (auth dead): ${token.name}(id=${token.id}) reason=${reasonCode}`);
|
|
35
|
+
notifySlack({
|
|
36
|
+
title: "세션 만료",
|
|
37
|
+
subject: token.name,
|
|
38
|
+
context: `${token.provider} · ${reasonCode} · 재로그인이 필요합니다`,
|
|
39
|
+
color: SLACK_COLOR.bad
|
|
40
|
+
});
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* 마지막 활성 토큰이 죽었을 때의 알림 쿨다운.
|
|
45
|
+
*
|
|
46
|
+
* 이 경우 토큰은 비활성화되지 않고 살아남으므로, 뒤따르는 요청마다 같은 실패를 반복해
|
|
47
|
+
* 알림이 폭주한다. 비활성화 성공 경로가 조건부 UPDATE 로 중복을 막는 것과 달리 여기엔
|
|
48
|
+
* 상태 변화가 없어 DB 로 억제할 수 없다 — provider 단위로 시간 창을 둔다.
|
|
49
|
+
*/
|
|
50
|
+
const LAST_ACTIVE_ALERT_COOLDOWN_MS = 1800 * 1e3;
|
|
51
|
+
const lastActiveAlertAt = /* @__PURE__ */ new Map();
|
|
52
|
+
function notifyLastActiveTokenDying(token, reasonCode) {
|
|
53
|
+
const now = Date.now();
|
|
54
|
+
const previous = lastActiveAlertAt.get(token.provider);
|
|
55
|
+
if (previous !== void 0 && now - previous < LAST_ACTIVE_ALERT_COOLDOWN_MS) return;
|
|
56
|
+
lastActiveAlertAt.set(token.provider, now);
|
|
57
|
+
notifySlack({
|
|
58
|
+
title: "마지막 토큰 사망",
|
|
59
|
+
subject: token.name,
|
|
60
|
+
context: `${token.provider} · ${reasonCode} · 풀이 비지 않도록 유지 중입니다. 전 토큰이 동시에 실패했다면 client_id 취소나 OAuth 계약 변경을 의심하세요`,
|
|
61
|
+
color: SLACK_COLOR.bad
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
/** 로그인이 완료돼 토큰이 저장됐을 때. 신규·재로그인을 가리지 않는다. */
|
|
65
|
+
function notifyTokenAdded(name, provider) {
|
|
66
|
+
logger.info(`token added: ${name} (${provider})`);
|
|
67
|
+
notifySlack({
|
|
68
|
+
title: "토큰 추가",
|
|
69
|
+
subject: name,
|
|
70
|
+
context: `${provider} · 요청 처리에 사용됩니다`,
|
|
71
|
+
color: SLACK_COLOR.good
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
//#endregion
|
|
75
|
+
export { deactivateAuthDeadToken, notifyTokenAdded };
|
|
76
|
+
|
|
77
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9rZW4tZGVhdGguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3FncmlkL3Rva2VuLWRlYXRoLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog7IS47IWYIOunjOujjChhdXRoLWRlYWQpIO2GoO2BsOydmCDrnbzsmrDtjIUg7KCc7Jm4IOyngOygkC5cbiAqXG4gKiByZWZyZXNoIOqwgCDsnqzroZzqt7jsnbgg7Jm4IOuzteq1rCDrtojqsIDtlZwg7Iuk7Yyo66W8IOuwmO2ZmO2VnCDsiJzqsITsl5Drp4wg7Zi47Lac65Cc64ukLiDruYTtmZzshLHtmZTripRcbiAqIGBhY3RpdmU9dHJ1ZWAg7KGw6rG067aAIOqwseyLoCAx7ZqM7J206rOgLCDqt7gg6rCx7Iug7J2EIOydtOq4tCDtlITroZzshLjsiqTrp4wgU2xhY2sg7JWM66a87J2EIOuztOuCuOuLpCDigJRcbiAqIOqzteycoCBEQiDrpbwg7JOw64qUIOyduOyKpO2EtOyKpOqwgCDrqofsnbTrk6Ag7IKs6rG064u5IOyVjOumvOydgCAx6rG07J2064ukLlxuICovXG5pbXBvcnQgeyBnZXRMb2dnZXIgfSBmcm9tIFwiQGxvZ3RhcGUvbG9ndGFwZVwiO1xuXG5pbXBvcnQgeyBnZXRSZWZyZXNoVG9rZW4gfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9jcmVkZW50aWFsc1wiO1xuaW1wb3J0IHsgbm90aWZ5U2xhY2ssIFNMQUNLX0NPTE9SIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3NsYWNrLW5vdGlmeVwiO1xuaW1wb3J0IHsgVG9rZW5Nb2RlbCB9IGZyb20gXCIuLi90b2tlbi90b2tlbi5tb2RlbFwiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJ0b2tlbi1kZWF0aFwiXSk7XG5cbnR5cGUgRGVhZFRva2VuUmVmID0ge1xuICBpZDogbnVtYmVyO1xuICBuYW1lOiBzdHJpbmc7XG4gIHByb3ZpZGVyOiBzdHJpbmc7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB1c2VkUmVmcmVzaFRva2VuIOyLpO2MqO2VnCDsmpTssq3snbQg7Iuk7KCc66GcIOyCrOyaqe2VnCByZWZyZXNoIHRva2VuLlxuICogICByZWZyZXNoIHRva2VuIOydgCDtmozsoIQg7KCA7J6l65CY66+A66GcLCDsnbTrr7gg7ZqM7KCE65CcIOyYmyDthqDtgbDsnLzroZwg64qm6rKMIOuPhOywqe2VnCDsnqzsi5zrj4TqsIBcbiAqICAgNDAwIOydhCDrsJvripQg6rKD7J2AIOygleyDgSDroIjsnbTsiqTri6QuIERCIOydmCDtmITsnqwg6rCS6rO8IOuLpOultOuptCDsgqzrp53snLzroZwg67O07KeAIOyViuuKlOuLpC5cbiAqIEBwYXJhbSByZWFzb25Db2RlIGBwcm92aWRlcjpjb2RlYCDtmJXtg5zsnZgg64K067aAIOy9lOuTnC4gcHJvdmlkZXIg7J2R64u1IOuzuOusuOyXkOuKlCDqs4TsoJUg7J2066mU7J287J2064KYXG4gKiAgIO2GoO2BsCDsobDqsIHsnbQg7ISe7J28IOyImCDsnojslrQgcmF3IOuplOyLnOyngOulvCDqt7jrjIDroZwg7JWM66a87JeQIOyLo+yngCDslYrripTri6QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWFjdGl2YXRlQXV0aERlYWRUb2tlbihcbiAgdG9rZW46IERlYWRUb2tlblJlZixcbiAgdXNlZFJlZnJlc2hUb2tlbjogc3RyaW5nLFxuICByZWFzb25Db2RlOiBzdHJpbmcsXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgY3VycmVudCA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE9uZShcIkFcIiwgeyBpZDogdG9rZW4uaWQgfSk7XG4gIGlmICghY3VycmVudCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNvbnN0IGN1cnJlbnRSZWZyZXNoVG9rZW4gPSBnZXRSZWZyZXNoVG9rZW4oY3VycmVudC5jcmVkZW50aWFscyk7XG4gIGlmIChjdXJyZW50UmVmcmVzaFRva2VuICYmIGN1cnJlbnRSZWZyZXNoVG9rZW4gIT09IHVzZWRSZWZyZXNoVG9rZW4pIHtcbiAgICBsb2dnZXIuaW5mbyhcbiAgICAgIGBza2lwcGluZyBhdXRoLWRlYXRoIGZvciAke3Rva2VuLm5hbWV9KGlkPSR7dG9rZW4uaWR9KTogcmVmcmVzaCB0b2tlbiByb3RhdGVkIHNpbmNlIHRoaXMgYXR0ZW1wdGAsXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB7IGRlYWN0aXZhdGVkLCBrZXB0QXNMYXN0QWN0aXZlIH0gPSBhd2FpdCBUb2tlbk1vZGVsLmRlYWN0aXZhdGVJZkFjdGl2ZSh0b2tlbi5pZCk7XG4gIGlmICghZGVhY3RpdmF0ZWQpIHtcbiAgICBpZiAoa2VwdEFzTGFzdEFjdGl2ZSkgbm90aWZ5TGFzdEFjdGl2ZVRva2VuRHlpbmcodG9rZW4sIHJlYXNvbkNvZGUpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGxvZ2dlci53YXJuKGB0b2tlbiBkZWFjdGl2YXRlZCAoYXV0aCBkZWFkKTogJHt0b2tlbi5uYW1lfShpZD0ke3Rva2VuLmlkfSkgcmVhc29uPSR7cmVhc29uQ29kZX1gKTtcbiAgdm9pZCBub3RpZnlTbGFjayh7XG4gICAgdGl0bGU6IFwi7IS47IWYIOunjOujjFwiLFxuICAgIHN1YmplY3Q6IHRva2VuLm5hbWUsXG4gICAgY29udGV4dDogYCR7dG9rZW4ucHJvdmlkZXJ9IMK3ICR7cmVhc29uQ29kZX0gwrcg7J6s66Gc6re47J247J20IO2VhOyalO2VqeuLiOuLpGAsXG4gICAgY29sb3I6IFNMQUNLX0NPTE9SLmJhZCxcbiAgfSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIOuniOyngOuniSDtmZzshLEg7Yag7YGw7J20IOyjveyXiOydhCDrlYzsnZgg7JWM66a8IOy/qOuLpOyatC5cbiAqXG4gKiDsnbQg6rK97JqwIO2GoO2BsOydgCDruYTtmZzshLHtmZTrkJjsp4Ag7JWK6rOgIOyCtOyVhOuCqOycvOuvgOuhnCwg65Kk65Sw66W064qUIOyalOyyreuniOuLpCDqsJnsnYAg7Iuk7Yyo66W8IOuwmOuzte2VtFxuICog7JWM66a87J20IO2PreyjvO2VnOuLpC4g67mE7Zmc7ISx7ZmUIOyEseqztSDqsr3roZzqsIAg7KGw6rG067aAIFVQREFURSDroZwg7KSR67O17J2EIOunieuKlCDqsoPqs7wg64us66asIOyXrOq4sOyXlFxuICog7IOB7YOcIOuzgO2ZlOqwgCDsl4bslrQgREIg66GcIOyWteygnO2VoCDsiJgg7JeG64ukIOKAlCBwcm92aWRlciDri6jsnITroZwg7Iuc6rCEIOywveydhCDrkZTri6QuXG4gKi9cbmNvbnN0IExBU1RfQUNUSVZFX0FMRVJUX0NPT0xET1dOX01TID0gMzAgKiA2MCAqIDEwMDA7XG5jb25zdCBsYXN0QWN0aXZlQWxlcnRBdCA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG5cbmZ1bmN0aW9uIG5vdGlmeUxhc3RBY3RpdmVUb2tlbkR5aW5nKHRva2VuOiBEZWFkVG9rZW5SZWYsIHJlYXNvbkNvZGU6IHN0cmluZyk6IHZvaWQge1xuICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICBjb25zdCBwcmV2aW91cyA9IGxhc3RBY3RpdmVBbGVydEF0LmdldCh0b2tlbi5wcm92aWRlcik7XG4gIGlmIChwcmV2aW91cyAhPT0gdW5kZWZpbmVkICYmIG5vdyAtIHByZXZpb3VzIDwgTEFTVF9BQ1RJVkVfQUxFUlRfQ09PTERPV05fTVMpIHJldHVybjtcbiAgbGFzdEFjdGl2ZUFsZXJ0QXQuc2V0KHRva2VuLnByb3ZpZGVyLCBub3cpO1xuXG4gIHZvaWQgbm90aWZ5U2xhY2soe1xuICAgIHRpdGxlOiBcIuuniOyngOuniSDthqDtgbAg7IKs66edXCIsXG4gICAgc3ViamVjdDogdG9rZW4ubmFtZSxcbiAgICBjb250ZXh0OlxuICAgICAgYCR7dG9rZW4ucHJvdmlkZXJ9IMK3ICR7cmVhc29uQ29kZX0gwrcg7ZKA7J20IOu5hOyngCDslYrrj4TroZ0g7Jyg7KeAIOykkeyeheuLiOuLpC4gYCArXG4gICAgICBg7KCEIO2GoO2BsOydtCDrj5nsi5zsl5Ag7Iuk7Yyo7ZaI64uk66m0IGNsaWVudF9pZCDst6jshozrgpggT0F1dGgg6rOE7JW9IOuzgOqyveydhCDsnZjsi6ztlZjshLjsmpRgLFxuICAgIGNvbG9yOiBTTEFDS19DT0xPUi5iYWQsXG4gIH0pO1xufVxuXG4vKiog66Gc6re47J247J20IOyZhOujjOuPvCDthqDtgbDsnbQg7KCA7J6l65CQ7J2EIOuVjC4g7Iug6recwrfsnqzroZzqt7jsnbjsnYQg6rCA66as7KeAIOyViuuKlOuLpC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3RpZnlUb2tlbkFkZGVkKG5hbWU6IHN0cmluZywgcHJvdmlkZXI6IHN0cmluZyk6IHZvaWQge1xuICBsb2dnZXIuaW5mbyhgdG9rZW4gYWRkZWQ6ICR7bmFtZX0gKCR7cHJvdmlkZXJ9KWApO1xuICB2b2lkIG5vdGlmeVNsYWNrKHtcbiAgICB0aXRsZTogXCLthqDtgbAg7LaU6rCAXCIsXG4gICAgc3ViamVjdDogbmFtZSxcbiAgICBjb250ZXh0OiBgJHtwcm92aWRlcn0gwrcg7JqU7LKtIOyymOumrOyXkCDsgqzsmqnrkKnri4jri6RgLFxuICAgIGNvbG9yOiBTTEFDS19DT0xPUi5nb29kLFxuICB9KTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBYUEsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLGFBQWEsQ0FBQzs7Ozs7Ozs7QUFlakQsZUFBc0Isd0JBQ3BCLE9BQ0Esa0JBQ0EsWUFDa0I7Q0FDbEIsTUFBTSxVQUFVLE1BQU0sV0FBVyxRQUFRLEtBQUssRUFBRSxJQUFJLE1BQU0sR0FBRyxDQUFDO0NBQzlELElBQUksQ0FBQyxTQUFTLE9BQU87Q0FFckIsTUFBTSxzQkFBc0IsZ0JBQWdCLFFBQVEsV0FBVztDQUMvRCxJQUFJLHVCQUF1Qix3QkFBd0Isa0JBQWtCO0VBQ25FLE9BQU8sS0FDTCwyQkFBMkIsTUFBTSxLQUFLLE1BQU0sTUFBTSxHQUFHLDRDQUN2RDtFQUNBLE9BQU87Q0FDVDtDQUVBLE1BQU0sRUFBRSxhQUFhLHFCQUFxQixNQUFNLFdBQVcsbUJBQW1CLE1BQU0sRUFBRTtDQUN0RixJQUFJLENBQUMsYUFBYTtFQUNoQixJQUFJLGtCQUFrQiwyQkFBMkIsT0FBTyxVQUFVO0VBQ2xFLE9BQU87Q0FDVDtDQUVBLE9BQU8sS0FBSyxrQ0FBa0MsTUFBTSxLQUFLLE1BQU0sTUFBTSxHQUFHLFdBQVcsWUFBWTtDQUMvRixBQUFLLFlBQVk7RUFDZixPQUFPO0VBQ1AsU0FBUyxNQUFNO0VBQ2YsU0FBUyxHQUFHLE1BQU0sU0FBUyxLQUFLLFdBQVc7RUFDM0MsT0FBTyxZQUFZO0NBQ3JCLENBQUM7Q0FDRCxPQUFPO0FBQ1Q7Ozs7Ozs7O0FBU0EsTUFBTSxnQ0FBZ0MsT0FBVTtBQUNoRCxNQUFNLG9DQUFvQixJQUFJLElBQW9CO0FBRWxELFNBQVMsMkJBQTJCLE9BQXFCLFlBQTBCO0NBQ2pGLE1BQU0sTUFBTSxLQUFLLElBQUk7Q0FDckIsTUFBTSxXQUFXLGtCQUFrQixJQUFJLE1BQU0sUUFBUTtDQUNyRCxJQUFJLGFBQWEsVUFBYSxNQUFNLFdBQVcsK0JBQStCO0NBQzlFLGtCQUFrQixJQUFJLE1BQU0sVUFBVSxHQUFHO0NBRXpDLEFBQUssWUFBWTtFQUNmLE9BQU87RUFDUCxTQUFTLE1BQU07RUFDZixTQUNFLEdBQUcsTUFBTSxTQUFTLEtBQUssV0FBVztFQUVwQyxPQUFPLFlBQVk7Q0FDckIsQ0FBQztBQUNIOztBQUdBLFNBQWdCLGlCQUFpQixNQUFjLFVBQXdCO0NBQ3JFLE9BQU8sS0FBSyxnQkFBZ0IsS0FBSyxJQUFJLFNBQVMsRUFBRTtDQUNoRCxBQUFLLFlBQVk7RUFDZixPQUFPO0VBQ1AsU0FBUztFQUNULFNBQVMsR0FBRyxTQUFTO0VBQ3JCLE9BQU8sWUFBWTtDQUNyQixDQUFDO0FBQ0gifQ==
|
|
@@ -26,8 +26,9 @@ let RequestLogService;
|
|
|
26
26
|
let QgridService;
|
|
27
27
|
(function(_QgridService) {
|
|
28
28
|
_QgridService.stats = () => createSSRQuery("QgridFrame", "stats", [], ["Qgrid", "stats"]);
|
|
29
|
-
_QgridService.totalCost = (
|
|
29
|
+
_QgridService.totalCost = (params) => createSSRQuery("QgridFrame", "totalCost", [params], ["Qgrid", "totalCost"]);
|
|
30
30
|
_QgridService.projectNames = () => createSSRQuery("QgridFrame", "projectNames", [], ["Qgrid", "projectNames"]);
|
|
31
|
+
_QgridService.modelNames = () => createSSRQuery("QgridFrame", "modelNames", [], ["Qgrid", "modelNames"]);
|
|
31
32
|
_QgridService.usage = (tokenId) => createSSRQuery("QgridFrame", "usage", [tokenId], ["Qgrid", "usage"]);
|
|
32
33
|
_QgridService.health = () => createSSRQuery("QgridFrame", "health", [], ["Qgrid", "health"]);
|
|
33
34
|
})(QgridService || (QgridService = {}));
|
|
@@ -39,4 +40,4 @@ let MonitService;
|
|
|
39
40
|
//#endregion
|
|
40
41
|
export { MonitService, QgridService, RequestLogService, RequestLogStepService, TokenService };
|
|
41
42
|
|
|
42
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcmllcy5nZW5lcmF0ZWQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3F1ZXJpZXMuZ2VuZXJhdGVkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGdlbmVyYXRlZFxuICog7KeB7KCRIOyImOygle2VmOyngCDrp4jshLjsmpQuXG4gKi9cblxuLyogb3hsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHR5cGUgeyBTU1JRdWVyeSB9IGZyb20gXCJzb25hbXUvc3NyXCI7XG5cbi8vIFNTUlF1ZXJ5IO2XrO2NvCDtlajsiJhcbmZ1bmN0aW9uIGNyZWF0ZVNTUlF1ZXJ5KFxuICBtb2RlbE5hbWU6IHN0cmluZyxcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICBwYXJhbXM6IGFueVtdLFxuICBzZXJ2aWNlS2V5OiBbc3RyaW5nLCBzdHJpbmddLFxuKTogU1NSUXVlcnkge1xuICByZXR1cm4geyBtb2RlbE5hbWUsIG1ldGhvZE5hbWUsIHBhcmFtcywgc2VydmljZUtleSwgX19icmFuZDogXCJTU1JRdWVyeVwiIH0gYXMgU1NSUXVlcnk7XG59XG5cbmltcG9ydCB7IFJlcXVlc3RMb2dTdGVwTGlzdFBhcmFtcyB9IGZyb20gXCIuL3JlcXVlc3QtbG9nLXN0ZXAvcmVxdWVzdC1sb2ctc3RlcC50eXBlc1wiO1xuaW1wb3J0IHsgUmVxdWVzdExvZ0xpc3RQYXJhbXMgfSBmcm9tIFwiLi9yZXF1ZXN0LWxvZy9yZXF1ZXN0LWxvZy50eXBlc1wiO1xuaW1wb3J0IHsgVG9rZW5TdWJzZXRLZXksIFJlcXVlc3RMb2dTdGVwU3Vic2V0S2V5LCBSZXF1ZXN0TG9nU3Vic2V0S2V5IH0gZnJvbSBcIi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgVG9rZW5MaXN0UGFyYW1zIH0gZnJvbSBcIi4vdG9rZW4vdG9rZW4udHlwZXNcIjtcblxuZXhwb3J0IG5hbWVzcGFjZSBUb2tlblNlcnZpY2Uge1xuICBleHBvcnQgY29uc3QgZ2V0VG9rZW4gPSA8VCBleHRlbmRzIFRva2VuU3Vic2V0S2V5PihzdWJzZXQ6IFQsIGlkOiBudW1iZXIpOiBTU1JRdWVyeSA9PlxuICAgIGNyZWF0ZVNTUlF1ZXJ5KFwiVG9rZW5Nb2RlbFwiLCBcImZpbmRCeUlkXCIsIFtzdWJzZXQsIGlkXSwgW1wiVG9rZW5cIiwgXCJnZXRUb2tlblwiXSk7XG5cbiAgZXhwb3J0IGNvbnN0IGdldFRva2VucyA9IDxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXksIExQIGV4dGVuZHMgVG9rZW5MaXN0UGFyYW1zPihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcmF3UGFyYW1zPzogTFAsXG4gICk6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXCJUb2tlbk1vZGVsXCIsIFwiZmluZE1hbnlcIiwgW3N1YnNldCwgcmF3UGFyYW1zXSwgW1wiVG9rZW5cIiwgXCJnZXRUb2tlbnNcIl0pO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJlcXVlc3RMb2dTdGVwU2VydmljZSB7XG4gIGV4cG9ydCBjb25zdCBnZXRSZXF1ZXN0TG9nU3RlcCA9IDxUIGV4dGVuZHMgUmVxdWVzdExvZ1N0ZXBTdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBpZDogbnVtYmVyLFxuICApOiBTU1JRdWVyeSA9PlxuICAgIGNyZWF0ZVNTUlF1ZXJ5KFxuICAgICAgXCJSZXF1ZXN0TG9nU3RlcE1vZGVsXCIsXG4gICAgICBcImZpbmRCeUlkXCIsXG4gICAgICBbc3Vic2V0LCBpZF0sXG4gICAgICBbXCJSZXF1ZXN0TG9nU3RlcFwiLCBcImdldFJlcXVlc3RMb2dTdGVwXCJdLFxuICAgICk7XG5cbiAgZXhwb3J0IGNvbnN0IGdldFJlcXVlc3RMb2dTdGVwcyA9IDxcbiAgICBUIGV4dGVuZHMgUmVxdWVzdExvZ1N0ZXBTdWJzZXRLZXksXG4gICAgTFAgZXh0ZW5kcyBSZXF1ZXN0TG9nU3RlcExpc3RQYXJhbXMsXG4gID4oXG4gICAgc3Vic2V0OiBULFxuICAgIHJhd1BhcmFtcz86IExQLFxuICApOiBTU1JRdWVyeSA9PlxuICAgIGNyZWF0ZVNTUlF1ZXJ5KFxuICAgICAgXCJSZXF1ZXN0TG9nU3RlcE1vZGVsXCIsXG4gICAgICBcImZpbmRNYW55XCIsXG4gICAgICBbc3Vic2V0LCByYXdQYXJhbXNdLFxuICAgICAgW1wiUmVxdWVzdExvZ1N0ZXBcIiwgXCJnZXRSZXF1ZXN0TG9nU3RlcHNcIl0sXG4gICAgKTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBSZXF1ZXN0TG9nU2VydmljZSB7XG4gIGV4cG9ydCBjb25zdCBnZXRSZXF1ZXN0TG9nID0gPFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3Vic2V0S2V5PihzdWJzZXQ6IFQsIGlkOiBudW1iZXIpOiBTU1JRdWVyeSA9PlxuICAgIGNyZWF0ZVNTUlF1ZXJ5KFwiUmVxdWVzdExvZ01vZGVsXCIsIFwiZmluZEJ5SWRcIiwgW3N1YnNldCwgaWRdLCBbXCJSZXF1ZXN0TG9nXCIsIFwiZ2V0UmVxdWVzdExvZ1wiXSk7XG5cbiAgZXhwb3J0IGNvbnN0IGdldFJlcXVlc3RMb2dzID0gPFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3Vic2V0S2V5LCBMUCBleHRlbmRzIFJlcXVlc3RMb2dMaXN0UGFyYW1zPihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcmF3UGFyYW1zPzogTFAsXG4gICk6IFNTUlF1ZXJ5ID0+
|
|
43
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcmllcy5nZW5lcmF0ZWQuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3F1ZXJpZXMuZ2VuZXJhdGVkLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGdlbmVyYXRlZFxuICog7KeB7KCRIOyImOygle2VmOyngCDrp4jshLjsmpQuXG4gKi9cblxuLyogb3hsaW50LWRpc2FibGUgKi9cblxuaW1wb3J0IHR5cGUgeyBTU1JRdWVyeSB9IGZyb20gXCJzb25hbXUvc3NyXCI7XG5cbi8vIFNTUlF1ZXJ5IO2XrO2NvCDtlajsiJhcbmZ1bmN0aW9uIGNyZWF0ZVNTUlF1ZXJ5KFxuICBtb2RlbE5hbWU6IHN0cmluZyxcbiAgbWV0aG9kTmFtZTogc3RyaW5nLFxuICBwYXJhbXM6IGFueVtdLFxuICBzZXJ2aWNlS2V5OiBbc3RyaW5nLCBzdHJpbmddLFxuKTogU1NSUXVlcnkge1xuICByZXR1cm4geyBtb2RlbE5hbWUsIG1ldGhvZE5hbWUsIHBhcmFtcywgc2VydmljZUtleSwgX19icmFuZDogXCJTU1JRdWVyeVwiIH0gYXMgU1NSUXVlcnk7XG59XG5cbmltcG9ydCB7IFJlcXVlc3RMb2dTdGVwTGlzdFBhcmFtcyB9IGZyb20gXCIuL3JlcXVlc3QtbG9nLXN0ZXAvcmVxdWVzdC1sb2ctc3RlcC50eXBlc1wiO1xuaW1wb3J0IHsgUmVxdWVzdExvZ0xpc3RQYXJhbXMgfSBmcm9tIFwiLi9yZXF1ZXN0LWxvZy9yZXF1ZXN0LWxvZy50eXBlc1wiO1xuaW1wb3J0IHsgVG9rZW5TdWJzZXRLZXksIFJlcXVlc3RMb2dTdGVwU3Vic2V0S2V5LCBSZXF1ZXN0TG9nU3Vic2V0S2V5IH0gZnJvbSBcIi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgVG9rZW5MaXN0UGFyYW1zIH0gZnJvbSBcIi4vdG9rZW4vdG9rZW4udHlwZXNcIjtcblxuZXhwb3J0IG5hbWVzcGFjZSBUb2tlblNlcnZpY2Uge1xuICBleHBvcnQgY29uc3QgZ2V0VG9rZW4gPSA8VCBleHRlbmRzIFRva2VuU3Vic2V0S2V5PihzdWJzZXQ6IFQsIGlkOiBudW1iZXIpOiBTU1JRdWVyeSA9PlxuICAgIGNyZWF0ZVNTUlF1ZXJ5KFwiVG9rZW5Nb2RlbFwiLCBcImZpbmRCeUlkXCIsIFtzdWJzZXQsIGlkXSwgW1wiVG9rZW5cIiwgXCJnZXRUb2tlblwiXSk7XG5cbiAgZXhwb3J0IGNvbnN0IGdldFRva2VucyA9IDxUIGV4dGVuZHMgVG9rZW5TdWJzZXRLZXksIExQIGV4dGVuZHMgVG9rZW5MaXN0UGFyYW1zPihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcmF3UGFyYW1zPzogTFAsXG4gICk6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXCJUb2tlbk1vZGVsXCIsIFwiZmluZE1hbnlcIiwgW3N1YnNldCwgcmF3UGFyYW1zXSwgW1wiVG9rZW5cIiwgXCJnZXRUb2tlbnNcIl0pO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFJlcXVlc3RMb2dTdGVwU2VydmljZSB7XG4gIGV4cG9ydCBjb25zdCBnZXRSZXF1ZXN0TG9nU3RlcCA9IDxUIGV4dGVuZHMgUmVxdWVzdExvZ1N0ZXBTdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBpZDogbnVtYmVyLFxuICApOiBTU1JRdWVyeSA9PlxuICAgIGNyZWF0ZVNTUlF1ZXJ5KFxuICAgICAgXCJSZXF1ZXN0TG9nU3RlcE1vZGVsXCIsXG4gICAgICBcImZpbmRCeUlkXCIsXG4gICAgICBbc3Vic2V0LCBpZF0sXG4gICAgICBbXCJSZXF1ZXN0TG9nU3RlcFwiLCBcImdldFJlcXVlc3RMb2dTdGVwXCJdLFxuICAgICk7XG5cbiAgZXhwb3J0IGNvbnN0IGdldFJlcXVlc3RMb2dTdGVwcyA9IDxcbiAgICBUIGV4dGVuZHMgUmVxdWVzdExvZ1N0ZXBTdWJzZXRLZXksXG4gICAgTFAgZXh0ZW5kcyBSZXF1ZXN0TG9nU3RlcExpc3RQYXJhbXMsXG4gID4oXG4gICAgc3Vic2V0OiBULFxuICAgIHJhd1BhcmFtcz86IExQLFxuICApOiBTU1JRdWVyeSA9PlxuICAgIGNyZWF0ZVNTUlF1ZXJ5KFxuICAgICAgXCJSZXF1ZXN0TG9nU3RlcE1vZGVsXCIsXG4gICAgICBcImZpbmRNYW55XCIsXG4gICAgICBbc3Vic2V0LCByYXdQYXJhbXNdLFxuICAgICAgW1wiUmVxdWVzdExvZ1N0ZXBcIiwgXCJnZXRSZXF1ZXN0TG9nU3RlcHNcIl0sXG4gICAgKTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBSZXF1ZXN0TG9nU2VydmljZSB7XG4gIGV4cG9ydCBjb25zdCBnZXRSZXF1ZXN0TG9nID0gPFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3Vic2V0S2V5PihzdWJzZXQ6IFQsIGlkOiBudW1iZXIpOiBTU1JRdWVyeSA9PlxuICAgIGNyZWF0ZVNTUlF1ZXJ5KFwiUmVxdWVzdExvZ01vZGVsXCIsIFwiZmluZEJ5SWRcIiwgW3N1YnNldCwgaWRdLCBbXCJSZXF1ZXN0TG9nXCIsIFwiZ2V0UmVxdWVzdExvZ1wiXSk7XG5cbiAgZXhwb3J0IGNvbnN0IGdldFJlcXVlc3RMb2dzID0gPFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3Vic2V0S2V5LCBMUCBleHRlbmRzIFJlcXVlc3RMb2dMaXN0UGFyYW1zPihcbiAgICBzdWJzZXQ6IFQsXG4gICAgcmF3UGFyYW1zPzogTFAsXG4gICk6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXG4gICAgICBcIlJlcXVlc3RMb2dNb2RlbFwiLFxuICAgICAgXCJmaW5kTWFueVwiLFxuICAgICAgW3N1YnNldCwgcmF3UGFyYW1zXSxcbiAgICAgIFtcIlJlcXVlc3RMb2dcIiwgXCJnZXRSZXF1ZXN0TG9nc1wiXSxcbiAgICApO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIFFncmlkU2VydmljZSB7XG4gIGV4cG9ydCBjb25zdCBzdGF0cyA9ICgpOiBTU1JRdWVyeSA9PlxuICAgIGNyZWF0ZVNTUlF1ZXJ5KFwiUWdyaWRGcmFtZVwiLCBcInN0YXRzXCIsIFtdLCBbXCJRZ3JpZFwiLCBcInN0YXRzXCJdKTtcblxuICBleHBvcnQgY29uc3QgdG90YWxDb3N0ID0gKHBhcmFtcz86IFJlcXVlc3RMb2dMaXN0UGFyYW1zKTogU1NSUXVlcnkgPT5cbiAgICBjcmVhdGVTU1JRdWVyeShcIlFncmlkRnJhbWVcIiwgXCJ0b3RhbENvc3RcIiwgW3BhcmFtc10sIFtcIlFncmlkXCIsIFwidG90YWxDb3N0XCJdKTtcblxuICBleHBvcnQgY29uc3QgcHJvamVjdE5hbWVzID0gKCk6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXCJRZ3JpZEZyYW1lXCIsIFwicHJvamVjdE5hbWVzXCIsIFtdLCBbXCJRZ3JpZFwiLCBcInByb2plY3ROYW1lc1wiXSk7XG5cbiAgZXhwb3J0IGNvbnN0IG1vZGVsTmFtZXMgPSAoKTogU1NSUXVlcnkgPT5cbiAgICBjcmVhdGVTU1JRdWVyeShcIlFncmlkRnJhbWVcIiwgXCJtb2RlbE5hbWVzXCIsIFtdLCBbXCJRZ3JpZFwiLCBcIm1vZGVsTmFtZXNcIl0pO1xuXG4gIGV4cG9ydCBjb25zdCB1c2FnZSA9ICh0b2tlbklkPzogbnVtYmVyKTogU1NSUXVlcnkgPT5cbiAgICBjcmVhdGVTU1JRdWVyeShcIlFncmlkRnJhbWVcIiwgXCJ1c2FnZVwiLCBbdG9rZW5JZF0sIFtcIlFncmlkXCIsIFwidXNhZ2VcIl0pO1xuXG4gIGV4cG9ydCBjb25zdCBoZWFsdGggPSAoKTogU1NSUXVlcnkgPT5cbiAgICBjcmVhdGVTU1JRdWVyeShcIlFncmlkRnJhbWVcIiwgXCJoZWFsdGhcIiwgW10sIFtcIlFncmlkXCIsIFwiaGVhbHRoXCJdKTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBNb25pdFNlcnZpY2Uge1xuICBleHBvcnQgY29uc3QgbW9uaXRMb2dzID0gKGN1cnNvcj86IG51bWJlcik6IFNTUlF1ZXJ5ID0+XG4gICAgY3JlYXRlU1NSUXVlcnkoXCJNb25pdEZyYW1lXCIsIFwibW9uaXRMb2dzXCIsIFtjdXJzb3JdLCBbXCJNb25pdFwiLCBcIm1vbml0TG9nc1wiXSk7XG5cbiAgZXhwb3J0IGNvbnN0IG1vbml0SW5mbyA9ICgpOiBTU1JRdWVyeSA9PlxuICAgIGNyZWF0ZVNTUlF1ZXJ5KFwiTW9uaXRGcmFtZVwiLCBcIm1vbml0SW5mb1wiLCBbXSwgW1wiTW9uaXRcIiwgXCJtb25pdEluZm9cIl0pO1xufVxuIl0sIm1hcHBpbmdzIjoiO0FBVUEsU0FBUyxlQUNQLFdBQ0EsWUFDQSxRQUNBLFlBQ1U7Q0FDVixPQUFPO0VBQUU7RUFBVztFQUFZO0VBQVE7RUFBWSxTQUFTO0NBQVc7QUFDMUU7QUFPTyxJQUFVO0NBQVYsU0FBQSxlQUFBO0NBQ1EsY0FBQSxZQUFzQyxRQUFXLE9BQzVELGVBQWUsY0FBYyxZQUFZLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxTQUFTLFVBQVUsQ0FBQztDQUVqRSxjQUFBLGFBQ1gsUUFDQSxjQUVBLGVBQWUsY0FBYyxZQUFZLENBQUMsUUFBUSxTQUFTLEdBQUcsQ0FBQyxTQUFTLFdBQVcsQ0FBQztBQUN2RixFQUFBLENBQUEsaUJBQUEsZUFBQSxDQUFBLEVBQUQ7QUFFTyxJQUFVO0NBQVYsU0FBQSx3QkFBQTtDQUNRLHVCQUFBLHFCQUNYLFFBQ0EsT0FFQSxlQUNFLHVCQUNBLFlBQ0EsQ0FBQyxRQUFRLEVBQUUsR0FDWCxDQUFDLGtCQUFrQixtQkFBbUIsQ0FDeEM7Q0FFVyx1QkFBQSxzQkFJWCxRQUNBLGNBRUEsZUFDRSx1QkFDQSxZQUNBLENBQUMsUUFBUSxTQUFTLEdBQ2xCLENBQUMsa0JBQWtCLG9CQUFvQixDQUN6QztBQUNILEVBQUEsQ0FBQSwwQkFBQSx3QkFBQSxDQUFBLEVBQUQ7QUFFTyxJQUFVO0NBQVYsU0FBQSxvQkFBQTtDQUNRLG1CQUFBLGlCQUFnRCxRQUFXLE9BQ3RFLGVBQWUsbUJBQW1CLFlBQVksQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLGNBQWMsZUFBZSxDQUFDO0NBRWhGLG1CQUFBLGtCQUNYLFFBQ0EsY0FFQSxlQUNFLG1CQUNBLFlBQ0EsQ0FBQyxRQUFRLFNBQVMsR0FDbEIsQ0FBQyxjQUFjLGdCQUFnQixDQUNqQztBQUNILEVBQUEsQ0FBQSxzQkFBQSxvQkFBQSxDQUFBLEVBQUQ7QUFFTyxJQUFVO0NBQVYsU0FBQSxlQUFBO0NBQ1EsY0FBQSxjQUNYLGVBQWUsY0FBYyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsT0FBTyxDQUFDO0NBRWpELGNBQUEsYUFBYSxXQUN4QixlQUFlLGNBQWMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLFNBQVMsV0FBVyxDQUFDO0NBRS9ELGNBQUEscUJBQ1gsZUFBZSxjQUFjLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxTQUFTLGNBQWMsQ0FBQztDQUUvRCxjQUFBLG1CQUNYLGVBQWUsY0FBYyxjQUFjLENBQUMsR0FBRyxDQUFDLFNBQVMsWUFBWSxDQUFDO0NBRTNELGNBQUEsU0FBUyxZQUNwQixlQUFlLGNBQWMsU0FBUyxDQUFDLE9BQU8sR0FBRyxDQUFDLFNBQVMsT0FBTyxDQUFDO0NBRXhELGNBQUEsZUFDWCxlQUFlLGNBQWMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLFFBQVEsQ0FBQztBQUNqRSxFQUFBLENBQUEsaUJBQUEsZUFBQSxDQUFBLEVBQUQ7QUFFTyxJQUFVO0NBQVYsU0FBQSxlQUFBO0NBQ1EsY0FBQSxhQUFhLFdBQ3hCLGVBQWUsY0FBYyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsU0FBUyxXQUFXLENBQUM7Q0FFL0QsY0FBQSxrQkFDWCxlQUFlLGNBQWMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxTQUFTLFdBQVcsQ0FBQztBQUN2RSxFQUFBLENBQUEsaUJBQUEsZUFBQSxDQUFBLEVBQUQifQ==
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import { SD } from "../../i18n/sd.generated.js";
|
|
1
2
|
import { calculateCostUsd } from "../../utils/providers/common/model-cost.js";
|
|
2
3
|
import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorateMetadata.js";
|
|
3
4
|
import __decorate from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorate.js";
|
|
4
|
-
import { SD } from "../../i18n/sd.generated.js";
|
|
5
5
|
import { requestLogLoaderQueries, requestLogSubsetQueries } from "../sonamu.generated.sso.js";
|
|
6
|
-
import { BadRequestException, BaseModelClass, NotFoundException, Puri, api, asArray,
|
|
6
|
+
import { BadRequestException, BaseModelClass, NotFoundException, Puri, api, asArray, transactional } from "sonamu";
|
|
7
7
|
//#region src/application/request-log/request-log.model.ts
|
|
8
8
|
const MICRO_USD = 1e6;
|
|
9
9
|
const REQUEST_LOG_RUN_LOCK_CLASS_ID = 718;
|
|
@@ -72,6 +72,36 @@ function normalizeLegacyAnthropicRow(row) {
|
|
|
72
72
|
if (usage.model) normalized.cost_usd = Math.round(calculateCostUsd(usage.model, usage) * MICRO_USD);
|
|
73
73
|
return normalized;
|
|
74
74
|
}
|
|
75
|
+
/**
|
|
76
|
+
* `orderBy` enum 값(`컬럼-방향`)을 정렬 절로 옮긴다.
|
|
77
|
+
*
|
|
78
|
+
* enum 이 18 종이라 케이스를 일일이 적는 대신 파싱하되, 컬럼은 아래 목록으로 한정한다 —
|
|
79
|
+
* 문자열을 그대로 컬럼명에 넘기면 enum 이 바뀔 때 검증 없는 식별자가 SQL 로 흘러든다.
|
|
80
|
+
* 목록에 없는 값은 기본 정렬(id desc)로 떨어진다.
|
|
81
|
+
*/
|
|
82
|
+
const ORDERABLE_COLUMNS = {
|
|
83
|
+
id: "request_logs.id",
|
|
84
|
+
created_at: "request_logs.created_at",
|
|
85
|
+
ttft_ms: "request_logs.ttft_ms",
|
|
86
|
+
duration_ms: "request_logs.duration_ms",
|
|
87
|
+
input_tokens: "request_logs.input_tokens",
|
|
88
|
+
output_tokens: "request_logs.output_tokens",
|
|
89
|
+
cache_read_tokens: "request_logs.cache_read_tokens",
|
|
90
|
+
cache_creation_tokens: "request_logs.cache_creation_tokens",
|
|
91
|
+
cost_usd: "request_logs.cost_usd"
|
|
92
|
+
};
|
|
93
|
+
function applyOrderBy(qb, orderBy) {
|
|
94
|
+
const separator = orderBy.lastIndexOf("-");
|
|
95
|
+
const key = orderBy.slice(0, separator);
|
|
96
|
+
const direction = orderBy.slice(separator + 1) === "asc" ? "asc" : "desc";
|
|
97
|
+
const column = ORDERABLE_COLUMNS[key];
|
|
98
|
+
if (!column) {
|
|
99
|
+
qb.orderBy("request_logs.id", "desc");
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
qb.orderBy(column, direction);
|
|
103
|
+
if (key !== "id") qb.orderBy("request_logs.id", "desc");
|
|
104
|
+
}
|
|
75
105
|
var RequestLogModelClass = class extends BaseModelClass {
|
|
76
106
|
constructor() {
|
|
77
107
|
super("RequestLog", requestLogSubsetQueries, requestLogLoaderQueries);
|
|
@@ -93,15 +123,12 @@ var RequestLogModelClass = class extends BaseModelClass {
|
|
|
93
123
|
});
|
|
94
124
|
return rows[0] ?? null;
|
|
95
125
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
...rawParams
|
|
103
|
-
};
|
|
104
|
-
const { qb, onSubset: _ } = this.getSubsetQueries(subset);
|
|
126
|
+
/**
|
|
127
|
+
* 목록 필터의 단일 정의. findMany 와 totalCost 가 같은 조건을 보도록 공유한다 —
|
|
128
|
+
* 화면에서 필터를 걸면 행 수와 비용이 함께 좁혀져야 하는데, 두 쿼리가 각자 필터를
|
|
129
|
+
* 구현하면 한쪽에 축을 추가할 때 조용히 어긋난다.
|
|
130
|
+
*/
|
|
131
|
+
applyListFilters(qb, params) {
|
|
105
132
|
if (params.id) qb.whereIn("request_logs.id", asArray(params.id));
|
|
106
133
|
if (params.token_name) qb.where("request_logs.token_name", params.token_name);
|
|
107
134
|
if (params.project_name_is_null) qb.where("request_logs.project_name", null);
|
|
@@ -112,9 +139,22 @@ var RequestLogModelClass = class extends BaseModelClass {
|
|
|
112
139
|
else if (params.search === "token_name") qb.where("request_logs.token_name", "like", `%${params.keyword}%`);
|
|
113
140
|
else if (params.search === "user_prompt") qb.where("request_logs.user_prompt", "like", `%${params.keyword}%`);
|
|
114
141
|
else throw new BadRequestException(SD("error.unknownSearchField")(params.search));
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
const
|
|
142
|
+
}
|
|
143
|
+
async findMany(subset, rawParams) {
|
|
144
|
+
const params = {
|
|
145
|
+
num: 24,
|
|
146
|
+
page: 1,
|
|
147
|
+
search: "id",
|
|
148
|
+
orderBy: "id-desc",
|
|
149
|
+
...rawParams
|
|
150
|
+
};
|
|
151
|
+
const { qb, onSubset: _ } = this.getSubsetQueries(subset);
|
|
152
|
+
this.applyListFilters(qb, params);
|
|
153
|
+
if (params.orderBy) applyOrderBy(qb, params.orderBy);
|
|
154
|
+
const enhancers = this.createEnhancers({
|
|
155
|
+
A: (row) => normalizeLegacyAnthropicRow(row),
|
|
156
|
+
C: (row) => normalizeLegacyAnthropicRow(row)
|
|
157
|
+
});
|
|
118
158
|
return this.executeSubsetQuery({
|
|
119
159
|
subset,
|
|
120
160
|
qb,
|
|
@@ -286,21 +326,52 @@ var RequestLogModelClass = class extends BaseModelClass {
|
|
|
286
326
|
for (const result of toolResults) await wdb.from("request_log_steps").where("request_log_id", requestLogId).where("tool_call_id", result.toolCallId).where("type", "tool_call").update(result.isError ? { error: result.output } : { tool_result: result.output });
|
|
287
327
|
return ((await wdb.from("request_log_steps").select({ max_step: Puri.max("step_index") }).where("request_log_id", requestLogId).first())?.max_step ?? -1) + 1;
|
|
288
328
|
}
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
329
|
+
/**
|
|
330
|
+
* 화면 표시용 총 비용. 목록과 같은 필터를 적용한다.
|
|
331
|
+
*
|
|
332
|
+
* 전체를 조건 없이 SUM 한 뒤, `cost_source` 가 없는 legacy row 의 차액만 보정한다.
|
|
333
|
+
* 조건 없는 SUM 이어야 `(project_name, cost_usd)` 커버링 인덱스가 Index Only Scan 을
|
|
334
|
+
* 탄다 — `cost_source IS NOT NULL` 을 걸면 그 컬럼이 인덱스에 없어 heap 을 다시 봐야
|
|
335
|
+
* 하므로 플래너가 인덱스를 버리고 seq scan 으로 돌아간다(실측 230ms → 814ms).
|
|
336
|
+
*
|
|
337
|
+
* legacy 보정을 남겨둔 이유: 백필로 기존 legacy 는 0 이 되었지만, 외부 로거가
|
|
338
|
+
* `AppendStepInput`/`FinishRunInput` 으로 costSource 없이 넣으면 다시 생길 수 있다.
|
|
339
|
+
* 그런 row 는 저장값 대신 현재 가격표 재계산값이 맞으므로 차액을 더한다.
|
|
340
|
+
*
|
|
341
|
+
* 필터 조건을 여기서 다시 구현하지 않고 `applyListFilters` 를 공유하는 것이 핵심이다 —
|
|
342
|
+
* 두 쿼리가 각자 필터를 가지면 화면에서 필터를 걸었을 때 행 수와 비용이 조용히 어긋난다.
|
|
343
|
+
*/
|
|
344
|
+
async totalCost(rawParams = {
|
|
345
|
+
num: 0,
|
|
346
|
+
page: 1
|
|
347
|
+
}) {
|
|
348
|
+
const params = {
|
|
349
|
+
num: 0,
|
|
350
|
+
page: 1,
|
|
351
|
+
search: "id",
|
|
352
|
+
...rawParams
|
|
353
|
+
};
|
|
354
|
+
const { qb: totalQb } = this.getSubsetQueries("C");
|
|
355
|
+
this.applyListFilters(totalQb, params);
|
|
356
|
+
const stored = await totalQb.clear("select").select({ total: Puri.rawNumber("COALESCE(SUM(GREATEST(request_logs.cost_usd, 0)), 0)") }).first();
|
|
357
|
+
const { qb: legacyQb } = this.getSubsetQueries("C");
|
|
358
|
+
this.applyListFilters(legacyQb, params);
|
|
359
|
+
const legacyRows = await legacyQb.whereRaw("request_logs.cost_source IS NULL OR request_logs.cost_usd IS NULL").clear("select").select({
|
|
360
|
+
token_name: "request_logs.token_name",
|
|
361
|
+
model_name: "request_logs.model_name",
|
|
362
|
+
input_tokens: "request_logs.input_tokens",
|
|
363
|
+
output_tokens: "request_logs.output_tokens",
|
|
364
|
+
cache_read_tokens: "request_logs.cache_read_tokens",
|
|
365
|
+
cache_creation_tokens: "request_logs.cache_creation_tokens",
|
|
366
|
+
cache_creation_5m_tokens: "request_logs.cache_creation_5m_tokens",
|
|
367
|
+
cache_creation_1h_tokens: "request_logs.cache_creation_1h_tokens",
|
|
368
|
+
cost_usd: "request_logs.cost_usd"
|
|
369
|
+
});
|
|
370
|
+
const storedTotal = Number(stored?.total ?? 0) / MICRO_USD;
|
|
371
|
+
return legacyRows.reduce((sum, row) => {
|
|
372
|
+
const alreadySummed = Math.max(row.cost_usd ?? 0, 0) / MICRO_USD;
|
|
302
373
|
const usage = normalizedUsageForCost(row);
|
|
303
|
-
if (!usage.model) return sum
|
|
374
|
+
if (!usage.model) return sum;
|
|
304
375
|
return sum + calculateCostUsd(usage.model, {
|
|
305
376
|
inputTokens: usage.inputTokens,
|
|
306
377
|
outputTokens: usage.outputTokens,
|
|
@@ -308,12 +379,15 @@ var RequestLogModelClass = class extends BaseModelClass {
|
|
|
308
379
|
cacheCreationInputTokens: usage.cacheCreationInputTokens,
|
|
309
380
|
cacheCreationInputTokens5m: usage.cacheCreationInputTokens5m,
|
|
310
381
|
cacheCreationInputTokens1h: usage.cacheCreationInputTokens1h
|
|
311
|
-
});
|
|
312
|
-
},
|
|
382
|
+
}) - alreadySummed;
|
|
383
|
+
}, storedTotal);
|
|
313
384
|
}
|
|
314
385
|
async distinctProjectNames() {
|
|
315
386
|
return (await this.getPuri("r").from("request_logs").distinct("project_name").where("project_name", "!=", null).orderBy("project_name", "asc").select({ project_name: "project_name" })).map((r) => r.project_name);
|
|
316
387
|
}
|
|
388
|
+
async distinctModelNames() {
|
|
389
|
+
return (await this.getPuri("r").from("request_logs").distinct("model_name").where("model_name", "!=", null).orderBy("model_name", "asc").select({ model_name: "model_name" })).map((r) => r.model_name);
|
|
390
|
+
}
|
|
317
391
|
async del(ids) {
|
|
318
392
|
await this.getPuri("w").transaction(async (trx) => {
|
|
319
393
|
await trx.table("request_log_steps").whereIn("request_log_steps.request_log_id", ids).delete();
|
|
@@ -380,4 +454,4 @@ const RequestLogModel = new RequestLogModelClass();
|
|
|
380
454
|
//#endregion
|
|
381
455
|
export { MICRO_USD, RequestLogModel };
|
|
382
456
|
|
|
383
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1sb2cubW9kZWwuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGFwaSxcbiAgYXNBcnJheSxcbiAgQmFkUmVxdWVzdEV4Y2VwdGlvbixcbiAgQmFzZU1vZGVsQ2xhc3MsXG4gIGV4aGF1c3RpdmUsXG4gIHR5cGUgTGlzdFJlc3VsdCxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIFB1cmksXG4gIHRyYW5zYWN0aW9uYWwsXG59IGZyb20gXCJzb25hbXVcIjtcblxuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IGNhbGN1bGF0ZUNvc3RVc2QgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0XCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3RMb2dTdWJzZXRLZXksIHR5cGUgUmVxdWVzdExvZ1N1YnNldE1hcHBpbmcgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgcmVxdWVzdExvZ0xvYWRlclF1ZXJpZXMsIHJlcXVlc3RMb2dTdWJzZXRRdWVyaWVzIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWQuc3NvXCI7XG5pbXBvcnQge1xuICB0eXBlIFJlcXVlc3RMb2dMaXN0UGFyYW1zLFxuICB0eXBlIFJlcXVlc3RMb2dTYXZlUGFyYW1zLFxuICB0eXBlIFRvb2xEZWZpbml0aW9ucyxcbn0gZnJvbSBcIi4vcmVxdWVzdC1sb2cudHlwZXNcIjtcblxuLy8gY29zdF91c2TripQg7KCV7IiYIG1pY3JvLVVTROuhnCDsoIDsnqUuIOyLpOygnCBVU0QgPSBjb3N0X3VzZCAvIE1JQ1JPX1VTRC5cbmV4cG9ydCBjb25zdCBNSUNST19VU0QgPSAxXzAwMF8wMDA7XG5jb25zdCBSRVFVRVNUX0xPR19SVU5fTE9DS19DTEFTU19JRCA9IDcxODtcblxudHlwZSBUb29sUmVzdWx0Q29udGludWF0aW9uID0ge1xuICB0b29sQ2FsbElkOiBzdHJpbmc7XG4gIG91dHB1dDogc3RyaW5nO1xuICBpc0Vycm9yPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgUmVxdWVzdExvZ1N0ZXBBZ2dyZWdhdGUgPSB7XG4gIGlucHV0X3Rva2VuczogbnVtYmVyO1xuICBvdXRwdXRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX3JlYWRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogbnVtYmVyO1xuICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM/OiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vucz86IG51bWJlcjtcbiAgZHVyYXRpb25fbXM6IG51bWJlcjtcbiAgZmFsbGJhY2tfY291bnQ6IG51bWJlcjtcbiAgY29zdF91c2Q6IG51bWJlcjtcbiAgY29zdF9zb3VyY2U/OiBzdHJpbmc7XG59O1xuXG5jb25zdCBTVEVQX0FHR1JFR0FURV9TRUxFQ1QgPSB7XG4gIGlucHV0X3Rva2VuczogXCJpbnB1dF90b2tlbnNcIixcbiAgb3V0cHV0X3Rva2VuczogXCJvdXRwdXRfdG9rZW5zXCIsXG4gIGNhY2hlX3JlYWRfdG9rZW5zOiBcImNhY2hlX3JlYWRfdG9rZW5zXCIsXG4gIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogXCJjYWNoZV9jcmVhdGlvbl90b2tlbnNcIixcbiAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBcImNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiLFxuICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IFwiY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCIsXG4gIGR1cmF0aW9uX21zOiBcImR1cmF0aW9uX21zXCIsXG4gIGZhbGxiYWNrX2NvdW50OiBcImZhbGxiYWNrX2NvdW50XCIsXG4gIGNvc3RfdXNkOiBcImNvc3RfdXNkXCIsXG4gIGNvc3Rfc291cmNlOiBcImNvc3Rfc291cmNlXCIsXG59IGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBhZ2dyZWdhdGVHZW5lcmF0ZVN0ZXBSb3dzKHJvd3M6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pik6IFJlcXVlc3RMb2dTdGVwQWdncmVnYXRlIHtcbiAgY29uc3Qgc3VtID0gKGZpZWxkOiBzdHJpbmcpOiBudW1iZXIgPT5cbiAgICByb3dzLnJlZHVjZSgodG90YWwsIHJvdykgPT4gdG90YWwgKyBOdW1iZXIocm93W2ZpZWxkXSA/PyAwKSwgMCk7XG4gIGNvbnN0IG9wdGlvbmFsU3VtID0gKGZpZWxkOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQgPT5cbiAgICByb3dzLnNvbWUoKHJvdykgPT4gcm93W2ZpZWxkXSAhPT0gbnVsbCAmJiByb3dbZmllbGRdICE9PSB1bmRlZmluZWQpID8gc3VtKGZpZWxkKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgY29sbGFwc2UgPSAoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgdmFsdWVzID0gW1xuICAgICAgLi4ubmV3IFNldChcbiAgICAgICAgcm93c1xuICAgICAgICAgIC5tYXAoKHJvdykgPT4gcm93W2ZpZWxkXSlcbiAgICAgICAgICAuZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUubGVuZ3RoID4gMCksXG4gICAgICApLFxuICAgIF07XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPT09IDEgPyB2YWx1ZXNbMF0gOiBcIm1peGVkXCI7XG4gIH07XG4gIHJldHVybiB7XG4gICAgaW5wdXRfdG9rZW5zOiBzdW0oXCJpbnB1dF90b2tlbnNcIiksXG4gICAgb3V0cHV0X3Rva2Vuczogc3VtKFwib3V0cHV0X3Rva2Vuc1wiKSxcbiAgICBjYWNoZV9yZWFkX3Rva2Vuczogc3VtKFwiY2FjaGVfcmVhZF90b2tlbnNcIiksXG4gICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBzdW0oXCJjYWNoZV9jcmVhdGlvbl90b2tlbnNcIiksXG4gICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBvcHRpb25hbFN1bShcImNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiKSxcbiAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IG9wdGlvbmFsU3VtKFwiY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCIpLFxuICAgIGR1cmF0aW9uX21zOiBzdW0oXCJkdXJhdGlvbl9tc1wiKSxcbiAgICBmYWxsYmFja19jb3VudDogc3VtKFwiZmFsbGJhY2tfY291bnRcIiksXG4gICAgY29zdF91c2Q6IHN1bShcImNvc3RfdXNkXCIpLFxuICAgIGNvc3Rfc291cmNlOiBjb2xsYXBzZShcImNvc3Rfc291cmNlXCIpLFxuICB9O1xufVxuXG50eXBlIFJlcXVlc3RMb2dVc2FnZVJvdyA9IHtcbiAgdG9rZW5fbmFtZT86IHN0cmluZyB8IG51bGw7XG4gIG1vZGVsX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICBpbnB1dF90b2tlbnM6IG51bWJlcjtcbiAgb3V0cHV0X3Rva2VuczogbnVtYmVyO1xuICBjYWNoZV9yZWFkX3Rva2VuczogbnVtYmVyO1xuICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IG51bWJlcjtcbiAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcbiAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcbiAgY29zdF91c2Q/OiBudW1iZXIgfCBudWxsO1xuICBjb3N0X3NvdXJjZT86IHN0cmluZyB8IG51bGw7XG59O1xuXG5mdW5jdGlvbiBpc0FudGhyb3BpY1VzYWdlUm93KHJvdzogUGljazxSZXF1ZXN0TG9nVXNhZ2VSb3csIFwidG9rZW5fbmFtZVwiIHwgXCJtb2RlbF9uYW1lXCI+KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgcm93LnRva2VuX25hbWU/LnN0YXJ0c1dpdGgoXCJhbnRocm9waWMvXCIpID09PSB0cnVlIHx8XG4gICAgcm93Lm1vZGVsX25hbWU/LnN0YXJ0c1dpdGgoXCJjbGF1ZGUtXCIpID09PSB0cnVlIHx8XG4gICAgcm93Lm1vZGVsX25hbWU/LnN0YXJ0c1dpdGgoXCJhbnRocm9waWMvY2xhdWRlLVwiKSA9PT0gdHJ1ZVxuICApO1xufVxuXG5mdW5jdGlvbiBjYW5vbmljYWxNb2RlbE5hbWUobW9kZWxOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbW9kZWxOYW1lLmluY2x1ZGVzKFwiL1wiKSA/IG1vZGVsTmFtZS5zcGxpdChcIi9cIikucG9wKCkhIDogbW9kZWxOYW1lO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVkVXNhZ2VGb3JDb3N0KHJvdzogUmVxdWVzdExvZ1VzYWdlUm93KToge1xuICBtb2RlbDogc3RyaW5nIHwgbnVsbDtcbiAgaW5wdXRUb2tlbnM6IG51bWJlcjtcbiAgb3V0cHV0VG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlZElucHV0VG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogbnVtYmVyO1xuICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bT86IG51bWJlcjtcbiAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg/OiBudW1iZXI7XG59IHtcbiAgY29uc3QgY2FjaGVSZWFkID0gcm93LmNhY2hlX3JlYWRfdG9rZW5zO1xuICBjb25zdCBjYWNoZUNyZWF0aW9uID0gcm93LmNhY2hlX2NyZWF0aW9uX3Rva2VucztcbiAgY29uc3Qgc3RvcmVkSW5wdXQgPSByb3cuaW5wdXRfdG9rZW5zO1xuICBjb25zdCBsZWdhY3lBbnRocm9waWNTcGxpdElucHV0ID1cbiAgICBpc0FudGhyb3BpY1VzYWdlUm93KHJvdykgJiYgc3RvcmVkSW5wdXQgPCBjYWNoZVJlYWQgKyBjYWNoZUNyZWF0aW9uO1xuICByZXR1cm4ge1xuICAgIG1vZGVsOiByb3cubW9kZWxfbmFtZSA/IGNhbm9uaWNhbE1vZGVsTmFtZShyb3cubW9kZWxfbmFtZSkgOiBudWxsLFxuICAgIGlucHV0VG9rZW5zOiBsZWdhY3lBbnRocm9waWNTcGxpdElucHV0ID8gc3RvcmVkSW5wdXQgKyBjYWNoZVJlYWQgKyBjYWNoZUNyZWF0aW9uIDogc3RvcmVkSW5wdXQsXG4gICAgb3V0cHV0VG9rZW5zOiByb3cub3V0cHV0X3Rva2VucyxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogY2FjaGVSZWFkLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogY2FjaGVDcmVhdGlvbixcbiAgICAuLi4ocm93LmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyAhPT0gbnVsbCAmJiByb3cuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zICE9PSB1bmRlZmluZWRcbiAgICAgID8geyBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bTogcm93LmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4ocm93LmNhY2hlX2NyZWF0aW9uXzFoX3Rva2VucyAhPT0gbnVsbCAmJiByb3cuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zICE9PSB1bmRlZmluZWRcbiAgICAgID8geyBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaDogcm93LmNhY2hlX2NyZWF0aW9uXzFoX3Rva2VucyB9XG4gICAgICA6IHt9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTGVnYWN5QW50aHJvcGljUm93PFQgZXh0ZW5kcyBSZXF1ZXN0TG9nVXNhZ2VSb3c+KHJvdzogVCk6IFQge1xuICAvLyDsg4ggcm93IOuKlCDri7nsi5zsnZggcHJvdmlkZXIv6rCA6rKp7ZGcIOu5hOyaqeydhCDtmZXsoJUg7KCA7J6l7ZWc64ukLiDtmITsnqwg6rCA6rKp7ZGc66GcIOuNruyWtOyTsOyngCDslYrripTri6QuXG4gIGlmIChyb3cuY29zdF9zb3VyY2UpIHJldHVybiByb3c7XG4gIGNvbnN0IHVzYWdlID0gbm9ybWFsaXplZFVzYWdlRm9yQ29zdChyb3cpO1xuICBpZiAodXNhZ2UuaW5wdXRUb2tlbnMgPT09IHJvdy5pbnB1dF90b2tlbnMpIHJldHVybiByb3c7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB7IC4uLnJvdywgaW5wdXRfdG9rZW5zOiB1c2FnZS5pbnB1dFRva2VucyB9O1xuICBpZiAodXNhZ2UubW9kZWwpIHtcbiAgICBub3JtYWxpemVkLmNvc3RfdXNkID0gTWF0aC5yb3VuZChjYWxjdWxhdGVDb3N0VXNkKHVzYWdlLm1vZGVsLCB1c2FnZSkgKiBNSUNST19VU0QpO1xuICB9XG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG4vKlxuICBSZXF1ZXN0TG9nIE1vZGVsXG4qL1xuY2xhc3MgUmVxdWVzdExvZ01vZGVsQ2xhc3MgZXh0ZW5kcyBCYXNlTW9kZWxDbGFzczxcbiAgUmVxdWVzdExvZ1N1YnNldEtleSxcbiAgUmVxdWVzdExvZ1N1YnNldE1hcHBpbmcsXG4gIHR5cGVvZiByZXF1ZXN0TG9nU3Vic2V0UXVlcmllcyxcbiAgdHlwZW9mIHJlcXVlc3RMb2dMb2FkZXJRdWVyaWVzXG4+IHtcbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoXCJSZXF1ZXN0TG9nXCIsIHJlcXVlc3RMb2dTdWJzZXRRdWVyaWVzLCByZXF1ZXN0TG9nTG9hZGVyUXVlcmllcyk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSwgcmVzb3VyY2VOYW1lOiBcIlJlcXVlc3RMb2dcIiB9KVxuICBhc3luYyBmaW5kQnlJZDxUIGV4dGVuZHMgUmVxdWVzdExvZ1N1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIGlkOiBudW1iZXIsXG4gICk6IFByb21pc2U8UmVxdWVzdExvZ1N1YnNldE1hcHBpbmdbVF0+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZmluZE1hbnkoc3Vic2V0LCB7XG4gICAgICBpZCxcbiAgICAgIG51bTogMSxcbiAgICAgIHBhZ2U6IDEsXG4gICAgfSk7XG4gICAgaWYgKCFyb3dzWzBdKSB7XG4gICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oU0QoXCJlcnJvci5lbnRpdHlOb3RGb3VuZFwiKShcIlJlcXVlc3RMb2dcIiwgaWQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcm93c1swXTtcbiAgfVxuXG4gIGFzeW5jIGZpbmRPbmU8VCBleHRlbmRzIFJlcXVlc3RMb2dTdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBsaXN0UGFyYW1zOiBSZXF1ZXN0TG9nTGlzdFBhcmFtcyxcbiAgKTogUHJvbWlzZTxSZXF1ZXN0TG9nU3Vic2V0TWFwcGluZ1tUXSB8IG51bGw+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHRoaXMuZmluZE1hbnkoc3Vic2V0LCB7XG4gICAgICAuLi5saXN0UGFyYW1zLFxuICAgICAgbnVtOiAxLFxuICAgICAgcGFnZTogMSxcbiAgICB9KTtcblxuICAgIHJldHVybiByb3dzWzBdID8/IG51bGw7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJHRVRcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1xdWVyeVwiXSwgcmVzb3VyY2VOYW1lOiBcIlJlcXVlc3RMb2dzXCIgfSlcbiAgYXN5bmMgZmluZE1hbnk8VCBleHRlbmRzIFJlcXVlc3RMb2dTdWJzZXRLZXksIExQIGV4dGVuZHMgUmVxdWVzdExvZ0xpc3RQYXJhbXM+KFxuICAgIHN1YnNldDogVCxcbiAgICByYXdQYXJhbXM/OiBMUCxcbiAgKTogUHJvbWlzZTxMaXN0UmVzdWx0PExQLCBSZXF1ZXN0TG9nU3Vic2V0TWFwcGluZ1tUXT4+IHtcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBudW06IDI0LFxuICAgICAgcGFnZTogMSxcbiAgICAgIHNlYXJjaDogXCJpZFwiIGFzIGNvbnN0LFxuICAgICAgb3JkZXJCeTogXCJpZC1kZXNjXCIgYXMgY29uc3QsXG4gICAgICAuLi5yYXdQYXJhbXMsXG4gICAgfSBzYXRpc2ZpZXMgUmVxdWVzdExvZ0xpc3RQYXJhbXM7XG5cbiAgICBjb25zdCB7IHFiLCBvblN1YnNldDogXyB9ID0gdGhpcy5nZXRTdWJzZXRRdWVyaWVzKHN1YnNldCk7XG5cbiAgICBpZiAocGFyYW1zLmlkKSB7XG4gICAgICBxYi53aGVyZUluKFwicmVxdWVzdF9sb2dzLmlkXCIsIGFzQXJyYXkocGFyYW1zLmlkKSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy50b2tlbl9uYW1lKSB7XG4gICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy50b2tlbl9uYW1lXCIsIHBhcmFtcy50b2tlbl9uYW1lKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnByb2plY3RfbmFtZV9pc19udWxsKSB7XG4gICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy5wcm9qZWN0X25hbWVcIiwgbnVsbCk7XG4gICAgfSBlbHNlIGlmIChwYXJhbXMucHJvamVjdF9uYW1lX2lzX25vdF9udWxsKSB7XG4gICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy5wcm9qZWN0X25hbWVcIiwgXCIhPVwiLCBudWxsKTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy5wcm9qZWN0X25hbWUpIHtcbiAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLnByb2plY3RfbmFtZVwiLCBwYXJhbXMucHJvamVjdF9uYW1lKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLm1vZGVsX25hbWUpIHtcbiAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLm1vZGVsX25hbWVcIiwgcGFyYW1zLm1vZGVsX25hbWUpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuc2VhcmNoICYmIHBhcmFtcy5rZXl3b3JkICYmIHBhcmFtcy5rZXl3b3JkLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChwYXJhbXMuc2VhcmNoID09PSBcImlkXCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MuaWRcIiwgTnVtYmVyKHBhcmFtcy5rZXl3b3JkKSk7XG4gICAgICB9IGVsc2UgaWYgKHBhcmFtcy5zZWFyY2ggPT09IFwidG9rZW5fbmFtZVwiKSB7XG4gICAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLnRva2VuX25hbWVcIiwgXCJsaWtlXCIsIGAlJHtwYXJhbXMua2V5d29yZH0lYCk7XG4gICAgICB9IGVsc2UgaWYgKHBhcmFtcy5zZWFyY2ggPT09IFwidXNlcl9wcm9tcHRcIikge1xuICAgICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy51c2VyX3Byb21wdFwiLCBcImxpa2VcIiwgYCUke3BhcmFtcy5rZXl3b3JkfSVgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFNEKFwiZXJyb3IudW5rbm93blNlYXJjaEZpZWxkXCIpKHBhcmFtcy5zZWFyY2gpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBvcmRlckJ5XG4gICAgaWYgKHBhcmFtcy5vcmRlckJ5KSB7XG4gICAgICAvLyBkZWZhdWx0IG9yZGVyQnlcbiAgICAgIGlmIChwYXJhbXMub3JkZXJCeSA9PT0gXCJpZC1kZXNjXCIpIHtcbiAgICAgICAgcWIub3JkZXJCeShcInJlcXVlc3RfbG9ncy5pZFwiLCBcImRlc2NcIik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGhhdXN0aXZlKHBhcmFtcy5vcmRlckJ5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7XG4gICAgICBBOiAocm93KSA9PiBub3JtYWxpemVMZWdhY3lBbnRocm9waWNSb3cocm93KSxcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVTdWJzZXRRdWVyeSh7XG4gICAgICBzdWJzZXQsXG4gICAgICBxYixcbiAgICAgIHBhcmFtcyxcbiAgICAgIGVuaGFuY2VycyxcbiAgICAgIGRlYnVnOiBmYWxzZSxcbiAgICB9KTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBzYXZlKHNwYTogUmVxdWVzdExvZ1NhdmVQYXJhbXNbXSk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuXG4gICAgLy8gcmVnaXN0ZXJcbiAgICBzcGEuZm9yRWFjaCgoc3ApID0+IHtcbiAgICAgIHdkYi51YlJlZ2lzdGVyKFwicmVxdWVzdF9sb2dzXCIsIHNwKTtcbiAgICB9KTtcblxuICAgIC8vIHRyYW5zYWN0aW9uXG4gICAgcmV0dXJuIHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBjb25zdCBpZHMgPSBhd2FpdCB0cngudWJVcHNlcnQoXCJyZXF1ZXN0X2xvZ3NcIik7XG5cbiAgICAgIHJldHVybiBpZHM7XG4gICAgfSk7XG4gIH1cblxuICAvLyDilIDilIAgUnVuIExpZmVjeWNsZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBhc3luYyBjcmVhdGVSdW4ocGFyYW1zOiB7XG4gICAgdXNlcl9wcm9tcHQ6IHN0cmluZztcbiAgICBzeXN0ZW1fcHJvbXB0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgZWZmb3J0Pzogc3RyaW5nIHwgbnVsbDtcbiAgICBwcm9qZWN0X25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgIGhpc3Rvcnk/OiB1bmtub3duO1xuICAgIHRvb2xzPzogVG9vbERlZmluaXRpb25zO1xuICAgIGlzX2ltYWdlX2dlbmVyYXRpb24/OiBib29sZWFuO1xuICB9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHdkYi51YlJlZ2lzdGVyKFwicmVxdWVzdF9sb2dzXCIsIHtcbiAgICAgIHVzZXJfcHJvbXB0OiBwYXJhbXMudXNlcl9wcm9tcHQsXG4gICAgICBzeXN0ZW1fcHJvbXB0OiBwYXJhbXMuc3lzdGVtX3Byb21wdCA/PyBudWxsLFxuICAgICAgLy8gcHJvdmlkZXIg7Iuk7ZaJIOyghOydtOuvgOuhnCBzZXJ2aW5nIG1vZGVs7J2AIOyVhOyngSDslYwg7IiYIOyXhuuLpC5cbiAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lOiBwYXJhbXMucmVxdWVzdGVkX21vZGVsX25hbWUgPz8gbnVsbCxcbiAgICAgIG1vZGVsX25hbWU6IG51bGwsXG4gICAgICBlZmZvcnQ6IHBhcmFtcy5lZmZvcnQgPz8gbnVsbCxcbiAgICAgIHByb2plY3RfbmFtZTogcGFyYW1zLnByb2plY3RfbmFtZSA/PyBudWxsLFxuICAgICAgc3RhdHVzOiBcInJ1bm5pbmdcIixcbiAgICAgIHJlc3BvbnNlOiBcIlwiLFxuICAgICAgaW5wdXRfdG9rZW5zOiAwLFxuICAgICAgb3V0cHV0X3Rva2VuczogMCxcbiAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiAwLFxuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiAwLFxuICAgICAgZHVyYXRpb25fbXM6IDAsXG4gICAgICB0b29sX2NhbGxfY291bnQ6IDAsXG4gICAgICAvLyDsnbTrr7jsp4AgdHVybiDsi53rs4QoUjEzKS4gcnVuIOqyveuhnCh0b29scytpbWFnZSDsobDtlakp64+EIGF1dG8g6rK966Gc7JmAIOuPmeydvO2VmOqyjCDrp4jtgrkuXG4gICAgICBpc19pbWFnZV9nZW5lcmF0aW9uOiBwYXJhbXMuaXNfaW1hZ2VfZ2VuZXJhdGlvbiA/PyBmYWxzZSxcbiAgICAgIC4uLihwYXJhbXMuaGlzdG9yeSAhPT0gdW5kZWZpbmVkID8geyBoaXN0b3J5OiBwYXJhbXMuaGlzdG9yeSBhcyB7IHR5cGU6IHN0cmluZyB9W10gfSA6IHt9KSxcbiAgICAgIC4uLihwYXJhbXMudG9vbHMgIT09IHVuZGVmaW5lZCA/IHsgdG9vbHM6IHBhcmFtcy50b29scyB9IDoge30pLFxuICAgIH0pO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgaWRzID0gYXdhaXQgdHJ4LnViVXBzZXJ0KFwicmVxdWVzdF9sb2dzXCIpO1xuICAgICAgcmV0dXJuIGlkc1swXSE7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBhcHBlbmRTdGVwKHJlcXVlc3RMb2dJZDogbnVtYmVyLCBzdGVwOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICB3ZGIudWJSZWdpc3RlcihcInJlcXVlc3RfbG9nX3N0ZXBzXCIsIHsgcmVxdWVzdF9sb2dfaWQ6IHJlcXVlc3RMb2dJZCwgLi4uc3RlcCB9KTtcbiAgICByZXR1cm4gd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGNvbnN0IGlkcyA9IGF3YWl0IHRyeC51YlVwc2VydChcInJlcXVlc3RfbG9nX3N0ZXBzXCIpO1xuICAgICAgaWYgKHN0ZXAudHlwZSA9PT0gXCJ0b29sX2NhbGxcIikge1xuICAgICAgICBhd2FpdCB0cnguZnJvbShcInJlcXVlc3RfbG9nc1wiKS53aGVyZShcImlkXCIsIHJlcXVlc3RMb2dJZCkuaW5jcmVtZW50KFwidG9vbF9jYWxsX2NvdW50XCIsIDEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlkc1swXSE7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmaW5pc2hSdW4oXG4gICAgcmVxdWVzdExvZ0lkOiBudW1iZXIsXG4gICAgcGFyYW1zOiB7XG4gICAgICBzdGF0dXM6IHN0cmluZztcbiAgICAgIHJlc3BvbnNlPzogc3RyaW5nO1xuICAgICAgdG9rZW5fbmFtZT86IHN0cmluZztcbiAgICAgIGlucHV0X3Rva2Vucz86IG51bWJlcjtcbiAgICAgIG91dHB1dF90b2tlbnM/OiBudW1iZXI7XG4gICAgICBjYWNoZV9yZWFkX3Rva2Vucz86IG51bWJlcjtcbiAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2Vucz86IG51bWJlcjtcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vucz86IG51bWJlciB8IG51bGw7XG4gICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM/OiBudW1iZXIgfCBudWxsO1xuICAgICAgZHVyYXRpb25fbXM/OiBudW1iZXI7XG4gICAgICByZXF1ZXN0ZWRfbW9kZWxfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgICBtb2RlbF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAgIGZhbGxiYWNrX2NvdW50PzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIGNvc3RfdXNkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIGNvc3Rfc291cmNlPzogc3RyaW5nIHwgbnVsbDtcbiAgICAgIGhpc3Rvcnk/OiB1bmtub3duO1xuICAgICAgZXJyb3JfbWVzc2FnZT86IHN0cmluZztcbiAgICAgIHRvb2xfY2FsbF9jb3VudD86IG51bWJlcjtcbiAgICAgIGltYWdlX2Nvc3RfdXNkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIGltYWdlX2Nvc3RfbWV0aG9kPzogc3RyaW5nIHwgbnVsbDtcbiAgICB9LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocGFyYW1zLnN0YXR1cyA9PT0gXCJzdWNjZWVkZWRcIiAmJiAhcGFyYW1zLnRva2VuX25hbWUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInRva2VuTmFtZSBpcyByZXF1aXJlZCBmb3Igc3VjY2VlZGVkIHJ1bnNcIik7XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IGlkOiByZXF1ZXN0TG9nSWQsIHN0YXR1czogcGFyYW1zLnN0YXR1cyB9O1xuICAgIGNvbnN0IGZpZWxkcyA9IFtcbiAgICAgIFwicmVzcG9uc2VcIixcbiAgICAgIFwidG9rZW5fbmFtZVwiLFxuICAgICAgXCJpbnB1dF90b2tlbnNcIixcbiAgICAgIFwib3V0cHV0X3Rva2Vuc1wiLFxuICAgICAgXCJjYWNoZV9yZWFkX3Rva2Vuc1wiLFxuICAgICAgXCJjYWNoZV9jcmVhdGlvbl90b2tlbnNcIixcbiAgICAgIFwiY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zXCIsXG4gICAgICBcImNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vuc1wiLFxuICAgICAgXCJkdXJhdGlvbl9tc1wiLFxuICAgICAgXCJyZXF1ZXN0ZWRfbW9kZWxfbmFtZVwiLFxuICAgICAgXCJtb2RlbF9uYW1lXCIsXG4gICAgICBcImZhbGxiYWNrX2NvdW50XCIsXG4gICAgICBcImNvc3RfdXNkXCIsXG4gICAgICBcImNvc3Rfc291cmNlXCIsXG4gICAgICBcImVycm9yX21lc3NhZ2VcIixcbiAgICAgIFwidG9vbF9jYWxsX2NvdW50XCIsXG4gICAgICBcImltYWdlX2Nvc3RfdXNkXCIsXG4gICAgICBcImltYWdlX2Nvc3RfbWV0aG9kXCIsXG4gICAgXSBhcyBjb25zdDtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBmaWVsZHMpIHtcbiAgICAgIGlmIChwYXJhbXNba2V5XSAhPT0gdW5kZWZpbmVkKSB1cGRhdGVba2V5XSA9IHBhcmFtc1trZXldO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmhpc3RvcnkgIT09IHVuZGVmaW5lZCkgdXBkYXRlLmhpc3RvcnkgPSBwYXJhbXMuaGlzdG9yeTtcbiAgICB1cGRhdGUudHRmdF9tcyA9IChhd2FpdCB0aGlzLmZpcnN0R2VuZXJhdGVTdGVwVHRmdChyZXF1ZXN0TG9nSWQpKSA/PyAwO1xuXG4gICAgLy8g7ISc67KEIHJ1biDqsr3roZzripQgc3RlcCDsl5DshJwg7ZmV7KCV7ZWcIGV4YWN0IGNvc3Qg66W8IOuEmOq4tOuLpC4g7Jm467aAL2xlZ2FjeSBjYWxsZXIg6rCAIOu5hOyaqeydhFxuICAgIC8vIOyDneuete2VnCDqsr3smrDsl5Drp4wg7KCA7J6l65CcIOuqqOuNuCt1c2FnZSDroZwg6rOE7IKw7ZWc64ukLlxuICAgIGlmIChcbiAgICAgIHBhcmFtcy5jb3N0X3VzZCA9PT0gdW5kZWZpbmVkICYmXG4gICAgICBwYXJhbXMuaW5wdXRfdG9rZW5zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIHBhcmFtcy5vdXRwdXRfdG9rZW5zICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIGNvbnN0IHJvdyA9IGF3YWl0IHRoaXMuZ2V0UHVyaShcInJcIilcbiAgICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgICAgLnNlbGVjdCh7IG1vZGVsX25hbWU6IFwibW9kZWxfbmFtZVwiIH0pXG4gICAgICAgIC53aGVyZShcImlkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgICAgLmZpcnN0KCk7XG4gICAgICBjb25zdCBlZmZlY3RpdmVNb2RlbE5hbWUgPSBwYXJhbXMubW9kZWxfbmFtZSA/PyByb3c/Lm1vZGVsX25hbWU7XG4gICAgICBpZiAoZWZmZWN0aXZlTW9kZWxOYW1lKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gY2Fub25pY2FsTW9kZWxOYW1lKGVmZmVjdGl2ZU1vZGVsTmFtZSk7XG4gICAgICAgIGNvbnN0IHVzYWdlID0gbm9ybWFsaXplZFVzYWdlRm9yQ29zdCh7XG4gICAgICAgICAgdG9rZW5fbmFtZTogcGFyYW1zLnRva2VuX25hbWUsXG4gICAgICAgICAgbW9kZWxfbmFtZTogZWZmZWN0aXZlTW9kZWxOYW1lLFxuICAgICAgICAgIGlucHV0X3Rva2VuczogcGFyYW1zLmlucHV0X3Rva2VucyxcbiAgICAgICAgICBvdXRwdXRfdG9rZW5zOiBwYXJhbXMub3V0cHV0X3Rva2VucyxcbiAgICAgICAgICBjYWNoZV9yZWFkX3Rva2VuczogcGFyYW1zLmNhY2hlX3JlYWRfdG9rZW5zID8/IDAsXG4gICAgICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBwYXJhbXMuY2FjaGVfY3JlYXRpb25fdG9rZW5zID8/IDAsXG4gICAgICAgICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBwYXJhbXMuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zLFxuICAgICAgICAgIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2VuczogcGFyYW1zLmNhY2hlX2NyZWF0aW9uXzFoX3Rva2VucyxcbiAgICAgICAgfSk7XG4gICAgICAgIHVwZGF0ZS5jb3N0X3VzZCA9IE1hdGgucm91bmQoXG4gICAgICAgICAgY2FsY3VsYXRlQ29zdFVzZChtb2RlbCwge1xuICAgICAgICAgICAgaW5wdXRUb2tlbnM6IHVzYWdlLmlucHV0VG9rZW5zLFxuICAgICAgICAgICAgb3V0cHV0VG9rZW5zOiB1c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogdXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IHVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VucyxcbiAgICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtOiB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSxcbiAgICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoOiB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaCxcbiAgICAgICAgICB9KSAqIDFfMDAwXzAwMCxcbiAgICAgICAgKTtcbiAgICAgICAgdXBkYXRlLmNvc3Rfc291cmNlID0gXCJwcmljaW5nX3RhYmxlXCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICB3ZGIudWJSZWdpc3RlcihcInJlcXVlc3RfbG9nc1wiLCB1cGRhdGUpO1xuICAgIGF3YWl0IHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBhd2FpdCB0cngudWJVcHNlcnQoXCJyZXF1ZXN0X2xvZ3NcIik7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmaXJzdEdlbmVyYXRlU3RlcFR0ZnQocmVxdWVzdExvZ0lkOiBudW1iZXIpOiBQcm9taXNlPG51bWJlciB8IG51bGw+IHtcbiAgICBjb25zdCByb3cgPSBhd2FpdCB0aGlzLmdldFB1cmkoXCJyXCIpXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpXG4gICAgICAuc2VsZWN0KHsgdHRmdF9tczogXCJ0dGZ0X21zXCIgfSlcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX2lkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC53aGVyZShcInR5cGVcIiwgXCJnZW5lcmF0ZVwiKVxuICAgICAgLndoZXJlKFwidHRmdF9tc1wiLCBcIiE9XCIsIG51bGwpXG4gICAgICAub3JkZXJCeShcInN0ZXBfaW5kZXhcIiwgXCJhc2NcIilcbiAgICAgIC5vcmRlckJ5KFwiaWRcIiwgXCJhc2NcIilcbiAgICAgIC5maXJzdCgpO1xuICAgIHJldHVybiByb3c/LnR0ZnRfbXMgPT09IG51bGwgfHwgcm93Py50dGZ0X21zID09PSB1bmRlZmluZWQgPyBudWxsIDogTnVtYmVyKHJvdy50dGZ0X21zKTtcbiAgfVxuXG4gIGFzeW5jIGFnZ3JlZ2F0ZVN0ZXBVc2FnZShyZXF1ZXN0TG9nSWQ6IG51bWJlcik6IFByb21pc2U8UmVxdWVzdExvZ1N0ZXBBZ2dyZWdhdGU+IHtcbiAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5nZXRQdXJpKFwiclwiKVxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgLnNlbGVjdChTVEVQX0FHR1JFR0FURV9TRUxFQ1QpXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19pZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAud2hlcmUoXCJ0eXBlXCIsIFwiZ2VuZXJhdGVcIik7XG4gICAgcmV0dXJuIGFnZ3JlZ2F0ZUdlbmVyYXRlU3RlcFJvd3Mocm93cyBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIHN0YWxlIGNhbmRpZGF0ZXMsIHRoZW4gZXhwaXJlcyBlYWNoIHJ1biBpbiBpdHMgb3duIHNob3J0IHRyYW5zYWN0aW9uLlxuICAgKiBUaGUgY2FuZGlkYXRlIHF1ZXJ5IGlzIG9ubHkgYSBoaW50OyB0aGUgdHJhbnNhY3Rpb25hbCBvcGVyYXRpb24gcmVjaGVja3MgaXRcbiAgICogYWZ0ZXIgYWNxdWlyaW5nIHRoZSBhZHZpc29yeSBsb2NrIHNoYXJlZCB3aXRoIHRvb2wgZm9sbG93LXVwcy5cbiAgICovXG4gIGFzeW5jIGV4cGlyZVN0YWxlVG9vbFdhaXRpbmdSdW5zKFxuICAgIHRocmVzaG9sZE1zOiBudW1iZXIsXG4gICAgZXJyb3JNZXNzYWdlOiBzdHJpbmcsXG4gICAgbGltaXQ6IG51bWJlciA9IDEwLFxuICApOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3QgdGhyZXNob2xkID0gbmV3IERhdGUoRGF0ZS5ub3coKSAtIHRocmVzaG9sZE1zKTtcbiAgICBjb25zdCBjYW5kaWRhdGVJZHMgPSBhd2FpdCB0aGlzLmZpbmRTdGFsZVRvb2xXYWl0aW5nUnVuQ2FuZGlkYXRlcyh0aHJlc2hvbGQsIGxpbWl0KTtcbiAgICBjb25zdCBleHBpcmVkSWRzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgcmVxdWVzdExvZ0lkIG9mIGNhbmRpZGF0ZUlkcykge1xuICAgICAgaWYgKGF3YWl0IHRoaXMudHJ5RXhwaXJlU3RhbGVUb29sV2FpdGluZ1J1bihyZXF1ZXN0TG9nSWQsIHRocmVzaG9sZCwgZXJyb3JNZXNzYWdlKSkge1xuICAgICAgICBleHBpcmVkSWRzLnB1c2gocmVxdWVzdExvZ0lkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGV4cGlyZWRJZHM7XG4gIH1cblxuICBhc3luYyBmaW5kU3RhbGVUb29sV2FpdGluZ1J1bkNhbmRpZGF0ZXModGhyZXNob2xkOiBEYXRlLCBsaW1pdDogbnVtYmVyKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLmdldFB1cmkoXCJ3XCIpXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgLmpvaW4oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiLCBcInJlcXVlc3RfbG9ncy5pZFwiLCBcInJlcXVlc3RfbG9nX3N0ZXBzLnJlcXVlc3RfbG9nX2lkXCIpXG4gICAgICAuZGlzdGluY3QoXCJyZXF1ZXN0X2xvZ3MuaWRcIilcbiAgICAgIC5zZWxlY3QoeyBpZDogXCJyZXF1ZXN0X2xvZ3MuaWRcIiB9KVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dzLnN0YXR1c1wiLCBcInJ1bm5pbmdcIilcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX3N0ZXBzLnR5cGVcIiwgXCJ0b29sX2NhbGxcIilcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX3N0ZXBzLmNyZWF0ZWRfYXRcIiwgXCI8XCIsIHRocmVzaG9sZClcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX3N0ZXBzLnRvb2xfcmVzdWx0XCIsIG51bGwpXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19zdGVwcy5lcnJvclwiLCBudWxsKVxuICAgICAgLmxpbWl0KGxpbWl0KTtcbiAgICByZXR1cm4gcm93cy5tYXAoKHsgaWQgfSkgPT4gaWQpO1xuICB9XG5cbiAgQHRyYW5zYWN0aW9uYWwoeyBkYlByZXNldDogXCJ3XCIgfSlcbiAgYXN5bmMgdHJ5RXhwaXJlU3RhbGVUb29sV2FpdGluZ1J1bihcbiAgICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgICB0aHJlc2hvbGQ6IERhdGUsXG4gICAgZXJyb3JNZXNzYWdlOiBzdHJpbmcsXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgY29uc3QgbG9ja1Jlc3VsdCA9IChhd2FpdCB3ZGIua25leC5yYXcoXCJTRUxFQ1QgcGdfdHJ5X2Fkdmlzb3J5X3hhY3RfbG9jayg/LCA/KSBBUyBhY3F1aXJlZFwiLCBbXG4gICAgICBSRVFVRVNUX0xPR19SVU5fTE9DS19DTEFTU19JRCxcbiAgICAgIHJlcXVlc3RMb2dJZCxcbiAgICBdKSkgYXMgeyByb3dzPzogQXJyYXk8eyBhY3F1aXJlZD86IGJvb2xlYW4gfT4gfTtcbiAgICBpZiAobG9ja1Jlc3VsdC5yb3dzPy5bMF0/LmFjcXVpcmVkICE9PSB0cnVlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAvLyBUaGUgZm9sbG93LXVwIHBhdGggdXNlcyB0aGUgc2FtZSB3cml0ZXIgdHJhbnNhY3Rpb24gbG9jay4gUmVjaGVjayBhZnRlclxuICAgIC8vIGxvY2tpbmcgc28gYSByZXN1bHQgY29tbWl0dGVkIGR1cmluZyBjYW5kaWRhdGUgZGlzY292ZXJ5IG1ha2VzIHRoaXMgYSBuby1vcC5cbiAgICBjb25zdCB1bnJlc29sdmVkID0gYXdhaXQgd2RiXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpXG4gICAgICAuc2VsZWN0KHsgaWQ6IFwiaWRcIiB9KVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgLndoZXJlKFwidHlwZVwiLCBcInRvb2xfY2FsbFwiKVxuICAgICAgLndoZXJlKFwiY3JlYXRlZF9hdFwiLCBcIjxcIiwgdGhyZXNob2xkKVxuICAgICAgLndoZXJlKFwidG9vbF9yZXN1bHRcIiwgbnVsbClcbiAgICAgIC53aGVyZShcImVycm9yXCIsIG51bGwpXG4gICAgICAuZmlyc3QoKTtcbiAgICBpZiAoIXVucmVzb2x2ZWQpIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IHN0ZXBSb3dzID0gYXdhaXQgd2RiXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpXG4gICAgICAuc2VsZWN0KFNURVBfQUdHUkVHQVRFX1NFTEVDVClcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX2lkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC53aGVyZShcInR5cGVcIiwgXCJnZW5lcmF0ZVwiKTtcbiAgICBjb25zdCBhZ2dyZWdhdGUgPSBhZ2dyZWdhdGVHZW5lcmF0ZVN0ZXBSb3dzKHN0ZXBSb3dzIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pik7XG4gICAgY29uc3QgZmlyc3RUdGZ0ID0gYXdhaXQgd2RiXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpXG4gICAgICAuc2VsZWN0KHsgdHRmdF9tczogXCJ0dGZ0X21zXCIgfSlcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX2lkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC53aGVyZShcInR5cGVcIiwgXCJnZW5lcmF0ZVwiKVxuICAgICAgLndoZXJlKFwidHRmdF9tc1wiLCBcIiE9XCIsIG51bGwpXG4gICAgICAub3JkZXJCeShcInN0ZXBfaW5kZXhcIiwgXCJhc2NcIilcbiAgICAgIC5vcmRlckJ5KFwiaWRcIiwgXCJhc2NcIilcbiAgICAgIC5maXJzdCgpO1xuXG4gICAgY29uc3QgdXBkYXRlZCA9IGF3YWl0IHdkYlxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgIC53aGVyZShcImlkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC53aGVyZShcInN0YXR1c1wiLCBcInJ1bm5pbmdcIilcbiAgICAgIC51cGRhdGUoe1xuICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIixcbiAgICAgICAgZXJyb3JfbWVzc2FnZTogZXJyb3JNZXNzYWdlLFxuICAgICAgICBpbnB1dF90b2tlbnM6IGFnZ3JlZ2F0ZS5pbnB1dF90b2tlbnMsXG4gICAgICAgIG91dHB1dF90b2tlbnM6IGFnZ3JlZ2F0ZS5vdXRwdXRfdG9rZW5zLFxuICAgICAgICBjYWNoZV9yZWFkX3Rva2VuczogYWdncmVnYXRlLmNhY2hlX3JlYWRfdG9rZW5zLFxuICAgICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IGFnZ3JlZ2F0ZS5jYWNoZV9jcmVhdGlvbl90b2tlbnMsXG4gICAgICAgIC4uLihhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHsgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBhZ2dyZWdhdGUuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgLi4uKGFnZ3JlZ2F0ZS5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8geyBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IGFnZ3JlZ2F0ZS5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnMgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICBkdXJhdGlvbl9tczogYWdncmVnYXRlLmR1cmF0aW9uX21zLFxuICAgICAgICBmYWxsYmFja19jb3VudDogYWdncmVnYXRlLmZhbGxiYWNrX2NvdW50LFxuICAgICAgICBjb3N0X3VzZDogYWdncmVnYXRlLmNvc3RfdXNkLFxuICAgICAgICAuLi4oYWdncmVnYXRlLmNvc3Rfc291cmNlICE9PSB1bmRlZmluZWQgPyB7IGNvc3Rfc291cmNlOiBhZ2dyZWdhdGUuY29zdF9zb3VyY2UgfSA6IHt9KSxcbiAgICAgICAgdHRmdF9tczpcbiAgICAgICAgICBmaXJzdFR0ZnQ/LnR0ZnRfbXMgPT09IG51bGwgfHwgZmlyc3RUdGZ0Py50dGZ0X21zID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgOiBOdW1iZXIoZmlyc3RUdGZ0LnR0ZnRfbXMpLFxuICAgICAgfSk7XG4gICAgcmV0dXJuIHVwZGF0ZWQgPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgYSBuYXRpdmUgcWdyaWQgdG9vbCBmb2xsb3ctdXAgYW5kIGNvbXB1dGVzIGl0cyBuZXh0IHN0ZXAgaW5kZXggd2hpbGVcbiAgICogaG9sZGluZyB0aGUgcGVyLXJ1biBhZHZpc29yeSBsb2NrIHNoYXJlZCB3aXRoIHN0YWxlIGNsZWFudXAuXG4gICAqL1xuICBAdHJhbnNhY3Rpb25hbCh7IGRiUHJlc2V0OiBcIndcIiB9KVxuICBhc3luYyBjb250aW51ZVRvb2xSdW4oXG4gICAgcmVxdWVzdExvZ0lkOiBudW1iZXIsXG4gICAgdG9vbFJlc3VsdHM6IFRvb2xSZXN1bHRDb250aW51YXRpb25bXSxcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIGF3YWl0IHdkYi5rbmV4LnJhdyhcIlNFTEVDVCBwZ19hZHZpc29yeV94YWN0X2xvY2soPywgPylcIiwgW1xuICAgICAgUkVRVUVTVF9MT0dfUlVOX0xPQ0tfQ0xBU1NfSUQsXG4gICAgICByZXF1ZXN0TG9nSWQsXG4gICAgXSk7XG5cbiAgICBjb25zdCBydW4gPSBhd2FpdCB3ZGJcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAuc2VsZWN0KHsgc3RhdHVzOiBcInN0YXR1c1wiIH0pXG4gICAgICAud2hlcmUoXCJpZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAuZmlyc3QoKTtcbiAgICBpZiAoIXJ1bikgdGhyb3cgbmV3IEVycm9yKGByZXF1ZXN0IGxvZyBydW4gJHtyZXF1ZXN0TG9nSWR9IG5vdCBmb3VuZGApO1xuICAgIGlmIChydW4uc3RhdHVzICE9PSBcInJ1bm5pbmdcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGByZXF1ZXN0IGxvZyBydW4gJHtyZXF1ZXN0TG9nSWR9IGlzIGFscmVhZHkgJHtydW4uc3RhdHVzfWApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHRvb2xSZXN1bHRzKSB7XG4gICAgICBhd2FpdCB3ZGJcbiAgICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19pZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAgIC53aGVyZShcInRvb2xfY2FsbF9pZFwiLCByZXN1bHQudG9vbENhbGxJZClcbiAgICAgICAgLndoZXJlKFwidHlwZVwiLCBcInRvb2xfY2FsbFwiKVxuICAgICAgICAudXBkYXRlKHJlc3VsdC5pc0Vycm9yID8geyBlcnJvcjogcmVzdWx0Lm91dHB1dCB9IDogeyB0b29sX3Jlc3VsdDogcmVzdWx0Lm91dHB1dCB9KTtcbiAgICB9XG5cbiAgICBjb25zdCByb3cgPSBhd2FpdCB3ZGJcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgIC5zZWxlY3QoeyBtYXhfc3RlcDogUHVyaS5tYXgoXCJzdGVwX2luZGV4XCIpIH0pXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19pZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAuZmlyc3QoKTtcbiAgICByZXR1cm4gKHJvdz8ubWF4X3N0ZXAgPz8gLTEpICsgMTtcbiAgfVxuXG4gIC8vIFNvbmFtdSBmaW5kTWFueeuKlCBzdWJzZXQg7KCE7LK0IOy7rOufvCh0ZXh0IO2PrO2VqCnsnYQg7Y6Y7LmY7ZWY66+A66GcIOu5hOyaqSDqs4TsgrDsl5Ag7ZWE7JqU7ZWcIOy7rOufvOunjCDsobDtmoztlZzri6QuXG4gIGFzeW5jIHRvdGFsQ29zdChwYXJhbXM6IHsgdG9rZW5fbmFtZT86IHN0cmluZyB9ID0ge30pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIC8vIOq4sOyhtCBjb3N0X3VzZCDsl5DripQg6rO86rGwIEFudGhyb3BpYyBjYWNoZSDqs4TsgrAg67KE6re466GcIOydjOyImOqwgCDsoIDsnqXrkJwgcm93IOqwgCDsnojsnYQg7IiYIOyeiOuLpC5cbiAgICAvLyDtmZTrqbQg7KeR6rOE64qUIOyggOyepeqwkiBzdW0g7J20IOyVhOuLiOudvCDtmITsnqwg6rOE7IKw7Iud7Jy866GcIHVzYWdlIOulvCDsnqzqs4TsgrDtlbQg6rO86rGwIOuhnOq3uOuPhCDsponsi5wg67O07KCV7ZWc64ukLlxuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLmdldFB1cmkoXCJyXCIpXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgLndoZXJlKHBhcmFtcy50b2tlbl9uYW1lID8geyB0b2tlbl9uYW1lOiBwYXJhbXMudG9rZW5fbmFtZSB9IDoge30pXG4gICAgICAuc2VsZWN0KHtcbiAgICAgICAgbW9kZWxfbmFtZTogXCJtb2RlbF9uYW1lXCIsXG4gICAgICAgIGlucHV0X3Rva2VuczogXCJpbnB1dF90b2tlbnNcIixcbiAgICAgICAgb3V0cHV0X3Rva2VuczogXCJvdXRwdXRfdG9rZW5zXCIsXG4gICAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBcImNhY2hlX3JlYWRfdG9rZW5zXCIsXG4gICAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogXCJjYWNoZV9jcmVhdGlvbl90b2tlbnNcIixcbiAgICAgICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBcImNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiLFxuICAgICAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IFwiY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCIsXG4gICAgICAgIGNvc3RfdXNkOiBcImNvc3RfdXNkXCIsXG4gICAgICAgIGNvc3Rfc291cmNlOiBcImNvc3Rfc291cmNlXCIsXG4gICAgICB9KTtcblxuICAgIHJldHVybiByb3dzLnJlZHVjZSgoc3VtLCByb3cpID0+IHtcbiAgICAgIC8vIGNvc3Rfc291cmNlIOqwgCDsnojsnLzrqbQg7IOIIOqzhOyVveycvOuhnCDtmZXsoJUg7KCA7J6l65CcIOqwkuydtOuLpC4g7ZSE66Gc66qo7IWYL+qwgOqyqSDrs4Dqsr0g7J207ZuE7JeQ64+EXG4gICAgICAvLyDri7nsi5wg67mE7Jqp7J2EIOycoOyngO2VnOuLpC4gTlVMTOyduCBsZWdhY3kgcm93IOunjCDtmITsnqwg6rCA6rKp7ZGc66GcIOuztOygle2VnOuLpC5cbiAgICAgIGlmIChyb3cuY29zdF9zb3VyY2UgJiYgcm93LmNvc3RfdXNkICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBzdW0gKyBNYXRoLm1heChyb3cuY29zdF91c2QsIDApIC8gTUlDUk9fVVNEO1xuICAgICAgfVxuICAgICAgY29uc3QgdXNhZ2UgPSBub3JtYWxpemVkVXNhZ2VGb3JDb3N0KHJvdyk7XG4gICAgICBpZiAoIXVzYWdlLm1vZGVsKSByZXR1cm4gc3VtICsgTWF0aC5tYXgocm93LmNvc3RfdXNkID8/IDAsIDApIC8gTUlDUk9fVVNEO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgc3VtICtcbiAgICAgICAgY2FsY3VsYXRlQ29zdFVzZCh1c2FnZS5tb2RlbCwge1xuICAgICAgICAgIGlucHV0VG9rZW5zOiB1c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICBvdXRwdXRUb2tlbnM6IHVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICBjYWNoZWRJbnB1dFRva2VuczogdXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMsXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMsXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW06IHVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtLFxuICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoOiB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaCxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBhc3luYyBkaXN0aW5jdFByb2plY3ROYW1lcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMuZ2V0UHVyaShcInJcIilcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAuZGlzdGluY3QoXCJwcm9qZWN0X25hbWVcIilcbiAgICAgIC53aGVyZShcInByb2plY3RfbmFtZVwiLCBcIiE9XCIsIG51bGwpXG4gICAgICAub3JkZXJCeShcInByb2plY3RfbmFtZVwiLCBcImFzY1wiKVxuICAgICAgLnNlbGVjdCh7XG4gICAgICAgIHByb2plY3RfbmFtZTogXCJwcm9qZWN0X25hbWVcIixcbiAgICAgIH0pO1xuICAgIHJldHVybiByb3dzLm1hcCgocikgPT4gci5wcm9qZWN0X25hbWUhKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIlBPU1RcIiwgY2xpZW50czogW1wiYXhpb3NcIiwgXCJ0YW5zdGFjay1tdXRhdGlvblwiXSB9KVxuICBhc3luYyBkZWwoaWRzOiBudW1iZXJbXSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcblxuICAgIC8vIHRyYW5zYWN0aW9uXG4gICAgYXdhaXQgd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGF3YWl0IHRyeFxuICAgICAgICAudGFibGUoXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgICAud2hlcmVJbihcInJlcXVlc3RfbG9nX3N0ZXBzLnJlcXVlc3RfbG9nX2lkXCIsIGlkcylcbiAgICAgICAgLmRlbGV0ZSgpO1xuICAgICAgcmV0dXJuIHRyeC50YWJsZShcInJlcXVlc3RfbG9nc1wiKS53aGVyZUluKFwicmVxdWVzdF9sb2dzLmlkXCIsIGlkcykuZGVsZXRlKCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaWRzLmxlbmd0aDtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgUmVxdWVzdExvZ01vZGVsID0gbmV3IFJlcXVlc3RMb2dNb2RlbENsYXNzKCk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUF1QkEsTUFBYSxZQUFZO0FBQ3pCLE1BQU0sZ0NBQWdDO0FBcUJ0QyxNQUFNLHdCQUF3QjtDQUM1QixjQUFjO0NBQ2QsZUFBZTtDQUNmLG1CQUFtQjtDQUNuQix1QkFBdUI7Q0FDdkIsMEJBQTBCO0NBQzFCLDBCQUEwQjtDQUMxQixhQUFhO0NBQ2IsZ0JBQWdCO0NBQ2hCLFVBQVU7Q0FDVixhQUFhO0FBQ2Y7QUFFQSxTQUFTLDBCQUEwQixNQUErRDtDQUNoRyxNQUFNLE9BQU8sVUFDWCxL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
|
|
457
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1sb2cubW9kZWwuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2FwcGxpY2F0aW9uL3JlcXVlc3QtbG9nL3JlcXVlc3QtbG9nLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGFwaSxcbiAgYXNBcnJheSxcbiAgQmFkUmVxdWVzdEV4Y2VwdGlvbixcbiAgQmFzZU1vZGVsQ2xhc3MsXG4gIHR5cGUgTGlzdFJlc3VsdCxcbiAgTm90Rm91bmRFeGNlcHRpb24sXG4gIFB1cmksXG4gIHRyYW5zYWN0aW9uYWwsXG59IGZyb20gXCJzb25hbXVcIjtcblxuaW1wb3J0IHsgU0QgfSBmcm9tIFwiLi4vLi4vaTE4bi9zZC5nZW5lcmF0ZWRcIjtcbmltcG9ydCB7IGNhbGN1bGF0ZUNvc3RVc2QgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0XCI7XG5pbXBvcnQgeyB0eXBlIFJlcXVlc3RMb2dTdWJzZXRLZXksIHR5cGUgUmVxdWVzdExvZ1N1YnNldE1hcHBpbmcgfSBmcm9tIFwiLi4vc29uYW11LmdlbmVyYXRlZFwiO1xuaW1wb3J0IHsgcmVxdWVzdExvZ0xvYWRlclF1ZXJpZXMsIHJlcXVlc3RMb2dTdWJzZXRRdWVyaWVzIH0gZnJvbSBcIi4uL3NvbmFtdS5nZW5lcmF0ZWQuc3NvXCI7XG5pbXBvcnQge1xuICB0eXBlIFJlcXVlc3RMb2dMaXN0UGFyYW1zLFxuICB0eXBlIFJlcXVlc3RMb2dTYXZlUGFyYW1zLFxuICB0eXBlIFRvb2xEZWZpbml0aW9ucyxcbn0gZnJvbSBcIi4vcmVxdWVzdC1sb2cudHlwZXNcIjtcblxuLy8gY29zdF91c2TripQg7KCV7IiYIG1pY3JvLVVTROuhnCDsoIDsnqUuIOyLpOygnCBVU0QgPSBjb3N0X3VzZCAvIE1JQ1JPX1VTRC5cbmV4cG9ydCBjb25zdCBNSUNST19VU0QgPSAxXzAwMF8wMDA7XG5jb25zdCBSRVFVRVNUX0xPR19SVU5fTE9DS19DTEFTU19JRCA9IDcxODtcblxudHlwZSBUb29sUmVzdWx0Q29udGludWF0aW9uID0ge1xuICB0b29sQ2FsbElkOiBzdHJpbmc7XG4gIG91dHB1dDogc3RyaW5nO1xuICBpc0Vycm9yPzogYm9vbGVhbjtcbn07XG5cbnR5cGUgUmVxdWVzdExvZ1N0ZXBBZ2dyZWdhdGUgPSB7XG4gIGlucHV0X3Rva2VuczogbnVtYmVyO1xuICBvdXRwdXRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX3JlYWRfdG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogbnVtYmVyO1xuICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM/OiBudW1iZXI7XG4gIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vucz86IG51bWJlcjtcbiAgZHVyYXRpb25fbXM6IG51bWJlcjtcbiAgZmFsbGJhY2tfY291bnQ6IG51bWJlcjtcbiAgY29zdF91c2Q6IG51bWJlcjtcbiAgY29zdF9zb3VyY2U/OiBzdHJpbmc7XG59O1xuXG5jb25zdCBTVEVQX0FHR1JFR0FURV9TRUxFQ1QgPSB7XG4gIGlucHV0X3Rva2VuczogXCJpbnB1dF90b2tlbnNcIixcbiAgb3V0cHV0X3Rva2VuczogXCJvdXRwdXRfdG9rZW5zXCIsXG4gIGNhY2hlX3JlYWRfdG9rZW5zOiBcImNhY2hlX3JlYWRfdG9rZW5zXCIsXG4gIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogXCJjYWNoZV9jcmVhdGlvbl90b2tlbnNcIixcbiAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBcImNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiLFxuICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IFwiY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCIsXG4gIGR1cmF0aW9uX21zOiBcImR1cmF0aW9uX21zXCIsXG4gIGZhbGxiYWNrX2NvdW50OiBcImZhbGxiYWNrX2NvdW50XCIsXG4gIGNvc3RfdXNkOiBcImNvc3RfdXNkXCIsXG4gIGNvc3Rfc291cmNlOiBcImNvc3Rfc291cmNlXCIsXG59IGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBhZ2dyZWdhdGVHZW5lcmF0ZVN0ZXBSb3dzKHJvd3M6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pik6IFJlcXVlc3RMb2dTdGVwQWdncmVnYXRlIHtcbiAgY29uc3Qgc3VtID0gKGZpZWxkOiBzdHJpbmcpOiBudW1iZXIgPT5cbiAgICByb3dzLnJlZHVjZSgodG90YWwsIHJvdykgPT4gdG90YWwgKyBOdW1iZXIocm93W2ZpZWxkXSA/PyAwKSwgMCk7XG4gIGNvbnN0IG9wdGlvbmFsU3VtID0gKGZpZWxkOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQgPT5cbiAgICByb3dzLnNvbWUoKHJvdykgPT4gcm93W2ZpZWxkXSAhPT0gbnVsbCAmJiByb3dbZmllbGRdICE9PSB1bmRlZmluZWQpID8gc3VtKGZpZWxkKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgY29sbGFwc2UgPSAoZmllbGQ6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB7XG4gICAgY29uc3QgdmFsdWVzID0gW1xuICAgICAgLi4ubmV3IFNldChcbiAgICAgICAgcm93c1xuICAgICAgICAgIC5tYXAoKHJvdykgPT4gcm93W2ZpZWxkXSlcbiAgICAgICAgICAuZmlsdGVyKCh2YWx1ZSk6IHZhbHVlIGlzIHN0cmluZyA9PiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWUubGVuZ3RoID4gMCksXG4gICAgICApLFxuICAgIF07XG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHZhbHVlcy5sZW5ndGggPT09IDEgPyB2YWx1ZXNbMF0gOiBcIm1peGVkXCI7XG4gIH07XG4gIHJldHVybiB7XG4gICAgaW5wdXRfdG9rZW5zOiBzdW0oXCJpbnB1dF90b2tlbnNcIiksXG4gICAgb3V0cHV0X3Rva2Vuczogc3VtKFwib3V0cHV0X3Rva2Vuc1wiKSxcbiAgICBjYWNoZV9yZWFkX3Rva2Vuczogc3VtKFwiY2FjaGVfcmVhZF90b2tlbnNcIiksXG4gICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBzdW0oXCJjYWNoZV9jcmVhdGlvbl90b2tlbnNcIiksXG4gICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBvcHRpb25hbFN1bShcImNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiKSxcbiAgICBjYWNoZV9jcmVhdGlvbl8xaF90b2tlbnM6IG9wdGlvbmFsU3VtKFwiY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCIpLFxuICAgIGR1cmF0aW9uX21zOiBzdW0oXCJkdXJhdGlvbl9tc1wiKSxcbiAgICBmYWxsYmFja19jb3VudDogc3VtKFwiZmFsbGJhY2tfY291bnRcIiksXG4gICAgY29zdF91c2Q6IHN1bShcImNvc3RfdXNkXCIpLFxuICAgIGNvc3Rfc291cmNlOiBjb2xsYXBzZShcImNvc3Rfc291cmNlXCIpLFxuICB9O1xufVxuXG50eXBlIFJlcXVlc3RMb2dVc2FnZVJvdyA9IHtcbiAgdG9rZW5fbmFtZT86IHN0cmluZyB8IG51bGw7XG4gIG1vZGVsX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICBpbnB1dF90b2tlbnM6IG51bWJlcjtcbiAgb3V0cHV0X3Rva2VuczogbnVtYmVyO1xuICBjYWNoZV9yZWFkX3Rva2VuczogbnVtYmVyO1xuICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IG51bWJlcjtcbiAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcbiAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcbiAgY29zdF91c2Q/OiBudW1iZXIgfCBudWxsO1xuICBjb3N0X3NvdXJjZT86IHN0cmluZyB8IG51bGw7XG59O1xuXG5mdW5jdGlvbiBpc0FudGhyb3BpY1VzYWdlUm93KHJvdzogUGljazxSZXF1ZXN0TG9nVXNhZ2VSb3csIFwidG9rZW5fbmFtZVwiIHwgXCJtb2RlbF9uYW1lXCI+KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgcm93LnRva2VuX25hbWU/LnN0YXJ0c1dpdGgoXCJhbnRocm9waWMvXCIpID09PSB0cnVlIHx8XG4gICAgcm93Lm1vZGVsX25hbWU/LnN0YXJ0c1dpdGgoXCJjbGF1ZGUtXCIpID09PSB0cnVlIHx8XG4gICAgcm93Lm1vZGVsX25hbWU/LnN0YXJ0c1dpdGgoXCJhbnRocm9waWMvY2xhdWRlLVwiKSA9PT0gdHJ1ZVxuICApO1xufVxuXG5mdW5jdGlvbiBjYW5vbmljYWxNb2RlbE5hbWUobW9kZWxOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gbW9kZWxOYW1lLmluY2x1ZGVzKFwiL1wiKSA/IG1vZGVsTmFtZS5zcGxpdChcIi9cIikucG9wKCkhIDogbW9kZWxOYW1lO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVkVXNhZ2VGb3JDb3N0KHJvdzogUmVxdWVzdExvZ1VzYWdlUm93KToge1xuICBtb2RlbDogc3RyaW5nIHwgbnVsbDtcbiAgaW5wdXRUb2tlbnM6IG51bWJlcjtcbiAgb3V0cHV0VG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlZElucHV0VG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogbnVtYmVyO1xuICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bT86IG51bWJlcjtcbiAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg/OiBudW1iZXI7XG59IHtcbiAgY29uc3QgY2FjaGVSZWFkID0gcm93LmNhY2hlX3JlYWRfdG9rZW5zO1xuICBjb25zdCBjYWNoZUNyZWF0aW9uID0gcm93LmNhY2hlX2NyZWF0aW9uX3Rva2VucztcbiAgY29uc3Qgc3RvcmVkSW5wdXQgPSByb3cuaW5wdXRfdG9rZW5zO1xuICBjb25zdCBsZWdhY3lBbnRocm9waWNTcGxpdElucHV0ID1cbiAgICBpc0FudGhyb3BpY1VzYWdlUm93KHJvdykgJiYgc3RvcmVkSW5wdXQgPCBjYWNoZVJlYWQgKyBjYWNoZUNyZWF0aW9uO1xuICByZXR1cm4ge1xuICAgIG1vZGVsOiByb3cubW9kZWxfbmFtZSA/IGNhbm9uaWNhbE1vZGVsTmFtZShyb3cubW9kZWxfbmFtZSkgOiBudWxsLFxuICAgIGlucHV0VG9rZW5zOiBsZWdhY3lBbnRocm9waWNTcGxpdElucHV0ID8gc3RvcmVkSW5wdXQgKyBjYWNoZVJlYWQgKyBjYWNoZUNyZWF0aW9uIDogc3RvcmVkSW5wdXQsXG4gICAgb3V0cHV0VG9rZW5zOiByb3cub3V0cHV0X3Rva2VucyxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogY2FjaGVSZWFkLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogY2FjaGVDcmVhdGlvbixcbiAgICAuLi4ocm93LmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyAhPT0gbnVsbCAmJiByb3cuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zICE9PSB1bmRlZmluZWRcbiAgICAgID8geyBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bTogcm93LmNhY2hlX2NyZWF0aW9uXzVtX3Rva2VucyB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4ocm93LmNhY2hlX2NyZWF0aW9uXzFoX3Rva2VucyAhPT0gbnVsbCAmJiByb3cuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zICE9PSB1bmRlZmluZWRcbiAgICAgID8geyBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaDogcm93LmNhY2hlX2NyZWF0aW9uXzFoX3Rva2VucyB9XG4gICAgICA6IHt9KSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplTGVnYWN5QW50aHJvcGljUm93PFQgZXh0ZW5kcyBSZXF1ZXN0TG9nVXNhZ2VSb3c+KHJvdzogVCk6IFQge1xuICAvLyDsg4ggcm93IOuKlCDri7nsi5zsnZggcHJvdmlkZXIv6rCA6rKp7ZGcIOu5hOyaqeydhCDtmZXsoJUg7KCA7J6l7ZWc64ukLiDtmITsnqwg6rCA6rKp7ZGc66GcIOuNruyWtOyTsOyngCDslYrripTri6QuXG4gIGlmIChyb3cuY29zdF9zb3VyY2UpIHJldHVybiByb3c7XG4gIGNvbnN0IHVzYWdlID0gbm9ybWFsaXplZFVzYWdlRm9yQ29zdChyb3cpO1xuICBpZiAodXNhZ2UuaW5wdXRUb2tlbnMgPT09IHJvdy5pbnB1dF90b2tlbnMpIHJldHVybiByb3c7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSB7IC4uLnJvdywgaW5wdXRfdG9rZW5zOiB1c2FnZS5pbnB1dFRva2VucyB9O1xuICBpZiAodXNhZ2UubW9kZWwpIHtcbiAgICBub3JtYWxpemVkLmNvc3RfdXNkID0gTWF0aC5yb3VuZChjYWxjdWxhdGVDb3N0VXNkKHVzYWdlLm1vZGVsLCB1c2FnZSkgKiBNSUNST19VU0QpO1xuICB9XG4gIHJldHVybiBub3JtYWxpemVkO1xufVxuXG4vKipcbiAqIGBvcmRlckJ5YCBlbnVtIOqwkihg7Lus65+8Leuwqe2WpWAp7J2EIOygleugrCDsoIjroZwg7Jiu6ri064ukLlxuICpcbiAqIGVudW0g7J20IDE4IOyiheydtOudvCDsvIDsnbTsiqTrpbwg7J287J287J20IOyggeuKlCDrjIDsi6Ag7YyM7Iux7ZWY65CYLCDsu6zrn7zsnYAg7JWE656YIOuqqeuhneycvOuhnCDtlZzsoJXtlZzri6Qg4oCUXG4gKiDrrLjsnpDsl7TsnYQg6re464yA66GcIOy7rOufvOuqheyXkCDrhJjquLDrqbQgZW51bSDsnbQg67CU64CUIOuVjCDqsoDspp0g7JeG64qUIOyLneuzhOyekOqwgCBTUUwg66GcIO2dmOufrOuToOuLpC5cbiAqIOuqqeuhneyXkCDsl4bripQg6rCS7J2AIOq4sOuzuCDsoJXroKwoaWQgZGVzYynroZwg65ao7Ja07KeE64ukLlxuICovXG5jb25zdCBPUkRFUkFCTEVfQ09MVU1OUyA9IHtcbiAgaWQ6IFwicmVxdWVzdF9sb2dzLmlkXCIsXG4gIGNyZWF0ZWRfYXQ6IFwicmVxdWVzdF9sb2dzLmNyZWF0ZWRfYXRcIixcbiAgdHRmdF9tczogXCJyZXF1ZXN0X2xvZ3MudHRmdF9tc1wiLFxuICBkdXJhdGlvbl9tczogXCJyZXF1ZXN0X2xvZ3MuZHVyYXRpb25fbXNcIixcbiAgaW5wdXRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5pbnB1dF90b2tlbnNcIixcbiAgb3V0cHV0X3Rva2VuczogXCJyZXF1ZXN0X2xvZ3Mub3V0cHV0X3Rva2Vuc1wiLFxuICBjYWNoZV9yZWFkX3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuY2FjaGVfcmVhZF90b2tlbnNcIixcbiAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9jcmVhdGlvbl90b2tlbnNcIixcbiAgY29zdF91c2Q6IFwicmVxdWVzdF9sb2dzLmNvc3RfdXNkXCIsXG59IGFzIGNvbnN0O1xuXG5mdW5jdGlvbiBhcHBseU9yZGVyQnkoXG4gIHFiOiBSZXR1cm5UeXBlPFJlcXVlc3RMb2dNb2RlbENsYXNzW1wiZ2V0U3Vic2V0UXVlcmllc1wiXT5bXCJxYlwiXSxcbiAgb3JkZXJCeTogc3RyaW5nLFxuKTogdm9pZCB7XG4gIGNvbnN0IHNlcGFyYXRvciA9IG9yZGVyQnkubGFzdEluZGV4T2YoXCItXCIpO1xuICBjb25zdCBrZXkgPSBvcmRlckJ5LnNsaWNlKDAsIHNlcGFyYXRvcikgYXMga2V5b2YgdHlwZW9mIE9SREVSQUJMRV9DT0xVTU5TO1xuICBjb25zdCBkaXJlY3Rpb24gPSBvcmRlckJ5LnNsaWNlKHNlcGFyYXRvciArIDEpID09PSBcImFzY1wiID8gXCJhc2NcIiA6IFwiZGVzY1wiO1xuICBjb25zdCBjb2x1bW4gPSBPUkRFUkFCTEVfQ09MVU1OU1trZXldO1xuXG4gIGlmICghY29sdW1uKSB7XG4gICAgcWIub3JkZXJCeShcInJlcXVlc3RfbG9ncy5pZFwiLCBcImRlc2NcIik7XG4gICAgcmV0dXJuO1xuICB9XG4gIHFiLm9yZGVyQnkoY29sdW1uLCBkaXJlY3Rpb24pO1xuICAvLyDrj5nsoJAg7ZaJ7J2YIOyInOyEnOqwgCDtjpjsnbTsp4Drp4jri6Qg7Z2U65Ok66as7KeAIOyViuqyjCDqs6DsnKAg7Lus65+87Jy866GcIHRpZS1icmVhayDtlZzri6QuXG4gIGlmIChrZXkgIT09IFwiaWRcIikgcWIub3JkZXJCeShcInJlcXVlc3RfbG9ncy5pZFwiLCBcImRlc2NcIik7XG59XG5cbi8qXG4gIFJlcXVlc3RMb2cgTW9kZWxcbiovXG5jbGFzcyBSZXF1ZXN0TG9nTW9kZWxDbGFzcyBleHRlbmRzIEJhc2VNb2RlbENsYXNzPFxuICBSZXF1ZXN0TG9nU3Vic2V0S2V5LFxuICBSZXF1ZXN0TG9nU3Vic2V0TWFwcGluZyxcbiAgdHlwZW9mIHJlcXVlc3RMb2dTdWJzZXRRdWVyaWVzLFxuICB0eXBlb2YgcmVxdWVzdExvZ0xvYWRlclF1ZXJpZXNcbj4ge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcihcIlJlcXVlc3RMb2dcIiwgcmVxdWVzdExvZ1N1YnNldFF1ZXJpZXMsIHJlcXVlc3RMb2dMb2FkZXJRdWVyaWVzKTtcbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiUmVxdWVzdExvZ1wiIH0pXG4gIGFzeW5jIGZpbmRCeUlkPFQgZXh0ZW5kcyBSZXF1ZXN0TG9nU3Vic2V0S2V5PihcbiAgICBzdWJzZXQ6IFQsXG4gICAgaWQ6IG51bWJlcixcbiAgKTogUHJvbWlzZTxSZXF1ZXN0TG9nU3Vic2V0TWFwcGluZ1tUXT4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHtcbiAgICAgIGlkLFxuICAgICAgbnVtOiAxLFxuICAgICAgcGFnZTogMSxcbiAgICB9KTtcbiAgICBpZiAoIXJvd3NbMF0pIHtcbiAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihTRChcImVycm9yLmVudGl0eU5vdEZvdW5kXCIpKFwiUmVxdWVzdExvZ1wiLCBpZCkpO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzWzBdO1xuICB9XG5cbiAgYXN5bmMgZmluZE9uZTxUIGV4dGVuZHMgUmVxdWVzdExvZ1N1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIGxpc3RQYXJhbXM6IFJlcXVlc3RMb2dMaXN0UGFyYW1zLFxuICApOiBQcm9taXNlPFJlcXVlc3RMb2dTdWJzZXRNYXBwaW5nW1RdIHwgbnVsbD4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgdGhpcy5maW5kTWFueShzdWJzZXQsIHtcbiAgICAgIC4uLmxpc3RQYXJhbXMsXG4gICAgICBudW06IDEsXG4gICAgICBwYWdlOiAxLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJvd3NbMF0gPz8gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiDrqqnroZ0g7ZWE7YSw7J2YIOuLqOydvCDsoJXsnZguIGZpbmRNYW55IOyZgCB0b3RhbENvc3Qg6rCAIOqwmeydgCDsobDqsbTsnYQg67O064+E66GdIOqzteycoO2VnOuLpCDigJRcbiAgICog7ZmU66m07JeQ7IScIO2VhO2EsOulvCDqsbjrqbQg7ZaJIOyImOyZgCDruYTsmqnsnbQg7ZWo6ruYIOyige2YgOyguOyVvCDtlZjripTrjbAsIOuRkCDsv7zrpqzqsIAg6rCB7J6QIO2VhO2EsOulvFxuICAgKiDqtaztmITtlZjrqbQg7ZWc7Kq97JeQIOy2leydhCDstpTqsIDtlaAg65WMIOyhsOyaqe2eiCDslrTquIvrgpzri6QuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5TGlzdEZpbHRlcnMoXG4gICAgcWI6IFJldHVyblR5cGU8UmVxdWVzdExvZ01vZGVsQ2xhc3NbXCJnZXRTdWJzZXRRdWVyaWVzXCJdPltcInFiXCJdLFxuICAgIHBhcmFtczogUmVxdWVzdExvZ0xpc3RQYXJhbXMsXG4gICk6IHZvaWQge1xuICAgIGlmIChwYXJhbXMuaWQpIHtcbiAgICAgIHFiLndoZXJlSW4oXCJyZXF1ZXN0X2xvZ3MuaWRcIiwgYXNBcnJheShwYXJhbXMuaWQpKTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLnRva2VuX25hbWUpIHtcbiAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLnRva2VuX25hbWVcIiwgcGFyYW1zLnRva2VuX25hbWUpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMucHJvamVjdF9uYW1lX2lzX251bGwpIHtcbiAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLnByb2plY3RfbmFtZVwiLCBudWxsKTtcbiAgICB9IGVsc2UgaWYgKHBhcmFtcy5wcm9qZWN0X25hbWVfaXNfbm90X251bGwpIHtcbiAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLnByb2plY3RfbmFtZVwiLCBcIiE9XCIsIG51bGwpO1xuICAgIH0gZWxzZSBpZiAocGFyYW1zLnByb2plY3RfbmFtZSkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MucHJvamVjdF9uYW1lXCIsIHBhcmFtcy5wcm9qZWN0X25hbWUpO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMubW9kZWxfbmFtZSkge1xuICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MubW9kZWxfbmFtZVwiLCBwYXJhbXMubW9kZWxfbmFtZSk7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5zZWFyY2ggJiYgcGFyYW1zLmtleXdvcmQgJiYgcGFyYW1zLmtleXdvcmQubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKHBhcmFtcy5zZWFyY2ggPT09IFwiaWRcIikge1xuICAgICAgICBxYi53aGVyZShcInJlcXVlc3RfbG9ncy5pZFwiLCBOdW1iZXIocGFyYW1zLmtleXdvcmQpKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJ0b2tlbl9uYW1lXCIpIHtcbiAgICAgICAgcWIud2hlcmUoXCJyZXF1ZXN0X2xvZ3MudG9rZW5fbmFtZVwiLCBcImxpa2VcIiwgYCUke3BhcmFtcy5rZXl3b3JkfSVgKTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zLnNlYXJjaCA9PT0gXCJ1c2VyX3Byb21wdFwiKSB7XG4gICAgICAgIHFiLndoZXJlKFwicmVxdWVzdF9sb2dzLnVzZXJfcHJvbXB0XCIsIFwibGlrZVwiLCBgJSR7cGFyYW1zLmtleXdvcmR9JWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oU0QoXCJlcnJvci51bmtub3duU2VhcmNoRmllbGRcIikocGFyYW1zLnNlYXJjaCkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIEBhcGkoeyBodHRwTWV0aG9kOiBcIkdFVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLXF1ZXJ5XCJdLCByZXNvdXJjZU5hbWU6IFwiUmVxdWVzdExvZ3NcIiB9KVxuICBhc3luYyBmaW5kTWFueTxUIGV4dGVuZHMgUmVxdWVzdExvZ1N1YnNldEtleSwgTFAgZXh0ZW5kcyBSZXF1ZXN0TG9nTGlzdFBhcmFtcz4oXG4gICAgc3Vic2V0OiBULFxuICAgIHJhd1BhcmFtcz86IExQLFxuICApOiBQcm9taXNlPExpc3RSZXN1bHQ8TFAsIFJlcXVlc3RMb2dTdWJzZXRNYXBwaW5nW1RdPj4ge1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIG51bTogMjQsXG4gICAgICBwYWdlOiAxLFxuICAgICAgc2VhcmNoOiBcImlkXCIgYXMgY29uc3QsXG4gICAgICBvcmRlckJ5OiBcImlkLWRlc2NcIiBhcyBjb25zdCxcbiAgICAgIC4uLnJhd1BhcmFtcyxcbiAgICB9IHNhdGlzZmllcyBSZXF1ZXN0TG9nTGlzdFBhcmFtcztcblxuICAgIGNvbnN0IHsgcWIsIG9uU3Vic2V0OiBfIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoc3Vic2V0KTtcblxuICAgIHRoaXMuYXBwbHlMaXN0RmlsdGVycyhxYiwgcGFyYW1zKTtcblxuICAgIGlmIChwYXJhbXMub3JkZXJCeSkgYXBwbHlPcmRlckJ5KHFiLCBwYXJhbXMub3JkZXJCeSk7XG5cbiAgICBjb25zdCBlbmhhbmNlcnMgPSB0aGlzLmNyZWF0ZUVuaGFuY2Vycyh7XG4gICAgICBBOiAocm93KSA9PiBub3JtYWxpemVMZWdhY3lBbnRocm9waWNSb3cocm93KSxcbiAgICAgIEM6IChyb3cpID0+IG5vcm1hbGl6ZUxlZ2FjeUFudGhyb3BpY1Jvdyhyb3cpLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVN1YnNldFF1ZXJ5KHtcbiAgICAgIHN1YnNldCxcbiAgICAgIHFiLFxuICAgICAgcGFyYW1zLFxuICAgICAgZW5oYW5jZXJzLFxuICAgICAgZGVidWc6IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgQGFwaSh7IGh0dHBNZXRob2Q6IFwiUE9TVFwiLCBjbGllbnRzOiBbXCJheGlvc1wiLCBcInRhbnN0YWNrLW11dGF0aW9uXCJdIH0pXG4gIGFzeW5jIHNhdmUoc3BhOiBSZXF1ZXN0TG9nU2F2ZVBhcmFtc1tdKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG5cbiAgICAvLyByZWdpc3RlclxuICAgIHNwYS5mb3JFYWNoKChzcCkgPT4ge1xuICAgICAgd2RiLnViUmVnaXN0ZXIoXCJyZXF1ZXN0X2xvZ3NcIiwgc3ApO1xuICAgIH0pO1xuXG4gICAgLy8gdHJhbnNhY3Rpb25cbiAgICByZXR1cm4gd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGNvbnN0IGlkcyA9IGF3YWl0IHRyeC51YlVwc2VydChcInJlcXVlc3RfbG9nc1wiKTtcblxuICAgICAgcmV0dXJuIGlkcztcbiAgICB9KTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBSdW4gTGlmZWN5Y2xlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGNyZWF0ZVJ1bihwYXJhbXM6IHtcbiAgICB1c2VyX3Byb21wdDogc3RyaW5nO1xuICAgIHN5c3RlbV9wcm9tcHQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICBlZmZvcnQ/OiBzdHJpbmcgfCBudWxsO1xuICAgIHByb2plY3RfbmFtZT86IHN0cmluZyB8IG51bGw7XG4gICAgaGlzdG9yeT86IHVua25vd247XG4gICAgdG9vbHM/OiBUb29sRGVmaW5pdGlvbnM7XG4gICAgaXNfaW1hZ2VfZ2VuZXJhdGlvbj86IGJvb2xlYW47XG4gIH0pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgd2RiLnViUmVnaXN0ZXIoXCJyZXF1ZXN0X2xvZ3NcIiwge1xuICAgICAgdXNlcl9wcm9tcHQ6IHBhcmFtcy51c2VyX3Byb21wdCxcbiAgICAgIHN5c3RlbV9wcm9tcHQ6IHBhcmFtcy5zeXN0ZW1fcHJvbXB0ID8/IG51bGwsXG4gICAgICAvLyBwcm92aWRlciDsi6Ttlokg7KCE7J2066+A66GcIHNlcnZpbmcgbW9kZWzsnYAg7JWE7KeBIOyVjCDsiJgg7JeG64ukLlxuICAgICAgcmVxdWVzdGVkX21vZGVsX25hbWU6IHBhcmFtcy5yZXF1ZXN0ZWRfbW9kZWxfbmFtZSA/PyBudWxsLFxuICAgICAgbW9kZWxfbmFtZTogbnVsbCxcbiAgICAgIGVmZm9ydDogcGFyYW1zLmVmZm9ydCA/PyBudWxsLFxuICAgICAgcHJvamVjdF9uYW1lOiBwYXJhbXMucHJvamVjdF9uYW1lID8/IG51bGwsXG4gICAgICBzdGF0dXM6IFwicnVubmluZ1wiLFxuICAgICAgcmVzcG9uc2U6IFwiXCIsXG4gICAgICBpbnB1dF90b2tlbnM6IDAsXG4gICAgICBvdXRwdXRfdG9rZW5zOiAwLFxuICAgICAgY2FjaGVfcmVhZF90b2tlbnM6IDAsXG4gICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IDAsXG4gICAgICBkdXJhdGlvbl9tczogMCxcbiAgICAgIHRvb2xfY2FsbF9jb3VudDogMCxcbiAgICAgIC8vIOydtOuvuOyngCB0dXJuIOyLneuzhChSMTMpLiBydW4g6rK966GcKHRvb2xzK2ltYWdlIOyhsO2VqSnrj4QgYXV0byDqsr3roZzsmYAg64+Z7J287ZWY6rKMIOuniO2CuS5cbiAgICAgIGlzX2ltYWdlX2dlbmVyYXRpb246IHBhcmFtcy5pc19pbWFnZV9nZW5lcmF0aW9uID8/IGZhbHNlLFxuICAgICAgLi4uKHBhcmFtcy5oaXN0b3J5ICE9PSB1bmRlZmluZWQgPyB7IGhpc3Rvcnk6IHBhcmFtcy5oaXN0b3J5IGFzIHsgdHlwZTogc3RyaW5nIH1bXSB9IDoge30pLFxuICAgICAgLi4uKHBhcmFtcy50b29scyAhPT0gdW5kZWZpbmVkID8geyB0b29sczogcGFyYW1zLnRvb2xzIH0gOiB7fSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBjb25zdCBpZHMgPSBhd2FpdCB0cngudWJVcHNlcnQoXCJyZXF1ZXN0X2xvZ3NcIik7XG4gICAgICByZXR1cm4gaWRzWzBdITtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGFwcGVuZFN0ZXAocmVxdWVzdExvZ0lkOiBudW1iZXIsIHN0ZXA6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHdkYi51YlJlZ2lzdGVyKFwicmVxdWVzdF9sb2dfc3RlcHNcIiwgeyByZXF1ZXN0X2xvZ19pZDogcmVxdWVzdExvZ0lkLCAuLi5zdGVwIH0pO1xuICAgIHJldHVybiB3ZGIudHJhbnNhY3Rpb24oYXN5bmMgKHRyeCkgPT4ge1xuICAgICAgY29uc3QgaWRzID0gYXdhaXQgdHJ4LnViVXBzZXJ0KFwicmVxdWVzdF9sb2dfc3RlcHNcIik7XG4gICAgICBpZiAoc3RlcC50eXBlID09PSBcInRvb2xfY2FsbFwiKSB7XG4gICAgICAgIGF3YWl0IHRyeC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpLndoZXJlKFwiaWRcIiwgcmVxdWVzdExvZ0lkKS5pbmNyZW1lbnQoXCJ0b29sX2NhbGxfY291bnRcIiwgMSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gaWRzWzBdITtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZpbmlzaFJ1bihcbiAgICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgICBwYXJhbXM6IHtcbiAgICAgIHN0YXR1czogc3RyaW5nO1xuICAgICAgcmVzcG9uc2U/OiBzdHJpbmc7XG4gICAgICB0b2tlbl9uYW1lPzogc3RyaW5nO1xuICAgICAgaW5wdXRfdG9rZW5zPzogbnVtYmVyO1xuICAgICAgb3V0cHV0X3Rva2Vucz86IG51bWJlcjtcbiAgICAgIGNhY2hlX3JlYWRfdG9rZW5zPzogbnVtYmVyO1xuICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zPzogbnVtYmVyO1xuICAgICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zPzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIGNhY2hlX2NyZWF0aW9uXzFoX3Rva2Vucz86IG51bWJlciB8IG51bGw7XG4gICAgICBkdXJhdGlvbl9tcz86IG51bWJlcjtcbiAgICAgIHJlcXVlc3RlZF9tb2RlbF9uYW1lPzogc3RyaW5nIHwgbnVsbDtcbiAgICAgIG1vZGVsX25hbWU/OiBzdHJpbmcgfCBudWxsO1xuICAgICAgZmFsbGJhY2tfY291bnQ/OiBudW1iZXIgfCBudWxsO1xuICAgICAgY29zdF91c2Q/OiBudW1iZXIgfCBudWxsO1xuICAgICAgY29zdF9zb3VyY2U/OiBzdHJpbmcgfCBudWxsO1xuICAgICAgaGlzdG9yeT86IHVua25vd247XG4gICAgICBlcnJvcl9tZXNzYWdlPzogc3RyaW5nO1xuICAgICAgdG9vbF9jYWxsX2NvdW50PzogbnVtYmVyO1xuICAgICAgaW1hZ2VfY29zdF91c2Q/OiBudW1iZXIgfCBudWxsO1xuICAgICAgaW1hZ2VfY29zdF9tZXRob2Q/OiBzdHJpbmcgfCBudWxsO1xuICAgIH0sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChwYXJhbXMuc3RhdHVzID09PSBcInN1Y2NlZWRlZFwiICYmICFwYXJhbXMudG9rZW5fbmFtZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwidG9rZW5OYW1lIGlzIHJlcXVpcmVkIGZvciBzdWNjZWVkZWQgcnVuc1wiKTtcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHsgaWQ6IHJlcXVlc3RMb2dJZCwgc3RhdHVzOiBwYXJhbXMuc3RhdHVzIH07XG4gICAgY29uc3QgZmllbGRzID0gW1xuICAgICAgXCJyZXNwb25zZVwiLFxuICAgICAgXCJ0b2tlbl9uYW1lXCIsXG4gICAgICBcImlucHV0X3Rva2Vuc1wiLFxuICAgICAgXCJvdXRwdXRfdG9rZW5zXCIsXG4gICAgICBcImNhY2hlX3JlYWRfdG9rZW5zXCIsXG4gICAgICBcImNhY2hlX2NyZWF0aW9uX3Rva2Vuc1wiLFxuICAgICAgXCJjYWNoZV9jcmVhdGlvbl81bV90b2tlbnNcIixcbiAgICAgIFwiY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCIsXG4gICAgICBcImR1cmF0aW9uX21zXCIsXG4gICAgICBcInJlcXVlc3RlZF9tb2RlbF9uYW1lXCIsXG4gICAgICBcIm1vZGVsX25hbWVcIixcbiAgICAgIFwiZmFsbGJhY2tfY291bnRcIixcbiAgICAgIFwiY29zdF91c2RcIixcbiAgICAgIFwiY29zdF9zb3VyY2VcIixcbiAgICAgIFwiZXJyb3JfbWVzc2FnZVwiLFxuICAgICAgXCJ0b29sX2NhbGxfY291bnRcIixcbiAgICAgIFwiaW1hZ2VfY29zdF91c2RcIixcbiAgICAgIFwiaW1hZ2VfY29zdF9tZXRob2RcIixcbiAgICBdIGFzIGNvbnN0O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIGZpZWxkcykge1xuICAgICAgaWYgKHBhcmFtc1trZXldICE9PSB1bmRlZmluZWQpIHVwZGF0ZVtrZXldID0gcGFyYW1zW2tleV07XG4gICAgfVxuICAgIGlmIChwYXJhbXMuaGlzdG9yeSAhPT0gdW5kZWZpbmVkKSB1cGRhdGUuaGlzdG9yeSA9IHBhcmFtcy5oaXN0b3J5O1xuICAgIHVwZGF0ZS50dGZ0X21zID0gKGF3YWl0IHRoaXMuZmlyc3RHZW5lcmF0ZVN0ZXBUdGZ0KHJlcXVlc3RMb2dJZCkpID8/IDA7XG5cbiAgICAvLyDshJzrsoQgcnVuIOqyveuhnOuKlCBzdGVwIOyXkOyEnCDtmZXsoJXtlZwgZXhhY3QgY29zdCDrpbwg64SY6ri064ukLiDsmbjrtoAvbGVnYWN5IGNhbGxlciDqsIAg67mE7Jqp7J2EXG4gICAgLy8g7IOd65617ZWcIOqyveyasOyXkOunjCDsoIDsnqXrkJwg66qo6424K3VzYWdlIOuhnCDqs4TsgrDtlZzri6QuXG4gICAgaWYgKFxuICAgICAgcGFyYW1zLmNvc3RfdXNkID09PSB1bmRlZmluZWQgJiZcbiAgICAgIHBhcmFtcy5pbnB1dF90b2tlbnMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgcGFyYW1zLm91dHB1dF90b2tlbnMgIT09IHVuZGVmaW5lZFxuICAgICkge1xuICAgICAgY29uc3Qgcm93ID0gYXdhaXQgdGhpcy5nZXRQdXJpKFwiclwiKVxuICAgICAgICAuZnJvbShcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgICAuc2VsZWN0KHsgbW9kZWxfbmFtZTogXCJtb2RlbF9uYW1lXCIgfSlcbiAgICAgICAgLndoZXJlKFwiaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgICAuZmlyc3QoKTtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZU1vZGVsTmFtZSA9IHBhcmFtcy5tb2RlbF9uYW1lID8/IHJvdz8ubW9kZWxfbmFtZTtcbiAgICAgIGlmIChlZmZlY3RpdmVNb2RlbE5hbWUpIHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBjYW5vbmljYWxNb2RlbE5hbWUoZWZmZWN0aXZlTW9kZWxOYW1lKTtcbiAgICAgICAgY29uc3QgdXNhZ2UgPSBub3JtYWxpemVkVXNhZ2VGb3JDb3N0KHtcbiAgICAgICAgICB0b2tlbl9uYW1lOiBwYXJhbXMudG9rZW5fbmFtZSxcbiAgICAgICAgICBtb2RlbF9uYW1lOiBlZmZlY3RpdmVNb2RlbE5hbWUsXG4gICAgICAgICAgaW5wdXRfdG9rZW5zOiBwYXJhbXMuaW5wdXRfdG9rZW5zLFxuICAgICAgICAgIG91dHB1dF90b2tlbnM6IHBhcmFtcy5vdXRwdXRfdG9rZW5zLFxuICAgICAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBwYXJhbXMuY2FjaGVfcmVhZF90b2tlbnMgPz8gMCxcbiAgICAgICAgICBjYWNoZV9jcmVhdGlvbl90b2tlbnM6IHBhcmFtcy5jYWNoZV9jcmVhdGlvbl90b2tlbnMgPz8gMCxcbiAgICAgICAgICBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IHBhcmFtcy5jYWNoZV9jcmVhdGlvbl81bV90b2tlbnMsXG4gICAgICAgICAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiBwYXJhbXMuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zLFxuICAgICAgICB9KTtcbiAgICAgICAgdXBkYXRlLmNvc3RfdXNkID0gTWF0aC5yb3VuZChcbiAgICAgICAgICBjYWxjdWxhdGVDb3N0VXNkKG1vZGVsLCB7XG4gICAgICAgICAgICBpbnB1dFRva2VuczogdXNhZ2UuaW5wdXRUb2tlbnMsXG4gICAgICAgICAgICBvdXRwdXRUb2tlbnM6IHVzYWdlLm91dHB1dFRva2VucyxcbiAgICAgICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiB1c2FnZS5jYWNoZWRJbnB1dFRva2VucyxcbiAgICAgICAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW06IHVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtLFxuICAgICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg6IHVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoLFxuICAgICAgICAgIH0pICogMV8wMDBfMDAwLFxuICAgICAgICApO1xuICAgICAgICB1cGRhdGUuY29zdF9zb3VyY2UgPSBcInByaWNpbmdfdGFibGVcIjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB3ZGIgPSB0aGlzLmdldFB1cmkoXCJ3XCIpO1xuICAgIHdkYi51YlJlZ2lzdGVyKFwicmVxdWVzdF9sb2dzXCIsIHVwZGF0ZSk7XG4gICAgYXdhaXQgd2RiLnRyYW5zYWN0aW9uKGFzeW5jICh0cngpID0+IHtcbiAgICAgIGF3YWl0IHRyeC51YlVwc2VydChcInJlcXVlc3RfbG9nc1wiKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZpcnN0R2VuZXJhdGVTdGVwVHRmdChyZXF1ZXN0TG9nSWQ6IG51bWJlcik6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuICAgIGNvbnN0IHJvdyA9IGF3YWl0IHRoaXMuZ2V0UHVyaShcInJcIilcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgIC5zZWxlY3QoeyB0dGZ0X21zOiBcInR0ZnRfbXNcIiB9KVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgLndoZXJlKFwidHlwZVwiLCBcImdlbmVyYXRlXCIpXG4gICAgICAud2hlcmUoXCJ0dGZ0X21zXCIsIFwiIT1cIiwgbnVsbClcbiAgICAgIC5vcmRlckJ5KFwic3RlcF9pbmRleFwiLCBcImFzY1wiKVxuICAgICAgLm9yZGVyQnkoXCJpZFwiLCBcImFzY1wiKVxuICAgICAgLmZpcnN0KCk7XG4gICAgcmV0dXJuIHJvdz8udHRmdF9tcyA9PT0gbnVsbCB8fCByb3c/LnR0ZnRfbXMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBOdW1iZXIocm93LnR0ZnRfbXMpO1xuICB9XG5cbiAgYXN5bmMgYWdncmVnYXRlU3RlcFVzYWdlKHJlcXVlc3RMb2dJZDogbnVtYmVyKTogUHJvbWlzZTxSZXF1ZXN0TG9nU3RlcEFnZ3JlZ2F0ZT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLmdldFB1cmkoXCJyXCIpXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpXG4gICAgICAuc2VsZWN0KFNURVBfQUdHUkVHQVRFX1NFTEVDVClcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX2lkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC53aGVyZShcInR5cGVcIiwgXCJnZW5lcmF0ZVwiKTtcbiAgICByZXR1cm4gYWdncmVnYXRlR2VuZXJhdGVTdGVwUm93cyhyb3dzIGFzIEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pik7XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgc3RhbGUgY2FuZGlkYXRlcywgdGhlbiBleHBpcmVzIGVhY2ggcnVuIGluIGl0cyBvd24gc2hvcnQgdHJhbnNhY3Rpb24uXG4gICAqIFRoZSBjYW5kaWRhdGUgcXVlcnkgaXMgb25seSBhIGhpbnQ7IHRoZSB0cmFuc2FjdGlvbmFsIG9wZXJhdGlvbiByZWNoZWNrcyBpdFxuICAgKiBhZnRlciBhY3F1aXJpbmcgdGhlIGFkdmlzb3J5IGxvY2sgc2hhcmVkIHdpdGggdG9vbCBmb2xsb3ctdXBzLlxuICAgKi9cbiAgYXN5bmMgZXhwaXJlU3RhbGVUb29sV2FpdGluZ1J1bnMoXG4gICAgdGhyZXNob2xkTXM6IG51bWJlcixcbiAgICBlcnJvck1lc3NhZ2U6IHN0cmluZyxcbiAgICBsaW1pdDogbnVtYmVyID0gMTAsXG4gICk6IFByb21pc2U8bnVtYmVyW10+IHtcbiAgICBjb25zdCB0aHJlc2hvbGQgPSBuZXcgRGF0ZShEYXRlLm5vdygpIC0gdGhyZXNob2xkTXMpO1xuICAgIGNvbnN0IGNhbmRpZGF0ZUlkcyA9IGF3YWl0IHRoaXMuZmluZFN0YWxlVG9vbFdhaXRpbmdSdW5DYW5kaWRhdGVzKHRocmVzaG9sZCwgbGltaXQpO1xuICAgIGNvbnN0IGV4cGlyZWRJZHM6IG51bWJlcltdID0gW107XG4gICAgZm9yIChjb25zdCByZXF1ZXN0TG9nSWQgb2YgY2FuZGlkYXRlSWRzKSB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy50cnlFeHBpcmVTdGFsZVRvb2xXYWl0aW5nUnVuKHJlcXVlc3RMb2dJZCwgdGhyZXNob2xkLCBlcnJvck1lc3NhZ2UpKSB7XG4gICAgICAgIGV4cGlyZWRJZHMucHVzaChyZXF1ZXN0TG9nSWQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZXhwaXJlZElkcztcbiAgfVxuXG4gIGFzeW5jIGZpbmRTdGFsZVRvb2xXYWl0aW5nUnVuQ2FuZGlkYXRlcyh0aHJlc2hvbGQ6IERhdGUsIGxpbWl0OiBudW1iZXIpOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMuZ2V0UHVyaShcIndcIilcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dzXCIpXG4gICAgICAuam9pbihcInJlcXVlc3RfbG9nX3N0ZXBzXCIsIFwicmVxdWVzdF9sb2dzLmlkXCIsIFwicmVxdWVzdF9sb2dfc3RlcHMucmVxdWVzdF9sb2dfaWRcIilcbiAgICAgIC5kaXN0aW5jdChcInJlcXVlc3RfbG9ncy5pZFwiKVxuICAgICAgLnNlbGVjdCh7IGlkOiBcInJlcXVlc3RfbG9ncy5pZFwiIH0pXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ3Muc3RhdHVzXCIsIFwicnVubmluZ1wiKVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfc3RlcHMudHlwZVwiLCBcInRvb2xfY2FsbFwiKVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfc3RlcHMuY3JlYXRlZF9hdFwiLCBcIjxcIiwgdGhyZXNob2xkKVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfc3RlcHMudG9vbF9yZXN1bHRcIiwgbnVsbClcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX3N0ZXBzLmVycm9yXCIsIG51bGwpXG4gICAgICAubGltaXQobGltaXQpO1xuICAgIHJldHVybiByb3dzLm1hcCgoeyBpZCB9KSA9PiBpZCk7XG4gIH1cblxuICBAdHJhbnNhY3Rpb25hbCh7IGRiUHJlc2V0OiBcIndcIiB9KVxuICBhc3luYyB0cnlFeHBpcmVTdGFsZVRvb2xXYWl0aW5nUnVuKFxuICAgIHJlcXVlc3RMb2dJZDogbnVtYmVyLFxuICAgIHRocmVzaG9sZDogRGF0ZSxcbiAgICBlcnJvck1lc3NhZ2U6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3Qgd2RiID0gdGhpcy5nZXRQdXJpKFwid1wiKTtcbiAgICBjb25zdCBsb2NrUmVzdWx0ID0gKGF3YWl0IHdkYi5rbmV4LnJhdyhcIlNFTEVDVCBwZ190cnlfYWR2aXNvcnlfeGFjdF9sb2NrKD8sID8pIEFTIGFjcXVpcmVkXCIsIFtcbiAgICAgIFJFUVVFU1RfTE9HX1JVTl9MT0NLX0NMQVNTX0lELFxuICAgICAgcmVxdWVzdExvZ0lkLFxuICAgIF0pKSBhcyB7IHJvd3M/OiBBcnJheTx7IGFjcXVpcmVkPzogYm9vbGVhbiB9PiB9O1xuICAgIGlmIChsb2NrUmVzdWx0LnJvd3M/LlswXT8uYWNxdWlyZWQgIT09IHRydWUpIHJldHVybiBmYWxzZTtcblxuICAgIC8vIFRoZSBmb2xsb3ctdXAgcGF0aCB1c2VzIHRoZSBzYW1lIHdyaXRlciB0cmFuc2FjdGlvbiBsb2NrLiBSZWNoZWNrIGFmdGVyXG4gICAgLy8gbG9ja2luZyBzbyBhIHJlc3VsdCBjb21taXR0ZWQgZHVyaW5nIGNhbmRpZGF0ZSBkaXNjb3ZlcnkgbWFrZXMgdGhpcyBhIG5vLW9wLlxuICAgIGNvbnN0IHVucmVzb2x2ZWQgPSBhd2FpdCB3ZGJcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgIC5zZWxlY3QoeyBpZDogXCJpZFwiIH0pXG4gICAgICAud2hlcmUoXCJyZXF1ZXN0X2xvZ19pZFwiLCByZXF1ZXN0TG9nSWQpXG4gICAgICAud2hlcmUoXCJ0eXBlXCIsIFwidG9vbF9jYWxsXCIpXG4gICAgICAud2hlcmUoXCJjcmVhdGVkX2F0XCIsIFwiPFwiLCB0aHJlc2hvbGQpXG4gICAgICAud2hlcmUoXCJ0b29sX3Jlc3VsdFwiLCBudWxsKVxuICAgICAgLndoZXJlKFwiZXJyb3JcIiwgbnVsbClcbiAgICAgIC5maXJzdCgpO1xuICAgIGlmICghdW5yZXNvbHZlZCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgY29uc3Qgc3RlcFJvd3MgPSBhd2FpdCB3ZGJcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgIC5zZWxlY3QoU1RFUF9BR0dSRUdBVEVfU0VMRUNUKVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgLndoZXJlKFwidHlwZVwiLCBcImdlbmVyYXRlXCIpO1xuICAgIGNvbnN0IGFnZ3JlZ2F0ZSA9IGFnZ3JlZ2F0ZUdlbmVyYXRlU3RlcFJvd3Moc3RlcFJvd3MgYXMgQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KTtcbiAgICBjb25zdCBmaXJzdFR0ZnQgPSBhd2FpdCB3ZGJcbiAgICAgIC5mcm9tKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgIC5zZWxlY3QoeyB0dGZ0X21zOiBcInR0ZnRfbXNcIiB9KVxuICAgICAgLndoZXJlKFwicmVxdWVzdF9sb2dfaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgLndoZXJlKFwidHlwZVwiLCBcImdlbmVyYXRlXCIpXG4gICAgICAud2hlcmUoXCJ0dGZ0X21zXCIsIFwiIT1cIiwgbnVsbClcbiAgICAgIC5vcmRlckJ5KFwic3RlcF9pbmRleFwiLCBcImFzY1wiKVxuICAgICAgLm9yZGVyQnkoXCJpZFwiLCBcImFzY1wiKVxuICAgICAgLmZpcnN0KCk7XG5cbiAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgd2RiXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgLndoZXJlKFwiaWRcIiwgcmVxdWVzdExvZ0lkKVxuICAgICAgLndoZXJlKFwic3RhdHVzXCIsIFwicnVubmluZ1wiKVxuICAgICAgLnVwZGF0ZSh7XG4gICAgICAgIHN0YXR1czogXCJlcnJvclwiLFxuICAgICAgICBlcnJvcl9tZXNzYWdlOiBlcnJvck1lc3NhZ2UsXG4gICAgICAgIGlucHV0X3Rva2VuczogYWdncmVnYXRlLmlucHV0X3Rva2VucyxcbiAgICAgICAgb3V0cHV0X3Rva2VuczogYWdncmVnYXRlLm91dHB1dF90b2tlbnMsXG4gICAgICAgIGNhY2hlX3JlYWRfdG9rZW5zOiBhZ2dyZWdhdGUuY2FjaGVfcmVhZF90b2tlbnMsXG4gICAgICAgIGNhY2hlX2NyZWF0aW9uX3Rva2VuczogYWdncmVnYXRlLmNhY2hlX2NyZWF0aW9uX3Rva2VucyxcbiAgICAgICAgLi4uKGFnZ3JlZ2F0ZS5jYWNoZV9jcmVhdGlvbl81bV90b2tlbnMgIT09IHVuZGVmaW5lZFxuICAgICAgICAgID8geyBjYWNoZV9jcmVhdGlvbl81bV90b2tlbnM6IGFnZ3JlZ2F0ZS5jYWNoZV9jcmVhdGlvbl81bV90b2tlbnMgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICAuLi4oYWdncmVnYXRlLmNhY2hlX2NyZWF0aW9uXzFoX3Rva2VucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB7IGNhY2hlX2NyZWF0aW9uXzFoX3Rva2VuczogYWdncmVnYXRlLmNhY2hlX2NyZWF0aW9uXzFoX3Rva2VucyB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIGR1cmF0aW9uX21zOiBhZ2dyZWdhdGUuZHVyYXRpb25fbXMsXG4gICAgICAgIGZhbGxiYWNrX2NvdW50OiBhZ2dyZWdhdGUuZmFsbGJhY2tfY291bnQsXG4gICAgICAgIGNvc3RfdXNkOiBhZ2dyZWdhdGUuY29zdF91c2QsXG4gICAgICAgIC4uLihhZ2dyZWdhdGUuY29zdF9zb3VyY2UgIT09IHVuZGVmaW5lZCA/IHsgY29zdF9zb3VyY2U6IGFnZ3JlZ2F0ZS5jb3N0X3NvdXJjZSB9IDoge30pLFxuICAgICAgICB0dGZ0X21zOlxuICAgICAgICAgIGZpcnN0VHRmdD8udHRmdF9tcyA9PT0gbnVsbCB8fCBmaXJzdFR0ZnQ/LnR0ZnRfbXMgPT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyAwXG4gICAgICAgICAgICA6IE51bWJlcihmaXJzdFR0ZnQudHRmdF9tcyksXG4gICAgICB9KTtcbiAgICByZXR1cm4gdXBkYXRlZCA+IDA7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBhIG5hdGl2ZSBxZ3JpZCB0b29sIGZvbGxvdy11cCBhbmQgY29tcHV0ZXMgaXRzIG5leHQgc3RlcCBpbmRleCB3aGlsZVxuICAgKiBob2xkaW5nIHRoZSBwZXItcnVuIGFkdmlzb3J5IGxvY2sgc2hhcmVkIHdpdGggc3RhbGUgY2xlYW51cC5cbiAgICovXG4gIEB0cmFuc2FjdGlvbmFsKHsgZGJQcmVzZXQ6IFwid1wiIH0pXG4gIGFzeW5jIGNvbnRpbnVlVG9vbFJ1bihcbiAgICByZXF1ZXN0TG9nSWQ6IG51bWJlcixcbiAgICB0b29sUmVzdWx0czogVG9vbFJlc3VsdENvbnRpbnVhdGlvbltdLFxuICApOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG4gICAgYXdhaXQgd2RiLmtuZXgucmF3KFwiU0VMRUNUIHBnX2Fkdmlzb3J5X3hhY3RfbG9jayg/LCA/KVwiLCBbXG4gICAgICBSRVFVRVNUX0xPR19SVU5fTE9DS19DTEFTU19JRCxcbiAgICAgIHJlcXVlc3RMb2dJZCxcbiAgICBdKTtcblxuICAgIGNvbnN0IHJ1biA9IGF3YWl0IHdkYlxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ3NcIilcbiAgICAgIC5zZWxlY3QoeyBzdGF0dXM6IFwic3RhdHVzXCIgfSlcbiAgICAgIC53aGVyZShcImlkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC5maXJzdCgpO1xuICAgIGlmICghcnVuKSB0aHJvdyBuZXcgRXJyb3IoYHJlcXVlc3QgbG9nIHJ1biAke3JlcXVlc3RMb2dJZH0gbm90IGZvdW5kYCk7XG4gICAgaWYgKHJ1bi5zdGF0dXMgIT09IFwicnVubmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHJlcXVlc3QgbG9nIHJ1biAke3JlcXVlc3RMb2dJZH0gaXMgYWxyZWFkeSAke3J1bi5zdGF0dXN9YCk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCByZXN1bHQgb2YgdG9vbFJlc3VsdHMpIHtcbiAgICAgIGF3YWl0IHdkYlxuICAgICAgICAuZnJvbShcInJlcXVlc3RfbG9nX3N0ZXBzXCIpXG4gICAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX2lkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgICAgLndoZXJlKFwidG9vbF9jYWxsX2lkXCIsIHJlc3VsdC50b29sQ2FsbElkKVxuICAgICAgICAud2hlcmUoXCJ0eXBlXCIsIFwidG9vbF9jYWxsXCIpXG4gICAgICAgIC51cGRhdGUocmVzdWx0LmlzRXJyb3IgPyB7IGVycm9yOiByZXN1bHQub3V0cHV0IH0gOiB7IHRvb2xfcmVzdWx0OiByZXN1bHQub3V0cHV0IH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHJvdyA9IGF3YWl0IHdkYlxuICAgICAgLmZyb20oXCJyZXF1ZXN0X2xvZ19zdGVwc1wiKVxuICAgICAgLnNlbGVjdCh7IG1heF9zdGVwOiBQdXJpLm1heChcInN0ZXBfaW5kZXhcIikgfSlcbiAgICAgIC53aGVyZShcInJlcXVlc3RfbG9nX2lkXCIsIHJlcXVlc3RMb2dJZClcbiAgICAgIC5maXJzdCgpO1xuICAgIHJldHVybiAocm93Py5tYXhfc3RlcCA/PyAtMSkgKyAxO1xuICB9XG5cbiAgLyoqXG4gICAqIO2ZlOuptCDtkZzsi5zsmqkg7LSdIOu5hOyaqS4g66qp66Gd6rO8IOqwmeydgCDtlYTthLDrpbwg7KCB7Jqp7ZWc64ukLlxuICAgKlxuICAgKiDsoITssrTrpbwg7KGw6rG0IOyXhuydtCBTVU0g7ZWcIOuSpCwgYGNvc3Rfc291cmNlYCDqsIAg7JeG64qUIGxlZ2FjeSByb3cg7J2YIOywqOyVoeunjCDrs7TsoJXtlZzri6QuXG4gICAqIOyhsOqxtCDsl4bripQgU1VNIOydtOyWtOyVvCBgKHByb2plY3RfbmFtZSwgY29zdF91c2QpYCDsu6TrsoTrp4Eg7J24642x7Iqk6rCAIEluZGV4IE9ubHkgU2NhbiDsnYRcbiAgICog7YOE64ukIOKAlCBgY29zdF9zb3VyY2UgSVMgTk9UIE5VTExgIOydhCDqsbjrqbQg6re4IOy7rOufvOydtCDsnbjrjbHsiqTsl5Ag7JeG7Ja0IGhlYXAg7J2EIOuLpOyLnCDrtJDslbxcbiAgICog7ZWY66+A66GcIO2UjOuemOuEiOqwgCDsnbjrjbHsiqTrpbwg67KE66as6rOgIHNlcSBzY2FuIOycvOuhnCDrj4zslYTqsITri6Qo7Iuk7LihIDIzMG1zIOKGkiA4MTRtcykuXG4gICAqXG4gICAqIGxlZ2FjeSDrs7TsoJXsnYQg64Ko6rKo65GUIOydtOycoDog67Cx7ZWE66GcIOq4sOyhtCBsZWdhY3kg64qUIDAg7J20IOuQmOyXiOyngOunjCwg7Jm467aAIOuhnOqxsOqwgFxuICAgKiBgQXBwZW5kU3RlcElucHV0YC9gRmluaXNoUnVuSW5wdXRgIOycvOuhnCBjb3N0U291cmNlIOyXhuydtCDrhKPsnLzrqbQg64uk7IucIOyDneq4uCDsiJgg7J6I64ukLlxuICAgKiDqt7jrn7Agcm93IOuKlCDsoIDsnqXqsJIg64yA7IugIO2YhOyerCDqsIDqsqntkZwg7J6s6rOE7IKw6rCS7J20IOunnuycvOuvgOuhnCDssKjslaHsnYQg642U7ZWc64ukLlxuICAgKlxuICAgKiDtlYTthLAg7KGw6rG07J2EIOyXrOq4sOyEnCDri6Tsi5wg6rWs7ZiE7ZWY7KeAIOyViuqzoCBgYXBwbHlMaXN0RmlsdGVyc2Ag66W8IOqzteycoO2VmOuKlCDqsoPsnbQg7ZW17Ius7J2064ukIOKAlFxuICAgKiDrkZAg7L+866as6rCAIOqwgeyekCDtlYTthLDrpbwg6rCA7KeA66m0IO2ZlOuptOyXkOyEnCDtlYTthLDrpbwg6rG47JeI7J2EIOuVjCDtlokg7IiY7JmAIOu5hOyaqeydtCDsobDsmqntnogg7Ja06riL64Kc64ukLlxuICAgKi9cbiAgYXN5bmMgdG90YWxDb3N0KHJhd1BhcmFtczogUmVxdWVzdExvZ0xpc3RQYXJhbXMgPSB7IG51bTogMCwgcGFnZTogMSB9KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBudW06IDAsXG4gICAgICBwYWdlOiAxLFxuICAgICAgc2VhcmNoOiBcImlkXCIgYXMgY29uc3QsXG4gICAgICAuLi5yYXdQYXJhbXMsXG4gICAgfSBzYXRpc2ZpZXMgUmVxdWVzdExvZ0xpc3RQYXJhbXM7XG5cbiAgICBjb25zdCB7IHFiOiB0b3RhbFFiIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoXCJDXCIpO1xuICAgIHRoaXMuYXBwbHlMaXN0RmlsdGVycyh0b3RhbFFiLCBwYXJhbXMpO1xuICAgIC8vIHN1YnNldCBxYiDripQg7Lus65+8IOuqqeuhneydtCDsnbTrr7ggU0VMRUNUIOyXkCDrsJXtmIAg7J6I7Ja0IOynkeqzhOulvCDslrnsnLzrqbQgR1JPVVAgQlkg7JeQ65+s6rCAIOuCnOuLpC5cbiAgICAvLyBleGVjdXRlQ291bnRRdWVyeSDsmYAg6rCZ7J2AIOuwqeyLneycvOuhnCBzZWxlY3Qg66W8IOu5hOyasOqzoCDsp5Hqs4Trp4wg64Ko6ri064ukLlxuICAgIGNvbnN0IHN0b3JlZCA9IGF3YWl0IHRvdGFsUWJcbiAgICAgIC5jbGVhcihcInNlbGVjdFwiKVxuICAgICAgLy8g7J2M7IiYIOyggOyepeqwkijqs7zqsbAg67KE6re4KeydgCAwIOycvOuhnCDriIzrn6zshJwg642U7ZWc64ukIOKAlCBKUyDsqr0gTWF0aC5tYXgg7JmAIOqwmeydgCDqt5zsuZkuXG4gICAgICAuc2VsZWN0KHtcbiAgICAgICAgdG90YWw6IFB1cmkucmF3TnVtYmVyKFwiQ09BTEVTQ0UoU1VNKEdSRUFURVNUKHJlcXVlc3RfbG9ncy5jb3N0X3VzZCwgMCkpLCAwKVwiKSxcbiAgICAgIH0pXG4gICAgICAuZmlyc3QoKTtcblxuICAgIGNvbnN0IHsgcWI6IGxlZ2FjeVFiIH0gPSB0aGlzLmdldFN1YnNldFF1ZXJpZXMoXCJDXCIpO1xuICAgIHRoaXMuYXBwbHlMaXN0RmlsdGVycyhsZWdhY3lRYiwgcGFyYW1zKTtcbiAgICBjb25zdCBsZWdhY3lSb3dzID0gYXdhaXQgbGVnYWN5UWJcbiAgICAgIC53aGVyZVJhdyhcInJlcXVlc3RfbG9ncy5jb3N0X3NvdXJjZSBJUyBOVUxMIE9SIHJlcXVlc3RfbG9ncy5jb3N0X3VzZCBJUyBOVUxMXCIpXG4gICAgICAuY2xlYXIoXCJzZWxlY3RcIilcbiAgICAgIC5zZWxlY3Qoe1xuICAgICAgICB0b2tlbl9uYW1lOiBcInJlcXVlc3RfbG9ncy50b2tlbl9uYW1lXCIsXG4gICAgICAgIG1vZGVsX25hbWU6IFwicmVxdWVzdF9sb2dzLm1vZGVsX25hbWVcIixcbiAgICAgICAgaW5wdXRfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5pbnB1dF90b2tlbnNcIixcbiAgICAgICAgb3V0cHV0X3Rva2VuczogXCJyZXF1ZXN0X2xvZ3Mub3V0cHV0X3Rva2Vuc1wiLFxuICAgICAgICBjYWNoZV9yZWFkX3Rva2VuczogXCJyZXF1ZXN0X2xvZ3MuY2FjaGVfcmVhZF90b2tlbnNcIixcbiAgICAgICAgY2FjaGVfY3JlYXRpb25fdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9jcmVhdGlvbl90b2tlbnNcIixcbiAgICAgICAgY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9jcmVhdGlvbl81bV90b2tlbnNcIixcbiAgICAgICAgY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zOiBcInJlcXVlc3RfbG9ncy5jYWNoZV9jcmVhdGlvbl8xaF90b2tlbnNcIixcbiAgICAgICAgY29zdF91c2Q6IFwicmVxdWVzdF9sb2dzLmNvc3RfdXNkXCIsXG4gICAgICB9KTtcblxuICAgIGNvbnN0IHN0b3JlZFRvdGFsID0gTnVtYmVyKHN0b3JlZD8udG90YWwgPz8gMCkgLyBNSUNST19VU0Q7XG5cbiAgICAvLyBsZWdhY3kgcm93IOuKlCDsnIQgU1VNIOyXkCDsoIDsnqXqsJLsnLzroZwg7J2066+4IO2PrO2VqOuQmOyWtCDsnojri6QuIOyerOqzhOyCsOqwkuqzvOydmCDssKjslaHrp4wg642U7ZWc64ukLlxuICAgIHJldHVybiBsZWdhY3lSb3dzLnJlZHVjZSgoc3VtLCByb3cpID0+IHtcbiAgICAgIGNvbnN0IGFscmVhZHlTdW1tZWQgPSBNYXRoLm1heChyb3cuY29zdF91c2QgPz8gMCwgMCkgLyBNSUNST19VU0Q7XG4gICAgICBjb25zdCB1c2FnZSA9IG5vcm1hbGl6ZWRVc2FnZUZvckNvc3Qocm93KTtcbiAgICAgIGlmICghdXNhZ2UubW9kZWwpIHJldHVybiBzdW07XG4gICAgICByZXR1cm4gKFxuICAgICAgICBzdW0gK1xuICAgICAgICBjYWxjdWxhdGVDb3N0VXNkKHVzYWdlLm1vZGVsLCB7XG4gICAgICAgICAgaW5wdXRUb2tlbnM6IHVzYWdlLmlucHV0VG9rZW5zLFxuICAgICAgICAgIG91dHB1dFRva2VuczogdXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiB1c2FnZS5jYWNoZWRJbnB1dFRva2VucyxcbiAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IHVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VucyxcbiAgICAgICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bTogdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW0sXG4gICAgICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg6IHVzYWdlLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoLFxuICAgICAgICB9KSAtXG4gICAgICAgIGFscmVhZHlTdW1tZWRcbiAgICAgICk7XG4gICAgfSwgc3RvcmVkVG90YWwpO1xuICB9XG5cbiAgYXN5bmMgZGlzdGluY3RQcm9qZWN0TmFtZXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLmdldFB1cmkoXCJyXCIpXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgLmRpc3RpbmN0KFwicHJvamVjdF9uYW1lXCIpXG4gICAgICAud2hlcmUoXCJwcm9qZWN0X25hbWVcIiwgXCIhPVwiLCBudWxsKVxuICAgICAgLm9yZGVyQnkoXCJwcm9qZWN0X25hbWVcIiwgXCJhc2NcIilcbiAgICAgIC5zZWxlY3Qoe1xuICAgICAgICBwcm9qZWN0X25hbWU6IFwicHJvamVjdF9uYW1lXCIsXG4gICAgICB9KTtcbiAgICByZXR1cm4gcm93cy5tYXAoKHIpID0+IHIucHJvamVjdF9uYW1lISk7XG4gIH1cblxuICBhc3luYyBkaXN0aW5jdE1vZGVsTmFtZXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLmdldFB1cmkoXCJyXCIpXG4gICAgICAuZnJvbShcInJlcXVlc3RfbG9nc1wiKVxuICAgICAgLmRpc3RpbmN0KFwibW9kZWxfbmFtZVwiKVxuICAgICAgLndoZXJlKFwibW9kZWxfbmFtZVwiLCBcIiE9XCIsIG51bGwpXG4gICAgICAub3JkZXJCeShcIm1vZGVsX25hbWVcIiwgXCJhc2NcIilcbiAgICAgIC5zZWxlY3Qoe1xuICAgICAgICBtb2RlbF9uYW1lOiBcIm1vZGVsX25hbWVcIixcbiAgICAgIH0pO1xuICAgIHJldHVybiByb3dzLm1hcCgocikgPT4gci5tb2RlbF9uYW1lISk7XG4gIH1cblxuICBAYXBpKHsgaHR0cE1ldGhvZDogXCJQT1NUXCIsIGNsaWVudHM6IFtcImF4aW9zXCIsIFwidGFuc3RhY2stbXV0YXRpb25cIl0gfSlcbiAgYXN5bmMgZGVsKGlkczogbnVtYmVyW10pOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHdkYiA9IHRoaXMuZ2V0UHVyaShcIndcIik7XG5cbiAgICAvLyB0cmFuc2FjdGlvblxuICAgIGF3YWl0IHdkYi50cmFuc2FjdGlvbihhc3luYyAodHJ4KSA9PiB7XG4gICAgICBhd2FpdCB0cnhcbiAgICAgICAgLnRhYmxlKFwicmVxdWVzdF9sb2dfc3RlcHNcIilcbiAgICAgICAgLndoZXJlSW4oXCJyZXF1ZXN0X2xvZ19zdGVwcy5yZXF1ZXN0X2xvZ19pZFwiLCBpZHMpXG4gICAgICAgIC5kZWxldGUoKTtcbiAgICAgIHJldHVybiB0cngudGFibGUoXCJyZXF1ZXN0X2xvZ3NcIikud2hlcmVJbihcInJlcXVlc3RfbG9ncy5pZFwiLCBpZHMpLmRlbGV0ZSgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGlkcy5sZW5ndGg7XG4gIH1cbn1cblxu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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { SD } from "../../i18n/sd.generated.js";
|
|
1
2
|
import __decorateMetadata from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorateMetadata.js";
|
|
2
3
|
import __decorate from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorate.js";
|
|
3
|
-
import { SD } from "../../i18n/sd.generated.js";
|
|
4
4
|
import { requestLogStepLoaderQueries, requestLogStepSubsetQueries } from "../sonamu.generated.sso.js";
|
|
5
5
|
import { BadRequestException, BaseModelClass, NotFoundException, api, asArray, exhaustive } from "sonamu";
|
|
6
6
|
//#region src/application/request-log-step/request-log-step.model.ts
|