tango-app-ui-store-builder 1.0.74 → 1.0.76
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/components/ivm-logic-explorer/ivm-logic-explorer.component.mjs +26 -3
- package/esm2022/lib/components/manage-plano/onboard-table/onboard-table.component.mjs +4 -2
- package/esm2022/lib/components/manage-plano/rollout-table/rollout-table.component.mjs +3 -3
- package/esm2022/lib/components/manage-store-plano/manage-store-plano.component.mjs +5 -6
- package/esm2022/lib/components/manage-store-plano/plano-rollout/plano-rollout.component.mjs +26 -8
- package/esm2022/lib/components/manage-store-plano/popups/schedule-task-popup/schedule-task-popup.component.mjs +64 -33
- package/esm2022/lib/components/manage-store-plano/template-basic-details/template-basic-details.component.mjs +3 -3
- package/esm2022/lib/components/manage-store-plano/template-vms/template-vms.component.mjs +17 -17
- package/esm2022/lib/components/onboard-store-plano/create-planogram/create-planogram.component.mjs +23 -4
- package/esm2022/lib/components/onboard-store-plano/onboard-store-plano.component.mjs +9 -11
- package/esm2022/lib/components/plano-tools/cad-render/cad-render.component.mjs +1538 -0
- package/esm2022/lib/components/plano-tools/plano-migrate/plano-migrate.component.mjs +13 -6
- package/esm2022/lib/components/plano-tools/tools-parent/tools-parent.component.mjs +3 -3
- package/esm2022/lib/services/store-builder.service.mjs +4 -1
- package/esm2022/lib/tango-store-builder-routing.module.mjs +6 -1
- package/esm2022/lib/tango-store-builder.module.mjs +4 -1
- package/fesm2022/tango-app-ui-store-builder.mjs +1874 -239
- package/fesm2022/tango-app-ui-store-builder.mjs.map +1 -1
- package/lib/components/ivm-logic-explorer/ivm-logic-explorer.component.d.ts +1 -0
- package/lib/components/manage-plano/rollout-table/rollout-table.component.d.ts +2 -2
- package/lib/components/manage-plano/verification-table/verification-table.component.d.ts +4 -4
- package/lib/components/manage-store-plano/popups/schedule-task-popup/schedule-task-popup.component.d.ts +4 -1
- package/lib/components/onboard-store-plano/create-planogram/create-planogram.component.d.ts +1 -0
- package/lib/components/onboard-store-plano/onboard-store-plano.component.d.ts +0 -1
- package/lib/components/plano-tools/cad-render/cad-render.component.d.ts +84 -0
- package/lib/services/store-builder.service.d.ts +1 -0
- package/lib/tango-store-builder.module.d.ts +46 -45
- package/package.json +1 -1
package/esm2022/lib/components/onboard-store-plano/create-planogram/create-planogram.component.mjs
CHANGED
|
@@ -69,6 +69,9 @@ export class CreatePlanogramComponent {
|
|
|
69
69
|
this.selectedFloor &&
|
|
70
70
|
(this.selectedFile || this.isManual));
|
|
71
71
|
}
|
|
72
|
+
get isModalBusy() {
|
|
73
|
+
return this.isPopupLoading || this.isButtonLoading || this.isCadProcessing;
|
|
74
|
+
}
|
|
72
75
|
async getStoreList() {
|
|
73
76
|
this.isPopupLoading = true;
|
|
74
77
|
try {
|
|
@@ -85,6 +88,8 @@ export class CreatePlanogramComponent {
|
|
|
85
88
|
}
|
|
86
89
|
}
|
|
87
90
|
async onStoreChange() {
|
|
91
|
+
if (this.isModalBusy || !this.selectedStore)
|
|
92
|
+
return;
|
|
88
93
|
try {
|
|
89
94
|
const floors = await firstValueFrom(this.storeBuilderService.getStoreFloorsList(this.selectedStore));
|
|
90
95
|
this.selectedStoreFloors = floors?.data ?? [];
|
|
@@ -95,6 +100,8 @@ export class CreatePlanogramComponent {
|
|
|
95
100
|
}
|
|
96
101
|
}
|
|
97
102
|
onFloorChange() {
|
|
103
|
+
if (this.isModalBusy)
|
|
104
|
+
return;
|
|
98
105
|
if (this.selectedFloor) {
|
|
99
106
|
this.isLayoutExist = this.selectedStoreFloors.some((f) => f.floorNumber === this.selectedFloor);
|
|
100
107
|
}
|
|
@@ -103,9 +110,13 @@ export class CreatePlanogramComponent {
|
|
|
103
110
|
}
|
|
104
111
|
}
|
|
105
112
|
onFileChange(file) {
|
|
113
|
+
if (this.isModalBusy)
|
|
114
|
+
return;
|
|
106
115
|
this.selectedFile = file;
|
|
107
116
|
}
|
|
108
117
|
async onCreateLayoutPlano() {
|
|
118
|
+
if (this.isModalBusy)
|
|
119
|
+
return;
|
|
109
120
|
if (!this.isValidToCreatePlano)
|
|
110
121
|
return;
|
|
111
122
|
const hasCadFile = !!this.selectedFile;
|
|
@@ -167,6 +178,8 @@ export class CreatePlanogramComponent {
|
|
|
167
178
|
this.cadProcessingAnimation = undefined;
|
|
168
179
|
}
|
|
169
180
|
async onCreateStore() {
|
|
181
|
+
if (this.isModalBusy)
|
|
182
|
+
return;
|
|
170
183
|
try {
|
|
171
184
|
this.isButtonLoading = true;
|
|
172
185
|
const spocUser = await this.getSpocUserDetails(this.createStoreForm.value.storeName.trim());
|
|
@@ -268,6 +281,8 @@ export class CreatePlanogramComponent {
|
|
|
268
281
|
}
|
|
269
282
|
}
|
|
270
283
|
addNewStore() {
|
|
284
|
+
if (this.isModalBusy)
|
|
285
|
+
return;
|
|
271
286
|
this.createStoreForm = this.fb.group({
|
|
272
287
|
storeName: [
|
|
273
288
|
"",
|
|
@@ -345,7 +360,7 @@ export class CreatePlanogramComponent {
|
|
|
345
360
|
};
|
|
346
361
|
}
|
|
347
362
|
onAddressChange(place) {
|
|
348
|
-
if (!place?.geometry)
|
|
363
|
+
if (this.isModalBusy || !this.createStoreForm || !place?.geometry)
|
|
349
364
|
return;
|
|
350
365
|
let country = "", city = "", state = "", pincode = "";
|
|
351
366
|
let latitude = place.geometry.location.lat();
|
|
@@ -373,9 +388,13 @@ export class CreatePlanogramComponent {
|
|
|
373
388
|
this.createStoreForm.get("longitude")?.setValue(longitude);
|
|
374
389
|
}
|
|
375
390
|
onCancel() {
|
|
391
|
+
if (this.isModalBusy)
|
|
392
|
+
return;
|
|
376
393
|
this.activeModal.dismiss();
|
|
377
394
|
}
|
|
378
395
|
onBack() {
|
|
396
|
+
if (this.isModalBusy)
|
|
397
|
+
return;
|
|
379
398
|
this.isCreateStoreMode = false;
|
|
380
399
|
this.newStoreDetails = null;
|
|
381
400
|
}
|
|
@@ -388,7 +407,7 @@ export class CreatePlanogramComponent {
|
|
|
388
407
|
libraries: ["places"],
|
|
389
408
|
}),
|
|
390
409
|
},
|
|
391
|
-
], viewQueries: [{ propertyName: "cadProcessingLottieRef", first: true, predicate: ["cadProcessingLottie"], descendants: true }], ngImport: i0, template: "<div class=\"modal-wrapper\">\r\n <div *ngIf=\"isPopupLoading\" class=\"modal-loader-overlay\">\r\n <svg class=\"modal-spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </div>\r\n <div *ngIf=\"isCadProcessing\" class=\"cad-loader-overlay\">\r\n <div #cadProcessingLottie class=\"cad-lottie\"></div>\r\n <p class=\"cad-loader-text mb-0\">Creating planogram from CAD...</p>\r\n </div>\r\n\r\n <h3 class=\"mb-3\">Create store layout/plan from CAD</h3>\r\n @if(isCreateStoreMode){\r\n <div class=\"d-flex algn-items-center gap-2\">\r\n <p>Step 1: Onboard store with basic details</p>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n ngbTooltip=\"A new store will be created when you perform this action (Manage > Stores).\">\r\n <path\r\n d=\"M10.0003 13.3337V10.0003M10.0003 6.66699H10.0087M18.3337 10.0003C18.3337 14.6027 14.6027 18.3337 10.0003 18.3337C5.39795 18.3337 1.66699 14.6027 1.66699 10.0003C1.66699 5.39795 5.39795 1.66699 10.0003 1.66699C14.6027 1.66699 18.3337 5.39795 18.3337 10.0003Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n }\r\n\r\n\r\n @if(isCreateStoreMode){\r\n <form [formGroup]=\"createStoreForm\">\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"storeName\" class=\"form-label mb-1\">Store name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"storeName\" formControlName=\"storeName\"\r\n placeholder=\"Type store name. eg: LKST1234\" />\r\n\r\n <ng-container *ngIf=\"createStoreForm.get('storeName')?.touched && createStoreForm.get('storeName')?.invalid\">\r\n\r\n @if(createStoreForm.get('storeName')?.hasError('exists')){\r\n <small class=\"text-danger\">\r\n Store already exists.\r\n </small>\r\n }@else {\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('required')\">\r\n Store name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('whitespace')\">\r\n Store name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('invalidStoreName') \">\r\n Store name must be ST1234 or LKST1234 format.\r\n </small>\r\n }\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\" [label]=\"'Select floor'\"\r\n formControlName=\"floor\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"businessTypeList\"\r\n [label]=\"'Select business type'\" formControlName=\"businessType\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"storeTypeList\"\r\n [label]=\"'Select store type'\" formControlName=\"storeType\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n @if(createStoreForm.get('storeType')?.value == 'Mall Store'){\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"storeTypeName\" class=\"form-label mb-1\">Enter Mall name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"storeTypeName\" formControlName=\"storeTypeName\"\r\n placeholder=\"Enter Mall name\" />\r\n <ng-container\r\n *ngIf=\"createStoreForm.get('storeTypeName')?.touched && createStoreForm.get('storeTypeName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('whitespace')\">\r\n Mall name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n }\r\n\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"address\" class=\"form-label mb-1\">Address</label>\r\n <input type=\"text\" class=\"form-control\" id=\"address\" formControlName=\"address\"\r\n placeholder=\"Search and enter address\" ngx-gp-autocomplete (onAddressChange)=\"onAddressChange($event)\" />\r\n <ng-container *ngIf=\"createStoreForm.get('address')?.touched && createStoreForm.get('address')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('address')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"country\" class=\"form-label mb-1\">Country</label>\r\n <input type=\"text\" class=\"form-control\" id=\"country\" formControlName=\"country\" placeholder=\"Enter Country\" />\r\n <ng-container *ngIf=\"createStoreForm.get('country')?.touched && createStoreForm.get('country')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"state\" class=\"form-label mb-1\">State</label>\r\n <input type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\" placeholder=\"Enter State\" />\r\n <ng-container *ngIf=\"createStoreForm.get('state')?.touched && createStoreForm.get('state')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"city\" class=\"form-label mb-1\">City / Town</label>\r\n <input type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\" placeholder=\"Enter City / Town\" />\r\n <ng-container *ngIf=\"createStoreForm.get('city')?.touched && createStoreForm.get('city')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('city')?.hasError('required')\">\r\n City / Town is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"pincode\" class=\"form-label mb-1\">Pin / Zip Code</label>\r\n <input type=\"text\" class=\"form-control\" id=\"pincode\" formControlName=\"pincode\"\r\n placeholder=\"Enter Pin / Zip Code\" />\r\n <ng-container *ngIf=\"createStoreForm.get('pincode')?.touched && createStoreForm.get('pincode')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('required')\">\r\n Pin / Zip Code is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"createStoreForm.get('pincode')?.hasError('whitespace') || createStoreForm.get('pincode')?.hasError('trimSpaces')\">\r\n Pincode cannot contain whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('invalidPincode')\">\r\n Enter a valid 6-digit pincode\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"email\" class=\"form-label mb-1\">Spoc user email (optional)</label>\r\n <input type=\"text\" class=\"form-control\" id=\"email\" formControlName=\"email\"\r\n placeholder=\"Enter spoc user email\" />\r\n <ng-container *ngIf=\"createStoreForm.get('email')?.touched && createStoreForm.get('email')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('email')?.hasError('email')\">\r\n Email is invalid.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n </form>\r\n }\r\n @else {\r\n @if(newStoreDetails){\r\n <p class=\"mb-6\">Step 2: Add CAD file</p>\r\n\r\n <div class=\"row mb-6\">\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Store name</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.storeName}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Floor</p>\r\n <h3 class=\"new-store-txt\">Floor {{this.selectedFloor}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Business type</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.businessType | uppercase}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Store type</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.storeType?.type | titlecase}}</h3>\r\n </div>\r\n </div>\r\n }@else {\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\r\n <lib-reactive-select [search]=\"true\" [(ngModel)]=\"selectedStore\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"storeList\" [label]=\"'Select store'\" [action]=\"true\" (actionClick)=\"addNewStore()\"\r\n [actionLabel]=\"'Create new store'\" (ngModelChange)=\"onStoreChange()\" [disabled]=\"isButtonLoading\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-reactive-select [(ngModel)]=\"selectedFloor\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\"\r\n [label]=\"'Select floor'\" (ngModelChange)=\"onFloorChange()\" [disabled]=\"isButtonLoading\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"layout-exist-wrapper\" [class.show]=\"isLayoutExist\">\r\n <div class=\"layout-exist-warning mb-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F04438\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n This store already has a Floor {{selectedFloor}} planogram. Overwrite it? This can\u2019t be undone.\r\n </div>\r\n </div>\r\n }\r\n <div class=\"mb-4\">\r\n <div class=\"row\">\r\n <div [ngClass]=\"selectedFile ? 'col-12' :'col-6'\">\r\n <file-upload [disabled]=\"isButtonLoading\" (fileChange)=\"onFileChange($event)\"></file-upload>\r\n </div>\r\n <div [ngClass]=\"selectedFile ? 'd-none' :'col-6'\"\r\n class=\"d-flex flex-column justify-content-center align-items-center gap-3\">\r\n <svg width=\"80\" height=\"80\" viewBox=\"0 0 80 80\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"40\" cy=\"40\" r=\"40\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M55.5008 34.375H51.3752L47.6258 38.1253H42.3752V34.375H31.1252V49.3753H27.3758C26.8785 49.3676 26.3846 49.4589 25.9229 49.6439C25.4612 49.8289 25.0409 50.1039 24.6864 50.4528C24.332 50.8018 24.0506 51.2178 23.8584 51.6766C23.6663 52.1353 23.5674 52.6278 23.5674 53.1251C23.5674 53.6225 23.6663 54.1149 23.8584 54.5737C24.0506 55.0325 24.332 55.4485 24.6864 55.7975C25.0409 56.1464 25.4612 56.4214 25.9229 56.6064C26.3846 56.7914 26.8785 56.8827 27.3758 56.875H55.5008C55.998 56.875 56.4748 56.6775 56.8264 56.3259C57.178 55.9743 57.3755 55.4975 57.3755 55.0003V36.2497C57.3755 35.7525 57.178 35.2757 56.8264 34.9241C56.4748 34.5725 55.998 34.375 55.5008 34.375ZM31.1252 28.75V49.3753H27.3758C26.3813 49.3753 25.4275 49.7703 24.7242 50.4734C24.0209 51.1765 23.6257 52.1302 23.6255 53.1247V32.5003C23.6255 31.5057 24.0206 30.5518 24.7239 29.8484C25.4272 29.1451 26.3811 28.75 27.3758 28.75H31.1252Z\"\r\n fill=\"#D0D5DD\" />\r\n <path\r\n d=\"M31.1252 49.3753V34.375H42.3752V38.1253H47.6258L51.3752 34.375H55.5008C55.998 34.375 56.4748 34.5725 56.8264 34.9241C57.178 35.2757 57.3755 35.7525 57.3755 36.2497V55.0003C57.3755 55.4975 57.178 55.9743 56.8264 56.3259C56.4748 56.6775 55.998 56.875 55.5008 56.875H27.3758C26.8785 56.8827 26.3846 56.7914 25.9229 56.6064C25.4612 56.4214 25.0409 56.1464 24.6864 55.7975C24.332 55.4485 24.0506 55.0325 23.8584 54.5737C23.6663 54.1149 23.5674 53.6225 23.5674 53.1251C23.5674 52.6278 23.6663 52.1353 23.8584 51.6766C24.0506 51.2178 24.332 50.8018 24.6864 50.4528C25.0409 50.1039 25.4612 49.8289 25.9229 49.6439C26.3846 49.4589 26.8785 49.3676 27.3758 49.3753M31.1252 49.3753H27.3758M31.1252 49.3753V28.75H27.3758C26.3811 28.75 25.4272 29.1451 24.7239 29.8484C24.0206 30.5518 23.6255 31.5057 23.6255 32.5003V53.1247C23.6257 52.1302 24.0209 51.1765 24.7242 50.4734C25.4275 49.7703 26.3813 49.3753 27.3758 49.3753\"\r\n stroke=\"#98A2B3\" stroke-width=\"0.84375\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M56.8317 26.293L54.2064 23.6686C53.856 23.3252 53.3849 23.1328 52.8942 23.1328C52.4035 23.1328 51.9324 23.3252 51.582 23.6686L42.375 32.8756V38.1253H47.6256L56.8317 28.9183C57.1751 28.5679 57.3675 28.0968 57.3675 27.6061C57.3675 27.1155 57.1751 26.6434 56.8317 26.293Z\"\r\n fill=\"#33B5FF\" />\r\n </svg>\r\n <div class=\"d-flex gap-1 align-items-center\">\r\n <input [(ngModel)]=\"isManual\" class=\"form-check-input me-3\" type=\"checkbox\" value=\"\" id=\"manual\">\r\n <label for=\"manual\">Create manually</label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <div class=\"modal-actions\">\r\n @if(isCreateStoreMode){\r\n <button type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\">Back</button>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"createStoreForm.invalid\" (click)=\"onCreateStore()\">\r\n <span *ngIf=\"!isButtonLoading\">\r\n Next\r\n </span>\r\n <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }@else {\r\n <button *ngIf=\"newStoreDetails\" type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\">Back</button>\r\n <button *ngIf=\"!newStoreDetails\" type=\"button\" class=\"btn btn-outline me-auto\" (click)=\"addNewStore()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M6.66829 0.834961V12.5016M0.834961 6.66829H12.5016\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n Create new store\r\n </button>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"!isValidToCreatePlano || isButtonLoading\"\r\n (click)=\"onCreateLayoutPlano()\">\r\n <span *ngIf=\"!isButtonLoading\">\r\n {{isLayoutExist ? 'Overwrite' : 'Create'}}\r\n </span>\r\n\r\n <svg *ngIf=\"isButtonLoading && !isCadProcessing\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n", styles: [".modal-wrapper{padding:24px;position:relative;min-height:220px}.modal-loader-overlay{position:absolute;inset:0;z-index:20;display:flex;align-items:center;justify-content:center;background:#ffffffb3;border-radius:12px!important;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.cad-loader-overlay{position:absolute;inset:0;z-index:30;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;border-radius:12px!important;background:#ffffffdb}.cad-lottie{width:220px;height:220px}.cad-loader-text{color:#344054;font-size:14px;font-weight:600}.modal-spinner{width:44px;height:44px;animation:modal-spin .9s linear infinite}.modal-spinner .path{stroke:#344054;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes modal-spin{to{transform:rotate(360deg)}}.modal-actions{display:flex;justify-content:end;gap:12px}::ng-deep .counter-container{padding:10px!important;border:.49px solid #d0d5dd!important;background-color:#fff!important;justify-content:space-between!important;margin-bottom:26px!important}::ng-deep .modal-content{border-radius:12px!important}.layout-exist-warning{display:flex;align-items:center;gap:8px;padding:16px;background:#fef3f2;border:1px solid #fda29b;border-radius:8px;color:#d92d20;font-family:Inter;font-weight:600;font-size:14px;line-height:20px}.layout-exist-wrapper{overflow:hidden;max-height:0;opacity:0;transform:translateY(-8px);transition:max-height .25s ease,opacity .2s ease,transform .2s ease}.layout-exist-wrapper.show{max-height:120px;opacity:1;transform:translateY(0)}::ng-deep .create-planogram-modal .modal-dialog{max-width:700px;width:100%}.new-store-txt{font-weight:500;font-size:16px;line-height:24px;letter-spacing:0%;color:#101828}.btn .spinner{height:22px;width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.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: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "component", type: FileUploadComponent, selector: "file-upload", inputs: ["disabled"], outputs: ["fileChange"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: NgxGpAutocompleteModule }, { kind: "directive", type: i5.NgxGpAutocompleteDirective, selector: "[ngx-gp-autocomplete]", inputs: ["options"], outputs: ["onAddressChange"], exportAs: ["ngx-places"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "pipe", type: UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: TitleCasePipe, name: "titlecase" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
|
|
410
|
+
], viewQueries: [{ propertyName: "cadProcessingLottieRef", first: true, predicate: ["cadProcessingLottie"], descendants: true }], ngImport: i0, template: "<div class=\"modal-wrapper\">\r\n <div *ngIf=\"isPopupLoading\" class=\"modal-loader-overlay\">\r\n <svg class=\"modal-spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </div>\r\n\r\n <h3 class=\"mb-3\">Create store layout/plan from CAD</h3>\r\n @if(isCreateStoreMode){\r\n <div class=\"d-flex algn-items-center gap-2\">\r\n <p>Step 1: Onboard store with basic details</p>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n ngbTooltip=\"A new store will be created when you perform this action (Manage > Stores).\">\r\n <path\r\n d=\"M10.0003 13.3337V10.0003M10.0003 6.66699H10.0087M18.3337 10.0003C18.3337 14.6027 14.6027 18.3337 10.0003 18.3337C5.39795 18.3337 1.66699 14.6027 1.66699 10.0003C1.66699 5.39795 5.39795 1.66699 10.0003 1.66699C14.6027 1.66699 18.3337 5.39795 18.3337 10.0003Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n }\r\n\r\n\r\n @if(isCreateStoreMode){\r\n <form [formGroup]=\"createStoreForm\">\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6 mb-4\">\n <label for=\"storeName\" class=\"form-label mb-1\">Store name</label>\n <input type=\"text\" class=\"form-control\" id=\"storeName\" formControlName=\"storeName\"\n placeholder=\"Type store name. eg: LKST1234\" [disabled]=\"isModalBusy\" />\n\r\n <ng-container *ngIf=\"createStoreForm.get('storeName')?.touched && createStoreForm.get('storeName')?.invalid\">\r\n\r\n @if(createStoreForm.get('storeName')?.hasError('exists')){\r\n <small class=\"text-danger\">\r\n Store already exists.\r\n </small>\r\n }@else {\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('required')\">\r\n Store name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('whitespace')\">\r\n Store name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('invalidStoreName') \">\r\n Store name must be ST1234 or LKST1234 format.\r\n </small>\r\n }\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\" [label]=\"'Select floor'\"\n formControlName=\"floor\" [disabled]=\"isModalBusy\">\n </lib-reactive-select>\n </div>\n\n <div class=\"col-6 mb-4\">\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"businessTypeList\"\n [label]=\"'Select business type'\" formControlName=\"businessType\" [disabled]=\"isModalBusy\">\n </lib-reactive-select>\n </div>\n\n <div class=\"col-6 mb-4\">\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"storeTypeList\"\n [label]=\"'Select store type'\" formControlName=\"storeType\" [disabled]=\"isModalBusy\">\n </lib-reactive-select>\n </div>\n\n @if(createStoreForm.get('storeType')?.value == 'Mall Store'){\n <div class=\"col-12 mb-4\">\n <label for=\"storeTypeName\" class=\"form-label mb-1\">Enter Mall name</label>\n <input type=\"text\" class=\"form-control\" id=\"storeTypeName\" formControlName=\"storeTypeName\"\n placeholder=\"Enter Mall name\" [disabled]=\"isModalBusy\" />\n <ng-container\r\n *ngIf=\"createStoreForm.get('storeTypeName')?.touched && createStoreForm.get('storeTypeName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('whitespace')\">\r\n Mall name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n }\r\n\r\n <div class=\"col-12 mb-4\">\n <label for=\"address\" class=\"form-label mb-1\">Address</label>\n <input type=\"text\" class=\"form-control\" id=\"address\" formControlName=\"address\"\n placeholder=\"Search and enter address\" ngx-gp-autocomplete (onAddressChange)=\"onAddressChange($event)\"\n [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('address')?.touched && createStoreForm.get('address')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('address')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\n <label for=\"country\" class=\"form-label mb-1\">Country</label>\n <input type=\"text\" class=\"form-control\" id=\"country\" formControlName=\"country\" placeholder=\"Enter Country\"\n [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('country')?.touched && createStoreForm.get('country')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\n <label for=\"state\" class=\"form-label mb-1\">State</label>\n <input type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\" placeholder=\"Enter State\"\n [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('state')?.touched && createStoreForm.get('state')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\n <label for=\"city\" class=\"form-label mb-1\">City / Town</label>\n <input type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\" placeholder=\"Enter City / Town\"\n [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('city')?.touched && createStoreForm.get('city')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('city')?.hasError('required')\">\r\n City / Town is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\n <label for=\"pincode\" class=\"form-label mb-1\">Pin / Zip Code</label>\n <input type=\"text\" class=\"form-control\" id=\"pincode\" formControlName=\"pincode\"\n placeholder=\"Enter Pin / Zip Code\" [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('pincode')?.touched && createStoreForm.get('pincode')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('required')\">\r\n Pin / Zip Code is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"createStoreForm.get('pincode')?.hasError('whitespace') || createStoreForm.get('pincode')?.hasError('trimSpaces')\">\r\n Pincode cannot contain whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('invalidPincode')\">\r\n Enter a valid 6-digit pincode\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-12 mb-4\">\n <label for=\"email\" class=\"form-label mb-1\">Spoc user email (optional)</label>\n <input type=\"text\" class=\"form-control\" id=\"email\" formControlName=\"email\"\n placeholder=\"Enter spoc user email\" [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('email')?.touched && createStoreForm.get('email')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('email')?.hasError('email')\">\r\n Email is invalid.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n </form>\r\n }\r\n @else {\r\n @if(newStoreDetails){\r\n <p class=\"mb-6\">Step 2: Add CAD file</p>\r\n\r\n <div class=\"row mb-6\">\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Store name</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.storeName}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Floor</p>\r\n <h3 class=\"new-store-txt\">Floor {{this.selectedFloor}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Business type</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.businessType | uppercase}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Store type</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.storeType?.type | titlecase}}</h3>\r\n </div>\r\n </div>\r\n }@else {\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\n <lib-reactive-select [search]=\"true\" [(ngModel)]=\"selectedStore\" [idField]=\"'value'\" [nameField]=\"'label'\"\n [data]=\"storeList\" [label]=\"'Select store'\" [action]=\"true\" (actionClick)=\"addNewStore()\"\n [actionLabel]=\"'Create new store'\" (ngModelChange)=\"onStoreChange()\" [disabled]=\"isModalBusy\">\n </lib-reactive-select>\n </div>\n <div class=\"col-6\">\n <lib-reactive-select [(ngModel)]=\"selectedFloor\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\"\n [label]=\"'Select floor'\" (ngModelChange)=\"onFloorChange()\" [disabled]=\"isModalBusy\">\n </lib-reactive-select>\n </div>\n </div>\r\n\r\n <div class=\"layout-exist-wrapper\" [class.show]=\"isLayoutExist\">\r\n <div class=\"layout-exist-warning mb-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F04438\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n This store already has a Floor {{selectedFloor}} planogram. Overwrite it? This can\u2019t be undone.\r\n </div>\r\n </div>\r\n }\r\n <div class=\"mb-4\">\r\n @if (isCadProcessing) {\r\n <div class=\"cad-loader-panel\">\r\n <!--\r\n <div #cadProcessingLottie class=\"cad-lottie\"></div>\r\n <p class=\"cad-loader-text mb-0\">Creating planogram from CAD...</p>\r\n -->\r\n <div class=\"cad-loader-content\">\r\n <svg class=\"cad-basic-spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n <p class=\"cad-loader-text mb-0\">\r\n Building layout\r\n <span class=\"loading-dots\" aria-hidden=\"true\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </p>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"row\">\n <div [ngClass]=\"selectedFile ? 'col-12' :'col-6'\">\n <file-upload [disabled]=\"isModalBusy\" (fileChange)=\"onFileChange($event)\"></file-upload>\n </div>\n <div [ngClass]=\"selectedFile ? 'd-none' :'col-6'\"\n class=\"d-flex flex-column justify-content-center align-items-center gap-3\">\n <svg width=\"80\" height=\"80\" viewBox=\"0 0 80 80\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"40\" cy=\"40\" r=\"40\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M55.5008 34.375H51.3752L47.6258 38.1253H42.3752V34.375H31.1252V49.3753H27.3758C26.8785 49.3676 26.3846 49.4589 25.9229 49.6439C25.4612 49.8289 25.0409 50.1039 24.6864 50.4528C24.332 50.8018 24.0506 51.2178 23.8584 51.6766C23.6663 52.1353 23.5674 52.6278 23.5674 53.1251C23.5674 53.6225 23.6663 54.1149 23.8584 54.5737C24.0506 55.0325 24.332 55.4485 24.6864 55.7975C25.0409 56.1464 25.4612 56.4214 25.9229 56.6064C26.3846 56.7914 26.8785 56.8827 27.3758 56.875H55.5008C55.998 56.875 56.4748 56.6775 56.8264 56.3259C57.178 55.9743 57.3755 55.4975 57.3755 55.0003V36.2497C57.3755 35.7525 57.178 35.2757 56.8264 34.9241C56.4748 34.5725 55.998 34.375 55.5008 34.375ZM31.1252 28.75V49.3753H27.3758C26.3813 49.3753 25.4275 49.7703 24.7242 50.4734C24.0209 51.1765 23.6257 52.1302 23.6255 53.1247V32.5003C23.6255 31.5057 24.0206 30.5518 24.7239 29.8484C25.4272 29.1451 26.3811 28.75 27.3758 28.75H31.1252Z\"\r\n fill=\"#D0D5DD\" />\r\n <path\r\n d=\"M31.1252 49.3753V34.375H42.3752V38.1253H47.6258L51.3752 34.375H55.5008C55.998 34.375 56.4748 34.5725 56.8264 34.9241C57.178 35.2757 57.3755 35.7525 57.3755 36.2497V55.0003C57.3755 55.4975 57.178 55.9743 56.8264 56.3259C56.4748 56.6775 55.998 56.875 55.5008 56.875H27.3758C26.8785 56.8827 26.3846 56.7914 25.9229 56.6064C25.4612 56.4214 25.0409 56.1464 24.6864 55.7975C24.332 55.4485 24.0506 55.0325 23.8584 54.5737C23.6663 54.1149 23.5674 53.6225 23.5674 53.1251C23.5674 52.6278 23.6663 52.1353 23.8584 51.6766C24.0506 51.2178 24.332 50.8018 24.6864 50.4528C25.0409 50.1039 25.4612 49.8289 25.9229 49.6439C26.3846 49.4589 26.8785 49.3676 27.3758 49.3753M31.1252 49.3753H27.3758M31.1252 49.3753V28.75H27.3758C26.3811 28.75 25.4272 29.1451 24.7239 29.8484C24.0206 30.5518 23.6255 31.5057 23.6255 32.5003V53.1247C23.6257 52.1302 24.0209 51.1765 24.7242 50.4734C25.4275 49.7703 26.3813 49.3753 27.3758 49.3753\"\r\n stroke=\"#98A2B3\" stroke-width=\"0.84375\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M56.8317 26.293L54.2064 23.6686C53.856 23.3252 53.3849 23.1328 52.8942 23.1328C52.4035 23.1328 51.9324 23.3252 51.582 23.6686L42.375 32.8756V38.1253H47.6256L56.8317 28.9183C57.1751 28.5679 57.3675 28.0968 57.3675 27.6061C57.3675 27.1155 57.1751 26.6434 56.8317 26.293Z\"\r\n fill=\"#33B5FF\" />\r\n </svg>\n <div class=\"d-flex gap-1 align-items-center\">\n <input [(ngModel)]=\"isManual\" class=\"form-check-input me-3\" type=\"checkbox\" value=\"\" id=\"manual\"\n [disabled]=\"isModalBusy\">\n <label for=\"manual\">Create manually</label>\n </div>\n </div>\n </div>\r\n }\r\n </div>\r\n }\r\n <div class=\"modal-actions\">\r\n @if(isCreateStoreMode){\n <button type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\" [disabled]=\"isModalBusy\">Back</button>\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\" [disabled]=\"isModalBusy\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"createStoreForm.invalid || isModalBusy\"\n (click)=\"onCreateStore()\">\n <span *ngIf=\"!isButtonLoading\">\n Next\n </span>\n <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }@else {\n <button *ngIf=\"newStoreDetails\" type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\"\n [disabled]=\"isModalBusy\">Back</button>\n <button *ngIf=\"!newStoreDetails\" type=\"button\" class=\"btn btn-outline me-auto\" (click)=\"addNewStore()\"\n [disabled]=\"isModalBusy\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.66829 0.834961V12.5016M0.834961 6.66829H12.5016\" stroke=\"#344054\" stroke-width=\"1.67\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\r\n\n Create new store\n </button>\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\" [disabled]=\"isModalBusy\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"!isValidToCreatePlano || isModalBusy\"\n (click)=\"onCreateLayoutPlano()\">\n <span *ngIf=\"!isButtonLoading || isCadProcessing\">\n {{isLayoutExist ? 'Overwrite' : 'Create'}}\n </span>\r\n\r\n <svg *ngIf=\"isButtonLoading && !isCadProcessing\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n", styles: [".modal-wrapper{padding:24px;position:relative;min-height:220px}.modal-loader-overlay{position:absolute;inset:0;z-index:20;display:flex;align-items:center;justify-content:center;background:#ffffffb3;border-radius:12px!important;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.cad-loader-panel{border:2px dashed #d7dce1;border-radius:12px;min-height:190px;display:flex;justify-content:center;align-items:center;text-align:center;background:#fff;transition:all .2s ease}.cad-loader-content{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;width:100%;padding:24px}.cad-lottie{width:220px;height:220px}.cad-basic-spinner{width:44px;height:44px;animation:cad-spin .9s linear infinite}.cad-basic-spinner .path{stroke:#344054;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}.cad-loader-text{color:#344054;font-size:14px;font-weight:600;display:flex;align-items:center;justify-content:center}.loading-dots{display:inline-flex;min-width:18px;justify-content:flex-start}.loading-dots span{animation:cad-dot-pulse 1.2s infinite;opacity:.2}.loading-dots span:nth-child(2){animation-delay:.2s}.loading-dots span:nth-child(3){animation-delay:.4s}.modal-spinner{width:44px;height:44px;animation:modal-spin .9s linear infinite}.modal-spinner .path{stroke:#344054;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes modal-spin{to{transform:rotate(360deg)}}@keyframes cad-spin{to{transform:rotate(360deg)}}@keyframes cad-dot-pulse{0%,80%,to{opacity:.2}40%{opacity:1}}.modal-actions{display:flex;justify-content:end;gap:12px}::ng-deep .counter-container{padding:10px!important;border:.49px solid #d0d5dd!important;background-color:#fff!important;justify-content:space-between!important;margin-bottom:26px!important}::ng-deep .modal-content{border-radius:12px!important}.layout-exist-warning{display:flex;align-items:center;gap:8px;padding:16px;background:#fef3f2;border:1px solid #fda29b;border-radius:8px;color:#d92d20;font-family:Inter;font-weight:600;font-size:14px;line-height:20px}.layout-exist-wrapper{overflow:hidden;max-height:0;opacity:0;transform:translateY(-8px);transition:max-height .25s ease,opacity .2s ease,transform .2s ease}.layout-exist-wrapper.show{max-height:120px;opacity:1;transform:translateY(0)}::ng-deep .create-planogram-modal .modal-dialog{max-width:700px;width:100%}.new-store-txt{font-weight:500;font-size:16px;line-height:24px;letter-spacing:0%;color:#101828}.btn .spinner{height:22px;width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.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: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i4.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "component", type: ReactiveSelectComponent, selector: "lib-reactive-select", inputs: ["idField", "nameField", "subTextField", "searchField", "label", "data", "action", "search", "prefix", "actionLabel"], outputs: ["actionClick"] }, { kind: "component", type: FileUploadComponent, selector: "file-upload", inputs: ["disabled"], outputs: ["fileChange"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: NgxGpAutocompleteModule }, { kind: "directive", type: i5.NgxGpAutocompleteDirective, selector: "[ngx-gp-autocomplete]", inputs: ["options"], outputs: ["onAddressChange"], exportAs: ["ngx-places"] }, { kind: "directive", type: NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "pipe", type: UpperCasePipe, name: "uppercase" }, { kind: "pipe", type: TitleCasePipe, name: "titlecase" }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }] });
|
|
392
411
|
}
|
|
393
412
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: CreatePlanogramComponent, decorators: [{
|
|
394
413
|
type: Component,
|
|
@@ -411,11 +430,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
411
430
|
libraries: ["places"],
|
|
412
431
|
}),
|
|
413
432
|
},
|
|
414
|
-
], template: "<div class=\"modal-wrapper\">\r\n <div *ngIf=\"isPopupLoading\" class=\"modal-loader-overlay\">\r\n <svg class=\"modal-spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </div>\r\n <div *ngIf=\"isCadProcessing\" class=\"cad-loader-overlay\">\r\n <div #cadProcessingLottie class=\"cad-lottie\"></div>\r\n <p class=\"cad-loader-text mb-0\">Creating planogram from CAD...</p>\r\n </div>\r\n\r\n <h3 class=\"mb-3\">Create store layout/plan from CAD</h3>\r\n @if(isCreateStoreMode){\r\n <div class=\"d-flex algn-items-center gap-2\">\r\n <p>Step 1: Onboard store with basic details</p>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n ngbTooltip=\"A new store will be created when you perform this action (Manage > Stores).\">\r\n <path\r\n d=\"M10.0003 13.3337V10.0003M10.0003 6.66699H10.0087M18.3337 10.0003C18.3337 14.6027 14.6027 18.3337 10.0003 18.3337C5.39795 18.3337 1.66699 14.6027 1.66699 10.0003C1.66699 5.39795 5.39795 1.66699 10.0003 1.66699C14.6027 1.66699 18.3337 5.39795 18.3337 10.0003Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n }\r\n\r\n\r\n @if(isCreateStoreMode){\r\n <form [formGroup]=\"createStoreForm\">\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"storeName\" class=\"form-label mb-1\">Store name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"storeName\" formControlName=\"storeName\"\r\n placeholder=\"Type store name. eg: LKST1234\" />\r\n\r\n <ng-container *ngIf=\"createStoreForm.get('storeName')?.touched && createStoreForm.get('storeName')?.invalid\">\r\n\r\n @if(createStoreForm.get('storeName')?.hasError('exists')){\r\n <small class=\"text-danger\">\r\n Store already exists.\r\n </small>\r\n }@else {\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('required')\">\r\n Store name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('whitespace')\">\r\n Store name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('invalidStoreName') \">\r\n Store name must be ST1234 or LKST1234 format.\r\n </small>\r\n }\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\" [label]=\"'Select floor'\"\r\n formControlName=\"floor\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"businessTypeList\"\r\n [label]=\"'Select business type'\" formControlName=\"businessType\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"storeTypeList\"\r\n [label]=\"'Select store type'\" formControlName=\"storeType\">\r\n </lib-reactive-select>\r\n </div>\r\n\r\n @if(createStoreForm.get('storeType')?.value == 'Mall Store'){\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"storeTypeName\" class=\"form-label mb-1\">Enter Mall name</label>\r\n <input type=\"text\" class=\"form-control\" id=\"storeTypeName\" formControlName=\"storeTypeName\"\r\n placeholder=\"Enter Mall name\" />\r\n <ng-container\r\n *ngIf=\"createStoreForm.get('storeTypeName')?.touched && createStoreForm.get('storeTypeName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('whitespace')\">\r\n Mall name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n }\r\n\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"address\" class=\"form-label mb-1\">Address</label>\r\n <input type=\"text\" class=\"form-control\" id=\"address\" formControlName=\"address\"\r\n placeholder=\"Search and enter address\" ngx-gp-autocomplete (onAddressChange)=\"onAddressChange($event)\" />\r\n <ng-container *ngIf=\"createStoreForm.get('address')?.touched && createStoreForm.get('address')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('address')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"country\" class=\"form-label mb-1\">Country</label>\r\n <input type=\"text\" class=\"form-control\" id=\"country\" formControlName=\"country\" placeholder=\"Enter Country\" />\r\n <ng-container *ngIf=\"createStoreForm.get('country')?.touched && createStoreForm.get('country')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"state\" class=\"form-label mb-1\">State</label>\r\n <input type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\" placeholder=\"Enter State\" />\r\n <ng-container *ngIf=\"createStoreForm.get('state')?.touched && createStoreForm.get('state')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"city\" class=\"form-label mb-1\">City / Town</label>\r\n <input type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\" placeholder=\"Enter City / Town\" />\r\n <ng-container *ngIf=\"createStoreForm.get('city')?.touched && createStoreForm.get('city')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('city')?.hasError('required')\">\r\n City / Town is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\r\n <label for=\"pincode\" class=\"form-label mb-1\">Pin / Zip Code</label>\r\n <input type=\"text\" class=\"form-control\" id=\"pincode\" formControlName=\"pincode\"\r\n placeholder=\"Enter Pin / Zip Code\" />\r\n <ng-container *ngIf=\"createStoreForm.get('pincode')?.touched && createStoreForm.get('pincode')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('required')\">\r\n Pin / Zip Code is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"createStoreForm.get('pincode')?.hasError('whitespace') || createStoreForm.get('pincode')?.hasError('trimSpaces')\">\r\n Pincode cannot contain whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('invalidPincode')\">\r\n Enter a valid 6-digit pincode\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-12 mb-4\">\r\n <label for=\"email\" class=\"form-label mb-1\">Spoc user email (optional)</label>\r\n <input type=\"text\" class=\"form-control\" id=\"email\" formControlName=\"email\"\r\n placeholder=\"Enter spoc user email\" />\r\n <ng-container *ngIf=\"createStoreForm.get('email')?.touched && createStoreForm.get('email')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('email')?.hasError('email')\">\r\n Email is invalid.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n </form>\r\n }\r\n @else {\r\n @if(newStoreDetails){\r\n <p class=\"mb-6\">Step 2: Add CAD file</p>\r\n\r\n <div class=\"row mb-6\">\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Store name</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.storeName}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Floor</p>\r\n <h3 class=\"new-store-txt\">Floor {{this.selectedFloor}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Business type</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.businessType | uppercase}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Store type</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.storeType?.type | titlecase}}</h3>\r\n </div>\r\n </div>\r\n }@else {\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\r\n <lib-reactive-select [search]=\"true\" [(ngModel)]=\"selectedStore\" [idField]=\"'value'\" [nameField]=\"'label'\"\r\n [data]=\"storeList\" [label]=\"'Select store'\" [action]=\"true\" (actionClick)=\"addNewStore()\"\r\n [actionLabel]=\"'Create new store'\" (ngModelChange)=\"onStoreChange()\" [disabled]=\"isButtonLoading\">\r\n </lib-reactive-select>\r\n </div>\r\n <div class=\"col-6\">\r\n <lib-reactive-select [(ngModel)]=\"selectedFloor\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\"\r\n [label]=\"'Select floor'\" (ngModelChange)=\"onFloorChange()\" [disabled]=\"isButtonLoading\">\r\n </lib-reactive-select>\r\n </div>\r\n </div>\r\n\r\n <div class=\"layout-exist-wrapper\" [class.show]=\"isLayoutExist\">\r\n <div class=\"layout-exist-warning mb-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F04438\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n This store already has a Floor {{selectedFloor}} planogram. Overwrite it? This can\u2019t be undone.\r\n </div>\r\n </div>\r\n }\r\n <div class=\"mb-4\">\r\n <div class=\"row\">\r\n <div [ngClass]=\"selectedFile ? 'col-12' :'col-6'\">\r\n <file-upload [disabled]=\"isButtonLoading\" (fileChange)=\"onFileChange($event)\"></file-upload>\r\n </div>\r\n <div [ngClass]=\"selectedFile ? 'd-none' :'col-6'\"\r\n class=\"d-flex flex-column justify-content-center align-items-center gap-3\">\r\n <svg width=\"80\" height=\"80\" viewBox=\"0 0 80 80\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"40\" cy=\"40\" r=\"40\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M55.5008 34.375H51.3752L47.6258 38.1253H42.3752V34.375H31.1252V49.3753H27.3758C26.8785 49.3676 26.3846 49.4589 25.9229 49.6439C25.4612 49.8289 25.0409 50.1039 24.6864 50.4528C24.332 50.8018 24.0506 51.2178 23.8584 51.6766C23.6663 52.1353 23.5674 52.6278 23.5674 53.1251C23.5674 53.6225 23.6663 54.1149 23.8584 54.5737C24.0506 55.0325 24.332 55.4485 24.6864 55.7975C25.0409 56.1464 25.4612 56.4214 25.9229 56.6064C26.3846 56.7914 26.8785 56.8827 27.3758 56.875H55.5008C55.998 56.875 56.4748 56.6775 56.8264 56.3259C57.178 55.9743 57.3755 55.4975 57.3755 55.0003V36.2497C57.3755 35.7525 57.178 35.2757 56.8264 34.9241C56.4748 34.5725 55.998 34.375 55.5008 34.375ZM31.1252 28.75V49.3753H27.3758C26.3813 49.3753 25.4275 49.7703 24.7242 50.4734C24.0209 51.1765 23.6257 52.1302 23.6255 53.1247V32.5003C23.6255 31.5057 24.0206 30.5518 24.7239 29.8484C25.4272 29.1451 26.3811 28.75 27.3758 28.75H31.1252Z\"\r\n fill=\"#D0D5DD\" />\r\n <path\r\n d=\"M31.1252 49.3753V34.375H42.3752V38.1253H47.6258L51.3752 34.375H55.5008C55.998 34.375 56.4748 34.5725 56.8264 34.9241C57.178 35.2757 57.3755 35.7525 57.3755 36.2497V55.0003C57.3755 55.4975 57.178 55.9743 56.8264 56.3259C56.4748 56.6775 55.998 56.875 55.5008 56.875H27.3758C26.8785 56.8827 26.3846 56.7914 25.9229 56.6064C25.4612 56.4214 25.0409 56.1464 24.6864 55.7975C24.332 55.4485 24.0506 55.0325 23.8584 54.5737C23.6663 54.1149 23.5674 53.6225 23.5674 53.1251C23.5674 52.6278 23.6663 52.1353 23.8584 51.6766C24.0506 51.2178 24.332 50.8018 24.6864 50.4528C25.0409 50.1039 25.4612 49.8289 25.9229 49.6439C26.3846 49.4589 26.8785 49.3676 27.3758 49.3753M31.1252 49.3753H27.3758M31.1252 49.3753V28.75H27.3758C26.3811 28.75 25.4272 29.1451 24.7239 29.8484C24.0206 30.5518 23.6255 31.5057 23.6255 32.5003V53.1247C23.6257 52.1302 24.0209 51.1765 24.7242 50.4734C25.4275 49.7703 26.3813 49.3753 27.3758 49.3753\"\r\n stroke=\"#98A2B3\" stroke-width=\"0.84375\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M56.8317 26.293L54.2064 23.6686C53.856 23.3252 53.3849 23.1328 52.8942 23.1328C52.4035 23.1328 51.9324 23.3252 51.582 23.6686L42.375 32.8756V38.1253H47.6256L56.8317 28.9183C57.1751 28.5679 57.3675 28.0968 57.3675 27.6061C57.3675 27.1155 57.1751 26.6434 56.8317 26.293Z\"\r\n fill=\"#33B5FF\" />\r\n </svg>\r\n <div class=\"d-flex gap-1 align-items-center\">\r\n <input [(ngModel)]=\"isManual\" class=\"form-check-input me-3\" type=\"checkbox\" value=\"\" id=\"manual\">\r\n <label for=\"manual\">Create manually</label>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n <div class=\"modal-actions\">\r\n @if(isCreateStoreMode){\r\n <button type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\">Back</button>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"createStoreForm.invalid\" (click)=\"onCreateStore()\">\r\n <span *ngIf=\"!isButtonLoading\">\r\n Next\r\n </span>\r\n <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }@else {\r\n <button *ngIf=\"newStoreDetails\" type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\">Back</button>\r\n <button *ngIf=\"!newStoreDetails\" type=\"button\" class=\"btn btn-outline me-auto\" (click)=\"addNewStore()\">\r\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M6.66829 0.834961V12.5016M0.834961 6.66829H12.5016\" stroke=\"#344054\" stroke-width=\"1.67\"\r\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n Create new store\r\n </button>\r\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"!isValidToCreatePlano || isButtonLoading\"\r\n (click)=\"onCreateLayoutPlano()\">\r\n <span *ngIf=\"!isButtonLoading\">\r\n {{isLayoutExist ? 'Overwrite' : 'Create'}}\r\n </span>\r\n\r\n <svg *ngIf=\"isButtonLoading && !isCadProcessing\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n", styles: [".modal-wrapper{padding:24px;position:relative;min-height:220px}.modal-loader-overlay{position:absolute;inset:0;z-index:20;display:flex;align-items:center;justify-content:center;background:#ffffffb3;border-radius:12px!important;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.cad-loader-overlay{position:absolute;inset:0;z-index:30;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;border-radius:12px!important;background:#ffffffdb}.cad-lottie{width:220px;height:220px}.cad-loader-text{color:#344054;font-size:14px;font-weight:600}.modal-spinner{width:44px;height:44px;animation:modal-spin .9s linear infinite}.modal-spinner .path{stroke:#344054;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes modal-spin{to{transform:rotate(360deg)}}.modal-actions{display:flex;justify-content:end;gap:12px}::ng-deep .counter-container{padding:10px!important;border:.49px solid #d0d5dd!important;background-color:#fff!important;justify-content:space-between!important;margin-bottom:26px!important}::ng-deep .modal-content{border-radius:12px!important}.layout-exist-warning{display:flex;align-items:center;gap:8px;padding:16px;background:#fef3f2;border:1px solid #fda29b;border-radius:8px;color:#d92d20;font-family:Inter;font-weight:600;font-size:14px;line-height:20px}.layout-exist-wrapper{overflow:hidden;max-height:0;opacity:0;transform:translateY(-8px);transition:max-height .25s ease,opacity .2s ease,transform .2s ease}.layout-exist-wrapper.show{max-height:120px;opacity:1;transform:translateY(0)}::ng-deep .create-planogram-modal .modal-dialog{max-width:700px;width:100%}.new-store-txt{font-weight:500;font-size:16px;line-height:24px;letter-spacing:0%;color:#101828}.btn .spinner{height:22px;width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
|
|
433
|
+
], template: "<div class=\"modal-wrapper\">\r\n <div *ngIf=\"isPopupLoading\" class=\"modal-loader-overlay\">\r\n <svg class=\"modal-spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </div>\r\n\r\n <h3 class=\"mb-3\">Create store layout/plan from CAD</h3>\r\n @if(isCreateStoreMode){\r\n <div class=\"d-flex algn-items-center gap-2\">\r\n <p>Step 1: Onboard store with basic details</p>\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\r\n ngbTooltip=\"A new store will be created when you perform this action (Manage > Stores).\">\r\n <path\r\n d=\"M10.0003 13.3337V10.0003M10.0003 6.66699H10.0087M18.3337 10.0003C18.3337 14.6027 14.6027 18.3337 10.0003 18.3337C5.39795 18.3337 1.66699 14.6027 1.66699 10.0003C1.66699 5.39795 5.39795 1.66699 10.0003 1.66699C14.6027 1.66699 18.3337 5.39795 18.3337 10.0003Z\"\r\n stroke=\"#101828\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </div>\r\n }\r\n\r\n\r\n @if(isCreateStoreMode){\r\n <form [formGroup]=\"createStoreForm\">\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6 mb-4\">\n <label for=\"storeName\" class=\"form-label mb-1\">Store name</label>\n <input type=\"text\" class=\"form-control\" id=\"storeName\" formControlName=\"storeName\"\n placeholder=\"Type store name. eg: LKST1234\" [disabled]=\"isModalBusy\" />\n\r\n <ng-container *ngIf=\"createStoreForm.get('storeName')?.touched && createStoreForm.get('storeName')?.invalid\">\r\n\r\n @if(createStoreForm.get('storeName')?.hasError('exists')){\r\n <small class=\"text-danger\">\r\n Store already exists.\r\n </small>\r\n }@else {\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('required')\">\r\n Store name is required.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('whitespace')\">\r\n Store name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeName')?.hasError('invalidStoreName') \">\r\n Store name must be ST1234 or LKST1234 format.\r\n </small>\r\n }\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\" [label]=\"'Select floor'\"\n formControlName=\"floor\" [disabled]=\"isModalBusy\">\n </lib-reactive-select>\n </div>\n\n <div class=\"col-6 mb-4\">\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"businessTypeList\"\n [label]=\"'Select business type'\" formControlName=\"businessType\" [disabled]=\"isModalBusy\">\n </lib-reactive-select>\n </div>\n\n <div class=\"col-6 mb-4\">\n <lib-reactive-select [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"storeTypeList\"\n [label]=\"'Select store type'\" formControlName=\"storeType\" [disabled]=\"isModalBusy\">\n </lib-reactive-select>\n </div>\n\n @if(createStoreForm.get('storeType')?.value == 'Mall Store'){\n <div class=\"col-12 mb-4\">\n <label for=\"storeTypeName\" class=\"form-label mb-1\">Enter Mall name</label>\n <input type=\"text\" class=\"form-control\" id=\"storeTypeName\" formControlName=\"storeTypeName\"\n placeholder=\"Enter Mall name\" [disabled]=\"isModalBusy\" />\n <ng-container\r\n *ngIf=\"createStoreForm.get('storeTypeName')?.touched && createStoreForm.get('storeTypeName')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('whitespace')\">\r\n Mall name cannot be only whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('storeTypeName')?.hasError('trimSpaces')\">\r\n No leading or trailing whitespace allowed.\r\n </small>\r\n </ng-container>\r\n </div>\r\n }\r\n\r\n <div class=\"col-12 mb-4\">\n <label for=\"address\" class=\"form-label mb-1\">Address</label>\n <input type=\"text\" class=\"form-control\" id=\"address\" formControlName=\"address\"\n placeholder=\"Search and enter address\" ngx-gp-autocomplete (onAddressChange)=\"onAddressChange($event)\"\n [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('address')?.touched && createStoreForm.get('address')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('address')?.hasError('required')\">\r\n Address is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\n <label for=\"country\" class=\"form-label mb-1\">Country</label>\n <input type=\"text\" class=\"form-control\" id=\"country\" formControlName=\"country\" placeholder=\"Enter Country\"\n [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('country')?.touched && createStoreForm.get('country')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('country')?.hasError('required')\">\r\n Country is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\n <label for=\"state\" class=\"form-label mb-1\">State</label>\n <input type=\"text\" class=\"form-control\" id=\"state\" formControlName=\"state\" placeholder=\"Enter State\"\n [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('state')?.touched && createStoreForm.get('state')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('state')?.hasError('required')\">\r\n State is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\n <label for=\"city\" class=\"form-label mb-1\">City / Town</label>\n <input type=\"text\" class=\"form-control\" id=\"city\" formControlName=\"city\" placeholder=\"Enter City / Town\"\n [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('city')?.touched && createStoreForm.get('city')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('city')?.hasError('required')\">\r\n City / Town is required.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-6 mb-4\">\n <label for=\"pincode\" class=\"form-label mb-1\">Pin / Zip Code</label>\n <input type=\"text\" class=\"form-control\" id=\"pincode\" formControlName=\"pincode\"\n placeholder=\"Enter Pin / Zip Code\" [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('pincode')?.touched && createStoreForm.get('pincode')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('required')\">\r\n Pin / Zip Code is required.\r\n </small>\r\n <small class=\"text-danger\"\r\n *ngIf=\"createStoreForm.get('pincode')?.hasError('whitespace') || createStoreForm.get('pincode')?.hasError('trimSpaces')\">\r\n Pincode cannot contain whitespace.\r\n </small>\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('pincode')?.hasError('invalidPincode')\">\r\n Enter a valid 6-digit pincode\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n <div class=\"col-12 mb-4\">\n <label for=\"email\" class=\"form-label mb-1\">Spoc user email (optional)</label>\n <input type=\"text\" class=\"form-control\" id=\"email\" formControlName=\"email\"\n placeholder=\"Enter spoc user email\" [disabled]=\"isModalBusy\" />\n <ng-container *ngIf=\"createStoreForm.get('email')?.touched && createStoreForm.get('email')?.invalid\">\r\n <small class=\"text-danger\" *ngIf=\"createStoreForm.get('email')?.hasError('email')\">\r\n Email is invalid.\r\n </small>\r\n </ng-container>\r\n </div>\r\n\r\n </div>\r\n </form>\r\n }\r\n @else {\r\n @if(newStoreDetails){\r\n <p class=\"mb-6\">Step 2: Add CAD file</p>\r\n\r\n <div class=\"row mb-6\">\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Store name</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.storeName}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Floor</p>\r\n <h3 class=\"new-store-txt\">Floor {{this.selectedFloor}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Business type</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.businessType | uppercase}}</h3>\r\n </div>\r\n <div class=\"col\">\r\n <p class=\"mb-2\">Store type</p>\r\n <h3 class=\"new-store-txt\">{{newStoreDetails?.storeType?.type | titlecase}}</h3>\r\n </div>\r\n </div>\r\n }@else {\r\n <div class=\"row mb-4\">\r\n <div class=\"col-6\">\n <lib-reactive-select [search]=\"true\" [(ngModel)]=\"selectedStore\" [idField]=\"'value'\" [nameField]=\"'label'\"\n [data]=\"storeList\" [label]=\"'Select store'\" [action]=\"true\" (actionClick)=\"addNewStore()\"\n [actionLabel]=\"'Create new store'\" (ngModelChange)=\"onStoreChange()\" [disabled]=\"isModalBusy\">\n </lib-reactive-select>\n </div>\n <div class=\"col-6\">\n <lib-reactive-select [(ngModel)]=\"selectedFloor\" [idField]=\"'value'\" [nameField]=\"'label'\" [data]=\"floorList\"\n [label]=\"'Select floor'\" (ngModelChange)=\"onFloorChange()\" [disabled]=\"isModalBusy\">\n </lib-reactive-select>\n </div>\n </div>\r\n\r\n <div class=\"layout-exist-wrapper\" [class.show]=\"isLayoutExist\">\r\n <div class=\"layout-exist-warning mb-4\">\r\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 20 20\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M9.99965 6.66667V10M9.99965 13.3333H10.008M8.57465 2.38334L1.51632 14.1667C1.37079 14.4187 1.29379 14.7044 1.29298 14.9954C1.29216 15.2865 1.36756 15.5726 1.51167 15.8254C1.65579 16.0783 1.86359 16.289 2.11441 16.4366C2.36523 16.5841 2.65032 16.6635 2.94132 16.6667H17.058C17.349 16.6635 17.6341 16.5841 17.8849 16.4366C18.1357 16.289 18.3435 16.0783 18.4876 15.8254C18.6317 15.5726 18.7071 15.2865 18.7063 14.9954C18.7055 14.7044 18.6285 14.4187 18.483 14.1667L11.4247 2.38334C11.2761 2.13843 11.0669 1.93594 10.8173 1.79541C10.5677 1.65488 10.2861 1.58105 9.99965 1.58105C9.71321 1.58105 9.43159 1.65488 9.18199 1.79541C8.93238 1.93594 8.72321 2.13843 8.57465 2.38334Z\"\r\n stroke=\"#F04438\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n\r\n This store already has a Floor {{selectedFloor}} planogram. Overwrite it? This can\u2019t be undone.\r\n </div>\r\n </div>\r\n }\r\n <div class=\"mb-4\">\r\n @if (isCadProcessing) {\r\n <div class=\"cad-loader-panel\">\r\n <!--\r\n <div #cadProcessingLottie class=\"cad-lottie\"></div>\r\n <p class=\"cad-loader-text mb-0\">Creating planogram from CAD...</p>\r\n -->\r\n <div class=\"cad-loader-content\">\r\n <svg class=\"cad-basic-spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n <p class=\"cad-loader-text mb-0\">\r\n Building layout\r\n <span class=\"loading-dots\" aria-hidden=\"true\">\r\n <span>.</span>\r\n <span>.</span>\r\n <span>.</span>\r\n </span>\r\n </p>\r\n </div>\r\n </div>\r\n } @else {\r\n <div class=\"row\">\n <div [ngClass]=\"selectedFile ? 'col-12' :'col-6'\">\n <file-upload [disabled]=\"isModalBusy\" (fileChange)=\"onFileChange($event)\"></file-upload>\n </div>\n <div [ngClass]=\"selectedFile ? 'd-none' :'col-6'\"\n class=\"d-flex flex-column justify-content-center align-items-center gap-3\">\n <svg width=\"80\" height=\"80\" viewBox=\"0 0 80 80\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <circle cx=\"40\" cy=\"40\" r=\"40\" fill=\"#EAF8FF\" />\r\n <path\r\n d=\"M55.5008 34.375H51.3752L47.6258 38.1253H42.3752V34.375H31.1252V49.3753H27.3758C26.8785 49.3676 26.3846 49.4589 25.9229 49.6439C25.4612 49.8289 25.0409 50.1039 24.6864 50.4528C24.332 50.8018 24.0506 51.2178 23.8584 51.6766C23.6663 52.1353 23.5674 52.6278 23.5674 53.1251C23.5674 53.6225 23.6663 54.1149 23.8584 54.5737C24.0506 55.0325 24.332 55.4485 24.6864 55.7975C25.0409 56.1464 25.4612 56.4214 25.9229 56.6064C26.3846 56.7914 26.8785 56.8827 27.3758 56.875H55.5008C55.998 56.875 56.4748 56.6775 56.8264 56.3259C57.178 55.9743 57.3755 55.4975 57.3755 55.0003V36.2497C57.3755 35.7525 57.178 35.2757 56.8264 34.9241C56.4748 34.5725 55.998 34.375 55.5008 34.375ZM31.1252 28.75V49.3753H27.3758C26.3813 49.3753 25.4275 49.7703 24.7242 50.4734C24.0209 51.1765 23.6257 52.1302 23.6255 53.1247V32.5003C23.6255 31.5057 24.0206 30.5518 24.7239 29.8484C25.4272 29.1451 26.3811 28.75 27.3758 28.75H31.1252Z\"\r\n fill=\"#D0D5DD\" />\r\n <path\r\n d=\"M31.1252 49.3753V34.375H42.3752V38.1253H47.6258L51.3752 34.375H55.5008C55.998 34.375 56.4748 34.5725 56.8264 34.9241C57.178 35.2757 57.3755 35.7525 57.3755 36.2497V55.0003C57.3755 55.4975 57.178 55.9743 56.8264 56.3259C56.4748 56.6775 55.998 56.875 55.5008 56.875H27.3758C26.8785 56.8827 26.3846 56.7914 25.9229 56.6064C25.4612 56.4214 25.0409 56.1464 24.6864 55.7975C24.332 55.4485 24.0506 55.0325 23.8584 54.5737C23.6663 54.1149 23.5674 53.6225 23.5674 53.1251C23.5674 52.6278 23.6663 52.1353 23.8584 51.6766C24.0506 51.2178 24.332 50.8018 24.6864 50.4528C25.0409 50.1039 25.4612 49.8289 25.9229 49.6439C26.3846 49.4589 26.8785 49.3676 27.3758 49.3753M31.1252 49.3753H27.3758M31.1252 49.3753V28.75H27.3758C26.3811 28.75 25.4272 29.1451 24.7239 29.8484C24.0206 30.5518 23.6255 31.5057 23.6255 32.5003V53.1247C23.6257 52.1302 24.0209 51.1765 24.7242 50.4734C25.4275 49.7703 26.3813 49.3753 27.3758 49.3753\"\r\n stroke=\"#98A2B3\" stroke-width=\"0.84375\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path\r\n d=\"M56.8317 26.293L54.2064 23.6686C53.856 23.3252 53.3849 23.1328 52.8942 23.1328C52.4035 23.1328 51.9324 23.3252 51.582 23.6686L42.375 32.8756V38.1253H47.6256L56.8317 28.9183C57.1751 28.5679 57.3675 28.0968 57.3675 27.6061C57.3675 27.1155 57.1751 26.6434 56.8317 26.293Z\"\r\n fill=\"#33B5FF\" />\r\n </svg>\n <div class=\"d-flex gap-1 align-items-center\">\n <input [(ngModel)]=\"isManual\" class=\"form-check-input me-3\" type=\"checkbox\" value=\"\" id=\"manual\"\n [disabled]=\"isModalBusy\">\n <label for=\"manual\">Create manually</label>\n </div>\n </div>\n </div>\r\n }\r\n </div>\r\n }\r\n <div class=\"modal-actions\">\r\n @if(isCreateStoreMode){\n <button type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\" [disabled]=\"isModalBusy\">Back</button>\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\" [disabled]=\"isModalBusy\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"createStoreForm.invalid || isModalBusy\"\n (click)=\"onCreateStore()\">\n <span *ngIf=\"!isButtonLoading\">\n Next\n </span>\n <svg *ngIf=\"isButtonLoading\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }@else {\n <button *ngIf=\"newStoreDetails\" type=\"button\" class=\"btn btn-link me-auto\" (click)=\"onBack()\"\n [disabled]=\"isModalBusy\">Back</button>\n <button *ngIf=\"!newStoreDetails\" type=\"button\" class=\"btn btn-outline me-auto\" (click)=\"addNewStore()\"\n [disabled]=\"isModalBusy\">\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 14 14\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M6.66829 0.834961V12.5016M0.834961 6.66829H12.5016\" stroke=\"#344054\" stroke-width=\"1.67\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" />\n </svg>\r\n\n Create new store\n </button>\n <button type=\"button\" class=\"btn btn-outline\" (click)=\"onCancel()\" [disabled]=\"isModalBusy\">Cancel</button>\n <button type=\"button\" class=\"btn btn-primary \" [disabled]=\"!isValidToCreatePlano || isModalBusy\"\n (click)=\"onCreateLayoutPlano()\">\n <span *ngIf=\"!isButtonLoading || isCadProcessing\">\n {{isLayoutExist ? 'Overwrite' : 'Create'}}\n </span>\r\n\r\n <svg *ngIf=\"isButtonLoading && !isCadProcessing\" class=\"spinner\" viewBox=\"0 0 50 50\">\r\n <circle class=\"path\" cx=\"25\" cy=\"25\" r=\"20\" fill=\"none\" stroke-width=\"4\"></circle>\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n</div>\r\n", styles: [".modal-wrapper{padding:24px;position:relative;min-height:220px}.modal-loader-overlay{position:absolute;inset:0;z-index:20;display:flex;align-items:center;justify-content:center;background:#ffffffb3;border-radius:12px!important;-webkit-backdrop-filter:blur(1px);backdrop-filter:blur(1px)}.cad-loader-panel{border:2px dashed #d7dce1;border-radius:12px;min-height:190px;display:flex;justify-content:center;align-items:center;text-align:center;background:#fff;transition:all .2s ease}.cad-loader-content{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;width:100%;padding:24px}.cad-lottie{width:220px;height:220px}.cad-basic-spinner{width:44px;height:44px;animation:cad-spin .9s linear infinite}.cad-basic-spinner .path{stroke:#344054;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}.cad-loader-text{color:#344054;font-size:14px;font-weight:600;display:flex;align-items:center;justify-content:center}.loading-dots{display:inline-flex;min-width:18px;justify-content:flex-start}.loading-dots span{animation:cad-dot-pulse 1.2s infinite;opacity:.2}.loading-dots span:nth-child(2){animation-delay:.2s}.loading-dots span:nth-child(3){animation-delay:.4s}.modal-spinner{width:44px;height:44px;animation:modal-spin .9s linear infinite}.modal-spinner .path{stroke:#344054;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes modal-spin{to{transform:rotate(360deg)}}@keyframes cad-spin{to{transform:rotate(360deg)}}@keyframes cad-dot-pulse{0%,80%,to{opacity:.2}40%{opacity:1}}.modal-actions{display:flex;justify-content:end;gap:12px}::ng-deep .counter-container{padding:10px!important;border:.49px solid #d0d5dd!important;background-color:#fff!important;justify-content:space-between!important;margin-bottom:26px!important}::ng-deep .modal-content{border-radius:12px!important}.layout-exist-warning{display:flex;align-items:center;gap:8px;padding:16px;background:#fef3f2;border:1px solid #fda29b;border-radius:8px;color:#d92d20;font-family:Inter;font-weight:600;font-size:14px;line-height:20px}.layout-exist-wrapper{overflow:hidden;max-height:0;opacity:0;transform:translateY(-8px);transition:max-height .25s ease,opacity .2s ease,transform .2s ease}.layout-exist-wrapper.show{max-height:120px;opacity:1;transform:translateY(0)}::ng-deep .create-planogram-modal .modal-dialog{max-width:700px;width:100%}.new-store-txt{font-weight:500;font-size:16px;line-height:24px;letter-spacing:0%;color:#101828}.btn .spinner{height:22px;width:46px;animation:spin .9s linear infinite}.btn .spinner .path{stroke-width:6px;stroke:#fff;stroke-linecap:round;stroke-dasharray:80;stroke-dashoffset:60}@keyframes spin{to{transform:rotate(360deg)}}\n"] }]
|
|
415
434
|
}], ctorParameters: () => [{ type: i1.NgbActiveModal }, { type: i2.StoreBuilderService }, { type: i3.ToastService }, { type: i4.FormBuilder }], propDecorators: { clientId: [{
|
|
416
435
|
type: Input
|
|
417
436
|
}], cadProcessingLottieRef: [{
|
|
418
437
|
type: ViewChild,
|
|
419
438
|
args: ["cadProcessingLottie"]
|
|
420
439
|
}] } });
|
|
421
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9vbmJvYXJkLXN0b3JlLXBsYW5vL2NyZWF0ZS1wbGFub2dyYW0vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9vbmJvYXJkLXN0b3JlLXBsYW5vL2NyZWF0ZS1wbGFub2dyYW0vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFHTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFrQixVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RSxPQUFPLEVBR0wsV0FBVyxFQUNYLG1CQUFtQixFQUVuQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFOUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDN0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDMUYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFOUUsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixnQkFBZ0IsR0FFakIsTUFBTSxtQ0FBbUMsQ0FB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eUpDekRILGkzaEJBcVJBLCs5REQvT0ksV0FBVyxvaUNBQ1gsbUJBQW1CLGdWQUNuQix1QkFBdUIseU5BQ3ZCLG1CQUFtQix1R0FDbkIsSUFBSSw0RkFDSix1QkFBdUIsMk1BQ3ZCLFVBQVUsc1RBQ1YsYUFBYSw2Q0FDYixhQUFhLGtEQUNiLE9BQU87OzRGQVlFLHdCQUF3QjtrQkEzQnBDLFNBQVM7K0JBQ0Usc0JBQXNCLGNBR3BCLElBQUksV0FDUDt3QkFDUCxXQUFXO3dCQUNYLG1CQUFtQjt3QkFDbkIsdUJBQXVCO3dCQUN2QixtQkFBbUI7d0JBQ25CLElBQUk7d0JBQ0osdUJBQXVCO3dCQUN2QixVQUFVO3dCQUNWLGFBQWE7d0JBQ2IsYUFBYTt3QkFDYixPQUFPO3FCQUNSLGFBQ1U7d0JBQ1Q7NEJBQ0UsT0FBTyxFQUFFLE1BQU07NEJBQ2YsUUFBUSxFQUFFLElBQUksTUFBTSxDQUFDO2dDQUNuQixNQUFNLEVBQUUseUNBQXlDO2dDQUNqRCxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7NkJBQ3RCLENBQUM7eUJBQ0g7cUJBQ0Y7MEtBR1EsUUFBUTtzQkFBaEIsS0FBSztnQkFFTixzQkFBc0I7c0JBRHJCLFNBQVM7dUJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRWxlbWVudFJlZixcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIFZpZXdDaGlsZCxcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBOZ2JBY3RpdmVNb2RhbCwgTmdiVG9vbHRpcCB9IGZyb20gXCJAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFwiO1xyXG5pbXBvcnQge1xyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBGb3JtQnVpbGRlcixcclxuICBGb3Jtc01vZHVsZSxcclxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gIFZhbGlkYXRvckZuLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XHJcbmltcG9ydCB7IE5nQ2xhc3MsIE5nSWYsIFRpdGxlQ2FzZVBpcGUsIFVwcGVyQ2FzZVBpcGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7IFRvYXN0U2VydmljZSB9IGZyb20gXCJ0YW5nby1hcHAtdWktc2hhcmVkXCI7XHJcbmltcG9ydCB7IExvYWRlciB9IGZyb20gXCJAZ29vZ2xlbWFwcy9qcy1hcGktbG9hZGVyXCI7XHJcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHsgTmd4R3BBdXRvY29tcGxldGVNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXItbWFnaWMvbmd4LWdwLWF1dG9jb21wbGV0ZVwiO1xyXG5pbXBvcnQgeyBSZWFjdGl2ZVNlbGVjdENvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9yZWFjdGl2ZS1zZWxlY3QvcmVhY3RpdmUtc2VsZWN0LmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBGaWxlVXBsb2FkQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2ZpbGUtdXBsb2FkL2ZpbGUtdXBsb2FkLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQgeyBTdG9yZUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uL3NlcnZpY2VzL3N0b3JlLWJ1aWxkZXIuc2VydmljZVwiO1xyXG5pbXBvcnQge1xyXG4gIGdlbmVyYWxWYWxpZGF0b3IsXHJcbiAgZ2V0TmFtZUZyb21FbWFpbCxcclxuICBpbmRpYW5QaW5jb2RlVmFsaWRhdG9yLFxyXG59IGZyb20gXCIuLi8uLi8uLi9mdW5jdGlvbnMvcGxhbm8uZnVuY3Rpb25cIjtcclxuaW1wb3J0IGxvdHRpZSwgeyBBbmltYXRpb25JdGVtIH0gZnJvbSBcImxvdHRpZS13ZWJcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImFwcC1jcmVhdGUtcGxhbm9ncmFtXCIsXHJcbiAgdGVtcGxhdGVVcmw6IFwiLi9jcmVhdGUtcGxhbm9ncmFtLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmw6IFwiLi9jcmVhdGUtcGxhbm9ncmFtLmNvbXBvbmVudC5zY3NzXCIsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBGb3Jtc01vZHVsZSxcclxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBSZWFjdGl2ZVNlbGVjdENvbXBvbmVudCxcclxuICAgIEZpbGVVcGxvYWRDb21wb25lbnQsXHJcbiAgICBOZ0lmLFxyXG4gICAgTmd4R3BBdXRvY29tcGxldGVNb2R1bGUsXHJcbiAgICBOZ2JUb29sdGlwLFxyXG4gICAgVXBwZXJDYXNlUGlwZSxcclxuICAgIFRpdGxlQ2FzZVBpcGUsXHJcbiAgICBOZ0NsYXNzLFxyXG4gIF0sXHJcbiAgcHJvdmlkZXJzOiBbXHJcbiAgICB7XHJcbiAgICAgIHByb3ZpZGU6IExvYWRlcixcclxuICAgICAgdXNlVmFsdWU6IG5ldyBMb2FkZXIoe1xyXG4gICAgICAgIGFwaUtleTogXCJBSXphU3lBZldROWd1RnNTWG9ZSXUyVkZCdy1YUTNWbnVmdkZBM0FcIixcclxuICAgICAgICBsaWJyYXJpZXM6IFtcInBsYWNlc1wiXSxcclxuICAgICAgfSksXHJcbiAgICB9LFxyXG4gIF0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDcmVhdGVQbGFub2dyYW1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgY2xpZW50SWQ6IHN0cmluZztcclxuICBAVmlld0NoaWxkKFwiY2FkUHJvY2Vzc2luZ0xvdHRpZVwiKVxyXG4gIGNhZFByb2Nlc3NpbmdMb3R0aWVSZWY/OiBFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50PjtcclxuXHJcbiAgc2VsZWN0ZWRTdG9yZTogc3RyaW5nO1xyXG4gIHNlbGVjdGVkRmxvb3I6IG51bWJlcjtcclxuICBzZWxlY3RlZEZpbGU6IEZpbGUgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgc3RvcmVMaXN0OiB7XHJcbiAgICBsYWJlbDogc3RyaW5nO1xyXG4gICAgdmFsdWU6IHN0cmluZztcclxuICB9W10gPSBbXTtcclxuXHJcbiAgZmxvb3JMaXN0OiB7XHJcbiAgICBsYWJlbDogc3RyaW5nO1xyXG4gICAgdmFsdWU6IG51bWJlcjtcclxuICB9W10gPSBbXHJcbiAgICB7IGxhYmVsOiBcIkZsb29yIDFcIiwgdmFsdWU6IDEgfSxcclxuICAgIHsgbGFiZWw6IFwiRmxvb3IgMlwiLCB2YWx1ZTogMiB9LFxyXG4gICAgeyBsYWJlbDogXCJGbG9vciAzXCIsIHZhbHVlOiAzIH0sXHJcbiAgXTtcclxuXHJcbiAgc2VsZWN0ZWRTdG9yZUZsb29yczogYW55ID0gW107XHJcblxyXG4gIGlzTGF5b3V0RXhpc3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0J1dHRvbkxvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1BvcHVwTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzQ2FkUHJvY2Vzc2luZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGlzQ3JlYXRlU3RvcmVNb2RlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbmV3U3RvcmVEZXRhaWxzOiBhbnk7XHJcbiAgcHJpdmF0ZSBjYWRQcm9jZXNzaW5nQW5pbWF0aW9uPzogQW5pbWF0aW9uSXRlbTtcclxuXHJcbiAgY3JlYXRlU3RvcmVGb3JtOiBhbnk7XHJcbiAgc3RvcmVUeXBlTGlzdDoge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgfVtdID0gW1xyXG4gICAgeyBsYWJlbDogXCJIaWdoIFN0cmVldFwiLCB2YWx1ZTogXCJIaWdoIFN0cmVldFwiIH0sXHJcbiAgICB7IGxhYmVsOiBcIk1hbGwgU3RvcmVcIiwgdmFsdWU6IFwiTWFsbCBTdG9yZVwiIH0sXHJcbiAgICB7IGxhYmVsOiBcIktpb3NrXCIsIHZhbHVlOiBcIktpb3NrXCIgfSxcclxuICBdO1xyXG5cclxuICBidXNpbmVzc1R5cGVMaXN0OiB7XHJcbiAgICBsYWJlbDogc3RyaW5nO1xyXG4gICAgdmFsdWU6IHN0cmluZztcclxuICB9W10gPSBbXHJcbiAgICB7IGxhYmVsOiBcIkNPQ09cIiwgdmFsdWU6IFwiQ09DT1wiIH0sXHJcbiAgICB7IGxhYmVsOiBcIkNPRk9cIiwgdmFsdWU6IFwiQ09GT1wiIH0sXHJcbiAgICB7IGxhYmVsOiBcIkZPRk9cIiwgdmFsdWU6IFwiRk9GT1wiIH0sXHJcbiAgICB7IGxhYmVsOiBcIkZPQ09cIiwgdmFsdWU6IFwiRk9DT1wiIH0sXHJcbiAgXTtcclxuXHJcbiAgaXNNYW51YWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGFjdGl2ZU1vZGFsOiBOZ2JBY3RpdmVNb2RhbCxcclxuICAgIHByaXZhdGUgc3RvcmVCdWlsZGVyU2VydmljZTogU3RvcmVCdWlsZGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICApIHt9XHJcblxyXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgYXdhaXQgdGhpcy5nZXRTdG9yZUxpc3QoKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZXN0cm95Q2FkUHJvY2Vzc2luZ0FuaW1hdGlvbigpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzVmFsaWRUb0NyZWF0ZVBsYW5vKCkge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5zZWxlY3RlZFN0b3JlICYmXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRGbG9vciAmJlxyXG4gICAgICAodGhpcy5zZWxlY3RlZEZpbGUgfHwgdGhpcy5pc01hbnVhbClcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRTdG9yZUxpc3QoKSB7XHJcbiAgICB0aGlzLmlzUG9wdXBMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHN0b3JlczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmdldEFsbFN0b3Jlcyh0aGlzLmNsaWVudElkKSxcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zdG9yZUxpc3QgPSBzdG9yZXM/LmRhdGE/Lm1hcCgoczogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHsgbGFiZWw6IHMuc3RvcmVOYW1lLCB2YWx1ZTogcy5zdG9yZUlkIH07XHJcbiAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJAQCB+IGdldFN0b3JlTGlzdCBbRVJSXTpcIiwgZXJyb3IpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5pc1BvcHVwTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25TdG9yZUNoYW5nZSgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGZsb29yczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmdldFN0b3JlRmxvb3JzTGlzdCh0aGlzLnNlbGVjdGVkU3RvcmUpLFxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkU3RvcmVGbG9vcnMgPSBmbG9vcnM/LmRhdGEgPz8gW107XHJcbiAgICAgIHRoaXMub25GbG9vckNoYW5nZSgpO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJAQCB+IGdldFN0b3JlTGlzdCBbRVJSXTpcIiwgZXJyb3IpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25GbG9vckNoYW5nZSgpIHtcclxuICAgIGlmICh0aGlzLnNlbGVjdGVkRmxvb3IpIHtcclxuICAgICAgdGhpcy5pc0xheW91dEV4aXN0ID0gdGhpcy5zZWxlY3RlZFN0b3JlRmxvb3JzLnNvbWUoXHJcbiAgICAgICAgKGY6IGFueSkgPT4gZi5mbG9vck51bWJlciA9PT0gdGhpcy5zZWxlY3RlZEZsb29yLFxyXG4gICAgICApO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5pc0xheW91dEV4aXN0ID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkZpbGVDaGFuZ2UoZmlsZTogRmlsZSB8IG51bGwpIHtcclxuICAgIHRoaXMuc2VsZWN0ZWRGaWxlID0gZmlsZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uQ3JlYXRlTGF5b3V0UGxhbm8oKSB7XHJcbiAgICBpZiAoIXRoaXMuaXNWYWxpZFRvQ3JlYXRlUGxhbm8pIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBoYXNDYWRGaWxlID0gISF0aGlzLnNlbGVjdGVkRmlsZTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmlzQnV0dG9uTG9hZGluZyA9IHRydWU7XHJcbiAgICAgIGlmIChoYXNDYWRGaWxlKSB7XHJcbiAgICAgICAgdGhpcy5zaG93Q2FkUHJvY2Vzc2luZ0xvYWRlcigpO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBwbGFub1JlczogYW55O1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGUpIHtcclxuICAgICAgICBjb25zdCBzdG9yZU5hbWUgPSB0aGlzLnN0b3JlTGlzdC5maW5kKFxyXG4gICAgICAgICAgKHMpID0+IHMudmFsdWUgPT09IHRoaXMuc2VsZWN0ZWRTdG9yZSxcclxuICAgICAgICApPy5sYWJlbDtcclxuICAgICAgICBwbGFub1JlcyA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmNyZWF0ZVBsYW5vRnJvbUNBRChcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGUhLFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkU3RvcmUsXHJcbiAgICAgICAgICAgIHN0b3JlTmFtZSA/PyB0aGlzLnNlbGVjdGVkU3RvcmUsXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGbG9vcixcclxuICAgICAgICAgICksXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwbGFub1JlcyA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmNyZWF0ZUVtcHR5UGxhbm8oe1xyXG4gICAgICAgICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgICAgICAgc3RvcmVJZDogdGhpcy5zZWxlY3RlZFN0b3JlLFxyXG4gICAgICAgICAgICBmbG9vck51bWJlcjogdGhpcy5zZWxlY3RlZEZsb29yLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFwbGFub1Jlcz8uZGF0YSkgcmV0dXJuO1xyXG4gICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKHBsYW5vUmVzPy5kYXRhKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcclxuICAgICAgICBlcnJvcj8uZXJyb3I/LmVycm9yPy5lcnJNc2cgPz8gXCJGYWlsZWQgdG8gZXh0cmFjdCBwbGFubyBmcm9tIENBRCBmaWxlLlwiLFxyXG4gICAgICApO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gb25DcmVhdGUgW0VSUl06XCIsIGVycm9yKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuaXNCdXR0b25Mb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIGlmIChoYXNDYWRGaWxlKSB7XHJcbiAgICAgICAgdGhpcy5oaWRlQ2FkUHJvY2Vzc2luZ0xvYWRlcigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNob3dDYWRQcm9jZXNzaW5nTG9hZGVyKCkge1xyXG4gICAgdGhpcy5pc0NhZFByb2Nlc3NpbmcgPSB0cnVlO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmxvYWRDYWRQcm9jZXNzaW5nQW5pbWF0aW9uKCksIDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoaWRlQ2FkUHJvY2Vzc2luZ0xvYWRlcigpIHtcclxuICAgIHRoaXMuaXNDYWRQcm9jZXNzaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLmRlc3Ryb3lDYWRQcm9jZXNzaW5nQW5pbWF0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRDYWRQcm9jZXNzaW5nQW5pbWF0aW9uKCkge1xyXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jYWRQcm9jZXNzaW5nTG90dGllUmVmPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgaWYgKCFjb250YWluZXIpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmRlc3Ryb3lDYWRQcm9jZXNzaW5nQW5pbWF0aW9uKCk7XHJcbiAgICB0aGlzLmNhZFByb2Nlc3NpbmdBbmltYXRpb24gPSBsb3R0aWUubG9hZEFuaW1hdGlvbih7XHJcbiAgICAgIGNvbnRhaW5lcixcclxuICAgICAgcmVuZGVyZXI6IFwic3ZnXCIsXHJcbiAgICAgIGxvb3A6IHRydWUsXHJcbiAgICAgIGF1dG9wbGF5OiB0cnVlLFxyXG4gICAgICBwYXRoOiBcImFzc2V0cy9hbmltYXRpb25zL3N0cmluZ19sb2FkaW5nLmpzb25cIixcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZXN0cm95Q2FkUHJvY2Vzc2luZ0FuaW1hdGlvbigpIHtcclxuICAgIHRoaXMuY2FkUHJvY2Vzc2luZ0FuaW1hdGlvbj8uZGVzdHJveSgpO1xyXG4gICAgdGhpcy5jYWRQcm9jZXNzaW5nQW5pbWF0aW9uID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25DcmVhdGVTdG9yZSgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIHRoaXMuaXNCdXR0b25Mb2FkaW5nID0gdHJ1ZTtcclxuICAgICAgY29uc3Qgc3BvY1VzZXIgPSBhd2FpdCB0aGlzLmdldFNwb2NVc2VyRGV0YWlscyhcclxuICAgICAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZS5zdG9yZU5hbWUudHJpbSgpLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgaWYgKCFzcG9jVXNlcikgcmV0dXJuO1xyXG5cclxuICAgICAgY29uc3QgY3JlYXRlU3RvcmVQYXlsb2FkID0ge1xyXG4gICAgICAgIHN0b3JlTmFtZTogdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWUuc3RvcmVOYW1lPy50b1VwcGVyQ2FzZSgpPy50cmltKCksXHJcbiAgICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgICAgYnVzaW5lc3NUeXBlOiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZS5idXNpbmVzc1R5cGUsXHJcbiAgICAgICAgY2x1c3RlcjogW10sXHJcbiAgICAgICAgc3RvcmVUeXBlOiB7XHJcbiAgICAgICAgICB0eXBlOiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZS5zdG9yZVR5cGUsXHJcbiAgICAgICAgICBuYW1lOiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZT8uc3RvcmVUeXBlTmFtZT8udHJpbSgpLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc3RvcmVQcm9maWxlOiB7XHJcbiAgICAgICAgICBzdG9yZUNvZGU6IHRoaXMuY3JlYXRlU3RvcmVGb3JtPy52YWx1ZT8uc3RvcmVDb2RlLFxyXG4gICAgICAgICAgYWRkcmVzczogdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWU/LmFkZHJlc3MsXHJcbiAgICAgICAgICBjb3VudHJ5OiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZT8uY291bnRyeSxcclxuICAgICAgICAgIHN0YXRlOiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZT8uc3RhdGUsXHJcbiAgICAgICAgICBjaXR5OiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZT8uY2l0eSxcclxuICAgICAgICAgIHBpbmNvZGU6IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlPy5waW5jb2RlLFxyXG4gICAgICAgICAgbGF0aXR1ZGU6IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlLmxhdGl0dWRlPy50b1N0cmluZygpLnRyaW0oKVxyXG4gICAgICAgICAgICA/IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlLmxhdGl0dWRlXHJcbiAgICAgICAgICAgIDogMCxcclxuICAgICAgICAgIGxvbmdpdHVkZTogdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWUubG9uZ2l0dWRlPy50b1N0cmluZygpLnRyaW0oKVxyXG4gICAgICAgICAgICA/IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlLmxvbmdpdHVkZVxyXG4gICAgICAgICAgICA6IDAsXHJcbiAgICAgICAgICB0aW1lWm9uZTogXCJBc2lhL0tvbGthdGFcIixcclxuICAgICAgICAgIG9wZW46IFwiMTA6MDA6MDBcIixcclxuICAgICAgICAgIGNsb3NlOiBcIjIwOjAwOjAwXCIsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBlZGdlOiB7XHJcbiAgICAgICAgICBzZXJ2ZXJUeXBlOiBmYWxzZSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHNwb2NEZXRhaWxzOiBbc3BvY1VzZXJdLFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgY29uc3QgcmVzOiBhbnkgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UuY3JlYXRlU3RvcmUoY3JlYXRlU3RvcmVQYXlsb2FkKSxcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IG5ld1N0b3JlID0gcmVzPy5kYXRhPy5zdG9yZTtcclxuXHJcbiAgICAgIGlmIChuZXdTdG9yZSAmJiBuZXdTdG9yZT8uc3RvcmVJZCkge1xyXG4gICAgICAgIGNvbnN0IHRpY2tldFJlcyA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmNyZWF0ZUluZnJhVGlja2V0KHtcclxuICAgICAgICAgICAgc3RvcmVJZDogcmVzPy5kYXRhPy5zdG9yZT8uc3RvcmVJZCxcclxuICAgICAgICAgICAgRGF0ZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnNwbGl0KFwiVFwiKVswXSxcclxuICAgICAgICAgICAgaXNzdWVUeXBlOiBcImluc3RhbGxhdGlvblwiLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgaWYgKHRpY2tldFJlcykge1xyXG4gICAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0U3VjY2Vzc1RvYXN0KFwiU3RvcmUgY3JlYXRlZCBzdWNjZXNzZnVsbHlcIik7XHJcbiAgICAgICAgICB0aGlzLnN0b3JlTGlzdC5wdXNoKHtcclxuICAgICAgICAgICAgbGFiZWw6IG5ld1N0b3JlLnN0b3JlTmFtZSxcclxuICAgICAgICAgICAgdmFsdWU6IG5ld1N0b3JlLnN0b3JlSWQsXHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkU3RvcmUgPSBuZXdTdG9yZS5zdG9yZUlkO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZsb29yID0gdGhpcy5jcmVhdGVTdG9yZUZvcm0uZ2V0KFwiZmxvb3JcIik/LnZhbHVlID8/IDE7XHJcbiAgICAgICAgICB0aGlzLm5ld1N0b3JlRGV0YWlscyA9IGNyZWF0ZVN0b3JlUGF5bG9hZDtcclxuICAgICAgICAgIHRoaXMuaXNDcmVhdGVTdG9yZU1vZGUgPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIlVuYWJsZSB0byBjcmVhdGUgc3RvcmVcIik7XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgaWYgKGVycm9yPy5lcnJvcj8uZXJyb3I/LmVycm9yID09PSBcIlN0b3JlTmFtZSBhbHJlYWR5IGV4aXN0c1wiKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIlN0b3JlIE5hbWUgYWxyZWFkeSBleGlzdHNcIik7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcIkZhaWxlZCB0byBjcmVhdGUgc3RvcmVcIik7XHJcbiAgICAgIH1cclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuaXNCdXR0b25Mb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRTcG9jVXNlckRldGFpbHMoc3RvcmVOYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHNhZmVTdG9yZU5hbWUgPSBzdG9yZU5hbWVcclxuICAgICAgPy50b0xvd2VyQ2FzZSgpXHJcbiAgICAgIC50cmltKClcclxuICAgICAgLnJlcGxhY2UoL1xccysvZywgXCJfXCIpXHJcbiAgICAgIC5yZXBsYWNlKC9bXmEtejAtOS5fLV0vZywgXCJcIik7XHJcblxyXG4gICAgY29uc3QgZW1haWwgPVxyXG4gICAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybS5nZXQoXCJlbWFpbFwiKT8udmFsdWU/LnRvTG93ZXJDYXNlKCkgfHxcclxuICAgICAgYCR7c2FmZVN0b3JlTmFtZX1fcGxhbm9ncmFtQGxlbnNrYXJ0LmNvbWA7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLnNwb2NFbWFpbENoZWNrKHtcclxuICAgICAgICAgIGNsaWVudElkOiB0aGlzLmNsaWVudElkLFxyXG4gICAgICAgICAgZW1haWw6IFtlbWFpbF0sXHJcbiAgICAgICAgfSksXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChyZXN1bHQpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgbmFtZTogZ2V0TmFtZUZyb21FbWFpbChlbWFpbCksXHJcbiAgICAgICAgICBlbWFpbDogZW1haWwsXHJcbiAgICAgICAgICBjb250YWN0OiBcIjk5OTk5OTk5OTlcIixcclxuICAgICAgICB9O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gZ2V0U3BvY1VzZXJEZXRhaWxzIFtFUlJdOiBcIiwgZXJyb3IpO1xyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFxyXG4gICAgICAgIGVycm9yPy5lcnJvcj8uZXJyb3IgPz8gXCJVbmFibGUgdG8gY3JlYXRlIFVzZXJcIixcclxuICAgICAgKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhZGROZXdTdG9yZSgpIHtcclxuICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHN0b3JlTmFtZTogW1xyXG4gICAgICAgIFwiXCIsXHJcbiAgICAgICAgW1xyXG4gICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgICAgIHRoaXMuc3RvcmVOYW1lVmFsaWRhdG9yKCksXHJcbiAgICAgICAgICB0aGlzLnN0b3JlTmFtZUV4aXN0c1ZhbGlkYXRvcigpLFxyXG4gICAgICAgICAgZ2VuZXJhbFZhbGlkYXRvcigpLFxyXG4gICAgICAgIF0sXHJcbiAgICAgIF0sXHJcbiAgICAgIGVtYWlsOiBbXCJcIiwgVmFsaWRhdG9ycy5lbWFpbF0sXHJcbiAgICAgIGZsb29yOiBbMV0sXHJcbiAgICAgIGJ1c2luZXNzVHlwZTogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBzdG9yZVR5cGU6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgc3RvcmVUeXBlTmFtZTogW1wiXCIsIGdlbmVyYWxWYWxpZGF0b3IoKV0sXHJcbiAgICAgIGFkZHJlc3M6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgY291bnRyeTogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBzdGF0ZTogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBjaXR5OiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHBpbmNvZGU6IFtcclxuICAgICAgICBcIlwiLFxyXG4gICAgICAgIFtcclxuICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgICAgICAvLyAgaW5kaWFuUGluY29kZVZhbGlkYXRvcigpXHJcbiAgICAgICAgXSxcclxuICAgICAgXSxcclxuICAgICAgbGF0aXR1ZGU6IFtcIlwiXSxcclxuICAgICAgbG9uZ2l0dWRlOiBbXCJcIl0sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmlzQ3JlYXRlU3RvcmVNb2RlID0gdHJ1ZTtcclxuXHJcbiAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybVxyXG4gICAgICAuZ2V0KFwic3RvcmVUeXBlXCIpXHJcbiAgICAgID8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICh2YWx1ZSAhPT0gXCJNYWxsIFN0b3JlXCIpIHtcclxuICAgICAgICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtLmdldChcInN0b3JlVHlwZU5hbWVcIik/LnJlc2V0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybVxyXG4gICAgICAuZ2V0KFwic3RvcmVOYW1lXCIpXHJcbiAgICAgID8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgY29uc3QgdXBwZXIgPSB2YWx1ZS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgaWYgKHZhbHVlICE9PSB1cHBlcikge1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybVxyXG4gICAgICAgICAgICAgIC5nZXQoXCJzdG9yZU5hbWVcIilcclxuICAgICAgICAgICAgICA/LnNldFZhbHVlKHVwcGVyLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAvLyBjb25zdCB1cmxUcmVlID0gdGhpcy5yb3V0ZXIuY3JlYXRlVXJsVHJlZShbXCIvbWFuYWdlL3N0b3Jlcy9hZGQtc2luZ2xlLXN0b3JlXCJdKTtcclxuICAgIC8vIGNvbnN0IHVybCA9IHRoaXMucm91dGVyLnNlcmlhbGl6ZVVybCh1cmxUcmVlKTtcclxuICAgIC8vIHdpbmRvdy5vcGVuKHVybCwgXCJfYmxhbmtcIik7XHJcbiAgfVxyXG5cclxuICBzdG9yZU5hbWVFeGlzdHNWYWxpZGF0b3IgPSAoKTogVmFsaWRhdG9yRm4gPT4ge1xyXG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgICAgY29uc3QgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xyXG4gICAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDsgLy8gYWxsb3cgcmVxdWlyZWQgdmFsaWRhdG9yIHRvIGhhbmRsZSBlbXB0eVxyXG5cclxuICAgICAgY29uc3QgdHJpbW1lZCA9IHZhbHVlLnRyaW0oKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xyXG5cclxuICAgICAgY29uc3QgcyA9IHRoaXMuc3RvcmVMaXN0LmZpbmQoXHJcbiAgICAgICAgKHMpID0+IHM/LmxhYmVsPy50cmltKCk/LnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IHRyaW1tZWQsXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChzKSByZXR1cm4geyBleGlzdHM6IHRydWUgfTtcclxuXHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfTtcclxuICB9O1xyXG5cclxuICBzdG9yZU5hbWVWYWxpZGF0b3IoKTogVmFsaWRhdG9yRm4ge1xyXG4gICAgcmV0dXJuIChjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcclxuICAgICAgaWYgKCFjb250cm9sLnZhbHVlKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udHJvbC52YWx1ZS50b1VwcGVyQ2FzZSgpO1xyXG5cclxuICAgICAgY29uc3Qgc3RQYXR0ZXJuID0gL15TVFxcZHs0fSQvOyAvLyBTVDEyMzRcclxuICAgICAgY29uc3QgbGtzdFBhdHRlcm4gPSAvXkxLU1RcXGR7NH0kLzsgLy8gTEtTVDEyMzRcclxuXHJcbiAgICAgIGNvbnN0IGlzVmFsaWQgPSBzdFBhdHRlcm4udGVzdCh2YWx1ZSkgfHwgbGtzdFBhdHRlcm4udGVzdCh2YWx1ZSk7XHJcblxyXG4gICAgICByZXR1cm4gaXNWYWxpZCA/IG51bGwgOiB7IGludmFsaWRTdG9yZU5hbWU6IHRydWUgfTtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBvbkFkZHJlc3NDaGFuZ2UocGxhY2U6IGdvb2dsZS5tYXBzLnBsYWNlcy5QbGFjZVJlc3VsdCB8IGFueSkge1xyXG4gICAgaWYgKCFwbGFjZT8uZ2VvbWV0cnkpIHJldHVybjtcclxuXHJcbiAgICBsZXQgY291bnRyeSA9IFwiXCIsXHJcbiAgICAgIGNpdHkgPSBcIlwiLFxyXG4gICAgICBzdGF0ZSA9IFwiXCIsXHJcbiAgICAgIHBpbmNvZGUgPSBcIlwiO1xyXG5cclxuICAgIGxldCBsYXRpdHVkZSA9IHBsYWNlLmdlb21ldHJ5LmxvY2F0aW9uLmxhdCgpO1xyXG4gICAgbGV0IGxvbmdpdHVkZSA9IHBsYWNlLmdlb21ldHJ5LmxvY2F0aW9uLmxuZygpO1xyXG5cclxuICAgIHBsYWNlLmFkZHJlc3NfY29tcG9uZW50cy5mb3JFYWNoKChjb21wb25lbnQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoY29tcG9uZW50LnR5cGVzLmluY2x1ZGVzKFwiY291bnRyeVwiKSkge1xyXG4gICAgICAgIGNvdW50cnkgPSBjb21wb25lbnQubG9uZ19uYW1lO1xyXG4gICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudC50eXBlcy5pbmNsdWRlcyhcImxvY2FsaXR5XCIpKSB7XHJcbiAgICAgICAgY2l0eSA9IGNvbXBvbmVudC5sb25nX25hbWU7XHJcbiAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50LnR5cGVzLmluY2x1ZGVzKFwiYWRtaW5pc3RyYXRpdmVfYXJlYV9sZXZlbF8xXCIpKSB7XHJcbiAgICAgICAgc3RhdGUgPSBjb21wb25lbnQubG9uZ19uYW1lO1xyXG4gICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudC50eXBlcy5pbmNsdWRlcyhcInBvc3RhbF9jb2RlXCIpKSB7XHJcbiAgICAgICAgcGluY29kZSA9IGNvbXBvbmVudC5sb25nX25hbWU7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtLmdldChcImFkZHJlc3NcIik/LnNldFZhbHVlKHBsYWNlLmZvcm1hdHRlZF9hZGRyZXNzKTtcclxuICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtLmdldChcImNvdW50cnlcIik/LnNldFZhbHVlKGNvdW50cnkpO1xyXG4gICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0uZ2V0KFwiY2l0eVwiKT8uc2V0VmFsdWUoY2l0eSk7XHJcbiAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybS5nZXQoXCJzdGF0ZVwiKT8uc2V0VmFsdWUoc3RhdGUpO1xyXG4gICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0uZ2V0KFwicGluY29kZVwiKT8uc2V0VmFsdWUocGluY29kZSk7XHJcbiAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybS5nZXQoXCJsYXRpdHVkZVwiKT8uc2V0VmFsdWUobGF0aXR1ZGUpO1xyXG4gICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0uZ2V0KFwibG9uZ2l0dWRlXCIpPy5zZXRWYWx1ZShsb25naXR1ZGUpO1xyXG4gIH1cclxuXHJcbiAgb25DYW5jZWwoKSB7XHJcbiAgICB0aGlzLmFjdGl2ZU1vZGFsLmRpc21pc3MoKTtcclxuICB9XHJcblxyXG4gIG9uQmFjaygpIHtcclxuICAgIHRoaXMuaXNDcmVhdGVTdG9yZU1vZGUgPSBmYWxzZTtcclxuICAgIHRoaXMubmV3U3RvcmVEZXRhaWxzID0gbnVsbDtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cIm1vZGFsLXdyYXBwZXJcIj5cclxuICA8ZGl2ICpuZ0lmPVwiaXNQb3B1cExvYWRpbmdcIiBjbGFzcz1cIm1vZGFsLWxvYWRlci1vdmVybGF5XCI+XHJcbiAgICA8c3ZnIGNsYXNzPVwibW9kYWwtc3Bpbm5lclwiIHZpZXdCb3g9XCIwIDAgNTAgNTBcIj5cclxuICAgICAgPGNpcmNsZSBjbGFzcz1cInBhdGhcIiBjeD1cIjI1XCIgY3k9XCIyNVwiIHI9XCIyMFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiNFwiPjwvY2lyY2xlPlxyXG4gICAgPC9zdmc+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiAqbmdJZj1cImlzQ2FkUHJvY2Vzc2luZ1wiIGNsYXNzPVwiY2FkLWxvYWRlci1vdmVybGF5XCI+XHJcbiAgICA8ZGl2ICNjYWRQcm9jZXNzaW5nTG90dGllIGNsYXNzPVwiY2FkLWxvdHRpZVwiPjwvZGl2PlxyXG4gICAgPHAgY2xhc3M9XCJjYWQtbG9hZGVyLXRleHQgbWItMFwiPkNyZWF0aW5nIHBsYW5vZ3JhbSBmcm9tIENBRC4uLjwvcD5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGgzIGNsYXNzPVwibWItM1wiPkNyZWF0ZSBzdG9yZSBsYXlvdXQvcGxhbiBmcm9tIENBRDwvaDM+XHJcbiAgQGlmKGlzQ3JlYXRlU3RvcmVNb2RlKXtcclxuICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxnbi1pdGVtcy1jZW50ZXIgZ2FwLTJcIj5cclxuICAgICAgPHA+U3RlcCAxOiBPbmJvYXJkIHN0b3JlIHdpdGggYmFzaWMgZGV0YWlsczwvcD5cclxuICAgICAgPHN2ZyB3aWR0aD1cIjIwXCIgaGVpZ2h0PVwiMjBcIiB2aWV3Qm94PVwiMCAwIDIwIDIwXCIgZmlsbD1cIm5vbmVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICBuZ2JUb29sdGlwPVwiQSBuZXcgc3RvcmUgd2lsbCBiZSBjcmVhdGVkIHdoZW4geW91IHBlcmZvcm0gdGhpcyBhY3Rpb24gKE1hbmFnZSA+IFN0b3JlcykuXCI+XHJcbiAgICAgICAgPHBhdGhcclxuICAgICAgICAgIGQ9XCJNMTAuMDAwMyAxMy4zMzM3VjEwLjAwMDNNMTAuMDAwMyA2LjY2Njk5SDEwLjAwODdNMTguMzMzNyAxMC4wMDAzQzE4LjMzMzcgMTQuNjAyNyAxNC42MDI3IDE4LjMzMzcgMTAuMDAwMyAxOC4zMzM3QzUuMzk3OTUgMTguMzMzNyAxLjY2Njk5IDE0LjYwMjcgMS42NjY5OSAxMC4wMDAzQzEuNjY2OTkgNS4zOTc5NSA1LjM5Nzk1IDEuNjY2OTkgMTAuMDAwMyAxLjY2Njk5QzE0LjYwMjcgMS42NjY5OSAxOC4zMzM3IDUuMzk3OTUgMTguMzMzNyAxMC4wMDAzWlwiXHJcbiAgICAgICAgICBzdHJva2U9XCIjMTAxODI4XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgIDwvc3ZnPlxyXG4gICAgPC9kaXY+XHJcbiAgfVxyXG5cclxuXHJcbiAgQGlmKGlzQ3JlYXRlU3RvcmVNb2RlKXtcclxuICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiY3JlYXRlU3RvcmVGb3JtXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItNFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi00XCI+XHJcbiAgICAgICAgICA8bGFiZWwgZm9yPVwic3RvcmVOYW1lXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5TdG9yZSBuYW1lPC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJzdG9yZU5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJzdG9yZU5hbWVcIlxyXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlR5cGUgc3RvcmUgbmFtZS4gZWc6IExLU1QxMjM0XCIgLz5cclxuXHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RvcmVOYW1lJyk/LnRvdWNoZWQgJiYgY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RvcmVOYW1lJyk/LmludmFsaWRcIj5cclxuXHJcbiAgICAgICAgICAgIEBpZihjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZU5hbWUnKT8uaGFzRXJyb3IoJ2V4aXN0cycpKXtcclxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxyXG4gICAgICAgICAgICAgICAgU3RvcmUgYWxyZWFkeSBleGlzdHMuXHJcbiAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgfUBlbHNlIHtcclxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RvcmVOYW1lJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgICBTdG9yZSBuYW1lIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlTmFtZScpPy5oYXNFcnJvcignd2hpdGVzcGFjZScpXCI+XHJcbiAgICAgICAgICAgICAgICBTdG9yZSBuYW1lIGNhbm5vdCBiZSBvbmx5IHdoaXRlc3BhY2UuXHJcbiAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RvcmVOYW1lJyk/Lmhhc0Vycm9yKCd0cmltU3BhY2VzJylcIj5cclxuICAgICAgICAgICAgICAgIE5vIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbGxvd2VkLlxyXG4gICAgICAgICAgICAgIDwvc21hbGw+XHJcblxyXG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZU5hbWUnKT8uaGFzRXJyb3IoJ2ludmFsaWRTdG9yZU5hbWUnKSBcIj5cclxuICAgICAgICAgICAgICAgIFN0b3JlIG5hbWUgbXVzdCBiZSBTVDEyMzQgb3IgTEtTVDEyMzQgZm9ybWF0LlxyXG4gICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cImZsb29yTGlzdFwiIFtsYWJlbF09XCInU2VsZWN0IGZsb29yJ1wiXHJcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZsb29yXCI+XHJcbiAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi00XCI+XHJcbiAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwiYnVzaW5lc3NUeXBlTGlzdFwiXHJcbiAgICAgICAgICAgIFtsYWJlbF09XCInU2VsZWN0IGJ1c2luZXNzIHR5cGUnXCIgZm9ybUNvbnRyb2xOYW1lPVwiYnVzaW5lc3NUeXBlXCI+XHJcbiAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi00XCI+XHJcbiAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwic3RvcmVUeXBlTGlzdFwiXHJcbiAgICAgICAgICAgIFtsYWJlbF09XCInU2VsZWN0IHN0b3JlIHR5cGUnXCIgZm9ybUNvbnRyb2xOYW1lPVwic3RvcmVUeXBlXCI+XHJcbiAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIEBpZihjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZVR5cGUnKT8udmFsdWUgPT0gJ01hbGwgU3RvcmUnKXtcclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNFwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwic3RvcmVUeXBlTmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbCBtYi0xXCI+RW50ZXIgTWFsbCBuYW1lPC9sYWJlbD5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInN0b3JlVHlwZU5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJzdG9yZVR5cGVOYW1lXCJcclxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIE1hbGwgbmFtZVwiIC8+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlVHlwZU5hbWUnKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZVR5cGVOYW1lJyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RvcmVUeXBlTmFtZScpPy5oYXNFcnJvcignd2hpdGVzcGFjZScpXCI+XHJcbiAgICAgICAgICAgICAgICBNYWxsIG5hbWUgY2Fubm90IGJlIG9ubHkgd2hpdGVzcGFjZS5cclxuICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZVR5cGVOYW1lJyk/Lmhhc0Vycm9yKCd0cmltU3BhY2VzJylcIj5cclxuICAgICAgICAgICAgICAgIE5vIGxlYWRpbmcgb3IgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbGxvd2VkLlxyXG4gICAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTRcIj5cclxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJhZGRyZXNzXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5BZGRyZXNzPC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJhZGRyZXNzXCIgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc1wiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGFuZCBlbnRlciBhZGRyZXNzXCIgbmd4LWdwLWF1dG9jb21wbGV0ZSAob25BZGRyZXNzQ2hhbmdlKT1cIm9uQWRkcmVzc0NoYW5nZSgkZXZlbnQpXCIgLz5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdhZGRyZXNzJyk/LnRvdWNoZWQgJiYgY3JlYXRlU3RvcmVGb3JtLmdldCgnYWRkcmVzcycpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdhZGRyZXNzJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgQWRkcmVzcyBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cImNvdW50cnlcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkNvdW50cnk8L2xhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImNvdW50cnlcIiBmb3JtQ29udHJvbE5hbWU9XCJjb3VudHJ5XCIgcGxhY2Vob2xkZXI9XCJFbnRlciBDb3VudHJ5XCIgLz5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdjb3VudHJ5Jyk/LnRvdWNoZWQgJiYgY3JlYXRlU3RvcmVGb3JtLmdldCgnY291bnRyeScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdjb3VudHJ5Jyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgQ291bnRyeSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cInN0YXRlXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5TdGF0ZTwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwic3RhdGVcIiBmb3JtQ29udHJvbE5hbWU9XCJzdGF0ZVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgU3RhdGVcIiAvPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0YXRlJyk/LnRvdWNoZWQgJiYgY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RhdGUnKT8uaW52YWxpZFwiPlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RhdGUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICBTdGF0ZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cImNpdHlcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkNpdHkgLyBUb3duPC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJjaXR5XCIgZm9ybUNvbnRyb2xOYW1lPVwiY2l0eVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgQ2l0eSAvIFRvd25cIiAvPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2NpdHknKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdjaXR5Jyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2NpdHknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICBDaXR5IC8gVG93biBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cInBpbmNvZGVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlBpbiAvIFppcCBDb2RlPC9sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJwaW5jb2RlXCIgZm9ybUNvbnRyb2xOYW1lPVwicGluY29kZVwiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgUGluIC8gWmlwIENvZGVcIiAvPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3BpbmNvZGUnKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdwaW5jb2RlJyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3BpbmNvZGUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICBQaW4gLyBaaXAgQ29kZSBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIlxyXG4gICAgICAgICAgICAgICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgncGluY29kZScpPy5oYXNFcnJvcignd2hpdGVzcGFjZScpIHx8IGNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3BpbmNvZGUnKT8uaGFzRXJyb3IoJ3RyaW1TcGFjZXMnKVwiPlxyXG4gICAgICAgICAgICAgIFBpbmNvZGUgY2Fubm90IGNvbnRhaW4gd2hpdGVzcGFjZS5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3BpbmNvZGUnKT8uaGFzRXJyb3IoJ2ludmFsaWRQaW5jb2RlJylcIj5cclxuICAgICAgICAgICAgICBFbnRlciBhIHZhbGlkIDYtZGlnaXQgcGluY29kZVxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNFwiPlxyXG4gICAgICAgICAgPGxhYmVsIGZvcj1cImVtYWlsXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5TcG9jIHVzZXIgZW1haWwgKG9wdGlvbmFsKTwvbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZW1haWxcIiBmb3JtQ29udHJvbE5hbWU9XCJlbWFpbFwiXHJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgc3BvYyB1c2VyIGVtYWlsXCIgLz5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdlbWFpbCcpPy50b3VjaGVkICYmIGNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2VtYWlsJyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2VtYWlsJyk/Lmhhc0Vycm9yKCdlbWFpbCcpXCI+XHJcbiAgICAgICAgICAgICAgRW1haWwgaXMgaW52YWxpZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Zvcm0+XHJcbiAgfVxyXG4gIEBlbHNlIHtcclxuICAgIEBpZihuZXdTdG9yZURldGFpbHMpe1xyXG4gICAgICA8cCBjbGFzcz1cIm1iLTZcIj5TdGVwIDI6IEFkZCBDQUQgZmlsZTwvcD5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItNlwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgIDxwIGNsYXNzPVwibWItMlwiPlN0b3JlIG5hbWU8L3A+XHJcbiAgICAgICAgICA8aDMgY2xhc3M9XCJuZXctc3RvcmUtdHh0XCI+e3tuZXdTdG9yZURldGFpbHM/LnN0b3JlTmFtZX19PC9oMz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICA8cCBjbGFzcz1cIm1iLTJcIj5GbG9vcjwvcD5cclxuICAgICAgICAgIDxoMyBjbGFzcz1cIm5ldy1zdG9yZS10eHRcIj5GbG9vciB7e3RoaXMuc2VsZWN0ZWRGbG9vcn19PC9oMz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICA8cCBjbGFzcz1cIm1iLTJcIj5CdXNpbmVzcyB0eXBlPC9wPlxyXG4gICAgICAgICAgPGgzIGNsYXNzPVwibmV3LXN0b3JlLXR4dFwiPnt7bmV3U3RvcmVEZXRhaWxzPy5idXNpbmVzc1R5cGUgfCB1cHBlcmNhc2V9fTwvaDM+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgPHAgY2xhc3M9XCJtYi0yXCI+U3RvcmUgdHlwZTwvcD5cclxuICAgICAgICAgIDxoMyBjbGFzcz1cIm5ldy1zdG9yZS10eHRcIj57e25ld1N0b3JlRGV0YWlscz8uc3RvcmVUeXBlPy50eXBlIHwgdGl0bGVjYXNlfX08L2gzPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIH1AZWxzZSB7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbWItNFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNlwiPlxyXG4gICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgW3NlYXJjaF09XCJ0cnVlXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFN0b3JlXCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiXHJcbiAgICAgICAgICAgIFtkYXRhXT1cInN0b3JlTGlzdFwiIFtsYWJlbF09XCInU2VsZWN0IHN0b3JlJ1wiIFthY3Rpb25dPVwidHJ1ZVwiIChhY3Rpb25DbGljayk9XCJhZGROZXdTdG9yZSgpXCJcclxuICAgICAgICAgICAgW2FjdGlvbkxhYmVsXT1cIidDcmVhdGUgbmV3IHN0b3JlJ1wiIChuZ01vZGVsQ2hhbmdlKT1cIm9uU3RvcmVDaGFuZ2UoKVwiIFtkaXNhYmxlZF09XCJpc0J1dHRvbkxvYWRpbmdcIj5cclxuICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTZcIj5cclxuICAgICAgICAgIDxsaWItcmVhY3RpdmUtc2VsZWN0IFsobmdNb2RlbCldPVwic2VsZWN0ZWRGbG9vclwiIFtpZEZpZWxkXT1cIid2YWx1ZSdcIiBbbmFtZUZpZWxkXT1cIidsYWJlbCdcIiBbZGF0YV09XCJmbG9vckxpc3RcIlxyXG4gICAgICAgICAgICBbbGFiZWxdPVwiJ1NlbGVjdCBmbG9vcidcIiAobmdNb2RlbENoYW5nZSk9XCJvbkZsb29yQ2hhbmdlKClcIiBbZGlzYWJsZWRdPVwiaXNCdXR0b25Mb2FkaW5nXCI+XHJcbiAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cImxheW91dC1leGlzdC13cmFwcGVyXCIgW2NsYXNzLnNob3ddPVwiaXNMYXlvdXRFeGlzdFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsYXlvdXQtZXhpc3Qtd2FybmluZyBtYi00XCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiMjBcIiBoZWlnaHQ9XCIyMFwiIHZpZXdCb3g9XCIwIDAgMjAgMjBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTkuOTk5NjUgNi42NjY2N1YxME05Ljk5OTY1IDEzLjMzMzNIMTAuMDA4TTguNTc0NjUgMi4zODMzNEwxLjUxNjMyIDE0LjE2NjdDMS4zNzA3OSAxNC40MTg3IDEuMjkzNzkgMTQuNzA0NCAxLjI5Mjk4IDE0Ljk5NTRDMS4yOTIxNiAxNS4yODY1IDEuMzY3NTYgMTUuNTcyNiAxLjUxMTY3IDE1LjgyNTRDMS42NTU3OSAxNi4wNzgzIDEuODYzNTkgMTYuMjg5IDIuMTE0NDEgMTYuNDM2NkMyLjM2NTIzIDE2LjU4NDEgMi42NTAzMiAxNi42NjM1IDIuOTQxMzIgMTYuNjY2N0gxNy4wNThDMTcuMzQ5IDE2LjY2MzUgMTcuNjM0MSAxNi41ODQxIDE3Ljg4NDkgMTYuNDM2NkMxOC4xMzU3IDE2LjI4OSAxOC4zNDM1IDE2LjA3ODMgMTguNDg3NiAxNS44MjU0QzE4LjYzMTcgMTUuNTcyNiAxOC43MDcxIDE1LjI4NjUgMTguNzA2MyAxNC45OTU0QzE4LjcwNTUgMTQuNzA0NCAxOC42Mjg1IDE0LjQxODcgMTguNDgzIDE0LjE2NjdMMTEuNDI0NyAyLjM4MzM0QzExLjI3NjEgMi4xMzg0MyAxMS4wNjY5IDEuOTM1OTQgMTAuODE3MyAxLjc5NTQxQzEwLjU2NzcgMS42NTQ4OCAxMC4yODYxIDEuNTgxMDUgOS45OTk2NSAxLjU4MTA1QzkuNzEzMjEgMS41ODEwNSA5LjQzMTU5IDEuNjU0ODggOS4xODE5OSAxLjc5NTQxQzguOTMyMzggMS45MzU5NCA4LjcyMzIxIDIuMTM4NDMgOC41NzQ2NSAyLjM4MzM0WlwiXHJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwiI0YwNDQzOFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgPC9zdmc+XHJcblxyXG4gICAgICAgICAgVGhpcyBzdG9yZSBhbHJlYWR5IGhhcyBhIEZsb29yIHt7c2VsZWN0ZWRGbG9vcn19IHBsYW5vZ3JhbS4gT3ZlcndyaXRlIGl0PyBUaGlzIGNhbuKAmXQgYmUgdW5kb25lLlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIH1cclxuICAgIDxkaXYgY2xhc3M9XCJtYi00XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInNlbGVjdGVkRmlsZSA/ICdjb2wtMTInIDonY29sLTYnXCI+XHJcbiAgICAgICAgICA8ZmlsZS11cGxvYWQgW2Rpc2FibGVkXT1cImlzQnV0dG9uTG9hZGluZ1wiIChmaWxlQ2hhbmdlKT1cIm9uRmlsZUNoYW5nZSgkZXZlbnQpXCI+PC9maWxlLXVwbG9hZD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInNlbGVjdGVkRmlsZSA/ICdkLW5vbmUnIDonY29sLTYnXCJcclxuICAgICAgICAgIGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCI+XHJcbiAgICAgICAgICA8c3ZnIHdpZHRoPVwiODBcIiBoZWlnaHQ9XCI4MFwiIHZpZXdCb3g9XCIwIDAgODAgODBcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgICAgPGNpcmNsZSBjeD1cIjQwXCIgY3k9XCI0MFwiIHI9XCI0MFwiIGZpbGw9XCIjRUFGOEZGXCIgLz5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTU1LjUwMDggMzQuMzc1SDUxLjM3NTJMNDcuNjI1OCAzOC4xMjUzSDQyLjM3NTJWMzQuMzc1SDMxLjEyNTJWNDkuMzc1M0gyNy4zNzU4QzI2Ljg3ODUgNDkuMzY3NiAyNi4zODQ2IDQ5LjQ1ODkgMjUuOTIyOSA0OS42NDM5QzI1LjQ2MTIgNDkuODI4OSAyNS4wNDA5IDUwLjEwMzkgMjQuNjg2NCA1MC40NTI4QzI0LjMzMiA1MC44MDE4IDI0LjA1MDYgNTEuMjE3OCAyMy44NTg0IDUxLjY3NjZDMjMuNjY2MyA1Mi4xMzUzIDIzLjU2NzQgNTIuNjI3OCAyMy41Njc0IDUzLjEyNTFDMjMuNTY3NCA1My42MjI1IDIzLjY2NjMgNTQuMTE0OSAyMy44NTg0IDU0LjU3MzdDMjQuMDUwNiA1NS4wMzI1IDI0LjMzMiA1NS40NDg1IDI0LjY4NjQgNTUuNzk3NUMyNS4wNDA5IDU2LjE0NjQgMjUuNDYxMiA1Ni40MjE0IDI1LjkyMjkgNTYuNjA2NEMyNi4zODQ2IDU2Ljc5MTQgMjYuODc4NSA1Ni44ODI3IDI3LjM3NTggNTYuODc1SDU1LjUwMDhDNTUuOTk4IDU2Ljg3NSA1Ni40NzQ4IDU2LjY3NzUgNTYuODI2NCA1Ni4zMjU5QzU3LjE3OCA1NS45NzQzIDU3LjM3NTUgNTUuNDk3NSA1Ny4zNzU1IDU1LjAwMDNWMzYuMjQ5N0M1Ny4zNzU1IDM1Ljc1MjUgNTcuMTc4IDM1LjI3NTcgNTYuODI2NCAzNC45MjQxQzU2LjQ3NDggMzQuNTcyNSA1NS45OTggMzQuMzc1IDU1LjUwMDggMzQuMzc1Wk0zMS4xMjUyIDI4Ljc1VjQ5LjM3NTNIMjcuMzc1OEMyNi4zODEzIDQ5LjM3NTMgMjUuNDI3NSA0OS43NzAzIDI0LjcyNDIgNTAuNDczNEMyNC4wMjA5IDUxLjE3NjUgMjMuNjI1NyA1Mi4xMzAyIDIzLjYyNTUgNTMuMTI0N1YzMi41MDAzQzIzLjYyNTUgMzEuNTA1NyAyNC4wMjA2IDMwLjU1MTggMjQuNzIzOSAyOS44NDg0QzI1LjQyNzIgMjkuMTQ1MSAyNi4zODExIDI4Ljc1IDI3LjM3NTggMjguNzVIMzEuMTI1MlpcIlxyXG4gICAgICAgICAgICAgIGZpbGw9XCIjRDBENUREXCIgLz5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTMxLjEyNTIgNDkuMzc1M1YzNC4zNzVINDIuMzc1MlYzOC4xMjUzSDQ3LjYyNThMNTEuMzc1MiAzNC4zNzVINTUuNTAwOEM1NS45OTggMzQuMzc1IDU2LjQ3NDggMzQuNTcyNSA1Ni44MjY0IDM0LjkyNDFDNTcuMTc4IDM1LjI3NTcgNTcuMzc1NSAzNS43NTI1IDU3LjM3NTUgMzYuMjQ5N1Y1NS4wMDAzQzU3LjM3NTUgNTUuNDk3NSA1Ny4xNzggNTUuOTc0MyA1Ni44MjY0IDU2LjMyNTlDNTYuNDc0OCA1Ni42Nzc1IDU1Ljk5OCA1Ni44NzUgNTUuNTAwOCA1Ni44NzVIMjcuMzc1OEMyNi44Nzg1IDU2Ljg4MjcgMjYuMzg0NiA1Ni43OTE0IDI1LjkyMjkgNTYuNjA2NEMyNS40NjEyIDU2LjQyMTQgMjUuMDQwOSA1Ni4xNDY0IDI0LjY4NjQgNTUuNzk3NUMyNC4zMzIgNTUuNDQ4NSAyNC4wNTA2IDU1LjAzMjUgMjMuODU4NCA1NC41NzM3QzIzLjY2NjMgNTQuMTE0OSAyMy41Njc0IDUzLjYyMjUgMjMuNTY3NCA1My4xMjUxQzIzLjU2NzQgNTIuNjI3OCAyMy42NjYzIDUyLjEzNTMgMjMuODU4NCA1MS42NzY2QzI0LjA1MDYgNTEuMjE3OCAyNC4zMzIgNTAuODAxOCAyNC42ODY0IDUwLjQ1MjhDMjUuMDQwOSA1MC4xMDM5IDI1LjQ2MTIgNDkuODI4OSAyNS45MjI5IDQ5LjY0MzlDMjYuMzg0NiA0OS40NTg5IDI2Ljg3ODUgNDkuMzY3NiAyNy4zNzU4IDQ5LjM3NTNNMzEuMTI1MiA0OS4zNzUzSDI3LjM3NThNMzEuMTI1MiA0OS4zNzUzVjI4Ljc1SDI3LjM3NThDMjYuMzgxMSAyOC43NSAyNS40MjcyIDI5LjE0NTEgMjQuNzIzOSAyOS44NDg0QzI0LjAyMDYgMzAuNTUxOCAyMy42MjU1IDMxLjUwNTcgMjMuNjI1NSAzMi41MDAzVjUzLjEyNDdDMjMuNjI1NyA1Mi4xMzAyIDI0LjAyMDkgNTEuMTc2NSAyNC43MjQyIDUwLjQ3MzRDMjUuNDI3NSA0OS43NzAzIDI2LjM4MTMgNDkuMzc1MyAyNy4zNzU4IDQ5LjM3NTNcIlxyXG4gICAgICAgICAgICAgIHN0cm9rZT1cIiM5OEEyQjNcIiBzdHJva2Utd2lkdGg9XCIwLjg0Mzc1XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBkPVwiTTU2LjgzMTcgMjYuMjkzTDU0LjIwNjQgMjMuNjY4NkM1My44NTYgMjMuMzI1MiA1My4zODQ5IDIzLjEzMjggNTIuODk0MiAyMy4xMzI4QzUyLjQwMzUgMjMuMTMyOCA1MS45MzI0IDIzLjMyNTIgNTEuNTgyIDIzLjY2ODZMNDIuMzc1IDMyLjg3NTZWMzguMTI1M0g0Ny42MjU2TDU2LjgzMTcgMjguOTE4M0M1Ny4xNzUxIDI4LjU2NzkgNTcuMzY3NSAyOC4wOTY4IDU3LjM2NzUgMjcuNjA2MUM1Ny4zNjc1IDI3LjExNTUgNTcuMTc1MSAyNi42NDM0IDU2LjgzMTcgMjYuMjkzWlwiXHJcbiAgICAgICAgICAgICAgZmlsbD1cIiMzM0I1RkZcIiAvPlxyXG4gICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0xIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJpc01hbnVhbFwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0zXCIgdHlwZT1cImNoZWNrYm94XCIgdmFsdWU9XCJcIiBpZD1cIm1hbnVhbFwiPlxyXG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwibWFudWFsXCI+Q3JlYXRlIG1hbnVhbGx5PC9sYWJlbD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIH1cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtYWN0aW9uc1wiPlxyXG4gICAgQGlmKGlzQ3JlYXRlU3RvcmVNb2RlKXtcclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWxpbmsgbWUtYXV0b1wiIChjbGljayk9XCJvbkJhY2soKVwiPkJhY2s8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwib25DYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBcIiBbZGlzYWJsZWRdPVwiY3JlYXRlU3RvcmVGb3JtLmludmFsaWRcIiAoY2xpY2spPVwib25DcmVhdGVTdG9yZSgpXCI+XHJcbiAgICAgICAgPHNwYW4gKm5nSWY9XCIhaXNCdXR0b25Mb2FkaW5nXCI+XHJcbiAgICAgICAgICBOZXh0XHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxzdmcgKm5nSWY9XCJpc0J1dHRvbkxvYWRpbmdcIiBjbGFzcz1cInNwaW5uZXJcIiB2aWV3Qm94PVwiMCAwIDUwIDUwXCI+XHJcbiAgICAgICAgICA8Y2lyY2xlIGNsYXNzPVwicGF0aFwiIGN4PVwiMjVcIiBjeT1cIjI1XCIgcj1cIjIwXCIgZmlsbD1cIm5vbmVcIiBzdHJva2Utd2lkdGg9XCI0XCI+PC9jaXJjbGU+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgfUBlbHNlIHtcclxuICAgICAgPGJ1dHRvbiAqbmdJZj1cIm5ld1N0b3JlRGV0YWlsc1wiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGluayBtZS1hdXRvXCIgKGNsaWNrKT1cIm9uQmFjaygpXCI+QmFjazwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uICpuZ0lmPVwiIW5ld1N0b3JlRGV0YWlsc1wiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZSBtZS1hdXRvXCIgKGNsaWNrKT1cImFkZE5ld1N0b3JlKClcIj5cclxuICAgICAgICA8c3ZnIHdpZHRoPVwiMTRcIiBoZWlnaHQ9XCIxNFwiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cclxuICAgICAgICAgIDxwYXRoIGQ9XCJNNi42NjgyOSAwLjgzNDk2MVYxMi41MDE2TTAuODM0OTYxIDYuNjY4MjlIMTIuNTAxNlwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCJcclxuICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgQ3JlYXRlIG5ldyBzdG9yZVxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwib25DYW5jZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBcIiBbZGlzYWJsZWRdPVwiIWlzVmFsaWRUb0NyZWF0ZVBsYW5vIHx8IGlzQnV0dG9uTG9hZGluZ1wiXHJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ3JlYXRlTGF5b3V0UGxhbm8oKVwiPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiIWlzQnV0dG9uTG9hZGluZ1wiPlxyXG4gICAgICAgICAge3tpc0xheW91dEV4aXN0ID8gICdPdmVyd3JpdGUnIDogJ0NyZWF0ZSd9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgPHN2ZyAqbmdJZj1cImlzQnV0dG9uTG9hZGluZyAmJiAhaXNDYWRQcm9jZXNzaW5nXCIgY2xhc3M9XCJzcGlubmVyXCIgdmlld0JveD1cIjAgMCA1MCA1MFwiPlxyXG4gICAgICAgICAgPGNpcmNsZSBjbGFzcz1cInBhdGhcIiBjeD1cIjI1XCIgY3k9XCIyNVwiIHI9XCIyMFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiNFwiPjwvY2lyY2xlPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIH1cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
|
|
440
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9vbmJvYXJkLXN0b3JlLXBsYW5vL2NyZWF0ZS1wbGFub2dyYW0vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90YW5nby1zdG9yZS1idWlsZGVyL3NyYy9saWIvY29tcG9uZW50cy9vbmJvYXJkLXN0b3JlLXBsYW5vL2NyZWF0ZS1wbGFub2dyYW0vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULEtBQUssRUFHTCxTQUFTLEdBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFrQixVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RSxPQUFPLEVBR0wsV0FBVyxFQUNYLG1CQUFtQixFQUVuQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFOUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDN0UsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDMUYsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFOUUsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixnQkFBZ0IsR0FFakIsTUFBTSxtQ0FBbUMsQ0FB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QUN0QixDQUFDO3lCQUNIO3FCQUNGOzBLQUdRLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRU4sc0JBQXNCO3NCQURyQixTQUFTO3VCQUFDLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEVsZW1lbnRSZWYsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBWaWV3Q2hpbGQsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgTmdiQWN0aXZlTW9kYWwsIE5nYlRvb2x0aXAgfSBmcm9tIFwiQG5nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcIjtcclxuaW1wb3J0IHtcclxuICBBYnN0cmFjdENvbnRyb2wsXHJcbiAgRm9ybUJ1aWxkZXIsXHJcbiAgRm9ybXNNb2R1bGUsXHJcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICBWYWxpZGF0b3JGbixcclxuICBWYWxpZGF0b3JzLFxyXG59IGZyb20gXCJAYW5ndWxhci9mb3Jtc1wiO1xyXG5pbXBvcnQgeyBOZ0NsYXNzLCBOZ0lmLCBUaXRsZUNhc2VQaXBlLCBVcHBlckNhc2VQaXBlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBUb2FzdFNlcnZpY2UgfSBmcm9tIFwidGFuZ28tYXBwLXVpLXNoYXJlZFwiO1xyXG5pbXBvcnQgeyBMb2FkZXIgfSBmcm9tIFwiQGdvb2dsZW1hcHMvanMtYXBpLWxvYWRlclwiO1xyXG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IE5neEdwQXV0b2NvbXBsZXRlTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyLW1hZ2ljL25neC1ncC1hdXRvY29tcGxldGVcIjtcclxuaW1wb3J0IHsgUmVhY3RpdmVTZWxlY3RDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vcmVhY3RpdmUtc2VsZWN0L3JlYWN0aXZlLXNlbGVjdC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgRmlsZVVwbG9hZENvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9maWxlLXVwbG9hZC9maWxlLXVwbG9hZC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHsgU3RvcmVCdWlsZGVyU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zZXJ2aWNlcy9zdG9yZS1idWlsZGVyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtcclxuICBnZW5lcmFsVmFsaWRhdG9yLFxyXG4gIGdldE5hbWVGcm9tRW1haWwsXHJcbiAgaW5kaWFuUGluY29kZVZhbGlkYXRvcixcclxufSBmcm9tIFwiLi4vLi4vLi4vZnVuY3Rpb25zL3BsYW5vLmZ1bmN0aW9uXCI7XHJcbmltcG9ydCBsb3R0aWUsIHsgQW5pbWF0aW9uSXRlbSB9IGZyb20gXCJsb3R0aWUtd2ViXCI7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJhcHAtY3JlYXRlLXBsYW5vZ3JhbVwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcIi4vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsOiBcIi4vY3JlYXRlLXBsYW5vZ3JhbS5jb21wb25lbnQuc2Nzc1wiLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgRm9ybXNNb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVTZWxlY3RDb21wb25lbnQsXHJcbiAgICBGaWxlVXBsb2FkQ29tcG9uZW50LFxyXG4gICAgTmdJZixcclxuICAgIE5neEdwQXV0b2NvbXBsZXRlTW9kdWxlLFxyXG4gICAgTmdiVG9vbHRpcCxcclxuICAgIFVwcGVyQ2FzZVBpcGUsXHJcbiAgICBUaXRsZUNhc2VQaXBlLFxyXG4gICAgTmdDbGFzcyxcclxuICBdLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgICBwcm92aWRlOiBMb2FkZXIsXHJcbiAgICAgIHVzZVZhbHVlOiBuZXcgTG9hZGVyKHtcclxuICAgICAgICBhcGlLZXk6IFwiQUl6YVN5QWZXUTlndUZzU1hvWUl1MlZGQnctWFEzVm51ZnZGQTNBXCIsXHJcbiAgICAgICAgbGlicmFyaWVzOiBbXCJwbGFjZXNcIl0sXHJcbiAgICAgIH0pLFxyXG4gICAgfSxcclxuICBdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ3JlYXRlUGxhbm9ncmFtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIEBJbnB1dCgpIGNsaWVudElkOiBzdHJpbmc7XHJcbiAgQFZpZXdDaGlsZChcImNhZFByb2Nlc3NpbmdMb3R0aWVcIilcclxuICBjYWRQcm9jZXNzaW5nTG90dGllUmVmPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XHJcblxyXG4gIHNlbGVjdGVkU3RvcmU6IHN0cmluZztcclxuICBzZWxlY3RlZEZsb29yOiBudW1iZXI7XHJcbiAgc2VsZWN0ZWRGaWxlOiBGaWxlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIHN0b3JlTGlzdDoge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgfVtdID0gW107XHJcblxyXG4gIGZsb29yTGlzdDoge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHZhbHVlOiBudW1iZXI7XHJcbiAgfVtdID0gW1xyXG4gICAgeyBsYWJlbDogXCJGbG9vciAxXCIsIHZhbHVlOiAxIH0sXHJcbiAgICB7IGxhYmVsOiBcIkZsb29yIDJcIiwgdmFsdWU6IDIgfSxcclxuICAgIHsgbGFiZWw6IFwiRmxvb3IgM1wiLCB2YWx1ZTogMyB9LFxyXG4gIF07XHJcblxyXG4gIHNlbGVjdGVkU3RvcmVGbG9vcnM6IGFueSA9IFtdO1xyXG5cclxuICBpc0xheW91dEV4aXN0OiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNCdXR0b25Mb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgaXNQb3B1cExvYWRpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0NhZFByb2Nlc3Npbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc0NyZWF0ZVN0b3JlTW9kZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG5ld1N0b3JlRGV0YWlsczogYW55O1xyXG4gIHByaXZhdGUgY2FkUHJvY2Vzc2luZ0FuaW1hdGlvbj86IEFuaW1hdGlvbkl0ZW07XHJcblxyXG4gIGNyZWF0ZVN0b3JlRm9ybTogYW55O1xyXG4gIHN0b3JlVHlwZUxpc3Q6IHtcclxuICAgIGxhYmVsOiBzdHJpbmc7XHJcbiAgICB2YWx1ZTogc3RyaW5nO1xyXG4gIH1bXSA9IFtcclxuICAgIHsgbGFiZWw6IFwiSGlnaCBTdHJlZXRcIiwgdmFsdWU6IFwiSGlnaCBTdHJlZXRcIiB9LFxyXG4gICAgeyBsYWJlbDogXCJNYWxsIFN0b3JlXCIsIHZhbHVlOiBcIk1hbGwgU3RvcmVcIiB9LFxyXG4gICAgeyBsYWJlbDogXCJLaW9za1wiLCB2YWx1ZTogXCJLaW9za1wiIH0sXHJcbiAgXTtcclxuXHJcbiAgYnVzaW5lc3NUeXBlTGlzdDoge1xyXG4gICAgbGFiZWw6IHN0cmluZztcclxuICAgIHZhbHVlOiBzdHJpbmc7XHJcbiAgfVtdID0gW1xyXG4gICAgeyBsYWJlbDogXCJDT0NPXCIsIHZhbHVlOiBcIkNPQ09cIiB9LFxyXG4gICAgeyBsYWJlbDogXCJDT0ZPXCIsIHZhbHVlOiBcIkNPRk9cIiB9LFxyXG4gICAgeyBsYWJlbDogXCJGT0ZPXCIsIHZhbHVlOiBcIkZPRk9cIiB9LFxyXG4gICAgeyBsYWJlbDogXCJGT0NPXCIsIHZhbHVlOiBcIkZPQ09cIiB9LFxyXG4gIF07XHJcblxyXG4gIGlzTWFudWFsOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBhY3RpdmVNb2RhbDogTmdiQWN0aXZlTW9kYWwsXHJcbiAgICBwcml2YXRlIHN0b3JlQnVpbGRlclNlcnZpY2U6IFN0b3JlQnVpbGRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgKSB7fVxyXG5cclxuICBhc3luYyBuZ09uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGF3YWl0IHRoaXMuZ2V0U3RvcmVMaXN0KCk7XHJcbiAgfVxyXG5cclxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZGVzdHJveUNhZFByb2Nlc3NpbmdBbmltYXRpb24oKTtcclxuICB9XHJcblxyXG4gIGdldCBpc1ZhbGlkVG9DcmVhdGVQbGFubygpIHtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRTdG9yZSAmJlxyXG4gICAgICB0aGlzLnNlbGVjdGVkRmxvb3IgJiZcclxuICAgICAgKHRoaXMuc2VsZWN0ZWRGaWxlIHx8IHRoaXMuaXNNYW51YWwpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGlzTW9kYWxCdXN5KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXNQb3B1cExvYWRpbmcgfHwgdGhpcy5pc0J1dHRvbkxvYWRpbmcgfHwgdGhpcy5pc0NhZFByb2Nlc3Npbmc7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRTdG9yZUxpc3QoKSB7XHJcbiAgICB0aGlzLmlzUG9wdXBMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IHN0b3JlczogYW55ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmdldEFsbFN0b3Jlcyh0aGlzLmNsaWVudElkKSxcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zdG9yZUxpc3QgPSBzdG9yZXM/LmRhdGE/Lm1hcCgoczogYW55KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHsgbGFiZWw6IHMuc3RvcmVOYW1lLCB2YWx1ZTogcy5zdG9yZUlkIH07XHJcbiAgICAgIH0pO1xyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgY29uc29sZS5sb2coXCJAQCB+IGdldFN0b3JlTGlzdCBbRVJSXTpcIiwgZXJyb3IpO1xyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5pc1BvcHVwTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgfSBcclxuICB9XHJcblxyXG4gIGFzeW5jIG9uU3RvcmVDaGFuZ2UoKSB7XHJcbiAgICBpZiAodGhpcy5pc01vZGFsQnVzeSB8fCAhdGhpcy5zZWxlY3RlZFN0b3JlKSByZXR1cm47XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZmxvb3JzOiBhbnkgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UuZ2V0U3RvcmVGbG9vcnNMaXN0KHRoaXMuc2VsZWN0ZWRTdG9yZSksXHJcbiAgICAgICk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRTdG9yZUZsb29ycyA9IGZsb29ycz8uZGF0YSA/PyBbXTtcclxuICAgICAgdGhpcy5vbkZsb29yQ2hhbmdlKCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gZ2V0U3RvcmVMaXN0IFtFUlJdOlwiLCBlcnJvcik7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkZsb29yQ2hhbmdlKCkge1xyXG4gICAgaWYgKHRoaXMuaXNNb2RhbEJ1c3kpIHJldHVybjtcclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZEZsb29yKSB7XHJcbiAgICAgIHRoaXMuaXNMYXlvdXRFeGlzdCA9IHRoaXMuc2VsZWN0ZWRTdG9yZUZsb29ycy5zb21lKFxyXG4gICAgICAgIChmOiBhbnkpID0+IGYuZmxvb3JOdW1iZXIgPT09IHRoaXMuc2VsZWN0ZWRGbG9vcixcclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNMYXlvdXRFeGlzdCA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25GaWxlQ2hhbmdlKGZpbGU6IEZpbGUgfCBudWxsKSB7XHJcbiAgICBpZiAodGhpcy5pc01vZGFsQnVzeSkgcmV0dXJuO1xyXG4gICAgdGhpcy5zZWxlY3RlZEZpbGUgPSBmaWxlO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25DcmVhdGVMYXlvdXRQbGFubygpIHtcclxuICAgIGlmICh0aGlzLmlzTW9kYWxCdXN5KSByZXR1cm47XHJcbiAgICBpZiAoIXRoaXMuaXNWYWxpZFRvQ3JlYXRlUGxhbm8pIHJldHVybjtcclxuXHJcbiAgICBjb25zdCBoYXNDYWRGaWxlID0gISF0aGlzLnNlbGVjdGVkRmlsZTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICB0aGlzLmlzQnV0dG9uTG9hZGluZyA9IHRydWU7XHJcbiAgICAgIGlmIChoYXNDYWRGaWxlKSB7XHJcbiAgICAgICAgdGhpcy5zaG93Q2FkUHJvY2Vzc2luZ0xvYWRlcigpO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCBwbGFub1JlczogYW55O1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZEZpbGUpIHtcclxuICAgICAgICBjb25zdCBzdG9yZU5hbWUgPSB0aGlzLnN0b3JlTGlzdC5maW5kKFxyXG4gICAgICAgICAgKHMpID0+IHMudmFsdWUgPT09IHRoaXMuc2VsZWN0ZWRTdG9yZSxcclxuICAgICAgICApPy5sYWJlbDtcclxuICAgICAgICBwbGFub1JlcyA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmNyZWF0ZVBsYW5vRnJvbUNBRChcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEZpbGUhLFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkU3RvcmUsXHJcbiAgICAgICAgICAgIHN0b3JlTmFtZSA/PyB0aGlzLnNlbGVjdGVkU3RvcmUsXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRGbG9vcixcclxuICAgICAgICAgICksXHJcbiAgICAgICAgKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwbGFub1JlcyA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgICAgdGhpcy5zdG9yZUJ1aWxkZXJTZXJ2aWNlLmNyZWF0ZUVtcHR5UGxhbm8oe1xyXG4gICAgICAgICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgICAgICAgc3RvcmVJZDogdGhpcy5zZWxlY3RlZFN0b3JlLFxyXG4gICAgICAgICAgICBmbG9vck51bWJlcjogdGhpcy5zZWxlY3RlZEZsb29yLFxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFwbGFub1Jlcz8uZGF0YSkgcmV0dXJuO1xyXG4gICAgICB0aGlzLmFjdGl2ZU1vZGFsLmNsb3NlKHBsYW5vUmVzPy5kYXRhKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcclxuICAgICAgdGhpcy50b2FzdFNlcnZpY2UuZ2V0RXJyb3JUb2FzdChcclxuICAgICAgICBlcnJvcj8uZXJyb3I/LmVycm9yPy5lcnJNc2cgPz8gXCJGYWlsZWQgdG8gZXh0cmFjdCBwbGFubyBmcm9tIENBRCBmaWxlLlwiLFxyXG4gICAgICApO1xyXG4gICAgICBjb25zb2xlLmxvZyhcIkBAIH4gb25DcmVhdGUgW0VSUl06XCIsIGVycm9yKTtcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgIHRoaXMuaXNCdXR0b25Mb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgIGlmIChoYXNDYWRGaWxlKSB7XHJcbiAgICAgICAgdGhpcy5oaWRlQ2FkUHJvY2Vzc2luZ0xvYWRlcigpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNob3dDYWRQcm9jZXNzaW5nTG9hZGVyKCkge1xyXG4gICAgdGhpcy5pc0NhZFByb2Nlc3NpbmcgPSB0cnVlO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmxvYWRDYWRQcm9jZXNzaW5nQW5pbWF0aW9uKCksIDApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoaWRlQ2FkUHJvY2Vzc2luZ0xvYWRlcigpIHtcclxuICAgIHRoaXMuaXNDYWRQcm9jZXNzaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLmRlc3Ryb3lDYWRQcm9jZXNzaW5nQW5pbWF0aW9uKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxvYWRDYWRQcm9jZXNzaW5nQW5pbWF0aW9uKCkge1xyXG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5jYWRQcm9jZXNzaW5nTG90dGllUmVmPy5uYXRpdmVFbGVtZW50O1xyXG4gICAgaWYgKCFjb250YWluZXIpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmRlc3Ryb3lDYWRQcm9jZXNzaW5nQW5pbWF0aW9uKCk7XHJcbiAgICB0aGlzLmNhZFByb2Nlc3NpbmdBbmltYXRpb24gPSBsb3R0aWUubG9hZEFuaW1hdGlvbih7XHJcbiAgICAgIGNvbnRhaW5lcixcclxuICAgICAgcmVuZGVyZXI6IFwic3ZnXCIsXHJcbiAgICAgIGxvb3A6IHRydWUsXHJcbiAgICAgIGF1dG9wbGF5OiB0cnVlLFxyXG4gICAgICBwYXRoOiBcImFzc2V0cy9hbmltYXRpb25zL3N0cmluZ19sb2FkaW5nLmpzb25cIixcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkZXN0cm95Q2FkUHJvY2Vzc2luZ0FuaW1hdGlvbigpIHtcclxuICAgIHRoaXMuY2FkUHJvY2Vzc2luZ0FuaW1hdGlvbj8uZGVzdHJveSgpO1xyXG4gICAgdGhpcy5jYWRQcm9jZXNzaW5nQW5pbWF0aW9uID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25DcmVhdGVTdG9yZSgpIHtcclxuICAgIGlmICh0aGlzLmlzTW9kYWxCdXN5KSByZXR1cm47XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgdGhpcy5pc0J1dHRvbkxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICBjb25zdCBzcG9jVXNlciA9IGF3YWl0IHRoaXMuZ2V0U3BvY1VzZXJEZXRhaWxzKFxyXG4gICAgICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlLnN0b3JlTmFtZS50cmltKCksXHJcbiAgICAgICk7XHJcblxyXG4gICAgICBpZiAoIXNwb2NVc2VyKSByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCBjcmVhdGVTdG9yZVBheWxvYWQgPSB7XHJcbiAgICAgICAgc3RvcmVOYW1lOiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZS5zdG9yZU5hbWU/LnRvVXBwZXJDYXNlKCk/LnRyaW0oKSxcclxuICAgICAgICBjbGllbnRJZDogdGhpcy5jbGllbnRJZCxcclxuICAgICAgICBidXNpbmVzc1R5cGU6IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlLmJ1c2luZXNzVHlwZSxcclxuICAgICAgICBjbHVzdGVyOiBbXSxcclxuICAgICAgICBzdG9yZVR5cGU6IHtcclxuICAgICAgICAgIHR5cGU6IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlLnN0b3JlVHlwZSxcclxuICAgICAgICAgIG5hbWU6IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlPy5zdG9yZVR5cGVOYW1lPy50cmltKCksXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzdG9yZVByb2ZpbGU6IHtcclxuICAgICAgICAgIHN0b3JlQ29kZTogdGhpcy5jcmVhdGVTdG9yZUZvcm0/LnZhbHVlPy5zdG9yZUNvZGUsXHJcbiAgICAgICAgICBhZGRyZXNzOiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZT8uYWRkcmVzcyxcclxuICAgICAgICAgIGNvdW50cnk6IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlPy5jb3VudHJ5LFxyXG4gICAgICAgICAgc3RhdGU6IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlPy5zdGF0ZSxcclxuICAgICAgICAgIGNpdHk6IHRoaXMuY3JlYXRlU3RvcmVGb3JtLnZhbHVlPy5jaXR5LFxyXG4gICAgICAgICAgcGluY29kZTogdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWU/LnBpbmNvZGUsXHJcbiAgICAgICAgICBsYXRpdHVkZTogdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWUubGF0aXR1ZGU/LnRvU3RyaW5nKCkudHJpbSgpXHJcbiAgICAgICAgICAgID8gdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWUubGF0aXR1ZGVcclxuICAgICAgICAgICAgOiAwLFxyXG4gICAgICAgICAgbG9uZ2l0dWRlOiB0aGlzLmNyZWF0ZVN0b3JlRm9ybS52YWx1ZS5sb25naXR1ZGU/LnRvU3RyaW5nKCkudHJpbSgpXHJcbiAgICAgICAgICAgID8gdGhpcy5jcmVhdGVTdG9yZUZvcm0udmFsdWUubG9uZ2l0dWRlXHJcbiAgICAgICAgICAgIDogMCxcclxuICAgICAgICAgIHRpbWVab25lOiBcIkFzaWEvS29sa2F0YVwiLFxyXG4gICAgICAgICAgb3BlbjogXCIxMDowMDowMFwiLFxyXG4gICAgICAgICAgY2xvc2U6IFwiMjA6MDA6MDBcIixcclxuICAgICAgICB9LFxyXG4gICAgICAgIGVkZ2U6IHtcclxuICAgICAgICAgIHNlcnZlclR5cGU6IGZhbHNlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc3BvY0RldGFpbHM6IFtzcG9jVXNlcl0sXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxyXG4gICAgICAgIHRoaXMuc3RvcmVCdWlsZGVyU2VydmljZS5jcmVhdGVTdG9yZShjcmVhdGVTdG9yZVBheWxvYWQpLFxyXG4gICAgICApO1xyXG5cclxuICAgICAgY29uc3QgbmV3U3RvcmUgPSByZXM/LmRhdGE/LnN0b3JlO1xyXG5cclxuICAgICAgaWYgKG5ld1N0b3JlICYmIG5ld1N0b3JlPy5zdG9yZUlkKSB7XHJcbiAgICAgICAgY29uc3QgdGlja2V0UmVzID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXHJcbiAgICAgICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2UuY3JlYXRlSW5mcmFUaWNrZXQoe1xyXG4gICAgICAgICAgICBzdG9yZUlkOiByZXM/LmRhdGE/LnN0b3JlPy5zdG9yZUlkLFxyXG4gICAgICAgICAgICBEYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdLFxyXG4gICAgICAgICAgICBpc3N1ZVR5cGU6IFwiaW5zdGFsbGF0aW9uXCIsXHJcbiAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBpZiAodGlja2V0UmVzKSB7XHJcbiAgICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRTdWNjZXNzVG9hc3QoXCJTdG9yZSBjcmVhdGVkIHN1Y2Nlc3NmdWxseVwiKTtcclxuICAgICAgICAgIHRoaXMuc3RvcmVMaXN0LnB1c2goe1xyXG4gICAgICAgICAgICBsYWJlbDogbmV3U3RvcmUuc3RvcmVOYW1lLFxyXG4gICAgICAgICAgICB2YWx1ZTogbmV3U3RvcmUuc3RvcmVJZCxcclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRTdG9yZSA9IG5ld1N0b3JlLnN0b3JlSWQ7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkRmxvb3IgPSB0aGlzLmNyZWF0ZVN0b3JlRm9ybS5nZXQoXCJmbG9vclwiKT8udmFsdWUgPz8gMTtcclxuICAgICAgICAgIHRoaXMubmV3U3RvcmVEZXRhaWxzID0gY3JlYXRlU3RvcmVQYXlsb2FkO1xyXG4gICAgICAgICAgdGhpcy5pc0NyZWF0ZVN0b3JlTW9kZSA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFwiVW5hYmxlIHRvIGNyZWF0ZSBzdG9yZVwiKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xyXG4gICAgICBpZiAoZXJyb3I/LmVycm9yPy5lcnJvcj8uZXJyb3IgPT09IFwiU3RvcmVOYW1lIGFscmVhZHkgZXhpc3RzXCIpIHtcclxuICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFwiU3RvcmUgTmFtZSBhbHJlYWR5IGV4aXN0c1wiKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnRvYXN0U2VydmljZS5nZXRFcnJvclRvYXN0KFwiRmFpbGVkIHRvIGNyZWF0ZSBzdG9yZVwiKTtcclxuICAgICAgfVxyXG4gICAgfSBmaW5hbGx5IHtcclxuICAgICAgdGhpcy5pc0J1dHRvbkxvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGdldFNwb2NVc2VyRGV0YWlscyhzdG9yZU5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3Qgc2FmZVN0b3JlTmFtZSA9IHN0b3JlTmFtZVxyXG4gICAgICA/LnRvTG93ZXJDYXNlKClcclxuICAgICAgLnRyaW0oKVxyXG4gICAgICAucmVwbGFjZSgvXFxzKy9nLCBcIl9cIilcclxuICAgICAgLnJlcGxhY2UoL1teYS16MC05Ll8tXS9nLCBcIlwiKTtcclxuXHJcbiAgICBjb25zdCBlbWFpbCA9XHJcbiAgICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtLmdldChcImVtYWlsXCIpPy52YWx1ZT8udG9Mb3dlckNhc2UoKSB8fFxyXG4gICAgICBgJHtzYWZlU3RvcmVOYW1lfV9wbGFub2dyYW1AbGVuc2thcnQuY29tYDtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShcclxuICAgICAgICB0aGlzLnN0b3JlQnVpbGRlclNlcnZpY2Uuc3BvY0VtYWlsQ2hlY2soe1xyXG4gICAgICAgICAgY2xpZW50SWQ6IHRoaXMuY2xpZW50SWQsXHJcbiAgICAgICAgICBlbWFpbDogW2VtYWlsXSxcclxuICAgICAgICB9KSxcclxuICAgICAgKTtcclxuICAgICAgaWYgKHJlc3VsdCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBuYW1lOiBnZXROYW1lRnJvbUVtYWlsKGVtYWlsKSxcclxuICAgICAgICAgIGVtYWlsOiBlbWFpbCxcclxuICAgICAgICAgIGNvbnRhY3Q6IFwiOTk5OTk5OTk5OVwiLFxyXG4gICAgICAgIH07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiQEAgfiBnZXRTcG9jVXNlckRldGFpbHMgW0VSUl06IFwiLCBlcnJvcik7XHJcbiAgICAgIHRoaXMudG9hc3RTZXJ2aWNlLmdldEVycm9yVG9hc3QoXHJcbiAgICAgICAgZXJyb3I/LmVycm9yPy5lcnJvciA/PyBcIlVuYWJsZSB0byBjcmVhdGUgVXNlclwiLFxyXG4gICAgICApO1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFkZE5ld1N0b3JlKCkge1xyXG4gICAgaWYgKHRoaXMuaXNNb2RhbEJ1c3kpIHJldHVybjtcclxuXHJcbiAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBzdG9yZU5hbWU6IFtcclxuICAgICAgICBcIlwiLFxyXG4gICAgICAgIFtcclxuICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgICAgICB0aGlzLnN0b3JlTmFtZVZhbGlkYXRvcigpLFxyXG4gICAgICAgICAgdGhpcy5zdG9yZU5hbWVFeGlzdHNWYWxpZGF0b3IoKSxcclxuICAgICAgICAgIGdlbmVyYWxWYWxpZGF0b3IoKSxcclxuICAgICAgICBdLFxyXG4gICAgICBdLFxyXG4gICAgICBlbWFpbDogW1wiXCIsIFZhbGlkYXRvcnMuZW1haWxdLFxyXG4gICAgICBmbG9vcjogWzFdLFxyXG4gICAgICBidXNpbmVzc1R5cGU6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgc3RvcmVUeXBlOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHN0b3JlVHlwZU5hbWU6IFtcIlwiLCBnZW5lcmFsVmFsaWRhdG9yKCldLFxyXG4gICAgICBhZGRyZXNzOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIGNvdW50cnk6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgc3RhdGU6IFtcIlwiLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgY2l0eTogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBwaW5jb2RlOiBbXHJcbiAgICAgICAgXCJcIixcclxuICAgICAgICBbXHJcbiAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICAgICAgLy8gIGluZGlhblBpbmNvZGVWYWxpZGF0b3IoKVxyXG4gICAgICAgIF0sXHJcbiAgICAgIF0sXHJcbiAgICAgIGxhdGl0dWRlOiBbXCJcIl0sXHJcbiAgICAgIGxvbmdpdHVkZTogW1wiXCJdLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5pc0NyZWF0ZVN0b3JlTW9kZSA9IHRydWU7XHJcblxyXG4gICAgdGhpcy5jcmVhdGVTdG9yZUZvcm1cclxuICAgICAgLmdldChcInN0b3JlVHlwZVwiKVxyXG4gICAgICA/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAodmFsdWUgIT09IFwiTWFsbCBTdG9yZVwiKSB7XHJcbiAgICAgICAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybS5nZXQoXCJzdG9yZVR5cGVOYW1lXCIpPy5yZXNldCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5jcmVhdGVTdG9yZUZvcm1cclxuICAgICAgLmdldChcInN0b3JlTmFtZVwiKVxyXG4gICAgICA/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgIGNvbnN0IHVwcGVyID0gdmFsdWUudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdXBwZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVTdG9yZUZvcm1cclxuICAgICAgICAgICAgICAuZ2V0KFwic3RvcmVOYW1lXCIpXHJcbiAgICAgICAgICAgICAgPy5zZXRWYWx1ZSh1cHBlciwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgLy8gY29uc3QgdXJsVHJlZSA9IHRoaXMucm91dGVyLmNyZWF0ZVVybFRyZWUoW1wiL21hbmFnZS9zdG9yZXMvYWRkLXNpbmdsZS1zdG9yZVwiXSk7XHJcbiAgICAvLyBjb25zdCB1cmwgPSB0aGlzLnJvdXRlci5zZXJpYWxpemVVcmwodXJsVHJlZSk7XHJcbiAgICAvLyB3aW5kb3cub3Blbih1cmwsIFwiX2JsYW5rXCIpO1xyXG4gIH1cclxuXHJcbiAgc3RvcmVOYW1lRXhpc3RzVmFsaWRhdG9yID0gKCk6IFZhbGlkYXRvckZuID0+IHtcclxuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gY29udHJvbC52YWx1ZTtcclxuICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIG51bGw7IC8vIGFsbG93IHJlcXVpcmVkIHZhbGlkYXRvciB0byBoYW5kbGUgZW1wdHlcclxuXHJcbiAgICAgIGNvbnN0IHRyaW1tZWQgPSB2YWx1ZS50cmltKCkudG9Mb2NhbGVMb3dlckNhc2UoKTtcclxuXHJcbiAgICAgIGNvbnN0IHMgPSB0aGlzLnN0b3JlTGlzdC5maW5kKFxyXG4gICAgICAgIChzKSA9PiBzPy5sYWJlbD8udHJpbSgpPy50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSB0cmltbWVkLFxyXG4gICAgICApO1xyXG4gICAgICBpZiAocykgcmV0dXJuIHsgZXhpc3RzOiB0cnVlIH07XHJcblxyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH07XHJcbiAgfTtcclxuXHJcbiAgc3RvcmVOYW1lVmFsaWRhdG9yKCk6IFZhbGlkYXRvckZuIHtcclxuICAgIHJldHVybiAoY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XHJcbiAgICAgIGlmICghY29udHJvbC52YWx1ZSkgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWUudG9VcHBlckNhc2UoKTtcclxuXHJcbiAgICAgIGNvbnN0IHN0UGF0dGVybiA9IC9eU1RcXGR7NH0kLzsgLy8gU1QxMjM0XHJcbiAgICAgIGNvbnN0IGxrc3RQYXR0ZXJuID0gL15MS1NUXFxkezR9JC87IC8vIExLU1QxMjM0XHJcblxyXG4gICAgICBjb25zdCBpc1ZhbGlkID0gc3RQYXR0ZXJuLnRlc3QodmFsdWUpIHx8IGxrc3RQYXR0ZXJuLnRlc3QodmFsdWUpO1xyXG5cclxuICAgICAgcmV0dXJuIGlzVmFsaWQgPyBudWxsIDogeyBpbnZhbGlkU3RvcmVOYW1lOiB0cnVlIH07XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgb25BZGRyZXNzQ2hhbmdlKHBsYWNlOiBnb29nbGUubWFwcy5wbGFjZXMuUGxhY2VSZXN1bHQgfCBhbnkpIHtcclxuICAgIGlmICh0aGlzLmlzTW9kYWxCdXN5IHx8ICF0aGlzLmNyZWF0ZVN0b3JlRm9ybSB8fCAhcGxhY2U/Lmdlb21ldHJ5KSByZXR1cm47XHJcblxyXG4gICAgbGV0IGNvdW50cnkgPSBcIlwiLFxyXG4gICAgICBjaXR5ID0gXCJcIixcclxuICAgICAgc3RhdGUgPSBcIlwiLFxyXG4gICAgICBwaW5jb2RlID0gXCJcIjtcclxuXHJcbiAgICBsZXQgbGF0aXR1ZGUgPSBwbGFjZS5nZW9tZXRyeS5sb2NhdGlvbi5sYXQoKTtcclxuICAgIGxldCBsb25naXR1ZGUgPSBwbGFjZS5nZW9tZXRyeS5sb2NhdGlvbi5sbmcoKTtcclxuXHJcbiAgICBwbGFjZS5hZGRyZXNzX2NvbXBvbmVudHMuZm9yRWFjaCgoY29tcG9uZW50OiBhbnkpID0+IHtcclxuICAgICAgaWYgKGNvbXBvbmVudC50eXBlcy5pbmNsdWRlcyhcImNvdW50cnlcIikpIHtcclxuICAgICAgICBjb3VudHJ5ID0gY29tcG9uZW50LmxvbmdfbmFtZTtcclxuICAgICAgfSBlbHNlIGlmIChjb21wb25lbnQudHlwZXMuaW5jbHVkZXMoXCJsb2NhbGl0eVwiKSkge1xyXG4gICAgICAgIGNpdHkgPSBjb21wb25lbnQubG9uZ19uYW1lO1xyXG4gICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudC50eXBlcy5pbmNsdWRlcyhcImFkbWluaXN0cmF0aXZlX2FyZWFfbGV2ZWxfMVwiKSkge1xyXG4gICAgICAgIHN0YXRlID0gY29tcG9uZW50LmxvbmdfbmFtZTtcclxuICAgICAgfSBlbHNlIGlmIChjb21wb25lbnQudHlwZXMuaW5jbHVkZXMoXCJwb3N0YWxfY29kZVwiKSkge1xyXG4gICAgICAgIHBpbmNvZGUgPSBjb21wb25lbnQubG9uZ19uYW1lO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybS5nZXQoXCJhZGRyZXNzXCIpPy5zZXRWYWx1ZShwbGFjZS5mb3JtYXR0ZWRfYWRkcmVzcyk7XHJcbiAgICB0aGlzLmNyZWF0ZVN0b3JlRm9ybS5nZXQoXCJjb3VudHJ5XCIpPy5zZXRWYWx1ZShjb3VudHJ5KTtcclxuICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtLmdldChcImNpdHlcIik/LnNldFZhbHVlKGNpdHkpO1xyXG4gICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0uZ2V0KFwic3RhdGVcIik/LnNldFZhbHVlKHN0YXRlKTtcclxuICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtLmdldChcInBpbmNvZGVcIik/LnNldFZhbHVlKHBpbmNvZGUpO1xyXG4gICAgdGhpcy5jcmVhdGVTdG9yZUZvcm0uZ2V0KFwibGF0aXR1ZGVcIik/LnNldFZhbHVlKGxhdGl0dWRlKTtcclxuICAgIHRoaXMuY3JlYXRlU3RvcmVGb3JtLmdldChcImxvbmdpdHVkZVwiKT8uc2V0VmFsdWUobG9uZ2l0dWRlKTtcclxuICB9XHJcblxyXG4gIG9uQ2FuY2VsKCkge1xyXG4gICAgaWYgKHRoaXMuaXNNb2RhbEJ1c3kpIHJldHVybjtcclxuICAgIHRoaXMuYWN0aXZlTW9kYWwuZGlzbWlzcygpO1xyXG4gIH1cclxuXHJcbiAgb25CYWNrKCkge1xyXG4gICAgaWYgKHRoaXMuaXNNb2RhbEJ1c3kpIHJldHVybjtcclxuICAgIHRoaXMuaXNDcmVhdGVTdG9yZU1vZGUgPSBmYWxzZTtcclxuICAgIHRoaXMubmV3U3RvcmVEZXRhaWxzID0gbnVsbDtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cIm1vZGFsLXdyYXBwZXJcIj5cclxuICA8ZGl2ICpuZ0lmPVwiaXNQb3B1cExvYWRpbmdcIiBjbGFzcz1cIm1vZGFsLWxvYWRlci1vdmVybGF5XCI+XHJcbiAgICA8c3ZnIGNsYXNzPVwibW9kYWwtc3Bpbm5lclwiIHZpZXdCb3g9XCIwIDAgNTAgNTBcIj5cclxuICAgICAgPGNpcmNsZSBjbGFzcz1cInBhdGhcIiBjeD1cIjI1XCIgY3k9XCIyNVwiIHI9XCIyMFwiIGZpbGw9XCJub25lXCIgc3Ryb2tlLXdpZHRoPVwiNFwiPjwvY2lyY2xlPlxyXG4gICAgPC9zdmc+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxoMyBjbGFzcz1cIm1iLTNcIj5DcmVhdGUgc3RvcmUgbGF5b3V0L3BsYW4gZnJvbSBDQUQ8L2gzPlxyXG4gIEBpZihpc0NyZWF0ZVN0b3JlTW9kZSl7XHJcbiAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsZ24taXRlbXMtY2VudGVyIGdhcC0yXCI+XHJcbiAgICAgIDxwPlN0ZXAgMTogT25ib2FyZCBzdG9yZSB3aXRoIGJhc2ljIGRldGFpbHM8L3A+XHJcbiAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXHJcbiAgICAgICAgbmdiVG9vbHRpcD1cIkEgbmV3IHN0b3JlIHdpbGwgYmUgY3JlYXRlZCB3aGVuIHlvdSBwZXJmb3JtIHRoaXMgYWN0aW9uIChNYW5hZ2UgPiBTdG9yZXMpLlwiPlxyXG4gICAgICAgIDxwYXRoXHJcbiAgICAgICAgICBkPVwiTTEwLjAwMDMgMTMuMzMzN1YxMC4wMDAzTTEwLjAwMDMgNi42NjY5OUgxMC4wMDg3TTE4LjMzMzcgMTAuMDAwM0MxOC4zMzM3IDE0LjYwMjcgMTQuNjAyNyAxOC4zMzM3IDEwLjAwMDMgMTguMzMzN0M1LjM5Nzk1IDE4LjMzMzcgMS42NjY5OSAxNC42MDI3IDEuNjY2OTkgMTAuMDAwM0MxLjY2Njk5IDUuMzk3OTUgNS4zOTc5NSAxLjY2Njk5IDEwLjAwMDMgMS42NjY5OUMxNC42MDI3IDEuNjY2OTkgMTguMzMzNyA1LjM5Nzk1IDE4LjMzMzcgMTAuMDAwM1pcIlxyXG4gICAgICAgICAgc3Ryb2tlPVwiIzEwMTgyOFwiIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICA8L3N2Zz5cclxuICAgIDwvZGl2PlxyXG4gIH1cclxuXHJcblxyXG4gIEBpZihpc0NyZWF0ZVN0b3JlTW9kZSl7XHJcbiAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImNyZWF0ZVN0b3JlRm9ybVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTRcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJzdG9yZU5hbWVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlN0b3JlIG5hbWU8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJzdG9yZU5hbWVcIiBmb3JtQ29udHJvbE5hbWU9XCJzdG9yZU5hbWVcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJUeXBlIHN0b3JlIG5hbWUuIGVnOiBMS1NUMTIzNFwiIFtkaXNhYmxlZF09XCJpc01vZGFsQnVzeVwiIC8+XG5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZU5hbWUnKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZU5hbWUnKT8uaW52YWxpZFwiPlxyXG5cclxuICAgICAgICAgICAgQGlmKGNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlTmFtZScpPy5oYXNFcnJvcignZXhpc3RzJykpe1xyXG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XHJcbiAgICAgICAgICAgICAgICBTdG9yZSBhbHJlYWR5IGV4aXN0cy5cclxuICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICB9QGVsc2Uge1xyXG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZU5hbWUnKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICAgIFN0b3JlIG5hbWUgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RvcmVOYW1lJyk/Lmhhc0Vycm9yKCd3aGl0ZXNwYWNlJylcIj5cclxuICAgICAgICAgICAgICAgIFN0b3JlIG5hbWUgY2Fubm90IGJlIG9ubHkgd2hpdGVzcGFjZS5cclxuICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZU5hbWUnKT8uaGFzRXJyb3IoJ3RyaW1TcGFjZXMnKVwiPlxyXG4gICAgICAgICAgICAgICAgTm8gbGVhZGluZyBvciB0cmFpbGluZyB3aGl0ZXNwYWNlIGFsbG93ZWQuXHJcbiAgICAgICAgICAgICAgPC9zbWFsbD5cclxuXHJcbiAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlTmFtZScpPy5oYXNFcnJvcignaW52YWxpZFN0b3JlTmFtZScpIFwiPlxyXG4gICAgICAgICAgICAgICAgU3RvcmUgbmFtZSBtdXN0IGJlIFNUMTIzNCBvciBMS1NUMTIzNCBmb3JtYXQuXHJcbiAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi00XCI+XG4gICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cImZsb29yTGlzdFwiIFtsYWJlbF09XCInU2VsZWN0IGZsb29yJ1wiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJmbG9vclwiIFtkaXNhYmxlZF09XCJpc01vZGFsQnVzeVwiPlxuICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTRcIj5cbiAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwiYnVzaW5lc3NUeXBlTGlzdFwiXG4gICAgICAgICAgICBbbGFiZWxdPVwiJ1NlbGVjdCBidXNpbmVzcyB0eXBlJ1wiIGZvcm1Db250cm9sTmFtZT1cImJ1c2luZXNzVHlwZVwiIFtkaXNhYmxlZF09XCJpc01vZGFsQnVzeVwiPlxuICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTRcIj5cbiAgICAgICAgICA8bGliLXJlYWN0aXZlLXNlbGVjdCBbaWRGaWVsZF09XCIndmFsdWUnXCIgW25hbWVGaWVsZF09XCInbGFiZWwnXCIgW2RhdGFdPVwic3RvcmVUeXBlTGlzdFwiXG4gICAgICAgICAgICBbbGFiZWxdPVwiJ1NlbGVjdCBzdG9yZSB0eXBlJ1wiIGZvcm1Db250cm9sTmFtZT1cInN0b3JlVHlwZVwiIFtkaXNhYmxlZF09XCJpc01vZGFsQnVzeVwiPlxuICAgICAgICAgIDwvbGliLXJlYWN0aXZlLXNlbGVjdD5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgQGlmKGNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlVHlwZScpPy52YWx1ZSA9PSAnTWFsbCBTdG9yZScpe1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgbWItNFwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cInN0b3JlVHlwZU5hbWVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkVudGVyIE1hbGwgbmFtZTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwic3RvcmVUeXBlTmFtZVwiIGZvcm1Db250cm9sTmFtZT1cInN0b3JlVHlwZU5hbWVcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIE1hbGwgbmFtZVwiIFtkaXNhYmxlZF09XCJpc01vZGFsQnVzeVwiIC8+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdG9yZVR5cGVOYW1lJyk/LnRvdWNoZWQgJiYgY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RvcmVUeXBlTmFtZScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3N0b3JlVHlwZU5hbWUnKT8uaGFzRXJyb3IoJ3doaXRlc3BhY2UnKVwiPlxyXG4gICAgICAgICAgICAgICAgTWFsbCBuYW1lIGNhbm5vdCBiZSBvbmx5IHdoaXRlc3BhY2UuXHJcbiAgICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RvcmVUeXBlTmFtZScpPy5oYXNFcnJvcigndHJpbVNwYWNlcycpXCI+XHJcbiAgICAgICAgICAgICAgICBObyBsZWFkaW5nIG9yIHRyYWlsaW5nIHdoaXRlc3BhY2UgYWxsb3dlZC5cclxuICAgICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBtYi00XCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImFkZHJlc3NcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkFkZHJlc3M8L2xhYmVsPlxuICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJhZGRyZXNzXCIgZm9ybUNvbnRyb2xOYW1lPVwiYWRkcmVzc1wiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlYXJjaCBhbmQgZW50ZXIgYWRkcmVzc1wiIG5neC1ncC1hdXRvY29tcGxldGUgKG9uQWRkcmVzc0NoYW5nZSk9XCJvbkFkZHJlc3NDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNNb2RhbEJ1c3lcIiAvPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdhZGRyZXNzJyk/LnRvdWNoZWQgJiYgY3JlYXRlU3RvcmVGb3JtLmdldCgnYWRkcmVzcycpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdhZGRyZXNzJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgQWRkcmVzcyBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJjb3VudHJ5XCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5Db3VudHJ5PC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiY291bnRyeVwiIGZvcm1Db250cm9sTmFtZT1cImNvdW50cnlcIiBwbGFjZWhvbGRlcj1cIkVudGVyIENvdW50cnlcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCIgLz5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnY291bnRyeScpPy50b3VjaGVkICYmIGNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2NvdW50cnknKT8uaW52YWxpZFwiPlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnY291bnRyeScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgIENvdW50cnkgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02IG1iLTRcIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwic3RhdGVcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlN0YXRlPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwic3RhdGVcIiBmb3JtQ29udHJvbE5hbWU9XCJzdGF0ZVwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgU3RhdGVcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCIgLz5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnc3RhdGUnKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdGF0ZScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdzdGF0ZScpPy5oYXNFcnJvcigncmVxdWlyZWQnKVwiPlxyXG4gICAgICAgICAgICAgIFN0YXRlIGlzIHJlcXVpcmVkLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNiBtYi00XCI+XG4gICAgICAgICAgPGxhYmVsIGZvcj1cImNpdHlcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPkNpdHkgLyBUb3duPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiY2l0eVwiIGZvcm1Db250cm9sTmFtZT1cImNpdHlcIiBwbGFjZWhvbGRlcj1cIkVudGVyIENpdHkgLyBUb3duXCJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpc01vZGFsQnVzeVwiIC8+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2NpdHknKT8udG91Y2hlZCAmJiBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdjaXR5Jyk/LmludmFsaWRcIj5cclxuICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwidGV4dC1kYW5nZXJcIiAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2NpdHknKT8uaGFzRXJyb3IoJ3JlcXVpcmVkJylcIj5cclxuICAgICAgICAgICAgICBDaXR5IC8gVG93biBpcyByZXF1aXJlZC5cclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTYgbWItNFwiPlxuICAgICAgICAgIDxsYWJlbCBmb3I9XCJwaW5jb2RlXCIgY2xhc3M9XCJmb3JtLWxhYmVsIG1iLTFcIj5QaW4gLyBaaXAgQ29kZTwvbGFiZWw+XG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cInBpbmNvZGVcIiBmb3JtQ29udHJvbE5hbWU9XCJwaW5jb2RlXCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiRW50ZXIgUGluIC8gWmlwIENvZGVcIiBbZGlzYWJsZWRdPVwiaXNNb2RhbEJ1c3lcIiAvPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdwaW5jb2RlJyk/LnRvdWNoZWQgJiYgY3JlYXRlU3RvcmVGb3JtLmdldCgncGluY29kZScpPy5pbnZhbGlkXCI+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdwaW5jb2RlJyk/Lmhhc0Vycm9yKCdyZXF1aXJlZCcpXCI+XHJcbiAgICAgICAgICAgICAgUGluIC8gWmlwIENvZGUgaXMgcmVxdWlyZWQuXHJcbiAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ3BpbmNvZGUnKT8uaGFzRXJyb3IoJ3doaXRlc3BhY2UnKSB8fCBjcmVhdGVTdG9yZUZvcm0uZ2V0KCdwaW5jb2RlJyk/Lmhhc0Vycm9yKCd0cmltU3BhY2VzJylcIj5cclxuICAgICAgICAgICAgICBQaW5jb2RlIGNhbm5vdCBjb250YWluIHdoaXRlc3BhY2UuXHJcbiAgICAgICAgICAgIDwvc21hbGw+XHJcbiAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cInRleHQtZGFuZ2VyXCIgKm5nSWY9XCJjcmVhdGVTdG9yZUZvcm0uZ2V0KCdwaW5jb2RlJyk/Lmhhc0Vycm9yKCdpbnZhbGlkUGluY29kZScpXCI+XHJcbiAgICAgICAgICAgICAgRW50ZXIgYSB2YWxpZCA2LWRpZ2l0IHBpbmNvZGVcclxuICAgICAgICAgICAgPC9zbWFsbD5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIG1iLTRcIj5cbiAgICAgICAgICA8bGFiZWwgZm9yPVwiZW1haWxcIiBjbGFzcz1cImZvcm0tbGFiZWwgbWItMVwiPlNwb2MgdXNlciBlbWFpbCAob3B0aW9uYWwpPC9sYWJlbD5cbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIGlkPVwiZW1haWxcIiBmb3JtQ29udHJvbE5hbWU9XCJlbWFpbFwiXG4gICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkVudGVyIHNwb2MgdXNlciBlbWFpbFwiIFtkaXNhYmxlZF09XCJpc01vZGFsQnVzeVwiIC8+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNyZWF0ZVN0b3JlRm9ybS5nZXQoJ2VtYWlsJyk/LnRvdWNoZWQgJiYgY3JlYXRlU3RvcmVGb3JtLmdldCgnZW1haWwnKT8uaW52YWxpZFwiPlxyXG4gICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiICpuZ0lmPVwiY3JlYXRlU3RvcmVGb3JtLmdldCgnZW1haWwnKT8uaGFzRXJyb3IoJ2VtYWlsJylcIj5cclxuICAgICAgICAgICAgICBFbWFpbCBpcyBpbnZhbGlkLlxyXG4gICAgICAgICAgICA8L3NtYWxsPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZm9ybT5cclxuICB9XHJcbiAgQGVsc2Uge1xyXG4gICAgQGlmKG5ld1N0b3JlRGV0YWlscyl7XHJcbiAgICAgIDxwIGNsYXNzPVwibWItNlwiPlN0ZXAgMjogQWRkIENBRCBmaWxlPC9wPlxyXG5cclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi02XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgICAgICAgPHAgY2xhc3M9XCJtYi0yXCI+U3RvcmUgbmFtZTwvcD5cclxuICAgICAgICAgIDxoMyBjbGFzcz1cIm5ldy1zdG9yZS10eHRcIj57e25ld1N0b3JlRGV0YWlscz8uc3RvcmVOYW1lfX08L2gzPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgIDxwIGNsYXNzPVwibWItMlwiPkZsb29yPC9wPlxyXG4gICAgICAgICAgPGgzIGNsYXNzPVwibmV3LXN0b3JlLXR4dFwiPkZsb29yIHt7dGhpcy5zZWxlY3RlZEZsb29yfX08L2gzPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgICAgICAgIDxwIGNsYXNzPVwibWItMlwiPkJ1c2luZXNzIHR5cGU8L3A+XHJcbiAgICAgICAgICA8aDMgY2xhc3M9XCJuZXctc3RvcmUtdHh0XCI+e3tuZXdTdG9yZURldGFpbHM/LmJ1c2luZXNzVHlwZSB8IHVwcGVyY2FzZX19PC9oMz5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sXCI+XHJcbiAgICAgICAgICA8cCBjbGFzcz1cIm1iLTJcIj5TdG9yZSB0eXBlPC9wPlxyXG4gICAgICAgICAgPGgzIGNsYXNzPVwibmV3LXN0b3JlLXR4dFwiPnt7bmV3U3RvcmVEZXRhaWxzPy5zdG9yZVR5cGU/LnR5cGUgfCB0aXRsZWNhc2V9fTwvaDM+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfUBlbHNlIHtcclxuICAgICAgPGRpdiBjbGFzcz1cInJvdyBtYi00XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgW3NlYXJjaF09XCJ0cnVlXCIgWyhuZ01vZGVsKV09XCJzZWxlY3RlZFN0b3JlXCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiXG4gICAgICAgICAgICBbZGF0YV09XCJzdG9yZUxpc3RcIiBbbGFiZWxdPVwiJ1NlbGVjdCBzdG9yZSdcIiBbYWN0aW9uXT1cInRydWVcIiAoYWN0aW9uQ2xpY2spPVwiYWRkTmV3U3RvcmUoKVwiXG4gICAgICAgICAgICBbYWN0aW9uTGFiZWxdPVwiJ0NyZWF0ZSBuZXcgc3RvcmUnXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25TdG9yZUNoYW5nZSgpXCIgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCI+XG4gICAgICAgICAgPC9saWItcmVhY3RpdmUtc2VsZWN0PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC02XCI+XG4gICAgICAgICAgPGxpYi1yZWFjdGl2ZS1zZWxlY3QgWyhuZ01vZGVsKV09XCJzZWxlY3RlZEZsb29yXCIgW2lkRmllbGRdPVwiJ3ZhbHVlJ1wiIFtuYW1lRmllbGRdPVwiJ2xhYmVsJ1wiIFtkYXRhXT1cImZsb29yTGlzdFwiXG4gICAgICAgICAgICBbbGFiZWxdPVwiJ1NlbGVjdCBmbG9vcidcIiAobmdNb2RlbENoYW5nZSk9XCJvbkZsb29yQ2hhbmdlKClcIiBbZGlzYWJsZWRdPVwiaXNNb2RhbEJ1c3lcIj5cbiAgICAgICAgICA8L2xpYi1yZWFjdGl2ZS1zZWxlY3Q+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwibGF5b3V0LWV4aXN0LXdyYXBwZXJcIiBbY2xhc3Muc2hvd109XCJpc0xheW91dEV4aXN0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImxheW91dC1leGlzdC13YXJuaW5nIG1iLTRcIj5cclxuICAgICAgICAgIDxzdmcgd2lkdGg9XCIyMFwiIGhlaWdodD1cIjIwXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgIGQ9XCJNOS45OTk2NSA2LjY2NjY3VjEwTTkuOTk5NjUgMTMuMzMzM0gxMC4wMDhNOC41NzQ2NSAyLjM4MzM0TDEuNTE2MzIgMTQuMTY2N0MxLjM3MDc5IDE0LjQxODcgMS4yOTM3OSAxNC43MDQ0IDEuMjkyOTggMTQuOTk1NEMxLjI5MjE2IDE1LjI4NjUgMS4zNjc1NiAxNS41NzI2IDEuNTExNjcgMTUuODI1NEMxLjY1NTc5IDE2LjA3ODMgMS44NjM1OSAxNi4yODkgMi4xMTQ0MSAxNi40MzY2QzIuMzY1MjMgMTYuNTg0MSAyLjY1MDMyIDE2LjY2MzUgMi45NDEzMiAxNi42NjY3SDE3LjA1OEMxNy4zNDkgMTYuNjYzNSAxNy42MzQxIDE2LjU4NDEgMTcuODg0OSAxNi40MzY2QzE4LjEzNTcgMTYuMjg5IDE4LjM0MzUgMTYuMDc4MyAxOC40ODc2IDE1LjgyNTRDMTguNjMxNyAxNS41NzI2IDE4LjcwNzEgMTUuMjg2NSAxOC43MDYzIDE0Ljk5NTRDMTguNzA1NSAxNC43MDQ0IDE4LjYyODUgMTQuNDE4NyAxOC40ODMgMTQuMTY2N0wxMS40MjQ3IDIuMzgzMzRDMTEuMjc2MSAyLjEzODQzIDExLjA2NjkgMS45MzU5NCAxMC44MTczIDEuNzk1NDFDMTAuNTY3NyAxLjY1NDg4IDEwLjI4NjEgMS41ODEwNSA5Ljk5OTY1IDEuNTgxMDVDOS43MTMyMSAxLjU4MTA1IDkuNDMxNTkgMS42NTQ4OCA5LjE4MTk5IDEuNzk1NDFDOC45MzIzOCAxLjkzNTk0IDguNzIzMjEgMi4xMzg0MyA4LjU3NDY1IDIuMzgzMzRaXCJcclxuICAgICAgICAgICAgICBzdHJva2U9XCIjRjA0NDM4XCIgc3Ryb2tlLXdpZHRoPVwiMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICA8L3N2Zz5cclxuXHJcbiAgICAgICAgICBUaGlzIHN0b3JlIGFscmVhZHkgaGFzIGEgRmxvb3Ige3tzZWxlY3RlZEZsb29yfX0gcGxhbm9ncmFtLiBPdmVyd3JpdGUgaXQ/IFRoaXMgY2Fu4oCZdCBiZSB1bmRvbmUuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgfVxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cclxuICAgICAgQGlmIChpc0NhZFByb2Nlc3NpbmcpIHtcclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FkLWxvYWRlci1wYW5lbFwiPlxyXG4gICAgICAgICAgPCEtLVxyXG4gICAgICAgICAgPGRpdiAjY2FkUHJvY2Vzc2luZ0xvdHRpZSBjbGFzcz1cImNhZC1sb3R0aWVcIj48L2Rpdj5cclxuICAgICAgICAgIDxwIGNsYXNzPVwiY2FkLWxvYWRlci10ZXh0IG1iLTBcIj5DcmVhdGluZyBwbGFub2dyYW0gZnJvbSBDQUQuLi48L3A+XHJcbiAgICAgICAgICAtLT5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWQtbG9hZGVyLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgPHN2ZyBjbGFzcz1cImNhZC1iYXNpYy1zcGlubmVyXCIgdmlld0JveD1cIjAgMCA1MCA1MFwiPlxyXG4gICAgICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJwYXRoXCIgY3g9XCIyNVwiIGN5PVwiMjVcIiByPVwiMjBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjRcIj48L2NpcmNsZT5cclxuICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgIDxwIGNsYXNzPVwiY2FkLWxvYWRlci10ZXh0IG1iLTBcIj5cclxuICAgICAgICAgICAgICBCdWlsZGluZyBsYXlvdXRcclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxvYWRpbmctZG90c1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+Ljwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPi48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj4uPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInNlbGVjdGVkRmlsZSA/ICdjb2wtMTInIDonY29sLTYnXCI+XG4gICAgICAgICAgICA8ZmlsZS11cGxvYWQgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCIgKGZpbGVDaGFuZ2UpPVwib25GaWxlQ2hhbmdlKCRldmVudClcIj48L2ZpbGUtdXBsb2FkPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwic2VsZWN0ZWRGaWxlID8gJ2Qtbm9uZScgOidjb2wtNidcIlxuICAgICAgICAgICAgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4ganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIj5cbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCI4MFwiIGhlaWdodD1cIjgwXCIgdmlld0JveD1cIjAgMCA4MCA4MFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgIDxjaXJjbGUgY3g9XCI0MFwiIGN5PVwiNDBcIiByPVwiNDBcIiBmaWxsPVwiI0VBRjhGRlwiIC8+XHJcbiAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgIGQ9XCJNNTUuNTAwOCAzNC4zNzVINTEuMzc1Mkw0Ny42MjU4IDM4LjEyNTNINDIuMzc1MlYzNC4zNzVIMzEuMTI1MlY0OS4zNzUzSDI3LjM3NThDMjYuODc4NSA0OS4zNjc2IDI2LjM4NDYgNDkuNDU4OSAyNS45MjI5IDQ5LjY0MzlDMjUuNDYxMiA0OS44Mjg5IDI1LjA0MDkgNTAuMTAzOSAyNC42ODY0IDUwLjQ1MjhDMjQuMzMyIDUwLjgwMTggMjQuMDUwNiA1MS4yMTc4IDIzLjg1ODQgNTEuNjc2NkMyMy42NjYzIDUyLjEzNTMgMjMuNTY3NCA1Mi42Mjc4IDIzLjU2NzQgNTMuMTI1MUMyMy41Njc0IDUzLjYyMjUgMjMuNjY2MyA1NC4xMTQ5IDIzLjg1ODQgNTQuNTczN0MyNC4wNTA2IDU1LjAzMjUgMjQuMzMyIDU1LjQ0ODUgMjQuNjg2NCA1NS43OTc1QzI1LjA0MDkgNTYuMTQ2NCAyNS40NjEyIDU2LjQyMTQgMjUuOTIyOSA1Ni42MDY0QzI2LjM4NDYgNTYuNzkxNCAyNi44Nzg1IDU2Ljg4MjcgMjcuMzc1OCA1Ni44NzVINTUuNTAwOEM1NS45OTggNTYuODc1IDU2LjQ3NDggNTYuNjc3NSA1Ni44MjY0IDU2LjMyNTlDNTcuMTc4IDU1Ljk3NDMgNTcuMzc1NSA1NS40OTc1IDU3LjM3NTUgNTUuMDAwM1YzNi4yNDk3QzU3LjM3NTUgMzUuNzUyNSA1Ny4xNzggMzUuMjc1NyA1Ni44MjY0IDM0LjkyNDFDNTYuNDc0OCAzNC41NzI1IDU1Ljk5OCAzNC4zNzUgNTUuNTAwOCAzNC4zNzVaTTMxLjEyNTIgMjguNzVWNDkuMzc1M0gyNy4zNzU4QzI2LjM4MTMgNDkuMzc1MyAyNS40Mjc1IDQ5Ljc3MDMgMjQuNzI0MiA1MC40NzM0QzI0LjAyMDkgNTEuMTc2NSAyMy42MjU3IDUyLjEzMDIgMjMuNjI1NSA1My4xMjQ3VjMyLjUwMDNDMjMuNjI1NSAzMS41MDU3IDI0LjAyMDYgMzAuNTUxOCAyNC43MjM5IDI5Ljg0ODRDMjUuNDI3MiAyOS4xNDUxIDI2LjM4MTEgMjguNzUgMjcuMzc1OCAyOC43NUgzMS4xMjUyWlwiXHJcbiAgICAgICAgICAgICAgICBmaWxsPVwiI0QwRDVERFwiIC8+XHJcbiAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgIGQ9XCJNMzEuMTI1MiA0OS4zNzUzVjM0LjM3NUg0Mi4zNzUyVjM4LjEyNTNINDcuNjI1OEw1MS4zNzUyIDM0LjM3NUg1NS41MDA4QzU1Ljk5OCAzNC4zNzUgNTYuNDc0OCAzNC41NzI1IDU2LjgyNjQgMzQuOTI0MUM1Ny4xNzggMzUuMjc1NyA1Ny4zNzU1IDM1Ljc1MjUgNTcuMzc1NSAzNi4yNDk3VjU1LjAwMDNDNTcuMzc1NSA1NS40OTc1IDU3LjE3OCA1NS45NzQzIDU2LjgyNjQgNTYuMzI1OUM1Ni40NzQ4IDU2LjY3NzUgNTUuOTk4IDU2Ljg3NSA1NS41MDA4IDU2Ljg3NUgyNy4zNzU4QzI2Ljg3ODUgNTYuODgyNyAyNi4zODQ2IDU2Ljc5MTQgMjUuOTIyOSA1Ni42MDY0QzI1LjQ2MTIgNTYuNDIxNCAyNS4wNDA5IDU2LjE0NjQgMjQuNjg2NCA1NS43OTc1QzI0LjMzMiA1NS40NDg1IDI0LjA1MDYgNTUuMDMyNSAyMy44NTg0IDU0LjU3MzdDMjMuNjY2MyA1NC4xMTQ5IDIzLjU2NzQgNTMuNjIyNSAyMy41Njc0IDUzLjEyNTFDMjMuNTY3NCA1Mi42Mjc4IDIzLjY2NjMgNTIuMTM1MyAyMy44NTg0IDUxLjY3NjZDMjQuMDUwNiA1MS4yMTc4IDI0LjMzMiA1MC44MDE4IDI0LjY4NjQgNTAuNDUyOEMyNS4wNDA5IDUwLjEwMzkgMjUuNDYxMiA0OS44Mjg5IDI1LjkyMjkgNDkuNjQzOUMyNi4zODQ2IDQ5LjQ1ODkgMjYuODc4NSA0OS4zNjc2IDI3LjM3NTggNDkuMzc1M00zMS4xMjUyIDQ5LjM3NTNIMjcuMzc1OE0zMS4xMjUyIDQ5LjM3NTNWMjguNzVIMjcuMzc1OEMyNi4zODExIDI4Ljc1IDI1LjQyNzIgMjkuMTQ1MSAyNC43MjM5IDI5Ljg0ODRDMjQuMDIwNiAzMC41NTE4IDIzLjYyNTUgMzEuNTA1NyAyMy42MjU1IDMyLjUwMDNWNTMuMTI0N0MyMy42MjU3IDUyLjEzMDIgMjQuMDIwOSA1MS4xNzY1IDI0LjcyNDIgNTAuNDczNEMyNS40Mjc1IDQ5Ljc3MDMgMjYuMzgxMyA0OS4zNzUzIDI3LjM3NTggNDkuMzc1M1wiXHJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCIjOThBMkIzXCIgc3Ryb2tlLXdpZHRoPVwiMC44NDM3NVwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XHJcbiAgICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICAgIGQ9XCJNNTYuODMxNyAyNi4yOTNMNTQuMjA2NCAyMy42Njg2QzUzLjg1NiAyMy4zMjUyIDUzLjM4NDkgMjMuMTMyOCA1Mi44OTQyIDIzLjEzMjhDNTIuNDAzNSAyMy4xMzI4IDUxLjkzMjQgMjMuMzI1MiA1MS41ODIgMjMuNjY4Nkw0Mi4zNzUgMzIuODc1NlYzOC4xMjUzSDQ3LjYyNTZMNTYuODMxNyAyOC45MTgzQzU3LjE3NTEgMjguNTY3OSA1Ny4zNjc1IDI4LjA5NjggNTcuMzY3NSAyNy42MDYxQzU3LjM2NzUgMjcuMTE1NSA1Ny4xNzUxIDI2LjY0MzQgNTYuODMxNyAyNi4yOTNaXCJcclxuICAgICAgICAgICAgICAgIGZpbGw9XCIjMzNCNUZGXCIgLz5cclxuICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0xIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09XCJpc01hbnVhbFwiIGNsYXNzPVwiZm9ybS1jaGVjay1pbnB1dCBtZS0zXCIgdHlwZT1cImNoZWNrYm94XCIgdmFsdWU9XCJcIiBpZD1cIm1hbnVhbFwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJtYW51YWxcIj5DcmVhdGUgbWFudWFsbHk8L2xhYmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxyXG4gICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICB9XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWFjdGlvbnNcIj5cclxuICAgIEBpZihpc0NyZWF0ZVN0b3JlTW9kZSl7XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGluayBtZS1hdXRvXCIgKGNsaWNrKT1cIm9uQmFjaygpXCIgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCI+QmFjazwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmVcIiAoY2xpY2spPVwib25DYW5jZWwoKVwiIFtkaXNhYmxlZF09XCJpc01vZGFsQnVzeVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgXCIgW2Rpc2FibGVkXT1cImNyZWF0ZVN0b3JlRm9ybS5pbnZhbGlkIHx8IGlzTW9kYWxCdXN5XCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ3JlYXRlU3RvcmUoKVwiPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0J1dHRvbkxvYWRpbmdcIj5cbiAgICAgICAgICBOZXh0XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPHN2ZyAqbmdJZj1cImlzQnV0dG9uTG9hZGluZ1wiIGNsYXNzPVwic3Bpbm5lclwiIHZpZXdCb3g9XCIwIDAgNTAgNTBcIj5cclxuICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJwYXRoXCIgY3g9XCIyNVwiIGN5PVwiMjVcIiByPVwiMjBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjRcIj48L2NpcmNsZT5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICB9QGVsc2Uge1xuICAgICAgPGJ1dHRvbiAqbmdJZj1cIm5ld1N0b3JlRGV0YWlsc1wiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGluayBtZS1hdXRvXCIgKGNsaWNrKT1cIm9uQmFjaygpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCI+QmFjazwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFuZXdTdG9yZURldGFpbHNcIiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUgbWUtYXV0b1wiIChjbGljayk9XCJhZGROZXdTdG9yZSgpXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCI+XG4gICAgICAgIDxzdmcgd2lkdGg9XCIxNFwiIGhlaWdodD1cIjE0XCIgdmlld0JveD1cIjAgMCAxNCAxNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxuICAgICAgICAgIDxwYXRoIGQ9XCJNNi42NjgyOSAwLjgzNDk2MVYxMi41MDE2TTAuODM0OTYxIDYuNjY4MjlIMTIuNTAxNlwiIHN0cm9rZT1cIiMzNDQwNTRcIiBzdHJva2Utd2lkdGg9XCIxLjY3XCJcbiAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIC8+XG4gICAgICAgIDwvc3ZnPlxyXG5cbiAgICAgICAgQ3JlYXRlIG5ldyBzdG9yZVxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZVwiIChjbGljayk9XCJvbkNhbmNlbCgpXCIgW2Rpc2FibGVkXT1cImlzTW9kYWxCdXN5XCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBcIiBbZGlzYWJsZWRdPVwiIWlzVmFsaWRUb0NyZWF0ZVBsYW5vIHx8IGlzTW9kYWxCdXN5XCJcbiAgICAgICAgKGNsaWNrKT1cIm9uQ3JlYXRlTGF5b3V0UGxhbm8oKVwiPlxuICAgICAgICA8c3BhbiAqbmdJZj1cIiFpc0J1dHRvbkxvYWRpbmcgfHwgaXNDYWRQcm9jZXNzaW5nXCI+XG4gICAgICAgICAge3tpc0xheW91dEV4aXN0ID8gICdPdmVyd3JpdGUnIDogJ0NyZWF0ZSd9fVxuICAgICAgICA8L3NwYW4+XHJcblxyXG4gICAgICAgIDxzdmcgKm5nSWY9XCJpc0J1dHRvbkxvYWRpbmcgJiYgIWlzQ2FkUHJvY2Vzc2luZ1wiIGNsYXNzPVwic3Bpbm5lclwiIHZpZXdCb3g9XCIwIDAgNTAgNTBcIj5cclxuICAgICAgICAgIDxjaXJjbGUgY2xhc3M9XCJwYXRoXCIgY3g9XCIyNVwiIGN5PVwiMjVcIiByPVwiMjBcIiBmaWxsPVwibm9uZVwiIHN0cm9rZS13aWR0aD1cIjRcIj48L2NpcmNsZT5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICB9XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
|