@eugenemahota/angular-editor 2.0.0

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/CHANGELOG.md ADDED
@@ -0,0 +1,15 @@
1
+ <a name="2.0.0"></a>
2
+ ## [1.0.2](https://github.com/eugenemahota/angular-editor-fix-font-modal/compare/v1.2.0...v2.0.0) (2022-01-06) Majore release
3
+ * Update to Angular v.13 and new Ivy compatible package format
4
+
5
+ <a name="1.0.2"></a>
6
+ ## [1.0.2](https://github.com/eugenemahota/angular-editor-fix-font-modal/compare/v1.0.1...v1.0.2) (2019-11-28) Technical release
7
+ * Readme update for npmjs.com
8
+
9
+ <a name="1.0.1"></a>
10
+ ## [1.0.1](https://github.com/eugenemahota/angular-editor-fix-font-modal/compare/v1.0.0...v1.0.1) (2019-11-27) Technical release
11
+ * Fix logo at npmjs.com readme
12
+
13
+ <a name="1.0.0"></a>
14
+ ## [1.0.0](https://github.com/eugenemahota/angular-editor-fix-font-modal/compare/v1.0.0-rc.2...v1.0.0) (2019-11-27) Initial release
15
+
package/README.md ADDED
@@ -0,0 +1,265 @@
1
+ <p align="center">
2
+ <img width="150px" src="https://raw.githubusercontent.com/eugenemahota/angular-editor-fix-font-modal/master/docs/angular-editor-logo.png?raw=true" alt="AngularEditor logo"/>
3
+ </p>
4
+
5
+ # AngularEditor
6
+ [![npm version](https://badge.fury.io/js/%40kolkov%2Fangular-editor.svg)](https://badge.fury.io/js/%40kolkov%2Fangular-editor)
7
+ [![demo](https://img.shields.io/badge/demo-StackBlitz-blueviolet.svg)](https://stackblitz.com/edit/angular-editor-wysiwyg)
8
+ [![Build Status](https://travis-ci.com/eugenemahota/angular-editor-fix-font-modal.svg?branch=master)](https://travis-ci.com/eugenemahota/angular-editor-fix-font-modal)
9
+ [![npm](https://img.shields.io/npm/dm/@eugenemahota/angular-editor.svg)](https://www.npmjs.com/package/@eugenemahota/angular-editor)
10
+ [![](https://data.jsdelivr.com/v1/package/npm/@eugenemahota/angular-editor/badge?style=rounded)](https://www.jsdelivr.com/package/npm/@eugenemahota/angular-editor)
11
+ [![Coverage Status](https://coveralls.io/repos/github/eugenemahota/angular-editor-fix-font-modal/badge.svg?branch=master)](https://coveralls.io/github/eugenemahota/angular-editor-fix-font-modal?branch=master)
12
+ [![codecov](https://codecov.io/gh/eugenemahota/angular-editor-fix-font-modal/branch/master/graph/badge.svg)](https://codecov.io/gh/eugenemahota/angular-editor-fix-font-modal)
13
+ [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://paypal.me/AndreyKolkov)
14
+
15
+ A simple native WYSIWYG/Rich Text editor for Angular 6-13+
16
+
17
+ ![Nov-27-2019 17-26-29](https://user-images.githubusercontent.com/216412/69763434-259cd800-113b-11ea-918f-0565ebce0e48.gif)
18
+
19
+
20
+ ## Demo
21
+ [demo](https://angular-editor-wysiwyg.stackblitz.io/) | [See the code in StackBlitz](https://stackblitz.com/edit/angular-editor-wysiwyg).
22
+
23
+ ## Getting Started
24
+
25
+ ### Installation
26
+
27
+ Install via [npm][npm] package manager
28
+
29
+ ```bash
30
+ npm install @eugenemahota/angular-editor --save
31
+ ```
32
+ ### Versions
33
+
34
+ 2.0.0 and above - for Angular v13.0.0 and above
35
+
36
+ 1.0.0 and above - for Angular v8.x.x and above
37
+
38
+ 0.18.4 and above - for Angular v7.x.x
39
+
40
+ 0.15.x - for Angular v6.x.x
41
+
42
+ ### Usage
43
+
44
+ Import `angular-editor` module
45
+
46
+ ```js
47
+ import { HttpClientModule} from '@angular/common/http';
48
+ import { AngularEditorModule } from '@eugenemahota/angular-editor';
49
+
50
+ @NgModule({
51
+ imports: [ HttpClientModule, AngularEditorModule ]
52
+ })
53
+ ```
54
+
55
+ Then in HTML
56
+
57
+ ```html
58
+ <angular-editor [placeholder]="'Enter text here...'" [(ngModel)]="htmlContent"></angular-editor>
59
+ ```
60
+
61
+ or for usage with reactive forms
62
+
63
+ ```html
64
+ <angular-editor formControlName="htmlContent" [config]="editorConfig"></angular-editor>
65
+ ```
66
+
67
+ if you using more than one editor on same page set `id` property
68
+
69
+ ```html
70
+ <angular-editor id="editor1" formControlName="htmlContent1" [config]="editorConfig"></angular-editor>
71
+ <angular-editor id="editor2" formControlName="htmlContent2" [config]="editorConfig"></angular-editor>
72
+ ```
73
+
74
+ where
75
+
76
+ ```js
77
+ import { AngularEditorConfig } from '@eugenemahota/angular-editor';
78
+
79
+
80
+ editorConfig: AngularEditorConfig = {
81
+ editable: true,
82
+ spellcheck: true,
83
+ height: 'auto',
84
+ minHeight: '0',
85
+ maxHeight: 'auto',
86
+ width: 'auto',
87
+ minWidth: '0',
88
+ translate: 'yes',
89
+ enableToolbar: true,
90
+ showToolbar: true,
91
+ placeholder: 'Enter text here...',
92
+ defaultParagraphSeparator: '',
93
+ defaultFontName: '',
94
+ defaultFontSize: '',
95
+ fonts: [
96
+ {class: 'arial', name: 'Arial'},
97
+ {class: 'times-new-roman', name: 'Times New Roman'},
98
+ {class: 'calibri', name: 'Calibri'},
99
+ {class: 'comic-sans-ms', name: 'Comic Sans MS'}
100
+ ],
101
+ customClasses: [
102
+ {
103
+ name: 'quote',
104
+ class: 'quote',
105
+ },
106
+ {
107
+ name: 'redText',
108
+ class: 'redText'
109
+ },
110
+ {
111
+ name: 'titleText',
112
+ class: 'titleText',
113
+ tag: 'h1',
114
+ },
115
+ ],
116
+ uploadUrl: 'v1/image',
117
+ upload: (file: File) => { ... }
118
+ uploadWithCredentials: false,
119
+ sanitize: true,
120
+ toolbarPosition: 'top',
121
+ toolbarHiddenButtons: [
122
+ ['bold', 'italic'],
123
+ ['fontSize']
124
+ ]
125
+ };
126
+ ```
127
+ For `ngModel` to work, you must import `FormsModule` from `@angular/forms`, or for `formControlName`, you must import `ReactiveFormsModule` from `@angular/forms`
128
+
129
+ ## API
130
+ ### Inputs
131
+ | Input | Type | Default | Required | Description |
132
+ | ------------- | ------------- | ------------- | ------------- | ------------- |
133
+ | id | `string` | `-` | no | Id property when multiple editor used on same page |
134
+ | [config] | `AngularEditorConfig` | `default config` | no | config for the editor |
135
+ | placeholder | `string` | `-` | no | Set custom placeholder for input area |
136
+ | tabIndex | `number` | `-` | no | Set Set tabindex on angular-editor |
137
+
138
+ ### Outputs
139
+
140
+ | Output | Description |
141
+ | ------------- | ------------- |
142
+ | (html) | Output html |
143
+ | (viewMode) | Fired when switched visual and html source mode |
144
+ | (blur) | Fired when editor blur |
145
+ | (focus) | Fired when editor focus |
146
+
147
+ ### Methods
148
+ Name | Description |
149
+ | ------------- | ------------- |
150
+ | focus | Focuses the editor element |
151
+
152
+ ### Other
153
+ Name | Type | Description |
154
+ | ------------- | ------------- | ------------- |
155
+ | AngularEditorConfig | configuration | Configuration for the AngularEditor component.|
156
+
157
+ ### Configuration
158
+
159
+ | Input | Type | Default | Required | Description |
160
+ | ------------- | ------------- | ------------- | ------------- | ------------- |
161
+ | editable | `bolean` | `true` | no | Set editing enabled or not |
162
+ | spellcheck | `bolean` | `true` | no | Set spellchecking enabled or not |
163
+ | translate | `string` | `yes` | no | Set translating enabled or not |
164
+ | sanitize | `bolean` | `true` | no | Set DOM sanitizing enabled or not |
165
+ | height | `string` | `auto` | no | Set height of the editor |
166
+ | minHeight | `string` | `0` | no | Set minimum height of the editor |
167
+ | maxHeight | `string` | `auto` | no | Set maximum height of the editor |
168
+ | width | `string` | `auto` | no | Set width of the editor |
169
+ | minWidth | `string` | `0` | no | Set minimum width of the editor |
170
+ | enableToolbar | `bolean` | `true` | no | Set toolbar enabled or not |
171
+ | showToolbar | `bolean` | `true` | no | Set toolbar visible or not |
172
+ | toolbarPosition | `string` | `top` | no | Set toolbar position top or bottom |
173
+ | placeholder | `string` | `-` | no | Set placeholder text |
174
+ | defaultParagraphSeparator | `string` | `-` | no | Set default paragraph separator such as `p` |
175
+ | defaultFontName | `string` | `-` | no | Set default font such as `Comic Sans MS` |
176
+ | defaultFontSize | `string` | `-` | no | Set default font size such as `1` - `7` |
177
+ | uploadUrl | `string` | `-` | no | Set image upload endpoint `https://api.exapple.com/v1/image/upload` and return response with imageUrl key. {"imageUrl" : <url>} |
178
+ | upload | `function` | `-` | no | Set image upload function |
179
+ | uploadWithCredentials | `bolean` | `false` | no | Set passing or not credentials in the image upload call |
180
+ | fonts | `Font[]` | `-` | no | Set array of available fonts `[{name, class},...]` |
181
+ | customClasses | `CustomClass[]` | `-` | no | Set array of available fonts `[{name, class, tag},...]` |
182
+ | outline | `bolean` | `true` | no | Set outline of the editor if in focus |
183
+ | toolbarHiddenButtons | `string[][]` | `-` | no | Set of the array of button names or elements to hide |
184
+
185
+ ```js
186
+ toolbarHiddenButtons: [
187
+ [
188
+ 'undo',
189
+ 'redo',
190
+ 'bold',
191
+ 'italic',
192
+ 'underline',
193
+ 'strikeThrough',
194
+ 'subscript',
195
+ 'superscript',
196
+ 'justifyLeft',
197
+ 'justifyCenter',
198
+ 'justifyRight',
199
+ 'justifyFull',
200
+ 'indent',
201
+ 'outdent',
202
+ 'insertUnorderedList',
203
+ 'insertOrderedList',
204
+ 'heading',
205
+ 'fontName'
206
+ ],
207
+ [
208
+ 'fontSize',
209
+ 'textColor',
210
+ 'backgroundColor',
211
+ 'customClasses',
212
+ 'link',
213
+ 'unlink',
214
+ 'insertImage',
215
+ 'insertVideo',
216
+ 'insertHorizontalRule',
217
+ 'removeFormat',
218
+ 'toggleEditorMode'
219
+ ]
220
+ ]
221
+ ```
222
+
223
+ ## What's included
224
+
225
+ Within the download you'll find the following directories and files. You'll see something like this:
226
+
227
+ ```
228
+ angular-editor/
229
+ └── projects/
230
+ ├── angular-editor/
231
+ └── angular-editor-app/
232
+ ```
233
+ `angular-editor/` - library
234
+
235
+ `angular-editor-app/` - demo application
236
+
237
+ ## Documentation
238
+
239
+ The documentation for the AngularEditor is hosted at our website [AngularEditor](https://angular-editor.kolkov.ru/)
240
+
241
+ ## Contributing
242
+
243
+ Please read through our [contributing guidelines](https://github.com/eugenemahota/angular-editor-fix-font-modal/blob/master/CONTRIBUTING.md). Included are directions for opening issues, coding standards, and notes on development.
244
+
245
+ Editor preferences are available in the [editor config](https://github.com/eugenemahota/angular-editor-fix-font-modal/blob/master/.editorconfig) for easy use in common text editors. Read more and download plugins at <http://editorconfig.org>.
246
+
247
+ ## Versioning
248
+
249
+ For a transparency into our release cycle and in striving to maintain backward compatibility, AngularEditor is maintained under [the Semantic Versioning guidelines](http://semver.org/).
250
+
251
+ See [the Releases section of our project](https://github.com/eugenemahota/angular-editor-fix-font-modal/releases) for changelogs for each release version.
252
+
253
+ ## Creators
254
+
255
+ **Andrey Kolkov**
256
+
257
+ * <https://github.com/kolkov>
258
+
259
+ ## Donate
260
+
261
+ If you like my work and I save your time you can buy me a :beer: or :pizza: [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://paypal.me/AndreyKolkov)
262
+
263
+ [npm]: https://www.npmjs.com/package/@eugenemahota/angular-editor
264
+ [demo]: https://angular-editor-wysiwyg.stackblitz.io/
265
+ [example]: https://stackblitz.com/edit/angular-editor-wysiwyg
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXVnZW5lbWFob3RhLWFuZ3VsYXItZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1lZGl0b3Ivc3JjL2V1Z2VuZW1haG90YS1hbmd1bGFyLWVkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL3B1YmxpYy1hcGknO1xuIl19
@@ -0,0 +1,185 @@
1
+ import { Component, EventEmitter, forwardRef, HostBinding, HostListener, Input, Output, ViewChild, ViewEncapsulation } from '@angular/core';
2
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
+ import { isDefined } from '../utils';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/common";
6
+ export class AeSelectComponent {
7
+ constructor(elRef, r) {
8
+ this.elRef = elRef;
9
+ this.r = r;
10
+ this.options = [];
11
+ this.disabled = false;
12
+ this.optionId = 0;
13
+ this.opened = false;
14
+ this.hidden = 'inline-block';
15
+ // eslint-disable-next-line @angular-eslint/no-output-native, @angular-eslint/no-output-rename
16
+ this.changeEvent = new EventEmitter();
17
+ this.onChange = () => {
18
+ };
19
+ this.onTouched = () => {
20
+ };
21
+ }
22
+ get label() {
23
+ return this.selectedOption && this.selectedOption.hasOwnProperty('label') ? this.selectedOption.label : 'Select';
24
+ }
25
+ get value() {
26
+ return this.selectedOption.value;
27
+ }
28
+ ngOnInit() {
29
+ this.selectedOption = this.options[0];
30
+ if (isDefined(this.isHidden) && this.isHidden) {
31
+ this.hide();
32
+ }
33
+ }
34
+ hide() {
35
+ this.hidden = 'none';
36
+ }
37
+ optionSelect(option, event) {
38
+ event.stopPropagation();
39
+ this.setValue(option.value);
40
+ this.onChange(this.selectedOption.value);
41
+ this.changeEvent.emit(this.selectedOption.value);
42
+ this.onTouched();
43
+ this.opened = false;
44
+ }
45
+ toggleOpen(event) {
46
+ // event.stopPropagation();
47
+ if (this.disabled) {
48
+ return;
49
+ }
50
+ this.opened = !this.opened;
51
+ }
52
+ onClick($event) {
53
+ if (!this.elRef.nativeElement.contains($event.target)) {
54
+ this.close();
55
+ }
56
+ }
57
+ close() {
58
+ this.opened = false;
59
+ }
60
+ get isOpen() {
61
+ return this.opened;
62
+ }
63
+ writeValue(value) {
64
+ if (!value || typeof value !== 'string') {
65
+ return;
66
+ }
67
+ this.setValue(value);
68
+ }
69
+ setValue(value) {
70
+ let index = 0;
71
+ const selectedEl = this.options.find((el, i) => {
72
+ index = i;
73
+ return el.value === value;
74
+ });
75
+ if (selectedEl) {
76
+ this.selectedOption = selectedEl;
77
+ this.optionId = index;
78
+ }
79
+ }
80
+ registerOnChange(fn) {
81
+ this.onChange = fn;
82
+ }
83
+ registerOnTouched(fn) {
84
+ this.onTouched = fn;
85
+ }
86
+ setDisabledState(isDisabled) {
87
+ this.labelButton.nativeElement.disabled = isDisabled;
88
+ const div = this.labelButton.nativeElement;
89
+ const action = isDisabled ? 'addClass' : 'removeClass';
90
+ this.r[action](div, 'disabled');
91
+ this.disabled = isDisabled;
92
+ }
93
+ handleKeyDown($event) {
94
+ if (!this.opened) {
95
+ return;
96
+ }
97
+ // console.log($event.key);
98
+ // if (KeyCode[$event.key]) {
99
+ switch ($event.key) {
100
+ case 'ArrowDown':
101
+ this._handleArrowDown($event);
102
+ break;
103
+ case 'ArrowUp':
104
+ this._handleArrowUp($event);
105
+ break;
106
+ case 'Space':
107
+ this._handleSpace($event);
108
+ break;
109
+ case 'Enter':
110
+ this._handleEnter($event);
111
+ break;
112
+ case 'Tab':
113
+ this._handleTab($event);
114
+ break;
115
+ case 'Escape':
116
+ this.close();
117
+ $event.preventDefault();
118
+ break;
119
+ case 'Backspace':
120
+ this._handleBackspace();
121
+ break;
122
+ }
123
+ // } else if ($event.key && $event.key.length === 1) {
124
+ // this._keyPress$.next($event.key.toLocaleLowerCase());
125
+ // }
126
+ }
127
+ _handleArrowDown($event) {
128
+ if (this.optionId < this.options.length - 1) {
129
+ this.optionId++;
130
+ }
131
+ }
132
+ _handleArrowUp($event) {
133
+ if (this.optionId >= 1) {
134
+ this.optionId--;
135
+ }
136
+ }
137
+ _handleSpace($event) {
138
+ }
139
+ _handleEnter($event) {
140
+ this.optionSelect(this.options[this.optionId], $event);
141
+ }
142
+ _handleTab($event) {
143
+ }
144
+ _handleBackspace() {
145
+ }
146
+ }
147
+ AeSelectComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: AeSelectComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
148
+ AeSelectComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: AeSelectComponent, selector: "ae-select", inputs: { options: "options", isHidden: ["hidden", "isHidden"] }, outputs: { changeEvent: "change" }, host: { listeners: { "document:click": "onClick($event)", "keydown": "handleKeyDown($event)" }, properties: { "style.display": "this.hidden" } }, providers: [
149
+ {
150
+ provide: NG_VALUE_ACCESSOR,
151
+ useExisting: forwardRef(() => AeSelectComponent),
152
+ multi: true,
153
+ }
154
+ ], viewQueries: [{ propertyName: "labelButton", first: true, predicate: ["labelButton"], descendants: true, static: true }], ngImport: i0, template: "<span class=\"ae-font ae-picker\" [ngClass]=\"{'ae-expanded':isOpen}\">\n <button [tabIndex]=\"-1\" #labelButton tabindex=\"0\" type=\"button\" role=\"button\" class=\"ae-picker-label\" (click)=\"toggleOpen($event);\">{{label}}\n <svg viewBox=\"0 0 18 18\">\n <!-- <use x=\"0\" y=\"0\" xlink:href=\"../assets/icons.svg#hom\"></use>-->\n <polygon class=\"ae-stroke\" points=\"7 11 9 13 11 11 7 11\"></polygon>\n <polygon class=\"ae-stroke\" points=\"7 7 9 5 11 7 7 7\"></polygon>\n </svg>\n </button>\n <span class=\"ae-picker-options\">\n <button tabindex=\"-1\" type=\"button\" role=\"button\" class=\"ae-picker-item\"\n *ngFor=\"let item of options; let i = index\"\n [ngClass]=\"{'selected': item.value === value, 'focused': i === optionId}\"\n (click)=\"optionSelect(item, $event)\">\n {{item.label}}\n </button>\n <span class=\"dropdown-item\" *ngIf=\"!options.length\">No items for select</span>\n </span>\n</span>\n", styles: [".ae-font.ae-picker{color:#444;display:inline-block;float:left;width:100%;position:relative;vertical-align:middle}.ae-font .ae-picker-label{cursor:pointer;display:inline-block;height:100%;padding-left:8px;padding-right:10px;position:relative;width:100%;line-height:26px;vertical-align:middle;font-size:85%;text-align:left;background-color:#fff;min-width:2rem;float:left;border:1px solid #ddd;text-overflow:clip;overflow:hidden;white-space:nowrap}.ae-font .ae-picker-label:before{content:\"\";position:absolute;right:0;top:0;width:20px;height:100%;background:linear-gradient(to right,white,#ffffff 100%)}.ae-font .ae-picker-label:focus{outline:none}.ae-font .ae-picker-label:hover{cursor:pointer;background-color:#f1f1f1;transition:.2s ease}.ae-font .ae-picker-label:hover:before{background:linear-gradient(to right,#f5f5f5 100%,#ffffff 100%)}.ae-font .ae-picker-label:disabled{background-color:#f5f5f5;pointer-events:none;cursor:not-allowed}.ae-font .ae-picker-label:disabled:before{background:linear-gradient(to right,#f5f5f5 100%,#ffffff 100%)}.ae-font .ae-picker-label svg{position:absolute;margin-top:-9px;right:0;top:50%;width:18px}.ae-font .ae-picker-label svg:not(:root){overflow:hidden}.ae-font .ae-picker-label svg .ae-stroke{fill:none;stroke:#444;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.ae-font .ae-picker-options{background-color:#fff;display:none;min-width:100%;position:absolute;white-space:nowrap;z-index:3;border:1px solid transparent;box-shadow:#0003 0 2px 8px}.ae-font .ae-picker-options .ae-picker-item{cursor:pointer;display:block;padding-bottom:5px;padding-top:5px;padding-left:5px;z-index:3;text-align:left;background-color:transparent;min-width:2rem;width:100%;border:0 solid #ddd}.ae-font .ae-picker-options .ae-picker-item.selected{color:#06c;background-color:#fff4c2}.ae-font .ae-picker-options .ae-picker-item.focused,.ae-font .ae-picker-options .ae-picker-item:hover{background-color:#fffa98}.ae-font.ae-expanded{display:block;margin-top:-1px;z-index:1}.ae-font.ae-expanded .ae-picker-label{color:#ccc;z-index:2}.ae-font.ae-expanded .ae-picker-label svg{color:#ccc;z-index:2}.ae-font.ae-expanded .ae-picker-label svg .ae-stroke{stroke:#ccc}.ae-font.ae-expanded .ae-picker-options{display:block;margin-top:-1px;top:100%;z-index:3;border-color:#ccc}\n"], directives: [{ type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], encapsulation: i0.ViewEncapsulation.None });
155
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: AeSelectComponent, decorators: [{
156
+ type: Component,
157
+ args: [{ selector: 'ae-select', encapsulation: ViewEncapsulation.None, providers: [
158
+ {
159
+ provide: NG_VALUE_ACCESSOR,
160
+ useExisting: forwardRef(() => AeSelectComponent),
161
+ multi: true,
162
+ }
163
+ ], template: "<span class=\"ae-font ae-picker\" [ngClass]=\"{'ae-expanded':isOpen}\">\n <button [tabIndex]=\"-1\" #labelButton tabindex=\"0\" type=\"button\" role=\"button\" class=\"ae-picker-label\" (click)=\"toggleOpen($event);\">{{label}}\n <svg viewBox=\"0 0 18 18\">\n <!-- <use x=\"0\" y=\"0\" xlink:href=\"../assets/icons.svg#hom\"></use>-->\n <polygon class=\"ae-stroke\" points=\"7 11 9 13 11 11 7 11\"></polygon>\n <polygon class=\"ae-stroke\" points=\"7 7 9 5 11 7 7 7\"></polygon>\n </svg>\n </button>\n <span class=\"ae-picker-options\">\n <button tabindex=\"-1\" type=\"button\" role=\"button\" class=\"ae-picker-item\"\n *ngFor=\"let item of options; let i = index\"\n [ngClass]=\"{'selected': item.value === value, 'focused': i === optionId}\"\n (click)=\"optionSelect(item, $event)\">\n {{item.label}}\n </button>\n <span class=\"dropdown-item\" *ngIf=\"!options.length\">No items for select</span>\n </span>\n</span>\n", styles: [".ae-font.ae-picker{color:#444;display:inline-block;float:left;width:100%;position:relative;vertical-align:middle}.ae-font .ae-picker-label{cursor:pointer;display:inline-block;height:100%;padding-left:8px;padding-right:10px;position:relative;width:100%;line-height:26px;vertical-align:middle;font-size:85%;text-align:left;background-color:#fff;min-width:2rem;float:left;border:1px solid #ddd;text-overflow:clip;overflow:hidden;white-space:nowrap}.ae-font .ae-picker-label:before{content:\"\";position:absolute;right:0;top:0;width:20px;height:100%;background:linear-gradient(to right,white,#ffffff 100%)}.ae-font .ae-picker-label:focus{outline:none}.ae-font .ae-picker-label:hover{cursor:pointer;background-color:#f1f1f1;transition:.2s ease}.ae-font .ae-picker-label:hover:before{background:linear-gradient(to right,#f5f5f5 100%,#ffffff 100%)}.ae-font .ae-picker-label:disabled{background-color:#f5f5f5;pointer-events:none;cursor:not-allowed}.ae-font .ae-picker-label:disabled:before{background:linear-gradient(to right,#f5f5f5 100%,#ffffff 100%)}.ae-font .ae-picker-label svg{position:absolute;margin-top:-9px;right:0;top:50%;width:18px}.ae-font .ae-picker-label svg:not(:root){overflow:hidden}.ae-font .ae-picker-label svg .ae-stroke{fill:none;stroke:#444;stroke-linecap:round;stroke-linejoin:round;stroke-width:2}.ae-font .ae-picker-options{background-color:#fff;display:none;min-width:100%;position:absolute;white-space:nowrap;z-index:3;border:1px solid transparent;box-shadow:#0003 0 2px 8px}.ae-font .ae-picker-options .ae-picker-item{cursor:pointer;display:block;padding-bottom:5px;padding-top:5px;padding-left:5px;z-index:3;text-align:left;background-color:transparent;min-width:2rem;width:100%;border:0 solid #ddd}.ae-font .ae-picker-options .ae-picker-item.selected{color:#06c;background-color:#fff4c2}.ae-font .ae-picker-options .ae-picker-item.focused,.ae-font .ae-picker-options .ae-picker-item:hover{background-color:#fffa98}.ae-font.ae-expanded{display:block;margin-top:-1px;z-index:1}.ae-font.ae-expanded .ae-picker-label{color:#ccc;z-index:2}.ae-font.ae-expanded .ae-picker-label svg{color:#ccc;z-index:2}.ae-font.ae-expanded .ae-picker-label svg .ae-stroke{stroke:#ccc}.ae-font.ae-expanded .ae-picker-options{display:block;margin-top:-1px;top:100%;z-index:3;border-color:#ccc}\n"] }]
164
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }]; }, propDecorators: { options: [{
165
+ type: Input
166
+ }], isHidden: [{
167
+ type: Input,
168
+ args: ['hidden']
169
+ }], hidden: [{
170
+ type: HostBinding,
171
+ args: ['style.display']
172
+ }], changeEvent: [{
173
+ type: Output,
174
+ args: ['change']
175
+ }], labelButton: [{
176
+ type: ViewChild,
177
+ args: ['labelButton', { static: true }]
178
+ }], onClick: [{
179
+ type: HostListener,
180
+ args: ['document:click', ['$event']]
181
+ }], handleKeyDown: [{
182
+ type: HostListener,
183
+ args: ['keydown', ['$event']]
184
+ }] } });
185
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWUtc2VsZWN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItZWRpdG9yL3NyYy9saWIvYWUtc2VsZWN0L2FlLXNlbGVjdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWVkaXRvci9zcmMvbGliL2FlLXNlbGVjdC9hZS1zZWxlY3QuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osVUFBVSxFQUFFLFdBQVcsRUFDdkIsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEVBRU4sU0FBUyxFQUNULGlCQUFpQixFQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXVCLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFVBQVUsQ0FBQzs7O0FBb0JuQyxNQUFNLE9BQU8saUJBQWlCO0lBMEI1QixZQUFvQixLQUFpQixFQUNqQixDQUFZO1FBRFosVUFBSyxHQUFMLEtBQUssQ0FBWTtRQUNqQixNQUFDLEdBQUQsQ0FBQyxDQUFXO1FBMUJ2QixZQUFPLEdBQW1CLEVBQUUsQ0FBQztRQUt0QyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLGFBQVEsR0FBRyxDQUFDLENBQUM7UUFNYixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBTWUsV0FBTSxHQUFHLGNBQWMsQ0FBQztRQUV0RCw4RkFBOEY7UUFDNUUsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBc0VuRCxhQUFRLEdBQVEsR0FBRyxFQUFFO1FBQ3JCLENBQUMsQ0FBQTtRQUNELGNBQVMsR0FBUSxHQUFHLEVBQUU7UUFDdEIsQ0FBQyxDQUFBO0lBbkVFLENBQUM7SUFuQkosSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsY0FBYyxJQUFJ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Vzt1QkFBQyxlQUFlO2dCQUdWLFdBQVc7c0JBQTVCLE1BQU07dUJBQUMsUUFBUTtnQkFFMEIsV0FBVztzQkFBcEQsU0FBUzt1QkFBQyxhQUFhLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDO2dCQW1DeEMsT0FBTztzQkFETixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQXdEMUMsYUFBYTtzQkFEWixZQUFZO3VCQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEF0dHJpYnV0ZSxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUmVuZGVyZXIyLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7aXNEZWZpbmVkfSBmcm9tICcuLi91dGlscyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0T3B0aW9uIHtcbiAgbGFiZWw6IHN0cmluZztcbiAgdmFsdWU6IHN0cmluZztcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWUtc2VsZWN0JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FlLXNlbGVjdC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FlLXNlbGVjdC5jb21wb25lbnQuc2NzcyddLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFlU2VsZWN0Q29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBBZVNlbGVjdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBASW5wdXQoKSBvcHRpb25zOiBTZWxlY3RPcHRpb25bXSA9IFtdO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLWlucHV0LXJlbmFtZVxuICBASW5wdXQoJ2hpZGRlbicpIGlzSGlkZGVuOiBib29sZWFuO1xuXG4gIHNlbGVjdGVkT3B0aW9uOiBTZWxlY3RPcHRpb247XG4gIGRpc2FibGVkID0gZmFsc2U7XG4gIG9wdGlvbklkID0gMDtcblxuICBnZXQgbGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZE9wdGlvbiAmJiB0aGlzLnNlbGVjdGVkT3B0aW9uLmhhc093blByb3BlcnR5KCdsYWJlbCcpID8gdGhpcy5zZWxlY3RlZE9wdGlvbi5sYWJlbCA6ICdTZWxlY3QnO1xuICB9XG5cbiAgb3BlbmVkID0gZmFsc2U7XG5cbiAgZ2V0IHZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRPcHRpb24udmFsdWU7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLmRpc3BsYXknKSBoaWRkZW4gPSAnaW5saW5lLWJsb2NrJztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L25vLW91dHB1dC1uYXRpdmUsIEBhbmd1bGFyLWVzbGludC9uby1vdXRwdXQtcmVuYW1lXG4gIEBPdXRwdXQoJ2NoYW5nZScpIGNoYW5nZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBWaWV3Q2hpbGQoJ2xhYmVsQnV0dG9uJywge3N0YXRpYzogdHJ1ZX0pIGxhYmVsQnV0dG9uOiBFbGVtZW50UmVmO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgIHByaXZhdGUgcjogUmVuZGVyZXIyLFxuICApIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zZWxlY3RlZE9wdGlvbiA9IHRoaXMub3B0aW9uc1swXTtcbiAgICBpZiAoaXNEZWZpbmVkKHRoaXMuaXNIaWRkZW4pICYmIHRoaXMuaXNIaWRkZW4pIHtcbiAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH1cbiAgfVxuXG4gIGhpZGUoKSB7XG4gICAgdGhpcy5oaWRkZW4gPSAnbm9uZSc7XG4gIH1cblxuICBvcHRpb25TZWxlY3Qob3B0aW9uOiBTZWxlY3RPcHRpb24sIGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5zZXRWYWx1ZShvcHRpb24udmFsdWUpO1xuICAgIHRoaXMub25DaGFuZ2UodGhpcy5zZWxlY3RlZE9wdGlvbi52YWx1ZSk7XG4gICAgdGhpcy5jaGFuZ2VFdmVudC5lbWl0KHRoaXMuc2VsZWN0ZWRPcHRpb24udmFsdWUpO1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpcy5vcGVuZWQgPSBmYWxzZTtcbiAgfVxuXG4gIHRvZ2dsZU9wZW4oZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICAvLyBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9wZW5lZCA9ICF0aGlzLm9wZW5lZDtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25DbGljaygkZXZlbnQ6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAoIXRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5jb250YWlucygkZXZlbnQudGFyZ2V0KSkge1xuICAgICAgdGhpcy5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlKCkge1xuICAgIHRoaXMub3BlbmVkID0gZmFsc2U7XG4gIH1cblxuICBnZXQgaXNPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm9wZW5lZDtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWUpIHtcbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zZXRWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBzZXRWYWx1ZSh2YWx1ZSkge1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbCA9IHRoaXMub3B0aW9ucy5maW5kKChlbCwgaSkgPT4ge1xuICAgICAgaW5kZXggPSBpO1xuICAgICAgcmV0dXJuIGVsLnZhbHVlID09PSB2YWx1ZTtcbiAgICB9KTtcbiAgICBpZiAoc2VsZWN0ZWRFbCkge1xuICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbiA9IHNlbGVjdGVkRWw7XG4gICAgICB0aGlzLm9wdGlvbklkID0gaW5kZXg7XG4gICAgfVxuICB9XG5cbiAgb25DaGFuZ2U6IGFueSA9ICgpID0+IHtcbiAgfVxuICBvblRvdWNoZWQ6IGFueSA9ICgpID0+IHtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm4pIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbikge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmxhYmVsQnV0dG9uLm5hdGl2ZUVsZW1lbnQuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIGNvbnN0IGRpdiA9IHRoaXMubGFiZWxCdXR0b24ubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBhY3Rpb24gPSBpc0Rpc2FibGVkID8gJ2FkZENsYXNzJyA6ICdyZW1vdmVDbGFzcyc7XG4gICAgdGhpcy5yW2FjdGlvbl0oZGl2LCAnZGlzYWJsZWQnKTtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICBoYW5kbGVLZXlEb3duKCRldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmICghdGhpcy5vcGVuZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gY29uc29sZS5sb2coJGV2ZW50LmtleSk7XG4gICAgLy8gaWYgKEtleUNvZGVbJGV2ZW50LmtleV0pIHtcbiAgICBzd2l0Y2ggKCRldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93RG93bic6XG4gICAgICAgIHRoaXMuX2hhbmRsZUFycm93RG93bigkZXZlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93VXAnOlxuICAgICAgICB0aGlzLl9oYW5kbGVBcnJvd1VwKCRldmVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnU3BhY2UnOlxuICAgICAgICB0aGlzLl9oYW5kbGVTcGFjZSgkZXZlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgdGhpcy5faGFuZGxlRW50ZXIoJGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdUYWInOlxuICAgICAgICB0aGlzLl9oYW5kbGVUYWIoJGV2ZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0JhY2tzcGFjZSc6XG4gICAgICAgIHRoaXMuX2hhbmRsZUJhY2tzcGFjZSgpO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgLy8gfSBlbHNlIGlmICgkZXZlbnQua2V5ICYmICRldmVudC5rZXkubGVuZ3RoID09PSAxKSB7XG4gICAgLy8gdGhpcy5fa2V5UHJlc3MkLm5leHQoJGV2ZW50LmtleS50b0xvY2FsZUxvd2VyQ2FzZSgpKTtcbiAgICAvLyB9XG4gIH1cblxuICBfaGFuZGxlQXJyb3dEb3duKCRldmVudCkge1xuICAgIGlmICh0aGlzLm9wdGlvbklkIDwgdGhpcy5vcHRpb25zLmxlbmd0aCAtIDEpIHtcbiAgICAgIHRoaXMub3B0aW9uSWQrKztcbiAgICB9XG4gIH1cblxuICBfaGFuZGxlQXJyb3dVcCgkZXZlbnQpIHtcbiAgICBpZiAodGhpcy5vcHRpb25JZCA+PSAxKSB7XG4gICAgICB0aGlzLm9wdGlvbklkLS07XG4gICAgfVxuICB9XG5cbiAgX2hhbmRsZVNwYWNlKCRldmVudCkge1xuXG4gIH1cblxuICBfaGFuZGxlRW50ZXIoJGV2ZW50KSB7XG4gICAgdGhpcy5vcHRpb25TZWxlY3QodGhpcy5vcHRpb25zW3RoaXMub3B0aW9uSWRdLCAkZXZlbnQpO1xuICB9XG5cbiAgX2hhbmRsZVRhYigkZXZlbnQpIHtcblxuICB9XG5cbiAgX2hhbmRsZUJhY2tzcGFjZSgpIHtcblxuICB9XG59XG4iLCI8c3BhbiBjbGFzcz1cImFlLWZvbnQgYWUtcGlja2VyXCIgW25nQ2xhc3NdPVwieydhZS1leHBhbmRlZCc6aXNPcGVufVwiPlxuICA8YnV0dG9uIFt0YWJJbmRleF09XCItMVwiICNsYWJlbEJ1dHRvbiB0YWJpbmRleD1cIjBcIiB0eXBlPVwiYnV0dG9uXCIgcm9sZT1cImJ1dHRvblwiIGNsYXNzPVwiYWUtcGlja2VyLWxhYmVsXCIgKGNsaWNrKT1cInRvZ2dsZU9wZW4oJGV2ZW50KTtcIj57e2xhYmVsfX1cbiAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgMTggMThcIj5cbiAgICAgPCEtLSA8dXNlIHg9XCIwXCIgeT1cIjBcIiB4bGluazpocmVmPVwiLi4vYXNzZXRzL2ljb25zLnN2ZyNob21cIj48L3VzZT4tLT5cbiAgICAgIDxwb2x5Z29uIGNsYXNzPVwiYWUtc3Ryb2tlXCIgcG9pbnRzPVwiNyAxMSA5IDEzIDExIDExIDcgMTFcIj48L3BvbHlnb24+XG4gICAgICA8cG9seWdvbiBjbGFzcz1cImFlLXN0cm9rZVwiIHBvaW50cz1cIjcgNyA5IDUgMTEgNyA3IDdcIj48L3BvbHlnb24+XG4gICAgPC9zdmc+XG4gIDwvYnV0dG9uPlxuICA8c3BhbiBjbGFzcz1cImFlLXBpY2tlci1vcHRpb25zXCI+XG4gICAgPGJ1dHRvbiB0YWJpbmRleD1cIi0xXCIgdHlwZT1cImJ1dHRvblwiIHJvbGU9XCJidXR0b25cIiBjbGFzcz1cImFlLXBpY2tlci1pdGVtXCJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgaXRlbSBvZiBvcHRpb25zOyBsZXQgaSA9IGluZGV4XCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7J3NlbGVjdGVkJzogaXRlbS52YWx1ZSA9PT0gdmFsdWUsICdmb2N1c2VkJzogaSA9PT0gb3B0aW9uSWR9XCJcbiAgICAgICAgICAoY2xpY2spPVwib3B0aW9uU2VsZWN0KGl0ZW0sICRldmVudClcIj5cbiAgICAgICAgICB7e2l0ZW0ubGFiZWx9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxzcGFuIGNsYXNzPVwiZHJvcGRvd24taXRlbVwiICpuZ0lmPVwiIW9wdGlvbnMubGVuZ3RoXCI+Tm8gaXRlbXMgZm9yIHNlbGVjdDwvc3Bhbj5cbiAgPC9zcGFuPlxuPC9zcGFuPlxuIl19