@gravitee/ui-particles-angular 15.10.2 → 15.10.3-apim-9967-471bf98
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/gio-el/gio-el-prompt/gio-el-prompt.component.mjs +27 -7
- package/esm2022/lib/gio-el/gio-el.service.mjs +14 -2
- package/fesm2022/gravitee-ui-particles-angular.mjs +35 -5
- package/fesm2022/gravitee-ui-particles-angular.mjs.map +1 -1
- package/lib/gio-el/gio-el-prompt/gio-el-prompt.component.d.ts +5 -0
- package/lib/gio-el/gio-el.service.d.ts +4 -0
- package/package.json +1 -1
|
@@ -20,6 +20,7 @@ import { MatInput } from '@angular/material/input';
|
|
|
20
20
|
import { MatButton } from '@angular/material/button';
|
|
21
21
|
import { MatProgressBarModule } from '@angular/material/progress-bar';
|
|
22
22
|
import { MatTooltipModule } from '@angular/material/tooltip';
|
|
23
|
+
import { MatIconButton } from '@angular/material/button';
|
|
23
24
|
import { GioElService } from '../gio-el.service';
|
|
24
25
|
import { isPromptError, isPromptSuccess } from '../models/ElAiPromptState';
|
|
25
26
|
import { GioIconsModule } from '../../gio-icons/gio-icons.module';
|
|
@@ -29,17 +30,19 @@ import * as i0 from "@angular/core";
|
|
|
29
30
|
import * as i1 from "@angular/forms";
|
|
30
31
|
import * as i2 from "@angular/material/input";
|
|
31
32
|
import * as i3 from "@angular/material/progress-bar";
|
|
32
|
-
import * as i4 from "@angular/material/
|
|
33
|
-
import * as i5 from "
|
|
34
|
-
import * as i6 from "../../gio-
|
|
33
|
+
import * as i4 from "@angular/material/tooltip";
|
|
34
|
+
import * as i5 from "@angular/material/icon";
|
|
35
|
+
import * as i6 from "../../gio-banner/gio-banner.component";
|
|
36
|
+
import * as i7 from "../../gio-clipboard/gio-clipboard-copy-wrapper.component";
|
|
35
37
|
export class GioElPromptComponent {
|
|
36
38
|
constructor() {
|
|
37
39
|
this.maxPromptSize = 256;
|
|
38
40
|
this.aiRequestFormGroup = new FormGroup({
|
|
39
|
-
prompt: new FormControl('', [Validators.required, Validators.
|
|
41
|
+
prompt: new FormControl('', [Validators.required, Validators.maxLength(this.maxPromptSize)]),
|
|
40
42
|
});
|
|
41
43
|
this.elService = inject(GioElService);
|
|
42
44
|
this.responseState = signal(null);
|
|
45
|
+
this.feedbackState = signal(null);
|
|
43
46
|
this.el = computed(() => {
|
|
44
47
|
const state = this.responseState();
|
|
45
48
|
return isPromptSuccess(state) ? state.el : null;
|
|
@@ -48,6 +51,14 @@ export class GioElPromptComponent {
|
|
|
48
51
|
const state = this.responseState();
|
|
49
52
|
return isPromptError(state) ? state.message : null;
|
|
50
53
|
});
|
|
54
|
+
this.showFeedback = computed(() => {
|
|
55
|
+
const state = this.responseState();
|
|
56
|
+
const feedback = this.feedbackState();
|
|
57
|
+
return isPromptSuccess(state) && feedback === null;
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
get prompt() {
|
|
61
|
+
return this.aiRequestFormGroup.get('prompt');
|
|
51
62
|
}
|
|
52
63
|
ngAfterViewInit() {
|
|
53
64
|
setTimeout(() => {
|
|
@@ -60,10 +71,18 @@ export class GioElPromptComponent {
|
|
|
60
71
|
return;
|
|
61
72
|
}
|
|
62
73
|
this.responseState.set('loading');
|
|
74
|
+
this.feedbackState.set(null); // Reset feedback when sending new prompt
|
|
63
75
|
this.elService.prompt(prompt).subscribe(reply => this.responseState.set(reply));
|
|
64
76
|
}
|
|
77
|
+
submitFeedback(feedback) {
|
|
78
|
+
this.feedbackState.set(feedback);
|
|
79
|
+
const expression = this.el();
|
|
80
|
+
if (expression) {
|
|
81
|
+
this.elService.submitFeedback(feedback, expression).subscribe();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
65
84
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: GioElPromptComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
66
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.4", type: GioElPromptComponent, isStandalone: true, selector: "gio-el-prompt", inputs: { responseState: "responseState" }, viewQueries: [{ propertyName: "myInput", first: true, predicate: ["promptArea"], descendants: true }], ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h5>EL IA Assistant</h5>\n\n<div class=\"aiRequestForm\" [formGroup]=\"aiRequestFormGroup\">\n <mat-form-field class=\"example-full-width\">\n <mat-label>Describe the EL you want to generate</mat-label>\n <textarea #promptArea matInput formControlName=\"prompt\"></textarea>\n <mat-hint [align]=\"'end'\">{{
|
|
85
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.4", type: GioElPromptComponent, isStandalone: true, selector: "gio-el-prompt", inputs: { responseState: "responseState" }, viewQueries: [{ propertyName: "myInput", first: true, predicate: ["promptArea"], descendants: true }], ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h5>EL IA Assistant</h5>\n\n<div class=\"aiRequestForm\" [formGroup]=\"aiRequestFormGroup\">\n <mat-form-field class=\"example-full-width\">\n <mat-label>Describe the EL you want to generate</mat-label>\n <textarea #promptArea matInput formControlName=\"prompt\"></textarea>\n <mat-hint [align]=\"'end'\">{{ prompt?.value?.length || 0 }}/{{ maxPromptSize }}</mat-hint>\n </mat-form-field>\n\n @if (prompt?.touched && prompt?.hasError('maxlength')) {\n <gio-banner-error> Your prompt is too long. It should be less than {{ maxPromptSize }} characters. </gio-banner-error>\n }\n\n <button mat-raised-button [disabled]=\"aiRequestFormGroup.invalid\" (click)=\"sendPromptToIA()\">\n <mat-icon svgIcon=\"gio:magic-wand\" />\n Ask Newt AI\n </button>\n</div>\n\n<div class=\"ai-card__content__response\">\n @if (responseState() === 'loading') {\n <mat-progress-bar mode=\"indeterminate\" class=\"loading\" />\n }\n @if (el(); as expression) {\n <gio-banner-success>\n <code gioClipboardCopyWrapper [contentToCopy]=\"expression\" [alwaysVisible]=\"true\">{{ expression }}</code>\n </gio-banner-success>\n @if (showFeedback()) {\n <gio-banner-info>\n Was the answer helpful?\n <span gioBannerBody class=\"feedback-buttons\">\n <button\n mat-icon-button\n (click)=\"submitFeedback('helpful')\"\n matTooltip=\"Yes, this was helpful\"\n class=\"feedback-button feedback-button--helpful\"\n >\n <mat-icon svgIcon=\"gio:thumbs-up\"></mat-icon>\n </button>\n <button\n mat-icon-button\n (click)=\"submitFeedback('not-helpful')\"\n matTooltip=\"No, this was not helpful\"\n class=\"feedback-button feedback-button--not-helpful\">\n <mat-icon svgIcon=\"gio:thumbs-down\"></mat-icon>\n </button>\n </span>\n </gio-banner-info>\n }\n }\n @if (errorMessage(); as message) {\n <gio-banner-error>\n Error\n <span gioBannerBody> {{ message }} </span>\n </gio-banner-error>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;width:400px;flex-direction:column;padding:12px;border-radius:4px;background-color:#fff;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.aiRequestForm{display:flex;flex-direction:column;gap:8px}.banner__wrapper__title{width:100%}.banner-success-content{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.feedback-buttons{display:flex;gap:8px;align-items:center}.feedback-button{transition:all .2s ease-in-out}.feedback-button:hover{transform:scale(1.1)}.feedback-button--helpful{color:#22b374}.feedback-button--helpful:hover{background-color:#8dffce;opacity:.5}.feedback-button--not-helpful{color:#dd1d1f}.feedback-button--not-helpful:hover{background-color:#ffcfd0;opacity:.5}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.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: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "directive", type: i2.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i3.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: GioBannerModule }, { kind: "component", type: i6.GioBannerErrorComponent, selector: "gio-banner-error" }, { kind: "component", type: i6.GioBannerInfoComponent, selector: "gio-banner-info" }, { kind: "component", type: i6.GioBannerSuccessComponent, selector: "gio-banner-success" }, { kind: "directive", type: i6.GioBannerBodyDirective, selector: "[gioBannerBody]" }, { kind: "ngmodule", type: GioClipboardModule }, { kind: "component", type: i7.GioClipboardCopyWrapperComponent, selector: "[gioClipboardCopyWrapper]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
67
86
|
}
|
|
68
87
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: GioElPromptComponent, decorators: [{
|
|
69
88
|
type: Component,
|
|
@@ -74,14 +93,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
|
|
|
74
93
|
MatButton,
|
|
75
94
|
MatProgressBarModule,
|
|
76
95
|
MatTooltipModule,
|
|
96
|
+
MatIconButton,
|
|
77
97
|
GioIconsModule,
|
|
78
98
|
GioBannerModule,
|
|
79
99
|
GioClipboardModule,
|
|
80
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h5>EL IA Assistant</h5>\n\n<div class=\"aiRequestForm\" [formGroup]=\"aiRequestFormGroup\">\n <mat-form-field class=\"example-full-width\">\n <mat-label>Describe the EL you want to generate</mat-label>\n <textarea #promptArea matInput formControlName=\"prompt\"></textarea>\n <mat-hint [align]=\"'end'\">{{
|
|
100
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h5>EL IA Assistant</h5>\n\n<div class=\"aiRequestForm\" [formGroup]=\"aiRequestFormGroup\">\n <mat-form-field class=\"example-full-width\">\n <mat-label>Describe the EL you want to generate</mat-label>\n <textarea #promptArea matInput formControlName=\"prompt\"></textarea>\n <mat-hint [align]=\"'end'\">{{ prompt?.value?.length || 0 }}/{{ maxPromptSize }}</mat-hint>\n </mat-form-field>\n\n @if (prompt?.touched && prompt?.hasError('maxlength')) {\n <gio-banner-error> Your prompt is too long. It should be less than {{ maxPromptSize }} characters. </gio-banner-error>\n }\n\n <button mat-raised-button [disabled]=\"aiRequestFormGroup.invalid\" (click)=\"sendPromptToIA()\">\n <mat-icon svgIcon=\"gio:magic-wand\" />\n Ask Newt AI\n </button>\n</div>\n\n<div class=\"ai-card__content__response\">\n @if (responseState() === 'loading') {\n <mat-progress-bar mode=\"indeterminate\" class=\"loading\" />\n }\n @if (el(); as expression) {\n <gio-banner-success>\n <code gioClipboardCopyWrapper [contentToCopy]=\"expression\" [alwaysVisible]=\"true\">{{ expression }}</code>\n </gio-banner-success>\n @if (showFeedback()) {\n <gio-banner-info>\n Was the answer helpful?\n <span gioBannerBody class=\"feedback-buttons\">\n <button\n mat-icon-button\n (click)=\"submitFeedback('helpful')\"\n matTooltip=\"Yes, this was helpful\"\n class=\"feedback-button feedback-button--helpful\"\n >\n <mat-icon svgIcon=\"gio:thumbs-up\"></mat-icon>\n </button>\n <button\n mat-icon-button\n (click)=\"submitFeedback('not-helpful')\"\n matTooltip=\"No, this was not helpful\"\n class=\"feedback-button feedback-button--not-helpful\">\n <mat-icon svgIcon=\"gio:thumbs-down\"></mat-icon>\n </button>\n </span>\n </gio-banner-info>\n }\n }\n @if (errorMessage(); as message) {\n <gio-banner-error>\n Error\n <span gioBannerBody> {{ message }} </span>\n </gio-banner-error>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;width:400px;flex-direction:column;padding:12px;border-radius:4px;background-color:#fff;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.aiRequestForm{display:flex;flex-direction:column;gap:8px}.banner__wrapper__title{width:100%}.banner-success-content{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.feedback-buttons{display:flex;gap:8px;align-items:center}.feedback-button{transition:all .2s ease-in-out}.feedback-button:hover{transform:scale(1.1)}.feedback-button--helpful{color:#22b374}.feedback-button--helpful:hover{background-color:#8dffce;opacity:.5}.feedback-button--not-helpful{color:#dd1d1f}.feedback-button--not-helpful:hover{background-color:#ffcfd0;opacity:.5}\n"] }]
|
|
81
101
|
}], propDecorators: { responseState: [{
|
|
82
102
|
type: Input
|
|
83
103
|
}], myInput: [{
|
|
84
104
|
type: ViewChild,
|
|
85
105
|
args: ['promptArea']
|
|
86
106
|
}] } });
|
|
87
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2lvLWVsLXByb21wdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1wYXJ0aWNsZXMtYW5ndWxhci9zcmMvbGliL2dpby1lbC9naW8tZWwtcHJvbXB0L2dpby1lbC1wcm9tcHQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktcGFydGljbGVzLWFuZ3VsYXIvc3JjL2xpYi9naW8tZWwvZ2lvLWVsLXByb21wdC9naW8tZWwtcHJvbXB0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFHTixRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsR0FHVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBRTdELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQW1CLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM1RixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7OztBQXFCOUUsTUFBTSxPQUFPLG9CQUFvQjtJQWpCakM7UUFrQmtCLGtCQUFhLEdBQUcsR0FBRyxDQUFDO1FBQzdCLHVCQUFrQixHQUVwQixJQUFJLFNBQVMsQ0FBQztZQUNqQixNQUFNLEVBQUUsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1NBQ3ZGLENBQUMsQ0FBQztRQUNJLGNBQVMsR0FBaUIsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRy9DLGtCQUFhLEdBQXVDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUdqRSxPQUFFLEdBQTBCLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDL0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25DLE9BQU8sZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7UUFDSSxpQkFBWSxHQUEwQixRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ3pELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuQyxPQUFPLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUFDO0tBZ0JKO0lBZFEsZUFBZTtRQUNwQixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVNLGNBQWM7UUFDbkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUM7UUFDNUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7OEdBbkNVLG9CQUFvQjtrR0FBcEIsb0JBQW9CLDROQzVEakMsMHdEQWdEQSwybEJEQUksbUJBQW1CLG0yQkFDbkIsa0JBQWtCLG1ZQUNsQixRQUFRLHdWQUNSLFNBQVMsZ0xBQ1Qsb0JBQW9CLHdOQUNwQixnQkFBZ0IsOEJBQ2hCLGNBQWMsbUxBQ2QsZUFBZSxxU0FDZixrQkFBa0I7OzJGQUlULG9CQUFvQjtrQkFqQmhDLFNBQVM7K0JBQ0UsZUFBZSxXQUdoQjt3QkFDUCxtQkFBbUI7d0JBQ25CLGtCQUFrQjt3QkFDbEIsUUFBUTt3QkFDUixTQUFTO3dCQUNULG9CQUFvQjt3QkFDcEIsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLGVBQWU7d0JBQ2Ysa0JBQWtCO3FCQUNuQixtQkFDZ0IsdUJBQXVCLENBQUMsTUFBTTs4QkFZeEMsYUFBYTtzQkFEbkIsS0FBSztnQkFFMEIsT0FBTztzQkFBdEMsU0FBUzt1QkFBQyxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoQykgMjAyNSBUaGUgR3Jhdml0ZWUgdGVhbSAoaHR0cDovL2dyYXZpdGVlLmlvKVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBzaWduYWwsXG4gIFdyaXRhYmxlU2lnbmFsLFxuICBTaWduYWwsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIFZpZXdDaGlsZCxcbiAgRWxlbWVudFJlZixcbiAgQWZ0ZXJWaWV3SW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdEJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XG5pbXBvcnQgeyBNYXRQcm9ncmVzc0Jhck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Byb2dyZXNzLWJhcic7XG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5cbmltcG9ydCB7IEdpb0VsU2VydmljZSB9IGZyb20gJy4uL2dpby1lbC5zZXJ2aWNlJztcbmltcG9ydCB7IEVsQWlQcm9tcHRTdGF0ZSwgaXNQcm9tcHRFcnJvciwgaXNQcm9tcHRTdWNjZXNzIH0gZnJvbSAnLi4vbW9kZWxzL0VsQWlQcm9tcHRTdGF0ZSc7XG5pbXBvcnQgeyBHaW9JY29uc01vZHVsZSB9IGZyb20gJy4uLy4uL2dpby1pY29ucy9naW8taWNvbnMubW9kdWxlJztcbmltcG9ydCB7IEdpb0Jhbm5lck1vZHVsZSB9IGZyb20gJy4uLy4uL2dpby1iYW5uZXIvZ2lvLWJhbm5lci5tb2R1bGUnO1xuaW1wb3J0IHsgR2lvQ2xpcGJvYXJkTW9kdWxlIH0gZnJvbSAnLi4vLi4vZ2lvLWNsaXBib2FyZC9naW8tY2xpcGJvYXJkLm1vZHVsZSc7XG5cbnR5cGUgUHJvbXB0U3RhdGUgPSAnbG9hZGluZycgfCBFbEFpUHJvbXB0U3RhdGU7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2dpby1lbC1wcm9tcHQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2lvLWVsLXByb21wdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9naW8tZWwtcHJvbXB0LmNvbXBvbmVudC5zY3NzJyxcbiAgaW1wb3J0czogW1xuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgIE1hdElucHV0LFxuICAgIE1hdEJ1dHRvbixcbiAgICBNYXRQcm9ncmVzc0Jhck1vZHVsZSxcbiAgICBNYXRUb29sdGlwTW9kdWxlLFxuICAgIEdpb0ljb25zTW9kdWxlLFxuICAgIEdpb0Jhbm5lck1vZHVsZSxcbiAgICBHaW9DbGlwYm9hcmRNb2R1bGUsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBHaW9FbFByb21wdENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICBwdWJsaWMgcmVhZG9ubHkgbWF4UHJvbXB0U2l6ZSA9IDI1NjtcbiAgcHVibGljIGFpUmVxdWVzdEZvcm1Hcm91cDogRm9ybUdyb3VwPHtcbiAgICBwcm9tcHQ6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xuICB9PiA9IG5ldyBGb3JtR3JvdXAoe1xuICAgIHByb21wdDogbmV3IEZvcm1Db250cm9sKCcnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXgodGhpcy5tYXhQcm9tcHRTaXplKV0pLFxuICB9KTtcbiAgcHVibGljIGVsU2VydmljZTogR2lvRWxTZXJ2aWNlID0gaW5qZWN0KEdpb0VsU2VydmljZSk7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHJlc3BvbnNlU3RhdGU6IFdyaXRhYmxlU2lnbmFsPFByb21wdFN0YXRlIHwgbnVsbD4gPSBzaWduYWwobnVsbCk7XG4gIEBWaWV3Q2hpbGQoJ3Byb21wdEFyZWEnKSBwdWJsaWMgbXlJbnB1dCE6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XG5cbiAgcHVibGljIGVsOiBTaWduYWw8c3RyaW5nIHwgbnVsbD4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnJlc3BvbnNlU3RhdGUoKTtcbiAgICByZXR1cm4gaXNQcm9tcHRTdWNjZXNzKHN0YXRlKSA/IHN0YXRlLmVsIDogbnVsbDtcbiAgfSk7XG4gIHB1YmxpYyBlcnJvck1lc3NhZ2U6IFNpZ25hbDxzdHJpbmcgfCBudWxsPiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMucmVzcG9uc2VTdGF0ZSgpO1xuICAgIHJldHVybiBpc1Byb21wdEVycm9yKHN0YXRlKSA/IHN0YXRlLm1lc3NhZ2UgOiBudWxsO1xuICB9KTtcblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5teUlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9LCAxMDAwKTtcbiAgfVxuXG4gIHB1YmxpYyBzZW5kUHJvbXB0VG9JQSgpIHtcbiAgICBjb25zdCBwcm9tcHQgPSB0aGlzLmFpUmVxdWVzdEZvcm1Hcm91cC5nZXQoJ3Byb21wdCcpPy52YWx1ZTtcbiAgICBpZiAoIXByb21wdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlc3BvbnNlU3RhdGUuc2V0KCdsb2FkaW5nJyk7XG4gICAgdGhpcy5lbFNlcnZpY2UucHJvbXB0KHByb21wdCkuc3Vic2NyaWJlKHJlcGx5ID0+IHRoaXMucmVzcG9uc2VTdGF0ZS5zZXQocmVwbHkpKTtcbiAgfVxufVxuIiwiPCEtLVxuXG4gICAgQ29weXJpZ2h0IChDKSAyMDI1IFRoZSBHcmF2aXRlZSB0ZWFtIChodHRwOi8vZ3Jhdml0ZWUuaW8pXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuLS0+XG48aDU+RUwgSUEgQXNzaXN0YW50PC9oNT5cblxuPGRpdiBjbGFzcz1cImFpUmVxdWVzdEZvcm1cIiBbZm9ybUdyb3VwXT1cImFpUmVxdWVzdEZvcm1Hcm91cFwiPlxuICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJleGFtcGxlLWZ1bGwtd2lkdGhcIj5cbiAgICA8bWF0LWxhYmVsPkRlc2NyaWJlIHRoZSBFTCB5b3Ugd2FudCB0byBnZW5lcmF0ZTwvbWF0LWxhYmVsPlxuICAgIDx0ZXh0YXJlYSAjcHJvbXB0QXJlYSBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwcm9tcHRcIj48L3RleHRhcmVhPlxuICAgIDxtYXQtaGludCBbYWxpZ25dPVwiJ2VuZCdcIj57eyBhaVJlcXVlc3RGb3JtR3JvdXAuZ2V0KCdwcm9tcHQnKT8udmFsdWU/Lmxlbmd0aCB8fCAwIH19L3t7IG1heFByb21wdFNpemUgfX08L21hdC1oaW50PlxuICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gW2Rpc2FibGVkXT1cImFpUmVxdWVzdEZvcm1Hcm91cC5pbnZhbGlkXCIgKGNsaWNrKT1cInNlbmRQcm9tcHRUb0lBKClcIj5cbiAgICA8bWF0LWljb24gc3ZnSWNvbj1cImdpbzptYWdpYy13YW5kXCIgLz5cbiAgICBBc2sgTmV3dCBBSVxuICA8L2J1dHRvbj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiYWktY2FyZF9fY29udGVudF9fcmVzcG9uc2VcIj5cbiAgQGlmIChyZXNwb25zZVN0YXRlKCkgPT09ICdsb2FkaW5nJykge1xuICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XCJpbmRldGVybWluYXRlXCIgY2xhc3M9XCJsb2FkaW5nXCIgLz5cbiAgfVxuICBAaWYgKGVsKCk7IGFzIGV4cHJlc3Npb24pIHtcbiAgICA8Z2lvLWJhbm5lci1zdWNjZXNzPlxuICAgICAgPGNvZGUgZ2lvQ2xpcGJvYXJkQ29weVdyYXBwZXIgW2NvbnRlbnRUb0NvcHldPVwiZXhwcmVzc2lvblwiIFthbHdheXNWaXNpYmxlXT1cInRydWVcIj57eyBleHByZXNzaW9uIH19PC9jb2RlPlxuICAgIDwvZ2lvLWJhbm5lci1zdWNjZXNzPlxuICB9XG4gIEBpZiAoZXJyb3JNZXNzYWdlKCk7IGFzIG1lc3NhZ2UpIHtcbiAgICA8Z2lvLWJhbm5lci1lcnJvcj5cbiAgICAgIEVycm9yXG4gICAgICA8c3BhbiBnaW9CYW5uZXJCb2R5PiB7eyBtZXNzYWdlIH19IDwvc3Bhbj5cbiAgICA8L2dpby1iYW5uZXItZXJyb3I+XG4gIH1cbjwvZGl2PlxuIl19
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2lvLWVsLXByb21wdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1wYXJ0aWNsZXMtYW5ndWxhci9zcmMvbGliL2dpby1lbC9naW8tZWwtcHJvbXB0L2dpby1lbC1wcm9tcHQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktcGFydGljbGVzLWFuZ3VsYXIvc3JjL2xpYi9naW8tZWwvZ2lvLWVsLXByb21wdC9naW8tZWwtcHJvbXB0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsS0FBSyxFQUNMLE1BQU0sRUFHTixRQUFRLEVBQ1IsTUFBTSxFQUNOLFNBQVMsR0FHVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFtQixhQUFhLEVBQUUsZUFBZSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDNUYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQzs7Ozs7Ozs7O0FBdUI5RSxNQUFNLE9BQU8sb0JBQW9CO0lBbEJqQztRQW1Ca0Isa0JBQWEsR0FBRyxHQUFHLENBQUM7UUFDN0IsdUJBQWtCLEdBRXBCLElBQUksU0FBUyxDQUFDO1lBQ2pCLE1BQU0sRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7U0FDN0YsQ0FBQyxDQUFDO1FBQ0ksY0FBUyxHQUFpQixNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7UUFHL0Msa0JBQWEsR0FBdUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBR2pFLGtCQUFhLEdBQWtDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUs1RCxPQUFFLEdBQTBCLFFBQVEsQ0FBQyxHQUFHLEVBQUU7WUFDL0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25DLE9BQU8sZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDbEQsQ0FBQyxDQUFDLENBQUM7UUFDSSxpQkFBWSxHQUEwQixRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ3pELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUNuQyxPQUFPLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ3JELENBQUMsQ0FBQyxDQUFDO1FBRUksaUJBQVksR0FBb0IsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNuRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDbkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7S0F5Qko7SUF6Q0MsSUFBVyxNQUFNO1FBQ2YsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQy9DLENBQUM7SUFnQk0sZUFBZTtRQUNwQixVQUFVLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDckMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVNLGNBQWM7UUFDbkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLENBQUM7UUFDNUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLHlDQUF5QztRQUN2RSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFTSxjQUFjLENBQUMsUUFBbUM7UUFDdkQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDakMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzdCLElBQUksVUFBVSxFQUFFLENBQUM7WUFDZixJQUFJLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbEUsQ0FBQztJQUNILENBQUM7OEdBdkRVLG9CQUFvQjtrR0FBcEIsb0JBQW9CLDROQy9EakMseXRGQTBFQSxpOUJEeEJJLG1CQUFtQixtMkJBQ25CLGtCQUFrQixtWUFDbEIsUUFBUSx3VkFDUixTQUFTLGdMQUNULG9CQUFvQix3TkFDcEIsZ0JBQWdCLDZUQUNoQixhQUFhLDRGQUNiLGNBQWMsbUxBQ2QsZUFBZSwwWEFDZixrQkFBa0I7OzJGQUlULG9CQUFvQjtrQkFsQmhDLFNBQVM7K0JBQ0UsZUFBZSxXQUdoQjt3QkFDUCxtQkFBbUI7d0JBQ25CLGtCQUFrQjt3QkFDbEIsUUFBUTt3QkFDUixTQUFTO3dCQUNULG9CQUFvQjt3QkFDcEIsZ0JBQWdCO3dCQUNoQixhQUFhO3dCQUNiLGNBQWM7d0JBQ2QsZUFBZTt3QkFDZixrQkFBa0I7cUJBQ25CLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNOzhCQVl4QyxhQUFhO3NCQURuQixLQUFLO2dCQUUwQixPQUFPO3NCQUF0QyxTQUFTO3VCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChDKSAyMDI1IFRoZSBHcmF2aXRlZSB0ZWFtIChodHRwOi8vZ3Jhdml0ZWUuaW8pXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIHNpZ25hbCxcbiAgV3JpdGFibGVTaWduYWwsXG4gIFNpZ25hbCxcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbiAgVmlld0NoaWxkLFxuICBFbGVtZW50UmVmLFxuICBBZnRlclZpZXdJbml0LFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgTWF0QnV0dG9uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcbmltcG9ydCB7IE1hdFByb2dyZXNzQmFyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3MtYmFyJztcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcbmltcG9ydCB7IE1hdEljb25CdXR0b24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuXG5pbXBvcnQgeyBHaW9FbFNlcnZpY2UgfSBmcm9tICcuLi9naW8tZWwuc2VydmljZSc7XG5pbXBvcnQgeyBFbEFpUHJvbXB0U3RhdGUsIGlzUHJvbXB0RXJyb3IsIGlzUHJvbXB0U3VjY2VzcyB9IGZyb20gJy4uL21vZGVscy9FbEFpUHJvbXB0U3RhdGUnO1xuaW1wb3J0IHsgR2lvSWNvbnNNb2R1bGUgfSBmcm9tICcuLi8uLi9naW8taWNvbnMvZ2lvLWljb25zLm1vZHVsZSc7XG5pbXBvcnQgeyBHaW9CYW5uZXJNb2R1bGUgfSBmcm9tICcuLi8uLi9naW8tYmFubmVyL2dpby1iYW5uZXIubW9kdWxlJztcbmltcG9ydCB7IEdpb0NsaXBib2FyZE1vZHVsZSB9IGZyb20gJy4uLy4uL2dpby1jbGlwYm9hcmQvZ2lvLWNsaXBib2FyZC5tb2R1bGUnO1xuXG50eXBlIFByb21wdFN0YXRlID0gJ2xvYWRpbmcnIHwgRWxBaVByb21wdFN0YXRlO1xudHlwZSBGZWVkYmFja1N0YXRlID0gJ2hlbHBmdWwnIHwgJ25vdC1oZWxwZnVsJyB8IG51bGw7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2dpby1lbC1wcm9tcHQnLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2lvLWVsLXByb21wdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9naW8tZWwtcHJvbXB0LmNvbXBvbmVudC5zY3NzJyxcbiAgaW1wb3J0czogW1xuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxuICAgIE1hdElucHV0LFxuICAgIE1hdEJ1dHRvbixcbiAgICBNYXRQcm9ncmVzc0Jhck1vZHVsZSxcbiAgICBNYXRUb29sdGlwTW9kdWxlLFxuICAgIE1hdEljb25CdXR0b24sXG4gICAgR2lvSWNvbnNNb2R1bGUsXG4gICAgR2lvQmFubmVyTW9kdWxlLFxuICAgIEdpb0NsaXBib2FyZE1vZHVsZSxcbiAgXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIEdpb0VsUHJvbXB0Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIHB1YmxpYyByZWFkb25seSBtYXhQcm9tcHRTaXplID0gMjU2O1xuICBwdWJsaWMgYWlSZXF1ZXN0Rm9ybUdyb3VwOiBGb3JtR3JvdXA8e1xuICAgIHByb21wdDogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XG4gIH0+ID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgcHJvbXB0OiBuZXcgRm9ybUNvbnRyb2woJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCh0aGlzLm1heFByb21wdFNpemUpXSksXG4gIH0pO1xuICBwdWJsaWMgZWxTZXJ2aWNlOiBHaW9FbFNlcnZpY2UgPSBpbmplY3QoR2lvRWxTZXJ2aWNlKTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgcmVzcG9uc2VTdGF0ZTogV3JpdGFibGVTaWduYWw8UHJvbXB0U3RhdGUgfCBudWxsPiA9IHNpZ25hbChudWxsKTtcbiAgQFZpZXdDaGlsZCgncHJvbXB0QXJlYScpIHB1YmxpYyBteUlucHV0ITogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcblxuICBwdWJsaWMgZmVlZGJhY2tTdGF0ZTogV3JpdGFibGVTaWduYWw8RmVlZGJhY2tTdGF0ZT4gPSBzaWduYWwobnVsbCk7XG5cbiAgcHVibGljIGdldCBwcm9tcHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuYWlSZXF1ZXN0Rm9ybUdyb3VwLmdldCgncHJvbXB0Jyk7XG4gIH1cbiAgcHVibGljIGVsOiBTaWduYWw8c3RyaW5nIHwgbnVsbD4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnJlc3BvbnNlU3RhdGUoKTtcbiAgICByZXR1cm4gaXNQcm9tcHRTdWNjZXNzKHN0YXRlKSA/IHN0YXRlLmVsIDogbnVsbDtcbiAgfSk7XG4gIHB1YmxpYyBlcnJvck1lc3NhZ2U6IFNpZ25hbDxzdHJpbmcgfCBudWxsPiA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IHRoaXMucmVzcG9uc2VTdGF0ZSgpO1xuICAgIHJldHVybiBpc1Byb21wdEVycm9yKHN0YXRlKSA/IHN0YXRlLm1lc3NhZ2UgOiBudWxsO1xuICB9KTtcblxuICBwdWJsaWMgc2hvd0ZlZWRiYWNrOiBTaWduYWw8Ym9vbGVhbj4gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLnJlc3BvbnNlU3RhdGUoKTtcbiAgICBjb25zdCBmZWVkYmFjayA9IHRoaXMuZmVlZGJhY2tTdGF0ZSgpO1xuICAgIHJldHVybiBpc1Byb21wdFN1Y2Nlc3Moc3RhdGUpICYmIGZlZWRiYWNrID09PSBudWxsO1xuICB9KTtcblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5teUlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9LCAxMDAwKTtcbiAgfVxuXG4gIHB1YmxpYyBzZW5kUHJvbXB0VG9JQSgpIHtcbiAgICBjb25zdCBwcm9tcHQgPSB0aGlzLmFpUmVxdWVzdEZvcm1Hcm91cC5nZXQoJ3Byb21wdCcpPy52YWx1ZTtcbiAgICBpZiAoIXByb21wdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlc3BvbnNlU3RhdGUuc2V0KCdsb2FkaW5nJyk7XG4gICAgdGhpcy5mZWVkYmFja1N0YXRlLnNldChudWxsKTsgLy8gUmVzZXQgZmVlZGJhY2sgd2hlbiBzZW5kaW5nIG5ldyBwcm9tcHRcbiAgICB0aGlzLmVsU2VydmljZS5wcm9tcHQocHJvbXB0KS5zdWJzY3JpYmUocmVwbHkgPT4gdGhpcy5yZXNwb25zZVN0YXRlLnNldChyZXBseSkpO1xuICB9XG5cbiAgcHVibGljIHN1Ym1pdEZlZWRiYWNrKGZlZWRiYWNrOiAnaGVscGZ1bCcgfCAnbm90LWhlbHBmdWwnKSB7XG4gICAgdGhpcy5mZWVkYmFja1N0YXRlLnNldChmZWVkYmFjayk7XG4gICAgY29uc3QgZXhwcmVzc2lvbiA9IHRoaXMuZWwoKTtcbiAgICBpZiAoZXhwcmVzc2lvbikge1xuICAgICAgdGhpcy5lbFNlcnZpY2Uuc3VibWl0RmVlZGJhY2soZmVlZGJhY2ssIGV4cHJlc3Npb24pLnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxufVxuIiwiPCEtLVxuXG4gICAgQ29weXJpZ2h0IChDKSAyMDI1IFRoZSBHcmF2aXRlZSB0ZWFtIChodHRwOi8vZ3Jhdml0ZWUuaW8pXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cblxuLS0+XG48aDU+RUwgSUEgQXNzaXN0YW50PC9oNT5cblxuPGRpdiBjbGFzcz1cImFpUmVxdWVzdEZvcm1cIiBbZm9ybUdyb3VwXT1cImFpUmVxdWVzdEZvcm1Hcm91cFwiPlxuICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJleGFtcGxlLWZ1bGwtd2lkdGhcIj5cbiAgICA8bWF0LWxhYmVsPkRlc2NyaWJlIHRoZSBFTCB5b3Ugd2FudCB0byBnZW5lcmF0ZTwvbWF0LWxhYmVsPlxuICAgIDx0ZXh0YXJlYSAjcHJvbXB0QXJlYSBtYXRJbnB1dCBmb3JtQ29udHJvbE5hbWU9XCJwcm9tcHRcIj48L3RleHRhcmVhPlxuICAgIDxtYXQtaGludCBbYWxpZ25dPVwiJ2VuZCdcIj57eyBwcm9tcHQ/LnZhbHVlPy5sZW5ndGggfHwgMCB9fS97eyBtYXhQcm9tcHRTaXplIH19PC9tYXQtaGludD5cbiAgPC9tYXQtZm9ybS1maWVsZD5cblxuICBAaWYgKHByb21wdD8udG91Y2hlZCAmJiBwcm9tcHQ/Lmhhc0Vycm9yKCdtYXhsZW5ndGgnKSkge1xuICAgIDxnaW8tYmFubmVyLWVycm9yPiBZb3VyIHByb21wdCBpcyB0b28gbG9uZy4gSXQgc2hvdWxkIGJlIGxlc3MgdGhhbiB7eyBtYXhQcm9tcHRTaXplIH19IGNoYXJhY3RlcnMuIDwvZ2lvLWJhbm5lci1lcnJvcj5cbiAgfVxuXG4gIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gW2Rpc2FibGVkXT1cImFpUmVxdWVzdEZvcm1Hcm91cC5pbnZhbGlkXCIgKGNsaWNrKT1cInNlbmRQcm9tcHRUb0lBKClcIj5cbiAgICA8bWF0LWljb24gc3ZnSWNvbj1cImdpbzptYWdpYy13YW5kXCIgLz5cbiAgICBBc2sgTmV3dCBBSVxuICA8L2J1dHRvbj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwiYWktY2FyZF9fY29udGVudF9fcmVzcG9uc2VcIj5cbiAgQGlmIChyZXNwb25zZVN0YXRlKCkgPT09ICdsb2FkaW5nJykge1xuICAgIDxtYXQtcHJvZ3Jlc3MtYmFyIG1vZGU9XCJpbmRldGVybWluYXRlXCIgY2xhc3M9XCJsb2FkaW5nXCIgLz5cbiAgfVxuICBAaWYgKGVsKCk7IGFzIGV4cHJlc3Npb24pIHtcbiAgICA8Z2lvLWJhbm5lci1zdWNjZXNzPlxuICAgICAgPGNvZGUgZ2lvQ2xpcGJvYXJkQ29weVdyYXBwZXIgW2NvbnRlbnRUb0NvcHldPVwiZXhwcmVzc2lvblwiIFthbHdheXNWaXNpYmxlXT1cInRydWVcIj57eyBleHByZXNzaW9uIH19PC9jb2RlPlxuICAgIDwvZ2lvLWJhbm5lci1zdWNjZXNzPlxuICAgIEBpZiAoc2hvd0ZlZWRiYWNrKCkpIHtcbiAgICAgIDxnaW8tYmFubmVyLWluZm8+XG4gICAgICAgIFdhcyB0aGUgYW5zd2VyIGhlbHBmdWw/XG4gICAgICAgIDxzcGFuIGdpb0Jhbm5lckJvZHkgY2xhc3M9XCJmZWVkYmFjay1idXR0b25zXCI+XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXG4gICAgICAgICAgICAoY2xpY2spPVwic3VibWl0RmVlZGJhY2soJ2hlbHBmdWwnKVwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiWWVzLCB0aGlzIHdhcyBoZWxwZnVsXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmVlZGJhY2stYnV0dG9uIGZlZWRiYWNrLWJ1dHRvbi0taGVscGZ1bFwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJnaW86dGh1bWJzLXVwXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgICAgIChjbGljayk9XCJzdWJtaXRGZWVkYmFjaygnbm90LWhlbHBmdWwnKVwiXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiTm8sIHRoaXMgd2FzIG5vdCBoZWxwZnVsXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmVlZGJhY2stYnV0dG9uIGZlZWRiYWNrLWJ1dHRvbi0tbm90LWhlbHBmdWxcIj5cbiAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiZ2lvOnRodW1icy1kb3duXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9naW8tYmFubmVyLWluZm8+XG4gICAgfVxuICB9XG4gIEBpZiAoZXJyb3JNZXNzYWdlKCk7IGFzIG1lc3NhZ2UpIHtcbiAgICA8Z2lvLWJhbm5lci1lcnJvcj5cbiAgICAgIEVycm9yXG4gICAgICA8c3BhbiBnaW9CYW5uZXJCb2R5PiB7eyBtZXNzYWdlIH19IDwvc3Bhbj5cbiAgICA8L2dpby1iYW5uZXItZXJyb3I+XG4gIH1cbjwvZGl2PlxuIl19
|
|
@@ -19,18 +19,30 @@ import * as i0 from "@angular/core";
|
|
|
19
19
|
export class GioElService {
|
|
20
20
|
constructor() {
|
|
21
21
|
this._promptCallback = undefined;
|
|
22
|
+
this._feedbackCallback = undefined;
|
|
22
23
|
}
|
|
23
24
|
prompt(prompt) {
|
|
24
25
|
if (this._promptCallback === undefined) {
|
|
25
26
|
return of({
|
|
26
|
-
|
|
27
|
+
el: 'Some fancy EL prompt',
|
|
27
28
|
});
|
|
28
29
|
}
|
|
29
30
|
return this._promptCallback(prompt);
|
|
30
31
|
}
|
|
32
|
+
submitFeedback(feedback, expression) {
|
|
33
|
+
if (this._feedbackCallback === undefined) {
|
|
34
|
+
// For now, just log the feedback - in a real implementation, this would send to backend
|
|
35
|
+
console.log('Feedback submitted:', { feedback, expression });
|
|
36
|
+
return of(undefined);
|
|
37
|
+
}
|
|
38
|
+
return this._feedbackCallback(feedback, expression);
|
|
39
|
+
}
|
|
31
40
|
set promptCallback(value) {
|
|
32
41
|
this._promptCallback = value;
|
|
33
42
|
}
|
|
43
|
+
set feedbackCallback(value) {
|
|
44
|
+
this._feedbackCallback = value;
|
|
45
|
+
}
|
|
34
46
|
isEnabled() {
|
|
35
47
|
return this._promptCallback !== undefined;
|
|
36
48
|
}
|
|
@@ -43,4 +55,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
|
|
|
43
55
|
providedIn: 'root',
|
|
44
56
|
}]
|
|
45
57
|
}] });
|
|
46
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2lvLWVsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy91aS1wYXJ0aWNsZXMtYW5ndWxhci9zcmMvbGliL2dpby1lbC9naW8tZWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7QUFTdEMsTUFBTSxPQUFPLFlBQVk7SUFIekI7UUFJVSxvQkFBZSxHQUFxRCxTQUFTLENBQUM7UUFDOUUsc0JBQWlCLEdBQXNFLFNBQVMsQ0FBQztLQStCMUc7SUE3QlEsTUFBTSxDQUFDLE1BQWM7UUFDMUIsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3ZDLE9BQU8sRUFBRSxDQUFDO2dCQUNSLEVBQUUsRUFBRSxzQkFBc0I7YUFDM0IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRU0sY0FBYyxDQUFDLFFBQXNCLEVBQUUsVUFBa0I7UUFDOUQsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDekMsd0ZBQXdGO1lBQ3hGLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztZQUM3RCxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2QixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxJQUFXLGNBQWMsQ0FBQyxLQUFzRDtRQUM5RSxJQUFJLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztJQUMvQixDQUFDO0lBRUQsSUFBVyxnQkFBZ0IsQ0FBQyxLQUF1RTtRQUNqRyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0lBQ2pDLENBQUM7SUFFTSxTQUFTO1FBQ2QsT0FBTyxJQUFJLENBQUMsZUFBZSxLQUFLLFNBQVMsQ0FBQztJQUM1QyxDQUFDOzhHQWhDVSxZQUFZO2tIQUFaLFlBQVksY0FGWCxNQUFNOzsyRkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEdyYXZpdGVlIHRlYW0gKGh0dHA6Ly9ncmF2aXRlZS5pbylcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBFbEFpUHJvbXB0U3RhdGUgfSBmcm9tICcuL21vZGVscy9FbEFpUHJvbXB0U3RhdGUnO1xuXG5leHBvcnQgdHlwZSBGZWVkYmFja1R5cGUgPSAnaGVscGZ1bCcgfCAnbm90LWhlbHBmdWwnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgR2lvRWxTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBfcHJvbXB0Q2FsbGJhY2s/OiAocHJvbXB0OiBzdHJpbmcpID0+IE9ic2VydmFibGU8RWxBaVByb21wdFN0YXRlPiA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfZmVlZGJhY2tDYWxsYmFjaz86IChmZWVkYmFjazogRmVlZGJhY2tUeXBlLCBleHByZXNzaW9uOiBzdHJpbmcpID0+IE9ic2VydmFibGU8dm9pZD4gPSB1bmRlZmluZWQ7XG5cbiAgcHVibGljIHByb21wdChwcm9tcHQ6IHN0cmluZyk6IE9ic2VydmFibGU8RWxBaVByb21wdFN0YXRlPiB7XG4gICAgaWYgKHRoaXMuX3Byb21wdENhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBvZih7XG4gICAgICAgIGVsOiAnU29tZSBmYW5jeSBFTCBwcm9tcHQnLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9wcm9tcHRDYWxsYmFjayhwcm9tcHQpO1xuICB9XG5cbiAgcHVibGljIHN1Ym1pdEZlZWRiYWNrKGZlZWRiYWNrOiBGZWVkYmFja1R5cGUsIGV4cHJlc3Npb246IHN0cmluZyk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9mZWVkYmFja0NhbGxiYWNrID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEZvciBub3csIGp1c3QgbG9nIHRoZSBmZWVkYmFjayAtIGluIGEgcmVhbCBpbXBsZW1lbnRhdGlvbiwgdGhpcyB3b3VsZCBzZW5kIHRvIGJhY2tlbmRcbiAgICAgIGNvbnNvbGUubG9nKCdGZWVkYmFjayBzdWJtaXR0ZWQ6JywgeyBmZWVkYmFjaywgZXhwcmVzc2lvbiB9KTtcbiAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZmVlZGJhY2tDYWxsYmFjayhmZWVkYmFjaywgZXhwcmVzc2lvbik7XG4gIH1cblxuICBwdWJsaWMgc2V0IHByb21wdENhbGxiYWNrKHZhbHVlOiAocHJvbXB0OiBzdHJpbmcpID0+IE9ic2VydmFibGU8RWxBaVByb21wdFN0YXRlPikge1xuICAgIHRoaXMuX3Byb21wdENhbGxiYWNrID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgc2V0IGZlZWRiYWNrQ2FsbGJhY2sodmFsdWU6IChmZWVkYmFjazogRmVlZGJhY2tUeXBlLCBleHByZXNzaW9uOiBzdHJpbmcpID0+IE9ic2VydmFibGU8dm9pZD4pIHtcbiAgICB0aGlzLl9mZWVkYmFja0NhbGxiYWNrID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgaXNFbmFibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9wcm9tcHRDYWxsYmFjayAhPT0gdW5kZWZpbmVkO1xuICB9XG59XG4iXX0=
|
|
@@ -8,7 +8,7 @@ import { CommonModule } from '@angular/common';
|
|
|
8
8
|
import * as i2 from '@angular/material/card';
|
|
9
9
|
import { MatCardModule } from '@angular/material/card';
|
|
10
10
|
import * as i3 from '@angular/material/button';
|
|
11
|
-
import { MatButtonModule, MatButton } from '@angular/material/button';
|
|
11
|
+
import { MatButtonModule, MatButton, MatIconButton } from '@angular/material/button';
|
|
12
12
|
import { ComponentHarness, HarnessPredicate, parallel, TestKey } from '@angular/cdk/testing';
|
|
13
13
|
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
|
14
14
|
import { MatFormFieldControl, MatFormFieldModule, MAT_FORM_FIELD_DEFAULT_OPTIONS } from '@angular/material/form-field';
|
|
@@ -1213,18 +1213,30 @@ class GioConfirmAndValidateDialogHarness extends ComponentHarness {
|
|
|
1213
1213
|
class GioElService {
|
|
1214
1214
|
constructor() {
|
|
1215
1215
|
this._promptCallback = undefined;
|
|
1216
|
+
this._feedbackCallback = undefined;
|
|
1216
1217
|
}
|
|
1217
1218
|
prompt(prompt) {
|
|
1218
1219
|
if (this._promptCallback === undefined) {
|
|
1219
1220
|
return of({
|
|
1220
|
-
|
|
1221
|
+
el: 'Some fancy EL prompt',
|
|
1221
1222
|
});
|
|
1222
1223
|
}
|
|
1223
1224
|
return this._promptCallback(prompt);
|
|
1224
1225
|
}
|
|
1226
|
+
submitFeedback(feedback, expression) {
|
|
1227
|
+
if (this._feedbackCallback === undefined) {
|
|
1228
|
+
// For now, just log the feedback - in a real implementation, this would send to backend
|
|
1229
|
+
console.log('Feedback submitted:', { feedback, expression });
|
|
1230
|
+
return of(undefined);
|
|
1231
|
+
}
|
|
1232
|
+
return this._feedbackCallback(feedback, expression);
|
|
1233
|
+
}
|
|
1225
1234
|
set promptCallback(value) {
|
|
1226
1235
|
this._promptCallback = value;
|
|
1227
1236
|
}
|
|
1237
|
+
set feedbackCallback(value) {
|
|
1238
|
+
this._feedbackCallback = value;
|
|
1239
|
+
}
|
|
1228
1240
|
isEnabled() {
|
|
1229
1241
|
return this._promptCallback !== undefined;
|
|
1230
1242
|
}
|
|
@@ -1493,10 +1505,11 @@ class GioElPromptComponent {
|
|
|
1493
1505
|
constructor() {
|
|
1494
1506
|
this.maxPromptSize = 256;
|
|
1495
1507
|
this.aiRequestFormGroup = new FormGroup({
|
|
1496
|
-
prompt: new FormControl('', [Validators.required, Validators.
|
|
1508
|
+
prompt: new FormControl('', [Validators.required, Validators.maxLength(this.maxPromptSize)]),
|
|
1497
1509
|
});
|
|
1498
1510
|
this.elService = inject(GioElService);
|
|
1499
1511
|
this.responseState = signal(null);
|
|
1512
|
+
this.feedbackState = signal(null);
|
|
1500
1513
|
this.el = computed(() => {
|
|
1501
1514
|
const state = this.responseState();
|
|
1502
1515
|
return isPromptSuccess(state) ? state.el : null;
|
|
@@ -1505,6 +1518,14 @@ class GioElPromptComponent {
|
|
|
1505
1518
|
const state = this.responseState();
|
|
1506
1519
|
return isPromptError(state) ? state.message : null;
|
|
1507
1520
|
});
|
|
1521
|
+
this.showFeedback = computed(() => {
|
|
1522
|
+
const state = this.responseState();
|
|
1523
|
+
const feedback = this.feedbackState();
|
|
1524
|
+
return isPromptSuccess(state) && feedback === null;
|
|
1525
|
+
});
|
|
1526
|
+
}
|
|
1527
|
+
get prompt() {
|
|
1528
|
+
return this.aiRequestFormGroup.get('prompt');
|
|
1508
1529
|
}
|
|
1509
1530
|
ngAfterViewInit() {
|
|
1510
1531
|
setTimeout(() => {
|
|
@@ -1517,10 +1538,18 @@ class GioElPromptComponent {
|
|
|
1517
1538
|
return;
|
|
1518
1539
|
}
|
|
1519
1540
|
this.responseState.set('loading');
|
|
1541
|
+
this.feedbackState.set(null); // Reset feedback when sending new prompt
|
|
1520
1542
|
this.elService.prompt(prompt).subscribe(reply => this.responseState.set(reply));
|
|
1521
1543
|
}
|
|
1544
|
+
submitFeedback(feedback) {
|
|
1545
|
+
this.feedbackState.set(feedback);
|
|
1546
|
+
const expression = this.el();
|
|
1547
|
+
if (expression) {
|
|
1548
|
+
this.elService.submitFeedback(feedback, expression).subscribe();
|
|
1549
|
+
}
|
|
1550
|
+
}
|
|
1522
1551
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: GioElPromptComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1523
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.4", type: GioElPromptComponent, isStandalone: true, selector: "gio-el-prompt", inputs: { responseState: "responseState" }, viewQueries: [{ propertyName: "myInput", first: true, predicate: ["promptArea"], descendants: true }], ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h5>EL IA Assistant</h5>\n\n<div class=\"aiRequestForm\" [formGroup]=\"aiRequestFormGroup\">\n <mat-form-field class=\"example-full-width\">\n <mat-label>Describe the EL you want to generate</mat-label>\n <textarea #promptArea matInput formControlName=\"prompt\"></textarea>\n <mat-hint [align]=\"'end'\">{{
|
|
1552
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.4", type: GioElPromptComponent, isStandalone: true, selector: "gio-el-prompt", inputs: { responseState: "responseState" }, viewQueries: [{ propertyName: "myInput", first: true, predicate: ["promptArea"], descendants: true }], ngImport: i0, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h5>EL IA Assistant</h5>\n\n<div class=\"aiRequestForm\" [formGroup]=\"aiRequestFormGroup\">\n <mat-form-field class=\"example-full-width\">\n <mat-label>Describe the EL you want to generate</mat-label>\n <textarea #promptArea matInput formControlName=\"prompt\"></textarea>\n <mat-hint [align]=\"'end'\">{{ prompt?.value?.length || 0 }}/{{ maxPromptSize }}</mat-hint>\n </mat-form-field>\n\n @if (prompt?.touched && prompt?.hasError('maxlength')) {\n <gio-banner-error> Your prompt is too long. It should be less than {{ maxPromptSize }} characters. </gio-banner-error>\n }\n\n <button mat-raised-button [disabled]=\"aiRequestFormGroup.invalid\" (click)=\"sendPromptToIA()\">\n <mat-icon svgIcon=\"gio:magic-wand\" />\n Ask Newt AI\n </button>\n</div>\n\n<div class=\"ai-card__content__response\">\n @if (responseState() === 'loading') {\n <mat-progress-bar mode=\"indeterminate\" class=\"loading\" />\n }\n @if (el(); as expression) {\n <gio-banner-success>\n <code gioClipboardCopyWrapper [contentToCopy]=\"expression\" [alwaysVisible]=\"true\">{{ expression }}</code>\n </gio-banner-success>\n @if (showFeedback()) {\n <gio-banner-info>\n Was the answer helpful?\n <span gioBannerBody class=\"feedback-buttons\">\n <button\n mat-icon-button\n (click)=\"submitFeedback('helpful')\"\n matTooltip=\"Yes, this was helpful\"\n class=\"feedback-button feedback-button--helpful\"\n >\n <mat-icon svgIcon=\"gio:thumbs-up\"></mat-icon>\n </button>\n <button\n mat-icon-button\n (click)=\"submitFeedback('not-helpful')\"\n matTooltip=\"No, this was not helpful\"\n class=\"feedback-button feedback-button--not-helpful\">\n <mat-icon svgIcon=\"gio:thumbs-down\"></mat-icon>\n </button>\n </span>\n </gio-banner-info>\n }\n }\n @if (errorMessage(); as message) {\n <gio-banner-error>\n Error\n <span gioBannerBody> {{ message }} </span>\n </gio-banner-error>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;width:400px;flex-direction:column;padding:12px;border-radius:4px;background-color:#fff;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.aiRequestForm{display:flex;flex-direction:column;gap:8px}.banner__wrapper__title{width:100%}.banner-success-content{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.feedback-buttons{display:flex;gap:8px;align-items:center}.feedback-button{transition:all .2s ease-in-out}.feedback-button:hover{transform:scale(1.1)}.feedback-button--helpful{color:#22b374}.feedback-button--helpful:hover{background-color:#8dffce;opacity:.5}.feedback-button--not-helpful{color:#dd1d1f}.feedback-button--not-helpful:hover{background-color:#ffcfd0;opacity:.5}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$2.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: i1$2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "component", type: i3$2.MatProgressBar, selector: "mat-progress-bar", inputs: ["color", "value", "bufferValue", "mode"], outputs: ["animationEnd"], exportAs: ["matProgressBar"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i2$2.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i1$1.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: GioBannerModule }, { kind: "component", type: GioBannerErrorComponent, selector: "gio-banner-error" }, { kind: "component", type: GioBannerInfoComponent, selector: "gio-banner-info" }, { kind: "component", type: GioBannerSuccessComponent, selector: "gio-banner-success" }, { kind: "directive", type: GioBannerBodyDirective, selector: "[gioBannerBody]" }, { kind: "ngmodule", type: GioClipboardModule }, { kind: "component", type: GioClipboardCopyWrapperComponent, selector: "[gioClipboardCopyWrapper]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1524
1553
|
}
|
|
1525
1554
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImport: i0, type: GioElPromptComponent, decorators: [{
|
|
1526
1555
|
type: Component,
|
|
@@ -1531,10 +1560,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.4", ngImpor
|
|
|
1531
1560
|
MatButton,
|
|
1532
1561
|
MatProgressBarModule,
|
|
1533
1562
|
MatTooltipModule,
|
|
1563
|
+
MatIconButton,
|
|
1534
1564
|
GioIconsModule,
|
|
1535
1565
|
GioBannerModule,
|
|
1536
1566
|
GioClipboardModule,
|
|
1537
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h5>EL IA Assistant</h5>\n\n<div class=\"aiRequestForm\" [formGroup]=\"aiRequestFormGroup\">\n <mat-form-field class=\"example-full-width\">\n <mat-label>Describe the EL you want to generate</mat-label>\n <textarea #promptArea matInput formControlName=\"prompt\"></textarea>\n <mat-hint [align]=\"'end'\">{{
|
|
1567
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!--\n\n Copyright (C) 2025 The Gravitee team (http://gravitee.io)\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n\n http://www.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n<h5>EL IA Assistant</h5>\n\n<div class=\"aiRequestForm\" [formGroup]=\"aiRequestFormGroup\">\n <mat-form-field class=\"example-full-width\">\n <mat-label>Describe the EL you want to generate</mat-label>\n <textarea #promptArea matInput formControlName=\"prompt\"></textarea>\n <mat-hint [align]=\"'end'\">{{ prompt?.value?.length || 0 }}/{{ maxPromptSize }}</mat-hint>\n </mat-form-field>\n\n @if (prompt?.touched && prompt?.hasError('maxlength')) {\n <gio-banner-error> Your prompt is too long. It should be less than {{ maxPromptSize }} characters. </gio-banner-error>\n }\n\n <button mat-raised-button [disabled]=\"aiRequestFormGroup.invalid\" (click)=\"sendPromptToIA()\">\n <mat-icon svgIcon=\"gio:magic-wand\" />\n Ask Newt AI\n </button>\n</div>\n\n<div class=\"ai-card__content__response\">\n @if (responseState() === 'loading') {\n <mat-progress-bar mode=\"indeterminate\" class=\"loading\" />\n }\n @if (el(); as expression) {\n <gio-banner-success>\n <code gioClipboardCopyWrapper [contentToCopy]=\"expression\" [alwaysVisible]=\"true\">{{ expression }}</code>\n </gio-banner-success>\n @if (showFeedback()) {\n <gio-banner-info>\n Was the answer helpful?\n <span gioBannerBody class=\"feedback-buttons\">\n <button\n mat-icon-button\n (click)=\"submitFeedback('helpful')\"\n matTooltip=\"Yes, this was helpful\"\n class=\"feedback-button feedback-button--helpful\"\n >\n <mat-icon svgIcon=\"gio:thumbs-up\"></mat-icon>\n </button>\n <button\n mat-icon-button\n (click)=\"submitFeedback('not-helpful')\"\n matTooltip=\"No, this was not helpful\"\n class=\"feedback-button feedback-button--not-helpful\">\n <mat-icon svgIcon=\"gio:thumbs-down\"></mat-icon>\n </button>\n </span>\n </gio-banner-info>\n }\n }\n @if (errorMessage(); as message) {\n <gio-banner-error>\n Error\n <span gioBannerBody> {{ message }} </span>\n </gio-banner-error>\n }\n</div>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #ffc2ac);color:var(--gio-oem-palette--active-contrast, #1e1b1b)}:host{display:flex;width:400px;flex-direction:column;padding:12px;border-radius:4px;background-color:#fff;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.aiRequestForm{display:flex;flex-direction:column;gap:8px}.banner__wrapper__title{width:100%}.banner-success-content{display:flex;flex-direction:row;align-items:center;justify-content:space-between}.feedback-buttons{display:flex;gap:8px;align-items:center}.feedback-button{transition:all .2s ease-in-out}.feedback-button:hover{transform:scale(1.1)}.feedback-button--helpful{color:#22b374}.feedback-button--helpful:hover{background-color:#8dffce;opacity:.5}.feedback-button--not-helpful{color:#dd1d1f}.feedback-button--not-helpful:hover{background-color:#ffcfd0;opacity:.5}\n"] }]
|
|
1538
1568
|
}], propDecorators: { responseState: [{
|
|
1539
1569
|
type: Input
|
|
1540
1570
|
}], myInput: [{
|