sonamu 0.7.45 → 0.7.47
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/dist/bin/cli.js +137 -4
- package/dist/database/base-model.d.ts +20 -5
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +102 -5
- package/dist/dict/en.d.ts +54 -54
- package/dist/dict/en.d.ts.map +1 -1
- package/dist/dict/en.js +4 -66
- package/dist/dict/ko.d.ts +50 -50
- package/dist/dict/ko.js +4 -4
- package/dist/dict/rc-keys.d.ts +113 -57
- package/dist/dict/rc-keys.d.ts.map +1 -1
- package/dist/dict/rc-keys.js +69 -3
- package/dist/dict/sonamu-dictionary.d.ts +8 -2
- package/dist/dict/sonamu-dictionary.d.ts.map +1 -1
- package/dist/dict/sonamu-dictionary.js +46 -6
- package/dist/dict/types.d.ts +1 -1
- package/dist/dict/types.d.ts.map +1 -1
- package/dist/dict/types.js +1 -1
- package/dist/entity/entity.d.ts +14 -0
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +33 -2
- package/dist/filter/index.d.ts +4 -0
- package/dist/filter/index.d.ts.map +1 -0
- package/dist/filter/index.js +5 -0
- package/dist/filter/metadata.d.ts +19 -0
- package/dist/filter/metadata.d.ts.map +1 -0
- package/dist/filter/metadata.js +39 -0
- package/dist/filter/types.d.ts +74 -0
- package/dist/filter/types.d.ts.map +1 -0
- package/dist/filter/types.js +89 -0
- package/dist/filter/utils.d.ts +33 -0
- package/dist/filter/utils.d.ts.map +1 -0
- package/dist/filter/utils.js +149 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/tasks/decorator.d.ts +3 -1
- package/dist/tasks/decorator.d.ts.map +1 -1
- package/dist/tasks/decorator.js +3 -2
- package/dist/tasks/workflow-manager.d.ts.map +1 -1
- package/dist/tasks/workflow-manager.js +7 -4
- package/dist/template/helpers.d.ts +5 -0
- package/dist/template/helpers.d.ts.map +1 -1
- package/dist/template/helpers.js +68 -1
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +17 -3
- package/dist/template/implementations/sd.template.d.ts +5 -0
- package/dist/template/implementations/sd.template.d.ts.map +1 -1
- package/dist/template/implementations/sd.template.js +56 -7
- package/dist/template/implementations/services.template.d.ts.map +1 -1
- package/dist/template/implementations/services.template.js +2 -1
- package/dist/ui/api.js +1 -1
- package/dist/ui-web/assets/{index-C4wYRzph.js → index-DF2tc-SZ.js} +45 -45
- package/dist/ui-web/index.html +1 -1
- package/package.json +9 -4
- package/src/bin/cli.ts +140 -2
- package/src/database/base-model.ts +140 -5
- package/src/dict/en.ts +4 -75
- package/src/dict/ko.ts +3 -3
- package/src/dict/rc-keys.ts +81 -5
- package/src/dict/sonamu-dictionary.ts +51 -6
- package/src/dict/types.ts +1 -1
- package/src/entity/entity.ts +46 -1
- package/src/filter/index.ts +3 -0
- package/src/filter/metadata.ts +47 -0
- package/src/filter/types.ts +112 -0
- package/src/filter/utils.ts +190 -0
- package/src/index.ts +1 -0
- package/src/shared/web.shared.ts.txt +79 -0
- package/src/tasks/decorator.ts +4 -0
- package/src/tasks/workflow-manager.ts +3 -0
- package/src/template/helpers.ts +80 -0
- package/src/template/implementations/generated.template.ts +26 -2
- package/src/template/implementations/sd.template.ts +67 -6
- package/src/template/implementations/services.template.ts +1 -0
- package/src/ui/api.ts +1 -1
package/dist/bin/cli.js
CHANGED
|
@@ -3,7 +3,7 @@ import dotenv from "dotenv";
|
|
|
3
3
|
dotenv.config();
|
|
4
4
|
import assert from "assert";
|
|
5
5
|
import { execSync, spawn } from "child_process";
|
|
6
|
-
import { mkdir, readdir, writeFile } from "node:fs/promises";
|
|
6
|
+
import { cp, mkdir, readdir, readFile, writeFile } from "node:fs/promises";
|
|
7
7
|
import knex from "knex";
|
|
8
8
|
import { createRequire } from "module";
|
|
9
9
|
import path from "path";
|
|
@@ -22,7 +22,8 @@ async function bootstrap() {
|
|
|
22
22
|
const notToInit = [
|
|
23
23
|
"dev",
|
|
24
24
|
"build",
|
|
25
|
-
"start"
|
|
25
|
+
"start",
|
|
26
|
+
"skills"
|
|
26
27
|
].includes(process.argv[2] ?? "");
|
|
27
28
|
if (!notToInit) {
|
|
28
29
|
await Sonamu.init(false, false);
|
|
@@ -134,6 +135,15 @@ async function bootstrap() {
|
|
|
134
135
|
],
|
|
135
136
|
[
|
|
136
137
|
"start"
|
|
138
|
+
],
|
|
139
|
+
[
|
|
140
|
+
"skills",
|
|
141
|
+
"sync"
|
|
142
|
+
],
|
|
143
|
+
[
|
|
144
|
+
"skills",
|
|
145
|
+
"create",
|
|
146
|
+
"#name"
|
|
137
147
|
]
|
|
138
148
|
],
|
|
139
149
|
runners: {
|
|
@@ -152,7 +162,9 @@ async function bootstrap() {
|
|
|
152
162
|
sync,
|
|
153
163
|
dev,
|
|
154
164
|
build,
|
|
155
|
-
start
|
|
165
|
+
start,
|
|
166
|
+
skills_sync,
|
|
167
|
+
skills_create
|
|
156
168
|
}
|
|
157
169
|
});
|
|
158
170
|
} finally{
|
|
@@ -511,5 +523,126 @@ async function scaffold_model_test(entityId) {
|
|
|
511
523
|
entityId
|
|
512
524
|
});
|
|
513
525
|
}
|
|
526
|
+
/**
|
|
527
|
+
* pnpm sonamu skills sync 하면 실행되는 함수입니다.
|
|
528
|
+
* 공식 Skills를 로컬 프로젝트로 동기화합니다.
|
|
529
|
+
*/ async function skills_sync() {
|
|
530
|
+
const workspaceRoot = await findWorkspaceRoot();
|
|
531
|
+
const claudeDir = path.join(workspaceRoot, ".claude");
|
|
532
|
+
const targetSkillsDir = path.join(claudeDir, "skills", "sonamu");
|
|
533
|
+
// @sonamu-kit/skills 패키지 경로
|
|
534
|
+
const require = createRequire(import.meta.url);
|
|
535
|
+
const sourceBase = path.dirname(require.resolve("@sonamu-kit/skills/CLAUDE.md"));
|
|
536
|
+
const sourceSkillsDir = path.join(sourceBase, "sonamu");
|
|
537
|
+
const sourceClaudeMd = path.join(sourceBase, "CLAUDE.md");
|
|
538
|
+
if (!await exists(sourceSkillsDir)) {
|
|
539
|
+
console.log(chalk.yellow("Skills source not found in sonamu package."));
|
|
540
|
+
return;
|
|
541
|
+
}
|
|
542
|
+
// 대상 디렉토리 생성
|
|
543
|
+
await mkdir(targetSkillsDir, {
|
|
544
|
+
recursive: true
|
|
545
|
+
});
|
|
546
|
+
// 복사 (recursive, 덮어쓰기)
|
|
547
|
+
await cp(sourceSkillsDir, targetSkillsDir, {
|
|
548
|
+
recursive: true,
|
|
549
|
+
force: true
|
|
550
|
+
});
|
|
551
|
+
console.log(chalk.green(`✓ Skills synced to ${targetSkillsDir}`));
|
|
552
|
+
// CLAUDE.md 복사/업데이트
|
|
553
|
+
if (await exists(sourceClaudeMd)) {
|
|
554
|
+
const targetClaudeMd = path.join(claudeDir, "CLAUDE.md");
|
|
555
|
+
const sourceContent = await readFile(sourceClaudeMd, "utf-8");
|
|
556
|
+
if (await exists(targetClaudeMd)) {
|
|
557
|
+
const targetContent = await readFile(targetClaudeMd, "utf-8");
|
|
558
|
+
const startMarker = "<!-- SONAMU:START -->";
|
|
559
|
+
const endMarker = "<!-- SONAMU:END -->";
|
|
560
|
+
if (targetContent.includes(startMarker) && targetContent.includes(endMarker)) {
|
|
561
|
+
// marker 영역만 교체합니다.
|
|
562
|
+
const before = targetContent.split(startMarker)[0];
|
|
563
|
+
const after = targetContent.split(endMarker)[1];
|
|
564
|
+
const newContent = `${before}${sourceContent}${after}`;
|
|
565
|
+
await writeFile(targetClaudeMd, newContent);
|
|
566
|
+
console.log(chalk.green(`✓ CLAUDE.md updated (marker region)`));
|
|
567
|
+
} else {
|
|
568
|
+
console.log(chalk.yellow(`⏭ CLAUDE.md exists but no markers, skipped`));
|
|
569
|
+
}
|
|
570
|
+
} else {
|
|
571
|
+
await writeFile(targetClaudeMd, sourceContent);
|
|
572
|
+
console.log(chalk.green(`✓ CLAUDE.md created`));
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
/**
|
|
577
|
+
* pnpm sonamu skills create <name> 하면 실행되는 함수입니다.
|
|
578
|
+
* 로컬 skill 초안을 생성합니다.
|
|
579
|
+
*/ async function skills_create(name) {
|
|
580
|
+
const workspaceRoot = await findWorkspaceRoot();
|
|
581
|
+
const localDir = path.join(workspaceRoot, ".claude", "skills", "local");
|
|
582
|
+
const filePath = path.join(localDir, `${name}.md`);
|
|
583
|
+
if (await exists(filePath)) {
|
|
584
|
+
console.log(chalk.yellow(`Skill "${name}" already exists.`));
|
|
585
|
+
return;
|
|
586
|
+
}
|
|
587
|
+
await mkdir(localDir, {
|
|
588
|
+
recursive: true
|
|
589
|
+
});
|
|
590
|
+
const template = `---
|
|
591
|
+
name: ${name}
|
|
592
|
+
category: other
|
|
593
|
+
created_at: ${new Date().toISOString().split("T")[0]}
|
|
594
|
+
status: draft
|
|
595
|
+
---
|
|
596
|
+
|
|
597
|
+
# [제목]
|
|
598
|
+
|
|
599
|
+
## 상황
|
|
600
|
+
|
|
601
|
+
[어떤 문제였는지]
|
|
602
|
+
|
|
603
|
+
## 해결 방법
|
|
604
|
+
|
|
605
|
+
[어떻게 해결했는지]
|
|
606
|
+
|
|
607
|
+
## 코드 예시
|
|
608
|
+
|
|
609
|
+
\`\`\`typescript
|
|
610
|
+
// 예시 코드
|
|
611
|
+
\`\`\`
|
|
612
|
+
`;
|
|
613
|
+
await writeFile(filePath, template);
|
|
614
|
+
console.log(chalk.green(`✓ Created .claude/skills/local/${name}.md`));
|
|
615
|
+
}
|
|
616
|
+
/**
|
|
617
|
+
* 워크스페이스 루트를 찾습니다.
|
|
618
|
+
* 우선순위: pnpm-workspace.yaml > CLAUDE.md > 루트 package.json (workspaces 필드)
|
|
619
|
+
*/ async function findWorkspaceRoot() {
|
|
620
|
+
let dir = process.cwd();
|
|
621
|
+
while(dir !== path.dirname(dir)){
|
|
622
|
+
// 1. pnpm-workspace.yaml 파일이 있는지 확인. 있으면 확실한 monorepo 루트.
|
|
623
|
+
if (await exists(path.join(dir, "pnpm-workspace.yaml"))) {
|
|
624
|
+
return dir;
|
|
625
|
+
}
|
|
626
|
+
// 2. CLAUDE.md 파일이 있는지 확인. 있으면 프로젝트 루트로 간주함.
|
|
627
|
+
if (await exists(path.join(dir, "CLAUDE.md"))) {
|
|
628
|
+
return dir;
|
|
629
|
+
}
|
|
630
|
+
// 3. package.json에 workspaces 필드가 있으면 루트.
|
|
631
|
+
const packagePath = path.join(dir, "package.json");
|
|
632
|
+
if (await exists(packagePath)) {
|
|
633
|
+
try {
|
|
634
|
+
const packageJson = JSON.parse(await readFile(packagePath, "utf-8"));
|
|
635
|
+
if (packageJson.workspaces) {
|
|
636
|
+
return dir;
|
|
637
|
+
}
|
|
638
|
+
} catch {
|
|
639
|
+
// 파싱 실패시 무시
|
|
640
|
+
}
|
|
641
|
+
}
|
|
642
|
+
dir = path.dirname(dir);
|
|
643
|
+
}
|
|
644
|
+
// 찾지 못하면 api 폴더의 부모 사용
|
|
645
|
+
return findAppRootPath();
|
|
646
|
+
}
|
|
514
647
|
|
|
515
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCBkb3RlbnYgZnJvbSBcImRvdGVudlwiO1xuXG5kb3RlbnYuY29uZmlnKCk7XG5cbmltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgZXhlY1N5bmMsIHNwYXduIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IG1rZGlyLCByZWFkZGlyLCB3cml0ZUZpbGUgfSBmcm9tIFwiZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBrbmV4LCB7IHR5cGUgS25leCB9IGZyb20gXCJrbmV4XCI7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSBcIm1vZHVsZVwiO1xuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCBwcm9jZXNzIGZyb20gXCJwcm9jZXNzXCI7XG5pbXBvcnQgeyB0c2ljbGkgfSBmcm9tIFwidHNpY2xpXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgdHlwZSB7IFNvbmFtdURCQ29uZmlnIH0gZnJvbSBcIi4uL2RhdGFiYXNlL2RiXCI7XG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyIH0gZnJvbSBcIi4uL2VudGl0eS9lbnRpdHktbWFuYWdlclwiO1xuaW1wb3J0IHsgTWlncmF0b3IgfSBmcm9tIFwiLi4vbWlncmF0aW9uL21pZ3JhdG9yXCI7XG5pbXBvcnQgeyBGaXh0dXJlTWFuYWdlciB9IGZyb20gXCIuLi90ZXN0aW5nL2ZpeHR1cmUtbWFuYWdlclwiO1xuaW1wb3J0IHtcbiAgZXhlY1dpdGhMaW5lUHJlZml4LFxuICBwcmludEJ1aWxkU3VtbWFyeSxcbiAgcHJpbnRUYXNrRmFpbGVkLFxuICBwcmludFRhc2tIZWFkZXIsXG4gIHByaW50VGFza1N0YXJ0LFxuICBwcmludFRhc2tTdWNjZXNzLFxufSBmcm9tIFwiLi4vdXRpbHMvY29uc29sZS11dGlsXCI7XG5pbXBvcnQgeyBleGlzdHMgfSBmcm9tIFwiLi4vdXRpbHMvZnMtdXRpbHNcIjtcbmltcG9ydCB7IGZpbmRBcGlSb290UGF0aCwgZmluZEFwcFJvb3RQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzXCI7XG5pbXBvcnQgeyBBUElfQVJUSUZBQ1RTLCB0eXBlIEJ1aWxkQXJ0aWZhY3QsIFdFQl9BUlRJRkFDVFMgfSBmcm9tIFwiLi9idWlsZC1jb25maWdcIjtcblxubGV0IG1pZ3JhdG9yOiBNaWdyYXRvcjtcblxuYXN5bmMgZnVuY3Rpb24gYm9vdHN0cmFwKCkge1xuICBjb25zdCBub3RUb0luaXQgPSBbXCJkZXZcIiwgXCJidWlsZFwiLCBcInN0YXJ0XCJdLmluY2x1ZGVzKHByb2Nlc3MuYXJndlsyXSA/PyBcIlwiKTtcbiAgaWYgKCFub3RUb0luaXQpIHtcbiAgICBhd2FpdCBTb25hbXUuaW5pdChmYWxzZSwgZmFsc2UpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCB0c2ljbGkocHJvY2Vzcy5hcmd2LCB7XG4gICAgICB0eXBlczoge1xuICAgICAgICBcIiNlbnRpdHlJZFwiOiB7XG4gICAgICAgICAgdHlwZTogXCJhdXRvY29tcGxldGVcIixcbiAgICAgICAgICBuYW1lOiBcIiNlbnRpdHlJZFwiLFxuICAgICAgICAgIG1lc3NhZ2U6IFwiUGxlYXNlIGlucHV0ICNlbnRpdHlJZFwiLFxuICAgICAgICAgIGNob2ljZXM6IEVudGl0eU1hbmFnZXIuZ2V0QWxsUGFyZW50SWRzKCkubWFwKChlbnRpdHlJZCkgPT4gKHtcbiAgICAgICAgICAgIHRpdGxlOiBlbnRpdHlJZCxcbiAgICAgICAgICAgIHZhbHVlOiBlbnRpdHlJZCxcbiAgICAgICAgICB9KSksXG4gICAgICAgIH0sXG4gICAgICAgIFwiI3JlY29yZElkc1wiOiBcIm51bWJlcltdXCIsXG4gICAgICAgIFwiI25hbWVcIjogXCJzdHJpbmdcIixcbiAgICAgICAgXCIjdGFyZ2V0c1wiOiB7XG4gICAgICAgICAgdHlwZTogXCJtdWx0aXNlbGVjdFwiLFxuICAgICAgICAgIG5hbWU6IFwiI3RhcmdldHNcIixcbiAgICAgICAgICBtZXNzYWdlOiBcIlBsZWFzZSBpbnB1dCAjdGFyZ2V0c1wiLFxuICAgICAgICAgIGNob2ljZXM6IFtcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiRGV2ZWxvcG1lbnRcIiwgdmFsdWU6IFwiZGV2ZWxvcG1lbnRfbWFzdGVyXCIgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiUHJvZHVjdGlvblwiLCB2YWx1ZTogXCJwcm9kdWN0aW9uX21hc3RlclwiIH0sXG4gICAgICAgICAgICB7IHRpdGxlOiBcIkZpeHR1cmVcIiwgdmFsdWU6IFwiZml4dHVyZVwiIH0sXG4gICAgICAgICAgICB7IHRpdGxlOiBcIlRlc3RcIiwgdmFsdWU6IFwidGVzdFwiIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBhcmdzOiBbXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJpbml0XCJdLFxuICAgICAgICBbXCJmaXh0dXJlXCIsIFwiaW1wb3J0XCIsIFwiI2VudGl0eUlkXCIsIFwiI3JlY29yZElkc1wiXSxcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcInN5bmNcIl0sXG4gICAgICAgIFtcIm1pZ3JhdGVcIiwgXCJydW5cIl0sXG4gICAgICAgIFtcIm1pZ3JhdGVcIiwgXCJhcHBseVwiLCBcIiN0YXJnZXRzXCJdLFxuICAgICAgICBbXCJtaWdyYXRlXCIsIFwic3RhdHVzXCJdLFxuICAgICAgICBbXCJzdHViXCIsIFwicHJhY3RpY2VcIiwgXCIjbmFtZVwiXSxcbiAgICAgICAgW1wic3R1YlwiLCBcImVudGl0eVwiLCBcIiNuYW1lXCJdLFxuICAgICAgICBbXCJzY2FmZm9sZFwiLCBcIm1vZGVsXCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJzY2FmZm9sZFwiLCBcIm1vZGVsX3Rlc3RcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcInNjYWZmb2xkXCIsIFwidmlld19saXN0XCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJzY2FmZm9sZFwiLCBcInZpZXdfZm9ybVwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgICAgW1wic3luY1wiXSxcbiAgICAgICAgW1wiZGV2XCJdLFxuICAgICAgICBbXCJidWlsZFwiXSxcbiAgICAgICAgW1wic3RhcnRcIl0sXG4gICAgICBdLFxuICAgICAgcnVubmVyczoge1xuICAgICAgICBtaWdyYXRlX3N0YXR1cyxcbiAgICAgICAgbWlncmF0ZV9ydW4sXG4gICAgICAgIG1pZ3JhdGVfYXBwbHksXG4gICAgICAgIGZpeHR1cmVfaW5pdCxcbiAgICAgICAgZml4dHVyZV9pbXBvcnQsXG4gICAgICAgIGZpeHR1cmVfc3luYyxcbiAgICAgICAgc3R1Yl9wcmFjdGljZSxcbiAgICAgICAgc3R1Yl9lbnRpdHksXG4gICAgICAgIHNjYWZmb2xkX21vZGVsLFxuICAgICAgICBzY2FmZm9sZF9tb2RlbF90ZXN0LFxuICAgICAgICAvLyBzY2FmZm9sZF92aWV3X2xpc3QsXG4gICAgICAgIC8vIHNjYWZmb2xkX3ZpZXdfZm9ybSxcbiAgICAgICAgc3luYyxcbiAgICAgICAgZGV2LFxuICAgICAgICBidWlsZCxcbiAgICAgICAgc3RhcnQsXG4gICAgICB9LFxuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IFNvbmFtdS5kZXN0cm95KCk7XG4gIH1cbn1cblxuYm9vdHN0cmFwKCkuZmluYWxseShhc3luYyAoKSA9PiB7XG4gIGF3YWl0IEZpeHR1cmVNYW5hZ2VyLmRlc3Ryb3koKTtcbn0pO1xuXG4vKipcbiAqIHBucG0gc3luYyDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIO2UhOuhnOygne2KuOulvCDsi7Htgaztlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN5bmMoKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuc3luYygpO1xufVxuXG4vKipcbiAqIHBucG0gZGV2IO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICog7ZSE66Gc7KCd7Yq47JeQIOuMgO2VtCBITVIg7KeA7JuQ7ZWY64qUIOqwnOuwnCDshJzrsoTrpbwg652E7JuM7KSN64uI64ukLlxuICpcbiAqIFR5cGVTY3JpcHTrpbwg67CU66GcIOyLpO2Wie2VoCDsiJgg7J6I64+E66GdIEBzb25hbXUta2l0L3RzLWxvYWRlcuulvCxcbiAqIEhNUuydhCDsp4Dsm5DtlZjquLAg7JyE7ZW0IEBzb25hbXUta2l0L2htci1ob29r7J2EIGltcG9ydO2VmOupsCxcbiAqIOyGjOyKpOuntSDsp4Dsm5DsnYQg7JyE7ZW0IC0tZW5hYmxlLXNvdXJjZS1tYXBzIO2UjOuemOq3uOulvCDtj6ztlajtlZjsl6wg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIOydtOuVjCBAc29uYW11LWtpdC90cy1sb2FkZXLsmYAgQHNvbmFtdS1raXQvaG1yLWhvb2vripQgc29uYW116rCAIOyekOyytOyggeycvOuhnCDqsIDsp4Dqs6Ag7J6I64qUIGRlcGVuZGVuY3nsnoXri4jri6QuXG4gKiDrmJDtlZwg7Iuk7ZaJ7JeQIOyCrOyaqe2VmOuKlCBAc29uYW11LWtpdC9obXItcnVubmVy64+EIOuniOywrOqwgOyngOuhnCBzb25hbXXqsIAg7J6Q7LK07KCB7Jy866GcIOqwgOyngOqzoCDsnojripQgZGVwZW5kZW5jeeyeheuLiOuLpC5cbiAqIOuUsOudvOyEnCDsgqzsmqnsnpAg7ZSE66Gc7KCd7Yq47JeQ7ISc64qUIOydtCDshLgg7Yyo7YKk7KeA66W8IOyngeygkSDshKTsuZjtlaAg7ZWE7JqU6rCAIOyXhuyKteuLiOuLpC5cbiAqXG4gKiBTb25hbXUuaW5pdCDsl4bsnbQg7Zi47Lac65CgIOqyg+ydhCDsg4HsoJXtlZjsl6wg6rWs7ZiE65CY7JeI7Iq164uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBkZXYoKSB7XG4gIGNvbnN0IGFwaVJvb3QgPSBmaW5kQXBpUm9vdFBhdGgoKTtcbiAgY29uc3QgZW50cnlQb2ludCA9IFwic3JjL2luZGV4LnRzXCI7XG5cbiAgY29uc29sZS5sb2coY2hhbGsueWVsbG93LmJvbGQoXCLwn5qAIFN0YXJ0aW5nIFNvbmFtdSBkZXYgc2VydmVyLi4uXFxuXCIpKTtcblxuICAvLyDsnbQgc29uYW11IO2MqO2CpOyngOqwgCBkZXBlbmRlbmNpZXProZwg6rCA7KeA6rOgIOyeiOuKlCBAc29uYW11LWtpdC9obXItcnVubmVy7J2YIGJpbi9ydW4uanPrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICAvLyDsnbQg6rK966GcKC9iaW4vcnVuLmpzKeuKlCBAc29uYW11LWtpdC9obXItcnVubmVy7J2YIHBhY2thZ2UuanNvbuydmCBiaW4g7ZWE65Oc7JeQIOuqheyLnOuQmOyWtCDsnojripQg6re46rKD6rO8IOqwmeyKteuLiOuLpC5cbiAgY29uc3QgaG90UnVubmVyQmluUGF0aCA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKS5yZXNvbHZlKFxuICAgIFwiQHNvbmFtdS1raXQvaG1yLXJ1bm5lci9iaW4vcnVuLmpzXCIsXG4gICk7XG5cbiAgY29uc3Qgc2VydmVyUHJvY2VzcyA9IHNwYXduKFxuICAgIHByb2Nlc3MuZXhlY1BhdGgsIC8vIG5vZGVcbiAgICBbXG4gICAgICBob3RSdW5uZXJCaW5QYXRoLCAvLyDsnbTroIfqsowg7ZW07IScIGhvdC1ydW5uZXLrpbwg7Iuk7ZaJ7ZWY6rWs7JqUXG4gICAgICBcIi0tY2xlYXItc2NyZWVuPWZhbHNlXCIsIC8vIOydtO2VmCBob3QtcnVubmVy7JeQ6rKMIOuEmOqyqOykhCDsnbjsnpDrk6TsnoXri4jri6QuXG4gICAgICBcIi0tbm9kZS1hcmdzPS0taW1wb3J0PXNvbmFtdS90cy1sb2FkZXItcmVnaXN0ZXJcIiwgLy8gVHlwZVNjcmlwdCDshJztj6ztirjrpbwg7JyE7ZWcIOuhnOuNlCxcbiAgICAgIFwiLS1ub2RlLWFyZ3M9LS1pbXBvcnQ9c29uYW11L2htci1ob29rLXJlZ2lzdGVyXCIsIC8vIEhNUuydhCDsp4Dsm5DtlZjquLAg7JyE7ZWcIGhvb2ssXG4gICAgICBcIi0tbm9kZS1hcmdzPS0tZW5hYmxlLXNvdXJjZS1tYXBzXCIsIC8vIOq3uOumrOqzoCDshozsiqTrp7Ug7KeA7JuQ7J2EIOychO2VnCDtlIzrnpjqt7jsnoXri4jri6QuXG4gICAgICBcIi0tb24ta2V5PXI6cmVzdGFydDpSZXN0YXJ0IHNlcnZlclwiLCAvLyByIOuIhOultOuptCDshJzrsoQg7J6s7Iuc7J6R7ZWY6rKMIO2VtOykmOyalC5cbiAgICAgIGAtLW9uLWtleT1mOnNoZWxsKHJtICR7cGF0aC5qb2luKGFwaVJvb3QsIFwic29uYW11LmxvY2tcIil9KTpyZXN0YXJ0OkZvcmNlIHJlc3RhcnRgLCAvLyBmIOuIhOultOuptCBzb25hbXUubG9jayDtjIzsnbzsnYQg7KeA7Jqw6rOgIOyEnOuyhCDsnqzsi5zsnpHtlZjqsowg7ZW07KSY7JqULlxuXG4gICAgICBcIi0tb24ta2V5PWVudGVyOnNoZWxsKGVjaG8gaGkpOktleSBiaW5kaW5nIHRlc3RcIiwgLy8gZW50ZXLrpbwga2V566GcIOyTuCDsiJgg7J6I7J2M7J2EIOuztOydtOq4sCDsnITtlZwg7YWM7Iqk7Yq47J6F64uI64ukLlxuICAgICAgXCItLW9uLWtleT1jdHJsK2YgY3RybCtmOnNoZWxsKGdpdCBwdWxsICYmIHBucG0gaW5zdGFsbCAmJiBwbnBtIC0tZmlsdGVyIHNvbmFtdSBidWlsZCAmJiBlY2hvICdTb25hbXUgaXMgbm93IHVwLXRvLWRhdGUhJyk6cmVzdGFydDpQdWxsICYgaW5zdGFsbCAmIGJ1aWxkICYgcmVzdGFydFwiLCAvLyBtb2RpZmllcuyZgOydmCDsobDtlaksIOq3uOumrOqzoCDrkZAg6rCc7J2YIGNob3Jk66W8IOyCrOyaqe2VoCDsiJgg7J6I7J2M7J2EIOuztOydtOq4sCDsnITtlZwg7YWM7Iqk7Yq47J6F64uI64ukLlxuICAgICAgZW50cnlQb2ludCwgLy8g66eI7KeA66eJ7Jy866GcIOyLpOygnCDsi6TtlontlaAg7Iqk7YGs66a97Yq47J2YIOqyveuhnOulvCDrhJjqsqjspI3ri4jri6QuXG4gICAgXSxcbiAgICB7XG4gICAgICBjd2Q6IGFwaVJvb3QsXG4gICAgICBzdGRpbzogXCJpbmhlcml0XCIsXG4gICAgICBlbnY6IHtcbiAgICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICAgIE5PREVfRU5WOiBcImRldmVsb3BtZW50XCIsXG4gICAgICAgIEhPVDogXCJ5ZXNcIiwgLy8g7JaY6rCAIOyeiOyWtOyVvCBITVLsnbQg7Zmc7ISx7ZmU65Cp64uI64ukLlxuICAgICAgICBBUElfUk9PVF9QQVRIOiBhcGlSb290LCAvLyDsnbQg6rK966Gc6rCAIGhtci1ob29r7J2YIOujqO2KuCDrlJTroInthqDrpqzqsIAg65Cp64uI64ukLlxuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIC8vIOyiheujjCDsspjrpqxcbiAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coXCJcXG5cXG7wn5GLIFNodXR0aW5nIGRvd24uLi5cIikpO1xuICAgIHNlcnZlclByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9O1xuXG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgY2xlYW51cCk7XG4gIHByb2Nlc3Mub24oXCJTSUdURVJNXCIsIGNsZWFudXApO1xuXG4gIHNlcnZlclByb2Nlc3Mub24oXCJleGl0XCIsIChjb2RlKSA9PiB7XG4gICAgaWYgKGNvZGUgIT09IDApIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKGDinYwgU2VydmVyIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfWApKTtcbiAgICAgIHByb2Nlc3MuZXhpdChjb2RlIHx8IDEpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogcG5wbSBidWlsZCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIO2UhOuhnOygne2KuOulvCDruYzrk5ztlanri4jri6QuXG4gKlxuICog67mM65Oc7JeQIO2VhOyalO2VnCAuc3djcmPripQg7ZSE66Gc7KCd7Yq4IOujqO2KuOyXkOyEnCDssL7qs6AsIOyXhuycvOuptCBzb25hbXXqsIAg6rSA66as7ZWY64qUIC5zd2NyYy5wcm9qZWN0LWRlZmF1bHTrpbwg7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIOyLpOygnCDruYzrk5wg7YOA6rKfKOyVhO2LsO2Mqe2KuCnqs7wg64+Z7J6R7J2AIGJ1aWxkLWNvbmZpZy50c+yXkCDsoJXsnZjrkJjslrQg7J6I7Iq164uI64ukLlxuICog7J20IO2VqOyImOuKlCBidWlsZC1jb25maWcudHPsl5Ag7KCV7J2Y65CcIOuPmeyekeuTpOydhCDsi6TtlontlbTso7zripQg7Jet7ZWg66eMIO2VqeuLiOuLpC5cbiAqXG4gKiBTb25hbXUuaW5pdCDsl4bsnbQg7Zi47Lac65CgIOqyg+ydhCDsg4HsoJXtlZjsl6wg6rWs7ZiE65CY7JeI7Iq164uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBidWlsZCgpIHtcbiAgY29uc3QgYXBwUm9vdCA9IGZpbmRBcHBSb290UGF0aCgpO1xuXG4gIC8vIC5zd2NyYyDtjIzsnbzsnYQg7KeA7KCV7ZWp64uI64ukLlxuICBsZXQgc3djRmlsZVBhdGggPSBcIi5zd2NyY1wiO1xuICB0cnkge1xuICAgIGlmIChhd2FpdCBleGlzdHMoc3djRmlsZVBhdGgpKSB7XG4gICAgICAvLyDsgqzsmqnsnpAg7ZSE66Gc7KCd7Yq47JeQIC5zd2NyY+qwgCDsnojsnLzrqbQg7Jqw7ISg7Jy866GcIOyCrOyaqe2VqeuLiOuLpC5cbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShcIlVzaW5nIC5zd2NyYyBmcm9tIHByb2plY3Qgcm9vdC4uLlwiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIOyVhOuLiOudvOuptCBzb25hbXXqsIAg6rSA66as7ZWY64qUIC5zd2NyYy5wcm9qZWN0LWRlZmF1bHTrpbwg6rCA7KC464ukIOyUgeuLiOuLpC5cbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmRpbShcIlVzaW5nIGRlZmF1bHQgLnN3Y3JjIGZyb20gc29uYW11IHBhY2thZ2UuLi5cIikpO1xuICAgICAgc3djRmlsZVBhdGggPSBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiLCBcIi4uXCIsIFwiLnN3Y3JjLnByb2plY3QtZGVmYXVsdFwiKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihjaGFsay5yZWQoXCJTZXR0aW5nIHVwIHN3YyBjb25maWcgZmlsZSBmYWlsZWQuXCIpLCBlcnJvcik7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgLy8gQVBJIO2UhOuhnOygne2KuOulvCDruYzrk5ztlanri4jri6QuXG4gIGNvbnN0IGFwaVN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBBUElfQVJUSUZBQ1RTKSB7XG4gICAgICBjb25zdCBjd2QgPSBwYXRoLmpvaW4oYXBwUm9vdCwgYXJ0aWZhY3QucHJvamVjdFBhdGgpO1xuICAgICAgcHJpbnRUYXNrSGVhZGVyKGFydGlmYWN0Lm5hbWUsIGFydGlmYWN0LmRlc2NyaXB0aW9uLCBjd2QpO1xuXG4gICAgICBhd2FpdCBydW5CdWlsZFN0ZXBzKGFydGlmYWN0LCB7IGN3ZCwgYnVpbGRDb21tYW5kQXJnczogeyBjb25maWdGaWxlUGF0aDogc3djRmlsZVBhdGggfSB9KTtcbiAgICB9XG4gICAgcHJpbnRCdWlsZFN1bW1hcnkoXCJBUElcIiwgdHJ1ZSwgRGF0ZS5ub3coKSAtIGFwaVN0YXJ0ZWRBdCk7XG4gIH0gY2F0Y2gge1xuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiQVBJXCIsIGZhbHNlLCBEYXRlLm5vdygpIC0gYXBpU3RhcnRlZEF0KTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICAvLyBXZWIg7ZSE66Gc7KCd7Yq466W8IOu5jOuTnO2VqeuLiOuLpC5cbiAgY29uc3Qgd2ViU3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IGFydGlmYWN0IG9mIFdFQl9BUlRJRkFDVFMpIHtcbiAgICAgIGNvbnN0IGN3ZCA9IHBhdGguam9pbihhcHBSb290LCBhcnRpZmFjdC5wcm9qZWN0UGF0aCk7XG4gICAgICBwcmludFRhc2tIZWFkZXIoYXJ0aWZhY3QubmFtZSwgYXJ0aWZhY3QuZGVzY3JpcHRpb24sIGN3ZCk7XG5cbiAgICAgIGF3YWl0IHJ1bkJ1aWxkU3RlcHMoYXJ0aWZhY3QsIHsgY3dkLCBidWlsZENvbW1hbmRBcmdzOiB7fSB9KTtcbiAgICB9XG4gICAgcHJpbnRCdWlsZFN1bW1hcnkoXCJXZWJcIiwgdHJ1ZSwgRGF0ZS5ub3coKSAtIHdlYlN0YXJ0ZWRBdCk7XG4gIH0gY2F0Y2gge1xuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiV2ViXCIsIGZhbHNlLCBEYXRlLm5vdygpIC0gd2ViU3RhcnRlZEF0KTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cbn1cblxuLyoqXG4gKiBwcmUtYnVpbGQsIGJ1aWxkLCBwb3N0LWJ1aWxkIOuLqOqzhOulvCDsiJzssKjsoIHsnLzroZwg7Iuk7ZaJ7ZWp64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBydW5CdWlsZFN0ZXBzPFQ+KFxuICBhcnRpZmFjdDogQnVpbGRBcnRpZmFjdDxUPixcbiAgb3B0aW9uczogeyBjd2Q6IHN0cmluZzsgYnVpbGRDb21tYW5kQXJnczogVCB9LFxuKSB7XG4gIGNvbnN0IHN0ZXBzID0gW1xuICAgIHsgbmFtZTogXCJwcmUtYnVpbGRcIiwgY21kOiBhcnRpZmFjdC5wcmVCdWlsZENvbW1hbmQ/LigpIH0sXG4gICAgeyBuYW1lOiBcImJ1aWxkXCIsIGNtZDogYXJ0aWZhY3QuYnVpbGRDb21tYW5kKG9wdGlvbnMuYnVpbGRDb21tYW5kQXJncykgfSxcbiAgICB7IG5hbWU6IFwicG9zdC1idWlsZFwiLCBjbWQ6IGFydGlmYWN0LnBvc3RCdWlsZENvbW1hbmQ/LigpIH0sXG4gIF0uZmlsdGVyKChzdGVwKSA9PiBzdGVwLmNtZCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGVwcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHN0ZXAgPSBzdGVwc1tpXTtcbiAgICBjb25zdCBpc0xhc3QgPSBpID09PSBzdGVwcy5sZW5ndGggLSAxO1xuXG4gICAgdHJ5IHtcbiAgICAgIGFzc2VydChzdGVwLmNtZCk7XG4gICAgICBwcmludFRhc2tTdGFydChzdGVwLm5hbWUsIHN0ZXAuY21kLCBpc0xhc3QpO1xuICAgICAgYXdhaXQgZXhlY1dpdGhMaW5lUHJlZml4KHN0ZXAuY21kLCB7IGN3ZDogb3B0aW9ucy5jd2QgfSk7XG4gICAgICBwcmludFRhc2tTdWNjZXNzKHN0ZXAubmFtZSwgaXNMYXN0KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHByaW50VGFza0ZhaWxlZChzdGVwLm5hbWUsIGlzTGFzdCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c3RlcC5uYW1lfSBmYWlsZWRgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBwbnBtIHN0YXJ0IO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICog67mM65Oc65CcIO2UhOuhnOygne2KuOulvCDsi6Ttlontlanri4jri6QuXG4gKlxuICog67mM65Oc65CcIOqysOqzvOusvChkaXN0IOuUlOugie2GoOumrOydmCBpbmRleC5qcyDsl5Ttirjrpqztj6zsnbjtirgp7J20IOyXhuuLpOuptCDsi6TtlonsnYQg7KSR64uo7ZWp64uI64ukLlxuICog7IaM7Iqk66e1IOyngOybkOqzvCBkb3RlbnYg7KeA7JuQ7J2EIO2PrO2VqO2VmOyXrCDsi6Ttlontlanri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3RhcnQoKSB7XG4gIGNvbnN0IGFwaVJvb3QgPSBmaW5kQXBpUm9vdFBhdGgoKTtcbiAgY29uc3QgZW50cnlQb2ludCA9IFwiZGlzdC9pbmRleC5qc1wiO1xuXG4gIGlmICghKGF3YWl0IGV4aXN0cyhlbnRyeVBvaW50KSkpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoYCR7ZW50cnlQb2ludH0gbm90IGZvdW5kLiBQbGVhc2UgYnVpbGQgeW91ciBwcm9qZWN0IGZpcnN0LmApKTtcbiAgICBjb25zb2xlLmxvZyhjaGFsay5ibHVlKFwiUnVuOiB5YXJuIHNvbmFtdSBidWlsZFwiKSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgeyBzcGF3biB9ID0gYXdhaXQgaW1wb3J0KFwiY2hpbGRfcHJvY2Vzc1wiKTtcbiAgY29uc3Qgc2VydmVyUHJvY2VzcyA9IHNwYXduKFxuICAgIHByb2Nlc3MuZXhlY1BhdGgsXG4gICAgW1wiLS1lbmFibGUtc291cmNlLW1hcHNcIiwgXCItclwiLCBcImRvdGVudi9jb25maWdcIiwgZW50cnlQb2ludF0sXG4gICAge1xuICAgICAgY3dkOiBhcGlSb290LFxuICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgIH0sXG4gICk7XG5cbiAgcHJvY2Vzcy5vbihcIlNJR0lOVFwiLCAoKSA9PiB7XG4gICAgc2VydmVyUHJvY2Vzcy5raWxsKFwiU0lHVEVSTVwiKTtcbiAgICBwcm9jZXNzLmV4aXQoMCk7XG4gIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cE1pZ3JhdG9yKCkge1xuICAvLyBtaWdyYXRvclxuICBtaWdyYXRvciA9IG5ldyBNaWdyYXRvcigpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXR1cEZpeHR1cmVNYW5hZ2VyKCkge1xuICBGaXh0dXJlTWFuYWdlci5pbml0KCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVfYXBwbHkodGFyZ2V0czogKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdKSB7XG4gIGF3YWl0IHNldHVwTWlncmF0b3IoKTtcbiAgYXdhaXQgbWlncmF0b3IucnVuQWN0aW9uKFwiYXBwbHlcIiwgdGFyZ2V0cyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVfcnVuKCkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG4gIGNvbnN0IGxvY2FsSG9zdHMgPSBbXCJsb2NhbGhvc3RcIiwgXCIxMjcuMC4wLjFcIiwgXCIwLjAuMC4wXCIsIFwiOjoxXCJdO1xuICBjb25zdCB0YXJnZXRzID0gT2JqZWN0LmtleXMoU29uYW11LmRiQ29uZmlnKS5maWx0ZXIoKHRhcmdldCkgPT4ge1xuICAgIGNvbnN0IHRhcmdldENvbmZpZyA9IFNvbmFtdS5kYkNvbmZpZ1t0YXJnZXQgYXMga2V5b2YgU29uYW11REJDb25maWddO1xuICAgIGNvbnN0IGhvc3QgPSAodGFyZ2V0Q29uZmlnPy5jb25uZWN0aW9uIGFzIHsgaG9zdD86IHN0cmluZyB9KT8uaG9zdCA/PyBcImxvY2FsaG9zdFwiO1xuICAgIHJldHVybiBsb2NhbEhvc3RzLmluY2x1ZGVzKGhvc3QudG9Mb3dlckNhc2UoKSk7XG4gIH0pO1xuXG4gIC8vIOuhnOy7rCDrjbDsnbTthLDrsqDsnbTsiqTsl5Ag64yA7ZW07ISc66eMIOyghOyytCDrp4jsnbTqt7jroIjsnbTshZjsl5DshJwg64+Z7J6RXG4gIGF3YWl0IG1pZ3JhdG9yLnJ1bkFjdGlvbihcImFwcGx5XCIsIHRhcmdldHMgYXMgKGtleW9mIFNvbmFtdURCQ29uZmlnKVtdKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWlncmF0ZV9zdGF0dXMoKSB7XG4gIGF3YWl0IHNldHVwTWlncmF0b3IoKTtcblxuICBjb25zdCBzdGF0dXMgPSBhd2FpdCBtaWdyYXRvci5nZXRTdGF0dXMoKTtcbiAgLy8gc3RhdHVzO1xuICBjb25zb2xlLmxvZyhzdGF0dXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX2luaXQoKSB7XG4gIGNvbnN0IHNyY0NvbmZpZyA9IFNvbmFtdS5kYkNvbmZpZy5kZXZlbG9wbWVudF9tYXN0ZXI7XG4gIGNvbnN0IHRhcmdldHMgPSBbXG4gICAge1xuICAgICAgbGFiZWw6IFwiKFJFTU9URSkgRml4dHVyZSBEQlwiLFxuICAgICAgY29uZmlnOiBTb25hbXUuZGJDb25maWcuZml4dHVyZSxcbiAgICB9LFxuICAgIHtcbiAgICAgIGxhYmVsOiBcIihMT0NBTCkgVGVzdGluZyBEQlwiLFxuICAgICAgY29uZmlnOiBTb25hbXUuZGJDb25maWcudGVzdCxcbiAgICAgIHRvU2tpcDogKCgpID0+IHtcbiAgICAgICAgY29uc3QgcmVtb3RlQ29ubiA9IFNvbmFtdS5kYkNvbmZpZy5maXh0dXJlLmNvbm5lY3Rpb24gYXMgS25leC5Db25uZWN0aW9uQ29uZmlnO1xuICAgICAgICBjb25zdCBsb2NhbENvbm4gPSBTb25hbXUuZGJDb25maWcudGVzdC5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgICAgcmV0dXJuIHJlbW90ZUNvbm4uaG9zdCA9PT0gbG9jYWxDb25uLmhvc3QgJiYgcmVtb3RlQ29ubi5kYXRhYmFzZSA9PT0gbG9jYWxDb25uLmRhdGFiYXNlO1xuICAgICAgfSkoKSxcbiAgICB9LFxuICBdIGFzIHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIGNvbmZpZzogS25leC5Db25maWc7XG4gICAgdG9Ta2lwPzogYm9vbGVhbjtcbiAgfVtdO1xuXG4gIC8vIDEuIOq4sOykgERCIOyKpO2CpOuniOulvCDrjaTtlIRcbiAgY29uc29sZS5sb2coXCJEVU1QLi4uXCIpO1xuICBjb25zdCBkdW1wRmlsZW5hbWUgPSBgL3RtcC9zb25hbXUtZml4dHVyZS1pbml0LSR7RGF0ZS5ub3coKX0uc3FsYDtcbiAgY29uc3Qgc3JjQ29ubiA9IHNyY0NvbmZpZy5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZztcbiAgY29uc3QgbWlncmF0aW9uc0R1bXAgPSBgL3RtcC9zb25hbXUtZml4dHVyZS1pbml0LW1pZ3JhdGlvbnMtJHtEYXRlLm5vdygpfS5zcWxgO1xuICBleGVjU3luYyhcbiAgICBgbXlzcWxkdW1wIC1oJHtzcmNDb25uLmhvc3R9IC11JHtzcmNDb25uLnVzZXJ9IC1wJHtzcmNDb25uLnBhc3N3b3JkfSAtLXNpbmdsZS10cmFuc2FjdGlvbiAtZCAtLW5vLWNyZWF0ZS1kYiAtLXRyaWdnZXJzICR7c3JjQ29ubi5kYXRhYmFzZX0gPiAke2R1bXBGaWxlbmFtZX1gLFxuICApO1xuICBjb25zdCBfZGIgPSBrbmV4KHNyY0NvbmZpZyk7XG4gIGNvbnN0IFtbbWlncmF0aW9uc11dID0gYXdhaXQgX2RiLnJhdyhcbiAgICBcIlNFTEVDVCBDT1VOVCgqKSBhcyBjb3VudCBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS50YWJsZXMgV0hFUkUgdGFibGVfc2NoZW1hID0gPyBBTkQgdGFibGVfbmFtZSA9ICdrbmV4X21pZ3JhdGlvbnMnXCIsXG4gICAgW3NyY0Nvbm4uZGF0YWJhc2VdLFxuICApO1xuICBpZiAobWlncmF0aW9ucy5jb3VudCA+IDApIHtcbiAgICBleGVjU3luYyhcbiAgICAgIGBteXNxbGR1bXAgLWgke3NyY0Nvbm4uaG9zdH0gLXUke3NyY0Nvbm4udXNlcn0gLXAke3NyY0Nvbm4ucGFzc3dvcmR9IC0tc2luZ2xlLXRyYW5zYWN0aW9uIC0tbm8tY3JlYXRlLWRiIC0tdHJpZ2dlcnMgJHtzcmNDb25uLmRhdGFiYXNlfSBrbmV4X21pZ3JhdGlvbnMga25leF9taWdyYXRpb25zX2xvY2sgPiAke21pZ3JhdGlvbnNEdW1wfWAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIDIuIOuMgOyDgURCIOqwgeqwgeyXkCDrjIDtlZjsl6wg7KG07J6s7Jes67aAIO2ZleyduCDtm4Qg67aT6riwXG4gIGZvciBhd2FpdCAoY29uc3QgeyBsYWJlbCwgY29uZmlnLCB0b1NraXAgfSBvZiB0YXJnZXRzKSB7XG4gICAgY29uc3QgY29ubiA9IGNvbmZpZy5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZztcblxuICAgIGlmICh0b1NraXAgPT09IHRydWUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnJlZChgJHtsYWJlbH06IFNraXBwZWQhYCkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgZGIgPSBrbmV4KHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgLi4uKChjb25maWcuY29ubmVjdGlvbiA/PyB7fSkgYXMgS25leC5Db25uZWN0aW9uQ29uZmlnKSxcbiAgICAgICAgZGF0YWJhc2U6IHVuZGVmaW5lZCxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgY29uc3QgW1tyb3ddXSA9IGF3YWl0IGRiLnJhdyhgU0hPVyBEQVRBQkFTRVMgTElLRSBcIiR7Y29ubi5kYXRhYmFzZX1cImApO1xuICAgIGlmIChyb3cpIHtcbiAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhgJHtsYWJlbH06IERhdGFiYXNlIFwiJHtjb25uLmRhdGFiYXNlfVwiIEFscmVhZHkgZXhpc3RzYCkpO1xuICAgICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYFNZTkMgdG8gJHtsYWJlbH0uLi5gKTtcbiAgICBjb25zdCBteXNxbENtZCA9IGBteXNxbCAtaCR7Y29ubi5ob3N0fSAtdSR7Y29ubi51c2VyfSAtcCR7Y29ubi5wYXNzd29yZH1gO1xuICAgIGV4ZWNTeW5jKGAke215c3FsQ21kfSAtZSAnRFJPUCBEQVRBQkFTRSBJRiBFWElTVFMgXFxgJHtjb25uLmRhdGFiYXNlfVxcYCdgKTtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gLWUgJ0NSRUFURSBEQVRBQkFTRSBcXGAke2Nvbm4uZGF0YWJhc2V9XFxgJ2ApO1xuICAgIGV4ZWNTeW5jKGAke215c3FsQ21kfSAke2Nvbm4uZGF0YWJhc2V9IDwgJHtkdW1wRmlsZW5hbWV9YCk7XG4gICAgaWYgKGF3YWl0IGV4aXN0cyhtaWdyYXRpb25zRHVtcCkpIHtcbiAgICAgIGV4ZWNTeW5jKGAke215c3FsQ21kfSAke2Nvbm4uZGF0YWJhc2V9IDwgJHttaWdyYXRpb25zRHVtcH1gKTtcbiAgICB9XG5cbiAgICBhd2FpdCBkYi5kZXN0cm95KCk7XG4gIH1cblxuICBhd2FpdCBfZGIuZGVzdHJveSgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX2ltcG9ydChlbnRpdHlJZDogc3RyaW5nLCByZWNvcmRJZHM6IG51bWJlcltdKSB7XG4gIGF3YWl0IHNldHVwRml4dHVyZU1hbmFnZXIoKTtcblxuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5pbXBvcnRGaXh0dXJlKGVudGl0eUlkLCByZWNvcmRJZHMpO1xuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5zeW5jKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGZpeHR1cmVfc3luYygpIHtcbiAgYXdhaXQgc2V0dXBGaXh0dXJlTWFuYWdlcigpO1xuXG4gIGF3YWl0IEZpeHR1cmVNYW5hZ2VyLnN5bmMoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3R1Yl9wcmFjdGljZShuYW1lOiBzdHJpbmcpIHtcbiAgY29uc3QgcHJhY3RpY2VEaXIgPSBwYXRoLmpvaW4oU29uYW11LmFwaVJvb3RQYXRoLCBcInNyY1wiLCBcInByYWN0aWNlc1wiKTtcbiAgY29uc3QgZmlsZU5hbWVzID0gYXdhaXQgcmVhZGRpcihwcmFjdGljZURpcik7XG5cbiAgY29uc3QgbWF4U2VxTm8gPSBhd2FpdCAoYXN5bmMgKCkgPT4ge1xuICAgIGlmICghKGF3YWl0IGV4aXN0cyhwcmFjdGljZURpcikpKSB7XG4gICAgICBhd2FpdCBta2RpcihwcmFjdGljZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZmlsdGVyZWRTZXFzID0gZmlsZU5hbWVzXG4gICAgICAuZmlsdGVyKChmaWxlTmFtZSkgPT4gZmlsZU5hbWUuc3RhcnRzV2l0aChcInBcIikgJiYgZmlsZU5hbWUuZW5kc1dpdGgoXCIudHNcIikpXG4gICAgICAubWFwKChmaWxlTmFtZSkgPT4ge1xuICAgICAgICBjb25zdCBbLCBzZXFOb10gPSBmaWxlTmFtZS5tYXRjaCgvXnAoWzAtOV0rKS0vKSA/PyBbXCIwXCIsIFwiMFwiXTtcbiAgICAgICAgcmV0dXJuIHBhcnNlSW50KHNlcU5vKTtcbiAgICAgIH0pXG4gICAgICAuc29ydCgoYSwgYikgPT4gYiAtIGEpO1xuXG4gICAgaWYgKGZpbHRlcmVkU2Vxcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gZmlsdGVyZWRTZXFzWzBdO1xuICAgIH1cblxuICAgIHJldHVybiAwO1xuICB9KSgpO1xuXG4gIGNvbnN0IGN1cnJlbnRTZXFObyA9IG1heFNlcU5vICsgMTtcbiAgY29uc3QgZmlsZU5hbWUgPSBgcCR7Y3VycmVudFNlcU5vfS0ke25hbWV9LnRzYDtcbiAgY29uc3QgZHN0UGF0aCA9IHBhdGguam9pbihwcmFjdGljZURpciwgZmlsZU5hbWUpO1xuXG4gIGNvbnN0IGNvZGUgPSBbXG4gICAgYGltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCJzb25hbXVcIjtgLFxuICAgIFwiXCIsXG4gICAgYGNvbnNvbGUuY2xlYXIoKTtgLFxuICAgIGBjb25zb2xlLmxvZyhcIiR7ZmlsZU5hbWV9XCIpO2AsXG4gICAgXCJcIixcbiAgICBgU29uYW11LnJ1blNjcmlwdChhc3luYyAoKSA9PiB7YCxcbiAgICBgIC8vIFRPRE9gLFxuICAgIGB9KTtgLFxuICAgIFwiXCIsXG4gIF0uam9pbihcIlxcblwiKTtcbiAgYXdhaXQgd3JpdGVGaWxlKGRzdFBhdGgsIGNvZGUpO1xuXG4gIGV4ZWNTeW5jKGBjb2RlICR7ZHN0UGF0aH1gKTtcblxuICBjb25zdCBydW5Db2RlID0gYHlhcm4gbm9kZSAtciBkb3RlbnYvY29uZmlnIC0tZW5hYmxlLXNvdXJjZS1tYXBzIGRpc3QvcHJhY3RpY2VzLyR7ZmlsZU5hbWUucmVwbGFjZShcbiAgICBcIi50c1wiLFxuICAgIFwiLmpzXCIsXG4gICl9YDtcbiAgY29uc29sZS5sb2coYCR7Y2hhbGsuYmx1ZShydW5Db2RlKX0gY29waWVkIHRvIGNsaXBib2FyZC5gKTtcbiAgZXhlY1N5bmMoYGVjaG8gXCIke3J1bkNvZGV9XCIgfCBwYmNvcHlgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc3R1Yl9lbnRpdHkoZW50aXR5SWQ6IHN0cmluZykge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLmNyZWF0ZUVudGl0eSh7IGVudGl0eUlkLCB0aXRsZTogZW50aXR5SWQgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkX21vZGVsKGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5nZW5lcmF0ZVRlbXBsYXRlKFwibW9kZWxcIiwge1xuICAgIGVudGl0eUlkLFxuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2NhZmZvbGRfbW9kZWxfdGVzdChlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcIm1vZGVsX3Rlc3RcIiwge1xuICAgIGVudGl0eUlkLFxuICB9KTtcbn1cbiJdLCJuYW1lcyI6WyJjaGFsayIsImRvdGVudiIsImNvbmZpZyIsImFzc2VydCIsImV4ZWNTeW5jIiwic3Bhd24iLCJta2RpciIsInJlYWRkaXIiLCJ3cml0ZUZpbGUiLCJrbmV4IiwiY3JlYXRlUmVxdWlyZSIsInBhdGgiLCJwcm9jZXNzIiwidHNpY2xpIiwiU29uYW11IiwiRW50aXR5TWFuYWdlciIsIk1pZ3JhdG9yIiwiRml4dHVyZU1hbmFnZXIiLCJleGVjV2l0aExpbmVQcmVmaXgiLCJwcmludEJ1aWxkU3VtbWFyeSIsInByaW50VGFza0ZhaWxlZCIsInByaW50VGFza0hlYWRlciIsInByaW50VGFza1N0YXJ0IiwicHJpbnRUYXNrU3VjY2VzcyIsImV4aXN0cyIsImZpbmRBcGlSb290UGF0aCIsImZpbmRBcHBSb290UGF0aCIsIkFQSV9BUlRJRkFDVFMiLCJXRUJfQVJUSUZBQ1RTIiwibWlncmF0b3IiLCJib290c3RyYXAiLCJub3RUb0luaXQiLCJpbmNsdWRlcyIsImFyZ3YiLCJpbml0IiwidHlwZXMiLCJ0eXBlIiwibmFtZSIsIm1lc3NhZ2UiLCJjaG9pY2VzIiwiZ2V0QWxsUGFyZW50SWRzIiwibWFwIiwiZW50aXR5SWQiLCJ0aXRsZSIsInZhbHVlIiwiYXJncyIsInJ1bm5lcnMiLCJtaWdyYXRlX3N0YXR1cyIsIm1pZ3JhdGVfcnVuIiwibWlncmF0ZV9hcHBseSIsImZpeHR1cmVfaW5pdCIsImZpeHR1cmVfaW1wb3J0IiwiZml4dHVyZV9zeW5jIiwic3R1Yl9wcmFjdGljZSIsInN0dWJfZW50aXR5Iiwic2NhZmZvbGRfbW9kZWwiLCJzY2FmZm9sZF9tb2RlbF90ZXN0Iiwic3luYyIsImRldiIsImJ1aWxkIiwic3RhcnQiLCJkZXN0cm95IiwiZmluYWxseSIsInN5bmNlciIsImFwaVJvb3QiLCJlbnRyeVBvaW50IiwiY29uc29sZSIsImxvZyIsInllbGxvdyIsImJvbGQiLCJob3RSdW5uZXJCaW5QYXRoIiwidXJsIiwicmVzb2x2ZSIsInNlcnZlclByb2Nlc3MiLCJleGVjUGF0aCIsImpvaW4iLCJjd2QiLCJzdGRpbyIsImVudiIsIk5PREVfRU5WIiwiSE9UIiwiQVBJX1JPT1RfUEFUSCIsImNsZWFudXAiLCJraWxsIiwiZXhpdCIsIm9uIiwiY29kZSIsImVycm9yIiwicmVkIiwiYXBwUm9vdCIsInN3Y0ZpbGVQYXRoIiwiZGltIiwiZGlybmFtZSIsImFwaVN0YXJ0ZWRBdCIsIkRhdGUiLCJub3ciLCJhcnRpZmFjdCIsInByb2plY3RQYXRoIiwiZGVzY3JpcHRpb24iLCJydW5CdWlsZFN0ZXBzIiwiYnVpbGRDb21tYW5kQXJncyIsImNvbmZpZ0ZpbGVQYXRoIiwid2ViU3RhcnRlZEF0Iiwib3B0aW9ucyIsInN0ZXBzIiwiY21kIiwicHJlQnVpbGRDb21tYW5kIiwiYnVpbGRDb21tYW5kIiwicG9zdEJ1aWxkQ29tbWFuZCIsImZpbHRlciIsInN0ZXAiLCJpIiwibGVuZ3RoIiwiaXNMYXN0IiwiRXJyb3IiLCJibHVlIiwic2V0dXBNaWdyYXRvciIsInNldHVwRml4dHVyZU1hbmFnZXIiLCJ0YXJnZXRzIiwicnVuQWN0aW9uIiwibG9jYWxIb3N0cyIsIk9iamVjdCIsImtleXMiLCJkYkNvbmZpZyIsInRhcmdldCIsInRhcmdldENvbmZpZyIsImhvc3QiLCJjb25uZWN0aW9uIiwidG9Mb3dlckNhc2UiLCJzdGF0dXMiLCJnZXRTdGF0dXMiLCJzcmNDb25maWciLCJkZXZlbG9wbWVudF9tYXN0ZXIiLCJsYWJlbCIsImZpeHR1cmUiLCJ0ZXN0IiwidG9Ta2lwIiwicmVtb3RlQ29ubiIsImxvY2FsQ29ubiIsImRhdGFiYXNlIiwiZHVtcEZpbGVuYW1lIiwic3JjQ29ubiIsIm1pZ3JhdGlvbnNEdW1wIiwidXNlciIsInBhc3N3b3JkIiwiX2RiIiwibWlncmF0aW9ucyIsInJhdyIsImNvdW50IiwiY29ubiIsImRiIiwidW5kZWZpbmVkIiwicm93IiwibXlzcWxDbWQiLCJyZWNvcmRJZHMiLCJpbXBvcnRGaXh0dXJlIiwicHJhY3RpY2VEaXIiLCJhcGlSb290UGF0aCIsImZpbGVOYW1lcyIsIm1heFNlcU5vIiwicmVjdXJzaXZlIiwiZmlsdGVyZWRTZXFzIiwiZmlsZU5hbWUiLCJzdGFydHNXaXRoIiwiZW5kc1dpdGgiLCJzZXFObyIsIm1hdGNoIiwicGFyc2VJbnQiLCJzb3J0IiwiYSIsImIiLCJjdXJyZW50U2VxTm8iLCJkc3RQYXRoIiwicnVuQ29kZSIsInJlcGxhY2UiLCJjcmVhdGVFbnRpdHkiLCJnZW5lcmF0ZVRlbXBsYXRlIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFXLFFBQVE7QUFDMUIsT0FBT0MsWUFBWSxTQUFTO0FBRTVCQSxPQUFPQyxNQUFNO0FBRWIsT0FBT0MsWUFBWSxTQUFTO0FBQzVCLFNBQVNDLFFBQVEsRUFBRUMsS0FBSyxRQUFRLGdCQUFnQjtBQUNoRCxTQUFTQyxLQUFLLEVBQUVDLE9BQU8sRUFBRUMsU0FBUyxRQUFRLG1CQUFjO0FBQ3hELE9BQU9DLFVBQXlCLE9BQU87QUFDdkMsU0FBU0MsYUFBYSxRQUFRLFNBQVM7QUFDdkMsT0FBT0MsVUFBVSxPQUFPO0FBQ3hCLE9BQU9DLGFBQWEsVUFBVTtBQUM5QixTQUFTQyxNQUFNLFFBQVEsU0FBUztBQUNoQyxTQUFTQyxNQUFNLFFBQVEsa0JBQVM7QUFFaEMsU0FBU0MsYUFBYSxRQUFRLDhC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
|
|
648
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCBkb3RlbnYgZnJvbSBcImRvdGVudlwiO1xuXG5kb3RlbnYuY29uZmlnKCk7XG5cbmltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiO1xuaW1wb3J0IHsgZXhlY1N5bmMsIHNwYXduIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IGNwLCBta2RpciwgcmVhZGRpciwgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gXCJmcy9wcm9taXNlc1wiO1xuaW1wb3J0IGtuZXgsIHsgdHlwZSBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibW9kdWxlXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHByb2Nlc3MgZnJvbSBcInByb2Nlc3NcIjtcbmltcG9ydCB7IHRzaWNsaSB9IGZyb20gXCJ0c2ljbGlcIjtcbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCIuLi9hcGlcIjtcbmltcG9ydCB0eXBlIHsgU29uYW11REJDb25maWcgfSBmcm9tIFwiLi4vZGF0YWJhc2UvZGJcIjtcbmltcG9ydCB7IEVudGl0eU1hbmFnZXIgfSBmcm9tIFwiLi4vZW50aXR5L2VudGl0eS1tYW5hZ2VyXCI7XG5pbXBvcnQgeyBNaWdyYXRvciB9IGZyb20gXCIuLi9taWdyYXRpb24vbWlncmF0b3JcIjtcbmltcG9ydCB7IEZpeHR1cmVNYW5hZ2VyIH0gZnJvbSBcIi4uL3Rlc3RpbmcvZml4dHVyZS1tYW5hZ2VyXCI7XG5pbXBvcnQge1xuICBleGVjV2l0aExpbmVQcmVmaXgsXG4gIHByaW50QnVpbGRTdW1tYXJ5LFxuICBwcmludFRhc2tGYWlsZWQsXG4gIHByaW50VGFza0hlYWRlcixcbiAgcHJpbnRUYXNrU3RhcnQsXG4gIHByaW50VGFza1N1Y2Nlc3MsXG59IGZyb20gXCIuLi91dGlscy9jb25zb2xlLXV0aWxcIjtcbmltcG9ydCB7IGV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlsc1wiO1xuaW1wb3J0IHsgZmluZEFwaVJvb3RQYXRoLCBmaW5kQXBwUm9vdFBhdGggfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB7IEFQSV9BUlRJRkFDVFMsIHR5cGUgQnVpbGRBcnRpZmFjdCwgV0VCX0FSVElGQUNUUyB9IGZyb20gXCIuL2J1aWxkLWNvbmZpZ1wiO1xuXG5sZXQgbWlncmF0b3I6IE1pZ3JhdG9yO1xuXG5hc3luYyBmdW5jdGlvbiBib290c3RyYXAoKSB7XG4gIGNvbnN0IG5vdFRvSW5pdCA9IFtcImRldlwiLCBcImJ1aWxkXCIsIFwic3RhcnRcIiwgXCJza2lsbHNcIl0uaW5jbHVkZXMocHJvY2Vzcy5hcmd2WzJdID8/IFwiXCIpO1xuICBpZiAoIW5vdFRvSW5pdCkge1xuICAgIGF3YWl0IFNvbmFtdS5pbml0KGZhbHNlLCBmYWxzZSk7XG4gIH1cblxuICB0cnkge1xuICAgIGF3YWl0IHRzaWNsaShwcm9jZXNzLmFyZ3YsIHtcbiAgICAgIHR5cGVzOiB7XG4gICAgICAgIFwiI2VudGl0eUlkXCI6IHtcbiAgICAgICAgICB0eXBlOiBcImF1dG9jb21wbGV0ZVwiLFxuICAgICAgICAgIG5hbWU6IFwiI2VudGl0eUlkXCIsXG4gICAgICAgICAgbWVzc2FnZTogXCJQbGVhc2UgaW5wdXQgI2VudGl0eUlkXCIsXG4gICAgICAgICAgY2hvaWNlczogRW50aXR5TWFuYWdlci5nZXRBbGxQYXJlbnRJZHMoKS5tYXAoKGVudGl0eUlkKSA9PiAoe1xuICAgICAgICAgICAgdGl0bGU6IGVudGl0eUlkLFxuICAgICAgICAgICAgdmFsdWU6IGVudGl0eUlkLFxuICAgICAgICAgIH0pKSxcbiAgICAgICAgfSxcbiAgICAgICAgXCIjcmVjb3JkSWRzXCI6IFwibnVtYmVyW11cIixcbiAgICAgICAgXCIjbmFtZVwiOiBcInN0cmluZ1wiLFxuICAgICAgICBcIiN0YXJnZXRzXCI6IHtcbiAgICAgICAgICB0eXBlOiBcIm11bHRpc2VsZWN0XCIsXG4gICAgICAgICAgbmFtZTogXCIjdGFyZ2V0c1wiLFxuICAgICAgICAgIG1lc3NhZ2U6IFwiUGxlYXNlIGlucHV0ICN0YXJnZXRzXCIsXG4gICAgICAgICAgY2hvaWNlczogW1xuICAgICAgICAgICAgeyB0aXRsZTogXCJEZXZlbG9wbWVudFwiLCB2YWx1ZTogXCJkZXZlbG9wbWVudF9tYXN0ZXJcIiB9LFxuICAgICAgICAgICAgeyB0aXRsZTogXCJQcm9kdWN0aW9uXCIsIHZhbHVlOiBcInByb2R1Y3Rpb25fbWFzdGVyXCIgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiRml4dHVyZVwiLCB2YWx1ZTogXCJmaXh0dXJlXCIgfSxcbiAgICAgICAgICAgIHsgdGl0bGU6IFwiVGVzdFwiLCB2YWx1ZTogXCJ0ZXN0XCIgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFyZ3M6IFtcbiAgICAgICAgW1wiZml4dHVyZVwiLCBcImluaXRcIl0sXG4gICAgICAgIFtcImZpeHR1cmVcIiwgXCJpbXBvcnRcIiwgXCIjZW50aXR5SWRcIiwgXCIjcmVjb3JkSWRzXCJdLFxuICAgICAgICBbXCJmaXh0dXJlXCIsIFwic3luY1wiXSxcbiAgICAgICAgW1wibWlncmF0ZVwiLCBcInJ1blwiXSxcbiAgICAgICAgW1wibWlncmF0ZVwiLCBcImFwcGx5XCIsIFwiI3RhcmdldHNcIl0sXG4gICAgICAgIFtcIm1pZ3JhdGVcIiwgXCJzdGF0dXNcIl0sXG4gICAgICAgIFtcInN0dWJcIiwgXCJwcmFjdGljZVwiLCBcIiNuYW1lXCJdLFxuICAgICAgICBbXCJzdHViXCIsIFwiZW50aXR5XCIsIFwiI25hbWVcIl0sXG4gICAgICAgIFtcInNjYWZmb2xkXCIsIFwibW9kZWxcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcInNjYWZmb2xkXCIsIFwibW9kZWxfdGVzdFwiLCBcIiNlbnRpdHlJZFwiXSxcbiAgICAgICAgW1wic2NhZmZvbGRcIiwgXCJ2aWV3X2xpc3RcIiwgXCIjZW50aXR5SWRcIl0sXG4gICAgICAgIFtcInNjYWZmb2xkXCIsIFwidmlld19mb3JtXCIsIFwiI2VudGl0eUlkXCJdLFxuICAgICAgICBbXCJzeW5jXCJdLFxuICAgICAgICBbXCJkZXZcIl0sXG4gICAgICAgIFtcImJ1aWxkXCJdLFxuICAgICAgICBbXCJzdGFydFwiXSxcbiAgICAgICAgW1wic2tpbGxzXCIsIFwic3luY1wiXSxcbiAgICAgICAgW1wic2tpbGxzXCIsIFwiY3JlYXRlXCIsIFwiI25hbWVcIl0sXG4gICAgICBdLFxuICAgICAgcnVubmVyczoge1xuICAgICAgICBtaWdyYXRlX3N0YXR1cyxcbiAgICAgICAgbWlncmF0ZV9ydW4sXG4gICAgICAgIG1pZ3JhdGVfYXBwbHksXG4gICAgICAgIGZpeHR1cmVfaW5pdCxcbiAgICAgICAgZml4dHVyZV9pbXBvcnQsXG4gICAgICAgIGZpeHR1cmVfc3luYyxcbiAgICAgICAgc3R1Yl9wcmFjdGljZSxcbiAgICAgICAgc3R1Yl9lbnRpdHksXG4gICAgICAgIHNjYWZmb2xkX21vZGVsLFxuICAgICAgICBzY2FmZm9sZF9tb2RlbF90ZXN0LFxuICAgICAgICAvLyBzY2FmZm9sZF92aWV3X2xpc3QsXG4gICAgICAgIC8vIHNjYWZmb2xkX3ZpZXdfZm9ybSxcbiAgICAgICAgc3luYyxcbiAgICAgICAgZGV2LFxuICAgICAgICBidWlsZCxcbiAgICAgICAgc3RhcnQsXG4gICAgICAgIHNraWxsc19zeW5jLFxuICAgICAgICBza2lsbHNfY3JlYXRlLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBTb25hbXUuZGVzdHJveSgpO1xuICB9XG59XG5cbmJvb3RzdHJhcCgpLmZpbmFsbHkoYXN5bmMgKCkgPT4ge1xuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5kZXN0cm95KCk7XG59KTtcblxuLyoqXG4gKiBwbnBtIHN5bmMg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDtlITroZzsoJ3tirjrpbwg7Iux7YGs7ZWp64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBzeW5jKCkge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLnN5bmMoKTtcbn1cblxuLyoqXG4gKiBwbnBtIGRldiDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIO2UhOuhnOygne2KuOyXkCDrjIDtlbQgSE1SIOyngOybkO2VmOuKlCDqsJzrsJwg7ISc67KE66W8IOudhOybjOykjeuLiOuLpC5cbiAqXG4gKiBUeXBlU2NyaXB066W8IOuwlOuhnCDsi6TtlontlaAg7IiYIOyeiOuPhOuhnSBAc29uYW11LWtpdC90cy1sb2FkZXLrpbwsXG4gKiBITVLsnYQg7KeA7JuQ7ZWY6riwIOychO2VtCBAc29uYW11LWtpdC9obXItaG9va+ydhCBpbXBvcnTtlZjrqbAsXG4gKiDshozsiqTrp7Ug7KeA7JuQ7J2EIOychO2VtCAtLWVuYWJsZS1zb3VyY2UtbWFwcyDtlIzrnpjqt7jrpbwg7Y+s7ZWo7ZWY7JesIOyLpO2Wie2VqeuLiOuLpC5cbiAqXG4gKiDsnbTrlYwgQHNvbmFtdS1raXQvdHMtbG9hZGVy7JmAIEBzb25hbXUta2l0L2htci1ob29r64qUIHNvbmFtdeqwgCDsnpDssrTsoIHsnLzroZwg6rCA7KeA6rOgIOyeiOuKlCBkZXBlbmRlbmN57J6F64uI64ukLlxuICog65iQ7ZWcIOyLpO2WieyXkCDsgqzsmqntlZjripQgQHNvbmFtdS1raXQvaG1yLXJ1bm5lcuuPhCDrp4jssKzqsIDsp4DroZwgc29uYW116rCAIOyekOyytOyggeycvOuhnCDqsIDsp4Dqs6Ag7J6I64qUIGRlcGVuZGVuY3nsnoXri4jri6QuXG4gKiDrlLDrnbzshJwg7IKs7Jqp7J6QIO2UhOuhnOygne2KuOyXkOyEnOuKlCDsnbQg7IS4IO2MqO2CpOyngOulvCDsp4HsoJEg7ISk7LmY7ZWgIO2VhOyalOqwgCDsl4bsirXri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGV2KCkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBcInNyYy9pbmRleC50c1wiO1xuXG4gIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdy5ib2xkKFwi8J+agCBTdGFydGluZyBTb25hbXUgZGV2IHNlcnZlci4uLlxcblwiKSk7XG5cbiAgLy8g7J20IHNvbmFtdSDtjKjtgqTsp4DqsIAgZGVwZW5kZW5jaWVz66GcIOqwgOyngOqzoCDsnojripQgQHNvbmFtdS1raXQvaG1yLXJ1bm5lcuydmCBiaW4vcnVuLmpz66W8IOyCrOyaqe2VqeuLiOuLpC5cbiAgLy8g7J20IOqyveuhnCgvYmluL3J1bi5qcynripQgQHNvbmFtdS1raXQvaG1yLXJ1bm5lcuydmCBwYWNrYWdlLmpzb27snZggYmluIO2VhOuTnOyXkCDrqoXsi5zrkJjslrQg7J6I64qUIOq3uOqyg+qzvCDqsJnsirXri4jri6QuXG4gIGNvbnN0IGhvdFJ1bm5lckJpblBhdGggPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCkucmVzb2x2ZShcbiAgICBcIkBzb25hbXUta2l0L2htci1ydW5uZXIvYmluL3J1bi5qc1wiLFxuICApO1xuXG4gIGNvbnN0IHNlcnZlclByb2Nlc3MgPSBzcGF3bihcbiAgICBwcm9jZXNzLmV4ZWNQYXRoLCAvLyBub2RlXG4gICAgW1xuICAgICAgaG90UnVubmVyQmluUGF0aCwgLy8g7J2066CH6rKMIO2VtOyEnCBob3QtcnVubmVy66W8IOyLpO2Wie2VmOq1rOyalFxuICAgICAgXCItLWNsZWFyLXNjcmVlbj1mYWxzZVwiLCAvLyDsnbTtlZggaG90LXJ1bm5lcuyXkOqyjCDrhJjqsqjspIQg7J247J6Q65Ok7J6F64uI64ukLlxuICAgICAgXCItLW5vZGUtYXJncz0tLWltcG9ydD1zb25hbXUvdHMtbG9hZGVyLXJlZ2lzdGVyXCIsIC8vIFR5cGVTY3JpcHQg7ISc7Y+s7Yq466W8IOychO2VnCDroZzrjZQsXG4gICAgICBcIi0tbm9kZS1hcmdzPS0taW1wb3J0PXNvbmFtdS9obXItaG9vay1yZWdpc3RlclwiLCAvLyBITVLsnYQg7KeA7JuQ7ZWY6riwIOychO2VnCBob29rLFxuICAgICAgXCItLW5vZGUtYXJncz0tLWVuYWJsZS1zb3VyY2UtbWFwc1wiLCAvLyDqt7jrpqzqs6Ag7IaM7Iqk66e1IOyngOybkOydhCDsnITtlZwg7ZSM656Y6re47J6F64uI64ukLlxuICAgICAgXCItLW9uLWtleT1yOnJlc3RhcnQ6UmVzdGFydCBzZXJ2ZXJcIiwgLy8gciDriITrpbTrqbQg7ISc67KEIOyerOyLnOyeke2VmOqyjCDtlbTspJjsmpQuXG4gICAgICBgLS1vbi1rZXk9ZjpzaGVsbChybSAke3BhdGguam9pbihhcGlSb290LCBcInNvbmFtdS5sb2NrXCIpfSk6cmVzdGFydDpGb3JjZSByZXN0YXJ0YCwgLy8gZiDriITrpbTrqbQgc29uYW11LmxvY2sg7YyM7J287J2EIOyngOyasOqzoCDshJzrsoQg7J6s7Iuc7J6R7ZWY6rKMIO2VtOykmOyalC5cblxuICAgICAgXCItLW9uLWtleT1lbnRlcjpzaGVsbChlY2hvIGhpKTpLZXkgYmluZGluZyB0ZXN0XCIsIC8vIGVudGVy66W8IGtleeuhnCDsk7gg7IiYIOyeiOydjOydhCDrs7TsnbTquLAg7JyE7ZWcIO2FjOyKpO2KuOyeheuLiOuLpC5cbiAgICAgIFwiLS1vbi1rZXk9Y3RybCtmIGN0cmwrZjpzaGVsbChnaXQgcHVsbCAmJiBwbnBtIGluc3RhbGwgJiYgcG5wbSAtLWZpbHRlciBzb25hbXUgYnVpbGQgJiYgZWNobyAnU29uYW11IGlzIG5vdyB1cC10by1kYXRlIScpOnJlc3RhcnQ6UHVsbCAmIGluc3RhbGwgJiBidWlsZCAmIHJlc3RhcnRcIiwgLy8gbW9kaWZpZXLsmYDsnZgg7KGw7ZWpLCDqt7jrpqzqs6Ag65GQIOqwnOydmCBjaG9yZOulvCDsgqzsmqntlaAg7IiYIOyeiOydjOydhCDrs7TsnbTquLAg7JyE7ZWcIO2FjOyKpO2KuOyeheuLiOuLpC5cbiAgICAgIGVudHJ5UG9pbnQsIC8vIOuniOyngOunieycvOuhnCDsi6TsoJwg7Iuk7ZaJ7ZWgIOyKpO2BrOumve2KuOydmCDqsr3roZzrpbwg64SY6rKo7KSN64uI64ukLlxuICAgIF0sXG4gICAge1xuICAgICAgY3dkOiBhcGlSb290LFxuICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgICAgZW52OiB7XG4gICAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgICBOT0RFX0VOVjogXCJkZXZlbG9wbWVudFwiLFxuICAgICAgICBIT1Q6IFwieWVzXCIsIC8vIOyWmOqwgCDsnojslrTslbwgSE1S7J20IO2ZnOyEse2ZlOuQqeuLiOuLpC5cbiAgICAgICAgQVBJX1JPT1RfUEFUSDogYXBpUm9vdCwgLy8g7J20IOqyveuhnOqwgCBobXItaG9va+ydmCDro6jtirgg65SU66CJ7Yag66as6rCAIOuQqeuLiOuLpC5cbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcblxuICAvLyDsooXro4wg7LKY66asXG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwiXFxuXFxu8J+RiyBTaHV0dGluZyBkb3duLi4uXCIpKTtcbiAgICBzZXJ2ZXJQcm9jZXNzLmtpbGwoXCJTSUdURVJNXCIpO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfTtcblxuICBwcm9jZXNzLm9uKFwiU0lHSU5UXCIsIGNsZWFudXApO1xuICBwcm9jZXNzLm9uKFwiU0lHVEVSTVwiLCBjbGVhbnVwKTtcblxuICBzZXJ2ZXJQcm9jZXNzLm9uKFwiZXhpdFwiLCAoY29kZSkgPT4ge1xuICAgIGlmIChjb2RlICE9PSAwKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGNoYWxrLnJlZChg4p2MIFNlcnZlciBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX1gKSk7XG4gICAgICBwcm9jZXNzLmV4aXQoY29kZSB8fCAxKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIHBucG0gYnVpbGQg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDtlITroZzsoJ3tirjrpbwg67mM65Oc7ZWp64uI64ukLlxuICpcbiAqIOu5jOuTnOyXkCDtlYTsmpTtlZwgLnN3Y3Jj64qUIO2UhOuhnOygne2KuCDro6jtirjsl5DshJwg7LC+6rOgLCDsl4bsnLzrqbQgc29uYW116rCAIOq0gOumrO2VmOuKlCAuc3djcmMucHJvamVjdC1kZWZhdWx066W8IOyCrOyaqe2VqeuLiOuLpC5cbiAqXG4gKiDsi6TsoJwg67mM65OcIO2DgOqynyjslYTti7DtjKntirgp6rO8IOuPmeyekeydgCBidWlsZC1jb25maWcudHPsl5Ag7KCV7J2Y65CY7Ja0IOyeiOyKteuLiOuLpC5cbiAqIOydtCDtlajsiJjripQgYnVpbGQtY29uZmlnLnRz7JeQIOygleydmOuQnCDrj5nsnpHrk6TsnYQg7Iuk7ZaJ7ZW07KO864qUIOyXre2VoOunjCDtlanri4jri6QuXG4gKlxuICogU29uYW11LmluaXQg7JeG7J20IO2YuOy2nOuQoCDqsoPsnYQg7IOB7KCV7ZWY7JesIOq1rO2YhOuQmOyXiOyKteuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYnVpbGQoKSB7XG4gIGNvbnN0IGFwcFJvb3QgPSBmaW5kQXBwUm9vdFBhdGgoKTtcblxuICAvLyAuc3djcmMg7YyM7J287J2EIOyngOygle2VqeuLiOuLpC5cbiAgbGV0IHN3Y0ZpbGVQYXRoID0gXCIuc3djcmNcIjtcbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKHN3Y0ZpbGVQYXRoKSkge1xuICAgICAgLy8g7IKs7Jqp7J6QIO2UhOuhnOygne2KuOyXkCAuc3djcmPqsIAg7J6I7Jy866m0IOyasOyEoOycvOuhnCDsgqzsmqntlanri4jri6QuXG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCJVc2luZyAuc3djcmMgZnJvbSBwcm9qZWN0IHJvb3QuLi5cIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyDslYTri4jrnbzrqbQgc29uYW116rCAIOq0gOumrO2VmOuKlCAuc3djcmMucHJvamVjdC1kZWZhdWx066W8IOqwgOyguOuLpCDslIHri4jri6QuXG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5kaW0oXCJVc2luZyBkZWZhdWx0IC5zd2NyYyBmcm9tIHNvbmFtdSBwYWNrYWdlLi4uXCIpKTtcbiAgICAgIHN3Y0ZpbGVQYXRoID0gcGF0aC5qb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi5cIiwgXCIuLlwiLCBcIi5zd2NyYy5wcm9qZWN0LWRlZmF1bHRcIik7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnNvbGUuZXJyb3IoY2hhbGsucmVkKFwiU2V0dGluZyB1cCBzd2MgY29uZmlnIGZpbGUgZmFpbGVkLlwiKSwgZXJyb3IpO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIEFQSSDtlITroZzsoJ3tirjrpbwg67mM65Oc7ZWp64uI64ukLlxuICBjb25zdCBhcGlTdGFydGVkQXQgPSBEYXRlLm5vdygpO1xuICB0cnkge1xuICAgIGZvciAoY29uc3QgYXJ0aWZhY3Qgb2YgQVBJX0FSVElGQUNUUykge1xuICAgICAgY29uc3QgY3dkID0gcGF0aC5qb2luKGFwcFJvb3QsIGFydGlmYWN0LnByb2plY3RQYXRoKTtcbiAgICAgIHByaW50VGFza0hlYWRlcihhcnRpZmFjdC5uYW1lLCBhcnRpZmFjdC5kZXNjcmlwdGlvbiwgY3dkKTtcblxuICAgICAgYXdhaXQgcnVuQnVpbGRTdGVwcyhhcnRpZmFjdCwgeyBjd2QsIGJ1aWxkQ29tbWFuZEFyZ3M6IHsgY29uZmlnRmlsZVBhdGg6IHN3Y0ZpbGVQYXRoIH0gfSk7XG4gICAgfVxuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiQVBJXCIsIHRydWUsIERhdGUubm93KCkgLSBhcGlTdGFydGVkQXQpO1xuICB9IGNhdGNoIHtcbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIkFQSVwiLCBmYWxzZSwgRGF0ZS5ub3coKSAtIGFwaVN0YXJ0ZWRBdCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgLy8gV2ViIO2UhOuhnOygne2KuOulvCDruYzrk5ztlanri4jri6QuXG4gIGNvbnN0IHdlYlN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBhcnRpZmFjdCBvZiBXRUJfQVJUSUZBQ1RTKSB7XG4gICAgICBjb25zdCBjd2QgPSBwYXRoLmpvaW4oYXBwUm9vdCwgYXJ0aWZhY3QucHJvamVjdFBhdGgpO1xuICAgICAgcHJpbnRUYXNrSGVhZGVyKGFydGlmYWN0Lm5hbWUsIGFydGlmYWN0LmRlc2NyaXB0aW9uLCBjd2QpO1xuXG4gICAgICBhd2FpdCBydW5CdWlsZFN0ZXBzKGFydGlmYWN0LCB7IGN3ZCwgYnVpbGRDb21tYW5kQXJnczoge30gfSk7XG4gICAgfVxuICAgIHByaW50QnVpbGRTdW1tYXJ5KFwiV2ViXCIsIHRydWUsIERhdGUubm93KCkgLSB3ZWJTdGFydGVkQXQpO1xuICB9IGNhdGNoIHtcbiAgICBwcmludEJ1aWxkU3VtbWFyeShcIldlYlwiLCBmYWxzZSwgRGF0ZS5ub3coKSAtIHdlYlN0YXJ0ZWRBdCk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG59XG5cbi8qKlxuICogcHJlLWJ1aWxkLCBidWlsZCwgcG9zdC1idWlsZCDri6jqs4Trpbwg7Iic7LCo7KCB7Jy866GcIOyLpO2Wie2VqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuQnVpbGRTdGVwczxUPihcbiAgYXJ0aWZhY3Q6IEJ1aWxkQXJ0aWZhY3Q8VD4sXG4gIG9wdGlvbnM6IHsgY3dkOiBzdHJpbmc7IGJ1aWxkQ29tbWFuZEFyZ3M6IFQgfSxcbikge1xuICBjb25zdCBzdGVwcyA9IFtcbiAgICB7IG5hbWU6IFwicHJlLWJ1aWxkXCIsIGNtZDogYXJ0aWZhY3QucHJlQnVpbGRDb21tYW5kPy4oKSB9LFxuICAgIHsgbmFtZTogXCJidWlsZFwiLCBjbWQ6IGFydGlmYWN0LmJ1aWxkQ29tbWFuZChvcHRpb25zLmJ1aWxkQ29tbWFuZEFyZ3MpIH0sXG4gICAgeyBuYW1lOiBcInBvc3QtYnVpbGRcIiwgY21kOiBhcnRpZmFjdC5wb3N0QnVpbGRDb21tYW5kPy4oKSB9LFxuICBdLmZpbHRlcigoc3RlcCkgPT4gc3RlcC5jbWQpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBzdGVwID0gc3RlcHNbaV07XG4gICAgY29uc3QgaXNMYXN0ID0gaSA9PT0gc3RlcHMubGVuZ3RoIC0gMTtcblxuICAgIHRyeSB7XG4gICAgICBhc3NlcnQoc3RlcC5jbWQpO1xuICAgICAgcHJpbnRUYXNrU3RhcnQoc3RlcC5uYW1lLCBzdGVwLmNtZCwgaXNMYXN0KTtcbiAgICAgIGF3YWl0IGV4ZWNXaXRoTGluZVByZWZpeChzdGVwLmNtZCwgeyBjd2Q6IG9wdGlvbnMuY3dkIH0pO1xuICAgICAgcHJpbnRUYXNrU3VjY2VzcyhzdGVwLm5hbWUsIGlzTGFzdCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBwcmludFRhc2tGYWlsZWQoc3RlcC5uYW1lLCBpc0xhc3QpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3N0ZXAubmFtZX0gZmFpbGVkYCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogcG5wbSBzdGFydCDtlZjrqbQg7Iuk7ZaJ65CY64qUIO2VqOyImOyeheuLiOuLpC5cbiAqIOu5jOuTnOuQnCDtlITroZzsoJ3tirjrpbwg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIOu5jOuTnOuQnCDqsrDqs7zrrLwoZGlzdCDrlJTroInthqDrpqzsnZggaW5kZXguanMg7JeU7Yq466as7Y+s7J247Yq4KeydtCDsl4bri6TrqbQg7Iuk7ZaJ7J2EIOykkeuLqO2VqeuLiOuLpC5cbiAqIOyGjOyKpOuntSDsp4Dsm5Dqs7wgZG90ZW52IOyngOybkOydhCDtj6ztlajtlZjsl6wg7Iuk7ZaJ7ZWp64uI64ukLlxuICpcbiAqIFNvbmFtdS5pbml0IOyXhuydtCDtmLjstpzrkKAg6rKD7J2EIOyDgeygle2VmOyXrCDqtaztmITrkJjsl4jsirXri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YXJ0KCkge1xuICBjb25zdCBhcGlSb290ID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIGNvbnN0IGVudHJ5UG9pbnQgPSBcImRpc3QvaW5kZXguanNcIjtcblxuICBpZiAoIShhd2FpdCBleGlzdHMoZW50cnlQb2ludCkpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsucmVkKGAke2VudHJ5UG9pbnR9IG5vdCBmb3VuZC4gUGxlYXNlIGJ1aWxkIHlvdXIgcHJvamVjdCBmaXJzdC5gKSk7XG4gICAgY29uc29sZS5sb2coY2hhbGsuYmx1ZShcIlJ1bjogeWFybiBzb25hbXUgYnVpbGRcIikpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgc3Bhd24gfSA9IGF3YWl0IGltcG9ydChcImNoaWxkX3Byb2Nlc3NcIik7XG4gIGNvbnN0IHNlcnZlclByb2Nlc3MgPSBzcGF3bihcbiAgICBwcm9jZXNzLmV4ZWNQYXRoLFxuICAgIFtcIi0tZW5hYmxlLXNvdXJjZS1tYXBzXCIsIFwiLXJcIiwgXCJkb3RlbnYvY29uZmlnXCIsIGVudHJ5UG9pbnRdLFxuICAgIHtcbiAgICAgIGN3ZDogYXBpUm9vdCxcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICB9LFxuICApO1xuXG4gIHByb2Nlc3Mub24oXCJTSUdJTlRcIiwgKCkgPT4ge1xuICAgIHNlcnZlclByb2Nlc3Mua2lsbChcIlNJR1RFUk1cIik7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9KTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBNaWdyYXRvcigpIHtcbiAgLy8gbWlncmF0b3JcbiAgbWlncmF0b3IgPSBuZXcgTWlncmF0b3IoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBGaXh0dXJlTWFuYWdlcigpIHtcbiAgRml4dHVyZU1hbmFnZXIuaW5pdCgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX2FwcGx5KHRhcmdldHM6IChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG4gIGF3YWl0IG1pZ3JhdG9yLnJ1bkFjdGlvbihcImFwcGx5XCIsIHRhcmdldHMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtaWdyYXRlX3J1bigpIHtcbiAgYXdhaXQgc2V0dXBNaWdyYXRvcigpO1xuICBjb25zdCBsb2NhbEhvc3RzID0gW1wibG9jYWxob3N0XCIsIFwiMTI3LjAuMC4xXCIsIFwiMC4wLjAuMFwiLCBcIjo6MVwiXTtcbiAgY29uc3QgdGFyZ2V0cyA9IE9iamVjdC5rZXlzKFNvbmFtdS5kYkNvbmZpZykuZmlsdGVyKCh0YXJnZXQpID0+IHtcbiAgICBjb25zdCB0YXJnZXRDb25maWcgPSBTb25hbXUuZGJDb25maWdbdGFyZ2V0IGFzIGtleW9mIFNvbmFtdURCQ29uZmlnXTtcbiAgICBjb25zdCBob3N0ID0gKHRhcmdldENvbmZpZz8uY29ubmVjdGlvbiBhcyB7IGhvc3Q/OiBzdHJpbmcgfSk/Lmhvc3QgPz8gXCJsb2NhbGhvc3RcIjtcbiAgICByZXR1cm4gbG9jYWxIb3N0cy5pbmNsdWRlcyhob3N0LnRvTG93ZXJDYXNlKCkpO1xuICB9KTtcblxuICAvLyDroZzsu6wg642w7J207YSw67Kg7J207Iqk7JeQIOuMgO2VtOyEnOunjCDsoITssrQg66eI7J206re466CI7J207IWY7JeQ7IScIOuPmeyekVxuICBhd2FpdCBtaWdyYXRvci5ydW5BY3Rpb24oXCJhcHBseVwiLCB0YXJnZXRzIGFzIChrZXlvZiBTb25hbXVEQkNvbmZpZylbXSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1pZ3JhdGVfc3RhdHVzKCkge1xuICBhd2FpdCBzZXR1cE1pZ3JhdG9yKCk7XG5cbiAgY29uc3Qgc3RhdHVzID0gYXdhaXQgbWlncmF0b3IuZ2V0U3RhdHVzKCk7XG4gIC8vIHN0YXR1cztcbiAgY29uc29sZS5sb2coc3RhdHVzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9pbml0KCkge1xuICBjb25zdCBzcmNDb25maWcgPSBTb25hbXUuZGJDb25maWcuZGV2ZWxvcG1lbnRfbWFzdGVyO1xuICBjb25zdCB0YXJnZXRzID0gW1xuICAgIHtcbiAgICAgIGxhYmVsOiBcIihSRU1PVEUpIEZpeHR1cmUgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLmZpeHR1cmUsXG4gICAgfSxcbiAgICB7XG4gICAgICBsYWJlbDogXCIoTE9DQUwpIFRlc3RpbmcgREJcIixcbiAgICAgIGNvbmZpZzogU29uYW11LmRiQ29uZmlnLnRlc3QsXG4gICAgICB0b1NraXA6ICgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlbW90ZUNvbm4gPSBTb25hbXUuZGJDb25maWcuZml4dHVyZS5jb25uZWN0aW9uIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZztcbiAgICAgICAgY29uc3QgbG9jYWxDb25uID0gU29uYW11LmRiQ29uZmlnLnRlc3QuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gICAgICAgIHJldHVybiByZW1vdGVDb25uLmhvc3QgPT09IGxvY2FsQ29ubi5ob3N0ICYmIHJlbW90ZUNvbm4uZGF0YWJhc2UgPT09IGxvY2FsQ29ubi5kYXRhYmFzZTtcbiAgICAgIH0pKCksXG4gICAgfSxcbiAgXSBhcyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBjb25maWc6IEtuZXguQ29uZmlnO1xuICAgIHRvU2tpcD86IGJvb2xlYW47XG4gIH1bXTtcblxuICAvLyAxLiDquLDspIBEQiDsiqTtgqTrp4jrpbwg642k7ZSEXG4gIGNvbnNvbGUubG9nKFwiRFVNUC4uLlwiKTtcbiAgY29uc3QgZHVtcEZpbGVuYW1lID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC0ke0RhdGUubm93KCl9LnNxbGA7XG4gIGNvbnN0IHNyY0Nvbm4gPSBzcmNDb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG4gIGNvbnN0IG1pZ3JhdGlvbnNEdW1wID0gYC90bXAvc29uYW11LWZpeHR1cmUtaW5pdC1taWdyYXRpb25zLSR7RGF0ZS5ub3coKX0uc3FsYDtcbiAgZXhlY1N5bmMoXG4gICAgYG15c3FsZHVtcCAtaCR7c3JjQ29ubi5ob3N0fSAtdSR7c3JjQ29ubi51c2VyfSAtcCR7c3JjQ29ubi5wYXNzd29yZH0gLS1zaW5nbGUtdHJhbnNhY3Rpb24gLWQgLS1uby1jcmVhdGUtZGIgLS10cmlnZ2VycyAke3NyY0Nvbm4uZGF0YWJhc2V9ID4gJHtkdW1wRmlsZW5hbWV9YCxcbiAgKTtcbiAgY29uc3QgX2RiID0ga25leChzcmNDb25maWcpO1xuICBjb25zdCBbW21pZ3JhdGlvbnNdXSA9IGF3YWl0IF9kYi5yYXcoXG4gICAgXCJTRUxFQ1QgQ09VTlQoKikgYXMgY291bnQgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEudGFibGVzIFdIRVJFIHRhYmxlX3NjaGVtYSA9ID8gQU5EIHRhYmxlX25hbWUgPSAna25leF9taWdyYXRpb25zJ1wiLFxuICAgIFtzcmNDb25uLmRhdGFiYXNlXSxcbiAgKTtcbiAgaWYgKG1pZ3JhdGlvbnMuY291bnQgPiAwKSB7XG4gICAgZXhlY1N5bmMoXG4gICAgICBgbXlzcWxkdW1wIC1oJHtzcmNDb25uLmhvc3R9IC11JHtzcmNDb25uLnVzZXJ9IC1wJHtzcmNDb25uLnBhc3N3b3JkfSAtLXNpbmdsZS10cmFuc2FjdGlvbiAtLW5vLWNyZWF0ZS1kYiAtLXRyaWdnZXJzICR7c3JjQ29ubi5kYXRhYmFzZX0ga25leF9taWdyYXRpb25zIGtuZXhfbWlncmF0aW9uc19sb2NrID4gJHttaWdyYXRpb25zRHVtcH1gLFxuICAgICk7XG4gIH1cblxuICAvLyAyLiDrjIDsg4FEQiDqsIHqsIHsl5Ag64yA7ZWY7JesIOyhtOyerOyXrOu2gCDtmZXsnbgg7ZuEIOu2k+q4sFxuICBmb3IgYXdhaXQgKGNvbnN0IHsgbGFiZWwsIGNvbmZpZywgdG9Ta2lwIH0gb2YgdGFyZ2V0cykge1xuICAgIGNvbnN0IGNvbm4gPSBjb25maWcuY29ubmVjdGlvbiBhcyBLbmV4LkNvbm5lY3Rpb25Db25maWc7XG5cbiAgICBpZiAodG9Ta2lwID09PSB0cnVlKSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5yZWQoYCR7bGFiZWx9OiBTa2lwcGVkIWApKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGRiID0ga25leCh7XG4gICAgICAuLi5jb25maWcsXG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLigoY29uZmlnLmNvbm5lY3Rpb24gPz8ge30pIGFzIEtuZXguQ29ubmVjdGlvbkNvbmZpZyksXG4gICAgICAgIGRhdGFiYXNlOiB1bmRlZmluZWQsXG4gICAgICB9LFxuICAgIH0pO1xuICAgIGNvbnN0IFtbcm93XV0gPSBhd2FpdCBkYi5yYXcoYFNIT1cgREFUQUJBU0VTIExJS0UgXCIke2Nvbm4uZGF0YWJhc2V9XCJgKTtcbiAgICBpZiAocm93KSB7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYCR7bGFiZWx9OiBEYXRhYmFzZSBcIiR7Y29ubi5kYXRhYmFzZX1cIiBBbHJlYWR5IGV4aXN0c2ApKTtcbiAgICAgIGF3YWl0IGRiLmRlc3Ryb3koKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBTWU5DIHRvICR7bGFiZWx9Li4uYCk7XG4gICAgY29uc3QgbXlzcWxDbWQgPSBgbXlzcWwgLWgke2Nvbm4uaG9zdH0gLXUke2Nvbm4udXNlcn0gLXAke2Nvbm4ucGFzc3dvcmR9YDtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gLWUgJ0RST1AgREFUQUJBU0UgSUYgRVhJU1RTIFxcYCR7Y29ubi5kYXRhYmFzZX1cXGAnYCk7XG4gICAgZXhlY1N5bmMoYCR7bXlzcWxDbWR9IC1lICdDUkVBVEUgREFUQUJBU0UgXFxgJHtjb25uLmRhdGFiYXNlfVxcYCdgKTtcbiAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7ZHVtcEZpbGVuYW1lfWApO1xuICAgIGlmIChhd2FpdCBleGlzdHMobWlncmF0aW9uc0R1bXApKSB7XG4gICAgICBleGVjU3luYyhgJHtteXNxbENtZH0gJHtjb25uLmRhdGFiYXNlfSA8ICR7bWlncmF0aW9uc0R1bXB9YCk7XG4gICAgfVxuXG4gICAgYXdhaXQgZGIuZGVzdHJveSgpO1xuICB9XG5cbiAgYXdhaXQgX2RiLmRlc3Ryb3koKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZml4dHVyZV9pbXBvcnQoZW50aXR5SWQ6IHN0cmluZywgcmVjb3JkSWRzOiBudW1iZXJbXSkge1xuICBhd2FpdCBzZXR1cEZpeHR1cmVNYW5hZ2VyKCk7XG5cbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuaW1wb3J0Rml4dHVyZShlbnRpdHlJZCwgcmVjb3JkSWRzKTtcbiAgYXdhaXQgRml4dHVyZU1hbmFnZXIuc3luYygpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmaXh0dXJlX3N5bmMoKSB7XG4gIGF3YWl0IHNldHVwRml4dHVyZU1hbmFnZXIoKTtcblxuICBhd2FpdCBGaXh0dXJlTWFuYWdlci5zeW5jKCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfcHJhY3RpY2UobmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHByYWN0aWNlRGlyID0gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCJzcmNcIiwgXCJwcmFjdGljZXNcIik7XG4gIGNvbnN0IGZpbGVOYW1lcyA9IGF3YWl0IHJlYWRkaXIocHJhY3RpY2VEaXIpO1xuXG4gIGNvbnN0IG1heFNlcU5vID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICBpZiAoIShhd2FpdCBleGlzdHMocHJhY3RpY2VEaXIpKSkge1xuICAgICAgYXdhaXQgbWtkaXIocHJhY3RpY2VEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcmVkU2VxcyA9IGZpbGVOYW1lc1xuICAgICAgLmZpbHRlcigoZmlsZU5hbWUpID0+IGZpbGVOYW1lLnN0YXJ0c1dpdGgoXCJwXCIpICYmIGZpbGVOYW1lLmVuZHNXaXRoKFwiLnRzXCIpKVxuICAgICAgLm1hcCgoZmlsZU5hbWUpID0+IHtcbiAgICAgICAgY29uc3QgWywgc2VxTm9dID0gZmlsZU5hbWUubWF0Y2goL15wKFswLTldKyktLykgPz8gW1wiMFwiLCBcIjBcIl07XG4gICAgICAgIHJldHVybiBwYXJzZUludChzZXFObyk7XG4gICAgICB9KVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGIgLSBhKTtcblxuICAgIGlmIChmaWx0ZXJlZFNlcXMubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIGZpbHRlcmVkU2Vxc1swXTtcbiAgICB9XG5cbiAgICByZXR1cm4gMDtcbiAgfSkoKTtcblxuICBjb25zdCBjdXJyZW50U2VxTm8gPSBtYXhTZXFObyArIDE7XG4gIGNvbnN0IGZpbGVOYW1lID0gYHAke2N1cnJlbnRTZXFOb30tJHtuYW1lfS50c2A7XG4gIGNvbnN0IGRzdFBhdGggPSBwYXRoLmpvaW4ocHJhY3RpY2VEaXIsIGZpbGVOYW1lKTtcblxuICBjb25zdCBjb2RlID0gW1xuICAgIGBpbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwic29uYW11XCI7YCxcbiAgICBcIlwiLFxuICAgIGBjb25zb2xlLmNsZWFyKCk7YCxcbiAgICBgY29uc29sZS5sb2coXCIke2ZpbGVOYW1lfVwiKTtgLFxuICAgIFwiXCIsXG4gICAgYFNvbmFtdS5ydW5TY3JpcHQoYXN5bmMgKCkgPT4ge2AsXG4gICAgYCAvLyBUT0RPYCxcbiAgICBgfSk7YCxcbiAgICBcIlwiLFxuICBdLmpvaW4oXCJcXG5cIik7XG4gIGF3YWl0IHdyaXRlRmlsZShkc3RQYXRoLCBjb2RlKTtcblxuICBleGVjU3luYyhgY29kZSAke2RzdFBhdGh9YCk7XG5cbiAgY29uc3QgcnVuQ29kZSA9IGB5YXJuIG5vZGUgLXIgZG90ZW52L2NvbmZpZyAtLWVuYWJsZS1zb3VyY2UtbWFwcyBkaXN0L3ByYWN0aWNlcy8ke2ZpbGVOYW1lLnJlcGxhY2UoXG4gICAgXCIudHNcIixcbiAgICBcIi5qc1wiLFxuICApfWA7XG4gIGNvbnNvbGUubG9nKGAke2NoYWxrLmJsdWUocnVuQ29kZSl9IGNvcGllZCB0byBjbGlwYm9hcmQuYCk7XG4gIGV4ZWNTeW5jKGBlY2hvIFwiJHtydW5Db2RlfVwiIHwgcGJjb3B5YCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHN0dWJfZW50aXR5KGVudGl0eUlkOiBzdHJpbmcpIHtcbiAgYXdhaXQgU29uYW11LnN5bmNlci5jcmVhdGVFbnRpdHkoeyBlbnRpdHlJZCwgdGl0bGU6IGVudGl0eUlkIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBzY2FmZm9sZF9tb2RlbChlbnRpdHlJZDogc3RyaW5nKSB7XG4gIGF3YWl0IFNvbmFtdS5zeW5jZXIuZ2VuZXJhdGVUZW1wbGF0ZShcIm1vZGVsXCIsIHtcbiAgICBlbnRpdHlJZCxcbiAgfSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNjYWZmb2xkX21vZGVsX3Rlc3QoZW50aXR5SWQ6IHN0cmluZykge1xuICBhd2FpdCBTb25hbXUuc3luY2VyLmdlbmVyYXRlVGVtcGxhdGUoXCJtb2RlbF90ZXN0XCIsIHtcbiAgICBlbnRpdHlJZCxcbiAgfSk7XG59XG5cbi8qKlxuICogcG5wbSBzb25hbXUgc2tpbGxzIHN5bmMg7ZWY66m0IOyLpO2WieuQmOuKlCDtlajsiJjsnoXri4jri6QuXG4gKiDqs7Xsi50gU2tpbGxz66W8IOuhnOy7rCDtlITroZzsoJ3tirjroZwg64+Z6riw7ZmU7ZWp64uI64ukLlxuICovXG5hc3luYyBmdW5jdGlvbiBza2lsbHNfc3luYygpIHtcbiAgY29uc3Qgd29ya3NwYWNlUm9vdCA9IGF3YWl0IGZpbmRXb3Jrc3BhY2VSb290KCk7XG4gIGNvbnN0IGNsYXVkZURpciA9IHBhdGguam9pbih3b3Jrc3BhY2VSb290LCBcIi5jbGF1ZGVcIik7XG4gIGNvbnN0IHRhcmdldFNraWxsc0RpciA9IHBhdGguam9pbihjbGF1ZGVEaXIsIFwic2tpbGxzXCIsIFwic29uYW11XCIpO1xuXG4gIC8vIEBzb25hbXUta2l0L3NraWxscyDtjKjtgqTsp4Ag6rK966GcXG4gIGNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG4gIGNvbnN0IHNvdXJjZUJhc2UgPSBwYXRoLmRpcm5hbWUocmVxdWlyZS5yZXNvbHZlKFwiQHNvbmFtdS1raXQvc2tpbGxzL0NMQVVERS5tZFwiKSk7XG4gIGNvbnN0IHNvdXJjZVNraWxsc0RpciA9IHBhdGguam9pbihzb3VyY2VCYXNlLCBcInNvbmFtdVwiKTtcbiAgY29uc3Qgc291cmNlQ2xhdWRlTWQgPSBwYXRoLmpvaW4oc291cmNlQmFzZSwgXCJDTEFVREUubWRcIik7XG5cbiAgaWYgKCEoYXdhaXQgZXhpc3RzKHNvdXJjZVNraWxsc0RpcikpKSB7XG4gICAgY29uc29sZS5sb2coY2hhbGsueWVsbG93KFwiU2tpbGxzIHNvdXJjZSBub3QgZm91bmQgaW4gc29uYW11IHBhY2thZ2UuXCIpKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyDrjIDsg4Eg65SU66CJ7Yag66asIOyDneyEsVxuICBhd2FpdCBta2Rpcih0YXJnZXRTa2lsbHNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIC8vIOuzteyCrCAocmVjdXJzaXZlLCDrja7slrTsk7DquLApXG4gIGF3YWl0IGNwKHNvdXJjZVNraWxsc0RpciwgdGFyZ2V0U2tpbGxzRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgU2tpbGxzIHN5bmNlZCB0byAke3RhcmdldFNraWxsc0Rpcn1gKSk7XG5cbiAgLy8gQ0xBVURFLm1kIOuzteyCrC/sl4XrjbDsnbTtirhcbiAgaWYgKGF3YWl0IGV4aXN0cyhzb3VyY2VDbGF1ZGVNZCkpIHtcbiAgICBjb25zdCB0YXJnZXRDbGF1ZGVNZCA9IHBhdGguam9pbihjbGF1ZGVEaXIsIFwiQ0xBVURFLm1kXCIpO1xuICAgIGNvbnN0IHNvdXJjZUNvbnRlbnQgPSBhd2FpdCByZWFkRmlsZShzb3VyY2VDbGF1ZGVNZCwgXCJ1dGYtOFwiKTtcblxuICAgIGlmIChhd2FpdCBleGlzdHModGFyZ2V0Q2xhdWRlTWQpKSB7XG4gICAgICBjb25zdCB0YXJnZXRDb250ZW50ID0gYXdhaXQgcmVhZEZpbGUodGFyZ2V0Q2xhdWRlTWQsIFwidXRmLThcIik7XG4gICAgICBjb25zdCBzdGFydE1hcmtlciA9IFwiPCEtLSBTT05BTVU6U1RBUlQgLS0+XCI7XG4gICAgICBjb25zdCBlbmRNYXJrZXIgPSBcIjwhLS0gU09OQU1VOkVORCAtLT5cIjtcbiAgICAgIGlmICh0YXJnZXRDb250ZW50LmluY2x1ZGVzKHN0YXJ0TWFya2VyKSAmJiB0YXJnZXRDb250ZW50LmluY2x1ZGVzKGVuZE1hcmtlcikpIHtcbiAgICAgICAgLy8gbWFya2VyIOyYgeyXreunjCDqtZDssrTtlanri4jri6QuXG4gICAgICAgIGNvbnN0IGJlZm9yZSA9IHRhcmdldENvbnRlbnQuc3BsaXQoc3RhcnRNYXJrZXIpWzBdO1xuICAgICAgICBjb25zdCBhZnRlciA9IHRhcmdldENvbnRlbnQuc3BsaXQoZW5kTWFya2VyKVsxXTtcbiAgICAgICAgY29uc3QgbmV3Q29udGVudCA9IGAke2JlZm9yZX0ke3NvdXJjZUNvbnRlbnR9JHthZnRlcn1gO1xuICAgICAgICBhd2FpdCB3cml0ZUZpbGUodGFyZ2V0Q2xhdWRlTWQsIG5ld0NvbnRlbnQpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIENMQVVERS5tZCB1cGRhdGVkIChtYXJrZXIgcmVnaW9uKWApKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLnllbGxvdyhg4o+tIENMQVVERS5tZCBleGlzdHMgYnV0IG5vIG1hcmtlcnMsIHNraXBwZWRgKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZSh0YXJnZXRDbGF1ZGVNZCwgc291cmNlQ29udGVudCk7XG4gICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmVlbihg4pyTIENMQVVERS5tZCBjcmVhdGVkYCkpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIHBucG0gc29uYW11IHNraWxscyBjcmVhdGUgPG5hbWU+IO2VmOuptCDsi6TtlonrkJjripQg7ZWo7IiY7J6F64uI64ukLlxuICog66Gc7LusIHNraWxsIOy0iOyViOydhCDsg53shLHtlanri4jri6QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNraWxsc19jcmVhdGUobmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IHdvcmtzcGFjZVJvb3QgPSBhd2FpdCBmaW5kV29ya3NwYWNlUm9vdCgpO1xuICBjb25zdCBsb2NhbERpciA9IHBhdGguam9pbih3b3Jrc3BhY2VSb290LCBcIi5jbGF1ZGVcIiwgXCJza2lsbHNcIiwgXCJsb2NhbFwiKTtcbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4obG9jYWxEaXIsIGAke25hbWV9Lm1kYCk7XG5cbiAgaWYgKGF3YWl0IGV4aXN0cyhmaWxlUGF0aCkpIHtcbiAgICBjb25zb2xlLmxvZyhjaGFsay55ZWxsb3coYFNraWxsIFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzLmApKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBta2Rpcihsb2NhbERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgY29uc3QgdGVtcGxhdGUgPSBgLS0tXG5uYW1lOiAke25hbWV9XG5jYXRlZ29yeTogb3RoZXJcbmNyZWF0ZWRfYXQ6ICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXX1cbnN0YXR1czogZHJhZnRcbi0tLVxuXG4jIFvsoJzrqqldXG5cbiMjIOyDge2ZqVxuXG5b7Ja065akIOusuOygnOyYgOuKlOyngF1cblxuIyMg7ZW06rKwIOuwqeuylVxuXG5b7Ja065a76rKMIO2VtOqysO2WiOuKlOyngF1cblxuIyMg7L2U65OcIOyYiOyLnFxuXG5cXGBcXGBcXGB0eXBlc2NyaXB0XG4vLyDsmIjsi5wg7L2U65OcXG5cXGBcXGBcXGBcbmA7XG5cbiAgYXdhaXQgd3JpdGVGaWxlKGZpbGVQYXRoLCB0ZW1wbGF0ZSk7XG4gIGNvbnNvbGUubG9nKGNoYWxrLmdyZWVuKGDinJMgQ3JlYXRlZCAuY2xhdWRlL3NraWxscy9sb2NhbC8ke25hbWV9Lm1kYCkpO1xufVxuXG4vKipcbiAqIOybjO2BrOyKpO2OmOydtOyKpCDro6jtirjrpbwg7LC+7Iq164uI64ukLlxuICog7Jqw7ISg7Iic7JyEOiBwbnBtLXdvcmtzcGFjZS55YW1sID4gQ0xBVURFLm1kID4g66Oo7Yq4IHBhY2thZ2UuanNvbiAod29ya3NwYWNlcyDtlYTrk5wpXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpbmRXb3Jrc3BhY2VSb290KCkge1xuICBsZXQgZGlyID0gcHJvY2Vzcy5jd2QoKTtcblxuICB3aGlsZSAoZGlyICE9PSBwYXRoLmRpcm5hbWUoZGlyKSkge1xuICAgIC8vIDEuIHBucG0td29ya3NwYWNlLnlhbWwg7YyM7J287J20IOyeiOuKlOyngCDtmZXsnbguIOyeiOycvOuptCDtmZXsi6TtlZwgbW9ub3JlcG8g66Oo7Yq4LlxuICAgIGlmIChhd2FpdCBleGlzdHMocGF0aC5qb2luKGRpciwgXCJwbnBtLXdvcmtzcGFjZS55YW1sXCIpKSkge1xuICAgICAgcmV0dXJuIGRpcjtcbiAgICB9XG5cbiAgICAvLyAyLiBDTEFVREUubWQg7YyM7J287J20IOyeiOuKlOyngCDtmZXsnbguIOyeiOycvOuptCDtlITroZzsoJ3tirgg66Oo7Yq466GcIOqwhOyjvO2VqC5cbiAgICBpZiAoYXdhaXQgZXhpc3RzKHBhdGguam9pbihkaXIsIFwiQ0xBVURFLm1kXCIpKSkge1xuICAgICAgcmV0dXJuIGRpcjtcbiAgICB9XG5cbiAgICAvLyAzLiBwYWNrYWdlLmpzb27sl5Agd29ya3NwYWNlcyDtlYTrk5zqsIAg7J6I7Jy866m0IOujqO2KuC5cbiAgICBjb25zdCBwYWNrYWdlUGF0aCA9IHBhdGguam9pbihkaXIsIFwicGFja2FnZS5qc29uXCIpO1xuICAgIGlmIChhd2FpdCBleGlzdHMocGFja2FnZVBhdGgpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoYXdhaXQgcmVhZEZpbGUocGFja2FnZVBhdGgsIFwidXRmLThcIikpO1xuICAgICAgICBpZiAocGFja2FnZUpzb24ud29ya3NwYWNlcykge1xuICAgICAgICAgIHJldHVybiBkaXI7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyDtjIzsi7Eg7Iuk7Yyo7IucIOustOyLnFxuICAgICAgfVxuICAgIH1cbiAgICBkaXIgPSBwYXRoLmRpcm5hbWUoZGlyKTtcbiAgfVxuXG4gIC8vIOywvuyngCDrqrvtlZjrqbQgYXBpIO2PtOuNlOydmCDrtoDrqqgg7IKs7JqpXG4gIHJldHVybiBmaW5kQXBwUm9vdFBhdGgoKTtcbn1cbiJdLCJuYW1lcyI6WyJjaGFsayIsImRvdGVudiIsImNvbmZpZyIsImFzc2VydCIsImV4ZWNTeW5jIiwic3Bhd24iLCJjcCIsIm1rZGlyIiwicmVhZGRpciIsInJlYWRGaWxlIiwid3JpdGVGaWxlIiwia25leCIsImNyZWF0ZVJlcXVpcmUiLCJwYXRoIiwicHJvY2VzcyIsInRzaWNsaSIsIlNvbmFtdSIsIkVudGl0eU1hbmFnZXIiLCJNaWdyYXRvciIsIkZpeHR1cmVNYW5hZ2VyIiwiZXhlY1dpdGhMaW5lUHJlZml4IiwicHJpbnRCdWlsZFN1bW1hcnkiLCJwcmludFRhc2tGYWlsZWQiLCJwcmludFRhc2tIZWFkZXIiLCJwcmludFRhc2tTdGFydCIsInByaW50VGFza1N1Y2Nlc3MiLCJleGlzdHMiLCJmaW5kQXBpUm9vdFBhdGgiLCJmaW5kQXBwUm9vdFBhdGgiLCJBUElfQVJUSUZBQ1RTIiwiV0VCX0FSVElGQUNUUyIsIm1pZ3JhdG9yIiwiYm9vdHN0cmFwIiwibm90VG9Jbml0IiwiaW5jbHVkZXMiLCJhcmd2IiwiaW5pdCIsInR5cGVzIiwidHlwZSIsIm5hbWUiLCJtZXNzYWdlIiwiY2hvaWNlcyIsImdldEFsbFBhcmVudElkcyIsIm1hcCIsImVudGl0eUlkIiwidGl0bGUiLCJ2YWx1ZSIsImFyZ3MiLCJydW5uZXJzIiwibWlncmF0ZV9zdGF0dXMiLCJtaWdyYXRlX3J1biIsIm1pZ3JhdGVfYXBwbHkiLCJmaXh0dXJlX2luaXQiLCJmaXh0dXJlX2ltcG9ydCIsImZpeHR1cmVfc3luYyIsInN0dWJfcHJhY3RpY2UiLCJzdHViX2VudGl0eSIsInNjYWZmb2xkX21vZGVsIiwic2NhZmZvbGRfbW9kZWxfdGVzdCIsInN5bmMiLCJkZXYiLCJidWlsZCIsInN0YXJ0Iiwic2tpbGxzX3N5bmMiLCJza2lsbHNfY3JlYXRlIiwiZGVzdHJveSIsImZpbmFsbHkiLCJzeW5jZXIiLCJhcGlSb290IiwiZW50cnlQb2ludCIsImNvbnNvbGUiLCJsb2ciLCJ5ZWxsb3ciLCJib2xkIiwiaG90UnVubmVyQmluUGF0aCIsInVybCIsInJlc29sdmUiLCJzZXJ2ZXJQcm9jZXNzIiwiZXhlY1BhdGgiLCJqb2luIiwiY3dkIiwic3RkaW8iLCJlbnYiLCJOT0RFX0VOViIsIkhPVCIsIkFQSV9ST09UX1BBVEgiLCJjbGVhbnVwIiwia2lsbCIsImV4aXQiLCJvbiIsImNvZGUiLCJlcnJvciIsInJlZCIsImFwcFJvb3QiLCJzd2NGaWxlUGF0aCIsImRpbSIsImRpcm5hbWUiLCJhcGlTdGFydGVkQXQiLCJEYXRlIiwibm93IiwiYXJ0aWZhY3QiLCJwcm9qZWN0UGF0aCIsImRlc2NyaXB0aW9uIiwicnVuQnVpbGRTdGVwcyIsImJ1aWxkQ29tbWFuZEFyZ3MiLCJjb25maWdGaWxlUGF0aCIsIndlYlN0YXJ0ZWRBdCIsIm9wdGlvbnMiLCJzdGVwcyIsImNtZCIsInByZUJ1aWxkQ29tbWFuZCIsImJ1aWxkQ29tbWFuZCIsInBvc3RCdWlsZENvbW1hbmQiLCJmaWx0ZXIiLCJzdGVwIiwiaSIsImxlbmd0aCIsImlzTGFzdCIsIkVycm9yIiwiYmx1ZSIsInNldHVwTWlncmF0b3IiLCJzZXR1cEZpeHR1cmVNYW5hZ2VyIiwidGFyZ2V0cyIsInJ1bkFjdGlvbiIsImxvY2FsSG9zdHMiLCJPYmplY3QiLCJrZXlzIiwiZGJDb25maWciLCJ0YXJnZXQiLCJ0YXJnZXRDb25maWciLCJob3N0IiwiY29ubmVjdGlvbiIsInRvTG93ZXJDYXNlIiwic3RhdHVzIiwiZ2V0U3RhdHVzIiwic3JjQ29uZmlnIiwiZGV2ZWxvcG1lbnRfbWFzdGVyIiwibGFiZWwiLCJmaXh0dXJlIiwidGVzdCIsInRvU2tpcCIsInJlbW90ZUNvbm4iLCJsb2NhbENvbm4iLCJkYXRhYmFzZSIsImR1bXBGaWxlbmFtZSIsInNyY0Nvbm4iLCJtaWdyYXRpb25zRHVtcCIsInVzZXIiLCJwYXNzd29yZCIsIl9kYiIsIm1pZ3JhdGlvbnMiLCJyYXciLCJjb3VudCIsImNvbm4iLCJkYiIsInVuZGVmaW5lZCIsInJvdyIsIm15c3FsQ21kIiwicmVjb3JkSWRzIiwiaW1wb3J0Rml4dHVyZSIsInByYWN0aWNlRGlyIiwiYXBpUm9vdFBhdGgiLCJmaWxlTmFtZXMiLCJtYXhTZXFObyIsInJlY3Vyc2l2ZSIsImZpbHRlcmVkU2VxcyIsImZpbGVOYW1lIiwic3RhcnRzV2l0aCIsImVuZHNXaXRoIiwic2VxTm8iLCJtYXRjaCIsInBhcnNlSW50Iiwic29ydCIsImEiLCJiIiwiY3VycmVudFNlcU5vIiwiZHN0UGF0aCIsInJ1bkNvZGUiLCJyZXBsYWNlIiwiY3JlYXRlRW50aXR5IiwiZ2VuZXJhdGVUZW1wbGF0ZSIsIndvcmtzcGFjZVJvb3QiLCJmaW5kV29ya3NwYWNlUm9vdCIsImNsYXVkZURpciIsInRhcmdldFNraWxsc0RpciIsInJlcXVpcmUiLCJzb3VyY2VCYXNlIiwic291cmNlU2tpbGxzRGlyIiwic291cmNlQ2xhdWRlTWQiLCJmb3JjZSIsImdyZWVuIiwidGFyZ2V0Q2xhdWRlTWQiLCJzb3VyY2VDb250ZW50IiwidGFyZ2V0Q29udGVudCIsInN0YXJ0TWFya2VyIiwiZW5kTWFya2VyIiwiYmVmb3JlIiwic3BsaXQiLCJhZnRlciIsIm5ld0NvbnRlbnQiLCJsb2NhbERpciIsImZpbGVQYXRoIiwidGVtcGxhdGUiLCJ0b0lTT1N0cmluZyIsImRpciIsInBhY2thZ2VQYXRoIiwi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
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/** biome-ignore-all lint/suspicious/noExplicitAny: Puri의 타입은 개별 모델에서 확정되므로 BaseModel에서는 any를 허용함 */
|
|
2
2
|
import { type Logger } from "@logtape/logtape";
|
|
3
3
|
import type { Knex } from "knex";
|
|
4
|
-
import type
|
|
4
|
+
import { type ListResult } from "..";
|
|
5
|
+
import type { FilterQuery } from "../filter/types";
|
|
5
6
|
import type { DatabaseSchemaExtend, SonamuQueryMode } from "../types/types";
|
|
6
7
|
import type { EnhancerMap, ResolveSubsetIntersection } from "./base-model.types";
|
|
7
8
|
import type { DBPreset } from "./db";
|
|
@@ -53,15 +54,17 @@ export declare class BaseModelClass<TSubsetKey extends string = never, TSubsetMa
|
|
|
53
54
|
/**
|
|
54
55
|
* 서브셋 쿼리 실행
|
|
55
56
|
*
|
|
56
|
-
* 1.
|
|
57
|
-
* 2.
|
|
58
|
-
* 3.
|
|
59
|
-
* 4.
|
|
57
|
+
* 1. Sonamu 필터 적용 (타입 변환 포함)
|
|
58
|
+
* 2. 쿼리 실행 (pagination 적용)
|
|
59
|
+
* 3. 로더 실행 (1:N, N:M 관계 데이터 로딩)
|
|
60
|
+
* 4. Hydrate (flat → 중첩 객체)
|
|
61
|
+
* 5. Enhancer 적용 (virtual 필드 계산)
|
|
60
62
|
*/
|
|
61
63
|
executeSubsetQuery<T extends TSubsetKey, TComputedResults extends InferAllSubsets<TSubsetQueries, TLoaderQueries>, LP extends {
|
|
62
64
|
num?: number;
|
|
63
65
|
page?: number;
|
|
64
66
|
queryMode?: SonamuQueryMode;
|
|
67
|
+
sonamuFilter?: Record<string, unknown>;
|
|
65
68
|
}>(params: {
|
|
66
69
|
subset: T;
|
|
67
70
|
qb: Puri<any, any, any>;
|
|
@@ -69,6 +72,7 @@ export declare class BaseModelClass<TSubsetKey extends string = never, TSubsetMa
|
|
|
69
72
|
num: number;
|
|
70
73
|
page: number;
|
|
71
74
|
queryMode?: SonamuQueryMode;
|
|
75
|
+
sonamuFilter?: Record<string, unknown>;
|
|
72
76
|
};
|
|
73
77
|
debug?: boolean;
|
|
74
78
|
optimizeCountQuery?: boolean;
|
|
@@ -78,6 +82,17 @@ export declare class BaseModelClass<TSubsetKey extends string = never, TSubsetMa
|
|
|
78
82
|
* 중첩 필드(예: "user.email") 및 배열(예: "employees.salary")도 처리
|
|
79
83
|
*/
|
|
80
84
|
omitInternalFields<T extends object>(row: T, fields: string[]): T;
|
|
85
|
+
/**
|
|
86
|
+
* FilterQuery를 Puri QueryBuilder에 적용
|
|
87
|
+
*
|
|
88
|
+
* @param qb Puri QueryBuilder 인스턴스
|
|
89
|
+
* @param filters FilterQuery 객체
|
|
90
|
+
*/
|
|
91
|
+
protected applySonamuFilters<TEntity = Record<string, unknown>>(qb: Puri<any, any, any>, filters?: FilterQuery<TEntity>): void;
|
|
92
|
+
/**
|
|
93
|
+
* 단일 연산자를 QueryBuilder에 적용
|
|
94
|
+
*/
|
|
95
|
+
private applyOperator;
|
|
81
96
|
/**
|
|
82
97
|
* 중첩 필드 삭제 (배열 내 객체도 처리)
|
|
83
98
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-model.d.ts","sourceRoot":"","sources":["../../src/database/base-model.ts"],"names":[],"mappings":"AAAA,oGAAoG;AACpG,OAAO,EAAa,KAAK,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"base-model.d.ts","sourceRoot":"","sources":["../../src/database/base-model.ts"],"names":[],"mappings":"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"}
|