@recursyve/nestjs-data-filter 10.1.2 → 10.2.0
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/lib/data-filter.repository.d.ts +3 -2
- package/lib/data-filter.repository.js +40 -10
- package/lib/decorators/index.d.ts +1 -0
- package/lib/decorators/index.js +2 -1
- package/lib/decorators/searchable-translation-attributes.decorator.d.ts +1 -0
- package/lib/decorators/searchable-translation-attributes.decorator.js +24 -0
- package/lib/filter/controllers/dynamic-filter.controller.d.ts +8 -8
- package/lib/filter/controllers/dynamic-filter.controller.js +21 -21
- package/lib/filter/controllers/filter.controller.d.ts +7 -7
- package/lib/filter/controllers/filter.controller.js +18 -18
- package/lib/filter/filter.service.d.ts +21 -5
- package/lib/filter/filter.service.js +62 -57
- package/lib/filter/filters/filter.d.ts +4 -1
- package/lib/filter/filters/filter.js +5 -5
- package/lib/filter/filters/select.filter.d.ts +3 -1
- package/lib/filter/filters/select.filter.js +2 -2
- package/lib/filter/models/filter-configuration-search.model.d.ts +2 -0
- package/lib/filter/models/filter-configuration-search.model.js +1 -1
- package/lib/filter/order-rules/enum.order-rule.js +2 -2
- package/lib/filter/order-rules/index.d.ts +2 -1
- package/lib/filter/order-rules/index.js +3 -2
- package/lib/filter/order-rules/json.order-rule.d.ts +11 -0
- package/lib/filter/order-rules/json.order-rule.js +17 -0
- package/lib/filter/order-rules/order-rule.d.ts +7 -2
- package/lib/filter/order-rules/order-rule.js +1 -1
- package/lib/models/attributes.model.d.ts +4 -1
- package/lib/models/attributes.model.js +9 -2
- package/lib/models/data-filter.model.d.ts +5 -1
- package/lib/models/data-filter.model.js +26 -7
- package/lib/models/include.model.d.ts +2 -0
- package/lib/models/include.model.js +1 -1
- package/lib/models/search-attributes.model.d.ts +1 -0
- package/lib/models/search-attributes.model.js +1 -1
- package/lib/scanners/sequelize-model.scanner.d.ts +1 -1
- package/lib/scanners/sequelize-model.scanner.js +21 -14
- package/lib/utils/csv.utils.js +3 -3
- package/package.json +7 -7
- package/lib/filter/filters/radio.filter.d.ts +0 -35
- package/lib/filter/filters/radio.filter.js +0 -90
- package/lib/services/dialect-formatter.service.d.ts +0 -10
- package/lib/services/dialect-formatter.service.js +0 -58
|
@@ -28,13 +28,14 @@ export declare class DataFilterRepository<Data> {
|
|
|
28
28
|
findAll(options?: FindOptions, conditions?: object): Promise<Data[]>;
|
|
29
29
|
findAllFromUser(user: DataFilterUserModel, options?: FindOptions, conditions?: object): Promise<Data[]>;
|
|
30
30
|
count(where?: WhereOptions, conditions?: object): Promise<number>;
|
|
31
|
-
search(search: string, options?: FindOptions, conditions?: object): Promise<Data[]>;
|
|
31
|
+
search(search: string, language?: string | null, options?: FindOptions, conditions?: object): Promise<Data[]>;
|
|
32
32
|
searchFromUser(user: DataFilterUserModel, search: string, options?: FindOptions, conditions?: object): Promise<Data[]>;
|
|
33
33
|
generateFindOptions(options?: FindOptions, conditions?: object): FindOptions;
|
|
34
34
|
generateOrderInclude(order: OrderModel, conditions?: object): IncludeOptions[];
|
|
35
35
|
generateSearchInclude(conditions?: object): Includeable[];
|
|
36
36
|
reduceObject(result: any): Data;
|
|
37
37
|
getSearchAttributes(): SearchAttributesModel[];
|
|
38
|
+
getSearchTranslationAttributes(): SearchAttributesModel[];
|
|
38
39
|
hasCustomAttribute(name: string): boolean;
|
|
39
40
|
getCustomAttribute(name: string): CustomAttributesConfig | null;
|
|
40
41
|
getCustomAttributeGroupBy(): (string | Fn | Col)[];
|
|
@@ -46,7 +47,7 @@ export declare class DataFilterRepository<Data> {
|
|
|
46
47
|
downloadPdf(headers: string[], data: any[], lang: string, options?: any): Promise<Buffer>;
|
|
47
48
|
downloadZip(headers: string[], data: any[], lang: string, options?: any): Promise<Buffer>;
|
|
48
49
|
private init;
|
|
49
|
-
addSearchCondition(search: string, options: FindOptions): void;
|
|
50
|
+
addSearchCondition(search: string, options: FindOptions, language?: string | null): void;
|
|
50
51
|
private getExportsHeader;
|
|
51
52
|
private getExportData;
|
|
52
53
|
private getExportValue;
|
|
@@ -92,9 +92,9 @@ let DataFilterRepository = class DataFilterRepository {
|
|
|
92
92
|
const options = this.generateFindOptions({ where }, conditions);
|
|
93
93
|
return this.model.count(options);
|
|
94
94
|
}
|
|
95
|
-
async search(search, options, conditions) {
|
|
95
|
+
async search(search, language = null, options, conditions) {
|
|
96
96
|
const findOptions = this.generateFindOptions(options, conditions);
|
|
97
|
-
this.addSearchCondition(search, findOptions);
|
|
97
|
+
this.addSearchCondition(search, findOptions, language);
|
|
98
98
|
const result = await this.model.findAll(findOptions);
|
|
99
99
|
if (!(result === null || result === void 0 ? void 0 : result.length)) {
|
|
100
100
|
return result;
|
|
@@ -103,7 +103,7 @@ let DataFilterRepository = class DataFilterRepository {
|
|
|
103
103
|
}
|
|
104
104
|
async searchFromUser(user, search, options, conditions) {
|
|
105
105
|
const findOptions = this.generateFindOptions(options, conditions);
|
|
106
|
-
this.addSearchCondition(search, findOptions);
|
|
106
|
+
this.addSearchCondition(search, findOptions, user.language);
|
|
107
107
|
findOptions.where = await this.mergeAccessControlCondition(findOptions.where, user);
|
|
108
108
|
const result = await this.model.findAll(findOptions);
|
|
109
109
|
if (!(result === null || result === void 0 ? void 0 : result.length)) {
|
|
@@ -209,7 +209,7 @@ let DataFilterRepository = class DataFilterRepository {
|
|
|
209
209
|
return data;
|
|
210
210
|
}
|
|
211
211
|
getSearchAttributes() {
|
|
212
|
-
var _a;
|
|
212
|
+
var _a, _b, _c;
|
|
213
213
|
const attributes = [];
|
|
214
214
|
const modelAttr = this._config.getSearchableAttributes();
|
|
215
215
|
attributes.push(...modelAttr.map(a => ({
|
|
@@ -221,12 +221,34 @@ let DataFilterRepository = class DataFilterRepository {
|
|
|
221
221
|
if (!definition.path) {
|
|
222
222
|
continue;
|
|
223
223
|
}
|
|
224
|
-
const attr = definition.ignoreInSearch ? [] : (
|
|
224
|
+
const attr = (definition.ignoreInSearch || ((_a = definition.searchableTranslationAttributes) === null || _a === void 0 ? void 0 : _a.length) && !((_b = definition.searchableAttributes) === null || _b === void 0 ? void 0 : _b.length)) ? [] : (_c = definition.searchableAttributes) !== null && _c !== void 0 ? _c : definition.attributes;
|
|
225
225
|
const additionalIncludes = definition.transformIncludesConfig({});
|
|
226
226
|
attributes.push(...this.sequelizeModelScanner.getAttributes(this.model, definition.path, additionalIncludes, attr));
|
|
227
227
|
}
|
|
228
228
|
return attributes;
|
|
229
229
|
}
|
|
230
|
+
getSearchTranslationAttributes() {
|
|
231
|
+
var _a;
|
|
232
|
+
if (!this._config.getSearchableTranslationAttributes().length) {
|
|
233
|
+
return [];
|
|
234
|
+
}
|
|
235
|
+
const attributes = [];
|
|
236
|
+
const modelAttr = this._config.getSearchableTranslationAttributes();
|
|
237
|
+
attributes.push(...modelAttr.map(attribute => ({
|
|
238
|
+
name: attribute,
|
|
239
|
+
key: attribute,
|
|
240
|
+
isJson: sequelize_utils_1.SequelizeUtils.isColumnJson(this.model, attribute),
|
|
241
|
+
isTranslationAttribute: true
|
|
242
|
+
})));
|
|
243
|
+
for (const definition of this._definitions) {
|
|
244
|
+
if (!definition.path || definition.ignoreInSearch || !((_a = definition.searchableTranslationAttributes) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
245
|
+
continue;
|
|
246
|
+
}
|
|
247
|
+
const additionalIncludes = definition.transformIncludesConfig({});
|
|
248
|
+
attributes.push(...this.sequelizeModelScanner.getAttributes(this.model, definition.path, additionalIncludes, definition.searchableTranslationAttributes, true));
|
|
249
|
+
}
|
|
250
|
+
return attributes;
|
|
251
|
+
}
|
|
230
252
|
hasCustomAttribute(name) {
|
|
231
253
|
return !!this._config.customAttributes.find((x) => { var _a; return ((_a = x.config) === null || _a === void 0 ? void 0 : _a.name) === name; });
|
|
232
254
|
}
|
|
@@ -305,7 +327,7 @@ let DataFilterRepository = class DataFilterRepository {
|
|
|
305
327
|
this._config = this.dataFilterScanner.getDataFilter(this.dataDef);
|
|
306
328
|
this._definitions = this.dataFilterScanner.getAttributes(this.dataDef);
|
|
307
329
|
}
|
|
308
|
-
addSearchCondition(search, options) {
|
|
330
|
+
addSearchCondition(search, options, language = null) {
|
|
309
331
|
if (!search) {
|
|
310
332
|
return;
|
|
311
333
|
}
|
|
@@ -318,10 +340,13 @@ let DataFilterRepository = class DataFilterRepository {
|
|
|
318
340
|
options.where = { [sequelize_1.Op.and]: [options.where] };
|
|
319
341
|
}
|
|
320
342
|
const where = options.where;
|
|
321
|
-
const generateFieldsObject = (searchValue) =>
|
|
343
|
+
const generateFieldsObject = (searchValue) => [
|
|
344
|
+
...this.getSearchAttributes(),
|
|
345
|
+
...this.getSearchTranslationAttributes()
|
|
346
|
+
]
|
|
322
347
|
.map(a => {
|
|
323
|
-
var _a, _b;
|
|
324
|
-
if (a.isJson) {
|
|
348
|
+
var _a, _b, _c, _d;
|
|
349
|
+
if (a.isJson && !a.isTranslationAttribute) {
|
|
325
350
|
const field = (_a = a.literalKey) !== null && _a !== void 0 ? _a : `\`${this.model.name}\`.\`${a.key}\``;
|
|
326
351
|
/**
|
|
327
352
|
* literal function is not working of some reason...
|
|
@@ -330,6 +355,11 @@ let DataFilterRepository = class DataFilterRepository {
|
|
|
330
355
|
const value = (_b = this.model.sequelize) === null || _b === void 0 ? void 0 : _b.escape(`%${searchValue.toUpperCase()}%`);
|
|
331
356
|
return new sequelize_1.Utils.Literal(`UPPER(JSON_EXTRACT(${field}, '$')) LIKE ${value}`);
|
|
332
357
|
}
|
|
358
|
+
if (a.isJson && a.isTranslationAttribute) {
|
|
359
|
+
const field = (_c = a.literalKey) !== null && _c !== void 0 ? _c : `\`${this.model.name}\`.\`${a.name}\``;
|
|
360
|
+
const value = (_d = this.model.sequelize) === null || _d === void 0 ? void 0 : _d.escape(`%${searchValue.toUpperCase()}%`);
|
|
361
|
+
return new sequelize_1.Utils.Literal(`UPPER(JSON_UNQUOTE(JSON_EXTRACT(${field}, '$.${language}'))) LIKE ${value}`);
|
|
362
|
+
}
|
|
333
363
|
return {
|
|
334
364
|
[a.key]: {
|
|
335
365
|
[sequelize_1.Op.like]: `%${searchValue}%`
|
|
@@ -399,4 +429,4 @@ exports.DataFilterRepository = DataFilterRepository = __decorate([
|
|
|
399
429
|
adapters_1.ExportAdapter])
|
|
400
430
|
], DataFilterRepository);
|
|
401
431
|
|
|
402
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2xpYi9kYXRhLWZpbHRlci5yZXBvc2l0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLDJDQUE0QztBQUM1Qyx5Q0FBaUg7QUFHakgseUNBQW1GO0FBSW5GLG9FQUEwRDtBQUsxRCx3RUFBbUU7QUFDbkUsZ0ZBQTJFO0FBQzNFLHVEQUFzRDtBQUN0RCxpREFBNkM7QUFDN0MsbURBQStDO0FBR3hDLElBQU0sb0JBQW9CLEdBQTFCLE1BQU0sb0JBQW9CO0lBSTdCLElBQVcsS0FBSztRQUNaLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFpQixDQUFDO0lBQzFDLENBQUM7SUFFRCxZQUNZLE9BQVksRUFDWixpQkFBb0MsRUFDcEMscUJBQTRDLEVBQzVDLG9CQUEwQyxFQUMxQyxnQkFBa0MsRUFDbEMsYUFBNEI7UUFMNUIsWUFBTyxHQUFQLE9BQU8sQ0FBSztRQUNaLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUM1Qyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBQzFDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFFcEMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQXNCLEVBQUUsT0FBcUIsRUFBRSxVQUFtQjtRQUNwRixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDcEcsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNULE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLEtB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U0FBUyxDQUFDLEtBQUs7aUJBQ2xCO2FBQ1ksQ0FBQztTQUNyQjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7Q0FDSixDQUFBO0FBcmNZLG9EQUFvQjsrQkFBcEIsb0JBQW9CO0lBRGhDLElBQUEsbUJBQVUsR0FBRTs2Q0FXc0IsdUNBQWlCO1FBQ2IsK0NBQXFCO1FBQ3RCLCtCQUFvQjtRQUN4QiwyQkFBZ0I7UUFDbkIsd0JBQWE7R0FkL0Isb0JBQW9CLENBcWNoQyIsImZpbGUiOiJsaWIvZGF0YS1maWx0ZXIucmVwb3NpdG9yeS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQG5lc3Rqcy9jb21tb25cIjtcbmltcG9ydCB7IEZpbmRPcHRpb25zLCBJZGVudGlmaWVyLCBJbmNsdWRlYWJsZSwgSW5jbHVkZU9wdGlvbnMsIE1vZGVsLCBPcCwgVXRpbHMsIFdoZXJlT3B0aW9ucyB9IGZyb20gXCJzZXF1ZWxpemVcIjtcbmltcG9ydCB7IEdyb3VwT3B0aW9uIH0gZnJvbSBcInNlcXVlbGl6ZS90eXBlcy9tb2RlbFwiO1xuaW1wb3J0IHsgQ29sLCBGbiB9IGZyb20gXCJzZXF1ZWxpemUvdHlwZXMvdXRpbHNcIjtcbmltcG9ydCB7IEFjY2Vzc0NvbnRyb2xBZGFwdGVyLCBFeHBvcnRBZGFwdGVyLCBUcmFuc2xhdGVBZGFwdGVyIH0gZnJvbSBcIi4vYWRhcHRlcnNcIjtcbmltcG9ydCB7IEF0dHJpYnV0ZXNDb25maWcgfSBmcm9tIFwiLi9tb2RlbHMvYXR0cmlidXRlcy5tb2RlbFwiO1xuaW1wb3J0IHsgQ3VzdG9tQXR0cmlidXRlc0NvbmZpZyB9IGZyb20gXCIuL21vZGVscy9jdXN0b20tYXR0cmlidXRlcy5tb2RlbFwiO1xuaW1wb3J0IHsgRGF0YUZpbHRlckNvbmZpZyB9IGZyb20gXCIuL21vZGVscy9kYXRhLWZpbHRlci5tb2RlbFwiO1xuaW1wb3J0IHsgRXhwb3J0VHlwZXMgfSBmcm9tIFwiLi9tb2RlbHMvZXhwb3J0LXR5cGVzLm1vZGVsXCI7XG5pbXBvcnQgeyBPcmRlck1vZGVsIH0gZnJvbSBcIi4vbW9kZWxzL2ZpbHRlci5tb2RlbFwiO1xuaW1wb3J0IHsgUGF0aE1vZGVsIH0gZnJvbSBcIi4vbW9kZWxzL3BhdGgubW9kZWxcIjtcbmltcG9ydCB7IFNlYXJjaEF0dHJpYnV0ZXNNb2RlbCB9IGZyb20gXCIuL21vZGVscy9zZWFyY2gtYXR0cmlidXRlcy5tb2RlbFwiO1xuaW1wb3J0IHsgRGF0YUZpbHRlclVzZXJNb2RlbCB9IGZyb20gXCIuL21vZGVscy91c2VyLm1vZGVsXCI7XG5pbXBvcnQgeyBEYXRhRmlsdGVyU2Nhbm5lciB9IGZyb20gXCIuL3NjYW5uZXJzL2RhdGEtZmlsdGVyLnNjYW5uZXJcIjtcbmltcG9ydCB7IFNlcXVlbGl6ZU1vZGVsU2Nhbm5lciB9IGZyb20gXCIuL3NjYW5uZXJzL3NlcXVlbGl6ZS1tb2RlbC5zY2FubmVyXCI7XG5pbXBvcnQgeyBNLCBTZXF1ZWxpemVVdGlscyB9IGZyb20gXCIuL3NlcXVlbGl6ZS51dGlsc1wiO1xuaW1wb3J0IHsgQ3N2VXRpbHMgfSBmcm9tIFwiLi91dGlscy9jc3YudXRpbHNcIjtcbmltcG9ydCB7IFhsc3hVdGlscyB9IGZyb20gXCIuL3V0aWxzL3hsc3gudXRpbHNcIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERhdGFGaWx0ZXJSZXBvc2l0b3J5PERhdGE+IHtcbiAgICBwcml2YXRlIF9jb25maWchOiBEYXRhRmlsdGVyQ29uZmlnO1xuICAgIHByaXZhdGUgX2RlZmluaXRpb25zITogQXR0cmlidXRlc0NvbmZpZ1tdO1xuXG4gICAgcHVibGljIGdldCBtb2RlbCgpOiB0eXBlb2YgTSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWcubW9kZWwgYXMgdHlwZW9mIE07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZGF0YURlZjogYW55LFxuICAgICAgICBwcml2YXRlIGRhdGFGaWx0ZXJTY2FubmVyOiBEYXRhRmlsdGVyU2Nhbm5lcixcbiAgICAgICAgcHJpdmF0ZSBzZXF1ZWxpemVNb2RlbFNjYW5uZXI6IFNlcXVlbGl6ZU1vZGVsU2Nhbm5lcixcbiAgICAgICAgcHJpdmF0ZSBhY2Nlc3NDb250cm9sQWRhcHRlcjogQWNjZXNzQ29udHJvbEFkYXB0ZXIsXG4gICAgICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlQWRhcHRlcixcbiAgICAgICAgcHJpdmF0ZSBleHBvcnRBZGFwdGVyOiBFeHBvcnRBZGFwdGVyXG4gICAgKSB7XG4gICAgICAgIHRoaXMuaW5pdCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmaW5kQnlQayhpZGVudGlmaWVyOiBJZGVudGlmaWVyLCBvcHRpb25zPzogRmluZE9wdGlvbnMsIGNvbmRpdGlvbnM/OiBvYmplY3QpOiBQcm9taXNlPERhdGEgfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubW9kZWwuZmluZEJ5UGsoaWRlbnRpZmllciwgdGhpcy5nZW5lcmF0ZUZpbmRPcHRpb25zKG9wdGlvbnMsIGNvbmRpdGlvbnMpKTtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlZHVjZU9iamVjdChyZXN1bHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmaW5kQnlQa0Zyb21Vc2VyKHVzZXI6IERhdGFGaWx0ZXJVc2VyTW9kZWwsIGlkZW50aWZpZXI6IElkZW50aWZpZXIsIGNvbmRpdGlvbnM/OiBvYmplY3QpOiBQcm9taXNlPERhdGEgfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IHJlc291cmNlcyA9IGF3YWl0IHRoaXMuYWNjZXNzQ29udHJvbEFkYXB0ZXIuZ2V0UmVzb3VyY2VzKHRoaXMuX2NvbmZpZy5tb2RlbCBhcyBhbnksIHVzZXIpO1xuICAgICAgICBpZiAocmVzb3VyY2VzLmlkcz8uaW5jbHVkZXMoaWRlbnRpZmllciBhcyBudW1iZXIpIHx8IHJlc291cmNlcy5hbGwpIHtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmRCeVBrKGlkZW50aWZpZXIsIHt9LCBjb25kaXRpb25zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXNvdXJjZXMuaWRzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmRPbmUoe1xuICAgICAgICAgICAgd2hlcmU6IHtcbiAgICAgICAgICAgICAgICBbT3AuYW5kXTogW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBbdGhpcy5fY29uZmlnLm1vZGVsLnByaW1hcnlLZXlBdHRyaWJ1dGVdOiBpZGVudGlmaWVyXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHJlc291cmNlcy53aGVyZSA/PyB7fVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgY29uZGl0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmRPbmUob3B0aW9ucz86IEZpbmRPcHRpb25zLCBjb25kaXRpb25zPzogb2JqZWN0KTogUHJvbWlzZTxEYXRhIHwgbnVsbD4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm1vZGVsLmZpbmRPbmUodGhpcy5nZW5lcmF0ZUZpbmRPcHRpb25zKG9wdGlvbnMsIGNvbmRpdGlvbnMpKTtcbiAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnJlZHVjZU9iamVjdChyZXN1bHQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmaW5kT25lRnJvbVVzZXIodXNlcjogRGF0YUZpbHRlclVzZXJNb2RlbCwgb3B0aW9uczogRmluZE9wdGlvbnMgPSB7fSwgY29uZGl0aW9ucz86IG9iamVjdCk6IFByb21pc2U8RGF0YSB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZE9uZShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgICAgIHdoZXJlOiBhd2FpdCB0aGlzLm1lcmdlQWNjZXNzQ29udHJvbENvbmRpdGlvbihvcHRpb25zLndoZXJlID8/IHt9LCB1c2VyKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbmRpdGlvbnNcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmluZEFsbChvcHRpb25zPzogRmluZE9wdGlvbnMsIGNvbmRpdGlvbnM/OiBvYmplY3QpOiBQcm9taXNlPERhdGFbXT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLm1vZGVsLmZpbmRBbGwodGhpcy5nZW5lcmF0ZUZpbmRPcHRpb25zKG9wdGlvbnMsIGNvbmRpdGlvbnMpKTtcbiAgICAgICAgaWYgKCFyZXN1bHQ/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyB1bmtub3duIGFzIERhdGFbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcCh4ID0+IHRoaXMucmVkdWNlT2JqZWN0KHgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmluZEFsbEZyb21Vc2VyKHVzZXI6IERhdGFGaWx0ZXJVc2VyTW9kZWwsIG9wdGlvbnM/OiBGaW5kT3B0aW9ucywgY29uZGl0aW9ucz86IG9iamVjdCk6IFByb21pc2U8RGF0YVtdPiB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zID8/IHt9O1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5maW5kQWxsKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgd2hlcmU6IGF3YWl0IHRoaXMubWVyZ2VBY2Nlc3NDb250cm9sQ29uZGl0aW9uKG9wdGlvbnMud2hlcmUgPz8ge30sIHVzZXIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29uZGl0aW9uc1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBjb3VudCh3aGVyZT86IFdoZXJlT3B0aW9ucywgY29uZGl0aW9ucz86IG9iamVjdCk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSB0aGlzLmdlbmVyYXRlRmluZE9wdGlvbnMoeyB3aGVyZSB9LCBjb25kaXRpb25zKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwuY291bnQob3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlYXJjaChzZWFyY2g6IHN0cmluZywgb3B0aW9ucz86IEZpbmRPcHRpb25zLCBjb25kaXRpb25zPzogb2JqZWN0KTogUHJvbWlzZTxEYXRhW10+IHtcbiAgICAgICAgY29uc3QgZmluZE9wdGlvbnMgPSB0aGlzLmdlbmVyYXRlRmluZE9wdGlvbnMob3B0aW9ucywgY29uZGl0aW9ucyk7XG4gICAgICAgIHRoaXMuYWRkU2VhcmNoQ29uZGl0aW9uKHNlYXJjaCwgZmluZE9wdGlvbnMpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubW9kZWwuZmluZEFsbChmaW5kT3B0aW9ucyk7XG4gICAgICAgIGlmICghcmVzdWx0Py5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgdW5rbm93biBhcyBEYXRhW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoeCA9PiB0aGlzLnJlZHVjZU9iamVjdCh4KSk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHNlYXJjaEZyb21Vc2VyKHVzZXI6IERhdGFGaWx0ZXJVc2VyTW9kZWwsIHNlYXJjaDogc3RyaW5nLCBvcHRpb25zPzogRmluZE9wdGlvbnMsIGNvbmRpdGlvbnM/OiBvYmplY3QpOiBQcm9taXNlPERhdGFbXT4ge1xuICAgICAgICBjb25zdCBmaW5kT3B0aW9ucyA9IHRoaXMuZ2VuZXJhdGVGaW5kT3B0aW9ucyhvcHRpb25zLCBjb25kaXRpb25zKTtcbiAgICAgICAgdGhpcy5hZGRTZWFyY2hDb25kaXRpb24oc2VhcmNoLCBmaW5kT3B0aW9ucyk7XG5cbiAgICAgICAgZmluZE9wdGlvbnMud2hlcmUgPSBhd2FpdCB0aGlzLm1lcmdlQWNjZXNzQ29udHJvbENvbmRpdGlvbihmaW5kT3B0aW9ucy53aGVyZSwgdXNlcik7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubW9kZWwuZmluZEFsbChmaW5kT3B0aW9ucyk7XG4gICAgICAgIGlmICghcmVzdWx0Py5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgYXMgdW5rbm93biBhcyBEYXRhW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoeCA9PiB0aGlzLnJlZHVjZU9iamVjdCh4KSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdlbmVyYXRlRmluZE9wdGlvbnMob3B0aW9ucz86IEZpbmRPcHRpb25zLCBjb25kaXRpb25zPzogb2JqZWN0KTogRmluZE9wdGlvbnMge1xuICAgICAgICBvcHRpb25zID8/PSB7fTtcblxuICAgICAgICBjb25zdCBuZXN0ZWRJbmNsdWRlczogQXJyYXk8SW5jbHVkZU9wdGlvbnMgfCBJbmNsdWRlT3B0aW9uc1tdPiA9IFtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZmluaXRpb25zLm1hcCh4ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXgucGF0aCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSB4LnBhdGgudHJhbnNmb3JtUGF0aENvbmZpZyhjb25kaXRpb25zKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0geC50cmFuc2Zvcm1BdHRyaWJ1dGVzQ29uZmlnKGNvbmRpdGlvbnMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxJbmNsdWRlcyA9IHgudHJhbnNmb3JtSW5jbHVkZXNDb25maWcoY29uZGl0aW9ucyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VxdWVsaXplTW9kZWxTY2FubmVyLmdldEluY2x1ZGVzKHRoaXMubW9kZWwsIHBhdGgsIGFkZGl0aW9uYWxJbmNsdWRlcywgYXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC4uLnRoaXMuX2NvbmZpZy5nZXRDdXN0b21BdHRyaWJ1dGVzSW5jbHVkZXMoKS5tYXAoeCA9PiB0aGlzLnNlcXVlbGl6ZU1vZGVsU2Nhbm5lci5nZXRJbmNsdWRlcyh0aGlzLm1vZGVsLCB7XG4gICAgICAgICAgICAgICAgcGF0aDogeC5wYXRoLFxuICAgICAgICAgICAgICAgIHBhcmFub2lkOiB4LnBhcmFub2lkLFxuICAgICAgICAgICAgICAgIHN1YlF1ZXJ5OiB4LnN1YlF1ZXJ5LFxuICAgICAgICAgICAgICAgIHdoZXJlOiB4LndoZXJlID8gU2VxdWVsaXplVXRpbHMuZ2VuZXJhdGVXaGVyZUNvbmRpdGlvbnMoeC53aGVyZSwgY29uZGl0aW9ucykgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIH0sIFtdLCB4LmF0dHJpYnV0ZXMpKVxuICAgICAgICBdO1xuICAgICAgICBpZiAob3B0aW9ucy5pbmNsdWRlKSB7XG4gICAgICAgICAgICBuZXN0ZWRJbmNsdWRlcy5wdXNoKG9wdGlvbnMuaW5jbHVkZSBhcyBJbmNsdWRlT3B0aW9ucyB8IEluY2x1ZGVPcHRpb25zW10pO1xuICAgICAgICB9XG5cbiAgICAgICAgb3B0aW9ucy5pbmNsdWRlID0gU2VxdWVsaXplVXRpbHMucmVkdWNlSW5jbHVkZXMobmVzdGVkSW5jbHVkZXMpO1xuXG4gICAgICAgIGNvbnN0IGdlbmVyYXRlZEF0dHJpYnV0ZXMgPSB0aGlzLl9jb25maWcudHJhbnNmb3JtQXR0cmlidXRlc0NvbmZpZyhjb25kaXRpb25zKTtcbiAgICAgICAgaWYgKGdlbmVyYXRlZEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmF0dHJpYnV0ZXMgPSBTZXF1ZWxpemVVdGlscy5tZXJnZUF0dHJpYnV0ZXMob3B0aW9ucy5hdHRyaWJ1dGVzLCBnZW5lcmF0ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3B0aW9ucy5hdHRyaWJ1dGVzID0gZ2VuZXJhdGVkQXR0cmlidXRlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZW5lcmF0ZU9yZGVySW5jbHVkZShvcmRlcjogT3JkZXJNb2RlbCwgY29uZGl0aW9ucz86IG9iamVjdCk6IEluY2x1ZGVPcHRpb25zW10ge1xuICAgICAgICBpZiAoIW9yZGVyIHx8ICFvcmRlci5jb2x1bW4gfHwgb3JkZXIuZGlyZWN0aW9uID09PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjdXN0b21BdHRyID0gdGhpcy5nZXRDdXN0b21BdHRyaWJ1dGUob3JkZXIuY29sdW1uKTtcbiAgICAgICAgaWYgKGN1c3RvbUF0dHIpIHtcbiAgICAgICAgICAgIGlmICghY3VzdG9tQXR0ci5jb25maWc/LnBhdGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcXVlbGl6ZU1vZGVsU2Nhbm5lci5nZXRJbmNsdWRlcyh0aGlzLm1vZGVsLCB7XG4gICAgICAgICAgICAgICAgcGF0aDogY3VzdG9tQXR0ci5jb25maWcucGF0aCxcbiAgICAgICAgICAgICAgICB3aGVyZTogY3VzdG9tQXR0ci5jb25maWcud2hlcmUgPyBTZXF1ZWxpemVVdGlscy5nZW5lcmF0ZVdoZXJlQ29uZGl0aW9ucyhjdXN0b21BdHRyLmNvbmZpZy53aGVyZSwgY29uZGl0aW9ucykgOiB1bmRlZmluZWRcbiAgICAgICAgICAgIH0sIFtdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnNlcXVlbGl6ZU1vZGVsU2Nhbm5lci5nZXRPcmRlckluY2x1ZGVzKHRoaXMubW9kZWwsIG9yZGVyKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2VuZXJhdGVTZWFyY2hJbmNsdWRlKGNvbmRpdGlvbnM/OiBvYmplY3QpOiBJbmNsdWRlYWJsZVtdIHtcbiAgICAgICAgY29uc3QgbmVzdGVkSW5jbHVkZXM6IEFycmF5PEluY2x1ZGVPcHRpb25zIHwgSW5jbHVkZU9wdGlvbnNbXT4gPSBbXG4gICAgICAgICAgICAuLi50aGlzLl9kZWZpbml0aW9ucy5tYXAoeCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF4LnBhdGggfHwgeC5wYXRoLnNlcGFyYXRlIHx8IHguaWdub3JlSW5TZWFyY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0geC5wYXRoLnRyYW5zZm9ybVBhdGhDb25maWcoY29uZGl0aW9ucyk7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlcyA9IHgudHJhbnNmb3JtQXR0cmlidXRlc0NvbmZpZyhjb25kaXRpb25zKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhZGRpdGlvbmFsSW5jbHVkZXMgPSB4LnRyYW5zZm9ybUluY2x1ZGVzQ29uZmlnKGNvbmRpdGlvbnMpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNlcXVlbGl6ZU1vZGVsU2Nhbm5lci5nZXRJbmNsdWRlcyh0aGlzLm1vZGVsLCBwYXRoLCBhZGRpdGlvbmFsSW5jbHVkZXMsIGF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAuLi50aGlzLl9jb25maWcuZ2V0Q3VzdG9tQXR0cmlidXRlc0luY2x1ZGVzKCkubWFwKHggPT4ge1xuICAgICAgICAgICAgICAgIGlmICgheC5wYXRoIHx8IHguc2VwYXJhdGUgfHwgeC5pZ25vcmVJblNlYXJjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VxdWVsaXplTW9kZWxTY2FubmVyLmdldEluY2x1ZGVzKHRoaXMubW9kZWwsIHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogeC5wYXRoLFxuICAgICAgICAgICAgICAgICAgICBwYXJhbm9pZDogeC5wYXJhbm9pZCxcbiAgICAgICAgICAgICAgICAgICAgc3ViUXVlcnk6IHguc3ViUXVlcnksXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlOiB4LndoZXJlID8gU2VxdWVsaXplVXRpbHMuZ2VuZXJhdGVXaGVyZUNvbmRpdGlvbnMoeC53aGVyZSwgY29uZGl0aW9ucykgOiB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB9LCBbXSwgeC5hdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIFNlcXVlbGl6ZVV0aWxzLnJlZHVjZUluY2x1ZGVzKG5lc3RlZEluY2x1ZGVzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVkdWNlT2JqZWN0KHJlc3VsdDogYW55KTogRGF0YSB7XG4gICAgICAgIGNvbnN0IHIgPSByZXN1bHQgaW5zdGFuY2VvZiBNb2RlbCA/IHJlc3VsdC50b0pTT04oKSA6IHJlc3VsdDtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyB0aGlzLmRhdGFEZWYucHJvdG90eXBlLmNvbnN0cnVjdG9yKHt9LCB7IGlzTmV3UmVjb3JkOiBmYWxzZSB9KTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihkYXRhLCByKTtcbiAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBNb2RlbCkge1xuICAgICAgICAgICAgKGRhdGEgYXMgYW55KS5kYXRhVmFsdWVzID0ge1xuICAgICAgICAgICAgICAgIC4uLnJcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IGRlZiBvZiB0aGlzLl9kZWZpbml0aW9ucykge1xuICAgICAgICAgICAgaWYgKGRlZi5wYXRoKSB7XG4gICAgICAgICAgICAgICAgZGF0YVtkZWYua2V5XSA9IFNlcXVlbGl6ZVV0aWxzLnJlZHVjZU1vZGVsRnJvbVBhdGgocmVzdWx0LCBkZWYucGF0aC5wYXRoKTtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIE1vZGVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuc2V0RGF0YVZhbHVlKGRlZi5rZXkgYXMgYW55LCBTZXF1ZWxpemVVdGlscy5yZWR1Y2VNb2RlbEZyb21QYXRoKHJlc3VsdCwgZGVmLnBhdGgucGF0aCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGF0YVtkZWYua2V5XSA9IHJlc3VsdFtkZWYua2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTZWFyY2hBdHRyaWJ1dGVzKCk6IFNlYXJjaEF0dHJpYnV0ZXNNb2RlbFtdIHtcbiAgICAgICAgY29uc3QgYXR0cmlidXRlczogU2VhcmNoQXR0cmlidXRlc01vZGVsW10gPSBbXTtcbiAgICAgICAgY29uc3QgbW9kZWxBdHRyID0gdGhpcy5fY29uZmlnLmdldFNlYXJjaGFibGVBdHRyaWJ1dGVzKCk7XG4gICAgICAgIGF0dHJpYnV0ZXMucHVzaChcbiAgICAgICAgICAgIC4uLm1vZGVsQXR0ci5tYXAoYSA9PiAoe1xuICAgICAgICAgICAgICAgIG5hbWU6IGEsXG4gICAgICAgICAgICAgICAga2V5OiBhLFxuICAgICAgICAgICAgICAgIGlzSnNvbjogU2VxdWVsaXplVXRpbHMuaXNDb2x1bW5Kc29uKHRoaXMubW9kZWwsIGEpXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGRlZmluaXRpb24gb2YgdGhpcy5fZGVmaW5pdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICghZGVmaW5pdGlvbi5wYXRoKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGF0dHIgPSBkZWZpbml0aW9uLmlnbm9yZUluU2VhcmNoID8gW10gOiBkZWZpbml0aW9uLnNlYXJjaGFibGVBdHRyaWJ1dGVzID8/IGRlZmluaXRpb24uYXR0cmlidXRlcztcbiAgICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxJbmNsdWRlcyA9IGRlZmluaXRpb24udHJhbnNmb3JtSW5jbHVkZXNDb25maWcoe30pO1xuICAgICAgICAgICAgYXR0cmlidXRlcy5wdXNoKFxuICAgICAgICAgICAgICAgIC4uLnRoaXMuc2VxdWVsaXplTW9kZWxTY2FubmVyLmdldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwsXG4gICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24ucGF0aCBhcyBQYXRoTW9kZWwsXG4gICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxJbmNsdWRlcyxcbiAgICAgICAgICAgICAgICAgICAgYXR0clxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXR0cmlidXRlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzQ3VzdG9tQXR0cmlidXRlKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gISF0aGlzLl9jb25maWcuY3VzdG9tQXR0cmlidXRlcy5maW5kKCh4KSA9PiB4LmNvbmZpZz8ubmFtZSA9PT0gbmFtZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEN1c3RvbUF0dHJpYnV0ZShuYW1lOiBzdHJpbmcpOiBDdXN0b21BdHRyaWJ1dGVzQ29uZmlnIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb25maWcuY3VzdG9tQXR0cmlidXRlcy5maW5kKCh4KSA9PiB4LmNvbmZpZz8ubmFtZSA9PT0gbmFtZSkgPz8gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q3VzdG9tQXR0cmlidXRlR3JvdXBCeSgpOiAoc3RyaW5nIHwgRm4gfCBDb2wpW10ge1xuICAgICAgICBjb25zdCBncm91cDogR3JvdXBPcHRpb24gPSBbXTtcblxuICAgICAgICBjb25zdCBzaG91bGRHcm91cEJ5ID0gdGhpcy5fY29uZmlnLmN1c3RvbUF0dHJpYnV0ZXMuc29tZSgoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUuc2hvdWxkR3JvdXBCeSgpKTtcbiAgICAgICAgaWYgKHNob3VsZEdyb3VwQnkpIHtcbiAgICAgICAgICAgIGdyb3VwLnB1c2goXCJpZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBncm91cDtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZG93bmxvYWREYXRhKGRhdGE6IERhdGFbXSwgdHlwZTogRXhwb3J0VHlwZXMsIGxhbmc6IHN0cmluZywgb3B0aW9ucz86IGFueSk6IFByb21pc2U8QnVmZmVyIHwgc3RyaW5nPjtcbiAgICBwdWJsaWMgYXN5bmMgZG93bmxvYWREYXRhKGhlYWRlcnM6IHN0cmluZ1tdLCBkYXRhOiBhbnlbXSwgdHlwZTogRXhwb3J0VHlwZXMsIGxhbmc6IHN0cmluZywgb3B0aW9ucz86IGFueSk6IFByb21pc2U8QnVmZmVyIHwgc3RyaW5nPjtcbiAgICBwdWJsaWMgYXN5bmMgZG93bmxvYWREYXRhKFxuICAgICAgICBkYXRhT3JIZWFkZXJzOiBEYXRhW10gfCBzdHJpbmdbXSxcbiAgICAgICAgdHlwZU9yRGF0YTogRXhwb3J0VHlwZXMgfCBhbnlbXSxcbiAgICAgICAgbGFuZ09yVHlwZTogc3RyaW5nIHwgRXhwb3J0VHlwZXMsXG4gICAgICAgIG9wdGlvbnNPckxhbmc/OiBhbnkgfCBzdHJpbmcsXG4gICAgICAgIG9wdGlvbnM/OiBhbnlcbiAgICApOiBQcm9taXNlPEJ1ZmZlciB8IHN0cmluZz4ge1xuICAgICAgICBsZXQgdHlwZTogRXhwb3J0VHlwZXM7XG4gICAgICAgIGxldCBoZWFkZXJzOiBzdHJpbmdbXTtcbiAgICAgICAgbGV0IGRhdGE6IGFueVtdO1xuICAgICAgICBsZXQgbGFuZzogc3RyaW5nO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdHlwZU9yRGF0YSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgdHlwZSA9IHR5cGVPckRhdGE7XG4gICAgICAgICAgICBsYW5nID0gbGFuZ09yVHlwZTtcbiAgICAgICAgICAgIGhlYWRlcnMgPSBhd2FpdCB0aGlzLmdldEV4cG9ydHNIZWFkZXIobGFuZywgdGhpcy5fY29uZmlnLmV4cG9ydENvbHVtbnMgPz8gW10pO1xuICAgICAgICAgICAgZGF0YSA9IGF3YWl0IHRoaXMuZ2V0RXhwb3J0RGF0YShkYXRhT3JIZWFkZXJzIGFzIERhdGFbXSk7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yTGFuZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxhbmcgPSBvcHRpb25zT3JMYW5nIGFzIHN0cmluZztcbiAgICAgICAgICAgIGhlYWRlcnMgPSBhd2FpdCB0aGlzLmdldEV4cG9ydHNIZWFkZXIobGFuZywgZGF0YU9ySGVhZGVycyBhcyBzdHJpbmdbXSk7XG4gICAgICAgICAgICBkYXRhID0gdHlwZU9yRGF0YTtcbiAgICAgICAgICAgIHR5cGUgPSBsYW5nT3JUeXBlIGFzIEV4cG9ydFR5cGVzO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIEV4cG9ydFR5cGVzLlhMU1g6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZG93bmxvYWRYbHN4KGhlYWRlcnMsIGRhdGEpO1xuICAgICAgICAgICAgY2FzZSBFeHBvcnRUeXBlcy5IVE1MOlxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmRvd25sb2FkSHRtbChoZWFkZXJzLCBkYXRhLCBsYW5nLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGNhc2UgRXhwb3J0VHlwZXMuQ1NWOlxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmRvd25sb2FkQ3N2KGhlYWRlcnMsIGRhdGEpO1xuICAgICAgICAgICAgY2FzZSBFeHBvcnRUeXBlcy5QREY6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZG93bmxvYWRQZGYoaGVhZGVycywgZGF0YSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBjYXNlIEV4cG9ydFR5cGVzLlpJUDpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5kb3dubG9hZFppcChoZWFkZXJzLCBkYXRhLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkb3dubG9hZFhsc3goaGVhZGVyczogc3RyaW5nW10sIGRhdGE6IGFueVtdKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICAgICAgcmV0dXJuIFhsc3hVdGlscy5hcnJheVRvWGxzeEJ1ZmZlcihcbiAgICAgICAgICAgIGRhdGEsXG4gICAgICAgICAgICB0aGlzLl9jb25maWcubW9kZWwuZ2V0VGFibGVOYW1lKCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgaGVhZGVyc1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkb3dubG9hZEh0bWwoaGVhZGVyczogc3RyaW5nW10sIGRhdGE6IGFueVtdLCBsYW5nOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5leHBvcnRBZGFwdGVyLmV4cG9ydEFzSHRtbChsYW5nLCB7XG4gICAgICAgICAgICB0aXRsZTogdGhpcy5fY29uZmlnLm1vZGVsLmdldFRhYmxlTmFtZSgpIGFzIHN0cmluZyxcbiAgICAgICAgICAgIGNvbHVtbnM6IGhlYWRlcnMsXG4gICAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkb3dubG9hZENzdihoZWFkZXJzOiBzdHJpbmdbXSwgZGF0YTogYW55W10pOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgQ3N2VXRpbHMuYXJyYXlUb0NzdkJ1ZmZlcihkYXRhLCBoZWFkZXJzKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZG93bmxvYWRQZGYoaGVhZGVyczogc3RyaW5nW10sIGRhdGE6IGFueVtdLCBsYW5nOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5leHBvcnRBZGFwdGVyLmV4cG9ydEFzUGRmKGxhbmcsIHtcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLl9jb25maWcubW9kZWwuZ2V0VGFibGVOYW1lKCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgY29sdW1uczogaGVhZGVycyxcbiAgICAgICAgICAgIGRhdGE6IGRhdGFcbiAgICAgICAgfSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRvd25sb2FkWmlwKGhlYWRlcnM6IHN0cmluZ1tdLCBkYXRhOiBhbnlbXSwgbGFuZzogc3RyaW5nLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZXhwb3J0QWRhcHRlci5leHBvcnRBc1ppcChsYW5nLCB7XG4gICAgICAgICAgICB0aXRsZTogdGhpcy5fY29uZmlnLm1vZGVsLmdldFRhYmxlTmFtZSgpIGFzIHN0cmluZyxcbiAgICAgICAgICAgIGNvbHVtbnM6IGhlYWRlcnMsXG4gICAgICAgICAgICBkYXRhOiBkYXRhXG4gICAgICAgIH0sIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdCgpIHtcbiAgICAgICAgdGhpcy5fY29uZmlnID0gdGhpcy5kYXRhRmlsdGVyU2Nhbm5lci5nZXREYXRhRmlsdGVyKHRoaXMuZGF0YURlZik7XG4gICAgICAgIHRoaXMuX2RlZmluaXRpb25zID0gdGhpcy5kYXRhRmlsdGVyU2Nhbm5lci5nZXRBdHRyaWJ1dGVzKHRoaXMuZGF0YURlZik7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZFNlYXJjaENvbmRpdGlvbihzZWFyY2g6IHN0cmluZywgb3B0aW9uczogRmluZE9wdGlvbnMpOiB2b2lkIHtcbiAgICAgICAgaWYgKCFzZWFyY2gpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNlYXJjaEluY2x1ZGUgPSB0aGlzLmdlbmVyYXRlU2VhcmNoSW5jbHVkZSh7fSk7XG4gICAgICAgIG9wdGlvbnMuaW5jbHVkZSA9IFNlcXVlbGl6ZVV0aWxzLm1lcmdlSW5jbHVkZXMoXG4gICAgICAgICAgICBvcHRpb25zLmluY2x1ZGUgYXMgSW5jbHVkZU9wdGlvbnMgfCBJbmNsdWRlT3B0aW9uc1tdLFxuICAgICAgICAgICAgc2VhcmNoSW5jbHVkZSBhcyBJbmNsdWRlT3B0aW9uc1tdXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFvcHRpb25zLndoZXJlKSB7XG4gICAgICAgICAgICBvcHRpb25zLndoZXJlID0geyBbT3AuYW5kXTogW10gfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMud2hlcmUgPSB7IFtPcC5hbmRdOiBbb3B0aW9ucy53aGVyZV0gfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHdoZXJlID0gb3B0aW9ucy53aGVyZTtcbiAgICAgICAgY29uc3QgZ2VuZXJhdGVGaWVsZHNPYmplY3QgPSAoc2VhcmNoVmFsdWU6IHN0cmluZykgPT5cbiAgICAgICAgICAgIHRoaXMuZ2V0U2VhcmNoQXR0cmlidXRlcygpXG4gICAgICAgICAgICAgICAgLm1hcChhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGEuaXNKc29uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWVsZCA9IGEubGl0ZXJhbEtleSA/PyBgXFxgJHt0aGlzLm1vZGVsLm5hbWV9XFxgLlxcYCR7YS5rZXl9XFxgYDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBsaXRlcmFsIGZ1bmN0aW9uIGlzIG5vdCB3b3JraW5nIG9mIHNvbWUgcmVhc29uLi4uXG4gICAgICAgICAgICAgICAgICAgICAgICAgKiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5tb2RlbC5zZXF1ZWxpemU/LmVzY2FwZShgJSR7c2VhcmNoVmFsdWUudG9VcHBlckNhc2UoKX0lYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFV0aWxzLkxpdGVyYWwoYFVQUEVSKEpTT05fRVhUUkFDVCgke2ZpZWxkfSwgJyQnKSkgTElLRSAke3ZhbHVlfWApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBbYS5rZXldOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW09wLmxpa2VdOiBgJSR7c2VhcmNoVmFsdWV9JWBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9KS5maWx0ZXIoeCA9PiAhIXgpO1xuXG4gICAgICAgIGNvbnN0IHRva2VucyA9IHNlYXJjaC5zcGxpdChcIiBcIik7XG4gICAgICAgICh3aGVyZSBhcyBhbnkpW09wLmFuZF0ucHVzaChcbiAgICAgICAgICAgIHRva2Vucy5tYXAodCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgW09wLm9yXTogZ2VuZXJhdGVGaWVsZHNPYmplY3QodClcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEV4cG9ydHNIZWFkZXIobGFuZzogc3RyaW5nLCBoZWFkZXJzOiBzdHJpbmdbXSwgdHJhbnNsYXRlU2VydmljZSA9IHRoaXMudHJhbnNsYXRlU2VydmljZSk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKGhlYWRlcnMubWFwKHggPT4gdHJhbnNsYXRlU2VydmljZS5nZXRUcmFuc2xhdGlvbihsYW5nLCBgZXhwb3J0cy4ke3h9YCkpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEV4cG9ydERhdGEoZGF0YTogRGF0YVtdKTogb2JqZWN0W10ge1xuICAgICAgICByZXR1cm4gZGF0YS5tYXAoeCA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIHRoaXMuX2NvbmZpZy5leHBvcnRDb2x1bW5zID8/IFtdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgW3ZhbHVlLCBwcm9wXSA9IHRoaXMuZ2V0RXhwb3J0VmFsdWUoeCwga2V5KTtcbiAgICAgICAgICAgICAgICByZXN1bHRbYCR7aSsrfToke3Byb3B9YF0gPSB2YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RXhwb3J0VmFsdWUoZGF0YTogRGF0YSwgcGF0aDogc3RyaW5nKTogW3Vua25vd24sIHN0cmluZ10ge1xuICAgICAgICBjb25zdCBrZXlzID0gcGF0aC5zcGxpdChcIi5cIik7XG4gICAgICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0ga2V5cy5wb3AoKTtcbiAgICAgICAgICAgIHJldHVybiBbKGRhdGEgYXMgYW55KVtrZXkgYXMgc3RyaW5nXSwga2V5IGFzIHN0cmluZ107XG4gICAgICAgIH1cblxuICAgICAgICBsZXQga2V5ID0gXCJcIjtcbiAgICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBrZXkgPSBrZXlzLnNoaWZ0KCkgYXMgc3RyaW5nO1xuICAgICAgICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgICAgICAgICBkYXRhID0gKGRhdGEgYXMgc3RyaW5nKVtrZXkgYXMgYW55XSBhcyBhbnk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW2RhdGEsIGtleV07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBtZXJnZUFjY2Vzc0NvbnRyb2xDb25kaXRpb24od2hlcmU6IFdoZXJlT3B0aW9ucyB8IHVuZGVmaW5lZCwgdXNlcjogRGF0YUZpbHRlclVzZXJNb2RlbCk6IFByb21pc2U8V2hlcmVPcHRpb25zIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGNvbnN0IHJlc291cmNlcyA9IGF3YWl0IHRoaXMuYWNjZXNzQ29udHJvbEFkYXB0ZXIuZ2V0UmVzb3VyY2VzKHRoaXMuX2NvbmZpZy5tb2RlbCBhcyBhbnksIHVzZXIpO1xuICAgICAgICBpZiAocmVzb3VyY2VzLmlkcykge1xuICAgICAgICAgICAgcmV0dXJuIFNlcXVlbGl6ZVV0aWxzLm1lcmdlV2hlcmUoeyBpZDogcmVzb3VyY2VzLmlkcyB9LCB3aGVyZSk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzb3VyY2VzLndoZXJlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIFtPcC5hbmRdOiBbXG4gICAgICAgICAgICAgICAgICAgIHdoZXJlLFxuICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMud2hlcmVcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9IGFzIFdoZXJlT3B0aW9ucztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB3aGVyZTtcbiAgICB9XG59XG4iXX0=
|
|
432
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2xpYi9kYXRhLWZpbHRlci5yZXBvc2l0b3J5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLDJDQUE0QztBQUM1Qyx5Q0FBaUg7QUFHakgseUNBQW1GO0FBSW5GLG9FQUEwRDtBQUsxRCx3RUFBbUU7QUFDbkUsZ0ZBQTJFO0FBQzNFLHVEQUFzRDtBQUN0RCxpREFBNkM7QUFDN0MsbURBQStDO0FBR3hDLElBQU0sb0JBQW9CLEdBQTFCLE1BQU0sb0JBQW9CO0lBSTdCLElBQVcsS0FBSztRQUNaLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFpQixDQUFDO0lBQzFDLENBQUM7SUFFRCxZQUNZLE9BQVksRUFDWixpQkFBb0MsRUFDcEMscUJBQTRDLEVBQzVDLG9CQUEwQyxFQUMxQyxnQkFBa0MsRUFDbEMsYUFBNEI7UUFMNUIsWUFBTyxHQUFQLE9BQU8sQ0FBSztRQUNaLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUF1QjtRQUM1Qyx5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBQzFDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFFcEMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQXNCLEVBQUUsT0FBcUIsRUFBRSxVQUFtQjtRQUNwRixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDcEcsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNULE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLEtB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T0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2hCLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFZLENBQUM7WUFDN0IsSUFBSSxJQUFJLEVBQUU7Z0JBQ04sSUFBSSxHQUFJLElBQVksQ0FBQyxHQUFVLENBQVEsQ0FBQzthQUMzQztTQUNKO1FBRUQsT0FBTyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN2QixDQUFDO0lBRU8sS0FBSyxDQUFDLDJCQUEyQixDQUFDLEtBQStCLEVBQUUsSUFBeUI7UUFDaEcsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBWSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2hHLElBQUksU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNmLE9BQU8sZ0NBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLEdBQUcsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ2xFO2FBQU0sSUFBSSxTQUFTLENBQUMsS0FBSyxFQUFFO1lBQ3hCLE9BQU87Z0JBQ0gsQ0FBQyxjQUFFLENBQUMsR0FBRyxDQUFDLEVBQUU7b0JBQ04sS0FBSztvQkFDTCxTQUFTLENBQUMsS0FBSztpQkFDbEI7YUFDWSxDQUFDO1NBQ3JCO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDakIsQ0FBQztDQUNKLENBQUE7QUFuZlksb0RBQW9COytCQUFwQixvQkFBb0I7SUFEaEMsSUFBQSxtQkFBVSxHQUFFOzZDQVdzQix1Q0FBaUI7UUFDYiwrQ0FBcUI7UUFDdEIsK0JBQW9CO1FBQ3hCLDJCQUFnQjtRQUNuQix3QkFBYTtHQWQvQixvQkFBb0IsQ0FtZmhDIiwiZmlsZSI6ImxpYi9kYXRhLWZpbHRlci5yZXBvc2l0b3J5LmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRmluZE9wdGlvbnMsIElkZW50aWZpZXIsIEluY2x1ZGVhYmxlLCBJbmNsdWRlT3B0aW9ucywgTW9kZWwsIE9wLCBVdGlscywgV2hlcmVPcHRpb25zIH0gZnJvbSBcInNlcXVlbGl6ZVwiO1xuaW1wb3J0IHsgR3JvdXBPcHRpb24gfSBmcm9tIFwic2VxdWVsaXplL3R5cGVzL21vZGVsXCI7XG5pbXBvcnQgeyBDb2wsIEZuIH0gZnJvbSBcInNlcXVlbGl6ZS90eXBlcy91dGlsc1wiO1xuaW1wb3J0IHsgQWNjZXNzQ29udHJvbEFkYXB0ZXIsIEV4cG9ydEFkYXB0ZXIsIFRyYW5zbGF0ZUFkYXB0ZXIgfSBmcm9tIFwiLi9hZGFwdGVyc1wiO1xuaW1wb3J0IHsgQXR0cmlidXRlc0NvbmZpZyB9IGZyb20gXCIuL21vZGVscy9hdHRyaWJ1dGVzLm1vZGVsXCI7XG5pbXBvcnQgeyBDdXN0b21BdHRyaWJ1dGVzQ29uZmlnIH0gZnJvbSBcIi4vbW9kZWxzL2N1c3RvbS1hdHRyaWJ1dGVzLm1vZGVsXCI7XG5pbXBvcnQgeyBEYXRhRmlsdGVyQ29uZmlnIH0gZnJvbSBcIi4vbW9kZWxzL2RhdGEtZmlsdGVyLm1vZGVsXCI7XG5pbXBvcnQgeyBFeHBvcnRUeXBlcyB9IGZyb20gXCIuL21vZGVscy9leHBvcnQtdHlwZXMubW9kZWxcIjtcbmltcG9ydCB7IE9yZGVyTW9kZWwgfSBmcm9tIFwiLi9tb2RlbHMvZmlsdGVyLm1vZGVsXCI7XG5pbXBvcnQgeyBQYXRoTW9kZWwgfSBmcm9tIFwiLi9tb2RlbHMvcGF0aC5tb2RlbFwiO1xuaW1wb3J0IHsgU2VhcmNoQXR0cmlidXRlc01vZGVsIH0gZnJvbSBcIi4vbW9kZWxzL3NlYXJjaC1hdHRyaWJ1dGVzLm1vZGVsXCI7XG5pbXBvcnQgeyBEYXRhRmlsdGVyVXNlck1vZGVsIH0gZnJvbSBcIi4vbW9kZWxzL3VzZXIubW9kZWxcIjtcbmltcG9ydCB7IERhdGFGaWx0ZXJTY2FubmVyIH0gZnJvbSBcIi4vc2Nhbm5lcnMvZGF0YS1maWx0ZXIuc2Nhbm5lclwiO1xuaW1wb3J0IHsgU2VxdWVsaXplTW9kZWxTY2FubmVyIH0gZnJvbSBcIi4vc2Nhbm5lcnMvc2VxdWVsaXplLW1vZGVsLnNjYW5uZXJcIjtcbmltcG9ydCB7IE0sIFNlcXVlbGl6ZVV0aWxzIH0gZnJvbSBcIi4vc2VxdWVsaXplLnV0aWxzXCI7XG5pbXBvcnQgeyBDc3ZVdGlscyB9IGZyb20gXCIuL3V0aWxzL2Nzdi51dGlsc1wiO1xuaW1wb3J0IHsgWGxzeFV0aWxzIH0gZnJvbSBcIi4vdXRpbHMveGxzeC51dGlsc1wiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGF0YUZpbHRlclJlcG9zaXRvcnk8RGF0YT4ge1xuICAgIHByaXZhdGUgX2NvbmZpZyE6IERhdGFGaWx0ZXJDb25maWc7XG4gICAgcHJpdmF0ZSBfZGVmaW5pdGlvbnMhOiBBdHRyaWJ1dGVzQ29uZmlnW107XG5cbiAgICBwdWJsaWMgZ2V0IG1vZGVsKCk6IHR5cGVvZiBNIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5tb2RlbCBhcyB0eXBlb2YgTTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBkYXRhRGVmOiBhbnksXG4gICAgICAgIHByaXZhdGUgZGF0YUZpbHRlclNjYW5uZXI6IERhdGFGaWx0ZXJTY2FubmVyLFxuICAgICAgICBwcml2YXRlIHNlcXVlbGl6ZU1vZGVsU2Nhbm5lcjogU2VxdWVsaXplTW9kZWxTY2FubmVyLFxuICAgICAgICBwcml2YXRlIGFjY2Vzc0NvbnRyb2xBZGFwdGVyOiBBY2Nlc3NDb250cm9sQWRhcHRlcixcbiAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVBZGFwdGVyLFxuICAgICAgICBwcml2YXRlIGV4cG9ydEFkYXB0ZXI6IEV4cG9ydEFkYXB0ZXJcbiAgICApIHtcbiAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmRCeVBrKGlkZW50aWZpZXI6IElkZW50aWZpZXIsIG9wdGlvbnM/OiBGaW5kT3B0aW9ucywgY29uZGl0aW9ucz86IG9iamVjdCk6IFByb21pc2U8RGF0YSB8IG51bGw+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5tb2RlbC5maW5kQnlQayhpZGVudGlmaWVyLCB0aGlzLmdlbmVyYXRlRmluZE9wdGlvbnMob3B0aW9ucywgY29uZGl0aW9ucykpO1xuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVkdWNlT2JqZWN0KHJlc3VsdCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmRCeVBrRnJvbVVzZXIodXNlcjogRGF0YUZpbHRlclVzZXJNb2RlbCwgaWRlbnRpZmllcjogSWRlbnRpZmllciwgY29uZGl0aW9ucz86IG9iamVjdCk6IFByb21pc2U8RGF0YSB8IG51bGw+IHtcbiAgICAgICAgY29uc3QgcmVzb3VyY2VzID0gYXdhaXQgdGhpcy5hY2Nlc3NDb250cm9sQWRhcHRlci5nZXRSZXNvdXJjZXModGhpcy5fY29uZmlnLm1vZGVsIGFzIGFueSwgdXNlcik7XG4gICAgICAgIGlmIChyZXNvdXJjZXMuaWRzPy5pbmNsdWRlcyhpZGVudGlmaWVyIGFzIG51bWJlcikgfHwgcmVzb3VyY2VzLmFsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZEJ5UGsoaWRlbnRpZmllciwge30sIGNvbmRpdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc291cmNlcy5pZHM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmluZE9uZSh7XG4gICAgICAgICAgICB3aGVyZToge1xuICAgICAgICAgICAgICAgIFtPcC5hbmRdOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzLl9jb25maWcubW9kZWwucHJpbWFyeUtleUF0dHJpYnV0ZV06IGlkZW50aWZpZXJcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLndoZXJlID8/IHt9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCBjb25kaXRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZmluZE9uZShvcHRpb25zPzogRmluZE9wdGlvbnMsIGNvbmRpdGlvbnM/OiBvYmplY3QpOiBQcm9taXNlPERhdGEgfCBudWxsPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubW9kZWwuZmluZE9uZSh0aGlzLmdlbmVyYXRlRmluZE9wdGlvbnMob3B0aW9ucywgY29uZGl0aW9ucykpO1xuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMucmVkdWNlT2JqZWN0KHJlc3VsdCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGZpbmRPbmVGcm9tVXNlcih1c2VyOiBEYXRhRmlsdGVyVXNlck1vZGVsLCBvcHRpb25zOiBGaW5kT3B0aW9ucyA9IHt9LCBjb25kaXRpb25zPzogb2JqZWN0KTogUHJvbWlzZTxEYXRhIHwgbnVsbD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5maW5kT25lKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgd2hlcmU6IGF3YWl0IHRoaXMubWVyZ2VBY2Nlc3NDb250cm9sQ29uZGl0aW9uKG9wdGlvbnMud2hlcmUgPz8ge30sIHVzZXIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29uZGl0aW9uc1xuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmaW5kQWxsKG9wdGlvbnM/OiBGaW5kT3B0aW9ucywgY29uZGl0aW9ucz86IG9iamVjdCk6IFByb21pc2U8RGF0YVtdPiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMubW9kZWwuZmluZEFsbCh0aGlzLmdlbmVyYXRlRmluZE9wdGlvbnMob3B0aW9ucywgY29uZGl0aW9ucykpO1xuICAgICAgICBpZiAoIXJlc3VsdD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0IGFzIHVua25vd24gYXMgRGF0YVtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQubWFwKHggPT4gdGhpcy5yZWR1Y2VPYmplY3QoeCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmaW5kQWxsRnJvbVVzZXIodXNlcjogRGF0YUZpbHRlclVzZXJNb2RlbCwgb3B0aW9ucz86IEZpbmRPcHRpb25zLCBjb25kaXRpb25zPzogb2JqZWN0KTogUHJvbWlzZTxEYXRhW10+IHtcbiAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgPz8ge307XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmZpbmRBbGwoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgICAgICB3aGVyZTogYXdhaXQgdGhpcy5tZXJnZUFjY2Vzc0NvbnRyb2xDb25kaXRpb24ob3B0aW9ucy53aGVyZSA/PyB7fSwgdXNlcilcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb25kaXRpb25zXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNvdW50KHdoZXJlPzogV2hlcmVPcHRpb25zLCBjb25kaXRpb25zPzogb2JqZWN0KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuZ2VuZXJhdGVGaW5kT3B0aW9ucyh7IHdoZXJlIH0sIGNvbmRpdGlvbnMpO1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5jb3VudChvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VhcmNoKHNlYXJjaDogc3RyaW5nLCBsYW5ndWFnZTogc3RyaW5nIHwgbnVsbCA9IG51bGwsIG9wdGlvbnM/OiBGaW5kT3B0aW9ucywgY29uZGl0aW9ucz86IG9iamVjdCk6IFByb21pc2U8RGF0YVtdPiB7XG4gICAgICAgIGNvbnN0IGZpbmRPcHRpb25zID0gdGhpcy5nZW5lcmF0ZUZpbmRPcHRpb25zKG9wdGlvbnMsIGNvbmRpdGlvbnMpO1xuICAgICAgICB0aGlzLmFkZFNlYXJjaENvbmRpdGlvbihzZWFyY2gsIGZpbmRPcHRpb25zLCBsYW5ndWFnZSk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5tb2RlbC5maW5kQWxsKGZpbmRPcHRpb25zKTtcbiAgICAgICAgaWYgKCFyZXN1bHQ/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyB1bmtub3duIGFzIERhdGFbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcCh4ID0+IHRoaXMucmVkdWNlT2JqZWN0KHgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgc2VhcmNoRnJvbVVzZXIodXNlcjogRGF0YUZpbHRlclVzZXJNb2RlbCwgc2VhcmNoOiBzdHJpbmcsIG9wdGlvbnM/OiBGaW5kT3B0aW9ucywgY29uZGl0aW9ucz86IG9iamVjdCk6IFByb21pc2U8RGF0YVtdPiB7XG4gICAgICAgIGNvbnN0IGZpbmRPcHRpb25zID0gdGhpcy5nZW5lcmF0ZUZpbmRPcHRpb25zKG9wdGlvbnMsIGNvbmRpdGlvbnMpO1xuICAgICAgICB0aGlzLmFkZFNlYXJjaENvbmRpdGlvbihzZWFyY2gsIGZpbmRPcHRpb25zLCB1c2VyLmxhbmd1YWdlKTtcblxuICAgICAgICBmaW5kT3B0aW9ucy53aGVyZSA9IGF3YWl0IHRoaXMubWVyZ2VBY2Nlc3NDb250cm9sQ29uZGl0aW9uKGZpbmRPcHRpb25zLndoZXJlLCB1c2VyKTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5tb2RlbC5maW5kQWxsKGZpbmRPcHRpb25zKTtcbiAgICAgICAgaWYgKCFyZXN1bHQ/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCBhcyB1bmtub3duIGFzIERhdGFbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcCh4ID0+IHRoaXMucmVkdWNlT2JqZWN0KHgpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2VuZXJhdGVGaW5kT3B0aW9ucyhvcHRpb25zPzogRmluZE9wdGlvbnMsIGNvbmRpdGlvbnM/OiBvYmplY3QpOiBGaW5kT3B0aW9ucyB7XG4gICAgICAgIG9wdGlvbnMgPz89IHt9O1xuXG4gICAgICAgIGNvbnN0IG5lc3RlZEluY2x1ZGVzOiBBcnJheTxJbmNsdWRlT3B0aW9ucyB8IEluY2x1ZGVPcHRpb25zW10+ID0gW1xuICAgICAgICAgICAgLi4udGhpcy5fZGVmaW5pdGlvbnMubWFwKHggPT4ge1xuICAgICAgICAgICAgICAgIGlmICgheC5wYXRoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IHgucGF0aC50cmFuc2Zvcm1QYXRoQ29uZmlnKGNvbmRpdGlvbnMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJpYnV0ZXMgPSB4LnRyYW5zZm9ybUF0dHJpYnV0ZXNDb25maWcoY29uZGl0aW9ucyk7XG4gICAgICAgICAgICAgICAgY29uc3QgYWRkaXRpb25hbEluY2x1ZGVzID0geC50cmFuc2Zvcm1JbmNsdWRlc0NvbmZpZyhjb25kaXRpb25zKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXF1ZWxpemVNb2RlbFNjYW5uZXIuZ2V0SW5jbHVkZXModGhpcy5tb2RlbCwgcGF0aCwgYWRkaXRpb25hbEluY2x1ZGVzLCBhdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgLi4udGhpcy5fY29uZmlnLmdldEN1c3RvbUF0dHJpYnV0ZXNJbmNsdWRlcygpLm1hcCh4ID0+IHRoaXMuc2VxdWVsaXplTW9kZWxTY2FubmVyLmdldEluY2x1ZGVzKHRoaXMubW9kZWwsIHtcbiAgICAgICAgICAgICAgICBwYXRoOiB4LnBhdGgsXG4gICAgICAgICAgICAgICAgcGFyYW5vaWQ6IHgucGFyYW5vaWQsXG4gICAgICAgICAgICAgICAgc3ViUXVlcnk6IHguc3ViUXVlcnksXG4gICAgICAgICAgICAgICAgd2hlcmU6IHgud2hlcmUgPyBTZXF1ZWxpemVVdGlscy5nZW5lcmF0ZVdoZXJlQ29uZGl0aW9ucyh4LndoZXJlLCBjb25kaXRpb25zKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgfSwgW10sIHguYXR0cmlidXRlcykpXG4gICAgICAgIF07XG4gICAgICAgIGlmIChvcHRpb25zLmluY2x1ZGUpIHtcbiAgICAgICAgICAgIG5lc3RlZEluY2x1ZGVzLnB1c2gob3B0aW9ucy5pbmNsdWRlIGFzIEluY2x1ZGVPcHRpb25zIHwgSW5jbHVkZU9wdGlvbnNbXSk7XG4gICAgICAgIH1cblxuICAgICAgICBvcHRpb25zLmluY2x1ZGUgPSBTZXF1ZWxpemVVdGlscy5yZWR1Y2VJbmNsdWRlcyhuZXN0ZWRJbmNsdWRlcyk7XG5cbiAgICAgICAgY29uc3QgZ2VuZXJhdGVkQXR0cmlidXRlcyA9IHRoaXMuX2NvbmZpZy50cmFuc2Zvcm1BdHRyaWJ1dGVzQ29uZmlnKGNvbmRpdGlvbnMpO1xuICAgICAgICBpZiAoZ2VuZXJhdGVkQXR0cmlidXRlcykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuYXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuYXR0cmlidXRlcyA9IFNlcXVlbGl6ZVV0aWxzLm1lcmdlQXR0cmlidXRlcyhvcHRpb25zLmF0dHJpYnV0ZXMsIGdlbmVyYXRlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvcHRpb25zLmF0dHJpYnV0ZXMgPSBnZW5lcmF0ZWRBdHRyaWJ1dGVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdlbmVyYXRlT3JkZXJJbmNsdWRlKG9yZGVyOiBPcmRlck1vZGVsLCBjb25kaXRpb25zPzogb2JqZWN0KTogSW5jbHVkZU9wdGlvbnNbXSB7XG4gICAgICAgIGlmICghb3JkZXIgfHwgIW9yZGVyLmNvbHVtbiB8fCBvcmRlci5kaXJlY3Rpb24gPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1c3RvbUF0dHIgPSB0aGlzLmdldEN1c3RvbUF0dHJpYnV0ZShvcmRlci5jb2x1bW4pO1xuICAgICAgICBpZiAoY3VzdG9tQXR0cikge1xuICAgICAgICAgICAgaWYgKCFjdXN0b21BdHRyLmNvbmZpZz8ucGF0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VxdWVsaXplTW9kZWxTY2FubmVyLmdldEluY2x1ZGVzKHRoaXMubW9kZWwsIHtcbiAgICAgICAgICAgICAgICBwYXRoOiBjdXN0b21BdHRyLmNvbmZpZy5wYXRoLFxuICAgICAgICAgICAgICAgIHdoZXJlOiBjdXN0b21BdHRyLmNvbmZpZy53aGVyZSA/IFNlcXVlbGl6ZVV0aWxzLmdlbmVyYXRlV2hlcmVDb25kaXRpb25zKGN1c3RvbUF0dHIuY29uZmlnLndoZXJlLCBjb25kaXRpb25zKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgfSwgW10pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuc2VxdWVsaXplTW9kZWxTY2FubmVyLmdldE9yZGVySW5jbHVkZXModGhpcy5tb2RlbCwgb3JkZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZW5lcmF0ZVNlYXJjaEluY2x1ZGUoY29uZGl0aW9ucz86IG9iamVjdCk6IEluY2x1ZGVhYmxlW10ge1xuICAgICAgICBjb25zdCBuZXN0ZWRJbmNsdWRlczogQXJyYXk8SW5jbHVkZU9wdGlvbnMgfCBJbmNsdWRlT3B0aW9uc1tdPiA9IFtcbiAgICAgICAgICAgIC4uLnRoaXMuX2RlZmluaXRpb25zLm1hcCh4ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXgucGF0aCB8fCB4LnBhdGguc2VwYXJhdGUgfHwgeC5pZ25vcmVJblNlYXJjaCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSB4LnBhdGgudHJhbnNmb3JtUGF0aENvbmZpZyhjb25kaXRpb25zKTtcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0geC50cmFuc2Zvcm1BdHRyaWJ1dGVzQ29uZmlnKGNvbmRpdGlvbnMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxJbmNsdWRlcyA9IHgudHJhbnNmb3JtSW5jbHVkZXNDb25maWcoY29uZGl0aW9ucyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VxdWVsaXplTW9kZWxTY2FubmVyLmdldEluY2x1ZGVzKHRoaXMubW9kZWwsIHBhdGgsIGFkZGl0aW9uYWxJbmNsdWRlcywgYXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIC4uLnRoaXMuX2NvbmZpZy5nZXRDdXN0b21BdHRyaWJ1dGVzSW5jbHVkZXMoKS5tYXAoeCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF4LnBhdGggfHwgeC5zZXBhcmF0ZSB8fCB4Lmlnbm9yZUluU2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZXF1ZWxpemVNb2RlbFNjYW5uZXIuZ2V0SW5jbHVkZXModGhpcy5tb2RlbCwge1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiB4LnBhdGgsXG4gICAgICAgICAgICAgICAgICAgIHBhcmFub2lkOiB4LnBhcmFub2lkLFxuICAgICAgICAgICAgICAgICAgICBzdWJRdWVyeTogeC5zdWJRdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgd2hlcmU6IHgud2hlcmUgPyBTZXF1ZWxpemVVdGlscy5nZW5lcmF0ZVdoZXJlQ29uZGl0aW9ucyh4LndoZXJlLCBjb25kaXRpb25zKSA6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH0sIFtdLCB4LmF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgXTtcblxuICAgICAgICByZXR1cm4gU2VxdWVsaXplVXRpbHMucmVkdWNlSW5jbHVkZXMobmVzdGVkSW5jbHVkZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWR1Y2VPYmplY3QocmVzdWx0OiBhbnkpOiBEYXRhIHtcbiAgICAgICAgY29uc3QgciA9IHJlc3VsdCBpbnN0YW5jZW9mIE1vZGVsID8gcmVzdWx0LnRvSlNPTigpIDogcmVzdWx0O1xuICAgICAgICBjb25zdCBkYXRhID0gbmV3IHRoaXMuZGF0YURlZi5wcm90b3R5cGUuY29uc3RydWN0b3Ioe30sIHsgaXNOZXdSZWNvcmQ6IGZhbHNlIH0pO1xuICAgICAgICBPYmplY3QuYXNzaWduKGRhdGEsIHIpO1xuICAgICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIE1vZGVsKSB7XG4gICAgICAgICAgICAoZGF0YSBhcyBhbnkpLmRhdGFWYWx1ZXMgPSB7XG4gICAgICAgICAgICAgICAgLi4uclxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgZGVmIG9mIHRoaXMuX2RlZmluaXRpb25zKSB7XG4gICAgICAgICAgICBpZiAoZGVmLnBhdGgpIHtcbiAgICAgICAgICAgICAgICBkYXRhW2RlZi5rZXldID0gU2VxdWVsaXplVXRpbHMucmVkdWNlTW9kZWxGcm9tUGF0aChyZXN1bHQsIGRlZi5wYXRoLnBhdGgpO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgTW9kZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5zZXREYXRhVmFsdWUoZGVmLmtleSBhcyBhbnksIFNlcXVlbGl6ZVV0aWxzLnJlZHVjZU1vZGVsRnJvbVBhdGgocmVzdWx0LCBkZWYucGF0aC5wYXRoKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkYXRhW2RlZi5rZXldID0gcmVzdWx0W2RlZi5rZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFNlYXJjaEF0dHJpYnV0ZXMoKTogU2VhcmNoQXR0cmlidXRlc01vZGVsW10ge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzOiBTZWFyY2hBdHRyaWJ1dGVzTW9kZWxbXSA9IFtdO1xuICAgICAgICBjb25zdCBtb2RlbEF0dHIgPSB0aGlzLl9jb25maWcuZ2V0U2VhcmNoYWJsZUF0dHJpYnV0ZXMoKTtcbiAgICAgICAgYXR0cmlidXRlcy5wdXNoKFxuICAgICAgICAgICAgLi4ubW9kZWxBdHRyLm1hcChhID0+ICh7XG4gICAgICAgICAgICAgICAgbmFtZTogYSxcbiAgICAgICAgICAgICAgICBrZXk6IGEsXG4gICAgICAgICAgICAgICAgaXNKc29uOiBTZXF1ZWxpemVVdGlscy5pc0NvbHVtbkpzb24odGhpcy5tb2RlbCwgYSlcbiAgICAgICAgICAgIH0pKVxuICAgICAgICApO1xuXG4gICAgICAgIGZvciAoY29uc3QgZGVmaW5pdGlvbiBvZiB0aGlzLl9kZWZpbml0aW9ucykge1xuICAgICAgICAgICAgaWYgKCFkZWZpbml0aW9uLnBhdGgpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYXR0ciA9IChkZWZpbml0aW9uLmlnbm9yZUluU2VhcmNoIHx8IGRlZmluaXRpb24uc2VhcmNoYWJsZVRyYW5zbGF0aW9uQXR0cmlidXRlcz8ubGVuZ3RoICYmICFkZWZpbml0aW9uLnNlYXJjaGFibGVBdHRyaWJ1dGVzPy5sZW5ndGgpID8gW10gOiBkZWZpbml0aW9uLnNlYXJjaGFibGVBdHRyaWJ1dGVzID8/IGRlZmluaXRpb24uYXR0cmlidXRlcztcbiAgICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxJbmNsdWRlcyA9IGRlZmluaXRpb24udHJhbnNmb3JtSW5jbHVkZXNDb25maWcoe30pO1xuICAgICAgICAgICAgYXR0cmlidXRlcy5wdXNoKFxuICAgICAgICAgICAgICAgIC4uLnRoaXMuc2VxdWVsaXplTW9kZWxTY2FubmVyLmdldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwsXG4gICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24ucGF0aCBhcyBQYXRoTW9kZWwsXG4gICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxJbmNsdWRlcyxcbiAgICAgICAgICAgICAgICAgICAgYXR0clxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXR0cmlidXRlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U2VhcmNoVHJhbnNsYXRpb25BdHRyaWJ1dGVzKCk6IFNlYXJjaEF0dHJpYnV0ZXNNb2RlbFtdIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jb25maWcuZ2V0U2VhcmNoYWJsZVRyYW5zbGF0aW9uQXR0cmlidXRlcygpLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXR0cmlidXRlczogU2VhcmNoQXR0cmlidXRlc01vZGVsW10gPSBbXTtcbiAgICAgICAgY29uc3QgbW9kZWxBdHRyID0gdGhpcy5fY29uZmlnLmdldFNlYXJjaGFibGVUcmFuc2xhdGlvbkF0dHJpYnV0ZXMoKTtcbiAgICAgICAgYXR0cmlidXRlcy5wdXNoKFxuICAgICAgICAgICAgLi4ubW9kZWxBdHRyLm1hcChhdHRyaWJ1dGUgPT4gKHtcbiAgICAgICAgICAgICAgICBuYW1lOiBhdHRyaWJ1dGUsXG4gICAgICAgICAgICAgICAga2V5OiBhdHRyaWJ1dGUsXG4gICAgICAgICAgICAgICAgaXNKc29uOiBTZXF1ZWxpemVVdGlscy5pc0NvbHVtbkpzb24odGhpcy5tb2RlbCwgYXR0cmlidXRlKSxcbiAgICAgICAgICAgICAgICBpc1RyYW5zbGF0aW9uQXR0cmlidXRlOiB0cnVlXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBmb3IgKGNvbnN0IGRlZmluaXRpb24gb2YgdGhpcy5fZGVmaW5pdGlvbnMpIHtcbiAgICAgICAgICAgIGlmICghZGVmaW5pdGlvbi5wYXRoIHx8IGRlZmluaXRpb24uaWdub3JlSW5TZWFyY2ggfHwgIWRlZmluaXRpb24uc2VhcmNoYWJsZVRyYW5zbGF0aW9uQXR0cmlidXRlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGFkZGl0aW9uYWxJbmNsdWRlcyA9IGRlZmluaXRpb24udHJhbnNmb3JtSW5jbHVkZXNDb25maWcoe30pO1xuICAgICAgICAgICAgYXR0cmlidXRlcy5wdXNoKFxuICAgICAgICAgICAgICAgIC4uLnRoaXMuc2VxdWVsaXplTW9kZWxTY2FubmVyLmdldEF0dHJpYnV0ZXMoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwsXG4gICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24ucGF0aCBhcyBQYXRoTW9kZWwsXG4gICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxJbmNsdWRlcyxcbiAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbi5zZWFyY2hhYmxlVHJhbnNsYXRpb25BdHRyaWJ1dGVzLFxuICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBoYXNDdXN0b21BdHRyaWJ1dGUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhIXRoaXMuX2NvbmZpZy5jdXN0b21BdHRyaWJ1dGVzLmZpbmQoKHgpID0+IHguY29uZmlnPy5uYW1lID09PSBuYW1lKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q3VzdG9tQXR0cmlidXRlKG5hbWU6IHN0cmluZyk6IEN1c3RvbUF0dHJpYnV0ZXNDb25maWcgfCBudWxsIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5jdXN0b21BdHRyaWJ1dGVzLmZpbmQoKHgpID0+IHguY29uZmlnPy5uYW1lID09PSBuYW1lKSA/PyBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDdXN0b21BdHRyaWJ1dGVHcm91cEJ5KCk6IChzdHJpbmcgfCBGbiB8IENvbClbXSB7XG4gICAgICAgIGNvbnN0IGdyb3VwOiBHcm91cE9wdGlvbiA9IFtdO1xuXG4gICAgICAgIGNvbnN0IHNob3VsZEdyb3VwQnkgPSB0aGlzLl9jb25maWcuY3VzdG9tQXR0cmlidXRlcy5zb21lKChhdHRyaWJ1dGUpID0+IGF0dHJpYnV0ZS5zaG91bGRHcm91cEJ5KCkpO1xuICAgICAgICBpZiAoc2hvdWxkR3JvdXBCeSkge1xuICAgICAgICAgICAgZ3JvdXAucHVzaChcImlkXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdyb3VwO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkb3dubG9hZERhdGEoZGF0YTogRGF0YVtdLCB0eXBlOiBFeHBvcnRUeXBlcywgbGFuZzogc3RyaW5nLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTxCdWZmZXIgfCBzdHJpbmc+O1xuICAgIHB1YmxpYyBhc3luYyBkb3dubG9hZERhdGEoaGVhZGVyczogc3RyaW5nW10sIGRhdGE6IGFueVtdLCB0eXBlOiBFeHBvcnRUeXBlcywgbGFuZzogc3RyaW5nLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTxCdWZmZXIgfCBzdHJpbmc+O1xuICAgIHB1YmxpYyBhc3luYyBkb3dubG9hZERhdGEoXG4gICAgICAgIGRhdGFPckhlYWRlcnM6IERhdGFbXSB8IHN0cmluZ1tdLFxuICAgICAgICB0eXBlT3JEYXRhOiBFeHBvcnRUeXBlcyB8IGFueVtdLFxuICAgICAgICBsYW5nT3JUeXBlOiBzdHJpbmcgfCBFeHBvcnRUeXBlcyxcbiAgICAgICAgb3B0aW9uc09yTGFuZz86IGFueSB8IHN0cmluZyxcbiAgICAgICAgb3B0aW9ucz86IGFueVxuICAgICk6IFByb21pc2U8QnVmZmVyIHwgc3RyaW5nPiB7XG4gICAgICAgIGxldCB0eXBlOiBFeHBvcnRUeXBlcztcbiAgICAgICAgbGV0IGhlYWRlcnM6IHN0cmluZ1tdO1xuICAgICAgICBsZXQgZGF0YTogYW55W107XG4gICAgICAgIGxldCBsYW5nOiBzdHJpbmc7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlT3JEYXRhID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICB0eXBlID0gdHlwZU9yRGF0YTtcbiAgICAgICAgICAgIGxhbmcgPSBsYW5nT3JUeXBlO1xuICAgICAgICAgICAgaGVhZGVycyA9IGF3YWl0IHRoaXMuZ2V0RXhwb3J0c0hlYWRlcihsYW5nLCB0aGlzLl9jb25maWcuZXhwb3J0Q29sdW1ucyA/PyBbXSk7XG4gICAgICAgICAgICBkYXRhID0gYXdhaXQgdGhpcy5nZXRFeHBvcnREYXRhKGRhdGFPckhlYWRlcnMgYXMgRGF0YVtdKTtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zT3JMYW5nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGFuZyA9IG9wdGlvbnNPckxhbmcgYXMgc3RyaW5nO1xuICAgICAgICAgICAgaGVhZGVycyA9IGF3YWl0IHRoaXMuZ2V0RXhwb3J0c0hlYWRlcihsYW5nLCBkYXRhT3JIZWFkZXJzIGFzIHN0cmluZ1tdKTtcbiAgICAgICAgICAgIGRhdGEgPSB0eXBlT3JEYXRhO1xuICAgICAgICAgICAgdHlwZSA9IGxhbmdPclR5cGUgYXMgRXhwb3J0VHlwZXM7XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgRXhwb3J0VHlwZXMuWExTWDpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5kb3dubG9hZFhsc3goaGVhZGVycywgZGF0YSk7XG4gICAgICAgICAgICBjYXNlIEV4cG9ydFR5cGVzLkhUTUw6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZG93bmxvYWRIdG1sKGhlYWRlcnMsIGRhdGEsIGxhbmcsIG9wdGlvbnMpO1xuICAgICAgICAgICAgY2FzZSBFeHBvcnRUeXBlcy5DU1Y6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZG93bmxvYWRDc3YoaGVhZGVycywgZGF0YSk7XG4gICAgICAgICAgICBjYXNlIEV4cG9ydFR5cGVzLlBERjpcbiAgICAgICAgICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5kb3dubG9hZFBkZihoZWFkZXJzLCBkYXRhLCBvcHRpb25zKTtcbiAgICAgICAgICAgIGNhc2UgRXhwb3J0VHlwZXMuWklQOlxuICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmRvd25sb2FkWmlwKGhlYWRlcnMsIGRhdGEsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRvd25sb2FkWGxzeChoZWFkZXJzOiBzdHJpbmdbXSwgZGF0YTogYW55W10pOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgICAgICByZXR1cm4gWGxzeFV0aWxzLmFycmF5VG9YbHN4QnVmZmVyKFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHRoaXMuX2NvbmZpZy5tb2RlbC5nZXRUYWJsZU5hbWUoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICBoZWFkZXJzXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRvd25sb2FkSHRtbChoZWFkZXJzOiBzdHJpbmdbXSwgZGF0YTogYW55W10sIGxhbmc6IHN0cmluZywgb3B0aW9ucz86IGFueSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4cG9ydEFkYXB0ZXIuZXhwb3J0QXNIdG1sKGxhbmcsIHtcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLl9jb25maWcubW9kZWwuZ2V0VGFibGVOYW1lKCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgY29sdW1uczogaGVhZGVycyxcbiAgICAgICAgICAgIGRhdGE6IGRhdGFcbiAgICAgICAgfSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGRvd25sb2FkQ3N2KGhlYWRlcnM6IHN0cmluZ1tdLCBkYXRhOiBhbnlbXSk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBDc3ZVdGlscy5hcnJheVRvQ3N2QnVmZmVyKGRhdGEsIGhlYWRlcnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBkb3dubG9hZFBkZihoZWFkZXJzOiBzdHJpbmdbXSwgZGF0YTogYW55W10sIGxhbmc6IHN0cmluZywgb3B0aW9ucz86IGFueSk6IFByb21pc2U8QnVmZmVyPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmV4cG9ydEFkYXB0ZXIuZXhwb3J0QXNQZGYobGFuZywge1xuICAgICAgICAgICAgdGl0bGU6IHRoaXMuX2NvbmZpZy5tb2RlbC5nZXRUYWJsZU5hbWUoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICBjb2x1bW5zOiBoZWFkZXJzLFxuICAgICAgICAgICAgZGF0YTogZGF0YVxuICAgICAgICB9LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZG93bmxvYWRaaXAoaGVhZGVyczogc3RyaW5nW10sIGRhdGE6IGFueVtdLCBsYW5nOiBzdHJpbmcsIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPEJ1ZmZlcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5leHBvcnRBZGFwdGVyLmV4cG9ydEFzWmlwKGxhbmcsIHtcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLl9jb25maWcubW9kZWwuZ2V0VGFibGVOYW1lKCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgY29sdW1uczogaGVhZGVycyxcbiAgICAgICAgICAgIGRhdGE6IGRhdGFcbiAgICAgICAgfSwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0KCkge1xuICAgICAgICB0aGlzLl9jb25maWcgPSB0aGlzLmRhdGFGaWx0ZXJTY2FubmVyLmdldERhdGFGaWx0ZXIodGhpcy5kYXRhRGVmKTtcbiAgICAgICAgdGhpcy5fZGVmaW5pdGlvbnMgPSB0aGlzLmRhdGFGaWx0ZXJTY2FubmVyLmdldEF0dHJpYnV0ZXModGhpcy5kYXRhRGVmKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkU2VhcmNoQ29uZGl0aW9uKHNlYXJjaDogc3RyaW5nLCBvcHRpb25zOiBGaW5kT3B0aW9ucywgbGFuZ3VhZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsKTogdm9pZCB7XG4gICAgICAgIGlmICghc2VhcmNoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzZWFyY2hJbmNsdWRlID0gdGhpcy5nZW5lcmF0ZVNlYXJjaEluY2x1ZGUoe30pO1xuICAgICAgICBvcHRpb25zLmluY2x1ZGUgPSBTZXF1ZWxpemVVdGlscy5tZXJnZUluY2x1ZGVzKFxuICAgICAgICAgICAgb3B0aW9ucy5pbmNsdWRlIGFzIEluY2x1ZGVPcHRpb25zIHwgSW5jbHVkZU9wdGlvbnNbXSxcbiAgICAgICAgICAgIHNlYXJjaEluY2x1ZGUgYXMgSW5jbHVkZU9wdGlvbnNbXVxuICAgICAgICApO1xuXG4gICAgICAgIGlmICghb3B0aW9ucy53aGVyZSkge1xuICAgICAgICAgICAgb3B0aW9ucy53aGVyZSA9IHsgW09wLmFuZF06IFtdIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zLndoZXJlID0geyBbT3AuYW5kXTogW29wdGlvbnMud2hlcmVdIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB3aGVyZSA9IG9wdGlvbnMud2hlcmU7XG4gICAgICAgIGNvbnN0IGdlbmVyYXRlRmllbGRzT2JqZWN0ID0gKHNlYXJjaFZhbHVlOiBzdHJpbmcpID0+XG4gICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgLi4udGhpcy5nZXRTZWFyY2hBdHRyaWJ1dGVzKCksIFxuICAgICAgICAgICAgICAgIC4uLnRoaXMuZ2V0U2VhcmNoVHJhbnNsYXRpb25BdHRyaWJ1dGVzKClcbiAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAubWFwKGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYS5pc0pzb24gJiYgIWEuaXNUcmFuc2xhdGlvbkF0dHJpYnV0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmllbGQgPSBhLmxpdGVyYWxLZXkgPz8gYFxcYCR7dGhpcy5tb2RlbC5uYW1lfVxcYC5cXGAke2Eua2V5fVxcYGA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgICAgICogbGl0ZXJhbCBmdW5jdGlvbiBpcyBub3Qgd29ya2luZyBvZiBzb21lIHJlYXNvbi4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICogVGhpcyBpcyB0aGUgZXF1aXZhbGVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMubW9kZWwuc2VxdWVsaXplPy5lc2NhcGUoYCUke3NlYXJjaFZhbHVlLnRvVXBwZXJDYXNlKCl9JWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVdGlscy5MaXRlcmFsKGBVUFBFUihKU09OX0VYVFJBQ1QoJHtmaWVsZH0sICckJykpIExJS0UgJHt2YWx1ZX1gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhLmlzSnNvbiAmJiBhLmlzVHJhbnNsYXRpb25BdHRyaWJ1dGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gYS5saXRlcmFsS2V5ID8/IGBcXGAke3RoaXMubW9kZWwubmFtZX1cXGAuXFxgJHthLm5hbWV9XFxgYDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5tb2RlbC5zZXF1ZWxpemU/LmVzY2FwZShgJSR7c2VhcmNoVmFsdWUudG9VcHBlckNhc2UoKX0lYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFV0aWxzLkxpdGVyYWwoYFVQUEVSKEpTT05fVU5RVU9URShKU09OX0VYVFJBQ1QoJHtmaWVsZH0sICckLiR7bGFuZ3VhZ2V9JykpKSBMSUtFICR7dmFsdWV9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgW2Eua2V5XToge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtPcC5saWtlXTogYCUke3NlYXJjaFZhbHVlfSVgXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSkuZmlsdGVyKHggPT4gISF4KTtcblxuICAgICAgICBjb25zdCB0b2tlbnMgPSBzZWFyY2guc3BsaXQoXCIgXCIpO1xuICAgICAgICAod2hlcmUgYXMgYW55KVtPcC5hbmRdLnB1c2goXG4gICAgICAgICAgICB0b2tlbnMubWFwKHQgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIFtPcC5vcl06IGdlbmVyYXRlRmllbGRzT2JqZWN0KHQpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRFeHBvcnRzSGVhZGVyKGxhbmc6IHN0cmluZywgaGVhZGVyczogc3RyaW5nW10sIHRyYW5zbGF0ZVNlcnZpY2UgPSB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChoZWFkZXJzLm1hcCh4ID0+IHRyYW5zbGF0ZVNlcnZpY2UuZ2V0VHJhbnNsYXRpb24obGFuZywgYGV4cG9ydHMuJHt4fWApKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRFeHBvcnREYXRhKGRhdGE6IERhdGFbXSk6IG9iamVjdFtdIHtcbiAgICAgICAgcmV0dXJuIGRhdGEubWFwKHggPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLl9jb25maWcuZXhwb3J0Q29sdW1ucyA/PyBbXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IFt2YWx1ZSwgcHJvcF0gPSB0aGlzLmdldEV4cG9ydFZhbHVlKHgsIGtleSk7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2Ake2krK306JHtwcm9wfWBdID0gdmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEV4cG9ydFZhbHVlKGRhdGE6IERhdGEsIHBhdGg6IHN0cmluZyk6IFt1bmtub3duLCBzdHJpbmddIHtcbiAgICAgICAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoXCIuXCIpO1xuICAgICAgICBpZiAoa2V5cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGtleXMucG9wKCk7XG4gICAgICAgICAgICByZXR1cm4gWyhkYXRhIGFzIGFueSlba2V5IGFzIHN0cmluZ10sIGtleSBhcyBzdHJpbmddO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGtleSA9IFwiXCI7XG4gICAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCkge1xuICAgICAgICAgICAga2V5ID0ga2V5cy5zaGlmdCgpIGFzIHN0cmluZztcbiAgICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgZGF0YSA9IChkYXRhIGFzIGFueSlba2V5IGFzIGFueV0gYXMgYW55O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtkYXRhLCBrZXldO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgbWVyZ2VBY2Nlc3NDb250cm9sQ29uZGl0aW9uKHdoZXJlOiBXaGVyZU9wdGlvbnMgfCB1bmRlZmluZWQsIHVzZXI6IERhdGFGaWx0ZXJVc2VyTW9kZWwpOiBQcm9taXNlPFdoZXJlT3B0aW9ucyB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBjb25zdCByZXNvdXJjZXMgPSBhd2FpdCB0aGlzLmFjY2Vzc0NvbnRyb2xBZGFwdGVyLmdldFJlc291cmNlcyh0aGlzLl9jb25maWcubW9kZWwgYXMgYW55LCB1c2VyKTtcbiAgICAgICAgaWYgKHJlc291cmNlcy5pZHMpIHtcbiAgICAgICAgICAgIHJldHVybiBTZXF1ZWxpemVVdGlscy5tZXJnZVdoZXJlKHsgaWQ6IHJlc291cmNlcy5pZHMgfSwgd2hlcmUpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc291cmNlcy53aGVyZSkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBbT3AuYW5kXTogW1xuICAgICAgICAgICAgICAgICAgICB3aGVyZSxcbiAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLndoZXJlXG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgfSBhcyBXaGVyZU9wdGlvbnM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gd2hlcmU7XG4gICAgfVxufVxuIl19
|
|
@@ -11,6 +11,7 @@ export * from "./paranoid.decorator";
|
|
|
11
11
|
export * from "./path.decorator";
|
|
12
12
|
export * from "./required.decorator";
|
|
13
13
|
export * from "./seachable-attributes.decorator";
|
|
14
|
+
export * from "./searchable-translation-attributes.decorator";
|
|
14
15
|
export * from "./separate.decorator";
|
|
15
16
|
export * from "./sum.decorator";
|
|
16
17
|
export * from "./where.decorator";
|
package/lib/decorators/index.js
CHANGED
|
@@ -27,8 +27,9 @@ __exportStar(require("./paranoid.decorator"), exports);
|
|
|
27
27
|
__exportStar(require("./path.decorator"), exports);
|
|
28
28
|
__exportStar(require("./required.decorator"), exports);
|
|
29
29
|
__exportStar(require("./seachable-attributes.decorator"), exports);
|
|
30
|
+
__exportStar(require("./searchable-translation-attributes.decorator"), exports);
|
|
30
31
|
__exportStar(require("./separate.decorator"), exports);
|
|
31
32
|
__exportStar(require("./sum.decorator"), exports);
|
|
32
33
|
__exportStar(require("./where.decorator"), exports);
|
|
33
34
|
|
|
34
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
35
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2xpYi9kZWNvcmF0b3JzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5REFBdUM7QUFDdkMsb0RBQWtDO0FBQ2xDLG1EQUFpQztBQUNqQyx1REFBcUM7QUFDckMscURBQW1DO0FBQ25DLCtEQUE2QztBQUM3QyxzREFBb0M7QUFDcEMsb0RBQWtDO0FBQ2xDLG9EQUFrQztBQUNsQyx1REFBcUM7QUFDckMsbURBQWlDO0FBQ2pDLHVEQUFxQztBQUNyQyxtRUFBaUQ7QUFDakQsZ0ZBQThEO0FBQzlELHVEQUFxQztBQUNyQyxrREFBZ0M7QUFDaEMsb0RBQWtDIiwiZmlsZSI6ImxpYi9kZWNvcmF0b3JzL2luZGV4LmpzIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vYXR0cmlidXRlcy5kZWNvcmF0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2NvdW50LmRlY29yYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGF0YS5kZWNvcmF0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2Rpc3RhbmNlLmRlY29yYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXhwb3J0LmRlY29yYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaWdub3JlLWluLXNlYXJjaC5kZWNvcmF0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2luY2x1ZGUuZGVjb3JhdG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9saW1pdC5kZWNvcmF0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL29yZGVyLmRlY29yYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcGFyYW5vaWQuZGVjb3JhdG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9wYXRoLmRlY29yYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vcmVxdWlyZWQuZGVjb3JhdG9yXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9zZWFjaGFibGUtYXR0cmlidXRlcy5kZWNvcmF0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NlYXJjaGFibGUtdHJhbnNsYXRpb24tYXR0cmlidXRlcy5kZWNvcmF0b3JcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NlcGFyYXRlLmRlY29yYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3VtLmRlY29yYXRvclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vd2hlcmUuZGVjb3JhdG9yXCI7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function SearchableTranslationAttributes(attributes: string[]): PropertyDecorator & ClassDecorator;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SearchableTranslationAttributes = void 0;
|
|
4
|
+
const attributes_handler_1 = require("../handlers/attributes.handler");
|
|
5
|
+
const data_filter_handler_1 = require("../handlers/data-filter.handler");
|
|
6
|
+
function SearchableTranslationAttributes(attributes) {
|
|
7
|
+
return (target, propertyKey) => {
|
|
8
|
+
defineSearchableTranslationAttributesMetadata(target, propertyKey, attributes);
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
exports.SearchableTranslationAttributes = SearchableTranslationAttributes;
|
|
12
|
+
function defineSearchableTranslationAttributesMetadata(target, propertyKey, attributes) {
|
|
13
|
+
if (!propertyKey) {
|
|
14
|
+
const dataFilter = data_filter_handler_1.DataFilterHandler.getDataFilter(target);
|
|
15
|
+
dataFilter.setSearchableTranslationAttributes(attributes);
|
|
16
|
+
data_filter_handler_1.DataFilterHandler.saveDataFilter(target, dataFilter);
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
const attribute = attributes_handler_1.AttributesHandler.getAttribute(target, propertyKey);
|
|
20
|
+
attribute.setSearchableTranslationAttributes(attributes);
|
|
21
|
+
attributes_handler_1.AttributesHandler.saveAttribute(target, attribute);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2xpYi9kZWNvcmF0b3JzL3NlYXJjaGFibGUtdHJhbnNsYXRpb24tYXR0cmlidXRlcy5kZWNvcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUVBQW1FO0FBQ25FLHlFQUFvRTtBQUVwRSxTQUFnQiwrQkFBK0IsQ0FBQyxVQUFvQjtJQUNoRSxPQUFPLENBQUMsTUFBYyxFQUFFLFdBQTZCLEVBQUUsRUFBRTtRQUNyRCw2Q0FBNkMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ25GLENBQUMsQ0FBQztBQUNOLENBQUM7QUFKRCwwRUFJQztBQUVELFNBQVMsNkNBQTZDLENBQUMsTUFBYyxFQUFFLFdBQXdDLEVBQUUsVUFBb0I7SUFDakksSUFBSSxDQUFDLFdBQVcsRUFBRTtRQUNkLE1BQU0sVUFBVSxHQUFHLHVDQUFpQixDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMzRCxVQUFVLENBQUMsa0NBQWtDLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUQsdUNBQWlCLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNyRCxPQUFPO0tBQ1Y7SUFFRCxNQUFNLFNBQVMsR0FBRyxzQ0FBaUIsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3RFLFNBQVMsQ0FBQyxrQ0FBa0MsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN6RCxzQ0FBaUIsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZELENBQUMiLCJmaWxlIjoibGliL2RlY29yYXRvcnMvc2VhcmNoYWJsZS10cmFuc2xhdGlvbi1hdHRyaWJ1dGVzLmRlY29yYXRvci5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEF0dHJpYnV0ZXNIYW5kbGVyIH0gZnJvbSBcIi4uL2hhbmRsZXJzL2F0dHJpYnV0ZXMuaGFuZGxlclwiO1xuaW1wb3J0IHsgRGF0YUZpbHRlckhhbmRsZXIgfSBmcm9tIFwiLi4vaGFuZGxlcnMvZGF0YS1maWx0ZXIuaGFuZGxlclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gU2VhcmNoYWJsZVRyYW5zbGF0aW9uQXR0cmlidXRlcyhhdHRyaWJ1dGVzOiBzdHJpbmdbXSk6IFByb3BlcnR5RGVjb3JhdG9yICYgQ2xhc3NEZWNvcmF0b3Ige1xuICAgIHJldHVybiAodGFyZ2V0OiBPYmplY3QsIHByb3BlcnR5S2V5Pzogc3RyaW5nIHwgc3ltYm9sKSA9PiB7XG4gICAgICAgIGRlZmluZVNlYXJjaGFibGVUcmFuc2xhdGlvbkF0dHJpYnV0ZXNNZXRhZGF0YSh0YXJnZXQsIHByb3BlcnR5S2V5LCBhdHRyaWJ1dGVzKTtcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBkZWZpbmVTZWFyY2hhYmxlVHJhbnNsYXRpb25BdHRyaWJ1dGVzTWV0YWRhdGEodGFyZ2V0OiBPYmplY3QsIHByb3BlcnR5S2V5OiBzdHJpbmcgfCBzeW1ib2wgfCB1bmRlZmluZWQsIGF0dHJpYnV0ZXM6IHN0cmluZ1tdKSB7XG4gICAgaWYgKCFwcm9wZXJ0eUtleSkge1xuICAgICAgICBjb25zdCBkYXRhRmlsdGVyID0gRGF0YUZpbHRlckhhbmRsZXIuZ2V0RGF0YUZpbHRlcih0YXJnZXQpO1xuICAgICAgICBkYXRhRmlsdGVyLnNldFNlYXJjaGFibGVUcmFuc2xhdGlvbkF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7XG4gICAgICAgIERhdGFGaWx0ZXJIYW5kbGVyLnNhdmVEYXRhRmlsdGVyKHRhcmdldCwgZGF0YUZpbHRlcik7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhdHRyaWJ1dGUgPSBBdHRyaWJ1dGVzSGFuZGxlci5nZXRBdHRyaWJ1dGUodGFyZ2V0LCBwcm9wZXJ0eUtleSk7XG4gICAgYXR0cmlidXRlLnNldFNlYXJjaGFibGVUcmFuc2xhdGlvbkF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7XG4gICAgQXR0cmlidXRlc0hhbmRsZXIuc2F2ZUF0dHJpYnV0ZSh0YXJnZXQsIGF0dHJpYnV0ZSk7XG59XG4iXX0=
|
|
@@ -10,12 +10,12 @@ export declare abstract class DynamicFilterController<Data> {
|
|
|
10
10
|
private readonly userUserDeserializer;
|
|
11
11
|
private readonly option;
|
|
12
12
|
protected constructor(filterService: FilterService<Data>);
|
|
13
|
-
filter(query: FilterQueryModel,
|
|
14
|
-
filterCount(query: FilterQueryModel,
|
|
15
|
-
downloadData(query: FilterQueryModel, type: ExportTypes,
|
|
16
|
-
getFilterConfig(
|
|
17
|
-
searchFilterResourceValue(search: FilterResourceValueModel,
|
|
18
|
-
searchFilterConfigValues(search: FilterConfigurationSearchModel,
|
|
19
|
-
protected getUser(
|
|
20
|
-
protected abstract transformQuery(query: FilterQueryModel,
|
|
13
|
+
filter(query: FilterQueryModel, request: any): Promise<FilterResultModel<Data>>;
|
|
14
|
+
filterCount(query: FilterQueryModel, request: any): Promise<number>;
|
|
15
|
+
downloadData(query: FilterQueryModel, type: ExportTypes, request: any): Promise<Buffer | string>;
|
|
16
|
+
getFilterConfig(request: any): Promise<FilterConfigurationModel[]>;
|
|
17
|
+
searchFilterResourceValue(search: FilterResourceValueModel, request: any): Promise<SelectFilterValue | null>;
|
|
18
|
+
searchFilterConfigValues(search: FilterConfigurationSearchModel, request: any): Promise<SelectFilterValue[]>;
|
|
19
|
+
protected getUser(request: any): Promise<DataFilterUserModel | null>;
|
|
20
|
+
protected abstract transformQuery(query: FilterQueryModel, request: any): FilterQueryModel;
|
|
21
21
|
}
|
|
@@ -23,38 +23,38 @@ class DynamicFilterController {
|
|
|
23
23
|
constructor(filterService) {
|
|
24
24
|
this.filterService = filterService;
|
|
25
25
|
}
|
|
26
|
-
async filter(query,
|
|
27
|
-
query = this.transformQuery(query,
|
|
28
|
-
const user = await this.getUser(
|
|
29
|
-
return
|
|
26
|
+
async filter(query, request) {
|
|
27
|
+
query = this.transformQuery(query, request);
|
|
28
|
+
const user = await this.getUser(request);
|
|
29
|
+
return this.filterService.filter({ options: query, request, user });
|
|
30
30
|
}
|
|
31
|
-
async filterCount(query,
|
|
32
|
-
query = this.transformQuery(query,
|
|
33
|
-
const user = await this.getUser(
|
|
34
|
-
return
|
|
31
|
+
async filterCount(query, request) {
|
|
32
|
+
query = this.transformQuery(query, request);
|
|
33
|
+
const user = await this.getUser(request);
|
|
34
|
+
return this.filterService.count({ options: query, user });
|
|
35
35
|
}
|
|
36
|
-
async downloadData(query, type,
|
|
37
|
-
query = this.transformQuery(query,
|
|
38
|
-
const user = await this.getUser(
|
|
39
|
-
return await this.filterService.downloadData(
|
|
36
|
+
async downloadData(query, type, request) {
|
|
37
|
+
query = this.transformQuery(query, request);
|
|
38
|
+
const user = await this.getUser(request);
|
|
39
|
+
return await this.filterService.downloadData({ options: query, request, type, user });
|
|
40
40
|
}
|
|
41
|
-
async getFilterConfig(
|
|
41
|
+
async getFilterConfig(request) {
|
|
42
42
|
var _a;
|
|
43
|
-
return await this.filterService.getConfig(
|
|
43
|
+
return await this.filterService.getConfig(request, (_a = await this.getUser(request)) !== null && _a !== void 0 ? _a : {});
|
|
44
44
|
}
|
|
45
|
-
async searchFilterResourceValue(search,
|
|
45
|
+
async searchFilterResourceValue(search, request) {
|
|
46
46
|
var _a;
|
|
47
|
-
return await this.filterService.findResourceValueById(
|
|
47
|
+
return await this.filterService.findResourceValueById(request, search, (_a = await this.getUser(request)) !== null && _a !== void 0 ? _a : {});
|
|
48
48
|
}
|
|
49
|
-
async searchFilterConfigValues(search,
|
|
49
|
+
async searchFilterConfigValues(search, request) {
|
|
50
50
|
var _a;
|
|
51
|
-
return await this.filterService.searchConfigValues(
|
|
51
|
+
return await this.filterService.searchConfigValues(request, search, (_a = await this.getUser(request)) !== null && _a !== void 0 ? _a : {});
|
|
52
52
|
}
|
|
53
|
-
async getUser(
|
|
53
|
+
async getUser(request) {
|
|
54
54
|
if (!this.userUserDeserializer || this.option.disableAccessControl) {
|
|
55
55
|
return null;
|
|
56
56
|
}
|
|
57
|
-
return this.userUserDeserializer.deserializeUser(
|
|
57
|
+
return this.userUserDeserializer.deserializeUser(request);
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
60
|
exports.DynamicFilterController = DynamicFilterController;
|
|
@@ -121,4 +121,4 @@ __decorate([
|
|
|
121
121
|
__metadata("design:returntype", Promise)
|
|
122
122
|
], DynamicFilterController.prototype, "searchFilterConfigValues", null);
|
|
123
123
|
|
|
124
|
-
//# sourceMappingURL=data:application/json;charset=utf8;base64,
|
|
124
|
+
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2xpYi9maWx0ZXIvY29udHJvbGxlcnMvZHluYW1pYy1maWx0ZXIuY29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0Fhd0I7QUFDeEIsNkJBQTRGO0FBQzVGLDZDQUErQztBQUMvQyx1REFBdUQ7QUFJdkQscUVBQWdFO0FBQ2hFLG1HQUE2RjtBQUs3RixNQUFzQix1QkFBdUI7SUFRekMsWUFBeUMsYUFBa0M7UUFBbEMsa0JBQWEsR0FBYixhQUFhLENBQXFCO0lBQUcsQ0FBQztJQUt4RSxBQUFNLEtBQUQsQ0FBQyxNQUFNLENBQVMsS0FBdUIsRUFBUyxPQUFZO1FBQ3BFLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1QyxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUlNLEFBQU0sS0FBRCxDQUFDLFdBQVcsQ0FBUyxLQUF1QixFQUFTLE9BQVk7UUFDekUsS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzVDLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN6QyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFLTSxBQUFNLEtBQUQsQ0FBQyxZQUFZLENBQ2IsS0FBdUIsRUFDaEIsSUFBaUIsRUFDekIsT0FBWTtRQUVuQixLQUFLLEdBQUcsSUFBSSxDQUFDLGNB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QSxJQUFBLFlBQUcsR0FBRSxDQUFBOzs7O3dFQUdUO0FBR1k7SUFEWixJQUFBLFlBQUcsRUFBQyxxQkFBcUIsQ0FBQztJQUV0QixXQUFBLElBQUEsY0FBSyxHQUFFLENBQUE7SUFDUCxXQUFBLElBQUEsWUFBRyxHQUFFLENBQUE7Ozs7dUVBR1QiLCJmaWxlIjoibGliL2ZpbHRlci9jb250cm9sbGVycy9keW5hbWljLWZpbHRlci5jb250cm9sbGVyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBCb2R5LFxuICAgIEdldCxcbiAgICBIdHRwQ29kZSxcbiAgICBIdHRwU3RhdHVzLFxuICAgIEluamVjdCxcbiAgICBPcHRpb25hbCxcbiAgICBQYXJhbSxcbiAgICBQb3N0LFxuICAgIFF1ZXJ5LFxuICAgIFJlcSxcbiAgICBVc2VHdWFyZHMsXG4gICAgVXNlSW50ZXJjZXB0b3JzXG59IGZyb20gXCJAbmVzdGpzL2NvbW1vblwiO1xuaW1wb3J0IHsgRXhwb3J0VHlwZXMsIEZpbHRlclF1ZXJ5TW9kZWwsIEZpbHRlclJlc3VsdE1vZGVsLCBTZWxlY3RGaWx0ZXJWYWx1ZSB9IGZyb20gXCIuLi8uLlwiO1xuaW1wb3J0IHsgRklMVEVSX09QVElPTiB9IGZyb20gXCIuLi8uLi9jb25zdGFudFwiO1xuaW1wb3J0IHsgVXNlckRlc2VyaWFsaXplciB9IGZyb20gXCIuLi8uLi9kZXNlcmlhbGl6ZXJzXCI7XG5pbXBvcnQgeyBEYXRhRmlsdGVyVXNlck1vZGVsIH0gZnJvbSBcIi4uLy4uL21vZGVscy91c2VyLm1vZGVsXCI7XG5pbXBvcnQgeyBGaWx0ZXJPcHRpb25Db25maWcgfSBmcm9tIFwiLi4vZmlsdGVyLmNvbmZpZ1wiO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gXCIuLi9maWx0ZXIuc2VydmljZVwiO1xuaW1wb3J0IHsgRmlsdGVyUXVlcnlHdWFyZCB9IGZyb20gXCIuLi9ndWFyZHMvZmlsdGVyLXF1ZXJ5Lmd1YXJkXCI7XG5pbXBvcnQgeyBEYXRhRmlsZURvd25sb2FkSW50ZXJjZXB0b3IgfSBmcm9tIFwiLi4vaW50ZXJjZXB0b3JzL2RhdGEtZmlsZS1kb3dubG9hZC5pbnRlcmNlcHRvclwiO1xuaW1wb3J0IHsgRmlsdGVyQ29uZmlndXJhdGlvblNlYXJjaE1vZGVsIH0gZnJvbSBcIi4uL21vZGVscy9maWx0ZXItY29uZmlndXJhdGlvbi1zZWFyY2gubW9kZWxcIjtcbmltcG9ydCB7IEZpbHRlckNvbmZpZ3VyYXRpb25Nb2RlbCB9IGZyb20gXCIuLi9tb2RlbHMvZmlsdGVyLWNvbmZpZ3VyYXRpb24ubW9kZWxcIjtcbmltcG9ydCB7IEZpbHRlclJlc291cmNlVmFsdWVNb2RlbCB9IGZyb20gXCIuLi9tb2RlbHMvZmlsdGVyLXJlc291cmNlLXZhbHVlLm1vZGVsXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEeW5hbWljRmlsdGVyQ29udHJvbGxlcjxEYXRhPiB7XG4gICAgQEluamVjdCgpXG4gICAgQE9wdGlvbmFsKClcbiAgICBwcml2YXRlIHJlYWRvbmx5IHVzZXJVc2VyRGVzZXJpYWxpemVyITogVXNlckRlc2VyaWFsaXplcjxEYXRhRmlsdGVyVXNlck1vZGVsPjtcblxuICAgIEBJbmplY3QoRklMVEVSX09QVElPTilcbiAgICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbiE6IEZpbHRlck9wdGlvbkNvbmZpZztcblxuICAgIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgcmVhZG9ubHkgZmlsdGVyU2VydmljZTogRmlsdGVyU2VydmljZTxEYXRhPikge31cblxuICAgIEBQb3N0KFwiZmlsdGVyXCIpXG4gICAgQEh0dHBDb2RlKEh0dHBTdGF0dXMuT0spXG4gICAgQFVzZUd1YXJkcyhGaWx0ZXJRdWVyeUd1YXJkKVxuICAgIHB1YmxpYyBhc3luYyBmaWx0ZXIoQEJvZHkoKSBxdWVyeTogRmlsdGVyUXVlcnlNb2RlbCwgQFJlcSgpIHJlcXVlc3Q6IGFueSk6IFByb21pc2U8RmlsdGVyUmVzdWx0TW9kZWw8RGF0YT4+IHtcbiAgICAgICAgcXVlcnkgPSB0aGlzLnRyYW5zZm9ybVF1ZXJ5KHF1ZXJ5LCByZXF1ZXN0KTtcbiAgICAgICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuZ2V0VXNlcihyZXF1ZXN0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyU2VydmljZS5maWx0ZXIoeyBvcHRpb25zOiBxdWVyeSwgcmVxdWVzdCwgdXNlciB9KTtcbiAgICB9XG5cbiAgICBAUG9zdChcImZpbHRlci1jb3VudFwiKVxuICAgIEBIdHRwQ29kZShIdHRwU3RhdHVzLk9LKVxuICAgIHB1YmxpYyBhc3luYyBmaWx0ZXJDb3VudChAQm9keSgpIHF1ZXJ5OiBGaWx0ZXJRdWVyeU1vZGVsLCBAUmVxKCkgcmVxdWVzdDogYW55KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICAgICAgcXVlcnkgPSB0aGlzLnRyYW5zZm9ybVF1ZXJ5KHF1ZXJ5LCByZXF1ZXN0KTtcbiAgICAgICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuZ2V0VXNlcihyZXF1ZXN0KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyU2VydmljZS5jb3VudCh7IG9wdGlvbnM6IHF1ZXJ5LCB1c2VyIH0pO1xuICAgIH1cblxuICAgIEBQb3N0KFwiZG93bmxvYWQvOnR5cGVcIilcbiAgICBASHR0cENvZGUoSHR0cFN0YXR1cy5PSylcbiAgICBAVXNlSW50ZXJjZXB0b3JzKERhdGFGaWxlRG93bmxvYWRJbnRlcmNlcHRvcilcbiAgICBwdWJsaWMgYXN5bmMgZG93bmxvYWREYXRhKFxuICAgICAgICBAQm9keSgpIHF1ZXJ5OiBGaWx0ZXJRdWVyeU1vZGVsLFxuICAgICAgICBAUGFyYW0oXCJ0eXBlXCIpIHR5cGU6IEV4cG9ydFR5cGVzLFxuICAgICAgICBAUmVxKCkgcmVxdWVzdDogYW55XG4gICAgKTogUHJvbWlzZTxCdWZmZXIgfCBzdHJpbmc+IHtcbiAgICAgICAgcXVlcnkgPSB0aGlzLnRyYW5zZm9ybVF1ZXJ5KHF1ZXJ5LCByZXF1ZXN0KTtcbiAgICAgICAgY29uc3QgdXNlciA9IGF3YWl0IHRoaXMuZ2V0VXNlcihyZXF1ZXN0KTtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmlsdGVyU2VydmljZS5kb3dubG9hZERhdGEoeyBvcHRpb25zOiBxdWVyeSwgcmVxdWVzdCwgdHlwZSwgdXNlciB9KTtcbiAgICB9XG5cbiAgICBAR2V0KFwiZmlsdGVyL2NvbmZpZ1wiKVxuICAgIHB1YmxpYyBhc3luYyBnZXRGaWx0ZXJDb25maWcoQFJlcSgpIHJlcXVlc3Q6IGFueSk6IFByb21pc2U8RmlsdGVyQ29uZmlndXJhdGlvbk1vZGVsW10+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmlsdGVyU2VydmljZS5nZXRDb25maWcocmVxdWVzdCwgYXdhaXQgdGhpcy5nZXRVc2VyKHJlcXVlc3QpID8/IHt9IGFzIERhdGFGaWx0ZXJVc2VyTW9kZWwpO1xuICAgIH1cblxuICAgIEBHZXQoXCJmaWx0ZXIvY29uZmlnL2lkXCIpXG4gICAgcHVibGljIGFzeW5jIHNlYXJjaEZpbHRlclJlc291cmNlVmFsdWUoXG4gICAgICAgIEBRdWVyeSgpIHNlYXJjaDogRmlsdGVyUmVzb3VyY2VWYWx1ZU1vZGVsLFxuICAgICAgICBAUmVxKCkgcmVxdWVzdDogYW55XG4gICAgKTogUHJvbWlzZTxTZWxlY3RGaWx0ZXJWYWx1ZSB8IG51bGw+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmlsdGVyU2VydmljZS5maW5kUmVzb3VyY2VWYWx1ZUJ5SWQocmVxdWVzdCwgc2VhcmNoLCBhd2FpdCB0aGlzLmdldFVzZXIocmVxdWVzdCkgPz8ge30gYXMgRGF0YUZpbHRlclVzZXJNb2RlbCk7XG4gICAgfVxuXG4gICAgQEdldChcImZpbHRlci9jb25maWcvdmFsdWVcIilcbiAgICBwdWJsaWMgYXN5bmMgc2VhcmNoRmlsdGVyQ29uZmlnVmFsdWVzKFxuICAgICAgICBAUXVlcnkoKSBzZWFyY2g6IEZpbHRlckNvbmZpZ3VyYXRpb25TZWFyY2hNb2RlbCxcbiAgICAgICAgQFJlcSgpIHJlcXVlc3Q6IGFueVxuICAgICk6IFByb21pc2U8U2VsZWN0RmlsdGVyVmFsdWVbXT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5maWx0ZXJTZXJ2aWNlLnNlYXJjaENvbmZpZ1ZhbHVlcyhyZXF1ZXN0LCBzZWFyY2gsIGF3YWl0IHRoaXMuZ2V0VXNlcihyZXF1ZXN0KSA/PyB7fSBhcyBEYXRhRmlsdGVyVXNlck1vZGVsKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2V0VXNlcihyZXF1ZXN0OiBhbnkpOiBQcm9taXNlPERhdGFGaWx0ZXJVc2VyTW9kZWwgfCBudWxsPiB7XG4gICAgICAgIGlmICghdGhpcy51c2VyVXNlckRlc2VyaWFsaXplciB8fCB0aGlzLm9wdGlvbi5kaXNhYmxlQWNjZXNzQ29udHJvbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy51c2VyVXNlckRlc2VyaWFsaXplci5kZXNlcmlhbGl6ZVVzZXIocmVxdWVzdCk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFic3RyYWN0IHRyYW5zZm9ybVF1ZXJ5KHF1ZXJ5OiBGaWx0ZXJRdWVyeU1vZGVsLCByZXF1ZXN0OiBhbnkpOiBGaWx0ZXJRdWVyeU1vZGVsO1xufVxuIl19
|
|
@@ -10,11 +10,11 @@ export declare class FilterController<Data> {
|
|
|
10
10
|
private readonly userUserDeserializer;
|
|
11
11
|
private readonly option;
|
|
12
12
|
constructor(filterService: FilterService<Data>);
|
|
13
|
-
filter(query: FilterQueryModel,
|
|
14
|
-
filterCount(query: FilterQueryModel,
|
|
15
|
-
downloadData(query: FilterQueryModel, type: ExportTypes,
|
|
16
|
-
getFilterConfig(
|
|
17
|
-
searchFilterResourceValue(search: FilterResourceValueModel,
|
|
18
|
-
searchFilterConfigValues(search: FilterConfigurationSearchModel,
|
|
19
|
-
protected getUser(
|
|
13
|
+
filter(query: FilterQueryModel, request: any): Promise<FilterResultModel<Data>>;
|
|
14
|
+
filterCount(query: FilterQueryModel, request: any): Promise<number>;
|
|
15
|
+
downloadData(query: FilterQueryModel, type: ExportTypes, request: any): Promise<Buffer | string>;
|
|
16
|
+
getFilterConfig(request: any): Promise<FilterConfigurationModel[]>;
|
|
17
|
+
searchFilterResourceValue(search: FilterResourceValueModel, request: any): Promise<SelectFilterValue | null>;
|
|
18
|
+
searchFilterConfigValues(search: FilterConfigurationSearchModel, request: any): Promise<SelectFilterValue[]>;
|
|
19
|
+
protected getUser(request: any): Promise<DataFilterUserModel | null>;
|
|
20
20
|
}
|