abstract-type
Advanced tools
Comparing version
@@ -5,2 +5,10 @@ # Changelog | ||
## [2.0.0-alpha.9](https://github.com/snowyu/abstract-type.js/compare/v2.0.0-alpha.8...v2.0.0-alpha.9) (2021-05-10) | ||
### Bug Fixes | ||
* parameterized type(without register) should get attributes correctly ([11bfc84](https://github.com/snowyu/abstract-type.js/commit/11bfc8444e7697c96bab5d193dd81e51ecb97d07)) | ||
* validate value was overwrited this.value wrongly ([a003c43](https://github.com/snowyu/abstract-type.js/commit/a003c43feb7ce7d3f6c1d458dc039a577a0afa15)) | ||
## [2.0.0-alpha.8](https://github.com/snowyu/abstract-type.js/compare/v2.0.0-alpha.7...v2.0.0-alpha.8) (2021-05-08) | ||
@@ -7,0 +15,0 @@ |
@@ -242,4 +242,9 @@ "use strict";Object.defineProperty(exports, "__esModule", { value: true });exports.addItemToArray = addItemToArray;exports.defineProperties = exports.alias = exports.unregister = exports.register = exports.Type = void 0; | ||
(0, _defineProperty2.default)(this, 'errors', null); | ||
const TheType = this.Class || this.constructor; | ||
const TheType = this.constructor; | ||
const $attributes = this.$attributes; | ||
if ((0, _customFactory.isPureObject)(aValue)) { | ||
Object.assign(aOptions, aValue); | ||
aValue = aValue.value; | ||
delete aOptions.value; | ||
} | ||
// merge the options from TheType | ||
@@ -269,3 +274,3 @@ $attributes.initializeTo(aOptions, TheType, { skipUndefined: true }); | ||
const checkValidity = aOptions.checkValidity; | ||
const TheType = this.Class || this.constructor; | ||
const TheType = this.constructor; | ||
@@ -341,3 +346,2 @@ if (aValue instanceof Type) { | ||
result = JSON.stringify(result); | ||
console.log('TCL:: ~ file: abstract-type.ts ~ line 333 ~ Type ~ toJson ~ result', result); | ||
return result; | ||
@@ -419,3 +423,3 @@ } | ||
if (aOptions != null) { | ||
if (!(aOptions instanceof Type) && !(0, _customFactory.isPureObject)(aOptions)) { | ||
if (!(0, _customFactory.isPureObject)(aOptions)) { | ||
aOptions = { value: aOptions }; | ||
@@ -440,3 +444,3 @@ } | ||
skipUndefined: true, | ||
exclude: 'name' }); | ||
exclude: aOptions.value != null ? ['name', 'value'] : 'name' }); | ||
@@ -514,2 +518,2 @@ if (!customValidate) customValidate = aOptions.customValidate; | ||
} | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9hYnN0cmFjdC10eXBlLnRzIl0sIm5hbWVzIjpbIm9iamVjdFRvU3RyaW5nIiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJUeXBlIiwiQ3VzdG9tRmFjdG9yeSIsInJlZ2lzdGVyIiwiYUNsYXNzIiwiYVBhcmVudENsYXNzIiwiYU9wdGlvbnMiLCJ1bmRlZmluZWQiLCJwYXJlbnQiLCJyZXN1bHQiLCJ2UHJvdG90eXBlIiwiJGF0dHJpYnV0ZXMiLCJpbml0aWFsaXplVG8iLCJza2lwVW5kZWZpbmVkIiwidHJ5R2V0VHlwZU5hbWUiLCJ2YWx1ZSIsIm5hbWUiLCJjYWxsIiwiaSIsImxhc3RJbmRleE9mIiwic3Vic3RyaW5nIiwibGVuZ3RoIiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJnZXQiLCJhVHlwZU5hbWUiLCJnZXRWYWx1ZSIsInRvT2JqZWN0IiwiYU5hbWVSZXF1aXJlZCIsInYiLCJ3aXRoVHlwZSIsInR5cGVPbmx5IiwidG9KU09OIiwiaW5zcGVjdCIsIkpTT04iLCJzdHJpbmdpZnkiLCJleGNsdWRlIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsImFWYWx1ZSIsImFUeXBlIiwibmV3IiwidGFyZ2V0IiwiVHlwZUVycm9yIiwiaW5pdGlhbGl6ZSIsIlRoZVR5cGUiLCJDbGFzcyIsIl9pbml0aWFsaXplIiwiYXNzaWduIiwiZmluYWxpemUiLCJlcnJvcnMiLCJfZmluYWxpemUiLCJhRXhjbHVkZSIsImNoZWNrVmFsaWRpdHkiLCJ0b1ZhbHVlIiwidmFsdWVPZiIsInZhbGlkYXRlIiwiX19hc3NpZ24iLCJfdG9PYmplY3QiLCJ0b1R5cGVPYmplY3QiLCJhZGRJdGVtVG9BcnJheSIsImV4cG9ydFRvIiwidG9Kc29uIiwiY29uc29sZSIsImxvZyIsIl9pbnNwZWN0IiwidkF0dHJzIiwiaXNSZXF1aXJlZCIsIm1lcmdlVG8iLCJza2lwTnVsbCIsIl9pc1JlcXVpcmVkIiwidlJlcXVpcmVkIiwiX3ZhbGlkYXRlIiwiZXJyb3IiLCJhTWVzc2FnZSIsInB1c2giLCJtZXNzYWdlIiwidmFsaWRhdGVSZXF1aXJlZCIsInJhaXNlRXJyb3IiLCJfdmFsaWRhdGVSZXF1aXJlZCIsImN1c3RvbVZhbGlkYXRlIiwiaXNWYWxpZCIsImJpbmQiLCJ1bnJlZ2lzdGVyIiwiYWxpYXMiLCJzZXRBbGlhc2VzIiwiZGVmaW5lUHJvcGVydGllcyIsInJlcXVpcmVkIiwiZW51bWVyYWJsZSIsImV4cG9ydGVkIiwiYXNzaWduZWQiLCJ0eXBlIiwiaXRlbXMiLCJBcnJheSIsImlzQXJyYXkiLCJmb3JFYWNoIiwiaXRlbSIsImluZGV4T2YiXSwibWFwcGluZ3MiOiI7QUFDQTs7Ozs7QUFLQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsTUFBTUEsY0FBYyxHQUFHQyxNQUFNLENBQUNDLFNBQVAsQ0FBaUJDLFFBQXhDO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTJCQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLE1BQU1DLElBQU4sU0FBbUJDLDRCQUFuQixDQUFpQzs7QUFFdEM7QUFDRjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNEJFO0FBQ0Y7QUFDQTs7OztBQUlpQixTQUFSQyxRQUFRO0FBQ2JDLEVBQUFBLE1BRGE7QUFFYkMsRUFBQUEsWUFGYTtBQUdiQyxFQUFBQSxRQUhhO0FBSUo7QUFDVDtBQUNBLFFBQUksT0FBT0QsWUFBUCxLQUF3QixRQUE1QixFQUFzQztBQUNwQ0MsTUFBQUEsUUFBUSxHQUFHRCxZQUFYO0FBQ0FBLE1BQUFBLFlBQVksR0FBR0UsU0FBZjtBQUNELEtBSEQsTUFHTyxJQUFJLGlDQUFhRixZQUFiLENBQUosRUFBZ0M7QUFDckNDLE1BQUFBLFFBQVEsR0FBR0QsWUFBWDtBQUNBQSxNQUFBQSxZQUFZLEdBQUdDLFFBQVEsQ0FBRUUsTUFBekI7QUFDRDs7QUFFRCxVQUFNQyxNQUFNLEdBQUcsTUFBTU4sUUFBTixDQUFlQyxNQUFmLEVBQXVCQyxZQUF2QixFQUFx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LE1BQXlCLENBQUMsQ0FBOUIsRUFBaUM7QUFDL0J2RixRQUFBQSxNQUFNLENBQUNrRSxJQUFQLENBQVlxQixJQUFaO0FBQ0Q7QUFDRixLQUpEO0FBS0g7QUFDRCxTQUFPdkYsTUFBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbmltcG9ydCB7XG4gIEN1c3RvbUZhY3RvcnksXG4gIElCYXNlRmFjdG9yeU9wdGlvbnMsXG4gIGlzUHVyZU9iamVjdCxcbn0gZnJvbSAnY3VzdG9tLWZhY3RvcnknXG5pbXBvcnQgcHJvcGVydGllcyBmcm9tICdwcm9wZXJ0eS1tYW5hZ2VyL2xpYi9hYmlsaXR5J1xuaW1wb3J0IHsgSU1lcmdlT3B0aW9ucywgUHJvcERlc2NyaXB0b3JzIH0gZnJvbSAncHJvcGVydHktbWFuYWdlci9saWIvYWJzdHJhY3QnXG5pbXBvcnQgUHJvcGVydGllcyBmcm9tICdwcm9wZXJ0eS1tYW5hZ2VyL2xpYi9wcm9wZXJ0aWVzJ1xuaW1wb3J0IGlzT2JqZWN0IGZyb20gJ3V0aWwtZXgvbGliL2lzL3R5cGUvb2JqZWN0J1xuaW1wb3J0IGlzRnVuY3Rpb24gZnJvbSAndXRpbC1leC9saWIvaXMvdHlwZS9mdW5jdGlvbidcbmltcG9ydCBpc1N0cmluZyBmcm9tICd1dGlsLWV4L2xpYi9pcy90eXBlL3N0cmluZydcbmltcG9ydCBkZWZpbmVQcm9wZXJ0eSBmcm9tICd1dGlsLWV4L2xpYi9kZWZpbmVQcm9wZXJ0eSdcbmltcG9ydCBnZXRQcm90b3R5cGVPZiBmcm9tICdpbmhlcml0cy1leC9saWIvZ2V0UHJvdG90eXBlT2YnXG4vLyBpbXBvcnQgY3JlYXRlQ3RvciBmcm9tICdpbmhlcml0cy1leC9saWIvY3JlYXRlQ3Rvcidcbi8vIGltcG9ydCBpbmhlcml0cyBmcm9tICdpbmhlcml0cy1leC9saWIvaW5oZXJpdHMnXG5cbi8vIGNvbnN0IGV4dGVuZCAgICAgICAgICA9IHJlcXVpcmUoJ3V0aWwtZXgvbGliL19leHRlbmQnKVxuXG5jb25zdCBvYmplY3RUb1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdcbi8vIGNvbnN0IGdldE9iamVjdEtleXMgICA9IE9iamVjdC5rZXlzXG5cbmV4cG9ydCBpbnRlcmZhY2UgSVR5cGVPcHRpb25zIGV4dGVuZHMgSUJhc2VGYWN0b3J5T3B0aW9ucyB7XG4gIFtuYW1lOiBzdHJpbmddOiBhbnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJVHlwZU9iamVjdE9wdGlvbnMgZXh0ZW5kcyBJTWVyZ2VPcHRpb25zIHtcbiAgdHlwZU9ubHk/OiBib29sZWFuXG4gIHJhaXNlRXJyb3I/OiBib29sZWFuXG4gIFtrZXk6IHN0cmluZ106IGFueVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElFcnJvck1lc3NhZ2Uge1xuICBuYW1lOiBzdHJpbmdcbiAgbWVzc2FnZTogc3RyaW5nXG4gIFtpeDogc3RyaW5nXTogYW55XG59XG5cbmV4cG9ydCB0eXBlIFZhbGlkYXRpb25GbiA9ICh0aGlzOiBUeXBlLCB2YWx1ZTogYW55LCBvcHRpb25zPykgPT4gYm9vbGVhblxuZXhwb3J0IHR5cGUgVG9WYWx1ZUZuID0gKHRoaXM6IHR5cGVvZiBUeXBlLCB2YWx1ZTogYW55LCBvcHRpb25zPykgPT4gYW55XG5leHBvcnQgdHlwZSBEZWZpbmVQcm9wZXJ0aWVzRm4gPSAoXG4gIGFUYXJnZXQsXG4gIGFQcm9wZXJ0aWVzOiBQcm9wRGVzY3JpcHRvcnMsXG4gIHJlY3JlYXRlPzogYm9vbGVhblxuKSA9PiBQcm9wZXJ0aWVzXG5leHBvcnQgdHlwZSBDbG9uZUZuID0gKHRoaXM6IFR5cGUsIG9wdGlvbnM/OiBJVHlwZU9iamVjdE9wdGlvbnMpID0+IFR5cGVcbmV4cG9ydCB0eXBlIEV4cG9ydFRvRm4gPSAodGhpczogVHlwZSwgZGVzdCwgb3B0aW9ucz86IElUeXBlT2JqZWN0T3B0aW9ucykgPT4gYW55XG4vKipcbiAqIFRoZSBBYnN0cmFjdCBUeXBlIGluZm9ybWF0aW9uIGNsYXNzXG4gKlxuICovXG5leHBvcnQgY2xhc3MgVHlwZSBleHRlbmRzIEN1c3RvbUZhY3Rvcnkge1xuICBkZWNsYXJlIHN0YXRpYyBkZWZpbmVQcm9wZXJ0aWVzOiBEZWZpbmVQcm9wZXJ0aWVzRm5cbiAgLyoqXG4gICAqIGdldCBhbGwgcHJvcGVydHkgZGVzY3JpcHRvcnMgaW5jbHVkZSBpbmhlcml0ZWQuXG4gICAqL1xuICBkZWNsYXJlIHN0YXRpYyBnZXRQcm9wZXJ0aWVzOiAoKSA9PiBQcm9wRGVzY3JpcHRvcnNcbiAgZGVjbGFyZSBzdGF0aWMgJGF0dHJpYnV0ZXM6IFByb3BlcnRpZXNcblxuICBkZWNsYXJlIHN0YXRpYyB2YWx1ZTogYW55XG4gIGRlY2xhcmUgc3RhdGljIHJlcXVpcmVkOiBib29sZWFuXG4gIGRlY2xhcmUgc3RhdGljIGN1c3RvbVZhbGlkYXRlOiB1bmRlZmluZWQgfCBWYWxpZGF0aW9uRm5cblxuICBkZWNsYXJlIG5hbWU6IHN0cmluZ1xuICBkZWNsYXJlIHZhbHVlOiBhbnlcbiAgZGVjbGFyZSByZXF1aXJlZDogYm9vbGVhblxuICBkZWNsYXJlIGN1c3RvbVZhbGlkYXRlOiB1bmRlZmluZWQgfCBWYWxpZGF0aW9uRm5cblxuICBkZWNsYXJlIENsYXNzOiB0eXBlb2YgVHlwZVxuICBkZWNsYXJlICRhdHRyaWJ1dGVzOiBQcm9wZXJ0aWVzXG4gIGRlY2xhcmUgZ2V0UHJvcGVydGllczogKCkgPT4gUHJvcGVydGllc1xuICBkZWNsYXJlIG1lcmdlVG86IEV4cG9ydFRvRm5cbiAgZGVjbGFyZSBleHBvcnRUbzogRXhwb3J0VG9GblxuICBkZWNsYXJlIGNsb25lVG86IEV4cG9ydFRvRm5cbiAgZGVjbGFyZSBhc3NpZ25UbzogRXhwb3J0VG9GblxuICBkZWNsYXJlIF9fYXNzaWduOiBGdW5jdGlvblxuICBkZWNsYXJlIGNsb25lOiBDbG9uZUZuXG4gIGRlY2xhcmUgaXNTYW1lOiAoc3JjLCBvcHRpb25zPzogSVR5cGVPYmplY3RPcHRpb25zKSA9PiBib29sZWFuXG4gIGRlY2xhcmUgdG9KU09OOiAoKSA9PiBhbnlcblxuICBkZWNsYXJlIHN0YXRpYyB0b1ZhbHVlOiBUb1ZhbHVlRm5cbiAgZGVjbGFyZSBlcnJvcnM6IG51bGwgfCBJRXJyb3JNZXNzYWdlW11cblxuICAvKipcbiAgICogdGhlIHJvb3QgbmFtZVxuICAgKi9cbiAgc3RhdGljIFJPT1RfTkFNRSA9ICd0eXBlJ1xuXG4gIHN0YXRpYyByZWdpc3RlcihhQ2xhc3MsIGFPcHRpb25zPzogc3RyaW5nIHwgSVR5cGVPcHRpb25zKTogYm9vbGVhblxuICBzdGF0aWMgcmVnaXN0ZXIoXG4gICAgYUNsYXNzLFxuICAgIGFQYXJlbnRDbGFzcz86IHR5cGVvZiBUeXBlIHwgc3RyaW5nIHwgSVR5cGVPcHRpb25zLFxuICAgIGFPcHRpb25zPzogc3RyaW5nIHwgSVR5cGVPcHRpb25zXG4gICk6IGJvb2xlYW4ge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHR5cGVvZiBhUGFyZW50Q2xhc3MgPT09ICdzdHJpbmcnKSB7XG4gICAgICBhT3B0aW9ucyA9IGFQYXJlbnRDbGFzc1xuICAgICAgYVBhcmVudENsYXNzID0gdW5kZWZpbmVkXG4gICAgfSBlbHNlIGlmIChpc1B1cmVPYmplY3QoYVBhcmVudENsYXNzKSkge1xuICAgICAgYU9wdGlvbnMgPSBhUGFyZW50Q2xhc3NcbiAgICAgIGFQYXJlbnRDbGFzcyA9IGFPcHRpb25zIS5wYXJlbnRcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBzdXBlci5yZWdpc3RlcihhQ2xhc3MsIGFQYXJlbnRDbGFzcywgYU9wdGlvbnMpXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICBjb25zdCB2UHJvdG90eXBlID0gYUNsYXNzLnByb3RvdHlwZVxuICAgICAgY29uc3QgJGF0dHJpYnV0ZXMgPSB2UHJvdG90eXBlLiRhdHRyaWJ1dGVzXG4gICAgICBpZiAoIWFPcHRpb25zIHx8IGlzU3RyaW5nKGFPcHRpb25zKSkgYU9wdGlvbnMgPSB7fVxuICAgICAgJGF0dHJpYnV0ZXMuaW5pdGlhbGl6ZVRvKGFDbGFzcywgYU9wdGlvbnMsIHsgc2tpcFVuZGVmaW5lZDogdHJ1ZSB9KVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogdHJ5IHRvIGdldCB0aGUgdHlwZSBuYW1lIGZyb20gYSB2YWx1ZVxuICAgKiBAaW50ZXJuYWxcbiAgICogQHBhcmFtIHsqfSB2YWx1ZSB0aGUgdmFsdWVcbiAgICogQHJldHVybnMge3N0cmluZ3x1bmRlZmluZWR9XG4gICAqL1xuICBzdGF0aWMgdHJ5R2V0VHlwZU5hbWUodmFsdWUpIHtcbiAgICBsZXQgcmVzdWx0XG4gICAgaWYgKGlzUHVyZU9iamVjdCh2YWx1ZSkpIHZhbHVlID0gdmFsdWUudmFsdWVcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBUeXBlKSB7XG4gICAgICByZXN1bHQgPSBnZXRQcm90b3R5cGVPZih2YWx1ZSkubmFtZVxuICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QpIHtcbiAgICAgIHJlc3VsdCA9IG9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpXG4gICAgICBjb25zdCBpID0gcmVzdWx0Lmxhc3RJbmRleE9mKCcgJylcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAoaSA+PSAwKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zdWJzdHJpbmcoaSArIDEsIHJlc3VsdC5sZW5ndGggLSAxKVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmVzdWx0ID0gdHlwZW9mIHZhbHVlXG4gICAgICByZXN1bHQgPSByZXN1bHQuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyByZXN1bHQuc3Vic3RyaW5nKDEpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBnZXQgdGhlIFR5cGUgaW5mbyBjbGFzcyBmcm9tIHRoZSB0eXBlIG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0fSBhVHlwZU5hbWUgdGhlIHR5cGUgbmFtZSBvciB2YWx1ZSB3aXRoIHR5cGUgb2JqZWN0XG4gICAqIEBwYXJhbSB7T2JqZWN0PX0gYU9wdGlvbnNcbiAgICogQHJldHVybnMge3R5cGVvZiBUeXBlfHVuZGVmaW5lZH1cbiAgICovXG4gIHN0YXRpYyBnZXQoYVR5cGVOYW1lLCBhT3B0aW9ucz8pIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChhVHlwZU5hbWUpIHtcbiAgICAgIGlmIChpc09iamVjdChhVHlwZU5hbWUpIHx8ICFpc1N0cmluZyhhVHlwZU5hbWUpKSB7XG4gICAgICAgIGFPcHRpb25zID0gYVR5cGVOYW1lXG4gICAgICAgIGNvbnN0ICRhdHRyaWJ1dGVzID0gdGhpcy5wcm90b3R5cGUuJGF0dHJpYnV0ZXNcbiAgICAgICAgLy8gZ2V0IHRoZSB0eXBlIG5hbWUgZm9yIHRoZSB2YWx1ZSB3aXRoIHR5cGUuXG4gICAgICAgIGFUeXBlTmFtZSA9ICRhdHRyaWJ1dGVzLmdldFZhbHVlKGFPcHRpb25zLCAnbmFtZScpXG4gICAgICB9XG4gICAgfVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKGFUeXBlTmFtZSkgcmV0dXJuIHN1cGVyLmdldChhVHlwZU5hbWUpXG4gIH1cblxuICBzdGF0aWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAgIHJldHVybiB0aGlzLnByb3RvdHlwZS5uYW1lIHx8IHRoaXMubmFtZVxuICB9XG5cbiAgc3RhdGljIHRvT2JqZWN0KGFPcHRpb25zPzogSVR5cGVPYmplY3RPcHRpb25zLCBhTmFtZVJlcXVpcmVkPzogYm9vbGVhbikge1xuICAgIGNvbnN0IHYgPSBuZXcgdGhpcyh1bmRlZmluZWQsIGFPcHRpb25zKVxuICAgIGlmICghYU9wdGlvbnMpIGFPcHRpb25zID0ge31cbiAgICBhT3B0aW9ucy53aXRoVHlwZSA9IHRydWVcbiAgICBpZiAoYU9wdGlvbnMudHlwZU9ubHkgPT0gbnVsbCkgYU9wdGlvbnMudHlwZU9ubHkgPSB0cnVlXG4gICAgLy8gaWYgKGFPcHRpb25zLnNraXBEZWZhdWx0ID09IG51bGwpIGFPcHRpb25zLnNraXBEZWZhdWx0ID0gZmFsc2VcbiAgICBjb25zdCByZXN1bHQgPSB2LnRvT2JqZWN0KGFPcHRpb25zLCBhTmFtZVJlcXVpcmVkKVxuICAgIGlmIChcbiAgICAgIGFPcHRpb25zICYmXG4gICAgICBhT3B0aW9ucy50eXBlT25seSA9PT0gZmFsc2UgJiZcbiAgICAgIGFPcHRpb25zLnZhbHVlICE9PSB1bmRlZmluZWRcbiAgICApIHtcbiAgICAgIHJlc3VsdC52YWx1ZSA9IGFPcHRpb25zLnZhbHVlXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIHN0YXRpYyB0b0pTT04oKSB7XG4gICAgcmV0dXJuIHRoaXMudG9PYmplY3QoKVxuICB9XG5cbiAgc3RhdGljIGluc3BlY3QoKSB7XG4gICAgY29uc3QgdiA9IEpTT04uc3RyaW5naWZ5KHRoaXMudG9PYmplY3QoeyBleGNsdWRlOiAnbmFtZScgfSkpLnNsaWNlKDEsIC0xKVxuICAgIGNvbnN0IHJlc3VsdCA9XG4gICAgICAnPHR5cGUgJyArICdcIicgKyB0aGlzLnByb3RvdHlwZS5uYW1lICsgJ1wiJyArICh2ID8gJzogJyArIHYgOiAnJykgKyAnPidcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cbiAgLy8gc3RhdGljIGNyZWF0ZVR5cGUoYVR5cGU/LCBhT3B0aW9ucz8pOiB0eXBlb2YgVHlwZSB7XG4gIC8vICAgaWYgKGlzUHVyZU9iamVjdChhVHlwZSkpIHtcbiAgLy8gICAgIGFPcHRpb25zID0gYVR5cGVcbiAgLy8gICAgIGFUeXBlID0gYU9wdGlvbnMubmFtZVxuICAvLyAgIH1cbiAgLy8gICBpZiAodHlwZW9mIGFUeXBlID09PSAnc3RyaW5nJykge1xuICAvLyAgICAgY29uc3QgcmVzdWx0ID0gY3JlYXRlQ3RvcihhVHlwZSlcbiAgLy8gICAgIGlmICh0aGlzLnJlZ2lzdGVyKHJlc3VsdCwgYU9wdGlvbnMpKSB7XG4gIC8vICAgICAgIHJldHVybiByZXN1bHRcbiAgLy8gICAgIH1cbiAgLy8gICB9XG4gIC8vIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IHZhbHVlIGluc3RhbmNlIG9mIHRoZSB0eXBlXG4gICAqIEBwYXJhbSB7Kn0gYVZhbHVlIHRoZSB2YWx1ZSB0byBjbG9uZVxuICAgKiBAcGFyYW0ge3N0cmluZ3xPYmplY3R9IGFUeXBlIHRoZSB0eXBlIG5hbWUgb3IgdGhlIHR5cGUgb3B0aW9ucyBvYmplY3RcbiAgICogQHBhcmFtIHtPYmplY3R9IGFPcHRpb25zIHRoZSB0eXBlIG9wdGlvbnMgb2JqZWN0XG4gICAqIEByZXR1cm5zIHtUeXBlfSB0aGUgdmFsdWUgb2YgdGhlIHR5cGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKGFWYWx1ZT8sIGFPcHRpb25zPylcbiAgY29uc3RydWN0b3IoYVZhbHVlPywgYVR5cGU/LCBhT3B0aW9ucz8pIHtcbiAgICAvLyBzdXBlcigpIC8vIG9ubHkgZm9yIGdlbmVyYXRlIGRlY2xhcmF0aW9uIGZpbGVcbiAgICBpZiAoaXNQdXJlT2JqZWN0KGFUeXBlKSkge1xuICAgICAgYU9wdGlvbnMgPSBhVHlwZVxuICAgICAgYVR5cGUgPSBhT3B0aW9ucy5uYW1lXG4gICAgfVxuXG4gICAgaWYgKG5ldy50YXJnZXQgPT09IFR5cGUpIHtcbiAgICAgIGlmICghYVR5cGUpIHtcbiAgICAgICAgYVR5cGUgPSAoYU9wdGlvbnMgJiYgYU9wdGlvbnMubmFtZSkgfHwgVHlwZS50cnlHZXRUeXBlTmFtZShhVmFsdWUpXG4gICAgICB9XG5cbiAgICAgIGlmIChpc1N0cmluZyhhVHlwZSkpIHtcbiAgICAgICAgYVR5cGUgPSBUeXBlLmdldChhVHlwZSlcbiAgICAgIH1cblxuICAgICAgaWYgKCFhVHlwZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignY2FuIG5vdCBkZXRlcm1pbmUgdGhlIHZhbHVlIHR5cGUuJylcbiAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgICBpZiAoYVR5cGUgIT09IFR5cGUpIHJldHVybiBuZXcgYVR5cGUoYVZhbHVlLCBhT3B0aW9ucylcbiAgICB9XG4gICAgc3VwZXIoYVZhbHVlLCBhT3B0aW9ucylcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGluaXRpYWxpemUoYVZhbHVlPywgYU9wdGlvbnM6IElUeXBlT2JqZWN0T3B0aW9ucyA9IHt9KSB7XG4gICAgLy8gYU9wdGlvbnMgPSBhT3B0aW9ucyA9PSBudWxsID8ge30gOiBPYmplY3QuYXNzaWduKHt9LCBhT3B0aW9ucylcbiAgICBkZWZpbmVQcm9wZXJ0eSh0aGlzLCAnZXJyb3JzJywgbnVsbClcbiAgICBjb25zdCBUaGVUeXBlID0gdGhpcy5DbGFzcyB8fCB0aGlzLmNvbnN0cnVjdG9yXG4gICAgY29uc3QgJGF0dHJpYnV0ZXMgPSB0aGlzLiRhdHRyaWJ1dGVzXG4gICAgLy8gbWVyZ2UgdGhlIG9wdGlvbnMgZnJvbSBUaGVUeXBlXG4gICAgJGF0dHJpYnV0ZXMuaW5pdGlhbGl6ZVRvKGFPcHRpb25zLCBUaGVUeXBlLCB7IHNraXBVbmRlZmluZWQ6IHRydWUgfSlcbiAgICAkYXR0cmlidXRlcy5pbml0aWFsaXplVG8odGhpcywgYU9wdGlvbnMpXG4gICAgdGhpcy5faW5pdGlhbGl6ZShhVmFsdWUsIGFPcHRpb25zKVxuICAgIHRoaXMuYXNzaWduKGFWYWx1ZSwgYU9wdGlvbnMpXG4gICAgcmV0dXJuICdvaydcbiAgfVxuXG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gIGZpbmFsaXplKGFPcHRpb25zPykge1xuICAgIGlmICh0aGlzLmVycm9ycykgdGhpcy5lcnJvcnMgPSBudWxsXG4gICAgaWYgKHRoaXMudmFsdWUpIHRoaXMudmFsdWUgPSBudWxsXG4gICAgdGhpcy5fZmluYWxpemUoYU9wdGlvbnMpXG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIF9maW5hbGl6ZShhT3B0aW9ucz8pIHt9XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgX2luaXRpYWxpemUoYVZhbHVlPywgYU9wdGlvbnM/KSB7fVxuXG4gIGFzc2lnbihhVmFsdWUsIGFPcHRpb25zPzogSVR5cGVPYmplY3RPcHRpb25zLCBhRXhjbHVkZT86IHN0cmluZyB8IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5lcnJvcnMgPSBbXVxuICAgIGlmICghYU9wdGlvbnMpIGFPcHRpb25zID0ge31cbiAgICBjb25zdCBjaGVja1ZhbGlkaXR5ID0gYU9wdGlvbnMuY2hlY2tWYWxpZGl0eVxuICAgIGNvbnN0IFRoZVR5cGUgPSB0aGlzLkNsYXNzIHx8IHRoaXMuY29uc3RydWN0b3JcblxuICAgIGlmIChhVmFsdWUgaW5zdGFuY2VvZiBUeXBlKSB7XG4gICAgICBhVmFsdWUgPSBhVmFsdWUudG9PYmplY3QoeyB3aXRoVHlwZTogdHJ1ZSB9KVxuICAgIH0gZWxzZSBpZiAoIWlzUHVyZU9iamVjdChhVmFsdWUpKSB7XG4gICAgICBhVmFsdWUgPSB7IHZhbHVlOiBhVmFsdWUgfVxuICAgIH1cblxuICAgIGNvbnN0ICRhdHRyaWJ1dGVzID0gdGhpcy4kYXR0cmlidXRlc1xuICAgICRhdHRyaWJ1dGVzLmluaXRpYWxpemVUbyhhVmFsdWUsIGFPcHRpb25zLCB7XG4gICAgICBza2lwVW5kZWZpbmVkOiB0cnVlLFxuICAgIH0pXG5cbiAgICBsZXQgdmFsdWUgPSBhVmFsdWUudmFsdWVcbiAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgaWYgKGlzRnVuY3Rpb24oVGhlVHlwZS50b1ZhbHVlKSkge1xuICAgICAgICB2YWx1ZSA9IFRoZVR5cGUudG9WYWx1ZSh2YWx1ZSwgYVZhbHVlKSA/PyB2YWx1ZVxuICAgICAgfSAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqLyBlbHNlIGlmIChpc0Z1bmN0aW9uKHZhbHVlLnZhbHVlT2YpKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWUudmFsdWVPZigpXG4gICAgICB9XG4gICAgICBhVmFsdWUudmFsdWUgPSB2YWx1ZVxuICAgIH1cblxuICAgIGlmIChjaGVja1ZhbGlkaXR5ICE9PSBmYWxzZSkgdGhpcy52YWxpZGF0ZShhVmFsdWUsIGNoZWNrVmFsaWRpdHkpXG4gICAgaWYgKGFFeGNsdWRlKSB7XG4gICAgICBhT3B0aW9ucy5leGNsdWRlID0gYUV4Y2x1ZGVcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX19hc3NpZ24oYVZhbHVlLCBhT3B0aW9ucylcbiAgfVxuXG4gIHZhbHVlT2YoKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVPZigpICsgJydcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgX3RvT2JqZWN0KGFPcHRpb25zPzogSVR5cGVPYmplY3RPcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVPZigpXG4gIH1cblxuICB0b1R5cGVPYmplY3QoYU9wdGlvbnM/OiBJVHlwZU9iamVjdE9wdGlvbnMsIGFOYW1lUmVxdWlyZWQgPSB0cnVlKSB7XG4gICAgY29uc3QgZXhjbHVkZSA9IGFOYW1lUmVxdWlyZWQgPyBbJ3ZhbHVlJ10gOiBbJ25hbWUnLCAndmFsdWUnXVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKCFhT3B0aW9ucykgYU9wdGlvbnMgPSB7fVxuICAgIGFPcHRpb25zLmV4Y2x1ZGUgPSBhZGRJdGVtVG9BcnJheShleGNsdWRlLCBhT3B0aW9ucy5leGNsdWRlKVxuICAgIHJldHVybiB0aGlzLmV4cG9ydFRvKHt9LCBhT3B0aW9ucylcbiAgfVxuXG4gIHRvT2JqZWN0KGFPcHRpb25zPzogSVR5cGVPYmplY3RPcHRpb25zLCBhTmFtZVJlcXVpcmVkPzogYm9vbGVhbikge1xuICAgIGNvbnN0IHR5cGVPbmx5ID0gYU9wdGlvbnMgJiYgYU9wdGlvbnMudHlwZU9ubHlcbiAgICBjb25zdCB3aXRoVHlwZSA9IHR5cGVPbmx5IHx8IChhT3B0aW9ucyAmJiBhT3B0aW9ucy53aXRoVHlwZSlcblxuICAgIGxldCByZXN1bHRcbiAgICBpZiAodHlwZU9ubHkgfHwgd2l0aFR5cGUpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMudG9UeXBlT2JqZWN0KGFPcHRpb25zLCBhTmFtZVJlcXVpcmVkKVxuICAgICAgaWYgKCF0eXBlT25seSkge1xuICAgICAgICByZXN1bHQudmFsdWUgPSB0aGlzLl90b09iamVjdChhT3B0aW9ucylcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gdGhpcy5fdG9PYmplY3QoYU9wdGlvbnMpXG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgdG9Kc29uKGFPcHRpb25zPzogSVR5cGVPYmplY3RPcHRpb25zLCBhTmFtZVJlcXVpcmVkPzogYm9vbGVhbikge1xuICAgIGxldCByZXN1bHQgPSB0aGlzLnRvT2JqZWN0KGFPcHRpb25zLCBhTmFtZVJlcXVpcmVkKVxuICAgIHJlc3VsdCA9IEpTT04uc3RyaW5naWZ5KHJlc3VsdClcbiAgICBjb25zb2xlLmxvZygnVENMOjogfiBmaWxlOiBhYnN0cmFjdC10eXBlLnRzIH4gbGluZSAzMzMgfiBUeXBlIH4gdG9Kc29uIH4gcmVzdWx0JywgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBfaW5zcGVjdChhT3B0aW9ucz86IElUeXBlT2JqZWN0T3B0aW9ucywgYU5hbWVSZXF1aXJlZCA9IGZhbHNlKSB7XG4gICAgbGV0IHJlc3VsdCA9ICdcIicgKyB0aGlzLm5hbWUgKyAnXCInXG4gICAgY29uc3QgdkF0dHJzID0gdGhpcy50b0pzb24oYU9wdGlvbnMsIGFOYW1lUmVxdWlyZWQpLnNsaWNlKDEsIC0xKVxuICAgIGlmICh2QXR0cnMpIHJlc3VsdCArPSAnOiAnICsgdkF0dHJzXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgaW5zcGVjdCgpIHtcbiAgICByZXR1cm4gJzx0eXBlICcgKyB0aGlzLl9pbnNwZWN0KHsgd2l0aFR5cGU6IHRydWUgfSkgKyAnPidcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB2YWx1ZSBjYW4gcGFzcyB0aGUgYHJlcXVpcmVkYCBydWxlIGNoZWNrXG4gICAqIEBwYXJhbSBhT3B0aW9uc1xuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgaXNSZXF1aXJlZChhT3B0aW9ucz86IElUeXBlT2JqZWN0T3B0aW9ucykge1xuICAgIGFPcHRpb25zID1cbiAgICAgIHR5cGVvZiBhT3B0aW9ucyAhPT0gJ29iamVjdCdcbiAgICAgICAgPyB0aGlzXG4gICAgICAgIDogdGhpcy5tZXJnZVRvKGFPcHRpb25zLCB7XG4gICAgICAgICAgICBza2lwTnVsbDogdHJ1ZSxcbiAgICAgICAgICAgIHNraXBVbmRlZmluZWQ6IHRydWUsXG4gICAgICAgICAgICBleGNsdWRlOiAnbmFtZScsXG4gICAgICAgICAgfSlcblxuICAgIHJldHVybiB0aGlzLl9pc1JlcXVpcmVkKGFPcHRpb25zIS52YWx1ZSwgYU9wdGlvbnMhKVxuICB9XG5cbiAgX2lzUmVxdWlyZWQoYVZhbHVlLCBhT3B0aW9uczogSVR5cGVPYmplY3RPcHRpb25zKSB7XG4gICAgY29uc3QgdlJlcXVpcmVkID0gdGhpcy4kYXR0cmlidXRlcy5nZXRWYWx1ZShhT3B0aW9ucywgJ3JlcXVpcmVkJylcbiAgICBjb25zdCByZXN1bHQgPSAhdlJlcXVpcmVkIHx8ICh2UmVxdWlyZWQgPT09IHRydWUgJiYgYVZhbHVlICE9IG51bGwpXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBfdmFsaWRhdGUoYVZhbHVlLCBhT3B0aW9uczogSVR5cGVPYmplY3RPcHRpb25zKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGVycm9yKGFNZXNzYWdlLCBhT3B0aW9ucz8pIHtcbiAgICBjb25zdCBuYW1lOiBzdHJpbmcgPVxuICAgICAgKGFPcHRpb25zICYmIHRoaXMuJGF0dHJpYnV0ZXMuZ2V0VmFsdWUoYU9wdGlvbnMsICduYW1lJykpIHx8IHRoaXMubmFtZVxuICAgIHRoaXMuZXJyb3JzPy5wdXNoKHsgbmFtZSwgbWVzc2FnZTogYU1lc3NhZ2UgfSlcbiAgfVxuXG4gIHZhbGlkYXRlUmVxdWlyZWQoYU9wdGlvbnM/OiBJVHlwZU9iamVjdE9wdGlvbnMpIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLmlzUmVxdWlyZWQoYU9wdGlvbnMpXG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIGlmIChhT3B0aW9ucz8ucmFpc2VFcnJvciAhPT0gZmFsc2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCInICsgdGhpcy5uYW1lICsgJ1wiIGlzIHJlcXVpcmVkJylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZXJyb3IoJ2lzIHJlcXVpcmVkJywgYU9wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIF92YWxpZGF0ZVJlcXVpcmVkKGFWYWx1ZSwgYU9wdGlvbnM6IElUeXBlT2JqZWN0T3B0aW9ucykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuX2lzUmVxdWlyZWQoYVZhbHVlLCBhT3B0aW9ucylcbiAgICBpZiAoIXJlc3VsdCkgdGhpcy5lcnJvcignaXMgcmVxdWlyZWQnLCBhT3B0aW9ucylcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvLyB2YWxpZGF0ZShhVmFsdWUsIGFPcHRpb25zfHJhaXNlRXJyb3I/KVxuICB2YWxpZGF0ZShcbiAgICBhT3B0aW9ucz86IElUeXBlT2JqZWN0T3B0aW9ucyB8IGFueSxcbiAgICByYWlzZUVycm9yPzogSVR5cGVPYmplY3RPcHRpb25zIHwgYm9vbGVhblxuICApIHtcbiAgICBsZXQgY3VzdG9tVmFsaWRhdGUhOiBGdW5jdGlvblxuICAgIHRoaXMuZXJyb3JzID0gW11cbiAgICBpZiAoYU9wdGlvbnMgIT0gbnVsbCkge1xuICAgICAgaWYgKCEoYU9wdGlvbnMgaW5zdGFuY2VvZiBUeXBlKSAmJiAhaXNQdXJlT2JqZWN0KGFPcHRpb25zKSkge1xuICAgICAgICBhT3B0aW9ucyA9IHsgdmFsdWU6IGFPcHRpb25zIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYU9wdGlvbnMgPSB7fVxuICAgIH1cblxuICAgIGlmIChpc09iamVjdChyYWlzZUVycm9yKSkge1xuICAgICAgT2JqZWN0LmFzc2lnbihhT3B0aW9ucywgcmFpc2VFcnJvcilcbiAgICAgIHJhaXNlRXJyb3IgPSBhT3B0aW9ucy5yYWlzZUVycm9yXG4gICAgfVxuICAgIGlmIChyYWlzZUVycm9yID09PSB1bmRlZmluZWQpIHJhaXNlRXJyb3IgPSBhT3B0aW9ucy5yYWlzZUVycm9yXG5cbiAgICBjb25zdCAkYXR0cmlidXRlcyA9IHRoaXMuJGF0dHJpYnV0ZXNcbiAgICAvLyBhbGxvdyB1c2UgdGhlIHByb3BlcnR5IGFsaWFzIG9mIGN1c3RvbVZhbGlkYXRlXG4gICAgY3VzdG9tVmFsaWRhdGUgPSAkYXR0cmlidXRlcy5nZXRWYWx1ZShhT3B0aW9ucywgJ2N1c3RvbVZhbGlkYXRlJylcblxuICAgIGFPcHRpb25zID0gdGhpcy5tZXJnZVRvKGFPcHRpb25zLCB7XG4gICAgICBza2lwTnVsbDogdHJ1ZSxcbiAgICAgIHNraXBVbmRlZmluZWQ6IHRydWUsXG4gICAgICBleGNsdWRlOiAnbmFtZScsXG4gICAgfSlcbiAgICBpZiAoIWN1c3RvbVZhbGlkYXRlKSBjdXN0b21WYWxpZGF0ZSA9IGFPcHRpb25zLmN1c3RvbVZhbGlkYXRlXG4gICAgLy8gaWYgKHJhaXNlRXJyb3IgIT09IGZhbHNlKSBhT3B0aW9ucy5yYWlzZUVycm9yID0gdHJ1ZVxuXG4gICAgbGV0IHJlc3VsdCA9IHRoaXMuX3ZhbGlkYXRlUmVxdWlyZWQoYU9wdGlvbnMudmFsdWUsIGFPcHRpb25zKVxuICAgIGlmIChyZXN1bHQgJiYgaXNGdW5jdGlvbihjdXN0b21WYWxpZGF0ZSkpIHtcbiAgICAgIHJlc3VsdCA9IGN1c3RvbVZhbGlkYXRlLmNhbGwodGhpcywgYU9wdGlvbnMudmFsdWUsIGFPcHRpb25zKVxuICAgIH1cbiAgICBpZiAocmVzdWx0ICYmIGFPcHRpb25zLnZhbHVlICE9IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuX3ZhbGlkYXRlKGFPcHRpb25zLnZhbHVlLCBhT3B0aW9ucylcbiAgICB9XG4gICAgaWYgKHJhaXNlRXJyb3IgIT09IGZhbHNlICYmICFyZXN1bHQpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiJyArIGFPcHRpb25zLnZhbHVlICsgJ1wiIGlzIGFuIGludmFsaWQgJyArIHRoaXMubmFtZSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgaXNWYWxpZChhT3B0aW9ucz86IElUeXBlT2JqZWN0T3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLnZhbGlkYXRlKGFPcHRpb25zLCBmYWxzZSlcbiAgfVxufVxucHJvcGVydGllcyhUeXBlLCB7IG5hbWU6ICdhZHZhbmNlJywgZXhjbHVkZTogJ3RvT2JqZWN0JyB9KVxuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXIgPSBUeXBlLnJlZ2lzdGVyLmJpbmQoVHlwZSlcbmV4cG9ydCBjb25zdCB1bnJlZ2lzdGVyID0gVHlwZS51bnJlZ2lzdGVyLmJpbmQoVHlwZSlcbmV4cG9ydCBjb25zdCBhbGlhcyA9IFR5cGUuc2V0QWxpYXNlcy5iaW5kKFR5cGUpXG5leHBvcnQgY29uc3QgZGVmaW5lUHJvcGVydGllcyA9IFR5cGUuZGVmaW5lUHJvcGVydGllc1xuXG5kZWZpbmVQcm9wZXJ0aWVzKFR5cGUsIHtcbiAgbmFtZToge1xuICAgIHJlcXVpcmVkOiB0cnVlLFxuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGV4cG9ydGVkOiB0cnVlLFxuICAgIGFzc2lnbmVkOiB0cnVlLFxuICAgIHR5cGU6ICdTdHJpbmcnLFxuICB9LFxuICByZXF1aXJlZDoge1xuICAgIHR5cGU6ICdCb29sZWFuJyxcbiAgfSxcbiAgY3VzdG9tVmFsaWRhdGU6IHtcbiAgICBhbGlhczogWydjdXN0b20tdmFsaWRhdGUnLCAndmFsaWRhdGUnXSxcbiAgICB0eXBlOiAnZnVuY3Rpb24nLFxuICB9LFxuICB2YWx1ZToge1xuICAgIHR5cGU6ICdhbnknLFxuICB9LFxufSlcblxuZXhwb3J0IGZ1bmN0aW9uIGFkZEl0ZW1Ub0FycmF5KFxuICB2YWx1ZTogc3RyaW5nIHwgc3RyaW5nW10sXG4gIGl0ZW1zOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZFxuKSB7XG4gIGlmICh0eXBlb2YgaXRlbXMgPT09ICdzdHJpbmcnKSB7XG4gICAgaXRlbXMgPSBbaXRlbXNdXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHZhbHVlID0gW3ZhbHVlXVxuICB9XG5cbiAgY29uc3QgcmVzdWx0OiBzdHJpbmdbXSA9IGl0ZW1zID8/IHZhbHVlID8/IFtdXG5cbiAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbXMpKSB7XG4gICAgaWYgKHZhbHVlKVxuICAgICAgdmFsdWUuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LmluZGV4T2YoaXRlbSkgPT09IC0xKSB7XG4gICAgICAgICAgcmVzdWx0LnB1c2goaXRlbSlcbiAgICAgICAgfVxuICAgICAgfSlcbiAgfVxuICByZXR1cm4gcmVzdWx0XG59XG4iXX0= | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9hYnN0cmFjdC10eXBlLnRzIl0sIm5hbWVzIjpbIm9iamVjdFRvU3RyaW5nIiwiT2JqZWN0IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJUeXBlIiwiQ3VzdG9tRmFjdG9yeSIsInJlZ2lzdGVyIiwiYUNsYXNzIiwiYVBhcmVudENsYXNzIiwiYU9wdGlvbnMiLCJ1bmRlZmluZWQiLCJwYXJlbnQiLCJyZXN1bHQiLCJ2UHJvdG90eXBlIiwiJGF0dHJpYnV0ZXMiLCJpbml0aWFsaXplVG8iLCJza2lwVW5kZWZpbmVkIiwidHJ5R2V0VHlwZU5hbWUiLCJ2YWx1ZSIsIm5hbWUiLCJjYWxsIiwiaSIsImxhc3RJbmRleE9mIiwic3Vic3RyaW5nIiwibGVuZ3RoIiwiY2hhckF0IiwidG9VcHBlckNhc2UiLCJnZXQiLCJhVHlwZU5hbWUiLCJnZXRWYWx1ZSIsInRvT2JqZWN0IiwiYU5hbWVSZXF1aXJlZCIsInYiLCJ3aXRoVHlwZSIsInR5cGVPbmx5IiwidG9KU09OIiwiaW5zcGVjdCIsIkpTT04iLCJzdHJpbmdpZnkiLCJleGNsdWRlIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsImFWYWx1ZSIsImFUeXBlIiwibmV3IiwidGFyZ2V0IiwiVHlwZUVycm9yIiwiaW5pdGlhbGl6ZSIsIlRoZVR5cGUiLCJhc3NpZ24iLCJfaW5pdGlhbGl6ZSIsImZpbmFsaXplIiwiZXJyb3JzIiwiX2ZpbmFsaXplIiwiYUV4Y2x1ZGUiLCJjaGVja1ZhbGlkaXR5IiwidG9WYWx1ZSIsInZhbHVlT2YiLCJ2YWxpZGF0ZSIsIl9fYXNzaWduIiwiX3RvT2JqZWN0IiwidG9UeXBlT2JqZWN0IiwiYWRkSXRlbVRvQXJyYXkiLCJleHBvcnRUbyIsInRvSnNvbiIsIl9pbnNwZWN0IiwidkF0dHJzIiwiaXNSZXF1aXJlZCIsIm1lcmdlVG8iLCJza2lwTnVsbCIsIl9pc1JlcXVpcmVkIiwidlJlcXVpcmVkIiwiX3ZhbGlkYXRlIiwiZXJyb3IiLCJhTWVzc2FnZSIsInB1c2giLCJtZXNzYWdlIiwidmFsaWRhdGVSZXF1aXJlZCIsInJhaXNlRXJyb3IiLCJfdmFsaWRhdGVSZXF1aXJlZCIsImN1c3RvbVZhbGlkYXRlIiwiaXNWYWxpZCIsImJpbmQiLCJ1bnJlZ2lzdGVyIiwiYWxpYXMiLCJzZXRBbGlhc2VzIiwiZGVmaW5lUHJvcGVydGllcyIsInJlcXVpcmVkIiwiZW51bWVyYWJsZSIsImV4cG9ydGVkIiwiYXNzaWduZWQiLCJ0eXBlIiwiaXRlbXMiLCJBcnJheSIsImlzQXJyYXkiLCJmb3JFYWNoIiwiaXRlbSIsImluZGV4T2YiXSwibWFwcGluZ3MiOiI7QUFDQTs7Ozs7QUFLQTs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3RjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsTUFBTUEsY0FBYyxHQUFHQyxNQUFNLENBQUNDLFNBQVAsQ0FBaUJDLFFBQXhDO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTJCQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLE1BQU1DLElBQU4sU0FBbUJDLDRCQUFuQixDQUFpQzs7QUFFdEM7QUFDRjtBQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNEJFO0FBQ0Y7QUFDQTs7OztBQUlpQixTQUFSQyxRQUFRO0FBQ2JDLEVBQUFBLE1BRGE7QUFFYkMsRUFBQUEsWUFGYTtBQUdiQyxFQUFBQSxRQUhhO0FBSUo7QUFDVDtBQUNBLFFBQUksT0FBT0QsWUFBUCxLQUF3QixRQUE1QixFQUFzQztBQUNwQ0MsTUFBQUEsUUFBUSxHQUFHRCxZQUFYO0FBQ0FBLE1BQUFBLFlBQVksR0FBR0UsU0FBZjtBQUNELEtBSEQsTUFHTyxJQUFJLGlDQUFhRixZQUFiLENBQUosRUFBZ0M7QUFDckNDLE1BQUFBLFFBQVEsR0FBR0QsWUFBWDtBQUNBQSxNQUFBQSxZQUFZLEdBQUdDLFFBQVEsQ0FBRUUsTUFBekI7QUFDRDs7QUFFRCxVQUFNQyxNQUFNLEdBQUcsTUFBTU4sUUFBTixDQUFlQyxNQUFmLEVBQXVCQyxZQUF2QixFQUFxQ0MsUUFBckMsQ0FBZjtBQUNBO0FBQ0Es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O0FBQ0VBLElBQUFBLEtBQUssQ0FBQzZFLE9BQU4sQ0FBYyxDQUFDQyxJQUFELEtBQVU7QUFDdEIsVUFBSXBGLE1BQU0sQ0FBQ3FGLE9BQVAsQ0FBZUQsSUFBZixNQUF5QixDQUFDLENBQTlCLEVBQWlDO0FBQy9CcEYsUUFBQUEsTUFBTSxDQUFDK0QsSUFBUCxDQUFZcUIsSUFBWjtBQUNEO0FBQ0YsS0FKRDtBQUtIO0FBQ0QsU0FBT3BGLE1BQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG5pbXBvcnQge1xuICBDdXN0b21GYWN0b3J5LFxuICBJQmFzZUZhY3RvcnlPcHRpb25zLFxuICBpc1B1cmVPYmplY3QsXG59IGZyb20gJ2N1c3RvbS1mYWN0b3J5J1xuaW1wb3J0IHByb3BlcnRpZXMgZnJvbSAncHJvcGVydHktbWFuYWdlci9saWIvYWJpbGl0eSdcbmltcG9ydCB7IElNZXJnZU9wdGlvbnMsIFByb3BEZXNjcmlwdG9ycyB9IGZyb20gJ3Byb3BlcnR5LW1hbmFnZXIvbGliL2Fic3RyYWN0J1xuaW1wb3J0IFByb3BlcnRpZXMgZnJvbSAncHJvcGVydHktbWFuYWdlci9saWIvcHJvcGVydGllcydcbmltcG9ydCBpc09iamVjdCBmcm9tICd1dGlsLWV4L2xpYi9pcy90eXBlL29iamVjdCdcbmltcG9ydCBpc0Z1bmN0aW9uIGZyb20gJ3V0aWwtZXgvbGliL2lzL3R5cGUvZnVuY3Rpb24nXG5pbXBvcnQgaXNTdHJpbmcgZnJvbSAndXRpbC1leC9saWIvaXMvdHlwZS9zdHJpbmcnXG5pbXBvcnQgZGVmaW5lUHJvcGVydHkgZnJvbSAndXRpbC1leC9saWIvZGVmaW5lUHJvcGVydHknXG5pbXBvcnQgZ2V0UHJvdG90eXBlT2YgZnJvbSAnaW5oZXJpdHMtZXgvbGliL2dldFByb3RvdHlwZU9mJ1xuLy8gaW1wb3J0IGNyZWF0ZUN0b3IgZnJvbSAnaW5oZXJpdHMtZXgvbGliL2NyZWF0ZUN0b3InXG4vLyBpbXBvcnQgaW5oZXJpdHMgZnJvbSAnaW5oZXJpdHMtZXgvbGliL2luaGVyaXRzJ1xuXG4vLyBjb25zdCBleHRlbmQgICAgICAgICAgPSByZXF1aXJlKCd1dGlsLWV4L2xpYi9fZXh0ZW5kJylcblxuY29uc3Qgb2JqZWN0VG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nXG4vLyBjb25zdCBnZXRPYmplY3RLZXlzICAgPSBPYmplY3Qua2V5c1xuXG5leHBvcnQgaW50ZXJmYWNlIElUeXBlT3B0aW9ucyBleHRlbmRzIElCYXNlRmFjdG9yeU9wdGlvbnMge1xuICBbbmFtZTogc3RyaW5nXTogYW55XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVR5cGVPYmplY3RPcHRpb25zIGV4dGVuZHMgSU1lcmdlT3B0aW9ucyB7XG4gIHR5cGVPbmx5PzogYm9vbGVhblxuICByYWlzZUVycm9yPzogYm9vbGVhblxuICBba2V5OiBzdHJpbmddOiBhbnlcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRXJyb3JNZXNzYWdlIHtcbiAgbmFtZTogc3RyaW5nXG4gIG1lc3NhZ2U6IHN0cmluZ1xuICBbaXg6IHN0cmluZ106IGFueVxufVxuXG5leHBvcnQgdHlwZSBWYWxpZGF0aW9uRm4gPSAodGhpczogVHlwZSwgdmFsdWU6IGFueSwgb3B0aW9ucz8pID0+IGJvb2xlYW5cbmV4cG9ydCB0eXBlIFRvVmFsdWVGbiA9ICh0aGlzOiB0eXBlb2YgVHlwZSwgdmFsdWU6IGFueSwgb3B0aW9ucz8pID0+IGFueVxuZXhwb3J0IHR5cGUgRGVmaW5lUHJvcGVydGllc0ZuID0gKFxuICBhVGFyZ2V0LFxuICBhUHJvcGVydGllczogUHJvcERlc2NyaXB0b3JzLFxuICByZWNyZWF0ZT86IGJvb2xlYW5cbikgPT4gUHJvcGVydGllc1xuZXhwb3J0IHR5cGUgQ2xvbmVGbiA9ICh0aGlzOiBUeXBlLCBvcHRpb25zPzogSVR5cGVPYmplY3RPcHRpb25zKSA9PiBUeXBlXG5leHBvcnQgdHlwZSBFeHBvcnRUb0ZuID0gKHRoaXM6IFR5cGUsIGRlc3QsIG9wdGlvbnM/OiBJVHlwZU9iamVjdE9wdGlvbnMpID0+IGFueVxuLyoqXG4gKiBUaGUgQWJzdHJhY3QgVHlwZSBpbmZvcm1hdGlvbiBjbGFzc1xuICpcbiAqL1xuZXhwb3J0IGNsYXNzIFR5cGUgZXh0ZW5kcyBDdXN0b21GYWN0b3J5IHtcbiAgZGVjbGFyZSBzdGF0aWMgZGVmaW5lUHJvcGVydGllczogRGVmaW5lUHJvcGVydGllc0ZuXG4gIC8qKlxuICAgKiBnZXQgYWxsIHByb3BlcnR5IGRlc2NyaXB0b3JzIGluY2x1ZGUgaW5oZXJpdGVkLlxuICAgKi9cbiAgZGVjbGFyZSBzdGF0aWMgZ2V0UHJvcGVydGllczogKCkgPT4gUHJvcERlc2NyaXB0b3JzXG4gIGRlY2xhcmUgc3RhdGljICRhdHRyaWJ1dGVzOiBQcm9wZXJ0aWVzXG5cbiAgZGVjbGFyZSBzdGF0aWMgdmFsdWU6IGFueVxuICBkZWNsYXJlIHN0YXRpYyByZXF1aXJlZDogYm9vbGVhblxuICBkZWNsYXJlIHN0YXRpYyBjdXN0b21WYWxpZGF0ZTogdW5kZWZpbmVkIHwgVmFsaWRhdGlvbkZuXG5cbiAgZGVjbGFyZSBuYW1lOiBzdHJpbmdcbiAgZGVjbGFyZSB2YWx1ZTogYW55XG4gIGRlY2xhcmUgcmVxdWlyZWQ6IGJvb2xlYW5cbiAgZGVjbGFyZSBjdXN0b21WYWxpZGF0ZTogdW5kZWZpbmVkIHwgVmFsaWRhdGlvbkZuXG5cbiAgZGVjbGFyZSBDbGFzczogdHlwZW9mIFR5cGVcbiAgZGVjbGFyZSAkYXR0cmlidXRlczogUHJvcGVydGllc1xuICBkZWNsYXJlIGdldFByb3BlcnRpZXM6ICgpID0+IFByb3BlcnRpZXNcbiAgZGVjbGFyZSBtZXJnZVRvOiBFeHBvcnRUb0ZuXG4gIGRlY2xhcmUgZXhwb3J0VG86IEV4cG9ydFRvRm5cbiAgZGVjbGFyZSBjbG9uZVRvOiBFeHBvcnRUb0ZuXG4gIGRlY2xhcmUgYXNzaWduVG86IEV4cG9ydFRvRm5cbiAgZGVjbGFyZSBfX2Fzc2lnbjogRnVuY3Rpb25cbiAgZGVjbGFyZSBjbG9uZTogQ2xvbmVGblxuICBkZWNsYXJlIGlzU2FtZTogKHNyYywgb3B0aW9ucz86IElUeXBlT2JqZWN0T3B0aW9ucykgPT4gYm9vbGVhblxuICBkZWNsYXJlIHRvSlNPTjogKCkgPT4gYW55XG5cbiAgZGVjbGFyZSBzdGF0aWMgdG9WYWx1ZTogVG9WYWx1ZUZuXG4gIGRlY2xhcmUgZXJyb3JzOiBudWxsIHwgSUVycm9yTWVzc2FnZVtdXG5cbiAgLyoqXG4gICAqIHRoZSByb290IG5hbWVcbiAgICovXG4gIHN0YXRpYyBST09UX05BTUUgPSAndHlwZSdcblxuICBzdGF0aWMgcmVnaXN0ZXIoYUNsYXNzLCBhT3B0aW9ucz86IHN0cmluZyB8IElUeXBlT3B0aW9ucyk6IGJvb2xlYW5cbiAgc3RhdGljIHJlZ2lzdGVyKFxuICAgIGFDbGFzcyxcbiAgICBhUGFyZW50Q2xhc3M/OiB0eXBlb2YgVHlwZSB8IHN0cmluZyB8IElUeXBlT3B0aW9ucyxcbiAgICBhT3B0aW9ucz86IHN0cmluZyB8IElUeXBlT3B0aW9uc1xuICApOiBib29sZWFuIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmICh0eXBlb2YgYVBhcmVudENsYXNzID09PSAnc3RyaW5nJykge1xuICAgICAgYU9wdGlvbnMgPSBhUGFyZW50Q2xhc3NcbiAgICAgIGFQYXJlbnRDbGFzcyA9IHVuZGVmaW5lZFxuICAgIH0gZWxzZSBpZiAoaXNQdXJlT2JqZWN0KGFQYXJlbnRDbGFzcykpIHtcbiAgICAgIGFPcHRpb25zID0gYVBhcmVudENsYXNzXG4gICAgICBhUGFyZW50Q2xhc3MgPSBhT3B0aW9ucyEucGFyZW50XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gc3VwZXIucmVnaXN0ZXIoYUNsYXNzLCBhUGFyZW50Q2xhc3MsIGFPcHRpb25zKVxuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgY29uc3QgdlByb3RvdHlwZSA9IGFDbGFzcy5wcm90b3R5cGVcbiAgICAgIGNvbnN0ICRhdHRyaWJ1dGVzID0gdlByb3RvdHlwZS4kYXR0cmlidXRlc1xuICAgICAgaWYgKCFhT3B0aW9ucyB8fCBpc1N0cmluZyhhT3B0aW9ucykpIGFPcHRpb25zID0ge31cbiAgICAgICRhdHRyaWJ1dGVzLmluaXRpYWxpemVUbyhhQ2xhc3MsIGFPcHRpb25zLCB7IHNraXBVbmRlZmluZWQ6IHRydWUgfSlcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgLyoqXG4gICAqIHRyeSB0byBnZXQgdGhlIHR5cGUgbmFtZSBmcm9tIGEgdmFsdWVcbiAgICogQGludGVybmFsXG4gICAqIEBwYXJhbSB7Kn0gdmFsdWUgdGhlIHZhbHVlXG4gICAqIEByZXR1cm5zIHtzdHJpbmd8dW5kZWZpbmVkfVxuICAgKi9cbiAgc3RhdGljIHRyeUdldFR5cGVOYW1lKHZhbHVlKSB7XG4gICAgbGV0IHJlc3VsdFxuICAgIGlmIChpc1B1cmVPYmplY3QodmFsdWUpKSB2YWx1ZSA9IHZhbHVlLnZhbHVlXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVHlwZSkge1xuICAgICAgcmVzdWx0ID0gZ2V0UHJvdG90eXBlT2YodmFsdWUpLm5hbWVcbiAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0KSB7XG4gICAgICByZXN1bHQgPSBvYmplY3RUb1N0cmluZy5jYWxsKHZhbHVlKVxuICAgICAgY29uc3QgaSA9IHJlc3VsdC5sYXN0SW5kZXhPZignICcpXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKGkgPj0gMCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKGkgKyAxLCByZXN1bHQubGVuZ3RoIC0gMSlcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJlc3VsdCA9IHR5cGVvZiB2YWx1ZVxuICAgICAgcmVzdWx0ID0gcmVzdWx0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcmVzdWx0LnN1YnN0cmluZygxKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKipcbiAgICogZ2V0IHRoZSBUeXBlIGluZm8gY2xhc3MgZnJvbSB0aGUgdHlwZSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfE9iamVjdH0gYVR5cGVOYW1lIHRoZSB0eXBlIG5hbWUgb3IgdmFsdWUgd2l0aCB0eXBlIG9iamVjdFxuICAgKiBAcGFyYW0ge09iamVjdD19IGFPcHRpb25zXG4gICAqIEByZXR1cm5zIHt0eXBlb2YgVHlwZXx1bmRlZmluZWR9XG4gICAqL1xuICBzdGF0aWMgZ2V0KGFUeXBlTmFtZSwgYU9wdGlvbnM/KSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoYVR5cGVOYW1lKSB7XG4gICAgICBpZiAoaXNPYmplY3QoYVR5cGVOYW1lKSB8fCAhaXNTdHJpbmcoYVR5cGVOYW1lKSkge1xuICAgICAgICBhT3B0aW9ucyA9IGFUeXBlTmFtZVxuICAgICAgICBjb25zdCAkYXR0cmlidXRlcyA9IHRoaXMucHJvdG90eXBlLiRhdHRyaWJ1dGVzXG4gICAgICAgIC8vIGdldCB0aGUgdHlwZSBuYW1lIGZvciB0aGUgdmFsdWUgd2l0aCB0eXBlLlxuICAgICAgICBhVHlwZU5hbWUgPSAkYXR0cmlidXRlcy5nZXRWYWx1ZShhT3B0aW9ucywgJ25hbWUnKVxuICAgICAgfVxuICAgIH1cbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChhVHlwZU5hbWUpIHJldHVybiBzdXBlci5nZXQoYVR5cGVOYW1lKVxuICB9XG5cbiAgc3RhdGljIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi9cbiAgICByZXR1cm4gdGhpcy5wcm90b3R5cGUubmFtZSB8fCB0aGlzLm5hbWVcbiAgfVxuXG4gIHN0YXRpYyB0b09iamVjdChhT3B0aW9ucz86IElUeXBlT2JqZWN0T3B0aW9ucywgYU5hbWVSZXF1aXJlZD86IGJvb2xlYW4pIHtcbiAgICBjb25zdCB2ID0gbmV3IHRoaXModW5kZWZpbmVkLCBhT3B0aW9ucylcbiAgICBpZiAoIWFPcHRpb25zKSBhT3B0aW9ucyA9IHt9XG4gICAgYU9wdGlvbnMud2l0aFR5cGUgPSB0cnVlXG4gICAgaWYgKGFPcHRpb25zLnR5cGVPbmx5ID09IG51bGwpIGFPcHRpb25zLnR5cGVPbmx5ID0gdHJ1ZVxuICAgIC8vIGlmIChhT3B0aW9ucy5za2lwRGVmYXVsdCA9PSBudWxsKSBhT3B0aW9ucy5za2lwRGVmYXVsdCA9IGZhbHNlXG4gICAgY29uc3QgcmVzdWx0ID0gdi50b09iamVjdChhT3B0aW9ucywgYU5hbWVSZXF1aXJlZClcbiAgICBpZiAoXG4gICAgICBhT3B0aW9ucyAmJlxuICAgICAgYU9wdGlvbnMudHlwZU9ubHkgPT09IGZhbHNlICYmXG4gICAgICBhT3B0aW9ucy52YWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgKSB7XG4gICAgICByZXN1bHQudmFsdWUgPSBhT3B0aW9ucy52YWx1ZVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBzdGF0aWMgdG9KU09OKCkge1xuICAgIHJldHVybiB0aGlzLnRvT2JqZWN0KClcbiAgfVxuXG4gIHN0YXRpYyBpbnNwZWN0KCkge1xuICAgIGNvbnN0IHYgPSBKU09OLnN0cmluZ2lmeSh0aGlzLnRvT2JqZWN0KHsgZXhjbHVkZTogJ25hbWUnIH0pKS5zbGljZSgxLCAtMSlcbiAgICBjb25zdCByZXN1bHQgPVxuICAgICAgJzx0eXBlICcgKyAnXCInICsgdGhpcy5wcm90b3R5cGUubmFtZSArICdcIicgKyAodiA/ICc6ICcgKyB2IDogJycpICsgJz4nXG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG4gIC8vIHN0YXRpYyBjcmVhdGVUeXBlKGFUeXBlPywgYU9wdGlvbnM/KTogdHlwZW9mIFR5cGUge1xuICAvLyAgIGlmIChpc1B1cmVPYmplY3QoYVR5cGUpKSB7XG4gIC8vICAgICBhT3B0aW9ucyA9IGFUeXBlXG4gIC8vICAgICBhVHlwZSA9IGFPcHRpb25zLm5hbWVcbiAgLy8gICB9XG4gIC8vICAgaWYgKHR5cGVvZiBhVHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgLy8gICAgIGNvbnN0IHJlc3VsdCA9IGNyZWF0ZUN0b3IoYVR5cGUpXG4gIC8vICAgICBpZiAodGhpcy5yZWdpc3RlcihyZXN1bHQsIGFPcHRpb25zKSkge1xuICAvLyAgICAgICByZXR1cm4gcmVzdWx0XG4gIC8vICAgICB9XG4gIC8vICAgfVxuICAvLyB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5ldyB2YWx1ZSBpbnN0YW5jZSBvZiB0aGUgdHlwZVxuICAgKiBAcGFyYW0geyp9IGFWYWx1ZSB0aGUgdmFsdWUgdG8gY2xvbmVcbiAgICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0fSBhVHlwZSB0aGUgdHlwZSBuYW1lIG9yIHRoZSB0eXBlIG9wdGlvbnMgb2JqZWN0XG4gICAqIEBwYXJhbSB7T2JqZWN0fSBhT3B0aW9ucyB0aGUgdHlwZSBvcHRpb25zIG9iamVjdFxuICAgKiBAcmV0dXJucyB7VHlwZX0gdGhlIHZhbHVlIG9mIHRoZSB0eXBlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhVmFsdWU/LCBhT3B0aW9ucz8pXG4gIGNvbnN0cnVjdG9yKGFWYWx1ZT8sIGFUeXBlPywgYU9wdGlvbnM/KSB7XG4gICAgLy8gc3VwZXIoKSAvLyBvbmx5IGZvciBnZW5lcmF0ZSBkZWNsYXJhdGlvbiBmaWxlXG4gICAgaWYgKGlzUHVyZU9iamVjdChhVHlwZSkpIHtcbiAgICAgIGFPcHRpb25zID0gYVR5cGVcbiAgICAgIGFUeXBlID0gYU9wdGlvbnMubmFtZVxuICAgIH1cblxuICAgIGlmIChuZXcudGFyZ2V0ID09PSBUeXBlKSB7XG4gICAgICBpZiAoIWFUeXBlKSB7XG4gICAgICAgIGFUeXBlID0gKGFPcHRpb25zICYmIGFPcHRpb25zLm5hbWUpIHx8IFR5cGUudHJ5R2V0VHlwZU5hbWUoYVZhbHVlKVxuICAgICAgfVxuXG4gICAgICBpZiAoaXNTdHJpbmcoYVR5cGUpKSB7XG4gICAgICAgIGFUeXBlID0gVHlwZS5nZXQoYVR5cGUpXG4gICAgICB9XG5cbiAgICAgIGlmICghYVR5cGUpIHRocm93IG5ldyBUeXBlRXJyb3IoJ2NhbiBub3QgZGV0ZXJtaW5lIHRoZSB2YWx1ZSB0eXBlLicpXG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgICAgaWYgKGFUeXBlICE9PSBUeXBlKSByZXR1cm4gbmV3IGFUeXBlKGFWYWx1ZSwgYU9wdGlvbnMpXG4gICAgfVxuICAgIHN1cGVyKGFWYWx1ZSwgYU9wdGlvbnMpXG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBpbml0aWFsaXplKGFWYWx1ZT8sIGFPcHRpb25zOiBJVHlwZU9iamVjdE9wdGlvbnMgPSB7fSkge1xuICAgIC8vIGFPcHRpb25zID0gYU9wdGlvbnMgPT0gbnVsbCA/IHt9IDogT2JqZWN0LmFzc2lnbih7fSwgYU9wdGlvbnMpXG4gICAgZGVmaW5lUHJvcGVydHkodGhpcywgJ2Vycm9ycycsIG51bGwpXG4gICAgY29uc3QgVGhlVHlwZSA9IHRoaXMuY29uc3RydWN0b3JcbiAgICBjb25zdCAkYXR0cmlidXRlcyA9IHRoaXMuJGF0dHJpYnV0ZXNcbiAgICBpZiAoaXNQdXJlT2JqZWN0KGFWYWx1ZSkpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oYU9wdGlvbnMsIGFWYWx1ZSlcbiAgICAgIGFWYWx1ZSA9IGFWYWx1ZS52YWx1ZVxuICAgICAgZGVsZXRlIGFPcHRpb25zLnZhbHVlXG4gICAgfVxuICAgIC8vIG1lcmdlIHRoZSBvcHRpb25zIGZyb20gVGhlVHlwZVxuICAgICRhdHRyaWJ1dGVzLmluaXRpYWxpemVUbyhhT3B0aW9ucywgVGhlVHlwZSwgeyBza2lwVW5kZWZpbmVkOiB0cnVlIH0pXG4gICAgJGF0dHJpYnV0ZXMuaW5pdGlhbGl6ZVRvKHRoaXMsIGFPcHRpb25zKVxuICAgIHRoaXMuX2luaXRpYWxpemUoYVZhbHVlLCBhT3B0aW9ucylcbiAgICB0aGlzLmFzc2lnbihhVmFsdWUsIGFPcHRpb25zKVxuICAgIHJldHVybiAnb2snXG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICBmaW5hbGl6ZShhT3B0aW9ucz8pIHtcbiAgICBpZiAodGhpcy5lcnJvcnMpIHRoaXMuZXJyb3JzID0gbnVsbFxuICAgIGlmICh0aGlzLnZhbHVlKSB0aGlzLnZhbHVlID0gbnVsbFxuICAgIHRoaXMuX2ZpbmFsaXplKGFPcHRpb25zKVxuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBfZmluYWxpemUoYU9wdGlvbnM/KSB7fVxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIF9pbml0aWFsaXplKGFWYWx1ZT8sIGFPcHRpb25zPykge31cblxuICBhc3NpZ24oYVZhbHVlLCBhT3B0aW9ucz86IElUeXBlT2JqZWN0T3B0aW9ucywgYUV4Y2x1ZGU/OiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIHRoaXMuZXJyb3JzID0gW11cbiAgICBpZiAoIWFPcHRpb25zKSBhT3B0aW9ucyA9IHt9XG4gICAgY29uc3QgY2hlY2tWYWxpZGl0eSA9IGFPcHRpb25zLmNoZWNrVmFsaWRpdHlcbiAgICBjb25zdCBUaGVUeXBlID0gdGhpcy5jb25zdHJ1Y3RvclxuXG4gICAgaWYgKGFWYWx1ZSBpbnN0YW5jZW9mIFR5cGUpIHtcbiAgICAgIGFWYWx1ZSA9IGFWYWx1ZS50b09iamVjdCh7IHdpdGhUeXBlOiB0cnVlIH0pXG4gICAgfSBlbHNlIGlmICghaXNQdXJlT2JqZWN0KGFWYWx1ZSkpIHtcbiAgICAgIGFWYWx1ZSA9IHsgdmFsdWU6IGFWYWx1ZSB9XG4gICAgfVxuXG4gICAgY29uc3QgJGF0dHJpYnV0ZXMgPSB0aGlzLiRhdHRyaWJ1dGVzXG4gICAgJGF0dHJpYnV0ZXMuaW5pdGlhbGl6ZVRvKGFWYWx1ZSwgYU9wdGlvbnMsIHtcbiAgICAgIHNraXBVbmRlZmluZWQ6IHRydWUsXG4gICAgfSlcblxuICAgIGxldCB2YWx1ZSA9IGFWYWx1ZS52YWx1ZVxuICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICBpZiAoaXNGdW5jdGlvbihUaGVUeXBlLnRvVmFsdWUpKSB7XG4gICAgICAgIHZhbHVlID0gVGhlVHlwZS50b1ZhbHVlKHZhbHVlLCBhVmFsdWUpID8/IHZhbHVlXG4gICAgICB9IC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovIGVsc2UgaWYgKGlzRnVuY3Rpb24odmFsdWUudmFsdWVPZikpIHtcbiAgICAgICAgdmFsdWUgPSB2YWx1ZS52YWx1ZU9mKClcbiAgICAgIH1cbiAgICAgIGFWYWx1ZS52YWx1ZSA9IHZhbHVlXG4gICAgfVxuXG4gICAgaWYgKGNoZWNrVmFsaWRpdHkgIT09IGZhbHNlKSB0aGlzLnZhbGlkYXRlKGFWYWx1ZSwgY2hlY2tWYWxpZGl0eSlcbiAgICBpZiAoYUV4Y2x1ZGUpIHtcbiAgICAgIGFPcHRpb25zLmV4Y2x1ZGUgPSBhRXhjbHVkZVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fX2Fzc2lnbihhVmFsdWUsIGFPcHRpb25zKVxuICB9XG5cbiAgdmFsdWVPZigpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZVxuICB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgKyAnJ1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBfdG9PYmplY3QoYU9wdGlvbnM/OiBJVHlwZU9iamVjdE9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZU9mKClcbiAgfVxuXG4gIHRvVHlwZU9iamVjdChhT3B0aW9ucz86IElUeXBlT2JqZWN0T3B0aW9ucywgYU5hbWVSZXF1aXJlZCA9IHRydWUpIHtcbiAgICBjb25zdCBleGNsdWRlID0gYU5hbWVSZXF1aXJlZCA/IFsndmFsdWUnXSA6IFsnbmFtZScsICd2YWx1ZSddXG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoIWFPcHRpb25zKSBhT3B0aW9ucyA9IHt9XG4gICAgYU9wdGlvbnMuZXhjbHVkZSA9IGFkZEl0ZW1Ub0FycmF5KGV4Y2x1ZGUsIGFPcHRpb25zLmV4Y2x1ZGUpXG4gICAgcmV0dXJuIHRoaXMuZXhwb3J0VG8oe30sIGFPcHRpb25zKVxuICB9XG5cbiAgdG9PYmplY3QoYU9wdGlvbnM/OiBJVHlwZU9iamVjdE9wdGlvbnMsIGFOYW1lUmVxdWlyZWQ/OiBib29sZWFuKSB7XG4gICAgY29uc3QgdHlwZU9ubHkgPSBhT3B0aW9ucyAmJiBhT3B0aW9ucy50eXBlT25seVxuICAgIGNvbnN0IHdpdGhUeXBlID0gdHlwZU9ubHkgfHwgKGFPcHRpb25zICYmIGFPcHRpb25zLndpdGhUeXBlKVxuXG4gICAgbGV0IHJlc3VsdFxuICAgIGlmICh0eXBlT25seSB8fCB3aXRoVHlwZSkge1xuICAgICAgcmVzdWx0ID0gdGhpcy50b1R5cGVPYmplY3QoYU9wdGlvbnMsIGFOYW1lUmVxdWlyZWQpXG4gICAgICBpZiAoIXR5cGVPbmx5KSB7XG4gICAgICAgIHJlc3VsdC52YWx1ZSA9IHRoaXMuX3RvT2JqZWN0KGFPcHRpb25zKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSB0aGlzLl90b09iamVjdChhT3B0aW9ucylcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICB0b0pzb24oYU9wdGlvbnM/OiBJVHlwZU9iamVjdE9wdGlvbnMsIGFOYW1lUmVxdWlyZWQ/OiBib29sZWFuKSB7XG4gICAgbGV0IHJlc3VsdCA9IHRoaXMudG9PYmplY3QoYU9wdGlvbnMsIGFOYW1lUmVxdWlyZWQpXG4gICAgcmVzdWx0ID0gSlNPTi5zdHJpbmdpZnkocmVzdWx0KVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIF9pbnNwZWN0KGFPcHRpb25zPzogSVR5cGVPYmplY3RPcHRpb25zLCBhTmFtZVJlcXVpcmVkID0gZmFsc2UpIHtcbiAgICBsZXQgcmVzdWx0ID0gJ1wiJyArIHRoaXMubmFtZSArICdcIidcbiAgICBjb25zdCB2QXR0cnMgPSB0aGlzLnRvSnNvbihhT3B0aW9ucywgYU5hbWVSZXF1aXJlZCkuc2xpY2UoMSwgLTEpXG4gICAgaWYgKHZBdHRycykgcmVzdWx0ICs9ICc6ICcgKyB2QXR0cnNcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBpbnNwZWN0KCkge1xuICAgIHJldHVybiAnPHR5cGUgJyArIHRoaXMuX2luc3BlY3QoeyB3aXRoVHlwZTogdHJ1ZSB9KSArICc+J1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHZhbHVlIGNhbiBwYXNzIHRoZSBgcmVxdWlyZWRgIHJ1bGUgY2hlY2tcbiAgICogQHBhcmFtIGFPcHRpb25zXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBpc1JlcXVpcmVkKGFPcHRpb25zPzogSVR5cGVPYmplY3RPcHRpb25zKSB7XG4gICAgYU9wdGlvbnMgPVxuICAgICAgdHlwZW9mIGFPcHRpb25zICE9PSAnb2JqZWN0J1xuICAgICAgICA/IHRoaXNcbiAgICAgICAgOiB0aGlzLm1lcmdlVG8oYU9wdGlvbnMsIHtcbiAgICAgICAgICAgIHNraXBOdWxsOiB0cnVlLFxuICAgICAgICAgICAgc2tpcFVuZGVmaW5lZDogdHJ1ZSxcbiAgICAgICAgICAgIGV4Y2x1ZGU6ICduYW1lJyxcbiAgICAgICAgICB9KVxuXG4gICAgcmV0dXJuIHRoaXMuX2lzUmVxdWlyZWQoYU9wdGlvbnMhLnZhbHVlLCBhT3B0aW9ucyEpXG4gIH1cblxuICBfaXNSZXF1aXJlZChhVmFsdWUsIGFPcHRpb25zOiBJVHlwZU9iamVjdE9wdGlvbnMpIHtcbiAgICBjb25zdCB2UmVxdWlyZWQgPSB0aGlzLiRhdHRyaWJ1dGVzLmdldFZhbHVlKGFPcHRpb25zLCAncmVxdWlyZWQnKVxuICAgIGNvbnN0IHJlc3VsdCA9ICF2UmVxdWlyZWQgfHwgKHZSZXF1aXJlZCA9PT0gdHJ1ZSAmJiBhVmFsdWUgIT0gbnVsbClcbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqL1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIF92YWxpZGF0ZShhVmFsdWUsIGFPcHRpb25zOiBJVHlwZU9iamVjdE9wdGlvbnMpIHtcbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgZXJyb3IoYU1lc3NhZ2UsIGFPcHRpb25zPykge1xuICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9XG4gICAgICAoYU9wdGlvbnMgJiYgdGhpcy4kYXR0cmlidXRlcy5nZXRWYWx1ZShhT3B0aW9ucywgJ25hbWUnKSkgfHwgdGhpcy5uYW1lXG4gICAgdGhpcy5lcnJvcnM/LnB1c2goeyBuYW1lLCBtZXNzYWdlOiBhTWVzc2FnZSB9KVxuICB9XG5cbiAgdmFsaWRhdGVSZXF1aXJlZChhT3B0aW9ucz86IElUeXBlT2JqZWN0T3B0aW9ucykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuaXNSZXF1aXJlZChhT3B0aW9ucylcbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgaWYgKGFPcHRpb25zPy5yYWlzZUVycm9yICE9PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcIicgKyB0aGlzLm5hbWUgKyAnXCIgaXMgcmVxdWlyZWQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5lcnJvcignaXMgcmVxdWlyZWQnLCBhT3B0aW9ucylcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdFxuICB9XG5cbiAgX3ZhbGlkYXRlUmVxdWlyZWQoYVZhbHVlLCBhT3B0aW9uczogSVR5cGVPYmplY3RPcHRpb25zKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5faXNSZXF1aXJlZChhVmFsdWUsIGFPcHRpb25zKVxuICAgIGlmICghcmVzdWx0KSB0aGlzLmVycm9yKCdpcyByZXF1aXJlZCcsIGFPcHRpb25zKVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8vIHZhbGlkYXRlKGFWYWx1ZSwgYU9wdGlvbnN8cmFpc2VFcnJvcj8pXG4gIHZhbGlkYXRlKFxuICAgIGFPcHRpb25zPzogSVR5cGVPYmplY3RPcHRpb25zIHwgYW55LFxuICAgIHJhaXNlRXJyb3I/OiBJVHlwZU9iamVjdE9wdGlvbnMgfCBib29sZWFuXG4gICkge1xuICAgIGxldCBjdXN0b21WYWxpZGF0ZSE6IEZ1bmN0aW9uXG4gICAgdGhpcy5lcnJvcnMgPSBbXVxuICAgIGlmIChhT3B0aW9ucyAhPSBudWxsKSB7XG4gICAgICBpZiAoIWlzUHVyZU9iamVjdChhT3B0aW9ucykpIHtcbiAgICAgICAgYU9wdGlvbnMgPSB7IHZhbHVlOiBhT3B0aW9ucyB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGFPcHRpb25zID0ge31cbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3QocmFpc2VFcnJvcikpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oYU9wdGlvbnMsIHJhaXNlRXJyb3IpXG4gICAgICByYWlzZUVycm9yID0gYU9wdGlvbnMucmFpc2VFcnJvclxuICAgIH1cbiAgICBpZiAocmFpc2VFcnJvciA9PT0gdW5kZWZpbmVkKSByYWlzZUVycm9yID0gYU9wdGlvbnMucmFpc2VFcnJvclxuXG4gICAgY29uc3QgJGF0dHJpYnV0ZXMgPSB0aGlzLiRhdHRyaWJ1dGVzXG4gICAgLy8gYWxsb3cgdXNlIHRoZSBwcm9wZXJ0eSBhbGlhcyBvZiBjdXN0b21WYWxpZGF0ZVxuICAgIGN1c3RvbVZhbGlkYXRlID0gJGF0dHJpYnV0ZXMuZ2V0VmFsdWUoYU9wdGlvbnMsICdjdXN0b21WYWxpZGF0ZScpXG5cbiAgICBhT3B0aW9ucyA9IHRoaXMubWVyZ2VUbyhhT3B0aW9ucywge1xuICAgICAgc2tpcE51bGw6IHRydWUsXG4gICAgICBza2lwVW5kZWZpbmVkOiB0cnVlLFxuICAgICAgZXhjbHVkZTogYU9wdGlvbnMudmFsdWUgIT0gbnVsbCA/IFsnbmFtZScsICd2YWx1ZSddIDogJ25hbWUnLFxuICAgIH0pXG4gICAgaWYgKCFjdXN0b21WYWxpZGF0ZSkgY3VzdG9tVmFsaWRhdGUgPSBhT3B0aW9ucy5jdXN0b21WYWxpZGF0ZVxuICAgIC8vIGlmIChyYWlzZUVycm9yICE9PSBmYWxzZSkgYU9wdGlvbnMucmFpc2VFcnJvciA9IHRydWVcblxuICAgIGxldCByZXN1bHQgPSB0aGlzLl92YWxpZGF0ZVJlcXVpcmVkKGFPcHRpb25zLnZhbHVlLCBhT3B0aW9ucylcbiAgICBpZiAocmVzdWx0ICYmIGlzRnVuY3Rpb24oY3VzdG9tVmFsaWRhdGUpKSB7XG4gICAgICByZXN1bHQgPSBjdXN0b21WYWxpZGF0ZS5jYWxsKHRoaXMsIGFPcHRpb25zLnZhbHVlLCBhT3B0aW9ucylcbiAgICB9XG4gICAgaWYgKHJlc3VsdCAmJiBhT3B0aW9ucy52YWx1ZSAhPSBudWxsKSB7XG4gICAgICByZXN1bHQgPSB0aGlzLl92YWxpZGF0ZShhT3B0aW9ucy52YWx1ZSwgYU9wdGlvbnMpXG4gICAgfVxuICAgIGlmIChyYWlzZUVycm9yICE9PSBmYWxzZSAmJiAhcmVzdWx0KSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcIicgKyBhT3B0aW9ucy52YWx1ZSArICdcIiBpcyBhbiBpbnZhbGlkICcgKyB0aGlzLm5hbWUpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIGlzVmFsaWQoYU9wdGlvbnM/OiBJVHlwZU9iamVjdE9wdGlvbnMpIHtcbiAgICByZXR1cm4gdGhpcy52YWxpZGF0ZShhT3B0aW9ucywgZmFsc2UpXG4gIH1cbn1cbnByb3BlcnRpZXMoVHlwZSwgeyBuYW1lOiAnYWR2YW5jZScsIGV4Y2x1ZGU6ICd0b09iamVjdCcgfSlcblxuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyID0gVHlwZS5yZWdpc3Rlci5iaW5kKFR5cGUpXG5leHBvcnQgY29uc3QgdW5yZWdpc3RlciA9IFR5cGUudW5yZWdpc3Rlci5iaW5kKFR5cGUpXG5leHBvcnQgY29uc3QgYWxpYXMgPSBUeXBlLnNldEFsaWFzZXMuYmluZChUeXBlKVxuZXhwb3J0IGNvbnN0IGRlZmluZVByb3BlcnRpZXMgPSBUeXBlLmRlZmluZVByb3BlcnRpZXNcblxuZGVmaW5lUHJvcGVydGllcyhUeXBlLCB7XG4gIG5hbWU6IHtcbiAgICByZXF1aXJlZDogdHJ1ZSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBleHBvcnRlZDogdHJ1ZSxcbiAgICBhc3NpZ25lZDogdHJ1ZSxcbiAgICB0eXBlOiAnU3RyaW5nJyxcbiAgfSxcbiAgcmVxdWlyZWQ6IHtcbiAgICB0eXBlOiAnQm9vbGVhbicsXG4gIH0sXG4gIGN1c3RvbVZhbGlkYXRlOiB7XG4gICAgYWxpYXM6IFsnY3VzdG9tLXZhbGlkYXRlJywgJ3ZhbGlkYXRlJ10sXG4gICAgdHlwZTogJ2Z1bmN0aW9uJyxcbiAgfSxcbiAgdmFsdWU6IHtcbiAgICB0eXBlOiAnYW55JyxcbiAgfSxcbn0pXG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRJdGVtVG9BcnJheShcbiAgdmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdLFxuICBpdGVtczogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWRcbikge1xuICBpZiAodHlwZW9mIGl0ZW1zID09PSAnc3RyaW5nJykge1xuICAgIGl0ZW1zID0gW2l0ZW1zXVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWx1ZSA9IFt2YWx1ZV1cbiAgfVxuXG4gIGNvbnN0IHJlc3VsdDogc3RyaW5nW10gPSBpdGVtcyA/PyB2YWx1ZSA/PyBbXVxuXG4gIGlmIChBcnJheS5pc0FycmF5KGl0ZW1zKSkge1xuICAgIGlmICh2YWx1ZSlcbiAgICAgIHZhbHVlLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC5pbmRleE9mKGl0ZW0pID09PSAtMSkge1xuICAgICAgICAgIHJlc3VsdC5wdXNoKGl0ZW0pXG4gICAgICAgIH1cbiAgICAgIH0pXG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuIl19 |
{ | ||
"name": "abstract-type", | ||
"description": "The abstract-type library includes the abstract `Type` class for streamable type info and validating value.", | ||
"version": "2.0.0-alpha.8", | ||
"version": "2.0.0-alpha.9", | ||
"homepage": "https://github.com/snowyu/abstract-type.js", | ||
@@ -56,3 +56,3 @@ "repository": { | ||
"babel-plugin-module-resolver": "^4.1.0", | ||
"eslint": "^7.24.0", | ||
"eslint": "^7.26.0", | ||
"eslint-config-prettier": "^8.3.0", | ||
@@ -64,3 +64,3 @@ "eslint-plugin-prettier": "^3.4.0", | ||
"nps-utils": "^1.7.0", | ||
"prettier": "^2.2.1", | ||
"prettier": "^2.3.0", | ||
"typedoc": "^0.20.36", | ||
@@ -73,3 +73,3 @@ "typedoc-plugin-markdown": "^3.7.2", | ||
"inherits-ex": "^1.3.5", | ||
"property-manager": "^1.6.0", | ||
"property-manager": "^1.6.1", | ||
"util-ex": "^0.3.15" | ||
@@ -76,0 +76,0 @@ }, |
@@ -194,2 +194,16 @@ import 'jest-extended' | ||
}) | ||
it('should create parameterized type', () => { | ||
class Positive extends NumberType { | ||
static min = 6 | ||
_validate(value, aOptions) { | ||
let result = !(value < aOptions.min) | ||
if (result) result = !(value > aOptions.max) | ||
return result | ||
} | ||
} | ||
const result = new Positive(8) | ||
expect(result).toHaveProperty('min', 6) | ||
expect(result.isValid()).toBeTrue() | ||
expect(result.validate(-1, false)).toBeFalse() | ||
}) | ||
}) | ||
@@ -352,4 +366,11 @@ describe('.toString', () => { | ||
class IntType extends NumberType { | ||
_validate(value) { | ||
return isInteger(value) | ||
_validate(value, aOptions) { | ||
let result = isInteger(value) | ||
if (result && aOptions.min != null) { | ||
result = value >= aOptions.min | ||
} | ||
if (result && aOptions.max != null) { | ||
result = value <= aOptions.max | ||
} | ||
return result | ||
} | ||
@@ -377,9 +398,20 @@ } | ||
it('should validate another value', () => { | ||
const result = new IntType(33) | ||
const result = new IntType(33, { min: 33 }) | ||
expect(result.validate()).toBeTrue() | ||
expect(result.validate(33.3, { raiseError: false })).toBeFalse() | ||
expect(result.validate(33.3, false)).toBeFalse() | ||
expect(result.validate(31, false)).toBeFalse() | ||
expect(() => result.validate(3.33)).toThrow('is an invalid') | ||
expect(() => result.validate({ value: 3.33 })).toThrow('is an invalid') | ||
}) | ||
it('should validate another Type data', () => { | ||
const result = new IntType(33, { min: 33}) | ||
expect( | ||
result.validate(new NumberType(40.2), { raiseError: false }) | ||
).toBeFalse() | ||
expect(() => result.validate({ value: new NumberType(42.2) })).toThrow( | ||
'is an invalid' | ||
) | ||
expect(result.validate(new NumberType(20), false)).toBeFalse() | ||
}) | ||
@@ -457,6 +489,6 @@ it('should validate a required value', () => { | ||
it('should inspect type', () => { | ||
expect(new BooleanType().inspect()).toStrictEqual('<type "Boolean">') | ||
expect(new BooleanType(true).inspect()).toStrictEqual( | ||
'<type "Boolean": "value":true>' | ||
) | ||
// expect(new BooleanType().inspect()).toStrictEqual('<type "Boolean">') | ||
// expect(new BooleanType(true).inspect()).toStrictEqual( | ||
// '<type "Boolean": "value":true>' | ||
// ) | ||
expect(new NumberType({ max: 5, min: 2 }).inspect()).toStrictEqual( | ||
@@ -463,0 +495,0 @@ '<type "Number": "min":2,"max":5>' |
@@ -242,4 +242,9 @@ /* eslint-disable no-unused-vars */ | ||
defineProperty(this, 'errors', null) | ||
const TheType = this.Class || this.constructor | ||
const TheType = this.constructor | ||
const $attributes = this.$attributes | ||
if (isPureObject(aValue)) { | ||
Object.assign(aOptions, aValue) | ||
aValue = aValue.value | ||
delete aOptions.value | ||
} | ||
// merge the options from TheType | ||
@@ -269,3 +274,3 @@ $attributes.initializeTo(aOptions, TheType, { skipUndefined: true }) | ||
const checkValidity = aOptions.checkValidity | ||
const TheType = this.Class || this.constructor | ||
const TheType = this.constructor as typeof Type | ||
@@ -341,3 +346,2 @@ if (aValue instanceof Type) { | ||
result = JSON.stringify(result) | ||
console.log('TCL:: ~ file: abstract-type.ts ~ line 333 ~ Type ~ toJson ~ result', result); | ||
return result | ||
@@ -419,3 +423,3 @@ } | ||
if (aOptions != null) { | ||
if (!(aOptions instanceof Type) && !isPureObject(aOptions)) { | ||
if (!isPureObject(aOptions)) { | ||
aOptions = { value: aOptions } | ||
@@ -440,3 +444,3 @@ } | ||
skipUndefined: true, | ||
exclude: 'name', | ||
exclude: aOptions.value != null ? ['name', 'value'] : 'name', | ||
}) | ||
@@ -443,0 +447,0 @@ if (!customValidate) customValidate = aOptions.customValidate |
117113
1.69%1645
2.49%Updated