@myclub_se/data-access 2.14.0 → 2.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2020/lib/api-models/api-bookable-group.mjs +2 -0
- package/esm2020/lib/api-models/api-bookable-item.mjs +2 -0
- package/esm2020/lib/api-models/api-bookable-part.mjs +2 -0
- package/esm2020/lib/api-models/api-bookable-tag.mjs +2 -0
- package/esm2020/lib/api-models/api-booking-calendar-application-time.mjs +1 -1
- package/esm2020/lib/api-models/api-booking-calendar-slot-session.mjs +1 -1
- package/esm2020/lib/api-models/api-booking-calendar-slot.mjs +1 -1
- package/esm2020/lib/api-models/api-booking-calendar.mjs +1 -1
- package/esm2020/lib/api-models/api-overbooked-bookable-item.mjs +2 -0
- package/esm2020/lib/api-models/index.mjs +6 -1
- package/esm2020/lib/models/activity-location-part.mjs +4 -4
- package/esm2020/lib/models/bookable-group.mjs +21 -0
- package/esm2020/lib/models/bookable-item.mjs +34 -0
- package/esm2020/lib/models/bookable-part.mjs +14 -0
- package/esm2020/lib/models/bookable-tag.mjs +17 -0
- package/esm2020/lib/models/booking-calendar-application-time.mjs +9 -9
- package/esm2020/lib/models/booking-calendar-slot-session.mjs +9 -9
- package/esm2020/lib/models/booking-calendar-slot.mjs +5 -5
- package/esm2020/lib/models/booking-calendar.mjs +9 -9
- package/esm2020/lib/models/index.mjs +6 -1
- package/esm2020/lib/models/overbooked-bookable-item.mjs +10 -0
- package/esm2020/lib/services/activity.service.mjs +2 -189
- package/esm2020/lib/services/bookable.service.mjs +258 -0
- package/esm2020/lib/services/booking-calendar.service.mjs +30 -26
- package/esm2020/lib/services/factories/bookable-group-factory.mjs +6 -0
- package/esm2020/lib/services/factories/bookable-item-factory.mjs +5 -0
- package/esm2020/lib/services/factories/bookable-part-factory.mjs +5 -0
- package/esm2020/lib/services/factories/bookable-tag-factory.mjs +5 -0
- package/esm2020/lib/services/factories/booking-calendar-application-time-factory.mjs +2 -2
- package/esm2020/lib/services/factories/booking-calendar-factory.mjs +3 -3
- package/esm2020/lib/services/factories/booking-calendar-slot-factory.mjs +2 -2
- package/esm2020/lib/services/factories/booking-calendar-slot-session-factory.mjs +2 -2
- package/esm2020/lib/services/factories/index.mjs +7 -1
- package/esm2020/lib/services/factories/overbooked-bookable-item-factory.mjs +3 -0
- package/esm2020/lib/services/index.mjs +2 -1
- package/fesm2015/myclub_se-data-access.mjs +422 -245
- package/fesm2015/myclub_se-data-access.mjs.map +1 -1
- package/fesm2020/myclub_se-data-access.mjs +422 -245
- package/fesm2020/myclub_se-data-access.mjs.map +1 -1
- package/lib/api-models/api-bookable-group.d.ts +9 -0
- package/lib/api-models/api-bookable-item.d.ts +12 -0
- package/lib/api-models/api-bookable-part.d.ts +4 -0
- package/lib/api-models/api-bookable-tag.d.ts +7 -0
- package/lib/api-models/api-booking-calendar-application-time.d.ts +5 -5
- package/lib/api-models/api-booking-calendar-slot-session.d.ts +5 -5
- package/lib/api-models/api-booking-calendar-slot.d.ts +2 -2
- package/lib/api-models/api-booking-calendar.d.ts +2 -2
- package/lib/api-models/api-overbooked-bookable-item.d.ts +7 -0
- package/lib/api-models/index.d.ts +5 -0
- package/lib/models/activity-location-part.d.ts +1 -1
- package/lib/models/bookable-group.d.ts +18 -0
- package/lib/models/bookable-item.d.ts +22 -0
- package/lib/models/bookable-part.d.ts +10 -0
- package/lib/models/bookable-tag.d.ts +13 -0
- package/lib/models/booking-calendar-application-time.d.ts +8 -8
- package/lib/models/booking-calendar-slot-session.d.ts +8 -8
- package/lib/models/booking-calendar-slot.d.ts +4 -4
- package/lib/models/booking-calendar.d.ts +4 -4
- package/lib/models/index.d.ts +5 -0
- package/lib/models/overbooked-bookable-item.d.ts +8 -0
- package/lib/services/activity.service.d.ts +1 -31
- package/lib/services/bookable.service.d.ts +44 -0
- package/lib/services/booking-calendar.service.d.ts +6 -5
- package/lib/services/factories/bookable-group-factory.d.ts +3 -0
- package/lib/services/factories/bookable-item-factory.d.ts +3 -0
- package/lib/services/factories/bookable-part-factory.d.ts +3 -0
- package/lib/services/factories/bookable-tag-factory.d.ts +3 -0
- package/lib/services/factories/index.d.ts +6 -0
- package/lib/services/factories/overbooked-bookable-item-factory.d.ts +3 -0
- package/lib/services/index.d.ts +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { Role, } from '../models';
|
|
3
|
+
import { bookableGroupFactory, bookableItemFactory, bookablePartFactory, bookableTagFactory, } from './factories';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "./api.service";
|
|
6
|
+
const CLUB_BOOKABLES_PATH = ':clubId/activities/bookables/';
|
|
7
|
+
const CLUB_BOOKABLE_PATH = ':clubId/activities/bookables/:bookableId/';
|
|
8
|
+
const CLUB_BOOKABLE_GROUPS_PATH = ':clubId/activities/bookables/groups/';
|
|
9
|
+
const CLUB_BOOKABLE_GROUP_PATH = ':clubId/activities/bookables/groups/:groupId/';
|
|
10
|
+
const CLUB_BOOKABLE_TAGS_PATH = ':clubId/activities/bookables/tags/';
|
|
11
|
+
const CLUB_BOOKABLE_TAG_PATH = ':clubId/activities/bookables/tags/:tagId/';
|
|
12
|
+
const CLUB_BOOKABLE_PARTS_PATH = ':clubId/activities/bookables/:bookableId/parts/';
|
|
13
|
+
const TEAM_BOOKABLES_PATH = ':teamId/activities/bookables/';
|
|
14
|
+
const TEAM_BOOKABLE_GROUPS_PATH = ':teamId/activities/bookables/groups/';
|
|
15
|
+
const TEAM_BOOKABLE_TAGS_PATH = ':teamId/activities/bookables/tags/';
|
|
16
|
+
const TEAM_BOOKABLE_PARTS_PATH = ':teamId/activities/bookables/:bookableId/parts/';
|
|
17
|
+
const SECTION_BOOKABLES_PATH = ':sectionId/activities/bookables/';
|
|
18
|
+
const SECTION_BOOKABLE_PATH = ':sectionId/activities/bookables/:bookableId/';
|
|
19
|
+
const SECTION_BOOKABLE_GROUPS_PATH = ':sectionId/activities/bookables/groups/';
|
|
20
|
+
const SECTION_BOOKABLE_GROUP_PATH = ':sectionId/activities/bookables/groups/:groupId/';
|
|
21
|
+
const SECTION_BOOKABLE_TAGS_PATH = ':sectionId/activities/bookables/tags/';
|
|
22
|
+
const SECTION_BOOKABLE_TAG_PATH = ':sectionId/activities/bookables/tags/:tagId/';
|
|
23
|
+
const SECTION_BOOKABLE_PARTS_PATH = ':sectionId/activities/bookables/:bookableId/parts/';
|
|
24
|
+
export class BookableService {
|
|
25
|
+
constructor(apiService) {
|
|
26
|
+
this.apiService = apiService;
|
|
27
|
+
}
|
|
28
|
+
// region Bookable Items
|
|
29
|
+
getBookableItems(role, clubOrSectionOrTeamId) {
|
|
30
|
+
if (role == Role.ClubAdmin) {
|
|
31
|
+
return this.getClubBookableItems(clubOrSectionOrTeamId);
|
|
32
|
+
}
|
|
33
|
+
else if (role == Role.SectionAdmin) {
|
|
34
|
+
return this.getSectionBookableItems(clubOrSectionOrTeamId);
|
|
35
|
+
}
|
|
36
|
+
return this.getTeamBookableItems(clubOrSectionOrTeamId);
|
|
37
|
+
}
|
|
38
|
+
getTeamBookableItems(teamId) {
|
|
39
|
+
return this.apiService
|
|
40
|
+
.getCollection(bookableItemFactory, Role.TeamAdmin, TEAM_BOOKABLES_PATH, { teamId }, { params: { limit: 'null' } });
|
|
41
|
+
}
|
|
42
|
+
getClubBookableItems(clubId) {
|
|
43
|
+
return this.apiService
|
|
44
|
+
.getCollection(bookableItemFactory, Role.ClubAdmin, CLUB_BOOKABLES_PATH, { clubId }, { params: { limit: 'null' } });
|
|
45
|
+
}
|
|
46
|
+
getSectionBookableItems(sectionId) {
|
|
47
|
+
return this.apiService
|
|
48
|
+
.getCollection(bookableItemFactory, Role.SectionAdmin, SECTION_BOOKABLES_PATH, { sectionId }, { params: { limit: 'null' } });
|
|
49
|
+
}
|
|
50
|
+
updateBookableItem(role, clubOrSectionOrTeamId, bookableItem) {
|
|
51
|
+
if (role === Role.ClubAdmin) {
|
|
52
|
+
return this.updateClubBookableItem(clubOrSectionOrTeamId, bookableItem);
|
|
53
|
+
}
|
|
54
|
+
return this.updateSectionBookableItem(clubOrSectionOrTeamId, bookableItem);
|
|
55
|
+
}
|
|
56
|
+
updateClubBookableItem(clubId, bookableItem) {
|
|
57
|
+
return this.apiService
|
|
58
|
+
.updateResource(bookableItemFactory, Role.ClubAdmin, CLUB_BOOKABLE_PATH, {
|
|
59
|
+
clubId,
|
|
60
|
+
bookableId: bookableItem.id
|
|
61
|
+
}, bookableItem);
|
|
62
|
+
}
|
|
63
|
+
updateSectionBookableItem(sectionId, bookableItem) {
|
|
64
|
+
return this.apiService
|
|
65
|
+
.updateResource(bookableItemFactory, Role.SectionAdmin, SECTION_BOOKABLE_PATH, {
|
|
66
|
+
sectionId,
|
|
67
|
+
bookableId: bookableItem.id
|
|
68
|
+
}, bookableItem);
|
|
69
|
+
}
|
|
70
|
+
// endregion
|
|
71
|
+
// region Bookable Groups
|
|
72
|
+
getBookableGroups(role, clubOrSectionOrTeamId) {
|
|
73
|
+
if (role == Role.ClubAdmin) {
|
|
74
|
+
return this.getClubBookableGroups(clubOrSectionOrTeamId);
|
|
75
|
+
}
|
|
76
|
+
else if (role == Role.SectionAdmin) {
|
|
77
|
+
return this.getSectionBookableGroups(clubOrSectionOrTeamId);
|
|
78
|
+
}
|
|
79
|
+
return this.getTeamBookableGroups(clubOrSectionOrTeamId);
|
|
80
|
+
}
|
|
81
|
+
getClubBookableGroups(clubId) {
|
|
82
|
+
return this.apiService
|
|
83
|
+
.getCollection(bookableGroupFactory, Role.ClubAdmin, CLUB_BOOKABLE_GROUPS_PATH, { clubId }, { params: { limit: 'null' } });
|
|
84
|
+
}
|
|
85
|
+
getSectionBookableGroups(sectionId) {
|
|
86
|
+
return this.apiService
|
|
87
|
+
.getCollection(bookableGroupFactory, Role.SectionAdmin, SECTION_BOOKABLE_GROUPS_PATH, { sectionId }, { params: { limit: 'null' } });
|
|
88
|
+
}
|
|
89
|
+
getTeamBookableGroups(teamId) {
|
|
90
|
+
return this.apiService
|
|
91
|
+
.getCollection(bookableGroupFactory, Role.TeamAdmin, TEAM_BOOKABLE_GROUPS_PATH, { teamId }, { params: { limit: 'null' } });
|
|
92
|
+
}
|
|
93
|
+
updateBookableGroup(role, clubOrSectionOrTeamId, bookableGroup) {
|
|
94
|
+
if (role === Role.ClubAdmin) {
|
|
95
|
+
return this.updateClubBookableGroup(clubOrSectionOrTeamId, bookableGroup);
|
|
96
|
+
}
|
|
97
|
+
return this.updateSectionBookableGroup(clubOrSectionOrTeamId, bookableGroup);
|
|
98
|
+
}
|
|
99
|
+
updateClubBookableGroup(clubId, bookableGroup) {
|
|
100
|
+
return this.apiService
|
|
101
|
+
.updateResource(bookableGroupFactory, Role.ClubAdmin, CLUB_BOOKABLE_GROUP_PATH, {
|
|
102
|
+
clubId,
|
|
103
|
+
groupId: bookableGroup.id
|
|
104
|
+
}, bookableGroup);
|
|
105
|
+
}
|
|
106
|
+
updateSectionBookableGroup(sectionId, bookableGroup) {
|
|
107
|
+
return this.apiService
|
|
108
|
+
.updateResource(bookableGroupFactory, Role.SectionAdmin, SECTION_BOOKABLE_GROUP_PATH, {
|
|
109
|
+
sectionId,
|
|
110
|
+
groupId: bookableGroup.id
|
|
111
|
+
}, bookableGroup);
|
|
112
|
+
}
|
|
113
|
+
createBookableGroup(role, clubOrSectionOrTeamId, bookableGroup) {
|
|
114
|
+
if (role === Role.ClubAdmin) {
|
|
115
|
+
return this.createClubBookableGroup(clubOrSectionOrTeamId, bookableGroup);
|
|
116
|
+
}
|
|
117
|
+
return this.createSectionBookableGroup(clubOrSectionOrTeamId, bookableGroup);
|
|
118
|
+
}
|
|
119
|
+
createClubBookableGroup(clubId, bookableGroup) {
|
|
120
|
+
delete bookableGroup.id;
|
|
121
|
+
return this.apiService
|
|
122
|
+
.postResource(bookableGroupFactory, Role.ClubAdmin, CLUB_BOOKABLE_GROUPS_PATH, {
|
|
123
|
+
clubId,
|
|
124
|
+
}, bookableGroup);
|
|
125
|
+
}
|
|
126
|
+
createSectionBookableGroup(sectionId, bookableGroup) {
|
|
127
|
+
delete bookableGroup.id;
|
|
128
|
+
return this.apiService
|
|
129
|
+
.postResource(bookableGroupFactory, Role.SectionAdmin, SECTION_BOOKABLE_GROUPS_PATH, {
|
|
130
|
+
sectionId,
|
|
131
|
+
}, bookableGroup);
|
|
132
|
+
}
|
|
133
|
+
// endregion
|
|
134
|
+
// region Bookable Tags
|
|
135
|
+
getBookableTags(role, clubOrSectionOrTeamId) {
|
|
136
|
+
if (role == Role.ClubAdmin) {
|
|
137
|
+
return this.getClubBookableTags(clubOrSectionOrTeamId);
|
|
138
|
+
}
|
|
139
|
+
else if (role == Role.SectionAdmin) {
|
|
140
|
+
return this.getSectionBookableTags(clubOrSectionOrTeamId);
|
|
141
|
+
}
|
|
142
|
+
return this.getTeamBookableTags(clubOrSectionOrTeamId);
|
|
143
|
+
}
|
|
144
|
+
getClubBookableTags(clubId) {
|
|
145
|
+
return this.apiService
|
|
146
|
+
.getCollection(bookableTagFactory, Role.ClubAdmin, CLUB_BOOKABLE_TAGS_PATH, { clubId }, { params: { limit: 'null' } });
|
|
147
|
+
}
|
|
148
|
+
getSectionBookableTags(sectionId) {
|
|
149
|
+
return this.apiService
|
|
150
|
+
.getCollection(bookableTagFactory, Role.SectionAdmin, SECTION_BOOKABLE_TAGS_PATH, { sectionId }, { params: { limit: 'null' } });
|
|
151
|
+
}
|
|
152
|
+
getTeamBookableTags(teamId) {
|
|
153
|
+
return this.apiService
|
|
154
|
+
.getCollection(bookableTagFactory, Role.TeamAdmin, TEAM_BOOKABLE_TAGS_PATH, { teamId }, { params: { limit: 'null' } });
|
|
155
|
+
}
|
|
156
|
+
createBookableTag(role, clubOrSectionOrTeamId, tag) {
|
|
157
|
+
if (role == Role.ClubAdmin) {
|
|
158
|
+
return this.createClubBookableTag(clubOrSectionOrTeamId, tag);
|
|
159
|
+
}
|
|
160
|
+
else if (role == Role.SectionAdmin) {
|
|
161
|
+
return this.createSectionBookableTag(clubOrSectionOrTeamId, tag);
|
|
162
|
+
}
|
|
163
|
+
return this.createTeamBookableTag(clubOrSectionOrTeamId, tag);
|
|
164
|
+
}
|
|
165
|
+
createClubBookableTag(clubId, tag) {
|
|
166
|
+
delete tag.id;
|
|
167
|
+
return this.apiService
|
|
168
|
+
.postResource(bookableTagFactory, Role.ClubAdmin, CLUB_BOOKABLE_TAGS_PATH, {
|
|
169
|
+
clubId,
|
|
170
|
+
}, tag);
|
|
171
|
+
}
|
|
172
|
+
createSectionBookableTag(sectionId, tag) {
|
|
173
|
+
delete tag.id;
|
|
174
|
+
return this.apiService
|
|
175
|
+
.postResource(bookableTagFactory, Role.SectionAdmin, SECTION_BOOKABLE_TAGS_PATH, {
|
|
176
|
+
sectionId,
|
|
177
|
+
}, tag);
|
|
178
|
+
}
|
|
179
|
+
createTeamBookableTag(teamId, tag) {
|
|
180
|
+
delete tag.id;
|
|
181
|
+
return this.apiService
|
|
182
|
+
.postResource(bookableTagFactory, Role.TeamAdmin, TEAM_BOOKABLE_TAGS_PATH, {
|
|
183
|
+
teamId,
|
|
184
|
+
}, tag);
|
|
185
|
+
}
|
|
186
|
+
updateBookableTag(role, clubOrSectionOrTeamId, tag) {
|
|
187
|
+
if (role == Role.ClubAdmin) {
|
|
188
|
+
return this.updateClubBookableTag(clubOrSectionOrTeamId, tag);
|
|
189
|
+
}
|
|
190
|
+
return this.updateSectionBookableTag(clubOrSectionOrTeamId, tag);
|
|
191
|
+
}
|
|
192
|
+
updateClubBookableTag(clubId, tag) {
|
|
193
|
+
return this.apiService
|
|
194
|
+
.updateResource(bookableTagFactory, Role.ClubAdmin, CLUB_BOOKABLE_TAG_PATH, {
|
|
195
|
+
clubId,
|
|
196
|
+
tagId: tag.id,
|
|
197
|
+
}, tag);
|
|
198
|
+
}
|
|
199
|
+
updateSectionBookableTag(sectionId, tag) {
|
|
200
|
+
return this.apiService
|
|
201
|
+
.updateResource(bookableTagFactory, Role.SectionAdmin, SECTION_BOOKABLE_TAG_PATH, {
|
|
202
|
+
sectionId,
|
|
203
|
+
tagId: tag.id,
|
|
204
|
+
}, tag);
|
|
205
|
+
}
|
|
206
|
+
deleteBookableTag(role, clubOrSectionOrTeamId, tag) {
|
|
207
|
+
if (role == Role.ClubAdmin) {
|
|
208
|
+
return this.deleteClubBookableTag(clubOrSectionOrTeamId, tag);
|
|
209
|
+
}
|
|
210
|
+
return this.deleteSectionBookableTag(clubOrSectionOrTeamId, tag);
|
|
211
|
+
}
|
|
212
|
+
deleteClubBookableTag(clubId, tag) {
|
|
213
|
+
return this.apiService
|
|
214
|
+
.deleteResource(Role.ClubAdmin, CLUB_BOOKABLE_TAG_PATH, {
|
|
215
|
+
clubId,
|
|
216
|
+
tagId: tag.id,
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
deleteSectionBookableTag(sectionId, tag) {
|
|
220
|
+
return this.apiService
|
|
221
|
+
.deleteResource(Role.SectionAdmin, SECTION_BOOKABLE_TAG_PATH, {
|
|
222
|
+
sectionId,
|
|
223
|
+
tagId: tag.id,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
// endregion
|
|
227
|
+
// region Bookable Parts
|
|
228
|
+
getBookableParts(role, clubOrSectionOrTeamId, bookableId) {
|
|
229
|
+
if (role == Role.ClubAdmin) {
|
|
230
|
+
return this.getClubBookableParts(clubOrSectionOrTeamId, bookableId);
|
|
231
|
+
}
|
|
232
|
+
else if (role == Role.SectionAdmin) {
|
|
233
|
+
return this.getSectionBookableParts(clubOrSectionOrTeamId, bookableId);
|
|
234
|
+
}
|
|
235
|
+
return this.getTeamBookableParts(clubOrSectionOrTeamId, bookableId);
|
|
236
|
+
}
|
|
237
|
+
getClubBookableParts(clubId, bookableId) {
|
|
238
|
+
return this.apiService
|
|
239
|
+
.getCollection(bookablePartFactory, Role.ClubAdmin, CLUB_BOOKABLE_PARTS_PATH, { clubId, bookableId }, { params: { limit: 'null' } });
|
|
240
|
+
}
|
|
241
|
+
getSectionBookableParts(sectionId, bookableId) {
|
|
242
|
+
return this.apiService
|
|
243
|
+
.getCollection(bookablePartFactory, Role.SectionAdmin, SECTION_BOOKABLE_PARTS_PATH, { sectionId, bookableId }, { params: { limit: 'null' } });
|
|
244
|
+
}
|
|
245
|
+
getTeamBookableParts(teamId, bookableId) {
|
|
246
|
+
return this.apiService
|
|
247
|
+
.getCollection(bookablePartFactory, Role.TeamAdmin, TEAM_BOOKABLE_PARTS_PATH, { teamId, bookableId }, { params: { limit: 'null' } });
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
BookableService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: BookableService, deps: [{ token: i1.ApiService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
251
|
+
BookableService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: BookableService, providedIn: 'root' });
|
|
252
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.11", ngImport: i0, type: BookableService, decorators: [{
|
|
253
|
+
type: Injectable,
|
|
254
|
+
args: [{
|
|
255
|
+
providedIn: 'root'
|
|
256
|
+
}]
|
|
257
|
+
}], ctorParameters: function () { return [{ type: i1.ApiService }]; } });
|
|
258
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9va2FibGUuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2RhdGEtYWNjZXNzL3NyYy9saWIvc2VydmljZXMvYm9va2FibGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpDLE9BQU8sRUFBMkMsSUFBSSxHQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFFLE9BQU8sRUFBQyxvQkFBb0IsRUFBRSxtQkFBbUIsRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsR0FBRSxNQUFNLGFBQWEsQ0FBQzs7O0FBRWhILE1BQU0sbUJBQW1CLEdBQUcsK0JBQStCLENBQUM7QUFDNUQsTUFBTSxrQkFBa0IsR0FBRywyQ0FBMkMsQ0FBQztBQUN2RSxNQUFNLHlCQUF5QixHQUFHLHNDQUFzQyxDQUFDO0FBQ3pFLE1BQU0sd0JBQXdCLEdBQUcsK0NBQStDLENBQUM7QUFDakYsTUFBTSx1QkFBdUIsR0FBRyxvQ0FBb0MsQ0FBQztBQUNyRSxNQUFNLHNCQUFzQixHQUFHLDJDQUEyQyxDQUFDO0FBQzNFLE1BQU0sd0JBQXdCLEdBQUcsaURBQWlELENBQUM7QUFFbkYsTUFBTSxtQkFBbUIsR0FBRywrQkFBK0IsQ0FBQztBQUM1RCxNQUFNLHlCQUF5QixHQUFHLHNDQUFzQyxDQUFDO0FBQ3pFLE1BQU0sdUJBQXVCLEdBQUcsb0NBQW9DLENBQUM7QUFDckUsTUFBTSx3QkFBd0IsR0FBRyxpREFBaUQsQ0FBQztBQUVuRixNQUFNLHNCQUFzQixHQUFHLGtDQUFrQyxDQUFDO0FBQ2xFLE1BQU0scUJBQXFCLEdBQUcsOENBQThDLENBQUM7QUFDN0UsTUFBTSw0QkFBNEIsR0FBRyx5Q0FBeUMsQ0FBQztBQUMvRSxNQUFNLDJCQUEyQixHQUFHLGtEQUFrRCxDQUFDO0FBQ3ZGLE1BQU0sMEJBQTBCLEdBQUcsdUNBQXVDLENBQUM7QUFDM0UsTUFB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QUFhLENBQ1osbUJBQW1CLEVBQ25CLElBQUksQ0FBQyxTQUFTLEVBQ2Qsd0JBQXdCLEVBQ3hCLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBQyxFQUNwQixFQUFDLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUMsRUFBQyxDQUMxQixDQUFDO0lBQ04sQ0FBQztJQUVELHVCQUF1QixDQUFDLFNBQWlCLEVBQUUsVUFBa0I7UUFDM0QsT0FBTyxJQUFJLENBQUMsVUFBVTthQUNuQixhQUFhLENBQ1osbUJBQW1CLEVBQ25CLElBQUksQ0FBQyxZQUFZLEVBQ2pCLDJCQUEyQixFQUMzQixFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUMsRUFDdkIsRUFBQyxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDLEVBQUMsQ0FDMUIsQ0FBQztJQUNOLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxNQUFjLEVBQUUsVUFBa0I7UUFDckQsT0FBTyxJQUFJLENBQUMsVUFBVTthQUNuQixhQUFhLENBQ1osbUJBQW1CLEVBQ25CLElBQUksQ0FBQyxTQUFTLEVBQ2Qsd0JBQXdCLEVBQ3hCLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBQyxFQUNwQixFQUFDLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUMsRUFBQyxDQUMxQixDQUFDO0lBQ04sQ0FBQzs7NkdBdFpVLGVBQWU7aUhBQWYsZUFBZSxjQUZkLE1BQU07NEZBRVAsZUFBZTtrQkFIM0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBcGlTZXJ2aWNlfSBmcm9tICcuL2FwaS5zZXJ2aWNlJztcbmltcG9ydCB7Qm9va2FibGVHcm91cCwgQm9va2FibGVJdGVtLCBCb29rYWJsZVRhZywgUm9sZSx9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge2Jvb2thYmxlR3JvdXBGYWN0b3J5LCBib29rYWJsZUl0ZW1GYWN0b3J5LCBib29rYWJsZVBhcnRGYWN0b3J5LCBib29rYWJsZVRhZ0ZhY3RvcnksfSBmcm9tICcuL2ZhY3Rvcmllcyc7XG5cbmNvbnN0IENMVUJfQk9PS0FCTEVTX1BBVEggPSAnOmNsdWJJZC9hY3Rpdml0aWVzL2Jvb2thYmxlcy8nO1xuY29uc3QgQ0xVQl9CT09LQUJMRV9QQVRIID0gJzpjbHViSWQvYWN0aXZpdGllcy9ib29rYWJsZXMvOmJvb2thYmxlSWQvJztcbmNvbnN0IENMVUJfQk9PS0FCTEVfR1JPVVBTX1BBVEggPSAnOmNsdWJJZC9hY3Rpdml0aWVzL2Jvb2thYmxlcy9ncm91cHMvJztcbmNvbnN0IENMVUJfQk9PS0FCTEVfR1JPVVBfUEFUSCA9ICc6Y2x1YklkL2FjdGl2aXRpZXMvYm9va2FibGVzL2dyb3Vwcy86Z3JvdXBJZC8nO1xuY29uc3QgQ0xVQl9CT09LQUJMRV9UQUdTX1BBVEggPSAnOmNsdWJJZC9hY3Rpdml0aWVzL2Jvb2thYmxlcy90YWdzLyc7XG5jb25zdCBDTFVCX0JPT0tBQkxFX1RBR19QQVRIID0gJzpjbHViSWQvYWN0aXZpdGllcy9ib29rYWJsZXMvdGFncy86dGFnSWQvJztcbmNvbnN0IENMVUJfQk9PS0FCTEVfUEFSVFNfUEFUSCA9ICc6Y2x1YklkL2FjdGl2aXRpZXMvYm9va2FibGVzLzpib29rYWJsZUlkL3BhcnRzLyc7XG5cbmNvbnN0IFRFQU1fQk9PS0FCTEVTX1BBVEggPSAnOnRlYW1JZC9hY3Rpdml0aWVzL2Jvb2thYmxlcy8nO1xuY29uc3QgVEVBTV9CT09LQUJMRV9HUk9VUFNfUEFUSCA9ICc6dGVhbUlkL2FjdGl2aXRpZXMvYm9va2FibGVzL2dyb3Vwcy8nO1xuY29uc3QgVEVBTV9CT09LQUJMRV9UQUdTX1BBVEggPSAnOnRlYW1JZC9hY3Rpdml0aWVzL2Jvb2thYmxlcy90YWdzLyc7XG5jb25zdCBURUFNX0JPT0tBQkxFX1BBUlRTX1BBVEggPSAnOnRlYW1JZC9hY3Rpdml0aWVzL2Jvb2thYmxlcy86Ym9va2FibGVJZC9wYXJ0cy8nO1xuXG5jb25zdCBTRUNUSU9OX0JPT0tBQkxFU19QQVRIID0gJzpzZWN0aW9uSWQvYWN0aXZpdGllcy9ib29rYWJsZXMvJztcbmNvbnN0IFNFQ1RJT05fQk9PS0FCTEVfUEFUSCA9ICc6c2VjdGlvbklkL2FjdGl2aXRpZXMvYm9va2FibGVzLzpib29rYWJsZUlkLyc7XG5jb25zdCBTRUNUSU9OX0JPT0tBQkxFX0dST1VQU19QQVRIID0gJzpzZWN0aW9uSWQvYWN0aXZpdGllcy9ib29rYWJsZXMvZ3JvdXBzLyc7XG5jb25zdCBTRUNUSU9OX0JPT0tBQkxFX0dST1VQX1BBVEggPSAnOnNlY3Rpb25JZC9hY3Rpdml0aWVzL2Jvb2thYmxlcy9ncm91cHMvOmdyb3VwSWQvJztcbmNvbnN0IFNFQ1RJT05fQk9PS0FCTEVfVEFHU19QQVRIID0gJzpzZWN0aW9uSWQvYWN0aXZpdGllcy9ib29rYWJsZXMvdGFncy8nO1xuY29uc3QgU0VDVElPTl9CT09LQUJMRV9UQUdfUEFUSCA9ICc6c2VjdGlvbklkL2FjdGl2aXRpZXMvYm9va2FibGVzL3RhZ3MvOnRhZ0lkLyc7XG5jb25zdCBTRUNUSU9OX0JPT0tBQkxFX1BBUlRTX1BBVEggPSAnOnNlY3Rpb25JZC9hY3Rpdml0aWVzL2Jvb2thYmxlcy86Ym9va2FibGVJZC9wYXJ0cy8nO1xuXG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEJvb2thYmxlU2VydmljZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYXBpU2VydmljZTogQXBpU2VydmljZSkge1xuICB9XG5cbiAgLy8gcmVnaW9uIEJvb2thYmxlIEl0ZW1zXG5cbiAgZ2V0Qm9va2FibGVJdGVtcyhyb2xlOiBSb2xlLCBjbHViT3JTZWN0aW9uT3JUZWFtSWQ6IHN0cmluZykge1xuICAgIGlmIChyb2xlID09IFJvbGUuQ2x1YkFkbWluKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRDbHViQm9va2FibGVJdGVtcyhjbHViT3JTZWN0aW9uT3JUZWFtSWQpO1xuICAgIH0gZWxzZSBpZiAocm9sZSA9PSBSb2xlLlNlY3Rpb25BZG1pbikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0U2VjdGlvbkJvb2thYmxlSXRlbXMoY2x1Yk9yU2VjdGlvbk9yVGVhbUlkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0VGVhbUJvb2thYmxlSXRlbXMoY2x1Yk9yU2VjdGlvbk9yVGVhbUlkKVxuICB9XG5cbiAgZ2V0VGVhbUJvb2thYmxlSXRlbXModGVhbUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlXG4gICAgICAuZ2V0Q29sbGVjdGlvbihcbiAgICAgICAgYm9va2FibGVJdGVtRmFjdG9yeSxcbiAgICAgICAgUm9sZS5UZWFtQWRtaW4sXG4gICAgICAgIFRFQU1fQk9PS0FCTEVTX1BBVEgsXG4gICAgICAgIHt0ZWFtSWR9LFxuICAgICAgICB7cGFyYW1zOiB7bGltaXQ6ICdudWxsJ319XG4gICAgICApO1xuICB9XG5cbiAgZ2V0Q2x1YkJvb2thYmxlSXRlbXMoY2x1YklkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlXG4gICAgICAuZ2V0Q29sbGVjdGlvbihcbiAgICAgICAgYm9va2FibGVJdGVtRmFjdG9yeSxcbiAgICAgICAgUm9sZS5DbHViQWRtaW4sXG4gICAgICAgIENMVUJfQk9PS0FCTEVTX1BBVEgsXG4gICAgICAgIHtjbHViSWR9LFxuICAgICAgICB7cGFyYW1zOiB7bGltaXQ6ICdudWxsJ319XG4gICAgICApO1xuICB9XG5cbiAgZ2V0U2VjdGlvbkJvb2thYmxlSXRlbXMoc2VjdGlvbklkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlXG4gICAgICAuZ2V0Q29sbGVjdGlvbihcbiAgICAgICAgYm9va2FibGVJdGVtRmFjdG9yeSxcbiAgICAgICAgUm9sZS5TZWN0aW9uQWRtaW4sXG4gICAgICAgIFNFQ1RJT05fQk9PS0FCTEVTX1BBVEgsXG4gICAgICAgIHtzZWN0aW9uSWR9LFxuICAgICAgICB7cGFyYW1zOiB7bGltaXQ6ICdudWxsJ319XG4gICAgICApO1xuICB9XG5cbiAgdXBkYXRlQm9va2FibGVJdGVtKHJvbGU6IFJvbGUsIGNsdWJPclNlY3Rpb25PclRlYW1JZDogc3RyaW5nLCBib29rYWJsZUl0ZW06IEJvb2thYmxlSXRlbSkge1xuICAgIGlmIChyb2xlID09PSBSb2xlLkNsdWJBZG1pbikge1xuICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ2x1YkJvb2thYmxlSXRlbShjbHViT3JTZWN0aW9uT3JUZWFtSWQsIGJvb2thYmxlSXRlbSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnVwZGF0ZVNlY3Rpb25Cb29rYWJsZUl0ZW0oY2x1Yk9yU2VjdGlvbk9yVGVhbUlkLCBib29rYWJsZUl0ZW0pO1xuICB9XG5cbiAgdXBkYXRlQ2x1YkJvb2thYmxlSXRlbShjbHViSWQ6IHN0cmluZywgYm9va2FibGVJdGVtOiBCb29rYWJsZUl0ZW0pIHtcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlXG4gICAgICAudXBkYXRlUmVzb3VyY2UoXG4gICAgICAgIGJvb2thYmxlSXRlbUZhY3RvcnksXG4gICAgICAgIFJvbGUuQ2x1YkFkbWluLFxuICAgICAgICBDTFVCX0JPT0tBQkxFX1BBVEgsXG4gICAgICAgIHtcbiAgICAgICAgICBjbHViSWQsXG4gICAgICAgICAgYm9va2FibGVJZDogYm9va2FibGVJdGVtLmlkXG4gICAgICAgIH0sXG4gICAgICAgIGJvb2thYmxlSXRlbVxuICAgICAgKTtcbiAgfVxuXG4gIHVwZGF0ZVNlY3Rpb25Cb29rYWJsZUl0ZW0oc2VjdGlvbklkOiBzdHJpbmcsIGJvb2thYmxlSXRlbTogQm9va2FibGVJdGVtKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZVxuICAgICAgLnVwZGF0ZVJlc291cmNlKFxuICAgICAgICBib29rYWJsZUl0ZW1GYWN0b3J5LFxuICAgICAgICBSb2xlLlNlY3Rpb25BZG1pbixcbiAgICAgICAgU0VDVElPTl9CT09LQUJMRV9QQVRILFxuICAgICAgICB7XG4gICAgICAgICAgc2VjdGlvbklkLFxuICAgICAgICAgIGJvb2thYmxlSWQ6IGJvb2thYmxlSXRlbS5pZFxuICAgICAgICB9LFxuICAgICAgICBib29rYWJsZUl0ZW1cbiAgICAgICk7XG4gIH1cblxuICAvLyBlbmRyZWdpb25cblxuICAvLyByZWdpb24gQm9va2FibGUgR3JvdXBzXG5cbiAgZ2V0Qm9va2FibGVHcm91cHMocm9sZTogUm9sZSwgY2x1Yk9yU2VjdGlvbk9yVGVhbUlkOiBzdHJpbmcpIHtcbiAgICBpZiAocm9sZSA9PSBSb2xlLkNsdWJBZG1pbikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2x1YkJvb2thYmxlR3JvdXBzKGNsdWJPclNlY3Rpb25PclRlYW1JZCk7XG4gICAgfSBlbHNlIGlmIChyb2xlID09IFJvbGUuU2VjdGlvbkFkbWluKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRTZWN0aW9uQm9va2FibGVHcm91cHMoY2x1Yk9yU2VjdGlvbk9yVGVhbUlkKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0VGVhbUJvb2thYmxlR3JvdXBzKGNsdWJPclNlY3Rpb25PclRlYW1JZCk7XG4gIH1cblxuICBnZXRDbHViQm9va2FibGVHcm91cHMoY2x1YklkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlXG4gICAgICAuZ2V0Q29sbGVjdGlvbihcbiAgICAgICAgYm9va2FibGVHcm91cEZhY3RvcnksXG4gICAgICAgIFJvbGUuQ2x1YkFkbWluLFxuICAgICAgICBDTFVCX0JPT0tBQkxFX0dST1VQU19QQVRILFxuICAgICAgICB7Y2x1YklkfSxcbiAgICAgICAge3BhcmFtczoge2xpbWl0OiAnbnVsbCd9fVxuICAgICAgKTtcbiAgfVxuXG4gIGdldFNlY3Rpb25Cb29rYWJsZUdyb3VwcyhzZWN0aW9uSWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2VcbiAgICAgIC5nZXRDb2xsZWN0aW9uKFxuICAgICAgICBib29rYWJsZUdyb3VwRmFjdG9yeSxcbiAgICAgICAgUm9sZS5TZWN0aW9uQWRtaW4sXG4gICAgICAgIFNFQ1RJT05fQk9PS0FCTEVfR1JPVVBTX1BBVEgsXG4gICAgICAgIHtzZWN0aW9uSWR9LFxuICAgICAgICB7cGFyYW1zOiB7bGltaXQ6ICdudWxsJ319XG4gICAgICApO1xuICB9XG5cbiAgZ2V0VGVhbUJvb2thYmxlR3JvdXBzKHRlYW1JZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZVxuICAgICAgLmdldENvbGxlY3Rpb24oXG4gICAgICAgIGJvb2thYmxlR3JvdXBGYWN0b3J5LFxuICAgICAgICBSb2xlLlRlYW1BZG1pbixcbiAgICAgICAgVEVBTV9CT09LQUJMRV9HUk9VUFNfUEFUSCxcbiAgICAgICAge3RlYW1JZH0sXG4gICAgICAgIHtwYXJhbXM6IHtsaW1pdDogJ251bGwnfX1cbiAgICAgICk7XG4gIH1cblxuICB1cGRhdGVCb29rYWJsZUdyb3VwKHJvbGU6IFJvbGUsIGNsdWJPclNlY3Rpb25PclRlYW1JZDogc3RyaW5nLCBib29rYWJsZUdyb3VwOiBCb29rYWJsZUdyb3VwKSB7XG4gICAgaWYgKHJvbGUgPT09IFJvbGUuQ2x1YkFkbWluKSB7XG4gICAgICByZXR1cm4gdGhpcy51cGRhdGVDbHViQm9va2FibGVHcm91cChjbHViT3JTZWN0aW9uT3JUZWFtSWQsIGJvb2thYmxlR3JvdXApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy51cGRhdGVTZWN0aW9uQm9va2FibGVHcm91cChjbHViT3JTZWN0aW9uT3JUZWFtSWQsIGJvb2thYmxlR3JvdXApO1xuICB9XG5cbiAgdXBkYXRlQ2x1YkJvb2thYmxlR3JvdXAoY2x1YklkOiBzdHJpbmcsIGJvb2thYmxlR3JvdXA6IEJvb2thYmxlR3JvdXApIHtcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlXG4gICAgICAudXBkYXRlUmVzb3VyY2UoXG4gICAgICAgIGJvb2thYmxlR3JvdXBGYWN0b3J5LFxuICAgICAgICBSb2xlLkNsdWJBZG1pbixcbiAgICAgICAgQ0xVQl9CT09LQUJMRV9HUk9VUF9QQVRILFxuICAgICAgICB7XG4gICAgICAgICAgY2x1YklkLFxuICAgICAgICAgIGdyb3VwSWQ6IGJvb2thYmxlR3JvdXAuaWRcbiAgICAgICAgfSxcbiAgICAgICAgYm9va2FibGVHcm91cCxcbiAgICAgICk7XG4gIH1cblxuICB1cGRhdGVTZWN0aW9uQm9va2FibGVHcm91cChzZWN0aW9uSWQ6IHN0cmluZywgYm9va2FibGVHcm91cDogQm9va2FibGVHcm91cCkge1xuICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2VcbiAgICAgIC51cGRhdGVSZXNvdXJjZShcbiAgICAgICAgYm9va2FibGVHcm91cEZhY3RvcnksXG4gICAgICAgIFJvbGUuU2VjdGlvbkFkbWluLFxuICAgICAgICBTRUNUSU9OX0JPT0tBQkxFX0dST1VQX1BBVEgsXG4gICAgICAgIHtcbiAgICAgICAgICBzZWN0aW9uSWQsXG4gICAgICAgICAgZ3JvdXBJZDogYm9va2FibGVHcm91cC5pZFxuICAgICAgICB9LFxuICAgICAgICBib29rYWJsZUdyb3VwXG4gICAgICApO1xuICB9XG5cbiAgY3JlYXRlQm9va2FibGVHcm91cChyb2xlOiBSb2xlLCBjbHViT3JTZWN0aW9uT3JUZWFtSWQ6IHN0cmluZywgYm9va2FibGVHcm91cDogUGFydGlhbDxCb29rYWJsZUdyb3VwPikge1xuICAgIGlmIChyb2xlID09PSBSb2xlLkNsdWJBZG1pbikge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlQ2x1YkJvb2thYmxlR3JvdXAoY2x1Yk9yU2VjdGlvbk9yVGVhbUlkLCBib29rYWJsZUdyb3VwKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlU2VjdGlvbkJvb2thYmxlR3JvdXAoY2x1Yk9yU2VjdGlvbk9yVGVhbUlkLCBib29rYWJsZUdyb3VwKTtcbiAgfVxuXG4gIGNyZWF0ZUNsdWJCb29rYWJsZUdyb3VwKGNsdWJJZDogc3RyaW5nLCBib29rYWJsZUdyb3VwOiBQYXJ0aWFsPEJvb2thYmxlR3JvdXA+KSB7XG4gICAgZGVsZXRlIGJvb2thYmxlR3JvdXAuaWQ7XG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZVxuICAgICAgLnBvc3RSZXNvdXJjZShcbiAgICAgICAgYm9va2FibGVHcm91cEZhY3RvcnksXG4gICAgICAgIFJvbGUuQ2x1YkFkbWluLFxuICAgICAgICBDTFVCX0JPT0tBQkxFX0dST1VQU19QQVRILFxuICAgICAgICB7XG4gICAgICAgICAgY2x1YklkLFxuICAgICAgICB9LFxuICAgICAgICBib29rYWJsZUdyb3VwLFxuICAgICAgKTtcbiAgfVxuXG4gIGNyZWF0ZVNlY3Rpb25Cb29rYWJsZUdyb3VwKHNlY3Rpb25JZDogc3RyaW5nLCBib29rYWJsZUdyb3VwOiBQYXJ0aWFsPEJvb2thYmxlR3JvdXA+KSB7XG4gICAgZGVsZXRlIGJvb2thYmxlR3JvdXAuaWQ7XG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZVxuICAgICAgLnBvc3RSZXNvdXJjZShcbiAgICAgICAgYm9va2FibGVHcm91cEZhY3RvcnksXG4gICAgICAgIFJvbGUuU2VjdGlvbkFkbWluLFxuICAgICAgICBTRUNUSU9OX0JPT0tBQkxFX0dST1VQU19QQVRILFxuICAgICAgICB7XG4gICAgICAgICAgc2VjdGlvbklkLFxuICAgICAgICB9LFxuICAgICAgICBib29rYWJsZUdyb3VwXG4gICAgICApO1xuICB9XG5cbiAgLy8gZW5kcmVnaW9uXG5cbiAgLy8gcmVnaW9uIEJvb2thYmxlIFRhZ3NcblxuICBnZXRCb29rYWJsZVRhZ3Mocm9sZTogUm9sZSwgY2x1Yk9yU2VjdGlvbk9yVGVhbUlkOiBzdHJpbmcpIHtcbiAgICBpZiAocm9sZSA9PSBSb2xlLkNsdWJBZG1pbikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2x1YkJvb2thYmxlVGFncyhjbHViT3JTZWN0aW9uT3JUZWFtSWQpO1xuICAgIH0gZWxzZSBpZiAocm9sZSA9PSBSb2xlLlNlY3Rpb25BZG1pbikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0U2VjdGlvbkJvb2thYmxlVGFncyhjbHViT3JTZWN0aW9uT3JUZWFtSWQpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRUZWFtQm9va2FibGVUYWdzKGNsdWJPclNlY3Rpb25PclRlYW1JZCk7XG4gIH1cblxuICBnZXRDbHViQm9va2FibGVUYWdzKGNsdWJJZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZVxuICAgICAgLmdldENvbGxlY3Rpb24oXG4gICAgICAgIGJvb2thYmxlVGFnRmFjdG9yeSxcbiAgICAgICAgUm9sZS5DbHViQWRtaW4sXG4gICAgICAgIENMVUJfQk9PS0FCTEVfVEFHU19QQVRILFxuICAgICAgICB7Y2x1YklkfSxcbiAgICAgICAge3BhcmFtczoge2xpbWl0OiAnbnVsbCd9fVxuICAgICAgKTtcbiAgfVxuXG4gIGdldFNlY3Rpb25Cb29rYWJsZVRhZ3Moc2VjdGlvbklkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlXG4gICAgICAuZ2V0Q29sbGVjdGlvbihcbiAgICAgICAgYm9va2FibGVUYWdGYWN0b3J5LFxuICAgICAgICBSb2xlLlNlY3Rpb25BZG1pbixcbiAgICAgICAgU0VDVElPTl9CT09LQUJMRV9UQUdTX1BBVEgsXG4gICAgICAgIHtzZWN0aW9uSWR9LFxuICAgICAgICB7cGFyYW1zOiB7bGltaXQ6ICdudWxsJ319XG4gICAgICApO1xuICB9XG5cbiAgZ2V0VGVhbUJvb2thYmxlVGFncyh0ZWFtSWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2VcbiAgICAgIC5nZXRDb2xsZWN0aW9uKFxuICAgICAgICBib29rYWJsZVRhZ0ZhY3RvcnksXG4gICAgICAgIFJvbGUuVGVhbUFkbWluLFxuICAgICAgICBURUFNX0JPT0tBQkxFX1RBR1NfUEFUSCxcbiAgICAgICAge3RlYW1JZH0sXG4gICAgICAgIHtwYXJhbXM6IHtsaW1pdDogJ251bGwnfX1cbiAgICAgICk7XG4gIH1cblxuICBjcmVhdGVCb29rYWJsZVRhZyhyb2xlOiBSb2xlLCBjbHViT3JTZWN0aW9uT3JUZWFtSWQ6IHN0cmluZywgdGFnOiBQYXJ0aWFsPEJvb2thYmxlVGFnPikge1xuICAgIGlmIChyb2xlID09IFJvbGUuQ2x1YkFkbWluKSB7XG4gICAgICByZXR1cm4gdGhpcy5jcmVhdGVDbHViQm9va2FibGVUYWcoY2x1Yk9yU2VjdGlvbk9yVGVhbUlkLCB0YWcpO1xuICAgIH0gZWxzZSBpZiAocm9sZSA9PSBSb2xlLlNlY3Rpb25BZG1pbikge1xuICAgICAgcmV0dXJuIHRoaXMuY3JlYXRlU2VjdGlvbkJvb2thYmxlVGFnKGNsdWJPclNlY3Rpb25PclRlYW1JZCwgdGFnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlVGVhbUJvb2thYmxlVGFnKGNsdWJPclNlY3Rpb25PclRlYW1JZCwgdGFnKTtcbiAgfVxuXG4gIGNyZWF0ZUNsdWJCb29rYWJsZVRhZyhjbHViSWQ6IHN0cmluZywgdGFnOiBQYXJ0aWFsPEJvb2thYmxlVGFnPikge1xuICAgIGRlbGV0ZSB0YWcuaWQ7XG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZVxuICAgICAgLnBvc3RSZXNvdXJjZShcbiAgICAgICAgYm9va2FibGVUYWdGYWN0b3J5LFxuICAgICAgICBSb2xlLkNsdWJBZG1pbixcbiAgICAgICAgQ0xVQl9CT09LQUJMRV9UQUdTX1BBVEgsXG4gICAgICAgIHtcbiAgICAgICAgICBjbHViSWQsXG4gICAgICAgIH0sXG4gICAgICAgIHRhZyxcbiAgICAgIClcbiAgfVxuXG4gIGNyZWF0ZVNlY3Rpb25Cb29rYWJsZVRhZyhzZWN0aW9uSWQ6IHN0cmluZywgdGFnOiBQYXJ0aWFsPEJvb2thYmxlVGFnPikge1xuICAgIGRlbGV0ZSB0YWcuaWQ7XG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZVxuICAgICAgLnBvc3RSZXNvdXJjZShcbiAgICAgICAgYm9va2FibGVUYWdGYWN0b3J5LFxuICAgICAgICBSb2xlLlNlY3Rpb25BZG1pbixcbiAgICAgICAgU0VDVElPTl9CT09LQUJMRV9UQUdTX1BBVEgsXG4gICAgICAgIHtcbiAgICAgICAgICBzZWN0aW9uSWQsXG4gICAgICAgIH0sXG4gICAgICAgIHRhZyxcbiAgICAgIClcbiAgfVxuXG4gIGNyZWF0ZVRlYW1Cb29rYWJsZVRhZyh0ZWFtSWQ6IHN0cmluZywgdGFnOiBQYXJ0aWFsPEJvb2thYmxlVGFnPikge1xuICAgIGRlbGV0ZSB0YWcuaWQ7XG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZVxuICAgICAgLnBvc3RSZXNvdXJjZShcbiAgICAgICAgYm9va2FibGVUYWdGYWN0b3J5LFxuICAgICAgICBSb2xlLlRlYW1BZG1pbixcbiAgICAgICAgVEVBTV9CT09LQUJMRV9UQUdTX1BBVEgsXG4gICAgICAgIHtcbiAgICAgICAgICB0ZWFtSWQsXG4gICAgICAgIH0sXG4gICAgICAgIHRhZyxcbiAgICAgIClcbiAgfVxuXG4gIHVwZGF0ZUJvb2thYmxlVGFnKHJvbGU6IFJvbGUsIGNsdWJPclNlY3Rpb25PclRlYW1JZDogc3RyaW5nLCB0YWc6IEJvb2thYmxlVGFnKSB7XG4gICAgaWYgKHJvbGUgPT0gUm9sZS5DbHViQWRtaW4pIHtcbiAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUNsdWJCb29rYWJsZVRhZyhjbHViT3JTZWN0aW9uT3JUZWFtSWQsIHRhZyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnVwZGF0ZVNlY3Rpb25Cb29rYWJsZVRhZyhjbHViT3JTZWN0aW9uT3JUZWFtSWQsIHRhZyk7XG4gIH1cblxuICB1cGRhdGVDbHViQm9va2FibGVUYWcoY2x1YklkOiBzdHJpbmcsIHRhZzogQm9va2FibGVUYWcpIHtcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlXG4gICAgICAudXBkYXRlUmVzb3VyY2UoXG4gICAgICAgIGJvb2thYmxlVGFnRmFjdG9yeSxcbiAgICAgICAgUm9sZS5DbHViQWRtaW4sXG4gICAgICAgIENMVUJfQk9PS0FCTEVfVEFHX1BBVEgsXG4gICAgICAgIHtcbiAgICAgICAgICBjbHViSWQsXG4gICAgICAgICAgdGFnSWQ6IHRhZy5pZCxcbiAgICAgICAgfSxcbiAgICAgICAgdGFnLFxuICAgICAgKVxuICB9XG5cbiAgdXBkYXRlU2VjdGlvbkJvb2thYmxlVGFnKHNlY3Rpb25JZDogc3RyaW5nLCB0YWc6IEJvb2thYmxlVGFnKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZVxuICAgICAgLnVwZGF0ZVJlc291cmNlKFxuICAgICAgICBib29rYWJsZVRhZ0ZhY3RvcnksXG4gICAgICAgIFJvbGUuU2VjdGlvbkFkbWluLFxuICAgICAgICBTRUNUSU9OX0JPT0tBQkxFX1RBR19QQVRILFxuICAgICAgICB7XG4gICAgICAgICAgc2VjdGlvbklkLFxuICAgICAgICAgIHRhZ0lkOiB0YWcuaWQsXG4gICAgICAgIH0sXG4gICAgICAgIHRhZyxcbiAgICAgIClcbiAgfVxuXG4gIGRlbGV0ZUJvb2thYmxlVGFnKHJvbGU6IFJvbGUsIGNsdWJPclNlY3Rpb25PclRlYW1JZDogc3RyaW5nLCB0YWc6IEJvb2thYmxlVGFnKSB7XG4gICAgaWYgKHJvbGUgPT0gUm9sZS5DbHViQWRtaW4pIHtcbiAgICAgIHJldHVybiB0aGlzLmRlbGV0ZUNsdWJCb29rYWJsZVRhZyhjbHViT3JTZWN0aW9uT3JUZWFtSWQsIHRhZyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRlbGV0ZVNlY3Rpb25Cb29rYWJsZVRhZyhjbHViT3JTZWN0aW9uT3JUZWFtSWQsIHRhZyk7XG4gIH1cblxuICBkZWxldGVDbHViQm9va2FibGVUYWcoY2x1YklkOiBzdHJpbmcsIHRhZzogQm9va2FibGVUYWcpIHtcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlXG4gICAgICAuZGVsZXRlUmVzb3VyY2UoXG4gICAgICAgIFJvbGUuQ2x1YkFkbWluLFxuICAgICAgICBDTFVCX0JPT0tBQkxFX1RBR19QQVRILFxuICAgICAgICB7XG4gICAgICAgICAgY2x1YklkLFxuICAgICAgICAgIHRhZ0lkOiB0YWcuaWQsXG4gICAgICAgIH0sXG4gICAgICApXG4gIH1cblxuICBkZWxldGVTZWN0aW9uQm9va2FibGVUYWcoc2VjdGlvbklkOiBzdHJpbmcsIHRhZzogQm9va2FibGVUYWcpIHtcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlXG4gICAgICAuZGVsZXRlUmVzb3VyY2UoXG4gICAgICAgIFJvbGUuU2VjdGlvbkFkbWluLFxuICAgICAgICBTRUNUSU9OX0JPT0tBQkxFX1RBR19QQVRILFxuICAgICAgICB7XG4gICAgICAgICAgc2VjdGlvbklkLFxuICAgICAgICAgIHRhZ0lkOiB0YWcuaWQsXG4gICAgICAgIH0sXG4gICAgICApXG4gIH1cblxuICAvLyBlbmRyZWdpb25cblxuICAvLyByZWdpb24gQm9va2FibGUgUGFydHNcblxuICBnZXRCb29rYWJsZVBhcnRzKHJvbGU6IFJvbGUsIGNsdWJPclNlY3Rpb25PclRlYW1JZDogc3RyaW5nLCBib29rYWJsZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAocm9sZSA9PSBSb2xlLkNsdWJBZG1pbikge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2x1YkJvb2thYmxlUGFydHMoY2x1Yk9yU2VjdGlvbk9yVGVhbUlkLCBib29rYWJsZUlkKTtcbiAgICB9IGVsc2UgaWYgKHJvbGUgPT0gUm9sZS5TZWN0aW9uQWRtaW4pIHtcbiAgICAgIHJldHVybiB0aGlzLmdldFNlY3Rpb25Cb29rYWJsZVBhcnRzKGNsdWJPclNlY3Rpb25PclRlYW1JZCwgYm9va2FibGVJZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmdldFRlYW1Cb29rYWJsZVBhcnRzKGNsdWJPclNlY3Rpb25PclRlYW1JZCwgYm9va2FibGVJZCk7XG4gIH1cblxuICBnZXRDbHViQm9va2FibGVQYXJ0cyhjbHViSWQ6IHN0cmluZywgYm9va2FibGVJZDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuYXBpU2VydmljZVxuICAgICAgLmdldENvbGxlY3Rpb24oXG4gICAgICAgIGJvb2thYmxlUGFydEZhY3RvcnksXG4gICAgICAgIFJvbGUuQ2x1YkFkbWluLFxuICAgICAgICBDTFVCX0JPT0tBQkxFX1BBUlRTX1BBVEgsXG4gICAgICAgIHtjbHViSWQsIGJvb2thYmxlSWR9LFxuICAgICAgICB7cGFyYW1zOiB7bGltaXQ6ICdudWxsJ319XG4gICAgICApO1xuICB9XG5cbiAgZ2V0U2VjdGlvbkJvb2thYmxlUGFydHMoc2VjdGlvbklkOiBzdHJpbmcsIGJvb2thYmxlSWQ6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLmFwaVNlcnZpY2VcbiAgICAgIC5nZXRDb2xsZWN0aW9uKFxuICAgICAgICBib29rYWJsZVBhcnRGYWN0b3J5LFxuICAgICAgICBSb2xlLlNlY3Rpb25BZG1pbixcbiAgICAgICAgU0VDVElPTl9CT09LQUJMRV9QQVJUU19QQVRILFxuICAgICAgICB7c2VjdGlvbklkLCBib29rYWJsZUlkfSxcbiAgICAgICAge3BhcmFtczoge2xpbWl0OiAnbnVsbCd9fVxuICAgICAgKTtcbiAgfVxuXG4gIGdldFRlYW1Cb29rYWJsZVBhcnRzKHRlYW1JZDogc3RyaW5nLCBib29rYWJsZUlkOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5hcGlTZXJ2aWNlXG4gICAgICAuZ2V0Q29sbGVjdGlvbihcbiAgICAgICAgYm9va2FibGVQYXJ0RmFjdG9yeSxcbiAgICAgICAgUm9sZS5UZWFtQWRtaW4sXG4gICAgICAgIFRFQU1fQk9PS0FCTEVfUEFSVFNfUEFUSCxcbiAgICAgICAge3RlYW1JZCwgYm9va2FibGVJZH0sXG4gICAgICAgIHtwYXJhbXM6IHtsaW1pdDogJ251bGwnfX1cbiAgICAgICk7XG4gIH1cblxuICAvLyBlbmRyZWdpb25cbn1cbiJdfQ==
|