@decaf-ts/decorator-validation 1.7.7 → 1.7.8
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/decorator-validation.cjs +629 -254
- package/dist/decorator-validation.esm.cjs +622 -255
- package/lib/constants/validation.cjs +3 -2
- package/lib/constants/validation.d.ts +1 -0
- package/lib/esm/constants/validation.d.ts +1 -0
- package/lib/esm/constants/validation.js +2 -1
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +1 -1
- package/lib/esm/mcp/ModelContextProtocol.d.ts +14 -22
- package/lib/esm/mcp/ModelContextProtocol.js +55 -51
- package/lib/esm/model/Model.d.ts +11 -8
- package/lib/esm/model/Model.js +12 -6
- package/lib/esm/model/decorators.js +1 -1
- package/lib/esm/model/types.d.ts +37 -9
- package/lib/esm/model/types.js +1 -1
- package/lib/esm/model/utils.d.ts +14 -1
- package/lib/esm/model/utils.js +15 -1
- package/lib/esm/model/validation.d.ts +107 -5
- package/lib/esm/model/validation.js +329 -124
- package/lib/esm/types/index.d.ts +1 -0
- package/lib/esm/types/index.js +2 -0
- package/lib/esm/types/validation.d.ts +25 -0
- package/lib/esm/types/validation.js +2 -0
- package/lib/esm/validation/Validators/AsyncValidator.d.ts +72 -0
- package/lib/esm/validation/Validators/AsyncValidator.js +61 -0
- package/lib/esm/validation/Validators/BaseValidator.d.ts +118 -0
- package/lib/esm/validation/Validators/BaseValidator.js +117 -0
- package/lib/esm/validation/Validators/ListValidator.js +2 -2
- package/lib/esm/validation/Validators/MinLengthValidator.d.ts +1 -1
- package/lib/esm/validation/Validators/MinLengthValidator.js +2 -2
- package/lib/esm/validation/Validators/TypeValidator.js +1 -1
- package/lib/esm/validation/Validators/Validator.d.ts +28 -68
- package/lib/esm/validation/Validators/Validator.js +30 -86
- package/lib/esm/validation/Validators/constants.d.ts +12 -11
- package/lib/esm/validation/Validators/constants.js +14 -12
- package/lib/esm/validation/Validators/index.d.ts +1 -0
- package/lib/esm/validation/Validators/index.js +2 -1
- package/lib/esm/validation/decorators.d.ts +2 -1
- package/lib/esm/validation/decorators.js +31 -8
- package/lib/esm/validation/types.d.ts +19 -0
- package/lib/esm/validation/types.js +1 -1
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/mcp/ModelContextProtocol.cjs +55 -51
- package/lib/mcp/ModelContextProtocol.d.ts +14 -22
- package/lib/model/Model.cjs +11 -5
- package/lib/model/Model.d.ts +11 -8
- package/lib/model/decorators.cjs +1 -1
- package/lib/model/types.cjs +1 -1
- package/lib/model/types.d.ts +37 -9
- package/lib/model/utils.cjs +16 -1
- package/lib/model/utils.d.ts +14 -1
- package/lib/model/validation.cjs +334 -125
- package/lib/model/validation.d.ts +107 -5
- package/lib/types/index.cjs +18 -0
- package/lib/types/index.d.ts +1 -0
- package/lib/types/validation.cjs +3 -0
- package/lib/types/validation.d.ts +25 -0
- package/lib/validation/Validators/AsyncValidator.cjs +65 -0
- package/lib/validation/Validators/AsyncValidator.d.ts +72 -0
- package/lib/validation/Validators/BaseValidator.cjs +121 -0
- package/lib/validation/Validators/BaseValidator.d.ts +118 -0
- package/lib/validation/Validators/ListValidator.cjs +2 -2
- package/lib/validation/Validators/MinLengthValidator.cjs +2 -2
- package/lib/validation/Validators/MinLengthValidator.d.ts +1 -1
- package/lib/validation/Validators/TypeValidator.cjs +1 -1
- package/lib/validation/Validators/Validator.cjs +30 -86
- package/lib/validation/Validators/Validator.d.ts +28 -68
- package/lib/validation/Validators/constants.cjs +14 -12
- package/lib/validation/Validators/constants.d.ts +12 -11
- package/lib/validation/Validators/index.cjs +2 -1
- package/lib/validation/Validators/index.d.ts +1 -0
- package/lib/validation/decorators.cjs +32 -8
- package/lib/validation/decorators.d.ts +2 -1
- package/lib/validation/types.cjs +1 -1
- package/lib/validation/types.d.ts +19 -0
- package/package.json +1 -1
|
@@ -1,149 +1,354 @@
|
|
|
1
1
|
import { ModelErrorDefinition } from "./ModelErrorDefinition.js";
|
|
2
|
-
import { Reflection, } from "@decaf-ts/reflection";
|
|
3
2
|
import { ModelKeys } from "./../utils/constants.js";
|
|
4
|
-
import { ReservedModels } from "./constants.js";
|
|
5
|
-
import { VALIDATION_PARENT_KEY } from "./../constants/index.js";
|
|
6
3
|
import { Model } from "./Model.js";
|
|
7
4
|
import { Validation } from "./../validation/Validation.js";
|
|
8
5
|
import { ValidationKeys } from "./../validation/Validators/constants.js";
|
|
9
6
|
import { PathProxyEngine } from "./../utils/PathProxy.js";
|
|
7
|
+
import { ASYNC_META_KEY, VALIDATION_PARENT_KEY } from "./../constants/index.js";
|
|
8
|
+
import { Reflection } from "@decaf-ts/reflection";
|
|
9
|
+
import { toConditionalPromise } from "./utils.js";
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
11
|
+
* Retrieves the validation metadata decorators associated with a specific property of a model,
|
|
12
|
+
* using the reflective metadata key.
|
|
12
13
|
*
|
|
13
|
-
* @
|
|
14
|
-
* @
|
|
15
|
-
* @
|
|
14
|
+
* @param model - The model instance or class containing the decorated property.
|
|
15
|
+
* @param {string} prop - The name of the property whose decorators should be retrieved.
|
|
16
|
+
* @param {string} reflectKey - The metadata key used to retrieve the decorators.
|
|
17
|
+
* Defaults to `ValidationKeys.REFLECT`.
|
|
16
18
|
*
|
|
19
|
+
* @returns The validation decorators applied to the property
|
|
20
|
+
*/
|
|
21
|
+
export function getValidationDecorators(model, prop, reflectKey = ValidationKeys.REFLECT) {
|
|
22
|
+
return Reflection.getPropertyDecorators(reflectKey, model, prop);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* @description
|
|
26
|
+
* Retrieves all validatable property decorators from a given model, excluding specified properties.
|
|
27
|
+
*
|
|
28
|
+
* @summary
|
|
29
|
+
* Iterates through the own enumerable properties of a model instance, filtering out any properties
|
|
30
|
+
* listed in the `propsToIgnore` array. For each remaining property, it checks whether validation
|
|
31
|
+
* decorators are present using `getValidationDecorators`, and if so, collects them in the result array.
|
|
32
|
+
*
|
|
33
|
+
* @template M - A generic parameter extending the `Model` class, representing the model type being inspected.
|
|
34
|
+
*
|
|
35
|
+
* @param {M} model - An instance of a class extending `Model` from which validatable properties will be extracted.
|
|
36
|
+
* @param {string[]} propsToIgnore - An array of property names that should be excluded from validation inspection.
|
|
37
|
+
*
|
|
38
|
+
* @return {ValidationPropertyDecoratorDefinition[]} An array of validation decorator definitions
|
|
39
|
+
* associated with the model's properties, excluding those listed in `propsToIgnore`.
|
|
40
|
+
*
|
|
41
|
+
* @function getValidatableProperties
|
|
42
|
+
*/
|
|
43
|
+
export function getValidatableProperties(model, propsToIgnore) {
|
|
44
|
+
const decoratedProperties = [];
|
|
45
|
+
for (const prop in model) {
|
|
46
|
+
if (Object.prototype.hasOwnProperty.call(model, prop) &&
|
|
47
|
+
!propsToIgnore.includes(prop)) {
|
|
48
|
+
const dec = getValidationDecorators(model, prop);
|
|
49
|
+
if (dec)
|
|
50
|
+
decoratedProperties.push(dec);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return decoratedProperties;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Safely sets temporary metadata on an object
|
|
57
|
+
*/
|
|
58
|
+
function setTemporaryContext(target, key, value) {
|
|
59
|
+
if (!Object.hasOwnProperty.call(target, key))
|
|
60
|
+
target[key] = value;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Safely removes temporary metadata from an object
|
|
64
|
+
*/
|
|
65
|
+
function cleanupTemporaryContext(target, key) {
|
|
66
|
+
if (Object.hasOwnProperty.call(target, key))
|
|
67
|
+
delete target[key];
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Executes validation with temporary context and returns the validation result
|
|
71
|
+
*
|
|
72
|
+
* @param nestedModel - The instance to validate
|
|
73
|
+
* @param parentModel - Reference to a parent object for nested validation
|
|
74
|
+
* @param isAsync - Whether to perform async validation
|
|
75
|
+
* @returns Validation result from hasErrors()
|
|
76
|
+
*/
|
|
77
|
+
function getNestedValidationErrors(nestedModel, parentModel, isAsync) {
|
|
78
|
+
// Set temporary context for nested models
|
|
79
|
+
if (parentModel) {
|
|
80
|
+
setTemporaryContext(nestedModel, VALIDATION_PARENT_KEY, parentModel);
|
|
81
|
+
}
|
|
82
|
+
setTemporaryContext(nestedModel, ASYNC_META_KEY, !!isAsync);
|
|
83
|
+
const errs = nestedModel.hasErrors();
|
|
84
|
+
cleanupTemporaryContext(nestedModel, VALIDATION_PARENT_KEY);
|
|
85
|
+
cleanupTemporaryContext(nestedModel, ASYNC_META_KEY);
|
|
86
|
+
return errs;
|
|
87
|
+
}
|
|
88
|
+
export function validateDecorator(model, value, decorator, async) {
|
|
89
|
+
const validator = Validation.get(decorator.key);
|
|
90
|
+
if (!validator) {
|
|
91
|
+
throw new Error(`Missing validator for ${decorator.key}`);
|
|
92
|
+
}
|
|
93
|
+
// skip async decorators if validateDecorators is called synchronously (async = false)
|
|
94
|
+
if (!async && decorator.props.async)
|
|
95
|
+
return undefined;
|
|
96
|
+
const decoratorProps = decorator.key === ModelKeys.TYPE
|
|
97
|
+
? [decorator.props]
|
|
98
|
+
: decorator.props || {};
|
|
99
|
+
const context = PathProxyEngine.create(model, {
|
|
100
|
+
ignoreUndefined: true,
|
|
101
|
+
ignoreNull: true,
|
|
102
|
+
});
|
|
103
|
+
const maybeAsyncErrors = validator.hasErrors(value, decoratorProps, context);
|
|
104
|
+
return toConditionalPromise(maybeAsyncErrors, async);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* @description
|
|
108
|
+
* Executes validation logic for a set of decorators applied to a model's property, handling both
|
|
109
|
+
* synchronous and asynchronous validations, including support for nested validations and lists.
|
|
110
|
+
*
|
|
111
|
+
* @summary
|
|
112
|
+
* Iterates over an array of decorator metadata objects and applies each validation rule to the
|
|
113
|
+
* provided value. For list decorators (`ValidationKeys.LIST`), it performs element-wise validation,
|
|
114
|
+
* supporting nested model validation and type checks. If the `async` flag is set, asynchronous
|
|
115
|
+
* validation is supported using `Promise.all`. The result is a record mapping validation keys to
|
|
116
|
+
* error messages, or `undefined` if no errors are found.
|
|
117
|
+
*
|
|
118
|
+
* @template M - A type parameter extending `Model`, representing the model type being validated.
|
|
119
|
+
* @template Async - A boolean indicating whether validation should be performed asynchronously.
|
|
120
|
+
*
|
|
121
|
+
* @param {M} model - The model instance that the validation is associated with.
|
|
122
|
+
* @param {any} value - The value to be validated against the provided decorators.
|
|
123
|
+
* @param {DecoratorMetadataAsync[]} decorators - An array of metadata objects representing validation decorators.
|
|
124
|
+
* @param {Async} [async] - Optional flag indicating whether validation should be performed asynchronously.
|
|
125
|
+
*
|
|
126
|
+
* @return {ConditionalAsync<Async, Record<string, string>> | undefined}
|
|
127
|
+
* Returns either a record of validation errors (keyed by the decorator key) or `undefined` if no errors are found.
|
|
128
|
+
* If `async` is true, the return value is a Promise resolving to the same structure.
|
|
129
|
+
*
|
|
130
|
+
* @function validateDecorators
|
|
131
|
+
*/
|
|
132
|
+
export function validateDecorators(model, value, decorators, async) {
|
|
133
|
+
const result = {};
|
|
134
|
+
for (const decorator of decorators) {
|
|
135
|
+
// skip async decorators if validateDecorators is called synchronously (async = false)
|
|
136
|
+
if (!async && decorator.props.async)
|
|
137
|
+
continue;
|
|
138
|
+
let validationErrors = validateDecorator(model, value, decorator, async);
|
|
139
|
+
/*
|
|
140
|
+
If the decorator is a list, each element must be checked.
|
|
141
|
+
When 'async' is true, the 'err' will always be a pending promise initially,
|
|
142
|
+
so the '!err' check will evaluate to false (even if the promise later resolves with no errors)
|
|
143
|
+
*/
|
|
144
|
+
if (decorator.key === ValidationKeys.LIST && (!validationErrors || async)) {
|
|
145
|
+
const values = value instanceof Set ? [...value] : value;
|
|
146
|
+
if (values && values.length > 0) {
|
|
147
|
+
const types = decorator.props.class ||
|
|
148
|
+
decorator.props.clazz ||
|
|
149
|
+
decorator.props.customTypes;
|
|
150
|
+
const allowedTypes = [types].flat().map((t) => String(t).toLowerCase());
|
|
151
|
+
// const reserved = Object.values(ReservedModels).map((v) => v.toLowerCase()) as string[];
|
|
152
|
+
const errs = values.map((childValue) => {
|
|
153
|
+
// if (Model.isModel(v) && !reserved.includes(v) {
|
|
154
|
+
if (Model.isModel(childValue)) {
|
|
155
|
+
return getNestedValidationErrors(childValue, model, async);
|
|
156
|
+
}
|
|
157
|
+
return allowedTypes.includes(typeof childValue)
|
|
158
|
+
? undefined
|
|
159
|
+
: "Value has no validatable type";
|
|
160
|
+
});
|
|
161
|
+
if (async) {
|
|
162
|
+
validationErrors = Promise.all(errs).then((result) => {
|
|
163
|
+
const allEmpty = result.every((r) => !r);
|
|
164
|
+
return allEmpty ? undefined : result;
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
else {
|
|
168
|
+
const allEmpty = errs.every((r) => !r);
|
|
169
|
+
validationErrors = errs.length > 0 && !allEmpty ? errs : undefined;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (validationErrors)
|
|
174
|
+
result[decorator.key] = validationErrors;
|
|
175
|
+
}
|
|
176
|
+
if (!async)
|
|
177
|
+
return Object.keys(result).length > 0
|
|
178
|
+
? result
|
|
179
|
+
: undefined;
|
|
180
|
+
const keys = Object.keys(result);
|
|
181
|
+
const promises = Object.values(result);
|
|
182
|
+
return Promise.all(promises).then((resolvedValues) => {
|
|
183
|
+
const res = {};
|
|
184
|
+
for (let i = 0; i < resolvedValues.length; i++) {
|
|
185
|
+
const val = resolvedValues[i];
|
|
186
|
+
if (val !== undefined) {
|
|
187
|
+
res[keys[i]] = val;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return Object.keys(res).length > 0 ? res : undefined;
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
17
194
|
* @function validate
|
|
195
|
+
* @template M
|
|
196
|
+
* @template Async
|
|
18
197
|
* @memberOf module:decorator-validation
|
|
19
198
|
* @category Model
|
|
199
|
+
*
|
|
200
|
+
* @description
|
|
201
|
+
* Validates the properties of a {@link Model} instance using registered decorators.
|
|
202
|
+
* Supports both synchronous and asynchronous validation flows, depending on the `async` flag.
|
|
203
|
+
*
|
|
204
|
+
* @summary
|
|
205
|
+
* This function inspects a given model object, identifies decorated properties that require validation,
|
|
206
|
+
* and applies the corresponding validation rules. It also supports nested model validation and gracefully
|
|
207
|
+
* merges any validation errors. For collections (Array/Set), it enforces the presence of the `@list` decorator
|
|
208
|
+
* and checks the type of elements. If a property is a nested model, it will call `hasErrors` on it and flatten
|
|
209
|
+
* the nested error keys using dot notation.
|
|
210
|
+
*
|
|
211
|
+
* @param {M} model - The model instance to be validated. Must extend from {@link Model}.
|
|
212
|
+
* @param {Async} [async] - A flag indicating whether validation should be asynchronous.
|
|
213
|
+
* @param {...string} propsToIgnore - A variadic list of property names that should be skipped during validation.
|
|
214
|
+
*
|
|
215
|
+
* @returns {ConditionalAsync<Async, ModelErrorDefinition | undefined>}
|
|
216
|
+
* Returns either a {@link ModelErrorDefinition} containing validation errors,
|
|
217
|
+
* or `undefined` if no errors are found. When `async` is `true`, returns a Promise.
|
|
218
|
+
*
|
|
219
|
+
* @see {@link Model}
|
|
220
|
+
* @see {@link ModelErrorDefinition}
|
|
221
|
+
* @see {@link validateDecorators}
|
|
222
|
+
* @see {@link getValidatableProperties}
|
|
223
|
+
*
|
|
224
|
+
* @mermaid
|
|
225
|
+
* sequenceDiagram
|
|
226
|
+
* participant Caller
|
|
227
|
+
* participant validate
|
|
228
|
+
* participant getValidatableProperties
|
|
229
|
+
* participant validateDecorators
|
|
230
|
+
* participant ModelInstance
|
|
231
|
+
* Caller->>validate: call with obj, async, propsToIgnore
|
|
232
|
+
* validate->>getValidatableProperties: retrieve decorated props
|
|
233
|
+
* loop for each property
|
|
234
|
+
* validate->>validateDecorators: validate using decorators
|
|
235
|
+
* alt is nested model
|
|
236
|
+
* validate->>ModelInstance: call hasErrors()
|
|
237
|
+
* end
|
|
238
|
+
* end
|
|
239
|
+
* alt async
|
|
240
|
+
* validate->>validate: Promise.allSettled for errors
|
|
241
|
+
* end
|
|
242
|
+
* validate-->>Caller: return ModelErrorDefinition | undefined
|
|
20
243
|
*/
|
|
21
|
-
export function validate(
|
|
22
|
-
const decoratedProperties =
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
244
|
+
export function validate(model, async, ...propsToIgnore) {
|
|
245
|
+
const decoratedProperties = getValidatableProperties(model, propsToIgnore);
|
|
246
|
+
const result = {};
|
|
247
|
+
const nestedErrors = {};
|
|
248
|
+
for (const { prop, decorators } of decoratedProperties) {
|
|
249
|
+
const propKey = String(prop);
|
|
250
|
+
let propValue = model[prop];
|
|
251
|
+
if (!decorators?.length)
|
|
252
|
+
continue;
|
|
253
|
+
// Get the default type validator
|
|
254
|
+
const designTypeDec = decorators.find((d) => {
|
|
255
|
+
return [ModelKeys.TYPE, ValidationKeys.TYPE].includes(d.key);
|
|
256
|
+
});
|
|
257
|
+
if (!designTypeDec)
|
|
34
258
|
continue;
|
|
35
|
-
const
|
|
36
|
-
//
|
|
37
|
-
if (
|
|
38
|
-
if (d.key === ValidationKeys.
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
259
|
+
const designType = designTypeDec.props.name;
|
|
260
|
+
// Handle array or Set types and enforce the presence of @list decorator
|
|
261
|
+
if ([Array.name, Set.name].includes(designType)) {
|
|
262
|
+
if (!decorators.some((d) => d.key === ValidationKeys.LIST)) {
|
|
263
|
+
result[propKey] = {
|
|
264
|
+
[ValidationKeys.TYPE]: `Array or Set property '${propKey}' requires a @list decorator`,
|
|
265
|
+
};
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
if (propValue &&
|
|
269
|
+
!(Array.isArray(propValue) || propValue instanceof Set)) {
|
|
270
|
+
result[propKey] = {
|
|
271
|
+
[ValidationKeys.TYPE]: `Property '${String(prop)}' must be either an Array or a Set`,
|
|
272
|
+
};
|
|
273
|
+
continue;
|
|
274
|
+
}
|
|
275
|
+
// Remove design:type decorator, since @list decorator already ensures type
|
|
276
|
+
for (let i = decorators.length - 1; i >= 0; i--) {
|
|
277
|
+
if (decorators[i].key === ModelKeys.TYPE) {
|
|
278
|
+
decorators.splice(i, 1);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
propValue = propValue instanceof Set ? [...propValue] : propValue;
|
|
43
282
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
283
|
+
const propErrors = validateDecorators(model, propValue, decorators, async) || {};
|
|
284
|
+
// Check for nested properties.
|
|
285
|
+
// To prevent unnecessary processing, "propValue" must be defined and validatable
|
|
286
|
+
// let nestedErrors: Record<string, any> = {};
|
|
287
|
+
const isConstr = Model.isPropertyModel(model, propKey);
|
|
288
|
+
// if propValue !== undefined, null
|
|
289
|
+
if (propValue && isConstr) {
|
|
290
|
+
const instance = propValue;
|
|
291
|
+
const isInvalidModel = typeof instance !== "object" ||
|
|
292
|
+
!instance.hasErrors ||
|
|
293
|
+
typeof instance.hasErrors !== "function";
|
|
294
|
+
if (isInvalidModel) {
|
|
295
|
+
// propErrors[ValidationKeys.TYPE] = "Model should be validatable but it's not.";
|
|
296
|
+
console.warn("Model should be validatable but it's not.");
|
|
49
297
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
: decorator.props || {};
|
|
53
|
-
const err = validator.hasErrors(obj[prop.toString()], decoratorProps, PathProxyEngine.create(obj, { ignoreUndefined: true, ignoreNull: true }));
|
|
54
|
-
if (err) {
|
|
55
|
-
errs = errs || {};
|
|
56
|
-
errs[decorator.key] = err;
|
|
298
|
+
else {
|
|
299
|
+
nestedErrors[propKey] = getNestedValidationErrors(instance, model, async);
|
|
57
300
|
}
|
|
58
301
|
}
|
|
59
|
-
if
|
|
60
|
-
|
|
61
|
-
|
|
302
|
+
// Add to the result if we have any errors
|
|
303
|
+
// Async mode returns a Promise that resolves to undefined when no errors exist
|
|
304
|
+
if (Object.keys(propErrors).length > 0 || async)
|
|
305
|
+
result[propKey] = propErrors;
|
|
306
|
+
// Then merge any nested errors
|
|
307
|
+
if (!async) {
|
|
308
|
+
Object.entries(nestedErrors[propKey] || {}).forEach(([key, error]) => {
|
|
309
|
+
if (error !== undefined) {
|
|
310
|
+
result[`${propKey}.${key}`] = error;
|
|
311
|
+
}
|
|
312
|
+
});
|
|
62
313
|
}
|
|
63
314
|
}
|
|
64
|
-
//
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
? ValidationKeys.LIST
|
|
83
|
-
: ValidationKeys.TYPE;
|
|
84
|
-
const types = allDecorators.find((d) => d.key === typeDecoratorKey) || {};
|
|
85
|
-
let allowedTypes = [];
|
|
86
|
-
if (types && types.props) {
|
|
87
|
-
const customTypes = Array.isArray(obj[prop])
|
|
88
|
-
? types.props.class
|
|
89
|
-
: types.props.customTypes;
|
|
90
|
-
if (customTypes)
|
|
91
|
-
allowedTypes = Array.isArray(customTypes)
|
|
92
|
-
? customTypes.map((t) => `${t}`.toLowerCase())
|
|
93
|
-
: [customTypes.toLowerCase()];
|
|
94
|
-
}
|
|
95
|
-
const validate = (prop, value) => {
|
|
96
|
-
if (typeof value !== "object" && typeof value !== "function")
|
|
97
|
-
return undefined;
|
|
98
|
-
try {
|
|
99
|
-
if (value && !value[VALIDATION_PARENT_KEY])
|
|
100
|
-
value[VALIDATION_PARENT_KEY] = obj; // TODO: freeze?
|
|
101
|
-
return Model.isModel(value)
|
|
102
|
-
? value.hasErrors()
|
|
103
|
-
: allowedTypes.includes(typeof value)
|
|
104
|
-
? undefined
|
|
105
|
-
: "Value has no validatable type";
|
|
106
|
-
}
|
|
107
|
-
finally {
|
|
108
|
-
if (value && value[VALIDATION_PARENT_KEY])
|
|
109
|
-
delete value[VALIDATION_PARENT_KEY];
|
|
315
|
+
// Synchronous return
|
|
316
|
+
if (!async) {
|
|
317
|
+
return (Object.keys(result).length > 0
|
|
318
|
+
? new ModelErrorDefinition(result)
|
|
319
|
+
: undefined);
|
|
320
|
+
}
|
|
321
|
+
const merged = result; // TODO: apply filtering
|
|
322
|
+
const keys = Object.keys(merged);
|
|
323
|
+
const promises = Object.values(merged);
|
|
324
|
+
return Promise.allSettled(promises).then(async (results) => {
|
|
325
|
+
const result = {};
|
|
326
|
+
for (const [parentProp, nestedErrPromise] of Object.entries(nestedErrors)) {
|
|
327
|
+
const nestedPropDecErrors = (await nestedErrPromise);
|
|
328
|
+
if (nestedPropDecErrors)
|
|
329
|
+
Object.entries(nestedPropDecErrors).forEach(([nestedProp, nestedPropDecError]) => {
|
|
330
|
+
if (nestedPropDecError !== undefined) {
|
|
331
|
+
const nestedKey = [parentProp, nestedProp].join(".");
|
|
332
|
+
result[nestedKey] = nestedPropDecError;
|
|
110
333
|
}
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
err = (c === Array.name
|
|
119
|
-
? obj[prop]
|
|
120
|
-
: // If it's a Set
|
|
121
|
-
obj[prop].values())
|
|
122
|
-
.map((v) => validate(prop, v))
|
|
123
|
-
.filter((e) => !!e);
|
|
124
|
-
if (!err?.length) {
|
|
125
|
-
// if the result is an empty list...
|
|
126
|
-
err = undefined;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
break;
|
|
131
|
-
default:
|
|
132
|
-
try {
|
|
133
|
-
if (obj[prop])
|
|
134
|
-
err = validate(prop, obj[prop]);
|
|
135
|
-
}
|
|
136
|
-
catch (e) {
|
|
137
|
-
console.warn(`Model should be validatable but its not: ${e}`);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
334
|
+
});
|
|
335
|
+
}
|
|
336
|
+
for (let i = 0; i < results.length; i++) {
|
|
337
|
+
const key = keys[i];
|
|
338
|
+
const res = results[i];
|
|
339
|
+
if (res.status === "fulfilled" && res.value !== undefined) {
|
|
340
|
+
result[key] = res.value;
|
|
140
341
|
}
|
|
141
|
-
if (
|
|
142
|
-
result =
|
|
143
|
-
|
|
342
|
+
else if (res.status === "rejected") {
|
|
343
|
+
result[key] =
|
|
344
|
+
res.reason instanceof Error
|
|
345
|
+
? res.reason.message
|
|
346
|
+
: String(res.reason || "Validation failed");
|
|
144
347
|
}
|
|
145
348
|
}
|
|
146
|
-
|
|
147
|
-
|
|
349
|
+
return Object.keys(result).length > 0
|
|
350
|
+
? new ModelErrorDefinition(result)
|
|
351
|
+
: undefined;
|
|
352
|
+
});
|
|
148
353
|
}
|
|
149
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbC92YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxrQ0FBK0I7QUFDOUQsT0FBTyxFQUVMLFVBQVUsR0FFWCxNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxTQUFTLEVBQUUsZ0NBQTJCO0FBQy9DLE9BQU8sRUFBRSxjQUFjLEVBQUUsdUJBQW9CO0FBQzdDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxnQ0FBcUI7QUFFckQsT0FBTyxFQUFFLEtBQUssRUFBRSxtQkFBZ0I7QUFDaEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxzQ0FBaUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxnREFBMkM7QUFNcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQ0FBMkI7QUFFckQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQ3RCLEdBQU0sRUFDTixHQUFHLGFBQXVCO0lBRTFCLE1BQU0sbUJBQW1CLEdBQTRDLEVBQUUsQ0FBQztJQUN4RSxLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUc7UUFDcEIsSUFDRSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQztZQUMvQyxhQUFhLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUNsQyxDQUFDO1lBQ0QsbUJBQW1CLENBQUMsSUFBSTtZQUN0QixhQUFhO1lBQ2IsVUFBVSxDQUFDLHFCQUFxQixDQUM5QixjQUFjLENBQUMsT0FBTyxFQUN0QixHQUFHLEVBQ0gsSUFBSSxDQUN3QixDQUMvQixDQUFDO1FBQ0osQ0FBQztJQUVILElBQUksTUFBTSxHQUE0QixTQUFTLENBQUM7SUFFaEQsS0FBSyxNQUFNLGlCQUFpQixJQUFJLG1CQUFtQixFQUFFLENBQUM7UUFD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QUssR0FBMkIsQ0FBQyxJQUFJLENBQUM7Z0NBQ3BDLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFHLEdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUM3QyxDQUFDO3dCQUFDLE9BQU8sQ0FBVSxFQUFFLENBQUM7NEJBQ3BCLE9BQU8sQ0FBQyxJQUFJLENBQUMsNENBQTRDLENBQUMsRUFBRSxDQUFDLENBQUM7d0JBQ2hFLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNSLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO2dCQUN0QixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBVSxDQUFDO1lBQzVCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDL0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1vZGVsRXJyb3JEZWZpbml0aW9uIH0gZnJvbSBcIi4vTW9kZWxFcnJvckRlZmluaXRpb25cIjtcbmltcG9ydCB7XG4gIERlY29yYXRvck1ldGFkYXRhLFxuICBSZWZsZWN0aW9uLFxuICBGdWxsUHJvcGVydHlEZWNvcmF0b3JMaXN0LFxufSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IFJlc2VydmVkTW9kZWxzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBWQUxJREFUSU9OX1BBUkVOVF9LRVkgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBWYWxpZGF0YWJsZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuL01vZGVsXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb24vVmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi4vdmFsaWRhdGlvbi9WYWxpZGF0b3JzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgTW9kZWxFcnJvcnMsXG4gIFZhbGlkYXRpb25Qcm9wZXJ0eURlY29yYXRvckRlZmluaXRpb24sXG4gIFZhbGlkYXRvck9wdGlvbnMsXG59IGZyb20gXCIuLi92YWxpZGF0aW9uL3R5cGVzXCI7XG5pbXBvcnQgeyBQYXRoUHJveHlFbmdpbmUgfSBmcm9tIFwiLi4vdXRpbHMvUGF0aFByb3h5XCI7XG5cbi8qKlxuICogQHN1bW1hcnkgQW5hbHlzZXMgdGhlIGRlY29yYXRpb25zIG9mIHRoZSBwcm9wZXJ0aWVzIGFuZCB2YWxpZGF0ZXMgdGhlIG9iaiBhY2NvcmRpbmcgdG8gdGhlbVxuICpcbiAqIEB0eXBlZGVmIE0gZXh0ZW5kcyBNb2RlbFxuICogQHByb3Age019IG9iaiBNb2RlbCBvYmplY3QgdG8gdmFsaWRhdGVcbiAqIEBwcm9wIHtzdHJpbmdbXX0gW3Byb3BzVG9JZ25vcmVdIG9iamVjdCBwcm9wZXJ0aWVzIHRvIGlnbm9yZSBpbiB0aGUgdmFsaWRhdGlvblxuICpcbiAqIEBmdW5jdGlvbiB2YWxpZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZTxNIGV4dGVuZHMgTW9kZWw+KFxuICBvYmo6IE0sXG4gIC4uLnByb3BzVG9JZ25vcmU6IHN0cmluZ1tdXG4pOiBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGRlY29yYXRlZFByb3BlcnRpZXM6IFZhbGlkYXRpb25Qcm9wZXJ0eURlY29yYXRvckRlZmluaXRpb25bXSA9IFtdO1xuICBmb3IgKGNvbnN0IHByb3AgaW4gb2JqKVxuICAgIGlmIChcbiAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApICYmXG4gICAgICBwcm9wc1RvSWdub3JlLmluZGV4T2YocHJvcCkgPT09IC0xXG4gICAgKSB7XG4gICAgICBkZWNvcmF0ZWRQcm9wZXJ0aWVzLnB1c2goXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgUmVmbGVjdGlvbi5nZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICAgICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVCxcbiAgICAgICAgICBvYmosXG4gICAgICAgICAgcHJvcFxuICAgICAgICApIGFzIEZ1bGxQcm9wZXJ0eURlY29yYXRvckxpc3RcbiAgICAgICk7XG4gICAgfVxuXG4gIGxldCByZXN1bHQ6IE1vZGVsRXJyb3JzIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgZGVjb3JhdGVkUHJvcGVydHkgb2YgZGVjb3JhdGVkUHJvcGVydGllcykge1xuICAgIGNvbnN0IHsgcHJvcCwgZGVjb3JhdG9ycyB9ID0gZGVjb3JhdGVkUHJvcGVydHk7XG5cbiAgICBpZiAoIWRlY29yYXRvcnMgfHwgIWRlY29yYXRvcnMubGVuZ3RoKSBjb250aW51ZTtcblxuICAgIGNvbnN0IGRlZmF1bHRUeXBlRGVjb3JhdG9yOiBEZWNvcmF0b3JNZXRhZGF0YSA9IGRlY29yYXRvcnNbMF07XG5cbiAgICAvLyB0cmllcyB0byBmaW5kIGFueSB0eXBlIGRlY29yYXRvcnMgb3Igb3RoZXIgZGVjb3JhdG9ycyB0aGF0IGFscmVhZHkgZW5mb3JjZSB0eXBlICh0aGUgb25lcyB3aXRoIHRoZSBhbGxvd2VkIHR5cGVzIHByb3BlcnR5IGRlZmluZWQpLiBpZiBzbywgc2tpcCB0aGUgZGVmYXVsdCB0eXBlIHZlcmlmaWNhdGlvblxuICAgIGlmIChcbiAgICAgIGRlY29yYXRvcnMuZmluZCgoZCkgPT4ge1xuICAgICAgICBpZiAoZC5rZXkgPT09IFZhbGlkYXRpb25LZXlzLlRZUEUpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gISFkLnByb3BzLnR5cGVzPy5maW5kKFxuICAgICAgICAgICh0KSA9PiB0ID09PSBkZWZhdWx0VHlwZURlY29yYXRvci5wcm9wcy5uYW1lXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICkge1xuICAgICAgZGVjb3JhdG9ycy5zaGlmdCgpOyAvLyByZW1vdmUgdGhlIGRlc2lnbjp0eXBlIGRlY29yYXRvciwgc2luY2UgdGhlIHR5cGUgd2lsbCBhbHJlYWR5IGJlIGNoZWNrZWRcbiAgICB9XG5cbiAgICBsZXQgZXJyczogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIGZvciAoY29uc3QgZGVjb3JhdG9yIG9mIGRlY29yYXRvcnMpIHtcbiAgICAgIGNvbnN0IHZhbGlkYXRvciA9IFZhbGlkYXRpb24uZ2V0KGRlY29yYXRvci5rZXkpO1xuICAgICAgaWYgKCF2YWxpZGF0b3IpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIHZhbGlkYXRvciBmb3IgJHtkZWNvcmF0b3Iua2V5fWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWNvcmF0b3JQcm9wcyA9XG4gICAgICAgIGRlY29yYXRvci5rZXkgPT09IE1vZGVsS2V5cy5UWVBFXG4gICAgICAgICAgPyBbZGVjb3JhdG9yLnByb3BzXVxuICAgICAgICAgIDogZGVjb3JhdG9yLnByb3BzIHx8IHt9O1xuXG4gICAgICBjb25zdCBlcnI6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHZhbGlkYXRvci5oYXNFcnJvcnMoXG4gICAgICAgIChvYmogYXMgYW55KVtwcm9wLnRvU3RyaW5nKCldLFxuICAgICAgICBkZWNvcmF0b3JQcm9wcyBhcyBWYWxpZGF0b3JPcHRpb25zLFxuICAgICAgICBQYXRoUHJveHlFbmdpbmUuY3JlYXRlKG9iaiwgeyBpZ25vcmVVbmRlZmluZWQ6IHRydWUsIGlnbm9yZU51bGw6IHRydWUgfSlcbiAgICAgICk7XG5cbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgZXJycyA9IGVycnMgfHwge307XG4gICAgICAgIGVycnNbZGVjb3JhdG9yLmtleV0gPSBlcnI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVycnMpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgIHJlc3VsdFtkZWNvcmF0ZWRQcm9wZXJ0eS5wcm9wLnRvU3RyaW5nKCldID0gZXJycztcbiAgICB9XG4gIH1cblxuICAvLyB0ZXN0cyBuZXN0ZWQgY2xhc3Nlc1xuICBmb3IgKGNvbnN0IHByb3Agb2YgT2JqZWN0LmtleXMob2JqKS5maWx0ZXIoKGspID0+ICFyZXN1bHQgfHwgIXJlc3VsdFtrXSkpIHtcbiAgICBsZXQgZXJyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgLy8gaWYgYSBuZXN0ZWQgTW9kZWxcbiAgICBjb25zdCBhbGxEZWNvcmF0b3JzID0gUmVmbGVjdGlvbi5nZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgb2JqLFxuICAgICAgcHJvcFxuICAgICkuZGVjb3JhdG9ycztcbiAgICBjb25zdCBkZWNvcmF0b3JzID0gUmVmbGVjdGlvbi5nZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICBWYWxpZGF0aW9uS2V5cy5SRUZMRUNULFxuICAgICAgb2JqLFxuICAgICAgcHJvcFxuICAgICkuZGVjb3JhdG9ycy5maWx0ZXIoXG4gICAgICAoZDogeyBrZXk6IHN0cmluZyB9KSA9PlxuICAgICAgICBbTW9kZWxLZXlzLlRZUEUsIFZhbGlkYXRpb25LZXlzLlRZUEUgYXMgc3RyaW5nXS5pbmRleE9mKGQua2V5KSAhPT0gLTFcbiAgICApO1xuICAgIGlmICghZGVjb3JhdG9ycyB8fCAhZGVjb3JhdG9ycy5sZW5ndGgpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRlYyA9IGRlY29yYXRvcnMucG9wKCkgYXMgRGVjb3JhdG9yTWV0YWRhdGE7XG4gICAgY29uc3QgY2xhenogPSBkZWMucHJvcHMubmFtZVxuICAgICAgPyBbZGVjLnByb3BzLm5hbWVdXG4gICAgICA6IEFycmF5LmlzQXJyYXkoZGVjLnByb3BzLmN1c3RvbVR5cGVzKVxuICAgICAgICA/IGRlYy5wcm9wcy5jdXN0b21UeXBlc1xuICAgICAgICA6IFtkZWMucHJvcHMuY3VzdG9tVHlwZXNdO1xuICAgIGNvbnN0IHJlc2VydmVkID0gT2JqZWN0LnZhbHVlcyhSZXNlcnZlZE1vZGVscykubWFwKCh2KSA9PlxuICAgICAgdi50b0xvd2VyQ2FzZSgpXG4gICAgKSBhcyBzdHJpbmdbXTtcblxuICAgIGZvciAoY29uc3QgYyBvZiBjbGF6eikge1xuICAgICAgaWYgKHJlc2VydmVkLmluZGV4T2YoYy50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgY29uc3QgdHlwZURlY29yYXRvcktleSA9IEFycmF5LmlzQXJyYXkoKG9iaiBhcyBhbnkpW3Byb3BdKVxuICAgICAgICAgID8gVmFsaWRhdGlvbktleXMuTElTVFxuICAgICAgICAgIDogVmFsaWRhdGlvbktleXMuVFlQRTtcbiAgICAgICAgY29uc3QgdHlwZXM6IGFueSA9XG4gICAgICAgICAgYWxsRGVjb3JhdG9ycy5maW5kKFxuICAgICAgICAgICAgKGQ6IHsga2V5OiBzdHJpbmcgfSkgPT4gZC5rZXkgPT09IHR5cGVEZWNvcmF0b3JLZXlcbiAgICAgICAgICApIHx8IHt9O1xuICAgICAgICBsZXQgYWxsb3dlZFR5cGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAodHlwZXMgJiYgdHlwZXMucHJvcHMpIHtcbiAgICAgICAgICBjb25zdCBjdXN0b21UeXBlcyA9IEFycmF5LmlzQXJyYXkoKG9iaiBhcyBhbnkpW3Byb3BdKVxuICAgICAgICAgICAgPyB0eXBlcy5wcm9wcy5jbGFzc1xuICAgICAgICAgICAgOiB0eXBlcy5wcm9wcy5jdXN0b21UeXBlcztcbiAgICAgICAgICBpZiAoY3VzdG9tVHlwZXMpXG4gICAgICAgICAgICBhbGxvd2VkVHlwZXMgPSBBcnJheS5pc0FycmF5KGN1c3RvbVR5cGVzKVxuICAgICAgICAgICAgICA/IGN1c3RvbVR5cGVzLm1hcCgodCkgPT4gYCR7dH1gLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgICAgIDogW2N1c3RvbVR5cGVzLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdGUgPSAocHJvcDogc3RyaW5nLCB2YWx1ZTogYW55KTogYW55ID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgIXZhbHVlW1ZBTElEQVRJT05fUEFSRU5UX0tFWV0pXG4gICAgICAgICAgICAgIHZhbHVlW1ZBTElEQVRJT05fUEFSRU5UX0tFWV0gPSBvYmo7IC8vIFRPRE86IGZyZWV6ZT9cblxuICAgICAgICAgICAgcmV0dXJuIE1vZGVsLmlzTW9kZWwodmFsdWUpXG4gICAgICAgICAgICAgID8gdmFsdWUuaGFzRXJyb3JzKClcbiAgICAgICAgICAgICAgOiBhbGxvd2VkVHlwZXMuaW5jbHVkZXModHlwZW9mIHZhbHVlKVxuICAgICAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgOiBcIlZhbHVlIGhhcyBubyB2YWxpZGF0YWJsZSB0eXBlXCI7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZVtWQUxJREFUSU9OX1BBUkVOVF9LRVldKVxuICAgICAgICAgICAgICBkZWxldGUgdmFsdWVbVkFMSURBVElPTl9QQVJFTlRfS0VZXTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgc3dpdGNoIChjKSB7XG4gICAgICAgICAgY2FzZSBBcnJheS5uYW1lOlxuICAgICAgICAgIGNhc2UgU2V0Lm5hbWU6XG4gICAgICAgICAgICBpZiAoYWxsRGVjb3JhdG9ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgbGlzdERlYyA9IGFsbERlY29yYXRvcnMuZmluZChcbiAgICAgICAgICAgICAgICAoZDogeyBrZXk6IHN0cmluZyB9KSA9PiBkLmtleSA9PT0gVmFsaWRhdGlvbktleXMuTElTVFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAobGlzdERlYykge1xuICAgICAgICAgICAgICAgIGVyciA9IChcbiAgICAgICAgICAgICAgICAgIGMgPT09IEFycmF5Lm5hbWVcbiAgICAgICAgICAgICAgICAgICAgPyAob2JqIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdXG4gICAgICAgICAgICAgICAgICAgIDogLy8gSWYgaXQncyBhIFNldFxuICAgICAgICAgICAgICAgICAgICAgIChvYmogYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF0udmFsdWVzKClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAubWFwKCh2OiBWYWxpZGF0YWJsZSkgPT4gdmFsaWRhdGUocHJvcCwgdikpXG4gICAgICAgICAgICAgICAgICAuZmlsdGVyKChlOiBhbnkpID0+ICEhZSkgYXMgYW55O1xuICAgICAgICAgICAgICAgIGlmICghZXJyPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSByZXN1bHQgaXMgYW4gZW1wdHkgbGlzdC4uLlxuICAgICAgICAgICAgICAgICAgZXJyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmICgob2JqIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pW3Byb3BdKVxuICAgICAgICAgICAgICAgIGVyciA9IHZhbGlkYXRlKHByb3AsIChvYmogYXMgYW55KVtwcm9wXSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihgTW9kZWwgc2hvdWxkIGJlIHZhbGlkYXRhYmxlIGJ1dCBpdHMgbm90OiAke2V9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IHt9O1xuICAgICAgICByZXN1bHRbcHJvcF0gPSBlcnIgYXMgYW55O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQgPyBuZXcgTW9kZWxFcnJvckRlZmluaXRpb24ocmVzdWx0KSA6IHVuZGVmaW5lZDtcbn1cbiJdfQ==
|
|
354
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tb2RlbC92YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxrQ0FBK0I7QUFDOUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQ0FBMkI7QUFDL0MsT0FBTyxFQUFFLEtBQUssRUFBRSxtQkFBZ0I7QUFDaEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxzQ0FBaUM7QUFDdEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxnREFBMkM7QUFNcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQ0FBMkI7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxnQ0FBcUI7QUFFckUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxtQkFBZ0I7QUFFL0M7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FDckMsS0FBMEIsRUFDMUIsSUFBWSxFQUNaLGFBQXFCLGNBQWMsQ0FBQyxPQUFPO0lBRTNDLE9BQU8sVUFBVSxDQUFDLHFCQUFxQixDQUNyQyxVQUFVLEVBQ1YsS0FBSyxFQUNMLElBQUksQ0FDK0MsQ0FBQztBQUN4RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FDdEMsS0FBUSxFQUNSLGFBQXVCO0lBRXZCLE1BQU0sbUJBQW1CLEdBQTRDLEVBQUUsQ0FBQztJQUV4RSxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQ3pCLElBQ0UsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7WUFDakQsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUM3QixDQUFDO1lBQ0QsTUFBTSxHQUFHLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ2pELElBQUksR0FBRztnQkFBRSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekMsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLG1CQUFtQixDQUFDO0FBQzdCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsbUJBQW1CLENBQzFCLE1BQVcsRUFDWCxHQUFvQixFQUNwQixLQUFjO0lBRWQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7UUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDO0FBQ3BFLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsdUJBQXVCLENBQUMsTUFBVyxFQUFFLEdBQW9CO0lBQ2hFLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBUyx5QkFBeUIsQ0FJaEMsV0FBYyxFQUNkLFdBQWUsRUFDZixPQUFlO0lBRWYsMENBQTBDO0lBQzFDLElBQUksV0FBVyxFQUFFLENBQUM7UUFDaEIsbUJBQW1CLENBQUMsV0FBVyxFQUFFLHFCQUFxQixFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFDRCxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUU1RCxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDckMsdUJBQXVCLENBQUMsV0FBVyxFQUFFLHFCQUFxQixDQUFDLENBQUM7SUFDNUQsdUJBQXVCLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ3JELE9BQU8sSUFBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxNQUFNLFVBQVUsaUJBQWlCLENBSS9CLEtBQVEsRUFDUixLQUFVLEVBQ1YsU0FBaUMsRUFDakMsS0FBYTtJQUViLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2hELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxzRkFBc0Y7SUFDdEYsSUFBSSxDQUFDLEtBQUssSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUs7UUFBRSxPQUFPLFNBQWdCLENBQUM7SUFFN0QsTUFBTSxjQUFjLEdBQ2xCLFNBQVMsQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDLElBQUk7UUFDOUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztRQUNuQixDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7SUFFNUIsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUU7UUFDNUMsZUFBZSxFQUFFLElBQUk7UUFDckIsVUFBVSxFQUFFLElBQUk7S0FDakIsQ0FBQyxDQUFDO0lBRUgsTUFBTSxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUMxQyxLQUFLLEVBQ0wsY0FBa0MsRUFDbEMsT0FBTyxDQUNSLENBQUM7SUFFRixPQUFPLG9CQUFvQixDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3ZELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FJaEMsS0FBUSxFQUNSLEtBQVUsRUFDVixVQUFvQyxFQUNwQyxLQUFhO0lBRWIsTUFBTSxNQUFNLEdBQTZDLEVBQUUsQ0FBQztJQUU1RCxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ25DLHNGQUFzRjtRQUN0RixJQUFJLENBQUMsS0FBSyxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSztZQUFFLFNBQVM7UUFFOUMsSUFBSSxnQkFBZ0IsR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV6RTs7OztVQUlFO1FBQ0YsSUFBSSxTQUFTLENBQUMsR0FBRyxLQUFLLGNBQWMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLGdCQUFnQixJQUFJLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUUsTUFBTSxNQUFNLEdBQUcsS0FBSyxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDekQsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsTUFBTSxLQUFLLEdBQ1QsU0FBUyxDQUFDLEtBQUssQ0FBQyxLQUFLO29CQUNyQixTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUs7b0JBQ3JCLFNBQVMsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO2dCQUU5QixNQUFNLFlBQVksR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7Z0JBQ3hFLDBGQUEwRjtnQkFFMUYsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQWUsRUFBRSxFQUFFO29CQUMxQyxrREFBa0Q7b0JBQ2xELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO3dCQUM5QixPQUFPLHlCQUF5QixDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7b0JBQzdELENBQUM7b0JBRUQsT0FBTyxZQUFZLENBQUMsUUFBUSxDQUFDLE9BQU8sVUFBVSxDQUFDO3dCQUM3QyxDQUFDLENBQUMsU0FBUzt3QkFDWCxDQUFDLENBQUMsK0JBQStCLENBQUM7Z0JBQ3RDLENBQUMsQ0FBQyxDQUFDO2dCQUVILElBQUksS0FBSyxFQUFFLENBQUM7b0JBQ1YsZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTt3QkFDbkQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDekMsT0FBTyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO29CQUN2QyxDQUFDLENBQVEsQ0FBQztnQkFDWixDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQXFCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzNELGdCQUFnQixHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztnQkFDckUsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxnQkFBZ0I7WUFBRyxNQUFjLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLGdCQUFnQixDQUFDO0lBQzFFLENBQUM7SUFFRCxJQUFJLENBQUMsS0FBSztRQUNSLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUNuQyxDQUFDLENBQUUsTUFBYztZQUNqQixDQUFDLENBQUUsU0FBaUIsQ0FBQztJQUV6QixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFrQyxDQUFDO0lBQ3hFLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxjQUFjLEVBQUUsRUFBRTtRQUNuRCxNQUFNLEdBQUcsR0FBMkIsRUFBRSxDQUFDO1FBQ3ZDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDL0MsTUFBTSxHQUFHLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlCLElBQUksR0FBRyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN0QixHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO1lBQ3JCLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQ3ZELENBQUMsQ0FBUSxDQUFDO0FBQ1osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtERztBQUNILE1BQU0sVUFBVSxRQUFRLENBSXRCLEtBQVEsRUFDUixLQUFZLEVBQ1osR0FBRyxhQUF1QjtJQUUxQixNQUFNLG1CQUFtQixHQUN2Qix3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFFakQsTUFBTSxNQUFNLEdBQXdCLEVBQUUsQ0FBQztJQUN2QyxNQUFNLFlBQVksR0FBd0IsRUFBRSxDQUFDO0lBRTdDLEtBQUssTUFBTSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QixJQUFJLFNBQVMsR0FBSSxLQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFckMsSUFBSSxDQUFDLFVBQVUsRUFBRSxNQUFNO1lBQUUsU0FBUztRQUVsQyxpQ0FBaUM7UUFDakMsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQzFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQVUsQ0FBQyxDQUFDO1FBQ3RFLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGFBQWE7WUFBRSxTQUFTO1FBRTdCLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBRTVDLHdFQUF3RTtRQUN4RSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDaEQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzNELE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRztvQkFDaEIsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsMEJBQTBCLE9BQU8sOEJBQThCO2lCQUN2RixDQUFDO2dCQUNGLFNBQVM7WUFDWCxDQUFDO1lBRUQsSUFDRSxTQUFTO2dCQUNULENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsWUFBWSxHQUFHLENBQUMsRUFDdkQsQ0FBQztnQkFDRCxNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUc7b0JBQ2hCLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLGFBQWEsTUFBTSxDQUFDLElBQUksQ0FBQyxvQ0FBb0M7aUJBQ3JGLENBQUM7Z0JBQ0YsU0FBUztZQUNYLENBQUM7WUFFRCwyRUFBMkU7WUFDM0UsS0FBSyxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2hELElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ3pDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMxQixDQUFDO1lBQ0gsQ0FBQztZQUNELFNBQVMsR0FBRyxTQUFTLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztRQUNwRSxDQUFDO1FBRUQsTUFBTSxVQUFVLEdBQ2Qsa0JBQWtCLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRWhFLCtCQUErQjtRQUMvQixpRkFBaUY7UUFDakYsOENBQThDO1FBQzlDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZELG1DQUFtQztRQUNuQyxJQUFJLFNBQVMsSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUMxQixNQUFNLFFBQVEsR0FBVSxTQUFTLENBQUM7WUFDbEMsTUFBTSxjQUFjLEdBQ2xCLE9BQU8sUUFBUSxLQUFLLFFBQVE7Z0JBQzVCLENBQUMsUUFBUSxDQUFDLFNBQVM7Z0JBQ25CLE9BQU8sUUFBUSxDQUFDLFNBQVMsS0FBSyxVQUFVLENBQUM7WUFFM0MsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDbkIsaUZBQWlGO2dCQUNqRixPQUFPLENBQUMsSUFBSSxDQUFDLDJDQUEyQyxDQUFDLENBQUM7WUFDNUQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyx5QkFBeUIsQ0FDL0MsUUFBUSxFQUNSLEtBQUssRUFDTCxLQUFLLENBQ04sQ0FBQztZQUNKLENBQUM7UUFDSCxDQUFDO1FBRUQsMENBQTBDO1FBQzFDLCtFQUErRTtRQUMvRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxLQUFLO1lBQzdDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxVQUFVLENBQUM7UUFFL0IsK0JBQStCO1FBQy9CLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7Z0JBQ25FLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO29CQUN4QixNQUFNLENBQUMsR0FBRyxPQUFPLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQ3RDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQscUJBQXFCO0lBQ3JCLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE9BQU8sQ0FDTCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDO1lBQzVCLENBQUMsQ0FBQyxJQUFJLG9CQUFvQixDQUFDLE1BQU0sQ0FBQztZQUNsQyxDQUFDLENBQUMsU0FBUyxDQUNQLENBQUM7SUFDWCxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQVEsTUFBTSxDQUFDLENBQUMsd0JBQXdCO0lBRXBELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxPQUFPLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtRQUN6RCxNQUFNLE1BQU0sR0FBZ0IsRUFBRSxDQUFDO1FBRS9CLEtBQUssTUFBTSxDQUFDLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUMxRSxNQUFNLG1CQUFtQixHQUFHLENBQUMsTUFBTSxnQkFBZ0IsQ0FHbEQsQ0FBQztZQUVGLElBQUksbUJBQW1CO2dCQUNyQixNQUFNLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUMsT0FBTyxDQUN6QyxDQUFDLENBQUMsVUFBVSxFQUFFLGtCQUFrQixDQUFDLEVBQUUsRUFBRTtvQkFDbkMsSUFBSSxrQkFBa0IsS0FBSyxTQUFTLEVBQUUsQ0FBQzt3QkFDckMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNyRCxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsa0JBQWtCLENBQUM7b0JBQ3pDLENBQUM7Z0JBQ0gsQ0FBQyxDQUNGLENBQUM7UUFDTixDQUFDO1FBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN4QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRXZCLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxXQUFXLElBQUksR0FBRyxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDekQsTUFBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDbkMsQ0FBQztpQkFBTSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFLENBQUM7Z0JBQ3BDLE1BQWMsQ0FBQyxHQUFHLENBQUM7b0JBQ2xCLEdBQUcsQ0FBQyxNQUFNLFlBQVksS0FBSzt3QkFDekIsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTzt3QkFDcEIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLG1CQUFtQixDQUFDLENBQUM7WUFDbEQsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDbkMsQ0FBQyxDQUFDLElBQUksb0JBQW9CLENBQUMsTUFBTSxDQUFDO1lBQ2xDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEIsQ0FBQyxDQUFRLENBQUM7QUFDWixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTW9kZWxFcnJvckRlZmluaXRpb24gfSBmcm9tIFwiLi9Nb2RlbEVycm9yRGVmaW5pdGlvblwiO1xuaW1wb3J0IHsgTW9kZWxLZXlzIH0gZnJvbSBcIi4uL3V0aWxzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiLi9Nb2RlbFwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbiB9IGZyb20gXCIuLi92YWxpZGF0aW9uL1ZhbGlkYXRpb25cIjtcbmltcG9ydCB7IFZhbGlkYXRpb25LZXlzIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIE1vZGVsRXJyb3JzLFxuICBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uLFxuICBWYWxpZGF0b3JPcHRpb25zLFxufSBmcm9tIFwiLi4vdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUGF0aFByb3h5RW5naW5lIH0gZnJvbSBcIi4uL3V0aWxzL1BhdGhQcm94eVwiO1xuaW1wb3J0IHsgQVNZTkNfTUVUQV9LRVksIFZBTElEQVRJT05fUEFSRU5UX0tFWSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IENvbmRpdGlvbmFsQXN5bmMsIERlY29yYXRvck1ldGFkYXRhQXN5bmMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IHRvQ29uZGl0aW9uYWxQcm9taXNlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHZhbGlkYXRpb24gbWV0YWRhdGEgZGVjb3JhdG9ycyBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYyBwcm9wZXJ0eSBvZiBhIG1vZGVsLFxuICogdXNpbmcgdGhlIHJlZmxlY3RpdmUgbWV0YWRhdGEga2V5LlxuICpcbiAqIEBwYXJhbSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSBvciBjbGFzcyBjb250YWluaW5nIHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcCAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB3aG9zZSBkZWNvcmF0b3JzIHNob3VsZCBiZSByZXRyaWV2ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVmbGVjdEtleSAtIFRoZSBtZXRhZGF0YSBrZXkgdXNlZCB0byByZXRyaWV2ZSB0aGUgZGVjb3JhdG9ycy5cbiAqICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8gYFZhbGlkYXRpb25LZXlzLlJFRkxFQ1RgLlxuICpcbiAqIEByZXR1cm5zIFRoZSB2YWxpZGF0aW9uIGRlY29yYXRvcnMgYXBwbGllZCB0byB0aGUgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbGlkYXRpb25EZWNvcmF0b3JzKFxuICBtb2RlbDogUmVjb3JkPHN0cmluZywgYW55PixcbiAgcHJvcDogc3RyaW5nLFxuICByZWZsZWN0S2V5OiBzdHJpbmcgPSBWYWxpZGF0aW9uS2V5cy5SRUZMRUNUXG4pOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uIHtcbiAgcmV0dXJuIFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgIHJlZmxlY3RLZXksXG4gICAgbW9kZWwsXG4gICAgcHJvcFxuICApIGFzIHVua25vd24gYXMgVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbjtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFJldHJpZXZlcyBhbGwgdmFsaWRhdGFibGUgcHJvcGVydHkgZGVjb3JhdG9ycyBmcm9tIGEgZ2l2ZW4gbW9kZWwsIGV4Y2x1ZGluZyBzcGVjaWZpZWQgcHJvcGVydGllcy5cbiAqXG4gKiBAc3VtbWFyeVxuICogSXRlcmF0ZXMgdGhyb3VnaCB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydGllcyBvZiBhIG1vZGVsIGluc3RhbmNlLCBmaWx0ZXJpbmcgb3V0IGFueSBwcm9wZXJ0aWVzXG4gKiBsaXN0ZWQgaW4gdGhlIGBwcm9wc1RvSWdub3JlYCBhcnJheS4gRm9yIGVhY2ggcmVtYWluaW5nIHByb3BlcnR5LCBpdCBjaGVja3Mgd2hldGhlciB2YWxpZGF0aW9uXG4gKiBkZWNvcmF0b3JzIGFyZSBwcmVzZW50IHVzaW5nIGBnZXRWYWxpZGF0aW9uRGVjb3JhdG9yc2AsIGFuZCBpZiBzbywgY29sbGVjdHMgdGhlbSBpbiB0aGUgcmVzdWx0IGFycmF5LlxuICpcbiAqIEB0ZW1wbGF0ZSBNIC0gQSBnZW5lcmljIHBhcmFtZXRlciBleHRlbmRpbmcgdGhlIGBNb2RlbGAgY2xhc3MsIHJlcHJlc2VudGluZyB0aGUgbW9kZWwgdHlwZSBiZWluZyBpbnNwZWN0ZWQuXG4gKlxuICogQHBhcmFtIHtNfSBtb2RlbCAtIEFuIGluc3RhbmNlIG9mIGEgY2xhc3MgZXh0ZW5kaW5nIGBNb2RlbGAgZnJvbSB3aGljaCB2YWxpZGF0YWJsZSBwcm9wZXJ0aWVzIHdpbGwgYmUgZXh0cmFjdGVkLlxuICogQHBhcmFtIHtzdHJpbmdbXX0gcHJvcHNUb0lnbm9yZSAtIEFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdmFsaWRhdGlvbiBpbnNwZWN0aW9uLlxuICpcbiAqIEByZXR1cm4ge1ZhbGlkYXRpb25Qcm9wZXJ0eURlY29yYXRvckRlZmluaXRpb25bXX0gQW4gYXJyYXkgb2YgdmFsaWRhdGlvbiBkZWNvcmF0b3IgZGVmaW5pdGlvbnNcbiAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9kZWwncyBwcm9wZXJ0aWVzLCBleGNsdWRpbmcgdGhvc2UgbGlzdGVkIGluIGBwcm9wc1RvSWdub3JlYC5cbiAqXG4gKiBAZnVuY3Rpb24gZ2V0VmFsaWRhdGFibGVQcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWxpZGF0YWJsZVByb3BlcnRpZXM8TSBleHRlbmRzIE1vZGVsPihcbiAgbW9kZWw6IE0sXG4gIHByb3BzVG9JZ25vcmU6IHN0cmluZ1tdXG4pOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10ge1xuICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHByb3AgaW4gbW9kZWwpIHtcbiAgICBpZiAoXG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kZWwsIHByb3ApICYmXG4gICAgICAhcHJvcHNUb0lnbm9yZS5pbmNsdWRlcyhwcm9wKVxuICAgICkge1xuICAgICAgY29uc3QgZGVjID0gZ2V0VmFsaWRhdGlvbkRlY29yYXRvcnMobW9kZWwsIHByb3ApO1xuICAgICAgaWYgKGRlYykgZGVjb3JhdGVkUHJvcGVydGllcy5wdXNoKGRlYyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRlY29yYXRlZFByb3BlcnRpZXM7XG59XG5cbi8qKlxuICogU2FmZWx5IHNldHMgdGVtcG9yYXJ5IG1ldGFkYXRhIG9uIGFuIG9iamVjdFxuICovXG5mdW5jdGlvbiBzZXRUZW1wb3JhcnlDb250ZXh0KFxuICB0YXJnZXQ6IGFueSxcbiAga2V5OiBzeW1ib2wgfCBzdHJpbmcsXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2b2lkIHtcbiAgaWYgKCFPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIGtleSkpIHRhcmdldFtrZXldID0gdmFsdWU7XG59XG5cbi8qKlxuICogU2FmZWx5IHJlbW92ZXMgdGVtcG9yYXJ5IG1ldGFkYXRhIGZyb20gYW4gb2JqZWN0XG4gKi9cbmZ1bmN0aW9uIGNsZWFudXBUZW1wb3JhcnlDb250ZXh0KHRhcmdldDogYW55LCBrZXk6IHN5bWJvbCB8IHN0cmluZyk6IHZvaWQge1xuICBpZiAoT2JqZWN0Lmhhc093blByb3BlcnR5LmNhbGwodGFyZ2V0LCBrZXkpKSBkZWxldGUgdGFyZ2V0W2tleV07XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgdmFsaWRhdGlvbiB3aXRoIHRlbXBvcmFyeSBjb250ZXh0IGFuZCByZXR1cm5zIHRoZSB2YWxpZGF0aW9uIHJlc3VsdFxuICpcbiAqIEBwYXJhbSBuZXN0ZWRNb2RlbCAtIFRoZSBpbnN0YW5jZSB0byB2YWxpZGF0ZVxuICogQHBhcmFtIHBhcmVudE1vZGVsIC0gUmVmZXJlbmNlIHRvIGEgcGFyZW50IG9iamVjdCBmb3IgbmVzdGVkIHZhbGlkYXRpb25cbiAqIEBwYXJhbSBpc0FzeW5jIC0gV2hldGhlciB0byBwZXJmb3JtIGFzeW5jIHZhbGlkYXRpb25cbiAqIEByZXR1cm5zIFZhbGlkYXRpb24gcmVzdWx0IGZyb20gaGFzRXJyb3JzKClcbiAqL1xuZnVuY3Rpb24gZ2V0TmVzdGVkVmFsaWRhdGlvbkVycm9yczxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIG5lc3RlZE1vZGVsOiBNLFxuICBwYXJlbnRNb2RlbD86IE0sXG4gIGlzQXN5bmM/OiBBc3luY1xuKTogQ29uZGl0aW9uYWxBc3luYzxBc3luYywgTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQ+IHtcbiAgLy8gU2V0IHRlbXBvcmFyeSBjb250ZXh0IGZvciBuZXN0ZWQgbW9kZWxzXG4gIGlmIChwYXJlbnRNb2RlbCkge1xuICAgIHNldFRlbXBvcmFyeUNvbnRleHQobmVzdGVkTW9kZWwsIFZBTElEQVRJT05fUEFSRU5UX0tFWSwgcGFyZW50TW9kZWwpO1xuICB9XG4gIHNldFRlbXBvcmFyeUNvbnRleHQobmVzdGVkTW9kZWwsIEFTWU5DX01FVEFfS0VZLCAhIWlzQXN5bmMpO1xuXG4gIGNvbnN0IGVycnMgPSBuZXN0ZWRNb2RlbC5oYXNFcnJvcnMoKTtcbiAgY2xlYW51cFRlbXBvcmFyeUNvbnRleHQobmVzdGVkTW9kZWwsIFZBTElEQVRJT05fUEFSRU5UX0tFWSk7XG4gIGNsZWFudXBUZW1wb3JhcnlDb250ZXh0KG5lc3RlZE1vZGVsLCBBU1lOQ19NRVRBX0tFWSk7XG4gIHJldHVybiBlcnJzIGFzIGFueTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRGVjb3JhdG9yPFxuICBNIGV4dGVuZHMgTW9kZWwsXG4gIEFzeW5jIGV4dGVuZHMgYm9vbGVhbiA9IGZhbHNlLFxuPihcbiAgbW9kZWw6IE0sXG4gIHZhbHVlOiBhbnksXG4gIGRlY29yYXRvcjogRGVjb3JhdG9yTWV0YWRhdGFBc3luYyxcbiAgYXN5bmM/OiBBc3luY1xuKTogQ29uZGl0aW9uYWxBc3luYzxBc3luYywgc3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHZhbGlkYXRvciA9IFZhbGlkYXRpb24uZ2V0KGRlY29yYXRvci5rZXkpO1xuICBpZiAoIXZhbGlkYXRvcikge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyB2YWxpZGF0b3IgZm9yICR7ZGVjb3JhdG9yLmtleX1gKTtcbiAgfVxuXG4gIC8vIHNraXAgYXN5bmMgZGVjb3JhdG9ycyBpZiB2YWxpZGF0ZURlY29yYXRvcnMgaXMgY2FsbGVkIHN5bmNocm9ub3VzbHkgKGFzeW5jID0gZmFsc2UpXG4gIGlmICghYXN5bmMgJiYgZGVjb3JhdG9yLnByb3BzLmFzeW5jKSByZXR1cm4gdW5kZWZpbmVkIGFzIGFueTtcblxuICBjb25zdCBkZWNvcmF0b3JQcm9wcyA9XG4gICAgZGVjb3JhdG9yLmtleSA9PT0gTW9kZWxLZXlzLlRZUEVcbiAgICAgID8gW2RlY29yYXRvci5wcm9wc11cbiAgICAgIDogZGVjb3JhdG9yLnByb3BzIHx8IHt9O1xuXG4gIGNvbnN0IGNvbnRleHQgPSBQYXRoUHJveHlFbmdpbmUuY3JlYXRlKG1vZGVsLCB7XG4gICAgaWdub3JlVW5kZWZpbmVkOiB0cnVlLFxuICAgIGlnbm9yZU51bGw6IHRydWUsXG4gIH0pO1xuXG4gIGNvbnN0IG1heWJlQXN5bmNFcnJvcnMgPSB2YWxpZGF0b3IuaGFzRXJyb3JzKFxuICAgIHZhbHVlLFxuICAgIGRlY29yYXRvclByb3BzIGFzIFZhbGlkYXRvck9wdGlvbnMsXG4gICAgY29udGV4dFxuICApO1xuXG4gIHJldHVybiB0b0NvbmRpdGlvbmFsUHJvbWlzZShtYXliZUFzeW5jRXJyb3JzLCBhc3luYyk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBFeGVjdXRlcyB2YWxpZGF0aW9uIGxvZ2ljIGZvciBhIHNldCBvZiBkZWNvcmF0b3JzIGFwcGxpZWQgdG8gYSBtb2RlbCdzIHByb3BlcnR5LCBoYW5kbGluZyBib3RoXG4gKiBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIHZhbGlkYXRpb25zLCBpbmNsdWRpbmcgc3VwcG9ydCBmb3IgbmVzdGVkIHZhbGlkYXRpb25zIGFuZCBsaXN0cy5cbiAqXG4gKiBAc3VtbWFyeVxuICogSXRlcmF0ZXMgb3ZlciBhbiBhcnJheSBvZiBkZWNvcmF0b3IgbWV0YWRhdGEgb2JqZWN0cyBhbmQgYXBwbGllcyBlYWNoIHZhbGlkYXRpb24gcnVsZSB0byB0aGVcbiAqIHByb3ZpZGVkIHZhbHVlLiBGb3IgbGlzdCBkZWNvcmF0b3JzIChgVmFsaWRhdGlvbktleXMuTElTVGApLCBpdCBwZXJmb3JtcyBlbGVtZW50LXdpc2UgdmFsaWRhdGlvbixcbiAqIHN1cHBvcnRpbmcgbmVzdGVkIG1vZGVsIHZhbGlkYXRpb24gYW5kIHR5cGUgY2hlY2tzLiBJZiB0aGUgYGFzeW5jYCBmbGFnIGlzIHNldCwgYXN5bmNocm9ub3VzXG4gKiB2YWxpZGF0aW9uIGlzIHN1cHBvcnRlZCB1c2luZyBgUHJvbWlzZS5hbGxgLiBUaGUgcmVzdWx0IGlzIGEgcmVjb3JkIG1hcHBpbmcgdmFsaWRhdGlvbiBrZXlzIHRvXG4gKiBlcnJvciBtZXNzYWdlcywgb3IgYHVuZGVmaW5lZGAgaWYgbm8gZXJyb3JzIGFyZSBmb3VuZC5cbiAqXG4gKiBAdGVtcGxhdGUgTSAtIEEgdHlwZSBwYXJhbWV0ZXIgZXh0ZW5kaW5nIGBNb2RlbGAsIHJlcHJlc2VudGluZyB0aGUgbW9kZWwgdHlwZSBiZWluZyB2YWxpZGF0ZWQuXG4gKiBAdGVtcGxhdGUgQXN5bmMgLSBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHZhbGlkYXRpb24gc2hvdWxkIGJlIHBlcmZvcm1lZCBhc3luY2hyb25vdXNseS5cbiAqXG4gKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRoYXQgdGhlIHZhbGlkYXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoLlxuICogQHBhcmFtIHthbnl9IHZhbHVlIC0gVGhlIHZhbHVlIHRvIGJlIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBwcm92aWRlZCBkZWNvcmF0b3JzLlxuICogQHBhcmFtIHtEZWNvcmF0b3JNZXRhZGF0YUFzeW5jW119IGRlY29yYXRvcnMgLSBBbiBhcnJheSBvZiBtZXRhZGF0YSBvYmplY3RzIHJlcHJlc2VudGluZyB2YWxpZGF0aW9uIGRlY29yYXRvcnMuXG4gKiBAcGFyYW0ge0FzeW5jfSBbYXN5bmNdIC0gT3B0aW9uYWwgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdmFsaWRhdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkIGFzeW5jaHJvbm91c2x5LlxuICpcbiAqIEByZXR1cm4ge0NvbmRpdGlvbmFsQXN5bmM8QXN5bmMsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4+IHwgdW5kZWZpbmVkfVxuICogUmV0dXJucyBlaXRoZXIgYSByZWNvcmQgb2YgdmFsaWRhdGlvbiBlcnJvcnMgKGtleWVkIGJ5IHRoZSBkZWNvcmF0b3Iga2V5KSBvciBgdW5kZWZpbmVkYCBpZiBubyBlcnJvcnMgYXJlIGZvdW5kLlxuICogSWYgYGFzeW5jYCBpcyB0cnVlLCB0aGUgcmV0dXJuIHZhbHVlIGlzIGEgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHNhbWUgc3RydWN0dXJlLlxuICpcbiAqIEBmdW5jdGlvbiB2YWxpZGF0ZURlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlRGVjb3JhdG9yczxcbiAgTSBleHRlbmRzIE1vZGVsLFxuICBBc3luYyBleHRlbmRzIGJvb2xlYW4gPSBmYWxzZSxcbj4oXG4gIG1vZGVsOiBNLFxuICB2YWx1ZTogYW55LFxuICBkZWNvcmF0b3JzOiBEZWNvcmF0b3JNZXRhZGF0YUFzeW5jW10sXG4gIGFzeW5jPzogQXN5bmNcbik6IENvbmRpdGlvbmFsQXN5bmM8QXN5bmMsIFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz4+ID0ge307XG5cbiAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgZGVjb3JhdG9ycykge1xuICAgIC8vIHNraXAgYXN5bmMgZGVjb3JhdG9ycyBpZiB2YWxpZGF0ZURlY29yYXRvcnMgaXMgY2FsbGVkIHN5bmNocm9ub3VzbHkgKGFzeW5jID0gZmFsc2UpXG4gICAgaWYgKCFhc3luYyAmJiBkZWNvcmF0b3IucHJvcHMuYXN5bmMpIGNvbnRpbnVlO1xuXG4gICAgbGV0IHZhbGlkYXRpb25FcnJvcnMgPSB2YWxpZGF0ZURlY29yYXRvcihtb2RlbCwgdmFsdWUsIGRlY29yYXRvciwgYXN5bmMpO1xuXG4gICAgLypcbiAgICBJZiB0aGUgZGVjb3JhdG9yIGlzIGEgbGlzdCwgZWFjaCBlbGVtZW50IG11c3QgYmUgY2hlY2tlZC5cbiAgICBXaGVuICdhc3luYycgaXMgdHJ1ZSwgdGhlICdlcnInIHdpbGwgYWx3YXlzIGJlIGEgcGVuZGluZyBwcm9taXNlIGluaXRpYWxseSxcbiAgICBzbyB0aGUgJyFlcnInIGNoZWNrIHdpbGwgZXZhbHVhdGUgdG8gZmFsc2UgKGV2ZW4gaWYgdGhlIHByb21pc2UgbGF0ZXIgcmVzb2x2ZXMgd2l0aCBubyBlcnJvcnMpXG4gICAgKi9cbiAgICBpZiAoZGVjb3JhdG9yLmtleSA9PT0gVmFsaWRhdGlvbktleXMuTElTVCAmJiAoIXZhbGlkYXRpb25FcnJvcnMgfHwgYXN5bmMpKSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSB2YWx1ZSBpbnN0YW5jZW9mIFNldCA/IFsuLi52YWx1ZV0gOiB2YWx1ZTtcbiAgICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdHlwZXMgPVxuICAgICAgICAgIGRlY29yYXRvci5wcm9wcy5jbGFzcyB8fFxuICAgICAgICAgIGRlY29yYXRvci5wcm9wcy5jbGF6eiB8fFxuICAgICAgICAgIGRlY29yYXRvci5wcm9wcy5jdXN0b21UeXBlcztcblxuICAgICAgICBjb25zdCBhbGxvd2VkVHlwZXMgPSBbdHlwZXNdLmZsYXQoKS5tYXAoKHQpID0+IFN0cmluZyh0KS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgLy8gY29uc3QgcmVzZXJ2ZWQgPSBPYmplY3QudmFsdWVzKFJlc2VydmVkTW9kZWxzKS5tYXAoKHYpID0+IHYudG9Mb3dlckNhc2UoKSkgYXMgc3RyaW5nW107XG5cbiAgICAgICAgY29uc3QgZXJycyA9IHZhbHVlcy5tYXAoKGNoaWxkVmFsdWU6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIGlmIChNb2RlbC5pc01vZGVsKHYpICYmICFyZXNlcnZlZC5pbmNsdWRlcyh2KSB7XG4gICAgICAgICAgaWYgKE1vZGVsLmlzTW9kZWwoY2hpbGRWYWx1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBnZXROZXN0ZWRWYWxpZGF0aW9uRXJyb3JzKGNoaWxkVmFsdWUsIG1vZGVsLCBhc3luYyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGFsbG93ZWRUeXBlcy5pbmNsdWRlcyh0eXBlb2YgY2hpbGRWYWx1ZSlcbiAgICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgICA6IFwiVmFsdWUgaGFzIG5vIHZhbGlkYXRhYmxlIHR5cGVcIjtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGFzeW5jKSB7XG4gICAgICAgICAgdmFsaWRhdGlvbkVycm9ycyA9IFByb21pc2UuYWxsKGVycnMpLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYWxsRW1wdHkgPSByZXN1bHQuZXZlcnkoKHIpID0+ICFyKTtcbiAgICAgICAgICAgIHJldHVybiBhbGxFbXB0eSA/IHVuZGVmaW5lZCA6IHJlc3VsdDtcbiAgICAgICAgICB9KSBhcyBhbnk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgYWxsRW1wdHkgPSBlcnJzLmV2ZXJ5KChyOiBzdHJpbmcgfCB1bmRlZmluZWQpID0+ICFyKTtcbiAgICAgICAgICB2YWxpZGF0aW9uRXJyb3JzID0gZXJycy5sZW5ndGggPiAwICYmICFhbGxFbXB0eSA/IGVycnMgOiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodmFsaWRhdGlvbkVycm9ycykgKHJlc3VsdCBhcyBhbnkpW2RlY29yYXRvci5rZXldID0gdmFsaWRhdGlvbkVycm9ycztcbiAgfVxuXG4gIGlmICghYXN5bmMpXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlc3VsdCkubGVuZ3RoID4gMFxuICAgICAgPyAocmVzdWx0IGFzIGFueSlcbiAgICAgIDogKHVuZGVmaW5lZCBhcyBhbnkpO1xuXG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhyZXN1bHQpO1xuICBjb25zdCBwcm9taXNlcyA9IE9iamVjdC52YWx1ZXMocmVzdWx0KSBhcyBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD5bXTtcbiAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKChyZXNvbHZlZFZhbHVlcykgPT4ge1xuICAgIGNvbnN0IHJlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzb2x2ZWRWYWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHZhbCA9IHJlc29sdmVkVmFsdWVzW2ldO1xuICAgICAgaWYgKHZhbCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJlc1trZXlzW2ldXSA9IHZhbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHJlcykubGVuZ3RoID4gMCA/IHJlcyA6IHVuZGVmaW5lZDtcbiAgfSkgYXMgYW55O1xufVxuXG4vKipcbiAqIEBmdW5jdGlvbiB2YWxpZGF0ZVxuICogQHRlbXBsYXRlIE1cbiAqIEB0ZW1wbGF0ZSBBc3luY1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IE1vZGVsXG4gKlxuICogQGRlc2NyaXB0aW9uXG4gKiBWYWxpZGF0ZXMgdGhlIHByb3BlcnRpZXMgb2YgYSB7QGxpbmsgTW9kZWx9IGluc3RhbmNlIHVzaW5nIHJlZ2lzdGVyZWQgZGVjb3JhdG9ycy5cbiAqIFN1cHBvcnRzIGJvdGggc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIGZsb3dzLCBkZXBlbmRpbmcgb24gdGhlIGBhc3luY2AgZmxhZy5cbiAqXG4gKiBAc3VtbWFyeVxuICogVGhpcyBmdW5jdGlvbiBpbnNwZWN0cyBhIGdpdmVuIG1vZGVsIG9iamVjdCwgaWRlbnRpZmllcyBkZWNvcmF0ZWQgcHJvcGVydGllcyB0aGF0IHJlcXVpcmUgdmFsaWRhdGlvbixcbiAqIGFuZCBhcHBsaWVzIHRoZSBjb3JyZXNwb25kaW5nIHZhbGlkYXRpb24gcnVsZXMuIEl0IGFsc28gc3VwcG9ydHMgbmVzdGVkIG1vZGVsIHZhbGlkYXRpb24gYW5kIGdyYWNlZnVsbHlcbiAqIG1lcmdlcyBhbnkgdmFsaWRhdGlvbiBlcnJvcnMuIEZvciBjb2xsZWN0aW9ucyAoQXJyYXkvU2V0KSwgaXQgZW5mb3JjZXMgdGhlIHByZXNlbmNlIG9mIHRoZSBgQGxpc3RgIGRlY29yYXRvclxuICogYW5kIGNoZWNrcyB0aGUgdHlwZSBvZiBlbGVtZW50cy4gSWYgYSBwcm9wZXJ0eSBpcyBhIG5lc3RlZCBtb2RlbCwgaXQgd2lsbCBjYWxsIGBoYXNFcnJvcnNgIG9uIGl0IGFuZCBmbGF0dGVuXG4gKiB0aGUgbmVzdGVkIGVycm9yIGtleXMgdXNpbmcgZG90IG5vdGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gYmUgdmFsaWRhdGVkLiBNdXN0IGV4dGVuZCBmcm9tIHtAbGluayBNb2RlbH0uXG4gKiBAcGFyYW0ge0FzeW5jfSBbYXN5bmNdIC0gQSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB2YWxpZGF0aW9uIHNob3VsZCBiZSBhc3luY2hyb25vdXMuXG4gKiBAcGFyYW0gey4uLnN0cmluZ30gcHJvcHNUb0lnbm9yZSAtIEEgdmFyaWFkaWMgbGlzdCBvZiBwcm9wZXJ0eSBuYW1lcyB0aGF0IHNob3VsZCBiZSBza2lwcGVkIGR1cmluZyB2YWxpZGF0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtDb25kaXRpb25hbEFzeW5jPEFzeW5jLCBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZD59XG4gKiBSZXR1cm5zIGVpdGhlciBhIHtAbGluayBNb2RlbEVycm9yRGVmaW5pdGlvbn0gY29udGFpbmluZyB2YWxpZGF0aW9uIGVycm9ycyxcbiAqIG9yIGB1bmRlZmluZWRgIGlmIG5vIGVycm9ycyBhcmUgZm91bmQuIFdoZW4gYGFzeW5jYCBpcyBgdHJ1ZWAsIHJldHVybnMgYSBQcm9taXNlLlxuICpcbiAqIEBzZWUge0BsaW5rIE1vZGVsfVxuICogQHNlZSB7QGxpbmsgTW9kZWxFcnJvckRlZmluaXRpb259XG4gKiBAc2VlIHtAbGluayB2YWxpZGF0ZURlY29yYXRvcnN9XG4gKiBAc2VlIHtAbGluayBnZXRWYWxpZGF0YWJsZVByb3BlcnRpZXN9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICAgIHBhcnRpY2lwYW50IENhbGxlclxuICogICAgIHBhcnRpY2lwYW50IHZhbGlkYXRlXG4gKiAgICAgcGFydGljaXBhbnQgZ2V0VmFsaWRhdGFibGVQcm9wZXJ0aWVzXG4gKiAgICAgcGFydGljaXBhbnQgdmFsaWRhdGVEZWNvcmF0b3JzXG4gKiAgICAgcGFydGljaXBhbnQgTW9kZWxJbnN0YW5jZVxuICogICAgIENhbGxlci0+PnZhbGlkYXRlOiBjYWxsIHdpdGggb2JqLCBhc3luYywgcHJvcHNUb0lnbm9yZVxuICogICAgIHZhbGlkYXRlLT4+Z2V0VmFsaWRhdGFibGVQcm9wZXJ0aWVzOiByZXRyaWV2ZSBkZWNvcmF0ZWQgcHJvcHNcbiAqICAgICBsb29wIGZvciBlYWNoIHByb3BlcnR5XG4gKiAgICAgICAgIHZhbGlkYXRlLT4+dmFsaWRhdGVEZWNvcmF0b3JzOiB2YWxpZGF0ZSB1c2luZyBkZWNvcmF0b3JzXG4gKiAgICAgICAgIGFsdCBpcyBuZXN0ZWQgbW9kZWxcbiAqICAgICAgICAgICAgIHZhbGlkYXRlLT4+TW9kZWxJbnN0YW5jZTogY2FsbCBoYXNFcnJvcnMoKVxuICogICAgICAgICBlbmRcbiAqICAgICBlbmRcbiAqICAgICBhbHQgYXN5bmNcbiAqICAgICAgICAgdmFsaWRhdGUtPj52YWxpZGF0ZTogUHJvbWlzZS5hbGxTZXR0bGVkIGZvciBlcnJvcnNcbiAqICAgICBlbmRcbiAqICAgICB2YWxpZGF0ZS0tPj5DYWxsZXI6IHJldHVybiBNb2RlbEVycm9yRGVmaW5pdGlvbiB8IHVuZGVmaW5lZFxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGU8XG4gIE0gZXh0ZW5kcyBNb2RlbDxib29sZWFuPixcbiAgQXN5bmMgZXh0ZW5kcyBib29sZWFuID0gZmFsc2UsXG4+KFxuICBtb2RlbDogTSxcbiAgYXN5bmM6IEFzeW5jLFxuICAuLi5wcm9wc1RvSWdub3JlOiBzdHJpbmdbXVxuKTogQ29uZGl0aW9uYWxBc3luYzxBc3luYywgTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgZGVjb3JhdGVkUHJvcGVydGllczogVmFsaWRhdGlvblByb3BlcnR5RGVjb3JhdG9yRGVmaW5pdGlvbltdID1cbiAgICBnZXRWYWxpZGF0YWJsZVByb3BlcnRpZXMobW9kZWwsIHByb3BzVG9JZ25vcmUpO1xuXG4gIGNvbnN0IHJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICBjb25zdCBuZXN0ZWRFcnJvcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcblxuICBmb3IgKGNvbnN0IHsgcHJvcCwgZGVjb3JhdG9ycyB9IG9mIGRlY29yYXRlZFByb3BlcnRpZXMpIHtcbiAgICBjb25zdCBwcm9wS2V5ID0gU3RyaW5nKHByb3ApO1xuICAgIGxldCBwcm9wVmFsdWUgPSAobW9kZWwgYXMgYW55KVtwcm9wXTtcblxuICAgIGlmICghZGVjb3JhdG9ycz8ubGVuZ3RoKSBjb250aW51ZTtcblxuICAgIC8vIEdldCB0aGUgZGVmYXVsdCB0eXBlIHZhbGlkYXRvclxuICAgIGNvbnN0IGRlc2lnblR5cGVEZWMgPSBkZWNvcmF0b3JzLmZpbmQoKGQpID0+IHtcbiAgICAgIHJldHVybiBbTW9kZWxLZXlzLlRZUEUsIFZhbGlkYXRpb25LZXlzLlRZUEVdLmluY2x1ZGVzKGQua2V5IGFzIGFueSk7XG4gICAgfSk7XG5cbiAgICBpZiAoIWRlc2lnblR5cGVEZWMpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgZGVzaWduVHlwZSA9IGRlc2lnblR5cGVEZWMucHJvcHMubmFtZTtcblxuICAgIC8vIEhhbmRsZSBhcnJheSBvciBTZXQgdHlwZXMgYW5kIGVuZm9yY2UgdGhlIHByZXNlbmNlIG9mIEBsaXN0IGRlY29yYXRvclxuICAgIGlmIChbQXJyYXkubmFtZSwgU2V0Lm5hbWVdLmluY2x1ZGVzKGRlc2lnblR5cGUpKSB7XG4gICAgICBpZiAoIWRlY29yYXRvcnMuc29tZSgoZCkgPT4gZC5rZXkgPT09IFZhbGlkYXRpb25LZXlzLkxJU1QpKSB7XG4gICAgICAgIHJlc3VsdFtwcm9wS2V5XSA9IHtcbiAgICAgICAgICBbVmFsaWRhdGlvbktleXMuVFlQRV06IGBBcnJheSBvciBTZXQgcHJvcGVydHkgJyR7cHJvcEtleX0nIHJlcXVpcmVzIGEgQGxpc3QgZGVjb3JhdG9yYCxcbiAgICAgICAgfTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgcHJvcFZhbHVlICYmXG4gICAgICAgICEoQXJyYXkuaXNBcnJheShwcm9wVmFsdWUpIHx8IHByb3BWYWx1ZSBpbnN0YW5jZW9mIFNldClcbiAgICAgICkge1xuICAgICAgICByZXN1bHRbcHJvcEtleV0gPSB7XG4gICAgICAgICAgW1ZhbGlkYXRpb25LZXlzLlRZUEVdOiBgUHJvcGVydHkgJyR7U3RyaW5nKHByb3ApfScgbXVzdCBiZSBlaXRoZXIgYW4gQXJyYXkgb3IgYSBTZXRgLFxuICAgICAgICB9O1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gUmVtb3ZlIGRlc2lnbjp0eXBlIGRlY29yYXRvciwgc2luY2UgQGxpc3QgZGVjb3JhdG9yIGFscmVhZHkgZW5zdXJlcyB0eXBlXG4gICAgICBmb3IgKGxldCBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBpZiAoZGVjb3JhdG9yc1tpXS5rZXkgPT09IE1vZGVsS2V5cy5UWVBFKSB7XG4gICAgICAgICAgZGVjb3JhdG9ycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHByb3BWYWx1ZSA9IHByb3BWYWx1ZSBpbnN0YW5jZW9mIFNldCA/IFsuLi5wcm9wVmFsdWVdIDogcHJvcFZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3BFcnJvcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPVxuICAgICAgdmFsaWRhdGVEZWNvcmF0b3JzKG1vZGVsLCBwcm9wVmFsdWUsIGRlY29yYXRvcnMsIGFzeW5jKSB8fCB7fTtcblxuICAgIC8vIENoZWNrIGZvciBuZXN0ZWQgcHJvcGVydGllcy5cbiAgICAvLyBUbyBwcmV2ZW50IHVubmVjZXNzYXJ5IHByb2Nlc3NpbmcsIFwicHJvcFZhbHVlXCIgbXVzdCBiZSBkZWZpbmVkIGFuZCB2YWxpZGF0YWJsZVxuICAgIC8vIGxldCBuZXN0ZWRFcnJvcnM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgICBjb25zdCBpc0NvbnN0ciA9IE1vZGVsLmlzUHJvcGVydHlNb2RlbChtb2RlbCwgcHJvcEtleSk7XG4gICAgLy8gaWYgcHJvcFZhbHVlICE9PSB1bmRlZmluZWQsIG51bGxcbiAgICBpZiAocHJvcFZhbHVlICYmIGlzQ29uc3RyKSB7XG4gICAgICBjb25zdCBpbnN0YW5jZTogTW9kZWwgPSBwcm9wVmFsdWU7XG4gICAgICBjb25zdCBpc0ludmFsaWRNb2RlbCA9XG4gICAgICAgIHR5cGVvZiBpbnN0YW5jZSAhPT0gXCJvYmplY3RcIiB8fFxuICAgICAgICAhaW5zdGFuY2UuaGFzRXJyb3JzIHx8XG4gICAgICAgIHR5cGVvZiBpbnN0YW5jZS5oYXNFcnJvcnMgIT09IFwiZnVuY3Rpb25cIjtcblxuICAgICAgaWYgKGlzSW52YWxpZE1vZGVsKSB7XG4gICAgICAgIC8vIHByb3BFcnJvcnNbVmFsaWRhdGlvbktleXMuVFlQRV0gPSBcIk1vZGVsIHNob3VsZCBiZSB2YWxpZGF0YWJsZSBidXQgaXQncyBub3QuXCI7XG4gICAgICAgIGNvbnNvbGUud2FybihcIk1vZGVsIHNob3VsZCBiZSB2YWxpZGF0YWJsZSBidXQgaXQncyBub3QuXCIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmVzdGVkRXJyb3JzW3Byb3BLZXldID0gZ2V0TmVzdGVkVmFsaWRhdGlvbkVycm9ycyhcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICBhc3luY1xuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCB0byB0aGUgcmVzdWx0IGlmIHdlIGhhdmUgYW55IGVycm9yc1xuICAgIC8vIEFzeW5jIG1vZGUgcmV0dXJucyBhIFByb21pc2UgdGhhdCByZXNvbHZlcyB0byB1bmRlZmluZWQgd2hlbiBubyBlcnJvcnMgZXhpc3RcbiAgICBpZiAoT2JqZWN0LmtleXMocHJvcEVycm9ycykubGVuZ3RoID4gMCB8fCBhc3luYylcbiAgICAgIHJlc3VsdFtwcm9wS2V5XSA9IHByb3BFcnJvcnM7XG5cbiAgICAvLyBUaGVuIG1lcmdlIGFueSBuZXN0ZWQgZXJyb3JzXG4gICAgaWYgKCFhc3luYykge1xuICAgICAgT2JqZWN0LmVudHJpZXMobmVzdGVkRXJyb3JzW3Byb3BLZXldIHx8IHt9KS5mb3JFYWNoKChba2V5LCBlcnJvcl0pID0+IHtcbiAgICAgICAgaWYgKGVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXN1bHRbYCR7cHJvcEtleX0uJHtrZXl9YF0gPSBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLy8gU3luY2hyb25vdXMgcmV0dXJuXG4gIGlmICghYXN5bmMpIHtcbiAgICByZXR1cm4gKFxuICAgICAgT2JqZWN0LmtleXMocmVzdWx0KS5sZW5ndGggPiAwXG4gICAgICAgID8gbmV3IE1vZGVsRXJyb3JEZWZpbml0aW9uKHJlc3VsdClcbiAgICAgICAgOiB1bmRlZmluZWRcbiAgICApIGFzIGFueTtcbiAgfVxuXG4gIGNvbnN0IG1lcmdlZDogYW55ID0gcmVzdWx0OyAvLyBUT0RPOiBhcHBseSBmaWx0ZXJpbmdcblxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMobWVyZ2VkKTtcbiAgY29uc3QgcHJvbWlzZXMgPSBPYmplY3QudmFsdWVzKG1lcmdlZCk7XG4gIHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQocHJvbWlzZXMpLnRoZW4oYXN5bmMgKHJlc3VsdHMpID0+IHtcbiAgICBjb25zdCByZXN1bHQ6IE1vZGVsRXJyb3JzID0ge307XG5cbiAgICBmb3IgKGNvbnN0IFtwYXJlbnRQcm9wLCBuZXN0ZWRFcnJQcm9taXNlXSBvZiBPYmplY3QuZW50cmllcyhuZXN0ZWRFcnJvcnMpKSB7XG4gICAgICBjb25zdCBuZXN0ZWRQcm9wRGVjRXJyb3JzID0gKGF3YWl0IG5lc3RlZEVyclByb21pc2UpIGFzIFJlY29yZDxcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICBhbnlcbiAgICAgID47XG5cbiAgICAgIGlmIChuZXN0ZWRQcm9wRGVjRXJyb3JzKVxuICAgICAgICBPYmplY3QuZW50cmllcyhuZXN0ZWRQcm9wRGVjRXJyb3JzKS5mb3JFYWNoKFxuICAgICAgICAgIChbbmVzdGVkUHJvcCwgbmVzdGVkUHJvcERlY0Vycm9yXSkgPT4ge1xuICAgICAgICAgICAgaWYgKG5lc3RlZFByb3BEZWNFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG5lc3RlZEtleSA9IFtwYXJlbnRQcm9wLCBuZXN0ZWRQcm9wXS5qb2luKFwiLlwiKTtcbiAgICAgICAgICAgICAgcmVzdWx0W25lc3RlZEtleV0gPSBuZXN0ZWRQcm9wRGVjRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qga2V5ID0ga2V5c1tpXTtcbiAgICAgIGNvbnN0IHJlcyA9IHJlc3VsdHNbaV07XG5cbiAgICAgIGlmIChyZXMuc3RhdHVzID09PSBcImZ1bGZpbGxlZFwiICYmIHJlcy52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIChyZXN1bHQgYXMgYW55KVtrZXldID0gcmVzLnZhbHVlO1xuICAgICAgfSBlbHNlIGlmIChyZXMuc3RhdHVzID09PSBcInJlamVjdGVkXCIpIHtcbiAgICAgICAgKHJlc3VsdCBhcyBhbnkpW2tleV0gPVxuICAgICAgICAgIHJlcy5yZWFzb24gaW5zdGFuY2VvZiBFcnJvclxuICAgICAgICAgICAgPyByZXMucmVhc29uLm1lc3NhZ2VcbiAgICAgICAgICAgIDogU3RyaW5nKHJlcy5yZWFzb24gfHwgXCJWYWxpZGF0aW9uIGZhaWxlZFwiKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMocmVzdWx0KS5sZW5ndGggPiAwXG4gICAgICA/IG5ldyBNb2RlbEVycm9yRGVmaW5pdGlvbihyZXN1bHQpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgfSkgYXMgYW55O1xufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./validation";
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from "./validation.js";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZ0NBQTZCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vdmFsaWRhdGlvblwiO1xuIl19
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { DecoratorMetadata } from "@decaf-ts/reflection";
|
|
2
|
+
import { Model, ModelErrorDefinition } from "../model";
|
|
3
|
+
/**
|
|
4
|
+
* @description Conditionally wraps a type in a `Promise` based on the `Async` flag.
|
|
5
|
+
* @summary Utility type that resolves to `T` if `Async` is `false`, or to `Promise<T>` if `Async` is `true`.
|
|
6
|
+
* Used to abstract the return type of functions that may be either synchronous or asynchronous depending on a flag.
|
|
7
|
+
*
|
|
8
|
+
* @template Async A boolean flag indicating whether the result should be asynchronous (`true`) or synchronous (`false`).
|
|
9
|
+
* @template T The base type to return directly or to wrap in a `Promise`.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* // Synchronous result
|
|
14
|
+
* type SyncResult: string | number = ConditionalAsync<false, string | number>;
|
|
15
|
+
*
|
|
16
|
+
* // Asynchronous result
|
|
17
|
+
* type AsyncResult: Promise<string | number> = ConditionalAsync<true, string | number>;
|
|
18
|
+
* ```
|
|
19
|
+
* @memberOf module:decorator-validation
|
|
20
|
+
*/
|
|
21
|
+
export type ConditionalAsync<Async extends boolean, T> = Async extends true ? Promise<T> : T;
|
|
22
|
+
export type DecoratorMetadataAsync = DecoratorMetadata & {
|
|
23
|
+
async?: boolean;
|
|
24
|
+
};
|
|
25
|
+
export type ModelConditionalAsync<M> = M extends Model<true> ? Promise<ModelErrorDefinition | undefined> : ModelErrorDefinition | undefined;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy90eXBlcy92YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWNvcmF0b3JNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgTW9kZWwsIE1vZGVsRXJyb3JEZWZpbml0aW9uIH0gZnJvbSBcIi4uL21vZGVsXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbmRpdGlvbmFsbHkgd3JhcHMgYSB0eXBlIGluIGEgYFByb21pc2VgIGJhc2VkIG9uIHRoZSBgQXN5bmNgIGZsYWcuXG4gKiBAc3VtbWFyeSBVdGlsaXR5IHR5cGUgdGhhdCByZXNvbHZlcyB0byBgVGAgaWYgYEFzeW5jYCBpcyBgZmFsc2VgLCBvciB0byBgUHJvbWlzZTxUPmAgaWYgYEFzeW5jYCBpcyBgdHJ1ZWAuXG4gKiBVc2VkIHRvIGFic3RyYWN0IHRoZSByZXR1cm4gdHlwZSBvZiBmdW5jdGlvbnMgdGhhdCBtYXkgYmUgZWl0aGVyIHN5bmNocm9ub3VzIG9yIGFzeW5jaHJvbm91cyBkZXBlbmRpbmcgb24gYSBmbGFnLlxuICpcbiAqIEB0ZW1wbGF0ZSBBc3luYyBBIGJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlc3VsdCBzaG91bGQgYmUgYXN5bmNocm9ub3VzIChgdHJ1ZWApIG9yIHN5bmNocm9ub3VzIChgZmFsc2VgKS5cbiAqIEB0ZW1wbGF0ZSBUIFRoZSBiYXNlIHR5cGUgdG8gcmV0dXJuIGRpcmVjdGx5IG9yIHRvIHdyYXAgaW4gYSBgUHJvbWlzZWAuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIC8vIFN5bmNocm9ub3VzIHJlc3VsdFxuICogdHlwZSBTeW5jUmVzdWx0OiBzdHJpbmcgfCBudW1iZXIgPSBDb25kaXRpb25hbEFzeW5jPGZhbHNlLCBzdHJpbmcgfCBudW1iZXI+O1xuICpcbiAqIC8vIEFzeW5jaHJvbm91cyByZXN1bHRcbiAqIHR5cGUgQXN5bmNSZXN1bHQ6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyPiA9IENvbmRpdGlvbmFsQXN5bmM8dHJ1ZSwgc3RyaW5nIHwgbnVtYmVyPjtcbiAqIGBgYFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICovXG5leHBvcnQgdHlwZSBDb25kaXRpb25hbEFzeW5jPEFzeW5jIGV4dGVuZHMgYm9vbGVhbiwgVD4gPSBBc3luYyBleHRlbmRzIHRydWVcbiAgPyBQcm9taXNlPFQ+XG4gIDogVDtcblxuZXhwb3J0IHR5cGUgRGVjb3JhdG9yTWV0YWRhdGFBc3luYyA9IERlY29yYXRvck1ldGFkYXRhICYgeyBhc3luYz86IGJvb2xlYW4gfTtcblxuZXhwb3J0IHR5cGUgTW9kZWxDb25kaXRpb25hbEFzeW5jPE0+ID1cbiAgTSBleHRlbmRzIE1vZGVsPHRydWU+XG4gICAgPyBQcm9taXNlPE1vZGVsRXJyb3JEZWZpbml0aW9uIHwgdW5kZWZpbmVkPlxuICAgIDogTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQ7XG4iXX0=
|