survey-creator-angular
Version:
A white-label drag-and-drop form builder for Angular that lets you design complex, interactive forms and surveys without writing code. It generates JSON schemas used by the SurveyJS Form Library to render dynamic forms in your Angular app.
99 lines • 18.1 kB
JavaScript
import { Component, ElementRef, Input, ViewChild } from "@angular/core";
import { AngularComponentFactory } from "survey-angular-ui";
import { ItemValueWrapperViewModel } from "survey-creator-core";
import { CreatorModelComponent } from "../creator-model.component";
import * as i0 from "@angular/core";
import * as i1 from "survey-angular-ui";
import * as i2 from "@angular/common";
export class ItemValueDesignerComponent extends CreatorModelComponent {
get creator() {
return this.componentData.data.creator;
}
get question() {
return this.componentData.question;
}
get item() {
return this.componentData.model;
}
onBlur(event) {
this.adorner.onFocusOut(event);
}
getPanelComponentName(panel) {
const survey = this.creator.survey;
if (!!survey) {
const name = survey.getElementWrapperComponentName(panel);
if (!!name) {
return name;
}
}
return "panel";
}
getPanelComponentData(panel) {
const survey = this.creator.survey;
let data;
if (!!survey) {
data = survey.getElementWrapperComponentData(panel);
}
return {
componentName: "panel",
componentData: {
model: panel,
data: data
}
};
}
setupContainer() {
var _a;
if (this.item && ((_a = this.container) === null || _a === void 0 ? void 0 : _a.nativeElement)) {
this.item.setRootElement(this.container.nativeElement);
}
}
cleanContainer(item) {
if (!!item) {
item.setRootElement(undefined);
}
}
createModel() {
if (this.componentData) {
this.adorner = new ItemValueWrapperViewModel(this.creator, this.question, this.item);
if (this.prevItem !== this.item) {
this.setupContainer();
this.cleanContainer(this.prevItem);
this.prevItem = this.item;
}
}
}
getPropertiesToTrack() {
return ["creator", "question", "item"];
}
getModel() {
return this.adorner;
}
ngOnDestroy() {
super.ngOnDestroy();
this.adorner.dispose();
this.cleanContainer(this.item);
}
ngAfterViewInit() {
this.setupContainer();
}
}
ItemValueDesignerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ItemValueDesignerComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
ItemValueDesignerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: ItemValueDesignerComponent, selector: "svc-item-value", inputs: { componentName: "componentName", componentData: "componentData" }, viewQueries: [{ propertyName: "container", first: true, predicate: ["container"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: "<ng-template #template>\n <div class=\"svc-item-value-wrapper\" (pointerdown)=\"adorner.onPointerDown($event)\"\n [attr.data-sv-drop-target-item-value]=\"adorner.isDraggable ? item.value : null\"\n [ngClass]=\"{'svc-item-value--new': adorner.isNew, 'svc-item-value--dragging': adorner.isDragging, 'svc-item-value--ghost': adorner.isDragDropGhost, 'svc-item-value--movedown': adorner.isDragDropMoveDown, 'svc-item-value--moveup': adorner.isDragDropMoveUp}\"\n #container>\n <div class=\"svc-item-value__ghost\"></div>\n <div class=\"svc-item-value-controls\">\n <span *ngIf=\"adorner.isDraggable\" class=\"svc-item-value-controls__button svc-item-value-controls__drag\">\n <svg class=\"svc-item-value-controls__drag-icon\" [iconName]=\"'icon-drag-24x24'\" [size]=\"'auto'\"\n [attr.title]=\"adorner.dragTooltip\" sv-ng-svg-icon></svg>\n </span>\n <span *ngIf=\"adorner.allowAdd\" class=\"svc-item-value-controls__button svc-item-value-controls__add\" [key2click]\n (click)=\"adorner.add(adorner)\" role=\"button\" [attr.aria-label]=\"adorner.tooltip\"><svg [iconName]=\"'icon-add_16x16'\" [size]=\"'auto'\"\n [attr.title]=\"adorner.tooltip\" sv-ng-svg-icon></svg></span>\n <span *ngIf=\"adorner.allowRemove\" class=\"svc-item-value-controls__button svc-item-value-controls__remove\"\n [key2click] (click)=\"adorner.remove(adorner)\" (blur)=\"onBlur($event)\" role=\"button\" [attr.aria-label]=\"adorner.tooltip\"><svg\n [iconName]=\"'icon-remove_16x16'\" [size]=\"'auto'\" [attr.title]=\"adorner.tooltip\" sv-ng-svg-icon></svg></span>\n </div>\n\n <div class=\"svc-item-value__item\" (click)=\"adorner.select(adorner, $event)\">\n <ng-template [component]=\"{ name: componentName, data: componentData }\"></ng-template>\n </div>\n\n <div *ngIf=\"adorner.canShowPanel()\" class=\"svc-item-value-controls svc-choice-elements-button-container\">\n <span\n role=\"button\"\n class=\"svc-item-value-controls__button svc-item-value-controls__add svc-choice-elements-button\"\n (click)=\"adorner.togglePanel()\"\n [key2click]\n >\n <svg\n [iconName]=\"adorner.showPanel ? 'icon-collapsepanel-16x16' : 'icon-expandpanel-16x16'\" \n [size]=\"'auto'\" \n sv-ng-svg-icon>\n </svg>\n </span>\n </div>\n </div>\n <ng-template *ngIf=\"adorner.showPanel\"\n [component]=\"{ name: getPanelComponentName(item.panel), data: getPanelComponentData(item.panel) }\"></ng-template>\n</ng-template>", styles: [":host { display: none; }"], components: [{ type: i1.SvgIconComponent, selector: "'[sv-ng-svg-icon]'", inputs: ["size", "width", "height", "iconName", "partCss", "css", "title"] }], directives: [{ type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.Key2ClickDirective, selector: "[key2click]", inputs: ["key2click"] }, { type: i1.DynamicComponentDirective, selector: "[component]", inputs: ["component"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ItemValueDesignerComponent, decorators: [{
type: Component,
args: [{
selector: "svc-item-value",
templateUrl: "./item-value.component.html",
styles: [":host { display: none; }"]
}]
}], propDecorators: { componentName: [{
type: Input
}], componentData: [{
type: Input
}], container: [{
type: ViewChild,
args: ["container", { read: ElementRef }]
}] } });
AngularComponentFactory.Instance.registerComponent("svc-item-value", ItemValueDesignerComponent);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbS12YWx1ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWRvcm5lcnMvaXRlbS12YWx1ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi9zcmMvYWRvcm5lcnMvaXRlbS12YWx1ZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQW9DLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFDNUgsT0FBTyxFQUFFLHVCQUF1QixFQUE2QyxNQUFNLG1CQUFtQixDQUFDO0FBRXZHLE9BQU8sRUFBc0IseUJBQXlCLEVBQTRCLE1BQU0scUJBQXFCLENBQUM7QUFDOUcsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7QUFPbkUsTUFBTSxPQUFPLDBCQUEyQixTQUFRLHFCQUFnRDtJQU05RixJQUFZLE9BQU87UUFDakIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDekMsQ0FBQztJQUNELElBQVcsUUFBUTtRQUNqQixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDO0lBQ3JDLENBQUM7SUFDRCxJQUFXLElBQUk7UUFDYixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO0lBQ2xDLENBQUM7SUFDTSxNQUFNLENBQUMsS0FBVTtRQUN0QixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBQ00scUJBQXFCLENBQUMsS0FBaUI7UUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDbkMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFO1lBQ1osTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLDhCQUE4QixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFELElBQUksQ0FBQyxDQUFDLElBQUksRUFBRTtnQkFDVixPQUFPLElBQUksQ0FBQzthQUNiO1NBQ0Y7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBQ00scUJBQXFCLENBQUMsS0FBaUI7UUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7UUFDbkMsSUFBSSxJQUFTLENBQUM7UUFDZCxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUU7WUFDWixJQUFJLEdBQUcsTUFBTSxDQUFDLDhCQUE4QixDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3JEO1FBQ0QsT0FBTztZQUNMLGFBQWEsRUFBRSxPQUFPO1lBQ3RCLGFBQWEsRUFBRTtnQkFDYixLQUFLLEVBQUUsS0FBSztnQkFDWixJQUFJLEVBQUUsSUFBSTthQUNYO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyxjQUFjOztRQUNwQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUksTUFBQSxJQUFJLENBQUMsU0FBUywwQ0FBRSxhQUFhLENBQUEsRUFBRTtZQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3hEO0lBQ0gsQ0FBQztJQUNPLGNBQWMsQ0FBQyxJQUFlO1FBQ3BDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRTtZQUNWLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBZ0IsQ0FBQyxDQUFDO1NBQ3ZDO0lBQ0gsQ0FBQztJQUVTLFdBQVc7UUFDbkIsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JGLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFO2dCQUMvQixJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNuQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7YUFDM0I7U0FDRjtJQUNILENBQUM7SUFDUyxvQkFBb0I7UUFDNUIsT0FBTyxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUNTLFFBQVE7UUFDaEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFDUSxXQUFXO1FBQ2xCLEtBQUssQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFDRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7O3dIQTdFVSwwQkFBMEI7NEdBQTFCLDBCQUEwQixxTkFHTCxVQUFVLG9EQ2Y1QyxnakZBd0NjOzRGRDVCRCwwQkFBMEI7a0JBTHRDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGdCQUFnQjtvQkFDMUIsV0FBVyxFQUFFLDZCQUE2QjtvQkFDMUMsTUFBTSxFQUFFLENBQUMsMEJBQTBCLENBQUM7aUJBQ3JDOzhCQUVVLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDd0MsU0FBUztzQkFBdEQsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFOztBQTZFOUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLGdCQUFnQixFQUFFLDBCQUEwQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbmltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBWaWV3Q2hpbGQsIFZpZXdDb250YWluZXJSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQW5ndWxhckNvbXBvbmVudEZhY3RvcnksIEJhc2VBbmd1bGFyLCBFbWJlZGRlZFZpZXdDb250ZW50Q29tcG9uZW50IH0gZnJvbSBcInN1cnZleS1hbmd1bGFyLXVpXCI7XG5pbXBvcnQgeyBJdGVtVmFsdWUsIFBhZ2VNb2RlbCwgUGFuZWxNb2RlbCwgUXVlc3Rpb24sIFF1ZXN0aW9uU2VsZWN0QmFzZSwgU3VydmV5TW9kZWwgfSBmcm9tIFwic3VydmV5LWNvcmVcIjtcbmltcG9ydCB7IFN1cnZleUNyZWF0b3JNb2RlbCwgSXRlbVZhbHVlV3JhcHBlclZpZXdNb2RlbCwgUXVlc3Rpb25BZG9ybmVyVmlld01vZGVsIH0gZnJvbSBcInN1cnZleS1jcmVhdG9yLWNvcmVcIjtcbmltcG9ydCB7IENyZWF0b3JNb2RlbENvbXBvbmVudCB9IGZyb20gXCIuLi9jcmVhdG9yLW1vZGVsLmNvbXBvbmVudFwiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IFwic3ZjLWl0ZW0tdmFsdWVcIixcbiAgdGVtcGxhdGVVcmw6IFwiLi9pdGVtLXZhbHVlLmNvbXBvbmVudC5odG1sXCIsXG4gIHN0eWxlczogW1wiOmhvc3QgeyBkaXNwbGF5OiBub25lOyB9XCJdXG59KVxuZXhwb3J0IGNsYXNzIEl0ZW1WYWx1ZURlc2lnbmVyQ29tcG9uZW50IGV4dGVuZHMgQ3JlYXRvck1vZGVsQ29tcG9uZW50PEl0ZW1WYWx1ZVdyYXBwZXJWaWV3TW9kZWw+IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIEBJbnB1dCgpIGNvbXBvbmVudE5hbWUhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNvbXBvbmVudERhdGEhOiBhbnk7XG4gIEBWaWV3Q2hpbGQoXCJjb250YWluZXJcIiwgeyByZWFkOiBFbGVtZW50UmVmIH0pIGNvbnRhaW5lciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuICBwdWJsaWMgYWRvcm5lciE6IEl0ZW1WYWx1ZVdyYXBwZXJWaWV3TW9kZWw7XG4gIHByaXZhdGUgcHJldkl0ZW0hOiBJdGVtVmFsdWU7XG4gIHByaXZhdGUgZ2V0IGNyZWF0b3IoKTogU3VydmV5Q3JlYXRvck1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnREYXRhLmRhdGEuY3JlYXRvcjtcbiAgfVxuICBwdWJsaWMgZ2V0IHF1ZXN0aW9uKCk6IFF1ZXN0aW9uU2VsZWN0QmFzZSB7XG4gICAgcmV0dXJuIHRoaXMuY29tcG9uZW50RGF0YS5xdWVzdGlvbjtcbiAgfVxuICBwdWJsaWMgZ2V0IGl0ZW0oKTogSXRlbVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5jb21wb25lbnREYXRhLm1vZGVsO1xuICB9XG4gIHB1YmxpYyBvbkJsdXIoZXZlbnQ6IGFueSkge1xuICAgIHRoaXMuYWRvcm5lci5vbkZvY3VzT3V0KGV2ZW50KTtcbiAgfVxuICBwdWJsaWMgZ2V0UGFuZWxDb21wb25lbnROYW1lKHBhbmVsOiBQYW5lbE1vZGVsKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdXJ2ZXkgPSB0aGlzLmNyZWF0b3Iuc3VydmV5O1xuICAgIGlmICghIXN1cnZleSkge1xuICAgICAgY29uc3QgbmFtZSA9IHN1cnZleS5nZXRFbGVtZW50V3JhcHBlckNvbXBvbmVudE5hbWUocGFuZWwpO1xuICAgICAgaWYgKCEhbmFtZSkge1xuICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFwicGFuZWxcIjtcbiAgfVxuICBwdWJsaWMgZ2V0UGFuZWxDb21wb25lbnREYXRhKHBhbmVsOiBQYW5lbE1vZGVsKTogYW55IHtcbiAgICBjb25zdCBzdXJ2ZXkgPSB0aGlzLmNyZWF0b3Iuc3VydmV5O1xuICAgIGxldCBkYXRhOiBhbnk7XG4gICAgaWYgKCEhc3VydmV5KSB7XG4gICAgICBkYXRhID0gc3VydmV5LmdldEVsZW1lbnRXcmFwcGVyQ29tcG9uZW50RGF0YShwYW5lbCk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBjb21wb25lbnROYW1lOiBcInBhbmVsXCIsXG4gICAgICBjb21wb25lbnREYXRhOiB7XG4gICAgICAgIG1vZGVsOiBwYW5lbCxcbiAgICAgICAgZGF0YTogZGF0YVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNldHVwQ29udGFpbmVyKCkge1xuICAgIGlmICh0aGlzLml0ZW0gJiYgdGhpcy5jb250YWluZXI/Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuaXRlbS5zZXRSb290RWxlbWVudCh0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50KTtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBjbGVhbkNvbnRhaW5lcihpdGVtOiBJdGVtVmFsdWUpIHtcbiAgICBpZiAoISFpdGVtKSB7XG4gICAgICBpdGVtLnNldFJvb3RFbGVtZW50KHVuZGVmaW5lZCBhcyBhbnkpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVNb2RlbCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb21wb25lbnREYXRhKSB7XG4gICAgICB0aGlzLmFkb3JuZXIgPSBuZXcgSXRlbVZhbHVlV3JhcHBlclZpZXdNb2RlbCh0aGlzLmNyZWF0b3IsIHRoaXMucXVlc3Rpb24sIHRoaXMuaXRlbSk7XG4gICAgICBpZiAodGhpcy5wcmV2SXRlbSAhPT0gdGhpcy5pdGVtKSB7XG4gICAgICAgIHRoaXMuc2V0dXBDb250YWluZXIoKTtcbiAgICAgICAgdGhpcy5jbGVhbkNvbnRhaW5lcih0aGlzLnByZXZJdGVtKTtcbiAgICAgICAgdGhpcy5wcmV2SXRlbSA9IHRoaXMuaXRlbTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcHJvdGVjdGVkIGdldFByb3BlcnRpZXNUb1RyYWNrKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gW1wiY3JlYXRvclwiLCBcInF1ZXN0aW9uXCIsIFwiaXRlbVwiXTtcbiAgfVxuICBwcm90ZWN0ZWQgZ2V0TW9kZWwoKTogSXRlbVZhbHVlV3JhcHBlclZpZXdNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuYWRvcm5lcjtcbiAgfVxuICBvdmVycmlkZSBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIHRoaXMuYWRvcm5lci5kaXNwb3NlKCk7XG4gICAgdGhpcy5jbGVhbkNvbnRhaW5lcih0aGlzLml0ZW0pO1xuICB9XG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnNldHVwQ29udGFpbmVyKCk7XG4gIH1cbn1cblxuQW5ndWxhckNvbXBvbmVudEZhY3RvcnkuSW5zdGFuY2UucmVnaXN0ZXJDb21wb25lbnQoXCJzdmMtaXRlbS12YWx1ZVwiLCBJdGVtVmFsdWVEZXNpZ25lckNvbXBvbmVudCk7XG4iLCI8bmctdGVtcGxhdGUgI3RlbXBsYXRlPlxuICA8ZGl2IGNsYXNzPVwic3ZjLWl0ZW0tdmFsdWUtd3JhcHBlclwiIChwb2ludGVyZG93bik9XCJhZG9ybmVyLm9uUG9pbnRlckRvd24oJGV2ZW50KVwiXG4gICAgW2F0dHIuZGF0YS1zdi1kcm9wLXRhcmdldC1pdGVtLXZhbHVlXT1cImFkb3JuZXIuaXNEcmFnZ2FibGUgPyBpdGVtLnZhbHVlIDogbnVsbFwiXG4gICAgW25nQ2xhc3NdPVwieydzdmMtaXRlbS12YWx1ZS0tbmV3JzogYWRvcm5lci5pc05ldywgJ3N2Yy1pdGVtLXZhbHVlLS1kcmFnZ2luZyc6IGFkb3JuZXIuaXNEcmFnZ2luZywgJ3N2Yy1pdGVtLXZhbHVlLS1naG9zdCc6IGFkb3JuZXIuaXNEcmFnRHJvcEdob3N0LCAnc3ZjLWl0ZW0tdmFsdWUtLW1vdmVkb3duJzogYWRvcm5lci5pc0RyYWdEcm9wTW92ZURvd24sICdzdmMtaXRlbS12YWx1ZS0tbW92ZXVwJzogYWRvcm5lci5pc0RyYWdEcm9wTW92ZVVwfVwiXG4gICAgI2NvbnRhaW5lcj5cbiAgICA8ZGl2IGNsYXNzPVwic3ZjLWl0ZW0tdmFsdWVfX2dob3N0XCI+PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInN2Yy1pdGVtLXZhbHVlLWNvbnRyb2xzXCI+XG4gICAgICA8c3BhbiAqbmdJZj1cImFkb3JuZXIuaXNEcmFnZ2FibGVcIiBjbGFzcz1cInN2Yy1pdGVtLXZhbHVlLWNvbnRyb2xzX19idXR0b24gc3ZjLWl0ZW0tdmFsdWUtY29udHJvbHNfX2RyYWdcIj5cbiAgICAgICAgPHN2ZyBjbGFzcz1cInN2Yy1pdGVtLXZhbHVlLWNvbnRyb2xzX19kcmFnLWljb25cIiBbaWNvbk5hbWVdPVwiJ2ljb24tZHJhZy0yNHgyNCdcIiBbc2l6ZV09XCInYXV0bydcIlxuICAgICAgICAgIFthdHRyLnRpdGxlXT1cImFkb3JuZXIuZHJhZ1Rvb2x0aXBcIiBzdi1uZy1zdmctaWNvbj48L3N2Zz5cbiAgICAgIDwvc3Bhbj5cbiAgICAgIDxzcGFuICpuZ0lmPVwiYWRvcm5lci5hbGxvd0FkZFwiIGNsYXNzPVwic3ZjLWl0ZW0tdmFsdWUtY29udHJvbHNfX2J1dHRvbiBzdmMtaXRlbS12YWx1ZS1jb250cm9sc19fYWRkXCIgW2tleTJjbGlja11cbiAgICAgICAgKGNsaWNrKT1cImFkb3JuZXIuYWRkKGFkb3JuZXIpXCIgcm9sZT1cImJ1dHRvblwiIFthdHRyLmFyaWEtbGFiZWxdPVwiYWRvcm5lci50b29sdGlwXCI+PHN2ZyBbaWNvbk5hbWVdPVwiJ2ljb24tYWRkXzE2eDE2J1wiIFtzaXplXT1cIidhdXRvJ1wiXG4gICAgICAgICAgW2F0dHIudGl0bGVdPVwiYWRvcm5lci50b29sdGlwXCIgc3Ytbmctc3ZnLWljb24+PC9zdmc+PC9zcGFuPlxuICAgICAgPHNwYW4gKm5nSWY9XCJhZG9ybmVyLmFsbG93UmVtb3ZlXCIgY2xhc3M9XCJzdmMtaXRlbS12YWx1ZS1jb250cm9sc19fYnV0dG9uIHN2Yy1pdGVtLXZhbHVlLWNvbnRyb2xzX19yZW1vdmVcIlxuICAgICAgICBba2V5MmNsaWNrXSAoY2xpY2spPVwiYWRvcm5lci5yZW1vdmUoYWRvcm5lcilcIiAoYmx1cik9XCJvbkJsdXIoJGV2ZW50KVwiIHJvbGU9XCJidXR0b25cIiBbYXR0ci5hcmlhLWxhYmVsXT1cImFkb3JuZXIudG9vbHRpcFwiPjxzdmdcbiAgICAgICAgICBbaWNvbk5hbWVdPVwiJ2ljb24tcmVtb3ZlXzE2eDE2J1wiIFtzaXplXT1cIidhdXRvJ1wiIFthdHRyLnRpdGxlXT1cImFkb3JuZXIudG9vbHRpcFwiIHN2LW5nLXN2Zy1pY29uPjwvc3ZnPjwvc3Bhbj5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJzdmMtaXRlbS12YWx1ZV9faXRlbVwiIChjbGljayk9XCJhZG9ybmVyLnNlbGVjdChhZG9ybmVyLCAkZXZlbnQpXCI+XG4gICAgICA8bmctdGVtcGxhdGUgW2NvbXBvbmVudF09XCJ7IG5hbWU6IGNvbXBvbmVudE5hbWUsIGRhdGE6IGNvbXBvbmVudERhdGEgfVwiPjwvbmctdGVtcGxhdGU+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2ICpuZ0lmPVwiYWRvcm5lci5jYW5TaG93UGFuZWwoKVwiIGNsYXNzPVwic3ZjLWl0ZW0tdmFsdWUtY29udHJvbHMgc3ZjLWNob2ljZS1lbGVtZW50cy1idXR0b24tY29udGFpbmVyXCI+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGNsYXNzPVwic3ZjLWl0ZW0tdmFsdWUtY29udHJvbHNfX2J1dHRvbiBzdmMtaXRlbS12YWx1ZS1jb250cm9sc19fYWRkIHN2Yy1jaG9pY2UtZWxlbWVudHMtYnV0dG9uXCJcbiAgICAgICAgICAgIChjbGljayk9XCJhZG9ybmVyLnRvZ2dsZVBhbmVsKClcIlxuICAgICAgICAgICAgW2tleTJjbGlja11cbiAgICAgICAgICA+XG4gICAgICAgICAgPHN2Z1xuICAgICAgICAgICAgW2ljb25OYW1lXT1cImFkb3JuZXIuc2hvd1BhbmVsID8gJ2ljb24tY29sbGFwc2VwYW5lbC0xNngxNicgOiAnaWNvbi1leHBhbmRwYW5lbC0xNngxNidcIiBcbiAgICAgICAgICAgIFtzaXplXT1cIidhdXRvJ1wiIFxuICAgICAgICAgICAgc3Ytbmctc3ZnLWljb24+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxuZy10ZW1wbGF0ZSAqbmdJZj1cImFkb3JuZXIuc2hvd1BhbmVsXCJcbiAgICAgICAgICBbY29tcG9uZW50XT1cInsgbmFtZTogZ2V0UGFuZWxDb21wb25lbnROYW1lKGl0ZW0ucGFuZWwpLCBkYXRhOiBnZXRQYW5lbENvbXBvbmVudERhdGEoaXRlbS5wYW5lbCkgfVwiPjwvbmctdGVtcGxhdGU+XG48L25nLXRlbXBsYXRlPiJdfQ==