ngx-trumbowyg
Version:
This an Angular wrapper for [Trumbowyg WYSIWYG editor](https://alex-d.github.io/Trumbowyg/).
220 lines (211 loc) • 17.6 kB
JavaScript
import { InjectionToken, Directive, ElementRef, Inject, Input, Optional, Component, ViewChild, NgModule } from '@angular/core';
import { NgControl } from '@angular/forms';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
const /** @type {?} */ TRUMBOWYG_OPTIONS = new InjectionToken('Trumbowyg options');
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @abstract
*/
class EditorBase {
/**
* @param {?} editorControl
* @param {?} _config
*/
constructor(editorControl, _config) {
this.editorControl = editorControl;
this._config = _config;
if (_config &&
_config.events &&
(_config.events['tbwinit'] || _config.events['tbwchange'] || _config.events['tbwfocus'])) {
throw new Error('Forbidden event registration. These events are protected for the Ngx-Trumbowyg library: tbwinit, tbwchange, tbwfocus');
}
editorControl.valueAccessor = this;
}
/**
* @return {?}
*/
ngOnInit() {
const /** @type {?} */ control = this.editorControl.control;
control.setValidators(control.validator);
control.updateValueAndValidity();
}
/**
* @return {?}
*/
ngAfterViewInit() {
const /** @type {?} */ editor = $(this._editor.nativeElement)
.trumbowyg(Object.assign({}, this._config, this.options))
.on('tbwinit', () => {
this.setDisabledState(this._disabled);
this.setContent(this._initValue);
})
.on('tbwchange', () => {
this._onChange(this.getContent());
})
.on('tbwfocus', () => {
this._onTouch();
});
if (this._config && this._config.events) {
const /** @type {?} */ events = this._config.events;
Object.keys(events).forEach(eventName => {
editor.on(eventName, events[eventName]());
});
}
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this._onChange = fn;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) {
this._onTouch = fn;
}
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
this._initValue = value;
if (this._editor && this._editor.nativeElement) {
this.setContent(value);
}
}
/**
* @param {?} disabled
* @return {?}
*/
setDisabledState(disabled) {
this._disabled = disabled;
if (this._editor) {
$(this._editor.nativeElement).trumbowyg(this._disabled ? 'disable' : 'enable');
}
}
/**
* @return {?}
*/
ngOnDestroy() {
$(this._editor.nativeElement).trumbowyg('destroy');
}
/**
* @param {?} content
* @return {?}
*/
setContent(content) {
$(this._editor.nativeElement).trumbowyg('html', content);
}
/**
* @return {?}
*/
getContent() {
return $(this._editor.nativeElement).trumbowyg('html');
}
}
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class EditorDirective extends EditorBase {
/**
* @param {?} editorControl
* @param {?} _config
* @param {?} _editor
*/
constructor(editorControl, _config, _editor) {
super(editorControl, _config);
this.editorControl = editorControl;
this._config = _config;
this._editor = _editor;
}
}
EditorDirective.decorators = [
{ type: Directive, args: [{
selector: '[ngxTrumbowygEditor]'
},] }
];
/** @nocollapse */
EditorDirective.ctorParameters = () => [
{ type: NgControl },
{ type: undefined, decorators: [{ type: Inject, args: [TRUMBOWYG_OPTIONS,] }, { type: Optional }] },
{ type: ElementRef }
];
EditorDirective.propDecorators = {
options: [{ type: Input }],
placeholder: [{ type: Input }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class EditorComponent extends EditorBase {
/**
* @param {?} editorControl
* @param {?} _config
*/
constructor(editorControl, _config) {
super(editorControl, _config);
this.editorControl = editorControl;
this._config = _config;
}
}
EditorComponent.decorators = [
{ type: Component, args: [{
// tslint:disable-next-line:component-selector
selector: 'ngx-trumbowyg-editor',
template: "<textarea #editor [placeholder]=\"placeholder ? placeholder : ''\"></textarea>\n",
styles: [""]
}] }
];
/** @nocollapse */
EditorComponent.ctorParameters = () => [
{ type: NgControl },
{ type: undefined, decorators: [{ type: Inject, args: [TRUMBOWYG_OPTIONS,] }, { type: Optional }] }
];
EditorComponent.propDecorators = {
options: [{ type: Input }],
placeholder: [{ type: Input }],
_editor: [{ type: ViewChild, args: ['editor',] }]
};
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
class NgxTrumbowygModule {
/**
* @param {?} options
* @return {?}
*/
static withConfig(options) {
return {
ngModule: NgxTrumbowygModule,
providers: [{ provide: TRUMBOWYG_OPTIONS, useValue: options }]
};
}
}
NgxTrumbowygModule.decorators = [
{ type: NgModule, args: [{
declarations: [EditorDirective, EditorComponent],
exports: [EditorDirective, EditorComponent]
},] }
];
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
export { NgxTrumbowygModule, EditorBase as ɵb, EditorComponent as ɵd, TRUMBOWYG_OPTIONS as ɵc, EditorDirective as ɵa };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRydW1ib3d5Zy5qcy5tYXAiLCJzb3VyY2VzIjpbIm5nOi8vbmd4LXRydW1ib3d5Zy9saWIvY29uZmlncy9pbmplY3Rpb24tdG9rZW4udHMiLCJuZzovL25neC10cnVtYm93eWcvbGliL2NvbW1vbnMvZWRpdG9yLWJhc2UudHMiLCJuZzovL25neC10cnVtYm93eWcvbGliL2RpcmVjdGl2ZS9lZGl0b3IuZGlyZWN0aXZlLnRzIiwibmc6Ly9uZ3gtdHJ1bWJvd3lnL2xpYi9jb21wb25lbnQvZWRpdG9yL2VkaXRvci5jb21wb25lbnQudHMiLCJuZzovL25neC10cnVtYm93eWcvbGliL25neC10cnVtYm93eWcubW9kdWxlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcnVtYm93eWdPcHRpb25zIH0gZnJvbSAnLi90cnVtYm93eWctb3B0aW9ucyc7XG5cbmV4cG9ydCBjb25zdCBUUlVNQk9XWUdfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbjxUcnVtYm93eWdPcHRpb25zPihcbiAgJ1RydW1ib3d5ZyBvcHRpb25zJ1xuKTtcbiIsImltcG9ydCB7IEFmdGVyVmlld0luaXQsIEVsZW1lbnRSZWYsIE9uRGVzdHJveSwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTmdDb250cm9sIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVHJ1bWJvd3lnT3B0aW9ucyB9IGZyb20gJy4uL2NvbmZpZ3MvdHJ1bWJvd3lnLW9wdGlvbnMnO1xuXG5kZWNsYXJlIGNvbnN0ICQ6IGFueTtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEVkaXRvckJhc2UgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBvcHRpb25zOiBUcnVtYm93eWdPcHRpb25zIHwgbnVsbDtcblxuICBwbGFjZWhvbGRlcjogc3RyaW5nIHwgbnVsbDtcblxuICBwcm90ZWN0ZWQgX2VkaXRvcjogRWxlbWVudFJlZjtcblxuICBwcm90ZWN0ZWQgX2luaXRWYWx1ZTogc3RyaW5nO1xuXG4gIHByaXZhdGUgX2Rpc2FibGVkOiBib29sZWFuO1xuXG4gIHByaXZhdGUgX29uQ2hhbmdlOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZDtcblxuICBwcml2YXRlIF9vblRvdWNoOiAoKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBlZGl0b3JDb250cm9sOiBOZ0NvbnRyb2wsIHByb3RlY3RlZCBfY29uZmlnOiBUcnVtYm93eWdPcHRpb25zKSB7XG4gICAgaWYgKFxuICAgICAgX2NvbmZpZyAmJlxuICAgICAgX2NvbmZpZy5ldmVudHMgJiZcbiAgICAgIChfY29uZmlnLmV2ZW50c1sndGJ3aW5pdCddIHx8IF9jb25maWcuZXZlbnRzWyd0YndjaGFuZ2UnXSB8fCBfY29uZmlnLmV2ZW50c1sndGJ3Zm9jdXMnXSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0ZvcmJpZGRlbiBldmVudCByZWdpc3RyYXRpb24uIFRoZXNlIGV2ZW50cyBhcmUgcHJvdGVjdGVkIGZvciB0aGUgTmd4LVRydW1ib3d5ZyBsaWJyYXJ5OiB0Yndpbml0LCB0YndjaGFuZ2UsIHRid2ZvY3VzJ1xuICAgICAgKTtcbiAgICB9XG4gICAgZWRpdG9yQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRyb2wgPSB0aGlzLmVkaXRvckNvbnRyb2wuY29udHJvbDtcbiAgICBjb250cm9sLnNldFZhbGlkYXRvcnMoY29udHJvbC52YWxpZGF0b3IpO1xuICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IGVkaXRvciA9ICQodGhpcy5fZWRpdG9yLm5hdGl2ZUVsZW1lbnQpXG4gICAgICAudHJ1bWJvd3lnKHsgLi4udGhpcy5fY29uZmlnLCAuLi50aGlzLm9wdGlvbnMgfSlcbiAgICAgIC5vbigndGJ3aW5pdCcsICgpID0+IHtcbiAgICAgICAgdGhpcy5zZXREaXNhYmxlZFN0YXRlKHRoaXMuX2Rpc2FibGVkKTtcbiAgICAgICAgdGhpcy5zZXRDb250ZW50KHRoaXMuX2luaXRWYWx1ZSk7XG4gICAgICB9KVxuICAgICAgLm9uKCd0YndjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuX29uQ2hhbmdlKHRoaXMuZ2V0Q29udGVudCgpKTtcbiAgICAgIH0pXG4gICAgICAub24oJ3Rid2ZvY3VzJywgKCkgPT4ge1xuICAgICAgICB0aGlzLl9vblRvdWNoKCk7XG4gICAgICB9KTtcblxuICAgIGlmICh0aGlzLl9jb25maWcgJiYgdGhpcy5fY29uZmlnLmV2ZW50cykge1xuICAgICAgY29uc3QgZXZlbnRzID0gdGhpcy5fY29uZmlnLmV2ZW50cztcbiAgICAgIE9iamVjdC5rZXlzKGV2ZW50cykuZm9yRWFjaChldmVudE5hbWUgPT4ge1xuICAgICAgICBlZGl0b3Iub24oZXZlbnROYW1lLCBldmVudHNbZXZlbnROYW1lXSgpKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9vblRvdWNoID0gZm47XG4gIH1cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLl9pbml0VmFsdWUgPSB2YWx1ZTtcblxuICAgIGlmICh0aGlzLl9lZGl0b3IgJiYgdGhpcy5fZWRpdG9yLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuc2V0Q29udGVudCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gZGlzYWJsZWQ7XG5cbiAgICBpZiAodGhpcy5fZWRpdG9yKSB7XG4gICAgICAkKHRoaXMuX2VkaXRvci5uYXRpdmVFbGVtZW50KS50cnVtYm93eWcodGhpcy5fZGlzYWJsZWQgPyAnZGlzYWJsZScgOiAnZW5hYmxlJyk7XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgJCh0aGlzLl9lZGl0b3IubmF0aXZlRWxlbWVudCkudHJ1bWJvd3lnKCdkZXN0cm95Jyk7XG4gIH1cblxuICBwcml2YXRlIHNldENvbnRlbnQoY29udGVudDogc3RyaW5nKTogdm9pZCB7XG4gICAgJCh0aGlzLl9lZGl0b3IubmF0aXZlRWxlbWVudCkudHJ1bWJvd3lnKCdodG1sJywgY29udGVudCk7XG4gIH1cblxuICBwcml2YXRlIGdldENvbnRlbnQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gJCh0aGlzLl9lZGl0b3IubmF0aXZlRWxlbWVudCkudHJ1bWJvd3lnKCdodG1sJyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgSW5qZWN0LCBJbnB1dCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEVkaXRvckJhc2UgfSBmcm9tICcuLi9jb21tb25zL2VkaXRvci1iYXNlJztcbmltcG9ydCB7IFRydW1ib3d5Z09wdGlvbnMgfSBmcm9tICcuLi9jb25maWdzL3RydW1ib3d5Zy1vcHRpb25zJztcbmltcG9ydCB7IFRSVU1CT1dZR19PUFRJT05TIH0gZnJvbSAnLi4vY29uZmlncy9pbmplY3Rpb24tdG9rZW4nO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmd4VHJ1bWJvd3lnRWRpdG9yXSdcbn0pXG5leHBvcnQgY2xhc3MgRWRpdG9yRGlyZWN0aXZlIGV4dGVuZHMgRWRpdG9yQmFzZSB7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IFRydW1ib3d5Z09wdGlvbnMgfCBudWxsO1xuXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgfCBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBlZGl0b3JDb250cm9sOiBOZ0NvbnRyb2wsXG4gICAgQEluamVjdChUUlVNQk9XWUdfT1BUSU9OUylcbiAgICBAT3B0aW9uYWwoKVxuICAgIHByb3RlY3RlZCBfY29uZmlnOiBUcnVtYm93eWdPcHRpb25zLFxuICAgIHByb3RlY3RlZCBfZWRpdG9yOiBFbGVtZW50UmVmXG4gICkge1xuICAgIHN1cGVyKGVkaXRvckNvbnRyb2wsIF9jb25maWcpO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEluamVjdCxcbiAgSW5wdXQsXG4gIE9wdGlvbmFsLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOZ0NvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IEVkaXRvckJhc2UgfSBmcm9tICcuLi8uLi9jb21tb25zL2VkaXRvci1iYXNlJztcbmltcG9ydCB7IFRSVU1CT1dZR19PUFRJT05TIH0gZnJvbSAnLi4vLi4vY29uZmlncy9pbmplY3Rpb24tdG9rZW4nO1xuaW1wb3J0IHsgVHJ1bWJvd3lnT3B0aW9ucyB9IGZyb20gJy4uLy4uL2NvbmZpZ3MvdHJ1bWJvd3lnLW9wdGlvbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmNvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ25neC10cnVtYm93eWctZWRpdG9yJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2VkaXRvci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2VkaXRvci5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRWRpdG9yQ29tcG9uZW50IGV4dGVuZHMgRWRpdG9yQmFzZSB7XG4gIEBJbnB1dCgpIG9wdGlvbnM6IFRydW1ib3d5Z09wdGlvbnMgfCBudWxsO1xuXG4gIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmcgfCBudWxsO1xuXG4gIEBWaWV3Q2hpbGQoJ2VkaXRvcicpIF9lZGl0b3I6IEVsZW1lbnRSZWY7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGVkaXRvckNvbnRyb2w6IE5nQ29udHJvbCxcbiAgICBASW5qZWN0KFRSVU1CT1dZR19PUFRJT05TKVxuICAgIEBPcHRpb25hbCgpXG4gICAgcHJvdGVjdGVkIF9jb25maWc6IFRydW1ib3d5Z09wdGlvbnNcbiAgKSB7XG4gICAgc3VwZXIoZWRpdG9yQ29udHJvbCwgX2NvbmZpZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlLCBNb2R1bGVXaXRoUHJvdmlkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcnVtYm93eWdPcHRpb25zIH0gZnJvbSAnLi9jb25maWdzL3RydW1ib3d5Zy1vcHRpb25zJztcbmltcG9ydCB7IFRSVU1CT1dZR19PUFRJT05TIH0gZnJvbSAnLi9jb25maWdzL2luamVjdGlvbi10b2tlbic7XG5pbXBvcnQgeyBFZGl0b3JEaXJlY3RpdmUgfSBmcm9tICcuL2RpcmVjdGl2ZS9lZGl0b3IuZGlyZWN0aXZlJztcbmltcG9ydCB7IEVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50L2VkaXRvci9lZGl0b3IuY29tcG9uZW50JztcblxuQE5nTW9kdWxlKHtcbiAgZGVjbGFyYXRpb25zOiBbRWRpdG9yRGlyZWN0aXZlLCBFZGl0b3JDb21wb25lbnRdLFxuICBleHBvcnRzOiBbRWRpdG9yRGlyZWN0aXZlLCBFZGl0b3JDb21wb25lbnRdXG59KVxuZXhwb3J0IGNsYXNzIE5neFRydW1ib3d5Z01vZHVsZSB7XG4gIHN0YXRpYyB3aXRoQ29uZmlnKG9wdGlvbnM6IFRydW1ib3d5Z09wdGlvbnMpOiBNb2R1bGVXaXRoUHJvdmlkZXJzIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmdNb2R1bGU6IE5neFRydW1ib3d5Z01vZHVsZSxcbiAgICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogVFJVTUJPV1lHX09QVElPTlMsIHVzZVZhbHVlOiBvcHRpb25zIH1dXG4gICAgfTtcbiAgfVxufVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSx1QkFHYSxpQkFBaUIsR0FBRyxJQUFJLGNBQWMsQ0FDakQsbUJBQW1CLENBQ3BCOzs7Ozs7Ozs7QUNDRDs7Ozs7SUFlRSxZQUFzQixhQUF3QixFQUFZLE9BQXlCO1FBQTdELGtCQUFhLEdBQWIsYUFBYSxDQUFXO1FBQVksWUFBTyxHQUFQLE9BQU8sQ0FBa0I7UUFDakYsSUFDRSxPQUFPO1lBQ1AsT0FBTyxDQUFDLE1BQU07YUFDYixPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FDekYsRUFBRTtZQUNBLE1BQU0sSUFBSSxLQUFLLENBQ2Isc0hBQXNILENBQ3ZILENBQUM7U0FDSDtRQUNELGFBQWEsQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO0tBQ3BDOzs7O0lBRUQsUUFBUTtRQUNOLHVCQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztRQUMzQyxPQUFPLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN6QyxPQUFPLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztLQUNsQzs7OztJQUVELGVBQWU7UUFDYix1QkFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO2FBQ3pDLFNBQVMsbUJBQU0sSUFB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