@snabcentr/client-ui 3.51.12 → 3.51.14
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/catalog/catalog-filters/sc-catalog-filters.component.d.ts +7 -4
- package/esm2022/catalog/catalog-filters/sc-catalog-filters.component.mjs +22 -9
- package/fesm2022/snabcentr-client-ui.mjs +20 -7
- package/fesm2022/snabcentr-client-ui.mjs.map +1 -1
- package/package.json +2 -2
- package/release_notes.tmp +3 -3
|
@@ -32,7 +32,7 @@ export declare class ScCatalogFiltersComponent {
|
|
|
32
32
|
/**
|
|
33
33
|
* FormGroup для фильтров.
|
|
34
34
|
*/
|
|
35
|
-
readonly form: FormGroup<Record<string, FormControl<boolean> | FormGroup<Record<string, FormControl<boolean>>> | FormControl<[number, number]>>>;
|
|
35
|
+
readonly form: FormGroup<Record<string, FormControl<string | null> | FormControl<boolean> | FormGroup<Record<string, FormControl<boolean>>> | FormControl<[number, number]>>>;
|
|
36
36
|
/**
|
|
37
37
|
* Инициализирует экземпляр класса {@link ScCatalogFiltersComponent}.
|
|
38
38
|
*/
|
|
@@ -49,13 +49,16 @@ export declare class ScCatalogFiltersComponent {
|
|
|
49
49
|
* @param value Значения формы.
|
|
50
50
|
* @returns Объект фильтров свойств.
|
|
51
51
|
*/
|
|
52
|
-
protected buildPropertyFilters(value: Partial<Record<string, boolean | Record<string, boolean> | [number, number]>> | Record<string, unknown>): ScPropertyFilters;
|
|
52
|
+
protected buildPropertyFilters(value: Partial<Record<string, boolean | string | Record<string, boolean> | [number, number]>> | Record<string, unknown>): ScPropertyFilters;
|
|
53
53
|
/**
|
|
54
|
-
* Создает
|
|
54
|
+
* Создает контрол формы для фильтра типа checkbox.
|
|
55
|
+
*
|
|
56
|
+
* Если `isMultiple === false` — возвращает {@link FormControl} строкового идентификатора (логика radio),
|
|
57
|
+
* иначе — {@link FormGroup} независимых булевых контролов по идентификаторам значений.
|
|
55
58
|
*
|
|
56
59
|
* @param checkboxFilter Фильтр типа checkbox.
|
|
57
60
|
*/
|
|
58
|
-
protected createCheckboxFormControl(checkboxFilter: ScICheckboxFilter): FormGroup<Record<string, FormControl<boolean
|
|
61
|
+
protected createCheckboxFormControl(checkboxFilter: ScICheckboxFilter): FormGroup<Record<string, FormControl<boolean>>> | FormControl<string | null>;
|
|
59
62
|
/**
|
|
60
63
|
* Создает FormControl для range.
|
|
61
64
|
*
|
|
@@ -6,9 +6,9 @@ import { SC_CATEGORY_INFO, ScCatalogFilterService, ScIdOrSlugPipe, } from '@snab
|
|
|
6
6
|
import { tuiIsPresent } from '@taiga-ui/cdk';
|
|
7
7
|
import { TuiTextfield } from '@taiga-ui/core';
|
|
8
8
|
import { TuiAccordion } from '@taiga-ui/experimental';
|
|
9
|
-
import { TuiCheckbox, TuiInputRange } from '@taiga-ui/kit';
|
|
9
|
+
import { TuiCheckbox, TuiInputRange, TuiRadio } from '@taiga-ui/kit';
|
|
10
10
|
import { isNil } from 'lodash-es';
|
|
11
|
-
import {
|
|
11
|
+
import { filter, map, share, switchMap, tap } from 'rxjs';
|
|
12
12
|
import { SC_CATALOG_PRODUCTS_FILTERS } from './tokens/sc-catalog-products-filters';
|
|
13
13
|
import { SC_CATALOG_SHOW_PRODUCTS_RECURSIVELY } from './tokens/sc-catalog-show-products-recursively';
|
|
14
14
|
import * as i0 from "@angular/core";
|
|
@@ -48,14 +48,13 @@ export class ScCatalogFiltersComponent {
|
|
|
48
48
|
* {@link Observable} фильтров категории.
|
|
49
49
|
*/
|
|
50
50
|
this.filters = toSignal(inject(SC_CATEGORY_INFO).pipe(filter(tuiIsPresent), switchMap((category) => this.catalogFilterService.getFilters$(this.idOrSlugPipe.transform(category), this.isRecursively)), map((filters) => filters.filter((item) => item.type !== 'range' || item.min !== item.max)), tap((filters) => {
|
|
51
|
-
// Обновляем состав контролов формы на основе полученных фильтров.
|
|
52
51
|
this.updateFormControls(filters);
|
|
53
52
|
}), share()));
|
|
54
53
|
/**
|
|
55
54
|
* FormGroup для фильтров.
|
|
56
55
|
*/
|
|
57
56
|
this.form = new FormGroup({});
|
|
58
|
-
this.form.valueChanges.pipe(
|
|
57
|
+
this.form.valueChanges.pipe(takeUntilDestroyed()).subscribe((filters) => {
|
|
59
58
|
this.catalogProductsFilters$.next(this.buildPropertyFilters(filters));
|
|
60
59
|
});
|
|
61
60
|
}
|
|
@@ -114,11 +113,17 @@ export class ScCatalogFiltersComponent {
|
|
|
114
113
|
return result;
|
|
115
114
|
}
|
|
116
115
|
/**
|
|
117
|
-
* Создает
|
|
116
|
+
* Создает контрол формы для фильтра типа checkbox.
|
|
117
|
+
*
|
|
118
|
+
* Если `isMultiple === false` — возвращает {@link FormControl} строкового идентификатора (логика radio),
|
|
119
|
+
* иначе — {@link FormGroup} независимых булевых контролов по идентификаторам значений.
|
|
118
120
|
*
|
|
119
121
|
* @param checkboxFilter Фильтр типа checkbox.
|
|
120
122
|
*/
|
|
121
123
|
createCheckboxFormControl(checkboxFilter) {
|
|
124
|
+
if (!checkboxFilter.isMultiple) {
|
|
125
|
+
return new FormControl(null);
|
|
126
|
+
}
|
|
122
127
|
const controls = {};
|
|
123
128
|
checkboxFilter.values.forEach((value) => {
|
|
124
129
|
controls[value.id] = new FormControl(false, { nonNullable: true });
|
|
@@ -150,7 +155,15 @@ export class ScCatalogFiltersComponent {
|
|
|
150
155
|
* @param controlValue Значение контрола формы.
|
|
151
156
|
*/
|
|
152
157
|
processCheckboxFilter(result, filterId, controlValue) {
|
|
153
|
-
// Для
|
|
158
|
+
// Для isMultiple === false: FormControl<string | null> -> string[] из одного выбранного ID.
|
|
159
|
+
if (typeof controlValue === 'string') {
|
|
160
|
+
if (controlValue) {
|
|
161
|
+
// eslint-disable-next-line security/detect-object-injection, no-param-reassign
|
|
162
|
+
result[filterId] = [controlValue];
|
|
163
|
+
}
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
// Для checkbox: FormGroup с FormControl<boolean> -> string[] (массив ID выбранных значений).
|
|
154
167
|
const selectedIds = Object.entries(controlValue)
|
|
155
168
|
.filter(([, isSelected]) => isSelected)
|
|
156
169
|
.map(([id]) => id);
|
|
@@ -191,10 +204,10 @@ export class ScCatalogFiltersComponent {
|
|
|
191
204
|
}
|
|
192
205
|
}
|
|
193
206
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScCatalogFiltersComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
194
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ScCatalogFiltersComponent, isStandalone: true, selector: "sc-catalog-filters", inputs: { isOpenAccordion: { classPropertyName: "isOpenAccordion", publicName: "isOpenAccordion", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (filters()?.length) {\n <div class=\"bg-tui-base-01 shadow-sc
|
|
207
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ScCatalogFiltersComponent, isStandalone: true, selector: "sc-catalog-filters", inputs: { isOpenAccordion: { classPropertyName: "isOpenAccordion", publicName: "isOpenAccordion", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (filters()?.length) {\n <div class=\"bg-tui-base-01 shadow-sc flex flex-col items-center gap-3 rounded-xl\">\n <tui-accordion class=\"accordion\">\n <button\n [tuiAccordion]=\"isOpenAccordion()\"\n appearance=\"primary\"\n >\n \u0424\u0438\u043B\u044C\u0442\u0440\u044B\n </button>\n <tui-expand>\n <form\n [formGroup]=\"form\"\n class=\"flex flex-col gap-4 pb-1\"\n >\n @for (filter of filters(); track filter.id) {\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-body-s font-medium\">{{ filter.label }}</label>\n\n @if (filter.type === 'checkbox') {\n @if (filter.isMultiple === false) {\n <div class=\"flex flex-col gap-2\">\n @for (value of filter.values; track value.id) {\n @let formControl = form.get(filter.id);\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"filter.id\"\n [value]=\"value.id\"\n tuiRadio\n (click)=\"formControl?.setValue(formControl?.value === value.id ? null : value.id)\"\n type=\"radio\"\n />\n <span class=\"text-body-s\">{{ value.label }}</span>\n </label>\n }\n </div>\n } @else {\n <div\n [formGroupName]=\"filter.id\"\n class=\"flex flex-col gap-2\"\n >\n @for (value of filter.values; track value.id) {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"value.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s\">{{ value.label }}</span>\n </label>\n }\n </div>\n }\n }\n\n @if (filter.type === 'range') {\n <tui-input-range\n [formControlName]=\"filter.id\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n />\n }\n\n @if (filter.type === 'toggle') {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"filter.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s\">\u0414\u0430</span>\n </label>\n }\n </div>\n }\n </form>\n </tui-expand>\n </tui-accordion>\n </div>\n}\n", styles: [".accordion [tuiAccordion]{border:none;mask:none}.accordion tui-expand{box-shadow:none}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: TuiCheckbox, selector: "input[type=\"checkbox\"][tuiCheckbox]", inputs: ["size"] }, { kind: "component", type: i2.TuiRadioComponent, selector: "input[type=\"radio\"][tuiRadio]", inputs: ["size"] }, { kind: "component", type: i2.TuiInputRangeComponent, selector: "tui-input-range", inputs: ["min", "max", "step", "segments", "keySteps", "prefix", "postfix", "quantum", "content"] }, { kind: "component", type: i3.TuiAccordionComponent, selector: "tui-accordion", inputs: ["closeOthers", "size"] }, { kind: "directive", type: i3.TuiAccordionDirective, selector: "button[tuiAccordion]", inputs: ["tuiAccordion"], outputs: ["tuiAccordionChange"] }, { kind: "component", type: i4.TuiExpand, selector: "tui-expand", inputs: ["expanded"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
195
208
|
}
|
|
196
209
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScCatalogFiltersComponent, decorators: [{
|
|
197
210
|
type: Component,
|
|
198
|
-
args: [{ standalone: true, selector: 'sc-catalog-filters', changeDetection: ChangeDetectionStrategy.OnPush, imports: [FormsModule, TuiTextfield, TuiCheckbox, TuiInputRange, TuiAccordion, ReactiveFormsModule], template: "@if (filters()?.length) {\n <div class=\"bg-tui-base-01 shadow-sc
|
|
211
|
+
args: [{ standalone: true, selector: 'sc-catalog-filters', changeDetection: ChangeDetectionStrategy.OnPush, imports: [FormsModule, TuiTextfield, TuiCheckbox, TuiRadio, TuiInputRange, TuiAccordion, ReactiveFormsModule], template: "@if (filters()?.length) {\n <div class=\"bg-tui-base-01 shadow-sc flex flex-col items-center gap-3 rounded-xl\">\n <tui-accordion class=\"accordion\">\n <button\n [tuiAccordion]=\"isOpenAccordion()\"\n appearance=\"primary\"\n >\n \u0424\u0438\u043B\u044C\u0442\u0440\u044B\n </button>\n <tui-expand>\n <form\n [formGroup]=\"form\"\n class=\"flex flex-col gap-4 pb-1\"\n >\n @for (filter of filters(); track filter.id) {\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-body-s font-medium\">{{ filter.label }}</label>\n\n @if (filter.type === 'checkbox') {\n @if (filter.isMultiple === false) {\n <div class=\"flex flex-col gap-2\">\n @for (value of filter.values; track value.id) {\n @let formControl = form.get(filter.id);\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"filter.id\"\n [value]=\"value.id\"\n tuiRadio\n (click)=\"formControl?.setValue(formControl?.value === value.id ? null : value.id)\"\n type=\"radio\"\n />\n <span class=\"text-body-s\">{{ value.label }}</span>\n </label>\n }\n </div>\n } @else {\n <div\n [formGroupName]=\"filter.id\"\n class=\"flex flex-col gap-2\"\n >\n @for (value of filter.values; track value.id) {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"value.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s\">{{ value.label }}</span>\n </label>\n }\n </div>\n }\n }\n\n @if (filter.type === 'range') {\n <tui-input-range\n [formControlName]=\"filter.id\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n />\n }\n\n @if (filter.type === 'toggle') {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"filter.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s\">\u0414\u0430</span>\n </label>\n }\n </div>\n }\n </form>\n </tui-expand>\n </tui-accordion>\n </div>\n}\n", styles: [".accordion [tuiAccordion]{border:none;mask:none}.accordion tui-expand{box-shadow:none}\n"] }]
|
|
199
212
|
}], ctorParameters: () => [] });
|
|
200
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtY2F0YWxvZy1maWx0ZXJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9jYXRhbG9nL2NhdGFsb2ctZmlsdGVycy9zYy1jYXRhbG9nLWZpbHRlcnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhdGFsb2cvY2F0YWxvZy1maWx0ZXJzL3NjLWNhdGFsb2ctZmlsdGVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFFM0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRixPQUFPLEVBQ0gsZ0JBQWdCLEVBRWhCLHNCQUFzQixFQUV0QixjQUFjLEdBSWpCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXhFLE9BQU8sRUFB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QVUsQ0FBQzthQUN0QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV2QixJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekIsK0VBQStFO1lBQy9FLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxXQUFXLENBQUM7UUFDbkMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLGtCQUFrQixDQUFDLE1BQXlCLEVBQUUsUUFBZ0IsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQW1CO1FBQ2hHLDhFQUE4RTtRQUM5RSwrRUFBK0U7UUFDL0UsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHO1lBQ2YsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUM7WUFDbEIsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUM7U0FDakIsQ0FBQztJQUNOLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSyxtQkFBbUIsQ0FBQyxNQUF5QixFQUFFLFFBQWdCLEVBQUUsWUFBcUI7UUFDMUYsOENBQThDO1FBQzlDLElBQUksWUFBWSxFQUFFLENBQUM7WUFDZiwrRUFBK0U7WUFDL0UsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFlBQVksQ0FBQztRQUNwQyxDQUFDO0lBQ0wsQ0FBQzsrR0ExTVEseUJBQXlCO21HQUF6Qix5QkFBeUIsZ1BDcEN0Qyw2eUZBNkRBLGlKRDNCYyxXQUFXLDZqQkFBZ0IsV0FBVywybkJBQStCLG1CQUFtQjs7NEZBRXpGLHlCQUF5QjtrQkFSckMsU0FBUztpQ0FDTSxJQUFJLFlBQ04sb0JBQW9CLG1CQUdiLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgY2xhc3MtbWV0aG9kcy11c2UtdGhpcyAqL1xuXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBpbmplY3QsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQsIHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICAgIFNDX0NBVEVHT1JZX0lORk8sXG4gICAgU2NDYXRhbG9nRmlsdGVyLFxuICAgIFNjQ2F0YWxvZ0ZpbHRlclNlcnZpY2UsXG4gICAgU2NJQ2hlY2tib3hGaWx0ZXIsXG4gICAgU2NJZE9yU2x1Z1BpcGUsXG4gICAgU2NQcm9wZXJ0eUZpbHRlcnMsXG4gICAgU2NSYW5nZUZpbHRlcixcbiAgICBTY1RvZ2dsZUZpbHRlcixcbn0gZnJvbSAnQHNuYWJjZW50ci9jbGllbnQtY29yZSc7XG5pbXBvcnQgeyB0dWlJc1ByZXNlbnQgfSBmcm9tICdAdGFpZ2EtdWkvY2RrJztcbmltcG9ydCB7IFR1aVRleHRmaWVsZCB9IGZyb20gJ0B0YWlnYS11aS9jb3JlJztcbmltcG9ydCB7IFR1aUFjY29yZGlvbiB9IGZyb20gJ0B0YWlnYS11aS9leHBlcmltZW50YWwnO1xuaW1wb3J0IHsgVHVpQ2hlY2tib3gsIFR1aUlucHV0UmFuZ2UgfSBmcm9tICdAdGFpZ2EtdWkva2l0JztcbmltcG9ydCB7IGlzTmlsIH0gZnJvbSAnbG9kYXNoLWVzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZmlsdGVyLCBtYXAsIHNoYXJlLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTQ19DQVRBTE9HX1BST0RVQ1RTX0ZJTFRFUlMgfSBmcm9tICcuL3Rva2Vucy9zYy1jYXRhbG9nLXByb2R1Y3RzLWZpbHRlcnMnO1xuaW1wb3J0IHsgU0NfQ0FUQUxPR19TSE9XX1BST0RVQ1RTX1JFQ1VSU0lWRUxZIH0gZnJvbSAnLi90b2tlbnMvc2MtY2F0YWxvZy1zaG93LXByb2R1Y3RzLXJlY3Vyc2l2ZWx5JztcblxuLyoqXG4gKiDQmtC+0LzQv9C+0L3QtdC90YIg0LLRi9Cy0L7QtNCwINGE0LjQu9GM0YLRgNC+0LIg0LrQsNGC0LDQu9C+0LPQsC5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ3NjLWNhdGFsb2ctZmlsdGVycycsXG4gICAgc3R5bGVVcmw6ICcuL3NjLWNhdGFsb2ctZmlsdGVycy5jb21wb25lbnQuc2NzcycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NjLWNhdGFsb2ctZmlsdGVycy5jb21wb25lbnQuaHRtbCcsXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgaW1wb3J0czogW0Zvcm1zTW9kdWxlLCBUdWlUZXh0ZmllbGQsIFR1aUNoZWNrYm94LCBUdWlJbnB1dFJhbmdlLCBUdWlBY2NvcmRpb24sIFJlYWN0aXZlRm9ybXNNb2R1bGVdLFxufSlcbmV4cG9ydCBjbGFzcyBTY0NhdGFsb2dGaWx0ZXJzQ29tcG9uZW50IHtcbiAgICAvKipcbiAgICAgKiDQodC+0YHRgtC+0Y/QvdC40LUg0L7RgtC60YDRi9GC0LjRjyBhY2NvcmRpb24uXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IGlzT3BlbkFjY29yZGlvbiA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDQtNC70Y8g0YDQsNCx0L7RgtGLINGBINGE0LjQu9GM0YLRgNCw0LzQuCDQutCw0YLQsNC70L7Qs9CwLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2F0YWxvZ0ZpbHRlclNlcnZpY2U6IFNjQ2F0YWxvZ0ZpbHRlclNlcnZpY2UgPSBpbmplY3QoU2NDYXRhbG9nRmlsdGVyU2VydmljZSk7XG5cbiAgICAvKipcbiAgICAgKiDQn9Cw0LnQvywg0LLQvtC30LLRgNCw0YnQsNGO0YnQuNC5INC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINC40LvQuCDRgdC40LzQstC+0LvRjNC90L7QtSDQvtCx0L7Qt9C90LDRh9C10L3QuNC1IChzbHVnKSDQuNGB0YXQvtC00Y8g0LjQtyDQvdCw0YHRgtGA0L7QtdC6INC+0LrRgNGD0LbQtdC90LjRjy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGlkT3JTbHVnUGlwZTogU2NJZE9yU2x1Z1BpcGUgPSBpbmplY3QoU2NJZE9yU2x1Z1BpcGUpO1xuXG4gICAgLyoqXG4gICAgICogU3ViamVjdCDQtNC70Y8g0YXRgNCw0L3QtdC90LjRjyDRhNC40LvRjNGC0YDQvtCyINC/0YDQvtC00YPQutGC0L7Qsi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhdGFsb2dQcm9kdWN0c0ZpbHRlcnMkID0gaW5qZWN0KFNDX0NBVEFMT0dfUFJPRFVDVFNfRklMVEVSUyk7XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0LjQt9C90LDQuiDQvdC10L7QsdGF0L7QtNC40LzQvtGB0YLQuCDQvtGC0L7QsdGA0LDQttCw0YLRjCDRhNC40LvRjNGC0YDRiyDQtNC70Y8g0LLQu9C+0LbQtdC90L3Ri9GFINC60LDRgtC10LPQvtGA0LjQuS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGlzUmVjdXJzaXZlbHkgPSBpbmplY3QoU0NfQ0FUQUxPR19TSE9XX1BST0RVQ1RTX1JFQ1VSU0lWRUxZKTtcblxuICAgIC8qKlxuICAgICAqIHtAbGluayBPYnNlcnZhYmxlfSDRhNC40LvRjNGC0YDQvtCyINC60LDRgtC10LPQvtGA0LjQuC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlsdGVycyA9IHRvU2lnbmFsKFxuICAgICAgICBpbmplY3QoU0NfQ0FURUdPUllfSU5GTykucGlwZShcbiAgICAgICAgICAgIGZpbHRlcih0dWlJc1ByZXNlbnQpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKChjYXRlZ29yeSkgPT4gdGhpcy5jYXRhbG9nRmlsdGVyU2VydmljZS5nZXRGaWx0ZXJzJCh0aGlzLmlkT3JTbHVnUGlwZS50cmFuc2Zvcm0oY2F0ZWdvcnkpLCB0aGlzLmlzUmVjdXJzaXZlbHkpKSxcbiAgICAgICAgICAgIG1hcCgoZmlsdGVycykgPT4gZmlsdGVycy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udHlwZSAhPT0gJ3JhbmdlJyB8fCBpdGVtLm1pbiAhPT0gaXRlbS5tYXgpKSxcbiAgICAgICAgICAgIHRhcCgoZmlsdGVycykgPT4ge1xuICAgICAgICAgICAgICAgIC8vINCe0LHQvdC+0LLQu9GP0LXQvCDRgdC+0YHRgtCw0LIg0LrQvtC90YLRgNC+0LvQvtCyINGE0L7RgNC80Ysg0L3QsCDQvtGB0L3QvtCy0LUg0L/QvtC70YPRh9C10L3QvdGL0YUg0YTQuNC70YzRgtGA0L7Qsi5cbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZvcm1Db250cm9scyhmaWx0ZXJzKTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc2hhcmUoKVxuICAgICAgICApXG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqIEZvcm1Hcm91cCDQtNC70Y8g0YTQuNC70YzRgtGA0L7Qsi5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgZm9ybSA9IG5ldyBGb3JtR3JvdXA8XG4gICAgICAgIFJlY29yZDxzdHJpbmcsIFJldHVyblR5cGU8dHlwZW9mIHRoaXMuY3JlYXRlQ2hlY2tib3hGb3JtQ29udHJvbD4gfCBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmNyZWF0ZVJhbmdlRm9ybUNvbnRyb2w+IHwgUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5jcmVhdGVUb2dnbGVGb3JtQ29udHJvbD4+XG4gICAgPih7fSk7XG5cbiAgICAvKipcbiAgICAgKiDQmNC90LjRhtC40LDQu9C40LfQuNGA0YPQtdGCINGN0LrQt9C10LzQv9C70Y/RgCDQutC70LDRgdGB0LAge0BsaW5rIFNjQ2F0YWxvZ0ZpbHRlcnNDb21wb25lbnR9LlxuICAgICAqL1xuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5mb3JtLnZhbHVlQ2hhbmdlcy5waXBlKGRlYm91bmNlVGltZSgwKSwgdGFrZVVudGlsRGVzdHJveWVkKCkpLnN1YnNjcmliZSgoZmlsdGVycykgPT4ge1xuICAgICAgICAgICAgdGhpcy5jYXRhbG9nUHJvZHVjdHNGaWx0ZXJzJC5uZXh0KHRoaXMuYnVpbGRQcm9wZXJ0eUZpbHRlcnMoZmlsdGVycykpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0L3QvtCy0LvRj9C10YIg0YHQvtGB0YLQsNCyINC60L7QvdGC0YDQvtC70L7QsiDRhNC+0YDQvNGLINC90LAg0L7RgdC90L7QstC1INC/0LXRgNC10LTQsNC90L3Ri9GFINGE0LjQu9GM0YLRgNC+0LIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmlsdGVycyDQnNCw0YHRgdC40LIg0YTQuNC70YzRgtGA0L7QsiDQtNC70Y8g0YHQvtC30LTQsNC90LjRjyDQutC+0L3RgtGA0L7Qu9C+0LIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHVwZGF0ZUZvcm1Db250cm9scyhmaWx0ZXJzOiBTY0NhdGFsb2dGaWx0ZXJbXSk6IHZvaWQge1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHMpLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZvcm0ucmVtb3ZlQ29udHJvbChrZXkgYXMgbmV2ZXIsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZmlsdGVycy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NoZWNrYm94JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woaXRlbS5pZCwgdGhpcy5jcmVhdGVDaGVja2JveEZvcm1Db250cm9sKGl0ZW0pLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3JhbmdlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woaXRlbS5pZCwgdGhpcy5jcmVhdGVSYW5nZUZvcm1Db250cm9sKGl0ZW0pLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3RvZ2dsZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKGl0ZW0uaWQsIHRoaXMuY3JlYXRlVG9nZ2xlRm9ybUNvbnRyb2woaXRlbSksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCf0YDQtdC+0LHRgNCw0LfRg9C10YIg0LfQvdCw0YfQtdC90LjRjyDRhNC+0YDQvNGLINCyINC+0LHRitC10LrRgiDRhNC40LvRjNGC0YDQvtCyINGB0LLQvtC50YHRgtCyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlINCX0L3QsNGH0LXQvdC40Y8g0YTQvtGA0LzRiy5cbiAgICAgKiBAcmV0dXJucyDQntCx0YrQtdC60YIg0YTQuNC70YzRgtGA0L7QsiDRgdCy0L7QudGB0YLQsi5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYnVpbGRQcm9wZXJ0eUZpbHRlcnModmFsdWU6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHwgW251bWJlciwgbnVtYmVyXT4+IHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBTY1Byb3BlcnR5RmlsdGVycyB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogU2NQcm9wZXJ0eUZpbHRlcnMgPSB7fTtcblxuICAgICAgICB0aGlzLmZpbHRlcnMoKT8uZm9yRWFjaCgoZmlsdGVySXRlbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbFZhbHVlID0gdmFsdWVbZmlsdGVySXRlbS5pZF0gYXMgYm9vbGVhbiB8IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHwgW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgaWYgKGlzTmlsKGNvbnRyb2xWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAoZmlsdGVySXRlbS50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2hlY2tib3gnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NDaGVja2JveEZpbHRlcihyZXN1bHQsIGZpbHRlckl0ZW0uaWQsIGNvbnRyb2xWYWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3JhbmdlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmFuZ2VGaWx0ZXIocmVzdWx0LCBmaWx0ZXJJdGVtLmlkLCBjb250cm9sVmFsdWUgYXMgW251bWJlciwgbnVtYmVyXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3RvZ2dsZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1RvZ2dsZUZpbHRlcihyZXN1bHQsIGZpbHRlckl0ZW0uaWQsIGNvbnRyb2xWYWx1ZSBhcyBib29sZWFuKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KHQvtC30LTQsNC10YIgRm9ybUdyb3VwINC00LvRjyBjaGVja2JveC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaGVja2JveEZpbHRlciDQpNC40LvRjNGC0YAg0YLQuNC/0LAgY2hlY2tib3guXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUNoZWNrYm94Rm9ybUNvbnRyb2woY2hlY2tib3hGaWx0ZXI6IFNjSUNoZWNrYm94RmlsdGVyKTogRm9ybUdyb3VwPFJlY29yZDxzdHJpbmcsIEZvcm1Db250cm9sPGJvb2xlYW4+Pj4ge1xuICAgICAgICBjb25zdCBjb250cm9sczogUmVjb3JkPHN0cmluZywgRm9ybUNvbnRyb2w8Ym9vbGVhbj4+ID0ge307XG4gICAgICAgIGNoZWNrYm94RmlsdGVyLnZhbHVlcy5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgY29udHJvbHNbdmFsdWUuaWRdID0gbmV3IEZvcm1Db250cm9sKGZhbHNlLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbmV3IEZvcm1Hcm91cChjb250cm9scyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KHQvtC30LTQsNC10YIgRm9ybUNvbnRyb2wg0LTQu9GPIHJhbmdlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHJhbmdlRmlsdGVyINCk0LjQu9GM0YLRgCDRgtC40L/QsCByYW5nZS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgY3JlYXRlUmFuZ2VGb3JtQ29udHJvbChyYW5nZUZpbHRlcjogU2NSYW5nZUZpbHRlcik6IEZvcm1Db250cm9sPFtudW1iZXIsIG51bWJlcl0+IHtcbiAgICAgICAgLy8gVE9ETzog0JTQvtCx0LDQstC40YLRjCB1cGRhdGVPbjogJ2JsdXInINC/0L7RgdC70LUg0LjRgdC/0YDQsNCy0LvQtdC90LjRjyDQsdCw0LPQsCDQsiB0YWlnYS11aS5cbiAgICAgICAgcmV0dXJuIG5ldyBGb3JtQ29udHJvbChbTnVtYmVyKHJhbmdlRmlsdGVyLnNlbGVjdGVkTWluID8/IHJhbmdlRmlsdGVyLm1pbiksIE51bWJlcihyYW5nZUZpbHRlci5zZWxlY3RlZE1heCA/PyByYW5nZUZpbHRlci5tYXgpXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LfQtNCw0LXRgiBGb3JtQ29udHJvbCDQtNC70Y8gdG9nZ2xlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRvZ2dsZUZpbHRlciDQpNC40LvRjNGC0YAg0YLQuNC/0LAgdG9nZ2xlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVUb2dnbGVGb3JtQ29udHJvbCh0b2dnbGVGaWx0ZXI6IFNjVG9nZ2xlRmlsdGVyKTogRm9ybUNvbnRyb2w8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1Db250cm9sKHRvZ2dsZUZpbHRlci5zZWxlY3RlZFZhbHVlID8/IGZhbHNlLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCe0LHRgNCw0LHQsNGC0YvQstCw0LXRgiBjaGVja2JveCDRhNC40LvRjNGC0YAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzdWx0INCe0LHRitC10LrRgiDRgNC10LfRg9C70YzRgtCw0YLQsCDQtNC70Y8g0LfQsNC/0L7Qu9C90LXQvdC40Y8uXG4gICAgICogQHBhcmFtIGZpbHRlcklkINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINGE0LjQu9GM0YLRgNCwLlxuICAgICAqIEBwYXJhbSBjb250cm9sVmFsdWUg0JfQvdCw0YfQtdC90LjQtSDQutC+0L3RgtGA0L7Qu9CwINGE0L7RgNC80YsuXG4gICAgICovXG4gICAgcHJpdmF0ZSBwcm9jZXNzQ2hlY2tib3hGaWx0ZXIocmVzdWx0OiBTY1Byb3BlcnR5RmlsdGVycywgZmlsdGVySWQ6IHN0cmluZywgY29udHJvbFZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPik6IHZvaWQge1xuICAgICAgICAvLyDQlNC70Y8gY2hlY2tib3g6IEZvcm1Hcm91cCDRgSBGb3JtQ29udHJvbDxib29sZWFuPiAtPiBzdHJpbmdbXSAo0LzQsNGB0YHQuNCyIElEINCy0YvQsdGA0LDQvdC90YvRhSDQt9C90LDRh9C10L3QuNC5KVxuICAgICAgICBjb25zdCBzZWxlY3RlZElkcyA9IE9iamVjdC5lbnRyaWVzKGNvbnRyb2xWYWx1ZSlcbiAgICAgICAgICAgIC5maWx0ZXIoKFssIGlzU2VsZWN0ZWRdKSA9PiBpc1NlbGVjdGVkKVxuICAgICAgICAgICAgLm1hcCgoW2lkXSkgPT4gaWQpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZElkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc2VjdXJpdHkvZGV0ZWN0LW9iamVjdC1pbmplY3Rpb24sIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICByZXN1bHRbZmlsdGVySWRdID0gc2VsZWN0ZWRJZHM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0YDQsNCx0LDRgtGL0LLQsNC10YIgcmFuZ2Ug0YTQuNC70YzRgtGALlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc3VsdCDQntCx0YrQtdC60YIg0YDQtdC30YPQu9GM0YLQsNGC0LAg0LTQu9GPINC30LDQv9C+0LvQvdC10L3QuNGPLlxuICAgICAqIEBwYXJhbSBmaWx0ZXJJZCDQmNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDRhNC40LvRjNGC0YDQsC5cbiAgICAgKiBAcGFyYW0gY29udHJvbFZhbHVlINCX0L3QsNGH0LXQvdC40LUg0LrQvtC90YLRgNC+0LvQsCDRhNC+0YDQvNGLLlxuICAgICAqIEBwYXJhbSBjb250cm9sVmFsdWUuMCDQndCw0YfQsNC70YzQvdC+0LUg0LfQvdCw0YfQtdC90LjQtSDQtNC40LDQv9Cw0LfQvtC90LAuXG4gICAgICogQHBhcmFtIGNvbnRyb2xWYWx1ZS4xINCa0L7QvdC10YfQvdC+0LUg0LfQvdCw0YfQtdC90LjQtSDQtNC40LDQv9Cw0LfQvtC90LAuXG4gICAgICovXG4gICAgcHJpdmF0ZSBwcm9jZXNzUmFuZ2VGaWx0ZXIocmVzdWx0OiBTY1Byb3BlcnR5RmlsdGVycywgZmlsdGVySWQ6IHN0cmluZywgW2Zyb20sIHRvXTogW251bWJlciwgbnVtYmVyXSk6IHZvaWQge1xuICAgICAgICAvLyDQlNC70Y8gcmFuZ2U6IEZvcm1Db250cm9sPFtudW1iZXIsIG51bWJlcl0+IC0+IHsgZnJvbT86IHN0cmluZzsgdG8/OiBzdHJpbmc7IH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNlY3VyaXR5L2RldGVjdC1vYmplY3QtaW5qZWN0aW9uLCBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICByZXN1bHRbZmlsdGVySWRdID0ge1xuICAgICAgICAgICAgZnJvbTogU3RyaW5nKGZyb20pLFxuICAgICAgICAgICAgdG86IFN0cmluZyh0byksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J7QsdGA0LDQsdCw0YLRi9Cy0LDQtdGCIHRvZ2dsZSDRhNC40LvRjNGC0YAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzdWx0INCe0LHRitC10LrRgiDRgNC10LfRg9C70YzRgtCw0YLQsCDQtNC70Y8g0LfQsNC/0L7Qu9C90LXQvdC40Y8uXG4gICAgICogQHBhcmFtIGZpbHRlcklkINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINGE0LjQu9GM0YLRgNCwLlxuICAgICAqIEBwYXJhbSBjb250cm9sVmFsdWUg0JfQvdCw0YfQtdC90LjQtSDQutC+0L3RgtGA0L7Qu9CwINGE0L7RgNC80YsuXG4gICAgICovXG4gICAgcHJpdmF0ZSBwcm9jZXNzVG9nZ2xlRmlsdGVyKHJlc3VsdDogU2NQcm9wZXJ0eUZpbHRlcnMsIGZpbHRlcklkOiBzdHJpbmcsIGNvbnRyb2xWYWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICAvLyDQlNC70Y8gdG9nZ2xlOiBGb3JtQ29udHJvbDxib29sZWFuPiAtPiBib29sZWFuXG4gICAgICAgIGlmIChjb250cm9sVmFsdWUpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzZWN1cml0eS9kZXRlY3Qtb2JqZWN0LWluamVjdGlvbiwgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIHJlc3VsdFtmaWx0ZXJJZF0gPSBjb250cm9sVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJAaWYgKGZpbHRlcnMoKT8ubGVuZ3RoKSB7XG4gICAgPGRpdiBjbGFzcz1cImJnLXR1aS1iYXNlLTAxIHNoYWRvdy1zYyBtYi00IGZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyIGdhcC0zIHJvdW5kZWQteGxcIj5cbiAgICAgICAgPHR1aS1hY2NvcmRpb24gY2xhc3M9XCJhY2NvcmRpb25cIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICBbdHVpQWNjb3JkaW9uXT1cImlzT3BlbkFjY29yZGlvbigpXCJcbiAgICAgICAgICAgICAgICBhcHBlYXJhbmNlPVwicHJpbWFyeVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAg0KTQuNC70YzRgtGA0YtcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPHR1aS1leHBhbmQ+XG4gICAgICAgICAgICAgICAgPGZvcm1cbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cF09XCJmb3JtXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00IHBiLTFcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAoZmlsdGVyIG9mIGZpbHRlcnMoKTsgdHJhY2sgZmlsdGVyLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInRleHQtYm9keS1zIGZvbnQtbWVkaXVtXCI+e3sgZmlsdGVyLmxhYmVsIH19PC9sYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoZmlsdGVyLnR5cGUgPT09ICdjaGVja2JveCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwiZmlsdGVyLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKHZhbHVlIG9mIGZpbHRlci52YWx1ZXM7IHRyYWNrIHZhbHVlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInZhbHVlLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1aUNoZWNrYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtYm9keS1zXCI+e3sgdmFsdWUubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChmaWx0ZXIudHlwZSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHVpLWlucHV0LXJhbmdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpbHRlci5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cIitmaWx0ZXIubWluXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwiK2ZpbHRlci5tYXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoZmlsdGVyLnR5cGUgPT09ICd0b2dnbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpbHRlci5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1ib2R5LXNcIj7QlNCwPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgPC90dWktZXhwYW5kPlxuICAgICAgICA8L3R1aS1hY2NvcmRpb24+XG4gICAgPC9kaXY+XG59XG4iXX0=
|
|
213
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtY2F0YWxvZy1maWx0ZXJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC11aS9jYXRhbG9nL2NhdGFsb2ctZmlsdGVycy9zYy1jYXRhbG9nLWZpbHRlcnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhdGFsb2cvY2F0YWxvZy1maWx0ZXJzL3NjLWNhdGFsb2ctZmlsdGVycy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFFM0MsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMxRSxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRixPQUFPLEVBQ0gsZ0JBQWdCLEVBRWhCLHNCQUFzQixFQUV0QixjQUFjLEdBSWpCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTFELE9BQU8sRUFB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LDZ1QkFBeUMsbUJBQW1COzs0RkFFbkcseUJBQXlCO2tCQVJyQyxTQUFTO2lDQUNNLElBQUksWUFDTixvQkFBb0IsbUJBR2IsdUJBQXVCLENBQUMsTUFBTSxXQUN0QyxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgY2xhc3MtbWV0aG9kcy11c2UtdGhpcyAqL1xuXG5pbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBpbmplY3QsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQsIHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge1xuICAgIFNDX0NBVEVHT1JZX0lORk8sXG4gICAgU2NDYXRhbG9nRmlsdGVyLFxuICAgIFNjQ2F0YWxvZ0ZpbHRlclNlcnZpY2UsXG4gICAgU2NJQ2hlY2tib3hGaWx0ZXIsXG4gICAgU2NJZE9yU2x1Z1BpcGUsXG4gICAgU2NQcm9wZXJ0eUZpbHRlcnMsXG4gICAgU2NSYW5nZUZpbHRlcixcbiAgICBTY1RvZ2dsZUZpbHRlcixcbn0gZnJvbSAnQHNuYWJjZW50ci9jbGllbnQtY29yZSc7XG5pbXBvcnQgeyB0dWlJc1ByZXNlbnQgfSBmcm9tICdAdGFpZ2EtdWkvY2RrJztcbmltcG9ydCB7IFR1aVRleHRmaWVsZCB9IGZyb20gJ0B0YWlnYS11aS9jb3JlJztcbmltcG9ydCB7IFR1aUFjY29yZGlvbiB9IGZyb20gJ0B0YWlnYS11aS9leHBlcmltZW50YWwnO1xuaW1wb3J0IHsgVHVpQ2hlY2tib3gsIFR1aUlucHV0UmFuZ2UsIFR1aVJhZGlvIH0gZnJvbSAnQHRhaWdhLXVpL2tpdCc7XG5pbXBvcnQgeyBpc05pbCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgc2hhcmUsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IFNDX0NBVEFMT0dfUFJPRFVDVFNfRklMVEVSUyB9IGZyb20gJy4vdG9rZW5zL3NjLWNhdGFsb2ctcHJvZHVjdHMtZmlsdGVycyc7XG5pbXBvcnQgeyBTQ19DQVRBTE9HX1NIT1dfUFJPRFVDVFNfUkVDVVJTSVZFTFkgfSBmcm9tICcuL3Rva2Vucy9zYy1jYXRhbG9nLXNob3ctcHJvZHVjdHMtcmVjdXJzaXZlbHknO1xuXG4vKipcbiAqINCa0L7QvNC/0L7QvdC10L3RgiDQstGL0LLQvtC00LAg0YTQuNC70YzRgtGA0L7QsiDQutCw0YLQsNC70L7Qs9CwLlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnc2MtY2F0YWxvZy1maWx0ZXJzJyxcbiAgICBzdHlsZVVybDogJy4vc2MtY2F0YWxvZy1maWx0ZXJzLmNvbXBvbmVudC5zY3NzJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2MtY2F0YWxvZy1maWx0ZXJzLmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICBpbXBvcnRzOiBbRm9ybXNNb2R1bGUsIFR1aVRleHRmaWVsZCwgVHVpQ2hlY2tib3gsIFR1aVJhZGlvLCBUdWlJbnB1dFJhbmdlLCBUdWlBY2NvcmRpb24sIFJlYWN0aXZlRm9ybXNNb2R1bGVdLFxufSlcbmV4cG9ydCBjbGFzcyBTY0NhdGFsb2dGaWx0ZXJzQ29tcG9uZW50IHtcbiAgICAvKipcbiAgICAgKiDQodC+0YHRgtC+0Y/QvdC40LUg0L7RgtC60YDRi9GC0LjRjyBhY2NvcmRpb24uXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IGlzT3BlbkFjY29yZGlvbiA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDQtNC70Y8g0YDQsNCx0L7RgtGLINGBINGE0LjQu9GM0YLRgNCw0LzQuCDQutCw0YLQsNC70L7Qs9CwLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2F0YWxvZ0ZpbHRlclNlcnZpY2U6IFNjQ2F0YWxvZ0ZpbHRlclNlcnZpY2UgPSBpbmplY3QoU2NDYXRhbG9nRmlsdGVyU2VydmljZSk7XG5cbiAgICAvKipcbiAgICAgKiDQn9Cw0LnQvywg0LLQvtC30LLRgNCw0YnQsNGO0YnQuNC5INC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINC40LvQuCDRgdC40LzQstC+0LvRjNC90L7QtSDQvtCx0L7Qt9C90LDRh9C10L3QuNC1IChzbHVnKSDQuNGB0YXQvtC00Y8g0LjQtyDQvdCw0YHRgtGA0L7QtdC6INC+0LrRgNGD0LbQtdC90LjRjy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGlkT3JTbHVnUGlwZTogU2NJZE9yU2x1Z1BpcGUgPSBpbmplY3QoU2NJZE9yU2x1Z1BpcGUpO1xuXG4gICAgLyoqXG4gICAgICogU3ViamVjdCDQtNC70Y8g0YXRgNCw0L3QtdC90LjRjyDRhNC40LvRjNGC0YDQvtCyINC/0YDQvtC00YPQutGC0L7Qsi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhdGFsb2dQcm9kdWN0c0ZpbHRlcnMkID0gaW5qZWN0KFNDX0NBVEFMT0dfUFJPRFVDVFNfRklMVEVSUyk7XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0LjQt9C90LDQuiDQvdC10L7QsdGF0L7QtNC40LzQvtGB0YLQuCDQvtGC0L7QsdGA0LDQttCw0YLRjCDRhNC40LvRjNGC0YDRiyDQtNC70Y8g0LLQu9C+0LbQtdC90L3Ri9GFINC60LDRgtC10LPQvtGA0LjQuS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGlzUmVjdXJzaXZlbHkgPSBpbmplY3QoU0NfQ0FUQUxPR19TSE9XX1BST0RVQ1RTX1JFQ1VSU0lWRUxZKTtcblxuICAgIC8qKlxuICAgICAqIHtAbGluayBPYnNlcnZhYmxlfSDRhNC40LvRjNGC0YDQvtCyINC60LDRgtC10LPQvtGA0LjQuC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlsdGVycyA9IHRvU2lnbmFsKFxuICAgICAgICBpbmplY3QoU0NfQ0FURUdPUllfSU5GTykucGlwZShcbiAgICAgICAgICAgIGZpbHRlcih0dWlJc1ByZXNlbnQpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKChjYXRlZ29yeSkgPT4gdGhpcy5jYXRhbG9nRmlsdGVyU2VydmljZS5nZXRGaWx0ZXJzJCh0aGlzLmlkT3JTbHVnUGlwZS50cmFuc2Zvcm0oY2F0ZWdvcnkpLCB0aGlzLmlzUmVjdXJzaXZlbHkpKSxcbiAgICAgICAgICAgIG1hcCgoZmlsdGVycykgPT4gZmlsdGVycy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udHlwZSAhPT0gJ3JhbmdlJyB8fCBpdGVtLm1pbiAhPT0gaXRlbS5tYXgpKSxcbiAgICAgICAgICAgIHRhcCgoZmlsdGVycykgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRm9ybUNvbnRyb2xzKGZpbHRlcnMpO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBzaGFyZSgpXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICogRm9ybUdyb3VwINC00LvRjyDRhNC40LvRjNGC0YDQvtCyLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBmb3JtID0gbmV3IEZvcm1Hcm91cDxcbiAgICAgICAgUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgdGhpcy5jcmVhdGVDaGVja2JveEZvcm1Db250cm9sPiB8IFJldHVyblR5cGU8dHlwZW9mIHRoaXMuY3JlYXRlUmFuZ2VGb3JtQ29udHJvbD4gfCBSZXR1cm5UeXBlPHR5cGVvZiB0aGlzLmNyZWF0ZVRvZ2dsZUZvcm1Db250cm9sPj5cbiAgICA+KHt9KTtcblxuICAgIC8qKlxuICAgICAqINCY0L3QuNGG0LjQsNC70LjQt9C40YDRg9C10YIg0Y3QutC30LXQvNC/0LvRj9GAINC60LvQsNGB0YHQsCB7QGxpbmsgU2NDYXRhbG9nRmlsdGVyc0NvbXBvbmVudH0uXG4gICAgICovXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpLnN1YnNjcmliZSgoZmlsdGVycykgPT4ge1xuICAgICAgICAgICAgdGhpcy5jYXRhbG9nUHJvZHVjdHNGaWx0ZXJzJC5uZXh0KHRoaXMuYnVpbGRQcm9wZXJ0eUZpbHRlcnMoZmlsdGVycykpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0L3QvtCy0LvRj9C10YIg0YHQvtGB0YLQsNCyINC60L7QvdGC0YDQvtC70L7QsiDRhNC+0YDQvNGLINC90LAg0L7RgdC90L7QstC1INC/0LXRgNC10LTQsNC90L3Ri9GFINGE0LjQu9GM0YLRgNC+0LIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZmlsdGVycyDQnNCw0YHRgdC40LIg0YTQuNC70YzRgtGA0L7QsiDQtNC70Y8g0YHQvtC30LTQsNC90LjRjyDQutC+0L3RgtGA0L7Qu9C+0LIuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHVwZGF0ZUZvcm1Db250cm9scyhmaWx0ZXJzOiBTY0NhdGFsb2dGaWx0ZXJbXSk6IHZvaWQge1xuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmZvcm0uY29udHJvbHMpLmZvckVhY2goKGtleTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZvcm0ucmVtb3ZlQ29udHJvbChrZXkgYXMgbmV2ZXIsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZmlsdGVycy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2NoZWNrYm94JzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woaXRlbS5pZCwgdGhpcy5jcmVhdGVDaGVja2JveEZvcm1Db250cm9sKGl0ZW0pLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3JhbmdlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woaXRlbS5pZCwgdGhpcy5jcmVhdGVSYW5nZUZvcm1Db250cm9sKGl0ZW0pLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3RvZ2dsZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5hZGRDb250cm9sKGl0ZW0uaWQsIHRoaXMuY3JlYXRlVG9nZ2xlRm9ybUNvbnRyb2woaXRlbSksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCf0YDQtdC+0LHRgNCw0LfRg9C10YIg0LfQvdCw0YfQtdC90LjRjyDRhNC+0YDQvNGLINCyINC+0LHRitC10LrRgiDRhNC40LvRjNGC0YDQvtCyINGB0LLQvtC50YHRgtCyLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlINCX0L3QsNGH0LXQvdC40Y8g0YTQvtGA0LzRiy5cbiAgICAgKiBAcmV0dXJucyDQntCx0YrQtdC60YIg0YTQuNC70YzRgtGA0L7QsiDRgdCy0L7QudGB0YLQsi5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgYnVpbGRQcm9wZXJ0eUZpbHRlcnModmFsdWU6IFBhcnRpYWw8UmVjb3JkPHN0cmluZywgYm9vbGVhbiB8IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHwgW251bWJlciwgbnVtYmVyXT4+IHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBTY1Byb3BlcnR5RmlsdGVycyB7XG4gICAgICAgIGNvbnN0IHJlc3VsdDogU2NQcm9wZXJ0eUZpbHRlcnMgPSB7fTtcblxuICAgICAgICB0aGlzLmZpbHRlcnMoKT8uZm9yRWFjaCgoZmlsdGVySXRlbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29udHJvbFZhbHVlID0gdmFsdWVbZmlsdGVySXRlbS5pZF0gYXMgYm9vbGVhbiB8IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+IHwgW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZDtcblxuICAgICAgICAgICAgaWYgKGlzTmlsKGNvbnRyb2xWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHN3aXRjaCAoZmlsdGVySXRlbS50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnY2hlY2tib3gnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NDaGVja2JveEZpbHRlcihyZXN1bHQsIGZpbHRlckl0ZW0uaWQsIGNvbnRyb2xWYWx1ZSBhcyBzdHJpbmcgfCBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPik7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3JhbmdlJzpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUmFuZ2VGaWx0ZXIocmVzdWx0LCBmaWx0ZXJJdGVtLmlkLCBjb250cm9sVmFsdWUgYXMgW251bWJlciwgbnVtYmVyXSk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3RvZ2dsZSc6XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1RvZ2dsZUZpbHRlcihyZXN1bHQsIGZpbHRlckl0ZW0uaWQsIGNvbnRyb2xWYWx1ZSBhcyBib29sZWFuKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KHQvtC30LTQsNC10YIg0LrQvtC90YLRgNC+0Lsg0YTQvtGA0LzRiyDQtNC70Y8g0YTQuNC70YzRgtGA0LAg0YLQuNC/0LAgY2hlY2tib3guXG4gICAgICpcbiAgICAgKiDQldGB0LvQuCBgaXNNdWx0aXBsZSA9PT0gZmFsc2VgIOKAlCDQstC+0LfQstGA0LDRidCw0LXRgiB7QGxpbmsgRm9ybUNvbnRyb2x9INGB0YLRgNC+0LrQvtCy0L7Qs9C+INC40LTQtdC90YLQuNGE0LjQutCw0YLQvtGA0LAgKNC70L7Qs9C40LrQsCByYWRpbyksXG4gICAgICog0LjQvdCw0YfQtSDigJQge0BsaW5rIEZvcm1Hcm91cH0g0L3QtdC30LDQstC40YHQuNC80YvRhSDQsdGD0LvQtdCy0YvRhSDQutC+0L3RgtGA0L7Qu9C+0LIg0L/QviDQuNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgNCw0Lwg0LfQvdCw0YfQtdC90LjQuS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjaGVja2JveEZpbHRlciDQpNC40LvRjNGC0YAg0YLQuNC/0LAgY2hlY2tib3guXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZUNoZWNrYm94Rm9ybUNvbnRyb2woY2hlY2tib3hGaWx0ZXI6IFNjSUNoZWNrYm94RmlsdGVyKTogRm9ybUdyb3VwPFJlY29yZDxzdHJpbmcsIEZvcm1Db250cm9sPGJvb2xlYW4+Pj4gfCBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPiB7XG4gICAgICAgIGlmICghY2hlY2tib3hGaWx0ZXIuaXNNdWx0aXBsZSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPihudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNvbnRyb2xzOiBSZWNvcmQ8c3RyaW5nLCBGb3JtQ29udHJvbDxib29sZWFuPj4gPSB7fTtcbiAgICAgICAgY2hlY2tib3hGaWx0ZXIudmFsdWVzLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICBjb250cm9sc1t2YWx1ZS5pZF0gPSBuZXcgRm9ybUNvbnRyb2woZmFsc2UsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBuZXcgRm9ybUdyb3VwKGNvbnRyb2xzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LfQtNCw0LXRgiBGb3JtQ29udHJvbCDQtNC70Y8gcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmFuZ2VGaWx0ZXIg0KTQuNC70YzRgtGAINGC0LjQv9CwIHJhbmdlLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBjcmVhdGVSYW5nZUZvcm1Db250cm9sKHJhbmdlRmlsdGVyOiBTY1JhbmdlRmlsdGVyKTogRm9ybUNvbnRyb2w8W251bWJlciwgbnVtYmVyXT4ge1xuICAgICAgICAvLyBUT0RPOiDQlNC+0LHQsNCy0LjRgtGMIHVwZGF0ZU9uOiAnYmx1cicg0L/QvtGB0LvQtSDQuNGB0L/RgNCw0LLQu9C10L3QuNGPINCx0LDQs9CwINCyIHRhaWdhLXVpLlxuICAgICAgICByZXR1cm4gbmV3IEZvcm1Db250cm9sKFtOdW1iZXIocmFuZ2VGaWx0ZXIuc2VsZWN0ZWRNaW4gPz8gcmFuZ2VGaWx0ZXIubWluKSwgTnVtYmVyKHJhbmdlRmlsdGVyLnNlbGVjdGVkTWF4ID8/IHJhbmdlRmlsdGVyLm1heCldLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCh0L7Qt9C00LDQtdGCIEZvcm1Db250cm9sINC00LvRjyB0b2dnbGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdG9nZ2xlRmlsdGVyINCk0LjQu9GM0YLRgCDRgtC40L/QsCB0b2dnbGUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGNyZWF0ZVRvZ2dsZUZvcm1Db250cm9sKHRvZ2dsZUZpbHRlcjogU2NUb2dnbGVGaWx0ZXIpOiBGb3JtQ29udHJvbDxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybUNvbnRyb2wodG9nZ2xlRmlsdGVyLnNlbGVjdGVkVmFsdWUgPz8gZmFsc2UsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J7QsdGA0LDQsdCw0YLRi9Cy0LDQtdGCIGNoZWNrYm94INGE0LjQu9GM0YLRgC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByZXN1bHQg0J7QsdGK0LXQutGCINGA0LXQt9GD0LvRjNGC0LDRgtCwINC00LvRjyDQt9Cw0L/QvtC70L3QtdC90LjRjy5cbiAgICAgKiBAcGFyYW0gZmlsdGVySWQg0JjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0YTQuNC70YzRgtGA0LAuXG4gICAgICogQHBhcmFtIGNvbnRyb2xWYWx1ZSDQl9C90LDRh9C10L3QuNC1INC60L7QvdGC0YDQvtC70LAg0YTQvtGA0LzRiy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHByb2Nlc3NDaGVja2JveEZpbHRlcihyZXN1bHQ6IFNjUHJvcGVydHlGaWx0ZXJzLCBmaWx0ZXJJZDogc3RyaW5nLCBjb250cm9sVmFsdWU6IHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+KTogdm9pZCB7XG4gICAgICAgIC8vINCU0LvRjyBpc011bHRpcGxlID09PSBmYWxzZTogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4gLT4gc3RyaW5nW10g0LjQtyDQvtC00L3QvtCz0L4g0LLRi9Cx0YDQsNC90L3QvtCz0L4gSUQuXG4gICAgICAgIGlmICh0eXBlb2YgY29udHJvbFZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgaWYgKGNvbnRyb2xWYWx1ZSkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzZWN1cml0eS9kZXRlY3Qtb2JqZWN0LWluamVjdGlvbiwgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICByZXN1bHRbZmlsdGVySWRdID0gW2NvbnRyb2xWYWx1ZV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vINCU0LvRjyBjaGVja2JveDogRm9ybUdyb3VwINGBIEZvcm1Db250cm9sPGJvb2xlYW4+IC0+IHN0cmluZ1tdICjQvNCw0YHRgdC40LIgSUQg0LLRi9Cx0YDQsNC90L3Ri9GFINC30L3QsNGH0LXQvdC40LkpLlxuICAgICAgICBjb25zdCBzZWxlY3RlZElkcyA9IE9iamVjdC5lbnRyaWVzKGNvbnRyb2xWYWx1ZSlcbiAgICAgICAgICAgIC5maWx0ZXIoKFssIGlzU2VsZWN0ZWRdKSA9PiBpc1NlbGVjdGVkKVxuICAgICAgICAgICAgLm1hcCgoW2lkXSkgPT4gaWQpO1xuXG4gICAgICAgIGlmIChzZWxlY3RlZElkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgc2VjdXJpdHkvZGV0ZWN0LW9iamVjdC1pbmplY3Rpb24sIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgICAgICAgICByZXN1bHRbZmlsdGVySWRdID0gc2VsZWN0ZWRJZHM7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0YDQsNCx0LDRgtGL0LLQsNC10YIgcmFuZ2Ug0YTQuNC70YzRgtGALlxuICAgICAqXG4gICAgICogQHBhcmFtIHJlc3VsdCDQntCx0YrQtdC60YIg0YDQtdC30YPQu9GM0YLQsNGC0LAg0LTQu9GPINC30LDQv9C+0LvQvdC10L3QuNGPLlxuICAgICAqIEBwYXJhbSBmaWx0ZXJJZCDQmNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDRhNC40LvRjNGC0YDQsC5cbiAgICAgKiBAcGFyYW0gY29udHJvbFZhbHVlINCX0L3QsNGH0LXQvdC40LUg0LrQvtC90YLRgNC+0LvQsCDRhNC+0YDQvNGLLlxuICAgICAqIEBwYXJhbSBjb250cm9sVmFsdWUuMCDQndCw0YfQsNC70YzQvdC+0LUg0LfQvdCw0YfQtdC90LjQtSDQtNC40LDQv9Cw0LfQvtC90LAuXG4gICAgICogQHBhcmFtIGNvbnRyb2xWYWx1ZS4xINCa0L7QvdC10YfQvdC+0LUg0LfQvdCw0YfQtdC90LjQtSDQtNC40LDQv9Cw0LfQvtC90LAuXG4gICAgICovXG4gICAgcHJpdmF0ZSBwcm9jZXNzUmFuZ2VGaWx0ZXIocmVzdWx0OiBTY1Byb3BlcnR5RmlsdGVycywgZmlsdGVySWQ6IHN0cmluZywgW2Zyb20sIHRvXTogW251bWJlciwgbnVtYmVyXSk6IHZvaWQge1xuICAgICAgICAvLyDQlNC70Y8gcmFuZ2U6IEZvcm1Db250cm9sPFtudW1iZXIsIG51bWJlcl0+IC0+IHsgZnJvbT86IHN0cmluZzsgdG8/OiBzdHJpbmc7IH1cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNlY3VyaXR5L2RldGVjdC1vYmplY3QtaW5qZWN0aW9uLCBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICByZXN1bHRbZmlsdGVySWRdID0ge1xuICAgICAgICAgICAgZnJvbTogU3RyaW5nKGZyb20pLFxuICAgICAgICAgICAgdG86IFN0cmluZyh0byksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J7QsdGA0LDQsdCw0YLRi9Cy0LDQtdGCIHRvZ2dsZSDRhNC40LvRjNGC0YAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmVzdWx0INCe0LHRitC10LrRgiDRgNC10LfRg9C70YzRgtCw0YLQsCDQtNC70Y8g0LfQsNC/0L7Qu9C90LXQvdC40Y8uXG4gICAgICogQHBhcmFtIGZpbHRlcklkINCY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGAINGE0LjQu9GM0YLRgNCwLlxuICAgICAqIEBwYXJhbSBjb250cm9sVmFsdWUg0JfQvdCw0YfQtdC90LjQtSDQutC+0L3RgtGA0L7Qu9CwINGE0L7RgNC80YsuXG4gICAgICovXG4gICAgcHJpdmF0ZSBwcm9jZXNzVG9nZ2xlRmlsdGVyKHJlc3VsdDogU2NQcm9wZXJ0eUZpbHRlcnMsIGZpbHRlcklkOiBzdHJpbmcsIGNvbnRyb2xWYWx1ZTogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICAvLyDQlNC70Y8gdG9nZ2xlOiBGb3JtQ29udHJvbDxib29sZWFuPiAtPiBib29sZWFuXG4gICAgICAgIGlmIChjb250cm9sVmFsdWUpIHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzZWN1cml0eS9kZXRlY3Qtb2JqZWN0LWluamVjdGlvbiwgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgIHJlc3VsdFtmaWx0ZXJJZF0gPSBjb250cm9sVmFsdWU7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJAaWYgKGZpbHRlcnMoKT8ubGVuZ3RoKSB7XG4gICAgPGRpdiBjbGFzcz1cImJnLXR1aS1iYXNlLTAxIHNoYWRvdy1zYyBmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMyByb3VuZGVkLXhsXCI+XG4gICAgICAgIDx0dWktYWNjb3JkaW9uIGNsYXNzPVwiYWNjb3JkaW9uXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgW3R1aUFjY29yZGlvbl09XCJpc09wZW5BY2NvcmRpb24oKVwiXG4gICAgICAgICAgICAgICAgYXBwZWFyYW5jZT1cInByaW1hcnlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgINCk0LjQu9GM0YLRgNGLXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDx0dWktZXhwYW5kPlxuICAgICAgICAgICAgICAgIDxmb3JtXG4gICAgICAgICAgICAgICAgICAgIFtmb3JtR3JvdXBdPVwiZm9ybVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNCBwYi0xXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKGZpbHRlciBvZiBmaWx0ZXJzKCk7IHRyYWNrIGZpbHRlci5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJ0ZXh0LWJvZHktcyBmb250LW1lZGl1bVwiPnt7IGZpbHRlci5sYWJlbCB9fTwvbGFiZWw+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYgKGZpbHRlci50eXBlID09PSAnY2hlY2tib3gnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoZmlsdGVyLmlzTXVsdGlwbGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKHZhbHVlIG9mIGZpbHRlci52YWx1ZXM7IHRyYWNrIHZhbHVlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBsZXQgZm9ybUNvbnRyb2wgPSBmb3JtLmdldChmaWx0ZXIuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJmaWx0ZXIuaWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZS5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpUmFkaW9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZm9ybUNvbnRyb2w/LnNldFZhbHVlKGZvcm1Db250cm9sPy52YWx1ZSA9PT0gdmFsdWUuaWQgPyBudWxsIDogdmFsdWUuaWQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwicmFkaW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1ib2R5LXNcIj57eyB2YWx1ZS5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Zvcm1Hcm91cE5hbWVdPVwiZmlsdGVyLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IgKHZhbHVlIG9mIGZpbHRlci52YWx1ZXM7IHRyYWNrIHZhbHVlLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cInZhbHVlLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWJvZHktc1wiPnt7IHZhbHVlLmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmIChmaWx0ZXIudHlwZSA9PT0gJ3JhbmdlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHVpLWlucHV0LXJhbmdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpbHRlci5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cIitmaWx0ZXIubWluXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwiK2ZpbHRlci5tYXhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoZmlsdGVyLnR5cGUgPT09ICd0b2dnbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xOYW1lXT1cImZpbHRlci5pZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1ib2R5LXNcIj7QlNCwPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgPC90dWktZXhwYW5kPlxuICAgICAgICA8L3R1aS1hY2NvcmRpb24+XG4gICAgPC9kaXY+XG59XG4iXX0=
|
|
@@ -9,7 +9,7 @@ import { takeUntilDestroyed, toSignal, outputFromObservable, toObservable } from
|
|
|
9
9
|
import * as i4$1 from '@taiga-ui/cdk';
|
|
10
10
|
import { TuiDay, TuiTime, TuiValueTransformer, TUI_IS_MOBILE, tuiControlValue, tuiIsPresent, tuiMarkControlAsTouchedAndValidate, tuiIsFalsy, TuiAutoFocus, TuiRepeatTimes, TuiHovered, TuiDayRange, TuiMonth, tuiPure, tuiProvide, TUI_WINDOW_SIZE, TuiValidationError, TUI_TRUE_HANDLER } from '@taiga-ui/cdk';
|
|
11
11
|
import * as i2$1 from '@taiga-ui/kit';
|
|
12
|
-
import { TUI_DATE_VALUE_TRANSFORMER, TuiPreview, TuiAvatar, TuiAccordionItem, TuiElasticContainer, TuiAccordion, TuiFieldErrorPipe, TuiFilterByInputPipe, TuiStringifyContentPipe, TuiDataListWrapper, TuiButtonLoading, TuiSortCountriesPipe, TuiStepper, TuiCarousel, TuiPush, TuiCheckbox, TuiFiles, TuiChip, TuiInputNumber, TuiBadge, TuiTooltip, TuiHighlight, TuiLineClamp, TuiInputRange, tuiInputNumberOptionsProvider, TuiDataListWrapperComponent, TuiChevron, TuiSelect, TuiInputSlider, TuiTreeService, TuiTreeItemContent, TUI_TREE_START, TUI_TREE_CONTENT, TUI_TREE_LOADING, TUI_TREE_LOADER, TuiTree, TuiPreviewDialogService, TUI_CONFIRM, tuiItemsHandlersProvider as tuiItemsHandlersProvider$1, TuiPagination, TuiAccordionDirective, TuiAccordionItemContent, tuiFilesAccepted } from '@taiga-ui/kit';
|
|
12
|
+
import { TUI_DATE_VALUE_TRANSFORMER, TuiPreview, TuiAvatar, TuiAccordionItem, TuiElasticContainer, TuiAccordion, TuiFieldErrorPipe, TuiFilterByInputPipe, TuiStringifyContentPipe, TuiDataListWrapper, TuiButtonLoading, TuiSortCountriesPipe, TuiStepper, TuiCarousel, TuiPush, TuiCheckbox, TuiFiles, TuiChip, TuiInputNumber, TuiBadge, TuiTooltip, TuiHighlight, TuiLineClamp, TuiRadio, TuiInputRange, tuiInputNumberOptionsProvider, TuiDataListWrapperComponent, TuiChevron, TuiSelect, TuiInputSlider, TuiTreeService, TuiTreeItemContent, TUI_TREE_START, TUI_TREE_CONTENT, TUI_TREE_LOADING, TUI_TREE_LOADER, TuiTree, TuiPreviewDialogService, TUI_CONFIRM, tuiItemsHandlersProvider as tuiItemsHandlersProvider$1, TuiPagination, TuiAccordionDirective, TuiAccordionItemContent, tuiFilesAccepted } from '@taiga-ui/kit';
|
|
13
13
|
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
|
|
14
14
|
import * as i1$1 from '@angular/forms';
|
|
15
15
|
import { FormControl, FormGroupDirective, NgControl, FormGroup, Validators, FormArray, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
@@ -5633,14 +5633,13 @@ class ScCatalogFiltersComponent {
|
|
|
5633
5633
|
* {@link Observable} фильтров категории.
|
|
5634
5634
|
*/
|
|
5635
5635
|
this.filters = toSignal(inject(SC_CATEGORY_INFO).pipe(filter(tuiIsPresent), switchMap((category) => this.catalogFilterService.getFilters$(this.idOrSlugPipe.transform(category), this.isRecursively)), map((filters) => filters.filter((item) => item.type !== 'range' || item.min !== item.max)), tap((filters) => {
|
|
5636
|
-
// Обновляем состав контролов формы на основе полученных фильтров.
|
|
5637
5636
|
this.updateFormControls(filters);
|
|
5638
5637
|
}), share()));
|
|
5639
5638
|
/**
|
|
5640
5639
|
* FormGroup для фильтров.
|
|
5641
5640
|
*/
|
|
5642
5641
|
this.form = new FormGroup({});
|
|
5643
|
-
this.form.valueChanges.pipe(
|
|
5642
|
+
this.form.valueChanges.pipe(takeUntilDestroyed()).subscribe((filters) => {
|
|
5644
5643
|
this.catalogProductsFilters$.next(this.buildPropertyFilters(filters));
|
|
5645
5644
|
});
|
|
5646
5645
|
}
|
|
@@ -5699,11 +5698,17 @@ class ScCatalogFiltersComponent {
|
|
|
5699
5698
|
return result;
|
|
5700
5699
|
}
|
|
5701
5700
|
/**
|
|
5702
|
-
* Создает
|
|
5701
|
+
* Создает контрол формы для фильтра типа checkbox.
|
|
5702
|
+
*
|
|
5703
|
+
* Если `isMultiple === false` — возвращает {@link FormControl} строкового идентификатора (логика radio),
|
|
5704
|
+
* иначе — {@link FormGroup} независимых булевых контролов по идентификаторам значений.
|
|
5703
5705
|
*
|
|
5704
5706
|
* @param checkboxFilter Фильтр типа checkbox.
|
|
5705
5707
|
*/
|
|
5706
5708
|
createCheckboxFormControl(checkboxFilter) {
|
|
5709
|
+
if (!checkboxFilter.isMultiple) {
|
|
5710
|
+
return new FormControl(null);
|
|
5711
|
+
}
|
|
5707
5712
|
const controls = {};
|
|
5708
5713
|
checkboxFilter.values.forEach((value) => {
|
|
5709
5714
|
controls[value.id] = new FormControl(false, { nonNullable: true });
|
|
@@ -5735,7 +5740,15 @@ class ScCatalogFiltersComponent {
|
|
|
5735
5740
|
* @param controlValue Значение контрола формы.
|
|
5736
5741
|
*/
|
|
5737
5742
|
processCheckboxFilter(result, filterId, controlValue) {
|
|
5738
|
-
// Для
|
|
5743
|
+
// Для isMultiple === false: FormControl<string | null> -> string[] из одного выбранного ID.
|
|
5744
|
+
if (typeof controlValue === 'string') {
|
|
5745
|
+
if (controlValue) {
|
|
5746
|
+
// eslint-disable-next-line security/detect-object-injection, no-param-reassign
|
|
5747
|
+
result[filterId] = [controlValue];
|
|
5748
|
+
}
|
|
5749
|
+
return;
|
|
5750
|
+
}
|
|
5751
|
+
// Для checkbox: FormGroup с FormControl<boolean> -> string[] (массив ID выбранных значений).
|
|
5739
5752
|
const selectedIds = Object.entries(controlValue)
|
|
5740
5753
|
.filter(([, isSelected]) => isSelected)
|
|
5741
5754
|
.map(([id]) => id);
|
|
@@ -5776,11 +5789,11 @@ class ScCatalogFiltersComponent {
|
|
|
5776
5789
|
}
|
|
5777
5790
|
}
|
|
5778
5791
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScCatalogFiltersComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5779
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ScCatalogFiltersComponent, isStandalone: true, selector: "sc-catalog-filters", inputs: { isOpenAccordion: { classPropertyName: "isOpenAccordion", publicName: "isOpenAccordion", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (filters()?.length) {\n <div class=\"bg-tui-base-01 shadow-sc
|
|
5792
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ScCatalogFiltersComponent, isStandalone: true, selector: "sc-catalog-filters", inputs: { isOpenAccordion: { classPropertyName: "isOpenAccordion", publicName: "isOpenAccordion", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (filters()?.length) {\n <div class=\"bg-tui-base-01 shadow-sc flex flex-col items-center gap-3 rounded-xl\">\n <tui-accordion class=\"accordion\">\n <button\n [tuiAccordion]=\"isOpenAccordion()\"\n appearance=\"primary\"\n >\n \u0424\u0438\u043B\u044C\u0442\u0440\u044B\n </button>\n <tui-expand>\n <form\n [formGroup]=\"form\"\n class=\"flex flex-col gap-4 pb-1\"\n >\n @for (filter of filters(); track filter.id) {\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-body-s font-medium\">{{ filter.label }}</label>\n\n @if (filter.type === 'checkbox') {\n @if (filter.isMultiple === false) {\n <div class=\"flex flex-col gap-2\">\n @for (value of filter.values; track value.id) {\n @let formControl = form.get(filter.id);\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"filter.id\"\n [value]=\"value.id\"\n tuiRadio\n (click)=\"formControl?.setValue(formControl?.value === value.id ? null : value.id)\"\n type=\"radio\"\n />\n <span class=\"text-body-s\">{{ value.label }}</span>\n </label>\n }\n </div>\n } @else {\n <div\n [formGroupName]=\"filter.id\"\n class=\"flex flex-col gap-2\"\n >\n @for (value of filter.values; track value.id) {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"value.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s\">{{ value.label }}</span>\n </label>\n }\n </div>\n }\n }\n\n @if (filter.type === 'range') {\n <tui-input-range\n [formControlName]=\"filter.id\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n />\n }\n\n @if (filter.type === 'toggle') {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"filter.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s\">\u0414\u0430</span>\n </label>\n }\n </div>\n }\n </form>\n </tui-expand>\n </tui-accordion>\n </div>\n}\n", styles: [".accordion [tuiAccordion]{border:none;mask:none}.accordion tui-expand{box-shadow:none}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1$1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: TuiCheckbox, selector: "input[type=\"checkbox\"][tuiCheckbox]", inputs: ["size"] }, { kind: "component", type: i2$1.TuiRadioComponent, selector: "input[type=\"radio\"][tuiRadio]", inputs: ["size"] }, { kind: "component", type: i2$1.TuiInputRangeComponent, selector: "tui-input-range", inputs: ["min", "max", "step", "segments", "keySteps", "prefix", "postfix", "quantum", "content"] }, { kind: "component", type: i1$3.TuiAccordionComponent, selector: "tui-accordion", inputs: ["closeOthers", "size"] }, { kind: "directive", type: i1$3.TuiAccordionDirective, selector: "button[tuiAccordion]", inputs: ["tuiAccordion"], outputs: ["tuiAccordionChange"] }, { kind: "component", type: i2$5.TuiExpand, selector: "tui-expand", inputs: ["expanded"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1$1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
5780
5793
|
}
|
|
5781
5794
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScCatalogFiltersComponent, decorators: [{
|
|
5782
5795
|
type: Component,
|
|
5783
|
-
args: [{ standalone: true, selector: 'sc-catalog-filters', changeDetection: ChangeDetectionStrategy.OnPush, imports: [FormsModule, TuiTextfield, TuiCheckbox, TuiInputRange, TuiAccordion$1, ReactiveFormsModule], template: "@if (filters()?.length) {\n <div class=\"bg-tui-base-01 shadow-sc
|
|
5796
|
+
args: [{ standalone: true, selector: 'sc-catalog-filters', changeDetection: ChangeDetectionStrategy.OnPush, imports: [FormsModule, TuiTextfield, TuiCheckbox, TuiRadio, TuiInputRange, TuiAccordion$1, ReactiveFormsModule], template: "@if (filters()?.length) {\n <div class=\"bg-tui-base-01 shadow-sc flex flex-col items-center gap-3 rounded-xl\">\n <tui-accordion class=\"accordion\">\n <button\n [tuiAccordion]=\"isOpenAccordion()\"\n appearance=\"primary\"\n >\n \u0424\u0438\u043B\u044C\u0442\u0440\u044B\n </button>\n <tui-expand>\n <form\n [formGroup]=\"form\"\n class=\"flex flex-col gap-4 pb-1\"\n >\n @for (filter of filters(); track filter.id) {\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-body-s font-medium\">{{ filter.label }}</label>\n\n @if (filter.type === 'checkbox') {\n @if (filter.isMultiple === false) {\n <div class=\"flex flex-col gap-2\">\n @for (value of filter.values; track value.id) {\n @let formControl = form.get(filter.id);\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"filter.id\"\n [value]=\"value.id\"\n tuiRadio\n (click)=\"formControl?.setValue(formControl?.value === value.id ? null : value.id)\"\n type=\"radio\"\n />\n <span class=\"text-body-s\">{{ value.label }}</span>\n </label>\n }\n </div>\n } @else {\n <div\n [formGroupName]=\"filter.id\"\n class=\"flex flex-col gap-2\"\n >\n @for (value of filter.values; track value.id) {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"value.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s\">{{ value.label }}</span>\n </label>\n }\n </div>\n }\n }\n\n @if (filter.type === 'range') {\n <tui-input-range\n [formControlName]=\"filter.id\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n />\n }\n\n @if (filter.type === 'toggle') {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"filter.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s\">\u0414\u0430</span>\n </label>\n }\n </div>\n }\n </form>\n </tui-expand>\n </tui-accordion>\n </div>\n}\n", styles: [".accordion [tuiAccordion]{border:none;mask:none}.accordion tui-expand{box-shadow:none}\n"] }]
|
|
5784
5797
|
}], ctorParameters: () => [] });
|
|
5785
5798
|
|
|
5786
5799
|
/* eslint-disable @typescript-eslint/unbound-method */
|