sonamu 0.8.13 → 0.8.14
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/api/sonamu.d.ts.map +1 -1
- package/dist/api/sonamu.js +2 -3
- package/dist/auth/auth-generator.d.ts +8 -0
- package/dist/auth/auth-generator.d.ts.map +1 -1
- package/dist/auth/auth-generator.js +33 -1
- package/dist/auth/better-auth-entities.d.ts.map +1 -1
- package/dist/auth/better-auth-entities.js +12 -2
- package/dist/bin/cli.js +18 -3
- package/dist/cone/cone-generator.js +10 -4
- package/dist/database/knex.d.ts.map +1 -1
- package/dist/database/knex.js +64 -2
- package/dist/database/puri.d.ts +9 -1
- package/dist/database/puri.d.ts.map +1 -1
- package/dist/database/puri.js +42 -1
- package/dist/database/puri.types.d.ts +2 -0
- package/dist/database/puri.types.d.ts.map +1 -1
- package/dist/database/puri.types.js +6 -2
- package/dist/entity/entity-manager.d.ts +149 -1
- package/dist/entity/entity-manager.d.ts.map +1 -1
- package/dist/entity/entity-manager.js +68 -4
- package/dist/migration/__tests__/code-generation.search-text.test.js +435 -0
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +696 -32
- package/dist/migration/migration-set.js +3 -1
- package/dist/migration/postgresql-schema-reader.d.ts +16 -2
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +281 -7
- package/dist/stream/sse.js +5 -3
- package/dist/template/__tests__/generated.template.search-text.test.js +99 -0
- package/dist/template/generated.template.test-d.js +24 -0
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +2 -2
- package/dist/template/implementations/init_types.template.d.ts.map +1 -1
- package/dist/template/implementations/init_types.template.js +11 -3
- package/dist/template/zod-converter.d.ts.map +1 -1
- package/dist/template/zod-converter.js +6 -2
- package/dist/testing/dev-test-routes.d.ts.map +1 -1
- package/dist/testing/dev-test-routes.js +5 -3
- package/dist/testing/fixture-generator.d.ts +13 -0
- package/dist/testing/fixture-generator.d.ts.map +1 -1
- package/dist/testing/fixture-generator.js +105 -8
- package/dist/testing/fixture-manager.d.ts.map +1 -1
- package/dist/testing/fixture-manager.js +19 -2
- package/dist/types/__tests__/entity-json-schema-search-text.test.js +256 -0
- package/dist/types/types.d.ts +494 -1
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +117 -13
- package/dist/ui/api.d.ts.map +1 -1
- package/dist/ui/api.js +14 -2
- package/dist/ui/cdd-service.d.ts +16 -14
- package/dist/ui/cdd-service.d.ts.map +1 -1
- package/dist/ui/cdd-service.js +145 -37
- package/dist/ui/cdd-types.d.ts +60 -0
- package/dist/ui/cdd-types.d.ts.map +1 -0
- package/dist/ui/cdd-types.js +3 -0
- package/dist/ui-web/assets/index-D4XFBV-f.css +1 -0
- package/dist/ui-web/assets/{index-CQ_S40bD.js → index-D_19-Pi4.js} +87 -87
- package/dist/ui-web/index.html +2 -2
- package/package.json +7 -3
- package/src/api/sonamu.ts +1 -2
- package/src/auth/auth-generator.ts +38 -0
- package/src/auth/better-auth-entities.ts +18 -1
- package/src/bin/cli.ts +15 -1
- package/src/cone/cone-generator.ts +9 -3
- package/src/database/knex.ts +62 -4
- package/src/database/puri.ts +71 -0
- package/src/database/puri.types.ts +2 -0
- package/src/entity/entity-manager.ts +95 -3
- package/src/migration/__tests__/code-generation.search-text.test.ts +390 -0
- package/src/migration/code-generation.ts +848 -34
- package/src/migration/migration-set.ts +2 -0
- package/src/migration/postgresql-schema-reader.ts +366 -9
- package/src/skills/sonamu/auth-migration.md +80 -0
- package/src/skills/sonamu/cdd.md +148 -28
- package/src/skills/sonamu/cone.md +16 -0
- package/src/skills/sonamu/entity-relations.md +1 -1
- package/src/skills/sonamu/fixture-cli.md +4 -0
- package/src/skills/sonamu/frontend.md +65 -0
- package/src/skills/sonamu/migration.md +3 -1
- package/src/skills/sonamu/model.md +28 -0
- package/src/skills/sonamu/workflow.md +12 -5
- package/src/stream/sse.ts +4 -2
- package/src/template/__tests__/generated.template.search-text.test.ts +89 -0
- package/src/template/generated.template.test-d.ts +46 -0
- package/src/template/implementations/generated.template.ts +4 -1
- package/src/template/implementations/init_types.template.ts +20 -5
- package/src/template/zod-converter.ts +5 -0
- package/src/testing/dev-test-routes.ts +4 -2
- package/src/testing/fixture-generator.ts +157 -9
- package/src/testing/fixture-manager.ts +15 -1
- package/src/types/__tests__/entity-json-schema-search-text.test.ts +179 -0
- package/src/types/types.ts +168 -12
- package/src/ui/api.ts +24 -1
- package/src/ui/cdd-service.ts +195 -55
- package/src/ui/cdd-types.ts +73 -0
- package/dist/ui-web/assets/index-egkMxKos.css +0 -1
package/dist/ui/cdd-service.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { spawn } from "child_process";
|
|
2
|
-
import crypto from "crypto";
|
|
3
2
|
import fs from "fs";
|
|
4
3
|
import os from "os";
|
|
5
4
|
import path from "path";
|
|
6
5
|
import { Sonamu } from "../api/sonamu.js";
|
|
7
6
|
/** contract/ 디렉터리 절대 경로 반환 (apiRootPath 기준) */ function getContractDir() {
|
|
8
|
-
return path.join(Sonamu.apiRootPath, "contract");
|
|
7
|
+
return path.join(Sonamu.apiRootPath, "..", "..", "contract");
|
|
9
8
|
}
|
|
10
9
|
/** 경로가 contract/ 디렉터리 내부인지 검증 */ function assertInsideContractDir(filePath) {
|
|
11
10
|
const contractDir = getContractDir();
|
|
@@ -63,12 +62,14 @@ import { Sonamu } from "../api/sonamu.js";
|
|
|
63
62
|
tree
|
|
64
63
|
};
|
|
65
64
|
}
|
|
66
|
-
/**
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
return
|
|
65
|
+
/** schema ID로 schema 파일을 찾아 반환 */ function resolveSchema(schemaId) {
|
|
66
|
+
const contractDir = getContractDir();
|
|
67
|
+
const schemaPath = path.join(contractDir, "schemas", `${schemaId}.schema.json`);
|
|
68
|
+
if (!fs.existsSync(schemaPath)) return null;
|
|
69
|
+
const raw = fs.readFileSync(schemaPath, "utf-8");
|
|
70
|
+
return JSON.parse(raw);
|
|
70
71
|
}
|
|
71
|
-
/** JSON 파일의 전체 내용을 읽어
|
|
72
|
+
/** JSON 파일의 전체 내용을 읽어 schema와 함께 envelope로 반환 */ export function readContent(filePath) {
|
|
72
73
|
assertInsideContractDir(filePath);
|
|
73
74
|
const contractDir = getContractDir();
|
|
74
75
|
const absPath = path.resolve(contractDir, filePath);
|
|
@@ -76,13 +77,17 @@ import { Sonamu } from "../api/sonamu.js";
|
|
|
76
77
|
throw new Error(`파일을 찾을 수 없습니다: ${filePath}`);
|
|
77
78
|
}
|
|
78
79
|
const raw = fs.readFileSync(absPath, "utf-8");
|
|
79
|
-
const
|
|
80
|
+
const document = JSON.parse(raw);
|
|
81
|
+
const fileType = detectFileType(path.basename(filePath));
|
|
82
|
+
const schemaId = typeof document.schema === "string" ? document.schema : null;
|
|
83
|
+
const schema = schemaId ? resolveSchema(schemaId) : null;
|
|
80
84
|
return {
|
|
81
|
-
|
|
82
|
-
|
|
85
|
+
document,
|
|
86
|
+
schema,
|
|
87
|
+
fileType: fileType ?? "contract"
|
|
83
88
|
};
|
|
84
89
|
}
|
|
85
|
-
/** JSON
|
|
90
|
+
/** JSON 파일을 외부 에디터로 직접 편집 */ export async function editContent(filePath) {
|
|
86
91
|
assertInsideContractDir(filePath);
|
|
87
92
|
const contractDir = getContractDir();
|
|
88
93
|
const absPath = path.resolve(contractDir, filePath);
|
|
@@ -90,31 +95,11 @@ import { Sonamu } from "../api/sonamu.js";
|
|
|
90
95
|
throw new Error(`파일을 찾을 수 없습니다: ${filePath}`);
|
|
91
96
|
}
|
|
92
97
|
const editor = resolveEditorCli();
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
fs.writeFileSync(tmpFilePath, content, "utf-8");
|
|
99
|
-
try {
|
|
100
|
-
await runEditor(editor, tmpFilePath);
|
|
101
|
-
const edited = fs.readFileSync(tmpFilePath, "utf-8");
|
|
102
|
-
json.content = edited.split("\n");
|
|
103
|
-
const today = new Date();
|
|
104
|
-
const yyyy = today.getFullYear();
|
|
105
|
-
const mm = String(today.getMonth() + 1).padStart(2, "0");
|
|
106
|
-
const dd = String(today.getDate()).padStart(2, "0");
|
|
107
|
-
json.lastModified = `${yyyy}-${mm}-${dd}`;
|
|
108
|
-
fs.writeFileSync(absPath, `${JSON.stringify(json, null, 2)}\n`, "utf-8");
|
|
109
|
-
return {
|
|
110
|
-
success: true,
|
|
111
|
-
filePath
|
|
112
|
-
};
|
|
113
|
-
} finally{
|
|
114
|
-
if (fs.existsSync(tmpFilePath)) {
|
|
115
|
-
fs.unlinkSync(tmpFilePath);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
98
|
+
await runEditor(editor, absPath);
|
|
99
|
+
return {
|
|
100
|
+
success: true,
|
|
101
|
+
filePath
|
|
102
|
+
};
|
|
118
103
|
}
|
|
119
104
|
/** 에디터별 앱 번들 내 CLI 경로 + --wait 플래그 매핑 */ const EDITOR_CLI_MAP = {
|
|
120
105
|
"Visual Studio Code": {
|
|
@@ -176,6 +161,129 @@ import { Sonamu } from "../api/sonamu.js";
|
|
|
176
161
|
});
|
|
177
162
|
});
|
|
178
163
|
}
|
|
164
|
+
/* ========================================================================
|
|
165
|
+
* Schema 관리 API
|
|
166
|
+
* ======================================================================== */ /** contract/schemas/ 디렉터리 내 .schema.json 파일 경로 목록 반환 */ function scanSchemaFiles() {
|
|
167
|
+
const schemasDir = path.join(getContractDir(), "schemas");
|
|
168
|
+
if (!fs.existsSync(schemasDir)) return [];
|
|
169
|
+
return fs.readdirSync(schemasDir, {
|
|
170
|
+
withFileTypes: true
|
|
171
|
+
}).filter((e)=>e.isFile() && e.name.endsWith(".schema.json")).map((e)=>({
|
|
172
|
+
absPath: path.join(schemasDir, e.name),
|
|
173
|
+
relPath: `schemas/${e.name}`,
|
|
174
|
+
fileName: e.name
|
|
175
|
+
}));
|
|
176
|
+
}
|
|
177
|
+
/** 특정 schemaId를 참조하는 contract/spec 문서들을 재귀 수집 */ function collectSchemaReferences(schemaId, dirPath, relativeTo) {
|
|
178
|
+
if (!fs.existsSync(dirPath)) return [];
|
|
179
|
+
const refs = [];
|
|
180
|
+
const entries = fs.readdirSync(dirPath, {
|
|
181
|
+
withFileTypes: true
|
|
182
|
+
});
|
|
183
|
+
for (const entry of entries){
|
|
184
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
185
|
+
if (entry.isDirectory()) {
|
|
186
|
+
if (entry.name === "schemas") continue;
|
|
187
|
+
refs.push(...collectSchemaReferences(schemaId, fullPath, relativeTo));
|
|
188
|
+
} else if (entry.isFile()) {
|
|
189
|
+
const fileType = detectFileType(entry.name);
|
|
190
|
+
if (!fileType) continue;
|
|
191
|
+
try {
|
|
192
|
+
const raw = fs.readFileSync(fullPath, "utf-8");
|
|
193
|
+
const doc = JSON.parse(raw);
|
|
194
|
+
if (doc.schema === schemaId) {
|
|
195
|
+
refs.push({
|
|
196
|
+
path: path.relative(relativeTo, fullPath),
|
|
197
|
+
fileType,
|
|
198
|
+
name: entry.name
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
} catch {
|
|
202
|
+
// JSON 파싱 실패 시 무시
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return refs;
|
|
207
|
+
}
|
|
208
|
+
/** schema 파일명에서 기대되는 id 추출 */ function expectedSchemaId(fileName) {
|
|
209
|
+
return fileName.replace(/\.schema\.json$/, "");
|
|
210
|
+
}
|
|
211
|
+
/** schemas/ 하위 경로가 contract/schemas/ 내부인지 검증 */ function assertInsideSchemaDir(schemaKey) {
|
|
212
|
+
const schemasDir = path.join(getContractDir(), "schemas");
|
|
213
|
+
const resolved = path.resolve(schemasDir, `${schemaKey}.schema.json`);
|
|
214
|
+
if (!resolved.startsWith(schemasDir + path.sep) && resolved !== schemasDir) {
|
|
215
|
+
throw new Error(`유효하지 않은 스키마 키입니다: ${schemaKey}`);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
/** schema 목록 반환 */ export function listSchemas() {
|
|
219
|
+
const contractDir = getContractDir();
|
|
220
|
+
const files = scanSchemaFiles();
|
|
221
|
+
const schemas = [];
|
|
222
|
+
for (const file of files){
|
|
223
|
+
const key = expectedSchemaId(file.fileName);
|
|
224
|
+
try {
|
|
225
|
+
const raw = fs.readFileSync(file.absPath, "utf-8");
|
|
226
|
+
const schema = JSON.parse(raw);
|
|
227
|
+
const refs = collectSchemaReferences(schema.id, contractDir, contractDir);
|
|
228
|
+
schemas.push({
|
|
229
|
+
key,
|
|
230
|
+
id: schema.id,
|
|
231
|
+
path: file.relPath,
|
|
232
|
+
type: schema.type,
|
|
233
|
+
fieldCount: schema.fields.length,
|
|
234
|
+
referenceCount: refs.length,
|
|
235
|
+
hasIdMismatch: schema.id !== key
|
|
236
|
+
});
|
|
237
|
+
} catch (err) {
|
|
238
|
+
schemas.push({
|
|
239
|
+
key,
|
|
240
|
+
id: key,
|
|
241
|
+
path: file.relPath,
|
|
242
|
+
type: "contract",
|
|
243
|
+
fieldCount: 0,
|
|
244
|
+
referenceCount: 0,
|
|
245
|
+
hasIdMismatch: false,
|
|
246
|
+
parseError: err instanceof Error ? err.message : String(err)
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return {
|
|
251
|
+
schemas
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
/** schema 상세 반환 (파일명 기반 key로 조회) */ export function readSchema(schemaKey) {
|
|
255
|
+
assertInsideSchemaDir(schemaKey);
|
|
256
|
+
const contractDir = getContractDir();
|
|
257
|
+
const absPath = path.join(contractDir, "schemas", `${schemaKey}.schema.json`);
|
|
258
|
+
if (!fs.existsSync(absPath)) {
|
|
259
|
+
throw new Error(`스키마를 찾을 수 없습니다: ${schemaKey}`);
|
|
260
|
+
}
|
|
261
|
+
const raw = fs.readFileSync(absPath, "utf-8");
|
|
262
|
+
const schema = JSON.parse(raw);
|
|
263
|
+
const relPath = path.relative(contractDir, absPath);
|
|
264
|
+
const references = collectSchemaReferences(schema.id, contractDir, contractDir);
|
|
265
|
+
return {
|
|
266
|
+
key: schemaKey,
|
|
267
|
+
path: relPath,
|
|
268
|
+
schema,
|
|
269
|
+
references,
|
|
270
|
+
hasIdMismatch: schema.id !== schemaKey
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
/** schema 파일을 외부 에디터로 편집 (파일명 기반 key로 조회) */ export async function editSchema(schemaKey) {
|
|
274
|
+
assertInsideSchemaDir(schemaKey);
|
|
275
|
+
const contractDir = getContractDir();
|
|
276
|
+
const absPath = path.join(contractDir, "schemas", `${schemaKey}.schema.json`);
|
|
277
|
+
if (!fs.existsSync(absPath)) {
|
|
278
|
+
throw new Error(`스키마를 찾을 수 없습니다: ${schemaKey}`);
|
|
279
|
+
}
|
|
280
|
+
const editor = resolveEditorCli();
|
|
281
|
+
await runEditor(editor, absPath);
|
|
282
|
+
return {
|
|
283
|
+
success: true,
|
|
284
|
+
schemaKey
|
|
285
|
+
};
|
|
286
|
+
}
|
|
179
287
|
/** 소스 파일을 외부 에디터로 열기 (대기하지 않음) */ export function openSourceFile(filePath) {
|
|
180
288
|
const absPath = path.isAbsolute(filePath) ? filePath : path.resolve(Sonamu.apiRootPath, filePath);
|
|
181
289
|
if (!fs.existsSync(absPath)) {
|
|
@@ -194,4 +302,4 @@ import { Sonamu } from "../api/sonamu.js";
|
|
|
194
302
|
child.unref();
|
|
195
303
|
}
|
|
196
304
|
|
|
197
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91aS9jZGQtc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgY3J5cHRvIGZyb20gXCJjcnlwdG9cIjtcbmltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpL3NvbmFtdVwiO1xuXG5leHBvcnQgdHlwZSBDZGRGaWxlVHlwZSA9IFwiY29udHJhY3RcIiB8IFwic3BlY1wiO1xuXG5leHBvcnQgdHlwZSBDZGRUcmVlTm9kZSA9IHtcbiAgbmFtZTogc3RyaW5nO1xuICAvKiogY29udHJhY3QvIOq4sOykgCDsg4HrjIAg6rK966GcICovXG4gIHBhdGg6IHN0cmluZztcbiAgdHlwZTogXCJmaWxlXCIgfCBcImRpcmVjdG9yeVwiO1xuICAvKiogZmlsZeyduCDqsr3smrDrp4wg7KG07J6sICovXG4gIGZpbGVUeXBlPzogQ2RkRmlsZVR5cGU7XG4gIC8qKiBkaXJlY3Rvcnnsnbgg6rK97Jqw66eMIOyhtOyerCAqL1xuICBjaGlsZHJlbj86IENkZFRyZWVOb2RlW107XG59O1xuXG4vKiogY29udHJhY3QvIOuUlOugie2EsOumrCDsoIjrjIAg6rK966GcIOuwmO2ZmCAoYXBpUm9vdFBhdGgg6riw7KSAKSAqL1xuZnVuY3Rpb24gZ2V0Q29udHJhY3REaXIoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGguam9pbihTb25hbXUuYXBpUm9vdFBhdGgsIFwiY29udHJhY3RcIik7XG59XG5cbi8qKiDqsr3roZzqsIAgY29udHJhY3QvIOuUlOugie2EsOumrCDrgrTrtoDsnbjsp4Ag6rKA7KadICovXG5mdW5jdGlvbiBhc3NlcnRJbnNpZGVDb250cmFjdERpcihmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBwYXRoLnJlc29sdmUoY29udHJhY3REaXIsIGZpbGVQYXRoKTtcbiAgaWYgKCFyZXNvbHZlZC5zdGFydHNXaXRoKGNvbnRyYWN0RGlyICsgcGF0aC5zZXApICYmIHJlc29sdmVkICE9PSBjb250cmFjdERpcikge1xuICAgIHRocm93IG5ldyBFcnJvcihg6rK966Gc6rCAIGNvbnRyYWN0LyDrlJTroInthLDrpqwg67CW7J2EIOywuOyhsO2VqeuLiOuLpDogJHtmaWxlUGF0aH1gKTtcbiAgfVxufVxuXG4vKiog7YyM7J2866qF7JeQ7IScIENkZEZpbGVUeXBlIO2MkOuzhCAqL1xuZnVuY3Rpb24gZGV0ZWN0RmlsZVR5cGUoZmlsZU5hbWU6IHN0cmluZyk6IENkZEZpbGVUeXBlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGZpbGVOYW1lLmVuZHNXaXRoKFwiLmNvbnRyYWN0Lmpzb25cIikpIHJldHVybiBcImNvbnRyYWN0XCI7XG4gIGlmIChmaWxlTmFtZS5lbmRzV2l0aChcIi5zcGVjLmpzb25cIikpIHJldHVybiBcInNwZWNcIjtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqIOuUlOugie2EsOumrOulvCDsnqzqt4Ag7YOQ7IOJ7ZWY7JesIENkZFRyZWVOb2RlIO2KuOumrOulvCDsg53shLEgKi9cbmZ1bmN0aW9uIHNjYW5EaXJlY3RvcnkoZGlyUGF0aDogc3RyaW5nLCByZWxhdGl2ZVRvOiBzdHJpbmcpOiBDZGRUcmVlTm9kZVtdIHtcbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3Qgbm9kZXM6IENkZFRyZWVOb2RlW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBlbnRyeS5uYW1lKTtcbiAgICBjb25zdCByZWxQYXRoID0gcGF0aC5yZWxhdGl2ZShyZWxhdGl2ZVRvLCBmdWxsUGF0aCk7XG5cbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBzY2FuRGlyZWN0b3J5KGZ1bGxQYXRoLCByZWxhdGl2ZVRvKTtcbiAgICAgIG5vZGVzLnB1c2goe1xuICAgICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICB0eXBlOiBcImRpcmVjdG9yeVwiLFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZW50cnkuaXNGaWxlKCkpIHtcbiAgICAgIGNvbnN0IGZpbGVUeXBlID0gZGV0ZWN0RmlsZVR5cGUoZW50cnkubmFtZSk7XG4gICAgICBpZiAoZmlsZVR5cGUpIHtcbiAgICAgICAgbm9kZXMucHVzaCh7XG4gICAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICAgIGZpbGVUeXBlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9kZXM7XG59XG5cbi8qKiBjb250cmFjdC8g65SU66CJ7YSw66as7J2YIO2KuOumrCDqtazsobDrpbwg67CY7ZmYICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2RkVHJlZSgpOiB7IGV4aXN0czogYm9vbGVhbjsgdHJlZTogQ2RkVHJlZU5vZGVbXSB9IHtcbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29udHJhY3REaXIpKSB7XG4gICAgcmV0dXJuIHsgZXhpc3RzOiBmYWxzZSwgdHJlZTogW10gfTtcbiAgfVxuICBjb25zdCB0cmVlID0gc2NhbkRpcmVjdG9yeShjb250cmFjdERpciwgY29udHJhY3REaXIpO1xuICByZXR1cm4geyBleGlzdHM6IHRydWUsIHRyZWUgfTtcbn1cblxuLyoqIGNvbnRlbnQg7ZWE65Oc66W8IHN0cmluZ+ycvOuhnCDrs4DtmZggKHN0cmluZ1tdIOuwjyBzdHJpbmcg66qo65GQIOyngOybkCkgKi9cbmZ1bmN0aW9uIGNvbnRlbnRUb1N0cmluZyhjb250ZW50OiB1bmtub3duKTogc3RyaW5nIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29udGVudCkpIHJldHVybiBjb250ZW50LmpvaW4oXCJcXG5cIik7XG4gIGlmICh0eXBlb2YgY29udGVudCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGNvbnRlbnQ7XG4gIHJldHVybiBcIlwiO1xufVxuXG4vKiogSlNPTiDtjIzsnbzsnZgg7KCE7LK0IOuCtOyaqeydhCDsnb3slrQg67CY7ZmYIChjb250ZW5064qUIHN0cmluZ+ycvOuhnCDrs4DtmZgpICovXG5leHBvcnQgZnVuY3Rpb24gcmVhZENvbnRlbnQoZmlsZVBhdGg6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgYXNzZXJ0SW5zaWRlQ29udHJhY3REaXIoZmlsZVBhdGgpO1xuXG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgYWJzUGF0aCA9IHBhdGgucmVzb2x2ZShjb250cmFjdERpciwgZmlsZVBhdGgpO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhhYnNQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7YyM7J287J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2ZpbGVQYXRofWApO1xuICB9XG5cbiAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKGFic1BhdGgsIFwidXRmLThcIik7XG4gIGNvbnN0IGpzb24gPSBKU09OLnBhcnNlKHJhdykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHJldHVybiB7IC4uLmpzb24sIGNvbnRlbnQ6IGNvbnRlbnRUb1N0cmluZyhqc29uLmNvbnRlbnQpIH07XG59XG5cbi8qKiBKU09OIO2MjOydvOydmCBjb250ZW50IO2VhOuTnOulvCDsmbjrtoAg7JeQ65SU7YSw66GcIO2OuOynkSAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRDb250ZW50KFxuICBmaWxlUGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IGZpbGVQYXRoOiBzdHJpbmcgfT4ge1xuICBhc3NlcnRJbnNpZGVDb250cmFjdERpcihmaWxlUGF0aCk7XG5cbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbnRyYWN0RGlyLCBmaWxlUGF0aCk7XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGFic1BhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtjIzsnbzsnYQg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gIH1cblxuICBjb25zdCBlZGl0b3IgPSByZXNvbHZlRWRpdG9yQ2xpKCk7XG5cbiAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKGFic1BhdGgsIFwidXRmLThcIik7XG4gIGNvbnN0IGpzb246IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gSlNPTi5wYXJzZShyYXcpO1xuXG4gIGNvbnN0IGNvbnRlbnQgPSBjb250ZW50VG9TdHJpbmcoanNvbi5jb250ZW50KTtcblxuICBjb25zdCB0bXBGaWxlTmFtZSA9IGBjZGQtZWRpdC0ke2NyeXB0by5yYW5kb21VVUlEKCl9Lm1kYDtcbiAgY29uc3QgdG1wRmlsZVBhdGggPSBwYXRoLmpvaW4ob3MudG1wZGlyKCksIHRtcEZpbGVOYW1lKTtcblxuICBmcy53cml0ZUZpbGVTeW5jKHRtcEZpbGVQYXRoLCBjb250ZW50LCBcInV0Zi04XCIpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgcnVuRWRpdG9yKGVkaXRvciwgdG1wRmlsZVBhdGgpO1xuXG4gICAgY29uc3QgZWRpdGVkID0gZnMucmVhZEZpbGVTeW5jKHRtcEZpbGVQYXRoLCBcInV0Zi04XCIpO1xuICAgIGpzb24uY29udGVudCA9IGVkaXRlZC5zcGxpdChcIlxcblwiKTtcblxuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCB5eXl5ID0gdG9kYXkuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBtbSA9IFN0cmluZyh0b2RheS5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgXCIwXCIpO1xuICAgIGNvbnN0IGRkID0gU3RyaW5nKHRvZGF5LmdldERhdGUoKSkucGFkU3RhcnQoMiwgXCIwXCIpO1xuICAgIGpzb24ubGFzdE1vZGlmaWVkID0gYCR7eXl5eX0tJHttbX0tJHtkZH1gO1xuXG4gICAgZnMud3JpdGVGaWxlU3luYyhhYnNQYXRoLCBgJHtKU09OLnN0cmluZ2lmeShqc29uLCBudWxsLCAyKX1cXG5gLCBcInV0Zi04XCIpO1xuXG4gICAgcmV0dXJuIHsgc3VjY2VzczogdHJ1ZSwgZmlsZVBhdGggfTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyh0bXBGaWxlUGF0aCkpIHtcbiAgICAgIGZzLnVubGlua1N5bmModG1wRmlsZVBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG4vKiog7JeQ65SU7YSw67OEIOyVsSDrsojrk6Qg64K0IENMSSDqsr3roZwgKyAtLXdhaXQg7ZSM656Y6re4IOunpO2VkSAqL1xuY29uc3QgRURJVE9SX0NMSV9NQVA6IFJlY29yZDxzdHJpbmcsIHsgY2xpOiBzdHJpbmc7IHdhaXRGbGFnOiBzdHJpbmcgfT4gPSB7XG4gIFwiVmlzdWFsIFN0dWRpbyBDb2RlXCI6IHsgY2xpOiBcIkNvbnRlbnRzL1Jlc291cmNlcy9hcHAvYmluL2NvZGVcIiwgd2FpdEZsYWc6IFwiLS13YWl0XCIgfSxcbiAgWmVkOiB7IGNsaTogXCJDb250ZW50cy9NYWNPUy9jbGlcIiwgd2FpdEZsYWc6IFwiLS13YWl0XCIgfSxcbiAgQ3Vyc29yOiB7IGNsaTogXCJDb250ZW50cy9SZXNvdXJjZXMvYXBwL2Jpbi9jdXJzb3JcIiwgd2FpdEZsYWc6IFwiLS13YWl0XCIgfSxcbn07XG5cbi8qKiDslbEg67KI65OkIENMSSDqsr3roZzrpbwgcmVzb2x2ZS4gd2FpdD1mYWxzZeydtOuptCAtLXdhaXQg7ZSM656Y6re466W8IOyDneuetSAqL1xuZnVuY3Rpb24gcmVzb2x2ZUVkaXRvckNsaShvcHRpb25zPzogeyB3YWl0PzogYm9vbGVhbiB9KTogeyBiaW46IHN0cmluZzsgYXJnczogc3RyaW5nW10gfSB7XG4gIGNvbnN0IHdhaXQgPSBvcHRpb25zPy53YWl0ID8/IHRydWU7XG4gIGNvbnN0IGFwcE5hbWUgPSBTb25hbXUuY29uZmlnLmV4dGVybmFsRWRpdG9yID8/IFwiVmlzdWFsIFN0dWRpbyBDb2RlXCI7XG4gIGNvbnN0IG1hcHBpbmcgPSBFRElUT1JfQ0xJX01BUFthcHBOYW1lXTtcbiAgaWYgKCFtYXBwaW5nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYOyngOybkOuQmOyngCDslYrripQg7JeQ65SU7YSw7J6F64uI64ukOiAke2FwcE5hbWV9ICjsp4Dsm5A6ICR7T2JqZWN0LmtleXMoRURJVE9SX0NMSV9NQVApLmpvaW4oXCIsIFwiKX0pYCxcbiAgICApO1xuICB9XG5cbiAgY29uc3Qgc2VhcmNoUGF0aHMgPSBbXG4gICAgYC9BcHBsaWNhdGlvbnMvJHthcHBOYW1lfS5hcHBgLFxuICAgIGAke29zLmhvbWVkaXIoKX0vQXBwbGljYXRpb25zLyR7YXBwTmFtZX0uYXBwYCxcbiAgXTtcbiAgY29uc3QgYnVuZGxlUGF0aCA9IHNlYXJjaFBhdGhzLmZpbmQoKHApID0+IGZzLmV4aXN0c1N5bmMocCkpO1xuICBpZiAoIWJ1bmRsZVBhdGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYOyVsSDrsojrk6TsnYQg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7YXBwTmFtZX0gKC9BcHBsaWNhdGlvbnMg7ZmV7J24KWApO1xuICB9XG5cbiAgY29uc3QgY2xpQmluID0gcGF0aC5qb2luKGJ1bmRsZVBhdGgsIG1hcHBpbmcuY2xpKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGNsaUJpbikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYOyXkOuUlO2EsCBDTEnrpbwg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7Y2xpQmlufWApO1xuICB9XG5cbiAgcmV0dXJuIHsgYmluOiBjbGlCaW4sIGFyZ3M6IHdhaXQgPyBbbWFwcGluZy53YWl0RmxhZ10gOiBbXSB9O1xufVxuXG4vKiog7JeQ65SU7YSwIENMSeulvCDsi6TtlontlZjqs6Ag7YOt7J20IOuLq+2ekCDrlYzquYzsp4Ag64yA6riwICovXG5mdW5jdGlvbiBydW5FZGl0b3IoZWRpdG9yOiB7IGJpbjogc3RyaW5nOyBhcmdzOiBzdHJpbmdbXSB9LCBmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihlZGl0b3IuYmluLCBbLi4uZWRpdG9yLmFyZ3MsIGZpbGVQYXRoXSwge1xuICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgIH0pO1xuXG4gICAgY2hpbGQub24oXCJlcnJvclwiLCAoZXJyKSA9PiB7XG4gICAgICByZWplY3QobmV3IEVycm9yKGDsl5DrlJTthLAg7Iuk7ZaJIOyLpO2MqCAoJHtlZGl0b3IuYmlufSk6ICR7ZXJyLm1lc3NhZ2V9YCkpO1xuICAgIH0pO1xuXG4gICAgY2hpbGQub24oXCJjbG9zZVwiLCAoY29kZSkgPT4ge1xuICAgICAgaWYgKGNvZGUgPT09IDApIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihg7JeQ65SU7YSw6rCAIOu5hOygleyDgSDsooXro4zrkJjsl4jsirXri4jri6QgKGV4aXQgY29kZTogJHtjb2RlfSlgKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKiog7IaM7IqkIO2MjOydvOydhCDsmbjrtoAg7JeQ65SU7YSw66GcIOyXtOq4sCAo64yA6riw7ZWY7KeAIOyViuydjCkgKi9cbmV4cG9ydCBmdW5jdGlvbiBvcGVuU291cmNlRmlsZShmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGFic1BhdGggPSBwYXRoLmlzQWJzb2x1dGUoZmlsZVBhdGgpID8gZmlsZVBhdGggOiBwYXRoLnJlc29sdmUoU29uYW11LmFwaVJvb3RQYXRoLCBmaWxlUGF0aCk7XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGFic1BhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtjIzsnbzsnYQg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gIH1cblxuICBjb25zdCBlZGl0b3IgPSByZXNvbHZlRWRpdG9yQ2xpKHsgd2FpdDogZmFsc2UgfSk7XG4gIGNvbnN0IGNoaWxkID0gc3Bhd24oZWRpdG9yLmJpbiwgWy4uLmVkaXRvci5hcmdzLCBhYnNQYXRoXSwge1xuICAgIHN0ZGlvOiBcImlnbm9yZVwiLFxuICAgIGRldGFjaGVkOiB0cnVlLFxuICB9KTtcbiAgY2hpbGQudW5yZWYoKTtcbn1cbiJdLCJuYW1lcyI6WyJzcGF3biIsImNyeXB0byIsImZzIiwib3MiLCJwYXRoIiwiU29uYW11IiwiZ2V0Q29udHJhY3REaXIiLCJqb2luIiwiYXBpUm9vdFBhdGgiLCJhc3NlcnRJbnNpZGVDb250cmFjdERpciIsImZpbGVQYXRoIiwiY29udHJhY3REaXIiLCJyZXNvbHZlZCIsInJlc29sdmUiLCJzdGFydHNXaXRoIiwic2VwIiwiRXJyb3IiLCJkZXRlY3RGaWxlVHlwZSIsImZpbGVOYW1lIiwiZW5kc1dpdGgiLCJ1bmRlZmluZWQiLCJzY2FuRGlyZWN0b3J5IiwiZGlyUGF0aCIsInJlbGF0aXZlVG8iLCJlbnRyaWVzIiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwibm9kZXMiLCJlbnRyeSIsImZ1bGxQYXRoIiwibmFtZSIsInJlbFBhdGgiLCJyZWxhdGl2ZSIsImlzRGlyZWN0b3J5IiwiY2hpbGRyZW4iLCJwdXNoIiwidHlwZSIsImlzRmlsZSIsImZpbGVUeXBlIiwiZ2V0Q2RkVHJlZSIsImV4aXN0c1N5bmMiLCJleGlzdHMiLCJ0cmVlIiwiY29udGVudFRvU3RyaW5nIiwiY29udGVudCIsIkFycmF5IiwiaXNBcnJheSIsInJlYWRDb250ZW50IiwiYWJzUGF0aCIsInJhdyIsInJlYWRGaWxlU3luYyIsImpzb24iLCJKU09OIiwicGFyc2UiLCJlZGl0Q29udGVudCIsImVkaXRvciIsInJlc29sdmVFZGl0b3JDbGkiLCJ0bXBGaWxlTmFtZSIsInJhbmRvbVVVSUQiLCJ0bXBGaWxlUGF0aCIsInRtcGRpciIsIndyaXRlRmlsZVN5bmMiLCJydW5FZGl0b3IiLCJlZGl0ZWQiLCJzcGxpdCIsInRvZGF5IiwiRGF0ZSIsInl5eXkiLCJnZXRGdWxsWWVhciIsIm1tIiwiU3RyaW5nIiwiZ2V0TW9udGgiLCJwYWRTdGFydCIsImRkIiwiZ2V0RGF0ZSIsImxhc3RNb2RpZmllZCIsInN0cmluZ2lmeSIsInN1Y2Nlc3MiLCJ1bmxpbmtTeW5jIiwiRURJVE9SX0NMSV9NQVAiLCJjbGkiLCJ3YWl0RmxhZyIsIlplZCIsIkN1cnNvciIsIm9wdGlvbnMiLCJ3YWl0IiwiYXBwTmFtZSIsImNvbmZpZyIsImV4dGVybmFsRWRpdG9yIiwibWFwcGluZyIsIk9iamVjdCIsImtleXMiLCJzZWFyY2hQYXRocyIsImhvbWVkaXIiLCJidW5kbGVQYXRoIiwiZmluZCIsInAiLCJjbGlCaW4iLCJiaW4iLCJhcmdzIiwiUHJvbWlzZSIsInJlamVjdCIsImNoaWxkIiwic3RkaW8iLCJvbiIsImVyciIsIm1lc3NhZ2UiLCJjb2RlIiwib3BlblNvdXJjZUZpbGUiLCJpc0Fic29sdXRlIiwiZGV0YWNoZWQiLCJ1bnJlZiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsS0FBSyxRQUFRLGdCQUFnQjtBQUN0QyxPQUFPQyxZQUFZLFNBQVM7QUFDNUIsT0FBT0MsUUFBUSxLQUFLO0FBQ3BCLE9BQU9DLFFBQVEsS0FBSztBQUNwQixPQUFPQyxVQUFVLE9BQU87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
|
|
305
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91aS9jZGQtc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgb3MgZnJvbSBcIm9zXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaS9zb25hbXVcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ2RkQ29udGVudEVudmVsb3BlLFxuICBDZGRGaWxlVHlwZSxcbiAgQ2RkU2NoZW1hLFxuICBDZGRTY2hlbWFEZXRhaWxFbnZlbG9wZSxcbiAgQ2RkU2NoZW1hUmVmZXJlbmNlLFxuICBDZGRTY2hlbWFTdW1tYXJ5LFxuICBDZGRUcmVlTm9kZSxcbn0gZnJvbSBcIi4vY2RkLXR5cGVzXCI7XG5cbmV4cG9ydCB0eXBlIHtcbiAgQ2RkQ29udGVudEVudmVsb3BlLFxuICBDZGRGaWxlVHlwZSxcbiAgQ2RkU2NoZW1hLFxuICBDZGRTY2hlbWFEZXRhaWxFbnZlbG9wZSxcbiAgQ2RkU2NoZW1hRmllbGQsXG4gIENkZFNjaGVtYUZpZWxkVHlwZSxcbiAgQ2RkU2NoZW1hUmVmZXJlbmNlLFxuICBDZGRTY2hlbWFTdW1tYXJ5LFxuICBDZGRUcmVlTm9kZSxcbn0gZnJvbSBcIi4vY2RkLXR5cGVzXCI7XG5cbi8qKiBjb250cmFjdC8g65SU66CJ7YSw66asIOygiOuMgCDqsr3roZwg67CY7ZmYIChhcGlSb290UGF0aCDquLDspIApICovXG5mdW5jdGlvbiBnZXRDb250cmFjdERpcigpOiBzdHJpbmcge1xuICByZXR1cm4gcGF0aC5qb2luKFNvbmFtdS5hcGlSb290UGF0aCwgXCIuLlwiLCBcIi4uXCIsIFwiY29udHJhY3RcIik7XG59XG5cbi8qKiDqsr3roZzqsIAgY29udHJhY3QvIOuUlOugie2EsOumrCDrgrTrtoDsnbjsp4Ag6rKA7KadICovXG5mdW5jdGlvbiBhc3NlcnRJbnNpZGVDb250cmFjdERpcihmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBwYXRoLnJlc29sdmUoY29udHJhY3REaXIsIGZpbGVQYXRoKTtcbiAgaWYgKCFyZXNvbHZlZC5zdGFydHNXaXRoKGNvbnRyYWN0RGlyICsgcGF0aC5zZXApICYmIHJlc29sdmVkICE9PSBjb250cmFjdERpcikge1xuICAgIHRocm93IG5ldyBFcnJvcihg6rK966Gc6rCAIGNvbnRyYWN0LyDrlJTroInthLDrpqwg67CW7J2EIOywuOyhsO2VqeuLiOuLpDogJHtmaWxlUGF0aH1gKTtcbiAgfVxufVxuXG4vKiog7YyM7J2866qF7JeQ7IScIENkZEZpbGVUeXBlIO2MkOuzhCAqL1xuZnVuY3Rpb24gZGV0ZWN0RmlsZVR5cGUoZmlsZU5hbWU6IHN0cmluZyk6IENkZEZpbGVUeXBlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGZpbGVOYW1lLmVuZHNXaXRoKFwiLmNvbnRyYWN0Lmpzb25cIikpIHJldHVybiBcImNvbnRyYWN0XCI7XG4gIGlmIChmaWxlTmFtZS5lbmRzV2l0aChcIi5zcGVjLmpzb25cIikpIHJldHVybiBcInNwZWNcIjtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqIOuUlOugie2EsOumrOulvCDsnqzqt4Ag7YOQ7IOJ7ZWY7JesIENkZFRyZWVOb2RlIO2KuOumrOulvCDsg53shLEgKi9cbmZ1bmN0aW9uIHNjYW5EaXJlY3RvcnkoZGlyUGF0aDogc3RyaW5nLCByZWxhdGl2ZVRvOiBzdHJpbmcpOiBDZGRUcmVlTm9kZVtdIHtcbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgY29uc3Qgbm9kZXM6IENkZFRyZWVOb2RlW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBlbnRyeS5uYW1lKTtcbiAgICBjb25zdCByZWxQYXRoID0gcGF0aC5yZWxhdGl2ZShyZWxhdGl2ZVRvLCBmdWxsUGF0aCk7XG5cbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgY29uc3QgY2hpbGRyZW4gPSBzY2FuRGlyZWN0b3J5KGZ1bGxQYXRoLCByZWxhdGl2ZVRvKTtcbiAgICAgIG5vZGVzLnB1c2goe1xuICAgICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICB0eXBlOiBcImRpcmVjdG9yeVwiLFxuICAgICAgICBjaGlsZHJlbixcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoZW50cnkuaXNGaWxlKCkpIHtcbiAgICAgIGNvbnN0IGZpbGVUeXBlID0gZGV0ZWN0RmlsZVR5cGUoZW50cnkubmFtZSk7XG4gICAgICBpZiAoZmlsZVR5cGUpIHtcbiAgICAgICAgbm9kZXMucHVzaCh7XG4gICAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgICAgICBwYXRoOiByZWxQYXRoLFxuICAgICAgICAgIHR5cGU6IFwiZmlsZVwiLFxuICAgICAgICAgIGZpbGVUeXBlLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9kZXM7XG59XG5cbi8qKiBjb250cmFjdC8g65SU66CJ7YSw66as7J2YIO2KuOumrCDqtazsobDrpbwg67CY7ZmYICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q2RkVHJlZSgpOiB7IGV4aXN0czogYm9vbGVhbjsgdHJlZTogQ2RkVHJlZU5vZGVbXSB9IHtcbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY29udHJhY3REaXIpKSB7XG4gICAgcmV0dXJuIHsgZXhpc3RzOiBmYWxzZSwgdHJlZTogW10gfTtcbiAgfVxuICBjb25zdCB0cmVlID0gc2NhbkRpcmVjdG9yeShjb250cmFjdERpciwgY29udHJhY3REaXIpO1xuICByZXR1cm4geyBleGlzdHM6IHRydWUsIHRyZWUgfTtcbn1cblxuLyoqIHNjaGVtYSBJROuhnCBzY2hlbWEg7YyM7J287J2EIOywvuyVhCDrsJjtmZggKi9cbmZ1bmN0aW9uIHJlc29sdmVTY2hlbWEoc2NoZW1hSWQ6IHN0cmluZyk6IENkZFNjaGVtYSB8IG51bGwge1xuICBjb25zdCBjb250cmFjdERpciA9IGdldENvbnRyYWN0RGlyKCk7XG4gIGNvbnN0IHNjaGVtYVBhdGggPSBwYXRoLmpvaW4oY29udHJhY3REaXIsIFwic2NoZW1hc1wiLCBgJHtzY2hlbWFJZH0uc2NoZW1hLmpzb25gKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNjaGVtYVBhdGgpKSByZXR1cm4gbnVsbDtcbiAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKHNjaGVtYVBhdGgsIFwidXRmLThcIik7XG4gIHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgQ2RkU2NoZW1hO1xufVxuXG4vKiogSlNPTiDtjIzsnbzsnZgg7KCE7LK0IOuCtOyaqeydhCDsnb3slrQgc2NoZW1h7JmAIO2VqOq7mCBlbnZlbG9wZeuhnCDrsJjtmZggKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkQ29udGVudChmaWxlUGF0aDogc3RyaW5nKTogQ2RkQ29udGVudEVudmVsb3BlIHtcbiAgYXNzZXJ0SW5zaWRlQ29udHJhY3REaXIoZmlsZVBhdGgpO1xuXG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgYWJzUGF0aCA9IHBhdGgucmVzb2x2ZShjb250cmFjdERpciwgZmlsZVBhdGgpO1xuXG4gIGlmICghZnMuZXhpc3RzU3luYyhhYnNQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7YyM7J287J2EIOywvuydhCDsiJgg7JeG7Iq164uI64ukOiAke2ZpbGVQYXRofWApO1xuICB9XG5cbiAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKGFic1BhdGgsIFwidXRmLThcIik7XG4gIGNvbnN0IGRvY3VtZW50ID0gSlNPTi5wYXJzZShyYXcpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCBmaWxlVHlwZSA9IGRldGVjdEZpbGVUeXBlKHBhdGguYmFzZW5hbWUoZmlsZVBhdGgpKTtcbiAgY29uc3Qgc2NoZW1hSWQgPSB0eXBlb2YgZG9jdW1lbnQuc2NoZW1hID09PSBcInN0cmluZ1wiID8gZG9jdW1lbnQuc2NoZW1hIDogbnVsbDtcbiAgY29uc3Qgc2NoZW1hID0gc2NoZW1hSWQgPyByZXNvbHZlU2NoZW1hKHNjaGVtYUlkKSA6IG51bGw7XG5cbiAgcmV0dXJuIHtcbiAgICBkb2N1bWVudCxcbiAgICBzY2hlbWEsXG4gICAgZmlsZVR5cGU6IGZpbGVUeXBlID8/IFwiY29udHJhY3RcIixcbiAgfTtcbn1cblxuLyoqIEpTT04g7YyM7J287J2EIOyZuOu2gCDsl5DrlJTthLDroZwg7KeB7KCRIO2OuOynkSAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVkaXRDb250ZW50KFxuICBmaWxlUGF0aDogc3RyaW5nLFxuKTogUHJvbWlzZTx7IHN1Y2Nlc3M6IGJvb2xlYW47IGZpbGVQYXRoOiBzdHJpbmcgfT4ge1xuICBhc3NlcnRJbnNpZGVDb250cmFjdERpcihmaWxlUGF0aCk7XG5cbiAgY29uc3QgY29udHJhY3REaXIgPSBnZXRDb250cmFjdERpcigpO1xuICBjb25zdCBhYnNQYXRoID0gcGF0aC5yZXNvbHZlKGNvbnRyYWN0RGlyLCBmaWxlUGF0aCk7XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGFic1BhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtjIzsnbzsnYQg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gIH1cblxuICBjb25zdCBlZGl0b3IgPSByZXNvbHZlRWRpdG9yQ2xpKCk7XG4gIGF3YWl0IHJ1bkVkaXRvcihlZGl0b3IsIGFic1BhdGgpO1xuXG4gIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIGZpbGVQYXRoIH07XG59XG5cbi8qKiDsl5DrlJTthLDrs4Qg7JWxIOuyiOuTpCDrgrQgQ0xJIOqyveuhnCArIC0td2FpdCDtlIzrnpjqt7gg66ek7ZWRICovXG5jb25zdCBFRElUT1JfQ0xJX01BUDogUmVjb3JkPHN0cmluZywgeyBjbGk6IHN0cmluZzsgd2FpdEZsYWc6IHN0cmluZyB9PiA9IHtcbiAgXCJWaXN1YWwgU3R1ZGlvIENvZGVcIjogeyBjbGk6IFwiQ29udGVudHMvUmVzb3VyY2VzL2FwcC9iaW4vY29kZVwiLCB3YWl0RmxhZzogXCItLXdhaXRcIiB9LFxuICBaZWQ6IHsgY2xpOiBcIkNvbnRlbnRzL01hY09TL2NsaVwiLCB3YWl0RmxhZzogXCItLXdhaXRcIiB9LFxuICBDdXJzb3I6IHsgY2xpOiBcIkNvbnRlbnRzL1Jlc291cmNlcy9hcHAvYmluL2N1cnNvclwiLCB3YWl0RmxhZzogXCItLXdhaXRcIiB9LFxufTtcblxuLyoqIOyVsSDrsojrk6QgQ0xJIOqyveuhnOulvCByZXNvbHZlLiB3YWl0PWZhbHNl7J2066m0IC0td2FpdCDtlIzrnpjqt7jrpbwg7IOd6561ICovXG5mdW5jdGlvbiByZXNvbHZlRWRpdG9yQ2xpKG9wdGlvbnM/OiB7IHdhaXQ/OiBib29sZWFuIH0pOiB7IGJpbjogc3RyaW5nOyBhcmdzOiBzdHJpbmdbXSB9IHtcbiAgY29uc3Qgd2FpdCA9IG9wdGlvbnM/LndhaXQgPz8gdHJ1ZTtcbiAgY29uc3QgYXBwTmFtZSA9IFNvbmFtdS5jb25maWcuZXh0ZXJuYWxFZGl0b3IgPz8gXCJWaXN1YWwgU3R1ZGlvIENvZGVcIjtcbiAgY29uc3QgbWFwcGluZyA9IEVESVRPUl9DTElfTUFQW2FwcE5hbWVdO1xuICBpZiAoIW1hcHBpbmcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBg7KeA7JuQ65CY7KeAIOyViuuKlCDsl5DrlJTthLDsnoXri4jri6Q6ICR7YXBwTmFtZX0gKOyngOybkDogJHtPYmplY3Qua2V5cyhFRElUT1JfQ0xJX01BUCkuam9pbihcIiwgXCIpfSlgLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBzZWFyY2hQYXRocyA9IFtcbiAgICBgL0FwcGxpY2F0aW9ucy8ke2FwcE5hbWV9LmFwcGAsXG4gICAgYCR7b3MuaG9tZWRpcigpfS9BcHBsaWNhdGlvbnMvJHthcHBOYW1lfS5hcHBgLFxuICBdO1xuICBjb25zdCBidW5kbGVQYXRoID0gc2VhcmNoUGF0aHMuZmluZCgocCkgPT4gZnMuZXhpc3RzU3luYyhwKSk7XG4gIGlmICghYnVuZGxlUGF0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7JWxIOuyiOuTpOydhCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHthcHBOYW1lfSAoL0FwcGxpY2F0aW9ucyDtmZXsnbgpYCk7XG4gIH1cblxuICBjb25zdCBjbGlCaW4gPSBwYXRoLmpvaW4oYnVuZGxlUGF0aCwgbWFwcGluZy5jbGkpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoY2xpQmluKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihg7JeQ65SU7YSwIENMSeulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHtjbGlCaW59YCk7XG4gIH1cblxuICByZXR1cm4geyBiaW46IGNsaUJpbiwgYXJnczogd2FpdCA/IFttYXBwaW5nLndhaXRGbGFnXSA6IFtdIH07XG59XG5cbi8qKiDsl5DrlJTthLAgQ0xJ66W8IOyLpO2Wie2VmOqzoCDtg63snbQg64ur7Z6QIOuVjOq5jOyngCDrjIDquLAgKi9cbmZ1bmN0aW9uIHJ1bkVkaXRvcihlZGl0b3I6IHsgYmluOiBzdHJpbmc7IGFyZ3M6IHN0cmluZ1tdIH0sIGZpbGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGVkaXRvci5iaW4sIFsuLi5lZGl0b3IuYXJncywgZmlsZVBhdGhdLCB7XG4gICAgICBzdGRpbzogXCJpbmhlcml0XCIsXG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbihcImVycm9yXCIsIChlcnIpID0+IHtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoYOyXkOuUlO2EsCDsi6Ttlokg7Iuk7YyoICgke2VkaXRvci5iaW59KTogJHtlcnIubWVzc2FnZX1gKSk7XG4gICAgfSk7XG5cbiAgICBjaGlsZC5vbihcImNsb3NlXCIsIChjb2RlKSA9PiB7XG4gICAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWplY3QobmV3IEVycm9yKGDsl5DrlJTthLDqsIAg67mE7KCV7IOBIOyiheujjOuQmOyXiOyKteuLiOuLpCAoZXhpdCBjb2RlOiAke2NvZGV9KWApKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2NoZW1hIOq0gOumrCBBUElcbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqL1xuXG4vKiogY29udHJhY3Qvc2NoZW1hcy8g65SU66CJ7YSw66asIOuCtCAuc2NoZW1hLmpzb24g7YyM7J28IOqyveuhnCDrqqnroZ0g67CY7ZmYICovXG5mdW5jdGlvbiBzY2FuU2NoZW1hRmlsZXMoKTogeyBhYnNQYXRoOiBzdHJpbmc7IHJlbFBhdGg6IHN0cmluZzsgZmlsZU5hbWU6IHN0cmluZyB9W10ge1xuICBjb25zdCBzY2hlbWFzRGlyID0gcGF0aC5qb2luKGdldENvbnRyYWN0RGlyKCksIFwic2NoZW1hc1wiKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNjaGVtYXNEaXIpKSByZXR1cm4gW107XG5cbiAgcmV0dXJuIGZzXG4gICAgLnJlYWRkaXJTeW5jKHNjaGVtYXNEaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuICAgIC5maWx0ZXIoKGUpID0+IGUuaXNGaWxlKCkgJiYgZS5uYW1lLmVuZHNXaXRoKFwiLnNjaGVtYS5qc29uXCIpKVxuICAgIC5tYXAoKGUpID0+ICh7XG4gICAgICBhYnNQYXRoOiBwYXRoLmpvaW4oc2NoZW1hc0RpciwgZS5uYW1lKSxcbiAgICAgIHJlbFBhdGg6IGBzY2hlbWFzLyR7ZS5uYW1lfWAsXG4gICAgICBmaWxlTmFtZTogZS5uYW1lLFxuICAgIH0pKTtcbn1cblxuLyoqIO2KueyglSBzY2hlbWFJZOulvCDssLjsobDtlZjripQgY29udHJhY3Qvc3BlYyDrrLjshJzrk6TsnYQg7J6s6reAIOyImOynkSAqL1xuZnVuY3Rpb24gY29sbGVjdFNjaGVtYVJlZmVyZW5jZXMoXG4gIHNjaGVtYUlkOiBzdHJpbmcsXG4gIGRpclBhdGg6IHN0cmluZyxcbiAgcmVsYXRpdmVUbzogc3RyaW5nLFxuKTogQ2RkU2NoZW1hUmVmZXJlbmNlW10ge1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyUGF0aCkpIHJldHVybiBbXTtcbiAgY29uc3QgcmVmczogQ2RkU2NoZW1hUmVmZXJlbmNlW10gPSBbXTtcbiAgY29uc3QgZW50cmllcyA9IGZzLnJlYWRkaXJTeW5jKGRpclBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICBjb25zdCBmdWxsUGF0aCA9IHBhdGguam9pbihkaXJQYXRoLCBlbnRyeS5uYW1lKTtcbiAgICBpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgaWYgKGVudHJ5Lm5hbWUgPT09IFwic2NoZW1hc1wiKSBjb250aW51ZTtcbiAgICAgIHJlZnMucHVzaCguLi5jb2xsZWN0U2NoZW1hUmVmZXJlbmNlcyhzY2hlbWFJZCwgZnVsbFBhdGgsIHJlbGF0aXZlVG8pKTtcbiAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRmlsZSgpKSB7XG4gICAgICBjb25zdCBmaWxlVHlwZSA9IGRldGVjdEZpbGVUeXBlKGVudHJ5Lm5hbWUpO1xuICAgICAgaWYgKCFmaWxlVHlwZSkgY29udGludWU7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByYXcgPSBmcy5yZWFkRmlsZVN5bmMoZnVsbFBhdGgsIFwidXRmLThcIik7XG4gICAgICAgIGNvbnN0IGRvYyA9IEpTT04ucGFyc2UocmF3KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgaWYgKGRvYy5zY2hlbWEgPT09IHNjaGVtYUlkKSB7XG4gICAgICAgICAgcmVmcy5wdXNoKHtcbiAgICAgICAgICAgIHBhdGg6IHBhdGgucmVsYXRpdmUocmVsYXRpdmVUbywgZnVsbFBhdGgpLFxuICAgICAgICAgICAgZmlsZVR5cGUsXG4gICAgICAgICAgICBuYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gSlNPTiDtjIzsi7Eg7Iuk7YyoIOyLnCDrrLTsi5xcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlZnM7XG59XG5cbi8qKiBzY2hlbWEg7YyM7J2866qF7JeQ7IScIOq4sOuMgOuQmOuKlCBpZCDstpTstpwgKi9cbmZ1bmN0aW9uIGV4cGVjdGVkU2NoZW1hSWQoZmlsZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBmaWxlTmFtZS5yZXBsYWNlKC9cXC5zY2hlbWFcXC5qc29uJC8sIFwiXCIpO1xufVxuXG4vKiogc2NoZW1hcy8g7ZWY7JyEIOqyveuhnOqwgCBjb250cmFjdC9zY2hlbWFzLyDrgrTrtoDsnbjsp4Ag6rKA7KadICovXG5mdW5jdGlvbiBhc3NlcnRJbnNpZGVTY2hlbWFEaXIoc2NoZW1hS2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qgc2NoZW1hc0RpciA9IHBhdGguam9pbihnZXRDb250cmFjdERpcigpLCBcInNjaGVtYXNcIik7XG4gIGNvbnN0IHJlc29sdmVkID0gcGF0aC5yZXNvbHZlKHNjaGVtYXNEaXIsIGAke3NjaGVtYUtleX0uc2NoZW1hLmpzb25gKTtcbiAgaWYgKCFyZXNvbHZlZC5zdGFydHNXaXRoKHNjaGVtYXNEaXIgKyBwYXRoLnNlcCkgJiYgcmVzb2x2ZWQgIT09IHNjaGVtYXNEaXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYOycoO2aqO2VmOyngCDslYrsnYAg7Iqk7YKk66eIIO2CpOyeheuLiOuLpDogJHtzY2hlbWFLZXl9YCk7XG4gIH1cbn1cblxuLyoqIHNjaGVtYSDrqqnroZ0g67CY7ZmYICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdFNjaGVtYXMoKTogeyBzY2hlbWFzOiBDZGRTY2hlbWFTdW1tYXJ5W10gfSB7XG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgZmlsZXMgPSBzY2FuU2NoZW1hRmlsZXMoKTtcbiAgY29uc3Qgc2NoZW1hczogQ2RkU2NoZW1hU3VtbWFyeVtdID0gW107XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgY29uc3Qga2V5ID0gZXhwZWN0ZWRTY2hlbWFJZChmaWxlLmZpbGVOYW1lKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUuYWJzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgICAgIGNvbnN0IHNjaGVtYSA9IEpTT04ucGFyc2UocmF3KSBhcyBDZGRTY2hlbWE7XG4gICAgICBjb25zdCByZWZzID0gY29sbGVjdFNjaGVtYVJlZmVyZW5jZXMoc2NoZW1hLmlkLCBjb250cmFjdERpciwgY29udHJhY3REaXIpO1xuICAgICAgc2NoZW1hcy5wdXNoKHtcbiAgICAgICAga2V5LFxuICAgICAgICBpZDogc2NoZW1hLmlkLFxuICAgICAgICBwYXRoOiBmaWxlLnJlbFBhdGgsXG4gICAgICAgIHR5cGU6IHNjaGVtYS50eXBlLFxuICAgICAgICBmaWVsZENvdW50OiBzY2hlbWEuZmllbGRzLmxlbmd0aCxcbiAgICAgICAgcmVmZXJlbmNlQ291bnQ6IHJlZnMubGVuZ3RoLFxuICAgICAgICBoYXNJZE1pc21hdGNoOiBzY2hlbWEuaWQgIT09IGtleSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc2NoZW1hcy5wdXNoKHtcbiAgICAgICAga2V5LFxuICAgICAgICBpZDoga2V5LFxuICAgICAgICBwYXRoOiBmaWxlLnJlbFBhdGgsXG4gICAgICAgIHR5cGU6IFwiY29udHJhY3RcIixcbiAgICAgICAgZmllbGRDb3VudDogMCxcbiAgICAgICAgcmVmZXJlbmNlQ291bnQ6IDAsXG4gICAgICAgIGhhc0lkTWlzbWF0Y2g6IGZhbHNlLFxuICAgICAgICBwYXJzZUVycm9yOiBlcnIgaW5zdGFuY2VvZiBFcnJvciA/IGVyci5tZXNzYWdlIDogU3RyaW5nKGVyciksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4geyBzY2hlbWFzIH07XG59XG5cbi8qKiBzY2hlbWEg7IOB7IS4IOuwmO2ZmCAo7YyM7J2866qFIOq4sOuwmCBrZXnroZwg7KGw7ZqMKSAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlYWRTY2hlbWEoc2NoZW1hS2V5OiBzdHJpbmcpOiBDZGRTY2hlbWFEZXRhaWxFbnZlbG9wZSB7XG4gIGFzc2VydEluc2lkZVNjaGVtYURpcihzY2hlbWFLZXkpO1xuXG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgYWJzUGF0aCA9IHBhdGguam9pbihjb250cmFjdERpciwgXCJzY2hlbWFzXCIsIGAke3NjaGVtYUtleX0uc2NoZW1hLmpzb25gKTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYOyKpO2CpOuniOulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHtzY2hlbWFLZXl9YCk7XG4gIH1cblxuICBjb25zdCByYXcgPSBmcy5yZWFkRmlsZVN5bmMoYWJzUGF0aCwgXCJ1dGYtOFwiKTtcbiAgY29uc3Qgc2NoZW1hID0gSlNPTi5wYXJzZShyYXcpIGFzIENkZFNjaGVtYTtcbiAgY29uc3QgcmVsUGF0aCA9IHBhdGgucmVsYXRpdmUoY29udHJhY3REaXIsIGFic1BhdGgpO1xuICBjb25zdCByZWZlcmVuY2VzID0gY29sbGVjdFNjaGVtYVJlZmVyZW5jZXMoc2NoZW1hLmlkLCBjb250cmFjdERpciwgY29udHJhY3REaXIpO1xuXG4gIHJldHVybiB7XG4gICAga2V5OiBzY2hlbWFLZXksXG4gICAgcGF0aDogcmVsUGF0aCxcbiAgICBzY2hlbWEsXG4gICAgcmVmZXJlbmNlcyxcbiAgICBoYXNJZE1pc21hdGNoOiBzY2hlbWEuaWQgIT09IHNjaGVtYUtleSxcbiAgfTtcbn1cblxuLyoqIHNjaGVtYSDtjIzsnbzsnYQg7Jm467aAIOyXkOuUlO2EsOuhnCDtjrjsp5EgKO2MjOydvOuqhSDquLDrsJgga2V566GcIOyhsO2ajCkgKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBlZGl0U2NoZW1hKFxuICBzY2hlbWFLZXk6IHN0cmluZyxcbik6IFByb21pc2U8eyBzdWNjZXNzOiBib29sZWFuOyBzY2hlbWFLZXk6IHN0cmluZyB9PiB7XG4gIGFzc2VydEluc2lkZVNjaGVtYURpcihzY2hlbWFLZXkpO1xuXG4gIGNvbnN0IGNvbnRyYWN0RGlyID0gZ2V0Q29udHJhY3REaXIoKTtcbiAgY29uc3QgYWJzUGF0aCA9IHBhdGguam9pbihjb250cmFjdERpciwgXCJzY2hlbWFzXCIsIGAke3NjaGVtYUtleX0uc2NoZW1hLmpzb25gKTtcblxuICBpZiAoIWZzLmV4aXN0c1N5bmMoYWJzUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYOyKpO2CpOuniOulvCDssL7snYQg7IiYIOyXhuyKteuLiOuLpDogJHtzY2hlbWFLZXl9YCk7XG4gIH1cblxuICBjb25zdCBlZGl0b3IgPSByZXNvbHZlRWRpdG9yQ2xpKCk7XG4gIGF3YWl0IHJ1bkVkaXRvcihlZGl0b3IsIGFic1BhdGgpO1xuXG4gIHJldHVybiB7IHN1Y2Nlc3M6IHRydWUsIHNjaGVtYUtleSB9O1xufVxuXG4vKiog7IaM7IqkIO2MjOydvOydhCDsmbjrtoAg7JeQ65SU7YSw66GcIOyXtOq4sCAo64yA6riw7ZWY7KeAIOyViuydjCkgKi9cbmV4cG9ydCBmdW5jdGlvbiBvcGVuU291cmNlRmlsZShmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGFic1BhdGggPSBwYXRoLmlzQWJzb2x1dGUoZmlsZVBhdGgpID8gZmlsZVBhdGggOiBwYXRoLnJlc29sdmUoU29uYW11LmFwaVJvb3RQYXRoLCBmaWxlUGF0aCk7XG5cbiAgaWYgKCFmcy5leGlzdHNTeW5jKGFic1BhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGDtjIzsnbzsnYQg7LC+7J2EIOyImCDsl4bsirXri4jri6Q6ICR7ZmlsZVBhdGh9YCk7XG4gIH1cblxuICBjb25zdCBlZGl0b3IgPSByZXNvbHZlRWRpdG9yQ2xpKHsgd2FpdDogZmFsc2UgfSk7XG4gIGNvbnN0IGNoaWxkID0gc3Bhd24oZWRpdG9yLmJpbiwgWy4uLmVkaXRvci5hcmdzLCBhYnNQYXRoXSwge1xuICAgIHN0ZGlvOiBcImlnbm9yZVwiLFxuICAgIGRldGFjaGVkOiB0cnVlLFxuICB9KTtcbiAgY2hpbGQudW5yZWYoKTtcbn1cbiJdLCJuYW1lcyI6WyJzcGF3biIsImZzIiwib3MiLCJwYXRoIiwiU29uYW11IiwiZ2V0Q29udHJhY3REaXIiLCJqb2luIiwiYXBpUm9vdFBhdGgiLCJhc3NlcnRJbnNpZGVDb250cmFjdERpciIsImZpbGVQYXRoIiwiY29udHJhY3REaXIiLCJyZXNvbHZlZCIsInJlc29sdmUiLCJzdGFydHNXaXRoIiwic2VwIiwiRXJyb3IiLCJkZXRlY3RGaWxlVHlwZSIsImZpbGVOYW1lIiwiZW5kc1dpdGgiLCJ1bmRlZmluZWQiLCJzY2FuRGlyZWN0b3J5IiwiZGlyUGF0aCIsInJlbGF0aXZlVG8iLCJlbnRyaWVzIiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwibm9kZXMiLCJlbnRyeSIsImZ1bGxQYXRoIiwibmFtZSIsInJlbFBhdGgiLCJyZWxhdGl2ZSIsImlzRGlyZWN0b3J5IiwiY2hpbGRyZW4iLCJwdXNoIiwidHlwZSIsImlzRmlsZSIsImZpbGVUeXBlIiwiZ2V0Q2RkVHJlZSIsImV4aXN0c1N5bmMiLCJleGlzdHMiLCJ0cmVlIiwicmVzb2x2ZVNjaGVtYSIsInNjaGVtYUlkIiwic2NoZW1hUGF0aCIsInJhdyIsInJlYWRGaWxlU3luYyIsIkpTT04iLCJwYXJzZSIsInJlYWRDb250ZW50IiwiYWJzUGF0aCIsImRvY3VtZW50IiwiYmFzZW5hbWUiLCJzY2hlbWEiLCJlZGl0Q29udGVudCIsImVkaXRvciIsInJlc29sdmVFZGl0b3JDbGkiLCJydW5FZGl0b3IiLCJzdWNjZXNzIiwiRURJVE9SX0NMSV9NQVAiLCJjbGkiLCJ3YWl0RmxhZyIsIlplZCIsIkN1cnNvciIsIm9wdGlvbnMiLCJ3YWl0IiwiYXBwTmFtZSIsImNvbmZpZyIsImV4dGVybmFsRWRpdG9yIiwibWFwcGluZyIsIk9iamVjdCIsImtleXMiLCJzZWFyY2hQYXRocyIsImhvbWVkaXIiLCJidW5kbGVQYXRoIiwiZmluZCIsInAiLCJjbGlCaW4iLCJiaW4iLCJhcmdzIiwiUHJvbWlzZSIsInJlamVjdCIsImNoaWxkIiwic3RkaW8iLCJvbiIsImVyciIsIm1lc3NhZ2UiLCJjb2RlIiwic2NhblNjaGVtYUZpbGVzIiwic2NoZW1hc0RpciIsImZpbHRlciIsImUiLCJtYXAiLCJjb2xsZWN0U2NoZW1hUmVmZXJlbmNlcyIsInJlZnMiLCJkb2MiLCJleHBlY3RlZFNjaGVtYUlkIiwicmVwbGFjZSIsImFzc2VydEluc2lkZVNjaGVtYURpciIsInNjaGVtYUtleSIsImxpc3RTY2hlbWFzIiwiZmlsZXMiLCJzY2hlbWFzIiwiZmlsZSIsImtleSIsImlkIiwiZmllbGRDb3VudCIsImZpZWxkcyIsImxlbmd0aCIsInJlZmVyZW5jZUNvdW50IiwiaGFzSWRNaXNtYXRjaCIsInBhcnNlRXJyb3IiLCJTdHJpbmciLCJyZWFkU2NoZW1hIiwicmVmZXJlbmNlcyIsImVkaXRTY2hlbWEiLCJvcGVuU291cmNlRmlsZSIsImlzQWJzb2x1dGUiLCJkZXRh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
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
export type CddFileType = "contract" | "spec";
|
|
2
|
+
export type CddSchemaFieldType = "string" | "string[]" | "Record<string, string>" | "Record<string, object>";
|
|
3
|
+
export type CddSchemaField = {
|
|
4
|
+
name: string;
|
|
5
|
+
label?: string;
|
|
6
|
+
type: CddSchemaFieldType;
|
|
7
|
+
renderer?: string;
|
|
8
|
+
required: boolean;
|
|
9
|
+
};
|
|
10
|
+
export type CddSchema = {
|
|
11
|
+
id: string;
|
|
12
|
+
type: "contract" | "spec";
|
|
13
|
+
fields: CddSchemaField[];
|
|
14
|
+
};
|
|
15
|
+
export type CddContentEnvelope = {
|
|
16
|
+
document: Record<string, unknown>;
|
|
17
|
+
schema: CddSchema | null;
|
|
18
|
+
fileType: CddFileType;
|
|
19
|
+
};
|
|
20
|
+
export type CddTreeNode = {
|
|
21
|
+
name: string;
|
|
22
|
+
path: string;
|
|
23
|
+
type: "file" | "directory";
|
|
24
|
+
fileType?: CddFileType;
|
|
25
|
+
children?: CddTreeNode[];
|
|
26
|
+
};
|
|
27
|
+
export type CddSchemaSummary = {
|
|
28
|
+
key: string;
|
|
29
|
+
id: string;
|
|
30
|
+
path: string;
|
|
31
|
+
type: "contract" | "spec";
|
|
32
|
+
fieldCount: number;
|
|
33
|
+
referenceCount: number;
|
|
34
|
+
hasIdMismatch: boolean;
|
|
35
|
+
parseError?: string;
|
|
36
|
+
};
|
|
37
|
+
export type CddSchemaReference = {
|
|
38
|
+
path: string;
|
|
39
|
+
fileType: CddFileType;
|
|
40
|
+
name: string;
|
|
41
|
+
};
|
|
42
|
+
export type CddSchemaDetailEnvelope = {
|
|
43
|
+
key: string;
|
|
44
|
+
path: string;
|
|
45
|
+
schema: CddSchema;
|
|
46
|
+
references: CddSchemaReference[];
|
|
47
|
+
hasIdMismatch: boolean;
|
|
48
|
+
};
|
|
49
|
+
/** Acceptance Criterion 테스트 참조 */
|
|
50
|
+
export type AcceptanceCriterionTestRef = {
|
|
51
|
+
target: string;
|
|
52
|
+
pattern: string;
|
|
53
|
+
};
|
|
54
|
+
/** 구조화된 Acceptance Criterion */
|
|
55
|
+
export type AcceptanceCriterion = {
|
|
56
|
+
id: string;
|
|
57
|
+
condition: string;
|
|
58
|
+
testRef: AcceptanceCriterionTestRef;
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=cdd-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cdd-types.d.ts","sourceRoot":"","sources":["../../src/ui/cdd-types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,MAAM,CAAC;AAE9C,MAAM,MAAM,kBAAkB,GAC1B,QAAQ,GACR,UAAU,GACV,wBAAwB,GACxB,wBAAwB,CAAC;AAE7B,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC;IAC1B,MAAM,EAAE,cAAc,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,MAAM,EAAE,SAAS,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,WAAW,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,QAAQ,CAAC,EAAE,WAAW,CAAC;IACvB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,GAAG,MAAM,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,WAAW,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,SAAS,CAAC;IAClB,UAAU,EAAE,kBAAkB,EAAE,CAAC;IACjC,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,kCAAkC;AAClC,MAAM,MAAM,0BAA0B,GAAG;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,gCAAgC;AAChC,MAAM,MAAM,mBAAmB,GAAG;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,0BAA0B,CAAC;CACrC,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** 구조화된 Acceptance Criterion */ export { };
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91aS9jZGQtdHlwZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHR5cGUgQ2RkRmlsZVR5cGUgPSBcImNvbnRyYWN0XCIgfCBcInNwZWNcIjtcblxuZXhwb3J0IHR5cGUgQ2RkU2NoZW1hRmllbGRUeXBlID1cbiAgfCBcInN0cmluZ1wiXG4gIHwgXCJzdHJpbmdbXVwiXG4gIHwgXCJSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XCJcbiAgfCBcIlJlY29yZDxzdHJpbmcsIG9iamVjdD5cIjtcblxuZXhwb3J0IHR5cGUgQ2RkU2NoZW1hRmllbGQgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgbGFiZWw/OiBzdHJpbmc7XG4gIHR5cGU6IENkZFNjaGVtYUZpZWxkVHlwZTtcbiAgcmVuZGVyZXI/OiBzdHJpbmc7XG4gIHJlcXVpcmVkOiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgQ2RkU2NoZW1hID0ge1xuICBpZDogc3RyaW5nO1xuICB0eXBlOiBcImNvbnRyYWN0XCIgfCBcInNwZWNcIjtcbiAgZmllbGRzOiBDZGRTY2hlbWFGaWVsZFtdO1xufTtcblxuZXhwb3J0IHR5cGUgQ2RkQ29udGVudEVudmVsb3BlID0ge1xuICBkb2N1bWVudDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHNjaGVtYTogQ2RkU2NoZW1hIHwgbnVsbDtcbiAgZmlsZVR5cGU6IENkZEZpbGVUeXBlO1xufTtcblxuZXhwb3J0IHR5cGUgQ2RkVHJlZU5vZGUgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgcGF0aDogc3RyaW5nO1xuICB0eXBlOiBcImZpbGVcIiB8IFwiZGlyZWN0b3J5XCI7XG4gIGZpbGVUeXBlPzogQ2RkRmlsZVR5cGU7XG4gIGNoaWxkcmVuPzogQ2RkVHJlZU5vZGVbXTtcbn07XG5cbmV4cG9ydCB0eXBlIENkZFNjaGVtYVN1bW1hcnkgPSB7XG4gIGtleTogc3RyaW5nO1xuICBpZDogc3RyaW5nO1xuICBwYXRoOiBzdHJpbmc7XG4gIHR5cGU6IFwiY29udHJhY3RcIiB8IFwic3BlY1wiO1xuICBmaWVsZENvdW50OiBudW1iZXI7XG4gIHJlZmVyZW5jZUNvdW50OiBudW1iZXI7XG4gIGhhc0lkTWlzbWF0Y2g6IGJvb2xlYW47XG4gIHBhcnNlRXJyb3I/OiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBDZGRTY2hlbWFSZWZlcmVuY2UgPSB7XG4gIHBhdGg6IHN0cmluZztcbiAgZmlsZVR5cGU6IENkZEZpbGVUeXBlO1xuICBuYW1lOiBzdHJpbmc7XG59O1xuXG5leHBvcnQgdHlwZSBDZGRTY2hlbWFEZXRhaWxFbnZlbG9wZSA9IHtcbiAga2V5OiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgc2NoZW1hOiBDZGRTY2hlbWE7XG4gIHJlZmVyZW5jZXM6IENkZFNjaGVtYVJlZmVyZW5jZVtdO1xuICBoYXNJZE1pc21hdGNoOiBib29sZWFuO1xufTtcblxuLyoqIEFjY2VwdGFuY2UgQ3JpdGVyaW9uIO2FjOyKpO2KuCDssLjsobAgKi9cbmV4cG9ydCB0eXBlIEFjY2VwdGFuY2VDcml0ZXJpb25UZXN0UmVmID0ge1xuICB0YXJnZXQ6IHN0cmluZztcbiAgcGF0dGVybjogc3RyaW5nO1xufTtcblxuLyoqIOq1rOyhsO2ZlOuQnCBBY2NlcHRhbmNlIENyaXRlcmlvbiAqL1xuZXhwb3J0IHR5cGUgQWNjZXB0YW5jZUNyaXRlcmlvbiA9IHtcbiAgaWQ6IHN0cmluZztcbiAgY29uZGl0aW9uOiBzdHJpbmc7XG4gIHRlc3RSZWY6IEFjY2VwdGFuY2VDcml0ZXJpb25UZXN0UmVmO1xufTtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFtRUEsOEJBQThCLEdBQzlCLFdBSUUifQ==
|