UNPKG

@c8y/ngx-components

Version:

Angular modules for Cumulocity IoT applications

54 lines 15.7 kB
import { Component } from '@angular/core'; import { AlertService, gettext } from '@c8y/ngx-components'; import { RepositoryService, RepositoryType } from '@c8y/ngx-components/repository/shared'; import { BsModalRef } from 'ngx-bootstrap/modal'; import * as i0 from "@angular/core"; import * as i1 from "ngx-bootstrap/modal"; import * as i2 from "@c8y/ngx-components"; import * as i3 from "@c8y/ngx-components/repository/shared"; import * as i4 from "@angular/forms"; export class SaveToRepositoryComponent { constructor(modal, alertService, repositoryService) { this.modal = modal; this.alertService = alertService; this.repositoryService = repositoryService; this.result = new Promise((resolve, reject) => { this._save = resolve; this._cancel = reject; }); } async save() { { try { const configSnapshotData = { selected: { configurationType: this.configSnapshot.configurationType }, version: this.configSnapshot.name, deviceType: this.configSnapshot.deviceType, description: this.configSnapshot.description, binary: { file: new File([this.configSnapshot.binary], this.configSnapshot.name) } }; await this.repositoryService.create(configSnapshotData, RepositoryType.CONFIGURATION); this.alertService.success(gettext('Configuration saved.')); this._save(); } catch (ex) { this.alertService.addServerFailure(ex); } } } close() { this._cancel(); this.modal.hide(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SaveToRepositoryComponent, deps: [{ token: i1.BsModalRef }, { token: i2.AlertService }, { token: i3.RepositoryService }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: SaveToRepositoryComponent, selector: "c8y-save-config-to-configuration-repository", ngImport: i0, template: "<div class=\"modal-header dialog-header\">\n <i c8yIcon=\"gears\"></i>\n <h4 id=\"modal-title\" translate>\n Save configuration\n </h4>\n</div>\n<div class=\"modal-body\" id=\"modal-body\">\n <form #saveConfigurationSnapshot=\"ngForm\" class=\"p-t-24\">\n <c8y-form-group>\n <label translate for=\"name\">Name</label>\n <input\n id=\"name\"\n type=\"text\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"name\"\n [(ngModel)]=\"configSnapshot.name\"\n required\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"deviceType\">Device type</label>\n <input\n id=\"deviceType\"\n class=\"form-control\"\n rows=\"6\"\n name=\"deviceType\"\n [(ngModel)]=\"configSnapshot.deviceType\"\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"description\">Description</label>\n <input\n type=\"text\"\n id=\"description\"\n class=\"form-control\"\n maxlength=\"254\"\n autocomplete=\"off\"\n name=\"description\"\n [(ngModel)]=\"configSnapshot.description\"\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"configurationType\">Configuration type</label>\n <input\n id=\"configurationType\"\n class=\"form-control\"\n rows=\"6\"\n name=\"configurationType\"\n [(ngModel)]=\"configSnapshot.configurationType\"\n />\n </c8y-form-group>\n </form>\n</div>\n<div class=\"modal-footer\">\n <button title=\"{{ 'Cancel' | translate }}\" class=\"btn btn-default\" (click)=\"close()\" translate>\n Cancel\n </button>\n\n <button\n title=\"{{ 'Save configuration to repository' | translate }}\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"saveConfigurationSnapshot.form.invalid\"\n translate\n >\n Save\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: i2.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i2.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i4.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i2.FormGroupComponent, selector: "c8y-form-group", inputs: ["hasError", "hasWarning", "hasSuccess", "novalidation", "status"] }, { kind: "directive", type: i2.RequiredInputPlaceholderDirective, selector: "input[required], input[formControlName]" }, { kind: "pipe", type: i2.C8yTranslatePipe, name: "translate" }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: SaveToRepositoryComponent, decorators: [{ type: Component, args: [{ selector: 'c8y-save-config-to-configuration-repository', template: "<div class=\"modal-header dialog-header\">\n <i c8yIcon=\"gears\"></i>\n <h4 id=\"modal-title\" translate>\n Save configuration\n </h4>\n</div>\n<div class=\"modal-body\" id=\"modal-body\">\n <form #saveConfigurationSnapshot=\"ngForm\" class=\"p-t-24\">\n <c8y-form-group>\n <label translate for=\"name\">Name</label>\n <input\n id=\"name\"\n type=\"text\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"name\"\n [(ngModel)]=\"configSnapshot.name\"\n required\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"deviceType\">Device type</label>\n <input\n id=\"deviceType\"\n class=\"form-control\"\n rows=\"6\"\n name=\"deviceType\"\n [(ngModel)]=\"configSnapshot.deviceType\"\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"description\">Description</label>\n <input\n type=\"text\"\n id=\"description\"\n class=\"form-control\"\n maxlength=\"254\"\n autocomplete=\"off\"\n name=\"description\"\n [(ngModel)]=\"configSnapshot.description\"\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"configurationType\">Configuration type</label>\n <input\n id=\"configurationType\"\n class=\"form-control\"\n rows=\"6\"\n name=\"configurationType\"\n [(ngModel)]=\"configSnapshot.configurationType\"\n />\n </c8y-form-group>\n </form>\n</div>\n<div class=\"modal-footer\">\n <button title=\"{{ 'Cancel' | translate }}\" class=\"btn btn-default\" (click)=\"close()\" translate>\n Cancel\n </button>\n\n <button\n title=\"{{ 'Save configuration to repository' | translate }}\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"saveConfigurationSnapshot.form.invalid\"\n translate\n >\n Save\n </button>\n</div>\n" }] }], ctorParameters: () => [{ type: i1.BsModalRef }, { type: i2.AlertService }, { type: i3.RepositoryService }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZS10by1yZXBvc2l0b3J5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3JlcG9zaXRvcnkvY29uZmlndXJhdGlvbi9kZXZpY2UtdGFiL3NhdmUtdG8tcmVwb3NpdG9yeS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9yZXBvc2l0b3J5L2NvbmZpZ3VyYXRpb24vZGV2aWNlLXRhYi9zYXZlLXRvLXJlcG9zaXRvcnkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sRUFFTCxpQkFBaUIsRUFDakIsY0FBYyxFQUNmLE1BQU0sdUNBQXVDLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHFCQUFxQixDQUFDOzs7Ozs7QUFNakQsTUFBTSxPQUFPLHlCQUF5QjtJQVNwQyxZQUNVLEtBQWlCLEVBQ2pCLFlBQTBCLEVBQzFCLGlCQUFvQztRQUZwQyxVQUFLLEdBQUwsS0FBSyxDQUFZO1FBQ2pCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFWOUMsV0FBTSxHQUFpQixJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNyRCxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sQ0FBQztZQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztJQVFBLENBQUM7SUFFSixLQUFLLENBQUMsSUFBSTtRQUNSLENBQUM7WUFDQyxJQUFJLENBQUM7Z0JBQ0gsTUFBTSxrQkFBa0IsR0FBRztvQkFDekIsUUFBUSxFQUFFO3dCQUNSLGlCQUFpQixFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWlCO3FCQUN6RDtvQkFDRCxPQUFPLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJO29CQUNqQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVO29CQUMxQyxXQUFXLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXO29CQUM1QyxNQUFNLEVBQUU7d0JBQ04sSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQztxQkFDdkU7aUJBQ0YsQ0FBQztnQkFDRixNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsY0FBYyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUN0RixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO2dCQUMzRCxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDZixDQUFDO1lBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQkFDWixJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3BCLENBQUM7K0dBekNVLHlCQUF5QjttR0FBekIseUJBQXlCLG1GQ2J0QyxvN0RBcUVBOzs0RkR4RGEseUJBQXlCO2tCQUpyQyxTQUFTOytCQUNFLDZDQUE2QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWxlcnRTZXJ2aWNlLCBnZXR0ZXh0IH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG5pbXBvcnQge1xuICBDb25maWd1cmF0aW9uU25hcHNob3QsXG4gIFJlcG9zaXRvcnlTZXJ2aWNlLFxuICBSZXBvc2l0b3J5VHlwZVxufSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzL3JlcG9zaXRvcnkvc2hhcmVkJztcbmltcG9ydCB7IEJzTW9kYWxSZWYgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYzh5LXNhdmUtY29uZmlnLXRvLWNvbmZpZ3VyYXRpb24tcmVwb3NpdG9yeScsXG4gIHRlbXBsYXRlVXJsOiAnc2F2ZS10by1yZXBvc2l0b3J5LmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBTYXZlVG9SZXBvc2l0b3J5Q29tcG9uZW50IHtcbiAgY29uZmlnU25hcHNob3Q6IENvbmZpZ3VyYXRpb25TbmFwc2hvdDtcbiAgcmVzdWx0OiBQcm9taXNlPGFueT4gPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdGhpcy5fc2F2ZSA9IHJlc29sdmU7XG4gICAgdGhpcy5fY2FuY2VsID0gcmVqZWN0O1xuICB9KTtcbiAgcHJpdmF0ZSBfc2F2ZTtcbiAgcHJpdmF0ZSBfY2FuY2VsO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbW9kYWw6IEJzTW9kYWxSZWYsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHJlcG9zaXRvcnlTZXJ2aWNlOiBSZXBvc2l0b3J5U2VydmljZVxuICApIHt9XG5cbiAgYXN5bmMgc2F2ZSgpIHtcbiAgICB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjb25maWdTbmFwc2hvdERhdGEgPSB7XG4gICAgICAgICAgc2VsZWN0ZWQ6IHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25UeXBlOiB0aGlzLmNvbmZpZ1NuYXBzaG90LmNvbmZpZ3VyYXRpb25UeXBlXG4gICAgICAgICAgfSxcbiAgICAgICAgICB2ZXJzaW9uOiB0aGlzLmNvbmZpZ1NuYXBzaG90Lm5hbWUsXG4gICAgICAgICAgZGV2aWNlVHlwZTogdGhpcy5jb25maWdTbmFwc2hvdC5kZXZpY2VUeXBlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmNvbmZpZ1NuYXBzaG90LmRlc2NyaXB0aW9uLFxuICAgICAgICAgIGJpbmFyeToge1xuICAgICAgICAgICAgZmlsZTogbmV3IEZpbGUoW3RoaXMuY29uZmlnU25hcHNob3QuYmluYXJ5XSwgdGhpcy5jb25maWdTbmFwc2hvdC5uYW1lKVxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXBvc2l0b3J5U2VydmljZS5jcmVhdGUoY29uZmlnU25hcHNob3REYXRhLCBSZXBvc2l0b3J5VHlwZS5DT05GSUdVUkFUSU9OKTtcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhnZXR0ZXh0KCdDb25maWd1cmF0aW9uIHNhdmVkLicpKTtcbiAgICAgICAgdGhpcy5fc2F2ZSgpO1xuICAgICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkU2VydmVyRmFpbHVyZShleCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5fY2FuY2VsKCk7XG4gICAgdGhpcy5tb2RhbC5oaWRlKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXIgZGlhbG9nLWhlYWRlclwiPlxuICA8aSBjOHlJY29uPVwiZ2VhcnNcIj48L2k+XG4gIDxoNCBpZD1cIm1vZGFsLXRpdGxlXCIgdHJhbnNsYXRlPlxuICAgIFNhdmUgY29uZmlndXJhdGlvblxuICA8L2g0PlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiIGlkPVwibW9kYWwtYm9keVwiPlxuICA8Zm9ybSAjc2F2ZUNvbmZpZ3VyYXRpb25TbmFwc2hvdD1cIm5nRm9ybVwiIGNsYXNzPVwicC10LTI0XCI+XG4gICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgPGxhYmVsIHRyYW5zbGF0ZSBmb3I9XCJuYW1lXCI+TmFtZTwvbGFiZWw+XG4gICAgICA8aW5wdXRcbiAgICAgICAgaWQ9XCJuYW1lXCJcbiAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgIG5hbWU9XCJuYW1lXCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJjb25maWdTbmFwc2hvdC5uYW1lXCJcbiAgICAgICAgcmVxdWlyZWRcbiAgICAgIC8+XG4gICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICA8bGFiZWwgdHJhbnNsYXRlIGZvcj1cImRldmljZVR5cGVcIj5EZXZpY2UgdHlwZTwvbGFiZWw+XG4gICAgICA8aW5wdXRcbiAgICAgICAgaWQ9XCJkZXZpY2VUeXBlXCJcbiAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIlxuICAgICAgICByb3dzPVwiNlwiXG4gICAgICAgIG5hbWU9XCJkZXZpY2VUeXBlXCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJjb25maWdTbmFwc2hvdC5kZXZpY2VUeXBlXCJcbiAgICAgIC8+XG4gICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICA8bGFiZWwgdHJhbnNsYXRlIGZvcj1cImRlc2NyaXB0aW9uXCI+RGVzY3JpcHRpb248L2xhYmVsPlxuICAgICAgPGlucHV0XG4gICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgaWQ9XCJkZXNjcmlwdGlvblwiXG4gICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgbWF4bGVuZ3RoPVwiMjU0XCJcbiAgICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgICAgbmFtZT1cImRlc2NyaXB0aW9uXCJcbiAgICAgICAgWyhuZ01vZGVsKV09XCJjb25maWdTbmFwc2hvdC5kZXNjcmlwdGlvblwiXG4gICAgICAvPlxuICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgPGxhYmVsIHRyYW5zbGF0ZSBmb3I9XCJjb25maWd1cmF0aW9uVHlwZVwiPkNvbmZpZ3VyYXRpb24gdHlwZTwvbGFiZWw+XG4gICAgICA8aW5wdXRcbiAgICAgICAgaWQ9XCJjb25maWd1cmF0aW9uVHlwZVwiXG4gICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgcm93cz1cIjZcIlxuICAgICAgICBuYW1lPVwiY29uZmlndXJhdGlvblR5cGVcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cImNvbmZpZ1NuYXBzaG90LmNvbmZpZ3VyYXRpb25UeXBlXCJcbiAgICAgIC8+XG4gICAgPC9jOHktZm9ybS1ncm91cD5cbiAgPC9mb3JtPlxuPC9kaXY+XG48ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gIDxidXR0b24gdGl0bGU9XCJ7eyAnQ2FuY2VsJyB8IHRyYW5zbGF0ZSB9fVwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgKGNsaWNrKT1cImNsb3NlKClcIiB0cmFuc2xhdGU+XG4gICAgQ2FuY2VsXG4gIDwvYnV0dG9uPlxuXG4gIDxidXR0b25cbiAgICB0aXRsZT1cInt7ICdTYXZlIGNvbmZpZ3VyYXRpb24gdG8gcmVwb3NpdG9yeScgfCB0cmFuc2xhdGUgfX1cIlxuICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAoY2xpY2spPVwic2F2ZSgpXCJcbiAgICBbZGlzYWJsZWRdPVwic2F2ZUNvbmZpZ3VyYXRpb25TbmFwc2hvdC5mb3JtLmludmFsaWRcIlxuICAgIHRyYW5zbGF0ZVxuICA+XG4gICAgU2F2ZVxuICA8L2J1dHRvbj5cbjwvZGl2PlxuIl19