@aerokit/sdk 12.72.0 → 12.74.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.
@@ -17,11 +17,18 @@ var __copyProps = (to, from, except, desc) => {
17
17
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
18
  var process_exports = {};
19
19
  __export(process_exports, {
20
+ BpmnError: () => BpmnError,
20
21
  Process: () => Process
21
22
  });
22
23
  module.exports = __toCommonJS(process_exports);
23
24
  var import_values = require("@aerokit/sdk/bpm/values");
25
+ const JBpmnError = Java.type("org.flowable.engine.delegate.BpmnError");
24
26
  const BpmFacade = Java.type("org.eclipse.dirigible.components.api.bpm.BpmFacade");
27
+ class BpmnError {
28
+ constructor(code, message) {
29
+ return new JBpmnError(code, message);
30
+ }
31
+ }
25
32
  class Process {
26
33
  /**
27
34
  * Starts a new process instance for a given process definition key.
@@ -117,9 +124,308 @@ class Process {
117
124
  static getExecutionContext() {
118
125
  return new ExecutionContext();
119
126
  }
127
+ /**
128
+ * Retrieves the current task context object, typically used within a task listener or service task.
129
+ *
130
+ * @returns A new instance of the `TaskContext` containing details about the current task.
131
+ */
132
+ static getTaskContext() {
133
+ return new TaskContext();
134
+ }
135
+ }
136
+ class VariableScope {
137
+ constructor(variableScope) {
138
+ this.variableScope = variableScope;
139
+ }
140
+ /**
141
+ * Returns all variables. This will include all variables of parent scopes too.
142
+ * @returns A Map of variable names (`string`) to variable values (`any`).
143
+ */
144
+ getVariables() {
145
+ const variables = this.variableScope.getVariables();
146
+ for (const [key, value] of variables) {
147
+ variables.set(key, import_values.Values.parseValue(value));
148
+ }
149
+ return variables;
150
+ }
151
+ /**
152
+ * Returns all variables, as instances of the {@link VariableInstance} interface, which gives more information than only the value (type, execution id, etc.)
153
+ * @returns A Map of variable names (`string`) to {@link VariableInstance} objects (Java type).
154
+ */
155
+ getVariableInstances() {
156
+ return this.variableScope.getVariableInstances();
157
+ }
158
+ /**
159
+ * Returns the variable local to this scope only. So, in contrary to {@link #getVariables()}, the variables from the parent scope won't be returned.
160
+ * @returns A Map of variable names (`string`) to local variable values (`any`).
161
+ */
162
+ getVariablesLocal() {
163
+ const variablesLocal = this.variableScope.getVariablesLocal();
164
+ for (const [key, value] of variablesLocal) {
165
+ variablesLocal.set(key, import_values.Values.parseValue(value));
166
+ }
167
+ return variablesLocal;
168
+ }
169
+ /**
170
+ * Returns the variables local to this scope as instances of the {@link VariableInstance} interface, which provided additional information about the variable.
171
+ * @returns A Map of variable names (`string`) to local {@link VariableInstance} objects (Java type).
172
+ */
173
+ getVariableInstancesLocal() {
174
+ return this.variableScope.getVariableInstancesLocal();
175
+ }
176
+ /**
177
+ * Returns the variable value for one specific variable. Will look in parent scopes when the variable does not exist on this particular scope.
178
+ * @param variableName The name of the variable to retrieve.
179
+ * @returns The value of the variable (`any`), or `null` if not found.
180
+ */
181
+ getVariable(variableName) {
182
+ return import_values.Values.parseValue(this.variableScope.getVariable(variableName));
183
+ }
184
+ /**
185
+ * Similar to {@link #getVariable(String)}, but returns a {@link VariableInstance} instance, which contains more information than just the value.
186
+ * @param variableName The name of the variable to retrieve.
187
+ * @returns The {@link VariableInstance} object (Java type), or `null`.
188
+ */
189
+ getVariableInstance(variableName) {
190
+ return this.variableScope.getVariableInstance(variableName);
191
+ }
192
+ /**
193
+ * Returns the value for the specific variable and only checks this scope and not any parent scope.
194
+ * @param variableName The name of the local variable to retrieve.
195
+ * @returns The value of the local variable (`any`), or `null` if not found locally.
196
+ */
197
+ getVariableLocal(variableName) {
198
+ return import_values.Values.parseValue(this.variableScope.getVariableLocal(variableName));
199
+ }
200
+ /**
201
+ * Similar to {@link #getVariableLocal(String)}, but returns an instance of {@link VariableInstance}, which has some additional information beyond the value.
202
+ * @param variableName The name of the local variable to retrieve.
203
+ * @returns The local {@link VariableInstance} object (Java type), or `null`.
204
+ */
205
+ getVariableInstanceLocal(variableName) {
206
+ return this.variableScope.getVariableInstanceLocal(variableName);
207
+ }
208
+ /**
209
+ * Returns all the names of the variables for this scope and all parent scopes.
210
+ * @returns A Set of all variable names (`string`).
211
+ */
212
+ getVariableNames() {
213
+ const variableNames = /* @__PURE__ */ new Set();
214
+ for (const next of this.variableScope.getVariableNames().toArray()) {
215
+ variableNames.add(next);
216
+ }
217
+ return variableNames;
218
+ }
219
+ /**
220
+ * Returns all the names of the variables for this scope (no parent scopes).
221
+ * @returns A Set of local variable names (`string`).
222
+ */
223
+ getVariableNamesLocal() {
224
+ const variableNamesLocal = /* @__PURE__ */ new Set();
225
+ for (const next of this.variableScope.getVariableNamesLocal().toArray()) {
226
+ variableNamesLocal.add(next);
227
+ }
228
+ return variableNamesLocal;
229
+ }
230
+ /**
231
+ * Sets the variable with the provided name to the provided value. It checks parent scopes for an existing variable before setting on the current scope.
232
+ * @param variableName The name of the variable to be set.
233
+ * @param value The value of the variable to be set (`any`).
234
+ */
235
+ setVariable(variableName, value) {
236
+ this.variableScope.setVariable(variableName, import_values.Values.stringifyValue(value));
237
+ }
238
+ /**
239
+ * Similar to {@link #setVariable(String, Object)}, but the variable is set to this scope specifically (local variable).
240
+ * @param variableName The name of the variable to be set locally.
241
+ * @param value The value of the variable to be set (`any`).
242
+ * @returns The old value of the local variable (Java type), or `null`.
243
+ */
244
+ setVariableLocal(variableName, value) {
245
+ return this.variableScope.setVariableLocal(variableName, import_values.Values.stringifyValue(value));
246
+ }
247
+ /**
248
+ * Sets the provided variables to the variable scope, using the default scoping algorithm.
249
+ * @param variables A map of keys (`string`) and values (`any`) for the variables to be set.
250
+ */
251
+ setVariables(variables) {
252
+ for (const [key, value] of variables) {
253
+ variables.set(key, import_values.Values.stringifyValue(value));
254
+ }
255
+ this.variableScope.setVariables(variables);
256
+ }
257
+ /**
258
+ * Similar to {@link #setVariables(Map)}, but the variables are set on this scope specifically (local variables).
259
+ * @param variables A map of keys (`string`) and values (`any`) for the local variables to be set.
260
+ */
261
+ setVariablesLocal(variables) {
262
+ for (const [key, value] of variables) {
263
+ variables.set(key, import_values.Values.stringifyValue(value));
264
+ }
265
+ this.variableScope.setVariablesLocal(variables);
266
+ }
267
+ /**
268
+ * Returns whether this scope or any parent scope has variables.
269
+ * @returns `true` if variables exist in scope hierarchy, `false` otherwise.
270
+ */
271
+ hasVariables() {
272
+ return this.variableScope.hasVariables();
273
+ }
274
+ /**
275
+ * Returns whether this scope has variables.
276
+ * @returns `true` if local variables exist, `false` otherwise.
277
+ */
278
+ hasVariablesLocal() {
279
+ return this.variableScope.hasVariablesLocal();
280
+ }
281
+ /**
282
+ * Returns whether this scope or any parent scope has a specific variable.
283
+ * @param variableName The name of the variable to check.
284
+ * @returns `true` if the variable is found in the scope hierarchy, `false` otherwise.
285
+ */
286
+ hasVariable(variableName) {
287
+ return this.variableScope.hasVariable(variableName);
288
+ }
289
+ /**
290
+ * Returns whether this scope has a specific variable.
291
+ * @param variableName The name of the local variable to check.
292
+ * @returns `true` if the variable is found locally, `false` otherwise.
293
+ */
294
+ hasVariableLocal(variableName) {
295
+ return this.variableScope.hasVariableLocal(variableName);
296
+ }
297
+ /**
298
+ * Removes the variable from the process instance and creates a new HistoricVariableUpdate. Searches up the scope hierarchy.
299
+ * @param variableName The name of the variable to remove.
300
+ */
301
+ removeVariable(variableName) {
302
+ this.variableScope.removeVariable(variableName);
303
+ }
304
+ /**
305
+ * Removes the local variable and creates a new HistoricVariableUpdate.
306
+ * @param variableName The name of the local variable to remove.
307
+ */
308
+ removeVariableLocal(variableName) {
309
+ this.variableScope.removeVariableLocal(variableName);
310
+ }
311
+ /**
312
+ * Removes the variables and creates a new HistoricVariableUpdate for each of them. Searches up the scope hierarchy.
313
+ * @param variableNames An array of variable names (`string[]`) to remove.
314
+ */
315
+ removeVariables(variableNames) {
316
+ this.variableScope.removeVariables(variableNames);
317
+ }
318
+ /**
319
+ * Removes the local variables and creates a new HistoricVariableUpdate for each of them.
320
+ * @param variableNames An array of local variable names (`string[]`) to remove.
321
+ */
322
+ removeVariablesLocal(variableNames) {
323
+ this.variableScope.removeVariablesLocal(variableNames);
324
+ }
325
+ /**
326
+ * Sets a transient variable using the default scoping mechanism (up the hierarchy). Transient variables have no history and are cleared at wait states.
327
+ * @param variableName The name of the transient variable.
328
+ * @param variableValue The value of the transient variable (`any`).
329
+ */
330
+ setTransientVariable(variableName, variableValue) {
331
+ this.variableScope.setTransientVariable(variableName, import_values.Values.stringifyValue(variableValue));
332
+ }
333
+ /**
334
+ * Sets a local transient variable. Transient variables have no history and are cleared at wait states.
335
+ * @param variableName The name of the local transient variable.
336
+ * @param variableValue The value of the local transient variable (`any`).
337
+ */
338
+ setTransientVariableLocal(variableName, variableValue) {
339
+ this.variableScope.setTransientVariableLocal(variableName, import_values.Values.stringifyValue(variableValue));
340
+ }
341
+ /**
342
+ * Sets multiple transient variables using the default scoping mechanism (up the hierarchy).
343
+ * @param transientVariables A map of keys (`string`) and values (`any`) for the transient variables to be set.
344
+ */
345
+ setTransientVariables(transientVariables) {
346
+ for (const [key, value] of transientVariables) {
347
+ transientVariables.set(key, import_values.Values.stringifyValue(value));
348
+ }
349
+ this.variableScope.setTransientVariables(transientVariables);
350
+ }
351
+ /**
352
+ * Retrieves the value of a transient variable, searching up the parent scopes.
353
+ * @param variableName The name of the transient variable to retrieve.
354
+ * @returns The value of the transient variable (`any`), or `null` if not found.
355
+ */
356
+ getTransientVariable(variableName) {
357
+ return import_values.Values.parseValue(this.variableScope.getTransientVariable(variableName));
358
+ }
359
+ /**
360
+ * Retrieves all transient variables in the current scope hierarchy.
361
+ * @returns A Map of transient variable names (`string`) to values (`any`).
362
+ */
363
+ getTransientVariables() {
364
+ const transientVariables = this.variableScope.getTransientVariables();
365
+ for (const [key, value] of transientVariables) {
366
+ transientVariables.set(key, import_values.Values.parseValue(value));
367
+ }
368
+ return transientVariables;
369
+ }
370
+ /**
371
+ * Sets multiple local transient variables.
372
+ * @param transientVariables A map of keys (`string`) and values (`any`) for the local transient variables to be set.
373
+ */
374
+ setTransientVariablesLocal(transientVariables) {
375
+ for (const [key, value] of transientVariables) {
376
+ transientVariables.set(key, import_values.Values.stringifyValue(value));
377
+ }
378
+ this.variableScope.setTransientVariablesLocal(transientVariables);
379
+ }
380
+ /**
381
+ * Retrieves the value of a local transient variable.
382
+ * @param variableName The name of the local transient variable to retrieve.
383
+ * @returns The value of the local transient variable (`any`), or `null` if not found.
384
+ */
385
+ getTransientVariableLocal(variableName) {
386
+ return import_values.Values.parseValue(this.variableScope.getTransientVariableLocal(variableName));
387
+ }
388
+ /**
389
+ * Retrieves all local transient variables.
390
+ * @returns A Map of local transient variable names (`string`) to values (`any`).
391
+ */
392
+ getTransientVariablesLocal() {
393
+ const transientVariablesLocal = this.variableScope.getTransientVariablesLocal();
394
+ for (const [key, value] of transientVariablesLocal) {
395
+ transientVariablesLocal.set(key, import_values.Values.parseValue(value));
396
+ }
397
+ return transientVariablesLocal;
398
+ }
399
+ /**
400
+ * Removes a specific local transient variable.
401
+ * @param variableName The name of the local transient variable to remove.
402
+ */
403
+ removeTransientVariableLocal(variableName) {
404
+ this.variableScope.removeTransientVariableLocal(variableName);
405
+ }
406
+ /**
407
+ * Removes a specific transient variable, searching up the scope hierarchy.
408
+ * @param variableName The name of the transient variable to remove.
409
+ */
410
+ removeTransientVariable(variableName) {
411
+ this.variableScope.removeTransientVariable(variableName);
412
+ }
413
+ /**
414
+ * Remove all transient variables of this scope and its parent scopes.
415
+ */
416
+ removeTransientVariables() {
417
+ this.variableScope.removeTransientVariables();
418
+ }
419
+ /**
420
+ * Removes all local transient variables.
421
+ */
422
+ removeTransientVariablesLocal() {
423
+ this.variableScope.removeTransientVariablesLocal();
424
+ }
120
425
  }
121
- class ExecutionContext {
426
+ class ExecutionContext extends VariableScope {
122
427
  constructor() {
428
+ super(__context.get("execution"));
123
429
  this.execution = __context.get("execution");
124
430
  }
125
431
  /**
@@ -344,293 +650,422 @@ class ExecutionContext {
344
650
  setMultiInstanceRoot(isMultiInstanceRoot) {
345
651
  this.execution.setMultiInstanceRoot(isMultiInstanceRoot);
346
652
  }
653
+ }
654
+ var DelegationState = /* @__PURE__ */ ((DelegationState2) => {
655
+ DelegationState2[DelegationState2["PENDING"] = 0] = "PENDING";
656
+ DelegationState2[DelegationState2["RESOLVED"] = 1] = "RESOLVED";
657
+ return DelegationState2;
658
+ })(DelegationState || {});
659
+ class TaskContext extends VariableScope {
660
+ constructor() {
661
+ super(__context.get("task"));
662
+ this.task = __context.get("task");
663
+ }
347
664
  /**
348
- * Returns all variables. This will include all variables of parent scopes too.
349
- * @returns A Map of variable names (`string`) to variable values (`any`).
665
+ * DB id of the task.
666
+ *
667
+ * @returns the unique ID of the current task.
350
668
  */
351
- getVariables() {
352
- const variables = this.execution.getVariables();
353
- for (const [key, value] of variables) {
354
- variables.set(key, import_values.Values.parseValue(value));
355
- }
356
- return variables;
669
+ getId() {
670
+ return this.task.getId();
357
671
  }
358
672
  /**
359
- * Returns all variables, as instances of the {@link VariableInstance} interface, which gives more information than only the value (type, execution id, etc.)
360
- * @returns A Map of variable names (`string`) to {@link VariableInstance} objects (Java type).
673
+ * Name or title of the task.
674
+ *
675
+ * @returns the name of the current task.
361
676
  */
362
- getVariableInstances() {
363
- return this.execution.getVariableInstances();
677
+ getName() {
678
+ return this.task.getName();
364
679
  }
365
680
  /**
366
- * Returns the variable local to this scope only. So, in contrary to {@link #getVariables()}, the variables from the parent scope won't be returned.
367
- * @returns A Map of variable names (`string`) to local variable values (`any`).
681
+ * Change the name of the task.
682
+ *
683
+ * @param name the new name for the task.
368
684
  */
369
- getVariablesLocal() {
370
- const variablesLocal = this.execution.getVariablesLocal();
371
- for (const [key, value] of variablesLocal) {
372
- variablesLocal.set(key, import_values.Values.parseValue(value));
373
- }
374
- return variablesLocal;
685
+ setName(name) {
686
+ this.task.setName(name);
375
687
  }
376
688
  /**
377
- * Returns the variables local to this scope as instances of the {@link VariableInstance} interface, which provided additional information about the variable.
378
- * @returns A Map of variable names (`string`) to local {@link VariableInstance} objects (Java type).
689
+ * Get the free text description of the task.
690
+ *
691
+ * @returns the description of the current task.
379
692
  */
380
- getVariableInstancesLocal() {
381
- return this.execution.getVariableInstancesLocal();
693
+ getDescription() {
694
+ return this.task.getDescription();
382
695
  }
383
696
  /**
384
- * Returns the variable value for one specific variable. Will look in parent scopes when the variable does not exist on this particular scope.
385
- * @param variableName The name of the variable to retrieve.
386
- * @returns The value of the variable (`any`), or `null` if not found.
697
+ * Free text description of the task.
698
+ *
699
+ * @param description the new description for the task.
387
700
  */
388
- getVariable(variableName) {
389
- return import_values.Values.parseValue(this.execution.getVariable(variableName));
701
+ setDescription(description) {
702
+ this.task.setDescription(description);
390
703
  }
391
704
  /**
392
- * Similar to {@link #getVariable(String)}, but returns a {@link VariableInstance} instance, which contains more information than just the value.
393
- * @param variableName The name of the variable to retrieve.
394
- * @returns The {@link VariableInstance} object (Java type), or `null`.
705
+ * Indication of how important/urgent this task is with a number between 0 and 100 where higher values mean a higher priority and lower values mean lower priority: [0..19] lowest, [20..39] low,
706
+ * [40..59] normal, [60..79] high [80..100] highest
707
+ *
708
+ * @returns the priority of the current task.
395
709
  */
396
- getVariableInstance(variableName) {
397
- return this.execution.getVariableInstance(variableName);
710
+ getPriority() {
711
+ return this.task.getPriority();
398
712
  }
399
713
  /**
400
- * Returns the value for the specific variable and only checks this scope and not any parent scope.
401
- * @param variableName The name of the local variable to retrieve.
402
- * @returns The value of the local variable (`any`), or `null` if not found locally.
714
+ * Indication of how important/urgent this task is with a number between 0 and 100 where higher values mean a higher priority and lower values mean lower priority: [0..19] lowest, [20..39] low,
715
+ * [40..59] normal, [60..79] high [80..100] highest
716
+ *
717
+ * @param priority the new priority for the task, with a number between 0 and 100 where higher values mean a higher priority and lower values mean lower priority: [0..19] lowest, [20..39] low, [40..59] normal,
403
718
  */
404
- getVariableLocal(variableName) {
405
- return import_values.Values.parseValue(this.execution.getVariableLocal(variableName));
719
+ setPriority(priority) {
720
+ this.task.setPriority(priority);
406
721
  }
407
722
  /**
408
- * Similar to {@link #getVariableLocal(String)}, but returns an instance of {@link VariableInstance}, which has some additional information beyond the value.
409
- * @param variableName The name of the local variable to retrieve.
410
- * @returns The local {@link VariableInstance} object (Java type), or `null`.
723
+ * Refrence to the process instance this task is associated with, or `null` if the task is not related to a process instance.
724
+ *
725
+ * @returns the ID of the process instance this task is associated with, or `null`.
411
726
  */
412
- getVariableInstanceLocal(variableName) {
413
- return this.execution.getVariableInstanceLocal(variableName);
727
+ getProcessInstanceId() {
728
+ return this.task.getProcessInstanceId();
414
729
  }
415
730
  /**
416
- * Returns all the names of the variables for this scope and all parent scopes.
417
- * @returns A Set of all variable names (`string`).
731
+ * Reference to the path of execution this task is associated with, or `null` if the task is not related to a process instance.
732
+ *
733
+ * @returns the ID of the execution this task is associated with, or `null`.
418
734
  */
419
- getVariableNames() {
420
- const variableNames = /* @__PURE__ */ new Set();
421
- for (const next of this.execution.getVariableNames().toArray()) {
422
- variableNames.add(next);
423
- }
424
- return variableNames;
735
+ getExecutionId() {
736
+ return this.task.getExecutionId();
425
737
  }
426
738
  /**
427
- * Returns all the names of the variables for this scope (no parent scopes).
428
- * @returns A Set of local variable names (`string`).
739
+ * Reference to the process definition this task is associated with, or `null` if the task is not related to a process instance.
740
+ *
741
+ * @returns the ID of the process definition this task is associated with, or `null`.
429
742
  */
430
- getVariableNamesLocal() {
431
- const variableNamesLocal = /* @__PURE__ */ new Set();
432
- for (const next of this.execution.getVariableNamesLocal().toArray()) {
433
- variableNamesLocal.add(next);
434
- }
435
- return variableNamesLocal;
743
+ getProcessDefinitionId() {
744
+ return this.task.getProcessDefinitionId();
436
745
  }
437
746
  /**
438
- * Sets the variable with the provided name to the provided value. It checks parent scopes for an existing variable before setting on the current scope.
439
- * @param variableName The name of the variable to be set.
440
- * @param value The value of the variable to be set (`any`).
747
+ * The current state of the task.
748
+ *
749
+ * @returns the state of the current task.
441
750
  */
442
- setVariable(variableName, value) {
443
- this.execution.setVariable(variableName, import_values.Values.stringifyValue(value));
751
+ getState() {
752
+ return this.task.getState();
444
753
  }
445
754
  /**
446
- * Similar to {@link #setVariable(String, Object)}, but the variable is set to this scope specifically (local variable).
447
- * @param variableName The name of the variable to be set locally.
448
- * @param value The value of the variable to be set (`any`).
449
- * @returns The old value of the local variable (Java type), or `null`.
755
+ * The date/time when this task was created.
756
+ *
757
+ * @returns the creation time of the current task.
450
758
  */
451
- setVariableLocal(variableName, value) {
452
- return this.execution.setVariableLocal(variableName, import_values.Values.stringifyValue(value));
759
+ getCreateTime() {
760
+ return this.task.getCreateTime();
453
761
  }
454
762
  /**
455
- * Sets the provided variables to the variable scope, using the default scoping algorithm.
456
- * @param variables A map of keys (`string`) and values (`any`) for the variables to be set.
763
+ * The date/time when this task was put in progress.
764
+ *
765
+ * @returns the in progress start time of the current task.
457
766
  */
458
- setVariables(variables) {
459
- for (const [key, value] of variables) {
460
- variables.set(key, import_values.Values.stringifyValue(value));
461
- }
462
- this.execution.setVariables(variables);
767
+ getInProgressStartTime() {
768
+ return this.task.getInProgressStartTime();
463
769
  }
464
770
  /**
465
- * Similar to {@link #setVariables(Map)}, but the variables are set on this scope specifically (local variables).
466
- * @param variables A map of keys (`string`) and values (`any`) for the local variables to be set.
771
+ * The user reference that started the task.
772
+ *
773
+ * @returns the user reference that started the task.
467
774
  */
468
- setVariablesLocal(variables) {
469
- for (const [key, value] of variables) {
470
- variables.set(key, import_values.Values.stringifyValue(value));
471
- }
472
- this.execution.setVariablesLocal(variables);
775
+ getInProgressStartedBy() {
776
+ return this.task.getInProgressStartedBy();
473
777
  }
474
778
  /**
475
- * Returns whether this scope or any parent scope has variables.
476
- * @returns `true` if variables exist in scope hierarchy, `false` otherwise.
779
+ * The date/time when this task was claimed.
780
+ *
781
+ * @returns the claim time of the current task.
477
782
  */
478
- hasVariables() {
479
- return this.execution.hasVariables();
783
+ getClaimTime() {
784
+ return this.task.getClaimTime();
480
785
  }
481
786
  /**
482
- * Returns whether this scope has variables.
483
- * @returns `true` if local variables exist, `false` otherwise.
787
+ * The user reference that claimed the task.
788
+ *
789
+ * @returns the user reference that claimed the task.
484
790
  */
485
- hasVariablesLocal() {
486
- return this.execution.hasVariablesLocal();
791
+ getClaimedBy() {
792
+ return this.task.getClaimedBy();
487
793
  }
488
794
  /**
489
- * Returns whether this scope or any parent scope has a specific variable.
490
- * @param variableName The name of the variable to check.
491
- * @returns `true` if the variable is found in the scope hierarchy, `false` otherwise.
795
+ * The date/time when this task was suspended.
796
+ *
797
+ * @returns the date/time when this task was suspended.
492
798
  */
493
- hasVariable(variableName) {
494
- return this.execution.hasVariable(variableName);
799
+ getSuspendedTime() {
800
+ return this.task.getSuspendedTime();
495
801
  }
496
802
  /**
497
- * Returns whether this scope has a specific variable.
498
- * @param variableName The name of the local variable to check.
499
- * @returns `true` if the variable is found locally, `false` otherwise.
803
+ * The user reference that suspended the task.
804
+ *
805
+ * @returns the user reference that suspended the task.
500
806
  */
501
- hasVariableLocal(variableName) {
502
- return this.execution.hasVariableLocal(variableName);
807
+ getSuspendedBy() {
808
+ return this.task.getSuspendedBy();
503
809
  }
504
810
  /**
505
- * Removes the variable from the process instance and creates a new HistoricVariableUpdate. Searches up the scope hierarchy.
506
- * @param variableName The name of the variable to remove.
811
+ * The id of the activity in the process defining this task or null if this is not related to a process.
812
+ *
813
+ * @returns the task definition key.
507
814
  */
508
- removeVariable(variableName) {
509
- this.execution.removeVariable(variableName);
815
+ getTaskDefinitionKey() {
816
+ return this.task.getTaskDefinitionKey();
510
817
  }
511
818
  /**
512
- * Removes the local variable and creates a new HistoricVariableUpdate.
513
- * @param variableName The name of the local variable to remove.
819
+ * Indicated whether this task is suspended or not.
820
+ *
821
+ * @returns `true` if the task is suspended, `false` otherwise.
514
822
  */
515
- removeVariableLocal(variableName) {
516
- this.execution.removeVariableLocal(variableName);
823
+ isSuspended() {
824
+ return this.task.isSuspended();
517
825
  }
518
826
  /**
519
- * Removes the variables and creates a new HistoricVariableUpdate for each of them. Searches up the scope hierarchy.
520
- * @param variableNames An array of variable names (`string[]`) to remove.
827
+ * The tenant identifier of this task, which is the same as the tenant identifier of the process definition and process instance this task is associated with (if any).
828
+ *
829
+ * @returns the tenant ID of this task, or `null`/empty string if no tenant is associated.
521
830
  */
522
- removeVariables(variableNames) {
523
- this.execution.removeVariables(variableNames);
831
+ getTenantId() {
832
+ return this.task.getTenantId();
524
833
  }
525
834
  /**
526
- * Removes the local variables and creates a new HistoricVariableUpdate for each of them.
527
- * @param variableNames An array of local variable names (`string[]`) to remove.
835
+ * The form key for the user task, which is the same as the form key defined on the user task in the process definition. Will return `null` if this task is not a user task or if no form key is defined.
836
+ *
837
+ * @returns the form key for the user task, or `null` if no form key is defined.
528
838
  */
529
- removeVariablesLocal(variableNames) {
530
- this.execution.removeVariablesLocal(variableNames);
839
+ getFormKey() {
840
+ return this.task.getFormKey();
531
841
  }
532
842
  /**
533
- * Sets a transient variable using the default scoping mechanism (up the hierarchy). Transient variables have no history and are cleared at wait states.
534
- * @param variableName The name of the transient variable.
535
- * @param variableValue The value of the transient variable (`any`).
843
+ * Change the form key of the task.
844
+ *
845
+ * @param formKey the new form key for the user task, or `null` to remove the form key
536
846
  */
537
- setTransientVariable(variableName, variableValue) {
538
- this.execution.setTransientVariable(variableName, import_values.Values.stringifyValue(variableValue));
847
+ setFormKey(formKey) {
848
+ this.task.setFormKey(formKey);
539
849
  }
540
850
  /**
541
- * Sets a local transient variable. Transient variables have no history and are cleared at wait states.
542
- * @param variableName The name of the local transient variable.
543
- * @param variableValue The value of the local transient variable (`any`).
851
+ * The event name which triggered the task listener to fire for this task. Will return `null`/empty string if not executing a task listener.
852
+ *
853
+ * @returns the event name which triggered the task listener to fire for this task, or `null`/empty string if not executing a task listener.
544
854
  */
545
- setTransientVariableLocal(variableName, variableValue) {
546
- this.execution.setTransientVariableLocal(variableName, import_values.Values.stringifyValue(variableValue));
855
+ getEventName() {
856
+ return this.task.getEventName();
547
857
  }
548
858
  /**
549
- * Sets multiple transient variables using the default scoping mechanism (up the hierarchy).
550
- * @param transientVariables A map of keys (`string`) and values (`any`) for the transient variables to be set.
859
+ * The event handler identifier which triggered the task listener to fire for this task. Will return `null`/empty string if not executing a task listener or if the event handler does not have an identifier.
860
+ *
861
+ * @returns the event handler identifier, or `null`/empty string if not executing a task listener or if the event handler does not have an identifier.
551
862
  */
552
- setTransientVariables(transientVariables) {
553
- for (const [key, value] of transientVariables) {
554
- transientVariables.set(key, import_values.Values.stringifyValue(value));
555
- }
556
- this.execution.setTransientVariables(transientVariables);
863
+ getEventHandlerId() {
864
+ return this.task.getEventHandlerId();
557
865
  }
558
866
  /**
559
- * Retrieves the value of a transient variable, searching up the parent scopes.
560
- * @param variableName The name of the transient variable to retrieve.
561
- * @returns The value of the transient variable (`any`), or `null` if not found.
867
+ * The current delegation state of the task, which is `null` if the task is not delegated, `PENDING` if the task is delegated and waiting for resolution by the assignee, and `RESOLVED` if the task is delegated and has been resolved by the assignee but not yet completed by the owner.
868
+ *
869
+ * @returns the delegation state of the task, which is `null` if the task is not delegated, `PENDING` if the task is delegated and waiting for resolution by the assignee, and `RESOLVED` if the task is delegated and has been resolved by the assignee but not yet completed by the owner.
562
870
  */
563
- getTransientVariable(variableName) {
564
- return import_values.Values.parseValue(this.execution.getTransientVariable(variableName));
871
+ getDelegationState() {
872
+ return this.task.getDelegationState();
565
873
  }
566
874
  /**
567
- * Retrieves all transient variables in the current scope hierarchy.
568
- * @returns A Map of transient variable names (`string`) to values (`any`).
875
+ * Adds a candidate user to this task, which means that the user is allowed to claim and work on this task. This does not mean that the user is the assignee of the task, but it means that the user is a candidate to become an assignee. The user will be able to see this task in their task list and claim it to become the assignee.
876
+ *
877
+ * @param userId the user ID of the candidate user to add to this task.
569
878
  */
570
- getTransientVariables() {
571
- const transientVariables = this.execution.getTransientVariables();
572
- for (const [key, value] of transientVariables) {
573
- transientVariables.set(key, import_values.Values.parseValue(value));
574
- }
575
- return transientVariables;
879
+ addCandidateUser(userId) {
880
+ this.task.addCandidateUser(userId);
576
881
  }
577
882
  /**
578
- * Sets multiple local transient variables.
579
- * @param transientVariables A map of keys (`string`) and values (`any`) for the local transient variables to be set.
883
+ * Adds multiple users as candidate user to this task.
884
+ *
885
+ * @param candidateUsers the collection of candidate user IDs to add to this task.
580
886
  */
581
- setTransientVariablesLocal(transientVariables) {
582
- for (const [key, value] of transientVariables) {
583
- transientVariables.set(key, import_values.Values.stringifyValue(value));
584
- }
585
- this.execution.setTransientVariablesLocal(transientVariables);
887
+ addCandidateUsers(candidateUsers) {
888
+ this.task.addCandidateUsers(candidateUsers);
586
889
  }
587
890
  /**
588
- * Retrieves the value of a local transient variable.
589
- * @param variableName The name of the local transient variable to retrieve.
590
- * @returns The value of the local transient variable (`any`), or `null` if not found.
891
+ * Adds a candidate group to this task, which means that all users that are members of this group are allowed to claim and work on this task. This does not mean that the group is the assignee of the task, but it means that all users that are members of the group are candidates to become assignees. The users that are members of the group will be able to see this task in their task list and claim it to become the assignee.
892
+ *
893
+ * @param groupId the group ID of the candidate group to add to this task.
591
894
  */
592
- getTransientVariableLocal(variableName) {
593
- return import_values.Values.parseValue(this.execution.getTransientVariableLocal(variableName));
895
+ addCandidateGroup(groupId) {
896
+ this.task.addCandidateGroup(groupId);
594
897
  }
595
898
  /**
596
- * Retrieves all local transient variables.
597
- * @returns A Map of local transient variable names (`string`) to values (`any`).
899
+ * Adds multiple groups as candidate group to this task.
900
+ *
901
+ * @param candidateGroups the collection of candidate group IDs to add to this task.
598
902
  */
599
- getTransientVariablesLocal() {
600
- const transientVariablesLocal = this.execution.getTransientVariablesLocal();
601
- for (const [key, value] of transientVariablesLocal) {
602
- transientVariablesLocal.set(key, import_values.Values.parseValue(value));
603
- }
604
- return transientVariablesLocal;
903
+ addCandidateGroups(candidateGroups) {
904
+ this.task.addCandidateGroups(candidateGroups);
605
905
  }
606
906
  /**
607
- * Removes a specific local transient variable.
608
- * @param variableName The name of the local transient variable to remove.
907
+ * The user id of the person responsible for this task. This is the user that has to work on this task and complete it. When a task is assigned to a user, that user becomes the assignee of the task. The assignee is the only one that can complete the task (unless the task is delegated
908
+ *
909
+ * @returns the user ID of the assignee of this task
609
910
  */
610
- removeTransientVariableLocal(variableName) {
611
- this.execution.removeTransientVariableLocal(variableName);
911
+ getOwner() {
912
+ return this.task.getOwner();
612
913
  }
613
914
  /**
614
- * Removes a specific transient variable, searching up the scope hierarchy.
615
- * @param variableName The name of the transient variable to remove.
915
+ * The user id of the person responsible for this task. This is the user that has to work on this task and complete it. When a task is assigned to a user, that user becomes the assignee of the task. The assignee is the only one that can complete the task (unless the task is delegated
916
+ *
917
+ * @param owner the user ID of the assignee of this task
616
918
  */
617
- removeTransientVariable(variableName) {
618
- this.execution.removeTransientVariable(variableName);
919
+ setOwner(owner) {
920
+ this.task.setOwner(owner);
619
921
  }
620
922
  /**
621
- * Remove all transient variables of this scope and its parent scopes.
923
+ * The user id of the person to which this task is delegated.
924
+ *
925
+ * @returns the user ID of the assignee of this task
622
926
  */
623
- removeTransientVariables() {
624
- this.execution.removeTransientVariables();
927
+ getAssignee() {
928
+ return this.task.getAssignee();
625
929
  }
626
930
  /**
627
- * Removes all local transient variables.
931
+ * The user id of the person to which this task is delegated.
932
+ * @param assignee the user ID of the assignee of this task
628
933
  */
629
- removeTransientVariablesLocal() {
630
- this.execution.removeTransientVariablesLocal();
934
+ setAssignee(assignee) {
935
+ this.task.setAssignee(assignee);
936
+ }
937
+ /**
938
+ * Due date of the in progress start of the task.
939
+ *
940
+ * @returns the due date of the in progress start of the task.
941
+ */
942
+ getInProgressStartDueDate() {
943
+ return this.task.getInProgressStartDueDate();
944
+ }
945
+ /**
946
+ * Change the in progress start due date of the task.
947
+ *
948
+ * @param inProgressStartDueDate the new due date of the in progress start of the task.
949
+ */
950
+ setInProgressStartDueDate(inProgressStartDueDate) {
951
+ this.task.setInProgressStartDueDate(inProgressStartDueDate);
952
+ }
953
+ /**
954
+ * Due date of the task.
955
+ *
956
+ * @returns the due date of the task.
957
+ */
958
+ getDueDate() {
959
+ return this.task.getDueDate();
960
+ }
961
+ /**
962
+ * Change the due date of the task.
963
+ *
964
+ * @param dueDate the new due date of the task.
965
+ */
966
+ setDueDate(dueDate) {
967
+ this.task.setDueDate(dueDate);
968
+ }
969
+ /**
970
+ * The category of the task. This is an optional field and allows to 'tag' tasks as belonging to a certain category.
971
+ *
972
+ * @returns the category of the task
973
+ */
974
+ getCategory() {
975
+ return this.task.getCategory();
976
+ }
977
+ /**
978
+ * Change the category of the task. This is an optional field and allows to 'tag' tasks as belonging to a certain category.
979
+ *
980
+ * @param category the new category of the task
981
+ */
982
+ setCategory(category) {
983
+ this.task.setCategory(category);
984
+ }
985
+ /**
986
+ * Involves a user with a task. The type of identity link is defined by the given identityLinkType.
987
+ *
988
+ * @param userId
989
+ * id of the user involve, cannot be null.
990
+ * @param identityLinkType
991
+ * type of identityLink, cannot be null (@see {@link IdentityLinkType}).
992
+ * @throws FlowableObjectNotFoundException
993
+ * when the task or user doesn't exist.
994
+ */
995
+ addUserIdentityLink(userId, identityLinkType) {
996
+ this.task.addUserIdentityLink(userId, identityLinkType);
997
+ }
998
+ /**
999
+ * Involves a group with group task. The type of identityLink is defined by the given identityLink.
1000
+ *
1001
+ * @param groupId
1002
+ * id of the group to involve, cannot be null.
1003
+ * @param identityLinkType
1004
+ * type of identity, cannot be null (@see {@link IdentityLinkType}).
1005
+ * @throws FlowableObjectNotFoundException
1006
+ * when the task or group doesn't exist.
1007
+ */
1008
+ addGroupIdentityLink(groupId, identityLinkType) {
1009
+ this.task.addGroupIdentityLink(groupId, identityLinkType);
1010
+ }
1011
+ /**
1012
+ * Convenience shorthand for {@link #deleteUserIdentityLink(String, String)} ; with type {@link IdentityLinkType#CANDIDATE}
1013
+ *
1014
+ * @param userId
1015
+ * id of the user to use as candidate, cannot be null.
1016
+ * @throws FlowableObjectNotFoundException
1017
+ * when the task or user doesn't exist.
1018
+ */
1019
+ deleteCandidateUser(userId) {
1020
+ this.task.deleteCandidateUser(userId);
1021
+ }
1022
+ /**
1023
+ * Convenience shorthand for {@link #deleteGroupIdentityLink(String, String)}; with type {@link IdentityLinkType#CANDIDATE}
1024
+ *
1025
+ * @param groupId
1026
+ * id of the group to use as candidate, cannot be null.
1027
+ * @throws FlowableObjectNotFoundException
1028
+ * when the task or group doesn't exist.
1029
+ */
1030
+ deleteCandidateGroup(groupId) {
1031
+ this.task.deleteCandidateGroup(groupId);
1032
+ }
1033
+ /**
1034
+ * Removes the association between a user and a task for the given identityLinkType.
1035
+ *
1036
+ * @param userId
1037
+ * id of the user involve, cannot be null.
1038
+ * @param identityLinkType
1039
+ * type of identityLink, cannot be null (@see {@link IdentityLinkType}).
1040
+ * @throws FlowableObjectNotFoundException
1041
+ * when the task or user doesn't exist.
1042
+ */
1043
+ deleteUserIdentityLink(userId, identityLinkType) {
1044
+ this.task.deleteUserIdentityLink(userId, identityLinkType);
1045
+ }
1046
+ /**
1047
+ * Removes the association between a group and a task for the given identityLinkType.
1048
+ *
1049
+ * @param groupId
1050
+ * id of the group to involve, cannot be null.
1051
+ * @param identityLinkType
1052
+ * type of identity, cannot be null (@see {@link IdentityLinkType}).
1053
+ * @throws FlowableObjectNotFoundException
1054
+ * when the task or group doesn't exist.
1055
+ */
1056
+ deleteGroupIdentityLink(groupId, identityLinkType) {
1057
+ this.task.deleteGroupIdentityLink(groupId, identityLinkType);
1058
+ }
1059
+ /**
1060
+ * Retrieves the candidate users and groups associated with the task.
1061
+ *
1062
+ * @return set of {@link IdentityLink}s of type {@link IdentityLinkType#CANDIDATE}.
1063
+ */
1064
+ getCandidates() {
1065
+ return this.task.getCandidates();
631
1066
  }
632
1067
  }
633
1068
  if (typeof module !== "undefined") {
634
1069
  module.exports = Process;
635
1070
  }
636
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2JwbS9wcm9jZXNzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEFQSSBQcm9jZXNzXG4gKiAqIFByb3ZpZGVzIG1ldGhvZHMgZm9yIGludGVyYWN0aW5nIHdpdGggcHJvY2VzcyBpbnN0YW5jZXMsXG4gKiBpbmNsdWRpbmcgc3RhcnRpbmcsIHVwZGF0aW5nIG1ldGFkYXRhLCBhbmQgbWFuYWdpbmcgdmFyaWFibGVzLlxuICovXG5cbmltcG9ydCB7IFZhbHVlcyB9IGZyb20gXCJAYWVyb2tpdC9zZGsvYnBtL3ZhbHVlc1wiO1xuXG5jb25zdCBCcG1GYWNhZGUgPSBKYXZhLnR5cGUoXCJvcmcuZWNsaXBzZS5kaXJpZ2libGUuY29tcG9uZW50cy5hcGkuYnBtLkJwbUZhY2FkZVwiKTtcblxuZXhwb3J0IGNsYXNzIFByb2Nlc3Mge1xuXG5cdC8qKlxuXHQgKiBTdGFydHMgYSBuZXcgcHJvY2VzcyBpbnN0YW5jZSBmb3IgYSBnaXZlbiBwcm9jZXNzIGRlZmluaXRpb24ga2V5LlxuXHQgKlxuXHQgKiBAcGFyYW0ga2V5IFRoZSBwcm9jZXNzIGRlZmluaXRpb24ga2V5IChJRCkgb2YgdGhlIHByb2Nlc3MgdG8gc3RhcnQuXG5cdCAqIEBwYXJhbSBidXNpbmVzc0tleSBBbiBvcHRpb25hbCBidXNpbmVzcyBrZXkgdG8gYXNzb2NpYXRlIHdpdGggdGhlIHByb2Nlc3MgaW5zdGFuY2UuIERlZmF1bHRzIHRvIGFuIGVtcHR5IHN0cmluZy5cblx0ICogQHBhcmFtIHBhcmFtZXRlcnMgQW4gb3B0aW9uYWwgbWFwIG9mIHByb2Nlc3MgdmFyaWFibGVzIHRvIHBhc3MgdG8gdGhlIHByb2Nlc3MgaW5zdGFuY2UgdXBvbiBzdGFydGluZy4gRGVmYXVsdHMgdG8gYW4gZW1wdHkgb2JqZWN0LlxuXHQgKiBAcmV0dXJucyBUaGUgdW5pcXVlIElEIG9mIHRoZSBuZXdseSBzdGFydGVkIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHN0YXJ0KGtleTogc3RyaW5nLCBidXNpbmVzc0tleTogc3RyaW5nID0gJycsIHBhcmFtZXRlcnM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fSk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIEJwbUZhY2FkZS5zdGFydFByb2Nlc3Moa2V5LCBidXNpbmVzc0tleSwgSlNPTi5zdHJpbmdpZnkocGFyYW1ldGVycykpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgYSBodW1hbi1yZWFkYWJsZSBuYW1lIGZvciBhbiBleGlzdGluZyBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gcHJvY2Vzc0luc3RhbmNlSWQgVGhlIElEIG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRvIHVwZGF0ZS5cblx0ICogQHBhcmFtIG5hbWUgVGhlIG5ldyBuYW1lIGZvciB0aGUgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgc2V0UHJvY2Vzc0luc3RhbmNlTmFtZShwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nLCBuYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUuc2V0UHJvY2Vzc0luc3RhbmNlTmFtZShwcm9jZXNzSW5zdGFuY2VJZCwgbmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgYnVzaW5lc3Mga2V5IG9mIGFuIGV4aXN0aW5nIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdG8gdXBkYXRlLlxuXHQgKiBAcGFyYW0gYnVzaW5lc3NLZXkgVGhlIG5ldyBidXNpbmVzcyBrZXkuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHVwZGF0ZUJ1c2luZXNzS2V5KHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIGJ1c2luZXNzS2V5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUudXBkYXRlQnVzaW5lc3NLZXkocHJvY2Vzc0luc3RhbmNlSWQsIGJ1c2luZXNzS2V5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBidXNpbmVzcyBzdGF0dXMgb2YgYW4gZXhpc3RpbmcgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0byB1cGRhdGUuXG5cdCAqIEBwYXJhbSBidXNpbmVzc1N0YXR1cyBUaGUgbmV3IGJ1c2luZXNzIHN0YXR1cy5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgdXBkYXRlQnVzaW5lc3NTdGF0dXMocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgYnVzaW5lc3NTdGF0dXM6IHN0cmluZyk6IHZvaWQge1xuXHRcdEJwbUZhY2FkZS51cGRhdGVCdXNpbmVzc1N0YXR1cyhwcm9jZXNzSW5zdGFuY2VJZCwgYnVzaW5lc3NTdGF0dXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSBzcGVjaWZpYyB2YXJpYWJsZSBmcm9tIGEgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUsIG9yIGBudWxsYCBpZiB0aGUgdmFyaWFibGUgZG9lcyBub3QgZXhpc3QuIFRoZSB0eXBlIGlzIGBhbnlgIGFzIGl0IGRlcGVuZHMgb24gdGhlIHN0b3JlZCB2YWx1ZS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgZ2V0VmFyaWFibGUocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcpOiBhbnkge1xuXHRcdHJldHVybiBCcG1GYWNhZGUuZ2V0VmFyaWFibGUocHJvY2Vzc0luc3RhbmNlSWQsIHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIGFsbCB2YXJpYWJsZXMgYXNzb2NpYXRlZCB3aXRoIGEgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgYWxsIHZhcmlhYmxlcyBmb3IgdGhlIHByb2Nlc3MgaW5zdGFuY2UsIHdoZXJlIGtleXMgYXJlIHZhcmlhYmxlIG5hbWVzIGFuZCB2YWx1ZXMgYXJlIHRoZSB2YXJpYWJsZSB2YWx1ZXMuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGdldFZhcmlhYmxlcyhwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gQnBtRmFjYWRlLmdldFZhcmlhYmxlcyhwcm9jZXNzSW5zdGFuY2VJZCk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyBvciB1cGRhdGVzIHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlIGluIGEgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gc2V0LlxuXHQgKiBAcGFyYW0gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHZhcmlhYmxlLiBUaGUgdHlwZSBpcyBgYW55YCB0byBhY2NvbW1vZGF0ZSBkaWZmZXJlbnQgZGF0YSB0eXBlcy5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgc2V0VmFyaWFibGUocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUuc2V0VmFyaWFibGUocHJvY2Vzc0luc3RhbmNlSWQsIHZhcmlhYmxlTmFtZSwgdmFsdWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYSB2YXJpYWJsZSBmcm9tIGEgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gcmVtb3ZlLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyByZW1vdmVWYXJpYWJsZShwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nLCB2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdEJwbUZhY2FkZS5yZW1vdmVWYXJpYWJsZShwcm9jZXNzSW5zdGFuY2VJZCwgdmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb3JyZWxhdGVzIGEgbWVzc2FnZSBldmVudCB3aXRoIGEgcnVubmluZyBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gcHJvY2Vzc0luc3RhbmNlSWQgVGhlIElEIG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRvIGNvcnJlbGF0ZSB0aGUgbWVzc2FnZSB0by5cblx0ICogQHBhcmFtIG1lc3NhZ2VOYW1lIFRoZSBuYW1lIG9mIHRoZSBtZXNzYWdlIGV2ZW50IGRlZmluZWQgaW4gdGhlIEJQTU4gcHJvY2Vzcy5cblx0ICogQHBhcmFtIHZhcmlhYmxlcyBBIG1hcCBvZiB2YXJpYWJsZXMgKGBNYXA8c3RyaW5nLCBhbnk+YCkgdG8gcGFzcyBhbG9uZyB3aXRoIHRoZSBtZXNzYWdlIGV2ZW50LlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBjb3JyZWxhdGVNZXNzYWdlRXZlbnQocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgbWVzc2FnZU5hbWU6IHN0cmluZywgdmFyaWFibGVzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLmNvcnJlbGF0ZU1lc3NhZ2VFdmVudChwcm9jZXNzSW5zdGFuY2VJZCwgbWVzc2FnZU5hbWUsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZXNNYXAodmFyaWFibGVzKSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBjb250ZXh0IG9iamVjdCwgdHlwaWNhbGx5IHVzZWQgd2l0aGluIGFuIGV4ZWN1dGlvbiBsaXN0ZW5lciBvciBzZXJ2aWNlIHRhc2suXG5cdCAqXG5cdCAqIEByZXR1cm5zIEEgbmV3IGluc3RhbmNlIG9mIHRoZSBgRXhlY3V0aW9uQ29udGV4dGAgY29udGFpbmluZyBkZXRhaWxzIGFib3V0IHRoZSBjdXJyZW50IHByb2Nlc3MgZXhlY3V0aW9uIHBhdGguXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGdldEV4ZWN1dGlvbkNvbnRleHQoKSB7XG5cdFx0cmV0dXJuIG5ldyBFeGVjdXRpb25Db250ZXh0KCk7XG5cdH1cbn1cblxuLyoqXG4gKiBFeGVjdXRpb25Db250ZXh0IG9iamVjdFxuICogKiBQcm92aWRlcyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhbmQgY29udHJvbCBvdmVyIHRoZSBjdXJyZW50IHByb2Nlc3MgZXhlY3V0aW9uIHBhdGguXG4gKi9cbmNsYXNzIEV4ZWN1dGlvbkNvbnRleHQge1xuXG5cdHByaXZhdGUgZXhlY3V0aW9uOiBhbnk7XG5cblx0Y29uc3RydWN0b3IoKSB7XG5cdFx0dGhpcy5leGVjdXRpb24gPSBfX2NvbnRleHQuZ2V0KCdleGVjdXRpb24nKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVbmlxdWUgaWQgb2YgdGhpcyBwYXRoIG9mIGV4ZWN1dGlvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgaGFuZGxlIHRvIHByb3ZpZGUgZXh0ZXJuYWwgc2lnbmFscyBiYWNrIGludG8gdGhlIGVuZ2luZSBhZnRlciB3YWl0IHN0YXRlcy5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIHVuaXF1ZSBJRCBvZiB0aGUgY3VycmVudCBleGVjdXRpb24uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0SWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIG92ZXJhbGwgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogQHJldHVybnMgVGhlIElEIG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NJbnN0YW5jZUlkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlICdyb290JyBwcm9jZXNzIGluc3RhbmNlLiBXaGVuIHVzaW5nIGNhbGwgYWN0aXZpdHkgZm9yIGV4YW1wbGUsIHRoZSBwcm9jZXNzSW5zdGFuY2Ugc2V0IHdpbGwgbm90IGFsd2F5cyBiZSB0aGUgcm9vdC4gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgdG9wbW9zdCBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgSUQgb2YgdGhlIHJvb3QgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICovXG5cdHB1YmxpYyBnZXRSb290UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0Um9vdFByb2Nlc3NJbnN0YW5jZUlkKCk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjb250YWluIHRoZSBldmVudCBuYW1lIGluIGNhc2UgdGhpcyBleGVjdXRpb24gaXMgcGFzc2VkIGluIGZvciBhbiB7QGxpbmsgRXhlY3V0aW9uTGlzdGVuZXJ9LlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBldmVudCBuYW1lLCBvciBgbnVsbGAvZW1wdHkgc3RyaW5nIGlmIG5vdCBleGVjdXRpbmcgYW4gZXZlbnQgbGlzdGVuZXIuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXZlbnROYW1lKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEV2ZW50TmFtZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGN1cnJlbnQgZXZlbnQgKHR5cGljYWxseSB3aGVuIGV4ZWN1dGlvbiBhbiB7QGxpbmsgRXhlY3V0aW9uTGlzdGVuZXJ9KS5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG5cdCAqL1xuXHRwdWJsaWMgc2V0RXZlbnROYW1lKGV2ZW50TmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uc2V0RXZlbnROYW1lKGV2ZW50TmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGJ1c2luZXNzIGtleSBmb3IgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdGhpcyBleGVjdXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoLlxuXHQgKiBAcmV0dXJucyBUaGUgYnVzaW5lc3Mga2V5LlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzS2V5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzS2V5KCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGJ1c2luZXNzIHN0YXR1cyBmb3IgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdGhpcyBleGVjdXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoLlxuXHQgKiBAcmV0dXJucyBUaGUgYnVzaW5lc3Mgc3RhdHVzLlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzU3RhdHVzKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzU3RhdHVzKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHByb2Nlc3MgZGVmaW5pdGlvbiBrZXkgZm9yIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRoaXMgZXhlY3V0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aC5cblx0ICogQHJldHVybnMgVGhlIHByb2Nlc3MgZGVmaW5pdGlvbiBJRC5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NEZWZpbml0aW9uSWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJZiB0aGlzIGV4ZWN1dGlvbiBydW5zIGluIHRoZSBjb250ZXh0IG9mIGEgY2FzZSBhbmQgc3RhZ2UsIHRoaXMgbWV0aG9kIHJldHVybnMgaXQncyBjbG9zZXN0IHBhcmVudCBzdGFnZSBpbnN0YW5jZSBpZCAodGhlIHN0YWdlIHBsYW4gaXRlbSBpbnN0YW5jZSBpZCB0byBiZVxuXHQgKiBwcmVjaXNlKS5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIHN0YWdlIGluc3RhbmNlIGlkIHRoaXMgZXhlY3V0aW9uIGJlbG9uZ3MgdG8gb3IgYG51bGxgLCBpZiB0aGlzIGV4ZWN1dGlvbiBpcyBub3QgcGFydCBvZiBhIGNhc2UgYXQgYWxsIG9yIGlzIG5vdCBhIGNoaWxkIGVsZW1lbnQgb2YgYSBzdGFnZS5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9wYWdhdGVkU3RhZ2VJbnN0YW5jZUlkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb3BhZ2F0ZWRTdGFnZUluc3RhbmNlSWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBpZCBvZiB0aGUgcGFyZW50IG9mIHRoaXMgZXhlY3V0aW9uLiBJZiBudWxsLCB0aGUgZXhlY3V0aW9uIHJlcHJlc2VudHMgYSBwcm9jZXNzLWluc3RhbmNlLlxuXHQgKiBAcmV0dXJucyBUaGUgcGFyZW50IGV4ZWN1dGlvbiBJRCwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldFBhcmVudElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFBhcmVudElkKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgaWQgb2YgdGhlIGNhbGxpbmcgZXhlY3V0aW9uLiBJZiBub3QgbnVsbCwgdGhlIGV4ZWN1dGlvbiBpcyBwYXJ0IG9mIGEgc3VicHJvY2Vzcy5cblx0ICogQHJldHVybnMgVGhlIHN1cGVyIGV4ZWN1dGlvbiBJRCwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldFN1cGVyRXhlY3V0aW9uSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0U3VwZXJFeGVjdXRpb25JZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGlkIG9mIHRoZSBjdXJyZW50IGFjdGl2aXR5LlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBhY3Rpdml0eSBJRC5cblx0ICovXG5cdHB1YmxpYyBnZXRDdXJyZW50QWN0aXZpdHlJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5nZXRDdXJyZW50QWN0aXZpdHlJZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHRlbmFudCBpZCwgaWYgYW55IGlzIHNldCBiZWZvcmUgb24gdGhlIHByb2Nlc3MgZGVmaW5pdGlvbiBvciBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKiBAcmV0dXJucyBUaGUgdGVuYW50IElELCBvciBgbnVsbGAvZW1wdHkgc3RyaW5nLlxuXHQgKi9cblx0cHVibGljIGdldFRlbmFudElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFRlbmFudElkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIEJQTU4gZWxlbWVudCB3aGVyZSB0aGUgZXhlY3V0aW9uIGN1cnJlbnRseSBpcyBhdC5cblx0ICogQHJldHVybnMgVGhlIGN1cnJlbnQgZmxvdyBlbGVtZW50IG9iamVjdCAodHlwZSBpcyBKYXZhIG9iamVjdCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q3VycmVudEZsb3dFbGVtZW50KCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEN1cnJlbnRGbG93RWxlbWVudCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZSB0aGUgY3VycmVudCBCUE1OIGVsZW1lbnQgdGhlIGV4ZWN1dGlvbiBpcyBhdC5cblx0ICogQHBhcmFtIGZsb3dFbGVtZW50IFRoZSBuZXcgZmxvdyBlbGVtZW50IG9iamVjdCAoSmF2YSB0eXBlKS5cblx0ICovXG5cdHB1YmxpYyBzZXRDdXJyZW50Rmxvd0VsZW1lbnQoZmxvd0VsZW1lbnQ6IGFueSk6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnNldEN1cnJlbnRGbG93RWxlbWVudChmbG93RWxlbWVudCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUge0BsaW5rIEZsb3dhYmxlTGlzdGVuZXJ9IGluc3RhbmNlIG1hdGNoaW5nIGFuIHtAbGluayBFeGVjdXRpb25MaXN0ZW5lcn0gaWYgY3VycmVudGx5IGFuIGV4ZWN1dGlvbiBsaXN0ZW5lciBpcyBiZWluZyBleGVjdXRpb24uIFJldHVybnMgbnVsbCBvdGhlcndpc2UuXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IEZsb3dhYmxlIExpc3RlbmVyIG9iamVjdCAoSmF2YSB0eXBlKSwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldEN1cnJlbnRGbG93YWJsZUxpc3RlbmVyKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEN1cnJlbnRGbG93YWJsZUxpc3RlbmVyKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gYW4ge0BsaW5rIEV4ZWN1dGlvbkxpc3RlbmVyfSBpcyBiZWluZyBleGVjdXRlZC5cblx0ICogQHBhcmFtIGN1cnJlbnRMaXN0ZW5lciBUaGUgY3VycmVudCBsaXN0ZW5lciBvYmplY3QgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgc2V0Q3VycmVudEZsb3dhYmxlTGlzdGVuZXIoY3VycmVudExpc3RlbmVyOiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRDdXJyZW50Rmxvd2FibGVMaXN0ZW5lcihjdXJyZW50TGlzdGVuZXIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIHNuYXBzaG90IHJlYWQgb25seSBkZWxlZ2F0ZSBleGVjdXRpb24gb2YgdGhpcyBkZWxlZ2F0ZSBleGVjdXRpb24uXG5cdCAqXG5cdCAqIEByZXR1cm5zIEEge0BsaW5rIFJlYWRPbmx5RGVsZWdhdGVFeGVjdXRpb259IG9iamVjdCAoSmF2YSB0eXBlKS5cblx0ICovXG5cdHB1YmxpYyBzbmFwc2hvdFJlYWRPbmx5KCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLnNuYXBzaG90UmVhZE9ubHkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhpcyBleGVjdXRpb24sIG9yIG51bGwgaWYgdGhlcmUgbm8gcGFyZW50LlxuXHQgKiBAcmV0dXJucyBUaGUgcGFyZW50IGV4ZWN1dGlvbiBvYmplY3QgKEphdmEgdHlwZSksIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBnZXRQYXJlbnQoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0UGFyZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogcmV0dXJucyB0aGUgbGlzdCBvZiBleGVjdXRpb24gb2Ygd2hpY2ggdGhpcyBleGVjdXRpb24gdGhlIHBhcmVudCBvZi5cblx0ICogQHJldHVybnMgQW4gYXJyYXkgb2YgY2hpbGQgZXhlY3V0aW9uIG9iamVjdHMgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXhlY3V0aW9ucygpOiBhbnlbXSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEV4ZWN1dGlvbnMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBtYWtlcyB0aGlzIGV4ZWN1dGlvbiBhY3RpdmUgb3IgaW5hY3RpdmUuXG5cdCAqIEBwYXJhbSBpc0FjdGl2ZSBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBleGVjdXRpb24gc2hvdWxkIGJlIGFjdGl2ZS5cblx0ICovXG5cdHB1YmxpYyBzZXRBY3RpdmUoaXNBY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRBY3RpdmUoaXNBY3RpdmUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHJldHVybnMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBjdXJyZW50bHkgYWN0aXZlLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYWN0aXZlLCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBpc0FjdGl2ZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNBY3RpdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiByZXR1cm5zIHdoZXRoZXIgdGhpcyBleGVjdXRpb24gaGFzIGVuZGVkIG9yIG5vdC5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIGVuZGVkLCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBpc0VuZGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5pc0VuZGVkKCk7XG5cdH1cblxuXHQvKipcblx0ICogY2hhbmdlcyB0aGUgY29uY3VycmVudCBpbmRpY2F0b3Igb24gdGhpcyBleGVjdXRpb24uXG5cdCAqIEBwYXJhbSBpc0NvbmN1cnJlbnQgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZXhlY3V0aW9uIHNob3VsZCBiZSBjb25jdXJyZW50LlxuXHQgKi9cblx0cHVibGljIHNldENvbmN1cnJlbnQoaXNDb25jdXJyZW50OiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uc2V0Q29uY3VycmVudChpc0NvbmN1cnJlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHJldHVybnMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBjb25jdXJyZW50IG9yIG5vdC5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIGNvbmN1cnJlbnQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuXHQgKi9cblx0cHVibGljIGlzQ29uY3VycmVudCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNDb25jdXJyZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogcmV0dXJucyB3aGV0aGVyIHRoaXMgZXhlY3V0aW9uIGlzIGEgcHJvY2VzcyBpbnN0YW5jZSBvciBub3QuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCdzIGEgcHJvY2VzcyBpbnN0YW5jZSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNQcm9jZXNzSW5zdGFuY2VUeXBlKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5pc1Byb2Nlc3NJbnN0YW5jZVR5cGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmFjdGl2YXRlcyB0aGlzIGV4ZWN1dGlvbi4gVGhpcyBpcyB1c2VmdWwgZm9yIGV4YW1wbGUgaW4gYSBqb2luOiB0aGUgZXhlY3V0aW9uIHN0aWxsIGV4aXN0cywgYnV0IGl0IGlzIG5vdCBsb25nZXIgYWN0aXZlLlxuXHQgKi9cblx0cHVibGljIGluYWN0aXZhdGUoKTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uaW5hY3RpdmF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBhIHNjb3BlLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgaXQgaXMgYSBzY29wZSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNTY29wZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNTY29wZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBhIHNjb3BlIG9yIG5vdC5cblx0ICogQHBhcmFtIGlzU2NvcGUgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZXhlY3V0aW9uIHNob3VsZCBiZSBhIHNjb3BlLlxuXHQgKi9cblx0cHVibGljIHNldFNjb3BlKGlzU2NvcGU6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRTY29wZShpc1Njb3BlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBleGVjdXRpb24gaXMgdGhlIHJvb3Qgb2YgYSBtdWx0aSBpbnN0YW5jZSBleGVjdXRpb24uXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCdzIGEgbXVsdGkgaW5zdGFuY2Ugcm9vdCwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNNdWx0aUluc3RhbmNlUm9vdCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNNdWx0aUluc3RhbmNlUm9vdCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBhIG11bHRpIGluc3RhbmNlIHJvb3Qgb3Igbm90LlxuXHQgKiBAcGFyYW0gaXNNdWx0aUluc3RhbmNlUm9vdCBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBleGVjdXRpb24gaXMgdGhlIHJvb3Qgb2YgYSBtdWx0aS1pbnN0YW5jZSBleGVjdXRpb24uXG5cdCAqL1xuXHRwdWJsaWMgc2V0TXVsdGlJbnN0YW5jZVJvb3QoaXNNdWx0aUluc3RhbmNlUm9vdDogYm9vbGVhbik6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnNldE11bHRpSW5zdGFuY2VSb290KGlzTXVsdGlJbnN0YW5jZVJvb3QpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYWxsIHZhcmlhYmxlcy4gVGhpcyB3aWxsIGluY2x1ZGUgYWxsIHZhcmlhYmxlcyBvZiBwYXJlbnQgc2NvcGVzIHRvby5cblx0ICogQHJldHVybnMgQSBNYXAgb2YgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdgKSB0byB2YXJpYWJsZSB2YWx1ZXMgKGBhbnlgKS5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZXMoKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0Y29uc3QgdmFyaWFibGVzID0gdGhpcy5leGVjdXRpb24uZ2V0VmFyaWFibGVzKCk7XG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdmFyaWFibGVzKSB7XG5cdFx0XHR2YXJpYWJsZXMuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhcmlhYmxlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFsbCB2YXJpYWJsZXMsIGFzIGluc3RhbmNlcyBvZiB0aGUge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IGludGVyZmFjZSwgd2hpY2ggZ2l2ZXMgbW9yZSBpbmZvcm1hdGlvbiB0aGFuIG9ubHkgdGhlIHZhbHVlICh0eXBlLCBleGVjdXRpb24gaWQsIGV0Yy4pXG5cdCAqIEByZXR1cm5zIEEgTWFwIG9mIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkgdG8ge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IG9iamVjdHMgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVJbnN0YW5jZXMoKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFZhcmlhYmxlSW5zdGFuY2VzKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUgdmFyaWFibGUgbG9jYWwgdG8gdGhpcyBzY29wZSBvbmx5LiBTbywgaW4gY29udHJhcnkgdG8ge0BsaW5rICNnZXRWYXJpYWJsZXMoKX0sIHRoZSB2YXJpYWJsZXMgZnJvbSB0aGUgcGFyZW50IHNjb3BlIHdvbid0IGJlIHJldHVybmVkLlxuXHQgKiBAcmV0dXJucyBBIE1hcCBvZiB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ2ApIHRvIGxvY2FsIHZhcmlhYmxlIHZhbHVlcyAoYGFueWApLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlc0xvY2FsKCk6IE1hcDxzdHJpbmcsIGFueT4ge1xuXHRcdGNvbnN0IHZhcmlhYmxlc0xvY2FsID0gdGhpcy5leGVjdXRpb24uZ2V0VmFyaWFibGVzTG9jYWwoKTtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB2YXJpYWJsZXNMb2NhbCkge1xuXHRcdFx0dmFyaWFibGVzTG9jYWwuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhcmlhYmxlc0xvY2FsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHZhcmlhYmxlcyBsb2NhbCB0byB0aGlzIHNjb3BlIGFzIGluc3RhbmNlcyBvZiB0aGUge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IGludGVyZmFjZSwgd2hpY2ggcHJvdmlkZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFyaWFibGUuXG5cdCAqIEByZXR1cm5zIEEgTWFwIG9mIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkgdG8gbG9jYWwge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IG9iamVjdHMgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVJbnN0YW5jZXNMb2NhbCgpOiBNYXA8c3RyaW5nLCBhbnk+IHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0VmFyaWFibGVJbnN0YW5jZXNMb2NhbCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHZhcmlhYmxlIHZhbHVlIGZvciBvbmUgc3BlY2lmaWMgdmFyaWFibGUuIFdpbGwgbG9vayBpbiBwYXJlbnQgc2NvcGVzIHdoZW4gdGhlIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgcGFydGljdWxhciBzY29wZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgKGBhbnlgKSwgb3IgYG51bGxgIGlmIG5vdCBmb3VuZC5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZSh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlKHRoaXMuZXhlY3V0aW9uLmdldFZhcmlhYmxlKHZhcmlhYmxlTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNpbWlsYXIgdG8ge0BsaW5rICNnZXRWYXJpYWJsZShTdHJpbmcpfSwgYnV0IHJldHVybnMgYSB7QGxpbmsgVmFyaWFibGVJbnN0YW5jZX0gaW5zdGFuY2UsIHdoaWNoIGNvbnRhaW5zIG1vcmUgaW5mb3JtYXRpb24gdGhhbiBqdXN0IHRoZSB2YWx1ZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSB7QGxpbmsgVmFyaWFibGVJbnN0YW5jZX0gb2JqZWN0IChKYXZhIHR5cGUpLCBvciBgbnVsbGAuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVJbnN0YW5jZSh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFZhcmlhYmxlSW5zdGFuY2UodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmljIHZhcmlhYmxlIGFuZCBvbmx5IGNoZWNrcyB0aGlzIHNjb3BlIGFuZCBub3QgYW55IHBhcmVudCBzY29wZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgKGBhbnlgKSwgb3IgYG51bGxgIGlmIG5vdCBmb3VuZCBsb2NhbGx5LlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBhbnkge1xuXHRcdHJldHVybiBWYWx1ZXMucGFyc2VWYWx1ZSh0aGlzLmV4ZWN1dGlvbi5nZXRWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNpbWlsYXIgdG8ge0BsaW5rICNnZXRWYXJpYWJsZUxvY2FsKFN0cmluZyl9LCBidXQgcmV0dXJucyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgVmFyaWFibGVJbnN0YW5jZX0sIHdoaWNoIGhhcyBzb21lIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYmV5b25kIHRoZSB2YWx1ZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSBsb2NhbCB7QGxpbmsgVmFyaWFibGVJbnN0YW5jZX0gb2JqZWN0IChKYXZhIHR5cGUpLCBvciBgbnVsbGAuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVJbnN0YW5jZUxvY2FsKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0VmFyaWFibGVJbnN0YW5jZUxvY2FsKHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhbGwgdGhlIG5hbWVzIG9mIHRoZSB2YXJpYWJsZXMgZm9yIHRoaXMgc2NvcGUgYW5kIGFsbCBwYXJlbnQgc2NvcGVzLlxuXHQgKiBAcmV0dXJucyBBIFNldCBvZiBhbGwgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdgKS5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZU5hbWVzKCk6IFNldDxzdHJpbmc+IHtcblx0XHRjb25zdCB2YXJpYWJsZU5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cdFx0Zm9yIChjb25zdCBuZXh0IG9mIHRoaXMuZXhlY3V0aW9uLmdldFZhcmlhYmxlTmFtZXMoKS50b0FycmF5KCkpIHtcblx0XHRcdHZhcmlhYmxlTmFtZXMuYWRkKG5leHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFyaWFibGVOYW1lcztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFsbCB0aGUgbmFtZXMgb2YgdGhlIHZhcmlhYmxlcyBmb3IgdGhpcyBzY29wZSAobm8gcGFyZW50IHNjb3BlcykuXG5cdCAqIEByZXR1cm5zIEEgU2V0IG9mIGxvY2FsIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVOYW1lc0xvY2FsKCk6IFNldDxzdHJpbmc+IHtcblx0XHRjb25zdCB2YXJpYWJsZU5hbWVzTG9jYWwgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRmb3IgKGNvbnN0IG5leHQgb2YgdGhpcy5leGVjdXRpb24uZ2V0VmFyaWFibGVOYW1lc0xvY2FsKCkudG9BcnJheSgpKSB7XG5cdFx0XHR2YXJpYWJsZU5hbWVzTG9jYWwuYWRkKG5leHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFyaWFibGVOYW1lc0xvY2FsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIHZhcmlhYmxlIHdpdGggdGhlIHByb3ZpZGVkIG5hbWUgdG8gdGhlIHByb3ZpZGVkIHZhbHVlLiBJdCBjaGVja3MgcGFyZW50IHNjb3BlcyBmb3IgYW4gZXhpc3RpbmcgdmFyaWFibGUgYmVmb3JlIHNldHRpbmcgb24gdGhlIGN1cnJlbnQgc2NvcGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGJlIHNldC5cblx0ICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgdG8gYmUgc2V0IChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRWYXJpYWJsZSh2YXJpYWJsZU5hbWUsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YWx1ZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNpbWlsYXIgdG8ge0BsaW5rICNzZXRWYXJpYWJsZShTdHJpbmcsIE9iamVjdCl9LCBidXQgdGhlIHZhcmlhYmxlIGlzIHNldCB0byB0aGlzIHNjb3BlIHNwZWNpZmljYWxseSAobG9jYWwgdmFyaWFibGUpLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBiZSBzZXQgbG9jYWxseS5cblx0ICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgdG8gYmUgc2V0IChgYW55YCkuXG5cdCAqIEByZXR1cm5zIFRoZSBvbGQgdmFsdWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIChKYXZhIHR5cGUpLCBvciBgbnVsbGAuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLnNldFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFsdWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBwcm92aWRlZCB2YXJpYWJsZXMgdG8gdGhlIHZhcmlhYmxlIHNjb3BlLCB1c2luZyB0aGUgZGVmYXVsdCBzY29waW5nIGFsZ29yaXRobS5cblx0ICogQHBhcmFtIHZhcmlhYmxlcyBBIG1hcCBvZiBrZXlzIChgc3RyaW5nYCkgYW5kIHZhbHVlcyAoYGFueWApIGZvciB0aGUgdmFyaWFibGVzIHRvIGJlIHNldC5cblx0ICovXG5cdHB1YmxpYyBzZXRWYXJpYWJsZXModmFyaWFibGVzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdmFyaWFibGVzKSB7XG5cdFx0XHR2YXJpYWJsZXMuc2V0KGtleSwgVmFsdWVzLnN0cmluZ2lmeVZhbHVlKHZhbHVlKSk7XG5cdFx0fVxuXHRcdHRoaXMuZXhlY3V0aW9uLnNldFZhcmlhYmxlcyh2YXJpYWJsZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNpbWlsYXIgdG8ge0BsaW5rICNzZXRWYXJpYWJsZXMoTWFwKX0sIGJ1dCB0aGUgdmFyaWFibGVzIGFyZSBzZXQgb24gdGhpcyBzY29wZSBzcGVjaWZpY2FsbHkgKGxvY2FsIHZhcmlhYmxlcykuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZXMgQSBtYXAgb2Yga2V5cyAoYHN0cmluZ2ApIGFuZCB2YWx1ZXMgKGBhbnlgKSBmb3IgdGhlIGxvY2FsIHZhcmlhYmxlcyB0byBiZSBzZXQuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VmFyaWFibGVzTG9jYWwodmFyaWFibGVzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdmFyaWFibGVzKSB7XG5cdFx0XHR2YXJpYWJsZXMuc2V0KGtleSwgVmFsdWVzLnN0cmluZ2lmeVZhbHVlKHZhbHVlKSk7XG5cdFx0fVxuXHRcdHRoaXMuZXhlY3V0aW9uLnNldFZhcmlhYmxlc0xvY2FsKHZhcmlhYmxlcyk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2NvcGUgb3IgYW55IHBhcmVudCBzY29wZSBoYXMgdmFyaWFibGVzLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdmFyaWFibGVzIGV4aXN0IGluIHNjb3BlIGhpZXJhcmNoeSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaGFzVmFyaWFibGVzKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5oYXNWYXJpYWJsZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzY29wZSBoYXMgdmFyaWFibGVzLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbG9jYWwgdmFyaWFibGVzIGV4aXN0LCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZXNMb2NhbCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaGFzVmFyaWFibGVzTG9jYWwoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzY29wZSBvciBhbnkgcGFyZW50IHNjb3BlIGhhcyBhIHNwZWNpZmljIHZhcmlhYmxlLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBjaGVjay5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2YXJpYWJsZSBpcyBmb3VuZCBpbiB0aGUgc2NvcGUgaGllcmFyY2h5LCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZSh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5oYXNWYXJpYWJsZSh2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgd2hldGhlciB0aGlzIHNjb3BlIGhhcyBhIHNwZWNpZmljIHZhcmlhYmxlLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBsb2NhbCB2YXJpYWJsZSB0byBjaGVjay5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB2YXJpYWJsZSBpcyBmb3VuZCBsb2NhbGx5LCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmhhc1ZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRoZSB2YXJpYWJsZSBmcm9tIHRoZSBwcm9jZXNzIGluc3RhbmNlIGFuZCBjcmVhdGVzIGEgbmV3IEhpc3RvcmljVmFyaWFibGVVcGRhdGUuIFNlYXJjaGVzIHVwIHRoZSBzY29wZSBoaWVyYXJjaHkuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZSh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnJlbW92ZVZhcmlhYmxlKHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgbG9jYWwgdmFyaWFibGUgYW5kIGNyZWF0ZXMgYSBuZXcgSGlzdG9yaWNWYXJpYWJsZVVwZGF0ZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgdG8gcmVtb3ZlLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5yZW1vdmVWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgdmFyaWFibGVzIGFuZCBjcmVhdGVzIGEgbmV3IEhpc3RvcmljVmFyaWFibGVVcGRhdGUgZm9yIGVhY2ggb2YgdGhlbS4gU2VhcmNoZXMgdXAgdGhlIHNjb3BlIGhpZXJhcmNoeS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZXMgQW4gYXJyYXkgb2YgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdbXWApIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZXModmFyaWFibGVOYW1lczogc3RyaW5nW10pOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5yZW1vdmVWYXJpYWJsZXModmFyaWFibGVOYW1lcyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgbG9jYWwgdmFyaWFibGVzIGFuZCBjcmVhdGVzIGEgbmV3IEhpc3RvcmljVmFyaWFibGVVcGRhdGUgZm9yIGVhY2ggb2YgdGhlbS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZXMgQW4gYXJyYXkgb2YgbG9jYWwgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdbXWApIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZXNMb2NhbCh2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnJlbW92ZVZhcmlhYmxlc0xvY2FsKHZhcmlhYmxlTmFtZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgYSB0cmFuc2llbnQgdmFyaWFibGUgdXNpbmcgdGhlIGRlZmF1bHQgc2NvcGluZyBtZWNoYW5pc20gKHVwIHRoZSBoaWVyYXJjaHkpLiBUcmFuc2llbnQgdmFyaWFibGVzIGhhdmUgbm8gaGlzdG9yeSBhbmQgYXJlIGNsZWFyZWQgYXQgd2FpdCBzdGF0ZXMuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHRyYW5zaWVudCB2YXJpYWJsZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSB0cmFuc2llbnQgdmFyaWFibGUgKGBhbnlgKS5cblx0ICovXG5cdHB1YmxpYyBzZXRUcmFuc2llbnRWYXJpYWJsZSh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFyaWFibGVWYWx1ZTogYW55KTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uc2V0VHJhbnNpZW50VmFyaWFibGUodmFyaWFibGVOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFyaWFibGVWYWx1ZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgYSBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUuIFRyYW5zaWVudCB2YXJpYWJsZXMgaGF2ZSBubyBoaXN0b3J5IGFuZCBhcmUgY2xlYXJlZCBhdCB3YWl0IHN0YXRlcy5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVWYWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZSAoYGFueWApLlxuXHQgKi9cblx0cHVibGljIHNldFRyYW5zaWVudFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhcmlhYmxlVmFsdWU6IGFueSk6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnNldFRyYW5zaWVudFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFyaWFibGVWYWx1ZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgbXVsdGlwbGUgdHJhbnNpZW50IHZhcmlhYmxlcyB1c2luZyB0aGUgZGVmYXVsdCBzY29waW5nIG1lY2hhbmlzbSAodXAgdGhlIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSB0cmFuc2llbnRWYXJpYWJsZXMgQSBtYXAgb2Yga2V5cyAoYHN0cmluZ2ApIGFuZCB2YWx1ZXMgKGBhbnlgKSBmb3IgdGhlIHRyYW5zaWVudCB2YXJpYWJsZXMgdG8gYmUgc2V0LlxuXHQgKi9cblx0cHVibGljIHNldFRyYW5zaWVudFZhcmlhYmxlcyh0cmFuc2llbnRWYXJpYWJsZXM6IE1hcDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0cmFuc2llbnRWYXJpYWJsZXMpIHtcblx0XHRcdHRyYW5zaWVudFZhcmlhYmxlcy5zZXQoa2V5LCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0dGhpcy5leGVjdXRpb24uc2V0VHJhbnNpZW50VmFyaWFibGVzKHRyYW5zaWVudFZhcmlhYmxlcyk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhIHRyYW5zaWVudCB2YXJpYWJsZSwgc2VhcmNoaW5nIHVwIHRoZSBwYXJlbnQgc2NvcGVzLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB0cmFuc2llbnQgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgdHJhbnNpZW50IHZhcmlhYmxlIChgYW55YCksIG9yIGBudWxsYCBpZiBub3QgZm91bmQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VHJhbnNpZW50VmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBhbnkge1xuXHRcdHJldHVybiBWYWx1ZXMucGFyc2VWYWx1ZSh0aGlzLmV4ZWN1dGlvbi5nZXRUcmFuc2llbnRWYXJpYWJsZSh2YXJpYWJsZU5hbWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgYWxsIHRyYW5zaWVudCB2YXJpYWJsZXMgaW4gdGhlIGN1cnJlbnQgc2NvcGUgaGllcmFyY2h5LlxuXHQgKiBAcmV0dXJucyBBIE1hcCBvZiB0cmFuc2llbnQgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdgKSB0byB2YWx1ZXMgKGBhbnlgKS5cblx0ICovXG5cdHB1YmxpYyBnZXRUcmFuc2llbnRWYXJpYWJsZXMoKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0Y29uc3QgdHJhbnNpZW50VmFyaWFibGVzID0gdGhpcy5leGVjdXRpb24uZ2V0VHJhbnNpZW50VmFyaWFibGVzKCk7XG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdHJhbnNpZW50VmFyaWFibGVzKSB7XG5cdFx0XHR0cmFuc2llbnRWYXJpYWJsZXMuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRyYW5zaWVudFZhcmlhYmxlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIG11bHRpcGxlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZXMuXG5cdCAqIEBwYXJhbSB0cmFuc2llbnRWYXJpYWJsZXMgQSBtYXAgb2Yga2V5cyAoYHN0cmluZ2ApIGFuZCB2YWx1ZXMgKGBhbnlgKSBmb3IgdGhlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZXMgdG8gYmUgc2V0LlxuXHQgKi9cblx0cHVibGljIHNldFRyYW5zaWVudFZhcmlhYmxlc0xvY2FsKHRyYW5zaWVudFZhcmlhYmxlczogTWFwPHN0cmluZywgYW55Pik6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRyYW5zaWVudFZhcmlhYmxlcykge1xuXHRcdFx0dHJhbnNpZW50VmFyaWFibGVzLnNldChrZXksIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YWx1ZSkpO1xuXHRcdH1cblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRUcmFuc2llbnRWYXJpYWJsZXNMb2NhbCh0cmFuc2llbnRWYXJpYWJsZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZSB0byByZXRyaWV2ZS5cblx0ICogQHJldHVybnMgVGhlIHZhbHVlIG9mIHRoZSBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUgKGBhbnlgKSwgb3IgYG51bGxgIGlmIG5vdCBmb3VuZC5cblx0ICovXG5cdHB1YmxpYyBnZXRUcmFuc2llbnRWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gVmFsdWVzLnBhcnNlVmFsdWUodGhpcy5leGVjdXRpb24uZ2V0VHJhbnNpZW50VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgYWxsIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZXMuXG5cdCAqIEByZXR1cm5zIEEgTWFwIG9mIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ2ApIHRvIHZhbHVlcyAoYGFueWApLlxuXHQgKi9cblx0cHVibGljIGdldFRyYW5zaWVudFZhcmlhYmxlc0xvY2FsKCk6IE1hcDxzdHJpbmcsIGFueT4ge1xuXHRcdGNvbnN0IHRyYW5zaWVudFZhcmlhYmxlc0xvY2FsID0gdGhpcy5leGVjdXRpb24uZ2V0VHJhbnNpZW50VmFyaWFibGVzTG9jYWwoKTtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0cmFuc2llbnRWYXJpYWJsZXNMb2NhbCkge1xuXHRcdFx0dHJhbnNpZW50VmFyaWFibGVzTG9jYWwuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRyYW5zaWVudFZhcmlhYmxlc0xvY2FsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYSBzcGVjaWZpYyBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZSB0byByZW1vdmUuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlVHJhbnNpZW50VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnJlbW92ZVRyYW5zaWVudFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGEgc3BlY2lmaWMgdHJhbnNpZW50IHZhcmlhYmxlLCBzZWFyY2hpbmcgdXAgdGhlIHNjb3BlIGhpZXJhcmNoeS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdHJhbnNpZW50IHZhcmlhYmxlIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVUcmFuc2llbnRWYXJpYWJsZSh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnJlbW92ZVRyYW5zaWVudFZhcmlhYmxlKHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlIGFsbCB0cmFuc2llbnQgdmFyaWFibGVzIG9mIHRoaXMgc2NvcGUgYW5kIGl0cyBwYXJlbnQgc2NvcGVzLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVRyYW5zaWVudFZhcmlhYmxlcygpOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5yZW1vdmVUcmFuc2llbnRWYXJpYWJsZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGVzLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVRyYW5zaWVudFZhcmlhYmxlc0xvY2FsKCk6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnJlbW92ZVRyYW5zaWVudFZhcmlhYmxlc0xvY2FsKCk7XG5cdH1cblxufVxuXG4vLyBAdHMtaWdub3JlXG5pZiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcblx0Ly8gQHRzLWlnbm9yZVxuXHRtb2R1bGUuZXhwb3J0cyA9IFByb2Nlc3M7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQSxvQkFBdUI7QUFFdkIsTUFBTSxZQUFZLEtBQUssS0FBSyxvREFBb0Q7QUFFekUsTUFBTSxRQUFRO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVXBCLE9BQWMsTUFBTSxLQUFhLGNBQXNCLElBQUksYUFBcUMsQ0FBQyxHQUFXO0FBQzNHLFdBQU8sVUFBVSxhQUFhLEtBQUssYUFBYSxLQUFLLFVBQVUsVUFBVSxDQUFDO0FBQUEsRUFDM0U7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLE9BQWMsdUJBQXVCLG1CQUEyQixNQUFvQjtBQUNuRixjQUFVLHVCQUF1QixtQkFBbUIsSUFBSTtBQUFBLEVBQ3pEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxPQUFjLGtCQUFrQixtQkFBMkIsYUFBMkI7QUFDckYsY0FBVSxr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
1071
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2JwbS9wcm9jZXNzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEFQSSBQcm9jZXNzXG4gKiAqIFByb3ZpZGVzIG1ldGhvZHMgZm9yIGludGVyYWN0aW5nIHdpdGggcHJvY2VzcyBpbnN0YW5jZXMsXG4gKiBpbmNsdWRpbmcgc3RhcnRpbmcsIHVwZGF0aW5nIG1ldGFkYXRhLCBhbmQgbWFuYWdpbmcgdmFyaWFibGVzLlxuICovXG5cbmltcG9ydCB7IFZhbHVlcyB9IGZyb20gXCJAYWVyb2tpdC9zZGsvYnBtL3ZhbHVlc1wiO1xuaW1wb3J0IHsgSWRlbnRpdHlMaW5rIH0gZnJvbSBcIi4vdGFza3NcIjtcblxuY29uc3QgSkJwbW5FcnJvciA9IEphdmEudHlwZSgnb3JnLmZsb3dhYmxlLmVuZ2luZS5kZWxlZ2F0ZS5CcG1uRXJyb3InKTtcbmNvbnN0IEJwbUZhY2FkZSA9IEphdmEudHlwZShcIm9yZy5lY2xpcHNlLmRpcmlnaWJsZS5jb21wb25lbnRzLmFwaS5icG0uQnBtRmFjYWRlXCIpO1xuXG5leHBvcnQgY2xhc3MgQnBtbkVycm9yIHtcblx0Y29uc3RydWN0b3IoY29kZTogc3RyaW5nLCBtZXNzYWdlPzogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIG5ldyBKQnBtbkVycm9yKGNvZGUsIG1lc3NhZ2UpO1xuXHR9XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9jZXNzIHtcblxuXHQvKipcblx0ICogU3RhcnRzIGEgbmV3IHByb2Nlc3MgaW5zdGFuY2UgZm9yIGEgZ2l2ZW4gcHJvY2VzcyBkZWZpbml0aW9uIGtleS5cblx0ICpcblx0ICogQHBhcmFtIGtleSBUaGUgcHJvY2VzcyBkZWZpbml0aW9uIGtleSAoSUQpIG9mIHRoZSBwcm9jZXNzIHRvIHN0YXJ0LlxuXHQgKiBAcGFyYW0gYnVzaW5lc3NLZXkgQW4gb3B0aW9uYWwgYnVzaW5lc3Mga2V5IHRvIGFzc29jaWF0ZSB3aXRoIHRoZSBwcm9jZXNzIGluc3RhbmNlLiBEZWZhdWx0cyB0byBhbiBlbXB0eSBzdHJpbmcuXG5cdCAqIEBwYXJhbSBwYXJhbWV0ZXJzIEFuIG9wdGlvbmFsIG1hcCBvZiBwcm9jZXNzIHZhcmlhYmxlcyB0byBwYXNzIHRvIHRoZSBwcm9jZXNzIGluc3RhbmNlIHVwb24gc3RhcnRpbmcuIERlZmF1bHRzIHRvIGFuIGVtcHR5IG9iamVjdC5cblx0ICogQHJldHVybnMgVGhlIHVuaXF1ZSBJRCBvZiB0aGUgbmV3bHkgc3RhcnRlZCBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBzdGFydChrZXk6IHN0cmluZywgYnVzaW5lc3NLZXk6IHN0cmluZyA9ICcnLCBwYXJhbWV0ZXJzOiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge30pOiBzdHJpbmcge1xuXHRcdHJldHVybiBCcG1GYWNhZGUuc3RhcnRQcm9jZXNzKGtleSwgYnVzaW5lc3NLZXksIEpTT04uc3RyaW5naWZ5KHBhcmFtZXRlcnMpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIGEgaHVtYW4tcmVhZGFibGUgbmFtZSBmb3IgYW4gZXhpc3RpbmcgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0byB1cGRhdGUuXG5cdCAqIEBwYXJhbSBuYW1lIFRoZSBuZXcgbmFtZSBmb3IgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHNldFByb2Nlc3NJbnN0YW5jZU5hbWUocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLnNldFByb2Nlc3NJbnN0YW5jZU5hbWUocHJvY2Vzc0luc3RhbmNlSWQsIG5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgdGhlIGJ1c2luZXNzIGtleSBvZiBhbiBleGlzdGluZyBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKlxuXHQgKiBAcGFyYW0gcHJvY2Vzc0luc3RhbmNlSWQgVGhlIElEIG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRvIHVwZGF0ZS5cblx0ICogQHBhcmFtIGJ1c2luZXNzS2V5IFRoZSBuZXcgYnVzaW5lc3Mga2V5LlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyB1cGRhdGVCdXNpbmVzc0tleShwcm9jZXNzSW5zdGFuY2VJZDogc3RyaW5nLCBidXNpbmVzc0tleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLnVwZGF0ZUJ1c2luZXNzS2V5KHByb2Nlc3NJbnN0YW5jZUlkLCBidXNpbmVzc0tleSk7XG5cdH1cblxuXHQvKipcblx0ICogVXBkYXRlcyB0aGUgYnVzaW5lc3Mgc3RhdHVzIG9mIGFuIGV4aXN0aW5nIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdG8gdXBkYXRlLlxuXHQgKiBAcGFyYW0gYnVzaW5lc3NTdGF0dXMgVGhlIG5ldyBidXNpbmVzcyBzdGF0dXMuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHVwZGF0ZUJ1c2luZXNzU3RhdHVzKHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIGJ1c2luZXNzU3RhdHVzOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUudXBkYXRlQnVzaW5lc3NTdGF0dXMocHJvY2Vzc0luc3RhbmNlSWQsIGJ1c2luZXNzU3RhdHVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGEgc3BlY2lmaWMgdmFyaWFibGUgZnJvbSBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuXHQgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlLCBvciBgbnVsbGAgaWYgdGhlIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LiBUaGUgdHlwZSBpcyBgYW55YCBhcyBpdCBkZXBlbmRzIG9uIHRoZSBzdG9yZWQgdmFsdWUuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGdldFZhcmlhYmxlKHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gQnBtRmFjYWRlLmdldFZhcmlhYmxlKHByb2Nlc3NJbnN0YW5jZUlkLCB2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyBhbGwgdmFyaWFibGVzIGFzc29jaWF0ZWQgd2l0aCBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIEByZXR1cm5zIEFuIG9iamVjdCBjb250YWluaW5nIGFsbCB2YXJpYWJsZXMgZm9yIHRoZSBwcm9jZXNzIGluc3RhbmNlLCB3aGVyZSBrZXlzIGFyZSB2YXJpYWJsZSBuYW1lcyBhbmQgdmFsdWVzIGFyZSB0aGUgdmFyaWFibGUgdmFsdWVzLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBnZXRWYXJpYWJsZXMocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIEJwbUZhY2FkZS5nZXRWYXJpYWJsZXMocHJvY2Vzc0luc3RhbmNlSWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgb3IgdXBkYXRlcyB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZSBpbiBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHNldC5cblx0ICogQHBhcmFtIHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSB2YXJpYWJsZS4gVGhlIHR5cGUgaXMgYGFueWAgdG8gYWNjb21tb2RhdGUgZGlmZmVyZW50IGRhdGEgdHlwZXMuXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIHNldFZhcmlhYmxlKHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG5cdFx0QnBtRmFjYWRlLnNldFZhcmlhYmxlKHByb2Nlc3NJbnN0YW5jZUlkLCB2YXJpYWJsZU5hbWUsIHZhbHVlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGEgdmFyaWFibGUgZnJvbSBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqXG5cdCAqIEBwYXJhbSBwcm9jZXNzSW5zdGFuY2VJZCBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgcmVtb3ZlVmFyaWFibGUocHJvY2Vzc0luc3RhbmNlSWQ6IHN0cmluZywgdmFyaWFibGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRCcG1GYWNhZGUucmVtb3ZlVmFyaWFibGUocHJvY2Vzc0luc3RhbmNlSWQsIHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogQ29ycmVsYXRlcyBhIG1lc3NhZ2UgZXZlbnQgd2l0aCBhIHJ1bm5pbmcgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICpcblx0ICogQHBhcmFtIHByb2Nlc3NJbnN0YW5jZUlkIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0byBjb3JyZWxhdGUgdGhlIG1lc3NhZ2UgdG8uXG5cdCAqIEBwYXJhbSBtZXNzYWdlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbWVzc2FnZSBldmVudCBkZWZpbmVkIGluIHRoZSBCUE1OIHByb2Nlc3MuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZXMgQSBtYXAgb2YgdmFyaWFibGVzIChgTWFwPHN0cmluZywgYW55PmApIHRvIHBhc3MgYWxvbmcgd2l0aCB0aGUgbWVzc2FnZSBldmVudC5cblx0ICovXG5cdHB1YmxpYyBzdGF0aWMgY29ycmVsYXRlTWVzc2FnZUV2ZW50KHByb2Nlc3NJbnN0YW5jZUlkOiBzdHJpbmcsIG1lc3NhZ2VOYW1lOiBzdHJpbmcsIHZhcmlhYmxlczogTWFwPHN0cmluZywgYW55Pik6IHZvaWQge1xuXHRcdEJwbUZhY2FkZS5jb3JyZWxhdGVNZXNzYWdlRXZlbnQocHJvY2Vzc0luc3RhbmNlSWQsIG1lc3NhZ2VOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWVzTWFwKHZhcmlhYmxlcykpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBleGVjdXRpb24gY29udGV4dCBvYmplY3QsIHR5cGljYWxseSB1c2VkIHdpdGhpbiBhbiBleGVjdXRpb24gbGlzdGVuZXIgb3Igc2VydmljZSB0YXNrLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBBIG5ldyBpbnN0YW5jZSBvZiB0aGUgYEV4ZWN1dGlvbkNvbnRleHRgIGNvbnRhaW5pbmcgZGV0YWlscyBhYm91dCB0aGUgY3VycmVudCBwcm9jZXNzIGV4ZWN1dGlvbiBwYXRoLlxuXHQgKi9cblx0cHVibGljIHN0YXRpYyBnZXRFeGVjdXRpb25Db250ZXh0KCkge1xuXHRcdHJldHVybiBuZXcgRXhlY3V0aW9uQ29udGV4dCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgY3VycmVudCB0YXNrIGNvbnRleHQgb2JqZWN0LCB0eXBpY2FsbHkgdXNlZCB3aXRoaW4gYSB0YXNrIGxpc3RlbmVyIG9yIHNlcnZpY2UgdGFzay5cblx0ICpcblx0ICogQHJldHVybnMgQSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGBUYXNrQ29udGV4dGAgY29udGFpbmluZyBkZXRhaWxzIGFib3V0IHRoZSBjdXJyZW50IHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgc3RhdGljIGdldFRhc2tDb250ZXh0KCkge1xuXHRcdHJldHVybiBuZXcgVGFza0NvbnRleHQoKTtcblx0fVxufVxuXG5jbGFzcyBWYXJpYWJsZVNjb3BlIHtcblxuXHRwcml2YXRlIHZhcmlhYmxlU2NvcGU6IGFueTtcblxuXHRjb25zdHJ1Y3Rvcih2YXJpYWJsZVNjb3BlOiBhbnkpIHtcblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUgPSB2YXJpYWJsZVNjb3BlO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgYWxsIHZhcmlhYmxlcy4gVGhpcyB3aWxsIGluY2x1ZGUgYWxsIHZhcmlhYmxlcyBvZiBwYXJlbnQgc2NvcGVzIHRvby5cblx0ICogQHJldHVybnMgQSBNYXAgb2YgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdgKSB0byB2YXJpYWJsZSB2YWx1ZXMgKGBhbnlgKS5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZXMoKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0Y29uc3QgdmFyaWFibGVzID0gdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlcygpO1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHZhcmlhYmxlcykge1xuXHRcdFx0dmFyaWFibGVzLnNldChrZXksIFZhbHVlcy5wYXJzZVZhbHVlKHZhbHVlKSk7XG5cdFx0fVxuXHRcdHJldHVybiB2YXJpYWJsZXM7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyBhbGwgdmFyaWFibGVzLCBhcyBpbnN0YW5jZXMgb2YgdGhlIHtAbGluayBWYXJpYWJsZUluc3RhbmNlfSBpbnRlcmZhY2UsIHdoaWNoIGdpdmVzIG1vcmUgaW5mb3JtYXRpb24gdGhhbiBvbmx5IHRoZSB2YWx1ZSAodHlwZSwgZXhlY3V0aW9uIGlkLCBldGMuKVxuXHQgKiBAcmV0dXJucyBBIE1hcCBvZiB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ2ApIHRvIHtAbGluayBWYXJpYWJsZUluc3RhbmNlfSBvYmplY3RzIChKYXZhIHR5cGUpLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlSW5zdGFuY2VzKCk6IE1hcDxzdHJpbmcsIGFueT4ge1xuXHRcdHJldHVybiB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGVJbnN0YW5jZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB2YXJpYWJsZSBsb2NhbCB0byB0aGlzIHNjb3BlIG9ubHkuIFNvLCBpbiBjb250cmFyeSB0byB7QGxpbmsgI2dldFZhcmlhYmxlcygpfSwgdGhlIHZhcmlhYmxlcyBmcm9tIHRoZSBwYXJlbnQgc2NvcGUgd29uJ3QgYmUgcmV0dXJuZWQuXG5cdCAqIEByZXR1cm5zIEEgTWFwIG9mIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkgdG8gbG9jYWwgdmFyaWFibGUgdmFsdWVzIChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVzTG9jYWwoKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0Y29uc3QgdmFyaWFibGVzTG9jYWwgPSB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGVzTG9jYWwoKTtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB2YXJpYWJsZXNMb2NhbCkge1xuXHRcdFx0dmFyaWFibGVzTG9jYWwuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhcmlhYmxlc0xvY2FsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHZhcmlhYmxlcyBsb2NhbCB0byB0aGlzIHNjb3BlIGFzIGluc3RhbmNlcyBvZiB0aGUge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IGludGVyZmFjZSwgd2hpY2ggcHJvdmlkZWQgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdmFyaWFibGUuXG5cdCAqIEByZXR1cm5zIEEgTWFwIG9mIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkgdG8gbG9jYWwge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IG9iamVjdHMgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVJbnN0YW5jZXNMb2NhbCgpOiBNYXA8c3RyaW5nLCBhbnk+IHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlSW5zdGFuY2VzTG9jYWwoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB2YXJpYWJsZSB2YWx1ZSBmb3Igb25lIHNwZWNpZmljIHZhcmlhYmxlLiBXaWxsIGxvb2sgaW4gcGFyZW50IHNjb3BlcyB3aGVuIHRoZSB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdCBvbiB0aGlzIHBhcnRpY3VsYXIgc2NvcGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuXHQgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIChgYW55YCksIG9yIGBudWxsYCBpZiBub3QgZm91bmQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBhbnkge1xuXHRcdHJldHVybiBWYWx1ZXMucGFyc2VWYWx1ZSh0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGUodmFyaWFibGVOYW1lKSk7XG5cdH1cblxuXHQvKipcblx0ICogU2ltaWxhciB0byB7QGxpbmsgI2dldFZhcmlhYmxlKFN0cmluZyl9LCBidXQgcmV0dXJucyBhIHtAbGluayBWYXJpYWJsZUluc3RhbmNlfSBpbnN0YW5jZSwgd2hpY2ggY29udGFpbnMgbW9yZSBpbmZvcm1hdGlvbiB0aGFuIGp1c3QgdGhlIHZhbHVlLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byByZXRyaWV2ZS5cblx0ICogQHJldHVybnMgVGhlIHtAbGluayBWYXJpYWJsZUluc3RhbmNlfSBvYmplY3QgKEphdmEgdHlwZSksIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBnZXRWYXJpYWJsZUluc3RhbmNlKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlSW5zdGFuY2UodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmljIHZhcmlhYmxlIGFuZCBvbmx5IGNoZWNrcyB0aGlzIHNjb3BlIGFuZCBub3QgYW55IHBhcmVudCBzY29wZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgKGBhbnlgKSwgb3IgYG51bGxgIGlmIG5vdCBmb3VuZCBsb2NhbGx5LlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBhbnkge1xuXHRcdHJldHVybiBWYWx1ZXMucGFyc2VWYWx1ZSh0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaW1pbGFyIHRvIHtAbGluayAjZ2V0VmFyaWFibGVMb2NhbChTdHJpbmcpfSwgYnV0IHJldHVybnMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9LCB3aGljaCBoYXMgc29tZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGJleW9uZCB0aGUgdmFsdWUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuXHQgKiBAcmV0dXJucyBUaGUgbG9jYWwge0BsaW5rIFZhcmlhYmxlSW5zdGFuY2V9IG9iamVjdCAoSmF2YSB0eXBlKSwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlSW5zdGFuY2VMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMudmFyaWFibGVTY29wZS5nZXRWYXJpYWJsZUluc3RhbmNlTG9jYWwodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFsbCB0aGUgbmFtZXMgb2YgdGhlIHZhcmlhYmxlcyBmb3IgdGhpcyBzY29wZSBhbmQgYWxsIHBhcmVudCBzY29wZXMuXG5cdCAqIEByZXR1cm5zIEEgU2V0IG9mIGFsbCB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ2ApLlxuXHQgKi9cblx0cHVibGljIGdldFZhcmlhYmxlTmFtZXMoKTogU2V0PHN0cmluZz4ge1xuXHRcdGNvbnN0IHZhcmlhYmxlTmFtZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRmb3IgKGNvbnN0IG5leHQgb2YgdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlTmFtZXMoKS50b0FycmF5KCkpIHtcblx0XHRcdHZhcmlhYmxlTmFtZXMuYWRkKG5leHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFyaWFibGVOYW1lcztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIGFsbCB0aGUgbmFtZXMgb2YgdGhlIHZhcmlhYmxlcyBmb3IgdGhpcyBzY29wZSAobm8gcGFyZW50IHNjb3BlcykuXG5cdCAqIEByZXR1cm5zIEEgU2V0IG9mIGxvY2FsIHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VmFyaWFibGVOYW1lc0xvY2FsKCk6IFNldDxzdHJpbmc+IHtcblx0XHRjb25zdCB2YXJpYWJsZU5hbWVzTG9jYWwgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRmb3IgKGNvbnN0IG5leHQgb2YgdGhpcy52YXJpYWJsZVNjb3BlLmdldFZhcmlhYmxlTmFtZXNMb2NhbCgpLnRvQXJyYXkoKSkge1xuXHRcdFx0dmFyaWFibGVOYW1lc0xvY2FsLmFkZChuZXh0KTtcblx0XHR9XG5cdFx0cmV0dXJuIHZhcmlhYmxlTmFtZXNMb2NhbDtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSB2YXJpYWJsZSB3aXRoIHRoZSBwcm92aWRlZCBuYW1lIHRvIHRoZSBwcm92aWRlZCB2YWx1ZS4gSXQgY2hlY2tzIHBhcmVudCBzY29wZXMgZm9yIGFuIGV4aXN0aW5nIHZhcmlhYmxlIGJlZm9yZSBzZXR0aW5nIG9uIHRoZSBjdXJyZW50IHNjb3BlLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBiZSBzZXQuXG5cdCAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIHRvIGJlIHNldCAoYGFueWApLlxuXHQgKi9cblx0cHVibGljIHNldFZhcmlhYmxlKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnNldFZhcmlhYmxlKHZhcmlhYmxlTmFtZSwgVmFsdWVzLnN0cmluZ2lmeVZhbHVlKHZhbHVlKSk7XG5cdH1cblxuXHQvKipcblx0ICogU2ltaWxhciB0byB7QGxpbmsgI3NldFZhcmlhYmxlKFN0cmluZywgT2JqZWN0KX0sIGJ1dCB0aGUgdmFyaWFibGUgaXMgc2V0IHRvIHRoaXMgc2NvcGUgc3BlY2lmaWNhbGx5IChsb2NhbCB2YXJpYWJsZSkuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGJlIHNldCBsb2NhbGx5LlxuXHQgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSB0byBiZSBzZXQgKGBhbnlgKS5cblx0ICogQHJldHVybnMgVGhlIG9sZCB2YWx1ZSBvZiB0aGUgbG9jYWwgdmFyaWFibGUgKEphdmEgdHlwZSksIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBzZXRWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLnNldFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFsdWUpKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBwcm92aWRlZCB2YXJpYWJsZXMgdG8gdGhlIHZhcmlhYmxlIHNjb3BlLCB1c2luZyB0aGUgZGVmYXVsdCBzY29waW5nIGFsZ29yaXRobS5cblx0ICogQHBhcmFtIHZhcmlhYmxlcyBBIG1hcCBvZiBrZXlzIChgc3RyaW5nYCkgYW5kIHZhbHVlcyAoYGFueWApIGZvciB0aGUgdmFyaWFibGVzIHRvIGJlIHNldC5cblx0ICovXG5cdHB1YmxpYyBzZXRWYXJpYWJsZXModmFyaWFibGVzOiBNYXA8c3RyaW5nLCBhbnk+KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdmFyaWFibGVzKSB7XG5cdFx0XHR2YXJpYWJsZXMuc2V0KGtleSwgVmFsdWVzLnN0cmluZ2lmeVZhbHVlKHZhbHVlKSk7XG5cdFx0fVxuXHRcdHRoaXMudmFyaWFibGVTY29wZS5zZXRWYXJpYWJsZXModmFyaWFibGVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTaW1pbGFyIHRvIHtAbGluayAjc2V0VmFyaWFibGVzKE1hcCl9LCBidXQgdGhlIHZhcmlhYmxlcyBhcmUgc2V0IG9uIHRoaXMgc2NvcGUgc3BlY2lmaWNhbGx5IChsb2NhbCB2YXJpYWJsZXMpLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVzIEEgbWFwIG9mIGtleXMgKGBzdHJpbmdgKSBhbmQgdmFsdWVzIChgYW55YCkgZm9yIHRoZSBsb2NhbCB2YXJpYWJsZXMgdG8gYmUgc2V0LlxuXHQgKi9cblx0cHVibGljIHNldFZhcmlhYmxlc0xvY2FsKHZhcmlhYmxlczogTWFwPHN0cmluZywgYW55Pik6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHZhcmlhYmxlcykge1xuXHRcdFx0dmFyaWFibGVzLnNldChrZXksIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YWx1ZSkpO1xuXHRcdH1cblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUuc2V0VmFyaWFibGVzTG9jYWwodmFyaWFibGVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzY29wZSBvciBhbnkgcGFyZW50IHNjb3BlIGhhcyB2YXJpYWJsZXMuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB2YXJpYWJsZXMgZXhpc3QgaW4gc2NvcGUgaGllcmFyY2h5LCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZXMoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMudmFyaWFibGVTY29wZS5oYXNWYXJpYWJsZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBzY29wZSBoYXMgdmFyaWFibGVzLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgbG9jYWwgdmFyaWFibGVzIGV4aXN0LCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBoYXNWYXJpYWJsZXNMb2NhbCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmhhc1ZhcmlhYmxlc0xvY2FsKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2NvcGUgb3IgYW55IHBhcmVudCBzY29wZSBoYXMgYSBzcGVjaWZpYyB2YXJpYWJsZS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gY2hlY2suXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFyaWFibGUgaXMgZm91bmQgaW4gdGhlIHNjb3BlIGhpZXJhcmNoeSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaGFzVmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmhhc1ZhcmlhYmxlKHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2NvcGUgaGFzIGEgc3BlY2lmaWMgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIHRvIGNoZWNrLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhcmlhYmxlIGlzIGZvdW5kIGxvY2FsbHksIGBmYWxzZWAgb3RoZXJ3aXNlLlxuXHQgKi9cblx0cHVibGljIGhhc1ZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy52YXJpYWJsZVNjb3BlLmhhc1ZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRoZSB2YXJpYWJsZSBmcm9tIHRoZSBwcm9jZXNzIGluc3RhbmNlIGFuZCBjcmVhdGVzIGEgbmV3IEhpc3RvcmljVmFyaWFibGVVcGRhdGUuIFNlYXJjaGVzIHVwIHRoZSBzY29wZSBoaWVyYXJjaHkuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZSh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVWYXJpYWJsZSh2YXJpYWJsZU5hbWUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgdGhlIGxvY2FsIHZhcmlhYmxlIGFuZCBjcmVhdGVzIGEgbmV3IEhpc3RvcmljVmFyaWFibGVVcGRhdGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnJlbW92ZVZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIHRoZSB2YXJpYWJsZXMgYW5kIGNyZWF0ZXMgYSBuZXcgSGlzdG9yaWNWYXJpYWJsZVVwZGF0ZSBmb3IgZWFjaCBvZiB0aGVtLiBTZWFyY2hlcyB1cCB0aGUgc2NvcGUgaGllcmFyY2h5LlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lcyBBbiBhcnJheSBvZiB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ1tdYCkgdG8gcmVtb3ZlLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVZhcmlhYmxlcyh2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVWYXJpYWJsZXModmFyaWFibGVOYW1lcyk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyB0aGUgbG9jYWwgdmFyaWFibGVzIGFuZCBjcmVhdGVzIGEgbmV3IEhpc3RvcmljVmFyaWFibGVVcGRhdGUgZm9yIGVhY2ggb2YgdGhlbS5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZXMgQW4gYXJyYXkgb2YgbG9jYWwgdmFyaWFibGUgbmFtZXMgKGBzdHJpbmdbXWApIHRvIHJlbW92ZS5cblx0ICovXG5cdHB1YmxpYyByZW1vdmVWYXJpYWJsZXNMb2NhbCh2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVWYXJpYWJsZXNMb2NhbCh2YXJpYWJsZU5hbWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIGEgdHJhbnNpZW50IHZhcmlhYmxlIHVzaW5nIHRoZSBkZWZhdWx0IHNjb3BpbmcgbWVjaGFuaXNtICh1cCB0aGUgaGllcmFyY2h5KS4gVHJhbnNpZW50IHZhcmlhYmxlcyBoYXZlIG5vIGhpc3RvcnkgYW5kIGFyZSBjbGVhcmVkIGF0IHdhaXQgc3RhdGVzLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSB0cmFuc2llbnQgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZVZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgdHJhbnNpZW50IHZhcmlhYmxlIChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VHJhbnNpZW50VmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcsIHZhcmlhYmxlVmFsdWU6IGFueSk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5zZXRUcmFuc2llbnRWYXJpYWJsZSh2YXJpYWJsZU5hbWUsIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YXJpYWJsZVZhbHVlKSk7XG5cdH1cblxuXHQvKipcblx0ICogU2V0cyBhIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZS4gVHJhbnNpZW50IHZhcmlhYmxlcyBoYXZlIG5vIGhpc3RvcnkgYW5kIGFyZSBjbGVhcmVkIGF0IHdhaXQgc3RhdGVzLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZVZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlIChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VHJhbnNpZW50VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFyaWFibGVWYWx1ZTogYW55KTogdm9pZCB7XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnNldFRyYW5zaWVudFZhcmlhYmxlTG9jYWwodmFyaWFibGVOYW1lLCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFyaWFibGVWYWx1ZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgbXVsdGlwbGUgdHJhbnNpZW50IHZhcmlhYmxlcyB1c2luZyB0aGUgZGVmYXVsdCBzY29waW5nIG1lY2hhbmlzbSAodXAgdGhlIGhpZXJhcmNoeSkuXG5cdCAqIEBwYXJhbSB0cmFuc2llbnRWYXJpYWJsZXMgQSBtYXAgb2Yga2V5cyAoYHN0cmluZ2ApIGFuZCB2YWx1ZXMgKGBhbnlgKSBmb3IgdGhlIHRyYW5zaWVudCB2YXJpYWJsZXMgdG8gYmUgc2V0LlxuXHQgKi9cblx0cHVibGljIHNldFRyYW5zaWVudFZhcmlhYmxlcyh0cmFuc2llbnRWYXJpYWJsZXM6IE1hcDxzdHJpbmcsIGFueT4pOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0cmFuc2llbnRWYXJpYWJsZXMpIHtcblx0XHRcdHRyYW5zaWVudFZhcmlhYmxlcy5zZXQoa2V5LCBWYWx1ZXMuc3RyaW5naWZ5VmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0dGhpcy52YXJpYWJsZVNjb3BlLnNldFRyYW5zaWVudFZhcmlhYmxlcyh0cmFuc2llbnRWYXJpYWJsZXMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSB0cmFuc2llbnQgdmFyaWFibGUsIHNlYXJjaGluZyB1cCB0aGUgcGFyZW50IHNjb3Blcy5cblx0ICogQHBhcmFtIHZhcmlhYmxlTmFtZSBUaGUgbmFtZSBvZiB0aGUgdHJhbnNpZW50IHZhcmlhYmxlIHRvIHJldHJpZXZlLlxuXHQgKiBAcmV0dXJucyBUaGUgdmFsdWUgb2YgdGhlIHRyYW5zaWVudCB2YXJpYWJsZSAoYGFueWApLCBvciBgbnVsbGAgaWYgbm90IGZvdW5kLlxuXHQgKi9cblx0cHVibGljIGdldFRyYW5zaWVudFZhcmlhYmxlKHZhcmlhYmxlTmFtZTogc3RyaW5nKTogYW55IHtcblx0XHRyZXR1cm4gVmFsdWVzLnBhcnNlVmFsdWUodGhpcy52YXJpYWJsZVNjb3BlLmdldFRyYW5zaWVudFZhcmlhYmxlKHZhcmlhYmxlTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyBhbGwgdHJhbnNpZW50IHZhcmlhYmxlcyBpbiB0aGUgY3VycmVudCBzY29wZSBoaWVyYXJjaHkuXG5cdCAqIEByZXR1cm5zIEEgTWFwIG9mIHRyYW5zaWVudCB2YXJpYWJsZSBuYW1lcyAoYHN0cmluZ2ApIHRvIHZhbHVlcyAoYGFueWApLlxuXHQgKi9cblx0cHVibGljIGdldFRyYW5zaWVudFZhcmlhYmxlcygpOiBNYXA8c3RyaW5nLCBhbnk+IHtcblx0XHRjb25zdCB0cmFuc2llbnRWYXJpYWJsZXMgPSB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VHJhbnNpZW50VmFyaWFibGVzKCk7XG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgdHJhbnNpZW50VmFyaWFibGVzKSB7XG5cdFx0XHR0cmFuc2llbnRWYXJpYWJsZXMuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRyYW5zaWVudFZhcmlhYmxlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBTZXRzIG11bHRpcGxlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZXMuXG5cdCAqIEBwYXJhbSB0cmFuc2llbnRWYXJpYWJsZXMgQSBtYXAgb2Yga2V5cyAoYHN0cmluZ2ApIGFuZCB2YWx1ZXMgKGBhbnlgKSBmb3IgdGhlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZXMgdG8gYmUgc2V0LlxuXHQgKi9cblx0cHVibGljIHNldFRyYW5zaWVudFZhcmlhYmxlc0xvY2FsKHRyYW5zaWVudFZhcmlhYmxlczogTWFwPHN0cmluZywgYW55Pik6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHRyYW5zaWVudFZhcmlhYmxlcykge1xuXHRcdFx0dHJhbnNpZW50VmFyaWFibGVzLnNldChrZXksIFZhbHVlcy5zdHJpbmdpZnlWYWx1ZSh2YWx1ZSkpO1xuXHRcdH1cblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUuc2V0VHJhbnNpZW50VmFyaWFibGVzTG9jYWwodHJhbnNpZW50VmFyaWFibGVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIGEgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlLlxuXHQgKiBAcGFyYW0gdmFyaWFibGVOYW1lIFRoZSBuYW1lIG9mIHRoZSBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUgdG8gcmV0cmlldmUuXG5cdCAqIEByZXR1cm5zIFRoZSB2YWx1ZSBvZiB0aGUgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlIChgYW55YCksIG9yIGBudWxsYCBpZiBub3QgZm91bmQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VHJhbnNpZW50VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IGFueSB7XG5cdFx0cmV0dXJuIFZhbHVlcy5wYXJzZVZhbHVlKHRoaXMudmFyaWFibGVTY29wZS5nZXRUcmFuc2llbnRWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZSkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHJpZXZlcyBhbGwgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlcy5cblx0ICogQHJldHVybnMgQSBNYXAgb2YgbG9jYWwgdHJhbnNpZW50IHZhcmlhYmxlIG5hbWVzIChgc3RyaW5nYCkgdG8gdmFsdWVzIChgYW55YCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0VHJhbnNpZW50VmFyaWFibGVzTG9jYWwoKTogTWFwPHN0cmluZywgYW55PiB7XG5cdFx0Y29uc3QgdHJhbnNpZW50VmFyaWFibGVzTG9jYWwgPSB0aGlzLnZhcmlhYmxlU2NvcGUuZ2V0VHJhbnNpZW50VmFyaWFibGVzTG9jYWwoKTtcblx0XHRmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiB0cmFuc2llbnRWYXJpYWJsZXNMb2NhbCkge1xuXHRcdFx0dHJhbnNpZW50VmFyaWFibGVzTG9jYWwuc2V0KGtleSwgVmFsdWVzLnBhcnNlVmFsdWUodmFsdWUpKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRyYW5zaWVudFZhcmlhYmxlc0xvY2FsO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJlbW92ZXMgYSBzcGVjaWZpYyBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGUuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGxvY2FsIHRyYW5zaWVudCB2YXJpYWJsZSB0byByZW1vdmUuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlVHJhbnNpZW50VmFyaWFibGVMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVUcmFuc2llbnRWYXJpYWJsZUxvY2FsKHZhcmlhYmxlTmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogUmVtb3ZlcyBhIHNwZWNpZmljIHRyYW5zaWVudCB2YXJpYWJsZSwgc2VhcmNoaW5nIHVwIHRoZSBzY29wZSBoaWVyYXJjaHkuXG5cdCAqIEBwYXJhbSB2YXJpYWJsZU5hbWUgVGhlIG5hbWUgb2YgdGhlIHRyYW5zaWVudCB2YXJpYWJsZSB0byByZW1vdmUuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlVHJhbnNpZW50VmFyaWFibGUodmFyaWFibGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnZhcmlhYmxlU2NvcGUucmVtb3ZlVHJhbnNpZW50VmFyaWFibGUodmFyaWFibGVOYW1lKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmUgYWxsIHRyYW5zaWVudCB2YXJpYWJsZXMgb2YgdGhpcyBzY29wZSBhbmQgaXRzIHBhcmVudCBzY29wZXMuXG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlVHJhbnNpZW50VmFyaWFibGVzKCk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVUcmFuc2llbnRWYXJpYWJsZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFsbCBsb2NhbCB0cmFuc2llbnQgdmFyaWFibGVzLlxuXHQgKi9cblx0cHVibGljIHJlbW92ZVRyYW5zaWVudFZhcmlhYmxlc0xvY2FsKCk6IHZvaWQge1xuXHRcdHRoaXMudmFyaWFibGVTY29wZS5yZW1vdmVUcmFuc2llbnRWYXJpYWJsZXNMb2NhbCgpO1xuXHR9XG59XG5cbi8qKlxuICogRXhlY3V0aW9uQ29udGV4dCBvYmplY3RcbiAqICogUHJvdmlkZXMgZGV0YWlsZWQgaW5mb3JtYXRpb24gYW5kIGNvbnRyb2wgb3ZlciB0aGUgY3VycmVudCBwcm9jZXNzIGV4ZWN1dGlvbiBwYXRoLlxuICovXG5jbGFzcyBFeGVjdXRpb25Db250ZXh0IGV4dGVuZHMgVmFyaWFibGVTY29wZSB7XG5cblx0cHJpdmF0ZSBleGVjdXRpb246IGFueTtcblxuXHRjb25zdHJ1Y3RvcigpIHtcblx0XHRzdXBlcihfX2NvbnRleHQuZ2V0KCdleGVjdXRpb24nKSk7XG5cdFx0dGhpcy5leGVjdXRpb24gPSBfX2NvbnRleHQuZ2V0KCdleGVjdXRpb24nKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVbmlxdWUgaWQgb2YgdGhpcyBwYXRoIG9mIGV4ZWN1dGlvbiB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgaGFuZGxlIHRvIHByb3ZpZGUgZXh0ZXJuYWwgc2lnbmFscyBiYWNrIGludG8gdGhlIGVuZ2luZSBhZnRlciB3YWl0IHN0YXRlcy5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIHVuaXF1ZSBJRCBvZiB0aGUgY3VycmVudCBleGVjdXRpb24uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0SWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIG92ZXJhbGwgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogQHJldHVybnMgVGhlIElEIG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUlkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NJbnN0YW5jZUlkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlICdyb290JyBwcm9jZXNzIGluc3RhbmNlLiBXaGVuIHVzaW5nIGNhbGwgYWN0aXZpdHkgZm9yIGV4YW1wbGUsIHRoZSBwcm9jZXNzSW5zdGFuY2Ugc2V0IHdpbGwgbm90IGFsd2F5cyBiZSB0aGUgcm9vdC4gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgdG9wbW9zdCBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKlxuXHQgKiBAcmV0dXJucyBUaGUgSUQgb2YgdGhlIHJvb3QgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICovXG5cdHB1YmxpYyBnZXRSb290UHJvY2Vzc0luc3RhbmNlSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0Um9vdFByb2Nlc3NJbnN0YW5jZUlkKCk7XG5cdH1cblxuXHQvKipcblx0ICogV2lsbCBjb250YWluIHRoZSBldmVudCBuYW1lIGluIGNhc2UgdGhpcyBleGVjdXRpb24gaXMgcGFzc2VkIGluIGZvciBhbiB7QGxpbmsgRXhlY3V0aW9uTGlzdGVuZXJ9LlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBldmVudCBuYW1lLCBvciBgbnVsbGAvZW1wdHkgc3RyaW5nIGlmIG5vdCBleGVjdXRpbmcgYW4gZXZlbnQgbGlzdGVuZXIuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXZlbnROYW1lKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEV2ZW50TmFtZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGN1cnJlbnQgZXZlbnQgKHR5cGljYWxseSB3aGVuIGV4ZWN1dGlvbiBhbiB7QGxpbmsgRXhlY3V0aW9uTGlzdGVuZXJ9KS5cblx0ICpcblx0ICogQHBhcmFtIGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQuXG5cdCAqL1xuXHRwdWJsaWMgc2V0RXZlbnROYW1lKGV2ZW50TmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uc2V0RXZlbnROYW1lKGV2ZW50TmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGJ1c2luZXNzIGtleSBmb3IgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdGhpcyBleGVjdXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoLlxuXHQgKiBAcmV0dXJucyBUaGUgYnVzaW5lc3Mga2V5LlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzS2V5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzS2V5KCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGJ1c2luZXNzIHN0YXR1cyBmb3IgdGhlIHByb2Nlc3MgaW5zdGFuY2UgdGhpcyBleGVjdXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoLlxuXHQgKiBAcmV0dXJucyBUaGUgYnVzaW5lc3Mgc3RhdHVzLlxuXHQgKi9cblx0cHVibGljIGdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzU3RhdHVzKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NJbnN0YW5jZUJ1c2luZXNzU3RhdHVzKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHByb2Nlc3MgZGVmaW5pdGlvbiBrZXkgZm9yIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRoaXMgZXhlY3V0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aC5cblx0ICogQHJldHVybnMgVGhlIHByb2Nlc3MgZGVmaW5pdGlvbiBJRC5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb2Nlc3NEZWZpbml0aW9uSWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJZiB0aGlzIGV4ZWN1dGlvbiBydW5zIGluIHRoZSBjb250ZXh0IG9mIGEgY2FzZSBhbmQgc3RhZ2UsIHRoaXMgbWV0aG9kIHJldHVybnMgaXQncyBjbG9zZXN0IHBhcmVudCBzdGFnZSBpbnN0YW5jZSBpZCAodGhlIHN0YWdlIHBsYW4gaXRlbSBpbnN0YW5jZSBpZCB0byBiZVxuXHQgKiBwcmVjaXNlKS5cblx0ICpcblx0ICogQHJldHVybnMgVGhlIHN0YWdlIGluc3RhbmNlIGlkIHRoaXMgZXhlY3V0aW9uIGJlbG9uZ3MgdG8gb3IgYG51bGxgLCBpZiB0aGlzIGV4ZWN1dGlvbiBpcyBub3QgcGFydCBvZiBhIGNhc2UgYXQgYWxsIG9yIGlzIG5vdCBhIGNoaWxkIGVsZW1lbnQgb2YgYSBzdGFnZS5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9wYWdhdGVkU3RhZ2VJbnN0YW5jZUlkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFByb3BhZ2F0ZWRTdGFnZUluc3RhbmNlSWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBpZCBvZiB0aGUgcGFyZW50IG9mIHRoaXMgZXhlY3V0aW9uLiBJZiBudWxsLCB0aGUgZXhlY3V0aW9uIHJlcHJlc2VudHMgYSBwcm9jZXNzLWluc3RhbmNlLlxuXHQgKiBAcmV0dXJucyBUaGUgcGFyZW50IGV4ZWN1dGlvbiBJRCwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldFBhcmVudElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFBhcmVudElkKCk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0cyB0aGUgaWQgb2YgdGhlIGNhbGxpbmcgZXhlY3V0aW9uLiBJZiBub3QgbnVsbCwgdGhlIGV4ZWN1dGlvbiBpcyBwYXJ0IG9mIGEgc3VicHJvY2Vzcy5cblx0ICogQHJldHVybnMgVGhlIHN1cGVyIGV4ZWN1dGlvbiBJRCwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldFN1cGVyRXhlY3V0aW9uSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0U3VwZXJFeGVjdXRpb25JZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGlkIG9mIHRoZSBjdXJyZW50IGFjdGl2aXR5LlxuXHQgKiBAcmV0dXJucyBUaGUgY3VycmVudCBhY3Rpdml0eSBJRC5cblx0ICovXG5cdHB1YmxpYyBnZXRDdXJyZW50QWN0aXZpdHlJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5nZXRDdXJyZW50QWN0aXZpdHlJZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIHRlbmFudCBpZCwgaWYgYW55IGlzIHNldCBiZWZvcmUgb24gdGhlIHByb2Nlc3MgZGVmaW5pdGlvbiBvciBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKiBAcmV0dXJucyBUaGUgdGVuYW50IElELCBvciBgbnVsbGAvZW1wdHkgc3RyaW5nLlxuXHQgKi9cblx0cHVibGljIGdldFRlbmFudElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldFRlbmFudElkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIEJQTU4gZWxlbWVudCB3aGVyZSB0aGUgZXhlY3V0aW9uIGN1cnJlbnRseSBpcyBhdC5cblx0ICogQHJldHVybnMgVGhlIGN1cnJlbnQgZmxvdyBlbGVtZW50IG9iamVjdCAodHlwZSBpcyBKYXZhIG9iamVjdCkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q3VycmVudEZsb3dFbGVtZW50KCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEN1cnJlbnRGbG93RWxlbWVudCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZSB0aGUgY3VycmVudCBCUE1OIGVsZW1lbnQgdGhlIGV4ZWN1dGlvbiBpcyBhdC5cblx0ICogQHBhcmFtIGZsb3dFbGVtZW50IFRoZSBuZXcgZmxvdyBlbGVtZW50IG9iamVjdCAoSmF2YSB0eXBlKS5cblx0ICovXG5cdHB1YmxpYyBzZXRDdXJyZW50Rmxvd0VsZW1lbnQoZmxvd0VsZW1lbnQ6IGFueSk6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnNldEN1cnJlbnRGbG93RWxlbWVudChmbG93RWxlbWVudCk7XG5cdH1cblxuXHQvKipcblx0ICogUmV0dXJucyB0aGUge0BsaW5rIEZsb3dhYmxlTGlzdGVuZXJ9IGluc3RhbmNlIG1hdGNoaW5nIGFuIHtAbGluayBFeGVjdXRpb25MaXN0ZW5lcn0gaWYgY3VycmVudGx5IGFuIGV4ZWN1dGlvbiBsaXN0ZW5lciBpcyBiZWluZyBleGVjdXRpb24uIFJldHVybnMgbnVsbCBvdGhlcndpc2UuXG5cdCAqIEByZXR1cm5zIFRoZSBjdXJyZW50IEZsb3dhYmxlIExpc3RlbmVyIG9iamVjdCAoSmF2YSB0eXBlKSwgb3IgYG51bGxgLlxuXHQgKi9cblx0cHVibGljIGdldEN1cnJlbnRGbG93YWJsZUxpc3RlbmVyKCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEN1cnJlbnRGbG93YWJsZUxpc3RlbmVyKCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIHdoZW4gYW4ge0BsaW5rIEV4ZWN1dGlvbkxpc3RlbmVyfSBpcyBiZWluZyBleGVjdXRlZC5cblx0ICogQHBhcmFtIGN1cnJlbnRMaXN0ZW5lciBUaGUgY3VycmVudCBsaXN0ZW5lciBvYmplY3QgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgc2V0Q3VycmVudEZsb3dhYmxlTGlzdGVuZXIoY3VycmVudExpc3RlbmVyOiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRDdXJyZW50Rmxvd2FibGVMaXN0ZW5lcihjdXJyZW50TGlzdGVuZXIpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENyZWF0ZSBhIHNuYXBzaG90IHJlYWQgb25seSBkZWxlZ2F0ZSBleGVjdXRpb24gb2YgdGhpcyBkZWxlZ2F0ZSBleGVjdXRpb24uXG5cdCAqXG5cdCAqIEByZXR1cm5zIEEge0BsaW5rIFJlYWRPbmx5RGVsZWdhdGVFeGVjdXRpb259IG9iamVjdCAoSmF2YSB0eXBlKS5cblx0ICovXG5cdHB1YmxpYyBzbmFwc2hvdFJlYWRPbmx5KCk6IGFueSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLnNuYXBzaG90UmVhZE9ubHkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiByZXR1cm5zIHRoZSBwYXJlbnQgb2YgdGhpcyBleGVjdXRpb24sIG9yIG51bGwgaWYgdGhlcmUgbm8gcGFyZW50LlxuXHQgKiBAcmV0dXJucyBUaGUgcGFyZW50IGV4ZWN1dGlvbiBvYmplY3QgKEphdmEgdHlwZSksIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBnZXRQYXJlbnQoKTogYW55IHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uZ2V0UGFyZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogcmV0dXJucyB0aGUgbGlzdCBvZiBleGVjdXRpb24gb2Ygd2hpY2ggdGhpcyBleGVjdXRpb24gdGhlIHBhcmVudCBvZi5cblx0ICogQHJldHVybnMgQW4gYXJyYXkgb2YgY2hpbGQgZXhlY3V0aW9uIG9iamVjdHMgKEphdmEgdHlwZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXhlY3V0aW9ucygpOiBhbnlbXSB7XG5cdFx0cmV0dXJuIHRoaXMuZXhlY3V0aW9uLmdldEV4ZWN1dGlvbnMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBtYWtlcyB0aGlzIGV4ZWN1dGlvbiBhY3RpdmUgb3IgaW5hY3RpdmUuXG5cdCAqIEBwYXJhbSBpc0FjdGl2ZSBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBleGVjdXRpb24gc2hvdWxkIGJlIGFjdGl2ZS5cblx0ICovXG5cdHB1YmxpYyBzZXRBY3RpdmUoaXNBY3RpdmU6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRBY3RpdmUoaXNBY3RpdmUpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHJldHVybnMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBjdXJyZW50bHkgYWN0aXZlLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYWN0aXZlLCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBpc0FjdGl2ZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNBY3RpdmUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiByZXR1cm5zIHdoZXRoZXIgdGhpcyBleGVjdXRpb24gaGFzIGVuZGVkIG9yIG5vdC5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIGVuZGVkLCBgZmFsc2VgIG90aGVyd2lzZS5cblx0ICovXG5cdHB1YmxpYyBpc0VuZGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5pc0VuZGVkKCk7XG5cdH1cblxuXHQvKipcblx0ICogY2hhbmdlcyB0aGUgY29uY3VycmVudCBpbmRpY2F0b3Igb24gdGhpcyBleGVjdXRpb24uXG5cdCAqIEBwYXJhbSBpc0NvbmN1cnJlbnQgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZXhlY3V0aW9uIHNob3VsZCBiZSBjb25jdXJyZW50LlxuXHQgKi9cblx0cHVibGljIHNldENvbmN1cnJlbnQoaXNDb25jdXJyZW50OiBib29sZWFuKTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uc2V0Q29uY3VycmVudChpc0NvbmN1cnJlbnQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIHJldHVybnMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBjb25jdXJyZW50IG9yIG5vdC5cblx0ICogQHJldHVybnMgYHRydWVgIGlmIGNvbmN1cnJlbnQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuXHQgKi9cblx0cHVibGljIGlzQ29uY3VycmVudCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNDb25jdXJyZW50KCk7XG5cdH1cblxuXHQvKipcblx0ICogcmV0dXJucyB3aGV0aGVyIHRoaXMgZXhlY3V0aW9uIGlzIGEgcHJvY2VzcyBpbnN0YW5jZSBvciBub3QuXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCdzIGEgcHJvY2VzcyBpbnN0YW5jZSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNQcm9jZXNzSW5zdGFuY2VUeXBlKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmV4ZWN1dGlvbi5pc1Byb2Nlc3NJbnN0YW5jZVR5cGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmFjdGl2YXRlcyB0aGlzIGV4ZWN1dGlvbi4gVGhpcyBpcyB1c2VmdWwgZm9yIGV4YW1wbGUgaW4gYSBqb2luOiB0aGUgZXhlY3V0aW9uIHN0aWxsIGV4aXN0cywgYnV0IGl0IGlzIG5vdCBsb25nZXIgYWN0aXZlLlxuXHQgKi9cblx0cHVibGljIGluYWN0aXZhdGUoKTogdm9pZCB7XG5cdFx0dGhpcy5leGVjdXRpb24uaW5hY3RpdmF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFJldHVybnMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBhIHNjb3BlLlxuXHQgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgaXQgaXMgYSBzY29wZSwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNTY29wZSgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNTY29wZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBhIHNjb3BlIG9yIG5vdC5cblx0ICogQHBhcmFtIGlzU2NvcGUgQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGUgZXhlY3V0aW9uIHNob3VsZCBiZSBhIHNjb3BlLlxuXHQgKi9cblx0cHVibGljIHNldFNjb3BlKGlzU2NvcGU6IGJvb2xlYW4pOiB2b2lkIHtcblx0XHR0aGlzLmV4ZWN1dGlvbi5zZXRTY29wZShpc1Njb3BlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBleGVjdXRpb24gaXMgdGhlIHJvb3Qgb2YgYSBtdWx0aSBpbnN0YW5jZSBleGVjdXRpb24uXG5cdCAqIEByZXR1cm5zIGB0cnVlYCBpZiBpdCdzIGEgbXVsdGkgaW5zdGFuY2Ugcm9vdCwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNNdWx0aUluc3RhbmNlUm9vdCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5leGVjdXRpb24uaXNNdWx0aUluc3RhbmNlUm9vdCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZXMgd2hldGhlciB0aGlzIGV4ZWN1dGlvbiBpcyBhIG11bHRpIGluc3RhbmNlIHJvb3Qgb3Igbm90LlxuXHQgKiBAcGFyYW0gaXNNdWx0aUluc3RhbmNlUm9vdCBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBleGVjdXRpb24gaXMgdGhlIHJvb3Qgb2YgYSBtdWx0aS1pbnN0YW5jZSBleGVjdXRpb24uXG5cdCAqL1xuXHRwdWJsaWMgc2V0TXVsdGlJbnN0YW5jZVJvb3QoaXNNdWx0aUluc3RhbmNlUm9vdDogYm9vbGVhbik6IHZvaWQge1xuXHRcdHRoaXMuZXhlY3V0aW9uLnNldE11bHRpSW5zdGFuY2VSb290KGlzTXVsdGlJbnN0YW5jZVJvb3QpO1xuXHR9XG5cbn1cblxuZW51bSBEZWxlZ2F0aW9uU3RhdGUge1xuXG5cdC8qKlxuXHQgKiBUaGUgb3duZXIgZGVsZWdhdGVkIHRoZSB0YXNrIGFuZCB3YW50cyB0byByZXZpZXcgdGhlIHJlc3VsdCBhZnRlciB0aGUgYXNzaWduZWUgaGFzIHJlc29sdmVkIHRoZSB0YXNrLiBXaGVuIHRoZSBhc3NpZ25lZSBjb21wbGV0ZXMgdGhlIHRhc2ssIHRoZSB0YXNrIGlzIG1hcmtlZCBhcyB7QGxpbmsgI1JFU09MVkVEfSBhbmQgc2VudCBiYWNrXG5cdCAqIHRvIHRoZSBvd25lci4gV2hlbiB0aGF0IGhhcHBlbnMsIHRoZSBvd25lciBpcyBzZXQgYXMgdGhlIGFzc2lnbmVlIHNvIHRoYXQgdGhlIG93bmVyIGdldHMgdGhpcyB0YXNrIGJhY2sgaW4gdGhlIFRvRG8uXG5cdCAqL1xuXHRQRU5ESU5HLFxuXG5cdC8qKlxuXHQgKiBUaGUgYXNzaWduZWUgaGFzIHJlc29sdmVkIHRoZSB0YXNrLCB0aGUgYXNzaWduZWUgd2FzIHNldCB0byB0aGUgb3duZXIgYWdhaW4gYW5kIHRoZSBvd25lciBub3cgZmluZHMgdGhpcyB0YXNrIGJhY2sgaW4gdGhlIFRvRG8gbGlzdCBmb3IgcmV2aWV3LiBUaGUgb3duZXIgbm93IGlzIGFibGUgdG8gY29tcGxldGUgdGhlIHRhc2suXG5cdCAqL1xuXHRSRVNPTFZFRFxufVxuXG5jbGFzcyBUYXNrQ29udGV4dCBleHRlbmRzIFZhcmlhYmxlU2NvcGUge1xuXG5cdHByaXZhdGUgdGFzazogYW55O1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdHN1cGVyKF9fY29udGV4dC5nZXQoJ3Rhc2snKSk7XG5cdFx0dGhpcy50YXNrID0gX19jb250ZXh0LmdldCgndGFzaycpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERCIGlkIG9mIHRoZSB0YXNrLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIHVuaXF1ZSBJRCBvZiB0aGUgY3VycmVudCB0YXNrLlxuXHQgKi9cblx0cHVibGljIGdldElkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRJZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIE5hbWUgb3IgdGl0bGUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YXNrLlxuXHQgKi9cblx0cHVibGljIGdldE5hbWUoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldE5hbWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcGFyYW0gbmFtZSB0aGUgbmV3IG5hbWUgZm9yIHRoZSB0YXNrLlxuXHQgKi9cblx0cHVibGljIHNldE5hbWUobmFtZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLnNldE5hbWUobmFtZSk7XG5cdH1cblxuXHQvKipcblx0ICogR2V0IHRoZSBmcmVlIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGN1cnJlbnQgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXREZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0RGVzY3JpcHRpb24oKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBGcmVlIHRleHQgZGVzY3JpcHRpb24gb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcGFyYW0gZGVzY3JpcHRpb24gdGhlIG5ldyBkZXNjcmlwdGlvbiBmb3IgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb246IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFzay5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7XG5cdH1cblxuXHQvKipcblx0ICogSW5kaWNhdGlvbiBvZiBob3cgaW1wb3J0YW50L3VyZ2VudCB0aGlzIHRhc2sgaXMgd2l0aCBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEwMCB3aGVyZSBoaWdoZXIgdmFsdWVzIG1lYW4gYSBoaWdoZXIgcHJpb3JpdHkgYW5kIGxvd2VyIHZhbHVlcyBtZWFuIGxvd2VyIHByaW9yaXR5OiBbMC4uMTldIGxvd2VzdCwgWzIwLi4zOV0gbG93LFxuXHQgKiBbNDAuLjU5XSBub3JtYWwsIFs2MC4uNzldIGhpZ2ggWzgwLi4xMDBdIGhpZ2hlc3Rcblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBwcmlvcml0eSBvZiB0aGUgY3VycmVudCB0YXNrLlxuXHQgKi9cblx0cHVibGljIGdldFByaW9yaXR5KCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRQcmlvcml0eSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRpb24gb2YgaG93IGltcG9ydGFudC91cmdlbnQgdGhpcyB0YXNrIGlzIHdpdGggYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDAgd2hlcmUgaGlnaGVyIHZhbHVlcyBtZWFuIGEgaGlnaGVyIHByaW9yaXR5IGFuZCBsb3dlciB2YWx1ZXMgbWVhbiBsb3dlciBwcmlvcml0eTogWzAuLjE5XSBsb3dlc3QsIFsyMC4uMzldIGxvdyxcblx0ICogWzQwLi41OV0gbm9ybWFsLCBbNjAuLjc5XSBoaWdoIFs4MC4uMTAwXSBoaWdoZXN0XG5cdCAqIFxuXHQgKiBAcGFyYW0gcHJpb3JpdHkgdGhlIG5ldyBwcmlvcml0eSBmb3IgdGhlIHRhc2ssIHdpdGggYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxMDAgd2hlcmUgaGlnaGVyIHZhbHVlcyBtZWFuIGEgaGlnaGVyIHByaW9yaXR5IGFuZCBsb3dlciB2YWx1ZXMgbWVhbiBsb3dlciBwcmlvcml0eTogWzAuLjE5XSBsb3dlc3QsIFsyMC4uMzldIGxvdywgWzQwLi41OV0gbm9ybWFsLCBcblx0ICovXG5cdHB1YmxpYyBzZXRQcmlvcml0eShwcmlvcml0eTogbnVtYmVyKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLnNldFByaW9yaXR5KHByaW9yaXR5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZyZW5jZSB0byB0aGUgcHJvY2VzcyBpbnN0YW5jZSB0aGlzIHRhc2sgaXMgYXNzb2NpYXRlZCB3aXRoLCBvciBgbnVsbGAgaWYgdGhlIHRhc2sgaXMgbm90IHJlbGF0ZWQgdG8gYSBwcm9jZXNzIGluc3RhbmNlLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIElEIG9mIHRoZSBwcm9jZXNzIGluc3RhbmNlIHRoaXMgdGFzayBpcyBhc3NvY2lhdGVkIHdpdGgsIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9jZXNzSW5zdGFuY2VJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0UHJvY2Vzc0luc3RhbmNlSWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZWZlcmVuY2UgdG8gdGhlIHBhdGggb2YgZXhlY3V0aW9uIHRoaXMgdGFzayBpcyBhc3NvY2lhdGVkIHdpdGgsIG9yIGBudWxsYCBpZiB0aGUgdGFzayBpcyBub3QgcmVsYXRlZCB0byBhIHByb2Nlc3MgaW5zdGFuY2UuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgSUQgb2YgdGhlIGV4ZWN1dGlvbiB0aGlzIHRhc2sgaXMgYXNzb2NpYXRlZCB3aXRoLCBvciBgbnVsbGAuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXhlY3V0aW9uSWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldEV4ZWN1dGlvbklkKCk7XG5cdH1cblxuXHQvKipcblx0ICogUmVmZXJlbmNlIHRvIHRoZSBwcm9jZXNzIGRlZmluaXRpb24gdGhpcyB0YXNrIGlzIGFzc29jaWF0ZWQgd2l0aCwgb3IgYG51bGxgIGlmIHRoZSB0YXNrIGlzIG5vdCByZWxhdGVkIHRvIGEgcHJvY2VzcyBpbnN0YW5jZS5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBJRCBvZiB0aGUgcHJvY2VzcyBkZWZpbml0aW9uIHRoaXMgdGFzayBpcyBhc3NvY2lhdGVkIHdpdGgsIG9yIGBudWxsYC5cblx0ICovXG5cdHB1YmxpYyBnZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRQcm9jZXNzRGVmaW5pdGlvbklkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIGN1cnJlbnQgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXRTdGF0ZSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0U3RhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZGF0ZS90aW1lIHdoZW4gdGhpcyB0YXNrIHdhcyBjcmVhdGVkLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGNyZWF0aW9uIHRpbWUgb2YgdGhlIGN1cnJlbnQgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXRDcmVhdGVUaW1lKCk6IERhdGUge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0Q3JlYXRlVGltZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSBkYXRlL3RpbWUgd2hlbiB0aGlzIHRhc2sgd2FzIHB1dCBpbiBwcm9ncmVzcy5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBpbiBwcm9ncmVzcyBzdGFydCB0aW1lIG9mIHRoZSBjdXJyZW50IHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SW5Qcm9ncmVzc1N0YXJ0VGltZSgpOiBEYXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldEluUHJvZ3Jlc3NTdGFydFRpbWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciByZWZlcmVuY2UgdGhhdCBzdGFydGVkIHRoZSB0YXNrLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIHVzZXIgcmVmZXJlbmNlIHRoYXQgc3RhcnRlZCB0aGUgdGFzay5cblx0ICovXG5cdHB1YmxpYyBnZXRJblByb2dyZXNzU3RhcnRlZEJ5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRJblByb2dyZXNzU3RhcnRlZEJ5KCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGRhdGUvdGltZSB3aGVuIHRoaXMgdGFzayB3YXMgY2xhaW1lZC5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBjbGFpbSB0aW1lIG9mIHRoZSBjdXJyZW50IHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q2xhaW1UaW1lKCk6IERhdGUge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0Q2xhaW1UaW1lKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHVzZXIgcmVmZXJlbmNlIHRoYXQgY2xhaW1lZCB0aGUgdGFzay5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSB1c2VyIHJlZmVyZW5jZSB0aGF0IGNsYWltZWQgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q2xhaW1lZEJ5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRDbGFpbWVkQnkoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZGF0ZS90aW1lIHdoZW4gdGhpcyB0YXNrIHdhcyBzdXNwZW5kZWQuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgZGF0ZS90aW1lIHdoZW4gdGhpcyB0YXNrIHdhcyBzdXNwZW5kZWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0U3VzcGVuZGVkVGltZSgpOiBEYXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldFN1c3BlbmRlZFRpbWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgdXNlciByZWZlcmVuY2UgdGhhdCBzdXNwZW5kZWQgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgdXNlciByZWZlcmVuY2UgdGhhdCBzdXNwZW5kZWQgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0U3VzcGVuZGVkQnkoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldFN1c3BlbmRlZEJ5KCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGlkIG9mIHRoZSBhY3Rpdml0eSBpbiB0aGUgcHJvY2VzcyBkZWZpbmluZyB0aGlzIHRhc2sgb3IgbnVsbCBpZiB0aGlzIGlzIG5vdCByZWxhdGVkIHRvIGEgcHJvY2Vzcy5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSB0YXNrIGRlZmluaXRpb24ga2V5LlxuXHQgKi9cblx0cHVibGljIGdldFRhc2tEZWZpbml0aW9uS2V5KCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRUYXNrRGVmaW5pdGlvbktleSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEluZGljYXRlZCB3aGV0aGVyIHRoaXMgdGFzayBpcyBzdXNwZW5kZWQgb3Igbm90LlxuXHQgKiBcblx0ICogQHJldHVybnMgYHRydWVgIGlmIHRoZSB0YXNrIGlzIHN1c3BlbmRlZCwgYGZhbHNlYCBvdGhlcndpc2UuXG5cdCAqL1xuXHRwdWJsaWMgaXNTdXNwZW5kZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5pc1N1c3BlbmRlZCgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB0ZW5hbnQgaWRlbnRpZmllciBvZiB0aGlzIHRhc2ssIHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSB0ZW5hbnQgaWRlbnRpZmllciBvZiB0aGUgcHJvY2VzcyBkZWZpbml0aW9uIGFuZCBwcm9jZXNzIGluc3RhbmNlIHRoaXMgdGFzayBpcyBhc3NvY2lhdGVkIHdpdGggKGlmIGFueSkuXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgdGVuYW50IElEIG9mIHRoaXMgdGFzaywgb3IgYG51bGxgL2VtcHR5IHN0cmluZyBpZiBubyB0ZW5hbnQgaXMgYXNzb2NpYXRlZC5cblx0ICovXG5cdHB1YmxpYyBnZXRUZW5hbnRJZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0VGVuYW50SWQoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZm9ybSBrZXkgZm9yIHRoZSB1c2VyIHRhc2ssIHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSBmb3JtIGtleSBkZWZpbmVkIG9uIHRoZSB1c2VyIHRhc2sgaW4gdGhlIHByb2Nlc3MgZGVmaW5pdGlvbi4gV2lsbCByZXR1cm4gYG51bGxgIGlmIHRoaXMgdGFzayBpcyBub3QgYSB1c2VyIHRhc2sgb3IgaWYgbm8gZm9ybSBrZXkgaXMgZGVmaW5lZC5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBmb3JtIGtleSBmb3IgdGhlIHVzZXIgdGFzaywgb3IgYG51bGxgIGlmIG5vIGZvcm0ga2V5IGlzIGRlZmluZWQuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Rm9ybUtleSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLnRhc2suZ2V0Rm9ybUtleSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIENoYW5nZSB0aGUgZm9ybSBrZXkgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcGFyYW0gZm9ybUtleSB0aGUgbmV3IGZvcm0ga2V5IGZvciB0aGUgdXNlciB0YXNrLCBvciBgbnVsbGAgdG8gcmVtb3ZlIHRoZSBmb3JtIGtleVxuXHQgKi9cblx0cHVibGljIHNldEZvcm1LZXkoZm9ybUtleTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLnNldEZvcm1LZXkoZm9ybUtleSk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGV2ZW50IG5hbWUgd2hpY2ggdHJpZ2dlcmVkIHRoZSB0YXNrIGxpc3RlbmVyIHRvIGZpcmUgZm9yIHRoaXMgdGFzay4gV2lsbCByZXR1cm4gYG51bGxgL2VtcHR5IHN0cmluZyBpZiBub3QgZXhlY3V0aW5nIGEgdGFzayBsaXN0ZW5lci5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBldmVudCBuYW1lIHdoaWNoIHRyaWdnZXJlZCB0aGUgdGFzayBsaXN0ZW5lciB0byBmaXJlIGZvciB0aGlzIHRhc2ssIG9yIGBudWxsYC9lbXB0eSBzdHJpbmcgaWYgbm90IGV4ZWN1dGluZyBhIHRhc2sgbGlzdGVuZXIuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXZlbnROYW1lKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRFdmVudE5hbWUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgZXZlbnQgaGFuZGxlciBpZGVudGlmaWVyIHdoaWNoIHRyaWdnZXJlZCB0aGUgdGFzayBsaXN0ZW5lciB0byBmaXJlIGZvciB0aGlzIHRhc2suIFdpbGwgcmV0dXJuIGBudWxsYC9lbXB0eSBzdHJpbmcgaWYgbm90IGV4ZWN1dGluZyBhIHRhc2sgbGlzdGVuZXIgb3IgaWYgdGhlIGV2ZW50IGhhbmRsZXIgZG9lcyBub3QgaGF2ZSBhbiBpZGVudGlmaWVyLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGV2ZW50IGhhbmRsZXIgaWRlbnRpZmllciwgb3IgYG51bGxgL2VtcHR5IHN0cmluZyBpZiBub3QgZXhlY3V0aW5nIGEgdGFzayBsaXN0ZW5lciBvciBpZiB0aGUgZXZlbnQgaGFuZGxlciBkb2VzIG5vdCBoYXZlIGFuIGlkZW50aWZpZXIuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RXZlbnRIYW5kbGVySWQoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldEV2ZW50SGFuZGxlcklkKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIGN1cnJlbnQgZGVsZWdhdGlvbiBzdGF0ZSBvZiB0aGUgdGFzaywgd2hpY2ggaXMgYG51bGxgIGlmIHRoZSB0YXNrIGlzIG5vdCBkZWxlZ2F0ZWQsIGBQRU5ESU5HYCBpZiB0aGUgdGFzayBpcyBkZWxlZ2F0ZWQgYW5kIHdhaXRpbmcgZm9yIHJlc29sdXRpb24gYnkgdGhlIGFzc2lnbmVlLCBhbmQgYFJFU09MVkVEYCBpZiB0aGUgdGFzayBpcyBkZWxlZ2F0ZWQgYW5kIGhhcyBiZWVuIHJlc29sdmVkIGJ5IHRoZSBhc3NpZ25lZSBidXQgbm90IHlldCBjb21wbGV0ZWQgYnkgdGhlIG93bmVyLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGRlbGVnYXRpb24gc3RhdGUgb2YgdGhlIHRhc2ssIHdoaWNoIGlzIGBudWxsYCBpZiB0aGUgdGFzayBpcyBub3QgZGVsZWdhdGVkLCBgUEVORElOR2AgaWYgdGhlIHRhc2sgaXMgZGVsZWdhdGVkIGFuZCB3YWl0aW5nIGZvciByZXNvbHV0aW9uIGJ5IHRoZSBhc3NpZ25lZSwgYW5kIGBSRVNPTFZFRGAgaWYgdGhlIHRhc2sgaXMgZGVsZWdhdGVkIGFuZCBoYXMgYmVlbiByZXNvbHZlZCBieSB0aGUgYXNzaWduZWUgYnV0IG5vdCB5ZXQgY29tcGxldGVkIGJ5IHRoZSBvd25lci5cblx0ICovXG5cdHB1YmxpYyBnZXREZWxlZ2F0aW9uU3RhdGUoKTogRGVsZWdhdGlvblN0YXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldERlbGVnYXRpb25TdGF0ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBjYW5kaWRhdGUgdXNlciB0byB0aGlzIHRhc2ssIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHVzZXIgaXMgYWxsb3dlZCB0byBjbGFpbSBhbmQgd29yayBvbiB0aGlzIHRhc2suIFRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSB1c2VyIGlzIHRoZSBhc3NpZ25lZSBvZiB0aGUgdGFzaywgYnV0IGl0IG1lYW5zIHRoYXQgdGhlIHVzZXIgaXMgYSBjYW5kaWRhdGUgdG8gYmVjb21lIGFuIGFzc2lnbmVlLiBUaGUgdXNlciB3aWxsIGJlIGFibGUgdG8gc2VlIHRoaXMgdGFzayBpbiB0aGVpciB0YXNrIGxpc3QgYW5kIGNsYWltIGl0IHRvIGJlY29tZSB0aGUgYXNzaWduZWUuXG5cdCAqIFxuXHQgKiBAcGFyYW0gdXNlcklkIHRoZSB1c2VyIElEIG9mIHRoZSBjYW5kaWRhdGUgdXNlciB0byBhZGQgdG8gdGhpcyB0YXNrLlxuXHQgKi9cblx0cHVibGljIGFkZENhbmRpZGF0ZVVzZXIodXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suYWRkQ2FuZGlkYXRlVXNlcih1c2VySWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgbXVsdGlwbGUgdXNlcnMgYXMgY2FuZGlkYXRlIHVzZXIgdG8gdGhpcyB0YXNrLlxuXHQgKiBcblx0ICogQHBhcmFtIGNhbmRpZGF0ZVVzZXJzIHRoZSBjb2xsZWN0aW9uIG9mIGNhbmRpZGF0ZSB1c2VyIElEcyB0byBhZGQgdG8gdGhpcyB0YXNrLlxuXHQgKi9cblx0cHVibGljIGFkZENhbmRpZGF0ZVVzZXJzKGNhbmRpZGF0ZVVzZXJzOiBzdHJpbmdbXSk6IHZvaWQge1xuXHRcdHRoaXMudGFzay5hZGRDYW5kaWRhdGVVc2VycyhjYW5kaWRhdGVVc2Vycyk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIGNhbmRpZGF0ZSBncm91cCB0byB0aGlzIHRhc2ssIHdoaWNoIG1lYW5zIHRoYXQgYWxsIHVzZXJzIHRoYXQgYXJlIG1lbWJlcnMgb2YgdGhpcyBncm91cCBhcmUgYWxsb3dlZCB0byBjbGFpbSBhbmQgd29yayBvbiB0aGlzIHRhc2suIFRoaXMgZG9lcyBub3QgbWVhbiB0aGF0IHRoZSBncm91cCBpcyB0aGUgYXNzaWduZWUgb2YgdGhlIHRhc2ssIGJ1dCBpdCBtZWFucyB0aGF0IGFsbCB1c2VycyB0aGF0IGFyZSBtZW1iZXJzIG9mIHRoZSBncm91cCBhcmUgY2FuZGlkYXRlcyB0byBiZWNvbWUgYXNzaWduZWVzLiBUaGUgdXNlcnMgdGhhdCBhcmUgbWVtYmVycyBvZiB0aGUgZ3JvdXAgd2lsbCBiZSBhYmxlIHRvIHNlZSB0aGlzIHRhc2sgaW4gdGhlaXIgdGFzayBsaXN0IGFuZCBjbGFpbSBpdCB0byBiZWNvbWUgdGhlIGFzc2lnbmVlLlxuXHQgKiBcblx0ICogQHBhcmFtIGdyb3VwSWQgdGhlIGdyb3VwIElEIG9mIHRoZSBjYW5kaWRhdGUgZ3JvdXAgdG8gYWRkIHRvIHRoaXMgdGFzay5cblx0ICovXG5cdHB1YmxpYyBhZGRDYW5kaWRhdGVHcm91cChncm91cElkOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suYWRkQ2FuZGlkYXRlR3JvdXAoZ3JvdXBJZCk7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBtdWx0aXBsZSBncm91cHMgYXMgY2FuZGlkYXRlIGdyb3VwIHRvIHRoaXMgdGFzay5cblx0ICogXG5cdCAqIEBwYXJhbSBjYW5kaWRhdGVHcm91cHMgdGhlIGNvbGxlY3Rpb24gb2YgY2FuZGlkYXRlIGdyb3VwIElEcyB0byBhZGQgdG8gdGhpcyB0YXNrLlxuXHQgKi9cblx0cHVibGljIGFkZENhbmRpZGF0ZUdyb3VwcyhjYW5kaWRhdGVHcm91cHM6IHN0cmluZ1tdKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLmFkZENhbmRpZGF0ZUdyb3VwcyhjYW5kaWRhdGVHcm91cHMpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB1c2VyIGlkIG9mIHRoZSBwZXJzb24gcmVzcG9uc2libGUgZm9yIHRoaXMgdGFzay4gVGhpcyBpcyB0aGUgdXNlciB0aGF0IGhhcyB0byB3b3JrIG9uIHRoaXMgdGFzayBhbmQgY29tcGxldGUgaXQuIFdoZW4gYSB0YXNrIGlzIGFzc2lnbmVkIHRvIGEgdXNlciwgdGhhdCB1c2VyIGJlY29tZXMgdGhlIGFzc2lnbmVlIG9mIHRoZSB0YXNrLiBUaGUgYXNzaWduZWUgaXMgdGhlIG9ubHkgb25lIHRoYXQgY2FuIGNvbXBsZXRlIHRoZSB0YXNrICh1bmxlc3MgdGhlIHRhc2sgaXMgZGVsZWdhdGVkXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgdXNlciBJRCBvZiB0aGUgYXNzaWduZWUgb2YgdGhpcyB0YXNrXG5cdCAqL1xuXHRwdWJsaWMgZ2V0T3duZXIoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldE93bmVyKCk7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHVzZXIgaWQgb2YgdGhlIHBlcnNvbiByZXNwb25zaWJsZSBmb3IgdGhpcyB0YXNrLiBUaGlzIGlzIHRoZSB1c2VyIHRoYXQgaGFzIHRvIHdvcmsgb24gdGhpcyB0YXNrIGFuZCBjb21wbGV0ZSBpdC4gV2hlbiBhIHRhc2sgaXMgYXNzaWduZWQgdG8gYSB1c2VyLCB0aGF0IHVzZXIgYmVjb21lcyB0aGUgYXNzaWduZWUgb2YgdGhlIHRhc2suIFRoZSBhc3NpZ25lZSBpcyB0aGUgb25seSBvbmUgdGhhdCBjYW4gY29tcGxldGUgdGhlIHRhc2sgKHVubGVzcyB0aGUgdGFzayBpcyBkZWxlZ2F0ZWRcblx0ICogXG5cdCAqIEBwYXJhbSBvd25lciB0aGUgdXNlciBJRCBvZiB0aGUgYXNzaWduZWUgb2YgdGhpcyB0YXNrXG5cdCAqL1xuXHRwdWJsaWMgc2V0T3duZXIob3duZXI6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMudGFzay5zZXRPd25lcihvd25lcik7XG5cdH1cblxuXHQvKipcblx0ICogVGhlIHVzZXIgaWQgb2YgdGhlIHBlcnNvbiB0byB3aGljaCB0aGlzIHRhc2sgaXMgZGVsZWdhdGVkLlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIHVzZXIgSUQgb2YgdGhlIGFzc2lnbmVlIG9mIHRoaXMgdGFza1xuXHQgKi9cblx0cHVibGljIGdldEFzc2lnbmVlKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRBc3NpZ25lZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIFRoZSB1c2VyIGlkIG9mIHRoZSBwZXJzb24gdG8gd2hpY2ggdGhpcyB0YXNrIGlzIGRlbGVnYXRlZC5cblx0ICogQHBhcmFtIGFzc2lnbmVlIHRoZSB1c2VyIElEIG9mIHRoZSBhc3NpZ25lZSBvZiB0aGlzIHRhc2tcblx0ICovXG4gICAgcHVibGljIHNldEFzc2lnbmVlKGFzc2lnbmVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YXNrLnNldEFzc2lnbmVlKGFzc2lnbmVlKTtcbiAgICB9XG5cblx0LyoqXG5cdCAqIER1ZSBkYXRlIG9mIHRoZSBpbiBwcm9ncmVzcyBzdGFydCBvZiB0aGUgdGFzay5cblx0ICogXG5cdCAqIEByZXR1cm5zIHRoZSBkdWUgZGF0ZSBvZiB0aGUgaW4gcHJvZ3Jlc3Mgc3RhcnQgb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SW5Qcm9ncmVzc1N0YXJ0RHVlRGF0ZSgpOiBEYXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldEluUHJvZ3Jlc3NTdGFydER1ZURhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIGluIHByb2dyZXNzIHN0YXJ0IGR1ZSBkYXRlIG9mIHRoZSB0YXNrLlxuXHQgKiBcblx0ICogQHBhcmFtIGluUHJvZ3Jlc3NTdGFydER1ZURhdGUgdGhlIG5ldyBkdWUgZGF0ZSBvZiB0aGUgaW4gcHJvZ3Jlc3Mgc3RhcnQgb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgc2V0SW5Qcm9ncmVzc1N0YXJ0RHVlRGF0ZShpblByb2dyZXNzU3RhcnREdWVEYXRlOiBEYXRlKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLnNldEluUHJvZ3Jlc3NTdGFydER1ZURhdGUoaW5Qcm9ncmVzc1N0YXJ0RHVlRGF0ZSk7XG5cdH1cblxuXHQvKipcblx0ICogRHVlIGRhdGUgb2YgdGhlIHRhc2suXG5cdCAqIFxuXHQgKiBAcmV0dXJucyB0aGUgZHVlIGRhdGUgb2YgdGhlIHRhc2suXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RHVlRGF0ZSgpOiBEYXRlIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldER1ZURhdGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDaGFuZ2UgdGhlIGR1ZSBkYXRlIG9mIHRoZSB0YXNrLlxuXHQgKiBcblx0ICogQHBhcmFtIGR1ZURhdGUgdGhlIG5ldyBkdWUgZGF0ZSBvZiB0aGUgdGFzay5cblx0ICovXG5cdHB1YmxpYyBzZXREdWVEYXRlKGR1ZURhdGU6IERhdGUpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suc2V0RHVlRGF0ZShkdWVEYXRlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUaGUgY2F0ZWdvcnkgb2YgdGhlIHRhc2suIFRoaXMgaXMgYW4gb3B0aW9uYWwgZmllbGQgYW5kIGFsbG93cyB0byAndGFnJyB0YXNrcyBhcyBiZWxvbmdpbmcgdG8gYSBjZXJ0YWluIGNhdGVnb3J5LlxuXHQgKiBcblx0ICogQHJldHVybnMgdGhlIGNhdGVnb3J5IG9mIHRoZSB0YXNrXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q2F0ZWdvcnkoKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdGhpcy50YXNrLmdldENhdGVnb3J5KCk7XG5cdH1cblxuXHQvKipcblx0ICogQ2hhbmdlIHRoZSBjYXRlZ29yeSBvZiB0aGUgdGFzay4gVGhpcyBpcyBhbiBvcHRpb25hbCBmaWVsZCBhbmQgYWxsb3dzIHRvICd0YWcnIHRhc2tzIGFzIGJlbG9uZ2luZyB0byBhIGNlcnRhaW4gY2F0ZWdvcnkuXG5cdCAqIFxuXHQgKiBAcGFyYW0gY2F0ZWdvcnkgdGhlIG5ldyBjYXRlZ29yeSBvZiB0aGUgdGFza1xuXHQgKi9cblx0cHVibGljIHNldENhdGVnb3J5KGNhdGVnb3J5OiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suc2V0Q2F0ZWdvcnkoY2F0ZWdvcnkpO1xuXHR9XG5cblxuICAgIC8qKlxuICAgICAqIEludm9sdmVzIGEgdXNlciB3aXRoIGEgdGFzay4gVGhlIHR5cGUgb2YgaWRlbnRpdHkgbGluayBpcyBkZWZpbmVkIGJ5IHRoZSBnaXZlbiBpZGVudGl0eUxpbmtUeXBlLlxuICAgICAqXG4gICAgICogQHBhcmFtIHVzZXJJZFxuICAgICAqICAgICAgICAgICAgaWQgb2YgdGhlIHVzZXIgaW52b2x2ZSwgY2Fubm90IGJlIG51bGwuXG4gICAgICogQHBhcmFtIGlkZW50aXR5TGlua1R5cGVcbiAgICAgKiAgICAgICAgICAgIHR5cGUgb2YgaWRlbnRpdHlMaW5rLCBjYW5ub3QgYmUgbnVsbCAoQHNlZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZX0pLlxuICAgICAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgdXNlciBkb2Vzbid0IGV4aXN0LlxuICAgICAqL1xuXHRwdWJsaWMgYWRkVXNlcklkZW50aXR5TGluayh1c2VySWQ6IHN0cmluZywgaWRlbnRpdHlMaW5rVHlwZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLmFkZFVzZXJJZGVudGl0eUxpbmsodXNlcklkLCBpZGVudGl0eUxpbmtUeXBlKTtcblx0fVxuXG4gICAgLyoqXG4gICAgICogSW52b2x2ZXMgYSBncm91cCB3aXRoIGdyb3VwIHRhc2suIFRoZSB0eXBlIG9mIGlkZW50aXR5TGluayBpcyBkZWZpbmVkIGJ5IHRoZSBnaXZlbiBpZGVudGl0eUxpbmsuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3JvdXBJZFxuICAgICAqICAgICAgICAgICAgaWQgb2YgdGhlIGdyb3VwIHRvIGludm9sdmUsIGNhbm5vdCBiZSBudWxsLlxuICAgICAqIEBwYXJhbSBpZGVudGl0eUxpbmtUeXBlXG4gICAgICogICAgICAgICAgICB0eXBlIG9mIGlkZW50aXR5LCBjYW5ub3QgYmUgbnVsbCAoQHNlZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZX0pLlxuICAgICAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgZ3JvdXAgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkR3JvdXBJZGVudGl0eUxpbmsoZ3JvdXBJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YXNrLmFkZEdyb3VwSWRlbnRpdHlMaW5rKGdyb3VwSWQsIGlkZW50aXR5TGlua1R5cGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlbmllbmNlIHNob3J0aGFuZCBmb3Ige0BsaW5rICNkZWxldGVVc2VySWRlbnRpdHlMaW5rKFN0cmluZywgU3RyaW5nKX0gOyB3aXRoIHR5cGUge0BsaW5rIElkZW50aXR5TGlua1R5cGUjQ0FORElEQVRFfVxuICAgICAqXG4gICAgICogQHBhcmFtIHVzZXJJZFxuICAgICAqICAgICAgICAgICAgaWQgb2YgdGhlIHVzZXIgdG8gdXNlIGFzIGNhbmRpZGF0ZSwgY2Fubm90IGJlIG51bGwuXG4gICAgICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG4gICAgICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciB1c2VyIGRvZXNuJ3QgZXhpc3QuXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZUNhbmRpZGF0ZVVzZXIodXNlcklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YXNrLmRlbGV0ZUNhbmRpZGF0ZVVzZXIodXNlcklkKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZW5pZW5jZSBzaG9ydGhhbmQgZm9yIHtAbGluayAjZGVsZXRlR3JvdXBJZGVudGl0eUxpbmsoU3RyaW5nLCBTdHJpbmcpfTsgd2l0aCB0eXBlIHtAbGluayBJZGVudGl0eUxpbmtUeXBlI0NBTkRJREFURX1cbiAgICAgKlxuICAgICAqIEBwYXJhbSBncm91cElkXG4gICAgICogICAgICAgICAgICBpZCBvZiB0aGUgZ3JvdXAgdG8gdXNlIGFzIGNhbmRpZGF0ZSwgY2Fubm90IGJlIG51bGwuXG4gICAgICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG4gICAgICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciBncm91cCBkb2Vzbid0IGV4aXN0LlxuICAgICAqL1xuXHRwdWJsaWMgZGVsZXRlQ2FuZGlkYXRlR3JvdXAoZ3JvdXBJZDogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy50YXNrLmRlbGV0ZUNhbmRpZGF0ZUdyb3VwKGdyb3VwSWQpO1xuXHR9XG5cblx0LyoqXG4gICAgICogUmVtb3ZlcyB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiBhIHVzZXIgYW5kIGEgdGFzayBmb3IgdGhlIGdpdmVuIGlkZW50aXR5TGlua1R5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdXNlcklkXG4gICAgICogICAgICAgICAgICBpZCBvZiB0aGUgdXNlciBpbnZvbHZlLCBjYW5ub3QgYmUgbnVsbC5cbiAgICAgKiBAcGFyYW0gaWRlbnRpdHlMaW5rVHlwZVxuICAgICAqICAgICAgICAgICAgdHlwZSBvZiBpZGVudGl0eUxpbmssIGNhbm5vdCBiZSBudWxsIChAc2VlIHtAbGluayBJZGVudGl0eUxpbmtUeXBlfSkuXG4gICAgICogQHRocm93cyBGbG93YWJsZU9iamVjdE5vdEZvdW5kRXhjZXB0aW9uXG4gICAgICogICAgICAgICAgICAgd2hlbiB0aGUgdGFzayBvciB1c2VyIGRvZXNuJ3QgZXhpc3QuXG4gICAgICovXG5cdHB1YmxpYyBkZWxldGVVc2VySWRlbnRpdHlMaW5rKHVzZXJJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLnRhc2suZGVsZXRlVXNlcklkZW50aXR5TGluayh1c2VySWQsIGlkZW50aXR5TGlua1R5cGUpO1xuXHR9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmVzIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIGEgZ3JvdXAgYW5kIGEgdGFzayBmb3IgdGhlIGdpdmVuIGlkZW50aXR5TGlua1R5cGUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZ3JvdXBJZFxuICAgICAqICAgICAgICAgICAgaWQgb2YgdGhlIGdyb3VwIHRvIGludm9sdmUsIGNhbm5vdCBiZSBudWxsLlxuICAgICAqIEBwYXJhbSBpZGVudGl0eUxpbmtUeXBlXG4gICAgICogICAgICAgICAgICB0eXBlIG9mIGlkZW50aXR5LCBjYW5ub3QgYmUgbnVsbCAoQHNlZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZX0pLlxuICAgICAqIEB0aHJvd3MgRmxvd2FibGVPYmplY3ROb3RGb3VuZEV4Y2VwdGlvblxuICAgICAqICAgICAgICAgICAgIHdoZW4gdGhlIHRhc2sgb3IgZ3JvdXAgZG9lc24ndCBleGlzdC5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlR3JvdXBJZGVudGl0eUxpbmsoZ3JvdXBJZDogc3RyaW5nLCBpZGVudGl0eUxpbmtUeXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy50YXNrLmRlbGV0ZUdyb3VwSWRlbnRpdHlMaW5rKGdyb3VwSWQsIGlkZW50aXR5TGlua1R5cGUpO1xuICAgIH1cblxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBjYW5kaWRhdGUgdXNlcnMgYW5kIGdyb3VwcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhc2suXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHNldCBvZiB7QGxpbmsgSWRlbnRpdHlMaW5rfXMgb2YgdHlwZSB7QGxpbmsgSWRlbnRpdHlMaW5rVHlwZSNDQU5ESURBVEV9LlxuICAgICAqL1xuXHRwdWJsaWMgZ2V0Q2FuZGlkYXRlcygpOiBJZGVudGl0eUxpbmtbXSB7XG5cdFx0cmV0dXJuIHRoaXMudGFzay5nZXRDYW5kaWRhdGVzKCk7XG5cdH1cbn1cblxuLy8gQHRzLWlnbm9yZVxuaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7XG5cdC8vIEB0cy1pZ25vcmVcblx0bW9kdWxlLmV4cG9ydHMgPSBQcm9jZXNzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQSxvQkFBdUI7QUFHdkIsTUFBTSxhQUFhLEtBQUssS0FBSyx3Q0FBd0M7QUFDckUsTUFBTSxZQUFZLEtBQUssS0FBSyxvREFBb0Q7QUFFekUs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QUFLLEtBQUssMEJBQTBCO0FBQUEsRUFDNUM7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTywwQkFBMEIsd0JBQW9DO0FBQ3BFLFNBQUssS0FBSywwQkFBMEIsc0JBQXNCO0FBQUEsRUFDM0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxhQUFtQjtBQUN6QixXQUFPLEtBQUssS0FBSyxXQUFXO0FBQUEsRUFDN0I7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPTyxXQUFXLFNBQXFCO0FBQ3RDLFNBQUssS0FBSyxXQUFXLE9BQU87QUFBQSxFQUM3QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLGNBQXNCO0FBQzVCLFdBQU8sS0FBSyxLQUFLLFlBQVk7QUFBQSxFQUM5QjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9PLFlBQVksVUFBd0I7QUFDMUMsU0FBSyxLQUFLLFlBQVksUUFBUTtBQUFBLEVBQy9CO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWFPLG9CQUFvQixRQUFnQixrQkFBZ0M7QUFDMUUsU0FBSyxLQUFLLG9CQUFvQixRQUFRLGdCQUFnQjtBQUFBLEVBQ3ZEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVlVLHFCQUFxQixTQUFpQixrQkFBZ0M7QUFDekUsU0FBSyxLQUFLLHFCQUFxQixTQUFTLGdCQUFnQjtBQUFBLEVBQzVEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVU8sb0JBQW9CLFFBQXNCO0FBQzdDLFNBQUssS0FBSyxvQkFBb0IsTUFBTTtBQUFBLEVBQ3hDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBVUkscUJBQXFCLFNBQXVCO0FBQ2xELFNBQUssS0FBSyxxQkFBcUIsT0FBTztBQUFBLEVBQ3ZDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVlPLHVCQUF1QixRQUFnQixrQkFBZ0M7QUFDN0UsU0FBSyxLQUFLLHVCQUF1QixRQUFRLGdCQUFnQjtBQUFBLEVBQzFEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVlVLHdCQUF3QixTQUFpQixrQkFBZ0M7QUFDNUUsU0FBSyxLQUFLLHdCQUF3QixTQUFTLGdCQUFnQjtBQUFBLEVBQy9EO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBUUksZ0JBQWdDO0FBQ3RDLFdBQU8sS0FBSyxLQUFLLGNBQWM7QUFBQSxFQUNoQztBQUNEO0FBR0EsSUFBSSxPQUFPLFdBQVcsYUFBYTtBQUVsQyxTQUFPLFVBQVU7QUFDbEI7IiwKICAibmFtZXMiOiBbIkRlbGVnYXRpb25TdGF0ZSJdCn0K