@ironcode/vas-lib 1.14.0 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/cjs/lib/control-value/vas-camera-control-value.model.js +2 -1
  2. package/cjs/lib/control-value/vas-camera-control-value.model.js.map +1 -1
  3. package/cjs/lib/controls-config/vas-control-config-direction.enum.js +1 -1
  4. package/cjs/lib/controls-config/vas-control-config-direction.enum.js.map +1 -1
  5. package/cjs/lib/entity/vas-account.dto.js +1 -1
  6. package/cjs/lib/entity/vas-account.dto.js.map +1 -1
  7. package/cjs/lib/entity/vas-control.model.js.map +1 -1
  8. package/cjs/lib/entity/vas-field.model.js.map +1 -1
  9. package/cjs/lib/entity/vas-file.dto.js +2 -1
  10. package/cjs/lib/entity/vas-file.dto.js.map +1 -1
  11. package/cjs/lib/entity/vas-file.model.js.map +1 -1
  12. package/cjs/lib/entity/vas-fire-user.model.d.ts +1 -1
  13. package/cjs/lib/entity/vas-fire-user.model.d.ts.map +1 -1
  14. package/cjs/lib/entity/vas-fire-user.model.js.map +1 -1
  15. package/cjs/lib/entity/vas-form-config.model.d.ts +13 -3
  16. package/cjs/lib/entity/vas-form-config.model.d.ts.map +1 -1
  17. package/cjs/lib/entity/vas-form-config.model.js.map +1 -1
  18. package/cjs/lib/entity/vas-form.model.js.map +1 -1
  19. package/cjs/lib/entity/vas-group.model.js.map +1 -1
  20. package/cjs/lib/entity/vas-invitation.js +1 -1
  21. package/cjs/lib/entity/vas-invitation.js.map +1 -1
  22. package/cjs/lib/entity/vas-job-action.dto.d.ts.map +1 -1
  23. package/cjs/lib/entity/vas-job.model.js.map +1 -1
  24. package/cjs/lib/entity/vas-user.model.d.ts +1 -1
  25. package/cjs/lib/entity/vas-user.model.d.ts.map +1 -1
  26. package/cjs/lib/utils/find-form-control.js.map +1 -1
  27. package/cjs/lib/utils/get-value-by-path.d.ts.map +1 -1
  28. package/cjs/lib/utils/get-value-by-path.js.map +1 -1
  29. package/cjs/lib/utils/is-array-string.d.ts +1 -1
  30. package/cjs/lib/utils/is-array-string.d.ts.map +1 -1
  31. package/cjs/lib/utils/omit.d.ts.map +1 -1
  32. package/cjs/lib/utils/omit.js.map +1 -1
  33. package/cjs/lib/utils/only.d.ts.map +1 -1
  34. package/cjs/lib/utils/only.js.map +1 -1
  35. package/cjs/package.json +5 -0
  36. package/esm2020/ironcode-vas-lib.mjs +5 -0
  37. package/esm2020/lib/control-value/index.mjs +3 -0
  38. package/esm2020/lib/control-value/vas-camera-control-value.model.mjs +8 -0
  39. package/esm2020/lib/control-value/vas-function-control-value.dto.mjs +2 -0
  40. package/esm2020/lib/controls-config/index.mjs +5 -0
  41. package/esm2020/lib/controls-config/vas-control-config-direction.enum.mjs +8 -0
  42. package/esm2020/lib/controls-config/vas-control-config.model.mjs +2 -0
  43. package/esm2020/lib/controls-config/vas-function-control-config.dto.mjs +2 -0
  44. package/esm2020/lib/controls-config/vas-select-control-config.model.mjs +2 -0
  45. package/esm2020/lib/elastic/index.mjs +2 -0
  46. package/esm2020/lib/elastic/job.elastic-doc.mjs +2 -0
  47. package/esm2020/lib/entity/index.mjs +70 -0
  48. package/esm2020/lib/entity/vas-access-group.dto.mjs +2 -0
  49. package/esm2020/lib/entity/vas-account-config.dto.mjs +2 -0
  50. package/esm2020/lib/entity/vas-account-object.dto.mjs +2 -0
  51. package/esm2020/lib/entity/vas-account-object.model.mjs +24 -0
  52. package/esm2020/lib/entity/vas-account.dto.mjs +7 -0
  53. package/esm2020/lib/entity/vas-base.dto.mjs +2 -0
  54. package/esm2020/lib/entity/vas-base.model.mjs +34 -0
  55. package/esm2020/lib/entity/vas-branch.dto.mjs +2 -0
  56. package/esm2020/lib/entity/vas-branch.model.mjs +68 -0
  57. package/esm2020/lib/entity/vas-contact-type.dto.mjs +2 -0
  58. package/esm2020/lib/entity/vas-contact.dto.mjs +2 -0
  59. package/esm2020/lib/entity/vas-contact.model.mjs +101 -0
  60. package/esm2020/lib/entity/vas-control-type.dto.mjs +2 -0
  61. package/esm2020/lib/entity/vas-control-type.model.mjs +52 -0
  62. package/esm2020/lib/entity/vas-control.dto.mjs +2 -0
  63. package/esm2020/lib/entity/vas-control.model.mjs +191 -0
  64. package/esm2020/lib/entity/vas-field.dto.mjs +2 -0
  65. package/esm2020/lib/entity/vas-field.model.mjs +112 -0
  66. package/esm2020/lib/entity/vas-file.dto.mjs +9 -0
  67. package/esm2020/lib/entity/vas-file.model.mjs +135 -0
  68. package/esm2020/lib/entity/vas-fire-user.dto.mjs +2 -0
  69. package/esm2020/lib/entity/vas-fire-user.model.mjs +102 -0
  70. package/esm2020/lib/entity/vas-form-config.dto.mjs +2 -0
  71. package/esm2020/lib/entity/vas-form-config.model.mjs +31 -0
  72. package/esm2020/lib/entity/vas-form.dto.mjs +2 -0
  73. package/esm2020/lib/entity/vas-form.model.mjs +215 -0
  74. package/esm2020/lib/entity/vas-group.dto.mjs +2 -0
  75. package/esm2020/lib/entity/vas-group.model.mjs +108 -0
  76. package/esm2020/lib/entity/vas-instruction-job-field.dto.mjs +2 -0
  77. package/esm2020/lib/entity/vas-instruction-job-field.model.mjs +48 -0
  78. package/esm2020/lib/entity/vas-instruction-job.dto.mjs +2 -0
  79. package/esm2020/lib/entity/vas-instruction-job.model.mjs +81 -0
  80. package/esm2020/lib/entity/vas-instruction-provider.dto.mjs +2 -0
  81. package/esm2020/lib/entity/vas-instruction-provider.model.mjs +66 -0
  82. package/esm2020/lib/entity/vas-instruction.dto.mjs +2 -0
  83. package/esm2020/lib/entity/vas-instruction.model.mjs +52 -0
  84. package/esm2020/lib/entity/vas-invitation.mjs +88 -0
  85. package/esm2020/lib/entity/vas-job-action.dto.mjs +22 -0
  86. package/esm2020/lib/entity/vas-job-copy.mjs +39 -0
  87. package/esm2020/lib/entity/vas-job-data.dto.mjs +2 -0
  88. package/esm2020/lib/entity/vas-job-data.model.mjs +21 -0
  89. package/esm2020/lib/entity/vas-job-email.dto.mjs +2 -0
  90. package/esm2020/lib/entity/vas-job-email.model.mjs +85 -0
  91. package/esm2020/lib/entity/vas-job-status.dto.mjs +2 -0
  92. package/esm2020/lib/entity/vas-job-type.dto.mjs +2 -0
  93. package/esm2020/lib/entity/vas-job.dto.mjs +2 -0
  94. package/esm2020/lib/entity/vas-job.model.mjs +529 -0
  95. package/esm2020/lib/entity/vas-lookup-type.dto.mjs +2 -0
  96. package/esm2020/lib/entity/vas-lookup.dto.mjs +2 -0
  97. package/esm2020/lib/entity/vas-lookup.model.mjs +75 -0
  98. package/esm2020/lib/entity/vas-membership.dto.mjs +2 -0
  99. package/esm2020/lib/entity/vas-membership.model.mjs +62 -0
  100. package/esm2020/lib/entity/vas-note.dto.mjs +2 -0
  101. package/esm2020/lib/entity/vas-note.model.mjs +68 -0
  102. package/esm2020/lib/entity/vas-report-layout.dto.mjs +2 -0
  103. package/esm2020/lib/entity/vas-report-layout.model.mjs +22 -0
  104. package/esm2020/lib/entity/vas-report-request.dto.mjs +2 -0
  105. package/esm2020/lib/entity/vas-report-request.model.mjs +44 -0
  106. package/esm2020/lib/entity/vas-report.dto.mjs +2 -0
  107. package/esm2020/lib/entity/vas-report.model.mjs +72 -0
  108. package/esm2020/lib/entity/vas-restricted-account-object.dto.mjs +2 -0
  109. package/esm2020/lib/entity/vas-restricted-account-object.model.mjs +24 -0
  110. package/esm2020/lib/entity/vas-task-type.dto.mjs +2 -0
  111. package/esm2020/lib/entity/vas-task.dto.mjs +2 -0
  112. package/esm2020/lib/entity/vas-task.model.mjs +80 -0
  113. package/esm2020/lib/entity/vas-user.dto.mjs +2 -0
  114. package/esm2020/lib/entity/vas-user.model.mjs +42 -0
  115. package/esm2020/lib/entity/vas-vehicle.dto.mjs +2 -0
  116. package/esm2020/lib/entity/vas-vehicle.model.mjs +69 -0
  117. package/esm2020/lib/model/geo-location.mjs +12 -0
  118. package/esm2020/lib/model/index.mjs +3 -0
  119. package/esm2020/lib/model/vas-time-range.model.mjs +2 -0
  120. package/esm2020/lib/utils/get-value-by-path.mjs +64 -0
  121. package/esm2020/lib/utils/is-array-string.mjs +4 -0
  122. package/esm2020/lib/utils/only.mjs +22 -0
  123. package/esm2020/public-api.mjs +6 -0
  124. package/fesm2015/ironcode-vas-lib.mjs +2736 -0
  125. package/fesm2015/ironcode-vas-lib.mjs.map +1 -0
  126. package/{fesm2022 → fesm2020}/ironcode-vas-lib.mjs +1 -506
  127. package/{fesm2022 → fesm2020}/ironcode-vas-lib.mjs.map +1 -1
  128. package/lib/entity/vas-fire-user.model.d.ts +1 -1
  129. package/lib/entity/vas-form-config.model.d.ts +13 -3
  130. package/lib/entity/vas-user.model.d.ts +1 -1
  131. package/lib/utils/is-array-string.d.ts +1 -1
  132. package/package.json +11 -3
@@ -0,0 +1,529 @@
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFzLWpvYi5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Zhcy1saWIvc3JjL2xpYi9lbnRpdHkvdmFzLWpvYi5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUdsRCxPQUFPLEVBQUUsK0JBQStCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN4RixPQUFPLEVBQWUsbUJBQW1CLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDNUQsT0FBTyxFQUFFLHNCQUFzQixFQUE4QixNQUFNLGtCQUFrQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBeUJyQzs7R0FFRztBQUNILE1BQU0sT0FBTyxXQUFZLFNBQVEsK0JBQStCO0lBRTlELFlBQ2tCLEVBQVUsRUFDVixPQUFlLEVBQ2YsYUFBcUIsRUFDckIsU0FBaUIsRUFDakIsUUFBZ0IsRUFDaEIsY0FBc0IsRUFDdEIsVUFBa0IsRUFDbEIsYUFBcUIsRUFDckIsY0FBc0IsRUFDdEIsT0FBZSxFQUNmLFdBQW1CLEVBQzVCLFNBQWlCLEVBQ2pCLE9BQWUsRUFDZixTQUFpQixFQUNqQixPQUFlLEVBQ2YsVUFBa0IsRUFDbEIsTUFBYyxFQUNkLGNBQXNCLEVBQ3RCLGFBQXFCLEVBQ3JCLGFBQXFCLEVBQ3JCLE9BQWUsRUFDZixvQkFBNEIsRUFDNUIscUJBQTZCLEVBQzdCLFdBQXdC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QztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXNGaWxlRHRvLCBWYXNGaWxlRHRvIH0gZnJvbSAnLi92YXMtZmlsZS5kdG8nO1xuaW1wb3J0IHsgVVVJRCB9IGZyb20gJ2FuZ3VsYXIyLXV1aWQnO1xuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgZ2V0VmFsdWVCeVBhdGggfSBmcm9tICcuLi91dGlscy9nZXQtdmFsdWUtYnktcGF0aCc7XG5pbXBvcnQgeyBWYXNCYXNlRHRvIH0gZnJvbSAnLi92YXMtYmFzZS5kdG8nO1xuaW1wb3J0IHsgVmFzRmllbGREdG8sIFZhc0ZpZWxkRHRvVmFsdWUgfSBmcm9tICcuL3Zhcy1maWVsZC5kdG8nO1xuaW1wb3J0IHsgVmFzRmllbGRNb2RlbCB9IGZyb20gJy4vdmFzLWZpZWxkLm1vZGVsJztcbmltcG9ydCB7IFZhc0Zvcm1Nb2RlbCB9IGZyb20gJy4vdmFzLWZvcm0ubW9kZWwnO1xuaW1wb3J0IHsgVmFzSm9iRHRvIH0gZnJvbSAnLi92YXMtam9iLmR0byc7XG5pbXBvcnQgeyBWYXNSZXN0cmljdGVkQWNjb3VudE9iamVjdE1vZGVsIH0gZnJvbSAnLi92YXMtcmVzdHJpY3RlZC1hY2NvdW50LW9iamVjdC5tb2RlbCc7XG5pbXBvcnQgeyBHZW9Mb2NhdGlvbiwgZ2V0RW1wdHlHZW9Mb2NhdGlvbiB9IGZyb20gJy4uL21vZGVsJztcbmltcG9ydCB7IGlzQ2FtZXJhQ29udHJvbFZhbHVlVjEsIFZhc0NhbWVyYUNvbnRyb2xWYWx1ZU1vZGVsIH0gZnJvbSAnLi4vY29udHJvbC12YWx1ZSc7XG5pbXBvcnQgeyBpc0FycmF5U3RyaW5nIH0gZnJvbSAnLi4vdXRpbHMvaXMtYXJyYXktc3RyaW5nJztcbmltcG9ydCB7IFZhc0Zvcm1EdG8gfSBmcm9tICcuL3Zhcy1mb3JtLmR0byc7XG5pbXBvcnQgeyBvbmx5IH0gZnJvbSAnLi4vdXRpbHMvb25seSc7XG5pbXBvcnQgeyBWYXNSZXBvcnREdG8gfSBmcm9tICcuL3Zhcy1yZXBvcnQuZHRvJztcbmltcG9ydCB7IFZhc1Rhc2tEdG8gfSBmcm9tICcuL3Zhcy10YXNrLmR0byc7XG5pbXBvcnQgeyBWYXNOb3RlRHRvIH0gZnJvbSAnLi92YXMtbm90ZS5kdG8nO1xuaW1wb3J0IHsgVmFzSm9iRW1haWxEdG8gfSBmcm9tICcuL3Zhcy1qb2ItZW1haWwuZHRvJztcbmltcG9ydCB7IFZhc0luc3RydWN0aW9uRHRvIH0gZnJvbSAnLi92YXMtaW5zdHJ1Y3Rpb24uZHRvJztcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFZhc0pvYk1vZGVsRHluYW1pY0ludGVyZmFjZSB7XG4gIFtzOiBzdHJpbmddOiBzdHJpbmcgfCBudW1iZXIgfCBSZWNvcmQ8c3RyaW5nLCBWYXNGaWVsZER0b1ZhbHVlPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXJzZVN5bnRheE9wdGlvbnMge1xuICAvLyBUaGlzIHZhbHVlIHdpbGwgYmUgdXNlZCB0byBhZGp1c3QgYW55IGRhdGV0aW1lIHZhbHVlcyB0aGF0IGFyZSByZWZlcmVuY2VkXG4gIC8vIGluIHRoZSBzeW50YXggc3RyaW5nLiBTZWVcbiAgLy8gaHR0cHM6Ly9tb21lbnRqc2NvbS5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvbW9tZW50LzAzLW1hbmlwdWxhdGluZy8wOS11dGMtb2Zmc2V0L1xuICAvLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBob3cgYG1vbWVudGAgd2lsbCBoYW5kbGUgdGhlIHZhbHVlLlxuICB0aW1lWm9uZU9mZnNldDogbnVtYmVyLFxuICAvLyB0aGlzIGRpY3Rpb25hcnkgY2FuIGJlIHBhc3NlZCBpbiB0byBjb250YWluIG90aGVyIG9iamVjdHMgdG8gYmUgcmVmZXJlbmNlZFxuICAvLyBpbiB0aGUgc3ludGF4LiBGb3IgZXhhbXBsZSBpZiB3ZSBoYXZlIHtqb2IuZm9vfSB0aGlzIHdpbGwgcmVmZXJlbmNlIHRoZVxuICAvLyBqb2IncyBgZm9vYCBwcm9wZXJ0eSwgaG93ZXZlciBpZiB3ZSBoYXZlIFwicmVwb3J0TGF5b3V0LnRpdGxlXCIgdGhpcyB3aWxsXG4gIC8vIGV4cGVjdCB0byBmaW5kIGEgcHJvcGVydHkgb2YgYG9iamVjdHNgIGNhbGxlZCBgcmVwb3J0TGF5b3V0YCB3aGljaCB3aWxsXG4gIC8vIGhhdmUgYSBwcm9wZXJ0eSBjYWxsZWQgYHRpdGxlYFxuICBvYmplY3RzPzogUmVjb3JkPHN0cmluZywgUGFydGlhbDxWYXNCYXNlRHRvPiB8IFJlY29yZDxzdHJpbmcsIFZhc0ZpZWxkRHRvVmFsdWU+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==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFzLWxvb2t1cC10eXBlLmR0by5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3Zhcy1saWIvc3JjL2xpYi9lbnRpdHkvdmFzLWxvb2t1cC10eXBlLmR0by50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVmFzQWNjb3VudE9iamVjdER0byB9IGZyb20gJy4vdmFzLWFjY291bnQtb2JqZWN0LmR0byc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmFzTG9va3VwVHlwZUR0byBleHRlbmRzIFZhc0FjY291bnRPYmplY3REdG8ge1xuICB0aXRsZTogc3RyaW5nO1xuICBzZXF1ZW5jZTogbnVtYmVyO1xuICBjYXRlZ29yeUdyb3VwczogQXJyYXk8c3RyaW5nPjtcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFzLWxvb2t1cC5kdG8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy92YXMtbGliL3NyYy9saWIvZW50aXR5L3Zhcy1sb29rdXAuZHRvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBWYXNBY2NvdW50T2JqZWN0RHRvIH0gZnJvbSAnLi92YXMtYWNjb3VudC1vYmplY3QuZHRvJztcblxuZXhwb3J0IGludGVyZmFjZSBWYXNMb29rdXBEdG8gZXh0ZW5kcyBWYXNBY2NvdW50T2JqZWN0RHRvIHtcbiAgaWQ6IHN0cmluZztcbiAgY3JlYXRlZDogc3RyaW5nO1xuICBzZXJ2ZXJDcmVhdGVkOiBzdHJpbmc7XG4gIGNyZWF0ZWRCeTogc3RyaW5nO1xuICBzZXJ2ZXJNb2RpZmllZDogc3RyaW5nO1xuICBtb2RpZmllZEJ5OiBzdHJpbmc7XG4gIGFjY291bnQ6IHN0cmluZztcbiAgYWNjZXNzR3JvdXA6IHN0cmluZztcbiAgbG9va3VwVHlwZTogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICBjb250ZW50OiBzdHJpbmc7XG4gIHNlcXVlbmNlOiBudW1iZXI7XG59XG4iXX0=