@smarterplan/ngx-smarterplan-core 0.3.11
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/README.md +24 -0
- package/esm2020/lib/components/csv-export/csv-export.component.mjs +59 -0
- package/esm2020/lib/components/loader/loader.component.mjs +14 -0
- package/esm2020/lib/components/menu-bar/avatar/avatar.component.mjs +75 -0
- package/esm2020/lib/components/menu-bar/menu-bar.component.mjs +115 -0
- package/esm2020/lib/components/menu-bar/navigation-bar/navigation-bar.component.mjs +254 -0
- package/esm2020/lib/components/menu-bar/range-date-picker/range-date-picker.component.mjs +81 -0
- package/esm2020/lib/components/modal-switch-visit/modal-switch-visit.component.mjs +39 -0
- package/esm2020/lib/components/search-bar/search-bar.component.mjs +63 -0
- package/esm2020/lib/components/support-modal/support-modal.component.mjs +59 -0
- package/esm2020/lib/config.mjs +4 -0
- package/esm2020/lib/helpers.service.mjs +468 -0
- package/esm2020/lib/mattertagData.mjs +177 -0
- package/esm2020/lib/ngx-smarterplan-core.module.mjs +117 -0
- package/esm2020/lib/ngx-smarterplan-core.service.mjs +14 -0
- package/esm2020/lib/pipes/duration-to-string.pipe.mjs +66 -0
- package/esm2020/lib/pipes/hashtag-from-id.pipe.mjs +26 -0
- package/esm2020/lib/pipes/safe-url.pipe.mjs +20 -0
- package/esm2020/lib/pipes/time-date-to-local-string.pipe.mjs +104 -0
- package/esm2020/lib/pipes/username-from-id.pipe.mjs +29 -0
- package/esm2020/lib/services/base-tab.service.mjs +24 -0
- package/esm2020/lib/services/baseVisibility.service.mjs +17 -0
- package/esm2020/lib/services/booking.service.mjs +161 -0
- package/esm2020/lib/services/content.service.mjs +135 -0
- package/esm2020/lib/services/filter.service.mjs +560 -0
- package/esm2020/lib/services/intervention.service.mjs +236 -0
- package/esm2020/lib/services/locale.service.mjs +45 -0
- package/esm2020/lib/services/matterport-import.service.mjs +339 -0
- package/esm2020/lib/services/matterport.service.mjs +876 -0
- package/esm2020/lib/services/models/affectation.service.mjs +60 -0
- package/esm2020/lib/services/models/base-object.service.mjs +70 -0
- package/esm2020/lib/services/models/capture.service.mjs +34 -0
- package/esm2020/lib/services/models/comment.service.mjs +98 -0
- package/esm2020/lib/services/models/domain.service.mjs +77 -0
- package/esm2020/lib/services/models/equipment.service.mjs +629 -0
- package/esm2020/lib/services/models/event.service.mjs +128 -0
- package/esm2020/lib/services/models/feature.service.mjs +339 -0
- package/esm2020/lib/services/models/hashtag.service.mjs +38 -0
- package/esm2020/lib/services/models/layer.service.mjs +33 -0
- package/esm2020/lib/services/models/measurement.service.mjs +158 -0
- package/esm2020/lib/services/models/mission.service.mjs +185 -0
- package/esm2020/lib/services/models/navigation.service.mjs +76 -0
- package/esm2020/lib/services/models/node.service.mjs +31 -0
- package/esm2020/lib/services/models/operation.service.mjs +59 -0
- package/esm2020/lib/services/models/organisation.service.mjs +73 -0
- package/esm2020/lib/services/models/plan.service.mjs +573 -0
- package/esm2020/lib/services/models/poi.service.mjs +48 -0
- package/esm2020/lib/services/models/profile.service.mjs +54 -0
- package/esm2020/lib/services/models/property.service.mjs +34 -0
- package/esm2020/lib/services/models/space.service.mjs +184 -0
- package/esm2020/lib/services/models/template.service.mjs +41 -0
- package/esm2020/lib/services/models/ticket.service.mjs +454 -0
- package/esm2020/lib/services/models/visit.service.mjs +130 -0
- package/esm2020/lib/services/models/zone.service.mjs +184 -0
- package/esm2020/lib/services/navigator.service.mjs +165 -0
- package/esm2020/lib/services/s3.service.mjs +124 -0
- package/esm2020/lib/services/search.service.mjs +124 -0
- package/esm2020/lib/services/support.service.mjs +42 -0
- package/esm2020/lib/services/tag.service.mjs +101 -0
- package/esm2020/lib/services/user.service.mjs +444 -0
- package/esm2020/lib/services/viewer.service.mjs +395 -0
- package/esm2020/lib/services/zone-drawer.service.mjs +76 -0
- package/esm2020/lib/types.service.mjs +266 -0
- package/esm2020/public-api.mjs +63 -0
- package/esm2020/smarterplan-ngx-smarterplan-core.mjs +5 -0
- package/fesm2015/smarterplan-ngx-smarterplan-core.mjs +10057 -0
- package/fesm2015/smarterplan-ngx-smarterplan-core.mjs.map +1 -0
- package/fesm2020/smarterplan-ngx-smarterplan-core.mjs +9371 -0
- package/fesm2020/smarterplan-ngx-smarterplan-core.mjs.map +1 -0
- package/lib/components/csv-export/csv-export.component.d.ts +18 -0
- package/lib/components/loader/loader.component.d.ts +8 -0
- package/lib/components/menu-bar/avatar/avatar.component.d.ts +18 -0
- package/lib/components/menu-bar/menu-bar.component.d.ts +35 -0
- package/lib/components/menu-bar/navigation-bar/navigation-bar.component.d.ts +66 -0
- package/lib/components/menu-bar/range-date-picker/range-date-picker.component.d.ts +24 -0
- package/lib/components/modal-switch-visit/modal-switch-visit.component.d.ts +22 -0
- package/lib/components/search-bar/search-bar.component.d.ts +16 -0
- package/lib/components/support-modal/support-modal.component.d.ts +24 -0
- package/lib/config.d.ts +17 -0
- package/lib/helpers.service.d.ts +79 -0
- package/lib/mattertagData.d.ts +65 -0
- package/lib/ngx-smarterplan-core.module.d.ts +28 -0
- package/lib/ngx-smarterplan-core.service.d.ts +6 -0
- package/lib/pipes/duration-to-string.pipe.d.ts +12 -0
- package/lib/pipes/hashtag-from-id.pipe.d.ts +10 -0
- package/lib/pipes/safe-url.pipe.d.ts +10 -0
- package/lib/pipes/time-date-to-local-string.pipe.d.ts +16 -0
- package/lib/pipes/username-from-id.pipe.d.ts +11 -0
- package/lib/services/base-tab.service.d.ts +10 -0
- package/lib/services/baseVisibility.service.d.ts +8 -0
- package/lib/services/booking.service.d.ts +21 -0
- package/lib/services/content.service.d.ts +28 -0
- package/lib/services/filter.service.d.ts +58 -0
- package/lib/services/intervention.service.d.ts +25 -0
- package/lib/services/locale.service.d.ts +23 -0
- package/lib/services/matterport-import.service.d.ts +46 -0
- package/lib/services/matterport.service.d.ts +141 -0
- package/lib/services/models/affectation.service.d.ts +14 -0
- package/lib/services/models/base-object.service.d.ts +20 -0
- package/lib/services/models/capture.service.d.ts +13 -0
- package/lib/services/models/comment.service.d.ts +26 -0
- package/lib/services/models/domain.service.d.ts +19 -0
- package/lib/services/models/equipment.service.d.ts +88 -0
- package/lib/services/models/event.service.d.ts +43 -0
- package/lib/services/models/feature.service.d.ts +71 -0
- package/lib/services/models/hashtag.service.d.ts +13 -0
- package/lib/services/models/layer.service.d.ts +11 -0
- package/lib/services/models/measurement.service.d.ts +43 -0
- package/lib/services/models/mission.service.d.ts +32 -0
- package/lib/services/models/navigation.service.d.ts +22 -0
- package/lib/services/models/node.service.d.ts +12 -0
- package/lib/services/models/operation.service.d.ts +15 -0
- package/lib/services/models/organisation.service.d.ts +19 -0
- package/lib/services/models/plan.service.d.ts +117 -0
- package/lib/services/models/poi.service.d.ts +15 -0
- package/lib/services/models/profile.service.d.ts +15 -0
- package/lib/services/models/property.service.d.ts +13 -0
- package/lib/services/models/space.service.d.ts +38 -0
- package/lib/services/models/template.service.d.ts +15 -0
- package/lib/services/models/ticket.service.d.ts +86 -0
- package/lib/services/models/visit.service.d.ts +24 -0
- package/lib/services/models/zone.service.d.ts +25 -0
- package/lib/services/navigator.service.d.ts +55 -0
- package/lib/services/s3.service.d.ts +13 -0
- package/lib/services/search.service.d.ts +20 -0
- package/lib/services/support.service.d.ts +17 -0
- package/lib/services/tag.service.d.ts +45 -0
- package/lib/services/user.service.d.ts +104 -0
- package/lib/services/viewer.service.d.ts +113 -0
- package/lib/services/zone-drawer.service.d.ts +7 -0
- package/lib/types.service.d.ts +723 -0
- package/package.json +41 -0
- package/public-api.d.ts +56 -0
- package/smarterplan-ngx-smarterplan-core.d.ts +5 -0
|
@@ -0,0 +1,454 @@
|
|
|
1
|
+
/* eslint-disable class-methods-use-this */
|
|
2
|
+
/* eslint-disable consistent-return */
|
|
3
|
+
import { Inject, Injectable } from "@angular/core";
|
|
4
|
+
import { Subject } from "rxjs";
|
|
5
|
+
import { openModalForVisitSwitch } from "../../helpers.service";
|
|
6
|
+
import { TicketType, TicketPriority, TicketStatus, EventStatus, EventType, PoiType } from "../../types.service";
|
|
7
|
+
import { BaseObjectService } from "./base-object.service";
|
|
8
|
+
import InformationIcon from "@iconify-icons/mdi/information-outline";
|
|
9
|
+
import AccidentIcon from "@iconify-icons/mdi/alert";
|
|
10
|
+
import WordOrderIcon from "@iconify-icons/mdi/account-hard-hat";
|
|
11
|
+
import ReportingIcon from "@iconify-icons/mdi/file-document-outline";
|
|
12
|
+
import MaintenanceIcon from "@iconify-icons/mdi/tools";
|
|
13
|
+
import * as i0 from "@angular/core";
|
|
14
|
+
import * as i1 from "./operation.service";
|
|
15
|
+
import * as i2 from "./event.service";
|
|
16
|
+
import * as i3 from "./affectation.service";
|
|
17
|
+
import * as i4 from "./poi.service";
|
|
18
|
+
import * as i5 from "../user.service";
|
|
19
|
+
import * as i6 from "../navigator.service";
|
|
20
|
+
import * as i7 from "../filter.service";
|
|
21
|
+
import * as i8 from "../intervention.service";
|
|
22
|
+
import * as i9 from "./navigation.service";
|
|
23
|
+
import * as i10 from "../viewer.service";
|
|
24
|
+
import * as i11 from "@ng-bootstrap/ng-bootstrap";
|
|
25
|
+
export class TicketsService extends BaseObjectService {
|
|
26
|
+
constructor(apiInjected, operationService, eventService, affectationService, poiService, userService, navigatorService, filterService, interventionService, navigationService, viewerService, modalService) {
|
|
27
|
+
super(poiService, navigationService);
|
|
28
|
+
this.operationService = operationService;
|
|
29
|
+
this.eventService = eventService;
|
|
30
|
+
this.affectationService = affectationService;
|
|
31
|
+
this.userService = userService;
|
|
32
|
+
this.navigatorService = navigatorService;
|
|
33
|
+
this.filterService = filterService;
|
|
34
|
+
this.interventionService = interventionService;
|
|
35
|
+
this.viewerService = viewerService;
|
|
36
|
+
this.modalService = modalService;
|
|
37
|
+
this.currentTickets = {
|
|
38
|
+
zone: [],
|
|
39
|
+
space: [],
|
|
40
|
+
};
|
|
41
|
+
this.ticketTags = new Subject();
|
|
42
|
+
this.ticketsFiltered = [];
|
|
43
|
+
this.ticketsUpdated = new Subject();
|
|
44
|
+
this.reportingIcon = ReportingIcon;
|
|
45
|
+
this.maintenanceIcon = MaintenanceIcon;
|
|
46
|
+
this.workorderIcon = WordOrderIcon;
|
|
47
|
+
this.informationIcon = InformationIcon;
|
|
48
|
+
this.accidentIcon = AccidentIcon;
|
|
49
|
+
this.updateDone = new Subject();
|
|
50
|
+
this.updating = new Subject();
|
|
51
|
+
this.isMuseumUser = false;
|
|
52
|
+
this.API = apiInjected;
|
|
53
|
+
this.isMuseumUser = this.userService.hasOnlyMuseumRole();
|
|
54
|
+
this.initSubscriptions();
|
|
55
|
+
this.userService.isChanged.subscribe((isConnected) => {
|
|
56
|
+
if (isConnected) {
|
|
57
|
+
this.isMuseumUser = this.userService.hasOnlyMuseumRole();
|
|
58
|
+
this.initSubscriptions();
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
if (this.navSubscription) {
|
|
62
|
+
this.navSubscription.unsubscribe();
|
|
63
|
+
this.filetrSubscription.unsubscribe();
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
async initTickets() {
|
|
69
|
+
let ticketsFiltered = [];
|
|
70
|
+
if (this.currentSpaceID) {
|
|
71
|
+
this.updating.next(true);
|
|
72
|
+
await this.getTicketsBySpace(this.currentSpaceID).then((tickets) => {
|
|
73
|
+
if (tickets) {
|
|
74
|
+
ticketsFiltered = tickets;
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
ticketsFiltered =
|
|
78
|
+
await this.filterService.filterTicketsForCurrentUserInSpace(ticketsFiltered, this.currentSpaceID);
|
|
79
|
+
if (this.dateFilter) {
|
|
80
|
+
ticketsFiltered = this.filterService.filterObjectsForDateRange(ticketsFiltered, this.dateFilter);
|
|
81
|
+
}
|
|
82
|
+
if (this.ticketTypeFilter) {
|
|
83
|
+
ticketsFiltered = ticketsFiltered.filter((ticket) => this.ticketTypeFilter.includes(ticket.type));
|
|
84
|
+
}
|
|
85
|
+
this.currentTickets.space = ticketsFiltered;
|
|
86
|
+
this.ticketTags.next(ticketsFiltered); // tags without zone filter
|
|
87
|
+
if (this.zoneIDFilter) {
|
|
88
|
+
ticketsFiltered = await this.filterService.filterObjectsForZone(ticketsFiltered, this.zoneIDFilter);
|
|
89
|
+
}
|
|
90
|
+
this.currentTickets.zone = ticketsFiltered;
|
|
91
|
+
this.ticketsUpdated.next(this.currentTickets);
|
|
92
|
+
this.updating.next(false);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
this.ticketTags.next(null);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async adaptTicket(ticket) {
|
|
99
|
+
if (ticket.comments.items.length > 0) {
|
|
100
|
+
ticket.comments.items.sort((a, b) => {
|
|
101
|
+
// @ts-ignore
|
|
102
|
+
return new Date(b.createdAt) - new Date(a.createdAt);
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
if (ticket.events.items.length > 0) {
|
|
106
|
+
// Sort events by date
|
|
107
|
+
ticket.events.items.sort((event1, event2) => {
|
|
108
|
+
// @ts-ignore
|
|
109
|
+
return new Date(event2.createdAt) - new Date(event1.createdAt);
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
ticket.prestataire =
|
|
113
|
+
await this.interventionService.getPrestataireForTicket(ticket);
|
|
114
|
+
return ticket;
|
|
115
|
+
}
|
|
116
|
+
getPriorityColor(ticket) {
|
|
117
|
+
switch (ticket.priority) {
|
|
118
|
+
case TicketPriority.MAXIMUM:
|
|
119
|
+
return "crimson";
|
|
120
|
+
case TicketPriority.HIGH:
|
|
121
|
+
return "red";
|
|
122
|
+
case TicketPriority.MEDIUM:
|
|
123
|
+
return "orange";
|
|
124
|
+
case TicketPriority.LOW:
|
|
125
|
+
return "green";
|
|
126
|
+
case TicketPriority.MINIMUM:
|
|
127
|
+
return "blue";
|
|
128
|
+
default:
|
|
129
|
+
return "blue";
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
getStatusColor(ticket) {
|
|
133
|
+
switch (ticket.status) {
|
|
134
|
+
case TicketStatus.TO_BE_PROCESSED:
|
|
135
|
+
return "#B0B0B1";
|
|
136
|
+
case TicketStatus.PLANNED:
|
|
137
|
+
return "#EBDF27";
|
|
138
|
+
case TicketStatus.IN_PROGRESS:
|
|
139
|
+
return "#EBDF27";
|
|
140
|
+
case TicketStatus.WAITING_FOR_VALIDATION:
|
|
141
|
+
return "#EBDF27";
|
|
142
|
+
case TicketStatus.VALIDATED:
|
|
143
|
+
return "#BCE2E5";
|
|
144
|
+
case TicketStatus.REJECTED:
|
|
145
|
+
return "#e84c35";
|
|
146
|
+
case TicketStatus.RESOLVED:
|
|
147
|
+
return "#BCE2E5";
|
|
148
|
+
case TicketStatus.ARCHIVED:
|
|
149
|
+
return "#B0B0B1";
|
|
150
|
+
case TicketStatus.LATE:
|
|
151
|
+
return "#e84c35";
|
|
152
|
+
case TicketStatus.BLOCKED:
|
|
153
|
+
return "#e84c35";
|
|
154
|
+
case TicketStatus.COMPLETED:
|
|
155
|
+
return "#388659";
|
|
156
|
+
case TicketStatus.DELAYED:
|
|
157
|
+
return "#DB7543";
|
|
158
|
+
case TicketStatus.CANCELLED:
|
|
159
|
+
return "#e84c35";
|
|
160
|
+
case TicketStatus.TO_REDO:
|
|
161
|
+
return "#DB7543";
|
|
162
|
+
case TicketStatus.CREATED:
|
|
163
|
+
return "#B0B0B1";
|
|
164
|
+
default:
|
|
165
|
+
return "#BCE2E5";
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
getTicketPriorityNumber(t) {
|
|
169
|
+
return t.priority === TicketPriority.MINIMUM
|
|
170
|
+
? -1
|
|
171
|
+
: t.priority === TicketPriority.LOW
|
|
172
|
+
? 0
|
|
173
|
+
: t.priority === TicketPriority.MEDIUM
|
|
174
|
+
? 1
|
|
175
|
+
: t.priority === TicketPriority.HIGH
|
|
176
|
+
? 2
|
|
177
|
+
: t.priority === TicketPriority.MAXIMUM
|
|
178
|
+
? 3
|
|
179
|
+
: -1;
|
|
180
|
+
}
|
|
181
|
+
getTicketIcon(type) {
|
|
182
|
+
// const typeIcon : TicketType = ticket.type;
|
|
183
|
+
switch (type) {
|
|
184
|
+
case TicketType.REPORTING:
|
|
185
|
+
return this.reportingIcon;
|
|
186
|
+
case TicketType.REQUEST_FOR_INTERVENTION:
|
|
187
|
+
return this.maintenanceIcon;
|
|
188
|
+
case TicketType.REQUEST_FOR_MAINTENANCE:
|
|
189
|
+
return this.maintenanceIcon;
|
|
190
|
+
case TicketType.WORK_ORDER:
|
|
191
|
+
return this.workorderIcon;
|
|
192
|
+
case TicketType.INCIDENT:
|
|
193
|
+
return this.accidentIcon;
|
|
194
|
+
case TicketType.INFORMATION:
|
|
195
|
+
return this.informationIcon;
|
|
196
|
+
default:
|
|
197
|
+
return this.maintenanceIcon;
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
async addEventToTicket(ticket, event) {
|
|
201
|
+
const currentMission = this.userService.currentMission(ticket.spaceID);
|
|
202
|
+
event.group = event.group ? event.group : "default";
|
|
203
|
+
event.ticketID = event.ticketID ? event.ticketID : ticket.id;
|
|
204
|
+
event.status = event.status ? event.status : EventStatus.CREATED;
|
|
205
|
+
event.type = event.type ? event.type : EventType.TICKET;
|
|
206
|
+
event.ownerID = event.ownerID ? event.ownerID : currentMission.id;
|
|
207
|
+
try {
|
|
208
|
+
const receivedEvent = await this.eventService.createEvent(event);
|
|
209
|
+
// console.log('Event successfully created !');
|
|
210
|
+
return receivedEvent;
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
async addTicket(ticket) {
|
|
217
|
+
ticket.status = TicketStatus.CREATED;
|
|
218
|
+
if (!ticket.ownerMissionID) {
|
|
219
|
+
ticket.ownerMissionID = this.userService.currentMission(ticket.spaceID).id;
|
|
220
|
+
}
|
|
221
|
+
// TODO!!! filter missions by space of ticket
|
|
222
|
+
try {
|
|
223
|
+
const receivedTicket = await this.createTicket(ticket);
|
|
224
|
+
// console.log('!!! Response from creating ticket :');
|
|
225
|
+
// console.log(receivedTicket);
|
|
226
|
+
this.addEventToTicket(receivedTicket, {
|
|
227
|
+
title: "Création du ticket",
|
|
228
|
+
description: `Ticket créé par -`,
|
|
229
|
+
translationPath: "ticketEvent.ticket.created",
|
|
230
|
+
});
|
|
231
|
+
this.updateDone.next(true);
|
|
232
|
+
return receivedTicket; // instead of true
|
|
233
|
+
}
|
|
234
|
+
catch (error) {
|
|
235
|
+
console.log("Ticket creation FAILED");
|
|
236
|
+
console.log(JSON.stringify(error));
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
async updateTicketWithEvent(ticket, event) {
|
|
240
|
+
const receivedTicket = await this.updateTicket(ticket);
|
|
241
|
+
if (receivedTicket) {
|
|
242
|
+
console.log("Updated ticket :");
|
|
243
|
+
console.log(receivedTicket);
|
|
244
|
+
if (event) {
|
|
245
|
+
await this.addEventToTicket(receivedTicket, event);
|
|
246
|
+
}
|
|
247
|
+
this.updateDone.next(true);
|
|
248
|
+
}
|
|
249
|
+
return receivedTicket;
|
|
250
|
+
}
|
|
251
|
+
async removeAssigneeFromTicket(ticket, assignee) {
|
|
252
|
+
try {
|
|
253
|
+
const affectation = await this.affectationService.softDeleteAffectationByID(assignee.id);
|
|
254
|
+
if (!affectation) {
|
|
255
|
+
console.warn(`removeAssigneeFromTicket(${ticket.id}, ${assignee.id}) failed`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
catch (error) {
|
|
259
|
+
console.error(error);
|
|
260
|
+
}
|
|
261
|
+
return ticket;
|
|
262
|
+
}
|
|
263
|
+
async updateTicketLocation(ticket, tagData) {
|
|
264
|
+
const poiInput = {
|
|
265
|
+
coordinate: tagData.getCoordinateString(),
|
|
266
|
+
type: PoiType.TICKET,
|
|
267
|
+
elementID: ticket.id,
|
|
268
|
+
metadata: tagData.getMetadataString(),
|
|
269
|
+
matterportSweepID: tagData.getSweepID(),
|
|
270
|
+
};
|
|
271
|
+
const poi = await this.poiService.createPOIForSpaceID(poiInput);
|
|
272
|
+
await this.addEventToTicket(ticket, {
|
|
273
|
+
title: "Changement position du ticket",
|
|
274
|
+
description: "Le point d'intérêt du ticket a été modifié",
|
|
275
|
+
status: EventStatus.POSITION_SET,
|
|
276
|
+
translationPath: "ticketEvent.position.set",
|
|
277
|
+
});
|
|
278
|
+
return poi;
|
|
279
|
+
}
|
|
280
|
+
async updateStatusOfTicket(ticket, status) {
|
|
281
|
+
const currentStatus = ticket.status;
|
|
282
|
+
const oldTicketStatus = ticket.status;
|
|
283
|
+
ticket.status = status;
|
|
284
|
+
if (currentStatus === status) {
|
|
285
|
+
return ticket;
|
|
286
|
+
}
|
|
287
|
+
console.log("Updating status");
|
|
288
|
+
return this.updateTicket({
|
|
289
|
+
id: ticket.id,
|
|
290
|
+
status,
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
async updateTypeOfTicket(ticket, type) {
|
|
294
|
+
const previousType = ticket.type;
|
|
295
|
+
ticket.type = type;
|
|
296
|
+
await this.updateTicketWithEvent({ id: ticket.id, type: ticket.type }, {
|
|
297
|
+
title: "Type changé",
|
|
298
|
+
description: `Changement de ${previousType} vers ${ticket.type}`,
|
|
299
|
+
metadata: JSON.stringify({ type: ticket.type }),
|
|
300
|
+
translationPath: "ticketEvent.ticket.type",
|
|
301
|
+
});
|
|
302
|
+
return ticket;
|
|
303
|
+
}
|
|
304
|
+
async getTicketsForUserForSpace(spaceID) {
|
|
305
|
+
const ticketsSpace = await this.getTicketsBySpace(spaceID);
|
|
306
|
+
return this.filterService.filterTicketsForCurrentUserInSpace(ticketsSpace, spaceID);
|
|
307
|
+
}
|
|
308
|
+
/** Basic CRUD operations */
|
|
309
|
+
async readTicket(id) {
|
|
310
|
+
return this.API.__proto__.GetTicket(id);
|
|
311
|
+
}
|
|
312
|
+
async createTicket(input) {
|
|
313
|
+
return this.API.__proto__.CreateTicket(input);
|
|
314
|
+
}
|
|
315
|
+
async updateTicket(input) {
|
|
316
|
+
return this.API.__proto__.UpdateTicket(input);
|
|
317
|
+
}
|
|
318
|
+
async deleteTicket(ticket) {
|
|
319
|
+
const deleted = await this.API.__proto__.DeleteTicket({ id: ticket.id });
|
|
320
|
+
// delete POI
|
|
321
|
+
const poi = await this.poiService.getPoiByElementId(ticket.id);
|
|
322
|
+
if (poi) {
|
|
323
|
+
this.poiService.deletePoi(poi.id);
|
|
324
|
+
}
|
|
325
|
+
// clean parentID
|
|
326
|
+
if (ticket.children.items.length > 0) {
|
|
327
|
+
ticket.children.items.map(async (childTicket) => {
|
|
328
|
+
try {
|
|
329
|
+
await this.API.__proto__.UpdateTicket({
|
|
330
|
+
id: childTicket.id,
|
|
331
|
+
parentID: null,
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
catch {
|
|
335
|
+
console.warn("Could not update ticket", childTicket.id);
|
|
336
|
+
}
|
|
337
|
+
await this.API.__proto__.CreateEvent({
|
|
338
|
+
title: "Ticket parent supprimé",
|
|
339
|
+
ticketID: childTicket.id,
|
|
340
|
+
description: `Ticket \"$ticket.title}\" a été supprimé`,
|
|
341
|
+
});
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
// delete events
|
|
345
|
+
await Promise.all(ticket.events.items.map(async (event_) => {
|
|
346
|
+
await this.API.__proto__.DeleteEvent({ id: event_.id });
|
|
347
|
+
}));
|
|
348
|
+
// delete affectationns
|
|
349
|
+
if (ticket.assignees.items.length > 0) {
|
|
350
|
+
for (const element of ticket.assignees.items) {
|
|
351
|
+
this.API.__proto__.DeleteAffectation({ id: element.id });
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
// delete comments
|
|
355
|
+
await Promise.all(ticket.comments.items.map(async (comment) => {
|
|
356
|
+
await this.API.__proto__.DeleteComment({ id: comment.id });
|
|
357
|
+
}));
|
|
358
|
+
await this.operationService.deleteOperationsForTicket(ticket.id);
|
|
359
|
+
return deleted;
|
|
360
|
+
}
|
|
361
|
+
/** Custom requests */
|
|
362
|
+
async getTicketsBySpace(spaceID) {
|
|
363
|
+
return this.API.__proto__.TicketsBySpace(spaceID).then((tickets) => tickets.items);
|
|
364
|
+
}
|
|
365
|
+
async updateIconForAllTicketsInSpace(tagIcon, spaceID) {
|
|
366
|
+
const tickets = await this.getTicketsBySpace(spaceID);
|
|
367
|
+
const pois = await this.updateIconForAllObjects(tickets, tagIcon);
|
|
368
|
+
return { tickets, pois };
|
|
369
|
+
}
|
|
370
|
+
/** Archive related */
|
|
371
|
+
/** Return true if the current user has archived this ticket */
|
|
372
|
+
isArchived(ticket) {
|
|
373
|
+
return ticket.archivedForMissionID
|
|
374
|
+
? ticket.archivedForMissionID.includes(this.userService.currentMission(ticket.spaceID).id)
|
|
375
|
+
: false;
|
|
376
|
+
}
|
|
377
|
+
setArchived(ticket, archived) {
|
|
378
|
+
let archivedList = ticket.archivedForMissionID
|
|
379
|
+
? ticket.archivedForMissionID
|
|
380
|
+
: [];
|
|
381
|
+
const missionID = this.userService.currentMission(ticket.spaceID).id;
|
|
382
|
+
archivedList = archivedList.filter((m) => m !== missionID);
|
|
383
|
+
if (archived) {
|
|
384
|
+
archivedList.push(missionID);
|
|
385
|
+
}
|
|
386
|
+
return this.updateTicketWithEvent({
|
|
387
|
+
id: ticket.id,
|
|
388
|
+
archivedForMissionID: archivedList,
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
async navigateToTicketIn3D(ticket, forceSwitchVisit = false) {
|
|
392
|
+
let url = `visit/${ticket.spaceID}`;
|
|
393
|
+
if (forceSwitchVisit) {
|
|
394
|
+
url += `/detail/${ticket.id}`;
|
|
395
|
+
}
|
|
396
|
+
const canGoToTag = await this.viewerService.action_move_to_tag(`${ticket.id}`);
|
|
397
|
+
if (canGoToTag) {
|
|
398
|
+
return;
|
|
399
|
+
}
|
|
400
|
+
const result = await this.getModel3dAndSweep(ticket);
|
|
401
|
+
if (!result || !result.model3D) {
|
|
402
|
+
alert("Error while getting virtual visit model");
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
if (!forceSwitchVisit) {
|
|
406
|
+
/** Si on ne force pas la visite, on demande si on veut etre switch */
|
|
407
|
+
openModalForVisitSwitch(this.modalService, result.model3D, ticket.spaceID, { sweepToMove: result.sweep, rotation: result.rotation });
|
|
408
|
+
}
|
|
409
|
+
else {
|
|
410
|
+
/** Si on force le switch de la visit */
|
|
411
|
+
window.open(`${url}?model3D=${result.model3D}&sweep=true`, "_blank");
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
initSubscriptions() {
|
|
415
|
+
if (!this.isMuseumUser) {
|
|
416
|
+
this.navSubscription = this.navigatorService.zoneChange.subscribe((zone) => {
|
|
417
|
+
this.currentSpaceID = this.navigatorService.currentSpaceID;
|
|
418
|
+
if (!this.currentSpaceID) {
|
|
419
|
+
this.ticketTags.next(null);
|
|
420
|
+
this.ticketsUpdated.next({ space: [], zone: null });
|
|
421
|
+
this.ticketTypeFilter = null;
|
|
422
|
+
this.zoneIDFilter = null;
|
|
423
|
+
}
|
|
424
|
+
else if (zone.id !== this.zoneIDFilter) {
|
|
425
|
+
this.zoneIDFilter = zone.id;
|
|
426
|
+
// console.log("going to init tickets from zone");
|
|
427
|
+
this.initTickets();
|
|
428
|
+
}
|
|
429
|
+
});
|
|
430
|
+
this.filetrSubscription = this.filterService.subscribeToDataFilterUpdate((dateRange) => {
|
|
431
|
+
this.dateFilter = dateRange;
|
|
432
|
+
this.initTickets();
|
|
433
|
+
});
|
|
434
|
+
this.dateFilter = this.filterService.currentDateFilter;
|
|
435
|
+
this.updateDone.subscribe(() => {
|
|
436
|
+
if (this.currentSpaceID) {
|
|
437
|
+
this.initTickets();
|
|
438
|
+
}
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
TicketsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: TicketsService, deps: [{ token: 'currentAPIService' }, { token: i1.OperationService }, { token: i2.EventService }, { token: i3.AffectationService }, { token: i4.PoiService }, { token: i5.BaseUserService }, { token: i6.NavigatorService }, { token: i7.FilterService }, { token: i8.InterventionService }, { token: i9.NavigationService }, { token: i10.ViewerService }, { token: i11.NgbModal }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
444
|
+
TicketsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: TicketsService, providedIn: "root" });
|
|
445
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.7", ngImport: i0, type: TicketsService, decorators: [{
|
|
446
|
+
type: Injectable,
|
|
447
|
+
args: [{
|
|
448
|
+
providedIn: "root",
|
|
449
|
+
}]
|
|
450
|
+
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
|
|
451
|
+
type: Inject,
|
|
452
|
+
args: ['currentAPIService']
|
|
453
|
+
}] }, { type: i1.OperationService }, { type: i2.EventService }, { type: i3.AffectationService }, { type: i4.PoiService }, { type: i5.BaseUserService }, { type: i6.NavigatorService }, { type: i7.FilterService }, { type: i8.InterventionService }, { type: i9.NavigationService }, { type: i10.ViewerService }, { type: i11.NgbModal }]; } });
|
|
454
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtc21hcnRlcnBsYW4tY29yZS9zcmMvbGliL3NlcnZpY2VzL21vZGVscy90aWNrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0Msc0NBQXNDO0FBQ3RDLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxPQUFPLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQzdDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWhFLE9BQU8sRUFBaUIsVUFBVSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBb0IsT0FBTyxFQUFXLE1BQU0scUJBQXFCLENBQUM7QUFLMUosT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFJMUQsT0FBTyxlQUFlLE1BQU0sd0NBQXdDLENBQUM7QUFDckUsT0FBTyxZQUFZLE1BQU0sMEJBQTBCLENBQUM7QUFDcEQsT0FBTyxhQUFhLE1BQU0scUNBQXFDLENBQUM7QUFDaEUsT0FBTyxhQUFhLE1BQU0sMENBQTBDLENBQUM7QUFDckUsT0FBTyxlQUFlLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFTdkQsTUFBTSxPQUFPLGNBQWUsU0FBUSxpQkFBaUI7SUE2Q2pELFlBQ2lDLFdBQWdCLEVBQ3JDLGdCQUFrQyxFQUNsQyxZQUEwQixFQUMxQixrQkFBc0MsRUFDOUMsVUFBc0IsRUFDZCxXQUE0QixFQUM1QixnQkFBa0MsRUFDbEMsYUFBNEIsRUFDNUIsbUJBQXdDLEVBQ2hELGlCQUFvQyxFQUM1QixhQUE0QixFQUM1QixZQUFzQjtRQUU5QixLQUFLLENBQUMsVUFBVSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFaN0Is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QVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQzNCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtvQkFDckIsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2lCQUN0QjtZQUNMLENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDOzsyR0F4aEJRLGNBQWMsa0JBOENYLG1CQUFtQjsrR0E5Q3RCLGNBQWMsY0FGWCxNQUFNOzJGQUVULGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCOzswQkErQ1EsTUFBTTsyQkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzICovXHJcbi8qIGVzbGludC1kaXNhYmxlIGNvbnNpc3RlbnQtcmV0dXJuICovXHJcbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IE5nYk1vZGFsIH0gZnJvbSBcIkBuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXCI7XHJcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7IG9wZW5Nb2RhbEZvclZpc2l0U3dpdGNoIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNYXR0ZXJ0YWdEYXRhIH0gZnJvbSBcIi4uLy4uL21hdHRlcnRhZ0RhdGFcIjtcclxuaW1wb3J0IHsgRXZlbnQsIFRpY2tldCwgVGlja2V0VHlwZSwgVGlja2V0UHJpb3JpdHksIFRpY2tldFN0YXR1cywgRXZlbnRTdGF0dXMsIEV2ZW50VHlwZSwgQWZmZWN0YXRpb24sIFBPSSwgUG9pVHlwZSwgSVVwZGF0ZSB9IGZyb20gXCIuLi8uLi90eXBlcy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tIFwiLi4vZmlsdGVyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgTmF2aWdhdG9yU2VydmljZSB9IGZyb20gXCIuLi9uYXZpZ2F0b3Iuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBCYXNlVXNlclNlcnZpY2UgfSBmcm9tIFwiLi4vdXNlci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFZpZXdlclNlcnZpY2UgfSBmcm9tIFwiLi4vdmlld2VyLnNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQmFzZU9iamVjdFNlcnZpY2UgfSBmcm9tIFwiLi9iYXNlLW9iamVjdC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE5hdmlnYXRpb25TZXJ2aWNlIH0gZnJvbSBcIi4vbmF2aWdhdGlvbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE9wZXJhdGlvblNlcnZpY2UgfSBmcm9tIFwiLi9vcGVyYXRpb24uc2VydmljZVwiO1xyXG5pbXBvcnQgeyBQb2lTZXJ2aWNlIH0gZnJvbSBcIi4vcG9pLnNlcnZpY2VcIjtcclxuaW1wb3J0IEluZm9ybWF0aW9uSWNvbiBmcm9tIFwiQGljb25pZnktaWNvbnMvbWRpL2luZm9ybWF0aW9uLW91dGxpbmVcIjtcclxuaW1wb3J0IEFjY2lkZW50SWNvbiBmcm9tIFwiQGljb25pZnktaWNvbnMvbWRpL2FsZXJ0XCI7XHJcbmltcG9ydCBXb3JkT3JkZXJJY29uIGZyb20gXCJAaWNvbmlmeS1pY29ucy9tZGkvYWNjb3VudC1oYXJkLWhhdFwiO1xyXG5pbXBvcnQgUmVwb3J0aW5nSWNvbiBmcm9tIFwiQGljb25pZnktaWNvbnMvbWRpL2ZpbGUtZG9jdW1lbnQtb3V0bGluZVwiO1xyXG5pbXBvcnQgTWFpbnRlbmFuY2VJY29uIGZyb20gXCJAaWNvbmlmeS1pY29ucy9tZGkvdG9vbHNcIjtcclxuaW1wb3J0IHsgRXZlbnRTZXJ2aWNlIH0gZnJvbSBcIi4vZXZlbnQuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBJbnRlcnZlbnRpb25TZXJ2aWNlIH0gZnJvbSBcIi4uL2ludGVydmVudGlvbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEFmZmVjdGF0aW9uU2VydmljZSB9IGZyb20gXCIuL2FmZmVjdGF0aW9uLnNlcnZpY2VcIjtcclxuXHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIFRpY2tldHNTZXJ2aWNlIGV4dGVuZHMgQmFzZU9iamVjdFNlcnZpY2Uge1xyXG4gICAgY3VycmVudFRpY2tldHM6IHsgem9uZTogVGlja2V0W107IHNwYWNlOiBUaWNrZXRbXSB9ID0ge1xyXG4gICAgICAgIHpvbmU6IFtdLFxyXG4gICAgICAgIHNwYWNlOiBbXSxcclxuICAgIH07XHJcblxyXG4gICAgdGlja2V0VGFnczogU3ViamVjdDxUaWNrZXRbXT4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICAgIHRpY2tldHNGaWx0ZXJlZDogVGlja2V0W10gPSBbXTtcclxuXHJcbiAgICB0aWNrZXRzVXBkYXRlZDogU3ViamVjdDx7XHJcbiAgICAgICAgem9uZTogVGlja2V0W107XHJcbiAgICAgICAgc3BhY2U6IFRpY2tldFtdO1xyXG4gICAgfT4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICAgIGN1cnJlbnRTcGFjZUlEOiBzdHJpbmc7XHJcblxyXG4gICAgem9uZUlERmlsdGVyOiBzdHJpbmc7XHJcblxyXG4gICAgZGF0ZUZpbHRlcjogRGF0ZVtdO1xyXG5cclxuICAgIHRpY2tldFR5cGVGaWx0ZXI6IFRpY2tldFR5cGVbXTtcclxuXHJcbiAgICByZXBvcnRpbmdJY29uID0gUmVwb3J0aW5nSWNvbjtcclxuXHJcbiAgICBtYWludGVuYW5jZUljb24gPSBNYWludGVuYW5jZUljb247XHJcblxyXG4gICAgd29ya29yZGVySWNvbiA9IFdvcmRPcmRlckljb247XHJcblxyXG4gICAgaW5mb3JtYXRpb25JY29uID0gSW5mb3JtYXRpb25JY29uO1xyXG5cclxuICAgIGFjY2lkZW50SWNvbiA9IEFjY2lkZW50SWNvbjtcclxuXHJcbiAgICB1cGRhdGVEb25lOiBTdWJqZWN0PGJvb2xlYW4+ID0gbmV3IFN1YmplY3QoKTtcclxuXHJcbiAgICB1cGRhdGluZzogU3ViamVjdDxib29sZWFuPiA9IG5ldyBTdWJqZWN0KCk7XHJcblxyXG4gICAgQVBJOiBhbnk7XHJcblxyXG4gICAgaXNNdXNldW1Vc2VyID0gZmFsc2U7XHJcblxyXG4gICAgbmF2U3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gICAgZmlsZXRyU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgQEluamVjdCgnY3VycmVudEFQSVNlcnZpY2UnKSBhcGlJbmplY3RlZDogYW55LFxyXG4gICAgICAgIHByaXZhdGUgb3BlcmF0aW9uU2VydmljZTogT3BlcmF0aW9uU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGV2ZW50U2VydmljZTogRXZlbnRTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgYWZmZWN0YXRpb25TZXJ2aWNlOiBBZmZlY3RhdGlvblNlcnZpY2UsXHJcbiAgICAgICAgcG9pU2VydmljZTogUG9pU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBCYXNlVXNlclNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBuYXZpZ2F0b3JTZXJ2aWNlOiBOYXZpZ2F0b3JTZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgZmlsdGVyU2VydmljZTogRmlsdGVyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGludGVydmVudGlvblNlcnZpY2U6IEludGVydmVudGlvblNlcnZpY2UsXHJcbiAgICAgICAgbmF2aWdhdGlvblNlcnZpY2U6IE5hdmlnYXRpb25TZXJ2aWNlLFxyXG4gICAgICAgIHByaXZhdGUgdmlld2VyU2VydmljZTogVmlld2VyU2VydmljZSxcclxuICAgICAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTmdiTW9kYWwsXHJcbiAgICApIHtcclxuICAgICAgICBzdXBlcihwb2lTZXJ2aWNlLCBuYXZpZ2F0aW9uU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5BUEkgPSBhcGlJbmplY3RlZDtcclxuICAgICAgICB0aGlzLmlzTXVzZXVtVXNlciA9IHRoaXMudXNlclNlcnZpY2UuaGFzT25seU11c2V1bVJvbGUoKTtcclxuICAgICAgICB0aGlzLmluaXRTdWJzY3JpcHRpb25zKCk7XHJcbiAgICAgICAgdGhpcy51c2VyU2VydmljZS5pc0NoYW5nZWQuc3Vic2NyaWJlKChpc0Nvbm5lY3RlZCkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoaXNDb25uZWN0ZWQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaXNNdXNldW1Vc2VyID0gdGhpcy51c2VyU2VydmljZS5oYXNPbmx5TXVzZXVtUm9sZSgpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0U3Vic2NyaXB0aW9ucygpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubmF2U3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpbGV0clN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgaW5pdFRpY2tldHMoKSB7XHJcbiAgICAgICAgbGV0IHRpY2tldHNGaWx0ZXJlZCA9IFtdO1xyXG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRTcGFjZUlEKSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRpbmcubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5nZXRUaWNrZXRzQnlTcGFjZSh0aGlzLmN1cnJlbnRTcGFjZUlEKS50aGVuKFxyXG4gICAgICAgICAgICAgICAgKHRpY2tldHMpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGlja2V0cykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aWNrZXRzRmlsdGVyZWQgPSB0aWNrZXRzO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIHRpY2tldHNGaWx0ZXJlZCA9XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLmZpbHRlclNlcnZpY2UuZmlsdGVyVGlja2V0c0ZvckN1cnJlbnRVc2VySW5TcGFjZShcclxuICAgICAgICAgICAgICAgICAgICB0aWNrZXRzRmlsdGVyZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U3BhY2VJRCxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGVGaWx0ZXIpIHtcclxuICAgICAgICAgICAgICAgIHRpY2tldHNGaWx0ZXJlZCA9IHRoaXMuZmlsdGVyU2VydmljZS5maWx0ZXJPYmplY3RzRm9yRGF0ZVJhbmdlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRpY2tldHNGaWx0ZXJlZCxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVGaWx0ZXIsXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRpY2tldFR5cGVGaWx0ZXIpIHtcclxuICAgICAgICAgICAgICAgIHRpY2tldHNGaWx0ZXJlZCA9IHRpY2tldHNGaWx0ZXJlZC5maWx0ZXIoKHRpY2tldCkgPT5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpY2tldFR5cGVGaWx0ZXIuaW5jbHVkZXModGlja2V0LnR5cGUpLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRUaWNrZXRzLnNwYWNlID0gdGlja2V0c0ZpbHRlcmVkO1xyXG4gICAgICAgICAgICB0aGlzLnRpY2tldFRhZ3MubmV4dCh0aWNrZXRzRmlsdGVyZWQpOyAvLyB0YWdzIHdpdGhvdXQgem9uZSBmaWx0ZXJcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnpvbmVJREZpbHRlcikge1xyXG4gICAgICAgICAgICAgICAgdGlja2V0c0ZpbHRlcmVkID0gYXdhaXQgdGhpcy5maWx0ZXJTZXJ2aWNlLmZpbHRlck9iamVjdHNGb3Jab25lKFxyXG4gICAgICAgICAgICAgICAgICAgIHRpY2tldHNGaWx0ZXJlZCxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnpvbmVJREZpbHRlcixcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5jdXJyZW50VGlja2V0cy56b25lID0gdGlja2V0c0ZpbHRlcmVkO1xyXG4gICAgICAgICAgICB0aGlzLnRpY2tldHNVcGRhdGVkLm5leHQodGhpcy5jdXJyZW50VGlja2V0cyk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRpbmcubmV4dChmYWxzZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50aWNrZXRUYWdzLm5leHQobnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGFkYXB0VGlja2V0KHRpY2tldDogVGlja2V0KTogUHJvbWlzZTxUaWNrZXQ+IHtcclxuICAgICAgICBpZiAodGlja2V0LmNvbW1lbnRzLml0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGlja2V0LmNvbW1lbnRzLml0ZW1zLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShiLmNyZWF0ZWRBdCkgLSBuZXcgRGF0ZShhLmNyZWF0ZWRBdCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRpY2tldC5ldmVudHMuaXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAvLyBTb3J0IGV2ZW50cyBieSBkYXRlXHJcbiAgICAgICAgICAgIHRpY2tldC5ldmVudHMuaXRlbXMuc29ydCgoZXZlbnQxLCBldmVudDIpID0+IHtcclxuICAgICAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShldmVudDIuY3JlYXRlZEF0KSAtIG5ldyBEYXRlKGV2ZW50MS5jcmVhdGVkQXQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGlja2V0LnByZXN0YXRhaXJlID1cclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5pbnRlcnZlbnRpb25TZXJ2aWNlLmdldFByZXN0YXRhaXJlRm9yVGlja2V0KHRpY2tldCk7XHJcbiAgICAgICAgcmV0dXJuIHRpY2tldDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcmlvcml0eUNvbG9yKHRpY2tldDogVGlja2V0KTogc3RyaW5nIHtcclxuICAgICAgICBzd2l0Y2ggKHRpY2tldC5wcmlvcml0eSkge1xyXG4gICAgICAgICAgICBjYXNlIFRpY2tldFByaW9yaXR5Lk1BWElNVU06XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJjcmltc29uXCI7XHJcbiAgICAgICAgICAgIGNhc2UgVGlja2V0UHJpb3JpdHkuSElHSDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcInJlZFwiO1xyXG4gICAgICAgICAgICBjYXNlIFRpY2tldFByaW9yaXR5Lk1FRElVTTpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIm9yYW5nZVwiO1xyXG4gICAgICAgICAgICBjYXNlIFRpY2tldFByaW9yaXR5LkxPVzpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcImdyZWVuXCI7XHJcbiAgICAgICAgICAgIGNhc2UgVGlja2V0UHJpb3JpdHkuTUlOSU1VTTpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcImJsdWVcIjtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcImJsdWVcIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3RhdHVzQ29sb3IodGlja2V0OiBUaWNrZXQpOiBzdHJpbmcge1xyXG4gICAgICAgIHN3aXRjaCAodGlja2V0LnN0YXR1cykge1xyXG4gICAgICAgICAgICBjYXNlIFRpY2tldFN0YXR1cy5UT19CRV9QUk9DRVNTRUQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCIjQjBCMEIxXCI7XHJcbiAgICAgICAgICAgIGNhc2UgVGlja2V0U3RhdHVzLlBMQU5ORUQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCIjRUJERjI3XCI7XHJcbiAgICAgICAgICAgIGNhc2UgVGlja2V0U3RhdHVzLklOX1BST0dSRVNTOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiI0VCREYyN1wiO1xyXG4gICAgICAgICAgICBjYXNlIFRpY2tldFN0YXR1cy5XQUlUSU5HX0ZPUl9WQUxJREFUSU9OOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiI0VCREYyN1wiO1xyXG4gICAgICAgICAgICBjYXNlIFRpY2tldFN0YXR1cy5WQUxJREFURUQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCIjQkNFMkU1XCI7XHJcbiAgICAgICAgICAgIGNhc2UgVGlja2V0U3RhdHVzLlJFSkVDVEVEOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiI2U4NGMzNVwiO1xyXG4gICAgICAgICAgICBjYXNlIFRpY2tldFN0YXR1cy5SRVNPTFZFRDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIiNCQ0UyRTVcIjtcclxuICAgICAgICAgICAgY2FzZSBUaWNrZXRTdGF0dXMuQVJDSElWRUQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCIjQjBCMEIxXCI7XHJcbiAgICAgICAgICAgIGNhc2UgVGlja2V0U3RhdHVzLkxBVEU6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCIjZTg0YzM1XCI7XHJcbiAgICAgICAgICAgIGNhc2UgVGlja2V0U3RhdHVzLkJMT0NLRUQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gXCIjZTg0YzM1XCI7XHJcbiAgICAgICAgICAgIGNhc2UgVGlja2V0U3RhdHVzLkNPTVBMRVRFRDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIiMzODg2NTlcIjtcclxuICAgICAgICAgICAgY2FzZSBUaWNrZXRTdGF0dXMuREVMQVlFRDpcclxuICAgICAgICAgICAgICAgIHJldHVybiBcIiNEQjc1NDNcIjtcclxuICAgICAgICAgICAgY2FzZSBUaWNrZXRTdGF0dXMuQ0FOQ0VMTEVEOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiI2U4NGMzNVwiO1xyXG4gICAgICAgICAgICBjYXNlIFRpY2tldFN0YXR1cy5UT19SRURPOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiI0RCNzU0M1wiO1xyXG4gICAgICAgICAgICBjYXNlIFRpY2tldFN0YXR1cy5DUkVBVEVEOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiI0IwQjBCMVwiO1xyXG4gICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIFwiI0JDRTJFNVwiO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRUaWNrZXRQcmlvcml0eU51bWJlcih0KTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdC5wcmlvcml0eSA9PT0gVGlja2V0UHJpb3JpdHkuTUlOSU1VTVxyXG4gICAgICAgICAgICA/IC0xXHJcbiAgICAgICAgICAgIDogdC5wcmlvcml0eSA9PT0gVGlja2V0UHJpb3JpdHkuTE9XXHJcbiAgICAgICAgICAgID8gMFxyXG4gICAgICAgICAgICA6IHQucHJpb3JpdHkgPT09IFRpY2tldFByaW9yaXR5Lk1FRElVTVxyXG4gICAgICAgICAgICA/IDFcclxuICAgICAgICAgICAgOiB0LnByaW9yaXR5ID09PSBUaWNrZXRQcmlvcml0eS5ISUdIXHJcbiAgICAgICAgICAgID8gMlxyXG4gICAgICAgICAgICA6IHQucHJpb3JpdHkgPT09IFRpY2tldFByaW9yaXR5Lk1BWElNVU1cclxuICAgICAgICAgICAgPyAzXHJcbiAgICAgICAgICAgIDogLTE7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VGlja2V0SWNvbih0eXBlOiBUaWNrZXRUeXBlKTogYW55IHtcclxuICAgICAgICAvLyBjb25zdCB0eXBlSWNvbiA6IFRpY2tldFR5cGUgPSB0aWNrZXQudHlwZTtcclxuICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSBUaWNrZXRUeXBlLlJFUE9SVElORzpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcG9ydGluZ0ljb247XHJcbiAgICAgICAgICAgIGNhc2UgVGlja2V0VHlwZS5SRVFVRVNUX0ZPUl9JTlRFUlZFTlRJT046XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYWludGVuYW5jZUljb247XHJcbiAgICAgICAgICAgIGNhc2UgVGlja2V0VHlwZS5SRVFVRVNUX0ZPUl9NQUlOVEVOQU5DRTpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1haW50ZW5hbmNlSWNvbjtcclxuICAgICAgICAgICAgY2FzZSBUaWNrZXRUeXBlLldPUktfT1JERVI6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy53b3Jrb3JkZXJJY29uO1xyXG4gICAgICAgICAgICBjYXNlIFRpY2tldFR5cGUuSU5DSURFTlQ6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hY2NpZGVudEljb247XHJcbiAgICAgICAgICAgIGNhc2UgVGlja2V0VHlwZS5JTkZPUk1BVElPTjpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmluZm9ybWF0aW9uSWNvbjtcclxuICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm1haW50ZW5hbmNlSWNvbjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgYWRkRXZlbnRUb1RpY2tldCh0aWNrZXQ6IFRpY2tldCwgZXZlbnQ6IEV2ZW50KTogUHJvbWlzZTxFdmVudD4ge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRNaXNzaW9uID0gdGhpcy51c2VyU2VydmljZS5jdXJyZW50TWlzc2lvbih0aWNrZXQuc3BhY2VJRCk7XHJcbiAgICAgICAgZXZlbnQuZ3JvdXAgPSBldmVudC5ncm91cCA/IGV2ZW50Lmdyb3VwIDogXCJkZWZhdWx0XCI7XHJcbiAgICAgICAgZXZlbnQudGlja2V0SUQgPSBldmVudC50aWNrZXRJRCA/IGV2ZW50LnRpY2tldElEIDogdGlja2V0LmlkO1xyXG4gICAgICAgIGV2ZW50LnN0YXR1cyA9IGV2ZW50LnN0YXR1cyA/IGV2ZW50LnN0YXR1cyA6IEV2ZW50U3RhdHVzLkNSRUFURUQ7XHJcbiAgICAgICAgZXZlbnQudHlwZSA9IGV2ZW50LnR5cGUgPyBldmVudC50eXBlIDogRXZlbnRUeXBlLlRJQ0tFVDtcclxuICAgICAgICBldmVudC5vd25lcklEID0gZXZlbnQub3duZXJJRCA/IGV2ZW50Lm93bmVySUQgOiBjdXJyZW50TWlzc2lvbi5pZDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCByZWNlaXZlZEV2ZW50ID0gYXdhaXQgdGhpcy5ldmVudFNlcnZpY2UuY3JlYXRlRXZlbnQoZXZlbnQpO1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnRXZlbnQgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgIScpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVjZWl2ZWRFdmVudDtcclxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgYWRkVGlja2V0KHRpY2tldDogVGlja2V0KTogUHJvbWlzZTxUaWNrZXQgfCB2b2lkPiB7XHJcbiAgICAgICAgdGlja2V0LnN0YXR1cyA9IFRpY2tldFN0YXR1cy5DUkVBVEVEO1xyXG4gICAgICAgIGlmICghdGlja2V0Lm93bmVyTWlzc2lvbklEKSB7XHJcbiAgICAgICAgICAgIHRpY2tldC5vd25lck1pc3Npb25JRCA9IHRoaXMudXNlclNlcnZpY2UuY3VycmVudE1pc3Npb24oXHJcbiAgICAgICAgICAgICAgICB0aWNrZXQuc3BhY2VJRCxcclxuICAgICAgICAgICAgKS5pZDtcclxuICAgICAgICB9XHJcbiAgICAgICAgLy8gVE9ETyEhISBmaWx0ZXIgbWlzc2lvbnMgYnkgc3BhY2Ugb2YgdGlja2V0XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgcmVjZWl2ZWRUaWNrZXQgPSBhd2FpdCB0aGlzLmNyZWF0ZVRpY2tldCh0aWNrZXQpO1xyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnISEhIFJlc3BvbnNlIGZyb20gY3JlYXRpbmcgdGlja2V0IDonKTtcclxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVjZWl2ZWRUaWNrZXQpO1xyXG4gICAgICAgICAgICB0aGlzLmFkZEV2ZW50VG9UaWNrZXQocmVjZWl2ZWRUaWNrZXQsIHtcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBcIkNyw6lhdGlvbiBkdSB0aWNrZXRcIixcclxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgVGlja2V0IGNyw6nDqSBwYXIgLWAsXHJcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGlvblBhdGg6IFwidGlja2V0RXZlbnQudGlja2V0LmNyZWF0ZWRcIixcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9uZS5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgICByZXR1cm4gcmVjZWl2ZWRUaWNrZXQ7IC8vIGluc3RlYWQgb2YgdHJ1ZVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVGlja2V0IGNyZWF0aW9uIEZBSUxFRFwiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdXBkYXRlVGlja2V0V2l0aEV2ZW50KFxyXG4gICAgICAgIHRpY2tldDogSVVwZGF0ZSAmIFBhcnRpYWw8VGlja2V0PixcclxuICAgICAgICBldmVudD86IEV2ZW50LFxyXG4gICAgKTogUHJvbWlzZTxUaWNrZXQ+IHtcclxuICAgICAgICBjb25zdCByZWNlaXZlZFRpY2tldCA9IGF3YWl0IHRoaXMudXBkYXRlVGlja2V0KHRpY2tldCk7XHJcbiAgICAgICAgaWYgKHJlY2VpdmVkVGlja2V0KSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVXBkYXRlZCB0aWNrZXQgOlwiKTtcclxuICAgICAgICAgICAgY29uc29sZS5sb2cocmVjZWl2ZWRUaWNrZXQpO1xyXG4gICAgICAgICAgICBpZiAoZXZlbnQpIHtcclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuYWRkRXZlbnRUb1RpY2tldChyZWNlaXZlZFRpY2tldCwgZXZlbnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9uZS5uZXh0KHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVjZWl2ZWRUaWNrZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgcmVtb3ZlQXNzaWduZWVGcm9tVGlja2V0KFxyXG4gICAgICAgIHRpY2tldDogVGlja2V0LFxyXG4gICAgICAgIGFzc2lnbmVlOiBBZmZlY3RhdGlvbixcclxuICAgICk6IFByb21pc2U8VGlja2V0PiB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgY29uc3QgYWZmZWN0YXRpb24gPVxyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5hZmZlY3RhdGlvblNlcnZpY2Uuc29mdERlbGV0ZUFmZmVjdGF0aW9uQnlJRChcclxuICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZS5pZCxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGlmICghYWZmZWN0YXRpb24pIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgICAgICAgICAgICBgcmVtb3ZlQXNzaWduZWVGcm9tVGlja2V0KCR7dGlja2V0LmlkfSwgJHthc3NpZ25lZS5pZH0pIGZhaWxlZGAsXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aWNrZXQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdXBkYXRlVGlja2V0TG9jYXRpb24oXHJcbiAgICAgICAgdGlja2V0OiBUaWNrZXQsXHJcbiAgICAgICAgdGFnRGF0YTogTWF0dGVydGFnRGF0YVxyXG4gICAgKTogUHJvbWlzZTxQT0k+IHtcclxuICAgICAgICBjb25zdCBwb2lJbnB1dCA9IHtcclxuICAgICAgICAgICAgY29vcmRpbmF0ZTogdGFnRGF0YS5nZXRDb29yZGluYXRlU3RyaW5nKCksXHJcbiAgICAgICAgICAgIHR5cGU6IFBvaVR5cGUuVElDS0VULFxyXG4gICAgICAgICAgICBlbGVtZW50SUQ6IHRpY2tldC5pZCxcclxuICAgICAgICAgICAgbWV0YWRhdGE6IHRhZ0RhdGEuZ2V0TWV0YWRhdGFTdHJpbmcoKSxcclxuICAgICAgICAgICAgbWF0dGVycG9ydFN3ZWVwSUQ6IHRhZ0RhdGEuZ2V0U3dlZXBJRCgpLFxyXG4gICAgICAgIH0gYXMgUE9JO1xyXG4gICAgICAgIGNvbnN0IHBvaSA9IGF3YWl0IHRoaXMucG9pU2VydmljZS5jcmVhdGVQT0lGb3JTcGFjZUlEKHBvaUlucHV0KTtcclxuICAgICAgICBhd2FpdCB0aGlzLmFkZEV2ZW50VG9UaWNrZXQodGlja2V0LCB7XHJcbiAgICAgICAgICAgIHRpdGxlOiBcIkNoYW5nZW1lbnQgcG9zaXRpb24gZHUgdGlja2V0XCIsXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkxlIHBvaW50IGQnaW50w6lyw6p0IGR1IHRpY2tldCBhIMOpdMOpIG1vZGlmacOpXCIsXHJcbiAgICAgICAgICAgIHN0YXR1czogRXZlbnRTdGF0dXMuUE9TSVRJT05fU0VULFxyXG4gICAgICAgICAgICB0cmFuc2xhdGlvblBhdGg6IFwidGlja2V0RXZlbnQucG9zaXRpb24uc2V0XCIsXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHBvaTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB1cGRhdGVTdGF0dXNPZlRpY2tldChcclxuICAgICAgICB0aWNrZXQ6IFRpY2tldCxcclxuICAgICAgICBzdGF0dXM6IFRpY2tldFN0YXR1cyxcclxuICAgICk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3QgY3VycmVudFN0YXR1cyA9IHRpY2tldC5zdGF0dXM7XHJcbiAgICAgICAgY29uc3Qgb2xkVGlja2V0U3RhdHVzID0gdGlja2V0LnN0YXR1cztcclxuICAgICAgICB0aWNrZXQuc3RhdHVzID0gc3RhdHVzO1xyXG4gICAgICAgIGlmIChjdXJyZW50U3RhdHVzID09PSBzdGF0dXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRpY2tldDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJVcGRhdGluZyBzdGF0dXNcIik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlVGlja2V0KHtcclxuICAgICAgICAgICAgaWQ6IHRpY2tldC5pZCxcclxuICAgICAgICAgICAgc3RhdHVzLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVwZGF0ZVR5cGVPZlRpY2tldCh0aWNrZXQ6IFRpY2tldCwgdHlwZTogVGlja2V0VHlwZSk6IFByb21pc2U8YW55PiB7XHJcbiAgICAgICAgY29uc3QgcHJldmlvdXNUeXBlID0gdGlja2V0LnR5cGU7XHJcbiAgICAgICAgdGlja2V0LnR5cGUgPSB0eXBlO1xyXG4gICAgICAgIGF3YWl0IHRoaXMudXBkYXRlVGlja2V0V2l0aEV2ZW50KFxyXG4gICAgICAgICAgICB7IGlkOiB0aWNrZXQuaWQsIHR5cGU6IHRpY2tldC50eXBlIH0sXHJcbiAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHRpdGxlOiBcIlR5cGUgY2hhbmfDqVwiLFxyXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGBDaGFuZ2VtZW50IGRlICR7cHJldmlvdXNUeXBlfSB2ZXJzICR7dGlja2V0LnR5cGV9YCxcclxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6IHRpY2tldC50eXBlIH0pLFxyXG4gICAgICAgICAgICAgICAgdHJhbnNsYXRpb25QYXRoOiBcInRpY2tldEV2ZW50LnRpY2tldC50eXBlXCIsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gdGlja2V0O1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGdldFRpY2tldHNGb3JVc2VyRm9yU3BhY2Uoc3BhY2VJRDogc3RyaW5nKTogUHJvbWlzZTxUaWNrZXRbXT4ge1xyXG4gICAgICAgIGNvbnN0IHRpY2tldHNTcGFjZSA9IGF3YWl0IHRoaXMuZ2V0VGlja2V0c0J5U3BhY2Uoc3BhY2VJRCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyU2VydmljZS5maWx0ZXJUaWNrZXRzRm9yQ3VycmVudFVzZXJJblNwYWNlKFxyXG4gICAgICAgICAgICB0aWNrZXRzU3BhY2UsXHJcbiAgICAgICAgICAgIHNwYWNlSUQsXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqIEJhc2ljIENSVUQgb3BlcmF0aW9ucyAqL1xyXG4gICAgYXN5bmMgcmVhZFRpY2tldChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuQVBJLl9fcHJvdG9fXy5HZXRUaWNrZXQoaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGNyZWF0ZVRpY2tldChpbnB1dDogVGlja2V0KTogUHJvbWlzZTxUaWNrZXQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5BUEkuX19wcm90b19fLkNyZWF0ZVRpY2tldChpbnB1dCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgdXBkYXRlVGlja2V0KGlucHV0OiBJVXBkYXRlICYgUGFydGlhbDxUaWNrZXQ+KTogUHJvbWlzZTxUaWNrZXQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5BUEkuX19wcm90b19fLlVwZGF0ZVRpY2tldChpbnB1dCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZGVsZXRlVGlja2V0KHRpY2tldDogVGlja2V0KTogUHJvbWlzZTxUaWNrZXQ+IHtcclxuICAgICAgICBjb25zdCBkZWxldGVkID0gYXdhaXQgdGhpcy5BUEkuX19wcm90b19fLkRlbGV0ZVRpY2tldCh7IGlkOiB0aWNrZXQuaWQgfSk7XHJcblxyXG4gICAgICAgIC8vIGRlbGV0ZSBQT0lcclxuICAgICAgICBjb25zdCBwb2kgPSBhd2FpdCB0aGlzLnBvaVNlcnZpY2UuZ2V0UG9pQnlFbGVtZW50SWQodGlja2V0LmlkKTtcclxuICAgICAgICBpZiAocG9pKSB7XHJcbiAgICAgICAgICAgIHRoaXMucG9pU2VydmljZS5kZWxldGVQb2kocG9pLmlkKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNsZWFuIHBhcmVudElEXHJcbiAgICAgICAgaWYgKHRpY2tldC5jaGlsZHJlbi5pdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRpY2tldC5jaGlsZHJlbi5pdGVtcy5tYXAoYXN5bmMgKGNoaWxkVGlja2V0KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuQVBJLl9fcHJvdG9fXy5VcGRhdGVUaWNrZXQoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogY2hpbGRUaWNrZXQuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudElEOiBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFwiQ291bGQgbm90IHVwZGF0ZSB0aWNrZXRcIiwgY2hpbGRUaWNrZXQuaWQpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuQVBJLl9fcHJvdG9fXy5DcmVhdGVFdmVudCh7XHJcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IFwiVGlja2V0IHBhcmVudCBzdXBwcmltw6lcIixcclxuICAgICAgICAgICAgICAgICAgICB0aWNrZXRJRDogY2hpbGRUaWNrZXQuaWQsXHJcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGBUaWNrZXQgXFxcIiR0aWNrZXQudGl0bGV9XFxcIiBhIMOpdMOpIHN1cHByaW3DqWAsXHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGRlbGV0ZSBldmVudHNcclxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgICAgdGlja2V0LmV2ZW50cy5pdGVtcy5tYXAoYXN5bmMgKGV2ZW50XykgPT4ge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5BUEkuX19wcm90b19fLkRlbGV0ZUV2ZW50KHsgaWQ6IGV2ZW50Xy5pZCB9KTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgKTtcclxuICAgICAgICAvLyBkZWxldGUgYWZmZWN0YXRpb25uc1xyXG4gICAgICAgIGlmICh0aWNrZXQuYXNzaWduZWVzLml0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRpY2tldC5hc3NpZ25lZXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuQVBJLl9fcHJvdG9fXy5EZWxldGVBZmZlY3RhdGlvbih7IGlkOiBlbGVtZW50LmlkIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGRlbGV0ZSBjb21tZW50c1xyXG4gICAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxyXG4gICAgICAgICAgICB0aWNrZXQuY29tbWVudHMuaXRlbXMubWFwKGFzeW5jIChjb21tZW50KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLkFQSS5fX3Byb3RvX18uRGVsZXRlQ29tbWVudCh7IGlkOiBjb21tZW50LmlkIH0pO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGF3YWl0IHRoaXMub3BlcmF0aW9uU2VydmljZS5kZWxldGVPcGVyYXRpb25zRm9yVGlja2V0KHRpY2tldC5pZCk7XHJcbiAgICAgICAgcmV0dXJuIGRlbGV0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEN1c3RvbSByZXF1ZXN0cyAqL1xyXG4gICAgYXN5bmMgZ2V0VGlja2V0c0J5U3BhY2Uoc3BhY2VJRDogc3RyaW5nKTogUHJvbWlzZTxUaWNrZXRbXT4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLkFQSS5fX3Byb3RvX18uVGlja2V0c0J5U3BhY2Uoc3BhY2VJRCkudGhlbihcclxuICAgICAgICAgICAgKHRpY2tldHMpID0+IHRpY2tldHMuaXRlbXMsXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB1cGRhdGVJY29uRm9yQWxsVGlja2V0c0luU3BhY2UoXHJcbiAgICAgICAgdGFnSWNvbjogc3RyaW5nLFxyXG4gICAgICAgIHNwYWNlSUQ6IHN0cmluZyxcclxuICAgICk6IFByb21pc2U8eyB0aWNrZXRzOiBUaWNrZXRbXTsgcG9pczogUE9JW10gfT4ge1xyXG4gICAgICAgIGNvbnN0IHRpY2tldHMgPSBhd2FpdCB0aGlzLmdldFRpY2tldHNCeVNwYWNlKHNwYWNlSUQpO1xyXG4gICAgICAgIGNvbnN0IHBvaXMgPSBhd2FpdCB0aGlzLnVwZGF0ZUljb25Gb3JBbGxPYmplY3RzKHRpY2tldHMsIHRhZ0ljb24pO1xyXG4gICAgICAgIHJldHVybiB7IHRpY2tldHMsIHBvaXMgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQXJjaGl2ZSByZWxhdGVkICovXHJcbiAgICAvKiogUmV0dXJuIHRydWUgaWYgdGhlIGN1cnJlbnQgdXNlciBoYXMgYXJjaGl2ZWQgdGhpcyB0aWNrZXQgKi9cclxuICAgIGlzQXJjaGl2ZWQodGlja2V0OiBUaWNrZXQpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGlja2V0LmFyY2hpdmVkRm9yTWlzc2lvbklEXHJcbiAgICAgICAgICAgID8gdGlja2V0LmFyY2hpdmVkRm9yTWlzc2lvbklELmluY2x1ZGVzKFxyXG4gICAgICAgICAgICAgICAgICB0aGlzLnVzZXJTZXJ2aWNlLmN1cnJlbnRNaXNzaW9uKHRpY2tldC5zcGFjZUlEKS5pZCxcclxuICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgIDogZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0QXJjaGl2ZWQodGlja2V0OiBUaWNrZXQsIGFyY2hpdmVkOiBib29sZWFuKSB7XHJcbiAgICAgICAgbGV0IGFyY2hpdmVkTGlzdCA9IHRpY2tldC5hcmNoaXZlZEZvck1pc3Npb25JRFxyXG4gICAgICAgICAgICA/IHRpY2tldC5hcmNoaXZlZEZvck1pc3Npb25JRFxyXG4gICAgICAgICAgICA6IFtdO1xyXG4gICAgICAgIGNvbnN0IG1pc3Npb25JRCA9IHRoaXMudXNlclNlcnZpY2UuY3VycmVudE1pc3Npb24odGlja2V0LnNwYWNlSUQpLmlkO1xyXG5cclxuICAgICAgICBhcmNoaXZlZExpc3QgPSBhcmNoaXZlZExpc3QuZmlsdGVyKChtKSA9PiBtICE9PSBtaXNzaW9uSUQpO1xyXG5cclxuICAgICAgICBpZiAoYXJjaGl2ZWQpIHtcclxuICAgICAgICAgICAgYXJjaGl2ZWRMaXN0LnB1c2gobWlzc2lvbklEKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVRpY2tldFdpdGhFdmVudCh7XHJcbiAgICAgICAgICAgIGlkOiB0aWNrZXQuaWQsXHJcbiAgICAgICAgICAgIGFyY2hpdmVkRm9yTWlzc2lvbklEOiBhcmNoaXZlZExpc3QsXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgbmF2aWdhdGVUb1RpY2tldEluM0QoXHJcbiAgICAgICAgdGlja2V0OiBUaWNrZXQsXHJcbiAgICAgICAgZm9yY2VTd2l0Y2hWaXNpdDogYm9vbGVhbiA9IGZhbHNlLFxyXG4gICAgKSB7XHJcbiAgICAgICAgbGV0IHVybCA9IGB2aXNpdC8ke3RpY2tldC5zcGFjZUlEfWA7XHJcbiAgICAgICAgaWYgKGZvcmNlU3dpdGNoVmlzaXQpIHtcclxuICAgICAgICAgICAgdXJsICs9IGAvZGV0YWlsLyR7dGlja2V0LmlkfWA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGNhbkdvVG9UYWcgPSBhd2FpdCB0aGlzLnZpZXdlclNlcnZpY2UuYWN0aW9uX21vdmVfdG9fdGFnKFxyXG4gICAgICAgICAgICBgJHt0aWNrZXQuaWR9YCxcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChjYW5Hb1RvVGFnKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy5nZXRNb2RlbDNkQW5kU3dlZXAodGlja2V0KTtcclxuICAgICAgICBpZiAoIXJlc3VsdCB8fCAhcmVzdWx0Lm1vZGVsM0QpIHtcclxuICAgICAgICAgICAgYWxlcnQoXCJFcnJvciB3aGlsZSBnZXR0aW5nIHZpcnR1YWwgdmlzaXQgbW9kZWxcIik7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFmb3JjZVN3aXRjaFZpc2l0KSB7XHJcbiAgICAgICAgICAgIC8qKiBTaSBvbiBuZSBmb3JjZSBwYXMgbGEgdmlzaXRlLCBvbiBkZW1hbmRlIHNpIG9uIHZldXQgZXRyZSBzd2l0Y2ggKi9cclxuICAgICAgICAgICAgb3Blbk1vZGFsRm9yVmlzaXRTd2l0Y2goXHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGFsU2VydmljZSxcclxuICAgICAgICAgICAgICAgIHJlc3VsdC5tb2RlbDNELFxyXG4gICAgICAgICAgICAgICAgdGlja2V0LnNwYWNlSUQsXHJcbiAgICAgICAgICAgICAgICB7IHN3ZWVwVG9Nb3ZlOiByZXN1bHQuc3dlZXAsIHJvdGF0aW9uOiByZXN1bHQucm90YXRpb24gfSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvKiogU2kgb24gZm9yY2UgbGUgc3dpdGNoIGRlIGxhIHZpc2l0ICovXHJcbiAgICAgICAgICAgIHdpbmRvdy5vcGVuKFxyXG4gICAgICAgICAgICAgICAgYCR7dXJsfT9tb2RlbDNEPSR7cmVzdWx0Lm1vZGVsM0R9JnN3ZWVwPXRydWVgLFxyXG4gICAgICAgICAgICAgICAgXCJfYmxhbmtcIixcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5pdFN1YnNjcmlwdGlvbnMoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzTXVzZXVtVXNlcikge1xyXG4gICAgICAgICAgICB0aGlzLm5hdlN1YnNjcmlwdGlvbiA9IHRoaXMubmF2aWdhdG9yU2VydmljZS56b25lQ2hhbmdlLnN1YnNjcmliZSgoem9uZSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U3BhY2VJRCA9IHRoaXMubmF2aWdhdG9yU2VydmljZS5jdXJyZW50U3BhY2VJRDtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5jdXJyZW50U3BhY2VJRCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGlja2V0VGFncy5uZXh0KG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGlja2V0c1VwZGF0ZWQubmV4dCh7IHNwYWNlOiBbXSwgem9uZTogbnVsbCB9KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpY2tldFR5cGVGaWx0ZXIgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9uZUlERmlsdGVyID0gbnVsbDtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoem9uZS5pZCAhPT0gdGhpcy56b25lSURGaWx0ZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnpvbmVJREZpbHRlciA9IHpvbmUuaWQ7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJnb2luZyB0byBpbml0IHRpY2tldHMgZnJvbSB6b25lXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFRpY2tldHMoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsZXRyU3Vic2NyaXB0aW9uID0gdGhpcy5maWx0ZXJTZXJ2aWNlLnN1YnNjcmliZVRvRGF0YUZpbHRlclVwZGF0ZSgoZGF0ZVJhbmdlKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVGaWx0ZXIgPSBkYXRlUmFuZ2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRUaWNrZXRzKCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLmRhdGVGaWx0ZXIgPSB0aGlzLmZpbHRlclNlcnZpY2UuY3VycmVudERhdGVGaWx0ZXI7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRG9uZS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY3VycmVudFNwYWNlSUQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRUaWNrZXRzKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=
|