@senior-gestao-relacionamento/angular-components 2.0.0 → 2.1.0-master-5b5e43f1

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 (30) hide show
  1. package/esm2022/lib/components/schedule/entities/participant-lookup.interface.mjs +2 -0
  2. package/esm2022/lib/components/schedule/entities/schedule-type.interface.mjs +2 -0
  3. package/esm2022/lib/components/schedule/entities/schedule.interface.mjs +2 -0
  4. package/esm2022/lib/components/schedule/enums/schedule.enums.mjs +65 -0
  5. package/esm2022/lib/components/schedule/helpers/schedule-date.helpers.mjs +109 -0
  6. package/esm2022/lib/components/schedule/helpers/schedule-display.helpers.mjs +108 -0
  7. package/esm2022/lib/components/schedule/schedule-detail/schedule-detail.component.mjs +79 -0
  8. package/esm2022/lib/components/schedule/schedule-form/schedule-form.component.mjs +749 -0
  9. package/esm2022/lib/components/schedule/services/schedule-type.service.mjs +33 -0
  10. package/esm2022/lib/components/schedule/services/schedule.service.mjs +66 -0
  11. package/esm2022/lib/config/provide-angular-components-translations.mjs +42 -0
  12. package/esm2022/lib/i18n/en-US.json +101 -0
  13. package/esm2022/lib/i18n/es-ES.json +101 -0
  14. package/esm2022/lib/i18n/pt-BR.json +101 -0
  15. package/esm2022/public-api.mjs +9 -1
  16. package/fesm2022/senior-gestao-relacionamento-angular-components.mjs +1523 -3
  17. package/fesm2022/senior-gestao-relacionamento-angular-components.mjs.map +1 -1
  18. package/lib/components/schedule/entities/participant-lookup.interface.d.ts +38 -0
  19. package/lib/components/schedule/entities/schedule-type.interface.d.ts +10 -0
  20. package/lib/components/schedule/entities/schedule.interface.d.ts +70 -0
  21. package/lib/components/schedule/enums/schedule.enums.d.ts +56 -0
  22. package/lib/components/schedule/helpers/schedule-date.helpers.d.ts +9 -0
  23. package/lib/components/schedule/helpers/schedule-display.helpers.d.ts +17 -0
  24. package/lib/components/schedule/schedule-detail/schedule-detail.component.d.ts +43 -0
  25. package/lib/components/schedule/schedule-form/schedule-form.component.d.ts +139 -0
  26. package/lib/components/schedule/services/schedule-type.service.d.ts +19 -0
  27. package/lib/components/schedule/services/schedule.service.d.ts +57 -0
  28. package/lib/config/provide-angular-components-translations.d.ts +20 -0
  29. package/package.json +3 -2
  30. package/public-api.d.ts +9 -0
@@ -0,0 +1,749 @@
1
+ import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
4
+ import { Subject, debounceTime, switchMap } from 'rxjs';
5
+ import { ButtonModule } from 'primeng/button';
6
+ import { DialogModule } from 'primeng/dialog';
7
+ import { DrawerModule } from 'primeng/drawer';
8
+ import { DropdownModule } from 'primeng/dropdown';
9
+ import { InputNumberModule } from 'primeng/inputnumber';
10
+ import { MultiSelectModule } from 'primeng/multiselect';
11
+ import { TagModule } from 'primeng/tag';
12
+ import { TooltipModule } from 'primeng/tooltip';
13
+ import { DividerModule } from 'primeng/divider';
14
+ import { TableModule } from 'primeng/table';
15
+ import { AutoCompleteModule } from 'primeng/autocomplete';
16
+ import { DynamicFormComponent, TranslatePipe } from '@seniorsistemas/components-ai';
17
+ import { SchedulePriority, ScheduleRecurrence, WeekDay, RepeatWhen, OrdinalWeekDay, Month } from '../enums/schedule.enums';
18
+ import { formatDateToString, toDateString, toTimeString, getDefaultStartTime, getDefaultEndTime, getCurrentWeekDay, getCurrentMonth, getOrdinalForDate } from '../helpers/schedule-date.helpers';
19
+ import { getOriginLabel as _getOriginLabel, getOriginIcon as _getOriginIcon, getParticipantName as _getParticipantName, getParticipantType as _getParticipantType, getParticipantTypeIcon as _getParticipantTypeIcon, getPrioritySeverity as _getPrioritySeverity, getPriorityLabel as _getPriorityLabel, getConfirmationSeverity as _getConfirmationSeverity, getConfirmationLabel as _getConfirmationLabel } from '../helpers/schedule-display.helpers';
20
+ import * as i0 from "@angular/core";
21
+ import * as i1 from "@angular/forms";
22
+ import * as i2 from "../services/schedule.service";
23
+ import * as i3 from "../services/schedule-type.service";
24
+ import * as i4 from "../../../services/current-collaborator/current-collaborator.service";
25
+ import * as i5 from "@seniorsistemas/components-ai";
26
+ import * as i6 from "@angular/common";
27
+ import * as i7 from "primeng/button";
28
+ import * as i8 from "primeng/api";
29
+ import * as i9 from "primeng/drawer";
30
+ import * as i10 from "primeng/dropdown";
31
+ import * as i11 from "primeng/inputnumber";
32
+ import * as i12 from "primeng/multiselect";
33
+ import * as i13 from "primeng/tooltip";
34
+ import * as i14 from "primeng/divider";
35
+ import * as i15 from "primeng/table";
36
+ import * as i16 from "primeng/autocomplete";
37
+ /** S109: Extract magic numbers to named constants */
38
+ const MAX_NAME_LENGTH = 255;
39
+ const DEBOUNCE_MS = 500;
40
+ const PARTICIPANT_SEARCH_LIMIT = 5;
41
+ export class ScheduleFormComponent {
42
+ fb;
43
+ scheduleService;
44
+ scheduleTypeService;
45
+ currentCollaboratorService;
46
+ t;
47
+ visible = false;
48
+ selectedDate = new Date();
49
+ visibleChange = new EventEmitter();
50
+ saved = new EventEmitter();
51
+ detailFormComponent;
52
+ scheduleDetailFields = [];
53
+ entityDataForForm = null;
54
+ scheduleForm;
55
+ isEditing = false;
56
+ currentCollaboratorId = null;
57
+ scheduleTypes = [];
58
+ participants = [];
59
+ participantsLoading = false;
60
+ recurrenceDescription = '';
61
+ /** S2933: Mark as readonly */
62
+ recurrenceChange$ = new Subject();
63
+ participantSuggestions = [];
64
+ selectedParticipantLookup = null;
65
+ addedParticipants = [];
66
+ priorityOptions = [];
67
+ recurrenceOptions = [];
68
+ weekDayOptions = [];
69
+ repeatWhenOptions = [];
70
+ ordinalOptions = [];
71
+ monthOptions = [];
72
+ /** S2933: Mark constructor-injected services as readonly */
73
+ constructor(fb, scheduleService, scheduleTypeService, currentCollaboratorService, t) {
74
+ this.fb = fb;
75
+ this.scheduleService = scheduleService;
76
+ this.scheduleTypeService = scheduleTypeService;
77
+ this.currentCollaboratorService = currentCollaboratorService;
78
+ this.t = t;
79
+ }
80
+ ngOnInit() {
81
+ this.initOptions();
82
+ this.initDetailFields();
83
+ this.initForm();
84
+ this.loadScheduleTypes();
85
+ this.loadCollaborator();
86
+ this.setupRecurrenceDescriptionWatcher();
87
+ }
88
+ loadCollaborator() {
89
+ this.currentCollaboratorService.load().subscribe({
90
+ next: (collab) => {
91
+ this.currentCollaboratorId = collab?.id ?? null;
92
+ },
93
+ error: () => {
94
+ this.currentCollaboratorId = null;
95
+ }
96
+ });
97
+ }
98
+ initOptions() {
99
+ this.priorityOptions = [
100
+ { label: this.t.translate('crmx.components.schedule_priority_low'), value: SchedulePriority.Low },
101
+ { label: this.t.translate('crmx.components.schedule_priority_medium'), value: SchedulePriority.Medium },
102
+ { label: this.t.translate('crmx.components.schedule_priority_high'), value: SchedulePriority.High },
103
+ { label: this.t.translate('crmx.components.schedule_priority_critical'), value: SchedulePriority.Critical }
104
+ ];
105
+ this.recurrenceOptions = [
106
+ { label: this.t.translate('crmx.components.schedule_recurrence_daily'), value: ScheduleRecurrence.Daily },
107
+ { label: this.t.translate('crmx.components.schedule_recurrence_weekly'), value: ScheduleRecurrence.Weekly },
108
+ { label: this.t.translate('crmx.components.schedule_recurrence_monthly'), value: ScheduleRecurrence.Monthly },
109
+ { label: this.t.translate('crmx.components.schedule_recurrence_yearly'), value: ScheduleRecurrence.Yearly }
110
+ ];
111
+ this.weekDayOptions = [
112
+ { label: this.t.translate('crmx.components.schedule_sunday'), value: WeekDay.Sunday },
113
+ { label: this.t.translate('crmx.components.schedule_monday'), value: WeekDay.Monday },
114
+ { label: this.t.translate('crmx.components.schedule_tuesday'), value: WeekDay.Tuesday },
115
+ { label: this.t.translate('crmx.components.schedule_wednesday'), value: WeekDay.Wednesday },
116
+ { label: this.t.translate('crmx.components.schedule_thursday'), value: WeekDay.Thursday },
117
+ { label: this.t.translate('crmx.components.schedule_friday'), value: WeekDay.Friday },
118
+ { label: this.t.translate('crmx.components.schedule_saturday'), value: WeekDay.Saturday }
119
+ ];
120
+ this.repeatWhenOptions = [
121
+ { label: this.t.translate('crmx.components.schedule_repeat_in_day'), value: RepeatWhen.InDay },
122
+ { label: this.t.translate('crmx.components.schedule_repeat_in_ordinal_week_day'), value: RepeatWhen.InOrdinalWeekDay }
123
+ ];
124
+ this.ordinalOptions = [
125
+ { label: this.t.translate('crmx.components.schedule_ordinal_first'), value: OrdinalWeekDay.First },
126
+ { label: this.t.translate('crmx.components.schedule_ordinal_second'), value: OrdinalWeekDay.Second },
127
+ { label: this.t.translate('crmx.components.schedule_ordinal_third'), value: OrdinalWeekDay.Third },
128
+ { label: this.t.translate('crmx.components.schedule_ordinal_fourth'), value: OrdinalWeekDay.Fourth },
129
+ { label: this.t.translate('crmx.components.schedule_ordinal_last'), value: OrdinalWeekDay.Last }
130
+ ];
131
+ this.monthOptions = Object.values(Month).map(m => ({
132
+ label: this.t.translate(`crmx.components.schedule_${m.toLowerCase()}`), value: m
133
+ }));
134
+ }
135
+ initDetailFields() {
136
+ const now = new Date();
137
+ const defaultStart = this.getDefaultStartTime(now);
138
+ const defaultEnd = this.getDefaultEndTime(defaultStart);
139
+ const fullRow = { xl: 12, lg: 12, md: 12, sm: 12 };
140
+ const halfRow = { xl: 6, lg: 6, md: 6, sm: 12 };
141
+ this.scheduleDetailFields = [
142
+ { field: 'name', label: this.t.translate('crmx.components.schedule_name'), type: 'text', required: true, validators: [Validators.required, Validators.maxLength(MAX_NAME_LENGTH)], placeholder: this.t.translate('crmx.components.schedule_enter_name'), maxLength: MAX_NAME_LENGTH, size: fullRow },
143
+ { field: 'priority', label: this.t.translate('crmx.components.schedule_priority'), type: 'dropdown', required: true, validators: [Validators.required], options: this.priorityOptions, optionLabel: 'label', optionValue: 'value', defaultValue: SchedulePriority.Medium, size: fullRow },
144
+ { field: 'type', label: this.t.translate('crmx.components.schedule_type'), type: 'lookup', lookupService: this.scheduleTypeService, lookupDisplayField: 'name', lookupValueField: 'id', lookupSearchFields: ['name'], showClear: true, lookupAutocomplete: true, lookupColumns: [{ field: 'name', header: this.t.translate('crmx.components.schedule_name') }], lookupFilters: "status = 'ACTIVE'", placeholder: this.t.translate('crmx.components.schedule_select_type'), size: fullRow },
145
+ { field: 'startDate', label: this.t.translate('crmx.components.schedule_start_date'), type: 'date', required: true, validators: [Validators.required], defaultValue: formatDateToString(now), size: (v) => v['withRecurrence'] ? halfRow : fullRow },
146
+ { field: 'endDate', label: this.t.translate('crmx.components.schedule_end_date'), type: 'date', visibleWhen: (v) => v['withRecurrence'] === true, size: halfRow },
147
+ { field: 'startTime', label: this.t.translate('crmx.components.schedule_start_time'), type: 'time', defaultValue: defaultStart, visibleWhen: (v) => v['allDay'] !== true, size: halfRow },
148
+ { field: 'endTime', label: this.t.translate('crmx.components.schedule_end_time'), type: 'time', defaultValue: defaultEnd, visibleWhen: (v) => v['allDay'] !== true, size: halfRow },
149
+ { field: 'allDay', label: this.t.translate('crmx.components.schedule_all_day'), type: 'checkbox', defaultValue: false, size: halfRow },
150
+ { field: 'withRecurrence', label: this.t.translate('crmx.components.schedule_with_recurrence'), type: 'checkbox', defaultValue: false, size: halfRow },
151
+ { field: 'comments', label: this.t.translate('crmx.components.schedule_comments'), type: 'textarea', placeholder: this.t.translate('crmx.components.schedule_enter_comments'), rows: 3, size: fullRow }
152
+ ];
153
+ }
154
+ onDetailFormReady(form) {
155
+ this.scheduleForm = form;
156
+ this.addRecurrenceControls();
157
+ this.scheduleForm.valueChanges.subscribe(() => this.recurrenceChange$.next());
158
+ this.setupRecurrenceFormWatchers();
159
+ }
160
+ /** S121: Add braces to all if statements */
161
+ addRecurrenceControls() {
162
+ const now = new Date();
163
+ if (!this.scheduleForm.contains('id')) {
164
+ this.scheduleForm.addControl('id', this.fb.control(null));
165
+ }
166
+ if (!this.scheduleForm.contains('recurrence')) {
167
+ this.scheduleForm.addControl('recurrence', this.fb.control(ScheduleRecurrence.Daily));
168
+ }
169
+ if (!this.scheduleForm.contains('recurrenceInterval')) {
170
+ this.scheduleForm.addControl('recurrenceInterval', this.fb.control(1));
171
+ }
172
+ if (!this.scheduleForm.contains('weekDays')) {
173
+ this.scheduleForm.addControl('weekDays', this.fb.control([getCurrentWeekDay(now)]));
174
+ }
175
+ if (!this.scheduleForm.contains('repeatWhen')) {
176
+ this.scheduleForm.addControl('repeatWhen', this.fb.control(RepeatWhen.InDay));
177
+ }
178
+ if (!this.scheduleForm.contains('repeatWhenDay')) {
179
+ this.scheduleForm.addControl('repeatWhenDay', this.fb.control(now.getDate()));
180
+ }
181
+ if (!this.scheduleForm.contains('repeatWhenOrdinalWeekDay')) {
182
+ this.scheduleForm.addControl('repeatWhenOrdinalWeekDay', this.fb.control(getOrdinalForDate(now)));
183
+ }
184
+ if (!this.scheduleForm.contains('repeatWhenWeekMonth')) {
185
+ this.scheduleForm.addControl('repeatWhenWeekMonth', this.fb.control(getCurrentWeekDay(now)));
186
+ }
187
+ if (!this.scheduleForm.contains('repeatWhenMonth')) {
188
+ this.scheduleForm.addControl('repeatWhenMonth', this.fb.control(getCurrentMonth(now)));
189
+ }
190
+ }
191
+ /**
192
+ * S1541: Break setupRecurrenceFormWatchers into smaller helpers
193
+ * to reduce cyclomatic complexity
194
+ */
195
+ setupRecurrenceFormWatchers() {
196
+ const d = this.selectedDate || new Date();
197
+ this.watchRecurrenceChanges(d);
198
+ this.watchRepeatWhenChanges(d);
199
+ this.watchWithRecurrenceChanges(d);
200
+ }
201
+ watchRecurrenceChanges(d) {
202
+ this.scheduleForm.get('recurrence')?.valueChanges.subscribe((rec) => {
203
+ this.handleRecurrenceWeekDays(rec, d);
204
+ this.handleRecurrenceMonthlyYearly(rec, d);
205
+ this.handleRecurrenceYearlyMonth(rec, d);
206
+ this.recurrenceChange$.next();
207
+ });
208
+ }
209
+ handleRecurrenceWeekDays(rec, d) {
210
+ if (rec === ScheduleRecurrence.Weekly) {
211
+ const current = this.scheduleForm.get('weekDays')?.value;
212
+ if (!current || current.length === 0) {
213
+ this.scheduleForm.patchValue({ weekDays: [getCurrentWeekDay(d)] }, { emitEvent: false });
214
+ }
215
+ }
216
+ else {
217
+ this.scheduleForm.patchValue({ weekDays: [] }, { emitEvent: false });
218
+ }
219
+ }
220
+ handleRecurrenceMonthlyYearly(rec, d) {
221
+ if (rec === ScheduleRecurrence.Monthly ||
222
+ rec === ScheduleRecurrence.Yearly) {
223
+ this.scheduleForm.patchValue({
224
+ repeatWhen: this.scheduleForm.get('repeatWhen')?.value ?? RepeatWhen.InDay,
225
+ repeatWhenDay: this.scheduleForm.get('repeatWhenDay')?.value ?? d.getDate(),
226
+ repeatWhenOrdinalWeekDay: this.scheduleForm.get('repeatWhenOrdinalWeekDay')?.value
227
+ ?? getOrdinalForDate(d),
228
+ repeatWhenWeekMonth: this.scheduleForm.get('repeatWhenWeekMonth')?.value
229
+ ?? getCurrentWeekDay(d)
230
+ }, { emitEvent: false });
231
+ }
232
+ else {
233
+ this.scheduleForm.patchValue({
234
+ repeatWhen: null,
235
+ repeatWhenDay: null,
236
+ repeatWhenOrdinalWeekDay: null,
237
+ repeatWhenWeekMonth: null,
238
+ repeatWhenMonth: null
239
+ }, { emitEvent: false });
240
+ }
241
+ }
242
+ handleRecurrenceYearlyMonth(rec, d) {
243
+ if (rec === ScheduleRecurrence.Yearly) {
244
+ this.scheduleForm.patchValue({
245
+ repeatWhenMonth: this.scheduleForm.get('repeatWhenMonth')?.value
246
+ ?? getCurrentMonth(d)
247
+ }, { emitEvent: false });
248
+ }
249
+ else {
250
+ this.scheduleForm.patchValue({ repeatWhenMonth: null }, { emitEvent: false });
251
+ }
252
+ }
253
+ watchRepeatWhenChanges(d) {
254
+ this.scheduleForm.get('repeatWhen')?.valueChanges.subscribe((rw) => {
255
+ if (rw === RepeatWhen.InDay) {
256
+ this.scheduleForm.patchValue({
257
+ repeatWhenDay: this.scheduleForm.get('repeatWhenDay')?.value ?? d.getDate(),
258
+ repeatWhenOrdinalWeekDay: null,
259
+ repeatWhenWeekMonth: null
260
+ }, { emitEvent: false });
261
+ }
262
+ else if (rw === RepeatWhen.InOrdinalWeekDay) {
263
+ this.scheduleForm.patchValue({
264
+ repeatWhenDay: null,
265
+ repeatWhenOrdinalWeekDay: this.scheduleForm.get('repeatWhenOrdinalWeekDay')?.value
266
+ ?? getOrdinalForDate(d),
267
+ repeatWhenWeekMonth: this.scheduleForm.get('repeatWhenWeekMonth')?.value
268
+ ?? getCurrentWeekDay(d)
269
+ }, { emitEvent: false });
270
+ }
271
+ else {
272
+ // No action needed for other repeatWhen values
273
+ }
274
+ this.recurrenceChange$.next();
275
+ });
276
+ }
277
+ watchWithRecurrenceChanges(d) {
278
+ this.scheduleForm.get('withRecurrence')?.valueChanges.subscribe(() => {
279
+ const enabled = this.scheduleForm.get('withRecurrence')?.value === true;
280
+ if (enabled) {
281
+ this.onRecurrenceEnabled(d);
282
+ }
283
+ else {
284
+ this.onRecurrenceDisabled();
285
+ }
286
+ });
287
+ }
288
+ onRecurrenceEnabled(d) {
289
+ this.resetRecurrenceDefaults(d);
290
+ this.recurrenceChange$.next();
291
+ }
292
+ onRecurrenceDisabled() {
293
+ this.recurrenceDescription = '';
294
+ if (this.scheduleForm) {
295
+ this.scheduleForm.patchValue({
296
+ endDate: null,
297
+ recurrence: null,
298
+ recurrenceInterval: null,
299
+ weekDays: null,
300
+ repeatWhen: null,
301
+ repeatWhenDay: null,
302
+ repeatWhenOrdinalWeekDay: null,
303
+ repeatWhenWeekMonth: null,
304
+ repeatWhenMonth: null
305
+ });
306
+ }
307
+ }
308
+ initForm() {
309
+ const now = new Date();
310
+ const defaultStart = this.getDefaultStartTime(now);
311
+ const defaultEnd = this.getDefaultEndTime(defaultStart);
312
+ this.scheduleForm = this.fb.group({
313
+ id: [null],
314
+ name: ['', [Validators.required, Validators.maxLength(MAX_NAME_LENGTH)]],
315
+ type: [null],
316
+ priority: [SchedulePriority.Medium, Validators.required],
317
+ allDay: [false],
318
+ withRecurrence: [false],
319
+ startDate: [
320
+ formatDateToString(this.selectedDate || now),
321
+ Validators.required
322
+ ],
323
+ endDate: [null],
324
+ startTime: [defaultStart],
325
+ endTime: [defaultEnd],
326
+ recurrence: [ScheduleRecurrence.Daily],
327
+ recurrenceInterval: [1],
328
+ weekDays: [[getCurrentWeekDay(now)]],
329
+ repeatWhen: [RepeatWhen.InDay],
330
+ repeatWhenDay: [now.getDate()],
331
+ repeatWhenOrdinalWeekDay: [getOrdinalForDate(now)],
332
+ repeatWhenWeekMonth: [getCurrentWeekDay(now)],
333
+ repeatWhenMonth: [getCurrentMonth(now)],
334
+ comments: ['']
335
+ });
336
+ }
337
+ setupRecurrenceDescriptionWatcher() {
338
+ this.recurrenceChange$.pipe(debounceTime(DEBOUNCE_MS)).subscribe(() => this.fetchRecurrenceDescription());
339
+ }
340
+ fetchRecurrenceDescription() {
341
+ if (!this.scheduleForm) {
342
+ return;
343
+ }
344
+ const v = this.scheduleForm.value;
345
+ if (!v.withRecurrence || !v.startDate) {
346
+ this.recurrenceDescription = '';
347
+ return;
348
+ }
349
+ this.scheduleService.generateRecurrenceDescription(this.buildRecurrencePayload(v)).subscribe({
350
+ next: (r) => {
351
+ this.recurrenceDescription = r.description ?? '';
352
+ },
353
+ error: () => {
354
+ this.recurrenceDescription = '';
355
+ }
356
+ });
357
+ }
358
+ buildRecurrencePayload(v) {
359
+ return {
360
+ ...this.buildDateTimePayload(v),
361
+ allDay: v['allDay'] || false,
362
+ withRecurrence: true,
363
+ recurrenceInterval: v['recurrenceInterval'] || 1,
364
+ recurrence: v['recurrence'],
365
+ ...this.buildNullableRecurrenceFields(v)
366
+ };
367
+ }
368
+ buildDateTimePayload(v) {
369
+ return {
370
+ startDate: toDateString(v['startDate']),
371
+ endDate: v['endDate'] ? toDateString(v['endDate']) : null,
372
+ startTime: v['startTime'] ? toTimeString(v['startTime']) : null,
373
+ endTime: v['endTime'] ? toTimeString(v['endTime']) : null
374
+ };
375
+ }
376
+ buildNullableRecurrenceFields(v) {
377
+ return {
378
+ weekDays: v['weekDays'] ?? null,
379
+ repeatWhen: v['repeatWhen'] ?? null,
380
+ repeatWhenDay: v['repeatWhenDay'] ?? null,
381
+ repeatWhenOrdinalWeekDay: v['repeatWhenOrdinalWeekDay'] ?? null,
382
+ repeatWhenWeekMonth: v['repeatWhenWeekMonth'] ?? null,
383
+ repeatWhenMonth: v['repeatWhenMonth'] ?? null
384
+ };
385
+ }
386
+ loadScheduleTypes() {
387
+ this.scheduleTypeService.list({
388
+ size: 100,
389
+ filterQuery: "status = 'ACTIVE'"
390
+ }).subscribe({
391
+ next: (r) => {
392
+ this.scheduleTypes = r.contents;
393
+ }
394
+ });
395
+ }
396
+ openNew() {
397
+ this.isEditing = false;
398
+ const now = new Date();
399
+ const defaultStart = this.getDefaultStartTime(now);
400
+ const defaultEnd = this.getDefaultEndTime(defaultStart);
401
+ this.entityDataForForm = null;
402
+ if (this.detailFormComponent) {
403
+ this.detailFormComponent.resetForm();
404
+ }
405
+ this.entityDataForForm = {
406
+ startDate: formatDateToString(this.selectedDate || now),
407
+ priority: SchedulePriority.Medium,
408
+ allDay: false,
409
+ withRecurrence: false,
410
+ startTime: defaultStart,
411
+ endTime: defaultEnd
412
+ };
413
+ this.resetRecurrenceDefaults(this.selectedDate || now);
414
+ this.recurrenceDescription = '';
415
+ this.participants = [];
416
+ this.addedParticipants = [];
417
+ this.selectedParticipantLookup = null;
418
+ this.visible = true;
419
+ this.visibleChange.emit(true);
420
+ }
421
+ openEdit(scheduleId) {
422
+ this.isEditing = true;
423
+ this.participants = [];
424
+ this.addedParticipants = [];
425
+ this.selectedParticipantLookup = null;
426
+ this.scheduleService.get(scheduleId).subscribe({
427
+ next: (data) => {
428
+ this.entityDataForForm = { ...data, type: data.type ?? null };
429
+ this.loadParticipants(scheduleId);
430
+ this.visible = true;
431
+ this.visibleChange.emit(true);
432
+ setTimeout(() => {
433
+ if (this.scheduleForm) {
434
+ this.scheduleForm.patchValue({
435
+ id: data.id,
436
+ recurrence: data.recurrence,
437
+ recurrenceInterval: data.recurrenceInterval,
438
+ weekDays: data.weekDays,
439
+ repeatWhen: data.repeatWhen,
440
+ repeatWhenDay: data.repeatWhenDay,
441
+ repeatWhenOrdinalWeekDay: data.repeatWhenOrdinalWeekDay,
442
+ repeatWhenWeekMonth: data.repeatWhenWeekMonth,
443
+ repeatWhenMonth: data.repeatWhenMonth
444
+ });
445
+ }
446
+ });
447
+ }
448
+ });
449
+ }
450
+ loadParticipants(scheduleId) {
451
+ this.participantsLoading = true;
452
+ this.scheduleService.listParticipants(scheduleId).subscribe({
453
+ next: (r) => {
454
+ this.participants = r.contents ?? [];
455
+ this.addedParticipants = this.participants
456
+ .filter(p => !p.organizer)
457
+ .map(p => this.participantToLookup(p))
458
+ .filter((p) => p !== null);
459
+ this.participantsLoading = false;
460
+ },
461
+ error: () => {
462
+ this.participantsLoading = false;
463
+ }
464
+ });
465
+ }
466
+ participantToLookup(p) {
467
+ if (p.collaborator) {
468
+ return {
469
+ id: p.collaborator.id,
470
+ name: p.collaborator.name,
471
+ origin: 'COLLABORATOR'
472
+ };
473
+ }
474
+ if (p.account) {
475
+ return {
476
+ id: p.account.id,
477
+ name: p.account.name,
478
+ origin: 'ACCOUNT'
479
+ };
480
+ }
481
+ if (p.accountContact) {
482
+ return {
483
+ id: p.accountContact.id,
484
+ name: p.accountContact.name,
485
+ referenceName: p.accountContact.account?.name,
486
+ referenceId: p.accountContact.account?.id,
487
+ origin: 'ACCOUNT_CONTACT'
488
+ };
489
+ }
490
+ if (p.externalParticipant) {
491
+ return {
492
+ id: p.externalParticipant.id,
493
+ name: p.externalParticipant.name,
494
+ origin: 'EXTERNAL_PARTICIPANT'
495
+ };
496
+ }
497
+ return null;
498
+ }
499
+ onSearchParticipants(event) {
500
+ this.scheduleService.searchParticipantLookup(event.query ?? '', PARTICIPANT_SEARCH_LIMIT).subscribe({
501
+ next: (r) => {
502
+ const addedIds = new Set(this.addedParticipants.map(p => p.id + p.origin));
503
+ this.participantSuggestions = (r.contents ?? [])
504
+ .filter(p => !addedIds.has(p.id + p.origin));
505
+ },
506
+ error: () => {
507
+ this.participantSuggestions = [];
508
+ }
509
+ });
510
+ }
511
+ onSelectParticipant(participant) {
512
+ if (!this.addedParticipants.some(p => p.id === participant.id && p.origin === participant.origin)) {
513
+ this.addedParticipants = [...this.addedParticipants, participant];
514
+ }
515
+ setTimeout(() => {
516
+ this.selectedParticipantLookup = null;
517
+ });
518
+ }
519
+ onRemoveParticipant(participant) {
520
+ this.addedParticipants = this.addedParticipants.filter(p => !(p.id === participant.id && p.origin === participant.origin));
521
+ }
522
+ /**
523
+ * S1541: Break onSave into smaller helpers to reduce complexity
524
+ * S121/S2681: Add braces to all if statements
525
+ */
526
+ onSave() {
527
+ if (this.scheduleForm.invalid) {
528
+ this.scheduleForm.markAllAsTouched();
529
+ return;
530
+ }
531
+ const payload = this.buildSavePayload();
532
+ const op = this.isEditing
533
+ ? this.scheduleService.update(payload['id'], payload)
534
+ : this.scheduleService.insert(payload);
535
+ let scheduleId;
536
+ op.pipe(switchMap((result) => {
537
+ scheduleId = this.isEditing
538
+ ? payload['id']
539
+ : result?.['id'];
540
+ return this.scheduleService.manageParticipants(scheduleId, this.buildManageParticipantsPayload());
541
+ })).subscribe({
542
+ next: () => {
543
+ this.visible = false;
544
+ this.visibleChange.emit(false);
545
+ this.saved.emit(scheduleId);
546
+ }
547
+ });
548
+ }
549
+ buildSavePayload() {
550
+ const payload = {
551
+ ...this.scheduleForm.value,
552
+ type: this.scheduleForm.value.type || null,
553
+ whenOccurs: this.recurrenceDescription ?? null
554
+ };
555
+ if (payload['startDate']) {
556
+ payload['startDate'] = toDateString(payload['startDate']);
557
+ }
558
+ if (payload['endDate']) {
559
+ payload['endDate'] = toDateString(payload['endDate']);
560
+ }
561
+ if (payload['startTime']) {
562
+ payload['startTime'] = toTimeString(payload['startTime']);
563
+ }
564
+ if (payload['endTime']) {
565
+ payload['endTime'] = toTimeString(payload['endTime']);
566
+ }
567
+ if (!payload['withRecurrence']) {
568
+ this.clearRecurrencePayload(payload);
569
+ }
570
+ else {
571
+ this.cleanRecurrenceFields(payload);
572
+ }
573
+ if (payload['allDay']) {
574
+ payload['startTime'] = null;
575
+ payload['endTime'] = null;
576
+ }
577
+ return payload;
578
+ }
579
+ clearRecurrencePayload(payload) {
580
+ payload['endDate'] = null;
581
+ payload['recurrenceInterval'] = null;
582
+ payload['weekDays'] = null;
583
+ payload['repeatWhen'] = null;
584
+ payload['repeatWhenDay'] = null;
585
+ payload['repeatWhenOrdinalWeekDay'] = null;
586
+ payload['repeatWhenWeekMonth'] = null;
587
+ payload['repeatWhenMonth'] = null;
588
+ }
589
+ onCancel() {
590
+ this.visible = false;
591
+ this.visibleChange.emit(false);
592
+ }
593
+ buildManageParticipantsPayload() {
594
+ const a = [];
595
+ const ac = [];
596
+ const c = [];
597
+ const e = [];
598
+ for (const p of this.addedParticipants) {
599
+ switch (p.origin) {
600
+ case 'ACCOUNT': {
601
+ a.push(p.id);
602
+ break;
603
+ }
604
+ case 'ACCOUNT_CONTACT': {
605
+ ac.push(p.id);
606
+ break;
607
+ }
608
+ case 'COLLABORATOR': {
609
+ c.push(p.id);
610
+ break;
611
+ }
612
+ case 'EXTERNAL_PARTICIPANT': {
613
+ e.push(p.id);
614
+ break;
615
+ }
616
+ }
617
+ }
618
+ return {
619
+ accountsId: a,
620
+ accountContactsId: ac,
621
+ collaboratorsId: c,
622
+ externalParticipantsId: e
623
+ };
624
+ }
625
+ /**
626
+ * S1541: Break cleanRecurrenceFields into smaller helpers
627
+ * S121/S2681: Add braces to all if statements
628
+ */
629
+ cleanRecurrenceFields(p) {
630
+ const r = p['recurrence'];
631
+ if (r !== ScheduleRecurrence.Weekly) {
632
+ p['weekDays'] = null;
633
+ }
634
+ this.cleanDailyWeeklyFields(p, r);
635
+ this.cleanMonthlyFields(p, r);
636
+ this.cleanYearlyFields(p, r);
637
+ }
638
+ cleanDailyWeeklyFields(p, r) {
639
+ if (r === ScheduleRecurrence.Daily ||
640
+ r === ScheduleRecurrence.Weekly) {
641
+ p['repeatWhen'] = null;
642
+ p['repeatWhenDay'] = null;
643
+ p['repeatWhenOrdinalWeekDay'] = null;
644
+ p['repeatWhenWeekMonth'] = null;
645
+ p['repeatWhenMonth'] = null;
646
+ }
647
+ }
648
+ cleanMonthlyFields(p, r) {
649
+ if (r === ScheduleRecurrence.Monthly) {
650
+ p['repeatWhenMonth'] = null;
651
+ this.cleanRepeatWhenFields(p);
652
+ }
653
+ }
654
+ cleanYearlyFields(p, r) {
655
+ if (r === ScheduleRecurrence.Yearly) {
656
+ this.cleanRepeatWhenFields(p);
657
+ }
658
+ }
659
+ cleanRepeatWhenFields(p) {
660
+ if (p['repeatWhen'] === RepeatWhen.InDay) {
661
+ p['repeatWhenOrdinalWeekDay'] = null;
662
+ p['repeatWhenWeekMonth'] = null;
663
+ }
664
+ else {
665
+ p['repeatWhenDay'] = null;
666
+ }
667
+ }
668
+ resetRecurrenceDefaults(date) {
669
+ if (!this.scheduleForm) {
670
+ return;
671
+ }
672
+ const d = date || new Date();
673
+ this.scheduleForm.patchValue({
674
+ recurrence: ScheduleRecurrence.Daily,
675
+ recurrenceInterval: 1,
676
+ weekDays: [getCurrentWeekDay(d)],
677
+ repeatWhen: RepeatWhen.InDay,
678
+ repeatWhenDay: d.getDate(),
679
+ repeatWhenOrdinalWeekDay: getOrdinalForDate(d),
680
+ repeatWhenWeekMonth: getCurrentWeekDay(d),
681
+ repeatWhenMonth: getCurrentMonth(d)
682
+ });
683
+ }
684
+ get showRecurrenceFields() {
685
+ return this.scheduleForm?.get('withRecurrence')?.value === true;
686
+ }
687
+ get currentRecurrence() {
688
+ return this.scheduleForm?.get('recurrence')?.value;
689
+ }
690
+ get currentRepeatWhen() {
691
+ return this.scheduleForm?.get('repeatWhen')?.value;
692
+ }
693
+ get showWeekDays() {
694
+ return this.currentRecurrence === ScheduleRecurrence.Weekly;
695
+ }
696
+ get showRepeatWhen() {
697
+ return (this.currentRecurrence === ScheduleRecurrence.Monthly ||
698
+ this.currentRecurrence === ScheduleRecurrence.Yearly);
699
+ }
700
+ get showRepeatWhenDay() {
701
+ return this.showRepeatWhen && this.currentRepeatWhen === RepeatWhen.InDay;
702
+ }
703
+ get showOrdinalFields() {
704
+ return (this.showRepeatWhen &&
705
+ this.currentRepeatWhen === RepeatWhen.InOrdinalWeekDay);
706
+ }
707
+ get showMonthField() {
708
+ return this.currentRecurrence === ScheduleRecurrence.Yearly;
709
+ }
710
+ getOriginLabel(o) { return _getOriginLabel(this.t, o); }
711
+ getOriginIcon(o) { return _getOriginIcon(o); }
712
+ getParticipantName(p) { return _getParticipantName(p); }
713
+ getParticipantType(p) { return _getParticipantType(this.t, p); }
714
+ getParticipantTypeIcon(p) { return _getParticipantTypeIcon(p); }
715
+ getPrioritySeverity(p) { return _getPrioritySeverity(p); }
716
+ getPriorityLabel(p) { return _getPriorityLabel(this.t, p); }
717
+ getConfirmationSeverity(c) { return _getConfirmationSeverity(c); }
718
+ getConfirmationLabel(c) { return _getConfirmationLabel(this.t, c); }
719
+ getDefaultStartTime(d) {
720
+ return getDefaultStartTime(d);
721
+ }
722
+ getDefaultEndTime(st) {
723
+ return getDefaultEndTime(st);
724
+ }
725
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScheduleFormComponent, deps: [{ token: i1.FormBuilder }, { token: i2.ScheduleService }, { token: i3.ScheduleTypeService }, { token: i4.CurrentCollaboratorService }, { token: i5.TranslationService }], target: i0.ɵɵFactoryTarget.Component });
726
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ScheduleFormComponent, isStandalone: true, selector: "s-schedule-form", inputs: { visible: "visible", selectedDate: "selectedDate" }, outputs: { visibleChange: "visibleChange", saved: "saved" }, viewQueries: [{ propertyName: "detailFormComponent", first: true, predicate: ["detailForm"], descendants: true }], ngImport: i0, template: "<!-- Schedule Drawer -->\n<p-drawer\n [(visible)]=\"visible\"\n position=\"right\"\n [style]=\"{ width: '85vw', 'max-width': '1200px' }\"\n [modal]=\"true\"\n (onHide)=\"onCancel()\"\n>\n <ng-template pTemplate=\"header\">\n <span class=\"drawer-title\">\n <i class=\"pi pi-calendar\"></i>\n {{\n isEditing\n ? ('crmx.components.schedule_schedule_edit' | translate)\n : ('crmx.components.schedule_schedule_new' | translate)\n }}\n </span>\n </ng-template>\n\n <div class=\"drawer-layout\" *ngIf=\"scheduleForm\">\n <!-- Left: Form -->\n <div class=\"drawer-left\">\n <div class=\"drawer-section-header\">\n <i class=\"pi pi-info-circle\"></i>\n <span>\n {{ 'crmx.components.schedule_schedule_details' | translate }}\n </span>\n </div>\n <sia-dynamic-form\n #detailForm\n [sections]=\"[{ fields: scheduleDetailFields }]\"\n [entityData]=\"entityDataForForm\"\n [mode]=\"'form'\"\n [showSubmitButton]=\"false\"\n [showCancelButton]=\"false\"\n (formReady)=\"onDetailFormReady($event)\"\n ></sia-dynamic-form>\n </div>\n\n <!-- Right: Recurrence + Participants -->\n <div class=\"drawer-right\">\n <div\n class=\"drawer-section\"\n *ngIf=\"showRecurrenceFields\"\n >\n <div class=\"drawer-section-header\">\n <i class=\"pi pi-replay\"></i>\n <span>\n {{\n 'crmx.components.schedule_recurrence_config'\n | translate\n }}\n </span>\n </div>\n <form\n [formGroup]=\"scheduleForm\"\n class=\"drawer-form\"\n >\n <div class=\"form-row\">\n <div class=\"form-field flex-1\">\n <label for=\"recurrence\">\n {{ 'crmx.components.schedule_recurrence' | translate }}\n </label>\n <p-dropdown\n id=\"recurrence\"\n formControlName=\"recurrence\"\n [options]=\"recurrenceOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n class=\"w-full\"\n ></p-dropdown>\n </div>\n <div class=\"form-field flex-1\">\n <label for=\"recurrenceInterval\">\n {{\n 'crmx.components.schedule_recurrence_interval'\n | translate\n }}\n </label>\n <p-inputNumber\n id=\"recurrenceInterval\"\n formControlName=\"recurrenceInterval\"\n [min]=\"1\"\n [max]=\"99\"\n class=\"w-full\"\n ></p-inputNumber>\n </div>\n </div>\n <div\n class=\"form-row\"\n *ngIf=\"showWeekDays\"\n >\n <div class=\"form-field flex-1\">\n <label for=\"weekDays\">\n {{ 'crmx.components.schedule_week_days' | translate }}\n </label>\n <p-multiSelect\n id=\"weekDays\"\n formControlName=\"weekDays\"\n [options]=\"weekDayOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [placeholder]=\"\n 'crmx.components.schedule_select_week_day'\n | translate\n \"\n [maxSelectedLabels]=\"7\"\n class=\"w-full\"\n ></p-multiSelect>\n </div>\n </div>\n <div\n class=\"form-row\"\n *ngIf=\"showRepeatWhen\"\n >\n <div class=\"form-field flex-1\">\n <label for=\"repeatWhen\">\n {{\n 'crmx.components.schedule_repeat_when' | translate\n }}\n </label>\n <p-dropdown\n id=\"repeatWhen\"\n formControlName=\"repeatWhen\"\n [options]=\"repeatWhenOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n class=\"w-full\"\n ></p-dropdown>\n </div>\n <div\n class=\"form-field flex-1\"\n *ngIf=\"showRepeatWhenDay\"\n >\n <label for=\"repeatWhenDay\">\n {{\n 'crmx.components.schedule_repeat_when_day'\n | translate\n }}\n </label>\n <p-inputNumber\n id=\"repeatWhenDay\"\n formControlName=\"repeatWhenDay\"\n [min]=\"1\"\n [max]=\"31\"\n class=\"w-full\"\n ></p-inputNumber>\n </div>\n <div\n class=\"form-field flex-1\"\n *ngIf=\"showOrdinalFields\"\n >\n <label for=\"repeatWhenOrdinalWeekDay\">\n {{\n 'crmx.components.schedule_ordinal_week_day'\n | translate\n }}\n </label>\n <p-dropdown\n id=\"repeatWhenOrdinalWeekDay\"\n formControlName=\"repeatWhenOrdinalWeekDay\"\n [options]=\"ordinalOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n class=\"w-full\"\n ></p-dropdown>\n </div>\n <div\n class=\"form-field flex-1\"\n *ngIf=\"showOrdinalFields\"\n >\n <label for=\"repeatWhenWeekMonth\">\n {{\n 'crmx.components.schedule_week_month' | translate\n }}\n </label>\n <p-dropdown\n id=\"repeatWhenWeekMonth\"\n formControlName=\"repeatWhenWeekMonth\"\n [options]=\"weekDayOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n class=\"w-full\"\n ></p-dropdown>\n </div>\n </div>\n <div\n class=\"form-row\"\n *ngIf=\"showMonthField\"\n >\n <div class=\"form-field flex-1\">\n <label for=\"repeatWhenMonth\">\n {{\n 'crmx.components.schedule_repeat_month' | translate\n }}\n </label>\n <p-dropdown\n id=\"repeatWhenMonth\"\n formControlName=\"repeatWhenMonth\"\n [options]=\"monthOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n class=\"w-full\"\n ></p-dropdown>\n </div>\n </div>\n </form>\n <div\n class=\"recurrence-description\"\n *ngIf=\"recurrenceDescription\"\n >\n <i class=\"pi pi-info-circle\"></i>\n <span>{{ recurrenceDescription }}</span>\n </div>\n </div>\n\n <p-divider></p-divider>\n\n <!-- Participants -->\n <div class=\"drawer-section\">\n <div class=\"drawer-section-header\">\n <i class=\"pi pi-users\"></i>\n <span>\n {{ 'crmx.components.schedule_participants' | translate }}\n </span>\n </div>\n <div class=\"participant-search\">\n <p-autoComplete\n [(ngModel)]=\"selectedParticipantLookup\"\n [ngModelOptions]=\"{standalone: true}\"\n [suggestions]=\"participantSuggestions\"\n (completeMethod)=\"\n onSearchParticipants($event)\n \"\n (onSelect)=\"\n onSelectParticipant($event.value)\n \"\n (onFocus)=\"\n onSearchParticipants({ query: '' })\n \"\n optionLabel=\"name\"\n [placeholder]=\"\n 'crmx.components.schedule_search_participant'\n | translate\n \"\n [minLength]=\"0\"\n [forceSelection]=\"true\"\n [showClear]=\"true\"\n [fluid]=\"true\"\n >\n <ng-template\n let-item\n pTemplate=\"item\"\n >\n <div class=\"participant-suggestion\">\n <i\n [class]=\"getOriginIcon(item.origin)\"\n ></i>\n <div\n class=\"participant-suggestion-info\"\n >\n <span\n class=\"participant-suggestion-name\"\n >\n {{ item.name }}\n </span>\n <span\n class=\"participant-suggestion-detail\"\n *ngIf=\"item.referenceName\"\n >\n {{ item.referenceName }}\n </span>\n </div>\n <span\n class=\"participant-suggestion-origin\"\n >\n {{ getOriginLabel(item.origin) }}\n </span>\n </div>\n </ng-template>\n </p-autoComplete>\n </div>\n <div\n *ngIf=\"\n !participantsLoading &&\n addedParticipants.length === 0\n \"\n class=\"participants-empty\"\n >\n <i class=\"pi pi-users\"></i>\n <p>\n {{\n 'crmx.components.schedule_no_participants'\n | translate\n }}\n </p>\n </div>\n <p-table\n *ngIf=\"\n !participantsLoading &&\n addedParticipants.length > 0\n \"\n [value]=\"addedParticipants\"\n styleClass=\"p-datatable-sm p-datatable-striped\"\n >\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"col\">\n {{ 'crmx.components.schedule_name' | translate }}\n </th>\n <th\n scope=\"col\"\n class=\"col-participant-type\"\n >\n {{\n 'crmx.components.schedule_participant_type'\n | translate\n }}\n </th>\n <th\n scope=\"col\"\n class=\"col-actions\"\n ></th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-p>\n <tr>\n <td>\n <div class=\"participant-name-cell\">\n <span>{{ p.name }}</span>\n <span\n *ngIf=\"p.referenceName\"\n class=\"participant-reference\"\n >\n {{ p.referenceName }}\n </span>\n </div>\n </td>\n <td>\n <div class=\"participant-type-cell\">\n <i\n [class]=\"getOriginIcon(p.origin)\"\n ></i>\n <span>\n {{ getOriginLabel(p.origin) }}\n </span>\n </div>\n </td>\n <td>\n <p-button\n icon=\"pi pi-trash\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"danger\"\n (onClick)=\"onRemoveParticipant(p)\"\n [pTooltip]=\"\n 'crmx.components.schedule_remove' | translate\n \"\n tooltipPosition=\"top\"\n ></p-button>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </div>\n </div>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"drawer-footer\">\n <p-button\n [label]=\"'crmx.components.cancel' | translate\"\n icon=\"pi pi-times\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onCancel()\"\n ></p-button>\n <p-button\n [label]=\"'crmx.components.save' | translate\"\n icon=\"pi pi-check\"\n (onClick)=\"onSave()\"\n ></p-button>\n </div>\n </ng-template>\n</p-drawer>\n", styles: [".col-participant-type{width:10rem}.col-actions{width:4rem}.w-full{width:100%}.drawer-title{display:flex;align-items:center;gap:.75rem;font-size:1.15rem;font-weight:600;color:var(--p-text-color)}.drawer-title i{color:var(--p-primary-color)}.drawer-layout{display:flex;gap:0;height:100%}.drawer-left{width:380px;min-width:380px;border-right:1px solid var(--p-surface-200);padding:0 1.5rem 1.5rem 0;overflow-y:auto}.drawer-right{flex:1;padding:0 0 0 1.5rem;overflow-y:auto}.drawer-section-header{display:flex;align-items:center;gap:.5rem;padding-bottom:1rem;margin-bottom:1rem;border-bottom:1px solid var(--p-surface-200);font-weight:600;font-size:.95rem;color:var(--p-text-color)}.drawer-section-header i{color:var(--p-primary-color);font-size:1rem}.drawer-form{display:flex;flex-direction:column;gap:1rem}.drawer-form .form-field{display:flex;flex-direction:column;gap:.375rem}.drawer-form .form-field.flex-1{flex:1 1 0%;min-width:0}.drawer-form .form-field label{font-weight:500;font-size:.8rem;color:var(--p-text-secondary-color);text-transform:uppercase;letter-spacing:.3px}.drawer-form .form-row{display:flex;gap:1rem}.drawer-form .form-row.checkboxes{gap:2rem;padding:.5rem 0}.drawer-form .form-check{display:flex;align-items:center;gap:.5rem}.drawer-form .form-check label{font-size:.875rem;font-weight:500;margin:0;text-transform:none;letter-spacing:0}.drawer-section{margin-bottom:1.5rem}.recurrence-description{display:flex;align-items:flex-start;gap:.5rem;margin-top:1rem;padding:.75rem 1rem;background:var(--p-primary-50);border-left:3px solid var(--p-primary-color);border-radius:4px;font-size:.85rem;color:var(--p-text-color);line-height:1.4}.recurrence-description i{color:var(--p-primary-color);margin-top:.1rem;flex-shrink:0}.participants-empty{display:flex;flex-direction:column;align-items:center;padding:2rem;text-align:center;color:var(--p-text-secondary-color);border:1px dashed var(--p-surface-300);border-radius:8px}.participants-empty i{font-size:2rem;margin-bottom:.5rem;opacity:.4}.participants-empty p{margin:0}.participant-name-cell{display:flex;align-items:center;gap:.5rem}.participant-type-cell{display:flex;align-items:center;gap:.5rem;font-size:.85rem;color:var(--p-text-secondary-color)}.participant-type-cell i{font-size:.9rem}.drawer-footer{display:flex;gap:.75rem;justify-content:flex-end}.participant-search{margin-bottom:1rem}.participant-search :host ::ng-deep .p-autocomplete{width:100%;display:flex}.participant-search :host ::ng-deep .p-autocomplete-input{width:100%}.participant-suggestion{display:flex;align-items:center;gap:.75rem;padding:.25rem 0}.participant-suggestion i{font-size:1.1rem;color:var(--p-text-secondary-color)}.participant-suggestion-info{display:flex;flex-direction:column;flex:1;min-width:0}.participant-suggestion-name{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.participant-suggestion-detail{font-size:.8rem;color:var(--p-text-secondary-color)}.participant-suggestion-origin{font-size:.75rem;color:var(--p-text-secondary-color);white-space:nowrap}.participant-reference{font-size:.8rem;color:var(--p-text-secondary-color);margin-left:.25rem}.detail-dialog-body{display:flex;flex-direction:column;gap:.5rem}.detail-dialog-row{display:flex;align-items:center;gap:.75rem;padding:.4rem 0}.detail-label{font-weight:500;color:var(--p-text-secondary-color);min-width:8rem}@media (max-width: 768px){.drawer-layout{flex-direction:column}.drawer-left{width:100%;min-width:100%;border-right:none;border-bottom:1px solid var(--p-surface-200);padding:0 0 1.5rem}.drawer-right{padding:1.5rem 0 0}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i7.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "fluid", "buttonProps"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i8.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: DialogModule }, { kind: "ngmodule", type: DrawerModule }, { kind: "component", type: i9.Drawer, selector: "p-drawer", inputs: ["appendTo", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "closeButtonProps", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen", "header", "maskStyle", "closable"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "ngmodule", type: DropdownModule }, { kind: "component", type: i10.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "fluid", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: InputNumberModule }, { kind: "component", type: i11.InputNumber, selector: "p-inputNumber, p-inputnumber, p-input-number", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabelledBy", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "readonly", "step", "allowEmpty", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "variant", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "inputStyle", "inputStyleClass", "showClear", "autofocus", "disabled", "fluid"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown", "onClear"] }, { kind: "ngmodule", type: MultiSelectModule }, { kind: "component", type: i12.MultiSelect, selector: "p-multiSelect, p-multiselect, p-multi-select", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "fluid", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "chipIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "size", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "ngmodule", type: TagModule }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i13.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "ngmodule", type: DividerModule }, { kind: "component", type: i14.Divider, selector: "p-divider", inputs: ["style", "styleClass", "layout", "type", "align"] }, { kind: "ngmodule", type: TableModule }, { kind: "component", type: i15.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "size", "showGridlines", "stripedRows", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "virtualRowHeight", "selectAll"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "ngmodule", type: AutoCompleteModule }, { kind: "component", type: i16.AutoComplete, selector: "p-autoComplete, p-autocomplete, p-auto-complete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "scrollHeight", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "dropdownAriaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "showClear", "field", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "overlayOptions", "suggestions", "itemSize", "optionLabel", "optionValue", "id", "searchMessage", "emptySelectionMessage", "selectionMessage", "autoOptionFocus", "selectOnFocus", "searchLocale", "optionDisabled", "focusOnHover", "typeahead", "variant", "fluid"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide", "onLazyLoad"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "component", type: DynamicFormComponent, selector: "sia-dynamic-form", inputs: ["sections", "entityData", "mode", "displayMode", "visible", "dialogConfig", "drawerConfig", "showSubmitButton", "showCancelButton", "submitButtonLabel", "cancelButtonLabel", "submitButtonIcon", "cancelButtonIcon"], outputs: ["formReady", "formSubmit", "visibleChange", "onCancel", "fieldSave"] }] });
727
+ }
728
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScheduleFormComponent, decorators: [{
729
+ type: Component,
730
+ args: [{ selector: 's-schedule-form', standalone: true, imports: [
731
+ CommonModule, FormsModule, ReactiveFormsModule,
732
+ ButtonModule, DialogModule, DrawerModule, DropdownModule,
733
+ InputNumberModule, MultiSelectModule, TagModule, TooltipModule,
734
+ DividerModule, TableModule, AutoCompleteModule,
735
+ TranslatePipe, DynamicFormComponent
736
+ ], template: "<!-- Schedule Drawer -->\n<p-drawer\n [(visible)]=\"visible\"\n position=\"right\"\n [style]=\"{ width: '85vw', 'max-width': '1200px' }\"\n [modal]=\"true\"\n (onHide)=\"onCancel()\"\n>\n <ng-template pTemplate=\"header\">\n <span class=\"drawer-title\">\n <i class=\"pi pi-calendar\"></i>\n {{\n isEditing\n ? ('crmx.components.schedule_schedule_edit' | translate)\n : ('crmx.components.schedule_schedule_new' | translate)\n }}\n </span>\n </ng-template>\n\n <div class=\"drawer-layout\" *ngIf=\"scheduleForm\">\n <!-- Left: Form -->\n <div class=\"drawer-left\">\n <div class=\"drawer-section-header\">\n <i class=\"pi pi-info-circle\"></i>\n <span>\n {{ 'crmx.components.schedule_schedule_details' | translate }}\n </span>\n </div>\n <sia-dynamic-form\n #detailForm\n [sections]=\"[{ fields: scheduleDetailFields }]\"\n [entityData]=\"entityDataForForm\"\n [mode]=\"'form'\"\n [showSubmitButton]=\"false\"\n [showCancelButton]=\"false\"\n (formReady)=\"onDetailFormReady($event)\"\n ></sia-dynamic-form>\n </div>\n\n <!-- Right: Recurrence + Participants -->\n <div class=\"drawer-right\">\n <div\n class=\"drawer-section\"\n *ngIf=\"showRecurrenceFields\"\n >\n <div class=\"drawer-section-header\">\n <i class=\"pi pi-replay\"></i>\n <span>\n {{\n 'crmx.components.schedule_recurrence_config'\n | translate\n }}\n </span>\n </div>\n <form\n [formGroup]=\"scheduleForm\"\n class=\"drawer-form\"\n >\n <div class=\"form-row\">\n <div class=\"form-field flex-1\">\n <label for=\"recurrence\">\n {{ 'crmx.components.schedule_recurrence' | translate }}\n </label>\n <p-dropdown\n id=\"recurrence\"\n formControlName=\"recurrence\"\n [options]=\"recurrenceOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n class=\"w-full\"\n ></p-dropdown>\n </div>\n <div class=\"form-field flex-1\">\n <label for=\"recurrenceInterval\">\n {{\n 'crmx.components.schedule_recurrence_interval'\n | translate\n }}\n </label>\n <p-inputNumber\n id=\"recurrenceInterval\"\n formControlName=\"recurrenceInterval\"\n [min]=\"1\"\n [max]=\"99\"\n class=\"w-full\"\n ></p-inputNumber>\n </div>\n </div>\n <div\n class=\"form-row\"\n *ngIf=\"showWeekDays\"\n >\n <div class=\"form-field flex-1\">\n <label for=\"weekDays\">\n {{ 'crmx.components.schedule_week_days' | translate }}\n </label>\n <p-multiSelect\n id=\"weekDays\"\n formControlName=\"weekDays\"\n [options]=\"weekDayOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n [placeholder]=\"\n 'crmx.components.schedule_select_week_day'\n | translate\n \"\n [maxSelectedLabels]=\"7\"\n class=\"w-full\"\n ></p-multiSelect>\n </div>\n </div>\n <div\n class=\"form-row\"\n *ngIf=\"showRepeatWhen\"\n >\n <div class=\"form-field flex-1\">\n <label for=\"repeatWhen\">\n {{\n 'crmx.components.schedule_repeat_when' | translate\n }}\n </label>\n <p-dropdown\n id=\"repeatWhen\"\n formControlName=\"repeatWhen\"\n [options]=\"repeatWhenOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n class=\"w-full\"\n ></p-dropdown>\n </div>\n <div\n class=\"form-field flex-1\"\n *ngIf=\"showRepeatWhenDay\"\n >\n <label for=\"repeatWhenDay\">\n {{\n 'crmx.components.schedule_repeat_when_day'\n | translate\n }}\n </label>\n <p-inputNumber\n id=\"repeatWhenDay\"\n formControlName=\"repeatWhenDay\"\n [min]=\"1\"\n [max]=\"31\"\n class=\"w-full\"\n ></p-inputNumber>\n </div>\n <div\n class=\"form-field flex-1\"\n *ngIf=\"showOrdinalFields\"\n >\n <label for=\"repeatWhenOrdinalWeekDay\">\n {{\n 'crmx.components.schedule_ordinal_week_day'\n | translate\n }}\n </label>\n <p-dropdown\n id=\"repeatWhenOrdinalWeekDay\"\n formControlName=\"repeatWhenOrdinalWeekDay\"\n [options]=\"ordinalOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n class=\"w-full\"\n ></p-dropdown>\n </div>\n <div\n class=\"form-field flex-1\"\n *ngIf=\"showOrdinalFields\"\n >\n <label for=\"repeatWhenWeekMonth\">\n {{\n 'crmx.components.schedule_week_month' | translate\n }}\n </label>\n <p-dropdown\n id=\"repeatWhenWeekMonth\"\n formControlName=\"repeatWhenWeekMonth\"\n [options]=\"weekDayOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n class=\"w-full\"\n ></p-dropdown>\n </div>\n </div>\n <div\n class=\"form-row\"\n *ngIf=\"showMonthField\"\n >\n <div class=\"form-field flex-1\">\n <label for=\"repeatWhenMonth\">\n {{\n 'crmx.components.schedule_repeat_month' | translate\n }}\n </label>\n <p-dropdown\n id=\"repeatWhenMonth\"\n formControlName=\"repeatWhenMonth\"\n [options]=\"monthOptions\"\n optionLabel=\"label\"\n optionValue=\"value\"\n class=\"w-full\"\n ></p-dropdown>\n </div>\n </div>\n </form>\n <div\n class=\"recurrence-description\"\n *ngIf=\"recurrenceDescription\"\n >\n <i class=\"pi pi-info-circle\"></i>\n <span>{{ recurrenceDescription }}</span>\n </div>\n </div>\n\n <p-divider></p-divider>\n\n <!-- Participants -->\n <div class=\"drawer-section\">\n <div class=\"drawer-section-header\">\n <i class=\"pi pi-users\"></i>\n <span>\n {{ 'crmx.components.schedule_participants' | translate }}\n </span>\n </div>\n <div class=\"participant-search\">\n <p-autoComplete\n [(ngModel)]=\"selectedParticipantLookup\"\n [ngModelOptions]=\"{standalone: true}\"\n [suggestions]=\"participantSuggestions\"\n (completeMethod)=\"\n onSearchParticipants($event)\n \"\n (onSelect)=\"\n onSelectParticipant($event.value)\n \"\n (onFocus)=\"\n onSearchParticipants({ query: '' })\n \"\n optionLabel=\"name\"\n [placeholder]=\"\n 'crmx.components.schedule_search_participant'\n | translate\n \"\n [minLength]=\"0\"\n [forceSelection]=\"true\"\n [showClear]=\"true\"\n [fluid]=\"true\"\n >\n <ng-template\n let-item\n pTemplate=\"item\"\n >\n <div class=\"participant-suggestion\">\n <i\n [class]=\"getOriginIcon(item.origin)\"\n ></i>\n <div\n class=\"participant-suggestion-info\"\n >\n <span\n class=\"participant-suggestion-name\"\n >\n {{ item.name }}\n </span>\n <span\n class=\"participant-suggestion-detail\"\n *ngIf=\"item.referenceName\"\n >\n {{ item.referenceName }}\n </span>\n </div>\n <span\n class=\"participant-suggestion-origin\"\n >\n {{ getOriginLabel(item.origin) }}\n </span>\n </div>\n </ng-template>\n </p-autoComplete>\n </div>\n <div\n *ngIf=\"\n !participantsLoading &&\n addedParticipants.length === 0\n \"\n class=\"participants-empty\"\n >\n <i class=\"pi pi-users\"></i>\n <p>\n {{\n 'crmx.components.schedule_no_participants'\n | translate\n }}\n </p>\n </div>\n <p-table\n *ngIf=\"\n !participantsLoading &&\n addedParticipants.length > 0\n \"\n [value]=\"addedParticipants\"\n styleClass=\"p-datatable-sm p-datatable-striped\"\n >\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"col\">\n {{ 'crmx.components.schedule_name' | translate }}\n </th>\n <th\n scope=\"col\"\n class=\"col-participant-type\"\n >\n {{\n 'crmx.components.schedule_participant_type'\n | translate\n }}\n </th>\n <th\n scope=\"col\"\n class=\"col-actions\"\n ></th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\" let-p>\n <tr>\n <td>\n <div class=\"participant-name-cell\">\n <span>{{ p.name }}</span>\n <span\n *ngIf=\"p.referenceName\"\n class=\"participant-reference\"\n >\n {{ p.referenceName }}\n </span>\n </div>\n </td>\n <td>\n <div class=\"participant-type-cell\">\n <i\n [class]=\"getOriginIcon(p.origin)\"\n ></i>\n <span>\n {{ getOriginLabel(p.origin) }}\n </span>\n </div>\n </td>\n <td>\n <p-button\n icon=\"pi pi-trash\"\n [rounded]=\"true\"\n [text]=\"true\"\n severity=\"danger\"\n (onClick)=\"onRemoveParticipant(p)\"\n [pTooltip]=\"\n 'crmx.components.schedule_remove' | translate\n \"\n tooltipPosition=\"top\"\n ></p-button>\n </td>\n </tr>\n </ng-template>\n </p-table>\n </div>\n </div>\n </div>\n\n <ng-template pTemplate=\"footer\">\n <div class=\"drawer-footer\">\n <p-button\n [label]=\"'crmx.components.cancel' | translate\"\n icon=\"pi pi-times\"\n severity=\"secondary\"\n [outlined]=\"true\"\n (onClick)=\"onCancel()\"\n ></p-button>\n <p-button\n [label]=\"'crmx.components.save' | translate\"\n icon=\"pi pi-check\"\n (onClick)=\"onSave()\"\n ></p-button>\n </div>\n </ng-template>\n</p-drawer>\n", styles: [".col-participant-type{width:10rem}.col-actions{width:4rem}.w-full{width:100%}.drawer-title{display:flex;align-items:center;gap:.75rem;font-size:1.15rem;font-weight:600;color:var(--p-text-color)}.drawer-title i{color:var(--p-primary-color)}.drawer-layout{display:flex;gap:0;height:100%}.drawer-left{width:380px;min-width:380px;border-right:1px solid var(--p-surface-200);padding:0 1.5rem 1.5rem 0;overflow-y:auto}.drawer-right{flex:1;padding:0 0 0 1.5rem;overflow-y:auto}.drawer-section-header{display:flex;align-items:center;gap:.5rem;padding-bottom:1rem;margin-bottom:1rem;border-bottom:1px solid var(--p-surface-200);font-weight:600;font-size:.95rem;color:var(--p-text-color)}.drawer-section-header i{color:var(--p-primary-color);font-size:1rem}.drawer-form{display:flex;flex-direction:column;gap:1rem}.drawer-form .form-field{display:flex;flex-direction:column;gap:.375rem}.drawer-form .form-field.flex-1{flex:1 1 0%;min-width:0}.drawer-form .form-field label{font-weight:500;font-size:.8rem;color:var(--p-text-secondary-color);text-transform:uppercase;letter-spacing:.3px}.drawer-form .form-row{display:flex;gap:1rem}.drawer-form .form-row.checkboxes{gap:2rem;padding:.5rem 0}.drawer-form .form-check{display:flex;align-items:center;gap:.5rem}.drawer-form .form-check label{font-size:.875rem;font-weight:500;margin:0;text-transform:none;letter-spacing:0}.drawer-section{margin-bottom:1.5rem}.recurrence-description{display:flex;align-items:flex-start;gap:.5rem;margin-top:1rem;padding:.75rem 1rem;background:var(--p-primary-50);border-left:3px solid var(--p-primary-color);border-radius:4px;font-size:.85rem;color:var(--p-text-color);line-height:1.4}.recurrence-description i{color:var(--p-primary-color);margin-top:.1rem;flex-shrink:0}.participants-empty{display:flex;flex-direction:column;align-items:center;padding:2rem;text-align:center;color:var(--p-text-secondary-color);border:1px dashed var(--p-surface-300);border-radius:8px}.participants-empty i{font-size:2rem;margin-bottom:.5rem;opacity:.4}.participants-empty p{margin:0}.participant-name-cell{display:flex;align-items:center;gap:.5rem}.participant-type-cell{display:flex;align-items:center;gap:.5rem;font-size:.85rem;color:var(--p-text-secondary-color)}.participant-type-cell i{font-size:.9rem}.drawer-footer{display:flex;gap:.75rem;justify-content:flex-end}.participant-search{margin-bottom:1rem}.participant-search :host ::ng-deep .p-autocomplete{width:100%;display:flex}.participant-search :host ::ng-deep .p-autocomplete-input{width:100%}.participant-suggestion{display:flex;align-items:center;gap:.75rem;padding:.25rem 0}.participant-suggestion i{font-size:1.1rem;color:var(--p-text-secondary-color)}.participant-suggestion-info{display:flex;flex-direction:column;flex:1;min-width:0}.participant-suggestion-name{font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.participant-suggestion-detail{font-size:.8rem;color:var(--p-text-secondary-color)}.participant-suggestion-origin{font-size:.75rem;color:var(--p-text-secondary-color);white-space:nowrap}.participant-reference{font-size:.8rem;color:var(--p-text-secondary-color);margin-left:.25rem}.detail-dialog-body{display:flex;flex-direction:column;gap:.5rem}.detail-dialog-row{display:flex;align-items:center;gap:.75rem;padding:.4rem 0}.detail-label{font-weight:500;color:var(--p-text-secondary-color);min-width:8rem}@media (max-width: 768px){.drawer-layout{flex-direction:column}.drawer-left{width:100%;min-width:100%;border-right:none;border-bottom:1px solid var(--p-surface-200);padding:0 0 1.5rem}.drawer-right{padding:1.5rem 0 0}}\n"] }]
737
+ }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.ScheduleService }, { type: i3.ScheduleTypeService }, { type: i4.CurrentCollaboratorService }, { type: i5.TranslationService }], propDecorators: { visible: [{
738
+ type: Input
739
+ }], selectedDate: [{
740
+ type: Input
741
+ }], visibleChange: [{
742
+ type: Output
743
+ }], saved: [{
744
+ type: Output
745
+ }], detailFormComponent: [{
746
+ type: ViewChild,
747
+ args: ['detailForm']
748
+ }] } });
749
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGUtZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL3NjaGVkdWxlL3NjaGVkdWxlLWZvcm0vc2NoZWR1bGUtZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL3NjaGVkdWxlL3NjaGVkdWxlLWZvcm0vc2NoZWR1bGUtZm9ybS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxtQkFBbUIsRUFBMEIsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEcsT0FBTyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsb0JBQW9CLEVBQTBCLGFBQWEsRUFBc0IsTUFBTSwrQkFBK0IsQ0FBQztBQU9oSSxPQUFPLEVBQ0wsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFDekQsY0FBYyxFQUFFLEtBQUssRUFDdEIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQ0wsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFDOUMsbUJBQW1CLEVBQUUsaUJBQWlCLEVBQ3RDLGlCQUFpQixFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFDdEQsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQ0wsY0FBYyxJQUFJLGVBQWUsRUFBRSxhQUFhLElBQUksY0FBYyxFQUNsRSxrQkFBa0IsSUFBSSxtQkFBbUIsRUFBRSxrQkFBa0IsSUFBSSxtQkFBbUIsRUFDcEYsc0JBQXNCLElBQUksdUJBQXVCLEVBQUUsbUJBQW1CLElBQUksb0JBQW9CLEVBQzlGLGdCQUFnQixJQUFJLGlCQUFpQixFQUFFLHVCQUF1QixJQUFJLHdCQUF3QixFQUMxRixvQkFBb0IsSUFBSSxxQkFBcUIsRUFFOUMsTUFBTSxxQ0FBcUMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRTdDLHFEQUFxRDtBQUNyRCxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUM7QUFDNUIsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDO0FBQ3hCLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxDQUFDO0FBZW5DLE1BQU0sT0FBTyxxQkFBcUI7SUFrQ2I7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQXJDVixPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ2hCLFlBQVksR0FBUyxJQUFJLElBQUksRUFBRSxDQUFDO0lBQy9CLGFBQWEsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO0lBQzVDLEtBQUssR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBRXBCLG1CQUFtQixDQUF3QjtJQUVwRSxvQkFBb0IsR0FBNkIsRUFBRSxDQUFDO0lBQ3BELGlCQUFpQixHQUFtQyxJQUFJLENBQUM7SUFDekQsWUFBWSxDQUFhO0lBQ3pCLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDbEIscUJBQXFCLEdBQWtCLElBQUksQ0FBQztJQUM1QyxhQUFhLEdBQW1CLEVBQUUsQ0FBQztJQUNuQyxZQUFZLEdBQTBCLEVBQUUsQ0FBQztJQUN6QyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7SUFDNUIscUJBQXFCLEdBQUcsRUFBRSxDQUFDO0lBRTNCLDhCQUE4QjtJQUNiLGlCQUFpQixHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFekQsc0JBQXNCLEdBQXdCLEVBQUUsQ0FBQztJQUNqRCx5QkFBeUIsR0FBNkIsSUFBSSxDQUFDO0lBQzNELGlCQUFpQixHQUF3QixFQUFFLENBQUM7SUFFNUMsZUFBZSxHQUF1QyxFQUFFLENBQUM7SUFDekQsaUJBQWlCLEdBQXVDLEVBQUUsQ0FBQztJQUMzRCxjQUFjLEdBQXVDLEVBQUUsQ0FBQztJQUN4RCxpQkFBaUIsR0FBdUMsRUFBRSxDQUFDO0lBQzNELGNBQWMsR0FBdUMsRUFBRSxDQUFDO0lBQ3hELFlBQVksR0FBdUMsRUFBRSxDQUFDO0lBRXRELDREQUE0RDtJQUM1RCxZQUNtQixFQUFlLEVBQ2YsZUFBZ0MsRUFDaEMsbUJBQXdDLEVBQ3hDLDBCQUFzRCxFQUN0RCxDQUFxQjtRQUpyQixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2Ysb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUFDeEMsK0JBQTBCLEdBQTFCLDBCQUEwQixDQUE0QjtRQUN0RCxNQUFDLEdBQUQsQ0FBQyxDQUFvQjtJQUNyQyxDQUFDO0lBRUosUUFBUTtRQUNOLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLGlDQUFpQyxFQUFFLENBQUM7SUFDM0MsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixJQUFJLENBQUMsMEJBQTBCLENBQUMsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQy9DLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO2dCQUNmLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxNQUFNLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQztZQUNsRCxDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQUcsRUFBRTtnQkFDVixJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1lBQ3BDLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sV0FBVztRQUNqQixJQUFJLENBQUMsZUFBZSxHQUFHO1lBQ3JCLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLHVDQUF1QyxDQUFDLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixDQUFDLEdBQUcsRUFBRTtZQUNqRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQywwQ0FBMEMsQ0FBQyxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUU7WUFDdkcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsd0NBQXdDLENBQUMsRUFBRSxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsSUFBSSxFQUFFO1lBQ25HLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLDRDQUE0QyxDQUFDLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixDQUFDLFFBQVEsRUFBRTtTQUM1RyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGlCQUFpQixHQUFHO1lBQ3ZCLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLDJDQUEyQyxDQUFDLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixDQUFDLEtBQUssRUFBRTtZQUN6RyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyw0Q0FBNEMsQ0FBQyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLEVBQUU7WUFDM0csRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsNkNBQTZDLENBQUMsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLENBQUMsT0FBTyxFQUFFO1lBQzdHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLDRDQUE0QyxDQUFDLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixDQUFDLE1BQU0sRUFBRTtTQUM1RyxDQUFDO1FBQ0YsSUFBSSxDQUFDLGNBQWMsR0FBRztZQUNwQixFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxpQ0FBaUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQ3JGLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLGlDQUFpQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUU7WUFDckYsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsa0NBQWtDLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUN2RixFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxvQ0FBb0MsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQzNGLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLG1DQUFtQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUU7WUFDekYsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsaUNBQWlDLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRTtZQUNyRixFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxtQ0FBbUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFO1NBQzFGLENBQUM7UUFDRixJQUFJLENBQUMsaUJBQWlCLEdBQUc7WUFDdkIsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsd0NBQXdDLENBQUMsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLEtBQUssRUFBRTtZQUM5RixFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxxREFBcUQsQ0FBQyxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsZ0JBQWdCLEVBQUU7U0FDdkgsQ0FBQztRQUNGLElBQUksQ0FBQyxjQUFjLEdBQUc7WUFDcEIsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsd0NBQXdDLENBQUMsRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLEtBQUssRUFBRTtZQUNsRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyx5Q0FBeUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxjQUFjLENBQUMsTUFBTSxFQUFFO1lBQ3BHLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLHdDQUF3QyxDQUFDLEVBQUUsS0FBSyxFQUFFLGNBQWMsQ0FBQyxLQUFLLEVBQUU7WUFDbEcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMseUNBQXlDLENBQUMsRUFBRSxLQUFLLEVBQUUsY0FBYyxDQUFDLE1BQU0sRUFBRTtZQUNwRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyx1Q0FBdUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxjQUFjLENBQUMsSUFBSSxFQUFFO1NBQ2pHLENBQUM7UUFDRixJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqRCxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUM7U0FDakYsQ0FBQyxDQUFDLENBQUM7SUFDTixDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4RCxNQUFNLE9BQU8sR0FBRyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUNuRCxNQUFNLE9BQU8sR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQztRQUNoRCxJQUFJLENBQUMsb0JBQW9CLEdBQUc7WUFDMUIsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQywrQkFBK0IsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMscUNBQXFDLENBQUMsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7WUFDcFMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxtQ0FBbUMsQ0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtZQUN6UixFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLCtCQUErQixDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLCtCQUErQixDQUFDLEVBQUUsQ0FBQyxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsc0NBQXNDLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO1lBQzFkLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMscUNBQXFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLFlBQVksRUFBRSxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUEwQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUU7WUFDN1EsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxtQ0FBbUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBMEIsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLEtBQUssSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7WUFDMUwsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxxQ0FBcUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUEwQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7WUFDbE4sRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxtQ0FBbUMsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUEwQixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUU7WUFDNU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxrQ0FBa0MsQ0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO1lBQ3RJLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQywwQ0FBMEMsQ0FBQyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFO1lBQ3RKLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsbUNBQW1DLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyx5Q0FBeUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRTtTQUN4TSxDQUFDO0lBQ0osQ0FBQztJQUVELGlCQUFpQixDQUFDLElBQWU7UUFDL0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUN0QyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQ3BDLENBQUM7UUFDRixJQUFJLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsNENBQTRDO0lBQ3BDLHFCQUFxQjtRQUMzQixNQUFNLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FDMUIsWUFBWSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUN4RCxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7WUFDdEQsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQzFCLG9CQUFvQixFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUN6QyxDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUMxQixVQUFVLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQ3RELENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDOUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQzFCLFlBQVksRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQ2hELENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQzFCLGVBQWUsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FDaEQsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsMEJBQTBCLENBQUMsRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUMxQiwwQkFBMEIsRUFDMUIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDeEMsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsRUFBRSxDQUFDO1lBQ3ZELElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUMxQixxQkFBcUIsRUFDckIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDeEMsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1lBQ25ELElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUMxQixpQkFBaUIsRUFDakIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQ3RDLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNLLDJCQUEyQjtRQUNqQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7UUFDMUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVPLHNCQUFzQixDQUFDLENBQU87UUFDcEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FDekQsQ0FBQyxHQUFXLEVBQUUsRUFBRTtZQUNkLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNoQyxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTyx3QkFBd0IsQ0FBQyxHQUFXLEVBQUUsQ0FBTztRQUNuRCxJQUFJLEdBQUcsS0FBSyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUN0QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxLQUFLLENBQUM7WUFDekQsSUFBSSxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNyQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FDMUIsRUFBRSxRQUFRLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQ3BDLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxDQUNyQixDQUFDO1lBQ0osQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQzFCLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUNoQixFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FDckIsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRU8sNkJBQTZCLENBQ25DLEdBQVcsRUFBRSxDQUFPO1FBRXBCLElBQ0UsR0FBRyxLQUFLLGtCQUFrQixDQUFDLE9BQU87WUFDbEMsR0FBRyxLQUFLLGtCQUFrQixDQUFDLE1BQU0sRUFDakMsQ0FBQztZQUNELElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO2dCQUMzQixVQUFVLEVBQ1IsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxJQUFJLFVBQVUsQ0FBQyxLQUFLO2dCQUNoRSxhQUFhLEVBQ1gsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUU7Z0JBQzlELHdCQUF3QixFQUN0QixJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxFQUFFLEtBQUs7dUJBQ25ELGlCQUFpQixDQUFDLENBQUMsQ0FBQztnQkFDM0IsbUJBQW1CLEVBQ2pCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsS0FBSzt1QkFDOUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO2FBQzVCLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUMzQixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO2dCQUMzQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIsYUFBYSxFQUFFLElBQUk7Z0JBQ25CLHdCQUF3QixFQUFFLElBQUk7Z0JBQzlCLG1CQUFtQixFQUFFLElBQUk7Z0JBQ3pCLGVBQWUsRUFBRSxJQUFJO2FBQ3RCLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVPLDJCQUEyQixDQUFDLEdBQVcsRUFBRSxDQUFPO1FBQ3RELElBQUksR0FBRyxLQUFLLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO2dCQUMzQixlQUFlLEVBQ2IsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsRUFBRSxLQUFLO3VCQUMxQyxlQUFlLENBQUMsQ0FBQyxDQUFDO2FBQzFCLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUMzQixDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUMxQixFQUFFLGVBQWUsRUFBRSxJQUFJLEVBQUUsRUFDekIsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQ3JCLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVPLHNCQUFzQixDQUFDLENBQU87UUFDcEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLFNBQVMsQ0FDekQsQ0FBQyxFQUFVLEVBQUUsRUFBRTtZQUNiLElBQUksRUFBRSxLQUFLLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7b0JBQzNCLGFBQWEsRUFDWCxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRTtvQkFDOUQsd0JBQXdCLEVBQUUsSUFBSTtvQkFDOUIsbUJBQW1CLEVBQUUsSUFBSTtpQkFDMUIsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzNCLENBQUM7aUJBQU0sSUFBSSxFQUFFLEtBQUssVUFBVSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO29CQUMzQixhQUFhLEVBQUUsSUFBSTtvQkFDbkIsd0JBQXdCLEVBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLEVBQUUsS0FBSzsyQkFDbkQsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO29CQUMzQixtQkFBbUIsRUFDakIsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsRUFBRSxLQUFLOzJCQUM5QyxpQkFBaUIsQ0FBQyxDQUFDLENBQUM7aUJBQzVCLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUMzQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sK0NBQStDO1lBQ2pELENBQUM7WUFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDaEMsQ0FBQyxDQUNGLENBQUM7SUFDSixDQUFDO0lBRU8sMEJBQTBCLENBQUMsQ0FBTztRQUN4QyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLFlBQVksQ0FBQyxTQUFTLENBQzdELEdBQUcsRUFBRTtZQUNILE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsS0FBSyxLQUFLLElBQUksQ0FBQztZQUN4RSxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUNaLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDOUIsQ0FBQztRQUNILENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVPLG1CQUFtQixDQUFDLENBQU87UUFDakMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRU8sb0JBQW9CO1FBQzFCLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLENBQUM7UUFDaEMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7Z0JBQzNCLE9BQU8sRUFBRSxJQUFJO2dCQUNiLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixrQkFBa0IsRUFBRSxJQUFJO2dCQUN4QixRQUFRLEVBQUUsSUFBSTtnQkFDZCxVQUFVLEVBQUUsSUFBSTtnQkFDaEIsYUFBYSxFQUFFLElBQUk7Z0JBQ25CLHdCQUF3QixFQUFFLElBQUk7Z0JBQzlCLG1CQUFtQixFQUFFLElBQUk7Z0JBQ3pCLGVBQWUsRUFBRSxJQUFJO2FBQ3RCLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRU8sUUFBUTtRQUNkLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2hDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQztZQUNWLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO1lBQ3hFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQztZQUNaLFFBQVEsRUFBRSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ3hELE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNmLGNBQWMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUN2QixTQUFTLEVBQUU7Z0JBQ1Qsa0JBQWtCLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxHQUFHLENBQUM7Z0JBQzVDLFVBQVUsQ0FBQyxRQUFRO2FBQ3BCO1lBQ0QsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ2YsU0FBUyxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3pCLE9BQU8sRUFBRSxDQUFDLFVBQVUsQ0FBQztZQUNyQixVQUFVLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUM7WUFDdEMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkIsUUFBUSxFQUFFLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLFVBQVUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7WUFDOUIsYUFBYSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQzlCLHdCQUF3QixFQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEQsbUJBQW1CLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3QyxlQUFlLEVBQUUsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkMsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDO1NBQ2YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGlDQUFpQztRQUN2QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUN6QixZQUFZLENBQUMsV0FBVyxDQUFDLENBQzFCLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQywwQkFBMEIsRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVPLDBCQUEwQjtRQUNoQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDbEMsSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdEMsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztZQUNoQyxPQUFPO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxlQUFlLENBQUMsNkJBQTZCLENBQ2hELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FDL0IsQ0FBQyxTQUFTLENBQUM7WUFDVixJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDVixJQUFJLENBQUMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7WUFDbkQsQ0FBQztZQUNELEtBQUssRUFBRSxHQUFHLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztZQUNsQyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLHNCQUFzQixDQUFDLENBQTBCO1FBQ3ZELE9BQU87WUFDTCxHQUFHLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7WUFDL0IsTUFBTSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxLQUFLO1lBQzVCLGNBQWMsRUFBRSxJQUFJO1lBQ3BCLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUM7WUFDaEQsVUFBVSxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUM7WUFDM0IsR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDO1NBQ3pDLENBQUM7SUFDSixDQUFDO0lBRU8sb0JBQW9CLENBQUMsQ0FBMEI7UUFDckQsT0FBTztZQUNMLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3ZDLE9BQU8sRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSTtZQUN6RCxTQUFTLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDL0QsT0FBTyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1NBQzFELENBQUM7SUFDSixDQUFDO0lBRU8sNkJBQTZCLENBQUMsQ0FBMEI7UUFDOUQsT0FBTztZQUNMLFFBQVEsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSTtZQUMvQixVQUFVLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLElBQUk7WUFDbkMsYUFBYSxFQUFFLENBQUMsQ0FBQyxlQUFlLENBQUMsSUFBSSxJQUFJO1lBQ3pDLHdCQUF3QixFQUFFLENBQUMsQ0FBQywwQkFBMEIsQ0FBQyxJQUFJLElBQUk7WUFDL0QsbUJBQW1CLEVBQUUsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLElBQUksSUFBSTtZQUNyRCxlQUFlLEVBQUUsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLElBQUksSUFBSTtTQUM5QyxDQUFDO0lBQ0osQ0FBQztJQUVPLGlCQUFpQjtRQUN2QixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDO1lBQzVCLElBQUksRUFBRSxHQUFHO1lBQ1QsV0FBVyxFQUFFLG1CQUFtQjtTQUNqQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ1gsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ1YsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ2xDLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsT0FBTztRQUNMLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLE1BQU0sR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDdkIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDO1FBQzlCLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxJQUFJLENBQUMsaUJBQWlCLEdBQUc7WUFDdkIsU0FBUyxFQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxZQUFZLElBQUksR0FBRyxDQUFDO1lBQ3ZELFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNO1lBQ2pDLE1BQU0sRUFBRSxLQUFLO1lBQ2IsY0FBYyxFQUFFLEtBQUs7WUFDckIsU0FBUyxFQUFFLFlBQVk7WUFDdkIsT0FBTyxFQUFFLFVBQVU7U0FDcEIsQ0FBQztRQUNGLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxxQkFBcUIsR0FBRyxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCxRQUFRLENBQUMsVUFBa0I7UUFDekIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUM3QyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtnQkFDYixJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxHQUFHLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztnQkFDOUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztnQkFDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzlCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ2QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7d0JBQ3RCLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDOzRCQUMzQixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7NEJBQ1gsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVOzRCQUMzQixrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCOzRCQUMzQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7NEJBQ3ZCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTs0QkFDM0IsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhOzRCQUNqQyx3QkFBd0IsRUFBRSxJQUFJLENBQUMsd0JBQXdCOzRCQUN2RCxtQkFBbUIsRUFBRSxJQUFJLENBQUMsbUJBQW1COzRCQUM3QyxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWU7eUJBQ3RDLENBQUMsQ0FBQztvQkFDTCxDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztTQUNGLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxnQkFBZ0IsQ0FBQyxVQUFrQjtRQUN6QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQzFELElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNWLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7Z0JBQ3JDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsWUFBWTtxQkFDdkMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO3FCQUN6QixHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQ3JDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBMEIsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztnQkFDckQsSUFBSSxDQUFDLG1CQUFtQixHQUFHLEtBQUssQ0FBQztZQUNuQyxDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQUcsRUFBRTtnQkFDVixJQUFJLENBQUMsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1lBQ25DLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU8sbUJBQW1CLENBQ3pCLENBQXNCO1FBRXRCLElBQUksQ0FBQyxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ25CLE9BQU87Z0JBQ0wsRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRTtnQkFDckIsSUFBSSxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSTtnQkFDekIsTUFBTSxFQUFFLGNBQWM7YUFDdkIsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNkLE9BQU87Z0JBQ0wsRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDaEIsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSTtnQkFDcEIsTUFBTSxFQUFFLFNBQVM7YUFDbEIsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNyQixPQUFPO2dCQUNMLEVBQUUsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLEVBQUU7Z0JBQ3ZCLElBQUksRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLElBQUk7Z0JBQzNCLGFBQWEsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLE9BQU8sRUFBRSxJQUFJO2dCQUM3QyxXQUFXLEVBQUUsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDekMsTUFBTSxFQUFFLGlCQUFpQjthQUMxQixDQUFDO1FBQ0osQ0FBQztRQUNELElBQUksQ0FBQyxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDMUIsT0FBTztnQkFDTCxFQUFFLEVBQUUsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLEVBQUU7Z0JBQzVCLElBQUksRUFBRSxDQUFDLENBQUMsbUJBQW1CLENBQUMsSUFBSTtnQkFDaEMsTUFBTSxFQUFFLHNCQUFzQjthQUMvQixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELG9CQUFvQixDQUFDLEtBQXdCO1FBQzNDLElBQUksQ0FBQyxlQUFlLENBQUMsdUJBQXVCLENBQzFDLEtBQUssQ0FBQyxLQUFLLElBQUksRUFBRSxFQUNqQix3QkFBd0IsQ0FDekIsQ0FBQyxTQUFTLENBQUM7WUFDVixJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDVixNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FDdEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUNqRCxDQUFDO2dCQUNGLElBQUksQ0FBQyxzQkFBc0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO3FCQUM3QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNqRCxDQUFDO1lBQ0QsS0FBSyxFQUFFLEdBQUcsRUFBRTtnQkFDVixJQUFJLENBQUMsc0JBQXNCLEdBQUcsRUFBRSxDQUFDO1lBQ25DLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsbUJBQW1CLENBQUMsV0FBOEI7UUFDaEQsSUFDRSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQzFCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxXQUFXLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxNQUFNLEtBQUssV0FBVyxDQUFDLE1BQU0sQ0FDaEUsRUFDRCxDQUFDO1lBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUNELFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMseUJBQXlCLEdBQUcsSUFBSSxDQUFDO1FBQ3hDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG1CQUFtQixDQUFDLFdBQThCO1FBQ2hELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUNwRCxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLFdBQVcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQ25FLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsTUFBTTtRQUNKLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDckMsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBNEIsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDakUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFNBQVM7WUFDdkIsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQVcsRUFBRSxPQUFPLENBQUM7WUFDL0QsQ0FBQyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pDLElBQUksVUFBa0IsQ0FBQztRQUN2QixFQUFFLENBQUMsSUFBSSxDQUNMLFNBQVMsQ0FBQyxDQUFDLE1BQStCLEVBQUUsRUFBRTtZQUM1QyxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVM7Z0JBQ3pCLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFXO2dCQUN6QixDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFXLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGtCQUFrQixDQUM1QyxVQUFVLEVBQ1YsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQ3RDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FDSCxDQUFDLFNBQVMsQ0FBQztZQUNWLElBQUksRUFBRSxHQUFHLEVBQUU7Z0JBQ1QsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUM5QixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QixNQUFNLE9BQU8sR0FBNEI7WUFDdkMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUs7WUFDMUIsSUFBSSxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxJQUFJO1lBQzFDLFVBQVUsRUFBRSxJQUFJLENBQUMscUJBQXFCLElBQUksSUFBSTtTQUMvQyxDQUFDO1FBQ0YsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUN6QixPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFDRCxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3ZCLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDeEQsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDekIsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUM1RCxDQUFDO1FBQ0QsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN2QixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztZQUMvQixJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEMsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDdEIsT0FBTyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUM1QixPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzVCLENBQUM7UUFDRCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRU8sc0JBQXNCLENBQUMsT0FBZ0M7UUFDN0QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUMxQixPQUFPLENBQUMsb0JBQW9CLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDckMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUMzQixPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxlQUFlLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDaEMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzNDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUN0QyxPQUFPLENBQUMsaUJBQWlCLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDcEMsQ0FBQztJQUVELFFBQVE7UUFDTixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNyQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRU8sOEJBQThCO1FBTXBDLE1BQU0sQ0FBQyxHQUFhLEVBQUUsQ0FBQztRQUN2QixNQUFNLEVBQUUsR0FBYSxFQUFFLENBQUM7UUFDeEIsTUFBTSxDQUFDLEdBQWEsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sQ0FBQyxHQUFhLEVBQUUsQ0FBQztRQUN2QixLQUFLLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3ZDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNqQixLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7b0JBQ2YsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ2IsTUFBTTtnQkFDUixDQUFDO2dCQUNELEtBQUssaUJBQWlCLENBQUMsQ0FBQyxDQUFDO29CQUN2QixFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDZCxNQUFNO2dCQUNSLENBQUM7Z0JBQ0QsS0FBSyxjQUFjLENBQUMsQ0FBQyxDQUFDO29CQUNwQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDYixNQUFNO2dCQUNSLENBQUM7Z0JBQ0QsS0FBSyxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7b0JBQzVCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNiLE1BQU07Z0JBQ1IsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTztZQUNMLFVBQVUsRUFBRSxDQUFDO1lBQ2IsaUJBQWlCLEVBQUUsRUFBRTtZQUNyQixlQUFlLEVBQUUsQ0FBQztZQUNsQixzQkFBc0IsRUFBRSxDQUFDO1NBQzFCLENBQUM7SUFDSixDQUFDO0lBRUQ7OztPQUdHO0lBQ0sscUJBQXFCLENBQUMsQ0FBMEI7UUFDdEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBVyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3BDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDdkIsQ0FBQztRQUNELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM5QixJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTyxzQkFBc0IsQ0FBQyxDQUEwQixFQUFFLENBQVM7UUFDbEUsSUFDRSxDQUFDLEtBQUssa0JBQWtCLENBQUMsS0FBSztZQUM5QixDQUFDLEtBQUssa0JBQWtCLENBQUMsTUFBTSxFQUMvQixDQUFDO1lBQ0QsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQztZQUN2QixDQUFDLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzFCLENBQUMsQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUNyQyxDQUFDLENBQUMscUJBQXFCLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDaEMsQ0FBQyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzlCLENBQUM7SUFDSCxDQUFDO0lBRU8sa0JBQWtCLENBQUMsQ0FBMEIsRUFBRSxDQUFTO1FBQzlELElBQUksQ0FBQyxLQUFLLGtCQUFrQixDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3JDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUM1QixJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEMsQ0FBQztJQUNILENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxDQUEwQixFQUFFLENBQVM7UUFDN0QsSUFBSSxDQUFDLEtBQUssa0JBQWtCLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLENBQUM7SUFDSCxDQUFDO0lBRU8scUJBQXFCLENBQUMsQ0FBMEI7UUFDdEQsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3pDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUNyQyxDQUFDLENBQUMscUJBQXFCLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDbEMsQ0FBQzthQUFNLENBQUM7WUFDTixDQUFDLENBQUMsZUFBZSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDO0lBRU8sdUJBQXVCLENBQUMsSUFBVTtRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLE9BQU87UUFDVCxDQUFDO1FBQ0QsTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7WUFDM0IsVUFBVSxFQUFFLGtCQUFrQixDQUFDLEtBQUs7WUFDcEMsa0JBQWtCLEVBQUUsQ0FBQztZQUNyQixRQUFRLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQyxVQUFVLEVBQUUsVUFBVSxDQUFDLEtBQUs7WUFDNUIsYUFBYSxFQUFFLENBQUMsQ0FBQyxPQUFPLEVBQUU7WUFDMUIsd0JBQXdCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1lBQzlDLG1CQUFtQixFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQztZQUN6QyxlQUFlLEVBQUUsZUFBZSxDQUFDLENBQUMsQ0FBQztTQUNwQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBSSxvQkFBb0I7UUFDdEIsT0FBTyxJQUFJLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLEtBQUssS0FBSyxJQUFJLENBQUM7SUFDbEUsQ0FBQztJQUVELElBQUksaUJBQWlCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsS0FBSyxDQUFDO0lBQ3JELENBQUM7SUFFRCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLEtBQUssQ0FBQztJQUNyRCxDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsT0FBTyxJQUFJLENBQUMsaUJBQWlCLEtBQUssa0JBQWtCLENBQUMsTUFBTSxDQUFDO0lBQzlELENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxDQUNMLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxrQkFBa0IsQ0FBQyxPQUFPO1lBQ3JELElBQUksQ0FBQyxpQkFBaUIsS0FBSyxrQkFBa0IsQ0FBQyxNQUFNLENBQ3JELENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxpQkFBaUI7UUFDbkIsT0FBTyxJQUFJLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxVQUFVLENBQUMsS0FBSyxDQUFDO0lBQzVFLENBQUM7SUFFRCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLENBQ0wsSUFBSSxDQUFDLGNBQWM7WUFDbkIsSUFBSSxDQUFDLGlCQUFpQixLQUFLLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FDdkQsQ0FBQztJQUNKLENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLEtBQUssa0JBQWtCLENBQUMsTUFBTSxDQUFDO0lBQzlELENBQUM7SUFFRCxjQUFjLENBQUMsQ0FBb0IsSUFBWSxPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRixhQUFhLENBQUMsQ0FBb0IsSUFBWSxPQUFPLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekUsa0JBQWtCLENBQUMsQ0FBc0IsSUFBWSxPQUFPLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRixrQkFBa0IsQ0FBQyxDQUFzQixJQUFZLE9BQU8sbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0Ysc0JBQXNCLENBQUMsQ0FBc0IsSUFBWSxPQUFPLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3RixtQkFBbUIsQ0FBQyxDQUFTLElBQXNCLE9BQU8sb0JBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BGLGdCQUFnQixDQUFDLENBQVMsSUFBWSxPQUFPLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVFLHVCQUF1QixDQUFDLENBQVMsSUFBMEIsT0FBTyx3QkFBd0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEcsb0JBQW9CLENBQUMsQ0FBUyxJQUFZLE9BQU8scUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFNUUsbUJBQW1CLENBQUMsQ0FBTztRQUNqQyxPQUFPLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxFQUFVO1FBQ2xDLE9BQU8saUJBQWlCLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDL0IsQ0FBQzt3R0F4eUJVLHFCQUFxQjs0RkFBckIscUJBQXFCLHlUQzFEbEMscW5ZQWlZQSx1akhEaFZJLFlBQVksa0lBQUUsV0FBVyxtbUJBQUUsbUJBQW1CLCtVQUM5QyxZQUFZLHdoQkFBRSxZQUFZLDhCQUFFLFlBQVksaWFBQUUsY0FBYyxxckNBQ3hELGlCQUFpQixreUJBQUUsaUJBQWlCLGk1Q0FBRSxTQUFTLDhCQUFFLGFBQWEsc1hBQzlELGFBQWEsMkpBQUUsV0FBVyw0K0RBQUUsa0JBQWtCLGl3Q0FDOUMsYUFBYSxrREFBRSxvQkFBb0I7OzRGQUsxQixxQkFBcUI7a0JBYmpDLFNBQVM7K0JBQ0UsaUJBQWlCLGNBQ2YsSUFBSSxXQUNQO3dCQUNQLFlBQVksRUFBRSxXQUFXLEVBQUUsbUJBQW1CO3dCQUM5QyxZQUFZLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxjQUFjO3dCQUN4RCxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxTQUFTLEVBQUUsYUFBYTt3QkFDOUQsYUFBYSxFQUFFLFdBQVcsRUFBRSxrQkFBa0I7d0JBQzlDLGFBQWEsRUFBRSxvQkFBb0I7cUJBQ3BDOzBOQUtRLE9BQU87c0JBQWYsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNJLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csS0FBSztzQkFBZCxNQUFNO2dCQUVrQixtQkFBbUI7c0JBQTNDLFNBQVM7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBGb3JtQnVpbGRlciwgRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU3ViamVjdCwgZGVib3VuY2VUaW1lLCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEJ1dHRvbk1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvYnV0dG9uJztcbmltcG9ydCB7IERpYWxvZ01vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZGlhbG9nJztcbmltcG9ydCB7IERyYXdlck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZHJhd2VyJztcbmltcG9ydCB7IERyb3Bkb3duTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9kcm9wZG93bic7XG5pbXBvcnQgeyBJbnB1dE51bWJlck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvaW5wdXRudW1iZXInO1xuaW1wb3J0IHsgTXVsdGlTZWxlY3RNb2R1bGUgfSBmcm9tICdwcmltZW5nL211bHRpc2VsZWN0JztcbmltcG9ydCB7IFRhZ01vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdGFnJztcbmltcG9ydCB7IFRvb2x0aXBNb2R1bGUgfSBmcm9tICdwcmltZW5nL3Rvb2x0aXAnO1xuaW1wb3J0IHsgRGl2aWRlck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvZGl2aWRlcic7XG5pbXBvcnQgeyBUYWJsZU1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xuaW1wb3J0IHsgQXV0b0NvbXBsZXRlTW9kdWxlIH0gZnJvbSAncHJpbWVuZy9hdXRvY29tcGxldGUnO1xuaW1wb3J0IHsgRHluYW1pY0Zvcm1Db21wb25lbnQsIER5bmFtaWNGb3JtRmllbGRDb25maWcsIFRyYW5zbGF0ZVBpcGUsIFRyYW5zbGF0aW9uU2VydmljZSB9IGZyb20gJ0BzZW5pb3JzaXN0ZW1hcy9jb21wb25lbnRzLWFpJztcbmltcG9ydCB7IEN1cnJlbnRDb2xsYWJvcmF0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY3VycmVudC1jb2xsYWJvcmF0b3IvY3VycmVudC1jb2xsYWJvcmF0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBTY2hlZHVsZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zY2hlZHVsZS5zZXJ2aWNlJztcbmltcG9ydCB7IFNjaGVkdWxlVHlwZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zY2hlZHVsZS10eXBlLnNlcnZpY2UnO1xuaW1wb3J0IHsgU2NoZWR1bGVQYXJ0aWNpcGFudCB9IGZyb20gJy4uL2VudGl0aWVzL3NjaGVkdWxlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBQYXJ0aWNpcGFudExvb2t1cCwgUGFydGljaXBhbnRPcmlnaW4gfSBmcm9tICcuLi9lbnRpdGllcy9wYXJ0aWNpcGFudC1sb29rdXAuaW50ZXJmYWNlJztcbmltcG9ydCB7IFNjaGVkdWxlVHlwZSB9IGZyb20gJy4uL2VudGl0aWVzL3NjaGVkdWxlLXR5cGUuaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIFNjaGVkdWxlUHJpb3JpdHksIFNjaGVkdWxlUmVjdXJyZW5jZSwgV2Vla0RheSwgUmVwZWF0V2hlbixcbiAgT3JkaW5hbFdlZWtEYXksIE1vbnRoXG59IGZyb20gJy4uL2VudW1zL3NjaGVkdWxlLmVudW1zJztcbmltcG9ydCB7XG4gIGZvcm1hdERhdGVUb1N0cmluZywgdG9EYXRlU3RyaW5nLCB0b1RpbWVTdHJpbmcsXG4gIGdldERlZmF1bHRTdGFydFRpbWUsIGdldERlZmF1bHRFbmRUaW1lLFxuICBnZXRDdXJyZW50V2Vla0RheSwgZ2V0Q3VycmVudE1vbnRoLCBnZXRPcmRpbmFsRm9yRGF0ZVxufSBmcm9tICcuLi9oZWxwZXJzL3NjaGVkdWxlLWRhdGUuaGVscGVycyc7XG5pbXBvcnQge1xuICBnZXRPcmlnaW5MYWJlbCBhcyBfZ2V0T3JpZ2luTGFiZWwsIGdldE9yaWdpbkljb24gYXMgX2dldE9yaWdpbkljb24sXG4gIGdldFBhcnRpY2lwYW50TmFtZSBhcyBfZ2V0UGFydGljaXBhbnROYW1lLCBnZXRQYXJ0aWNpcGFudFR5cGUgYXMgX2dldFBhcnRpY2lwYW50VHlwZSxcbiAgZ2V0UGFydGljaXBhbnRUeXBlSWNvbiBhcyBfZ2V0UGFydGljaXBhbnRUeXBlSWNvbiwgZ2V0UHJpb3JpdHlTZXZlcml0eSBhcyBfZ2V0UHJpb3JpdHlTZXZlcml0eSxcbiAgZ2V0UHJpb3JpdHlMYWJlbCBhcyBfZ2V0UHJpb3JpdHlMYWJlbCwgZ2V0Q29uZmlybWF0aW9uU2V2ZXJpdHkgYXMgX2dldENvbmZpcm1hdGlvblNldmVyaXR5LFxuICBnZXRDb25maXJtYXRpb25MYWJlbCBhcyBfZ2V0Q29uZmlybWF0aW9uTGFiZWwsXG4gIFByaW9yaXR5U2V2ZXJpdHksIENvbmZpcm1hdGlvblNldmVyaXR5XG59IGZyb20gJy4uL2hlbHBlcnMvc2NoZWR1bGUtZGlzcGxheS5oZWxwZXJzJztcblxuLyoqIFMxMDk6IEV4dHJhY3QgbWFnaWMgbnVtYmVycyB0byBuYW1lZCBjb25zdGFudHMgKi9cbmNvbnN0IE1BWF9OQU1FX0xFTkdUSCA9IDI1NTtcbmNvbnN0IERFQk9VTkNFX01TID0gNTAwO1xuY29uc3QgUEFSVElDSVBBTlRfU0VBUkNIX0xJTUlUID0gNTtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncy1zY2hlZHVsZS1mb3JtJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgQnV0dG9uTW9kdWxlLCBEaWFsb2dNb2R1bGUsIERyYXdlck1vZHVsZSwgRHJvcGRvd25Nb2R1bGUsXG4gICAgSW5wdXROdW1iZXJNb2R1bGUsIE11bHRpU2VsZWN0TW9kdWxlLCBUYWdNb2R1bGUsIFRvb2x0aXBNb2R1bGUsXG4gICAgRGl2aWRlck1vZHVsZSwgVGFibGVNb2R1bGUsIEF1dG9Db21wbGV0ZU1vZHVsZSxcbiAgICBUcmFuc2xhdGVQaXBlLCBEeW5hbWljRm9ybUNvbXBvbmVudFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vc2NoZWR1bGUtZm9ybS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9zY2hlZHVsZS1mb3JtLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBTY2hlZHVsZUZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSB2aXNpYmxlID0gZmFsc2U7XG4gIEBJbnB1dCgpIHNlbGVjdGVkRGF0ZTogRGF0ZSA9IG5ldyBEYXRlKCk7XG4gIEBPdXRwdXQoKSB2aXNpYmxlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgc2F2ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBAVmlld0NoaWxkKCdkZXRhaWxGb3JtJykgZGV0YWlsRm9ybUNvbXBvbmVudCE6IER5bmFtaWNGb3JtQ29tcG9uZW50O1xuXG4gIHNjaGVkdWxlRGV0YWlsRmllbGRzOiBEeW5hbWljRm9ybUZpZWxkQ29uZmlnW10gPSBbXTtcbiAgZW50aXR5RGF0YUZvckZvcm06IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbCA9IG51bGw7XG4gIHNjaGVkdWxlRm9ybSE6IEZvcm1Hcm91cDtcbiAgaXNFZGl0aW5nID0gZmFsc2U7XG4gIGN1cnJlbnRDb2xsYWJvcmF0b3JJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIHNjaGVkdWxlVHlwZXM6IFNjaGVkdWxlVHlwZVtdID0gW107XG4gIHBhcnRpY2lwYW50czogU2NoZWR1bGVQYXJ0aWNpcGFudFtdID0gW107XG4gIHBhcnRpY2lwYW50c0xvYWRpbmcgPSBmYWxzZTtcbiAgcmVjdXJyZW5jZURlc2NyaXB0aW9uID0gJyc7XG5cbiAgLyoqIFMyOTMzOiBNYXJrIGFzIHJlYWRvbmx5ICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVjdXJyZW5jZUNoYW5nZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHBhcnRpY2lwYW50U3VnZ2VzdGlvbnM6IFBhcnRpY2lwYW50TG9va3VwW10gPSBbXTtcbiAgc2VsZWN0ZWRQYXJ0aWNpcGFudExvb2t1cDogUGFydGljaXBhbnRMb29rdXAgfCBudWxsID0gbnVsbDtcbiAgYWRkZWRQYXJ0aWNpcGFudHM6IFBhcnRpY2lwYW50TG9va3VwW10gPSBbXTtcblxuICBwcmlvcml0eU9wdGlvbnM6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcbiAgcmVjdXJyZW5jZU9wdGlvbnM6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcbiAgd2Vla0RheU9wdGlvbnM6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcbiAgcmVwZWF0V2hlbk9wdGlvbnM6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcbiAgb3JkaW5hbE9wdGlvbnM6IHsgbGFiZWw6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9W10gPSBbXTtcbiAgbW9udGhPcHRpb25zOiB7IGxhYmVsOiBzdHJpbmc7IHZhbHVlOiBzdHJpbmcgfVtdID0gW107XG5cbiAgLyoqIFMyOTMzOiBNYXJrIGNvbnN0cnVjdG9yLWluamVjdGVkIHNlcnZpY2VzIGFzIHJlYWRvbmx5ICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZmI6IEZvcm1CdWlsZGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2NoZWR1bGVTZXJ2aWNlOiBTY2hlZHVsZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBzY2hlZHVsZVR5cGVTZXJ2aWNlOiBTY2hlZHVsZVR5cGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY3VycmVudENvbGxhYm9yYXRvclNlcnZpY2U6IEN1cnJlbnRDb2xsYWJvcmF0b3JTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdDogVHJhbnNsYXRpb25TZXJ2aWNlXG4gICkge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmluaXRPcHRpb25zKCk7XG4gICAgdGhpcy5pbml0RGV0YWlsRmllbGRzKCk7XG4gICAgdGhpcy5pbml0Rm9ybSgpO1xuICAgIHRoaXMubG9hZFNjaGVkdWxlVHlwZXMoKTtcbiAgICB0aGlzLmxvYWRDb2xsYWJvcmF0b3IoKTtcbiAgICB0aGlzLnNldHVwUmVjdXJyZW5jZURlc2NyaXB0aW9uV2F0Y2hlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkQ29sbGFib3JhdG9yKCk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudENvbGxhYm9yYXRvclNlcnZpY2UubG9hZCgpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoY29sbGFiKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudENvbGxhYm9yYXRvcklkID0gY29sbGFiPy5pZCA/PyBudWxsO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMuY3VycmVudENvbGxhYm9yYXRvcklkID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdE9wdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5wcmlvcml0eU9wdGlvbnMgPSBbXG4gICAgICB7IGxhYmVsOiB0aGlzLnQudHJhbnNsYXRlKCdjcm14LmNvbXBvbmVudHMuc2NoZWR1bGVfcHJpb3JpdHlfbG93JyksIHZhbHVlOiBTY2hlZHVsZVByaW9yaXR5LkxvdyB9LFxuICAgICAgeyBsYWJlbDogdGhpcy50LnRyYW5zbGF0ZSgnY3JteC5jb21wb25lbnRzLnNjaGVkdWxlX3ByaW9yaXR5X21lZGl1bScpLCB2YWx1ZTogU2NoZWR1bGVQcmlvcml0eS5NZWRpdW0gfSxcbiAgICAgIHsgbGFiZWw6IHRoaXMudC50cmFuc2xhdGUoJ2NybXguY29tcG9uZW50cy5zY2hlZHVsZV9wcmlvcml0eV9oaWdoJyksIHZhbHVlOiBTY2hlZHVsZVByaW9yaXR5LkhpZ2ggfSxcbiAgICAgIHsgbGFiZWw6IHRoaXMudC50cmFuc2xhdGUoJ2NybXguY29tcG9uZW50cy5zY2hlZHVsZV9wcmlvcml0eV9jcml0aWNhbCcpLCB2YWx1ZTogU2NoZWR1bGVQcmlvcml0eS5Dcml0aWNhbCB9XG4gICAgXTtcbiAgICB0aGlzLnJlY3VycmVuY2VPcHRpb25zID0gW1xuICAgICAgeyBsYWJlbDogdGhpcy50LnRyYW5zbGF0ZSgnY3JteC5jb21wb25lbnRzLnNjaGVkdWxlX3JlY3VycmVuY2VfZGFpbHknKSwgdmFsdWU6IFNjaGVkdWxlUmVjdXJyZW5jZS5EYWlseSB9LFxuICAgICAgeyBsYWJlbDogdGhpcy50LnRyYW5zbGF0ZSgnY3JteC5jb21wb25lbnRzLnNjaGVkdWxlX3JlY3VycmVuY2Vfd2Vla2x5JyksIHZhbHVlOiBTY2hlZHVsZVJlY3VycmVuY2UuV2Vla2x5IH0sXG4gICAgICB7IGxhYmVsOiB0aGlzLnQudHJhbnNsYXRlKCdjcm14LmNvbXBvbmVudHMuc2NoZWR1bGVfcmVjdXJyZW5jZV9tb250aGx5JyksIHZhbHVlOiBTY2hlZHVsZVJlY3VycmVuY2UuTW9udGhseSB9LFxuICAgICAgeyBsYWJlbDogdGhpcy50LnRyYW5zbGF0ZSgnY3JteC5jb21wb25lbnRzLnNjaGVkdWxlX3JlY3VycmVuY2VfeWVhcmx5JyksIHZhbHVlOiBTY2hlZHVsZVJlY3VycmVuY2UuWWVhcmx5IH1cbiAgICBdO1xuICAgIHRoaXMud2Vla0RheU9wdGlvbnMgPSBbXG4gICAgICB7IGxhYmVsOiB0aGlzLnQudHJhbnNsYXRlKCdjcm14LmNvbXBvbmVudHMuc2NoZWR1bGVfc3VuZGF5JyksIHZhbHVlOiBXZWVrRGF5LlN1bmRheSB9LFxuICAgICAgeyBsYWJlbDogdGhpcy50LnRyYW5zbGF0ZSgnY3JteC5jb21wb25lbnRzLnNjaGVkdWxlX21vbmRheScpLCB2YWx1ZTogV2Vla0RheS5Nb25kYXkgfSxcbiAgICAgIHsgbGFiZWw6IHRoaXMudC50cmFuc2xhdGUoJ2NybXguY29tcG9uZW50cy5zY2hlZHVsZV90dWVzZGF5JyksIHZhbHVlOiBXZWVrRGF5LlR1ZXNkYXkgfSxcbiAgICAgIHsgbGFiZWw6IHRoaXMudC50cmFuc2xhdGUoJ2NybXguY29tcG9uZW50cy5zY2hlZHVsZV93ZWRuZXNkYXknKSwgdmFsdWU6IFdlZWtEYXkuV2VkbmVzZGF5IH0sXG4gICAgICB7IGxhYmVsOiB0aGlzLnQudHJhbnNsYXRlKCdjcm14LmNvbXBvbmVudHMuc2NoZWR1bGVfdGh1cnNkYXknKSwgdmFsdWU6IFdlZWtEYXkuVGh1cnNkYXkgfSxcbiAgICAgIHsgbGFiZWw6IHRoaXMudC50cmFuc2xhdGUoJ2NybXguY29tcG9uZW50cy5zY2hlZHVsZV9mcmlkYXknKSwgdmFsdWU6IFdlZWtEYXkuRnJpZGF5IH0sXG4gICAgICB7IGxhYmVsOiB0aGlzLnQudHJhbnNsYXRlKCdjcm14LmNvbXBvbmVudHMuc2NoZWR1bGVfc2F0dXJkYXknKSwgdmFsdWU6IFdlZWtEYXkuU2F0dXJkYXkgfVxuICAgIF07XG4gICAgdGhpcy5yZXBlYXRXaGVuT3B0aW9ucyA9IFtcbiAgICAgIHsgbGFiZWw6IHRoaXMudC50cmFuc2xhdGUoJ2NybXguY29tcG9uZW50cy5zY2hlZHVsZV9yZXBlYXRfaW5fZGF5JyksIHZhbHVlOiBSZXBlYXRXaGVuLkluRGF5IH0sXG4gICAgICB7IGxhYmVsOiB0aGlzLnQudHJhbnNsYXRlKCdjcm14LmNvbXBvbmVudHMuc2NoZWR1bGVfcmVwZWF0X2luX29yZGluYWxfd2Vla19kYXknKSwgdmFsdWU6IFJlcGVhdFdoZW4uSW5PcmRpbmFsV2Vla0RheSB9XG4gICAgXTtcbiAgICB0aGlzLm9yZGluYWxPcHRpb25zID0gW1xuICAgICAgeyBsYWJlbDogdGhpcy50LnRyYW5zbGF0ZSgnY3JteC5jb21wb25lbnRzLnNjaGVkdWxlX29yZGluYWxfZmlyc3QnKSwgdmFsdWU6IE9yZGluYWxXZWVrRGF5LkZpcnN0IH0sXG4gICAgICB7IGxhYmVsOiB0aGlzLnQudHJhbnNsYXRlKCdjcm14LmNvbXBvbmVudHMuc2NoZWR1bGVfb3JkaW5hbF9zZWNvbmQnKSwgdmFsdWU6IE9yZGluYWxXZWVrRGF5LlNlY29uZCB9LFxuICAgICAgeyBsYWJlbDogdGhpcy50LnRyYW5zbGF0ZSgnY3JteC5jb21wb25lbnRzLnNjaGVkdWxlX29yZGluYWxfdGhpcmQnKSwgdmFsdWU6IE9yZGluYWxXZWVrRGF5LlRoaXJkIH0sXG4gICAgICB7IGxhYmVsOiB0aGlzLnQudHJhbnNsYXRlKCdjcm14LmNvbXBvbmVudHMuc2NoZWR1bGVfb3JkaW5hbF9mb3VydGgnKSwgdmFsdWU6IE9yZGluYWxXZWVrRGF5LkZvdXJ0aCB9LFxuICAgICAgeyBsYWJlbDogdGhpcy50LnRyYW5zbGF0ZSgnY3JteC5jb21wb25lbnRzLnNjaGVkdWxlX29yZGluYWxfbGFzdCcpLCB2YWx1ZTogT3JkaW5hbFdlZWtEYXkuTGFzdCB9XG4gICAgXTtcbiAgICB0aGlzLm1vbnRoT3B0aW9ucyA9IE9iamVjdC52YWx1ZXMoTW9udGgpLm1hcChtID0+ICh7XG4gICAgICBsYWJlbDogdGhpcy50LnRyYW5zbGF0ZShgY3JteC5jb21wb25lbnRzLnNjaGVkdWxlXyR7bS50b0xvd2VyQ2FzZSgpfWApLCB2YWx1ZTogbVxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdERldGFpbEZpZWxkcygpOiB2b2lkIHtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IGRlZmF1bHRTdGFydCA9IHRoaXMuZ2V0RGVmYXVsdFN0YXJ0VGltZShub3cpO1xuICAgIGNvbnN0IGRlZmF1bHRFbmQgPSB0aGlzLmdldERlZmF1bHRFbmRUaW1lKGRlZmF1bHRTdGFydCk7XG4gICAgY29uc3QgZnVsbFJvdyA9IHsgeGw6IDEyLCBsZzogMTIsIG1kOiAxMiwgc206IDEyIH07XG4gICAgY29uc3QgaGFsZlJvdyA9IHsgeGw6IDYsIGxnOiA2LCBtZDogNiwgc206IDEyIH07XG4gICAgdGhpcy5zY2hlZHVsZURldGFpbEZpZWxkcyA9IFtcbiAgICAgIHsgZmllbGQ6ICduYW1lJywgbGFiZWw6IHRoaXMudC50cmFuc2xhdGUoJ2NybXguY29tcG9uZW50cy5zY2hlZHVsZV9uYW1lJyksIHR5cGU6ICd0ZXh0JywgcmVxdWlyZWQ6IHRydWUsIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aChNQVhfTkFNRV9MRU5HVEgpXSwgcGxhY2Vob2xkZXI6IHRoaXMudC50cmFuc2xhdGUoJ2NybXguY29tcG9uZW50cy5zY2hlZHVsZV9lbnRlcl9uYW1lJyksIG1heExlbmd0aDogTUFYX05BTUVfTEVOR1RILCBzaXplOiBmdWxsUm93IH0sXG4gICAgICB7IGZpZWxkOiAncHJpb3JpdHknLCBsYWJlbDogdGhpcy50LnRyYW5zbGF0ZSgnY3JteC5jb21wb25lbnRzLnNjaGVkdWxlX3ByaW9yaXR5JyksIHR5cGU6ICdkcm9wZG93bicsIHJlcXVpcmVkOiB0cnVlLCB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIG9wdGlvbnM6IHRoaXMucHJpb3JpdHlPcHRpb25zLCBvcHRpb25MYWJlbDogJ2xhYmVsJywgb3B0aW9uVmFsdWU6ICd2YWx1ZScsIGRlZmF1bHRWYWx1ZTogU2NoZWR1bGVQcmlvcml0eS5NZWRpdW0sIHNpemU6IGZ1bGxSb3cgfSxcbiAgICAgIHsgZmllbGQ6ICd0eXBlJywgbGFiZWw6IHRoaXMudC50cmFuc2xhdGUoJ2NybXguY29tcG9uZW50cy5zY2hlZHVsZV90eXBlJyksIHR5cGU6ICdsb29rdXAnLCBsb29rdXBTZXJ2aWNlOiB0aGlzLnNjaGVkdWxlVHlwZVNlcnZpY2UsIGxvb2t1cERpc3BsYXlGaWVsZDogJ25hbWUnLCBsb29rdXBWYWx1ZUZpZWxkOiAnaWQnLCBsb29rdXBTZWFyY2hGaWVsZHM6IFsnbmFtZSddLCBzaG93Q2xlYXI6IHRydWUsIGxvb2t1cEF1dG9jb21wbGV0ZTogdHJ1ZSwgbG9va3VwQ29sdW1uczogW3sgZmllbGQ6ICduYW1lJywgaGVhZGVyOiB0aGlzLnQudHJhbnNsYXRlKCdjcm14LmNvbXBvbmVudHMuc2NoZWR1bGVfbmFtZScpIH1dLCBsb29rdXBGaWx0ZXJzOiBcInN0YXR1cyA9ICdBQ1RJVkUnXCIsIHBsYWNlaG9sZGVyOiB0aGlzLnQudHJhbnNsYXRlKCdjcm14LmNvbXBvbmVudHMuc2NoZWR1bGVfc2VsZWN0X3R5cGUnKSwgc2l6ZTogZnVsbFJvdyB9LFxuICAgICAgeyBmaWVsZDogJ3N0YXJ0RGF0ZScsIGxhYmVsOiB0aGlzLnQudHJhbnNsYXRlKCdjcm14LmNvbXBvbmVudHMuc2NoZWR1bGVfc3RhcnRfZGF0ZScpLCB0eXBlOiAnZGF0ZScsIHJlcXVpcmVkOiB0cnVlLCB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZF0sIGRlZmF1bHRWYWx1ZTogZm9ybWF0RGF0ZVRvU3RyaW5nKG5vdyksIHNpemU6ICh2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgPT4gdlsnd2l0aFJlY3VycmVuY2UnXSA/IGhhbGZSb3cgOiBmdWxsUm93IH0sXG4gICAgICB7IGZpZWxkOiAnZW5kRGF0ZScsIGxhYmVsOiB0aGlzLnQudHJhbnNsYXRlKCdjcm14LmNvbXBvbmVudHMuc2NoZWR1bGVfZW5kX2RhdGUnKSwgdHlwZTogJ2RhdGUnLCB2aXNpYmxlV2hlbjogKHY6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2Wyd3aXRoUmVjdXJyZW5jZSddID09PSB0cnVlLCBzaXplOiBoYWxmUm93IH0sXG4gICAgICB7IGZpZWxkOiAnc3RhcnRUaW1lJywgbGFiZWw6IHRoaXMudC50cmFuc2xhdGUoJ2NybXguY29tcG9uZW50cy5zY2hlZHVsZV9zdGFydF90aW1lJyksIHR5cGU6ICd0aW1lJywgZGVmYXVsdFZhbHVlOiBkZWZhdWx0U3RhcnQsIHZpc2libGVXaGVuOiAodjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZbJ2FsbERheSddICE9PSB0cnVlLCBzaXplOiBoYWxmUm93IH0sXG4gICAgICB7IGZpZWxkOiAnZW5kVGltZScsIGxhYmVsOiB0aGlzLnQudHJhbnNsYXRlKCdjcm14LmNvbXBvbmVudHMuc2NoZWR1bGVfZW5kX3RpbWUnKSwgdHlwZTogJ3RpbWUnLCBkZWZhdWx0VmFsdWU6IGRlZmF1bHRFbmQsIHZpc2libGVXaGVuOiAodjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHZbJ2FsbERheSddICE9PSB0cnVlLCBzaXplOiBoYWxmUm93IH0sXG4gICAgICB7IGZpZWxkOiAnYWxsRGF5JywgbGFiZWw6IHRoaXMudC50cmFuc2xhdGUoJ2NybXguY29tcG9uZW50cy5zY2hlZHVsZV9hbGxfZGF5JyksIHR5cGU6ICdjaGVja2JveCcsIGRlZmF1bHRWYWx1ZTogZmFsc2UsIHNpemU6IGhhbGZSb3cgfSxcbiAgICAgIHsgZmllbGQ6ICd3aXRoUmVjdXJyZW5jZScsIGxhYmVsOiB0aGlzLnQudHJhbnNsYXRlKCdjcm14LmNvbXBvbmVudHMuc2NoZWR1bGVfd2l0aF9yZWN1cnJlbmNlJyksIHR5cGU6ICdjaGVja2JveCcsIGRlZmF1bHRWYWx1ZTogZmFsc2UsIHNpemU6IGhhbGZSb3cgfSxcbiAgICAgIHsgZmllbGQ6ICdjb21tZW50cycsIGxhYmVsOiB0aGlzLnQudHJhbnNsYXRlKCdjcm14LmNvbXBvbmVudHMuc2NoZWR1bGVfY29tbWVudHMnKSwgdHlwZTogJ3RleHRhcmVhJywgcGxhY2Vob2xkZXI6IHRoaXMudC50cmFuc2xhdGUoJ2NybXguY29tcG9uZW50cy5zY2hlZHVsZV9lbnRlcl9jb21tZW50cycpLCByb3dzOiAzLCBzaXplOiBmdWxsUm93IH1cbiAgICBdO1xuICB9XG5cbiAgb25EZXRhaWxGb3JtUmVhZHkoZm9ybTogRm9ybUdyb3VwKTogdm9pZCB7XG4gICAgdGhpcy5zY2hlZHVsZUZvcm0gPSBmb3JtO1xuICAgIHRoaXMuYWRkUmVjdXJyZW5jZUNvbnRyb2xzKCk7XG4gICAgdGhpcy5zY2hlZHVsZUZvcm0udmFsdWVDaGFuZ2VzLnN1YnNjcmliZShcbiAgICAgICgpID0+IHRoaXMucmVjdXJyZW5jZUNoYW5nZSQubmV4dCgpXG4gICAgKTtcbiAgICB0aGlzLnNldHVwUmVjdXJyZW5jZUZvcm1XYXRjaGVycygpO1xuICB9XG5cbiAgLyoqIFMxMjE6IEFkZCBicmFjZXMgdG8gYWxsIGlmIHN0YXRlbWVudHMgKi9cbiAgcHJpdmF0ZSBhZGRSZWN1cnJlbmNlQ29udHJvbHMoKTogdm9pZCB7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBpZiAoIXRoaXMuc2NoZWR1bGVGb3JtLmNvbnRhaW5zKCdpZCcpKSB7XG4gICAgICB0aGlzLnNjaGVkdWxlRm9ybS5hZGRDb250cm9sKCdpZCcsIHRoaXMuZmIuY29udHJvbChudWxsKSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zY2hlZHVsZUZvcm0uY29udGFpbnMoJ3JlY3VycmVuY2UnKSkge1xuICAgICAgdGhpcy5zY2hlZHVsZUZvcm0uYWRkQ29udHJvbChcbiAgICAgICAgJ3JlY3VycmVuY2UnLCB0aGlzLmZiLmNvbnRyb2woU2NoZWR1bGVSZWN1cnJlbmNlLkRhaWx5KVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnNjaGVkdWxlRm9ybS5jb250YWlucygncmVjdXJyZW5jZUludGVydmFsJykpIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVGb3JtLmFkZENvbnRyb2woXG4gICAgICAgICdyZWN1cnJlbmNlSW50ZXJ2YWwnLCB0aGlzLmZiLmNvbnRyb2woMSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zY2hlZHVsZUZvcm0uY29udGFpbnMoJ3dlZWtEYXlzJykpIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVGb3JtLmFkZENvbnRyb2woXG4gICAgICAgICd3ZWVrRGF5cycsIHRoaXMuZmIuY29udHJvbChbZ2V0Q3VycmVudFdlZWtEYXkobm93KV0pXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc2NoZWR1bGVGb3JtLmNvbnRhaW5zKCdyZXBlYXRXaGVuJykpIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVGb3JtLmFkZENvbnRyb2woXG4gICAgICAgICdyZXBlYXRXaGVuJywgdGhpcy5mYi5jb250cm9sKFJlcGVhdFdoZW4uSW5EYXkpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc2NoZWR1bGVGb3JtLmNvbnRhaW5zKCdyZXBlYXRXaGVuRGF5JykpIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVGb3JtLmFkZENvbnRyb2woXG4gICAgICAgICdyZXBlYXRXaGVuRGF5JywgdGhpcy5mYi5jb250cm9sKG5vdy5nZXREYXRlKCkpXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc2NoZWR1bGVGb3JtLmNvbnRhaW5zKCdyZXBlYXRXaGVuT3JkaW5hbFdlZWtEYXknKSkge1xuICAgICAgdGhpcy5zY2hlZHVsZUZvcm0uYWRkQ29udHJvbChcbiAgICAgICAgJ3JlcGVhdFdoZW5PcmRpbmFsV2Vla0RheScsXG4gICAgICAgIHRoaXMuZmIuY29udHJvbChnZXRPcmRpbmFsRm9yRGF0ZShub3cpKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnNjaGVkdWxlRm9ybS5jb250YWlucygncmVwZWF0V2hlbldlZWtNb250aCcpKSB7XG4gICAgICB0aGlzLnNjaGVkdWxlRm9ybS5hZGRDb250cm9sKFxuICAgICAgICAncmVwZWF0V2hlbldlZWtNb250aCcsXG4gICAgICAgIHRoaXMuZmIuY29udHJvbChnZXRDdXJyZW50V2Vla0RheShub3cpKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnNjaGVkdWxlRm9ybS5jb250YWlucygncmVwZWF0V2hlbk1vbnRoJykpIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVGb3JtLmFkZENvbnRyb2woXG4gICAgICAgICdyZXBlYXRXaGVuTW9udGgnLFxuICAgICAgICB0aGlzLmZiLmNvbnRyb2woZ2V0Q3VycmVudE1vbnRoKG5vdykpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTMTU0MTogQnJlYWsgc2V0dXBSZWN1cnJlbmNlRm9ybVdhdGNoZXJzIGludG8gc21hbGxlciBoZWxwZXJzXG4gICAqIHRvIHJlZHVjZSBjeWNsb21hdGljIGNvbXBsZXhpdHlcbiAgICovXG4gIHByaXZhdGUgc2V0dXBSZWN1cnJlbmNlRm9ybVdhdGNoZXJzKCk6IHZvaWQge1xuICAgIGNvbnN0IGQgPSB0aGlzLnNlbGVjdGVkRGF0ZSB8fCBuZXcgRGF0ZSgpO1xuICAgIHRoaXMud2F0Y2hSZWN1cnJlbmNlQ2hhbmdlcyhkKTtcbiAgICB0aGlzLndhdGNoUmVwZWF0V2hlbkNoYW5nZXMoZCk7XG4gICAgdGhpcy53YXRjaFdpdGhSZWN1cnJlbmNlQ2hhbmdlcyhkKTtcbiAgfVxuXG4gIHByaXZhdGUgd2F0Y2hSZWN1cnJlbmNlQ2hhbmdlcyhkOiBEYXRlKTogdm9pZCB7XG4gICAgdGhpcy5zY2hlZHVsZUZvcm0uZ2V0KCdyZWN1cnJlbmNlJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoXG4gICAgICAocmVjOiBzdHJpbmcpID0+IHtcbiAgICAgICAgdGhpcy5oYW5kbGVSZWN1cnJlbmNlV2Vla0RheXMocmVjLCBkKTtcbiAgICAgICAgdGhpcy5oYW5kbGVSZWN1cnJlbmNlTW9udGhseVllYXJseShyZWMsIGQpO1xuICAgICAgICB0aGlzLmhhbmRsZVJlY3VycmVuY2VZZWFybHlNb250aChyZWMsIGQpO1xuICAgICAgICB0aGlzLnJlY3VycmVuY2VDaGFuZ2UkLm5leHQoKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVSZWN1cnJlbmNlV2Vla0RheXMocmVjOiBzdHJpbmcsIGQ6IERhdGUpOiB2b2lkIHtcbiAgICBpZiAocmVjID09PSBTY2hlZHVsZVJlY3VycmVuY2UuV2Vla2x5KSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5zY2hlZHVsZUZvcm0uZ2V0KCd3ZWVrRGF5cycpPy52YWx1ZTtcbiAgICAgIGlmICghY3VycmVudCB8fCBjdXJyZW50Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLnNjaGVkdWxlRm9ybS5wYXRjaFZhbHVlKFxuICAgICAgICAgIHsgd2Vla0RheXM6IFtnZXRDdXJyZW50V2Vla0RheShkKV0gfSxcbiAgICAgICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNjaGVkdWxlRm9ybS5wYXRjaFZhbHVlKFxuICAgICAgICB7IHdlZWtEYXlzOiBbXSB9LFxuICAgICAgICB7IGVtaXRFdmVudDogZmFsc2UgfVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVJlY3VycmVuY2VNb250aGx5WWVhcmx5KFxuICAgIHJlYzogc3RyaW5nLCBkOiBEYXRlXG4gICk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHJlYyA9PT0gU2NoZWR1bGVSZWN1cnJlbmNlLk1vbnRobHkgfHxcbiAgICAgIHJlYyA9PT0gU2NoZWR1bGVSZWN1cnJlbmNlLlllYXJseVxuICAgICkge1xuICAgICAgdGhpcy5zY2hlZHVsZUZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIHJlcGVhdFdoZW46XG4gICAgICAgICAgdGhpcy5zY2hlZHVsZUZvcm0uZ2V0KCdyZXBlYXRXaGVuJyk/LnZhbHVlID8/IFJlcGVhdFdoZW4uSW5EYXksXG4gICAgICAgIHJlcGVhdFdoZW5EYXk6XG4gICAgICAgICAgdGhpcy5zY2hlZHVsZUZvcm0uZ2V0KCdyZXBlYXRXaGVuRGF5Jyk/LnZhbHVlID8/IGQuZ2V0RGF0ZSgpLFxuICAgICAgICByZXBlYXRXaGVuT3JkaW5hbFdlZWtEYXk6XG4gICAgICAgICAgdGhpcy5zY2hlZHVsZUZvcm0uZ2V0KCdyZXBlYXRXaGVuT3JkaW5hbFdlZWtEYXknKT8udmFsdWVcbiAgICAgICAgICAgID8/IGdldE9yZGluYWxGb3JEYXRlKGQpLFxuICAgICAgICByZXBlYXRXaGVuV2Vla01vbnRoOlxuICAgICAgICAgIHRoaXMuc2NoZWR1bGVGb3JtLmdldCgncmVwZWF0V2hlbldlZWtNb250aCcpPy52YWx1ZVxuICAgICAgICAgICAgPz8gZ2V0Q3VycmVudFdlZWtEYXkoZClcbiAgICAgIH0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zY2hlZHVsZUZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgIHJlcGVhdFdoZW46IG51bGwsXG4gICAgICAgIHJlcGVhdFdoZW5EYXk6IG51bGwsXG4gICAgICAgIHJlcGVhdFdoZW5PcmRpbmFsV2Vla0RheTogbnVsbCxcbiAgICAgICAgcmVwZWF0V2hlbldlZWtNb250aDogbnVsbCxcbiAgICAgICAgcmVwZWF0V2hlbk1vbnRoOiBudWxsXG4gICAgICB9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVSZWN1cnJlbmNlWWVhcmx5TW9udGgocmVjOiBzdHJpbmcsIGQ6IERhdGUpOiB2b2lkIHtcbiAgICBpZiAocmVjID09PSBTY2hlZHVsZVJlY3VycmVuY2UuWWVhcmx5KSB7XG4gICAgICB0aGlzLnNjaGVkdWxlRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgICAgcmVwZWF0V2hlbk1vbnRoOlxuICAgICAgICAgIHRoaXMuc2NoZWR1bGVGb3JtLmdldCgncmVwZWF0V2hlbk1vbnRoJyk/LnZhbHVlXG4gICAgICAgICAgICA/PyBnZXRDdXJyZW50TW9udGgoZClcbiAgICAgIH0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zY2hlZHVsZUZvcm0ucGF0Y2hWYWx1ZShcbiAgICAgICAgeyByZXBlYXRXaGVuTW9udGg6IG51bGwgfSxcbiAgICAgICAgeyBlbWl0RXZlbnQ6IGZhbHNlIH1cbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaFJlcGVhdFdoZW5DaGFuZ2VzKGQ6IERhdGUpOiB2b2lkIHtcbiAgICB0aGlzLnNjaGVkdWxlRm9ybS5nZXQoJ3JlcGVhdFdoZW4nKT8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZShcbiAgICAgIChydzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGlmIChydyA9PT0gUmVwZWF0V2hlbi5JbkRheSkge1xuICAgICAgICAgIHRoaXMuc2NoZWR1bGVGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICAgICAgcmVwZWF0V2hlbkRheTpcbiAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUZvcm0uZ2V0KCdyZXBlYXRXaGVuRGF5Jyk/LnZhbHVlID8/IGQuZ2V0RGF0ZSgpLFxuICAgICAgICAgICAgcmVwZWF0V2hlbk9yZGluYWxXZWVrRGF5OiBudWxsLFxuICAgICAgICAgICAgcmVwZWF0V2hlbldlZWtNb250aDogbnVsbFxuICAgICAgICAgIH0sIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChydyA9PT0gUmVwZWF0V2hlbi5Jbk9yZGluYWxXZWVrRGF5KSB7XG4gICAgICAgICAgdGhpcy5zY2hlZHVsZUZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICByZXBlYXRXaGVuRGF5OiBudWxsLFxuICAgICAgICAgICAgcmVwZWF0V2hlbk9yZGluYWxXZWVrRGF5OlxuICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlRm9ybS5nZXQoJ3JlcGVhdFdoZW5PcmRpbmFsV2Vla0RheScpPy52YWx1ZVxuICAgICAgICAgICAgICAgID8/IGdldE9yZGluYWxGb3JEYXRlKGQpLFxuICAgICAgICAgICAgcmVwZWF0V2hlbldlZWtNb250aDpcbiAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUZvcm0uZ2V0KCdyZXBlYXRXaGVuV2Vla01vbnRoJyk/LnZhbHVlXG4gICAgICAgICAgICAgICAgPz8gZ2V0Q3VycmVudFdlZWtEYXkoZClcbiAgICAgICAgICB9LCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gTm8gYWN0aW9uIG5lZWRlZCBmb3Igb3RoZXIgcmVwZWF0V2hlbiB2YWx1ZXNcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlY3VycmVuY2VDaGFuZ2UkLm5leHQoKTtcbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaFdpdGhSZWN1cnJlbmNlQ2hhbmdlcyhkOiBEYXRlKTogdm9pZCB7XG4gICAgdGhpcy5zY2hlZHVsZUZvcm0uZ2V0KCd3aXRoUmVjdXJyZW5jZScpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKFxuICAgICAgKCkgPT4ge1xuICAgICAgICBjb25zdCBlbmFibGVkID0gdGhpcy5zY2hlZHVsZUZvcm0uZ2V0KCd3aXRoUmVjdXJyZW5jZScpPy52YWx1ZSA9PT0gdHJ1ZTtcbiAgICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgICB0aGlzLm9uUmVjdXJyZW5jZUVuYWJsZWQoZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5vblJlY3VycmVuY2VEaXNhYmxlZCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgb25SZWN1cnJlbmNlRW5hYmxlZChkOiBEYXRlKTogdm9pZCB7XG4gICAgdGhpcy5yZXNldFJlY3VycmVuY2VEZWZhdWx0cyhkKTtcbiAgICB0aGlzLnJlY3VycmVuY2VDaGFuZ2UkLm5leHQoKTtcbiAgfVxuXG4gIHByaXZhdGUgb25SZWN1cnJlbmNlRGlzYWJsZWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZWN1cnJlbmNlRGVzY3JpcHRpb24gPSAnJztcbiAgICBpZiAodGhpcy5zY2hlZHVsZUZvcm0pIHtcbiAgICAgIHRoaXMuc2NoZWR1bGVGb3JtLnBhdGNoVmFsdWUoe1xuICAgICAgICBlbmREYXRlOiBudWxsLFxuICAgICAgICByZWN1cnJlbmNlOiBudWxsLFxuICAgICAgICByZWN1cnJlbmNlSW50ZXJ2YWw6IG51bGwsXG4gICAgICAgIHdlZWtEYXlzOiBudWxsLFxuICAgICAgICByZXBlYXRXaGVuOiBudWxsLFxuICAgICAgICByZXBlYXRXaGVuRGF5OiBudWxsLFxuICAgICAgICByZXBlYXRXaGVuT3JkaW5hbFdlZWtEYXk6IG51bGwsXG4gICAgICAgIHJlcGVhdFdoZW5XZWVrTW9udGg6IG51bGwsXG4gICAgICAgIHJlcGVhdFdoZW5Nb250aDogbnVsbFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0Rm9ybSgpOiB2b2lkIHtcbiAgICBjb25zdCBub3cgPSBuZXcgRGF0ZSgpO1xuICAgIGNvbnN0IGRlZmF1bHRTdGFydCA9IHRoaXMuZ2V0RGVmYXVsdFN0YXJ0VGltZShub3cpO1xuICAgIGNvbnN0IGRlZmF1bHRFbmQgPSB0aGlzLmdldERlZmF1bHRFbmRUaW1lKGRlZmF1bHRTdGFydCk7XG4gICAgdGhpcy5zY2hlZHVsZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIGlkOiBbbnVsbF0sXG4gICAgICBuYW1lOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aChNQVhfTkFNRV9MRU5HVEgpXV0sXG4gICAgICB0eXBlOiBbbnVsbF0sXG4gICAgICBwcmlvcml0eTogW1NjaGVkdWxlUHJpb3JpdHkuTWVkaXVtLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIGFsbERheTogW2ZhbHNlXSxcbiAgICAgIHdpdGhSZWN1cnJlbmNlOiBbZmFsc2VdLFxuICAgICAgc3RhcnREYXRlOiBbXG4gICAgICAgIGZvcm1hdERhdGVUb1N0cmluZyh0aGlzLnNlbGVjdGVkRGF0ZSB8fCBub3cpLFxuICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkXG4gICAgICBdLFxuICAgICAgZW5kRGF0ZTogW251bGxdLFxuICAgICAgc3RhcnRUaW1lOiBbZGVmYXVsdFN0YXJ0XSxcbiAgICAgIGVuZFRpbWU6IFtkZWZhdWx0RW5kXSxcbiAgICAgIHJlY3VycmVuY2U6IFtTY2hlZHVsZVJlY3VycmVuY2UuRGFpbHldLFxuICAgICAgcmVjdXJyZW5jZUludGVydmFsOiBbMV0sXG4gICAgICB3ZWVrRGF5czogW1tnZXRDdXJyZW50V2Vla0RheShub3cpXV0sXG4gICAgICByZXBlYXRXaGVuOiBbUmVwZWF0V2hlbi5JbkRheV0sXG4gICAgICByZXBlYXRXaGVuRGF5OiBbbm93LmdldERhdGUoKV0sXG4gICAgICByZXBlYXRXaGVuT3JkaW5hbFdlZWtEYXk6IFtnZXRPcmRpbmFsRm9yRGF0ZShub3cpXSxcbiAgICAgIHJlcGVhdFdoZW5XZWVrTW9udGg6IFtnZXRDdXJyZW50V2Vla0RheShub3cpXSxcbiAgICAgIHJlcGVhdFdoZW5Nb250aDogW2dldEN1cnJlbnRNb250aChub3cpXSxcbiAgICAgIGNvbW1lbnRzOiBbJyddXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHNldHVwUmVjdXJyZW5jZURlc2NyaXB0aW9uV2F0Y2hlcigpOiB2b2lkIHtcbiAgICB0aGlzLnJlY3VycmVuY2VDaGFuZ2UkLnBpcGUoXG4gICAgICBkZWJvdW5jZVRpbWUoREVCT1VOQ0VfTVMpXG4gICAgKS5zdWJzY3JpYmUoKCkgPT4gdGhpcy5mZXRjaFJlY3VycmVuY2VEZXNjcmlwdGlvbigpKTtcbiAgfVxuXG4gIHByaXZhdGUgZmV0Y2hSZWN1cnJlbmNlRGVzY3JpcHRpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnNjaGVkdWxlRm9ybSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2ID0gdGhpcy5zY2hlZHVsZUZvcm0udmFsdWU7XG4gICAgaWYgKCF2LndpdGhSZWN1cnJlbmNlIHx8ICF2LnN0YXJ0RGF0ZSkge1xuICAgICAgdGhpcy5yZWN1cnJlbmNlRGVzY3JpcHRpb24gPSAnJztcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5zY2hlZHVsZVNlcnZpY2UuZ2VuZXJhdGVSZWN1cnJlbmNlRGVzY3JpcHRpb24oXG4gICAgICB0aGlzLmJ1aWxkUmVjdXJyZW5jZVBheWxvYWQodilcbiAgICApLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAocikgPT4ge1xuICAgICAgICB0aGlzLnJlY3VycmVuY2VEZXNjcmlwdGlvbiA9IHIuZGVzY3JpcHRpb24gPz8gJyc7XG4gICAgICB9LFxuICAgICAgZXJyb3I6ICgpID0+IHtcbiAgICAgICAgdGhpcy5yZWN1cnJlbmNlRGVzY3JpcHRpb24gPSAnJztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRSZWN1cnJlbmNlUGF5bG9hZCh2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udGhpcy5idWlsZERhdGVUaW1lUGF5bG9hZCh2KSxcbiAgICAgIGFsbERheTogdlsnYWxsRGF5J10gfHwgZmFsc2UsXG4gICAgICB3aXRoUmVjdXJyZW5jZTogdHJ1ZSxcbiAgICAgIHJlY3VycmVuY2VJbnRlcnZhbDogdlsncmVjdXJyZW5jZUludGVydmFsJ10gfHwgMSxcbiAgICAgIHJlY3VycmVuY2U6IHZbJ3JlY3VycmVuY2UnXSxcbiAgICAgIC4uLnRoaXMuYnVpbGROdWxsYWJsZVJlY3VycmVuY2VGaWVsZHModilcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZERhdGVUaW1lUGF5bG9hZCh2OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnREYXRlOiB0b0RhdGVTdHJpbmcodlsnc3RhcnREYXRlJ10pLFxuICAgICAgZW5kRGF0ZTogdlsnZW5kRGF0ZSddID8gdG9EYXRlU3RyaW5nKHZbJ2VuZERhdGUnXSkgOiBudWxsLFxuICAgICAgc3RhcnRUaW1lOiB2WydzdGFydFRpbWUnXSA/IHRvVGltZVN0cmluZyh2WydzdGFydFRpbWUnXSkgOiBudWxsLFxuICAgICAgZW5kVGltZTogdlsnZW5kVGltZSddID8gdG9UaW1lU3RyaW5nKHZbJ2VuZFRpbWUnXSkgOiBudWxsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGROdWxsYWJsZVJlY3VycmVuY2VGaWVsZHModjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHdlZWtEYXlzOiB2Wyd3ZWVrRGF5cyddID8/IG51bGwsXG4gICAgICByZXBlYXRXaGVuOiB2WydyZXBlYXRXaGVuJ10gPz8gbnVsbCxcbiAgICAgIHJlcGVhdFdoZW5EYXk6IHZbJ3JlcGVhdFdoZW5EYXknXSA/PyBudWxsLFxuICAgICAgcmVwZWF0V2hlbk9yZGluYWxXZWVrRGF5OiB2WydyZXBlYXRXaGVuT3JkaW5hbFdlZWtEYXknXSA/PyBudWxsLFxuICAgICAgcmVwZWF0V2hlbldlZWtNb250aDogdlsncmVwZWF0V2hlbldlZWtNb250aCddID8/IG51bGwsXG4gICAgICByZXBlYXRXaGVuTW9udGg6IHZbJ3JlcGVhdFdoZW5Nb250aCddID8/IG51bGxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkU2NoZWR1bGVUeXBlcygpOiB2b2lkIHtcbiAgICB0aGlzLnNjaGVkdWxlVHlwZVNlcnZpY2UubGlzdCh7XG4gICAgICBzaXplOiAxMDAsXG4gICAgICBmaWx0ZXJRdWVyeTogXCJzdGF0dXMgPSAnQUNUSVZFJ1wiXG4gICAgfSkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyKSA9PiB7XG4gICAgICAgIHRoaXMuc2NoZWR1bGVUeXBlcyA9IHIuY29udGVudHM7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvcGVuTmV3KCk6IHZvaWQge1xuICAgIHRoaXMuaXNFZGl0aW5nID0gZmFsc2U7XG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcbiAgICBjb25zdCBkZWZhdWx0U3RhcnQgPSB0aGlzLmdldERlZmF1bHRTdGFydFRpbWUobm93KTtcbiAgICBjb25zdCBkZWZhdWx0RW5kID0gdGhpcy5nZXREZWZhdWx0RW5kVGltZShkZWZhdWx0U3RhcnQpO1xuICAgIHRoaXMuZW50aXR5RGF0YUZvckZvcm0gPSBudWxsO1xuICAgIGlmICh0aGlzLmRldGFpbEZvcm1Db21wb25lbnQpIHtcbiAgICAgIHRoaXMuZGV0YWlsRm9ybUNvbXBvbmVudC5yZXNldEZvcm0oKTtcbiAgICB9XG4gICAgdGhpcy5lbnRpdHlEYXRhRm9yRm9ybSA9IHtcbiAgICAgIHN0YXJ0RGF0ZTogZm9ybWF0RGF0ZVRvU3RyaW5nKHRoaXMuc2VsZWN0ZWREYXRlIHx8IG5vdyksXG4gICAgICBwcmlvcml0eTogU2NoZWR1bGVQcmlvcml0eS5NZWRpdW0sXG4gICAgICBhbGxEYXk6IGZhbHNlLFxuICAgICAgd2l0aFJlY3VycmVuY2U6IGZhbHNlLFxuICAgICAgc3RhcnRUaW1lOiBkZWZhdWx0U3RhcnQsXG4gICAgICBlbmRUaW1lOiBkZWZhdWx0RW5kXG4gICAgfTtcbiAgICB0aGlzLnJlc2V0UmVjdXJyZW5jZURlZmF1bHRzKHRoaXMuc2VsZWN0ZWREYXRlIHx8IG5vdyk7XG4gICAgdGhpcy5yZWN1cnJlbmNlRGVzY3JpcHRpb24gPSAnJztcbiAgICB0aGlzLnBhcnRpY2lwYW50cyA9IFtdO1xuICAgIHRoaXMuYWRkZWRQYXJ0aWNpcGFudHMgPSBbXTtcbiAgICB0aGlzLnNlbGVjdGVkUGFydGljaXBhbnRMb29rdXAgPSBudWxsO1xuICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XG4gICAgdGhpcy52aXNpYmxlQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gIH1cblxuICBvcGVuRWRpdChzY2hlZHVsZUlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmlzRWRpdGluZyA9IHRydWU7XG4gICAgdGhpcy5wYXJ0aWNpcGFudHMgPSBbXTtcbiAgICB0aGlzLmFkZGVkUGFydGljaXBhbnRzID0gW107XG4gICAgdGhpcy5zZWxlY3RlZFBhcnRpY2lwYW50TG9va3VwID0gbnVsbDtcbiAgICB0aGlzLnNjaGVkdWxlU2VydmljZS5nZXQoc2NoZWR1bGVJZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChkYXRhKSA9PiB7XG4gICAgICAgIHRoaXMuZW50aXR5RGF0YUZvckZvcm0gPSB7IC4uLmRhdGEsIHR5cGU6IGRhdGEudHlwZSA/PyBudWxsIH07XG4gICAgICAgIHRoaXMubG9hZFBhcnRpY2lwYW50cyhzY2hlZHVsZUlkKTtcbiAgICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52aXNpYmxlQ2hhbmdlLmVtaXQodHJ1ZSk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnNjaGVkdWxlRm9ybSkge1xuICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICAgIGlkOiBkYXRhLmlkLFxuICAgICAgICAgICAgICByZWN1cnJlbmNlOiBkYXRhLnJlY3VycmVuY2UsXG4gICAgICAgICAgICAgIHJlY3VycmVuY2VJbnRlcnZhbDogZGF0YS5yZWN1cnJlbmNlSW50ZXJ2YWwsXG4gICAgICAgICAgICAgIHdlZWtEYXlzOiBkYXRhLndlZWtEYXlzLFxuICAgICAgICAgICAgICByZXBlYXRXaGVuOiBkYXRhLnJlcGVhdFdoZW4sXG4gICAgICAgICAgICAgIHJlcGVhdFdoZW5EYXk6IGRhdGEucmVwZWF0V2hlbkRheSxcbiAgICAgICAgICAgICAgcmVwZWF0V2hlbk9yZGluYWxXZWVrRGF5OiBkYXRhLnJlcGVhdFdoZW5PcmRpbmFsV2Vla0RheSxcbiAgICAgICAgICAgICAgcmVwZWF0V2hlbldlZWtNb250aDogZGF0YS5yZXBlYXRXaGVuV2Vla01vbnRoLFxuICAgICAgICAgICAgICByZXBlYXRXaGVuTW9udGg6IGRhdGEucmVwZWF0V2hlbk1vbnRoXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2FkUGFydGljaXBhbnRzKHNjaGVkdWxlSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMucGFydGljaXBhbnRzTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5zY2hlZHVsZVNlcnZpY2UubGlzdFBhcnRpY2lwYW50cyhzY2hlZHVsZUlkKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHIpID0+IHtcbiAgICAgICAgdGhpcy5wYXJ0aWNpcGFudHMgPSByLmNvbnRlbnRzID8/IFtdO1xuICAgICAgICB0aGlzLmFkZGVkUGFydGljaXBhbnRzID0gdGhpcy5wYXJ0aWNpcGFudHNcbiAgICAgICAgICAuZmlsdGVyKHAgPT4gIXAub3JnYW5pemVyKVxuICAgICAgICAgIC5tYXAocCA9PiB0aGlzLnBhcnRpY2lwYW50VG9Mb29rdXAocCkpXG4gICAgICAgICAgLmZpbHRlcigocCk6IHAgaXMgUGFydGljaXBhbnRMb29rdXAgPT4gcCAhPT0gbnVsbCk7XG4gICAgICAgIHRoaXMucGFydGljaXBhbnRzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfSxcbiAgICAgIGVycm9yOiAoKSA9PiB7XG4gICAgICAgIHRoaXMucGFydGljaXBhbnRzTG9hZGluZyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBwYXJ0aWNpcGFudFRvTG9va3VwKFxuICAgIHA6IFNjaGVkdWxlUGFydGljaXBhbnRcbiAgKTogUGFydGljaXBhbnRMb29rdXAgfCBudWxsIHtcbiAgICBpZiAocC5jb2xsYWJvcmF0b3IpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBwLmNvbGxhYm9yYXRvci5pZCxcbiAgICAgICAgbmFtZTogcC5jb2xsYWJvcmF0b3IubmFtZSxcbiAgICAgICAgb3JpZ2luOiAnQ09MTEFCT1JBVE9SJ1xuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHAuYWNjb3VudCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHAuYWNjb3VudC5pZCxcbiAgICAgICAgbmFtZTogcC5hY2NvdW50Lm5hbWUsXG4gICAgICAgIG9yaWdpbjogJ0FDQ09VTlQnXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAocC5hY2NvdW50Q29udGFjdCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHAuYWNjb3VudENvbnRhY3QuaWQsXG4gICAgICAgIG5hbWU6IHAuYWNjb3VudENvbnRhY3QubmFtZSxcbiAgICAgICAgcmVmZXJlbmNlTmFtZTogcC5hY2NvdW50Q29udGFjdC5hY2NvdW50Py5uYW1lLFxuICAgICAgICByZWZlcmVuY2VJZDogcC5hY2NvdW50Q29udGFjdC5hY2NvdW50Py5pZCxcbiAgICAgICAgb3JpZ2luOiAnQUNDT1VOVF9DT05UQUNUJ1xuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKHAuZXh0ZXJuYWxQYXJ0aWNpcGFudCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHAuZXh0ZXJuYWxQYXJ0aWNpcGFudC5pZCxcbiAgICAgICAgbmFtZTogcC5leHRlcm5hbFBhcnRpY2lwYW50Lm5hbWUsXG4gICAgICAgIG9yaWdpbjogJ0VYVEVSTkFMX1BBUlRJQ0lQQU5UJ1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBvblNlYXJjaFBhcnRpY2lwYW50cyhldmVudDogeyBxdWVyeTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICB0aGlzLnNjaGVkdWxlU2VydmljZS5zZWFyY2hQYXJ0aWNpcGFudExvb2t1cChcbiAgICAgIGV2ZW50LnF1ZXJ5ID8/ICcnLFxuICAgICAgUEFSVElDSVBBTlRfU0VBUkNIX0xJTUlUXG4gICAgKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHIpID0+IHtcbiAgICAgICAgY29uc3QgYWRkZWRJZHMgPSBuZXcgU2V0KFxuICAgICAgICAgIHRoaXMuYWRkZWRQYXJ0aWNpcGFudHMubWFwKHAgPT4gcC5pZCArIHAub3JpZ2luKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnBhcnRpY2lwYW50U3VnZ2VzdGlvbnMgPSAoci5jb250ZW50cyA/PyBbXSlcbiAgICAgICAgICAuZmlsdGVyKHAgPT4gIWFkZGVkSWRzLmhhcyhwLmlkICsgcC5vcmlnaW4pKTtcbiAgICAgIH0sXG4gICAgICBlcnJvcjogKCkgPT4ge1xuICAgICAgICB0aGlzLnBhcnRpY2lwYW50U3VnZ2VzdGlvbnMgPSBbXTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uU2VsZWN0UGFydGljaXBhbnQocGFydGljaXBhbnQ6IFBhcnRpY2lwYW50TG9va3VwKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuYWRkZWRQYXJ0aWNpcGFudHMuc29tZShcbiAgICAgICAgcCA9PiBwLmlkID09PSBwYXJ0aWNpcGFudC5pZCAmJiBwLm9yaWdpbiA9PT0gcGFydGljaXBhbnQub3JpZ2luXG4gICAgICApXG4gICAgKSB7XG4gICAgICB0aGlzLmFkZGVkUGFydGljaXBhbnRzID0gWy4uLnRoaXMuYWRkZWRQYXJ0aWNpcGFudHMsIHBhcnRpY2lwYW50XTtcbiAgICB9XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLnNlbGVjdGVkUGFydGljaXBhbnRMb29rdXAgPSBudWxsO1xuICAgIH0pO1xuICB9XG5cbiAgb25SZW1vdmVQYXJ0aWNpcGFudChwYXJ0aWNpcGFudDogUGFydGljaXBhbnRMb29rdXApOiB2b2lkIHtcbiAgICB0aGlzLmFkZGVkUGFydGljaXBhbnRzID0gdGhpcy5hZGRlZFBhcnRpY2lwYW50cy5maWx0ZXIoXG4gICAgICBwID0+ICEocC5pZCA9PT0gcGFydGljaXBhbnQuaWQgJiYgcC5vcmlnaW4gPT09IHBhcnRpY2lwYW50Lm9yaWdpbilcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFMxNTQxOiBCcmVhayBvblNhdmUgaW50byBzbWFsbGVyIGhlbHBlcnMgdG8gcmVkdWNlIGNvbXBsZXhpdHlcbiAgICogUzEyMS9TMjY4MTogQWRkIGJyYWNlcyB0byBhbGwgaWYgc3RhdGVtZW50c1xuICAgKi9cbiAgb25TYXZlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNjaGVkdWxlRm9ybS5pbnZhbGlkKSB7XG4gICAgICB0aGlzLnNjaGVkdWxlRm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gdGhpcy5idWlsZFNhdmVQYXlsb2FkKCk7XG4gICAgY29uc3Qgb3AgPSB0aGlzLmlzRWRpdGluZ1xuICAgICAgPyB0aGlzLnNjaGVkdWxlU2VydmljZS51cGRhdGUocGF5bG9hZFsnaWQnXSBhcyBzdHJpbmcsIHBheWxvYWQpXG4gICAgICA6IHRoaXMuc2NoZWR1bGVTZXJ2aWNlLmluc2VydChwYXlsb2FkKTtcbiAgICBsZXQgc2NoZWR1bGVJZDogc3RyaW5nO1xuICAgIG9wLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKHJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IHtcbiAgICAgICAgc2NoZWR1bGVJZCA9IHRoaXMuaXNFZGl0aW5nXG4gICAgICAgICAgPyBwYXlsb2FkWydpZCddIGFzIHN0cmluZ1xuICAgICAgICAgIDogcmVzdWx0Py5bJ2lkJ10gYXMgc3RyaW5nO1xuICAgICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZVNlcnZpY2UubWFuYWdlUGFydGljaXBhbnRzKFxuICAgICAgICAgIHNjaGVkdWxlSWQsXG4gICAgICAgICAgdGhpcy5idWlsZE1hbmFnZVBhcnRpY2lwYW50c1BheWxvYWQoKVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnZpc2libGVDaGFuZ2UuZW1pdChmYWxzZSk7XG4gICAgICAgIHRoaXMuc2F2ZWQuZW1pdChzY2hlZHVsZUlkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTYXZlUGF5bG9hZCgpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgcGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7XG4gICAgICAuLi50aGlzLnNjaGVkdWxlRm9ybS52YWx1ZSxcbiAgICAgIHR5cGU6IHRoaXMuc2NoZWR1bGVGb3JtLnZhbHVlLnR5cGUgfHwgbnVsbCxcbiAgICAgIHdoZW5PY2N1cnM6IHRoaXMucmVjdXJyZW5jZURlc2NyaXB0aW9uID8/IG51bGxcbiAgICB9O1xuICAgIGlmIChwYXlsb2FkWydzdGFydERhdGUnXSkge1xuICAgICAgcGF5bG9hZFsnc3RhcnREYXRlJ10gPSB0b0RhdGVTdHJpbmcocGF5bG9hZFsnc3RhcnREYXRlJ10pO1xuICAgIH1cbiAgICBpZiAocGF5bG9hZFsnZW5kRGF0ZSddKSB7XG4gICAgICBwYXlsb2FkWydlbmREYXRlJ10gPSB0b0RhdGVTdHJpbmcocGF5bG9hZFsnZW5kRGF0ZSddKTtcbiAgICB9XG4gICAgaWYgKHBheWxvYWRbJ3N0YXJ0VGltZSddKSB7XG4gICAgICBwYXlsb2FkWydzdGFydFRpbWUnXSA9IHRvVGltZVN0cmluZyhwYXlsb2FkWydzdGFydFRpbWUnXSk7XG4gICAgfVxuICAgIGlmIChwYXlsb2FkWydlbmRUaW1lJ10pIHtcbiAgICAgIHBheWxvYWRbJ2VuZFRpbWUnXSA9IHRvVGltZVN0cmluZyhwYXlsb2FkWydlbmRUaW1lJ10pO1xuICAgIH1cbiAgICBpZiAoIXBheWxvYWRbJ3dpdGhSZWN1cnJlbmNlJ10pIHtcbiAgICAgIHRoaXMuY2xlYXJSZWN1cnJlbmNlUGF5bG9hZChwYXlsb2FkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbGVhblJlY3VycmVuY2VGaWVsZHMocGF5bG9hZCk7XG4gICAgfVxuICAgIGlmIChwYXlsb2FkWydhbGxEYXknXSkge1xuICAgICAgcGF5bG9hZFsnc3RhcnRUaW1lJ10gPSBudWxsO1xuICAgICAgcGF5bG9hZFsnZW5kVGltZSddID0gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cblxuICBwcml2YXRlIGNsZWFyUmVjdXJyZW5jZVBheWxvYWQocGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBwYXlsb2FkWydlbmREYXRlJ10gPSBudWxsO1xuICAgIHBheWxvYWRbJ3JlY3VycmVuY2VJbnRlcnZhbCddID0gbnVsbDtcbiAgICBwYXlsb2FkWyd3ZWVrRGF5cyddID0gbnVsbDtcbiAgICBwYXlsb2FkWydyZXBlYXRXaGVuJ10gPSBudWxsO1xuICAgIHBheWxvYWRbJ3JlcGVhdFdoZW5EYXknXSA9IG51bGw7XG4gICAgcGF5bG9hZFsncmVwZWF0V2hlbk9yZGluYWxXZWVrRGF5J10gPSBudWxsO1xuICAgIHBheWxvYWRbJ3JlcGVhdFdoZW5XZWVrTW9udGgnXSA9IG51bGw7XG4gICAgcGF5bG9hZFsncmVwZWF0V2hlbk1vbnRoJ10gPSBudWxsO1xuICB9XG5cbiAgb25DYW5jZWwoKTogdm9pZCB7XG4gICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgdGhpcy52aXNpYmxlQ2hhbmdlLmVtaXQoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZE1hbmFnZVBhcnRpY2lwYW50c1BheWxvYWQoKToge1xuICAgIGFjY291bnRzSWQ6IHN0cmluZ1tdO1xuICAgIGFjY291bnRDb250YWN0c0lkOiBzdHJpbmdbXTtcbiAgICBjb2xsYWJvcmF0b3JzSWQ6IHN0cmluZ1tdO1xuICAgIGV4dGVybmFsUGFydGljaXBhbnRzSWQ6IHN0cmluZ1tdO1xuICB9IHtcbiAgICBjb25zdCBhOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGFjOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZTogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHAgb2YgdGhpcy5hZGRlZFBhcnRpY2lwYW50cykge1xuICAgICAgc3dpdGNoIChwLm9yaWdpbikge1xuICAgICAgICBjYXNlICdBQ0NPVU5UJzoge1xuICAgICAgICAgIGEucHVzaChwLmlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdBQ0NPVU5UX0NPTlRBQ1QnOiB7XG4gICAgICAgICAgYWMucHVzaChwLmlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdDT0xMQUJPUkFUT1InOiB7XG4gICAgICAgICAgYy5wdXNoKHAuaWQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0VYVEVSTkFMX1BBUlRJQ0lQQU5UJzoge1xuICAgICAgICAgIGUucHVzaChwLmlkKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYWNjb3VudHNJZDogYSxcbiAgICAgIGFjY291bnRDb250YWN0c0lkOiBhYyxcbiAgICAgIGNvbGxhYm9yYXRvcnNJZDogYyxcbiAgICAgIGV4dGVybmFsUGFydGljaXBhbnRzSWQ6IGVcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFMxNTQxOiBCcmVhayBjbGVhblJlY3VycmVuY2VGaWVsZHMgaW50byBzbWFsbGVyIGhlbHBlcnNcbiAgICogUzEyMS9TMjY4MTogQWRkIGJyYWNlcyB0byBhbGwgaWYgc3RhdGVtZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBjbGVhblJlY3VycmVuY2VGaWVsZHMocDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBjb25zdCByID0gcFsncmVjdXJyZW5jZSddIGFzIHN0cmluZztcbiAgICBpZiAociAhPT0gU2NoZWR1bGVSZWN1cnJlbmNlLldlZWtseSkge1xuICAgICAgcFsnd2Vla0RheXMnXSA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuY2xlYW5EYWlseVdlZWtseUZpZWxkcyhwLCByKTtcbiAgICB0aGlzLmNsZWFuTW9udGhseUZpZWxkcyhwLCByKTtcbiAgICB0aGlzLmNsZWFuWWVhcmx5RmllbGRzKHAsIHIpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGVhbkRhaWx5V2Vla2x5RmllbGRzKHA6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICByID09PSBTY2hlZHVsZVJlY3VycmVuY2UuRGFpbHkgfHxcbiAgICAgIHIgPT09IFNjaGVkdWxlUmVjdXJyZW5jZS5XZWVrbHlcbiAgICApIHtcbiAgICAgIHBbJ3JlcGVhdFdoZW4nXSA9IG51bGw7XG4gICAgICBwWydyZXBlYXRXaGVuRGF5J10gPSBudWxsO1xuICAgICAgcFsncmVwZWF0V2hlbk9yZGluYWxXZWVrRGF5J10gPSBudWxsO1xuICAgICAgcFsncmVwZWF0V2hlbldlZWtNb250aCddID0gbnVsbDtcbiAgICAgIHBbJ3JlcGVhdFdoZW5Nb250aCddID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFuTW9udGhseUZpZWxkcyhwOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHIgPT09IFNjaGVkdWxlUmVjdXJyZW5jZS5Nb250aGx5KSB7XG4gICAgICBwWydyZXBlYXRXaGVuTW9udGgnXSA9IG51bGw7XG4gICAgICB0aGlzLmNsZWFuUmVwZWF0V2hlbkZpZWxkcyhwKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNsZWFuWWVhcmx5RmllbGRzKHA6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAociA9PT0gU2NoZWR1bGVSZWN1cnJlbmNlLlllYXJseSkge1xuICAgICAgdGhpcy5jbGVhblJlcGVhdFdoZW5GaWVsZHMocCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhblJlcGVhdFdoZW5GaWVsZHMocDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICBpZiAocFsncmVwZWF0V2hlbiddID09PSBSZXBlYXRXaGVuLkluRGF5KSB7XG4gICAgICBwWydyZXBlYXRXaGVuT3JkaW5hbFdlZWtEYXknXSA9IG51bGw7XG4gICAgICBwWydyZXBlYXRXaGVuV2Vla01vbnRoJ10gPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBwWydyZXBlYXRXaGVuRGF5J10gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRSZWN1cnJlbmNlRGVmYXVsdHMoZGF0ZTogRGF0ZSk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zY2hlZHVsZUZvcm0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZCA9IGRhdGUgfHwgbmV3IERhdGUoKTtcbiAgICB0aGlzLnNjaGVkdWxlRm9ybS5wYXRjaFZhbHVlKHtcbiAgICAgIHJlY3VycmVuY2U6IFNjaGVkdWxlUmVjdXJyZW5jZS5EYWlseSxcbiAgICAgIHJlY3VycmVuY2VJbnRlcnZhbDogMSxcbiAgICAgIHdlZWtEYXlzOiBbZ2V0Q3VycmVudFdlZWtEYXkoZCldLFxuICAgICAgcmVwZWF0V2hlbjogUmVwZWF0V2hlbi5JbkRheSxcbiAgICAgIHJlcGVhdFdoZW5EYXk6IGQuZ2V0RGF0ZSgpLFxuICAgICAgcmVwZWF0V2hlbk9yZGluYWxXZWVrRGF5OiBnZXRPcmRpbmFsRm9yRGF0ZShkKSxcbiAgICAgIHJlcGVhdFdoZW5XZWVrTW9udGg6IGdldEN1cnJlbnRXZWVrRGF5KGQpLFxuICAgICAgcmVwZWF0V2hlbk1vbnRoOiBnZXRDdXJyZW50TW9udGgoZClcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBzaG93UmVjdXJyZW5jZUZpZWxkcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zY2hlZHVsZUZvcm0/LmdldCgnd2l0aFJlY3VycmVuY2UnKT8udmFsdWUgPT09IHRydWU7XG4gIH1cblxuICBnZXQgY3VycmVudFJlY3VycmVuY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5zY2hlZHVsZUZvcm0/LmdldCgncmVjdXJyZW5jZScpPy52YWx1ZTtcbiAgfVxuXG4gIGdldCBjdXJyZW50UmVwZWF0V2hlbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnNjaGVkdWxlRm9ybT8uZ2V0KCdyZXBlYXRXaGVuJyk/LnZhbHVlO1xuICB9XG5cbiAgZ2V0IHNob3dXZWVrRGF5cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW50UmVjdXJyZW5jZSA9PT0gU2NoZWR1bGVSZWN1cnJlbmNlLldlZWtseTtcbiAgfVxuXG4gIGdldCBzaG93UmVwZWF0V2hlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jdXJyZW50UmVjdXJyZW5jZSA9PT0gU2NoZWR1bGVSZWN1cnJlbmNlLk1vbnRobHkgfHxcbiAgICAgIHRoaXMuY3VycmVudFJlY3VycmVuY2UgPT09IFNjaGVkdWxlUmVjdXJyZW5jZS5ZZWFybHlcbiAgICApO1xuICB9XG5cbiAgZ2V0IHNob3dSZXBlYXRXaGVuRGF5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnNob3dSZXBlYXRXaGVuICYmIHRoaXMuY3VycmVudFJlcGVhdFdoZW4gPT09IFJlcGVhdFdoZW4uSW5EYXk7XG4gIH1cblxuICBnZXQgc2hvd09yZGluYWxGaWVsZHMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuc2hvd1JlcGVhdFdoZW4gJiZcbiAgICAgIHRoaXMuY3VycmVudFJlcGVhdFdoZW4gPT09IFJlcGVhdFdoZW4uSW5PcmRpbmFsV2Vla0RheVxuICAgICk7XG4gIH1cblxuICBnZXQgc2hvd01vbnRoRmllbGQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFJlY3VycmVuY2UgPT09IFNjaGVkdWxlUmVjdXJyZW5jZS5ZZWFybHk7XG4gIH1cblxuICBnZXRPcmlnaW5MYWJlbChvOiBQYXJ0aWNpcGFudE9yaWdpbik6IHN0cmluZyB7IHJldHVybiBfZ2V0T3JpZ2luTGFiZWwodGhpcy50LCBvKTsgfVxuICBnZXRPcmlnaW5JY29uKG86IFBhcnRpY2lwYW50T3JpZ2luKTogc3RyaW5nIHsgcmV0dXJuIF9nZXRPcmlnaW5JY29uKG8pOyB9XG4gIGdldFBhcnRpY2lwYW50TmFtZShwOiBTY2hlZHVsZVBhcnRpY2lwYW50KTogc3RyaW5nIHsgcmV0dXJuIF9nZXRQYXJ0aWNpcGFudE5hbWUocCk7IH1cbiAgZ2V0UGFydGljaXBhbnRUeXBlKHA6IFNjaGVkdWxlUGFydGljaXBhbnQpOiBzdHJpbmcgeyByZXR1cm4gX2dldFBhcnRpY2lwYW50VHlwZSh0aGlzLnQsIHApOyB9XG4gIGdldFBhcnRpY2lwYW50VHlwZUljb24ocDogU2NoZWR1bGVQYXJ0aWNpcGFudCk6IHN0cmluZyB7IHJldHVybiBfZ2V0UGFydGljaXBhbnRUeXBlSWNvbihwKTsgfVxuICBnZXRQcmlvcml0eVNldmVyaXR5KHA6IHN0cmluZyk6IFByaW9yaXR5U2V2ZXJpdHkgeyByZXR1cm4gX2dldFByaW9yaXR5U2V2ZXJpdHkocCk7IH1cbiAgZ2V0UHJpb3JpdHlMYWJlbChwOiBzdHJpbmcpOiBzdHJpbmcgeyByZXR1cm4gX2dldFByaW9yaXR5TGFiZWwodGhpcy50LCBwKTsgfVxuICBnZXRDb25maXJtYXRpb25TZXZlcml0eShjOiBzdHJpbmcpOiBDb25maXJtYXRpb25TZXZlcml0eSB7IHJldHVybiBfZ2V0Q29uZmlybWF0aW9uU2V2ZXJpdHkoYyk7IH1cbiAgZ2V0Q29uZmlybWF0aW9uTGFiZWwoYzogc3RyaW5nKTogc3RyaW5nIHsgcmV0dXJuIF9nZXRDb25maXJtYXRpb25MYWJlbCh0aGlzLnQsIGMpOyB9XG5cbiAgcHJpdmF0ZSBnZXREZWZhdWx0U3RhcnRUaW1lKGQ6IERhdGUpOiBzdHJpbmcge1xuICAgIHJldHVybiBnZXREZWZhdWx0U3RhcnRUaW1lKGQpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREZWZhdWx0RW5kVGltZShzdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0RGVmYXVsdEVuZFRpbWUoc3QpO1xuICB9XG59XG4iLCI8IS0tIFNjaGVkdWxlIERyYXdlciAtLT5cbjxwLWRyYXdlclxuICBbKHZpc2libGUpXT1cInZpc2libGVcIlxuICBwb3NpdGlvbj1cInJpZ2h0XCJcbiAgW3N0eWxlXT1cInsgd2lkdGg6ICc4NXZ3JywgJ21heC13aWR0aCc6ICcxMjAwcHgnIH1cIlxuICBbbW9kYWxdPVwidHJ1ZVwiXG4gIChvbkhpZGUpPVwib25DYW5jZWwoKVwiXG4+XG4gIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICA8c3BhbiBjbGFzcz1cImRyYXdlci10aXRsZVwiPlxuICAgICAgPGkgY2xhc3M9XCJwaSBwaS1jYWxlbmRhclwiPjwvaT5cbiAgICAgIHt7XG4gICAgICAgIGlzRWRpdGluZ1xuICAgICAgICAgID8gKCdjcm14LmNvbXBvbmVudHMuc2NoZWR1bGVfc2NoZWR1bGVfZWRpdCcgfCB0cmFuc2xhdGUpXG4gICAgICAgICAgOiAoJ2NybXguY29tcG9uZW50cy5zY2hlZHVsZV9zY2hlZHVsZV9uZXcnIHwgdHJhbnNsYXRlKVxuICAgICAgfX1cbiAgICA8L3NwYW4+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPGRpdiBjbGFzcz1cImRyYXdlci1sYXlvdXRcIiAqbmdJZj1cInNjaGVkdWxlRm9ybVwiPlxuICAgIDwhLS0gTGVmdDogRm9ybSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLWxlZnRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItc2VjdGlvbi1oZWFkZXJcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1pbmZvLWNpcmNsZVwiPjwvaT5cbiAgICAgICAgPHNwYW4+XG4gICAgICAgICAge3sgJ2NybXguY29tcG9uZW50cy5zY2hlZHVsZV9zY2hlZHVsZV9kZXRhaWxzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxzaWEtZHluYW1pYy1mb3JtXG4gICAgICAgICNkZXRhaWxGb3JtXG4gICAgICAgIFtzZWN0aW9uc109XCJbeyBmaWVsZHM6IHNjaGVkdWxlRGV0YWlsRmllbGRzIH1dXCJcbiAgICAgICAgW2VudGl0eURhdGFdPVwiZW50aXR5RGF0YUZvckZvcm1cIlxuICAgICAgICBbbW9kZV09XCInZm9ybSdcIlxuICAgICAgICBbc2hvd1N1Ym1pdEJ1dHRvbl09XCJmYWxzZVwiXG4gICAgICAgIFtzaG93Q2FuY2VsQnV0dG9uXT1cImZhbHNlXCJcbiAgICAgICAgKGZvcm1SZWFkeSk9XCJvbkRldGFpbEZvcm1SZWFkeSgkZXZlbnQpXCJcbiAgICAgID48L3NpYS1keW5hbWljLWZvcm0+XG4gICAgPC9kaXY+XG5cbiAgICA8IS0tIFJpZ2h0OiBSZWN1cnJlbmNlICsgUGFydGljaXBhbnRzIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItcmlnaHRcIj5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJkcmF3ZXItc2VjdGlvblwiXG4gICAgICAgICpuZ0lmPVwic2hvd1JlY3VycmVuY2VGaWVsZHNcIlxuICAgICAgPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLXNlY3Rpb24taGVhZGVyXCI+XG4gICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1yZXBsYXlcIj48L2k+XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAnY3JteC5jb21wb25lbnRzLnNjaGVkdWxlX3JlY3VycmVuY2VfY29uZmlnJ1xuICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxmb3JtXG4gICAgICAgICAgW2Zvcm1Hcm91cF09XCJzY2hlZHVsZUZvcm1cIlxuICAgICAgICAgIGNsYXNzPVwiZHJhd2VyLWZvcm1cIlxuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZCBmbGV4LTFcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInJlY3VycmVuY2VcIj5cbiAgICAgICAgICAgICAgICB7eyAnY3JteC5jb21wb25lbnRzLnNjaGVkdWxlX3JlY3VycmVuY2UnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxwLWRyb3Bkb3duXG4gICAgICAgICAgICAgICAgaWQ9XCJyZWN1cnJlbmNlXCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyZWN1cnJlbmNlXCJcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJyZWN1cnJlbmNlT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgb3B0aW9uTGFiZWw9XCJsYWJlbFwiXG4gICAgICAgICAgICAgICAgb3B0aW9uVmFsdWU9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ3LWZ1bGxcIlxuICAgICAgICAgICAgICA+PC9wLWRyb3Bkb3duPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZCBmbGV4LTFcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInJlY3VycmVuY2VJbnRlcnZhbFwiPlxuICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAnY3JteC5jb21wb25lbnRzLnNjaGVkdWxlX3JlY3VycmVuY2VfaW50ZXJ2YWwnXG4gICAgICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPHAtaW5wdXROdW1iZXJcbiAgICAgICAgICAgICAgICBpZD1cInJlY3VycmVuY2VJbnRlcnZhbFwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmVjdXJyZW5jZUludGVydmFsXCJcbiAgICAgICAgICAgICAgICBbbWluXT1cIjFcIlxuICAgICAgICAgICAgICAgIFttYXhdPVwiOTlcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsXCJcbiAgICAgICAgICAgICAgPjwvcC1pbnB1dE51bWJlcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1yb3dcIlxuICAgICAgICAgICAgKm5nSWY9XCJzaG93V2Vla0RheXNcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkIGZsZXgtMVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwid2Vla0RheXNcIj5cbiAgICAgICAgICAgICAgICB7eyAnY3JteC5jb21wb25lbnRzLnNjaGVkdWxlX3dlZWtfZGF5cycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPHAtbXVsdGlTZWxlY3RcbiAgICAgICAgICAgICAgICBpZD1cIndlZWtEYXlzXCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJ3ZWVrRGF5c1wiXG4gICAgICAgICAgICAgICAgW29wdGlvbnNdPVwid2Vla0RheU9wdGlvbnNcIlxuICAgICAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibGFiZWxcIlxuICAgICAgICAgICAgICAgIG9wdGlvblZhbHVlPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJcbiAgICAgICAgICAgICAgICAgICdjcm14LmNvbXBvbmVudHMuc2NoZWR1bGVfc2VsZWN0X3dlZWtfZGF5J1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgW21heFNlbGVjdGVkTGFiZWxzXT1cIjdcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwidy1mdWxsXCJcbiAgICAgICAgICAgICAgPjwvcC1tdWx0aVNlbGVjdD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1yb3dcIlxuICAgICAgICAgICAgKm5nSWY9XCJzaG93UmVwZWF0V2hlblwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGQgZmxleC0xXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJyZXBlYXRXaGVuXCI+XG4gICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICdjcm14LmNvbXBvbmVudHMuc2NoZWR1bGVfcmVwZWF0X3doZW4nIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgICAgICAgICBpZD1cInJlcGVhdFdoZW5cIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJlcGVhdFdoZW5cIlxuICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cInJlcGVhdFdoZW5PcHRpb25zXCJcbiAgICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbFwiXG4gICAgICAgICAgICAgID48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWZpZWxkIGZsZXgtMVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwic2hvd1JlcGVhdFdoZW5EYXlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicmVwZWF0V2hlbkRheVwiPlxuICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAnY3JteC5jb21wb25lbnRzLnNjaGVkdWxlX3JlcGVhdF93aGVuX2RheSdcbiAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlclxuICAgICAgICAgICAgICAgIGlkPVwicmVwZWF0V2hlbkRheVwiXG4gICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicmVwZWF0V2hlbkRheVwiXG4gICAgICAgICAgICAgICAgW21pbl09XCIxXCJcbiAgICAgICAgICAgICAgICBbbWF4XT1cIjMxXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbFwiXG4gICAgICAgICAgICAgID48L3AtaW5wdXROdW1iZXI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWZpZWxkIGZsZXgtMVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwic2hvd09yZGluYWxGaWVsZHNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicmVwZWF0V2hlbk9yZGluYWxXZWVrRGF5XCI+XG4gICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICdjcm14LmNvbXBvbmVudHMuc2NoZWR1bGVfb3JkaW5hbF93ZWVrX2RheSdcbiAgICAgICAgICAgICAgICAgICAgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8cC1kcm9wZG93blxuICAgICAgICAgICAgICAgIGlkPVwicmVwZWF0V2hlbk9yZGluYWxXZWVrRGF5XCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJyZXBlYXRXaGVuT3JkaW5hbFdlZWtEYXlcIlxuICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIm9yZGluYWxPcHRpb25zXCJcbiAgICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbFwiXG4gICAgICAgICAgICAgID48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWZpZWxkIGZsZXgtMVwiXG4gICAgICAgICAgICAgICpuZ0lmPVwic2hvd09yZGluYWxGaWVsZHNcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicmVwZWF0V2hlbldlZWtNb250aFwiPlxuICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAnY3JteC5jb21wb25lbnRzLnNjaGVkdWxlX3dlZWtfbW9udGgnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPHAtZHJvcGRvd25cbiAgICAgICAgICAgICAgICBpZD1cInJlcGVhdFdoZW5XZWVrTW9udGhcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJlcGVhdFdoZW5XZWVrTW9udGhcIlxuICAgICAgICAgICAgICAgIFtvcHRpb25zXT1cIndlZWtEYXlPcHRpb25zXCJcbiAgICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbFwiXG4gICAgICAgICAgICAgID48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImZvcm0tcm93XCJcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd01vbnRoRmllbGRcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkIGZsZXgtMVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicmVwZWF0V2hlbk1vbnRoXCI+XG4gICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICdjcm14LmNvbXBvbmVudHMuc2NoZWR1bGVfcmVwZWF0X21vbnRoJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgIDxwLWRyb3Bkb3duXG4gICAgICAgICAgICAgICAgaWQ9XCJyZXBlYXRXaGVuTW9udGhcIlxuICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInJlcGVhdFdoZW5Nb250aFwiXG4gICAgICAgICAgICAgICAgW29wdGlvbnNdPVwibW9udGhPcHRpb25zXCJcbiAgICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cImxhYmVsXCJcbiAgICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cInZhbHVlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInctZnVsbFwiXG4gICAgICAgICAgICAgID48L3AtZHJvcGRvd24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9mb3JtPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJyZWN1cnJlbmNlLWRlc2NyaXB0aW9uXCJcbiAgICAgICAgICAqbmdJZj1cInJlY3VycmVuY2VEZXNjcmlwdGlvblwiXG4gICAgICAgID5cbiAgICAgICAgICA8aSBjbGFzcz1cInBpIHBpLWluZm8tY2lyY2xlXCI+PC9pPlxuICAgICAgICAgIDxzcGFuPnt7IHJlY3VycmVuY2VEZXNjcmlwdGlvbiB9fTwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPHAtZGl2aWRlcj48L3AtZGl2aWRlcj5cblxuICAgICAgPCEtLSBQYXJ0aWNpcGFudHMgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwiZHJhd2VyLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRyYXdlci1zZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICAgIDxpIGNsYXNzPVwicGkgcGktdXNlcnNcIj48L2k+XG4gICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICB7eyAnY3JteC5jb21wb25lbnRzLnNjaGVkdWxlX3BhcnRpY2lwYW50cycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicGFydGljaXBhbnQtc2VhcmNoXCI+XG4gICAgICAgICAgPHAtYXV0b0NvbXBsZXRlXG4gICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkUGFydGljaXBhbnRMb29rdXBcIlxuICAgICAgICAgICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXG4gICAgICAgICAgICBbc3VnZ2VzdGlvbnNdPVwicGFydGljaXBhbnRTdWdnZXN0aW9uc1wiXG4gICAgICAgICAgICAoY29tcGxldGVNZXRob2QpPVwiXG4gICAgICAgICAgICAgIG9uU2VhcmNoUGFydGljaXBhbnRzKCRldmVudClcbiAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAob25TZWxlY3QpPVwiXG4gICAgICAgICAgICAgIG9uU2VsZWN0UGFydGljaXBhbnQoJGV2ZW50LnZhbHVlKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIChvbkZvY3VzKT1cIlxuICAgICAgICAgICAgICBvblNlYXJjaFBhcnRpY2lwYW50cyh7IHF1ZXJ5OiAnJyB9KVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIG9wdGlvbkxhYmVsPVwibmFtZVwiXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiXG4gICAgICAgICAgICAgICdjcm14LmNvbXBvbmVudHMuc2NoZWR1bGVfc2VhcmNoX3BhcnRpY2lwYW50J1xuICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICBcIlxuICAgICAgICAgICAgW21pbkxlbmd0aF09XCIwXCJcbiAgICAgICAgICAgIFtmb3JjZVNlbGVjdGlvbl09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtzaG93Q2xlYXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbZmx1aWRdPVwidHJ1ZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlXG4gICAgICAgICAgICAgIGxldC1pdGVtXG4gICAgICAgICAgICAgIHBUZW1wbGF0ZT1cIml0ZW1cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGFydGljaXBhbnQtc3VnZ2VzdGlvblwiPlxuICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICBbY2xhc3NdPVwiZ2V0T3JpZ2luSWNvbihpdGVtLm9yaWdpbilcIlxuICAgICAgICAgICAgICAgID48L2k+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwYXJ0aWNpcGFudC1zdWdnZXN0aW9uLWluZm9cIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwicGFydGljaXBhbnQtc3VnZ2VzdGlvbi1uYW1lXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgaXRlbS5uYW1lIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBhcnRpY2lwYW50LXN1Z2dlc3Rpb24tZGV0YWlsXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtLnJlZmVyZW5jZU5hbWVcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7eyBpdGVtLnJlZmVyZW5jZU5hbWUgfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwYXJ0aWNpcGFudC1zdWdnZXN0aW9uLW9yaWdpblwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAge3sgZ2V0T3JpZ2luTGFiZWwoaXRlbS5vcmlnaW4pIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPC9wLWF1dG9Db21wbGV0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAqbmdJZj1cIlxuICAgICAgICAgICAgIXBhcnRpY2lwYW50c0xvYWRpbmcgJiZcbiAgICAgICAgICAgIGFkZGVkUGFydGljaXBhbnRzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgIFwiXG4gICAgICAgICAgY2xhc3M9XCJwYXJ0aWNpcGFudHMtZW1wdHlcIlxuICAgICAgICA+XG4gICAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS11c2Vyc1wiPjwvaT5cbiAgICAgICAgICA8cD5cbiAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICdjcm14LmNvbXBvbmVudHMuc2NoZWR1bGVfbm9fcGFydGljaXBhbnRzJ1xuICAgICAgICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICB9fVxuICAgICAgICAgIDwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxwLXRhYmxlXG4gICAgICAgICAgKm5nSWY9XCJcbiAgICAgICAgICAgICFwYXJ0aWNpcGFudHNMb2FkaW5nICYmXG4gICAgICAgICAgICBhZGRlZFBhcnRpY2lwYW50cy5sZW5ndGggPiAwXG4gICAgICAgICAgXCJcbiAgICAgICAgICBbdmFsdWVdPVwiYWRkZWRQYXJ0aWNpcGFudHNcIlxuICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWRhdGF0YWJsZS1zbSBwLWRhdGF0YWJsZS1zdHJpcGVkXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRoIHNjb3BlPVwiY29sXCI+XG4gICAgICAgICAgICAgICAge3sgJ2NybXguY29tcG9uZW50cy5zY2hlZHVsZV9uYW1lJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgICBzY29wZT1cImNvbFwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjb2wtcGFydGljaXBhbnQtdHlwZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgJ2NybXguY29tcG9uZW50cy5zY2hlZHVsZV9wYXJ0aWNpcGFudF90eXBlJ1xuICAgICAgICAgICAgICAgICAgICB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgIHNjb3BlPVwiY29sXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImNvbC1hY3Rpb25zXCJcbiAgICAgICAgICAgICAgPjwvdGg+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImJvZHlcIiBsZXQtcD5cbiAgICAgICAgICAgIDx0cj5cbiAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXJ0aWNpcGFudC1uYW1lLWNlbGxcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuPnt7IHAubmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwicC5yZWZlcmVuY2VOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwYXJ0aWNpcGFudC1yZWZlcmVuY2VcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7eyBwLnJlZmVyZW5jZU5hbWUgfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgPHRkPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXJ0aWNpcGFudC10eXBlLWNlbGxcIj5cbiAgICAgICAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzc109XCJnZXRPcmlnaW5JY29uKHAub3JpZ2luKVwiXG4gICAgICAgICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgIHt7IGdldE9yaWdpbkxhYmVsKHAub3JpZ2luKSB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICA8dGQ+XG4gICAgICAgICAgICAgICAgPHAtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBpY29uPVwicGkgcGktdHJhc2hcIlxuICAgICAgICAgICAgICAgICAgW3JvdW5kZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICBbdGV4dF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgIHNldmVyaXR5PVwiZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAgIChvbkNsaWNrKT1cIm9uUmVtb3ZlUGFydGljaXBhbnQocClcIlxuICAgICAgICAgICAgICAgICAgW3BUb29sdGlwXT1cIlxuICAgICAgICAgICAgICAgICAgICAnY3JteC5jb21wb25lbnRzLnNjaGVkdWxlX3JlbW92ZScgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxuICAgICAgICAgICAgICAgID48L3AtYnV0dG9uPlxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L3AtdGFibGU+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImZvb3RlclwiPlxuICAgIDxkaXYgY2xhc3M9XCJkcmF3ZXItZm9vdGVyXCI+XG4gICAgICA8cC1idXR0b25cbiAgICAgICAgW2xhYmVsXT1cIidjcm14LmNvbXBvbmVudHMuY2FuY2VsJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgIGljb249XCJwaSBwaS10aW1lc1wiXG4gICAgICAgIHNldmVyaXR5PVwic2Vjb25kYXJ5XCJcbiAgICAgICAgW291dGxpbmVkXT1cInRydWVcIlxuICAgICAgICAob25DbGljayk9XCJvbkNhbmNlbCgpXCJcbiAgICAgID48L3AtYnV0dG9uPlxuICAgICAgPHAtYnV0dG9uXG4gICAgICAgIFtsYWJlbF09XCInY3JteC5jb21wb25lbnRzLnNhdmUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgaWNvbj1cInBpIHBpLWNoZWNrXCJcbiAgICAgICAgKG9uQ2xpY2spPVwib25TYXZlKClcIlxuICAgICAgPjwvcC1idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L3AtZHJhd2VyPlxuIl19