UNPKG

survey-creator-angular

Version:

Use SurveyJS Creator to create or edit JSON for SurveyJS Form Library.

123 lines 20.1 kB
import { Component, Input, ViewChild } from "@angular/core"; import { StringEditorViewModelBase, editableStringRendererName } from "survey-creator-core"; import { CreatorModelComponent } from "./creator-model.component"; import { AngularComponentFactory } from "survey-angular-ui"; import * as i0 from "@angular/core"; import * as i1 from "survey-angular-ui"; import * as i2 from "@angular/common"; export class StringEditorComponent extends CreatorModelComponent { constructor(cdr, vcr, ngZone) { super(cdr, vcr); this.ngZone = ngZone; this.justFocused = false; this.onChangeHandler = () => { this.detectChanges(); }; } createModel() { this.baseModel = new StringEditorViewModelBase(this.locString, this.creator); this.baseModel.setLocString(this.locString); this.baseModel.blurEditor = () => { this.container.nativeElement.blur(); this.container.nativeElement.spellcheck = false; }; this.baseModel.getEditorElement = () => this.container.nativeElement; this.ngZone.runOutsideAngular(() => { setTimeout(() => this.baseModel.afterRender()); }); } get locString() { return this.model.locStr; } get creator() { return this.model.creator; } getModel() { return this.baseModel; } getPropertiesToTrack() { return ["creator", "locString"]; } get placeholder() { return this.baseModel.placeholder; } get contentEditable() { return this.baseModel.contentEditable; } get characterCounter() { return this.baseModel.characterCounter; } get showCharacterCounter() { return this.baseModel.showCharacterCounter; } get getCharacterCounterClass() { return this.baseModel.getCharacterCounterClass; } get className() { return this.baseModel.className(this.locString.renderedHtml); } get errorText() { return this.baseModel.errorText; } onBlur(event) { this.container.nativeElement.spellcheck = false; this.locString.__isEditing = false; this.justFocused = false; this.baseModel.onBlur(event); return this.baseModel.errorText; } onFocus(event) { this.baseModel.onFocus(event); this.justFocused = true; } onPaste(event) { this.baseModel.onPaste(event); } done(event) { this.baseModel.done(event); this.locString.__isEditing = false; } edit(event) { this.container.nativeElement.focus(); this.locString.__isEditing = true; this.baseModel.onClick(event); } ngOnInit() { var _a; super.ngOnInit(); (_a = this.locString) === null || _a === void 0 ? void 0 : _a.onStringChanged.add(this.onChangeHandler); } ngAfterViewInit() { if (this.locString.__isEditing) { this.container.nativeElement.focus(); } } ngOnDestroy() { var _a; this.baseModel.blurEditor = undefined; this.baseModel.getEditorElement = undefined; this.baseModel.dispose(); (_a = this.locString) === null || _a === void 0 ? void 0 : _a.onStringChanged.remove(this.onChangeHandler); super.ngOnDestroy(); } get ariaLabel() { return this.placeholder || "content editable"; } } StringEditorComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: StringEditorComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ViewContainerRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); StringEditorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: StringEditorComponent, selector: "svc-string-edtior", inputs: { model: "model" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<ng-template #template>\n <span [class]=\"className\">\n <span class=\"svc-string-editor__content\">\n <div class=\"svc-string-editor__border svc-string-editor__border--hover\"></div>\n <div class=\"svc-string-editor__border svc-string-editor__border--focus\"></div>\n <span class=\"svc-string-editor__input\">\n <span role=\"textbox\" *ngIf=\"!locString.hasHtml\" class=\"sv-string-editor\" spellcheck=\"false\"\n (focus)=\"onFocus($event)\" (paste)=\"onPaste($event)\" (blur)=\"onBlur($event)\" (input)=\"baseModel.onInput($event)\" (keydown)=\"baseModel.onKeyDown($event)\" (keyup)=\"baseModel.onKeyUp($event)\" (compositionstart)=\"baseModel.onCompositionStart($event)\" (compositionend)=\"baseModel.onCompositionEnd($event)\" (mouseup)=\"baseModel.onMouseUp($event)\" (click)=\"edit($event)\" [textContent]=\"locString.renderedHtml\" [attr.aria-placeholder]=\"placeholder\" [attr.aria-label]=\"ariaLabel\" [attr.contenteditable]=\"contentEditable\" #container></span>\n <span role=\"textbox\" *ngIf=\"locString.hasHtml\" class=\"sv-string-editor sv-string-editor--html\" spellcheck=\"false\"\n (focus)=\"onFocus($event)\" (blur)=\"onBlur($event)\" (keydown)=\"baseModel.onKeyDown($event)\" (keyup)=\"baseModel.onKeyUp($event)\" (compositionstart)=\"baseModel.onCompositionStart($event)\" (compositionend)=\"baseModel.onCompositionEnd($event)\" (mouseup)=\"baseModel.onMouseUp($event)\"\n (click)=\"edit($event)\" [attr.aria-placeholder]=\"placeholder\" [attr.aria-label]=\"ariaLabel\" [attr.contenteditable]=\"contentEditable\" [innerHtml]=\"locString.renderedHtml | safeHtml\" #container></span>\n <sv-ng-character-counter *ngIf=\"showCharacterCounter\" [counter]=\"characterCounter\" [remainingCharacterCounter]=\"getCharacterCounterClass\"></sv-ng-character-counter>\n </span>\n </span>\n <span *ngIf=\"errorText\" class=\"svc-string-editor__error\">{{errorText}}</span>\n </span>\n</ng-template>", styles: [":host { display: none; }"], components: [{ type: i1.CharacterCounterComponent, selector: "sv-ng-character-counter", inputs: ["counter", "remainingCharacterCounter"] }], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "safeHtml": i1.SafeHtmlPipe } }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: StringEditorComponent, decorators: [{ type: Component, args: [{ selector: "svc-string-edtior", templateUrl: "./string-editor.component.html", styles: [":host { display: none; }"] }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ViewContainerRef }, { type: i0.NgZone }]; }, propDecorators: { model: [{ type: Input }], container: [{ type: ViewChild, args: ["container"] }] } }); AngularComponentFactory.Instance.registerComponent(editableStringRendererName, StringEditorComponent); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RyaW5nLWVkaXRvci5jb21wb25lbnQudHMiLCIuLi8uLi9zcmMvc3RyaW5nLWVkaXRvci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9DLFNBQVMsRUFBYyxLQUFLLEVBQVUsU0FBUyxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQUVwSSxPQUFPLEVBQUUseUJBQXlCLEVBQXNCLDBCQUEwQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDaEgsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7Ozs7QUFPNUQsTUFBTSxPQUFPLHFCQUFzQixTQUFRLHFCQUFnRDtJQUt6RixZQUFZLEdBQXNCLEVBQUUsR0FBcUIsRUFBVSxNQUFjO1FBQy9FLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFEaUQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUh6RSxnQkFBVyxHQUFZLEtBQUssQ0FBQztRQW9EckMsb0JBQWUsR0FBRyxHQUFTLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQztJQWpERixDQUFDO0lBQ00sV0FBVztRQUNoQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUkseUJBQXlCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLEdBQUcsRUFBRTtZQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FB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QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBJbnB1dCwgTmdab25lLCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgTG9jYWxpemFibGVTdHJpbmcsIENoYXJhY3RlckNvdW50ZXIgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFN0cmluZ0VkaXRvclZpZXdNb2RlbEJhc2UsIFN1cnZleUNyZWF0b3JNb2RlbCwgZWRpdGFibGVTdHJpbmdSZW5kZXJlck5hbWUgfSBmcm9tIFwic3VydmV5LWNyZWF0b3ItY29yZVwiO1xuaW1wb3J0IHsgQ3JlYXRvck1vZGVsQ29tcG9uZW50IH0gZnJvbSBcIi4vY3JlYXRvci1tb2RlbC5jb21wb25lbnRcIjtcbmltcG9ydCB7IEFuZ3VsYXJDb21wb25lbnRGYWN0b3J5IH0gZnJvbSBcInN1cnZleS1hbmd1bGFyLXVpXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogXCJzdmMtc3RyaW5nLWVkdGlvclwiLFxuICB0ZW1wbGF0ZVVybDogXCIuL3N0cmluZy1lZGl0b3IuY29tcG9uZW50Lmh0bWxcIixcbiAgc3R5bGVzOiBbXCI6aG9zdCB7IGRpc3BsYXk6IG5vbmU7IH1cIl1cbn0pXG5leHBvcnQgY2xhc3MgU3RyaW5nRWRpdG9yQ29tcG9uZW50IGV4dGVuZHMgQ3JlYXRvck1vZGVsQ29tcG9uZW50PFN0cmluZ0VkaXRvclZpZXdNb2RlbEJhc2U+IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIHB1YmxpYyBiYXNlTW9kZWwhOiBTdHJpbmdFZGl0b3JWaWV3TW9kZWxCYXNlO1xuICBwcml2YXRlIGp1c3RGb2N1c2VkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1vZGVsITogYW55O1xuICBAVmlld0NoaWxkKFwiY29udGFpbmVyXCIpIGNvbnRhaW5lciE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBjb25zdHJ1Y3RvcihjZHI6IENoYW5nZURldGVjdG9yUmVmLCB2Y3I6IFZpZXdDb250YWluZXJSZWYsIHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHtcbiAgICBzdXBlcihjZHIsIHZjcik7XG4gIH1cbiAgcHVibGljIGNyZWF0ZU1vZGVsKCk6IHZvaWQge1xuICAgIHRoaXMuYmFzZU1vZGVsID0gbmV3IFN0cmluZ0VkaXRvclZpZXdNb2RlbEJhc2UodGhpcy5sb2NTdHJpbmcsIHRoaXMuY3JlYXRvcik7XG4gICAgdGhpcy5iYXNlTW9kZWwuc2V0TG9jU3RyaW5nKHRoaXMubG9jU3RyaW5nKTtcbiAgICB0aGlzLmJhc2VNb2RlbC5ibHVyRWRpdG9yID0gKCkgPT4ge1xuICAgICAgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5ibHVyKCk7XG4gICAgICB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50LnNwZWxsY2hlY2sgPSBmYWxzZTtcbiAgICB9O1xuICAgIHRoaXMuYmFzZU1vZGVsLmdldEVkaXRvckVsZW1lbnQgPSAoKSA9PiB0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5iYXNlTW9kZWwuYWZ0ZXJSZW5kZXIoKSk7XG4gICAgfSk7XG4gIH1cbiAgcHVibGljIGdldCBsb2NTdHJpbmcoKTogTG9jYWxpemFibGVTdHJpbmcge1xuICAgIHJldHVybiB0aGlzLm1vZGVsLmxvY1N0cjtcbiAgfVxuICBwdWJsaWMgZ2V0IGNyZWF0b3IoKTogU3VydmV5Q3JlYXRvck1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbC5jcmVhdG9yO1xuICB9XG4gIHByb3RlY3RlZCBnZXRNb2RlbCgpOiBTdHJpbmdFZGl0b3JWaWV3TW9kZWxCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5iYXNlTW9kZWw7XG4gIH1cbiAgcHJvdGVjdGVkIGdldFByb3BlcnRpZXNUb1RyYWNrKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1wiY3JlYXRvclwiLCBcImxvY1N0cmluZ1wiXTtcbiAgfVxuICBwdWJsaWMgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZU1vZGVsLnBsYWNlaG9sZGVyO1xuICB9XG4gIHB1YmxpYyBnZXQgY29udGVudEVkaXRhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmJhc2VNb2RlbC5jb250ZW50RWRpdGFibGU7XG4gIH1cbiAgcHVibGljIGdldCBjaGFyYWN0ZXJDb3VudGVyKCk6IENoYXJhY3RlckNvdW50ZXIge1xuICAgIHJldHVybiB0aGlzLmJhc2VNb2RlbC5jaGFyYWN0ZXJDb3VudGVyO1xuICB9XG4gIHB1YmxpYyBnZXQgc2hvd0NoYXJhY3RlckNvdW50ZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZU1vZGVsLnNob3dDaGFyYWN0ZXJDb3VudGVyO1xuICB9XG4gIHB1YmxpYyBnZXQgZ2V0Q2hhcmFjdGVyQ291bnRlckNsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZU1vZGVsLmdldENoYXJhY3RlckNvdW50ZXJDbGFzcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY2xhc3NOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZU1vZGVsLmNsYXNzTmFtZSh0aGlzLmxvY1N0cmluZy5yZW5kZXJlZEh0bWwpO1xuICB9XG4gIHB1YmxpYyBnZXQgZXJyb3JUZXh0KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZU1vZGVsLmVycm9yVGV4dDtcbiAgfVxuICBvbkNoYW5nZUhhbmRsZXIgPSAoKTogdm9pZCA9PiB7XG4gICAgdGhpcy5kZXRlY3RDaGFuZ2VzKCk7XG4gIH07XG4gIHB1YmxpYyBvbkJsdXIoZXZlbnQ6IGFueSk6IHN0cmluZyB7XG4gICAgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5zcGVsbGNoZWNrID0gZmFsc2U7XG4gICAgKDxhbnk+dGhpcy5sb2NTdHJpbmcpLl9faXNFZGl0aW5nID0gZmFsc2U7XG4gICAgdGhpcy5qdXN0Rm9jdXNlZCA9IGZhbHNlO1xuICAgIHRoaXMuYmFzZU1vZGVsLm9uQmx1cihldmVudCk7XG4gICAgcmV0dXJuIHRoaXMuYmFzZU1vZGVsLmVycm9yVGV4dDtcbiAgfVxuICBwdWJsaWMgb25Gb2N1cyhldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5iYXNlTW9kZWwub25Gb2N1cyhldmVudCk7XG4gICAgdGhpcy5qdXN0Rm9jdXNlZCA9IHRydWU7XG4gIH1cbiAgcHVibGljIG9uUGFzdGUoZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuYmFzZU1vZGVsLm9uUGFzdGUoZXZlbnQpO1xuICB9XG4gIHB1YmxpYyBkb25lKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmJhc2VNb2RlbC5kb25lKGV2ZW50KTtcbiAgICAoPGFueT50aGlzLmxvY1N0cmluZykuX19pc0VkaXRpbmcgPSBmYWxzZTtcbiAgfVxuICBwdWJsaWMgZWRpdChldmVudDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICg8YW55PnRoaXMubG9jU3RyaW5nKS5fX2lzRWRpdGluZyA9IHRydWU7XG4gICAgdGhpcy5iYXNlTW9kZWwub25DbGljayhldmVudCk7XG4gIH1cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICB0aGlzLmxvY1N0cmluZz8ub25TdHJpbmdDaGFuZ2VkLmFkZCh0aGlzLm9uQ2hhbmdlSGFuZGxlcik7XG4gIH1cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIGlmICgoPGFueT50aGlzLmxvY1N0cmluZykuX19pc0VkaXRpbmcpIHtcbiAgICAgIHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gIH1cbiAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5iYXNlTW9kZWwuYmx1ckVkaXRvciA9IHVuZGVmaW5lZCBhcyBhbnk7XG4gICAgdGhpcy5iYXNlTW9kZWwuZ2V0RWRpdG9yRWxlbWVudCA9IHVuZGVmaW5lZCBhcyBhbnk7XG4gICAgdGhpcy5iYXNlTW9kZWwuZGlzcG9zZSgpO1xuICAgIHRoaXMubG9jU3RyaW5nPy5vblN0cmluZ0NoYW5nZWQucmVtb3ZlKHRoaXMub25DaGFuZ2VIYW5kbGVyKTtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICB9XG4gIGdldCBhcmlhTGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wbGFjZWhvbGRlciB8fCBcImNvbnRlbnQgZWRpdGFibGVcIjtcbiAgfVxufVxuXG5Bbmd1bGFyQ29tcG9uZW50RmFjdG9yeS5JbnN0YW5jZS5yZWdpc3RlckNvbXBvbmVudChlZGl0YWJsZVN0cmluZ1JlbmRlcmVyTmFtZSwgU3RyaW5nRWRpdG9yQ29tcG9uZW50KTsiLCI8bmctdGVtcGxhdGUgI3RlbXBsYXRlPlxuICA8c3BhbiBbY2xhc3NdPVwiY2xhc3NOYW1lXCI+XG4gICAgPHNwYW4gY2xhc3M9XCJzdmMtc3RyaW5nLWVkaXRvcl9fY29udGVudFwiPlxuICAgICAgPGRpdiBjbGFzcz1cInN2Yy1zdHJpbmctZWRpdG9yX19ib3JkZXIgc3ZjLXN0cmluZy1lZGl0b3JfX2JvcmRlci0taG92ZXJcIj48L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN2Yy1zdHJpbmctZWRpdG9yX19ib3JkZXIgc3ZjLXN0cmluZy1lZGl0b3JfX2JvcmRlci0tZm9jdXNcIj48L2Rpdj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmMtc3RyaW5nLWVkaXRvcl9faW5wdXRcIj5cbiAgICAgICAgICA8c3BhbiByb2xlPVwidGV4dGJveFwiICpuZ0lmPVwiIWxvY1N0cmluZy5oYXNIdG1sXCIgY2xhc3M9XCJzdi1zdHJpbmctZWRpdG9yXCIgc3BlbGxjaGVjaz1cImZhbHNlXCJcbiAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoJGV2ZW50KVwiIChwYXN0ZSk9XCJvblBhc3RlKCRldmVudClcIiAoYmx1cik9XCJvbkJsdXIoJGV2ZW50KVwiICAoaW5wdXQpPVwiYmFzZU1vZGVsLm9uSW5wdXQoJGV2ZW50KVwiIChrZXlkb3duKT1cImJhc2VNb2RlbC5vbktleURvd24oJGV2ZW50KVwiIChrZXl1cCk9XCJiYXNlTW9kZWwub25LZXlVcCgkZXZlbnQpXCIgKGNvbXBvc2l0aW9uc3RhcnQpPVwiYmFzZU1vZGVsLm9uQ29tcG9zaXRpb25TdGFydCgkZXZlbnQpXCIgKGNvbXBvc2l0aW9uZW5kKT1cImJhc2VNb2RlbC5vbkNvbXBvc2l0aW9uRW5kKCRldmVudClcIiAobW91c2V1cCk9XCJiYXNlTW9kZWwub25Nb3VzZVVwKCRldmVudClcIiAoY2xpY2spPVwiZWRpdCgkZXZlbnQpXCIgW3RleHRDb250ZW50XT1cImxvY1N0cmluZy5yZW5kZXJlZEh0bWxcIiBbYXR0ci5hcmlhLXBsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIiBbYXR0ci5jb250ZW50ZWRpdGFibGVdPVwiY29udGVudEVkaXRhYmxlXCIgI2NvbnRhaW5lcj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4gcm9sZT1cInRleHRib3hcIiAqbmdJZj1cImxvY1N0cmluZy5oYXNIdG1sXCIgY2xhc3M9XCJzdi1zdHJpbmctZWRpdG9yIHN2LXN0cmluZy1lZGl0b3ItLWh0bWxcIiBzcGVsbGNoZWNrPVwiZmFsc2VcIlxuICAgICAgICAgIChmb2N1cyk9XCJvbkZvY3VzKCRldmVudClcIiAoYmx1cik9XCJvbkJsdXIoJGV2ZW50KVwiIChrZXlkb3duKT1cImJhc2VNb2RlbC5vbktleURvd24oJGV2ZW50KVwiIChrZXl1cCk9XCJiYXNlTW9kZWwub25LZXlVcCgkZXZlbnQpXCIgKGNvbXBvc2l0aW9uc3RhcnQpPVwiYmFzZU1vZGVsLm9uQ29tcG9zaXRpb25TdGFydCgkZXZlbnQpXCIgKGNvbXBvc2l0aW9uZW5kKT1cImJhc2VNb2RlbC5vbkNvbXBvc2l0aW9uRW5kKCRldmVudClcIiAobW91c2V1cCk9XCJiYXNlTW9kZWwub25Nb3VzZVVwKCRldmVudClcIlxuICAgICAgICAgIChjbGljayk9XCJlZGl0KCRldmVudClcIiBbYXR0ci5hcmlhLXBsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIiBbYXR0ci5jb250ZW50ZWRpdGFibGVdPVwiY29udGVudEVkaXRhYmxlXCIgW2lubmVySHRtbF09XCJsb2NTdHJpbmcucmVuZGVyZWRIdG1sIHwgc2FmZUh0bWxcIiAjY29udGFpbmVyPjwvc3Bhbj5cbiAgICAgICAgICA8c3YtbmctY2hhcmFjdGVyLWNvdW50ZXIgKm5nSWY9XCJzaG93Q2hhcmFjdGVyQ291bnRlclwiIFtjb3VudGVyXT1cImNoYXJhY3RlckNvdW50ZXJcIiBbcmVtYWluaW5nQ2hhcmFjdGVyQ291bnRlcl09XCJnZXRDaGFyYWN0ZXJDb3VudGVyQ2xhc3NcIj48L3N2LW5nLWNoYXJhY3Rlci1jb3VudGVyPlxuICAgICAgICA8L3NwYW4+XG4gICAgPC9zcGFuPlxuICAgIDxzcGFuICpuZ0lmPVwiZXJyb3JUZXh0XCIgY2xhc3M9XCJzdmMtc3RyaW5nLWVkaXRvcl9fZXJyb3JcIj57e2Vycm9yVGV4dH19PC9zcGFuPlxuICA8L3NwYW4+XG48L25nLXRlbXBsYXRlPiJdfQ==