sonamu 0.7.8 → 0.7.9
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/database/base-model.d.ts +47 -2
- package/dist/database/base-model.d.ts.map +1 -1
- package/dist/database/base-model.js +87 -5
- package/dist/entity/entity-manager.d.ts +5 -5
- package/dist/entity/entity.d.ts +9 -0
- package/dist/entity/entity.d.ts.map +1 -1
- package/dist/entity/entity.js +16 -1
- package/dist/migration/code-generation.d.ts.map +1 -1
- package/dist/migration/code-generation.js +12 -9
- package/dist/migration/migration-set.js +3 -1
- package/dist/migration/postgresql-schema-reader.d.ts.map +1 -1
- package/dist/migration/postgresql-schema-reader.js +3 -2
- package/dist/template/implementations/generated.template.d.ts.map +1 -1
- package/dist/template/implementations/generated.template.js +3 -2
- package/dist/types/types.d.ts +30 -25
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/types.js +10 -7
- package/dist/vector/config.d.ts.map +1 -1
- package/dist/vector/config.js +2 -2
- package/dist/vector/embedding.d.ts +12 -8
- package/dist/vector/embedding.d.ts.map +1 -1
- package/dist/vector/embedding.js +59 -74
- package/dist/vector/vector-search.js +2 -2
- package/package.json +12 -5
- package/src/database/base-model.ts +132 -7
- package/src/entity/entity.ts +19 -0
- package/src/migration/code-generation.ts +15 -8
- package/src/migration/migration-set.ts +2 -0
- package/src/migration/postgresql-schema-reader.ts +1 -0
- package/src/template/implementations/generated.template.ts +3 -4
- package/src/types/types.ts +12 -6
- package/src/vector/config.ts +2 -4
- package/src/vector/embedding.ts +73 -104
- package/src/vector/vector-search.ts +1 -1
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/** biome-ignore-all lint/suspicious/noExplicitAny: Puri의 타입은 개별 모델에서 확정되므로 BaseModel에서는 any를 허용함 */
|
|
2
2
|
import type { Knex } from "knex";
|
|
3
3
|
import type { DatabaseSchemaExtend } from "../types/types";
|
|
4
|
+
import type { EmbeddingItem, EmbeddingProvider, HybridSearchOptions, HybridSearchResult, ProgressCallback, VectorSearchOptions, VectorSearchResult } from "../vector/types";
|
|
5
|
+
import { VectorSearch } from "../vector/vector-search";
|
|
4
6
|
import type { EnhancerMap, ExecuteSubsetQueryResult, ResolveSubsetIntersection, UnionExtractedTTables } from "./base-model.types";
|
|
5
7
|
import type { DBPreset } from "./db";
|
|
6
8
|
import { Puri } from "./puri";
|
|
@@ -22,6 +24,49 @@ export declare class BaseModelClass<TSubsetKey extends string = never, TSubsetMa
|
|
|
22
24
|
constructor(subsetQueries?: TSubsetQueries | undefined, loaderQueries?: TLoaderQueries | undefined);
|
|
23
25
|
getDB(which: DBPreset): Knex;
|
|
24
26
|
getPuri(which: DBPreset): PuriWrapper;
|
|
27
|
+
private _vectorSearch;
|
|
28
|
+
/**
|
|
29
|
+
* 벡터 검색 인스턴스 반환
|
|
30
|
+
* - 기본 provider: voyage
|
|
31
|
+
* - 기본 dimensions: 1024 (DEFAULT_VECTOR_CONFIG 사용)
|
|
32
|
+
*/
|
|
33
|
+
getVector<T = Record<string, unknown>>(): VectorSearch<T>;
|
|
34
|
+
/**
|
|
35
|
+
* 벡터 검색 (코사인 유사도)
|
|
36
|
+
* @param query - 검색어
|
|
37
|
+
* @param options - 검색 옵션
|
|
38
|
+
*/
|
|
39
|
+
vectorSearch<T = Record<string, unknown>>(query: string, options?: VectorSearchOptions & {
|
|
40
|
+
provider?: EmbeddingProvider;
|
|
41
|
+
}): Promise<VectorSearchResult<T>[]>;
|
|
42
|
+
/**
|
|
43
|
+
* 하이브리드 검색 (Vector + FTS)
|
|
44
|
+
* @param query - 검색어
|
|
45
|
+
* @param options - 검색 옵션
|
|
46
|
+
*/
|
|
47
|
+
hybridSearch<T = Record<string, unknown>>(query: string, options?: HybridSearchOptions & {
|
|
48
|
+
provider?: EmbeddingProvider;
|
|
49
|
+
}): Promise<HybridSearchResult<T>[]>;
|
|
50
|
+
/**
|
|
51
|
+
* 단일 레코드에 임베딩 저장
|
|
52
|
+
* @param id - 레코드 ID
|
|
53
|
+
* @param text - 임베딩할 텍스트
|
|
54
|
+
* @param options - provider, embeddingColumn 옵션
|
|
55
|
+
*/
|
|
56
|
+
saveEmbedding(id: number, text: string, options?: {
|
|
57
|
+
provider?: EmbeddingProvider;
|
|
58
|
+
embeddingColumn?: string;
|
|
59
|
+
}): Promise<void>;
|
|
60
|
+
/**
|
|
61
|
+
* 여러 레코드에 임베딩 일괄 저장
|
|
62
|
+
* @param items - { id, text } 배열
|
|
63
|
+
* @param options - provider, embeddingColumn, onProgress 옵션
|
|
64
|
+
*/
|
|
65
|
+
saveEmbeddingsBatch(items: EmbeddingItem[], options?: {
|
|
66
|
+
provider?: EmbeddingProvider;
|
|
67
|
+
embeddingColumn?: string;
|
|
68
|
+
onProgress?: ProgressCallback;
|
|
69
|
+
}): Promise<void>;
|
|
25
70
|
destroy(): Promise<void>;
|
|
26
71
|
getInsertedIds(wdb: Knex, rows: UnknownDBRecord[], tableName: string, unqKeyFields: string[], chunkSize?: number): Promise<number[]>;
|
|
27
72
|
/**
|
|
@@ -58,8 +103,8 @@ export declare class BaseModelClass<TSubsetKey extends string = never, TSubsetMa
|
|
|
58
103
|
subset: T;
|
|
59
104
|
qb: Puri<any, any, any>;
|
|
60
105
|
params: {
|
|
61
|
-
num
|
|
62
|
-
page
|
|
106
|
+
num: number;
|
|
107
|
+
page: number;
|
|
63
108
|
queryMode?: "list" | "count" | "both";
|
|
64
109
|
};
|
|
65
110
|
debug?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-model.d.ts","sourceRoot":"","sources":["../../src/database/base-model.ts"],"names":[],"mappings":"AAAA,oGAAoG;AAEpG,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"base-model.d.ts","sourceRoot":"","sources":["../../src/database/base-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/** biome-ignore-all lint/suspicious/noExplicitAny: Puri의 타입은 개별 모델에서 확정되므로 BaseModel에서는 any를 허용함 */ import { group, isObject, omit, set } from "radashi";
|
|
2
2
|
import { Sonamu } from "../api/index.js";
|
|
3
|
+
import { EntityManager } from "../entity/entity-manager.js";
|
|
3
4
|
import { getJoinTables, getTableNamesFromWhere } from "../utils/sql-parser.js";
|
|
4
5
|
import { chunk } from "../utils/utils.js";
|
|
6
|
+
import { VectorSearch } from "../vector/vector-search.js";
|
|
5
7
|
import { DB } from "./db.js";
|
|
6
8
|
import { Puri } from "./puri.js";
|
|
7
9
|
import { PuriWrapper } from "./puri-wrapper.js";
|
|
@@ -34,7 +36,83 @@ import { UpsertBuilder } from "./upsert-builder.js";
|
|
|
34
36
|
const db = this.getDB(which);
|
|
35
37
|
return new PuriWrapper(db, new UpsertBuilder());
|
|
36
38
|
}
|
|
39
|
+
// VectorSearch 인스턴스 캐시
|
|
40
|
+
_vectorSearch = null;
|
|
41
|
+
/**
|
|
42
|
+
* 벡터 검색 인스턴스 반환
|
|
43
|
+
* - 기본 provider: voyage
|
|
44
|
+
* - 기본 dimensions: 1024 (DEFAULT_VECTOR_CONFIG 사용)
|
|
45
|
+
*/ getVector() {
|
|
46
|
+
if (this._vectorSearch) {
|
|
47
|
+
return this._vectorSearch;
|
|
48
|
+
}
|
|
49
|
+
const entity = EntityManager.get(this.modelName);
|
|
50
|
+
this._vectorSearch = new VectorSearch(this.getDB("w"), entity.table);
|
|
51
|
+
return this._vectorSearch;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 벡터 검색 (코사인 유사도)
|
|
55
|
+
* @param query - 검색어
|
|
56
|
+
* @param options - 검색 옵션
|
|
57
|
+
*/ async vectorSearch(query, options = {}) {
|
|
58
|
+
const entity = EntityManager.get(this.modelName);
|
|
59
|
+
const vectorProp = entity.getVectorColumn();
|
|
60
|
+
if (!vectorProp) {
|
|
61
|
+
throw new Error(`${this.modelName} Entity에 vector 컬럼이 정의되지 않았습니다.`);
|
|
62
|
+
}
|
|
63
|
+
const vs = new VectorSearch(this.getDB("w"), entity.table);
|
|
64
|
+
return vs.search(query, options.provider ?? "voyage", {
|
|
65
|
+
...options,
|
|
66
|
+
embeddingColumn: options.embeddingColumn ?? vectorProp.name
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 하이브리드 검색 (Vector + FTS)
|
|
71
|
+
* @param query - 검색어
|
|
72
|
+
* @param options - 검색 옵션
|
|
73
|
+
*/ async hybridSearch(query, options = {}) {
|
|
74
|
+
const entity = EntityManager.get(this.modelName);
|
|
75
|
+
const vectorProp = entity.getVectorColumn();
|
|
76
|
+
if (!vectorProp) {
|
|
77
|
+
throw new Error(`${this.modelName} Entity에 vector 컬럼이 정의되지 않았습니다.`);
|
|
78
|
+
}
|
|
79
|
+
const vs = new VectorSearch(this.getDB("w"), entity.table);
|
|
80
|
+
return vs.hybridSearch(query, options.provider ?? "voyage", {
|
|
81
|
+
...options,
|
|
82
|
+
embeddingColumn: options.embeddingColumn ?? vectorProp.name
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* 단일 레코드에 임베딩 저장
|
|
87
|
+
* @param id - 레코드 ID
|
|
88
|
+
* @param text - 임베딩할 텍스트
|
|
89
|
+
* @param options - provider, embeddingColumn 옵션
|
|
90
|
+
*/ async saveEmbedding(id, text, options = {}) {
|
|
91
|
+
const entity = EntityManager.get(this.modelName);
|
|
92
|
+
const vectorProp = entity.getVectorColumn(options.embeddingColumn);
|
|
93
|
+
if (!vectorProp) {
|
|
94
|
+
throw new Error(`${this.modelName} Entity에 vector 컬럼이 정의되지 않았습니다.`);
|
|
95
|
+
}
|
|
96
|
+
const { provider = "voyage" } = options;
|
|
97
|
+
const vs = this.getVector();
|
|
98
|
+
return vs.saveEmbedding(id, text, provider, vectorProp.name);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* 여러 레코드에 임베딩 일괄 저장
|
|
102
|
+
* @param items - { id, text } 배열
|
|
103
|
+
* @param options - provider, embeddingColumn, onProgress 옵션
|
|
104
|
+
*/ async saveEmbeddingsBatch(items, options = {}) {
|
|
105
|
+
const entity = EntityManager.get(this.modelName);
|
|
106
|
+
const vectorProp = entity.getVectorColumn(options.embeddingColumn);
|
|
107
|
+
if (!vectorProp) {
|
|
108
|
+
throw new Error(`${this.modelName} Entity에 vector 컬럼이 정의되지 않았습니다.`);
|
|
109
|
+
}
|
|
110
|
+
const { provider = "voyage", onProgress } = options;
|
|
111
|
+
const vs = this.getVector();
|
|
112
|
+
return vs.saveEmbeddingsBatch(items, provider, vectorProp.name, onProgress);
|
|
113
|
+
}
|
|
37
114
|
async destroy() {
|
|
115
|
+
this._vectorSearch = null;
|
|
38
116
|
return DB.destroy();
|
|
39
117
|
}
|
|
40
118
|
async getInsertedIds(wdb, rows, tableName, unqKeyFields, chunkSize = 500) {
|
|
@@ -94,9 +172,6 @@ import { UpsertBuilder } from "./upsert-builder.js";
|
|
|
94
172
|
if (!this.loaderQueries) {
|
|
95
173
|
throw new Error("loaderQueries is not defined");
|
|
96
174
|
}
|
|
97
|
-
if (!queryParams.num || !queryParams.page) {
|
|
98
|
-
throw new Error("num and page are required");
|
|
99
|
-
}
|
|
100
175
|
const { num, page } = queryParams;
|
|
101
176
|
// COUNT 쿼리 실행
|
|
102
177
|
const total = await this.executeCountQuery(qb, queryParams, debug, optimizeCountQuery);
|
|
@@ -148,7 +223,14 @@ import { UpsertBuilder } from "./upsert-builder.js";
|
|
|
148
223
|
if (params.queryMode === "count") {
|
|
149
224
|
return [];
|
|
150
225
|
}
|
|
151
|
-
|
|
226
|
+
const limitedQb = (()=>{
|
|
227
|
+
if (num === 0) {
|
|
228
|
+
return qb;
|
|
229
|
+
} else {
|
|
230
|
+
return qb.limit(num).offset(num * (page - 1));
|
|
231
|
+
}
|
|
232
|
+
})();
|
|
233
|
+
let unloadedRows = await limitedQb;
|
|
152
234
|
if (debug) {
|
|
153
235
|
qb.debug();
|
|
154
236
|
}
|
|
@@ -231,4 +313,4 @@ import { UpsertBuilder } from "./upsert-builder.js";
|
|
|
231
313
|
}
|
|
232
314
|
export const BaseModel = new BaseModelClass();
|
|
233
315
|
|
|
234
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9iYXNlLW1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBQdXJp7J2YIO2DgOyeheydgCDqsJzrs4Qg66qo64247JeQ7IScIO2ZleygleuQmOuvgOuhnCBCYXNlTW9kZWzsl5DshJzripQgYW5566W8IO2XiOyaqe2VqCAqL1xuXG5pbXBvcnQgdHlwZSB7IEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgZ3JvdXAsIGlzT2JqZWN0LCBvbWl0LCBzZXQgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaVwiO1xuaW1wb3J0IHR5cGUgeyBEYXRhYmFzZVNjaGVtYUV4dGVuZCB9IGZyb20gXCIuLi90eXBlcy90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0Sm9pblRhYmxlcywgZ2V0VGFibGVOYW1lc0Zyb21XaGVyZSB9IGZyb20gXCIuLi91dGlscy9zcWwtcGFyc2VyXCI7XG5pbXBvcnQgeyBjaHVuayB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuaW1wb3J0IHR5cGUge1xuICBFbmhhbmNlck1hcCxcbiAgRXhlY3V0ZVN1YnNldFF1ZXJ5UmVzdWx0LFxuICBSZXNvbHZlU3Vic2V0SW50ZXJzZWN0aW9uLFxuICBVbmlvbkV4dHJhY3RlZFRUYWJsZXMsXG59IGZyb20gXCIuL2Jhc2UtbW9kZWwudHlwZXNcIjtcbmltcG9ydCB0eXBlIHsgREJQcmVzZXQgfSBmcm9tIFwiLi9kYlwiO1xuaW1wb3J0IHsgREIgfSBmcm9tIFwiLi9kYlwiO1xuaW1wb3J0IHsgUHVyaSB9IGZyb20gXCIuL3B1cmlcIjtcbmltcG9ydCB0eXBlIHsgSW5mZXJBbGxTdWJzZXRzLCBQdXJpTG9hZGVyUXVlcmllcywgUHVyaVN1YnNldEZuIH0gZnJvbSBcIi4vcHVyaS1zdWJzZXQudHlwZXNcIjtcbmltcG9ydCB7IFB1cmlXcmFwcGVyIH0gZnJvbSBcIi4vcHVyaS13cmFwcGVyXCI7XG5pbXBvcnQgeyBVcHNlcnRCdWlsZGVyIH0gZnJvbSBcIi4vdXBzZXJ0LWJ1aWxkZXJcIjtcblxudHlwZSBVbmtub3duREJSZWNvcmQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuLyoqXG4gKiDrqqjrk6AgTW9kZWwg7YG0656Y7Iqk7J2YIOq4sOuzuCDtgbTrnpjsiqRcbiAqXG4gKiBAdGVtcGxhdGUgVFN1YnNldEtleSAtIOyEnOu4jOyFiyDtgqQg7Jyg64uI7JioICjsmIg6IFwiQVwiIHwgXCJQXCIgfCBcIlNTXCIpXG4gKiBAdGVtcGxhdGUgVFN1YnNldE1hcHBpbmcgLSDshJzruIzshYvrs4Qg7LWc7KKFIOqysOqzvCDtg4DsnoUg66ek7ZWRXG4gKiBAdGVtcGxhdGUgVFN1YnNldFF1ZXJpZXMgLSDshJzruIzshYsg7L+866asIO2VqOyImCDqsJ3ssrRcbiAqIEB0ZW1wbGF0ZSBUTG9hZGVyUXVlcmllcyAtIOyEnOu4jOyFi+uzhCDroZzrjZQg7L+866asIOuwsOyXtCDqsJ3ssrRcbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VNb2RlbENsYXNzPFxuICBUU3Vic2V0S2V5IGV4dGVuZHMgc3RyaW5nID0gbmV2ZXIsXG4gIFRTdWJzZXRNYXBwaW5nIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55PiA9IG5ldmVyLFxuICBUU3Vic2V0UXVlcmllcyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBQdXJpU3Vic2V0Rm4+ID0gbmV2ZXIsXG4gIFRMb2FkZXJRdWVyaWVzIGV4dGVuZHMgUHVyaUxvYWRlclF1ZXJpZXM8VFN1YnNldEtleT4gPSBuZXZlcixcbj4ge1xuICBwdWJsaWMgbW9kZWxOYW1lOiBzdHJpbmcgPSBcIlVua25vd25cIjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgc3Vic2V0UXVlcmllcz86IFRTdWJzZXRRdWVyaWVzLFxuICAgIHByb3RlY3RlZCBsb2FkZXJRdWVyaWVzPzogVExvYWRlclF1ZXJpZXMsXG4gICkge31cblxuICBnZXREQih3aGljaDogREJQcmVzZXQpOiBLbmV4IHtcbiAgICByZXR1cm4gREIuZ2V0REIod2hpY2gpO1xuICB9XG5cbiAgZ2V0UHVyaSh3aGljaDogREJQcmVzZXQpOiBQdXJpV3JhcHBlciB7XG4gICAgLy8g7Yq4656c7J6t7IWYIOy7qO2FjeyKpO2KuOyXkOyEnCDtirjrnpzsnq3shZgg7ZqN65OdXG4gICAgY29uc3QgdHJ4ID0gREIuZ2V0VHJhbnNhY3Rpb25Db250ZXh0KCkuZ2V0VHJhbnNhY3Rpb24od2hpY2gpO1xuICAgIGlmICh0cngpIHtcbiAgICAgIHJldHVybiB0cng7XG4gICAgfVxuXG4gICAgLy8g7Yq4656c7J6t7IWY7J20IOyXhuycvOuptCDsg4jroZzsmrQgUHVyaVdyYXBwZXIg67CY7ZmYXG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKHdoaWNoKTtcbiAgICByZXR1cm4gbmV3IFB1cmlXcmFwcGVyKGRiLCBuZXcgVXBzZXJ0QnVpbGRlcigpKTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKSB7XG4gICAgcmV0dXJuIERCLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGFzeW5jIGdldEluc2VydGVkSWRzKFxuICAgIHdkYjogS25leCxcbiAgICByb3dzOiBVbmtub3duREJSZWNvcmRbXSxcbiAgICB0YWJsZU5hbWU6IHN0cmluZyxcbiAgICB1bnFLZXlGaWVsZHM6IHN0cmluZ1tdLFxuICAgIGNodW5rU2l6ZTogbnVtYmVyID0gNTAwLFxuICApIHtcbiAgICBpZiAoIXdkYikge1xuICAgICAgd2RiID0gdGhpcy5nZXREQihcIndcIik7XG4gICAgfVxuXG4gICAgbGV0IHVucUtleXM6IHN0cmluZ1tdO1xuICAgIGxldCB3aGVyZUluRmllbGQ6IHN0cmluZyB8IEtuZXguUmF3O1xuICAgIGxldCBzZWxlY3RGaWVsZDogc3RyaW5nO1xuXG4gICAgaWYgKHVucUtleUZpZWxkcy5sZW5ndGggPiAxKSB7XG4gICAgICB3aGVyZUluRmllbGQgPSB3ZGIucmF3KGBDT05DQVRfV1MoJ18nLCAnJHt1bnFLZXlGaWVsZHMuam9pbihcIixcIil9JylgKTtcbiAgICAgIHNlbGVjdEZpZWxkID0gYCR7d2hlcmVJbkZpZWxkfSBhcyB0bXBVaWRgO1xuICAgICAgdW5xS2V5cyA9IHJvd3MubWFwKChyb3cpID0+IHVucUtleUZpZWxkcy5tYXAoKGZpZWxkKSA9PiByb3dbZmllbGRdKS5qb2luKFwiX1wiKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdoZXJlSW5GaWVsZCA9IHVucUtleUZpZWxkc1swXTtcbiAgICAgIHNlbGVjdEZpZWxkID0gdW5xS2V5RmllbGRzWzBdO1xuICAgICAgdW5xS2V5cyA9IHJvd3MubWFwKChyb3cpID0+IHJvd1t1bnFLZXlGaWVsZHNbMF1dIGFzIHN0cmluZyk7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdElkczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGl0ZW1zIG9mIGNodW5rKHVucUtleXMsIGNodW5rU2l6ZSkpIHtcbiAgICAgIGNvbnN0IGRiUm93cyA9IGF3YWl0IHdkYih0YWJsZU5hbWUpXG4gICAgICAgIC5zZWxlY3QoXCJpZFwiLCB3ZGIucmF3KHNlbGVjdEZpZWxkKSlcbiAgICAgICAgLndoZXJlSW4od2hlcmVJbkZpZWxkIGFzIHN0cmluZywgaXRlbXMpO1xuICAgICAgcmVzdWx0SWRzID0gcmVzdWx0SWRzLmNvbmNhdChcbiAgICAgICAgZGJSb3dzLm1hcCgoZGJSb3c6IFVua25vd25EQlJlY29yZCkgPT4gcGFyc2VJbnQoU3RyaW5nKGRiUm93LmlkKSkpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0SWRzO1xuICB9XG5cbiAgLyoqXG4gICAqIO2KueyglSDshJzruIzshYvsl5Ag64yA7ZWcIOy/vOumrCDruYzrjZQg7ZqN65OdXG4gICAqXG4gICAqIEByZXR1cm5zIHFiIC0g7L+866asIOu5jOuNlCAo7KGw6rG0IOy2lOqwgOyaqSlcbiAgICogQHJldHVybnMgb25TdWJzZXQgLSDtirnsoJUg7ISc67iM7IWLIOyghOyaqSDtg4DsnoXsnbQg7ZWE7JqU7ZWgIOuVjCDsgqzsmqlcbiAgICovXG4gIGdldFN1YnNldFF1ZXJpZXM8VCBleHRlbmRzIFRTdWJzZXRLZXk+KHN1YnNldDogVCkge1xuICAgIGlmICghdGhpcy5zdWJzZXRRdWVyaWVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzdWJzZXRRdWVyaWVzIGlzIG5vdCBkZWZpbmVkXCIpO1xuICAgIH1cblxuICAgIGNvbnN0IHB1cmlXcmFwcGVyID0gbmV3IFB1cmlXcmFwcGVyKHRoaXMuZ2V0REIoXCJyXCIpLCBuZXcgVXBzZXJ0QnVpbGRlcigpKTtcbiAgICBjb25zdCBxYiA9IHRoaXMuc3Vic2V0UXVlcmllc1tzdWJzZXRdPy4ocHVyaVdyYXBwZXIpO1xuXG4gICAgLy8gTm9uQWxsb3dlZEFzU2luZ2xlVGFibGU6IOuLqOydvCDthYzsnbTruJQg7Lus65+8IOygkeq3vCDrsKnsp4Dsmqkg66eI7LukXG4gICAgdHlwZSBRQlRhYmxlcyA9IFVuaW9uRXh0cmFjdGVkVFRhYmxlczxUU3Vic2V0S2V5LCBUU3Vic2V0UXVlcmllcz4gJiB7XG4gICAgICBOb25BbGxvd2VkQXNTaW5nbGVUYWJsZTogeyBfX2Z1bGx0ZXh0X186IHRydWUgfTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHFiOiBxYiBhcyB1bmtub3duIGFzIFB1cmk8RGF0YWJhc2VTY2hlbWFFeHRlbmQsIFFCVGFibGVzLCB7fT4sXG4gICAgICBvblN1YnNldDogKChfc3Vic2V0OiBUU3Vic2V0S2V5IHwgcmVhZG9ubHkgVFN1YnNldEtleVtdKSA9PiBxYikgYXMge1xuICAgICAgICAvLyDri6jsnbwg7YKkXG4gICAgICAgIDxTIGV4dGVuZHMgVFN1YnNldEtleT4oc3Vic2V0OiBTKTogUmV0dXJuVHlwZTxUU3Vic2V0UXVlcmllc1tTXT47XG4gICAgICAgIC8vIO2CpCDrsLDsl7QgLT4g6rWQ7KeR7ZWpIOuwmO2ZmFxuICAgICAgICA8QXJyIGV4dGVuZHMgcmVhZG9ubHkgVFN1YnNldEtleVtdPihcbiAgICAgICAgICBzdWJzZXRzOiBbLi4uQXJyXSxcbiAgICAgICAgKTogUmVzb2x2ZVN1YnNldEludGVyc2VjdGlvbjxBcnIsIFRTdWJzZXRRdWVyaWVzPjtcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbmhhbmNlciDqsJ3ssrQg7IOd7ISxIO2XrO2NvFxuICAgKiDtg4DsnoUg6rKA7KadIOuwjyDstpTroaDsnYQg64+E7JmA7KSMXG4gICAqL1xuICBjcmVhdGVFbmhhbmNlcnM8VCBleHRlbmRzIFRTdWJzZXRLZXk+KFxuICAgIGVuaGFuY2VyczogRW5oYW5jZXJNYXA8VCwgSW5mZXJBbGxTdWJzZXRzPFRTdWJzZXRRdWVyaWVzLCBUTG9hZGVyUXVlcmllcz4sIFRTdWJzZXRNYXBwaW5nPixcbiAgKSB7XG4gICAgcmV0dXJuIGVuaGFuY2VycztcbiAgfVxuXG4gIC8qKlxuICAgKiDshJzruIzshYsg7L+866asIOyLpO2WiVxuICAgKlxuICAgKiAxLiDsv7zrpqwg7Iuk7ZaJIChwYWdpbmF0aW9uIOyggeyaqSlcbiAgICogMi4g66Gc642UIOyLpO2WiSAoMTpOLCBOOk0g6rSA6rOEIOuNsOydtO2EsCDroZzrlKkpXG4gICAqIDMuIEh5ZHJhdGUgKGZsYXQg4oaSIOykkeyyqSDqsJ3ssrQpXG4gICAqIDQuIEVuaGFuY2VyIOyggeyaqSAodmlydHVhbCDtlYTrk5wg6rOE7IKwKVxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZVN1YnNldFF1ZXJ5PFxuICAgIFQgZXh0ZW5kcyBUU3Vic2V0S2V5LFxuICAgIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyBJbmZlckFsbFN1YnNldHM8VFN1YnNldFF1ZXJpZXMsIFRMb2FkZXJRdWVyaWVzPixcbiAgPihcbiAgICBwYXJhbXM6IHtcbiAgICAgIHN1YnNldDogVDtcbiAgICAgIHFiOiBQdXJpPGFueSwgYW55LCBhbnk+O1xuICAgICAgcGFyYW1zOiB7XG4gICAgICAgIG51bT86IG51bWJlcjtcbiAgICAgICAgcGFnZT86IG51bWJlcjtcbiAgICAgICAgcXVlcnlNb2RlPzogXCJsaXN0XCIgfCBcImNvdW50XCIgfCBcImJvdGhcIjtcbiAgICAgIH07XG4gICAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgICBvcHRpbWl6ZUNvdW50UXVlcnk/OiBib29sZWFuO1xuICAgIH0gJiBFbmhhbmNlclBhcmFtPFRTdWJzZXRLZXksIFRDb21wdXRlZFJlc3VsdHMsIFRTdWJzZXRNYXBwaW5nPixcbiAgKTogUHJvbWlzZTxFeGVjdXRlU3Vic2V0UXVlcnlSZXN1bHQ8VFN1YnNldE1hcHBpbmcsIFQ+PiB7XG4gICAgY29uc3QgeyBzdWJzZXQsIHFiLCBwYXJhbXM6IHF1ZXJ5UGFyYW1zLCBkZWJ1ZyA9IGZhbHNlLCBvcHRpbWl6ZUNvdW50UXVlcnkgPSBmYWxzZSB9ID0gcGFyYW1zO1xuXG4gICAgaWYgKCF0aGlzLmxvYWRlclF1ZXJpZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcImxvYWRlclF1ZXJpZXMgaXMgbm90IGRlZmluZWRcIik7XG4gICAgfVxuXG4gICAgaWYgKCFxdWVyeVBhcmFtcy5udW0gfHwgIXF1ZXJ5UGFyYW1zLnBhZ2UpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIm51bSBhbmQgcGFnZSBhcmUgcmVxdWlyZWRcIik7XG4gICAgfVxuXG4gICAgY29uc3QgeyBudW0sIHBhZ2UgfSA9IHF1ZXJ5UGFyYW1zO1xuXG4gICAgLy8gQ09VTlQg7L+866asIOyLpO2WiVxuICAgIGNvbnN0IHRvdGFsID0gYXdhaXQgdGhpcy5leGVjdXRlQ291bnRRdWVyeShxYiwgcXVlcnlQYXJhbXMsIGRlYnVnLCBvcHRpbWl6ZUNvdW50UXVlcnkpO1xuXG4gICAgLy8gTElTVCDsv7zrpqwg7Iuk7ZaJXG4gICAgY29uc3QgY29tcHV0ZWRSb3dzID0gYXdhaXQgdGhpcy5leGVjdXRlTGlzdFF1ZXJ5KHN1YnNldCwgcWIsIHF1ZXJ5UGFyYW1zLCBudW0sIHBhZ2UsIGRlYnVnKTtcblxuICAgIC8vIEVuaGFuY2VyIOyggeyaqVxuICAgIGNvbnN0IGVuaGFuY2VyID0gKHBhcmFtcyBhcyBhbnkpLmVuaGFuY2Vycz8uW3N1YnNldF07XG4gICAgY29uc3Qgcm93cyA9IChhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIGNvbXB1dGVkUm93cy5tYXAoKHJvdykgPT4gZW5oYW5jZXI/Lihyb3cpID8/IHJvdyksXG4gICAgKSkgYXMgVFN1YnNldE1hcHBpbmdbVF1bXTtcblxuICAgIHJldHVybiB7IHJvd3MsIHRvdGFsIH07XG4gIH1cblxuICAvKipcbiAgICogQ09VTlQg7L+866asIOyLpO2WiSAo64K067aAIOuplOyEnOuTnClcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUNvdW50UXVlcnkoXG4gICAgcWI6IFB1cmk8YW55LCBhbnksIGFueT4sXG4gICAgcGFyYW1zOiB7IHF1ZXJ5TW9kZT86IFwibGlzdFwiIHwgXCJjb3VudFwiIHwgXCJib3RoXCIgfSxcbiAgICBkZWJ1ZzogYm9vbGVhbixcbiAgICBvcHRpbWl6ZUNvdW50UXVlcnk6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgaWYgKHBhcmFtcy5xdWVyeU1vZGUgPT09IFwibGlzdFwiKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCBjb3VudFB1cmkgPSBxYi5jbG9uZSgpLmNsZWFyKFwib3JkZXJcIikuY2xlYXIoXCJsaW1pdFwiKS5jbGVhcihcIm9mZnNldFwiKTtcblxuICAgIGlmIChvcHRpbWl6ZUNvdW50UXVlcnkpIHtcbiAgICAgIGNvbnN0IHsgZGVmYXVsdDogU3FsUGFyc2VyIH0gPSBhd2FpdCBpbXBvcnQoXCJub2RlLXNxbC1wYXJzZXJcIik7XG4gICAgICBjb25zdCBwYXJzZXIgPSBuZXcgU3FsUGFyc2VyLlBhcnNlcigpO1xuICAgICAgY29uc3QgcGFyc2VkUXVlcnkgPSBwYXJzZXIuYXN0aWZ5KGNvdW50UHVyaS50b1F1ZXJ5KCksIHtcbiAgICAgICAgZGF0YWJhc2U6IFNvbmFtdS5jb25maWcuZGF0YWJhc2UuZGF0YWJhc2UsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgbGVmdEpvaW5UYWJsZXMgPSBnZXRKb2luVGFibGVzKHBhcnNlZFF1ZXJ5LCBbXCJMRUZUIEpPSU5cIl0pO1xuICAgICAgY29uc3Qgd2hlcmVUYWJsZXMgPSBnZXRUYWJsZU5hbWVzRnJvbVdoZXJlKHBhcnNlZFF1ZXJ5KTtcblxuICAgICAgY29uc3QgdGFibGVzVG9SZW1vdmUgPSBsZWZ0Sm9pblRhYmxlcy5maWx0ZXIoKGopID0+ICF3aGVyZVRhYmxlcy5pbmNsdWRlcyhqKSk7XG4gICAgICB0YWJsZXNUb1JlbW92ZS5mb3JFYWNoKCh0YWJsZSkgPT4ge1xuICAgICAgICBjb3VudFB1cmkuY2xlYXJKb2luKHRhYmxlKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENPVU5UKCop66GcIOyghOyytCDroIjsvZTrk5wg7IiY66W8IOqzhOyCsFxuICAgIC8vIFRPRE86IHFi7J2YIERJU1RJTkNU6rCAIOyeiOuKlCDqsr3smrAg7LKY66as7ZW07JW8IO2VqFxuICAgIGNvbnN0IGNvdW50UmVzdWx0OiB7IHRvdGFsPzogbnVtYmVyIH0gPSBhd2FpdCBjb3VudFB1cmlcbiAgICAgIC5jbGVhcihcInNlbGVjdFwiKVxuICAgICAgLnNlbGVjdCh7IHRvdGFsOiBQdXJpLnJhd051bWJlcihgQ09VTlQoKik6OmludGVnZXJgKSB9KVxuICAgICAgLmZpcnN0KCk7XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIGNvdW50UHVyaS5kZWJ1ZygpO1xuICAgIH1cblxuICAgIHJldHVybiBjb3VudFJlc3VsdD8udG90YWwgPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMSVNUIOy/vOumrCDsi6TtlokgKOuCtOu2gCDrqZTshJzrk5wpXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGV4ZWN1dGVMaXN0UXVlcnk8VCBleHRlbmRzIFRTdWJzZXRLZXk+KFxuICAgIHN1YnNldDogVCxcbiAgICBxYjogUHVyaTxhbnksIGFueSwgYW55PixcbiAgICBwYXJhbXM6IHsgcXVlcnlNb2RlPzogXCJsaXN0XCIgfCBcImNvdW50XCIgfCBcImJvdGhcIiB9LFxuICAgIG51bTogbnVtYmVyLFxuICAgIHBhZ2U6IG51bWJlcixcbiAgICBkZWJ1ZzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxhbnlbXT4ge1xuICAgIGlmIChwYXJhbXMucXVlcnlNb2RlID09PSBcImNvdW50XCIpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBsZXQgdW5sb2FkZWRSb3dzID0gKGF3YWl0IHFiLmxpbWl0KG51bSkub2Zmc2V0KG51bSAqIChwYWdlIC0gMSkpKSBhcyBhbnlbXTtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgcWIuZGVidWcoKTtcbiAgICB9XG5cbiAgICAvLyDroZzrjZQg7LKY66asXG4gICAgY29uc3QgbG9hZGVycyA9ICh0aGlzLmxvYWRlclF1ZXJpZXMgYXMgYW55KVtzdWJzZXRdO1xuICAgIGlmIChsb2FkZXJzICYmIEFycmF5LmlzQXJyYXkobG9hZGVycykpIHtcbiAgICAgIHVubG9hZGVkUm93cyA9IGF3YWl0IHRoaXMucHJvY2Vzc0xvYWRlcnModW5sb2FkZWRSb3dzLCBsb2FkZXJzLCBkZWJ1Zyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHlkcmF0ZSh1bmxvYWRlZFJvd3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyerOq3gOyggSDroZzrjZQg7LKY66asXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NMb2FkZXJzKHJvd3M6IGFueVtdLCBsb2FkZXJzOiBhbnlbXSwgZGVidWc6IGJvb2xlYW4pOiBQcm9taXNlPGFueVtdPiB7XG4gICAgZm9yIChjb25zdCByZXNvbHZlTG9hZGVyIG9mIGxvYWRlcnMpIHtcbiAgICAgIGNvbnN0IHsgYXMsIHJlZklkLCBxYjogcmVzb2x2ZUxvYWRlclFiRm4sIGxvYWRlcnM6IG5lc3RlZExvYWRlcnMgfSA9IHJlc29sdmVMb2FkZXI7XG5cbiAgICAgIGNvbnN0IHJlc29sdmVMb2FkZXJRYiA9IHJlc29sdmVMb2FkZXJRYkZuKFxuICAgICAgICBuZXcgUHVyaVdyYXBwZXIodGhpcy5nZXREQihcInJcIiksIG5ldyBVcHNlcnRCdWlsZGVyKCkpLFxuICAgICAgICByb3dzLm1hcCgocm93KSA9PiByb3dbcmVmSWRdKSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICByZXNvbHZlTG9hZGVyUWIuZGVidWcoKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGxvYWRlZFJvd3MgPSAoYXdhaXQgcmVzb2x2ZUxvYWRlclFiKSBhcyBhbnlbXTtcblxuICAgICAgLy8g7KSR7LKpIGxvYWRlcnPqsIAg7J6I7Jy866m0IOyerOq3gCDsspjrpqxcbiAgICAgIGlmIChuZXN0ZWRMb2FkZXJzICYmIG5lc3RlZExvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2FkZWRSb3dzID0gYXdhaXQgdGhpcy5wcm9jZXNzTG9hZGVycyhsb2FkZWRSb3dzLCBuZXN0ZWRMb2FkZXJzLCBkZWJ1Zyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN1YlJvd0dyb3VwcyA9IGdyb3VwKGxvYWRlZFJvd3MsIChyb3cpID0+IHJvdy5yZWZJZCk7XG5cbiAgICAgIHJvd3MgPSByb3dzLm1hcCgocm93KSA9PiB7XG4gICAgICAgIHJvd1thc10gPSAoc3ViUm93R3JvdXBzW3Jvd1tyZWZJZF1dID8/IFtdKS5tYXAoKHIpID0+IG9taXQociwgW1wicmVmSWRcIl0pKTtcbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXQg66CI7L2U65Oc66W8IOykkeyyqSDqsJ3ssrTroZwg67OA7ZmYXG4gICAqXG4gICAqIC0gYHVzZXJfX25hbWVgIOKGkiBgeyB1c2VyOiB7IG5hbWUgfSB9YFxuICAgKiAtIG51bGxhYmxlIHJlbGF0aW9u7J2YIOqyveyasCBpZCDtlYTrk5zqsIAgbnVsbOydtOuptCDqsJ3ssrQg7J6Q7LK066W8IG51bGzroZxcbiAgICovXG4gIGh5ZHJhdGU8VCBleHRlbmRzIFVua25vd25EQlJlY29yZD4ocm93czogVFtdKTogVFtdIHtcbiAgICByZXR1cm4gcm93cy5tYXAoKHJvdzogVCkgPT4ge1xuICAgICAgLy8gbnVsbGFibGUgcmVsYXRpb24g7LKY66asOiDqt7jro7nsnZggaWQg7ZWE65Oc6rCAIG51bGzsnbTrqbQg6rCd7LK0IOyghOyytOulvCBudWxs66GcXG4gICAgICBjb25zdCBuZXN0ZWRLZXlzID0gT2JqZWN0LmtleXMocm93KS5maWx0ZXIoKGtleSkgPT4ga2V5LmluY2x1ZGVzKFwiX19cIikpO1xuICAgICAgY29uc3QgZ3JvdXBzID0gT2JqZWN0Lmdyb3VwQnkobmVzdGVkS2V5cywgKGtleSkgPT4ga2V5LnNwbGl0KFwiX19cIilbMF0pO1xuXG4gICAgICAvLyBpZCDtlYTrk5zqsIAgbnVsbOyduCDqt7jro7kg7LC+6riwICjsmIg6IHBhcmVudF9faWTqsIAgbnVsbOydtOuptCBwYXJlbnQg6re466O5IOyghOyytOqwgCBudWxsKVxuICAgICAgY29uc3QgbnVsbEtleXMgPSBPYmplY3QuZW50cmllcyhncm91cHMpXG4gICAgICAgIC5maWx0ZXIoKFtncm91cEtleSwgZmllbGRzXSkgPT4ge1xuICAgICAgICAgIGlmICghZmllbGRzIHx8IGZpZWxkcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgIC8vIOq3uOujueydmCBpZCDtlYTrk5wg7LC+6riwICjsmIg6IFwicGFyZW50X19pZFwiKVxuICAgICAgICAgIGNvbnN0IGlkRmllbGQgPSBgJHtncm91cEtleX1fX2lkYDtcbiAgICAgICAgICBpZiAoaWRGaWVsZCBpbiByb3cpIHtcbiAgICAgICAgICAgIC8vIGlkIO2VhOuTnOqwgCBudWxs7J2066m0IOqwneyytCDsoITssrTqsIAgbnVsbFxuICAgICAgICAgICAgcmV0dXJuIHJvd1tpZEZpZWxkXSA9PT0gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBpZCDtlYTrk5zqsIAg7JeG7Jy866m0IOq4sOyhtCDroZzsp4E6IOuqqOuToCDtlYTrk5zqsIAgbnVsbOyduOyngCDtmZXsnbhcbiAgICAgICAgICByZXR1cm4gZmllbGRzLmV2ZXJ5KFxuICAgICAgICAgICAgKGZpZWxkKSA9PlxuICAgICAgICAgICAgICByb3dbZmllbGRdID09PSBudWxsIHx8IChBcnJheS5pc0FycmF5KHJvd1tmaWVsZF0pICYmIHJvd1tmaWVsZF0ubGVuZ3RoID09PSAwKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAubWFwKChba2V5XSkgPT4ga2V5KTtcblxuICAgICAgY29uc3QgaHlkcmF0ZWQgPSBPYmplY3Qua2V5cyhyb3cpLnJlZHVjZSgociwgZmllbGQpID0+IHtcbiAgICAgICAgaWYgKCFmaWVsZC5pbmNsdWRlcyhcIl9fXCIpKSB7XG4gICAgICAgICAgLy8g7J2867CYIO2VhOuTnDog67Cw7Je0IOuCtCDqsJ3ssrTrqbQg7J6s6reAIGh5ZHJhdGVcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyb3dbZmllbGRdKSAmJiBpc09iamVjdChyb3dbZmllbGRdWzBdKSkge1xuICAgICAgICAgICAgcltmaWVsZF0gPSB0aGlzLmh5ZHJhdGUocm93W2ZpZWxkXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJbZmllbGRdID0gcm93W2ZpZWxkXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDspJHssqkg7ZWE65OcIOyymOumrDogdXNlcl9fbmFtZSDihpIgdXNlcltuYW1lXVxuICAgICAgICBjb25zdCBwYXJ0cyA9IGZpZWxkLnNwbGl0KFwiX19cIik7XG4gICAgICAgIGNvbnN0IG9ialBhdGggPVxuICAgICAgICAgIHBhcnRzWzBdICtcbiAgICAgICAgICBwYXJ0c1xuICAgICAgICAgICAgLnNsaWNlKDEpXG4gICAgICAgICAgICAubWFwKChwYXJ0KSA9PiBgWyR7cGFydH1dYClcbiAgICAgICAgICAgIC5qb2luKFwiXCIpO1xuXG4gICAgICAgIHIgPSBzZXQoXG4gICAgICAgICAgcixcbiAgICAgICAgICBvYmpQYXRoLFxuICAgICAgICAgIHJvd1tmaWVsZF0gJiYgQXJyYXkuaXNBcnJheShyb3dbZmllbGRdKSAmJiBpc09iamVjdChyb3dbZmllbGRdWzBdKVxuICAgICAgICAgICAgPyB0aGlzLmh5ZHJhdGUocm93W2ZpZWxkXSlcbiAgICAgICAgICAgIDogcm93W2ZpZWxkXSxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0sIHt9IGFzIFVua25vd25EQlJlY29yZCk7XG5cbiAgICAgIC8vIG51bGwgcmVsYXRpb24g7LKY66asXG4gICAgICBudWxsS2V5cy5mb3JFYWNoKChudWxsS2V5KSA9PiB7XG4gICAgICAgIGh5ZHJhdGVkW251bGxLZXldID0gbnVsbDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gaHlkcmF0ZWQ7XG4gICAgfSkgYXMgVFtdO1xuICB9XG59XG5cbi8qKlxuICogRW5oYW5jZXIg7YyM652866+47YSwIOyhsOqxtOu2gCDtg4DsnoVcbiAqIFJlcXVpcmVkRW5oYW5jZXJLZXlz6rCAIOyXhuycvOuptCBlbmhhbmNlcnMg7ISg7YOd7KCBLCDsnojsnLzrqbQg7ZWE7IiYXG4gKi9cbnR5cGUgRW5oYW5jZXJQYXJhbTxcbiAgVFN1YnNldEtleSBleHRlbmRzIHN0cmluZyxcbiAgVENvbXB1dGVkUmVzdWx0cyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuICBUU3Vic2V0TWFwcGluZyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuPiA9IFtSZXF1aXJlZEVuaGFuY2VyS2V5czxUU3Vic2V0S2V5LCBUQ29tcHV0ZWRSZXN1bHRzLCBUU3Vic2V0TWFwcGluZz5dIGV4dGVuZHMgW25ldmVyXVxuICA/IHsgZW5oYW5jZXJzPzogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+IH1cbiAgOiB7IGVuaGFuY2VyczogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+IH07XG5cbnR5cGUgUmVxdWlyZWRFbmhhbmNlcktleXM8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55PixcbiAgVFN1YnNldE1hcHBpbmcgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55Pixcbj4gPSB7XG4gIFtLIGluIFRTdWJzZXRLZXldOiBUQ29tcHV0ZWRSZXN1bHRzW0tdIGV4dGVuZHMgVFN1YnNldE1hcHBpbmdbS10gPyBuZXZlciA6IEs7XG59W1RTdWJzZXRLZXldO1xuXG5leHBvcnQgY29uc3QgQmFzZU1vZGVsID0gbmV3IEJhc2VNb2RlbENsYXNzKCk7XG4iXSwibmFtZXMiOlsiZ3JvdXAiLCJpc09iamVjdCIsIm9taXQiLCJzZXQiLCJTb25hbXUiLCJnZXRKb2luVGFibGVzIiwiZ2V0VGFibGVOYW1lc0Zyb21XaGVyZSIsImNodW5rIiwiREIiLCJQdXJpIiwiUHVyaVdyYXBwZXIiLCJVcHNlcnRCdWlsZGVyIiwiQmFzZU1vZGVsQ2xhc3MiLCJtb2RlbE5hbWUiLCJzdWJzZXRRdWVyaWVzIiwibG9hZGVyUXVlcmllcyIsImdldERCIiwid2hpY2giLCJnZXRQdXJpIiwidHJ4IiwiZ2V0VHJhbnNhY3Rpb25Db250ZXh0IiwiZ2V0VHJhbnNhY3Rpb24iLCJkYiIsImRlc3Ryb3kiLCJnZXRJbnNlcnRlZElkcyIsIndkYiIsInJvd3MiLCJ0YWJsZU5hbWUiLCJ1bnFLZXlGaWVsZHMiLCJjaHVua1NpemUiLCJ1bnFLZXlzIiwid2hlcmVJbkZpZWxkIiwic2VsZWN0RmllbGQiLCJsZW5ndGgiLCJyYXciLCJqb2luIiwibWFwIiwicm93IiwiZmllbGQiLCJyZXN1bHRJZHMiLCJpdGVtcyIsImRiUm93cyIsInNlbGVjdCIsIndoZXJlSW4iLCJjb25jYXQiLCJkYlJvdyIsInBhcnNlSW50IiwiU3RyaW5nIiwiaWQiLCJnZXRTdWJzZXRRdWVyaWVzIiwic3Vic2V0IiwiRXJyb3IiLCJwdXJpV3JhcHBlciIsInFiIiwib25TdWJzZXQiLCJfc3Vic2V0IiwiY3JlYXRlRW5oYW5jZXJzIiwiZW5oYW5jZXJzIiwiZXhlY3V0ZVN1YnNldFF1ZXJ5IiwicGFyYW1zIiwicXVlcnlQYXJhbXMiLCJkZWJ1ZyIsIm9wdGltaXplQ291bnRRdWVyeSIsIm51bSIsInBhZ2UiLCJ0b3RhbCIsImV4ZWN1dGVDb3VudFF1ZXJ5IiwiY29tcHV0ZWRSb3dzIiwiZXhlY3V0ZUxpc3RRdWVyeSIsImVuaGFuY2VyIiwiUHJvbWlzZSIsImFsbCIsInF1ZXJ5TW9kZSIsImNvdW50UHVyaSIsImNsb25lIiwiY2xlYXIiLCJkZWZhdWx0IiwiU3FsUGFyc2VyIiwicGFyc2VyIiwiUGFyc2VyIiwicGFyc2VkUXVlcnkiLCJhc3RpZnkiLCJ0b1F1ZXJ5IiwiZGF0YWJhc2UiLCJjb25maWciLCJsZWZ0Sm9pblRhYmxlcyIsIndoZXJlVGFibGVzIiwidGFibGVzVG9SZW1vdmUiLCJmaWx0ZXIiLCJqIiwiaW5jbHVkZXMiLCJmb3JFYWNoIiwidGFibGUiLCJjbGVhckpvaW4iLCJjb3VudFJlc3VsdCIsInJhd051bWJlciIsImZpcnN0IiwidW5sb2FkZWRSb3dzIiwibGltaXQiLCJvZmZzZXQiLCJsb2FkZXJzIiwiQXJyYXkiLCJpc0FycmF5IiwicHJvY2Vzc0xvYWRlcnMiLCJoeWRyYXRlIiwicmVzb2x2ZUxvYWRlciIsImFzIiwicmVmSWQiLCJyZXNvbHZlTG9hZGVyUWJGbiIsIm5lc3RlZExvYWRlcnMiLCJyZXNvbHZlTG9hZGVyUWIiLCJsb2FkZWRSb3dzIiwic3ViUm93R3JvdXBzIiwiciIsIm5lc3RlZEtleXMiLCJPYmplY3QiLCJrZXlzIiwia2V5IiwiZ3JvdXBzIiwiZ3JvdXBCeSIsInNwbGl0IiwibnVsbEtleXMiLCJlbnRyaWVzIiwiZ3JvdXBLZXkiLCJmaWVsZHMiLCJpZEZpZWxkIiwiZXZlcnkiLCJoeWRyYXRlZCIsInJlZHVjZSIsInBhcnRzIiwib2JqUGF0aCIsInNsaWNlIiwicGFydCIsIm51bGxLZXkiLCJCYXNlTW9kZWwiXSwibWFwcGluZ3MiOiJBQUFBLGtHQUFrRyxHQUdsRyxTQUFTQSxLQUFLLEVBQUVDLFFBQVEsRUFBRUMsSUFBSSxFQUFFQyxHQUFHLFFBQVEsVUFBVTtBQUNyRCxTQUFTQyxNQUFNLFFBQVEsa0JBQVM7QUFFaEMsU0FBU0MsYUFBYSxFQUFFQyxzQkFBc0IsUUFBUSx5QkFBc0I7QUFDNUUsU0FBU0MsS0FBSyxRQUFRLG9CQUFpQjtBQVF2QyxTQUFTQyxFQUFFLFFBQVEsVUFBTztBQUMxQixTQUFTQyxJQUFJLFFBQVEsWUFBUztBQUU5QixTQUFTQyxXQUFXLFFBQVEsb0JBQWlCO0FBQzdDLFNBQVNDLGFBQWEsUUFBUSxzQkFBbUI7QUFJakQ7Ozs7Ozs7Q0FPQyxHQUNELE9BQU8sTUFBTUM7OztJQU1KQyxZQUFvQixVQUFVO0lBRXJDLFlBQ0UsQUFBVUMsYUFBOEIsRUFDeEMsQUFBVUMsYUFBOEIsQ0FDeEM7YUFGVUQsZ0JBQUFBO2FBQ0FDLGdCQUFBQTtJQUNUO0lBRUhDLE1BQU1DLEtBQWUsRUFBUTtRQUMzQixPQUFPVCxHQUFHUSxLQUFLLENBQUNDO0lBQ2xCO0lBRUFDLFFBQVFELEtBQWUsRUFBZTtRQUNwQyxzQkFBc0I7UUFDdEIsTUFBTUUsTUFBTVgsR0FBR1kscUJBQXFCLEdBQUdDLGNBQWMsQ0FBQ0o7UUFDdEQsSUFBSUUsS0FBSztZQUNQLE9BQU9BO1FBQ1Q7UUFFQSwrQkFBK0I7UUFDL0IsTUFBTUcsS0FBSyxJQUFJLENBQUNOLEtBQUssQ0FBQ0M7UUFDdEIsT0FBTyxJQUFJUCxZQUFZWSxJQUFJLElBQUlYO0lBQ2pDO0lBRUEsTUFBTVksVUFBVTtRQUNkLE9BQU9mLEdBQUdlLE9BQU87SUFDbkI7SUFFQSxNQUFNQyxlQUNKQyxHQUFTLEVBQ1RDLElBQXVCLEVBQ3ZCQyxTQUFp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
|
|
316
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9iYXNlLW1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKiBiaW9tZS1pZ25vcmUtYWxsIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBQdXJp7J2YIO2DgOyeheydgCDqsJzrs4Qg66qo64247JeQ7IScIO2ZleygleuQmOuvgOuhnCBCYXNlTW9kZWzsl5DshJzripQgYW5566W8IO2XiOyaqe2VqCAqL1xuXG5pbXBvcnQgdHlwZSB7IEtuZXggfSBmcm9tIFwia25leFwiO1xuaW1wb3J0IHsgZ3JvdXAsIGlzT2JqZWN0LCBvbWl0LCBzZXQgfSBmcm9tIFwicmFkYXNoaVwiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaVwiO1xuaW1wb3J0IHsgRW50aXR5TWFuYWdlciB9IGZyb20gXCIuLi9lbnRpdHkvZW50aXR5LW1hbmFnZXJcIjtcbmltcG9ydCB0eXBlIHsgRGF0YWJhc2VTY2hlbWFFeHRlbmQgfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGdldEpvaW5UYWJsZXMsIGdldFRhYmxlTmFtZXNGcm9tV2hlcmUgfSBmcm9tIFwiLi4vdXRpbHMvc3FsLXBhcnNlclwiO1xuaW1wb3J0IHsgY2h1bmsgfSBmcm9tIFwiLi4vdXRpbHMvdXRpbHNcIjtcbmltcG9ydCB0eXBlIHtcbiAgRW1iZWRkaW5nSXRlbSxcbiAgRW1iZWRkaW5nUHJvdmlkZXIsXG4gIEh5YnJpZFNlYXJjaE9wdGlvbnMsXG4gIEh5YnJpZFNlYXJjaFJlc3VsdCxcbiAgUHJvZ3Jlc3NDYWxsYmFjayxcbiAgVmVjdG9yU2VhcmNoT3B0aW9ucyxcbiAgVmVjdG9yU2VhcmNoUmVzdWx0LFxufSBmcm9tIFwiLi4vdmVjdG9yL3R5cGVzXCI7XG5pbXBvcnQgeyBWZWN0b3JTZWFyY2ggfSBmcm9tIFwiLi4vdmVjdG9yL3ZlY3Rvci1zZWFyY2hcIjtcbmltcG9ydCB0eXBlIHtcbiAgRW5oYW5jZXJNYXAsXG4gIEV4ZWN1dGVTdWJzZXRRdWVyeVJlc3VsdCxcbiAgUmVzb2x2ZVN1YnNldEludGVyc2VjdGlvbixcbiAgVW5pb25FeHRyYWN0ZWRUVGFibGVzLFxufSBmcm9tIFwiLi9iYXNlLW1vZGVsLnR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IERCUHJlc2V0IH0gZnJvbSBcIi4vZGJcIjtcbmltcG9ydCB7IERCIH0gZnJvbSBcIi4vZGJcIjtcbmltcG9ydCB7IFB1cmkgfSBmcm9tIFwiLi9wdXJpXCI7XG5pbXBvcnQgdHlwZSB7IEluZmVyQWxsU3Vic2V0cywgUHVyaUxvYWRlclF1ZXJpZXMsIFB1cmlTdWJzZXRGbiB9IGZyb20gXCIuL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5pbXBvcnQgeyBQdXJpV3JhcHBlciB9IGZyb20gXCIuL3B1cmktd3JhcHBlclwiO1xuaW1wb3J0IHsgVXBzZXJ0QnVpbGRlciB9IGZyb20gXCIuL3Vwc2VydC1idWlsZGVyXCI7XG5cbnR5cGUgVW5rbm93bkRCUmVjb3JkID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbi8qKlxuICog66qo65OgIE1vZGVsIO2BtOuemOyKpOydmCDquLDrs7gg7YG0656Y7IqkXG4gKlxuICogQHRlbXBsYXRlIFRTdWJzZXRLZXkgLSDshJzruIzshYsg7YKkIOycoOuLiOyYqCAo7JiIOiBcIkFcIiB8IFwiUFwiIHwgXCJTU1wiKVxuICogQHRlbXBsYXRlIFRTdWJzZXRNYXBwaW5nIC0g7ISc67iM7IWL67OEIOy1nOyihSDqsrDqs7wg7YOA7J6FIOunpO2VkVxuICogQHRlbXBsYXRlIFRTdWJzZXRRdWVyaWVzIC0g7ISc67iM7IWLIOy/vOumrCDtlajsiJgg6rCd7LK0XG4gKiBAdGVtcGxhdGUgVExvYWRlclF1ZXJpZXMgLSDshJzruIzshYvrs4Qg66Gc642UIOy/vOumrCDrsLDsl7Qg6rCd7LK0XG4gKi9cbmV4cG9ydCBjbGFzcyBCYXNlTW9kZWxDbGFzczxcbiAgVFN1YnNldEtleSBleHRlbmRzIHN0cmluZyA9IG5ldmVyLFxuICBUU3Vic2V0TWFwcGluZyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4gPSBuZXZlcixcbiAgVFN1YnNldFF1ZXJpZXMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgUHVyaVN1YnNldEZuPiA9IG5ldmVyLFxuICBUTG9hZGVyUXVlcmllcyBleHRlbmRzIFB1cmlMb2FkZXJRdWVyaWVzPFRTdWJzZXRLZXk+ID0gbmV2ZXIsXG4+IHtcbiAgcHVibGljIG1vZGVsTmFtZTogc3RyaW5nID0gXCJVbmtub3duXCI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHN1YnNldFF1ZXJpZXM/OiBUU3Vic2V0UXVlcmllcyxcbiAgICBwcm90ZWN0ZWQgbG9hZGVyUXVlcmllcz86IFRMb2FkZXJRdWVyaWVzLFxuICApIHt9XG5cbiAgZ2V0REIod2hpY2g6IERCUHJlc2V0KTogS25leCB7XG4gICAgcmV0dXJuIERCLmdldERCKHdoaWNoKTtcbiAgfVxuXG4gIGdldFB1cmkod2hpY2g6IERCUHJlc2V0KTogUHVyaVdyYXBwZXIge1xuICAgIC8vIO2KuOuenOyereyFmCDsu6jthY3siqTtirjsl5DshJwg7Yq4656c7J6t7IWYIO2ajeuTnVxuICAgIGNvbnN0IHRyeCA9IERCLmdldFRyYW5zYWN0aW9uQ29udGV4dCgpLmdldFRyYW5zYWN0aW9uKHdoaWNoKTtcbiAgICBpZiAodHJ4KSB7XG4gICAgICByZXR1cm4gdHJ4O1xuICAgIH1cblxuICAgIC8vIO2KuOuenOyereyFmOydtCDsl4bsnLzrqbQg7IOI66Gc7Jq0IFB1cmlXcmFwcGVyIOuwmO2ZmFxuICAgIGNvbnN0IGRiID0gdGhpcy5nZXREQih3aGljaCk7XG4gICAgcmV0dXJuIG5ldyBQdXJpV3JhcHBlcihkYiwgbmV3IFVwc2VydEJ1aWxkZXIoKSk7XG4gIH1cblxuICAvLyBWZWN0b3JTZWFyY2gg7J247Iqk7YS07IqkIOy6kOyLnFxuICBwcml2YXRlIF92ZWN0b3JTZWFyY2g6IFZlY3RvclNlYXJjaDxhbnk+IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIOuyoe2EsCDqsoDsg4kg7J247Iqk7YS07IqkIOuwmO2ZmFxuICAgKiAtIOq4sOuzuCBwcm92aWRlcjogdm95YWdlXG4gICAqIC0g6riw67O4IGRpbWVuc2lvbnM6IDEwMjQgKERFRkFVTFRfVkVDVE9SX0NPTkZJRyDsgqzsmqkpXG4gICAqL1xuICBnZXRWZWN0b3I8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpOiBWZWN0b3JTZWFyY2g8VD4ge1xuICAgIGlmICh0aGlzLl92ZWN0b3JTZWFyY2gpIHtcbiAgICAgIHJldHVybiB0aGlzLl92ZWN0b3JTZWFyY2ggYXMgVmVjdG9yU2VhcmNoPFQ+O1xuICAgIH1cblxuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHRoaXMubW9kZWxOYW1lKTtcblxuICAgIHRoaXMuX3ZlY3RvclNlYXJjaCA9IG5ldyBWZWN0b3JTZWFyY2g8VD4odGhpcy5nZXREQihcIndcIiksIGVudGl0eS50YWJsZSk7XG5cbiAgICByZXR1cm4gdGhpcy5fdmVjdG9yU2VhcmNoIGFzIFZlY3RvclNlYXJjaDxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiDrsqHthLAg6rKA7IOJICjsvZTsgqzsnbgg7Jyg7IKs64+EKVxuICAgKiBAcGFyYW0gcXVlcnkgLSDqsoDsg4nslrRcbiAgICogQHBhcmFtIG9wdGlvbnMgLSDqsoDsg4kg7Ji17IWYXG4gICAqL1xuICBhc3luYyB2ZWN0b3JTZWFyY2g8VCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+PihcbiAgICBxdWVyeTogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFZlY3RvclNlYXJjaE9wdGlvbnMgJiB7IHByb3ZpZGVyPzogRW1iZWRkaW5nUHJvdmlkZXIgfSA9IHt9LFxuICApOiBQcm9taXNlPFZlY3RvclNlYXJjaFJlc3VsdDxUPltdPiB7XG4gICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQodGhpcy5tb2RlbE5hbWUpO1xuICAgIGNvbnN0IHZlY3RvclByb3AgPSBlbnRpdHkuZ2V0VmVjdG9yQ29sdW1uKCk7XG4gICAgaWYgKCF2ZWN0b3JQcm9wKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dGhpcy5tb2RlbE5hbWV9IEVudGl0eeyXkCB2ZWN0b3Ig7Lus65+87J20IOygleydmOuQmOyngCDslYrslZjsirXri4jri6QuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgdnMgPSBuZXcgVmVjdG9yU2VhcmNoPFQ+KHRoaXMuZ2V0REIoXCJ3XCIpLCBlbnRpdHkudGFibGUpO1xuICAgIHJldHVybiB2cy5zZWFyY2gocXVlcnksIG9wdGlvbnMucHJvdmlkZXIgPz8gXCJ2b3lhZ2VcIiwge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGVtYmVkZGluZ0NvbHVtbjogb3B0aW9ucy5lbWJlZGRpbmdDb2x1bW4gPz8gdmVjdG9yUHJvcC5uYW1lLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIO2VmOydtOu4jOumrOuTnCDqsoDsg4kgKFZlY3RvciArIEZUUylcbiAgICogQHBhcmFtIHF1ZXJ5IC0g6rKA7IOJ7Ja0XG4gICAqIEBwYXJhbSBvcHRpb25zIC0g6rKA7IOJIOyYteyFmFxuICAgKi9cbiAgYXN5bmMgaHlicmlkU2VhcmNoPFQgPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oXG4gICAgcXVlcnk6IHN0cmluZyxcbiAgICBvcHRpb25zOiBIeWJyaWRTZWFyY2hPcHRpb25zICYgeyBwcm92aWRlcj86IEVtYmVkZGluZ1Byb3ZpZGVyIH0gPSB7fSxcbiAgKTogUHJvbWlzZTxIeWJyaWRTZWFyY2hSZXN1bHQ8VD5bXT4ge1xuICAgIGNvbnN0IGVudGl0eSA9IEVudGl0eU1hbmFnZXIuZ2V0KHRoaXMubW9kZWxOYW1lKTtcbiAgICBjb25zdCB2ZWN0b3JQcm9wID0gZW50aXR5LmdldFZlY3RvckNvbHVtbigpO1xuICAgIGlmICghdmVjdG9yUHJvcCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubW9kZWxOYW1lfSBFbnRpdHnsl5AgdmVjdG9yIOy7rOufvOydtCDsoJXsnZjrkJjsp4Ag7JWK7JWY7Iq164uI64ukLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHZzID0gbmV3IFZlY3RvclNlYXJjaDxUPih0aGlzLmdldERCKFwid1wiKSwgZW50aXR5LnRhYmxlKTtcbiAgICByZXR1cm4gdnMuaHlicmlkU2VhcmNoKHF1ZXJ5LCBvcHRpb25zLnByb3ZpZGVyID8/IFwidm95YWdlXCIsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBlbWJlZGRpbmdDb2x1bW46IG9wdGlvbnMuZW1iZWRkaW5nQ29sdW1uID8/IHZlY3RvclByb3AubmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiDri6jsnbwg66CI7L2U65Oc7JeQIOyehOuyoOuUqSDsoIDsnqVcbiAgICogQHBhcmFtIGlkIC0g66CI7L2U65OcIElEXG4gICAqIEBwYXJhbSB0ZXh0IC0g7J6E67Kg65Sp7ZWgIO2FjeyKpO2KuFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIHByb3ZpZGVyLCBlbWJlZGRpbmdDb2x1bW4g7Ji17IWYXG4gICAqL1xuICBhc3luYyBzYXZlRW1iZWRkaW5nKFxuICAgIGlkOiBudW1iZXIsXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IHsgcHJvdmlkZXI/OiBFbWJlZGRpbmdQcm92aWRlcjsgZW1iZWRkaW5nQ29sdW1uPzogc3RyaW5nIH0gPSB7fSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQodGhpcy5tb2RlbE5hbWUpO1xuICAgIGNvbnN0IHZlY3RvclByb3AgPSBlbnRpdHkuZ2V0VmVjdG9yQ29sdW1uKG9wdGlvbnMuZW1iZWRkaW5nQ29sdW1uKTtcbiAgICBpZiAoIXZlY3RvclByb3ApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm1vZGVsTmFtZX0gRW50aXR57JeQIHZlY3RvciDsu6zrn7zsnbQg7KCV7J2Y65CY7KeAIOyViuyVmOyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHByb3ZpZGVyID0gXCJ2b3lhZ2VcIiB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB2cyA9IHRoaXMuZ2V0VmVjdG9yKCk7XG4gICAgcmV0dXJuIHZzLnNhdmVFbWJlZGRpbmcoaWQsIHRleHQsIHByb3ZpZGVyLCB2ZWN0b3JQcm9wLm5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyXrOufrCDroIjsvZTrk5zsl5Ag7J6E67Kg65SpIOydvOq0hCDsoIDsnqVcbiAgICogQHBhcmFtIGl0ZW1zIC0geyBpZCwgdGV4dCB9IOuwsOyXtFxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIHByb3ZpZGVyLCBlbWJlZGRpbmdDb2x1bW4sIG9uUHJvZ3Jlc3Mg7Ji17IWYXG4gICAqL1xuICBhc3luYyBzYXZlRW1iZWRkaW5nc0JhdGNoKFxuICAgIGl0ZW1zOiBFbWJlZGRpbmdJdGVtW10sXG4gICAgb3B0aW9uczoge1xuICAgICAgcHJvdmlkZXI/OiBFbWJlZGRpbmdQcm92aWRlcjtcbiAgICAgIGVtYmVkZGluZ0NvbHVtbj86IHN0cmluZztcbiAgICAgIG9uUHJvZ3Jlc3M/OiBQcm9ncmVzc0NhbGxiYWNrO1xuICAgIH0gPSB7fSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZW50aXR5ID0gRW50aXR5TWFuYWdlci5nZXQodGhpcy5tb2RlbE5hbWUpO1xuICAgIGNvbnN0IHZlY3RvclByb3AgPSBlbnRpdHkuZ2V0VmVjdG9yQ29sdW1uKG9wdGlvbnMuZW1iZWRkaW5nQ29sdW1uKTtcbiAgICBpZiAoIXZlY3RvclByb3ApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm1vZGVsTmFtZX0gRW50aXR57JeQIHZlY3RvciDsu6zrn7zsnbQg7KCV7J2Y65CY7KeAIOyViuyVmOyKteuLiOuLpC5gKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHByb3ZpZGVyID0gXCJ2b3lhZ2VcIiwgb25Qcm9ncmVzcyB9ID0gb3B0aW9ucztcbiAgICBjb25zdCB2cyA9IHRoaXMuZ2V0VmVjdG9yKCk7XG4gICAgcmV0dXJuIHZzLnNhdmVFbWJlZGRpbmdzQmF0Y2goaXRlbXMsIHByb3ZpZGVyLCB2ZWN0b3JQcm9wLm5hbWUsIG9uUHJvZ3Jlc3MpO1xuICB9XG5cbiAgYXN5bmMgZGVzdHJveSgpIHtcbiAgICB0aGlzLl92ZWN0b3JTZWFyY2ggPSBudWxsO1xuICAgIHJldHVybiBEQi5kZXN0cm95KCk7XG4gIH1cblxuICBhc3luYyBnZXRJbnNlcnRlZElkcyhcbiAgICB3ZGI6IEtuZXgsXG4gICAgcm93czogVW5rbm93bkRCUmVjb3JkW10sXG4gICAgdGFibGVOYW1lOiBzdHJpbmcsXG4gICAgdW5xS2V5RmllbGRzOiBzdHJpbmdbXSxcbiAgICBjaHVua1NpemU6IG51bWJlciA9IDUwMCxcbiAgKSB7XG4gICAgaWYgKCF3ZGIpIHtcbiAgICAgIHdkYiA9IHRoaXMuZ2V0REIoXCJ3XCIpO1xuICAgIH1cblxuICAgIGxldCB1bnFLZXlzOiBzdHJpbmdbXTtcbiAgICBsZXQgd2hlcmVJbkZpZWxkOiBzdHJpbmcgfCBLbmV4LlJhdztcbiAgICBsZXQgc2VsZWN0RmllbGQ6IHN0cmluZztcblxuICAgIGlmICh1bnFLZXlGaWVsZHMubGVuZ3RoID4gMSkge1xuICAgICAgd2hlcmVJbkZpZWxkID0gd2RiLnJhdyhgQ09OQ0FUX1dTKCdfJywgJyR7dW5xS2V5RmllbGRzLmpvaW4oXCIsXCIpfScpYCk7XG4gICAgICBzZWxlY3RGaWVsZCA9IGAke3doZXJlSW5GaWVsZH0gYXMgdG1wVWlkYDtcbiAgICAgIHVucUtleXMgPSByb3dzLm1hcCgocm93KSA9PiB1bnFLZXlGaWVsZHMubWFwKChmaWVsZCkgPT4gcm93W2ZpZWxkXSkuam9pbihcIl9cIikpO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aGVyZUluRmllbGQgPSB1bnFLZXlGaWVsZHNbMF07XG4gICAgICBzZWxlY3RGaWVsZCA9IHVucUtleUZpZWxkc1swXTtcbiAgICAgIHVucUtleXMgPSByb3dzLm1hcCgocm93KSA9PiByb3dbdW5xS2V5RmllbGRzWzBdXSBhcyBzdHJpbmcpO1xuICAgIH1cblxuICAgIGxldCByZXN1bHRJZHM6IG51bWJlcltdID0gW107XG4gICAgZm9yIChjb25zdCBpdGVtcyBvZiBjaHVuayh1bnFLZXlzLCBjaHVua1NpemUpKSB7XG4gICAgICBjb25zdCBkYlJvd3MgPSBhd2FpdCB3ZGIodGFibGVOYW1lKVxuICAgICAgICAuc2VsZWN0KFwiaWRcIiwgd2RiLnJhdyhzZWxlY3RGaWVsZCkpXG4gICAgICAgIC53aGVyZUluKHdoZXJlSW5GaWVsZCBhcyBzdHJpbmcsIGl0ZW1zKTtcbiAgICAgIHJlc3VsdElkcyA9IHJlc3VsdElkcy5jb25jYXQoXG4gICAgICAgIGRiUm93cy5tYXAoKGRiUm93OiBVbmtub3duREJSZWNvcmQpID0+IHBhcnNlSW50KFN0cmluZyhkYlJvdy5pZCkpKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdElkcztcbiAgfVxuXG4gIC8qKlxuICAgKiDtirnsoJUg7ISc67iM7IWL7JeQIOuMgO2VnCDsv7zrpqwg67mM642UIO2ajeuTnVxuICAgKlxuICAgKiBAcmV0dXJucyBxYiAtIOy/vOumrCDruYzrjZQgKOyhsOqxtCDstpTqsIDsmqkpXG4gICAqIEByZXR1cm5zIG9uU3Vic2V0IC0g7Yq57KCVIOyEnOu4jOyFiyDsoITsmqkg7YOA7J6F7J20IO2VhOyalO2VoCDrlYwg7IKs7JqpXG4gICAqL1xuICBnZXRTdWJzZXRRdWVyaWVzPFQgZXh0ZW5kcyBUU3Vic2V0S2V5PihzdWJzZXQ6IFQpIHtcbiAgICBpZiAoIXRoaXMuc3Vic2V0UXVlcmllcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwic3Vic2V0UXVlcmllcyBpcyBub3QgZGVmaW5lZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBwdXJpV3JhcHBlciA9IG5ldyBQdXJpV3JhcHBlcih0aGlzLmdldERCKFwiclwiKSwgbmV3IFVwc2VydEJ1aWxkZXIoKSk7XG4gICAgY29uc3QgcWIgPSB0aGlzLnN1YnNldFF1ZXJpZXNbc3Vic2V0XT8uKHB1cmlXcmFwcGVyKTtcblxuICAgIC8vIE5vbkFsbG93ZWRBc1NpbmdsZVRhYmxlOiDri6jsnbwg7YWM7J2067iUIOy7rOufvCDsoJHqt7wg67Cp7KeA7JqpIOuniOy7pFxuICAgIHR5cGUgUUJUYWJsZXMgPSBVbmlvbkV4dHJhY3RlZFRUYWJsZXM8VFN1YnNldEtleSwgVFN1YnNldFF1ZXJpZXM+ICYge1xuICAgICAgTm9uQWxsb3dlZEFzU2luZ2xlVGFibGU6IHsgX19mdWxsdGV4dF9fOiB0cnVlIH07XG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBxYjogcWIgYXMgdW5rbm93biBhcyBQdXJpPERhdGFiYXNlU2NoZW1hRXh0ZW5kLCBRQlRhYmxlcywge30+LFxuICAgICAgb25TdWJzZXQ6ICgoX3N1YnNldDogVFN1YnNldEtleSB8IHJlYWRvbmx5IFRTdWJzZXRLZXlbXSkgPT4gcWIpIGFzIHtcbiAgICAgICAgLy8g64uo7J28IO2CpFxuICAgICAgICA8UyBleHRlbmRzIFRTdWJzZXRLZXk+KHN1YnNldDogUyk6IFJldHVyblR5cGU8VFN1YnNldFF1ZXJpZXNbU10+O1xuICAgICAgICAvLyDtgqQg67Cw7Je0IC0+IOq1kOynke2VqSDrsJjtmZhcbiAgICAgICAgPEFyciBleHRlbmRzIHJlYWRvbmx5IFRTdWJzZXRLZXlbXT4oXG4gICAgICAgICAgc3Vic2V0czogWy4uLkFycl0sXG4gICAgICAgICk6IFJlc29sdmVTdWJzZXRJbnRlcnNlY3Rpb248QXJyLCBUU3Vic2V0UXVlcmllcz47XG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogRW5oYW5jZXIg6rCd7LK0IOyDneyEsSDtl6ztjbxcbiAgICog7YOA7J6FIOqygOymnSDrsI8g7LaU66Gg7J2EIOuPhOyZgOykjFxuICAgKi9cbiAgY3JlYXRlRW5oYW5jZXJzPFQgZXh0ZW5kcyBUU3Vic2V0S2V5PihcbiAgICBlbmhhbmNlcnM6IEVuaGFuY2VyTWFwPFQsIEluZmVyQWxsU3Vic2V0czxUU3Vic2V0UXVlcmllcywgVExvYWRlclF1ZXJpZXM+LCBUU3Vic2V0TWFwcGluZz4sXG4gICkge1xuICAgIHJldHVybiBlbmhhbmNlcnM7XG4gIH1cblxuICAvKipcbiAgICog7ISc67iM7IWLIOy/vOumrCDsi6TtlolcbiAgICpcbiAgICogMS4g7L+866asIOyLpO2WiSAocGFnaW5hdGlvbiDsoIHsmqkpXG4gICAqIDIuIOuhnOuNlCDsi6TtlokgKDE6TiwgTjpNIOq0gOqzhCDrjbDsnbTthLAg66Gc65SpKVxuICAgKiAzLiBIeWRyYXRlIChmbGF0IOKGkiDspJHssqkg6rCd7LK0KVxuICAgKiA0LiBFbmhhbmNlciDsoIHsmqkgKHZpcnR1YWwg7ZWE65OcIOqzhOyCsClcbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVTdWJzZXRRdWVyeTxcbiAgICBUIGV4dGVuZHMgVFN1YnNldEtleSxcbiAgICBUQ29tcHV0ZWRSZXN1bHRzIGV4dGVuZHMgSW5mZXJBbGxTdWJzZXRzPFRTdWJzZXRRdWVyaWVzLCBUTG9hZGVyUXVlcmllcz4sXG4gID4oXG4gICAgcGFyYW1zOiB7XG4gICAgICBzdWJzZXQ6IFQ7XG4gICAgICBxYjogUHVyaTxhbnksIGFueSwgYW55PjtcbiAgICAgIHBhcmFtczoge1xuICAgICAgICBudW06IG51bWJlcjtcbiAgICAgICAgcGFnZTogbnVtYmVyO1xuICAgICAgICBxdWVyeU1vZGU/OiBcImxpc3RcIiB8IFwiY291bnRcIiB8IFwiYm90aFwiO1xuICAgICAgfTtcbiAgICAgIGRlYnVnPzogYm9vbGVhbjtcbiAgICAgIG9wdGltaXplQ291bnRRdWVyeT86IGJvb2xlYW47XG4gICAgfSAmIEVuaGFuY2VyUGFyYW08VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+LFxuICApOiBQcm9taXNlPEV4ZWN1dGVTdWJzZXRRdWVyeVJlc3VsdDxUU3Vic2V0TWFwcGluZywgVD4+IHtcbiAgICBjb25zdCB7IHN1YnNldCwgcWIsIHBhcmFtczogcXVlcnlQYXJhbXMsIGRlYnVnID0gZmFsc2UsIG9wdGltaXplQ291bnRRdWVyeSA9IGZhbHNlIH0gPSBwYXJhbXM7XG5cbiAgICBpZiAoIXRoaXMubG9hZGVyUXVlcmllcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwibG9hZGVyUXVlcmllcyBpcyBub3QgZGVmaW5lZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCB7IG51bSwgcGFnZSB9ID0gcXVlcnlQYXJhbXM7XG5cbiAgICAvLyBDT1VOVCDsv7zrpqwg7Iuk7ZaJXG4gICAgY29uc3QgdG90YWwgPSBhd2FpdCB0aGlzLmV4ZWN1dGVDb3VudFF1ZXJ5KHFiLCBxdWVyeVBhcmFtcywgZGVidWcsIG9wdGltaXplQ291bnRRdWVyeSk7XG5cbiAgICAvLyBMSVNUIOy/vOumrCDsi6TtlolcbiAgICBjb25zdCBjb21wdXRlZFJvd3MgPSBhd2FpdCB0aGlzLmV4ZWN1dGVMaXN0UXVlcnkoc3Vic2V0LCBxYiwgcXVlcnlQYXJhbXMsIG51bSwgcGFnZSwgZGVidWcpO1xuXG4gICAgLy8gRW5oYW5jZXIg7KCB7JqpXG4gICAgY29uc3QgZW5oYW5jZXIgPSAocGFyYW1zIGFzIGFueSkuZW5oYW5jZXJzPy5bc3Vic2V0XTtcbiAgICBjb25zdCByb3dzID0gKGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgY29tcHV0ZWRSb3dzLm1hcCgocm93KSA9PiBlbmhhbmNlcj8uKHJvdykgPz8gcm93KSxcbiAgICApKSBhcyBUU3Vic2V0TWFwcGluZ1tUXVtdO1xuXG4gICAgcmV0dXJuIHsgcm93cywgdG90YWwgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDT1VOVCDsv7zrpqwg7Iuk7ZaJICjrgrTrtoAg66mU7ISc65OcKVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlQ291bnRRdWVyeShcbiAgICBxYjogUHVyaTxhbnksIGFueSwgYW55PixcbiAgICBwYXJhbXM6IHsgcXVlcnlNb2RlPzogXCJsaXN0XCIgfCBcImNvdW50XCIgfCBcImJvdGhcIiB9LFxuICAgIGRlYnVnOiBib29sZWFuLFxuICAgIG9wdGltaXplQ291bnRRdWVyeTogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAocGFyYW1zLnF1ZXJ5TW9kZSA9PT0gXCJsaXN0XCIpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGNvbnN0IGNvdW50UHVyaSA9IHFiLmNsb25lKCkuY2xlYXIoXCJvcmRlclwiKS5jbGVhcihcImxpbWl0XCIpLmNsZWFyKFwib2Zmc2V0XCIpO1xuXG4gICAgaWYgKG9wdGltaXplQ291bnRRdWVyeSkge1xuICAgICAgY29uc3QgeyBkZWZhdWx0OiBTcWxQYXJzZXIgfSA9IGF3YWl0IGltcG9ydChcIm5vZGUtc3FsLXBhcnNlclwiKTtcbiAgICAgIGNvbnN0IHBhcnNlciA9IG5ldyBTcWxQYXJzZXIuUGFyc2VyKCk7XG4gICAgICBjb25zdCBwYXJzZWRRdWVyeSA9IHBhcnNlci5hc3RpZnkoY291bnRQdXJpLnRvUXVlcnkoKSwge1xuICAgICAgICBkYXRhYmFzZTogU29uYW11LmNvbmZpZy5kYXRhYmFzZS5kYXRhYmFzZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBsZWZ0Sm9pblRhYmxlcyA9IGdldEpvaW5UYWJsZXMocGFyc2VkUXVlcnksIFtcIkxFRlQgSk9JTlwiXSk7XG4gICAgICBjb25zdCB3aGVyZVRhYmxlcyA9IGdldFRhYmxlTmFtZXNGcm9tV2hlcmUocGFyc2VkUXVlcnkpO1xuXG4gICAgICBjb25zdCB0YWJsZXNUb1JlbW92ZSA9IGxlZnRKb2luVGFibGVzLmZpbHRlcigoaikgPT4gIXdoZXJlVGFibGVzLmluY2x1ZGVzKGopKTtcbiAgICAgIHRhYmxlc1RvUmVtb3ZlLmZvckVhY2goKHRhYmxlKSA9PiB7XG4gICAgICAgIGNvdW50UHVyaS5jbGVhckpvaW4odGFibGUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQ09VTlQoKinroZwg7KCE7LK0IOugiOy9lOuTnCDsiJjrpbwg6rOE7IKwXG4gICAgLy8gVE9ETzogcWLsnZggRElTVElOQ1TqsIAg7J6I64qUIOqyveyasCDsspjrpqztlbTslbwg7ZWoXG4gICAgY29uc3QgY291bnRSZXN1bHQ6IHsgdG90YWw/OiBudW1iZXIgfSA9IGF3YWl0IGNvdW50UHVyaVxuICAgICAgLmNsZWFyKFwic2VsZWN0XCIpXG4gICAgICAuc2VsZWN0KHsgdG90YWw6IFB1cmkucmF3TnVtYmVyKGBDT1VOVCgqKTo6aW50ZWdlcmApIH0pXG4gICAgICAuZmlyc3QoKTtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgY291bnRQdXJpLmRlYnVnKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvdW50UmVzdWx0Py50b3RhbCA/PyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIExJU1Qg7L+866asIOyLpO2WiSAo64K067aAIOuplOyEnOuTnClcbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZUxpc3RRdWVyeTxUIGV4dGVuZHMgVFN1YnNldEtleT4oXG4gICAgc3Vic2V0OiBULFxuICAgIHFiOiBQdXJpPGFueSwgYW55LCBhbnk+LFxuICAgIHBhcmFtczogeyBxdWVyeU1vZGU/OiBcImxpc3RcIiB8IFwiY291bnRcIiB8IFwiYm90aFwiIH0sXG4gICAgbnVtOiBudW1iZXIsXG4gICAgcGFnZTogbnVtYmVyLFxuICAgIGRlYnVnOiBib29sZWFuLFxuICApOiBQcm9taXNlPGFueVtdPiB7XG4gICAgaWYgKHBhcmFtcy5xdWVyeU1vZGUgPT09IFwiY291bnRcIikge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbWl0ZWRRYiA9ICgoKSA9PiB7XG4gICAgICBpZiAobnVtID09PSAwKSB7XG4gICAgICAgIHJldHVybiBxYjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBxYi5saW1pdChudW0pLm9mZnNldChudW0gKiAocGFnZSAtIDEpKTtcbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIGxldCB1bmxvYWRlZFJvd3MgPSAoYXdhaXQgbGltaXRlZFFiKSBhcyBhbnlbXTtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgcWIuZGVidWcoKTtcbiAgICB9XG5cbiAgICAvLyDroZzrjZQg7LKY66asXG4gICAgY29uc3QgbG9hZGVycyA9ICh0aGlzLmxvYWRlclF1ZXJpZXMgYXMgYW55KVtzdWJzZXRdO1xuICAgIGlmIChsb2FkZXJzICYmIEFycmF5LmlzQXJyYXkobG9hZGVycykpIHtcbiAgICAgIHVubG9hZGVkUm93cyA9IGF3YWl0IHRoaXMucHJvY2Vzc0xvYWRlcnModW5sb2FkZWRSb3dzLCBsb2FkZXJzLCBkZWJ1Zyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaHlkcmF0ZSh1bmxvYWRlZFJvd3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIOyerOq3gOyggSDroZzrjZQg7LKY66asXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHByb2Nlc3NMb2FkZXJzKHJvd3M6IGFueVtdLCBsb2FkZXJzOiBhbnlbXSwgZGVidWc6IGJvb2xlYW4pOiBQcm9taXNlPGFueVtdPiB7XG4gICAgZm9yIChjb25zdCByZXNvbHZlTG9hZGVyIG9mIGxvYWRlcnMpIHtcbiAgICAgIGNvbnN0IHsgYXMsIHJlZklkLCBxYjogcmVzb2x2ZUxvYWRlclFiRm4sIGxvYWRlcnM6IG5lc3RlZExvYWRlcnMgfSA9IHJlc29sdmVMb2FkZXI7XG5cbiAgICAgIGNvbnN0IHJlc29sdmVMb2FkZXJRYiA9IHJlc29sdmVMb2FkZXJRYkZuKFxuICAgICAgICBuZXcgUHVyaVdyYXBwZXIodGhpcy5nZXREQihcInJcIiksIG5ldyBVcHNlcnRCdWlsZGVyKCkpLFxuICAgICAgICByb3dzLm1hcCgocm93KSA9PiByb3dbcmVmSWRdKSxcbiAgICAgICk7XG5cbiAgICAgIGlmIChkZWJ1Zykge1xuICAgICAgICByZXNvbHZlTG9hZGVyUWIuZGVidWcoKTtcbiAgICAgIH1cblxuICAgICAgbGV0IGxvYWRlZFJvd3MgPSAoYXdhaXQgcmVzb2x2ZUxvYWRlclFiKSBhcyBhbnlbXTtcblxuICAgICAgLy8g7KSR7LKpIGxvYWRlcnPqsIAg7J6I7Jy866m0IOyerOq3gCDsspjrpqxcbiAgICAgIGlmIChuZXN0ZWRMb2FkZXJzICYmIG5lc3RlZExvYWRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBsb2FkZWRSb3dzID0gYXdhaXQgdGhpcy5wcm9jZXNzTG9hZGVycyhsb2FkZWRSb3dzLCBuZXN0ZWRMb2FkZXJzLCBkZWJ1Zyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN1YlJvd0dyb3VwcyA9IGdyb3VwKGxvYWRlZFJvd3MsIChyb3cpID0+IHJvdy5yZWZJZCk7XG5cbiAgICAgIHJvd3MgPSByb3dzLm1hcCgocm93KSA9PiB7XG4gICAgICAgIHJvd1thc10gPSAoc3ViUm93R3JvdXBzW3Jvd1tyZWZJZF1dID8/IFtdKS5tYXAoKHIpID0+IG9taXQociwgW1wicmVmSWRcIl0pKTtcbiAgICAgICAgcmV0dXJuIHJvdztcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByb3dzO1xuICB9XG5cbiAgLyoqXG4gICAqIEZsYXQg66CI7L2U65Oc66W8IOykkeyyqSDqsJ3ssrTroZwg67OA7ZmYXG4gICAqXG4gICAqIC0gYHVzZXJfX25hbWVgIOKGkiBgeyB1c2VyOiB7IG5hbWUgfSB9YFxuICAgKiAtIG51bGxhYmxlIHJlbGF0aW9u7J2YIOqyveyasCBpZCDtlYTrk5zqsIAgbnVsbOydtOuptCDqsJ3ssrQg7J6Q7LK066W8IG51bGzroZxcbiAgICovXG4gIGh5ZHJhdGU8VCBleHRlbmRzIFVua25vd25EQlJlY29yZD4ocm93czogVFtdKTogVFtdIHtcbiAgICByZXR1cm4gcm93cy5tYXAoKHJvdzogVCkgPT4ge1xuICAgICAgLy8gbnVsbGFibGUgcmVsYXRpb24g7LKY66asOiDqt7jro7nsnZggaWQg7ZWE65Oc6rCAIG51bGzsnbTrqbQg6rCd7LK0IOyghOyytOulvCBudWxs66GcXG4gICAgICBjb25zdCBuZXN0ZWRLZXlzID0gT2JqZWN0LmtleXMocm93KS5maWx0ZXIoKGtleSkgPT4ga2V5LmluY2x1ZGVzKFwiX19cIikpO1xuICAgICAgY29uc3QgZ3JvdXBzID0gT2JqZWN0Lmdyb3VwQnkobmVzdGVkS2V5cywgKGtleSkgPT4ga2V5LnNwbGl0KFwiX19cIilbMF0pO1xuXG4gICAgICAvLyBpZCDtlYTrk5zqsIAgbnVsbOyduCDqt7jro7kg7LC+6riwICjsmIg6IHBhcmVudF9faWTqsIAgbnVsbOydtOuptCBwYXJlbnQg6re466O5IOyghOyytOqwgCBudWxsKVxuICAgICAgY29uc3QgbnVsbEtleXMgPSBPYmplY3QuZW50cmllcyhncm91cHMpXG4gICAgICAgIC5maWx0ZXIoKFtncm91cEtleSwgZmllbGRzXSkgPT4ge1xuICAgICAgICAgIGlmICghZmllbGRzIHx8IGZpZWxkcy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgIC8vIOq3uOujueydmCBpZCDtlYTrk5wg7LC+6riwICjsmIg6IFwicGFyZW50X19pZFwiKVxuICAgICAgICAgIGNvbnN0IGlkRmllbGQgPSBgJHtncm91cEtleX1fX2lkYDtcbiAgICAgICAgICBpZiAoaWRGaWVsZCBpbiByb3cpIHtcbiAgICAgICAgICAgIC8vIGlkIO2VhOuTnOqwgCBudWxs7J2066m0IOqwneyytCDsoITssrTqsIAgbnVsbFxuICAgICAgICAgICAgcmV0dXJuIHJvd1tpZEZpZWxkXSA9PT0gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBpZCDtlYTrk5zqsIAg7JeG7Jy866m0IOq4sOyhtCDroZzsp4E6IOuqqOuToCDtlYTrk5zqsIAgbnVsbOyduOyngCDtmZXsnbhcbiAgICAgICAgICByZXR1cm4gZmllbGRzLmV2ZXJ5KFxuICAgICAgICAgICAgKGZpZWxkKSA9PlxuICAgICAgICAgICAgICByb3dbZmllbGRdID09PSBudWxsIHx8IChBcnJheS5pc0FycmF5KHJvd1tmaWVsZF0pICYmIHJvd1tmaWVsZF0ubGVuZ3RoID09PSAwKSxcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAubWFwKChba2V5XSkgPT4ga2V5KTtcblxuICAgICAgY29uc3QgaHlkcmF0ZWQgPSBPYmplY3Qua2V5cyhyb3cpLnJlZHVjZSgociwgZmllbGQpID0+IHtcbiAgICAgICAgaWYgKCFmaWVsZC5pbmNsdWRlcyhcIl9fXCIpKSB7XG4gICAgICAgICAgLy8g7J2867CYIO2VhOuTnDog67Cw7Je0IOuCtCDqsJ3ssrTrqbQg7J6s6reAIGh5ZHJhdGVcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyb3dbZmllbGRdKSAmJiBpc09iamVjdChyb3dbZmllbGRdWzBdKSkge1xuICAgICAgICAgICAgcltmaWVsZF0gPSB0aGlzLmh5ZHJhdGUocm93W2ZpZWxkXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJbZmllbGRdID0gcm93W2ZpZWxkXTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyDspJHssqkg7ZWE65OcIOyymOumrDogdXNlcl9fbmFtZSDihpIgdXNlcltuYW1lXVxuICAgICAgICBjb25zdCBwYXJ0cyA9IGZpZWxkLnNwbGl0KFwiX19cIik7XG4gICAgICAgIGNvbnN0IG9ialBhdGggPVxuICAgICAgICAgIHBhcnRzWzBdICtcbiAgICAgICAgICBwYXJ0c1xuICAgICAgICAgICAgLnNsaWNlKDEpXG4gICAgICAgICAgICAubWFwKChwYXJ0KSA9PiBgWyR7cGFydH1dYClcbiAgICAgICAgICAgIC5qb2luKFwiXCIpO1xuXG4gICAgICAgIHIgPSBzZXQoXG4gICAgICAgICAgcixcbiAgICAgICAgICBvYmpQYXRoLFxuICAgICAgICAgIHJvd1tmaWVsZF0gJiYgQXJyYXkuaXNBcnJheShyb3dbZmllbGRdKSAmJiBpc09iamVjdChyb3dbZmllbGRdWzBdKVxuICAgICAgICAgICAgPyB0aGlzLmh5ZHJhdGUocm93W2ZpZWxkXSlcbiAgICAgICAgICAgIDogcm93W2ZpZWxkXSxcbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gcjtcbiAgICAgIH0sIHt9IGFzIFVua25vd25EQlJlY29yZCk7XG5cbiAgICAgIC8vIG51bGwgcmVsYXRpb24g7LKY66asXG4gICAgICBudWxsS2V5cy5mb3JFYWNoKChudWxsS2V5KSA9PiB7XG4gICAgICAgIGh5ZHJhdGVkW251bGxLZXldID0gbnVsbDtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gaHlkcmF0ZWQ7XG4gICAgfSkgYXMgVFtdO1xuICB9XG59XG5cbi8qKlxuICogRW5oYW5jZXIg7YyM652866+47YSwIOyhsOqxtOu2gCDtg4DsnoVcbiAqIFJlcXVpcmVkRW5oYW5jZXJLZXlz6rCAIOyXhuycvOuptCBlbmhhbmNlcnMg7ISg7YOd7KCBLCDsnojsnLzrqbQg7ZWE7IiYXG4gKi9cbnR5cGUgRW5oYW5jZXJQYXJhbTxcbiAgVFN1YnNldEtleSBleHRlbmRzIHN0cmluZyxcbiAgVENvbXB1dGVkUmVzdWx0cyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuICBUU3Vic2V0TWFwcGluZyBleHRlbmRzIFJlY29yZDxUU3Vic2V0S2V5LCBhbnk+LFxuPiA9IFtSZXF1aXJlZEVuaGFuY2VyS2V5czxUU3Vic2V0S2V5LCBUQ29tcHV0ZWRSZXN1bHRzLCBUU3Vic2V0TWFwcGluZz5dIGV4dGVuZHMgW25ldmVyXVxuICA/IHsgZW5oYW5jZXJzPzogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+IH1cbiAgOiB7IGVuaGFuY2VyczogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+IH07XG5cbnR5cGUgUmVxdWlyZWRFbmhhbmNlcktleXM8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55PixcbiAgVFN1YnNldE1hcHBpbmcgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55Pixcbj4gPSB7XG4gIFtLIGluIFRTdWJzZXRLZXldOiBUQ29tcHV0ZWRSZXN1bHRzW0tdIGV4dGVuZHMgVFN1YnNldE1hcHBpbmdbS10gPyBuZXZlciA6IEs7XG59W1RTdWJzZXRLZXldO1xuXG5leHBvcnQgY29uc3QgQmFzZU1vZGVsID0gbmV3IEJhc2VNb2RlbENsYXNzKCk7XG4iXSwibmFtZXMiOlsiZ3JvdXAiLCJpc09iamVjdCIsIm9taXQiLCJzZXQiLCJTb25hbXUiLCJFbnRpdHlNYW5hZ2VyIiwiZ2V0Sm9pblRhYmxlcyIsImdldFRhYmxlTmFtZXNGcm9tV2hlcmUiLCJjaHVuayIsIlZlY3RvclNlYXJjaCIsIkRCIiwiUHVyaSIsIlB1cmlXcmFwcGVyIiwiVXBzZXJ0QnVpbGRlciIsIkJhc2VNb2RlbENsYXNzIiwibW9kZWxOYW1lIiwic3Vic2V0UXVlcmllcyIsImxvYWRlclF1ZXJpZXMiLCJnZXREQiIsIndoaWNoIiwiZ2V0UHVyaSIsInRyeCIsImdldFRyYW5zYWN0aW9uQ29udGV4dCIsImdldFRyYW5zYWN0aW9uIiwiZGIiLCJfdmVjdG9yU2VhcmNoIiwiZ2V0VmVjdG9yIiwiZW50aXR5IiwiZ2V0IiwidGFibGUiLCJ2ZWN0b3JTZWFyY2giLCJxdWVyeSIsIm9wdGlvbnMiLCJ2ZWN0b3JQcm9wIiwiZ2V0VmVjdG9yQ29sdW1uIiwiRXJyb3IiLCJ2cyIsInNlYXJjaCIsInByb3ZpZGVyIiwiZW1iZWRkaW5nQ29sdW1uIiwibmFtZSIsImh5YnJpZFNlYXJjaCIsInNhdmVFbWJlZGRpbmciLCJpZCIsInRleHQiLCJzYXZlRW1iZWRkaW5nc0JhdGNoIiwiaXRlbXMiLCJvblByb2dyZXNzIiwiZGVzdHJveSIsImdldEluc2VydGVkSWRzIiwid2RiIiwicm93cyIsInRhYmxlTmFtZSIsInVucUtleUZpZWxkcyIsImNodW5rU2l6ZSIsInVucUtleXMiLCJ3aGVyZUluRmllbGQiLCJzZWxlY3RGaWVsZCIsImxlbmd0aCIsInJhdyIsImpvaW4iLCJtYXAiLCJyb3ciLCJmaWVsZCIsInJlc3VsdElkcyIsImRiUm93cyIsInNlbGVjdCIsIndoZXJlSW4iLCJjb25jYXQiLCJkYlJvdyIsInBhcnNlSW50IiwiU3RyaW5nIiwiZ2V0U3Vic2V0UXVlcmllcyIsInN1YnNldCIsInB1cmlXcmFwcGVyIiwicWIiLCJvblN1YnNldCIsIl9zdWJzZXQiLCJjcmVhdGVFbmhhbmNlcnMiLCJlbmhhbmNlcnMiLCJleGVjdXRlU3Vic2V0UXVlcnkiLCJwYXJhbXMiLCJxdWVyeVBhcmFtcyIsImRlYnVnIiwib3B0aW1pemVDb3VudFF1ZXJ5IiwibnVtIiwicGFnZSIsInRvdGFsIiwiZXhlY3V0ZUNvdW50UXVlcnkiLCJjb21wdXRlZFJvd3MiLCJleGVjdXRlTGlzdFF1ZXJ5IiwiZW5oYW5jZXIiLCJQcm9taXNlIiwiYWxsIiwicXVlcnlNb2RlIiwiY291bnRQdXJpIiwiY2xvbmUiLCJjbGVhciIsImRlZmF1bHQiLCJTcWxQYXJzZXIiLCJwYXJzZXIiLCJQYXJzZXIiLCJwYXJzZWRRdWVyeSIsImFzdGlmeSIsInRvUXVlcnkiLCJkYXRhYmFzZSIsImNvbmZpZyIsImxlZnRKb2luVGFibGVzIiwid2hlcmVUYWJsZXMiLCJ0YWJsZXNUb1JlbW92ZSIsImZpbHRlciIsImoiLCJpbmNsdWRlcyIsImZvckVhY2giLCJjbGVhckpvaW4iLCJjb3VudFJlc3VsdCIsInJhd051bWJlciIsImZpcnN0IiwibGltaXRlZFFiIiwibGltaXQiLCJvZmZzZXQiLCJ1bmxvYWRlZFJvd3MiLCJsb2FkZXJzIiwiQXJyYXkiLCJpc0FycmF5IiwicHJvY2Vzc0xvYWRlcnMiLCJoeWRyYXRlIiwicmVzb2x2ZUxvYWRlciIsImFzIiwicmVmSWQiLCJyZXNvbHZlTG9hZGVyUWJGbiIsIm5lc3RlZExvYWRlcnMiLCJyZXNvbHZlTG9hZGVyUWIiLCJsb2FkZWRSb3dzIiwic3ViUm93R3JvdXBzIiwiciIsIm5lc3RlZEtleXMiLCJPYmplY3QiLCJrZXlzIiwia2V5IiwiZ3JvdXBzIiwiZ3JvdXBCeSIsInNwbGl0IiwibnVsbEtleXMiLCJlbnRyaWVzIiwiZ3JvdXBLZXkiLCJmaWVsZHMiLCJpZEZpZWxkIiwiZXZlcnkiLCJoeWRyYXRlZCIsInJlZHVj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
|
|
@@ -17,7 +17,7 @@ declare class EntityManagerClass {
|
|
|
17
17
|
title: string;
|
|
18
18
|
table: string;
|
|
19
19
|
props: ({
|
|
20
|
-
type: "boolean" | "date" | "integer" | "integer[]" | "bigInteger" | "bigInteger[]" | "boolean[]" | "date[]" | "uuid" | "
|
|
20
|
+
type: "boolean" | "date" | "uuid" | "integer" | "integer[]" | "bigInteger" | "bigInteger[]" | "boolean[]" | "date[]" | "uuid[]" | "tsvector";
|
|
21
21
|
name: string;
|
|
22
22
|
desc?: string | undefined;
|
|
23
23
|
nullable?: boolean | undefined;
|
|
@@ -79,7 +79,7 @@ declare class EntityManagerClass {
|
|
|
79
79
|
} | {
|
|
80
80
|
type: "number";
|
|
81
81
|
name: string;
|
|
82
|
-
numberType?: "
|
|
82
|
+
numberType?: "real" | "double precision" | "numeric" | undefined;
|
|
83
83
|
precision?: number | undefined;
|
|
84
84
|
scale?: number | undefined;
|
|
85
85
|
desc?: string | undefined;
|
|
@@ -93,7 +93,7 @@ declare class EntityManagerClass {
|
|
|
93
93
|
} | {
|
|
94
94
|
type: "number[]";
|
|
95
95
|
name: string;
|
|
96
|
-
numberType?: "
|
|
96
|
+
numberType?: "real" | "double precision" | "numeric" | undefined;
|
|
97
97
|
precision?: number | undefined;
|
|
98
98
|
scale?: number | undefined;
|
|
99
99
|
desc?: string | undefined;
|
|
@@ -246,7 +246,7 @@ declare class EntityManagerClass {
|
|
|
246
246
|
} | undefined;
|
|
247
247
|
})[];
|
|
248
248
|
indexes: {
|
|
249
|
-
type: "index" | "unique" | "
|
|
249
|
+
type: "index" | "unique" | "hnsw" | "ivfflat";
|
|
250
250
|
columns: {
|
|
251
251
|
name: string;
|
|
252
252
|
nullsFirst?: boolean | undefined;
|
|
@@ -254,7 +254,7 @@ declare class EntityManagerClass {
|
|
|
254
254
|
vectorOps?: "vector_cosine_ops" | "vector_ip_ops" | "vector_l2_ops" | undefined;
|
|
255
255
|
}[];
|
|
256
256
|
name: string;
|
|
257
|
-
|
|
257
|
+
using?: "btree" | "hash" | "gin" | "gist" | undefined;
|
|
258
258
|
nullsNotDistinct?: boolean | undefined;
|
|
259
259
|
m?: number | undefined;
|
|
260
260
|
efConstruction?: number | undefined;
|
package/dist/entity/entity.d.ts
CHANGED
|
@@ -77,6 +77,15 @@ export declare class Entity {
|
|
|
77
77
|
name: string;
|
|
78
78
|
type: string;
|
|
79
79
|
}[];
|
|
80
|
+
/**
|
|
81
|
+
* Entity에 정의된 모든 vector 타입 컬럼 반환
|
|
82
|
+
*/
|
|
83
|
+
getVectorColumns(): EntityProp[];
|
|
84
|
+
/**
|
|
85
|
+
* 특정 vector 컬럼 반환
|
|
86
|
+
* @param columnName - 컬럼명 (생략 시 첫 번째 vector 컬럼)
|
|
87
|
+
*/
|
|
88
|
+
getVectorColumn(columnName?: string): EntityProp | undefined;
|
|
80
89
|
registerModulePaths(): Promise<void>;
|
|
81
90
|
registerTableSpecs(): void;
|
|
82
91
|
toJson(): EntityJson;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../src/entity/entity.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,eAAe,EAQpB,KAAK,YAAY,EAEjB,KAAK,WAAW,EACjB,MAAM,gBAAgB,CAAC;AAQxB,qBAAa,MAAM;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE;QACL,QAAQ,EAAE,MAAM,CAAC;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,SAAS,EAAE;QACT,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC;KAC3B,CAAC;IACF,SAAS,EAAE;QACT,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC;KAC7B,CAAC;IACF,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,EAAE;QACP,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KACzB,CAAC;IACF,KAAK,EAAE;QACL,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,CAAC,UAAU,CAAC;KAC9B,CAAM;IACP,KAAK,EAAE;QACL,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;KAC/D,CAAM;IACP,UAAU,EAAE;QACV,CAAC,MAAM,EAAE,MAAM,GAAG;YAChB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;SACvB,CAAC;KACH,CAAM;gBAEK,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,UAAU;IAuDtF;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAkC7C;;;;;;;;;;OAUG;IACH,OAAO,CAAC,uBAAuB;IAiD/B;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,CAAC,2BAA2B;IA8BnC,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IA2G7C,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW;IAS9C,kBAAkB,CAChB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EAAE,EAChB,oBAAoB,GAAE,OAAe,GACpC,WAAW;IA2Md,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,MAAa,GAAG,cAAc,EAAE;IA6FpF,aAAa,CAAC,MAAM,SAAK,EAAE,QAAQ,GAAE,MAAU,EAAE,KAAK,GAAE,MAAM,EAAO,GAAG,MAAM,EAAE;IAwBhF,eAAe,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"entity.d.ts","sourceRoot":"","sources":["../../src/entity/entity.ts"],"names":[],"mappings":"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"}
|