@smarterplan/ngx-smarterplan-locations 0.2.44 → 0.2.45
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 +28 -0
- package/esm2020/lib/components/chevron/chevron.component.mjs +18 -0
- package/esm2020/lib/components/detail-location/detail-location.component.mjs +168 -0
- package/esm2020/lib/components/form-location/form-location.component.mjs +237 -0
- package/esm2020/lib/components/images/images.component.mjs +107 -0
- package/esm2020/lib/components/locations/locations.component.mjs +145 -0
- package/esm2020/lib/components/locations/map/map-popup/map-popup.component.mjs +66 -0
- package/esm2020/lib/components/locations/map/map.component.mjs +91 -0
- package/esm2020/lib/components/plan-legend/plan-legend.component.mjs +47 -0
- package/esm2020/lib/components/plans/calibration/calibration.component.mjs +468 -0
- package/esm2020/lib/components/plans/edit-plan/edit-plan.component.mjs +324 -0
- package/esm2020/lib/components/plans/plans.component.mjs +225 -0
- package/esm2020/lib/components/tab-navigation/tab-navigation.component.mjs +41 -0
- package/esm2020/lib/components/visits/visits.component.mjs +283 -0
- package/esm2020/lib/components/zones/add-audio-zone/add-audio-zone.component.mjs +230 -0
- package/esm2020/lib/components/zones/add-zone/add-zone.component.mjs +315 -0
- package/esm2020/lib/components/zones/add-zone/selection/selection.component.mjs +77 -0
- package/esm2020/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.mjs +502 -0
- package/esm2020/lib/components/zones/zones.component.mjs +268 -0
- package/esm2020/lib/helper.service.mjs +134 -0
- package/esm2020/lib/ngx-smarterplan-location-routing.module.mjs +49 -0
- package/esm2020/lib/ngx-smarterplan-locations.module.mjs +125 -0
- package/esm2020/lib/ngx-smarterplan-locations.service.mjs +14 -0
- package/esm2020/lib/pipes/count-audio-sweeps.pipe.mjs +27 -0
- package/esm2020/lib/radio-button/radio-button.component.mjs +26 -0
- package/esm2020/public-api.mjs +9 -0
- package/esm2020/smarterplan-ngx-smarterplan-locations.mjs +5 -0
- package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs +3991 -0
- package/fesm2015/smarterplan-ngx-smarterplan-locations.mjs.map +1 -0
- package/fesm2020/smarterplan-ngx-smarterplan-locations.mjs +3828 -0
- package/fesm2020/smarterplan-ngx-smarterplan-locations.mjs.map +1 -0
- package/lib/components/carousel/carousel.component.d.ts +12 -0
- package/lib/components/chevron/chevron.component.d.ts +9 -0
- package/lib/components/detail-location/detail-location.component.d.ts +55 -0
- package/lib/components/form-location/form-location.component.d.ts +45 -0
- package/lib/components/images/images.component.d.ts +33 -0
- package/lib/components/locations/locations.component.d.ts +51 -0
- package/lib/components/locations/map/map-popup/map-popup.component.d.ts +22 -0
- package/lib/components/locations/map/map.component.d.ts +22 -0
- package/lib/components/plan-legend/plan-legend.component.d.ts +14 -0
- package/lib/components/plans/calibration/calibration.component.d.ts +140 -0
- package/lib/components/plans/edit-plan/edit-plan.component.d.ts +55 -0
- package/lib/components/plans/plans.component.d.ts +63 -0
- package/lib/components/tab-navigation/tab-navigation.component.d.ts +13 -0
- package/lib/components/visits/visits.component.d.ts +62 -0
- package/lib/components/zones/add-audio-zone/add-audio-zone.component.d.ts +63 -0
- package/lib/components/zones/add-zone/add-zone.component.d.ts +69 -0
- package/lib/components/zones/add-zone/selection/selection.component.d.ts +44 -0
- package/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.d.ts +107 -0
- package/lib/components/zones/zones.component.d.ts +73 -0
- package/lib/helper.service.d.ts +53 -0
- package/lib/ngx-smarterplan-location-routing.module.d.ts +7 -0
- package/lib/ngx-smarterplan-locations.module.d.ts +36 -0
- package/lib/ngx-smarterplan-locations.service.d.ts +6 -0
- package/lib/pipes/count-audio-sweeps.pipe.d.ts +10 -0
- package/lib/radio-button/radio-button.component.d.ts +12 -0
- package/package.json +22 -5
- package/{src/public-api.ts → public-api.d.ts} +4 -11
- package/smarterplan-ngx-smarterplan-locations.d.ts +5 -0
- package/.browserslistrc +0 -16
- package/karma.conf.js +0 -44
- package/ng-package.json +0 -7
- package/src/lib/components/carousel/carousel.component.html +0 -13
- package/src/lib/components/carousel/carousel.component.scss +0 -0
- package/src/lib/components/carousel/carousel.component.spec.ts +0 -25
- package/src/lib/components/carousel/carousel.component.ts +0 -31
- package/src/lib/components/chevron/chevron.component.html +0 -5
- package/src/lib/components/chevron/chevron.component.scss +0 -16
- package/src/lib/components/chevron/chevron.component.spec.ts +0 -25
- package/src/lib/components/chevron/chevron.component.ts +0 -17
- package/src/lib/components/detail-location/detail-location.component.html +0 -108
- package/src/lib/components/detail-location/detail-location.component.scss +0 -0
- package/src/lib/components/detail-location/detail-location.component.spec.ts +0 -25
- package/src/lib/components/detail-location/detail-location.component.ts +0 -215
- package/src/lib/components/form-location/form-location.component.html +0 -160
- package/src/lib/components/form-location/form-location.component.scss +0 -62
- package/src/lib/components/form-location/form-location.component.spec.ts +0 -25
- package/src/lib/components/form-location/form-location.component.ts +0 -274
- package/src/lib/components/images/images.component.html +0 -27
- package/src/lib/components/images/images.component.scss +0 -0
- package/src/lib/components/images/images.component.spec.ts +0 -25
- package/src/lib/components/images/images.component.ts +0 -133
- package/src/lib/components/locations/locations.component.html +0 -63
- package/src/lib/components/locations/locations.component.scss +0 -121
- package/src/lib/components/locations/locations.component.spec.ts +0 -25
- package/src/lib/components/locations/locations.component.ts +0 -186
- package/src/lib/components/locations/map/map-popup/map-popup.component.html +0 -11
- package/src/lib/components/locations/map/map-popup/map-popup.component.scss +0 -51
- package/src/lib/components/locations/map/map-popup/map-popup.component.spec.ts +0 -25
- package/src/lib/components/locations/map/map-popup/map-popup.component.ts +0 -79
- package/src/lib/components/locations/map/map.component.html +0 -2
- package/src/lib/components/locations/map/map.component.scss +0 -0
- package/src/lib/components/locations/map/map.component.spec.ts +0 -25
- package/src/lib/components/locations/map/map.component.ts +0 -111
- package/src/lib/components/plan-legend/plan-legend.component.html +0 -9
- package/src/lib/components/plan-legend/plan-legend.component.scss +0 -38
- package/src/lib/components/plan-legend/plan-legend.component.spec.ts +0 -25
- package/src/lib/components/plan-legend/plan-legend.component.ts +0 -50
- package/src/lib/components/plans/calibration/calibration.component.html +0 -98
- package/src/lib/components/plans/calibration/calibration.component.scss +0 -136
- package/src/lib/components/plans/calibration/calibration.component.spec.ts +0 -25
- package/src/lib/components/plans/calibration/calibration.component.ts +0 -603
- package/src/lib/components/plans/edit-plan/edit-plan.component.html +0 -77
- package/src/lib/components/plans/edit-plan/edit-plan.component.scss +0 -9
- package/src/lib/components/plans/edit-plan/edit-plan.component.spec.ts +0 -25
- package/src/lib/components/plans/edit-plan/edit-plan.component.ts +0 -421
- package/src/lib/components/plans/plans.component.html +0 -102
- package/src/lib/components/plans/plans.component.scss +0 -24
- package/src/lib/components/plans/plans.component.spec.ts +0 -25
- package/src/lib/components/plans/plans.component.ts +0 -305
- package/src/lib/components/tab-navigation/tab-navigation.component.html +0 -7
- package/src/lib/components/tab-navigation/tab-navigation.component.scss +0 -27
- package/src/lib/components/tab-navigation/tab-navigation.component.spec.ts +0 -25
- package/src/lib/components/tab-navigation/tab-navigation.component.ts +0 -35
- package/src/lib/components/visits/visits.component.html +0 -134
- package/src/lib/components/visits/visits.component.scss +0 -24
- package/src/lib/components/visits/visits.component.spec.ts +0 -25
- package/src/lib/components/visits/visits.component.ts +0 -357
- package/src/lib/components/zones/add-audio-zone/add-audio-zone.component.html +0 -73
- package/src/lib/components/zones/add-audio-zone/add-audio-zone.component.scss +0 -14
- package/src/lib/components/zones/add-audio-zone/add-audio-zone.component.spec.ts +0 -25
- package/src/lib/components/zones/add-audio-zone/add-audio-zone.component.ts +0 -269
- package/src/lib/components/zones/add-zone/add-zone.component.html +0 -153
- package/src/lib/components/zones/add-zone/add-zone.component.scss +0 -44
- package/src/lib/components/zones/add-zone/add-zone.component.spec.ts +0 -25
- package/src/lib/components/zones/add-zone/add-zone.component.ts +0 -377
- package/src/lib/components/zones/add-zone/selection/selection.component.html +0 -3
- package/src/lib/components/zones/add-zone/selection/selection.component.scss +0 -16
- package/src/lib/components/zones/add-zone/selection/selection.component.spec.ts +0 -25
- package/src/lib/components/zones/add-zone/selection/selection.component.ts +0 -95
- package/src/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.html +0 -73
- package/src/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.scss +0 -23
- package/src/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.spec.ts +0 -25
- package/src/lib/components/zones/add-zone/sweep-plan-selection/sweep-plan-selection.component.ts +0 -595
- package/src/lib/components/zones/zones.component.html +0 -181
- package/src/lib/components/zones/zones.component.scss +0 -36
- package/src/lib/components/zones/zones.component.spec.ts +0 -25
- package/src/lib/components/zones/zones.component.ts +0 -339
- package/src/lib/helper.service.ts +0 -161
- package/src/lib/ngx-smarterplan-location-routing.module.ts +0 -41
- package/src/lib/ngx-smarterplan-locations.module.ts +0 -74
- package/src/lib/ngx-smarterplan-locations.service.spec.ts +0 -16
- package/src/lib/ngx-smarterplan-locations.service.ts +0 -9
- package/src/lib/pipes/count-audio-sweeps.pipe.ts +0 -21
- package/src/lib/radio-button/radio-button.component.html +0 -9
- package/src/lib/radio-button/radio-button.component.scss +0 -152
- package/src/lib/radio-button/radio-button.component.spec.ts +0 -25
- package/src/lib/radio-button/radio-button.component.ts +0 -26
- package/src/test.ts +0 -27
- package/tsconfig.lib.json +0 -15
- package/tsconfig.lib.prod.json +0 -10
- package/tsconfig.spec.json +0 -17
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { Component, EventEmitter, Input, Output } from '@angular/core';
|
|
2
|
+
import { Validators } from '@angular/forms';
|
|
3
|
+
import { CommentType } from '@smarterplan/ngx-smarterplan-core';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/forms";
|
|
6
|
+
import * as i2 from "@smarterplan/ngx-smarterplan-core";
|
|
7
|
+
import * as i3 from "@ngx-translate/core";
|
|
8
|
+
import * as i4 from "@ng-bootstrap/ng-bootstrap";
|
|
9
|
+
import * as i5 from "../add-zone/sweep-plan-selection/sweep-plan-selection.component";
|
|
10
|
+
import * as i6 from "@angular/common";
|
|
11
|
+
export class AddAudioZoneComponent {
|
|
12
|
+
constructor(fb, zoneService, layerService, userService, navigationService, commentService, translate) {
|
|
13
|
+
this.fb = fb;
|
|
14
|
+
this.zoneService = zoneService;
|
|
15
|
+
this.layerService = layerService;
|
|
16
|
+
this.userService = userService;
|
|
17
|
+
this.navigationService = navigationService;
|
|
18
|
+
this.commentService = commentService;
|
|
19
|
+
this.translate = translate;
|
|
20
|
+
this.updatedZone = new EventEmitter();
|
|
21
|
+
this.isSubmitted = false;
|
|
22
|
+
this.fromPlan = false;
|
|
23
|
+
this.chosenScansOnPlan = [];
|
|
24
|
+
this.isAddingAudio = false;
|
|
25
|
+
this.scansModified = false;
|
|
26
|
+
this.occupiedSweeps = [];
|
|
27
|
+
this.unavailableSweeps = [];
|
|
28
|
+
this.working = false;
|
|
29
|
+
this.audioUploaded = false;
|
|
30
|
+
}
|
|
31
|
+
ngOnInit() {
|
|
32
|
+
if (this.currentAudioZone) {
|
|
33
|
+
// we are editing zone
|
|
34
|
+
this.chosenAudio = this.currentAudioZone.audio;
|
|
35
|
+
this.chosenScansOnPlan = this.currentAudioZone.sweepIDs;
|
|
36
|
+
this.parentZone = this.currentAudioZone.parent;
|
|
37
|
+
}
|
|
38
|
+
this.setup();
|
|
39
|
+
}
|
|
40
|
+
async setup() {
|
|
41
|
+
const mission = this.userService.currentMission(this.spaceID);
|
|
42
|
+
this.currentOrgId = mission.organisationID;
|
|
43
|
+
let layers = await this.layerService.getLayerForOrganisation(this.currentOrgId);
|
|
44
|
+
this.audioLayer = layers.find((layer) => layer.name === "AUDIO");
|
|
45
|
+
if (!this.audioLayer) {
|
|
46
|
+
// first time creating Audio Zone
|
|
47
|
+
this.audioLayer = await this.layerService.createLayerForOrganisation("AUDIO", this.currentOrgId);
|
|
48
|
+
}
|
|
49
|
+
if (!this.parentZone) {
|
|
50
|
+
this.parentZone = this.defaultZone;
|
|
51
|
+
}
|
|
52
|
+
this.audioZones = this.zones.filter((zone) => zone.audioID && zone.parentID === this.parentZone.id);
|
|
53
|
+
this.occupiedSweeps = this.audioZones.flatMap((zone) => zone.sweepIDs);
|
|
54
|
+
// unavailable sweeps: sweeps that do not belong to parent zone
|
|
55
|
+
this.unavailableSweeps = this.defaultZone.sweepIDs.filter((sweep) => !this.parentZone.sweepIDs.includes(sweep));
|
|
56
|
+
await this.getAudios();
|
|
57
|
+
this.commentForm = this.fb.group({
|
|
58
|
+
title: [null, Validators.required],
|
|
59
|
+
spaceID: this.spaceID,
|
|
60
|
+
type: CommentType.AUDIO,
|
|
61
|
+
ownerID: mission.id,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
async onSubmit() {
|
|
65
|
+
this.isSubmitted = true;
|
|
66
|
+
this.working = true;
|
|
67
|
+
if (this.currentAudioZone) {
|
|
68
|
+
await this.zoneService.updateZone({
|
|
69
|
+
id: this.currentAudioZone.id,
|
|
70
|
+
sweepIDs: this.chosenScansOnPlan,
|
|
71
|
+
});
|
|
72
|
+
await this.removeTakenSweepsFromOtherZones();
|
|
73
|
+
this.updatedZone.emit(this.currentAudioZone.id);
|
|
74
|
+
this.working = false;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
const zoneInput = {
|
|
78
|
+
name: `${this.parentZone.name} - ${this.chosenAudio.title}`,
|
|
79
|
+
surface: 0,
|
|
80
|
+
spaceID: this.spaceID,
|
|
81
|
+
layerID: this.audioLayer.id,
|
|
82
|
+
parentID: this.parentZone.id,
|
|
83
|
+
isMuseumVisitZone: false,
|
|
84
|
+
isMultipleFloorZone: this.parentZone.isMultipleFloorZone,
|
|
85
|
+
audioID: this.chosenAudio.id,
|
|
86
|
+
};
|
|
87
|
+
try {
|
|
88
|
+
await this.setSweepsAndNodeForZoneInput(zoneInput);
|
|
89
|
+
await this.zoneService
|
|
90
|
+
.create(zoneInput)
|
|
91
|
+
.then(async (zoneCreated) => {
|
|
92
|
+
this.currentAudioZone = zoneCreated;
|
|
93
|
+
await this.removeTakenSweepsFromOtherZones();
|
|
94
|
+
this.updatedZone.emit(zoneCreated.id);
|
|
95
|
+
});
|
|
96
|
+
this.working = false;
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
console.error(error);
|
|
100
|
+
this.working = false;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async setSweepsAndNodeForZoneInput(zoneInput) {
|
|
105
|
+
if (this.chosenScansOnPlan.length > 0) {
|
|
106
|
+
zoneInput.sweepIDs = this.chosenScansOnPlan;
|
|
107
|
+
}
|
|
108
|
+
if (zoneInput.sweepIDs && zoneInput.sweepIDs.length > 0) {
|
|
109
|
+
const navForSweep = await this.navigationService.getNavigationsForMatterportIDForSpace(zoneInput.sweepIDs[0], this.spaceID);
|
|
110
|
+
zoneInput.nodeIDs = [navForSweep[0].nodeID];
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
onCancel() {
|
|
114
|
+
if (this.scansModified) {
|
|
115
|
+
const message = this.translate.instant("confirm.cancelEditZone");
|
|
116
|
+
if (!window.confirm(message)) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
this.commentForm = null;
|
|
121
|
+
this.chosenScansOnPlan = [];
|
|
122
|
+
this.updatedZone.emit(false);
|
|
123
|
+
}
|
|
124
|
+
togglePlan() {
|
|
125
|
+
this.fromPlan = true;
|
|
126
|
+
}
|
|
127
|
+
onSelectedSweepsFromPlan(result) {
|
|
128
|
+
if (result && result.sweeps) {
|
|
129
|
+
this.chosenScansOnPlan = result.sweeps;
|
|
130
|
+
this.scansModified = true;
|
|
131
|
+
}
|
|
132
|
+
this.fromPlan = false;
|
|
133
|
+
}
|
|
134
|
+
handleFileInput(event) {
|
|
135
|
+
const target = event.target;
|
|
136
|
+
this.fileToUpload = target.files[0];
|
|
137
|
+
}
|
|
138
|
+
async onUploadAudio() {
|
|
139
|
+
this.working = true;
|
|
140
|
+
const commentInput = this.commentForm.value;
|
|
141
|
+
try {
|
|
142
|
+
const newAudio = await this.commentService.createCommentWithFile(commentInput, this.fileToUpload);
|
|
143
|
+
this.audiosForSpace.push(newAudio);
|
|
144
|
+
this.isAddingAudio = false;
|
|
145
|
+
this.working = false;
|
|
146
|
+
this.audioUploaded = true;
|
|
147
|
+
}
|
|
148
|
+
catch (e) {
|
|
149
|
+
this.working = false;
|
|
150
|
+
this.audioUploaded = false;
|
|
151
|
+
console.log(e);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
async getAudios() {
|
|
155
|
+
const attachments = await this.commentService.getCommentsBySpaceID(this.spaceID);
|
|
156
|
+
if (attachments) {
|
|
157
|
+
this.audiosForSpace = attachments.filter((attachment) => attachment.type === CommentType.AUDIO);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
onCancelAudioUpload() {
|
|
161
|
+
this.commentForm = null;
|
|
162
|
+
this.isAddingAudio = false;
|
|
163
|
+
this.fileToUpload = null;
|
|
164
|
+
}
|
|
165
|
+
onChooseAudio(audio) {
|
|
166
|
+
this.chosenAudio = audio;
|
|
167
|
+
this.currentAudioZone = this.audioZones.find((zone) => zone.audioID === this.chosenAudio.id);
|
|
168
|
+
if (this.currentAudioZone) {
|
|
169
|
+
this.chosenScansOnPlan = this.currentAudioZone.sweepIDs;
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
this.chosenScansOnPlan = [];
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Removes newly selected sweeps for current zone (they are in chosenScansOnPlan) from other audio zones.
|
|
177
|
+
* Rule: one sweep = one audio.
|
|
178
|
+
*/
|
|
179
|
+
async removeTakenSweepsFromOtherZones() {
|
|
180
|
+
await Promise.all(this.audioZones.map(async (zone) => {
|
|
181
|
+
if (zone.id !== this.currentAudioZone.id) {
|
|
182
|
+
const newSweeps = zone.sweepIDs.filter((sweepID) => !this.chosenScansOnPlan.includes(sweepID));
|
|
183
|
+
if (newSweeps.length !== zone.sweepIDs.length) {
|
|
184
|
+
await this.zoneService.updateZone({ id: zone.id, sweepIDs: newSweeps });
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}));
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Delete audio as Comment, all its audio Zones and file from S3 (using lambda function)
|
|
191
|
+
*/
|
|
192
|
+
async onDeleteAudio() {
|
|
193
|
+
const message = this.translate.instant("confirm.deleteAudio");
|
|
194
|
+
if (window.confirm(message)) {
|
|
195
|
+
await this.commentService.deleteComment(this.chosenAudio.id);
|
|
196
|
+
const index = this.audiosForSpace.indexOf(this.chosenAudio);
|
|
197
|
+
this.audiosForSpace.splice(index, 1);
|
|
198
|
+
// delete all zones with this comment audio
|
|
199
|
+
const audioZonesToDelete = this.zones.filter((z) => z.audioID === this.chosenAudio.id);
|
|
200
|
+
await Promise.all(audioZonesToDelete.map(async (zone) => {
|
|
201
|
+
await this.zoneService.deleteZone(zone.id);
|
|
202
|
+
const indexZone = this.audioZones.indexOf(this.currentAudioZone);
|
|
203
|
+
if (indexZone !== -1) {
|
|
204
|
+
this.audioZones.slice(indexZone, 1);
|
|
205
|
+
}
|
|
206
|
+
}));
|
|
207
|
+
this.currentAudioZone = null;
|
|
208
|
+
this.chosenAudio = null;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
AddAudioZoneComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AddAudioZoneComponent, deps: [{ token: i1.FormBuilder }, { token: i2.ZoneService }, { token: i2.LayerService }, { token: i2.BaseUserService }, { token: i2.NavigationService }, { token: i2.CommentService }, { token: i3.TranslateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
213
|
+
AddAudioZoneComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.7", type: AddAudioZoneComponent, selector: "lib-add-audio-zone", inputs: { spaceID: "spaceID", defaultZone: "defaultZone", zones: "zones", parentZone: "parentZone", currentAudioZone: "currentAudioZone" }, outputs: { updatedZone: "updatedZone" }, ngImport: i0, template: "<div class=\"main-container\">\n <div class=\"col-lg-6 col-md-6 col-sm-7\" *ngIf=\"isAddingAudio\">\n <form (ngSubmit)=\"onUploadAudio()\" [formGroup]=\"commentForm\">\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Name' | translate}} *</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" required formControlName=\"title\">\n </div>\n </div>\n <div>\n <label for=\"file\" class=\"btn btn-label-file rounded-pill\">\n <input type=\"file\" id=\"file\" (change)=\"handleFileInput($event)\" />\n {{'Choose File' | translate}}</label>\n <p *ngIf=\"fileToUpload\">{{ fileToUpload.name}}</p>\n </div>\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\n <lib-loader></lib-loader>\n </div>\n \n <div class=\"mt-3\">\n <button type=\"submit\" class=\"btn btn-primary rounded-pill me-2\" [disabled]=\"fromPlan || working\">{{'Upload' | translate}}</button>\n <button type=\"button\" (click)=\"onCancelAudioUpload()\" class=\"btn btn-outline-primary rounded-pill me-2\">\n {{'Cancel' | translate}}</button>\n </div>\n </form>\n </div>\n <ngb-alert type=\"success\" [dismissible]=\"true\" *ngIf=\"!working && audioUploaded\" (closed)=\"audioUploaded=false\">\n {{ 'add-audio.success' | translate }} !\n </ngb-alert>\n <div class=\"col-7\" *ngIf=\"!isAddingAudio && audiosForSpace\">\n \n <div class=\"instruction-row\" >\n <p>1.</p>\n <div ngbDropdown class=\"d-inline-block\">\n <div>\n <button type=\"button\" class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\"\n ngbDropdownToggle>{{chosenAudio ?\n chosenAudio.title : ('choose-audio' | translate) }}</button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\n <button type=\"button\" ngbDropdownItem *ngFor=\"let audio of audiosForSpace\" \n (click)=\"onChooseAudio(audio)\">{{ audio.title }}\n </button>\n </div>\n </div>\n </div>\n <p>{{'or' | translate}}</p>\n <button (click)=\"isAddingAudio=true\" class=\"btn btn-primary rounded-pill me-2\"> {{'add-audio.add' | translate}}</button>\n </div>\n <div class=\"instruction-row\">\n <p>2.</p>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"togglePlan()\" [disabled]=\"!chosenAudio\">\n {{'Choose scan points on plan' | translate}}</button>\n\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onDeleteAudio()\" [disabled]=\"!chosenAudio\">\n {{'Delete audio' | translate}}</button>\n \n </div>\n <div class=\"instruction-row\" *ngIf=\"chosenAudio\">\n <p>{{ chosenScansOnPlan.length }} {{'scans-chosen-audio' | translate}}</p>\n </div>\n\n <div class=\"mt-3\">\n <button class=\"btn btn-primary rounded-pill me-2\" [disabled]=\"fromPlan || !this.chosenAudio\" (click)=\"onSubmit()\">{{'Save' | translate}}</button>\n <button (click)=\"onCancel()\" class=\"btn btn-outline-primary rounded-pill me-2\">\n {{'Cancel' | translate}}</button>\n </div>\n </div>\n <div class=\"edit-plan\" *ngIf=\"fromPlan\">\n <lib-sweep-plan-selection style=\"width: 100%;\" [inputZone]=\"currentAudioZone\" [spaceID]=\"spaceID\" \n [occupiedSweeps]=\"occupiedSweeps\" [unavailableSweeps]=\"unavailableSweeps\" [editingAudioZone]=\"true\"\n (sweepsSelected)=\"onSelectedSweepsFromPlan($event)\"></lib-sweep-plan-selection>\n </div>\n</div>\n", styles: [".instruction-row{display:flex;align-items:center;margin-top:1rem}.instruction-row button{margin-bottom:0}.instruction-row p{margin-bottom:0;margin-left:5px;margin-right:5px}\n"], components: [{ type: i2.LoaderComponent, selector: "lib-loader", inputs: ["useLogo", "color"] }, { type: i4.NgbAlert, selector: "ngb-alert", inputs: ["animation", "dismissible", "type"], outputs: ["closed"], exportAs: ["ngbAlert"] }, { type: i5.SweepPlanSelectionComponent, selector: "lib-sweep-plan-selection", inputs: ["spaceID", "chosenScansOnPlan", "newZoneData", "occupiedSweeps", "unavailableSweeps", "editingAudioZone", "inputZone", "multipleFloors"], outputs: ["sweepsSelected"] }], directives: [{ type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i4.NgbDropdown, selector: "[ngbDropdown]", inputs: ["autoClose", "dropdownClass", "open", "placement", "container", "display"], outputs: ["openChange"], exportAs: ["ngbDropdown"] }, { type: i4.NgbDropdownToggle, selector: "[ngbDropdownToggle]" }, { type: i4.NgbDropdownMenu, selector: "[ngbDropdownMenu]" }, { type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i4.NgbDropdownItem, selector: "[ngbDropdownItem]", inputs: ["disabled"] }], pipes: { "translate": i3.TranslatePipe } });
|
|
214
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: AddAudioZoneComponent, decorators: [{
|
|
215
|
+
type: Component,
|
|
216
|
+
args: [{ selector: 'lib-add-audio-zone', template: "<div class=\"main-container\">\n <div class=\"col-lg-6 col-md-6 col-sm-7\" *ngIf=\"isAddingAudio\">\n <form (ngSubmit)=\"onUploadAudio()\" [formGroup]=\"commentForm\">\n <div class=\"mb-3 row\">\n <label class=\"col-sm-2 col-form-label\">{{'Name' | translate}} *</label>\n <div class=\"col-sm-10\">\n <input type=\"text\" class=\"form-control\" required formControlName=\"title\">\n </div>\n </div>\n <div>\n <label for=\"file\" class=\"btn btn-label-file rounded-pill\">\n <input type=\"file\" id=\"file\" (change)=\"handleFileInput($event)\" />\n {{'Choose File' | translate}}</label>\n <p *ngIf=\"fileToUpload\">{{ fileToUpload.name}}</p>\n </div>\n <div class=\"d-flex justify-content-center\" *ngIf=\"working\">\n <lib-loader></lib-loader>\n </div>\n \n <div class=\"mt-3\">\n <button type=\"submit\" class=\"btn btn-primary rounded-pill me-2\" [disabled]=\"fromPlan || working\">{{'Upload' | translate}}</button>\n <button type=\"button\" (click)=\"onCancelAudioUpload()\" class=\"btn btn-outline-primary rounded-pill me-2\">\n {{'Cancel' | translate}}</button>\n </div>\n </form>\n </div>\n <ngb-alert type=\"success\" [dismissible]=\"true\" *ngIf=\"!working && audioUploaded\" (closed)=\"audioUploaded=false\">\n {{ 'add-audio.success' | translate }} !\n </ngb-alert>\n <div class=\"col-7\" *ngIf=\"!isAddingAudio && audiosForSpace\">\n \n <div class=\"instruction-row\" >\n <p>1.</p>\n <div ngbDropdown class=\"d-inline-block\">\n <div>\n <button type=\"button\" class=\"btn btn-label-file rounded-pill\" id=\"dropdownBasic1\"\n ngbDropdownToggle>{{chosenAudio ?\n chosenAudio.title : ('choose-audio' | translate) }}</button>\n <div ngbDropdownMenu aria-labelledby=\"dropdownBasic1\">\n <button type=\"button\" ngbDropdownItem *ngFor=\"let audio of audiosForSpace\" \n (click)=\"onChooseAudio(audio)\">{{ audio.title }}\n </button>\n </div>\n </div>\n </div>\n <p>{{'or' | translate}}</p>\n <button (click)=\"isAddingAudio=true\" class=\"btn btn-primary rounded-pill me-2\"> {{'add-audio.add' | translate}}</button>\n </div>\n <div class=\"instruction-row\">\n <p>2.</p>\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"togglePlan()\" [disabled]=\"!chosenAudio\">\n {{'Choose scan points on plan' | translate}}</button>\n\n <button type=\"button\" class=\"btn btn-outline-primary rounded-pill me-2\" (click)=\"onDeleteAudio()\" [disabled]=\"!chosenAudio\">\n {{'Delete audio' | translate}}</button>\n \n </div>\n <div class=\"instruction-row\" *ngIf=\"chosenAudio\">\n <p>{{ chosenScansOnPlan.length }} {{'scans-chosen-audio' | translate}}</p>\n </div>\n\n <div class=\"mt-3\">\n <button class=\"btn btn-primary rounded-pill me-2\" [disabled]=\"fromPlan || !this.chosenAudio\" (click)=\"onSubmit()\">{{'Save' | translate}}</button>\n <button (click)=\"onCancel()\" class=\"btn btn-outline-primary rounded-pill me-2\">\n {{'Cancel' | translate}}</button>\n </div>\n </div>\n <div class=\"edit-plan\" *ngIf=\"fromPlan\">\n <lib-sweep-plan-selection style=\"width: 100%;\" [inputZone]=\"currentAudioZone\" [spaceID]=\"spaceID\" \n [occupiedSweeps]=\"occupiedSweeps\" [unavailableSweeps]=\"unavailableSweeps\" [editingAudioZone]=\"true\"\n (sweepsSelected)=\"onSelectedSweepsFromPlan($event)\"></lib-sweep-plan-selection>\n </div>\n</div>\n", styles: [".instruction-row{display:flex;align-items:center;margin-top:1rem}.instruction-row button{margin-bottom:0}.instruction-row p{margin-bottom:0;margin-left:5px;margin-right:5px}\n"] }]
|
|
217
|
+
}], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.ZoneService }, { type: i2.LayerService }, { type: i2.BaseUserService }, { type: i2.NavigationService }, { type: i2.CommentService }, { type: i3.TranslateService }]; }, propDecorators: { spaceID: [{
|
|
218
|
+
type: Input
|
|
219
|
+
}], updatedZone: [{
|
|
220
|
+
type: Output
|
|
221
|
+
}], defaultZone: [{
|
|
222
|
+
type: Input
|
|
223
|
+
}], zones: [{
|
|
224
|
+
type: Input
|
|
225
|
+
}], parentZone: [{
|
|
226
|
+
type: Input
|
|
227
|
+
}], currentAudioZone: [{
|
|
228
|
+
type: Input
|
|
229
|
+
}] } });
|
|
230
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWF1ZGlvLXpvbmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvem9uZXMvYWRkLWF1ZGlvLXpvbmUvYWRkLWF1ZGlvLXpvbmUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWxvY2F0aW9ucy9zcmMvbGliL2NvbXBvbmVudHMvem9uZXMvYWRkLWF1ZGlvLXpvbmUvYWRkLWF1ZGlvLXpvbmUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRSxPQUFPLEVBQTBCLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXBFLE9BQU8sRUFBOEUsV0FBVyxFQUFrRCxNQUFNLG1DQUFtQyxDQUFDOzs7Ozs7OztBQVE1TCxNQUFNLE9BQU8scUJBQXFCO0lBOEM5QixZQUNZLEVBQWUsRUFDZixXQUF3QixFQUN4QixZQUEwQixFQUMxQixXQUE0QixFQUM1QixpQkFBb0MsRUFDcEMsY0FBOEIsRUFDOUIsU0FBMkI7UUFOM0IsT0FBRSxHQUFGLEVBQUUsQ0FBYTtRQUNmLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQzFCLGdCQUFXLEdBQVgsV0FBVyxDQUFpQjtRQUM1QixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQWpEN0IsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBUWhELGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBRXBCLGFB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O1lBQzNDLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2RixNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsRUFBRTtnQkFDcEQsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzNDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNqRSxJQUFJLFNBQVMsS0FBSyxDQUFDLENBQUMsRUFBRTtvQkFDbEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUN2QztZQUNMLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDSixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1lBQzdCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1NBQzNCO0lBQ0wsQ0FBQzs7a0hBL1BRLHFCQUFxQjtzR0FBckIscUJBQXFCLCtPQ1hsQyxvb0lBeUVBOzJGRDlEYSxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0ksb0JBQW9CO2lSQU1yQixPQUFPO3NCQUFmLEtBQUs7Z0JBRUksV0FBVztzQkFBcEIsTUFBTTtnQkFFRSxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQXdCRyxnQkFBZ0I7c0JBQXhCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAsIEZvcm1CdWlsZGVyLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2UsIExheWVyU2VydmljZSwgQmFzZVVzZXJTZXJ2aWNlLCBOYXZpZ2F0aW9uU2VydmljZSwgTGF5ZXIsIFpvbmUsIENvbW1lbnRUeXBlLCBDb21tZW50U2VydmljZSwgQ29tbWVudCwgZmlsdGVyVW5pcXVlQXJyYXlCeUlEIH0gZnJvbSAnQHNtYXJ0ZXJwbGFuL25neC1zbWFydGVycGxhbi1jb3JlJztcblxuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2xpYi1hZGQtYXVkaW8tem9uZScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2FkZC1hdWRpby16b25lLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9hZGQtYXVkaW8tem9uZS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBBZGRBdWRpb1pvbmVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gICAgQElucHV0KCkgc3BhY2VJRDogc3RyaW5nO1xuXG4gICAgQE91dHB1dCgpIHVwZGF0ZWRab25lID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICBASW5wdXQoKSBkZWZhdWx0Wm9uZTogWm9uZTtcblxuICAgIEBJbnB1dCgpIHpvbmVzOiBab25lW107XG5cbiAgICBASW5wdXQoKSBwYXJlbnRab25lOiBab25lO1xuXG4gICAgaXNTdWJtaXR0ZWQgPSBmYWxzZTtcblxuICAgIGZyb21QbGFuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBjaG9zZW5TY2Fuc09uUGxhbjogc3RyaW5nW10gPSBbXTtcblxuICAgIGN1cnJlbnRPcmdJZDogc3RyaW5nO1xuXG4gICAgYXVkaW9MYXllcjogTGF5ZXI7XG5cbiAgICBjb21tZW50Rm9ybTogRm9ybUdyb3VwO1xuXG4gICAgZmlsZVRvVXBsb2FkOiBGaWxlO1xuXG4gICAgYXVkaW9zRm9yU3BhY2U6IENvbW1lbnRbXTtcblxuICAgIGlzQWRkaW5nQXVkaW8gPSBmYWxzZTtcblxuICAgIGNob3NlbkF1ZGlvOiBDb21tZW50O1xuXG4gICAgYXVkaW9ab25lczogWm9uZVtdO1xuXG4gICAgQElucHV0KCkgY3VycmVudEF1ZGlvWm9uZTogWm9uZTtcblxuICAgIHNjYW5zTW9kaWZpZWQgPSBmYWxzZTtcblxuICAgIG9jY3VwaWVkU3dlZXBzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdW5hdmFpbGFibGVTd2VlcHM6IHN0cmluZ1tdID0gW107XG5cbiAgICB3b3JraW5nID0gZmFsc2U7XG5cbiAgICBhdWRpb1VwbG9hZGVkID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgICAgIHByaXZhdGUgem9uZVNlcnZpY2U6IFpvbmVTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGxheWVyU2VydmljZTogTGF5ZXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgbmF2aWdhdGlvblNlcnZpY2U6IE5hdmlnYXRpb25TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIGNvbW1lbnRTZXJ2aWNlOiBDb21tZW50U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgKSB7IH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jdXJyZW50QXVkaW9ab25lKSB7XG4gICAgICAgICAgICAvLyB3ZSBhcmUgZWRpdGluZyB6b25lXG4gICAgICAgICAgICB0aGlzLmNob3NlbkF1ZGlvID0gdGhpcy5jdXJyZW50QXVkaW9ab25lLmF1ZGlvO1xuICAgICAgICAgICAgdGhpcy5jaG9zZW5TY2Fuc09uUGxhbiA9IHRoaXMuY3VycmVudEF1ZGlvWm9uZS5zd2VlcElEcztcbiAgICAgICAgICAgIHRoaXMucGFyZW50Wm9uZSA9IHRoaXMuY3VycmVudEF1ZGlvWm9uZS5wYXJlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXR1cCgpO1xuICAgIH1cblxuICAgIGFzeW5jIHNldHVwKCkge1xuICAgICAgICBjb25zdCBtaXNzaW9uID0gdGhpcy51c2VyU2VydmljZS5jdXJyZW50TWlzc2lvbih0aGlzLnNwYWNlSUQpO1xuICAgICAgICB0aGlzLmN1cnJlbnRPcmdJZCA9IG1pc3Npb24ub3JnYW5pc2F0aW9uSUQ7XG4gICAgICAgIGxldCBsYXllcnMgPSBhd2FpdCB0aGlzLmxheWVyU2VydmljZS5nZXRMYXllckZvck9yZ2FuaXNhdGlvbihcbiAgICAgICAgICAgIHRoaXMuY3VycmVudE9yZ0lkLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmF1ZGlvTGF5ZXIgPSBsYXllcnMuZmluZCgobGF5ZXIpID0+IGxheWVyLm5hbWUgPT09IFwiQVVESU9cIik7XG4gICAgICAgIGlmICghdGhpcy5hdWRpb0xheWVyKSB7XG4gICAgICAgICAgICAvLyBmaXJzdCB0aW1lIGNyZWF0aW5nIEF1ZGlvIFpvbmUgXG4gICAgICAgICAgICB0aGlzLmF1ZGlvTGF5ZXIgPSBhd2FpdCB0aGlzLmxheWVyU2VydmljZS5jcmVhdGVMYXllckZvck9yZ2FuaXNhdGlvbihcIkFVRElPXCIsIHRoaXMuY3VycmVudE9yZ0lkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMucGFyZW50Wm9uZSkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRab25lID0gdGhpcy5kZWZhdWx0Wm9uZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmF1ZGlvWm9uZXMgPSB0aGlzLnpvbmVzLmZpbHRlcigoem9uZSkgPT4gem9uZS5hdWRpb0lEICYmIHpvbmUucGFyZW50SUQgPT09IHRoaXMucGFyZW50Wm9uZS5pZCk7XG4gICAgICAgIHRoaXMub2NjdXBpZWRTd2VlcHMgPSB0aGlzLmF1ZGlvWm9uZXMuZmxhdE1hcCgoem9uZSkgPT4gem9uZS5zd2VlcElEcyk7XG4gICAgICAgIC8vIHVuYXZhaWxhYmxlIHN3ZWVwczogc3dlZXBzIHRoYXQgZG8gbm90IGJlbG9uZyB0byBwYXJlbnQgem9uZVxuICAgICAgICB0aGlzLnVuYXZhaWxhYmxlU3dlZXBzID0gdGhpcy5kZWZhdWx0Wm9uZS5zd2VlcElEcy5maWx0ZXIoKHN3ZWVwKSA9PiAhdGhpcy5wYXJlbnRab25lLnN3ZWVwSURzLmluY2x1ZGVzKHN3ZWVwKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuZ2V0QXVkaW9zKCk7XG4gICAgICAgIHRoaXMuY29tbWVudEZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIHRpdGxlOiBbbnVsbCwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgICAgICBzcGFjZUlEOiB0aGlzLnNwYWNlSUQsXG4gICAgICAgICAgICB0eXBlOiBDb21tZW50VHlwZS5BVURJTyxcbiAgICAgICAgICAgIG93bmVySUQ6IG1pc3Npb24uaWQsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGFzeW5jIG9uU3VibWl0KCkge1xuICAgICAgICB0aGlzLmlzU3VibWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy53b3JraW5nID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuY3VycmVudEF1ZGlvWm9uZSkge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy56b25lU2VydmljZS51cGRhdGVab25lKHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5jdXJyZW50QXVkaW9ab25lLmlkLFxuICAgICAgICAgICAgICAgIHN3ZWVwSURzOiB0aGlzLmNob3NlblNjYW5zT25QbGFuLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZVRha2VuU3dlZXBzRnJvbU90aGVyWm9uZXMoKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlZFpvbmUuZW1pdCh0aGlzLmN1cnJlbnRBdWRpb1pvbmUuaWQpO1xuICAgICAgICAgICAgdGhpcy53b3JraW5nID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCB6b25lSW5wdXQgPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogYCR7dGhpcy5wYXJlbnRab25lLm5hbWV9IC0gJHt0aGlzLmNob3NlbkF1ZGlvLnRpdGxlfWAsXG4gICAgICAgICAgICAgICAgc3VyZmFjZTogMCxcbiAgICAgICAgICAgICAgICBzcGFjZUlEOiB0aGlzLnNwYWNlSUQsXG4gICAgICAgICAgICAgICAgbGF5ZXJJRDogdGhpcy5hdWRpb0xheWVyLmlkLFxuICAgICAgICAgICAgICAgIHBhcmVudElEOiB0aGlzLnBhcmVudFpvbmUuaWQsXG4gICAgICAgICAgICAgICAgaXNNdXNldW1WaXNpdFpvbmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzTXVsdGlwbGVGbG9vclpvbmU6IHRoaXMucGFyZW50Wm9uZS5pc011bHRpcGxlRmxvb3Jab25lLFxuICAgICAgICAgICAgICAgIGF1ZGlvSUQ6IHRoaXMuY2hvc2VuQXVkaW8uaWQsXG4gICAgICAgICAgICB9IGFzIFpvbmU7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2V0U3dlZXBzQW5kTm9kZUZvclpvbmVJbnB1dCh6b25lSW5wdXQpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuem9uZVNlcnZpY2VcbiAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZSh6b25lSW5wdXQpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKGFzeW5jICh6b25lQ3JlYXRlZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QXVkaW9ab25lID0gem9uZUNyZWF0ZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnJlbW92ZVRha2VuU3dlZXBzRnJvbU90aGVyWm9uZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlZFpvbmUuZW1pdCh6b25lQ3JlYXRlZC5pZCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMud29ya2luZyA9IGZhbHNlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aGlzLndvcmtpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFzeW5jIHNldFN3ZWVwc0FuZE5vZGVGb3Jab25lSW5wdXQoem9uZUlucHV0OiBab25lKSB7XG4gICAgICAgIGlmICh0aGlzLmNob3NlblNjYW5zT25QbGFuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHpvbmVJbnB1dC5zd2VlcElEcyA9IHRoaXMuY2hvc2VuU2NhbnNPblBsYW47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHpvbmVJbnB1dC5zd2VlcElEcyAmJiB6b25lSW5wdXQuc3dlZXBJRHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbmF2Rm9yU3dlZXAgPVxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMubmF2aWdhdGlvblNlcnZpY2UuZ2V0TmF2aWdhdGlvbnNGb3JNYXR0ZXJwb3J0SURGb3JTcGFjZShcbiAgICAgICAgICAgICAgICAgICAgem9uZUlucHV0LnN3ZWVwSURzWzBdLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNwYWNlSUQsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHpvbmVJbnB1dC5ub2RlSURzID0gW25hdkZvclN3ZWVwWzBdLm5vZGVJRF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkNhbmNlbCgpIHtcbiAgICAgICAgaWYgKHRoaXMuc2NhbnNNb2RpZmllZCkge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJjb25maXJtLmNhbmNlbEVkaXRab25lXCIpO1xuICAgICAgICAgICAgaWYgKCF3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbW1lbnRGb3JtID0gbnVsbDtcbiAgICAgICAgdGhpcy5jaG9zZW5TY2Fuc09uUGxhbiA9IFtdO1xuICAgICAgICB0aGlzLnVwZGF0ZWRab25lLmVtaXQoZmFsc2UpO1xuICAgIH1cblxuICAgIHRvZ2dsZVBsYW4oKSB7XG4gICAgICAgIHRoaXMuZnJvbVBsYW4gPSB0cnVlO1xuICAgIH1cblxuICAgIG9uU2VsZWN0ZWRTd2VlcHNGcm9tUGxhbihyZXN1bHQ6IHsgXCJzd2VlcHNcIjogc3RyaW5nW107IFwic3RhcnRTd2VlcElEXCI6IHN0cmluZzsgfSkge1xuICAgICAgICBpZiAocmVzdWx0ICYmIHJlc3VsdC5zd2VlcHMpIHtcbiAgICAgICAgICAgIHRoaXMuY2hvc2VuU2NhbnNPblBsYW4gPSByZXN1bHQuc3dlZXBzO1xuICAgICAgICAgICAgdGhpcy5zY2Fuc01vZGlmaWVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmZyb21QbGFuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaGFuZGxlRmlsZUlucHV0KGV2ZW50OiBFdmVudCkge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAgICAgdGhpcy5maWxlVG9VcGxvYWQgPSAodGFyZ2V0LmZpbGVzIGFzIEZpbGVMaXN0KVswXTtcbiAgICB9XG5cbiAgICBhc3luYyBvblVwbG9hZEF1ZGlvKCkge1xuICAgICAgICB0aGlzLndvcmtpbmcgPSB0cnVlO1xuICAgICAgICBjb25zdCBjb21tZW50SW5wdXQgPSB0aGlzLmNvbW1lbnRGb3JtLnZhbHVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbmV3QXVkaW8gPSBhd2FpdCB0aGlzLmNvbW1lbnRTZXJ2aWNlLmNyZWF0ZUNvbW1lbnRXaXRoRmlsZShcbiAgICAgICAgICAgICAgICBjb21tZW50SW5wdXQsXG4gICAgICAgICAgICAgICAgdGhpcy5maWxlVG9VcGxvYWQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhpcy5hdWRpb3NGb3JTcGFjZS5wdXNoKG5ld0F1ZGlvKTtcbiAgICAgICAgICAgIHRoaXMuaXNBZGRpbmdBdWRpbyA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy53b3JraW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmF1ZGlvVXBsb2FkZWQgPSB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLndvcmtpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuYXVkaW9VcGxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIGFzeW5jIGdldEF1ZGlvcygpIHtcbiAgICAgICAgY29uc3QgYXR0YWNobWVudHMgPSBhd2FpdCB0aGlzLmNvbW1lbnRTZXJ2aWNlLmdldENvbW1lbnRzQnlTcGFjZUlEKHRoaXMuc3BhY2VJRCk7XG4gICAgICAgIGlmIChhdHRhY2htZW50cykge1xuICAgICAgICAgICAgdGhpcy5hdWRpb3NGb3JTcGFjZSA9IGF0dGFjaG1lbnRzLmZpbHRlcigoYXR0YWNobWVudCkgPT4gYXR0YWNobWVudC50eXBlID09PSBDb21tZW50VHlwZS5BVURJTyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkNhbmNlbEF1ZGlvVXBsb2FkKCkge1xuICAgICAgICB0aGlzLmNvbW1lbnRGb3JtID0gbnVsbDtcbiAgICAgICAgdGhpcy5pc0FkZGluZ0F1ZGlvID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZmlsZVRvVXBsb2FkID0gbnVsbDtcbiAgICB9XG5cbiAgICBvbkNob29zZUF1ZGlvKGF1ZGlvOiBDb21tZW50KSB7XG4gICAgICAgIHRoaXMuY2hvc2VuQXVkaW8gPSBhdWRpbztcbiAgICAgICAgdGhpcy5jdXJyZW50QXVkaW9ab25lID0gdGhpcy5hdWRpb1pvbmVzLmZpbmQoKHpvbmUpID0+IHpvbmUuYXVkaW9JRCA9PT0gdGhpcy5jaG9zZW5BdWRpby5pZCk7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRBdWRpb1pvbmUpIHtcbiAgICAgICAgICAgIHRoaXMuY2hvc2VuU2NhbnNPblBsYW4gPSB0aGlzLmN1cnJlbnRBdWRpb1pvbmUuc3dlZXBJRHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmNob3NlblNjYW5zT25QbGFuID0gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIG5ld2x5IHNlbGVjdGVkIHN3ZWVwcyBmb3IgY3VycmVudCB6b25lICh0aGV5IGFyZSBpbiBjaG9zZW5TY2Fuc09uUGxhbikgZnJvbSBvdGhlciBhdWRpbyB6b25lcy4gXG4gICAgICogUnVsZTogb25lIHN3ZWVwID0gb25lIGF1ZGlvLlxuICAgICAqL1xuICAgIGFzeW5jIHJlbW92ZVRha2VuU3dlZXBzRnJvbU90aGVyWm9uZXMoKSB7XG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKHRoaXMuYXVkaW9ab25lcy5tYXAoYXN5bmMgKHpvbmUpID0+IHtcbiAgICAgICAgICAgIGlmICh6b25lLmlkICE9PSB0aGlzLmN1cnJlbnRBdWRpb1pvbmUuaWQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdTd2VlcHMgPSB6b25lLnN3ZWVwSURzLmZpbHRlcigoc3dlZXBJRCkgPT4gIXRoaXMuY2hvc2VuU2NhbnNPblBsYW4uaW5jbHVkZXMoc3dlZXBJRCkpO1xuICAgICAgICAgICAgICAgIGlmIChuZXdTd2VlcHMubGVuZ3RoICE9PSB6b25lLnN3ZWVwSURzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLnVwZGF0ZVpvbmUoeyBpZDogem9uZS5pZCwgc3dlZXBJRHM6IG5ld1N3ZWVwcyB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgYXVkaW8gYXMgQ29tbWVudCwgYWxsIGl0cyBhdWRpbyBab25lcyBhbmQgZmlsZSBmcm9tIFMzICh1c2luZyBsYW1iZGEgZnVuY3Rpb24pXG4gICAgICovXG4gICAgYXN5bmMgb25EZWxldGVBdWRpbygpIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoXCJjb25maXJtLmRlbGV0ZUF1ZGlvXCIpO1xuICAgICAgICBpZiAod2luZG93LmNvbmZpcm0obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29tbWVudFNlcnZpY2UuZGVsZXRlQ29tbWVudCh0aGlzLmNob3NlbkF1ZGlvLmlkKTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5hdWRpb3NGb3JTcGFjZS5pbmRleE9mKHRoaXMuY2hvc2VuQXVkaW8pO1xuICAgICAgICAgICAgdGhpcy5hdWRpb3NGb3JTcGFjZS5zcGxpY2UoaW5kZXgsIDEpO1xuXG4gICAgICAgICAgICAvLyBkZWxldGUgYWxsIHpvbmVzIHdpdGggdGhpcyBjb21tZW50IGF1ZGlvXG4gICAgICAgICAgICBjb25zdCBhdWRpb1pvbmVzVG9EZWxldGUgPSB0aGlzLnpvbmVzLmZpbHRlcigoeikgPT4gei5hdWRpb0lEID09PSB0aGlzLmNob3NlbkF1ZGlvLmlkKTtcbiAgICAgICAgICAgIGF3YWl0IFByb21pc2UuYWxsKGF1ZGlvWm9uZXNUb0RlbGV0ZS5tYXAoYXN5bmMgKHpvbmUpID0+IHtcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnpvbmVTZXJ2aWNlLmRlbGV0ZVpvbmUoem9uZS5pZCk7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXhab25lID0gdGhpcy5hdWRpb1pvbmVzLmluZGV4T2YodGhpcy5jdXJyZW50QXVkaW9ab25lKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXhab25lICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1ZGlvWm9uZXMuc2xpY2UoaW5kZXhab25lLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRBdWRpb1pvbmUgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy5jaG9zZW5BdWRpbyA9IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cbiIsIjxkaXYgY2xhc3M9XCJtYWluLWNvbnRhaW5lclwiPlxuICAgIDxkaXYgY2xhc3M9XCJjb2wtbGctNiBjb2wtbWQtNiBjb2wtc20tN1wiICpuZ0lmPVwiaXNBZGRpbmdBdWRpb1wiPlxuICAgICAgICA8Zm9ybSAobmdTdWJtaXQpPVwib25VcGxvYWRBdWRpbygpXCIgW2Zvcm1Hcm91cF09XCJjb21tZW50Rm9ybVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zIHJvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtc20tMiBjb2wtZm9ybS1sYWJlbFwiPnt7J05hbWUnIHwgdHJhbnNsYXRlfX0gKjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcmVxdWlyZWQgZm9ybUNvbnRyb2xOYW1lPVwidGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImZpbGVcIiBjbGFzcz1cImJ0biBidG4tbGFiZWwtZmlsZSByb3VuZGVkLXBpbGxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGlkPVwiZmlsZVwiIChjaGFuZ2UpPVwiaGFuZGxlRmlsZUlucHV0KCRldmVudClcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAge3snQ2hvb3NlIEZpbGUnIHwgdHJhbnNsYXRlfX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8cCAqbmdJZj1cImZpbGVUb1VwbG9hZFwiPnt7IGZpbGVUb1VwbG9hZC5uYW1lfX08L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgKm5nSWY9XCJ3b3JraW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaWItbG9hZGVyPjwvbGliLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtMlwiIFtkaXNhYmxlZF09XCJmcm9tUGxhbiB8fCB3b3JraW5nXCI+e3snVXBsb2FkJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJvbkNhbmNlbEF1ZGlvVXBsb2FkKClcIiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eydDYW5jZWwnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mb3JtPlxuICAgIDwvZGl2PlxuICAgIDxuZ2ItYWxlcnQgdHlwZT1cInN1Y2Nlc3NcIiBbZGlzbWlzc2libGVdPVwidHJ1ZVwiICpuZ0lmPVwiIXdvcmtpbmcgJiYgYXVkaW9VcGxvYWRlZFwiIChjbG9zZWQpPVwiYXVkaW9VcGxvYWRlZD1mYWxzZVwiPlxuICAgICAgICB7eyAnYWRkLWF1ZGlvLnN1Y2Nlc3MnIHwgdHJhbnNsYXRlIH19ICFcbiAgICA8L25nYi1hbGVydD5cbiAgICA8ZGl2IGNsYXNzPVwiY29sLTdcIiAqbmdJZj1cIiFpc0FkZGluZ0F1ZGlvICYmIGF1ZGlvc0ZvclNwYWNlXCI+XG4gICAgICAgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnN0cnVjdGlvbi1yb3dcIiA+XG4gICAgICAgICAgICA8cD4xLjwvcD5cbiAgICAgICAgICAgIDxkaXYgbmdiRHJvcGRvd24gY2xhc3M9XCJkLWlubGluZS1ibG9ja1wiPlxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGFiZWwtZmlsZSByb3VuZGVkLXBpbGxcIiBpZD1cImRyb3Bkb3duQmFzaWMxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ2JEcm9wZG93blRvZ2dsZT57e2Nob3NlbkF1ZGlvID9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvc2VuQXVkaW8udGl0bGUgOiAoJ2Nob29zZS1hdWRpbycgfCB0cmFuc2xhdGUpIH19PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IG5nYkRyb3Bkb3duTWVudSBhcmlhLWxhYmVsbGVkYnk9XCJkcm9wZG93bkJhc2ljMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG5nYkRyb3Bkb3duSXRlbSAqbmdGb3I9XCJsZXQgYXVkaW8gb2YgYXVkaW9zRm9yU3BhY2VcIiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uQ2hvb3NlQXVkaW8oYXVkaW8pXCI+e3sgYXVkaW8udGl0bGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8cD57eydvcicgfCB0cmFuc2xhdGV9fTwvcD5cbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cImlzQWRkaW5nQXVkaW89dHJ1ZVwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHJvdW5kZWQtcGlsbCBtZS0yXCI+IHt7J2FkZC1hdWRpby5hZGQnIHwgdHJhbnNsYXRlfX08L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnN0cnVjdGlvbi1yb3dcIj5cbiAgICAgICAgICAgIDxwPjIuPC9wPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtMlwiIChjbGljayk9XCJ0b2dnbGVQbGFuKClcIiBbZGlzYWJsZWRdPVwiIWNob3NlbkF1ZGlvXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7J0Nob29zZSBzY2FuIHBvaW50cyBvbiBwbGFuJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIiAoY2xpY2spPVwib25EZWxldGVBdWRpbygpXCIgW2Rpc2FibGVkXT1cIiFjaG9zZW5BdWRpb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3snRGVsZXRlIGF1ZGlvJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgICAgICBcbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbnN0cnVjdGlvbi1yb3dcIiAqbmdJZj1cImNob3NlbkF1ZGlvXCI+XG4gICAgICAgICAgICA8cD57eyBjaG9zZW5TY2Fuc09uUGxhbi5sZW5ndGggfX0ge3snc2NhbnMtY2hvc2VuLWF1ZGlvJyB8IHRyYW5zbGF0ZX19PC9wPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtM1wiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSByb3VuZGVkLXBpbGwgbWUtMlwiIFtkaXNhYmxlZF09XCJmcm9tUGxhbiB8fCAhdGhpcy5jaG9zZW5BdWRpb1wiIChjbGljayk9XCJvblN1Ym1pdCgpXCI+e3snU2F2ZScgfCB0cmFuc2xhdGV9fTwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25DYW5jZWwoKVwiIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXByaW1hcnkgcm91bmRlZC1waWxsIG1lLTJcIj5cbiAgICAgICAgICAgICAgICAgICAge3snQ2FuY2VsJyB8IHRyYW5zbGF0ZX19PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJlZGl0LXBsYW5cIiAqbmdJZj1cImZyb21QbGFuXCI+XG4gICAgICAgIDxsaWItc3dlZXAtcGxhbi1zZWxlY3Rpb24gc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiBbaW5wdXRab25lXT1cImN1cnJlbnRBdWRpb1pvbmVcIiBbc3BhY2VJRF09XCJzcGFjZUlEXCIgXG4gICAgICAgIFtvY2N1cGllZFN3ZWVwc109XCJvY2N1cGllZFN3ZWVwc1wiIFt1bmF2YWlsYWJsZVN3ZWVwc109XCJ1bmF2YWlsYWJsZVN3ZWVwc1wiIFtlZGl0aW5nQXVkaW9ab25lXT1cInRydWVcIlxuICAgICAgICAoc3dlZXBzU2VsZWN0ZWQpPVwib25TZWxlY3RlZFN3ZWVwc0Zyb21QbGFuKCRldmVudClcIj48L2xpYi1zd2VlcC1wbGFuLXNlbGVjdGlvbj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuIl19
|