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
135 lines (134 loc) • 13.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Directive, ContentChildren, QueryList, SimpleChange, Input } from '@angular/core';
import { merge } from 'rxjs';
import { filter } from 'rxjs/operators';
import { FormComponent } from '../form/form.component';
import { ActionRegistry } from '../model/actionregistry';
import { ValidatorRegistry } from '../model/validatorregistry';
import { SchemaPropertyType } from '../schema';
import { TemplateSchemaService } from './template-schema.service';
import { FieldComponent } from './field/field.component';
import { ButtonComponent } from './button/button.component';
import { FieldParent } from './field/field-parent';
import { TemplateSchemaElementRegistry } from '../template-schema/template-schema-element-registry';
var TemplateSchemaDirective = /** @class */ (function (_super) {
tslib_1.__extends(TemplateSchemaDirective, _super);
function TemplateSchemaDirective(formComponent, templateSchemaService, actionRegistry, validatorRegistry, templateRegistry) {
var _this = _super.call(this) || this;
_this.formComponent = formComponent;
_this.templateSchemaService = templateSchemaService;
_this.actionRegistry = actionRegistry;
_this.validatorRegistry = validatorRegistry;
_this.templateRegistry = templateRegistry;
return _this;
}
/**
* @param {?} fields
* @return {?}
*/
TemplateSchemaDirective.prototype.setFormDocumentSchema = /**
* @param {?} fields
* @return {?}
*/
function (fields) {
var _this = this;
this.actionRegistry.clear();
this.validatorRegistry.clear();
/** @type {?} */
var schema = this.getFieldsSchema(fields);
this.templateRegistry.clear();
// register fields recursively
fields.forEach(function (field) {
field.register();
});
/** @type {?} */
var _validators = this.getFieldsValidators(fields);
_validators.forEach(function (_a) {
var path = _a.path, validators = _a.validators;
_this.validatorRegistry.register(path, validators);
});
/** @type {?} */
var previousSchema = this.formComponent.schema;
this.formComponent.schema = {
type: SchemaPropertyType.Object,
properties: schema.properties
};
if (this.fieldsets) {
this.formComponent.schema.fieldsets = this.fieldsets;
}
if (schema.required && schema.required.length > 0) {
this.formComponent.schema.required = schema.required;
}
/** @type {?} */
var buttons = this.getButtons();
if (buttons.length > 0) {
this.formComponent.schema.buttons = buttons;
}
this.formComponent.ngOnChanges({
schema: new SimpleChange(previousSchema, this.formComponent.schema, Boolean(previousSchema))
});
};
/**
* @return {?}
*/
TemplateSchemaDirective.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
var _this = this;
if (this.childFields.length > 0) {
this.setFormDocumentSchema(this.childFields.toArray());
}
merge(this.childFields.changes, this.childButtons.changes, this.templateSchemaService.changes)
.pipe(filter(function (value) { return Boolean(value); }))
.subscribe(function () {
_this.setFormDocumentSchema(_this.childFields.toArray());
});
};
TemplateSchemaDirective.decorators = [
{ type: Directive, args: [{
selector: 'sf-form[templateSchema]',
providers: [
TemplateSchemaService
]
},] }
];
/** @nocollapse */
TemplateSchemaDirective.ctorParameters = function () { return [
{ type: FormComponent },
{ type: TemplateSchemaService },
{ type: ActionRegistry },
{ type: ValidatorRegistry },
{ type: TemplateSchemaElementRegistry }
]; };
TemplateSchemaDirective.propDecorators = {
childFields: [{ type: ContentChildren, args: [FieldComponent,] }],
childButtons: [{ type: ContentChildren, args: [ButtonComponent,] }],
fieldsets: [{ type: Input }]
};
return TemplateSchemaDirective;
}(FieldParent));
export { TemplateSchemaDirective };
if (false) {
/** @type {?} */
TemplateSchemaDirective.prototype.childFields;
/** @type {?} */
TemplateSchemaDirective.prototype.childButtons;
/** @type {?} */
TemplateSchemaDirective.prototype.fieldsets;
/** @type {?} */
TemplateSchemaDirective.prototype.formComponent;
/** @type {?} */
TemplateSchemaDirective.prototype.templateSchemaService;
/** @type {?} */
TemplateSchemaDirective.prototype.actionRegistry;
/** @type {?} */
TemplateSchemaDirective.prototype.validatorRegistry;
/** @type {?} */
TemplateSchemaDirective.prototype.templateRegistry;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVtcGxhdGUtc2NoZW1hLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1zY2hlbWEtZm9ybXMvIiwic291cmNlcyI6WyJsaWIvdGVtcGxhdGUtc2NoZW1hL3RlbXBsYXRlLXNjaGVtYS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULGVBQWUsRUFDZixTQUFTLEVBR1QsWUFBWSxFQUVaLEtBQUssRUFDTixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxNQUFNLEVBQWdCLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFL0MsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXpELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUNMLDZCQUE2QixFQUM5QixNQUFNLHFEQUFxRCxDQUFDOztJQVNoQixtREFBVztJQVl0RCxpQ0FDVSxlQUNBLHVCQUNFLGNBQThCLEVBQzlCLGlCQUFvQyxFQUNwQyxnQkFBK0M7UUFMM0QsWUFPRSxpQkFBTyxTQUNSO1FBUFMsbUJBQWEsR0FBYixhQUFhO1FBQ2IsMkJBQXFCLEdBQXJCLHFCQUFxQjtRQUNuQixvQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsdUJBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxzQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQStCOztLQUcxRDs7Ozs7SUFFRCx1REFBcUI7Ozs7SUFBckIsVUFBc0IsTUFBd0I7UUFBOUMsaUJBNENDO1FBM0NDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDNUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDOztRQUUvQixJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTVDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7UUFFOUIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFDLEtBQUs7WUFDbkIsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ2xCLENBQUMsQ0FBQzs7UUFFSCxJQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckQsV0FBVyxDQUFDLE9BQU8sQ0FBQyxVQUFDLEVBQW9CO2dCQUFsQixjQUFJLEVBQUUsMEJBQVU7WUFDckMsS0FBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDbkQsQ0FBQyxDQUFDOztRQUVILElBQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1FBQ2pELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHO1lBQzFCLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxNQUFNO1lBQy9CLFVBQVUsRUFBRSxNQUFNLENBQUMsVUFBVTtTQUM5QixDQUFDO1FBRUYsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDbkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7U0FDdEQ7UUFFRCxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7U0FDdEQ7O1FBRUQsSUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1NBQzdDO1FBRUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUM7WUFDN0IsTUFBTSxFQUFFLElBQUksWUFBWSxDQUN0QixjQUFjLEVBQ2QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLEVBQ3pCLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FDeEI7U0FDRixDQUFDLENBQUM7S0FFSjs7OztJQUdELG9EQUFrQjs7O0lBQWxCO1FBQUEsaUJBcUJDO1FBbkJDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztTQUN4RDtRQUVELEtBQUssQ0FDSCxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFDeEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQ3pCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQ25DO2FBQ0EsSUFBSSxDQUNILE1BQU0sQ0FBQyxVQUFDLEtBQUssSUFBSyxPQUFBLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBZCxDQUFjLENBQUMsQ0FJbEM7YUFDQSxTQUFTLENBQUM7WUFDVCxLQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1NBQ3hELENBQUMsQ0FBQztLQUVKOztnQkFoR0YsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSx5QkFBeUI7b0JBQ25DLFNBQVMsRUFBRTt3QkFDVCxxQkFBcUI7cUJBQ3RCO2lCQUNGOzs7O2dCQXBCUSxhQUFhO2dCQUtiLHFCQUFxQjtnQkFKckIsY0FBYztnQkFDZCxpQkFBaUI7Z0JBU3hCLDZCQUE2Qjs7OzhCQWE1QixlQUFlLFNBQUMsY0FBYzsrQkFHOUIsZUFBZSxTQUFDLGVBQWU7NEJBRy9CLEtBQUs7O2tDQTNDUjtFQWtDNkMsV0FBVztTQUEzQyx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgUXVlcnlMaXN0LFxuICBBZnRlckNvbnRlbnRJbml0LFxuICBIb3N0QmluZGluZyxcbiAgU2ltcGxlQ2hhbmdlLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBJbnB1dFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL2Zvcm0vZm9ybS5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWN0aW9uUmVnaXN0cnkgfSBmcm9tICcuLi9tb2RlbC9hY3Rpb25yZWdpc3RyeSc7XG5pbXBvcnQgeyBWYWxpZGF0b3JSZWdpc3RyeSB9IGZyb20gJy4uL21vZGVsL3ZhbGlkYXRvcnJlZ2lzdHJ5JztcbmltcG9ydCB7IFNjaGVtYVByb3BlcnR5VHlwZSB9IGZyb20gJy4uL3NjaGVtYSc7XG5cbmltcG9ydCB7IFRlbXBsYXRlU2NoZW1hU2VydmljZSB9IGZyb20gJy4vdGVtcGxhdGUtc2NoZW1hLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmllbGRDb21wb25lbnQgfSBmcm9tICcuL2ZpZWxkL2ZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4vZmllbGQvZmllbGQnO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi9idXR0b24vYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGaWVsZFBhcmVudCB9IGZyb20gJy4vZmllbGQvZmllbGQtcGFyZW50JztcbmltcG9ydCB7XG4gIFRlbXBsYXRlU2NoZW1hRWxlbWVudFJlZ2lzdHJ5XG59IGZyb20gJy4uL3RlbXBsYXRlLXNjaGVtYS90ZW1wbGF0ZS1zY2hlbWEtZWxlbWVudC1yZWdpc3RyeSc7XG5cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnc2YtZm9ybVt0ZW1wbGF0ZVNjaGVtYV0nLFxuICBwcm92aWRlcnM6IFtcbiAgICBUZW1wbGF0ZVNjaGVtYVNlcnZpY2VcbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZVNjaGVtYURpcmVjdGl2ZSBleHRlbmRzIEZpZWxkUGFyZW50XG5pbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oRmllbGRDb21wb25lbnQpXG4gIGNoaWxkRmllbGRzOiBRdWVyeUxpc3Q8RmllbGRDb21wb25lbnQ+O1xuXG4gIEBDb250ZW50Q2hpbGRyZW4oQnV0dG9uQ29tcG9uZW50KVxuICBjaGlsZEJ1dHRvbnM6IFF1ZXJ5TGlzdDxCdXR0b25Db21wb25lbnQ+O1xuXG4gIEBJbnB1dCgpXG4gIGZpZWxkc2V0czogeyBba2V5OiBzdHJpbmddOiBhbnkgfVtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZm9ybUNvbXBvbmVudDogRm9ybUNvbXBvbmVudCxcbiAgICBwcml2YXRlIHRlbXBsYXRlU2NoZW1hU2VydmljZTogVGVtcGxhdGVTY2hlbWFTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBhY3Rpb25SZWdpc3RyeTogQWN0aW9uUmVnaXN0cnksXG4gICAgcHJvdGVjdGVkIHZhbGlkYXRvclJlZ2lzdHJ5OiBWYWxpZGF0b3JSZWdpc3RyeSxcbiAgICBwcm90ZWN0ZWQgdGVtcGxhdGVSZWdpc3RyeTogVGVtcGxhdGVTY2hlbWFFbGVtZW50UmVnaXN0cnksXG4gICkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBzZXRGb3JtRG9jdW1lbnRTY2hlbWEoZmllbGRzOiBGaWVsZENvbXBvbmVudFtdKSB7XG4gICAgdGhpcy5hY3Rpb25SZWdpc3RyeS5jbGVhcigpO1xuICAgIHRoaXMudmFsaWRhdG9yUmVnaXN0cnkuY2xlYXIoKTtcblxuICAgIGNvbnN0IHNjaGVtYSA9IHRoaXMuZ2V0RmllbGRzU2NoZW1hKGZpZWxkcyk7XG5cbiAgICB0aGlzLnRlbXBsYXRlUmVnaXN0cnkuY2xlYXIoKTtcbiAgICAvLyByZWdpc3RlciBmaWVsZHMgcmVjdXJzaXZlbHlcbiAgICBmaWVsZHMuZm9yRWFjaCgoZmllbGQpID0+IHtcbiAgICAgIGZpZWxkLnJlZ2lzdGVyKCk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBfdmFsaWRhdG9ycyA9IHRoaXMuZ2V0RmllbGRzVmFsaWRhdG9ycyhmaWVsZHMpO1xuICAgIF92YWxpZGF0b3JzLmZvckVhY2goKHsgcGF0aCwgdmFsaWRhdG9ycyB9KSA9PiB7XG4gICAgICB0aGlzLnZhbGlkYXRvclJlZ2lzdHJ5LnJlZ2lzdGVyKHBhdGgsIHZhbGlkYXRvcnMpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcHJldmlvdXNTY2hlbWEgPSB0aGlzLmZvcm1Db21wb25lbnQuc2NoZW1hO1xuICAgIHRoaXMuZm9ybUNvbXBvbmVudC5zY2hlbWEgPSB7XG4gICAgICB0eXBlOiBTY2hlbWFQcm9wZXJ0eVR5cGUuT2JqZWN0LFxuICAgICAgcHJvcGVydGllczogc2NoZW1hLnByb3BlcnRpZXNcbiAgICB9O1xuXG4gICAgaWYgKHRoaXMuZmllbGRzZXRzKSB7XG4gICAgICB0aGlzLmZvcm1Db21wb25lbnQuc2NoZW1hLmZpZWxkc2V0cyA9IHRoaXMuZmllbGRzZXRzO1xuICAgIH1cblxuICAgIGlmIChzY2hlbWEucmVxdWlyZWQgJiYgc2NoZW1hLnJlcXVpcmVkLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZm9ybUNvbXBvbmVudC5zY2hlbWEucmVxdWlyZWQgPSBzY2hlbWEucmVxdWlyZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgYnV0dG9ucyA9IHRoaXMuZ2V0QnV0dG9ucygpO1xuICAgIGlmIChidXR0b25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZm9ybUNvbXBvbmVudC5zY2hlbWEuYnV0dG9ucyA9IGJ1dHRvbnM7XG4gICAgfVxuXG4gICAgdGhpcy5mb3JtQ29tcG9uZW50Lm5nT25DaGFuZ2VzKHtcbiAgICAgIHNjaGVtYTogbmV3IFNpbXBsZUNoYW5nZShcbiAgICAgICAgcHJldmlvdXNTY2hlbWEsXG4gICAgICAgIHRoaXMuZm9ybUNvbXBvbmVudC5zY2hlbWEsXG4gICAgICAgIEJvb2xlYW4ocHJldmlvdXNTY2hlbWEpXG4gICAgICApXG4gICAgfSk7XG5cbiAgfVxuXG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuXG4gICAgaWYgKHRoaXMuY2hpbGRGaWVsZHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5zZXRGb3JtRG9jdW1lbnRTY2hlbWEodGhpcy5jaGlsZEZpZWxkcy50b0FycmF5KCkpO1xuICAgIH1cblxuICAgIG1lcmdlKFxuICAgICAgdGhpcy5jaGlsZEZpZWxkcy5jaGFuZ2VzLFxuICAgICAgdGhpcy5jaGlsZEJ1dHRvbnMuY2hhbmdlcyxcbiAgICAgIHRoaXMudGVtcGxhdGVTY2hlbWFTZXJ2aWNlLmNoYW5nZXNcbiAgICApXG4gICAgLnBpcGUoXG4gICAgICBmaWx0ZXIoKHZhbHVlKSA9PiBCb29sZWFuKHZhbHVlKSksXG4gICAgICAvLyBidWlsZGluZyB0aGUganNvbiBzY2hlbWEgaXMgYSBoZWF2eSB0YXNrLCBhdm9pZCB1bm5lY2Vzc2FyeSBidWlsZHNcbiAgICAgIC8vIFRPRE8gdXNlIHRoaXNcbiAgICAgIC8vIGRlYm91bmNlVGltZSg1MClcbiAgICApXG4gICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICB0aGlzLnNldEZvcm1Eb2N1bWVudFNjaGVtYSh0aGlzLmNoaWxkRmllbGRzLnRvQXJyYXkoKSk7XG4gICAgfSk7XG5cbiAgfVxuXG59XG4iXX0=