@taimos/radball-digital-api 0.0.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.
Files changed (174) hide show
  1. package/README.md +129 -0
  2. package/aws.graphql +24 -0
  3. package/docs/.nojekyll +1 -0
  4. package/docs/assets/hierarchy.js +1 -0
  5. package/docs/assets/highlight.css +92 -0
  6. package/docs/assets/icons.js +18 -0
  7. package/docs/assets/icons.svg +1 -0
  8. package/docs/assets/main.js +60 -0
  9. package/docs/assets/navigation.js +1 -0
  10. package/docs/assets/search.js +1 -0
  11. package/docs/assets/style.css +1640 -0
  12. package/docs/classes/ValidationCheckResult.html +11 -0
  13. package/docs/enums/PreferenceStatus.html +3 -0
  14. package/docs/functions/checkAddress.html +1 -0
  15. package/docs/functions/checkAssociation.html +1 -0
  16. package/docs/functions/checkClub.html +1 -0
  17. package/docs/functions/checkGym.html +1 -0
  18. package/docs/functions/checkLeague.html +1 -0
  19. package/docs/functions/checkLeagueGroup.html +1 -0
  20. package/docs/functions/checkPerson.html +1 -0
  21. package/docs/functions/checkSeason.html +1 -0
  22. package/docs/functions/checkTeam.html +1 -0
  23. package/docs/functions/validateAddress.html +1 -0
  24. package/docs/functions/validateAssociation.html +1 -0
  25. package/docs/functions/validateClub.html +1 -0
  26. package/docs/functions/validateGym.html +1 -0
  27. package/docs/functions/validateLeague.html +1 -0
  28. package/docs/functions/validateLeagueGroup.html +1 -0
  29. package/docs/functions/validatePerson.html +1 -0
  30. package/docs/functions/validateSeason.html +1 -0
  31. package/docs/functions/validateTeam.html +1 -0
  32. package/docs/hierarchy.html +1 -0
  33. package/docs/index.html +65 -0
  34. package/docs/interfaces/components.html +7 -0
  35. package/docs/interfaces/operations.html +4 -0
  36. package/docs/interfaces/paths.html +118 -0
  37. package/docs/modules.html +1 -0
  38. package/docs/types/AddGameInput.html +4 -0
  39. package/docs/types/Address.html +6 -0
  40. package/docs/types/AddressInput.html +5 -0
  41. package/docs/types/Association.html +13 -0
  42. package/docs/types/AuditLogEntry.html +8 -0
  43. package/docs/types/Club.html +11 -0
  44. package/docs/types/Exact.html +1 -0
  45. package/docs/types/Game.html +13 -0
  46. package/docs/types/Gym.html +7 -0
  47. package/docs/types/Incremental.html +1 -0
  48. package/docs/types/InputMaybe.html +1 -0
  49. package/docs/types/League.html +13 -0
  50. package/docs/types/LeagueGroup.html +11 -0
  51. package/docs/types/MakeEmpty.html +1 -0
  52. package/docs/types/MakeMaybe.html +1 -0
  53. package/docs/types/MakeOptional.html +1 -0
  54. package/docs/types/MatchDay.html +15 -0
  55. package/docs/types/MatchdayTeam.html +6 -0
  56. package/docs/types/Maybe.html +1 -0
  57. package/docs/types/ModifyAssociationInput.html +10 -0
  58. package/docs/types/ModifyClubInput.html +7 -0
  59. package/docs/types/ModifyGameInput.html +10 -0
  60. package/docs/types/ModifyGymInput.html +5 -0
  61. package/docs/types/ModifyLeagueGroupInput.html +7 -0
  62. package/docs/types/ModifyLeagueInput.html +9 -0
  63. package/docs/types/ModifyMatchDayInput.html +10 -0
  64. package/docs/types/ModifyMatchDayTeamInput.html +3 -0
  65. package/docs/types/ModifyPersonInput.html +12 -0
  66. package/docs/types/ModifyPreferredMatchdayDateInput.html +6 -0
  67. package/docs/types/ModifySeasonInput.html +7 -0
  68. package/docs/types/ModifyTeamInput.html +10 -0
  69. package/docs/types/Mutation.html +39 -0
  70. package/docs/types/MutationAddAssociationArgs.html +2 -0
  71. package/docs/types/MutationAddClubArgs.html +2 -0
  72. package/docs/types/MutationAddGameToMatchDayArgs.html +4 -0
  73. package/docs/types/MutationAddGymArgs.html +2 -0
  74. package/docs/types/MutationAddLeagueArgs.html +2 -0
  75. package/docs/types/MutationAddLeagueGroupArgs.html +2 -0
  76. package/docs/types/MutationAddMatchDayArgs.html +2 -0
  77. package/docs/types/MutationAddMatchDayTeamArgs.html +2 -0
  78. package/docs/types/MutationAddPersonArgs.html +2 -0
  79. package/docs/types/MutationAddPreferredDateForLeagueArgs.html +2 -0
  80. package/docs/types/MutationAddSeasonArgs.html +2 -0
  81. package/docs/types/MutationAddTeamArgs.html +2 -0
  82. package/docs/types/MutationModifyAssociationArgs.html +2 -0
  83. package/docs/types/MutationModifyClubArgs.html +2 -0
  84. package/docs/types/MutationModifyGameInMatchDayArgs.html +4 -0
  85. package/docs/types/MutationModifyGymArgs.html +2 -0
  86. package/docs/types/MutationModifyLeagueArgs.html +2 -0
  87. package/docs/types/MutationModifyLeagueGroupArgs.html +2 -0
  88. package/docs/types/MutationModifyMatchDayArgs.html +2 -0
  89. package/docs/types/MutationModifyMatchDayTeamArgs.html +3 -0
  90. package/docs/types/MutationModifyPersonArgs.html +2 -0
  91. package/docs/types/MutationModifyPreferredDateForLeagueArgs.html +2 -0
  92. package/docs/types/MutationModifySeasonArgs.html +2 -0
  93. package/docs/types/MutationModifyTeamArgs.html +2 -0
  94. package/docs/types/MutationRegisterTeamsForSeasonArgs.html +2 -0
  95. package/docs/types/MutationRemoveAssociationArgs.html +2 -0
  96. package/docs/types/MutationRemoveClubArgs.html +2 -0
  97. package/docs/types/MutationRemoveGameFromMatchDayArgs.html +4 -0
  98. package/docs/types/MutationRemoveGymArgs.html +2 -0
  99. package/docs/types/MutationRemoveLeagueArgs.html +2 -0
  100. package/docs/types/MutationRemoveLeagueGroupArgs.html +2 -0
  101. package/docs/types/MutationRemoveMatchDayArgs.html +2 -0
  102. package/docs/types/MutationRemoveMatchDayTeamArgs.html +2 -0
  103. package/docs/types/MutationRemovePersonArgs.html +2 -0
  104. package/docs/types/MutationRemovePreferredDateForLeagueArgs.html +4 -0
  105. package/docs/types/MutationRemoveSeasonArgs.html +2 -0
  106. package/docs/types/MutationRemoveTeamArgs.html +2 -0
  107. package/docs/types/Person.html +14 -0
  108. package/docs/types/PersonPermission.html +6 -0
  109. package/docs/types/PreferredMatchdayDate.html +8 -0
  110. package/docs/types/Query.html +36 -0
  111. package/docs/types/QueryGetAllGamesOfTeamInSeasonArgs.html +3 -0
  112. package/docs/types/QueryGetAllMatchdaysOfTeamInSeasonArgs.html +3 -0
  113. package/docs/types/QueryGetAllPlayersOfClubInSeasonArgs.html +3 -0
  114. package/docs/types/QueryGetAllTeamsOfClubInSeasonArgs.html +3 -0
  115. package/docs/types/QueryGetAssociationByIdArgs.html +2 -0
  116. package/docs/types/QueryGetAuditLogEntriesForActorArgs.html +4 -0
  117. package/docs/types/QueryGetAuditLogEntriesForResourceArgs.html +5 -0
  118. package/docs/types/QueryGetAvailableDatesForSeasonArgs.html +3 -0
  119. package/docs/types/QueryGetClubByIdArgs.html +2 -0
  120. package/docs/types/QueryGetGameByIdArgs.html +3 -0
  121. package/docs/types/QueryGetGymByIdArgs.html +2 -0
  122. package/docs/types/QueryGetLeagueByIdArgs.html +2 -0
  123. package/docs/types/QueryGetLeagueGroupByIdArgs.html +2 -0
  124. package/docs/types/QueryGetListOfClubsByAssociationArgs.html +2 -0
  125. package/docs/types/QueryGetListOfClubsByLeagueArgs.html +2 -0
  126. package/docs/types/QueryGetListOfClubsByLeagueGroupArgs.html +2 -0
  127. package/docs/types/QueryGetListOfGroupsInLeagueArgs.html +2 -0
  128. package/docs/types/QueryGetListOfGymsArgs.html +2 -0
  129. package/docs/types/QueryGetListOfLeagueInSeasonArgs.html +2 -0
  130. package/docs/types/QueryGetListOfMatchdaysArgs.html +4 -0
  131. package/docs/types/QueryGetListOfMatchdaysInSeasonArgs.html +2 -0
  132. package/docs/types/QueryGetListOfPeopleArgs.html +2 -0
  133. package/docs/types/QueryGetListOfSeasonsArgs.html +2 -0
  134. package/docs/types/QueryGetListOfTeamsForLeagueArgs.html +2 -0
  135. package/docs/types/QueryGetListOfTeamsForLeagueGroupArgs.html +3 -0
  136. package/docs/types/QueryGetMatchdayByIdArgs.html +2 -0
  137. package/docs/types/QueryGetPersonByIdArgs.html +2 -0
  138. package/docs/types/QueryGetPersonByUciCodeArgs.html +2 -0
  139. package/docs/types/QueryGetPersonPermissionsArgs.html +2 -0
  140. package/docs/types/QueryGetPreferredDatesForClubArgs.html +3 -0
  141. package/docs/types/QueryGetSeasonByIdArgs.html +2 -0
  142. package/docs/types/QueryGetTeamByIdArgs.html +2 -0
  143. package/docs/types/RefereeInfo.html +4 -0
  144. package/docs/types/RefereeInfoInput.html +3 -0
  145. package/docs/types/RegisterTeamInput.html +8 -0
  146. package/docs/types/RegisterTeamsForSeasonInput.html +5 -0
  147. package/docs/types/SaveAssociationInput.html +9 -0
  148. package/docs/types/SaveClubInput.html +7 -0
  149. package/docs/types/SaveGymInput.html +5 -0
  150. package/docs/types/SaveLeagueGroupInput.html +7 -0
  151. package/docs/types/SaveLeagueInput.html +9 -0
  152. package/docs/types/SaveMatchDayInput.html +11 -0
  153. package/docs/types/SaveMatchDayTeamInput.html +4 -0
  154. package/docs/types/SavePersonInput.html +11 -0
  155. package/docs/types/SavePreferredMatchdayDateInput.html +6 -0
  156. package/docs/types/SaveSeasonInput.html +7 -0
  157. package/docs/types/SaveTeamInput.html +10 -0
  158. package/docs/types/Scalars.html +18 -0
  159. package/docs/types/Season.html +10 -0
  160. package/docs/types/Team.html +12 -0
  161. package/docs/types/_defs.html +1 -0
  162. package/docs/types/webhooks.html +1 -0
  163. package/graphql-codegen.yml +21 -0
  164. package/lib/generated/graphql.model.generated.d.ts +808 -0
  165. package/lib/generated/graphql.model.generated.js +9 -0
  166. package/lib/generated/rest.model.generated.d.ts +333 -0
  167. package/lib/generated/rest.model.generated.js +7 -0
  168. package/lib/index.d.ts +3 -0
  169. package/lib/index.js +20 -0
  170. package/lib/validation.d.ts +34 -0
  171. package/lib/validation.js +413 -0
  172. package/package.json +128 -0
  173. package/rest.yaml +260 -0
  174. package/schema.graphql +541 -0
@@ -0,0 +1,413 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ValidationCheckResult = void 0;
4
+ exports.checkAddress = checkAddress;
5
+ exports.validateAddress = validateAddress;
6
+ exports.checkLeague = checkLeague;
7
+ exports.validateLeague = validateLeague;
8
+ exports.checkClub = checkClub;
9
+ exports.validateClub = validateClub;
10
+ exports.checkGym = checkGym;
11
+ exports.validateGym = validateGym;
12
+ exports.checkSeason = checkSeason;
13
+ exports.validateSeason = validateSeason;
14
+ exports.checkPerson = checkPerson;
15
+ exports.validatePerson = validatePerson;
16
+ exports.checkAssociation = checkAssociation;
17
+ exports.validateAssociation = validateAssociation;
18
+ exports.checkLeagueGroup = checkLeagueGroup;
19
+ exports.validateLeagueGroup = validateLeagueGroup;
20
+ exports.checkTeam = checkTeam;
21
+ exports.validateTeam = validateTeam;
22
+ class ValidationCheckResult {
23
+ constructor() {
24
+ this.warnings = {};
25
+ this.errors = {};
26
+ }
27
+ addWarning(field, message) {
28
+ if (!this.warnings[field]) {
29
+ this.warnings[field] = [];
30
+ }
31
+ this.warnings[field].push(message);
32
+ }
33
+ addError(field, message) {
34
+ if (!this.errors[field]) {
35
+ this.errors[field] = [];
36
+ }
37
+ this.errors[field].push(message);
38
+ }
39
+ getErrorMessages() {
40
+ return Object.values(this.errors).flat();
41
+ }
42
+ getWarningMessages() {
43
+ return Object.values(this.warnings).flat();
44
+ }
45
+ getErrorMessagesString() {
46
+ return this.getErrorMessages().join('; ');
47
+ }
48
+ getWarningMessagesString() {
49
+ return this.getWarningMessages().join('; ');
50
+ }
51
+ validate() {
52
+ if (Object.keys(this.errors).length > 0) {
53
+ throw new Error(this.getErrorMessagesString());
54
+ }
55
+ }
56
+ }
57
+ exports.ValidationCheckResult = ValidationCheckResult;
58
+ function checkAddress(address) {
59
+ const result = new ValidationCheckResult();
60
+ if (address?.city?.trim().length === 0) {
61
+ result.addError('city', 'City is required');
62
+ }
63
+ else if (address.city.length > 200) {
64
+ result.addError('city', 'City cannot exceed 200 characters');
65
+ }
66
+ if (address?.country?.trim().length === 0) {
67
+ result.addError('country', 'Country is required');
68
+ }
69
+ else if (address.country.length > 20) {
70
+ result.addError('country', 'Country cannot exceed 20 characters');
71
+ }
72
+ if (address?.street?.trim().length === 0) {
73
+ result.addError('street', 'Street is required');
74
+ }
75
+ else if (address.street.length > 200) {
76
+ result.addError('street', 'Street cannot exceed 200 characters');
77
+ }
78
+ if (address?.zip?.trim().length === 0) {
79
+ result.addError('zip', 'Zip code is required');
80
+ }
81
+ else if (address.zip.length > 20) {
82
+ result.addError('zip', 'Zip code cannot exceed 20 characters');
83
+ }
84
+ return result;
85
+ }
86
+ function validateAddress(address) {
87
+ const result = checkAddress(address);
88
+ result.validate();
89
+ }
90
+ function checkLeague(league) {
91
+ const result = new ValidationCheckResult();
92
+ // Age range validations
93
+ if (league.minAge != undefined && league.maxAge != undefined) {
94
+ if (league.minAge < 0) {
95
+ result.addError('minAge', 'Minimum age cannot be negative');
96
+ }
97
+ if (league.maxAge < 0) {
98
+ result.addError('maxAge', 'Maximum age cannot be negative');
99
+ }
100
+ if (league.maxAge < league.minAge) {
101
+ result.addError('maxAge', 'Maximum age must be greater than or equal to minimum age');
102
+ }
103
+ if (league.maxAge > 100) { // adjust as needed
104
+ result.addError('maxAge', 'Maximum age exceeds reasonable limit');
105
+ }
106
+ }
107
+ // Name validations
108
+ if (!league.name || league.name.trim().length === 0) {
109
+ result.addError('name', 'League name is required');
110
+ }
111
+ else if (league.name.length > 100) { // adjust max length as needed
112
+ result.addError('name', 'League name cannot exceed 100 characters');
113
+ }
114
+ // Description validation (if required)
115
+ if (league.description && league.description.length > 500) {
116
+ result.addError('description', 'Description cannot exceed 500 characters');
117
+ }
118
+ // Short name validation
119
+ if (league.shortName) {
120
+ if (league.shortName.length > 10) {
121
+ result.addError('shortName', 'Short name cannot exceed 10 characters');
122
+ }
123
+ if (!/^[A-Za-z0-9]+$/.test(league.shortName)) {
124
+ result.addError('shortName', 'Short name can only contain alphanumeric characters');
125
+ }
126
+ }
127
+ return result;
128
+ }
129
+ function validateLeague(league) {
130
+ const result = checkLeague(league);
131
+ result.validate();
132
+ }
133
+ function checkClub(club) {
134
+ const result = new ValidationCheckResult();
135
+ // Full name validations
136
+ if (!club.name || club.name.trim().length === 0) {
137
+ result.addError('name', 'Club name is required');
138
+ }
139
+ else if (club.name.length > 100) {
140
+ result.addError('name', 'Club name cannot exceed 100 characters');
141
+ }
142
+ // Short name validations
143
+ if (club.shortName) {
144
+ if (club.shortName.length > 30) {
145
+ result.addError('shortName', 'Short name cannot exceed 30 characters');
146
+ }
147
+ }
148
+ // Website validation
149
+ if (club.website) {
150
+ try {
151
+ new URL(club.website);
152
+ if (!club.website.startsWith('http://') && !club.website.startsWith('https://')) {
153
+ result.addError('website', 'Website must start with http:// or https://');
154
+ }
155
+ }
156
+ catch {
157
+ result.addError('website', 'Invalid website URL');
158
+ }
159
+ }
160
+ // Address validation
161
+ if (club.address && (club.address.city || club.address.street || club.address.zip)) {
162
+ const addressResult = checkAddress(club.address);
163
+ // Merge address errors into the main result
164
+ Object.entries(addressResult.errors).forEach(([field, messages]) => {
165
+ messages.forEach(message => result.addError(`address.${field}`, message));
166
+ });
167
+ Object.entries(addressResult.warnings).forEach(([field, messages]) => {
168
+ messages.forEach(message => result.addWarning(`address.${field}`, message));
169
+ });
170
+ }
171
+ return result;
172
+ }
173
+ function validateClub(club) {
174
+ const result = checkClub(club);
175
+ result.validate();
176
+ }
177
+ function checkGym(gym) {
178
+ const result = new ValidationCheckResult();
179
+ // Name validations
180
+ if (!gym.name || gym.name.trim().length === 0) {
181
+ result.addError('name', 'Gym name is required');
182
+ }
183
+ else if (gym.name.length > 100) {
184
+ result.addError('name', 'Gym name cannot exceed 100 characters');
185
+ }
186
+ // available fields validation
187
+ if (!gym.availableFields || gym.availableFields.trim().length === 0) {
188
+ result.addError('availableFields', 'Available fields are required');
189
+ }
190
+ // Address validations
191
+ const addressResult = checkAddress(gym.address);
192
+ // Merge address errors into the main result
193
+ Object.entries(addressResult.errors).forEach(([field, messages]) => {
194
+ messages.forEach(message => result.addError(`address.${field}`, message));
195
+ });
196
+ Object.entries(addressResult.warnings).forEach(([field, messages]) => {
197
+ messages.forEach(message => result.addWarning(`address.${field}`, message));
198
+ });
199
+ return result;
200
+ }
201
+ function validateGym(gym) {
202
+ const result = checkGym(gym);
203
+ result.validate();
204
+ }
205
+ function checkSeason(season) {
206
+ const result = new ValidationCheckResult();
207
+ // Name validations
208
+ if (!season.name || season.name.trim().length === 0) {
209
+ result.addError('name', 'Season name is required');
210
+ }
211
+ else if (season.name.length > 100) {
212
+ result.addError('name', 'Season name cannot exceed 100 characters');
213
+ }
214
+ // Check for valid dates
215
+ const startDate = new Date(season.startDate);
216
+ const endDate = new Date(season.endDate);
217
+ const registrationEnd = new Date(season.registrationEnd);
218
+ if (isNaN(startDate.getTime()) || isNaN(endDate.getTime()) || isNaN(registrationEnd.getTime())) {
219
+ result.addError('dates', 'Invalid date format');
220
+ }
221
+ if (season.registrationStart) {
222
+ const registrationStart = new Date(season.registrationStart);
223
+ if (isNaN(registrationStart.getTime())) {
224
+ result.addError('registrationStart', 'Invalid date format');
225
+ }
226
+ }
227
+ // Season date validations
228
+ if (endDate <= startDate) {
229
+ result.addError('endDate', 'Season end date must be after start date');
230
+ }
231
+ // Registration period validations
232
+ if (season.registrationStart) {
233
+ const registrationStart = new Date(season.registrationStart);
234
+ if (registrationStart) {
235
+ if (registrationEnd <= registrationStart) {
236
+ result.addError('registrationEnd', 'Registration end date must be after registration start date');
237
+ }
238
+ if (registrationStart >= startDate) {
239
+ result.addError('registrationStart', 'Registration must start before season start date');
240
+ }
241
+ }
242
+ }
243
+ if (registrationEnd > startDate) {
244
+ result.addError('registrationEnd', 'Registration must end before season start date');
245
+ }
246
+ // Future date validation
247
+ const now = new Date();
248
+ if (startDate < now) {
249
+ result.addError('startDate', 'Season start date cannot be in the past');
250
+ }
251
+ return result;
252
+ }
253
+ function validateSeason(season) {
254
+ const result = checkSeason(season);
255
+ result.validate();
256
+ }
257
+ function checkPerson(person) {
258
+ const result = new ValidationCheckResult();
259
+ // Name validations
260
+ if (!person.firstName?.trim()) {
261
+ result.addError('firstName', 'First name is required');
262
+ }
263
+ if (!person.lastName?.trim()) {
264
+ result.addError('lastName', 'Last name is required');
265
+ }
266
+ // Email validation
267
+ if (person.email && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(person.email)) {
268
+ result.addError('email', 'Invalid email format');
269
+ }
270
+ // Phone number validation
271
+ if (person.phone) {
272
+ // Allow digits, spaces, +, -, and ()
273
+ const phoneRegex = /^[\d\s+()-]{8,20}$/;
274
+ if (!phoneRegex.test(person.phone)) {
275
+ result.addError('phone', 'Invalid phone number format');
276
+ }
277
+ }
278
+ // Date of birth validation
279
+ if (person.dateOfBirth) {
280
+ const date = new Date(person.dateOfBirth);
281
+ if (isNaN(date.getTime())) {
282
+ result.addError('dateOfBirth', 'Invalid date of birth format');
283
+ }
284
+ // Add age restrictions if needed
285
+ const today = new Date();
286
+ if (date > today) {
287
+ result.addError('dateOfBirth', 'Date of birth cannot be in the future');
288
+ }
289
+ }
290
+ // Address validation
291
+ if (person.address && (person.address.city || person.address.street || person.address.zip)) {
292
+ const addressResult = checkAddress(person.address);
293
+ // Merge address errors into the main result
294
+ Object.entries(addressResult.errors).forEach(([field, messages]) => {
295
+ messages.forEach(message => result.addError(`address.${field}`, message));
296
+ });
297
+ Object.entries(addressResult.warnings).forEach(([field, messages]) => {
298
+ messages.forEach(message => result.addWarning(`address.${field}`, message));
299
+ });
300
+ }
301
+ return result;
302
+ }
303
+ function validatePerson(person) {
304
+ const result = checkPerson(person);
305
+ result.validate();
306
+ }
307
+ function checkAssociation(association) {
308
+ const result = new ValidationCheckResult();
309
+ // Name validation
310
+ if (!association.name?.trim()) {
311
+ result.addError('name', 'Association name is required');
312
+ }
313
+ else if (association.name.length > 100) { // adjust max length as needed
314
+ result.addError('name', 'Association name cannot exceed 100 characters');
315
+ }
316
+ // Contact Email validation
317
+ if (!association.contactEmail?.trim()) {
318
+ result.addError('contactEmail', 'Contact email is required');
319
+ }
320
+ else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(association.contactEmail)) {
321
+ result.addError('contactEmail', 'Invalid contact email format');
322
+ }
323
+ // Contact Name validation
324
+ if (!association.contactName?.trim()) {
325
+ result.addError('contactName', 'Contact name is required');
326
+ }
327
+ // Address validation
328
+ const addressResult = checkAddress(association.address);
329
+ // Merge address errors into the main result
330
+ Object.entries(addressResult.errors).forEach(([field, messages]) => {
331
+ messages.forEach(message => result.addError(`address.${field}`, message));
332
+ });
333
+ Object.entries(addressResult.warnings).forEach(([field, messages]) => {
334
+ messages.forEach(message => result.addWarning(`address.${field}`, message));
335
+ });
336
+ return result;
337
+ }
338
+ function validateAssociation(association) {
339
+ const result = checkAssociation(association);
340
+ result.validate();
341
+ }
342
+ function checkLeagueGroup(leagueGroup) {
343
+ const result = new ValidationCheckResult();
344
+ // Name validations
345
+ if (!leagueGroup.name || leagueGroup.name.trim().length === 0) {
346
+ result.addError('name', 'League group name is required');
347
+ }
348
+ else if (leagueGroup.name.length > 100) {
349
+ result.addError('name', 'League group name cannot exceed 100 characters');
350
+ }
351
+ // Number validation
352
+ if (leagueGroup.number < 1) {
353
+ result.addError('number', 'League group number must be positive');
354
+ }
355
+ // Short name validations
356
+ if (!leagueGroup.shortName || leagueGroup.shortName.trim().length === 0) {
357
+ result.addError('shortName', 'League group short name is required');
358
+ }
359
+ else if (leagueGroup.shortName.length > 10) {
360
+ result.addError('shortName', 'League group short name cannot exceed 10 characters');
361
+ }
362
+ else if (!/^[A-Za-z0-9]+$/.test(leagueGroup.shortName)) {
363
+ result.addError('shortName', 'League group short name can only contain alphanumeric characters');
364
+ }
365
+ // Regulation validation
366
+ if (!leagueGroup.regulation || leagueGroup.regulation.trim().length === 0) {
367
+ result.addError('regulation', 'League group regulation is required');
368
+ }
369
+ return result;
370
+ }
371
+ function validateLeagueGroup(leagueGroup) {
372
+ const result = checkLeagueGroup(leagueGroup);
373
+ result.validate();
374
+ }
375
+ function checkTeam(team) {
376
+ const result = new ValidationCheckResult();
377
+ // Name validation
378
+ if ('name' in team && team.name !== undefined) {
379
+ if (team.name.trim().length === 0) {
380
+ result.addError('name', 'Team name cannot be empty');
381
+ }
382
+ else if (team.name.length > 100) {
383
+ result.addError('name', 'Team name cannot exceed 100 characters');
384
+ }
385
+ }
386
+ else if (!('id' in team)) { // if id is not in team, then it is a new team
387
+ result.addError('name', 'Team name is required');
388
+ }
389
+ // League ID validation
390
+ if ('leagueId' in team && team.leagueId !== undefined) {
391
+ if (team.leagueId.trim().length === 0) {
392
+ result.addError('leagueId', 'League ID cannot be empty');
393
+ }
394
+ else if (team.leagueId.length > 100) {
395
+ result.addError('leagueId', 'League ID cannot exceed 100 characters');
396
+ }
397
+ }
398
+ else if (!('id' in team)) { // if id is not in team, then it is a new team
399
+ result.addError('leagueId', 'League ID is required');
400
+ }
401
+ // Exemption request validation
402
+ if (team.exemptionRequest) {
403
+ if (team.exemptionRequest.trim().length > 1000) {
404
+ result.addError('exemptionRequest', 'Exemption request cannot exceed 1000 characters');
405
+ }
406
+ }
407
+ return result;
408
+ }
409
+ function validateTeam(team) {
410
+ const result = checkTeam(team);
411
+ result.validate();
412
+ }
413
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92YWxpZGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTRDQSxvQ0E0QkM7QUFFRCwwQ0FHQztBQUVELGtDQTBDQztBQUVELHdDQUdDO0FBRUQsOEJBMENDO0FBRUQsb0NBR0M7QUFFRCw0QkEwQkM7QUFFRCxrQ0FHQztBQUVELGtDQXVEQztBQUVELHdDQUdDO0FBRUQsa0NBb0RDO0FBRUQsd0NBR0M7QUFFRCw0Q0FpQ0M7QUFFRCxrREFHQztBQUVELDRDQThCQztBQUVELGtEQUdDO0FBRUQsOEJBaUNDO0FBRUQsb0NBR0M7QUE1YkQsTUFBYSxxQkFBcUI7SUFBbEM7UUFFa0IsYUFBUSxHQUFrQyxFQUFFLENBQUM7UUFDN0MsV0FBTSxHQUFrQyxFQUFFLENBQUM7SUFxQzdELENBQUM7SUFuQ1EsVUFBVSxDQUFDLEtBQWEsRUFBRSxPQUFlO1FBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDNUIsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTSxRQUFRLENBQUMsS0FBYSxFQUFFLE9BQWU7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUMxQixDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVNLGdCQUFnQjtRQUNyQixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzNDLENBQUM7SUFFTSxrQkFBa0I7UUFDdkIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QyxDQUFDO0lBRU0sc0JBQXNCO1FBQzNCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTSx3QkFBd0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVNLFFBQVE7UUFDYixJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUM7UUFDakQsQ0FBQztJQUNILENBQUM7Q0FDRjtBQXhDRCxzREF3Q0M7QUFFRCxTQUFnQixZQUFZLENBQUMsT0FBZ0I7SUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO0lBRTNDLElBQUksT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztJQUM5QyxDQUFDO1NBQU0sSUFBSSxPQUFPLENBQUMsSUFBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUN0QyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxtQ0FBbUMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxJQUFJLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLHFCQUFxQixDQUFDLENBQUM7SUFDcEQsQ0FBQztTQUFNLElBQUksT0FBTyxDQUFDLE9BQVEsQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDeEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUscUNBQXFDLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQsSUFBSSxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQ2xELENBQUM7U0FBTSxJQUFJLE9BQU8sQ0FBQyxNQUFPLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLHFDQUFxQyxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELElBQUksT0FBTyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUNqRCxDQUFDO1NBQU0sSUFBSSxPQUFPLENBQUMsR0FBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQztRQUNwQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxzQ0FBc0MsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBZ0IsZUFBZSxDQUFDLE9BQWdCO0lBQzlDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNyQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDcEIsQ0FBQztBQUVELFNBQWdCLFdBQVcsQ0FBQyxNQUEyQztJQUNyRSxNQUFNLE1BQU0sR0FBRyxJQUFJLHFCQUFxQixFQUFFLENBQUM7SUFFM0Msd0JBQXdCO0lBQ3hCLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxTQUFTLElBQUksTUFBTSxDQUFDLE1BQU0sSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUM3RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDdEIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLGdDQUFnQyxDQUFDLENBQUM7UUFDOUQsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsMERBQTBELENBQUMsQ0FBQztRQUN4RixDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsbUJBQW1CO1lBQzVDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLHNDQUFzQyxDQUFDLENBQUM7UUFDcEUsQ0FBQztJQUNILENBQUM7SUFFRCxtQkFBbUI7SUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDcEQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUseUJBQXlCLENBQUMsQ0FBQztJQUNyRCxDQUFDO1NBQU0sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLDhCQUE4QjtRQUNuRSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSwwQ0FBMEMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCx1Q0FBdUM7SUFDdkMsSUFBSSxNQUFNLENBQUMsV0FBVyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQzFELE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLDBDQUEwQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELHdCQUF3QjtJQUN4QixJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQixJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLHdDQUF3QyxDQUFDLENBQUM7UUFDekUsQ0FBQztRQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDN0MsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUscURBQXFELENBQUMsQ0FBQztRQUN0RixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFnQixjQUFjLENBQUMsTUFBMkM7SUFDeEUsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUNwQixDQUFDO0FBRUQsU0FBZ0IsU0FBUyxDQUFDLElBQXFDO0lBQzdELE1BQU0sTUFBTSxHQUFHLElBQUkscUJBQXFCLEVBQUUsQ0FBQztJQUUzQyx3QkFBd0I7SUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDaEQsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztJQUNuRCxDQUFDO1NBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNsQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSx3Q0FBd0MsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRCx5QkFBeUI7SUFDekIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDbkIsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUMvQixNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSx3Q0FBd0MsQ0FBQyxDQUFDO1FBQ3pFLENBQUM7SUFDSCxDQUFDO0lBRUQscUJBQXFCO0lBQ3JCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQztZQUNILElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO2dCQUNoRixNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSw2Q0FBNkMsQ0FBQyxDQUFDO1lBQzVFLENBQUM7UUFDSCxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUNwRCxDQUFDO0lBQ0gsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDbkYsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNqRCw0Q0FBNEM7UUFDNUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRTtZQUNqRSxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEtBQUssRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDNUUsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFO1lBQ25FLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLFdBQVcsS0FBSyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM5RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBZ0IsWUFBWSxDQUFDLElBQXFDO0lBQ2hFLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDcEIsQ0FBQztBQUVELFNBQWdCLFFBQVEsQ0FBQyxHQUFrQztJQUN6RCxNQUFNLE1BQU0sR0FBRyxJQUFJLHFCQUFxQixFQUFFLENBQUM7SUFFM0MsbUJBQW1CO0lBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzlDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFDbEQsQ0FBQztTQUFNLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDakMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsdUNBQXVDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsOEJBQThCO0lBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3BFLE1BQU0sQ0FBQyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsK0JBQStCLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDaEQsNENBQTRDO0lBQzVDLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUU7UUFDakUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxLQUFLLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRTtRQUNuRSxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEtBQUssRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDOUUsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBZ0IsV0FBVyxDQUFDLEdBQWtDO0lBQzVELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QixNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDcEIsQ0FBQztBQUVELFNBQWdCLFdBQVcsQ0FBQyxNQUEyQztJQUNyRSxNQUFNLE1BQU0sR0FBRyxJQUFJLHFCQUFxQixFQUFFLENBQUM7SUFFM0MsbUJBQW1CO0lBQ25CLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3BELE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLHlCQUF5QixDQUFDLENBQUM7SUFDckQsQ0FBQztTQUFNLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDcEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsMENBQTBDLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsd0JBQXdCO0lBQ3hCLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3QyxNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsTUFBTSxlQUFlLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBRXpELElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztRQUMvRixNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzdCLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDN0QsSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUM5RCxDQUFDO0lBQ0gsQ0FBQztJQUVELDBCQUEwQjtJQUMxQixJQUFJLE9BQU8sSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUN6QixNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSwwQ0FBMEMsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRCxrQ0FBa0M7SUFDbEMsSUFBSSxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM3QixNQUFNLGlCQUFpQixHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzdELElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUN0QixJQUFJLGVBQWUsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO2dCQUN6QyxNQUFNLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLDZEQUE2RCxDQUFDLENBQUM7WUFDcEcsQ0FBQztZQUNELElBQUksaUJBQWlCLElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ25DLE1BQU0sQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsa0RBQWtELENBQUMsQ0FBQztZQUMzRixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLGVBQWUsR0FBRyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxNQUFNLENBQUMsUUFBUSxDQUFDLGlCQUFpQixFQUFFLGdEQUFnRCxDQUFDLENBQUM7SUFDdkYsQ0FBQztJQUVELHlCQUF5QjtJQUN6QixNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQ3ZCLElBQUksU0FBUyxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLHlDQUF5QyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFnQixjQUFjLENBQUMsTUFBMkM7SUFDeEUsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUNwQixDQUFDO0FBRUQsU0FBZ0IsV0FBVyxDQUFDLE1BQTJDO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLElBQUkscUJBQXFCLEVBQUUsQ0FBQztJQUUzQyxtQkFBbUI7SUFDbkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUM5QixNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQzdCLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLHVCQUF1QixDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELG1CQUFtQjtJQUNuQixJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDckUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsMEJBQTBCO0lBQzFCLElBQUksTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pCLHFDQUFxQztRQUNyQyxNQUFNLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQztRQUN4QyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNuQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO1FBQzFELENBQUM7SUFDSCxDQUFDO0lBRUQsMkJBQTJCO0lBQzNCLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLDhCQUE4QixDQUFDLENBQUM7UUFDakUsQ0FBQztRQUNELGlDQUFpQztRQUNqQyxNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3pCLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLHVDQUF1QyxDQUFDLENBQUM7UUFDMUUsQ0FBQztJQUNILENBQUM7SUFFRCxxQkFBcUI7SUFDckIsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzNGLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkQsNENBQTRDO1FBQzVDLE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUU7WUFDakUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxLQUFLLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzVFLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRTtZQUNuRSxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEtBQUssRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDOUUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQWdCLGNBQWMsQ0FBQyxNQUEyQztJQUN4RSxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3BCLENBQUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxXQUEwRDtJQUN6RixNQUFNLE1BQU0sR0FBRyxJQUFJLHFCQUFxQixFQUFFLENBQUM7SUFFM0Msa0JBQWtCO0lBQ2xCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUM7UUFDOUIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsOEJBQThCLENBQUMsQ0FBQztJQUMxRCxDQUFDO1NBQU0sSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLDhCQUE4QjtRQUN4RSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSwrQ0FBK0MsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRCwyQkFBMkI7SUFDM0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztRQUN0QyxNQUFNLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO0lBQy9ELENBQUM7U0FBTSxJQUFJLENBQUMsNEJBQTRCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQ3hFLE1BQU0sQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLDhCQUE4QixDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELDBCQUEwQjtJQUMxQixJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLDBCQUEwQixDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELHFCQUFxQjtJQUNyQixNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hELDRDQUE0QztJQUM1QyxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFO1FBQ2pFLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsS0FBSyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0sQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEVBQUU7UUFDbkUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsV0FBVyxLQUFLLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzlFLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQWdCLG1CQUFtQixDQUFDLFdBQTBEO0lBQzVGLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUNwQixDQUFDO0FBRUQsU0FBZ0IsZ0JBQWdCLENBQUMsV0FBMEQ7SUFDekYsTUFBTSxNQUFNLEdBQUcsSUFBSSxxQkFBcUIsRUFBRSxDQUFDO0lBRTNDLG1CQUFtQjtJQUNuQixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM5RCxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO0lBQzNELENBQUM7U0FBTSxJQUFJLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ3pDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLGdEQUFnRCxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVELG9CQUFvQjtJQUNwQixJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDM0IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsc0NBQXNDLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQseUJBQXlCO0lBQ3pCLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hFLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLHFDQUFxQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztTQUFNLElBQUksV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDN0MsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUscURBQXFELENBQUMsQ0FBQztJQUN0RixDQUFDO1NBQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztRQUN6RCxNQUFNLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxrRUFBa0UsQ0FBQyxDQUFDO0lBQ25HLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDMUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUscUNBQXFDLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQWdCLG1CQUFtQixDQUFDLFdBQTBEO0lBQzVGLE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUNwQixDQUFDO0FBRUQsU0FBZ0IsU0FBUyxDQUFDLElBQXlEO0lBQ2pGLE1BQU0sTUFBTSxHQUFHLElBQUkscUJBQXFCLEVBQUUsQ0FBQztJQUUzQyxrQkFBa0I7SUFDbEIsSUFBSSxNQUFNLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDOUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLHdDQUF3QyxDQUFDLENBQUM7UUFDcEUsQ0FBQztJQUNILENBQUM7U0FBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLDhDQUE4QztRQUMxRSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCx1QkFBdUI7SUFDdkIsSUFBSSxVQUFVLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDdEQsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUN0QyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO1FBQzNELENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLHdDQUF3QyxDQUFDLENBQUM7UUFDeEUsQ0FBQztJQUNILENBQUM7U0FBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLDhDQUE4QztRQUMxRSxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCwrQkFBK0I7SUFDL0IsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxFQUFFLENBQUM7WUFDL0MsTUFBTSxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxpREFBaUQsQ0FBQyxDQUFDO1FBQ3pGLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQWdCLFlBQVksQ0FBQyxJQUF5RDtJQUNwRixNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZGRyZXNzLCBNb2RpZnlBc3NvY2lhdGlvbklucHV0LCBNb2RpZnlDbHViSW5wdXQsIE1vZGlmeUd5bUlucHV0LCBNb2RpZnlMZWFndWVJbnB1dCwgTW9kaWZ5UGVyc29uSW5wdXQsIE1vZGlmeVNlYXNvbklucHV0LCBTYXZlQXNzb2NpYXRpb25JbnB1dCwgU2F2ZUNsdWJJbnB1dCwgU2F2ZUd5bUlucHV0LCBTYXZlTGVhZ3VlR3JvdXBJbnB1dCwgU2F2ZUxlYWd1ZUlucHV0LCBTYXZlUGVyc29uSW5wdXQsIFNhdmVTZWFzb25JbnB1dCwgTW9kaWZ5TGVhZ3VlR3JvdXBJbnB1dCwgU2F2ZVRlYW1JbnB1dCwgTW9kaWZ5VGVhbUlucHV0LCBSZWdpc3RlclRlYW1JbnB1dCB9IGZyb20gJ0BnZW5lcmF0ZWQvZ3JhcGhxbC5tb2RlbC5nZW5lcmF0ZWQnO1xuXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbkNoZWNrUmVzdWx0IHtcblxuICBwdWJsaWMgcmVhZG9ubHkgd2FybmluZ3M6IHsgW2ZpZWxkOiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG4gIHB1YmxpYyByZWFkb25seSBlcnJvcnM6IHsgW2ZpZWxkOiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG5cbiAgcHVibGljIGFkZFdhcm5pbmcoZmllbGQ6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLndhcm5pbmdzW2ZpZWxkXSkge1xuICAgICAgdGhpcy53YXJuaW5nc1tmaWVsZF0gPSBbXTtcbiAgICB9XG4gICAgdGhpcy53YXJuaW5nc1tmaWVsZF0ucHVzaChtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRFcnJvcihmaWVsZDogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZXJyb3JzW2ZpZWxkXSkge1xuICAgICAgdGhpcy5lcnJvcnNbZmllbGRdID0gW107XG4gICAgfVxuICAgIHRoaXMuZXJyb3JzW2ZpZWxkXS5wdXNoKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIGdldEVycm9yTWVzc2FnZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHRoaXMuZXJyb3JzKS5mbGF0KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0V2FybmluZ01lc3NhZ2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLndhcm5pbmdzKS5mbGF0KCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RXJyb3JNZXNzYWdlc1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldEVycm9yTWVzc2FnZXMoKS5qb2luKCc7ICcpO1xuICB9XG5cbiAgcHVibGljIGdldFdhcm5pbmdNZXNzYWdlc1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmdldFdhcm5pbmdNZXNzYWdlcygpLmpvaW4oJzsgJyk7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoKTogdm9pZCB7XG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuZXJyb3JzKS5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5nZXRFcnJvck1lc3NhZ2VzU3RyaW5nKCkpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tBZGRyZXNzKGFkZHJlc3M6IEFkZHJlc3MpOiBWYWxpZGF0aW9uQ2hlY2tSZXN1bHQge1xuICBjb25zdCByZXN1bHQgPSBuZXcgVmFsaWRhdGlvbkNoZWNrUmVzdWx0KCk7XG5cbiAgaWYgKGFkZHJlc3M/LmNpdHk/LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2NpdHknLCAnQ2l0eSBpcyByZXF1aXJlZCcpO1xuICB9IGVsc2UgaWYgKGFkZHJlc3MuY2l0eSEubGVuZ3RoID4gMjAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdjaXR5JywgJ0NpdHkgY2Fubm90IGV4Y2VlZCAyMDAgY2hhcmFjdGVycycpO1xuICB9XG5cbiAgaWYgKGFkZHJlc3M/LmNvdW50cnk/LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2NvdW50cnknLCAnQ291bnRyeSBpcyByZXF1aXJlZCcpO1xuICB9IGVsc2UgaWYgKGFkZHJlc3MuY291bnRyeSEubGVuZ3RoID4gMjApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2NvdW50cnknLCAnQ291bnRyeSBjYW5ub3QgZXhjZWVkIDIwIGNoYXJhY3RlcnMnKTtcbiAgfVxuXG4gIGlmIChhZGRyZXNzPy5zdHJlZXQ/LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ3N0cmVldCcsICdTdHJlZXQgaXMgcmVxdWlyZWQnKTtcbiAgfSBlbHNlIGlmIChhZGRyZXNzLnN0cmVldCEubGVuZ3RoID4gMjAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdzdHJlZXQnLCAnU3RyZWV0IGNhbm5vdCBleGNlZWQgMjAwIGNoYXJhY3RlcnMnKTtcbiAgfVxuXG4gIGlmIChhZGRyZXNzPy56aXA/LnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ3ppcCcsICdaaXAgY29kZSBpcyByZXF1aXJlZCcpO1xuICB9IGVsc2UgaWYgKGFkZHJlc3MuemlwIS5sZW5ndGggPiAyMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignemlwJywgJ1ppcCBjb2RlIGNhbm5vdCBleGNlZWQgMjAgY2hhcmFjdGVycycpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlQWRkcmVzcyhhZGRyZXNzOiBBZGRyZXNzKTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrQWRkcmVzcyhhZGRyZXNzKTtcbiAgcmVzdWx0LnZhbGlkYXRlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0xlYWd1ZShsZWFndWU6IFNhdmVMZWFndWVJbnB1dCB8IE1vZGlmeUxlYWd1ZUlucHV0KTogVmFsaWRhdGlvbkNoZWNrUmVzdWx0IHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25DaGVja1Jlc3VsdCgpO1xuXG4gIC8vIEFnZSByYW5nZSB2YWxpZGF0aW9uc1xuICBpZiAobGVhZ3VlLm1pbkFnZSAhPSB1bmRlZmluZWQgJiYgbGVhZ3VlLm1heEFnZSAhPSB1bmRlZmluZWQpIHtcbiAgICBpZiAobGVhZ3VlLm1pbkFnZSA8IDApIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignbWluQWdlJywgJ01pbmltdW0gYWdlIGNhbm5vdCBiZSBuZWdhdGl2ZScpO1xuICAgIH1cbiAgICBpZiAobGVhZ3VlLm1heEFnZSA8IDApIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignbWF4QWdlJywgJ01heGltdW0gYWdlIGNhbm5vdCBiZSBuZWdhdGl2ZScpO1xuICAgIH1cbiAgICBpZiAobGVhZ3VlLm1heEFnZSA8IGxlYWd1ZS5taW5BZ2UpIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignbWF4QWdlJywgJ01heGltdW0gYWdlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIG1pbmltdW0gYWdlJyk7XG4gICAgfVxuICAgIGlmIChsZWFndWUubWF4QWdlID4gMTAwKSB7IC8vIGFkanVzdCBhcyBuZWVkZWRcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignbWF4QWdlJywgJ01heGltdW0gYWdlIGV4Y2VlZHMgcmVhc29uYWJsZSBsaW1pdCcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5hbWUgdmFsaWRhdGlvbnNcbiAgaWYgKCFsZWFndWUubmFtZSB8fCBsZWFndWUubmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCduYW1lJywgJ0xlYWd1ZSBuYW1lIGlzIHJlcXVpcmVkJyk7XG4gIH0gZWxzZSBpZiAobGVhZ3VlLm5hbWUubGVuZ3RoID4gMTAwKSB7IC8vIGFkanVzdCBtYXggbGVuZ3RoIGFzIG5lZWRlZFxuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdMZWFndWUgbmFtZSBjYW5ub3QgZXhjZWVkIDEwMCBjaGFyYWN0ZXJzJyk7XG4gIH1cblxuICAvLyBEZXNjcmlwdGlvbiB2YWxpZGF0aW9uIChpZiByZXF1aXJlZClcbiAgaWYgKGxlYWd1ZS5kZXNjcmlwdGlvbiAmJiBsZWFndWUuZGVzY3JpcHRpb24ubGVuZ3RoID4gNTAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdkZXNjcmlwdGlvbicsICdEZXNjcmlwdGlvbiBjYW5ub3QgZXhjZWVkIDUwMCBjaGFyYWN0ZXJzJyk7XG4gIH1cblxuICAvLyBTaG9ydCBuYW1lIHZhbGlkYXRpb25cbiAgaWYgKGxlYWd1ZS5zaG9ydE5hbWUpIHtcbiAgICBpZiAobGVhZ3VlLnNob3J0TmFtZS5sZW5ndGggPiAxMCkge1xuICAgICAgcmVzdWx0LmFkZEVycm9yKCdzaG9ydE5hbWUnLCAnU2hvcnQgbmFtZSBjYW5ub3QgZXhjZWVkIDEwIGNoYXJhY3RlcnMnKTtcbiAgICB9XG4gICAgaWYgKCEvXltBLVphLXowLTldKyQvLnRlc3QobGVhZ3VlLnNob3J0TmFtZSkpIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignc2hvcnROYW1lJywgJ1Nob3J0IG5hbWUgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUxlYWd1ZShsZWFndWU6IFNhdmVMZWFndWVJbnB1dCB8IE1vZGlmeUxlYWd1ZUlucHV0KTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrTGVhZ3VlKGxlYWd1ZSk7XG4gIHJlc3VsdC52YWxpZGF0ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tDbHViKGNsdWI6IFNhdmVDbHViSW5wdXQgfCBNb2RpZnlDbHViSW5wdXQpOiBWYWxpZGF0aW9uQ2hlY2tSZXN1bHQge1xuICBjb25zdCByZXN1bHQgPSBuZXcgVmFsaWRhdGlvbkNoZWNrUmVzdWx0KCk7XG5cbiAgLy8gRnVsbCBuYW1lIHZhbGlkYXRpb25zXG4gIGlmICghY2x1Yi5uYW1lIHx8IGNsdWIubmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCduYW1lJywgJ0NsdWIgbmFtZSBpcyByZXF1aXJlZCcpO1xuICB9IGVsc2UgaWYgKGNsdWIubmFtZS5sZW5ndGggPiAxMDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ25hbWUnLCAnQ2x1YiBuYW1lIGNhbm5vdCBleGNlZWQgMTAwIGNoYXJhY3RlcnMnKTtcbiAgfVxuXG4gIC8vIFNob3J0IG5hbWUgdmFsaWRhdGlvbnNcbiAgaWYgKGNsdWIuc2hvcnROYW1lKSB7XG4gICAgaWYgKGNsdWIuc2hvcnROYW1lLmxlbmd0aCA+IDMwKSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3IoJ3Nob3J0TmFtZScsICdTaG9ydCBuYW1lIGNhbm5vdCBleGNlZWQgMzAgY2hhcmFjdGVycycpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFdlYnNpdGUgdmFsaWRhdGlvblxuICBpZiAoY2x1Yi53ZWJzaXRlKSB7XG4gICAgdHJ5IHtcbiAgICAgIG5ldyBVUkwoY2x1Yi53ZWJzaXRlKTtcbiAgICAgIGlmICghY2x1Yi53ZWJzaXRlLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSAmJiAhY2x1Yi53ZWJzaXRlLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpIHtcbiAgICAgICAgcmVzdWx0LmFkZEVycm9yKCd3ZWJzaXRlJywgJ1dlYnNpdGUgbXVzdCBzdGFydCB3aXRoIGh0dHA6Ly8gb3IgaHR0cHM6Ly8nKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignd2Vic2l0ZScsICdJbnZhbGlkIHdlYnNpdGUgVVJMJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkcmVzcyB2YWxpZGF0aW9uXG4gIGlmIChjbHViLmFkZHJlc3MgJiYgKGNsdWIuYWRkcmVzcy5jaXR5IHx8IGNsdWIuYWRkcmVzcy5zdHJlZXQgfHwgY2x1Yi5hZGRyZXNzLnppcCkpIHtcbiAgICBjb25zdCBhZGRyZXNzUmVzdWx0ID0gY2hlY2tBZGRyZXNzKGNsdWIuYWRkcmVzcyk7XG4gICAgLy8gTWVyZ2UgYWRkcmVzcyBlcnJvcnMgaW50byB0aGUgbWFpbiByZXN1bHRcbiAgICBPYmplY3QuZW50cmllcyhhZGRyZXNzUmVzdWx0LmVycm9ycykuZm9yRWFjaCgoW2ZpZWxkLCBtZXNzYWdlc10pID0+IHtcbiAgICAgIG1lc3NhZ2VzLmZvckVhY2gobWVzc2FnZSA9PiByZXN1bHQuYWRkRXJyb3IoYGFkZHJlc3MuJHtmaWVsZH1gLCBtZXNzYWdlKSk7XG4gICAgfSk7XG4gICAgT2JqZWN0LmVudHJpZXMoYWRkcmVzc1Jlc3VsdC53YXJuaW5ncykuZm9yRWFjaCgoW2ZpZWxkLCBtZXNzYWdlc10pID0+IHtcbiAgICAgIG1lc3NhZ2VzLmZvckVhY2gobWVzc2FnZSA9PiByZXN1bHQuYWRkV2FybmluZyhgYWRkcmVzcy4ke2ZpZWxkfWAsIG1lc3NhZ2UpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUNsdWIoY2x1YjogU2F2ZUNsdWJJbnB1dCB8IE1vZGlmeUNsdWJJbnB1dCk6IHZvaWQge1xuICBjb25zdCByZXN1bHQgPSBjaGVja0NsdWIoY2x1Yik7XG4gIHJlc3VsdC52YWxpZGF0ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tHeW0oZ3ltOiBTYXZlR3ltSW5wdXQgfCBNb2RpZnlHeW1JbnB1dCk6IFZhbGlkYXRpb25DaGVja1Jlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uQ2hlY2tSZXN1bHQoKTtcblxuICAvLyBOYW1lIHZhbGlkYXRpb25zXG4gIGlmICghZ3ltLm5hbWUgfHwgZ3ltLm5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdHeW0gbmFtZSBpcyByZXF1aXJlZCcpO1xuICB9IGVsc2UgaWYgKGd5bS5uYW1lLmxlbmd0aCA+IDEwMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdHeW0gbmFtZSBjYW5ub3QgZXhjZWVkIDEwMCBjaGFyYWN0ZXJzJyk7XG4gIH1cblxuICAvLyBhdmFpbGFibGUgZmllbGRzIHZhbGlkYXRpb25cbiAgaWYgKCFneW0uYXZhaWxhYmxlRmllbGRzIHx8IGd5bS5hdmFpbGFibGVGaWVsZHMudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignYXZhaWxhYmxlRmllbGRzJywgJ0F2YWlsYWJsZSBmaWVsZHMgYXJlIHJlcXVpcmVkJyk7XG4gIH1cblxuICAvLyBBZGRyZXNzIHZhbGlkYXRpb25zXG4gIGNvbnN0IGFkZHJlc3NSZXN1bHQgPSBjaGVja0FkZHJlc3MoZ3ltLmFkZHJlc3MpO1xuICAvLyBNZXJnZSBhZGRyZXNzIGVycm9ycyBpbnRvIHRoZSBtYWluIHJlc3VsdFxuICBPYmplY3QuZW50cmllcyhhZGRyZXNzUmVzdWx0LmVycm9ycykuZm9yRWFjaCgoW2ZpZWxkLCBtZXNzYWdlc10pID0+IHtcbiAgICBtZXNzYWdlcy5mb3JFYWNoKG1lc3NhZ2UgPT4gcmVzdWx0LmFkZEVycm9yKGBhZGRyZXNzLiR7ZmllbGR9YCwgbWVzc2FnZSkpO1xuICB9KTtcbiAgT2JqZWN0LmVudHJpZXMoYWRkcmVzc1Jlc3VsdC53YXJuaW5ncykuZm9yRWFjaCgoW2ZpZWxkLCBtZXNzYWdlc10pID0+IHtcbiAgICBtZXNzYWdlcy5mb3JFYWNoKG1lc3NhZ2UgPT4gcmVzdWx0LmFkZFdhcm5pbmcoYGFkZHJlc3MuJHtmaWVsZH1gLCBtZXNzYWdlKSk7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUd5bShneW06IFNhdmVHeW1JbnB1dCB8IE1vZGlmeUd5bUlucHV0KTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrR3ltKGd5bSk7XG4gIHJlc3VsdC52YWxpZGF0ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tTZWFzb24oc2Vhc29uOiBTYXZlU2Vhc29uSW5wdXQgfCBNb2RpZnlTZWFzb25JbnB1dCk6IFZhbGlkYXRpb25DaGVja1Jlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uQ2hlY2tSZXN1bHQoKTtcblxuICAvLyBOYW1lIHZhbGlkYXRpb25zXG4gIGlmICghc2Vhc29uLm5hbWUgfHwgc2Vhc29uLm5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdTZWFzb24gbmFtZSBpcyByZXF1aXJlZCcpO1xuICB9IGVsc2UgaWYgKHNlYXNvbi5uYW1lLmxlbmd0aCA+IDEwMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdTZWFzb24gbmFtZSBjYW5ub3QgZXhjZWVkIDEwMCBjaGFyYWN0ZXJzJyk7XG4gIH1cblxuICAvLyBDaGVjayBmb3IgdmFsaWQgZGF0ZXNcbiAgY29uc3Qgc3RhcnREYXRlID0gbmV3IERhdGUoc2Vhc29uLnN0YXJ0RGF0ZSk7XG4gIGNvbnN0IGVuZERhdGUgPSBuZXcgRGF0ZShzZWFzb24uZW5kRGF0ZSk7XG4gIGNvbnN0IHJlZ2lzdHJhdGlvbkVuZCA9IG5ldyBEYXRlKHNlYXNvbi5yZWdpc3RyYXRpb25FbmQpO1xuXG4gIGlmIChpc05hTihzdGFydERhdGUuZ2V0VGltZSgpKSB8fCBpc05hTihlbmREYXRlLmdldFRpbWUoKSkgfHwgaXNOYU4ocmVnaXN0cmF0aW9uRW5kLmdldFRpbWUoKSkpIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2RhdGVzJywgJ0ludmFsaWQgZGF0ZSBmb3JtYXQnKTtcbiAgfVxuXG4gIGlmIChzZWFzb24ucmVnaXN0cmF0aW9uU3RhcnQpIHtcbiAgICBjb25zdCByZWdpc3RyYXRpb25TdGFydCA9IG5ldyBEYXRlKHNlYXNvbi5yZWdpc3RyYXRpb25TdGFydCk7XG4gICAgaWYgKGlzTmFOKHJlZ2lzdHJhdGlvblN0YXJ0LmdldFRpbWUoKSkpIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcigncmVnaXN0cmF0aW9uU3RhcnQnLCAnSW52YWxpZCBkYXRlIGZvcm1hdCcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNlYXNvbiBkYXRlIHZhbGlkYXRpb25zXG4gIGlmIChlbmREYXRlIDw9IHN0YXJ0RGF0ZSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignZW5kRGF0ZScsICdTZWFzb24gZW5kIGRhdGUgbXVzdCBiZSBhZnRlciBzdGFydCBkYXRlJyk7XG4gIH1cblxuICAvLyBSZWdpc3RyYXRpb24gcGVyaW9kIHZhbGlkYXRpb25zXG4gIGlmIChzZWFzb24ucmVnaXN0cmF0aW9uU3RhcnQpIHtcbiAgICBjb25zdCByZWdpc3RyYXRpb25TdGFydCA9IG5ldyBEYXRlKHNlYXNvbi5yZWdpc3RyYXRpb25TdGFydCk7XG4gICAgaWYgKHJlZ2lzdHJhdGlvblN0YXJ0KSB7XG4gICAgICBpZiAocmVnaXN0cmF0aW9uRW5kIDw9IHJlZ2lzdHJhdGlvblN0YXJ0KSB7XG4gICAgICAgIHJlc3VsdC5hZGRFcnJvcigncmVnaXN0cmF0aW9uRW5kJywgJ1JlZ2lzdHJhdGlvbiBlbmQgZGF0ZSBtdXN0IGJlIGFmdGVyIHJlZ2lzdHJhdGlvbiBzdGFydCBkYXRlJyk7XG4gICAgICB9XG4gICAgICBpZiAocmVnaXN0cmF0aW9uU3RhcnQgPj0gc3RhcnREYXRlKSB7XG4gICAgICAgIHJlc3VsdC5hZGRFcnJvcigncmVnaXN0cmF0aW9uU3RhcnQnLCAnUmVnaXN0cmF0aW9uIG11c3Qgc3RhcnQgYmVmb3JlIHNlYXNvbiBzdGFydCBkYXRlJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHJlZ2lzdHJhdGlvbkVuZCA+IHN0YXJ0RGF0ZSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcigncmVnaXN0cmF0aW9uRW5kJywgJ1JlZ2lzdHJhdGlvbiBtdXN0IGVuZCBiZWZvcmUgc2Vhc29uIHN0YXJ0IGRhdGUnKTtcbiAgfVxuXG4gIC8vIEZ1dHVyZSBkYXRlIHZhbGlkYXRpb25cbiAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgaWYgKHN0YXJ0RGF0ZSA8IG5vdykge1xuICAgIHJlc3VsdC5hZGRFcnJvcignc3RhcnREYXRlJywgJ1NlYXNvbiBzdGFydCBkYXRlIGNhbm5vdCBiZSBpbiB0aGUgcGFzdCcpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlU2Vhc29uKHNlYXNvbjogU2F2ZVNlYXNvbklucHV0IHwgTW9kaWZ5U2Vhc29uSW5wdXQpOiB2b2lkIHtcbiAgY29uc3QgcmVzdWx0ID0gY2hlY2tTZWFzb24oc2Vhc29uKTtcbiAgcmVzdWx0LnZhbGlkYXRlKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1BlcnNvbihwZXJzb246IFNhdmVQZXJzb25JbnB1dCB8IE1vZGlmeVBlcnNvbklucHV0KTogVmFsaWRhdGlvbkNoZWNrUmVzdWx0IHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25DaGVja1Jlc3VsdCgpO1xuXG4gIC8vIE5hbWUgdmFsaWRhdGlvbnNcbiAgaWYgKCFwZXJzb24uZmlyc3ROYW1lPy50cmltKCkpIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2ZpcnN0TmFtZScsICdGaXJzdCBuYW1lIGlzIHJlcXVpcmVkJyk7XG4gIH1cblxuICBpZiAoIXBlcnNvbi5sYXN0TmFtZT8udHJpbSgpKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdsYXN0TmFtZScsICdMYXN0IG5hbWUgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIC8vIEVtYWlsIHZhbGlkYXRpb25cbiAgaWYgKHBlcnNvbi5lbWFpbCAmJiAhL15bXlxcc0BdK0BbXlxcc0BdK1xcLlteXFxzQF0rJC8udGVzdChwZXJzb24uZW1haWwpKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdlbWFpbCcsICdJbnZhbGlkIGVtYWlsIGZvcm1hdCcpO1xuICB9XG5cbiAgLy8gUGhvbmUgbnVtYmVyIHZhbGlkYXRpb25cbiAgaWYgKHBlcnNvbi5waG9uZSkge1xuICAgIC8vIEFsbG93IGRpZ2l0cywgc3BhY2VzLCArLCAtLCBhbmQgKClcbiAgICBjb25zdCBwaG9uZVJlZ2V4ID0gL15bXFxkXFxzKygpLV17OCwyMH0kLztcbiAgICBpZiAoIXBob25lUmVnZXgudGVzdChwZXJzb24ucGhvbmUpKSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3IoJ3Bob25lJywgJ0ludmFsaWQgcGhvbmUgbnVtYmVyIGZvcm1hdCcpO1xuICAgIH1cbiAgfVxuXG4gIC8vIERhdGUgb2YgYmlydGggdmFsaWRhdGlvblxuICBpZiAocGVyc29uLmRhdGVPZkJpcnRoKSB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKHBlcnNvbi5kYXRlT2ZCaXJ0aCk7XG4gICAgaWYgKGlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgcmVzdWx0LmFkZEVycm9yKCdkYXRlT2ZCaXJ0aCcsICdJbnZhbGlkIGRhdGUgb2YgYmlydGggZm9ybWF0Jyk7XG4gICAgfVxuICAgIC8vIEFkZCBhZ2UgcmVzdHJpY3Rpb25zIGlmIG5lZWRlZFxuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICBpZiAoZGF0ZSA+IHRvZGF5KSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3IoJ2RhdGVPZkJpcnRoJywgJ0RhdGUgb2YgYmlydGggY2Fubm90IGJlIGluIHRoZSBmdXR1cmUnKTtcbiAgICB9XG4gIH1cblxuICAvLyBBZGRyZXNzIHZhbGlkYXRpb25cbiAgaWYgKHBlcnNvbi5hZGRyZXNzICYmIChwZXJzb24uYWRkcmVzcy5jaXR5IHx8IHBlcnNvbi5hZGRyZXNzLnN0cmVldCB8fCBwZXJzb24uYWRkcmVzcy56aXApKSB7XG4gICAgY29uc3QgYWRkcmVzc1Jlc3VsdCA9IGNoZWNrQWRkcmVzcyhwZXJzb24uYWRkcmVzcyk7XG4gICAgLy8gTWVyZ2UgYWRkcmVzcyBlcnJvcnMgaW50byB0aGUgbWFpbiByZXN1bHRcbiAgICBPYmplY3QuZW50cmllcyhhZGRyZXNzUmVzdWx0LmVycm9ycykuZm9yRWFjaCgoW2ZpZWxkLCBtZXNzYWdlc10pID0+IHtcbiAgICAgIG1lc3NhZ2VzLmZvckVhY2gobWVzc2FnZSA9PiByZXN1bHQuYWRkRXJyb3IoYGFkZHJlc3MuJHtmaWVsZH1gLCBtZXNzYWdlKSk7XG4gICAgfSk7XG4gICAgT2JqZWN0LmVudHJpZXMoYWRkcmVzc1Jlc3VsdC53YXJuaW5ncykuZm9yRWFjaCgoW2ZpZWxkLCBtZXNzYWdlc10pID0+IHtcbiAgICAgIG1lc3NhZ2VzLmZvckVhY2gobWVzc2FnZSA9PiByZXN1bHQuYWRkV2FybmluZyhgYWRkcmVzcy4ke2ZpZWxkfWAsIG1lc3NhZ2UpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVBlcnNvbihwZXJzb246IFNhdmVQZXJzb25JbnB1dCB8IE1vZGlmeVBlcnNvbklucHV0KTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrUGVyc29uKHBlcnNvbik7XG4gIHJlc3VsdC52YWxpZGF0ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tBc3NvY2lhdGlvbihhc3NvY2lhdGlvbjogU2F2ZUFzc29jaWF0aW9uSW5wdXQgfCBNb2RpZnlBc3NvY2lhdGlvbklucHV0KTogVmFsaWRhdGlvbkNoZWNrUmVzdWx0IHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFZhbGlkYXRpb25DaGVja1Jlc3VsdCgpO1xuXG4gIC8vIE5hbWUgdmFsaWRhdGlvblxuICBpZiAoIWFzc29jaWF0aW9uLm5hbWU/LnRyaW0oKSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdBc3NvY2lhdGlvbiBuYW1lIGlzIHJlcXVpcmVkJyk7XG4gIH0gZWxzZSBpZiAoYXNzb2NpYXRpb24ubmFtZS5sZW5ndGggPiAxMDApIHsgLy8gYWRqdXN0IG1heCBsZW5ndGggYXMgbmVlZGVkXG4gICAgcmVzdWx0LmFkZEVycm9yKCduYW1lJywgJ0Fzc29jaWF0aW9uIG5hbWUgY2Fubm90IGV4Y2VlZCAxMDAgY2hhcmFjdGVycycpO1xuICB9XG5cbiAgLy8gQ29udGFjdCBFbWFpbCB2YWxpZGF0aW9uXG4gIGlmICghYXNzb2NpYXRpb24uY29udGFjdEVtYWlsPy50cmltKCkpIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ2NvbnRhY3RFbWFpbCcsICdDb250YWN0IGVtYWlsIGlzIHJlcXVpcmVkJyk7XG4gIH0gZWxzZSBpZiAoIS9eW15cXHNAXStAW15cXHNAXStcXC5bXlxcc0BdKyQvLnRlc3QoYXNzb2NpYXRpb24uY29udGFjdEVtYWlsKSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignY29udGFjdEVtYWlsJywgJ0ludmFsaWQgY29udGFjdCBlbWFpbCBmb3JtYXQnKTtcbiAgfVxuXG4gIC8vIENvbnRhY3QgTmFtZSB2YWxpZGF0aW9uXG4gIGlmICghYXNzb2NpYXRpb24uY29udGFjdE5hbWU/LnRyaW0oKSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignY29udGFjdE5hbWUnLCAnQ29udGFjdCBuYW1lIGlzIHJlcXVpcmVkJyk7XG4gIH1cblxuICAvLyBBZGRyZXNzIHZhbGlkYXRpb25cbiAgY29uc3QgYWRkcmVzc1Jlc3VsdCA9IGNoZWNrQWRkcmVzcyhhc3NvY2lhdGlvbi5hZGRyZXNzKTtcbiAgLy8gTWVyZ2UgYWRkcmVzcyBlcnJvcnMgaW50byB0aGUgbWFpbiByZXN1bHRcbiAgT2JqZWN0LmVudHJpZXMoYWRkcmVzc1Jlc3VsdC5lcnJvcnMpLmZvckVhY2goKFtmaWVsZCwgbWVzc2FnZXNdKSA9PiB7XG4gICAgbWVzc2FnZXMuZm9yRWFjaChtZXNzYWdlID0+IHJlc3VsdC5hZGRFcnJvcihgYWRkcmVzcy4ke2ZpZWxkfWAsIG1lc3NhZ2UpKTtcbiAgfSk7XG4gIE9iamVjdC5lbnRyaWVzKGFkZHJlc3NSZXN1bHQud2FybmluZ3MpLmZvckVhY2goKFtmaWVsZCwgbWVzc2FnZXNdKSA9PiB7XG4gICAgbWVzc2FnZXMuZm9yRWFjaChtZXNzYWdlID0+IHJlc3VsdC5hZGRXYXJuaW5nKGBhZGRyZXNzLiR7ZmllbGR9YCwgbWVzc2FnZSkpO1xuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVBc3NvY2lhdGlvbihhc3NvY2lhdGlvbjogU2F2ZUFzc29jaWF0aW9uSW5wdXQgfCBNb2RpZnlBc3NvY2lhdGlvbklucHV0KTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrQXNzb2NpYXRpb24oYXNzb2NpYXRpb24pO1xuICByZXN1bHQudmFsaWRhdGUoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrTGVhZ3VlR3JvdXAobGVhZ3VlR3JvdXA6IFNhdmVMZWFndWVHcm91cElucHV0IHwgTW9kaWZ5TGVhZ3VlR3JvdXBJbnB1dCk6IFZhbGlkYXRpb25DaGVja1Jlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uQ2hlY2tSZXN1bHQoKTtcblxuICAvLyBOYW1lIHZhbGlkYXRpb25zXG4gIGlmICghbGVhZ3VlR3JvdXAubmFtZSB8fCBsZWFndWVHcm91cC5uYW1lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ25hbWUnLCAnTGVhZ3VlIGdyb3VwIG5hbWUgaXMgcmVxdWlyZWQnKTtcbiAgfSBlbHNlIGlmIChsZWFndWVHcm91cC5uYW1lLmxlbmd0aCA+IDEwMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbmFtZScsICdMZWFndWUgZ3JvdXAgbmFtZSBjYW5ub3QgZXhjZWVkIDEwMCBjaGFyYWN0ZXJzJyk7XG4gIH1cblxuICAvLyBOdW1iZXIgdmFsaWRhdGlvblxuICBpZiAobGVhZ3VlR3JvdXAubnVtYmVyIDwgMSkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignbnVtYmVyJywgJ0xlYWd1ZSBncm91cCBudW1iZXIgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICB9XG5cbiAgLy8gU2hvcnQgbmFtZSB2YWxpZGF0aW9uc1xuICBpZiAoIWxlYWd1ZUdyb3VwLnNob3J0TmFtZSB8fCBsZWFndWVHcm91cC5zaG9ydE5hbWUudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJlc3VsdC5hZGRFcnJvcignc2hvcnROYW1lJywgJ0xlYWd1ZSBncm91cCBzaG9ydCBuYW1lIGlzIHJlcXVpcmVkJyk7XG4gIH0gZWxzZSBpZiAobGVhZ3VlR3JvdXAuc2hvcnROYW1lLmxlbmd0aCA+IDEwKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdzaG9ydE5hbWUnLCAnTGVhZ3VlIGdyb3VwIHNob3J0IG5hbWUgY2Fubm90IGV4Y2VlZCAxMCBjaGFyYWN0ZXJzJyk7XG4gIH0gZWxzZSBpZiAoIS9eW0EtWmEtejAtOV0rJC8udGVzdChsZWFndWVHcm91cC5zaG9ydE5hbWUpKSB7XG4gICAgcmVzdWx0LmFkZEVycm9yKCdzaG9ydE5hbWUnLCAnTGVhZ3VlIGdyb3VwIHNob3J0IG5hbWUgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycycpO1xuICB9XG5cbiAgLy8gUmVndWxhdGlvbiB2YWxpZGF0aW9uXG4gIGlmICghbGVhZ3VlR3JvdXAucmVndWxhdGlvbiB8fCBsZWFndWVHcm91cC5yZWd1bGF0aW9uLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICByZXN1bHQuYWRkRXJyb3IoJ3JlZ3VsYXRpb24nLCAnTGVhZ3VlIGdyb3VwIHJlZ3VsYXRpb24gaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUxlYWd1ZUdyb3VwKGxlYWd1ZUdyb3VwOiBTYXZlTGVhZ3VlR3JvdXBJbnB1dCB8IE1vZGlmeUxlYWd1ZUdyb3VwSW5wdXQpOiB2b2lkIHtcbiAgY29uc3QgcmVzdWx0ID0gY2hlY2tMZWFndWVHcm91cChsZWFndWVHcm91cCk7XG4gIHJlc3VsdC52YWxpZGF0ZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tUZWFtKHRlYW06IFNhdmVUZWFtSW5wdXQgfCBNb2RpZnlUZWFtSW5wdXQgfCBSZWdpc3RlclRlYW1JbnB1dCk6IFZhbGlkYXRpb25DaGVja1Jlc3VsdCB7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBWYWxpZGF0aW9uQ2hlY2tSZXN1bHQoKTtcblxuICAvLyBOYW1lIHZhbGlkYXRpb25cbiAgaWYgKCduYW1lJyBpbiB0ZWFtICYmIHRlYW0ubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRlYW0ubmFtZS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3IoJ25hbWUnLCAnVGVhbSBuYW1lIGNhbm5vdCBiZSBlbXB0eScpO1xuICAgIH0gZWxzZSBpZiAodGVhbS5uYW1lLmxlbmd0aCA+IDEwMCkge1xuICAgICAgcmVzdWx0LmFkZEVycm9yKCduYW1lJywgJ1RlYW0gbmFtZSBjYW5ub3QgZXhjZWVkIDEwMCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCEoJ2lkJyBpbiB0ZWFtKSkgeyAvLyBpZiBpZCBpcyBub3QgaW4gdGVhbSwgdGhlbiBpdCBpcyBhIG5ldyB0ZWFtXG4gICAgcmVzdWx0LmFkZEVycm9yKCduYW1lJywgJ1RlYW0gbmFtZSBpcyByZXF1aXJlZCcpO1xuICB9XG5cbiAgLy8gTGVhZ3VlIElEIHZhbGlkYXRpb25cbiAgaWYgKCdsZWFndWVJZCcgaW4gdGVhbSAmJiB0ZWFtLmxlYWd1ZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICBpZiAodGVhbS5sZWFndWVJZC50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3IoJ2xlYWd1ZUlkJywgJ0xlYWd1ZSBJRCBjYW5ub3QgYmUgZW1wdHknKTtcbiAgICB9IGVsc2UgaWYgKHRlYW0ubGVhZ3VlSWQubGVuZ3RoID4gMTAwKSB7XG4gICAgICByZXN1bHQuYWRkRXJyb3IoJ2xlYWd1ZUlkJywgJ0xlYWd1ZSBJRCBjYW5ub3QgZXhjZWVkIDEwMCBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKCEoJ2lkJyBpbiB0ZWFtKSkgeyAvLyBpZiBpZCBpcyBub3QgaW4gdGVhbSwgdGhlbiBpdCBpcyBhIG5ldyB0ZWFtXG4gICAgcmVzdWx0LmFkZEVycm9yKCdsZWFndWVJZCcsICdMZWFndWUgSUQgaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIC8vIEV4ZW1wdGlvbiByZXF1ZXN0IHZhbGlkYXRpb25cbiAgaWYgKHRlYW0uZXhlbXB0aW9uUmVxdWVzdCkge1xuICAgIGlmICh0ZWFtLmV4ZW1wdGlvblJlcXVlc3QudHJpbSgpLmxlbmd0aCA+IDEwMDApIHtcbiAgICAgIHJlc3VsdC5hZGRFcnJvcignZXhlbXB0aW9uUmVxdWVzdCcsICdFeGVtcHRpb24gcmVxdWVzdCBjYW5ub3QgZXhjZWVkIDEwMDAgY2hhcmFjdGVycycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVRlYW0odGVhbTogU2F2ZVRlYW1JbnB1dCB8IE1vZGlmeVRlYW1JbnB1dCB8IFJlZ2lzdGVyVGVhbUlucHV0KTogdm9pZCB7XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrVGVhbSh0ZWFtKTtcbiAgcmVzdWx0LnZhbGlkYXRlKCk7XG59XG4iXX0=
package/package.json ADDED
@@ -0,0 +1,128 @@
1
+ {
2
+ "name": "@taimos/radball-digital-api",
3
+ "description": "Radball Digital API",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "https://github.com/taimos/radball-digital-api.git"
7
+ },
8
+ "scripts": {
9
+ "build": "npx projen build",
10
+ "bump": "npx projen bump",
11
+ "clobber": "npx projen clobber",
12
+ "compile": "npx projen compile",
13
+ "default": "npx projen default",
14
+ "docgen": "npx projen docgen",
15
+ "eject": "npx projen eject",
16
+ "eslint": "npx projen eslint",
17
+ "generate:api:graphql": "npx projen generate:api:graphql",
18
+ "generate:api:rest": "npx projen generate:api:rest",
19
+ "package": "npx projen package",
20
+ "post-compile": "npx projen post-compile",
21
+ "post-upgrade": "npx projen post-upgrade",
22
+ "pre-compile": "npx projen pre-compile",
23
+ "release": "npx projen release",
24
+ "test": "npx projen test",
25
+ "test:watch": "npx projen test:watch",
26
+ "unbump": "npx projen unbump",
27
+ "upgrade": "npx projen upgrade",
28
+ "watch": "npx projen watch",
29
+ "projen": "npx projen"
30
+ },
31
+ "author": {
32
+ "name": "Taimos GmbH",
33
+ "email": "info@taimos.de",
34
+ "url": "https://taimos.de",
35
+ "organization": true
36
+ },
37
+ "devDependencies": {
38
+ "@graphql-codegen/cli": "^5.0.7",
39
+ "@graphql-codegen/typescript": "^4.1.6",
40
+ "@stylistic/eslint-plugin": "^2",
41
+ "@taimos/projen": "^0.1.11",
42
+ "@types/jest": "^30.0.0",
43
+ "@types/node": "^24.0.3",
44
+ "@typescript-eslint/eslint-plugin": "^8",
45
+ "@typescript-eslint/parser": "^8",
46
+ "commit-and-tag-version": "^12",
47
+ "constructs": "^10.0.0",
48
+ "eslint": "^9",
49
+ "eslint-import-resolver-typescript": "^4.4.3",
50
+ "eslint-plugin-import": "^2.32.0",
51
+ "jest": "^29.7.0",
52
+ "jest-junit": "^16",
53
+ "projen": "0.91.31",
54
+ "projen-pipelines": "^0.2.10",
55
+ "ts-jest": "^29.4.0",
56
+ "ts-node": "^10.9.2",
57
+ "typedoc": "^0.28.5",
58
+ "typescript": "^5.8.3"
59
+ },
60
+ "dependencies": {
61
+ "date-fns": "^4.1.0",
62
+ "graphql": "^16.11.0",
63
+ "openapi-typescript": "^7.8.0",
64
+ "uuid": "^8.3.2"
65
+ },
66
+ "keywords": [
67
+ "api",
68
+ "digital",
69
+ "radball"
70
+ ],
71
+ "main": "lib/index.js",
72
+ "license": "UNLICENSED",
73
+ "publishConfig": {
74
+ "access": "public"
75
+ },
76
+ "version": "0.0.0",
77
+ "jest": {
78
+ "coverageProvider": "v8",
79
+ "moduleNameMapper": {
80
+ "^@generated/(.*)$": "<rootDir>/src/generated/$1",
81
+ "^@util/(.*)$": "<rootDir>/src/util/$1"
82
+ },
83
+ "testMatch": [
84
+ "<rootDir>/@(src|test)/**/*(*.)@(spec|test).ts?(x)",
85
+ "<rootDir>/@(src|test)/**/__tests__/**/*.ts?(x)",
86
+ "<rootDir>/@(projenrc)/**/*(*.)@(spec|test).ts?(x)",
87
+ "<rootDir>/@(projenrc)/**/__tests__/**/*.ts?(x)"
88
+ ],
89
+ "clearMocks": true,
90
+ "collectCoverage": true,
91
+ "coverageReporters": [
92
+ "json",
93
+ "lcov",
94
+ "clover",
95
+ "cobertura",
96
+ "text"
97
+ ],
98
+ "coverageDirectory": "coverage",
99
+ "coveragePathIgnorePatterns": [
100
+ "/node_modules/"
101
+ ],
102
+ "testPathIgnorePatterns": [
103
+ "/node_modules/"
104
+ ],
105
+ "watchPathIgnorePatterns": [
106
+ "/node_modules/"
107
+ ],
108
+ "reporters": [
109
+ "default",
110
+ [
111
+ "jest-junit",
112
+ {
113
+ "outputDirectory": "test-reports"
114
+ }
115
+ ]
116
+ ],
117
+ "transform": {
118
+ "^.+\\.[t]sx?$": [
119
+ "ts-jest",
120
+ {
121
+ "tsconfig": "tsconfig.dev.json"
122
+ }
123
+ ]
124
+ }
125
+ },
126
+ "types": "lib/index.d.ts",
127
+ "//": "~~ Generated by projen. To modify, edit .projenrc.ts and run \"npx projen\"."
128
+ }