@smarterplan/ngx-smarterplan-locations 0.2.20 → 0.2.21
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/esm2020/lib/components/carousel/carousel.component.mjs +27 -27
- package/esm2020/lib/components/chevron/chevron.component.mjs +17 -17
- package/esm2020/lib/components/detail-location/detail-location.component.mjs +154 -154
- package/esm2020/lib/components/form-location/form-location.component.mjs +237 -237
- package/esm2020/lib/components/images/images.component.mjs +90 -90
- package/esm2020/lib/components/locations/locations.component.mjs +141 -141
- package/esm2020/lib/components/locations/map/map-popup/map-popup.component.mjs +65 -65
- package/esm2020/lib/components/locations/map/map.component.mjs +90 -90
- package/esm2020/lib/components/plans/calibration/calibration.component.mjs +468 -468
- package/esm2020/lib/components/plans/edit-plan/edit-plan.component.mjs +324 -324
- package/esm2020/lib/components/plans/plans.component.mjs +210 -210
- package/esm2020/lib/components/tab-navigation/tab-navigation.component.mjs +41 -41
- package/esm2020/lib/components/visits/visits.component.mjs +235 -235
- package/esm2020/lib/components/zones/add-audio-zone/add-audio-zone.component.mjs +230 -230
- package/esm2020/lib/components/zones/add-zone/add-zone.component.mjs +294 -294
- package/esm2020/lib/components/zones/add-zone/selection/selection.component.mjs +76 -76
- package/esm2020/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.mjs +413 -414
- package/esm2020/lib/components/zones/zones.component.mjs +232 -232
- package/esm2020/lib/helper.service.mjs +134 -134
- package/esm2020/lib/ngx-smarterplan-location-routing.module.mjs +49 -49
- package/esm2020/lib/ngx-smarterplan-locations.module.mjs +122 -122
- package/esm2020/lib/ngx-smarterplan-locations.service.mjs +13 -13
- package/esm2020/lib/pipes/count-audio-sweeps.pipe.mjs +27 -0
- package/esm2020/lib/radio-button/radio-button.component.mjs +26 -26
- package/esm2020/public-api.mjs +8 -8
- package/esm2020/smarterplan-ngx-smarterplan-locations.mjs +4 -4
- package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs +3627 -3648
- package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs.map +1 -1
- package/fesm2020/smarterplan-ngx-smarterplan-locations.mjs +3475 -3494
- package/fesm2020/smarterplan-ngx-smarterplan-locations.mjs.map +1 -1
- package/lib/components/carousel/carousel.component.d.ts +12 -12
- package/lib/components/chevron/chevron.component.d.ts +9 -9
- package/lib/components/detail-location/detail-location.component.d.ts +51 -51
- package/lib/components/form-location/form-location.component.d.ts +45 -45
- package/lib/components/images/images.component.d.ts +28 -28
- package/lib/components/locations/locations.component.d.ts +50 -50
- package/lib/components/locations/map/map-popup/map-popup.component.d.ts +22 -22
- package/lib/components/locations/map/map.component.d.ts +22 -22
- package/lib/components/plans/calibration/calibration.component.d.ts +140 -140
- package/lib/components/plans/edit-plan/edit-plan.component.d.ts +55 -55
- package/lib/components/plans/plans.component.d.ts +59 -59
- package/lib/components/tab-navigation/tab-navigation.component.d.ts +13 -13
- package/lib/components/visits/visits.component.d.ts +51 -51
- package/lib/components/zones/add-audio-zone/add-audio-zone.component.d.ts +63 -63
- package/lib/components/zones/add-zone/add-zone.component.d.ts +67 -67
- package/lib/components/zones/add-zone/selection/selection.component.d.ts +44 -44
- package/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.d.ts +96 -96
- package/lib/components/zones/zones.component.d.ts +67 -67
- package/lib/helper.service.d.ts +53 -53
- package/lib/ngx-smarterplan-location-routing.module.d.ts +7 -7
- package/lib/ngx-smarterplan-locations.module.d.ts +35 -35
- package/lib/ngx-smarterplan-locations.service.d.ts +6 -6
- package/lib/pipes/count-audio-sweeps.pipe.d.ts +10 -0
- package/lib/radio-button/radio-button.component.d.ts +12 -12
- package/package.json +2 -2
- package/public-api.d.ts +4 -4
- package/smarterplan-ngx-smarterplan-locations.d.ts +5 -5
- package/esm2020/lib/components/plan-legend/plan-legend.component.mjs +0 -47
- package/lib/components/plan-legend/plan-legend.component.d.ts +0 -14
|
@@ -1,232 +1,232 @@
|
|
|
1
|
-
import { Component, EventEmitter, Output } from '@angular/core';
|
|
2
|
-
import { wait, showScanPointsOnPlanInDiv, SpModule } from '@smarterplan/ngx-smarterplan-core';
|
|
3
|
-
import panzoom from "panzoom";
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@angular/router";
|
|
6
|
-
import * as i2 from "@smarterplan/ngx-smarterplan-core";
|
|
7
|
-
import * as i3 from "@ngx-translate/core";
|
|
8
|
-
import * as i4 from "../tab-navigation/tab-navigation.component";
|
|
9
|
-
import * as i5 from "../chevron/chevron.component";
|
|
10
|
-
import * as i6 from "
|
|
11
|
-
import * as i7 from "./add-zone/add-zone.component";
|
|
12
|
-
import * as i8 from "
|
|
13
|
-
import * as i9 from "
|
|
14
|
-
export class ZonesComponent {
|
|
15
|
-
constructor(route, zoneService, spaceService, visitService, navigationService, userService, planService, translate) {
|
|
16
|
-
this.route = route;
|
|
17
|
-
this.zoneService = zoneService;
|
|
18
|
-
this.spaceService = spaceService;
|
|
19
|
-
this.visitService = visitService;
|
|
20
|
-
this.navigationService = navigationService;
|
|
21
|
-
this.userService = userService;
|
|
22
|
-
this.planService = planService;
|
|
23
|
-
this.translate = translate;
|
|
24
|
-
this.lotIndexDetails = -1;
|
|
25
|
-
this.updatedZone = new EventEmitter();
|
|
26
|
-
this.isEditingZone = false;
|
|
27
|
-
this.carouselIsVisible = false;
|
|
28
|
-
this.planIsVisible = false;
|
|
29
|
-
this.loadingPlan = false;
|
|
30
|
-
this.menuItems = [];
|
|
31
|
-
this.isMuseumVisit = false;
|
|
32
|
-
this.isMuseumModule = false;
|
|
33
|
-
this.floorZones = [];
|
|
34
|
-
this.zonesMap = new Map();
|
|
35
|
-
this.floorDetails = -1;
|
|
36
|
-
this.defaultShowing = false;
|
|
37
|
-
this.isAddingAudioTrack = false;
|
|
38
|
-
}
|
|
39
|
-
async ngOnInit() {
|
|
40
|
-
this.spaceID = this.route.snapshot.paramMap.get("id");
|
|
41
|
-
this.isMuseumModule = this.userService.getSpModule() === SpModule.MUSEUM;
|
|
42
|
-
this.resetZones();
|
|
43
|
-
}
|
|
44
|
-
setupMenuItems() {
|
|
45
|
-
this.menuItems = [
|
|
46
|
-
{ label: "Locations", url: "/localisation" },
|
|
47
|
-
{
|
|
48
|
-
label: this.currentSpace.name,
|
|
49
|
-
url: `/localisation/${this.spaceID}`,
|
|
50
|
-
},
|
|
51
|
-
{
|
|
52
|
-
label: "Zones",
|
|
53
|
-
url: `/localisation/${this.currentSpace.id}/zones`,
|
|
54
|
-
},
|
|
55
|
-
];
|
|
56
|
-
}
|
|
57
|
-
onGoBack() {
|
|
58
|
-
this.editCompleted(null);
|
|
59
|
-
}
|
|
60
|
-
ngOnChanges() {
|
|
61
|
-
this.resetZones();
|
|
62
|
-
}
|
|
63
|
-
async resetZones() {
|
|
64
|
-
this.isMuseumVisit = false;
|
|
65
|
-
this.currentSpace = await this.spaceService.getSpace(this.spaceID);
|
|
66
|
-
this.setupMenuItems();
|
|
67
|
-
this.allZones = await this.zoneService.getZonesBySpace(this.spaceID);
|
|
68
|
-
this.defaultZone = this.allZones.find((zone) => zone.layer && zone.layer.name === "BUILDING" && zone.sweepIDs);
|
|
69
|
-
this.floorZones = this.allZones.filter((zone) => zone.layer && zone.layer.name === "FLOOR");
|
|
70
|
-
// we add only children zones that are not Floors
|
|
71
|
-
this.zonesMap.set(this.defaultZone.id, this.allZones.filter((zone) => zone.parentID === this.defaultZone.id && !this.floorZones.includes(zone)));
|
|
72
|
-
for (const floor of this.floorZones) {
|
|
73
|
-
this.zonesMap.set(floor.id, this.allZones.filter((zone) => zone.parentID === floor.id));
|
|
74
|
-
}
|
|
75
|
-
// this.zones = sortAlphabeticallyOnName(this.zones);
|
|
76
|
-
this.resetNavigations();
|
|
77
|
-
this.images360 = await this.visitService.loadImagesForSpace(this.currentSpace);
|
|
78
|
-
this.plans = await this.planService.getPlansWithZonesForSpace(this.spaceID);
|
|
79
|
-
this.plans = this.plans.filter((plan) => plan.isCurrentForZone);
|
|
80
|
-
this.onPlansLoaded();
|
|
81
|
-
}
|
|
82
|
-
resetNavigations() {
|
|
83
|
-
this.navigations = [];
|
|
84
|
-
const zonesWithSweeps = this.allZones.filter((zone) => zone.sweepIDs);
|
|
85
|
-
this.navigations = [
|
|
86
|
-
...new Set(zonesWithSweeps.flatMap((zone) => zone.sweepIDs)),
|
|
87
|
-
];
|
|
88
|
-
}
|
|
89
|
-
async onPlansLoaded() {
|
|
90
|
-
if (this.planIsVisible && this.currentZone) {
|
|
91
|
-
this.preparePlan();
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* onToggleDetail folds/unfolds details for a zone
|
|
96
|
-
* @param i index of the lot to be toggled
|
|
97
|
-
*/
|
|
98
|
-
async onToggleDetail(index, zone) {
|
|
99
|
-
this.lotIndexDetails = index === this.lotIndexDetails ? -1 : index;
|
|
100
|
-
if (this.lotIndexDetails === -1) {
|
|
101
|
-
this.currentZone = null;
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
this.currentZone = zone;
|
|
105
|
-
this.planIsVisible = true;
|
|
106
|
-
if (!this.plans) {
|
|
107
|
-
return; // wait until the plans are set
|
|
108
|
-
}
|
|
109
|
-
if (this.loadingPlan) {
|
|
110
|
-
// another plan is already loading
|
|
111
|
-
await wait(1000);
|
|
112
|
-
}
|
|
113
|
-
this.preparePlan();
|
|
114
|
-
}
|
|
115
|
-
onToggleDetailFloor(index, floor) {
|
|
116
|
-
this.defaultShowing = false;
|
|
117
|
-
this.floorDetails = index === this.floorDetails ? -1 : index;
|
|
118
|
-
if (this.floorDetails === -1) {
|
|
119
|
-
this.currentZone = null;
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
this.currentZone = floor;
|
|
123
|
-
this.planIsVisible = true;
|
|
124
|
-
if (!this.plans) {
|
|
125
|
-
console.log("plans not ready");
|
|
126
|
-
return; // wait until the plans are set
|
|
127
|
-
}
|
|
128
|
-
this.preparePlan();
|
|
129
|
-
}
|
|
130
|
-
onToggleDefaultZone() {
|
|
131
|
-
this.defaultShowing = !this.defaultShowing;
|
|
132
|
-
this.currentZone = this.defaultShowing ? this.defaultZone : null;
|
|
133
|
-
}
|
|
134
|
-
async preparePlan() {
|
|
135
|
-
this.loadingPlan = true;
|
|
136
|
-
this.currentPlan = null;
|
|
137
|
-
if (this.currentZone.virtual) {
|
|
138
|
-
this.currentPlan = null;
|
|
139
|
-
this.loadingPlan = false;
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
this.currentPlan = await this.planService.getCalibratedPlanForZone(this.currentZone);
|
|
143
|
-
if (this.currentPlan) {
|
|
144
|
-
const scans = await this.navigationService.getNavigationsForZone(this.currentZone);
|
|
145
|
-
await this.showScanPointsOnPlan(scans);
|
|
146
|
-
}
|
|
147
|
-
this.loadingPlan = false;
|
|
148
|
-
}
|
|
149
|
-
toggleCarousel() {
|
|
150
|
-
this.carouselIsVisible = true;
|
|
151
|
-
}
|
|
152
|
-
onEdit(zone) {
|
|
153
|
-
this.zoneForEdit = zone;
|
|
154
|
-
if (this.zoneForEdit.layer && this.zoneForEdit.layer.name === "AUDIO") {
|
|
155
|
-
this.isAddingAudioTrack = true;
|
|
156
|
-
}
|
|
157
|
-
else {
|
|
158
|
-
this.isEditingZone = true;
|
|
159
|
-
}
|
|
160
|
-
this.menuItems.push({
|
|
161
|
-
label: `${zone.name}`,
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
onAddLot() {
|
|
165
|
-
this.isMuseumVisit = false;
|
|
166
|
-
this.isEditingZone = true;
|
|
167
|
-
this.menuItems.push({
|
|
168
|
-
label: "New",
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
onAddMuseumZone() {
|
|
172
|
-
this.isMuseumVisit = true;
|
|
173
|
-
this.isEditingZone = true;
|
|
174
|
-
this.menuItems.push({
|
|
175
|
-
label: "New Museum Itinerary",
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
onAddAudioZone(parentZone) {
|
|
179
|
-
this.parentZoneForAudio = parentZone;
|
|
180
|
-
this.isAddingAudioTrack = true;
|
|
181
|
-
this.menuItems.push({
|
|
182
|
-
label: parentZone.name,
|
|
183
|
-
});
|
|
184
|
-
this.menuItems.push({
|
|
185
|
-
label: "add-audio.add",
|
|
186
|
-
});
|
|
187
|
-
}
|
|
188
|
-
async onDelete(zone) {
|
|
189
|
-
const message = this.translate.instant("confirm.deleteZone");
|
|
190
|
-
// eslint-disable-next-line no-alert
|
|
191
|
-
if (window.confirm(message)) {
|
|
192
|
-
await this.zoneService.deleteZone(zone.id);
|
|
193
|
-
this.allZones.splice(this.allZones.indexOf(zone), 1);
|
|
194
|
-
if (zone.parentID && Array.from(this.zonesMap.keys()).includes(zone.parentID)) {
|
|
195
|
-
const zonesForParent = this.zonesMap.get(zone.parentID);
|
|
196
|
-
zonesForParent.splice(zonesForParent.indexOf(zone), 1);
|
|
197
|
-
this.zonesMap.set(zone.parentID, zonesForParent);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
editCompleted(event) {
|
|
202
|
-
this.lotIndexDetails = -1;
|
|
203
|
-
if (event) {
|
|
204
|
-
this.resetZones();
|
|
205
|
-
}
|
|
206
|
-
this.isEditingZone = false;
|
|
207
|
-
this.isAddingAudioTrack = false;
|
|
208
|
-
this.zoneForEdit = null;
|
|
209
|
-
this.planIsVisible = false;
|
|
210
|
-
this.carouselIsVisible = false;
|
|
211
|
-
this.setupMenuItems();
|
|
212
|
-
}
|
|
213
|
-
async showScanPointsOnPlan(navigations) {
|
|
214
|
-
const divPlan = document.querySelector("#planDiv");
|
|
215
|
-
await showScanPointsOnPlanInDiv(this.currentPlan, divPlan, navigations);
|
|
216
|
-
this.loadingPlan = false;
|
|
217
|
-
panzoom(divPlan, {
|
|
218
|
-
bounds: true,
|
|
219
|
-
boundsPadding: 0,
|
|
220
|
-
maxZoom: 3.5,
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
|
-
}
|
|
224
|
-
ZonesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: ZonesComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.ZoneService }, { token: i2.SpaceService }, { token: i2.VisitService }, { token: i2.NavigationService }, { token: i2.BaseUserService }, { token: i2.PlanService }, { token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
225
|
-
ZonesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: ZonesComponent, selector: "lib-zones", outputs: { updatedZone: "updatedZone" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"container-fluid\" *ngIf=\"currentSpace\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"onGoBack()\"></lib-tab-navigation>\n </div>\n <div class=\"row\" *ngIf=\"!isEditingZone && !isAddingAudioTrack\">\n <div class=\"col-md-6\">\n <ul class=\"list-group list-group-flush\" >\n <li class=\"list-group-item default-zone-line-item\">\n <div class=\"d-flex justify-content-between align-items-center zone-name\" *ngIf=\"defaultZone\">\n {{defaultZone.name}}\n <div class=\"default-zone-label\">{{ \"whole space\" | translate }}</div>\n <lib-chevron [conditionShowing]=\"defaultShowing\" (click)=\"onToggleDefaultZone()\"></lib-chevron>\n </div>\n <div *ngIf=\"defaultShowing\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\">{{'Type of zone' | translate}}: \n {{defaultZone.layer ? defaultZone.layer.name : \"No type\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"defaultZone.surface\">\n {{'Surface' | translate}}, m<sup>2</sup>: {{defaultZone.surface }}\n </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!defaultZone.virtual\">{{'Scan Points' | translate}}:\n {{defaultZone.sweepIDs ? defaultZone.sweepIDs.length : \"No scan points\" | translate}} </li>\n </ul>\n <div *ngFor=\"let pair of zonesMap | keyvalue\">\n <div *ngIf=\"pair.key == defaultZone.id\">\n <h5 style=\"margin: 8px;\" *ngIf=\"pair.value.length > 0\">{{'Children zones'|translate}}</h5>\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item list-group-flush list-group-item-action\"\n *ngFor=\"let lot of pair.value; index as zoneIndex\">\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\n {{lot.name}}\n <div class=\"museum-label\" *ngIf=\"lot.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\n <lib-chevron [conditionShowing]=\"zoneIndex==lotIndexDetails\" (click)=\"onToggleDetail(zoneIndex, lot)\"></lib-chevron>\n \n </div>\n <div *ngIf=\"zoneIndex==lotIndexDetails\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.isMuseumVisitZone\">{{'Type of zone' |\n translate}}: {{lot.layer ? lot.layer.name :\n \"No type\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.surface\">\n {{'Surface' | translate}},m<sup>2</sup>: {{lot.surface }}\n </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.virtual\">{{'Scan Points' | translate}}:\n {{lot.sweepIDs ? lot.sweepIDs.length : \"No scan points\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.virtual\">\n {{'Zone not visible in 3D visit' | translate}}</li>\n </ul>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\n (click)=\"onEdit(lot)\">{{'Edit' | translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAudioZone(lot)\"\n *ngIf=\"isMuseumModule\"> {{'add-audio.add' | translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\"\n (click)=\"onDelete(lot)\">{{'Delete' | translate}}</button>\n </div>\n </li>\n </ul>\n \n </div>\n </div>\n </div>\n </li>\n \n <li class=\"list-group-item\" *ngFor=\"let floor of floorZones; index as index\">\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\n {{floor.name}}\n <!-- <small>({{ lot.metadata ? ('Calibrated' | translate) : ('Not calibrated' | translate)}})</small> -->\n <div class=\"museum-label\" *ngIf=\"floor.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\n <lib-chevron [conditionShowing]=\"index==floorDetails\" (click)=\"onToggleDetailFloor(index, floor)\"></lib-chevron>\n </div>\n <div *ngIf=\"index==floorDetails\"> \n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\">{{'Type of zone' | translate}}: {{floor.layer ?\n floor.layer.name :\n \"No type\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"floor.surface\">{{'Surface' | translate}}, m<sup>2</sup>:\n {{floor.surface }}\n </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!floor.virtual\">{{'Scan Points' | translate}}:\n {{floor.sweepIDs ? floor.sweepIDs.length : \"No scan points\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"floor.virtual\">{{'Zone not visible in 3D visit' |\n translate}}</li>\n </ul>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onEdit(floor)\">{{'Edit' |\n translate}}</button>\n \n <!-- List of children zones -->\n \n <div *ngFor=\"let pair of zonesMap | keyvalue\">\n <div *ngIf=\"pair.key == floor.id\">\n <h5 style=\"margin: 8px;\" *ngIf=\"pair.value.length > 0\">{{'Children zones'|translate}}</h5>\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item list-group-flush list-group-item-action\"\n *ngFor=\"let lot of pair.value; index as zoneIndex\">\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\n {{lot.name}}\n <div class=\"museum-label\" *ngIf=\"lot.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\n <lib-chevron [conditionShowing]=\"zoneIndex==lotIndexDetails\" (click)=\"onToggleDetail(zoneIndex, lot)\"></lib-chevron>\n \n </div>\n <div *ngIf=\"zoneIndex==lotIndexDetails\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.isMuseumVisitZone\">{{'Type of zone' |\n translate}}: {{lot.layer ? lot.layer.name :\n \"No type\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.surface\">{{'Surface' | translate}},\n m<sup>2</sup>:\n {{lot.surface }}\n </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.virtual\">{{'Scan Points' | translate}}:\n {{lot.sweepIDs ? lot.sweepIDs.length : \"No scan points\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.virtual\">{{'Zone not visible in 3D visit'\n |\n translate}}</li>\n </ul>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\n (click)=\"onEdit(lot)\">{{'Edit' | translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAudioZone(lot)\"\n *ngIf=\"isMuseumModule\"> {{'add-audio.add' | translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\"\n (click)=\"onDelete(lot)\">{{'Delete' | translate}}</button>\n </div>\n </li>\n </ul>\n \n </div>\n </div>\n </div>\n </li>\n </ul>\n \n <div>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddLot()\">{{'Add zone' |\n translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddMuseumZone()\"\n *ngIf=\"isMuseumModule\"> {{'Add museum itinerary' | translate}}</button>\n <!-- <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAudioZone()\"\n *ngIf=\"isMuseumModule\"> {{'add-audio.add' | translate}}</button> -->\n </div>\n </div>\n <div class=\"col-md-6\">\n <div class=\"d-flex justify-content-center\" *ngIf=\"loadingPlan\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n <div class=\"row\" style=\"overflow: hidden; flex-direction: column;\" *ngIf=\"currentZone\">\n <lib-plan-legend [isAudioZone]=\"false\" *ngIf=\"currentPlan && !loadingPlan && plans\"></lib-plan-legend>\n <div class=\"mt-3 ms-3\" style=\"height: 500px; width: 100%;\" id=\"planDiv\" *ngIf=\"currentPlan\"></div>\n <div *ngIf=\"!currentPlan && plans && !loadingPlan\">\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"!currentZone.virtual && !currentZone.isMultipleFloorZone\">\n {{ 'Plan is not calibrated' | translate}}\n </div>\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"currentZone.virtual\">\n {{ 'No scan points chosen' | translate}}\n </div>\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"currentZone.isMultipleFloorZone\">\n {{ 'The zone is on several floors' | translate}}\n </div>\n </div>\n \n </div>\n </div>\n </div>\n <div class=\"mb-3\" *ngIf=\"isEditingZone\">\n <lib-add-zone [zoneEdit]=\"zoneForEdit\" [spaceID]=\"spaceID\" [images360]=\"images360\" [navigationIDs]=\"navigations\"\n [zones]=\"allZones\" [defaultZone]=\"defaultZone\" (updatedZone)=\"editCompleted($event)\" [isMuseumVisit]=\"isMuseumVisit\"></lib-add-zone>\n </div>\n <div class=\"mb-3\" *ngIf=\"isAddingAudioTrack\">\n <lib-add-audio-zone [spaceID]=\"spaceID\" [defaultZone]=\"defaultZone\" [parentZone]=\"parentZoneForAudio\" [zones]=\"allZones\" [currentAudioZone]=\"zoneForEdit\"\n (updatedZone)=\"editCompleted($event)\"></lib-add-audio-zone>\n </div>\n </div>\n", styles: [".museum-label{background-color:#6f3974;font-size:.95rem;border-radius:10px;padding:5px 10px;color:#fff;text-transform:uppercase;margin-left:auto;margin-right:8px}.default-zone-line-item{border-bottom-width:3px}.default-zone-label{background-color:var(--smarterplan-primary);font-size:.95rem;border-radius:10px;padding:5px 10px;color:#fff;text-transform:uppercase;margin-left:auto;margin-right:8px}\n"], components: [{ type: i4.TabNavigationComponent, selector: "lib-tab-navigation", inputs: ["menuItems"], outputs: ["onGoBack"] }, { type: i5.ChevronComponent, selector: "lib-chevron", inputs: ["conditionShowing"] }, { type: i6.PlanLegendComponent, selector: "lib-plan-legend", inputs: ["isAudioZone"] }, { type: i7.AddZoneComponent, selector: "lib-add-zone", inputs: ["zoneEdit", "spaceID", "images360", "navigationIDs", "zones", "newZoneDataFromEditor", "chosenPlan", "isMuseumVisit", "defaultZone"], outputs: ["updatedZone"] }, { type: i8.AddAudioZoneComponent, selector: "lib-add-audio-zone", inputs: ["spaceID", "defaultZone", "zones", "parentZone", "currentAudioZone"], outputs: ["updatedZone"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "translate": i3.TranslatePipe, "keyvalue": i9.KeyValuePipe } });
|
|
226
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: ZonesComponent, decorators: [{
|
|
227
|
-
type: Component,
|
|
228
|
-
args: [{ selector: 'lib-zones', template: "<div class=\"container-fluid\" *ngIf=\"currentSpace\">\n <div class=\"m-3\">\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"onGoBack()\"></lib-tab-navigation>\n </div>\n <div class=\"row\" *ngIf=\"!isEditingZone && !isAddingAudioTrack\">\n <div class=\"col-md-6\">\n <ul class=\"list-group list-group-flush\" >\n <li class=\"list-group-item default-zone-line-item\">\n <div class=\"d-flex justify-content-between align-items-center zone-name\" *ngIf=\"defaultZone\">\n {{defaultZone.name}}\n <div class=\"default-zone-label\">{{ \"whole space\" | translate }}</div>\n <lib-chevron [conditionShowing]=\"defaultShowing\" (click)=\"onToggleDefaultZone()\"></lib-chevron>\n </div>\n <div *ngIf=\"defaultShowing\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\">{{'Type of zone' | translate}}: \n {{defaultZone.layer ? defaultZone.layer.name : \"No type\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"defaultZone.surface\">\n {{'Surface' | translate}}, m<sup>2</sup>: {{defaultZone.surface }}\n </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!defaultZone.virtual\">{{'Scan Points' | translate}}:\n {{defaultZone.sweepIDs ? defaultZone.sweepIDs.length : \"No scan points\" | translate}} </li>\n </ul>\n <div *ngFor=\"let pair of zonesMap | keyvalue\">\n <div *ngIf=\"pair.key == defaultZone.id\">\n <h5 style=\"margin: 8px;\" *ngIf=\"pair.value.length > 0\">{{'Children zones'|translate}}</h5>\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item list-group-flush list-group-item-action\"\n *ngFor=\"let lot of pair.value; index as zoneIndex\">\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\n {{lot.name}}\n <div class=\"museum-label\" *ngIf=\"lot.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\n <lib-chevron [conditionShowing]=\"zoneIndex==lotIndexDetails\" (click)=\"onToggleDetail(zoneIndex, lot)\"></lib-chevron>\n \n </div>\n <div *ngIf=\"zoneIndex==lotIndexDetails\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.isMuseumVisitZone\">{{'Type of zone' |\n translate}}: {{lot.layer ? lot.layer.name :\n \"No type\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.surface\">\n {{'Surface' | translate}},m<sup>2</sup>: {{lot.surface }}\n </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.virtual\">{{'Scan Points' | translate}}:\n {{lot.sweepIDs ? lot.sweepIDs.length : \"No scan points\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.virtual\">\n {{'Zone not visible in 3D visit' | translate}}</li>\n </ul>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\n (click)=\"onEdit(lot)\">{{'Edit' | translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAudioZone(lot)\"\n *ngIf=\"isMuseumModule\"> {{'add-audio.add' | translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\"\n (click)=\"onDelete(lot)\">{{'Delete' | translate}}</button>\n </div>\n </li>\n </ul>\n \n </div>\n </div>\n </div>\n </li>\n \n <li class=\"list-group-item\" *ngFor=\"let floor of floorZones; index as index\">\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\n {{floor.name}}\n <!-- <small>({{ lot.metadata ? ('Calibrated' | translate) : ('Not calibrated' | translate)}})</small> -->\n <div class=\"museum-label\" *ngIf=\"floor.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\n <lib-chevron [conditionShowing]=\"index==floorDetails\" (click)=\"onToggleDetailFloor(index, floor)\"></lib-chevron>\n </div>\n <div *ngIf=\"index==floorDetails\"> \n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\">{{'Type of zone' | translate}}: {{floor.layer ?\n floor.layer.name :\n \"No type\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"floor.surface\">{{'Surface' | translate}}, m<sup>2</sup>:\n {{floor.surface }}\n </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!floor.virtual\">{{'Scan Points' | translate}}:\n {{floor.sweepIDs ? floor.sweepIDs.length : \"No scan points\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"floor.virtual\">{{'Zone not visible in 3D visit' |\n translate}}</li>\n </ul>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onEdit(floor)\">{{'Edit' |\n translate}}</button>\n \n <!-- List of children zones -->\n \n <div *ngFor=\"let pair of zonesMap | keyvalue\">\n <div *ngIf=\"pair.key == floor.id\">\n <h5 style=\"margin: 8px;\" *ngIf=\"pair.value.length > 0\">{{'Children zones'|translate}}</h5>\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item list-group-flush list-group-item-action\"\n *ngFor=\"let lot of pair.value; index as zoneIndex\">\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\n {{lot.name}}\n <div class=\"museum-label\" *ngIf=\"lot.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\n <lib-chevron [conditionShowing]=\"zoneIndex==lotIndexDetails\" (click)=\"onToggleDetail(zoneIndex, lot)\"></lib-chevron>\n \n </div>\n <div *ngIf=\"zoneIndex==lotIndexDetails\">\n <ul class=\"list-group list-group-flush\">\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.isMuseumVisitZone\">{{'Type of zone' |\n translate}}: {{lot.layer ? lot.layer.name :\n \"No type\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.surface\">{{'Surface' | translate}},\n m<sup>2</sup>:\n {{lot.surface }}\n </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.virtual\">{{'Scan Points' | translate}}:\n {{lot.sweepIDs ? lot.sweepIDs.length : \"No scan points\" | translate}} </li>\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.virtual\">{{'Zone not visible in 3D visit'\n |\n translate}}</li>\n </ul>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\n (click)=\"onEdit(lot)\">{{'Edit' | translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAudioZone(lot)\"\n *ngIf=\"isMuseumModule\"> {{'add-audio.add' | translate}}</button>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\"\n (click)=\"onDelete(lot)\">{{'Delete' | translate}}</button>\n </div>\n </li>\n </ul>\n \n </div>\n </div>\n </div>\n </li>\n </ul>\n \n <div>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddLot()\">{{'Add zone' |\n translate}}</button>\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddMuseumZone()\"\n *ngIf=\"isMuseumModule\"> {{'Add museum itinerary' | translate}}</button>\n <!-- <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAudioZone()\"\n *ngIf=\"isMuseumModule\"> {{'add-audio.add' | translate}}</button> -->\n </div>\n </div>\n <div class=\"col-md-6\">\n <div class=\"d-flex justify-content-center\" *ngIf=\"loadingPlan\">\n <div class=\"spinner-border\" role=\"status\">\n <span class=\"visually-hidden\">Loading...</span>\n </div>\n </div>\n <div class=\"row\" style=\"overflow: hidden; flex-direction: column;\" *ngIf=\"currentZone\">\n <lib-plan-legend [isAudioZone]=\"false\" *ngIf=\"currentPlan && !loadingPlan && plans\"></lib-plan-legend>\n <div class=\"mt-3 ms-3\" style=\"height: 500px; width: 100%;\" id=\"planDiv\" *ngIf=\"currentPlan\"></div>\n <div *ngIf=\"!currentPlan && plans && !loadingPlan\">\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"!currentZone.virtual && !currentZone.isMultipleFloorZone\">\n {{ 'Plan is not calibrated' | translate}}\n </div>\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"currentZone.virtual\">\n {{ 'No scan points chosen' | translate}}\n </div>\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"currentZone.isMultipleFloorZone\">\n {{ 'The zone is on several floors' | translate}}\n </div>\n </div>\n \n </div>\n </div>\n </div>\n <div class=\"mb-3\" *ngIf=\"isEditingZone\">\n <lib-add-zone [zoneEdit]=\"zoneForEdit\" [spaceID]=\"spaceID\" [images360]=\"images360\" [navigationIDs]=\"navigations\"\n [zones]=\"allZones\" [defaultZone]=\"defaultZone\" (updatedZone)=\"editCompleted($event)\" [isMuseumVisit]=\"isMuseumVisit\"></lib-add-zone>\n </div>\n <div class=\"mb-3\" *ngIf=\"isAddingAudioTrack\">\n <lib-add-audio-zone [spaceID]=\"spaceID\" [defaultZone]=\"defaultZone\" [parentZone]=\"parentZoneForAudio\" [zones]=\"allZones\" [currentAudioZone]=\"zoneForEdit\"\n (updatedZone)=\"editCompleted($event)\"></lib-add-audio-zone>\n </div>\n </div>\n", styles: [".museum-label{background-color:#6f3974;font-size:.95rem;border-radius:10px;padding:5px 10px;color:#fff;text-transform:uppercase;margin-left:auto;margin-right:8px}.default-zone-line-item{border-bottom-width:3px}.default-zone-label{background-color:var(--smarterplan-primary);font-size:.95rem;border-radius:10px;padding:5px 10px;color:#fff;text-transform:uppercase;margin-left:auto;margin-right:8px}\n"] }]
|
|
229
|
-
}], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.ZoneService }, { type: i2.SpaceService }, { type: i2.VisitService }, { type: i2.NavigationService }, { type: i2.BaseUserService }, { type: i2.PlanService }, { type: i3.TranslateService }]; }, propDecorators: { updatedZone: [{
|
|
230
|
-
type: Output
|
|
231
|
-
}] } });
|
|
232
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9uZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvem9uZXMvem9uZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvem9uZXMvem9uZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3hFLE9BQU8sRUFFOEMsSUFBSSxFQUFjLHlCQUF5QixFQUFxQixRQUFRLEVBQzVILE1BQU0sbUNBQW1DLENBQUM7QUFDM0MsT0FBTyxPQUFPLE1BQU0sU0FBUyxDQUFDOzs7Ozs7Ozs7OztBQU05QixNQUFNLE9BQU8sY0FBYztJQXNEdkIsWUFDWSxLQUFxQixFQUNyQixXQUF3QixFQUN4QixZQUEwQixFQUMxQixZQUEwQixFQUMxQixpQkFBb0MsRUFDcEMsV0FBNEIsRUFDNUIsV0FBd0IsRUFDeEIsU0FBMkI7UUFQM0IsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFDckIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFDNUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUE1RHZDLG9CQUFlLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFJWCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFNcEQsa0JBQWEsR0FBRyxLQUFLLENB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LENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDL0IsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxLQUFLLENBQUMsb0JBQW9CLENBQUMsV0FBeUI7UUFDaEQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQWdCLENBQUM7UUFDbEUsTUFBTSx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixPQUFPLENBQUMsT0FBTyxFQUFFO1lBQ2IsTUFBTSxFQUFFLElBQUk7WUFDWixhQUFhLEVBQUUsQ0FBQztZQUNoQixPQUFPLEVBQUUsR0FBRztTQUNmLENBQUMsQ0FBQztJQUNQLENBQUM7OzJHQTNSUSxjQUFjOytGQUFkLGNBQWMsK0dDYjNCLHdoV0E2S0E7MkZEaEthLGNBQWM7a0JBTDFCLFNBQVM7K0JBQ0ksV0FBVzs0U0FVWCxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBUcmFuc2xhdGVTZXJ2aWNlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge1xuICAgIE1lbnVJdGVtLCBab25lU2VydmljZSwgU3BhY2VTZXJ2aWNlLCBWaXNpdFNlcnZpY2UsXG4gICAgTmF2aWdhdGlvblNlcnZpY2UsIEJhc2VVc2VyU2VydmljZSwgUGxhblNlcnZpY2UsIHdhaXQsIE5hdmlnYXRpb24sIHNob3dTY2FuUG9pbnRzT25QbGFuSW5EaXYsIFBsYW4sIFNwYWNlLCBab25lLCBTcE1vZHVsZVxufSBmcm9tICdAc21hcnRlcnBsYW4vbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xuaW1wb3J0IHBhbnpvb20gZnJvbSBcInBhbnpvb21cIjtcbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnbGliLXpvbmVzJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vem9uZXMuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3pvbmVzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgWm9uZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgbG90SW5kZXhEZXRhaWxzID0gLTE7XG5cbiAgICBjdXJyZW50U3BhY2U6IFNwYWNlO1xuXG4gICAgQE91dHB1dCgpIHVwZGF0ZWRab25lID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgcGxhbnM6IFBsYW5bXTtcblxuICAgIHpvbmVGb3JFZGl0OiBab25lO1xuXG4gICAgaXNFZGl0aW5nWm9uZSA9IGZhbHNlO1xuXG4gICAgY2FwdHVyZURhdGU6IG51bWJlcjtcblxuICAgIHNwYWNlSUQ6IHN0cmluZztcblxuICAgIG5hdmlnYXRpb25zOiBzdHJpbmdbXTtcblxuICAgIGltYWdlczM2MDogYW55W107XG5cbiAgICBjYXJvdXNlbElzVmlzaWJsZSA9IGZhbHNlO1xuXG4gICAgcGxhbklzVmlzaWJsZSA9IGZhbHNlO1xuXG4gICAgY3VycmVudFBsYW46IFBsYW47XG5cbiAgICBjdXJyZW50Wm9uZTogWm9uZTtcblxuICAgIGxvYWRpbmdQbGFuID0gZmFsc2U7XG5cbiAgICBtZW51SXRlbXM6IE1lbnVJdGVtW10gPSBbXTtcblxuICAgIGlzTXVzZXVtVmlzaXQgPSBmYWxzZTtcblxuICAgIGlzTXVzZXVtTW9kdWxlID0gZmFsc2U7XG5cbiAgICBhbGxab25lczogWm9uZVtdO1xuXG4gICAgZmxvb3Jab25lczogWm9uZVtdID0gW107XG5cbiAgICB6b25lc01hcDogTWFwPHN0cmluZywgWm9uZVtdPiA9IG5ldyBNYXAoKTtcblxuICAgIGZsb29yRGV0YWlsczogbnVtYmVyID0gLTE7XG5cbiAgICBkZWZhdWx0Wm9uZTogWm9uZTtcblxuICAgIGRlZmF1bHRTaG93aW5nID0gZmFsc2U7XG5cbiAgICBpc0FkZGluZ0F1ZGlvVHJhY2sgPSBmYWxzZTtcblxuICAgIHBhcmVudFpvbmVGb3JBdWRpbzogWm9uZTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHJpdmF0ZSB6b25lU2VydmljZTogWm9uZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgc3BhY2VTZXJ2aWNlOiBTcGFjZVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgdmlzaXRTZXJ2aWNlOiBWaXNpdFNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbmF2aWdhdGlvblNlcnZpY2U6IE5hdmlnYXRpb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcGxhblNlcnZpY2U6IFBsYW5TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICApIHsgfVxuXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuc3BhY2VJRCA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1NYXAuZ2V0KFwiaWRcIik7XG4gICAgICAgIHRoaXMuaXNNdXNldW1Nb2R1bGUgPSB0aGlzLnVzZXJTZXJ2aWNlLmdldFNwTW9kdWxlKCkgPT09IFNwTW9kdWxlLk1VU0VVTTtcbiAgICAgICAgdGhpcy5yZXNldFpvbmVzKCk7XG4gICAgfVxuXG4gICAgc2V0dXBNZW51SXRlbXMoKSB7XG4gICAgICAgIHRoaXMubWVudUl0ZW1zID0gW1xuICAgICAgICAgICAgeyBsYWJlbDogXCJMb2NhdGlvbnNcIiwgdXJsOiBcIi9sb2NhbGlzYXRpb25cIiB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLmN1cnJlbnRTcGFjZS5uYW1lLFxuICAgICAgICAgICAgICAgIHVybDogYC9sb2NhbGlzYXRpb24vJHt0aGlzLnNwYWNlSUR9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IFwiWm9uZXNcIixcbiAgICAgICAgICAgICAgICB1cmw6IGAvbG9jYWxpc2F0aW9uLyR7dGhpcy5jdXJyZW50U3BhY2UuaWR9L3pvbmVzYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgb25Hb0JhY2soKSB7XG4gICAgICAgIHRoaXMuZWRpdENvbXBsZXRlZChudWxsKTtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcygpIHtcbiAgICAgICAgdGhpcy5yZXNldFpvbmVzKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVzZXRab25lcygpIHtcbiAgICAgICAgdGhpcy5pc011c2V1bVZpc2l0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuY3VycmVudFNwYWNlID0gYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UuZ2V0U3BhY2UodGhpcy5zcGFjZUlEKTtcbiAgICAgICAgdGhpcy5zZXR1cE1lbnVJdGVtcygpO1xuXG4gICAgICAgIHRoaXMuYWxsWm9uZXMgPSBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLmdldFpvbmVzQnlTcGFjZSh0aGlzLnNwYWNlSUQpO1xuICAgICAgICB0aGlzLmRlZmF1bHRab25lID0gdGhpcy5hbGxab25lcy5maW5kKFxuICAgICAgICAgICAgKHpvbmUpID0+IHpvbmUubGF5ZXIgJiYgem9uZS5sYXllci5uYW1lID09PSBcIkJVSUxESU5HXCIgJiYgem9uZS5zd2VlcElEcyxcbiAgICAgICAgKTtcblxuICAgICAgICB0aGlzLmZsb29yWm9uZXMgPSB0aGlzLmFsbFpvbmVzLmZpbHRlcihcbiAgICAgICAgICAgICh6b25lKSA9PiB6b25lLmxheWVyICYmIHpvbmUubGF5ZXIubmFtZSA9PT0gXCJGTE9PUlwiLFxuICAgICAgICApO1xuICAgICAgICAvLyB3ZSBhZGQgb25seSBjaGlsZHJlbiB6b25lcyB0aGF0IGFyZSBub3QgRmxvb3JzXG4gICAgICAgIHRoaXMuem9uZXNNYXAuc2V0KHRoaXMuZGVmYXVsdFpvbmUuaWQsIHRoaXMuYWxsWm9uZXMuZmlsdGVyKCh6b25lKSA9PiB6b25lLnBhcmVudElEID09PSB0aGlzLmRlZmF1bHRab25lLmlkICYmICF0aGlzLmZsb29yWm9uZXMuaW5jbHVkZXMoem9uZSkpKTtcbiAgICAgICAgZm9yIChjb25zdCBmbG9vciBvZiB0aGlzLmZsb29yWm9uZXMpIHtcbiAgICAgICAgICAgIHRoaXMuem9uZXNNYXAuc2V0KFxuICAgICAgICAgICAgICAgIGZsb29yLmlkLFxuICAgICAgICAgICAgICAgIHRoaXMuYWxsWm9uZXMuZmlsdGVyKCh6b25lKSA9PiB6b25lLnBhcmVudElEID09PSBmbG9vci5pZCksXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRoaXMuem9uZXMgPSBzb3J0QWxwaGFiZXRpY2FsbHlPbk5hbWUodGhpcy56b25lcyk7XG4gICAgICAgIHRoaXMucmVzZXROYXZpZ2F0aW9ucygpO1xuICAgICAgICB0aGlzLmltYWdlczM2MCA9IGF3YWl0IHRoaXMudmlzaXRTZXJ2aWNlLmxvYWRJbWFnZXNGb3JTcGFjZShcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFNwYWNlLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnBsYW5zID0gYXdhaXQgdGhpcy5wbGFuU2VydmljZS5nZXRQbGFuc1dpdGhab25lc0ZvclNwYWNlKFxuICAgICAgICAgICAgdGhpcy5zcGFjZUlELFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnBsYW5zID0gdGhpcy5wbGFucy5maWx0ZXIoKHBsYW4pID0+IHBsYW4uaXNDdXJyZW50Rm9yWm9uZSk7XG4gICAgICAgIHRoaXMub25QbGFuc0xvYWRlZCgpO1xuICAgIH1cblxuICAgIHJlc2V0TmF2aWdhdGlvbnMoKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdGlvbnMgPSBbXTtcbiAgICAgICAgY29uc3Qgem9uZXNXaXRoU3dlZXBzID0gdGhpcy5hbGxab25lcy5maWx0ZXIoKHpvbmUpID0+IHpvbmUuc3dlZXBJRHMpO1xuICAgICAgICB0aGlzLm5hdmlnYXRpb25zID0gW1xuICAgICAgICAgICAgLi4ubmV3IFNldCh6b25lc1dpdGhTd2VlcHMuZmxhdE1hcCgoem9uZSkgPT4gem9uZS5zd2VlcElEcykpLFxuICAgICAgICBdO1xuICAgIH1cblxuICAgIGFzeW5jIG9uUGxhbnNMb2FkZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLnBsYW5Jc1Zpc2libGUgJiYgdGhpcy5jdXJyZW50Wm9uZSkge1xuICAgICAgICAgICAgdGhpcy5wcmVwYXJlUGxhbigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogb25Ub2dnbGVEZXRhaWwgZm9sZHMvdW5mb2xkcyBkZXRhaWxzIGZvciBhIHpvbmVcbiAgICAgKiBAcGFyYW0gaSBpbmRleCBvZiB0aGUgbG90IHRvIGJlIHRvZ2dsZWRcbiAgICAgKi9cbiAgICBhc3luYyBvblRvZ2dsZURldGFpbChpbmRleDogbnVtYmVyLCB6b25lOiBab25lKSB7XG4gICAgICAgIHRoaXMubG90SW5kZXhEZXRhaWxzID0gaW5kZXggPT09IHRoaXMubG90SW5kZXhEZXRhaWxzID8gLTEgOiBpbmRleDtcbiAgICAgICAgaWYgKHRoaXMubG90SW5kZXhEZXRhaWxzID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50Wm9uZSA9IG51bGw7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXJyZW50Wm9uZSA9IHpvbmU7XG4gICAgICAgIHRoaXMucGxhbklzVmlzaWJsZSA9IHRydWU7XG4gICAgICAgIGlmICghdGhpcy5wbGFucykge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyB3YWl0IHVudGlsIHRoZSBwbGFucyBhcmUgc2V0XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMubG9hZGluZ1BsYW4pIHtcbiAgICAgICAgICAgIC8vIGFub3RoZXIgcGxhbiBpcyBhbHJlYWR5IGxvYWRpbmdcbiAgICAgICAgICAgIGF3YWl0IHdhaXQoMTAwMCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmVwYXJlUGxhbigpO1xuICAgIH1cblxuICAgIG9uVG9nZ2xlRGV0YWlsRmxvb3IoaW5kZXg6IG51bWJlciwgZmxvb3I6IFpvbmUpIHtcbiAgICAgICAgdGhpcy5kZWZhdWx0U2hvd2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZsb29yRGV0YWlscyA9IGluZGV4ID09PSB0aGlzLmZsb29yRGV0YWlscyA/IC0xIDogaW5kZXg7XG4gICAgICAgIGlmICh0aGlzLmZsb29yRGV0YWlscyA9PT0gLTEpIHtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFpvbmUgPSBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VycmVudFpvbmUgPSBmbG9vcjtcbiAgICAgICAgdGhpcy5wbGFuSXNWaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgaWYgKCF0aGlzLnBsYW5zKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInBsYW5zIG5vdCByZWFkeVwiKTtcbiAgICAgICAgICAgIHJldHVybjsgLy8gd2FpdCB1bnRpbCB0aGUgcGxhbnMgYXJlIHNldFxuICAgICAgICB9XG4gICAgICAgIHRoaXMucHJlcGFyZVBsYW4oKTtcbiAgICB9XG5cbiAgICBvblRvZ2dsZURlZmF1bHRab25lKCkge1xuICAgICAgICB0aGlzLmRlZmF1bHRTaG93aW5nID0gIXRoaXMuZGVmYXVsdFNob3dpbmc7XG4gICAgICAgIHRoaXMuY3VycmVudFpvbmUgPSB0aGlzLmRlZmF1bHRTaG93aW5nID8gdGhpcy5kZWZhdWx0Wm9uZSA6IG51bGw7XG4gICAgfVxuXG4gICAgYXN5bmMgcHJlcGFyZVBsYW4oKSB7XG4gICAgICAgIHRoaXMubG9hZGluZ1BsYW4gPSB0cnVlO1xuICAgICAgICB0aGlzLmN1cnJlbnRQbGFuID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFpvbmUudmlydHVhbCkge1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50UGxhbiA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdQbGFuID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jdXJyZW50UGxhbiA9IGF3YWl0IHRoaXMucGxhblNlcnZpY2UuZ2V0Q2FsaWJyYXRlZFBsYW5Gb3Jab25lKFxuICAgICAgICAgICAgdGhpcy5jdXJyZW50Wm9uZSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFBsYW4pIHtcbiAgICAgICAgICAgIGNvbnN0IHNjYW5zID0gYXdhaXQgdGhpcy5uYXZpZ2F0aW9uU2VydmljZS5nZXROYXZpZ2F0aW9uc0ZvclpvbmUoXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50Wm9uZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNob3dTY2FuUG9pbnRzT25QbGFuKHNjYW5zKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYWRpbmdQbGFuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdG9nZ2xlQ2Fyb3VzZWwoKSB7XG4gICAgICAgIHRoaXMuY2Fyb3VzZWxJc1Zpc2libGUgPSB0cnVlO1xuICAgIH1cblxuICAgIG9uRWRpdCh6b25lOiBab25lKSB7XG4gICAgICAgIHRoaXMuem9uZUZvckVkaXQgPSB6b25lO1xuICAgICAgICBpZiAodGhpcy56b25lRm9yRWRpdC5sYXllciAmJiB0aGlzLnpvbmVGb3JFZGl0LmxheWVyLm5hbWUgPT09IFwiQVVESU9cIikge1xuICAgICAgICAgICAgdGhpcy5pc0FkZGluZ0F1ZGlvVHJhY2sgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pc0VkaXRpbmdab25lID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWVudUl0ZW1zLnB1c2goe1xuICAgICAgICAgICAgbGFiZWw6IGAke3pvbmUubmFtZX1gLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkFkZExvdCgpIHtcbiAgICAgICAgdGhpcy5pc011c2V1bVZpc2l0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNFZGl0aW5nWm9uZSA9IHRydWU7XG4gICAgICAgIHRoaXMubWVudUl0ZW1zLnB1c2goe1xuICAgICAgICAgICAgbGFiZWw6IFwiTmV3XCIsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uQWRkTXVzZXVtWm9uZSgpIHtcbiAgICAgICAgdGhpcy5pc011c2V1bVZpc2l0ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pc0VkaXRpbmdab25lID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5tZW51SXRlbXMucHVzaCh7XG4gICAgICAgICAgICBsYWJlbDogXCJOZXcgTXVzZXVtIEl0aW5lcmFyeVwiLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvbkFkZEF1ZGlvWm9uZShwYXJlbnRab25lOiBab25lKSB7XG4gICAgICAgIHRoaXMucGFyZW50Wm9uZUZvckF1ZGlvID0gcGFyZW50Wm9uZTtcbiAgICAgICAgdGhpcy5pc0FkZGluZ0F1ZGlvVHJhY2sgPSB0cnVlO1xuICAgICAgICB0aGlzLm1lbnVJdGVtcy5wdXNoKHtcbiAgICAgICAgICAgIGxhYmVsOiBwYXJlbnRab25lLm5hbWUsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLm1lbnVJdGVtcy5wdXNoKHtcbiAgICAgICAgICAgIGxhYmVsOiBcImFkZC1hdWRpby5hZGRcIixcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25EZWxldGUoem9uZTogWm9uZSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChcImNvbmZpcm0uZGVsZXRlWm9uZVwiKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWFsZXJ0XG4gICAgICAgIGlmICh3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy56b25lU2VydmljZS5kZWxldGVab25lKHpvbmUuaWQpO1xuICAgICAgICAgICAgdGhpcy5hbGxab25lcy5zcGxpY2UodGhpcy5hbGxab25lcy5pbmRleE9mKHpvbmUpLCAxKTtcbiAgICAgICAgICAgIGlmICh6b25lLnBhcmVudElEICYmIEFycmF5LmZyb20odGhpcy56b25lc01hcC5rZXlzKCkpLmluY2x1ZGVzKHpvbmUucGFyZW50SUQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgem9uZXNGb3JQYXJlbnQgPSB0aGlzLnpvbmVzTWFwLmdldCh6b25lLnBhcmVudElEKTtcbiAgICAgICAgICAgICAgICB6b25lc0ZvclBhcmVudC5zcGxpY2Uoem9uZXNGb3JQYXJlbnQuaW5kZXhPZih6b25lKSwgMSk7XG4gICAgICAgICAgICAgICAgdGhpcy56b25lc01hcC5zZXQoem9uZS5wYXJlbnRJRCwgem9uZXNGb3JQYXJlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZWRpdENvbXBsZXRlZChldmVudDogYW55KSB7XG4gICAgICAgIHRoaXMubG90SW5kZXhEZXRhaWxzID0gLTE7XG4gICAgICAgIGlmIChldmVudCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldFpvbmVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc0VkaXRpbmdab25lID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNBZGRpbmdBdWRpb1RyYWNrID0gZmFsc2U7XG4gICAgICAgIHRoaXMuem9uZUZvckVkaXQgPSBudWxsO1xuICAgICAgICB0aGlzLnBsYW5Jc1Zpc2libGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jYXJvdXNlbElzVmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XG4gICAgfVxuXG4gICAgYXN5bmMgc2hvd1NjYW5Qb2ludHNPblBsYW4obmF2aWdhdGlvbnM6IE5hdmlnYXRpb25bXSkge1xuICAgICAgICBjb25zdCBkaXZQbGFuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNwbGFuRGl2XCIpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBhd2FpdCBzaG93U2NhblBvaW50c09uUGxhbkluRGl2KHRoaXMuY3VycmVudFBsYW4sIGRpdlBsYW4sIG5hdmlnYXRpb25zKTtcbiAgICAgICAgdGhpcy5sb2FkaW5nUGxhbiA9IGZhbHNlO1xuICAgICAgICBwYW56b29tKGRpdlBsYW4sIHtcbiAgICAgICAgICAgIGJvdW5kczogdHJ1ZSxcbiAgICAgICAgICAgIGJvdW5kc1BhZGRpbmc6IDAsXG4gICAgICAgICAgICBtYXhab29tOiAzLjUsXG4gICAgICAgIH0pO1xuICAgIH1cblxufVxuIiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiICpuZ0lmPVwiY3VycmVudFNwYWNlXCI+XG4gICAgPGRpdiBjbGFzcz1cIm0tM1wiPlxuICAgICAgPGxpYi10YWItbmF2aWdhdGlvbiBbbWVudUl0ZW1zXT0nbWVudUl0ZW1zJyAob25Hb0JhY2spPVwib25Hb0JhY2soKVwiPjwvbGliLXRhYi1uYXZpZ2F0aW9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdJZj1cIiFpc0VkaXRpbmdab25lICYmICFpc0FkZGluZ0F1ZGlvVHJhY2tcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxuICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIiA+XG4gICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGRlZmF1bHQtem9uZS1saW5lLWl0ZW1cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyIHpvbmUtbmFtZVwiICpuZ0lmPVwiZGVmYXVsdFpvbmVcIj5cbiAgICAgICAgICAgICAge3tkZWZhdWx0Wm9uZS5uYW1lfX1cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlZmF1bHQtem9uZS1sYWJlbFwiPnt7IFwid2hvbGUgc3BhY2VcIiB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8bGliLWNoZXZyb24gW2NvbmRpdGlvblNob3dpbmddPVwiZGVmYXVsdFNob3dpbmdcIiAoY2xpY2spPVwib25Ub2dnbGVEZWZhdWx0Wm9uZSgpXCI+PC9saWItY2hldnJvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImRlZmF1bHRTaG93aW5nXCI+XG4gICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J1R5cGUgb2Ygem9uZScgfCB0cmFuc2xhdGV9fTogXG4gICAgICAgICAgICAgICAgICB7e2RlZmF1bHRab25lLmxheWVyID8gZGVmYXVsdFpvbmUubGF5ZXIubmFtZSA6IFwiTm8gdHlwZVwiIHwgdHJhbnNsYXRlfX0gPC9saT5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIiAqbmdJZj1cImRlZmF1bHRab25lLnN1cmZhY2VcIj5cbiAgICAgICAgICAgICAgICAgIHt7J1N1cmZhY2UnIHwgdHJhbnNsYXRlfX0sIG08c3VwPjI8L3N1cD46IHt7ZGVmYXVsdFpvbmUuc3VyZmFjZSB9fVxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCIhZGVmYXVsdFpvbmUudmlydHVhbFwiPnt7J1NjYW4gUG9pbnRzJyB8IHRyYW5zbGF0ZX19OlxuICAgICAgICAgICAgICAgICAge3tkZWZhdWx0Wm9uZS5zd2VlcElEcyA/IGRlZmF1bHRab25lLnN3ZWVwSURzLmxlbmd0aCA6IFwiTm8gc2NhbiBwb2ludHNcIiB8IHRyYW5zbGF0ZX19IDwvbGk+XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHBhaXIgb2Ygem9uZXNNYXAgfCBrZXl2YWx1ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwYWlyLmtleSA9PSBkZWZhdWx0Wm9uZS5pZFwiPlxuICAgICAgICAgICAgICAgICAgPGg1IHN0eWxlPVwibWFyZ2luOiA4cHg7XCIgKm5nSWY9XCJwYWlyLnZhbHVlLmxlbmd0aCA+IDBcIj57eydDaGlsZHJlbiB6b25lcyd8dHJhbnNsYXRlfX08L2g1PlxuICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBsaXN0LWdyb3VwLWZsdXNoIGxpc3QtZ3JvdXAtaXRlbS1hY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBsb3Qgb2YgcGFpci52YWx1ZTsgaW5kZXggYXMgem9uZUluZGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgem9uZS1uYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7e2xvdC5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdXNldW0tbGFiZWxcIiAqbmdJZj1cImxvdC5pc011c2V1bVZpc2l0Wm9uZVwiPnt7IFwiaXRpbmVyYXJ5XCIgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxsaWItY2hldnJvbiBbY29uZGl0aW9uU2hvd2luZ109XCJ6b25lSW5kZXg9PWxvdEluZGV4RGV0YWlsc1wiIChjbGljayk9XCJvblRvZ2dsZURldGFpbCh6b25lSW5kZXgsIGxvdClcIj48L2xpYi1jaGV2cm9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInpvbmVJbmRleD09bG90SW5kZXhEZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCIhbG90LmlzTXVzZXVtVmlzaXRab25lXCI+e3snVHlwZSBvZiB6b25lJyB8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX06IHt7bG90LmxheWVyID8gbG90LmxheWVyLm5hbWUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiTm8gdHlwZVwiIHwgdHJhbnNsYXRlfX0gPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCJsb3Quc3VyZmFjZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J1N1cmZhY2UnIHwgdHJhbnNsYXRlfX0sbTxzdXA+Mjwvc3VwPjoge3tsb3Quc3VyZmFjZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIiAqbmdJZj1cIiFsb3QudmlydHVhbFwiPnt7J1NjYW4gUG9pbnRzJyB8IHRyYW5zbGF0ZX19OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bG90LnN3ZWVwSURzID8gbG90LnN3ZWVwSURzLmxlbmd0aCA6IFwiTm8gc2NhbiBwb2ludHNcIiB8IHRyYW5zbGF0ZX19IDwvbGk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiICpuZ0lmPVwibG90LnZpcnR1YWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydab25lIG5vdCB2aXNpYmxlIGluIDNEIHZpc2l0JyB8IHRyYW5zbGF0ZX19PC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRWRpdChsb3QpXCI+e3snRWRpdCcgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0yXCIgKGNsaWNrKT1cIm9uQWRkQXVkaW9ab25lKGxvdClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzTXVzZXVtTW9kdWxlXCI+IHt7J2FkZC1hdWRpby5hZGQnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRGVsZXRlKGxvdClcIj57eydEZWxldGUnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgIDwvdWw+XG4gIFxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgXG4gICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtXCIgKm5nRm9yPVwibGV0IGZsb29yIG9mIGZsb29yWm9uZXM7IGluZGV4IGFzIGluZGV4XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciB6b25lLW5hbWVcIj5cbiAgICAgICAgICAgICAge3tmbG9vci5uYW1lfX1cbiAgICAgICAgICAgICAgPCEtLSA8c21hbGw+KHt7IGxvdC5tZXRhZGF0YSA/ICgnQ2FsaWJyYXRlZCcgfCB0cmFuc2xhdGUpIDogKCdOb3QgY2FsaWJyYXRlZCcgfCB0cmFuc2xhdGUpfX0pPC9zbWFsbD4gLS0+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdXNldW0tbGFiZWxcIiAqbmdJZj1cImZsb29yLmlzTXVzZXVtVmlzaXRab25lXCI+e3sgXCJpdGluZXJhcnlcIiB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICA8bGliLWNoZXZyb24gW2NvbmRpdGlvblNob3dpbmddPVwiaW5kZXg9PWZsb29yRGV0YWlsc1wiIChjbGljayk9XCJvblRvZ2dsZURldGFpbEZsb29yKGluZGV4LCBmbG9vcilcIj48L2xpYi1jaGV2cm9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaW5kZXg9PWZsb29yRGV0YWlsc1wiPiAgXG4gICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiPnt7J1R5cGUgb2Ygem9uZScgfCB0cmFuc2xhdGV9fToge3tmbG9vci5sYXllciA/XG4gICAgICAgICAgICAgICAgICBmbG9vci5sYXllci5uYW1lIDpcbiAgICAgICAgICAgICAgICAgIFwiTm8gdHlwZVwiIHwgdHJhbnNsYXRlfX0gPC9saT5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIiAqbmdJZj1cImZsb29yLnN1cmZhY2VcIj57eydTdXJmYWNlJyB8IHRyYW5zbGF0ZX19LCBtPHN1cD4yPC9zdXA+OlxuICAgICAgICAgICAgICAgICAge3tmbG9vci5zdXJmYWNlIH19XG4gICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIiAqbmdJZj1cIiFmbG9vci52aXJ0dWFsXCI+e3snU2NhbiBQb2ludHMnIHwgdHJhbnNsYXRlfX06XG4gICAgICAgICAgICAgICAgICB7e2Zsb29yLnN3ZWVwSURzID8gZmxvb3Iuc3dlZXBJRHMubGVuZ3RoIDogXCJObyBzY2FuIHBvaW50c1wiIHwgdHJhbnNsYXRlfX0gPC9saT5cbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIiAqbmdJZj1cImZsb29yLnZpcnR1YWxcIj57eydab25lIG5vdCB2aXNpYmxlIGluIDNEIHZpc2l0JyB8XG4gICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvbGk+XG4gICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIiAoY2xpY2spPVwib25FZGl0KGZsb29yKVwiPnt7J0VkaXQnIHxcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fTwvYnV0dG9uPlxuICBcbiAgICAgICAgICAgICAgPCEtLSBMaXN0IG9mIGNoaWxkcmVuIHpvbmVzIC0tPlxuICBcbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcGFpciBvZiB6b25lc01hcCB8IGtleXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInBhaXIua2V5ID09IGZsb29yLmlkXCI+XG4gICAgICAgICAgICAgICAgICA8aDUgc3R5bGU9XCJtYXJnaW46IDhweDtcIiAqbmdJZj1cInBhaXIudmFsdWUubGVuZ3RoID4gMFwiPnt7J0NoaWxkcmVuIHpvbmVzJ3x0cmFuc2xhdGV9fTwvaDU+XG4gICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIj5cbiAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGxpc3QtZ3JvdXAtZmx1c2ggbGlzdC1ncm91cC1pdGVtLWFjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGxvdCBvZiBwYWlyLnZhbHVlOyBpbmRleCBhcyB6b25lSW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciB6b25lLW5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7bG90Lm5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm11c2V1bS1sYWJlbFwiICpuZ0lmPVwibG90LmlzTXVzZXVtVmlzaXRab25lXCI+e3sgXCJpdGluZXJhcnlcIiB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1jaGV2cm9uIFtjb25kaXRpb25TaG93aW5nXT1cInpvbmVJbmRleD09bG90SW5kZXhEZXRhaWxzXCIgKGNsaWNrKT1cIm9uVG9nZ2xlRGV0YWlsKHpvbmVJbmRleCwgbG90KVwiPjwvbGliLWNoZXZyb24+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiem9uZUluZGV4PT1sb3RJbmRleERldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtZ3JvdXAgbGlzdC1ncm91cC1mbHVzaFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIiAqbmdJZj1cIiFsb3QuaXNNdXNldW1WaXNpdFpvbmVcIj57eydUeXBlIG9mIHpvbmUnIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fToge3tsb3QubGF5ZXIgPyBsb3QubGF5ZXIubmFtZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJObyB0eXBlXCIgfCB0cmFuc2xhdGV9fSA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIiAqbmdJZj1cImxvdC5zdXJmYWNlXCI+e3snU3VyZmFjZScgfCB0cmFuc2xhdGV9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtPHN1cD4yPC9zdXA+OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bG90LnN1cmZhY2UgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCIhbG90LnZpcnR1YWxcIj57eydTY2FuIFBvaW50cycgfCB0cmFuc2xhdGV9fTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2xvdC5zd2VlcElEcyA/IGxvdC5zd2VlcElEcy5sZW5ndGggOiBcIk5vIHNjYW4gcG9pbnRzXCIgfCB0cmFuc2xhdGV9fSA8L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIiAqbmdJZj1cImxvdC52aXJ0dWFsXCI+e3snWm9uZSBub3QgdmlzaWJsZSBpbiAzRCB2aXNpdCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX08L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25FZGl0KGxvdClcIj57eydFZGl0JyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIiAoY2xpY2spPVwib25BZGRBdWRpb1pvbmUobG90KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiaXNNdXNldW1Nb2R1bGVcIj4ge3snYWRkLWF1ZGlvLmFkZCcgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGUobG90KVwiPnt7J0RlbGV0ZScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgICAgPC91bD5cbiAgXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC91bD5cbiAgXG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0yXCIgKGNsaWNrKT1cIm9uQWRkTG90KClcIj57eydBZGQgem9uZScgfFxuICAgICAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIiAoY2xpY2spPVwib25BZGRNdXNldW1ab25lKClcIlxuICAgICAgICAgICAgKm5nSWY9XCJpc011c2V1bU1vZHVsZVwiPiB7eydBZGQgbXVzZXVtIGl0aW5lcmFyeScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgIDwhLS0gPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0yXCIgKGNsaWNrKT1cIm9uQWRkQXVkaW9ab25lKClcIlxuICAgICAgICAgICAgKm5nSWY9XCJpc011c2V1bU1vZHVsZVwiPiB7eydhZGQtYXVkaW8uYWRkJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+IC0tPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwibG9hZGluZ1BsYW5cIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lci1ib3JkZXJcIiByb2xlPVwic3RhdHVzXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInZpc3VhbGx5LWhpZGRlblwiPkxvYWRpbmcuLi48L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgc3R5bGU9XCJvdmVyZmxvdzogaGlkZGVuOyBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1wiICpuZ0lmPVwiY3VycmVudFpvbmVcIj5cbiAgICAgICAgICA8bGliLXBsYW4tbGVnZW5kIFtpc0F1ZGlvWm9uZV09XCJmYWxzZVwiICpuZ0lmPVwiY3VycmVudFBsYW4gJiYgIWxvYWRpbmdQbGFuICYmIHBsYW5zXCI+PC9saWItcGxhbi1sZWdlbmQ+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTMgbXMtM1wiIHN0eWxlPVwiaGVpZ2h0OiA1MDBweDsgd2lkdGg6IDEwMCU7XCIgaWQ9XCJwbGFuRGl2XCIgKm5nSWY9XCJjdXJyZW50UGxhblwiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCIhY3VycmVudFBsYW4gJiYgcGxhbnMgJiYgIWxvYWRpbmdQbGFuXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMyBtcy0zXCIgaWQ9XCJuby1wbGFuXCIgKm5nSWY9XCIhY3VycmVudFpvbmUudmlydHVhbCAmJiAhY3VycmVudFpvbmUuaXNNdWx0aXBsZUZsb29yWm9uZVwiPlxuICAgICAgICAgICAgICB7eyAnUGxhbiBpcyBub3QgY2FsaWJyYXRlZCcgfCB0cmFuc2xhdGV9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtMyBtcy0zXCIgaWQ9XCJuby1wbGFuXCIgKm5nSWY9XCJjdXJyZW50Wm9uZS52aXJ0dWFsXCI+XG4gICAgICAgICAgICAgIHt7ICdObyBzY2FuIHBvaW50cyBjaG9zZW4nIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTMgbXMtM1wiIGlkPVwibm8tcGxhblwiICpuZ0lmPVwiY3VycmVudFpvbmUuaXNNdWx0aXBsZUZsb29yWm9uZVwiPlxuICAgICAgICAgICAgICB7eyAnVGhlIHpvbmUgaXMgb24gc2V2ZXJhbCBmbG9vcnMnIHwgdHJhbnNsYXRlfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIFxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtYi0zXCIgKm5nSWY9XCJpc0VkaXRpbmdab25lXCI+XG4gICAgICA8bGliLWFkZC16b25lIFt6b25lRWRpdF09XCJ6b25lRm9yRWRpdFwiIFtzcGFjZUlEXT1cInNwYWNlSURcIiBbaW1hZ2VzMzYwXT1cImltYWdlczM2MFwiIFtuYXZpZ2F0aW9uSURzXT1cIm5hdmlnYXRpb25zXCJcbiAgICAgICAgW3pvbmVzXT1cImFsbFpvbmVzXCIgW2RlZmF1bHRab25lXT1cImRlZmF1bHRab25lXCIgKHVwZGF0ZWRab25lKT1cImVkaXRDb21wbGV0ZWQoJGV2ZW50KVwiIFtpc011c2V1bVZpc2l0XT1cImlzTXVzZXVtVmlzaXRcIj48L2xpYi1hZGQtem9uZT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibWItM1wiICpuZ0lmPVwiaXNBZGRpbmdBdWRpb1RyYWNrXCI+XG4gICAgICA8bGliLWFkZC1hdWRpby16b25lIFtzcGFjZUlEXT1cInNwYWNlSURcIiBbZGVmYXVsdFpvbmVdPVwiZGVmYXVsdFpvbmVcIiBbcGFyZW50Wm9uZV09XCJwYXJlbnRab25lRm9yQXVkaW9cIiBbem9uZXNdPVwiYWxsWm9uZXNcIiBbY3VycmVudEF1ZGlvWm9uZV09XCJ6b25lRm9yRWRpdFwiXG4gICAgICAodXBkYXRlZFpvbmUpPVwiZWRpdENvbXBsZXRlZCgkZXZlbnQpXCI+PC9saWItYWRkLWF1ZGlvLXpvbmU+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuIl19
|
|
1
|
+
import { Component, EventEmitter, Output } from '@angular/core';
|
|
2
|
+
import { wait, showScanPointsOnPlanInDiv, SpModule } from '@smarterplan/ngx-smarterplan-core';
|
|
3
|
+
import panzoom from "panzoom";
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/router";
|
|
6
|
+
import * as i2 from "@smarterplan/ngx-smarterplan-core";
|
|
7
|
+
import * as i3 from "@ngx-translate/core";
|
|
8
|
+
import * as i4 from "../tab-navigation/tab-navigation.component";
|
|
9
|
+
import * as i5 from "../chevron/chevron.component";
|
|
10
|
+
import * as i6 from "./add-zone/add-zone.component";
|
|
11
|
+
import * as i7 from "./add-audio-zone/add-audio-zone.component";
|
|
12
|
+
import * as i8 from "@angular/common";
|
|
13
|
+
import * as i9 from "../../pipes/count-audio-sweeps.pipe";
|
|
14
|
+
export class ZonesComponent {
|
|
15
|
+
constructor(route, zoneService, spaceService, visitService, navigationService, userService, planService, translate) {
|
|
16
|
+
this.route = route;
|
|
17
|
+
this.zoneService = zoneService;
|
|
18
|
+
this.spaceService = spaceService;
|
|
19
|
+
this.visitService = visitService;
|
|
20
|
+
this.navigationService = navigationService;
|
|
21
|
+
this.userService = userService;
|
|
22
|
+
this.planService = planService;
|
|
23
|
+
this.translate = translate;
|
|
24
|
+
this.lotIndexDetails = -1;
|
|
25
|
+
this.updatedZone = new EventEmitter();
|
|
26
|
+
this.isEditingZone = false;
|
|
27
|
+
this.carouselIsVisible = false;
|
|
28
|
+
this.planIsVisible = false;
|
|
29
|
+
this.loadingPlan = false;
|
|
30
|
+
this.menuItems = [];
|
|
31
|
+
this.isMuseumVisit = false;
|
|
32
|
+
this.isMuseumModule = false;
|
|
33
|
+
this.floorZones = [];
|
|
34
|
+
this.zonesMap = new Map();
|
|
35
|
+
this.floorDetails = -1;
|
|
36
|
+
this.defaultShowing = false;
|
|
37
|
+
this.isAddingAudioTrack = false;
|
|
38
|
+
}
|
|
39
|
+
async ngOnInit() {
|
|
40
|
+
this.spaceID = this.route.snapshot.paramMap.get("id");
|
|
41
|
+
this.isMuseumModule = this.userService.getSpModule() === SpModule.MUSEUM;
|
|
42
|
+
this.resetZones();
|
|
43
|
+
}
|
|
44
|
+
setupMenuItems() {
|
|
45
|
+
this.menuItems = [
|
|
46
|
+
{ label: "Locations", url: "/localisation" },
|
|
47
|
+
{
|
|
48
|
+
label: this.currentSpace.name,
|
|
49
|
+
url: `/localisation/${this.spaceID}`,
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
label: "Zones",
|
|
53
|
+
url: `/localisation/${this.currentSpace.id}/zones`,
|
|
54
|
+
},
|
|
55
|
+
];
|
|
56
|
+
}
|
|
57
|
+
onGoBack() {
|
|
58
|
+
this.editCompleted(null);
|
|
59
|
+
}
|
|
60
|
+
ngOnChanges() {
|
|
61
|
+
this.resetZones();
|
|
62
|
+
}
|
|
63
|
+
async resetZones() {
|
|
64
|
+
this.isMuseumVisit = false;
|
|
65
|
+
this.currentSpace = await this.spaceService.getSpace(this.spaceID);
|
|
66
|
+
this.setupMenuItems();
|
|
67
|
+
this.allZones = await this.zoneService.getZonesBySpace(this.spaceID);
|
|
68
|
+
this.defaultZone = this.allZones.find((zone) => zone.layer && zone.layer.name === "BUILDING" && zone.sweepIDs);
|
|
69
|
+
this.floorZones = this.allZones.filter((zone) => zone.layer && zone.layer.name === "FLOOR");
|
|
70
|
+
// we add only children zones that are not Floors
|
|
71
|
+
this.zonesMap.set(this.defaultZone.id, this.allZones.filter((zone) => zone.parentID === this.defaultZone.id && !this.floorZones.includes(zone)));
|
|
72
|
+
for (const floor of this.floorZones) {
|
|
73
|
+
this.zonesMap.set(floor.id, this.allZones.filter((zone) => zone.parentID === floor.id));
|
|
74
|
+
}
|
|
75
|
+
// this.zones = sortAlphabeticallyOnName(this.zones);
|
|
76
|
+
this.resetNavigations();
|
|
77
|
+
this.images360 = await this.visitService.loadImagesForSpace(this.currentSpace);
|
|
78
|
+
this.plans = await this.planService.getPlansWithZonesForSpace(this.spaceID);
|
|
79
|
+
this.plans = this.plans.filter((plan) => plan.isCurrentForZone);
|
|
80
|
+
this.onPlansLoaded();
|
|
81
|
+
}
|
|
82
|
+
resetNavigations() {
|
|
83
|
+
this.navigations = [];
|
|
84
|
+
const zonesWithSweeps = this.allZones.filter((zone) => zone.sweepIDs);
|
|
85
|
+
this.navigations = [
|
|
86
|
+
...new Set(zonesWithSweeps.flatMap((zone) => zone.sweepIDs)),
|
|
87
|
+
];
|
|
88
|
+
}
|
|
89
|
+
async onPlansLoaded() {
|
|
90
|
+
if (this.planIsVisible && this.currentZone) {
|
|
91
|
+
this.preparePlan();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* onToggleDetail folds/unfolds details for a zone
|
|
96
|
+
* @param i index of the lot to be toggled
|
|
97
|
+
*/
|
|
98
|
+
async onToggleDetail(index, zone) {
|
|
99
|
+
this.lotIndexDetails = index === this.lotIndexDetails ? -1 : index;
|
|
100
|
+
if (this.lotIndexDetails === -1) {
|
|
101
|
+
this.currentZone = null;
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
this.currentZone = zone;
|
|
105
|
+
this.planIsVisible = true;
|
|
106
|
+
if (!this.plans) {
|
|
107
|
+
return; // wait until the plans are set
|
|
108
|
+
}
|
|
109
|
+
if (this.loadingPlan) {
|
|
110
|
+
// another plan is already loading
|
|
111
|
+
await wait(1000);
|
|
112
|
+
}
|
|
113
|
+
this.preparePlan();
|
|
114
|
+
}
|
|
115
|
+
onToggleDetailFloor(index, floor) {
|
|
116
|
+
this.defaultShowing = false;
|
|
117
|
+
this.floorDetails = index === this.floorDetails ? -1 : index;
|
|
118
|
+
if (this.floorDetails === -1) {
|
|
119
|
+
this.currentZone = null;
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
this.currentZone = floor;
|
|
123
|
+
this.planIsVisible = true;
|
|
124
|
+
if (!this.plans) {
|
|
125
|
+
console.log("plans not ready");
|
|
126
|
+
return; // wait until the plans are set
|
|
127
|
+
}
|
|
128
|
+
this.preparePlan();
|
|
129
|
+
}
|
|
130
|
+
onToggleDefaultZone() {
|
|
131
|
+
this.defaultShowing = !this.defaultShowing;
|
|
132
|
+
this.currentZone = this.defaultShowing ? this.defaultZone : null;
|
|
133
|
+
}
|
|
134
|
+
async preparePlan() {
|
|
135
|
+
this.loadingPlan = true;
|
|
136
|
+
this.currentPlan = null;
|
|
137
|
+
if (this.currentZone.virtual) {
|
|
138
|
+
this.currentPlan = null;
|
|
139
|
+
this.loadingPlan = false;
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
this.currentPlan = await this.planService.getCalibratedPlanForZone(this.currentZone);
|
|
143
|
+
if (this.currentPlan) {
|
|
144
|
+
const scans = await this.navigationService.getNavigationsForZone(this.currentZone);
|
|
145
|
+
await this.showScanPointsOnPlan(scans);
|
|
146
|
+
}
|
|
147
|
+
this.loadingPlan = false;
|
|
148
|
+
}
|
|
149
|
+
toggleCarousel() {
|
|
150
|
+
this.carouselIsVisible = true;
|
|
151
|
+
}
|
|
152
|
+
onEdit(zone) {
|
|
153
|
+
this.zoneForEdit = zone;
|
|
154
|
+
if (this.zoneForEdit.layer && this.zoneForEdit.layer.name === "AUDIO") {
|
|
155
|
+
this.isAddingAudioTrack = true;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
this.isEditingZone = true;
|
|
159
|
+
}
|
|
160
|
+
this.menuItems.push({
|
|
161
|
+
label: `${zone.name}`,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
onAddLot() {
|
|
165
|
+
this.isMuseumVisit = false;
|
|
166
|
+
this.isEditingZone = true;
|
|
167
|
+
this.menuItems.push({
|
|
168
|
+
label: "New",
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
onAddMuseumZone() {
|
|
172
|
+
this.isMuseumVisit = true;
|
|
173
|
+
this.isEditingZone = true;
|
|
174
|
+
this.menuItems.push({
|
|
175
|
+
label: "New Museum Itinerary",
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
onAddAudioZone(parentZone) {
|
|
179
|
+
this.parentZoneForAudio = parentZone;
|
|
180
|
+
this.isAddingAudioTrack = true;
|
|
181
|
+
this.menuItems.push({
|
|
182
|
+
label: parentZone.name,
|
|
183
|
+
});
|
|
184
|
+
this.menuItems.push({
|
|
185
|
+
label: "add-audio.add",
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
async onDelete(zone) {
|
|
189
|
+
const message = this.translate.instant("confirm.deleteZone");
|
|
190
|
+
// eslint-disable-next-line no-alert
|
|
191
|
+
if (window.confirm(message)) {
|
|
192
|
+
await this.zoneService.deleteZone(zone.id);
|
|
193
|
+
this.allZones.splice(this.allZones.indexOf(zone), 1);
|
|
194
|
+
if (zone.parentID && Array.from(this.zonesMap.keys()).includes(zone.parentID)) {
|
|
195
|
+
const zonesForParent = this.zonesMap.get(zone.parentID);
|
|
196
|
+
zonesForParent.splice(zonesForParent.indexOf(zone), 1);
|
|
197
|
+
this.zonesMap.set(zone.parentID, zonesForParent);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
editCompleted(event) {
|
|
202
|
+
this.lotIndexDetails = -1;
|
|
203
|
+
if (event) {
|
|
204
|
+
this.resetZones();
|
|
205
|
+
}
|
|
206
|
+
this.isEditingZone = false;
|
|
207
|
+
this.isAddingAudioTrack = false;
|
|
208
|
+
this.zoneForEdit = null;
|
|
209
|
+
this.planIsVisible = false;
|
|
210
|
+
this.carouselIsVisible = false;
|
|
211
|
+
this.setupMenuItems();
|
|
212
|
+
}
|
|
213
|
+
async showScanPointsOnPlan(navigations) {
|
|
214
|
+
const divPlan = document.querySelector("#planDiv");
|
|
215
|
+
await showScanPointsOnPlanInDiv(this.currentPlan, divPlan, navigations);
|
|
216
|
+
this.loadingPlan = false;
|
|
217
|
+
panzoom(divPlan, {
|
|
218
|
+
bounds: true,
|
|
219
|
+
boundsPadding: 0,
|
|
220
|
+
maxZoom: 3.5,
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
ZonesComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: ZonesComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.ZoneService }, { token: i2.SpaceService }, { token: i2.VisitService }, { token: i2.NavigationService }, { token: i2.BaseUserService }, { token: i2.PlanService }, { token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
225
|
+
ZonesComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: ZonesComponent, selector: "lib-zones", outputs: { updatedZone: "updatedZone" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"container-fluid\" *ngIf=\"currentSpace\">\r\n <div class=\"m-3\">\r\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"onGoBack()\"></lib-tab-navigation>\r\n </div>\r\n <div class=\"row\" *ngIf=\"!isEditingZone && !isAddingAudioTrack\">\r\n <div class=\"col-md-6\">\r\n <ul class=\"list-group list-group-flush\" >\r\n <li class=\"list-group-item default-zone-line-item\">\r\n <div class=\"d-flex justify-content-between align-items-center zone-name\" *ngIf=\"defaultZone\">\r\n {{defaultZone.name}}\r\n <div class=\"default-zone-label\">{{ \"whole space\" | translate }}</div>\r\n <lib-chevron [conditionShowing]=\"defaultShowing\" (click)=\"onToggleDefaultZone()\"></lib-chevron>\r\n </div>\r\n <div *ngIf=\"defaultShowing\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Type of zone' | translate}}: \r\n {{defaultZone.layer ? defaultZone.layer.name : \"No type\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"defaultZone.surface\">\r\n {{'Surface' | translate}}, m<sup>2</sup>: {{defaultZone.surface }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!defaultZone.virtual\">{{'Scan Points' | translate}}:\r\n {{defaultZone.sweepIDs ? defaultZone.sweepIDs.length : \"No scan points\" | translate}} </li>\r\n </ul>\r\n <div *ngFor=\"let pair of zonesMap | keyvalue\">\r\n <div *ngIf=\"pair.key == defaultZone.id\">\r\n <h5 style=\"margin: 8px;\" *ngIf=\"pair.value.length > 0\">{{'Children zones'|translate}}</h5>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item list-group-flush list-group-item-action\"\r\n *ngFor=\"let lot of pair.value; index as zoneIndex\">\r\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\r\n {{lot.name}}\r\n <div class=\"museum-label\" *ngIf=\"lot.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\r\n <lib-chevron [conditionShowing]=\"zoneIndex==lotIndexDetails\" (click)=\"onToggleDetail(zoneIndex, lot)\"></lib-chevron>\r\n \r\n </div>\r\n <div *ngIf=\"zoneIndex==lotIndexDetails\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.isMuseumVisitZone\">{{'Type of zone' |\r\n translate}}: {{lot.layer ? lot.layer.name :\r\n \"No type\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.surface\">\r\n {{'Surface' | translate}},m<sup>2</sup>: {{lot.surface }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.virtual\">{{'Scan Points' | translate}}:\r\n {{lot.sweepIDs ? lot.sweepIDs.length : \"No scan points\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.virtual\">\r\n {{'Zone not visible in 3D visit' | translate}}</li>\r\n </ul>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\r\n (click)=\"onEdit(lot)\">{{'Edit' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAudioZone(lot)\"\r\n *ngIf=\"isMuseumModule\"> {{'add-audio.add' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\"\r\n (click)=\"onDelete(lot)\">{{'Delete' | translate}}</button>\r\n </div>\r\n </li>\r\n </ul>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n </li>\r\n \r\n <li class=\"list-group-item\" *ngFor=\"let floor of floorZones; index as index\">\r\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\r\n {{floor.name}}\r\n <!-- <small>({{ lot.metadata ? ('Calibrated' | translate) : ('Not calibrated' | translate)}})</small> -->\r\n <div class=\"museum-label\" *ngIf=\"floor.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\r\n <lib-chevron [conditionShowing]=\"index==floorDetails\" (click)=\"onToggleDetailFloor(index, floor)\"></lib-chevron>\r\n </div>\r\n <div *ngIf=\"index==floorDetails\"> \r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Type of zone' | translate}}: {{floor.layer ?\r\n floor.layer.name :\r\n \"No type\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"floor.surface\">{{'Surface' | translate}}, m<sup>2</sup>:\r\n {{floor.surface }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!floor.virtual\">{{'Scan Points' | translate}}:\r\n {{floor.sweepIDs ? floor.sweepIDs.length : \"No scan points\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"floor.virtual\">{{'Zone not visible in 3D visit' |\r\n translate}}</li>\r\n </ul>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onEdit(floor)\">{{'Edit' |\r\n translate}}</button>\r\n \r\n <!-- List of children zones -->\r\n \r\n <div *ngFor=\"let pair of zonesMap | keyvalue\">\r\n <div *ngIf=\"pair.key == floor.id\">\r\n <h5 style=\"margin: 8px;\" *ngIf=\"pair.value.length > 0\">{{'Children zones'|translate}}</h5>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item list-group-flush list-group-item-action\"\r\n *ngFor=\"let lot of pair.value; index as zoneIndex\">\r\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\r\n {{lot.name}}\r\n <div class=\"museum-label\" *ngIf=\"lot.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\r\n <lib-chevron [conditionShowing]=\"zoneIndex==lotIndexDetails\" (click)=\"onToggleDetail(zoneIndex, lot)\"></lib-chevron>\r\n \r\n </div>\r\n <div *ngIf=\"zoneIndex==lotIndexDetails\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.isMuseumVisitZone\">{{'Type of zone' |\r\n translate}}: {{lot.layer ? lot.layer.name :\r\n \"No type\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.surface\">{{'Surface' | translate}},\r\n m<sup>2</sup>:\r\n {{lot.surface }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.virtual\">{{'Scan Points' | translate}}:\r\n {{lot.sweepIDs ? lot.sweepIDs.length : \"No scan points\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.virtual && lot.isMuseumVisitZone\">\r\n {{'Scan Points with audio' | translate}}: {{ lot | countAudioSweeps | async}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.virtual\">\r\n {{'Zone not visible in 3D visit' | translate}}</li>\r\n </ul>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\r\n (click)=\"onEdit(lot)\">{{'Edit' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAudioZone(lot)\"\r\n *ngIf=\"isMuseumModule\"> {{'add-audio.add' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\"\r\n (click)=\"onDelete(lot)\">{{'Delete' | translate}}</button>\r\n </div>\r\n </li>\r\n </ul>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n \r\n <div>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddLot()\">{{'Add zone' |\r\n translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddMuseumZone()\"\r\n *ngIf=\"isMuseumModule\"> {{'Add museum itinerary' | translate}}</button>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loadingPlan\">\r\n <div class=\"spinner-border\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n </div>\r\n <div class=\"row\" style=\"overflow: hidden;\" *ngIf=\"currentZone\">\r\n <div class=\"mt-3 ms-3\" style=\"height: 500px; width: 100%;\" id=\"planDiv\" *ngIf=\"currentPlan\"></div>\r\n <div *ngIf=\"!currentPlan && plans && !loadingPlan\">\r\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"!currentZone.virtual && !currentZone.isMultipleFloorZone\">\r\n {{ 'Plan is not calibrated' | translate}}\r\n </div>\r\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"currentZone.virtual\">\r\n {{ 'No scan points chosen' | translate}}\r\n </div>\r\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"currentZone.isMultipleFloorZone\">\r\n {{ 'The zone is on several floors' | translate}}\r\n </div>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"isEditingZone\">\r\n <lib-add-zone [zoneEdit]=\"zoneForEdit\" [spaceID]=\"spaceID\" [images360]=\"images360\" [navigationIDs]=\"navigations\"\r\n [zones]=\"allZones\" [defaultZone]=\"defaultZone\" (updatedZone)=\"editCompleted($event)\" [isMuseumVisit]=\"isMuseumVisit\"></lib-add-zone>\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"isAddingAudioTrack\">\r\n <lib-add-audio-zone [spaceID]=\"spaceID\" [defaultZone]=\"defaultZone\" [parentZone]=\"parentZoneForAudio\" [zones]=\"allZones\" [currentAudioZone]=\"zoneForEdit\"\r\n (updatedZone)=\"editCompleted($event)\"></lib-add-audio-zone>\r\n </div>\r\n </div>\r\n", styles: [".museum-label{background-color:#6f3974;font-size:.95rem;border-radius:10px;padding:5px 10px;color:#fff;text-transform:uppercase;margin-left:auto;margin-right:8px}.default-zone-line-item{border-bottom-width:3px}.default-zone-label{background-color:var(--smarterplan-primary);font-size:.95rem;border-radius:10px;padding:5px 10px;color:#fff;text-transform:uppercase;margin-left:auto;margin-right:8px}\n"], components: [{ type: i4.TabNavigationComponent, selector: "lib-tab-navigation", inputs: ["menuItems"], outputs: ["onGoBack"] }, { type: i5.ChevronComponent, selector: "lib-chevron", inputs: ["conditionShowing"] }, { type: i6.AddZoneComponent, selector: "lib-add-zone", inputs: ["zoneEdit", "spaceID", "images360", "navigationIDs", "zones", "newZoneDataFromEditor", "chosenPlan", "isMuseumVisit", "defaultZone"], outputs: ["updatedZone"] }, { type: i7.AddAudioZoneComponent, selector: "lib-add-audio-zone", inputs: ["spaceID", "defaultZone", "zones", "parentZone", "currentAudioZone"], outputs: ["updatedZone"] }], directives: [{ type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "translate": i3.TranslatePipe, "keyvalue": i8.KeyValuePipe, "async": i8.AsyncPipe, "countAudioSweeps": i9.CountAudioSweepsPipe } });
|
|
226
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: ZonesComponent, decorators: [{
|
|
227
|
+
type: Component,
|
|
228
|
+
args: [{ selector: 'lib-zones', template: "<div class=\"container-fluid\" *ngIf=\"currentSpace\">\r\n <div class=\"m-3\">\r\n <lib-tab-navigation [menuItems]='menuItems' (onGoBack)=\"onGoBack()\"></lib-tab-navigation>\r\n </div>\r\n <div class=\"row\" *ngIf=\"!isEditingZone && !isAddingAudioTrack\">\r\n <div class=\"col-md-6\">\r\n <ul class=\"list-group list-group-flush\" >\r\n <li class=\"list-group-item default-zone-line-item\">\r\n <div class=\"d-flex justify-content-between align-items-center zone-name\" *ngIf=\"defaultZone\">\r\n {{defaultZone.name}}\r\n <div class=\"default-zone-label\">{{ \"whole space\" | translate }}</div>\r\n <lib-chevron [conditionShowing]=\"defaultShowing\" (click)=\"onToggleDefaultZone()\"></lib-chevron>\r\n </div>\r\n <div *ngIf=\"defaultShowing\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Type of zone' | translate}}: \r\n {{defaultZone.layer ? defaultZone.layer.name : \"No type\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"defaultZone.surface\">\r\n {{'Surface' | translate}}, m<sup>2</sup>: {{defaultZone.surface }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!defaultZone.virtual\">{{'Scan Points' | translate}}:\r\n {{defaultZone.sweepIDs ? defaultZone.sweepIDs.length : \"No scan points\" | translate}} </li>\r\n </ul>\r\n <div *ngFor=\"let pair of zonesMap | keyvalue\">\r\n <div *ngIf=\"pair.key == defaultZone.id\">\r\n <h5 style=\"margin: 8px;\" *ngIf=\"pair.value.length > 0\">{{'Children zones'|translate}}</h5>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item list-group-flush list-group-item-action\"\r\n *ngFor=\"let lot of pair.value; index as zoneIndex\">\r\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\r\n {{lot.name}}\r\n <div class=\"museum-label\" *ngIf=\"lot.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\r\n <lib-chevron [conditionShowing]=\"zoneIndex==lotIndexDetails\" (click)=\"onToggleDetail(zoneIndex, lot)\"></lib-chevron>\r\n \r\n </div>\r\n <div *ngIf=\"zoneIndex==lotIndexDetails\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.isMuseumVisitZone\">{{'Type of zone' |\r\n translate}}: {{lot.layer ? lot.layer.name :\r\n \"No type\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.surface\">\r\n {{'Surface' | translate}},m<sup>2</sup>: {{lot.surface }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.virtual\">{{'Scan Points' | translate}}:\r\n {{lot.sweepIDs ? lot.sweepIDs.length : \"No scan points\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.virtual\">\r\n {{'Zone not visible in 3D visit' | translate}}</li>\r\n </ul>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\r\n (click)=\"onEdit(lot)\">{{'Edit' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAudioZone(lot)\"\r\n *ngIf=\"isMuseumModule\"> {{'add-audio.add' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\"\r\n (click)=\"onDelete(lot)\">{{'Delete' | translate}}</button>\r\n </div>\r\n </li>\r\n </ul>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n </li>\r\n \r\n <li class=\"list-group-item\" *ngFor=\"let floor of floorZones; index as index\">\r\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\r\n {{floor.name}}\r\n <!-- <small>({{ lot.metadata ? ('Calibrated' | translate) : ('Not calibrated' | translate)}})</small> -->\r\n <div class=\"museum-label\" *ngIf=\"floor.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\r\n <lib-chevron [conditionShowing]=\"index==floorDetails\" (click)=\"onToggleDetailFloor(index, floor)\"></lib-chevron>\r\n </div>\r\n <div *ngIf=\"index==floorDetails\"> \r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\">{{'Type of zone' | translate}}: {{floor.layer ?\r\n floor.layer.name :\r\n \"No type\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"floor.surface\">{{'Surface' | translate}}, m<sup>2</sup>:\r\n {{floor.surface }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!floor.virtual\">{{'Scan Points' | translate}}:\r\n {{floor.sweepIDs ? floor.sweepIDs.length : \"No scan points\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"floor.virtual\">{{'Zone not visible in 3D visit' |\r\n translate}}</li>\r\n </ul>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onEdit(floor)\">{{'Edit' |\r\n translate}}</button>\r\n \r\n <!-- List of children zones -->\r\n \r\n <div *ngFor=\"let pair of zonesMap | keyvalue\">\r\n <div *ngIf=\"pair.key == floor.id\">\r\n <h5 style=\"margin: 8px;\" *ngIf=\"pair.value.length > 0\">{{'Children zones'|translate}}</h5>\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item list-group-flush list-group-item-action\"\r\n *ngFor=\"let lot of pair.value; index as zoneIndex\">\r\n <div class=\"d-flex justify-content-between align-items-center zone-name\">\r\n {{lot.name}}\r\n <div class=\"museum-label\" *ngIf=\"lot.isMuseumVisitZone\">{{ \"itinerary\" | translate }}</div>\r\n <lib-chevron [conditionShowing]=\"zoneIndex==lotIndexDetails\" (click)=\"onToggleDetail(zoneIndex, lot)\"></lib-chevron>\r\n \r\n </div>\r\n <div *ngIf=\"zoneIndex==lotIndexDetails\">\r\n <ul class=\"list-group list-group-flush\">\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.isMuseumVisitZone\">{{'Type of zone' |\r\n translate}}: {{lot.layer ? lot.layer.name :\r\n \"No type\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.surface\">{{'Surface' | translate}},\r\n m<sup>2</sup>:\r\n {{lot.surface }}\r\n </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.virtual\">{{'Scan Points' | translate}}:\r\n {{lot.sweepIDs ? lot.sweepIDs.length : \"No scan points\" | translate}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"!lot.virtual && lot.isMuseumVisitZone\">\r\n {{'Scan Points with audio' | translate}}: {{ lot | countAudioSweeps | async}} </li>\r\n <li class=\"list-group-item bg-transparent\" *ngIf=\"lot.virtual\">\r\n {{'Zone not visible in 3D visit' | translate}}</li>\r\n </ul>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\"\r\n (click)=\"onEdit(lot)\">{{'Edit' | translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddAudioZone(lot)\"\r\n *ngIf=\"isMuseumModule\"> {{'add-audio.add' | translate}}</button>\r\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill\"\r\n (click)=\"onDelete(lot)\">{{'Delete' | translate}}</button>\r\n </div>\r\n </li>\r\n </ul>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n \r\n <div>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddLot()\">{{'Add zone' |\r\n translate}}</button>\r\n <button class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onAddMuseumZone()\"\r\n *ngIf=\"isMuseumModule\"> {{'Add museum itinerary' | translate}}</button>\r\n </div>\r\n </div>\r\n <div class=\"col-md-6\">\r\n <div class=\"d-flex justify-content-center\" *ngIf=\"loadingPlan\">\r\n <div class=\"spinner-border\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n </div>\r\n </div>\r\n <div class=\"row\" style=\"overflow: hidden;\" *ngIf=\"currentZone\">\r\n <div class=\"mt-3 ms-3\" style=\"height: 500px; width: 100%;\" id=\"planDiv\" *ngIf=\"currentPlan\"></div>\r\n <div *ngIf=\"!currentPlan && plans && !loadingPlan\">\r\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"!currentZone.virtual && !currentZone.isMultipleFloorZone\">\r\n {{ 'Plan is not calibrated' | translate}}\r\n </div>\r\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"currentZone.virtual\">\r\n {{ 'No scan points chosen' | translate}}\r\n </div>\r\n <div class=\"mt-3 ms-3\" id=\"no-plan\" *ngIf=\"currentZone.isMultipleFloorZone\">\r\n {{ 'The zone is on several floors' | translate}}\r\n </div>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"isEditingZone\">\r\n <lib-add-zone [zoneEdit]=\"zoneForEdit\" [spaceID]=\"spaceID\" [images360]=\"images360\" [navigationIDs]=\"navigations\"\r\n [zones]=\"allZones\" [defaultZone]=\"defaultZone\" (updatedZone)=\"editCompleted($event)\" [isMuseumVisit]=\"isMuseumVisit\"></lib-add-zone>\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"isAddingAudioTrack\">\r\n <lib-add-audio-zone [spaceID]=\"spaceID\" [defaultZone]=\"defaultZone\" [parentZone]=\"parentZoneForAudio\" [zones]=\"allZones\" [currentAudioZone]=\"zoneForEdit\"\r\n (updatedZone)=\"editCompleted($event)\"></lib-add-audio-zone>\r\n </div>\r\n </div>\r\n", styles: [".museum-label{background-color:#6f3974;font-size:.95rem;border-radius:10px;padding:5px 10px;color:#fff;text-transform:uppercase;margin-left:auto;margin-right:8px}.default-zone-line-item{border-bottom-width:3px}.default-zone-label{background-color:var(--smarterplan-primary);font-size:.95rem;border-radius:10px;padding:5px 10px;color:#fff;text-transform:uppercase;margin-left:auto;margin-right:8px}\n"] }]
|
|
229
|
+
}], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.ZoneService }, { type: i2.SpaceService }, { type: i2.VisitService }, { type: i2.NavigationService }, { type: i2.BaseUserService }, { type: i2.PlanService }, { type: i3.TranslateService }]; }, propDecorators: { updatedZone: [{
|
|
230
|
+
type: Output
|
|
231
|
+
}] } });
|
|
232
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiem9uZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvem9uZXMvem9uZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvem9uZXMvem9uZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3hFLE9BQU8sRUFFOEMsSUFBSSxFQUFjLHlCQUF5QixFQUFxQixRQUFRLEVBQzVILE1BQU0sbUNBQW1DLENBQUM7QUFDM0MsT0FBTyxPQUFPLE1BQU0sU0FBUyxDQUFDOzs7Ozs7Ozs7OztBQU05QixNQUFNLE9BQU8sY0FBYztJQXNEdkIsWUFDWSxLQUFxQixFQUNyQixXQUF3QixFQUN4QixZQUEwQixFQUMxQixZQUEwQixFQUMxQixpQkFBb0MsRUFDcEMsV0FBNEIsRUFDNUIsV0FBd0IsRUFDeEIsU0FBMkI7UUFQM0IsVUFBSyxHQUFMLEtBQUssQ0FBZ0I7UUFDckIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUNwQyxnQkFBVyxHQUFYLFdBQVcsQ0FBaUI7UUFDNUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUE1RHZDLG9CQUFlLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFJWCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFNcEQsa0JBQWEsR0FBRyxLQUFLLENB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LENBQUMsa0JBQWtCLEdBQUcsS0FBSyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7UUFDL0IsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRCxLQUFLLENBQUMsb0JBQW9CLENBQUMsV0FBeUI7UUFDaEQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQWdCLENBQUM7UUFDbEUsTUFBTSx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixPQUFPLENBQUMsT0FBTyxFQUFFO1lBQ2IsTUFBTSxFQUFFLElBQUk7WUFDWixhQUFhLEVBQUUsQ0FBQztZQUNoQixPQUFPLEVBQUUsR0FBRztTQUNmLENBQUMsQ0FBQztJQUNQLENBQUM7OzJHQTNSUSxjQUFjOytGQUFkLGNBQWMsK0dDYjNCLGl2V0EyS0E7MkZEOUphLGNBQWM7a0JBTDFCLFNBQVM7K0JBQ0ksV0FBVzs0U0FVWCxXQUFXO3NCQUFwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gICAgTWVudUl0ZW0sIFpvbmVTZXJ2aWNlLCBTcGFjZVNlcnZpY2UsIFZpc2l0U2VydmljZSxcclxuICAgIE5hdmlnYXRpb25TZXJ2aWNlLCBCYXNlVXNlclNlcnZpY2UsIFBsYW5TZXJ2aWNlLCB3YWl0LCBOYXZpZ2F0aW9uLCBzaG93U2NhblBvaW50c09uUGxhbkluRGl2LCBQbGFuLCBTcGFjZSwgWm9uZSwgU3BNb2R1bGVcclxufSBmcm9tICdAc21hcnRlcnBsYW4vbmd4LXNtYXJ0ZXJwbGFuLWNvcmUnO1xyXG5pbXBvcnQgcGFuem9vbSBmcm9tIFwicGFuem9vbVwiO1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbGliLXpvbmVzJyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi96b25lcy5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi96b25lcy5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBab25lc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcblxyXG4gICAgbG90SW5kZXhEZXRhaWxzID0gLTE7XHJcblxyXG4gICAgY3VycmVudFNwYWNlOiBTcGFjZTtcclxuXHJcbiAgICBAT3V0cHV0KCkgdXBkYXRlZFpvbmUgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XHJcblxyXG4gICAgcGxhbnM6IFBsYW5bXTtcclxuXHJcbiAgICB6b25lRm9yRWRpdDogWm9uZTtcclxuXHJcbiAgICBpc0VkaXRpbmdab25lID0gZmFsc2U7XHJcblxyXG4gICAgY2FwdHVyZURhdGU6IG51bWJlcjtcclxuXHJcbiAgICBzcGFjZUlEOiBzdHJpbmc7XHJcblxyXG4gICAgbmF2aWdhdGlvbnM6IHN0cmluZ1tdO1xyXG5cclxuICAgIGltYWdlczM2MDogYW55W107XHJcblxyXG4gICAgY2Fyb3VzZWxJc1Zpc2libGUgPSBmYWxzZTtcclxuXHJcbiAgICBwbGFuSXNWaXNpYmxlID0gZmFsc2U7XHJcblxyXG4gICAgY3VycmVudFBsYW46IFBsYW47XHJcblxyXG4gICAgY3VycmVudFpvbmU6IFpvbmU7XHJcblxyXG4gICAgbG9hZGluZ1BsYW4gPSBmYWxzZTtcclxuXHJcbiAgICBtZW51SXRlbXM6IE1lbnVJdGVtW10gPSBbXTtcclxuXHJcbiAgICBpc011c2V1bVZpc2l0ID0gZmFsc2U7XHJcblxyXG4gICAgaXNNdXNldW1Nb2R1bGUgPSBmYWxzZTtcclxuXHJcbiAgICBhbGxab25lczogWm9uZVtdO1xyXG5cclxuICAgIGZsb29yWm9uZXM6IFpvbmVbXSA9IFtdO1xyXG5cclxuICAgIHpvbmVzTWFwOiBNYXA8c3RyaW5nLCBab25lW10+ID0gbmV3IE1hcCgpO1xyXG5cclxuICAgIGZsb29yRGV0YWlsczogbnVtYmVyID0gLTE7XHJcblxyXG4gICAgZGVmYXVsdFpvbmU6IFpvbmU7XHJcblxyXG4gICAgZGVmYXVsdFNob3dpbmcgPSBmYWxzZTtcclxuXHJcbiAgICBpc0FkZGluZ0F1ZGlvVHJhY2sgPSBmYWxzZTtcclxuXHJcbiAgICBwYXJlbnRab25lRm9yQXVkaW86IFpvbmU7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgcHJpdmF0ZSB6b25lU2VydmljZTogWm9uZVNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBzcGFjZVNlcnZpY2U6IFNwYWNlU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHZpc2l0U2VydmljZTogVmlzaXRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgbmF2aWdhdGlvblNlcnZpY2U6IE5hdmlnYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdXNlclNlcnZpY2U6IEJhc2VVc2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHBsYW5TZXJ2aWNlOiBQbGFuU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcclxuICAgICkgeyB9XHJcblxyXG4gICAgYXN5bmMgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5zcGFjZUlEID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbU1hcC5nZXQoXCJpZFwiKTtcclxuICAgICAgICB0aGlzLmlzTXVzZXVtTW9kdWxlID0gdGhpcy51c2VyU2VydmljZS5nZXRTcE1vZHVsZSgpID09PSBTcE1vZHVsZS5NVVNFVU07XHJcbiAgICAgICAgdGhpcy5yZXNldFpvbmVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0dXBNZW51SXRlbXMoKSB7XHJcbiAgICAgICAgdGhpcy5tZW51SXRlbXMgPSBbXHJcbiAgICAgICAgICAgIHsgbGFiZWw6IFwiTG9jYXRpb25zXCIsIHVybDogXCIvbG9jYWxpc2F0aW9uXCIgfSxcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuY3VycmVudFNwYWNlLm5hbWUsXHJcbiAgICAgICAgICAgICAgICB1cmw6IGAvbG9jYWxpc2F0aW9uLyR7dGhpcy5zcGFjZUlEfWAsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGxhYmVsOiBcIlpvbmVzXCIsXHJcbiAgICAgICAgICAgICAgICB1cmw6IGAvbG9jYWxpc2F0aW9uLyR7dGhpcy5jdXJyZW50U3BhY2UuaWR9L3pvbmVzYCxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICBdO1xyXG4gICAgfVxyXG5cclxuICAgIG9uR29CYWNrKCkge1xyXG4gICAgICAgIHRoaXMuZWRpdENvbXBsZXRlZChudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uQ2hhbmdlcygpIHtcclxuICAgICAgICB0aGlzLnJlc2V0Wm9uZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXNldFpvbmVzKCkge1xyXG4gICAgICAgIHRoaXMuaXNNdXNldW1WaXNpdCA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY3VycmVudFNwYWNlID0gYXdhaXQgdGhpcy5zcGFjZVNlcnZpY2UuZ2V0U3BhY2UodGhpcy5zcGFjZUlEKTtcclxuICAgICAgICB0aGlzLnNldHVwTWVudUl0ZW1zKCk7XHJcblxyXG4gICAgICAgIHRoaXMuYWxsWm9uZXMgPSBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLmdldFpvbmVzQnlTcGFjZSh0aGlzLnNwYWNlSUQpO1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdFpvbmUgPSB0aGlzLmFsbFpvbmVzLmZpbmQoXHJcbiAgICAgICAgICAgICh6b25lKSA9PiB6b25lLmxheWVyICYmIHpvbmUubGF5ZXIubmFtZSA9PT0gXCJCVUlMRElOR1wiICYmIHpvbmUuc3dlZXBJRHMsXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgdGhpcy5mbG9vclpvbmVzID0gdGhpcy5hbGxab25lcy5maWx0ZXIoXHJcbiAgICAgICAgICAgICh6b25lKSA9PiB6b25lLmxheWVyICYmIHpvbmUubGF5ZXIubmFtZSA9PT0gXCJGTE9PUlwiLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgLy8gd2UgYWRkIG9ubHkgY2hpbGRyZW4gem9uZXMgdGhhdCBhcmUgbm90IEZsb29yc1xyXG4gICAgICAgIHRoaXMuem9uZXNNYXAuc2V0KHRoaXMuZGVmYXVsdFpvbmUuaWQsIHRoaXMuYWxsWm9uZXMuZmlsdGVyKCh6b25lKSA9PiB6b25lLnBhcmVudElEID09PSB0aGlzLmRlZmF1bHRab25lLmlkICYmICF0aGlzLmZsb29yWm9uZXMuaW5jbHVkZXMoem9uZSkpKTtcclxuICAgICAgICBmb3IgKGNvbnN0IGZsb29yIG9mIHRoaXMuZmxvb3Jab25lcykge1xyXG4gICAgICAgICAgICB0aGlzLnpvbmVzTWFwLnNldChcclxuICAgICAgICAgICAgICAgIGZsb29yLmlkLFxyXG4gICAgICAgICAgICAgICAgdGhpcy5hbGxab25lcy5maWx0ZXIoKHpvbmUpID0+IHpvbmUucGFyZW50SUQgPT09IGZsb29yLmlkKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gdGhpcy56b25lcyA9IHNvcnRBbHBoYWJldGljYWxseU9uTmFtZSh0aGlzLnpvbmVzKTtcclxuICAgICAgICB0aGlzLnJlc2V0TmF2aWdhdGlvbnMoKTtcclxuICAgICAgICB0aGlzLmltYWdlczM2MCA9IGF3YWl0IHRoaXMudmlzaXRTZXJ2aWNlLmxvYWRJbWFnZXNGb3JTcGFjZShcclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50U3BhY2UsXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnBsYW5zID0gYXdhaXQgdGhpcy5wbGFuU2VydmljZS5nZXRQbGFuc1dpdGhab25lc0ZvclNwYWNlKFxyXG4gICAgICAgICAgICB0aGlzLnNwYWNlSUQsXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnBsYW5zID0gdGhpcy5wbGFucy5maWx0ZXIoKHBsYW4pID0+IHBsYW4uaXNDdXJyZW50Rm9yWm9uZSk7XHJcbiAgICAgICAgdGhpcy5vblBsYW5zTG9hZGVkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmVzZXROYXZpZ2F0aW9ucygpIHtcclxuICAgICAgICB0aGlzLm5hdmlnYXRpb25zID0gW107XHJcbiAgICAgICAgY29uc3Qgem9uZXNXaXRoU3dlZXBzID0gdGhpcy5hbGxab25lcy5maWx0ZXIoKHpvbmUpID0+IHpvbmUuc3dlZXBJRHMpO1xyXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbnMgPSBbXHJcbiAgICAgICAgICAgIC4uLm5ldyBTZXQoem9uZXNXaXRoU3dlZXBzLmZsYXRNYXAoKHpvbmUpID0+IHpvbmUuc3dlZXBJRHMpKSxcclxuICAgICAgICBdO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uUGxhbnNMb2FkZWQoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMucGxhbklzVmlzaWJsZSAmJiB0aGlzLmN1cnJlbnRab25lKSB7XHJcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZVBsYW4oKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBvblRvZ2dsZURldGFpbCBmb2xkcy91bmZvbGRzIGRldGFpbHMgZm9yIGEgem9uZVxyXG4gICAgICogQHBhcmFtIGkgaW5kZXggb2YgdGhlIGxvdCB0byBiZSB0b2dnbGVkXHJcbiAgICAgKi9cclxuICAgIGFzeW5jIG9uVG9nZ2xlRGV0YWlsKGluZGV4OiBudW1iZXIsIHpvbmU6IFpvbmUpIHtcclxuICAgICAgICB0aGlzLmxvdEluZGV4RGV0YWlscyA9IGluZGV4ID09PSB0aGlzLmxvdEluZGV4RGV0YWlscyA/IC0xIDogaW5kZXg7XHJcbiAgICAgICAgaWYgKHRoaXMubG90SW5kZXhEZXRhaWxzID09PSAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRab25lID0gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmN1cnJlbnRab25lID0gem9uZTtcclxuICAgICAgICB0aGlzLnBsYW5Jc1Zpc2libGUgPSB0cnVlO1xyXG4gICAgICAgIGlmICghdGhpcy5wbGFucykge1xyXG4gICAgICAgICAgICByZXR1cm47IC8vIHdhaXQgdW50aWwgdGhlIHBsYW5zIGFyZSBzZXRcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMubG9hZGluZ1BsYW4pIHtcclxuICAgICAgICAgICAgLy8gYW5vdGhlciBwbGFuIGlzIGFscmVhZHkgbG9hZGluZ1xyXG4gICAgICAgICAgICBhd2FpdCB3YWl0KDEwMDApO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnByZXBhcmVQbGFuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Ub2dnbGVEZXRhaWxGbG9vcihpbmRleDogbnVtYmVyLCBmbG9vcjogWm9uZSkge1xyXG4gICAgICAgIHRoaXMuZGVmYXVsdFNob3dpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmZsb29yRGV0YWlscyA9IGluZGV4ID09PSB0aGlzLmZsb29yRGV0YWlscyA/IC0xIDogaW5kZXg7XHJcbiAgICAgICAgaWYgKHRoaXMuZmxvb3JEZXRhaWxzID09PSAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRab25lID0gbnVsbDtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmN1cnJlbnRab25lID0gZmxvb3I7XHJcbiAgICAgICAgdGhpcy5wbGFuSXNWaXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICBpZiAoIXRoaXMucGxhbnMpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coXCJwbGFucyBub3QgcmVhZHlcIik7XHJcbiAgICAgICAgICAgIHJldHVybjsgLy8gd2FpdCB1bnRpbCB0aGUgcGxhbnMgYXJlIHNldFxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnByZXBhcmVQbGFuKCk7XHJcbiAgICB9XHJcblxyXG4gICAgb25Ub2dnbGVEZWZhdWx0Wm9uZSgpIHtcclxuICAgICAgICB0aGlzLmRlZmF1bHRTaG93aW5nID0gIXRoaXMuZGVmYXVsdFNob3dpbmc7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Wm9uZSA9IHRoaXMuZGVmYXVsdFNob3dpbmcgPyB0aGlzLmRlZmF1bHRab25lIDogbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBwcmVwYXJlUGxhbigpIHtcclxuICAgICAgICB0aGlzLmxvYWRpbmdQbGFuID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmN1cnJlbnRQbGFuID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5jdXJyZW50Wm9uZS52aXJ0dWFsKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFBsYW4gPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdQbGFuID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jdXJyZW50UGxhbiA9IGF3YWl0IHRoaXMucGxhblNlcnZpY2UuZ2V0Q2FsaWJyYXRlZFBsYW5Gb3Jab25lKFxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRab25lLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudFBsYW4pIHtcclxuICAgICAgICAgICAgY29uc3Qgc2NhbnMgPSBhd2FpdCB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLmdldE5hdmlnYXRpb25zRm9yWm9uZShcclxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFpvbmUsXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2hvd1NjYW5Qb2ludHNPblBsYW4oc2NhbnMpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmxvYWRpbmdQbGFuID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdG9nZ2xlQ2Fyb3VzZWwoKSB7XHJcbiAgICAgICAgdGhpcy5jYXJvdXNlbElzVmlzaWJsZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgb25FZGl0KHpvbmU6IFpvbmUpIHtcclxuICAgICAgICB0aGlzLnpvbmVGb3JFZGl0ID0gem9uZTtcclxuICAgICAgICBpZiAodGhpcy56b25lRm9yRWRpdC5sYXllciAmJiB0aGlzLnpvbmVGb3JFZGl0LmxheWVyLm5hbWUgPT09IFwiQVVESU9cIikge1xyXG4gICAgICAgICAgICB0aGlzLmlzQWRkaW5nQXVkaW9UcmFjayA9IHRydWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5pc0VkaXRpbmdab25lID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubWVudUl0ZW1zLnB1c2goe1xyXG4gICAgICAgICAgICBsYWJlbDogYCR7em9uZS5uYW1lfWAsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25BZGRMb3QoKSB7XHJcbiAgICAgICAgdGhpcy5pc011c2V1bVZpc2l0ID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc0VkaXRpbmdab25lID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLm1lbnVJdGVtcy5wdXNoKHtcclxuICAgICAgICAgICAgbGFiZWw6IFwiTmV3XCIsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgb25BZGRNdXNldW1ab25lKCkge1xyXG4gICAgICAgIHRoaXMuaXNNdXNldW1WaXNpdCA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5pc0VkaXRpbmdab25lID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLm1lbnVJdGVtcy5wdXNoKHtcclxuICAgICAgICAgICAgbGFiZWw6IFwiTmV3IE11c2V1bSBJdGluZXJhcnlcIixcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBvbkFkZEF1ZGlvWm9uZShwYXJlbnRab25lOiBab25lKSB7XHJcbiAgICAgICAgdGhpcy5wYXJlbnRab25lRm9yQXVkaW8gPSBwYXJlbnRab25lO1xyXG4gICAgICAgIHRoaXMuaXNBZGRpbmdBdWRpb1RyYWNrID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLm1lbnVJdGVtcy5wdXNoKHtcclxuICAgICAgICAgICAgbGFiZWw6IHBhcmVudFpvbmUubmFtZSxcclxuICAgICAgICB9KTtcclxuICAgICAgICB0aGlzLm1lbnVJdGVtcy5wdXNoKHtcclxuICAgICAgICAgICAgbGFiZWw6IFwiYWRkLWF1ZGlvLmFkZFwiLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIG9uRGVsZXRlKHpvbmU6IFpvbmUpIHtcclxuICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy50cmFuc2xhdGUuaW5zdGFudChcImNvbmZpcm0uZGVsZXRlWm9uZVwiKTtcclxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYWxlcnRcclxuICAgICAgICBpZiAod2luZG93LmNvbmZpcm0obWVzc2FnZSkpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy56b25lU2VydmljZS5kZWxldGVab25lKHpvbmUuaWQpO1xyXG4gICAgICAgICAgICB0aGlzLmFsbFpvbmVzLnNwbGljZSh0aGlzLmFsbFpvbmVzLmluZGV4T2Yoem9uZSksIDEpO1xyXG4gICAgICAgICAgICBpZiAoem9uZS5wYXJlbnRJRCAmJiBBcnJheS5mcm9tKHRoaXMuem9uZXNNYXAua2V5cygpKS5pbmNsdWRlcyh6b25lLnBhcmVudElEKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc3Qgem9uZXNGb3JQYXJlbnQgPSB0aGlzLnpvbmVzTWFwLmdldCh6b25lLnBhcmVudElEKTtcclxuICAgICAgICAgICAgICAgIHpvbmVzRm9yUGFyZW50LnNwbGljZSh6b25lc0ZvclBhcmVudC5pbmRleE9mKHpvbmUpLCAxKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuem9uZXNNYXAuc2V0KHpvbmUucGFyZW50SUQsIHpvbmVzRm9yUGFyZW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBlZGl0Q29tcGxldGVkKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICB0aGlzLmxvdEluZGV4RGV0YWlscyA9IC0xO1xyXG4gICAgICAgIGlmIChldmVudCkge1xyXG4gICAgICAgICAgICB0aGlzLnJlc2V0Wm9uZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pc0VkaXRpbmdab25lID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5pc0FkZGluZ0F1ZGlvVHJhY2sgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLnpvbmVGb3JFZGl0ID0gbnVsbDtcclxuICAgICAgICB0aGlzLnBsYW5Jc1Zpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmNhcm91c2VsSXNWaXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5zZXR1cE1lbnVJdGVtcygpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dTY2FuUG9pbnRzT25QbGFuKG5hdmlnYXRpb25zOiBOYXZpZ2F0aW9uW10pIHtcclxuICAgICAgICBjb25zdCBkaXZQbGFuID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIiNwbGFuRGl2XCIpIGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgIGF3YWl0IHNob3dTY2FuUG9pbnRzT25QbGFuSW5EaXYodGhpcy5jdXJyZW50UGxhbiwgZGl2UGxhbiwgbmF2aWdhdGlvbnMpO1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1BsYW4gPSBmYWxzZTtcclxuICAgICAgICBwYW56b29tKGRpdlBsYW4sIHtcclxuICAgICAgICAgICAgYm91bmRzOiB0cnVlLFxyXG4gICAgICAgICAgICBib3VuZHNQYWRkaW5nOiAwLFxyXG4gICAgICAgICAgICBtYXhab29tOiAzLjUsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIiAqbmdJZj1cImN1cnJlbnRTcGFjZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm0tM1wiPlxyXG4gICAgICA8bGliLXRhYi1uYXZpZ2F0aW9uIFttZW51SXRlbXNdPSdtZW51SXRlbXMnIChvbkdvQmFjayk9XCJvbkdvQmFjaygpXCI+PC9saWItdGFiLW5hdmlnYXRpb24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdJZj1cIiFpc0VkaXRpbmdab25lICYmICFpc0FkZGluZ0F1ZGlvVHJhY2tcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCIgPlxyXG4gICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGRlZmF1bHQtem9uZS1saW5lLWl0ZW1cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgem9uZS1uYW1lXCIgKm5nSWY9XCJkZWZhdWx0Wm9uZVwiPlxyXG4gICAgICAgICAgICAgIHt7ZGVmYXVsdFpvbmUubmFtZX19XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRlZmF1bHQtem9uZS1sYWJlbFwiPnt7IFwid2hvbGUgc3BhY2VcIiB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIDxsaWItY2hldnJvbiBbY29uZGl0aW9uU2hvd2luZ109XCJkZWZhdWx0U2hvd2luZ1wiIChjbGljayk9XCJvblRvZ2dsZURlZmF1bHRab25lKClcIj48L2xpYi1jaGV2cm9uPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImRlZmF1bHRTaG93aW5nXCI+XHJcbiAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCI+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydUeXBlIG9mIHpvbmUnIHwgdHJhbnNsYXRlfX06IFxyXG4gICAgICAgICAgICAgICAgICB7e2RlZmF1bHRab25lLmxheWVyID8gZGVmYXVsdFpvbmUubGF5ZXIubmFtZSA6IFwiTm8gdHlwZVwiIHwgdHJhbnNsYXRlfX0gPC9saT5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiICpuZ0lmPVwiZGVmYXVsdFpvbmUuc3VyZmFjZVwiPlxyXG4gICAgICAgICAgICAgICAgICB7eydTdXJmYWNlJyB8IHRyYW5zbGF0ZX19LCBtPHN1cD4yPC9zdXA+OiB7e2RlZmF1bHRab25lLnN1cmZhY2UgfX1cclxuICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIiAqbmdJZj1cIiFkZWZhdWx0Wm9uZS52aXJ0dWFsXCI+e3snU2NhbiBQb2ludHMnIHwgdHJhbnNsYXRlfX06XHJcbiAgICAgICAgICAgICAgICAgIHt7ZGVmYXVsdFpvbmUuc3dlZXBJRHMgPyBkZWZhdWx0Wm9uZS5zd2VlcElEcy5sZW5ndGggOiBcIk5vIHNjYW4gcG9pbnRzXCIgfCB0cmFuc2xhdGV9fSA8L2xpPlxyXG4gICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcGFpciBvZiB6b25lc01hcCB8IGtleXZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGFpci5rZXkgPT0gZGVmYXVsdFpvbmUuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgPGg1IHN0eWxlPVwibWFyZ2luOiA4cHg7XCIgKm5nSWY9XCJwYWlyLnZhbHVlLmxlbmd0aCA+IDBcIj57eydDaGlsZHJlbiB6b25lcyd8dHJhbnNsYXRlfX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gbGlzdC1ncm91cC1mbHVzaCBsaXN0LWdyb3VwLWl0ZW0tYWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBsb3Qgb2YgcGFpci52YWx1ZTsgaW5kZXggYXMgem9uZUluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciB6b25lLW5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3tsb3QubmFtZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdXNldW0tbGFiZWxcIiAqbmdJZj1cImxvdC5pc011c2V1bVZpc2l0Wm9uZVwiPnt7IFwiaXRpbmVyYXJ5XCIgfCB0cmFuc2xhdGUgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1jaGV2cm9uIFtjb25kaXRpb25TaG93aW5nXT1cInpvbmVJbmRleD09bG90SW5kZXhEZXRhaWxzXCIgKGNsaWNrKT1cIm9uVG9nZ2xlRGV0YWlsKHpvbmVJbmRleCwgbG90KVwiPjwvbGliLWNoZXZyb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiem9uZUluZGV4PT1sb3RJbmRleERldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCIhbG90LmlzTXVzZXVtVmlzaXRab25lXCI+e3snVHlwZSBvZiB6b25lJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fToge3tsb3QubGF5ZXIgPyBsb3QubGF5ZXIubmFtZSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIk5vIHR5cGVcIiB8IHRyYW5zbGF0ZX19IDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCJsb3Quc3VyZmFjZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3snU3VyZmFjZScgfCB0cmFuc2xhdGV9fSxtPHN1cD4yPC9zdXA+OiB7e2xvdC5zdXJmYWNlIH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIiAqbmdJZj1cIiFsb3QudmlydHVhbFwiPnt7J1NjYW4gUG9pbnRzJyB8IHRyYW5zbGF0ZX19OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tsb3Quc3dlZXBJRHMgPyBsb3Quc3dlZXBJRHMubGVuZ3RoIDogXCJObyBzY2FuIHBvaW50c1wiIHwgdHJhbnNsYXRlfX0gPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIiAqbmdJZj1cImxvdC52aXJ0dWFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydab25lIG5vdCB2aXNpYmxlIGluIDNEIHZpc2l0JyB8IHRyYW5zbGF0ZX19PC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uRWRpdChsb3QpXCI+e3snRWRpdCcgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIiAoY2xpY2spPVwib25BZGRBdWRpb1pvbmUobG90KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpc011c2V1bU1vZHVsZVwiPiB7eydhZGQtYXVkaW8uYWRkJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25EZWxldGUobG90KVwiPnt7J0RlbGV0ZScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgPC91bD5cclxuICBcclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiICpuZ0Zvcj1cImxldCBmbG9vciBvZiBmbG9vclpvbmVzOyBpbmRleCBhcyBpbmRleFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciB6b25lLW5hbWVcIj5cclxuICAgICAgICAgICAgICB7e2Zsb29yLm5hbWV9fVxyXG4gICAgICAgICAgICAgIDwhLS0gPHNtYWxsPih7eyBsb3QubWV0YWRhdGEgPyAoJ0NhbGlicmF0ZWQnIHwgdHJhbnNsYXRlKSA6ICgnTm90IGNhbGlicmF0ZWQnIHwgdHJhbnNsYXRlKX19KTwvc21hbGw+IC0tPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdXNldW0tbGFiZWxcIiAqbmdJZj1cImZsb29yLmlzTXVzZXVtVmlzaXRab25lXCI+e3sgXCJpdGluZXJhcnlcIiB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxyXG4gICAgICAgICAgICAgIDxsaWItY2hldnJvbiBbY29uZGl0aW9uU2hvd2luZ109XCJpbmRleD09Zmxvb3JEZXRhaWxzXCIgKGNsaWNrKT1cIm9uVG9nZ2xlRGV0YWlsRmxvb3IoaW5kZXgsIGZsb29yKVwiPjwvbGliLWNoZXZyb24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaW5kZXg9PWZsb29yRGV0YWlsc1wiPiAgXHJcbiAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCI+XHJcbiAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gYmctdHJhbnNwYXJlbnRcIj57eydUeXBlIG9mIHpvbmUnIHwgdHJhbnNsYXRlfX06IHt7Zmxvb3IubGF5ZXIgP1xyXG4gICAgICAgICAgICAgICAgICBmbG9vci5sYXllci5uYW1lIDpcclxuICAgICAgICAgICAgICAgICAgXCJObyB0eXBlXCIgfCB0cmFuc2xhdGV9fSA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCJmbG9vci5zdXJmYWNlXCI+e3snU3VyZmFjZScgfCB0cmFuc2xhdGV9fSwgbTxzdXA+Mjwvc3VwPjpcclxuICAgICAgICAgICAgICAgICAge3tmbG9vci5zdXJmYWNlIH19XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCIhZmxvb3IudmlydHVhbFwiPnt7J1NjYW4gUG9pbnRzJyB8IHRyYW5zbGF0ZX19OlxyXG4gICAgICAgICAgICAgICAgICB7e2Zsb29yLnN3ZWVwSURzID8gZmxvb3Iuc3dlZXBJRHMubGVuZ3RoIDogXCJObyBzY2FuIHBvaW50c1wiIHwgdHJhbnNsYXRlfX0gPC9saT5cclxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiICpuZ0lmPVwiZmxvb3IudmlydHVhbFwiPnt7J1pvbmUgbm90IHZpc2libGUgaW4gM0QgdmlzaXQnIHxcclxuICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlfX08L2xpPlxyXG4gICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtMlwiIChjbGljayk9XCJvbkVkaXQoZmxvb3IpXCI+e3snRWRpdCcgfFxyXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICBcclxuICAgICAgICAgICAgICA8IS0tIExpc3Qgb2YgY2hpbGRyZW4gem9uZXMgLS0+XHJcbiAgXHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcGFpciBvZiB6b25lc01hcCB8IGtleXZhbHVlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGFpci5rZXkgPT0gZmxvb3IuaWRcIj5cclxuICAgICAgICAgICAgICAgICAgPGg1IHN0eWxlPVwibWFyZ2luOiA4cHg7XCIgKm5nSWY9XCJwYWlyLnZhbHVlLmxlbmd0aCA+IDBcIj57eydDaGlsZHJlbiB6b25lcyd8dHJhbnNsYXRlfX08L2g1PlxyXG4gICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJsaXN0LWdyb3VwIGxpc3QtZ3JvdXAtZmx1c2hcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJsaXN0LWdyb3VwLWl0ZW0gbGlzdC1ncm91cC1mbHVzaCBsaXN0LWdyb3VwLWl0ZW0tYWN0aW9uXCJcclxuICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBsb3Qgb2YgcGFpci52YWx1ZTsgaW5kZXggYXMgem9uZUluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlciB6b25lLW5hbWVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3tsb3QubmFtZX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdXNldW0tbGFiZWxcIiAqbmdJZj1cImxvdC5pc011c2V1bVZpc2l0Wm9uZVwiPnt7IFwiaXRpbmVyYXJ5XCIgfCB0cmFuc2xhdGUgfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpYi1jaGV2cm9uIFtjb25kaXRpb25TaG93aW5nXT1cInpvbmVJbmRleD09bG90SW5kZXhEZXRhaWxzXCIgKGNsaWNrKT1cIm9uVG9nZ2xlRGV0YWlsKHpvbmVJbmRleCwgbG90KVwiPjwvbGliLWNoZXZyb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiem9uZUluZGV4PT1sb3RJbmRleERldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC1ncm91cCBsaXN0LWdyb3VwLWZsdXNoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCIhbG90LmlzTXVzZXVtVmlzaXRab25lXCI+e3snVHlwZSBvZiB6b25lJyB8XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGV9fToge3tsb3QubGF5ZXIgPyBsb3QubGF5ZXIubmFtZSA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIk5vIHR5cGVcIiB8IHRyYW5zbGF0ZX19IDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCJsb3Quc3VyZmFjZVwiPnt7J1N1cmZhY2UnIHwgdHJhbnNsYXRlfX0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtPHN1cD4yPC9zdXA+OlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tsb3Quc3VyZmFjZSB9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCIhbG90LnZpcnR1YWxcIj57eydTY2FuIFBvaW50cycgfCB0cmFuc2xhdGV9fTpcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bG90LnN3ZWVwSURzID8gbG90LnN3ZWVwSURzLmxlbmd0aCA6IFwiTm8gc2NhbiBwb2ludHNcIiB8IHRyYW5zbGF0ZX19IDwvbGk+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibGlzdC1ncm91cC1pdGVtIGJnLXRyYW5zcGFyZW50XCIgKm5nSWY9XCIhbG90LnZpcnR1YWwgJiYgbG90LmlzTXVzZXVtVmlzaXRab25lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydTY2FuIFBvaW50cyB3aXRoIGF1ZGlvJyB8IHRyYW5zbGF0ZX19OiB7eyBsb3QgfCBjb3VudEF1ZGlvU3dlZXBzIHwgYXN5bmN9fSA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbSBiZy10cmFuc3BhcmVudFwiICpuZ0lmPVwibG90LnZpcnR1YWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J1pvbmUgbm90IHZpc2libGUgaW4gM0QgdmlzaXQnIHwgdHJhbnNsYXRlfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25FZGl0KGxvdClcIj57eydFZGl0JyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtMlwiIChjbGljayk9XCJvbkFkZEF1ZGlvWm9uZShsb3QpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImlzTXVzZXVtTW9kdWxlXCI+IHt7J2FkZC1hdWRpby5hZGQnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkRlbGV0ZShsb3QpXCI+e3snRGVsZXRlJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gIFxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9saT5cclxuICAgICAgICA8L3VsPlxyXG4gIFxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIiAoY2xpY2spPVwib25BZGRMb3QoKVwiPnt7J0FkZCB6b25lJyB8XHJcbiAgICAgICAgICAgIHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIiAoY2xpY2spPVwib25BZGRNdXNldW1ab25lKClcIlxyXG4gICAgICAgICAgICAqbmdJZj1cImlzTXVzZXVtTW9kdWxlXCI+IHt7J0FkZCBtdXNldW0gaXRpbmVyYXJ5JyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cImxvYWRpbmdQbGFuXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lci1ib3JkZXJcIiByb2xlPVwic3RhdHVzXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidmlzdWFsbHktaGlkZGVuXCI+TG9hZGluZy4uLjwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiBzdHlsZT1cIm92ZXJmbG93OiBoaWRkZW47XCIgKm5nSWY9XCJjdXJyZW50Wm9uZVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTMgbXMtM1wiIHN0eWxlPVwiaGVpZ2h0OiA1MDBweDsgd2lkdGg6IDEwMCU7XCIgaWQ9XCJwbGFuRGl2XCIgKm5nSWY9XCJjdXJyZW50UGxhblwiPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cIiFjdXJyZW50UGxhbiAmJiBwbGFucyAmJiAhbG9hZGluZ1BsYW5cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTMgbXMtM1wiIGlkPVwibm8tcGxhblwiICpuZ0lmPVwiIWN1cnJlbnRab25lLnZpcnR1YWwgJiYgIWN1cnJlbnRab25lLmlzTXVsdGlwbGVGbG9vclpvbmVcIj5cclxuICAgICAgICAgICAgICB7eyAnUGxhbiBpcyBub3QgY2FsaWJyYXRlZCcgfCB0cmFuc2xhdGV9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm10LTMgbXMtM1wiIGlkPVwibm8tcGxhblwiICpuZ0lmPVwiY3VycmVudFpvbmUudmlydHVhbFwiPlxyXG4gICAgICAgICAgICAgIHt7ICdObyBzY2FuIHBvaW50cyBjaG9zZW4nIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtdC0zIG1zLTNcIiBpZD1cIm5vLXBsYW5cIiAqbmdJZj1cImN1cnJlbnRab25lLmlzTXVsdGlwbGVGbG9vclpvbmVcIj5cclxuICAgICAgICAgICAgICB7eyAnVGhlIHpvbmUgaXMgb24gc2V2ZXJhbCBmbG9vcnMnIHwgdHJhbnNsYXRlfX1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIFxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTNcIiAqbmdJZj1cImlzRWRpdGluZ1pvbmVcIj5cclxuICAgICAgPGxpYi1hZGQtem9uZSBbem9uZUVkaXRdPVwiem9uZUZvckVkaXRcIiBbc3BhY2VJRF09XCJzcGFjZUlEXCIgW2ltYWdlczM2MF09XCJpbWFnZXMzNjBcIiBbbmF2aWdhdGlvbklEc109XCJuYXZpZ2F0aW9uc1wiXHJcbiAgICAgICAgW3pvbmVzXT1cImFsbFpvbmVzXCIgW2RlZmF1bHRab25lXT1cImRlZmF1bHRab25lXCIgKHVwZGF0ZWRab25lKT1cImVkaXRDb21wbGV0ZWQoJGV2ZW50KVwiIFtpc011c2V1bVZpc2l0XT1cImlzTXVzZXVtVmlzaXRcIj48L2xpYi1hZGQtem9uZT5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cIm1iLTNcIiAqbmdJZj1cImlzQWRkaW5nQXVkaW9UcmFja1wiPlxyXG4gICAgICA8bGliLWFkZC1hdWRpby16b25lIFtzcGFjZUlEXT1cInNwYWNlSURcIiBbZGVmYXVsdFpvbmVdPVwiZGVmYXVsdFpvbmVcIiBbcGFyZW50Wm9uZV09XCJwYXJlbnRab25lRm9yQXVkaW9cIiBbem9uZXNdPVwiYWxsWm9uZXNcIiBbY3VycmVudEF1ZGlvWm9uZV09XCJ6b25lRm9yRWRpdFwiXHJcbiAgICAgICh1cGRhdGVkWm9uZSk9XCJlZGl0Q29tcGxldGVkKCRldmVudClcIj48L2xpYi1hZGQtYXVkaW8tem9uZT5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4iXX0=
|