@snabcentr/client-ui 3.51.3 → 3.51.5
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/configurators/sandwich/sc-sandwich.component.d.ts +10 -6
- package/esm2022/configurators/sandwich/sc-sandwich.component.mjs +30 -24
- package/esm2022/order/draft/sc-draft.component.mjs +3 -3
- package/fesm2022/snabcentr-client-ui.mjs +29 -23
- package/fesm2022/snabcentr-client-ui.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { OnInit } from '@angular/core';
|
|
2
2
|
import { FormArray, FormControl, FormGroup, ValidatorFn } from '@angular/forms';
|
|
3
|
-
import { ScIConfiguratorCalculateResult, ScOrderItem, ScProduct } from '@snabcentr/client-core';
|
|
3
|
+
import { ScCart, ScIConfiguratorCalculateResult, ScIOrderEditorLoader, ScOrderDraft, ScOrderItem, ScProduct } from '@snabcentr/client-core';
|
|
4
4
|
import { Observable } from 'rxjs';
|
|
5
5
|
import { ScISandwichSettings } from '../models/sandwich/sc-i-sandwich-settings';
|
|
6
6
|
import * as i0 from "@angular/core";
|
|
@@ -27,7 +27,11 @@ export declare class ScSandwichComponent implements OnInit {
|
|
|
27
27
|
/**
|
|
28
28
|
* Позиция товара/услуги в корзине.
|
|
29
29
|
*/
|
|
30
|
-
readonly
|
|
30
|
+
readonly orderItem: import("@angular/core").InputSignal<ScOrderItem | undefined>;
|
|
31
|
+
/**
|
|
32
|
+
* Идентификатор заказа.
|
|
33
|
+
*/
|
|
34
|
+
orderId?: number;
|
|
31
35
|
/**
|
|
32
36
|
* Событие переключения отображения товаров.
|
|
33
37
|
*/
|
|
@@ -39,7 +43,7 @@ export declare class ScSandwichComponent implements OnInit {
|
|
|
39
43
|
productCategoryId: FormControl<number | null>;
|
|
40
44
|
configurator: FormControl<string | null>;
|
|
41
45
|
quantity: FormControl<number | null>;
|
|
42
|
-
marker: FormControl<string>;
|
|
46
|
+
marker: FormControl<string | null>;
|
|
43
47
|
items: FormArray<FormGroup<{
|
|
44
48
|
width: FormControl<number>;
|
|
45
49
|
length: FormControl<number>;
|
|
@@ -48,9 +52,9 @@ export declare class ScSandwichComponent implements OnInit {
|
|
|
48
52
|
calculationId: FormControl<string | null>;
|
|
49
53
|
}>;
|
|
50
54
|
/**
|
|
51
|
-
* Сервис
|
|
55
|
+
* Сервис получения и редактирования списка товаров заказа (корзина / заказ / черновик = заказ).
|
|
52
56
|
*/
|
|
53
|
-
|
|
57
|
+
protected readonly orderService: ScIOrderEditorLoader<ScOrderItem, ScCart | ScOrderDraft>;
|
|
54
58
|
/**
|
|
55
59
|
* Сервис конвертации данных.
|
|
56
60
|
*/
|
|
@@ -142,5 +146,5 @@ export declare class ScSandwichComponent implements OnInit {
|
|
|
142
146
|
*/
|
|
143
147
|
private setDefaultFormValue;
|
|
144
148
|
static ɵfac: i0.ɵɵFactoryDeclaration<ScSandwichComponent, never>;
|
|
145
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ScSandwichComponent, "sc-sandwich", never, { "settings": { "alias": "settings"; "required": false; "isSignal": true; }; "categoryId": { "alias": "categoryId"; "required": true; "isSignal": true; }; "editor": { "alias": "editor"; "required": true; "isSignal": true; }; "
|
|
149
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ScSandwichComponent, "sc-sandwich", never, { "settings": { "alias": "settings"; "required": false; "isSignal": true; }; "categoryId": { "alias": "categoryId"; "required": true; "isSignal": true; }; "editor": { "alias": "editor"; "required": true; "isSignal": true; }; "orderItem": { "alias": "orderItem"; "required": true; "isSignal": true; }; "orderId": { "alias": "orderId"; "required": false; }; }, { "toggleShowEvent": "toggleShowEvent"; }, never, never, true, never>;
|
|
146
150
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/unbound-method */
|
|
2
2
|
import { AsyncPipe } from '@angular/common';
|
|
3
3
|
import { HttpErrorResponse } from '@angular/common/http';
|
|
4
|
-
import { ChangeDetectionStrategy, Component, DestroyRef, inject, input, output, signal } from '@angular/core';
|
|
4
|
+
import { ChangeDetectionStrategy, Component, DestroyRef, inject, Input, input, output, signal } from '@angular/core';
|
|
5
5
|
import { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop';
|
|
6
6
|
import { FormArray, FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
7
|
-
import {
|
|
7
|
+
import { SC_ORDER_LOADER, ScCatalogService, ScConfiguratorService, ScConvertersService, } from '@snabcentr/client-core';
|
|
8
8
|
import { tuiControlValue } from '@taiga-ui/cdk';
|
|
9
9
|
import { TuiButton, TuiError, tuiItemsHandlersProvider, TuiLabel, TuiLoader, TuiNumberFormat, tuiNumberFormatProvider, TuiTextfield } from '@taiga-ui/core';
|
|
10
10
|
import { TuiButtonLoading, TuiChevron, TuiDataListWrapperComponent, TuiFieldErrorPipe, TuiInputNumber, tuiInputNumberOptionsProvider, TuiInputSlider, TuiSelect, } from '@taiga-ui/kit';
|
|
@@ -44,7 +44,7 @@ export class ScSandwichComponent {
|
|
|
44
44
|
/**
|
|
45
45
|
* Позиция товара/услуги в корзине.
|
|
46
46
|
*/
|
|
47
|
-
this.
|
|
47
|
+
this.orderItem = input.required();
|
|
48
48
|
/**
|
|
49
49
|
* Событие переключения отображения товаров.
|
|
50
50
|
*/
|
|
@@ -53,17 +53,17 @@ export class ScSandwichComponent {
|
|
|
53
53
|
* Форма добавления/редактирования продукта в корзине.
|
|
54
54
|
*/
|
|
55
55
|
this.form = new FormGroup({
|
|
56
|
-
productCategoryId: new FormControl(null, { validators: Validators.required
|
|
57
|
-
configurator: new FormControl(null, { validators: Validators.required
|
|
58
|
-
quantity: new FormControl(null, { validators: [Validators.required, stepValidator(1)]
|
|
59
|
-
marker: new FormControl(
|
|
56
|
+
productCategoryId: new FormControl(null, { validators: Validators.required }),
|
|
57
|
+
configurator: new FormControl(null, { validators: Validators.required }),
|
|
58
|
+
quantity: new FormControl(null, { validators: [Validators.required, stepValidator(1)] }),
|
|
59
|
+
marker: new FormControl(null),
|
|
60
60
|
items: new FormArray([]),
|
|
61
|
-
calculationId: new FormControl(null
|
|
61
|
+
calculationId: new FormControl(null),
|
|
62
62
|
});
|
|
63
63
|
/**
|
|
64
|
-
* Сервис
|
|
64
|
+
* Сервис получения и редактирования списка товаров заказа (корзина / заказ / черновик = заказ).
|
|
65
65
|
*/
|
|
66
|
-
this.
|
|
66
|
+
this.orderService = inject(SC_ORDER_LOADER);
|
|
67
67
|
/**
|
|
68
68
|
* Сервис конвертации данных.
|
|
69
69
|
*/
|
|
@@ -212,13 +212,17 @@ export class ScSandwichComponent {
|
|
|
212
212
|
if (!calculateResult || this.form.invalid || this.isCalculateLoading()) {
|
|
213
213
|
return;
|
|
214
214
|
}
|
|
215
|
-
const formValue =
|
|
215
|
+
const formValue = this.convertersService.removeNull({
|
|
216
|
+
...this.form.value,
|
|
217
|
+
productId: this.product.value?.id ?? null,
|
|
218
|
+
calculationId: calculateResult.id,
|
|
219
|
+
});
|
|
216
220
|
// Удаляем items, так как они не нужны в {@link ScINewCartItemSandwich}.
|
|
217
221
|
delete formValue.items;
|
|
218
|
-
const
|
|
219
|
-
const newCartItem$ =
|
|
220
|
-
? this.
|
|
221
|
-
: this.
|
|
222
|
+
const orderData = this.orderItem();
|
|
223
|
+
const newCartItem$ = orderData
|
|
224
|
+
? this.orderService.updateProduct$(orderData.id, formValue, this.orderId).pipe(startWith(null))
|
|
225
|
+
: this.orderService.addProduct$(formValue, this.orderId);
|
|
222
226
|
this.isSubmitLoading.set(true);
|
|
223
227
|
newCartItem$
|
|
224
228
|
.pipe(tap(() => {
|
|
@@ -254,12 +258,12 @@ export class ScSandwichComponent {
|
|
|
254
258
|
this.form.reset({
|
|
255
259
|
productCategoryId: Number(this.categoryId()),
|
|
256
260
|
configurator: this.editor(),
|
|
257
|
-
quantity: this.
|
|
258
|
-
marker: this.
|
|
261
|
+
quantity: this.orderItem()?.quantity ?? null,
|
|
262
|
+
marker: this.orderItem()?.marker ?? '',
|
|
259
263
|
});
|
|
260
264
|
this.items.clear();
|
|
261
|
-
this.product.reset(this.
|
|
262
|
-
const configuratorParameters = this.
|
|
265
|
+
this.product.reset(this.orderItem()?.product ?? null);
|
|
266
|
+
const configuratorParameters = this.orderItem()?.configuratorParams;
|
|
263
267
|
configuratorParameters?.items.forEach((item) => {
|
|
264
268
|
this.items.push(this.createItemGroup({ width: item.width, length: item.length, count: item.count }));
|
|
265
269
|
});
|
|
@@ -268,7 +272,7 @@ export class ScSandwichComponent {
|
|
|
268
272
|
}
|
|
269
273
|
}
|
|
270
274
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScSandwichComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
271
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ScSandwichComponent, isStandalone: true, selector: "sc-sandwich", inputs: { settings: { classPropertyName: "settings", publicName: "settings", isSignal: true, isRequired: false, transformFunction: null }, categoryId: { classPropertyName: "categoryId", publicName: "categoryId", isSignal: true, isRequired: true, transformFunction: null }, editor: { classPropertyName: "editor", publicName: "editor", isSignal: true, isRequired: true, transformFunction: null },
|
|
275
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ScSandwichComponent, isStandalone: true, selector: "sc-sandwich", inputs: { settings: { classPropertyName: "settings", publicName: "settings", isSignal: true, isRequired: false, transformFunction: null }, categoryId: { classPropertyName: "categoryId", publicName: "categoryId", isSignal: true, isRequired: true, transformFunction: null }, editor: { classPropertyName: "editor", publicName: "editor", isSignal: true, isRequired: true, transformFunction: null }, orderItem: { classPropertyName: "orderItem", publicName: "orderItem", isSignal: true, isRequired: true, transformFunction: null }, orderId: { classPropertyName: "orderId", publicName: "orderId", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { toggleShowEvent: "toggleShowEvent" }, providers: [
|
|
272
276
|
tuiNumberFormatProvider({ precision: 0 }),
|
|
273
277
|
tuiInputNumberOptionsProvider({
|
|
274
278
|
min: 0,
|
|
@@ -277,7 +281,7 @@ export class ScSandwichComponent {
|
|
|
277
281
|
stringify: signal((x) => x.name),
|
|
278
282
|
identityMatcher: signal((a, b) => a.id === b.id),
|
|
279
283
|
}),
|
|
280
|
-
], ngImport: i0, template: "@if (!cartItem() && settings()?.allowShowTable) {\n <div class=\"mb-5 flex justify-center\">\n <button\n tuiButton\n appearance=\"secondary\"\n (click)=\"toggleShowEvent.emit()\"\n type=\"button\"\n iconStart=\"@tui.layout-list\"\n >\n \u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0432 \u0432\u0438\u0434\u0435 \u0441\u043F\u0438\u0441\u043A\u0430\n </button>\n </div>\n}\n<div class=\"\">\n @let calculateResult = calculateResult$ | async;\n @let products = products$ | async;\n @let productValue = product.value;\n @let validatorWidth = validatorWidth$ | async;\n @let validatorLength = validatorLength$ | async;\n\n <form\n [formGroup]=\"form\"\n (ngSubmit)=\"onSubmit(calculateResult)\"\n ScNextInputFocus\n class=\"flex flex-col gap-3\"\n >\n <label\n tuiLabel\n class=\"grow\"\n >\n \u0422\u043E\u0432\u0430\u0440\n <tui-textfield\n tuiChevron\n [tuiTextfieldCleaner]=\"false\"\n >\n <input\n tuiChevron\n tuiSelect\n [formControl]=\"product\"\n placeholder=\"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\"\n />\n\n <tui-data-list-wrapper\n *tuiTextfieldDropdown\n new\n [items]=\"products\"\n />\n </tui-textfield>\n @if (productValue) {\n <div class=\"ml-2 text-tui-text-secondary\">\n \u0421\u0442\u043E\u0438\u043C\u043E\u0441\u0442\u044C:\n <span class=\"font-bold\">{{ productValue.costRub?.toLocaleString() }} {{ productValue.currency.symbol }}/\u0448\u0442.</span>\n </div>\n }\n <tui-error\n [formControl]=\"product\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n @if (product.value && validatorWidth && validatorLength) {\n <p class=\"w-full font-bold\">\u0420\u0430\u0437\u043C\u0435\u0440\u044B \u0438\u0437\u0434\u0435\u043B\u0438\u0439</p>\n <p class=\"w-full\">\n \u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0448\u0438\u0440\u0438\u043D\u0430: {{ settings()?.minWidth }} \u043C\u043C.\n <br />\n \u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0448\u0438\u0440\u0438\u043D\u0430: {{ product.value.properties?.width }} \u043C\u043C.\n <br />\n \u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0434\u043B\u0438\u043D\u0430: {{ settings()?.minLength }} \u043C\u043C.\n <br />\n \u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0434\u043B\u0438\u043D\u0430: {{ product.value.properties?.length }} \u043C\u043C.\n <br />\n </p>\n <div\n formArrayName=\"items\"\n class=\"flex flex-col gap-3\"\n >\n @for (item of items.controls; track item) {\n <div\n class=\"flex grow gap-2\"\n [formGroupName]=\"$index\"\n >\n <div class=\"grid grow grid-cols-3 gap-2\">\n <label tuiLabel>\n \u0428\u0438\u0440\u0438\u043D\u0430, \u043C\u043C\n <tui-textfield>\n <input\n tuiInputSlider\n formControlName=\"width\"\n [min]=\"settings()?.minWidth ?? 0\"\n [max]=\"product.value.properties?.width ?? 0\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n placeholder=\"\u0428\u0438\u0440\u0438\u043D\u0430\"\n autocomplete=\"off\"\n />\n @if (product.value) {\n <input\n tuiSlider\n type=\"range\"\n />\n }\n </tui-textfield>\n @if (product.value) {\n <div class=\"slider-ticks-labels\">\n <span> 0 </span>\n <span>{{ product.value.properties?.width }}</span>\n </div>\n }\n <tui-error\n formControlName=\"width\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <label tuiLabel>\n \u0414\u043B\u0438\u043D\u0430, \u043C\u043C\n <tui-textfield>\n <input\n tuiInputSlider\n formControlName=\"length\"\n [min]=\"settings()?.minLength ?? 0\"\n [max]=\"product.value.properties?.length ?? 0\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n placeholder=\"\u0414\u043B\u0438\u043D\u0430\"\n autocomplete=\"off\"\n />\n @if (product.value) {\n <input\n tuiSlider\n type=\"range\"\n />\n }\n </tui-textfield>\n @if (product.value) {\n <div class=\"slider-ticks-labels\">\n <span> 0 </span>\n <span>{{ product.value.properties?.length }}</span>\n </div>\n }\n <tui-error\n formControlName=\"length\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n <label tuiLabel>\n <span class=\"whitespace-nowrap\">\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E, \u0448\u0442</span>\n <tui-textfield [tuiTextfieldCleaner]=\"false\">\n <input\n tuiInputNumber\n formControlName=\"count\"\n [min]=\"1\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n placeholder=\"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E\"\n autocomplete=\"off\"\n />\n </tui-textfield>\n <tui-error\n formControlName=\"count\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n </div>\n <button\n tuiIconButton\n (click)=\"removeItem($index)\"\n [disabled]=\"items.length <= 1\"\n size=\"m\"\n type=\"button\"\n iconStart=\"@tui.trash-2\"\n appearance=\"secondary\"\n class=\"mt-6\"\n [style.flex]=\"'0 0 auto'\"\n ></button>\n </div>\n }\n </div>\n <button\n tuiButton\n appearance=\"secondary\"\n [disabled]=\"items.invalid\"\n (click)=\"addItem()\"\n type=\"button\"\n class=\"self-center\"\n iconStart=\"@tui.plus\"\n >\n \u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0438\u0437\u0434\u0435\u043B\u0438\u0435\n </button>\n } @else if (product.value) {\n <tui-error error=\"\u0420\u0430\u0441\u0447\u0435\u0442 \u043F\u043E \u043F\u0440\u043E\u0434\u0443\u043A\u0442\u0443 \u043D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u0435\u043D. \u041E\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044C \u043A \u043C\u0435\u043D\u0435\u0434\u0436\u0435\u0440\u0443\" />\n }\n\n <label tuiLabel>\n \u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u043A\u0430 \u0440\u0430\u0441\u043F\u0438\u043B\u0430\n <tui-textfield>\n <input\n tuiTextfield\n formControlName=\"marker\"\n placeholder=\"\u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u043A\u0430 \u0440\u0430\u0441\u043F\u0438\u043B\u0430\"\n autocomplete=\"marker\"\n />\n </tui-textfield>\n\n <tui-error\n formControlName=\"marker\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n @if (product.value) {\n <tui-loader [showLoader]=\"isCalculateLoading()\">\n @if (calculateResult) {\n <div class=\"mt-2 flex flex-wrap items-end gap-2\">\n <div>\n \u0418\u0442\u043E\u0433\u043E: <span class=\"whitespace-nowrap text-xl font-bold\">{{ getTotalCost(calculateResult).toLocaleString() }} {{ product.value.currency.symbol }}</span>\n </div>\n @if (calculateResult?.quantity && productValue) {\n <div class=\"whitespace-nowrap text-lg text-sc-dark-grey\">\n <span class=\"font-bold\">({{ calculateResult.quantity }} \u0448\u0442.</span> x\n <span class=\"font-bold\">{{ productValue.costRub?.toLocaleString() }} {{ productValue.currency.symbol }}/\u0448\u0442.)</span>\n </div>\n }\n </div>\n }\n </tui-loader>\n }\n\n <tui-error [error]=\"[] | tuiFieldError | async\" />\n\n <button\n [disabled]=\"form.invalid || !calculateResult || isCalculateLoading() || isSubmitLoading()\"\n [loading]=\"isSubmitLoading()\"\n tuiButton\n class=\"self-center\"\n iconStart=\"@tui.check\"\n >\n {{ !cartItem() ? '\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0432 \u043A\u043E\u0440\u0437\u0438\u043D\u0443' : '\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C' }}\n </button>\n </form>\n</div>\n", styles: [":host{display:block;width:100%;max-width:30rem}.slider-ticks-labels{--t-offset: calc($thumb / 2);display:flex;font:var(--tui-font-text-s);margin-inline-start:var(--t-offset);margin-inline-end:var(--t-offset);color:var(--tui-text-secondary)}.slider-ticks-labels>*{position:relative;flex:2;text-align:center}.slider-ticks-labels>*:first-child{left:calc(-1 * var(--t-offset));inset-inline-start:calc(-1 * var(--t-offset));flex:1;text-align:start}.slider-ticks-labels>*:last-child{right:calc(-1 * var(--t-offset));flex:1;text-align:end}@supports (inset-inline-end: 0){.slider-ticks-labels>*:last-child{right:unset;inset-inline-end:calc(-1 * var(--t-offset))}}tui-input-slider+.slider-ticks-labels{margin-inline-start:calc(var(--tui-radius-m) / 2 + var(--t-offset))}tui-textfield+.slider-ticks-labels{--t-offset: calc(var(--tui-radius-m) / 2 + $thumb / 2)}tui-textfield[data-size=l]+.slider-ticks-labels{--t-offset: calc(var(--tui-radius-l) / 2 + $thumb / 2)}tui-input-range:not([new])+.slider-ticks-labels,tui-range+.slider-ticks-labels{--t-offset: $thumb}tui-input-range[new]+.slider-ticks-labels{--t-offset: calc(map-get($track-inset, $input-size) + $thumb)}\n"], dependencies: [{ kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { 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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: ScNextInputFocusModule }, { kind: "directive", type: i2.ScNextInputFocusDirective, selector: "form[ScNextInputFocus]" }, { kind: "directive", type: TuiLabel, selector: "label[tuiLabel]" }, { kind: "component", type: TuiDataListWrapperComponent, selector: "tui-data-list-wrapper:not([labels]), tui-data-list-wrapper:not([labels])[new]", inputs: ["items", "disabledItemHandler", "emptyContent", "size", "itemContent"], outputs: ["itemClick"] }, { kind: "component", type: TuiError, selector: "tui-error", inputs: ["error"] }, { kind: "component", type: i3.TuiTextfieldComponent, selector: "tui-textfield:not([multi])" }, { kind: "directive", type: i3.TuiTextfieldDirective, selector: "input[tuiTextfield]:not([tuiInputCard]):not([tuiInputExpire]):not([tuiInputCVC])" }, { kind: "directive", type: i3.TuiTextfieldOptionsDirective, selector: "[tuiTextfieldAppearance],[tuiTextfieldSize],[tuiTextfieldCleaner]", inputs: ["tuiTextfieldAppearance", "tuiTextfieldSize", "tuiTextfieldCleaner"] }, { kind: "directive", type: i3.TuiTextfieldDropdownDirective, selector: "ng-template[tuiTextfieldDropdown]" }, { kind: "directive", type: TuiChevron, selector: "[tuiChevron]", inputs: ["tuiChevron"] }, { kind: "directive", type: i4.TuiSelectDirective, selector: "input[tuiSelect]" }, { kind: "directive", type: i4.TuiInputNumberDirective, selector: "input[tuiInputNumber]", inputs: ["min", "max", "prefix", "postfix"] }, { kind: "directive", type: TuiNumberFormat, selector: "[tuiNumberFormat]", inputs: ["tuiNumberFormat"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: TuiFieldErrorPipe, name: "tuiFieldError" }, { kind: "component", type: i5.TuiSliderComponent, selector: "input[type=range][tuiSlider]", inputs: ["size", "segments"] }, { kind: "directive", type: i4.TuiInputSliderDirective, selector: "input[tuiInputSlider]" }, { kind: "directive", type: ScSelectOnFocusinDirective, selector: "tui-input-number, tui-input, tui-input-phone, tui-input-date, tui-input-password, input[tuiInputNumber], input[tuiTextfield], input[tuiInputSlider]" }, { kind: "component", type: TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "component", type: TuiButtonLoading, selector: "[tuiButton][loading],[tuiIconButton][loading]", inputs: ["size", "loading"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
284
|
+
], ngImport: i0, template: "@if (!orderItem() && settings()?.allowShowTable) {\n <div class=\"mb-5 flex justify-center\">\n <button\n tuiButton\n appearance=\"secondary\"\n (click)=\"toggleShowEvent.emit()\"\n type=\"button\"\n iconStart=\"@tui.layout-list\"\n >\n \u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0432 \u0432\u0438\u0434\u0435 \u0441\u043F\u0438\u0441\u043A\u0430\n </button>\n </div>\n}\n<div class=\"\">\n @let calculateResult = calculateResult$ | async;\n @let products = products$ | async;\n @let productValue = product.value;\n @let validatorWidth = validatorWidth$ | async;\n @let validatorLength = validatorLength$ | async;\n\n <form\n [formGroup]=\"form\"\n (ngSubmit)=\"onSubmit(calculateResult)\"\n ScNextInputFocus\n class=\"flex flex-col gap-3\"\n >\n <label\n tuiLabel\n class=\"grow\"\n >\n \u0422\u043E\u0432\u0430\u0440\n <tui-textfield\n tuiChevron\n [tuiTextfieldCleaner]=\"false\"\n >\n <input\n tuiChevron\n tuiSelect\n [formControl]=\"product\"\n placeholder=\"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\"\n />\n\n <tui-data-list-wrapper\n *tuiTextfieldDropdown\n new\n [items]=\"products\"\n />\n </tui-textfield>\n @if (productValue) {\n <div class=\"ml-2 text-tui-text-secondary\">\n \u0421\u0442\u043E\u0438\u043C\u043E\u0441\u0442\u044C:\n <span class=\"font-bold\">{{ productValue.costRub?.toLocaleString() }} {{ productValue.currency.symbol }}/\u0448\u0442.</span>\n </div>\n }\n <tui-error\n [formControl]=\"product\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n @if (product.value && validatorWidth && validatorLength) {\n <p class=\"w-full font-bold\">\u0420\u0430\u0437\u043C\u0435\u0440\u044B \u0438\u0437\u0434\u0435\u043B\u0438\u0439</p>\n <p class=\"w-full\">\n \u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0448\u0438\u0440\u0438\u043D\u0430: {{ settings()?.minWidth }} \u043C\u043C.\n <br />\n \u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0448\u0438\u0440\u0438\u043D\u0430: {{ product.value.properties?.width }} \u043C\u043C.\n <br />\n \u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0434\u043B\u0438\u043D\u0430: {{ settings()?.minLength }} \u043C\u043C.\n <br />\n \u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0434\u043B\u0438\u043D\u0430: {{ product.value.properties?.length }} \u043C\u043C.\n <br />\n </p>\n <div\n formArrayName=\"items\"\n class=\"flex flex-col gap-3\"\n >\n @for (item of items.controls; track item) {\n <div\n class=\"flex grow gap-2\"\n [formGroupName]=\"$index\"\n >\n <div class=\"grid grow grid-cols-3 gap-2\">\n <label tuiLabel>\n \u0428\u0438\u0440\u0438\u043D\u0430, \u043C\u043C\n <tui-textfield>\n <input\n tuiInputSlider\n formControlName=\"width\"\n [min]=\"settings()?.minWidth ?? 0\"\n [max]=\"product.value.properties?.width ?? 0\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n placeholder=\"\u0428\u0438\u0440\u0438\u043D\u0430\"\n autocomplete=\"off\"\n />\n @if (product.value) {\n <input\n tuiSlider\n type=\"range\"\n />\n }\n </tui-textfield>\n @if (product.value) {\n <div class=\"slider-ticks-labels\">\n <span> 0 </span>\n <span>{{ product.value.properties?.width }}</span>\n </div>\n }\n <tui-error\n formControlName=\"width\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <label tuiLabel>\n \u0414\u043B\u0438\u043D\u0430, \u043C\u043C\n <tui-textfield>\n <input\n tuiInputSlider\n formControlName=\"length\"\n [min]=\"settings()?.minLength ?? 0\"\n [max]=\"product.value.properties?.length ?? 0\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n placeholder=\"\u0414\u043B\u0438\u043D\u0430\"\n autocomplete=\"off\"\n />\n @if (product.value) {\n <input\n tuiSlider\n type=\"range\"\n />\n }\n </tui-textfield>\n @if (product.value) {\n <div class=\"slider-ticks-labels\">\n <span> 0 </span>\n <span>{{ product.value.properties?.length }}</span>\n </div>\n }\n <tui-error\n formControlName=\"length\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n <label tuiLabel>\n <span class=\"whitespace-nowrap\">\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E, \u0448\u0442</span>\n <tui-textfield [tuiTextfieldCleaner]=\"false\">\n <input\n tuiInputNumber\n formControlName=\"count\"\n [min]=\"1\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n placeholder=\"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E\"\n autocomplete=\"off\"\n />\n </tui-textfield>\n <tui-error\n formControlName=\"count\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n </div>\n <button\n tuiIconButton\n (click)=\"removeItem($index)\"\n [disabled]=\"items.length <= 1\"\n size=\"m\"\n type=\"button\"\n iconStart=\"@tui.trash-2\"\n appearance=\"secondary\"\n class=\"mt-6\"\n [style.flex]=\"'0 0 auto'\"\n ></button>\n </div>\n }\n </div>\n <button\n tuiButton\n appearance=\"secondary\"\n [disabled]=\"items.invalid\"\n (click)=\"addItem()\"\n type=\"button\"\n class=\"self-center\"\n iconStart=\"@tui.plus\"\n >\n \u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0438\u0437\u0434\u0435\u043B\u0438\u0435\n </button>\n } @else if (product.value) {\n <tui-error error=\"\u0420\u0430\u0441\u0447\u0435\u0442 \u043F\u043E \u043F\u0440\u043E\u0434\u0443\u043A\u0442\u0443 \u043D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u0435\u043D. \u041E\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044C \u043A \u043C\u0435\u043D\u0435\u0434\u0436\u0435\u0440\u0443\" />\n }\n\n <label tuiLabel>\n \u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u043A\u0430 \u0440\u0430\u0441\u043F\u0438\u043B\u0430\n <tui-textfield>\n <input\n tuiTextfield\n formControlName=\"marker\"\n placeholder=\"\u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u043A\u0430 \u0440\u0430\u0441\u043F\u0438\u043B\u0430\"\n autocomplete=\"marker\"\n />\n </tui-textfield>\n\n <tui-error\n formControlName=\"marker\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n @if (product.value) {\n <tui-loader [showLoader]=\"isCalculateLoading()\">\n @if (calculateResult) {\n <div class=\"mt-2 flex flex-wrap items-end gap-2\">\n <div>\n \u0418\u0442\u043E\u0433\u043E: <span class=\"whitespace-nowrap text-xl font-bold\">{{ getTotalCost(calculateResult).toLocaleString() }} {{ product.value.currency.symbol }}</span>\n </div>\n @if (calculateResult?.quantity && productValue) {\n <div class=\"whitespace-nowrap text-lg text-sc-dark-grey\">\n <span class=\"font-bold\">({{ calculateResult.quantity }} \u0448\u0442.</span> x\n <span class=\"font-bold\">{{ productValue.costRub?.toLocaleString() }} {{ productValue.currency.symbol }}/\u0448\u0442.)</span>\n </div>\n }\n </div>\n }\n </tui-loader>\n }\n\n <tui-error [error]=\"[] | tuiFieldError | async\" />\n\n <button\n [disabled]=\"form.invalid || !calculateResult || isCalculateLoading() || isSubmitLoading()\"\n [loading]=\"isSubmitLoading()\"\n tuiButton\n class=\"self-center\"\n iconStart=\"@tui.check\"\n >\n {{ !orderItem() ? '\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0432 \u043A\u043E\u0440\u0437\u0438\u043D\u0443' : '\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C' }}\n </button>\n </form>\n</div>\n", styles: [":host{display:block;width:100%;max-width:30rem}.slider-ticks-labels{--t-offset: calc($thumb / 2);display:flex;font:var(--tui-font-text-s);margin-inline-start:var(--t-offset);margin-inline-end:var(--t-offset);color:var(--tui-text-secondary)}.slider-ticks-labels>*{position:relative;flex:2;text-align:center}.slider-ticks-labels>*:first-child{left:calc(-1 * var(--t-offset));inset-inline-start:calc(-1 * var(--t-offset));flex:1;text-align:start}.slider-ticks-labels>*:last-child{right:calc(-1 * var(--t-offset));flex:1;text-align:end}@supports (inset-inline-end: 0){.slider-ticks-labels>*:last-child{right:unset;inset-inline-end:calc(-1 * var(--t-offset))}}tui-input-slider+.slider-ticks-labels{margin-inline-start:calc(var(--tui-radius-m) / 2 + var(--t-offset))}tui-textfield+.slider-ticks-labels{--t-offset: calc(var(--tui-radius-m) / 2 + $thumb / 2)}tui-textfield[data-size=l]+.slider-ticks-labels{--t-offset: calc(var(--tui-radius-l) / 2 + $thumb / 2)}tui-input-range:not([new])+.slider-ticks-labels,tui-range+.slider-ticks-labels{--t-offset: $thumb}tui-input-range[new]+.slider-ticks-labels{--t-offset: calc(map-get($track-inset, $input-size) + $thumb)}\n"], dependencies: [{ kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { 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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: ScNextInputFocusModule }, { kind: "directive", type: i2.ScNextInputFocusDirective, selector: "form[ScNextInputFocus]" }, { kind: "directive", type: TuiLabel, selector: "label[tuiLabel]" }, { kind: "component", type: TuiDataListWrapperComponent, selector: "tui-data-list-wrapper:not([labels]), tui-data-list-wrapper:not([labels])[new]", inputs: ["items", "disabledItemHandler", "emptyContent", "size", "itemContent"], outputs: ["itemClick"] }, { kind: "component", type: TuiError, selector: "tui-error", inputs: ["error"] }, { kind: "component", type: i3.TuiTextfieldComponent, selector: "tui-textfield:not([multi])" }, { kind: "directive", type: i3.TuiTextfieldDirective, selector: "input[tuiTextfield]:not([tuiInputCard]):not([tuiInputExpire]):not([tuiInputCVC])" }, { kind: "directive", type: i3.TuiTextfieldOptionsDirective, selector: "[tuiTextfieldAppearance],[tuiTextfieldSize],[tuiTextfieldCleaner]", inputs: ["tuiTextfieldAppearance", "tuiTextfieldSize", "tuiTextfieldCleaner"] }, { kind: "directive", type: i3.TuiTextfieldDropdownDirective, selector: "ng-template[tuiTextfieldDropdown]" }, { kind: "directive", type: TuiChevron, selector: "[tuiChevron]", inputs: ["tuiChevron"] }, { kind: "directive", type: i4.TuiSelectDirective, selector: "input[tuiSelect]" }, { kind: "directive", type: i4.TuiInputNumberDirective, selector: "input[tuiInputNumber]", inputs: ["min", "max", "prefix", "postfix"] }, { kind: "directive", type: TuiNumberFormat, selector: "[tuiNumberFormat]", inputs: ["tuiNumberFormat"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: TuiFieldErrorPipe, name: "tuiFieldError" }, { kind: "component", type: i5.TuiSliderComponent, selector: "input[type=range][tuiSlider]", inputs: ["size", "segments"] }, { kind: "directive", type: i4.TuiInputSliderDirective, selector: "input[tuiInputSlider]" }, { kind: "directive", type: ScSelectOnFocusinDirective, selector: "tui-input-number, tui-input, tui-input-phone, tui-input-date, tui-input-password, input[tuiInputNumber], input[tuiTextfield], input[tuiInputSlider]" }, { kind: "component", type: TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "component", type: TuiButtonLoading, selector: "[tuiButton][loading],[tuiIconButton][loading]", inputs: ["size", "loading"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
281
285
|
}
|
|
282
286
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScSandwichComponent, decorators: [{
|
|
283
287
|
type: Component,
|
|
@@ -309,6 +313,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
309
313
|
stringify: signal((x) => x.name),
|
|
310
314
|
identityMatcher: signal((a, b) => a.id === b.id),
|
|
311
315
|
}),
|
|
312
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (!cartItem() && settings()?.allowShowTable) {\n <div class=\"mb-5 flex justify-center\">\n <button\n tuiButton\n appearance=\"secondary\"\n (click)=\"toggleShowEvent.emit()\"\n type=\"button\"\n iconStart=\"@tui.layout-list\"\n >\n \u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0432 \u0432\u0438\u0434\u0435 \u0441\u043F\u0438\u0441\u043A\u0430\n </button>\n </div>\n}\n<div class=\"\">\n @let calculateResult = calculateResult$ | async;\n @let products = products$ | async;\n @let productValue = product.value;\n @let validatorWidth = validatorWidth$ | async;\n @let validatorLength = validatorLength$ | async;\n\n <form\n [formGroup]=\"form\"\n (ngSubmit)=\"onSubmit(calculateResult)\"\n ScNextInputFocus\n class=\"flex flex-col gap-3\"\n >\n <label\n tuiLabel\n class=\"grow\"\n >\n \u0422\u043E\u0432\u0430\u0440\n <tui-textfield\n tuiChevron\n [tuiTextfieldCleaner]=\"false\"\n >\n <input\n tuiChevron\n tuiSelect\n [formControl]=\"product\"\n placeholder=\"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\"\n />\n\n <tui-data-list-wrapper\n *tuiTextfieldDropdown\n new\n [items]=\"products\"\n />\n </tui-textfield>\n @if (productValue) {\n <div class=\"ml-2 text-tui-text-secondary\">\n \u0421\u0442\u043E\u0438\u043C\u043E\u0441\u0442\u044C:\n <span class=\"font-bold\">{{ productValue.costRub?.toLocaleString() }} {{ productValue.currency.symbol }}/\u0448\u0442.</span>\n </div>\n }\n <tui-error\n [formControl]=\"product\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n @if (product.value && validatorWidth && validatorLength) {\n <p class=\"w-full font-bold\">\u0420\u0430\u0437\u043C\u0435\u0440\u044B \u0438\u0437\u0434\u0435\u043B\u0438\u0439</p>\n <p class=\"w-full\">\n \u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0448\u0438\u0440\u0438\u043D\u0430: {{ settings()?.minWidth }} \u043C\u043C.\n <br />\n \u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0448\u0438\u0440\u0438\u043D\u0430: {{ product.value.properties?.width }} \u043C\u043C.\n <br />\n \u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0434\u043B\u0438\u043D\u0430: {{ settings()?.minLength }} \u043C\u043C.\n <br />\n \u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0434\u043B\u0438\u043D\u0430: {{ product.value.properties?.length }} \u043C\u043C.\n <br />\n </p>\n <div\n formArrayName=\"items\"\n class=\"flex flex-col gap-3\"\n >\n @for (item of items.controls; track item) {\n <div\n class=\"flex grow gap-2\"\n [formGroupName]=\"$index\"\n >\n <div class=\"grid grow grid-cols-3 gap-2\">\n <label tuiLabel>\n \u0428\u0438\u0440\u0438\u043D\u0430, \u043C\u043C\n <tui-textfield>\n <input\n tuiInputSlider\n formControlName=\"width\"\n [min]=\"settings()?.minWidth ?? 0\"\n [max]=\"product.value.properties?.width ?? 0\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n placeholder=\"\u0428\u0438\u0440\u0438\u043D\u0430\"\n autocomplete=\"off\"\n />\n @if (product.value) {\n <input\n tuiSlider\n type=\"range\"\n />\n }\n </tui-textfield>\n @if (product.value) {\n <div class=\"slider-ticks-labels\">\n <span> 0 </span>\n <span>{{ product.value.properties?.width }}</span>\n </div>\n }\n <tui-error\n formControlName=\"width\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <label tuiLabel>\n \u0414\u043B\u0438\u043D\u0430, \u043C\u043C\n <tui-textfield>\n <input\n tuiInputSlider\n formControlName=\"length\"\n [min]=\"settings()?.minLength ?? 0\"\n [max]=\"product.value.properties?.length ?? 0\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n placeholder=\"\u0414\u043B\u0438\u043D\u0430\"\n autocomplete=\"off\"\n />\n @if (product.value) {\n <input\n tuiSlider\n type=\"range\"\n />\n }\n </tui-textfield>\n @if (product.value) {\n <div class=\"slider-ticks-labels\">\n <span> 0 </span>\n <span>{{ product.value.properties?.length }}</span>\n </div>\n }\n <tui-error\n formControlName=\"length\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n <label tuiLabel>\n <span class=\"whitespace-nowrap\">\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E, \u0448\u0442</span>\n <tui-textfield [tuiTextfieldCleaner]=\"false\">\n <input\n tuiInputNumber\n formControlName=\"count\"\n [min]=\"1\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n placeholder=\"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E\"\n autocomplete=\"off\"\n />\n </tui-textfield>\n <tui-error\n formControlName=\"count\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n </div>\n <button\n tuiIconButton\n (click)=\"removeItem($index)\"\n [disabled]=\"items.length <= 1\"\n size=\"m\"\n type=\"button\"\n iconStart=\"@tui.trash-2\"\n appearance=\"secondary\"\n class=\"mt-6\"\n [style.flex]=\"'0 0 auto'\"\n ></button>\n </div>\n }\n </div>\n <button\n tuiButton\n appearance=\"secondary\"\n [disabled]=\"items.invalid\"\n (click)=\"addItem()\"\n type=\"button\"\n class=\"self-center\"\n iconStart=\"@tui.plus\"\n >\n \u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0438\u0437\u0434\u0435\u043B\u0438\u0435\n </button>\n } @else if (product.value) {\n <tui-error error=\"\u0420\u0430\u0441\u0447\u0435\u0442 \u043F\u043E \u043F\u0440\u043E\u0434\u0443\u043A\u0442\u0443 \u043D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u0435\u043D. \u041E\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044C \u043A \u043C\u0435\u043D\u0435\u0434\u0436\u0435\u0440\u0443\" />\n }\n\n <label tuiLabel>\n \u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u043A\u0430 \u0440\u0430\u0441\u043F\u0438\u043B\u0430\n <tui-textfield>\n <input\n tuiTextfield\n formControlName=\"marker\"\n placeholder=\"\u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u043A\u0430 \u0440\u0430\u0441\u043F\u0438\u043B\u0430\"\n autocomplete=\"marker\"\n />\n </tui-textfield>\n\n <tui-error\n formControlName=\"marker\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n @if (product.value) {\n <tui-loader [showLoader]=\"isCalculateLoading()\">\n @if (calculateResult) {\n <div class=\"mt-2 flex flex-wrap items-end gap-2\">\n <div>\n \u0418\u0442\u043E\u0433\u043E: <span class=\"whitespace-nowrap text-xl font-bold\">{{ getTotalCost(calculateResult).toLocaleString() }} {{ product.value.currency.symbol }}</span>\n </div>\n @if (calculateResult?.quantity && productValue) {\n <div class=\"whitespace-nowrap text-lg text-sc-dark-grey\">\n <span class=\"font-bold\">({{ calculateResult.quantity }} \u0448\u0442.</span> x\n <span class=\"font-bold\">{{ productValue.costRub?.toLocaleString() }} {{ productValue.currency.symbol }}/\u0448\u0442.)</span>\n </div>\n }\n </div>\n }\n </tui-loader>\n }\n\n <tui-error [error]=\"[] | tuiFieldError | async\" />\n\n <button\n [disabled]=\"form.invalid || !calculateResult || isCalculateLoading() || isSubmitLoading()\"\n [loading]=\"isSubmitLoading()\"\n tuiButton\n class=\"self-center\"\n iconStart=\"@tui.check\"\n >\n {{ !cartItem() ? '\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0432 \u043A\u043E\u0440\u0437\u0438\u043D\u0443' : '\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C' }}\n </button>\n </form>\n</div>\n", styles: [":host{display:block;width:100%;max-width:30rem}.slider-ticks-labels{--t-offset: calc($thumb / 2);display:flex;font:var(--tui-font-text-s);margin-inline-start:var(--t-offset);margin-inline-end:var(--t-offset);color:var(--tui-text-secondary)}.slider-ticks-labels>*{position:relative;flex:2;text-align:center}.slider-ticks-labels>*:first-child{left:calc(-1 * var(--t-offset));inset-inline-start:calc(-1 * var(--t-offset));flex:1;text-align:start}.slider-ticks-labels>*:last-child{right:calc(-1 * var(--t-offset));flex:1;text-align:end}@supports (inset-inline-end: 0){.slider-ticks-labels>*:last-child{right:unset;inset-inline-end:calc(-1 * var(--t-offset))}}tui-input-slider+.slider-ticks-labels{margin-inline-start:calc(var(--tui-radius-m) / 2 + var(--t-offset))}tui-textfield+.slider-ticks-labels{--t-offset: calc(var(--tui-radius-m) / 2 + $thumb / 2)}tui-textfield[data-size=l]+.slider-ticks-labels{--t-offset: calc(var(--tui-radius-l) / 2 + $thumb / 2)}tui-input-range:not([new])+.slider-ticks-labels,tui-range+.slider-ticks-labels{--t-offset: $thumb}tui-input-range[new]+.slider-ticks-labels{--t-offset: calc(map-get($track-inset, $input-size) + $thumb)}\n"] }]
|
|
313
|
-
}]
|
|
314
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Mtc2FuZHdpY2guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NvbmZpZ3VyYXRvcnMvc2FuZHdpY2gvc2Mtc2FuZHdpY2guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NvbmZpZ3VyYXRvcnMvc2FuZHdpY2gvc2Mtc2FuZHdpY2guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0RBQXNEO0FBRXRELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RixPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFlLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlILE9BQU8sRUFJSCxhQUFhLEVBQ2IsZ0JBQWdCLEVBQ2hCLHFCQUFxQixFQUNyQixtQkFBbUIsR0FLdEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQW9CLFFBQVEsRUFBRSx3QkFBd0IsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSx1QkFBdUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5SyxPQUFPLEVBQ0gsZ0JBQWdCLEVBQ2hC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d0JBQ1IsWUFBWTt3QkFDWixVQUFVO3dCQUNWLFNBQVM7d0JBQ1QsY0FBYzt3QkFDZCxlQUFlO3dCQUNmLFNBQVM7d0JBQ1QsaUJBQWlCO3dCQUNqQixjQUFjO3dCQUNkLDBCQUEwQjt3QkFDMUIsU0FBUzt3QkFDVCxnQkFBZ0I7cUJBQ25CLGFBQ1U7d0JBQ1AsdUJBQXVCLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7d0JBQ3pDLDZCQUE2QixDQUFDOzRCQUMxQixHQUFHLEVBQUUsQ0FBQzt5QkFDVCxDQUFDO3dCQUNGLHdCQUF3QixDQUFDOzRCQUNyQixTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDOzRCQUMzQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBWSxFQUFFLENBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO3lCQUN6RSxDQUFDO3FCQUNMLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kICovXG5cbmltcG9ydCB7IEFzeW5jUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIERlc3Ryb3lSZWYsIGluamVjdCwgaW5wdXQsIE9uSW5pdCwgb3V0cHV0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCwgdG9PYnNlcnZhYmxlLCB0b1NpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7IEZvcm1BcnJheSwgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsIFZhbGlkYXRvckZuLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgICBJU2FuZHdpY2hDYWxjdWxhdGUsXG4gICAgSVNhbmR3aWNoQ2FsY3VsYXRlSXRlbSxcbiAgICBTY0NhcnQsXG4gICAgU2NDYXJ0U2VydmljZSxcbiAgICBTY0NhdGFsb2dTZXJ2aWNlLFxuICAgIFNjQ29uZmlndXJhdG9yU2VydmljZSxcbiAgICBTY0NvbnZlcnRlcnNTZXJ2aWNlLFxuICAgIFNjSUFwaUVycm9yUmVzcG9uc2UsXG4gICAgU2NJQ29uZmlndXJhdG9yQ2FsY3VsYXRlUmVzdWx0LFxuICAgIFNjT3JkZXJJdGVtLFxuICAgIFNjUHJvZHVjdCxcbn0gZnJvbSAnQHNuYWJjZW50ci9jbGllbnQtY29yZSc7XG5pbXBvcnQgeyB0dWlDb250cm9sVmFsdWUgfSBmcm9tICdAdGFpZ2EtdWkvY2RrJztcbmltcG9ydCB7IFR1aUJ1dHRvbiwgVHVpRGlhbG9nQ29udGV4dCwgVHVpRXJyb3IsIHR1aUl0ZW1zSGFuZGxlcnNQcm92aWRlciwgVHVpTGFiZWwsIFR1aUxvYWRlciwgVHVpTnVtYmVyRm9ybWF0LCB0dWlOdW1iZXJGb3JtYXRQcm92aWRlciwgVHVpVGV4dGZpZWxkIH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUnO1xuaW1wb3J0IHtcbiAgICBUdWlCdXR0b25Mb2FkaW5nLFxuICAgIFR1aUNoZXZyb24sXG4gICAgVHVpRGF0YUxpc3RXcmFwcGVyQ29tcG9uZW50LFxuICAgIFR1aUZpZWxkRXJyb3JQaXBlLFxuICAgIFR1aUlucHV0TnVtYmVyLFxuICAgIHR1aUlucHV0TnVtYmVyT3B0aW9uc1Byb3ZpZGVyLFxuICAgIFR1aUlucHV0U2xpZGVyLFxuICAgIFR1aVNlbGVjdCxcbn0gZnJvbSAnQHRhaWdhLXVpL2tpdCc7XG5pbXBvcnQgeyBQT0xZTU9SUEhFVVNfQ09OVEVYVCB9IGZyb20gJ0B0YWlnYS11aS9wb2x5bW9ycGhldXMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgY29tYmluZUxhdGVzdCwgZGVib3VuY2VUaW1lLCBmaWx0ZXIsIGZpbmFsaXplLCBtYXAsIE9ic2VydmFibGUsIG9mLCBzaGFyZSwgc3RhcnRXaXRoLCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTY05leHRJbnB1dEZvY3VzTW9kdWxlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9uZXh0LWlucHV0LWZvY3VzL3NjLW5leHQtaW5wdXQtZm9jdXMubW9kdWxlJztcbmltcG9ydCB7IFNjU2VsZWN0T25Gb2N1c2luRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vZGlyZWN0aXZlcy9zZWxlY3Qtb24tZm9jdXNpbi9zYy1zZWxlY3Qtb24tZm9jdXNpbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgU0NfREVCT1VOQ0VfVElNRV9ERUZBVUxUIH0gZnJvbSAnLi4vLi4vcHJvdmlkZXJzJztcbmltcG9ydCB7IHN0ZXBWYWxpZGF0b3IgfSBmcm9tICcuLi8uLi92YWxpZGF0b3JzL3N0ZXAtdmFsaWRhdG9yJztcbmltcG9ydCB7IFNjSVNhbmR3aWNoU2V0dGluZ3MgfSBmcm9tICcuLi9tb2RlbHMvc2FuZHdpY2gvc2MtaS1zYW5kd2ljaC1zZXR0aW5ncyc7XG5pbXBvcnQgeyBTY0lOZXdDYXJ0SXRlbVNhbmR3aWNoIH0gZnJvbSAnLi9zYy1pLW5ldy1jYXJ0LWl0ZW0tc2FuZHdpY2gnO1xuXG4vKipcbiAqINCa0L7QvdGE0LjQs9GD0YDQsNGC0L7RgCDRgNCw0YHQv9C40LvQsCDRgdGN0L3QtNCy0LjRhy3Qv9Cw0L3QtdC70LXQuS5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ3NjLXNhbmR3aWNoJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vc2Mtc2FuZHdpY2guY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsOiAnLi9zYy1zYW5kd2ljaC5jb21wb25lbnQuc2NzcycsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBUdWlCdXR0b24sXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBTY05leHRJbnB1dEZvY3VzTW9kdWxlLFxuICAgICAgICBUdWlMYWJlbCxcbiAgICAgICAgVHVpRGF0YUxpc3RXcmFwcGVyQ29tcG9uZW50LFxuICAgICAgICBUdWlFcnJvcixcbiAgICAgICAgVHVpVGV4dGZpZWxkLFxuICAgICAgICBUdWlDaGV2cm9uLFxuICAgICAgICBUdWlTZWxlY3QsXG4gICAgICAgIFR1aUlucHV0TnVtYmVyLFxuICAgICAgICBUdWlOdW1iZXJGb3JtYXQsXG4gICAgICAgIEFzeW5jUGlwZSxcbiAgICAgICAgVHVpRmllbGRFcnJvclBpcGUsXG4gICAgICAgIFR1aUlucHV0U2xpZGVyLFxuICAgICAgICBTY1NlbGVjdE9uRm9jdXNpbkRpcmVjdGl2ZSxcbiAgICAgICAgVHVpTG9hZGVyLFxuICAgICAgICBUdWlCdXR0b25Mb2FkaW5nLFxuICAgIF0sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHR1aU51bWJlckZvcm1hdFByb3ZpZGVyKHsgcHJlY2lzaW9uOiAwIH0pLFxuICAgICAgICB0dWlJbnB1dE51bWJlck9wdGlvbnNQcm92aWRlcih7XG4gICAgICAgICAgICBtaW46IDAsXG4gICAgICAgIH0pLFxuICAgICAgICB0dWlJdGVtc0hhbmRsZXJzUHJvdmlkZXIoe1xuICAgICAgICAgICAgc3RyaW5naWZ5OiBzaWduYWwoKHg6IFNjUHJvZHVjdCkgPT4geC5uYW1lKSxcbiAgICAgICAgICAgIGlkZW50aXR5TWF0Y2hlcjogc2lnbmFsKChhOiBTY1Byb2R1Y3QsIGI6IFNjUHJvZHVjdCkgPT4gYS5pZCA9PT0gYi5pZCksXG4gICAgICAgIH0pLFxuICAgIF0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNjU2FuZHdpY2hDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIC8qKlxuICAgICAqINCU0LDQvdC90YvQtSDQvdCw0YHRgtGA0L7QtdC6INC+0LrRgNGD0LbQtdC90LjRjy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGRlYm91bmNlVGltZURlZmF1bHQ6IG51bWJlciA9IGluamVjdDxudW1iZXI+KFNDX0RFQk9VTkNFX1RJTUVfREVGQVVMVCk7XG5cbiAgICAvKipcbiAgICAgKiDQndCw0YHRgtGA0L7QudC60Lgg0LTQu9GPINC60L7QvdGE0LjQs9GD0YDQsNGC0L7RgNCwINGB0Y3QvdC00LLQuNGHLdC/0LDQvdC10LvQtdC5LlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBzZXR0aW5ncyA9IGlucHV0PFNjSVNhbmR3aWNoU2V0dGluZ3M+KCk7XG5cbiAgICAvKipcbiAgICAgKiDQmNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDQutCw0YLQtdCz0L7RgNC40LguXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IGNhdGVnb3J5SWQgPSBpbnB1dC5yZXF1aXJlZDxudW1iZXIgfCBzdHJpbmc+KCk7XG5cbiAgICAvKipcbiAgICAgKiDQndCw0LfQstCw0L3QuNC1INC60L7QvdGE0LjQs9GD0YDQsNGC0L7RgNCwLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBlZGl0b3IgPSBpbnB1dC5yZXF1aXJlZDxzdHJpbmc+KCk7XG5cbiAgICAvKipcbiAgICAgKiDQn9C+0LfQuNGG0LjRjyDRgtC+0LLQsNGA0LAv0YPRgdC70YPQs9C4INCyINC60L7RgNC30LjQvdC1LlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBjYXJ0SXRlbSA9IGlucHV0LnJlcXVpcmVkPFNjT3JkZXJJdGVtIHwgdW5kZWZpbmVkPigpO1xuXG4gICAgLyoqXG4gICAgICog0KHQvtCx0YvRgtC40LUg0L/QtdGA0LXQutC70Y7Rh9C10L3QuNGPINC+0YLQvtCx0YDQsNC20LXQvdC40Y8g0YLQvtCy0LDRgNC+0LIuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IHRvZ2dsZVNob3dFdmVudCA9IG91dHB1dCgpO1xuXG4gICAgLyoqXG4gICAgICog0KTQvtGA0LzQsCDQtNC+0LHQsNCy0LvQtdC90LjRjy/RgNC10LTQsNC60YLQuNGA0L7QstCw0L3QuNGPINC/0YDQvtC00YPQutGC0LAg0LIg0LrQvtGA0LfQuNC90LUuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGZvcm0gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICAgICAgcHJvZHVjdENhdGVnb3J5SWQ6IG5ldyBGb3JtQ29udHJvbDxudW1iZXIgfCBudWxsPihudWxsLCB7IHZhbGlkYXRvcnM6IFZhbGlkYXRvcnMucmVxdWlyZWQsIG5vbk51bGxhYmxlOiBmYWxzZSB9KSxcbiAgICAgICAgY29uZmlndXJhdG9yOiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4obnVsbCwgeyB2YWxpZGF0b3JzOiBWYWxpZGF0b3JzLnJlcXVpcmVkLCBub25OdWxsYWJsZTogZmFsc2UgfSksXG4gICAgICAgIHF1YW50aXR5OiBuZXcgRm9ybUNvbnRyb2w8bnVtYmVyIHwgbnVsbD4obnVsbCwgeyB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgc3RlcFZhbGlkYXRvcigxKV0sIG5vbk51bGxhYmxlOiBmYWxzZSB9KSxcbiAgICAgICAgbWFya2VyOiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nPignJywgeyBub25OdWxsYWJsZTogdHJ1ZSB9KSxcbiAgICAgICAgaXRlbXM6IG5ldyBGb3JtQXJyYXk8UmV0dXJuVHlwZTxTY1NhbmR3aWNoQ29tcG9uZW50WydjcmVhdGVJdGVtR3JvdXAnXT4+KFtdKSxcbiAgICAgICAgY2FsY3VsYXRpb25JZDogbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KG51bGwsIHsgbm9uTnVsbGFibGU6IGZhbHNlIH0pLFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICog0KHQtdGA0LLQuNGBINC00LvRjyDRgNCw0LHQvtGC0Ysg0YEg0LrQvtGA0LfQuNC90L7QuS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhcnRTZXJ2aWNlOiBTY0NhcnRTZXJ2aWNlID0gaW5qZWN0KFNjQ2FydFNlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICog0KHQtdGA0LLQuNGBINC60L7QvdCy0LXRgNGC0LDRhtC40Lgg0LTQsNC90L3Ri9GFLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29udmVydGVyc1NlcnZpY2U6IFNjQ29udmVydGVyc1NlcnZpY2UgPSBpbmplY3QoU2NDb252ZXJ0ZXJzU2VydmljZSk7XG5cbiAgICAvKipcbiAgICAgKiDQmtC+0L3RgtC10LrRgdGCINC00LjQsNC70L7Qs9C+0LLQvtCz0L4g0L7QutC90LAsINCyINC60L7RgtC+0YDQvtC8INC+0YLQutGA0YvRgiDQutC+0LzQv9C+0L3QtdC90YIuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0OiBUdWlEaWFsb2dDb250ZXh0IHwgdW5kZWZpbmVkID0gaW5qZWN0KFBPTFlNT1JQSEVVU19DT05URVhULCB7IG9wdGlvbmFsOiB0cnVlIH0pIGFzIFR1aURpYWxvZ0NvbnRleHQgfCB1bmRlZmluZWQ7XG5cbiAgICAvKipcbiAgICAgKiDQodC10YDQstC40YEg0LTQu9GPINGA0LDQsdC+0YLRiyDRgSDQutCw0YLQsNC70L7Qs9C+0LwuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYXRhbG9nU2VydmljZTogU2NDYXRhbG9nU2VydmljZSA9IGluamVjdChTY0NhdGFsb2dTZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDQtNC70Y8g0YDQsNCx0L7RgtGLINGBINC60L7QvdGE0LjQs9GD0YDQsNGC0L7RgNCw0LzQuC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZ3VyYXRvclNlcnZpY2U6IFNjQ29uZmlndXJhdG9yU2VydmljZSA9IGluamVjdChTY0NvbmZpZ3VyYXRvclNlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIE9ic2VydmFibGV9INGB0L/QuNGB0LrQsCDRgtC+0LLQsNGA0L7QsiDQutCw0YLQtdCz0L7RgNC40LguXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHByb2R1Y3RzJDogT2JzZXJ2YWJsZTxTY1Byb2R1Y3RbXT4gPSB0b09ic2VydmFibGUodGhpcy5jYXRlZ29yeUlkKS5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKGNhdGVnb3J5SWQpID0+IHtcbiAgICAgICAgICAgIGlmICghY2F0ZWdvcnlJZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvZihbXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhdGFsb2dTZXJ2aWNlLmdldFByb2R1Y3RzQ2F0ZWdvcnlDYWNoZWQkKHsgY2F0ZWdvcnlJZDogTnVtYmVyKGNhdGVnb3J5SWQpIH0pLnBpcGUobWFwKChwcm9kdWN0cykgPT4gcHJvZHVjdHMgPz8gW10pKTtcbiAgICAgICAgfSlcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICog0JLRi9Cx0YDQsNC90L3Ri9C5INC/0YDQvtC00YPQutGCICjQvNCw0YLQtdGA0LjQsNC7INC00LvRjyDRgNCw0YHQutGA0L7RjykuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHByb2R1Y3QgPSBuZXcgRm9ybUNvbnRyb2w8U2NQcm9kdWN0IHwgbnVsbD4obnVsbCwgeyB2YWxpZGF0b3JzOiBWYWxpZGF0b3JzLnJlcXVpcmVkIH0pO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIE9ic2VydmFibGV9INGA0LDRgdGH0LXRgtCwINC+0L/RgtC40LzQuNC30LDRhtC40Lgg0YDQsNGB0LrQu9Cw0LTQutC4LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FsY3VsYXRlJDogT2JzZXJ2YWJsZTxTY0lDb25maWd1cmF0b3JDYWxjdWxhdGVSZXN1bHQgfCBudWxsIHwgdW5kZWZpbmVkPiA9IGNvbWJpbmVMYXRlc3Qoe1xuICAgICAgICBwcm9kdWN0SWQ6IHR1aUNvbnRyb2xWYWx1ZTxTY1Byb2R1Y3QgfCBudWxsPih0aGlzLnByb2R1Y3QpLnBpcGUobWFwKChwcm9kdWN0KSA9PiBwcm9kdWN0Py5pZCA/PyBudWxsKSksXG4gICAgICAgIGl0ZW1zOiB0dWlDb250cm9sVmFsdWU8SVNhbmR3aWNoQ2FsY3VsYXRlSXRlbVtdPih0aGlzLml0ZW1zKSxcbiAgICB9KS5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZVRpbWVEZWZhdWx0KSxcbiAgICAgICAgc3dpdGNoTWFwKCh7IHByb2R1Y3RJZCwgaXRlbXMgfSkgPT4ge1xuICAgICAgICAgICAgaWYgKHByb2R1Y3RJZCA9PT0gbnVsbCB8fCBpdGVtcy5sZW5ndGggPT09IDAgfHwgdGhpcy5mb3JtLmNvbnRyb2xzLml0ZW1zLmludmFsaWQpIHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uby11c2VsZXNzLXVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWd1cmF0b3JTZXJ2aWNlLmNhbGN1bGF0ZSQodGhpcy5jYXRlZ29yeUlkKCksIHRoaXMuZWRpdG9yKCksIHsgcHJvZHVjdElkLCBpdGVtcyB9KS5waXBlKFxuICAgICAgICAgICAgICAgIHRhcCgoY2FsY3VsYXRlUmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoJ3F1YW50aXR5Jyk/LnNldFZhbHVlKGNhbGN1bGF0ZVJlc3VsdC5xdWFudGl0eSk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgc3RhcnRXaXRoKG51bGwpLFxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKCkgPT4gb2YobnVsbCkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9KSxcbiAgICAgICAgc2hhcmUoKVxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiDQoNC10LfRg9C70YzRgtCw0YIg0YDQsNGB0YfQtdGC0LAg0L7Qv9GC0LjQvNC40LfQsNGG0LjQuCDRgNCw0YHQutC70LDQtNC60LguXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGNhbGN1bGF0ZVJlc3VsdCQ6IE9ic2VydmFibGU8U2NJQ29uZmlndXJhdG9yQ2FsY3VsYXRlUmVzdWx0IHwgdW5kZWZpbmVkPiA9IHRoaXMuY2FsY3VsYXRlJC5waXBlKGZpbHRlcigoZGF0YSkgPT4gZGF0YSAhPT0gbnVsbCkpO1xuXG4gICAgLyoqXG4gICAgICog0KHQuNCz0L3QsNC7INGB0L7RgdGC0L7Rj9C90LjRjyDQt9Cw0LPRgNGD0LfQutC4INGA0LDRgdGH0LXRgtCwLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBpc0NhbGN1bGF0ZUxvYWRpbmcgPSB0b1NpZ25hbCh0aGlzLmNhbGN1bGF0ZSQucGlwZShtYXAoKGRhdGEpID0+IGRhdGEgPT09IG51bGwpKSwgeyBpbml0aWFsVmFsdWU6IGZhbHNlIH0pO1xuXG4gICAgLyoqXG4gICAgICog0JLQsNC70LjQtNCw0YLQvtGAINC00LvRjyDRiNC40YDQuNC90Ysg0LjQt9C00LXQu9C40Y8uXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHZhbGlkYXRvcldpZHRoJDogT2JzZXJ2YWJsZTxWYWxpZGF0b3JGbiB8IG51bGw+ID0gdHVpQ29udHJvbFZhbHVlPFNjUHJvZHVjdCB8IG51bGw+KHRoaXMucHJvZHVjdCkucGlwZShcbiAgICAgICAgbWFwKChwcm9kdWN0KSA9PiBWYWxpZGF0b3JzLm1pbihwcm9kdWN0Py5wcm9wZXJ0aWVzPy53aWR0aCA/PyAwKSlcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICog0JLQsNC70LjQtNCw0YLQvtGAINC00LvRjyDQtNC70LjQvdGLINC40LfQtNC10LvQuNGPLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSB2YWxpZGF0b3JMZW5ndGgkOiBPYnNlcnZhYmxlPFZhbGlkYXRvckZuIHwgbnVsbD4gPSB0dWlDb250cm9sVmFsdWU8U2NQcm9kdWN0IHwgbnVsbD4odGhpcy5wcm9kdWN0KS5waXBlKFxuICAgICAgICBtYXAoKHByb2R1Y3QpID0+IFZhbGlkYXRvcnMubWluKHByb2R1Y3Q/LnByb3BlcnRpZXM/Lmxlbmd0aCA/PyAwKSlcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICog0J/RgNC40LfQvdCw0Log0YLQvtCz0L4sINGH0YLQviDQstGL0L/QvtC70L3Rj9C10YLRgdGPINC30LDQv9GA0L7RgSDQvdCwINC+0YLQv9GA0LDQstC60YMg0LTQsNC90L3Ri9GFINCy0YvQv9C+0LvQvdGP0LXRgtGB0Y8uXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzU3VibWl0TG9hZGluZyA9IHNpZ25hbChmYWxzZSk7XG5cbiAgICAvKipcbiAgICAgKiDQodGB0YvQu9C60LAg0LTQu9GPINCw0LLRgtC+0LzQsNGC0LjRh9C10YHQutC+0LPQviDRg9C/0YDQsNCy0LvQtdC90LjRjyDRg9C90LjRh9GC0L7QttC10L3QuNC10Lwg0LfQsNCy0LjRgdC40LzQvtGB0YLQtdC5LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZjogRGVzdHJveVJlZiA9IGluamVjdChEZXN0cm95UmVmKTtcblxuICAgIC8qKlxuICAgICAqINCc0LDRgdGB0LjQsiDQuNC30LTQtdC70LjQuS5cbiAgICAgKi9cbiAgICBnZXQgaXRlbXMoKTogRm9ybUFycmF5PFJldHVyblR5cGU8U2NTYW5kd2ljaENvbXBvbmVudFsnY3JlYXRlSXRlbUdyb3VwJ10+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm0uY29udHJvbHMuaXRlbXM7XG4gICAgfVxuXG4gICAgLyoqIEBpbmhlcml0RG9jICovXG4gICAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldERlZmF1bHRGb3JtVmFsdWUoKTtcblxuICAgICAgICB0aGlzLnByb2R1Y3QudmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpLnN1YnNjcmliZSgocHJvZHVjdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHByb2R1Y3QpIHtcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zLmNvbnRyb2xzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBpdGVtLmdldFJhd1ZhbHVlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKChwcm9kdWN0LnByb3BlcnRpZXM/LndpZHRoICYmIHZhbHVlLndpZHRoIDwgcHJvZHVjdC5wcm9wZXJ0aWVzLndpZHRoKSB8fCAocHJvZHVjdC5wcm9wZXJ0aWVzPy5sZW5ndGggJiYgdmFsdWUubGVuZ3RoIDwgcHJvZHVjdC5wcm9wZXJ0aWVzLmxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6IE1hdGgubWluKHZhbHVlLndpZHRoLCBwcm9kdWN0LnByb3BlcnRpZXMud2lkdGggPz8gdmFsdWUud2lkdGgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDogTWF0aC5taW4odmFsdWUubGVuZ3RoLCBwcm9kdWN0LnByb3BlcnRpZXMubGVuZ3RoID8/IHZhbHVlLmxlbmd0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQodC+0LfQtNCw0LXRgiDQs9GA0YPQv9C/0YMg0LTQu9GPINC40LfQtNC10LvQuNGPLlxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW0g0J/QsNGA0LDQvNC10YLRgNGLINC40LfQtNC10LvQuNGPLlxuICAgICAqL1xuICAgIHByaXZhdGUgY3JlYXRlSXRlbUdyb3VwKGl0ZW0/OiBJU2FuZHdpY2hDYWxjdWxhdGVJdGVtKTogRm9ybUdyb3VwPHtcbiAgICAgICAgd2lkdGg6IEZvcm1Db250cm9sPG51bWJlcj47XG4gICAgICAgIGxlbmd0aDogRm9ybUNvbnRyb2w8bnVtYmVyPjtcbiAgICAgICAgY291bnQ6IEZvcm1Db250cm9sPG51bWJlcj47XG4gICAgfT4ge1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgICAgICB3aWR0aDogbmV3IEZvcm1Db250cm9sPG51bWJlcj4oaXRlbT8ud2lkdGggPz8gMCwge1xuICAgICAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbih0aGlzLnNldHRpbmdzKCk/Lm1pbldpZHRoID8/IDAuMDEpXSxcbiAgICAgICAgICAgICAgICBub25OdWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbGVuZ3RoOiBuZXcgRm9ybUNvbnRyb2w8bnVtYmVyPihpdGVtPy5sZW5ndGggPz8gMCwge1xuICAgICAgICAgICAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbih0aGlzLnNldHRpbmdzKCk/Lm1pbkxlbmd0aCA/PyAwLjAxKV0sXG4gICAgICAgICAgICAgICAgbm9uTnVsbGFibGU6IHRydWUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGNvdW50OiBuZXcgRm9ybUNvbnRyb2w8bnVtYmVyPihpdGVtPy5jb3VudCA/PyAxLCB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKDEpXSxcbiAgICAgICAgICAgICAgICBub25OdWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQlNC+0LHQsNCy0LvRj9C10YIg0L3QvtCy0L7QtSDQuNC30LTQtdC70LjQtSDQsiDRhNC+0YDQvNGDLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhZGRJdGVtKCk6IHZvaWQge1xuICAgICAgICB0aGlzLml0ZW1zLnB1c2godGhpcy5jcmVhdGVJdGVtR3JvdXAoKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KPQtNCw0LvRj9C10YIg0LjQt9C00LXQu9C40LUg0LjQtyDRhNC+0YDQvNGLLlxuICAgICAqXG4gICAgICogQHBhcmFtIGluZGV4INCY0L3QtNC10LrRgSDQuNC30LTQtdC70LjRjy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVtb3ZlSXRlbShpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXRlbXMucmVtb3ZlQXQoaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCS0L7Qt9Cy0YDQsNGJ0LDQtdGCINC40YLQvtCz0L7QstGD0Y4g0YHRgtC+0LjQvNC+0YHRgtGMLlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhbGN1bGF0ZVJlc3VsdCDQoNC10LfRg9C70YzRgtCw0YIg0YDQsNGB0YfQtdGC0LAg0L7Qv9GC0LjQvNC40LfQsNGG0LjQuCDRgNCw0YHQutC70LDQtNC60LguXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdldFRvdGFsQ29zdChjYWxjdWxhdGVSZXN1bHQ6IFNjSUNvbmZpZ3VyYXRvckNhbGN1bGF0ZVJlc3VsdCk6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5wcm9kdWN0LnZhbHVlPy5jb3N0UnViKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRvdGFsQ29zdCA9IGNhbGN1bGF0ZVJlc3VsdC5xdWFudGl0eSAqIHRoaXMucHJvZHVjdC52YWx1ZS5jb3N0UnViO1xuXG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHRvdGFsQ29zdCAqIDEwMCkgLyAxMDA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J7QsdGA0LDQsdC+0YLRh9C40Log0LTQvtCx0LDQstC70LXQvdC40Y8v0YDQtdC00LDQutGC0LjRgNC+0LLQsNC90LjRjyDQv9GA0L7QtNGD0LrRgtCwINCyINC60L7RgNC30LjQvdC1LlxuICAgICAqXG4gICAgICogQHBhcmFtIGNhbGN1bGF0ZVJlc3VsdCDQoNC10LfRg9C70YzRgtCw0YIg0YDQsNGB0YfQtdGC0LAg0L7Qv9GC0LjQvNC40LfQsNGG0LjQuCDRgNCw0YHQutC70LDQtNC60LguXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9uU3VibWl0KGNhbGN1bGF0ZVJlc3VsdDogU2NJQ29uZmlndXJhdG9yQ2FsY3VsYXRlUmVzdWx0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgICAgICBpZiAoIWNhbGN1bGF0ZVJlc3VsdCB8fCB0aGlzLmZvcm0uaW52YWxpZCB8fCB0aGlzLmlzQ2FsY3VsYXRlTG9hZGluZygpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmb3JtVmFsdWUgPSB7IC4uLnRoaXMuZm9ybS52YWx1ZSwgcHJvZHVjdElkOiB0aGlzLnByb2R1Y3QudmFsdWU/LmlkID8/IG51bGwsIGNhbGN1bGF0aW9uSWQ6IGNhbGN1bGF0ZVJlc3VsdC5pZCB9O1xuICAgICAgICAvLyDQo9C00LDQu9GP0LXQvCBpdGVtcywg0YLQsNC6INC60LDQuiDQvtC90Lgg0L3QtSDQvdGD0LbQvdGLINCyIHtAbGluayBTY0lOZXdDYXJ0SXRlbVNhbmR3aWNofS5cbiAgICAgICAgZGVsZXRlIGZvcm1WYWx1ZS5pdGVtcztcbiAgICAgICAgY29uc3Qgb3JkZXJJdGVtID0gdGhpcy5jYXJ0SXRlbSgpO1xuXG4gICAgICAgIGNvbnN0IG5ld0NhcnRJdGVtJDogT2JzZXJ2YWJsZTxTY0NhcnQ+ID0gb3JkZXJJdGVtXG4gICAgICAgICAgICA/IHRoaXMuY2FydFNlcnZpY2UudXBkYXRlUHJvZHVjdCQob3JkZXJJdGVtLmlkLCB0aGlzLmNvbnZlcnRlcnNTZXJ2aWNlLnJlbW92ZU51bGwoZm9ybVZhbHVlKSBhcyBTY0lOZXdDYXJ0SXRlbVNhbmR3aWNoKVxuICAgICAgICAgICAgOiB0aGlzLmNhcnRTZXJ2aWNlLmFkZFByb2R1Y3QkKHRoaXMuY29udmVydGVyc1NlcnZpY2UucmVtb3ZlTnVsbChmb3JtVmFsdWUpIGFzIFNjSU5ld0NhcnRJdGVtU2FuZHdpY2gpO1xuXG4gICAgICAgIHRoaXMuaXNTdWJtaXRMb2FkaW5nLnNldCh0cnVlKTtcblxuICAgICAgICBuZXdDYXJ0SXRlbSRcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dC4kaW1wbGljaXQuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RGVmYXVsdEZvcm1WYWx1ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZXJyb3JzLCBtZXNzYWdlIH0gPSBlcnJvci5lcnJvciBhcyBTY0lBcGlFcnJvclJlc3BvbnNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoZXJyb3JzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNlY3VyaXR5L2RldGVjdC1vYmplY3QtaW5qZWN0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5nZXQoa2V5KT8uc2V0RXJyb3JzKHsgc2VydmVyUmVzcG9uc2U6IGVycm9yc1trZXldIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLnNldEVycm9ycyh7IHNlcnZlclJlc3BvbnNlOiBbbWVzc2FnZV0gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKCk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU3VibWl0TG9hZGluZy5zZXQoZmFsc2UpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0KPRgdGC0LDQvdCw0LLQu9C40LLQsNC10YIg0L3QsNGH0LDQu9GM0L3Ri9C1INC30L3QsNGH0LXQvdC40Y8g0LTQu9GPINC/0L7Qu9C10Lkg0YTQvtGA0LzRiy5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNldERlZmF1bHRGb3JtVmFsdWUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9ybS5yZXNldCh7XG4gICAgICAgICAgICBwcm9kdWN0Q2F0ZWdvcnlJZDogTnVtYmVyKHRoaXMuY2F0ZWdvcnlJZCgpKSxcbiAgICAgICAgICAgIGNvbmZpZ3VyYXRvcjogdGhpcy5lZGl0b3IoKSxcbiAgICAgICAgICAgIHF1YW50aXR5OiB0aGlzLmNhcnRJdGVtKCk/LnF1YW50aXR5ID8/IG51bGwsXG4gICAgICAgICAgICBtYXJrZXI6IHRoaXMuY2FydEl0ZW0oKT8ubWFya2VyID8/ICcnLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLml0ZW1zLmNsZWFyKCk7XG5cbiAgICAgICAgdGhpcy5wcm9kdWN0LnJlc2V0KHRoaXMuY2FydEl0ZW0oKT8ucHJvZHVjdCA/PyBudWxsKTtcblxuICAgICAgICBjb25zdCBjb25maWd1cmF0b3JQYXJhbWV0ZXJzID0gdGhpcy5jYXJ0SXRlbSgpPy5jb25maWd1cmF0b3JQYXJhbXMgYXMgSVNhbmR3aWNoQ2FsY3VsYXRlIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbmZpZ3VyYXRvclBhcmFtZXRlcnM/Lml0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIHRoaXMuaXRlbXMucHVzaCh0aGlzLmNyZWF0ZUl0ZW1Hcm91cCh7IHdpZHRoOiBpdGVtLndpZHRoLCBsZW5ndGg6IGl0ZW0ubGVuZ3RoLCBjb3VudDogaXRlbS5jb3VudCB9KSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghY29uZmlndXJhdG9yUGFyYW1ldGVycz8uaXRlbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmFkZEl0ZW0oKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIkBpZiAoIWNhcnRJdGVtKCkgJiYgc2V0dGluZ3MoKT8uYWxsb3dTaG93VGFibGUpIHtcbiAgICA8ZGl2IGNsYXNzPVwibWItNSBmbGV4IGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR1aUJ1dHRvblxuICAgICAgICAgICAgYXBwZWFyYW5jZT1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU2hvd0V2ZW50LmVtaXQoKVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGljb25TdGFydD1cIkB0dWkubGF5b3V0LWxpc3RcIlxuICAgICAgICA+XG4gICAgICAgICAgICDQn9C+0LrQsNC30LDRgtGMINCyINCy0LjQtNC1INGB0L/QuNGB0LrQsFxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbn1cbjxkaXYgY2xhc3M9XCJcIj5cbiAgICBAbGV0IGNhbGN1bGF0ZVJlc3VsdCA9IGNhbGN1bGF0ZVJlc3VsdCQgfCBhc3luYztcbiAgICBAbGV0IHByb2R1Y3RzID0gcHJvZHVjdHMkIHwgYXN5bmM7XG4gICAgQGxldCBwcm9kdWN0VmFsdWUgPSBwcm9kdWN0LnZhbHVlO1xuICAgIEBsZXQgdmFsaWRhdG9yV2lkdGggPSB2YWxpZGF0b3JXaWR0aCQgfCBhc3luYztcbiAgICBAbGV0IHZhbGlkYXRvckxlbmd0aCA9IHZhbGlkYXRvckxlbmd0aCQgfCBhc3luYztcblxuICAgIDxmb3JtXG4gICAgICAgIFtmb3JtR3JvdXBdPVwiZm9ybVwiXG4gICAgICAgIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdChjYWxjdWxhdGVSZXN1bHQpXCJcbiAgICAgICAgU2NOZXh0SW5wdXRGb2N1c1xuICAgICAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTNcIlxuICAgID5cbiAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICB0dWlMYWJlbFxuICAgICAgICAgICAgY2xhc3M9XCJncm93XCJcbiAgICAgICAgPlxuICAgICAgICAgICAg0KLQvtCy0LDRgFxuICAgICAgICAgICAgPHR1aS10ZXh0ZmllbGRcbiAgICAgICAgICAgICAgICB0dWlDaGV2cm9uXG4gICAgICAgICAgICAgICAgW3R1aVRleHRmaWVsZENsZWFuZXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0dWlDaGV2cm9uXG4gICAgICAgICAgICAgICAgICAgIHR1aVNlbGVjdFxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwicHJvZHVjdFwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi0JLRi9Cx0LXRgNC40YLQtSDQvNCw0YLQtdGA0LjQsNC7XCJcbiAgICAgICAgICAgICAgICAvPlxuXG4gICAgICAgICAgICAgICAgPHR1aS1kYXRhLWxpc3Qtd3JhcHBlclxuICAgICAgICAgICAgICAgICAgICAqdHVpVGV4dGZpZWxkRHJvcGRvd25cbiAgICAgICAgICAgICAgICAgICAgbmV3XG4gICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJwcm9kdWN0c1wiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvdHVpLXRleHRmaWVsZD5cbiAgICAgICAgICAgIEBpZiAocHJvZHVjdFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTIgdGV4dC10dWktdGV4dC1zZWNvbmRhcnlcIj5cbiAgICAgICAgICAgICAgICAgICAg0KHRgtC+0LjQvNC+0YHRgtGMOlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9sZFwiPnt7IHByb2R1Y3RWYWx1ZS5jb3N0UnViPy50b0xvY2FsZVN0cmluZygpIH19IHt7IHByb2R1Y3RWYWx1ZS5jdXJyZW5jeS5zeW1ib2wgfX0v0YjRgi48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8dHVpLWVycm9yXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInByb2R1Y3RcIlxuICAgICAgICAgICAgICAgIFtlcnJvcl09XCJbXSB8IHR1aUZpZWxkRXJyb3IgfCBhc3luY1wiXG4gICAgICAgICAgICAvPlxuICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgIEBpZiAocHJvZHVjdC52YWx1ZSAmJiB2YWxpZGF0b3JXaWR0aCAmJiB2YWxpZGF0b3JMZW5ndGgpIHtcbiAgICAgICAgICAgIDxwIGNsYXNzPVwidy1mdWxsIGZvbnQtYm9sZFwiPtCg0LDQt9C80LXRgNGLINC40LfQtNC10LvQuNC5PC9wPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICDQnNC40L3QuNC80LDQu9GM0L3QsNGPINGI0LjRgNC40L3QsDoge3sgc2V0dGluZ3MoKT8ubWluV2lkdGggfX0g0LzQvC5cbiAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICDQnNCw0LrRgdC40LzQsNC70YzQvdCw0Y8g0YjQuNGA0LjQvdCwOiB7eyBwcm9kdWN0LnZhbHVlLnByb3BlcnRpZXM/LndpZHRoIH19INC80LwuXG4gICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgICAg0JzQuNC90LjQvNCw0LvRjNC90LDRjyDQtNC70LjQvdCwOiB7eyBzZXR0aW5ncygpPy5taW5MZW5ndGggfX0g0LzQvC5cbiAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICDQnNCw0LrRgdC40LzQsNC70YzQvdCw0Y8g0LTQu9C40L3QsDoge3sgcHJvZHVjdC52YWx1ZS5wcm9wZXJ0aWVzPy5sZW5ndGggfX0g0LzQvC5cbiAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBmb3JtQXJyYXlOYW1lPVwiaXRlbXNcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtM1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBpdGVtcy5jb250cm9sczsgdHJhY2sgaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZ3JvdyBnYXAtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCIkaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncm93IGdyaWQtY29scy0zIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHR1aUxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDQqNC40YDQuNC90LAsINC80LxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR1aS10ZXh0ZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlJbnB1dFNsaWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIndpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cInNldHRpbmdzKCk/Lm1pbldpZHRoID8/IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwicHJvZHVjdC52YWx1ZS5wcm9wZXJ0aWVzPy53aWR0aCA/PyAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHVpTnVtYmVyRm9ybWF0XT1cInsgcHJlY2lzaW9uOiAwIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi0KjQuNGA0LjQvdCwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAocHJvZHVjdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlTbGlkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhbmdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3R1aS10ZXh0ZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAocHJvZHVjdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNsaWRlci10aWNrcy1sYWJlbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4gMCA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgcHJvZHVjdC52YWx1ZS5wcm9wZXJ0aWVzPy53aWR0aCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0dWktZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIndpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlcnJvcl09XCJbXSB8IHR1aUZpZWxkRXJyb3IgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCB0dWlMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg0JTQu9C40L3QsCwg0LzQvFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHVpLXRleHRmaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1aUlucHV0U2xpZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cInNldHRpbmdzKCk/Lm1pbkxlbmd0aCA/PyAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cInByb2R1Y3QudmFsdWUucHJvcGVydGllcz8ubGVuZ3RoID8/IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0dWlOdW1iZXJGb3JtYXRdPVwieyBwcmVjaXNpb246IDAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCLQlNC70LjQvdCwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAocHJvZHVjdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlTbGlkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhbmdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3R1aS10ZXh0ZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAocHJvZHVjdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNsaWRlci10aWNrcy1sYWJlbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4gMCA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgcHJvZHVjdC52YWx1ZS5wcm9wZXJ0aWVzPy5sZW5ndGggfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHVpLWVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJsZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Vycm9yXT1cIltdIHwgdHVpRmllbGRFcnJvciB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCB0dWlMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ3aGl0ZXNwYWNlLW5vd3JhcFwiPtCa0L7Qu9C40YfQtdGB0YLQstC+LCDRiNGCPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHVpLXRleHRmaWVsZCBbdHVpVGV4dGZpZWxkQ2xlYW5lcl09XCJmYWxzZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpSW5wdXROdW1iZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb3VudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCIxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHVpTnVtYmVyRm9ybWF0XT1cInsgcHJlY2lzaW9uOiAwIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi0JrQvtC70LjRh9C10YHRgtCy0L5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3R1aS10ZXh0ZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0dWktZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvdW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlcnJvcl09XCJbXSB8IHR1aUZpZWxkRXJyb3IgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1aUljb25CdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlSXRlbSgkaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXRlbXMubGVuZ3RoIDw9IDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uU3RhcnQ9XCJAdHVpLnRyYXNoLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXQtNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZsZXhdPVwiJzAgMCBhdXRvJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR1aUJ1dHRvblxuICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpdGVtcy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkSXRlbSgpXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGYtY2VudGVyXCJcbiAgICAgICAgICAgICAgICBpY29uU3RhcnQ9XCJAdHVpLnBsdXNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgINCU0L7QsdCw0LLQuNGC0Ywg0LjQt9C00LXQu9C40LVcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9IEBlbHNlIGlmIChwcm9kdWN0LnZhbHVlKSB7XG4gICAgICAgICAgICA8dHVpLWVycm9yIGVycm9yPVwi0KDQsNGB0YfQtdGCINC/0L4g0L/RgNC+0LTRg9C60YLRgyDQvdC10LLQvtC30LzQvtC20LXQvS4g0J7QsdGA0LDRgtC40YLQtdGB0Ywg0Log0LzQtdC90LXQtNC20LXRgNGDXCIgLz5cbiAgICAgICAgfVxuXG4gICAgICAgIDxsYWJlbCB0dWlMYWJlbD5cbiAgICAgICAgICAgINCc0LDRgNC60LjRgNC+0LLQutCwINGA0LDRgdC/0LjQu9CwXG4gICAgICAgICAgICA8dHVpLXRleHRmaWVsZD5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHVpVGV4dGZpZWxkXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm1hcmtlclwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi0JzQsNGA0LrQuNGA0L7QstC60LAg0YDQsNGB0L/QuNC70LBcIlxuICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJtYXJrZXJcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L3R1aS10ZXh0ZmllbGQ+XG5cbiAgICAgICAgICAgIDx0dWktZXJyb3JcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJtYXJrZXJcIlxuICAgICAgICAgICAgICAgIFtlcnJvcl09XCJbXSB8IHR1aUZpZWxkRXJyb3IgfCBhc3luY1wiXG4gICAgICAgICAgICAvPlxuICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgIEBpZiAocHJvZHVjdC52YWx1ZSkge1xuICAgICAgICAgICAgPHR1aS1sb2FkZXIgW3Nob3dMb2FkZXJdPVwiaXNDYWxjdWxhdGVMb2FkaW5nKClcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGNhbGN1bGF0ZVJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMiBmbGV4IGZsZXgtd3JhcCBpdGVtcy1lbmQgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAg0JjRgtC+0LPQvjogPHNwYW4gY2xhc3M9XCJ3aGl0ZXNwYWNlLW5vd3JhcCB0ZXh0LXhsIGZvbnQtYm9sZFwiPnt7IGdldFRvdGFsQ29zdChjYWxjdWxhdGVSZXN1bHQpLnRvTG9jYWxlU3RyaW5nKCkgfX0ge3sgcHJvZHVjdC52YWx1ZS5jdXJyZW5jeS5zeW1ib2wgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY2FsY3VsYXRlUmVzdWx0Py5xdWFudGl0eSAmJiBwcm9kdWN0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2hpdGVzcGFjZS1ub3dyYXAgdGV4dC1sZyB0ZXh0LXNjLWRhcmstZ3JleVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9sZFwiPih7eyBjYWxjdWxhdGVSZXN1bHQucXVhbnRpdHkgfX0g0YjRgi48L3NwYW4+IHhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGRcIj57eyBwcm9kdWN0VmFsdWUuY29zdFJ1Yj8udG9Mb2NhbGVTdHJpbmcoKSB9fSB7eyBwcm9kdWN0VmFsdWUuY3VycmVuY3kuc3ltYm9sIH19L9GI0YIuKTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC90dWktbG9hZGVyPlxuICAgICAgICB9XG5cbiAgICAgICAgPHR1aS1lcnJvciBbZXJyb3JdPVwiW10gfCB0dWlGaWVsZEVycm9yIHwgYXN5bmNcIiAvPlxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtLmludmFsaWQgfHwgIWNhbGN1bGF0ZVJlc3VsdCB8fCBpc0NhbGN1bGF0ZUxvYWRpbmcoKSB8fCBpc1N1Ym1pdExvYWRpbmcoKVwiXG4gICAgICAgICAgICBbbG9hZGluZ109XCJpc1N1Ym1pdExvYWRpbmcoKVwiXG4gICAgICAgICAgICB0dWlCdXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwic2VsZi1jZW50ZXJcIlxuICAgICAgICAgICAgaWNvblN0YXJ0PVwiQHR1aS5jaGVja1wiXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7ICFjYXJ0SXRlbSgpID8gJ9CU0L7QsdCw0LLQuNGC0Ywg0LIg0LrQvtGA0LfQuNC90YMnIDogJ9CY0LfQvNC10L3QuNGC0YwnIH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgIDwvZm9ybT5cbjwvZGl2PlxuIl19
|
|
316
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (!orderItem() && settings()?.allowShowTable) {\n <div class=\"mb-5 flex justify-center\">\n <button\n tuiButton\n appearance=\"secondary\"\n (click)=\"toggleShowEvent.emit()\"\n type=\"button\"\n iconStart=\"@tui.layout-list\"\n >\n \u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0432 \u0432\u0438\u0434\u0435 \u0441\u043F\u0438\u0441\u043A\u0430\n </button>\n </div>\n}\n<div class=\"\">\n @let calculateResult = calculateResult$ | async;\n @let products = products$ | async;\n @let productValue = product.value;\n @let validatorWidth = validatorWidth$ | async;\n @let validatorLength = validatorLength$ | async;\n\n <form\n [formGroup]=\"form\"\n (ngSubmit)=\"onSubmit(calculateResult)\"\n ScNextInputFocus\n class=\"flex flex-col gap-3\"\n >\n <label\n tuiLabel\n class=\"grow\"\n >\n \u0422\u043E\u0432\u0430\u0440\n <tui-textfield\n tuiChevron\n [tuiTextfieldCleaner]=\"false\"\n >\n <input\n tuiChevron\n tuiSelect\n [formControl]=\"product\"\n placeholder=\"\u0412\u044B\u0431\u0435\u0440\u0438\u0442\u0435 \u043C\u0430\u0442\u0435\u0440\u0438\u0430\u043B\"\n />\n\n <tui-data-list-wrapper\n *tuiTextfieldDropdown\n new\n [items]=\"products\"\n />\n </tui-textfield>\n @if (productValue) {\n <div class=\"ml-2 text-tui-text-secondary\">\n \u0421\u0442\u043E\u0438\u043C\u043E\u0441\u0442\u044C:\n <span class=\"font-bold\">{{ productValue.costRub?.toLocaleString() }} {{ productValue.currency.symbol }}/\u0448\u0442.</span>\n </div>\n }\n <tui-error\n [formControl]=\"product\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n @if (product.value && validatorWidth && validatorLength) {\n <p class=\"w-full font-bold\">\u0420\u0430\u0437\u043C\u0435\u0440\u044B \u0438\u0437\u0434\u0435\u043B\u0438\u0439</p>\n <p class=\"w-full\">\n \u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0448\u0438\u0440\u0438\u043D\u0430: {{ settings()?.minWidth }} \u043C\u043C.\n <br />\n \u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0448\u0438\u0440\u0438\u043D\u0430: {{ product.value.properties?.width }} \u043C\u043C.\n <br />\n \u041C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0434\u043B\u0438\u043D\u0430: {{ settings()?.minLength }} \u043C\u043C.\n <br />\n \u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u0430\u044F \u0434\u043B\u0438\u043D\u0430: {{ product.value.properties?.length }} \u043C\u043C.\n <br />\n </p>\n <div\n formArrayName=\"items\"\n class=\"flex flex-col gap-3\"\n >\n @for (item of items.controls; track item) {\n <div\n class=\"flex grow gap-2\"\n [formGroupName]=\"$index\"\n >\n <div class=\"grid grow grid-cols-3 gap-2\">\n <label tuiLabel>\n \u0428\u0438\u0440\u0438\u043D\u0430, \u043C\u043C\n <tui-textfield>\n <input\n tuiInputSlider\n formControlName=\"width\"\n [min]=\"settings()?.minWidth ?? 0\"\n [max]=\"product.value.properties?.width ?? 0\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n placeholder=\"\u0428\u0438\u0440\u0438\u043D\u0430\"\n autocomplete=\"off\"\n />\n @if (product.value) {\n <input\n tuiSlider\n type=\"range\"\n />\n }\n </tui-textfield>\n @if (product.value) {\n <div class=\"slider-ticks-labels\">\n <span> 0 </span>\n <span>{{ product.value.properties?.width }}</span>\n </div>\n }\n <tui-error\n formControlName=\"width\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <label tuiLabel>\n \u0414\u043B\u0438\u043D\u0430, \u043C\u043C\n <tui-textfield>\n <input\n tuiInputSlider\n formControlName=\"length\"\n [min]=\"settings()?.minLength ?? 0\"\n [max]=\"product.value.properties?.length ?? 0\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n placeholder=\"\u0414\u043B\u0438\u043D\u0430\"\n autocomplete=\"off\"\n />\n @if (product.value) {\n <input\n tuiSlider\n type=\"range\"\n />\n }\n </tui-textfield>\n @if (product.value) {\n <div class=\"slider-ticks-labels\">\n <span> 0 </span>\n <span>{{ product.value.properties?.length }}</span>\n </div>\n }\n <tui-error\n formControlName=\"length\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n <label tuiLabel>\n <span class=\"whitespace-nowrap\">\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E, \u0448\u0442</span>\n <tui-textfield [tuiTextfieldCleaner]=\"false\">\n <input\n tuiInputNumber\n formControlName=\"count\"\n [min]=\"1\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n placeholder=\"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E\"\n autocomplete=\"off\"\n />\n </tui-textfield>\n <tui-error\n formControlName=\"count\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n </div>\n <button\n tuiIconButton\n (click)=\"removeItem($index)\"\n [disabled]=\"items.length <= 1\"\n size=\"m\"\n type=\"button\"\n iconStart=\"@tui.trash-2\"\n appearance=\"secondary\"\n class=\"mt-6\"\n [style.flex]=\"'0 0 auto'\"\n ></button>\n </div>\n }\n </div>\n <button\n tuiButton\n appearance=\"secondary\"\n [disabled]=\"items.invalid\"\n (click)=\"addItem()\"\n type=\"button\"\n class=\"self-center\"\n iconStart=\"@tui.plus\"\n >\n \u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0438\u0437\u0434\u0435\u043B\u0438\u0435\n </button>\n } @else if (product.value) {\n <tui-error error=\"\u0420\u0430\u0441\u0447\u0435\u0442 \u043F\u043E \u043F\u0440\u043E\u0434\u0443\u043A\u0442\u0443 \u043D\u0435\u0432\u043E\u0437\u043C\u043E\u0436\u0435\u043D. \u041E\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044C \u043A \u043C\u0435\u043D\u0435\u0434\u0436\u0435\u0440\u0443\" />\n }\n\n <label tuiLabel>\n \u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u043A\u0430 \u0440\u0430\u0441\u043F\u0438\u043B\u0430\n <tui-textfield>\n <input\n tuiTextfield\n formControlName=\"marker\"\n placeholder=\"\u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u043A\u0430 \u0440\u0430\u0441\u043F\u0438\u043B\u0430\"\n autocomplete=\"marker\"\n />\n </tui-textfield>\n\n <tui-error\n formControlName=\"marker\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n @if (product.value) {\n <tui-loader [showLoader]=\"isCalculateLoading()\">\n @if (calculateResult) {\n <div class=\"mt-2 flex flex-wrap items-end gap-2\">\n <div>\n \u0418\u0442\u043E\u0433\u043E: <span class=\"whitespace-nowrap text-xl font-bold\">{{ getTotalCost(calculateResult).toLocaleString() }} {{ product.value.currency.symbol }}</span>\n </div>\n @if (calculateResult?.quantity && productValue) {\n <div class=\"whitespace-nowrap text-lg text-sc-dark-grey\">\n <span class=\"font-bold\">({{ calculateResult.quantity }} \u0448\u0442.</span> x\n <span class=\"font-bold\">{{ productValue.costRub?.toLocaleString() }} {{ productValue.currency.symbol }}/\u0448\u0442.)</span>\n </div>\n }\n </div>\n }\n </tui-loader>\n }\n\n <tui-error [error]=\"[] | tuiFieldError | async\" />\n\n <button\n [disabled]=\"form.invalid || !calculateResult || isCalculateLoading() || isSubmitLoading()\"\n [loading]=\"isSubmitLoading()\"\n tuiButton\n class=\"self-center\"\n iconStart=\"@tui.check\"\n >\n {{ !orderItem() ? '\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0432 \u043A\u043E\u0440\u0437\u0438\u043D\u0443' : '\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C' }}\n </button>\n </form>\n</div>\n", styles: [":host{display:block;width:100%;max-width:30rem}.slider-ticks-labels{--t-offset: calc($thumb / 2);display:flex;font:var(--tui-font-text-s);margin-inline-start:var(--t-offset);margin-inline-end:var(--t-offset);color:var(--tui-text-secondary)}.slider-ticks-labels>*{position:relative;flex:2;text-align:center}.slider-ticks-labels>*:first-child{left:calc(-1 * var(--t-offset));inset-inline-start:calc(-1 * var(--t-offset));flex:1;text-align:start}.slider-ticks-labels>*:last-child{right:calc(-1 * var(--t-offset));flex:1;text-align:end}@supports (inset-inline-end: 0){.slider-ticks-labels>*:last-child{right:unset;inset-inline-end:calc(-1 * var(--t-offset))}}tui-input-slider+.slider-ticks-labels{margin-inline-start:calc(var(--tui-radius-m) / 2 + var(--t-offset))}tui-textfield+.slider-ticks-labels{--t-offset: calc(var(--tui-radius-m) / 2 + $thumb / 2)}tui-textfield[data-size=l]+.slider-ticks-labels{--t-offset: calc(var(--tui-radius-l) / 2 + $thumb / 2)}tui-input-range:not([new])+.slider-ticks-labels,tui-range+.slider-ticks-labels{--t-offset: $thumb}tui-input-range[new]+.slider-ticks-labels{--t-offset: calc(map-get($track-inset, $input-size) + $thumb)}\n"] }]
|
|
317
|
+
}], propDecorators: { orderId: [{
|
|
318
|
+
type: Input
|
|
319
|
+
}] } });
|
|
320
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Mtc2FuZHdpY2guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NvbmZpZ3VyYXRvcnMvc2FuZHdpY2gvc2Mtc2FuZHdpY2guY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NvbmZpZ3VyYXRvcnMvc2FuZHdpY2gvc2Mtc2FuZHdpY2guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsc0RBQXNEO0FBRXRELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzdILE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDeEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBZSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5SCxPQUFPLEVBR0gsZUFBZSxFQUVmLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsbUJBQW1CLEdBT3RCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFvQixRQUFRLEVBQUUsd0JBQXdCLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsdUJBQXVCLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUssT0FBTyxFQUNILGdC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QVM7d0JBQ1QsaUJBQWlCO3dCQUNqQixjQUFjO3dCQUNkLDBCQUEwQjt3QkFDMUIsU0FBUzt3QkFDVCxnQkFBZ0I7cUJBQ25CLGFBQ1U7d0JBQ1AsdUJBQXVCLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7d0JBQ3pDLDZCQUE2QixDQUFDOzRCQUMxQixHQUFHLEVBQUUsQ0FBQzt5QkFDVCxDQUFDO3dCQUNGLHdCQUF3QixDQUFDOzRCQUNyQixTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDOzRCQUMzQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBWSxFQUFFLENBQVksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO3lCQUN6RSxDQUFDO3FCQUNMLG1CQUNnQix1QkFBdUIsQ0FBQyxNQUFNOzhCQWdDeEMsT0FBTztzQkFEYixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kICovXG5cbmltcG9ydCB7IEFzeW5jUGlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIERlc3Ryb3lSZWYsIGluamVjdCwgSW5wdXQsIGlucHV0LCBPbkluaXQsIG91dHB1dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQsIHRvT2JzZXJ2YWJsZSwgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBGb3JtQXJyYXksIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JGbiwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gICAgSVNhbmR3aWNoQ2FsY3VsYXRlLFxuICAgIElTYW5kd2ljaENhbGN1bGF0ZUl0ZW0sXG4gICAgU0NfT1JERVJfTE9BREVSLFxuICAgIFNjQ2FydCxcbiAgICBTY0NhdGFsb2dTZXJ2aWNlLFxuICAgIFNjQ29uZmlndXJhdG9yU2VydmljZSxcbiAgICBTY0NvbnZlcnRlcnNTZXJ2aWNlLFxuICAgIFNjSUFwaUVycm9yUmVzcG9uc2UsXG4gICAgU2NJQ29uZmlndXJhdG9yQ2FsY3VsYXRlUmVzdWx0LFxuICAgIFNjSU9yZGVyRWRpdG9yTG9hZGVyLFxuICAgIFNjT3JkZXJEcmFmdCxcbiAgICBTY09yZGVySXRlbSxcbiAgICBTY1Byb2R1Y3QsXG59IGZyb20gJ0BzbmFiY2VudHIvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgdHVpQ29udHJvbFZhbHVlIH0gZnJvbSAnQHRhaWdhLXVpL2Nkayc7XG5pbXBvcnQgeyBUdWlCdXR0b24sIFR1aURpYWxvZ0NvbnRleHQsIFR1aUVycm9yLCB0dWlJdGVtc0hhbmRsZXJzUHJvdmlkZXIsIFR1aUxhYmVsLCBUdWlMb2FkZXIsIFR1aU51bWJlckZvcm1hdCwgdHVpTnVtYmVyRm9ybWF0UHJvdmlkZXIsIFR1aVRleHRmaWVsZCB9IGZyb20gJ0B0YWlnYS11aS9jb3JlJztcbmltcG9ydCB7XG4gICAgVHVpQnV0dG9uTG9hZGluZyxcbiAgICBUdWlDaGV2cm9uLFxuICAgIFR1aURhdGFMaXN0V3JhcHBlckNvbXBvbmVudCxcbiAgICBUdWlGaWVsZEVycm9yUGlwZSxcbiAgICBUdWlJbnB1dE51bWJlcixcbiAgICB0dWlJbnB1dE51bWJlck9wdGlvbnNQcm92aWRlcixcbiAgICBUdWlJbnB1dFNsaWRlcixcbiAgICBUdWlTZWxlY3QsXG59IGZyb20gJ0B0YWlnYS11aS9raXQnO1xuaW1wb3J0IHsgUE9MWU1PUlBIRVVTX0NPTlRFWFQgfSBmcm9tICdAdGFpZ2EtdWkvcG9seW1vcnBoZXVzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIGNvbWJpbmVMYXRlc3QsIGRlYm91bmNlVGltZSwgZmlsdGVyLCBmaW5hbGl6ZSwgbWFwLCBPYnNlcnZhYmxlLCBvZiwgc2hhcmUsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgU2NOZXh0SW5wdXRGb2N1c01vZHVsZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvbmV4dC1pbnB1dC1mb2N1cy9zYy1uZXh0LWlucHV0LWZvY3VzLm1vZHVsZSc7XG5pbXBvcnQgeyBTY1NlbGVjdE9uRm9jdXNpbkRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2RpcmVjdGl2ZXMvc2VsZWN0LW9uLWZvY3VzaW4vc2Mtc2VsZWN0LW9uLWZvY3VzaW4uZGlyZWN0aXZlJztcbmltcG9ydCB7IFNDX0RFQk9VTkNFX1RJTUVfREVGQVVMVCB9IGZyb20gJy4uLy4uL3Byb3ZpZGVycyc7XG5pbXBvcnQgeyBzdGVwVmFsaWRhdG9yIH0gZnJvbSAnLi4vLi4vdmFsaWRhdG9ycy9zdGVwLXZhbGlkYXRvcic7XG5pbXBvcnQgeyBTY0lTYW5kd2ljaFNldHRpbmdzIH0gZnJvbSAnLi4vbW9kZWxzL3NhbmR3aWNoL3NjLWktc2FuZHdpY2gtc2V0dGluZ3MnO1xuaW1wb3J0IHsgU2NJTmV3Q2FydEl0ZW1TYW5kd2ljaCB9IGZyb20gJy4vc2MtaS1uZXctY2FydC1pdGVtLXNhbmR3aWNoJztcblxuLyoqXG4gKiDQmtC+0L3RhNC40LPRg9GA0LDRgtC+0YAg0YDQsNGB0L/QuNC70LAg0YHRjdC90LTQstC40Yct0L/QsNC90LXQu9C10LkuXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdzYy1zYW5kd2ljaCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NjLXNhbmR3aWNoLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybDogJy4vc2Mtc2FuZHdpY2guY29tcG9uZW50LnNjc3MnLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgVHVpQnV0dG9uLFxuICAgICAgICBGb3Jtc01vZHVsZSxcbiAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICAgICAgU2NOZXh0SW5wdXRGb2N1c01vZHVsZSxcbiAgICAgICAgVHVpTGFiZWwsXG4gICAgICAgIFR1aURhdGFMaXN0V3JhcHBlckNvbXBvbmVudCxcbiAgICAgICAgVHVpRXJyb3IsXG4gICAgICAgIFR1aVRleHRmaWVsZCxcbiAgICAgICAgVHVpQ2hldnJvbixcbiAgICAgICAgVHVpU2VsZWN0LFxuICAgICAgICBUdWlJbnB1dE51bWJlcixcbiAgICAgICAgVHVpTnVtYmVyRm9ybWF0LFxuICAgICAgICBBc3luY1BpcGUsXG4gICAgICAgIFR1aUZpZWxkRXJyb3JQaXBlLFxuICAgICAgICBUdWlJbnB1dFNsaWRlcixcbiAgICAgICAgU2NTZWxlY3RPbkZvY3VzaW5EaXJlY3RpdmUsXG4gICAgICAgIFR1aUxvYWRlcixcbiAgICAgICAgVHVpQnV0dG9uTG9hZGluZyxcbiAgICBdLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB0dWlOdW1iZXJGb3JtYXRQcm92aWRlcih7IHByZWNpc2lvbjogMCB9KSxcbiAgICAgICAgdHVpSW5wdXROdW1iZXJPcHRpb25zUHJvdmlkZXIoe1xuICAgICAgICAgICAgbWluOiAwLFxuICAgICAgICB9KSxcbiAgICAgICAgdHVpSXRlbXNIYW5kbGVyc1Byb3ZpZGVyKHtcbiAgICAgICAgICAgIHN0cmluZ2lmeTogc2lnbmFsKCh4OiBTY1Byb2R1Y3QpID0+IHgubmFtZSksXG4gICAgICAgICAgICBpZGVudGl0eU1hdGNoZXI6IHNpZ25hbCgoYTogU2NQcm9kdWN0LCBiOiBTY1Byb2R1Y3QpID0+IGEuaWQgPT09IGIuaWQpLFxuICAgICAgICB9KSxcbiAgICBdLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBTY1NhbmR3aWNoQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICAvKipcbiAgICAgKiDQlNCw0L3QvdGL0LUg0L3QsNGB0YLRgNC+0LXQuiDQvtC60YDRg9C20LXQvdC40Y8uXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZWJvdW5jZVRpbWVEZWZhdWx0OiBudW1iZXIgPSBpbmplY3Q8bnVtYmVyPihTQ19ERUJPVU5DRV9USU1FX0RFRkFVTFQpO1xuXG4gICAgLyoqXG4gICAgICog0J3QsNGB0YLRgNC+0LnQutC4INC00LvRjyDQutC+0L3RhNC40LPRg9GA0LDRgtC+0YDQsCDRgdGN0L3QtNCy0LjRhy3Qv9Cw0L3QtdC70LXQuS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgc2V0dGluZ3MgPSBpbnB1dDxTY0lTYW5kd2ljaFNldHRpbmdzPigpO1xuXG4gICAgLyoqXG4gICAgICog0JjQtNC10L3RgtC40YTQuNC60LDRgtC+0YAg0LrQsNGC0LXQs9C+0YDQuNC4LlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBjYXRlZ29yeUlkID0gaW5wdXQucmVxdWlyZWQ8bnVtYmVyIHwgc3RyaW5nPigpO1xuXG4gICAgLyoqXG4gICAgICog0J3QsNC30LLQsNC90LjQtSDQutC+0L3RhNC40LPRg9GA0LDRgtC+0YDQsC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgZWRpdG9yID0gaW5wdXQucmVxdWlyZWQ8c3RyaW5nPigpO1xuXG4gICAgLyoqXG4gICAgICog0J/QvtC30LjRhtC40Y8g0YLQvtCy0LDRgNCwL9GD0YHQu9GD0LPQuCDQsiDQutC+0YDQt9C40L3QtS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgb3JkZXJJdGVtID0gaW5wdXQucmVxdWlyZWQ8U2NPcmRlckl0ZW0gfCB1bmRlZmluZWQ+KCk7XG5cbiAgICAvKipcbiAgICAgKiDQmNC00LXQvdGC0LjRhNC40LrQsNGC0L7RgCDQt9Cw0LrQsNC30LAuXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgb3JkZXJJZD86IG51bWJlcjtcblxuICAgIC8qKlxuICAgICAqINCh0L7QsdGL0YLQuNC1INC/0LXRgNC10LrQu9GO0YfQtdC90LjRjyDQvtGC0L7QsdGA0LDQttC10L3QuNGPINGC0L7QstCw0YDQvtCyLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSB0b2dnbGVTaG93RXZlbnQgPSBvdXRwdXQoKTtcblxuICAgIC8qKlxuICAgICAqINCk0L7RgNC80LAg0LTQvtCx0LDQstC70LXQvdC40Y8v0YDQtdC00LDQutGC0LjRgNC+0LLQsNC90LjRjyDQv9GA0L7QtNGD0LrRgtCwINCyINC60L7RgNC30LjQvdC1LlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBmb3JtID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgICAgIHByb2R1Y3RDYXRlZ29yeUlkOiBuZXcgRm9ybUNvbnRyb2w8bnVtYmVyIHwgbnVsbD4obnVsbCwgeyB2YWxpZGF0b3JzOiBWYWxpZGF0b3JzLnJlcXVpcmVkIH0pLFxuICAgICAgICBjb25maWd1cmF0b3I6IG5ldyBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPihudWxsLCB7IHZhbGlkYXRvcnM6IFZhbGlkYXRvcnMucmVxdWlyZWQgfSksXG4gICAgICAgIHF1YW50aXR5OiBuZXcgRm9ybUNvbnRyb2w8bnVtYmVyIHwgbnVsbD4obnVsbCwgeyB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgc3RlcFZhbGlkYXRvcigxKV0gfSksXG4gICAgICAgIG1hcmtlcjogbmV3IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+KG51bGwpLFxuICAgICAgICBpdGVtczogbmV3IEZvcm1BcnJheTxSZXR1cm5UeXBlPFNjU2FuZHdpY2hDb21wb25lbnRbJ2NyZWF0ZUl0ZW1Hcm91cCddPj4oW10pLFxuICAgICAgICBjYWxjdWxhdGlvbklkOiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4obnVsbCksXG4gICAgfSk7XG5cbiAgICAvKipcbiAgICAgKiDQodC10YDQstC40YEg0L/QvtC70YPRh9C10L3QuNGPINC4INGA0LXQtNCw0LrRgtC40YDQvtCy0LDQvdC40Y8g0YHQv9C40YHQutCwINGC0L7QstCw0YDQvtCyINC30LDQutCw0LfQsCAo0LrQvtGA0LfQuNC90LAgLyDQt9Cw0LrQsNC3IC8g0YfQtdGA0L3QvtCy0LjQuiA9INC30LDQutCw0LcpLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBvcmRlclNlcnZpY2UgPSBpbmplY3Q8U2NJT3JkZXJFZGl0b3JMb2FkZXI8U2NPcmRlckl0ZW0sIFNjQ2FydCB8IFNjT3JkZXJEcmFmdD4+KFNDX09SREVSX0xPQURFUik7XG5cbiAgICAvKipcbiAgICAgKiDQodC10YDQstC40YEg0LrQvtC90LLQtdGA0YLQsNGG0LjQuCDQtNCw0L3QvdGL0YUuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb252ZXJ0ZXJzU2VydmljZTogU2NDb252ZXJ0ZXJzU2VydmljZSA9IGluamVjdChTY0NvbnZlcnRlcnNTZXJ2aWNlKTtcblxuICAgIC8qKlxuICAgICAqINCa0L7QvdGC0LXQutGB0YIg0LTQuNCw0LvQvtCz0L7QstC+0LPQviDQvtC60L3QsCwg0LIg0LrQvtGC0L7RgNC+0Lwg0L7RgtC60YDRi9GCINC60L7QvNC/0L7QvdC10L3Rgi5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRleHQ6IFR1aURpYWxvZ0NvbnRleHQgfCB1bmRlZmluZWQgPSBpbmplY3QoUE9MWU1PUlBIRVVTX0NPTlRFWFQsIHsgb3B0aW9uYWw6IHRydWUgfSkgYXMgVHVpRGlhbG9nQ29udGV4dCB8IHVuZGVmaW5lZDtcblxuICAgIC8qKlxuICAgICAqINCh0LXRgNCy0LjRgSDQtNC70Y8g0YDQsNCx0L7RgtGLINGBINC60LDRgtCw0LvQvtCz0L7QvC5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IGNhdGFsb2dTZXJ2aWNlOiBTY0NhdGFsb2dTZXJ2aWNlID0gaW5qZWN0KFNjQ2F0YWxvZ1NlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICog0KHQtdGA0LLQuNGBINC00LvRjyDRgNCw0LHQvtGC0Ysg0YEg0LrQvtC90YTQuNCz0YPRgNCw0YLQvtGA0LDQvNC4LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlndXJhdG9yU2VydmljZTogU2NDb25maWd1cmF0b3JTZXJ2aWNlID0gaW5qZWN0KFNjQ29uZmlndXJhdG9yU2VydmljZSk7XG5cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgT2JzZXJ2YWJsZX0g0YHQv9C40YHQutCwINGC0L7QstCw0YDQvtCyINC60LDRgtC10LPQvtGA0LjQuC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvZHVjdHMkOiBPYnNlcnZhYmxlPFNjUHJvZHVjdFtdPiA9IHRvT2JzZXJ2YWJsZSh0aGlzLmNhdGVnb3J5SWQpLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoY2F0ZWdvcnlJZCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjYXRlZ29yeUlkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKFtdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2F0YWxvZ1NlcnZpY2UuZ2V0UHJvZHVjdHNDYXRlZ29yeUNhY2hlZCQoeyBjYXRlZ29yeUlkOiBOdW1iZXIoY2F0ZWdvcnlJZCkgfSkucGlwZShtYXAoKHByb2R1Y3RzKSA9PiBwcm9kdWN0cyA/PyBbXSkpO1xuICAgICAgICB9KVxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiDQktGL0LHRgNCw0L3QvdGL0Lkg0L/RgNC+0LTRg9C60YIgKNC80LDRgtC10YDQuNCw0Lsg0LTQu9GPINGA0LDRgdC60YDQvtGPKS5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvZHVjdCA9IG5ldyBGb3JtQ29udHJvbDxTY1Byb2R1Y3QgfCBudWxsPihudWxsLCB7IHZhbGlkYXRvcnM6IFZhbGlkYXRvcnMucmVxdWlyZWQgfSk7XG5cbiAgICAvKipcbiAgICAgKiB7QGxpbmsgT2JzZXJ2YWJsZX0g0YDQsNGB0YfQtdGC0LAg0L7Qv9GC0LjQvNC40LfQsNGG0LjQuCDRgNCw0YHQutC70LDQtNC60LguXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBjYWxjdWxhdGUkOiBPYnNlcnZhYmxlPFNjSUNvbmZpZ3VyYXRvckNhbGN1bGF0ZVJlc3VsdCB8IG51bGwgfCB1bmRlZmluZWQ+ID0gY29tYmluZUxhdGVzdCh7XG4gICAgICAgIHByb2R1Y3RJZDogdHVpQ29udHJvbFZhbHVlPFNjUHJvZHVjdCB8IG51bGw+KHRoaXMucHJvZHVjdCkucGlwZShtYXAoKHByb2R1Y3QpID0+IHByb2R1Y3Q/LmlkID8/IG51bGwpKSxcbiAgICAgICAgaXRlbXM6IHR1aUNvbnRyb2xWYWx1ZTxJU2FuZHdpY2hDYWxjdWxhdGVJdGVtW10+KHRoaXMuaXRlbXMpLFxuICAgIH0pLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSh0aGlzLmRlYm91bmNlVGltZURlZmF1bHQpLFxuICAgICAgICBzd2l0Y2hNYXAoKHsgcHJvZHVjdElkLCBpdGVtcyB9KSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvZHVjdElkID09PSBudWxsIHx8IGl0ZW1zLmxlbmd0aCA9PT0gMCB8fCB0aGlzLmZvcm0uY29udHJvbHMuaXRlbXMuaW52YWxpZCkge1xuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25vLXVzZWxlc3MtdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRvclNlcnZpY2UuY2FsY3VsYXRlJCh0aGlzLmNhdGVnb3J5SWQoKSwgdGhpcy5lZGl0b3IoKSwgeyBwcm9kdWN0SWQsIGl0ZW1zIH0pLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFwKChjYWxjdWxhdGVSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtLmdldCgncXVhbnRpdHknKT8uc2V0VmFsdWUoY2FsY3VsYXRlUmVzdWx0LnF1YW50aXR5KTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBzdGFydFdpdGgobnVsbCksXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZihudWxsKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pLFxuICAgICAgICBzaGFyZSgpXG4gICAgKTtcblxuICAgIC8qKlxuICAgICAqINCg0LXQt9GD0LvRjNGC0LDRgiDRgNCw0YHRh9C10YLQsCDQvtC/0YLQuNC80LjQt9Cw0YbQuNC4INGA0LDRgdC60LvQsNC00LrQuC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2FsY3VsYXRlUmVzdWx0JDogT2JzZXJ2YWJsZTxTY0lDb25maWd1cmF0b3JDYWxjdWxhdGVSZXN1bHQgfCB1bmRlZmluZWQ+ID0gdGhpcy5jYWxjdWxhdGUkLnBpcGUoZmlsdGVyKChkYXRhKSA9PiBkYXRhICE9PSBudWxsKSk7XG5cbiAgICAvKipcbiAgICAgKiDQodC40LPQvdCw0Lsg0YHQvtGB0YLQvtGP0L3QuNGPINC30LDQs9GA0YPQt9C60Lgg0YDQsNGB0YfQtdGC0LAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzQ2FsY3VsYXRlTG9hZGluZyA9IHRvU2lnbmFsKHRoaXMuY2FsY3VsYXRlJC5waXBlKG1hcCgoZGF0YSkgPT4gZGF0YSA9PT0gbnVsbCkpLCB7IGluaXRpYWxWYWx1ZTogZmFsc2UgfSk7XG5cbiAgICAvKipcbiAgICAgKiDQktCw0LvQuNC00LDRgtC+0YAg0LTQu9GPINGI0LjRgNC40L3RiyDQuNC30LTQtdC70LjRjy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdmFsaWRhdG9yV2lkdGgkOiBPYnNlcnZhYmxlPFZhbGlkYXRvckZuIHwgbnVsbD4gPSB0dWlDb250cm9sVmFsdWU8U2NQcm9kdWN0IHwgbnVsbD4odGhpcy5wcm9kdWN0KS5waXBlKFxuICAgICAgICBtYXAoKHByb2R1Y3QpID0+IFZhbGlkYXRvcnMubWluKHByb2R1Y3Q/LnByb3BlcnRpZXM/LndpZHRoID8/IDApKVxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiDQktCw0LvQuNC00LDRgtC+0YAg0LTQu9GPINC00LvQuNC90Ysg0LjQt9C00LXQu9C40Y8uXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHZhbGlkYXRvckxlbmd0aCQ6IE9ic2VydmFibGU8VmFsaWRhdG9yRm4gfCBudWxsPiA9IHR1aUNvbnRyb2xWYWx1ZTxTY1Byb2R1Y3QgfCBudWxsPih0aGlzLnByb2R1Y3QpLnBpcGUoXG4gICAgICAgIG1hcCgocHJvZHVjdCkgPT4gVmFsaWRhdG9ycy5taW4ocHJvZHVjdD8ucHJvcGVydGllcz8ubGVuZ3RoID8/IDApKVxuICAgICk7XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0LjQt9C90LDQuiDRgtC+0LPQviwg0YfRgtC+INCy0YvQv9C+0LvQvdGP0LXRgtGB0Y8g0LfQsNC/0YDQvtGBINC90LAg0L7RgtC/0YDQsNCy0LrRgyDQtNCw0L3QvdGL0YUg0LLRi9C/0L7Qu9C90Y/QtdGC0YHRjy5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNTdWJtaXRMb2FkaW5nID0gc2lnbmFsKGZhbHNlKTtcblxuICAgIC8qKlxuICAgICAqINCh0YHRi9C70LrQsCDQtNC70Y8g0LDQstGC0L7QvNCw0YLQuNGH0LXRgdC60L7Qs9C+INGD0L/RgNCw0LLQu9C10L3QuNGPINGD0L3QuNGH0YLQvtC20LXQvdC40LXQvCDQt9Cw0LLQuNGB0LjQvNC+0YHRgtC10LkuXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmOiBEZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gICAgLyoqXG4gICAgICog0JzQsNGB0YHQuNCyINC40LfQtNC10LvQuNC5LlxuICAgICAqL1xuICAgIGdldCBpdGVtcygpOiBGb3JtQXJyYXk8UmV0dXJuVHlwZTxTY1NhbmR3aWNoQ29tcG9uZW50WydjcmVhdGVJdGVtR3JvdXAnXT4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZm9ybS5jb250cm9scy5pdGVtcztcbiAgICB9XG5cbiAgICAvKiogQGluaGVyaXREb2MgKi9cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2V0RGVmYXVsdEZvcm1WYWx1ZSgpO1xuXG4gICAgICAgIHRoaXMucHJvZHVjdC52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSkuc3Vic2NyaWJlKChwcm9kdWN0KSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvZHVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMuY29udHJvbHMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGl0ZW0uZ2V0UmF3VmFsdWUoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoKHByb2R1Y3QucHJvcGVydGllcz8ud2lkdGggJiYgdmFsdWUud2lkdGggPCBwcm9kdWN0LnByb3BlcnRpZXMud2lkdGgpIHx8IChwcm9kdWN0LnByb3BlcnRpZXM/Lmxlbmd0aCAmJiB2YWx1ZS5sZW5ndGggPCBwcm9kdWN0LnByb3BlcnRpZXMubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogTWF0aC5taW4odmFsdWUud2lkdGgsIHByb2R1Y3QucHJvcGVydGllcy53aWR0aCA/PyB2YWx1ZS53aWR0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoOiBNYXRoLm1pbih2YWx1ZS5sZW5ndGgsIHByb2R1Y3QucHJvcGVydGllcy5sZW5ndGggPz8gdmFsdWUubGVuZ3RoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCh0L7Qt9C00LDQtdGCINCz0YDRg9C/0L/RgyDQtNC70Y8g0LjQt9C00LXQu9C40Y8uXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbSDQn9Cw0YDQsNC80LXRgtGA0Ysg0LjQt9C00LXQu9C40Y8uXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVJdGVtR3JvdXAoaXRlbT86IElTYW5kd2ljaENhbGN1bGF0ZUl0ZW0pOiBGb3JtR3JvdXA8e1xuICAgICAgICB3aWR0aDogRm9ybUNvbnRyb2w8bnVtYmVyPjtcbiAgICAgICAgbGVuZ3RoOiBGb3JtQ29udHJvbDxudW1iZXI+O1xuICAgICAgICBjb3VudDogRm9ybUNvbnRyb2w8bnVtYmVyPjtcbiAgICB9PiB7XG4gICAgICAgIHJldHVybiBuZXcgRm9ybUdyb3VwKHtcbiAgICAgICAgICAgIHdpZHRoOiBuZXcgRm9ybUNvbnRyb2w8bnVtYmVyPihpdGVtPy53aWR0aCA/PyAwLCB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKHRoaXMuc2V0dGluZ3MoKT8ubWluV2lkdGggPz8gMC4wMSldLFxuICAgICAgICAgICAgICAgIG5vbk51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBsZW5ndGg6IG5ldyBGb3JtQ29udHJvbDxudW1iZXI+KGl0ZW0/Lmxlbmd0aCA/PyAwLCB7XG4gICAgICAgICAgICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluKHRoaXMuc2V0dGluZ3MoKT8ubWluTGVuZ3RoID8/IDAuMDEpXSxcbiAgICAgICAgICAgICAgICBub25OdWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY291bnQ6IG5ldyBGb3JtQ29udHJvbDxudW1iZXI+KGl0ZW0/LmNvdW50ID8/IDEsIHtcbiAgICAgICAgICAgICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMSldLFxuICAgICAgICAgICAgICAgIG5vbk51bGxhYmxlOiB0cnVlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCU0L7QsdCw0LLQu9GP0LXRgiDQvdC+0LLQvtC1INC40LfQtNC10LvQuNC1INCyINGE0L7RgNC80YMuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGFkZEl0ZW0oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXRlbXMucHVzaCh0aGlzLmNyZWF0ZUl0ZW1Hcm91cCgpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQo9C00LDQu9GP0LXRgiDQuNC30LTQtdC70LjQtSDQuNC3INGE0L7RgNC80YsuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5kZXgg0JjQvdC00LXQutGBINC40LfQtNC10LvQuNGPLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZW1vdmVJdGVtKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pdGVtcy5yZW1vdmVBdChpbmRleCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0JLQvtC30LLRgNCw0YnQsNC10YIg0LjRgtC+0LPQvtCy0YPRjiDRgdGC0L7QuNC80L7RgdGC0YwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2FsY3VsYXRlUmVzdWx0INCg0LXQt9GD0LvRjNGC0LDRgiDRgNCw0YHRh9C10YLQsCDQvtC/0YLQuNC80LjQt9Cw0YbQuNC4INGA0LDRgdC60LvQsNC00LrQuC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgZ2V0VG90YWxDb3N0KGNhbGN1bGF0ZVJlc3VsdDogU2NJQ29uZmlndXJhdG9yQ2FsY3VsYXRlUmVzdWx0KTogbnVtYmVyIHtcbiAgICAgICAgaWYgKCF0aGlzLnByb2R1Y3QudmFsdWU/LmNvc3RSdWIpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdG90YWxDb3N0ID0gY2FsY3VsYXRlUmVzdWx0LnF1YW50aXR5ICogdGhpcy5wcm9kdWN0LnZhbHVlLmNvc3RSdWI7XG5cbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQodG90YWxDb3N0ICogMTAwKSAvIDEwMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0YDQsNCx0L7RgtGH0LjQuiDQtNC+0LHQsNCy0LvQtdC90LjRjy/RgNC10LTQsNC60YLQuNGA0L7QstCw0L3QuNGPINC/0YDQvtC00YPQutGC0LAg0LIg0LrQvtGA0LfQuNC90LUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2FsY3VsYXRlUmVzdWx0INCg0LXQt9GD0LvRjNGC0LDRgiDRgNCw0YHRh9C10YLQsCDQvtC/0YLQuNC80LjQt9Cw0YbQuNC4INGA0LDRgdC60LvQsNC00LrQuC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb25TdWJtaXQoY2FsY3VsYXRlUmVzdWx0OiBTY0lDb25maWd1cmF0b3JDYWxjdWxhdGVSZXN1bHQgfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgICAgIGlmICghY2FsY3VsYXRlUmVzdWx0IHx8IHRoaXMuZm9ybS5pbnZhbGlkIHx8IHRoaXMuaXNDYWxjdWxhdGVMb2FkaW5nKCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuY29udmVydGVyc1NlcnZpY2UucmVtb3ZlTnVsbCh7XG4gICAgICAgICAgICAuLi50aGlzLmZvcm0udmFsdWUsXG4gICAgICAgICAgICBwcm9kdWN0SWQ6IHRoaXMucHJvZHVjdC52YWx1ZT8uaWQgPz8gbnVsbCxcbiAgICAgICAgICAgIGNhbGN1bGF0aW9uSWQ6IGNhbGN1bGF0ZVJlc3VsdC5pZCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vINCj0LTQsNC70Y/QtdC8IGl0ZW1zLCDRgtCw0Log0LrQsNC6INC+0L3QuCDQvdC1INC90YPQttC90Ysg0LIge0BsaW5rIFNjSU5ld0NhcnRJdGVtU2FuZHdpY2h9LlxuICAgICAgICBkZWxldGUgZm9ybVZhbHVlLml0ZW1zO1xuICAgICAgICBjb25zdCBvcmRlckRhdGEgPSB0aGlzLm9yZGVySXRlbSgpO1xuXG4gICAgICAgIGNvbnN0IG5ld0NhcnRJdGVtJCA9IG9yZGVyRGF0YVxuICAgICAgICAgICAgPyB0aGlzLm9yZGVyU2VydmljZS51cGRhdGVQcm9kdWN0JChvcmRlckRhdGEuaWQsIGZvcm1WYWx1ZSBhcyBTY0lOZXdDYXJ0SXRlbVNhbmR3aWNoLCB0aGlzLm9yZGVySWQpLnBpcGUoc3RhcnRXaXRoKG51bGwpKVxuICAgICAgICAgICAgOiB0aGlzLm9yZGVyU2VydmljZS5hZGRQcm9kdWN0JChmb3JtVmFsdWUgYXMgU2NJTmV3Q2FydEl0ZW1TYW5kd2ljaCwgdGhpcy5vcmRlcklkKTtcblxuICAgICAgICB0aGlzLmlzU3VibWl0TG9hZGluZy5zZXQodHJ1ZSk7XG5cbiAgICAgICAgbmV3Q2FydEl0ZW0kXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuJGltcGxpY2l0LmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldERlZmF1bHRGb3JtVmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGNhdGNoRXJyb3IoKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGVycm9ycywgbWVzc2FnZSB9ID0gZXJyb3IuZXJyb3IgYXMgU2NJQXBpRXJyb3JSZXNwb25zZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9ycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGVycm9ycykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzZWN1cml0eS9kZXRlY3Qtb2JqZWN0LWluamVjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm0uZ2V0KGtleSk/LnNldEVycm9ycyh7IHNlcnZlclJlc3BvbnNlOiBlcnJvcnNba2V5XSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zZXRFcnJvcnMoeyBzZXJ2ZXJSZXNwb25zZTogW21lc3NhZ2VdIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZigpO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1N1Ym1pdExvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCj0YHRgtCw0L3QsNCy0LvQuNCy0LDQtdGCINC90LDRh9Cw0LvRjNC90YvQtSDQt9C90LDRh9C10L3QuNGPINC00LvRjyDQv9C+0LvQtdC5INGE0L7RgNC80YsuXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXREZWZhdWx0Rm9ybVZhbHVlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvcm0ucmVzZXQoe1xuICAgICAgICAgICAgcHJvZHVjdENhdGVnb3J5SWQ6IE51bWJlcih0aGlzLmNhdGVnb3J5SWQoKSksXG4gICAgICAgICAgICBjb25maWd1cmF0b3I6IHRoaXMuZWRpdG9yKCksXG4gICAgICAgICAgICBxdWFudGl0eTogdGhpcy5vcmRlckl0ZW0oKT8ucXVhbnRpdHkgPz8gbnVsbCxcbiAgICAgICAgICAgIG1hcmtlcjogdGhpcy5vcmRlckl0ZW0oKT8ubWFya2VyID8/ICcnLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLml0ZW1zLmNsZWFyKCk7XG5cbiAgICAgICAgdGhpcy5wcm9kdWN0LnJlc2V0KHRoaXMub3JkZXJJdGVtKCk/LnByb2R1Y3QgPz8gbnVsbCk7XG5cbiAgICAgICAgY29uc3QgY29uZmlndXJhdG9yUGFyYW1ldGVycyA9IHRoaXMub3JkZXJJdGVtKCk/LmNvbmZpZ3VyYXRvclBhcmFtcyBhcyBJU2FuZHdpY2hDYWxjdWxhdGUgfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgY29uZmlndXJhdG9yUGFyYW1ldGVycz8uaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pdGVtcy5wdXNoKHRoaXMuY3JlYXRlSXRlbUdyb3VwKHsgd2lkdGg6IGl0ZW0ud2lkdGgsIGxlbmd0aDogaXRlbS5sZW5ndGgsIGNvdW50OiBpdGVtLmNvdW50IH0pKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFjb25maWd1cmF0b3JQYXJhbWV0ZXJzPy5pdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkSXRlbSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiQGlmICghb3JkZXJJdGVtKCkgJiYgc2V0dGluZ3MoKT8uYWxsb3dTaG93VGFibGUpIHtcbiAgICA8ZGl2IGNsYXNzPVwibWItNSBmbGV4IGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR1aUJ1dHRvblxuICAgICAgICAgICAgYXBwZWFyYW5jZT1cInNlY29uZGFyeVwiXG4gICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlU2hvd0V2ZW50LmVtaXQoKVwiXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgIGljb25TdGFydD1cIkB0dWkubGF5b3V0LWxpc3RcIlxuICAgICAgICA+XG4gICAgICAgICAgICDQn9C+0LrQsNC30LDRgtGMINCyINCy0LjQtNC1INGB0L/QuNGB0LrQsFxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbn1cbjxkaXYgY2xhc3M9XCJcIj5cbiAgICBAbGV0IGNhbGN1bGF0ZVJlc3VsdCA9IGNhbGN1bGF0ZVJlc3VsdCQgfCBhc3luYztcbiAgICBAbGV0IHByb2R1Y3RzID0gcHJvZHVjdHMkIHwgYXN5bmM7XG4gICAgQGxldCBwcm9kdWN0VmFsdWUgPSBwcm9kdWN0LnZhbHVlO1xuICAgIEBsZXQgdmFsaWRhdG9yV2lkdGggPSB2YWxpZGF0b3JXaWR0aCQgfCBhc3luYztcbiAgICBAbGV0IHZhbGlkYXRvckxlbmd0aCA9IHZhbGlkYXRvckxlbmd0aCQgfCBhc3luYztcblxuICAgIDxmb3JtXG4gICAgICAgIFtmb3JtR3JvdXBdPVwiZm9ybVwiXG4gICAgICAgIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdChjYWxjdWxhdGVSZXN1bHQpXCJcbiAgICAgICAgU2NOZXh0SW5wdXRGb2N1c1xuICAgICAgICBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTNcIlxuICAgID5cbiAgICAgICAgPGxhYmVsXG4gICAgICAgICAgICB0dWlMYWJlbFxuICAgICAgICAgICAgY2xhc3M9XCJncm93XCJcbiAgICAgICAgPlxuICAgICAgICAgICAg0KLQvtCy0LDRgFxuICAgICAgICAgICAgPHR1aS10ZXh0ZmllbGRcbiAgICAgICAgICAgICAgICB0dWlDaGV2cm9uXG4gICAgICAgICAgICAgICAgW3R1aVRleHRmaWVsZENsZWFuZXJdPVwiZmFsc2VcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICB0dWlDaGV2cm9uXG4gICAgICAgICAgICAgICAgICAgIHR1aVNlbGVjdFxuICAgICAgICAgICAgICAgICAgICBbZm9ybUNvbnRyb2xdPVwicHJvZHVjdFwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi0JLRi9Cx0LXRgNC40YLQtSDQvNCw0YLQtdGA0LjQsNC7XCJcbiAgICAgICAgICAgICAgICAvPlxuXG4gICAgICAgICAgICAgICAgPHR1aS1kYXRhLWxpc3Qtd3JhcHBlclxuICAgICAgICAgICAgICAgICAgICAqdHVpVGV4dGZpZWxkRHJvcGRvd25cbiAgICAgICAgICAgICAgICAgICAgbmV3XG4gICAgICAgICAgICAgICAgICAgIFtpdGVtc109XCJwcm9kdWN0c1wiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvdHVpLXRleHRmaWVsZD5cbiAgICAgICAgICAgIEBpZiAocHJvZHVjdFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLTIgdGV4dC10dWktdGV4dC1zZWNvbmRhcnlcIj5cbiAgICAgICAgICAgICAgICAgICAg0KHRgtC+0LjQvNC+0YHRgtGMOlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9sZFwiPnt7IHByb2R1Y3RWYWx1ZS5jb3N0UnViPy50b0xvY2FsZVN0cmluZygpIH19IHt7IHByb2R1Y3RWYWx1ZS5jdXJyZW5jeS5zeW1ib2wgfX0v0YjRgi48L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8dHVpLWVycm9yXG4gICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sXT1cInByb2R1Y3RcIlxuICAgICAgICAgICAgICAgIFtlcnJvcl09XCJbXSB8IHR1aUZpZWxkRXJyb3IgfCBhc3luY1wiXG4gICAgICAgICAgICAvPlxuICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgIEBpZiAocHJvZHVjdC52YWx1ZSAmJiB2YWxpZGF0b3JXaWR0aCAmJiB2YWxpZGF0b3JMZW5ndGgpIHtcbiAgICAgICAgICAgIDxwIGNsYXNzPVwidy1mdWxsIGZvbnQtYm9sZFwiPtCg0LDQt9C80LXRgNGLINC40LfQtNC10LvQuNC5PC9wPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJ3LWZ1bGxcIj5cbiAgICAgICAgICAgICAgICDQnNC40L3QuNC80LDQu9GM0L3QsNGPINGI0LjRgNC40L3QsDoge3sgc2V0dGluZ3MoKT8ubWluV2lkdGggfX0g0LzQvC5cbiAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICDQnNCw0LrRgdC40LzQsNC70YzQvdCw0Y8g0YjQuNGA0LjQvdCwOiB7eyBwcm9kdWN0LnZhbHVlLnByb3BlcnRpZXM/LndpZHRoIH19INC80LwuXG4gICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgICAg0JzQuNC90LjQvNCw0LvRjNC90LDRjyDQtNC70LjQvdCwOiB7eyBzZXR0aW5ncygpPy5taW5MZW5ndGggfX0g0LzQvC5cbiAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICDQnNCw0LrRgdC40LzQsNC70YzQvdCw0Y8g0LTQu9C40L3QsDoge3sgcHJvZHVjdC52YWx1ZS5wcm9wZXJ0aWVzPy5sZW5ndGggfX0g0LzQvC5cbiAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBmb3JtQXJyYXlOYW1lPVwiaXRlbXNcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtM1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBpdGVtcy5jb250cm9sczsgdHJhY2sgaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZsZXggZ3JvdyBnYXAtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9ybUdyb3VwTmFtZV09XCIkaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ3JpZCBncm93IGdyaWQtY29scy0zIGdhcC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIHR1aUxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDQqNC40YDQuNC90LAsINC80LxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR1aS10ZXh0ZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlJbnB1dFNsaWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIndpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cInNldHRpbmdzKCk/Lm1pbldpZHRoID8/IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttYXhdPVwicHJvZHVjdC52YWx1ZS5wcm9wZXJ0aWVzPy53aWR0aCA/PyAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHVpTnVtYmVyRm9ybWF0XT1cInsgcHJlY2lzaW9uOiAwIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi0KjQuNGA0LjQvdCwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAocHJvZHVjdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlTbGlkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhbmdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3R1aS10ZXh0ZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAocHJvZHVjdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNsaWRlci10aWNrcy1sYWJlbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4gMCA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgcHJvZHVjdC52YWx1ZS5wcm9wZXJ0aWVzPy53aWR0aCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0dWktZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIndpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlcnJvcl09XCJbXSB8IHR1aUZpZWxkRXJyb3IgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCB0dWlMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg0JTQu9C40L3QsCwg0LzQvFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHVpLXRleHRmaWVsZD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1aUlucHV0U2xpZGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWluXT1cInNldHRpbmdzKCk/Lm1pbkxlbmd0aCA/PyAwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWF4XT1cInByb2R1Y3QudmFsdWUucHJvcGVydGllcz8ubGVuZ3RoID8/IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0dWlOdW1iZXJGb3JtYXRdPVwieyBwcmVjaXNpb246IDAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCLQlNC70LjQvdCwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAocHJvZHVjdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dWlTbGlkZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInJhbmdlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3R1aS10ZXh0ZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAocHJvZHVjdC52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNsaWRlci10aWNrcy1sYWJlbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4gMCA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgcHJvZHVjdC52YWx1ZS5wcm9wZXJ0aWVzPy5sZW5ndGggfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHVpLWVycm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJsZW5ndGhcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2Vycm9yXT1cIltdIHwgdHVpRmllbGRFcnJvciB8IGFzeW5jXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCB0dWlMYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ3aGl0ZXNwYWNlLW5vd3JhcFwiPtCa0L7Qu9C40YfQtdGB0YLQstC+LCDRiNGCPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHVpLXRleHRmaWVsZCBbdHVpVGV4dGZpZWxkQ2xlYW5lcl09XCJmYWxzZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVpSW5wdXROdW1iZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJjb3VudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCIxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHVpTnVtYmVyRm9ybWF0XT1cInsgcHJlY2lzaW9uOiAwIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi0JrQvtC70LjRh9C10YHRgtCy0L5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3R1aS10ZXh0ZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0dWktZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvdW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtlcnJvcl09XCJbXSB8IHR1aUZpZWxkRXJyb3IgfCBhc3luY1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1aUljb25CdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVtb3ZlSXRlbSgkaW5kZXgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXRlbXMubGVuZ3RoIDw9IDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJtXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY29uU3RhcnQ9XCJAdHVpLnRyYXNoLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibXQtNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmZsZXhdPVwiJzAgMCBhdXRvJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIHR1aUJ1dHRvblxuICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJzZWNvbmRhcnlcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpdGVtcy5pbnZhbGlkXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkSXRlbSgpXCJcbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInNlbGYtY2VudGVyXCJcbiAgICAgICAgICAgICAgICBpY29uU3RhcnQ9XCJAdHVpLnBsdXNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgINCU0L7QsdCw0LLQuNGC0Ywg0LjQt9C00LXQu9C40LVcbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICB9IEBlbHNlIGlmIChwcm9kdWN0LnZhbHVlKSB7XG4gICAgICAgICAgICA8dHVpLWVycm9yIGVycm9yPVwi0KDQsNGB0YfQtdGCINC/0L4g0L/RgNC+0LTRg9C60YLRgyDQvdC10LLQvtC30LzQvtC20LXQvS4g0J7QsdGA0LDRgtC40YLQtdGB0Ywg0Log0LzQtdC90LXQtNC20LXRgNGDXCIgLz5cbiAgICAgICAgfVxuXG4gICAgICAgIDxsYWJlbCB0dWlMYWJlbD5cbiAgICAgICAgICAgINCc0LDRgNC60LjRgNC+0LLQutCwINGA0LDRgdC/0LjQu9CwXG4gICAgICAgICAgICA8dHVpLXRleHRmaWVsZD5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgICAgdHVpVGV4dGZpZWxkXG4gICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cIm1hcmtlclwiXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwi0JzQsNGA0LrQuNGA0L7QstC60LAg0YDQsNGB0L/QuNC70LBcIlxuICAgICAgICAgICAgICAgICAgICBhdXRvY29tcGxldGU9XCJtYXJrZXJcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L3R1aS10ZXh0ZmllbGQ+XG5cbiAgICAgICAgICAgIDx0dWktZXJyb3JcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJtYXJrZXJcIlxuICAgICAgICAgICAgICAgIFtlcnJvcl09XCJbXSB8IHR1aUZpZWxkRXJyb3IgfCBhc3luY1wiXG4gICAgICAgICAgICAvPlxuICAgICAgICA8L2xhYmVsPlxuXG4gICAgICAgIEBpZiAocHJvZHVjdC52YWx1ZSkge1xuICAgICAgICAgICAgPHR1aS1sb2FkZXIgW3Nob3dMb2FkZXJdPVwiaXNDYWxjdWxhdGVMb2FkaW5nKClcIj5cbiAgICAgICAgICAgICAgICBAaWYgKGNhbGN1bGF0ZVJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMiBmbGV4IGZsZXgtd3JhcCBpdGVtcy1lbmQgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAg0JjRgtC+0LPQvjogPHNwYW4gY2xhc3M9XCJ3aGl0ZXNwYWNlLW5vd3JhcCB0ZXh0LXhsIGZvbnQtYm9sZFwiPnt7IGdldFRvdGFsQ29zdChjYWxjdWxhdGVSZXN1bHQpLnRvTG9jYWxlU3RyaW5nKCkgfX0ge3sgcHJvZHVjdC52YWx1ZS5jdXJyZW5jeS5zeW1ib2wgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZiAoY2FsY3VsYXRlUmVzdWx0Py5xdWFudGl0eSAmJiBwcm9kdWN0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwid2hpdGVzcGFjZS1ub3dyYXAgdGV4dC1sZyB0ZXh0LXNjLWRhcmstZ3JleVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9sZFwiPih7eyBjYWxjdWxhdGVSZXN1bHQucXVhbnRpdHkgfX0g0YjRgi48L3NwYW4+IHhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGRcIj57eyBwcm9kdWN0VmFsdWUuY29zdFJ1Yj8udG9Mb2NhbGVTdHJpbmcoKSB9fSB7eyBwcm9kdWN0VmFsdWUuY3VycmVuY3kuc3ltYm9sIH19L9GI0YIuKTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC90dWktbG9hZGVyPlxuICAgICAgICB9XG5cbiAgICAgICAgPHR1aS1lcnJvciBbZXJyb3JdPVwiW10gfCB0dWlGaWVsZEVycm9yIHwgYXN5bmNcIiAvPlxuXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJmb3JtLmludmFsaWQgfHwgIWNhbGN1bGF0ZVJlc3VsdCB8fCBpc0NhbGN1bGF0ZUxvYWRpbmcoKSB8fCBpc1N1Ym1pdExvYWRpbmcoKVwiXG4gICAgICAgICAgICBbbG9hZGluZ109XCJpc1N1Ym1pdExvYWRpbmcoKVwiXG4gICAgICAgICAgICB0dWlCdXR0b25cbiAgICAgICAgICAgIGNsYXNzPVwic2VsZi1jZW50ZXJcIlxuICAgICAgICAgICAgaWNvblN0YXJ0PVwiQHR1aS5jaGVja1wiXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7ICFvcmRlckl0ZW0oKSA/ICfQlNC+0LHQsNCy0LjRgtGMINCyINC60L7RgNC30LjQvdGDJyA6ICfQmNC30LzQtdC90LjRgtGMJyB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICA8L2Zvcm0+XG48L2Rpdj5cbiJdfQ==
|