techlify-inventory-common 18.30.0 → 18.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/inventory-common/location/location-selector/location-selector.component.mjs +3 -3
- package/esm2022/lib/inventory-common/product/product-basic-info/product-basic-info.component.mjs +15 -11
- package/esm2022/lib/inventory-common/product/product-form/product-form.component.mjs +187 -107
- package/esm2022/lib/inventory-common/product/product-form-button/product-form-button.component.mjs +10 -35
- package/esm2022/lib/inventory-common/product/product-list/product-list.component.mjs +1 -1
- package/esm2022/lib/inventory-common/product/product-routing.module.mjs +12 -1
- package/esm2022/lib/inventory-common/product/product-view-page/product-view-page.component.mjs +2 -2
- package/esm2022/lib/inventory-common/product/product.module.mjs +25 -5
- package/esm2022/lib/inventory-common/product/widgets/product-category-badges/product-category-badges.component.mjs +3 -3
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form-button/stock-issue-form-button.component.mjs +5 -4
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form.module.mjs +7 -4
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue-list/stock-issue-list.component.mjs +54 -91
- package/esm2022/lib/inventory-common/stock-issuances/stock-issue-list/stock-issue-list.module.mjs +8 -4
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipt-form/stock-receipt-form/stock-receipt-form.component.mjs +3 -3
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipts-list-page/stock-receipts-list-page.component.mjs +43 -32
- package/esm2022/lib/inventory-common/stock-receipts/stock-receipts.module.mjs +8 -4
- package/esm2022/lib/inventory-common/supplier/purchase-order/purchase-order-form/purchase-order-form.component.mjs +156 -0
- package/esm2022/lib/inventory-common/supplier/purchase-order/purchase-order-listing/purchase-order-listing.component.mjs +9 -5
- package/esm2022/lib/inventory-common/supplier/purchase-order/purchase-order-product-list/purchase-order-product-list.component.mjs +27 -0
- package/esm2022/lib/inventory-common/supplier/purchase-order/purchase-order-view/purchase-order-view.component.mjs +63 -0
- package/esm2022/lib/inventory-common/supplier/supplier-routing.module.mjs +14 -1
- package/fesm2022/{techlify-inventory-common-category.module--x7n_KLq.mjs → techlify-inventory-common-category.module-DrbwYhSL.mjs} +11 -11
- package/fesm2022/{techlify-inventory-common-category.module--x7n_KLq.mjs.map → techlify-inventory-common-category.module-DrbwYhSL.mjs.map} +1 -1
- package/fesm2022/{techlify-inventory-common-measure.module-D2jxHH_D.mjs → techlify-inventory-common-measure.module-Y1T3R-fR.mjs} +7 -7
- package/fesm2022/{techlify-inventory-common-measure.module-D2jxHH_D.mjs.map → techlify-inventory-common-measure.module-Y1T3R-fR.mjs.map} +1 -1
- package/fesm2022/techlify-inventory-common-purchase-order-view.component-A-iJ1Gxn.mjs +86 -0
- package/fesm2022/techlify-inventory-common-purchase-order-view.component-A-iJ1Gxn.mjs.map +1 -0
- package/fesm2022/{techlify-inventory-common-stock-issue-batch-form.component-DWWhMwul.mjs → techlify-inventory-common-stock-issue-batch-form.component-DdN2UuLR.mjs} +7 -7
- package/fesm2022/{techlify-inventory-common-stock-issue-batch-form.component-DWWhMwul.mjs.map → techlify-inventory-common-stock-issue-batch-form.component-DdN2UuLR.mjs.map} +1 -1
- package/fesm2022/{techlify-inventory-common-stock-issue-view.component-CVmdJazX.mjs → techlify-inventory-common-stock-issue-view.component-DQGWuLj-.mjs} +7 -7
- package/fesm2022/{techlify-inventory-common-stock-issue-view.component-CVmdJazX.mjs.map → techlify-inventory-common-stock-issue-view.component-DQGWuLj-.mjs.map} +1 -1
- package/fesm2022/{techlify-inventory-common-techlify-inventory-common-DZ-tDtUV.mjs → techlify-inventory-common-techlify-inventory-common-CJVKqbkG.mjs} +823 -603
- package/fesm2022/techlify-inventory-common-techlify-inventory-common-CJVKqbkG.mjs.map +1 -0
- package/fesm2022/techlify-inventory-common.mjs +1 -1
- package/lib/inventory-common/product/product-basic-info/product-basic-info.component.d.ts +3 -1
- package/lib/inventory-common/product/product-form/product-form.component.d.ts +29 -27
- package/lib/inventory-common/product/product-form-button/product-form-button.component.d.ts +3 -16
- package/lib/inventory-common/product/product.module.d.ts +3 -1
- package/lib/inventory-common/stock-issuances/stock-issue-form/stock-issue-form.module.d.ts +1 -1
- package/lib/inventory-common/stock-issuances/stock-issue-list/stock-issue-list.component.d.ts +4 -11
- package/lib/inventory-common/stock-issuances/stock-issue-list/stock-issue-list.module.d.ts +2 -1
- package/lib/inventory-common/stock-receipts/stock-receipts-list-page/stock-receipts-list-page.component.d.ts +2 -1
- package/lib/inventory-common/stock-receipts/stock-receipts.module.d.ts +2 -1
- package/lib/inventory-common/supplier/purchase-order/purchase-order-form/purchase-order-form.component.d.ts +30 -0
- package/lib/inventory-common/supplier/purchase-order/purchase-order-product-list/purchase-order-product-list.component.d.ts +7 -0
- package/lib/inventory-common/supplier/purchase-order/purchase-order-view/purchase-order-view.component.d.ts +19 -0
- package/package.json +1 -1
- package/fesm2022/techlify-inventory-common-techlify-inventory-common-DZ-tDtUV.mjs.map +0 -1
|
@@ -1,53 +1,35 @@
|
|
|
1
|
-
import { Component,
|
|
2
|
-
import { Validators } from '@angular/forms';
|
|
1
|
+
import { Component, Input, signal } from '@angular/core';
|
|
2
|
+
import { FormControl, Validators } from '@angular/forms';
|
|
3
3
|
import moment from 'moment';
|
|
4
|
+
import { TechlifyFormComponentInterface, FormConfigurationUtilityService } from 'ngx-techlify-core';
|
|
4
5
|
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "
|
|
6
|
+
import * as i1 from "ngx-techlify-core";
|
|
6
7
|
import * as i2 from "@angular/forms";
|
|
7
|
-
import * as i3 from "
|
|
8
|
-
import * as i4 from "@angular/
|
|
9
|
-
import * as i5 from "
|
|
8
|
+
import * as i3 from "../product.service";
|
|
9
|
+
import * as i4 from "@angular/router";
|
|
10
|
+
import * as i5 from "@angular/common";
|
|
10
11
|
import * as i6 from "@angular/material/button";
|
|
11
|
-
import * as i7 from "@angular/material/
|
|
12
|
-
import * as i8 from "@angular/material/
|
|
13
|
-
import * as i9 from "@angular/material/
|
|
14
|
-
import * as i10 from "@angular/
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
required: 'Please Enter Type',
|
|
20
|
-
},
|
|
21
|
-
name: {
|
|
22
|
-
required: 'Please Enter Name',
|
|
23
|
-
},
|
|
24
|
-
sale_price: {
|
|
25
|
-
required: 'Please Enter Sales Price',
|
|
26
|
-
},
|
|
27
|
-
minimum_price: {
|
|
28
|
-
required: 'Please Enter Minimum Price',
|
|
29
|
-
},
|
|
30
|
-
reorder_point: {
|
|
31
|
-
required: 'Please Enter Reorder Point',
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
export class ProductFormComponent {
|
|
35
|
-
productService;
|
|
12
|
+
import * as i7 from "@angular/material/checkbox";
|
|
13
|
+
import * as i8 from "@angular/material/form-field";
|
|
14
|
+
import * as i9 from "@angular/material/input";
|
|
15
|
+
import * as i10 from "@angular/material/progress-spinner";
|
|
16
|
+
import * as i11 from "@angular/material/card";
|
|
17
|
+
import * as i12 from "@angular/material/datepicker";
|
|
18
|
+
export class ProductFormComponent extends TechlifyFormComponentInterface {
|
|
19
|
+
fileService;
|
|
36
20
|
fb;
|
|
37
21
|
formValidatorService;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
saved = new EventEmitter();
|
|
45
|
-
cancelled = new EventEmitter();
|
|
46
|
-
product;
|
|
22
|
+
service;
|
|
23
|
+
activatedRoute;
|
|
24
|
+
errorHandler;
|
|
25
|
+
location;
|
|
26
|
+
router;
|
|
27
|
+
formConfigService;
|
|
47
28
|
displayedFormFields = [
|
|
48
29
|
'name',
|
|
49
30
|
'product type',
|
|
50
31
|
'sku',
|
|
32
|
+
'color',
|
|
51
33
|
'description',
|
|
52
34
|
'product measure',
|
|
53
35
|
'reorder point',
|
|
@@ -65,53 +47,139 @@ export class ProductFormComponent {
|
|
|
65
47
|
'sales information',
|
|
66
48
|
'accounts information',
|
|
67
49
|
];
|
|
68
|
-
|
|
69
|
-
|
|
50
|
+
product = signal(null);
|
|
51
|
+
isFormSetup = signal(false);
|
|
52
|
+
errorMessages = {
|
|
53
|
+
type_id: {
|
|
54
|
+
required: 'Please Enter Type',
|
|
55
|
+
},
|
|
56
|
+
name: {
|
|
57
|
+
required: 'Please Enter Name',
|
|
58
|
+
},
|
|
59
|
+
sale_price: {
|
|
60
|
+
required: 'Please Enter Sales Price',
|
|
61
|
+
},
|
|
62
|
+
minimum_price: {
|
|
63
|
+
required: 'Please Enter Minimum Price',
|
|
64
|
+
},
|
|
65
|
+
reorder_point: {
|
|
66
|
+
required: 'Please Enter Reorder Point',
|
|
67
|
+
},
|
|
68
|
+
color_id: {
|
|
69
|
+
required: 'Please Select Color',
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
isCreateAnother = new FormControl(false);
|
|
73
|
+
savedCount = 0;
|
|
74
|
+
formConfigurationUtilityService;
|
|
75
|
+
fileConfig;
|
|
76
|
+
viewerConfig;
|
|
77
|
+
fileList = [];
|
|
78
|
+
constructor(fileService, fb, formValidatorService, service, activatedRoute, errorHandler, location, router, formConfigService) {
|
|
79
|
+
super(formValidatorService);
|
|
80
|
+
this.fileService = fileService;
|
|
70
81
|
this.fb = fb;
|
|
71
82
|
this.formValidatorService = formValidatorService;
|
|
72
|
-
this.
|
|
73
|
-
this.
|
|
74
|
-
this.
|
|
75
|
-
this.
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
name: ['', Validators.compose([Validators.required])],
|
|
80
|
-
initial_quantity: [initial_quantity],
|
|
81
|
-
initial_quantity_date: [moment().format()],
|
|
82
|
-
reorder_point: [reorder_point, Validators.compose([Validators.required])],
|
|
83
|
-
description: [''],
|
|
84
|
-
sale_price: [0, Validators.compose([Validators.required])],
|
|
85
|
-
income_account_id: [''],
|
|
86
|
-
expense_account_id: [''],
|
|
87
|
-
measure_id: [1],
|
|
88
|
-
minimum_price: ['', Validators.compose([Validators.required])],
|
|
89
|
-
maximum_price: [''],
|
|
90
|
-
condition_type_id: [1],
|
|
91
|
-
current_quantity: [],
|
|
92
|
-
category_ids: [''],
|
|
93
|
-
});
|
|
83
|
+
this.service = service;
|
|
84
|
+
this.activatedRoute = activatedRoute;
|
|
85
|
+
this.errorHandler = errorHandler;
|
|
86
|
+
this.location = location;
|
|
87
|
+
this.router = router;
|
|
88
|
+
this.formConfigService = formConfigService;
|
|
89
|
+
this.formConfigurationUtilityService = new FormConfigurationUtilityService();
|
|
94
90
|
}
|
|
95
91
|
ngOnInit() {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
92
|
+
this.fileConfig = {
|
|
93
|
+
fileId: 'productImageFile',
|
|
94
|
+
containerId: 'productImageFileContainer',
|
|
95
|
+
styles: {
|
|
96
|
+
height: '200px'
|
|
97
|
+
},
|
|
98
|
+
multiple: false,
|
|
99
|
+
acceptFile: 'image/*',
|
|
100
|
+
maxSize: 10,
|
|
101
|
+
acceptFileText: 'PNG, JPEG, and JPG only'
|
|
102
|
+
};
|
|
103
|
+
this.viewerConfig = {
|
|
104
|
+
viewerStyle: {
|
|
105
|
+
height: '50px',
|
|
101
106
|
}
|
|
102
|
-
|
|
103
|
-
|
|
107
|
+
};
|
|
108
|
+
this.formConfigurationUtilityService
|
|
109
|
+
.initialize(this.formConfigService, 'product')
|
|
110
|
+
.subscribe({
|
|
111
|
+
next: (response) => {
|
|
112
|
+
this.form = this.fb.group({
|
|
113
|
+
id: [''],
|
|
114
|
+
type_id: [1, Validators.compose([Validators.required])],
|
|
115
|
+
color_id: ['', this.formConfigurationUtilityService.getFieldRequired('color_id') ? Validators.required : null],
|
|
116
|
+
sku: [''],
|
|
117
|
+
name: ['', Validators.compose([Validators.required])],
|
|
118
|
+
initial_quantity: [0],
|
|
119
|
+
initial_quantity_date: [moment().format()],
|
|
120
|
+
reorder_point: [10, Validators.compose([Validators.required])],
|
|
121
|
+
description: [''],
|
|
122
|
+
sale_price: [0, Validators.compose([Validators.required])],
|
|
123
|
+
income_account_id: [''],
|
|
124
|
+
expense_account_id: [''],
|
|
125
|
+
measure_id: [1],
|
|
126
|
+
minimum_price: ['', Validators.compose([Validators.required])],
|
|
127
|
+
maximum_price: [''],
|
|
128
|
+
condition_type_id: [1],
|
|
129
|
+
current_quantity: [],
|
|
130
|
+
category_ids: [''],
|
|
131
|
+
image_file: [null],
|
|
132
|
+
image_file_url: [null],
|
|
133
|
+
});
|
|
134
|
+
}, error: (error) => {
|
|
135
|
+
this.errorHandler.handleError(error);
|
|
136
|
+
}, complete: () => {
|
|
137
|
+
this.isFormSetup.set(true);
|
|
138
|
+
this.loadProduct();
|
|
104
139
|
}
|
|
105
|
-
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
loadProduct() {
|
|
143
|
+
let id = this.activatedRoute.snapshot.params['id'];
|
|
144
|
+
if (!id) {
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
this.isWorking = true;
|
|
148
|
+
this.service?.show(id, {
|
|
149
|
+
with: 'measure,categories',
|
|
150
|
+
}).subscribe({
|
|
151
|
+
next: (response) => {
|
|
152
|
+
this.product.set(response?.item);
|
|
153
|
+
this.isWorking = false;
|
|
154
|
+
},
|
|
155
|
+
error: (error) => {
|
|
156
|
+
this.isWorking = false;
|
|
157
|
+
this.errorHandler.handleError(error);
|
|
158
|
+
},
|
|
159
|
+
complete: () => {
|
|
160
|
+
this.patchProduct();
|
|
161
|
+
this.isWorking = false;
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
patchProduct() {
|
|
166
|
+
this.isUpdate = true;
|
|
167
|
+
let data = { ...this.product() };
|
|
168
|
+
if (this.product()?.categories?.length > 0) {
|
|
169
|
+
(data).category_ids = this.product().categories.map((category) => category?.id);
|
|
106
170
|
}
|
|
171
|
+
if (data?.initial_quantity_date) {
|
|
172
|
+
data.initial_quantity_date = moment(data.initial_quantity_date).toISOString();
|
|
173
|
+
}
|
|
174
|
+
this.form.patchValue(data);
|
|
107
175
|
}
|
|
108
176
|
async save() {
|
|
109
|
-
this.
|
|
110
|
-
if (this.
|
|
177
|
+
this.form.markAllAsTouched();
|
|
178
|
+
if (this.form.invalid) {
|
|
111
179
|
this.alertService.addAlert('Please Fill All Required Fields', 'warn');
|
|
112
180
|
return;
|
|
113
181
|
}
|
|
114
|
-
let product = this.
|
|
182
|
+
let product = this.form.value;
|
|
115
183
|
if (product.maximum_price <= 0 || !product.maximum_price) {
|
|
116
184
|
product.maximum_price = product.minimum_price;
|
|
117
185
|
}
|
|
@@ -119,33 +187,25 @@ export class ProductFormComponent {
|
|
|
119
187
|
product.initial_quantity_date = moment(product.initial_quantity_date).format('YYYY-MM-DD');
|
|
120
188
|
}
|
|
121
189
|
this.isWorking = true;
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
request.subscribe({
|
|
128
|
-
next: (response) => {
|
|
129
|
-
this.saved.emit(response?.item);
|
|
190
|
+
let promise = product.id
|
|
191
|
+
? this.service.update(product)
|
|
192
|
+
: this.service.store(product);
|
|
193
|
+
promise.subscribe({
|
|
194
|
+
next: () => {
|
|
130
195
|
this.isWorking = false;
|
|
131
|
-
this.productFormService.listUpdated(true);
|
|
132
196
|
this.alertService.addAlert('Product saved successfully!', 'success');
|
|
133
197
|
},
|
|
134
198
|
error: () => (this.isWorking = false),
|
|
199
|
+
complete: () => {
|
|
200
|
+
if (this.isCreateAnother.value && !this.isUpdate) {
|
|
201
|
+
this.savedCount++;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
this.router.navigate(['/inventory/products']);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
135
207
|
});
|
|
136
208
|
}
|
|
137
|
-
/**
|
|
138
|
-
* Method to evaluate form fields
|
|
139
|
-
*/
|
|
140
|
-
isFieldValid(field) {
|
|
141
|
-
return this.formValidatorService.isFieldValid(field, this.productForm);
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Method to find error in form fields
|
|
145
|
-
*/
|
|
146
|
-
getErrorMessage(field) {
|
|
147
|
-
return this.formValidatorService.getErrorMessage(field, this.productForm, errorMessages);
|
|
148
|
-
}
|
|
149
209
|
/**
|
|
150
210
|
* Checks displayed Form Fields array for form field and returns boolean result
|
|
151
211
|
*/
|
|
@@ -158,21 +218,41 @@ export class ProductFormComponent {
|
|
|
158
218
|
isFormSectionShown(sectionName) {
|
|
159
219
|
return this.displayedFormSections.length > 0 && this.displayedFormSections.includes(sectionName);
|
|
160
220
|
}
|
|
161
|
-
|
|
162
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ProductFormComponent, selector: "app-product-form", inputs: { product: "product", displayedFormFields: "displayedFormFields", displayedFormSections: "displayedFormSections" }, outputs: { saved: "saved", cancelled: "cancelled" }, ngImport: i0, template: "<form [formGroup]=\"productForm\" (submit)=\"save()\">\n <h3 class=\"text-center\">{{ product?.id ? 'Update' : 'Create' }} Product</h3>\n <div fxLayout=\"column\">\n <div fxLayout=\"column\" *ngIf=\"isFormSectionShown('basic information')\">\n <h3><strong>Basic Information</strong></h3>\n <div fxLayout fxLayoutGap=\"0.5rem\">\n\n <mat-form-field fxFlex=\"50%\" *ngIf=\"isFormFieldShown('name')\">\n <mat-label>Name</mat-label>\n <input matInput placeholder=\"Name\" formControlName=\"name\" required />\n <mat-error *ngIf=\"isFieldValid('name')\">{{ getErrorMessage('name') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field fxFlex=\"50%\" *ngIf=\"isFormFieldShown('product type')\">\n <mat-label>Product Type</mat-label>\n <app-searchable-selector apiUrl=\"api/product-types\" formControlName=\"type_id\"> </app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('type_id')\">{{ getErrorMessage('type_id') }} </mat-error>\n </mat-form-field>\n </div>\n\n <div fxLayout fxLayoutGap=\"0.5rem\">\n <mat-form-field fxFlex=\"50%\" *ngIf=\"isFormFieldShown('sku')\">\n <mat-label>SKU</mat-label>\n <input matInput placeholder=\"SKU\" formControlName=\"sku\" />\n <mat-error *ngIf=\"isFieldValid('sku')\">{{ getErrorMessage('sku') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field fxFlex=\"50%\">\n <mat-label>Category</mat-label>\n <app-searchable-selector apiUrl=\"api/product-categories\" formControlName=\"category_ids\" [multiple]=\"true\">\n </app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('category_ids')\">\n {{ getErrorMessage('category_ids') }}\n </mat-error>\n </mat-form-field>\n </div>\n\n <div fxLayout fxLayoutGap=\"0.5rem\">\n <mat-form-field fxFlex=\"100%\" *ngIf=\"isFormFieldShown('description')\">\n <mat-label>Description</mat-label>\n <textarea matInput placeholder=\"Description\" formControlName=\"description\"></textarea>\n </mat-form-field>\n </div>\n </div>\n\n <div fxLayout=\"column\" *ngIf=\"isFormSectionShown('inventory information')\">\n <h3><strong>Inventory Information</strong></h3>\n <div fxLayout fxLayoutGap=\"0.5rem\">\n\n <mat-form-field fxFlex=\"50%\" *ngIf=\"isFormFieldShown('product measure')\">\n <mat-label>Measure</mat-label>\n <app-searchable-selector apiUrl=\"api/product-measures\" formControlName=\"measure_id\">\n </app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('measure_id')\">{{ getErrorMessage('measure_id') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field fxFlex=\"50%\" *ngIf=\"isFormFieldShown('reorder point')\">\n <mat-label>Reorder Point</mat-label>\n <input matInput placeholder=\"Reorder Point\" formControlName=\"reorder_point\" type=\"number\" />\n <mat-error *ngIf=\"isFieldValid('reorder_point')\">{{ getErrorMessage('reorder_point') }} </mat-error>\n </mat-form-field>\n </div>\n <div fxLayout fxLayoutGap=\"0.5rem\">\n <mat-form-field fxFlex=\"50%\" *ngIf=\"isFormFieldShown('initial quantity')\">\n <mat-label>Initial Quantity</mat-label>\n <input matInput placeholder=\"Initial Quantity\" formControlName=\"initial_quantity\" />\n <mat-error *ngIf=\"isFieldValid('initial_quantity')\">{{ getErrorMessage('initial_quantity') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field fxFlex=\"50%\" *ngIf=\"isFormFieldShown('initial quantity date')\">\n <mat-label>Initial Quantity Date</mat-label>\n <input matInput [matDatepicker]=\"pickerInitialQuantityDate\" placeholder=\"Initial Quantity Date\"\n formControlName=\"initial_quantity_date\" />\n <mat-datepicker-toggle matSuffix [for]=\"pickerInitialQuantityDate\"></mat-datepicker-toggle>\n <mat-datepicker #pickerInitialQuantityDate></mat-datepicker>\n <mat-error *ngIf=\"isFieldValid('initial_quantity_date')\">{{ getErrorMessage('initial_quantity_date') }}\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n <div fxLayout=\"column\" *ngIf=\"isFormSectionShown('sales information')\">\n <h3><strong>Sale Information</strong></h3>\n <div fxLayout fxLayoutGap=\"0.5rem\">\n <mat-form-field fxFlex=\"50%\" *ngIf=\"isFormFieldShown('sales price')\">\n <mat-label>Selling Price</mat-label>\n <input matInput placeholder=\"Selling Price\" formControlName=\"sale_price\" required type=\"number\" step=\"any\" />\n <mat-error *ngIf=\"isFieldValid('sale_price')\">{{ getErrorMessage('sale_price') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field fxFlex=\"50%\" *ngIf=\"isFormFieldShown('condition types')\">\n <mat-label>Condition</mat-label>\n <app-searchable-selector apiUrl=\"api/condition-types\"\n formControlName=\"condition_type_id\"></app-searchable-selector>\n </mat-form-field>\n </div>\n <div fxLayout fxLayoutGap=\"0.5rem\">\n <mat-form-field fxFlex=\"50%\" *ngIf=\"isFormFieldShown('minimum price')\">\n <mat-label>Minimum Price</mat-label>\n <input matInput placeholder=\"Minimum Price\" formControlName=\"minimum_price\" required type=\"number\"\n step=\"any\" />\n <mat-error *ngIf=\"isFieldValid('minimum_price')\">{{ getErrorMessage('minimum_price') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field fxFlex=\"50%\" *ngIf=\"isFormFieldShown('maximum price')\">\n <mat-label>Maximum Price</mat-label>\n <input matInput placeholder=\"Maximum Price\" formControlName=\"maximum_price\" type=\"number\" step=\"any\" />\n </mat-form-field>\n </div>\n </div>\n\n <div fxFlex=\"100%\" fxLayout fxLayoutAlign=\"end\" fxLayoutGap=\"1rem\">\n <button [disabled]=\"isWorking\" mat-button class=\"mt-2\" type=\"button\" (click)=\"cancelled.emit(true)\">\n Cancel\n </button>\n <button [disabled]=\"isWorking\" mat-raised-button color=\"primary\" class=\"mt-2\" type=\"submit\">Save</button>\n </div>\n </div>\n</form>", dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.SearchableSelectorComponent, selector: "app-searchable-selector", inputs: ["valueField", "titleField", "subtitleField", "apiUrl", "multiple", "selectedValue", "enableSearch", "add", "addConfig", "edit", "editConfig", "sort", "sortBy", "searchField", "itemComponent", "items", "apiDataProperty", "cache", "perPage", "inDataSearch", "panelWidth", "focusSearchOnOpen", "required", "disabled", "value"], outputs: ["selectedValueChange", "selectionChange", "itemsChange"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i7.MatLabel, selector: "mat-label" }, { kind: "directive", type: i7.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i7.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i8.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i9.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i9.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i9.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: i10.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { kind: "directive", type: i10.DefaultLayoutGapDirective, selector: " [fxLayoutGap], [fxLayoutGap.xs], [fxLayoutGap.sm], [fxLayoutGap.md], [fxLayoutGap.lg], [fxLayoutGap.xl], [fxLayoutGap.lt-sm], [fxLayoutGap.lt-md], [fxLayoutGap.lt-lg], [fxLayoutGap.lt-xl], [fxLayoutGap.gt-xs], [fxLayoutGap.gt-sm], [fxLayoutGap.gt-md], [fxLayoutGap.gt-lg]", inputs: ["fxLayoutGap", "fxLayoutGap.xs", "fxLayoutGap.sm", "fxLayoutGap.md", "fxLayoutGap.lg", "fxLayoutGap.xl", "fxLayoutGap.lt-sm", "fxLayoutGap.lt-md", "fxLayoutGap.lt-lg", "fxLayoutGap.lt-xl", "fxLayoutGap.gt-xs", "fxLayoutGap.gt-sm", "fxLayoutGap.gt-md", "fxLayoutGap.gt-lg"] }, { kind: "directive", type: i10.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { kind: "directive", type: i10.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.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: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }], preserveWhitespaces: true });
|
|
221
|
+
async fileChanged(event) {
|
|
222
|
+
this.fileList = event;
|
|
223
|
+
if (this.fileList.length > 0) {
|
|
224
|
+
const result = await this.fileService.uploadEntityFile(this.fileList[0], {
|
|
225
|
+
entity_id: this.product()?.id,
|
|
226
|
+
entity_type: 'product',
|
|
227
|
+
sub_path: `${this.product()?.id}`
|
|
228
|
+
});
|
|
229
|
+
this.form.get('image_file')?.setValue(result.item.file);
|
|
230
|
+
this.form.get('image_file_url')?.setValue(result.item.url);
|
|
231
|
+
this.fileList = [];
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
async removeFile() {
|
|
235
|
+
if (this.form.value.image_file) {
|
|
236
|
+
try {
|
|
237
|
+
this.form.patchValue({
|
|
238
|
+
image_file: '',
|
|
239
|
+
image_file_url: ''
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
this.alertService.addAlert('Unable to remove file, try later', 'warn');
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProductFormComponent, deps: [{ token: i1.EntityFileService }, { token: i2.FormBuilder }, { token: i1.FormValidatorService }, { token: i3.ProductService }, { token: i4.ActivatedRoute }, { token: i1.ErrorHandlerService }, { token: i5.Location }, { token: i4.Router }, { token: i1.FormConfigurationFormService }], target: i0.ɵɵFactoryTarget.Component });
|
|
248
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ProductFormComponent, selector: "app-product-form", inputs: { displayedFormFields: "displayedFormFields", displayedFormSections: "displayedFormSections" }, usesInheritance: true, ngImport: i0, template: "@if (isFormSetup()) {\n<div class=\"d-flex flex-column gap-2\">\n <mat-card class='container'>\n <mat-card-content>\n <div class=\"d-flex justify-content-between align-items-center\">\n <span></span>\n <h3 class=\"text-center m-0\">Product Form</h3>\n <app-form-configuration-for-form formCode='product'></app-form-configuration-for-form>\n </div>\n </mat-card-content>\n </mat-card>\n <mat-card class='container'>\n <mat-card-content>\n <form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"d-flex flex-column\">\n\n <div class=\"d-flex flex-column justify-content-center align-items-center\">\n <ng-template #fileUpload>\n <div class=\"w-100\">\n <app-file-dropper (fileChanged)=\"fileChanged($event)\" [config]=\"fileConfig\" [fileArray]=\"fileList\">\n </app-file-dropper>\n </div>\n </ng-template>\n <div *ngIf=\"form.get('image_file')?.value; else fileUpload;\" style='width: 200px;'\n class='justify-content-center align-items-center'>\n <app-document-viewer (remove)=\"removeFile()\" [config]=\"viewerConfig\"\n [fileUrl]=\"form.get('image_file_url')?.value\" [file]=\"form.get('image_file')?.value\">\n </app-document-viewer>\n </div>\n </div>\n\n <div class=\"d-flex flex-column mt-2\" *ngIf=\"isFormSectionShown('basic information')\">\n <h6>Basic Information</h6>\n <div class=\"d-flex gap-2\">\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('name')\">\n <mat-label>Name</mat-label>\n <input matInput placeholder=\"Name\" formControlName=\"name\" required />\n <mat-error *ngIf=\"isFieldValid('name')\">{{ getErrorMessage('name') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('product type')\">\n <mat-label>Product Type</mat-label>\n <app-searchable-selector apiUrl=\"api/product-types\" formControlName=\"type_id\">\n </app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('type_id')\">{{ getErrorMessage('type_id') }} </mat-error>\n </mat-form-field>\n </div>\n\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('sku')\">\n <mat-label>SKU</mat-label>\n <input matInput placeholder=\"SKU\" formControlName=\"sku\" />\n <mat-error *ngIf=\"isFieldValid('sku')\">{{ getErrorMessage('sku') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\">\n <mat-label>Category</mat-label>\n <app-searchable-selector apiUrl=\"api/product-categories\" formControlName=\"category_ids\"\n [multiple]=\"true\">\n </app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('category_ids')\">\n {{ getErrorMessage('category_ids') }}\n </mat-error>\n </mat-form-field>\n </div>\n\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50 align-self-start\"\n *ngIf=\"isFormFieldShown('color') && formConfigurationUtilityService.getFieldEnabled('color_id')\">\n <mat-label>\n Color <sup *ngIf=\"formConfigurationUtilityService.getFieldRequired('color_id')\">*</sup>\n </mat-label>\n <app-searchable-selector apiUrl=\"api/attributes?type_code=color\"\n formControlName=\"color_id\"></app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('color_id')\">{{getErrorMessage('color_id')}}</mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('description')\">\n <mat-label>Description</mat-label>\n <textarea matInput placeholder=\"Description\" formControlName=\"description\"></textarea>\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"d-flex flex-column\" *ngIf=\"isFormSectionShown('inventory information')\">\n <h6>Inventory Information</h6>\n <div class=\"d-flex gap-2\">\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('product measure')\">\n <mat-label>Measure</mat-label>\n <app-searchable-selector apiUrl=\"api/product-measures\" formControlName=\"measure_id\">\n </app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('measure_id')\">{{ getErrorMessage('measure_id') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('reorder point')\">\n <mat-label>Reorder Point</mat-label>\n <input matInput placeholder=\"Reorder Point\" formControlName=\"reorder_point\" type=\"number\" />\n <mat-error *ngIf=\"isFieldValid('reorder_point')\">{{ getErrorMessage('reorder_point') }} </mat-error>\n </mat-form-field>\n </div>\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('initial quantity')\">\n <mat-label>Initial Quantity</mat-label>\n <input matInput placeholder=\"Initial Quantity\" formControlName=\"initial_quantity\" />\n <mat-error *ngIf=\"isFieldValid('initial_quantity')\">{{ getErrorMessage('initial_quantity') }}\n </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('initial quantity date')\">\n <mat-label>Initial Quantity Date</mat-label>\n <input matInput [matDatepicker]=\"pickerInitialQuantityDate\" placeholder=\"Initial Quantity Date\"\n formControlName=\"initial_quantity_date\" />\n <mat-datepicker-toggle matSuffix [for]=\"pickerInitialQuantityDate\"></mat-datepicker-toggle>\n <mat-datepicker #pickerInitialQuantityDate></mat-datepicker>\n <mat-error *ngIf=\"isFieldValid('initial_quantity_date')\">{{ getErrorMessage('initial_quantity_date') }}\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n <div class=\"d-flex flex-column\" *ngIf=\"isFormSectionShown('sales information')\">\n <h6>Sale Information</h6>\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('sales price')\">\n <mat-label>Selling Price</mat-label>\n <input matInput placeholder=\"Selling Price\" formControlName=\"sale_price\" required type=\"number\"\n step=\"any\" />\n <mat-error *ngIf=\"isFieldValid('sale_price')\">{{ getErrorMessage('sale_price') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('condition types')\">\n <mat-label>Condition</mat-label>\n <app-searchable-selector apiUrl=\"api/condition-types\"\n formControlName=\"condition_type_id\"></app-searchable-selector>\n </mat-form-field>\n </div>\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('minimum price')\">\n <mat-label>Minimum Price</mat-label>\n <input matInput placeholder=\"Minimum Price\" formControlName=\"minimum_price\" required type=\"number\"\n step=\"any\" />\n <mat-error *ngIf=\"isFieldValid('minimum_price')\">{{ getErrorMessage('minimum_price') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('maximum price')\">\n <mat-label>Maximum Price</mat-label>\n <input matInput placeholder=\"Maximum Price\" formControlName=\"maximum_price\" type=\"number\" step=\"any\" />\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"w-100 d-flex justify-content-between\">\n @if (!isUpdate) {\n <mat-checkbox [formControl]=\"isCreateAnother\">Create Another\n <span *ngIf=\"savedCount > 0\">({{ savedCount }} items saved)</span>\n </mat-checkbox>\n } @else {\n <span class='d-flex flex-grow'></span>\n }\n\n <div class=\"d-flex flex-row gap-3 align-items-center justify-content-end\">\n <button [disabled]=\"isWorking\" mat-button class=\"mt-2\" type=\"button\" (click)=\"location.back()\">\n Cancel\n </button>\n <button [disabled]=\"isWorking\" mat-raised-button color=\"primary\" class=\"mt-2\" type=\"submit\">Save</button>\n </div>\n </div>\n </div>\n </form>\n </mat-card-content>\n </mat-card>\n</div>\n} @else {\n<mat-card-content class=\"d-flex vh-100 justify-content-center align-items-center\">\n <mat-spinner></mat-spinner>\n</mat-card-content>\n}", dependencies: [{ kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i1.SearchableSelectorComponent, selector: "app-searchable-selector", inputs: ["valueField", "titleField", "subtitleField", "apiUrl", "multiple", "selectedValue", "enableSearch", "add", "addConfig", "edit", "editConfig", "sort", "sortBy", "searchField", "itemComponent", "items", "apiDataProperty", "cache", "perPage", "inDataSearch", "panelWidth", "focusSearchOnOpen", "required", "disabled", "value"], outputs: ["selectedValueChange", "selectionChange", "itemsChange"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i8.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i9.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i10.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i11.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i11.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i12.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i12.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i12.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: i2.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i2.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: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i2.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: i1.FormConfigurationForFormComponent, selector: "app-form-configuration-for-form", inputs: ["formCode"] }, { kind: "component", type: i1.FileDropperComponent, selector: "app-file-dropper", inputs: ["fileArray", "config", "styles"], outputs: ["fileChanged"] }, { kind: "component", type: i1.DocumentViewerComponent, selector: "app-document-viewer", inputs: ["config", "file", "fileUrl", "disableEdit"], outputs: ["remove"] }], preserveWhitespaces: true });
|
|
163
249
|
}
|
|
164
250
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ProductFormComponent, decorators: [{
|
|
165
251
|
type: Component,
|
|
166
|
-
args: [{ selector: 'app-product-form', template: "<form [formGroup]=\"
|
|
167
|
-
}], ctorParameters: () => [{ type: i1.
|
|
168
|
-
type: Output
|
|
169
|
-
}], cancelled: [{
|
|
170
|
-
type: Output
|
|
171
|
-
}], product: [{
|
|
172
|
-
type: Input
|
|
173
|
-
}], displayedFormFields: [{
|
|
252
|
+
args: [{ selector: 'app-product-form', template: "@if (isFormSetup()) {\n<div class=\"d-flex flex-column gap-2\">\n <mat-card class='container'>\n <mat-card-content>\n <div class=\"d-flex justify-content-between align-items-center\">\n <span></span>\n <h3 class=\"text-center m-0\">Product Form</h3>\n <app-form-configuration-for-form formCode='product'></app-form-configuration-for-form>\n </div>\n </mat-card-content>\n </mat-card>\n <mat-card class='container'>\n <mat-card-content>\n <form [formGroup]=\"form\" (submit)=\"save()\">\n <div class=\"d-flex flex-column\">\n\n <div class=\"d-flex flex-column justify-content-center align-items-center\">\n <ng-template #fileUpload>\n <div class=\"w-100\">\n <app-file-dropper (fileChanged)=\"fileChanged($event)\" [config]=\"fileConfig\" [fileArray]=\"fileList\">\n </app-file-dropper>\n </div>\n </ng-template>\n <div *ngIf=\"form.get('image_file')?.value; else fileUpload;\" style='width: 200px;'\n class='justify-content-center align-items-center'>\n <app-document-viewer (remove)=\"removeFile()\" [config]=\"viewerConfig\"\n [fileUrl]=\"form.get('image_file_url')?.value\" [file]=\"form.get('image_file')?.value\">\n </app-document-viewer>\n </div>\n </div>\n\n <div class=\"d-flex flex-column mt-2\" *ngIf=\"isFormSectionShown('basic information')\">\n <h6>Basic Information</h6>\n <div class=\"d-flex gap-2\">\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('name')\">\n <mat-label>Name</mat-label>\n <input matInput placeholder=\"Name\" formControlName=\"name\" required />\n <mat-error *ngIf=\"isFieldValid('name')\">{{ getErrorMessage('name') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('product type')\">\n <mat-label>Product Type</mat-label>\n <app-searchable-selector apiUrl=\"api/product-types\" formControlName=\"type_id\">\n </app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('type_id')\">{{ getErrorMessage('type_id') }} </mat-error>\n </mat-form-field>\n </div>\n\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('sku')\">\n <mat-label>SKU</mat-label>\n <input matInput placeholder=\"SKU\" formControlName=\"sku\" />\n <mat-error *ngIf=\"isFieldValid('sku')\">{{ getErrorMessage('sku') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\">\n <mat-label>Category</mat-label>\n <app-searchable-selector apiUrl=\"api/product-categories\" formControlName=\"category_ids\"\n [multiple]=\"true\">\n </app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('category_ids')\">\n {{ getErrorMessage('category_ids') }}\n </mat-error>\n </mat-form-field>\n </div>\n\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50 align-self-start\"\n *ngIf=\"isFormFieldShown('color') && formConfigurationUtilityService.getFieldEnabled('color_id')\">\n <mat-label>\n Color <sup *ngIf=\"formConfigurationUtilityService.getFieldRequired('color_id')\">*</sup>\n </mat-label>\n <app-searchable-selector apiUrl=\"api/attributes?type_code=color\"\n formControlName=\"color_id\"></app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('color_id')\">{{getErrorMessage('color_id')}}</mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('description')\">\n <mat-label>Description</mat-label>\n <textarea matInput placeholder=\"Description\" formControlName=\"description\"></textarea>\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"d-flex flex-column\" *ngIf=\"isFormSectionShown('inventory information')\">\n <h6>Inventory Information</h6>\n <div class=\"d-flex gap-2\">\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('product measure')\">\n <mat-label>Measure</mat-label>\n <app-searchable-selector apiUrl=\"api/product-measures\" formControlName=\"measure_id\">\n </app-searchable-selector>\n <mat-error *ngIf=\"isFieldValid('measure_id')\">{{ getErrorMessage('measure_id') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('reorder point')\">\n <mat-label>Reorder Point</mat-label>\n <input matInput placeholder=\"Reorder Point\" formControlName=\"reorder_point\" type=\"number\" />\n <mat-error *ngIf=\"isFieldValid('reorder_point')\">{{ getErrorMessage('reorder_point') }} </mat-error>\n </mat-form-field>\n </div>\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('initial quantity')\">\n <mat-label>Initial Quantity</mat-label>\n <input matInput placeholder=\"Initial Quantity\" formControlName=\"initial_quantity\" />\n <mat-error *ngIf=\"isFieldValid('initial_quantity')\">{{ getErrorMessage('initial_quantity') }}\n </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('initial quantity date')\">\n <mat-label>Initial Quantity Date</mat-label>\n <input matInput [matDatepicker]=\"pickerInitialQuantityDate\" placeholder=\"Initial Quantity Date\"\n formControlName=\"initial_quantity_date\" />\n <mat-datepicker-toggle matSuffix [for]=\"pickerInitialQuantityDate\"></mat-datepicker-toggle>\n <mat-datepicker #pickerInitialQuantityDate></mat-datepicker>\n <mat-error *ngIf=\"isFieldValid('initial_quantity_date')\">{{ getErrorMessage('initial_quantity_date') }}\n </mat-error>\n </mat-form-field>\n </div>\n </div>\n <div class=\"d-flex flex-column\" *ngIf=\"isFormSectionShown('sales information')\">\n <h6>Sale Information</h6>\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('sales price')\">\n <mat-label>Selling Price</mat-label>\n <input matInput placeholder=\"Selling Price\" formControlName=\"sale_price\" required type=\"number\"\n step=\"any\" />\n <mat-error *ngIf=\"isFieldValid('sale_price')\">{{ getErrorMessage('sale_price') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('condition types')\">\n <mat-label>Condition</mat-label>\n <app-searchable-selector apiUrl=\"api/condition-types\"\n formControlName=\"condition_type_id\"></app-searchable-selector>\n </mat-form-field>\n </div>\n <div class=\"d-flex gap-2\">\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('minimum price')\">\n <mat-label>Minimum Price</mat-label>\n <input matInput placeholder=\"Minimum Price\" formControlName=\"minimum_price\" required type=\"number\"\n step=\"any\" />\n <mat-error *ngIf=\"isFieldValid('minimum_price')\">{{ getErrorMessage('minimum_price') }} </mat-error>\n </mat-form-field>\n\n <mat-form-field class=\"w-50\" *ngIf=\"isFormFieldShown('maximum price')\">\n <mat-label>Maximum Price</mat-label>\n <input matInput placeholder=\"Maximum Price\" formControlName=\"maximum_price\" type=\"number\" step=\"any\" />\n </mat-form-field>\n </div>\n </div>\n\n <div class=\"w-100 d-flex justify-content-between\">\n @if (!isUpdate) {\n <mat-checkbox [formControl]=\"isCreateAnother\">Create Another\n <span *ngIf=\"savedCount > 0\">({{ savedCount }} items saved)</span>\n </mat-checkbox>\n } @else {\n <span class='d-flex flex-grow'></span>\n }\n\n <div class=\"d-flex flex-row gap-3 align-items-center justify-content-end\">\n <button [disabled]=\"isWorking\" mat-button class=\"mt-2\" type=\"button\" (click)=\"location.back()\">\n Cancel\n </button>\n <button [disabled]=\"isWorking\" mat-raised-button color=\"primary\" class=\"mt-2\" type=\"submit\">Save</button>\n </div>\n </div>\n </div>\n </form>\n </mat-card-content>\n </mat-card>\n</div>\n} @else {\n<mat-card-content class=\"d-flex vh-100 justify-content-center align-items-center\">\n <mat-spinner></mat-spinner>\n</mat-card-content>\n}" }]
|
|
253
|
+
}], ctorParameters: () => [{ type: i1.EntityFileService }, { type: i2.FormBuilder }, { type: i1.FormValidatorService }, { type: i3.ProductService }, { type: i4.ActivatedRoute }, { type: i1.ErrorHandlerService }, { type: i5.Location }, { type: i4.Router }, { type: i1.FormConfigurationFormService }], propDecorators: { displayedFormFields: [{
|
|
174
254
|
type: Input
|
|
175
255
|
}], displayedFormSections: [{
|
|
176
256
|
type: Input
|
|
177
257
|
}] } });
|
|
178
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludmVudG9yeS1jb21tb24vc3JjL2xpYi9pbnZlbnRvcnktY29tbW9uL3Byb2R1Y3QvcHJvZHVjdC1mb3JtL3Byb2R1Y3QtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9wcm9kdWN0L3Byb2R1Y3QtZm9ybS9wcm9kdWN0LWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQTBCLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQzs7Ozs7Ozs7Ozs7O0FBTzVCLE1BQU0sZ0JBQWdCLEdBQVcsQ0FBQyxDQUFDO0FBQ25DLE1BQU0sYUFBYSxHQUFXLEVBQUUsQ0FBQztBQUVqQyxNQUFNLGFBQWEsR0FBUTtJQUN6QixPQUFPLEVBQUU7UUFDUCxRQUFRLEVBQUUsbUJBQW1CO0tBQzlCO0lBQ0QsSUFBSSxFQUFFO1FBQ0osUUFBUSxFQUFFLG1CQUFtQjtLQUM5QjtJQUNELFVBQVUsRUFBRTtRQUNWLFFBQVEsRUFBRSwwQkFBMEI7S0FDckM7SUFDRCxhQUFhLEVBQUU7UUFDYixRQUFRLEVBQUUsNEJBQTRCO0tBQ3ZDO0lBQ0QsYUFBYSxFQUFFO1FBQ2IsUUFBUSxFQUFFLDRCQUE0QjtLQUN2QztDQUNGLENBQUM7QUFNRixNQUFNLE9BQU8sb0JBQW9CO0lBK0JyQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFuQ0gsV0FBVyxDQUFZO0lBQ3ZCLFNBQVMsR0FBWSxLQUFL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QUVEOztPQUVHO0lBQ0gsa0JBQWtCLENBQUMsV0FBbUI7UUFDcEMsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQ25HLENBQUM7d0dBbElVLG9CQUFvQjs0RkFBcEIsb0JBQW9CLHlPQ2xDakMsbXNNQXFITzs7NEZEbkZNLG9CQUFvQjtrQkFKaEMsU0FBUzsrQkFDRSxrQkFBa0I7bU9BT2xCLEtBQUs7c0JBQWQsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNFLE9BQU87c0JBQWYsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBZ0JHLHFCQUFxQjtzQkFBN0IsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBBbGVydFNlcnZpY2UsIEZvcm1WYWxpZGF0b3JTZXJ2aWNlIH0gZnJvbSAnbmd4LXRlY2hsaWZ5LWNvcmUnO1xuaW1wb3J0IHsgUHJvZHVjdFNlcnZpY2UgfSBmcm9tICcuLi9wcm9kdWN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgUHJvZHVjdEZvcm1TZXJ2aWNlIH0gZnJvbSAnLi4vcHJvZHVjdC1mb3JtLnNlcnZpY2UnO1xuXG5jb25zdCBpbml0aWFsX3F1YW50aXR5OiBudW1iZXIgPSAwO1xuY29uc3QgcmVvcmRlcl9wb2ludDogbnVtYmVyID0gMTA7XG5cbmNvbnN0IGVycm9yTWVzc2FnZXM6IGFueSA9IHtcbiAgdHlwZV9pZDoge1xuICAgIHJlcXVpcmVkOiAnUGxlYXNlIEVudGVyIFR5cGUnLFxuICB9LFxuICBuYW1lOiB7XG4gICAgcmVxdWlyZWQ6ICdQbGVhc2UgRW50ZXIgTmFtZScsXG4gIH0sXG4gIHNhbGVfcHJpY2U6IHtcbiAgICByZXF1aXJlZDogJ1BsZWFzZSBFbnRlciBTYWxlcyBQcmljZScsXG4gIH0sXG4gIG1pbmltdW1fcHJpY2U6IHtcbiAgICByZXF1aXJlZDogJ1BsZWFzZSBFbnRlciBNaW5pbXVtIFByaWNlJyxcbiAgfSxcbiAgcmVvcmRlcl9wb2ludDoge1xuICAgIHJlcXVpcmVkOiAnUGxlYXNlIEVudGVyIFJlb3JkZXIgUG9pbnQnLFxuICB9LFxufTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXBwLXByb2R1Y3QtZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi9wcm9kdWN0LWZvcm0uY29tcG9uZW50Lmh0bWwnLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9kdWN0Rm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIHB1YmxpYyBwcm9kdWN0Rm9ybTogRm9ybUdyb3VwO1xuICBwdWJsaWMgaXNXb3JraW5nOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyBpc1VwZGF0ZTogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgc2F2ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAT3V0cHV0KCkgY2FuY2VsbGVkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQElucHV0KCkgcHJvZHVjdDogYW55O1xuICBASW5wdXQoKSBkaXNwbGF5ZWRGb3JtRmllbGRzOiBhbnlbXSA9IFtcbiAgICAnbmFtZScsXG4gICAgJ3Byb2R1Y3QgdHlwZScsXG4gICAgJ3NrdScsXG4gICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAncHJvZHVjdCBtZWFzdXJlJyxcbiAgICAncmVvcmRlciBwb2ludCcsXG4gICAgJ2luaXRpYWwgcXVhbnRpdHknLFxuICAgICdpbml0aWFsIHF1YW50aXR5IGRhdGUnLFxuICAgICdzYWxlcyBwcmljZScsXG4gICAgJ21pbmltdW0gcHJpY2UnLFxuICAgICdtYXhpbXVtIHByaWNlJyxcbiAgICAnaW5jb21lIGFjY291bnQnLFxuICAgICdleHBlbnNlIGFjY291bnQnLFxuICBdO1xuXG4gIEBJbnB1dCgpIGRpc3BsYXllZEZvcm1TZWN0aW9uczogYW55W10gPSBbXG4gICAgJ2Jhc2ljIGluZm9ybWF0aW9uJyxcbiAgICAnaW52ZW50b3J5IGluZm9ybWF0aW9uJyxcbiAgICAnc2FsZXMgaW5mb3JtYXRpb24nLFxuICAgICdhY2NvdW50cyBpbmZvcm1hdGlvbicsXG4gIF07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwcm9kdWN0U2VydmljZTogUHJvZHVjdFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBmb3JtVmFsaWRhdG9yU2VydmljZTogRm9ybVZhbGlkYXRvclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIGRhdGVQaXBlOiBEYXRlUGlwZSxcbiAgICBwcml2YXRlIHByb2R1Y3RGb3JtU2VydmljZTogUHJvZHVjdEZvcm1TZXJ2aWNlXG4gICkge1xuICAgIHRoaXMucHJvZHVjdEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGlkOiBbJyddLFxuICAgICAgdHlwZV9pZDogWzEsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXSxcbiAgICAgIHNrdTogWycnXSxcbiAgICAgIG5hbWU6IFsnJywgVmFsaWRhdG9ycy5jb21wb3NlKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSldLFxuICAgICAgaW5pdGlhbF9xdWFudGl0eTogW2luaXRpYWxfcXVhbnRpdHldLFxuICAgICAgaW5pdGlhbF9xdWFudGl0eV9kYXRlOiBbbW9tZW50KCkuZm9ybWF0KCldLFxuICAgICAgcmVvcmRlcl9wb2ludDogW3Jlb3JkZXJfcG9pbnQsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXSxcbiAgICAgIGRlc2NyaXB0aW9uOiBbJyddLFxuICAgICAgc2FsZV9wcmljZTogWzAsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXSxcbiAgICAgIGluY29tZV9hY2NvdW50X2lkOiBbJyddLFxuICAgICAgZXhwZW5zZV9hY2NvdW50X2lkOiBbJyddLFxuICAgICAgbWVhc3VyZV9pZDogWzFdLFxuICAgICAgbWluaW11bV9wcmljZTogWycnLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKV0sXG4gICAgICBtYXhpbXVtX3ByaWNlOiBbJyddLFxuICAgICAgY29uZGl0aW9uX3R5cGVfaWQ6IFsxXSxcbiAgICAgIGN1cnJlbnRfcXVhbnRpdHk6IFtdLFxuICAgICAgY2F0ZWdvcnlfaWRzOiBbJyddLFxuICAgIH0pO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgaWYgKHRoaXMucHJvZHVjdD8uaWQpIHtcbiAgICAgIHRoaXMuaXNVcGRhdGUgPSB0cnVlO1xuICAgICAgbGV0IGRhdGEgPSB7IC4uLnRoaXMucHJvZHVjdCB9O1xuICAgICAgaWYgKHRoaXMucHJvZHVjdD8uY2F0ZWdvcmllcz8ubGVuZ3RoID4gMCkge1xuICAgICAgICBkYXRhLmNhdGVnb3J5X2lkcyA9ICh0aGlzLnByb2R1Y3QuY2F0ZWdvcmllcyBhcyBbXSkubWFwKChjYXRlZ29yeTogYW55KSA9PiBjYXRlZ29yeT8uaWQpO1xuICAgICAgfVxuICAgICAgaWYgKGRhdGE/LmluaXRpYWxfcXVhbnRpdHlfZGF0ZSkge1xuICAgICAgICBkYXRhLmluaXRpYWxfcXVhbnRpdHlfZGF0ZSA9IG1vbWVudChkYXRhLmluaXRpYWxfcXVhbnRpdHlfZGF0ZSkudG9JU09TdHJpbmcoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucHJvZHVjdEZvcm0ucGF0Y2hWYWx1ZShkYXRhKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzYXZlKCkge1xuICAgIHRoaXMucHJvZHVjdEZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgIGlmICh0aGlzLnByb2R1Y3RGb3JtLmludmFsaWQpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZEFsZXJ0KCdQbGVhc2UgRmlsbCBBbGwgUmVxdWlyZWQgRmllbGRzJywgJ3dhcm4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHByb2R1Y3QgPSB0aGlzLnByb2R1Y3RGb3JtLnZhbHVlO1xuICAgIGlmIChwcm9kdWN0Lm1heGltdW1fcHJpY2UgPD0gMCB8fCAhcHJvZHVjdC5tYXhpbXVtX3ByaWNlKSB7XG4gICAgICBwcm9kdWN0Lm1heGltdW1fcHJpY2UgPSBwcm9kdWN0Lm1pbmltdW1fcHJpY2U7XG4gICAgfVxuXG4gICAgaWYgKHByb2R1Y3Q/LmluaXRpYWxfcXVhbnRpdHlfZGF0ZSkge1xuICAgICAgcHJvZHVjdC5pbml0aWFsX3F1YW50aXR5X2RhdGUgPSBtb21lbnQocHJvZHVjdC5pbml0aWFsX3F1YW50aXR5X2RhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpO1xuICAgIH1cbiAgICB0aGlzLmlzV29ya2luZyA9IHRydWU7XG4gICAgcHJvZHVjdC53aXRoID0gJ3R5cGUsbWVhc3VyZSxpbmNvbWVBY2NvdW50LGV4cGVuc2VBY2NvdW50JztcblxuICAgIGxldCByZXF1ZXN0OiBPYnNlcnZhYmxlPGFueT4gPSB0aGlzLnByb2R1Y3RTZXJ2aWNlLnN0b3JlKHByb2R1Y3QpO1xuICAgIGlmICh0aGlzLmlzVXBkYXRlKSB7XG4gICAgICByZXF1ZXN0ID0gdGhpcy5wcm9kdWN0U2VydmljZS51cGRhdGUocHJvZHVjdCk7XG4gICAgfVxuICAgIHJlcXVlc3Quc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuc2F2ZWQuZW1pdChyZXNwb25zZT8uaXRlbSk7XG4gICAgICAgIHRoaXMuaXNXb3JraW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucHJvZHVjdEZvcm1TZXJ2aWNlLmxpc3RVcGRhdGVkKHRydWUpO1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRBbGVydCgnUHJvZHVjdCBzYXZlZCBzdWNjZXNzZnVsbHkhJywgJ3N1Y2Nlc3MnKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4gKHRoaXMuaXNXb3JraW5nID0gZmFsc2UpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBldmFsdWF0ZSBmb3JtIGZpZWxkc1xuICAgKi9cbiAgaXNGaWVsZFZhbGlkKGZpZWxkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtVmFsaWRhdG9yU2VydmljZS5pc0ZpZWxkVmFsaWQoZmllbGQsIHRoaXMucHJvZHVjdEZvcm0pO1xuICB9XG4gIC8qKlxuICAgKiBNZXRob2QgdG8gZmluZCBlcnJvciBpbiBmb3JtIGZpZWxkc1xuICAgKi9cbiAgZ2V0RXJyb3JNZXNzYWdlKGZpZWxkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtVmFsaWRhdG9yU2VydmljZS5nZXRFcnJvck1lc3NhZ2UoZmllbGQsIHRoaXMucHJvZHVjdEZvcm0sIGVycm9yTWVzc2FnZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBkaXNwbGF5ZWQgRm9ybSBGaWVsZHMgYXJyYXkgZm9yIGZvcm0gZmllbGQgYW5kIHJldHVybnMgYm9vbGVhbiByZXN1bHRcbiAgICovXG4gIGlzRm9ybUZpZWxkU2hvd24oZmllbGROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5ZWRGb3JtRmllbGRzLmxlbmd0aCA+IDAgJiYgdGhpcy5kaXNwbGF5ZWRGb3JtRmllbGRzLmluY2x1ZGVzKGZpZWxkTmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGRpc3BsYXllZCBGb3JtIFNlY3Rpb24gYXJyYXkgZm9yIGZvcm0gc2VjdGlvbiBhbmQgcmV0dXJucyBib29sZWFuIHJlc3VsdFxuICAgKi9cbiAgaXNGb3JtU2VjdGlvblNob3duKHNlY3Rpb25OYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kaXNwbGF5ZWRGb3JtU2VjdGlvbnMubGVuZ3RoID4gMCAmJiB0aGlzLmRpc3BsYXllZEZvcm1TZWN0aW9ucy5pbmNsdWRlcyhzZWN0aW9uTmFtZSk7XG4gIH1cbn1cbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwicHJvZHVjdEZvcm1cIiAoc3VibWl0KT1cInNhdmUoKVwiPlxuICA8aDMgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPnt7IHByb2R1Y3Q/LmlkID8gJ1VwZGF0ZScgOiAnQ3JlYXRlJyB9fSBQcm9kdWN0PC9oMz5cbiAgPGRpdiBmeExheW91dD1cImNvbHVtblwiPlxuICAgIDxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiAqbmdJZj1cImlzRm9ybVNlY3Rpb25TaG93bignYmFzaWMgaW5mb3JtYXRpb24nKVwiPlxuICAgICAgPGgzPjxzdHJvbmc+QmFzaWMgSW5mb3JtYXRpb248L3N0cm9uZz48L2gzPlxuICAgICAgPGRpdiBmeExheW91dCBmeExheW91dEdhcD1cIjAuNXJlbVwiPlxuXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBmeEZsZXg9XCI1MCVcIiAqbmdJZj1cImlzRm9ybUZpZWxkU2hvd24oJ25hbWUnKVwiPlxuICAgICAgICAgIDxtYXQtbGFiZWw+TmFtZTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIk5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgcmVxdWlyZWQgLz5cbiAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCduYW1lJylcIj57eyBnZXRFcnJvck1lc3NhZ2UoJ25hbWUnKSB9fSA8L21hdC1lcnJvcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgZnhGbGV4PVwiNTAlXCIgKm5nSWY9XCJpc0Zvcm1GaWVsZFNob3duKCdwcm9kdWN0IHR5cGUnKVwiPlxuICAgICAgICAgIDxtYXQtbGFiZWw+UHJvZHVjdCBUeXBlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yIGFwaVVybD1cImFwaS9wcm9kdWN0LXR5cGVzXCIgZm9ybUNvbnRyb2xOYW1lPVwidHlwZV9pZFwiPiA8L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJpc0ZpZWxkVmFsaWQoJ3R5cGVfaWQnKVwiPnt7IGdldEVycm9yTWVzc2FnZSgndHlwZV9pZCcpIH19IDwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgZnhMYXlvdXQgZnhMYXlvdXRHYXA9XCIwLjVyZW1cIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZ4RmxleD1cIjUwJVwiICpuZ0lmPVwiaXNGb3JtRmllbGRTaG93bignc2t1JylcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPlNLVTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIlNLVVwiIGZvcm1Db250cm9sTmFtZT1cInNrdVwiIC8+XG4gICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzRmllbGRWYWxpZCgnc2t1JylcIj57eyBnZXRFcnJvck1lc3NhZ2UoJ3NrdScpIH19IDwvbWF0LWVycm9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBmeEZsZXg9XCI1MCVcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPkNhdGVnb3J5PC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yIGFwaVVybD1cImFwaS9wcm9kdWN0LWNhdGVnb3JpZXNcIiBmb3JtQ29udHJvbE5hbWU9XCJjYXRlZ29yeV9pZHNcIiBbbXVsdGlwbGVdPVwidHJ1ZVwiPlxuICAgICAgICAgIDwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzRmllbGRWYWxpZCgnY2F0ZWdvcnlfaWRzJylcIj5cbiAgICAgICAgICAgIHt7IGdldEVycm9yTWVzc2FnZSgnY2F0ZWdvcnlfaWRzJykgfX1cbiAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGZ4TGF5b3V0IGZ4TGF5b3V0R2FwPVwiMC41cmVtXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBmeEZsZXg9XCIxMDAlXCIgKm5nSWY9XCJpc0Zvcm1GaWVsZFNob3duKCdkZXNjcmlwdGlvbicpXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbD5EZXNjcmlwdGlvbjwvbWF0LWxhYmVsPlxuICAgICAgICAgIDx0ZXh0YXJlYSBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIkRlc2NyaXB0aW9uXCIgZm9ybUNvbnRyb2xOYW1lPVwiZGVzY3JpcHRpb25cIj48L3RleHRhcmVhPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGZ4TGF5b3V0PVwiY29sdW1uXCIgKm5nSWY9XCJpc0Zvcm1TZWN0aW9uU2hvd24oJ2ludmVudG9yeSBpbmZvcm1hdGlvbicpXCI+XG4gICAgICA8aDM+PHN0cm9uZz5JbnZlbnRvcnkgSW5mb3JtYXRpb248L3N0cm9uZz48L2gzPlxuICAgICAgPGRpdiBmeExheW91dCBmeExheW91dEdhcD1cIjAuNXJlbVwiPlxuXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBmeEZsZXg9XCI1MCVcIiAqbmdJZj1cImlzRm9ybUZpZWxkU2hvd24oJ3Byb2R1Y3QgbWVhc3VyZScpXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbD5NZWFzdXJlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yIGFwaVVybD1cImFwaS9wcm9kdWN0LW1lYXN1cmVzXCIgZm9ybUNvbnRyb2xOYW1lPVwibWVhc3VyZV9pZFwiPlxuICAgICAgICAgIDwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzRmllbGRWYWxpZCgnbWVhc3VyZV9pZCcpXCI+e3sgZ2V0RXJyb3JNZXNzYWdlKCdtZWFzdXJlX2lkJykgfX0gPC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZ4RmxleD1cIjUwJVwiICpuZ0lmPVwiaXNGb3JtRmllbGRTaG93bigncmVvcmRlciBwb2ludCcpXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbD5SZW9yZGVyIFBvaW50PC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiUmVvcmRlciBQb2ludFwiIGZvcm1Db250cm9sTmFtZT1cInJlb3JkZXJfcG9pbnRcIiB0eXBlPVwibnVtYmVyXCIgLz5cbiAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCdyZW9yZGVyX3BvaW50JylcIj57eyBnZXRFcnJvck1lc3NhZ2UoJ3Jlb3JkZXJfcG9pbnQnKSB9fSA8L21hdC1lcnJvcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBmeExheW91dCBmeExheW91dEdhcD1cIjAuNXJlbVwiPlxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgZnhGbGV4PVwiNTAlXCIgKm5nSWY9XCJpc0Zvcm1GaWVsZFNob3duKCdpbml0aWFsIHF1YW50aXR5JylcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPkluaXRpYWwgUXVhbnRpdHk8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJJbml0aWFsIFF1YW50aXR5XCIgZm9ybUNvbnRyb2xOYW1lPVwiaW5pdGlhbF9xdWFudGl0eVwiIC8+XG4gICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzRmllbGRWYWxpZCgnaW5pdGlhbF9xdWFudGl0eScpXCI+e3sgZ2V0RXJyb3JNZXNzYWdlKCdpbml0aWFsX3F1YW50aXR5JykgfX0gPC9tYXQtZXJyb3I+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGZ4RmxleD1cIjUwJVwiICpuZ0lmPVwiaXNGb3JtRmllbGRTaG93bignaW5pdGlhbCBxdWFudGl0eSBkYXRlJylcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPkluaXRpYWwgUXVhbnRpdHkgRGF0ZTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbbWF0RGF0ZXBpY2tlcl09XCJwaWNrZXJJbml0aWFsUXVhbnRpdHlEYXRlXCIgcGxhY2Vob2xkZXI9XCJJbml0aWFsIFF1YW50aXR5IERhdGVcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiaW5pdGlhbF9xdWFudGl0eV9kYXRlXCIgLz5cbiAgICAgICAgICA8bWF0LWRhdGVwaWNrZXItdG9nZ2xlIG1hdFN1ZmZpeCBbZm9yXT1cInBpY2tlckluaXRpYWxRdWFudGl0eURhdGVcIj48L21hdC1kYXRlcGlja2VyLXRvZ2dsZT5cbiAgICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI3BpY2tlckluaXRpYWxRdWFudGl0eURhdGU+PC9tYXQtZGF0ZXBpY2tlcj5cbiAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCdpbml0aWFsX3F1YW50aXR5X2RhdGUnKVwiPnt7IGdldEVycm9yTWVzc2FnZSgnaW5pdGlhbF9xdWFudGl0eV9kYXRlJykgfX1cbiAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgZnhMYXlvdXQ9XCJjb2x1bW5cIiAqbmdJZj1cImlzRm9ybVNlY3Rpb25TaG93bignc2FsZXMgaW5mb3JtYXRpb24nKVwiPlxuICAgICAgPGgzPjxzdHJvbmc+U2FsZSBJbmZvcm1hdGlvbjwvc3Ryb25nPjwvaDM+XG4gICAgICA8ZGl2IGZ4TGF5b3V0IGZ4TGF5b3V0R2FwPVwiMC41cmVtXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBmeEZsZXg9XCI1MCVcIiAqbmdJZj1cImlzRm9ybUZpZWxkU2hvd24oJ3NhbGVzIHByaWNlJylcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPlNlbGxpbmcgUHJpY2U8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJTZWxsaW5nIFByaWNlXCIgZm9ybUNvbnRyb2xOYW1lPVwic2FsZV9wcmljZVwiIHJlcXVpcmVkIHR5cGU9XCJudW1iZXJcIiBzdGVwPVwiYW55XCIgLz5cbiAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCdzYWxlX3ByaWNlJylcIj57eyBnZXRFcnJvck1lc3NhZ2UoJ3NhbGVfcHJpY2UnKSB9fSA8L21hdC1lcnJvcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgZnhGbGV4PVwiNTAlXCIgKm5nSWY9XCJpc0Zvcm1GaWVsZFNob3duKCdjb25kaXRpb24gdHlwZXMnKVwiPlxuICAgICAgICAgIDxtYXQtbGFiZWw+Q29uZGl0aW9uPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yIGFwaVVybD1cImFwaS9jb25kaXRpb24tdHlwZXNcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29uZGl0aW9uX3R5cGVfaWRcIj48L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGZ4TGF5b3V0IGZ4TGF5b3V0R2FwPVwiMC41cmVtXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBmeEZsZXg9XCI1MCVcIiAqbmdJZj1cImlzRm9ybUZpZWxkU2hvd24oJ21pbmltdW0gcHJpY2UnKVwiPlxuICAgICAgICAgIDxtYXQtbGFiZWw+TWluaW11bSBQcmljZTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIk1pbmltdW0gUHJpY2VcIiBmb3JtQ29udHJvbE5hbWU9XCJtaW5pbXVtX3ByaWNlXCIgcmVxdWlyZWQgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICBzdGVwPVwiYW55XCIgLz5cbiAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCdtaW5pbXVtX3ByaWNlJylcIj57eyBnZXRFcnJvck1lc3NhZ2UoJ21pbmltdW1fcHJpY2UnKSB9fSA8L21hdC1lcnJvcj5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgZnhGbGV4PVwiNTAlXCIgKm5nSWY9XCJpc0Zvcm1GaWVsZFNob3duKCdtYXhpbXVtIHByaWNlJylcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsPk1heGltdW0gUHJpY2U8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJNYXhpbXVtIFByaWNlXCIgZm9ybUNvbnRyb2xOYW1lPVwibWF4aW11bV9wcmljZVwiIHR5cGU9XCJudW1iZXJcIiBzdGVwPVwiYW55XCIgLz5cbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBmeEZsZXg9XCIxMDAlXCIgZnhMYXlvdXQgZnhMYXlvdXRBbGlnbj1cImVuZFwiIGZ4TGF5b3V0R2FwPVwiMXJlbVwiPlxuICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiaXNXb3JraW5nXCIgbWF0LWJ1dHRvbiBjbGFzcz1cIm10LTJcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImNhbmNlbGxlZC5lbWl0KHRydWUpXCI+XG4gICAgICAgIENhbmNlbFxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJpc1dvcmtpbmdcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBjbGFzcz1cIm10LTJcIiB0eXBlPVwic3VibWl0XCI+U2F2ZTwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZm9ybT4iXX0=
|
|
258
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ludmVudG9yeS1jb21tb24vc3JjL2xpYi9pbnZlbnRvcnktY29tbW9uL3Byb2R1Y3QvcHJvZHVjdC1mb3JtL3Byb2R1Y3QtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pbnZlbnRvcnktY29tbW9uL3NyYy9saWIvaW52ZW50b3J5LWNvbW1vbi9wcm9kdWN0L3Byb2R1Y3QtZm9ybS9wcm9kdWN0LWZvcm0uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pFLE9BQU8sRUFBZSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEUsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFHTCw4QkFBOEIsRUFFOUIsK0JBQStCLEVBS2hDLE1BQU0sbUJBQW1CLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBUzNCLE1BQU0sT0FBTyxvQkFBcUIsU0FBUSw4QkFBOEI7SUEwRDVEO0lBQ0E7SUFDVztJQUNBO0lBQ1g7SUFDQTtJQUNEO0lBQ0M7SUFDQTtJQWpFRCxtQkFBbUIsR0FBVTtRQUNwQyxNQUFNO1FBQ04sY0FBYztRQUNkLEtBQUs7UUFDTCxPQUFPO1FBQ1AsYUFBYTtRQUNiLGlCQUFpQjtRQUNqQixlQUFlO1FBQ2Ysa0JBQWtCO1FBQ2xCLHVCQUF1QjtRQUN2QixhQUFhO1FBQ2IsZUFBZTtRQUNmLGVBQWU7UUFDZixnQkFBZ0I7UUFDaEIsaUJBQWlCO0tBQ2xCLENBQUM7SUFFTyxxQkFBcUIsR0FBVTtRQUN0QyxtQkFBbUI7UUFDbkIsdUJBQXVCO1FBQ3ZCLG1CQUFtQjtRQUNuQixzQkFBc0I7S0FDdkIs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QUFDO1lBQ3pFLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzt3R0FuUFUsb0JBQW9COzRGQUFwQixvQkFBb0IsdUxDdEJqQyw0clNBaUxDOzs0RkQzSlksb0JBQW9CO2tCQUpoQyxTQUFTOytCQUNFLGtCQUFrQjtzVUFJbkIsbUJBQW1CO3NCQUEzQixLQUFLO2dCQWlCRyxxQkFBcUI7c0JBQTdCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPbkluaXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIEZvcm1Db250cm9sLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHtcbiAgRXJyb3JIYW5kbGVyU2VydmljZSxcbiAgRm9ybVZhbGlkYXRvclNlcnZpY2UsXG4gIFRlY2hsaWZ5Rm9ybUNvbXBvbmVudEludGVyZmFjZSxcbiAgRm9ybUNvbmZpZ3VyYXRpb25Gb3JtU2VydmljZSxcbiAgRm9ybUNvbmZpZ3VyYXRpb25VdGlsaXR5U2VydmljZSxcbiAgRmlsZURyb3BwZXJDb25maWcsXG4gIFZpZXdlckNvbmZpZyxcbiAgSHR0cFNlcnZpY2UsXG4gIEVudGl0eUZpbGVTZXJ2aWNlXG59IGZyb20gJ25neC10ZWNobGlmeS1jb3JlJztcbmltcG9ydCB7IFByb2R1Y3RTZXJ2aWNlIH0gZnJvbSAnLi4vcHJvZHVjdC5zZXJ2aWNlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgTG9jYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtcHJvZHVjdC1mb3JtJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3Byb2R1Y3QtZm9ybS5jb21wb25lbnQuaHRtbCcsXG59KVxuZXhwb3J0IGNsYXNzIFByb2R1Y3RGb3JtQ29tcG9uZW50IGV4dGVuZHMgVGVjaGxpZnlGb3JtQ29tcG9uZW50SW50ZXJmYWNlIGltcGxlbWVudHMgT25Jbml0IHtcbiAgQElucHV0KCkgZGlzcGxheWVkRm9ybUZpZWxkczogYW55W10gPSBbXG4gICAgJ25hbWUnLFxuICAgICdwcm9kdWN0IHR5cGUnLFxuICAgICdza3UnLFxuICAgICdjb2xvcicsXG4gICAgJ2Rlc2NyaXB0aW9uJyxcbiAgICAncHJvZHVjdCBtZWFzdXJlJyxcbiAgICAncmVvcmRlciBwb2ludCcsXG4gICAgJ2luaXRpYWwgcXVhbnRpdHknLFxuICAgICdpbml0aWFsIHF1YW50aXR5IGRhdGUnLFxuICAgICdzYWxlcyBwcmljZScsXG4gICAgJ21pbmltdW0gcHJpY2UnLFxuICAgICdtYXhpbXVtIHByaWNlJyxcbiAgICAnaW5jb21lIGFjY291bnQnLFxuICAgICdleHBlbnNlIGFjY291bnQnLFxuICBdO1xuXG4gIEBJbnB1dCgpIGRpc3BsYXllZEZvcm1TZWN0aW9uczogYW55W10gPSBbXG4gICAgJ2Jhc2ljIGluZm9ybWF0aW9uJyxcbiAgICAnaW52ZW50b3J5IGluZm9ybWF0aW9uJyxcbiAgICAnc2FsZXMgaW5mb3JtYXRpb24nLFxuICAgICdhY2NvdW50cyBpbmZvcm1hdGlvbicsXG4gIF07XG5cbiAgcHJvZHVjdCA9IHNpZ25hbDxhbnk+KG51bGwpO1xuICBpc0Zvcm1TZXR1cCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgb3ZlcnJpZGUgZXJyb3JNZXNzYWdlczogYW55ID0ge1xuICAgIHR5cGVfaWQ6IHtcbiAgICAgIHJlcXVpcmVkOiAnUGxlYXNlIEVudGVyIFR5cGUnLFxuICAgIH0sXG4gICAgbmFtZToge1xuICAgICAgcmVxdWlyZWQ6ICdQbGVhc2UgRW50ZXIgTmFtZScsXG4gICAgfSxcbiAgICBzYWxlX3ByaWNlOiB7XG4gICAgICByZXF1aXJlZDogJ1BsZWFzZSBFbnRlciBTYWxlcyBQcmljZScsXG4gICAgfSxcbiAgICBtaW5pbXVtX3ByaWNlOiB7XG4gICAgICByZXF1aXJlZDogJ1BsZWFzZSBFbnRlciBNaW5pbXVtIFByaWNlJyxcbiAgICB9LFxuICAgIHJlb3JkZXJfcG9pbnQ6IHtcbiAgICAgIHJlcXVpcmVkOiAnUGxlYXNlIEVudGVyIFJlb3JkZXIgUG9pbnQnLFxuICAgIH0sXG4gICAgY29sb3JfaWQ6IHtcbiAgICAgIHJlcXVpcmVkOiAnUGxlYXNlIFNlbGVjdCBDb2xvcicsXG4gICAgfSxcbiAgfTtcblxuICBpc0NyZWF0ZUFub3RoZXIgPSBuZXcgRm9ybUNvbnRyb2woZmFsc2UpO1xuICBzYXZlZENvdW50ID0gMDtcbiAgcHVibGljIGZvcm1Db25maWd1cmF0aW9uVXRpbGl0eVNlcnZpY2U6IEZvcm1Db25maWd1cmF0aW9uVXRpbGl0eVNlcnZpY2U7XG5cbiAgZmlsZUNvbmZpZyE6IEZpbGVEcm9wcGVyQ29uZmlnO1xuICB2aWV3ZXJDb25maWchOiBWaWV3ZXJDb25maWc7XG4gIGZpbGVMaXN0OiBhbnlbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgZmlsZVNlcnZpY2U6IEVudGl0eUZpbGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBmb3JtVmFsaWRhdG9yU2VydmljZTogRm9ybVZhbGlkYXRvclNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIHNlcnZpY2U6IFByb2R1Y3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJTZXJ2aWNlLFxuICAgIHB1YmxpYyBsb2NhdGlvbjogTG9jYXRpb24sXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICBwcml2YXRlIGZvcm1Db25maWdTZXJ2aWNlOiBGb3JtQ29uZmlndXJhdGlvbkZvcm1TZXJ2aWNlXG4gICkge1xuICAgIHN1cGVyKGZvcm1WYWxpZGF0b3JTZXJ2aWNlKTtcblxuICAgIHRoaXMuZm9ybUNvbmZpZ3VyYXRpb25VdGlsaXR5U2VydmljZSA9IG5ldyBGb3JtQ29uZmlndXJhdGlvblV0aWxpdHlTZXJ2aWNlKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmZpbGVDb25maWcgPSB7XG4gICAgICBmaWxlSWQ6ICdwcm9kdWN0SW1hZ2VGaWxlJyxcbiAgICAgIGNvbnRhaW5lcklkOiAncHJvZHVjdEltYWdlRmlsZUNvbnRhaW5lcicsXG4gICAgICBzdHlsZXM6IHtcbiAgICAgICAgaGVpZ2h0OiAnMjAwcHgnXG4gICAgICB9LFxuICAgICAgbXVsdGlwbGU6IGZhbHNlLFxuICAgICAgYWNjZXB0RmlsZTogJ2ltYWdlLyonLFxuICAgICAgbWF4U2l6ZTogMTAsXG4gICAgICBhY2NlcHRGaWxlVGV4dDogJ1BORywgSlBFRywgYW5kIEpQRyBvbmx5J1xuICAgIH07XG5cbiAgICB0aGlzLnZpZXdlckNvbmZpZyA9IHtcbiAgICAgIHZpZXdlclN0eWxlOiB7XG4gICAgICAgIGhlaWdodDogJzUwcHgnLFxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmZvcm1Db25maWd1cmF0aW9uVXRpbGl0eVNlcnZpY2VcbiAgICAgIC5pbml0aWFsaXplKHRoaXMuZm9ybUNvbmZpZ1NlcnZpY2UsICdwcm9kdWN0JywpXG4gICAgICAuc3Vic2NyaWJlKHtcbiAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIGlkOiBbJyddLFxuICAgICAgICAgICAgdHlwZV9pZDogWzEsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXSxcbiAgICAgICAgICAgIGNvbG9yX2lkOiBbJycsIHRoaXMuZm9ybUNvbmZpZ3VyYXRpb25VdGlsaXR5U2VydmljZS5nZXRGaWVsZFJlcXVpcmVkKCdjb2xvcl9pZCcpID8gVmFsaWRhdG9ycy5yZXF1aXJlZCA6IG51bGxdLFxuICAgICAgICAgICAgc2t1OiBbJyddLFxuICAgICAgICAgICAgbmFtZTogWycnLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKV0sXG4gICAgICAgICAgICBpbml0aWFsX3F1YW50aXR5OiBbMF0sXG4gICAgICAgICAgICBpbml0aWFsX3F1YW50aXR5X2RhdGU6IFttb21lbnQoKS5mb3JtYXQoKV0sXG4gICAgICAgICAgICByZW9yZGVyX3BvaW50OiBbMTAsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBbJyddLFxuICAgICAgICAgICAgc2FsZV9wcmljZTogWzAsIFZhbGlkYXRvcnMuY29tcG9zZShbVmFsaWRhdG9ycy5yZXF1aXJlZF0pXSxcbiAgICAgICAgICAgIGluY29tZV9hY2NvdW50X2lkOiBbJyddLFxuICAgICAgICAgICAgZXhwZW5zZV9hY2NvdW50X2lkOiBbJyddLFxuICAgICAgICAgICAgbWVhc3VyZV9pZDogWzFdLFxuICAgICAgICAgICAgbWluaW11bV9wcmljZTogWycnLCBWYWxpZGF0b3JzLmNvbXBvc2UoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKV0sXG4gICAgICAgICAgICBtYXhpbXVtX3ByaWNlOiBbJyddLFxuICAgICAgICAgICAgY29uZGl0aW9uX3R5cGVfaWQ6IFsxXSxcbiAgICAgICAgICAgIGN1cnJlbnRfcXVhbnRpdHk6IFtdLFxuICAgICAgICAgICAgY2F0ZWdvcnlfaWRzOiBbJyddLFxuICAgICAgICAgICAgaW1hZ2VfZmlsZTogW251bGxdLFxuICAgICAgICAgICAgaW1hZ2VfZmlsZV91cmw6IFtudWxsXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgZXJyb3I6IChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9LCBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNGb3JtU2V0dXAuc2V0KHRydWUpO1xuICAgICAgICAgIHRoaXMubG9hZFByb2R1Y3QoKTtcbiAgICAgICAgfVxuICAgICAgfSlcblxuXG4gIH1cblxuICBsb2FkUHJvZHVjdCgpIHtcbiAgICBsZXQgaWQgPSB0aGlzLmFjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnBhcmFtc1snaWQnXTtcbiAgICBpZiAoIWlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuaXNXb3JraW5nID0gdHJ1ZTtcblxuICAgIHRoaXMuc2VydmljZT8uc2hvdyhpZCwge1xuICAgICAgd2l0aDogJ21lYXN1cmUsY2F0ZWdvcmllcycsXG4gICAgfSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMucHJvZHVjdC5zZXQocmVzcG9uc2U/Lml0ZW0pO1xuICAgICAgICB0aGlzLmlzV29ya2luZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmlzV29ya2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVycm9ySGFuZGxlci5oYW5kbGVFcnJvcihlcnJvcik7XG4gICAgICB9LFxuICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgdGhpcy5wYXRjaFByb2R1Y3QoKTtcbiAgICAgICAgdGhpcy5pc1dvcmtpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcGF0Y2hQcm9kdWN0KCkge1xuICAgIHRoaXMuaXNVcGRhdGUgPSB0cnVlO1xuICAgIGxldCBkYXRhID0geyAuLi50aGlzLnByb2R1Y3QoKSB9O1xuXG4gICAgaWYgKHRoaXMucHJvZHVjdCgpPy5jYXRlZ29yaWVzPy5sZW5ndGggPiAwKSB7XG4gICAgICAoZGF0YSkuY2F0ZWdvcnlfaWRzID0gKHRoaXMucHJvZHVjdCgpLmNhdGVnb3JpZXMgYXMgW10pLm1hcCgoY2F0ZWdvcnk6IGFueSkgPT4gY2F0ZWdvcnk/LmlkKTtcbiAgICB9XG4gICAgaWYgKGRhdGE/LmluaXRpYWxfcXVhbnRpdHlfZGF0ZSkge1xuICAgICAgZGF0YS5pbml0aWFsX3F1YW50aXR5X2RhdGUgPSBtb21lbnQoZGF0YS5pbml0aWFsX3F1YW50aXR5X2RhdGUpLnRvSVNPU3RyaW5nKCk7XG4gICAgfVxuICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKGRhdGEpO1xuICB9XG5cbiAgYXN5bmMgc2F2ZSgpIHtcbiAgICB0aGlzLmZvcm0ubWFya0FsbEFzVG91Y2hlZCgpO1xuICAgIGlmICh0aGlzLmZvcm0uaW52YWxpZCkge1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2UuYWRkQWxlcnQoJ1BsZWFzZSBGaWxsIEFsbCBSZXF1aXJlZCBGaWVsZHMnLCAnd2FybicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgcHJvZHVjdCA9IHRoaXMuZm9ybS52YWx1ZTtcbiAgICBpZiAocHJvZHVjdC5tYXhpbXVtX3ByaWNlIDw9IDAgfHwgIXByb2R1Y3QubWF4aW11bV9wcmljZSkge1xuICAgICAgcHJvZHVjdC5tYXhpbXVtX3ByaWNlID0gcHJvZHVjdC5taW5pbXVtX3ByaWNlO1xuICAgIH1cblxuICAgIGlmIChwcm9kdWN0Py5pbml0aWFsX3F1YW50aXR5X2RhdGUpIHtcbiAgICAgIHByb2R1Y3QuaW5pdGlhbF9xdWFudGl0eV9kYXRlID0gbW9tZW50KHByb2R1Y3QuaW5pdGlhbF9xdWFudGl0eV9kYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKTtcbiAgICB9XG4gICAgdGhpcy5pc1dvcmtpbmcgPSB0cnVlO1xuXG4gICAgbGV0IHByb21pc2UgPSBwcm9kdWN0LmlkXG4gICAgICA/IHRoaXMuc2VydmljZS51cGRhdGUocHJvZHVjdClcbiAgICAgIDogdGhpcy5zZXJ2aWNlLnN0b3JlKHByb2R1Y3QpO1xuXG4gICAgcHJvbWlzZS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICB0aGlzLmlzV29ya2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRBbGVydCgnUHJvZHVjdCBzYXZlZCBzdWNjZXNzZnVsbHkhJywgJ3N1Y2Nlc3MnKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4gKHRoaXMuaXNXb3JraW5nID0gZmFsc2UpLFxuICAgICAgY29tcGxldGU6ICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuaXNDcmVhdGVBbm90aGVyLnZhbHVlICYmICF0aGlzLmlzVXBkYXRlKSB7XG4gICAgICAgICAgdGhpcy5zYXZlZENvdW50Kys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvaW52ZW50b3J5L3Byb2R1Y3RzJ10pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGRpc3BsYXllZCBGb3JtIEZpZWxkcyBhcnJheSBmb3IgZm9ybSBmaWVsZCBhbmQgcmV0dXJucyBib29sZWFuIHJlc3VsdFxuICAgKi9cbiAgaXNGb3JtRmllbGRTaG93bihmaWVsZE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpc3BsYXllZEZvcm1GaWVsZHMubGVuZ3RoID4gMCAmJiB0aGlzLmRpc3BsYXllZEZvcm1GaWVsZHMuaW5jbHVkZXMoZmllbGROYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgZGlzcGxheWVkIEZvcm0gU2VjdGlvbiBhcnJheSBmb3IgZm9ybSBzZWN0aW9uIGFuZCByZXR1cm5zIGJvb2xlYW4gcmVzdWx0XG4gICAqL1xuICBpc0Zvcm1TZWN0aW9uU2hvd24oc2VjdGlvbk5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpc3BsYXllZEZvcm1TZWN0aW9ucy5sZW5ndGggPiAwICYmIHRoaXMuZGlzcGxheWVkRm9ybVNlY3Rpb25zLmluY2x1ZGVzKHNlY3Rpb25OYW1lKTtcbiAgfVxuXG4gIGFzeW5jIGZpbGVDaGFuZ2VkKGV2ZW50OiBhbnkpIHtcbiAgICB0aGlzLmZpbGVMaXN0ID0gZXZlbnQ7XG5cbiAgICBpZiAodGhpcy5maWxlTGlzdC5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCByZXN1bHQ6IGFueSA9IGF3YWl0IHRoaXMuZmlsZVNlcnZpY2UudXBsb2FkRW50aXR5RmlsZSh0aGlzLmZpbGVMaXN0WzBdLCB7XG4gICAgICAgIGVudGl0eV9pZDogdGhpcy5wcm9kdWN0KCk/LmlkLFxuICAgICAgICBlbnRpdHlfdHlwZTogJ3Byb2R1Y3QnLFxuICAgICAgICBzdWJfcGF0aDogYCR7dGhpcy5wcm9kdWN0KCk/LmlkfWBcbiAgICAgIH0pO1xuICAgICAgdGhpcy5mb3JtLmdldCgnaW1hZ2VfZmlsZScpPy5zZXRWYWx1ZShyZXN1bHQuaXRlbS5maWxlKTtcbiAgICAgIHRoaXMuZm9ybS5nZXQoJ2ltYWdlX2ZpbGVfdXJsJyk/LnNldFZhbHVlKHJlc3VsdC5pdGVtLnVybCk7XG4gICAgICB0aGlzLmZpbGVMaXN0ID0gW107XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVtb3ZlRmlsZSgpIHtcbiAgICBpZiAodGhpcy5mb3JtLnZhbHVlLmltYWdlX2ZpbGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuZm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgICBpbWFnZV9maWxlOiAnJyxcbiAgICAgICAgICBpbWFnZV9maWxlX3VybDogJydcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRBbGVydCgnVW5hYmxlIHRvIHJlbW92ZSBmaWxlLCB0cnkgbGF0ZXInLCAnd2FybicpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiQGlmIChpc0Zvcm1TZXR1cCgpKSB7XG48ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0yXCI+XG4gIDxtYXQtY2FyZCBjbGFzcz0nY29udGFpbmVyJz5cbiAgICA8bWF0LWNhcmQtY29udGVudD5cbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgPGgzIGNsYXNzPVwidGV4dC1jZW50ZXIgbS0wXCI+UHJvZHVjdCBGb3JtPC9oMz5cbiAgICAgICAgPGFwcC1mb3JtLWNvbmZpZ3VyYXRpb24tZm9yLWZvcm0gZm9ybUNvZGU9J3Byb2R1Y3QnPjwvYXBwLWZvcm0tY29uZmlndXJhdGlvbi1mb3ItZm9ybT5cbiAgICAgIDwvZGl2PlxuICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgPC9tYXQtY2FyZD5cbiAgPG1hdC1jYXJkIGNsYXNzPSdjb250YWluZXInPlxuICAgIDxtYXQtY2FyZC1jb250ZW50PlxuICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJmb3JtXCIgKHN1Ym1pdCk9XCJzYXZlKClcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtblwiPlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNmaWxlVXBsb2FkPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDBcIj5cbiAgICAgICAgICAgICAgICA8YXBwLWZpbGUtZHJvcHBlciAoZmlsZUNoYW5nZWQpPVwiZmlsZUNoYW5nZWQoJGV2ZW50KVwiIFtjb25maWddPVwiZmlsZUNvbmZpZ1wiIFtmaWxlQXJyYXldPVwiZmlsZUxpc3RcIj5cbiAgICAgICAgICAgICAgICA8L2FwcC1maWxlLWRyb3BwZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJmb3JtLmdldCgnaW1hZ2VfZmlsZScpPy52YWx1ZTsgZWxzZSBmaWxlVXBsb2FkO1wiIHN0eWxlPSd3aWR0aDogMjAwcHg7J1xuICAgICAgICAgICAgICBjbGFzcz0nanVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXInPlxuICAgICAgICAgICAgICA8YXBwLWRvY3VtZW50LXZpZXdlciAocmVtb3ZlKT1cInJlbW92ZUZpbGUoKVwiIFtjb25maWddPVwidmlld2VyQ29uZmlnXCJcbiAgICAgICAgICAgICAgICBbZmlsZVVybF09XCJmb3JtLmdldCgnaW1hZ2VfZmlsZV91cmwnKT8udmFsdWVcIiBbZmlsZV09XCJmb3JtLmdldCgnaW1hZ2VfZmlsZScpPy52YWx1ZVwiPlxuICAgICAgICAgICAgICA8L2FwcC1kb2N1bWVudC12aWV3ZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4gbXQtMlwiICpuZ0lmPVwiaXNGb3JtU2VjdGlvblNob3duKCdiYXNpYyBpbmZvcm1hdGlvbicpXCI+XG4gICAgICAgICAgICA8aDY+QmFzaWMgSW5mb3JtYXRpb248L2g2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxuXG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInctNTBcIiAqbmdJZj1cImlzRm9ybUZpZWxkU2hvd24oJ25hbWUnKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+TmFtZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIk5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgcmVxdWlyZWQgLz5cbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCduYW1lJylcIj57eyBnZXRFcnJvck1lc3NhZ2UoJ25hbWUnKSB9fSA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ3LTUwXCIgKm5nSWY9XCJpc0Zvcm1GaWVsZFNob3duKCdwcm9kdWN0IHR5cGUnKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+UHJvZHVjdCBUeXBlPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yIGFwaVVybD1cImFwaS9wcm9kdWN0LXR5cGVzXCIgZm9ybUNvbnRyb2xOYW1lPVwidHlwZV9pZFwiPlxuICAgICAgICAgICAgICAgIDwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzRmllbGRWYWxpZCgndHlwZV9pZCcpXCI+e3sgZ2V0RXJyb3JNZXNzYWdlKCd0eXBlX2lkJykgfX0gPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ3LTUwXCIgKm5nSWY9XCJpc0Zvcm1GaWVsZFNob3duKCdza3UnKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+U0tVPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IG1hdElucHV0IHBsYWNlaG9sZGVyPVwiU0tVXCIgZm9ybUNvbnRyb2xOYW1lPVwic2t1XCIgLz5cbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCdza3UnKVwiPnt7IGdldEVycm9yTWVzc2FnZSgnc2t1JykgfX0gPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidy01MFwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+Q2F0ZWdvcnk8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3IgYXBpVXJsPVwiYXBpL3Byb2R1Y3QtY2F0ZWdvcmllc1wiIGZvcm1Db250cm9sTmFtZT1cImNhdGVnb3J5X2lkc1wiXG4gICAgICAgICAgICAgICAgICBbbXVsdGlwbGVdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIDwvYXBwLXNlYXJjaGFibGUtc2VsZWN0b3I+XG4gICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzRmllbGRWYWxpZCgnY2F0ZWdvcnlfaWRzJylcIj5cbiAgICAgICAgICAgICAgICAgIHt7IGdldEVycm9yTWVzc2FnZSgnY2F0ZWdvcnlfaWRzJykgfX1cbiAgICAgICAgICAgICAgICA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMlwiPlxuICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidy01MCBhbGlnbi1zZWxmLXN0YXJ0XCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJpc0Zvcm1GaWVsZFNob3duKCdjb2xvcicpICYmIGZvcm1Db25maWd1cmF0aW9uVXRpbGl0eVNlcnZpY2UuZ2V0RmllbGRFbmFibGVkKCdjb2xvcl9pZCcpXCI+XG4gICAgICAgICAgICAgIDxtYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgQ29sb3IgPHN1cCAqbmdJZj1cImZvcm1Db25maWd1cmF0aW9uVXRpbGl0eVNlcnZpY2UuZ2V0RmllbGRSZXF1aXJlZCgnY29sb3JfaWQnKVwiPio8L3N1cD5cbiAgICAgICAgICAgICAgPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgIDxhcHAtc2VhcmNoYWJsZS1zZWxlY3RvciBhcGlVcmw9XCJhcGkvYXR0cmlidXRlcz90eXBlX2NvZGU9Y29sb3JcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNvbG9yX2lkXCI+PC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzRmllbGRWYWxpZCgnY29sb3JfaWQnKVwiPnt7Z2V0RXJyb3JNZXNzYWdlKCdjb2xvcl9pZCcpfX08L21hdC1lcnJvcj5cbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidy01MFwiICpuZ0lmPVwiaXNGb3JtRmllbGRTaG93bignZGVzY3JpcHRpb24nKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+RGVzY3JpcHRpb248L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJEZXNjcmlwdGlvblwiIGZvcm1Db250cm9sTmFtZT1cImRlc2NyaXB0aW9uXCI+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtblwiICpuZ0lmPVwiaXNGb3JtU2VjdGlvblNob3duKCdpbnZlbnRvcnkgaW5mb3JtYXRpb24nKVwiPlxuICAgICAgICAgICAgPGg2PkludmVudG9yeSBJbmZvcm1hdGlvbjwvaDY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yXCI+XG5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidy01MFwiICpuZ0lmPVwiaXNGb3JtRmllbGRTaG93bigncHJvZHVjdCBtZWFzdXJlJylcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPk1lYXN1cmU8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8YXBwLXNlYXJjaGFibGUtc2VsZWN0b3IgYXBpVXJsPVwiYXBpL3Byb2R1Y3QtbWVhc3VyZXNcIiBmb3JtQ29udHJvbE5hbWU9XCJtZWFzdXJlX2lkXCI+XG4gICAgICAgICAgICAgICAgPC9hcHAtc2VhcmNoYWJsZS1zZWxlY3Rvcj5cbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCdtZWFzdXJlX2lkJylcIj57eyBnZXRFcnJvck1lc3NhZ2UoJ21lYXN1cmVfaWQnKSB9fSA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ3LTUwXCIgKm5nSWY9XCJpc0Zvcm1GaWVsZFNob3duKCdyZW9yZGVyIHBvaW50JylcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPlJlb3JkZXIgUG9pbnQ8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJSZW9yZGVyIFBvaW50XCIgZm9ybUNvbnRyb2xOYW1lPVwicmVvcmRlcl9wb2ludFwiIHR5cGU9XCJudW1iZXJcIiAvPlxuICAgICAgICAgICAgICAgIDxtYXQtZXJyb3IgKm5nSWY9XCJpc0ZpZWxkVmFsaWQoJ3Jlb3JkZXJfcG9pbnQnKVwiPnt7IGdldEVycm9yTWVzc2FnZSgncmVvcmRlcl9wb2ludCcpIH19IDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInctNTBcIiAqbmdJZj1cImlzRm9ybUZpZWxkU2hvd24oJ2luaXRpYWwgcXVhbnRpdHknKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+SW5pdGlhbCBRdWFudGl0eTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIkluaXRpYWwgUXVhbnRpdHlcIiBmb3JtQ29udHJvbE5hbWU9XCJpbml0aWFsX3F1YW50aXR5XCIgLz5cbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCdpbml0aWFsX3F1YW50aXR5JylcIj57eyBnZXRFcnJvck1lc3NhZ2UoJ2luaXRpYWxfcXVhbnRpdHknKSB9fVxuICAgICAgICAgICAgICAgIDwvbWF0LWVycm9yPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuXG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInctNTBcIiAqbmdJZj1cImlzRm9ybUZpZWxkU2hvd24oJ2luaXRpYWwgcXVhbnRpdHkgZGF0ZScpXCI+XG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5Jbml0aWFsIFF1YW50aXR5IERhdGU8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW21hdERhdGVwaWNrZXJdPVwicGlja2VySW5pdGlhbFF1YW50aXR5RGF0ZVwiIHBsYWNlaG9sZGVyPVwiSW5pdGlhbCBRdWFudGl0eSBEYXRlXCJcbiAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImluaXRpYWxfcXVhbnRpdHlfZGF0ZVwiIC8+XG4gICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBtYXRTdWZmaXggW2Zvcl09XCJwaWNrZXJJbml0aWFsUXVhbnRpdHlEYXRlXCI+PC9tYXQtZGF0ZXBpY2tlci10b2dnbGU+XG4gICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyICNwaWNrZXJJbml0aWFsUXVhbnRpdHlEYXRlPjwvbWF0LWRhdGVwaWNrZXI+XG4gICAgICAgICAgICAgICAgPG1hdC1lcnJvciAqbmdJZj1cImlzRmllbGRWYWxpZCgnaW5pdGlhbF9xdWFudGl0eV9kYXRlJylcIj57eyBnZXRFcnJvck1lc3NhZ2UoJ2luaXRpYWxfcXVhbnRpdHlfZGF0ZScpIH19XG4gICAgICAgICAgICAgICAgPC9tYXQtZXJyb3I+XG4gICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uXCIgKm5nSWY9XCJpc0Zvcm1TZWN0aW9uU2hvd24oJ3NhbGVzIGluZm9ybWF0aW9uJylcIj5cbiAgICAgICAgICAgIDxoNj5TYWxlIEluZm9ybWF0aW9uPC9oNj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTJcIj5cbiAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwidy01MFwiICpuZ0lmPVwiaXNGb3JtRmllbGRTaG93bignc2FsZXMgcHJpY2UnKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+U2VsbGluZyBQcmljZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIlNlbGxpbmcgUHJpY2VcIiBmb3JtQ29udHJvbE5hbWU9XCJzYWxlX3ByaWNlXCIgcmVxdWlyZWQgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICBzdGVwPVwiYW55XCIgLz5cbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCdzYWxlX3ByaWNlJylcIj57eyBnZXRFcnJvck1lc3NhZ2UoJ3NhbGVfcHJpY2UnKSB9fSA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ3LTUwXCIgKm5nSWY9XCJpc0Zvcm1GaWVsZFNob3duKCdjb25kaXRpb24gdHlwZXMnKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+Q29uZGl0aW9uPC9tYXQtbGFiZWw+XG4gICAgICAgICAgICAgICAgPGFwcC1zZWFyY2hhYmxlLXNlbGVjdG9yIGFwaVVybD1cImFwaS9jb25kaXRpb24tdHlwZXNcIlxuICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29uZGl0aW9uX3R5cGVfaWRcIj48L2FwcC1zZWFyY2hhYmxlLXNlbGVjdG9yPlxuICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0yXCI+XG4gICAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cInctNTBcIiAqbmdJZj1cImlzRm9ybUZpZWxkU2hvd24oJ21pbmltdW0gcHJpY2UnKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+TWluaW11bSBQcmljZTwvbWF0LWxhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBwbGFjZWhvbGRlcj1cIk1pbmltdW0gUHJpY2VcIiBmb3JtQ29udHJvbE5hbWU9XCJtaW5pbXVtX3ByaWNlXCIgcmVxdWlyZWQgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgICBzdGVwPVwiYW55XCIgLz5cbiAgICAgICAgICAgICAgICA8bWF0LWVycm9yICpuZ0lmPVwiaXNGaWVsZFZhbGlkKCdtaW5pbXVtX3ByaWNlJylcIj57eyBnZXRFcnJvck1lc3NhZ2UoJ21pbmltdW1fcHJpY2UnKSB9fSA8L21hdC1lcnJvcj5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cblxuICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJ3LTUwXCIgKm5nSWY9XCJpc0Zvcm1GaWVsZFNob3duKCdtYXhpbXVtIHByaWNlJylcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWxhYmVsPk1heGltdW0gUHJpY2U8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgcGxhY2Vob2xkZXI9XCJNYXhpbXVtIFByaWNlXCIgZm9ybUNvbnRyb2xOYW1lPVwibWF4aW11bV9wcmljZVwiIHR5cGU9XCJudW1iZXJcIiBzdGVwPVwiYW55XCIgLz5cbiAgICAgICAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxuICAgICAgICAgICAgQGlmICghaXNVcGRhdGUpIHtcbiAgICAgICAgICAgIDxtYXQtY2hlY2tib3ggW2Zvcm1Db250cm9sXT1cImlzQ3JlYXRlQW5vdGhlclwiPkNyZWF0ZSBBbm90aGVyXG4gICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwic2F2ZWRDb3VudCA+IDBcIj4oe3sgc2F2ZWRDb3VudCB9fSBpdGVtcyBzYXZlZCk8L3NwYW4+XG4gICAgICAgICAgICA8L21hdC1jaGVja2JveD5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9J2QtZmxleCBmbGV4LWdyb3cnPjwvc3Bhbj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LXJvdyBnYXAtMyBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWVuZFwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJpc1dvcmtpbmdcIiBtYXQtYnV0dG9uIGNsYXNzPVwibXQtMlwiIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwibG9jYXRpb24uYmFjaygpXCI+XG4gICAgICAgICAgICAgICAgQ2FuY2VsXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJpc1dvcmtpbmdcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBjbGFzcz1cIm10LTJcIiB0eXBlPVwic3VibWl0XCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9mb3JtPlxuICAgIDwvbWF0LWNhcmQtY29udGVudD5cbiAgPC9tYXQtY2FyZD5cbjwvZGl2PlxufSBAZWxzZSB7XG48bWF0LWNhcmQtY29udGVudCBjbGFzcz1cImQtZmxleCB2aC0xMDAganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgPG1hdC1zcGlubmVyPjwvbWF0LXNwaW5uZXI+XG48L21hdC1jYXJkLWNvbnRlbnQ+XG59Il19
|