@ironcode/vas-lib 1.15.0 → 1.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/lib/control-value/vas-camera-control-value.model.js +1 -2
- package/cjs/lib/control-value/vas-camera-control-value.model.js.map +1 -1
- package/cjs/lib/controls-config/vas-control-config-direction.enum.js +1 -1
- package/cjs/lib/controls-config/vas-control-config-direction.enum.js.map +1 -1
- package/cjs/lib/entity/index.d.ts +1 -1
- package/cjs/lib/entity/index.d.ts.map +1 -1
- package/cjs/lib/entity/index.js +1 -1
- package/cjs/lib/entity/index.js.map +1 -1
- package/cjs/lib/entity/vas-account.dto.d.ts +1 -1
- package/cjs/lib/entity/vas-account.dto.d.ts.map +1 -1
- package/cjs/lib/entity/vas-account.dto.js +1 -1
- package/cjs/lib/entity/vas-account.dto.js.map +1 -1
- package/cjs/lib/entity/vas-control.model.js.map +1 -1
- package/cjs/lib/entity/vas-field.model.js.map +1 -1
- package/cjs/lib/entity/vas-file.dto.js +1 -2
- package/cjs/lib/entity/vas-file.dto.js.map +1 -1
- package/cjs/lib/entity/vas-file.model.js.map +1 -1
- package/cjs/lib/entity/vas-fire-user.model.d.ts +1 -1
- package/cjs/lib/entity/vas-fire-user.model.d.ts.map +1 -1
- package/cjs/lib/entity/vas-fire-user.model.js.map +1 -1
- package/cjs/lib/entity/vas-form-config.model.d.ts +3 -13
- package/cjs/lib/entity/vas-form-config.model.d.ts.map +1 -1
- package/cjs/lib/entity/vas-form-config.model.js.map +1 -1
- package/cjs/lib/entity/vas-form.model.js.map +1 -1
- package/cjs/lib/entity/vas-group.model.js.map +1 -1
- package/cjs/lib/entity/vas-invitation.d.ts +1 -1
- package/cjs/lib/entity/vas-invitation.d.ts.map +1 -1
- package/cjs/lib/entity/vas-invitation.js +1 -1
- package/cjs/lib/entity/vas-invitation.js.map +1 -1
- package/cjs/lib/entity/vas-job-action.dto.d.ts +22 -7
- package/cjs/lib/entity/vas-job-action.dto.d.ts.map +1 -1
- package/cjs/lib/entity/vas-job-action.dto.js +10 -1
- package/cjs/lib/entity/vas-job-action.dto.js.map +1 -1
- package/cjs/lib/entity/vas-job-status.d.ts +28 -0
- package/cjs/lib/entity/vas-job-status.d.ts.map +1 -0
- package/cjs/lib/entity/vas-job-status.js +46 -0
- package/cjs/lib/entity/vas-job-status.js.map +1 -0
- package/cjs/lib/entity/vas-job.model.js.map +1 -1
- package/cjs/lib/entity/vas-user.model.d.ts +1 -1
- package/cjs/lib/entity/vas-user.model.d.ts.map +1 -1
- package/cjs/lib/utils/find-form-control.js.map +1 -1
- package/cjs/lib/utils/get-value-by-path.d.ts.map +1 -1
- package/cjs/lib/utils/get-value-by-path.js.map +1 -1
- package/cjs/lib/utils/is-array-string.d.ts +1 -1
- package/cjs/lib/utils/is-array-string.d.ts.map +1 -1
- package/cjs/lib/utils/omit.d.ts.map +1 -1
- package/cjs/lib/utils/omit.js.map +1 -1
- package/cjs/lib/utils/only.d.ts.map +1 -1
- package/cjs/lib/utils/only.js.map +1 -1
- package/{fesm2020 → fesm2022}/ironcode-vas-lib.mjs +570 -2
- package/fesm2022/ironcode-vas-lib.mjs.map +1 -0
- package/lib/entity/index.d.ts +1 -1
- package/lib/entity/vas-account.dto.d.ts +1 -1
- package/lib/entity/vas-fire-user.model.d.ts +1 -1
- package/lib/entity/vas-form-config.model.d.ts +3 -13
- package/lib/entity/vas-invitation.d.ts +1 -1
- package/lib/entity/vas-job-action.dto.d.ts +22 -7
- package/lib/entity/vas-job-status.d.ts +27 -0
- package/lib/entity/vas-user.model.d.ts +1 -1
- package/lib/utils/is-array-string.d.ts +1 -1
- package/package.json +3 -11
- package/cjs/lib/entity/vas-job-status.dto.d.ts +0 -8
- package/cjs/lib/entity/vas-job-status.dto.d.ts.map +0 -1
- package/cjs/lib/entity/vas-job-status.dto.js +0 -3
- package/cjs/lib/entity/vas-job-status.dto.js.map +0 -1
- package/cjs/package.json +0 -5
- package/esm2020/ironcode-vas-lib.mjs +0 -5
- package/esm2020/lib/control-value/index.mjs +0 -3
- package/esm2020/lib/control-value/vas-camera-control-value.model.mjs +0 -8
- package/esm2020/lib/control-value/vas-function-control-value.dto.mjs +0 -2
- package/esm2020/lib/controls-config/index.mjs +0 -5
- package/esm2020/lib/controls-config/vas-control-config-direction.enum.mjs +0 -8
- package/esm2020/lib/controls-config/vas-control-config.model.mjs +0 -2
- package/esm2020/lib/controls-config/vas-function-control-config.dto.mjs +0 -2
- package/esm2020/lib/controls-config/vas-select-control-config.model.mjs +0 -2
- package/esm2020/lib/elastic/index.mjs +0 -2
- package/esm2020/lib/elastic/job.elastic-doc.mjs +0 -2
- package/esm2020/lib/entity/index.mjs +0 -70
- package/esm2020/lib/entity/vas-access-group.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-account-config.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-account-object.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-account-object.model.mjs +0 -24
- package/esm2020/lib/entity/vas-account.dto.mjs +0 -7
- package/esm2020/lib/entity/vas-base.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-base.model.mjs +0 -34
- package/esm2020/lib/entity/vas-branch.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-branch.model.mjs +0 -68
- package/esm2020/lib/entity/vas-contact-type.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-contact.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-contact.model.mjs +0 -101
- package/esm2020/lib/entity/vas-control-type.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-control-type.model.mjs +0 -52
- package/esm2020/lib/entity/vas-control.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-control.model.mjs +0 -191
- package/esm2020/lib/entity/vas-field.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-field.model.mjs +0 -112
- package/esm2020/lib/entity/vas-file.dto.mjs +0 -9
- package/esm2020/lib/entity/vas-file.model.mjs +0 -135
- package/esm2020/lib/entity/vas-fire-user.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-fire-user.model.mjs +0 -102
- package/esm2020/lib/entity/vas-form-config.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-form-config.model.mjs +0 -31
- package/esm2020/lib/entity/vas-form.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-form.model.mjs +0 -215
- package/esm2020/lib/entity/vas-group.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-group.model.mjs +0 -108
- package/esm2020/lib/entity/vas-instruction-job-field.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-instruction-job-field.model.mjs +0 -48
- package/esm2020/lib/entity/vas-instruction-job.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-instruction-job.model.mjs +0 -81
- package/esm2020/lib/entity/vas-instruction-provider.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-instruction-provider.model.mjs +0 -66
- package/esm2020/lib/entity/vas-instruction.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-instruction.model.mjs +0 -52
- package/esm2020/lib/entity/vas-invitation.mjs +0 -88
- package/esm2020/lib/entity/vas-job-action.dto.mjs +0 -22
- package/esm2020/lib/entity/vas-job-copy.mjs +0 -39
- package/esm2020/lib/entity/vas-job-data.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-job-data.model.mjs +0 -21
- package/esm2020/lib/entity/vas-job-email.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-job-email.model.mjs +0 -85
- package/esm2020/lib/entity/vas-job-status.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-job-type.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-job.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-job.model.mjs +0 -529
- package/esm2020/lib/entity/vas-lookup-type.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-lookup.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-lookup.model.mjs +0 -75
- package/esm2020/lib/entity/vas-membership.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-membership.model.mjs +0 -62
- package/esm2020/lib/entity/vas-note.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-note.model.mjs +0 -68
- package/esm2020/lib/entity/vas-report-layout.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-report-layout.model.mjs +0 -22
- package/esm2020/lib/entity/vas-report-request.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-report-request.model.mjs +0 -44
- package/esm2020/lib/entity/vas-report.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-report.model.mjs +0 -72
- package/esm2020/lib/entity/vas-restricted-account-object.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-restricted-account-object.model.mjs +0 -24
- package/esm2020/lib/entity/vas-task-type.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-task.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-task.model.mjs +0 -80
- package/esm2020/lib/entity/vas-user.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-user.model.mjs +0 -42
- package/esm2020/lib/entity/vas-vehicle.dto.mjs +0 -2
- package/esm2020/lib/entity/vas-vehicle.model.mjs +0 -69
- package/esm2020/lib/model/geo-location.mjs +0 -12
- package/esm2020/lib/model/index.mjs +0 -3
- package/esm2020/lib/model/vas-time-range.model.mjs +0 -2
- package/esm2020/lib/utils/get-value-by-path.mjs +0 -64
- package/esm2020/lib/utils/is-array-string.mjs +0 -4
- package/esm2020/lib/utils/only.mjs +0 -22
- package/esm2020/public-api.mjs +0 -6
- package/fesm2015/ironcode-vas-lib.mjs +0 -2736
- package/fesm2015/ironcode-vas-lib.mjs.map +0 -1
- package/fesm2020/ironcode-vas-lib.mjs.map +0 -1
- package/lib/entity/vas-job-status.dto.d.ts +0 -7
|
@@ -1,529 +0,0 @@
|
|
|
1
|
-
import { isFileDto } from './vas-file.dto';
|
|
2
|
-
import { UUID } from 'angular2-uuid';
|
|
3
|
-
import moment from 'moment';
|
|
4
|
-
import { getValueByPath } from '../utils/get-value-by-path';
|
|
5
|
-
import { VasFieldModel } from './vas-field.model';
|
|
6
|
-
import { VasRestrictedAccountObjectModel } from './vas-restricted-account-object.model';
|
|
7
|
-
import { getEmptyGeoLocation } from '../model';
|
|
8
|
-
import { isCameraControlValueV1 } from '../control-value';
|
|
9
|
-
import { isArrayString } from '../utils/is-array-string';
|
|
10
|
-
import { only } from '../utils/only';
|
|
11
|
-
/**
|
|
12
|
-
* JobModel
|
|
13
|
-
*/
|
|
14
|
-
export class VasJobModel extends VasRestrictedAccountObjectModel {
|
|
15
|
-
constructor(id, created, serverCreated, createdBy, modified, serverModified, modifiedBy, createdByName, modifiedByName, account, accessGroup, reference, jobDate, jobStatus, jobType, assigneeId, formId, timeZoneOffset, pendingFields, childModified, version, createdByDisplayName, modifiedByDisplayName, geoLocation, files, fields, jobEmails, notes, reports, tasks, instruction) {
|
|
16
|
-
super(id, created, serverCreated, createdBy, modified, serverModified, modifiedBy, createdByName, modifiedByName, account, accessGroup);
|
|
17
|
-
this.id = id;
|
|
18
|
-
this.created = created;
|
|
19
|
-
this.serverCreated = serverCreated;
|
|
20
|
-
this.createdBy = createdBy;
|
|
21
|
-
this.modified = modified;
|
|
22
|
-
this.serverModified = serverModified;
|
|
23
|
-
this.modifiedBy = modifiedBy;
|
|
24
|
-
this.createdByName = createdByName;
|
|
25
|
-
this.modifiedByName = modifiedByName;
|
|
26
|
-
this.account = account;
|
|
27
|
-
this.accessGroup = accessGroup;
|
|
28
|
-
this.reference = reference;
|
|
29
|
-
this.jobDate = jobDate;
|
|
30
|
-
this.jobStatus = jobStatus;
|
|
31
|
-
this.jobType = jobType;
|
|
32
|
-
this.assigneeId = assigneeId;
|
|
33
|
-
this.formId = formId;
|
|
34
|
-
this.timeZoneOffset = timeZoneOffset;
|
|
35
|
-
this.pendingFields = pendingFields;
|
|
36
|
-
this.childModified = childModified;
|
|
37
|
-
this.version = version;
|
|
38
|
-
this.createdByDisplayName = createdByDisplayName;
|
|
39
|
-
this.modifiedByDisplayName = modifiedByDisplayName;
|
|
40
|
-
this.geoLocation = geoLocation;
|
|
41
|
-
this.files = files;
|
|
42
|
-
this.fields = fields;
|
|
43
|
-
this.jobEmails = jobEmails;
|
|
44
|
-
this.notes = notes;
|
|
45
|
-
this.reports = reports;
|
|
46
|
-
this.tasks = tasks;
|
|
47
|
-
this.instruction = instruction;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Returns this with the dynamic interface
|
|
51
|
-
* @return {VasJobModelDynamicInterface}
|
|
52
|
-
*/
|
|
53
|
-
get $this() {
|
|
54
|
-
return this;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Returns a list of Job dynamic properties i.e. those that are added by the
|
|
58
|
-
* dynamic forms
|
|
59
|
-
*/
|
|
60
|
-
get dynamicProperties() {
|
|
61
|
-
const nativeProps = this.staticProperties;
|
|
62
|
-
return Object
|
|
63
|
-
.getOwnPropertyNames(this)
|
|
64
|
-
.filter(prop => !nativeProps.includes(prop));
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Returns the list of properties of the Job type
|
|
68
|
-
*/
|
|
69
|
-
get staticProperties() {
|
|
70
|
-
return Object.getOwnPropertyNames(VasJobModel.empty());
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* @return {VasJobModel}
|
|
74
|
-
*/
|
|
75
|
-
static empty() {
|
|
76
|
-
return new VasJobModel('', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', moment().utcOffset(), 0, '', 0, '', '', getEmptyGeoLocation(), [], [], [], [], [], [], null);
|
|
77
|
-
}
|
|
78
|
-
static fromDto(dto) {
|
|
79
|
-
const model = new VasJobModel(dto.id || '', dto.created || '', dto.serverCreated || '', dto.createdBy || '', dto.modified || '', dto.serverModified || '', dto.modifiedBy || '', dto.createdByName || '', dto.modifiedByName || '', dto.account || '', dto.accessGroup || '', dto.reference || '', dto.jobDate || '', dto.jobStatus || '', dto.jobType || '', dto.assigneeId || '', dto.formId || dto.lastForm || '', dto.timeZoneOffset || moment().utcOffset(), dto.pendingFields || 0, dto.childModified || '', dto.version || 0, dto.createdByDisplayName || '', dto.modifiedByDisplayName || '', dto.geoLocation || getEmptyGeoLocation(), dto.files || [], dto.fields || [], dto.jobEmails || [], dto.notes || [], dto.reports || [], dto.tasks || [], dto.instruction || null);
|
|
80
|
-
const emptyKeys = model.staticProperties;
|
|
81
|
-
Object
|
|
82
|
-
.keys(dto)
|
|
83
|
-
.filter(key => emptyKeys.indexOf(key) === -1)
|
|
84
|
-
.forEach((key) => model.$this[key] = dto[key]);
|
|
85
|
-
return model;
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* This method will instantiate a new JobModel. The difference with this
|
|
89
|
-
* method of instantiation is that we are coming from a relation frame i.e.
|
|
90
|
-
* the job has a list of {@link VasFieldDto} instead of a Job document.
|
|
91
|
-
*
|
|
92
|
-
*/
|
|
93
|
-
static fromRelational(dto, form) {
|
|
94
|
-
const model = new VasJobModel(dto.id || '', dto.created || '', dto.serverCreated || '', dto.createdBy || '', dto.modified || '', dto.serverModified || '', dto.modifiedBy || '', dto.createdByName || '', dto.modifiedByName || '', dto.account || '', dto.accessGroup || '', dto.reference || '', dto.jobDate || '', dto.jobStatus || '', dto.jobType || '', dto.assigneeId || '', dto.formId || '', dto.timeZoneOffset || moment().utcOffset(), dto.pendingFields || 0, dto.childModified || '', dto.version || 0, dto.createdByDisplayName || '', dto.modifiedByDisplayName || '', dto.geoLocation || getEmptyGeoLocation(), dto.files || [], dto.fields || [], dto.jobEmails || [], dto.notes || [], dto.reports || [], dto.tasks || [], dto.instruction || null);
|
|
95
|
-
form.groups
|
|
96
|
-
.forEach(group => {
|
|
97
|
-
group.controls
|
|
98
|
-
.forEach(control => {
|
|
99
|
-
const field = dto.fields?.find(f => f.control === control.id);
|
|
100
|
-
if (!field) {
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
model.getGroup(group.name)[control.name] = field.value;
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
return model;
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* @param {VasFormModel} formModel
|
|
110
|
-
* @return {Record<string, VasFieldDtoValue>}
|
|
111
|
-
*/
|
|
112
|
-
getFields(formModel) {
|
|
113
|
-
const fields = {};
|
|
114
|
-
formModel.groups
|
|
115
|
-
.forEach(group => {
|
|
116
|
-
group.controls.forEach(control => {
|
|
117
|
-
(fields)[control.reportTemplateName] =
|
|
118
|
-
this.getValueByPath([group.name, control.name]) || null;
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
return fields;
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Will return an object whose keys are the names of all fields in the job.
|
|
125
|
-
* This method is similar to `getFields` except that this method will only
|
|
126
|
-
* return values where a value was set, as opposed to `getFields` which will
|
|
127
|
-
* return a value for every control even if no value was set, because it uses
|
|
128
|
-
* the form to drive the logic. Note also this method will return values for
|
|
129
|
-
* any Fields in the fields array.
|
|
130
|
-
* @return {Record<string, VasFieldDtoValue>}
|
|
131
|
-
*/
|
|
132
|
-
getFields2() {
|
|
133
|
-
let fields = {};
|
|
134
|
-
this.dynamicProperties
|
|
135
|
-
.forEach((groupName) => {
|
|
136
|
-
Object
|
|
137
|
-
.keys(this.$this[groupName])
|
|
138
|
-
.forEach(controlName => {
|
|
139
|
-
fields[controlName] =
|
|
140
|
-
this.getValueByPath([groupName, controlName]) || null;
|
|
141
|
-
});
|
|
142
|
-
}, {});
|
|
143
|
-
this.fields.forEach(field => fields[field.controlName] = field.value);
|
|
144
|
-
return fields;
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Returns an object describing how many attachments were added to this job
|
|
148
|
-
* (camera controls and files), and how many have not been uploaded yet.
|
|
149
|
-
*
|
|
150
|
-
* @param formModel instance of {@link VasFormModel} that was used when the
|
|
151
|
-
* job was created
|
|
152
|
-
*/
|
|
153
|
-
getFilesUploadStatus(formModel) {
|
|
154
|
-
const pathsWithValue = formModel
|
|
155
|
-
.getCameraControlPaths()
|
|
156
|
-
.map(path => {
|
|
157
|
-
const value = this.getValueByPath(path);
|
|
158
|
-
if (value && !!value.id) {
|
|
159
|
-
return path;
|
|
160
|
-
}
|
|
161
|
-
return null;
|
|
162
|
-
})
|
|
163
|
-
.filter(path => path !== null ? path : null)
|
|
164
|
-
.filter(isArrayString);
|
|
165
|
-
let total = pathsWithValue.length;
|
|
166
|
-
total += this.files.length;
|
|
167
|
-
// calculate the number of camera images still to upload
|
|
168
|
-
let pending = pathsWithValue
|
|
169
|
-
.map(path => this.getValueByPath(path))
|
|
170
|
-
.map((value) => {
|
|
171
|
-
if (isFileDto(value)) {
|
|
172
|
-
return value.id && value.status !== 'COMPLETE';
|
|
173
|
-
}
|
|
174
|
-
else if (isCameraControlValueV1(value)) {
|
|
175
|
-
// if url is not set, it hasn't been uploaded
|
|
176
|
-
return value.id && !value.url;
|
|
177
|
-
}
|
|
178
|
-
return false;
|
|
179
|
-
})
|
|
180
|
-
.filter(hasUploaded => hasUploaded)
|
|
181
|
-
.length;
|
|
182
|
-
// add total from files that are pending
|
|
183
|
-
pending += this.files
|
|
184
|
-
.filter(value => value.status !== 'COMPLETE')
|
|
185
|
-
.length;
|
|
186
|
-
return {
|
|
187
|
-
pending,
|
|
188
|
-
total
|
|
189
|
-
};
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* This method will return the dynamic property from the JobModel that
|
|
193
|
-
* represent a group (from a form).
|
|
194
|
-
*
|
|
195
|
-
* @param name the name of the group
|
|
196
|
-
* @param init if true (default) and group is not found, initialise an empty
|
|
197
|
-
* group, otherwise throw an error
|
|
198
|
-
*/
|
|
199
|
-
getGroup(name, init = true) {
|
|
200
|
-
let prop;
|
|
201
|
-
if (this.staticProperties.includes(name)) {
|
|
202
|
-
throw Error(`invalid group name ${name}, not a dynamic property`);
|
|
203
|
-
}
|
|
204
|
-
else if (this.$this[name] === undefined) {
|
|
205
|
-
if (init) {
|
|
206
|
-
prop = this.$this[name] = {};
|
|
207
|
-
}
|
|
208
|
-
else {
|
|
209
|
-
throw Error(`invalid group name ${name}, not found`);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
else {
|
|
213
|
-
prop = this.$this[name];
|
|
214
|
-
if (typeof prop !== 'object') {
|
|
215
|
-
throw Error(`invalid group name ${name}, not an object`);
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
return prop;
|
|
219
|
-
}
|
|
220
|
-
/**
|
|
221
|
-
* @param path path segments
|
|
222
|
-
*/
|
|
223
|
-
getValueByPath(path = []) {
|
|
224
|
-
return getValueByPath(path, this.$this);
|
|
225
|
-
}
|
|
226
|
-
/**
|
|
227
|
-
* In order to understand why we need this method it is important to
|
|
228
|
-
* understand that within the system, Jobs can be represented in one of two
|
|
229
|
-
* ways, document and relational.
|
|
230
|
-
*
|
|
231
|
-
* The important distinction is how values submitted by a form are stored.
|
|
232
|
-
*
|
|
233
|
-
* Jobs stored as documents (JSON objects) will store user values, as dynamic
|
|
234
|
-
* properties of the document.
|
|
235
|
-
*
|
|
236
|
-
* Whereas, Jobs stored as relational, will store user values in an array of
|
|
237
|
-
* {@link VasFieldDto} objects.
|
|
238
|
-
*
|
|
239
|
-
* Depending on where we are in the system, either one of these approaches can
|
|
240
|
-
* be more useful than the other.
|
|
241
|
-
*
|
|
242
|
-
* This method, assumes that the JobModel has been instantiated from a
|
|
243
|
-
* document representation, and serves to hydrate the fields array. In order
|
|
244
|
-
* to achieve this, knowledge of the {@link VasFormDto} that created the job
|
|
245
|
-
* is required.
|
|
246
|
-
*
|
|
247
|
-
*
|
|
248
|
-
* Job in document representation
|
|
249
|
-
* {
|
|
250
|
-
* id: <guid>,
|
|
251
|
-
* reference: "something"
|
|
252
|
-
* <other static job properties>...
|
|
253
|
-
* foo: {
|
|
254
|
-
* bar: "value"
|
|
255
|
-
* }
|
|
256
|
-
* }
|
|
257
|
-
*
|
|
258
|
-
* Job in relational representation
|
|
259
|
-
* {
|
|
260
|
-
* id: <guid>,
|
|
261
|
-
* reference: "something"
|
|
262
|
-
* <other static job properties>...
|
|
263
|
-
* <will not have dynamic properties>...
|
|
264
|
-
* fields: [
|
|
265
|
-
* {
|
|
266
|
-
* id: <guid>,
|
|
267
|
-
* <other field properties>,
|
|
268
|
-
* value: "value"
|
|
269
|
-
* }
|
|
270
|
-
* ]
|
|
271
|
-
* }
|
|
272
|
-
*
|
|
273
|
-
*
|
|
274
|
-
* @param formModel the VasFormModel that was used to create the job
|
|
275
|
-
* @param controlFieldIdMap This is used to determine the id each field.
|
|
276
|
-
* Either one will be found in the map, or a new one is generated.
|
|
277
|
-
* @param controlNames if a value is provided, it will be used
|
|
278
|
-
* to filter the fields that are returned.
|
|
279
|
-
* @return {Array<VasFieldDto>}
|
|
280
|
-
*/
|
|
281
|
-
hydrateFields(formModel, controlFieldIdMap = new Map(), controlNames) {
|
|
282
|
-
const fields = [];
|
|
283
|
-
formModel.groups
|
|
284
|
-
.forEach(group => {
|
|
285
|
-
group.controls.forEach(control => {
|
|
286
|
-
if (!control.name.startsWith('fields.')) {
|
|
287
|
-
return;
|
|
288
|
-
}
|
|
289
|
-
if (controlNames && !controlNames.includes(control.name)) {
|
|
290
|
-
return;
|
|
291
|
-
}
|
|
292
|
-
fields.push(VasFieldModel.fromDto({
|
|
293
|
-
// if the controlId exists in the map, use the associated fieldId,
|
|
294
|
-
// otherwise generate a new id for the field.
|
|
295
|
-
id: controlFieldIdMap.get(control.id) || UUID.UUID(),
|
|
296
|
-
account: this.account,
|
|
297
|
-
job: this.id,
|
|
298
|
-
createdBy: this.createdBy,
|
|
299
|
-
created: this.created,
|
|
300
|
-
modifiedBy: this.modifiedBy,
|
|
301
|
-
modified: this.modified,
|
|
302
|
-
control: control.id,
|
|
303
|
-
value: this.getValueByPath([group.name, control.name])
|
|
304
|
-
}));
|
|
305
|
-
});
|
|
306
|
-
});
|
|
307
|
-
this.fields = fields;
|
|
308
|
-
}
|
|
309
|
-
/**
|
|
310
|
-
* A very non sophisticated way to set values in the job via paths
|
|
311
|
-
*
|
|
312
|
-
* For example:
|
|
313
|
-
*
|
|
314
|
-
* setValueByPath('value', ['foo', 'bar']);
|
|
315
|
-
*
|
|
316
|
-
* will make results in job
|
|
317
|
-
* {
|
|
318
|
-
* foo: {
|
|
319
|
-
* bar: 'value'
|
|
320
|
-
* }
|
|
321
|
-
* }
|
|
322
|
-
*
|
|
323
|
-
* @param value the value to set
|
|
324
|
-
* @param path path segments
|
|
325
|
-
*/
|
|
326
|
-
setValueByPath(value, path = []) {
|
|
327
|
-
switch (path.length) {
|
|
328
|
-
case 0: {
|
|
329
|
-
return;
|
|
330
|
-
}
|
|
331
|
-
case 1: {
|
|
332
|
-
this[path[0]] = value;
|
|
333
|
-
return;
|
|
334
|
-
}
|
|
335
|
-
case 2: {
|
|
336
|
-
// eslint-disable-next-line max-len
|
|
337
|
-
this.$this[path[0]][path[1]] = value;
|
|
338
|
-
return;
|
|
339
|
-
}
|
|
340
|
-
case 3: {
|
|
341
|
-
// eslint-disable-next-line max-len
|
|
342
|
-
this.$this[path[0]][path[1]][path[2]] = value;
|
|
343
|
-
return;
|
|
344
|
-
}
|
|
345
|
-
default: {
|
|
346
|
-
throw Error('path has too many segments');
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
/**
|
|
351
|
-
* @param staticOnly if true, will only output values for the static
|
|
352
|
-
* properties in the dto
|
|
353
|
-
*/
|
|
354
|
-
toDto(staticOnly = false) {
|
|
355
|
-
if (staticOnly) {
|
|
356
|
-
return {
|
|
357
|
-
id: this.id,
|
|
358
|
-
created: this.created,
|
|
359
|
-
createdBy: this.createdBy,
|
|
360
|
-
modified: this.modified,
|
|
361
|
-
modifiedBy: this.modifiedBy,
|
|
362
|
-
serverCreated: this.serverCreated,
|
|
363
|
-
serverModified: this.serverModified,
|
|
364
|
-
createdByName: this.createdByName,
|
|
365
|
-
modifiedByName: this.modifiedByName,
|
|
366
|
-
account: this.account,
|
|
367
|
-
accessGroup: this.accessGroup,
|
|
368
|
-
reference: this.reference,
|
|
369
|
-
jobDate: this.jobDate,
|
|
370
|
-
jobStatus: this.jobStatus,
|
|
371
|
-
jobType: this.jobType,
|
|
372
|
-
assigneeId: this.assigneeId,
|
|
373
|
-
formId: this.formId,
|
|
374
|
-
timeZoneOffset: this.timeZoneOffset,
|
|
375
|
-
pendingFields: this.pendingFields,
|
|
376
|
-
childModified: this.childModified,
|
|
377
|
-
version: this.version,
|
|
378
|
-
createdByDisplayName: this.createdByDisplayName,
|
|
379
|
-
modifiedByDisplayName: this.modifiedByDisplayName,
|
|
380
|
-
geoLocation: this.geoLocation,
|
|
381
|
-
files: this.files,
|
|
382
|
-
fields: this.fields,
|
|
383
|
-
jobEmails: this.jobEmails,
|
|
384
|
-
notes: this.notes,
|
|
385
|
-
reports: this.reports,
|
|
386
|
-
tasks: this.tasks,
|
|
387
|
-
instruction: this.instruction
|
|
388
|
-
};
|
|
389
|
-
}
|
|
390
|
-
const dto = {};
|
|
391
|
-
[...this.staticProperties, ...this.dynamicProperties]
|
|
392
|
-
.forEach(prop => dto[prop] = this.$this[prop]);
|
|
393
|
-
return dto;
|
|
394
|
-
}
|
|
395
|
-
/**
|
|
396
|
-
* This method will parse a syntax that allows us to build strings from the
|
|
397
|
-
* values of from the job model. For example if the job model was:
|
|
398
|
-
*
|
|
399
|
-
* {
|
|
400
|
-
* foo: 'bar'
|
|
401
|
-
* }
|
|
402
|
-
*
|
|
403
|
-
* and we pass "i am foo {foo}", the result would be:
|
|
404
|
-
*
|
|
405
|
-
* "i am foo bar"
|
|
406
|
-
*
|
|
407
|
-
* we can also use moment to parse dates, for example if the job model was:
|
|
408
|
-
*
|
|
409
|
-
* {
|
|
410
|
-
* created: "2022-01-01T00:00:00+0000"
|
|
411
|
-
* }
|
|
412
|
-
*
|
|
413
|
-
* and we pass "{created|date:YY-MM-DD}", the result would be:
|
|
414
|
-
*
|
|
415
|
-
* "2022-01-01"
|
|
416
|
-
*
|
|
417
|
-
* @param {string} value a string with the syntax
|
|
418
|
-
* @param {ParseSyntaxOptions} options
|
|
419
|
-
* @return the results of parsing the syntax on this job
|
|
420
|
-
*/
|
|
421
|
-
parseSyntax(value, options = {
|
|
422
|
-
timeZoneOffset: 0
|
|
423
|
-
}) {
|
|
424
|
-
if (!value || typeof value !== 'string') {
|
|
425
|
-
return '';
|
|
426
|
-
}
|
|
427
|
-
const fields = this.getFields2();
|
|
428
|
-
return value.replace(/({[^}]*})/g, (match, token) => {
|
|
429
|
-
const syntax = token.substring(1, token.length - 1);
|
|
430
|
-
let [key, filter] = syntax.split('|');
|
|
431
|
-
key = (key || '').trim();
|
|
432
|
-
filter = (filter || '').trim();
|
|
433
|
-
let filterName, filterArg = '';
|
|
434
|
-
if (filter) {
|
|
435
|
-
const splitIndex = filter.indexOf(':');
|
|
436
|
-
if (splitIndex !== -1) {
|
|
437
|
-
filterName = filter.substring(0, splitIndex);
|
|
438
|
-
filterArg = filter.substring(splitIndex + 1);
|
|
439
|
-
}
|
|
440
|
-
else {
|
|
441
|
-
filterName = filter;
|
|
442
|
-
filterArg = '';
|
|
443
|
-
}
|
|
444
|
-
filterName = (filterName || '').trim();
|
|
445
|
-
filterArg = (filterArg || '').trim();
|
|
446
|
-
}
|
|
447
|
-
const path = key.split('.');
|
|
448
|
-
const objectKey = path.shift() || '';
|
|
449
|
-
let result = '';
|
|
450
|
-
if (objectKey === 'job') {
|
|
451
|
-
result = (this.getValueByPath(path) || '').toString();
|
|
452
|
-
}
|
|
453
|
-
else if (objectKey === 'fields') {
|
|
454
|
-
result = (getValueByPath(['fields.' + path.shift(), ...path], fields) || '').toString();
|
|
455
|
-
}
|
|
456
|
-
else if (objectKey.length) {
|
|
457
|
-
if (options.objects) {
|
|
458
|
-
if (options.objects[objectKey] === undefined) {
|
|
459
|
-
console.debug(`objectKey ${objectKey} is not present in options.object`);
|
|
460
|
-
result = '';
|
|
461
|
-
}
|
|
462
|
-
else {
|
|
463
|
-
result = (getValueByPath(path, options.objects[objectKey]) || '')
|
|
464
|
-
.toString();
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
else {
|
|
468
|
-
console.debug(`objectKey ${objectKey} was used but options.object is not set`);
|
|
469
|
-
return '';
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
else {
|
|
473
|
-
return '';
|
|
474
|
-
}
|
|
475
|
-
if (filterName && result) {
|
|
476
|
-
switch (filterName) {
|
|
477
|
-
case 'date': {
|
|
478
|
-
if (!options.timeZoneOffset) {
|
|
479
|
-
return moment(result).format(filterArg || '');
|
|
480
|
-
}
|
|
481
|
-
else {
|
|
482
|
-
return moment(result)
|
|
483
|
-
.utcOffset(options.timeZoneOffset)
|
|
484
|
-
.format(filterArg || '');
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
default: {
|
|
488
|
-
console.warn('unknown filter %s', filterName);
|
|
489
|
-
}
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
return result;
|
|
493
|
-
}).trim();
|
|
494
|
-
}
|
|
495
|
-
;
|
|
496
|
-
/**
|
|
497
|
-
* @return {object}
|
|
498
|
-
*/
|
|
499
|
-
toApiDto() {
|
|
500
|
-
return {
|
|
501
|
-
...super.toApiDto(),
|
|
502
|
-
reference: this.reference || '~',
|
|
503
|
-
jobDate: this.jobDate || '~',
|
|
504
|
-
jobType: this.jobType || '~',
|
|
505
|
-
accessGroup: this.accessGroup || '~',
|
|
506
|
-
jobStatus: this.jobStatus || '~',
|
|
507
|
-
assigneeId: this.assigneeId || '~',
|
|
508
|
-
timeZoneOffset: this.timeZoneOffset || 0,
|
|
509
|
-
pendingFields: this.pendingFields || 0,
|
|
510
|
-
lastForm: this.formId || '~'
|
|
511
|
-
};
|
|
512
|
-
}
|
|
513
|
-
static toApiPatchDto(item) {
|
|
514
|
-
return only(item, [
|
|
515
|
-
'created',
|
|
516
|
-
'modified',
|
|
517
|
-
'reference',
|
|
518
|
-
'jobDate',
|
|
519
|
-
'jobType',
|
|
520
|
-
'accessGroup',
|
|
521
|
-
'jobStatus',
|
|
522
|
-
'assigneeId',
|
|
523
|
-
'timeZoneOffset',
|
|
524
|
-
'pendingFields',
|
|
525
|
-
'lastForm'
|
|
526
|
-
]);
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFzLWpvYi5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Zhcy1saWIvc3JjL2xpYi9lbnRpdHkvdmFzLWpvYi5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUdsRCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RixPQUFPLEVBQWUsbUJBQW1CLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDNUQsT0FBTyxFQUFFLHNCQUFzQixFQUE4QixNQUFNLGtCQUFrQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBeUJyQzs7R0FFRztBQUNILE1BQU0sT0FBTyxXQUFZLFNBQVEsK0JBQStCO0lBRTlELFlBQ2tCLEVBQVUsRUFDVixPQUFlLEVBQ2YsYUFBcUIsRUFDckIsU0FBaUIsRUFDakIsUUFBZ0IsRUFDaEIsY0FBc0IsRUFDdEIsVUFBa0IsRUFDbEIsYUFBcUIsRUFDckIsY0FBc0IsRUFDdEIsT0FBZSxFQUNmLFdBQW1CLEVBQzVCLFNBQWlCLEVBQ2pCLE9BQWUsRUFDZixTQUFpQixFQUNqQixPQUFlLEVBQ2YsVUFBa0IsRUFDbEIsTUFBYyxFQUNkLGNBQXNCLEVBQ3RCLGFBQXFCLEVBQ3JCLGFBQXFCLEVBQ3JCLE9BQWUsRUFDZixvQkFBNEIsRUFDNUIscUJBQTZCLEVBQzdCLFdBQXdCLEVBQ3hCLEtBQXdCLEVBQ3hCLE1BQTBCLEVBQzFCLFNBQWdDLEVBQ2hDLEtBQXdCLEVBQ3hCLE9BQTRCLEVBQzVCLEtBQXdCLEVBQ3hCLFdBQXFDO1FBRTVDLEtBQUssQ0FDSCxFQUFFLEVBQ0YsT0FBTyxFQUNQLGFBQWEsRUFDYixTQUFTLEVBQ1QsUUFBUSxFQUNSLGNBQWMsRUFDZCxVQUFVLEVBQ1YsYUFBYSxFQUNiLGNBQWMsRUFDZCxPQUFPLEVBQ1AsV0FBVyxDQUNaLENBQUM7UUE1Q2MsT0FBRSxHQUFGLEVBQUUsQ0FBUTtRQUNWLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDZixrQkFBYSxHQUFiLGFBQWEsQ0FBUTtRQUNyQixjQUFTLEdBQVQsU0FBUyxDQUFRO1FBQ2pCLGFBQVEsR0FBUixRQUFRLENBQVE7UUFDaEIsbUJBQWMsR0FBZCxjQUFjLENBQVE7UUFDdEIsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUNsQixrQkFBYSxHQUFiLGFBQWEsQ0FBUTtRQUNyQixtQkFBYyxHQUFkLGNBQWMsQ0FBUTtRQUN0QixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFDNUIsY0FBUyxHQUFULFNBQVMsQ0FBUTtRQUNqQixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsY0FBUyxHQUFULFNBQVMsQ0FBUTtRQUNqQixZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsbUJBQWMsR0FBZCxjQUFjLENBQVE7UUFDdEIsa0JBQWEsR0FBYixhQUFhLENBQVE7UUFDckIsa0JBQWEsR0FBYixhQUFhLENBQVE7UUFDckIsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUNmLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBUTtRQUM1QiwwQkFBcUIsR0FBckIscUJBQXFCLENBQVE7UUFDN0IsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDeEIsV0FBTSxHQUFOLE1BQU0sQ0FBb0I7UUFDMUIsY0FBUyxHQUFULFNBQVMsQ0FBdUI7UUFDaEMsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDeEIsWUFBTyxHQUFQLE9BQU8sQ0FBcUI7UUFDNUIsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFDeEIsZ0JBQVcsR0FBWCxXQUFXLENBQTBCO0lBZTlDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUFJLEtBQUs7UUFDUCxPQUFPLElBQVcsQ0FBQztJQUNyQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxpQkFBaUI7UUFDbkIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1FBQzFDLE9BQU8sTUFBTTthQUNWLG1CQUFtQixDQUFDLElBQUksQ0FBQzthQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxNQUFNLENBQUMsS0FBSztRQUNWLE9BQU8sSUFBSSxXQUFXLENBQ3BCLEVBQUUsRUFDRixFQUFFLEVBQ0YsRUFBRSxFQUNGLEVBQUUsRUFDRixFQUFFLEVBQ0YsRUFBRSxFQUNGLEVBQUUsRUFDRixFQUFFLEVBQ0YsRUFBRSxFQUNGLEVBQUUsRUFDRixFQUFFLEVBQ0YsRUFBRSxFQUNGLEVBQUUsRUFDRixFQUFFLEVBQ0YsRUFBRSxFQUNGLEVBQUUsRUFDRixFQUFFLEVBQ0YsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQ3BCLENBQUMsRUFDRCxFQUFFLEVBQ0YsQ0FBQyxFQUNELEVBQUUsRUFDRixFQUFFLEVBQ0YsbUJBQW1CLEVBQUUsRUFDckIsRUFBRSxFQUNGLEVBQUUsRUFDRixFQUFFLEVBQ0YsRUFBRSxFQUNGLEVBQUUsRUFDRixFQUFFLEVBQ0YsSUFBSSxDQUNMLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxDQUFVLE9BQU8sQ0FBQyxHQUF1QjtRQUM3QyxNQUFNLEtBQUssR0FBRyxJQUFJLFdBQVcsQ0FDM0IsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQ1osR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQ2pCLEdBQUcsQ0FBQyxhQUFhLElBQUksRUFBRSxFQUN2QixHQUFHLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFDbkIsR0FBRyxDQUFDLFFBQVEsSUFBSSxFQUFFLEVBQ2xCLEdBQUcsQ0FBQyxjQUFjLElBQUksRUFBRSxFQUN4QixHQUFHLENBQUMsVUFBVSxJQUFJLEVBQUUsRUFDcEIsR0FBRyxDQUFDLGFBQWEsSUFBSSxFQUFFLEVBQ3ZCLEdBQUcsQ0FBQyxjQUFjLElBQUksRUFBRSxFQUN4QixHQUFHLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFDakIsR0FBRyxDQUFDLFdBQVcsSUFBSSxFQUFFLEVBQ3JCLEdBQUcsQ0FBQyxTQUFTLElBQUksRUFBRSxFQUNuQixHQUFHLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFDakIsR0FBRyxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQ25CLEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRSxFQUNqQixHQUFHLENBQUMsVUFBVSxJQUFJLEVBQUUsRUFDcEIsR0FBRyxDQUFDLE1BQU0sSUFBSyxHQUFXLENBQUMsUUFBUSxJQUFJLEVBQUUsRUFDekMsR0FBRyxDQUFDLGNBQWMsSUFBSSxNQUFNLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFDMUMsR0FBRyxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQ3RCLEdBQUcsQ0FBQyxhQUFhLElBQUksRUFBRSxFQUN2QixHQUFHLENBQUMsT0FBTyxJQUFJLENBQUMsRUFDaEIsR0FBRyxDQUFDLG9CQUFvQixJQUFJLEVBQUUsRUFDOUIsR0FBRyxDQUFDLHFCQUFxQixJQUFJLEVBQUUsRUFDL0IsR0FBRyxDQUFDLFdBQVcsSUFBSSxtQkFBbUIsRUFBRSxFQUN4QyxHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFDZixHQUFHLENBQUMsTUFBTSxJQUFJLEVBQUUsRUFDaEIsR0FBRyxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQ25CLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxFQUNmLEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRSxFQUNqQixHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFDZixHQUFHLENBQUMsV0FBVyxJQUFJLElBQUksQ0FDeEIsQ0FBQztRQUNGLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztRQUN6QyxNQUFNO2FBQ0gsSUFBSSxDQUFDLEdBQUcsQ0FBQzthQUNULE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDNUMsT0FBTyxDQUFDLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FDdkIsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBSSxHQUFtQyxDQUFDLEdBQUcsQ0FBQyxDQUM3RCxDQUFDO1FBQ0osT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsY0FBYyxDQUNuQixHQUF1QixFQUN2QixJQUFnQjtRQUVoQixNQUFNLEtBQUssR0FBRyxJQUFJLFdBQVcsQ0FDM0IsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQ1osR0FBRyxDQUFDLE9BQU8sSUFBSSxFQUFFLEVBQ2pCLEdBQUcsQ0FBQyxhQUFhLElBQUksRUFBRSxFQUN2QixHQUFHLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFDbkIsR0FBRyxDQUFDLFFBQVEsSUFBSSxFQUFFLEVBQ2xCLEdBQUcsQ0FBQyxjQUFjLElBQUksRUFBRSxFQUN4QixHQUFHLENBQUMsVUFBVSxJQUFJLEVBQUUsRUFDcEIsR0FBRyxDQUFDLGFBQWEsSUFBSSxFQUFFLEVBQ3ZCLEdBQUcsQ0FBQyxjQUFjLElBQUksRUFBRSxFQUN4QixHQUFHLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFDakIsR0FBRyxDQUFDLFdBQVcsSUFBSSxFQUFFLEVBQ3JCLEdBQUcsQ0FBQyxTQUFTLElBQUksRUFBRSxFQUNuQixHQUFHLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFDakIsR0FBRyxDQUFDLFNBQVMsSUFBSSxFQUFFLEVBQ25CLEdBQUcsQ0FBQyxPQUFPLElBQUksRUFBRSxFQUNqQixHQUFHLENBQUMsVUFBVSxJQUFJLEVBQUUsRUFDcEIsR0FBRyxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQ2hCLEdBQUcsQ0FBQyxjQUFjLElBQUksTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLEVBQzFDLEdBQUcsQ0FBQyxhQUFhLElBQUksQ0FBQyxFQUN0QixHQUFHLENBQUMsYUFBYSxJQUFJLEVBQUUsRUFDdkIsR0FBRyxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQ2hCLEdBQUcsQ0FBQyxvQkFBb0IsSUFBSSxFQUFFLEVBQzlCLEdBQUcsQ0FBQyxxQkFBcUIsSUFBSSxFQUFFLEVBQy9CLEdBQUcsQ0FBQyxXQUFXLElBQUksbUJBQW1CLEVBQUUsRUFDeEMsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLEVBQ2YsR0FBRyxDQUFDLE1BQU0sSUFBSSxFQUFFLEVBQ2hCLEdBQUcsQ0FBQyxTQUFTLElBQUksRUFBRSxFQUNuQixHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFDZixHQUFHLENBQUMsT0FBTyxJQUFJLEVBQUUsRUFDakIsR0FBRyxDQUFDLEtBQUssSUFBSSxFQUFFLEVBQ2YsR0FBRyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQ3hCLENBQUM7UUFFRixJQUFJLENBQUMsTUFBTTthQUNSLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNmLEtBQUssQ0FBQyxRQUFRO2lCQUNYLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtnQkFDakIsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxDQUFDLEtBQUssRUFBRTtvQkFDVixPQUFPO2lCQUNSO2dCQUNELEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3pELENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7UUFDTCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7O09BR0c7SUFDSCxTQUFTLENBQUMsU0FBdUI7UUFDL0IsTUFBTSxNQUFNLEdBQXdDLEVBQUUsQ0FBQztRQUN2RCxTQUFTLENBQUMsTUFBTTthQUNiLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNmLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUMvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQztvQkFDbEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO1lBQzVELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSCxVQUFVO1FBQ1IsSUFBSSxNQUFNLEdBQXdDLEVBQUUsQ0FBQztRQUNyRCxJQUFJLENBQUMsaUJBQWlCO2FBQ25CLE9BQU8sQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFO1lBQ3JCLE1BQU07aUJBQ0gsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7aUJBQzNCLE9BQU8sQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDckIsTUFBTSxDQUFDLFdBQVcsQ0FBQztvQkFDakIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxXQUFXLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQztZQUMxRCxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNULElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEUsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILG9CQUFvQixDQUNsQixTQUF1QjtRQUd2QixNQUFNLGNBQWMsR0FBeUIsU0FBUzthQUNuRCxxQkFBcUIsRUFBRTthQUN2QixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDVixNQUFNLEtBQUssR0FDVCxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBUSxDQUFDO1lBQ25DLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFO2dCQUN2QixPQUFPLElBQUksQ0FBQzthQUNiO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUM7YUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzthQUMzQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFekIsSUFBSSxLQUFLLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQztRQUVsQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFFM0Isd0RBQXdEO1FBQ3hELElBQUksT0FBTyxHQUFHLGNBQWM7YUFDekIsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQVEsQ0FBQzthQUM3QyxHQUFHLENBQUMsQ0FBQyxLQUE4QyxFQUFFLEVBQUU7WUFDdEQsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3BCLE9BQU8sS0FBSyxDQUFDLEVBQUUsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQzthQUNoRDtpQkFBTSxJQUFJLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUN4Qyw2Q0FBNkM7Z0JBQzdDLE9BQU8sS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7YUFDL0I7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQzthQUNELE1BQU0sQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQzthQUNsQyxNQUFNLENBQUM7UUFFVix3Q0FBd0M7UUFDeEMsT0FBTyxJQUFJLElBQUksQ0FBQyxLQUFLO2FBQ2xCLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDO2FBQzVDLE1BQU0sQ0FBQztRQUVWLE9BQU87WUFDTCxPQUFPO1lBQ1AsS0FBSztTQUNOLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNILFFBQVEsQ0FBQyxJQUFZLEVBQUUsSUFBSSxHQUFHLElBQUk7UUFDaEMsSUFBSSxJQUFJLENBQUM7UUFDVCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDeEMsTUFBTSxLQUFLLENBQUMsc0JBQXNCLElBQUksMEJBQTBCLENBQUMsQ0FBQztTQUNuRTthQUFNLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDekMsSUFBSSxJQUFJLEVBQUU7Z0JBQ1IsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQzlCO2lCQUFNO2dCQUNMLE1BQU0sS0FBSyxDQUFDLHNCQUFzQixJQUFJLGFBQWEsQ0FBQyxDQUFDO2FBQ3REO1NBQ0Y7YUFBTTtZQUNMLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hCLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO2dCQUM1QixNQUFNLEtBQUssQ0FBQyxzQkFBc0IsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDO2FBQzFEO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWMsQ0FDWixPQUFpQixFQUFFO1FBRW5CLE9BQU8sY0FBYyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FzREc7SUFDSCxhQUFhLENBQ1gsU0FBdUIsRUFDdkIsb0JBQXlDLElBQUksR0FBRyxFQUFrQixFQUNsRSxZQUE0QjtRQUU1QixNQUFNLE1BQU0sR0FBdUIsRUFBRSxDQUFDO1FBQ3RDLFNBQVMsQ0FBQyxNQUFNO2FBQ2IsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2YsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBRS9CLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRTtvQkFDdkMsT0FBTztpQkFDUjtnQkFFRCxJQUFJLFlBQVksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUN4RCxPQUFPO2lCQUNSO2dCQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQztvQkFDaEMsa0VBQWtFO29CQUNsRSw2Q0FBNkM7b0JBQzdDLEVBQUUsRUFBRSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQ3BELE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztvQkFDckIsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFO29CQUNaLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztvQkFDekIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO29CQUNyQixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7b0JBQzNCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtvQkFDdkIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFO29CQUNuQixLQUFLLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FDeEIsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FDM0I7aUJBQ0YsQ0FBQyxDQUFDLENBQUM7WUFDTixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0gsY0FBYyxDQUFDLEtBQXVCLEVBQUUsT0FBaUIsRUFBRTtRQUN6RCxRQUFRLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDbkIsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDTixPQUFPO2FBQ1I7WUFDRCxLQUFLLENBQUMsQ0FBQyxDQUFDO2dCQUNMLElBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQy9CLE9BQU87YUFDUjtZQUNELEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ04sbUNBQW1DO2dCQUNsQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBc0MsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQzNFLE9BQU87YUFDUjtZQUNELEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQ04sbUNBQW1DO2dCQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBc0MsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQXNDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO2dCQUMxSCxPQUFPO2FBQ1I7WUFDRCxPQUFPLENBQUMsQ0FBQztnQkFDUCxNQUFNLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO2FBQzNDO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLFVBQVUsR0FBRyxLQUFLO1FBRTdCLElBQUksVUFBVSxFQUFFO1lBQ2QsT0FBTztnQkFDTCxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ1gsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2dCQUNyQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3pCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtnQkFDdkIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO2dCQUMzQixhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7Z0JBQ2pDLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYztnQkFDbkMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO2dCQUNqQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7Z0JBQ25DLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDckIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUM3QixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7Z0JBQ3pCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztnQkFDckIsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO2dCQUN6QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87Z0JBQ3JCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDM0IsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNO2dCQUNuQixjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7Z0JBQ25DLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtnQkFDakMsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO2dCQUNqQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87Z0JBQ3JCLG9CQUFvQixFQUFFLElBQUksQ0FBQyxvQkFBb0I7Z0JBQy9DLHFCQUFxQixFQUFFLElBQUksQ0FBQyxxQkFBcUI7Z0JBQ2pELFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDN0IsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNqQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07Z0JBQ25CLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztnQkFDekIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNqQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87Z0JBQ3JCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDakIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO2FBQzlCLENBQUM7U0FDSDtRQUVELE1BQU0sR0FBRyxHQUFHLEVBQWlDLENBQUM7UUFDOUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQzthQUNsRCxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBRWpELE9BQU8sR0FBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXlCRztJQUNILFdBQVcsQ0FDVCxLQUFhLEVBQ2IsVUFBOEI7UUFDNUIsY0FBYyxFQUFFLENBQUM7S0FDbEI7UUFHRCxJQUFJLENBQUMsS0FBSyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUN2QyxPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxLQUFhLEVBQUUsS0FBYSxFQUFFLEVBQUU7WUFDbEUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUVwRCxJQUFJLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdEMsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3pCLE1BQU0sR0FBRyxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUUvQixJQUFJLFVBQVUsRUFBRSxTQUFTLEdBQVcsRUFBRSxDQUFDO1lBQ3ZDLElBQUksTUFBTSxFQUFFO2dCQUNWLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksVUFBVSxLQUFLLENBQUMsQ0FBQyxFQUFFO29CQUNyQixVQUFVLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7b0JBQzdDLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQztpQkFDOUM7cUJBQU07b0JBQ0wsVUFBVSxHQUFHLE1BQU0sQ0FBQztvQkFDcEIsU0FBUyxHQUFHLEVBQUUsQ0FBQztpQkFDaEI7Z0JBQ0QsVUFBVSxHQUFHLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN2QyxTQUFTLEdBQUcsQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7YUFDdEM7WUFDRCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzVCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDckMsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1lBQ2hCLElBQUksU0FBUyxLQUFLLEtBQUssRUFBRTtnQkFDdkIsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQzthQUN2RDtpQkFBTSxJQUFJLFNBQVMsS0FBSyxRQUFRLEVBQUU7Z0JBQ2pDLE1BQU0sR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQzthQUN6RjtpQkFBTSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEVBQUU7Z0JBQzNCLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtvQkFDbkIsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxLQUFLLFNBQVMsRUFBRTt3QkFDNUMsT0FBTyxDQUFDLEtBQUssQ0FDWCxhQUFhLFNBQVMsbUNBQW1DLENBQzFELENBQUM7d0JBQ0YsTUFBTSxHQUFHLEVBQUUsQ0FBQztxQkFDYjt5QkFBTTt3QkFDTCxNQUFNLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7NkJBQzlELFFBQVEsRUFBRSxDQUFDO3FCQUNmO2lCQUNGO3FCQUFNO29CQUNMLE9BQU8sQ0FBQyxLQUFLLENBQ1gsYUFBYSxTQUFTLHlDQUF5QyxDQUNoRSxDQUFDO29CQUNGLE9BQU8sRUFBRSxDQUFDO2lCQUNYO2FBQ0Y7aUJBQU07Z0JBQ0wsT0FBTyxFQUFFLENBQUM7YUFDWDtZQUdELElBQUksVUFBVSxJQUFJLE1BQU0sRUFBRTtnQkFDeEIsUUFBUSxVQUFVLEVBQUU7b0JBQ2xCLEtBQUssTUFBTSxDQUFDLENBQUM7d0JBQ1gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUU7NEJBQzNCLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUM7eUJBQy9DOzZCQUFNOzRCQUNMLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztpQ0FDbEIsU0FBUyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUM7aUNBQ2pDLE1BQU0sQ0FBQyxTQUFTLElBQUksRUFBRSxDQUFDLENBQUM7eUJBQzVCO3FCQUNGO29CQUNELE9BQU8sQ0FBQyxDQUFDO3dCQUNQLE9BQU8sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxDQUFDLENBQUM7cUJBQy9DO2lCQUNGO2FBQ0Y7WUFFRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFBQSxDQUFDO0lBRUY7O09BRUc7SUFDTSxRQUFRO1FBQ2YsT0FBTztZQUNMLEdBQUcsS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUNuQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsSUFBSSxHQUFHO1lBQ2hDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxJQUFJLEdBQUc7WUFDNUIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLElBQUksR0FBRztZQUM1QixXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsSUFBSSxHQUFHO1lBQ3BDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxJQUFJLEdBQUc7WUFDaEMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksR0FBRztZQUNsQyxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDO1lBQ3hDLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUM7WUFDdEMsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLElBQUksR0FBRztTQUM3QixDQUFDO0lBQ0osQ0FBQztJQUVNLE1BQU0sQ0FBQyxhQUFhLENBQ3pCLElBQXdCO1FBRXhCLE9BQU8sSUFBSSxDQUNULElBQUksRUFDSjtZQUNFLFNBQVM7WUFDVCxVQUFVO1lBQ1YsV0FBVztZQUNYLFNBQVM7WUFDVCxTQUFTO1lBQ1QsYUFBYTtZQUNiLFdBQVc7WUFDWCxZQUFZO1lBQ1osZ0JBQWdCO1lBQ2hCLGVBQWU7WUFDZixVQUFVO1NBQ1gsQ0FDRixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNGaWxlRHRvLCBWYXNGaWxlRHRvIH0gZnJvbSAnLi92YXMtZmlsZS5kdG8nO1xuaW1wb3J0IHsgVVVJRCB9IGZyb20gJ2FuZ3VsYXIyLXV1aWQnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgZ2V0VmFsdWVCeVBhdGggfSBmcm9tICcuLi91dGlscy9nZXQtdmFsdWUtYnktcGF0aCc7XG5pbXBvcnQgeyBWYXNCYXNlRHRvIH0gZnJvbSAnLi92YXMtYmFzZS5kdG8nO1xuaW1wb3J0IHsgVmFzRmllbGREdG8sIFZhc0ZpZWxkRHRvVmFsdWUgfSBmcm9tICcuL3Zhcy1maWVsZC5kdG8nO1xuaW1wb3J0IHsgVmFzRmllbGRNb2RlbCB9IGZyb20gJy4vdmFzLWZpZWxkLm1vZGVsJztcbmltcG9ydCB7IFZhc0Zvcm1Nb2RlbCB9IGZyb20gJy4vdmFzLWZvcm0ubW9kZWwnO1xuaW1wb3J0IHsgVmFzSm9iRHRvIH0gZnJvbSAnLi92YXMtam9iLmR0byc7XG5pbXBvcnQgeyBWYXNSZXN0cmljdGVkQWNjb3VudE9iamVjdE1vZGVsIH0gZnJvbSAnLi92YXMtcmVzdHJpY3RlZC1hY2NvdW50LW9iamVjdC5tb2RlbCc7XG5pbXBvcnQgeyBHZW9Mb2NhdGlvbiwgZ2V0RW1wdHlHZW9Mb2NhdGlvbiB9IGZyb20gJy4uL21vZGVsJztcbmltcG9ydCB7IGlzQ2FtZXJhQ29udHJvbFZhbHVlVjEsIFZhc0NhbWVyYUNvbnRyb2xWYWx1ZU1vZGVsIH0gZnJvbSAnLi4vY29udHJvbC12YWx1ZSc7XG5pbXBvcnQgeyBpc0FycmF5U3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvaXMtYXJyYXktc3RyaW5nJztcbmltcG9ydCB7IFZhc0Zvcm1EdG8gfSBmcm9tICcuL3Zhcy1mb3JtLmR0byc7XG5pbXBvcnQgeyBvbmx5IH0gZnJvbSAnLi4vdXRpbHMvb25seSc7XG5pbXBvcnQgeyBWYXNSZXBvcnREdG8gfSBmcm9tICcuL3Zhcy1yZXBvcnQuZHRvJztcbmltcG9ydCB7IFZhc1Rhc2tEdG8gfSBmcm9tICcuL3Zhcy10YXNrLmR0byc7XG5pbXBvcnQgeyBWYXNOb3RlRHRvIH0gZnJvbSAnLi92YXMtbm90ZS5kdG8nO1xuaW1wb3J0IHsgVmFzSm9iRW1haWxEdG8gfSBmcm9tICcuL3Zhcy1qb2ItZW1haWwuZHRvJztcbmltcG9ydCB7IFZhc0luc3RydWN0aW9uRHRvIH0gZnJvbSAnLi92YXMtaW5zdHJ1Y3Rpb24uZHRvJztcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFZhc0pvYk1vZGVsRHluYW1pY0ludGVyZmFjZSB7XG4gIFtzOiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBSZWNvcmQ8c3RyaW5nLCBWYXNGaWVsZER0b1ZhbHVlPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZVN5bnRheE9wdGlvbnMge1xuICAvLyBUaGlzIHZhbHVlIHdpbGwgYmUgdXNlZCB0byBhZGp1c3QgYW55IGRhdGV0aW1lIHZhbHVlcyB0aGF0IGFyZSByZWZlcmVuY2VkXG4gIC8vIGluIHRoZSBzeW50YXggc3RyaW5nLiBTZWVcbiAgLy8gaHR0cHM6Ly9tb21lbnRqc2NvbS5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvbW9tZW50LzAzLW1hbmlwdWxhdGluZy8wOS11dGMtb2Zmc2V0L1xuICAvLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgYG1vbWVudGAgd2lsbCBoYW5kbGUgdGhlIHZhbHVlLlxuICB0aW1lWm9uZU9mZnNldDogbnVtYmVyLFxuICAvLyB0aGlzIGRpY3Rpb25hcnkgY2FuIGJlIHBhc3NlZCBpbiB0byBjb250YWluIG90aGVyIG9iamVjdHMgdG8gYmUgcmVmZXJlbmNlZFxuICAvLyBpbiB0aGUgc3ludGF4LiBGb3IgZXhhbXBsZSBpZiB3ZSBoYXZlIHtqb2IuZm9vfSB0aGlzIHdpbGwgcmVmZXJlbmNlIHRoZVxuICAvLyBqb2IncyBgZm9vYCBwcm9wZXJ0eSwgaG93ZXZlciBpZiB3ZSBoYXZlIFwicmVwb3J0TGF5b3V0LnRpdGxlXCIgdGhpcyB3aWxsXG4gIC8vIGV4cGVjdCB0byBmaW5kIGEgcHJvcGVydHkgb2YgYG9iamVjdHNgIGNhbGxlZCBgcmVwb3J0TGF5b3V0YCB3aGljaCB3aWxsXG4gIC8vIGhhdmUgYSBwcm9wZXJ0eSBjYWxsZWQgYHRpdGxlYFxuICBvYmplY3RzPzogUmVjb3JkPHN0cmluZywgUGFydGlhbDxWYXNCYXNlRHRvPiB8IFJlY29yZDxzdHJpbmcsIFZhc0ZpZWxkRHRvVmFsdWU+Pjtcbn1cblxuLyoqXG4gKiBKb2JNb2RlbFxuICovXG5leHBvcnQgY2xhc3MgVmFzSm9iTW9kZWwgZXh0ZW5kcyBWYXNSZXN0cmljdGVkQWNjb3VudE9iamVjdE1vZGVsIHtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgb3ZlcnJpZGUgaWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgb3ZlcnJpZGUgY3JlYXRlZDogc3RyaW5nLFxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJ2ZXJDcmVhdGVkOiBzdHJpbmcsXG4gICAgcHVibGljIG92ZXJyaWRlIGNyZWF0ZWRCeTogc3RyaW5nLFxuICAgIHB1YmxpYyBvdmVycmlkZSBtb2RpZmllZDogc3RyaW5nLFxuICAgIHB1YmxpYyBvdmVycmlkZSBzZXJ2ZXJNb2RpZmllZDogc3RyaW5nLFxuICAgIHB1YmxpYyBvdmVycmlkZSBtb2RpZmllZEJ5OiBzdHJpbmcsXG4gICAgcHVibGljIG92ZXJyaWRlIGNyZWF0ZWRCeU5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgb3ZlcnJpZGUgbW9kaWZpZWRCeU5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgb3ZlcnJpZGUgYWNjb3VudDogc3RyaW5nLFxuICAgIHB1YmxpYyBvdmVycmlkZSBhY2Nlc3NHcm91cDogc3RyaW5nLFxuICAgIHB1YmxpYyByZWZlcmVuY2U6IHN0cmluZyxcbiAgICBwdWJsaWMgam9iRGF0ZTogc3RyaW5nLFxuICAgIHB1YmxpYyBqb2JTdGF0dXM6IHN0cmluZyxcbiAgICBwdWJsaWMgam9iVHlwZTogc3RyaW5nLFxuICAgIHB1YmxpYyBhc3NpZ25lZUlkOiBzdHJpbmcsXG4gICAgcHVibGljIGZvcm1JZDogc3RyaW5nLFxuICAgIHB1YmxpYyB0aW1lWm9uZU9mZnNldDogbnVtYmVyLFxuICAgIHB1YmxpYyBwZW5kaW5nRmllbGRzOiBudW1iZXIsXG4gICAgcHVibGljIGNoaWxkTW9kaWZpZWQ6IHN0cmluZyxcbiAgICBwdWJsaWMgdmVyc2lvbjogbnVtYmVyLFxuICAgIHB1YmxpYyBjcmVhdGVkQnlEaXNwbGF5TmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyBtb2RpZmllZEJ5RGlzcGxheU5hbWU6IHN0cmluZyxcbiAgICBwdWJsaWMgZ2VvTG9jYXRpb246IEdlb0xvY2F0aW9uLFxuICAgIHB1YmxpYyBmaWxlczogQXJyYXk8VmFzRmlsZUR0bz4sXG4gICAgcHVibGljIGZpZWxkczogQXJyYXk8VmFzRmllbGREdG8+LFxuICAgIHB1YmxpYyBqb2JFbWFpbHM6IEFycmF5PFZhc0pvYkVtYWlsRHRvPixcbiAgICBwdWJsaWMgbm90ZXM6IEFycmF5PFZhc05vdGVEdG8+LFxuICAgIHB1YmxpYyByZXBvcnRzOiBBcnJheTxWYXNSZXBvcnREdG8+LFxuICAgIHB1YmxpYyB0YXNrczogQXJyYXk8VmFzVGFza0R0bz4sXG4gICAgcHVibGljIGluc3RydWN0aW9uOiBWYXNJbnN0cnVjdGlvbkR0byB8IG51bGxcbiAgKSB7XG4gICAgc3VwZXIoXG4gICAgICBpZCxcbiAgICAgIGNyZWF0ZWQsXG4gICAgICBzZXJ2ZXJDcmVhdGVkLFxuICAgICAgY3JlYXRlZEJ5LFxuICAgICAgbW9kaWZpZWQsXG4gICAgICBzZXJ2ZXJNb2RpZmllZCxcbiAgICAgIG1vZGlmaWVkQnksXG4gICAgICBjcmVhdGVkQnlOYW1lLFxuICAgICAgbW9kaWZpZWRCeU5hbWUsXG4gICAgICBhY2NvdW50LFxuICAgICAgYWNjZXNzR3JvdXBcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhpcyB3aXRoIHRoZSBkeW5hbWljIGludGVyZmFjZVxuICAgKiBAcmV0dXJuIHtWYXNKb2JNb2RlbER5bmFtaWNJbnRlcmZhY2V9XG4gICAqL1xuICBnZXQgJHRoaXMoKTogVmFzSm9iTW9kZWxEeW5hbWljSW50ZXJmYWNlIHtcbiAgICByZXR1cm4gdGhpcyBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgSm9iIGR5bmFtaWMgcHJvcGVydGllcyBpLmUuIHRob3NlIHRoYXQgYXJlIGFkZGVkIGJ5IHRoZVxuICAgKiBkeW5hbWljIGZvcm1zXG4gICAqL1xuICBnZXQgZHluYW1pY1Byb3BlcnRpZXMoKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgY29uc3QgbmF0aXZlUHJvcHMgPSB0aGlzLnN0YXRpY1Byb3BlcnRpZXM7XG4gICAgcmV0dXJuIE9iamVjdFxuICAgICAgLmdldE93blByb3BlcnR5TmFtZXModGhpcylcbiAgICAgIC5maWx0ZXIocHJvcCA9PiAhbmF0aXZlUHJvcHMuaW5jbHVkZXMocHJvcCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgcHJvcGVydGllcyBvZiB0aGUgSm9iIHR5cGVcbiAgICovXG4gIGdldCBzdGF0aWNQcm9wZXJ0aWVzKCk6IEFycmF5PHN0cmluZz4ge1xuICAgIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhWYXNKb2JNb2RlbC5lbXB0eSgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJuIHtWYXNKb2JNb2RlbH1cbiAgICovXG4gIHN0YXRpYyBlbXB0eSgpOiBWYXNKb2JNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBWYXNKb2JNb2RlbChcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgJycsXG4gICAgICBtb21lbnQoKS51dGNPZmZzZXQoKSxcbiAgICAgIDAsXG4gICAgICAnJyxcbiAgICAgIDAsXG4gICAgICAnJyxcbiAgICAgICcnLFxuICAgICAgZ2V0RW1wdHlHZW9Mb2NhdGlvbigpLFxuICAgICAgW10sXG4gICAgICBbXSxcbiAgICAgIFtdLFxuICAgICAgW10sXG4gICAgICBbXSxcbiAgICAgIFtdLFxuICAgICAgbnVsbFxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgb3ZlcnJpZGUgZnJvbUR0byhkdG86IFBhcnRpYWw8VmFzSm9iRHRvPik6IFZhc0pvYk1vZGVsIHtcbiAgICBjb25zdCBtb2RlbCA9IG5ldyBWYXNKb2JNb2RlbChcbiAgICAgIGR0by5pZCB8fCAnJyxcbiAgICAgIGR0by5jcmVhdGVkIHx8ICcnLFxuICAgICAgZHRvLnNlcnZlckNyZWF0ZWQgfHwgJycsXG4gICAgICBkdG8uY3JlYXRlZEJ5IHx8ICcnLFxuICAgICAgZHRvLm1vZGlmaWVkIHx8ICcnLFxuICAgICAgZHRvLnNlcnZlck1vZGlmaWVkIHx8ICcnLFxuICAgICAgZHRvLm1vZGlmaWVkQnkgfHwgJycsXG4gICAgICBkdG8uY3JlYXRlZEJ5TmFtZSB8fCAnJyxcbiAgICAgIGR0by5tb2RpZmllZEJ5TmFtZSB8fCAnJyxcbiAgICAgIGR0by5hY2NvdW50IHx8ICcnLFxuICAgICAgZHRvLmFjY2Vzc0dyb3VwIHx8ICcnLFxuICAgICAgZHRvLnJlZmVyZW5jZSB8fCAnJyxcbiAgICAgIGR0by5qb2JEYXRlIHx8ICcnLFxuICAgICAgZHRvLmpvYlN0YXR1cyB8fCAnJyxcbiAgICAgIGR0by5qb2JUeXBlIHx8ICcnLFxuICAgICAgZHRvLmFzc2lnbmVlSWQgfHwgJycsXG4gICAgICBkdG8uZm9ybUlkIHx8IChkdG8gYXMgYW55KS5sYXN0Rm9ybSB8fCAnJyxcbiAgICAgIGR0by50aW1lWm9uZU9mZnNldCB8fCBtb21lbnQoKS51dGNPZmZzZXQoKSxcbiAgICAgIGR0by5wZW5kaW5nRmllbGRzIHx8IDAsXG4gICAgICBkdG8uY2hpbGRNb2RpZmllZCB8fCAnJyxcbiAgICAgIGR0by52ZXJzaW9uIHx8IDAsXG4gICAgICBkdG8uY3JlYXRlZEJ5RGlzcGxheU5hbWUgfHwgJycsXG4gICAgICBkdG8ubW9kaWZpZWRCeURpc3BsYXlOYW1lIHx8ICcnLFxuICAgICAgZHRvLmdlb0xvY2F0aW9uIHx8IGdldEVtcHR5R2VvTG9jYXRpb24oKSxcbiAgICAgIGR0by5maWxlcyB8fCBbXSxcbiAgICAgIGR0by5maWVsZHMgfHwgW10sXG4gICAgICBkdG8uam9iRW1haWxzIHx8IFtdLFxuICAgICAgZHRvLm5vdGVzIHx8IFtdLFxuICAgICAgZHRvLnJlcG9ydHMgfHwgW10sXG4gICAgICBkdG8udGFza3MgfHwgW10sXG4gICAgICBkdG8uaW5zdHJ1Y3Rpb24gfHwgbnVsbFxuICAgICk7XG4gICAgY29uc3QgZW1wdHlLZXlzID0gbW9kZWwuc3RhdGljUHJvcGVydGllcztcbiAgICBPYmplY3RcbiAgICAgIC5rZXlzKGR0bylcbiAgICAgIC5maWx0ZXIoa2V5ID0+IGVtcHR5S2V5cy5pbmRleE9mKGtleSkgPT09IC0xKVxuICAgICAgLmZvckVhY2goKGtleTogc3RyaW5nKSA9PlxuICAgICAgICBtb2RlbC4kdGhpc1trZXldID0gKGR0byBhcyBWYXNKb2JNb2RlbER5bmFtaWNJbnRlcmZhY2UpW2tleV1cbiAgICAgICk7XG4gICAgcmV0dXJuIG1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgaW5zdGFudGlhdGUgYSBuZXcgSm9iTW9kZWwuIFRoZSBkaWZmZXJlbmNlIHdpdGggdGhpc1xuICAgKiBtZXRob2Qgb2YgaW5zdGFudGlhdGlvbiBpcyB0aGF0IHdlIGFyZSBjb21pbmcgZnJvbSBhIHJlbGF0aW9uIGZyYW1lIGkuZS5cbiAgICogdGhlIGpvYiBoYXMgYSBsaXN0IG9mIHtAbGluayBWYXNGaWVsZER0b30gaW5zdGVhZCBvZiBhIEpvYiBkb2N1bWVudC5cbiAgICpcbiAgICovXG4gIHN0YXRpYyBmcm9tUmVsYXRpb25hbChcbiAgICBkdG86IFBhcnRpYWw8VmFzSm9iRHRvPixcbiAgICBmb3JtOiBWYXNGb3JtRHRvXG4gICk6IFZhc0pvYk1vZGVsIHtcbiAgICBjb25zdCBtb2RlbCA9IG5ldyBWYXNKb2JNb2RlbChcbiAgICAgIGR0by5pZCB8fCAnJyxcbiAgICAgIGR0by5jcmVhdGVkIHx8ICcnLFxuICAgICAgZHRvLnNlcnZlckNyZWF0ZWQgfHwgJycsXG4gICAgICBkdG8uY3JlYXRlZEJ5IHx8ICcnLFxuICAgICAgZHRvLm1vZGlmaWVkIHx8ICcnLFxuICAgICAgZHRvLnNlcnZlck1vZGlmaWVkIHx8ICcnLFxuICAgICAgZHRvLm1vZGlmaWVkQnkgfHwgJycsXG4gICAgICBkdG8uY3JlYXRlZEJ5TmFtZSB8fCAnJyxcbiAgICAgIGR0by5tb2RpZmllZEJ5TmFtZSB8fCAnJyxcbiAgICAgIGR0by5hY2NvdW50IHx8ICcnLFxuICAgICAgZHRvLmFjY2Vzc0dyb3VwIHx8ICcnLFxuICAgICAgZHRvLnJlZmVyZW5jZSB8fCAnJyxcbiAgICAgIGR0by5qb2JEYXRlIHx8ICcnLFxuICAgICAgZHRvLmpvYlN0YXR1cyB8fCAnJyxcbiAgICAgIGR0by5qb2JUeXBlIHx8ICcnLFxuICAgICAgZHRvLmFzc2lnbmVlSWQgfHwgJycsXG4gICAgICBkdG8uZm9ybUlkIHx8ICcnLFxuICAgICAgZHRvLnRpbWVab25lT2Zmc2V0IHx8IG1vbWVudCgpLnV0Y09mZnNldCgpLFxuICAgICAgZHRvLnBlbmRpbmdGaWVsZHMgfHwgMCxcbiAgICAgIGR0by5jaGlsZE1vZGlmaWVkIHx8ICcnLFxuICAgICAgZHRvLnZlcnNpb24gfHwgMCxcbiAgICAgIGR0by5jcmVhdGVkQnlEaXNwbGF5TmFtZSB8fCAnJyxcbiAgICAgIGR0by5tb2RpZmllZEJ5RGlzcGxheU5hbWUgfHwgJycsXG4gICAgICBkdG8uZ2VvTG9jYXRpb24gfHwgZ2V0RW1wdHlHZW9Mb2NhdGlvbigpLFxuICAgICAgZHRvLmZpbGVzIHx8IFtdLFxuICAgICAgZHRvLmZpZWxkcyB8fCBbXSxcbiAgICAgIGR0by5qb2JFbWFpbHMgfHwgW10sXG4gICAgICBkdG8ubm90ZXMgfHwgW10sXG4gICAgICBkdG8ucmVwb3J0cyB8fCBbXSxcbiAgICAgIGR0by50YXNrcyB8fCBbXSxcbiAgICAgIGR0by5pbnN0cnVjdGlvbiB8fCBudWxsXG4gICAgKTtcblxuICAgIGZvcm0uZ3JvdXBzXG4gICAgICAuZm9yRWFjaChncm91cCA9PiB7XG4gICAgICAgIGdyb3VwLmNvbnRyb2xzXG4gICAgICAgICAgLmZvckVhY2goY29udHJvbCA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWVsZCA9IGR0by5maWVsZHM/LmZpbmQoZiA9PiBmLmNvbnRyb2wgPT09IGNvbnRyb2wuaWQpO1xuICAgICAgICAgICAgaWYgKCFmaWVsZCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtb2RlbC5nZXRHcm91cChncm91cC5uYW1lKVtjb250cm9sLm5hbWVdID0gZmllbGQudmFsdWU7XG4gICAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtWYXNGb3JtTW9kZWx9IGZvcm1Nb2RlbFxuICAgKiBAcmV0dXJuIHtSZWNvcmQ8c3RyaW5nLCBWYXNGaWVsZER0b1ZhbHVlPn1cbiAgICovXG4gIGdldEZpZWxkcyhmb3JtTW9kZWw6IFZhc0Zvcm1Nb2RlbCk6IFJlY29yZDxzdHJpbmcsIFZhc0ZpZWxkRHRvVmFsdWU+IHtcbiAgICBjb25zdCBmaWVsZHM6IHsgW2tleTogc3RyaW5nXTogVmFzRmllbGREdG9WYWx1ZSB9ID0ge307XG4gICAgZm9ybU1vZGVsLmdyb3Vwc1xuICAgICAgLmZvckVhY2goZ3JvdXAgPT4ge1xuICAgICAgICBncm91cC5jb250cm9scy5mb3JFYWNoKGNvbnRyb2wgPT4ge1xuICAgICAgICAgIChmaWVsZHMpW2NvbnRyb2wucmVwb3J0VGVtcGxhdGVOYW1lXSA9XG4gICAgICAgICAgICB0aGlzLmdldFZhbHVlQnlQYXRoKFtncm91cC5uYW1lLCBjb250cm9sLm5hbWVdKSB8fCBudWxsO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIHJldHVybiBmaWVsZHM7XG4gIH1cblxuICAvKipcbiAgICogV2lsbCByZXR1cm4gYW4gb2JqZWN0IHdob3NlIGtleXMgYXJlIHRoZSBuYW1lcyBvZiBhbGwgZmllbGRzIGluIHRoZSBqb2IuXG4gICAqIFRoaXMgbWV0aG9kIGlzIHNpbWlsYXIgdG8gYGdldEZpZWxkc2AgZXhjZXB0IHRoYXQgdGhpcyBtZXRob2Qgd2lsbCBvbmx5XG4gICAqIHJldHVybiB2YWx1ZXMgd2hlcmUgYSB2YWx1ZSB3YXMgc2V0LCBhcyBvcHBvc2VkIHRvIGBnZXRGaWVsZHNgIHdoaWNoIHdpbGxcbiAgICogcmV0dXJuIGEgdmFsdWUgZm9yIGV2ZXJ5IGNvbnRyb2wgZXZlbiBpZiBubyB2YWx1ZSB3YXMgc2V0LCBiZWNhdXNlIGl0IHVzZXNcbiAgICogdGhlIGZvcm0gdG8gZHJpdmUgdGhlIGxvZ2ljLiBOb3RlIGFsc28gdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdmFsdWVzIGZvclxuICAgKiBhbnkgRmllbGRzIGluIHRoZSBmaWVsZHMgYXJyYXkuXG4gICAqIEByZXR1cm4ge1JlY29yZDxzdHJpbmcsIFZhc0ZpZWxkRHRvVmFsdWU+fVxuICAgKi9cbiAgZ2V0RmllbGRzMigpOiBSZWNvcmQ8c3RyaW5nLCBWYXNGaWVsZER0b1ZhbHVlPiB7XG4gICAgbGV0IGZpZWxkczogeyBba2V5OiBzdHJpbmddOiBWYXNGaWVsZER0b1ZhbHVlIH0gPSB7fTtcbiAgICB0aGlzLmR5bmFtaWNQcm9wZXJ0aWVzXG4gICAgICAuZm9yRWFjaCgoZ3JvdXBOYW1lKSA9PiB7XG4gICAgICAgIE9iamVjdFxuICAgICAgICAgIC5rZXlzKHRoaXMuJHRoaXNbZ3JvdXBOYW1lXSlcbiAgICAgICAgICAuZm9yRWFjaChjb250cm9sTmFtZSA9PiB7XG4gICAgICAgICAgICBmaWVsZHNbY29udHJvbE5hbWVdID1cbiAgICAgICAgICAgICAgdGhpcy5nZXRWYWx1ZUJ5UGF0aChbZ3JvdXBOYW1lLCBjb250cm9sTmFtZV0pIHx8IG51bGw7XG4gICAgICAgICAgfSk7XG4gICAgICB9LCB7fSk7XG4gICAgdGhpcy5maWVsZHMuZm9yRWFjaChmaWVsZCA9PiBmaWVsZHNbZmllbGQuY29udHJvbE5hbWVdID0gZmllbGQudmFsdWUpO1xuICAgIHJldHVybiBmaWVsZHM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3QgZGVzY3JpYmluZyBob3cgbWFueSBhdHRhY2htZW50cyB3ZXJlIGFkZGVkIHRvIHRoaXMgam9iXG4gICAqIChjYW1lcmEgY29udHJvbHMgYW5kIGZpbGVzKSwgYW5kIGhvdyBtYW55IGhhdmUgbm90IGJlZW4gdXBsb2FkZWQgeWV0LlxuICAgKlxuICAgKiBAcGFyYW0gZm9ybU1vZGVsIGluc3RhbmNlIG9mIHtAbGluayBWYXNGb3JtTW9kZWx9IHRoYXQgd2FzIHVzZWQgd2hlbiB0aGVcbiAgICogam9iIHdhcyBjcmVhdGVkXG4gICAqL1xuICBnZXRGaWxlc1VwbG9hZFN0YXR1cyhcbiAgICBmb3JtTW9kZWw6IFZhc0Zvcm1Nb2RlbFxuICApOiB7IHBlbmRpbmc6IG51bWJlcjsgdG90YWw6IG51bWJlciB9IHtcblxuICAgIGNvbnN0IHBhdGhzV2l0aFZhbHVlOiBBcnJheTxBcnJheTxzdHJpbmc+PiA9IGZvcm1Nb2RlbFxuICAgICAgLmdldENhbWVyYUNvbnRyb2xQYXRocygpXG4gICAgICAubWFwKHBhdGggPT4ge1xuICAgICAgICBjb25zdCB2YWx1ZTogVmFzRmlsZUR0byB8IFZhc0NhbWVyYUNvbnRyb2xWYWx1ZU1vZGVsID1cbiAgICAgICAgICB0aGlzLmdldFZhbHVlQnlQYXRoKHBhdGgpIGFzIGFueTtcbiAgICAgICAgaWYgKHZhbHVlICYmICEhdmFsdWUuaWQpIHtcbiAgICAgICAgICByZXR1cm4gcGF0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKHBhdGggPT4gcGF0aCAhPT0gbnVsbCA/IHBhdGggOiBudWxsKVxuICAgICAgLmZpbHRlcihpc0FycmF5U3RyaW5nKTtcblxuICAgIGxldCB0b3RhbCA9IHBhdGhzV2l0aFZhbHVlLmxlbmd0aDtcblxuICAgIHRvdGFsICs9IHRoaXMuZmlsZXMubGVuZ3RoO1xuXG4gICAgLy8gY2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgY2FtZXJhIGltYWdlcyBzdGlsbCB0byB1cGxvYWRcbiAgICBsZXQgcGVuZGluZyA9IHBhdGhzV2l0aFZhbHVlXG4gICAgICAubWFwKHBhdGggPT4gdGhpcy5nZXRWYWx1ZUJ5UGF0aChwYXRoKSBhcyBhbnkpXG4gICAgICAubWFwKCh2YWx1ZTogVmFzRmlsZUR0byB8IFZhc0NhbWVyYUNvbnRyb2xWYWx1ZU1vZGVsKSA9PiB7XG4gICAgICAgIGlmIChpc0ZpbGVEdG8odmFsdWUpKSB7XG4gICAgICAgICAgcmV0dXJuIHZhbHVlLmlkICYmIHZhbHVlLnN0YXR1cyAhPT0gJ0NPTVBMRVRFJztcbiAgICAgICAgfSBlbHNlIGlmIChpc0NhbWVyYUNvbnRyb2xWYWx1ZVYxKHZhbHVlKSkge1xuICAgICAgICAgIC8vIGlmIHVybCBpcyBub3Qgc2V0LCBpdCBoYXNuJ3QgYmVlbiB1cGxvYWRlZFxuICAgICAgICAgIHJldHVybiB2YWx1ZS5pZCAmJiAhdmFsdWUudXJsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pXG4gICAgICAuZmlsdGVyKGhhc1VwbG9hZGVkID0+IGhhc1VwbG9hZGVkKVxuICAgICAgLmxlbmd0aDtcblxuICAgIC8vIGFkZCB0b3RhbCBmcm9tIGZpbGVzIHRoYXQgYXJlIHBlbmRpbmdcbiAgICBwZW5kaW5nICs9IHRoaXMuZmlsZXNcbiAgICAgIC5maWx0ZXIodmFsdWUgPT4gdmFsdWUuc3RhdHVzICE9PSAnQ09NUExFVEUnKVxuICAgICAgLmxlbmd0aDtcblxuICAgIHJldHVybiB7XG4gICAgICBwZW5kaW5nLFxuICAgICAgdG90YWxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBkeW5hbWljIHByb3BlcnR5IGZyb20gdGhlIEpvYk1vZGVsIHRoYXRcbiAgICogcmVwcmVzZW50IGEgZ3JvdXAgKGZyb20gYSBmb3JtKS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGdyb3VwXG4gICAqIEBwYXJhbSBpbml0IGlmIHRydWUgKGRlZmF1bHQpIGFuZCBncm91cCBpcyBub3QgZm91bmQsIGluaXRpYWxpc2UgYW4gZW1wdHlcbiAgICogZ3JvdXAsIG90aGVyd2lzZSB0aHJvdyBhbiBlcnJvclxuICAgKi9cbiAgZ2V0R3JvdXAobmFtZTogc3RyaW5nLCBpbml0ID0gdHJ1ZSk6IFJlY29yZDxzdHJpbmcsIFZhc0ZpZWxkRHRvVmFsdWU+IHtcbiAgICBsZXQgcHJvcDtcbiAgICBpZiAodGhpcy5zdGF0aWNQcm9wZXJ0aWVzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICB0aHJvdyBFcnJvcihgaW52YWxpZCBncm91cCBuYW1lICR7bmFtZX0sIG5vdCBhIGR5bmFtaWMgcHJvcGVydHlgKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuJHRoaXNbbmFtZV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKGluaXQpIHtcbiAgICAgICAgcHJvcCA9IHRoaXMuJHRoaXNbbmFtZV0gPSB7fTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IEVycm9yKGBpbnZhbGlkIGdyb3VwIG5hbWUgJHtuYW1lfSwgbm90IGZvdW5kYCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb3AgPSB0aGlzLiR0aGlzW25hbWVdO1xuICAgICAgaWYgKHR5cGVvZiBwcm9wICE9PSAnb2JqZWN0Jykge1xuICAgICAgICB0aHJvdyBFcnJvcihgaW52YWxpZCBncm91cCBuYW1lICR7bmFtZX0sIG5vdCBhbiBvYmplY3RgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHByb3A7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggcGF0aCBzZWdtZW50c1xuICAgKi9cbiAgZ2V0VmFsdWVCeVBhdGg8VCBleHRlbmRzIFZhc0ZpZWxkRHRvVmFsdWU+KFxuICAgIHBhdGg6IHN0cmluZ1tdID0gW11cbiAgKTogVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGdldFZhbHVlQnlQYXRoKHBhdGgsIHRoaXMuJHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluIG9yZGVyIHRvIHVuZGVyc3RhbmQgd2h5IHdlIG5lZWQgdGhpcyBtZXRob2QgaXQgaXMgaW1wb3J0YW50IHRvXG4gICAqIHVuZGVyc3RhbmQgdGhhdCB3aXRoaW4gdGhlIHN5c3RlbSwgSm9icyBjYW4gYmUgcmVwcmVzZW50ZWQgaW4gb25lIG9mIHR3b1xuICAgKiB3YXlzLCBkb2N1bWVudCBhbmQgcmVsYXRpb25hbC5cbiAgICpcbiAgICogVGhlIGltcG9ydGFudCBkaXN0aW5jdGlvbiBpcyBob3cgdmFsdWVzIHN1Ym1pdHRlZCBieSBhIGZvcm0gYXJlIHN0b3JlZC5cbiAgICpcbiAgICogSm9icyBzdG9yZWQgYXMgZG9jdW1lbnRzIChKU09OIG9iamVjdHMpIHdpbGwgc3RvcmUgdXNlciB2YWx1ZXMsIGFzIGR5bmFtaWNcbiAgICogcHJvcGVydGllcyBvZiB0aGUgZG9jdW1lbnQuXG4gICAqXG4gICAqIFdoZXJlYXMsIEpvYnMgc3RvcmVkIGFzIHJlbGF0aW9uYWwsIHdpbGwgc3RvcmUgdXNlciB2YWx1ZXMgaW4gYW4gYXJyYXkgb2ZcbiAgICoge0BsaW5rIFZhc0ZpZWxkRHRvfSBvYmplY3RzLlxuICAgKlxuICAgKiBEZXBlbmRpbmcgb24gd2hlcmUgd2UgYXJlIGluIHRoZSBzeXN0ZW0sIGVpdGhlciBvbmUgb2YgdGhlc2UgYXBwcm9hY2hlcyBjYW5cbiAgICogYmUgbW9yZSB1c2VmdWwgdGhhbiB0aGUgb3RoZXIuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kLCBhc3N1bWVzIHRoYXQgdGhlIEpvYk1vZGVsIGhhcyBiZWVuIGluc3RhbnRpYXRlZCBmcm9tIGFcbiAgICogZG9jdW1lbnQgcmVwcmVzZW50YXRpb24sIGFuZCBzZXJ2ZXMgdG8gaHlkcmF0ZSB0aGUgZmllbGRzIGFycmF5LiBJbiBvcmRlclxuICAgKiB0byBhY2hpZXZlIHRoaXMsIGtub3dsZWRnZSBvZiB0aGUge0BsaW5rIFZhc0Zvcm1EdG99IHRoYXQgY3JlYXRlZCB0aGUgam9iXG4gICAqIGlzIHJlcXVpcmVkLlxuICAgKlxuICAgKlxuICAgKiBKb2IgaW4gZG9jdW1lbnQgcmVwcmVzZW50YXRpb25cbiAgICoge1xuICAgKiAgIGlkOiA8Z3VpZD4sXG4gICAqICAgcmVmZXJlbmNlOiBcInNvbWV0aGluZ1wiXG4gICAqICAgPG90aGVyIHN0YXRpYyBqb2IgcHJvcGVydGllcz4uLi5cbiAgICogICBmb286IHtcbiAgICogICAgIGJhcjogXCJ2YWx1ZVwiXG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIEpvYiBpbiByZWxhdGlvbmFsIHJlcHJlc2VudGF0aW9uXG4gICAqIHtcbiAgICogICBpZDogPGd1aWQ+LFxuICAgKiAgIHJlZmVyZW5jZTogXCJzb21ldGhpbmdcIlxuICAgKiAgIDxvdGhlciBzdGF0aWMgam9iIHByb3BlcnRpZXM+Li4uXG4gICAqICAgPHdpbGwgbm90IGhhdmUgZHluYW1pYyBwcm9wZXJ0aWVzPi4uLlxuICAgKiAgIGZpZWxkczogW1xuICAgKiAgICAge1xuICAgKiAgICAgICBpZDogPGd1aWQ+LFxuICAgKiAgICAgICA8b3RoZXIgZmllbGQgcHJvcGVydGllcz4sXG4gICAqICAgICAgIHZhbHVlOiBcInZhbHVlXCJcbiAgICogICAgIH1cbiAgICogICBdXG4gICAqIH1cbiAgICpcbiAgICpcbiAgICogQHBhcmFtIGZvcm1Nb2RlbCB0aGUgVmFzRm9ybU1vZGVsIHRoYXQgd2FzIHVzZWQgdG8gY3JlYXRlIHRoZSBqb2JcbiAgICogQHBhcmFtIGNvbnRyb2xGaWVsZElkTWFwIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGlkIGVhY2ggZmllbGQuXG4gICAqIEVpdGhlciBvbmUgd2lsbCBiZSBmb3VuZCBpbiB0aGUgbWFwLCBvciBhIG5ldyBvbmUgaXMgZ2VuZXJhdGVkLlxuICAgKiBAcGFyYW0gY29udHJvbE5hbWVzIGlmIGEgdmFsdWUgaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgdXNlZFxuICAgKiB0byBmaWx0ZXIgdGhlIGZpZWxkcyB0aGF0IGFyZSByZXR1cm5lZC5cbiAgICogQHJldHVybiB7QXJyYXk8VmFzRmllbGREdG8+fVxuICAgKi9cbiAgaHlkcmF0ZUZpZWxkcyhcbiAgICBmb3JtTW9kZWw6IFZhc0Zvcm1Nb2RlbCxcbiAgICBjb250cm9sRmllbGRJZE1hcDogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCksXG4gICAgY29udHJvbE5hbWVzPzogQXJyYXk8c3RyaW5nPlxuICApOiB2b2lkIHtcbiAgICBjb25zdCBmaWVsZHM6IEFycmF5PFZhc0ZpZWxkRHRvPiA9IFtdO1xuICAgIGZvcm1Nb2RlbC5ncm91cHNcbiAgICAgIC5mb3JFYWNoKGdyb3VwID0+IHtcbiAgICAgICAgZ3JvdXAuY29udHJvbHMuZm9yRWFjaChjb250cm9sID0+IHtcblxuICAgICAgICAgIGlmICghY29udHJvbC5uYW1lLnN0YXJ0c1dpdGgoJ2ZpZWxkcy4nKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjb250cm9sTmFtZXMgJiYgIWNvbnRyb2xOYW1lcy5pbmNsdWRlcyhjb250cm9sLm5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZmllbGRzLnB1c2goVmFzRmllbGRNb2RlbC5mcm9tRHRvKHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBjb250cm9sSWQgZXhpc3RzIGluIHRoZSBtYXAsIHVzZSB0aGUgYXNzb2NpYXRlZCBmaWVsZElkLFxuICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGdlbmVyYXRlIGEgbmV3IGlkIGZvciB0aGUgZmllbGQuXG4gICAgICAgICAgICBpZDogY29udHJvbEZpZWxkSWRNYXAuZ2V0KGNvbnRyb2wuaWQpIHx8IFVVSUQuVVVJRCgpLFxuICAgICAgICAgICAgYWNjb3VudDogdGhpcy5hY2NvdW50LFxuICAgICAgICAgICAgam9iOiB0aGlzLmlkLFxuICAgICAgICAgICAgY3JlYXRlZEJ5OiB0aGlzLmNyZWF0ZWRCeSxcbiAgICAgICAgICAgIGNyZWF0ZWQ6IHRoaXMuY3JlYXRlZCxcbiAgICAgICAgICAgIG1vZGlmaWVkQnk6IHRoaXMubW9kaWZpZWRCeSxcbiAgICAgICAgICAgIG1vZGlmaWVkOiB0aGlzLm1vZGlmaWVkLFxuICAgICAgICAgICAgY29udHJvbDogY29udHJvbC5pZCxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLmdldFZhbHVlQnlQYXRoKFxuICAgICAgICAgICAgICBbZ3JvdXAubmFtZSwgY29udHJvbC5uYW1lXVxuICAgICAgICAgICAgKVxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB0aGlzLmZpZWxkcyA9IGZpZWxkcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHZlcnkgbm9uIHNvcGhpc3RpY2F0ZWQgd2F5IHRvIHNldCB2YWx1ZXMgaW4gdGhlIGpvYiB2aWEgcGF0aHNcbiAgICpcbiAgICogRm9yIGV4YW1wbGU6XG4gICAqXG4gICAqIHNldFZhbHVlQnlQYXRoKCd2YWx1ZScsIFsnZm9vJywgJ2JhciddKTtcbiAgICpcbiAgICogd2lsbCBtYWtlIHJlc3VsdHMgaW4gam9iXG4gICAqIHtcbiAgICogICBmb286IHtcbiAgICogICAgIGJhcjogJ3ZhbHVlJ1xuICAgKiAgIH1cbiAgICogfVxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIHNldFxuICAgKiBAcGFyYW0gcGF0aCBwYXRoIHNlZ21lbnRzXG4gICAqL1xuICBzZXRWYWx1ZUJ5UGF0aCh2YWx1ZTogVmFzRmllbGREdG9WYWx1ZSwgcGF0aDogc3RyaW5nW10gPSBbXSk6IHZvaWQge1xuICAgIHN3aXRjaCAocGF0aC5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMDoge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlIDE6IHtcbiAgICAgICAgKHRoaXMgYXMgYW55KVtwYXRoWzBdXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlIDI6IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1sZW5cbiAgICAgICAgKHRoaXMuJHRoaXNbcGF0aFswXV0gYXMgUmVjb3JkPHN0cmluZywgVmFzRmllbGREdG9WYWx1ZT4pW3BhdGhbMV1dID0gdmFsdWU7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhc2UgMzoge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LWxlblxuICAgICAgICAoKHRoaXMuJHRoaXNbcGF0aFswXV0gYXMgUmVjb3JkPHN0cmluZywgVmFzRmllbGREdG9WYWx1ZT4pW3BhdGhbMV1dIGFzIFJlY29yZDxzdHJpbmcsIFZhc0ZpZWxkRHRvVmFsdWU+KVtwYXRoWzJdXSA9IHZhbHVlO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEVycm9yKCdwYXRoIGhhcyB0b28gbWFueSBzZWdtZW50cycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gc3RhdGljT25seSBpZiB0cnVlLCB3aWxsIG9ubHkgb3V0cHV0IHZhbHVlcyBmb3IgdGhlIHN0YXRpY1xuICAgKiBwcm9wZXJ0aWVzIGluIHRoZSBkdG9cbiAgICovXG4gIHB1YmxpYyB0b0R0byhzdGF0aWNPbmx5ID0gZmFsc2UpOiBWYXNKb2JEdG8ge1xuXG4gICAgaWYgKHN0YXRpY09ubHkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICBjcmVhdGVkOiB0aGlzLmNyZWF0ZWQsXG4gICAgICAgIGNyZWF0ZWRCeTogdGhpcy5jcmVhdGVkQnksXG4gICAgICAgIG1vZGlmaWVkOiB0aGlzLm1vZGlmaWVkLFxuICAgICAgICBtb2RpZmllZEJ5OiB0aGlzLm1vZGlmaWVkQnksXG4gICAgICAgIHNlcnZlckNyZWF0ZWQ6IHRoaXMuc2VydmVyQ3JlYXRlZCxcbiAgICAgICAgc2VydmVyTW9kaWZpZWQ6IHRoaXMuc2VydmVyTW9kaWZpZWQsXG4gICAgICAgIGNyZWF0ZWRCeU5hbWU6IHRoaXMuY3JlYXRlZEJ5TmFtZSxcbiAgICAgICAgbW9kaWZpZWRCeU5hbWU6IHRoaXMubW9kaWZpZWRCeU5hbWUsXG4gICAgICAgIGFjY291bnQ6IHRoaXMuYWNjb3VudCxcbiAgICAgICAgYWNjZXNzR3JvdXA6IHRoaXMuYWNjZXNzR3JvdXAsXG4gICAgICAgIHJlZmVyZW5jZTogdGhpcy5yZWZlcmVuY2UsXG4gICAgICAgIGpvYkRhdGU6IHRoaXMuam9iRGF0ZSxcbiAgICAgICAgam9iU3RhdHVzOiB0aGlzLmpvYlN0YXR1cyxcbiAgICAgICAgam9iVHlwZTogdGhpcy5qb2JUeXBlLFxuICAgICAgICBhc3NpZ25lZUlkOiB0aGlzLmFzc2lnbmVlSWQsXG4gICAgICAgIGZvcm1JZDogdGhpcy5mb3JtSWQsXG4gICAgICAgIHRpbWVab25lT2Zmc2V0OiB0aGlzLnRpbWVab25lT2Zmc2V0LFxuICAgICAgICBwZW5kaW5nRmllbGRzOiB0aGlzLnBlbmRpbmdGaWVsZHMsXG4gICAgICAgIGNoaWxkTW9kaWZpZWQ6IHRoaXMuY2hpbGRNb2RpZmllZCxcbiAgICAgICAgdmVyc2lvbjogdGhpcy52ZXJzaW9uLFxuICAgICAgICBjcmVhdGVkQnlEaXNwbGF5TmFtZTogdGhpcy5jcmVhdGVkQnlEaXNwbGF5TmFtZSxcbiAgICAgICAgbW9kaWZpZWRCeURpc3BsYXlOYW1lOiB0aGlzLm1vZGlmaWVkQnlEaXNwbGF5TmFtZSxcbiAgICAgICAgZ2VvTG9jYXRpb246IHRoaXMuZ2VvTG9jYXRpb24sXG4gICAgICAgIGZpbGVzOiB0aGlzLmZpbGVzLFxuICAgICAgICBmaWVsZHM6IHRoaXMuZmllbGRzLFxuICAgICAgICBqb2JFbWFpbHM6IHRoaXMuam9iRW1haWxzLFxuICAgICAgICBub3RlczogdGhpcy5ub3RlcyxcbiAgICAgICAgcmVwb3J0czogdGhpcy5yZXBvcnRzLFxuICAgICAgICB0YXNrczogdGhpcy50YXNrcyxcbiAgICAgICAgaW5zdHJ1Y3Rpb246IHRoaXMuaW5zdHJ1Y3Rpb25cbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgZHRvID0ge30gYXMgVmFzSm9iTW9kZWxEeW5hbWljSW50ZXJmYWNlO1xuICAgIFsuLi50aGlzLnN0YXRpY1Byb3BlcnRpZXMsIC4uLnRoaXMuZHluYW1pY1Byb3BlcnRpZXNdXG4gICAgICAuZm9yRWFjaChwcm9wID0+IGR0b1twcm9wXSA9IHRoaXMuJHRoaXNbcHJvcF0pO1xuXG4gICAgcmV0dXJuIGR0byBhcyBhbnk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2Qgd2lsbCBwYXJzZSBhIHN5bnRheCB0aGF0IGFsbG93cyB1cyB0byBidWlsZCBzdHJpbmdzIGZyb20gdGhlXG4gICAqIHZhbHVlcyBvZiBmcm9tIHRoZSBqb2IgbW9kZWwuIEZvciBleGFtcGxlIGlmIHRoZSBqb2IgbW9kZWwgd2FzOlxuICAgKlxuICAgKiB7XG4gICAqICAgZm9vOiAnYmFyJ1xuICAgKiB9XG4gICAqXG4gICAqIGFuZCB3ZSBwYXNzIFwiaSBhbSBmb28ge2Zvb31cIiwgdGhlIHJlc3VsdCB3b3VsZCBiZTpcbiAgICpcbiAgICogXCJpIGFtIGZvbyBiYXJcIlxuICAgKlxuICAgKiB3ZSBjYW4gYWxzbyB1c2UgbW9tZW50IHRvIHBhcnNlIGRhdGVzLCBmb3IgZXhhbXBsZSBpZiB0aGUgam9iIG1vZGVsIHdhczpcbiAgICpcbiAgICoge1xuICAgKiAgIGNyZWF0ZWQ6IFwiMjAyMi0wMS0wMVQwMDowMDowMCswMDAwXCJcbiAgICogfVxuICAgKlxuICAgKiBhbmQgd2UgcGFzcyBcIntjcmVhdGVkfGRhdGU6WVktTU0tRER9XCIsIHRoZSByZXN1bHQgd291bGQgYmU6XG4gICAqXG4gICAqIFwiMjAyMi0wMS0wMVwiXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBhIHN0cmluZyB3aXRoIHRoZSBzeW50YXhcbiAgICogQHBhcmFtIHtQYXJzZVN5bnRheE9wdGlvbnN9IG9wdGlvbnNcbiAgICogQHJldHVybiB0aGUgcmVzdWx0cyBvZiBwYXJzaW5nIHRoZSBzeW50YXggb24gdGhpcyBqb2JcbiAgICovXG4gIHBhcnNlU3ludGF4KFxuICAgIHZhbHVlOiBzdHJpbmcsXG4gICAgb3B0aW9uczogUGFyc2VTeW50YXhPcHRpb25zID0ge1xuICAgICAgdGltZVpvbmVPZmZzZXQ6IDBcbiAgICB9XG4gICk6IHN0cmluZyB7XG5cbiAgICBpZiAoIXZhbHVlIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5nZXRGaWVsZHMyKCk7XG4gICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLyh7W159XSp9KS9nLCAobWF0Y2g6IHN0cmluZywgdG9rZW46IHN0cmluZykgPT4ge1xuICAgICAgY29uc3Qgc3ludGF4ID0gdG9rZW4uc3Vic3RyaW5nKDEsIHRva2VuLmxlbmd0aCAtIDEpO1xuXG4gICAgICBsZXQgW2tleSwgZmlsdGVyXSA9IHN5bnRheC5zcGxpdCgnfCcpO1xuICAgICAga2V5ID0gKGtleSB8fCAnJykudHJpbSgpO1xuICAgICAgZmlsdGVyID0gKGZpbHRlciB8fCAnJykudHJpbSgpO1xuXG4gICAgICBsZXQgZmlsdGVyTmFtZSwgZmlsdGVyQXJnOiBzdHJpbmcgPSAnJztcbiAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgY29uc3Qgc3BsaXRJbmRleCA9IGZpbHRlci5pbmRleE9mKCc6Jyk7XG4gICAgICAgIGlmIChzcGxpdEluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIGZpbHRlck5hbWUgPSBmaWx0ZXIuc3Vic3RyaW5nKDAsIHNwbGl0SW5kZXgpO1xuICAgICAgICAgIGZpbHRlckFyZyA9IGZpbHRlci5zdWJzdHJpbmcoc3BsaXRJbmRleCArIDEpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbHRlck5hbWUgPSBmaWx0ZXI7XG4gICAgICAgICAgZmlsdGVyQXJnID0gJyc7XG4gICAgICAgIH1cbiAgICAgICAgZmlsdGVyTmFtZSA9IChmaWx0ZXJOYW1lIHx8ICcnKS50cmltKCk7XG4gICAgICAgIGZpbHRlckFyZyA9IChmaWx0ZXJBcmcgfHwgJycpLnRyaW0oKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhdGggPSBrZXkuc3BsaXQoJy4nKTtcbiAgICAgIGNvbnN0IG9iamVjdEtleSA9IHBhdGguc2hpZnQoKSB8fCAnJztcbiAgICAgIGxldCByZXN1bHQgPSAnJztcbiAgICAgIGlmIChvYmplY3RLZXkgPT09ICdqb2InKSB7XG4gICAgICAgIHJlc3VsdCA9ICh0aGlzLmdldFZhbHVlQnlQYXRoKHBhdGgpIHx8ICcnKS50b1N0cmluZygpO1xuICAgICAgfSBlbHNlIGlmIChvYmplY3RLZXkgPT09ICdmaWVsZHMnKSB7XG4gICAgICAgIHJlc3VsdCA9IChnZXRWYWx1ZUJ5UGF0aChbJ2ZpZWxkcy4nICsgcGF0aC5zaGlmdCgpLCAuLi5wYXRoXSwgZmllbGRzKSB8fCAnJykudG9TdHJpbmcoKTtcbiAgICAgIH0gZWxzZSBpZiAob2JqZWN0S2V5Lmxlbmd0aCkge1xuICAgICAgICBpZiAob3B0aW9ucy5vYmplY3RzKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMub2JqZWN0c1tvYmplY3RLZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoXG4gICAgICAgICAgICAgIGBvYmplY3RLZXkgJHtvYmplY3RLZXl9IGlzIG5vdCBwcmVzZW50IGluIG9wdGlvbnMub2JqZWN0YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc3VsdCA9ICcnO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQgPSAoZ2V0VmFsdWVCeVBhdGgocGF0aCwgb3B0aW9ucy5vYmplY3RzW29iamVjdEtleV0pIHx8ICcnKVxuICAgICAgICAgICAgICAudG9TdHJpbmcoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5kZWJ1ZyhcbiAgICAgICAgICAgIGBvYmplY3RLZXkgJHtvYmplY3RLZXl9IHdhcyB1c2VkIGJ1dCBvcHRpb25zLm9iamVjdCBpcyBub3Qgc2V0YFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgICB9XG5cblxuICAgICAgaWYgKGZpbHRlck5hbWUgJiYgcmVzdWx0KSB7XG4gICAgICAgIHN3aXRjaCAoZmlsdGVyTmFtZSkge1xuICAgICAgICAgIGNhc2UgJ2RhdGUnOiB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMudGltZVpvbmVPZmZzZXQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG1vbWVudChyZXN1bHQpLmZvcm1hdChmaWx0ZXJBcmcgfHwgJycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG1vbWVudChyZXN1bHQpXG4gICAgICAgICAgICAgICAgLnV0Y09mZnNldChvcHRpb25zLnRpbWVab25lT2Zmc2V0KVxuICAgICAgICAgICAgICAgIC5mb3JtYXQoZmlsdGVyQXJnIHx8ICcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCd1bmtub3duIGZpbHRlciAlcycsIGZpbHRlck5hbWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pLnRyaW0oKTtcbiAgfTtcblxuICAvKipcbiAgICogQHJldHVybiB7b2JqZWN0fVxuICAgKi9cbiAgb3ZlcnJpZGUgdG9BcGlEdG8oKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj4ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci50b0FwaUR0bygpLFxuICAgICAgcmVmZXJlbmNlOiB0aGlzLnJlZmVyZW5jZSB8fCAnficsXG4gICAgICBqb2JEYXRlOiB0aGlzLmpvYkRhdGUgfHwgJ34nLFxuICAgICAgam9iVHlwZTogdGhpcy5qb2JUeXBlIHx8ICd+JyxcbiAgICAgIGFjY2Vzc0dyb3VwOiB0aGlzLmFjY2Vzc0dyb3VwIHx8ICd+JyxcbiAgICAgIGpvYlN0YXR1czogdGhpcy5qb2JTdGF0dXMgfHwgJ34nLFxuICAgICAgYXNzaWduZWVJZDogdGhpcy5hc3NpZ25lZUlkIHx8ICd+JyxcbiAgICAgIHRpbWVab25lT2Zmc2V0OiB0aGlzLnRpbWVab25lT2Zmc2V0IHx8IDAsXG4gICAgICBwZW5kaW5nRmllbGRzOiB0aGlzLnBlbmRpbmdGaWVsZHMgfHwgMCxcbiAgICAgIGxhc3RGb3JtOiB0aGlzLmZvcm1JZCB8fCAnfidcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyB0b0FwaVBhdGNoRHRvKFxuICAgIGl0ZW06IFBhcnRpYWw8VmFzSm9iRHRvPlxuICApOiBQYXJ0aWFsPFZhc0pvYkR0bz4ge1xuICAgIHJldHVybiBvbmx5KFxuICAgICAgaXRlbSxcbiAgICAgIFtcbiAgICAgICAgJ2NyZWF0ZWQnLFxuICAgICAgICAnbW9kaWZpZWQnLFxuICAgICAgICAncmVmZXJlbmNlJyxcbiAgICAgICAgJ2pvYkRhdGUnLFxuICAgICAgICAnam9iVHlwZScsXG4gICAgICAgICdhY2Nlc3NHcm91cCcsXG4gICAgICAgICdqb2JTdGF0dXMnLFxuICAgICAgICAnYXNzaWduZWVJZCcsXG4gICAgICAgICd0aW1lWm9uZU9mZnNldCcsXG4gICAgICAgICdwZW5kaW5nRmllbGRzJyxcbiAgICAgICAgJ2xhc3RGb3JtJ1xuICAgICAgXVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFzLWxvb2t1cC10eXBlLmR0by5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Zhcy1saWIvc3JjL2xpYi9lbnRpdHkvdmFzLWxvb2t1cC10eXBlLmR0by50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVmFzQWNjb3VudE9iamVjdER0byB9IGZyb20gJy4vdmFzLWFjY291bnQtb2JqZWN0LmR0byc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFzTG9va3VwVHlwZUR0byBleHRlbmRzIFZhc0FjY291bnRPYmplY3REdG8ge1xuICB0aXRsZTogc3RyaW5nO1xuICBzZXF1ZW5jZTogbnVtYmVyO1xuICBjYXRlZ29yeUdyb3VwczogQXJyYXk8c3RyaW5nPjtcbn1cbiJdfQ==
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFzLWxvb2t1cC5kdG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YXMtbGliL3NyYy9saWIvZW50aXR5L3Zhcy1sb29rdXAuZHRvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWYXNBY2NvdW50T2JqZWN0RHRvIH0gZnJvbSAnLi92YXMtYWNjb3VudC1vYmplY3QuZHRvJztcblxuZXhwb3J0IGludGVyZmFjZSBWYXNMb29rdXBEdG8gZXh0ZW5kcyBWYXNBY2NvdW50T2JqZWN0RHRvIHtcbiAgaWQ6IHN0cmluZztcbiAgY3JlYXRlZDogc3RyaW5nO1xuICBzZXJ2ZXJDcmVhdGVkOiBzdHJpbmc7XG4gIGNyZWF0ZWRCeTogc3RyaW5nO1xuICBzZXJ2ZXJNb2RpZmllZDogc3RyaW5nO1xuICBtb2RpZmllZEJ5OiBzdHJpbmc7XG4gIGFjY291bnQ6IHN0cmluZztcbiAgYWNjZXNzR3JvdXA6IHN0cmluZztcbiAgbG9va3VwVHlwZTogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICBjb250ZW50OiBzdHJpbmc7XG4gIHNlcXVlbmNlOiBudW1iZXI7XG59XG4iXX0=
|