UNPKG

ngx-editor

Version:

Rich Text Editor for angular using ProseMirror

113 lines 18.5 kB
import { Component, Input } from '@angular/core'; import { MenuService } from './menu.service'; import * as i0 from "@angular/core"; import * as i1 from "./menu.service"; import * as i2 from "./toggle-command/toggle-command.component"; import * as i3 from "./link/link.component"; import * as i4 from "./image/image.component"; import * as i5 from "./dropdown/dropdown.component"; import * as i6 from "./color-picker/color-picker.component"; import * as i7 from "@angular/common"; export const DEFAULT_TOOLBAR = [ ['bold', 'italic'], ['code', 'blockquote'], ['underline', 'strike'], ['ordered_list', 'bullet_list'], [{ heading: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] }], ['link', 'image'], ['text_color', 'background_color'], ['align_left', 'align_center', 'align_right', 'align_justify'], ]; export const TOOLBAR_MINIMAL = [ ['bold', 'italic'], [{ heading: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] }], ['link', 'image'], ['text_color', 'background_color'], ]; const DEFAULT_COLOR_PRESETS = [ '#b60205', '#d93f0b', '#fbca04', '#0e8a16', '#006b75', '#1d76db', '#0052cc', '#5319e7', '#e99695', '#f9d0c4', '#fef2c0', '#c2e0c6', '#bfdadc', '#c5def5', '#bfd4f2', '#d4c5f9' ]; export class MenuComponent { constructor(menuService) { this.menuService = menuService; this.toolbar = TOOLBAR_MINIMAL; this.colorPresets = DEFAULT_COLOR_PRESETS; this.disabled = false; this.customMenuRef = null; this.dropdownPlacement = 'bottom'; this.toggleCommands = [ 'bold', 'italic', 'underline', 'strike', 'code', 'blockquote', 'ordered_list', 'bullet_list', 'align_left', 'align_center', 'align_right', 'align_justify' ]; this.iconContainerClass = ['NgxEditor__MenuItem', 'NgxEditor__MenuItem--Icon']; this.dropdownContainerClass = ['NgxEditor__Dropdown']; this.seperatorClass = ['NgxEditor__Seperator']; } get presets() { const col = 8; const colors = []; this.colorPresets.forEach((color, index) => { const row = Math.floor(index / col); if (!colors[row]) { colors.push([]); } colors[row].push(color); }); return colors; } trackByIndex(index) { return index; } isDropDown(item) { if (item?.heading) { return true; } return false; } getDropdownItems(item) { return item; } ngOnInit() { if (!this.editor) { throw new Error('NgxEditor: Required editor instance'); } this.menuService.editor = this.editor; } } MenuComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: MenuComponent, deps: [{ token: i1.MenuService }], target: i0.ɵɵFactoryTarget.Component }); MenuComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.0", type: MenuComponent, selector: "ngx-editor-menu", inputs: { toolbar: "toolbar", colorPresets: "colorPresets", disabled: "disabled", editor: "editor", customMenuRef: "customMenuRef", dropdownPlacement: "dropdownPlacement" }, providers: [MenuService], ngImport: i0, template: "<div class=\"NgxEditor__MenuBar\"\n [ngClass]=\"{'NgxEditor--Disabled': disabled, 'NgxEditor__MenuBar--Reverse': dropdownPlacement === 'top'}\">\n\n <ng-container *ngFor=\"let toolbarItem of toolbar; let lastToolbarItem = last; trackBy: trackByIndex\">\n <ng-container *ngFor=\"let item of toolbarItem; let lastItem = last; trackBy: trackByIndex\">\n\n <!-- toggle icons -->\n <ngx-toggle-command [toolbarItem]=\"item\" [class]=\"iconContainerClass\" *ngIf=\"toggleCommands.includes(item)\">\n </ngx-toggle-command>\n\n <!-- link -->\n <ngx-link [class]=\"iconContainerClass\" *ngIf=\"item === 'link'\"></ngx-link>\n\n <!-- image -->\n <ngx-image [class]=\"iconContainerClass\" *ngIf=\"item === 'image'\">\n </ngx-image>\n\n <!-- dropdown -->\n <ng-container *ngIf=\"isDropDown(item)\">\n <ngx-dropdown *ngFor=\"let dropdownItem of getDropdownItems(item) | keyvalue; trackBy: trackByIndex\"\n [class]=\"dropdownContainerClass\" [group]=\"dropdownItem.key\" [items]=\"dropdownItem.value\">\n </ngx-dropdown>\n </ng-container>\n\n <!-- text color picker -->\n <ngx-color-picker [class]=\"iconContainerClass\" *ngIf=\"item === 'text_color'\" type=\"text_color\"\n [presets]=\"presets\">\n </ngx-color-picker>\n <!-- background color picker -->\n <ngx-color-picker [class]=\"iconContainerClass\" *ngIf=\"item === 'background_color'\" type=\"background_color\"\n [presets]=\"presets\">\n </ngx-color-picker>\n\n <!-- seperator -->\n <div [class]=\"seperatorClass\" *ngIf=\"lastItem && !lastToolbarItem\"></div>\n </ng-container>\n </ng-container>\n\n <!-- custom menu -->\n <ng-container *ngIf=\"customMenuRef\">\n <ng-container [ngTemplateOutlet]=\"customMenuRef\"></ng-container>\n </ng-container>\n\n</div>\n", styles: [""], components: [{ type: i2.ToggleCommandComponent, selector: "ngx-toggle-command", inputs: ["toolbarItem"] }, { type: i3.LinkComponent, selector: "ngx-link" }, { type: i4.ImageComponent, selector: "ngx-image" }, { type: i5.DropdownComponent, selector: "ngx-dropdown", inputs: ["group", "items"] }, { type: i6.ColorPickerComponent, selector: "ngx-color-picker", inputs: ["presets", "type"] }], directives: [{ type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }], pipes: { "keyvalue": i7.KeyValuePipe } }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.0", ngImport: i0, type: MenuComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-editor-menu', providers: [MenuService], template: "<div class=\"NgxEditor__MenuBar\"\n [ngClass]=\"{'NgxEditor--Disabled': disabled, 'NgxEditor__MenuBar--Reverse': dropdownPlacement === 'top'}\">\n\n <ng-container *ngFor=\"let toolbarItem of toolbar; let lastToolbarItem = last; trackBy: trackByIndex\">\n <ng-container *ngFor=\"let item of toolbarItem; let lastItem = last; trackBy: trackByIndex\">\n\n <!-- toggle icons -->\n <ngx-toggle-command [toolbarItem]=\"item\" [class]=\"iconContainerClass\" *ngIf=\"toggleCommands.includes(item)\">\n </ngx-toggle-command>\n\n <!-- link -->\n <ngx-link [class]=\"iconContainerClass\" *ngIf=\"item === 'link'\"></ngx-link>\n\n <!-- image -->\n <ngx-image [class]=\"iconContainerClass\" *ngIf=\"item === 'image'\">\n </ngx-image>\n\n <!-- dropdown -->\n <ng-container *ngIf=\"isDropDown(item)\">\n <ngx-dropdown *ngFor=\"let dropdownItem of getDropdownItems(item) | keyvalue; trackBy: trackByIndex\"\n [class]=\"dropdownContainerClass\" [group]=\"dropdownItem.key\" [items]=\"dropdownItem.value\">\n </ngx-dropdown>\n </ng-container>\n\n <!-- text color picker -->\n <ngx-color-picker [class]=\"iconContainerClass\" *ngIf=\"item === 'text_color'\" type=\"text_color\"\n [presets]=\"presets\">\n </ngx-color-picker>\n <!-- background color picker -->\n <ngx-color-picker [class]=\"iconContainerClass\" *ngIf=\"item === 'background_color'\" type=\"background_color\"\n [presets]=\"presets\">\n </ngx-color-picker>\n\n <!-- seperator -->\n <div [class]=\"seperatorClass\" *ngIf=\"lastItem && !lastToolbarItem\"></div>\n </ng-container>\n </ng-container>\n\n <!-- custom menu -->\n <ng-container *ngIf=\"customMenuRef\">\n <ng-container [ngTemplateOutlet]=\"customMenuRef\"></ng-container>\n </ng-container>\n\n</div>\n", styles: [""] }] }], ctorParameters: function () { return [{ type: i1.MenuService }]; }, propDecorators: { toolbar: [{ type: Input }], colorPresets: [{ type: Input }], disabled: [{ type: Input }], editor: [{ type: Input }], customMenuRef: [{ type: Input }], dropdownPlacement: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZWRpdG9yL3NyYy9saWIvbW9kdWxlcy9tZW51L21lbnUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LWVkaXRvci9zcmMvbGliL21vZHVsZXMvbWVudS9tZW51LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQUUsS0FBSyxFQUVqQixNQUFNLGVBQWUsQ0FBQztBQUl2QixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7OztBQUc3QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQVk7SUFDdEMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO0lBQ2xCLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQztJQUN0QixDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUM7SUFDdkIsQ0FBQyxjQUFjLEVBQUUsYUFBYSxDQUFDO0lBQy9CLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDbkQsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDO0lBQ2pCLENBQUMsWUFBWSxFQUFFLGtCQUFrQixDQUFDO0lBQ2xDLENBQUMsWUFBWSxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsZUFBZSxDQUFDO0NBQy9ELENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQVk7SUFDdEMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO0lBQ2xCLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUM7SUFD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InNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCwgSW5wdXQsXG4gIE9uSW5pdCwgVGVtcGxhdGVSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFRvb2xiYXIsIFRvb2xiYXJJdGVtLCBUb29sYmFyRHJvcGRvd24gfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmltcG9ydCB7IE1lbnVTZXJ2aWNlIH0gZnJvbSAnLi9tZW51LnNlcnZpY2UnO1xuaW1wb3J0IEVkaXRvciBmcm9tICcuLi8uLi9FZGl0b3InO1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9UT09MQkFSOiBUb29sYmFyID0gW1xuICBbJ2JvbGQnLCAnaXRhbGljJ10sXG4gIFsnY29kZScsICdibG9ja3F1b3RlJ10sXG4gIFsndW5kZXJsaW5lJywgJ3N0cmlrZSddLFxuICBbJ29yZGVyZWRfbGlzdCcsICdidWxsZXRfbGlzdCddLFxuICBbeyBoZWFkaW5nOiBbJ2gxJywgJ2gyJywgJ2gzJywgJ2g0JywgJ2g1JywgJ2g2J10gfV0sXG4gIFsnbGluaycsICdpbWFnZSddLFxuICBbJ3RleHRfY29sb3InLCAnYmFja2dyb3VuZF9jb2xvciddLFxuICBbJ2FsaWduX2xlZnQnLCAnYWxpZ25fY2VudGVyJywgJ2FsaWduX3JpZ2h0JywgJ2FsaWduX2p1c3RpZnknXSxcbl07XG5cbmV4cG9ydCBjb25zdCBUT09MQkFSX01JTklNQUw6IFRvb2xiYXIgPSBbXG4gIFsnYm9sZCcsICdpdGFsaWMnXSxcbiAgW3sgaGVhZGluZzogWydoMScsICdoMicsICdoMycsICdoNCcsICdoNScsICdoNiddIH1dLFxuICBbJ2xpbmsnLCAnaW1hZ2UnXSxcbiAgWyd0ZXh0X2NvbG9yJywgJ2JhY2tncm91bmRfY29sb3InXSxcbl1cblxuY29uc3QgREVGQVVMVF9DT0xPUl9QUkVTRVRTID0gW1xuICAnI2I2MDIwNScsXG4gICcjZDkzZjBiJyxcbiAgJyNmYmNhMDQnLFxuICAnIzBlOGExNicsXG4gICcjMDA2Yjc1JyxcbiAgJyMxZDc2ZGInLFxuICAnIzAwNTJjYycsXG4gICcjNTMxOWU3JyxcbiAgJyNlOTk2OTUnLFxuICAnI2Y5ZDBjNCcsXG4gICcjZmVmMmMwJyxcbiAgJyNjMmUwYzYnLFxuICAnI2JmZGFkYycsXG4gICcjYzVkZWY1JyxcbiAgJyNiZmQ0ZjInLFxuICAnI2Q0YzVmOSdcbl07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1lZGl0b3ItbWVudScsXG4gIHRlbXBsYXRlVXJsOiAnLi9tZW51LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWVudS5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtNZW51U2VydmljZV1cbn0pXG5cbmV4cG9ydCBjbGFzcyBNZW51Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgdG9vbGJhcjogVG9vbGJhciA9IFRPT0xCQVJfTUlOSU1BTDtcbiAgQElucHV0KCkgY29sb3JQcmVzZXRzOiBzdHJpbmdbXSA9IERFRkFVTFRfQ09MT1JfUFJFU0VUUztcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQElucHV0KCkgZWRpdG9yOiBFZGl0b3I7XG4gIEBJbnB1dCgpIGN1c3RvbU1lbnVSZWY6IFRlbXBsYXRlUmVmPGFueT4gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZHJvcGRvd25QbGFjZW1lbnQ6ICd0b3AnIHwgJ2JvdHRvbScgPSAnYm90dG9tJztcblxuICB0b2dnbGVDb21tYW5kczogYW55W10gPSBbXG4gICAgJ2JvbGQnLCAnaXRhbGljJyxcbiAgICAndW5kZXJsaW5lJywgJ3N0cmlrZScsXG4gICAgJ2NvZGUnLCAnYmxvY2txdW90ZScsXG4gICAgJ29yZGVyZWRfbGlzdCcsICdidWxsZXRfbGlzdCcsXG4gICAgJ2FsaWduX2xlZnQnLCAnYWxpZ25fY2VudGVyJywgJ2FsaWduX3JpZ2h0JywgJ2FsaWduX2p1c3RpZnknXG4gIF07XG5cbiAgaWNvbkNvbnRhaW5lckNsYXNzID0gWydOZ3hFZGl0b3JfX01lbnVJdGVtJywgJ05neEVkaXRvcl9fTWVudUl0ZW0tLUljb24nXTtcbiAgZHJvcGRvd25Db250YWluZXJDbGFzcyA9IFsnTmd4RWRpdG9yX19Ecm9wZG93biddO1xuICBzZXBlcmF0b3JDbGFzcyA9IFsnTmd4RWRpdG9yX19TZXBlcmF0b3InXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1lbnVTZXJ2aWNlOiBNZW51U2VydmljZSkgeyB9XG5cbiAgZ2V0IHByZXNldHMoKTogc3RyaW5nW11bXSB7XG4gICAgY29uc3QgY29sID0gODtcbiAgICBjb25zdCBjb2xvcnM6IHN0cmluZ1tdW10gPSBbXTtcblxuICAgIHRoaXMuY29sb3JQcmVzZXRzLmZvckVhY2goKGNvbG9yLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3Qgcm93ID0gTWF0aC5mbG9vcihpbmRleCAvIGNvbCk7XG5cbiAgICAgIGlmICghY29sb3JzW3Jvd10pIHtcbiAgICAgICAgY29sb3JzLnB1c2goW10pO1xuICAgICAgfVxuXG4gICAgICBjb2xvcnNbcm93XS5wdXNoKGNvbG9yKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBjb2xvcnM7XG4gIH1cblxuICB0cmFja0J5SW5kZXgoaW5kZXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGluZGV4XG4gIH1cblxuICBpc0Ryb3BEb3duKGl0ZW06IFRvb2xiYXJJdGVtKTogYm9vbGVhbiB7XG4gICAgaWYgKChpdGVtIGFzIFRvb2xiYXJEcm9wZG93bik/LmhlYWRpbmcpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldERyb3Bkb3duSXRlbXMoaXRlbTogVG9vbGJhckl0ZW0pOiBUb29sYmFyRHJvcGRvd24ge1xuICAgIHJldHVybiBpdGVtIGFzIFRvb2xiYXJEcm9wZG93bjtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5lZGl0b3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTmd4RWRpdG9yOiBSZXF1aXJlZCBlZGl0b3IgaW5zdGFuY2UnKTtcbiAgICB9XG5cbiAgICB0aGlzLm1lbnVTZXJ2aWNlLmVkaXRvciA9IHRoaXMuZWRpdG9yO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwiTmd4RWRpdG9yX19NZW51QmFyXCJcbiAgW25nQ2xhc3NdPVwieydOZ3hFZGl0b3ItLURpc2FibGVkJzogZGlzYWJsZWQsICdOZ3hFZGl0b3JfX01lbnVCYXItLVJldmVyc2UnOiBkcm9wZG93blBsYWNlbWVudCA9PT0gJ3RvcCd9XCI+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdG9vbGJhckl0ZW0gb2YgdG9vbGJhcjsgbGV0IGxhc3RUb29sYmFySXRlbSA9IGxhc3Q7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgdG9vbGJhckl0ZW07IGxldCBsYXN0SXRlbSA9IGxhc3Q7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiPlxuXG4gICAgICA8IS0tIHRvZ2dsZSBpY29ucyAtLT5cbiAgICAgIDxuZ3gtdG9nZ2xlLWNvbW1hbmQgW3Rvb2xiYXJJdGVtXT1cIml0ZW1cIiBbY2xhc3NdPVwiaWNvbkNvbnRhaW5lckNsYXNzXCIgKm5nSWY9XCJ0b2dnbGVDb21tYW5kcy5pbmNsdWRlcyhpdGVtKVwiPlxuICAgICAgPC9uZ3gtdG9nZ2xlLWNvbW1hbmQ+XG5cbiAgICAgIDwhLS0gbGluayAtLT5cbiAgICAgIDxuZ3gtbGluayBbY2xhc3NdPVwiaWNvbkNvbnRhaW5lckNsYXNzXCIgKm5nSWY9XCJpdGVtID09PSAnbGluaydcIj48L25neC1saW5rPlxuXG4gICAgICA8IS0tIGltYWdlIC0tPlxuICAgICAgPG5neC1pbWFnZSBbY2xhc3NdPVwiaWNvbkNvbnRhaW5lckNsYXNzXCIgKm5nSWY9XCJpdGVtID09PSAnaW1hZ2UnXCI+XG4gICAgICA8L25neC1pbWFnZT5cblxuICAgICAgPCEtLSBkcm9wZG93biAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0Ryb3BEb3duKGl0ZW0pXCI+XG4gICAgICAgIDxuZ3gtZHJvcGRvd24gKm5nRm9yPVwibGV0IGRyb3Bkb3duSXRlbSBvZiBnZXREcm9wZG93bkl0ZW1zKGl0ZW0pIHwga2V5dmFsdWU7IHRyYWNrQnk6IHRyYWNrQnlJbmRleFwiXG4gICAgICAgICAgW2NsYXNzXT1cImRyb3Bkb3duQ29udGFpbmVyQ2xhc3NcIiBbZ3JvdXBdPVwiZHJvcGRvd25JdGVtLmtleVwiIFtpdGVtc109XCJkcm9wZG93bkl0ZW0udmFsdWVcIj5cbiAgICAgICAgPC9uZ3gtZHJvcGRvd24+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSB0ZXh0IGNvbG9yIHBpY2tlciAtLT5cbiAgICAgIDxuZ3gtY29sb3ItcGlja2VyIFtjbGFzc109XCJpY29uQ29udGFpbmVyQ2xhc3NcIiAqbmdJZj1cIml0ZW0gPT09ICd0ZXh0X2NvbG9yJ1wiIHR5cGU9XCJ0ZXh0X2NvbG9yXCJcbiAgICAgICAgW3ByZXNldHNdPVwicHJlc2V0c1wiPlxuICAgICAgPC9uZ3gtY29sb3ItcGlja2VyPlxuICAgICAgPCEtLSBiYWNrZ3JvdW5kIGNvbG9yIHBpY2tlciAtLT5cbiAgICAgIDxuZ3gtY29sb3ItcGlja2VyIFtjbGFzc109XCJpY29uQ29udGFpbmVyQ2xhc3NcIiAqbmdJZj1cIml0ZW0gPT09ICdiYWNrZ3JvdW5kX2NvbG9yJ1wiIHR5cGU9XCJiYWNrZ3JvdW5kX2NvbG9yXCJcbiAgICAgICAgW3ByZXNldHNdPVwicHJlc2V0c1wiPlxuICAgICAgPC9uZ3gtY29sb3ItcGlja2VyPlxuXG4gICAgICA8IS0tIHNlcGVyYXRvciAtLT5cbiAgICAgIDxkaXYgW2NsYXNzXT1cInNlcGVyYXRvckNsYXNzXCIgKm5nSWY9XCJsYXN0SXRlbSAmJiAhbGFzdFRvb2xiYXJJdGVtXCI+PC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDwhLS0gY3VzdG9tIG1lbnUgLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXN0b21NZW51UmVmXCI+XG4gICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjdXN0b21NZW51UmVmXCI+PC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuXG48L2Rpdj5cbiJdfQ==