UNPKG

ngx-schema-forms

Version:

New features: - Ajv schema validator. - Angular forms compatible: Property tree is created using FormGroup, FormArray and FormControl classes. - Array now properly loads initial data from model. - WidgetTyep: WidgetRegistry now supports WidgetType, now wo

178 lines (177 loc) 19.1 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { startWith } from 'rxjs/operators'; import { SchemaPropertyType } from '../schema'; import { GenericProperty } from './generic-property'; import { NumberProperty } from './number-property'; import { BooleanProperty } from './boolean-property'; import { StringProperty } from './string-property'; import { ArrayProperty } from './array-property'; import { ObjectProperty } from './object-property'; import { SchemaPreprocessor } from './schemapreprocessor'; /** @typedef {?} */ var PropertyParent; export { PropertyParent }; export class FormPropertyFactory { /** * @param {?} schemaValidatorFactory * @param {?} validatorRegistry */ constructor(schemaValidatorFactory, validatorRegistry) { this.schemaValidatorFactory = schemaValidatorFactory; this.validatorRegistry = validatorRegistry; } /** * @param {?} schema * @param {?=} propertyParent * @param {?=} propertyKey * @return {?} */ createProperty(schema, propertyParent, propertyKey) { /** @type {?} */ let property; /** @type {?} */ const path = this.generatePath(propertyParent, propertyKey); SchemaPreprocessor.preprocess(schema, path); // TODO test for parsing for reference schema if (schema["$ref"]) { /** @type {?} */ const refSchema = this.schemaValidatorFactory.getSchema((/** @type {?} */ (propertyParent.root)).schema, schema["$ref"]); property = this.createProperty(refSchema, propertyParent, propertyKey || path); } else { switch (schema["type"]) { case SchemaPropertyType.Integer: case SchemaPropertyType.Number: property = new NumberProperty(path, schema); break; case SchemaPropertyType.String: property = new StringProperty(path, schema); break; case SchemaPropertyType.Boolean: property = new BooleanProperty(path, schema); break; case SchemaPropertyType.Object: property = new ObjectProperty(path, schema); break; case SchemaPropertyType.Array: if (schema["widget"].id === 'array') { property = new ArrayProperty(this, path, schema); } else { schema["default"] = []; property = new GenericProperty(path, schema); } break; default: throw new TypeError(`Undefined type ${schema["type"]}`); } } this.initializeFormProperty(property, propertyParent); return property; } /** * @param {?} property * @param {?=} propertyParent * @return {?} */ initializeFormProperty(property, propertyParent) { if (propertyParent) { property.setParent(propertyParent); } this.bindCustomValidator(property); if (property instanceof ObjectProperty) { for (const key in property.schema["properties"]) { if (property.schema["properties"].hasOwnProperty(key)) { /** @type {?} */ const _schema = property.schema["properties"][key]; /** @type {?} */ const _property = this.createProperty(_schema, property, key); property.addControl(key, _property); } } } if (property.isRoot) { this.bindSchemaValidator(property); // needs to run after entire property tree is built property.bindVisibility(); } } /** * @param {?} property * @return {?} */ bindSchemaValidator(property) { /** @type {?} */ const validate = this.schemaValidatorFactory.createValidatorFn(property.schema); // TODO use pipe startWith to do initial run property.valueChanges .pipe(startWith(null)) .subscribe(() => { /** @type {?} */ const value = property.nonEmptyValue; property.nonEmptyValueChanges.emit(value); /** @type {?} */ const errors = validate(value); if (!errors) { return; } Object.keys(errors).forEach((path) => { /** @type {?} */ const control = property.get(path); if (control) { // set error to specific control control.setErrors(errors[path], { emitEvent: true }); } }); }); } /** * @param {?} property * @return {?} */ bindCustomValidator(property) { /** @type {?} */ const validators = this.validatorRegistry.get(property.path); if (validators) { property.setValidators(validators); } } /** * @param {?=} propertyParent * @param {?=} propertyKey * @return {?} */ generatePath(propertyParent, propertyKey) { if (!propertyParent) { return '/'; } /** @type {?} */ let path = ''; path += propertyParent.path; if (propertyParent.parent !== undefined) { path += '/'; } switch (propertyParent.schema["type"]) { case SchemaPropertyType.Object: path += propertyKey; break; case SchemaPropertyType.Array: path += (/** @type {?} */ (propertyParent)).controls.length; break; default: // TODO move to class throw new Error('Instantiation of a FormProperty with an unknown parent type: ' + propertyParent.schema["type"]); } return path; } } if (false) { /** @type {?} */ FormPropertyFactory.prototype.schemaValidatorFactory; /** @type {?} */ FormPropertyFactory.prototype.validatorRegistry; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1wcm9wZXJ0eS1mYWN0b3J5LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LXNjaGVtYS1mb3Jtcy8iLCJzb3VyY2VzIjpbImxpYi9tb2RlbC9mb3JtLXByb3BlcnR5LWZhY3RvcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQVFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU0zQyxPQUFPLEVBQVUsa0JBQWtCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFHdkQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDckQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7Ozs7QUFNMUQsTUFBTTs7Ozs7SUFFSixZQUNVLHdCQUNBO1FBREEsMkJBQXNCLEdBQXRCLHNCQUFzQjtRQUN0QixzQkFBaUIsR0FBakIsaUJBQWlCO0tBQ3RCOzs7Ozs7O0lBRUwsY0FBYyxDQUNaLE1BQWMsRUFDZCxjQUErQixFQUMvQixXQUFvQjs7UUFJcEIsSUFBSSxRQUFRLENBQWU7O1FBQzNCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRTVELGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7O1FBRzVDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sVUFBTyxDQUFDOztZQUNoQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMs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O1NBQ3BDOzs7Ozs7O0lBR0ssWUFBWSxDQUNsQixjQUErQixFQUMvQixXQUFvQjtRQUdwQixFQUFFLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFDcEIsTUFBTSxDQUFDLEdBQUcsQ0FBQztTQUNaOztRQUVELElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLElBQUksSUFBSSxjQUFjLENBQUMsSUFBSSxDQUFDO1FBRzVCLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN4QyxJQUFJLElBQUksR0FBRyxDQUFDO1NBQ2I7UUFFRCxNQUFNLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxVQUFPLENBQUM7WUFDbkMsS0FBSyxrQkFBa0IsQ0FBQyxNQUFNO2dCQUM1QixJQUFJLElBQUksV0FBVyxDQUFDO2dCQUNwQixLQUFLLENBQUM7WUFFUixLQUFLLGtCQUFrQixDQUFDLEtBQUs7Z0JBQzNCLElBQUksSUFBSSxtQkFBZ0IsY0FBYyxFQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztnQkFDeEQsS0FBSyxDQUFDO1lBRVI7O2dCQUVFLE1BQU0sSUFBSSxLQUFLLENBQ2IsK0RBQStELEdBQzdELGNBQWMsQ0FBQyxNQUFNLFFBQUssQ0FDN0IsQ0FBQztTQUNMO1FBRUQsTUFBTSxDQUFDLElBQUksQ0FBQzs7Q0FFZiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBGb3JtQ29udHJvbCxcbiAgRm9ybUdyb3VwLFxuICBGb3JtQXJyYXksXG4gIFZhbGlkYXRvcnNcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgc3RhcnRXaXRoIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5cblxuaW1wb3J0IHsgU2NoZW1hVmFsaWRhdG9yRmFjdG9yeSB9IGZyb20gJy4uL3NjaGVtYXZhbGlkYXRvcmZhY3RvcnknO1xuaW1wb3J0IHsgVmFsaWRhdG9yUmVnaXN0cnkgfSBmcm9tICcuLi9tb2RlbC92YWxpZGF0b3JyZWdpc3RyeSc7XG5pbXBvcnQgeyBTY2hlbWEsIFNjaGVtYVByb3BlcnR5VHlwZSB9IGZyb20gJy4uL3NjaGVtYSc7XG5cbmltcG9ydCB7IEZvcm1Qcm9wZXJ0eSB9IGZyb20gJy4vZm9ybS1wcm9wZXJ0eSc7XG5pbXBvcnQgeyBHZW5lcmljUHJvcGVydHkgfSBmcm9tICcuL2dlbmVyaWMtcHJvcGVydHknO1xuaW1wb3J0IHsgTnVtYmVyUHJvcGVydHkgfSBmcm9tICcuL251bWJlci1wcm9wZXJ0eSc7XG5pbXBvcnQgeyBCb29sZWFuUHJvcGVydHkgfSBmcm9tICcuL2Jvb2xlYW4tcHJvcGVydHknO1xuaW1wb3J0IHsgU3RyaW5nUHJvcGVydHkgfSBmcm9tICcuL3N0cmluZy1wcm9wZXJ0eSc7XG5pbXBvcnQgeyBBcnJheVByb3BlcnR5IH0gZnJvbSAnLi9hcnJheS1wcm9wZXJ0eSc7XG5pbXBvcnQgeyBPYmplY3RQcm9wZXJ0eSB9IGZyb20gJy4vb2JqZWN0LXByb3BlcnR5JztcbmltcG9ydCB7IFNjaGVtYVByZXByb2Nlc3NvciB9IGZyb20gJy4vc2NoZW1hcHJlcHJvY2Vzc29yJztcblxuXG5leHBvcnQgdHlwZSBQcm9wZXJ0eVBhcmVudCA9IE9iamVjdFByb3BlcnR5IHwgQXJyYXlQcm9wZXJ0eTtcblxuXG5leHBvcnQgY2xhc3MgRm9ybVByb3BlcnR5RmFjdG9yeSB7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzY2hlbWFWYWxpZGF0b3JGYWN0b3J5OiBTY2hlbWFWYWxpZGF0b3JGYWN0b3J5LFxuICAgIHByaXZhdGUgdmFsaWRhdG9yUmVnaXN0cnk6IFZhbGlkYXRvclJlZ2lzdHJ5XG4gICkgeyB9XG5cbiAgY3JlYXRlUHJvcGVydHkoXG4gICAgc2NoZW1hOiBTY2hlbWEsXG4gICAgcHJvcGVydHlQYXJlbnQ/OiBQcm9wZXJ0eVBhcmVudCxcbiAgICBwcm9wZXJ0eUtleT86IHN0cmluZ1xuICApOiBGb3JtUHJvcGVydHkge1xuXG5cbiAgICBsZXQgcHJvcGVydHk6IEZvcm1Qcm9wZXJ0eTtcbiAgICBjb25zdCBwYXRoID0gdGhpcy5nZW5lcmF0ZVBhdGgocHJvcGVydHlQYXJlbnQsIHByb3BlcnR5S2V5KTtcblxuICAgIFNjaGVtYVByZXByb2Nlc3Nvci5wcmVwcm9jZXNzKHNjaGVtYSwgcGF0aCk7XG5cbiAgICAvLyBUT0RPIHRlc3QgZm9yIHBhcnNpbmcgZm9yIHJlZmVyZW5jZSBzY2hlbWFcbiAgICBpZiAoc2NoZW1hLiRyZWYpIHtcbiAgICAgIGNvbnN0IHJlZlNjaGVtYSA9IHRoaXMuc2NoZW1hVmFsaWRhdG9yRmFjdG9yeS5nZXRTY2hlbWEoXG4gICAgICAgICg8Rm9ybVByb3BlcnR5PnByb3BlcnR5UGFyZW50LnJvb3QpLnNjaGVtYSxcbiAgICAgICAgc2NoZW1hLiRyZWZcbiAgICAgICk7XG5cbiAgICAgIHByb3BlcnR5ID0gdGhpcy5jcmVhdGVQcm9wZXJ0eShcbiAgICAgICAgcmVmU2NoZW1hLFxuICAgICAgICBwcm9wZXJ0eVBhcmVudCxcbiAgICAgICAgcHJvcGVydHlLZXkgfHwgcGF0aFxuICAgICAgKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKHNjaGVtYS50eXBlKSB7XG4gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHlUeXBlLkludGVnZXI6XG4gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHlUeXBlLk51bWJlcjpcbiAgICAgICAgICBwcm9wZXJ0eSA9IG5ldyBOdW1iZXJQcm9wZXJ0eShwYXRoLCBzY2hlbWEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFNjaGVtYVByb3BlcnR5VHlwZS5TdHJpbmc6XG4gICAgICAgICAgcHJvcGVydHkgPSBuZXcgU3RyaW5nUHJvcGVydHkocGF0aCwgc2NoZW1hKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eVR5cGUuQm9vbGVhbjpcbiAgICAgICAgICBwcm9wZXJ0eSA9IG5ldyBCb29sZWFuUHJvcGVydHkocGF0aCwgc2NoZW1hKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTY2hlbWFQcm9wZXJ0eVR5cGUuT2JqZWN0OlxuICAgICAgICAgIHByb3BlcnR5ID0gbmV3IE9iamVjdFByb3BlcnR5KHBhdGgsIHNjaGVtYSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHlUeXBlLkFycmF5OlxuICAgICAgICAgIGlmIChzY2hlbWEud2lkZ2V0LmlkID09PSAnYXJyYXknKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eSA9IG5ldyBBcnJheVByb3BlcnR5KHRoaXMsIHBhdGgsIHNjaGVtYSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNjaGVtYS5kZWZhdWx0ID0gW107XG4gICAgICAgICAgICBwcm9wZXJ0eSA9IG5ldyBHZW5lcmljUHJvcGVydHkocGF0aCwgc2NoZW1hKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgVW5kZWZpbmVkIHR5cGUgJHtzY2hlbWEudHlwZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cblxuICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm1Qcm9wZXJ0eShwcm9wZXJ0eSwgcHJvcGVydHlQYXJlbnQpO1xuXG5cbiAgICByZXR1cm4gcHJvcGVydHk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVGb3JtUHJvcGVydHkoXG4gICAgcHJvcGVydHk6IEZvcm1Qcm9wZXJ0eSxcbiAgICBwcm9wZXJ0eVBhcmVudD86IFByb3BlcnR5UGFyZW50LFxuICApIHtcblxuICAgIGlmIChwcm9wZXJ0eVBhcmVudCkge1xuICAgICAgcHJvcGVydHkuc2V0UGFyZW50KHByb3BlcnR5UGFyZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLmJpbmRDdXN0b21WYWxpZGF0b3IocHJvcGVydHkpO1xuXG4gICAgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgT2JqZWN0UHJvcGVydHkpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHByb3BlcnR5LnNjaGVtYS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgIGlmIChwcm9wZXJ0eS5zY2hlbWEucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgY29uc3QgX3NjaGVtYSA9IHByb3BlcnR5LnNjaGVtYS5wcm9wZXJ0aWVzW2tleV07XG4gICAgICAgICAgY29uc3QgX3Byb3BlcnR5ID0gdGhpcy5jcmVhdGVQcm9wZXJ0eShfc2NoZW1hLCBwcm9wZXJ0eSwga2V5KTtcbiAgICAgICAgICBwcm9wZXJ0eS5hZGRDb250cm9sKGtleSwgX3Byb3BlcnR5KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwcm9wZXJ0eS5pc1Jvb3QpIHtcbiAgICAgIHRoaXMuYmluZFNjaGVtYVZhbGlkYXRvcihwcm9wZXJ0eSk7XG4gICAgICAvLyBuZWVkcyB0byBydW4gYWZ0ZXIgZW50aXJlIHByb3BlcnR5IHRyZWUgaXMgYnVpbHRcbiAgICAgIHByb3BlcnR5LmJpbmRWaXNpYmlsaXR5KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBiaW5kU2NoZW1hVmFsaWRhdG9yKHByb3BlcnR5OiBGb3JtUHJvcGVydHkpIHtcblxuICAgIGNvbnN0IHZhbGlkYXRlID0gdGhpcy5zY2hlbWFWYWxpZGF0b3JGYWN0b3J5LmNyZWF0ZVZhbGlkYXRvckZuKFxuICAgICAgcHJvcGVydHkuc2NoZW1hXG4gICAgKTtcblxuICAgIC8vIFRPRE8gdXNlIHBpcGUgc3RhcnRXaXRoIHRvIGRvIGluaXRpYWwgcnVuXG4gICAgcHJvcGVydHkudmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShzdGFydFdpdGgobnVsbCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBwcm9wZXJ0eS5ub25FbXB0eVZhbHVlO1xuICAgICAgICBwcm9wZXJ0eS5ub25FbXB0eVZhbHVlQ2hhbmdlcy5lbWl0KHZhbHVlKTtcblxuICAgICAgICBjb25zdCBlcnJvcnMgPSB2YWxpZGF0ZSh2YWx1ZSk7XG4gICAgICAgIGlmICghZXJyb3JzKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgT2JqZWN0LmtleXMoZXJyb3JzKS5mb3JFYWNoKChwYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBjb25zdCBjb250cm9sID0gcHJvcGVydHkuZ2V0KHBhdGgpO1xuICAgICAgICAgIGlmIChjb250cm9sKSB7XG4gICAgICAgICAgICAvLyBzZXQgZXJyb3IgdG8gc3BlY2lmaWMgY29udHJvbFxuICAgICAgICAgICAgY29udHJvbC5zZXRFcnJvcnMoZXJyb3JzW3BhdGhdLCB7IGVtaXRFdmVudDogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGJpbmRDdXN0b21WYWxpZGF0b3IocHJvcGVydHk6IEZvcm1Qcm9wZXJ0eSkge1xuICAgIGNvbnN0IHZhbGlkYXRvcnMgPSB0aGlzLnZhbGlkYXRvclJlZ2lzdHJ5LmdldChwcm9wZXJ0eS5wYXRoKTtcbiAgICBpZiAodmFsaWRhdG9ycykge1xuICAgICAgcHJvcGVydHkuc2V0VmFsaWRhdG9ycyh2YWxpZGF0b3JzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlUGF0aChcbiAgICBwcm9wZXJ0eVBhcmVudD86IFByb3BlcnR5UGFyZW50LFxuICAgIHByb3BlcnR5S2V5Pzogc3RyaW5nXG4gICk6IHN0cmluZyB7XG5cbiAgICBpZiAoIXByb3BlcnR5UGFyZW50KSB7XG4gICAgICByZXR1cm4gJy8nO1xuICAgIH1cblxuICAgIGxldCBwYXRoID0gJyc7XG4gICAgcGF0aCArPSBwcm9wZXJ0eVBhcmVudC5wYXRoO1xuXG5cbiAgICBpZiAocHJvcGVydHlQYXJlbnQucGFyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHBhdGggKz0gJy8nO1xuICAgIH1cblxuICAgIHN3aXRjaCAocHJvcGVydHlQYXJlbnQuc2NoZW1hLnR5cGUpIHtcbiAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHlUeXBlLk9iamVjdDpcbiAgICAgICAgcGF0aCArPSBwcm9wZXJ0eUtleTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgU2NoZW1hUHJvcGVydHlUeXBlLkFycmF5OlxuICAgICAgICBwYXRoICs9ICg8QXJyYXlQcm9wZXJ0eT5wcm9wZXJ0eVBhcmVudCkuY29udHJvbHMubGVuZ3RoO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgLy8gVE9ETyBtb3ZlIHRvIGNsYXNzXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnSW5zdGFudGlhdGlvbiBvZiBhIEZvcm1Qcm9wZXJ0eSB3aXRoIGFuIHVua25vd24gcGFyZW50IHR5cGU6ICcgK1xuICAgICAgICAgICAgcHJvcGVydHlQYXJlbnQuc2NoZW1hLnR5cGVcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcGF0aDtcbiAgfVxufVxuIl19