@pecb-ui/components 1.1.2 → 1.2.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.
Files changed (56) hide show
  1. package/README.md +556 -556
  2. package/fesm2022/pecb-ui-components.mjs +3826 -1945
  3. package/fesm2022/pecb-ui-components.mjs.map +1 -1
  4. package/index.d.ts +3937 -3
  5. package/package.json +6 -8
  6. package/esm2022/lib/components/button/button.component.mjs +0 -171
  7. package/esm2022/lib/components/card/card.component.mjs +0 -182
  8. package/esm2022/lib/components/checkbox/checkbox.component.mjs +0 -126
  9. package/esm2022/lib/components/datepicker/datepicker.component.mjs +0 -349
  10. package/esm2022/lib/components/dropdown/dropdown.component.mjs +0 -329
  11. package/esm2022/lib/components/input/input.component.mjs +0 -321
  12. package/esm2022/lib/components/pagination/pagination.component.mjs +0 -197
  13. package/esm2022/lib/components/radio/radio.component.mjs +0 -147
  14. package/esm2022/lib/components/right-modal/right-modal.component.mjs +0 -234
  15. package/esm2022/lib/components/sidebar/sidebar.component.mjs +0 -155
  16. package/esm2022/lib/components/status/status.component.mjs +0 -50
  17. package/esm2022/lib/components/tab/tab.component.mjs +0 -151
  18. package/esm2022/lib/components/table/table.component.mjs +0 -503
  19. package/esm2022/lib/components/toggle/toggle.component.mjs +0 -126
  20. package/esm2022/lib/pecb-components.module.mjs +0 -118
  21. package/esm2022/lib/services/loading.service.mjs +0 -182
  22. package/esm2022/lib/services/notification.service.mjs +0 -144
  23. package/esm2022/lib/services/theme.service.mjs +0 -232
  24. package/esm2022/lib/shared/interfaces/component.interfaces.mjs +0 -2
  25. package/esm2022/lib/shared/types/common.types.mjs +0 -6
  26. package/esm2022/lib/shared/utils/accessibility.utils.mjs +0 -223
  27. package/esm2022/lib/shared/utils/dom.utils.mjs +0 -240
  28. package/esm2022/lib/shared/utils/error.utils.mjs +0 -277
  29. package/esm2022/lib/shared/utils/string.utils.mjs +0 -204
  30. package/esm2022/pecb-ui-components.mjs +0 -5
  31. package/esm2022/public-api.mjs +0 -53
  32. package/lib/components/button/button.component.d.ts +0 -130
  33. package/lib/components/card/card.component.d.ts +0 -140
  34. package/lib/components/checkbox/checkbox.component.d.ts +0 -74
  35. package/lib/components/datepicker/datepicker.component.d.ts +0 -155
  36. package/lib/components/dropdown/dropdown.component.d.ts +0 -144
  37. package/lib/components/input/input.component.d.ts +0 -215
  38. package/lib/components/pagination/pagination.component.d.ts +0 -53
  39. package/lib/components/radio/radio.component.d.ts +0 -93
  40. package/lib/components/right-modal/right-modal.component.d.ts +0 -137
  41. package/lib/components/sidebar/sidebar.component.d.ts +0 -97
  42. package/lib/components/status/status.component.d.ts +0 -19
  43. package/lib/components/tab/tab.component.d.ts +0 -102
  44. package/lib/components/table/table.component.d.ts +0 -403
  45. package/lib/components/toggle/toggle.component.d.ts +0 -74
  46. package/lib/pecb-components.module.d.ts +0 -37
  47. package/lib/services/loading.service.d.ts +0 -129
  48. package/lib/services/notification.service.d.ts +0 -136
  49. package/lib/services/theme.service.d.ts +0 -142
  50. package/lib/shared/interfaces/component.interfaces.d.ts +0 -283
  51. package/lib/shared/types/common.types.d.ts +0 -86
  52. package/lib/shared/utils/accessibility.utils.d.ts +0 -167
  53. package/lib/shared/utils/dom.utils.d.ts +0 -108
  54. package/lib/shared/utils/error.utils.d.ts +0 -191
  55. package/lib/shared/utils/string.utils.d.ts +0 -144
  56. package/public-api.d.ts +0 -24
@@ -1,321 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, forwardRef, ViewChild } from '@angular/core';
2
- import { CommonModule } from '@angular/common';
3
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
4
- import { generateUniqueId } from '../../shared/utils/dom.utils';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/platform-browser";
7
- import * as i2 from "@angular/common";
8
- /**
9
- * A professional input component with floating label and multiple types.
10
- * Fully accessible with WCAG 2.1 AA compliance and reactive forms support.
11
- *
12
- * @example
13
- * ```html
14
- * <pecb-input
15
- * label="Email"
16
- * type="email"
17
- * placeholder="Enter your email"
18
- * [(ngModel)]="email"
19
- * ></pecb-input>
20
- *
21
- * <!-- With predefined icon -->
22
- * <pecb-input
23
- * label="Email"
24
- * type="email"
25
- * icon="email"
26
- * iconPosition="left"
27
- * ></pecb-input>
28
- *
29
- * <!-- With custom SVG icon -->
30
- * <pecb-input
31
- * label="Phone"
32
- * type="tel"
33
- * [icon]="'<svg>...</svg>'"
34
- * iconPosition="left"
35
- * ></pecb-input>
36
- *
37
- * <!-- With error state -->
38
- * <pecb-input
39
- * label="Password"
40
- * type="password"
41
- * [error]="true"
42
- * errorMessage="Password is required"
43
- * ></pecb-input>
44
- * ```
45
- *
46
- * @publicApi
47
- */
48
- export class InputComponent {
49
- constructor(cdr, sanitizer) {
50
- this.cdr = cdr;
51
- this.sanitizer = sanitizer;
52
- /**
53
- * Unique ID for the input element
54
- */
55
- this.id = generateUniqueId('input');
56
- /**
57
- * Input type
58
- */
59
- this.type = 'text';
60
- /**
61
- * Placeholder text (shown when label is not present)
62
- */
63
- this.placeholder = '';
64
- /**
65
- * The size of the input
66
- */
67
- this.size = 'md';
68
- /**
69
- * Whether the field is required
70
- */
71
- this.required = false;
72
- /**
73
- * Whether the input is disabled
74
- */
75
- this.disabled = false;
76
- /**
77
- * Whether the input is readonly
78
- */
79
- this.readonly = false;
80
- /**
81
- * Whether to show error state
82
- */
83
- this.error = false;
84
- /**
85
- * Icon position (left or right)
86
- */
87
- this.iconPosition = 'left';
88
- /**
89
- * Whether to show clear button
90
- */
91
- this.clearable = false;
92
- /**
93
- * Event emitted when value changes
94
- */
95
- this.valueChange = new EventEmitter();
96
- /**
97
- * Event emitted on blur
98
- */
99
- this.blurred = new EventEmitter();
100
- /**
101
- * Event emitted on focus
102
- */
103
- this.focused = new EventEmitter();
104
- /**
105
- * Event emitted when clear button is clicked
106
- */
107
- this.cleared = new EventEmitter();
108
- // Internal state
109
- this.value = '';
110
- this.isFocused = false;
111
- this.showPassword = false;
112
- // ControlValueAccessor
113
- this.onChange = () => { };
114
- this.onTouched = () => { };
115
- }
116
- /**
117
- * Get CSS classes for the input wrapper
118
- */
119
- get wrapperClasses() {
120
- return [
121
- 'pecb-input',
122
- `pecb-input--${this.size}`,
123
- this.disabled ? 'pecb-input--disabled' : '',
124
- this.error ? 'pecb-input--error' : '',
125
- this.readonly ? 'pecb-input--readonly' : '',
126
- this.isFocused ? 'pecb-input--focused' : '',
127
- this.value ? 'pecb-input--has-value' : ''
128
- ].filter(Boolean);
129
- }
130
- /**
131
- * Get the actual input type (handles password visibility toggle)
132
- */
133
- get inputType() {
134
- if (this.type === 'password' && this.showPassword) {
135
- return 'text';
136
- }
137
- return this.type;
138
- }
139
- /**
140
- * Check if clear button should be shown
141
- */
142
- get showClearButton() {
143
- return this.clearable && !!this.value && !this.disabled && !this.readonly;
144
- }
145
- /**
146
- * Check if password toggle should be shown
147
- */
148
- get showPasswordToggle() {
149
- return this.type === 'password' && !!this.value && !this.disabled && !this.readonly;
150
- }
151
- /**
152
- * Get computed left icon
153
- */
154
- get computedLeftIcon() {
155
- // New API takes precedence
156
- if (this.icon && this.iconPosition === 'left') {
157
- return this.icon;
158
- }
159
- // Fallback to old API
160
- return this.leftIcon;
161
- }
162
- /**
163
- * Get computed right icon
164
- */
165
- get computedRightIcon() {
166
- // New API takes precedence
167
- if (this.icon && this.iconPosition === 'right') {
168
- return this.icon;
169
- }
170
- // Fallback to old API
171
- return this.rightIcon;
172
- }
173
- /**
174
- * Handle input change
175
- */
176
- onInput(event) {
177
- const target = event.target;
178
- this.value = target.value;
179
- this.onChange(this.value);
180
- this.valueChange.emit(this.value);
181
- this.cdr.markForCheck();
182
- }
183
- /**
184
- * Handle focus event
185
- */
186
- onFocus() {
187
- this.isFocused = true;
188
- this.focused.emit();
189
- this.cdr.markForCheck();
190
- }
191
- /**
192
- * Handle blur event
193
- */
194
- onBlur() {
195
- this.isFocused = false;
196
- this.onTouched();
197
- this.blurred.emit();
198
- this.cdr.markForCheck();
199
- }
200
- /**
201
- * Clear input value
202
- */
203
- clearValue(event) {
204
- event.stopPropagation();
205
- this.value = '';
206
- this.onChange(this.value);
207
- this.valueChange.emit(this.value);
208
- this.cleared.emit();
209
- this.inputElement?.nativeElement.focus();
210
- this.cdr.markForCheck();
211
- }
212
- /**
213
- * Toggle password visibility
214
- */
215
- togglePasswordVisibility(event) {
216
- event.stopPropagation();
217
- this.showPassword = !this.showPassword;
218
- this.cdr.markForCheck();
219
- }
220
- /**
221
- * Focus the input
222
- */
223
- focus() {
224
- this.inputElement?.nativeElement.focus();
225
- }
226
- /**
227
- * Sanitize custom icon HTML/SVG
228
- */
229
- sanitizeIcon(icon) {
230
- if (!icon)
231
- return '';
232
- return this.sanitizer.bypassSecurityTrustHtml(icon);
233
- }
234
- // ControlValueAccessor implementation
235
- writeValue(value) {
236
- this.value = value || '';
237
- this.cdr.markForCheck();
238
- }
239
- registerOnChange(fn) {
240
- this.onChange = fn;
241
- }
242
- registerOnTouched(fn) {
243
- this.onTouched = fn;
244
- }
245
- setDisabledState(isDisabled) {
246
- this.disabled = isDisabled;
247
- this.cdr.markForCheck();
248
- }
249
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InputComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component }); }
250
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: InputComponent, isStandalone: true, selector: "pecb-input", inputs: { id: "id", type: "type", label: "label", placeholder: "placeholder", size: "size", required: "required", disabled: "disabled", readonly: "readonly", error: "error", errorMessage: "errorMessage", helperText: "helperText", icon: "icon", iconPosition: "iconPosition", leftIcon: "leftIcon", rightIcon: "rightIcon", clearable: "clearable", maxLength: "maxLength", min: "min", max: "max", step: "step", autocomplete: "autocomplete" }, outputs: { valueChange: "valueChange", blurred: "blurred", focused: "focused", cleared: "cleared" }, providers: [
251
- {
252
- provide: NG_VALUE_ACCESSOR,
253
- useExisting: forwardRef(() => InputComponent),
254
- multi: true
255
- }
256
- ], viewQueries: [{ propertyName: "inputElement", first: true, predicate: ["inputElement"], descendants: true }], ngImport: i0, template: "<div [class]=\"wrapperClasses.join(' ')\">\r\n <!-- Input Wrapper -->\r\n <div class=\"pecb-input__wrapper\">\r\n <!-- Left Icon -->\r\n <span\r\n *ngIf=\"computedLeftIcon\"\r\n class=\"pecb-input__icon pecb-input__icon--left\"\r\n aria-hidden=\"true\"\r\n >\r\n <ng-container [ngSwitch]=\"computedLeftIcon\">\r\n <svg *ngSwitchCase=\"'email'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M2 3H14C14.55 3 15 3.45 15 4V12C15 12.55 14.55 13 14 13H2C1.45 13 1 12.55 1 12V4C1 3.45 1.45 3 2 3ZM8 8.5L2.5 5V11.5H13.5V5L8 8.5ZM8 7L13.5 3.5H2.5L8 7Z\"/>\r\n </svg>\r\n <svg *ngSwitchCase=\"'search'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z\"/>\r\n </svg>\r\n <svg *ngSwitchCase=\"'user'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 8C10.21 8 12 6.21 12 4C12 1.79 10.21 0 8 0C5.79 0 4 1.79 4 4C4 6.21 5.79 8 8 8ZM8 10C5.33 10 0 11.34 0 14V16H16V14C16 11.34 10.67 10 8 10Z\"/>\r\n </svg>\r\n <span *ngSwitchDefault [innerHTML]=\"sanitizeIcon(computedLeftIcon)\"></span>\r\n </ng-container>\r\n </span>\r\n\r\n <!-- Input -->\r\n <input\r\n #inputElement\r\n [id]=\"id\"\r\n [type]=\"inputType\"\r\n class=\"pecb-input__field\"\r\n [value]=\"value\"\r\n [disabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n [required]=\"required\"\r\n [attr.maxlength]=\"maxLength\"\r\n [attr.min]=\"min\"\r\n [attr.max]=\"max\"\r\n [attr.step]=\"step\"\r\n [attr.autocomplete]=\"autocomplete\"\r\n [attr.aria-label]=\"label || placeholder\"\r\n [attr.aria-required]=\"required\"\r\n [attr.aria-invalid]=\"error\"\r\n [attr.aria-describedby]=\"helperText || errorMessage ? id + '-description' : null\"\r\n (input)=\"onInput($event)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n />\r\n\r\n <!-- Floating Label -->\r\n <label\r\n *ngIf=\"label\"\r\n [attr.for]=\"id\"\r\n class=\"pecb-input__label\"\r\n >\r\n {{ label }}<span *ngIf=\"required\" class=\"pecb-input__required\">*</span>\r\n </label>\r\n\r\n <!-- Clear Button -->\r\n <button\r\n *ngIf=\"showClearButton\"\r\n type=\"button\"\r\n class=\"pecb-input__icon pecb-input__icon--clear\"\r\n [attr.aria-label]=\"'Clear input'\"\r\n (click)=\"clearValue($event)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 0C3.6 0 0 3.6 0 8C0 12.4 3.6 16 8 16C12.4 16 16 12.4 16 8C16 3.6 12.4 0 8 0ZM11.5 10.1L10.1 11.5L8 9.4L5.9 11.5L4.5 10.1L6.6 8L4.5 5.9L5.9 4.5L8 6.6L10.1 4.5L11.5 5.9L9.4 8L11.5 10.1Z\"/>\r\n </svg>\r\n </button>\r\n\r\n <!-- Password Toggle -->\r\n <button\r\n *ngIf=\"showPasswordToggle\"\r\n type=\"button\"\r\n class=\"pecb-input__icon pecb-input__icon--password\"\r\n [attr.aria-label]=\"showPassword ? 'Hide password' : 'Show password'\"\r\n (click)=\"togglePasswordVisibility($event)\"\r\n >\r\n <svg *ngIf=\"!showPassword\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 3C4.5 3 1.5 5.5 0 8C1.5 10.5 4.5 13 8 13C11.5 13 14.5 10.5 16 8C14.5 5.5 11.5 3 8 3ZM8 11C6.34 11 5 9.66 5 8C5 6.34 6.34 5 8 5C9.66 5 11 6.34 11 8C11 9.66 9.66 11 8 11ZM8 6.5C7.17 6.5 6.5 7.17 6.5 8C6.5 8.83 7.17 9.5 8 9.5C8.83 9.5 9.5 8.83 9.5 8C9.5 7.17 8.83 6.5 8 6.5Z\"/>\r\n </svg>\r\n <svg *ngIf=\"showPassword\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 3C11.5 3 14.5 5.5 16 8C15.4 9.1 14.5 10 13.5 10.7L11.9 9.1C12.3 8.8 12.5 8.4 12.5 8C12.5 6.62 11.38 5.5 10 5.5C9.6 5.5 9.2 5.7 8.9 5.9L7.3 4.3C7.5 4.1 7.7 4 8 4C8 4 8 4 8 3ZM1.3 2.3L3 4C1.8 4.9 0.8 6.1 0 8C1.5 10.5 4.5 13 8 13C9.3 13 10.5 12.6 11.6 12L13.7 14.1L15.1 12.7L2.7 0.3L1.3 2.3ZM5.5 6.8L7.2 8.5C7.1 8.6 7 8.8 7 9C7 9.83 7.67 10.5 8.5 10.5C8.7 10.5 8.9 10.4 9 10.3L10.7 12C9.9 12.3 9 12.5 8 12.5C4.5 12.5 1.5 10 0 7.5C0.7 6.4 1.6 5.4 2.7 4.8L5.5 6.8Z\"/>\r\n </svg>\r\n </button>\r\n\r\n <!-- Right Icon -->\r\n <span\r\n *ngIf=\"computedRightIcon && !showClearButton && !showPasswordToggle\"\r\n class=\"pecb-input__icon pecb-input__icon--right\"\r\n aria-hidden=\"true\"\r\n >\r\n <ng-container [ngSwitch]=\"computedRightIcon\">\r\n <svg *ngSwitchCase=\"'email'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M2 3H14C14.55 3 15 3.45 15 4V12C15 12.55 14.55 13 14 13H2C1.45 13 1 12.55 1 12V4C1 3.45 1.45 3 2 3ZM8 8.5L2.5 5V11.5H13.5V5L8 8.5ZM8 7L13.5 3.5H2.5L8 7Z\"/>\r\n </svg>\r\n <svg *ngSwitchCase=\"'search'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z\"/>\r\n </svg>\r\n <svg *ngSwitchCase=\"'user'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 8C10.21 8 12 6.21 12 4C12 1.79 10.21 0 8 0C5.79 0 4 1.79 4 4C4 6.21 5.79 8 8 8ZM8 10C5.33 10 0 11.34 0 14V16H16V14C16 11.34 10.67 10 8 10Z\"/>\r\n </svg>\r\n <span *ngSwitchDefault [innerHTML]=\"sanitizeIcon(computedRightIcon)\"></span>\r\n </ng-container>\r\n </span>\r\n </div>\r\n\r\n <!-- Helper Text / Error Message -->\r\n <div\r\n *ngIf=\"helperText || errorMessage\"\r\n [id]=\"id + '-description'\"\r\n class=\"pecb-input__description\"\r\n [class.pecb-input__description--error]=\"error && errorMessage\"\r\n >\r\n <span *ngIf=\"error && errorMessage\">{{ errorMessage }}</span>\r\n <span *ngIf=\"!error && helperText\">{{ helperText }}</span>\r\n </div>\r\n</div>\r\n", styles: [".pecb-input{position:relative;display:flex;flex-direction:column;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;width:100%}.pecb-input__wrapper{position:relative;display:flex;align-items:center}.pecb-input__label{position:absolute;left:12px;top:50%;transform:translateY(-50%);font-size:14px;font-weight:400;color:#919191;background-color:transparent;padding:0 4px;pointer-events:none;z-index:1;transition:top .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),font-size .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1),background-color .2s cubic-bezier(.4,0,.2,1),font-weight .2s cubic-bezier(.4,0,.2,1)}.pecb-input__required{color:#dc3545;margin-left:2px}.pecb-input__field:focus~.pecb-input__label,.pecb-input--focused .pecb-input__label,.pecb-input--has-value .pecb-input__label{top:0;transform:translateY(-50%) scale(1);font-size:12px;color:#a11e29;background-color:#fff;font-weight:500}.pecb-input--error .pecb-input__field:focus~.pecb-input__label,.pecb-input--error.pecb-input--focused .pecb-input__label,.pecb-input--error.pecb-input--has-value .pecb-input__label{color:#dc3545}.pecb-input--disabled .pecb-input__label{color:#919191}.pecb-input--disabled .pecb-input__field:focus~.pecb-input__label,.pecb-input--disabled.pecb-input--focused .pecb-input__label,.pecb-input--disabled.pecb-input--has-value .pecb-input__label{background-color:#ececec}.pecb-input--sm .pecb-input__label,.pecb-input--md .pecb-input__label{left:12px}.pecb-input--lg .pecb-input__label{left:16px}.pecb-input__field{flex:1;width:100%;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-weight:400;color:#313131;background-color:#fff;border:1px solid #c2c2c2;border-radius:8px;outline:none;transition-property:border-color,box-shadow;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-input__field::placeholder{color:#919191;opacity:0;transition:opacity .2s}.pecb-input__field:focus::placeholder{opacity:1}.pecb-input__field:hover:not(:disabled):not(:focus){border-color:#919191}.pecb-input__field:focus{border-color:#a11e29;box-shadow:0 0 0 3px #a11e291a}.pecb-input__field:disabled{background-color:#ececec;color:#919191;cursor:not-allowed;border-color:#c2c2c2}.pecb-input__field:read-only{background-color:#ececec;cursor:default}.pecb-input--error .pecb-input__field{border-color:#dc3545}.pecb-input--error .pecb-input__field:focus{border-color:#dc3545;box-shadow:0 0 0 3px #dc35451a}.pecb-input__icon{position:absolute;display:inline-flex;align-items:center;justify-content:center;color:#616161;background:none;border:none;cursor:pointer;padding:0;transition-property:color,opacity,transform;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-input__icon svg{flex-shrink:0}.pecb-input__icon--left{left:12px;pointer-events:none}.pecb-input__icon--right{right:12px;pointer-events:none}.pecb-input__icon--clear,.pecb-input__icon--password{right:12px;opacity:0;transform:scale(.8);pointer-events:none;color:#919191}.pecb-input__icon--clear:hover,.pecb-input__icon--password:hover{color:#313131}.pecb-input__icon--clear:hover{color:#dc3545}.pecb-input__icon:hover:not(:disabled){color:#313131}.pecb-input__icon:disabled{color:#919191;cursor:not-allowed}.pecb-input--has-value .pecb-input__icon--clear,.pecb-input--has-value .pecb-input__icon--password{opacity:1;transform:scale(1);pointer-events:auto}.pecb-input--sm .pecb-input__field{padding:8px 12px;font-size:12px;height:32px}.pecb-input--sm .pecb-input__label{left:12px;font-size:12px}.pecb-input--sm .pecb-input__field:focus~.pecb-input__label,.pecb-input--sm.pecb-input--focused .pecb-input__label,.pecb-input--sm.pecb-input--has-value .pecb-input__label{font-size:10px}.pecb-input--sm .pecb-input__icon svg{width:14px;height:14px}.pecb-input--sm .pecb-input__icon--left{left:8px}.pecb-input--sm .pecb-input__icon--right,.pecb-input--sm .pecb-input__icon--clear,.pecb-input--sm .pecb-input__icon--password{right:8px}.pecb-input--sm:has(.pecb-input__icon--left) .pecb-input__field{padding-left:28px}.pecb-input--sm:has(.pecb-input__icon--left) .pecb-input__label{left:28px}.pecb-input--sm:has(.pecb-input__icon--right) .pecb-input__field,.pecb-input--sm.pecb-input--has-value .pecb-input__field{padding-right:32px}.pecb-input--md .pecb-input__field{padding:12px;font-size:14px;height:40px}.pecb-input--md .pecb-input__label{left:12px;font-size:14px}.pecb-input--md .pecb-input__field:focus~.pecb-input__label,.pecb-input--md.pecb-input--focused .pecb-input__label,.pecb-input--md.pecb-input--has-value .pecb-input__label{font-size:12px}.pecb-input--md .pecb-input__icon svg{width:16px;height:16px}.pecb-input--md .pecb-input__icon--left{left:12px}.pecb-input--md .pecb-input__icon--right,.pecb-input--md .pecb-input__icon--clear,.pecb-input--md .pecb-input__icon--password{right:12px}.pecb-input--md:has(.pecb-input__icon--left) .pecb-input__field{padding-left:36px}.pecb-input--md:has(.pecb-input__icon--left) .pecb-input__label{left:36px}.pecb-input--md:has(.pecb-input__icon--right) .pecb-input__field,.pecb-input--md.pecb-input--has-value .pecb-input__field{padding-right:40px}.pecb-input--lg .pecb-input__field{padding:16px;font-size:16px;height:48px}.pecb-input--lg .pecb-input__label{left:16px;font-size:16px}.pecb-input--lg .pecb-input__field:focus~.pecb-input__label,.pecb-input--lg.pecb-input--focused .pecb-input__label,.pecb-input--lg.pecb-input--has-value .pecb-input__label{font-size:13px}.pecb-input--lg .pecb-input__icon svg{width:18px;height:18px}.pecb-input--lg .pecb-input__icon--left{left:16px}.pecb-input--lg .pecb-input__icon--right,.pecb-input--lg .pecb-input__icon--clear,.pecb-input--lg .pecb-input__icon--password{right:16px}.pecb-input--lg:has(.pecb-input__icon--left) .pecb-input__field{padding-left:44px}.pecb-input--lg:has(.pecb-input__icon--left) .pecb-input__label{left:44px}.pecb-input--lg:has(.pecb-input__icon--right) .pecb-input__field,.pecb-input--lg.pecb-input--has-value .pecb-input__field{padding-right:48px}.pecb-input__description{margin-top:6px;font-size:12px;color:#616161;line-height:1.5}.pecb-input__description--error{color:#dc3545}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
257
- }
258
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InputComponent, decorators: [{
259
- type: Component,
260
- args: [{ selector: 'pecb-input', standalone: true, imports: [CommonModule], changeDetection: ChangeDetectionStrategy.OnPush, providers: [
261
- {
262
- provide: NG_VALUE_ACCESSOR,
263
- useExisting: forwardRef(() => InputComponent),
264
- multi: true
265
- }
266
- ], template: "<div [class]=\"wrapperClasses.join(' ')\">\r\n <!-- Input Wrapper -->\r\n <div class=\"pecb-input__wrapper\">\r\n <!-- Left Icon -->\r\n <span\r\n *ngIf=\"computedLeftIcon\"\r\n class=\"pecb-input__icon pecb-input__icon--left\"\r\n aria-hidden=\"true\"\r\n >\r\n <ng-container [ngSwitch]=\"computedLeftIcon\">\r\n <svg *ngSwitchCase=\"'email'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M2 3H14C14.55 3 15 3.45 15 4V12C15 12.55 14.55 13 14 13H2C1.45 13 1 12.55 1 12V4C1 3.45 1.45 3 2 3ZM8 8.5L2.5 5V11.5H13.5V5L8 8.5ZM8 7L13.5 3.5H2.5L8 7Z\"/>\r\n </svg>\r\n <svg *ngSwitchCase=\"'search'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z\"/>\r\n </svg>\r\n <svg *ngSwitchCase=\"'user'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 8C10.21 8 12 6.21 12 4C12 1.79 10.21 0 8 0C5.79 0 4 1.79 4 4C4 6.21 5.79 8 8 8ZM8 10C5.33 10 0 11.34 0 14V16H16V14C16 11.34 10.67 10 8 10Z\"/>\r\n </svg>\r\n <span *ngSwitchDefault [innerHTML]=\"sanitizeIcon(computedLeftIcon)\"></span>\r\n </ng-container>\r\n </span>\r\n\r\n <!-- Input -->\r\n <input\r\n #inputElement\r\n [id]=\"id\"\r\n [type]=\"inputType\"\r\n class=\"pecb-input__field\"\r\n [value]=\"value\"\r\n [disabled]=\"disabled\"\r\n [readonly]=\"readonly\"\r\n [required]=\"required\"\r\n [attr.maxlength]=\"maxLength\"\r\n [attr.min]=\"min\"\r\n [attr.max]=\"max\"\r\n [attr.step]=\"step\"\r\n [attr.autocomplete]=\"autocomplete\"\r\n [attr.aria-label]=\"label || placeholder\"\r\n [attr.aria-required]=\"required\"\r\n [attr.aria-invalid]=\"error\"\r\n [attr.aria-describedby]=\"helperText || errorMessage ? id + '-description' : null\"\r\n (input)=\"onInput($event)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n />\r\n\r\n <!-- Floating Label -->\r\n <label\r\n *ngIf=\"label\"\r\n [attr.for]=\"id\"\r\n class=\"pecb-input__label\"\r\n >\r\n {{ label }}<span *ngIf=\"required\" class=\"pecb-input__required\">*</span>\r\n </label>\r\n\r\n <!-- Clear Button -->\r\n <button\r\n *ngIf=\"showClearButton\"\r\n type=\"button\"\r\n class=\"pecb-input__icon pecb-input__icon--clear\"\r\n [attr.aria-label]=\"'Clear input'\"\r\n (click)=\"clearValue($event)\"\r\n >\r\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 0C3.6 0 0 3.6 0 8C0 12.4 3.6 16 8 16C12.4 16 16 12.4 16 8C16 3.6 12.4 0 8 0ZM11.5 10.1L10.1 11.5L8 9.4L5.9 11.5L4.5 10.1L6.6 8L4.5 5.9L5.9 4.5L8 6.6L10.1 4.5L11.5 5.9L9.4 8L11.5 10.1Z\"/>\r\n </svg>\r\n </button>\r\n\r\n <!-- Password Toggle -->\r\n <button\r\n *ngIf=\"showPasswordToggle\"\r\n type=\"button\"\r\n class=\"pecb-input__icon pecb-input__icon--password\"\r\n [attr.aria-label]=\"showPassword ? 'Hide password' : 'Show password'\"\r\n (click)=\"togglePasswordVisibility($event)\"\r\n >\r\n <svg *ngIf=\"!showPassword\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 3C4.5 3 1.5 5.5 0 8C1.5 10.5 4.5 13 8 13C11.5 13 14.5 10.5 16 8C14.5 5.5 11.5 3 8 3ZM8 11C6.34 11 5 9.66 5 8C5 6.34 6.34 5 8 5C9.66 5 11 6.34 11 8C11 9.66 9.66 11 8 11ZM8 6.5C7.17 6.5 6.5 7.17 6.5 8C6.5 8.83 7.17 9.5 8 9.5C8.83 9.5 9.5 8.83 9.5 8C9.5 7.17 8.83 6.5 8 6.5Z\"/>\r\n </svg>\r\n <svg *ngIf=\"showPassword\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 3C11.5 3 14.5 5.5 16 8C15.4 9.1 14.5 10 13.5 10.7L11.9 9.1C12.3 8.8 12.5 8.4 12.5 8C12.5 6.62 11.38 5.5 10 5.5C9.6 5.5 9.2 5.7 8.9 5.9L7.3 4.3C7.5 4.1 7.7 4 8 4C8 4 8 4 8 3ZM1.3 2.3L3 4C1.8 4.9 0.8 6.1 0 8C1.5 10.5 4.5 13 8 13C9.3 13 10.5 12.6 11.6 12L13.7 14.1L15.1 12.7L2.7 0.3L1.3 2.3ZM5.5 6.8L7.2 8.5C7.1 8.6 7 8.8 7 9C7 9.83 7.67 10.5 8.5 10.5C8.7 10.5 8.9 10.4 9 10.3L10.7 12C9.9 12.3 9 12.5 8 12.5C4.5 12.5 1.5 10 0 7.5C0.7 6.4 1.6 5.4 2.7 4.8L5.5 6.8Z\"/>\r\n </svg>\r\n </button>\r\n\r\n <!-- Right Icon -->\r\n <span\r\n *ngIf=\"computedRightIcon && !showClearButton && !showPasswordToggle\"\r\n class=\"pecb-input__icon pecb-input__icon--right\"\r\n aria-hidden=\"true\"\r\n >\r\n <ng-container [ngSwitch]=\"computedRightIcon\">\r\n <svg *ngSwitchCase=\"'email'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M2 3H14C14.55 3 15 3.45 15 4V12C15 12.55 14.55 13 14 13H2C1.45 13 1 12.55 1 12V4C1 3.45 1.45 3 2 3ZM8 8.5L2.5 5V11.5H13.5V5L8 8.5ZM8 7L13.5 3.5H2.5L8 7Z\"/>\r\n </svg>\r\n <svg *ngSwitchCase=\"'search'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M11.742 10.344a6.5 6.5 0 1 0-1.397 1.398h-.001c.03.04.062.078.098.115l3.85 3.85a1 1 0 0 0 1.415-1.414l-3.85-3.85a1.007 1.007 0 0 0-.115-.1zM12 6.5a5.5 5.5 0 1 1-11 0 5.5 5.5 0 0 1 11 0z\"/>\r\n </svg>\r\n <svg *ngSwitchCase=\"'user'\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\">\r\n <path d=\"M8 8C10.21 8 12 6.21 12 4C12 1.79 10.21 0 8 0C5.79 0 4 1.79 4 4C4 6.21 5.79 8 8 8ZM8 10C5.33 10 0 11.34 0 14V16H16V14C16 11.34 10.67 10 8 10Z\"/>\r\n </svg>\r\n <span *ngSwitchDefault [innerHTML]=\"sanitizeIcon(computedRightIcon)\"></span>\r\n </ng-container>\r\n </span>\r\n </div>\r\n\r\n <!-- Helper Text / Error Message -->\r\n <div\r\n *ngIf=\"helperText || errorMessage\"\r\n [id]=\"id + '-description'\"\r\n class=\"pecb-input__description\"\r\n [class.pecb-input__description--error]=\"error && errorMessage\"\r\n >\r\n <span *ngIf=\"error && errorMessage\">{{ errorMessage }}</span>\r\n <span *ngIf=\"!error && helperText\">{{ helperText }}</span>\r\n </div>\r\n</div>\r\n", styles: [".pecb-input{position:relative;display:flex;flex-direction:column;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;width:100%}.pecb-input__wrapper{position:relative;display:flex;align-items:center}.pecb-input__label{position:absolute;left:12px;top:50%;transform:translateY(-50%);font-size:14px;font-weight:400;color:#919191;background-color:transparent;padding:0 4px;pointer-events:none;z-index:1;transition:top .2s cubic-bezier(.4,0,.2,1),transform .2s cubic-bezier(.4,0,.2,1),font-size .2s cubic-bezier(.4,0,.2,1),color .2s cubic-bezier(.4,0,.2,1),background-color .2s cubic-bezier(.4,0,.2,1),font-weight .2s cubic-bezier(.4,0,.2,1)}.pecb-input__required{color:#dc3545;margin-left:2px}.pecb-input__field:focus~.pecb-input__label,.pecb-input--focused .pecb-input__label,.pecb-input--has-value .pecb-input__label{top:0;transform:translateY(-50%) scale(1);font-size:12px;color:#a11e29;background-color:#fff;font-weight:500}.pecb-input--error .pecb-input__field:focus~.pecb-input__label,.pecb-input--error.pecb-input--focused .pecb-input__label,.pecb-input--error.pecb-input--has-value .pecb-input__label{color:#dc3545}.pecb-input--disabled .pecb-input__label{color:#919191}.pecb-input--disabled .pecb-input__field:focus~.pecb-input__label,.pecb-input--disabled.pecb-input--focused .pecb-input__label,.pecb-input--disabled.pecb-input--has-value .pecb-input__label{background-color:#ececec}.pecb-input--sm .pecb-input__label,.pecb-input--md .pecb-input__label{left:12px}.pecb-input--lg .pecb-input__label{left:16px}.pecb-input__field{flex:1;width:100%;font-family:Plus Jakarta Sans,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-weight:400;color:#313131;background-color:#fff;border:1px solid #c2c2c2;border-radius:8px;outline:none;transition-property:border-color,box-shadow;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-input__field::placeholder{color:#919191;opacity:0;transition:opacity .2s}.pecb-input__field:focus::placeholder{opacity:1}.pecb-input__field:hover:not(:disabled):not(:focus){border-color:#919191}.pecb-input__field:focus{border-color:#a11e29;box-shadow:0 0 0 3px #a11e291a}.pecb-input__field:disabled{background-color:#ececec;color:#919191;cursor:not-allowed;border-color:#c2c2c2}.pecb-input__field:read-only{background-color:#ececec;cursor:default}.pecb-input--error .pecb-input__field{border-color:#dc3545}.pecb-input--error .pecb-input__field:focus{border-color:#dc3545;box-shadow:0 0 0 3px #dc35451a}.pecb-input__icon{position:absolute;display:inline-flex;align-items:center;justify-content:center;color:#616161;background:none;border:none;cursor:pointer;padding:0;transition-property:color,opacity,transform;transition-duration:.25s ease-in-out;transition-timing-function:ease-in-out}.pecb-input__icon svg{flex-shrink:0}.pecb-input__icon--left{left:12px;pointer-events:none}.pecb-input__icon--right{right:12px;pointer-events:none}.pecb-input__icon--clear,.pecb-input__icon--password{right:12px;opacity:0;transform:scale(.8);pointer-events:none;color:#919191}.pecb-input__icon--clear:hover,.pecb-input__icon--password:hover{color:#313131}.pecb-input__icon--clear:hover{color:#dc3545}.pecb-input__icon:hover:not(:disabled){color:#313131}.pecb-input__icon:disabled{color:#919191;cursor:not-allowed}.pecb-input--has-value .pecb-input__icon--clear,.pecb-input--has-value .pecb-input__icon--password{opacity:1;transform:scale(1);pointer-events:auto}.pecb-input--sm .pecb-input__field{padding:8px 12px;font-size:12px;height:32px}.pecb-input--sm .pecb-input__label{left:12px;font-size:12px}.pecb-input--sm .pecb-input__field:focus~.pecb-input__label,.pecb-input--sm.pecb-input--focused .pecb-input__label,.pecb-input--sm.pecb-input--has-value .pecb-input__label{font-size:10px}.pecb-input--sm .pecb-input__icon svg{width:14px;height:14px}.pecb-input--sm .pecb-input__icon--left{left:8px}.pecb-input--sm .pecb-input__icon--right,.pecb-input--sm .pecb-input__icon--clear,.pecb-input--sm .pecb-input__icon--password{right:8px}.pecb-input--sm:has(.pecb-input__icon--left) .pecb-input__field{padding-left:28px}.pecb-input--sm:has(.pecb-input__icon--left) .pecb-input__label{left:28px}.pecb-input--sm:has(.pecb-input__icon--right) .pecb-input__field,.pecb-input--sm.pecb-input--has-value .pecb-input__field{padding-right:32px}.pecb-input--md .pecb-input__field{padding:12px;font-size:14px;height:40px}.pecb-input--md .pecb-input__label{left:12px;font-size:14px}.pecb-input--md .pecb-input__field:focus~.pecb-input__label,.pecb-input--md.pecb-input--focused .pecb-input__label,.pecb-input--md.pecb-input--has-value .pecb-input__label{font-size:12px}.pecb-input--md .pecb-input__icon svg{width:16px;height:16px}.pecb-input--md .pecb-input__icon--left{left:12px}.pecb-input--md .pecb-input__icon--right,.pecb-input--md .pecb-input__icon--clear,.pecb-input--md .pecb-input__icon--password{right:12px}.pecb-input--md:has(.pecb-input__icon--left) .pecb-input__field{padding-left:36px}.pecb-input--md:has(.pecb-input__icon--left) .pecb-input__label{left:36px}.pecb-input--md:has(.pecb-input__icon--right) .pecb-input__field,.pecb-input--md.pecb-input--has-value .pecb-input__field{padding-right:40px}.pecb-input--lg .pecb-input__field{padding:16px;font-size:16px;height:48px}.pecb-input--lg .pecb-input__label{left:16px;font-size:16px}.pecb-input--lg .pecb-input__field:focus~.pecb-input__label,.pecb-input--lg.pecb-input--focused .pecb-input__label,.pecb-input--lg.pecb-input--has-value .pecb-input__label{font-size:13px}.pecb-input--lg .pecb-input__icon svg{width:18px;height:18px}.pecb-input--lg .pecb-input__icon--left{left:16px}.pecb-input--lg .pecb-input__icon--right,.pecb-input--lg .pecb-input__icon--clear,.pecb-input--lg .pecb-input__icon--password{right:16px}.pecb-input--lg:has(.pecb-input__icon--left) .pecb-input__field{padding-left:44px}.pecb-input--lg:has(.pecb-input__icon--left) .pecb-input__label{left:44px}.pecb-input--lg:has(.pecb-input__icon--right) .pecb-input__field,.pecb-input--lg.pecb-input--has-value .pecb-input__field{padding-right:48px}.pecb-input__description{margin-top:6px;font-size:12px;color:#616161;line-height:1.5}.pecb-input__description--error{color:#dc3545}\n"] }]
267
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }, { type: i1.DomSanitizer }], propDecorators: { inputElement: [{
268
- type: ViewChild,
269
- args: ['inputElement']
270
- }], id: [{
271
- type: Input
272
- }], type: [{
273
- type: Input
274
- }], label: [{
275
- type: Input
276
- }], placeholder: [{
277
- type: Input
278
- }], size: [{
279
- type: Input
280
- }], required: [{
281
- type: Input
282
- }], disabled: [{
283
- type: Input
284
- }], readonly: [{
285
- type: Input
286
- }], error: [{
287
- type: Input
288
- }], errorMessage: [{
289
- type: Input
290
- }], helperText: [{
291
- type: Input
292
- }], icon: [{
293
- type: Input
294
- }], iconPosition: [{
295
- type: Input
296
- }], leftIcon: [{
297
- type: Input
298
- }], rightIcon: [{
299
- type: Input
300
- }], clearable: [{
301
- type: Input
302
- }], maxLength: [{
303
- type: Input
304
- }], min: [{
305
- type: Input
306
- }], max: [{
307
- type: Input
308
- }], step: [{
309
- type: Input
310
- }], autocomplete: [{
311
- type: Input
312
- }], valueChange: [{
313
- type: Output
314
- }], blurred: [{
315
- type: Output
316
- }], focused: [{
317
- type: Output
318
- }], cleared: [{
319
- type: Output
320
- }] } });
321
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvaW5wdXQvaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvaW5wdXQvaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWix1QkFBdUIsRUFDdkIsVUFBVSxFQUNWLFNBQVMsRUFHVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDOzs7O0FBS2hFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Q0c7QUFnQkgsTUFBTSxPQUFPLGNBQWM7SUF5SXpCLFlBQ1UsR0FBc0IsRUFDdEIsU0FBdUI7UUFEdkIsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFDdEIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQXhJakM7O1dBRUc7UUFDTSxPQUFFLEdBQVcsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFaEQ7O1dBRUc7UUFDTSxTQUFJLEdBQWMsTUFBTSxDQUFDO1FBT2xDOztXQUVHO1FBQ00sZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFFMUI7O1dBRUc7UUFDTSxTQUFJLEdBQWMsSUFBSSxDQUFDO1FBRWhDOztXQUVHO1FBQ00sYUFBUSxHQUFHLEtBQUssQ0FBQztRQUUxQjs7V0FFRztRQUNNLGFBQVEsR0FBRyxLQUFLLENB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LE1BQU07Z0JBS0csT0FBTztzQkFBaEIsTUFBTTtnQkFLRyxPQUFPO3NCQUFoQixNQUFNO2dCQUtHLE9BQU87c0JBQWhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgVmlld0NoaWxkLFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWZcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgRG9tU2FuaXRpemVyLCBTYWZlSHRtbCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xyXG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IGdlbmVyYXRlVW5pcXVlSWQgfSBmcm9tICcuLi8uLi9zaGFyZWQvdXRpbHMvZG9tLnV0aWxzJztcclxuXHJcbmV4cG9ydCB0eXBlIElucHV0VHlwZSA9ICd0ZXh0JyB8ICdlbWFpbCcgfCAncGFzc3dvcmQnIHwgJ251bWJlcicgfCAndGVsJyB8ICd1cmwnIHwgJ3NlYXJjaCc7XHJcbmV4cG9ydCB0eXBlIElucHV0U2l6ZSA9ICdzbScgfCAnbWQnIHwgJ2xnJztcclxuXHJcbi8qKlxyXG4gKiBBIHByb2Zlc3Npb25hbCBpbnB1dCBjb21wb25lbnQgd2l0aCBmbG9hdGluZyBsYWJlbCBhbmQgbXVsdGlwbGUgdHlwZXMuXHJcbiAqIEZ1bGx5IGFjY2Vzc2libGUgd2l0aCBXQ0FHIDIuMSBBQSBjb21wbGlhbmNlIGFuZCByZWFjdGl2ZSBmb3JtcyBzdXBwb3J0LlxyXG4gKlxyXG4gKiBAZXhhbXBsZVxyXG4gKiBgYGBodG1sXHJcbiAqIDxwZWNiLWlucHV0XHJcbiAqICAgbGFiZWw9XCJFbWFpbFwiXHJcbiAqICAgdHlwZT1cImVtYWlsXCJcclxuICogICBwbGFjZWhvbGRlcj1cIkVudGVyIHlvdXIgZW1haWxcIlxyXG4gKiAgIFsobmdNb2RlbCldPVwiZW1haWxcIlxyXG4gKiA+PC9wZWNiLWlucHV0PlxyXG4gKlxyXG4gKiA8IS0tIFdpdGggcHJlZGVmaW5lZCBpY29uIC0tPlxyXG4gKiA8cGVjYi1pbnB1dFxyXG4gKiAgIGxhYmVsPVwiRW1haWxcIlxyXG4gKiAgIHR5cGU9XCJlbWFpbFwiXHJcbiAqICAgaWNvbj1cImVtYWlsXCJcclxuICogICBpY29uUG9zaXRpb249XCJsZWZ0XCJcclxuICogPjwvcGVjYi1pbnB1dD5cclxuICpcclxuICogPCEtLSBXaXRoIGN1c3RvbSBTVkcgaWNvbiAtLT5cclxuICogPHBlY2ItaW5wdXRcclxuICogICBsYWJlbD1cIlBob25lXCJcclxuICogICB0eXBlPVwidGVsXCJcclxuICogICBbaWNvbl09XCInPHN2Zz4uLi48L3N2Zz4nXCJcclxuICogICBpY29uUG9zaXRpb249XCJsZWZ0XCJcclxuICogPjwvcGVjYi1pbnB1dD5cclxuICpcclxuICogPCEtLSBXaXRoIGVycm9yIHN0YXRlIC0tPlxyXG4gKiA8cGVjYi1pbnB1dFxyXG4gKiAgIGxhYmVsPVwiUGFzc3dvcmRcIlxyXG4gKiAgIHR5cGU9XCJwYXNzd29yZFwiXHJcbiAqICAgW2Vycm9yXT1cInRydWVcIlxyXG4gKiAgIGVycm9yTWVzc2FnZT1cIlBhc3N3b3JkIGlzIHJlcXVpcmVkXCJcclxuICogPjwvcGVjYi1pbnB1dD5cclxuICogYGBgXHJcbiAqXHJcbiAqIEBwdWJsaWNBcGlcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAncGVjYi1pbnB1dCcsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2lucHV0LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJbnB1dENvbXBvbmVudCksXHJcbiAgICAgIG11bHRpOiB0cnVlXHJcbiAgICB9XHJcbiAgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgSW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XHJcbiAgQFZpZXdDaGlsZCgnaW5wdXRFbGVtZW50JykgaW5wdXRFbGVtZW50PzogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcclxuXHJcbiAgLyoqXHJcbiAgICogVW5pcXVlIElEIGZvciB0aGUgaW5wdXQgZWxlbWVudFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmcgPSBnZW5lcmF0ZVVuaXF1ZUlkKCdpbnB1dCcpO1xyXG5cclxuICAvKipcclxuICAgKiBJbnB1dCB0eXBlXHJcbiAgICovXHJcbiAgQElucHV0KCkgdHlwZTogSW5wdXRUeXBlID0gJ3RleHQnO1xyXG5cclxuICAvKipcclxuICAgKiBMYWJlbCB0ZXh0IHRvIGRpc3BsYXlcclxuICAgKi9cclxuICBASW5wdXQoKSBsYWJlbD86IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogUGxhY2Vob2xkZXIgdGV4dCAoc2hvd24gd2hlbiBsYWJlbCBpcyBub3QgcHJlc2VudClcclxuICAgKi9cclxuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICcnO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgaW5wdXRcclxuICAgKi9cclxuICBASW5wdXQoKSBzaXplOiBJbnB1dFNpemUgPSAnbWQnO1xyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRoZSBmaWVsZCBpcyByZXF1aXJlZFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHJlcXVpcmVkID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdGhlIGlucHV0IGlzIGRpc2FibGVkXHJcbiAgICovXHJcbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgaW5wdXQgaXMgcmVhZG9ubHlcclxuICAgKi9cclxuICBASW5wdXQoKSByZWFkb25seSA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHNob3cgZXJyb3Igc3RhdGVcclxuICAgKi9cclxuICBASW5wdXQoKSBlcnJvciA9IGZhbHNlO1xyXG5cclxuICAvKipcclxuICAgKiBFcnJvciBtZXNzYWdlIHRvIGRpc3BsYXlcclxuICAgKi9cclxuICBASW5wdXQoKSBlcnJvck1lc3NhZ2U/OiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIEhlbHBlciB0ZXh0IHRvIGRpc3BsYXkgYmVsb3cgaW5wdXRcclxuICAgKi9cclxuICBASW5wdXQoKSBoZWxwZXJUZXh0Pzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBJY29uIHRvIGRpc3BsYXkgLSBjYW4gYmUgYSBwcmVkZWZpbmVkIG5hbWUgKCdlbWFpbCcsICdzZWFyY2gnLCAndXNlcicpIG9yIGN1c3RvbSBTVkcgc3RyaW5nXHJcbiAgICovXHJcbiAgQElucHV0KCkgaWNvbj86IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogSWNvbiBwb3NpdGlvbiAobGVmdCBvciByaWdodClcclxuICAgKi9cclxuICBASW5wdXQoKSBpY29uUG9zaXRpb246ICdsZWZ0JyB8ICdyaWdodCcgPSAnbGVmdCc7XHJcblxyXG4gIC8qKlxyXG4gICAqIExlZnQgaWNvbiBuYW1lIG9yIEhUTUwgKGRlcHJlY2F0ZWQgLSB1c2UgaWNvbiB3aXRoIGljb25Qb3NpdGlvbiBpbnN0ZWFkKVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGxlZnRJY29uPzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBSaWdodCBpY29uIG5hbWUgb3IgSFRNTCAoZGVwcmVjYXRlZCAtIHVzZSBpY29uIHdpdGggaWNvblBvc2l0aW9uIGluc3RlYWQpXHJcbiAgICovXHJcbiAgQElucHV0KCkgcmlnaHRJY29uPzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIHNob3cgY2xlYXIgYnV0dG9uXHJcbiAgICovXHJcbiAgQElucHV0KCkgY2xlYXJhYmxlID0gZmFsc2U7XHJcblxyXG4gIC8qKlxyXG4gICAqIE1heGltdW0gbGVuZ3RoIG9mIGlucHV0XHJcbiAgICovXHJcbiAgQElucHV0KCkgbWF4TGVuZ3RoPzogbnVtYmVyO1xyXG5cclxuICAvKipcclxuICAgKiBNaW5pbXVtIHZhbHVlIChmb3IgbnVtYmVyIHR5cGUpXHJcbiAgICovXHJcbiAgQElucHV0KCkgbWluPzogbnVtYmVyO1xyXG5cclxuICAvKipcclxuICAgKiBNYXhpbXVtIHZhbHVlIChmb3IgbnVtYmVyIHR5cGUpXHJcbiAgICovXHJcbiAgQElucHV0KCkgbWF4PzogbnVtYmVyO1xyXG5cclxuICAvKipcclxuICAgKiBTdGVwIHZhbHVlIChmb3IgbnVtYmVyIHR5cGUpXHJcbiAgICovXHJcbiAgQElucHV0KCkgc3RlcD86IG51bWJlcjtcclxuXHJcbiAgLyoqXHJcbiAgICogQXV0b2NvbXBsZXRlIGF0dHJpYnV0ZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGF1dG9jb21wbGV0ZT86IHN0cmluZztcclxuXHJcbiAgLyoqXHJcbiAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHZhbHVlIGNoYW5nZXNcclxuICAgKi9cclxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRXZlbnQgZW1pdHRlZCBvbiBibHVyXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIGJsdXJyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZW50IGVtaXR0ZWQgb24gZm9jdXNcclxuICAgKi9cclxuICBAT3V0cHV0KCkgZm9jdXNlZCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRXZlbnQgZW1pdHRlZCB3aGVuIGNsZWFyIGJ1dHRvbiBpcyBjbGlja2VkXHJcbiAgICovXHJcbiAgQE91dHB1dCgpIGNsZWFyZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcblxyXG4gIC8vIEludGVybmFsIHN0YXRlXHJcbiAgdmFsdWU6IHN0cmluZyA9ICcnO1xyXG4gIGlzRm9jdXNlZCA9IGZhbHNlO1xyXG4gIHNob3dQYXNzd29yZCA9IGZhbHNlO1xyXG5cclxuICAvLyBDb250cm9sVmFsdWVBY2Nlc3NvclxyXG4gIHByaXZhdGUgb25DaGFuZ2U6ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkID0gKCkgPT4ge307XHJcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7fTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIHNhbml0aXplcjogRG9tU2FuaXRpemVyXHJcbiAgKSB7fVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgQ1NTIGNsYXNzZXMgZm9yIHRoZSBpbnB1dCB3cmFwcGVyXHJcbiAgICovXHJcbiAgZ2V0IHdyYXBwZXJDbGFzc2VzKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBbXHJcbiAgICAgICdwZWNiLWlucHV0JyxcclxuICAgICAgYHBlY2ItaW5wdXQtLSR7dGhpcy5zaXplfWAsXHJcbiAgICAgIHRoaXMuZGlzYWJsZWQgPyAncGVjYi1pbnB1dC0tZGlzYWJsZWQnIDogJycsXHJcbiAgICAgIHRoaXMuZXJyb3IgPyAncGVjYi1pbnB1dC0tZXJyb3InIDogJycsXHJcbiAgICAgIHRoaXMucmVhZG9ubHkgPyAncGVjYi1pbnB1dC0tcmVhZG9ubHknIDogJycsXHJcbiAgICAgIHRoaXMuaXNGb2N1c2VkID8gJ3BlY2ItaW5wdXQtLWZvY3VzZWQnIDogJycsXHJcbiAgICAgIHRoaXMudmFsdWUgPyAncGVjYi1pbnB1dC0taGFzLXZhbHVlJyA6ICcnXHJcbiAgICBdLmZpbHRlcihCb29sZWFuKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgYWN0dWFsIGlucHV0IHR5cGUgKGhhbmRsZXMgcGFzc3dvcmQgdmlzaWJpbGl0eSB0b2dnbGUpXHJcbiAgICovXHJcbiAgZ2V0IGlucHV0VHlwZSgpOiBzdHJpbmcge1xyXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ3Bhc3N3b3JkJyAmJiB0aGlzLnNob3dQYXNzd29yZCkge1xyXG4gICAgICByZXR1cm4gJ3RleHQnO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMudHlwZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIGNsZWFyIGJ1dHRvbiBzaG91bGQgYmUgc2hvd25cclxuICAgKi9cclxuICBnZXQgc2hvd0NsZWFyQnV0dG9uKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuY2xlYXJhYmxlICYmICEhdGhpcy52YWx1ZSAmJiAhdGhpcy5kaXNhYmxlZCAmJiAhdGhpcy5yZWFkb25seTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrIGlmIHBhc3N3b3JkIHRvZ2dsZSBzaG91bGQgYmUgc2hvd25cclxuICAgKi9cclxuICBnZXQgc2hvd1Bhc3N3b3JkVG9nZ2xlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ3Bhc3N3b3JkJyAmJiAhIXRoaXMudmFsdWUgJiYgIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMucmVhZG9ubHk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBHZXQgY29tcHV0ZWQgbGVmdCBpY29uXHJcbiAgICovXHJcbiAgZ2V0IGNvbXB1dGVkTGVmdEljb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcclxuICAgIC8vIE5ldyBBUEkgdGFrZXMgcHJlY2VkZW5jZVxyXG4gICAgaWYgKHRoaXMuaWNvbiAmJiB0aGlzLmljb25Qb3NpdGlvbiA9PT0gJ2xlZnQnKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmljb247XHJcbiAgICB9XHJcbiAgICAvLyBGYWxsYmFjayB0byBvbGQgQVBJXHJcbiAgICByZXR1cm4gdGhpcy5sZWZ0SWNvbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCBjb21wdXRlZCByaWdodCBpY29uXHJcbiAgICovXHJcbiAgZ2V0IGNvbXB1dGVkUmlnaHRJY29uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICAvLyBOZXcgQVBJIHRha2VzIHByZWNlZGVuY2VcclxuICAgIGlmICh0aGlzLmljb24gJiYgdGhpcy5pY29uUG9zaXRpb24gPT09ICdyaWdodCcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuaWNvbjtcclxuICAgIH1cclxuICAgIC8vIEZhbGxiYWNrIHRvIG9sZCBBUElcclxuICAgIHJldHVybiB0aGlzLnJpZ2h0SWNvbjtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBpbnB1dCBjaGFuZ2VcclxuICAgKi9cclxuICBvbklucHV0KGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICB0aGlzLnZhbHVlID0gdGFyZ2V0LnZhbHVlO1xyXG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcclxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSGFuZGxlIGZvY3VzIGV2ZW50XHJcbiAgICovXHJcbiAgb25Gb2N1cygpOiB2b2lkIHtcclxuICAgIHRoaXMuaXNGb2N1c2VkID0gdHJ1ZTtcclxuICAgIHRoaXMuZm9jdXNlZC5lbWl0KCk7XHJcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmRsZSBibHVyIGV2ZW50XHJcbiAgICovXHJcbiAgb25CbHVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5pc0ZvY3VzZWQgPSBmYWxzZTtcclxuICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgICB0aGlzLmJsdXJyZWQuZW1pdCgpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDbGVhciBpbnB1dCB2YWx1ZVxyXG4gICAqL1xyXG4gIGNsZWFyVmFsdWUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgdGhpcy52YWx1ZSA9ICcnO1xyXG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcclxuICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTtcclxuICAgIHRoaXMuY2xlYXJlZC5lbWl0KCk7XHJcbiAgICB0aGlzLmlucHV0RWxlbWVudD8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUb2dnbGUgcGFzc3dvcmQgdmlzaWJpbGl0eVxyXG4gICAqL1xyXG4gIHRvZ2dsZVBhc3N3b3JkVmlzaWJpbGl0eShldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB0aGlzLnNob3dQYXNzd29yZCA9ICF0aGlzLnNob3dQYXNzd29yZDtcclxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRm9jdXMgdGhlIGlucHV0XHJcbiAgICovXHJcbiAgZm9jdXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLmlucHV0RWxlbWVudD8ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2FuaXRpemUgY3VzdG9tIGljb24gSFRNTC9TVkdcclxuICAgKi9cclxuICBzYW5pdGl6ZUljb24oaWNvbjogc3RyaW5nIHwgdW5kZWZpbmVkKTogU2FmZUh0bWwge1xyXG4gICAgaWYgKCFpY29uKSByZXR1cm4gJyc7XHJcbiAgICByZXR1cm4gdGhpcy5zYW5pdGl6ZXIuYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwoaWNvbik7XHJcbiAgfVxyXG5cclxuICAvLyBDb250cm9sVmFsdWVBY2Nlc3NvciBpbXBsZW1lbnRhdGlvblxyXG4gIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlIHx8ICcnO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IHN0cmluZykgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgW2NsYXNzXT1cIndyYXBwZXJDbGFzc2VzLmpvaW4oJyAnKVwiPlxyXG4gIDwhLS0gSW5wdXQgV3JhcHBlciAtLT5cclxuICA8ZGl2IGNsYXNzPVwicGVjYi1pbnB1dF9fd3JhcHBlclwiPlxyXG4gICAgPCEtLSBMZWZ0IEljb24gLS0+XHJcbiAgICA8c3BhblxyXG4gICAgICAqbmdJZj1cImNvbXB1dGVkTGVmdEljb25cIlxyXG4gICAgICBjbGFzcz1cInBlY2ItaW5wdXRfX2ljb24gcGVjYi1pbnB1dF9faWNvbi0tbGVmdFwiXHJcbiAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgICA+XHJcbiAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbXB1dGVkTGVmdEljb25cIj5cclxuICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCInZW1haWwnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNMiAzSDE0QzE0LjU1IDMgMTUgMy40NSAxNSA0VjEyQzE1IDEyLjU1IDE0LjU1IDEzIDE0IDEzSDJDMS40NSAxMyAxIDEyLjU1IDEgMTJWNEMxIDMuNDUgMS40NSAzIDIgM1pNOCA4LjVMMi41IDVWMTEuNUgxMy41VjVMOCA4LjVaTTggN0wxMy41IDMuNUgyLjVMOCA3WlwiLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCInc2VhcmNoJ1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMTYgMTZcIiBmaWxsPVwiY3VycmVudENvbG9yXCI+XHJcbiAgICAgICAgICA8cGF0aCBkPVwiTTExLjc0MiAxMC4zNDRhNi41IDYuNSAwIDEgMC0xLjM5NyAxLjM5OGgtLjAwMWMuMDMuMDQuMDYyLjA3OC4wOTguMTE1bDMuODUgMy44NWExIDEgMCAwIDAgMS40MTUtMS40MTRsLTMuODUtMy44NWExLjAwNyAxLjAwNyAwIDAgMC0uMTE1LS4xek0xMiA2LjVhNS41IDUuNSAwIDEgMS0xMSAwIDUuNSA1LjUgMCAwIDEgMTEgMHpcIi8+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPHN2ZyAqbmdTd2l0Y2hDYXNlPVwiJ3VzZXInXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNOCA4QzEwLjIxIDggMTIgNi4yMSAxMiA0QzEyIDEuNzkgMTAuMjEgMCA4IDBDNS43OSAwIDQgMS43OSA0IDRDNCA2LjIxIDUuNzkgOCA4IDhaTTggMTBDNS4zMyAxMCAwIDExLjM0IDAgMTRWMTZIMTZWMTRDMTYgMTEuMzQgMTAuNjcgMTAgOCAxMFpcIi8+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgPHNwYW4gKm5nU3dpdGNoRGVmYXVsdCBbaW5uZXJIVE1MXT1cInNhbml0aXplSWNvbihjb21wdXRlZExlZnRJY29uKVwiPjwvc3Bhbj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L3NwYW4+XHJcblxyXG4gICAgPCEtLSBJbnB1dCAtLT5cclxuICAgIDxpbnB1dFxyXG4gICAgICAjaW5wdXRFbGVtZW50XHJcbiAgICAgIFtpZF09XCJpZFwiXHJcbiAgICAgIFt0eXBlXT1cImlucHV0VHlwZVwiXHJcbiAgICAgIGNsYXNzPVwicGVjYi1pbnB1dF9fZmllbGRcIlxyXG4gICAgICBbdmFsdWVdPVwidmFsdWVcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxyXG4gICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxyXG4gICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxyXG4gICAgICBbYXR0ci5tYXhsZW5ndGhdPVwibWF4TGVuZ3RoXCJcclxuICAgICAgW2F0dHIubWluXT1cIm1pblwiXHJcbiAgICAgIFthdHRyLm1heF09XCJtYXhcIlxyXG4gICAgICBbYXR0ci5zdGVwXT1cInN0ZXBcIlxyXG4gICAgICBbYXR0ci5hdXRvY29tcGxldGVdPVwiYXV0b2NvbXBsZXRlXCJcclxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJsYWJlbCB8fCBwbGFjZWhvbGRlclwiXHJcbiAgICAgIFthdHRyLmFyaWEtcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxyXG4gICAgICBbYXR0ci5hcmlhLWludmFsaWRdPVwiZXJyb3JcIlxyXG4gICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cImhlbHBlclRleHQgfHwgZXJyb3JNZXNzYWdlID8gaWQgKyAnLWRlc2NyaXB0aW9uJyA6IG51bGxcIlxyXG4gICAgICAoaW5wdXQpPVwib25JbnB1dCgkZXZlbnQpXCJcclxuICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiXHJcbiAgICAgIChibHVyKT1cIm9uQmx1cigpXCJcclxuICAgIC8+XHJcblxyXG4gICAgPCEtLSBGbG9hdGluZyBMYWJlbCAtLT5cclxuICAgIDxsYWJlbFxyXG4gICAgICAqbmdJZj1cImxhYmVsXCJcclxuICAgICAgW2F0dHIuZm9yXT1cImlkXCJcclxuICAgICAgY2xhc3M9XCJwZWNiLWlucHV0X19sYWJlbFwiXHJcbiAgICA+XHJcbiAgICAgIHt7IGxhYmVsIH19PHNwYW4gKm5nSWY9XCJyZXF1aXJlZFwiIGNsYXNzPVwicGVjYi1pbnB1dF9fcmVxdWlyZWRcIj4qPC9zcGFuPlxyXG4gICAgPC9sYWJlbD5cclxuXHJcbiAgICA8IS0tIENsZWFyIEJ1dHRvbiAtLT5cclxuICAgIDxidXR0b25cclxuICAgICAgKm5nSWY9XCJzaG93Q2xlYXJCdXR0b25cIlxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgY2xhc3M9XCJwZWNiLWlucHV0X19pY29uIHBlY2ItaW5wdXRfX2ljb24tLWNsZWFyXCJcclxuICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQ2xlYXIgaW5wdXQnXCJcclxuICAgICAgKGNsaWNrKT1cImNsZWFyVmFsdWUoJGV2ZW50KVwiXHJcbiAgICA+XHJcbiAgICAgIDxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cclxuICAgICAgICA8cGF0aCBkPVwiTTggMEMzLjYgMCAwIDMuNiAwIDhDMCAxMi40IDMuNiAxNiA4IDE2QzEyLjQgMTYgMTYgMTIuNCAxNiA4QzE2IDMuNiAxMi40IDAgOCAwWk0xMS41IDEwLjFMMTAuMSAxMS41TDggOS40TDUuOSAxMS41TDQuNSAxMC4xTDYuNiA4TDQuNSA1LjlMNS45IDQuNUw4IDYuNkwxMC4xIDQuNUwxMS41IDUuOUw5LjQgOEwxMS41IDEwLjFaXCIvPlxyXG4gICAgICA8L3N2Zz5cclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDwhLS0gUGFzc3dvcmQgVG9nZ2xlIC0tPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICAqbmdJZj1cInNob3dQYXNzd29yZFRvZ2dsZVwiXHJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICBjbGFzcz1cInBlY2ItaW5wdXRfX2ljb24gcGVjYi1pbnB1dF9faWNvbi0tcGFzc3dvcmRcIlxyXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInNob3dQYXNzd29yZCA/ICdIaWRlIHBhc3N3b3JkJyA6ICdTaG93IHBhc3N3b3JkJ1wiXHJcbiAgICAgIChjbGljayk9XCJ0b2dnbGVQYXNzd29yZFZpc2liaWxpdHkoJGV2ZW50KVwiXHJcbiAgICA+XHJcbiAgICAgIDxzdmcgKm5nSWY9XCIhc2hvd1Bhc3N3b3JkXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cclxuICAgICAgICA8cGF0aCBkPVwiTTggM0M0LjUgMyAxLjUgNS41IDAgOEMxLjUgMTAuNSA0LjUgMTMgOCAxM0MxMS41IDEzIDE0LjUgMTAuNSAxNiA4QzE0LjUgNS41IDExLjUgMyA4IDNaTTggMTFDNi4zNCAxMSA1IDkuNjYgNSA4QzUgNi4zNCA2LjM0IDUgOCA1QzkuNjYgNSAxMSA2LjM0IDExIDhDMTEgOS42NiA5LjY2IDExIDggMTFaTTggNi41QzcuMTcgNi41IDYuNSA3LjE3IDYuNSA4QzYuNSA4LjgzIDcuMTcgOS41IDggOS41QzguODMgOS41IDkuNSA4LjgzIDkuNSA4QzkuNSA3LjE3IDguODMgNi41IDggNi41WlwiLz5cclxuICAgICAgPC9zdmc+XHJcbiAgICAgIDxzdmcgKm5nSWY9XCJzaG93UGFzc3dvcmRcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPlxyXG4gICAgICAgIDxwYXRoIGQ9XCJNOCAzQzExLjUgMyAxNC41IDUuNSAxNiA4QzE1LjQgOS4xIDE0LjUgMTAgMTMuNSAxMC43TDExLjkgOS4xQzEyLjMgOC44IDEyLjUgOC40IDEyLjUgOEMxMi41IDYuNjIgMTEuMzggNS41IDEwIDUuNUM5LjYgNS41IDkuMiA1LjcgOC45IDUuOUw3LjMgNC4zQzcuNSA0LjEgNy43IDQgOCA0QzggNCA4IDQgOCAzWk0xLjMgMi4zTDMgNEMxLjggNC45IDAuOCA2LjEgMCA4QzEuNSAxMC41IDQuNSAxMyA4IDEzQzkuMyAxMyAxMC41IDEyLjYgMTEuNiAxMkwxMy43IDE0LjFMMTUuMSAxMi43TDIuNyAwLjNMMS4zIDIuM1pNNS41IDYuOEw3LjIgOC41QzcuMSA4LjYgNyA4LjggNyA5QzcgOS44MyA3LjY3IDEwLjUgOC41IDEwLjVDOC43IDEwLjUgOC45IDEwLjQgOSAxMC4zTDEwLjcgMTJDOS45IDEyLjMgOSAxMi41IDggMTIuNUM0LjUgMTIuNSAxLjUgMTAgMCA3LjVDMC43IDYuNCAxLjYgNS40IDIuNyA0LjhMNS41IDYuOFpcIi8+XHJcbiAgICAgIDwvc3ZnPlxyXG4gICAgPC9idXR0b24+XHJcblxyXG4gICAgPCEtLSBSaWdodCBJY29uIC0tPlxyXG4gICAgPHNwYW5cclxuICAgICAgKm5nSWY9XCJjb21wdXRlZFJpZ2h0SWNvbiAmJiAhc2hvd0NsZWFyQnV0dG9uICYmICFzaG93UGFzc3dvcmRUb2dnbGVcIlxyXG4gICAgICBjbGFzcz1cInBlY2ItaW5wdXRfX2ljb24gcGVjYi1pbnB1dF9faWNvbi0tcmlnaHRcIlxyXG4gICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxyXG4gICAgPlxyXG4gICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb21wdXRlZFJpZ2h0SWNvblwiPlxyXG4gICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidlbWFpbCdcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPlxyXG4gICAgICAgICAgPHBhdGggZD1cIk0yIDNIMTRDMTQuNTUgMyAxNSAzLjQ1IDE1IDRWMTJDMTUgMTIuNTUgMTQuNTUgMTMgMTQgMTNIMkMxLjQ1IDEzIDEgMTIuNTUgMSAxMlY0QzEgMy40NSAxLjQ1IDMgMiAzWk04IDguNUwyLjUgNVYxMS41SDEzLjVWNUw4IDguNVpNOCA3TDEzLjUgMy41SDIuNUw4IDdaXCIvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDxzdmcgKm5nU3dpdGNoQ2FzZT1cIidzZWFyY2gnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgdmlld0JveD1cIjAgMCAxNiAxNlwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNMTEuNzQyIDEwLjM0NGE2LjUgNi41IDAgMSAwLTEuMzk3IDEuMzk4aC0uMDAxYy4wMy4wNC4wNjIuMDc4LjA5OC4xMTVsMy44NSAzLjg1YTEgMSAwIDAgMCAxLjQxNS0xLjQxNGwtMy44NS0zLjg1YTEuMDA3IDEuMDA3IDAgMCAwLS4xMTUtLjF6TTEyIDYuNWE1LjUgNS41IDAgMSAxLTExIDAgNS41IDUuNSAwIDAgMSAxMSAwelwiLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8c3ZnICpuZ1N3aXRjaENhc2U9XCIndXNlcidcIiB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDE2IDE2XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPlxyXG4gICAgICAgICAgPHBhdGggZD1cIk04IDhDMTAuMjEgOCAxMiA2LjIxIDEyIDRDMTIgMS43OSAxMC4yMSAwIDggMEM1Ljc5IDAgNCAxLjc5IDQgNEM0IDYuMjEgNS43OSA4IDggOFpNOCAxMEM1LjMzIDEwIDAgMTEuMzQgMCAxNFYxNkgxNlYxNEMxNiAxMS4zNCAxMC42NyAxMCA4IDEwWlwiLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8c3BhbiAqbmdTd2l0Y2hEZWZhdWx0IFtpbm5lckhUTUxdPVwic2FuaXRpemVJY29uKGNvbXB1dGVkUmlnaHRJY29uKVwiPjwvc3Bhbj5cclxuICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L3NwYW4+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gSGVscGVyIFRleHQgLyBFcnJvciBNZXNzYWdlIC0tPlxyXG4gIDxkaXZcclxuICAgICpuZ0lmPVwiaGVscGVyVGV4dCB8fCBlcnJvck1lc3NhZ2VcIlxyXG4gICAgW2lkXT1cImlkICsgJy1kZXNjcmlwdGlvbidcIlxyXG4gICAgY2xhc3M9XCJwZWNiLWlucHV0X19kZXNjcmlwdGlvblwiXHJcbiAgICBbY2xhc3MucGVjYi1pbnB1dF9fZGVzY3JpcHRpb24tLWVycm9yXT1cImVycm9yICYmIGVycm9yTWVzc2FnZVwiXHJcbiAgPlxyXG4gICAgPHNwYW4gKm5nSWY9XCJlcnJvciAmJiBlcnJvck1lc3NhZ2VcIj57eyBlcnJvck1lc3NhZ2UgfX08L3NwYW4+XHJcbiAgICA8c3BhbiAqbmdJZj1cIiFlcnJvciAmJiBoZWxwZXJUZXh0XCI+e3sgaGVscGVyVGV4dCB9fTwvc3Bhbj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==